diff --git a/cloog-0.16.3/CLOOG_HEAD b/cloog-0.16.3/CLOOG_HEAD
deleted file mode 100644
index 16be992..0000000
--- a/cloog-0.16.3/CLOOG_HEAD
+++ /dev/null
@@ -1 +0,0 @@
-0.16.2-37-g225c2ed
diff --git a/cloog-0.16.3/ChangeLog b/cloog-0.16.3/ChangeLog
deleted file mode 100644
index 5db2aeb..0000000
--- a/cloog-0.16.3/ChangeLog
+++ /dev/null
@@ -1,11 +0,0 @@
-version: 0.16.3
-date: Wed Jul 13 18:18:19 CEST 2011
-changes:
-	- update isl backend to recent changes in isl
-	- add support for unrolling
----
-version: 0.16.2
-date: Sun Mar 20 15:51:13 CET 2011
-changes:
-	- update isl backend to recent changes in isl
-	- improved output in case of stride detection
diff --git a/cloog-0.16.3/Makefile.am b/cloog-0.16.3/Makefile.am
deleted file mode 100644
index 259c4ba..0000000
--- a/cloog-0.16.3/Makefile.am
+++ /dev/null
@@ -1,177 +0,0 @@
-#
-#   /**-------------------------------------------------------------------**
-#    **                              CLooG                                **
-#    **-------------------------------------------------------------------**
-#    **                           makefile.in                             **
-#    **-------------------------------------------------------------------**
-#    **                   First version: october 25th 2001                **
-#    **-------------------------------------------------------------------**/
-#
-# makefile.in (or makefile if generated) of CLooG, the Chunky LOOp Generator.
-# makefile.in is not a makefile, you must run the 'configure' shellscript to
-# generate the makefile thanks to this file.
-
-#/*****************************************************************************
-# *               CLooG : the Chunky Loop Generator (experimental)            *
-# *****************************************************************************
-# *                                                                           *
-# * Copyright (C) 2001 Cedric Bastoul                                         *
-# *                                                                           *
-# * This library is free software; you can redistribute it and/or             *
-# * modify it under the terms of the GNU Lesser General Public                *
-# * License as published by the Free Software Foundation; either              *
-# * version 2.1 of the License, or (at your option) any later version.        *
-# *                                                                           *
-# * This library is distributed in the hope that it will be useful,           *
-# * but WITHOUT ANY WARRANTY; without even the implied warranty of            *
-# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
-# * Lesser General Public License for more details.                           *
-# *                                                                           *
-# * You should have received a copy of the GNU Lesser General Public          *
-# * License along with this library; if not, write to the Free Software       *
-# * Foundation, Inc., 51 Franklin Street, Fifth Floor,                        *
-# * Boston, MA  02110-1301  USA                                               *
-# *                                                                           *
-# * CLooG, the Chunky Loop Generator                                          *
-# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                        *
-# *                                                                           *
-# *****************************************************************************/
-if BUNDLED_ISL
-    MAYBE_ISL = isl
-    ISL_LA = $(top_builddir)/isl/libisl.la
-endif
-
-SUBDIRS = $(MAYBE_ISL) . doc test
-DIST_SUBDIRS = $(MAYBE_ISL) . doc test
-
-ACLOCAL_AMFLAGS = -I m4
-
-FORCE:
-isl/libisl.la: FORCE
-	cd isl; $(MAKE) $(AM_MAKEFLAGS) libisl.la
-
-if NO_ISL
-CLOOG =
-LIBCLOOG =
-else
-CLOOG = cloog
-LIBCLOOG = libcloog-isl.la
-endif
-bin_PROGRAMS = $(CLOOG)
-lib_LTLIBRARIES = $(LIBCLOOG)
-
-if NEED_GET_MEMORY_FUNCTIONS
-GET_MEMORY_FUNCTIONS=source/mp_get_memory_functions.c
-endif
-
-SOURCES_CORE = \
-	$(GET_MEMORY_FUNCTIONS) \
-	source/block.c \
-	source/clast.c \
-	source/matrix.c \
-	source/state.c \
-	source/input.c \
-	source/int.c \
-	source/loop.c \
-	source/names.c \
-	source/options.c \
-	source/pprint.c \
-	source/program.c \
-	source/statement.c \
-	source/stride.c \
-	source/union_domain.c \
-	source/version.c
-
-DEFAULT_INCLUDES = -I.
-INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include
-AM_CFLAGS = $(CFLAGS_WARN)
-libcloog_isl_la_CPPFLAGS = @ISL_CPPFLAGS@
-libcloog_isl_la_LDFLAGS = -version-info @versioninfo@ \
-	-rpath $(libdir) @ISL_LDFLAGS@
-libcloog_isl_la_LIBADD = @ISL_LIBS@ $(ISL_LA)
-libcloog_isl_la_SOURCES = \
-	$(SOURCES_CORE) \
-	source/isl/domain.c \
-	source/isl/constraints.c \
-	source/isl/backend.c
-LDADD = libcloog-isl.la
-cloog_DEPENDENCIES = libcloog-isl.la
-cloog_SOURCES = source/cloog.c
-
-pkginclude_HEADERS = \
-	include/cloog/block.h \
-	include/cloog/clast.h \
-	include/cloog/cloog.h \
-	include/cloog/input.h \
-	include/cloog/int.h \
-	include/cloog/matrix.h \
-	include/cloog/state.h \
-	include/cloog/domain.h \
-	include/cloog/loop.h \
-	include/cloog/constraints.h \
-	include/cloog/names.h \
-	include/cloog/options.h \
-	include/cloog/pprint.h \
-	include/cloog/program.h \
-	include/cloog/statement.h \
-	include/cloog/stride.h \
-	include/cloog/union_domain.h \
-	include/cloog/version.h
-
-pkgmatrixincludedir = $(pkgincludedir)/matrix
-pkgmatrixinclude_HEADERS = \
-	include/cloog/matrix/constraintset.h
-
-pkgislincludedir = $(pkgincludedir)/isl
-pkgislinclude_HEADERS = \
-	include/cloog/isl/backend.h \
-	include/cloog/isl/cloog.h \
-	include/cloog/isl/domain.h \
-	include/cloog/isl/constraintset.h
-
-version.h: @GIT_INDEX@
-	echo '#define CLOOG_HEAD "'`$(top_builddir)/genversion.sh`'"' > $@
-
-EXTRA_DIST = \
-	autoconf/Doxyfile.in \
-	source/matrix/constraintset.c \
-	doc/cloog.texi \
-	doc/images \
-	examples
-
-install-data-local:
-	@test -z "$(pkgconfig_libdir)" || $(mkdir_p) "$(DESTDIR)$(pkgconfig_libdir)"
-	$(INSTALL_DATA) $(pkgconfig_libfile) "$(DESTDIR)$(pkgconfig_libdir)/$(pkgconfig_libfile)"
-
-uninstall-local:
-	rm -f "$(DESTDIR)$(pkgconfig_libdir)/$(pkgconfig_libfile)"
-
-dist-hook:
-	rm -f $(distdir)/test/Makefile
-	$(top_builddir)/genversion.sh > $(distdir)/CLOOG_HEAD
-	(cd doc; make cloog.pdf) && cp doc/cloog.pdf $(distdir)/doc/
-
-#/*****************************************************************************
-# *                                   Rules                                   *
-# *****************************************************************************/
-
-check:
-	$(MAKE) test -C test
-
-valcheck:
-	$(MAKE) valgrind -C test
-
-total:
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *                     CLooG                     *"
-	@echo "              *-----------------------------------------------*/"
-	$(MAKE) uninstall
-	$(MAKE) clean
-	$(MAKE)
-	$(MAKE) install
-
-doc:
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *        Generating CLooG's documentation       *"
-	@echo "              *-----------------------------------------------*/"
-	doxygen ./autoconf/Doxyfile
diff --git a/cloog-0.16.3/Makefile.in b/cloog-0.16.3/Makefile.in
deleted file mode 100644
index 8f91ca0..0000000
--- a/cloog-0.16.3/Makefile.in
+++ /dev/null
@@ -1,1372 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-#
-#   /**-------------------------------------------------------------------**
-#    **                              CLooG                                **
-#    **-------------------------------------------------------------------**
-#    **                           makefile.in                             **
-#    **-------------------------------------------------------------------**
-#    **                   First version: october 25th 2001                **
-#    **-------------------------------------------------------------------**/
-#
-# makefile.in (or makefile if generated) of CLooG, the Chunky LOOp Generator.
-# makefile.in is not a makefile, you must run the 'configure' shellscript to
-# generate the makefile thanks to this file.
-
-
-
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-bin_PROGRAMS = $(am__EXEEXT_1)
-subdir = .
-DIST_COMMON = README $(am__configure_deps) $(pkginclude_HEADERS) \
-	$(pkgislinclude_HEADERS) $(pkgmatrixinclude_HEADERS) \
-	$(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-	$(srcdir)/genversion.sh.in $(top_srcdir)/autoconf/Doxyfile.in \
-	$(top_srcdir)/configure \
-	$(top_srcdir)/include/cloog/version.h.in \
-	$(top_srcdir)/source/version.c.in ChangeLog \
-	autoconf/config.guess autoconf/config.sub autoconf/depcomp \
-	autoconf/install-sh autoconf/ltmain.sh autoconf/missing
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cc_maxopt.m4 \
-	$(top_srcdir)/m4/ax_cflags_warn_all.m4 \
-	$(top_srcdir)/m4/ax_check_compiler_flags.m4 \
-	$(top_srcdir)/m4/ax_compiler_vendor.m4 \
-	$(top_srcdir)/m4/ax_create_pkgconfig_info.m4 \
-	$(top_srcdir)/m4/ax_gcc_archflag.m4 \
-	$(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \
-	$(top_srcdir)/m4/ax_submodule.m4 $(top_srcdir)/m4/libtool.m4 \
-	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno config.status.lineno
-mkinstalldirs = $(install_sh) -d
-CONFIG_CLEAN_FILES = autoconf/Doxyfile source/version.c \
-	include/cloog/version.h genversion.sh
-CONFIG_CLEAN_VPATH_FILES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
-	"$(DESTDIR)$(pkgincludedir)" "$(DESTDIR)$(pkgislincludedir)" \
-	"$(DESTDIR)$(pkgmatrixincludedir)"
-LTLIBRARIES = $(lib_LTLIBRARIES)
-libcloog_isl_la_DEPENDENCIES = $(ISL_LA)
-am__libcloog_isl_la_SOURCES_DIST = source/mp_get_memory_functions.c \
-	source/block.c source/clast.c source/matrix.c source/state.c \
-	source/input.c source/int.c source/loop.c source/names.c \
-	source/options.c source/pprint.c source/program.c \
-	source/statement.c source/stride.c source/union_domain.c \
-	source/version.c source/isl/domain.c source/isl/constraints.c \
-	source/isl/backend.c
-@NEED_GET_MEMORY_FUNCTIONS_TRUE@am__objects_1 = libcloog_isl_la-mp_get_memory_functions.lo
-am__objects_2 = $(am__objects_1) libcloog_isl_la-block.lo \
-	libcloog_isl_la-clast.lo libcloog_isl_la-matrix.lo \
-	libcloog_isl_la-state.lo libcloog_isl_la-input.lo \
-	libcloog_isl_la-int.lo libcloog_isl_la-loop.lo \
-	libcloog_isl_la-names.lo libcloog_isl_la-options.lo \
-	libcloog_isl_la-pprint.lo libcloog_isl_la-program.lo \
-	libcloog_isl_la-statement.lo libcloog_isl_la-stride.lo \
-	libcloog_isl_la-union_domain.lo libcloog_isl_la-version.lo
-am_libcloog_isl_la_OBJECTS = $(am__objects_2) \
-	libcloog_isl_la-domain.lo libcloog_isl_la-constraints.lo \
-	libcloog_isl_la-backend.lo
-libcloog_isl_la_OBJECTS = $(am_libcloog_isl_la_OBJECTS)
-AM_V_lt = $(am__v_lt_$(V))
-am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
-am__v_lt_0 = --silent
-libcloog_isl_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
-	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
-	$(AM_CFLAGS) $(CFLAGS) $(libcloog_isl_la_LDFLAGS) $(LDFLAGS) \
-	-o $@
-@NO_ISL_FALSE@am_libcloog_isl_la_rpath = -rpath $(libdir)
-@NO_ISL_FALSE@am__EXEEXT_1 = cloog$(EXEEXT)
-PROGRAMS = $(bin_PROGRAMS)
-am_cloog_OBJECTS = cloog.$(OBJEXT)
-cloog_OBJECTS = $(am_cloog_OBJECTS)
-cloog_LDADD = $(LDADD)
-depcomp = $(SHELL) $(top_srcdir)/autoconf/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_$(V))
-am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
-am__v_CC_0 = @echo "  CC    " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
-CCLD = $(CC)
-LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_$(V))
-am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
-am__v_CCLD_0 = @echo "  CCLD  " $@;
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
-SOURCES = $(libcloog_isl_la_SOURCES) $(cloog_SOURCES)
-DIST_SOURCES = $(am__libcloog_isl_la_SOURCES_DIST) $(cloog_SOURCES)
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-dvi-recursive install-exec-recursive \
-	install-html-recursive install-info-recursive \
-	install-pdf-recursive install-ps-recursive install-recursive \
-	installcheck-recursive installdirs-recursive pdf-recursive \
-	ps-recursive uninstall-recursive
-HEADERS = $(pkginclude_HEADERS) $(pkgislinclude_HEADERS) \
-	$(pkgmatrixinclude_HEADERS)
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
-  distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
-	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
-	distdir dist dist-all distcheck
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-distdir = $(PACKAGE)-$(VERSION)
-top_distdir = $(distdir)
-am__remove_distdir = \
-  { test ! -d "$(distdir)" \
-    || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
-         && rm -fr "$(distdir)"; }; }
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-DIST_ARCHIVES = $(distdir).tar.gz
-GZIP_ENV = --best
-distuninstallcheck_listfiles = find . -type f -print
-distcleancheck_listfiles = find . -type f -print
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BITS = @BITS@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CD = @CD@
-CFLAGS = @CFLAGS@
-CFLAGS_WARN = @CFLAGS_WARN@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GIT_INDEX = @GIT_INDEX@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-ISL_CPPFLAGS = @ISL_CPPFLAGS@
-ISL_LDFLAGS = @ISL_LDFLAGS@
-ISL_LIBS = @ISL_LIBS@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PRTDIAG = @PRTDIAG@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TEXI2DVI = @TEXI2DVI@
-VERSION = @VERSION@
-VERSION_MAJOR = @VERSION_MAJOR@
-VERSION_MINOR = @VERSION_MINOR@
-VERSION_REVISION = @VERSION_REVISION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-pkgconfig_libdir = @pkgconfig_libdir@
-pkgconfig_libfile = @pkgconfig_libfile@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-subdirs = @subdirs@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-versioninfo = @versioninfo@
-
-#/*****************************************************************************
-# *               CLooG : the Chunky Loop Generator (experimental)            *
-# *****************************************************************************
-# *                                                                           *
-# * Copyright (C) 2001 Cedric Bastoul                                         *
-# *                                                                           *
-# * This library is free software; you can redistribute it and/or             *
-# * modify it under the terms of the GNU Lesser General Public                *
-# * License as published by the Free Software Foundation; either              *
-# * version 2.1 of the License, or (at your option) any later version.        *
-# *                                                                           *
-# * This library is distributed in the hope that it will be useful,           *
-# * but WITHOUT ANY WARRANTY; without even the implied warranty of            *
-# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
-# * Lesser General Public License for more details.                           *
-# *                                                                           *
-# * You should have received a copy of the GNU Lesser General Public          *
-# * License along with this library; if not, write to the Free Software       *
-# * Foundation, Inc., 51 Franklin Street, Fifth Floor,                        *
-# * Boston, MA  02110-1301  USA                                               *
-# *                                                                           *
-# * CLooG, the Chunky Loop Generator                                          *
-# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                        *
-# *                                                                           *
-# *****************************************************************************/
-@BUNDLED_ISL_TRUE@MAYBE_ISL = isl
-@BUNDLED_ISL_TRUE@ISL_LA = $(top_builddir)/isl/libisl.la
-SUBDIRS = $(MAYBE_ISL) . doc test
-DIST_SUBDIRS = $(MAYBE_ISL) . doc test
-ACLOCAL_AMFLAGS = -I m4
-@NO_ISL_FALSE@CLOOG = cloog
-@NO_ISL_TRUE@CLOOG = 
-@NO_ISL_FALSE@LIBCLOOG = libcloog-isl.la
-@NO_ISL_TRUE@LIBCLOOG = 
-lib_LTLIBRARIES = $(LIBCLOOG)
-@NEED_GET_MEMORY_FUNCTIONS_TRUE@GET_MEMORY_FUNCTIONS = source/mp_get_memory_functions.c
-SOURCES_CORE = \
-	$(GET_MEMORY_FUNCTIONS) \
-	source/block.c \
-	source/clast.c \
-	source/matrix.c \
-	source/state.c \
-	source/input.c \
-	source/int.c \
-	source/loop.c \
-	source/names.c \
-	source/options.c \
-	source/pprint.c \
-	source/program.c \
-	source/statement.c \
-	source/stride.c \
-	source/union_domain.c \
-	source/version.c
-
-DEFAULT_INCLUDES = -I.
-INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include
-AM_CFLAGS = $(CFLAGS_WARN)
-libcloog_isl_la_CPPFLAGS = @ISL_CPPFLAGS@
-libcloog_isl_la_LDFLAGS = -version-info @versioninfo@ \
-	-rpath $(libdir) @ISL_LDFLAGS@
-
-libcloog_isl_la_LIBADD = @ISL_LIBS@ $(ISL_LA)
-libcloog_isl_la_SOURCES = \
-	$(SOURCES_CORE) \
-	source/isl/domain.c \
-	source/isl/constraints.c \
-	source/isl/backend.c
-
-LDADD = libcloog-isl.la
-cloog_DEPENDENCIES = libcloog-isl.la
-cloog_SOURCES = source/cloog.c
-pkginclude_HEADERS = \
-	include/cloog/block.h \
-	include/cloog/clast.h \
-	include/cloog/cloog.h \
-	include/cloog/input.h \
-	include/cloog/int.h \
-	include/cloog/matrix.h \
-	include/cloog/state.h \
-	include/cloog/domain.h \
-	include/cloog/loop.h \
-	include/cloog/constraints.h \
-	include/cloog/names.h \
-	include/cloog/options.h \
-	include/cloog/pprint.h \
-	include/cloog/program.h \
-	include/cloog/statement.h \
-	include/cloog/stride.h \
-	include/cloog/union_domain.h \
-	include/cloog/version.h
-
-pkgmatrixincludedir = $(pkgincludedir)/matrix
-pkgmatrixinclude_HEADERS = \
-	include/cloog/matrix/constraintset.h
-
-pkgislincludedir = $(pkgincludedir)/isl
-pkgislinclude_HEADERS = \
-	include/cloog/isl/backend.h \
-	include/cloog/isl/cloog.h \
-	include/cloog/isl/domain.h \
-	include/cloog/isl/constraintset.h
-
-EXTRA_DIST = \
-	autoconf/Doxyfile.in \
-	source/matrix/constraintset.c \
-	doc/cloog.texi \
-	doc/images \
-	examples
-
-all: all-recursive
-
-.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
-am--refresh:
-	@:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
-	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    echo ' $(SHELL) ./config.status'; \
-	    $(SHELL) ./config.status;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	$(SHELL) ./config.status --recheck
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	$(am__cd) $(srcdir) && $(AUTOCONF)
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
-$(am__aclocal_m4_deps):
-autoconf/Doxyfile: $(top_builddir)/config.status $(top_srcdir)/autoconf/Doxyfile.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-source/version.c: $(top_builddir)/config.status $(top_srcdir)/source/version.c.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-include/cloog/version.h: $(top_builddir)/config.status $(top_srcdir)/include/cloog/version.h.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-genversion.sh: $(top_builddir)/config.status $(srcdir)/genversion.sh.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
-	}
-
-uninstall-libLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
-	done
-
-clean-libLTLIBRARIES:
-	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
-	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" != "$$p" || dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-libcloog-isl.la: $(libcloog_isl_la_OBJECTS) $(libcloog_isl_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(libcloog_isl_la_LINK) $(am_libcloog_isl_la_rpath) $(libcloog_isl_la_OBJECTS) $(libcloog_isl_la_LIBADD) $(LIBS)
-install-binPROGRAMS: $(bin_PROGRAMS)
-	@$(NORMAL_INSTALL)
-	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
-	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
-	for p in $$list; do echo "$$p $$p"; done | \
-	sed 's/$(EXEEXT)$$//' | \
-	while read p p1; do if test -f $$p || test -f $$p1; \
-	  then echo "$$p"; echo "$$p"; else :; fi; \
-	done | \
-	sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
-	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
-	sed 'N;N;N;s,\n, ,g' | \
-	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
-	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
-	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
-	    else { print "f", $$3 "/" $$4, $$1; } } \
-	  END { for (d in files) print "f", d, files[d] }' | \
-	while read type dir files; do \
-	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
-	    test -z "$$files" || { \
-	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
-	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
-	    } \
-	; done
-
-uninstall-binPROGRAMS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
-	files=`for p in $$list; do echo "$$p"; done | \
-	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
-	      -e 's/$$/$(EXEEXT)/' `; \
-	test -n "$$list" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(bindir)" && rm -f $$files
-
-clean-binPROGRAMS:
-	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
-	echo " rm -f" $$list; \
-	rm -f $$list || exit $$?; \
-	test -n "$(EXEEXT)" || exit 0; \
-	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
-	echo " rm -f" $$list; \
-	rm -f $$list
-cloog$(EXEEXT): $(cloog_OBJECTS) $(cloog_DEPENDENCIES) 
-	@rm -f cloog$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(cloog_OBJECTS) $(cloog_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cloog.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-backend.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-block.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-clast.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-constraints.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-domain.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-input.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-int.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-loop.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-matrix.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-mp_get_memory_functions.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-names.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-options.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-pprint.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-program.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-state.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-statement.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-stride.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-union_domain.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-version.Plo@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c $<
-
-.c.obj:
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.c.lo:
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
-
-libcloog_isl_la-mp_get_memory_functions.lo: source/mp_get_memory_functions.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-mp_get_memory_functions.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-mp_get_memory_functions.Tpo -c -o libcloog_isl_la-mp_get_memory_functions.lo `test -f 'source/mp_get_memory_functions.c' || echo '$(srcdir)/'`source/mp_get_memory_functions.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-mp_get_memory_functions.Tpo $(DEPDIR)/libcloog_isl_la-mp_get_memory_functions.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/mp_get_memory_functions.c' object='libcloog_isl_la-mp_get_memory_functions.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-mp_get_memory_functions.lo `test -f 'source/mp_get_memory_functions.c' || echo '$(srcdir)/'`source/mp_get_memory_functions.c
-
-libcloog_isl_la-block.lo: source/block.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-block.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-block.Tpo -c -o libcloog_isl_la-block.lo `test -f 'source/block.c' || echo '$(srcdir)/'`source/block.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-block.Tpo $(DEPDIR)/libcloog_isl_la-block.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/block.c' object='libcloog_isl_la-block.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-block.lo `test -f 'source/block.c' || echo '$(srcdir)/'`source/block.c
-
-libcloog_isl_la-clast.lo: source/clast.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-clast.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-clast.Tpo -c -o libcloog_isl_la-clast.lo `test -f 'source/clast.c' || echo '$(srcdir)/'`source/clast.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-clast.Tpo $(DEPDIR)/libcloog_isl_la-clast.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/clast.c' object='libcloog_isl_la-clast.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-clast.lo `test -f 'source/clast.c' || echo '$(srcdir)/'`source/clast.c
-
-libcloog_isl_la-matrix.lo: source/matrix.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-matrix.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-matrix.Tpo -c -o libcloog_isl_la-matrix.lo `test -f 'source/matrix.c' || echo '$(srcdir)/'`source/matrix.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-matrix.Tpo $(DEPDIR)/libcloog_isl_la-matrix.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/matrix.c' object='libcloog_isl_la-matrix.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-matrix.lo `test -f 'source/matrix.c' || echo '$(srcdir)/'`source/matrix.c
-
-libcloog_isl_la-state.lo: source/state.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-state.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-state.Tpo -c -o libcloog_isl_la-state.lo `test -f 'source/state.c' || echo '$(srcdir)/'`source/state.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-state.Tpo $(DEPDIR)/libcloog_isl_la-state.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/state.c' object='libcloog_isl_la-state.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-state.lo `test -f 'source/state.c' || echo '$(srcdir)/'`source/state.c
-
-libcloog_isl_la-input.lo: source/input.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-input.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-input.Tpo -c -o libcloog_isl_la-input.lo `test -f 'source/input.c' || echo '$(srcdir)/'`source/input.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-input.Tpo $(DEPDIR)/libcloog_isl_la-input.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/input.c' object='libcloog_isl_la-input.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-input.lo `test -f 'source/input.c' || echo '$(srcdir)/'`source/input.c
-
-libcloog_isl_la-int.lo: source/int.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-int.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-int.Tpo -c -o libcloog_isl_la-int.lo `test -f 'source/int.c' || echo '$(srcdir)/'`source/int.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-int.Tpo $(DEPDIR)/libcloog_isl_la-int.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/int.c' object='libcloog_isl_la-int.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-int.lo `test -f 'source/int.c' || echo '$(srcdir)/'`source/int.c
-
-libcloog_isl_la-loop.lo: source/loop.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-loop.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-loop.Tpo -c -o libcloog_isl_la-loop.lo `test -f 'source/loop.c' || echo '$(srcdir)/'`source/loop.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-loop.Tpo $(DEPDIR)/libcloog_isl_la-loop.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/loop.c' object='libcloog_isl_la-loop.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-loop.lo `test -f 'source/loop.c' || echo '$(srcdir)/'`source/loop.c
-
-libcloog_isl_la-names.lo: source/names.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-names.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-names.Tpo -c -o libcloog_isl_la-names.lo `test -f 'source/names.c' || echo '$(srcdir)/'`source/names.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-names.Tpo $(DEPDIR)/libcloog_isl_la-names.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/names.c' object='libcloog_isl_la-names.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-names.lo `test -f 'source/names.c' || echo '$(srcdir)/'`source/names.c
-
-libcloog_isl_la-options.lo: source/options.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-options.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-options.Tpo -c -o libcloog_isl_la-options.lo `test -f 'source/options.c' || echo '$(srcdir)/'`source/options.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-options.Tpo $(DEPDIR)/libcloog_isl_la-options.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/options.c' object='libcloog_isl_la-options.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-options.lo `test -f 'source/options.c' || echo '$(srcdir)/'`source/options.c
-
-libcloog_isl_la-pprint.lo: source/pprint.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-pprint.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-pprint.Tpo -c -o libcloog_isl_la-pprint.lo `test -f 'source/pprint.c' || echo '$(srcdir)/'`source/pprint.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-pprint.Tpo $(DEPDIR)/libcloog_isl_la-pprint.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/pprint.c' object='libcloog_isl_la-pprint.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-pprint.lo `test -f 'source/pprint.c' || echo '$(srcdir)/'`source/pprint.c
-
-libcloog_isl_la-program.lo: source/program.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-program.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-program.Tpo -c -o libcloog_isl_la-program.lo `test -f 'source/program.c' || echo '$(srcdir)/'`source/program.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-program.Tpo $(DEPDIR)/libcloog_isl_la-program.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/program.c' object='libcloog_isl_la-program.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-program.lo `test -f 'source/program.c' || echo '$(srcdir)/'`source/program.c
-
-libcloog_isl_la-statement.lo: source/statement.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-statement.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-statement.Tpo -c -o libcloog_isl_la-statement.lo `test -f 'source/statement.c' || echo '$(srcdir)/'`source/statement.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-statement.Tpo $(DEPDIR)/libcloog_isl_la-statement.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/statement.c' object='libcloog_isl_la-statement.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-statement.lo `test -f 'source/statement.c' || echo '$(srcdir)/'`source/statement.c
-
-libcloog_isl_la-stride.lo: source/stride.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-stride.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-stride.Tpo -c -o libcloog_isl_la-stride.lo `test -f 'source/stride.c' || echo '$(srcdir)/'`source/stride.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-stride.Tpo $(DEPDIR)/libcloog_isl_la-stride.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/stride.c' object='libcloog_isl_la-stride.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-stride.lo `test -f 'source/stride.c' || echo '$(srcdir)/'`source/stride.c
-
-libcloog_isl_la-union_domain.lo: source/union_domain.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-union_domain.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-union_domain.Tpo -c -o libcloog_isl_la-union_domain.lo `test -f 'source/union_domain.c' || echo '$(srcdir)/'`source/union_domain.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-union_domain.Tpo $(DEPDIR)/libcloog_isl_la-union_domain.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/union_domain.c' object='libcloog_isl_la-union_domain.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-union_domain.lo `test -f 'source/union_domain.c' || echo '$(srcdir)/'`source/union_domain.c
-
-libcloog_isl_la-version.lo: source/version.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-version.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-version.Tpo -c -o libcloog_isl_la-version.lo `test -f 'source/version.c' || echo '$(srcdir)/'`source/version.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-version.Tpo $(DEPDIR)/libcloog_isl_la-version.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/version.c' object='libcloog_isl_la-version.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-version.lo `test -f 'source/version.c' || echo '$(srcdir)/'`source/version.c
-
-libcloog_isl_la-domain.lo: source/isl/domain.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-domain.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-domain.Tpo -c -o libcloog_isl_la-domain.lo `test -f 'source/isl/domain.c' || echo '$(srcdir)/'`source/isl/domain.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-domain.Tpo $(DEPDIR)/libcloog_isl_la-domain.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/isl/domain.c' object='libcloog_isl_la-domain.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-domain.lo `test -f 'source/isl/domain.c' || echo '$(srcdir)/'`source/isl/domain.c
-
-libcloog_isl_la-constraints.lo: source/isl/constraints.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-constraints.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-constraints.Tpo -c -o libcloog_isl_la-constraints.lo `test -f 'source/isl/constraints.c' || echo '$(srcdir)/'`source/isl/constraints.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-constraints.Tpo $(DEPDIR)/libcloog_isl_la-constraints.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/isl/constraints.c' object='libcloog_isl_la-constraints.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-constraints.lo `test -f 'source/isl/constraints.c' || echo '$(srcdir)/'`source/isl/constraints.c
-
-libcloog_isl_la-backend.lo: source/isl/backend.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-backend.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-backend.Tpo -c -o libcloog_isl_la-backend.lo `test -f 'source/isl/backend.c' || echo '$(srcdir)/'`source/isl/backend.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-backend.Tpo $(DEPDIR)/libcloog_isl_la-backend.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/isl/backend.c' object='libcloog_isl_la-backend.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-backend.lo `test -f 'source/isl/backend.c' || echo '$(srcdir)/'`source/isl/backend.c
-
-cloog.o: source/cloog.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cloog.o -MD -MP -MF $(DEPDIR)/cloog.Tpo -c -o cloog.o `test -f 'source/cloog.c' || echo '$(srcdir)/'`source/cloog.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/cloog.Tpo $(DEPDIR)/cloog.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/cloog.c' object='cloog.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cloog.o `test -f 'source/cloog.c' || echo '$(srcdir)/'`source/cloog.c
-
-cloog.obj: source/cloog.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cloog.obj -MD -MP -MF $(DEPDIR)/cloog.Tpo -c -o cloog.obj `if test -f 'source/cloog.c'; then $(CYGPATH_W) 'source/cloog.c'; else $(CYGPATH_W) '$(srcdir)/source/cloog.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/cloog.Tpo $(DEPDIR)/cloog.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/cloog.c' object='cloog.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cloog.obj `if test -f 'source/cloog.c'; then $(CYGPATH_W) 'source/cloog.c'; else $(CYGPATH_W) '$(srcdir)/source/cloog.c'; fi`
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool config.lt
-install-pkgincludeHEADERS: $(pkginclude_HEADERS)
-	@$(NORMAL_INSTALL)
-	test -z "$(pkgincludedir)" || $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)"
-	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
-	done
-
-uninstall-pkgincludeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(pkgincludedir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(pkgincludedir)" && rm -f $$files
-install-pkgislincludeHEADERS: $(pkgislinclude_HEADERS)
-	@$(NORMAL_INSTALL)
-	test -z "$(pkgislincludedir)" || $(MKDIR_P) "$(DESTDIR)$(pkgislincludedir)"
-	@list='$(pkgislinclude_HEADERS)'; test -n "$(pkgislincludedir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgislincludedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgislincludedir)" || exit $$?; \
-	done
-
-uninstall-pkgislincludeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgislinclude_HEADERS)'; test -n "$(pkgislincludedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(pkgislincludedir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(pkgislincludedir)" && rm -f $$files
-install-pkgmatrixincludeHEADERS: $(pkgmatrixinclude_HEADERS)
-	@$(NORMAL_INSTALL)
-	test -z "$(pkgmatrixincludedir)" || $(MKDIR_P) "$(DESTDIR)$(pkgmatrixincludedir)"
-	@list='$(pkgmatrixinclude_HEADERS)'; test -n "$(pkgmatrixincludedir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgmatrixincludedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgmatrixincludedir)" || exit $$?; \
-	done
-
-uninstall-pkgmatrixincludeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgmatrixinclude_HEADERS)'; test -n "$(pkgmatrixincludedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(pkgmatrixincludedir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(pkgmatrixincludedir)" && rm -f $$files
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	$(am__remove_distdir)
-	test -d "$(distdir)" || mkdir "$(distdir)"
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test -d "$(distdir)/$$subdir" \
-	    || $(MKDIR_P) "$(distdir)/$$subdir" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-	    $(am__relativize); \
-	    new_distdir=$$reldir; \
-	    dir1=$$subdir; dir2="$(top_distdir)"; \
-	    $(am__relativize); \
-	    new_top_distdir=$$reldir; \
-	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-	    ($(am__cd) $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$new_top_distdir" \
-	        distdir="$$new_distdir" \
-		am__remove_distdir=: \
-		am__skip_length_check=: \
-		am__skip_mode_fix=: \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-	$(MAKE) $(AM_MAKEFLAGS) \
-	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
-	  dist-hook
-	-test -n "$(am__skip_mode_fix)" \
-	|| find "$(distdir)" -type d ! -perm -755 \
-		-exec chmod u+rwx,go+rx {} \; -o \
-	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
-	|| chmod -R a+r "$(distdir)"
-dist-gzip: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__remove_distdir)
-
-dist-bzip2: distdir
-	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
-	$(am__remove_distdir)
-
-dist-lzma: distdir
-	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
-	$(am__remove_distdir)
-
-dist-xz: distdir
-	tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
-	$(am__remove_distdir)
-
-dist-tarZ: distdir
-	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
-	$(am__remove_distdir)
-
-dist-shar: distdir
-	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
-	$(am__remove_distdir)
-
-dist-zip: distdir
-	-rm -f $(distdir).zip
-	zip -rq $(distdir).zip $(distdir)
-	$(am__remove_distdir)
-
-dist dist-all: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__remove_distdir)
-
-# This target untars the dist file and tries a VPATH configuration.  Then
-# it guarantees that the distribution is self-contained by making another
-# tarfile.
-distcheck: dist
-	case '$(DIST_ARCHIVES)' in \
-	*.tar.gz*) \
-	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
-	*.tar.bz2*) \
-	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
-	*.tar.lzma*) \
-	  lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
-	*.tar.xz*) \
-	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
-	*.tar.Z*) \
-	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
-	*.shar.gz*) \
-	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
-	*.zip*) \
-	  unzip $(distdir).zip ;;\
-	esac
-	chmod -R a-w $(distdir); chmod a+w $(distdir)
-	mkdir $(distdir)/_build
-	mkdir $(distdir)/_inst
-	chmod a-w $(distdir)
-	test -d $(distdir)/_build || exit 0; \
-	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
-	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
-	  && am__cwd=`pwd` \
-	  && $(am__cd) $(distdir)/_build \
-	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
-	    $(DISTCHECK_CONFIGURE_FLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
-	  && $(MAKE) $(AM_MAKEFLAGS) check \
-	  && $(MAKE) $(AM_MAKEFLAGS) install \
-	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
-	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
-	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
-	        distuninstallcheck \
-	  && chmod -R a-w "$$dc_install_base" \
-	  && ({ \
-	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
-	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
-	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
-	  && rm -rf "$$dc_destdir" \
-	  && $(MAKE) $(AM_MAKEFLAGS) dist \
-	  && rm -rf $(DIST_ARCHIVES) \
-	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
-	  && cd "$$am__cwd" \
-	  || exit 1
-	$(am__remove_distdir)
-	@(echo "$(distdir) archives ready for distribution: "; \
-	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
-	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
-distuninstallcheck:
-	@$(am__cd) '$(distuninstallcheck_dir)' \
-	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
-	   || { echo "ERROR: files left after uninstall:" ; \
-	        if test -n "$(DESTDIR)"; then \
-	          echo "  (check DESTDIR support)"; \
-	        fi ; \
-	        $(distuninstallcheck_listfiles) ; \
-	        exit 1; } >&2
-distcleancheck: distclean
-	@if test '$(srcdir)' = . ; then \
-	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
-	  exit 1 ; \
-	fi
-	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
-	  || { echo "ERROR: files left in build directory after distclean:" ; \
-	       $(distcleancheck_listfiles) ; \
-	       exit 1; } >&2
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS)
-install-binPROGRAMS: install-libLTLIBRARIES
-
-installdirs: installdirs-recursive
-installdirs-am:
-	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgincludedir)" "$(DESTDIR)$(pkgislincludedir)" "$(DESTDIR)$(pkgmatrixincludedir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
-	clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-libtool distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am: install-data-local install-pkgincludeHEADERS \
-	install-pkgislincludeHEADERS install-pkgmatrixincludeHEADERS
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am: install-binPROGRAMS install-libLTLIBRARIES
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf $(top_srcdir)/autom4te.cache
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES \
-	uninstall-local uninstall-pkgincludeHEADERS \
-	uninstall-pkgislincludeHEADERS \
-	uninstall-pkgmatrixincludeHEADERS
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
-	install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-	all all-am am--refresh check check-am clean clean-binPROGRAMS \
-	clean-generic clean-libLTLIBRARIES clean-libtool ctags \
-	ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-hook \
-	dist-lzma dist-shar dist-tarZ dist-xz dist-zip distcheck \
-	distclean distclean-compile distclean-generic \
-	distclean-libtool distclean-tags distcleancheck distdir \
-	distuninstallcheck dvi dvi-am html html-am info info-am \
-	install install-am install-binPROGRAMS install-data \
-	install-data-am install-data-local install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-libLTLIBRARIES \
-	install-man install-pdf install-pdf-am \
-	install-pkgincludeHEADERS install-pkgislincludeHEADERS \
-	install-pkgmatrixincludeHEADERS install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	installdirs-am maintainer-clean maintainer-clean-generic \
-	mostlyclean mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
-	uninstall uninstall-am uninstall-binPROGRAMS \
-	uninstall-libLTLIBRARIES uninstall-local \
-	uninstall-pkgincludeHEADERS uninstall-pkgislincludeHEADERS \
-	uninstall-pkgmatrixincludeHEADERS
-
-
-FORCE:
-isl/libisl.la: FORCE
-	cd isl; $(MAKE) $(AM_MAKEFLAGS) libisl.la
-
-version.h: @GIT_INDEX@
-	echo '#define CLOOG_HEAD "'`$(top_builddir)/genversion.sh`'"' > $@
-
-install-data-local:
-	@test -z "$(pkgconfig_libdir)" || $(mkdir_p) "$(DESTDIR)$(pkgconfig_libdir)"
-	$(INSTALL_DATA) $(pkgconfig_libfile) "$(DESTDIR)$(pkgconfig_libdir)/$(pkgconfig_libfile)"
-
-uninstall-local:
-	rm -f "$(DESTDIR)$(pkgconfig_libdir)/$(pkgconfig_libfile)"
-
-dist-hook:
-	rm -f $(distdir)/test/Makefile
-	$(top_builddir)/genversion.sh > $(distdir)/CLOOG_HEAD
-	(cd doc; make cloog.pdf) && cp doc/cloog.pdf $(distdir)/doc/
-
-#/*****************************************************************************
-# *                                   Rules                                   *
-# *****************************************************************************/
-
-check:
-	$(MAKE) test -C test
-
-valcheck:
-	$(MAKE) valgrind -C test
-
-total:
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *                     CLooG                     *"
-	@echo "              *-----------------------------------------------*/"
-	$(MAKE) uninstall
-	$(MAKE) clean
-	$(MAKE)
-	$(MAKE) install
-
-doc:
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *        Generating CLooG's documentation       *"
-	@echo "              *-----------------------------------------------*/"
-	doxygen ./autoconf/Doxyfile
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/cloog-0.16.3/README b/cloog-0.16.3/README
deleted file mode 100644
index 7003a2b..0000000
--- a/cloog-0.16.3/README
+++ /dev/null
@@ -1,203 +0,0 @@
-#
-#  /**-------------------------------------------------------------------**
-#   **                              CLooG                                **
-#   **-------------------------------------------------------------------**
-#   **                     The Chunky Loop Generator                     **
-#   **-------------------------------------------------------------------**
-#   **           First version of this file: january 22th 2002           **
-#   **-------------------------------------------------------------------**/
-#
-
-For complete informations about this software, how to build and use it,
-please see the postscript file in the ./doc subdirectory (a pdf version
-is available in the web site).
-
-Overview :
-I.   Description 
-II.  Building CLooG
-III. Options
-IV.  Running CLooG
-V.   General Questions
-
-#   **-------------------------------------------------------------------**
-#   **                        I. Description                             **
-#   **-------------------------------------------------------------------**/
-
-CLooG is a software which generates loops for scanning Z-polyhedra. That is,
-CLooG finds the code or pseudo-code where each integral point of one or more
-parametrized polyhedron or parametrized polyhedra union is reached. CLooG is
-designed to avoid control overhead and to produce a very efficient code.
-
-Its input is some data on the polyhedra to scan, basically the system of
-affine inequalities that define them, and a context that defines some
-properties known on the parameters if any. The output is the pseudo scanning
-code. Many facilities are provided to generate a near-to-be-compileable code,
-and every useful functions to generate the code may be called from the CLooG
-library.
-
-            INPUT                   |                 OUTPUT
-(fortunately not exactly the input, |   (the real one, with default options)
- check test/readme.cloog for the    |
- real input for that problem !)	    |
-	                            |
-	j^ i>=2                     |
-         | | j<=n+2-i               |
-         | |\     | i<=n            |
-         | | \    |                 |
-       m-+-****---+-j<=m            |    for (i=2;i<=n;i++) {
-         | *****  |                 |      for (j=2;j<=min(m,-i+n+2);j++) {    
-         | ****** |                ==>       S1 ;
-         | *******|                 |      }
-       2-+-********-j>=2            |    }
-         | |      |\                |
-       0-+-+------+--->i            |
-         | |      |                 |
-         0 2      n                 |
-                                    |
-       Context : n>=2               |
-                 m>=2               |
-       System  : 2<=i<=n            |
-                 2<=j<=m            |
-		 j<=n+2-i           |
-
-#   **-------------------------------------------------------------------**
-#   **                      II. Building CLooG                           **
-#   **-------------------------------------------------------------------**/
-
-If you obtained CLooG from the git repository, then you first
-need to obtain the submodules and create a configure script.
-
-  ./get_submodules.sh
-  ./autogen.sh
-
-The first step is only needed if you plan on using the isl backend.
-
-The configure shell script attempts to guess correct values for various
-system-dependent variables used during compilation. It uses those values to
-create a Makefile. The file configure.ac is used to create configure by a
-program called autoconf.  You only need configure.ac if you want to change
-it or regenerate configure using a newer version of autoconf.
-
-The simplest way to compile this package is:
-cd to the directory containing the package's source code and type 
-
-  ./configure
-
-to configure the package for your system (while running, configure prints
-some messages telling which features it is checking for). To compile the
-package, type
-
-  make
-  
-
-to install the program and/or the library, type
-
-  make install
-
-you can remove the program binaries and object files from the source code
-directory by typing
-  
-  make clean
-  
-To also remove the files that configure created (so you can compile the
-package for a different kind of computer) type
-  
-  make distclean
-
-#   **-------------------------------------------------------------------**
-#   **                           III. Options                            **
-#   **-------------------------------------------------------------------**/
-
-By default,  make will install the package's files in /usr/local/bin,
-/usr/local/lib, etc. You can specify an installation prefix other than 
-/usr/local by giving onfigure the option --prefix=PATH.
-
-By default, configure will use the isl that comes bundled with CLooG.
-Using the --with-isl option of configure the user can specify that "no" isl,
-a previously installed ("system") isl or a "build" isl should be used.
-In the latter case, the user should also specify the build location
-using --with-isl-builddir=PATH.  In case of an installed isl,
-the installation location can be specified using the
---with-isl-prefix=PATH and --with-isl-exec-prefix=PATH options of configure.
-
-By default, configure will seek the PolyLib in standard locations.
-If necessary, you can specify the PolyLib's path by giving configure the
-option --with-polylib-prefix=PATH and/or --with-polylib-exec-prefix=PATH.
-
-By default, configure will seek the GMP library in standard locations.
-If necessary, you can specify the GMP's path by giving configure the
-option --with-gmp-prefix=PATH and/or --with-gmp-exec-prefix=PATH.
-
-By default, when using the PolyLib backend,
-CLooG and its library are built using 64 bits integer
-representation. You can choose to specify explicitly others integer
-representations by using:
---with-bits=32  for 32 bits integers,
---with-bits=64  for 64 bits integers (default),
---with-bits=gmp for multiple precision integers.
-
-#   **-------------------------------------------------------------------**
-#   **                         IV. Running CLooG                         **
-#   **-------------------------------------------------------------------**/
-
-To run CLooG, simply type 'cloog', optionally followed by the name of an
-input file. You can type 'cloog -h' or 'cloog --help' for some help.
-For more informations, please check the ./doc subdirectory.
-
-#   **-------------------------------------------------------------------**
-#   **                        V. General Questions                       **
-#   **-------------------------------------------------------------------**/
-
-1. What does CLooG means ?
-
-CLooG is the Chunky LOOp Generator, Chunky is an automatic loop optimizer for
-data locality. CLooG is a completely independent part of the Chunky project.
-Pronounce 'CLooG' as 'klug', which means 'sly' in german :-).
-
-2. CLooG do not compile, what should I do ?
-
-CLooG should compile everywhere (assuming that PolyLib is still there), thus
-there is a problem or the documentation is not clear, in both case it is
-necessary to ask the author(s) !
-
-3. I need a feature that CLooG do not implement, what should I do ?
-
-There are two ways. First, CLooG is a LGPL software and library. So you
-are welcome to improve it yourself ;-) ! Many project have been successful, it
-is -maybe- a sign that this is not too hard to put your hands inside the
-source. Second, just ask the author(s) :-) ! Maybe a lot of people would be
-interessed by such feature, maybe many people asked for it before, maybe it's
-trivial to implement (and even)... Please just never hesitate to ask the
-author(s) !
-
-4. I implemented a cool feature, can I submit it ?
-
-Obviously you are welcome to send the author(s) any improvement. But obviously
-we are quite careful with readability, correctness and stability, and the
-author(s) will read, check and check again any contribution before including it.
-Thus, it can take time... There are few basic rules to write contributions:
-- (1) Do never change the indentation of any part of the code that is not yours.
-- (2) Do never send codes that use more than 80 columns.
-- (3) Do never send codes without a lot of comments in (bad or good) english.
-- (4) Do never send codes with obscure and/or non-english variable names.
-- (5) Use C89, just C, only C (note: "//" comments are not C89,
-  variable declaration elsewhere than at the beginning of a block, is not C89).
-- (6) Read doc/SubmittingPatches
-Please understand that in order to live for a long time, and to be used in many
-projects the very first priority for CLooG is to be readable and documented.
-
-5. Is CLooG bug free ?
-
-No, who can ? ClooG is a complex program, and we do not pretend it to be bug
-free. Nevertheless because it has been tested and tested, we are fairly sure
-that CLooG results with default options have good chances to be satisfactory.
-If you find a result that looks strange, inadequate or incorrect, please send:
-- (1) The input file to the author(s).
-- (2) The output.
-- (3) The first line given by typing 'cloog -v'.
-- (4) All your command line options to achieve the result.
-We will try to explain the result or to fix the problem as soon as possible.
-
-6. How can I contact the author(s) ?
-
-Just send a mail to cloog-development@googlegroups.com
diff --git a/cloog-0.16.3/aclocal.m4 b/cloog-0.16.3/aclocal.m4
deleted file mode 100644
index 29d7483..0000000
--- a/cloog-0.16.3/aclocal.m4
+++ /dev/null
@@ -1,991 +0,0 @@
-# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-m4_ifndef([AC_AUTOCONF_VERSION],
-  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],,
-[m4_warning([this file was generated for autoconf 2.65.
-You have another version of autoconf.  It may work, but is not guaranteed to.
-If you have problems, you may need to regenerate the build system entirely.
-To do so, use the procedure documented by the package, typically `autoreconf'.])])
-
-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_AUTOMAKE_VERSION(VERSION)
-# ----------------------------
-# Automake X.Y traces this macro to ensure aclocal.m4 has been
-# generated from the m4 files accompanying Automake X.Y.
-# (This private macro should not be called outside this file.)
-AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.11'
-dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
-dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.11.1], [],
-      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
-])
-
-# _AM_AUTOCONF_VERSION(VERSION)
-# -----------------------------
-# aclocal traces this macro to find the Autoconf version.
-# This is a private macro too.  Using m4_define simplifies
-# the logic in aclocal, which can simply ignore this definition.
-m4_define([_AM_AUTOCONF_VERSION], [])
-
-# AM_SET_CURRENT_AUTOMAKE_VERSION
-# -------------------------------
-# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
-# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
-AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.1])dnl
-m4_ifndef([AC_AUTOCONF_VERSION],
-  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
-
-# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
-# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
-#
-# Of course, Automake must honor this variable whenever it calls a
-# tool from the auxiliary directory.  The problem is that $srcdir (and
-# therefore $ac_aux_dir as well) can be either absolute or relative,
-# depending on how configure is run.  This is pretty annoying, since
-# it makes $ac_aux_dir quite unusable in subdirectories: in the top
-# source directory, any form will work fine, but in subdirectories a
-# relative path needs to be adjusted first.
-#
-# $ac_aux_dir/missing
-#    fails when called from a subdirectory if $ac_aux_dir is relative
-# $top_srcdir/$ac_aux_dir/missing
-#    fails if $ac_aux_dir is absolute,
-#    fails when called from a subdirectory in a VPATH build with
-#          a relative $ac_aux_dir
-#
-# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
-# are both prefixed by $srcdir.  In an in-source build this is usually
-# harmless because $srcdir is `.', but things will broke when you
-# start a VPATH build or use an absolute $srcdir.
-#
-# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
-# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
-#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
-# and then we would define $MISSING as
-#   MISSING="\${SHELL} $am_aux_dir/missing"
-# This will work as long as MISSING is not called from configure, because
-# unfortunately $(top_srcdir) has no meaning in configure.
-# However there are other variables, like CC, which are often used in
-# configure, and could therefore not use this "fixed" $ac_aux_dir.
-#
-# Another solution, used here, is to always expand $ac_aux_dir to an
-# absolute PATH.  The drawback is that using absolute paths prevent a
-# configured tree to be moved without reconfiguration.
-
-AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-])
-
-# AM_CONDITIONAL                                            -*- Autoconf -*-
-
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 9
-
-# AM_CONDITIONAL(NAME, SHELL-CONDITION)
-# -------------------------------------
-# Define a conditional.
-AC_DEFUN([AM_CONDITIONAL],
-[AC_PREREQ(2.52)dnl
- ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
-	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
-AC_SUBST([$1_TRUE])dnl
-AC_SUBST([$1_FALSE])dnl
-_AM_SUBST_NOTMAKE([$1_TRUE])dnl
-_AM_SUBST_NOTMAKE([$1_FALSE])dnl
-m4_define([_AM_COND_VALUE_$1], [$2])dnl
-if $2; then
-  $1_TRUE=
-  $1_FALSE='#'
-else
-  $1_TRUE='#'
-  $1_FALSE=
-fi
-AC_CONFIG_COMMANDS_PRE(
-[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
-  AC_MSG_ERROR([[conditional "$1" was never defined.
-Usually this means the macro was only invoked conditionally.]])
-fi])])
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 10
-
-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
-# written in clear, in which case automake, when reading aclocal.m4,
-# will think it sees a *use*, and therefore will trigger all it's
-# C support machinery.  Also note that it means that autoscan, seeing
-# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
-
-
-# _AM_DEPENDENCIES(NAME)
-# ----------------------
-# See how the compiler implements dependency checking.
-# NAME is "CC", "CXX", "GCJ", or "OBJC".
-# We try a few techniques and use that to set a single cache variable.
-#
-# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
-# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
-# dependency, and given that the user is not expected to run this macro,
-# just rely on AC_PROG_CC.
-AC_DEFUN([_AM_DEPENDENCIES],
-[AC_REQUIRE([AM_SET_DEPDIR])dnl
-AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
-AC_REQUIRE([AM_MAKE_INCLUDE])dnl
-AC_REQUIRE([AM_DEP_TRACK])dnl
-
-ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
-       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
-       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
-       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
-       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
-                   [depcc="$$1"   am_compiler_list=])
-
-AC_CACHE_CHECK([dependency style of $depcc],
-               [am_cv_$1_dependencies_compiler_type],
-[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_$1_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
-  fi
-  am__universal=false
-  m4_case([$1], [CC],
-    [case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac],
-    [CXX],
-    [case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac])
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_$1_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_$1_dependencies_compiler_type=none
-fi
-])
-AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
-AM_CONDITIONAL([am__fastdep$1], [
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
-])
-
-
-# AM_SET_DEPDIR
-# -------------
-# Choose a directory name for dependency files.
-# This macro is AC_REQUIREd in _AM_DEPENDENCIES
-AC_DEFUN([AM_SET_DEPDIR],
-[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
-])
-
-
-# AM_DEP_TRACK
-# ------------
-AC_DEFUN([AM_DEP_TRACK],
-[AC_ARG_ENABLE(dependency-tracking,
-[  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors])
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-fi
-AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
-AC_SUBST([AMDEPBACKSLASH])dnl
-_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
-])
-
-# Generate code to set up dependency tracking.              -*- Autoconf -*-
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-#serial 5
-
-# _AM_OUTPUT_DEPENDENCY_COMMANDS
-# ------------------------------
-AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
-[{
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
-  # are listed without --file.  Let's play safe and only enable the eval
-  # if we detect the quoting.
-  case $CONFIG_FILES in
-  *\'*) eval set x "$CONFIG_FILES" ;;
-  *)   set x $CONFIG_FILES ;;
-  esac
-  shift
-  for mf
-  do
-    # Strip MF so we end up with the name of the file.
-    mf=`echo "$mf" | sed -e 's/:.*$//'`
-    # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
-    # some people rename them; so instead we look at the file content.
-    # Grep'ing the first line is not enough: some people post-process
-    # each Makefile.in and add a new line on top of each file to say so.
-    # Grep'ing the whole file is not good either: AIX grep has a line
-    # limit of 2048, but all sed's we know have understand at least 4000.
-    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-      dirpart=`AS_DIRNAME("$mf")`
-    else
-      continue
-    fi
-    # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
-    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-    test -z "$DEPDIR" && continue
-    am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
-    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
-    # Find all dependency output files, they are included files with
-    # $(DEPDIR) in their names.  We invoke sed twice because it is the
-    # simplest approach to changing $(DEPDIR) to its actual value in the
-    # expansion.
-    for file in `sed -n "
-      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-      # Make sure the directory exists.
-      test -f "$dirpart/$file" && continue
-      fdir=`AS_DIRNAME(["$file"])`
-      AS_MKDIR_P([$dirpart/$fdir])
-      # echo "creating $dirpart/$file"
-      echo '# dummy' > "$dirpart/$file"
-    done
-  done
-}
-])# _AM_OUTPUT_DEPENDENCY_COMMANDS
-
-
-# AM_OUTPUT_DEPENDENCY_COMMANDS
-# -----------------------------
-# This macro should only be invoked once -- use via AC_REQUIRE.
-#
-# This code is only required when automatic dependency tracking
-# is enabled.  FIXME.  This creates each `.P' file that we will
-# need in order to bootstrap the dependency handling code.
-AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
-[AC_CONFIG_COMMANDS([depfiles],
-     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
-     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
-])
-
-# Do all the work for Automake.                             -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 16
-
-# This macro actually does too much.  Some checks are only needed if
-# your package does certain things.  But this isn't really a big deal.
-
-# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
-# AM_INIT_AUTOMAKE([OPTIONS])
-# -----------------------------------------------
-# The call with PACKAGE and VERSION arguments is the old style
-# call (pre autoconf-2.50), which is being phased out.  PACKAGE
-# and VERSION should now be passed to AC_INIT and removed from
-# the call to AM_INIT_AUTOMAKE.
-# We support both call styles for the transition.  After
-# the next Automake release, Autoconf can make the AC_INIT
-# arguments mandatory, and then we can depend on a new Autoconf
-# release and drop the old call support.
-AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.62])dnl
-dnl Autoconf wants to disallow AM_ names.  We explicitly allow
-dnl the ones we care about.
-m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
-AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
-AC_REQUIRE([AC_PROG_INSTALL])dnl
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-AC_SUBST([CYGPATH_W])
-
-# Define the identity of the package.
-dnl Distinguish between old-style and new-style calls.
-m4_ifval([$2],
-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
- AC_SUBST([PACKAGE], [$1])dnl
- AC_SUBST([VERSION], [$2])],
-[_AM_SET_OPTIONS([$1])dnl
-dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
-m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
-  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
-
-_AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
-
-# Some tools Automake needs.
-AC_REQUIRE([AM_SANITY_CHECK])dnl
-AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
-AM_MISSING_PROG(AUTOCONF, autoconf)
-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
-AM_MISSING_PROG(AUTOHEADER, autoheader)
-AM_MISSING_PROG(MAKEINFO, makeinfo)
-AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
-AC_REQUIRE([AM_PROG_MKDIR_P])dnl
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([AC_PROG_MAKE_SET])dnl
-AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
-	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
-			     [_AM_PROG_TAR([v7])])])
-_AM_IF_OPTION([no-dependencies],,
-[AC_PROVIDE_IFELSE([AC_PROG_CC],
-		  [_AM_DEPENDENCIES(CC)],
-		  [define([AC_PROG_CC],
-			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_CXX],
-		  [_AM_DEPENDENCIES(CXX)],
-		  [define([AC_PROG_CXX],
-			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_OBJC],
-		  [_AM_DEPENDENCIES(OBJC)],
-		  [define([AC_PROG_OBJC],
-			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
-])
-_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
-dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
-dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
-dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
-AC_CONFIG_COMMANDS_PRE(dnl
-[m4_provide_if([_AM_COMPILER_EXEEXT],
-  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
-])
-
-dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
-dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
-dnl mangled by Autoconf and run in a shell conditional statement.
-m4_define([_AC_COMPILER_EXEEXT],
-m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
-
-
-# When config.status generates a header, we must update the stamp-h file.
-# This file resides in the same directory as the config header
-# that is generated.  The stamp files are numbered to have different names.
-
-# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
-# loop where config.status creates the headers, so we can generate
-# our stamp files there.
-AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
-[# Compute $1's index in $config_headers.
-_am_arg=$1
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $_am_arg | $_am_arg:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
-
-# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_INSTALL_SH
-# ------------------
-# Define $install_sh.
-AC_DEFUN([AM_PROG_INSTALL_SH],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-if test x"${install_sh}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
-  *)
-    install_sh="\${SHELL} $am_aux_dir/install-sh"
-  esac
-fi
-AC_SUBST(install_sh)])
-
-# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# Check whether the underlying file-system supports filenames
-# with a leading dot.  For instance MS-DOS doesn't.
-AC_DEFUN([AM_SET_LEADING_DOT],
-[rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
-else
-  am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-AC_SUBST([am__leading_dot])])
-
-# Check to see how 'make' treats includes.	            -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 4
-
-# AM_MAKE_INCLUDE()
-# -----------------
-# Check to see how make treats includes.
-AC_DEFUN([AM_MAKE_INCLUDE],
-[am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-	@echo this is the am__doit target
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-AC_MSG_CHECKING([for style of include used by $am_make])
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
-  am__include=include
-  am__quote=
-  _am_result=GNU
-  ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   case `$am_make -s -f confmf 2> /dev/null` in #(
-   *the\ am__doit\ target*)
-     am__include=.include
-     am__quote="\""
-     _am_result=BSD
-     ;;
-   esac
-fi
-AC_SUBST([am__include])
-AC_SUBST([am__quote])
-AC_MSG_RESULT([$_am_result])
-rm -f confinc confmf
-])
-
-# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
-
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 6
-
-# AM_MISSING_PROG(NAME, PROGRAM)
-# ------------------------------
-AC_DEFUN([AM_MISSING_PROG],
-[AC_REQUIRE([AM_MISSING_HAS_RUN])
-$1=${$1-"${am_missing_run}$2"}
-AC_SUBST($1)])
-
-
-# AM_MISSING_HAS_RUN
-# ------------------
-# Define MISSING if not defined so far and test if it supports --run.
-# If it does, set am_missing_run to use it, otherwise, to nothing.
-AC_DEFUN([AM_MISSING_HAS_RUN],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([missing])dnl
-if test x"${MISSING+set}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
-  *)
-    MISSING="\${SHELL} $am_aux_dir/missing" ;;
-  esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  AC_MSG_WARN([`missing' script is too old or missing])
-fi
-])
-
-# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_MKDIR_P
-# ---------------
-# Check for `mkdir -p'.
-AC_DEFUN([AM_PROG_MKDIR_P],
-[AC_PREREQ([2.60])dnl
-AC_REQUIRE([AC_PROG_MKDIR_P])dnl
-dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
-dnl while keeping a definition of mkdir_p for backward compatibility.
-dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
-dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
-dnl Makefile.ins that do not define MKDIR_P, so we do our own
-dnl adjustment using top_builddir (which is defined more often than
-dnl MKDIR_P).
-AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
-case $mkdir_p in
-  [[\\/$]]* | ?:[[\\/]]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-])
-
-# Helper functions for option handling.                     -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 4
-
-# _AM_MANGLE_OPTION(NAME)
-# -----------------------
-AC_DEFUN([_AM_MANGLE_OPTION],
-[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
-
-# _AM_SET_OPTION(NAME)
-# ------------------------------
-# Set option NAME.  Presently that only means defining a flag for this option.
-AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
-
-# _AM_SET_OPTIONS(OPTIONS)
-# ----------------------------------
-# OPTIONS is a space-separated list of Automake options.
-AC_DEFUN([_AM_SET_OPTIONS],
-[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
-
-# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
-# -------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-AC_DEFUN([_AM_IF_OPTION],
-[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-
-# Check to make sure that the build environment is sane.    -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# AM_SANITY_CHECK
-# ---------------
-AC_DEFUN([AM_SANITY_CHECK],
-[AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name.  Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
-  *[[\\\"\#\$\&\'\`$am_lf]]*)
-    AC_MSG_ERROR([unsafe absolute working directory name]);;
-esac
-case $srcdir in
-  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
-    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$[*]" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$[*]" != "X $srcdir/configure conftest.file" \
-      && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
-alias in your environment])
-   fi
-
-   test "$[2]" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   AC_MSG_ERROR([newly created file is older than distributed files!
-Check your system clock])
-fi
-AC_MSG_RESULT(yes)])
-
-# Copyright (C) 2009  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_SILENT_RULES([DEFAULT])
-# --------------------------
-# Enable less verbose build rules; with the default set to DEFAULT
-# (`yes' being less verbose, `no' or empty being verbose).
-AC_DEFUN([AM_SILENT_RULES],
-[AC_ARG_ENABLE([silent-rules],
-[  --enable-silent-rules          less verbose build output (undo: `make V=1')
-  --disable-silent-rules         verbose build output (undo: `make V=0')])
-case $enable_silent_rules in
-yes) AM_DEFAULT_VERBOSITY=0;;
-no)  AM_DEFAULT_VERBOSITY=1;;
-*)   AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
-esac
-AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
-AM_BACKSLASH='\'
-AC_SUBST([AM_BACKSLASH])dnl
-_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
-])
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_INSTALL_STRIP
-# ---------------------
-# One issue with vendor `install' (even GNU) is that you can't
-# specify the program used to strip binaries.  This is especially
-# annoying in cross-compiling environments, where the build's strip
-# is unlikely to handle the host's binaries.
-# Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in `make install-strip', and initialize
-# STRIPPROG with the value of the STRIP variable (set by the user).
-AC_DEFUN([AM_PROG_INSTALL_STRIP],
-[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
-if test "$cross_compiling" != no; then
-  AC_CHECK_TOOL([STRIP], [strip], :)
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-AC_SUBST([INSTALL_STRIP_PROGRAM])])
-
-# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# _AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
-# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
-# This macro is traced by Automake.
-AC_DEFUN([_AM_SUBST_NOTMAKE])
-
-# AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
-# Public sister of _AM_SUBST_NOTMAKE.
-AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
-
-# Check how to create a tarball.                            -*- Autoconf -*-
-
-# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# _AM_PROG_TAR(FORMAT)
-# --------------------
-# Check how to create a tarball in format FORMAT.
-# FORMAT should be one of `v7', `ustar', or `pax'.
-#
-# Substitute a variable $(am__tar) that is a command
-# writing to stdout a FORMAT-tarball containing the directory
-# $tardir.
-#     tardir=directory && $(am__tar) > result.tar
-#
-# Substitute a variable $(am__untar) that extract such
-# a tarball read from stdin.
-#     $(am__untar) < result.tar
-AC_DEFUN([_AM_PROG_TAR],
-[# Always define AMTAR for backward compatibility.
-AM_MISSING_PROG([AMTAR], [tar])
-m4_if([$1], [v7],
-     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
-     [m4_case([$1], [ustar],, [pax],,
-              [m4_fatal([Unknown tar format])])
-AC_MSG_CHECKING([how to create a $1 tar archive])
-# Loop over all known methods to create a tar archive until one works.
-_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
-_am_tools=${am_cv_prog_tar_$1-$_am_tools}
-# Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of `-'.
-for _am_tool in $_am_tools
-do
-  case $_am_tool in
-  gnutar)
-    for _am_tar in tar gnutar gtar;
-    do
-      AM_RUN_LOG([$_am_tar --version]) && break
-    done
-    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
-    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
-    am__untar="$_am_tar -xf -"
-    ;;
-  plaintar)
-    # Must skip GNU tar: if it does not support --format= it doesn't create
-    # ustar tarball either.
-    (tar --version) >/dev/null 2>&1 && continue
-    am__tar='tar chf - "$$tardir"'
-    am__tar_='tar chf - "$tardir"'
-    am__untar='tar xf -'
-    ;;
-  pax)
-    am__tar='pax -L -x $1 -w "$$tardir"'
-    am__tar_='pax -L -x $1 -w "$tardir"'
-    am__untar='pax -r'
-    ;;
-  cpio)
-    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
-    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
-    am__untar='cpio -i -H $1 -d'
-    ;;
-  none)
-    am__tar=false
-    am__tar_=false
-    am__untar=false
-    ;;
-  esac
-
-  # If the value was cached, stop now.  We just wanted to have am__tar
-  # and am__untar set.
-  test -n "${am_cv_prog_tar_$1}" && break
-
-  # tar/untar a dummy directory, and stop if the command works
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  echo GrepMe > conftest.dir/file
-  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
-  rm -rf conftest.dir
-  if test -s conftest.tar; then
-    AM_RUN_LOG([$am__untar <conftest.tar])
-    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
-  fi
-done
-rm -rf conftest.dir
-
-AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
-AC_MSG_RESULT([$am_cv_prog_tar_$1])])
-AC_SUBST([am__tar])
-AC_SUBST([am__untar])
-]) # _AM_PROG_TAR
-
-m4_include([m4/ax_cc_maxopt.m4])
-m4_include([m4/ax_cflags_warn_all.m4])
-m4_include([m4/ax_check_compiler_flags.m4])
-m4_include([m4/ax_compiler_vendor.m4])
-m4_include([m4/ax_create_pkgconfig_info.m4])
-m4_include([m4/ax_gcc_archflag.m4])
-m4_include([m4/ax_gcc_x86_cpuid.m4])
-m4_include([m4/ax_submodule.m4])
-m4_include([m4/libtool.m4])
-m4_include([m4/ltoptions.m4])
-m4_include([m4/ltsugar.m4])
-m4_include([m4/ltversion.m4])
-m4_include([m4/lt~obsolete.m4])
diff --git a/cloog-0.16.3/autoconf/Doxyfile.in b/cloog-0.16.3/autoconf/Doxyfile.in
deleted file mode 100644
index fa02ac7..0000000
--- a/cloog-0.16.3/autoconf/Doxyfile.in
+++ /dev/null
@@ -1,1101 +0,0 @@
-# Doxyfile 1.3.5
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
-#
-# All text after a hash (#) is considered a comment and will be ignored
-# The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
-# by quotes) that should identify the project.
-
-PROJECT_NAME           = CLooG
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
-# This could be handy for archiving the generated documentation or 
-# if some version control system is used.
-
-PROJECT_NUMBER         = @RELEASE@
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
-# base path where the generated documentation will be put. 
-# If a relative path is entered, it will be relative to the location 
-# where doxygen was started. If left blank the current directory will be used.
-
-OUTPUT_DIRECTORY       = doc/source
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
-# documentation generated by doxygen is written. Doxygen will use this 
-# information to generate all constant output in the proper language. 
-# The default language is English, other supported languages are: 
-# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, 
-# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en 
-# (Japanese with English messages), Korean, Norwegian, Polish, Portuguese, 
-# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
-
-OUTPUT_LANGUAGE        = English
-
-# This tag can be used to specify the encoding used in the generated output. 
-# The encoding is not always determined by the language that is chosen, 
-# but also whether or not the output is meant for Windows or non-Windows users. 
-# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES 
-# forces the Windows encoding (this is the default for the Windows binary), 
-# whereas setting the tag to NO uses a Unix-style encoding (the default for 
-# all platforms other than Windows).
-
-USE_WINDOWS_ENCODING   = NO
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
-# include brief member descriptions after the members that are listed in 
-# the file and class documentation (similar to JavaDoc). 
-# Set to NO to disable this.
-
-BRIEF_MEMBER_DESC      = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
-# the brief description of a member or function before the detailed description. 
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
-# brief descriptions will be completely suppressed.
-
-REPEAT_BRIEF           = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator 
-# that is used to form the text in various listings. Each string 
-# in this list, if found as the leading text of the brief description, will be 
-# stripped from the text and the result after processing the whole list, is used 
-# as the annotated text. Otherwise, the brief description is used as-is. If left 
-# blank, the following values are used ("$name" is automatically replaced with the 
-# name of the entity): "The $name class" "The $name widget" "The $name file" 
-# "is" "provides" "specifies" "contains" "represents" "a" "an" "the"
-
-ABBREVIATE_BRIEF       = 
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
-# Doxygen will generate a detailed section even if there is only a brief 
-# description.
-
-ALWAYS_DETAILED_SEC    = YES
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited 
-# members of a class in the documentation of that class as if those members were 
-# ordinary class members. Constructors, destructors and assignment operators of 
-# the base classes will not be shown.
-
-INLINE_INHERITED_MEMB  = YES
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
-# path before files name in the file list and in the header files. If set 
-# to NO the shortest path that makes the file name unique will be used.
-
-FULL_PATH_NAMES        = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
-# can be used to strip a user-defined part of the path. Stripping is 
-# only done if one of the specified strings matches the left-hand part of 
-# the path. It is allowed to use relative paths in the argument list.
-
-STRIP_FROM_PATH        = 
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
-# (but less readable) file names. This can be useful is your file systems 
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
-SHORT_NAMES            = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
-# will interpret the first line (until the first dot) of a JavaDoc-style 
-# comment as the brief description. If set to NO, the JavaDoc 
-# comments will behave just like the Qt-style comments (thus requiring an 
-# explicit @brief command for a brief description.
-
-JAVADOC_AUTOBRIEF      = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
-# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
-# comments) as a brief description. This used to be the default behaviour. 
-# The new default is to treat a multi-line C++ comment block as a detailed 
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
-MULTILINE_CPP_IS_BRIEF = NO
-
-# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
-# will output the detailed description near the top, like JavaDoc.
-# If set to NO, the detailed description appears after the member 
-# documentation.
-
-DETAILS_AT_TOP         = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
-# member inherits the documentation from any documented member that it 
-# re-implements.
-
-INHERIT_DOCS           = YES
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
-# tag is set to YES, then doxygen will reuse the documentation of the first 
-# member in the group (if any) for the other members of the group. By default 
-# all members of a group must be documented explicitly.
-
-DISTRIBUTE_GROUP_DOC   = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
-TAB_SIZE               = 8
-
-# This tag can be used to specify a number of aliases that acts 
-# as commands in the documentation. An alias has the form "name=value". 
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
-# put the command \sideeffect (or @sideeffect) in the documentation, which 
-# will result in a user-defined paragraph with heading "Side Effects:". 
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES                = 
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources 
-# only. Doxygen will then generate output that is more tailored for C. 
-# For instance, some of the names that are used will be different. The list 
-# of all members will be omitted, etc.
-
-OPTIMIZE_OUTPUT_FOR_C  = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources 
-# only. Doxygen will then generate output that is more tailored for Java. 
-# For instance, namespaces will be presented as packages, qualified scopes 
-# will look different, etc.
-
-OPTIMIZE_OUTPUT_JAVA   = NO
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
-# the same type (for instance a group of public functions) to be put as a 
-# subgroup of that type (e.g. under the Public Functions section). Set it to 
-# NO to prevent subgrouping. Alternatively, this can be done per class using 
-# the \nosubgrouping command.
-
-SUBGROUPING            = YES
-
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
-# documentation are documented, even if no documentation was available. 
-# Private class members and static file members will be hidden unless 
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
-EXTRACT_ALL            = YES
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
-# will be included in the documentation.
-
-EXTRACT_PRIVATE        = YES
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file 
-# will be included in the documentation.
-
-EXTRACT_STATIC         = YES
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
-# defined locally in source files will be included in the documentation. 
-# If set to NO only classes defined in header files are included.
-
-EXTRACT_LOCAL_CLASSES  = YES
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
-# undocumented members of documented classes, files or namespaces. 
-# If set to NO (the default) these members will be included in the 
-# various overviews, but no documentation section is generated. 
-# This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_MEMBERS     = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
-# undocumented classes that are normally visible in the class hierarchy. 
-# If set to NO (the default) these classes will be included in the various 
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_CLASSES     = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
-# friend (class|struct|union) declarations. 
-# If set to NO (the default) these declarations will be included in the 
-# documentation.
-
-HIDE_FRIEND_COMPOUNDS  = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
-# documentation blocks found inside the body of a function. 
-# If set to NO (the default) these blocks will be appended to the 
-# function's detailed documentation block.
-
-HIDE_IN_BODY_DOCS      = NO
-
-# The INTERNAL_DOCS tag determines if documentation 
-# that is typed after a \internal command is included. If the tag is set 
-# to NO (the default) then the documentation will be excluded. 
-# Set it to YES to include the internal documentation.
-
-INTERNAL_DOCS          = NO
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
-# file names in lower-case letters. If set to YES upper-case letters are also 
-# allowed. This is useful if you have classes or files whose names only differ 
-# in case and if your file system supports case sensitive file names. Windows 
-# users are advised to set this option to NO.
-
-CASE_SENSE_NAMES       = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
-# will show members with their full class and namespace scopes in the 
-# documentation. If set to YES the scope will be hidden.
-
-HIDE_SCOPE_NAMES       = NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
-# will put a list of the files that are included by a file in the documentation 
-# of that file.
-
-SHOW_INCLUDE_FILES     = YES
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
-# is inserted in the documentation for inline members.
-
-INLINE_INFO            = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
-# will sort the (detailed) documentation of file and class members 
-# alphabetically by member name. If set to NO the members will appear in 
-# declaration order.
-
-SORT_MEMBER_DOCS       = YES
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or 
-# disable (NO) the todo list. This list is created by putting \todo 
-# commands in the documentation.
-
-GENERATE_TODOLIST      = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or 
-# disable (NO) the test list. This list is created by putting \test 
-# commands in the documentation.
-
-GENERATE_TESTLIST      = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or 
-# disable (NO) the bug list. This list is created by putting \bug 
-# commands in the documentation.
-
-GENERATE_BUGLIST       = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
-# disable (NO) the deprecated list. This list is created by putting 
-# \deprecated commands in the documentation.
-
-GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional 
-# documentation sections, marked by \if sectionname ... \endif.
-
-ENABLED_SECTIONS       = 
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
-# the initial value of a variable or define consists of for it to appear in 
-# the documentation. If the initializer consists of more lines than specified 
-# here it will be hidden. Use a value of 0 to hide initializers completely. 
-# The appearance of the initializer of individual variables and defines in the 
-# documentation can be controlled using \showinitializer or \hideinitializer 
-# command in the documentation regardless of this setting.
-
-MAX_INITIALIZER_LINES  = 30
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
-# at the bottom of the documentation of classes and structs. If set to YES the 
-# list will mention the files that were used to generate the documentation.
-
-SHOW_USED_FILES        = YES
-
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated 
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
-QUIET                  = YES
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are 
-# generated by doxygen. Possible values are YES and NO. If left blank 
-# NO is used.
-
-WARNINGS               = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
-# automatically be disabled.
-
-WARN_IF_UNDOCUMENTED   = YES
-
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
-# potential errors in the documentation, such as not documenting some 
-# parameters in a documented function, or documenting parameters that 
-# don't exist or using markup commands wrongly.
-
-WARN_IF_DOC_ERROR      = YES
-
-# The WARN_FORMAT tag determines the format of the warning messages that 
-# doxygen can produce. The string should contain the $file, $line, and $text 
-# tags, which will be replaced by the file and line number from which the 
-# warning originated and the warning text.
-
-WARN_FORMAT            = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning 
-# and error messages should be written. If left blank the output is written 
-# to stderr.
-
-WARN_LOGFILE           =
-#WARN_LOGFILE           = doc/doxygen.log
-
-
-#---------------------------------------------------------------------------
-# configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain 
-# documented source files. You may enter file names like "myfile.cpp" or 
-# directories like "/usr/src/myproject". Separate the files or directories 
-# with spaces.
-
-INPUT                  = source \
-                         include/cloog
-
-# If the value of the INPUT tag contains directories, you can use the 
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank the following patterns are tested: 
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp 
-# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc
-
-FILE_PATTERNS          = 
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
-# should be searched for input files as well. Possible values are YES and NO. 
-# If left blank NO is used.
-
-RECURSIVE              = NO
-
-# The EXCLUDE tag can be used to specify files and/or directories that should 
-# excluded from the INPUT source files. This way you can easily exclude a 
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-
-EXCLUDE                = 
-
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories 
-# that are symbolic links (a Unix filesystem feature) are excluded from the input.
-
-EXCLUDE_SYMLINKS       = NO
-
-# If the value of the INPUT tag contains directories, you can use the 
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
-# certain files from those directories.
-
-EXCLUDE_PATTERNS       = 
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or 
-# directories that contain example code fragments that are included (see 
-# the \include command).
-
-EXAMPLE_PATH           = 
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank all files are included.
-
-EXAMPLE_PATTERNS       = 
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
-# searched for input files to be used with the \include or \dontinclude 
-# commands irrespective of the value of the RECURSIVE tag. 
-# Possible values are YES and NO. If left blank NO is used.
-
-EXAMPLE_RECURSIVE      = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or 
-# directories that contain image that are included in the documentation (see 
-# the \image command).
-
-IMAGE_PATH             = 
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should 
-# invoke to filter for each input file. Doxygen will invoke the filter program 
-# by executing (via popen()) the command <filter> <input-file>, where <filter> 
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
-# input file. Doxygen will then use the output that the filter program writes 
-# to standard output.
-
-INPUT_FILTER           = 
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
-# INPUT_FILTER) will be used to filter the input files when producing source 
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-
-FILTER_SOURCE_FILES    = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to source browsing
-#---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
-# be generated. Documented entities will be cross-referenced with these sources. 
-# Note: To get rid of all source code in the generated output, make sure also 
-# VERBATIM_HEADERS is set to NO.
-
-SOURCE_BROWSER         = NO
-
-# Setting the INLINE_SOURCES tag to YES will include the body 
-# of functions and classes directly in the documentation.
-
-INLINE_SOURCES         = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
-# doxygen to hide any special comment blocks from generated source code 
-# fragments. Normal C and C++ comments will always remain visible.
-
-STRIP_CODE_COMMENTS    = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES (the default) 
-# then for each documented function all documented 
-# functions referencing it will be listed.
-
-REFERENCED_BY_RELATION = YES
-
-# If the REFERENCES_RELATION tag is set to YES (the default) 
-# then for each documented function all documented entities 
-# called/used by that function will be listed.
-
-REFERENCES_RELATION    = YES
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
-# will generate a verbatim copy of the header file for each class for 
-# which an include is specified. Set to NO to disable this.
-
-VERBATIM_HEADERS       = YES
-
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
-# of all compounds will be generated. Enable this if the project 
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX     = NO
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
-# in which this list will be split (can be a number in the range [1..20])
-
-COLS_IN_ALPHA_INDEX    = 5
-
-# In case all classes in a project start with a common prefix, all 
-# classes will be put under the same header in the alphabetical index. 
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
-# should be ignored while generating the index headers.
-
-IGNORE_PREFIX          = 
-
-#---------------------------------------------------------------------------
-# configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
-# generate HTML output.
-
-GENERATE_HTML          = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT            = html
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
-# doxygen will generate files with .html extension.
-
-HTML_FILE_EXTENSION    = .html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard header.
-
-HTML_HEADER            = 
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard footer.
-
-HTML_FOOTER            = 
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
-# style sheet that is used by each HTML page. It can be used to 
-# fine-tune the look of the HTML output. If the tag is left blank doxygen 
-# will generate a default style sheet. Note that doxygen will try to copy 
-# the style sheet file to the HTML output directory, so don't put your own 
-# stylesheet in the HTML output directory as well, or it will be erased!
-
-HTML_STYLESHEET        = 
-
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
-# files or namespaces will be aligned in HTML using tables. If set to 
-# NO a bullet list will be used.
-
-HTML_ALIGN_MEMBERS     = YES
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
-# will be generated that can be used as input for tools like the 
-# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) 
-# of the generated HTML documentation.
-
-GENERATE_HTMLHELP      = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
-# be used to specify the file name of the resulting .chm file. You 
-# can add a path in front of the file if the result should not be 
-# written to the html output directory.
-
-CHM_FILE               = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
-# be used to specify the location (absolute path including file name) of 
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
-# the HTML help compiler on the generated index.hhp.
-
-HHC_LOCATION           = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
-# controls if a separate .chi index file is generated (YES) or that 
-# it should be included in the master .chm file (NO).
-
-GENERATE_CHI           = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
-# controls whether a binary table of contents is generated (YES) or a 
-# normal table of contents (NO) in the .chm file.
-
-BINARY_TOC             = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members 
-# to the contents of the HTML help documentation and to the tree view.
-
-TOC_EXPAND             = NO
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
-# top of each HTML page. The value NO (the default) enables the index and 
-# the value YES disables it.
-
-DISABLE_INDEX          = NO
-
-# This tag can be used to set the number of enum values (range [1..20]) 
-# that doxygen will group on one line in the generated HTML documentation.
-
-ENUM_VALUES_PER_LINE   = 4
-
-# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
-# generated containing a tree-like index structure (just like the one that 
-# is generated for HTML Help). For this to work a browser that supports 
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
-# probably better off using the HTML help feature.
-
-GENERATE_TREEVIEW      = NO
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
-# used to set the initial width (in pixels) of the frame in which the tree 
-# is shown.
-
-TREEVIEW_WIDTH         = 250
-
-#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
-# generate Latex output.
-
-GENERATE_LATEX         = YES
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `latex' will be used as the default path.
-
-LATEX_OUTPUT           = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
-# invoked. If left blank `latex' will be used as the default command name.
-
-LATEX_CMD_NAME         = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
-# generate index for LaTeX. If left blank `makeindex' will be used as the 
-# default command name.
-
-MAKEINDEX_CMD_NAME     = makeindex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
-# LaTeX documents. This may be useful for small projects and may help to 
-# save some trees in general.
-
-COMPACT_LATEX          = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used 
-# by the printer. Possible values are: a4, a4wide, letter, legal and 
-# executive. If left blank a4wide will be used.
-
-PAPER_TYPE             = a4wide
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
-# packages that should be included in the LaTeX output.
-
-EXTRA_PACKAGES         = 
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
-# the generated latex document. The header should contain everything until 
-# the first chapter. If it is left blank doxygen will generate a 
-# standard header. Notice: only use this tag if you know what you are doing!
-
-LATEX_HEADER           = 
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
-# contain links (just like the HTML output) instead of page references 
-# This makes the output suitable for online browsing using a pdf viewer.
-
-PDF_HYPERLINKS         = NO
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
-# plain latex in the generated Makefile. Set this option to YES to get a 
-# higher quality PDF documentation.
-
-USE_PDFLATEX           = NO
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
-# command to the generated LaTeX files. This will instruct LaTeX to keep 
-# running if errors occur, instead of asking the user for help. 
-# This option is also used when generating formulas in HTML.
-
-LATEX_BATCHMODE        = NO
-
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
-# include the index chapters (such as File Index, Compound Index, etc.) 
-# in the output.
-
-LATEX_HIDE_INDICES     = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the RTF output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
-# The RTF output is optimized for Word 97 and may not look very pretty with 
-# other RTF readers or editors.
-
-GENERATE_RTF           = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `rtf' will be used as the default path.
-
-RTF_OUTPUT             = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
-# RTF documents. This may be useful for small projects and may help to 
-# save some trees in general.
-
-COMPACT_RTF            = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
-# will contain hyperlink fields. The RTF file will 
-# contain links (just like the HTML output) instead of page references. 
-# This makes the output suitable for online browsing using WORD or other 
-# programs which support those fields. 
-# Note: wordpad (write) and others do not support links.
-
-RTF_HYPERLINKS         = NO
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's 
-# config file, i.e. a series of assignments. You only have to provide 
-# replacements, missing definitions are set to their default value.
-
-RTF_STYLESHEET_FILE    = 
-
-# Set optional variables used in the generation of an rtf document. 
-# Syntax is similar to doxygen's config file.
-
-RTF_EXTENSIONS_FILE    = 
-
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
-# generate man pages
-
-GENERATE_MAN           = YES
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `man' will be used as the default path.
-
-MAN_OUTPUT             = man
-
-# The MAN_EXTENSION tag determines the extension that is added to 
-# the generated man pages (default is the subroutine's section .3)
-
-MAN_EXTENSION          = .3
-
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
-# then it will generate one additional man file for each entity 
-# documented in the real man page(s). These additional files 
-# only source the real man page, but without them the man command 
-# would be unable to find the correct page. The default is NO.
-
-MAN_LINKS              = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will 
-# generate an XML file that captures the structure of 
-# the code including all documentation.
-
-GENERATE_XML           = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `xml' will be used as the default path.
-
-XML_OUTPUT             = xml
-
-# The XML_SCHEMA tag can be used to specify an XML schema, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
-
-XML_SCHEMA             = 
-
-# The XML_DTD tag can be used to specify an XML DTD, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
-
-XML_DTD                = 
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
-# dump the program listings (including syntax highlighting 
-# and cross-referencing information) to the XML output. Note that 
-# enabling this will significantly increase the size of the XML output.
-
-XML_PROGRAMLISTING     = YES
-
-#---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
-# generate an AutoGen Definitions (see autogen.sf.net) file 
-# that captures the structure of the code including all 
-# documentation. Note that this feature is still experimental 
-# and incomplete at the moment.
-
-GENERATE_AUTOGEN_DEF   = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the Perl module output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
-# generate a Perl module file that captures the structure of 
-# the code including all documentation. Note that this 
-# feature is still experimental and incomplete at the 
-# moment.
-
-GENERATE_PERLMOD       = NO
-
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
-# to generate PDF and DVI output from the Perl module output.
-
-PERLMOD_LATEX          = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
-# nicely formatted so it can be parsed by a human reader.  This is useful 
-# if you want to understand what is going on.  On the other hand, if this 
-# tag is set to NO the size of the Perl module output will be much smaller 
-# and Perl will parse it just the same.
-
-PERLMOD_PRETTY         = YES
-
-# The names of the make variables in the generated doxyrules.make file 
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
-# This is useful so different doxyrules.make files included by the same 
-# Makefile don't overwrite each other's variables.
-
-PERLMOD_MAKEVAR_PREFIX = 
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor   
-#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
-# evaluate all C-preprocessor directives found in the sources and include 
-# files.
-
-ENABLE_PREPROCESSING   = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
-# names in the source code. If set to NO (the default) only conditional 
-# compilation will be performed. Macro expansion can be done in a controlled 
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
-MACRO_EXPANSION        = NO
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
-# then the macro expansion is limited to the macros specified with the 
-# PREDEFINED and EXPAND_AS_PREDEFINED tags.
-
-EXPAND_ONLY_PREDEF     = NO
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
-
-SEARCH_INCLUDES        = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that 
-# contain include files that are not input files but should be processed by 
-# the preprocessor.
-
-INCLUDE_PATH           = 
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
-# patterns (like *.h and *.hpp) to filter out the header-files in the 
-# directories. If left blank, the patterns specified with FILE_PATTERNS will 
-# be used.
-
-INCLUDE_FILE_PATTERNS  = 
-
-# The PREDEFINED tag can be used to specify one or more macro names that 
-# are defined before the preprocessor is started (similar to the -D option of 
-# gcc). The argument of the tag is a list of macros of the form: name 
-# or name=definition (no spaces). If the definition and the = are 
-# omitted =1 is assumed.
-
-PREDEFINED             = 
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
-# this tag can be used to specify a list of macro names that should be expanded. 
-# The macro definition that is found in the sources will be used. 
-# Use the PREDEFINED tag if you want to use a different macro definition.
-
-EXPAND_AS_DEFINED      = 
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
-# doxygen's preprocessor will remove all function-like macros that are alone 
-# on a line, have an all uppercase name, and do not end with a semicolon. Such 
-# function macros are typically used for boiler-plate code, and will confuse the 
-# parser if not removed.
-
-SKIP_FUNCTION_MACROS   = YES
-
-#---------------------------------------------------------------------------
-# Configuration::addtions related to external references   
-#---------------------------------------------------------------------------
-
-# The TAGFILES option can be used to specify one or more tagfiles. 
-# Optionally an initial location of the external documentation 
-# can be added for each tagfile. The format of a tag file without 
-# this location is as follows: 
-#   TAGFILES = file1 file2 ... 
-# Adding location for the tag files is done as follows: 
-#   TAGFILES = file1=loc1 "file2 = loc2" ... 
-# where "loc1" and "loc2" can be relative or absolute paths or 
-# URLs. If a location is present for each tag, the installdox tool 
-# does not have to be run to correct the links.
-# Note that each tag file must have a unique name
-# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen 
-# is run, you must also specify the path to the tagfile here.
-
-TAGFILES               = 
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE       = 
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
-# in the class index. If set to NO only the inherited external classes 
-# will be listed.
-
-ALLEXTERNALS           = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
-# in the modules index. If set to NO, only the current project's groups will 
-# be listed.
-
-EXTERNAL_GROUPS        = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script 
-# interpreter (i.e. the result of `which perl').
-
-PERL_PATH              = /usr/bin/perl
-
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool   
-#---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or 
-# super classes. Setting the tag to NO turns the diagrams off. Note that this 
-# option is superseded by the HAVE_DOT option below. This is only a fallback. It is 
-# recommended to install and use dot, since it yields more powerful graphs.
-
-CLASS_DIAGRAMS         = YES
-
-# If set to YES, the inheritance and collaboration graphs will hide 
-# inheritance and usage relations if the target is undocumented 
-# or is not a class.
-
-HIDE_UNDOC_RELATIONS   = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
-# available from the path. This tool is part of Graphviz, a graph visualization 
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
-# have no effect if this option is set to NO (the default)
-
-HAVE_DOT               = YES
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect inheritance relations. Setting this tag to YES will force the 
-# the CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH            = YES
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect implementation dependencies (inheritance, containment, and 
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH    = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
-# collaboration diagrams in a style similar to the OMG's Unified Modeling 
-# Language.
-
-UML_LOOK               = NO
-
-# If set to YES, the inheritance and collaboration graphs will show the 
-# relations between templates and their instances.
-
-TEMPLATE_RELATIONS     = NO
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
-# tags are set to YES then doxygen will generate a graph for each documented 
-# file showing the direct and indirect include dependencies of the file with 
-# other documented files.
-
-INCLUDE_GRAPH          = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
-# documented header file showing the documented files that directly or 
-# indirectly include this file.
-
-INCLUDED_BY_GRAPH      = YES
-
-# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will 
-# generate a call dependency graph for every global function or class method. 
-# Note that enabling this option will significantly increase the time of a run. 
-# So in most cases it will be better to enable call graphs for selected 
-# functions only using the \callgraph command.
-
-CALL_GRAPH             = NO
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
-# will graphical hierarchy of all classes instead of a textual one.
-
-GRAPHICAL_HIERARCHY    = YES
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
-# generated by dot. Possible values are png, jpg, or gif
-# If left blank png will be used.
-
-DOT_IMAGE_FORMAT       = png
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be 
-# found. If left blank, it is assumed the dot tool can be found on the path.
-
-DOT_PATH               = /usr/bin/
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that 
-# contain dot files that are included in the documentation (see the 
-# \dotfile command).
-
-# DOTFILE_DIRS           = src
-
-# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width 
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
-# this value, doxygen will try to truncate the graph, so that it fits within 
-# the specified constraint. Beware that most browsers cannot cope with very 
-# large images.
-
-MAX_DOT_GRAPH_WIDTH    = 1024
-
-# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height 
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
-# this value, doxygen will try to truncate the graph, so that it fits within 
-# the specified constraint. Beware that most browsers cannot cope with very 
-# large images.
-
-MAX_DOT_GRAPH_HEIGHT   = 1024
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
-# graphs generated by dot. A depth value of 3 means that only nodes reachable 
-# from the root by following a path via at most 3 edges will be shown. Nodes that 
-# lay further from the root node will be omitted. Note that setting this option to 
-# 1 or 2 may greatly reduce the computation time needed for large code bases. Also 
-# note that a graph may be further truncated if the graph's image dimensions are 
-# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). 
-# If 0 is used for the depth value (the default), the graph is not depth-constrained.
-
-MAX_DOT_GRAPH_DEPTH    = 0
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
-# generate a legend page explaining the meaning of the various boxes and 
-# arrows in the dot generated graphs.
-
-GENERATE_LEGEND        = YES
-
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
-# remove the intermediate dot files that are used to generate 
-# the various graphs.
-
-DOT_CLEANUP            = YES
-
-#---------------------------------------------------------------------------
-# Configuration::addtions related to the search engine   
-#---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be 
-# used. If set to NO the values of all tags below this one will be ignored.
-
-SEARCHENGINE           = NO
diff --git a/cloog-0.16.3/autoconf/config.guess b/cloog-0.16.3/autoconf/config.guess
deleted file mode 100755
index 115f944..0000000
--- a/cloog-0.16.3/autoconf/config.guess
+++ /dev/null
@@ -1,1502 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-#   Free Software Foundation, Inc.
-
-timestamp='2010-04-03'
-
-# 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
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner.  Please send patches (context
-# diff format) to <config-patches@gnu.org> and include a ChangeLog
-# entry.
-#
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
-#
-# 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
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help" >&2
-       exit 1 ;;
-    * )
-       break ;;
-  esac
-done
-
-if test $# != 0; then
-  echo "$me: too many arguments$help" >&2
-  exit 1
-fi
-
-trap 'exit 1' HUP INT TERM
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
-
-set_cc_for_build='
-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" HUP INT PIPE TERM ;
-: ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
-dummy=$tmp/dummy ;
-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
-case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,)    echo "int x;" > $dummy.c ;
-	for c in cc gcc c89 c99 ; do
-	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
-	     CC_FOR_BUILD="$c"; break ;
-	  fi ;
-	done ;
-	if test x"$CC_FOR_BUILD" = x ; then
-	  CC_FOR_BUILD=no_compiler_found ;
-	fi
-	;;
- ,,*)   CC_FOR_BUILD=$CC ;;
- ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
-esac ; set_cc_for_build= ;'
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
-	PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
-    *:NetBSD:*:*)
-	# NetBSD (nbsd) targets should (where applicable) match one or
-	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
-	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
-	# switched to ELF, *-*-netbsd* would select the old
-	# object file format.  This provides both forward
-	# compatibility and a consistent mechanism for selecting the
-	# object file format.
-	#
-	# Note: NetBSD doesn't particularly care about the vendor
-	# portion of the name.  We always set it to "unknown".
-	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
-	case "${UNAME_MACHINE_ARCH}" in
-	    armeb) machine=armeb-unknown ;;
-	    arm*) machine=arm-unknown ;;
-	    sh3el) machine=shl-unknown ;;
-	    sh3eb) machine=sh-unknown ;;
-	    sh5el) machine=sh5le-unknown ;;
-	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
-	esac
-	# The Operating System including object format, if it has switched
-	# to ELF recently, or will in the future.
-	case "${UNAME_MACHINE_ARCH}" in
-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
-		eval $set_cc_for_build
-		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
-			| grep -q __ELF__
-		then
-		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
-		    # Return netbsd for either.  FIX?
-		    os=netbsd
-		else
-		    os=netbsdelf
-		fi
-		;;
-	    *)
-	        os=netbsd
-		;;
-	esac
-	# The OS release
-	# Debian GNU/NetBSD machines have a different userland, and
-	# thus, need a distinct triplet. However, they do not need
-	# kernel version information, so it can be replaced with a
-	# suitable tag, in the style of linux-gnu.
-	case "${UNAME_VERSION}" in
-	    Debian*)
-		release='-gnu'
-		;;
-	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
-		;;
-	esac
-	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
-	# contains redundant information, the shorter form:
-	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
-	exit ;;
-    *:OpenBSD:*:*)
-	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
-	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
-	exit ;;
-    *:ekkoBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
-	exit ;;
-    *:SolidBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
-	exit ;;
-    macppc:MirBSD:*:*)
-	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    *:MirBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    alpha:OSF1:*:*)
-	case $UNAME_RELEASE in
-	*4.0)
-		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
-		;;
-	*5.*)
-	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
-		;;
-	esac
-	# According to Compaq, /usr/sbin/psrinfo has been available on
-	# OSF/1 and Tru64 systems produced since 1995.  I hope that
-	# covers most systems running today.  This code pipes the CPU
-	# types through head -n 1, so we only detect the type of CPU 0.
-	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" ;;
-	    "EV4.5 (21064)")
-		UNAME_MACHINE="alpha" ;;
-	    "LCA4 (21066/21068)")
-		UNAME_MACHINE="alpha" ;;
-	    "EV5 (21164)")
-		UNAME_MACHINE="alphaev5" ;;
-	    "EV5.6 (21164A)")
-		UNAME_MACHINE="alphaev56" ;;
-	    "EV5.6 (21164PC)")
-		UNAME_MACHINE="alphapca56" ;;
-	    "EV5.7 (21164PC)")
-		UNAME_MACHINE="alphapca57" ;;
-	    "EV6 (21264)")
-		UNAME_MACHINE="alphaev6" ;;
-	    "EV6.7 (21264A)")
-		UNAME_MACHINE="alphaev67" ;;
-	    "EV6.8CB (21264C)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8AL (21264B)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8CX (21264D)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.9A (21264/EV69A)")
-		UNAME_MACHINE="alphaev69" ;;
-	    "EV7 (21364)")
-		UNAME_MACHINE="alphaev7" ;;
-	    "EV7.9 (21364A)")
-		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'`
-	exit ;;
-    Alpha\ *:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# Should we change UNAME_MACHINE based on the output of uname instead
-	# of the specific Alpha model?
-	echo alpha-pc-interix
-	exit ;;
-    21064:Windows_NT:50:3)
-	echo alpha-dec-winnt3.5
-	exit ;;
-    Amiga*:UNIX_System_V:4.0:*)
-	echo m68k-unknown-sysv4
-	exit ;;
-    *:[Aa]miga[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-amigaos
-	exit ;;
-    *:[Mm]orph[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-morphos
-	exit ;;
-    *:OS/390:*:*)
-	echo i370-ibm-openedition
-	exit ;;
-    *:z/VM:*:*)
-	echo s390-ibm-zvmoe
-	exit ;;
-    *:OS400:*:*)
-        echo powerpc-ibm-os400
-	exit ;;
-    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
-	echo arm-acorn-riscix${UNAME_RELEASE}
-	exit ;;
-    arm:riscos:*:*|arm:RISCOS:*:*)
-	echo arm-unknown-riscos
-	exit ;;
-    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
-	echo hppa1.1-hitachi-hiuxmpp
-	exit ;;
-    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
-	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
-	if test "`(/bin/universe) 2>/dev/null`" = att ; then
-		echo pyramid-pyramid-sysv3
-	else
-		echo pyramid-pyramid-bsd
-	fi
-	exit ;;
-    NILE*:*:*:dcosx)
-	echo pyramid-pyramid-svr4
-	exit ;;
-    DRS?6000:unix:4.0:6*)
-	echo sparc-icl-nx6
-	exit ;;
-    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
-	case `/usr/bin/uname -p` in
-	    sparc) echo sparc-icl-nx7; exit ;;
-	esac ;;
-    s390x:SunOS:*:*)
-	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4H:SunOS:5.*:*)
-	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
-	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
-	echo i386-pc-auroraux${UNAME_RELEASE}
-	exit ;;
-    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
-	eval $set_cc_for_build
-	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 (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
-		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		grep IS_64BIT_ARCH >/dev/null
-	    then
-		SUN_ARCH="x86_64"
-	    fi
-	fi
-	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:6*:*)
-	# According to config.sub, this is the proper way to canonicalize
-	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
-	# it's likely to be more like Solaris than SunOS4.
-	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:*:*)
-	case "`/usr/bin/arch -k`" in
-	    Series*|S4*)
-		UNAME_RELEASE=`uname -v`
-		;;
-	esac
-	# Japanese Language versions have a version number like `4.1.3-JL'.
-	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
-	exit ;;
-    sun3*:SunOS:*:*)
-	echo m68k-sun-sunos${UNAME_RELEASE}
-	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
-	case "`/bin/arch`" in
-	    sun3)
-		echo m68k-sun-sunos${UNAME_RELEASE}
-		;;
-	    sun4)
-		echo sparc-sun-sunos${UNAME_RELEASE}
-		;;
-	esac
-	exit ;;
-    aushp:SunOS:*:*)
-	echo sparc-auspex-sunos${UNAME_RELEASE}
-	exit ;;
-    # The situation for MiNT is a little confusing.  The machine name
-    # can be virtually everything (everything which is not
-    # "atarist" or "atariste" at least should have a processor
-    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
-    # to the lowercase version "mint" (or "freemint").  Finally
-    # the system name "TOS" denotes a system which is actually not
-    # MiNT.  But MiNT is downward compatible to TOS, so this should
-    # be no problem.
-    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
-	echo m68k-atari-mint${UNAME_RELEASE}
-        exit ;;
-    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-        echo m68k-milan-mint${UNAME_RELEASE}
-        exit ;;
-    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-        echo m68k-hades-mint${UNAME_RELEASE}
-        exit ;;
-    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-        echo m68k-unknown-mint${UNAME_RELEASE}
-        exit ;;
-    m68k:machten:*:*)
-	echo m68k-apple-machten${UNAME_RELEASE}
-	exit ;;
-    powerpc:machten:*:*)
-	echo powerpc-apple-machten${UNAME_RELEASE}
-	exit ;;
-    RISC*:Mach:*:*)
-	echo mips-dec-mach_bsd4.3
-	exit ;;
-    RISC*:ULTRIX:*:*)
-	echo mips-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    VAX*:ULTRIX*:*:*)
-	echo vax-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    2020:CLIX:*:* | 2430:CLIX:*:*)
-	echo clipper-intergraph-clix${UNAME_RELEASE}
-	exit ;;
-    mips:*:*:UMIPS | mips:*:*:RISCos)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-#ifdef __cplusplus
-#include <stdio.h>  /* for printf() prototype */
-	int main (int argc, char *argv[]) {
-#else
-	int main (argc, argv) int argc; char *argv[]; {
-#endif
-	#if defined (host_mips) && defined (MIPSEB)
-	#if defined (SYSTYPE_SYSV)
-	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_SVR4)
-	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
-	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
-	#endif
-	#endif
-	  exit (-1);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c &&
-	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
-	  SYSTEM_NAME=`$dummy $dummyarg` &&
-	    { echo "$SYSTEM_NAME"; exit; }
-	echo mips-mips-riscos${UNAME_RELEASE}
-	exit ;;
-    Motorola:PowerMAX_OS:*:*)
-	echo powerpc-motorola-powermax
-	exit ;;
-    Motorola:*:4.3:PL8-*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:Power_UNIX:*:*)
-	echo powerpc-harris-powerunix
-	exit ;;
-    m88k:CX/UX:7*:*)
-	echo m88k-harris-cxux7
-	exit ;;
-    m88k:*:4*:R4*)
-	echo m88k-motorola-sysv4
-	exit ;;
-    m88k:*:3*:R3*)
-	echo m88k-motorola-sysv3
-	exit ;;
-    AViiON:dgux:*:*)
-        # DG/UX returns AViiON for all architectures
-        UNAME_PROCESSOR=`/usr/bin/uname -p`
-	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
-	then
-	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
-	       [ ${TARGET_BINARY_INTERFACE}x = x ]
-	    then
-		echo m88k-dg-dgux${UNAME_RELEASE}
-	    else
-		echo m88k-dg-dguxbcs${UNAME_RELEASE}
-	    fi
-	else
-	    echo i586-dg-dgux${UNAME_RELEASE}
-	fi
- 	exit ;;
-    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
-	echo m88k-dolphin-sysv3
-	exit ;;
-    M88*:*:R3*:*)
-	# Delta 88k system running SVR3
-	echo m88k-motorola-sysv3
-	exit ;;
-    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
-	echo m88k-tektronix-sysv3
-	exit ;;
-    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
-	echo m68k-tektronix-bsd
-	exit ;;
-    *:IRIX*:*:*)
-	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
-	exit ;;
-    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
-	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
-    i*86:AIX:*:*)
-	echo i386-ibm-aix
-	exit ;;
-    ia64:AIX:*:*)
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:2:3)
-	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
-		eval $set_cc_for_build
-		sed 's/^		//' << EOF >$dummy.c
-		#include <sys/systemcfg.h>
-
-		main()
-			{
-			if (!__power_pc())
-				exit(1);
-			puts("powerpc-ibm-aix3.2.5");
-			exit(0);
-			}
-EOF
-		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
-		then
-			echo "$SYSTEM_NAME"
-		else
-			echo rs6000-ibm-aix3.2.5
-		fi
-	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
-		echo rs6000-ibm-aix3.2.4
-	else
-		echo rs6000-ibm-aix3.2
-	fi
-	exit ;;
-    *:AIX:*:[456])
-	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
-	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
-		IBM_ARCH=rs6000
-	else
-		IBM_ARCH=powerpc
-	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:*:*)
-	echo rs6000-ibm-aix
-	exit ;;
-    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
-	echo romp-ibm-bsd4.4
-	exit ;;
-    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
-	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
-	exit ;;                             # report: romp-ibm BSD 4.3
-    *:BOSX:*:*)
-	echo rs6000-bull-bosx
-	exit ;;
-    DPX/2?00:B.O.S.:*:*)
-	echo m68k-bull-sysv3
-	exit ;;
-    9000/[34]??:4.3bsd:1.*:*)
-	echo m68k-hp-bsd
-	exit ;;
-    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
-	echo m68k-hp-bsd4.4
-	exit ;;
-    9000/[34678]??:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	case "${UNAME_MACHINE}" in
-	    9000/31? )            HP_ARCH=m68000 ;;
-	    9000/[34]?? )         HP_ARCH=m68k ;;
-	    9000/[678][0-9][0-9])
-		if [ -x /usr/bin/getconf ]; then
-		    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
-                      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
-                        esac ;;
-                    esac
-		fi
-		if [ "${HP_ARCH}" = "" ]; then
-		    eval $set_cc_for_build
-		    sed 's/^              //' << EOF >$dummy.c
-
-              #define _HPUX_SOURCE
-              #include <stdlib.h>
-              #include <unistd.h>
-
-              int main ()
-              {
-              #if defined(_SC_KERNEL_BITS)
-                  long bits = sysconf(_SC_KERNEL_BITS);
-              #endif
-                  long cpu  = sysconf (_SC_CPU_VERSION);
-
-                  switch (cpu)
-              	{
-              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-              	case CPU_PA_RISC2_0:
-              #if defined(_SC_KERNEL_BITS)
-              	    switch (bits)
-              		{
-              		case 64: puts ("hppa2.0w"); break;
-              		case 32: puts ("hppa2.0n"); break;
-              		default: puts ("hppa2.0"); break;
-              		} break;
-              #else  /* !defined(_SC_KERNEL_BITS) */
-              	    puts ("hppa2.0"); break;
-              #endif
-              	default: puts ("hppa1.0"); break;
-              	}
-                  exit (0);
-              }
-EOF
-		    (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" ]
-	then
-	    eval $set_cc_for_build
-
-	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
-	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
-	    # generating 64-bit code.  GNU and HP use different nomenclature:
-	    #
-	    # $ CC_FOR_BUILD=cc ./config.guess
-	    # => hppa2.0w-hp-hpux11.23
-	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
-	    # => hppa64-hp-hpux11.23
-
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
-		grep -q __LP64__
-	    then
-		HP_ARCH="hppa2.0w"
-	    else
-		HP_ARCH="hppa64"
-	    fi
-	fi
-	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
-	exit ;;
-    ia64:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	echo ia64-hp-hpux${HPUX_REV}
-	exit ;;
-    3050*:HI-UX:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <unistd.h>
-	int
-	main ()
-	{
-	  long cpu = sysconf (_SC_CPU_VERSION);
-	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
-	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
-	     results, however.  */
-	  if (CPU_IS_PA_RISC (cpu))
-	    {
-	      switch (cpu)
-		{
-		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
-		  default: puts ("hppa-hitachi-hiuxwe2"); break;
-		}
-	    }
-	  else if (CPU_IS_HP_MC68K (cpu))
-	    puts ("m68k-hitachi-hiuxwe2");
-	  else puts ("unknown-hitachi-hiuxwe2");
-	  exit (0);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
-		{ echo "$SYSTEM_NAME"; exit; }
-	echo unknown-hitachi-hiuxwe2
-	exit ;;
-    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
-	echo hppa1.1-hp-bsd
-	exit ;;
-    9000/8??:4.3bsd:*:*)
-	echo hppa1.0-hp-bsd
-	exit ;;
-    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
-	echo hppa1.0-hp-mpeix
-	exit ;;
-    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
-	echo hppa1.1-hp-osf
-	exit ;;
-    hp8??:OSF1:*:*)
-	echo hppa1.0-hp-osf
-	exit ;;
-    i*86:OSF1:*:*)
-	if [ -x /usr/sbin/sysversion ] ; then
-	    echo ${UNAME_MACHINE}-unknown-osf1mk
-	else
-	    echo ${UNAME_MACHINE}-unknown-osf1
-	fi
-	exit ;;
-    parisc*:Lites*:*:*)
-	echo hppa1.1-hp-lites
-	exit ;;
-    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
-	echo c1-convex-bsd
-        exit ;;
-    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-        exit ;;
-    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
-	echo c34-convex-bsd
-        exit ;;
-    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
-	echo c38-convex-bsd
-        exit ;;
-    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
-	echo c4-convex-bsd
-        exit ;;
-    CRAY*Y-MP:*:*:*)
-	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*[A-Z]90:*:*:*)
-	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
-	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
-	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
-	      -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*TS:*:*:*)
-	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*T3E:*:*:*)
-	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*SV1:*:*:*)
-	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    *:UNICOS/mp:*:*)
-	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_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/ /_/'`
-        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-	exit ;;
-    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
-	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
-	exit ;;
-    sparc*:BSD/OS:*:*)
-	echo sparc-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:BSD/OS:*:*)
-	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:FreeBSD:*:*)
-	case ${UNAME_MACHINE} in
-	    pc98)
-		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    amd64)
-		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    *)
-		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	esac
-	exit ;;
-    i*:CYGWIN*:*)
-	echo ${UNAME_MACHINE}-pc-cygwin
-	exit ;;
-    *:MINGW*:*)
-	echo ${UNAME_MACHINE}-pc-mingw32
-	exit ;;
-    i*:windows32*:*)
-    	# uname -m includes "-pc" on this system.
-    	echo ${UNAME_MACHINE}-mingw32
-	exit ;;
-    i*:PW*:*)
-	echo ${UNAME_MACHINE}-pc-pw32
-	exit ;;
-    *:Interix*:*)
-    	case ${UNAME_MACHINE} in
-	    x86)
-		echo i586-pc-interix${UNAME_RELEASE}
-		exit ;;
-	    authenticamd | genuineintel | EM64T)
-		echo x86_64-unknown-interix${UNAME_RELEASE}
-		exit ;;
-	    IA64)
-		echo ia64-unknown-interix${UNAME_RELEASE}
-		exit ;;
-	esac ;;
-    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
-	echo i${UNAME_MACHINE}-pc-mks
-	exit ;;
-    8664:Windows_NT:*)
-	echo x86_64-pc-mks
-	exit ;;
-    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
-	# UNAME_MACHINE based on the output of uname instead of i386?
-	echo i586-pc-interix
-	exit ;;
-    i*:UWIN*:*)
-	echo ${UNAME_MACHINE}-pc-uwin
-	exit ;;
-    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
-	echo x86_64-unknown-cygwin
-	exit ;;
-    p*:CYGWIN*:*)
-	echo powerpcle-unknown-cygwin
-	exit ;;
-    prep*:SunOS:5.*:*)
-	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    *:GNU:*:*)
-	# the GNU system
-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-	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/[-(].*//'`-gnu
-	exit ;;
-    i*86:Minix:*:*)
-	echo ${UNAME_MACHINE}-pc-minix
-	exit ;;
-    alpha:Linux:*:*)
-	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
-	  EV5)   UNAME_MACHINE=alphaev5 ;;
-	  EV56)  UNAME_MACHINE=alphaev56 ;;
-	  PCA56) UNAME_MACHINE=alphapca56 ;;
-	  PCA57) UNAME_MACHINE=alphapca56 ;;
-	  EV6)   UNAME_MACHINE=alphaev6 ;;
-	  EV67)  UNAME_MACHINE=alphaev67 ;;
-	  EV68*) UNAME_MACHINE=alphaev68 ;;
-        esac
-	objdump --private-headers /bin/sh | grep -q ld.so.1
-	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
-	exit ;;
-    arm*:Linux:*:*)
-	eval $set_cc_for_build
-	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
-	    | grep -q __ARM_EABI__
-	then
-	    echo ${UNAME_MACHINE}-unknown-linux-gnu
-	else
-	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
-	fi
-	exit ;;
-    avr32*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    cris:Linux:*:*)
-	echo cris-axis-linux-gnu
-	exit ;;
-    crisv32:Linux:*:*)
-	echo crisv32-axis-linux-gnu
-	exit ;;
-    frv:Linux:*:*)
-    	echo frv-unknown-linux-gnu
-	exit ;;
-    i*86:Linux:*:*)
-	LIBC=gnu
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#ifdef __dietlibc__
-	LIBC=dietlibc
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
-	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
-	exit ;;
-    ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m32r*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    mips:Linux:*:* | mips64:Linux:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#undef CPU
-	#undef ${UNAME_MACHINE}
-	#undef ${UNAME_MACHINE}el
-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=${UNAME_MACHINE}el
-	#else
-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=${UNAME_MACHINE}
-	#else
-	CPU=
-	#endif
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
-	;;
-    or32:Linux:*:*)
-	echo or32-unknown-linux-gnu
-	exit ;;
-    padre:Linux:*:*)
-	echo sparc-unknown-linux-gnu
-	exit ;;
-    parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-gnu
-	exit ;;
-    parisc:Linux:*:* | hppa:Linux:*:*)
-	# Look for CPU level
-	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
-	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
-	  *)    echo hppa-unknown-linux-gnu ;;
-	esac
-	exit ;;
-    ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-gnu
-	exit ;;
-    ppc:Linux:*:*)
-	echo powerpc-unknown-linux-gnu
-	exit ;;
-    s390:Linux:*:* | s390x:Linux:*:*)
-	echo ${UNAME_MACHINE}-ibm-linux
-	exit ;;
-    sh64*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sh*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    vax:Linux:*:*)
-	echo ${UNAME_MACHINE}-dec-linux-gnu
-	exit ;;
-    x86_64:Linux:*:*)
-	echo x86_64-unknown-linux-gnu
-	exit ;;
-    xtensa*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    i*86:DYNIX/ptx:4*:*)
-	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
-	# earlier versions are messed up and put the nodename in both
-	# sysname and nodename.
-	echo i386-sequent-sysv4
-	exit ;;
-    i*86:UNIX_SV:4.2MP:2.*)
-        # Unixware is an offshoot of SVR4, but it has its own version
-        # number series starting with 2...
-        # I am not positive that other SVR4 systems won't match this,
-	# I just have to hope.  -- rms.
-        # Use sysv4.2uw... so that sysv4* matches it.
-	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
-	exit ;;
-    i*86:OS/2:*:*)
-	# If we were able to find `uname', then EMX Unix compatibility
-	# is probably installed.
-	echo ${UNAME_MACHINE}-pc-os2-emx
-	exit ;;
-    i*86:XTS-300:*:STOP)
-	echo ${UNAME_MACHINE}-unknown-stop
-	exit ;;
-    i*86:atheos:*:*)
-	echo ${UNAME_MACHINE}-unknown-atheos
-	exit ;;
-    i*86:syllable:*:*)
-	echo ${UNAME_MACHINE}-pc-syllable
-	exit ;;
-    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
-	echo i386-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    i*86:*DOS:*:*)
-	echo ${UNAME_MACHINE}-pc-msdosdjgpp
-	exit ;;
-    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
-	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
-	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
-		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
-	else
-		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
-	fi
-	exit ;;
-    i*86:*:5:[678]*)
-    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
-	case `/bin/uname -X | grep "^Machine"` in
-	    *486*)	     UNAME_MACHINE=i486 ;;
-	    *Pentium)	     UNAME_MACHINE=i586 ;;
-	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
-	esac
-	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
-	exit ;;
-    i*86:*:3.2:*)
-	if test -f /usr/options/cb.name; then
-		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
-		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
-	elif /bin/uname -X 2>/dev/null >/dev/null ; then
-		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
-		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
-		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
-			&& UNAME_MACHINE=i586
-		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
-	else
-		echo ${UNAME_MACHINE}-pc-sysv32
-	fi
-	exit ;;
-    pc:*:*:*)
-	# Left here for compatibility:
-        # 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
-	# this is a cross-build.
-	echo i586-pc-msdosdjgpp
-        exit ;;
-    Intel:Mach:3*:*)
-	echo i386-pc-mach3
-	exit ;;
-    paragon:*:*:*)
-	echo i860-intel-osf1
-	exit ;;
-    i860:*:4.*:*) # i860-SVR4
-	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
-	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
-	else # Add other i860-SVR4 vendors below as they are discovered.
-	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
-	fi
-	exit ;;
-    mini*:CTIX:SYS*5:*)
-	# "miniframe"
-	echo m68010-convergent-sysv
-	exit ;;
-    mc68k:UNIX:SYSTEM5:3.51m)
-	echo m68k-convergent-sysv
-	exit ;;
-    M680?0:D-NIX:5.3:*)
-	echo m68k-diab-dnix
-	exit ;;
-    M68*:*:R3V[5678]*:*)
-	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
-    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
-	OS_REL=''
-	test -r /etc/.relid \
-	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-          && { echo i486-ncr-sysv4; exit; } ;;
-    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
-	OS_REL='.3'
-	test -r /etc/.relid \
-	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
-	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
-	echo m68k-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    mc68030:UNIX_System_V:4.*:*)
-	echo m68k-atari-sysv4
-	exit ;;
-    TSUNAMI:LynxOS:2.*:*)
-	echo sparc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    rs6000:LynxOS:2.*:*)
-	echo rs6000-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
-	echo powerpc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    SM[BE]S:UNIX_SV:*:*)
-	echo mips-dde-sysv${UNAME_RELEASE}
-	exit ;;
-    RM*:ReliantUNIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    RM*:SINIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    *:SINIX-*:*:*)
-	if uname -p 2>/dev/null >/dev/null ; then
-		UNAME_MACHINE=`(uname -p) 2>/dev/null`
-		echo ${UNAME_MACHINE}-sni-sysv4
-	else
-		echo ns32k-sni-sysv
-	fi
-	exit ;;
-    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-                      # says <Richard.M.Bartel@ccMail.Census.GOV>
-        echo i586-unisys-sysv4
-        exit ;;
-    *:UNIX_System_V:4*:FTX*)
-	# From Gerald Hewes <hewes@openmarket.com>.
-	# How about differentiating between stratus architectures? -djm
-	echo hppa1.1-stratus-sysv4
-	exit ;;
-    *:*:*:FTX*)
-	# From seanf@swdc.stratus.com.
-	echo i860-stratus-sysv4
-	exit ;;
-    i*86:VOS:*:*)
-	# From Paul.Green@stratus.com.
-	echo ${UNAME_MACHINE}-stratus-vos
-	exit ;;
-    *:VOS:*:*)
-	# From Paul.Green@stratus.com.
-	echo hppa1.1-stratus-vos
-	exit ;;
-    mc68*:A/UX:*:*)
-	echo m68k-apple-aux${UNAME_RELEASE}
-	exit ;;
-    news*:NEWS-OS:6*:*)
-	echo mips-sony-newsos6
-	exit ;;
-    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
-	if [ -d /usr/nec ]; then
-	        echo mips-nec-sysv${UNAME_RELEASE}
-	else
-	        echo mips-unknown-sysv${UNAME_RELEASE}
-	fi
-        exit ;;
-    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
-	echo powerpc-be-beos
-	exit ;;
-    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
-	echo powerpc-apple-beos
-	exit ;;
-    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
-	echo i586-pc-beos
-	exit ;;
-    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
-	echo i586-pc-haiku
-	exit ;;
-    SX-4:SUPER-UX:*:*)
-	echo sx4-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-5:SUPER-UX:*:*)
-	echo sx5-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-6:SUPER-UX:*:*)
-	echo sx6-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-7:SUPER-UX:*:*)
-	echo sx7-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-8:SUPER-UX:*:*)
-	echo sx8-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-8R:SUPER-UX:*:*)
-	echo sx8r-nec-superux${UNAME_RELEASE}
-	exit ;;
-    Power*:Rhapsody:*:*)
-	echo powerpc-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Rhapsody:*:*)
-	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Darwin:*:*)
-	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-	case $UNAME_PROCESSOR in
-	    i386)
-		eval $set_cc_for_build
-		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) | \
-		      grep IS_64BIT_ARCH >/dev/null
-		  then
-		      UNAME_PROCESSOR="x86_64"
-		  fi
-		fi ;;
-	    unknown) UNAME_PROCESSOR=powerpc ;;
-	esac
-	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
-	exit ;;
-    *:procnto*:*:* | *:QNX:[0123456789]*:*)
-	UNAME_PROCESSOR=`uname -p`
-	if test "$UNAME_PROCESSOR" = "x86"; then
-		UNAME_PROCESSOR=i386
-		UNAME_MACHINE=pc
-	fi
-	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
-	exit ;;
-    *:QNX:*:4*)
-	echo i386-pc-qnx
-	exit ;;
-    NSE-?:NONSTOP_KERNEL:*:*)
-	echo nse-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    NSR-?:NONSTOP_KERNEL:*:*)
-	echo nsr-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    *:NonStop-UX:*:*)
-	echo mips-compaq-nonstopux
-	exit ;;
-    BS2000:POSIX*:*:*)
-	echo bs2000-siemens-sysv
-	exit ;;
-    DS/*:UNIX_System_V:*:*)
-	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
-	exit ;;
-    *:Plan9:*:*)
-	# "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
-	    UNAME_MACHINE=i386
-	else
-	    UNAME_MACHINE="$cputype"
-	fi
-	echo ${UNAME_MACHINE}-unknown-plan9
-	exit ;;
-    *:TOPS-10:*:*)
-	echo pdp10-unknown-tops10
-	exit ;;
-    *:TENEX:*:*)
-	echo pdp10-unknown-tenex
-	exit ;;
-    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
-	echo pdp10-dec-tops20
-	exit ;;
-    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
-	echo pdp10-xkl-tops20
-	exit ;;
-    *:TOPS-20:*:*)
-	echo pdp10-unknown-tops20
-	exit ;;
-    *:ITS:*:*)
-	echo pdp10-unknown-its
-	exit ;;
-    SEI:*:*:SEIUX)
-        echo mips-sei-seiux${UNAME_RELEASE}
-	exit ;;
-    *:DragonFly:*:*)
-	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
-	exit ;;
-    *:*VMS:*:*)
-    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
-	case "${UNAME_MACHINE}" in
-	    A*) echo alpha-dec-vms ; exit ;;
-	    I*) echo ia64-dec-vms ; exit ;;
-	    V*) echo vax-dec-vms ; exit ;;
-	esac ;;
-    *:XENIX:*:SysV)
-	echo i386-pc-xenix
-	exit ;;
-    i*86:skyos:*:*)
-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
-	exit ;;
-    i*86:rdos:*:*)
-	echo ${UNAME_MACHINE}-pc-rdos
-	exit ;;
-    i*86:AROS:*:*)
-	echo ${UNAME_MACHINE}-pc-aros
-	exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-          "4"
-#else
-	  ""
-#endif
-         ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
-	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    c34*)
-	echo c34-convex-bsd
-	exit ;;
-    c38*)
-	echo c38-convex-bsd
-	exit ;;
-    c4*)
-	echo c4-convex-bsd
-	exit ;;
-    esac
-fi
-
-cat >&2 <<EOF
-$0: unable to guess system type
-
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
-
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
-and
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches@gnu.org> in order to provide the needed
-information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
-
-hostinfo               = `(hostinfo) 2>/dev/null`
-/bin/universe          = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch              = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
-
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM  = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
-EOF
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/cloog-0.16.3/autoconf/config.sub b/cloog-0.16.3/autoconf/config.sub
deleted file mode 100755
index 204218c..0000000
--- a/cloog-0.16.3/autoconf/config.sub
+++ /dev/null
@@ -1,1731 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-#   Free Software Foundation, Inc.
-
-timestamp='2010-05-21'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# 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
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted GNU ChangeLog entry.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support.  The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help"
-       exit 1 ;;
-
-    *local*)
-       # First pass through any local machine types.
-       echo $1
-       exit ;;
-
-    * )
-       break ;;
-  esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
-    exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
-    exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
-  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
-  knetbsd*-gnu* | netbsd*-gnu* | \
-  kopensolaris*-gnu* | \
-  storm-chaos* | os2-emx* | rtmk-nova*)
-    os=-$maybe_os
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
-    ;;
-  *)
-    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
-    if [ $basic_machine != $1 ]
-    then os=`echo $1 | sed 's/.*-/-/'`
-    else os=; fi
-    ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work.  We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
-	-sun*os*)
-		# Prevent following clause from handling this invalid input.
-		;;
-	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis | -knuth | -cray | -microblaze)
-		os=
-		basic_machine=$1
-		;;
-        -bluegene*)
-	        os=-cnk
-		;;
-	-sim | -cisco | -oki | -wec | -winbond)
-		os=
-		basic_machine=$1
-		;;
-	-scout)
-		;;
-	-wrs)
-		os=-vxworks
-		basic_machine=$1
-		;;
-	-chorusos*)
-		os=-chorusos
-		basic_machine=$1
-		;;
- 	-chorusrdb)
- 		os=-chorusrdb
-		basic_machine=$1
- 		;;
-	-hiux*)
-		os=-hiuxwe2
-		;;
-	-sco6)
-		os=-sco5v6
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5)
-		os=-sco3.2v5
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco4)
-		os=-sco3.2v4
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2.[4-9]*)
-		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2v[4-9]*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5v6*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco*)
-		os=-sco3.2v2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-udk*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-isc)
-		os=-isc2.2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-clix*)
-		basic_machine=clipper-intergraph
-		;;
-	-isc*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-lynx*)
-		os=-lynxos
-		;;
-	-ptx*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
-		;;
-	-windowsnt*)
-		os=`echo $os | sed -e 's/windowsnt/winnt/'`
-		;;
-	-psos*)
-		os=-psos
-		;;
-	-mint | -mint[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
-	# Recognize the basic CPU types without company name.
-	# Some are omitted here because they have special meanings below.
-	1750a | 580 \
-	| a29k \
-	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
-	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
-	| am33_2.0 \
-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
-	| bfin \
-	| c4x | clipper \
-	| d10v | d30v | dlx | dsp16xx \
-	| fido | fr30 | frv \
-	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
-	| i370 | i860 | i960 | ia64 \
-	| ip2k | iq2000 \
-	| lm32 \
-	| m32c | m32r | m32rle | m68000 | m68k | m88k \
-	| maxq | mb | microblaze | mcore | mep | metag \
-	| mips | mipsbe | mipseb | mipsel | mipsle \
-	| mips16 \
-	| mips64 | mips64el \
-	| mips64octeon | mips64octeonel \
-	| mips64orion | mips64orionel \
-	| mips64r5900 | mips64r5900el \
-	| mips64vr | mips64vrel \
-	| mips64vr4100 | mips64vr4100el \
-	| mips64vr4300 | mips64vr4300el \
-	| mips64vr5000 | mips64vr5000el \
-	| mips64vr5900 | mips64vr5900el \
-	| mipsisa32 | mipsisa32el \
-	| mipsisa32r2 | mipsisa32r2el \
-	| mipsisa64 | mipsisa64el \
-	| mipsisa64r2 | mipsisa64r2el \
-	| mipsisa64sb1 | mipsisa64sb1el \
-	| mipsisa64sr71k | mipsisa64sr71kel \
-	| mipstx39 | mipstx39el \
-	| mn10200 | mn10300 \
-	| moxie \
-	| mt \
-	| msp430 \
-	| nios | nios2 \
-	| ns16k | ns32k \
-	| or32 \
-	| pdp10 | pdp11 | pj | pjl \
-	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
-	| pyramid \
-	| rx \
-	| score \
-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
-	| sh64 | sh64le \
-	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
-	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-	| spu | strongarm \
-	| tahoe | thumb | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
-	| ubicom32 \
-	| v850 | v850e \
-	| we32k \
-	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
-	| z8k | z80)
-		basic_machine=$basic_machine-unknown
-		;;
-	c54x)
-		basic_machine=tic54x-unknown
-		;;
-	c55x)
-		basic_machine=tic55x-unknown
-		;;
-	c6x)
-		basic_machine=tic6x-unknown
-		;;
-	m6811 | m68hc11 | m6812 | m68hc12 | picochip)
-		# Motorola 68HC11/12.
-		basic_machine=$basic_machine-unknown
-		os=-none
-		;;
-	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
-		;;
-	ms1)
-		basic_machine=mt-unknown
-		;;
-
-	# We use `pc' rather than `unknown'
-	# because (1) that's what they normally are, and
-	# (2) the word "unknown" tends to confuse beginning users.
-	i*86 | x86_64)
-	  basic_machine=$basic_machine-pc
-	  ;;
-	# Object if more than one company name word.
-	*-*-*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-	# Recognize the basic CPU types with company name.
-	580-* \
-	| a29k-* \
-	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
-	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
-	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
-	| avr-* | avr32-* \
-	| bfin-* | bs2000-* \
-	| c[123]* | c30-* | [cjt]90-* | c4x-* \
-	| clipper-* | craynv-* | cydra-* \
-	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
-	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
-	| h8300-* | h8500-* \
-	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
-	| i*86-* | i860-* | i960-* | ia64-* \
-	| ip2k-* | iq2000-* \
-	| lm32-* \
-	| m32c-* | m32r-* | m32rle-* \
-	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
-	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
-	| mips16-* \
-	| mips64-* | mips64el-* \
-	| mips64octeon-* | mips64octeonel-* \
-	| mips64orion-* | mips64orionel-* \
-	| mips64r5900-* | mips64r5900el-* \
-	| mips64vr-* | mips64vrel-* \
-	| mips64vr4100-* | mips64vr4100el-* \
-	| mips64vr4300-* | mips64vr4300el-* \
-	| mips64vr5000-* | mips64vr5000el-* \
-	| mips64vr5900-* | mips64vr5900el-* \
-	| mipsisa32-* | mipsisa32el-* \
-	| mipsisa32r2-* | mipsisa32r2el-* \
-	| mipsisa64-* | mipsisa64el-* \
-	| mipsisa64r2-* | mipsisa64r2el-* \
-	| mipsisa64sb1-* | mipsisa64sb1el-* \
-	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
-	| mipstx39-* | mipstx39el-* \
-	| mmix-* \
-	| mt-* \
-	| msp430-* \
-	| nios-* | nios2-* \
-	| none-* | np1-* | ns16k-* | ns32k-* \
-	| orion-* \
-	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
-	| pyramid-* \
-	| romp-* | rs6000-* | rx-* \
-	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
-	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
-	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
-	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
-	| tahoe-* | thumb-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
-	| tile-* | tilegx-* \
-	| tron-* \
-	| ubicom32-* \
-	| v850-* | v850e-* | vax-* \
-	| we32k-* \
-	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
-	| xstormy16-* | xtensa*-* \
-	| ymp-* \
-	| z8k-* | z80-*)
-		;;
-	# Recognize the basic CPU types without company name, with glob match.
-	xtensa*)
-		basic_machine=$basic_machine-unknown
-		;;
-	# Recognize the various machine names and aliases which stand
-	# for a CPU type and a company and sometimes even an OS.
-	386bsd)
-		basic_machine=i386-unknown
-		os=-bsd
-		;;
-	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
-		basic_machine=m68000-att
-		;;
-	3b*)
-		basic_machine=we32k-att
-		;;
-	a29khif)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-    	abacus)
-		basic_machine=abacus-unknown
-		;;
-	adobe68k)
-		basic_machine=m68010-adobe
-		os=-scout
-		;;
-	alliant | fx80)
-		basic_machine=fx80-alliant
-		;;
-	altos | altos3068)
-		basic_machine=m68k-altos
-		;;
-	am29k)
-		basic_machine=a29k-none
-		os=-bsd
-		;;
-	amd64)
-		basic_machine=x86_64-pc
-		;;
-	amd64-*)
-		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	amdahl)
-		basic_machine=580-amdahl
-		os=-sysv
-		;;
-	amiga | amiga-*)
-		basic_machine=m68k-unknown
-		;;
-	amigaos | amigados)
-		basic_machine=m68k-unknown
-		os=-amigaos
-		;;
-	amigaunix | amix)
-		basic_machine=m68k-unknown
-		os=-sysv4
-		;;
-	apollo68)
-		basic_machine=m68k-apollo
-		os=-sysv
-		;;
-	apollo68bsd)
-		basic_machine=m68k-apollo
-		os=-bsd
-		;;
-	aros)
-		basic_machine=i386-pc
-		os=-aros
-		;;
-	aux)
-		basic_machine=m68k-apple
-		os=-aux
-		;;
-	balance)
-		basic_machine=ns32k-sequent
-		os=-dynix
-		;;
-	blackfin)
-		basic_machine=bfin-unknown
-		os=-linux
-		;;
-	blackfin-*)
-		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	bluegene*)
-		basic_machine=powerpc-ibm
-		os=-cnk
-		;;
-	c54x-*)
-		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c55x-*)
-		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c6x-*)
-		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c90)
-		basic_machine=c90-cray
-		os=-unicos
-		;;
-        cegcc)
-		basic_machine=arm-unknown
-		os=-cegcc
-		;;
-	convex-c1)
-		basic_machine=c1-convex
-		os=-bsd
-		;;
-	convex-c2)
-		basic_machine=c2-convex
-		os=-bsd
-		;;
-	convex-c32)
-		basic_machine=c32-convex
-		os=-bsd
-		;;
-	convex-c34)
-		basic_machine=c34-convex
-		os=-bsd
-		;;
-	convex-c38)
-		basic_machine=c38-convex
-		os=-bsd
-		;;
-	cray | j90)
-		basic_machine=j90-cray
-		os=-unicos
-		;;
-	craynv)
-		basic_machine=craynv-cray
-		os=-unicosmp
-		;;
-	cr16)
-		basic_machine=cr16-unknown
-		os=-elf
-		;;
-	crds | unos)
-		basic_machine=m68k-crds
-		;;
-	crisv32 | crisv32-* | etraxfs*)
-		basic_machine=crisv32-axis
-		;;
-	cris | cris-* | etrax*)
-		basic_machine=cris-axis
-		;;
-	crx)
-		basic_machine=crx-unknown
-		os=-elf
-		;;
-	da30 | da30-*)
-		basic_machine=m68k-da30
-		;;
-	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
-		basic_machine=mips-dec
-		;;
-	decsystem10* | dec10*)
-		basic_machine=pdp10-dec
-		os=-tops10
-		;;
-	decsystem20* | dec20*)
-		basic_machine=pdp10-dec
-		os=-tops20
-		;;
-	delta | 3300 | motorola-3300 | motorola-delta \
-	      | 3300-motorola | delta-motorola)
-		basic_machine=m68k-motorola
-		;;
-	delta88)
-		basic_machine=m88k-motorola
-		os=-sysv3
-		;;
-	dicos)
-		basic_machine=i686-pc
-		os=-dicos
-		;;
-	djgpp)
-		basic_machine=i586-pc
-		os=-msdosdjgpp
-		;;
-	dpx20 | dpx20-*)
-		basic_machine=rs6000-bull
-		os=-bosx
-		;;
-	dpx2* | dpx2*-bull)
-		basic_machine=m68k-bull
-		os=-sysv3
-		;;
-	ebmon29k)
-		basic_machine=a29k-amd
-		os=-ebmon
-		;;
-	elxsi)
-		basic_machine=elxsi-elxsi
-		os=-bsd
-		;;
-	encore | umax | mmax)
-		basic_machine=ns32k-encore
-		;;
-	es1800 | OSE68k | ose68k | ose | OSE)
-		basic_machine=m68k-ericsson
-		os=-ose
-		;;
-	fx2800)
-		basic_machine=i860-alliant
-		;;
-	genix)
-		basic_machine=ns32k-ns
-		;;
-	gmicro)
-		basic_machine=tron-gmicro
-		os=-sysv
-		;;
-	go32)
-		basic_machine=i386-pc
-		os=-go32
-		;;
-	h3050r* | hiux*)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	h8300hms)
-		basic_machine=h8300-hitachi
-		os=-hms
-		;;
-	h8300xray)
-		basic_machine=h8300-hitachi
-		os=-xray
-		;;
-	h8500hms)
-		basic_machine=h8500-hitachi
-		os=-hms
-		;;
-	harris)
-		basic_machine=m88k-harris
-		os=-sysv3
-		;;
-	hp300-*)
-		basic_machine=m68k-hp
-		;;
-	hp300bsd)
-		basic_machine=m68k-hp
-		os=-bsd
-		;;
-	hp300hpux)
-		basic_machine=m68k-hp
-		os=-hpux
-		;;
-	hp3k9[0-9][0-9] | hp9[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k2[0-9][0-9] | hp9k31[0-9])
-		basic_machine=m68000-hp
-		;;
-	hp9k3[2-9][0-9])
-		basic_machine=m68k-hp
-		;;
-	hp9k6[0-9][0-9] | hp6[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k7[0-79][0-9] | hp7[0-79][0-9])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k78[0-9] | hp78[0-9])
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][13679] | hp8[0-9][13679])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][0-9] | hp8[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hppa-next)
-		os=-nextstep3
-		;;
-	hppaosf)
-		basic_machine=hppa1.1-hp
-		os=-osf
-		;;
-	hppro)
-		basic_machine=hppa1.1-hp
-		os=-proelf
-		;;
-	i370-ibm* | ibm*)
-		basic_machine=i370-ibm
-		;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
-	i*86v32)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv32
-		;;
-	i*86v4*)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv4
-		;;
-	i*86v)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv
-		;;
-	i*86sol2)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-solaris2
-		;;
-	i386mach)
-		basic_machine=i386-mach
-		os=-mach
-		;;
-	i386-vsta | vsta)
-		basic_machine=i386-unknown
-		os=-vsta
-		;;
-	iris | iris4d)
-		basic_machine=mips-sgi
-		case $os in
-		    -irix*)
-			;;
-		    *)
-			os=-irix4
-			;;
-		esac
-		;;
-	isi68 | isi)
-		basic_machine=m68k-isi
-		os=-sysv
-		;;
-	m68knommu)
-		basic_machine=m68k-unknown
-		os=-linux
-		;;
-	m68knommu-*)
-		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	m88k-omron*)
-		basic_machine=m88k-omron
-		;;
-	magnum | m3230)
-		basic_machine=mips-mips
-		os=-sysv
-		;;
-	merlin)
-		basic_machine=ns32k-utek
-		os=-sysv
-		;;
-        microblaze)
-		basic_machine=microblaze-xilinx
-		;;
-	mingw32)
-		basic_machine=i386-pc
-		os=-mingw32
-		;;
-	mingw32ce)
-		basic_machine=arm-unknown
-		os=-mingw32ce
-		;;
-	miniframe)
-		basic_machine=m68000-convergent
-		;;
-	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-	mips3*-*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
-		;;
-	mips3*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
-		;;
-	monitor)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	morphos)
-		basic_machine=powerpc-unknown
-		os=-morphos
-		;;
-	msdos)
-		basic_machine=i386-pc
-		os=-msdos
-		;;
-	ms1-*)
-		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
-		;;
-	mvs)
-		basic_machine=i370-ibm
-		os=-mvs
-		;;
-	ncr3000)
-		basic_machine=i486-ncr
-		os=-sysv4
-		;;
-	netbsd386)
-		basic_machine=i386-unknown
-		os=-netbsd
-		;;
-	netwinder)
-		basic_machine=armv4l-rebel
-		os=-linux
-		;;
-	news | news700 | news800 | news900)
-		basic_machine=m68k-sony
-		os=-newsos
-		;;
-	news1000)
-		basic_machine=m68030-sony
-		os=-newsos
-		;;
-	news-3600 | risc-news)
-		basic_machine=mips-sony
-		os=-newsos
-		;;
-	necv70)
-		basic_machine=v70-nec
-		os=-sysv
-		;;
-	next | m*-next )
-		basic_machine=m68k-next
-		case $os in
-		    -nextstep* )
-			;;
-		    -ns2*)
-		      os=-nextstep2
-			;;
-		    *)
-		      os=-nextstep3
-			;;
-		esac
-		;;
-	nh3000)
-		basic_machine=m68k-harris
-		os=-cxux
-		;;
-	nh[45]000)
-		basic_machine=m88k-harris
-		os=-cxux
-		;;
-	nindy960)
-		basic_machine=i960-intel
-		os=-nindy
-		;;
-	mon960)
-		basic_machine=i960-intel
-		os=-mon960
-		;;
-	nonstopux)
-		basic_machine=mips-compaq
-		os=-nonstopux
-		;;
-	np1)
-		basic_machine=np1-gould
-		;;
-	nsr-tandem)
-		basic_machine=nsr-tandem
-		;;
-	op50n-* | op60c-*)
-		basic_machine=hppa1.1-oki
-		os=-proelf
-		;;
-	openrisc | openrisc-*)
-		basic_machine=or32-unknown
-		;;
-	os400)
-		basic_machine=powerpc-ibm
-		os=-os400
-		;;
-	OSE68000 | ose68000)
-		basic_machine=m68000-ericsson
-		os=-ose
-		;;
-	os68k)
-		basic_machine=m68k-none
-		os=-os68k
-		;;
-	pa-hitachi)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	paragon)
-		basic_machine=i860-intel
-		os=-osf
-		;;
-	parisc)
-		basic_machine=hppa-unknown
-		os=-linux
-		;;
-	parisc-*)
-		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	pbd)
-		basic_machine=sparc-tti
-		;;
-	pbb)
-		basic_machine=m68k-tti
-		;;
-	pc532 | pc532-*)
-		basic_machine=ns32k-pc532
-		;;
-	pc98)
-		basic_machine=i386-pc
-		;;
-	pc98-*)
-		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium | p5 | k5 | k6 | nexgen | viac3)
-		basic_machine=i586-pc
-		;;
-	pentiumpro | p6 | 6x86 | athlon | athlon_*)
-		basic_machine=i686-pc
-		;;
-	pentiumii | pentium2 | pentiumiii | pentium3)
-		basic_machine=i686-pc
-		;;
-	pentium4)
-		basic_machine=i786-pc
-		;;
-	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
-		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumpro-* | p6-* | 6x86-* | athlon-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium4-*)
-		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pn)
-		basic_machine=pn-gould
-		;;
-	power)	basic_machine=power-ibm
-		;;
-	ppc)	basic_machine=powerpc-unknown
-		;;
-	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppcle | powerpclittle | ppc-le | powerpc-little)
-		basic_machine=powerpcle-unknown
-		;;
-	ppcle-* | powerpclittle-*)
-		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64)	basic_machine=powerpc64-unknown
-		;;
-	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
-		basic_machine=powerpc64le-unknown
-		;;
-	ppc64le-* | powerpc64little-*)
-		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ps2)
-		basic_machine=i386-ibm
-		;;
-	pw32)
-		basic_machine=i586-unknown
-		os=-pw32
-		;;
-	rdos)
-		basic_machine=i386-pc
-		os=-rdos
-		;;
-	rom68k)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	rm[46]00)
-		basic_machine=mips-siemens
-		;;
-	rtpc | rtpc-*)
-		basic_machine=romp-ibm
-		;;
-	s390 | s390-*)
-		basic_machine=s390-ibm
-		;;
-	s390x | s390x-*)
-		basic_machine=s390x-ibm
-		;;
-	sa29200)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	sb1)
-		basic_machine=mipsisa64sb1-unknown
-		;;
-	sb1el)
-		basic_machine=mipsisa64sb1el-unknown
-		;;
-	sde)
-		basic_machine=mipsisa32-sde
-		os=-elf
-		;;
-	sei)
-		basic_machine=mips-sei
-		os=-seiux
-		;;
-	sequent)
-		basic_machine=i386-sequent
-		;;
-	sh)
-		basic_machine=sh-hitachi
-		os=-hms
-		;;
-	sh5el)
-		basic_machine=sh5le-unknown
-		;;
-	sh64)
-		basic_machine=sh64-unknown
-		;;
-	sparclite-wrs | simso-wrs)
-		basic_machine=sparclite-wrs
-		os=-vxworks
-		;;
-	sps7)
-		basic_machine=m68k-bull
-		os=-sysv2
-		;;
-	spur)
-		basic_machine=spur-unknown
-		;;
-	st2000)
-		basic_machine=m68k-tandem
-		;;
-	stratus)
-		basic_machine=i860-stratus
-		os=-sysv4
-		;;
-	sun2)
-		basic_machine=m68000-sun
-		;;
-	sun2os3)
-		basic_machine=m68000-sun
-		os=-sunos3
-		;;
-	sun2os4)
-		basic_machine=m68000-sun
-		os=-sunos4
-		;;
-	sun3os3)
-		basic_machine=m68k-sun
-		os=-sunos3
-		;;
-	sun3os4)
-		basic_machine=m68k-sun
-		os=-sunos4
-		;;
-	sun4os3)
-		basic_machine=sparc-sun
-		os=-sunos3
-		;;
-	sun4os4)
-		basic_machine=sparc-sun
-		os=-sunos4
-		;;
-	sun4sol2)
-		basic_machine=sparc-sun
-		os=-solaris2
-		;;
-	sun3 | sun3-*)
-		basic_machine=m68k-sun
-		;;
-	sun4)
-		basic_machine=sparc-sun
-		;;
-	sun386 | sun386i | roadrunner)
-		basic_machine=i386-sun
-		;;
-	sv1)
-		basic_machine=sv1-cray
-		os=-unicos
-		;;
-	symmetry)
-		basic_machine=i386-sequent
-		os=-dynix
-		;;
-	t3e)
-		basic_machine=alphaev5-cray
-		os=-unicos
-		;;
-	t90)
-		basic_machine=t90-cray
-		os=-unicos
-		;;
-        # This must be matched before tile*.
-        tilegx*)
-		basic_machine=tilegx-unknown
-		os=-linux-gnu
-		;;
-	tile*)
-		basic_machine=tile-unknown
-		os=-linux-gnu
-		;;
-	tx39)
-		basic_machine=mipstx39-unknown
-		;;
-	tx39el)
-		basic_machine=mipstx39el-unknown
-		;;
-	toad1)
-		basic_machine=pdp10-xkl
-		os=-tops20
-		;;
-	tower | tower-32)
-		basic_machine=m68k-ncr
-		;;
-	tpf)
-		basic_machine=s390x-ibm
-		os=-tpf
-		;;
-	udi29k)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	ultra3)
-		basic_machine=a29k-nyu
-		os=-sym1
-		;;
-	v810 | necv810)
-		basic_machine=v810-nec
-		os=-none
-		;;
-	vaxv)
-		basic_machine=vax-dec
-		os=-sysv
-		;;
-	vms)
-		basic_machine=vax-dec
-		os=-vms
-		;;
-	vpp*|vx|vx-*)
-		basic_machine=f301-fujitsu
-		;;
-	vxworks960)
-		basic_machine=i960-wrs
-		os=-vxworks
-		;;
-	vxworks68)
-		basic_machine=m68k-wrs
-		os=-vxworks
-		;;
-	vxworks29k)
-		basic_machine=a29k-wrs
-		os=-vxworks
-		;;
-	w65*)
-		basic_machine=w65-wdc
-		os=-none
-		;;
-	w89k-*)
-		basic_machine=hppa1.1-winbond
-		os=-proelf
-		;;
-	xbox)
-		basic_machine=i686-pc
-		os=-mingw32
-		;;
-	xps | xps100)
-		basic_machine=xps100-honeywell
-		;;
-	ymp)
-		basic_machine=ymp-cray
-		os=-unicos
-		;;
-	z8k-*-coff)
-		basic_machine=z8k-unknown
-		os=-sim
-		;;
-	z80-*-coff)
-		basic_machine=z80-unknown
-		os=-sim
-		;;
-	none)
-		basic_machine=none-none
-		os=-none
-		;;
-
-# Here we handle the default manufacturer of certain CPU types.  It is in
-# some cases the only manufacturer, in others, it is the most popular.
-	w89k)
-		basic_machine=hppa1.1-winbond
-		;;
-	op50n)
-		basic_machine=hppa1.1-oki
-		;;
-	op60c)
-		basic_machine=hppa1.1-oki
-		;;
-	romp)
-		basic_machine=romp-ibm
-		;;
-	mmix)
-		basic_machine=mmix-knuth
-		;;
-	rs6000)
-		basic_machine=rs6000-ibm
-		;;
-	vax)
-		basic_machine=vax-dec
-		;;
-	pdp10)
-		# there are many clones, so DEC is not a safe bet
-		basic_machine=pdp10-unknown
-		;;
-	pdp11)
-		basic_machine=pdp11-dec
-		;;
-	we32k)
-		basic_machine=we32k-att
-		;;
-	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
-		basic_machine=sh-unknown
-		;;
-	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
-		basic_machine=sparc-sun
-		;;
-	cydra)
-		basic_machine=cydra-cydrome
-		;;
-	orion)
-		basic_machine=orion-highlevel
-		;;
-	orion105)
-		basic_machine=clipper-highlevel
-		;;
-	mac | mpw | mac-mpw)
-		basic_machine=m68k-apple
-		;;
-	pmac | pmac-mpw)
-		basic_machine=powerpc-apple
-		;;
-	*-unknown)
-		# Make sure to match an already-canonicalized machine name.
-		;;
-	*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
-	*-digital*)
-		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
-		;;
-	*-commodore*)
-		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
-		;;
-	*)
-		;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
-        # First match some system type aliases
-        # that might get confused with valid system types.
-	# -solaris* is a basic system type, with this one exception.
-        -auroraux)
-	        os=-auroraux
-		;;
-	-solaris1 | -solaris1.*)
-		os=`echo $os | sed -e 's|solaris1|sunos4|'`
-		;;
-	-solaris)
-		os=-solaris2
-		;;
-	-svr4*)
-		os=-sysv4
-		;;
-	-unixware*)
-		os=-sysv4.2uw
-		;;
-	-gnu/linux*)
-		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
-		;;
-	# First accept the basic system types.
-	# The portable systems comes first.
-	# Each alternative MUST END IN A *, to match a version number.
-	# -sysv* is not here because it comes later, after sysvr4.
-	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
-	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
-	      | -sym* | -kopensolaris* \
-	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* | -aros* \
-	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
-	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
-	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -openbsd* | -solidbsd* \
-	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
-	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
-	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
-	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-	      | -chorusos* | -chorusrdb* | -cegcc* \
-	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -linux-android* \
-	      | -linux-newlib* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
-	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
-	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
-	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
-	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
-	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
-	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
-	# Remember, each alternative MUST END IN *, to match a version number.
-		;;
-	-qnx*)
-		case $basic_machine in
-		    x86-* | i*86-*)
-			;;
-		    *)
-			os=-nto$os
-			;;
-		esac
-		;;
-	-nto-qnx*)
-		;;
-	-nto*)
-		os=`echo $os | sed -e 's|nto|nto-qnx|'`
-		;;
-	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
-	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
-	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
-		;;
-	-mac*)
-		os=`echo $os | sed -e 's|mac|macos|'`
-		;;
-	-linux-dietlibc)
-		os=-linux-dietlibc
-		;;
-	-linux*)
-		os=`echo $os | sed -e 's|linux|linux-gnu|'`
-		;;
-	-sunos5*)
-		os=`echo $os | sed -e 's|sunos5|solaris2|'`
-		;;
-	-sunos6*)
-		os=`echo $os | sed -e 's|sunos6|solaris3|'`
-		;;
-	-opened*)
-		os=-openedition
-		;;
-        -os400*)
-		os=-os400
-		;;
-	-wince*)
-		os=-wince
-		;;
-	-osfrose*)
-		os=-osfrose
-		;;
-	-osf*)
-		os=-osf
-		;;
-	-utek*)
-		os=-bsd
-		;;
-	-dynix*)
-		os=-bsd
-		;;
-	-acis*)
-		os=-aos
-		;;
-	-atheos*)
-		os=-atheos
-		;;
-	-syllable*)
-		os=-syllable
-		;;
-	-386bsd)
-		os=-bsd
-		;;
-	-ctix* | -uts*)
-		os=-sysv
-		;;
-	-nova*)
-		os=-rtmk-nova
-		;;
-	-ns2 )
-		os=-nextstep2
-		;;
-	-nsk*)
-		os=-nsk
-		;;
-	# Preserve the version number of sinix5.
-	-sinix5.*)
-		os=`echo $os | sed -e 's|sinix|sysv|'`
-		;;
-	-sinix*)
-		os=-sysv4
-		;;
-        -tpf*)
-		os=-tpf
-		;;
-	-triton*)
-		os=-sysv3
-		;;
-	-oss*)
-		os=-sysv3
-		;;
-	-svr4)
-		os=-sysv4
-		;;
-	-svr3)
-		os=-sysv3
-		;;
-	-sysvr4)
-		os=-sysv4
-		;;
-	# This must come after -sysvr4.
-	-sysv*)
-		;;
-	-ose*)
-		os=-ose
-		;;
-	-es1800*)
-		os=-ose
-		;;
-	-xenix)
-		os=-xenix
-		;;
-	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-		os=-mint
-		;;
-	-aros*)
-		os=-aros
-		;;
-	-kaos*)
-		os=-kaos
-		;;
-	-zvmoe)
-		os=-zvmoe
-		;;
-	-dicos*)
-		os=-dicos
-		;;
-        -nacl*)
-	        ;;
-	-none)
-		;;
-	*)
-		# Get rid of the `-' at the beginning of $os.
-		os=`echo $os | sed 's/[^-]*-//'`
-		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
-		exit 1
-		;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system.  Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
-        score-*)
-		os=-elf
-		;;
-        spu-*)
-		os=-elf
-		;;
-	*-acorn)
-		os=-riscix1.2
-		;;
-	arm*-rebel)
-		os=-linux
-		;;
-	arm*-semi)
-		os=-aout
-		;;
-        c4x-* | tic4x-*)
-        	os=-coff
-		;;
-	tic54x-*)
-		os=-coff
-		;;
-	tic55x-*)
-		os=-coff
-		;;
-	tic6x-*)
-		os=-coff
-		;;
-	# This must come before the *-dec entry.
-	pdp10-*)
-		os=-tops20
-		;;
-	pdp11-*)
-		os=-none
-		;;
-	*-dec | vax-*)
-		os=-ultrix4.2
-		;;
-	m68*-apollo)
-		os=-domain
-		;;
-	i386-sun)
-		os=-sunos4.0.2
-		;;
-	m68000-sun)
-		os=-sunos3
-		# This also exists in the configure program, but was not the
-		# default.
-		# os=-sunos4
-		;;
-	m68*-cisco)
-		os=-aout
-		;;
-        mep-*)
-		os=-elf
-		;;
-	mips*-cisco)
-		os=-elf
-		;;
-	mips*-*)
-		os=-elf
-		;;
-	or32-*)
-		os=-coff
-		;;
-	*-tti)	# must be before sparc entry or we get the wrong os.
-		os=-sysv3
-		;;
-	sparc-* | *-sun)
-		os=-sunos4.1.1
-		;;
-	*-be)
-		os=-beos
-		;;
-	*-haiku)
-		os=-haiku
-		;;
-	*-ibm)
-		os=-aix
-		;;
-    	*-knuth)
-		os=-mmixware
-		;;
-	*-wec)
-		os=-proelf
-		;;
-	*-winbond)
-		os=-proelf
-		;;
-	*-oki)
-		os=-proelf
-		;;
-	*-hp)
-		os=-hpux
-		;;
-	*-hitachi)
-		os=-hiux
-		;;
-	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
-		os=-sysv
-		;;
-	*-cbm)
-		os=-amigaos
-		;;
-	*-dg)
-		os=-dgux
-		;;
-	*-dolphin)
-		os=-sysv3
-		;;
-	m68k-ccur)
-		os=-rtu
-		;;
-	m88k-omron*)
-		os=-luna
-		;;
-	*-next )
-		os=-nextstep
-		;;
-	*-sequent)
-		os=-ptx
-		;;
-	*-crds)
-		os=-unos
-		;;
-	*-ns)
-		os=-genix
-		;;
-	i370-*)
-		os=-mvs
-		;;
-	*-next)
-		os=-nextstep3
-		;;
-	*-gould)
-		os=-sysv
-		;;
-	*-highlevel)
-		os=-bsd
-		;;
-	*-encore)
-		os=-bsd
-		;;
-	*-sgi)
-		os=-irix
-		;;
-	*-siemens)
-		os=-sysv4
-		;;
-	*-masscomp)
-		os=-rtu
-		;;
-	f30[01]-fujitsu | f700-fujitsu)
-		os=-uxpv
-		;;
-	*-rom68k)
-		os=-coff
-		;;
-	*-*bug)
-		os=-coff
-		;;
-	*-apple)
-		os=-macos
-		;;
-	*-atari*)
-		os=-mint
-		;;
-	*)
-		os=-none
-		;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer.  We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
-	*-unknown)
-		case $os in
-			-riscix*)
-				vendor=acorn
-				;;
-			-sunos*)
-				vendor=sun
-				;;
-			-cnk*|-aix*)
-				vendor=ibm
-				;;
-			-beos*)
-				vendor=be
-				;;
-			-hpux*)
-				vendor=hp
-				;;
-			-mpeix*)
-				vendor=hp
-				;;
-			-hiux*)
-				vendor=hitachi
-				;;
-			-unos*)
-				vendor=crds
-				;;
-			-dgux*)
-				vendor=dg
-				;;
-			-luna*)
-				vendor=omron
-				;;
-			-genix*)
-				vendor=ns
-				;;
-			-mvs* | -opened*)
-				vendor=ibm
-				;;
-			-os400*)
-				vendor=ibm
-				;;
-			-ptx*)
-				vendor=sequent
-				;;
-			-tpf*)
-				vendor=ibm
-				;;
-			-vxsim* | -vxworks* | -windiss*)
-				vendor=wrs
-				;;
-			-aux*)
-				vendor=apple
-				;;
-			-hms*)
-				vendor=hitachi
-				;;
-			-mpw* | -macos*)
-				vendor=apple
-				;;
-			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-				vendor=atari
-				;;
-			-vos*)
-				vendor=stratus
-				;;
-		esac
-		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
-		;;
-esac
-
-echo $basic_machine$os
-exit
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/cloog-0.16.3/autoconf/depcomp b/cloog-0.16.3/autoconf/depcomp
deleted file mode 100755
index e5f9736..0000000
--- a/cloog-0.16.3/autoconf/depcomp
+++ /dev/null
@@ -1,589 +0,0 @@
-#! /bin/sh
-# depcomp - compile a program generating dependencies as side-effects
-
-scriptversion=2007-03-29.01
-
-# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 Free Software
-# Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301, USA.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
-
-case $1 in
-  '')
-     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
-     exit 1;
-     ;;
-  -h | --h*)
-    cat <<\EOF
-Usage: depcomp [--help] [--version] PROGRAM [ARGS]
-
-Run PROGRAMS ARGS to compile a file, generating dependencies
-as side-effects.
-
-Environment variables:
-  depmode     Dependency tracking mode.
-  source      Source file read by `PROGRAMS ARGS'.
-  object      Object file output by `PROGRAMS ARGS'.
-  DEPDIR      directory where to store dependencies.
-  depfile     Dependency file to output.
-  tmpdepfile  Temporary file to use when outputing dependencies.
-  libtool     Whether libtool is used (yes/no).
-
-Report bugs to <bug-automake@gnu.org>.
-EOF
-    exit $?
-    ;;
-  -v | --v*)
-    echo "depcomp $scriptversion"
-    exit $?
-    ;;
-esac
-
-if test -z "$depmode" || test -z "$source" || test -z "$object"; then
-  echo "depcomp: Variables source, object and depmode must be set" 1>&2
-  exit 1
-fi
-
-# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
-depfile=${depfile-`echo "$object" |
-  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
-tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
-
-rm -f "$tmpdepfile"
-
-# Some modes work just like other modes, but use different flags.  We
-# parameterize here, but still list the modes in the big case below,
-# to make depend.m4 easier to write.  Note that we *cannot* use a case
-# here, because this file can only contain one case statement.
-if test "$depmode" = hp; then
-  # HP compiler uses -M and no extra arg.
-  gccflag=-M
-  depmode=gcc
-fi
-
-if test "$depmode" = dashXmstdout; then
-   # This is just like dashmstdout with a different argument.
-   dashmflag=-xM
-   depmode=dashmstdout
-fi
-
-case "$depmode" in
-gcc3)
-## gcc 3 implements dependency tracking that does exactly what
-## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
-## it if -MD -MP comes after the -MF stuff.  Hmm.
-## Unfortunately, FreeBSD c89 acceptance of flags depends upon
-## the command line argument order; so add the flags where they
-## appear in depend2.am.  Note that the slowdown incurred here
-## affects only configure: in makefiles, %FASTDEP% shortcuts this.
-  for arg
-  do
-    case $arg in
-    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
-    *)  set fnord "$@" "$arg" ;;
-    esac
-    shift # fnord
-    shift # $arg
-  done
-  "$@"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  mv "$tmpdepfile" "$depfile"
-  ;;
-
-gcc)
-## There are various ways to get dependency output from gcc.  Here's
-## why we pick this rather obscure method:
-## - Don't want to use -MD because we'd like the dependencies to end
-##   up in a subdir.  Having to rename by hand is ugly.
-##   (We might end up doing this anyway to support other compilers.)
-## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
-##   -MM, not -M (despite what the docs say).
-## - Using -M directly means running the compiler twice (even worse
-##   than renaming).
-  if test -z "$gccflag"; then
-    gccflag=-MD,
-  fi
-  "$@" -Wp,"$gccflag$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
-## The second -e expression handles DOS-style file names with drive letters.
-  sed -e 's/^[^:]*: / /' \
-      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the `deleted header file' problem.
-## The problem is that when a header file which appears in a .P file
-## is deleted, the dependency causes make to die (because there is
-## typically no way to rebuild the header).  We avoid this by adding
-## dummy dependencies for each header file.  Too bad gcc doesn't do
-## this for us directly.
-  tr ' ' '
-' < "$tmpdepfile" |
-## Some versions of gcc put a space before the `:'.  On the theory
-## that the space means something, we add a space to the output as
-## well.
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-hp)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-sgi)
-  if test "$libtool" = yes; then
-    "$@" "-Wp,-MDupdate,$tmpdepfile"
-  else
-    "$@" -MDupdate "$tmpdepfile"
-  fi
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-
-  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
-    echo "$object : \\" > "$depfile"
-
-    # Clip off the initial element (the dependent).  Don't try to be
-    # clever and replace this with sed code, as IRIX sed won't handle
-    # lines with more than a fixed number of characters (4096 in
-    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
-    # the IRIX cc adds comments like `#:fec' to the end of the
-    # dependency line.
-    tr ' ' '
-' < "$tmpdepfile" \
-    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
-    tr '
-' ' ' >> $depfile
-    echo >> $depfile
-
-    # The second pass generates a dummy entry for each header file.
-    tr ' ' '
-' < "$tmpdepfile" \
-   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
-   >> $depfile
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile"
-  ;;
-
-aix)
-  # The C for AIX Compiler uses -M and outputs the dependencies
-  # in a .u file.  In older versions, this file always lives in the
-  # current directory.  Also, the AIX compiler puts `$object:' at the
-  # start of each line; $object doesn't have directory information.
-  # Version 6 uses the directory in both cases.
-  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-  test "x$dir" = "x$object" && dir=
-  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-  if test "$libtool" = yes; then
-    tmpdepfile1=$dir$base.u
-    tmpdepfile2=$base.u
-    tmpdepfile3=$dir.libs/$base.u
-    "$@" -Wc,-M
-  else
-    tmpdepfile1=$dir$base.u
-    tmpdepfile2=$dir$base.u
-    tmpdepfile3=$dir$base.u
-    "$@" -M
-  fi
-  stat=$?
-
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
-    exit $stat
-  fi
-
-  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
-  do
-    test -f "$tmpdepfile" && break
-  done
-  if test -f "$tmpdepfile"; then
-    # Each line is of the form `foo.o: dependent.h'.
-    # Do two passes, one to just change these to
-    # `$object: dependent.h' and one to simply `dependent.h:'.
-    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-    # That's a tab and a space in the [].
-    sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile"
-  ;;
-
-icc)
-  # Intel's C compiler understands `-MD -MF file'.  However on
-  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
-  # ICC 7.0 will fill foo.d with something like
-  #    foo.o: sub/foo.c
-  #    foo.o: sub/foo.h
-  # which is wrong.  We want:
-  #    sub/foo.o: sub/foo.c
-  #    sub/foo.o: sub/foo.h
-  #    sub/foo.c:
-  #    sub/foo.h:
-  # ICC 7.1 will output
-  #    foo.o: sub/foo.c sub/foo.h
-  # and will wrap long lines using \ :
-  #    foo.o: sub/foo.c ... \
-  #     sub/foo.h ... \
-  #     ...
-
-  "$@" -MD -MF "$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  # Each line is of the form `foo.o: dependent.h',
-  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
-  # Do two passes, one to just change these to
-  # `$object: dependent.h' and one to simply `dependent.h:'.
-  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
-  # Some versions of the HPUX 10.20 sed can't process this invocation
-  # correctly.  Breaking it into two sed invocations is a workaround.
-  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
-    sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-hp2)
-  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
-  # compilers, which have integrated preprocessors.  The correct option
-  # to use with these is +Maked; it writes dependencies to a file named
-  # 'foo.d', which lands next to the object file, wherever that
-  # happens to be.
-  # Much of this is similar to the tru64 case; see comments there.
-  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-  test "x$dir" = "x$object" && dir=
-  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-  if test "$libtool" = yes; then
-    tmpdepfile1=$dir$base.d
-    tmpdepfile2=$dir.libs/$base.d
-    "$@" -Wc,+Maked
-  else
-    tmpdepfile1=$dir$base.d
-    tmpdepfile2=$dir$base.d
-    "$@" +Maked
-  fi
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-     rm -f "$tmpdepfile1" "$tmpdepfile2"
-     exit $stat
-  fi
-
-  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
-  do
-    test -f "$tmpdepfile" && break
-  done
-  if test -f "$tmpdepfile"; then
-    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
-    # Add `dependent.h:' lines.
-    sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile"
-  else
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile" "$tmpdepfile2"
-  ;;
-
-tru64)
-   # The Tru64 compiler uses -MD to generate dependencies as a side
-   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
-   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
-   # dependencies in `foo.d' instead, so we check for that too.
-   # Subdirectories are respected.
-   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-   test "x$dir" = "x$object" && dir=
-   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-
-   if test "$libtool" = yes; then
-      # With Tru64 cc, shared objects can also be used to make a
-      # static library.  This mechanism is used in libtool 1.4 series to
-      # handle both shared and static libraries in a single compilation.
-      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
-      #
-      # With libtool 1.5 this exception was removed, and libtool now
-      # generates 2 separate objects for the 2 libraries.  These two
-      # compilations output dependencies in $dir.libs/$base.o.d and
-      # in $dir$base.o.d.  We have to check for both files, because
-      # one of the two compilations can be disabled.  We should prefer
-      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
-      # automatically cleaned when .libs/ is deleted, while ignoring
-      # the former would cause a distcleancheck panic.
-      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
-      tmpdepfile2=$dir$base.o.d          # libtool 1.5
-      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
-      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
-      "$@" -Wc,-MD
-   else
-      tmpdepfile1=$dir$base.o.d
-      tmpdepfile2=$dir$base.d
-      tmpdepfile3=$dir$base.d
-      tmpdepfile4=$dir$base.d
-      "$@" -MD
-   fi
-
-   stat=$?
-   if test $stat -eq 0; then :
-   else
-      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-      exit $stat
-   fi
-
-   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-   do
-     test -f "$tmpdepfile" && break
-   done
-   if test -f "$tmpdepfile"; then
-      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-      # That's a tab and a space in the [].
-      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-   else
-      echo "#dummy" > "$depfile"
-   fi
-   rm -f "$tmpdepfile"
-   ;;
-
-#nosideeffect)
-  # This comment above is used by automake to tell side-effect
-  # dependency tracking mechanisms from slower ones.
-
-dashmstdout)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout, regardless of -o.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove `-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  test -z "$dashmflag" && dashmflag=-M
-  # Require at least two characters before searching for `:'
-  # in the target name.  This is to cope with DOS-style filenames:
-  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
-  "$@" $dashmflag |
-    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
-  rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  tr ' ' '
-' < "$tmpdepfile" | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-dashXmstdout)
-  # This case only exists to satisfy depend.m4.  It is never actually
-  # run, as this mode is specially recognized in the preamble.
-  exit 1
-  ;;
-
-makedepend)
-  "$@" || exit $?
-  # Remove any Libtool call
-  if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-  # X makedepend
-  shift
-  cleared=no
-  for arg in "$@"; do
-    case $cleared in
-    no)
-      set ""; shift
-      cleared=yes ;;
-    esac
-    case "$arg" in
-    -D*|-I*)
-      set fnord "$@" "$arg"; shift ;;
-    # Strip any option that makedepend may not understand.  Remove
-    # the object too, otherwise makedepend will parse it as a source file.
-    -*|$object)
-      ;;
-    *)
-      set fnord "$@" "$arg"; shift ;;
-    esac
-  done
-  obj_suffix="`echo $object | sed 's/^.*\././'`"
-  touch "$tmpdepfile"
-  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
-  rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  sed '1,2d' "$tmpdepfile" | tr ' ' '
-' | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile" "$tmpdepfile".bak
-  ;;
-
-cpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove `-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  "$@" -E |
-    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
-       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
-    sed '$ s: \\$::' > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  cat < "$tmpdepfile" >> "$depfile"
-  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-msvisualcpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout, regardless of -o,
-  # because we must use -o when running libtool.
-  "$@" || exit $?
-  IFS=" "
-  for arg
-  do
-    case "$arg" in
-    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
-	set fnord "$@"
-	shift
-	shift
-	;;
-    *)
-	set fnord "$@" "$arg"
-	shift
-	shift
-	;;
-    esac
-  done
-  "$@" -E |
-  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
-  echo "	" >> "$depfile"
-  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-none)
-  exec "$@"
-  ;;
-
-*)
-  echo "Unknown depmode $depmode" 1>&2
-  exit 1
-  ;;
-esac
-
-exit 0
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
-# End:
diff --git a/cloog-0.16.3/autoconf/install-sh b/cloog-0.16.3/autoconf/install-sh
deleted file mode 100755
index 3f83ce9..0000000
--- a/cloog-0.16.3/autoconf/install-sh
+++ /dev/null
@@ -1,524 +0,0 @@
-#!/bin/sh
-# install - install a program, script, or datafile
-
-scriptversion=2010-02-06.18; # UTC
-
-# This originates from X11R5 (mit/util/scripts/install.sh), which was
-# later released in X11R6 (xc/config/util/install.sh) with the
-# following copyright and license.
-#
-# Copyright (C) 1994 X Consortium
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
-# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-# Except as contained in this notice, the name of the X Consortium shall not
-# be used in advertising or otherwise to promote the sale, use or other deal-
-# ings in this Software without prior written authorization from the X Consor-
-# tium.
-#
-#
-# FSF changes to this file are in the public domain.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.
-
-nl='
-'
-IFS=" ""	$nl"
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit=${DOITPROG-}
-if test -z "$doit"; then
-  doit_exec=exec
-else
-  doit_exec=$doit
-fi
-
-# Put in absolute file names if you don't have them in your path;
-# or use environment vars.
-
-chgrpprog=${CHGRPPROG-chgrp}
-chmodprog=${CHMODPROG-chmod}
-chownprog=${CHOWNPROG-chown}
-cmpprog=${CMPPROG-cmp}
-cpprog=${CPPROG-cp}
-mkdirprog=${MKDIRPROG-mkdir}
-mvprog=${MVPROG-mv}
-rmprog=${RMPROG-rm}
-stripprog=${STRIPPROG-strip}
-
-posix_glob='?'
-initialize_posix_glob='
-  test "$posix_glob" != "?" || {
-    if (set -f) 2>/dev/null; then
-      posix_glob=
-    else
-      posix_glob=:
-    fi
-  }
-'
-
-posix_mkdir=
-
-# Desired mode of installed file.
-mode=0755
-
-chgrpcmd=
-chmodcmd=$chmodprog
-chowncmd=
-mvcmd=$mvprog
-rmcmd="$rmprog -f"
-stripcmd=
-
-src=
-dst=
-dir_arg=
-dst_arg=
-
-copy_on_change=false
-no_target_directory=
-
-usage="\
-Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
-   or: $0 [OPTION]... SRCFILES... DIRECTORY
-   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
-   or: $0 [OPTION]... -d DIRECTORIES...
-
-In the 1st form, copy SRCFILE to DSTFILE.
-In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
-In the 4th, create DIRECTORIES.
-
-Options:
-     --help     display this help and exit.
-     --version  display version info and exit.
-
-  -c            (ignored)
-  -C            install only if different (preserve the last data modification time)
-  -d            create directories instead of installing files.
-  -g GROUP      $chgrpprog installed files to GROUP.
-  -m MODE       $chmodprog installed files to MODE.
-  -o USER       $chownprog installed files to USER.
-  -s            $stripprog installed files.
-  -t DIRECTORY  install into DIRECTORY.
-  -T            report an error if DSTFILE is a directory.
-
-Environment variables override the default commands:
-  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
-  RMPROG STRIPPROG
-"
-
-while test $# -ne 0; do
-  case $1 in
-    -c) ;;
-
-    -C) copy_on_change=true;;
-
-    -d) dir_arg=true;;
-
-    -g) chgrpcmd="$chgrpprog $2"
-	shift;;
-
-    --help) echo "$usage"; exit $?;;
-
-    -m) mode=$2
-	case $mode in
-	  *' '* | *'	'* | *'
-'*	  | *'*'* | *'?'* | *'['*)
-	    echo "$0: invalid mode: $mode" >&2
-	    exit 1;;
-	esac
-	shift;;
-
-    -o) chowncmd="$chownprog $2"
-	shift;;
-
-    -s) stripcmd=$stripprog;;
-
-    -t) dst_arg=$2
-	shift;;
-
-    -T) no_target_directory=true;;
-
-    --version) echo "$0 $scriptversion"; exit $?;;
-
-    --)	shift
-	break;;
-
-    -*)	echo "$0: invalid option: $1" >&2
-	exit 1;;
-
-    *)  break;;
-  esac
-  shift
-done
-
-if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
-  # When -d is used, all remaining arguments are directories to create.
-  # When -t is used, the destination is already specified.
-  # Otherwise, the last argument is the destination.  Remove it from $@.
-  for arg
-  do
-    if test -n "$dst_arg"; then
-      # $@ is not empty: it contains at least $arg.
-      set fnord "$@" "$dst_arg"
-      shift # fnord
-    fi
-    shift # arg
-    dst_arg=$arg
-  done
-fi
-
-if test $# -eq 0; then
-  if test -z "$dir_arg"; then
-    echo "$0: no input file specified." >&2
-    exit 1
-  fi
-  # It's OK to call `install-sh -d' without argument.
-  # This can happen when creating conditional directories.
-  exit 0
-fi
-
-if test -z "$dir_arg"; then
-  do_exit='(exit $ret); exit $ret'
-  trap "ret=129; $do_exit" 1
-  trap "ret=130; $do_exit" 2
-  trap "ret=141; $do_exit" 13
-  trap "ret=143; $do_exit" 15
-
-  # Set umask so as not to create temps with too-generous modes.
-  # However, 'strip' requires both read and write access to temps.
-  case $mode in
-    # Optimize common cases.
-    *644) cp_umask=133;;
-    *755) cp_umask=22;;
-
-    *[0-7])
-      if test -z "$stripcmd"; then
-	u_plus_rw=
-      else
-	u_plus_rw='% 200'
-      fi
-      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
-    *)
-      if test -z "$stripcmd"; then
-	u_plus_rw=
-      else
-	u_plus_rw=,u+rw
-      fi
-      cp_umask=$mode$u_plus_rw;;
-  esac
-fi
-
-for src
-do
-  # Protect names starting with `-'.
-  case $src in
-    -*) src=./$src;;
-  esac
-
-  if test -n "$dir_arg"; then
-    dst=$src
-    dstdir=$dst
-    test -d "$dstdir"
-    dstdir_status=$?
-  else
-
-    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
-    # might cause directories to be created, which would be especially bad
-    # if $src (and thus $dsttmp) contains '*'.
-    if test ! -f "$src" && test ! -d "$src"; then
-      echo "$0: $src does not exist." >&2
-      exit 1
-    fi
-
-    if test -z "$dst_arg"; then
-      echo "$0: no destination specified." >&2
-      exit 1
-    fi
-
-    dst=$dst_arg
-    # Protect names starting with `-'.
-    case $dst in
-      -*) dst=./$dst;;
-    esac
-
-    # If destination is a directory, append the input filename; won't work
-    # if double slashes aren't ignored.
-    if test -d "$dst"; then
-      if test -n "$no_target_directory"; then
-	echo "$0: $dst_arg: Is a directory" >&2
-	exit 1
-      fi
-      dstdir=$dst
-      dst=$dstdir/`basename "$src"`
-      dstdir_status=0
-    else
-      # Prefer dirname, but fall back on a substitute if dirname fails.
-      dstdir=`
-	(dirname "$dst") 2>/dev/null ||
-	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	     X"$dst" : 'X\(//\)[^/]' \| \
-	     X"$dst" : 'X\(//\)$' \| \
-	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
-	echo X"$dst" |
-	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)[^/].*/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\).*/{
-		   s//\1/
-		   q
-		 }
-		 s/.*/./; q'
-      `
-
-      test -d "$dstdir"
-      dstdir_status=$?
-    fi
-  fi
-
-  obsolete_mkdir_used=false
-
-  if test $dstdir_status != 0; then
-    case $posix_mkdir in
-      '')
-	# Create intermediate dirs using mode 755 as modified by the umask.
-	# This is like FreeBSD 'install' as of 1997-10-28.
-	umask=`umask`
-	case $stripcmd.$umask in
-	  # Optimize common cases.
-	  *[2367][2367]) mkdir_umask=$umask;;
-	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
-	  *[0-7])
-	    mkdir_umask=`expr $umask + 22 \
-	      - $umask % 100 % 40 + $umask % 20 \
-	      - $umask % 10 % 4 + $umask % 2
-	    `;;
-	  *) mkdir_umask=$umask,go-w;;
-	esac
-
-	# With -d, create the new directory with the user-specified mode.
-	# Otherwise, rely on $mkdir_umask.
-	if test -n "$dir_arg"; then
-	  mkdir_mode=-m$mode
-	else
-	  mkdir_mode=
-	fi
-
-	posix_mkdir=false
-	case $umask in
-	  *[123567][0-7][0-7])
-	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
-	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-	    ;;
-	  *)
-	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-	    if (umask $mkdir_umask &&
-		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
-	    then
-	      if test -z "$dir_arg" || {
-		   # Check for POSIX incompatibilities with -m.
-		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-		   # other-writeable bit of parent directory when it shouldn't.
-		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
-		   case $ls_ld_tmpdir in
-		     d????-?r-*) different_mode=700;;
-		     d????-?--*) different_mode=755;;
-		     *) false;;
-		   esac &&
-		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
-		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
-		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-		   }
-		 }
-	      then posix_mkdir=:
-	      fi
-	      rmdir "$tmpdir/d" "$tmpdir"
-	    else
-	      # Remove any dirs left behind by ancient mkdir implementations.
-	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
-	    fi
-	    trap '' 0;;
-	esac;;
-    esac
-
-    if
-      $posix_mkdir && (
-	umask $mkdir_umask &&
-	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
-      )
-    then :
-    else
-
-      # The umask is ridiculous, or mkdir does not conform to POSIX,
-      # or it failed possibly due to a race condition.  Create the
-      # directory the slow way, step by step, checking for races as we go.
-
-      case $dstdir in
-	/*) prefix='/';;
-	-*) prefix='./';;
-	*)  prefix='';;
-      esac
-
-      eval "$initialize_posix_glob"
-
-      oIFS=$IFS
-      IFS=/
-      $posix_glob set -f
-      set fnord $dstdir
-      shift
-      $posix_glob set +f
-      IFS=$oIFS
-
-      prefixes=
-
-      for d
-      do
-	test -z "$d" && continue
-
-	prefix=$prefix$d
-	if test -d "$prefix"; then
-	  prefixes=
-	else
-	  if $posix_mkdir; then
-	    (umask=$mkdir_umask &&
-	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-	    # Don't fail if two instances are running concurrently.
-	    test -d "$prefix" || exit 1
-	  else
-	    case $prefix in
-	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-	      *) qprefix=$prefix;;
-	    esac
-	    prefixes="$prefixes '$qprefix'"
-	  fi
-	fi
-	prefix=$prefix/
-      done
-
-      if test -n "$prefixes"; then
-	# Don't fail if two instances are running concurrently.
-	(umask $mkdir_umask &&
-	 eval "\$doit_exec \$mkdirprog $prefixes") ||
-	  test -d "$dstdir" || exit 1
-	obsolete_mkdir_used=true
-      fi
-    fi
-  fi
-
-  if test -n "$dir_arg"; then
-    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
-    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
-      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
-  else
-
-    # Make a couple of temp file names in the proper directory.
-    dsttmp=$dstdir/_inst.$$_
-    rmtmp=$dstdir/_rm.$$_
-
-    # Trap to clean up those temp files at exit.
-    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
-
-    # Copy the file name to the temp name.
-    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
-
-    # and set any options; do chmod last to preserve setuid bits.
-    #
-    # If any of these fail, we abort the whole thing.  If we want to
-    # ignore errors from any of these, just make sure not to ignore
-    # errors from the above "$doit $cpprog $src $dsttmp" command.
-    #
-    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
-    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
-    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
-
-    # If -C, don't bother to copy if it wouldn't change the file.
-    if $copy_on_change &&
-       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
-       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
-
-       eval "$initialize_posix_glob" &&
-       $posix_glob set -f &&
-       set X $old && old=:$2:$4:$5:$6 &&
-       set X $new && new=:$2:$4:$5:$6 &&
-       $posix_glob set +f &&
-
-       test "$old" = "$new" &&
-       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
-    then
-      rm -f "$dsttmp"
-    else
-      # Rename the file to the real destination.
-      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
-
-      # The rename failed, perhaps because mv can't rename something else
-      # to itself, or perhaps because mv is so ancient that it does not
-      # support -f.
-      {
-	# Now remove or move aside any old file at destination location.
-	# We try this two ways since rm can't unlink itself on some
-	# systems and the destination file might be busy for other
-	# reasons.  In this case, the final cleanup might fail but the new
-	# file should still install successfully.
-	{
-	  test ! -f "$dst" ||
-	  $doit $rmcmd -f "$dst" 2>/dev/null ||
-	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
-	  } ||
-	  { echo "$0: cannot unlink or rename $dst" >&2
-	    (exit 1); exit 1
-	  }
-	} &&
-
-	# Now rename the file to the real destination.
-	$doit $mvcmd "$dsttmp" "$dst"
-      }
-    fi || exit 1
-
-    trap '' 0
-  fi
-done
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/cloog-0.16.3/autoconf/ltmain.sh b/cloog-0.16.3/autoconf/ltmain.sh
deleted file mode 100755
index be43f41..0000000
--- a/cloog-0.16.3/autoconf/ltmain.sh
+++ /dev/null
@@ -1,8750 +0,0 @@
-# Generated from ltmain.m4sh.
-
-# libtool (GNU libtool) 2.2.8
-# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
-# 2007, 2008, 2009, 2010 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.
-
-# GNU Libtool is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html,
-# or obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-# Usage: $progname [OPTION]... [MODE-ARG]...
-#
-# Provide generalized library-building support services.
-#
-#       --config             show all configuration variables
-#       --debug              enable verbose shell tracing
-#   -n, --dry-run            display commands without modifying any files
-#       --features           display basic configuration information and exit
-#       --mode=MODE          use operation mode MODE
-#       --preserve-dup-deps  don't remove duplicate dependency libraries
-#       --quiet, --silent    don't print informational messages
-#       --no-quiet, --no-silent
-#                            print informational messages (default)
-#       --tag=TAG            use configuration variables from tag TAG
-#   -v, --verbose            print more informational messages than default
-#       --no-verbose         don't print the extra informational messages
-#       --version            print version information
-#   -h, --help, --help-all   print short, long, or detailed help message
-#
-# MODE must be one of the following:
-#
-#         clean              remove files from the build directory
-#         compile            compile a source file into a libtool object
-#         execute            automatically set library path, then run a program
-#         finish             complete the installation of libtool libraries
-#         install            install libraries or executables
-#         link               create a library or an executable
-#         uninstall          remove libraries from an installed directory
-#
-# MODE-ARGS vary depending on the MODE.  When passed as first option,
-# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
-# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
-#
-# When reporting a bug, please describe a test case to reproduce it and
-# include the following information:
-#
-#         host-triplet:	$host
-#         shell:		$SHELL
-#         compiler:		$LTCC
-#         compiler flags:		$LTCFLAGS
-#         linker:		$LD (gnu? $with_gnu_ld)
-#         $progname:	(GNU libtool) 2.2.8
-#         automake:	$automake_version
-#         autoconf:	$autoconf_version
-#
-# Report bugs to <bug-libtool@gnu.org>.
-
-PROGRAM=libtool
-PACKAGE=libtool
-VERSION=2.2.8
-TIMESTAMP=""
-package_revision=1.3169
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
-}
-
-# NLS nuisances: We save the old values to restore during execute mode.
-lt_user_locale=
-lt_safe_locale=
-for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-do
-  eval "if test \"\${$lt_var+set}\" = set; then
-          save_$lt_var=\$$lt_var
-          $lt_var=C
-	  export $lt_var
-	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
-	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
-	fi"
-done
-LC_ALL=C
-LANGUAGE=C
-export LANGUAGE LC_ALL
-
-$lt_unset CDPATH
-
-
-
-
-
-
-# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
-# is ksh but when the shell is invoked as "sh" and the current value of
-# the _XPG environment variable is not equal to 1 (one), the special
-# positional parameter $0, within a function call, is the name of the
-# function.
-progpath="$0"
-
-
-
-: ${CP="cp -f"}
-test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
-: ${EGREP="grep -E"}
-: ${FGREP="grep -F"}
-: ${GREP="grep"}
-: ${LN_S="ln -s"}
-: ${MAKE="make"}
-: ${MKDIR="mkdir"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-: ${SED="sed"}
-: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
-: ${Xsed="$SED -e 1s/^X//"}
-
-# Global variables:
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
-EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
-
-exit_status=$EXIT_SUCCESS
-
-# Make sure IFS has a sensible default
-lt_nl='
-'
-IFS=" 	$lt_nl"
-
-dirname="s,/[^/]*$,,"
-basename="s,^.*/,,"
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-  func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
-}
-
-# Generated shell functions inserted here.
-
-# These SED scripts presuppose an absolute path with a trailing slash.
-pathcar='s,^/\([^/]*\).*$,\1,'
-pathcdr='s,^/[^/]*,,'
-removedotparts=':dotsl
-		s@/\./@/@g
-		t dotsl
-		s,/\.$,/,'
-collapseslashes='s@/\{1,\}@/@g'
-finalslash='s,/*$,/,'
-
-# func_normal_abspath PATH
-# Remove doubled-up and trailing slashes, "." path components,
-# and cancel out any ".." path components in PATH after making
-# it an absolute path.
-#             value returned in "$func_normal_abspath_result"
-func_normal_abspath ()
-{
-  # Start from root dir and reassemble the path.
-  func_normal_abspath_result=
-  func_normal_abspath_tpath=$1
-  func_normal_abspath_altnamespace=
-  case $func_normal_abspath_tpath in
-    "")
-      # Empty path, that just means $cwd.
-      func_stripname '' '/' "`pwd`"
-      func_normal_abspath_result=$func_stripname_result
-      return
-    ;;
-    # The next three entries are used to spot a run of precisely
-    # two leading slashes without using negated character classes;
-    # we take advantage of case's first-match behaviour.
-    ///*)
-      # Unusual form of absolute path, do nothing.
-    ;;
-    //*)
-      # Not necessarily an ordinary path; POSIX reserves leading '//'
-      # and for example Cygwin uses it to access remote file shares
-      # over CIFS/SMB, so we conserve a leading double slash if found.
-      func_normal_abspath_altnamespace=/
-    ;;
-    /*)
-      # Absolute path, do nothing.
-    ;;
-    *)
-      # Relative path, prepend $cwd.
-      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
-    ;;
-  esac
-  # Cancel out all the simple stuff to save iterations.  We also want
-  # the path to end with a slash for ease of parsing, so make sure
-  # there is one (and only one) here.
-  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
-  while :; do
-    # Processed it all yet?
-    if test "$func_normal_abspath_tpath" = / ; then
-      # If we ascended to the root using ".." the result may be empty now.
-      if test -z "$func_normal_abspath_result" ; then
-        func_normal_abspath_result=/
-      fi
-      break
-    fi
-    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$pathcar"`
-    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$pathcdr"`
-    # Figure out what to do with it
-    case $func_normal_abspath_tcomponent in
-      "")
-        # Trailing empty path component, ignore it.
-      ;;
-      ..)
-        # Parent dir; strip last assembled component from result.
-        func_dirname "$func_normal_abspath_result"
-        func_normal_abspath_result=$func_dirname_result
-      ;;
-      *)
-        # Actual path component, append it.
-        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
-      ;;
-    esac
-  done
-  # Restore leading double-slash if one was found on entry.
-  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
-}
-
-# func_relative_path SRCDIR DSTDIR
-# generates a relative path from SRCDIR to DSTDIR, with a trailing
-# slash if non-empty, suitable for immediately appending a filename
-# without needing to append a separator.
-#             value returned in "$func_relative_path_result"
-func_relative_path ()
-{
-  func_relative_path_result=
-  func_normal_abspath "$1"
-  func_relative_path_tlibdir=$func_normal_abspath_result
-  func_normal_abspath "$2"
-  func_relative_path_tbindir=$func_normal_abspath_result
-
-  # Ascend the tree starting from libdir
-  while :; do
-    # check if we have found a prefix of bindir
-    case $func_relative_path_tbindir in
-      $func_relative_path_tlibdir)
-        # found an exact match
-        func_relative_path_tcancelled=
-        break
-        ;;
-      $func_relative_path_tlibdir*)
-        # found a matching prefix
-        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
-        func_relative_path_tcancelled=$func_stripname_result
-        if test -z "$func_relative_path_result"; then
-          func_relative_path_result=.
-        fi
-        break
-        ;;
-      *)
-        func_dirname $func_relative_path_tlibdir
-        func_relative_path_tlibdir=${func_dirname_result}
-        if test "x$func_relative_path_tlibdir" = x ; then
-          # Have to descend all the way to the root!
-          func_relative_path_result=../$func_relative_path_result
-          func_relative_path_tcancelled=$func_relative_path_tbindir
-          break
-        fi
-        func_relative_path_result=../$func_relative_path_result
-        ;;
-    esac
-  done
-
-  # Now calculate path; take care to avoid doubling-up slashes.
-  func_stripname '' '/' "$func_relative_path_result"
-  func_relative_path_result=$func_stripname_result
-  func_stripname '/' '/' "$func_relative_path_tcancelled"
-  if test "x$func_stripname_result" != x ; then
-    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
-  fi
-
-  # Normalisation. If bindir is libdir, return empty string,
-  # else relative path ending with a slash; either way, target
-  # file name can be directly appended.
-  if test ! -z "$func_relative_path_result"; then
-    func_stripname './' '' "$func_relative_path_result/"
-    func_relative_path_result=$func_stripname_result
-  fi
-}
-
-# The name of this program:
-func_dirname_and_basename "$progpath"
-progname=$func_basename_result
-
-# Make sure we have an absolute path for reexecution:
-case $progpath in
-  [\\/]*|[A-Za-z]:\\*) ;;
-  *[\\/]*)
-     progdir=$func_dirname_result
-     progdir=`cd "$progdir" && pwd`
-     progpath="$progdir/$progname"
-     ;;
-  *)
-     save_IFS="$IFS"
-     IFS=:
-     for progdir in $PATH; do
-       IFS="$save_IFS"
-       test -x "$progdir/$progname" && break
-     done
-     IFS="$save_IFS"
-     test -n "$progdir" || progdir=`pwd`
-     progpath="$progdir/$progname"
-     ;;
-esac
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed="${SED}"' -e 1s/^X//'
-sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Re-`\' parameter expansions in output of double_quote_subst that were
-# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
-# in input to double_quote_subst, that '$' was protected from expansion.
-# Since each input `\' is now two `\'s, look for any number of runs of
-# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
-bs='\\'
-bs2='\\\\'
-bs4='\\\\\\\\'
-dollar='\$'
-sed_double_backslash="\
-  s/$bs4/&\\
-/g
-  s/^$bs2$dollar/$bs&/
-  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
-  s/\n//g"
-
-# Standard options:
-opt_dry_run=false
-opt_help=false
-opt_quiet=false
-opt_verbose=false
-opt_warning=:
-
-# func_echo arg...
-# Echo program name prefixed message, along with the current mode
-# name if it has been set yet.
-func_echo ()
-{
-    $ECHO "$progname${mode+: }$mode: $*"
-}
-
-# func_verbose arg...
-# Echo program name prefixed message in verbose mode only.
-func_verbose ()
-{
-    $opt_verbose && func_echo ${1+"$@"}
-
-    # A bug in bash halts the script if the last line of a function
-    # fails when set -e is in force, so we need another command to
-    # work around that:
-    :
-}
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO "$*"
-}
-
-# func_error arg...
-# Echo program name prefixed message to standard error.
-func_error ()
-{
-    $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2
-}
-
-# func_warning arg...
-# Echo program name prefixed warning message to standard error.
-func_warning ()
-{
-    $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2
-
-    # bash bug again:
-    :
-}
-
-# func_fatal_error arg...
-# Echo program name prefixed message to standard error, and exit.
-func_fatal_error ()
-{
-    func_error ${1+"$@"}
-    exit $EXIT_FAILURE
-}
-
-# func_fatal_help arg...
-# Echo program name prefixed message to standard error, followed by
-# a help hint, and exit.
-func_fatal_help ()
-{
-    func_error ${1+"$@"}
-    func_fatal_error "$help"
-}
-help="Try \`$progname --help' for more information."  ## default
-
-
-# func_grep expression filename
-# Check whether EXPRESSION matches any line of FILENAME, without output.
-func_grep ()
-{
-    $GREP "$1" "$2" >/dev/null 2>&1
-}
-
-
-# func_mkdir_p directory-path
-# Make sure the entire path to DIRECTORY-PATH is available.
-func_mkdir_p ()
-{
-    my_directory_path="$1"
-    my_dir_list=
-
-    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
-
-      # Protect directory names starting with `-'
-      case $my_directory_path in
-        -*) my_directory_path="./$my_directory_path" ;;
-      esac
-
-      # While some portion of DIR does not yet exist...
-      while test ! -d "$my_directory_path"; do
-        # ...make a list in topmost first order.  Use a colon delimited
-	# list incase some portion of path contains whitespace.
-        my_dir_list="$my_directory_path:$my_dir_list"
-
-        # If the last portion added has no slash in it, the list is done
-        case $my_directory_path in */*) ;; *) break ;; esac
-
-        # ...otherwise throw away the child directory and loop
-        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
-      done
-      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
-
-      save_mkdir_p_IFS="$IFS"; IFS=':'
-      for my_dir in $my_dir_list; do
-	IFS="$save_mkdir_p_IFS"
-        # mkdir can fail with a `File exist' error if two processes
-        # try to create one of the directories concurrently.  Don't
-        # stop in that case!
-        $MKDIR "$my_dir" 2>/dev/null || :
-      done
-      IFS="$save_mkdir_p_IFS"
-
-      # Bail out if we (or some other process) failed to create a directory.
-      test -d "$my_directory_path" || \
-        func_fatal_error "Failed to create \`$1'"
-    fi
-}
-
-
-# func_mktempdir [string]
-# Make a temporary directory that won't clash with other running
-# libtool processes, and avoids race conditions if possible.  If
-# given, STRING is the basename for that directory.
-func_mktempdir ()
-{
-    my_template="${TMPDIR-/tmp}/${1-$progname}"
-
-    if test "$opt_dry_run" = ":"; then
-      # Return a directory name, but don't create it in dry-run mode
-      my_tmpdir="${my_template}-$$"
-    else
-
-      # If mktemp works, use that first and foremost
-      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
-
-      if test ! -d "$my_tmpdir"; then
-        # Failing that, at least try and use $RANDOM to avoid a race
-        my_tmpdir="${my_template}-${RANDOM-0}$$"
-
-        save_mktempdir_umask=`umask`
-        umask 0077
-        $MKDIR "$my_tmpdir"
-        umask $save_mktempdir_umask
-      fi
-
-      # If we're not in dry-run mode, bomb out on failure
-      test -d "$my_tmpdir" || \
-        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
-    fi
-
-    $ECHO "$my_tmpdir"
-}
-
-
-# func_quote_for_eval arg
-# Aesthetically quote ARG to be evaled later.
-# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
-# is double-quoted, suitable for a subsequent eval, whereas
-# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
-# which are still active within double quotes backslashified.
-func_quote_for_eval ()
-{
-    case $1 in
-      *[\\\`\"\$]*)
-	func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
-      *)
-        func_quote_for_eval_unquoted_result="$1" ;;
-    esac
-
-    case $func_quote_for_eval_unquoted_result in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting, command substitution and and variable
-      # expansion for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
-        ;;
-      *)
-        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
-    esac
-}
-
-
-# func_quote_for_expand arg
-# Aesthetically quote ARG to be evaled later; same as above,
-# but do not quote variable references.
-func_quote_for_expand ()
-{
-    case $1 in
-      *[\\\`\"]*)
-	my_arg=`$ECHO "$1" | $SED \
-	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
-      *)
-        my_arg="$1" ;;
-    esac
-
-    case $my_arg in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting and command substitution for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        my_arg="\"$my_arg\""
-        ;;
-    esac
-
-    func_quote_for_expand_result="$my_arg"
-}
-
-
-# func_show_eval cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.
-func_show_eval ()
-{
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
-
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
-
-    if ${opt_dry_run-false}; then :; else
-      eval "$my_cmd"
-      my_status=$?
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
-}
-
-
-# func_show_eval_locale cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.  Use the saved locale for evaluation.
-func_show_eval_locale ()
-{
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
-
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
-
-    if ${opt_dry_run-false}; then :; else
-      eval "$lt_user_locale
-	    $my_cmd"
-      my_status=$?
-      eval "$lt_safe_locale"
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
-}
-
-
-
-# func_version
-# Echo version message to standard output and exit.
-func_version ()
-{
-    $SED -n '/(C)/!b go
-	:more
-	/\./!{
-	  N
-	  s/\n# //
-	  b more
-	}
-	:go
-	/^# '$PROGRAM' (GNU /,/# warranty; / {
-        s/^# //
-	s/^# *$//
-        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
-        p
-     }' < "$progpath"
-     exit $?
-}
-
-# func_usage
-# Echo short help message to standard output and exit.
-func_usage ()
-{
-    $SED -n '/^# Usage:/,/^#  *.*--help/ {
-        s/^# //
-	s/^# *$//
-	s/\$progname/'$progname'/
-	p
-    }' < "$progpath"
-    echo
-    $ECHO "run \`$progname --help | more' for full usage"
-    exit $?
-}
-
-# func_help [NOEXIT]
-# Echo long help message to standard output and exit,
-# unless 'noexit' is passed as argument.
-func_help ()
-{
-    $SED -n '/^# Usage:/,/# Report bugs to/ {
-        s/^# //
-	s/^# *$//
-	s*\$progname*'$progname'*
-	s*\$host*'"$host"'*
-	s*\$SHELL*'"$SHELL"'*
-	s*\$LTCC*'"$LTCC"'*
-	s*\$LTCFLAGS*'"$LTCFLAGS"'*
-	s*\$LD*'"$LD"'*
-	s/\$with_gnu_ld/'"$with_gnu_ld"'/
-	s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/
-	s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/
-	p
-     }' < "$progpath"
-    ret=$?
-    if test -z "$1"; then
-      exit $ret
-    fi
-}
-
-# func_missing_arg argname
-# Echo program name prefixed message to standard error and set global
-# exit_cmd.
-func_missing_arg ()
-{
-    func_error "missing argument for $1."
-    exit_cmd=exit
-}
-
-exit_cmd=:
-
-
-
-
-
-
-magic="%%%MAGIC variable%%%"
-magic_exe="%%%MAGIC EXE variable%%%"
-
-# Global variables.
-# $mode is unset
-nonopt=
-execute_dlfiles=
-preserve_args=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
-extracted_archives=
-extracted_serial=0
-
-opt_dry_run=false
-opt_duplicate_deps=false
-opt_silent=false
-opt_debug=:
-
-# If this variable is set in any of the actions, the command in it
-# will be execed at the end.  This prevents here-documents from being
-# left over by shells.
-exec_cmd=
-
-# func_fatal_configuration arg...
-# Echo program name prefixed message to standard error, followed by
-# a configuration failure hint, and exit.
-func_fatal_configuration ()
-{
-    func_error ${1+"$@"}
-    func_error "See the $PACKAGE documentation for more information."
-    func_fatal_error "Fatal configuration error."
-}
-
-
-# func_config
-# Display the configuration for all the tags in this script.
-func_config ()
-{
-    re_begincf='^# ### BEGIN LIBTOOL'
-    re_endcf='^# ### END LIBTOOL'
-
-    # Default configuration.
-    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
-
-    # Now print the configurations for the tags.
-    for tagname in $taglist; do
-      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
-    done
-
-    exit $?
-}
-
-# func_features
-# Display the features supported by this script.
-func_features ()
-{
-    echo "host: $host"
-    if test "$build_libtool_libs" = yes; then
-      echo "enable shared libraries"
-    else
-      echo "disable shared libraries"
-    fi
-    if test "$build_old_libs" = yes; then
-      echo "enable static libraries"
-    else
-      echo "disable static libraries"
-    fi
-
-    exit $?
-}
-
-# func_enable_tag tagname
-# Verify that TAGNAME is valid, and either flag an error and exit, or
-# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
-# variable here.
-func_enable_tag ()
-{
-  # Global variable:
-  tagname="$1"
-
-  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
-  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
-  sed_extractcf="/$re_begincf/,/$re_endcf/p"
-
-  # Validate tagname.
-  case $tagname in
-    *[!-_A-Za-z0-9,/]*)
-      func_fatal_error "invalid tag name: $tagname"
-      ;;
-  esac
-
-  # Don't test for the "default" C tag, as we know it's
-  # there but not specially marked.
-  case $tagname in
-    CC) ;;
-    *)
-      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
-	taglist="$taglist $tagname"
-
-	# Evaluate the configuration.  Be careful to quote the path
-	# and the sed script, to avoid splitting on whitespace, but
-	# also don't use non-portable quotes within backquotes within
-	# quotes we have to do it in 2 steps:
-	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
-	eval "$extractedcf"
-      else
-	func_error "ignoring unknown tag $tagname"
-      fi
-      ;;
-  esac
-}
-
-# Parse options once, thoroughly.  This comes as soon as possible in
-# the script to make things like `libtool --version' happen quickly.
-{
-
-  # Shorthand for --mode=foo, only valid as the first argument
-  case $1 in
-  clean|clea|cle|cl)
-    shift; set dummy --mode clean ${1+"$@"}; shift
-    ;;
-  compile|compil|compi|comp|com|co|c)
-    shift; set dummy --mode compile ${1+"$@"}; shift
-    ;;
-  execute|execut|execu|exec|exe|ex|e)
-    shift; set dummy --mode execute ${1+"$@"}; shift
-    ;;
-  finish|finis|fini|fin|fi|f)
-    shift; set dummy --mode finish ${1+"$@"}; shift
-    ;;
-  install|instal|insta|inst|ins|in|i)
-    shift; set dummy --mode install ${1+"$@"}; shift
-    ;;
-  link|lin|li|l)
-    shift; set dummy --mode link ${1+"$@"}; shift
-    ;;
-  uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
-    shift; set dummy --mode uninstall ${1+"$@"}; shift
-    ;;
-  esac
-
-  # Parse non-mode specific arguments:
-  while test "$#" -gt 0; do
-    opt="$1"
-    shift
-
-    case $opt in
-      --config)		func_config					;;
-
-      --debug)		preserve_args="$preserve_args $opt"
-			func_echo "enabling shell trace mode"
-			opt_debug='set -x'
-			$opt_debug
-			;;
-
-      -dlopen)		test "$#" -eq 0 && func_missing_arg "$opt" && break
-			execute_dlfiles="$execute_dlfiles $1"
-			shift
-			;;
-
-      --dry-run | -n)	opt_dry_run=:					;;
-      --features)       func_features					;;
-      --finish)		mode="finish"					;;
-
-      --mode)		test "$#" -eq 0 && func_missing_arg "$opt" && break
-			case $1 in
-			  # Valid mode arguments:
-			  clean)	;;
-			  compile)	;;
-			  execute)	;;
-			  finish)	;;
-			  install)	;;
-			  link)		;;
-			  relink)	;;
-			  uninstall)	;;
-
-			  # Catch anything else as an error
-			  *) func_error "invalid argument for $opt"
-			     exit_cmd=exit
-			     break
-			     ;;
-		        esac
-
-			mode="$1"
-			shift
-			;;
-
-      --preserve-dup-deps)
-			opt_duplicate_deps=:				;;
-
-      --quiet|--silent)	preserve_args="$preserve_args $opt"
-			opt_silent=:
-			opt_verbose=false
-			;;
-
-      --no-quiet|--no-silent)
-			preserve_args="$preserve_args $opt"
-			opt_silent=false
-			;;
-
-      --verbose| -v)	preserve_args="$preserve_args $opt"
-			opt_silent=false
-			opt_verbose=:
-			;;
-
-      --no-verbose)	preserve_args="$preserve_args $opt"
-			opt_verbose=false
-			;;
-
-      --tag)		test "$#" -eq 0 && func_missing_arg "$opt" && break
-			preserve_args="$preserve_args $opt $1"
-			func_enable_tag "$1"	# tagname is set here
-			shift
-			;;
-
-      # Separate optargs to long options:
-      -dlopen=*|--mode=*|--tag=*)
-			func_opt_split "$opt"
-			set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"}
-			shift
-			;;
-
-      -\?|-h)		func_usage					;;
-      --help)		opt_help=:					;;
-      --help-all)	opt_help=': help-all'				;;
-      --version)	func_version					;;
-
-      -*)		func_fatal_help "unrecognized option \`$opt'"	;;
-
-      *)		nonopt="$opt"
-			break
-			;;
-    esac
-  done
-
-
-  case $host in
-    *cygwin* | *mingw* | *pw32* | *cegcc*)
-      # don't eliminate duplications in $postdeps and $predeps
-      opt_duplicate_compiler_generated_deps=:
-      ;;
-    *)
-      opt_duplicate_compiler_generated_deps=$opt_duplicate_deps
-      ;;
-  esac
-
-  # Having warned about all mis-specified options, bail out if
-  # anything was wrong.
-  $exit_cmd $EXIT_FAILURE
-}
-
-# func_check_version_match
-# Ensure that we are using m4 macros, and libtool script from the same
-# release of libtool.
-func_check_version_match ()
-{
-  if test "$package_revision" != "$macro_revision"; then
-    if test "$VERSION" != "$macro_version"; then
-      if test -z "$macro_version"; then
-        cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from an older release.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
-      else
-        cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
-      fi
-    else
-      cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
-$progname: but the definition of this LT_INIT comes from revision $macro_revision.
-$progname: You should recreate aclocal.m4 with macros from revision $package_revision
-$progname: of $PACKAGE $VERSION and run autoconf again.
-_LT_EOF
-    fi
-
-    exit $EXIT_MISMATCH
-  fi
-}
-
-
-## ----------- ##
-##    Main.    ##
-## ----------- ##
-
-$opt_help || {
-  # Sanity checks first:
-  func_check_version_match
-
-  if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
-    func_fatal_configuration "not configured to build any kind of library"
-  fi
-
-  test -z "$mode" && func_fatal_error "error: you must specify a MODE."
-
-
-  # Darwin sucks
-  eval std_shrext=\"$shrext_cmds\"
-
-
-  # Only execute mode is allowed to have -dlopen flags.
-  if test -n "$execute_dlfiles" && test "$mode" != execute; then
-    func_error "unrecognized option \`-dlopen'"
-    $ECHO "$help" 1>&2
-    exit $EXIT_FAILURE
-  fi
-
-  # Change the help message to a mode-specific one.
-  generic_help="$help"
-  help="Try \`$progname --help --mode=$mode' for more information."
-}
-
-
-# func_lalib_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_lalib_p ()
-{
-    test -f "$1" &&
-      $SED -e 4q "$1" 2>/dev/null \
-        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
-}
-
-# func_lalib_unsafe_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
-# This function implements the same check as func_lalib_p without
-# resorting to external programs.  To this end, it redirects stdin and
-# closes it afterwards, without saving the original file descriptor.
-# As a safety measure, use it only where a negative result would be
-# fatal anyway.  Works if `file' does not exist.
-func_lalib_unsafe_p ()
-{
-    lalib_p=no
-    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
-	for lalib_p_l in 1 2 3 4
-	do
-	    read lalib_p_line
-	    case "$lalib_p_line" in
-		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
-	    esac
-	done
-	exec 0<&5 5<&-
-    fi
-    test "$lalib_p" = yes
-}
-
-# func_ltwrapper_script_p file
-# True iff FILE is a libtool wrapper script
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_script_p ()
-{
-    func_lalib_p "$1"
-}
-
-# func_ltwrapper_executable_p file
-# True iff FILE is a libtool wrapper executable
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_executable_p ()
-{
-    func_ltwrapper_exec_suffix=
-    case $1 in
-    *.exe) ;;
-    *) func_ltwrapper_exec_suffix=.exe ;;
-    esac
-    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
-}
-
-# func_ltwrapper_scriptname file
-# Assumes file is an ltwrapper_executable
-# uses $file to determine the appropriate filename for a
-# temporary ltwrapper_script.
-func_ltwrapper_scriptname ()
-{
-    func_ltwrapper_scriptname_result=""
-    if func_ltwrapper_executable_p "$1"; then
-	func_dirname_and_basename "$1" "" "."
-	func_stripname '' '.exe' "$func_basename_result"
-	func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
-    fi
-}
-
-# func_ltwrapper_p file
-# True iff FILE is a libtool wrapper script or wrapper executable
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_p ()
-{
-    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
-}
-
-
-# func_execute_cmds commands fail_cmd
-# Execute tilde-delimited COMMANDS.
-# If FAIL_CMD is given, eval that upon failure.
-# FAIL_CMD may read-access the current command in variable CMD!
-func_execute_cmds ()
-{
-    $opt_debug
-    save_ifs=$IFS; IFS='~'
-    for cmd in $1; do
-      IFS=$save_ifs
-      eval cmd=\"$cmd\"
-      func_show_eval "$cmd" "${2-:}"
-    done
-    IFS=$save_ifs
-}
-
-
-# func_source file
-# Source FILE, adding directory component if necessary.
-# Note that it is not necessary on cygwin/mingw to append a dot to
-# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
-# behavior happens only for exec(3), not for open(2)!  Also, sourcing
-# `FILE.' does not work on cygwin managed mounts.
-func_source ()
-{
-    $opt_debug
-    case $1 in
-    */* | *\\*)	. "$1" ;;
-    *)		. "./$1" ;;
-    esac
-}
-
-
-# func_infer_tag arg
-# Infer tagged configuration to use if any are available and
-# if one wasn't chosen via the "--tag" command line option.
-# Only attempt this if the compiler in the base compile
-# command doesn't match the default compiler.
-# arg is usually of the form 'gcc ...'
-func_infer_tag ()
-{
-    $opt_debug
-    if test -n "$available_tags" && test -z "$tagname"; then
-      CC_quoted=
-      for arg in $CC; do
-        func_quote_for_eval "$arg"
-	CC_quoted="$CC_quoted $func_quote_for_eval_result"
-      done
-      CC_expanded=`func_echo_all $CC`
-      CC_quoted_expanded=`func_echo_all $CC_quoted`
-      case $@ in
-      # Blanks in the command may have been stripped by the calling shell,
-      # but not from the CC environment variable when configure was run.
-      " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
-      " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
-      # Blanks at the start of $base_compile will cause this to fail
-      # if we don't check for them as well.
-      *)
-	for z in $available_tags; do
-	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
-	    # Evaluate the configuration.
-	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
-	    CC_quoted=
-	    for arg in $CC; do
-	      # Double-quote args containing other shell metacharacters.
-	      func_quote_for_eval "$arg"
-	      CC_quoted="$CC_quoted $func_quote_for_eval_result"
-	    done
-	    CC_expanded=`func_echo_all $CC`
-	    CC_quoted_expanded=`func_echo_all $CC_quoted`
-	    case "$@ " in
-	    " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
-	    " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
-	      # The compiler in the base compile command matches
-	      # the one in the tagged configuration.
-	      # Assume this is the tagged configuration we want.
-	      tagname=$z
-	      break
-	      ;;
-	    esac
-	  fi
-	done
-	# If $tagname still isn't set, then no tagged configuration
-	# was found and let the user know that the "--tag" command
-	# line option must be used.
-	if test -z "$tagname"; then
-	  func_echo "unable to infer tagged configuration"
-	  func_fatal_error "specify a tag with \`--tag'"
-#	else
-#	  func_verbose "using $tagname tagged configuration"
-	fi
-	;;
-      esac
-    fi
-}
-
-
-
-# func_write_libtool_object output_name pic_name nonpic_name
-# Create a libtool object file (analogous to a ".la" file),
-# but don't create it if we're doing a dry run.
-func_write_libtool_object ()
-{
-    write_libobj=${1}
-    if test "$build_libtool_libs" = yes; then
-      write_lobj=\'${2}\'
-    else
-      write_lobj=none
-    fi
-
-    if test "$build_old_libs" = yes; then
-      write_oldobj=\'${3}\'
-    else
-      write_oldobj=none
-    fi
-
-    $opt_dry_run || {
-      cat >${write_libobj}T <<EOF
-# $write_libobj - a libtool object file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# Name of the PIC object.
-pic_object=$write_lobj
-
-# Name of the non-PIC object
-non_pic_object=$write_oldobj
-
-EOF
-      $MV "${write_libobj}T" "${write_libobj}"
-    }
-}
-
-# func_mode_compile arg...
-func_mode_compile ()
-{
-    $opt_debug
-    # Get the compilation command and the source file.
-    base_compile=
-    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
-    suppress_opt=yes
-    suppress_output=
-    arg_mode=normal
-    libobj=
-    later=
-    pie_flag=
-
-    for arg
-    do
-      case $arg_mode in
-      arg  )
-	# do not "continue".  Instead, add this to base_compile
-	lastarg="$arg"
-	arg_mode=normal
-	;;
-
-      target )
-	libobj="$arg"
-	arg_mode=normal
-	continue
-	;;
-
-      normal )
-	# Accept any command-line options.
-	case $arg in
-	-o)
-	  test -n "$libobj" && \
-	    func_fatal_error "you cannot specify \`-o' more than once"
-	  arg_mode=target
-	  continue
-	  ;;
-
-	-pie | -fpie | -fPIE)
-          pie_flag="$pie_flag $arg"
-	  continue
-	  ;;
-
-	-shared | -static | -prefer-pic | -prefer-non-pic)
-	  later="$later $arg"
-	  continue
-	  ;;
-
-	-no-suppress)
-	  suppress_opt=no
-	  continue
-	  ;;
-
-	-Xcompiler)
-	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
-	  continue      #  The current "srcfile" will either be retained or
-	  ;;            #  replaced later.  I would guess that would be a bug.
-
-	-Wc,*)
-	  func_stripname '-Wc,' '' "$arg"
-	  args=$func_stripname_result
-	  lastarg=
-	  save_ifs="$IFS"; IFS=','
-	  for arg in $args; do
-	    IFS="$save_ifs"
-	    func_quote_for_eval "$arg"
-	    lastarg="$lastarg $func_quote_for_eval_result"
-	  done
-	  IFS="$save_ifs"
-	  func_stripname ' ' '' "$lastarg"
-	  lastarg=$func_stripname_result
-
-	  # Add the arguments to base_compile.
-	  base_compile="$base_compile $lastarg"
-	  continue
-	  ;;
-
-	*)
-	  # Accept the current argument as the source file.
-	  # The previous "srcfile" becomes the current argument.
-	  #
-	  lastarg="$srcfile"
-	  srcfile="$arg"
-	  ;;
-	esac  #  case $arg
-	;;
-      esac    #  case $arg_mode
-
-      # Aesthetically quote the previous argument.
-      func_quote_for_eval "$lastarg"
-      base_compile="$base_compile $func_quote_for_eval_result"
-    done # for arg
-
-    case $arg_mode in
-    arg)
-      func_fatal_error "you must specify an argument for -Xcompile"
-      ;;
-    target)
-      func_fatal_error "you must specify a target with \`-o'"
-      ;;
-    *)
-      # Get the name of the library object.
-      test -z "$libobj" && {
-	func_basename "$srcfile"
-	libobj="$func_basename_result"
-      }
-      ;;
-    esac
-
-    # Recognize several different file suffixes.
-    # If the user specifies -o file.o, it is replaced with file.lo
-    case $libobj in
-    *.[cCFSifmso] | \
-    *.ada | *.adb | *.ads | *.asm | \
-    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
-    *.[fF][09]? | *.for | *.java | *.obj | *.sx | *.cu | *.cup)
-      func_xform "$libobj"
-      libobj=$func_xform_result
-      ;;
-    esac
-
-    case $libobj in
-    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
-    *)
-      func_fatal_error "cannot determine name of library object from \`$libobj'"
-      ;;
-    esac
-
-    func_infer_tag $base_compile
-
-    for arg in $later; do
-      case $arg in
-      -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
-	build_old_libs=no
-	continue
-	;;
-
-      -static)
-	build_libtool_libs=no
-	build_old_libs=yes
-	continue
-	;;
-
-      -prefer-pic)
-	pic_mode=yes
-	continue
-	;;
-
-      -prefer-non-pic)
-	pic_mode=no
-	continue
-	;;
-      esac
-    done
-
-    func_quote_for_eval "$libobj"
-    test "X$libobj" != "X$func_quote_for_eval_result" \
-      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
-      && func_warning "libobj name \`$libobj' may not contain shell special characters."
-    func_dirname_and_basename "$obj" "/" ""
-    objname="$func_basename_result"
-    xdir="$func_dirname_result"
-    lobj=${xdir}$objdir/$objname
-
-    test -z "$base_compile" && \
-      func_fatal_help "you must specify a compilation command"
-
-    # Delete any leftover library objects.
-    if test "$build_old_libs" = yes; then
-      removelist="$obj $lobj $libobj ${libobj}T"
-    else
-      removelist="$lobj $libobj ${libobj}T"
-    fi
-
-    # On Cygwin there's no "real" PIC flag so we must build both object types
-    case $host_os in
-    cygwin* | mingw* | pw32* | os2* | cegcc*)
-      pic_mode=default
-      ;;
-    esac
-    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
-      # non-PIC code in shared libraries is not supported
-      pic_mode=default
-    fi
-
-    # Calculate the filename of the output object if compiler does
-    # not support -o with -c
-    if test "$compiler_c_o" = no; then
-      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
-      lockfile="$output_obj.lock"
-    else
-      output_obj=
-      need_locks=no
-      lockfile=
-    fi
-
-    # Lock this critical section if it is needed
-    # We use this script file to make the link, it avoids creating a new file
-    if test "$need_locks" = yes; then
-      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
-	func_echo "Waiting for $lockfile to be removed"
-	sleep 2
-      done
-    elif test "$need_locks" = warn; then
-      if test -f "$lockfile"; then
-	$ECHO "\
-*** ERROR, $lockfile exists and contains:
-`cat $lockfile 2>/dev/null`
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-      removelist="$removelist $output_obj"
-      $ECHO "$srcfile" > "$lockfile"
-    fi
-
-    $opt_dry_run || $RM $removelist
-    removelist="$removelist $lockfile"
-    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
-
-    if test -n "$fix_srcfile_path"; then
-      eval srcfile=\"$fix_srcfile_path\"
-    fi
-    func_quote_for_eval "$srcfile"
-    qsrcfile=$func_quote_for_eval_result
-
-    # Only build a PIC object if we are building libtool libraries.
-    if test "$build_libtool_libs" = yes; then
-      # Without this assignment, base_compile gets emptied.
-      fbsd_hideous_sh_bug=$base_compile
-
-      if test "$pic_mode" != no; then
-	command="$base_compile $qsrcfile $pic_flag"
-      else
-	# Don't build PIC code
-	command="$base_compile $qsrcfile"
-      fi
-
-      func_mkdir_p "$xdir$objdir"
-
-      if test -z "$output_obj"; then
-	# Place PIC objects in $objdir
-	command="$command -o $lobj"
-      fi
-
-      func_show_eval_locale "$command"	\
-          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
-
-      if test "$need_locks" = warn &&
-	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$ECHO "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-
-      # Just move the object if needed, then go on to compile the next one
-      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
-	func_show_eval '$MV "$output_obj" "$lobj"' \
-	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
-      fi
-
-      # Allow error messages only from the first compilation.
-      if test "$suppress_opt" = yes; then
-	suppress_output=' >/dev/null 2>&1'
-      fi
-    fi
-
-    # Only build a position-dependent object if we build old libraries.
-    if test "$build_old_libs" = yes; then
-      if test "$pic_mode" != yes; then
-	# Don't build PIC code
-	command="$base_compile $qsrcfile$pie_flag"
-      else
-	command="$base_compile $qsrcfile $pic_flag"
-      fi
-      if test "$compiler_c_o" = yes; then
-	command="$command -o $obj"
-      fi
-
-      # Suppress compiler output if we already did a PIC compilation.
-      command="$command$suppress_output"
-      func_show_eval_locale "$command" \
-        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
-
-      if test "$need_locks" = warn &&
-	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$ECHO "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-
-      # Just move the object if needed
-      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
-	func_show_eval '$MV "$output_obj" "$obj"' \
-	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
-      fi
-    fi
-
-    $opt_dry_run || {
-      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
-
-      # Unlock the critical section if it was locked
-      if test "$need_locks" != no; then
-	removelist=$lockfile
-        $RM "$lockfile"
-      fi
-    }
-
-    exit $EXIT_SUCCESS
-}
-
-$opt_help || {
-  test "$mode" = compile && func_mode_compile ${1+"$@"}
-}
-
-func_mode_help ()
-{
-    # We need to display help for each of the modes.
-    case $mode in
-      "")
-        # Generic help is extracted from the usage comments
-        # at the start of this file.
-        func_help
-        ;;
-
-      clean)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
-
-Remove files from the build directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, object or program, all the files associated
-with it are deleted. Otherwise, only FILE itself is deleted using RM."
-        ;;
-
-      compile)
-      $ECHO \
-"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
-
-Compile a source file into a libtool library object.
-
-This mode accepts the following additional options:
-
-  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
-  -no-suppress      do not suppress compiler output for multiple passes
-  -prefer-pic       try to build PIC objects only
-  -prefer-non-pic   try to build non-PIC objects only
-  -shared           do not build a \`.o' file suitable for static linking
-  -static           only build a \`.o' file suitable for static linking
-  -Wc,FLAG          pass FLAG directly to the compiler
-
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
-from the given SOURCEFILE.
-
-The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
-        ;;
-
-      execute)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
-
-Automatically set library path, then run a program.
-
-This mode accepts the following additional options:
-
-  -dlopen FILE      add the directory containing FILE to the library path
-
-This mode sets the library path environment variable according to \`-dlopen'
-flags.
-
-If any of the ARGS are libtool executable wrappers, then they are translated
-into their corresponding uninstalled binary, and any of their required library
-directories are added to the library path.
-
-Then, COMMAND is executed, with ARGS as arguments."
-        ;;
-
-      finish)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
-
-Complete the installation of libtool libraries.
-
-Each LIBDIR is a directory that contains libtool libraries.
-
-The commands that this mode executes may require superuser privileges.  Use
-the \`--dry-run' option if you just want to see what would be executed."
-        ;;
-
-      install)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
-
-Install executables or libraries.
-
-INSTALL-COMMAND is the installation command.  The first component should be
-either the \`install' or \`cp' program.
-
-The following components of INSTALL-COMMAND are treated specially:
-
-  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
-
-The rest of the components are interpreted as arguments to that command (only
-BSD-compatible install options are recognized)."
-        ;;
-
-      link)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
-
-Link object files or libraries together to form another library, or to
-create an executable program.
-
-LINK-COMMAND is a command using the C compiler that you would use to create
-a program from several object files.
-
-The following components of LINK-COMMAND are treated specially:
-
-  -all-static       do not do any dynamic linking at all
-  -avoid-version    do not add a version suffix if possible
-  -bindir BINDIR    specify path to binaries directory (for systems where
-                    libraries must be found in the PATH setting at runtime)
-  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
-  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
-  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
-  -export-symbols SYMFILE
-                    try to export only the symbols listed in SYMFILE
-  -export-symbols-regex REGEX
-                    try to export only the symbols matching REGEX
-  -LLIBDIR          search LIBDIR for required installed libraries
-  -lNAME            OUTPUT-FILE requires the installed library libNAME
-  -module           build a library that can dlopened
-  -no-fast-install  disable the fast-install mode
-  -no-install       link a not-installable executable
-  -no-undefined     declare that a library does not refer to external symbols
-  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
-  -objectlist FILE  Use a list of object files found in FILE to specify objects
-  -precious-files-regex REGEX
-                    don't remove output files matching REGEX
-  -release RELEASE  specify package release information
-  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
-  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
-  -shared           only do dynamic linking of libtool libraries
-  -shrext SUFFIX    override the standard shared library file extension
-  -static           do not do any dynamic linking of uninstalled libtool libraries
-  -static-libtool-libs
-                    do not do any dynamic linking of libtool libraries
-  -version-info CURRENT[:REVISION[:AGE]]
-                    specify library version info [each variable defaults to 0]
-  -weak LIBNAME     declare that the target provides the LIBNAME interface
-  -Wc,FLAG
-  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
-  -Wl,FLAG
-  -Xlinker FLAG     pass linker-specific FLAG directly to the linker
-  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
-
-All other options (arguments beginning with \`-') are ignored.
-
-Every other argument is treated as a filename.  Files ending in \`.la' are
-treated as uninstalled libtool libraries, other files are standard or library
-object files.
-
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
-required, except when creating a convenience library.
-
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
-
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
-is created, otherwise an executable program is created."
-        ;;
-
-      uninstall)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
-
-Remove libraries from an installation directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, all the files associated with it are deleted.
-Otherwise, only FILE itself is deleted using RM."
-        ;;
-
-      *)
-        func_fatal_help "invalid operation mode \`$mode'"
-        ;;
-    esac
-
-    echo
-    $ECHO "Try \`$progname --help' for more information about other modes."
-}
-
-# Now that we've collected a possible --mode arg, show help if necessary
-if $opt_help; then
-  if test "$opt_help" = :; then
-    func_mode_help
-  else
-    {
-      func_help noexit
-      for mode in compile link execute install finish uninstall clean; do
-	func_mode_help
-      done
-    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
-    {
-      func_help noexit
-      for mode in compile link execute install finish uninstall clean; do
-	echo
-	func_mode_help
-      done
-    } |
-    sed '1d
-      /^When reporting/,/^Report/{
-	H
-	d
-      }
-      $x
-      /information about other modes/d
-      /more detailed .*MODE/d
-      s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
-  fi
-  exit $?
-fi
-
-
-# func_mode_execute arg...
-func_mode_execute ()
-{
-    $opt_debug
-    # The first argument is the command name.
-    cmd="$nonopt"
-    test -z "$cmd" && \
-      func_fatal_help "you must specify a COMMAND"
-
-    # Handle -dlopen flags immediately.
-    for file in $execute_dlfiles; do
-      test -f "$file" \
-	|| func_fatal_help "\`$file' is not a file"
-
-      dir=
-      case $file in
-      *.la)
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$lib' is not a valid libtool archive"
-
-	# Read the libtool library.
-	dlname=
-	library_names=
-	func_source "$file"
-
-	# Skip this library if it cannot be dlopened.
-	if test -z "$dlname"; then
-	  # Warn if it was a shared library.
-	  test -n "$library_names" && \
-	    func_warning "\`$file' was not linked with \`-export-dynamic'"
-	  continue
-	fi
-
-	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
-
-	if test -f "$dir/$objdir/$dlname"; then
-	  dir="$dir/$objdir"
-	else
-	  if test ! -f "$dir/$dlname"; then
-	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
-	  fi
-	fi
-	;;
-
-      *.lo)
-	# Just add the directory containing the .lo file.
-	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
-	;;
-
-      *)
-	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
-	continue
-	;;
-      esac
-
-      # Get the absolute pathname.
-      absdir=`cd "$dir" && pwd`
-      test -n "$absdir" && dir="$absdir"
-
-      # Now add the directory to shlibpath_var.
-      if eval "test -z \"\$$shlibpath_var\""; then
-	eval "$shlibpath_var=\"\$dir\""
-      else
-	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
-      fi
-    done
-
-    # This variable tells wrapper scripts just to set shlibpath_var
-    # rather than running their programs.
-    libtool_execute_magic="$magic"
-
-    # Check if any of the arguments is a wrapper script.
-    args=
-    for file
-    do
-      case $file in
-      -* | *.la | *.lo ) ;;
-      *)
-	# Do a test to see if this is really a libtool program.
-	if func_ltwrapper_script_p "$file"; then
-	  func_source "$file"
-	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
-	elif func_ltwrapper_executable_p "$file"; then
-	  func_ltwrapper_scriptname "$file"
-	  func_source "$func_ltwrapper_scriptname_result"
-	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
-	fi
-	;;
-      esac
-      # Quote arguments (to preserve shell metacharacters).
-      func_quote_for_eval "$file"
-      args="$args $func_quote_for_eval_result"
-    done
-
-    if test "X$opt_dry_run" = Xfalse; then
-      if test -n "$shlibpath_var"; then
-	# Export the shlibpath_var.
-	eval "export $shlibpath_var"
-      fi
-
-      # Restore saved environment variables
-      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-      do
-	eval "if test \"\${save_$lt_var+set}\" = set; then
-                $lt_var=\$save_$lt_var; export $lt_var
-	      else
-		$lt_unset $lt_var
-	      fi"
-      done
-
-      # Now prepare to actually exec the command.
-      exec_cmd="\$cmd$args"
-    else
-      # Display what would be done.
-      if test -n "$shlibpath_var"; then
-	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
-	echo "export $shlibpath_var"
-      fi
-      $ECHO "$cmd$args"
-      exit $EXIT_SUCCESS
-    fi
-}
-
-test "$mode" = execute && func_mode_execute ${1+"$@"}
-
-
-# func_mode_finish arg...
-func_mode_finish ()
-{
-    $opt_debug
-    libdirs="$nonopt"
-    admincmds=
-
-    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
-      for dir
-      do
-	libdirs="$libdirs $dir"
-      done
-
-      for libdir in $libdirs; do
-	if test -n "$finish_cmds"; then
-	  # Do each command in the finish commands.
-	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
-'"$cmd"'"'
-	fi
-	if test -n "$finish_eval"; then
-	  # Do the single finish_eval.
-	  eval cmds=\"$finish_eval\"
-	  $opt_dry_run || eval "$cmds" || admincmds="$admincmds
-       $cmds"
-	fi
-      done
-    fi
-
-    # Exit here if they wanted silent mode.
-    $opt_silent && exit $EXIT_SUCCESS
-
-    echo "----------------------------------------------------------------------"
-    echo "Libraries have been installed in:"
-    for libdir in $libdirs; do
-      $ECHO "   $libdir"
-    done
-    echo
-    echo "If you ever happen to want to link against installed libraries"
-    echo "in a given directory, LIBDIR, you must either use libtool, and"
-    echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
-    echo "flag during linking and do at least one of the following:"
-    if test -n "$shlibpath_var"; then
-      echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
-      echo "     during execution"
-    fi
-    if test -n "$runpath_var"; then
-      echo "   - add LIBDIR to the \`$runpath_var' environment variable"
-      echo "     during linking"
-    fi
-    if test -n "$hardcode_libdir_flag_spec"; then
-      libdir=LIBDIR
-      eval flag=\"$hardcode_libdir_flag_spec\"
-
-      $ECHO "   - use the \`$flag' linker flag"
-    fi
-    if test -n "$admincmds"; then
-      $ECHO "   - have your system administrator run these commands:$admincmds"
-    fi
-    if test -f /etc/ld.so.conf; then
-      echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
-    fi
-    echo
-
-    echo "See any operating system documentation about shared libraries for"
-    case $host in
-      solaris2.[6789]|solaris2.1[0-9])
-        echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
-	echo "pages."
-	;;
-      *)
-        echo "more information, such as the ld(1) and ld.so(8) manual pages."
-        ;;
-    esac
-    echo "----------------------------------------------------------------------"
-    exit $EXIT_SUCCESS
-}
-
-test "$mode" = finish && func_mode_finish ${1+"$@"}
-
-
-# func_mode_install arg...
-func_mode_install ()
-{
-    $opt_debug
-    # There may be an optional sh(1) argument at the beginning of
-    # install_prog (especially on Windows NT).
-    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
-       # Allow the use of GNU shtool's install command.
-       case $nonopt in *shtool*) :;; *) false;; esac; then
-      # Aesthetically quote it.
-      func_quote_for_eval "$nonopt"
-      install_prog="$func_quote_for_eval_result "
-      arg=$1
-      shift
-    else
-      install_prog=
-      arg=$nonopt
-    fi
-
-    # The real first argument should be the name of the installation program.
-    # Aesthetically quote it.
-    func_quote_for_eval "$arg"
-    install_prog="$install_prog$func_quote_for_eval_result"
-    install_shared_prog=$install_prog
-    case " $install_prog " in
-      *[\\\ /]cp\ *) install_cp=: ;;
-      *) install_cp=false ;;
-    esac
-
-    # We need to accept at least all the BSD install flags.
-    dest=
-    files=
-    opts=
-    prev=
-    install_type=
-    isdir=no
-    stripme=
-    no_mode=:
-    for arg
-    do
-      arg2=
-      if test -n "$dest"; then
-	files="$files $dest"
-	dest=$arg
-	continue
-      fi
-
-      case $arg in
-      -d) isdir=yes ;;
-      -f)
-	if $install_cp; then :; else
-	  prev=$arg
-	fi
-	;;
-      -g | -m | -o)
-	prev=$arg
-	;;
-      -s)
-	stripme=" -s"
-	continue
-	;;
-      -*)
-	;;
-      *)
-	# If the previous option needed an argument, then skip it.
-	if test -n "$prev"; then
-	  if test "x$prev" = x-m && test -n "$install_override_mode"; then
-	    arg2=$install_override_mode
-	    no_mode=false
-	  fi
-	  prev=
-	else
-	  dest=$arg
-	  continue
-	fi
-	;;
-      esac
-
-      # Aesthetically quote the argument.
-      func_quote_for_eval "$arg"
-      install_prog="$install_prog $func_quote_for_eval_result"
-      if test -n "$arg2"; then
-	func_quote_for_eval "$arg2"
-      fi
-      install_shared_prog="$install_shared_prog $func_quote_for_eval_result"
-    done
-
-    test -z "$install_prog" && \
-      func_fatal_help "you must specify an install program"
-
-    test -n "$prev" && \
-      func_fatal_help "the \`$prev' option requires an argument"
-
-    if test -n "$install_override_mode" && $no_mode; then
-      if $install_cp; then :; else
-	func_quote_for_eval "$install_override_mode"
-	install_shared_prog="$install_shared_prog -m $func_quote_for_eval_result"
-      fi
-    fi
-
-    if test -z "$files"; then
-      if test -z "$dest"; then
-	func_fatal_help "no file or destination specified"
-      else
-	func_fatal_help "you must specify a destination"
-      fi
-    fi
-
-    # Strip any trailing slash from the destination.
-    func_stripname '' '/' "$dest"
-    dest=$func_stripname_result
-
-    # Check to see that the destination is a directory.
-    test -d "$dest" && isdir=yes
-    if test "$isdir" = yes; then
-      destdir="$dest"
-      destname=
-    else
-      func_dirname_and_basename "$dest" "" "."
-      destdir="$func_dirname_result"
-      destname="$func_basename_result"
-
-      # Not a directory, so check to see that there is only one file specified.
-      set dummy $files; shift
-      test "$#" -gt 1 && \
-	func_fatal_help "\`$dest' is not a directory"
-    fi
-    case $destdir in
-    [\\/]* | [A-Za-z]:[\\/]*) ;;
-    *)
-      for file in $files; do
-	case $file in
-	*.lo) ;;
-	*)
-	  func_fatal_help "\`$destdir' must be an absolute directory name"
-	  ;;
-	esac
-      done
-      ;;
-    esac
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    staticlibs=
-    future_libdirs=
-    current_libdirs=
-    for file in $files; do
-
-      # Do each installation.
-      case $file in
-      *.$libext)
-	# Do the static libraries later.
-	staticlibs="$staticlibs $file"
-	;;
-
-      *.la)
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$file' is not a valid libtool archive"
-
-	library_names=
-	old_library=
-	relink_command=
-	func_source "$file"
-
-	# Add the libdir to current_libdirs if it is the destination.
-	if test "X$destdir" = "X$libdir"; then
-	  case "$current_libdirs " in
-	  *" $libdir "*) ;;
-	  *) current_libdirs="$current_libdirs $libdir" ;;
-	  esac
-	else
-	  # Note the libdir as a future libdir.
-	  case "$future_libdirs " in
-	  *" $libdir "*) ;;
-	  *) future_libdirs="$future_libdirs $libdir" ;;
-	  esac
-	fi
-
-	func_dirname "$file" "/" ""
-	dir="$func_dirname_result"
-	dir="$dir$objdir"
-
-	if test -n "$relink_command"; then
-	  # Determine the prefix the user has applied to our future dir.
-	  inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
-
-	  # Don't allow the user to place us outside of our expected
-	  # location b/c this prevents finding dependent libraries that
-	  # are installed to the same prefix.
-	  # At present, this check doesn't affect windows .dll's that
-	  # are installed into $libdir/../bin (currently, that works fine)
-	  # but it's something to keep an eye on.
-	  test "$inst_prefix_dir" = "$destdir" && \
-	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
-
-	  if test -n "$inst_prefix_dir"; then
-	    # Stick the inst_prefix_dir data into the link command.
-	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
-	  else
-	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
-	  fi
-
-	  func_warning "relinking \`$file'"
-	  func_show_eval "$relink_command" \
-	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
-	fi
-
-	# See the names of the shared library.
-	set dummy $library_names; shift
-	if test -n "$1"; then
-	  realname="$1"
-	  shift
-
-	  srcname="$realname"
-	  test -n "$relink_command" && srcname="$realname"T
-
-	  # Install the shared library and build the symlinks.
-	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
-	      'exit $?'
-	  tstripme="$stripme"
-	  case $host_os in
-	  cygwin* | mingw* | pw32* | cegcc*)
-	    case $realname in
-	    *.dll.a)
-	      tstripme=""
-	      ;;
-	    esac
-	    ;;
-	  esac
-	  if test -n "$tstripme" && test -n "$striplib"; then
-	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
-	  fi
-
-	  if test "$#" -gt 0; then
-	    # Delete the old symlinks, and create new ones.
-	    # Try `ln -sf' first, because the `ln' binary might depend on
-	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
-	    # so we also need to try rm && ln -s.
-	    for linkname
-	    do
-	      test "$linkname" != "$realname" \
-		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
-	    done
-	  fi
-
-	  # Do each command in the postinstall commands.
-	  lib="$destdir/$realname"
-	  func_execute_cmds "$postinstall_cmds" 'exit $?'
-	fi
-
-	# Install the pseudo-library for information purposes.
-	func_basename "$file"
-	name="$func_basename_result"
-	instname="$dir/$name"i
-	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
-
-	# Maybe install the static library, too.
-	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
-	;;
-
-      *.lo)
-	# Install (i.e. copy) a libtool object.
-
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
-	else
-	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
-	fi
-
-	# Deduce the name of the destination old-style object file.
-	case $destfile in
-	*.lo)
-	  func_lo2o "$destfile"
-	  staticdest=$func_lo2o_result
-	  ;;
-	*.$objext)
-	  staticdest="$destfile"
-	  destfile=
-	  ;;
-	*)
-	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
-	  ;;
-	esac
-
-	# Install the libtool object if requested.
-	test -n "$destfile" && \
-	  func_show_eval "$install_prog $file $destfile" 'exit $?'
-
-	# Install the old object if enabled.
-	if test "$build_old_libs" = yes; then
-	  # Deduce the name of the old-style object file.
-	  func_lo2o "$file"
-	  staticobj=$func_lo2o_result
-	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
-	fi
-	exit $EXIT_SUCCESS
-	;;
-
-      *)
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
-	else
-	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
-	fi
-
-	# If the file is missing, and there is a .exe on the end, strip it
-	# because it is most likely a libtool script we actually want to
-	# install
-	stripped_ext=""
-	case $file in
-	  *.exe)
-	    if test ! -f "$file"; then
-	      func_stripname '' '.exe' "$file"
-	      file=$func_stripname_result
-	      stripped_ext=".exe"
-	    fi
-	    ;;
-	esac
-
-	# Do a test to see if this is really a libtool program.
-	case $host in
-	*cygwin* | *mingw*)
-	    if func_ltwrapper_executable_p "$file"; then
-	      func_ltwrapper_scriptname "$file"
-	      wrapper=$func_ltwrapper_scriptname_result
-	    else
-	      func_stripname '' '.exe' "$file"
-	      wrapper=$func_stripname_result
-	    fi
-	    ;;
-	*)
-	    wrapper=$file
-	    ;;
-	esac
-	if func_ltwrapper_script_p "$wrapper"; then
-	  notinst_deplibs=
-	  relink_command=
-
-	  func_source "$wrapper"
-
-	  # Check the variables that should have been set.
-	  test -z "$generated_by_libtool_version" && \
-	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
-
-	  finalize=yes
-	  for lib in $notinst_deplibs; do
-	    # Check to see that each library is installed.
-	    libdir=
-	    if test -f "$lib"; then
-	      func_source "$lib"
-	    fi
-	    libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
-	    if test -n "$libdir" && test ! -f "$libfile"; then
-	      func_warning "\`$lib' has not been installed in \`$libdir'"
-	      finalize=no
-	    fi
-	  done
-
-	  relink_command=
-	  func_source "$wrapper"
-
-	  outputname=
-	  if test "$fast_install" = no && test -n "$relink_command"; then
-	    $opt_dry_run || {
-	      if test "$finalize" = yes; then
-	        tmpdir=`func_mktempdir`
-		func_basename "$file$stripped_ext"
-		file="$func_basename_result"
-	        outputname="$tmpdir/$file"
-	        # Replace the output file specification.
-	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
-
-	        $opt_silent || {
-	          func_quote_for_expand "$relink_command"
-		  eval "func_echo $func_quote_for_expand_result"
-	        }
-	        if eval "$relink_command"; then :
-	          else
-		  func_error "error: relink \`$file' with the above command before installing it"
-		  $opt_dry_run || ${RM}r "$tmpdir"
-		  continue
-	        fi
-	        file="$outputname"
-	      else
-	        func_warning "cannot relink \`$file'"
-	      fi
-	    }
-	  else
-	    # Install the binary that we compiled earlier.
-	    file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
-	  fi
-	fi
-
-	# remove .exe since cygwin /usr/bin/install will append another
-	# one anyway
-	case $install_prog,$host in
-	*/usr/bin/install*,*cygwin*)
-	  case $file:$destfile in
-	  *.exe:*.exe)
-	    # this is ok
-	    ;;
-	  *.exe:*)
-	    destfile=$destfile.exe
-	    ;;
-	  *:*.exe)
-	    func_stripname '' '.exe' "$destfile"
-	    destfile=$func_stripname_result
-	    ;;
-	  esac
-	  ;;
-	esac
-	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
-	$opt_dry_run || if test -n "$outputname"; then
-	  ${RM}r "$tmpdir"
-	fi
-	;;
-      esac
-    done
-
-    for file in $staticlibs; do
-      func_basename "$file"
-      name="$func_basename_result"
-
-      # Set up the ranlib parameters.
-      oldlib="$destdir/$name"
-
-      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
-
-      if test -n "$stripme" && test -n "$old_striplib"; then
-	func_show_eval "$old_striplib $oldlib" 'exit $?'
-      fi
-
-      # Do each command in the postinstall commands.
-      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
-    done
-
-    test -n "$future_libdirs" && \
-      func_warning "remember to run \`$progname --finish$future_libdirs'"
-
-    if test -n "$current_libdirs"; then
-      # Maybe just do a dry run.
-      $opt_dry_run && current_libdirs=" -n$current_libdirs"
-      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
-    else
-      exit $EXIT_SUCCESS
-    fi
-}
-
-test "$mode" = install && func_mode_install ${1+"$@"}
-
-
-# func_generate_dlsyms outputname originator pic_p
-# Extract symbols from dlprefiles and create ${outputname}S.o with
-# a dlpreopen symbol table.
-func_generate_dlsyms ()
-{
-    $opt_debug
-    my_outputname="$1"
-    my_originator="$2"
-    my_pic_p="${3-no}"
-    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
-    my_dlsyms=
-
-    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-      if test -n "$NM" && test -n "$global_symbol_pipe"; then
-	my_dlsyms="${my_outputname}S.c"
-      else
-	func_error "not configured to extract global symbols from dlpreopened files"
-      fi
-    fi
-
-    if test -n "$my_dlsyms"; then
-      case $my_dlsyms in
-      "") ;;
-      *.c)
-	# Discover the nlist of each of the dlfiles.
-	nlist="$output_objdir/${my_outputname}.nm"
-
-	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
-
-	# Parse the name list into a source file.
-	func_verbose "creating $output_objdir/$my_dlsyms"
-
-	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
-/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
-/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
-
-#ifdef __cplusplus
-extern \"C\" {
-#endif
-
-#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
-#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
-#endif
-
-/* External symbol declarations for the compiler. */\
-"
-
-	if test "$dlself" = yes; then
-	  func_verbose "generating symbol list for \`$output'"
-
-	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
-
-	  # Add our own program objects to the symbol list.
-	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
-	  for progfile in $progfiles; do
-	    func_verbose "extracting global C symbols from \`$progfile'"
-	    $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'"
-	  done
-
-	  if test -n "$exclude_expsyms"; then
-	    $opt_dry_run || {
-	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
-	      eval '$MV "$nlist"T "$nlist"'
-	    }
-	  fi
-
-	  if test -n "$export_symbols_regex"; then
-	    $opt_dry_run || {
-	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
-	      eval '$MV "$nlist"T "$nlist"'
-	    }
-	  fi
-
-	  # Prepare the list of exported symbols
-	  if test -z "$export_symbols"; then
-	    export_symbols="$output_objdir/$outputname.exp"
-	    $opt_dry_run || {
-	      $RM $export_symbols
-	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
-	      case $host in
-	      *cygwin* | *mingw* | *cegcc* )
-                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
-                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
-	        ;;
-	      esac
-	    }
-	  else
-	    $opt_dry_run || {
-	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
-	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
-	      eval '$MV "$nlist"T "$nlist"'
-	      case $host in
-	        *cygwin* | *mingw* | *cegcc* )
-	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
-	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
-	          ;;
-	      esac
-	    }
-	  fi
-	fi
-
-	for dlprefile in $dlprefiles; do
-	  func_verbose "extracting global C symbols from \`$dlprefile'"
-	  func_basename "$dlprefile"
-	  name="$func_basename_result"
-	  $opt_dry_run || {
-	    eval '$ECHO ": $name " >> "$nlist"'
-	    eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'"
-	  }
-	done
-
-	$opt_dry_run || {
-	  # Make sure we have at least an empty file.
-	  test -f "$nlist" || : > "$nlist"
-
-	  if test -n "$exclude_expsyms"; then
-	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
-	    $MV "$nlist"T "$nlist"
-	  fi
-
-	  # Try sorting and uniquifying the output.
-	  if $GREP -v "^: " < "$nlist" |
-	      if sort -k 3 </dev/null >/dev/null 2>&1; then
-		sort -k 3
-	      else
-		sort +2
-	      fi |
-	      uniq > "$nlist"S; then
-	    :
-	  else
-	    $GREP -v "^: " < "$nlist" > "$nlist"S
-	  fi
-
-	  if test -f "$nlist"S; then
-	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
-	  else
-	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
-	  fi
-
-	  echo >> "$output_objdir/$my_dlsyms" "\
-
-/* The mapping between symbol names and symbols.  */
-typedef struct {
-  const char *name;
-  void *address;
-} lt_dlsymlist;
-"
-	  case $host in
-	  *cygwin* | *mingw* | *cegcc* )
-	    echo >> "$output_objdir/$my_dlsyms" "\
-/* DATA imports from DLLs on WIN32 con't be const, because
-   runtime relocations are performed -- see ld's documentation
-   on pseudo-relocs.  */"
-	    lt_dlsym_const= ;;
-	  *osf5*)
-	    echo >> "$output_objdir/$my_dlsyms" "\
-/* This system does not cope well with relocations in const data */"
-	    lt_dlsym_const= ;;
-	  *)
-	    lt_dlsym_const=const ;;
-	  esac
-
-	  echo >> "$output_objdir/$my_dlsyms" "\
-extern $lt_dlsym_const lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[];
-$lt_dlsym_const lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[] =
-{\
-  { \"$my_originator\", (void *) 0 },"
-
-	  case $need_lib_prefix in
-	  no)
-	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
-	    ;;
-	  *)
-	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
-	    ;;
-	  esac
-	  echo >> "$output_objdir/$my_dlsyms" "\
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt_${my_prefix}_LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif\
-"
-	} # !$opt_dry_run
-
-	pic_flag_for_symtable=
-	case "$compile_command " in
-	*" -static "*) ;;
-	*)
-	  case $host in
-	  # compiling the symbol table file with pic_flag works around
-	  # a FreeBSD bug that causes programs to crash when -lm is
-	  # linked before any other PIC object.  But we must not use
-	  # pic_flag when linking with -static.  The problem exists in
-	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
-	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
-	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
-	  *-*-hpux*)
-	    pic_flag_for_symtable=" $pic_flag"  ;;
-	  *)
-	    if test "X$my_pic_p" != Xno; then
-	      pic_flag_for_symtable=" $pic_flag"
-	    fi
-	    ;;
-	  esac
-	  ;;
-	esac
-	symtab_cflags=
-	for arg in $LTCFLAGS; do
-	  case $arg in
-	  -pie | -fpie | -fPIE) ;;
-	  *) symtab_cflags="$symtab_cflags $arg" ;;
-	  esac
-	done
-
-	# Now compile the dynamic symbol file.
-	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
-
-	# Clean up the generated files.
-	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
-
-	# Transform the symbol file into the correct name.
-	symfileobj="$output_objdir/${my_outputname}S.$objext"
-	case $host in
-	*cygwin* | *mingw* | *cegcc* )
-	  if test -f "$output_objdir/$my_outputname.def"; then
-	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
-	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
-	  else
-	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	  fi
-	  ;;
-	*)
-	  compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	  finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	  ;;
-	esac
-	;;
-      *)
-	func_fatal_error "unknown suffix for \`$my_dlsyms'"
-	;;
-      esac
-    else
-      # We keep going just in case the user didn't refer to
-      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
-      # really was required.
-
-      # Nullify the symbol file.
-      compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
-      finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
-    fi
-}
-
-# func_win32_libid arg
-# return the library type of file 'arg'
-#
-# Need a lot of goo to handle *both* DLLs and import libs
-# Has to be a shell function in order to 'eat' the argument
-# that is supplied when $file_magic_command is called.
-# Despite the name, also deal with 64 bit binaries.
-func_win32_libid ()
-{
-  $opt_debug
-  win32_libid_type="unknown"
-  win32_fileres=`file -L $1 2>/dev/null`
-  case $win32_fileres in
-  *ar\ archive\ import\ library*) # definitely import
-    win32_libid_type="x86 archive import"
-    ;;
-  *ar\ archive*) # could be an import, or static
-    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
-    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
-       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
-      win32_nmres=`eval $NM -f posix -A $1 |
-	$SED -n -e '
-	    1,100{
-		/ I /{
-		    s,.*,import,
-		    p
-		    q
-		}
-	    }'`
-      case $win32_nmres in
-      import*)  win32_libid_type="x86 archive import";;
-      *)        win32_libid_type="x86 archive static";;
-      esac
-    fi
-    ;;
-  *DLL*)
-    win32_libid_type="x86 DLL"
-    ;;
-  *executable*) # but shell scripts are "executable" too...
-    case $win32_fileres in
-    *MS\ Windows\ PE\ Intel*)
-      win32_libid_type="x86 DLL"
-      ;;
-    esac
-    ;;
-  esac
-  $ECHO "$win32_libid_type"
-}
-
-
-
-# func_extract_an_archive dir oldlib
-func_extract_an_archive ()
-{
-    $opt_debug
-    f_ex_an_ar_dir="$1"; shift
-    f_ex_an_ar_oldlib="$1"
-    if test "$lock_old_archive_extraction" = yes; then
-      lockfile=$f_ex_an_ar_oldlib.lock
-      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
-	func_echo "Waiting for $lockfile to be removed"
-	sleep 2
-      done
-    fi
-    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
-		   'stat=$?; rm -f "$lockfile"; exit $stat'
-    if test "$lock_old_archive_extraction" = yes; then
-      $opt_dry_run || rm -f "$lockfile"
-    fi
-    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
-     :
-    else
-      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
-    fi
-}
-
-
-# func_extract_archives gentop oldlib ...
-func_extract_archives ()
-{
-    $opt_debug
-    my_gentop="$1"; shift
-    my_oldlibs=${1+"$@"}
-    my_oldobjs=""
-    my_xlib=""
-    my_xabs=""
-    my_xdir=""
-
-    for my_xlib in $my_oldlibs; do
-      # Extract the objects.
-      case $my_xlib in
-	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
-	*) my_xabs=`pwd`"/$my_xlib" ;;
-      esac
-      func_basename "$my_xlib"
-      my_xlib="$func_basename_result"
-      my_xlib_u=$my_xlib
-      while :; do
-        case " $extracted_archives " in
-	*" $my_xlib_u "*)
-	  func_arith $extracted_serial + 1
-	  extracted_serial=$func_arith_result
-	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
-	*) break ;;
-	esac
-      done
-      extracted_archives="$extracted_archives $my_xlib_u"
-      my_xdir="$my_gentop/$my_xlib_u"
-
-      func_mkdir_p "$my_xdir"
-
-      case $host in
-      *-darwin*)
-	func_verbose "Extracting $my_xabs"
-	# Do not bother doing anything if just a dry run
-	$opt_dry_run || {
-	  darwin_orig_dir=`pwd`
-	  cd $my_xdir || exit $?
-	  darwin_archive=$my_xabs
-	  darwin_curdir=`pwd`
-	  darwin_base_archive=`basename "$darwin_archive"`
-	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
-	  if test -n "$darwin_arches"; then
-	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
-	    darwin_arch=
-	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
-	    for darwin_arch in  $darwin_arches ; do
-	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
-	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
-	      cd "$darwin_curdir"
-	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
-	    done # $darwin_arches
-            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
-	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
-	    darwin_file=
-	    darwin_files=
-	    for darwin_file in $darwin_filelist; do
-	      darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
-	      $LIPO -create -output "$darwin_file" $darwin_files
-	    done # $darwin_filelist
-	    $RM -rf unfat-$$
-	    cd "$darwin_orig_dir"
-	  else
-	    cd $darwin_orig_dir
-	    func_extract_an_archive "$my_xdir" "$my_xabs"
-	  fi # $darwin_arches
-	} # !$opt_dry_run
-	;;
-      *)
-        func_extract_an_archive "$my_xdir" "$my_xabs"
-	;;
-      esac
-      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
-    done
-
-    func_extract_archives_result="$my_oldobjs"
-}
-
-
-# func_emit_wrapper [arg=no]
-#
-# Emit a libtool wrapper script on stdout.
-# Don't directly open a file because we may want to
-# incorporate the script contents within a cygwin/mingw
-# wrapper executable.  Must ONLY be called from within
-# func_mode_link because it depends on a number of variables
-# set therein.
-#
-# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
-# variable will take.  If 'yes', then the emitted script
-# will assume that the directory in which it is stored is
-# the $objdir directory.  This is a cygwin/mingw-specific
-# behavior.
-func_emit_wrapper ()
-{
-	func_emit_wrapper_arg1=${1-no}
-
-	$ECHO "\
-#! $SHELL
-
-# $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# The $output program cannot be directly executed until all the libtool
-# libraries that it depends on are installed.
-#
-# This wrapper script should never be moved out of the build directory.
-# If it is, it will not operate correctly.
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-sed_quote_subst='$sed_quote_subst'
-
-# Be Bourne compatible
-if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '\${1+\"\$@\"}'='\"\$@\"'
-  setopt NO_GLOB_SUBST
-else
-  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-relink_command=\"$relink_command\"
-
-# This environment variable determines our operation mode.
-if test \"\$libtool_install_magic\" = \"$magic\"; then
-  # install mode needs the following variables:
-  generated_by_libtool_version='$macro_version'
-  notinst_deplibs='$notinst_deplibs'
-else
-  # When we are sourced in execute mode, \$file and \$ECHO are already set.
-  if test \"\$libtool_execute_magic\" != \"$magic\"; then
-    file=\"\$0\""
-
-    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
-    $ECHO "\
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-\$1
-_LTECHO_EOF'
-}
-    ECHO=\"$qECHO\"
-  fi
-
-# Very basic option parsing. These options are (a) specific to
-# the libtool wrapper, (b) are identical between the wrapper
-# /script/ and the wrapper /executable/ which is used only on
-# windows platforms, and (c) all begin with the string "--lt-"
-# (application programs are unlikely to have options which match
-# this pattern).
-#
-# There are only two supported options: --lt-debug and
-# --lt-dump-script. There is, deliberately, no --lt-help.
-#
-# The first argument to this parsing function should be the
-# script's $0 value, followed by "$@".
-lt_option_debug=
-func_parse_lt_options ()
-{
-  lt_script_arg0=\$0
-  shift
-  for lt_opt
-  do
-    case \"\$lt_opt\" in
-    --lt-debug) lt_option_debug=1 ;;
-    --lt-dump-script)
-        lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
-        test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
-        lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
-        cat \"\$lt_dump_D/\$lt_dump_F\"
-        exit 0
-      ;;
-    --lt-*)
-        \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
-        exit 1
-      ;;
-    esac
-  done
-
-  # Print the debug banner immediately:
-  if test -n \"\$lt_option_debug\"; then
-    echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
-  fi
-}
-
-# Used when --lt-debug. Prints its arguments to stdout
-# (redirection is the responsibility of the caller)
-func_lt_dump_args ()
-{
-  lt_dump_args_N=1;
-  for lt_arg
-  do
-    \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
-    lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
-  done
-}
-
-# Core function for launching the target application
-func_exec_program_core ()
-{
-"
-  case $host in
-  # Backslashes separate directories on plain windows
-  *-*-mingw | *-*-os2* | *-cegcc*)
-    $ECHO "\
-      if test -n \"\$lt_option_debug\"; then
-        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
-        func_lt_dump_args \${1+\"\$@\"} 1>&2
-      fi
-      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
-"
-    ;;
-
-  *)
-    $ECHO "\
-      if test -n \"\$lt_option_debug\"; then
-        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
-        func_lt_dump_args \${1+\"\$@\"} 1>&2
-      fi
-      exec \"\$progdir/\$program\" \${1+\"\$@\"}
-"
-    ;;
-  esac
-  $ECHO "\
-      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
-      exit 1
-}
-
-# A function to encapsulate launching the target application
-# Strips options in the --lt-* namespace from \$@ and
-# launches target application with the remaining arguments.
-func_exec_program ()
-{
-  for lt_wr_arg
-  do
-    case \$lt_wr_arg in
-    --lt-*) ;;
-    *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
-    esac
-    shift
-  done
-  func_exec_program_core \${1+\"\$@\"}
-}
-
-  # Parse options
-  func_parse_lt_options \"\$0\" \${1+\"\$@\"}
-
-  # Find the directory that this script lives in.
-  thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
-  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
-
-  # Follow symbolic links until we get to the real thisdir.
-  file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
-  while test -n \"\$file\"; do
-    destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
-
-    # If there was a directory component, then change thisdir.
-    if test \"x\$destdir\" != \"x\$file\"; then
-      case \"\$destdir\" in
-      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
-      *) thisdir=\"\$thisdir/\$destdir\" ;;
-      esac
-    fi
-
-    file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
-    file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
-  done
-
-  # Usually 'no', except on cygwin/mingw when embedded into
-  # the cwrapper.
-  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
-  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
-    # special case for '.'
-    if test \"\$thisdir\" = \".\"; then
-      thisdir=\`pwd\`
-    fi
-    # remove .libs from thisdir
-    case \"\$thisdir\" in
-    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
-    $objdir )   thisdir=. ;;
-    esac
-  fi
-
-  # Try to get the absolute directory name.
-  absdir=\`cd \"\$thisdir\" && pwd\`
-  test -n \"\$absdir\" && thisdir=\"\$absdir\"
-"
-
-	if test "$fast_install" = yes; then
-	  $ECHO "\
-  program=lt-'$outputname'$exeext
-  progdir=\"\$thisdir/$objdir\"
-
-  if test ! -f \"\$progdir/\$program\" ||
-     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
-       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
-
-    file=\"\$\$-\$program\"
-
-    if test ! -d \"\$progdir\"; then
-      $MKDIR \"\$progdir\"
-    else
-      $RM \"\$progdir/\$file\"
-    fi"
-
-	  $ECHO "\
-
-    # relink executable if necessary
-    if test -n \"\$relink_command\"; then
-      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
-      else
-	$ECHO \"\$relink_command_output\" >&2
-	$RM \"\$progdir/\$file\"
-	exit 1
-      fi
-    fi
-
-    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
-    { $RM \"\$progdir/\$program\";
-      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
-    $RM \"\$progdir/\$file\"
-  fi"
-	else
-	  $ECHO "\
-  program='$outputname'
-  progdir=\"\$thisdir/$objdir\"
-"
-	fi
-
-	$ECHO "\
-
-  if test -f \"\$progdir/\$program\"; then"
-
-	# Export our shlibpath_var if we have one.
-	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-	  $ECHO "\
-    # Add our own library path to $shlibpath_var
-    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
-
-    # Some systems cannot cope with colon-terminated $shlibpath_var
-    # The second colon is a workaround for a bug in BeOS R4 sed
-    $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
-
-    export $shlibpath_var
-"
-	fi
-
-	# fixup the dll searchpath if we need to.
-	if test -n "$dllsearchpath"; then
-	  $ECHO "\
-    # Add the dll search path components to the executable PATH
-    PATH=$dllsearchpath:\$PATH
-"
-	fi
-
-	$ECHO "\
-    if test \"\$libtool_execute_magic\" != \"$magic\"; then
-      # Run the actual program with our arguments.
-      func_exec_program \${1+\"\$@\"}
-    fi
-  else
-    # The program doesn't exist.
-    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
-    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
-    \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
-    exit 1
-  fi
-fi\
-"
-}
-
-
-# func_to_host_path arg
-#
-# Convert paths to host format when used with build tools.
-# Intended for use with "native" mingw (where libtool itself
-# is running under the msys shell), or in the following cross-
-# build environments:
-#    $build          $host
-#    mingw (msys)    mingw  [e.g. native]
-#    cygwin          mingw
-#    *nix + wine     mingw
-# where wine is equipped with the `winepath' executable.
-# In the native mingw case, the (msys) shell automatically
-# converts paths for any non-msys applications it launches,
-# but that facility isn't available from inside the cwrapper.
-# Similar accommodations are necessary for $host mingw and
-# $build cygwin.  Calling this function does no harm for other
-# $host/$build combinations not listed above.
-#
-# ARG is the path (on $build) that should be converted to
-# the proper representation for $host. The result is stored
-# in $func_to_host_path_result.
-func_to_host_path ()
-{
-  func_to_host_path_result="$1"
-  if test -n "$1"; then
-    case $host in
-      *mingw* )
-        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-        case $build in
-          *mingw* ) # actually, msys
-            # awkward: cmd appends spaces to result
-            func_to_host_path_result=`( cmd //c echo "$1" ) 2>/dev/null |
-              $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
-            ;;
-          *cygwin* )
-            func_to_host_path_result=`cygpath -w "$1" |
-	      $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          * )
-            # Unfortunately, winepath does not exit with a non-zero
-            # error code, so we are forced to check the contents of
-            # stdout. On the other hand, if the command is not
-            # found, the shell will set an exit code of 127 and print
-            # *an error message* to stdout. So we must check for both
-            # error code of zero AND non-empty stdout, which explains
-            # the odd construction:
-            func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null`
-            if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then
-              func_to_host_path_result=`$ECHO "$func_to_host_path_tmp1" |
-                $SED -e "$lt_sed_naive_backslashify"`
-            else
-              # Allow warning below.
-              func_to_host_path_result=
-            fi
-            ;;
-        esac
-        if test -z "$func_to_host_path_result" ; then
-          func_error "Could not determine host path corresponding to"
-          func_error "  \`$1'"
-          func_error "Continuing, but uninstalled executables may not work."
-          # Fallback:
-          func_to_host_path_result="$1"
-        fi
-        ;;
-    esac
-  fi
-}
-# end: func_to_host_path
-
-# func_to_host_pathlist arg
-#
-# Convert pathlists to host format when used with build tools.
-# See func_to_host_path(), above. This function supports the
-# following $build/$host combinations (but does no harm for
-# combinations not listed here):
-#    $build          $host
-#    mingw (msys)    mingw  [e.g. native]
-#    cygwin          mingw
-#    *nix + wine     mingw
-#
-# Path separators are also converted from $build format to
-# $host format. If ARG begins or ends with a path separator
-# character, it is preserved (but converted to $host format)
-# on output.
-#
-# ARG is a pathlist (on $build) that should be converted to
-# the proper representation on $host. The result is stored
-# in $func_to_host_pathlist_result.
-func_to_host_pathlist ()
-{
-  func_to_host_pathlist_result="$1"
-  if test -n "$1"; then
-    case $host in
-      *mingw* )
-        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-        # Remove leading and trailing path separator characters from
-        # ARG. msys behavior is inconsistent here, cygpath turns them
-        # into '.;' and ';.', and winepath ignores them completely.
-	func_stripname : : "$1"
-        func_to_host_pathlist_tmp1=$func_stripname_result
-        case $build in
-          *mingw* ) # Actually, msys.
-            # Awkward: cmd appends spaces to result.
-            func_to_host_pathlist_result=`
-	      ( cmd //c echo "$func_to_host_pathlist_tmp1" ) 2>/dev/null |
-	      $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
-            ;;
-          *cygwin* )
-            func_to_host_pathlist_result=`cygpath -w -p "$func_to_host_pathlist_tmp1" |
-              $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          * )
-            # unfortunately, winepath doesn't convert pathlists
-            func_to_host_pathlist_result=""
-            func_to_host_pathlist_oldIFS=$IFS
-            IFS=:
-            for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do
-              IFS=$func_to_host_pathlist_oldIFS
-              if test -n "$func_to_host_pathlist_f" ; then
-                func_to_host_path "$func_to_host_pathlist_f"
-                if test -n "$func_to_host_path_result" ; then
-                  if test -z "$func_to_host_pathlist_result" ; then
-                    func_to_host_pathlist_result="$func_to_host_path_result"
-                  else
-                    func_append func_to_host_pathlist_result ";$func_to_host_path_result"
-                  fi
-                fi
-              fi
-            done
-            IFS=$func_to_host_pathlist_oldIFS
-            ;;
-        esac
-        if test -z "$func_to_host_pathlist_result"; then
-          func_error "Could not determine the host path(s) corresponding to"
-          func_error "  \`$1'"
-          func_error "Continuing, but uninstalled executables may not work."
-          # Fallback. This may break if $1 contains DOS-style drive
-          # specifications. The fix is not to complicate the expression
-          # below, but for the user to provide a working wine installation
-          # with winepath so that path translation in the cross-to-mingw
-          # case works properly.
-          lt_replace_pathsep_nix_to_dos="s|:|;|g"
-          func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\
-            $SED -e "$lt_replace_pathsep_nix_to_dos"`
-        fi
-        # Now, add the leading and trailing path separators back
-        case "$1" in
-          :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result"
-            ;;
-        esac
-        case "$1" in
-          *: ) func_append func_to_host_pathlist_result ";"
-            ;;
-        esac
-        ;;
-    esac
-  fi
-}
-# end: func_to_host_pathlist
-
-# func_emit_cwrapperexe_src
-# emit the source code for a wrapper executable on stdout
-# Must ONLY be called from within func_mode_link because
-# it depends on a number of variable set therein.
-func_emit_cwrapperexe_src ()
-{
-	cat <<EOF
-
-/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
-   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-
-   The $output program cannot be directly executed until all the libtool
-   libraries that it depends on are installed.
-
-   This wrapper executable should never be moved out of the build directory.
-   If it is, it will not operate correctly.
-*/
-EOF
-	    cat <<"EOF"
-#ifdef _MSC_VER
-# define _CRT_SECURE_NO_DEPRECATE 1
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#ifdef _MSC_VER
-# include <direct.h>
-# include <process.h>
-# include <io.h>
-#else
-# include <unistd.h>
-# include <stdint.h>
-# ifdef __CYGWIN__
-#  include <io.h>
-# endif
-#endif
-#include <malloc.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-
-/* declarations of non-ANSI functions */
-#if defined(__MINGW32__)
-# ifdef __STRICT_ANSI__
-int _putenv (const char *);
-# endif
-#elif defined(__CYGWIN__)
-# ifdef __STRICT_ANSI__
-char *realpath (const char *, char *);
-int putenv (char *);
-int setenv (const char *, const char *, int);
-# endif
-/* #elif defined (other platforms) ... */
-#endif
-
-/* portability defines, excluding path handling macros */
-#if defined(_MSC_VER)
-# define setmode _setmode
-# define stat    _stat
-# define chmod   _chmod
-# define getcwd  _getcwd
-# define putenv  _putenv
-# define S_IXUSR _S_IEXEC
-# ifndef _INTPTR_T_DEFINED
-#  define _INTPTR_T_DEFINED
-#  define intptr_t int
-# endif
-#elif defined(__MINGW32__)
-# define setmode _setmode
-# define stat    _stat
-# define chmod   _chmod
-# define getcwd  _getcwd
-# define putenv  _putenv
-#elif defined(__CYGWIN__)
-# define HAVE_SETENV
-# define FOPEN_WB "wb"
-/* #elif defined (other platforms) ... */
-#endif
-
-#if defined(PATH_MAX)
-# define LT_PATHMAX PATH_MAX
-#elif defined(MAXPATHLEN)
-# define LT_PATHMAX MAXPATHLEN
-#else
-# define LT_PATHMAX 1024
-#endif
-
-#ifndef S_IXOTH
-# define S_IXOTH 0
-#endif
-#ifndef S_IXGRP
-# define S_IXGRP 0
-#endif
-
-/* path handling portability macros */
-#ifndef DIR_SEPARATOR
-# define DIR_SEPARATOR '/'
-# define PATH_SEPARATOR ':'
-#endif
-
-#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
-  defined (__OS2__)
-# define HAVE_DOS_BASED_FILE_SYSTEM
-# define FOPEN_WB "wb"
-# ifndef DIR_SEPARATOR_2
-#  define DIR_SEPARATOR_2 '\\'
-# endif
-# ifndef PATH_SEPARATOR_2
-#  define PATH_SEPARATOR_2 ';'
-# endif
-#endif
-
-#ifndef DIR_SEPARATOR_2
-# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
-#else /* DIR_SEPARATOR_2 */
-# define IS_DIR_SEPARATOR(ch) \
-	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
-#endif /* DIR_SEPARATOR_2 */
-
-#ifndef PATH_SEPARATOR_2
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
-#else /* PATH_SEPARATOR_2 */
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
-#endif /* PATH_SEPARATOR_2 */
-
-#ifndef FOPEN_WB
-# define FOPEN_WB "w"
-#endif
-#ifndef _O_BINARY
-# define _O_BINARY 0
-#endif
-
-#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
-#define XFREE(stale) do { \
-  if (stale) { free ((void *) stale); stale = 0; } \
-} while (0)
-
-#if defined(LT_DEBUGWRAPPER)
-static int lt_debug = 1;
-#else
-static int lt_debug = 0;
-#endif
-
-const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
-
-void *xmalloc (size_t num);
-char *xstrdup (const char *string);
-const char *base_name (const char *name);
-char *find_executable (const char *wrapper);
-char *chase_symlinks (const char *pathspec);
-int make_executable (const char *path);
-int check_executable (const char *path);
-char *strendzap (char *str, const char *pat);
-void lt_debugprintf (const char *file, int line, const char *fmt, ...);
-void lt_fatal (const char *file, int line, const char *message, ...);
-static const char *nonnull (const char *s);
-static const char *nonempty (const char *s);
-void lt_setenv (const char *name, const char *value);
-char *lt_extend_str (const char *orig_value, const char *add, int to_end);
-void lt_update_exe_path (const char *name, const char *value);
-void lt_update_lib_path (const char *name, const char *value);
-char **prepare_spawn (char **argv);
-void lt_dump_script (FILE *f);
-EOF
-
-	    cat <<EOF
-const char * MAGIC_EXE = "$magic_exe";
-const char * LIB_PATH_VARNAME = "$shlibpath_var";
-EOF
-
-	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-              func_to_host_pathlist "$temp_rpath"
-	      cat <<EOF
-const char * LIB_PATH_VALUE   = "$func_to_host_pathlist_result";
-EOF
-	    else
-	      cat <<"EOF"
-const char * LIB_PATH_VALUE   = "";
-EOF
-	    fi
-
-	    if test -n "$dllsearchpath"; then
-              func_to_host_pathlist "$dllsearchpath:"
-	      cat <<EOF
-const char * EXE_PATH_VARNAME = "PATH";
-const char * EXE_PATH_VALUE   = "$func_to_host_pathlist_result";
-EOF
-	    else
-	      cat <<"EOF"
-const char * EXE_PATH_VARNAME = "";
-const char * EXE_PATH_VALUE   = "";
-EOF
-	    fi
-
-	    if test "$fast_install" = yes; then
-	      cat <<EOF
-const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
-EOF
-	    else
-	      cat <<EOF
-const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
-EOF
-	    fi
-
-
-	    cat <<"EOF"
-
-#define LTWRAPPER_OPTION_PREFIX         "--lt-"
-
-static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
-static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
-static const char *debug_opt            = LTWRAPPER_OPTION_PREFIX "debug";
-
-int
-main (int argc, char *argv[])
-{
-  char **newargz;
-  int  newargc;
-  char *tmp_pathspec;
-  char *actual_cwrapper_path;
-  char *actual_cwrapper_name;
-  char *target_name;
-  char *lt_argv_zero;
-  intptr_t rval = 127;
-
-  int i;
-
-  program_name = (char *) xstrdup (base_name (argv[0]));
-  newargz = XMALLOC (char *, argc + 1);
-
-  /* very simple arg parsing; don't want to rely on getopt
-   * also, copy all non cwrapper options to newargz, except
-   * argz[0], which is handled differently
-   */
-  newargc=0;
-  for (i = 1; i < argc; i++)
-    {
-      if (strcmp (argv[i], dumpscript_opt) == 0)
-	{
-EOF
-	    case "$host" in
-	      *mingw* | *cygwin* )
-		# make stdout use "unix" line endings
-		echo "          setmode(1,_O_BINARY);"
-		;;
-	      esac
-
-	    cat <<"EOF"
-	  lt_dump_script (stdout);
-	  return 0;
-	}
-      if (strcmp (argv[i], debug_opt) == 0)
-	{
-          lt_debug = 1;
-          continue;
-	}
-      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
-        {
-          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
-             namespace, but it is not one of the ones we know about and
-             have already dealt with, above (inluding dump-script), then
-             report an error. Otherwise, targets might begin to believe
-             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
-             namespace. The first time any user complains about this, we'll
-             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
-             or a configure.ac-settable value.
-           */
-          lt_fatal (__FILE__, __LINE__,
-		    "unrecognized %s option: '%s'",
-                    ltwrapper_option_prefix, argv[i]);
-        }
-      /* otherwise ... */
-      newargz[++newargc] = xstrdup (argv[i]);
-    }
-  newargz[++newargc] = NULL;
-
-EOF
-	    cat <<EOF
-  /* The GNU banner must be the first non-error debug message */
-  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
-EOF
-	    cat <<"EOF"
-  lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
-  lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
-
-  tmp_pathspec = find_executable (argv[0]);
-  if (tmp_pathspec == NULL)
-    lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
-  lt_debugprintf (__FILE__, __LINE__,
-                  "(main) found exe (before symlink chase) at: %s\n",
-		  tmp_pathspec);
-
-  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
-  lt_debugprintf (__FILE__, __LINE__,
-                  "(main) found exe (after symlink chase) at: %s\n",
-		  actual_cwrapper_path);
-  XFREE (tmp_pathspec);
-
-  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
-  strendzap (actual_cwrapper_path, actual_cwrapper_name);
-
-  /* wrapper name transforms */
-  strendzap (actual_cwrapper_name, ".exe");
-  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
-  XFREE (actual_cwrapper_name);
-  actual_cwrapper_name = tmp_pathspec;
-  tmp_pathspec = 0;
-
-  /* target_name transforms -- use actual target program name; might have lt- prefix */
-  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
-  strendzap (target_name, ".exe");
-  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
-  XFREE (target_name);
-  target_name = tmp_pathspec;
-  tmp_pathspec = 0;
-
-  lt_debugprintf (__FILE__, __LINE__,
-		  "(main) libtool target name: %s\n",
-		  target_name);
-EOF
-
-	    cat <<EOF
-  newargz[0] =
-    XMALLOC (char, (strlen (actual_cwrapper_path) +
-		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
-  strcpy (newargz[0], actual_cwrapper_path);
-  strcat (newargz[0], "$objdir");
-  strcat (newargz[0], "/");
-EOF
-
-	    cat <<"EOF"
-  /* stop here, and copy so we don't have to do this twice */
-  tmp_pathspec = xstrdup (newargz[0]);
-
-  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
-  strcat (newargz[0], actual_cwrapper_name);
-
-  /* DO want the lt- prefix here if it exists, so use target_name */
-  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
-  XFREE (tmp_pathspec);
-  tmp_pathspec = NULL;
-EOF
-
-	    case $host_os in
-	      mingw*)
-	    cat <<"EOF"
-  {
-    char* p;
-    while ((p = strchr (newargz[0], '\\')) != NULL)
-      {
-	*p = '/';
-      }
-    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
-      {
-	*p = '/';
-      }
-  }
-EOF
-	    ;;
-	    esac
-
-	    cat <<"EOF"
-  XFREE (target_name);
-  XFREE (actual_cwrapper_path);
-  XFREE (actual_cwrapper_name);
-
-  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
-  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
-  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
-  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
-
-  lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
-		  nonnull (lt_argv_zero));
-  for (i = 0; i < newargc; i++)
-    {
-      lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
-		      i, nonnull (newargz[i]));
-    }
-
-EOF
-
-	    case $host_os in
-	      mingw*)
-		cat <<"EOF"
-  /* execv doesn't actually work on mingw as expected on unix */
-  newargz = prepare_spawn (newargz);
-  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
-  if (rval == -1)
-    {
-      /* failed to start process */
-      lt_debugprintf (__FILE__, __LINE__,
-		      "(main) failed to launch target \"%s\": %s\n",
-		      lt_argv_zero, nonnull (strerror (errno)));
-      return 127;
-    }
-  return rval;
-EOF
-		;;
-	      *)
-		cat <<"EOF"
-  execv (lt_argv_zero, newargz);
-  return rval; /* =127, but avoids unused variable warning */
-EOF
-		;;
-	    esac
-
-	    cat <<"EOF"
-}
-
-void *
-xmalloc (size_t num)
-{
-  void *p = (void *) malloc (num);
-  if (!p)
-    lt_fatal (__FILE__, __LINE__, "memory exhausted");
-
-  return p;
-}
-
-char *
-xstrdup (const char *string)
-{
-  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
-			  string) : NULL;
-}
-
-const char *
-base_name (const char *name)
-{
-  const char *base;
-
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  /* Skip over the disk name in MSDOS pathnames. */
-  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
-    name += 2;
-#endif
-
-  for (base = name; *name; name++)
-    if (IS_DIR_SEPARATOR (*name))
-      base = name + 1;
-  return base;
-}
-
-int
-check_executable (const char *path)
-{
-  struct stat st;
-
-  lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
-                  nonempty (path));
-  if ((!path) || (!*path))
-    return 0;
-
-  if ((stat (path, &st) >= 0)
-      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
-    return 1;
-  else
-    return 0;
-}
-
-int
-make_executable (const char *path)
-{
-  int rval = 0;
-  struct stat st;
-
-  lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
-                  nonempty (path));
-  if ((!path) || (!*path))
-    return 0;
-
-  if (stat (path, &st) >= 0)
-    {
-      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
-    }
-  return rval;
-}
-
-/* Searches for the full path of the wrapper.  Returns
-   newly allocated full path name if found, NULL otherwise
-   Does not chase symlinks, even on platforms that support them.
-*/
-char *
-find_executable (const char *wrapper)
-{
-  int has_slash = 0;
-  const char *p;
-  const char *p_next;
-  /* static buffer for getcwd */
-  char tmp[LT_PATHMAX + 1];
-  int tmp_len;
-  char *concat_name;
-
-  lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
-                  nonempty (wrapper));
-
-  if ((wrapper == NULL) || (*wrapper == '\0'))
-    return NULL;
-
-  /* Absolute path? */
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
-    {
-      concat_name = xstrdup (wrapper);
-      if (check_executable (concat_name))
-	return concat_name;
-      XFREE (concat_name);
-    }
-  else
-    {
-#endif
-      if (IS_DIR_SEPARATOR (wrapper[0]))
-	{
-	  concat_name = xstrdup (wrapper);
-	  if (check_executable (concat_name))
-	    return concat_name;
-	  XFREE (concat_name);
-	}
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-    }
-#endif
-
-  for (p = wrapper; *p; p++)
-    if (*p == '/')
-      {
-	has_slash = 1;
-	break;
-      }
-  if (!has_slash)
-    {
-      /* no slashes; search PATH */
-      const char *path = getenv ("PATH");
-      if (path != NULL)
-	{
-	  for (p = path; *p; p = p_next)
-	    {
-	      const char *q;
-	      size_t p_len;
-	      for (q = p; *q; q++)
-		if (IS_PATH_SEPARATOR (*q))
-		  break;
-	      p_len = q - p;
-	      p_next = (*q == '\0' ? q : q + 1);
-	      if (p_len == 0)
-		{
-		  /* empty path: current directory */
-		  if (getcwd (tmp, LT_PATHMAX) == NULL)
-		    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
-                              nonnull (strerror (errno)));
-		  tmp_len = strlen (tmp);
-		  concat_name =
-		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
-		  memcpy (concat_name, tmp, tmp_len);
-		  concat_name[tmp_len] = '/';
-		  strcpy (concat_name + tmp_len + 1, wrapper);
-		}
-	      else
-		{
-		  concat_name =
-		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
-		  memcpy (concat_name, p, p_len);
-		  concat_name[p_len] = '/';
-		  strcpy (concat_name + p_len + 1, wrapper);
-		}
-	      if (check_executable (concat_name))
-		return concat_name;
-	      XFREE (concat_name);
-	    }
-	}
-      /* not found in PATH; assume curdir */
-    }
-  /* Relative path | not found in path: prepend cwd */
-  if (getcwd (tmp, LT_PATHMAX) == NULL)
-    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
-              nonnull (strerror (errno)));
-  tmp_len = strlen (tmp);
-  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
-  memcpy (concat_name, tmp, tmp_len);
-  concat_name[tmp_len] = '/';
-  strcpy (concat_name + tmp_len + 1, wrapper);
-
-  if (check_executable (concat_name))
-    return concat_name;
-  XFREE (concat_name);
-  return NULL;
-}
-
-char *
-chase_symlinks (const char *pathspec)
-{
-#ifndef S_ISLNK
-  return xstrdup (pathspec);
-#else
-  char buf[LT_PATHMAX];
-  struct stat s;
-  char *tmp_pathspec = xstrdup (pathspec);
-  char *p;
-  int has_symlinks = 0;
-  while (strlen (tmp_pathspec) && !has_symlinks)
-    {
-      lt_debugprintf (__FILE__, __LINE__,
-		      "checking path component for symlinks: %s\n",
-		      tmp_pathspec);
-      if (lstat (tmp_pathspec, &s) == 0)
-	{
-	  if (S_ISLNK (s.st_mode) != 0)
-	    {
-	      has_symlinks = 1;
-	      break;
-	    }
-
-	  /* search backwards for last DIR_SEPARATOR */
-	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
-	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
-	    p--;
-	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
-	    {
-	      /* no more DIR_SEPARATORS left */
-	      break;
-	    }
-	  *p = '\0';
-	}
-      else
-	{
-	  lt_fatal (__FILE__, __LINE__,
-		    "error accessing file \"%s\": %s",
-		    tmp_pathspec, nonnull (strerror (errno)));
-	}
-    }
-  XFREE (tmp_pathspec);
-
-  if (!has_symlinks)
-    {
-      return xstrdup (pathspec);
-    }
-
-  tmp_pathspec = realpath (pathspec, buf);
-  if (tmp_pathspec == 0)
-    {
-      lt_fatal (__FILE__, __LINE__,
-		"could not follow symlinks for %s", pathspec);
-    }
-  return xstrdup (tmp_pathspec);
-#endif
-}
-
-char *
-strendzap (char *str, const char *pat)
-{
-  size_t len, patlen;
-
-  assert (str != NULL);
-  assert (pat != NULL);
-
-  len = strlen (str);
-  patlen = strlen (pat);
-
-  if (patlen <= len)
-    {
-      str += len - patlen;
-      if (strcmp (str, pat) == 0)
-	*str = '\0';
-    }
-  return str;
-}
-
-void
-lt_debugprintf (const char *file, int line, const char *fmt, ...)
-{
-  va_list args;
-  if (lt_debug)
-    {
-      (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
-      va_start (args, fmt);
-      (void) vfprintf (stderr, fmt, args);
-      va_end (args);
-    }
-}
-
-static void
-lt_error_core (int exit_status, const char *file,
-	       int line, const char *mode,
-	       const char *message, va_list ap)
-{
-  fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
-  vfprintf (stderr, message, ap);
-  fprintf (stderr, ".\n");
-
-  if (exit_status >= 0)
-    exit (exit_status);
-}
-
-void
-lt_fatal (const char *file, int line, const char *message, ...)
-{
-  va_list ap;
-  va_start (ap, message);
-  lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
-  va_end (ap);
-}
-
-static const char *
-nonnull (const char *s)
-{
-  return s ? s : "(null)";
-}
-
-static const char *
-nonempty (const char *s)
-{
-  return (s && !*s) ? "(empty)" : nonnull (s);
-}
-
-void
-lt_setenv (const char *name, const char *value)
-{
-  lt_debugprintf (__FILE__, __LINE__,
-		  "(lt_setenv) setting '%s' to '%s'\n",
-                  nonnull (name), nonnull (value));
-  {
-#ifdef HAVE_SETENV
-    /* always make a copy, for consistency with !HAVE_SETENV */
-    char *str = xstrdup (value);
-    setenv (name, str, 1);
-#else
-    int len = strlen (name) + 1 + strlen (value) + 1;
-    char *str = XMALLOC (char, len);
-    sprintf (str, "%s=%s", name, value);
-    if (putenv (str) != EXIT_SUCCESS)
-      {
-        XFREE (str);
-      }
-#endif
-  }
-}
-
-char *
-lt_extend_str (const char *orig_value, const char *add, int to_end)
-{
-  char *new_value;
-  if (orig_value && *orig_value)
-    {
-      int orig_value_len = strlen (orig_value);
-      int add_len = strlen (add);
-      new_value = XMALLOC (char, add_len + orig_value_len + 1);
-      if (to_end)
-        {
-          strcpy (new_value, orig_value);
-          strcpy (new_value + orig_value_len, add);
-        }
-      else
-        {
-          strcpy (new_value, add);
-          strcpy (new_value + add_len, orig_value);
-        }
-    }
-  else
-    {
-      new_value = xstrdup (add);
-    }
-  return new_value;
-}
-
-void
-lt_update_exe_path (const char *name, const char *value)
-{
-  lt_debugprintf (__FILE__, __LINE__,
-		  "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
-                  nonnull (name), nonnull (value));
-
-  if (name && *name && value && *value)
-    {
-      char *new_value = lt_extend_str (getenv (name), value, 0);
-      /* some systems can't cope with a ':'-terminated path #' */
-      int len = strlen (new_value);
-      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
-        {
-          new_value[len-1] = '\0';
-        }
-      lt_setenv (name, new_value);
-      XFREE (new_value);
-    }
-}
-
-void
-lt_update_lib_path (const char *name, const char *value)
-{
-  lt_debugprintf (__FILE__, __LINE__,
-		  "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
-                  nonnull (name), nonnull (value));
-
-  if (name && *name && value && *value)
-    {
-      char *new_value = lt_extend_str (getenv (name), value, 0);
-      lt_setenv (name, new_value);
-      XFREE (new_value);
-    }
-}
-
-EOF
-	    case $host_os in
-	      mingw*)
-		cat <<"EOF"
-
-/* Prepares an argument vector before calling spawn().
-   Note that spawn() does not by itself call the command interpreter
-     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
-      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-         GetVersionEx(&v);
-         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
-      }) ? "cmd.exe" : "command.com").
-   Instead it simply concatenates the arguments, separated by ' ', and calls
-   CreateProcess().  We must quote the arguments since Win32 CreateProcess()
-   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
-   special way:
-   - Space and tab are interpreted as delimiters. They are not treated as
-     delimiters if they are surrounded by double quotes: "...".
-   - Unescaped double quotes are removed from the input. Their only effect is
-     that within double quotes, space and tab are treated like normal
-     characters.
-   - Backslashes not followed by double quotes are not special.
-   - But 2*n+1 backslashes followed by a double quote become
-     n backslashes followed by a double quote (n >= 0):
-       \" -> "
-       \\\" -> \"
-       \\\\\" -> \\"
- */
-#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
-#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
-char **
-prepare_spawn (char **argv)
-{
-  size_t argc;
-  char **new_argv;
-  size_t i;
-
-  /* Count number of arguments.  */
-  for (argc = 0; argv[argc] != NULL; argc++)
-    ;
-
-  /* Allocate new argument vector.  */
-  new_argv = XMALLOC (char *, argc + 1);
-
-  /* Put quoted arguments into the new argument vector.  */
-  for (i = 0; i < argc; i++)
-    {
-      const char *string = argv[i];
-
-      if (string[0] == '\0')
-	new_argv[i] = xstrdup ("\"\"");
-      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
-	{
-	  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
-	  size_t length;
-	  unsigned int backslashes;
-	  const char *s;
-	  char *quoted_string;
-	  char *p;
-
-	  length = 0;
-	  backslashes = 0;
-	  if (quote_around)
-	    length++;
-	  for (s = string; *s != '\0'; s++)
-	    {
-	      char c = *s;
-	      if (c == '"')
-		length += backslashes + 1;
-	      length++;
-	      if (c == '\\')
-		backslashes++;
-	      else
-		backslashes = 0;
-	    }
-	  if (quote_around)
-	    length += backslashes + 1;
-
-	  quoted_string = XMALLOC (char, length + 1);
-
-	  p = quoted_string;
-	  backslashes = 0;
-	  if (quote_around)
-	    *p++ = '"';
-	  for (s = string; *s != '\0'; s++)
-	    {
-	      char c = *s;
-	      if (c == '"')
-		{
-		  unsigned int j;
-		  for (j = backslashes + 1; j > 0; j--)
-		    *p++ = '\\';
-		}
-	      *p++ = c;
-	      if (c == '\\')
-		backslashes++;
-	      else
-		backslashes = 0;
-	    }
-	  if (quote_around)
-	    {
-	      unsigned int j;
-	      for (j = backslashes; j > 0; j--)
-		*p++ = '\\';
-	      *p++ = '"';
-	    }
-	  *p = '\0';
-
-	  new_argv[i] = quoted_string;
-	}
-      else
-	new_argv[i] = (char *) string;
-    }
-  new_argv[argc] = NULL;
-
-  return new_argv;
-}
-EOF
-		;;
-	    esac
-
-            cat <<"EOF"
-void lt_dump_script (FILE* f)
-{
-EOF
-	    func_emit_wrapper yes |
-              $SED -e 's/\([\\"]\)/\\\1/g' \
-	           -e 's/^/  fputs ("/' -e 's/$/\\n", f);/'
-
-            cat <<"EOF"
-}
-EOF
-}
-# end: func_emit_cwrapperexe_src
-
-# func_win32_import_lib_p ARG
-# True if ARG is an import lib, as indicated by $file_magic_cmd
-func_win32_import_lib_p ()
-{
-    $opt_debug
-    case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
-    *import*) : ;;
-    *) false ;;
-    esac
-}
-
-# func_mode_link arg...
-func_mode_link ()
-{
-    $opt_debug
-    case $host in
-    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-      # It is impossible to link a dll without this setting, and
-      # we shouldn't force the makefile maintainer to figure out
-      # which system we are compiling for in order to pass an extra
-      # flag for every libtool invocation.
-      # allow_undefined=no
-
-      # FIXME: Unfortunately, there are problems with the above when trying
-      # to make a dll which has undefined symbols, in which case not
-      # even a static library is built.  For now, we need to specify
-      # -no-undefined on the libtool link line when we can be certain
-      # that all symbols are satisfied, otherwise we get a static library.
-      allow_undefined=yes
-      ;;
-    *)
-      allow_undefined=yes
-      ;;
-    esac
-    libtool_args=$nonopt
-    base_compile="$nonopt $@"
-    compile_command=$nonopt
-    finalize_command=$nonopt
-
-    compile_rpath=
-    finalize_rpath=
-    compile_shlibpath=
-    finalize_shlibpath=
-    convenience=
-    old_convenience=
-    deplibs=
-    old_deplibs=
-    compiler_flags=
-    linker_flags=
-    dllsearchpath=
-    lib_search_path=`pwd`
-    inst_prefix_dir=
-    new_inherited_linker_flags=
-
-    avoid_version=no
-    bindir=
-    dlfiles=
-    dlprefiles=
-    dlself=no
-    export_dynamic=no
-    export_symbols=
-    export_symbols_regex=
-    generated=
-    libobjs=
-    ltlibs=
-    module=no
-    no_install=no
-    objs=
-    non_pic_objects=
-    precious_files_regex=
-    prefer_static_libs=no
-    preload=no
-    prev=
-    prevarg=
-    release=
-    rpath=
-    xrpath=
-    perm_rpath=
-    temp_rpath=
-    thread_safe=no
-    vinfo=
-    vinfo_number=no
-    weak_libs=
-    single_module="${wl}-single_module"
-    func_infer_tag $base_compile
-
-    # We need to know -static, to get the right output filenames.
-    for arg
-    do
-      case $arg in
-      -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
-	build_old_libs=no
-	break
-	;;
-      -all-static | -static | -static-libtool-libs)
-	case $arg in
-	-all-static)
-	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
-	    func_warning "complete static linking is impossible in this configuration"
-	  fi
-	  if test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=yes
-	  ;;
-	-static)
-	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=built
-	  ;;
-	-static-libtool-libs)
-	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=yes
-	  ;;
-	esac
-	build_libtool_libs=no
-	build_old_libs=yes
-	break
-	;;
-      esac
-    done
-
-    # See if our shared archives depend on static archives.
-    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
-
-    # Go through the arguments, transforming them on the way.
-    while test "$#" -gt 0; do
-      arg="$1"
-      shift
-      func_quote_for_eval "$arg"
-      qarg=$func_quote_for_eval_unquoted_result
-      func_append libtool_args " $func_quote_for_eval_result"
-
-      # If the previous option needs an argument, assign it.
-      if test -n "$prev"; then
-	case $prev in
-	output)
-	  func_append compile_command " @OUTPUT@"
-	  func_append finalize_command " @OUTPUT@"
-	  ;;
-	esac
-
-	case $prev in
-	bindir)
-	  bindir="$arg"
-	  prev=
-	  continue
-	  ;;
-	dlfiles|dlprefiles)
-	  if test "$preload" = no; then
-	    # Add the symbol object into the linking commands.
-	    func_append compile_command " @SYMFILE@"
-	    func_append finalize_command " @SYMFILE@"
-	    preload=yes
-	  fi
-	  case $arg in
-	  *.la | *.lo) ;;  # We handle these cases below.
-	  force)
-	    if test "$dlself" = no; then
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  self)
-	    if test "$prev" = dlprefiles; then
-	      dlself=yes
-	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
-	      dlself=yes
-	    else
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  *)
-	    if test "$prev" = dlfiles; then
-	      dlfiles="$dlfiles $arg"
-	    else
-	      dlprefiles="$dlprefiles $arg"
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  esac
-	  ;;
-	expsyms)
-	  export_symbols="$arg"
-	  test -f "$arg" \
-	    || func_fatal_error "symbol file \`$arg' does not exist"
-	  prev=
-	  continue
-	  ;;
-	expsyms_regex)
-	  export_symbols_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	framework)
-	  case $host in
-	    *-*-darwin*)
-	      case "$deplibs " in
-		*" $qarg.ltframework "*) ;;
-		*) deplibs="$deplibs $qarg.ltframework" # this is fixed later
-		   ;;
-	      esac
-	      ;;
-	  esac
-	  prev=
-	  continue
-	  ;;
-	inst_prefix)
-	  inst_prefix_dir="$arg"
-	  prev=
-	  continue
-	  ;;
-	objectlist)
-	  if test -f "$arg"; then
-	    save_arg=$arg
-	    moreargs=
-	    for fil in `cat "$save_arg"`
-	    do
-#	      moreargs="$moreargs $fil"
-	      arg=$fil
-	      # A libtool-controlled object.
-
-	      # Check to see that this really is a libtool object.
-	      if func_lalib_unsafe_p "$arg"; then
-		pic_object=
-		non_pic_object=
-
-		# Read the .lo file
-		func_source "$arg"
-
-		if test -z "$pic_object" ||
-		   test -z "$non_pic_object" ||
-		   test "$pic_object" = none &&
-		   test "$non_pic_object" = none; then
-		  func_fatal_error "cannot find name of object for \`$arg'"
-		fi
-
-		# Extract subdirectory from the argument.
-		func_dirname "$arg" "/" ""
-		xdir="$func_dirname_result"
-
-		if test "$pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  pic_object="$xdir$pic_object"
-
-		  if test "$prev" = dlfiles; then
-		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		      dlfiles="$dlfiles $pic_object"
-		      prev=
-		      continue
-		    else
-		      # If libtool objects are unsupported, then we need to preload.
-		      prev=dlprefiles
-		    fi
-		  fi
-
-		  # CHECK ME:  I think I busted this.  -Ossama
-		  if test "$prev" = dlprefiles; then
-		    # Preload the old-style object.
-		    dlprefiles="$dlprefiles $pic_object"
-		    prev=
-		  fi
-
-		  # A PIC object.
-		  func_append libobjs " $pic_object"
-		  arg="$pic_object"
-		fi
-
-		# Non-PIC object.
-		if test "$non_pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  non_pic_object="$xdir$non_pic_object"
-
-		  # A standard non-PIC object
-		  func_append non_pic_objects " $non_pic_object"
-		  if test -z "$pic_object" || test "$pic_object" = none ; then
-		    arg="$non_pic_object"
-		  fi
-		else
-		  # If the PIC object exists, use it instead.
-		  # $xdir was prepended to $pic_object above.
-		  non_pic_object="$pic_object"
-		  func_append non_pic_objects " $non_pic_object"
-		fi
-	      else
-		# Only an error if not doing a dry-run.
-		if $opt_dry_run; then
-		  # Extract subdirectory from the argument.
-		  func_dirname "$arg" "/" ""
-		  xdir="$func_dirname_result"
-
-		  func_lo2o "$arg"
-		  pic_object=$xdir$objdir/$func_lo2o_result
-		  non_pic_object=$xdir$func_lo2o_result
-		  func_append libobjs " $pic_object"
-		  func_append non_pic_objects " $non_pic_object"
-	        else
-		  func_fatal_error "\`$arg' is not a valid libtool object"
-		fi
-	      fi
-	    done
-	  else
-	    func_fatal_error "link input file \`$arg' does not exist"
-	  fi
-	  arg=$save_arg
-	  prev=
-	  continue
-	  ;;
-	precious_regex)
-	  precious_files_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	release)
-	  release="-$arg"
-	  prev=
-	  continue
-	  ;;
-	rpath | xrpath)
-	  # We need an absolute path.
-	  case $arg in
-	  [\\/]* | [A-Za-z]:[\\/]*) ;;
-	  *)
-	    func_fatal_error "only absolute run-paths are allowed"
-	    ;;
-	  esac
-	  if test "$prev" = rpath; then
-	    case "$rpath " in
-	    *" $arg "*) ;;
-	    *) rpath="$rpath $arg" ;;
-	    esac
-	  else
-	    case "$xrpath " in
-	    *" $arg "*) ;;
-	    *) xrpath="$xrpath $arg" ;;
-	    esac
-	  fi
-	  prev=
-	  continue
-	  ;;
-	shrext)
-	  shrext_cmds="$arg"
-	  prev=
-	  continue
-	  ;;
-	weak)
-	  weak_libs="$weak_libs $arg"
-	  prev=
-	  continue
-	  ;;
-	xcclinker)
-	  linker_flags="$linker_flags $qarg"
-	  compiler_flags="$compiler_flags $qarg"
-	  prev=
-	  func_append compile_command " $qarg"
-	  func_append finalize_command " $qarg"
-	  continue
-	  ;;
-	xcompiler)
-	  compiler_flags="$compiler_flags $qarg"
-	  prev=
-	  func_append compile_command " $qarg"
-	  func_append finalize_command " $qarg"
-	  continue
-	  ;;
-	xlinker)
-	  linker_flags="$linker_flags $qarg"
-	  compiler_flags="$compiler_flags $wl$qarg"
-	  prev=
-	  func_append compile_command " $wl$qarg"
-	  func_append finalize_command " $wl$qarg"
-	  continue
-	  ;;
-	*)
-	  eval "$prev=\"\$arg\""
-	  prev=
-	  continue
-	  ;;
-	esac
-      fi # test -n "$prev"
-
-      prevarg="$arg"
-
-      case $arg in
-      -all-static)
-	if test -n "$link_static_flag"; then
-	  # See comment for -static flag below, for more details.
-	  func_append compile_command " $link_static_flag"
-	  func_append finalize_command " $link_static_flag"
-	fi
-	continue
-	;;
-
-      -allow-undefined)
-	# FIXME: remove this flag sometime in the future.
-	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
-	;;
-
-      -avoid-version)
-	avoid_version=yes
-	continue
-	;;
-
-      -bindir)
-	prev=bindir
-	continue
-	;;
-
-      -dlopen)
-	prev=dlfiles
-	continue
-	;;
-
-      -dlpreopen)
-	prev=dlprefiles
-	continue
-	;;
-
-      -export-dynamic)
-	export_dynamic=yes
-	continue
-	;;
-
-      -export-symbols | -export-symbols-regex)
-	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
-	  func_fatal_error "more than one -exported-symbols argument is not allowed"
-	fi
-	if test "X$arg" = "X-export-symbols"; then
-	  prev=expsyms
-	else
-	  prev=expsyms_regex
-	fi
-	continue
-	;;
-
-      -framework)
-	prev=framework
-	continue
-	;;
-
-      -inst-prefix-dir)
-	prev=inst_prefix
-	continue
-	;;
-
-      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
-      # so, if we see these flags be careful not to treat them like -L
-      -L[A-Z][A-Z]*:*)
-	case $with_gcc/$host in
-	no/*-*-irix* | /*-*-irix*)
-	  func_append compile_command " $arg"
-	  func_append finalize_command " $arg"
-	  ;;
-	esac
-	continue
-	;;
-
-      -L*)
-	func_stripname '-L' '' "$arg"
-	dir=$func_stripname_result
-	if test -z "$dir"; then
-	  if test "$#" -gt 0; then
-	    func_fatal_error "require no space between \`-L' and \`$1'"
-	  else
-	    func_fatal_error "need path for \`-L' option"
-	  fi
-	fi
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	*)
-	  absdir=`cd "$dir" && pwd`
-	  test -z "$absdir" && \
-	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
-	  dir="$absdir"
-	  ;;
-	esac
-	case "$deplibs " in
-	*" -L$dir "*) ;;
-	*)
-	  deplibs="$deplibs -L$dir"
-	  lib_search_path="$lib_search_path $dir"
-	  ;;
-	esac
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-	  testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$dir:"*) ;;
-	  ::) dllsearchpath=$dir;;
-	  *) dllsearchpath="$dllsearchpath:$dir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  ::) dllsearchpath=$testbindir;;
-	  *) dllsearchpath="$dllsearchpath:$testbindir";;
-	  esac
-	  ;;
-	esac
-	continue
-	;;
-
-      -l*)
-	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
-	    # These systems don't actually have a C or math library (as such)
-	    continue
-	    ;;
-	  *-*-os2*)
-	    # These systems don't actually have a C library (as such)
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C and math libraries are in the System framework
-	    deplibs="$deplibs System.ltframework"
-	    continue
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  esac
-	elif test "X$arg" = "X-lc_r"; then
-	 case $host in
-	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	   # Do not include libc_r directly, use -pthread flag.
-	   continue
-	   ;;
-	 esac
-	fi
-	deplibs="$deplibs $arg"
-	continue
-	;;
-
-      -module)
-	module=yes
-	continue
-	;;
-
-      # Tru64 UNIX uses -model [arg] to determine the layout of C++
-      # classes, name mangling, and exception handling.
-      # Darwin uses the -arch flag to determine output architecture.
-      -model|-arch|-isysroot)
-	compiler_flags="$compiler_flags $arg"
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-	prev=xcompiler
-	continue
-	;;
-
-      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
-	compiler_flags="$compiler_flags $arg"
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-	case "$new_inherited_linker_flags " in
-	    *" $arg "*) ;;
-	    * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;;
-	esac
-	continue
-	;;
-
-      -multi_module)
-	single_module="${wl}-multi_module"
-	continue
-	;;
-
-      -no-fast-install)
-	fast_install=no
-	continue
-	;;
-
-      -no-install)
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
-	  # The PATH hackery in wrapper scripts is required on Windows
-	  # and Darwin in order for the loader to find any dlls it needs.
-	  func_warning "\`-no-install' is ignored for $host"
-	  func_warning "assuming \`-no-fast-install' instead"
-	  fast_install=no
-	  ;;
-	*) no_install=yes ;;
-	esac
-	continue
-	;;
-
-      -no-undefined)
-	allow_undefined=no
-	continue
-	;;
-
-      -objectlist)
-	prev=objectlist
-	continue
-	;;
-
-      -o) prev=output ;;
-
-      -precious-files-regex)
-	prev=precious_regex
-	continue
-	;;
-
-      -release)
-	prev=release
-	continue
-	;;
-
-      -rpath)
-	prev=rpath
-	continue
-	;;
-
-      -R)
-	prev=xrpath
-	continue
-	;;
-
-      -R*)
-	func_stripname '-R' '' "$arg"
-	dir=$func_stripname_result
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	*)
-	  func_fatal_error "only absolute run-paths are allowed"
-	  ;;
-	esac
-	case "$xrpath " in
-	*" $dir "*) ;;
-	*) xrpath="$xrpath $dir" ;;
-	esac
-	continue
-	;;
-
-      -shared)
-	# The effects of -shared are defined in a previous loop.
-	continue
-	;;
-
-      -shrext)
-	prev=shrext
-	continue
-	;;
-
-      -static | -static-libtool-libs)
-	# The effects of -static are defined in a previous loop.
-	# We used to do the same as -all-static on platforms that
-	# didn't have a PIC flag, but the assumption that the effects
-	# would be equivalent was wrong.  It would break on at least
-	# Digital Unix and AIX.
-	continue
-	;;
-
-      -thread-safe)
-	thread_safe=yes
-	continue
-	;;
-
-      -version-info)
-	prev=vinfo
-	continue
-	;;
-
-      -version-number)
-	prev=vinfo
-	vinfo_number=yes
-	continue
-	;;
-
-      -weak)
-        prev=weak
-	continue
-	;;
-
-      -Wc,*)
-	func_stripname '-Wc,' '' "$arg"
-	args=$func_stripname_result
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-          func_quote_for_eval "$flag"
-	  arg="$arg $func_quote_for_eval_result"
-	  compiler_flags="$compiler_flags $func_quote_for_eval_result"
-	done
-	IFS="$save_ifs"
-	func_stripname ' ' '' "$arg"
-	arg=$func_stripname_result
-	;;
-
-      -Wl,*)
-	func_stripname '-Wl,' '' "$arg"
-	args=$func_stripname_result
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-          func_quote_for_eval "$flag"
-	  arg="$arg $wl$func_quote_for_eval_result"
-	  compiler_flags="$compiler_flags $wl$func_quote_for_eval_result"
-	  linker_flags="$linker_flags $func_quote_for_eval_result"
-	done
-	IFS="$save_ifs"
-	func_stripname ' ' '' "$arg"
-	arg=$func_stripname_result
-	;;
-
-      -Xcompiler)
-	prev=xcompiler
-	continue
-	;;
-
-      -Xlinker)
-	prev=xlinker
-	continue
-	;;
-
-      -XCClinker)
-	prev=xcclinker
-	continue
-	;;
-
-      # -msg_* for osf cc
-      -msg_*)
-	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-
-      # Flags to be passed through unchanged, with rationale:
-      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler
-      # -r[0-9][0-9]*        specify processor for the SGI compiler
-      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
-      # +DA*, +DD*           enable 64-bit mode for the HP compiler
-      # -q*                  compiler args for the IBM compiler
-      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
-      # -F/path              path to uninstalled frameworks, gcc on darwin
-      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
-      # @file                GCC response files
-      # -tp=*                Portland pgcc target processor selection
-      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*)
-        func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-        func_append compile_command " $arg"
-        func_append finalize_command " $arg"
-        compiler_flags="$compiler_flags $arg"
-        continue
-        ;;
-
-      # Some other compiler flag.
-      -* | +*)
-        func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-
-      *.$objext)
-	# A standard object.
-	objs="$objs $arg"
-	;;
-
-      *.lo)
-	# A libtool-controlled object.
-
-	# Check to see that this really is a libtool object.
-	if func_lalib_unsafe_p "$arg"; then
-	  pic_object=
-	  non_pic_object=
-
-	  # Read the .lo file
-	  func_source "$arg"
-
-	  if test -z "$pic_object" ||
-	     test -z "$non_pic_object" ||
-	     test "$pic_object" = none &&
-	     test "$non_pic_object" = none; then
-	    func_fatal_error "cannot find name of object for \`$arg'"
-	  fi
-
-	  # Extract subdirectory from the argument.
-	  func_dirname "$arg" "/" ""
-	  xdir="$func_dirname_result"
-
-	  if test "$pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    pic_object="$xdir$pic_object"
-
-	    if test "$prev" = dlfiles; then
-	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		dlfiles="$dlfiles $pic_object"
-		prev=
-		continue
-	      else
-		# If libtool objects are unsupported, then we need to preload.
-		prev=dlprefiles
-	      fi
-	    fi
-
-	    # CHECK ME:  I think I busted this.  -Ossama
-	    if test "$prev" = dlprefiles; then
-	      # Preload the old-style object.
-	      dlprefiles="$dlprefiles $pic_object"
-	      prev=
-	    fi
-
-	    # A PIC object.
-	    func_append libobjs " $pic_object"
-	    arg="$pic_object"
-	  fi
-
-	  # Non-PIC object.
-	  if test "$non_pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    non_pic_object="$xdir$non_pic_object"
-
-	    # A standard non-PIC object
-	    func_append non_pic_objects " $non_pic_object"
-	    if test -z "$pic_object" || test "$pic_object" = none ; then
-	      arg="$non_pic_object"
-	    fi
-	  else
-	    # If the PIC object exists, use it instead.
-	    # $xdir was prepended to $pic_object above.
-	    non_pic_object="$pic_object"
-	    func_append non_pic_objects " $non_pic_object"
-	  fi
-	else
-	  # Only an error if not doing a dry-run.
-	  if $opt_dry_run; then
-	    # Extract subdirectory from the argument.
-	    func_dirname "$arg" "/" ""
-	    xdir="$func_dirname_result"
-
-	    func_lo2o "$arg"
-	    pic_object=$xdir$objdir/$func_lo2o_result
-	    non_pic_object=$xdir$func_lo2o_result
-	    func_append libobjs " $pic_object"
-	    func_append non_pic_objects " $non_pic_object"
-	  else
-	    func_fatal_error "\`$arg' is not a valid libtool object"
-	  fi
-	fi
-	;;
-
-      *.$libext)
-	# An archive.
-	deplibs="$deplibs $arg"
-	old_deplibs="$old_deplibs $arg"
-	continue
-	;;
-
-      *.la)
-	# A libtool-controlled library.
-
-	if test "$prev" = dlfiles; then
-	  # This library was specified with -dlopen.
-	  dlfiles="$dlfiles $arg"
-	  prev=
-	elif test "$prev" = dlprefiles; then
-	  # The library was specified with -dlpreopen.
-	  dlprefiles="$dlprefiles $arg"
-	  prev=
-	else
-	  deplibs="$deplibs $arg"
-	fi
-	continue
-	;;
-
-      # Some other compiler argument.
-      *)
-	# Unknown arguments in both finalize_command and compile_command need
-	# to be aesthetically quoted because they are evaled later.
-	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-      esac # arg
-
-      # Now actually substitute the argument into the commands.
-      if test -n "$arg"; then
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-      fi
-    done # argument parsing loop
-
-    test -n "$prev" && \
-      func_fatal_help "the \`$prevarg' option requires an argument"
-
-    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
-      eval arg=\"$export_dynamic_flag_spec\"
-      func_append compile_command " $arg"
-      func_append finalize_command " $arg"
-    fi
-
-    oldlibs=
-    # calculate the name of the file, without its directory
-    func_basename "$output"
-    outputname="$func_basename_result"
-    libobjs_save="$libobjs"
-
-    if test -n "$shlibpath_var"; then
-      # get the directories listed in $shlibpath_var
-      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
-    else
-      shlib_search_path=
-    fi
-    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
-    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
-
-    func_dirname "$output" "/" ""
-    output_objdir="$func_dirname_result$objdir"
-    # Create the object directory.
-    func_mkdir_p "$output_objdir"
-
-    # Determine the type of output
-    case $output in
-    "")
-      func_fatal_help "you must specify an output file"
-      ;;
-    *.$libext) linkmode=oldlib ;;
-    *.lo | *.$objext) linkmode=obj ;;
-    *.la) linkmode=lib ;;
-    *) linkmode=prog ;; # Anything else should be a program.
-    esac
-
-    specialdeplibs=
-
-    libs=
-    # Find all interdependent deplibs by searching for libraries
-    # that are linked more than once (e.g. -la -lb -la)
-    for deplib in $deplibs; do
-      if $opt_duplicate_deps ; then
-	case "$libs " in
-	*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	esac
-      fi
-      libs="$libs $deplib"
-    done
-
-    if test "$linkmode" = lib; then
-      libs="$predeps $libs $compiler_lib_search_path $postdeps"
-
-      # Compute libraries that are listed more than once in $predeps
-      # $postdeps and mark them as special (i.e., whose duplicates are
-      # not to be eliminated).
-      pre_post_deps=
-      if $opt_duplicate_compiler_generated_deps; then
-	for pre_post_dep in $predeps $postdeps; do
-	  case "$pre_post_deps " in
-	  *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
-	  esac
-	  pre_post_deps="$pre_post_deps $pre_post_dep"
-	done
-      fi
-      pre_post_deps=
-    fi
-
-    deplibs=
-    newdependency_libs=
-    newlib_search_path=
-    need_relink=no # whether we're linking any uninstalled libtool libraries
-    notinst_deplibs= # not-installed libtool libraries
-    notinst_path= # paths that contain not-installed libtool libraries
-
-    case $linkmode in
-    lib)
-	passes="conv dlpreopen link"
-	for file in $dlfiles $dlprefiles; do
-	  case $file in
-	  *.la) ;;
-	  *)
-	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
-	    ;;
-	  esac
-	done
-	;;
-    prog)
-	compile_deplibs=
-	finalize_deplibs=
-	alldeplibs=no
-	newdlfiles=
-	newdlprefiles=
-	passes="conv scan dlopen dlpreopen link"
-	;;
-    *)  passes="conv"
-	;;
-    esac
-
-    for pass in $passes; do
-      # The preopen pass in lib mode reverses $deplibs; put it back here
-      # so that -L comes before libs that need it for instance...
-      if test "$linkmode,$pass" = "lib,link"; then
-	## FIXME: Find the place where the list is rebuilt in the wrong
-	##        order, and fix it there properly
-        tmp_deplibs=
-	for deplib in $deplibs; do
-	  tmp_deplibs="$deplib $tmp_deplibs"
-	done
-	deplibs="$tmp_deplibs"
-      fi
-
-      if test "$linkmode,$pass" = "lib,link" ||
-	 test "$linkmode,$pass" = "prog,scan"; then
-	libs="$deplibs"
-	deplibs=
-      fi
-      if test "$linkmode" = prog; then
-	case $pass in
-	dlopen) libs="$dlfiles" ;;
-	dlpreopen) libs="$dlprefiles" ;;
-	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
-	esac
-      fi
-      if test "$linkmode,$pass" = "lib,dlpreopen"; then
-	# Collect and forward deplibs of preopened libtool libs
-	for lib in $dlprefiles; do
-	  # Ignore non-libtool-libs
-	  dependency_libs=
-	  case $lib in
-	  *.la)	func_source "$lib" ;;
-	  esac
-
-	  # Collect preopened libtool deplibs, except any this library
-	  # has declared as weak libs
-	  for deplib in $dependency_libs; do
-	    func_basename "$deplib"
-            deplib_base=$func_basename_result
-	    case " $weak_libs " in
-	    *" $deplib_base "*) ;;
-	    *) deplibs="$deplibs $deplib" ;;
-	    esac
-	  done
-	done
-	libs="$dlprefiles"
-      fi
-      if test "$pass" = dlopen; then
-	# Collect dlpreopened libraries
-	save_deplibs="$deplibs"
-	deplibs=
-      fi
-
-      for deplib in $libs; do
-	lib=
-	found=no
-	case $deplib in
-	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
-	  if test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$deplib $compile_deplibs"
-	    finalize_deplibs="$deplib $finalize_deplibs"
-	  else
-	    compiler_flags="$compiler_flags $deplib"
-	    if test "$linkmode" = lib ; then
-		case "$new_inherited_linker_flags " in
-		    *" $deplib "*) ;;
-		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
-		esac
-	    fi
-	  fi
-	  continue
-	  ;;
-	-l*)
-	  if test "$linkmode" != lib && test "$linkmode" != prog; then
-	    func_warning "\`-l' is ignored for archives/objects"
-	    continue
-	  fi
-	  func_stripname '-l' '' "$deplib"
-	  name=$func_stripname_result
-	  if test "$linkmode" = lib; then
-	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
-	  else
-	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
-	  fi
-	  for searchdir in $searchdirs; do
-	    for search_ext in .la $std_shrext .so .a; do
-	      # Search the libtool library
-	      lib="$searchdir/lib${name}${search_ext}"
-	      if test -f "$lib"; then
-		if test "$search_ext" = ".la"; then
-		  found=yes
-		else
-		  found=no
-		fi
-		break 2
-	      fi
-	    done
-	  done
-	  if test "$found" != yes; then
-	    # deplib doesn't seem to be a libtool library
-	    if test "$linkmode,$pass" = "prog,link"; then
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      deplibs="$deplib $deplibs"
-	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    continue
-	  else # deplib is a libtool library
-	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
-	    # We need to do some special things here, and not later.
-	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	      case " $predeps $postdeps " in
-	      *" $deplib "*)
-		if func_lalib_p "$lib"; then
-		  library_names=
-		  old_library=
-		  func_source "$lib"
-		  for l in $old_library $library_names; do
-		    ll="$l"
-		  done
-		  if test "X$ll" = "X$old_library" ; then # only static version available
-		    found=no
-		    func_dirname "$lib" "" "."
-		    ladir="$func_dirname_result"
-		    lib=$ladir/$old_library
-		    if test "$linkmode,$pass" = "prog,link"; then
-		      compile_deplibs="$deplib $compile_deplibs"
-		      finalize_deplibs="$deplib $finalize_deplibs"
-		    else
-		      deplibs="$deplib $deplibs"
-		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-		    fi
-		    continue
-		  fi
-		fi
-		;;
-	      *) ;;
-	      esac
-	    fi
-	  fi
-	  ;; # -l
-	*.ltframework)
-	  if test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$deplib $compile_deplibs"
-	    finalize_deplibs="$deplib $finalize_deplibs"
-	  else
-	    deplibs="$deplib $deplibs"
-	    if test "$linkmode" = lib ; then
-		case "$new_inherited_linker_flags " in
-		    *" $deplib "*) ;;
-		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
-		esac
-	    fi
-	  fi
-	  continue
-	  ;;
-	-L*)
-	  case $linkmode in
-	  lib)
-	    deplibs="$deplib $deplibs"
-	    test "$pass" = conv && continue
-	    newdependency_libs="$deplib $newdependency_libs"
-	    func_stripname '-L' '' "$deplib"
-	    newlib_search_path="$newlib_search_path $func_stripname_result"
-	    ;;
-	  prog)
-	    if test "$pass" = conv; then
-	      deplibs="$deplib $deplibs"
-	      continue
-	    fi
-	    if test "$pass" = scan; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    func_stripname '-L' '' "$deplib"
-	    newlib_search_path="$newlib_search_path $func_stripname_result"
-	    ;;
-	  *)
-	    func_warning "\`-L' is ignored for archives/objects"
-	    ;;
-	  esac # linkmode
-	  continue
-	  ;; # -L
-	-R*)
-	  if test "$pass" = link; then
-	    func_stripname '-R' '' "$deplib"
-	    dir=$func_stripname_result
-	    # Make sure the xrpath contains only unique directories.
-	    case "$xrpath " in
-	    *" $dir "*) ;;
-	    *) xrpath="$xrpath $dir" ;;
-	    esac
-	  fi
-	  deplibs="$deplib $deplibs"
-	  continue
-	  ;;
-	*.la) lib="$deplib" ;;
-	*.$libext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	    continue
-	  fi
-	  case $linkmode in
-	  lib)
-	    # Linking convenience modules into shared libraries is allowed,
-	    # but linking other static libraries is non-portable.
-	    case " $dlpreconveniencelibs " in
-	    *" $deplib "*) ;;
-	    *)
-	      valid_a_lib=no
-	      case $deplibs_check_method in
-		match_pattern*)
-		  set dummy $deplibs_check_method; shift
-		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
-		    | $EGREP "$match_pattern_regex" > /dev/null; then
-		    valid_a_lib=yes
-		  fi
-		;;
-		pass_all)
-		  valid_a_lib=yes
-		;;
-	      esac
-	      if test "$valid_a_lib" != yes; then
-		echo
-		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
-		echo "*** I have the capability to make that library automatically link in when"
-		echo "*** you link to this library.  But I can only do this if you have a"
-		echo "*** shared version of the library, which you do not appear to have"
-		echo "*** because the file extensions .$libext of this argument makes me believe"
-		echo "*** that it is just a static archive that I should not use here."
-	      else
-		echo
-		$ECHO "*** Warning: Linking the shared library $output against the"
-		$ECHO "*** static library $deplib is not portable!"
-		deplibs="$deplib $deplibs"
-	      fi
-	      ;;
-	    esac
-	    continue
-	    ;;
-	  prog)
-	    if test "$pass" != link; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    continue
-	    ;;
-	  esac # linkmode
-	  ;; # *.$libext
-	*.lo | *.$objext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	  elif test "$linkmode" = prog; then
-	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
-	      # If there is no dlopen support or we're linking statically,
-	      # we need to preload.
-	      newdlprefiles="$newdlprefiles $deplib"
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      newdlfiles="$newdlfiles $deplib"
-	    fi
-	  fi
-	  continue
-	  ;;
-	%DEPLIBS%)
-	  alldeplibs=yes
-	  continue
-	  ;;
-	esac # case $deplib
-
-	if test "$found" = yes || test -f "$lib"; then :
-	else
-	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
-	fi
-
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$lib" \
-	  || func_fatal_error "\`$lib' is not a valid libtool archive"
-
-	func_dirname "$lib" "" "."
-	ladir="$func_dirname_result"
-
-	dlname=
-	dlopen=
-	dlpreopen=
-	libdir=
-	library_names=
-	old_library=
-	inherited_linker_flags=
-	# If the library was installed with an old release of libtool,
-	# it will not redefine variables installed, or shouldnotlink
-	installed=yes
-	shouldnotlink=no
-	avoidtemprpath=
-
-
-	# Read the .la file
-	func_source "$lib"
-
-	# Convert "-framework foo" to "foo.ltframework"
-	if test -n "$inherited_linker_flags"; then
-	  tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
-	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
-	    case " $new_inherited_linker_flags " in
-	      *" $tmp_inherited_linker_flag "*) ;;
-	      *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";;
-	    esac
-	  done
-	fi
-	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	if test "$linkmode,$pass" = "lib,link" ||
-	   test "$linkmode,$pass" = "prog,scan" ||
-	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
-	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
-	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
-	fi
-
-	if test "$pass" = conv; then
-	  # Only check for convenience libraries
-	  deplibs="$lib $deplibs"
-	  if test -z "$libdir"; then
-	    if test -z "$old_library"; then
-	      func_fatal_error "cannot find name of link library for \`$lib'"
-	    fi
-	    # It is a libtool convenience library, so add in its objects.
-	    convenience="$convenience $ladir/$objdir/$old_library"
-	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
-	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
-	    func_fatal_error "\`$lib' is not a convenience library"
-	  fi
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    deplibs="$deplib $deplibs"
-	    if $opt_duplicate_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
-	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done
-	  continue
-	fi # $pass = conv
-
-
-	# Get the name of the library we link against.
-	linklib=
-	for l in $old_library $library_names; do
-	  linklib="$l"
-	done
-	if test -z "$linklib"; then
-	  func_fatal_error "cannot find name of link library for \`$lib'"
-	fi
-
-	# This library was specified with -dlopen.
-	if test "$pass" = dlopen; then
-	  if test -z "$libdir"; then
-	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
-	  fi
-	  if test -z "$dlname" ||
-	     test "$dlopen_support" != yes ||
-	     test "$build_libtool_libs" = no; then
-	    # If there is no dlname, no dlopen support or we're linking
-	    # statically, we need to preload.  We also need to preload any
-	    # dependent libraries so libltdl's deplib preloader doesn't
-	    # bomb out in the load deplibs phase.
-	    dlprefiles="$dlprefiles $lib $dependency_libs"
-	  else
-	    newdlfiles="$newdlfiles $lib"
-	  fi
-	  continue
-	fi # $pass = dlopen
-
-	# We need an absolute path.
-	case $ladir in
-	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
-	*)
-	  abs_ladir=`cd "$ladir" && pwd`
-	  if test -z "$abs_ladir"; then
-	    func_warning "cannot determine absolute directory name of \`$ladir'"
-	    func_warning "passing it literally to the linker, although it might fail"
-	    abs_ladir="$ladir"
-	  fi
-	  ;;
-	esac
-	func_basename "$lib"
-	laname="$func_basename_result"
-
-	# Find the relevant object directory and library name.
-	if test "X$installed" = Xyes; then
-	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    func_warning "library \`$lib' was moved."
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    libdir="$abs_ladir"
-	  else
-	    dir="$libdir"
-	    absdir="$libdir"
-	  fi
-	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
-	else
-	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    # Remove this search path later
-	    notinst_path="$notinst_path $abs_ladir"
-	  else
-	    dir="$ladir/$objdir"
-	    absdir="$abs_ladir/$objdir"
-	    # Remove this search path later
-	    notinst_path="$notinst_path $abs_ladir"
-	  fi
-	fi # $installed = yes
-	func_stripname 'lib' '.la' "$laname"
-	name=$func_stripname_result
-
-	# This library was specified with -dlpreopen.
-	if test "$pass" = dlpreopen; then
-	  if test -z "$libdir" && test "$linkmode" = prog; then
-	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
-	  fi
-	  # Prefer using a static library (so that no silly _DYNAMIC symbols
-	  # are required to link).
-	  if test -n "$old_library"; then
-	    newdlprefiles="$newdlprefiles $dir/$old_library"
-	    # Keep a list of preopened convenience libraries to check
-	    # that they are being used correctly in the link pass.
-	    test -z "$libdir" && \
-		dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library"
-	  # Otherwise, use the dlname, so that lt_dlopen finds it.
-	  elif test -n "$dlname"; then
-	    newdlprefiles="$newdlprefiles $dir/$dlname"
-	  else
-	    newdlprefiles="$newdlprefiles $dir/$linklib"
-	  fi
-	fi # $pass = dlpreopen
-
-	if test -z "$libdir"; then
-	  # Link the convenience library
-	  if test "$linkmode" = lib; then
-	    deplibs="$dir/$old_library $deplibs"
-	  elif test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$dir/$old_library $compile_deplibs"
-	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
-	  else
-	    deplibs="$lib $deplibs" # used for prog,scan pass
-	  fi
-	  continue
-	fi
-
-
-	if test "$linkmode" = prog && test "$pass" != link; then
-	  newlib_search_path="$newlib_search_path $ladir"
-	  deplibs="$lib $deplibs"
-
-	  linkalldeplibs=no
-	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
-	     test "$build_libtool_libs" = no; then
-	    linkalldeplibs=yes
-	  fi
-
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    case $deplib in
-	    -L*) func_stripname '-L' '' "$deplib"
-	         newlib_search_path="$newlib_search_path $func_stripname_result"
-		 ;;
-	    esac
-	    # Need to link against all dependency_libs?
-	    if test "$linkalldeplibs" = yes; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      # Need to hardcode shared library paths
-	      # or/and link against static libraries
-	      newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    if $opt_duplicate_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
-	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done # for deplib
-	  continue
-	fi # $linkmode = prog...
-
-	if test "$linkmode,$pass" = "prog,link"; then
-	  if test -n "$library_names" &&
-	     { { test "$prefer_static_libs" = no ||
-	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
-	       test -z "$old_library"; }; then
-	    # We need to hardcode the library path
-	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
-	      # Make sure the rpath contains only unique directories.
-	      case "$temp_rpath:" in
-	      *"$absdir:"*) ;;
-	      *) temp_rpath="$temp_rpath$absdir:" ;;
-	      esac
-	    fi
-
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) compile_rpath="$compile_rpath $absdir"
-	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) finalize_rpath="$finalize_rpath $libdir"
-	      esac
-	      ;;
-	    esac
-	  fi # $linkmode,$pass = prog,link...
-
-	  if test "$alldeplibs" = yes &&
-	     { test "$deplibs_check_method" = pass_all ||
-	       { test "$build_libtool_libs" = yes &&
-		 test -n "$library_names"; }; }; then
-	    # We only need to search for static libraries
-	    continue
-	  fi
-	fi
-
-	link_static=no # Whether the deplib will be linked statically
-	use_static_libs=$prefer_static_libs
-	if test "$use_static_libs" = built && test "$installed" = yes; then
-	  use_static_libs=no
-	fi
-	if test -n "$library_names" &&
-	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
-	  case $host in
-	  *cygwin* | *mingw* | *cegcc*)
-	      # No point in relinking DLLs because paths are not encoded
-	      notinst_deplibs="$notinst_deplibs $lib"
-	      need_relink=no
-	    ;;
-	  *)
-	    if test "$installed" = no; then
-	      notinst_deplibs="$notinst_deplibs $lib"
-	      need_relink=yes
-	    fi
-	    ;;
-	  esac
-	  # This is a shared library
-
-	  # Warn about portability, can't link against -module's on some
-	  # systems (darwin).  Don't bleat about dlopened modules though!
-	  dlopenmodule=""
-	  for dlpremoduletest in $dlprefiles; do
-	    if test "X$dlpremoduletest" = "X$lib"; then
-	      dlopenmodule="$dlpremoduletest"
-	      break
-	    fi
-	  done
-	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
-	    echo
-	    if test "$linkmode" = prog; then
-	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
-	    else
-	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
-	    fi
-	    $ECHO "*** $linklib is not portable!"
-	  fi
-	  if test "$linkmode" = lib &&
-	     test "$hardcode_into_libs" = yes; then
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) compile_rpath="$compile_rpath $absdir"
-	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) finalize_rpath="$finalize_rpath $libdir"
-	      esac
-	      ;;
-	    esac
-	  fi
-
-	  if test -n "$old_archive_from_expsyms_cmds"; then
-	    # figure out the soname
-	    set dummy $library_names
-	    shift
-	    realname="$1"
-	    shift
-	    libname=`eval "\\$ECHO \"$libname_spec\""`
-	    # use dlname if we got it. it's perfectly good, no?
-	    if test -n "$dlname"; then
-	      soname="$dlname"
-	    elif test -n "$soname_spec"; then
-	      # bleh windows
-	      case $host in
-	      *cygwin* | mingw* | *cegcc*)
-	        func_arith $current - $age
-		major=$func_arith_result
-		versuffix="-$major"
-		;;
-	      esac
-	      eval soname=\"$soname_spec\"
-	    else
-	      soname="$realname"
-	    fi
-
-	    # Make a new name for the extract_expsyms_cmds to use
-	    soroot="$soname"
-	    func_basename "$soroot"
-	    soname="$func_basename_result"
-	    func_stripname 'lib' '.dll' "$soname"
-	    newlib=libimp-$func_stripname_result.a
-
-	    # If the library has no export list, then create one now
-	    if test -f "$output_objdir/$soname-def"; then :
-	    else
-	      func_verbose "extracting exported symbol list from \`$soname'"
-	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
-	    fi
-
-	    # Create $newlib
-	    if test -f "$output_objdir/$newlib"; then :; else
-	      func_verbose "generating import library for \`$soname'"
-	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
-	    fi
-	    # make sure the library variables are pointing to the new library
-	    dir=$output_objdir
-	    linklib=$newlib
-	  fi # test -n "$old_archive_from_expsyms_cmds"
-
-	  if test "$linkmode" = prog || test "$mode" != relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    lib_linked=yes
-	    case $hardcode_action in
-	    immediate | unsupported)
-	      if test "$hardcode_direct" = no; then
-		add="$dir/$linklib"
-		case $host in
-		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
-		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
-		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
-		    *-*-unixware7*) add_dir="-L$dir" ;;
-		  *-*-darwin* )
-		    # if the lib is a (non-dlopened) module then we can not
-		    # link against it, someone is ignoring the earlier warnings
-		    if /usr/bin/file -L $add 2> /dev/null |
-			 $GREP ": [^:]* bundle" >/dev/null ; then
-		      if test "X$dlopenmodule" != "X$lib"; then
-			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
-			if test -z "$old_library" ; then
-			  echo
-			  echo "*** And there doesn't seem to be a static archive available"
-			  echo "*** The link will probably fail, sorry"
-			else
-			  add="$dir/$old_library"
-			fi
-		      elif test -n "$old_library"; then
-			add="$dir/$old_library"
-		      fi
-		    fi
-		esac
-	      elif test "$hardcode_minus_L" = no; then
-		case $host in
-		*-*-sunos*) add_shlibpath="$dir" ;;
-		esac
-		add_dir="-L$dir"
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = no; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    relink)
-	      if test "$hardcode_direct" = yes &&
-	         test "$hardcode_direct_absolute" = no; then
-		add="$dir/$linklib"
-	      elif test "$hardcode_minus_L" = yes; then
-		add_dir="-L$dir"
-		# Try looking first in the location we're being installed to.
-		if test -n "$inst_prefix_dir"; then
-		  case $libdir in
-		    [\\/]*)
-		      add_dir="$add_dir -L$inst_prefix_dir$libdir"
-		      ;;
-		  esac
-		fi
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = yes; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    *) lib_linked=no ;;
-	    esac
-
-	    if test "$lib_linked" != yes; then
-	      func_fatal_configuration "unsupported hardcode properties"
-	    fi
-
-	    if test -n "$add_shlibpath"; then
-	      case :$compile_shlibpath: in
-	      *":$add_shlibpath:"*) ;;
-	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
-	      esac
-	    fi
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
-	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	      if test "$hardcode_direct" != yes &&
-		 test "$hardcode_minus_L" != yes &&
-		 test "$hardcode_shlibpath_var" = yes; then
-		case :$finalize_shlibpath: in
-		*":$libdir:"*) ;;
-		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
-		esac
-	      fi
-	    fi
-	  fi
-
-	  if test "$linkmode" = prog || test "$mode" = relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    # Finalize command for both is simple: just hardcode it.
-	    if test "$hardcode_direct" = yes &&
-	       test "$hardcode_direct_absolute" = no; then
-	      add="$libdir/$linklib"
-	    elif test "$hardcode_minus_L" = yes; then
-	      add_dir="-L$libdir"
-	      add="-l$name"
-	    elif test "$hardcode_shlibpath_var" = yes; then
-	      case :$finalize_shlibpath: in
-	      *":$libdir:"*) ;;
-	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
-	      esac
-	      add="-l$name"
-	    elif test "$hardcode_automatic" = yes; then
-	      if test -n "$inst_prefix_dir" &&
-		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
-		add="$inst_prefix_dir$libdir/$linklib"
-	      else
-		add="$libdir/$linklib"
-	      fi
-	    else
-	      # We cannot seem to hardcode it, guess we'll fake it.
-	      add_dir="-L$libdir"
-	      # Try looking first in the location we're being installed to.
-	      if test -n "$inst_prefix_dir"; then
-		case $libdir in
-		  [\\/]*)
-		    add_dir="$add_dir -L$inst_prefix_dir$libdir"
-		    ;;
-		esac
-	      fi
-	      add="-l$name"
-	    fi
-
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
-	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	    fi
-	  fi
-	elif test "$linkmode" = prog; then
-	  # Here we assume that one of hardcode_direct or hardcode_minus_L
-	  # is not unsupported.  This is valid on all known static and
-	  # shared platforms.
-	  if test "$hardcode_direct" != unsupported; then
-	    test -n "$old_library" && linklib="$old_library"
-	    compile_deplibs="$dir/$linklib $compile_deplibs"
-	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
-	  else
-	    compile_deplibs="-l$name -L$dir $compile_deplibs"
-	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
-	  fi
-	elif test "$build_libtool_libs" = yes; then
-	  # Not a shared library
-	  if test "$deplibs_check_method" != pass_all; then
-	    # We're trying link a shared library against a static one
-	    # but the system doesn't support it.
-
-	    # Just print a warning and add the library to dependency_libs so
-	    # that the program can be linked against the static library.
-	    echo
-	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
-	    echo "*** I have the capability to make that library automatically link in when"
-	    echo "*** you link to this library.  But I can only do this if you have a"
-	    echo "*** shared version of the library, which you do not appear to have."
-	    if test "$module" = yes; then
-	      echo "*** But as you try to build a module library, libtool will still create "
-	      echo "*** a static module, that should work as long as the dlopening application"
-	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
-	      if test -z "$global_symbol_pipe"; then
-		echo
-		echo "*** However, this would only work if libtool was able to extract symbol"
-		echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
-		echo "*** not find such a program.  So, this module is probably useless."
-		echo "*** \`nm' from GNU binutils and a full rebuild may help."
-	      fi
-	      if test "$build_old_libs" = no; then
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
-	  else
-	    deplibs="$dir/$old_library $deplibs"
-	    link_static=yes
-	  fi
-	fi # link shared/static library?
-
-	if test "$linkmode" = lib; then
-	  if test -n "$dependency_libs" &&
-	     { test "$hardcode_into_libs" != yes ||
-	       test "$build_old_libs" = yes ||
-	       test "$link_static" = yes; }; then
-	    # Extract -R from dependency_libs
-	    temp_deplibs=
-	    for libdir in $dependency_libs; do
-	      case $libdir in
-	      -R*) func_stripname '-R' '' "$libdir"
-	           temp_xrpath=$func_stripname_result
-		   case " $xrpath " in
-		   *" $temp_xrpath "*) ;;
-		   *) xrpath="$xrpath $temp_xrpath";;
-		   esac;;
-	      *) temp_deplibs="$temp_deplibs $libdir";;
-	      esac
-	    done
-	    dependency_libs="$temp_deplibs"
-	  fi
-
-	  newlib_search_path="$newlib_search_path $absdir"
-	  # Link against this library
-	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
-	  # ... and its dependency_libs
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    newdependency_libs="$deplib $newdependency_libs"
-	    if $opt_duplicate_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
-	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done
-
-	  if test "$link_all_deplibs" != no; then
-	    # Add the search paths of all dependency libraries
-	    for deplib in $dependency_libs; do
-	      path=
-	      case $deplib in
-	      -L*) path="$deplib" ;;
-	      *.la)
-	        func_dirname "$deplib" "" "."
-		dir="$func_dirname_result"
-		# We need an absolute path.
-		case $dir in
-		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
-		*)
-		  absdir=`cd "$dir" && pwd`
-		  if test -z "$absdir"; then
-		    func_warning "cannot determine absolute directory name of \`$dir'"
-		    absdir="$dir"
-		  fi
-		  ;;
-		esac
-		if $GREP "^installed=no" $deplib > /dev/null; then
-		case $host in
-		*-*-darwin*)
-		  depdepl=
-		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
-		  if test -n "$deplibrary_names" ; then
-		    for tmp in $deplibrary_names ; do
-		      depdepl=$tmp
-		    done
-		    if test -f "$absdir/$objdir/$depdepl" ; then
-		      depdepl="$absdir/$objdir/$depdepl"
-		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
-                      if test -z "$darwin_install_name"; then
-                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
-                      fi
-		      compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
-		      linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}"
-		      path=
-		    fi
-		  fi
-		  ;;
-		*)
-		  path="-L$absdir/$objdir"
-		  ;;
-		esac
-		else
-		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		  test -z "$libdir" && \
-		    func_fatal_error "\`$deplib' is not a valid libtool archive"
-		  test "$absdir" != "$libdir" && \
-		    func_warning "\`$deplib' seems to be moved"
-
-		  path="-L$absdir"
-		fi
-		;;
-	      esac
-	      case " $deplibs " in
-	      *" $path "*) ;;
-	      *) deplibs="$path $deplibs" ;;
-	      esac
-	    done
-	  fi # link_all_deplibs != no
-	fi # linkmode = lib
-      done # for deplib in $libs
-      if test "$pass" = link; then
-	if test "$linkmode" = "prog"; then
-	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
-	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
-	else
-	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	fi
-      fi
-      dependency_libs="$newdependency_libs"
-      if test "$pass" = dlpreopen; then
-	# Link the dlpreopened libraries before other libraries
-	for deplib in $save_deplibs; do
-	  deplibs="$deplib $deplibs"
-	done
-      fi
-      if test "$pass" != dlopen; then
-	if test "$pass" != conv; then
-	  # Make sure lib_search_path contains only unique directories.
-	  lib_search_path=
-	  for dir in $newlib_search_path; do
-	    case "$lib_search_path " in
-	    *" $dir "*) ;;
-	    *) lib_search_path="$lib_search_path $dir" ;;
-	    esac
-	  done
-	  newlib_search_path=
-	fi
-
-	if test "$linkmode,$pass" != "prog,link"; then
-	  vars="deplibs"
-	else
-	  vars="compile_deplibs finalize_deplibs"
-	fi
-	for var in $vars dependency_libs; do
-	  # Add libraries to $var in reverse order
-	  eval tmp_libs=\"\$$var\"
-	  new_libs=
-	  for deplib in $tmp_libs; do
-	    # FIXME: Pedantically, this is the right thing to do, so
-	    #        that some nasty dependency loop isn't accidentally
-	    #        broken:
-	    #new_libs="$deplib $new_libs"
-	    # Pragmatically, this seems to cause very few problems in
-	    # practice:
-	    case $deplib in
-	    -L*) new_libs="$deplib $new_libs" ;;
-	    -R*) ;;
-	    *)
-	      # And here is the reason: when a library appears more
-	      # than once as an explicit dependence of a library, or
-	      # is implicitly linked in more than once by the
-	      # compiler, it is considered special, and multiple
-	      # occurrences thereof are not removed.  Compare this
-	      # with having the same library being listed as a
-	      # dependency of multiple other libraries: in this case,
-	      # we know (pedantically, we assume) the library does not
-	      # need to be listed more than once, so we keep only the
-	      # last copy.  This is not always right, but it is rare
-	      # enough that we require users that really mean to play
-	      # such unportable linking tricks to link the library
-	      # using -Wl,-lname, so that libtool does not consider it
-	      # for duplicate removal.
-	      case " $specialdeplibs " in
-	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
-	      *)
-		case " $new_libs " in
-		*" $deplib "*) ;;
-		*) new_libs="$deplib $new_libs" ;;
-		esac
-		;;
-	      esac
-	      ;;
-	    esac
-	  done
-	  tmp_libs=
-	  for deplib in $new_libs; do
-	    case $deplib in
-	    -L*)
-	      case " $tmp_libs " in
-	      *" $deplib "*) ;;
-	      *) tmp_libs="$tmp_libs $deplib" ;;
-	      esac
-	      ;;
-	    *) tmp_libs="$tmp_libs $deplib" ;;
-	    esac
-	  done
-	  eval $var=\"$tmp_libs\"
-	done # for var
-      fi
-      # Last step: remove runtime libs from dependency_libs
-      # (they stay in deplibs)
-      tmp_libs=
-      for i in $dependency_libs ; do
-	case " $predeps $postdeps $compiler_lib_search_path " in
-	*" $i "*)
-	  i=""
-	  ;;
-	esac
-	if test -n "$i" ; then
-	  tmp_libs="$tmp_libs $i"
-	fi
-      done
-      dependency_libs=$tmp_libs
-    done # for pass
-    if test "$linkmode" = prog; then
-      dlfiles="$newdlfiles"
-    fi
-    if test "$linkmode" = prog || test "$linkmode" = lib; then
-      dlprefiles="$newdlprefiles"
-    fi
-
-    case $linkmode in
-    oldlib)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for archives"
-      fi
-
-      case " $deplibs" in
-      *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for archives" ;;
-      esac
-
-      test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for archives"
-
-      test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for archives"
-
-      test -n "$vinfo" && \
-	func_warning "\`-version-info/-version-number' is ignored for archives"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for archives"
-
-      test -n "$export_symbols$export_symbols_regex" && \
-	func_warning "\`-export-symbols' is ignored for archives"
-
-      # Now set the variables for building old libraries.
-      build_libtool_libs=no
-      oldlibs="$output"
-      objs="$objs$old_deplibs"
-      ;;
-
-    lib)
-      # Make sure we only generate libraries of the form `libNAME.la'.
-      case $outputname in
-      lib*)
-	func_stripname 'lib' '.la' "$outputname"
-	name=$func_stripname_result
-	eval shared_ext=\"$shrext_cmds\"
-	eval libname=\"$libname_spec\"
-	;;
-      *)
-	test "$module" = no && \
-	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
-
-	if test "$need_lib_prefix" != no; then
-	  # Add the "lib" prefix for modules if required
-	  func_stripname '' '.la' "$outputname"
-	  name=$func_stripname_result
-	  eval shared_ext=\"$shrext_cmds\"
-	  eval libname=\"$libname_spec\"
-	else
-	  func_stripname '' '.la' "$outputname"
-	  libname=$func_stripname_result
-	fi
-	;;
-      esac
-
-      if test -n "$objs"; then
-	if test "$deplibs_check_method" != pass_all; then
-	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
-	else
-	  echo
-	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
-	  $ECHO "*** objects $objs is not portable!"
-	  libobjs="$libobjs $objs"
-	fi
-      fi
-
-      test "$dlself" != no && \
-	func_warning "\`-dlopen self' is ignored for libtool libraries"
-
-      set dummy $rpath
-      shift
-      test "$#" -gt 1 && \
-	func_warning "ignoring multiple \`-rpath's for a libtool library"
-
-      install_libdir="$1"
-
-      oldlibs=
-      if test -z "$rpath"; then
-	if test "$build_libtool_libs" = yes; then
-	  # Building a libtool convenience library.
-	  # Some compilers have problems with a `.al' extension so
-	  # convenience libraries should have the same extension an
-	  # archive normally would.
-	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
-	  build_libtool_libs=convenience
-	  build_old_libs=yes
-	fi
-
-	test -n "$vinfo" && \
-	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
-
-	test -n "$release" && \
-	  func_warning "\`-release' is ignored for convenience libraries"
-      else
-
-	# Parse the version information argument.
-	save_ifs="$IFS"; IFS=':'
-	set dummy $vinfo 0 0 0
-	shift
-	IFS="$save_ifs"
-
-	test -n "$7" && \
-	  func_fatal_help "too many parameters to \`-version-info'"
-
-	# convert absolute version numbers to libtool ages
-	# this retains compatibility with .la files and attempts
-	# to make the code below a bit more comprehensible
-
-	case $vinfo_number in
-	yes)
-	  number_major="$1"
-	  number_minor="$2"
-	  number_revision="$3"
-	  #
-	  # There are really only two kinds -- those that
-	  # use the current revision as the major version
-	  # and those that subtract age and use age as
-	  # a minor version.  But, then there is irix
-	  # which has an extra 1 added just for fun
-	  #
-	  case $version_type in
-	  darwin|linux|osf|windows|none)
-	    func_arith $number_major + $number_minor
-	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_revision"
-	    ;;
-	  freebsd-aout|freebsd-elf|qnx|sunos)
-	    current="$number_major"
-	    revision="$number_minor"
-	    age="0"
-	    ;;
-	  irix|nonstopux)
-	    func_arith $number_major + $number_minor
-	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_minor"
-	    lt_irix_increment=no
-	    ;;
-	  esac
-	  ;;
-	no)
-	  current="$1"
-	  revision="$2"
-	  age="$3"
-	  ;;
-	esac
-
-	# Check that each of the things are valid numbers.
-	case $current in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "CURRENT \`$current' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	case $revision in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "REVISION \`$revision' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	case $age in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "AGE \`$age' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	if test "$age" -gt "$current"; then
-	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	fi
-
-	# Calculate the version variables.
-	major=
-	versuffix=
-	verstring=
-	case $version_type in
-	none) ;;
-
-	darwin)
-	  # Like Linux, but with the current version available in
-	  # verstring for coding it into the library header
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
-	  # Darwin ld doesn't like 0 for these options...
-	  func_arith $current + 1
-	  minor_current=$func_arith_result
-	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
-	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
-	  ;;
-
-	freebsd-aout)
-	  major=".$current"
-	  versuffix=".$current.$revision";
-	  ;;
-
-	freebsd-elf)
-	  major=".$current"
-	  versuffix=".$current"
-	  ;;
-
-	irix | nonstopux)
-	  if test "X$lt_irix_increment" = "Xno"; then
-	    func_arith $current - $age
-	  else
-	    func_arith $current - $age + 1
-	  fi
-	  major=$func_arith_result
-
-	  case $version_type in
-	    nonstopux) verstring_prefix=nonstopux ;;
-	    *)         verstring_prefix=sgi ;;
-	  esac
-	  verstring="$verstring_prefix$major.$revision"
-
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$revision
-	  while test "$loop" -ne 0; do
-	    func_arith $revision - $loop
-	    iface=$func_arith_result
-	    func_arith $loop - 1
-	    loop=$func_arith_result
-	    verstring="$verstring_prefix$major.$iface:$verstring"
-	  done
-
-	  # Before this point, $major must not contain `.'.
-	  major=.$major
-	  versuffix="$major.$revision"
-	  ;;
-
-	linux)
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
-	  ;;
-
-	osf)
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix=".$current.$age.$revision"
-	  verstring="$current.$age.$revision"
-
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$age
-	  while test "$loop" -ne 0; do
-	    func_arith $current - $loop
-	    iface=$func_arith_result
-	    func_arith $loop - 1
-	    loop=$func_arith_result
-	    verstring="$verstring:${iface}.0"
-	  done
-
-	  # Make executables depend on our current version.
-	  verstring="$verstring:${current}.0"
-	  ;;
-
-	qnx)
-	  major=".$current"
-	  versuffix=".$current"
-	  ;;
-
-	sunos)
-	  major=".$current"
-	  versuffix=".$current.$revision"
-	  ;;
-
-	windows)
-	  # Use '-' rather than '.', since we only want one
-	  # extension on DOS 8.3 filesystems.
-	  func_arith $current - $age
-	  major=$func_arith_result
-	  versuffix="-$major"
-	  ;;
-
-	*)
-	  func_fatal_configuration "unknown library version type \`$version_type'"
-	  ;;
-	esac
-
-	# Clear the version info if we defaulted, and they specified a release.
-	if test -z "$vinfo" && test -n "$release"; then
-	  major=
-	  case $version_type in
-	  darwin)
-	    # we can't check for "0.0" in archive_cmds due to quoting
-	    # problems, so we reset it completely
-	    verstring=
-	    ;;
-	  *)
-	    verstring="0.0"
-	    ;;
-	  esac
-	  if test "$need_version" = no; then
-	    versuffix=
-	  else
-	    versuffix=".0.0"
-	  fi
-	fi
-
-	# Remove version info from name if versioning should be avoided
-	if test "$avoid_version" = yes && test "$need_version" = no; then
-	  major=
-	  versuffix=
-	  verstring=""
-	fi
-
-	# Check to see if the archive will have undefined symbols.
-	if test "$allow_undefined" = yes; then
-	  if test "$allow_undefined_flag" = unsupported; then
-	    func_warning "undefined symbols not allowed in $host shared libraries"
-	    build_libtool_libs=no
-	    build_old_libs=yes
-	  fi
-	else
-	  # Don't allow undefined symbols.
-	  allow_undefined_flag="$no_undefined_flag"
-	fi
-
-      fi
-
-      func_generate_dlsyms "$libname" "$libname" "yes"
-      libobjs="$libobjs $symfileobj"
-      test "X$libobjs" = "X " && libobjs=
-
-      if test "$mode" != relink; then
-	# Remove our outputs, but don't remove object files since they
-	# may have been created when compiling PIC objects.
-	removelist=
-	tempremovelist=`$ECHO "$output_objdir/*"`
-	for p in $tempremovelist; do
-	  case $p in
-	    *.$objext | *.gcno)
-	       ;;
-	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
-	       if test "X$precious_files_regex" != "X"; then
-		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
-		 then
-		   continue
-		 fi
-	       fi
-	       removelist="$removelist $p"
-	       ;;
-	    *) ;;
-	  esac
-	done
-	test -n "$removelist" && \
-	  func_show_eval "${RM}r \$removelist"
-      fi
-
-      # Now set the variables for building old libraries.
-      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
-	oldlibs="$oldlibs $output_objdir/$libname.$libext"
-
-	# Transform .lo files to .o files.
-	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
-      fi
-
-      # Eliminate all temporary directories.
-      #for path in $notinst_path; do
-      #	lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
-      #	deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
-      #	dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
-      #done
-
-      if test -n "$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	temp_xrpath=
-	for libdir in $xrpath; do
-	  temp_xrpath="$temp_xrpath -R$libdir"
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_rpath="$finalize_rpath $libdir" ;;
-	  esac
-	done
-	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
-	  dependency_libs="$temp_xrpath $dependency_libs"
-	fi
-      fi
-
-      # Make sure dlfiles contains only unique files that won't be dlpreopened
-      old_dlfiles="$dlfiles"
-      dlfiles=
-      for lib in $old_dlfiles; do
-	case " $dlprefiles $dlfiles " in
-	*" $lib "*) ;;
-	*) dlfiles="$dlfiles $lib" ;;
-	esac
-      done
-
-      # Make sure dlprefiles contains only unique files
-      old_dlprefiles="$dlprefiles"
-      dlprefiles=
-      for lib in $old_dlprefiles; do
-	case "$dlprefiles " in
-	*" $lib "*) ;;
-	*) dlprefiles="$dlprefiles $lib" ;;
-	esac
-      done
-
-      if test "$build_libtool_libs" = yes; then
-	if test -n "$rpath"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
-	    # these systems don't actually have a c library (as such)!
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C library is in the System framework
-	    deplibs="$deplibs System.ltframework"
-	    ;;
-	  *-*-netbsd*)
-	    # Don't link with libc until the a.out ld.so is fixed.
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    ;;
-	  *)
-	    # Add libc to deplibs on all other systems if necessary.
-	    if test "$build_libtool_need_lc" = "yes"; then
-	      deplibs="$deplibs -lc"
-	    fi
-	    ;;
-	  esac
-	fi
-
-	# Transform deplibs into only deplibs that can be linked in shared.
-	name_save=$name
-	libname_save=$libname
-	release_save=$release
-	versuffix_save=$versuffix
-	major_save=$major
-	# I'm not sure if I'm treating the release correctly.  I think
-	# release should show up in the -l (ie -lgmp5) so we don't want to
-	# add it in twice.  Is that correct?
-	release=""
-	versuffix=""
-	major=""
-	newdeplibs=
-	droppeddeps=no
-	case $deplibs_check_method in
-	pass_all)
-	  # Don't check for shared/static.  Everything works.
-	  # This might be a little naive.  We might want to check
-	  # whether the library exists or not.  But this is on
-	  # osf3 & osf4 and I'm not really sure... Just
-	  # implementing what was already the behavior.
-	  newdeplibs=$deplibs
-	  ;;
-	test_compile)
-	  # This code stresses the "libraries are programs" paradigm to its
-	  # limits. Maybe even breaks it.  We compile a program, linking it
-	  # against the deplibs as a proxy for the library.  Then we can check
-	  # whether they linked in statically or dynamically with ldd.
-	  $opt_dry_run || $RM conftest.c
-	  cat > conftest.c <<EOF
-	  int main() { return 0; }
-EOF
-	  $opt_dry_run || $RM conftest
-	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
-	    ldd_output=`ldd conftest`
-	    for i in $deplibs; do
-	      case $i in
-	      -l*)
-		func_stripname -l '' "$i"
-		name=$func_stripname_result
-		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		  case " $predeps $postdeps " in
-		  *" $i "*)
-		    newdeplibs="$newdeplibs $i"
-		    i=""
-		    ;;
-		  esac
-		fi
-		if test -n "$i" ; then
-		  libname=`eval "\\$ECHO \"$libname_spec\""`
-		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
-		  set dummy $deplib_matches; shift
-		  deplib_match=$1
-		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		    newdeplibs="$newdeplibs $i"
-		  else
-		    droppeddeps=yes
-		    echo
-		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
-		    echo "*** I have the capability to make that library automatically link in when"
-		    echo "*** you link to this library.  But I can only do this if you have a"
-		    echo "*** shared version of the library, which I believe you do not have"
-		    echo "*** because a test_compile did reveal that the linker did not use it for"
-		    echo "*** its dynamic dependency list that programs get resolved with at runtime."
-		  fi
-		fi
-		;;
-	      *)
-		newdeplibs="$newdeplibs $i"
-		;;
-	      esac
-	    done
-	  else
-	    # Error occurred in the first compile.  Let's try to salvage
-	    # the situation: Compile a separate program for each library.
-	    for i in $deplibs; do
-	      case $i in
-	      -l*)
-		func_stripname -l '' "$i"
-		name=$func_stripname_result
-		$opt_dry_run || $RM conftest
-		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
-		  ldd_output=`ldd conftest`
-		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		    case " $predeps $postdeps " in
-		    *" $i "*)
-		      newdeplibs="$newdeplibs $i"
-		      i=""
-		      ;;
-		    esac
-		  fi
-		  if test -n "$i" ; then
-		    libname=`eval "\\$ECHO \"$libname_spec\""`
-		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
-		    set dummy $deplib_matches; shift
-		    deplib_match=$1
-		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		      newdeplibs="$newdeplibs $i"
-		    else
-		      droppeddeps=yes
-		      echo
-		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
-		      echo "*** I have the capability to make that library automatically link in when"
-		      echo "*** you link to this library.  But I can only do this if you have a"
-		      echo "*** shared version of the library, which you do not appear to have"
-		      echo "*** because a test_compile did reveal that the linker did not use this one"
-		      echo "*** as a dynamic dependency that programs can get resolved with at runtime."
-		    fi
-		  fi
-		else
-		  droppeddeps=yes
-		  echo
-		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
-		  echo "*** make it link in!  You will probably need to install it or some"
-		  echo "*** library that it depends on before this library will be fully"
-		  echo "*** functional.  Installing it before continuing would be even better."
-		fi
-		;;
-	      *)
-		newdeplibs="$newdeplibs $i"
-		;;
-	      esac
-	    done
-	  fi
-	  ;;
-	file_magic*)
-	  set dummy $deplibs_check_method; shift
-	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    case $a_deplib in
-	    -l*)
-	      func_stripname -l '' "$a_deplib"
-	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  newdeplibs="$newdeplibs $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		libname=`eval "\\$ECHO \"$libname_spec\""`
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-		  for potent_lib in $potential_libs; do
-		      # Follow soft links.
-		      if ls -lLd "$potent_lib" 2>/dev/null |
-			 $GREP " -> " >/dev/null; then
-			continue
-		      fi
-		      # The statement above tries to avoid entering an
-		      # endless loop below, in case of cyclic links.
-		      # We might still enter an endless loop, since a link
-		      # loop can be closed while we follow links,
-		      # but so what?
-		      potlib="$potent_lib"
-		      while test -h "$potlib" 2>/dev/null; do
-			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
-			case $potliblink in
-			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
-			*) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
-			esac
-		      done
-		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
-			 $SED -e 10q |
-			 $EGREP "$file_magic_regex" > /dev/null; then
-			newdeplibs="$newdeplibs $a_deplib"
-			a_deplib=""
-			break 2
-		      fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		echo
-		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
-		echo "*** I have the capability to make that library automatically link in when"
-		echo "*** you link to this library.  But I can only do this if you have a"
-		echo "*** shared version of the library, which you do not appear to have"
-		echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
-		else
-		  $ECHO "*** with $libname and none of the candidates passed a file format test"
-		  $ECHO "*** using a file magic. Last file checked: $potlib"
-		fi
-	      fi
-	      ;;
-	    *)
-	      # Add a -L argument.
-	      newdeplibs="$newdeplibs $a_deplib"
-	      ;;
-	    esac
-	  done # Gone through all deplibs.
-	  ;;
-	match_pattern*)
-	  set dummy $deplibs_check_method; shift
-	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    case $a_deplib in
-	    -l*)
-	      func_stripname -l '' "$a_deplib"
-	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  newdeplibs="$newdeplibs $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		libname=`eval "\\$ECHO \"$libname_spec\""`
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-		  for potent_lib in $potential_libs; do
-		    potlib="$potent_lib" # see symlink-check above in file_magic test
-		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
-		       $EGREP "$match_pattern_regex" > /dev/null; then
-		      newdeplibs="$newdeplibs $a_deplib"
-		      a_deplib=""
-		      break 2
-		    fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		echo
-		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
-		echo "*** I have the capability to make that library automatically link in when"
-		echo "*** you link to this library.  But I can only do this if you have a"
-		echo "*** shared version of the library, which you do not appear to have"
-		echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
-		else
-		  $ECHO "*** with $libname and none of the candidates passed a file format test"
-		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
-		fi
-	      fi
-	      ;;
-	    *)
-	      # Add a -L argument.
-	      newdeplibs="$newdeplibs $a_deplib"
-	      ;;
-	    esac
-	  done # Gone through all deplibs.
-	  ;;
-	none | unknown | *)
-	  newdeplibs=""
-	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
-	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	    for i in $predeps $postdeps ; do
-	      # can't use Xsed below, because $i might contain '/'
-	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
-	    done
-	  fi
-	  case $tmp_deplibs in
-	  *[!\	\ ]*)
-	    echo
-	    if test "X$deplibs_check_method" = "Xnone"; then
-	      echo "*** Warning: inter-library dependencies are not supported in this platform."
-	    else
-	      echo "*** Warning: inter-library dependencies are not known to be supported."
-	    fi
-	    echo "*** All declared inter-library dependencies are being dropped."
-	    droppeddeps=yes
-	    ;;
-	  esac
-	  ;;
-	esac
-	versuffix=$versuffix_save
-	major=$major_save
-	release=$release_save
-	libname=$libname_save
-	name=$name_save
-
-	case $host in
-	*-*-rhapsody* | *-*-darwin1.[012])
-	  # On Rhapsody replace the C library with the System framework
-	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
-	  ;;
-	esac
-
-	if test "$droppeddeps" = yes; then
-	  if test "$module" = yes; then
-	    echo
-	    echo "*** Warning: libtool could not satisfy all declared inter-library"
-	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
-	    echo "*** a static module, that should work as long as the dlopening"
-	    echo "*** application is linked with the -dlopen flag."
-	    if test -z "$global_symbol_pipe"; then
-	      echo
-	      echo "*** However, this would only work if libtool was able to extract symbol"
-	      echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
-	      echo "*** not find such a program.  So, this module is probably useless."
-	      echo "*** \`nm' from GNU binutils and a full rebuild may help."
-	    fi
-	    if test "$build_old_libs" = no; then
-	      oldlibs="$output_objdir/$libname.$libext"
-	      build_libtool_libs=module
-	      build_old_libs=yes
-	    else
-	      build_libtool_libs=no
-	    fi
-	  else
-	    echo "*** The inter-library dependencies that have been dropped here will be"
-	    echo "*** automatically added whenever a program is linked with this library"
-	    echo "*** or is declared to -dlopen it."
-
-	    if test "$allow_undefined" = no; then
-	      echo
-	      echo "*** Since this library must not contain undefined symbols,"
-	      echo "*** because either the platform does not support them or"
-	      echo "*** it was explicitly requested with -no-undefined,"
-	      echo "*** libtool will only create a static version of it."
-	      if test "$build_old_libs" = no; then
-		oldlibs="$output_objdir/$libname.$libext"
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
-	  fi
-	fi
-	# Done checking deplibs!
-	deplibs=$newdeplibs
-      fi
-      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
-      case $host in
-	*-*-darwin*)
-	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  ;;
-      esac
-
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $deplibs " in
-	  *" -L$path/$objdir "*)
-	    new_libs="$new_libs -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) new_libs="$new_libs $deplib" ;;
-	  esac
-	  ;;
-	*) new_libs="$new_libs $deplib" ;;
-	esac
-      done
-      deplibs="$new_libs"
-
-      # All the library-specific variables (install_libdir is set above).
-      library_names=
-      old_library=
-      dlname=
-
-      # Test again, we may have decided not to build it any more
-      if test "$build_libtool_libs" = yes; then
-	if test "$hardcode_into_libs" = yes; then
-	  # Hardcode the library paths
-	  hardcode_libdirs=
-	  dep_rpath=
-	  rpath="$finalize_rpath"
-	  test "$mode" != relink && rpath="$compile_rpath$rpath"
-	  for libdir in $rpath; do
-	    if test -n "$hardcode_libdir_flag_spec"; then
-	      if test -n "$hardcode_libdir_separator"; then
-		if test -z "$hardcode_libdirs"; then
-		  hardcode_libdirs="$libdir"
-		else
-		  # Just accumulate the unique libdirs.
-		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		    ;;
-		  *)
-		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		    ;;
-		  esac
-		fi
-	      else
-		eval flag=\"$hardcode_libdir_flag_spec\"
-		dep_rpath="$dep_rpath $flag"
-	      fi
-	    elif test -n "$runpath_var"; then
-	      case "$perm_rpath " in
-	      *" $libdir "*) ;;
-	      *) perm_rpath="$perm_rpath $libdir" ;;
-	      esac
-	    fi
-	  done
-	  # Substitute the hardcoded libdirs into the rpath.
-	  if test -n "$hardcode_libdir_separator" &&
-	     test -n "$hardcode_libdirs"; then
-	    libdir="$hardcode_libdirs"
-	    if test -n "$hardcode_libdir_flag_spec_ld"; then
-	      eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
-	    else
-	      eval dep_rpath=\"$hardcode_libdir_flag_spec\"
-	    fi
-	  fi
-	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
-	    # We should set the runpath_var.
-	    rpath=
-	    for dir in $perm_rpath; do
-	      rpath="$rpath$dir:"
-	    done
-	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
-	  fi
-	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
-	fi
-
-	shlibpath="$finalize_shlibpath"
-	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
-	if test -n "$shlibpath"; then
-	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
-	fi
-
-	# Get the real and link names of the library.
-	eval shared_ext=\"$shrext_cmds\"
-	eval library_names=\"$library_names_spec\"
-	set dummy $library_names
-	shift
-	realname="$1"
-	shift
-
-	if test -n "$soname_spec"; then
-	  eval soname=\"$soname_spec\"
-	else
-	  soname="$realname"
-	fi
-	if test -z "$dlname"; then
-	  dlname=$soname
-	fi
-
-	lib="$output_objdir/$realname"
-	linknames=
-	for link
-	do
-	  linknames="$linknames $link"
-	done
-
-	# Use standard objects if they are pic
-	test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
-	test "X$libobjs" = "X " && libobjs=
-
-	delfiles=
-	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
-	  export_symbols="$output_objdir/$libname.uexp"
-	  delfiles="$delfiles $export_symbols"
-	fi
-
-	orig_export_symbols=
-	case $host_os in
-	cygwin* | mingw* | cegcc*)
-	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
-	    # exporting using user supplied symfile
-	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
-	      # and it's NOT already a .def file. Must figure out
-	      # which of the given symbols are data symbols and tag
-	      # them as such. So, trigger use of export_symbols_cmds.
-	      # export_symbols gets reassigned inside the "prepare
-	      # the list of exported symbols" if statement, so the
-	      # include_expsyms logic still works.
-	      orig_export_symbols="$export_symbols"
-	      export_symbols=
-	      always_export_symbols=yes
-	    fi
-	  fi
-	  ;;
-	esac
-
-	# Prepare the list of exported symbols
-	if test -z "$export_symbols"; then
-	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
-	    func_verbose "generating symbol list for \`$libname.la'"
-	    export_symbols="$output_objdir/$libname.exp"
-	    $opt_dry_run || $RM $export_symbols
-	    cmds=$export_symbols_cmds
-	    save_ifs="$IFS"; IFS='~'
-	    for cmd in $cmds; do
-	      IFS="$save_ifs"
-	      eval cmd=\"$cmd\"
-	      func_len " $cmd"
-	      len=$func_len_result
-	      if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-		func_show_eval "$cmd" 'exit $?'
-		skipped_export=false
-	      else
-		# The command line is too long to execute in one step.
-		func_verbose "using reloadable object file for export list..."
-		skipped_export=:
-		# Break out early, otherwise skipped_export may be
-		# set to false by a later but shorter cmd.
-		break
-	      fi
-	    done
-	    IFS="$save_ifs"
-	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
-	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
-	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
-	    fi
-	  fi
-	fi
-
-	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  tmp_export_symbols="$export_symbols"
-	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
-	  $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
-	fi
-
-	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
-	  # The given exports_symbols file has to be filtered, so filter it.
-	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
-	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	  # 's' commands which not all seds can handle. GNU sed should be fine
-	  # though. Also, the filter scales superlinearly with the number of
-	  # global variables. join(1) would be nice here, but unfortunately
-	  # isn't a blessed tool.
-	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
-	  delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
-	  export_symbols=$output_objdir/$libname.def
-	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
-	fi
-
-	tmp_deplibs=
-	for test_deplib in $deplibs; do
-	  case " $convenience " in
-	  *" $test_deplib "*) ;;
-	  *)
-	    tmp_deplibs="$tmp_deplibs $test_deplib"
-	    ;;
-	  esac
-	done
-	deplibs="$tmp_deplibs"
-
-	if test -n "$convenience"; then
-	  if test -n "$whole_archive_flag_spec" &&
-	    test "$compiler_needs_object" = yes &&
-	    test -z "$libobjs"; then
-	    # extract the archives, so we have objects to list.
-	    # TODO: could optimize this to just extract one archive.
-	    whole_archive_flag_spec=
-	  fi
-	  if test -n "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
-	    test "X$libobjs" = "X " && libobjs=
-	  else
-	    gentop="$output_objdir/${outputname}x"
-	    generated="$generated $gentop"
-
-	    func_extract_archives $gentop $convenience
-	    libobjs="$libobjs $func_extract_archives_result"
-	    test "X$libobjs" = "X " && libobjs=
-	  fi
-	fi
-
-	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
-	  eval flag=\"$thread_safe_flag_spec\"
-	  linker_flags="$linker_flags $flag"
-	fi
-
-	# Make a backup of the uninstalled library when relinking
-	if test "$mode" = relink; then
-	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
-	fi
-
-	# Do each of the archive commands.
-	if test "$module" = yes && test -n "$module_cmds" ; then
-	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	    eval test_cmds=\"$module_expsym_cmds\"
-	    cmds=$module_expsym_cmds
-	  else
-	    eval test_cmds=\"$module_cmds\"
-	    cmds=$module_cmds
-	  fi
-	else
-	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	    eval test_cmds=\"$archive_expsym_cmds\"
-	    cmds=$archive_expsym_cmds
-	  else
-	    eval test_cmds=\"$archive_cmds\"
-	    cmds=$archive_cmds
-	  fi
-	fi
-
-	if test "X$skipped_export" != "X:" &&
-	   func_len " $test_cmds" &&
-	   len=$func_len_result &&
-	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  :
-	else
-	  # The command line is too long to link in one step, link piecewise
-	  # or, if using GNU ld and skipped_export is not :, use a linker
-	  # script.
-
-	  # Save the value of $output and $libobjs because we want to
-	  # use them later.  If we have whole_archive_flag_spec, we
-	  # want to use save_libobjs as it was before
-	  # whole_archive_flag_spec was expanded, because we can't
-	  # assume the linker understands whole_archive_flag_spec.
-	  # This may have to be revisited, in case too many
-	  # convenience libraries get linked in and end up exceeding
-	  # the spec.
-	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	  fi
-	  save_output=$output
-	  func_basename "$output"
-	  output_la=$func_basename_result
-
-	  # Clear the reloadable object creation command queue and
-	  # initialize k to one.
-	  test_cmds=
-	  concat_cmds=
-	  objlist=
-	  last_robj=
-	  k=1
-
-	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
-	    output=${output_objdir}/${output_la}.lnkscript
-	    func_verbose "creating GNU ld script: $output"
-	    echo 'INPUT (' > $output
-	    for obj in $save_libobjs
-	    do
-	      $ECHO "$obj" >> $output
-	    done
-	    echo ')' >> $output
-	    delfiles="$delfiles $output"
-	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
-	    output=${output_objdir}/${output_la}.lnk
-	    func_verbose "creating linker input file list: $output"
-	    : > $output
-	    set x $save_libobjs
-	    shift
-	    firstobj=
-	    if test "$compiler_needs_object" = yes; then
-	      firstobj="$1 "
-	      shift
-	    fi
-	    for obj
-	    do
-	      $ECHO "$obj" >> $output
-	    done
-	    delfiles="$delfiles $output"
-	    output=$firstobj\"$file_list_spec$output\"
-	  else
-	    if test -n "$save_libobjs"; then
-	      func_verbose "creating reloadable object files..."
-	      output=$output_objdir/$output_la-${k}.$objext
-	      eval test_cmds=\"$reload_cmds\"
-	      func_len " $test_cmds"
-	      len0=$func_len_result
-	      len=$len0
-
-	      # Loop over the list of objects to be linked.
-	      for obj in $save_libobjs
-	      do
-		func_len " $obj"
-		func_arith $len + $func_len_result
-		len=$func_arith_result
-		if test "X$objlist" = X ||
-		   test "$len" -lt "$max_cmd_len"; then
-		  func_append objlist " $obj"
-		else
-		  # The command $test_cmds is almost too long, add a
-		  # command to the queue.
-		  if test "$k" -eq 1 ; then
-		    # The first file doesn't have a previous command to add.
-		    reload_objs=$objlist
-		    eval concat_cmds=\"$reload_cmds\"
-		  else
-		    # All subsequent reloadable object files will link in
-		    # the last one created.
-		    reload_objs="$objlist $last_robj"
-		    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
-		  fi
-		  last_robj=$output_objdir/$output_la-${k}.$objext
-		  func_arith $k + 1
-		  k=$func_arith_result
-		  output=$output_objdir/$output_la-${k}.$objext
-		  objlist=" $obj"
-		  func_len " $last_robj"
-		  func_arith $len0 + $func_len_result
-		  len=$func_arith_result
-		fi
-	      done
-	      # Handle the remaining objects by creating one last
-	      # reloadable object file.  All subsequent reloadable object
-	      # files will link in the last one created.
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      reload_objs="$objlist $last_robj"
-	      eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
-	      if test -n "$last_robj"; then
-	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
-	      fi
-	      delfiles="$delfiles $output"
-
-	    else
-	      output=
-	    fi
-
-	    if ${skipped_export-false}; then
-	      func_verbose "generating symbol list for \`$libname.la'"
-	      export_symbols="$output_objdir/$libname.exp"
-	      $opt_dry_run || $RM $export_symbols
-	      libobjs=$output
-	      # Append the command to create the export file.
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
-	      if test -n "$last_robj"; then
-		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
-	      fi
-	    fi
-
-	    test -n "$save_libobjs" &&
-	      func_verbose "creating a temporary reloadable object file: $output"
-
-	    # Loop through the commands generated above and execute them.
-	    save_ifs="$IFS"; IFS='~'
-	    for cmd in $concat_cmds; do
-	      IFS="$save_ifs"
-	      $opt_silent || {
-		  func_quote_for_expand "$cmd"
-		  eval "func_echo $func_quote_for_expand_result"
-	      }
-	      $opt_dry_run || eval "$cmd" || {
-		lt_exit=$?
-
-		# Restore the uninstalled library and exit
-		if test "$mode" = relink; then
-		  ( cd "$output_objdir" && \
-		    $RM "${realname}T" && \
-		    $MV "${realname}U" "$realname" )
-		fi
-
-		exit $lt_exit
-	      }
-	    done
-	    IFS="$save_ifs"
-
-	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
-	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
-	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
-	    fi
-	  fi
-
-          if ${skipped_export-false}; then
-	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	      tmp_export_symbols="$export_symbols"
-	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
-	      $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
-	    fi
-
-	    if test -n "$orig_export_symbols"; then
-	      # The given exports_symbols file has to be filtered, so filter it.
-	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
-	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	      # 's' commands which not all seds can handle. GNU sed should be fine
-	      # though. Also, the filter scales superlinearly with the number of
-	      # global variables. join(1) would be nice here, but unfortunately
-	      # isn't a blessed tool.
-	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
-	      delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
-	      export_symbols=$output_objdir/$libname.def
-	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
-	    fi
-	  fi
-
-	  libobjs=$output
-	  # Restore the value of output.
-	  output=$save_output
-
-	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
-	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
-	    test "X$libobjs" = "X " && libobjs=
-	  fi
-	  # Expand the library linking commands again to reset the
-	  # value of $libobjs for piecewise linking.
-
-	  # Do each of the archive commands.
-	  if test "$module" = yes && test -n "$module_cmds" ; then
-	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	      cmds=$module_expsym_cmds
-	    else
-	      cmds=$module_cmds
-	    fi
-	  else
-	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	      cmds=$archive_expsym_cmds
-	    else
-	      cmds=$archive_cmds
-	    fi
-	  fi
-	fi
-
-	if test -n "$delfiles"; then
-	  # Append the command to remove temporary files to $cmds.
-	  eval cmds=\"\$cmds~\$RM $delfiles\"
-	fi
-
-	# Add any objects from preloaded convenience libraries
-	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
-	  generated="$generated $gentop"
-
-	  func_extract_archives $gentop $dlprefiles
-	  libobjs="$libobjs $func_extract_archives_result"
-	  test "X$libobjs" = "X " && libobjs=
-	fi
-
-	save_ifs="$IFS"; IFS='~'
-	for cmd in $cmds; do
-	  IFS="$save_ifs"
-	  eval cmd=\"$cmd\"
-	  $opt_silent || {
-	    func_quote_for_expand "$cmd"
-	    eval "func_echo $func_quote_for_expand_result"
-	  }
-	  $opt_dry_run || eval "$cmd" || {
-	    lt_exit=$?
-
-	    # Restore the uninstalled library and exit
-	    if test "$mode" = relink; then
-	      ( cd "$output_objdir" && \
-	        $RM "${realname}T" && \
-		$MV "${realname}U" "$realname" )
-	    fi
-
-	    exit $lt_exit
-	  }
-	done
-	IFS="$save_ifs"
-
-	# Restore the uninstalled library and exit
-	if test "$mode" = relink; then
-	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
-
-	  if test -n "$convenience"; then
-	    if test -z "$whole_archive_flag_spec"; then
-	      func_show_eval '${RM}r "$gentop"'
-	    fi
-	  fi
-
-	  exit $EXIT_SUCCESS
-	fi
-
-	# Create links to the real library.
-	for linkname in $linknames; do
-	  if test "$realname" != "$linkname"; then
-	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
-	  fi
-	done
-
-	# If -module or -export-dynamic was specified, set the dlname.
-	if test "$module" = yes || test "$export_dynamic" = yes; then
-	  # On all known operating systems, these are identical.
-	  dlname="$soname"
-	fi
-      fi
-      ;;
-
-    obj)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for objects"
-      fi
-
-      case " $deplibs" in
-      *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for objects" ;;
-      esac
-
-      test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for objects"
-
-      test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for objects"
-
-      test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for objects"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for objects"
-
-      case $output in
-      *.lo)
-	test -n "$objs$old_deplibs" && \
-	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
-
-	libobj=$output
-	func_lo2o "$libobj"
-	obj=$func_lo2o_result
-	;;
-      *)
-	libobj=
-	obj="$output"
-	;;
-      esac
-
-      # Delete the old objects.
-      $opt_dry_run || $RM $obj $libobj
-
-      # Objects from convenience libraries.  This assumes
-      # single-version convenience libraries.  Whenever we create
-      # different ones for PIC/non-PIC, this we'll have to duplicate
-      # the extraction.
-      reload_conv_objs=
-      gentop=
-      # reload_cmds runs $LD directly, so let us get rid of
-      # -Wl from whole_archive_flag_spec and hope we can get by with
-      # turning comma into space..
-      wl=
-
-      if test -n "$convenience"; then
-	if test -n "$whole_archive_flag_spec"; then
-	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
-	  reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
-	else
-	  gentop="$output_objdir/${obj}x"
-	  generated="$generated $gentop"
-
-	  func_extract_archives $gentop $convenience
-	  reload_conv_objs="$reload_objs $func_extract_archives_result"
-	fi
-      fi
-
-      # Create the old-style object.
-      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
-
-      output="$obj"
-      func_execute_cmds "$reload_cmds" 'exit $?'
-
-      # Exit if we aren't doing a library object file.
-      if test -z "$libobj"; then
-	if test -n "$gentop"; then
-	  func_show_eval '${RM}r "$gentop"'
-	fi
-
-	exit $EXIT_SUCCESS
-      fi
-
-      if test "$build_libtool_libs" != yes; then
-	if test -n "$gentop"; then
-	  func_show_eval '${RM}r "$gentop"'
-	fi
-
-	# Create an invalid libtool object if no PIC, so that we don't
-	# accidentally link it into a program.
-	# $show "echo timestamp > $libobj"
-	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
-	exit $EXIT_SUCCESS
-      fi
-
-      if test -n "$pic_flag" || test "$pic_mode" != default; then
-	# Only do commands if we really have different PIC objects.
-	reload_objs="$libobjs $reload_conv_objs"
-	output="$libobj"
-	func_execute_cmds "$reload_cmds" 'exit $?'
-      fi
-
-      if test -n "$gentop"; then
-	func_show_eval '${RM}r "$gentop"'
-      fi
-
-      exit $EXIT_SUCCESS
-      ;;
-
-    prog)
-      case $host in
-	*cygwin*) func_stripname '' '.exe' "$output"
-	          output=$func_stripname_result.exe;;
-      esac
-      test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for programs"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for programs"
-
-      test "$preload" = yes \
-        && test "$dlopen_support" = unknown \
-	&& test "$dlopen_self" = unknown \
-	&& test "$dlopen_self_static" = unknown && \
-	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
-
-      case $host in
-      *-*-rhapsody* | *-*-darwin1.[012])
-	# On Rhapsody replace the C library is the System framework
-	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
-	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
-	;;
-      esac
-
-      case $host in
-      *-*-darwin*)
-	# Don't allow lazy linking, it breaks C++ global constructors
-	# But is supposedly fixed on 10.4 or later (yay!).
-	if test "$tagname" = CXX ; then
-	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
-	    10.[0123])
-	      compile_command="$compile_command ${wl}-bind_at_load"
-	      finalize_command="$finalize_command ${wl}-bind_at_load"
-	    ;;
-	  esac
-	fi
-	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
-	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	;;
-      esac
-
-
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $compile_deplibs " in
-	  *" -L$path/$objdir "*)
-	    new_libs="$new_libs -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $compile_deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) new_libs="$new_libs $deplib" ;;
-	  esac
-	  ;;
-	*) new_libs="$new_libs $deplib" ;;
-	esac
-      done
-      compile_deplibs="$new_libs"
-
-
-      compile_command="$compile_command $compile_deplibs"
-      finalize_command="$finalize_command $finalize_deplibs"
-
-      if test -n "$rpath$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	for libdir in $rpath $xrpath; do
-	  # This is the magic to use -rpath.
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_rpath="$finalize_rpath $libdir" ;;
-	  esac
-	done
-      fi
-
-      # Now hardcode the library paths
-      rpath=
-      hardcode_libdirs=
-      for libdir in $compile_rpath $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval flag=\"$hardcode_libdir_flag_spec\"
-	    rpath="$rpath $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) perm_rpath="$perm_rpath $libdir" ;;
-	  esac
-	fi
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$libdir:"*) ;;
-	  ::) dllsearchpath=$libdir;;
-	  *) dllsearchpath="$dllsearchpath:$libdir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  ::) dllsearchpath=$testbindir;;
-	  *) dllsearchpath="$dllsearchpath:$testbindir";;
-	  esac
-	  ;;
-	esac
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval rpath=\" $hardcode_libdir_flag_spec\"
-      fi
-      compile_rpath="$rpath"
-
-      rpath=
-      hardcode_libdirs=
-      for libdir in $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval flag=\"$hardcode_libdir_flag_spec\"
-	    rpath="$rpath $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$finalize_perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
-	  esac
-	fi
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval rpath=\" $hardcode_libdir_flag_spec\"
-      fi
-      finalize_rpath="$rpath"
-
-      if test -n "$libobjs" && test "$build_old_libs" = yes; then
-	# Transform all the library objects into standard objects.
-	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
-	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
-      fi
-
-      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
-
-      # template prelinking step
-      if test -n "$prelink_cmds"; then
-	func_execute_cmds "$prelink_cmds" 'exit $?'
-      fi
-
-      wrappers_required=yes
-      case $host in
-      *cegcc* | *mingw32ce*)
-        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
-        wrappers_required=no
-        ;;
-      *cygwin* | *mingw* )
-        if test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
-        ;;
-      *)
-        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
-        ;;
-      esac
-      if test "$wrappers_required" = no; then
-	# Replace the output file specification.
-	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
-	link_command="$compile_command$compile_rpath"
-
-	# We have no uninstalled library dependencies, so finalize right now.
-	exit_status=0
-	func_show_eval "$link_command" 'exit_status=$?'
-
-	# Delete the generated files.
-	if test -f "$output_objdir/${outputname}S.${objext}"; then
-	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
-	fi
-
-	exit $exit_status
-      fi
-
-      if test -n "$compile_shlibpath$finalize_shlibpath"; then
-	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
-      fi
-      if test -n "$finalize_shlibpath"; then
-	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
-      fi
-
-      compile_var=
-      finalize_var=
-      if test -n "$runpath_var"; then
-	if test -n "$perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $perm_rpath; do
-	    rpath="$rpath$dir:"
-	  done
-	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-	if test -n "$finalize_perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $finalize_perm_rpath; do
-	    rpath="$rpath$dir:"
-	  done
-	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-      fi
-
-      if test "$no_install" = yes; then
-	# We don't need to create a wrapper script.
-	link_command="$compile_var$compile_command$compile_rpath"
-	# Replace the output file specification.
-	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
-	# Delete the old output file.
-	$opt_dry_run || $RM $output
-	# Link the executable and exit
-	func_show_eval "$link_command" 'exit $?'
-	exit $EXIT_SUCCESS
-      fi
-
-      if test "$hardcode_action" = relink; then
-	# Fast installation is not supported
-	link_command="$compile_var$compile_command$compile_rpath"
-	relink_command="$finalize_var$finalize_command$finalize_rpath"
-
-	func_warning "this platform does not like uninstalled shared libraries"
-	func_warning "\`$output' will be relinked during installation"
-      else
-	if test "$fast_install" != no; then
-	  link_command="$finalize_var$compile_command$finalize_rpath"
-	  if test "$fast_install" = yes; then
-	    relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
-	  else
-	    # fast_install is set to needless
-	    relink_command=
-	  fi
-	else
-	  link_command="$compile_var$compile_command$compile_rpath"
-	  relink_command="$finalize_var$finalize_command$finalize_rpath"
-	fi
-      fi
-
-      # Replace the output file specification.
-      link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
-
-      # Delete the old output files.
-      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
-
-      func_show_eval "$link_command" 'exit $?'
-
-      # Now create the wrapper script.
-      func_verbose "creating $output"
-
-      # Quote the relink command for shipping.
-      if test -n "$relink_command"; then
-	# Preserve any variables that may affect compiler behavior
-	for var in $variables_saved_for_relink; do
-	  if eval test -z \"\${$var+set}\"; then
-	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
-	  elif eval var_value=\$$var; test -z "$var_value"; then
-	    relink_command="$var=; export $var; $relink_command"
-	  else
-	    func_quote_for_eval "$var_value"
-	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
-	  fi
-	done
-	relink_command="(cd `pwd`; $relink_command)"
-	relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
-      fi
-
-      # Only actually do things if not in dry run mode.
-      $opt_dry_run || {
-	# win32 will think the script is a binary if it has
-	# a .exe suffix, so we strip it off here.
-	case $output in
-	  *.exe) func_stripname '' '.exe' "$output"
-	         output=$func_stripname_result ;;
-	esac
-	# test for cygwin because mv fails w/o .exe extensions
-	case $host in
-	  *cygwin*)
-	    exeext=.exe
-	    func_stripname '' '.exe' "$outputname"
-	    outputname=$func_stripname_result ;;
-	  *) exeext= ;;
-	esac
-	case $host in
-	  *cygwin* | *mingw* )
-	    func_dirname_and_basename "$output" "" "."
-	    output_name=$func_basename_result
-	    output_path=$func_dirname_result
-	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
-	    cwrapper="$output_path/$output_name.exe"
-	    $RM $cwrappersource $cwrapper
-	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
-
-	    func_emit_cwrapperexe_src > $cwrappersource
-
-	    # The wrapper executable is built using the $host compiler,
-	    # because it contains $host paths and files. If cross-
-	    # compiling, it, like the target executable, must be
-	    # executed on the $host or under an emulation environment.
-	    $opt_dry_run || {
-	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
-	      $STRIP $cwrapper
-	    }
-
-	    # Now, create the wrapper script for func_source use:
-	    func_ltwrapper_scriptname $cwrapper
-	    $RM $func_ltwrapper_scriptname_result
-	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
-	    $opt_dry_run || {
-	      # note: this script will not be executed, so do not chmod.
-	      if test "x$build" = "x$host" ; then
-		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
-	      else
-		func_emit_wrapper no > $func_ltwrapper_scriptname_result
-	      fi
-	    }
-	  ;;
-	  * )
-	    $RM $output
-	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
-
-	    func_emit_wrapper no > $output
-	    chmod +x $output
-	  ;;
-	esac
-      }
-      exit $EXIT_SUCCESS
-      ;;
-    esac
-
-    # See if we need to build an old-fashioned archive.
-    for oldlib in $oldlibs; do
-
-      if test "$build_libtool_libs" = convenience; then
-	oldobjs="$libobjs_save $symfileobj"
-	addlibs="$convenience"
-	build_libtool_libs=no
-      else
-	if test "$build_libtool_libs" = module; then
-	  oldobjs="$libobjs_save"
-	  build_libtool_libs=no
-	else
-	  oldobjs="$old_deplibs $non_pic_objects"
-	  if test "$preload" = yes && test -f "$symfileobj"; then
-	    oldobjs="$oldobjs $symfileobj"
-	  fi
-	fi
-	addlibs="$old_convenience"
-      fi
-
-      if test -n "$addlibs"; then
-	gentop="$output_objdir/${outputname}x"
-	generated="$generated $gentop"
-
-	func_extract_archives $gentop $addlibs
-	oldobjs="$oldobjs $func_extract_archives_result"
-      fi
-
-      # Do each command in the archive commands.
-      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
-	cmds=$old_archive_from_new_cmds
-      else
-
-	# Add any objects from preloaded convenience libraries
-	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
-	  generated="$generated $gentop"
-
-	  func_extract_archives $gentop $dlprefiles
-	  oldobjs="$oldobjs $func_extract_archives_result"
-	fi
-
-	# POSIX demands no paths to be encoded in archives.  We have
-	# to avoid creating archives with duplicate basenames if we
-	# might have to extract them afterwards, e.g., when creating a
-	# static archive out of a convenience library, or when linking
-	# the entirety of a libtool archive into another (currently
-	# not supported by libtool).
-	if (for obj in $oldobjs
-	    do
-	      func_basename "$obj"
-	      $ECHO "$func_basename_result"
-	    done | sort | sort -uc >/dev/null 2>&1); then
-	  :
-	else
-	  echo "copying selected object files to avoid basename conflicts..."
-	  gentop="$output_objdir/${outputname}x"
-	  generated="$generated $gentop"
-	  func_mkdir_p "$gentop"
-	  save_oldobjs=$oldobjs
-	  oldobjs=
-	  counter=1
-	  for obj in $save_oldobjs
-	  do
-	    func_basename "$obj"
-	    objbase="$func_basename_result"
-	    case " $oldobjs " in
-	    " ") oldobjs=$obj ;;
-	    *[\ /]"$objbase "*)
-	      while :; do
-		# Make sure we don't pick an alternate name that also
-		# overlaps.
-		newobj=lt$counter-$objbase
-		func_arith $counter + 1
-		counter=$func_arith_result
-		case " $oldobjs " in
-		*[\ /]"$newobj "*) ;;
-		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
-		esac
-	      done
-	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
-	      oldobjs="$oldobjs $gentop/$newobj"
-	      ;;
-	    *) oldobjs="$oldobjs $obj" ;;
-	    esac
-	  done
-	fi
-	eval cmds=\"$old_archive_cmds\"
-
-	func_len " $cmds"
-	len=$func_len_result
-	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  cmds=$old_archive_cmds
-	else
-	  # the command line is too long to link in one step, link in parts
-	  func_verbose "using piecewise archive linking..."
-	  save_RANLIB=$RANLIB
-	  RANLIB=:
-	  objlist=
-	  concat_cmds=
-	  save_oldobjs=$oldobjs
-	  oldobjs=
-	  # Is there a better way of finding the last object in the list?
-	  for obj in $save_oldobjs
-	  do
-	    last_oldobj=$obj
-	  done
-	  eval test_cmds=\"$old_archive_cmds\"
-	  func_len " $test_cmds"
-	  len0=$func_len_result
-	  len=$len0
-	  for obj in $save_oldobjs
-	  do
-	    func_len " $obj"
-	    func_arith $len + $func_len_result
-	    len=$func_arith_result
-	    func_append objlist " $obj"
-	    if test "$len" -lt "$max_cmd_len"; then
-	      :
-	    else
-	      # the above command should be used before it gets too long
-	      oldobjs=$objlist
-	      if test "$obj" = "$last_oldobj" ; then
-		RANLIB=$save_RANLIB
-	      fi
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
-	      objlist=
-	      len=$len0
-	    fi
-	  done
-	  RANLIB=$save_RANLIB
-	  oldobjs=$objlist
-	  if test "X$oldobjs" = "X" ; then
-	    eval cmds=\"\$concat_cmds\"
-	  else
-	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
-	  fi
-	fi
-      fi
-      func_execute_cmds "$cmds" 'exit $?'
-    done
-
-    test -n "$generated" && \
-      func_show_eval "${RM}r$generated"
-
-    # Now create the libtool archive.
-    case $output in
-    *.la)
-      old_library=
-      test "$build_old_libs" = yes && old_library="$libname.$libext"
-      func_verbose "creating $output"
-
-      # Preserve any variables that may affect compiler behavior
-      for var in $variables_saved_for_relink; do
-	if eval test -z \"\${$var+set}\"; then
-	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
-	elif eval var_value=\$$var; test -z "$var_value"; then
-	  relink_command="$var=; export $var; $relink_command"
-	else
-	  func_quote_for_eval "$var_value"
-	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
-	fi
-      done
-      # Quote the link command for shipping.
-      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
-      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
-      if test "$hardcode_automatic" = yes ; then
-	relink_command=
-      fi
-
-      # Only create the output if not a dry run.
-      $opt_dry_run || {
-	for installed in no yes; do
-	  if test "$installed" = yes; then
-	    if test -z "$install_libdir"; then
-	      break
-	    fi
-	    output="$output_objdir/$outputname"i
-	    # Replace all uninstalled libtool libraries with the installed ones
-	    newdependency_libs=
-	    for deplib in $dependency_libs; do
-	      case $deplib in
-	      *.la)
-		func_basename "$deplib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$deplib' is not a valid libtool archive"
-		newdependency_libs="$newdependency_libs $libdir/$name"
-		;;
-	      *) newdependency_libs="$newdependency_libs $deplib" ;;
-	      esac
-	    done
-	    dependency_libs="$newdependency_libs"
-	    newdlfiles=
-
-	    for lib in $dlfiles; do
-	      case $lib in
-	      *.la)
-	        func_basename "$lib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
-		newdlfiles="$newdlfiles $libdir/$name"
-		;;
-	      *) newdlfiles="$newdlfiles $lib" ;;
-	      esac
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      case $lib in
-	      *.la)
-		# Only pass preopened files to the pseudo-archive (for
-		# eventual linking with the app. that links it) if we
-		# didn't already link the preopened objects directly into
-		# the library:
-		func_basename "$lib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
-		newdlprefiles="$newdlprefiles $libdir/$name"
-		;;
-	      esac
-	    done
-	    dlprefiles="$newdlprefiles"
-	  else
-	    newdlfiles=
-	    for lib in $dlfiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      newdlfiles="$newdlfiles $abs"
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      newdlprefiles="$newdlprefiles $abs"
-	    done
-	    dlprefiles="$newdlprefiles"
-	  fi
-	  $RM $output
-	  # place dlname in correct position for cygwin
-	  # In fact, it would be nice if we could use this code for all target
-	  # systems that can't hard-code library paths into their executables
-	  # and that have no shared library path variable independent of PATH,
-	  # but it turns out we can't easily determine that from inspecting
-	  # libtool variables, so we have to hard-code the OSs to which it
-	  # applies here; at the moment, that means platforms that use the PE
-	  # object format with DLL files.  See the long comment at the top of
-	  # tests/bindir.at for full details.
-	  tdlname=$dlname
-	  case $host,$output,$installed,$module,$dlname in
-	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
-	      # If a -bindir argument was supplied, place the dll there.
-	      if test "x$bindir" != x ;
-	      then
-		func_relative_path "$install_libdir" "$bindir"
-		tdlname=$func_relative_path_result$dlname
-	      else
-		# Otherwise fall back on heuristic.
-		tdlname=../bin/$dlname
-	      fi
-	      ;;
-	  esac
-	  $ECHO > $output "\
-# $outputname - a libtool library file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# The name that we can dlopen(3).
-dlname='$tdlname'
-
-# Names of this library.
-library_names='$library_names'
-
-# The name of the static archive.
-old_library='$old_library'
-
-# Linker flags that can not go in dependency_libs.
-inherited_linker_flags='$new_inherited_linker_flags'
-
-# Libraries that this one depends upon.
-dependency_libs='$dependency_libs'
-
-# Names of additional weak libraries provided by this library
-weak_library_names='$weak_libs'
-
-# Version information for $libname.
-current=$current
-age=$age
-revision=$revision
-
-# Is this an already installed library?
-installed=$installed
-
-# Should we warn about portability when linking against -modules?
-shouldnotlink=$module
-
-# Files to dlopen/dlpreopen
-dlopen='$dlfiles'
-dlpreopen='$dlprefiles'
-
-# Directory that this library needs to be installed in:
-libdir='$install_libdir'"
-	  if test "$installed" = no && test "$need_relink" = yes; then
-	    $ECHO >> $output "\
-relink_command=\"$relink_command\""
-	  fi
-	done
-      }
-
-      # Do a symbolic link so that the libtool archive can be found in
-      # LD_LIBRARY_PATH before the program is installed.
-      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
-      ;;
-    esac
-    exit $EXIT_SUCCESS
-}
-
-{ test "$mode" = link || test "$mode" = relink; } &&
-    func_mode_link ${1+"$@"}
-
-
-# func_mode_uninstall arg...
-func_mode_uninstall ()
-{
-    $opt_debug
-    RM="$nonopt"
-    files=
-    rmforce=
-    exit_status=0
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    for arg
-    do
-      case $arg in
-      -f) RM="$RM $arg"; rmforce=yes ;;
-      -*) RM="$RM $arg" ;;
-      *) files="$files $arg" ;;
-      esac
-    done
-
-    test -z "$RM" && \
-      func_fatal_help "you must specify an RM program"
-
-    rmdirs=
-
-    origobjdir="$objdir"
-    for file in $files; do
-      func_dirname "$file" "" "."
-      dir="$func_dirname_result"
-      if test "X$dir" = X.; then
-	objdir="$origobjdir"
-      else
-	objdir="$dir/$origobjdir"
-      fi
-      func_basename "$file"
-      name="$func_basename_result"
-      test "$mode" = uninstall && objdir="$dir"
-
-      # Remember objdir for removal later, being careful to avoid duplicates
-      if test "$mode" = clean; then
-	case " $rmdirs " in
-	  *" $objdir "*) ;;
-	  *) rmdirs="$rmdirs $objdir" ;;
-	esac
-      fi
-
-      # Don't error if the file doesn't exist and rm -f was used.
-      if { test -L "$file"; } >/dev/null 2>&1 ||
-	 { test -h "$file"; } >/dev/null 2>&1 ||
-	 test -f "$file"; then
-	:
-      elif test -d "$file"; then
-	exit_status=1
-	continue
-      elif test "$rmforce" = yes; then
-	continue
-      fi
-
-      rmfiles="$file"
-
-      case $name in
-      *.la)
-	# Possibly a libtool archive, so verify it.
-	if func_lalib_p "$file"; then
-	  func_source $dir/$name
-
-	  # Delete the libtool libraries and symlinks.
-	  for n in $library_names; do
-	    rmfiles="$rmfiles $objdir/$n"
-	  done
-	  test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
-
-	  case "$mode" in
-	  clean)
-	    case "  $library_names " in
-	    # "  " in the beginning catches empty $dlname
-	    *" $dlname "*) ;;
-	    *) rmfiles="$rmfiles $objdir/$dlname" ;;
-	    esac
-	    test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
-	    ;;
-	  uninstall)
-	    if test -n "$library_names"; then
-	      # Do each command in the postuninstall commands.
-	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
-	    fi
-
-	    if test -n "$old_library"; then
-	      # Do each command in the old_postuninstall commands.
-	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
-	    fi
-	    # FIXME: should reinstall the best remaining shared library.
-	    ;;
-	  esac
-	fi
-	;;
-
-      *.lo)
-	# Possibly a libtool object, so verify it.
-	if func_lalib_p "$file"; then
-
-	  # Read the .lo file
-	  func_source $dir/$name
-
-	  # Add PIC object to the list of files to remove.
-	  if test -n "$pic_object" &&
-	     test "$pic_object" != none; then
-	    rmfiles="$rmfiles $dir/$pic_object"
-	  fi
-
-	  # Add non-PIC object to the list of files to remove.
-	  if test -n "$non_pic_object" &&
-	     test "$non_pic_object" != none; then
-	    rmfiles="$rmfiles $dir/$non_pic_object"
-	  fi
-	fi
-	;;
-
-      *)
-	if test "$mode" = clean ; then
-	  noexename=$name
-	  case $file in
-	  *.exe)
-	    func_stripname '' '.exe' "$file"
-	    file=$func_stripname_result
-	    func_stripname '' '.exe' "$name"
-	    noexename=$func_stripname_result
-	    # $file with .exe has already been added to rmfiles,
-	    # add $file without .exe
-	    rmfiles="$rmfiles $file"
-	    ;;
-	  esac
-	  # Do a test to see if this is a libtool program.
-	  if func_ltwrapper_p "$file"; then
-	    if func_ltwrapper_executable_p "$file"; then
-	      func_ltwrapper_scriptname "$file"
-	      relink_command=
-	      func_source $func_ltwrapper_scriptname_result
-	      rmfiles="$rmfiles $func_ltwrapper_scriptname_result"
-	    else
-	      relink_command=
-	      func_source $dir/$noexename
-	    fi
-
-	    # note $name still contains .exe if it was in $file originally
-	    # as does the version of $file that was added into $rmfiles
-	    rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
-	    if test "$fast_install" = yes && test -n "$relink_command"; then
-	      rmfiles="$rmfiles $objdir/lt-$name"
-	    fi
-	    if test "X$noexename" != "X$name" ; then
-	      rmfiles="$rmfiles $objdir/lt-${noexename}.c"
-	    fi
-	  fi
-	fi
-	;;
-      esac
-      func_show_eval "$RM $rmfiles" 'exit_status=1'
-    done
-    objdir="$origobjdir"
-
-    # Try to remove the ${objdir}s in the directories where we deleted files
-    for dir in $rmdirs; do
-      if test -d "$dir"; then
-	func_show_eval "rmdir $dir >/dev/null 2>&1"
-      fi
-    done
-
-    exit $exit_status
-}
-
-{ test "$mode" = uninstall || test "$mode" = clean; } &&
-    func_mode_uninstall ${1+"$@"}
-
-test -z "$mode" && {
-  help="$generic_help"
-  func_fatal_help "you must specify a MODE"
-}
-
-test -z "$exec_cmd" && \
-  func_fatal_help "invalid operation mode \`$mode'"
-
-if test -n "$exec_cmd"; then
-  eval exec "$exec_cmd"
-  exit $EXIT_FAILURE
-fi
-
-exit $exit_status
-
-
-# The TAGs below are defined such that we never get into a situation
-# in which we disable both kinds of libraries.  Given conflicting
-# choices, we go for a static library, that is the most portable,
-# since we can't tell whether shared libraries were disabled because
-# the user asked for that or because the platform doesn't support
-# them.  This is particularly important on AIX, because we don't
-# support having both static and shared libraries enabled at the same
-# time on that platform, so we default to a shared-only configuration.
-# If a disable-shared tag is given, we'll fallback to a static-only
-# configuration.  But we'll never go from static-only to shared-only.
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
-build_libtool_libs=no
-build_old_libs=yes
-# ### END LIBTOOL TAG CONFIG: disable-shared
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-static
-build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
-# ### END LIBTOOL TAG CONFIG: disable-static
-
-# Local Variables:
-# mode:shell-script
-# sh-indentation:2
-# End:
-# vi:sw=2
-
diff --git a/cloog-0.16.3/autoconf/missing b/cloog-0.16.3/autoconf/missing
deleted file mode 100755
index 1c8ff70..0000000
--- a/cloog-0.16.3/autoconf/missing
+++ /dev/null
@@ -1,367 +0,0 @@
-#! /bin/sh
-# Common stub for a few missing GNU programs while installing.
-
-scriptversion=2006-05-10.23
-
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006
-#   Free Software Foundation, Inc.
-# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301, USA.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-if test $# -eq 0; then
-  echo 1>&2 "Try \`$0 --help' for more information"
-  exit 1
-fi
-
-run=:
-sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
-sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
-
-# In the cases where this matters, `missing' is being run in the
-# srcdir already.
-if test -f configure.ac; then
-  configure_ac=configure.ac
-else
-  configure_ac=configure.in
-fi
-
-msg="missing on your system"
-
-case $1 in
---run)
-  # Try to run requested program, and just exit if it succeeds.
-  run=
-  shift
-  "$@" && exit 0
-  # Exit code 63 means version mismatch.  This often happens
-  # when the user try to use an ancient version of a tool on
-  # a file that requires a minimum version.  In this case we
-  # we should proceed has if the program had been absent, or
-  # if --run hadn't been passed.
-  if test $? = 63; then
-    run=:
-    msg="probably too old"
-  fi
-  ;;
-
-  -h|--h|--he|--hel|--help)
-    echo "\
-$0 [OPTION]... PROGRAM [ARGUMENT]...
-
-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
-error status if there is no known handling for PROGRAM.
-
-Options:
-  -h, --help      display this help and exit
-  -v, --version   output version information and exit
-  --run           try to run the given command, and emulate it if it fails
-
-Supported PROGRAM values:
-  aclocal      touch file \`aclocal.m4'
-  autoconf     touch file \`configure'
-  autoheader   touch file \`config.h.in'
-  autom4te     touch the output file, or create a stub one
-  automake     touch all \`Makefile.in' files
-  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
-  flex         create \`lex.yy.c', if possible, from existing .c
-  help2man     touch the output file
-  lex          create \`lex.yy.c', if possible, from existing .c
-  makeinfo     touch the output file
-  tar          try tar, gnutar, gtar, then tar without non-portable flags
-  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
-
-Send bug reports to <bug-automake@gnu.org>."
-    exit $?
-    ;;
-
-  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
-    echo "missing $scriptversion (GNU Automake)"
-    exit $?
-    ;;
-
-  -*)
-    echo 1>&2 "$0: Unknown \`$1' option"
-    echo 1>&2 "Try \`$0 --help' for more information"
-    exit 1
-    ;;
-
-esac
-
-# Now exit if we have it, but it failed.  Also exit now if we
-# don't have it and --version was passed (most likely to detect
-# the program).
-case $1 in
-  lex|yacc)
-    # Not GNU programs, they don't have --version.
-    ;;
-
-  tar)
-    if test -n "$run"; then
-       echo 1>&2 "ERROR: \`tar' requires --run"
-       exit 1
-    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
-       exit 1
-    fi
-    ;;
-
-  *)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
-       # Could not run --version or --help.  This is probably someone
-       # running `$TOOL --version' or `$TOOL --help' to check whether
-       # $TOOL exists and not knowing $TOOL uses missing.
-       exit 1
-    fi
-    ;;
-esac
-
-# If it does not exist, or fails to run (possibly an outdated version),
-# try to emulate it.
-case $1 in
-  aclocal*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
-         to install the \`Automake' and \`Perl' packages.  Grab them from
-         any GNU archive site."
-    touch aclocal.m4
-    ;;
-
-  autoconf)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`${configure_ac}'.  You might want to install the
-         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
-         archive site."
-    touch configure
-    ;;
-
-  autoheader)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
-         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
-         from any GNU archive site."
-    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
-    test -z "$files" && files="config.h"
-    touch_files=
-    for f in $files; do
-      case $f in
-      *:*) touch_files="$touch_files "`echo "$f" |
-				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
-      *) touch_files="$touch_files $f.in";;
-      esac
-    done
-    touch $touch_files
-    ;;
-
-  automake*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
-         You might want to install the \`Automake' and \`Perl' packages.
-         Grab them from any GNU archive site."
-    find . -type f -name Makefile.am -print |
-	   sed 's/\.am$/.in/' |
-	   while read f; do touch "$f"; done
-    ;;
-
-  autom4te)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, but is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.
-         You can get \`$1' as part of \`Autoconf' from any GNU
-         archive site."
-
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -f "$file"; then
-	touch $file
-    else
-	test -z "$file" || exec >$file
-	echo "#! /bin/sh"
-	echo "# Created by GNU Automake missing as a replacement of"
-	echo "#  $ $@"
-	echo "exit 0"
-	chmod +x $file
-	exit 1
-    fi
-    ;;
-
-  bison|yacc)
-    echo 1>&2 "\
-WARNING: \`$1' $msg.  You should only need it if
-         you modified a \`.y' file.  You may need the \`Bison' package
-         in order for those modifications to take effect.  You can get
-         \`Bison' from any GNU archive site."
-    rm -f y.tab.c y.tab.h
-    if test $# -ne 1; then
-        eval LASTARG="\${$#}"
-	case $LASTARG in
-	*.y)
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" y.tab.c
-	    fi
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" y.tab.h
-	    fi
-	  ;;
-	esac
-    fi
-    if test ! -f y.tab.h; then
-	echo >y.tab.h
-    fi
-    if test ! -f y.tab.c; then
-	echo 'main() { return 0; }' >y.tab.c
-    fi
-    ;;
-
-  lex|flex)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.l' file.  You may need the \`Flex' package
-         in order for those modifications to take effect.  You can get
-         \`Flex' from any GNU archive site."
-    rm -f lex.yy.c
-    if test $# -ne 1; then
-        eval LASTARG="\${$#}"
-	case $LASTARG in
-	*.l)
-	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" lex.yy.c
-	    fi
-	  ;;
-	esac
-    fi
-    if test ! -f lex.yy.c; then
-	echo 'main() { return 0; }' >lex.yy.c
-    fi
-    ;;
-
-  help2man)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-	 you modified a dependency of a manual page.  You may need the
-	 \`Help2man' package in order for those modifications to take
-	 effect.  You can get \`Help2man' from any GNU archive site."
-
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -f "$file"; then
-	touch $file
-    else
-	test -z "$file" || exec >$file
-	echo ".ab help2man is required to generate this page"
-	exit 1
-    fi
-    ;;
-
-  makeinfo)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.texi' or \`.texinfo' file, or any other file
-         indirectly affecting the aspect of the manual.  The spurious
-         call might also be the consequence of using a buggy \`make' (AIX,
-         DU, IRIX).  You might want to install the \`Texinfo' package or
-         the \`GNU make' package.  Grab either from any GNU archive site."
-    # The file to touch is that specified with -o ...
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -z "$file"; then
-      # ... or it is the one specified with @setfilename ...
-      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
-      file=`sed -n '
-	/^@setfilename/{
-	  s/.* \([^ ]*\) *$/\1/
-	  p
-	  q
-	}' $infile`
-      # ... or it is derived from the source name (dir/f.texi becomes f.info)
-      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
-    fi
-    # If the file does not exist, the user really needs makeinfo;
-    # let's fail without touching anything.
-    test -f $file || exit 1
-    touch $file
-    ;;
-
-  tar)
-    shift
-
-    # We have already tried tar in the generic part.
-    # Look for gnutar/gtar before invocation to avoid ugly error
-    # messages.
-    if (gnutar --version > /dev/null 2>&1); then
-       gnutar "$@" && exit 0
-    fi
-    if (gtar --version > /dev/null 2>&1); then
-       gtar "$@" && exit 0
-    fi
-    firstarg="$1"
-    if shift; then
-	case $firstarg in
-	*o*)
-	    firstarg=`echo "$firstarg" | sed s/o//`
-	    tar "$firstarg" "$@" && exit 0
-	    ;;
-	esac
-	case $firstarg in
-	*h*)
-	    firstarg=`echo "$firstarg" | sed s/h//`
-	    tar "$firstarg" "$@" && exit 0
-	    ;;
-	esac
-    fi
-
-    echo 1>&2 "\
-WARNING: I can't seem to be able to run \`tar' with the given arguments.
-         You may want to install GNU tar or Free paxutils, or check the
-         command line arguments."
-    exit 1
-    ;;
-
-  *)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, and is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.  Check the \`README' file,
-         it often tells you about the needed prerequisites for installing
-         this package.  You may also peek at any GNU archive site, in case
-         some other package would contain this missing \`$1' program."
-    exit 1
-    ;;
-esac
-
-exit 0
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
-# End:
diff --git a/cloog-0.16.3/configure b/cloog-0.16.3/configure
deleted file mode 100755
index 8233279..0000000
--- a/cloog-0.16.3/configure
+++ /dev/null
@@ -1,15022 +0,0 @@
-#! /bin/sh
-# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.65 for cloog 0.16.3.
-#
-# Report bugs to <cloog-development@googlegroups.com>.
-#
-#
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
-#
-#
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
-      PATH_SEPARATOR=';'
-  }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-case $0 in #((
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-  done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test "x$CONFIG_SHELL" = x; then
-  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '\${1+\"\$@\"}'='\"\$@\"'
-  setopt NO_GLOB_SUBST
-else
-  case \`(set -o) 2>/dev/null\` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-"
-  as_required="as_fn_return () { (exit \$1); }
-as_fn_success () { as_fn_return 0; }
-as_fn_failure () { as_fn_return 1; }
-as_fn_ret_success () { return 0; }
-as_fn_ret_failure () { return 1; }
-
-exitcode=0
-as_fn_success || { exitcode=1; echo as_fn_success failed.; }
-as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
-as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
-as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
-
-else
-  exitcode=1; echo positional parameters were not saved.
-fi
-test x\$exitcode = x0 || exit 1"
-  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
-  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
-  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
-  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
-
-  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
-    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
-    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
-    PATH=/empty FPATH=/empty; export PATH FPATH
-    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
-      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
-test \$(( 1 + 1 )) = 2 || exit 1"
-  if (eval "$as_required") 2>/dev/null; then :
-  as_have_required=yes
-else
-  as_have_required=no
-fi
-  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
-
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_found=false
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  as_found=:
-  case $as_dir in #(
-	 /*)
-	   for as_base in sh bash ksh sh5; do
-	     # Try only shells that exist, to save several forks.
-	     as_shell=$as_dir/$as_base
-	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
-		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
-  CONFIG_SHELL=$as_shell as_have_required=yes
-		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
-  break 2
-fi
-fi
-	   done;;
-       esac
-  as_found=false
-done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
-	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
-  CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
-IFS=$as_save_IFS
-
-
-      if test "x$CONFIG_SHELL" != x; then :
-  # We cannot yet assume a decent shell, so we have to provide a
-	# neutralization value for shells without unset; and this also
-	# works around shells that cannot unset nonexistent variables.
-	BASH_ENV=/dev/null
-	ENV=/dev/null
-	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-	export CONFIG_SHELL
-	exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
-fi
-
-    if test x$as_have_required = xno; then :
-  $as_echo "$0: This script requires a shell more modern than all"
-  $as_echo "$0: the shells that I found on your system."
-  if test x${ZSH_VERSION+set} = xset ; then
-    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
-    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
-  else
-    $as_echo "$0: Please tell bug-autoconf@gnu.org and
-$0: cloog-development@googlegroups.com about your system,
-$0: including any error possibly output before this
-$0: message. Then install a modern shell, or manually run
-$0: the script under such a shell if you do have one."
-  fi
-  exit 1
-fi
-fi
-fi
-SHELL=${CONFIG_SHELL-/bin/sh}
-export SHELL
-# Unset more variables known to interfere with behavior of common tools.
-CLICOLOR_FORCE= GREP_OPTIONS=
-unset CLICOLOR_FORCE GREP_OPTIONS
-
-## --------------------- ##
-## M4sh Shell Functions. ##
-## --------------------- ##
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
-  { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
-  return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
-  set +e
-  as_fn_set_status $1
-  exit $1
-} # as_fn_exit
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || eval $as_mkdir_p || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
-  eval 'as_fn_append ()
-  {
-    eval $1+=\$2
-  }'
-else
-  as_fn_append ()
-  {
-    eval $1=\$$1\$2
-  }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
-  eval 'as_fn_arith ()
-  {
-    as_val=$(( $* ))
-  }'
-else
-  as_fn_arith ()
-  {
-    as_val=`expr "$@" || test $? -eq 1`
-  }
-fi # as_fn_arith
-
-
-# as_fn_error ERROR [LINENO LOG_FD]
-# ---------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with status $?, using 1 if that was 0.
-as_fn_error ()
-{
-  as_status=$?; test $as_status -eq 0 && as_status=1
-  if test "$3"; then
-    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
-  fi
-  $as_echo "$as_me: error: $1" >&2
-  as_fn_exit $as_status
-} # as_fn_error
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-
-  as_lineno_1=$LINENO as_lineno_1a=$LINENO
-  as_lineno_2=$LINENO as_lineno_2a=$LINENO
-  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
-  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
-  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
-  sed -n '
-    p
-    /[$]LINENO/=
-  ' <$as_myself |
-    sed '
-      s/[$]LINENO.*/&-/
-      t lineno
-      b
-      :lineno
-      N
-      :loop
-      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
-      t loop
-      s/-\n.*//
-    ' >$as_me.lineno &&
-  chmod +x "$as_me.lineno" ||
-    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
-
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensitive to this).
-  . "./$as_me.lineno"
-  # Exit status is that of the last command.
-  exit
-}
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
-  case `echo 'xy\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  xy)  ECHO_C='\c';;
-  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
-       ECHO_T='	';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
-  if ln -s conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s='ln -s'
-    # ... but there are two gotchas:
-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
-  elif ln conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s=ln
-  else
-    as_ln_s='cp -p'
-  fi
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p='mkdir -p "$as_dir"'
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-	test -d "$1/.";
-      else
-	case $1 in #(
-	-*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-
-test -n "$DJDIR" || exec 7<&0 </dev/null
-exec 6>&1
-
-# Name of the host.
-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
-# so uname gets run too.
-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
-#
-# Initializations.
-#
-ac_default_prefix=/usr/local
-ac_clean_files=
-ac_config_libobj_dir=.
-LIBOBJS=
-cross_compiling=no
-subdirs=
-MFLAGS=
-MAKEFLAGS=
-
-# Identity of this package.
-PACKAGE_NAME='cloog'
-PACKAGE_TARNAME='cloog'
-PACKAGE_VERSION='0.16.3'
-PACKAGE_STRING='cloog 0.16.3'
-PACKAGE_BUGREPORT='cloog-development@googlegroups.com'
-PACKAGE_URL=''
-
-ac_unique_file="source/cloog.c"
-# Factoring default headers for most tests.
-ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#ifdef STDC_HEADERS
-# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-#  include <stdlib.h>
-# endif
-#endif
-#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-#  include <memory.h>
-# endif
-# include <string.h>
-#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-#ifdef HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif"
-
-enable_option_checking=no
-ac_subst_vars='am__EXEEXT_FALSE
-am__EXEEXT_TRUE
-LTLIBOBJS
-LIBOBJS
-subdirs
-pkgconfig_libfile
-pkgconfig_libdir
-VERSION_REVISION
-VERSION_MINOR
-VERSION_MAJOR
-BITS
-INSTALL
-GIT_INDEX
-NO_ISL_FALSE
-NO_ISL_TRUE
-BUNDLED_ISL_FALSE
-BUNDLED_ISL_TRUE
-ISL_LIBS
-ISL_LDFLAGS
-ISL_CPPFLAGS
-NEED_GET_MEMORY_FUNCTIONS_FALSE
-NEED_GET_MEMORY_FUNCTIONS_TRUE
-CFLAGS_WARN
-PRTDIAG
-HAVE_TEXI2DVI_FALSE
-HAVE_TEXI2DVI_TRUE
-TEXI2DVI
-CPP
-OTOOL64
-OTOOL
-LIPO
-NMEDIT
-DSYMUTIL
-RANLIB
-AR
-OBJDUMP
-NM
-ac_ct_DUMPBIN
-DUMPBIN
-LD
-FGREP
-EGREP
-GREP
-SED
-host_os
-host_vendor
-host_cpu
-host
-build_os
-build_vendor
-build_cpu
-build
-LIBTOOL
-CD
-LN_S
-am__fastdepCC_FALSE
-am__fastdepCC_TRUE
-CCDEPMODE
-AMDEPBACKSLASH
-AMDEP_FALSE
-AMDEP_TRUE
-am__quote
-am__include
-DEPDIR
-OBJEXT
-EXEEXT
-ac_ct_CC
-CPPFLAGS
-LDFLAGS
-CFLAGS
-CC
-AM_BACKSLASH
-AM_DEFAULT_VERBOSITY
-am__untar
-am__tar
-AMTAR
-am__leading_dot
-SET_MAKE
-AWK
-mkdir_p
-MKDIR_P
-INSTALL_STRIP_PROGRAM
-STRIP
-install_sh
-MAKEINFO
-AUTOHEADER
-AUTOMAKE
-AUTOCONF
-ACLOCAL
-VERSION
-PACKAGE
-CYGPATH_W
-am__isrc
-INSTALL_DATA
-INSTALL_SCRIPT
-INSTALL_PROGRAM
-versioninfo
-target_alias
-host_alias
-build_alias
-LIBS
-ECHO_T
-ECHO_N
-ECHO_C
-DEFS
-mandir
-localedir
-libdir
-psdir
-pdfdir
-dvidir
-htmldir
-infodir
-docdir
-oldincludedir
-includedir
-localstatedir
-sharedstatedir
-sysconfdir
-datadir
-datarootdir
-libexecdir
-sbindir
-bindir
-program_transform_name
-prefix
-exec_prefix
-PACKAGE_URL
-PACKAGE_BUGREPORT
-PACKAGE_STRING
-PACKAGE_VERSION
-PACKAGE_TARNAME
-PACKAGE_NAME
-PATH_SEPARATOR
-SHELL'
-ac_subst_files=''
-ac_user_opts='
-enable_option_checking
-enable_silent_rules
-enable_dependency_tracking
-enable_shared
-enable_static
-with_pic
-enable_fast_install
-with_gnu_ld
-enable_libtool_lock
-enable_portable_binary
-with_gcc_arch
-with_isl
-with_isl_prefix
-with_isl_exec_prefix
-with_isl_builddir
-with_gmp
-with_gmp_prefix
-with_gmp_exec_prefix
-with_gmp_builddir
-'
-      ac_precious_vars='build_alias
-host_alias
-target_alias
-CC
-CFLAGS
-LDFLAGS
-LIBS
-CPPFLAGS
-CPP'
-ac_subdirs_all='isl'
-
-# Initialize some variables set by options.
-ac_init_help=
-ac_init_version=false
-ac_unrecognized_opts=
-ac_unrecognized_sep=
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-cache_file=/dev/null
-exec_prefix=NONE
-no_create=
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-verbose=
-x_includes=NONE
-x_libraries=NONE
-
-# Installation directory options.
-# These are left unexpanded so users can "make install exec_prefix=/foo"
-# and all the variables that are supposed to be based on exec_prefix
-# by default will actually change.
-# Use braces instead of parens because sh, perl, etc. also accept them.
-# (The list follows the same order as the GNU Coding Standards.)
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datarootdir='${prefix}/share'
-datadir='${datarootdir}'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
-infodir='${datarootdir}/info'
-htmldir='${docdir}'
-dvidir='${docdir}'
-pdfdir='${docdir}'
-psdir='${docdir}'
-libdir='${exec_prefix}/lib'
-localedir='${datarootdir}/locale'
-mandir='${datarootdir}/man'
-
-ac_prev=
-ac_dashdash=
-for ac_option
-do
-  # If the previous option needs an argument, assign it.
-  if test -n "$ac_prev"; then
-    eval $ac_prev=\$ac_option
-    ac_prev=
-    continue
-  fi
-
-  case $ac_option in
-  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
-  *)	ac_optarg=yes ;;
-  esac
-
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
-  case $ac_dashdash$ac_option in
-  --)
-    ac_dashdash=yes ;;
-
-  -bindir | --bindir | --bindi | --bind | --bin | --bi)
-    ac_prev=bindir ;;
-  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
-    bindir=$ac_optarg ;;
-
-  -build | --build | --buil | --bui | --bu)
-    ac_prev=build_alias ;;
-  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
-    build_alias=$ac_optarg ;;
-
-  -cache-file | --cache-file | --cache-fil | --cache-fi \
-  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-    ac_prev=cache_file ;;
-  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
-    cache_file=$ac_optarg ;;
-
-  --config-cache | -C)
-    cache_file=config.cache ;;
-
-  -datadir | --datadir | --datadi | --datad)
-    ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=*)
-    datadir=$ac_optarg ;;
-
-  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
-  | --dataroo | --dataro | --datar)
-    ac_prev=datarootdir ;;
-  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
-  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
-    datarootdir=$ac_optarg ;;
-
-  -disable-* | --disable-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid feature name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"enable_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval enable_$ac_useropt=no ;;
-
-  -docdir | --docdir | --docdi | --doc | --do)
-    ac_prev=docdir ;;
-  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
-    docdir=$ac_optarg ;;
-
-  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
-    ac_prev=dvidir ;;
-  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
-    dvidir=$ac_optarg ;;
-
-  -enable-* | --enable-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid feature name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"enable_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval enable_$ac_useropt=\$ac_optarg ;;
-
-  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
-  | --exec | --exe | --ex)
-    ac_prev=exec_prefix ;;
-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
-  | --exec=* | --exe=* | --ex=*)
-    exec_prefix=$ac_optarg ;;
-
-  -gas | --gas | --ga | --g)
-    # Obsolete; use --with-gas.
-    with_gas=yes ;;
-
-  -help | --help | --hel | --he | -h)
-    ac_init_help=long ;;
-  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
-    ac_init_help=recursive ;;
-  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
-    ac_init_help=short ;;
-
-  -host | --host | --hos | --ho)
-    ac_prev=host_alias ;;
-  -host=* | --host=* | --hos=* | --ho=*)
-    host_alias=$ac_optarg ;;
-
-  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
-    ac_prev=htmldir ;;
-  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
-  | --ht=*)
-    htmldir=$ac_optarg ;;
-
-  -includedir | --includedir | --includedi | --included | --include \
-  | --includ | --inclu | --incl | --inc)
-    ac_prev=includedir ;;
-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
-  | --includ=* | --inclu=* | --incl=* | --inc=*)
-    includedir=$ac_optarg ;;
-
-  -infodir | --infodir | --infodi | --infod | --info | --inf)
-    ac_prev=infodir ;;
-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
-    infodir=$ac_optarg ;;
-
-  -libdir | --libdir | --libdi | --libd)
-    ac_prev=libdir ;;
-  -libdir=* | --libdir=* | --libdi=* | --libd=*)
-    libdir=$ac_optarg ;;
-
-  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
-  | --libexe | --libex | --libe)
-    ac_prev=libexecdir ;;
-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
-  | --libexe=* | --libex=* | --libe=*)
-    libexecdir=$ac_optarg ;;
-
-  -localedir | --localedir | --localedi | --localed | --locale)
-    ac_prev=localedir ;;
-  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
-    localedir=$ac_optarg ;;
-
-  -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst | --locals)
-    ac_prev=localstatedir ;;
-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
-    localstatedir=$ac_optarg ;;
-
-  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
-    ac_prev=mandir ;;
-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
-    mandir=$ac_optarg ;;
-
-  -nfp | --nfp | --nf)
-    # Obsolete; use --without-fp.
-    with_fp=no ;;
-
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c | -n)
-    no_create=yes ;;
-
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
-    no_recursion=yes ;;
-
-  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
-  | --oldin | --oldi | --old | --ol | --o)
-    ac_prev=oldincludedir ;;
-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
-    oldincludedir=$ac_optarg ;;
-
-  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-    ac_prev=prefix ;;
-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-    prefix=$ac_optarg ;;
-
-  -program-prefix | --program-prefix | --program-prefi | --program-pref \
-  | --program-pre | --program-pr | --program-p)
-    ac_prev=program_prefix ;;
-  -program-prefix=* | --program-prefix=* | --program-prefi=* \
-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
-    program_prefix=$ac_optarg ;;
-
-  -program-suffix | --program-suffix | --program-suffi | --program-suff \
-  | --program-suf | --program-su | --program-s)
-    ac_prev=program_suffix ;;
-  -program-suffix=* | --program-suffix=* | --program-suffi=* \
-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
-    program_suffix=$ac_optarg ;;
-
-  -program-transform-name | --program-transform-name \
-  | --program-transform-nam | --program-transform-na \
-  | --program-transform-n | --program-transform- \
-  | --program-transform | --program-transfor \
-  | --program-transfo | --program-transf \
-  | --program-trans | --program-tran \
-  | --progr-tra | --program-tr | --program-t)
-    ac_prev=program_transform_name ;;
-  -program-transform-name=* | --program-transform-name=* \
-  | --program-transform-nam=* | --program-transform-na=* \
-  | --program-transform-n=* | --program-transform-=* \
-  | --program-transform=* | --program-transfor=* \
-  | --program-transfo=* | --program-transf=* \
-  | --program-trans=* | --program-tran=* \
-  | --progr-tra=* | --program-tr=* | --program-t=*)
-    program_transform_name=$ac_optarg ;;
-
-  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
-    ac_prev=pdfdir ;;
-  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
-    pdfdir=$ac_optarg ;;
-
-  -psdir | --psdir | --psdi | --psd | --ps)
-    ac_prev=psdir ;;
-  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
-    psdir=$ac_optarg ;;
-
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil)
-    silent=yes ;;
-
-  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
-    ac_prev=sbindir ;;
-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
-  | --sbi=* | --sb=*)
-    sbindir=$ac_optarg ;;
-
-  -sharedstatedir | --sharedstatedir | --sharedstatedi \
-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
-  | --sharedst | --shareds | --shared | --share | --shar \
-  | --sha | --sh)
-    ac_prev=sharedstatedir ;;
-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
-  | --sha=* | --sh=*)
-    sharedstatedir=$ac_optarg ;;
-
-  -site | --site | --sit)
-    ac_prev=site ;;
-  -site=* | --site=* | --sit=*)
-    site=$ac_optarg ;;
-
-  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-    ac_prev=srcdir ;;
-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-    srcdir=$ac_optarg ;;
-
-  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
-  | --syscon | --sysco | --sysc | --sys | --sy)
-    ac_prev=sysconfdir ;;
-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
-    sysconfdir=$ac_optarg ;;
-
-  -target | --target | --targe | --targ | --tar | --ta | --t)
-    ac_prev=target_alias ;;
-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
-    target_alias=$ac_optarg ;;
-
-  -v | -verbose | --verbose | --verbos | --verbo | --verb)
-    verbose=yes ;;
-
-  -version | --version | --versio | --versi | --vers | -V)
-    ac_init_version=: ;;
-
-  -with-* | --with-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid package name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"with_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval with_$ac_useropt=\$ac_optarg ;;
-
-  -without-* | --without-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid package name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"with_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval with_$ac_useropt=no ;;
-
-  --x)
-    # Obsolete; use --with-x.
-    with_x=yes ;;
-
-  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
-  | --x-incl | --x-inc | --x-in | --x-i)
-    ac_prev=x_includes ;;
-  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
-  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
-    x_includes=$ac_optarg ;;
-
-  -x-libraries | --x-libraries | --x-librarie | --x-librari \
-  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
-    ac_prev=x_libraries ;;
-  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
-  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
-    x_libraries=$ac_optarg ;;
-
-  -*) as_fn_error "unrecognized option: \`$ac_option'
-Try \`$0 --help' for more information."
-    ;;
-
-  *=*)
-    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
-    # Reject names that are not valid shell variable names.
-    case $ac_envvar in #(
-      '' | [0-9]* | *[!_$as_cr_alnum]* )
-      as_fn_error "invalid variable name: \`$ac_envvar'" ;;
-    esac
-    eval $ac_envvar=\$ac_optarg
-    export $ac_envvar ;;
-
-  *)
-    # FIXME: should be removed in autoconf 3.0.
-    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
-    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
-    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
-    ;;
-
-  esac
-done
-
-if test -n "$ac_prev"; then
-  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
-  as_fn_error "missing argument to $ac_option"
-fi
-
-if test -n "$ac_unrecognized_opts"; then
-  case $enable_option_checking in
-    no) ;;
-    fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;;
-    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
-  esac
-fi
-
-# Check all directory arguments for consistency.
-for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
-		datadir sysconfdir sharedstatedir localstatedir includedir \
-		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
-do
-  eval ac_val=\$$ac_var
-  # Remove trailing slashes.
-  case $ac_val in
-    */ )
-      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
-      eval $ac_var=\$ac_val;;
-  esac
-  # Be sure to have absolute directory names.
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* )  continue;;
-    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
-  esac
-  as_fn_error "expected an absolute directory name for --$ac_var: $ac_val"
-done
-
-# There might be people who depend on the old broken behavior: `$host'
-# used to hold the argument of --host etc.
-# FIXME: To remove some day.
-build=$build_alias
-host=$host_alias
-target=$target_alias
-
-# FIXME: To remove some day.
-if test "x$host_alias" != x; then
-  if test "x$build_alias" = x; then
-    cross_compiling=maybe
-    $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
-    If a cross compiler is detected then cross compile mode will be used." >&2
-  elif test "x$build_alias" != "x$host_alias"; then
-    cross_compiling=yes
-  fi
-fi
-
-ac_tool_prefix=
-test -n "$host_alias" && ac_tool_prefix=$host_alias-
-
-test "$silent" = yes && exec 6>/dev/null
-
-
-ac_pwd=`pwd` && test -n "$ac_pwd" &&
-ac_ls_di=`ls -di .` &&
-ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
-  as_fn_error "working directory cannot be determined"
-test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
-  as_fn_error "pwd does not report name of working directory"
-
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
-  ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then the parent directory.
-  ac_confdir=`$as_dirname -- "$as_myself" ||
-$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_myself" : 'X\(//\)[^/]' \| \
-	 X"$as_myself" : 'X\(//\)$' \| \
-	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  srcdir=$ac_confdir
-  if test ! -r "$srcdir/$ac_unique_file"; then
-    srcdir=..
-  fi
-else
-  ac_srcdir_defaulted=no
-fi
-if test ! -r "$srcdir/$ac_unique_file"; then
-  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
-  as_fn_error "cannot find sources ($ac_unique_file) in $srcdir"
-fi
-ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
-ac_abs_confdir=`(
-	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg"
-	pwd)`
-# When building in place, set srcdir=.
-if test "$ac_abs_confdir" = "$ac_pwd"; then
-  srcdir=.
-fi
-# Remove unnecessary trailing slashes from srcdir.
-# Double slashes in file names in object file debugging info
-# mess up M-x gdb in Emacs.
-case $srcdir in
-*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
-esac
-for ac_var in $ac_precious_vars; do
-  eval ac_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_env_${ac_var}_value=\$${ac_var}
-  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_cv_env_${ac_var}_value=\$${ac_var}
-done
-
-#
-# Report the --help message.
-#
-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 cloog 0.16.3 to adapt to many kinds of systems.
-
-Usage: $0 [OPTION]... [VAR=VALUE]...
-
-To assign environment variables (e.g., CC, CFLAGS...), specify them as
-VAR=VALUE.  See below for descriptions of some of the useful variables.
-
-Defaults for the options are specified in brackets.
-
-Configuration:
-  -h, --help              display this help and exit
-      --help=short        display options specific to this package
-      --help=recursive    display the short help of all the included packages
-  -V, --version           display version information and exit
-  -q, --quiet, --silent   do not print \`checking...' messages
-      --cache-file=FILE   cache test results in FILE [disabled]
-  -C, --config-cache      alias for \`--cache-file=config.cache'
-  -n, --no-create         do not create output files
-      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
-
-Installation directories:
-  --prefix=PREFIX         install architecture-independent files in PREFIX
-                          [$ac_default_prefix]
-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-                          [PREFIX]
-
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
-
-For better control, use the options below.
-
-Fine tuning of the installation directories:
-  --bindir=DIR            user executables [EPREFIX/bin]
-  --sbindir=DIR           system admin executables [EPREFIX/sbin]
-  --libexecdir=DIR        program executables [EPREFIX/libexec]
-  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
-  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
-  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
-  --libdir=DIR            object code libraries [EPREFIX/lib]
-  --includedir=DIR        C header files [PREFIX/include]
-  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
-  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
-  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
-  --infodir=DIR           info documentation [DATAROOTDIR/info]
-  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
-  --mandir=DIR            man documentation [DATAROOTDIR/man]
-  --docdir=DIR            documentation root [DATAROOTDIR/doc/cloog]
-  --htmldir=DIR           html documentation [DOCDIR]
-  --dvidir=DIR            dvi documentation [DOCDIR]
-  --pdfdir=DIR            pdf documentation [DOCDIR]
-  --psdir=DIR             ps documentation [DOCDIR]
-_ACEOF
-
-  cat <<\_ACEOF
-
-Program names:
-  --program-prefix=PREFIX            prepend PREFIX to installed program names
-  --program-suffix=SUFFIX            append SUFFIX to installed program names
-  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
-
-System types:
-  --build=BUILD     configure for building on BUILD [guessed]
-  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
-_ACEOF
-fi
-
-if test -n "$ac_init_help"; then
-  case $ac_init_help in
-     short | recursive ) echo "Configuration of cloog 0.16.3:";;
-   esac
-  cat <<\_ACEOF
-
-Optional Features:
-  --disable-option-checking  ignore unrecognized --enable/--with options
-  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
-  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --enable-silent-rules          less verbose build output (undo: `make V=1')
-  --disable-silent-rules         verbose build output (undo: `make V=0')
-  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors
-  --enable-shared[=PKGS]  build shared libraries [default=yes]
-  --enable-static[=PKGS]  build static libraries [default=yes]
-  --enable-fast-install[=PKGS]
-                          optimize for fast installation [default=yes]
-  --disable-libtool-lock  avoid locking (might break parallel builds)
-  --enable-portable-binary
-                          disable compiler optimizations that would produce
-                          unportable binaries
-
-Optional Packages:
-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --with-pic              try to use only PIC/non-PIC objects [default=use
-                          both]
-  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
-  --with-gcc-arch=<arch>  use architecture <arch> for gcc -march/-mtune,
-                          instead of guessing
-  --with-isl=no|system|build|bundled
-                          Which isl to use
-  --with-isl-prefix=DIR   Prefix of isl installation
-  --with-isl-exec-prefix=DIR
-                          Exec prefix of isl installation
-  --with-isl-builddir=DIR Location of isl builddir
-  --with-gmp=system       Which gmp to use
-  --with-gmp-prefix=DIR   Prefix of gmp installation
-  --with-gmp-exec-prefix=DIR
-                          Exec prefix of gmp installation
-  --with-gmp-builddir=DIR Location of gmp builddir
-
-Some influential environment variables:
-  CC          C compiler command
-  CFLAGS      C compiler flags
-  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
-              nonstandard directory <lib dir>
-  LIBS        libraries to pass to the linker, e.g. -l<library>
-  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
-              you have headers in a nonstandard directory <include dir>
-  CPP         C preprocessor
-
-Use these variables to override the choices made by `configure' or to help
-it to find libraries and programs with nonstandard names/locations.
-
-Report bugs to <cloog-development@googlegroups.com>.
-_ACEOF
-ac_status=$?
-fi
-
-if test "$ac_init_help" = "recursive"; then
-  # If there are subdirs, report their specific --help.
-  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d "$ac_dir" ||
-      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
-      continue
-    ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-    cd "$ac_dir" || { ac_status=$?; continue; }
-    # Check for guested configure.
-    if test -f "$ac_srcdir/configure.gnu"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
-    elif test -f "$ac_srcdir/configure"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure" --help=recursive
-    else
-      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
-    fi || ac_status=$?
-    cd "$ac_pwd" || { ac_status=$?; break; }
-  done
-fi
-
-test -n "$ac_init_help" && exit $ac_status
-if $ac_init_version; then
-  cat <<\_ACEOF
-cloog configure 0.16.3
-generated by GNU Autoconf 2.65
-
-Copyright (C) 2009 Free Software Foundation, Inc.
-This configure script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it.
-_ACEOF
-  exit
-fi
-
-## ------------------------ ##
-## Autoconf initialization. ##
-## ------------------------ ##
-
-# ac_fn_c_try_compile LINENO
-# --------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext
-  if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_compile
-
-# ac_fn_c_try_link LINENO
-# -----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
-  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
-  # interfere with the next link command; also delete a directory that is
-  # left behind by Apple's compiler.  We do this before executing the actions.
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_link
-
-# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists and can be compiled using the include files in
-# INCLUDES, setting the cache variable VAR accordingly.
-ac_fn_c_check_header_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_header_compile
-
-# ac_fn_c_try_cpp LINENO
-# ----------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_cpp ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-    ac_retval=1
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_cpp
-
-# ac_fn_c_try_run LINENO
-# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_c_try_run ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-       $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-       ac_retval=$ac_status
-fi
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_run
-
-# ac_fn_c_check_func LINENO FUNC VAR
-# ----------------------------------
-# Tests whether FUNC exists, setting the cache variable VAR accordingly
-ac_fn_c_check_func ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $2 innocuous_$2
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $2 (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $2
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $2 ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined __stub_$2 || defined __stub___$2
-choke me
-#endif
-
-int
-main ()
-{
-return $2 ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_func
-
-# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
-# -------------------------------------------
-# Tests whether TYPE exists after having included INCLUDES, setting cache
-# variable VAR accordingly.
-ac_fn_c_check_type ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=no"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof ($2))
-	 return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof (($2)))
-	    return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  eval "$3=yes"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_type
-
-# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_c_check_header_mongrel ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
-  # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_header_compiler=yes
-else
-  ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <$2>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  ac_header_preproc=yes
-else
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
-  yes:no: )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-    ;;
-  no:yes:* )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( cat <<\_ASBOX
-## ------------------------------------------------- ##
-## Report this to cloog-development@googlegroups.com ##
-## ------------------------------------------------- ##
-_ASBOX
-     ) | sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_header_mongrel
-
-# ac_fn_c_check_decl LINENO SYMBOL VAR
-# ------------------------------------
-# Tests whether SYMBOL is declared, setting cache variable VAR accordingly.
-ac_fn_c_check_decl ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $2 is declared" >&5
-$as_echo_n "checking whether $2 is declared... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-#ifndef $2
-  (void) $2;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_decl
-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 cloog $as_me 0.16.3, which was
-generated by GNU Autoconf 2.65.  Invocation command line was
-
-  $ $0 $@
-
-_ACEOF
-exec 5>>config.log
-{
-cat <<_ASUNAME
-## --------- ##
-## Platform. ##
-## --------- ##
-
-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
-
-/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
-/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
-/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
-
-_ASUNAME
-
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    $as_echo "PATH: $as_dir"
-  done
-IFS=$as_save_IFS
-
-} >&5
-
-cat >&5 <<_ACEOF
-
-
-## ----------- ##
-## Core tests. ##
-## ----------- ##
-
-_ACEOF
-
-
-# Keep a trace of the command line.
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Strip out --silent because we don't want to record it for future runs.
-# Also quote any args containing shell meta-characters.
-# Make two passes to allow for proper duplicate-argument suppression.
-ac_configure_args=
-ac_configure_args0=
-ac_configure_args1=
-ac_must_keep_next=false
-for ac_pass in 1 2
-do
-  for ac_arg
-  do
-    case $ac_arg in
-    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
-    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-    | -silent | --silent | --silen | --sile | --sil)
-      continue ;;
-    *\'*)
-      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    case $ac_pass in
-    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
-    2)
-      as_fn_append ac_configure_args1 " '$ac_arg'"
-      if test $ac_must_keep_next = true; then
-	ac_must_keep_next=false # Got value, back to normal.
-      else
-	case $ac_arg in
-	  *=* | --config-cache | -C | -disable-* | --disable-* \
-	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
-	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
-	  | -with-* | --with-* | -without-* | --without-* | --x)
-	    case "$ac_configure_args0 " in
-	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
-	    esac
-	    ;;
-	  -* ) ac_must_keep_next=true ;;
-	esac
-      fi
-      as_fn_append ac_configure_args " '$ac_arg'"
-      ;;
-    esac
-  done
-done
-{ ac_configure_args0=; unset ac_configure_args0;}
-{ ac_configure_args1=; unset ac_configure_args1;}
-
-# When interrupted or exit'd, cleanup temporary files, and complete
-# config.log.  We remove comments because anyway the quotes in there
-# would cause problems or look ugly.
-# WARNING: Use '\'' to represent an apostrophe within the trap.
-# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
-trap 'exit_status=$?
-  # Save into config.log some information that might help in debugging.
-  {
-    echo
-
-    cat <<\_ASBOX
-## ---------------- ##
-## Cache variables. ##
-## ---------------- ##
-_ASBOX
-    echo
-    # The following way of writing the cache mishandles newlines in values,
-(
-  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) { eval $ac_var=; unset $ac_var;} ;;
-      esac ;;
-    esac
-  done
-  (set) 2>&1 |
-    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      sed -n \
-	"s/'\''/'\''\\\\'\'''\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
-      ;; #(
-    *)
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-)
-    echo
-
-    cat <<\_ASBOX
-## ----------------- ##
-## Output variables. ##
-## ----------------- ##
-_ASBOX
-    echo
-    for ac_var in $ac_subst_vars
-    do
-      eval ac_val=\$$ac_var
-      case $ac_val in
-      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-      esac
-      $as_echo "$ac_var='\''$ac_val'\''"
-    done | sort
-    echo
-
-    if test -n "$ac_subst_files"; then
-      cat <<\_ASBOX
-## ------------------- ##
-## File substitutions. ##
-## ------------------- ##
-_ASBOX
-      echo
-      for ac_var in $ac_subst_files
-      do
-	eval ac_val=\$$ac_var
-	case $ac_val in
-	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-	esac
-	$as_echo "$ac_var='\''$ac_val'\''"
-      done | sort
-      echo
-    fi
-
-    if test -s confdefs.h; then
-      cat <<\_ASBOX
-## ----------- ##
-## confdefs.h. ##
-## ----------- ##
-_ASBOX
-      echo
-      cat confdefs.h
-      echo
-    fi
-    test "$ac_signal" != 0 &&
-      $as_echo "$as_me: caught signal $ac_signal"
-    $as_echo "$as_me: exit $exit_status"
-  } >&5
-  rm -f core *.core core.conftest.* &&
-    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
-    exit $exit_status
-' 0
-for ac_signal in 1 2 13 15; do
-  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
-done
-ac_signal=0
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -f -r conftest* confdefs.h
-
-$as_echo "/* confdefs.h */" > confdefs.h
-
-# Predefined preprocessor variables.
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
-
-
-# Let the site file select an alternate cache file if it wants to.
-# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
-if test -n "$CONFIG_SITE"; then
-  ac_site_file1=$CONFIG_SITE
-elif test "x$prefix" != xNONE; then
-  ac_site_file1=$prefix/share/config.site
-  ac_site_file2=$prefix/etc/config.site
-else
-  ac_site_file1=$ac_default_prefix/share/config.site
-  ac_site_file2=$ac_default_prefix/etc/config.site
-fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
-do
-  test "x$ac_site_file" = xNONE && continue
-  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
-    sed 's/^/| /' "$ac_site_file" >&5
-    . "$ac_site_file"
-  fi
-done
-
-if test -r "$cache_file"; then
-  # Some versions of bash will fail to source /dev/null (special files
-  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
-  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
-    case $cache_file in
-      [\\/]* | ?:[\\/]* ) . "$cache_file";;
-      *)                      . "./$cache_file";;
-    esac
-  fi
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
-  >$cache_file
-fi
-
-# Check that the precious variables saved in the cache have kept the same
-# value.
-ac_cache_corrupted=false
-for ac_var in $ac_precious_vars; do
-  eval ac_old_set=\$ac_cv_env_${ac_var}_set
-  eval ac_new_set=\$ac_env_${ac_var}_set
-  eval ac_old_val=\$ac_cv_env_${ac_var}_value
-  eval ac_new_val=\$ac_env_${ac_var}_value
-  case $ac_old_set,$ac_new_set in
-    set,)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,set)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,);;
-    *)
-      if test "x$ac_old_val" != "x$ac_new_val"; then
-	# differences in whitespace do not lead to failure.
-	ac_old_val_w=`echo x $ac_old_val`
-	ac_new_val_w=`echo x $ac_new_val`
-	if test "$ac_old_val_w" != "$ac_new_val_w"; then
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
-	  ac_cache_corrupted=:
-	else
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
-	  eval $ac_var=\$ac_old_val
-	fi
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
-$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
-$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
-      fi;;
-  esac
-  # Pass precious variables to config.status.
-  if test "$ac_new_set" = set; then
-    case $ac_new_val in
-    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
-    *) ac_arg=$ac_var=$ac_new_val ;;
-    esac
-    case " $ac_configure_args " in
-      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
-      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
-    esac
-  fi
-done
-if $ac_cache_corrupted; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-  as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
-fi
-## -------------------- ##
-## Main body of script. ##
-## -------------------- ##
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-ac_aux_dir=
-for ac_dir in autoconf "$srcdir"/autoconf; do
-  for ac_t in install-sh install.sh shtool; do
-    if test -f "$ac_dir/$ac_t"; then
-      ac_aux_dir=$ac_dir
-      ac_install_sh="$ac_aux_dir/$ac_t -c"
-      break 2
-    fi
-  done
-done
-if test -z "$ac_aux_dir"; then
-  as_fn_error "cannot find install-sh, install.sh, or shtool in autoconf \"$srcdir\"/autoconf" "$LINENO" 5
-fi
-
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
-
-
-
-
-VERSION_MAJOR=0
-VERSION_MINOR=16
-VERSION_REVISION=3
-
-versioninfo=2:0:0
-
-am__api_version='1.11'
-
-# Find a good install program.  We prefer a C program (faster),
-# so one script is as good as another.  But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AmigaOS /C/install, which installs bootblocks on floppy discs
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# OS/2's system install, which has a completely different semantic
-# ./install, which can be erroneously created by make from ./install.sh.
-# Reject install programs that cannot install multiple files.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
-$as_echo_n "checking for a BSD-compatible install... " >&6; }
-if test -z "$INSTALL"; then
-if test "${ac_cv_path_install+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in #((
-  ./ | .// | /[cC]/* | \
-  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
-  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
-  /usr/ucb/* ) ;;
-  *)
-    # OSF1 and SCO ODT 3.0 have their own names for install.
-    # Don't use installbsd from OSF since it installs stuff as root
-    # by default.
-    for ac_prog in ginstall scoinst install; do
-      for ac_exec_ext in '' $ac_executable_extensions; do
-	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
-	  if test $ac_prog = install &&
-	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # AIX install.  It has an incompatible calling convention.
-	    :
-	  elif test $ac_prog = install &&
-	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # program-specific install script used by HP pwplus--don't use.
-	    :
-	  else
-	    rm -rf conftest.one conftest.two conftest.dir
-	    echo one > conftest.one
-	    echo two > conftest.two
-	    mkdir conftest.dir
-	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
-	      test -s conftest.one && test -s conftest.two &&
-	      test -s conftest.dir/conftest.one &&
-	      test -s conftest.dir/conftest.two
-	    then
-	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
-	      break 3
-	    fi
-	  fi
-	fi
-      done
-    done
-    ;;
-esac
-
-  done
-IFS=$as_save_IFS
-
-rm -rf conftest.one conftest.two conftest.dir
-
-fi
-  if test "${ac_cv_path_install+set}" = set; then
-    INSTALL=$ac_cv_path_install
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for INSTALL within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    INSTALL=$ac_install_sh
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
-$as_echo "$INSTALL" >&6; }
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
-$as_echo_n "checking whether build environment is sane... " >&6; }
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name.  Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
-  *[\\\"\#\$\&\'\`$am_lf]*)
-    as_fn_error "unsafe absolute working directory name" "$LINENO" 5;;
-esac
-case $srcdir in
-  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
-    as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$*" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$*" != "X $srcdir/configure conftest.file" \
-      && test "$*" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      as_fn_error "ls -t appears to fail.  Make sure there is not a broken
-alias in your environment" "$LINENO" 5
-   fi
-
-   test "$2" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   as_fn_error "newly created file is older than distributed files!
-Check your system clock" "$LINENO" 5
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-test "$program_prefix" != NONE &&
-  program_transform_name="s&^&$program_prefix&;$program_transform_name"
-# Use a double $ so make ignores it.
-test "$program_suffix" != NONE &&
-  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
-# Double any \ or $.
-# By default was `s,x,x', remove it if useless.
-ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
-program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
-
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-
-if test x"${MISSING+set}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
-  *)
-    MISSING="\${SHELL} $am_aux_dir/missing" ;;
-  esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
-$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
-fi
-
-if test x"${install_sh}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
-  *)
-    install_sh="\${SHELL} $am_aux_dir/install-sh"
-  esac
-fi
-
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-if test "$cross_compiling" != no; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
-$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
-if test -z "$MKDIR_P"; then
-  if test "${ac_cv_path_mkdir+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in mkdir gmkdir; do
-	 for ac_exec_ext in '' $ac_executable_extensions; do
-	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
-	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
-	     'mkdir (GNU coreutils) '* | \
-	     'mkdir (coreutils) '* | \
-	     'mkdir (fileutils) '4.1*)
-	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
-	       break 3;;
-	   esac
-	 done
-       done
-  done
-IFS=$as_save_IFS
-
-fi
-
-  test -d ./--version && rmdir ./--version
-  if test "${ac_cv_path_mkdir+set}" = set; then
-    MKDIR_P="$ac_cv_path_mkdir -p"
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for MKDIR_P within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    MKDIR_P="$ac_install_sh -d"
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
-$as_echo "$MKDIR_P" >&6; }
-
-mkdir_p="$MKDIR_P"
-case $mkdir_p in
-  [\\/$]* | ?:[\\/]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-
-for ac_prog in gawk mawk nawk awk
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_AWK+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$AWK"; then
-  ac_cv_prog_AWK="$AWK" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_AWK="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-AWK=$ac_cv_prog_AWK
-if test -n "$AWK"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
-$as_echo "$AWK" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$AWK" && break
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
-set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.make <<\_ACEOF
-SHELL = /bin/sh
-all:
-	@echo '@@@%%%=$(MAKE)=@@@%%%'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-case `${MAKE-make} -f conftest.make 2>/dev/null` in
-  *@@@%%%=?*=@@@%%%*)
-    eval ac_cv_prog_make_${ac_make}_set=yes;;
-  *)
-    eval ac_cv_prog_make_${ac_make}_set=no;;
-esac
-rm -f conftest.make
-fi
-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-  SET_MAKE=
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-  SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
-else
-  am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  am__isrc=' -I$(srcdir)'
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-
-
-# Define the identity of the package.
- PACKAGE='cloog'
- VERSION='0.16.3'
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE "$PACKAGE"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define VERSION "$VERSION"
-_ACEOF
-
-# Some tools Automake needs.
-
-ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
-
-
-AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
-
-
-AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
-
-
-AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
-
-
-MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
-
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-# Always define AMTAR for backward compatibility.
-
-AMTAR=${AMTAR-"${am_missing_run}tar"}
-
-am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
-
-
-
-
-
-# Check whether --enable-silent-rules was given.
-if test "${enable_silent_rules+set}" = set; then :
-  enableval=$enable_silent_rules;
-fi
-
-case $enable_silent_rules in
-yes) AM_DEFAULT_VERBOSITY=0;;
-no)  AM_DEFAULT_VERBOSITY=1;;
-*)   AM_DEFAULT_VERBOSITY=0;;
-esac
-AM_BACKSLASH='\'
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
-          if test -n "$ac_tool_prefix"; then
-    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  fi
-fi
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_CC="cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
-  fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl.exe
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$CC" && break
-  done
-fi
-if test -z "$CC"; then
-  ac_ct_CC=$CC
-  for ac_prog in cl.exe
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_CC" && break
-done
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-fi
-
-fi
-
-
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "no acceptable C compiler found in \$PATH
-See \`config.log' for more details." "$LINENO" 5; }
-
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
-  { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    sed '10a\
-... rest of stderr output deleted ...
-         10q' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-  fi
-  rm -f conftest.er1 conftest.err
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-done
-
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-
-# The possible output files:
-ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
-
-ac_rmfiles=
-for ac_file in $ac_files
-do
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
-  esac
-done
-rm -f $ac_rmfiles
-
-if { { ac_try="$ac_link_default"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link_default") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
-# in a Makefile.  We should not override ac_cv_exeext if it was cached,
-# so that the user can short-circuit this test for compilers unknown to
-# Autoconf.
-for ac_file in $ac_files ''
-do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
-	;;
-    [ab].out )
-	# We found the default executable, but exeext='' is most
-	# certainly right.
-	break;;
-    *.* )
-	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
-	then :; else
-	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	fi
-	# We set ac_cv_exeext here because the later test for it is not
-	# safe: cross compilers may not add the suffix if given an `-o'
-	# argument, so we may need to know it at that point already.
-	# Even if this section looks crufty: it has the advantage of
-	# actually working.
-	break;;
-    * )
-	break;;
-  esac
-done
-test "$ac_cv_exeext" = no && ac_cv_exeext=
-
-else
-  ac_file=''
-fi
-if test -z "$ac_file"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "C compiler cannot create executables
-See \`config.log' for more details." "$LINENO" 5; }; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
-ac_exeext=$ac_cv_exeext
-
-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
-if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	  break;;
-    * ) break;;
-  esac
-done
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." "$LINENO" 5; }
-fi
-rm -f conftest conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-FILE *f = fopen ("conftest.out", "w");
- return ferror (f) || fclose (f) != 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files="$ac_clean_files conftest.out"
-# Check that the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
-if test "$cross_compiling" != yes; then
-  { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-  if { ac_try='./conftest$ac_cv_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then
-    cross_compiling=no
-  else
-    if test "$cross_compiling" = maybe; then
-	cross_compiling=yes
-    else
-	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." "$LINENO" 5; }
-    fi
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
-
-rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if test "${ac_cv_objext+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  for ac_file in conftest.o conftest.obj conftest.*; do
-  test -f "$ac_file" || continue;
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
-    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
-       break;;
-  esac
-done
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." "$LINENO" 5; }
-fi
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if test "${ac_cv_c_compiler_gnu+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_compiler_gnu=yes
-else
-  ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
-  GCC=yes
-else
-  GCC=
-fi
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if test "${ac_cv_prog_cc_g+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_save_c_werror_flag=$ac_c_werror_flag
-   ac_c_werror_flag=yes
-   ac_cv_prog_cc_g=no
-   CFLAGS="-g"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-else
-  CFLAGS=""
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  ac_c_werror_flag=$ac_save_c_werror_flag
-	 CFLAGS="-g"
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if test "${ac_cv_prog_cc_c89+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
-     char **p;
-     int i;
-{
-  return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
-  char *s;
-  va_list v;
-  va_start (v,p);
-  s = g (p, va_arg (v,int));
-  va_end (v);
-  return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
-   function prototypes and stuff, but not '\xHH' hex character constants.
-   These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std is added to get
-   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
-   array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std.  */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
-   inside strings and character constants.  */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
-  ;
-  return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
-	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_c89=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
-  test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
-  x)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
-  xno)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
-  *)
-    CC="$CC $ac_cv_prog_cc_c89"
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
-
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-DEPDIR="${am__leading_dot}deps"
-
-ac_config_commands="$ac_config_commands depfiles"
-
-
-am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-	@echo this is the am__doit target
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
-$as_echo_n "checking for style of include used by $am_make... " >&6; }
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
-  am__include=include
-  am__quote=
-  _am_result=GNU
-  ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   case `$am_make -s -f confmf 2> /dev/null` in #(
-   *the\ am__doit\ target*)
-     am__include=.include
-     am__quote="\""
-     _am_result=BSD
-     ;;
-   esac
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
-$as_echo "$_am_result" >&6; }
-rm -f confinc confmf
-
-# Check whether --enable-dependency-tracking was given.
-if test "${enable_dependency_tracking+set}" = set; then :
-  enableval=$enable_dependency_tracking;
-fi
-
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-fi
- if test "x$enable_dependency_tracking" != xno; then
-  AMDEP_TRUE=
-  AMDEP_FALSE='#'
-else
-  AMDEP_TRUE='#'
-  AMDEP_FALSE=
-fi
-
-
-
-depcc="$CC"   am_compiler_list=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_CC_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  am__universal=false
-  case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CC_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CC_dependencies_compiler_type=none
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
-CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
-
- if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
-  am__fastdepCC_TRUE=
-  am__fastdepCC_FALSE='#'
-else
-  am__fastdepCC_TRUE='#'
-  am__fastdepCC_FALSE=
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
-$as_echo_n "checking whether ln -s works... " >&6; }
-LN_S=$as_ln_s
-if test "$LN_S" = "ln -s"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
-$as_echo "no, using $LN_S" >&6; }
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
-set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.make <<\_ACEOF
-SHELL = /bin/sh
-all:
-	@echo '@@@%%%=$(MAKE)=@@@%%%'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-case `${MAKE-make} -f conftest.make 2>/dev/null` in
-  *@@@%%%=?*=@@@%%%*)
-    eval ac_cv_prog_make_${ac_make}_set=yes;;
-  *)
-    eval ac_cv_prog_make_${ac_make}_set=no;;
-esac
-rm -f conftest.make
-fi
-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-  SET_MAKE=
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-  SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-# Extract the first word of "cd", so it can be a program name with args.
-set dummy cd; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CD"; then
-  ac_cv_prog_CD="$CD" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CD=""
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CD=$ac_cv_prog_CD
-if test -n "$CD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CD" >&5
-$as_echo "$CD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-
-case `pwd` in
-  *\ * | *\	*)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
-$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
-esac
-
-
-
-macro_version='2.2.8'
-macro_revision='1.3169'
-
-
-
-
-
-
-
-
-
-
-
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if test "${ac_cv_build+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
-  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
-test "x$ac_build_alias" = x &&
-  as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) as_fn_error "invalid value of canonical build" "$LINENO" 5;;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if test "${ac_cv_host+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "x$host_alias" = x; then
-  ac_cv_host=$ac_cv_build
-else
-  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
-    as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
-case $ac_cv_host in
-*-*-*) ;;
-*) as_fn_error "invalid value of canonical host" "$LINENO" 5;;
-esac
-host=$ac_cv_host
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_host
-shift
-host_cpu=$1
-host_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-host_os=$*
-IFS=$ac_save_IFS
-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
-
-
-# Backslashify metacharacters that are still active within
-# double-quoted strings.
-sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
-ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
-$as_echo_n "checking how to print strings... " >&6; }
-# Test print first, because it will be a builtin if present.
-if test "X`print -r -- -n 2>/dev/null`" = X-n && \
-   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='print -r --'
-elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='printf %s\n'
-else
-  # Use this function as a fallback that always works.
-  func_fallback_echo ()
-  {
-    eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
-  }
-  ECHO='func_fallback_echo'
-fi
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO ""
-}
-
-case "$ECHO" in
-  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
-$as_echo "printf" >&6; } ;;
-  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
-$as_echo "print -r" >&6; } ;;
-  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
-$as_echo "cat" >&6; } ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
-$as_echo_n "checking for a sed that does not truncate output... " >&6; }
-if test "${ac_cv_path_SED+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
-     for ac_i in 1 2 3 4 5 6 7; do
-       ac_script="$ac_script$as_nl$ac_script"
-     done
-     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
-     { ac_script=; unset ac_script;}
-     if test -z "$SED"; then
-  ac_path_SED_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
-# Check for GNU ac_path_SED and select it if it is found.
-  # Check for GNU $ac_path_SED
-case `"$ac_path_SED" --version 2>&1` in
-*GNU*)
-  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo '' >> "conftest.nl"
-    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_SED_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_SED="$ac_path_SED"
-      ac_path_SED_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_SED_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_SED"; then
-    as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5
-  fi
-else
-  ac_cv_path_SED=$SED
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
-$as_echo "$ac_cv_path_SED" >&6; }
- SED="$ac_cv_path_SED"
-  rm -f conftest.sed
-
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if test "${ac_cv_path_GREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$GREP"; then
-  ac_path_GREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in grep ggrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
-# Check for GNU ac_path_GREP and select it if it is found.
-  # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'GREP' >> "conftest.nl"
-    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_GREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_GREP="$ac_path_GREP"
-      ac_path_GREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_GREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_GREP"; then
-    as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if test "${ac_cv_path_EGREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
-   then ac_cv_path_EGREP="$GREP -E"
-   else
-     if test -z "$EGREP"; then
-  ac_path_EGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in egrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
-  # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'EGREP' >> "conftest.nl"
-    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_EGREP="$ac_path_EGREP"
-      ac_path_EGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_EGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_EGREP"; then
-    as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_EGREP=$EGREP
-fi
-
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
-$as_echo_n "checking for fgrep... " >&6; }
-if test "${ac_cv_path_FGREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
-   then ac_cv_path_FGREP="$GREP -F"
-   else
-     if test -z "$FGREP"; then
-  ac_path_FGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in fgrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
-# Check for GNU ac_path_FGREP and select it if it is found.
-  # Check for GNU $ac_path_FGREP
-case `"$ac_path_FGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'FGREP' >> "conftest.nl"
-    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_FGREP="$ac_path_FGREP"
-      ac_path_FGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_FGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_FGREP"; then
-    as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_FGREP=$FGREP
-fi
-
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
-$as_echo "$ac_cv_path_FGREP" >&6; }
- FGREP="$ac_cv_path_FGREP"
-
-
-test -z "$GREP" && GREP=grep
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | ?:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if test "${lt_cv_path_LD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if test "${lt_cv_prog_gnu_ld+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
-$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
-if test "${lt_cv_path_NM+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  : ${lt_cv_path_NM=no}
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
-$as_echo "$lt_cv_path_NM" >&6; }
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
-else
-  # Didn't find any BSD compatible name lister, look for dumpbin.
-  if test -n "$DUMPBIN"; then :
-    # Let the user override the test.
-  else
-    if test -n "$ac_tool_prefix"; then
-  for ac_prog in dumpbin "link -dump"
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_DUMPBIN+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DUMPBIN"; then
-  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DUMPBIN=$ac_cv_prog_DUMPBIN
-if test -n "$DUMPBIN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
-$as_echo "$DUMPBIN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$DUMPBIN" && break
-  done
-fi
-if test -z "$DUMPBIN"; then
-  ac_ct_DUMPBIN=$DUMPBIN
-  for ac_prog in dumpbin "link -dump"
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DUMPBIN"; then
-  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
-if test -n "$ac_ct_DUMPBIN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
-$as_echo "$ac_ct_DUMPBIN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_DUMPBIN" && break
-done
-
-  if test "x$ac_ct_DUMPBIN" = x; then
-    DUMPBIN=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DUMPBIN=$ac_ct_DUMPBIN
-  fi
-fi
-
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
-    *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
-      ;;
-    *)
-      DUMPBIN=:
-      ;;
-    esac
-  fi
-
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
-  fi
-fi
-test -z "$NM" && NM=nm
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
-$as_echo_n "checking the name lister ($NM) interface... " >&6; }
-if test "${lt_cv_nm_interface+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_nm_interface="BSD nm"
-  echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
-  (eval "$ac_compile" 2>conftest.err)
-  cat conftest.err >&5
-  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
-  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
-  cat conftest.err >&5
-  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
-  cat conftest.out >&5
-  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
-    lt_cv_nm_interface="MS dumpbin"
-  fi
-  rm -f conftest*
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
-$as_echo "$lt_cv_nm_interface" >&6; }
-
-# find the maximum length of command line arguments
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
-$as_echo_n "checking the maximum length of command line arguments... " >&6; }
-if test "${lt_cv_sys_max_cmd_len+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-    i=0
-  teststring="ABCD"
-
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
-
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
-
-  cygwin* | mingw* | cegcc*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  mint*)
-    # On MiNT this can take a long time and run out of memory.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
-
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
-
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    else
-      # Make teststring a little bigger before we do anything with it.
-      # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
-        teststring=$teststring$teststring
-      done
-      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-      # If test is not a shell built-in, we'll probably end up computing a
-      # maximum length that is only half of the actual maximum length, but
-      # we can't tell.
-      while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \
-	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
-      do
-        i=`expr $i + 1`
-        teststring=$teststring$teststring
-      done
-      # Only check the string length outside the loop.
-      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
-      teststring=
-      # Add a significant safety factor because C++ compilers can tack on
-      # massive amounts of additional arguments before passing them to the
-      # linker.  It appears as though 1/2 is a usable value.
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    fi
-    ;;
-  esac
-
-fi
-
-if test -n $lt_cv_sys_max_cmd_len ; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
-$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
-$as_echo "none" >&6; }
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-
-
-
-
-
-
-: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
-$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
-$as_echo "$xsi_shell" >&6; }
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
-$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
-$as_echo "$lt_shell_append" >&6; }
-
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  lt_unset=unset
-else
-  lt_unset=false
-fi
-
-
-
-
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  lt_SP2NL='tr \040 \012'
-  lt_NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  lt_SP2NL='tr \100 \n'
-  lt_NL2SP='tr \r\n \100\100'
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
-$as_echo_n "checking for $LD option to reload object files... " >&6; }
-if test "${lt_cv_ld_reload_flag+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_reload_flag='-r'
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
-$as_echo "$lt_cv_ld_reload_flag" >&6; }
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
-set dummy ${ac_tool_prefix}objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OBJDUMP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OBJDUMP"; then
-  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OBJDUMP=$ac_cv_prog_OBJDUMP
-if test -n "$OBJDUMP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
-$as_echo "$OBJDUMP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OBJDUMP"; then
-  ac_ct_OBJDUMP=$OBJDUMP
-  # Extract the first word of "objdump", so it can be a program name with args.
-set dummy objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OBJDUMP"; then
-  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OBJDUMP="objdump"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
-if test -n "$ac_ct_OBJDUMP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
-$as_echo "$ac_ct_OBJDUMP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OBJDUMP" = x; then
-    OBJDUMP="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OBJDUMP=$ac_ct_OBJDUMP
-  fi
-else
-  OBJDUMP="$ac_cv_prog_OBJDUMP"
-fi
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
-$as_echo_n "checking how to recognize dependent libraries... " >&6; }
-if test "${lt_cv_deplibs_check_method+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[4-9]*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[45]*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump',
-  # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
-    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-    lt_cv_file_magic_cmd='func_win32_libid'
-  else
-    # Keep this pattern in sync with the one in func_win32_libid.
-    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
-    lt_cv_file_magic_cmd='$OBJDUMP -f'
-  fi
-  ;;
-
-cegcc*)
-  # use the weaker test based on 'objdump'. See mingw*.
-  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
-
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-freebsd* | dragonfly*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
-
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-haiku*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
-
-interix[3-9]*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
-  fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-*nto* | *qnx*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-rdos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-tpf*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
-$as_echo "$lt_cv_deplibs_check_method" >&6; }
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_AR+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$AR"; then
-  ac_cv_prog_AR="$AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_AR="${ac_tool_prefix}ar"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-AR=$ac_cv_prog_AR
-if test -n "$AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
-$as_echo "$AR" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_AR"; then
-  ac_ct_AR=$AR
-  # Extract the first word of "ar", so it can be a program name with args.
-set dummy ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_AR+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_AR"; then
-  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_AR="ar"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_AR=$ac_cv_prog_ac_ct_AR
-if test -n "$ac_ct_AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
-$as_echo "$ac_ct_AR" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_AR" = x; then
-    AR="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    AR=$ac_ct_AR
-  fi
-else
-  AR="$ac_cv_prog_AR"
-fi
-
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-
-
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-test -z "$STRIP" && STRIP=:
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_RANLIB+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
-  ac_ct_RANLIB=$RANLIB
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_RANLIB"; then
-  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_RANLIB="ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_RANLIB" = x; then
-    RANLIB=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    RANLIB=$ac_ct_RANLIB
-  fi
-else
-  RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-test -z "$RANLIB" && RANLIB=:
-
-
-
-
-
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
-fi
-
-case $host_os in
-  darwin*)
-    lock_old_archive_extraction=yes ;;
-  *)
-    lock_old_archive_extraction=no ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
-$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
-if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[BCDEGRST]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[BCDT]'
-  ;;
-cygwin* | mingw* | pw32* | cegcc*)
-  symcode='[ABCDGISTW]'
-  ;;
-hpux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[ABCDEGRST]'
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[BCDEGRST]'
-  ;;
-osf*)
-  symcode='[BCDEGQRST]'
-  ;;
-solaris*)
-  symcode='[BDRT]'
-  ;;
-sco3.2v5*)
-  symcode='[DT]'
-  ;;
-sysv4.2uw2*)
-  symcode='[DT]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[ABDT]'
-  ;;
-sysv4)
-  symcode='[DFNSTU]'
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[ABCDGIRSTW]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
-    # Also find C++ and __fastcall symbols from MSVC++,
-    # which start with @ or ?.
-    lt_cv_sys_global_symbol_pipe="$AWK '"\
-"     {last_section=section; section=\$ 3};"\
-"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-"     \$ 0!~/External *\|/{next};"\
-"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-"     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-"     ' prfx=^$ac_symprfx"
-  else
-    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-  fi
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
-  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
-	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<_LT_EOF > conftest.$ac_ext
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
-	  cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols.  */
-const struct {
-  const char *name;
-  void       *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[] =
-{
-  { "@PROGRAM@", (void *) 0 },
-_LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
-	  cat <<\_LT_EOF >> conftest.$ac_ext
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_save_LIBS="$LIBS"
-	  lt_save_CFLAGS="$CFLAGS"
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS="$lt_save_LIBS"
-	  CFLAGS="$lt_save_CFLAGS"
-	else
-	  echo "cannot find nm_test_func in $nlist" >&5
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&5
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
-    fi
-  else
-    echo "$progname: failed program was:" >&5
-    cat conftest.$ac_ext >&5
-  fi
-  rm -rf conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-
-fi
-
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
-$as_echo "failed" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
-$as_echo "ok" >&6; }
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Check whether --enable-libtool-lock was given.
-if test "${enable_libtool_lock+set}" = set; then :
-  enableval=$enable_libtool_lock;
-fi
-
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.$ac_objext` in
-      *ELF-32*)
-	HPUX_IA64_MODE="32"
-	;;
-      *ELF-64*)
-	HPUX_IA64_MODE="64"
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -melf32bsmip"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -melf32bmipn32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -melf64bmip"
-	;;
-      esac
-    else
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -32"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -n32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -64"
-	  ;;
-      esac
-    fi
-  fi
-  rm -rf conftest*
-  ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.o` in
-      *32-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_i386_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_i386"
-	    ;;
-	  ppc64-*linux*|powerpc64-*linux*)
-	    LD="${LD-ld} -m elf32ppclinux"
-	    ;;
-	  s390x-*linux*)
-	    LD="${LD-ld} -m elf_s390"
-	    ;;
-	  sparc64-*linux*)
-	    LD="${LD-ld} -m elf32_sparc"
-	    ;;
-	esac
-	;;
-      *64-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_x86_64_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_x86_64"
-	    ;;
-	  ppc*-*linux*|powerpc*-*linux*)
-	    LD="${LD-ld} -m elf64ppc"
-	    ;;
-	  s390*-*linux*|s390*-*tpf*)
-	    LD="${LD-ld} -m elf64_s390"
-	    ;;
-	  sparc*-*linux*)
-	    LD="${LD-ld} -m elf64_sparc"
-	    ;;
-	esac
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
-$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
-if test "${lt_cv_cc_needs_belf+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_cc_needs_belf=yes
-else
-  lt_cv_cc_needs_belf=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-     ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
-$as_echo "$lt_cv_cc_needs_belf" >&6; }
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-sparc*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
-      *)
-	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
-	  LD="${LD-ld} -64"
-	fi
-	;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-esac
-
-need_locks="$enable_libtool_lock"
-
-
-  case $host_os in
-    rhapsody* | darwin*)
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
-set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_DSYMUTIL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DSYMUTIL"; then
-  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DSYMUTIL=$ac_cv_prog_DSYMUTIL
-if test -n "$DSYMUTIL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
-$as_echo "$DSYMUTIL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_DSYMUTIL"; then
-  ac_ct_DSYMUTIL=$DSYMUTIL
-  # Extract the first word of "dsymutil", so it can be a program name with args.
-set dummy dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DSYMUTIL"; then
-  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
-if test -n "$ac_ct_DSYMUTIL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
-$as_echo "$ac_ct_DSYMUTIL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_DSYMUTIL" = x; then
-    DSYMUTIL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DSYMUTIL=$ac_ct_DSYMUTIL
-  fi
-else
-  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
-set dummy ${ac_tool_prefix}nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_NMEDIT+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$NMEDIT"; then
-  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-NMEDIT=$ac_cv_prog_NMEDIT
-if test -n "$NMEDIT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
-$as_echo "$NMEDIT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_NMEDIT"; then
-  ac_ct_NMEDIT=$NMEDIT
-  # Extract the first word of "nmedit", so it can be a program name with args.
-set dummy nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_NMEDIT"; then
-  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_NMEDIT="nmedit"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
-if test -n "$ac_ct_NMEDIT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
-$as_echo "$ac_ct_NMEDIT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_NMEDIT" = x; then
-    NMEDIT=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    NMEDIT=$ac_ct_NMEDIT
-  fi
-else
-  NMEDIT="$ac_cv_prog_NMEDIT"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
-set dummy ${ac_tool_prefix}lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_LIPO+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$LIPO"; then
-  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-LIPO=$ac_cv_prog_LIPO
-if test -n "$LIPO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
-$as_echo "$LIPO" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_LIPO"; then
-  ac_ct_LIPO=$LIPO
-  # Extract the first word of "lipo", so it can be a program name with args.
-set dummy lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_LIPO"; then
-  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_LIPO="lipo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
-if test -n "$ac_ct_LIPO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
-$as_echo "$ac_ct_LIPO" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_LIPO" = x; then
-    LIPO=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    LIPO=$ac_ct_LIPO
-  fi
-else
-  LIPO="$ac_cv_prog_LIPO"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OTOOL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OTOOL"; then
-  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL=$ac_cv_prog_OTOOL
-if test -n "$OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
-$as_echo "$OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL"; then
-  ac_ct_OTOOL=$OTOOL
-  # Extract the first word of "otool", so it can be a program name with args.
-set dummy otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OTOOL"; then
-  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OTOOL="otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
-if test -n "$ac_ct_OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
-$as_echo "$ac_ct_OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OTOOL" = x; then
-    OTOOL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OTOOL=$ac_ct_OTOOL
-  fi
-else
-  OTOOL="$ac_cv_prog_OTOOL"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OTOOL64+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OTOOL64"; then
-  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL64=$ac_cv_prog_OTOOL64
-if test -n "$OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
-$as_echo "$OTOOL64" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL64"; then
-  ac_ct_OTOOL64=$OTOOL64
-  # Extract the first word of "otool64", so it can be a program name with args.
-set dummy otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OTOOL64"; then
-  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OTOOL64="otool64"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
-if test -n "$ac_ct_OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
-$as_echo "$ac_ct_OTOOL64" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OTOOL64" = x; then
-    OTOOL64=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OTOOL64=$ac_ct_OTOOL64
-  fi
-else
-  OTOOL64="$ac_cv_prog_OTOOL64"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
-$as_echo_n "checking for -single_module linker flag... " >&6; }
-if test "${lt_cv_apple_cc_single_mod+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
-	# By default we will add the -single_module flag. You can override
-	# by either setting the environment variable LT_MULTI_MODULE
-	# non-empty at configure time, or by adding -multi_module to the
-	# link flags.
-	rm -rf libconftest.dylib*
-	echo "int foo(void){return 1;}" > conftest.c
-	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&5
-	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
-        _lt_result=$?
-	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
-	  lt_cv_apple_cc_single_mod=yes
-	else
-	  cat conftest.err >&5
-	fi
-	rm -rf libconftest.dylib*
-	rm -f conftest.*
-      fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
-$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
-$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
-if test "${lt_cv_ld_exported_symbols_list+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_exported_symbols_list=no
-      save_LDFLAGS=$LDFLAGS
-      echo "_main" > conftest.sym
-      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_ld_exported_symbols_list=yes
-else
-  lt_cv_ld_exported_symbols_list=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-	LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
-$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
-$as_echo_n "checking for -force_load linker flag... " >&6; }
-if test "${lt_cv_ld_force_load+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_force_load=no
-      cat > conftest.c << _LT_EOF
-int forced_loaded() { return 2;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
-      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
-      echo "$AR cru libconftest.a conftest.o" >&5
-      $AR cru libconftest.a conftest.o 2>&5
-      echo "$RANLIB libconftest.a" >&5
-      $RANLIB libconftest.a 2>&5
-      cat > conftest.c << _LT_EOF
-int main() { return 0;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
-      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
-      _lt_result=$?
-      if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then
-	lt_cv_ld_force_load=yes
-      else
-	cat conftest.err >&5
-      fi
-        rm -f conftest.err libconftest.a conftest conftest.c
-        rm -rf conftest.dSYM
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
-$as_echo "$lt_cv_ld_force_load" >&6; }
-    case $host_os in
-    rhapsody* | darwin1.[012])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-    darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-    darwin*) # darwin 5.x on
-      # if running on 10.5 or later, the deployment target defaults
-      # to the OS version, if on x86, and 10.4, the deployment
-      # target defaults to 10.4. Don't you love it?
-      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[012]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-      esac
-    ;;
-  esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-      _lt_dar_single_mod='$single_module'
-    fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-    else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
-      _lt_dsymutil='~$DSYMUTIL $lib || :'
-    else
-      _lt_dsymutil=
-    fi
-    ;;
-  esac
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-  if test "${ac_cv_prog_CPP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-      # Double quotes because CPP needs to be expanded
-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-  break
-fi
-
-    done
-    ac_cv_prog_CPP=$CPP
-
-fi
-  CPP=$ac_cv_prog_CPP
-else
-  ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details." "$LINENO" 5; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if test "${ac_cv_header_stdc+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_stdc=yes
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      return 2;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
-		  inttypes.h stdint.h unistd.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-eval as_val=\$$as_ac_Header
-   if test "x$as_val" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in dlfcn.h
-do :
-  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
-"
-if test "x$ac_cv_header_dlfcn_h" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DLFCN_H 1
-_ACEOF
-
-fi
-
-done
-
-
-
-
-
-# Set options
-
-
-
-        enable_dlopen=no
-
-
-  enable_win32_dll=no
-
-
-            # Check whether --enable-shared was given.
-if test "${enable_shared+set}" = set; then :
-  enableval=$enable_shared; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_shared=yes
-fi
-
-
-
-
-
-
-
-
-
-  # Check whether --enable-static was given.
-if test "${enable_static+set}" = set; then :
-  enableval=$enable_static; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_static=yes
-fi
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-pic was given.
-if test "${with_pic+set}" = set; then :
-  withval=$with_pic; pic_mode="$withval"
-else
-  pic_mode=default
-fi
-
-
-test -z "$pic_mode" && pic_mode=default
-
-
-
-
-
-
-
-  # Check whether --enable-fast-install was given.
-if test "${enable_fast_install+set}" = set; then :
-  enableval=$enable_fast_install; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_fast_install=yes
-fi
-
-
-
-
-
-
-
-
-
-
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-test -z "$LN_S" && LN_S="ln -s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
-$as_echo_n "checking for objdir... " >&6; }
-if test "${lt_cv_objdir+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
-$as_echo "$lt_cv_objdir" >&6; }
-objdir=$lt_cv_objdir
-
-
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define LT_OBJDIR "$lt_cv_objdir/"
-_ACEOF
-
-
-
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
-$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/${ac_tool_prefix}file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-
-
-
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
-$as_echo_n "checking for file... " >&6; }
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  else
-    MAGIC_CMD=:
-  fi
-fi
-
-  fi
-  ;;
-esac
-
-# Use C for the default configuration in the libtool script
-
-lt_save_CC="$CC"
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-objext=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-
-lt_prog_compiler_no_builtin_flag=
-
-if test "$GCC" = yes; then
-  case $cc_basename in
-  nvcc*)
-    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
-  *)
-    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
-  esac
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
-if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_rtti_exceptions=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="-fno-rtti -fno-exceptions"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_rtti_exceptions=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
-$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
-
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
-    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
-else
-    :
-fi
-
-fi
-
-
-
-
-
-
-  lt_prog_compiler_wl=
-lt_prog_compiler_pic=
-lt_prog_compiler_static=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-
-  if test "$GCC" = yes; then
-    lt_prog_compiler_wl='-Wl,'
-    lt_prog_compiler_static='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            lt_prog_compiler_pic='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic='-fno-common'
-      ;;
-
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      lt_prog_compiler_static=
-      ;;
-
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='-fPIC'
-	;;
-      esac
-      ;;
-
-    interix[3-9]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      lt_prog_compiler_can_build_shared=no
-      enable_shared=no
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic='-fPIC -shared'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic=-Kconform_pic
-      fi
-      ;;
-
-    *)
-      lt_prog_compiler_pic='-fPIC'
-      ;;
-    esac
-
-    case $cc_basename in
-    nvcc*) # Cuda Compiler Driver 2.2
-      lt_prog_compiler_wl='-Xlinker '
-      lt_prog_compiler_pic='-Xcompiler -fPIC'
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      lt_prog_compiler_wl='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      else
-	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC (with -KPIC) is the default.
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
-      case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
-      ecc*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-KPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      # icc used to be incompatible with GCC.
-      # ICC 10 doesn't accept -KPIC any more.
-      icc* | ifort*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      # Lahey Fortran 8.1.
-      lf95*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='--shared'
-	lt_prog_compiler_static='--static'
-	;;
-      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fpic'
-	lt_prog_compiler_static='-Bstatic'
-        ;;
-      ccc*)
-        lt_prog_compiler_wl='-Wl,'
-        # All Alpha code is PIC.
-        lt_prog_compiler_static='-non_shared'
-        ;;
-      xl* | bgxl* | bgf* | mpixl*)
-	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-qpic'
-	lt_prog_compiler_static='-qstaticlink'
-	;;
-      *)
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ F* | *Sun*Fortran*)
-	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl=''
-	  ;;
-	*Sun\ C*)
-	  # Sun C 5.9
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl='-Wl,'
-	  ;;
-	esac
-	;;
-      esac
-      ;;
-
-    newsos6)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic='-fPIC -shared'
-      ;;
-
-    osf3* | osf4* | osf5*)
-      lt_prog_compiler_wl='-Wl,'
-      # All OSF/1 code is PIC.
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    rdos*)
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    solaris*)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
-	lt_prog_compiler_wl='-Qoption ld ';;
-      *)
-	lt_prog_compiler_wl='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      lt_prog_compiler_wl='-Qoption ld '
-      lt_prog_compiler_pic='-PIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	lt_prog_compiler_pic='-Kconform_pic'
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    unicos*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_can_build_shared=no
-      ;;
-
-    uts4*)
-      lt_prog_compiler_pic='-pic'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    *)
-      lt_prog_compiler_can_build_shared=no
-      ;;
-    esac
-  fi
-
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic=
-    ;;
-  *)
-    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
-    ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5
-$as_echo "$lt_prog_compiler_pic" >&6; }
-
-
-
-
-
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
-if test "${lt_cv_prog_compiler_pic_works+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_pic_works=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_pic_works=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
-    case $lt_prog_compiler_pic in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
-     esac
-else
-    lt_prog_compiler_pic=
-     lt_prog_compiler_can_build_shared=no
-fi
-
-fi
-
-
-
-
-
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if test "${lt_cv_prog_compiler_static_works+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_static_works=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler_static_works=yes
-       fi
-     else
-       lt_cv_prog_compiler_static_works=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
-$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_static_works" = xyes; then
-    :
-else
-    lt_prog_compiler_static=
-fi
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-
-  runpath_var=
-  allow_undefined_flag=
-  always_export_symbols=no
-  archive_cmds=
-  archive_expsym_cmds=
-  compiler_needs_object=no
-  enable_shared_with_static_runtimes=no
-  export_dynamic_flag_spec=
-  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  hardcode_automatic=no
-  hardcode_direct=no
-  hardcode_direct_absolute=no
-  hardcode_libdir_flag_spec=
-  hardcode_libdir_flag_spec_ld=
-  hardcode_libdir_separator=
-  hardcode_minus_L=no
-  hardcode_shlibpath_var=unsupported
-  inherit_rpath=no
-  link_all_deplibs=unknown
-  module_cmds=
-  module_expsym_cmds=
-  old_archive_from_new_cmds=
-  old_archive_from_expsyms_cmds=
-  thread_safe_flag_spec=
-  whole_archive_flag_spec=
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  include_expsyms=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  # Exclude shared library initialization/finalization symbols.
-  extract_expsyms_cmds=
-
-  case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  esac
-
-  ld_shlibs=yes
-
-  # On some targets, GNU ld is compatible enough with the native linker
-  # that we're better off using the native interface for both.
-  lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
-    case $host_os in
-      aix*)
-	# The AIX port of GNU ld has always aspired to compatibility
-	# with the native linker.  However, as the warning in the GNU ld
-	# block says, versions before 2.19.5* couldn't really create working
-	# shared libraries, regardless of the interface used.
-	case `$LD -v 2>&1` in
-	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
-	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
-	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
-	  *)
-	    lt_use_gnu_ld_interface=yes
-	    ;;
-	esac
-	;;
-      *)
-	lt_use_gnu_ld_interface=yes
-	;;
-    esac
-  fi
-
-  if test "$lt_use_gnu_ld_interface" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-    export_dynamic_flag_spec='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      whole_archive_flag_spec=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>&1` in
-      *GNU\ gold*) supports_anon_versioning=yes ;;
-      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[3-9]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.19, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to install binutils
-*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
-*** You will then need to restart the configuration process.
-
-_LT_EOF
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds=''
-        ;;
-      m68k)
-            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_minus_L=yes
-        ;;
-      esac
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	allow_undefined_flag=unsupported
-	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
-      # as there is no search path for DLLs.
-      hardcode_libdir_flag_spec='-L$libdir'
-      export_dynamic_flag_spec='${wl}--export-all-symbols'
-      allow_undefined_flag=unsupported
-      always_export_symbols=no
-      enable_shared_with_static_runtimes=yes
-      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
-
-      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    haiku*)
-      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      link_all_deplibs=yes
-      ;;
-
-    interix[3-9]*)
-      hardcode_direct=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
-	case $cc_basename in
-	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
-	esac
-      fi
-      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
-      then
-	tmp_addflag=
-	tmp_sharedflag='-shared'
-	case $cc_basename,$host_cpu in
-        pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95* | pgfortran*)
-					# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	lf95*)				# Lahey Fortran 8.1
-	  whole_archive_flag_spec=
-	  tmp_sharedflag='--shared' ;;
-	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
-	  tmp_sharedflag='-qmkshrobj'
-	  tmp_addflag= ;;
-	nvcc*)	# Cuda Compiler Driver 2.2
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object=yes
-	  ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object=yes
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	esac
-	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-        if test "x$supports_anon_versioning" = xyes; then
-          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-        fi
-
-	case $cc_basename in
-	xlf* | bgf* | bgxlf* | mpixlf*)
-	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
-	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
-	  hardcode_libdir_flag_spec=
-	  hardcode_libdir_flag_spec_ld='-rpath $libdir'
-	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
-	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
-	  fi
-	  ;;
-	esac
-      else
-        ld_shlibs=no
-      fi
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  # For security reasons, it is highly recommended that you always
-	  # use absolute paths for naming shared libraries, and exclude the
-	  # DT_RUNPATH tag from executables and libraries.  But doing so
-	  # requires that you compile everything twice, which is a pain.
-	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  else
-	    ld_shlibs=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-    esac
-
-    if test "$ld_shlibs" = no; then
-      runpath_var=
-      hardcode_libdir_flag_spec=
-      export_dynamic_flag_spec=
-      whole_archive_flag_spec=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      allow_undefined_flag=unsupported
-      always_export_symbols=yes
-      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      hardcode_minus_L=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	hardcode_direct=unsupported
-      fi
-      ;;
-
-    aix[4-9]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
-	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	else
-	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
-	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-	    aix_use_runtimelinking=yes
-	    break
-	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      archive_cmds=''
-      hardcode_direct=yes
-      hardcode_direct_absolute=yes
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      file_list_spec='${wl}-f,'
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[012]|aix4.[012].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	  # We have reworked collect2
-	  :
-	  else
-	  # We have old collect2
-	  hardcode_direct=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  hardcode_minus_L=yes
-	  hardcode_libdir_flag_spec='-L$libdir'
-	  hardcode_libdir_separator=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      export_dynamic_flag_spec='${wl}-bexpall'
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      always_export_symbols=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	allow_undefined_flag='-berok'
-        # Determine the default libpath from the value encoded in an
-        # empty executable.
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-      else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
-	  allow_undefined_flag="-z nodefs"
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an
-	 # empty executable.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag=' ${wl}-bernotok'
-	  allow_undefined_flag=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
-	    # We only use this code for GNU lds that support --whole-archive.
-	    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	  else
-	    # Exported symbols can be pulled into shared objects from archives
-	    whole_archive_flag_spec='$convenience'
-	  fi
-	  archive_cmds_need_lc=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds=''
-        ;;
-      m68k)
-            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_minus_L=yes
-        ;;
-      esac
-      ;;
-
-    bsdi[45]*)
-      export_dynamic_flag_spec=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      hardcode_libdir_flag_spec=' '
-      allow_undefined_flag=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      old_archive_from_new_cmds='true'
-      # FIXME: Should let the user specify the lib program.
-      old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
-      fix_srcfile_path='`cygpath -w "$srcfile"`'
-      enable_shared_with_static_runtimes=yes
-      ;;
-
-    darwin* | rhapsody*)
-
-
-  archive_cmds_need_lc=no
-  hardcode_direct=no
-  hardcode_automatic=yes
-  hardcode_shlibpath_var=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-  else
-    whole_archive_flag_spec=''
-  fi
-  link_all_deplibs=yes
-  allow_undefined_flag="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=func_echo_all
-    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-
-  else
-  ld_shlibs=no
-  fi
-
-      ;;
-
-    dgux*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
-
-    freebsd1*)
-      ld_shlibs=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_direct=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      hardcode_minus_L=yes
-      export_dynamic_flag_spec='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_flag_spec_ld='+b $libdir'
-	hardcode_libdir_separator=:
-	hardcode_direct=yes
-	hardcode_direct_absolute=yes
-	export_dynamic_flag_spec='${wl}-E'
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	hardcode_minus_L=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-
-	  # Older versions of the 11.00 compiler do not understand -b yet
-	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
-$as_echo_n "checking if $CC understands -b... " >&6; }
-if test "${lt_cv_prog_compiler__b+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler__b=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS -b"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler__b=yes
-       fi
-     else
-       lt_cv_prog_compiler__b=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
-$as_echo "$lt_cv_prog_compiler__b" >&6; }
-
-if test x"$lt_cv_prog_compiler__b" = xyes; then
-    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-else
-    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-fi
-
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  hardcode_direct=no
-	  hardcode_shlibpath_var=no
-	  ;;
-	*)
-	  hardcode_direct=yes
-	  hardcode_direct_absolute=yes
-	  export_dynamic_flag_spec='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  hardcode_minus_L=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	# Try to use the -exported_symbol ld option, if it does not
-	# work, assume that -exports_file does not work either and
-	# implicitly export all symbols.
-        save_LDFLAGS="$LDFLAGS"
-        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-int foo(void) {}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-        LDFLAGS="$save_LDFLAGS"
-      else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      inherit_rpath=yes
-      link_all_deplibs=yes
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    newsos6)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_shlibpath_var=no
-      ;;
-
-    *nto* | *qnx*)
-      ;;
-
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	hardcode_direct=yes
-	hardcode_shlibpath_var=no
-	hardcode_direct_absolute=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	  export_dynamic_flag_spec='${wl}-E'
-	else
-	  case $host_os in
-	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     hardcode_libdir_flag_spec='-R$libdir'
-	     ;;
-	   *)
-	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-	fi
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    os2*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_minus_L=yes
-      allow_undefined_flag=unsupported
-      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	hardcode_libdir_flag_spec='-rpath $libdir'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_separator=:
-      ;;
-
-    solaris*)
-      no_undefined_flag=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-      else
-	case `$CC -V 2>&1` in
-	*"Compilers 5.0"*)
-	  wlarc=''
-	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
-	  ;;
-	*)
-	  wlarc='${wl}'
-	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-	  ;;
-	esac
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_shlibpath_var=no
-      case $host_os in
-      solaris2.[0-5] | solaris2.[0-5].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
-	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      link_all_deplibs=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  reload_cmds='$CC -r -o $output$reload_objs'
-	  hardcode_direct=no
-        ;;
-	motorola)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      hardcode_shlibpath_var=no
-      ;;
-
-    sysv4.3*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_shlibpath_var=no
-      export_dynamic_flag_spec='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	hardcode_shlibpath_var=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	ld_shlibs=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag='${wl}-z,text'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      no_undefined_flag='${wl}-z,text'
-      allow_undefined_flag='${wl}-z,nodefs'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-R,$libdir'
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      export_dynamic_flag_spec='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
-
-    *)
-      ld_shlibs=no
-      ;;
-    esac
-
-    if test x$host_vendor = xsni; then
-      case $host in
-      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	export_dynamic_flag_spec='${wl}-Blargedynsym'
-	;;
-      esac
-    fi
-  fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
-$as_echo "$ld_shlibs" >&6; }
-test "$ld_shlibs" = no && can_build_shared=no
-
-with_gnu_ld=$with_gnu_ld
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-if test "${lt_cv_archive_cmds_need_lc+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  $RM conftest*
-	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } 2>conftest.err; then
-	  soname=conftest
-	  lib=conftest
-	  libobjs=conftest.$ac_objext
-	  deplibs=
-	  wl=$lt_prog_compiler_wl
-	  pic_flag=$lt_prog_compiler_pic
-	  compiler_flags=-v
-	  linker_flags=-v
-	  verstring=
-	  output_objdir=.
-	  libname=conftest
-	  lt_save_allow_undefined_flag=$allow_undefined_flag
-	  allow_undefined_flag=
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
-  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-	  then
-	    lt_cv_archive_cmds_need_lc=no
-	  else
-	    lt_cv_archive_cmds_need_lc=yes
-	  fi
-	  allow_undefined_flag=$lt_save_allow_undefined_flag
-	else
-	  cat conftest.err 1>&5
-	fi
-	$RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
-$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
-      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
-
-if test "$GCC" = yes; then
-  case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
-  esac
-  case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
-  esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
-  case $lt_search_path_spec in
-  *\;*)
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
-    ;;
-  *)
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
-    ;;
-  esac
-  # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
-  lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
-  for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
-      test -d "$lt_sys_path" && \
-	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
-    fi
-  done
-  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
-  for (lt_i = NF; lt_i > 0; lt_i--) {
-    if ($lt_i != "" && $lt_i != ".") {
-      if ($lt_i == "..") {
-        lt_count++;
-      } else {
-        if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
-        } else {
-          lt_count--;
-        }
-      }
-    }
-  }
-  if (lt_foo != "") { lt_freq[lt_foo]++; }
-  if (lt_freq[lt_foo] == 1) { print lt_foo; }
-}'`
-  # AWK program above erroneously prepends '/' to C:/dos/paths
-  # for these hosts.
-  case $host_os in
-    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
-  esac
-  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[4-9]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[45]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-
-      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
-
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-
-  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd1*)
-  dynamic_linker=no
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[123]*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
-
-haiku*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
-  postinstall_cmds='chmod 555 $lib'
-  # or fails outright, so override atomically:
-  install_override_mode=555
-  ;;
-
-interix[3-9]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-
-  # Some binutils ld are patched to set DT_RUNPATH
-  if test "${lt_cv_shlibpath_overrides_runpath+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_shlibpath_overrides_runpath=no
-    save_LDFLAGS=$LDFLAGS
-    save_libdir=$libdir
-    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
-	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
-  lt_cv_shlibpath_overrides_runpath=yes
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-    LDFLAGS=$save_LDFLAGS
-    libdir=$save_libdir
-
-fi
-
-  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
-hardcode_action=
-if test -n "$hardcode_libdir_flag_spec" ||
-   test -n "$runpath_var" ||
-   test "X$hardcode_automatic" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$hardcode_direct" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
-     test "$hardcode_minus_L" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action=unsupported
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
-$as_echo "$hardcode_action" >&6; }
-
-if test "$hardcode_action" = relink ||
-   test "$inherit_rpath" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-
-
-
-
-
-
-  if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-    ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-    ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-
-fi
-
-    ;;
-
-  *)
-    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
-if test "x$ac_cv_func_shl_load" = x""yes; then :
-  lt_cv_dlopen="shl_load"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
-$as_echo_n "checking for shl_load in -ldld... " >&6; }
-if test "${ac_cv_lib_dld_shl_load+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char shl_load ();
-int
-main ()
-{
-return shl_load ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dld_shl_load=yes
-else
-  ac_cv_lib_dld_shl_load=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
-$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
-if test "x$ac_cv_lib_dld_shl_load" = x""yes; then :
-  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
-else
-  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
-if test "x$ac_cv_func_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
-$as_echo_n "checking for dlopen in -lsvld... " >&6; }
-if test "${ac_cv_lib_svld_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsvld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_svld_dlopen=yes
-else
-  ac_cv_lib_svld_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
-$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
-if test "x$ac_cv_lib_svld_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
-$as_echo_n "checking for dld_link in -ldld... " >&6; }
-if test "${ac_cv_lib_dld_dld_link+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dld_link ();
-int
-main ()
-{
-return dld_link ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dld_dld_link=yes
-else
-  ac_cv_lib_dld_dld_link=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
-$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
-if test "x$ac_cv_lib_dld_dld_link" = x""yes; then :
-  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-    ;;
-  esac
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
-$as_echo_n "checking whether a program can dlopen itself... " >&6; }
-if test "${lt_cv_dlopen_self+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
-   correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-void fnord () __attribute__((visibility("default")));
-#endif
-
-void fnord () { int i=42; }
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else
-        {
-	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
-          else puts (dlerror ());
-	}
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}
-_LT_EOF
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self=no
-  fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
-$as_echo "$lt_cv_dlopen_self" >&6; }
-
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
-$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
-if test "${lt_cv_dlopen_self_static+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self_static=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
-   correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-void fnord () __attribute__((visibility("default")));
-#endif
-
-void fnord () { int i=42; }
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else
-        {
-	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
-          else puts (dlerror ());
-	}
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}
-_LT_EOF
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self_static=no
-  fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
-$as_echo "$lt_cv_dlopen_self_static" >&6; }
-    fi
-
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
-
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-striplib=
-old_striplib=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
-$as_echo_n "checking whether stripping libraries is possible... " >&6; }
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-  darwin*)
-    if test -n "$STRIP" ; then
-      striplib="$STRIP -x"
-      old_striplib="$STRIP -S"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-    else
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    fi
-    ;;
-  *)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    ;;
-  esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-  # Report which library types will actually be built
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
-$as_echo_n "checking if libtool supports shared libraries... " >&6; }
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
-$as_echo "$can_build_shared" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
-$as_echo_n "checking whether to build shared libraries... " >&6; }
-  test "$can_build_shared" = "no" && enable_shared=no
-
-  # On AIX, shared libraries and static libraries use the same namespace, and
-  # are all built from PIC.
-  case $host_os in
-  aix3*)
-    test "$enable_shared" = yes && enable_static=no
-    if test -n "$RANLIB"; then
-      archive_cmds="$archive_cmds~\$RANLIB \$lib"
-      postinstall_cmds='$RANLIB $lib'
-    fi
-    ;;
-
-  aix[4-9]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
-    fi
-    ;;
-  esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
-$as_echo "$enable_shared" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
-$as_echo_n "checking whether to build static libraries... " >&6; }
-  # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
-$as_echo "$enable_static" >&6; }
-
-
-
-
-fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-CC="$lt_save_CC"
-
-
-
-
-
-
-
-
-
-
-
-
-
-        ac_config_commands="$ac_config_commands libtool"
-
-
-
-
-# Only expand once:
-
-
-# Extract the first word of "texi2dvi", so it can be a program name with args.
-set dummy texi2dvi; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_TEXI2DVI+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$TEXI2DVI"; then
-  ac_cv_prog_TEXI2DVI="$TEXI2DVI" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_TEXI2DVI="texi2dvi"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-TEXI2DVI=$ac_cv_prog_TEXI2DVI
-if test -n "$TEXI2DVI"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEXI2DVI" >&5
-$as_echo "$TEXI2DVI" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- if test -n "$TEXI2DVI"; then
-  HAVE_TEXI2DVI_TRUE=
-  HAVE_TEXI2DVI_FALSE='#'
-else
-  HAVE_TEXI2DVI_TRUE='#'
-  HAVE_TEXI2DVI_FALSE=
-fi
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler vendor" >&5
-$as_echo_n "checking for C compiler vendor... " >&6; }
-if test "${ax_cv_c_compiler_vendor+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ax_cv_c_compiler_vendor=unknown
-  # note: don't check for gcc first since some other compilers define __GNUC__
-  for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale:__PATHCC__,__PATHSCALE__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do
-    vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")"
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-#if !($vencpp)
-      thisisanerror;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_c_compiler_vendor=`echo $ventest | cut -d: -f1`; break
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  done
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_vendor" >&5
-$as_echo "$ax_cv_c_compiler_vendor" >&6; }
-
-
-
-
-
-
-# Check whether --enable-portable-binary was given.
-if test "${enable_portable_binary+set}" = set; then :
-  enableval=$enable_portable_binary; acx_maxopt_portable=$withval
-else
-  acx_maxopt_portable=no
-fi
-
-
-# Try to determine "good" native compiler flags if none specified via CFLAGS
-if test "$ac_test_CFLAGS" != "set"; then
-  CFLAGS=""
-  case $ax_cv_c_compiler_vendor in
-    dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host"
-	 if test "x$acx_maxopt_portable" = xno; then
-           CFLAGS="$CFLAGS -arch host"
-         fi;;
-
-    sun) CFLAGS="-native -fast -xO5 -dalign"
-	 if test "x$acx_maxopt_portable" = xyes; then
-	   CFLAGS="$CFLAGS -xarch=generic"
-         fi;;
-
-    hp)  CFLAGS="+Oall +Optrs_ansi +DSnative"
-	 if test "x$acx_maxopt_portable" = xyes; then
-	   CFLAGS="$CFLAGS +DAportable"
-	 fi;;
-
-    ibm) if test "x$acx_maxopt_portable" = xno; then
-           xlc_opt="-qarch=auto -qtune=auto"
-	 else
-           xlc_opt="-qtune=auto"
-	 fi
-          { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $xlc_opt" >&5
-$as_echo_n "checking whether C compiler accepts $xlc_opt... " >&6; }
-ax_save_FLAGS=$CFLAGS
-   CFLAGS="$xlc_opt"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval `$as_echo "ax_cv_c_flags_$xlc_opt" | $as_tr_sh`=yes
-else
-  eval `$as_echo "ax_cv_c_flags_$xlc_opt" | $as_tr_sh`=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   CFLAGS=$ax_save_FLAGS
-eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$xlc_opt" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	CFLAGS="-O3 -qansialias -w $xlc_opt"
-else
-	CFLAGS="-O3 -qansialias -w"
-                echo "******************************************************"
-                echo "*  You seem to have the IBM  C compiler.  It is      *"
-                echo "*  recommended for best performance that you use:    *"
-                echo "*                                                    *"
-                echo "*    CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *"
-                echo "*                      ^^^        ^^^                *"
-                echo "*  where xxx is pwr2, pwr3, 604, or whatever kind of *"
-                echo "*  CPU you have.  (Set the CFLAGS environment var.   *"
-                echo "*  and re-run configure.)  For more info, man cc.    *"
-                echo "******************************************************"
-fi
-
-         ;;
-
-    intel) CFLAGS="-O3 -ansi_alias"
-	if test "x$acx_maxopt_portable" = xno; then
-	  icc_archflag=unknown
-	  icc_flags=""
-	  case $host_cpu in
-	    i686*|x86_64*)
-              # icc accepts gcc assembly syntax, so these should work:
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0 output" >&5
-$as_echo_n "checking for x86 cpuid 0 output... " >&6; }
-if test "${ax_cv_gcc_x86_cpuid_0+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ax_cv_gcc_x86_cpuid_0=unknown
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-
-     int op = 0, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ax_cv_gcc_x86_cpuid_0=`cat conftest_cpuid`; rm -f conftest_cpuid
-else
-  ax_cv_gcc_x86_cpuid_0=unknown; rm -f conftest_cpuid
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0" >&5
-$as_echo "$ax_cv_gcc_x86_cpuid_0" >&6; }
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 1 output" >&5
-$as_echo_n "checking for x86 cpuid 1 output... " >&6; }
-if test "${ax_cv_gcc_x86_cpuid_1+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ax_cv_gcc_x86_cpuid_1=unknown
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-
-     int op = 1, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ax_cv_gcc_x86_cpuid_1=`cat conftest_cpuid`; rm -f conftest_cpuid
-else
-  ax_cv_gcc_x86_cpuid_1=unknown; rm -f conftest_cpuid
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_1" >&5
-$as_echo "$ax_cv_gcc_x86_cpuid_1" >&6; }
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-	      case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG
-                *:756e6547:*:*) # Intel
-                  case $ax_cv_gcc_x86_cpuid_1 in
-                    *6a?:*[234]:*:*|*6[789b]?:*:*:*) icc_flags="-xK";;
-                    *f3[347]:*:*:*|*f41347:*:*:*) icc_flags="-xP -xN -xW -xK";;
-                    *f??:*:*:*) icc_flags="-xN -xW -xK";;
-                  esac ;;
-              esac ;;
-          esac
-          if test "x$icc_flags" != x; then
-            for flag in $icc_flags; do
-               { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
-$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
-ax_save_FLAGS=$CFLAGS
-   CFLAGS="$flag"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=yes
-else
-  eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   CFLAGS=$ax_save_FLAGS
-eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	icc_archflag=$flag; break
-else
-	:
-fi
-
-            done
-          fi
-          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for icc architecture flag" >&5
-$as_echo_n "checking for icc architecture flag... " >&6; }
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $icc_archflag" >&5
-$as_echo "$icc_archflag" >&6; }
-          if test "x$icc_archflag" != xunknown; then
-            CFLAGS="$CFLAGS $icc_archflag"
-          fi
-        fi
-	;;
-
-    gnu)
-     # default optimization flags for gcc on all systems
-     CFLAGS="-O3 -fomit-frame-pointer"
-
-     # -malign-double for x86 systems
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -malign-double" >&5
-$as_echo_n "checking whether C compiler accepts -malign-double... " >&6; }
-if test "${ax_cv_c_flags__malign_double+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      ax_save_FLAGS=$CFLAGS
-      CFLAGS="-malign-double"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_c_flags__malign_double=yes
-else
-  ax_cv_c_flags__malign_double=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-      CFLAGS=$ax_save_FLAGS
-fi
-
-eval ax_check_compiler_flags=$ax_cv_c_flags__malign_double
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	CFLAGS="$CFLAGS -malign-double"
-else
-	:
-fi
-
-
-     #  -fstrict-aliasing for gcc-2.95+
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fstrict-aliasing" >&5
-$as_echo_n "checking whether C compiler accepts -fstrict-aliasing... " >&6; }
-if test "${ax_cv_c_flags__fstrict_aliasing+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      ax_save_FLAGS=$CFLAGS
-      CFLAGS="-fstrict-aliasing"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_c_flags__fstrict_aliasing=yes
-else
-  ax_cv_c_flags__fstrict_aliasing=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-      CFLAGS=$ax_save_FLAGS
-fi
-
-eval ax_check_compiler_flags=$ax_cv_c_flags__fstrict_aliasing
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	CFLAGS="$CFLAGS -fstrict-aliasing"
-else
-	:
-fi
-
-
-     # note that we enable "unsafe" fp optimization with other compilers, too
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -ffast-math" >&5
-$as_echo_n "checking whether C compiler accepts -ffast-math... " >&6; }
-if test "${ax_cv_c_flags__ffast_math+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      ax_save_FLAGS=$CFLAGS
-      CFLAGS="-ffast-math"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_c_flags__ffast_math=yes
-else
-  ax_cv_c_flags__ffast_math=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-      CFLAGS=$ax_save_FLAGS
-fi
-
-eval ax_check_compiler_flags=$ax_cv_c_flags__ffast_math
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	CFLAGS="$CFLAGS -ffast-math"
-else
-	:
-fi
-
-
-
-
-
-
-# Check whether --with-gcc-arch was given.
-if test "${with_gcc_arch+set}" = set; then :
-  withval=$with_gcc_arch; ax_gcc_arch=$withval
-else
-  ax_gcc_arch=yes
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc architecture flag" >&5
-$as_echo_n "checking for gcc architecture flag... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
-$as_echo "" >&6; }
-if test "${ax_cv_gcc_archflag+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-ax_cv_gcc_archflag="unknown"
-
-if test "$GCC" = yes; then
-
-if test "x$ax_gcc_arch" = xyes; then
-ax_gcc_arch=""
-if test "$cross_compiling" = no; then
-case $host_cpu in
-  i[3456]86*|x86_64*) # use cpuid codes, in part from x86info-1.7 by D. Jones
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0 output" >&5
-$as_echo_n "checking for x86 cpuid 0 output... " >&6; }
-if test "${ax_cv_gcc_x86_cpuid_0+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ax_cv_gcc_x86_cpuid_0=unknown
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-
-     int op = 0, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ax_cv_gcc_x86_cpuid_0=`cat conftest_cpuid`; rm -f conftest_cpuid
-else
-  ax_cv_gcc_x86_cpuid_0=unknown; rm -f conftest_cpuid
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0" >&5
-$as_echo "$ax_cv_gcc_x86_cpuid_0" >&6; }
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 1 output" >&5
-$as_echo_n "checking for x86 cpuid 1 output... " >&6; }
-if test "${ax_cv_gcc_x86_cpuid_1+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ax_cv_gcc_x86_cpuid_1=unknown
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-
-     int op = 1, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ax_cv_gcc_x86_cpuid_1=`cat conftest_cpuid`; rm -f conftest_cpuid
-else
-  ax_cv_gcc_x86_cpuid_1=unknown; rm -f conftest_cpuid
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_1" >&5
-$as_echo "$ax_cv_gcc_x86_cpuid_1" >&6; }
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-     case $ax_cv_gcc_x86_cpuid_0 in
-       *:756e6547:*:*) # Intel
-          case $ax_cv_gcc_x86_cpuid_1 in
-	    *5[48]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;;
-	    *5??:*:*:*) ax_gcc_arch=pentium ;;
-	    *6[3456]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
-	    *6a?:*[01]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
-	    *6a?:*[234]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
-	    *6[9d]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;;
-	    *6[78b]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
-	    *6??:*:*:*) ax_gcc_arch=pentiumpro ;;
-            *f3[347]:*:*:*|*f41347:*:*:*)
-		case $host_cpu in
-                  x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;;
-                  *) ax_gcc_arch="prescott pentium4 pentiumpro" ;;
-                esac ;;
-            *f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";;
-          esac ;;
-       *:68747541:*:*) # AMD
-          case $ax_cv_gcc_x86_cpuid_1 in
-	    *5[67]?:*:*:*) ax_gcc_arch=k6 ;;
-	    *5[8d]?:*:*:*) ax_gcc_arch="k6-2 k6" ;;
-	    *5[9]?:*:*:*) ax_gcc_arch="k6-3 k6" ;;
-	    *60?:*:*:*) ax_gcc_arch=k7 ;;
-	    *6[12]?:*:*:*) ax_gcc_arch="athlon k7" ;;
-	    *6[34]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;;
-	    *67?:*:*:*) ax_gcc_arch="athlon-4 athlon k7" ;;
-	    *6[68a]?:*:*:*)
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0x80000006 output" >&5
-$as_echo_n "checking for x86 cpuid 0x80000006 output... " >&6; }
-if test "${ax_cv_gcc_x86_cpuid_0x80000006+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ax_cv_gcc_x86_cpuid_0x80000006=unknown
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-
-     int op = 0x80000006, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ax_cv_gcc_x86_cpuid_0x80000006=`cat conftest_cpuid`; rm -f conftest_cpuid
-else
-  ax_cv_gcc_x86_cpuid_0x80000006=unknown; rm -f conftest_cpuid
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0x80000006" >&5
-$as_echo "$ax_cv_gcc_x86_cpuid_0x80000006" >&6; }
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
- # L2 cache size
-	       case $ax_cv_gcc_x86_cpuid_0x80000006 in
-                 *:*:*[1-9a-f]??????:*) # (L2 = ecx >> 16) >= 256
-			ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;;
-                 *) ax_gcc_arch="athlon-4 athlon k7" ;;
-	       esac ;;
-	    *f[4cef8b]?:*:*:*) ax_gcc_arch="athlon64 k8" ;;
-	    *f5?:*:*:*) ax_gcc_arch="opteron k8" ;;
-	    *f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;;
-	    *f??:*:*:*) ax_gcc_arch="k8" ;;
-          esac ;;
-	*:746e6543:*:*) # IDT
-	   case $ax_cv_gcc_x86_cpuid_1 in
-	     *54?:*:*:*) ax_gcc_arch=winchip-c6 ;;
-	     *58?:*:*:*) ax_gcc_arch=winchip2 ;;
-	     *6[78]?:*:*:*) ax_gcc_arch=c3 ;;
-	     *69?:*:*:*) ax_gcc_arch="c3-2 c3" ;;
-	   esac ;;
-     esac
-     if test x"$ax_gcc_arch" = x; then # fallback
-	case $host_cpu in
-	  i586*) ax_gcc_arch=pentium ;;
-	  i686*) ax_gcc_arch=pentiumpro ;;
-        esac
-     fi
-     ;;
-
-  sparc*)
-     # Extract the first word of "prtdiag", so it can be a program name with args.
-set dummy prtdiag; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_PRTDIAG+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $PRTDIAG in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_PRTDIAG="$PRTDIAG" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_dummy="$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/"
-for as_dir in $as_dummy
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_path_PRTDIAG="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-  test -z "$ac_cv_path_PRTDIAG" && ac_cv_path_PRTDIAG="prtdiag"
-  ;;
-esac
-fi
-PRTDIAG=$ac_cv_path_PRTDIAG
-if test -n "$PRTDIAG"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PRTDIAG" >&5
-$as_echo "$PRTDIAG" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-     cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null`
-     cputype=`echo "$cputype" | tr -d ' -' |tr $as_cr_LETTERS $as_cr_letters`
-     case $cputype in
-         *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;;
-         *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;;
-         *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;;
-         *supersparc*|*tms390z5[05]*) ax_gcc_arch="supersparc v8" ;;
-         *hypersparc*|*rt62[056]*) ax_gcc_arch="hypersparc v8" ;;
-         *cypress*) ax_gcc_arch=cypress ;;
-     esac ;;
-
-  alphaev5) ax_gcc_arch=ev5 ;;
-  alphaev56) ax_gcc_arch=ev56 ;;
-  alphapca56) ax_gcc_arch="pca56 ev56" ;;
-  alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;;
-  alphaev6) ax_gcc_arch=ev6 ;;
-  alphaev67) ax_gcc_arch=ev67 ;;
-  alphaev68) ax_gcc_arch="ev68 ev67" ;;
-  alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;;
-  alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;;
-  alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;;
-
-  powerpc*)
-     cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null`
-     cputype=`echo $cputype | sed -e 's/ppc//g;s/ *//g'`
-     case $cputype in
-       *750*) ax_gcc_arch="750 G3" ;;
-       *740[0-9]*) ax_gcc_arch="$cputype 7400 G4" ;;
-       *74[4-5][0-9]*) ax_gcc_arch="$cputype 7450 G4" ;;
-       *74[0-9][0-9]*) ax_gcc_arch="$cputype G4" ;;
-       *970*) ax_gcc_arch="970 G5 power4";;
-       *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";;
-       *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";;
-       603ev|8240) ax_gcc_arch="$cputype 603e 603";;
-       *) ax_gcc_arch=$cputype ;;
-     esac
-     ax_gcc_arch="$ax_gcc_arch powerpc"
-     ;;
-esac
-fi # not cross-compiling
-fi # guess arch
-
-if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then
-for arch in $ax_gcc_arch; do
-  if test "x$acx_maxopt_portable" = xyes; then # if we require portable code
-    flags="-mtune=$arch"
-    # -mcpu=$arch and m$arch generate nonportable code on every arch except
-    # x86.  And some other arches (e.g. Alpha) don't accept -mtune.  Grrr.
-    case $host_cpu in i*86|x86_64*) flags="$flags -mcpu=$arch -m$arch";; esac
-  else
-    flags="-march=$arch -mcpu=$arch -m$arch"
-  fi
-  for flag in $flags; do
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
-$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
-ax_save_FLAGS=$CFLAGS
-   CFLAGS="$flag"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=yes
-else
-  eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   CFLAGS=$ax_save_FLAGS
-eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	ax_cv_gcc_archflag=$flag; break
-else
-	:
-fi
-
-  done
-  test "x$ax_cv_gcc_archflag" = xunknown || break
-done
-fi
-
-fi # $GCC=yes
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc architecture flag" >&5
-$as_echo_n "checking for gcc architecture flag... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_archflag" >&5
-$as_echo "$ax_cv_gcc_archflag" >&6; }
-if test "x$ax_cv_gcc_archflag" = xunknown; then
-  :
-else
-  CFLAGS="$CFLAGS $ax_cv_gcc_archflag"
-fi
-
-     ;;
-  esac
-
-  if test -z "$CFLAGS"; then
-	echo ""
-	echo "********************************************************"
-        echo "* WARNING: Don't know the best CFLAGS for this system  *"
-        echo "* Use ./configure CFLAGS=... to specify your own flags *"
-	echo "* (otherwise, a default of CFLAGS=-O3 will be used)    *"
-	echo "********************************************************"
-	echo ""
-        CFLAGS="-O3"
-  fi
-
-   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CFLAGS" >&5
-$as_echo_n "checking whether C compiler accepts $CFLAGS... " >&6; }
-ax_save_FLAGS=$CFLAGS
-   CFLAGS="$CFLAGS"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval `$as_echo "ax_cv_c_flags_$CFLAGS" | $as_tr_sh`=yes
-else
-  eval `$as_echo "ax_cv_c_flags_$CFLAGS" | $as_tr_sh`=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   CFLAGS=$ax_save_FLAGS
-eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$CFLAGS" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	:
-else
-
-	echo ""
-        echo "********************************************************"
-        echo "* WARNING: The guessed CFLAGS don't seem to work with  *"
-        echo "* your compiler.                                       *"
-        echo "* Use ./configure CFLAGS=... to specify your own flags *"
-        echo "********************************************************"
-        echo ""
-        CFLAGS=""
-
-fi
-
-
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS_WARN for maximum warnings" >&5
-$as_echo_n "checking CFLAGS_WARN for maximum warnings... " >&6; }
-if test "${ac_cv_cflags_warn_all+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_cflags_warn_all="no, unknown"
-
- ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
- ac_save_CFLAGS="$CFLAGS"
-for ac_arg in "-pedantic  % -Wall"          "-xstrconst % -v"             "-std1      % -verbose -w0 -warnprotos"    "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd"    "-ansi -ansiE % -fullwarn"    "+ESlit     % +w1"            "-Xc        % -pvctl,fullmsg"    "-h conform % -h msglevel 2"    #
-do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_cflags_warn_all=`echo $ac_arg | sed -e 's,.*% *,,'` ; break
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-done
- CFLAGS="$ac_save_CFLAGS"
- ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags_warn_all" >&5
-$as_echo "$ac_cv_cflags_warn_all" >&6; }
-case ".$ac_cv_cflags_warn_all" in
-     .ok|.ok,*)  ;;
-   .|.no|.no,*)
- ;;
-   *)
-   if echo " $CFLAGS_WARN " | grep " $ac_cv_cflags_warn_all " 2>&1 >/dev/null
-   then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS_WARN does contain \$ac_cv_cflags_warn_all"; } >&5
-  (: CFLAGS_WARN does contain $ac_cv_cflags_warn_all) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-   else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS_WARN=\"\$CFLAGS_WARN \$ac_cv_cflags_warn_all\""; } >&5
-  (: CFLAGS_WARN="$CFLAGS_WARN $ac_cv_cflags_warn_all") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-                      CFLAGS_WARN="$CFLAGS_WARN $ac_cv_cflags_warn_all"
-   fi
- ;;
-esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
-$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
-if test "${ac_cv_c_const+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-/* FIXME: Include the comments suggested by Paul. */
-#ifndef __cplusplus
-  /* Ultrix mips cc rejects this.  */
-  typedef int charset[2];
-  const charset cs;
-  /* SunOS 4.1.1 cc rejects this.  */
-  char const *const *pcpcc;
-  char **ppc;
-  /* NEC SVR4.0.2 mips cc rejects this.  */
-  struct point {int x, y;};
-  static struct point const zero = {0,0};
-  /* AIX XL C 1.02.0.0 rejects this.
-     It does not let you subtract one const X* pointer from another in
-     an arm of an if-expression whose if-part is not a constant
-     expression */
-  const char *g = "string";
-  pcpcc = &g + (g ? g-g : 0);
-  /* HPUX 7.0 cc rejects these. */
-  ++pcpcc;
-  ppc = (char**) pcpcc;
-  pcpcc = (char const *const *) ppc;
-  { /* SCO 3.2v4 cc rejects this.  */
-    char *t;
-    char const *s = 0 ? (char *) 0 : (char const *) 0;
-
-    *t++ = 0;
-    if (s) return 0;
-  }
-  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
-    int x[] = {25, 17};
-    const int *foo = &x[0];
-    ++foo;
-  }
-  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
-    typedef const int *iptr;
-    iptr p = 0;
-    ++p;
-  }
-  { /* AIX XL C 1.02.0.0 rejects this saying
-       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
-    struct s { int j; const int *ap[3]; };
-    struct s *b; b->j = 5;
-  }
-  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
-    const int foo = 10;
-    if (!foo) return 0;
-  }
-  return !cs[0] && !zero.x;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_c_const=yes
-else
-  ac_cv_c_const=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
-$as_echo "$ac_cv_c_const" >&6; }
-if test $ac_cv_c_const = no; then
-
-$as_echo "#define const /**/" >>confdefs.h
-
-fi
-
-ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
-if test "x$ac_cv_type_size_t" = x""yes; then :
-
-else
-
-cat >>confdefs.h <<_ACEOF
-#define size_t unsigned int
-_ACEOF
-
-fi
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if test "${ac_cv_header_stdc+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_stdc=yes
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      return 2;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-
-
-for ac_func in strtol
-do :
-  ac_fn_c_check_func "$LINENO" "strtol" "ac_cv_func_strtol"
-if test "x$ac_cv_func_strtol" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_STRTOL 1
-_ACEOF
-
-fi
-done
-
-
-
-
-for ac_header in sys/resource.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "sys/resource.h" "ac_cv_header_sys_resource_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_resource_h" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_SYS_RESOURCE_H 1
-_ACEOF
-
-$as_echo "#define CLOOG_RUSAGE /**/" >>confdefs.h
-
-fi
-
-done
-
-
-
-
-
-# Check whether --with-isl was given.
-if test "${with_isl+set}" = set; then :
-  withval=$with_isl;
-fi
-
-case "system" in
-no|system|build|bundled)
-
-# Check whether --with-isl_prefix was given.
-if test "${with_isl_prefix+set}" = set; then :
-  withval=$with_isl_prefix;
-fi
-
-
-# Check whether --with-isl_exec_prefix was given.
-if test "${with_isl_exec_prefix+set}" = set; then :
-  withval=$with_isl_exec_prefix;
-fi
-
-esac
-case "build" in
-no|system|build|bundled)
-
-# Check whether --with-isl_builddir was given.
-if test "${with_isl_builddir+set}" = set; then :
-  withval=$with_isl_builddir;
-fi
-
-esac
-if test "x$with_isl_prefix" != "x" -a "x$with_isl_exec_prefix" = "x"; then
-	with_isl_exec_prefix=$with_isl_prefix
-fi
-if test "x$with_isl_prefix" != "x" -o "x$with_isl_exec_prefix" != "x"; then
-	if test "x$with_isl" != "x" -a "x$with_isl" != "xsystem"; then
-		as_fn_error "Setting $with_isl_prefix implies use of system isl" "$LINENO" 5
-	fi
-	with_isl="system"
-fi
-if test "x$with_isl_builddir" != "x"; then
-	if test "x$with_isl" != "x" -a "x$with_isl" != "xbuild"; then
-		as_fn_error "Setting $with_isl_builddir implies use of build isl" "$LINENO" 5
-	fi
-	with_isl="build"
-	isl_srcdir=`echo @abs_srcdir@ | $with_isl_builddir/config.status --file=-`
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: isl sources in $isl_srcdir" >&5
-$as_echo "$as_me: isl sources in $isl_srcdir" >&6;}
-fi
-case "$with_isl" in
-no|system|build|bundled)
-	;;
-*)
-	if test -d $srcdir/.git -a \
-		-d $srcdir/isl -a \
-		! -d $srcdir/isl/.git; then
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: git repo detected, but submodule isl not initialized" >&5
-$as_echo "$as_me: WARNING: git repo detected, but submodule isl not initialized" >&2;}
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You may want to run" >&5
-$as_echo "$as_me: WARNING: You may want to run" >&2;}
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	git submodule init" >&5
-$as_echo "$as_me: WARNING: 	git submodule init" >&2;}
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	git submodule update" >&5
-$as_echo "$as_me: WARNING: 	git submodule update" >&2;}
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	sh autogen.sh" >&5
-$as_echo "$as_me: WARNING: 	sh autogen.sh" >&2;}
-	fi
-	if test -f $srcdir/isl/configure -a "bundled" != "no"; then
-		with_isl="bundled"
-	else
-		with_isl="bundled"
-	fi
-	;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which isl to use" >&5
-$as_echo_n "checking which isl to use... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_isl" >&5
-$as_echo "$with_isl" >&6; }
-
-
-BITS="gmp"
-
-
-
-
-
-# Check whether --with-gmp was given.
-if test "${with_gmp+set}" = set; then :
-  withval=$with_gmp;
-fi
-
-case "system" in
-system)
-
-# Check whether --with-gmp_prefix was given.
-if test "${with_gmp_prefix+set}" = set; then :
-  withval=$with_gmp_prefix;
-fi
-
-
-# Check whether --with-gmp_exec_prefix was given.
-if test "${with_gmp_exec_prefix+set}" = set; then :
-  withval=$with_gmp_exec_prefix;
-fi
-
-esac
-case "build" in
-system)
-
-# Check whether --with-gmp_builddir was given.
-if test "${with_gmp_builddir+set}" = set; then :
-  withval=$with_gmp_builddir;
-fi
-
-esac
-if test "x$with_gmp_prefix" != "x" -a "x$with_gmp_exec_prefix" = "x"; then
-	with_gmp_exec_prefix=$with_gmp_prefix
-fi
-if test "x$with_gmp_prefix" != "x" -o "x$with_gmp_exec_prefix" != "x"; then
-	if test "x$with_gmp" != "x" -a "x$with_gmp" != "xsystem"; then
-		as_fn_error "Setting $with_gmp_prefix implies use of system gmp" "$LINENO" 5
-	fi
-	with_gmp="system"
-fi
-if test "x$with_gmp_builddir" != "x"; then
-	if test "x$with_gmp" != "x" -a "x$with_gmp" != "xbuild"; then
-		as_fn_error "Setting $with_gmp_builddir implies use of build gmp" "$LINENO" 5
-	fi
-	with_gmp="build"
-	gmp_srcdir=`echo @abs_srcdir@ | $with_gmp_builddir/config.status --file=-`
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: gmp sources in $gmp_srcdir" >&5
-$as_echo "$as_me: gmp sources in $gmp_srcdir" >&6;}
-fi
-case "$with_gmp" in
-system)
-	;;
-*)
-	if test -d $srcdir/.git -a \
-		-d $srcdir/gmp -a \
-		! -d $srcdir/gmp/.git; then
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: git repo detected, but submodule gmp not initialized" >&5
-$as_echo "$as_me: WARNING: git repo detected, but submodule gmp not initialized" >&2;}
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You may want to run" >&5
-$as_echo "$as_me: WARNING: You may want to run" >&2;}
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	git submodule init" >&5
-$as_echo "$as_me: WARNING: 	git submodule init" >&2;}
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	git submodule update" >&5
-$as_echo "$as_me: WARNING: 	git submodule update" >&2;}
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	sh autogen.sh" >&5
-$as_echo "$as_me: WARNING: 	sh autogen.sh" >&2;}
-	fi
-	if test -f $srcdir/gmp/configure -a "system" != "no"; then
-		with_gmp="bundled"
-	else
-		with_gmp="system"
-	fi
-	;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which gmp to use" >&5
-$as_echo_n "checking which gmp to use... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_gmp" >&5
-$as_echo "$with_gmp" >&6; }
-
-
-
-need_get_memory_functions=false
-case "$with_gmp" in
-system)
-    if test "x$with_gmp_prefix" != "x"; then
-	CPPFLAGS="-I$with_gmp_prefix/include $CPPFLAGS"
-    fi
-
-    if test "$with_gmp_exec_prefix" != "yes" ; then
-	LDFLAGS="-L$with_gmp_exec_prefix/lib $LDFLAGS"
-    fi
-
-    ac_fn_c_check_header_mongrel "$LINENO" "gmp.h" "ac_cv_header_gmp_h" "$ac_includes_default"
-if test "x$ac_cv_header_gmp_h" = x""yes; then :
-
-else
-  as_fn_error "Can't find gmp headers." "$LINENO" 5
-fi
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gmpz_init in -lgmp" >&5
-$as_echo_n "checking for __gmpz_init in -lgmp... " >&6; }
-if test "${ac_cv_lib_gmp___gmpz_init+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lgmp  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char __gmpz_init ();
-int
-main ()
-{
-return __gmpz_init ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_gmp___gmpz_init=yes
-else
-  ac_cv_lib_gmp___gmpz_init=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gmp___gmpz_init" >&5
-$as_echo "$ac_cv_lib_gmp___gmpz_init" >&6; }
-if test "x$ac_cv_lib_gmp___gmpz_init" = x""yes; then :
-  LIBS="$LIBS -lgmp"
-else
-  as_fn_error "Can't find gmp library." "$LINENO" 5
-fi
-
-    ac_fn_c_check_decl "$LINENO" "mp_get_memory_functions" "ac_cv_have_decl_mp_get_memory_functions" "#include <gmp.h>
-"
-if test "x$ac_cv_have_decl_mp_get_memory_functions" = x""yes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_MP_GET_MEMORY_FUNCTIONS $ac_have_decl
-_ACEOF
-if test $ac_have_decl = 1; then :
-
-else
-
-	    need_get_memory_functions=true
-
-fi
-
-    ;;
-esac
- if test x$need_get_memory_functions = xtrue; then
-  NEED_GET_MEMORY_FUNCTIONS_TRUE=
-  NEED_GET_MEMORY_FUNCTIONS_FALSE='#'
-else
-  NEED_GET_MEMORY_FUNCTIONS_TRUE='#'
-  NEED_GET_MEMORY_FUNCTIONS_FALSE=
-fi
-
-
-
-
-
-
-case "$with_isl" in
-bundled)
-	ISL_CPPFLAGS="-I$srcdir/isl/include -Iisl/include"
-	;;
-build)
-	ISL_CPPFLAGS="-I$isl_srcdir/include -I$with_isl_builddir/include"
-	ISL_LIBS="$with_isl_builddir/libisl.la"
-	;;
-system)
-	if test "x$with_isl_prefix" != "x"; then
-		ISL_CPPFLAGS="-I$with_isl_prefix/include"
-	fi
-	if test "x$with_isl_exec_prefix" != "x"; then
-		ISL_LDFLAGS="-L$with_isl_exec_prefix/lib"
-	fi
-	ISL_LIBS="-lisl"
-esac
- if test $with_isl = bundled; then
-  BUNDLED_ISL_TRUE=
-  BUNDLED_ISL_FALSE='#'
-else
-  BUNDLED_ISL_TRUE='#'
-  BUNDLED_ISL_FALSE=
-fi
-
- if test $with_isl = no; then
-  NO_ISL_TRUE=
-  NO_ISL_FALSE='#'
-else
-  NO_ISL_TRUE='#'
-  NO_ISL_FALSE=
-fi
-
-
-
-
-$as_echo "#define CLOOG_INT_GMP 1" >>confdefs.h
-
-
-
-if test -f $srcdir/.git/HEAD; then
-	GIT_INDEX="\$(top_srcdir)/.git/index"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-PACKAGE_NAME="cloog-isl"
-PACKAGE_CFLAGS="-DCLOOG_INT_GMP=1"
-
-# we need the expanded forms...
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig libname" >&5
-$as_echo_n "checking our pkgconfig libname... " >&6; }
-test ".$ax_create_pkgconfig_libname" != "." || \
-ax_create_pkgconfig_libname="${PACKAGE_NAME}"
-test ".$ax_create_pkgconfig_libname" != "." || \
-ax_create_pkgconfig_libname="$PACKAGE"
-ax_create_pkgconfig_libname=`eval echo "$ax_create_pkgconfig_libname"`
-ax_create_pkgconfig_libname=`eval echo "$ax_create_pkgconfig_libname"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_libname" >&5
-$as_echo "$ax_create_pkgconfig_libname" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig version" >&5
-$as_echo_n "checking our pkgconfig version... " >&6; }
-test ".$ax_create_pkgconfig_version" != "." || \
-ax_create_pkgconfig_version="${PACKAGE_VERSION}"
-test ".$ax_create_pkgconfig_version" != "." || \
-ax_create_pkgconfig_version="$VERSION"
-ax_create_pkgconfig_version=`eval echo "$ax_create_pkgconfig_version"`
-ax_create_pkgconfig_version=`eval echo "$ax_create_pkgconfig_version"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_version" >&5
-$as_echo "$ax_create_pkgconfig_version" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig_libdir" >&5
-$as_echo_n "checking our pkgconfig_libdir... " >&6; }
-test ".$pkgconfig_libdir" = "." && \
-pkgconfig_libdir='${libdir}/pkgconfig'
-ax_create_pkgconfig_libdir=`eval echo "$pkgconfig_libdir"`
-ax_create_pkgconfig_libdir=`eval echo "$ax_create_pkgconfig_libdir"`
-ax_create_pkgconfig_libdir=`eval echo "$ax_create_pkgconfig_libdir"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pkgconfig_libdir" >&5
-$as_echo "$pkgconfig_libdir" >&6; }
-test "$pkgconfig_libdir" != "$ax_create_pkgconfig_libdir" && (
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: expanded our pkgconfig_libdir... $ax_create_pkgconfig_libdir" >&5
-$as_echo "expanded our pkgconfig_libdir... $ax_create_pkgconfig_libdir" >&6; })
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig_libfile" >&5
-$as_echo_n "checking our pkgconfig_libfile... " >&6; }
-test ".$pkgconfig_libfile" != "." || \
-pkgconfig_libfile="$ax_create_pkgconfig_libname.pc"
-ax_create_pkgconfig_libfile=`eval echo "$pkgconfig_libfile"`
-ax_create_pkgconfig_libfile=`eval echo "$ax_create_pkgconfig_libfile"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pkgconfig_libfile" >&5
-$as_echo "$pkgconfig_libfile" >&6; }
-test "$pkgconfig_libfile" != "$ax_create_pkgconfig_libfile" && (
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: expanded our pkgconfig_libfile... $ax_create_pkgconfig_libfile" >&5
-$as_echo "expanded our pkgconfig_libfile... $ax_create_pkgconfig_libfile" >&6; })
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our package / suffix" >&5
-$as_echo_n "checking our package / suffix... " >&6; }
-ax_create_pkgconfig_suffix="$program_suffix"
-test ".$ax_create_pkgconfig_suffix" != .NONE || ax_create_pkgconfig_suffix=""
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${PACKAGE_NAME} / ${ax_create_pkgconfig_suffix}" >&5
-$as_echo "${PACKAGE_NAME} / ${ax_create_pkgconfig_suffix}" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig description" >&5
-$as_echo_n "checking our pkgconfig description... " >&6; }
-ax_create_pkgconfig_description="$PACKAGE_SUMMARY"
-test ".$ax_create_pkgconfig_description" != "." || \
-ax_create_pkgconfig_description="$ax_create_pkgconfig_libname Library"
-ax_create_pkgconfig_description=`eval echo "$ax_create_pkgconfig_description"`
-ax_create_pkgconfig_description=`eval echo "$ax_create_pkgconfig_description"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_description" >&5
-$as_echo "$ax_create_pkgconfig_description" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig requires" >&5
-$as_echo_n "checking our pkgconfig requires... " >&6; }
-ax_create_pkgconfig_requires="$PACKAGE_REQUIRES"
-ax_create_pkgconfig_requires=`eval echo "$ax_create_pkgconfig_requires"`
-ax_create_pkgconfig_requires=`eval echo "$ax_create_pkgconfig_requires"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_requires" >&5
-$as_echo "$ax_create_pkgconfig_requires" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig ext libs" >&5
-$as_echo_n "checking our pkgconfig ext libs... " >&6; }
-ax_create_pkgconfig_pkglibs="$PACKAGE_LIBS"
-test ".$ax_create_pkgconfig_pkglibs" != "." || ax_create_pkgconfig_pkglibs="-l$ax_create_pkgconfig_libname"
-ax_create_pkgconfig_libs="$ax_create_pkgconfig_pkglibs $LIBS"
-ax_create_pkgconfig_libs=`eval echo "$ax_create_pkgconfig_libs"`
-ax_create_pkgconfig_libs=`eval echo "$ax_create_pkgconfig_libs"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_libs" >&5
-$as_echo "$ax_create_pkgconfig_libs" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig cppflags" >&5
-$as_echo_n "checking our pkgconfig cppflags... " >&6; }
-ax_create_pkgconfig_cppflags="$CPPFLAGS $PACKAGE_CFLAGS"
-ax_create_pkgconfig_cppflags=`eval echo "$ax_create_pkgconfig_cppflags"`
-ax_create_pkgconfig_cppflags=`eval echo "$ax_create_pkgconfig_cppflags"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_cppflags" >&5
-$as_echo "$ax_create_pkgconfig_cppflags" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig ldflags" >&5
-$as_echo_n "checking our pkgconfig ldflags... " >&6; }
-ax_create_pkgconfig_ldflags="$LDFLAGS $PACKAGE_LDFLAGS"
-ax_create_pkgconfig_ldflags=`eval echo "$ax_create_pkgconfig_ldflags"`
-ax_create_pkgconfig_ldflags=`eval echo "$ax_create_pkgconfig_ldflags"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_ldflags" >&5
-$as_echo "$ax_create_pkgconfig_ldflags" >&6; }
-
-test ".$ax_create_pkgconfig_generate" != "." || \
-ax_create_pkgconfig_generate="$ax_create_pkgconfig_libname.pc"
-ax_create_pkgconfig_generate=`eval echo "$ax_create_pkgconfig_generate"`
-ax_create_pkgconfig_generate=`eval echo "$ax_create_pkgconfig_generate"`
-test "$pkgconfig_libfile" != "$ax_create_pkgconfig_generate" && (
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: generate the pkgconfig later... $ax_create_pkgconfig_generate" >&5
-$as_echo "generate the pkgconfig later... $ax_create_pkgconfig_generate" >&6; })
-
-if test ".$ax_create_pkgconfig_src_libdir" = "." ; then
-ax_create_pkgconfig_src_libdir=`pwd`
-ax_create_pkgconfig_src_libdir=`$as_dirname -- "$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" ||
-$as_expr X"$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" : 'X\(//\)[^/]' \| \
-	 X"$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" : 'X\(//\)$' \| \
-	 X"$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-test ! -d $ax_create_pkgconfig_src_libdir/src || \
-ax_create_pkgconfig_src_libdir="$ax_create_pkgconfig_src_libdir/src"
-case ".$objdir" in
-*libs) ax_create_pkgconfig_src_libdir="$ax_create_pkgconfig_src_libdir/$objdir" ;; esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: noninstalled pkgconfig -L $ax_create_pkgconfig_src_libdir" >&5
-$as_echo "noninstalled pkgconfig -L $ax_create_pkgconfig_src_libdir" >&6; }
-fi
-
-if test ".$ax_create_pkgconfig_src_headers" = "." ; then
-ax_create_pkgconfig_src_headers=`pwd`
-v="$ac_top_srcdir" ;
-test ".$v" != "." || v="$ax_spec_dir"
-test ".$v" != "." || v="$srcdir"
-case "$v" in /*) ax_create_pkgconfig_src_headers="" ;; esac
-ax_create_pkgconfig_src_headers=`$as_dirname -- "$ax_create_pkgconfig_src_headers/$v/x" ||
-$as_expr X"$ax_create_pkgconfig_src_headers/$v/x" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ax_create_pkgconfig_src_headers/$v/x" : 'X\(//\)[^/]' \| \
-	 X"$ax_create_pkgconfig_src_headers/$v/x" : 'X\(//\)$' \| \
-	 X"$ax_create_pkgconfig_src_headers/$v/x" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ax_create_pkgconfig_src_headers/$v/x" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-test ! -d $ax_create_pkgconfig_src_headers/include || \
-ax_create_pkgconfig_src_headers="$ax_create_pkgconfig_src_headers/include"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: noninstalled pkgconfig -I $ax_create_pkgconfig_src_headers" >&5
-$as_echo "noninstalled pkgconfig -I $ax_create_pkgconfig_src_headers" >&6; }
-fi
-
-
-ac_config_commands="$ac_config_commands $ax_create_pkgconfig_generate"
-
-
-ac_config_files="$ac_config_files Makefile test/Makefile"
-
-ac_config_files="$ac_config_files autoconf/Doxyfile"
-
-ac_config_files="$ac_config_files doc/Makefile"
-
-ac_config_files="$ac_config_files source/version.c"
-
-ac_config_files="$ac_config_files include/cloog/version.h"
-
-ac_config_files="$ac_config_files genversion.sh"
-
-ac_config_commands="$ac_config_commands version.h"
-
-ac_config_commands="$ac_config_commands doc/gitversion.texi"
-
-if test $with_isl = bundled; then
-
-
-subdirs="$subdirs isl"
-
-fi
-
-cat >confcache <<\_ACEOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs, see configure's option --config-cache.
-# It is not useful on other systems.  If it contains results you don't
-# want to keep, you may remove or edit it.
-#
-# config.status only pays attention to the cache file if you give it
-# the --recheck option to rerun configure.
-#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
-# following values.
-
-_ACEOF
-
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, we kill variables containing newlines.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(
-  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) { eval $ac_var=; unset $ac_var;} ;;
-      esac ;;
-    esac
-  done
-
-  (set) 2>&1 |
-    case $as_nl`(ac_space=' '; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      # `set' does not quote correctly, so add quotes: double-quote
-      # substitution turns \\\\ into \\, and sed turns \\ into \.
-      sed -n \
-	"s/'/'\\\\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
-      ;; #(
-    *)
-      # `set' quotes correctly as required by POSIX, so do not add quotes.
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-) |
-  sed '
-     /^ac_cv_env_/b end
-     t clear
-     :clear
-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
-     t end
-     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
-     :end' >>confcache
-if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
-  if test -w "$cache_file"; then
-    test "x$cache_file" != "x/dev/null" &&
-      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
-    cat confcache >$cache_file
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
-  fi
-fi
-rm -f confcache
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-# Transform confdefs.h into DEFS.
-# Protect against shell expansion while executing Makefile rules.
-# Protect against Makefile macro expansion.
-#
-# If the first sed substitution is executed (which looks for macros that
-# take arguments), then branch to the quote section.  Otherwise,
-# look for a macro that doesn't take arguments.
-ac_script='
-:mline
-/\\$/{
- N
- s,\\\n,,
- b mline
-}
-t clear
-:clear
-s/^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*([^)]*)\)[	 ]*\(.*\)/-D\1=\2/g
-t quote
-s/^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)/-D\1=\2/g
-t quote
-b any
-:quote
-s/[	 `~#$^&*(){}\\|;'\''"<>?]/\\&/g
-s/\[/\\&/g
-s/\]/\\&/g
-s/\$/$$/g
-H
-:any
-${
-	g
-	s/^\n//
-	s/\n/ /g
-	p
-}
-'
-DEFS=`sed -n "$ac_script" confdefs.h`
-
-
-ac_libobjs=
-ac_ltlibobjs=
-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
-  # 1. Remove the extension, and $U if already installed.
-  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
-  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
-  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
-  #    will be set to the directory where LIBOBJS objects are built.
-  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
-  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
-done
-LIBOBJS=$ac_libobjs
-
-LTLIBOBJS=$ac_ltlibobjs
-
-
- if test -n "$EXEEXT"; then
-  am__EXEEXT_TRUE=
-  am__EXEEXT_FALSE='#'
-else
-  am__EXEEXT_TRUE='#'
-  am__EXEEXT_FALSE=
-fi
-
-if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
-  as_fn_error "conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
-  as_fn_error "conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${HAVE_TEXI2DVI_TRUE}" && test -z "${HAVE_TEXI2DVI_FALSE}"; then
-  as_fn_error "conditional \"HAVE_TEXI2DVI\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${NEED_GET_MEMORY_FUNCTIONS_TRUE}" && test -z "${NEED_GET_MEMORY_FUNCTIONS_FALSE}"; then
-  as_fn_error "conditional \"NEED_GET_MEMORY_FUNCTIONS\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${BUNDLED_ISL_TRUE}" && test -z "${BUNDLED_ISL_FALSE}"; then
-  as_fn_error "conditional \"BUNDLED_ISL\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${NO_ISL_TRUE}" && test -z "${NO_ISL_FALSE}"; then
-  as_fn_error "conditional \"NO_ISL\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-
-: ${CONFIG_STATUS=./config.status}
-ac_write_fail=0
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
-as_write_fail=0
-cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate the current configuration.
-# Compiler output produced by configure, useful for debugging
-# configure, is in config.log if it exists.
-
-debug=false
-ac_cs_recheck=false
-ac_cs_silent=false
-
-SHELL=\${CONFIG_SHELL-$SHELL}
-export SHELL
-_ASEOF
-cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
-      PATH_SEPARATOR=';'
-  }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-case $0 in #((
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-  done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-
-# as_fn_error ERROR [LINENO LOG_FD]
-# ---------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with status $?, using 1 if that was 0.
-as_fn_error ()
-{
-  as_status=$?; test $as_status -eq 0 && as_status=1
-  if test "$3"; then
-    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
-  fi
-  $as_echo "$as_me: error: $1" >&2
-  as_fn_exit $as_status
-} # as_fn_error
-
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
-  return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
-  set +e
-  as_fn_set_status $1
-  exit $1
-} # as_fn_exit
-
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
-  { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
-  eval 'as_fn_append ()
-  {
-    eval $1+=\$2
-  }'
-else
-  as_fn_append ()
-  {
-    eval $1=\$$1\$2
-  }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
-  eval 'as_fn_arith ()
-  {
-    as_val=$(( $* ))
-  }'
-else
-  as_fn_arith ()
-  {
-    as_val=`expr "$@" || test $? -eq 1`
-  }
-fi # as_fn_arith
-
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
-  case `echo 'xy\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  xy)  ECHO_C='\c';;
-  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
-       ECHO_T='	';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
-  if ln -s conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s='ln -s'
-    # ... but there are two gotchas:
-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
-  elif ln conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s=ln
-  else
-    as_ln_s='cp -p'
-  fi
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || eval $as_mkdir_p || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p='mkdir -p "$as_dir"'
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-	test -d "$1/.";
-      else
-	case $1 in #(
-	-*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-exec 6>&1
-## ----------------------------------- ##
-## Main body of $CONFIG_STATUS script. ##
-## ----------------------------------- ##
-_ASEOF
-test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# Save the log message, to keep $0 and so on meaningful, and to
-# report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.
-ac_log="
-This file was extended by cloog $as_me 0.16.3, which was
-generated by GNU Autoconf 2.65.  Invocation command line was
-
-  CONFIG_FILES    = $CONFIG_FILES
-  CONFIG_HEADERS  = $CONFIG_HEADERS
-  CONFIG_LINKS    = $CONFIG_LINKS
-  CONFIG_COMMANDS = $CONFIG_COMMANDS
-  $ $0 $@
-
-on `(hostname || uname -n) 2>/dev/null | sed 1q`
-"
-
-_ACEOF
-
-case $ac_config_files in *"
-"*) set x $ac_config_files; shift; ac_config_files=$*;;
-esac
-
-
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-# Files that config.status was made for.
-config_files="$ac_config_files"
-config_commands="$ac_config_commands"
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-ac_cs_usage="\
-\`$as_me' instantiates files and other configuration actions
-from templates according to the current configuration.  Unless the files
-and actions are specified as TAGs, all are instantiated by default.
-
-Usage: $0 [OPTION]... [TAG]...
-
-  -h, --help       print this help, then exit
-  -V, --version    print version number and configuration settings, then exit
-      --config     print configuration, then exit
-  -q, --quiet, --silent
-                   do not print progress messages
-  -d, --debug      don't remove temporary files
-      --recheck    update $as_me by reconfiguring in the same conditions
-      --file=FILE[:TEMPLATE]
-                   instantiate the configuration file FILE
-
-Configuration files:
-$config_files
-
-Configuration commands:
-$config_commands
-
-Report bugs to <cloog-development@googlegroups.com>."
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
-ac_cs_version="\\
-cloog config.status 0.16.3
-configured by $0, generated by GNU Autoconf 2.65,
-  with options \\"\$ac_cs_config\\"
-
-Copyright (C) 2009 Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-
-ac_pwd='$ac_pwd'
-srcdir='$srcdir'
-INSTALL='$INSTALL'
-MKDIR_P='$MKDIR_P'
-AWK='$AWK'
-test -n "\$AWK" || AWK=awk
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# The default lists apply if the user does not specify any file.
-ac_need_defaults=:
-while test $# != 0
-do
-  case $1 in
-  --*=*)
-    ac_option=`expr "X$1" : 'X\([^=]*\)='`
-    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
-    ac_shift=:
-    ;;
-  *)
-    ac_option=$1
-    ac_optarg=$2
-    ac_shift=shift
-    ;;
-  esac
-
-  case $ac_option in
-  # Handling of the options.
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    ac_cs_recheck=: ;;
-  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
-    $as_echo "$ac_cs_version"; exit ;;
-  --config | --confi | --conf | --con | --co | --c )
-    $as_echo "$ac_cs_config"; exit ;;
-  --debug | --debu | --deb | --de | --d | -d )
-    debug=: ;;
-  --file | --fil | --fi | --f )
-    $ac_shift
-    case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    as_fn_append CONFIG_FILES " '$ac_optarg'"
-    ac_need_defaults=false;;
-  --he | --h |  --help | --hel | -h )
-    $as_echo "$ac_cs_usage"; exit ;;
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil | --si | --s)
-    ac_cs_silent=: ;;
-
-  # This is an error.
-  -*) as_fn_error "unrecognized option: \`$1'
-Try \`$0 --help' for more information." ;;
-
-  *) as_fn_append ac_config_targets " $1"
-     ac_need_defaults=false ;;
-
-  esac
-  shift
-done
-
-ac_configure_extra_args=
-
-if $ac_cs_silent; then
-  exec 6>/dev/null
-  ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-if \$ac_cs_recheck; then
-  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
-  shift
-  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
-  CONFIG_SHELL='$SHELL'
-  export CONFIG_SHELL
-  exec "\$@"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-exec 5>>config.log
-{
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-  $as_echo "$ac_log"
-} >&5
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-#
-# INIT-COMMANDS
-#
-AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
-
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
-macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
-enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
-enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
-pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
-enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
-SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
-ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
-host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
-host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
-host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
-build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
-build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
-build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
-SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
-Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
-GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
-EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
-FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
-LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
-NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
-LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
-max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
-ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
-exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
-lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
-lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
-lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
-reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
-reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
-OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
-deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
-file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
-AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
-AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
-STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
-RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
-old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
-old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
-old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
-lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
-CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
-CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
-compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
-GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
-objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
-MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
-lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
-need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
-DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
-NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
-LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
-OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
-OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
-libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
-shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
-extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
-archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
-enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
-export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
-whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
-compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
-old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
-old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
-archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
-archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
-module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
-module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
-with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
-allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
-no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
-hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
-hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
-hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
-hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
-inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
-link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
-fix_srcfile_path='`$ECHO "$fix_srcfile_path" | $SED "$delay_single_quote_subst"`'
-always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
-export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
-exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
-include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
-prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
-file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
-variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
-need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
-need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
-version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
-runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
-shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
-shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
-libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
-library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
-soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
-install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
-postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
-postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
-finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
-finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
-hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
-sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
-sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
-hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
-enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
-enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
-enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
-old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
-striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
-
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-\$1
-_LTECHO_EOF'
-}
-
-# Quote evaled strings.
-for var in SHELL \
-ECHO \
-SED \
-GREP \
-EGREP \
-FGREP \
-LD \
-NM \
-LN_S \
-lt_SP2NL \
-lt_NL2SP \
-reload_flag \
-OBJDUMP \
-deplibs_check_method \
-file_magic_cmd \
-AR \
-AR_FLAGS \
-STRIP \
-RANLIB \
-CC \
-CFLAGS \
-compiler \
-lt_cv_sys_global_symbol_pipe \
-lt_cv_sys_global_symbol_to_cdecl \
-lt_cv_sys_global_symbol_to_c_name_address \
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
-lt_prog_compiler_no_builtin_flag \
-lt_prog_compiler_wl \
-lt_prog_compiler_pic \
-lt_prog_compiler_static \
-lt_cv_prog_compiler_c_o \
-need_locks \
-DSYMUTIL \
-NMEDIT \
-LIPO \
-OTOOL \
-OTOOL64 \
-shrext_cmds \
-export_dynamic_flag_spec \
-whole_archive_flag_spec \
-compiler_needs_object \
-with_gnu_ld \
-allow_undefined_flag \
-no_undefined_flag \
-hardcode_libdir_flag_spec \
-hardcode_libdir_flag_spec_ld \
-hardcode_libdir_separator \
-fix_srcfile_path \
-exclude_expsyms \
-include_expsyms \
-file_list_spec \
-variables_saved_for_relink \
-libname_spec \
-library_names_spec \
-soname_spec \
-install_override_mode \
-finish_eval \
-old_striplib \
-striplib; do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Double-quote double-evaled strings.
-for var in reload_cmds \
-old_postinstall_cmds \
-old_postuninstall_cmds \
-old_archive_cmds \
-extract_expsyms_cmds \
-old_archive_from_new_cmds \
-old_archive_from_expsyms_cmds \
-archive_cmds \
-archive_expsym_cmds \
-module_cmds \
-module_expsym_cmds \
-export_symbols_cmds \
-prelink_cmds \
-postinstall_cmds \
-postuninstall_cmds \
-finish_cmds \
-sys_lib_search_path_spec \
-sys_lib_dlsearch_path_spec; do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-ac_aux_dir='$ac_aux_dir'
-xsi_shell='$xsi_shell'
-lt_shell_append='$lt_shell_append'
-
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-
-    PACKAGE='$PACKAGE'
-    VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
-    RM='$RM'
-    ofile='$ofile'
-
-
-
-
-ax_create_pkgconfig_generate="$ax_create_pkgconfig_generate"
-pkgconfig_prefix='$prefix'
-pkgconfig_execprefix='$exec_prefix'
-pkgconfig_bindir='$bindir'
-pkgconfig_libdir='$libdir'
-pkgconfig_includedir='$includedir'
-pkgconfig_datarootdir='$datarootdir'
-pkgconfig_datadir='$datadir'
-pkgconfig_sysconfdir='$sysconfdir'
-pkgconfig_suffix='$ax_create_pkgconfig_suffix'
-pkgconfig_package='$PACKAGE_NAME'
-pkgconfig_libname='$ax_create_pkgconfig_libname'
-pkgconfig_description='$ax_create_pkgconfig_description'
-pkgconfig_version='$ax_create_pkgconfig_version'
-pkgconfig_requires='$ax_create_pkgconfig_requires'
-pkgconfig_libs='$ax_create_pkgconfig_libs'
-pkgconfig_ldflags='$ax_create_pkgconfig_ldflags'
-pkgconfig_cppflags='$ax_create_pkgconfig_cppflags'
-pkgconfig_src_libdir='$ax_create_pkgconfig_src_libdir'
-pkgconfig_src_headers='$ax_create_pkgconfig_src_headers'
-
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-
-# Handling of arguments.
-for ac_config_target in $ac_config_targets
-do
-  case $ac_config_target in
-    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
-    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
-    "$ax_create_pkgconfig_generate") CONFIG_COMMANDS="$CONFIG_COMMANDS $ax_create_pkgconfig_generate" ;;
-    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-    "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;;
-    "autoconf/Doxyfile") CONFIG_FILES="$CONFIG_FILES autoconf/Doxyfile" ;;
-    "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
-    "source/version.c") CONFIG_FILES="$CONFIG_FILES source/version.c" ;;
-    "include/cloog/version.h") CONFIG_FILES="$CONFIG_FILES include/cloog/version.h" ;;
-    "genversion.sh") CONFIG_FILES="$CONFIG_FILES genversion.sh" ;;
-    "version.h") CONFIG_COMMANDS="$CONFIG_COMMANDS version.h" ;;
-    "doc/gitversion.texi") CONFIG_COMMANDS="$CONFIG_COMMANDS doc/gitversion.texi" ;;
-
-  *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
-  esac
-done
-
-
-# If the user did not use the arguments to specify the items to instantiate,
-# then the envvar interface is used.  Set only those that are not.
-# We use the long form for the default assignment because of an extremely
-# bizarre bug on SunOS 4.1.3.
-if $ac_need_defaults; then
-  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
-  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
-fi
-
-# Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason against having it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Hook for its removal unless debugging.
-# Note that there is a small window in which the directory will not be cleaned:
-# after its creation but before its name has been assigned to `$tmp'.
-$debug ||
-{
-  tmp=
-  trap 'exit_status=$?
-  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
-' 0
-  trap 'as_fn_exit 1' 1 2 13 15
-}
-# Create a (secure) tmp directory for tmp files.
-
-{
-  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
-  test -n "$tmp" && test -d "$tmp"
-}  ||
-{
-  tmp=./conf$$-$RANDOM
-  (umask 077 && mkdir "$tmp")
-} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5
-
-# Set up the scripts for CONFIG_FILES section.
-# No need to generate them if there are no CONFIG_FILES.
-# This happens for instance with `./config.status config.h'.
-if test -n "$CONFIG_FILES"; then
-
-
-ac_cr=`echo X | tr X '\015'`
-# On cygwin, bash can eat \r inside `` if the user requested igncr.
-# But we know of no other shell where ac_cr would be empty at this
-# point, so we can use a bashism as a fallback.
-if test "x$ac_cr" = x; then
-  eval ac_cr=\$\'\\r\'
-fi
-ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
-if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
-  ac_cs_awk_cr='\r'
-else
-  ac_cs_awk_cr=$ac_cr
-fi
-
-echo 'BEGIN {' >"$tmp/subs1.awk" &&
-_ACEOF
-
-
-{
-  echo "cat >conf$$subs.awk <<_ACEOF" &&
-  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
-  echo "_ACEOF"
-} >conf$$subs.sh ||
-  as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
-ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
-ac_delim='%!_!# '
-for ac_last_try in false false false false false :; do
-  . ./conf$$subs.sh ||
-    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
-
-  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
-  if test $ac_delim_n = $ac_delim_num; then
-    break
-  elif $ac_last_try; then
-    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
-  else
-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
-  fi
-done
-rm -f conf$$subs.sh
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
-_ACEOF
-sed -n '
-h
-s/^/S["/; s/!.*/"]=/
-p
-g
-s/^[^!]*!//
-:repl
-t repl
-s/'"$ac_delim"'$//
-t delim
-:nl
-h
-s/\(.\{148\}\)..*/\1/
-t more1
-s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
-p
-n
-b repl
-:more1
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t nl
-:delim
-h
-s/\(.\{148\}\)..*/\1/
-t more2
-s/["\\]/\\&/g; s/^/"/; s/$/"/
-p
-b
-:more2
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t delim
-' <conf$$subs.awk | sed '
-/^[^""]/{
-  N
-  s/\n//
-}
-' >>$CONFIG_STATUS || ac_write_fail=1
-rm -f conf$$subs.awk
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-_ACAWK
-cat >>"\$tmp/subs1.awk" <<_ACAWK &&
-  for (key in S) S_is_set[key] = 1
-  FS = ""
-
-}
-{
-  line = $ 0
-  nfields = split(line, field, "@")
-  substed = 0
-  len = length(field[1])
-  for (i = 2; i < nfields; i++) {
-    key = field[i]
-    keylen = length(key)
-    if (S_is_set[key]) {
-      value = S[key]
-      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
-      len += length(value) + length(field[++i])
-      substed = 1
-    } else
-      len += 1 + keylen
-  }
-
-  print line
-}
-
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
-  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
-else
-  cat
-fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
-  || as_fn_error "could not setup config files machinery" "$LINENO" 5
-_ACEOF
-
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
-s/:*\$(srcdir):*/:/
-s/:*\${srcdir}:*/:/
-s/:*@srcdir@:*/:/
-s/^\([^=]*=[	 ]*\):*/\1/
-s/:*$//
-s/^[^=]*=[	 ]*$//
-}'
-fi
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-fi # test -n "$CONFIG_FILES"
-
-
-eval set X "  :F $CONFIG_FILES      :C $CONFIG_COMMANDS"
-shift
-for ac_tag
-do
-  case $ac_tag in
-  :[FHLC]) ac_mode=$ac_tag; continue;;
-  esac
-  case $ac_mode$ac_tag in
-  :[FHL]*:*);;
-  :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;;
-  :[FH]-) ac_tag=-:-;;
-  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
-  esac
-  ac_save_IFS=$IFS
-  IFS=:
-  set x $ac_tag
-  IFS=$ac_save_IFS
-  shift
-  ac_file=$1
-  shift
-
-  case $ac_mode in
-  :L) ac_source=$1;;
-  :[FH])
-    ac_file_inputs=
-    for ac_f
-    do
-      case $ac_f in
-      -) ac_f="$tmp/stdin";;
-      *) # Look for the file first in the build tree, then in the source tree
-	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
-	 # because $ac_f cannot contain `:'.
-	 test -f "$ac_f" ||
-	   case $ac_f in
-	   [\\/$]*) false;;
-	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
-	   esac ||
-	   as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;;
-      esac
-      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
-      as_fn_append ac_file_inputs " '$ac_f'"
-    done
-
-    # Let's still pretend it is `configure' which instantiates (i.e., don't
-    # use $as_me), people would be surprised to read:
-    #    /* config.h.  Generated by config.status.  */
-    configure_input='Generated from '`
-	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
-	`' by configure.'
-    if test x"$ac_file" != x-; then
-      configure_input="$ac_file.  $configure_input"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
-    fi
-    # Neutralize special characters interpreted by sed in replacement strings.
-    case $configure_input in #(
-    *\&* | *\|* | *\\* )
-       ac_sed_conf_input=`$as_echo "$configure_input" |
-       sed 's/[\\\\&|]/\\\\&/g'`;; #(
-    *) ac_sed_conf_input=$configure_input;;
-    esac
-
-    case $ac_tag in
-    *:-:* | *:-) cat >"$tmp/stdin" \
-      || as_fn_error "could not create $ac_file" "$LINENO" 5 ;;
-    esac
-    ;;
-  esac
-
-  ac_dir=`$as_dirname -- "$ac_file" ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  as_dir="$ac_dir"; as_fn_mkdir_p
-  ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-
-  case $ac_mode in
-  :F)
-  #
-  # CONFIG_FILE
-  #
-
-  case $INSTALL in
-  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
-  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
-  esac
-  ac_MKDIR_P=$MKDIR_P
-  case $MKDIR_P in
-  [\\/$]* | ?:[\\/]* ) ;;
-  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
-  esac
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# If the template does not know about datarootdir, expand it.
-# FIXME: This hack should be removed a few years after 2.60.
-ac_datarootdir_hack=; ac_datarootdir_seen=
-ac_sed_dataroot='
-/datarootdir/ {
-  p
-  q
-}
-/@datadir@/p
-/@docdir@/p
-/@infodir@/p
-/@localedir@/p
-/@mandir@/p'
-case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
-*datarootdir*) ac_datarootdir_seen=yes;;
-*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-  ac_datarootdir_hack='
-  s&@datadir@&$datadir&g
-  s&@docdir@&$docdir&g
-  s&@infodir@&$infodir&g
-  s&@localedir@&$localedir&g
-  s&@mandir@&$mandir&g
-  s&\\\${datarootdir}&$datarootdir&g' ;;
-esac
-_ACEOF
-
-# Neutralize VPATH when `$srcdir' = `.'.
-# Shell code in configure.ac might set extrasub.
-# FIXME: do we really want to maintain this feature?
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_sed_extra="$ac_vpsub
-$extrasub
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s|@configure_input@|$ac_sed_conf_input|;t t
-s&@top_builddir@&$ac_top_builddir_sub&;t t
-s&@top_build_prefix@&$ac_top_build_prefix&;t t
-s&@srcdir@&$ac_srcdir&;t t
-s&@abs_srcdir@&$ac_abs_srcdir&;t t
-s&@top_srcdir@&$ac_top_srcdir&;t t
-s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
-s&@builddir@&$ac_builddir&;t t
-s&@abs_builddir@&$ac_abs_builddir&;t t
-s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
-s&@INSTALL@&$ac_INSTALL&;t t
-s&@MKDIR_P@&$ac_MKDIR_P&;t t
-$ac_datarootdir_hack
-"
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
-  || as_fn_error "could not create $ac_file" "$LINENO" 5
-
-test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
-  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
-  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined." >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined." >&2;}
-
-  rm -f "$tmp/stdin"
-  case $ac_file in
-  -) cat "$tmp/out" && rm -f "$tmp/out";;
-  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
-  esac \
-  || as_fn_error "could not create $ac_file" "$LINENO" 5
- ;;
-
-
-  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
-$as_echo "$as_me: executing $ac_file commands" >&6;}
- ;;
-  esac
-
-
-  case $ac_file$ac_mode in
-    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
-  # are listed without --file.  Let's play safe and only enable the eval
-  # if we detect the quoting.
-  case $CONFIG_FILES in
-  *\'*) eval set x "$CONFIG_FILES" ;;
-  *)   set x $CONFIG_FILES ;;
-  esac
-  shift
-  for mf
-  do
-    # Strip MF so we end up with the name of the file.
-    mf=`echo "$mf" | sed -e 's/:.*$//'`
-    # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
-    # some people rename them; so instead we look at the file content.
-    # Grep'ing the first line is not enough: some people post-process
-    # each Makefile.in and add a new line on top of each file to say so.
-    # Grep'ing the whole file is not good either: AIX grep has a line
-    # limit of 2048, but all sed's we know have understand at least 4000.
-    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-      dirpart=`$as_dirname -- "$mf" ||
-$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$mf" : 'X\(//\)[^/]' \| \
-	 X"$mf" : 'X\(//\)$' \| \
-	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$mf" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-    else
-      continue
-    fi
-    # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
-    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-    test -z "$DEPDIR" && continue
-    am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
-    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
-    # Find all dependency output files, they are included files with
-    # $(DEPDIR) in their names.  We invoke sed twice because it is the
-    # simplest approach to changing $(DEPDIR) to its actual value in the
-    # expansion.
-    for file in `sed -n "
-      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-      # Make sure the directory exists.
-      test -f "$dirpart/$file" && continue
-      fdir=`$as_dirname -- "$file" ||
-$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$file" : 'X\(//\)[^/]' \| \
-	 X"$file" : 'X\(//\)$' \| \
-	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      as_dir=$dirpart/$fdir; as_fn_mkdir_p
-      # echo "creating $dirpart/$file"
-      echo '# dummy' > "$dirpart/$file"
-    done
-  done
-}
- ;;
-    "libtool":C)
-
-    # See if we are running on zsh, and set the options which allow our
-    # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
-      setopt NO_GLOB_SUBST
-    fi
-
-    cfgfile="${ofile}T"
-    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
-    $RM "$cfgfile"
-
-    cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $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.
-#
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010 Free Software Foundation,
-#                 Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-
-# The names of the tagged configurations supported by this script.
-available_tags=""
-
-# ### BEGIN LIBTOOL CONFIG
-
-# Which release of libtool.m4 was used?
-macro_version=$macro_version
-macro_revision=$macro_revision
-
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
-
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
-
-# What type of objects to build.
-pic_mode=$pic_mode
-
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
-
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
-
-# An echo program that protects backslashes.
-ECHO=$lt_ECHO
-
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
-
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
-
-# A sed program that does not truncate output.
-SED=$lt_SED
-
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="\$SED -e 1s/^X//"
-
-# A grep program that handles long lines.
-GREP=$lt_GREP
-
-# An ERE matcher.
-EGREP=$lt_EGREP
-
-# A literal string matcher.
-FGREP=$lt_FGREP
-
-# A BSD- or MS-compatible name lister.
-NM=$lt_NM
-
-# Whether we need soft or hard links.
-LN_S=$lt_LN_S
-
-# What is the maximum length of a command?
-max_cmd_len=$max_cmd_len
-
-# Object file suffix (normally "o").
-objext=$ac_objext
-
-# Executable file suffix (normally "").
-exeext=$exeext
-
-# whether the shell understands "unset".
-lt_unset=$lt_unset
-
-# turn spaces into newlines.
-SP2NL=$lt_lt_SP2NL
-
-# turn newlines into spaces.
-NL2SP=$lt_lt_NL2SP
-
-# An object symbol dumper.
-OBJDUMP=$lt_OBJDUMP
-
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
-
-# Command to use when deplibs_check_method == "file_magic".
-file_magic_cmd=$lt_file_magic_cmd
-
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
-
-# A symbol stripping program.
-STRIP=$lt_STRIP
-
-# Commands used to install an old-style archive.
-RANLIB=$lt_RANLIB
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
-
-# Whether to use a lock for old archive extraction.
-lock_old_archive_extraction=$lock_old_archive_extraction
-
-# A C compiler.
-LTCC=$lt_CC
-
-# LTCC compiler flags.
-LTCFLAGS=$lt_CFLAGS
-
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
-
-# Transform the output of nm in a proper C declaration.
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
-
-# Transform the output of nm in a C name address pair.
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
-
-# Transform the output of nm in a C name address pair when lib prefix is needed.
-global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
-
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
-
-# Used to examine libraries when file_magic_cmd begins with "file".
-MAGIC_CMD=$MAGIC_CMD
-
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
-
-# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
-DSYMUTIL=$lt_DSYMUTIL
-
-# Tool to change global to local symbols on Mac OS X.
-NMEDIT=$lt_NMEDIT
-
-# Tool to manipulate fat objects and archives on Mac OS X.
-LIPO=$lt_LIPO
-
-# ldd/readelf like tool for Mach-O binaries on Mac OS X.
-OTOOL=$lt_OTOOL
-
-# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
-OTOOL64=$lt_OTOOL64
-
-# Old archive suffix (normally "a").
-libext=$libext
-
-# Shared library suffix (normally ".so").
-shrext_cmds=$lt_shrext_cmds
-
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
-
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at link time.
-variables_saved_for_relink=$lt_variables_saved_for_relink
-
-# Do we need the "lib" prefix for modules?
-need_lib_prefix=$need_lib_prefix
-
-# Do we need a version for libraries?
-need_version=$need_version
-
-# Library versioning type.
-version_type=$version_type
-
-# Shared library runtime path variable.
-runpath_var=$runpath_var
-
-# Shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
-
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
-
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME
-library_names_spec=$lt_library_names_spec
-
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
-
-# Permission mode override for installation of shared libraries.
-install_override_mode=$lt_install_override_mode
-
-# Command to use after installation of a shared archive.
-postinstall_cmds=$lt_postinstall_cmds
-
-# Command to use after uninstallation of a shared archive.
-postuninstall_cmds=$lt_postuninstall_cmds
-
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
-
-# As "finish_cmds", except a single script fragment to be evaled but
-# not shown.
-finish_eval=$lt_finish_eval
-
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
-
-# Compile-time system search path for libraries.
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
-
-# Run-time system search path for libraries.
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
-
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
-
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
-
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
-
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
-
-
-# The linker used to build libraries.
-LD=$lt_LD
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
-
-# Commands used to build an old-style archive.
-old_archive_cmds=$lt_old_archive_cmds
-
-# A language specific compiler.
-CC=$lt_compiler
-
-# Is the compiler the GNU compiler?
-with_gcc=$GCC
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
-
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc
-
-# Whether or not to disallow shared libs when runtime libs are static.
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec
-
-# Whether the compiler copes with passing no objects directly.
-compiler_needs_object=$lt_compiler_needs_object
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
-
-# Commands used to build a shared archive.
-archive_cmds=$lt_archive_cmds
-archive_expsym_cmds=$lt_archive_expsym_cmds
-
-# Commands used to build a loadable module if different from building
-# a shared archive.
-module_cmds=$lt_module_cmds
-module_expsym_cmds=$lt_module_expsym_cmds
-
-# Whether we are building with GNU ld or not.
-with_gnu_ld=$lt_with_gnu_ld
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag
-
-# Flag that enforces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
-
-# If ld is used when linking, flag to hardcode \$libdir into a binary
-# during linking.  This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
-
-# Whether we need a single "-rpath" flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary.
-hardcode_direct=$hardcode_direct
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
-# library is relocated.
-hardcode_direct_absolute=$hardcode_direct_absolute
-
-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-# into the resulting binary.
-hardcode_minus_L=$hardcode_minus_L
-
-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-# into the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var
-
-# Set to "yes" if building a shared library automatically hardcodes DIR
-# into the library and all subsequent libraries and executables linked
-# against it.
-hardcode_automatic=$hardcode_automatic
-
-# Set to yes if linker adds runtime paths of dependent libraries
-# to runtime path list.
-inherit_rpath=$inherit_rpath
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs
-
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path=$lt_fix_srcfile_path
-
-# Set to "yes" if exported symbols are required.
-always_export_symbols=$always_export_symbols
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms
-
-# Commands necessary for linking programs (against libraries) with templates.
-prelink_cmds=$lt_prelink_cmds
-
-# Specify filename containing input files.
-file_list_spec=$lt_file_list_spec
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action
-
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
-  case $host_os in
-  aix3*)
-    cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-_LT_EOF
-    ;;
-  esac
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  case $xsi_shell in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result="${1##*/}"
-}
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-  func_basename_result="${1##*/}"
-}
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-func_stripname ()
-{
-  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-  # positional parameters, so assign one to ordinary parameter first.
-  func_stripname_result=${3}
-  func_stripname_result=${func_stripname_result#"${1}"}
-  func_stripname_result=${func_stripname_result%"${2}"}
-}
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=${1%%=*}
-  func_opt_split_arg=${1#*=}
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  case ${1} in
-    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-    *)    func_lo2o_result=${1} ;;
-  esac
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=${1%.*}.lo
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=$(( $* ))
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=${#1}
-}
-
-_LT_EOF
-    ;;
-  *) # Bourne compatible functions.
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result=`$ECHO "${1}" | $SED "$basename"`
-}
-
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-  case ${2} in
-    .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-    *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
-  esac
-}
-
-# sed scripts:
-my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q'
-my_sed_long_arg='1s/^-[^=]*=//'
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=`$ECHO "${1}" | $SED "$my_sed_long_opt"`
-  func_opt_split_arg=`$ECHO "${1}" | $SED "$my_sed_long_arg"`
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=`expr "$@"`
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
-}
-
-_LT_EOF
-esac
-
-case $lt_shell_append in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$1+=\$2"
-}
-_LT_EOF
-    ;;
-  *)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$1=\$$1\$2"
-}
-
-_LT_EOF
-    ;;
-  esac
-
-
-  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  mv -f "$cfgfile" "$ofile" ||
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
-
- ;;
-    "$ax_create_pkgconfig_generate":C)
-pkgconfig_generate="$ax_create_pkgconfig_generate"
-if test ! -f "$pkgconfig_generate.in"
-then generate="true"
-elif grep ' generated by configure ' $pkgconfig_generate.in >/dev/null
-then generate="true"
-else generate="false";
-fi
-if $generate ; then
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $pkgconfig_generate.in" >&5
-$as_echo "$as_me: creating $pkgconfig_generate.in" >&6;}
-cat > $pkgconfig_generate.in <<AXEOF
-# generated by configure / remove this line to disable regeneration
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-bindir=@bindir@
-libdir=@libdir@
-datarootdir=@datarootdir@
-datadir=@datadir@
-sysconfdir=@sysconfdir@
-includedir=@includedir@
-package=@PACKAGE@
-suffix=@suffix@
-
-Name: @PACKAGE_NAME@
-Description: @PACKAGE_DESCRIPTION@
-Version: @PACKAGE_VERSION@
-Requires: @PACKAGE_REQUIRES@
-Libs: -L\${libdir} @LDFLAGS@ @LIBS@
-Cflags: -I\${includedir} @CPPFLAGS@
-AXEOF
-fi # DONE generate $pkgconfig_generate.in
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $pkgconfig_generate" >&5
-$as_echo "$as_me: creating $pkgconfig_generate" >&6;}
-cat >conftest.sed <<AXEOF
-s|@prefix@|${pkgconfig_prefix}|
-s|@exec_prefix@|${pkgconfig_execprefix}|
-s|@bindir@|${pkgconfig_bindir}|
-s|@libdir@|${pkgconfig_libdir}|
-s|@datarootdir@|${pkgconfig_datarootdir}|
-s|@datadir@|${pkgconfig_datadir}|
-s|@sysconfdir@|${pkgconfig_sysconfdir}|
-s|@includedir@|${pkgconfig_includedir}|
-s|@suffix@|${pkgconfig_suffix}|
-s|@PACKAGE@|${pkgconfig_package}|
-s|@PACKAGE_NAME@|${pkgconfig_libname}|
-s|@PACKAGE_DESCRIPTION@|${pkgconfig_description}|
-s|@PACKAGE_VERSION@|${pkgconfig_version}|
-s|@PACKAGE_REQUIRES@|${pkgconfig_requires}|
-s|@LIBS@|${pkgconfig_libs}|
-s|@LDFLAGS@|${pkgconfig_ldflags}|
-s|@CPPFLAGS@|${pkgconfig_cppflags}|
-AXEOF
-sed -f conftest.sed  $pkgconfig_generate.in > $pkgconfig_generate
-if test ! -s $pkgconfig_generate ; then
-    as_fn_error "$pkgconfig_generate is empty" "$LINENO" 5
-fi ; rm conftest.sed # DONE generate $pkgconfig_generate
-pkgconfig_uninstalled=`echo $pkgconfig_generate |sed 's/.pc$/-uninstalled.pc/'`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $pkgconfig_uninstalled" >&5
-$as_echo "$as_me: creating $pkgconfig_uninstalled" >&6;}
-cat >conftest.sed <<AXEOF
-s|@prefix@|${pkgconfig_prefix}|
-s|@exec_prefix@|${pkgconfig_execprefix}|
-s|@bindir@|${pkgconfig_bindir}|
-s|@libdir@|${pkgconfig_src_libdir}|
-s|@datarootdir@|${pkgconfig_datarootdir}|
-s|@datadir@|${pkgconfig_datadir}|
-s|@sysconfdir@|${pkgconfig_sysconfdir}|
-s|@includedir@|${pkgconfig_src_headers}|
-s|@suffix@|${pkgconfig_suffix}|
-s|@PACKAGE@|${pkgconfig_package}|
-s|@PACKAGE_NAME@|${pkgconfig_libname}|
-s|@PACKAGE_DESCRIPTION@|${pkgconfig_description}|
-s|@PACKAGE_VERSION@|${pkgconfig_version}|
-s|@PACKAGE_REQUIRES@|${pkgconfig_requires}|
-s|@LIBS@|${pkgconfig_libs}|
-s|@LDFLAGS@|${pkgconfig_ldflags}|
-s|@CPPFLAGS@|${pkgconfig_cppflags}|
-AXEOF
-sed -f conftest.sed $pkgconfig_generate.in > $pkgconfig_uninstalled
-if test ! -s $pkgconfig_uninstalled ; then
-    as_fn_error "$pkgconfig_uninstalled is empty" "$LINENO" 5
-fi ; rm conftest.sed # DONE generate $pkgconfig_uninstalled
-           pkgconfig_requires_add=`echo ${pkgconfig_requires}`
-if test ".$pkgconfig_requires_add" != "." ; then
-           pkgconfig_requires_add="pkg-config $pkgconfig_requires_add"
-    else   pkgconfig_requires_add=":" ; fi
-pkgconfig_uninstalled=`echo $pkgconfig_generate |sed 's/.pc$/-uninstalled.sh/'`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $pkgconfig_uninstalled" >&5
-$as_echo "$as_me: creating $pkgconfig_uninstalled" >&6;}
-cat >conftest.sed <<AXEOF
-s|@prefix@|\"${pkgconfig_prefix}\"|
-s|@exec_prefix@|\"${pkgconfig_execprefix}\"|
-s|@bindir@|\"${pkgconfig_bindir}\"|
-s|@libdir@|\"${pkgconfig_src_libdir}\"|
-s|@datarootdir@|\"${pkgconfig_datarootdir}\"|
-s|@datadir@|\"${pkgconfig_datadir}\"|
-s|@sysconfdir@|\"${pkgconfig_sysconfdir}\"|
-s|@includedir@|\"${pkgconfig_src_headers}\"|
-s|@suffix@|\"${pkgconfig_suffix}\"|
-s|@PACKAGE@|\"${pkgconfig_package}\"|
-s|@PACKAGE_NAME@|\"${pkgconfig_libname}\"|
-s|@PACKAGE_DESCRIPTION@|\"${pkgconfig_description}\"|
-s|@PACKAGE_VERSION@|\"${pkgconfig_version}\"|
-s|@PACKAGE_REQUIRES@|\"${pkgconfig_requires}\"|
-s|@LIBS@|\"${pkgconfig_libs}\"|
-s|@LDFLAGS@|\"${pkgconfig_ldflags}\"|
-s|@CPPFLAGS@|\"${pkgconfig_cppflags}\"|
-s>Name:>for option\\; do case \"\$option\" in --list-all|--name) echo >
-s>Description: *>\\;\\; --help) pkg-config --help \\; echo Buildscript Of >
-s>Version: *>\\;\\; --modversion|--version) echo >
-s>Requires:>\\;\\; --requires) echo $pkgconfig_requires_add>
-s>Libs: *>\\;\\; --libs) echo >
-s>Cflags: *>\\;\\; --cflags) echo >
-/--libs)/a\\
-       $pkgconfig_requires_add
-/--cflags)/a\\
-       $pkgconfig_requires_add\\
-;; --variable=*) eval echo '\$'\`echo \$option | sed -e 's/.*=//'\`\\
-;; --uninstalled) exit 0 \\
-;; *) ;; esac done
-AXEOF
-sed -f conftest.sed  $pkgconfig_generate.in > $pkgconfig_uninstalled
-if test ! -s $pkgconfig_uninstalled ; then
-    as_fn_error "$pkgconfig_uninstalled is empty" "$LINENO" 5
-fi ; rm conftest.sed # DONE generate $pkgconfig_uninstalled
- ;;
-    "genversion.sh":F) chmod +x genversion.sh ;;
-    "version.h":C) echo '#define CLOOG_HEAD "'`./genversion.sh`'"' > version.h ;;
-    "doc/gitversion.texi":C) echo '@set VERSION '`./genversion.sh`'' > doc/gitversion.texi ;;
-
-  esac
-done # for ac_tag
-
-
-as_fn_exit 0
-_ACEOF
-ac_clean_files=$ac_clean_files_save
-
-test $ac_write_fail = 0 ||
-  as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5
-
-
-	ac_configure_args="$ac_configure_args $cloog_configure_args"
-
-
-# configure is writing to config.log, and then calls config.status.
-# config.status does its own redirection, appending to config.log.
-# Unfortunately, on DOS this fails, as config.log is still kept open
-# by configure, so config.status won't be able to write to it; its
-# output is simply discarded.  So we exec the FD to /dev/null,
-# effectively closing config.log, so it can be properly (re)opened and
-# appended to by config.status.  When coming back to configure, we
-# need to make the FD available again.
-if test "$no_create" != yes; then
-  ac_cs_success=:
-  ac_config_status_args=
-  test "$silent" = yes &&
-    ac_config_status_args="$ac_config_status_args --quiet"
-  exec 5>/dev/null
-  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
-  exec 5>>config.log
-  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
-  # would make configure fail if this is the last instruction.
-  $ac_cs_success || as_fn_exit $?
-fi
-
-#
-# CONFIG_SUBDIRS section.
-#
-if test "$no_recursion" != yes; then
-
-  # Remove --cache-file, --srcdir, and --disable-option-checking arguments
-  # so they do not pile up.
-  ac_sub_configure_args=
-  ac_prev=
-  eval "set x $ac_configure_args"
-  shift
-  for ac_arg
-  do
-    if test -n "$ac_prev"; then
-      ac_prev=
-      continue
-    fi
-    case $ac_arg in
-    -cache-file | --cache-file | --cache-fil | --cache-fi \
-    | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-      ac_prev=cache_file ;;
-    -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-    | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \
-    | --c=*)
-      ;;
-    --config-cache | -C)
-      ;;
-    -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-      ac_prev=srcdir ;;
-    -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-      ;;
-    -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-      ac_prev=prefix ;;
-    -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-      ;;
-    --disable-option-checking)
-      ;;
-    *)
-      case $ac_arg in
-      *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
-      esac
-      as_fn_append ac_sub_configure_args " '$ac_arg'" ;;
-    esac
-  done
-
-  # Always prepend --prefix to ensure using the same prefix
-  # in subdir configurations.
-  ac_arg="--prefix=$prefix"
-  case $ac_arg in
-  *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
-  esac
-  ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args"
-
-  # Pass --silent
-  if test "$silent" = yes; then
-    ac_sub_configure_args="--silent $ac_sub_configure_args"
-  fi
-
-  # Always prepend --disable-option-checking to silence warnings, since
-  # different subdirs can have different --enable and --with options.
-  ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args"
-
-  ac_popdir=`pwd`
-  for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue
-
-    # Do not complain, so a configure script can configure whichever
-    # parts of a large source tree are present.
-    test -d "$srcdir/$ac_dir" || continue
-
-    ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)"
-    $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5
-    $as_echo "$ac_msg" >&6
-    as_dir="$ac_dir"; as_fn_mkdir_p
-    ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-
-    cd "$ac_dir"
-
-    # Check for guested configure; otherwise get Cygnus style configure.
-    if test -f "$ac_srcdir/configure.gnu"; then
-      ac_sub_configure=$ac_srcdir/configure.gnu
-    elif test -f "$ac_srcdir/configure"; then
-      ac_sub_configure=$ac_srcdir/configure
-    elif test -f "$ac_srcdir/configure.in"; then
-      # This should be Cygnus configure.
-      ac_sub_configure=$ac_aux_dir/configure
-    else
-      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5
-$as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;}
-      ac_sub_configure=
-    fi
-
-    # The recursion is here.
-    if test -n "$ac_sub_configure"; then
-      # Make the cache file name correct relative to the subdirectory.
-      case $cache_file in
-      [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;;
-      *) # Relative name.
-	ac_sub_cache_file=$ac_top_build_prefix$cache_file ;;
-      esac
-
-      { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5
-$as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;}
-      # The eval makes quoting arguments work.
-      eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \
-	   --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" ||
-	as_fn_error "$ac_sub_configure failed for $ac_dir" "$LINENO" 5
-    fi
-
-    cd "$ac_popdir"
-  done
-fi
-if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
-fi
-
-
-
-echo "             /*-----------------------------------------------*"
-echo "              *           CLooG configuration is OK           *"
-echo "              *-----------------------------------------------*/"
-echo "It appears that your system is OK to start CLooG compilation. You need"
-echo "now to type \"make\". After compilation, you should check CLooG by typing"
-echo "\"make check\". If no problem occur, you can type \"make uninstall\" if"
-echo "you are upgrading an old version. Lastly type \"make install\" to install"
-echo "CLooG on your system (log as root if necessary)."
diff --git a/cloog-0.16.3/configure.ac b/cloog-0.16.3/configure.ac
deleted file mode 100644
index 053685a..0000000
--- a/cloog-0.16.3/configure.ac
+++ /dev/null
@@ -1,222 +0,0 @@
-
-dnl /**-------------------------------------------------------------------**
-dnl  **                              CLooG                                **
-dnl  **-------------------------------------------------------------------**
-dnl  **                           configure.ac                            **
-dnl  **-------------------------------------------------------------------**
-dnl  **                   First version: august 7th 2002                  **
-dnl  **-------------------------------------------------------------------**/
-dnl
-dnl Input file for autoconf to build a configuration shellscript.
-dnl To build the configure script from the CLooG's top-level directory, use
-dnl autoconf -l autoconf autoconf/configure.in > configure
-dnl if it doesn't work (invalid option -l) try -I instead
-dnl autoconf -I autoconf autoconf/configure.in > configure
-
-dnl /**************************************************************************
-dnl *               CLooG : the Chunky Loop Generator (experimental)          *
-dnl ***************************************************************************
-dnl *                                                                         *
-dnl * Copyright (C) 2001 Cedric Bastoul                                       *
-dnl *                                                                         *
-dnl * This library is free software; you can redistribute it and/or           *
-dnl * modify it under the terms of the GNU Lesser General Public              *
-dnl * License as published by the Free Software Foundation; either            *
-dnl * version 2.1 of the License, or (at your option) any later version.      *
-dnl *                                                                         *
-dnl * This library is distributed in the hope that it will be useful,         *
-dnl * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
-dnl * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU       *
-dnl * Lesser General Public License for more details.                         *
-dnl *                                                                         *
-dnl * You should have received a copy of the GNU Lesser General Public        *
-dnl * License along with this library; if not, write to the Free Software     *
-dnl * Foundation, Inc., 51 Franklin Street, Fifth Floor,                      *
-dnl * Boston, MA  02110-1301  USA                                             *
-dnl *                                                                         *
-dnl * CLooG, the Chunky Loop Generator                                        *
-dnl * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                      *
-dnl *                                                                         *
-dnl ***************************************************************************/
-
-m4_define([version_major], [0])
-m4_define([version_minor], [16])
-m4_define([version_revision], [3])
-
-AC_PREREQ(2.53)
-AC_INIT([cloog], [version_major.version_minor.version_revision],
-	[cloog-development@googlegroups.com])
-AC_CONFIG_SRCDIR(source/cloog.c)
-AC_CONFIG_AUX_DIR(autoconf)
-AC_CONFIG_MACRO_DIR([m4])
-
-VERSION_MAJOR=version_major
-VERSION_MINOR=version_minor
-VERSION_REVISION=version_revision
-AC_SUBST(versioninfo)
-versioninfo=2:0:0
-
-AM_INIT_AUTOMAKE([foreign])
-m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
-
-dnl /**************************************************************************
-dnl  *                              Checking                                  *
-dnl  **************************************************************************/
-
-dnl Checks for programs.
-AC_PROG_CC
-AC_PROG_LN_S
-AC_PROG_MAKE_SET
-AC_CHECK_PROG(CD, cd)
-dnl Configure needs an empty install.sh file with this, i HATE that...
-AC_PROG_INSTALL
-AC_PROG_LIBTOOL
-AC_CHECK_PROG(TEXI2DVI, texi2dvi, texi2dvi, [])
-AM_CONDITIONAL(HAVE_TEXI2DVI, test -n "$TEXI2DVI")
-
-AX_CC_MAXOPT
-AC_SUBST(CFLAGS_WARN)
-AX_CFLAGS_WARN_ALL(CFLAGS_WARN)
-
-dnl Checks for typedefs, structures, and compiler characteristics.
-AC_C_CONST
-AC_TYPE_SIZE_T
-
-
-
-dnl Checks for header files.
-AC_HEADER_STDC
-
-
-dnl Checks for library functions.
-AC_CHECK_FUNCS(strtol)
-
-
-dnl /**************************************************************************
-dnl  *                             Option setting                             *
-dnl  **************************************************************************/
-
-AC_CHECK_HEADERS([sys/resource.h],
-	[AC_DEFINE([CLOOG_RUSAGE], [], [Print time required to generate code])])
-
-AX_SUBMODULE(isl,no|system|build|bundled,bundled)
-BITS="gmp"
-
-dnl /**************************************************************************
-dnl  *                            Where is GMP?                               *
-dnl  **************************************************************************/
-
-AX_SUBMODULE(gmp,system,system)
-
-need_get_memory_functions=false
-case "$with_gmp" in
-system)
-    if test "x$with_gmp_prefix" != "x"; then
-	CPPFLAGS="-I$with_gmp_prefix/include $CPPFLAGS"
-    fi
-    
-    if test "$with_gmp_exec_prefix" != "yes" ; then
-	LDFLAGS="-L$with_gmp_exec_prefix/lib $LDFLAGS"
-    fi
-     
-    AC_CHECK_HEADER(gmp.h,
-                    [],
-                    [AC_MSG_ERROR(Can't find gmp headers.)])
-    AC_CHECK_LIB(gmp,
-                 __gmpz_init,
-                 [LIBS="$LIBS -lgmp"],
-                 [AC_MSG_ERROR(Can't find gmp library.)])
-    AC_CHECK_DECLS(mp_get_memory_functions,[],[
-	    need_get_memory_functions=true
-    ],[#include <gmp.h>])
-    ;;
-esac
-AM_CONDITIONAL(NEED_GET_MEMORY_FUNCTIONS,
-		test x$need_get_memory_functions = xtrue)
-
-dnl /**************************************************************************
-dnl  *                          Where is isl?                                 *
-dnl  **************************************************************************/
-
-AC_SUBST(ISL_CPPFLAGS)
-AC_SUBST(ISL_LDFLAGS)
-AC_SUBST(ISL_LIBS)
-case "$with_isl" in
-bundled)
-	ISL_CPPFLAGS="-I$srcdir/isl/include -Iisl/include"
-	;;
-build)
-	ISL_CPPFLAGS="-I$isl_srcdir/include -I$with_isl_builddir/include"
-	ISL_LIBS="$with_isl_builddir/libisl.la"
-	;;
-system)
-	if test "x$with_isl_prefix" != "x"; then
-		ISL_CPPFLAGS="-I$with_isl_prefix/include"
-	fi
-	if test "x$with_isl_exec_prefix" != "x"; then
-		ISL_LDFLAGS="-L$with_isl_exec_prefix/lib"
-	fi
-	ISL_LIBS="-lisl"
-esac
-AM_CONDITIONAL(BUNDLED_ISL, test $with_isl = bundled)
-AM_CONDITIONAL(NO_ISL, test $with_isl = no)
-
-
-AC_DEFINE([CLOOG_INT_GMP], 1, [Use arbitrary precision integers])
-
-AC_SUBST(GIT_INDEX)
-if test -f $srcdir/.git/HEAD; then
-	GIT_INDEX="\$(top_srcdir)/.git/index"
-fi
-
-
-dnl /**************************************************************************
-dnl  *                            Substitutions                               *
-dnl  **************************************************************************/
-
-
-dnl Substitutions to do in Makefile.in.
-AC_SUBST(CC)
-AC_SUBST(LN_S)
-
-AC_SUBST(prefix)
-AC_SUBST(exec_prefix)
-AC_SUBST(INSTALL)
-
-AC_SUBST(BITS)
-
-AC_SUBST(VERSION_MAJOR)
-AC_SUBST(VERSION_MINOR)
-AC_SUBST(VERSION_REVISION)
-
-PACKAGE_NAME="cloog-isl"
-PACKAGE_CFLAGS="-DCLOOG_INT_GMP=1"
-AX_CREATE_PKGCONFIG_INFO
-
-AC_CONFIG_FILES(Makefile test/Makefile)
-AC_CONFIG_FILES(autoconf/Doxyfile)
-AC_CONFIG_FILES(doc/Makefile)
-AC_CONFIG_FILES(source/version.c)
-AC_CONFIG_FILES(include/cloog/version.h)
-AC_CONFIG_FILES([genversion.sh], [chmod +x genversion.sh])
-AC_CONFIG_COMMANDS([version.h],
-	[echo '#define CLOOG_HEAD "'`./genversion.sh`'"' > version.h])
-AC_CONFIG_COMMANDS([doc/gitversion.texi],
-	[echo '@set VERSION '`./genversion.sh`'' > doc/gitversion.texi])
-if test $with_isl = bundled; then
-	AC_CONFIG_SUBDIRS(isl)
-fi
-AC_CONFIG_COMMANDS_POST([
-	ac_configure_args="$ac_configure_args $cloog_configure_args"
-])
-AC_OUTPUT
-
-
-echo "             /*-----------------------------------------------*"
-echo "              *           CLooG configuration is OK           *"
-echo "              *-----------------------------------------------*/"
-echo "It appears that your system is OK to start CLooG compilation. You need"
-echo "now to type \"make\". After compilation, you should check CLooG by typing"
-echo "\"make check\". If no problem occur, you can type \"make uninstall\" if"
-echo "you are upgrading an old version. Lastly type \"make install\" to install"
-echo "CLooG on your system (log as root if necessary)."
diff --git a/cloog-0.16.3/doc/Makefile.am b/cloog-0.16.3/doc/Makefile.am
deleted file mode 100644
index 160dfd1..0000000
--- a/cloog-0.16.3/doc/Makefile.am
+++ /dev/null
@@ -1,7 +0,0 @@
-if HAVE_TEXI2DVI
-cloog.pdf: cloog.texi gitversion.texi
-	$(TEXI2DVI) --pdf $<
-endif
-
-gitversion.texi: @GIT_INDEX@
-	echo '@set VERSION '`$(top_builddir)/genversion.sh`'' > $@
diff --git a/cloog-0.16.3/doc/Makefile.in b/cloog-0.16.3/doc/Makefile.in
deleted file mode 100644
index 91b9aa5..0000000
--- a/cloog-0.16.3/doc/Makefile.in
+++ /dev/null
@@ -1,383 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = doc
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in TODO
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cc_maxopt.m4 \
-	$(top_srcdir)/m4/ax_cflags_warn_all.m4 \
-	$(top_srcdir)/m4/ax_check_compiler_flags.m4 \
-	$(top_srcdir)/m4/ax_compiler_vendor.m4 \
-	$(top_srcdir)/m4/ax_create_pkgconfig_info.m4 \
-	$(top_srcdir)/m4/ax_gcc_archflag.m4 \
-	$(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \
-	$(top_srcdir)/m4/ax_submodule.m4 $(top_srcdir)/m4/libtool.m4 \
-	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
-SOURCES =
-DIST_SOURCES =
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BITS = @BITS@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CD = @CD@
-CFLAGS = @CFLAGS@
-CFLAGS_WARN = @CFLAGS_WARN@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GIT_INDEX = @GIT_INDEX@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-ISL_CPPFLAGS = @ISL_CPPFLAGS@
-ISL_LDFLAGS = @ISL_LDFLAGS@
-ISL_LIBS = @ISL_LIBS@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PRTDIAG = @PRTDIAG@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TEXI2DVI = @TEXI2DVI@
-VERSION = @VERSION@
-VERSION_MAJOR = @VERSION_MAJOR@
-VERSION_MINOR = @VERSION_MINOR@
-VERSION_REVISION = @VERSION_REVISION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-pkgconfig_libdir = @pkgconfig_libdir@
-pkgconfig_libfile = @pkgconfig_libfile@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-subdirs = @subdirs@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-versioninfo = @versioninfo@
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign doc/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-	distclean distclean-generic distclean-libtool distdir dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-man install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
-
-@HAVE_TEXI2DVI_TRUE@cloog.pdf: cloog.texi gitversion.texi
-@HAVE_TEXI2DVI_TRUE@	$(TEXI2DVI) --pdf $<
-
-gitversion.texi: @GIT_INDEX@
-	echo '@set VERSION '`$(top_builddir)/genversion.sh`'' > $@
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/cloog-0.16.3/doc/TODO b/cloog-0.16.3/doc/TODO
deleted file mode 100644
index 152c82d..0000000
--- a/cloog-0.16.3/doc/TODO
+++ /dev/null
@@ -1,58 +0,0 @@
-#
-#  /**-------------------------------------------------------------------**
-#   **                              CLooG                                **
-#   **-------------------------------------------------------------------**
-#   **                     The Chunky Loop Generator                     **
-#   **-------------------------------------------------------------------**
-#   **            First version of this file: april 29th 2005            **
-#   **-------------------------------------------------------------------**/
-#
-
-This file is mainly for the authors, in order to put ideas, requests, and
-work-in-progress notes.
-
-#   **-------------------------------------------------------------------**
-#   **                       I. Requested features                       **
-#   **-------------------------------------------------------------------**/
-
-1. GMP !!! (LooPo Team).
-DOOOOOOOOOOOOOOOOOOOOOOOOONE !!!!!!!!!!!!!!!!!
-
-2. Set the statement prefix (Michael Classen).
-
-3. Do not fuse the iterators/scattering dimension names lists (Hadda Cheroun).
-DOOOOOOOOOOOOOOOOOOOOOOOOONE !!!!!!!!!!!!!!!!!
-
-4. Exploit URUK transformation properties (WRAP-IT Team).
-DOOOOOOOOOOOOOOOOOOOOOOOOONE !!!!!!!!!!!!!!!!!
-
-
-#   **-------------------------------------------------------------------**
-#   **                         II. Known bugs                            **
-#   **-------------------------------------------------------------------**/
-
-1. Lead to segfault :
-cloog ./test/daegon_lu_osp.cloog -f 3 -l 6 -nobacktrack -override
-(while every other -l values do not !)
-DOOOOOOOOOOOOOOOOOOOOOOOOONE !!!!!!!!!!!!!!!!!
-
-2. -strides gives bad result for a dreamup or interpolation-duration file in
-test/non_optimal (I don't remember which one)
-
-3. Various configure problems (check Sylvain Girbal mails in the mailbox !).
-DOOOOOOOOOOOOOOOOOOOOOOOOONE !!!!!!!!!!!!!!!!!
-
-4. With GMP, try test/emploi.cloog (with valgrind): a memory leak...
-DOOOOOOOOOOOOOOOOOOOOOOOOONE !!!!!!!!!!!!!!!!!
-
-5. With GMP, option -cpp do not write all the statement internal stuff
-(e.g., S1(,,) ; instead of S1(i,j,k) ;).
-DOOOOOOOOOOOOOOOOOOOOOOOOONE !!!!!!!!!!!!!!!!!
-
-#   **-------------------------------------------------------------------**
-#   **                        III. Various notes                         **
-#   **-------------------------------------------------------------------**/
-
-Kill the cat.
-
-
diff --git a/cloog-0.16.3/doc/cloog.pdf b/cloog-0.16.3/doc/cloog.pdf
deleted file mode 100644
index 2f02793..0000000
--- a/cloog-0.16.3/doc/cloog.pdf
+++ /dev/null
Binary files differ
diff --git a/cloog-0.16.3/doc/cloog.texi b/cloog-0.16.3/doc/cloog.texi
deleted file mode 100644
index 8fbc1dc..0000000
--- a/cloog-0.16.3/doc/cloog.texi
+++ /dev/null
@@ -1,2542 +0,0 @@
-\input texinfo
-@c %
-@c %  /**-----------------------------------------------------------------**
-@c %   **                              CLooG                              **
-@c %   **-----------------------------------------------------------------**
-@c %   **                            cloog.texi                           **
-@c %   **-----------------------------------------------------------------**
-@c %   **                   First version: july 6th 2002                  **
-@c %   **-----------------------------------------------------------------**/
-@c %
-@c % release 1.0: September 17th 2002
-@c % release 1.1: December   5th 2002
-@c % release 1.2: April     22th 2003
-@c % release 2.0: November  21th 2005 (and now in texinfo instead of LaTeX)
-@c % release 2.1: October   15th 2007
-@c %
-@c %/**************************************************************************
-@c % *               CLooG : the Chunky Loop Generator (experimental)         *
-@c % **************************************************************************/
-@c %/* CAUTION: the English used is probably the worst you ever read, please
-@c % *          feel free to correct and improve it !
-@c % */
-
-@c %\textit{"I found the ultimate transformation functions, optimization for
-@c %static control programs is now a closed problem, I have \textnormal{just}
-@c %to generate the target code !"} 
-
-
-
-@c % /*************************************************************************
-@c %  *                              PART I: HEADER                           *
-@c %  *************************************************************************/
-@c %**start of header
-@setfilename cloog.info
-@settitle CLooG - a loop generator for scanning polyhedra
-
-@set EDITION 2.1
-@include gitversion.texi
-@set UPDATED October 15th 2007
-@setchapternewpage odd
-
-@c %**end of header
-
-@c % /*************************************************************************
-@c %  *                 PART II: SUMMARY DESCRIPTION AND COPYRIGHT            *
-@c %  *************************************************************************/
-
-@copying
-This manual is for CLooG version @value{VERSION}, a software
-which generates loops for scanning Z-polyhedra. That is, CLooG produces a
-code visiting each integral point of a union of parametrized
-polyhedra. CLooG is designed to avoid control overhead and to produce a very
-efficient code.
-
-It would be quite kind to refer the following paper in any publication that
-results from the use of the CLooG software or its library:
-
-@example
-@@InProceedings@{Bas04,
-@ @ author =@ @ @ @ @{C. Bastoul@},
-@ @ title =@ @ @ @ @ @{Code Generation in the Polyhedral Model
-@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ Is Easier Than You Think@},
-@ @ booktitle = @{PACT'13 IEEE International Conference on
-@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ Parallel Architecture and Compilation Techniques@},
-@ @ year =@ @ @ @ @ @ 2004,
-@ @ pages =@ @ @ @ @ @{7--16@},
-@ @ month =@ @ @ @ @ @{september@},
-@ @ address =@ @ @ @{Juan-les-Pins@}
-@}
-@end example
-
-Copyright @copyright{} 2002-2005 C@'edric Bastoul.
-
-@c quotation
-Permission is granted to copy, distribute and/or modify this document under
-the terms of the GNU Free Documentation License, Version 1.2 
-published by the Free Software Foundation. To receive a copy of the
-GNU Free Documentation License, write to the Free Software Foundation, Inc.,
-59 Temple Place, Suite 330, Boston, MA  02111-1307 USA.
-@c end quotation
-@end copying
-
-@c % /*************************************************************************
-@c %  *                 PART III: TITLEPAGE, CONTENTS, COPYRIGHT              *
-@c %  *************************************************************************/
-@titlepage
-@title CLooG
-@subtitle A Loop Generator For Scanning Polyhedra
-@subtitle Edition @value{EDITION}, for CLooG @value{VERSION}
-@subtitle @value{UPDATED}
-@author C@'edric Bastoul
-     
-@c The following two commands start the copyright page.
-@page
-@noindent (September 2001)
-@table @code
-@item C@'edric Bastoul
-SCHEDULES GENERATE !!! I just need to apply them now, where can I find
-a good code generator ?!
-     
-@item Paul Feautrier
-Hmmm. I fear that if you want something powerful enough, you'll have to
-write it yourself !
-@end table
-
-@vskip 0pt plus 1filll
-@insertcopying
-@end titlepage
-     
-@c Output the table of contents at the beginning.
-@contents
-
-@c % /*************************************************************************
-@c %  *                     PART IV: TOP NODE AND MASTER MENU                 *
-@c %  *************************************************************************/
-@ifnottex
-@node Top
-@top CLooG
-     
-@insertcopying
-@end ifnottex
-
-@menu
-* Introduction::
-* CLooG Software::
-* CLooG Library::
-@c * Hacking::
-* Installing::
-* Documentation::
-* References::
-@end menu
- 
-
-
-@c % /*************************************************************************
-@c %  *                       PART V: BODY OF THE DOCUMENT                    *
-@c %  *************************************************************************/
-
-@c %  ****************************** INTRODUCTION ******************************
-@node Introduction
-@chapter Introduction
-CLooG is a free software and library generating loops for scanning Z-polyhedra.
-That is, it finds a code (e.g. in C, FORTRAN...) that reaches each integral
-point of one or more parameterized polyhedra. CLooG has been originally
-written to solve the code generation problem for optimizing compilers based on
-the polytope model. Nevertheless it is used now in various area, e.g., to build
-control automata for high-level synthesis or to find the best polynomial
-approximation of a function. CLooG may help in any situation where scanning
-polyhedra matters. It uses the best state-of-the-art code generation
-algorithm known as the Quiller@'e et al. algorithm (@pxref{Qui00})
-with our own improvements and extensions (@pxref{Bas04}).
-The user has full control on generated code quality.
-On one hand, generated code size has to be tuned for sake of
-readability or instruction cache use. On the other hand, we must ensure that
-a bad control management does not hamper performance of the generated code,
-for instance by producing redundant guards or complex loop bounds.
-CLooG is specially designed to avoid control overhead and to produce a very
-efficient code.
-
-CLooG stands for @emph{Chunky Loop Generator}: it is a part of the Chunky
-project, a research tool for data locality improvement (@pxref{Bas03a}).
-It is designed
-also to be the back-end of automatic parallelizers like LooPo (@pxref{Gri04}).
-Thus it is very
-compilable code oriented and provides powerful program transformation
-facilities. Mainly, it allows the user to specify very general schedules where, 
-e.g., unimodularity or invertibility of the transformation doesn't matter.
-
-The current version is still under
-evaluation, and there is no guarantee that the upward compatibility
-will be respected (but the previous API has been stable for two years,
-we hope this one will be as successful -and we believe it-).
-A lot of reports are necessary to freeze the library
-API and the input file shape. Most API changes from 0.12.x to 0.14.x
-have been requested by the users themselves.
-Thus you are very welcome and encouraged
-to post reports on bugs, wishes, critics, comments, suggestions or
-successful experiences in the forum of @code{http://www.CLooG.org}
-or to send them to cedric.bastoul@@inria.fr directly.
-
-@menu
-* Basics::
-* Scattering::
-@end menu
-
-@node Basics
-@section Basically, what's the point ?
-If you want to use CLooG, this is because you want to scan or to find
-something inside the integral points of a set of polyhedra. There are many
-reasons for that. Maybe you need the generated code itself because it
-actually implements a very smart program transformation you found.
-Maybe you want to use the generated code
-because you know that the solution of your problem belongs to the integral
-points of those damned polyhedra and you don't know which one. Maybe you just
-want to know if a polyhedron has integral points depending on some parameters,
-which is the lexicographic minimum, maximum, the third on the basis of the
-left etc. Probably you have your own reasons to use CLooG.
-
-Let us illustrate a basic use of CLooG. Suppose we have a set of affine
-constraints that describes a part of a whatever-dimensional space,
-called a @strong{domain}, and we
-want to scan it. Let us consider for instance the following set of constraints
-where @samp{i}
-and @samp{j} are the unknown (the two dimensions of the space) and
-@samp{m} and @samp{n} are the parameters (some symbolic constants):
-@example
-@group
-2<=i<=n
-2<=j<=m
-j<=n+2-i
-@end group
-@end example
-Let us also consider that we have a partial knowledge of the parameter values,
-called the @strong{context}, expressed as affine constraints as well,
-for instance:
-@example
-@group
-m>=2
-n>=2
-@end group
-@end example
-Note that using parameters is optional, if you are not comfortable with
-parameter manipulation, just replace them with any scalar value that fits
-@code{m>=2} and @code{n>=2}.
-A graphical representation of this part of the 2-dimensional space, where
-the integral points are represented using heavy dots would be for instance:
-
-@image{images/basic,6cm}
-
-The affine constraints of both the domain and the context are what we will
-provide to CLooG as input (in a particular shape that will be described later).
-The output of CLooG is a pseudo-code to scan the integral points of the
-input domain according to the context:
-@example
-@group
-for (i=2;i<=n;i++) @{
-  for (j=2;j<=min(m,-i+n+2);j++) @{    
-    S1(i,j) ;
-  @}
-@}
-@end group
-@end example
-If you felt such a basic example is yet interesting, there is a good chance
-that CLooG is appropriate for you. CLooG can do much more: scanning several
-polyhedra or unions of polyhedra at the same time, applying general affine
-transformations to the polyhedra, generate compilable code etc. Welcome
-to the CLooG's user's guide !
-
-@node Scattering
-@section Defining a Scanning Order: Scattering Functions
-In CLooG, domains only define the set of integral points to scan and their
-coordinates. In particular, CLooG is free to choose the scanning order for
-generating the most efficient code. This means, for optimizing/parallelizing
-compiler people, that CLooG doesn't make any speculation on dependences on and
-between statements (by the way, it's not its job !).
-For instance, if an user give to
-CLooG only two domains @code{S1:1<=i<=n}, @code{S2:1<=i<=n} and the context
-@code{n>=1}, the following pseudo-codes are considered to be equivalent:
-
-@example
-@group
-/* A convenient target pseudo-code. */
-for (i=1;i<=N;i++) @{
- S1(i) ;
-@}
-for (i=1;i<=N;i++) @{
- S2(i) ;
-@}
-@end group
-@end example
-
-@example
-@group
-/* Another convenient target pseudo-code. */
-for (i=1;i<=N;i++) @{
- S1(i) ;
- S2(i) ;
-@}
-@end group
-@end example
-
-The default behaviour
-of CLooG is to generate the second one, since it is optimized in control. 
-It is right if there are no data dependences
-between @code{S1} and @code{S2}, but wrong otherwise. 
-
-Thus it is often useful to force scanning to respect a given order. This can be
-done in CLooG by using @strong{scattering functions}. Scattering is a
-shortcut for scheduling, allocation, chunking functions and the like we can
-find in the restructuring compilation literature. There are a lot of reasons
-to scatter the integral points of the domains (i.e. the statement instances
-of a program, for compilation people), parallelization or optimization are good
-examples. For instance, if the user wants for any reason to set some
-precedence constraints between the statements of our example above
-in order to force the generation of the
-first code, he can do it easily by setting (for example) the following
-scheduling functions:
-
-@tex
-$$\theta _{S1}(i) =  (1)$$
-$$\theta _{S2}(j) =  (2)$$
-@end tex
-
-@ifnottex
-@example
-@group
-T_S1(i) = (1)
-T_S2(j) = (2)
-@end group
-@end example
-@end ifnottex
-
-This scattering means that each integral point of the domain @code{S1}
-is scanned at logical date @code{1} while each integral point of the domain
-@code{S2} is scanned at logical date @code{2}. As a result, the whole
-domain @code{S1} is scanned before domain @code{S2} and the first code in our
-example is generated.
-
-The user can set every kind of affine scanning order thanks to the
-scattering functions. Each domain has its own scattering function and
-each scattering function may be multi-dimensional. A multi-dimensional logical
-date may be seen as classical date (year,month,day,hour,minute,etc.) where
-the first dimensions are the most significant. Each scattering dimension
-may depend linearly on the original dimensions (e.g., @code{i}), the
-parameters (e.g., @code{n}) ans scalars (e.g., @code{2}).
-
-A very useful example of multi-dimensional scattering functions is, for
-compilation people, the scheduling of the original program.
-The basic data to use for code generation are statement iteration domains.
-As we saw, these data are not sufficient to rebuild the original
-program (what is the ordering between instances of different statements ?).
-The missing data can be put in the scattering functions as the original
-scheduling. The method to compute it is quite simple (@pxref{Fea92}). The idea is to
-build an abstract syntax tree of the program and to read the scheduling for
-each statement. For instance, let us consider the following implementation of
-a Cholesky factorization:
-
-@example
-@group
-/* A Cholesky factorization kernel. */
-for (i=1;i<=N;i++) @{
-  for (j=1;j<=i-1;j++) @{
-    a[i][i] -= a[i][j] ;           /* S1 */
-  @}
-  a[i][i] = sqrt(a[i][i]) ;        /* S2 */
-  for (j=i+1;j<=N;j++) @{
-    for (k=1;k<=i-1;k++) @{
-      a[j][i] -= a[j][k]*a[i][k] ; /* S3 */
-    @}
-    a[j][i] /= a[i][i] ;           /* S4 */
-    @}
-  @}
-@}
-@end group
-@end example
-
-The corresponding abstract syntax tree is given in the following figure.
-It directly gives the scattering functions (schedules) for all the
-statements of the program.
-
-@image{images/tree,6cm}
-
-@tex
-$$
-\hbox{$ \cases{ \theta _{S1}(i,j)^T    &$=  (0,i,0,j,0)^T$\cr
-                \theta _{S2}(i)        &$=  (0,i,1)^T$\cr
-                \theta _{S3}(i,j,k)^T  &$=  (0,i,2,j,0,k,0)^T$\cr
-                \theta _{S4}(i,j)^T    &$=  (0,i,2,j,1)^T$}$}
-$$
-@end tex
-
-@ifnottex
-@example
-@group
-T_S1(i,j)^T   = (0,i,0,j,0)^T
-T_S2(i)       = (0,i,1)^T
-T_S3(i,j,k)^T = (0,i,2,j,0,k,0)^T
-T_S4(i,j)^T   = (0,i,2,j,1)^T
-@end group
-@end example
-@end ifnottex
-
-These schedules depend on the iterators and give for each instance of each
-statement a unique execution date. Using such scattering functions allow
-CLooG to re-generate the input code. 
-
-
-
-
-
-@c %  ***********************Using the CLooG Software **************************
-@node CLooG Software
-@chapter Using the CLooG Software
-
-
-@menu
-* A First Example::
-* Writing The Input File::
-* Calling CLooG::
-* CLooG Options::
-* Full Example::
-@end menu
-
-@c %/*************************************************************************
-@c % *                              A FIRST EXAMPLE                          *
-@c % *************************************************************************/
-@node A First Example
-@section A First Example
-CLooG takes as input a file that must be written accordingly to a grammar
-described in depth in a further section (@pxref{Writing The Input File}). 
-Moreover it supports many options to tune the target code presentation or
-quality as discussed in a dedicated section (@pxref{Calling CLooG}).
-However, a basic use
-of CLooG is not very complex and we present in this section how to generate the
-code corresponding to a basic example discussed earlier (@pxref{Basics}).
-
-The problem is to find the code that scans a 2-dimensional polyhedron
-where @samp{i} and @samp{j} are the unknown (the two dimensions of the space)
-and @samp{m} and @samp{n} are the parameters (the symbolic constants),
-defined by the following set of constraints:
-@example
-@group
-2<=i<=n
-2<=j<=m
-j<=n+2-i
-@end group
-@end example
-@noindent We also consider a partial knowledge of the parameter values,
-expressed thanks to the following affine constraints:
-@example
-@group
-m>=2
-n>=2
-@end group
-@end example
-
-An input file that corresponds to this problem, and asks for a generated
-code in C, may be the following. Note that we do not describe here precisely
-the structure and the components of this file (@pxref{Writing The Input File}
- for such information, if you feel it necessary):
-
-@example
-# ---------------------- CONTEXT ----------------------
-c # language is C
-
-# Context (constraints on two parameters)
-2 4                   # 2 lines and 4 columns
-# eq/in m  n  1         eq/in: 1 for inequality >=0, 0 for equality =0
-    1   1  0 -2       # 1*m + 0*n -2*1 >= 0, i.e. m>=2
-    1   0  1 -2       # 0*m + 1*n -2*1 >= 0, i.e. n>=2
-
-1 # We want to set manually the parameter names
-m n                   # parameter names
-
-# --------------------- STATEMENTS --------------------
-1 # Number of statements
-
-1 # First statement: one domain
-# First domain
-5 6                   # 5 lines and 6 columns
-# eq/in i  j  m  n  1 
-    1   1  0  0  0 -2 # i >= 2
-    1  -1  0  0  1  0 # i <= n
-    1   0  1  0  0 -2 # j >= 2
-    1   0 -1  1  0  0 # j <= m
-    1  -1 -1  0  1  2 # n+2-i>=j
-0  0  0               # for future options
-
-1 # We want to set manually the iterator names
-i j                   # iterator names
-
-# --------------------- SCATTERING --------------------
-0 # No scattering functions
-@end example
-
-This file may be called @samp{basic.cloog}
-(this example is provided in the CLooG distribution as
-@code{test/manual_basic.cloog}) and we can ask CLooG to process it
-and to generate the code by a simple calling to CLooG with this file as input:
-@samp{cloog basic.cloog}. By default, CLooG will print the generated code in
-the standard output:
-
-@example
-@group
-/* Generated by CLooG v@value{VERSION} in 0.00s. */
-for (i=2;i<=n;i++) @{
-  for (j=2;j<=min(m,-i+n+2);j++) @{    
-    S1(i,j) ;
-  @}
-@}
-@end group
-@end example
-
-@c %/*************************************************************************
-@c % *                                Input file                             *
-@c % *************************************************************************/
-@node Writing The Input File
-@section Writing The Input File
-The input text file contains a problem description, i.e. the context,
-the domains and the scattering functions.
-Because CLooG is very 'compilable code generation oriented', we can associate
-some additional informations to each domain. We call this association a
-@emph{statement}. The set of all informations is 
-called a @emph{program}. The input file respects the grammar below
-(terminals are preceded by "_"):
-
-@example
-File             ::= Program
-Program          ::= Context Statements Scattering
-Context          ::= Language      Domain_union   Naming
-Statements       ::= Nb_statements Statement_list Naming
-Scatterings      ::= Nb_functions  Scattering_list Naming
-Naming           ::= Option Name_list
-Name_list        ::= _String   Name_list      | (void)
-Statement_list   ::= Statement Statement_list | (void)
-Domain_list      ::= _Domain   Domain_list    | (void)
-Scattering_list  ::= Domain_union Scattering_list | (void)
-Statement        ::= Iteration_domain 0 0 0
-Iteration_domain ::= Domain_union
-Domain_union     ::= Nb_domains Domain_list
-Option           ::= 0 | 1
-Language         ::= c | f
-Nb_statements    ::= _Integer
-Nb_domains       ::= _Integer
-Nb_functions     ::= _Integer
-@end example
-
-Note: if there is only one domain in a @samp{Domain_union},
-i.e., if @samp{Nb_domains} is 1, then this 1 may be omitted.
-
-@itemize @bullet
-@item  @samp{Context} represents the informations that are
-       shared by all the statements. It consists on
-       the language used (which can be @samp{c} for C or @samp{f} for FORTRAN 90)
-       and the global constraints on parameters.
-       These constraints are essential
-       since they give to CLooG the number of parameters. If there is no
-       parameter or no constraints on parameters, just give a constraint
-       always satisfied like @math{1 \geq 0}. @samp{Naming} sets the parameter
-       names.
-       If the naming option @samp{Option} is 1, parameter names will be read
-       on the next line. There must be exactly as many names as parameters.
-       If the naming option @samp{Option} is 0, parameter names are
-       automatically generated. The name of the first parameter will
-       be @samp{M}, and the name of the @math{(n+1)^{th}} parameter directly
-       follows the name of the @math{n^{th}} parameter in ASCII code.
-       It is the user responsibility to ensure that parameter names,
-       iterators and scattering dimension names are different. 
-@item  @samp{Statements} represents the informations on the statements.
-       @samp{Nb_statements} is the number of statements in the program, 
-       i.e. the number of @samp{Statement} items in the @samp{Statement_list}.
-       @samp{Statement} represents the informations on a given statement.
-       To each statement is associated a domain
-       (the statement iteration domain: @samp{Iteration_domain}) and three
-       zeroes that represents future options.
-       @samp{Naming} sets the iterator names. If the naming option
-       @samp{Option} is 1, the iterator names
-       will be read on the next line. There must be exactly as many names as
-       nesting level in the deepest iteration domain. If the naming option
-       @samp{Option} is 0, iterator names are automatically generated.
-       The iterator name of the outermost loop will be @samp{i}, and the
-       iterator name of the loop at level @math{n+1} directly follows the 
-       iterator name of the loop at level @math{n} in ASCII code. 
-@item  @samp{Scatterings} represents the informations on scattering functions.
-       @samp{Nb_functions} is the number of functions (it must be
-       equal to the number of statements or 0 if there is no scattering
-       function). The functions themselves are represented through
-       @samp{Scattering_list}.
-       @samp{Naming} sets the scattering dimension names. If the naming option
-       @samp{Option} is 1, the scattering dimension names will be read on the
-       next line.
-       There must be exactly as many names as scattering dimensions. If the
-       naming option @samp{Option} is 0, scattering dimension names are automatically
-       generated. The name of the @math{n^{th}} scattering dimension
-       will be @samp{cn}.
-@end itemize
-
-@menu
-* Domain Representation::
-* Scattering Representation::
-@end menu
-
-@node Domain Representation
-@subsection Domain Representation
-As shown by the grammar, the input file describes the various informations
-thanks to characters, integers and domains. Each domain is defined by a set of
-constraints in the PolyLib format (@pxref{Wil93}). They have the
-following syntax:
-@enumerate
-@item some optional comment lines beginning with @samp{#},
-@item the row and column numbers, possibly followed by comments,
-@item the constraint rows, each row corresponds to a constraint the
-      domain have to satisfy. Each row must be on a single line and is possibly
-      followed by comments. The constraint is an equality @math{p(x) = 0} if the
-      first element is 0, an inequality  @math{p(x) \geq 0} if the first element
-      is 1. The next elements are the unknown coefficients, followed by
-      the parameter coefficients. The last element is the constant factor.
-@end enumerate
-For instance, assuming that @samp{i}, @samp{j} and @samp{k} are iterators and
-@samp{m} and @samp{n} are parameters, the domain defined by the following
-constraints :
-
-@tex
-$$
-\hbox{$ \cases{ -i     + m &$\geq 0$\cr
-                    -j + n &$\geq 0$\cr
-                 i + j - k &$\geq 0$}$}
-$$
-@end tex
-
-@ifnottex
-@example
-@group
-   -i + m >= 0
-   -j + n >= 0
-i + j - k >= 0
-@end group
-@end example
-@end ifnottex
-
-@noindent can be written in the input file as follows :
-
-@example
-@group
-# This is the domain
-3 7                      # 3 lines and 7 columns
-# eq/in i  j  k  m  n  1 
-    1  -1  0  0  1  0  0 #    -i + m >= 0
-    1   0 -1  0  0  1  0 #    -j + n >= 0
-    1   1  1 -1  0  0  0 # i + j - k >= 0
-@end group
-@end example
-
-Each iteration domain @samp{Iteration_domain} of a given statement
-is a union of polyhedra
-@samp{Domain_union}. A union is defined by its number of elements
-@samp{Nb_domains} and the elements themselves @samp{Domain_list}.
-For instance, let us consider the following pseudo-code:
-
-@example
-@group
-for (i=1;i<=n;i++) @{
-  if ((i >= m) || (i <= 2*m))
-    S1 ;
-  for (j=i+1;j<=m;j++)
-    S2 ;
-@} 
-@end group
-@end example
-
-@noindent The iteration domain of @samp{S1} can be divided into two
-polyhedra and written in the input file as follows:
-
-@example
-@group
-2 # Number of polyhedra in the union
-# First domain
-3 5                # 3 lines and 5 columns
-# eq/in i  m  n  1 
-    1   1  0  0 -1 #  i >= 1
-    1  -1  0  1  0 #  i <= n
-    1   1 -1  0  0 #  i >= m
-# Second domain
-3 5                # 3 lines and 5 columns
-# eq/in i  m  n  1 
-    1   1  0  0 -1 #  i >= 1
-    1  -1  0  1  0 #  i <= n
-    1  -1  2  0  0 #  i <= 2*m
-@end group
-@end example
-
-@node Scattering Representation
-@subsection Scattering Function Representation
-Scattering functions are depicted in the input file thanks a representation
-very close to the domain one.
-An integer gives the number of functions @samp{Nb_functions} and each function
-is represented by a domain. Each line of the domain corresponds to an equality
-defining a dimension of the function. Note that at present
-(CLooG @value{VERSION})
-@strong{all functions must have the same scattering dimension number}. If a
-user wants to set scattering functions with different dimensionality, he has
-to complete the smaller one with zeroes to reach the maximum dimensionality.
-For instance, let us consider the following code and
-scheduling functions:
-
-@example
-@group
-for (i=1;i<=n;i++) @{
-  if ((i >= m) || (i <= 2*m))
-    S1 ;
-  for (j=i+1;j<=m;j++)
-    S2 ;
-@} 
-@end group
-@end example
-
-@tex
-$$
-\hbox{$ \cases{ \theta _{S1}(i)      &$=  (i,0)^T$\cr
-                \theta _{S2}(i,j)^T  &$=  (n,i+j)^T$}$}
-$$
-@end tex
-
-@ifnottex
-@example
-@group
-T_S1(i)     = (i,0)^T
-T_S2(i,j)^T = (n,i+j)^T
-@end group
-@end example
-@end ifnottex
-
-
-@noindent This scheduling can be written in the input file as follows:
-
-@example
-@group
-2 # Number of scattering functions
-# First function
-2 7                          # 2 lines and 7 columns
-# eq/in c1 c2  i  m  n  1 
-    0    1  0 -1  0  0  0    #  c1 = i
-    0    0  1  0  0  0  0    #  c2 = 0
-# Second function
-2 8                          # 2 lines and 8 columns
-# eq/in c1 c2  i  j  m  n  1 
-    0    1  0  0  0  0 -1  0 #  c1 = n
-    0    0  1 -1 -1  0  0  0 #  c2 = i+j
-@end group
-@end example
-The complete input file for the user who wants to generate the code for this
-example with the preceding scheduling would be
-(this file is provided in the CLooG distribution
-as @code{test/manual_scattering.cloog}:
-
-@example
-# ---------------------- CONTEXT ----------------------
-c # language is C
-
-# Context (no constraints on two parameters)
-1 4                   # 1 lines and 4 columns
-# eq/in m  n  1
-    1   0  0  0       # 0 >= 0, always true
-
-1 # We want to set manually the parameter names
-m n                   # parameter names
-
-# --------------------- STATEMENTS --------------------
-2 # Number of statements
-
-2 # First statement: two domains
-# First domain
-3 5                   # 3 lines and 5 columns
-# eq/in i  m  n  1
-    1   1  0  0 -1    # i >= 1
-    1  -1  0  1  0    # i <= n
-    1   1 -1  0  0    # i >= m
-# Second domain
-3 5                   # 3 lines and 5 columns
-# eq/in i  m  n  1 
-    1   1  0  0 -1    # i >= 1
-    1  -1  0  1  0    # i <= n
-    1  -1  2  0  0    # i <= 2*m
-0  0  0               # for future options
- 
-1 # Second statement: one domain
-4 6                   # 4 lines and 6 columns
-# eq/in i  j  m  n  1 
-    1   1  0  0  0 -1 # i >= 1
-    1  -1  0  0  1  0 # i <= n
-    1  -1  1  0  0 -1 # j >= i+1
-    1   0 -1  1  0  0 # j <= m
-0  0  0               # for future options
-
-1 # We want to set manually the iterator names
-i j                   # iterator names
-
-# --------------------- SCATTERING --------------------
-2 # Scattering functions
-# First function
-2 7                   # 2 lines and 7 columns
-# eq/in p1 p2  i  m  n  1 
-    0    1  0 -1  0  0  0    # p1 = i
-    0    0  1  0  0  0  0    # p2 = 0
-# Second function
-2 8                   # 2 lines and 8 columns
-# eq/in p1 p2  i  j  m  n  1 
-    0    1  0  0  0  0 -1  0 # p1 = n
-    0    0  1 -1 -1  0  0  0 # p2 = i+j
-
-1 # We want to set manually the scattering dimension names
-p1 p2                 # scattering dimension names
-@end example
-
-
-@c %/*************************************************************************
-@c % *                             Calling CLooG                             *
-@c % *************************************************************************/
-@node Calling CLooG
-@section Calling CLooG
-CLooG is called by the following command:
-@example
-       cloog [ options | file ]
-@end example
-The default behavior of CLooG is to read the input informations from a file and
-to print the generated code or pseudo-code on the standard output.
-CLooG's behavior and the output code shape is under the user control thanks
-to many options which are detailed a further section (@pxref{CLooG Options}).
-@code{file} is the input file. @code{stdin} is a special value: when used,
-input is standard input. For instance, we can call CLooG to treat the
-input file @code{basic.cloog} with default options by typing:
-@code{cloog basic.cloog} or @code{more basic.cloog | cloog stdin}.
-
-@c %/*************************************************************************
-@c % *                             CLooG Options                             *
-@c % *************************************************************************/
-@node CLooG Options
-@section CLooG Options
-
-@menu
-* Last Depth to Optimize Control::
-* First Depth to Optimize Control::
-* Simplify Convex Hull::
-* Once Time Loop Elimination::
-* Equality Spreading::
-* First Level for Spreading::
-* Statement Block::
-* Loop Strides::
-* Unrolling::
-* Compilable Code::
-* Output::
-* Help::
-* Version ::
-* Quiet ::
-@end menu
-
-@node Last Depth to Optimize Control
-@subsection Last Depth to Optimize Control @code{-l <depth>}
-
-@code{-l <depth>}: this option sets the last loop depth to be optimized in
-control. The higher this depth, the less control overhead.
-For instance, with some input file, a user can generate
-different pseudo-codes with different @code{depth} values as shown below.
-@example
-@group
-/* Generated using a given input file and @strong{option -l 1} */
-for (i=0;i<=M;i++) @{
-  S1 ;
-  for (j=0;j<=N;j++) @{
-    S2 ;
-  @}
-  for (j=0;j<=N;j++) @{
-    S3 ;
-  @}
-  S4 ;
-@}
-@end group
-@end example
-@example
-@group
-/* Generated using the same input file but @strong{option -l 2} */
-for (i=0;i<=M;i++) @{
-  S1 ;
-  for (j=0;j<=N;j++) @{
-    S2 ;
-    S3 ;
-  @}
-  S4 ;
-@}
-@end group
-@end example
-     In this example we can see that this option can change the operation
-     execution order between statements. Let us remind that CLooG does not
-     make any speculation on dependences between statements
-     (@pxref{Scattering}). Thus if nothing (i.e. scattering functions)
-     forbids this, CLooG considers the above codes to be equivalent.
-     If there is no scattering functions, the minimum value for @code{depth}
-     is 1 (in the case of 0, the user doesn't really need a loop generator !),
-     and the number of scattering dimensions otherwise (CLooG will warn the
-     user if he doesn't respect such constraint).
-     The maximum value for depth is -1 (infinity).
-     Default value is infinity.
-
-@node First Depth to Optimize Control
-@subsection First Depth to Optimize Control @code{-f <depth>}
-
-     @code{-f <depth>}: this option sets the first loop depth to be optimized
-     in control. The lower this depth, the less control overhead (and the longer
-     the generated code). For instance, with some input file, a user
-     can generate different pseudo-codes with different @code{depth} values
-     as shown below.
-     The minimum value for @code{depth} is 1, and the
-     maximum value is -1 (infinity).
-     Default value is 1.
-@example
-@group
-/* Generated using a given input file and @strong{option -f 3} */
-for (i=1;i<=N;i++) @{
-  for (j=1;j<=M;j++) @{
-    S1 ;
-    if (j >= 10) @{
-      S2 ;
-    @}
-  @}
-@}
-@end group
-@end example
-@example
-@group
-/* Generated using the same input file but @strong{option -f 2} */
-for (i=1;i<=N;i++) @{
-  for (j=1;j<=9;j++) @{
-    S1 ;
-  @}
-  for (j=10;j<=M;j++) @{
-    S1 ;
-    S2 ;
-  @}
-@}
-@end group
-@end example
-
-@node Simple Convex Hull
-@subsection  Simple Convex Hull @code{-sh <boolean>}
-
-     @code{-sh <boolean>}: this option enables (@code{boolean=1})
-     or forbids (@code{boolean=0}) the use of an overapproximation
-     of the convex hull that may be easier to compute
-     (especially in the isl backend) and that may result in
-     simpler bounds.
-     This option works only for generated code without
-     code duplication (it means, you have to tune @code{-f} and
-     @code{-l} options first to generate only a loop nest with internal
-     guards). For instance, with the input file @code{test/union.cloog}, a user
-     can generate different pseudo-codes  as shown below.
-     Default value is 0.
-@example
-@group
-/* Generated using test/union.cloog and @strong{option -f -1 -l 2 -override} */
-for (i=0;i<=11;i++) @{
-  for (j=max(0,5*i-50);j<=min(15,5*i+10);j++) @{
-    if ((i <= 10) && (j <= 10)) @{
-      S1 ;
-    @}
-    if ((i >= 1) && (j >= 5)) @{
-      S2 ;
-    @}
-  @}
-@}
-@end group
-@end example
-@example
-@group
-/* Generated using the same input file but @strong{option -sh 1 -f -1 -l 2 -override} */
-for (i=0;i<=11;i++) @{
-  for (j=0;j<=15;j++) @{
-    if ((i <= 10) && (j <= 10)) @{
-      S1 ;
-    @}
-    if ((i >= 1) && (j >= 5)) @{
-      S2 ;
-    @}
-  @}
-@}
-@end group
-@end example
-
-@node Once Time Loop Elimination
-@subsection Once Time Loop Elimination @code{-otl <boolean>}
-
-     @code{-otl <boolean>}: this option allows (@code{boolean=1}) or
-     forbids (@code{boolean=0}) the simplification of loops running
-     once. Default value is 1.
-@example
-@group
-/* Generated using a given input file and @strong{option -otl 0} */
-for (j=i+1;j<=i+1;j++) @{
-  S1 ;
-@}
-@end group
-@end example
-@example
-@group
-/* Generated using the same input file but @strong{option -otl 1} */
-j = i+1 ;
-S1 ;
-@end group
-@end example
-
-
-@node Equality Spreading 
-@subsection Equality Spreading @code{-esp <boolean>}
-
-     @code{-esp <boolean>}: this option allows (@code{boolean=1}) or
-     forbids (@code{boolean=0}) values spreading when there
-     are equalities. Default value is 1.
-@example
-@group
-/* Generated using a given input file and @strong{option -esp 0} */
-i = M+2 ;
-j = N ;
-for (k=i;k<=j+M;k++) @{
-  S1 ;
-@}
-@end group
-@end example
-@example
-@group
-/* Generated using the same input file but @strong{option -esp 1} */
-for (k=M+2;k<=N+M;k++) @{
-  S1(i = M+2, j = N) ;
-@}
-@end group
-@end example
-
-
-@node First Level for Spreading 
-@subsection First Level for Spreading @code{-fsp <level>}
-
-     @code{-fsp <level>}: it can be useful to set a
-     first level to begin equality spreading. Particularly when using
-     scattering functions, the user may want to see the scattering dimension
-     values instead of spreading or hiding them. If user has set a
-     spreading, @code{level} is
-     the first level to start it. Default value is 1.
-@example
-@group
-/* Generated using a given input file and @strong{option -fsp 1} */
-for (j=0;j<=N+M;j++) @{
-  S1(i = N) ;
-@}
-for (j=0;j<=N+M;j++) @{
-  S1(i = M) ;
-@}
-@end group
-@end example
-@example
-@group
-/* Generated using the same input file but @strong{option -fsp 2} */
-c1 = N ;
-for (j=0;j<=c1+M;j++) @{
-  S1(i = c1) ;
-@}
-c1 = M ;
-for (j=0;j<=N+c1;j++) @{
-  S1(i = c1) ;
-@}
-@end group
-@end example
-
-
-@node Statement Block  
-@subsection Statement Block @code{-block <boolean>}
-
-     @code{-block <boolean>}: this option allows (@code{boolean=1}) to
-     create a statement block for each new iterator, even if there is only
-     an equality. This can be useful in order to parse the generated
-     pseudo-code. When @code{boolean} is set to 0 or when the generation
-     language is FORTRAN, this feature is disabled. Default value is 0.
-@example
-@group
-/* Generated using a given input file and @strong{option -block 0} */
-i = M+2 ;
-j = N ;
-S1 ;
-@end group
-@end example
-@example
-@group
-/* Generated using the same input file but @strong{option -block 1} */
-@{ i = M+2 ;
-  @{ j = N ;
-    S1 ;
-  @}
-@}
-@end group
-@end example
-
-
-@node Loop Strides 
-@subsection Loop Strides @code{-strides <boolean>}
-
-     @code{-strides <boolean>}: this options allows (@code{boolean=1}) to
-     handle non-unit strides for loop increments. This can remove a lot of
-     guards and make the generated code more efficient. Default value is 0.
-@example
-@group
-/* Generated using a given input file and @strong{option -strides 0} */
-for (i=1;i<=n;i++) @{
-  if (i%2 == 0) @{
-    S1(j = i/2) ;
-  @}
-  if (i%4 == 0) @{
-    S2(j = i/4) ;
-  @}
-@}
-@end group
-@end example
-@example
-@group
-/* Generated using the same input file but @strong{option -strides 1} */
-for (i=2;i<=n;i+=2) @{
-  S1(j = i/2) ;
-  if (i%4 == 0) @{
-    S2(j = i/4) ;
-  @}
-@}
-@end group
-@end example
-
-
-@node Unrolling
-@subsection First Depth to Unroll @code{-first-unroll <depth>}
-
-    @code{-first-unroll <depth>}: this option sets the first loop depth
-    to unroll.  Note that a loop is only unrolled when it is supported
-    by the backend.  In case of the isl backend, a loop is unrolled
-    if it has a lower bound that can only be incremented
-    a fixed (non-parametric) amount of times.
-
-
-@node Compilable Code
-@subsection Compilable Code @code{-compilable <value>}
-
-     @code{-compilable <value>}: this options allows (@code{value} is not 0)
-     to generate a compilable code where all parameters have the integral value
-     @code{value}. This option creates a macro for each statement. Since
-     CLooG do not know anything about the statement sources, it fills the
-     macros with a basic increment that computes the total number of
-     scanned integral points. The user may change easily the macros according
-     to his own needs. This option is possible only if the generated code is
-     in C. Default value is 0.
-@example
-@group
-/* Generated using a given input file and @strong{option -compilable 0} */
-for (i=0;i<=n;i++) @{
-  for (j=0;j<=n;j++) @{
-    S1 ;
-    S2 ;
-  @}
-  S3 ;
-@}
-@end group
-@end example
-@example
-/* Generated using the same input file but @strong{option -compilable 10} */
-/* DON'T FORGET TO USE -lm OPTION TO COMPILE. */
-
-/* Useful headers. */
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-
-/* Parameter value. */
-#define PARVAL 10
-
-/* Statement macros (please set). */
-#define S1(i,j) @{total++;@}
-#define S2(i,j) @{total++;@}
-#define S3(i)   @{total++;@}
-
-int main() @{
-  /* Original iterators. */
-  int i, j ;
-  /* Parameters. */
-  int n=PARVAL, total=0 ;
-
-  for (i=0;i<=n;i++) @{
-    for (j=0;j<=n;j++) @{
-      S1(i,j) ;
-      S2(i,j) ;
-    @}
-    S3(i) ;
-  @}
-
-  printf("Number of integral points: %d.\n",total) ;
-  return 0 ;
-@}
-@end example
-
-@node Callable Code
-@subsection Callable Code @code{-callable <boolean>}
-
-     @code{-callable <boolean>}: if @code{boolean=1}, then a @code{test}
-     function will be generated that has the parameters as arguments.
-     Similarly to the @code{-compilable} option,
-     a macro for each statement is generated.  The generated definitions of
-     these macros are as used during the correctness testing, but they
-     can easily be changed by the user to suit her own needs.
-     This option is only available if the target language is C.
-     The default value is 0.
-
-@example
-/* Generated from double.cloog with @strong{option -callable 0} */
-for (i=0;i<=M;i++) @{
-  S1 ;
-  for (j=0;j<=N;j++) @{
-    S2 ;
-    S3 ;
-  @}
-  S4 ;
-@}
-@end example
-@example
-/* Generated from double.cloog with @strong{option -callable 1} */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? ((n)-(d)+1)/(d) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? (n)/(d) : ((n)+(d)+1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) @{ hash(1); hash(i); @}
-#define S2(i,j) @{ hash(2); hash(i); hash(j); @}
-#define S3(i,j) @{ hash(3); hash(i); hash(j); @}
-#define S4(i) @{ hash(4); hash(i); @}
-
-void test(int M, int N)
-@{
-  /* Original iterators. */
-  int i, j;
-  for (i=0;i<=M;i++) @{
-    S1(i) ;
-    for (j=0;j<=N;j++) @{
-      S2(i,j) ;
-      S3(i,j) ;
-    @}
-    S4(i) ;
-  @}
-@}
-@end example
-
-@node Output
-@subsection Output @code{-o <output>}
-
-     @code{-o <output>}: this option sets the output file. @code{stdout} is a
-     special value: when used, output is standard output.
-     Default value is @code{stdout}.
-
-@node Help
-@subsection Help @code{--help} or @code{-h}
-
-     @code{--help} or @code{-h}: this option ask CLooG to print a short help.
-
-@node Version
-@subsection Version @code{--version} or @code{-v}
-
-     @code{--version} or @code{-v}: this option ask CLooG to print some version
-     informations.
-
-@node Quiet
-@subsection Quiet @code{--quiet} or @code{-q}
-
-     @code{--quiet} or @code{-q}: this option tells CLooG not to print
-     any informational messages.
-
-
-@c %/*************************************************************************
-@c % *                           A Full Example                              *
-@c % *************************************************************************/
-@node Full Example
-@section A Full Example
-
-Let us consider the allocation problem of a Gaussian elimination, i.e. we want
-to distribute the various statement instances of the compute kernel onto
-different processors. The original code is the following:
-@example
-@group
-for (i=1;j<=N-1;i++) @{
-  for (j=i+1;j<=N;j++) @{
-    c[i][j] = a[j][i]/a[i][i] ;    /* S1 */
-    for (k=i+1;k<=N;k++) @{
-      a[j][k] -= c[i][j]*a[i][k] ; /* S2 */
-    @}
-  @}
-@}
-@end group
-@end example
-
-@noindent The best affine allocation functions can be found by any good automatic
-parallelizer like LooPo (@pxref{Gri04}):
-
-@tex
-$$
-\hbox{$ \cases{ \theta _{S1}(i,j)^T    &$=  (i)$\cr
-                \theta _{S2}(i,j,k)^T  &$=  (k)$}$}
-$$
-@end tex
-
-@ifnottex
-@example
-@group
-T_S1(i,j)^T   = (i)
-T_S2(i,j,k)^T = (k)
-@end group
-@end example
-@end ifnottex
-
-@noindent To ensure that on each processor, the set of statement instances is
-executed according to the original ordering, we add as minor scattering
-dimensions the original scheduling (@pxref{Scattering}):
-
-@tex
-$$
-\hbox{$ \cases{ \theta _{S1}(i,j)^T    &$=  (i,0,i,0,j,0)^T$\cr
-                \theta _{S2}(i,j,k)^T  &$=  (k,0,i,0,j,1,k,0)^T$}$}
-$$
-@end tex
-
-@ifnottex
-@example
-@group
-T_S1(i,j)^T   = (i,0,i,0,j,0)^T
-T_S2(i,j,k)^T = (k,0,i,0,j,1,k,0)^T
-@end group
-@end example
-@end ifnottex
-
-@noindent To ensure that the scattering functions have the same dimensionality, we
-complete the first function with zeroes
-(this is a CLooG @value{VERSION} and previous versions requirement,
-it should be removed in a future version, don't worry it's absolutely legal !):
-
-@tex
-$$
-\hbox{$ \cases{ \theta _{S1}(i,j)^T    &$=  (i,0,i,0,j,0,0,0)^T$\cr
-                \theta _{S2}(i,j,k)^T  &$=  (k,0,i,0,j,1,k,0)^T$}$}
-$$
-@end tex
-
-@ifnottex
-@example
-@group
-T_S1(i,j)^T   = (i,0,i,0,j,0,0,0)^T
-T_S2(i,j,k)^T = (k,0,i,0,j,1,k,0)^T
-@end group
-@end example
-@end ifnottex
-
-@noindent The input file corresponding to this code generation problem
-could be (this file is provided in the CLooG distribution
-as @code{test/manual_gauss.cloog}:
-
-@example
-# ---------------------- CONTEXT ----------------------
-c # language is C
-
-# Context (no constraints on one parameter)
-1 3                     # 1 line and 3 columns    
-# eq/in n  1
-    1   0  0            # 0 >= 0, always true
-
-1 # We want to set manually the parameter name
-n                       # parameter name
-
-# --------------------- STATEMENTS --------------------
-2 # Number of statements
-
-1 # First statement: one domain
-4 5                     # 4 lines and 3 columns
-# eq/in i  j  n  1
-    1   1  0  0 -1      # i >= 1
-    1  -1  0  1 -1      # i <= n-1
-    1  -1  1  0 -1      # j >= i+1
-    1   0 -1  1  0      # j <= n
-0  0  0                 # for future options
- 
-1
-# Second statement: one domain
-6 6                     # 6 lines and 3 columns
-# eq/in i  j  k  n  1
-    1   1  0  0  0 -1   # i >= 1
-    1  -1  0  0  1 -1   # i <= n-1
-    1  -1  1  0  0 -1   # j >= i+1
-    1   0 -1  0  1  0   # j <= n
-    1  -1  0  1  0 -1   # k >= i+1
-    1   0  0 -1  1  0   # k <= n
-0  0  0                 # for future options
-
-0 # We let CLooG set the iterator names
-
-# --------------------- SCATTERING --------------------
-2 # Scattering functions
-# First function
-8 13                    # 3 lines and 3 columns
-# eq/in p1 p2 p3 p4 p5 p6 p7 p8  i  j  n  1
-    0    1  0  0  0  0  0  0  0 -1  0  0  0     # p1 = i
-    0    0  1  0  0  0  0  0  0  0  0  0  0     # p2 = 0
-    0    0  0  1  0  0  0  0  0 -1  0  0  0     # p3 = i
-    0    0  0  0  1  0  0  0  0  0  0  0  0     # p4 = 0
-    0    0  0  0  0  1  0  0  0  0 -1  0  0     # p5 = j
-    0    0  0  0  0  0  1  0  0  0  0  0  0     # p6 = 0
-    0    0  0  0  0  0  0  1  0  0  0  0  0     # p7 = 0
-    0    0  0  0  0  0  0  0  1  0  0  0  0     # p8 = 0
-# Second function
-8 14                    # 3 lines and 3 columns
-# eq/in p1 p2 p3 p4 p5 p6 p7 p8  i  j  k  n  1
-    0    1  0  0  0  0  0  0  0  0  0 -1  0  0  # p1 = k
-    0    0  1  0  0  0  0  0  0  0  0  0  0  0  # p2 = 0
-    0    0  0  1  0  0  0  0  0 -1  0  0  0  0  # p3 = i
-    0    0  0  0  1  0  0  0  0  0  0  0  0  0  # p4 = 0
-    0    0  0  0  0  1  0  0  0  0 -1  0  0  0  # p5 = j
-    0    0  0  0  0  0  1  0  0  0  0  0  0 -1  # p6 = 1
-    0    0  0  0  0  0  0  1  0  0  0 -1  0  0  # p7 = k
-    0    0  0  0  0  0  0  0  1  0  0  0  0  0  # p8 = 0
-
-1 # We want to set manually the scattering dimension names
-p1 p2 p3 p4 p5 p6 p7 p8 # scattering dimension names
-@end example
-
-Calling CLooG, with for instance the command line
-@code{cloog -fsp 2 gauss.cloog} for a better view
-of the allocation (the processor number is given by @code{p1}),
-will result on the following target code that actually implements
-the transformation. A minor processing on the dimension @code{p1}
-to implement, e.g., MPI calls, which is not shown here may
-result in dramatic speedups !
-
-@example
-if (n >= 2) @{
-  p1 = 1 ;
-  for (p5=2;p5<=n;p5++) @{
-    S1(i = 1,j = p5) ;
-  @}
-@}
-for (p1=2;p1<=n-1;p1++) @{
-  for (p3=1;p3<=p1-1;p3++) @{
-    for (p5=p3+1;p5<=n;p5++) @{
-      S2(i = p3,j = p5,k = p1) ;
-    @}
-  @}
-  for (p5=p1+1;p5<=n;p5++) @{
-    S1(i = p1,j = p5) ;
-  @}
-@}
-if (n >= 2) @{
-  p1 = n ;
-  for (p3=1;p3<=n-1;p3++) @{
-    for (p5=p3+1;p5<=n;p5++) @{
-      S2(i = p3,j = p5,k = n) ;
-    @}
-  @}
-@}
-@end example
-
-
-@c %/*************************************************************************
-@c % *                           A Full Example                              *
-@c % *************************************************************************/
-@node CLooG Library
-@chapter Using the CLooG Library
-The CLooG Library was implemented to allow the user to call CLooG
-directly from his programs, without file accesses or system calls. The
-user only needs to link his programs with C libraries. The CLooG
-library mainly provides one function (@code{cloog_clast_create_from_input})
-which takes as input the problem
-description with some options, and returns the data structure corresponding
-to the generated code (a @code{struct clast_stmt} structure)
-which is more or less an abstract syntax tree.
-The user can work with this data structure and/or use
-our pretty printing function to write the final code in either C or FORTRAN.
-Some other functions are provided for convenience reasons.
-These functions as well as the data structures are described in this section.
-
-@menu
-* CLooG Data Structures::
-* CLooG Output::
-* Retrieving version information::
-* Example of Library Utilization::
-@end menu
-
-
-@node CLooG Data Structures
-@section CLooG Data Structures Description
-In this section, we describe the data structures used by the loop
-generator to represent and to process a code generation problem.
-
-@menu
-* CloogState::
-* CloogMatrix::
-* CloogDomain::
-* CloogScattering::
-* CloogUnionDomain::
-* CloogStatement::
-* CloogOptions::
-* CloogInput::
-@end menu
-
-
-@node CloogState
-@subsection CloogState
-@example
-@group
-CloogState *cloog_state_malloc(void);
-void cloog_state_free(CloogState *state);
-@end group
-@end example
-
-@noindent The @code{CloogState} structure is (implicitly) needed to perform
-any CLooG operation.  It should be created using @code{cloog_state_malloc}
-before any other CLooG objects are created and destroyed using
-@code{cloog_state_free} after all objects have been freed.
-It is allowed to use more than one @code{CloogState} structure at
-the same time, but an object created within the state of a one
-@code{CloogState} structure is not allowed to interact with an object
-created within the state of an other @code{CloogState} structure.
-
-
-@node CloogMatrix
-@subsection CloogMatrix
-
-@noindent The @code{CloogMatrix} structure is equivalent to the PolyLib
-@code{Matrix} data structure (@pxref{Wil93}). This structure is devoted to
-represent a set of constraints.
-
-@example
-@group
-struct cloogmatrix
-@{ unsigned NbRows ;    /* Number of rows. */
-  unsigned NbColumns ; /* Number of columns. */
-  cloog_int_t **p;     /* Array of pointers to the matrix rows. */
-  cloog_int_t *p_Init; /* Matrix rows contiguously in memory. */
-@};
-typedef struct cloogmatrix CloogMatrix;
-
-CloogMatrix *cloog_matrix_alloc(unsigned NbRows, unsigned NbColumns);
-void cloog_matrix_print(FILE *foo, CloogMatrix *m);
-void cloog_matrix_free(CloogMatrix *matrix);
-@end group
-@end example
-
-@noindent The whole matrix is stored in memory row after row at the
-@code{p_Init} address. @code{p} is an array of pointers where
-@code{p[i]} points to the first element of the @math{i^{th}} row.
-@code{NbRows} and @code{NbColumns} are respectively the number of
-rows and columns of the matrix. 
-Each row corresponds to a constraint. The first element of each row is an
-equality/inequality tag. The
-constraint is an equality @math{p(x) = 0} if the first element is 0, but it is
-an inequality @math{p(x) \geq 0} if the first element is 1.
-The next elements are the coefficients of the unknowns,
-followed by the coefficients of the parameters, and finally the constant term.
-For instance, the following three constraints:
-
-@tex
-$$
-\hbox{$ \cases{ -i + m       &$= 0$\cr
-                -j + n       &$\geq 0$\cr
-                 j + i - k   &$\geq 0$}$}
-$$
-@end tex
-
-@ifnottex
-@example
-@group
-    -i + m  = 0
-    -j + n >= 0
- i + j - k >= 0
-@end group
-@end example
-@end ifnottex
-
-@noindent would be represented by the following rows:
-
-@example
-@group
-# eq/in  i   j   k   m   n   cst
-    0    0  -1   0   1   0    0 
-    1   -1   0   0   0   1    0 
-    1    1   1  -1   0   0    0 
-@end group
-@end example
-
-@noindent To be able to provide different precision version (CLooG
-supports 32 bits, 64 bits and arbitrary precision through the GMP library),
-the @code{cloog_int_t} type depends on the configuration options (it may be
-@code{long int} for 32 bits version, @code{long long int} for 64 bits version,
-and @code{mpz_t} for multiple precision version).
-
-@node CloogDomain
-@subsection CloogDomain
-@example
-@group
-CloogDomain *cloog_domain_union_read(CloogState *state,
-                                     FILE *input, int nb_parameters);
-CloogDomain *cloog_domain_from_cloog_matrix(CloogState *state,
-                                    CloogMatrix *matrix, int nb_par);
-void cloog_domain_free(CloogDomain *domain);
-@end group
-@end example
-
-@noindent @code{CloogDomain} is an opaque type representing a polyhedral
-domain (a union of polyhedra).
-A @code{CloogDomain} can be read
-from a file using @code{cloog_domain_union_read} or
-converted from a @code{CloogMatrix}.
-The input format for @code{cloog_domain_union_read}
-is that of @ref{Domain Representation}.
-The function @code{cloog_domain_from_cloog_matrix} takes a @code{CloogState}, a
-@code{CloogMatrix} and @code{int} as input and returns a pointer to a
-@code{CloogDomain}. @code{matrix} describes the domain and @code{nb_par} is the
-number of parameters in this domain. The input data structures are neither
-modified nor freed.
-The @code{CloogDomain} can be freed using @code{cloog_domain_free}.
-There are also some backend dependent functions for creating
-@code{CloogDomain}s.
-
-@menu
-* CloogDomain/PolyLib::
-* CloogDomain/isl::
-@end menu
-
-@node CloogDomain/PolyLib
-@subsubsection PolyLib
-
-@example
-#include <cloog/polylib/cloog.h>
-CloogDomain *cloog_domain_from_polylib_polyhedron(CloogState *state,
-                                        Polyhedron *, int nb_par);
-@end example
-@noindent
-The function @code{cloog_domain_from_polylib_polyhedron} takes a PolyLib
-@code{Polyhedron} as input and returns a pointer to a @code{CloogDomain}.
-The @code{nb_par} parameter indicates the number of parameters
-in the domain.  The input data structure if neither modified nor freed.
-
-@node CloogDomain/isl
-@subsubsection isl
-
-@example
-#include <cloog/isl/cloog.h>
-CloogDomain *cloog_domain_from_isl_set(struct isl_set *set);
-__isl_give isl_set *isl_set_from_cloog_domain(CloogDomain *domain);
-@end example
-@noindent
-The function @code{cloog_domain_from_isl_set} takes a
-@code{struct isl_set} as input and returns a pointer to a @code{CloogDomain}.
-The function consumes a reference to the given @code{struct isl_set}.
-Similarly, @code{isl_set_from_cloog_domain} consumes a reference
-to a @code{CloogDomain} and returns an @code{isl_set}.
-
-
-@node CloogScattering
-@subsection CloogScattering
-@example
-@group
-CloogScattering *cloog_domain_read_scattering(CloogDomain *domain,
-                                              FILE *foo);
-CloogScattering *cloog_scattering_from_cloog_matrix(CloogState *state,
-                         CloogMatrix *matrix, int nb_scat, int nb_par);
-void cloog_scattering_free(CloogScattering *);
-@end group
-@end example
-
-@noindent
-The @code{CloogScattering} type represents a scattering function.
-A @code{CloogScattering} for a given @code{CloogDomain} can be read
-from a file using @code{cloog_scattering_read} or converted
-from a @code{CloogMatrix} using @code{cloog_scattering_from_cloog_matrix}.
-The function @code{cloog_scattering_from_cloog_matrix} takes a
-@code{CloogState}, a @code{CloogMatrix} and two @code{int}s as input and
-returns a
-pointer to a @code{CloogScattering}.
-@code{matrix} describes the scattering, while @code{nb_scat} and
-@code{nb_par} are the number of scattering dimensions and
-the number of parameters, respectively. The input data structures are
-neither modified nor freed.
-A @code{CloogScattering} can be freed using @code{cloog_scattering_free}.
-There are also some backend dependent functions for creating
-@code{CloogScattering}s.
-
-@menu
-* CloogScattering/PolyLib::
-* CloogScattering/isl::
-@end menu
-
-@node CloogScattering/PolyLib
-@subsubsection PolyLib
-
-@example
-#include <cloog/polylib/cloog.h>
-CloogScattering *cloog_scattering_from_polylib_polyhedron(
-        CloogState *state, Polyhedron *polyhedron, int nb_par);
-@end example
-@noindent
-The function @code{cloog_scattering_from_polylib_polyhedron} takes a PolyLib
-@code{Polyhedron} as input and returns a pointer to a @code{CloogScattering}.
-The @code{nb_par} parameter indicates the number of parameters
-in the domain.  The input data structure if neither modified nor freed.
-
-@node CloogScattering/isl
-@subsubsection isl
-
-@example
-#include <cloog/isl/cloog.h>
-CloogScattering *cloog_scattering_from_isl_map(struct isl_map *map);
-@end example
-@noindent
-The function @code{cloog_scattering_from_isl_map} takes a
-@code{struct isl_map} as input and returns a pointer to a @code{CloogScattering}.
-The output dimensions of the @code{struct isl_map} correspond to the
-scattering dimensions, while the input dimensions correspond to the
-domain dimensions.
-The function consumes a reference to the given @code{struct isl_map}.
-
-
-@node CloogUnionDomain
-@subsection CloogUnionDomain
-@example
-@group
-enum cloog_dim_type @{ CLOOG_PARAM, CLOOG_ITER, CLOOG_SCAT @};
-
-CloogUnionDomain *cloog_union_domain_alloc(int nb_par);
-CloogUnionDomain *cloog_union_domain_add_domain(CloogUnionDomain *ud,
-        const char *name, CloogDomain *domain,
-        CloogScattering *scattering, void *usr);
-CloogUnionDomain *cloog_union_domain_set_name(CloogUnionDomain *ud,
-        enum cloog_dim_type type, int index, const char *name);
-void cloog_union_domain_free(CloogUnionDomain *ud);
-@end group
-@end example
-
-@noindent A @code{CloogUnionDomain} structure represents a union
-of scattered named domains.  A @code{CloogUnionDomain} is
-initialized by a call to @code{cloog_union_domain_alloc},
-after which domains can be added using @code{cloog_union_domain_add_domain}.
-
-@code{cloog_union_domain_alloc} takes the number of parameters as input.
-@code{cloog_union_domain_add_domain} takes a previously created
-@code{CloogUnionDomain} as input along with an optional name,
-a domain, an optional scattering function and a user pointer.
-The name may be @code{NULL} and is duplicated if it is not.
-If no name is specified, then the statements will be named according
-to the order in which they were added.
-@code{domain} and @code{scattering} are taken over
-by the @code{CloogUnionDomain}.  @code{scattering} may be @code{NULL},
-but it must be consistently @code{NULL} or not over all calls
-to @code{cloog_union_domain_add_domain}.
-@code{cloog_union_domain_set_name} can be used to set the names
-of parameters, iterators and scattering dimensions.
-The names of iterators and scattering dimensions can only be set
-after all domains have been added.
-
-There is also a backend dependent function for creating
-@code{CloogUnionDomain}s.
-
-@menu
-* CloogUnionDomain/isl::
-@end menu
-
-@node CloogUnionDomain/isl
-@subsubsection isl
-
-@example
-#include <cloog/isl/cloog.h>
-CloogUnionDomain *cloog_union_domain_from_isl_union_map(
-        __isl_take isl_union_map *umap);
-CloogUnionDomain *cloog_union_domain_from_isl_union_set(
-	__isl_take isl_union_set *uset);
-@end example
-@noindent
-The function @code{cloog_union_domain_from_isl_union_map} takes a
-@code{isl_union_map} as input and returns a pointer
-to a @code{CloogUnionDomain}.
-The input is a mapping from different
-spaces (different tuple names and possibly different dimensions)
-to a common space.  The iteration domains are set to the domains
-in each space.  The statement names are set to the names of the
-spaces.  The parameter names of the result are set to those of
-the input, but the iterator and scattering dimension names are
-left unspecified.
-The function consumes a reference to the given @code{isl_union_map}.
-The function @code{cloog_union_domain_from_isl_union_set} is similar,
-but takes unscattered domains as input.
-
-
-@node CloogStatement
-@subsection CloogStatement
-@example
-@group
-struct cloogstatement
-@{ int number ;                  /* The statement unique number. */
-  char *name;                   /* Name of the statement. */
-  void * usr ;                  /* Pointer for user's convenience. */
-  struct cloogstatement * next ;/* Next element of the linked list. */
-@} ;
-typedef struct cloogstatement CloogStatement ;
-
-CloogStatement *cloog_statement_malloc(CloogState *state);
-void cloog_statement_print(FILE *, CloogStatement *);
-void cloog_statement_free(CloogStatement *);
-@end group
-@end example
-
-@noindent The @code{CloogStatement} structure represents a @code{NULL}
-terminated linked
-list of statements. In CLooG, a statement is only defined by its unique
-number (@code{number}). The user can use the pointer @code{usr} for his
-own convenience to link his own statement representation to the
-corresponding @code{CloogStatement} structure. The whole management of the
-@code{usr} pointer is under the responsibility of the user, in particular,
-CLooG never tries to print, to allocate or to free a memory block pointed
-by @code{usr}. 
-
-
-
-@node CloogOptions
-@subsection CloogOptions
-@example
-@group
-struct cloogoptions
-@{ int l ;                     /* -l option.          */
-  int f ;                     /* -f option.          */
-  int strides ;               /* -strides option.    */
-  int sh ;                    /* -sh option.         */
-  int first_unroll;	      /* First level to unroll. */
-  int esp ;                   /* -esp option.        */
-  int fsp ;                   /* -fsp option.        */
-  int otl ;                   /* -otl option.        */
-  int block ;                 /* -block option.      */
-  int compilable ;            /* -compilable option. */
-  int language;               /* LANGUAGE_C or LANGUAGE_FORTRAN */
-  int save_domains;           /* Save unsimplified copy of domain. */
-@} ;
-typedef struct cloogoptions CloogOptions ;
-
-CloogOptions *cloog_options_malloc(CloogState *state);
-void cloog_options_print(FILE *foo, CloogOptions *options);
-void cloog_options_free(CloogOptions *options);
-@end group
-@end example
-
-@noindent The @code{CloogOptions} structure contains all the possible options to
-rule CLooG's behaviour (@pxref{Calling CLooG}).
-As a reminder, the default values are:
-@itemize @bullet
-@item @math{l = -1} (optimize control until the innermost loops),
-@item @math{f = 1} (optimize control from the outermost loops),
-@item @math{strides = 0} (use only unit strides),
-@item @math{sh = 0} (do not compute simple convex hulls),
-@item @math{first_unroll = -1} (do not perform unrolling),
-@item @math{esp = 1} (spread complex equalities),
-@item @math{fsp = 1} (start to spread from the first iterators),
-@item @math{otl = 1} (simplify loops running only once).
-@item @math{block = 0} (do not make statement blocks when not necessary).
-@item @math{compilable = 0} (do not generate a compilable code).
-@end itemize 
-
-The @code{save_domains} option is only useful for users of the CLooG
-library.  This option defaults to 0, but when it is set, the @code{domain}
-field of each @code{clast_user_stmt} will be set to the set of values for the
-scattering dimensions for which this instance of the user statement is executed.
-The @code{domain} field of each @code{clast_for} contains the set of values for
-the scattering dimensions for which an instance of a user statement is executed
-inside the @code{clast_for}. It is only available if the @code{clast_for}
-enumerates a scattering dimension.
-
-@node CloogInput
-@subsection CloogInput
-@example
-@group
-CloogInput *cloog_input_read(FILE *file, CloogOptions *options);
-CloogInput *cloog_input_alloc(CloogDomain *context,
-                                CloogUnionDomain *ud);
-void cloog_input_free(CloogInput *input);
-
-void cloog_input_dump_cloog(FILE *, CloogInput *, CloogOptions *);
-@end group
-@end example
-
-@noindent A @code{CloogInput} structure represents the input to CLooG.
-It is essentially a @code{CloogUnionDomain} along with a context
-@code{CloogDomain}.  A @code{CloogInput} can be created from
-a @code{CloogDomain} and a @code{CloogUnionDomains} using
-@code{cloog_input_alloc}, or it can be read from a CLooG input
-file using @code{cloog_input_read}.  The latter also modifies
-the @code{language} field of the @code{CloogOptions} structure.
-The constructed @code{CloogInput} can be used as input
-to a @code{cloog_clast_create_from_input} call.
-
-A @code{CloogInput} data structure and a @code{CloogOptions} contain
-the same information as a .cloog file. This function dumps the .cloog
-description of the given data structures into a file.
-
-@node Dump CLooG Input File Function
-@subsection Dump CLooG Input File Function
-@example
-@end example
-
-@node CLooG Output
-@section CLooG Output
-
-@noindent
-Given a description of the input,
-an AST corresponding to the @code{CloogInput} can be constructed
-using @code{cloog_clast_create_from_input} and destroyed using
-@code{free_clast_stmt}.
-@example
-struct clast_stmt *cloog_clast_create_from_input(CloogInput *input,
-                                      CloogOptions *options);
-void free_clast_stmt(struct clast_stmt *s);
-@end example
-@noindent
-@code{clast_stmt} represents a linked list of ``statements''.
-@example
-struct clast_stmt @{
-    const struct clast_stmt_op    *op;
-    struct clast_stmt	*next;
-@};
-@end example
-@noindent
-The entries in the list are not of type @code{clast_stmt} itself,
-but of some larger type.  The following statement types are defined
-by CLooG.
-
-@example
-struct clast_root @{
-    struct clast_stmt   stmt;
-    CloogNames *        names;
-@};
-struct clast_root *new_clast_root(CloogNames *names);
-
-struct clast_assignment @{
-    struct clast_stmt   stmt;
-    const char *        LHS;
-    struct clast_expr * RHS;
-@};
-struct clast_assignment *new_clast_assignment(const char *lhs,
-                                              struct clast_expr *rhs);
-
-struct clast_block @{
-    struct clast_stmt   stmt;
-    struct clast_stmt * body;
-@};
-struct clast_block *new_clast_block(void);
-
-struct clast_user_stmt @{
-    struct clast_stmt   stmt;
-    CloogDomain *	domain;
-    CloogStatement *    statement;
-    struct clast_stmt * substitutions;
-@};
-struct clast_user_stmt *new_clast_user_stmt(CloogDomain *domain,
-    CloogStatement *stmt, struct clast_stmt *subs);
-
-struct clast_for @{
-    struct clast_stmt   stmt;
-    CloogDomain *       domain;
-    const char *        iterator;
-    struct clast_expr * LB;
-    struct clast_expr * UB;
-    cloog_int_t         stride;
-    struct clast_stmt * body;
-@};
-struct clast_for *new_clast_for(CloogDomain *domain, const char *it,
-                                struct clast_expr *LB, struct clast_expr *UB,
-                                cloog_int_t stride);
-
-struct clast_guard @{
-    struct clast_stmt   stmt;
-    struct clast_stmt * then;
-    int                 n;
-    struct clast_equation       eq[1];
-@};
-struct clast_guard *new_clast_guard(int n);
-@end example
-@noindent
-The @code{clast_stmt} returned by @code{cloog_clast_create}
-is a @code{clast_root}.
-It contains a placeholder for all the variable names that appear
-in the AST and a (list of) nested statement(s).
-
-@noindent
-A @code{clast_assignment} assigns the value given by
-the @code{clast_expr} @code{RHS} to a variable named @code{LHS}.
-
-@noindent
-A @code{clast_block} groups a list of statements into one statement.
-These statements are only generated if the @code{block} option is set,
-@pxref{Statement Block} and @ref{CloogOptions}.
-
-@noindent
-A @code{clast_user_stmt} represents a call to a statement specified
-by the user, @pxref{CloogStatement}.
-@code{substitutions} is a list of @code{clast_assignment} statements
-assigning an expression in terms of the scattering dimensions to
-each of the original iterators in the original order.
-The @code{LHS}s of these assignments are left blank (@code{NULL}).
-The @code{domain} is set to @code{NULL} if the @code{save_domains} option
-is not set.  Otherwise, it is set to the set
-of values for the scattering dimensions
-for which this instance of the user statement is executed.
-Note that unless the @code{noscalars} option has been set, the
-constant scattering dimensions may have been removed from this set.
-
-@noindent
-A @code{clast_for} represents a for loop, iterating @code{body} for each
-value of @code{iterator} between @code{LB} and @code{UB} in steps
-of size @code{stride}.
-The @code{domain} is set to @code{NULL} if the @code{save_domains} option is not
-set.  Otherwise, it is set to the set of values for the scattering dimensions
-for which a user statement is executed inside this @code{clast_for}.  Note that
-unless the @code{noscalars} option has been set, the constant scattering
-dimensions may have been removed from this set.
-
-@noindent
-A @code{clast_guard} represents the guarded execution of the @code{then}
-(list of) statement(s) by a conjunction of @code{n} (in)equalities.
-Each (in)equality is represented by a @code{clast_equation}.
-@example
-struct clast_equation @{
-    struct clast_expr *	LHS;
-    struct clast_expr *	RHS;
-    int			sign;
-@};
-@end example
-@noindent
-The condition expressed by a @code{clast_equation} is
-@code{LHS <= RHS}, @code{LHS == RHS} or @code{LHS >= RHS}
-depending on whether @code{sign} is less than zero, equal
-to zero, or greater than zero.
-
-The dynamic type of a @code{clast_stmt} can be determined
-using the macro @code{CLAST_STMT_IS_A(stmt,type)},
-where @code{stmt} is a pointer to a @code{clast_stmt}
-and @code{type} is one of @code{stmt_root}, @code{stmt_ass},
-@code{stmt_user}, @code{stmt_block}, @code{stmt_for} or
-@code{stmt_guard}.
-Users are allowed to define their own statement types by
-assigning the @code{op} field of the statements a pointer
-to a @code{clast_stmt_op} structure.
-@example
-struct clast_stmt_op @{
-    void (*free)(struct clast_stmt *);
-@};
-@end example
-@noindent
-The @code{free} field of this structure should point
-to a function that frees the user defined statement.
-
-@noindent
-A @code{clast_expr} can be an identifier, a term,
-a binary expression or a reduction.
-@example
-enum clast_expr_type @{
-    clast_expr_name,
-    clast_expr_term,
-    clast_expr_bin,
-    clast_expr_red
-@};
-struct clast_expr @{
-    enum clast_expr_type type;
-@};
-void free_clast_expr(struct clast_expr *e);
-@end example
-
-@noindent
-Identifiers are of subtype @code{clast_name}.
-@example
-struct clast_name @{
-    struct clast_expr	expr;
-    const char *	name;
-@};
-struct clast_name *new_clast_name(const char *name);
-void free_clast_name(struct clast_name *t);
-@end example
-@noindent
-The character string pointed to by @code{name} is
-assumed to be part of the @code{CloogNames} structure
-in the root of the clast as is therefore not copied.
-
-@noindent
-Terms are of type @code{clast_term}.
-@example
-struct clast_term @{
-    struct clast_expr   expr;
-    cloog_int_t         val;
-    struct clast_expr  *var;
-@};
-struct clast_term *new_clast_term(cloog_int_t c, struct clast_expr *v);
-void free_clast_term(struct clast_term *t);
-@end example
-@noindent
-If @code{var} is set to @code{NULL}, then the term represents
-the integer value @code{val}.  Otherwise, it represents
-the term @code{val * var}.
-@code{new_clast_term} simply copies the @code{v} pointer
-without copying the underlying @code{clast_expr}.
-@code{free_clast_term}, on the other hand, recursively frees
-@code{var}.
-
-@noindent
-Binary expressions are of type @code{clast_bin_type} and
-represent either the floor of a division (fdiv),
-the ceil of a division (cdiv), an exact division or
-the remainder of an fdiv.
-@example
-enum clast_bin_type @{ clast_bin_fdiv, clast_bin_cdiv, 
-                      clast_bin_div, clast_bin_mod @};
-struct clast_binary @{
-    struct clast_expr   expr;
-    enum clast_bin_type type;
-    struct clast_expr*  LHS;
-    cloog_int_t         RHS;
-@};
-struct clast_binary *new_clast_binary(enum clast_bin_type t, 
-                          struct clast_expr *lhs, cloog_int_t rhs);
-void free_clast_binary(struct clast_binary *b);
-@end example
-
-@noindent
-Reductions are of type @code{clast_reduction} and
-can represent either the sum, the minimum or the maximum
-of its elements.
-@example
-enum clast_red_type @{ clast_red_sum, clast_red_min, clast_red_max @};
-struct clast_reduction @{
-    struct clast_expr   expr;
-    enum clast_red_type type;
-    int                 n;
-    struct clast_expr*  elts[1];
-@};
-struct clast_reduction *new_clast_reduction(enum clast_red_type t,
-                                            int n);
-void free_clast_reduction(struct clast_reduction *r);
-@end example
-
-@node Retrieving version information
-@section Retrieving version information
-CLooG provides static and dynamic version checks to assist on
-including a compatible version of the library.
-A static version check at compile time can be achieved by
-querying the version constants defined in @code{version.h}:
-
-@itemize @bullet
-@item @code{CLOOG_VERSION_MAJOR}
-@item @code{CLOOG_VERSION_MINOR}
-@item @code{CLOOG_VERSION_REVISION}
-@end itemize
-
-This way it is possible to ensure the included headers are of the
-correct version. It is still possible that the installed CLooG
-library version differs from the installed headers.
-In order to avoid this, a dynamic version check is provided with
-the functions:
-
-@example
-@group
-int cloog_version_major(void);
-int cloog_version_minor(void);
-int cloog_version_revision(void);
-@end group
-@end example
-
-By using both the static and the dynamic version check, it is possible
-to match CLooG's header version with the library's version.
-
-@node Example of Library Utilization
-@section Example of Library Utilization
-Here is a basic example showing how it is possible to use the CLooG library,
-assuming that a standard installation has been done.
-The following C program reads a CLooG input file on the standard input,
-then prints the solution on the standard output.
-Options are preselected to the default values of the CLooG software.
-This example is provided in the @code{example} directory of the
-CLooG distribution.
-@example
-/* example.c */
-# include <stdio.h>
-# include <cloog/cloog.h>
-
-int main()
-@{
-  CloogState *state;
-  CloogInput *input;
-  CloogOptions * options ;
-  struct clast_stmt *root;
-  
-  /* Setting options and reading program informations. */
-  state = cloog_state_malloc();
-  options = cloog_options_malloc(state);
-  input = cloog_input_read(stdin, options);
-
-  /* Generating and printing the code. */
-  root = cloog_clast_create_from_input(input, options);
-  clast_pprint(stdout, root, 0, options);
-
-  cloog_clast_free(root);
-  cloog_options_free(options) ;
-  cloog_state_free(state);
-  return 0;
-@}
-@end example
-
-@noindent The compilation command could be:
-@example
-gcc example.c -lcloog -o example
-@end example
-@noindent A calling command with the input file test.cloog could be:
-@example
-more test.cloog | ./example
-@end example
-
-
-@c %  ******************************** HACKING *********************************
-@c @node Hacking
-@c @chapter Hacking CLooG
-
-@c @menu
-@c * Program organization::
-@c * Special Options::
-@c * CLooG Coding Standards::
-@c @end menu
-
-@c @node Program organization
-@c @section Program organization
-
-@c @node Special Options
-@c @section Special Options
-
-@c @node CLooG Coding Standards
-@c @section CLooG Coding Standards
-
-
-@c %  ****************************** INSTALLING ********************************
-@node Installing
-@chapter Installing CLooG
-
-@menu
-* License::
-* Requirements::
-* Basic Installation::
-* Optional Features::
-* Uninstallation::
-@end menu
-
-@node License
-@section License
-First of all, it would be very kind to refer the following paper in any
-publication that result from the use of the CLooG software or its library,
-@pxref{Bas04} (a bibtex entry is provided behind the title page of this
-manual, along with copyright notice, and in the CLooG home
-@code{http://www.CLooG.org}.
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Lesser General Public License for more details.
-@code{http://www.gnu.org/licenses/lgpl-2.1.html}
-
-Note, though, that if you link CLooG against a GPL library such
-as the PolyLib backend, then the combination becomes GPL too.
-In particular, a CLooG library based on the PolyLib backend
-is GPL version 2 only.
-Since the isl backend is LGPL, linking against it does not affect
-the license of CLooG.
-
-
-@node Requirements
-@section Requirements
-
-CLooG can be used with one of two possible backends,
-one using isl and one using PolyLib.
-The isl library is included in the CLooG distribution,
-while the PolyLib library needs to be obtained separately.
-On the other hand, isl requires GMP, while PolyLib can be
-compiled with or without the use of GMP.
-The user therefore needs to install at least one of
-PolyLib or GMP.
-
-@menu
-* PolyLib::
-* GMP Library::
-@end menu
-
-
-@node PolyLib
-@subsection PolyLib (optional)
-To successfully install CLooG with the PolyLib backend,
-the user first needs to install PolyLib
-version 5.22.1 or above (default 64 bits version is satisfying
-as well as 32 bits or GMP multiple precision version).
-Polylib can be downloaded freely
-at @code{http://icps.u-strasbg.fr/PolyLib/} or
-@code{http://www.irisa.fr/polylib/}. Once downloaded and unpacked
-(e.g. using the @samp{tar -zxvf polylib-5.22.3.tar.gz} command),
-the user can compile
-it by typing the following commands on the PolyLib's root directory:
-
-@itemize @bullet
-@item @code{./configure}
-@item @code{make}
-@item And as root: @code{make install}
-@end itemize
-
-Alternatively, the latest development version can be obtained from the
-git repository:
-@itemize @bullet
-@item @code{git clone git://repo.or.cz/polylib.git}
-@item @code{cd polylib}
-@item @code{./autogen.sh}
-@item @code{./configure}
-@item @code{make}
-@item And as root: @code{make install}
-@end itemize
-
-The PolyLib default installation is @code{/usr/local}. This directory may
-not be inside your library path. To fix the problem, the user should set
-@example
-export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
-@end example
-@noindent if your shell is, e.g., bash or
-@example
-setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH:/usr/local/lib
-@end example
-@noindent if your shell is, e.g., tcsh. Add the line to your .bashrc or .tcshrc (or
-whatever convenient file) to make this change permanent. Another solution
-is to ask PolyLib to install in the standard path by using the prefix
-option of the configure script:
-@samp{./configure --prefix=/usr}.
-
-CLooG makes intensive calls to polyhedral operations, and PolyLib
-functions do the job. Polylib is a free library written in C for the
-manipulation of polyhedra. The library is operating on objects like
-vectors, matrices, lattices, polyhedra, Z-polyhedra, unions of
-polyhedra and a lot of other intermediary structures. It provides
-functions for all the important operations on these structures. 
-
-@node GMP Library
-@subsection GMP Library (optional)
-
-To be able to deal with insanely large coefficient, the user will need to
-install the GNU Multiple Precision Library (GMP for short) version 4.1.4
-or above. It can be freely downloaded from @code{http://www.swox.com/gmp}.
-Note that the isl backend currently requires GMP.
-The user can compile GMP by typing the following commands on the GMP root
-directory:
-
-@itemize @bullet
-@item @code{./configure}
-@item @code{make}
-@item And as root: @code{make install}
-@end itemize
-
-The GMP default installation is @code{/usr/local}, the same method to
-fix a library path problem applies as with PolyLib (@pxref{PolyLib}).
-
-If you want to use the PolyLib backend, then
-PolyLib has to be built using the GMP library by specifying the option
-@samp{--with-libgmp=PATH_TO_GMP} to the PolyLib configure script
-(where @code{PATH_TO_GMP} is @code{/usr/local} if you did not change the GMP
-installation directory). Then you have to set the convenient CLooG configure
-script options to build the GMP version (@pxref{Optional Features}).
-
-
-@node Basic Installation
-@section CLooG Basic Installation
-
-Once downloaded and unpacked
-(e.g. using the @samp{tar -zxvf cloog-@value{VERSION}.tar.gz} command),
-you can compile CLooG by typing the following commands on the CLooG's root
-directory:
-
-@itemize @bullet
-@item @code{./configure}
-@item @code{make}
-@item And as root: @code{make install}
-@end itemize
-
-Alternatively, the latest development version can be obtained from the
-git repository:
-@itemize @bullet
-@item @code{git clone git://repo.or.cz/cloog.git}
-@item @code{cd cloog}
-@item @code{./get_submodules.sh}
-@item @code{./autogen.sh}
-@item @code{./configure}
-@item @code{make}
-@item And as root: @code{make install}
-@end itemize
-
-Depending on which backend you want to use and where they
-are located, you may need to pass some
-options to the configure script, @pxref{Optional Features}.
-
-The program binaries and object files can be removed from the
-source code directory by typing @code{make clean}. To also remove the
-files that the @code{configure} script created (so you can compile the
-package for a different kind of computer) type @code{make distclean}.
-
-Both the CLooG software and library have been successfully compiled
-on the following systems:
-@itemize @bullet
-@item PC's under Linux, with the @code{gcc} compiler,
-@item PC's under Windows (Cygwin), with the @code{gcc} compiler,
-@item Sparc and UltraSparc Stations, with the @code{gcc} compiler.
-@end itemize
-
-@node Optional Features 
-@section Optional Features  
-The @code{configure} shell script attempts to guess correct values for
-various system-dependent variables and user options used during compilation.
-It uses those values to create the @code{Makefile}. Various user options
-are provided by the CLooG's configure script. They are summarized in the
-following list and may be printed by typing @code{./configure --help} in the
-CLooG top-level directory.
-
-@itemize @bullet
-@item By default, the installation directory is @code{/usr/local}:
-@code{make install} will install the package's files in
-@code{/usr/local/bin}, @code{/usr/local/lib} and @code{/usr/local/include}.
-The user can specify an installation prefix other than @code{/usr/local} by
-giving @code{configure} the option @code{--prefix=PATH}.
-
-@item By default, the isl backend will use the version of isl
-that is @code{bundled} together with CLooG.
-Using the @code{--with-isl} option of @code{configure}
-the user can specify that @code{no} isl,
-a previously installed (@code{system}) isl or a @code{build} isl
-should be used.
-In the latter case, the user should also specify the build location
-using @code{--with-isl-builddir=PATH}.
-In case of an installed isl,
-the installation location can be specified using the
-@code{--with-isl-prefix=PATH} and
-@code{--with-isl-exec-prefix=PATH} options of @code{configure}.
-
-@item By default, the PolyLib backend will use an installed
-(@code{system}) PolyLib, if any.
-The installation location can be specified using the
-@code{--with-polylib-prefix=PATH} and
-@code{--with-polylib-exec-prefix=PATH} options of @code{configure}.
-Using the @code{--with-polylib} option of @code{configure}
-the user can specify that @code{no} PolyLib or a @code{build} PolyLib
-should be used.
-In the latter case, the user should also specify the build location
-using @code{--with-polylib-builddir=PATH}.
-
-@item By default, the PolyLib backend of CLooG is built
-in 64bits version if such version of the
-PolyLib is found by @code{configure}. If the only existing version of the
-PolyLib is the 32bits or if the user give to @code{configure} the option
-@code{--with-bits=32}, the 32bits version of CLooG will be compiled. In the
-same way, the option @code{--with-bits=gmp} have to be used to build
-the multiple precision version.
-
-@item By default, @code{configure} will look for the GMP library
-(necessary to build the multiple precision version) in standard
-locations. If necessary, the user can specify the GMP path by giving
-@code{configure} the option @code{--with-gmp-prefix=PATH} and/or
-@code{--with-gmp-exec-prefix=PATH}.
-@end itemize
-
-@node Uninstallation 
-@section Uninstallation  
-The user can easily remove the CLooG software and library from his system
-by typing (as root if necessary) from the CLooG top-level directory
-@code{make uninstall}.
-
-@c %  **************************** DOCUMENTATION ******************************
-@node Documentation
-@chapter Documentation
-The CLooG distribution provides several documentation sources. First, the
-source code itself is as documented as possible. The code comments use a
-Doxygen-compatible presentation (something similar to what JavaDoc does for
-JAVA). The user may install Doxygen
-(see @code{http://www.stack.nl/~dimitri/doxygen}) to automatically
-generate a technical documentation by typing @code{make doc} or
-@code{doxygen ./autoconf/Doxyfile} at the CLooG top-level directory after
-running the configure script (@pxref{Installing}). Doxygen will generate
-documentation sources (in HTML, LaTeX and man) in the @code{doc/source}
-directory of the CLooG distribution.
-
-The Texinfo sources of the present document are also provided in the @code{doc}
-directory. You can build it in either DVI format (by typing
-@code{texi2dvi cloog.texi}) or PDF format
-(by typing @code{texi2pdf cloog.texi}) or HTML format
-(by typing @code{makeinfo --html cloog.texi}, using @code{--no-split}
-option to generate a single HTML file) or info format
-(by typing @code{makeinfo cloog.texi}).
-
-@c %  ****************************** REFERENCES ********************************
-@node References
-@chapter References
-
-@itemize
-@item
-@anchor{Bas03a}[Bas03a] C. Bastoul, P. Feautrier. Improving data locality
-by chunking. CC'12 International Conference on Compiler Construction,
-LNCS 2622, pages 320-335, Warsaw, april 2003. 
-
-@item
-@anchor{Bas03b}[Bas03b] C. Bastoul. Efficient code generation for automatic
-parallelization and optimization. ISPDC'03 IEEE International Symposium on
-Parallel and Distributed Computing, pages 23-30, Ljubljana, october 2003. 
-
-@item
-@anchor{Bas04}[Bas04] C. Bastoul. Code Generation in the Polyhedral Model
-Is Easier Than You Think. PACT'13 IEEE International Conference on Parallel
-Architecture and Compilation Techniques, pages 7-16, Juan-les-Pins,
-september 2004.
-
-@item
-@anchor{Fea92}[Fea92] P. Feautrier Some efficient solutions to the affine
-scheduling problem, part II: multidimensional time.
-International Journal of Parallel Programming, 21(6):389--420, December 1992.
-
-@item
-@anchor{Gri04}[Gri04] M. Griebl. Automatic parallelization of loop programs
-for distributed memory architectures. Habilitation Thesis. Facult@"at f@"ur
-Mathematik und Informatik, Universit@"at Passau, 2004.
-@emph{http://www.infosun.fmi.uni-passau.de/cl/loopo/}
-
-@item
-@anchor{Qui00}[Qui00] F. Quiller@'e, S. Rajopadhye, and D. Wilde.
-Generation of efficient nested loops from polyhedra.
-International Journal of Parallel Programming, 28(5):469-498,
-october 2000.
-
-@item
-@anchor{Wil93}[Wil93] Doran K. Wilde.
-A library for doing polyhedral operations.
-Technical Report 785, IRISA, Rennes, France, 1993.
-
-@end itemize
-
-
-
-
-@c % /*************************************************************************
-@c %  *                       PART VI: END OF THE DOCUMENT                    *
-@c %  *************************************************************************/
-@c @unnumbered Index
-     
-@c @printindex cp
-     
-@bye
diff --git a/cloog-0.16.3/doc/images/basic.eps b/cloog-0.16.3/doc/images/basic.eps
deleted file mode 100644
index 0cc0497..0000000
--- a/cloog-0.16.3/doc/images/basic.eps
+++ /dev/null
@@ -1,402 +0,0 @@
-%!PS-Adobe-2.0 EPSF-2.0
-%%Title: basic.fig
-%%Creator: fig2dev Version 3.2 Patchlevel 4
-%%CreationDate: Thu Nov 17 16:54:54 2005
-%%For: bastoul@ulysse.futurs.inria.fr (Cedric Bastoul)
-%%BoundingBox: 0 0 445 301
-%%Magnification: 1.0000
-%%EndComments
-/$F2psDict 200 dict def
-$F2psDict begin
-$F2psDict /mtrx matrix put
-/col-1 {0 setgray} bind def
-/col0 {0.000 0.000 0.000 srgb} bind def
-/col1 {0.000 0.000 1.000 srgb} bind def
-/col2 {0.000 1.000 0.000 srgb} bind def
-/col3 {0.000 1.000 1.000 srgb} bind def
-/col4 {1.000 0.000 0.000 srgb} bind def
-/col5 {1.000 0.000 1.000 srgb} bind def
-/col6 {1.000 1.000 0.000 srgb} bind def
-/col7 {1.000 1.000 1.000 srgb} bind def
-/col8 {0.000 0.000 0.560 srgb} bind def
-/col9 {0.000 0.000 0.690 srgb} bind def
-/col10 {0.000 0.000 0.820 srgb} bind def
-/col11 {0.530 0.810 1.000 srgb} bind def
-/col12 {0.000 0.560 0.000 srgb} bind def
-/col13 {0.000 0.690 0.000 srgb} bind def
-/col14 {0.000 0.820 0.000 srgb} bind def
-/col15 {0.000 0.560 0.560 srgb} bind def
-/col16 {0.000 0.690 0.690 srgb} bind def
-/col17 {0.000 0.820 0.820 srgb} bind def
-/col18 {0.560 0.000 0.000 srgb} bind def
-/col19 {0.690 0.000 0.000 srgb} bind def
-/col20 {0.820 0.000 0.000 srgb} bind def
-/col21 {0.560 0.000 0.560 srgb} bind def
-/col22 {0.690 0.000 0.690 srgb} bind def
-/col23 {0.820 0.000 0.820 srgb} bind def
-/col24 {0.500 0.190 0.000 srgb} bind def
-/col25 {0.630 0.250 0.000 srgb} bind def
-/col26 {0.750 0.380 0.000 srgb} bind def
-/col27 {1.000 0.500 0.500 srgb} bind def
-/col28 {1.000 0.630 0.630 srgb} bind def
-/col29 {1.000 0.750 0.750 srgb} bind def
-/col30 {1.000 0.880 0.880 srgb} bind def
-/col31 {1.000 0.840 0.000 srgb} bind def
-
-end
-save
-newpath 0 301 moveto 0 0 lineto 445 0 lineto 445 301 lineto closepath clip newpath
--153.0 333.0 translate
-1 -1 scale
-
-/cp {closepath} bind def
-/ef {eofill} bind def
-/gr {grestore} bind def
-/gs {gsave} bind def
-/sa {save} bind def
-/rs {restore} bind def
-/l {lineto} bind def
-/m {moveto} bind def
-/rm {rmoveto} bind def
-/n {newpath} bind def
-/s {stroke} bind def
-/sh {show} bind def
-/slc {setlinecap} bind def
-/slj {setlinejoin} bind def
-/slw {setlinewidth} bind def
-/srgb {setrgbcolor} bind def
-/rot {rotate} bind def
-/sc {scale} bind def
-/sd {setdash} bind def
-/ff {findfont} bind def
-/sf {setfont} bind def
-/scf {scalefont} bind def
-/sw {stringwidth} bind def
-/tr {translate} bind def
-/tnt {dup dup currentrgbcolor
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
-  bind def
-/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
-  4 -2 roll mul srgb} bind def
-/reencdict 12 dict def /ReEncode { reencdict begin
-/newcodesandnames exch def /newfontname exch def /basefontname exch def
-/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def
-basefontdict { exch dup /FID ne { dup /Encoding eq
-{ exch dup length array copy newfont 3 1 roll put }
-{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall
-newfont /FontName newfontname put newcodesandnames aload pop
-128 1 255 { newfont /Encoding get exch /.notdef put } for
-newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat
-newfontname newfont definefont pop end } def
-/isovec [
-8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde
-8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis
-8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron
-8#220 /dotlessi 8#230 /oe 8#231 /OE
-8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling
-8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis
-8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot
-8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus
-8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph
-8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine
-8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf
-8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute
-8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring
-8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute
-8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute
-8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve
-8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply
-8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex
-8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave
-8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring
-8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute
-8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute
-8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve
-8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide
-8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex
-8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def
-/Times-Bold /Times-Bold-iso isovec ReEncode
-/Times-Roman /Times-Roman-iso isovec ReEncode
- /DrawEllipse {
-	/endangle exch def
-	/startangle exch def
-	/yrad exch def
-	/xrad exch def
-	/y exch def
-	/x exch def
-	/savematrix mtrx currentmatrix def
-	x y tr xrad yrad sc 0 0 1 startangle endangle arc
-	closepath
-	savematrix setmatrix
-	} def
-
-/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
-/$F2psEnd {$F2psEnteredState restore end} def
-
-$F2psBegin
-10 setmiterlimit
-0 slj 0 slc
- 0.06000 0.06000 sc
-%
-% Fig objects follow
-%
-% 
-% here starts figure with depth 51
-% Polyline
-n 4200 1500 m 4200 3900 l 8400 3900 l 6000 1500 l
- cp gs col7 0.75 shd ef gr 
-% Ellipse
-7.500 slw
- [15 45] 45 sd
-1 slc
-n 5400 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6000 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6600 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 7200 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 7800 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 7200 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6600 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6000 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 5400 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 5400 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6000 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6600 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6000 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 5400 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 5400 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 7800 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 8400 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 7200 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6600 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6000 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Polyline
-0 slc
-gs  clippath
-9615 5160 m 9615 5040 l 9395 5040 l 9575 5100 l 9395 5160 l cp
-eoclip
-n 3000 5100 m
- 9600 5100 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 9395 5160 m 9575 5100 l 9395 5040 l 9395 5160 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-3060 885 m 2940 885 l 2940 1105 l 3000 925 l 3060 1105 l cp
-eoclip
-n 3000 5100 m
- 3000 900 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 3060 1105 m 3000 925 l 2940 1105 l 3060 1105 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-n 3000 4500 m
- 2925 4500 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 3900 m
- 2925 3900 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 3300 m
- 2925 3300 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3600 5100 m
- 3600 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 4200 5100 m
- 4200 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 5400 5100 m
- 5400 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 4800 5100 m
- 4800 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 6000 5100 m
- 6000 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 6600 5100 m
- 6600 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 2700 m
- 2925 2700 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 1500 m
- 2925 1500 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 2100 m
- 2925 2100 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
- [15 45] 45 sd
-n 3000 1500 m
- 9000 1500 l gs col0 s gr  [] 0 sd
-% Polyline
- [15 45] 45 sd
-n 8400 5100 m
- 8400 900 l gs col0 s gr  [] 0 sd
-% Polyline
-n 7200 5100 m
- 7200 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 7800 5100 m
- 7800 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 8400 5100 m
- 8400 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
- [15 45] 45 sd
-n 3000 3900 m
- 9000 3900 l gs col0 s gr  [] 0 sd
-% Polyline
- [15 45] 45 sd
-n 5400 900 m
- 9600 5100 l gs col0 s gr  [] 0 sd
-% Polyline
- [15 45] 45 sd
-n 4200 5100 m
- 4200 900 l gs col0 s gr  [] 0 sd
-/Times-Bold-iso ff 390.00 scf sf
-2625 4650 m
-gs 1 -1 sc (1) col0 sh gr
-/Times-Bold-iso ff 390.00 scf sf
-2625 4050 m
-gs 1 -1 sc (2) col0 sh gr
-/Times-Bold-iso ff 390.00 scf sf
-3525 5550 m
-gs 1 -1 sc (1) col0 sh gr
-/Times-Bold-iso ff 390.00 scf sf
-2700 1050 m
-gs 1 -1 sc (j) col0 sh gr
-/Times-Roman-iso ff 390.00 scf sf
-8025 825 m
-gs 1 -1 sc (i<=n) col0 sh gr
-/Times-Bold-iso ff 390.00 scf sf
-4125 5550 m
-gs 1 -1 sc (2) col0 sh gr
-/Times-Bold-iso ff 390.00 scf sf
-8325 5550 m
-gs 1 -1 sc (n) col0 sh gr
-/Times-Bold-iso ff 390.00 scf sf
-2550 1575 m
-gs 1 -1 sc (m) col0 sh gr
-/Times-Roman-iso ff 390.00 scf sf
-9075 3975 m
-gs 1 -1 sc (j>=2) col0 sh gr
-/Times-Roman-iso ff 390.00 scf sf
-9075 1575 m
-gs 1 -1 sc (j<=m) col0 sh gr
-/Times-Bold-iso ff 390.00 scf sf
-9450 5475 m
-gs 1 -1 sc (i) col0 sh gr
-/Times-Roman-iso ff 390.00 scf sf
-3825 825 m
-gs 1 -1 sc (i>=2) col0 sh gr
-/Times-Roman-iso ff 390.00 scf sf
-4875 825 m
-gs 1 -1 sc (j<=n+2-i) col0 sh gr
-% here ends figure;
-$F2psEnd
-rs
-showpage
diff --git a/cloog-0.16.3/doc/images/basic.fig b/cloog-0.16.3/doc/images/basic.fig
deleted file mode 100644
index 7fe0a97..0000000
--- a/cloog-0.16.3/doc/images/basic.fig
+++ /dev/null
@@ -1,100 +0,0 @@
-#FIG 3.2
-Landscape
-Center
-Inches
-Letter  
-100.00
-Single
--2
-1200 2
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 3900 75 75 5400 3900 5400 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 3900 75 75 4800 3900 4800 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 3300 75 75 4200 3300 4200 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 3300 75 75 4800 3300 4800 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 2700 75 75 4200 2700 4200 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 3900 75 75 4200 3900 4200 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 3900 75 75 6000 3900 6000 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 3900 75 75 6600 3900 6600 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 7200 3900 75 75 7200 3900 7200 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 7800 3900 75 75 7800 3900 7800 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 7200 3300 75 75 7200 3300 7200 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 3300 75 75 6600 3300 6600 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 3300 75 75 6000 3300 6000 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 3300 75 75 5400 3300 5400 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 2700 75 75 4800 2700 4800 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 2700 75 75 5400 2700 5400 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 2700 75 75 6000 2700 6000 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 2700 75 75 6600 2700 6600 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 2100 75 75 6000 2100 6000 2175
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 2100 75 75 5400 2100 5400 2175
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 2100 75 75 4800 2100 4800 2175
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 2100 75 75 4200 2100 4200 2175
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 1500 75 75 4200 1500 4200 1575
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 1500 75 75 4800 1500 4800 1575
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 1500 75 75 5400 1500 5400 1575
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 7800 3300 75 75 7800 3300 7800 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 8400 3900 75 75 8400 3900 8400 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 7200 2700 75 75 7200 2700 7200 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 2100 75 75 6600 2100 6600 2175
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 1500 75 75 6000 1500 6000 1575
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 120.00 180.00
-	 3000 5100 9600 5100
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 120.00 180.00
-	 3000 5100 3000 900
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 4500 2925 4500
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 3900 2925 3900
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 3300 2925 3300
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3600 5100 3600 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 4200 5100 4200 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 5400 5100 5400 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 4800 5100 4800 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 6000 5100 6000 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 6600 5100 6600 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 2700 2925 2700
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 1500 2925 1500
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 2100 2925 2100
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 3000 1500 9000 1500
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 8400 5100 8400 900
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 7200 5100 7200 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 7800 5100 7800 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 8400 5100 8400 5175
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 3000 3900 9000 3900
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 5400 900 9600 5100
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 4200 5100 4200 900
-2 3 0 0 0 7 51 -1 15 0.000 0 0 -1 0 0 5
-	 4200 1500 4200 3900 8400 3900 6000 1500 4200 1500
-4 0 0 50 -1 2 26 0.0000 0 270 195 2625 4650 1\001
-4 0 0 50 -1 2 26 0.0000 0 270 195 2625 4050 2\001
-4 0 0 50 -1 2 26 0.0000 0 270 195 3525 5550 1\001
-4 0 0 50 -1 2 26 0.0000 0 345 135 2700 1050 j\001
-4 0 0 50 -1 0 26 0.0000 0 270 750 8025 825 i<=n\001
-4 0 0 50 -1 2 26 0.0000 0 270 195 4125 5550 2\001
-4 0 0 50 -1 2 26 0.0000 0 180 225 8325 5550 n\001
-4 0 0 50 -1 2 26 0.0000 0 180 330 2550 1575 m\001
-4 0 0 50 -1 0 26 0.0000 0 360 750 9075 3975 j>=2\001
-4 0 0 50 -1 0 26 0.0000 0 360 855 9075 1575 j<=m\001
-4 0 0 50 -1 2 26 0.0000 0 270 105 9450 5475 i\001
-4 0 0 50 -1 0 26 0.0000 0 270 750 3825 825 i>=2\001
-4 0 0 50 -1 0 26 0.0000 0 360 1410 4875 825 j<=n+2-i\001
diff --git a/cloog-0.16.3/doc/images/basic.jpg b/cloog-0.16.3/doc/images/basic.jpg
deleted file mode 100644
index 995b1d8..0000000
--- a/cloog-0.16.3/doc/images/basic.jpg
+++ /dev/null
Binary files differ
diff --git a/cloog-0.16.3/doc/images/basic.pdf b/cloog-0.16.3/doc/images/basic.pdf
deleted file mode 100644
index d15d42b..0000000
--- a/cloog-0.16.3/doc/images/basic.pdf
+++ /dev/null
Binary files differ
diff --git a/cloog-0.16.3/doc/images/basic.txt b/cloog-0.16.3/doc/images/basic.txt
deleted file mode 100644
index e40913a..0000000
--- a/cloog-0.16.3/doc/images/basic.txt
+++ /dev/null
@@ -1,13 +0,0 @@
- j^ i>=2          
-  | | j<=n+2-i    
-  | |\     | i<=n
-  | | \    |     
-m-+-****---+-j<=m
-  | *****  |     
-  | ****** |     
-  | *******|     
-2-+-********-j>=2
-  | |      |\    
-0-+-+------+--->i
-  | |      |     
-  0 2      n     
diff --git a/cloog-0.16.3/doc/images/tree.eps b/cloog-0.16.3/doc/images/tree.eps
deleted file mode 100644
index d80f6e9..0000000
--- a/cloog-0.16.3/doc/images/tree.eps
+++ /dev/null
@@ -1,258 +0,0 @@
-%!PS-Adobe-2.0 EPSF-2.0
-%%Title: tree.eps
-%%Creator: fig2dev Version 3.2 Patchlevel 3c
-%%CreationDate: Fri Sep  6 10:09:40 2002
-%%For: bastoul@whisky (Cedric Bastoul)
-%%BoundingBox: 0 0 388 312
-%%Magnification: 1.0000
-%%EndComments
-/$F2psDict 200 dict def
-$F2psDict begin
-$F2psDict /mtrx matrix put
-/col-1 {0 setgray} bind def
-/col0 {0.000 0.000 0.000 srgb} bind def
-/col1 {0.000 0.000 1.000 srgb} bind def
-/col2 {0.000 1.000 0.000 srgb} bind def
-/col3 {0.000 1.000 1.000 srgb} bind def
-/col4 {1.000 0.000 0.000 srgb} bind def
-/col5 {1.000 0.000 1.000 srgb} bind def
-/col6 {1.000 1.000 0.000 srgb} bind def
-/col7 {1.000 1.000 1.000 srgb} bind def
-/col8 {0.000 0.000 0.560 srgb} bind def
-/col9 {0.000 0.000 0.690 srgb} bind def
-/col10 {0.000 0.000 0.820 srgb} bind def
-/col11 {0.530 0.810 1.000 srgb} bind def
-/col12 {0.000 0.560 0.000 srgb} bind def
-/col13 {0.000 0.690 0.000 srgb} bind def
-/col14 {0.000 0.820 0.000 srgb} bind def
-/col15 {0.000 0.560 0.560 srgb} bind def
-/col16 {0.000 0.690 0.690 srgb} bind def
-/col17 {0.000 0.820 0.820 srgb} bind def
-/col18 {0.560 0.000 0.000 srgb} bind def
-/col19 {0.690 0.000 0.000 srgb} bind def
-/col20 {0.820 0.000 0.000 srgb} bind def
-/col21 {0.560 0.000 0.560 srgb} bind def
-/col22 {0.690 0.000 0.690 srgb} bind def
-/col23 {0.820 0.000 0.820 srgb} bind def
-/col24 {0.500 0.190 0.000 srgb} bind def
-/col25 {0.630 0.250 0.000 srgb} bind def
-/col26 {0.750 0.380 0.000 srgb} bind def
-/col27 {1.000 0.500 0.500 srgb} bind def
-/col28 {1.000 0.630 0.630 srgb} bind def
-/col29 {1.000 0.750 0.750 srgb} bind def
-/col30 {1.000 0.880 0.880 srgb} bind def
-/col31 {1.000 0.840 0.000 srgb} bind def
-
-end
-save
-newpath 0 312 moveto 0 0 lineto 388 0 lineto 388 312 lineto closepath clip newpath
--165.0 369.0 translate
-1 -1 scale
-
-/cp {closepath} bind def
-/ef {eofill} bind def
-/gr {grestore} bind def
-/gs {gsave} bind def
-/sa {save} bind def
-/rs {restore} bind def
-/l {lineto} bind def
-/m {moveto} bind def
-/rm {rmoveto} bind def
-/n {newpath} bind def
-/s {stroke} bind def
-/sh {show} bind def
-/slc {setlinecap} bind def
-/slj {setlinejoin} bind def
-/slw {setlinewidth} bind def
-/srgb {setrgbcolor} bind def
-/rot {rotate} bind def
-/sc {scale} bind def
-/sd {setdash} bind def
-/ff {findfont} bind def
-/sf {setfont} bind def
-/scf {scalefont} bind def
-/sw {stringwidth} bind def
-/tr {translate} bind def
-/tnt {dup dup currentrgbcolor
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
-  bind def
-/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
-  4 -2 roll mul srgb} bind def
- /DrawEllipse {
-	/endangle exch def
-	/startangle exch def
-	/yrad exch def
-	/xrad exch def
-	/y exch def
-	/x exch def
-	/savematrix mtrx currentmatrix def
-	x y tr xrad yrad sc 0 0 1 startangle endangle arc
-	closepath
-	savematrix setmatrix
-	} def
-
-/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
-/$F2psEnd {$F2psEnteredState restore end} def
-
-$F2psBegin
-%%Page: 1 1
-10 setmiterlimit
- 0.06000 0.06000 sc
-%
-% Fig objects follow
-%
-7.500 slw
-% Ellipse
-n 5400 1200 237 237 0 360 DrawEllipse gs col0 s gr
-
-% Ellipse
-n 3000 3600 237 237 0 360 DrawEllipse gs col0 s gr
-
-% Ellipse
-n 7800 3600 237 237 0 360 DrawEllipse gs col0 s gr
-
-% Ellipse
-n 6600 4800 237 237 0 360 DrawEllipse gs col0 s gr
-
-% Ellipse
-n 5400 2325 237 237 0 360 DrawEllipse gs col0 s gr
-
-% Polyline
-gs  clippath
-5355 2115 m 5445 2115 l 5445 1888 l 5400 2068 l 5355 1888 l cp
-eoclip
-n 5400 1425 m
- 5400 2100 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 5355 1888 m 5400 2068 l 5445 1888 l 5355 1888 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-5355 3390 m 5445 3390 l 5445 3163 l 5400 3343 l 5355 3163 l cp
-eoclip
-n 5400 2550 m
- 5400 3375 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 5355 3163 m 5400 3343 l 5445 3163 l 5355 3163 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-2955 4590 m 3045 4590 l 3045 4363 l 3000 4543 l 2955 4363 l cp
-eoclip
-n 3000 3825 m
- 3000 4575 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 2955 4363 m 3000 4543 l 3045 4363 l 2955 4363 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-6563 4544 m 6611 4621 l 6803 4500 l 6627 4558 l 6755 4424 l cp
-eoclip
-n 7800 3825 m
- 6600 4575 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 6755 4424 m 6627 4558 l 6803 4500 l 6755 4424 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-8988 4621 m 9036 4544 l 8844 4424 l 8973 4558 l 8796 4500 l cp
-eoclip
-n 7800 3825 m
- 9000 4575 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 8796 4500 m 8973 4558 l 8844 4424 l 8796 4500 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-6555 5790 m 6645 5790 l 6645 5563 l 6600 5743 l 6555 5563 l cp
-eoclip
-n 6600 5025 m
- 6600 5775 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 6555 5563 m 6600 5743 l 6645 5563 l 6555 5563 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-7802 3411 m 7831 3326 l 7615 3253 l 7772 3354 l 7587 3338 l cp
-eoclip
-n 5400 2550 m
- 7803 3364 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 7587 3338 m 7772 3354 l 7615 3253 l 7587 3338 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-2971 3337 m 3000 3422 l 3215 3348 l 3031 3364 l 3186 3262 l cp
-eoclip
-n 5400 2550 m
- 3000 3375 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 3186 3262 m 3031 3364 l 3215 3348 l 3186 3262 l  cp gs 0.00 setgray ef gr  col0 s
-/Times-Roman ff 330.00 scf sf
-3075 4200 m
-gs 1 -1 sc (0) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-6675 5400 m
-gs 1 -1 sc (0) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-5475 3000 m
-gs 1 -1 sc (1) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-3825 3000 m
-gs 1 -1 sc (0) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-6900 3000 m
-gs 1 -1 sc (2) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-6975 4200 m
-gs 1 -1 sc (0) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-8475 4200 m
-gs 1 -1 sc (1) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-5475 1800 m
-gs 1 -1 sc (0) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-2850 4950 m
-gs 1 -1 sc (S1) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-5250 3750 m
-gs 1 -1 sc (S2) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-6450 6150 m
-gs 1 -1 sc (S3) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-8850 4950 m
-gs 1 -1 sc (S4) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-5355 2430 m
-gs 1 -1 sc (i) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-2963 3667 m
-gs 1 -1 sc (j) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-7763 3675 m
-gs 1 -1 sc (j) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-6533 4890 m
-gs 1 -1 sc (k) col0 sh gr
-$F2psEnd
-rs
diff --git a/cloog-0.16.3/doc/images/tree.fig b/cloog-0.16.3/doc/images/tree.fig
deleted file mode 100644
index 9c202bb..0000000
--- a/cloog-0.16.3/doc/images/tree.fig
+++ /dev/null
@@ -1,54 +0,0 @@
-#FIG 3.2
-Landscape
-Center
-Inches
-Letter  
-100.00
-Single
--2
-1200 2
-1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 5400 1200 237 237 5400 1200 5625 1275
-1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 3000 3600 237 237 3000 3600 3225 3675
-1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 7800 3600 237 237 7800 3600 8025 3675
-1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 6600 4800 237 237 6600 4800 6825 4875
-1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 5400 2325 237 237 5400 2325 5625 2400
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 5400 1425 5400 2100
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 5400 2550 5400 3375
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 3000 3825 3000 4575
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 7800 3825 6600 4575
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 7800 3825 9000 4575
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 6600 5025 6600 5775
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 5400 2550 7803 3364
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 5400 2550 3000 3375
-4 0 0 50 0 0 22 0.0000 0 225 150 3075 4200 0\001
-4 0 0 50 0 0 22 0.0000 0 225 150 6675 5400 0\001
-4 0 0 50 0 0 22 0.0000 0 225 150 5475 3000 1\001
-4 0 0 50 0 0 22 0.0000 0 225 150 3825 3000 0\001
-4 0 0 50 0 0 22 0.0000 0 225 150 6900 3000 2\001
-4 0 0 50 0 0 22 0.0000 0 225 150 6975 4200 0\001
-4 0 0 50 0 0 22 0.0000 0 225 150 8475 4200 1\001
-4 0 0 50 0 0 22 0.0000 0 225 150 5475 1800 0\001
-4 0 0 50 0 0 22 0.0000 0 225 345 2850 4950 S1\001
-4 0 0 50 0 0 22 0.0000 0 225 345 5250 3750 S2\001
-4 0 0 50 0 0 22 0.0000 0 225 345 6450 6150 S3\001
-4 0 0 50 0 0 22 0.0000 0 225 345 8850 4950 S4\001
-4 0 0 50 0 0 22 0.0000 0 225 90 5355 2430 i\001
-4 0 0 50 0 0 22 0.0000 0 300 90 2963 3667 j\001
-4 0 0 50 0 0 22 0.0000 0 300 90 7763 3675 j\001
-4 0 0 50 0 0 22 0.0000 0 225 150 6533 4890 k\001
diff --git a/cloog-0.16.3/doc/images/tree.jpg b/cloog-0.16.3/doc/images/tree.jpg
deleted file mode 100644
index 7329268..0000000
--- a/cloog-0.16.3/doc/images/tree.jpg
+++ /dev/null
Binary files differ
diff --git a/cloog-0.16.3/doc/images/tree.pdf b/cloog-0.16.3/doc/images/tree.pdf
deleted file mode 100644
index 7569ede..0000000
--- a/cloog-0.16.3/doc/images/tree.pdf
+++ /dev/null
Binary files differ
diff --git a/cloog-0.16.3/doc/images/tree.txt b/cloog-0.16.3/doc/images/tree.txt
deleted file mode 100644
index 7bcfef2..0000000
--- a/cloog-0.16.3/doc/images/tree.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-       *
-       |
-       |0
-       |
-       V
-       i
-       |
- +-----+-----+
- |     |     |      
- |0    |1    |2 
- |     |     |      
- V     V     V
- j     S2    j
- |           |
- |0       +--+--+
- |        |     |
- V        |0    |1
- S1       |     |
-          V     V
-          k     S4
-          |
-          |0
-          |
-          V
-          S3
diff --git a/cloog-0.16.3/examples/README b/cloog-0.16.3/examples/README
deleted file mode 100644
index 1a9881e..0000000
--- a/cloog-0.16.3/examples/README
+++ /dev/null
@@ -1,58 +0,0 @@
-#
-#  /**-------------------------------------------------------------------**
-#   **                              CLooG                                **
-#   **-------------------------------------------------------------------**
-#   **                       Library use examples                        **
-#   **-------------------------------------------------------------------**
-#   **             First version of this file: july 15th 2003            **
-#   **-------------------------------------------------------------------**/
-#
-
-
-In this directory are presented various examples of how to use the CLooG
-library. For each case, you will need to edit the makefile file according to
-your system, in particular you will have to set where your CLooG library has
-been installed, and where are the CLooG header files. Don't forget to update
-your LD_LIBRARY_PATH environment variable to reach the CLooG library. If you
-performed the default installation of CLooG, the library is in /usr/local/lib
-thus you need to set LD_LIBRARY_PATH thanks to one of the following command:
-'setenv LD_LIBRARY_PATH /usr/local/lib' for tcsh-like shells, or
-'export LD_LIBRARY_PATH=/usr/local/lib' for bash-like shells.
-
-For any problem: <cedric.bastoul@inria.fr>.
-
-
-#   **-------------------------------------------------------------------**
-#   **                          I. Example                               **
-#   **-------------------------------------------------------------------**/
-
-
-This example program creates a simple CLooG-like loop generation program in a
-few lines. The input problem has to be given on standard input. We can test it
-for instance by typing 'more FILE.cloog | ./example' (or example.exe under
-Cygwin).
-
-
-#   **-------------------------------------------------------------------**
-#   **                       II. cloog2loopgen                           **
-#   **-------------------------------------------------------------------**/
-
-NO MORE EXISTS !
-
-This example creates a program converting a CLooG input file to a LoopGen input
-file. This can be useful to compare the two tools (I do not support LoopGen,
-don't ask me if you find some bugs !). The usage of the created tool is:
-'cloog2loopgen input_file output_file'.
-
-
-#   **-------------------------------------------------------------------**
-#   **                       III. cloog2Omega                            **
-#   **-------------------------------------------------------------------**/
-
-
-NO MORE EXISTS !
-
-This example creates a program converting a CLooG input file to an Omega
-CodeGen input file. This can be useful to compare the two tools (I do not
-support CodeGen, don't ask me if you find some bugs !). The usage of the
-created tool is: 'cloog2omega input_file output_file'.
diff --git a/cloog-0.16.3/examples/example/Makefile b/cloog-0.16.3/examples/example/Makefile
deleted file mode 100644
index 9b6150b..0000000
--- a/cloog-0.16.3/examples/example/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
-# Please enter here the locations for CloogLib include and libraries if they
-# aren't the default values (/usr/lib and /usr/include).
-CLOOG_INC = $(HOME)/progs/linux/include
-CLOOG_LIB = $(HOME)/progs/linux/lib
-
-CC = gcc
-LDLIBS= -lcloog
-CFLAGS= -I $(CLOOG_INC) -L $(CLOOG_LIB)
-
-
-example: example.c
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *                Making example                 *"
-	@echo "              *-----------------------------------------------*/"
-	$(CC) example.c -o example $(CFLAGS) $(LDLIBS)
-
-clean:
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *               Cleaning example                *"
-	@echo "              *-----------------------------------------------*/"
-	-rm -f example example.exe core
diff --git a/cloog-0.16.3/examples/example/example.c b/cloog-0.16.3/examples/example/example.c
deleted file mode 100644
index 403d213..0000000
--- a/cloog-0.16.3/examples/example/example.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* This is a very simple example of how to use the CLooGLib inside your
- * programs. You should compile it by typing 'make' (after edition of the
- * makefile), then test it for instance by typing
- * 'more FILE.cloog | ./example' (or example.exe under Cygwin).
- */
-
-# include <stdio.h>
-# include <cloog/cloog.h>
-
-int main()
-{
-  CloogState *state;
-  CloogInput *input;
-  CloogOptions * options ;
-  struct clast_stmt *root;
-  
-  state = cloog_state_malloc();
-  options = cloog_options_malloc(state);
-  input = cloog_input_read(stdin, options);
-  
-  root = cloog_clast_create_from_input(input, options);
-  clast_pprint(stdout, root, 0, options);
-
-  cloog_clast_free(root);
-  cloog_options_free(options) ;
-  cloog_state_free(state);
-  
-  return 0 ;
-}
diff --git a/cloog-0.16.3/genversion.sh.in b/cloog-0.16.3/genversion.sh.in
deleted file mode 100755
index 77c04d7..0000000
--- a/cloog-0.16.3/genversion.sh.in
+++ /dev/null
@@ -1,15 +0,0 @@
-#! /bin/sh
-srcdir=@abs_srcdir@
-PACKAGE=@PACKAGE@
-VERSION=@VERSION@
-
-if test -f $srcdir/.git/HEAD; then
-    GIT_REPO="$srcdir/.git"
-    GIT_HEAD_ID=`GIT_DIR=$GIT_REPO git describe`
-elif test -f $srcdir/CLOOG_HEAD; then
-    GIT_HEAD_ID=`cat $srcdir/CLOOG_HEAD`
-else
-    GIT_HEAD_ID="$PACKAGE-$VERSION-UNKNOWN"
-fi
-
-echo $GIT_HEAD_ID | sed -e 's/cloog-//'
diff --git a/cloog-0.16.3/include/cloog/block.h b/cloog-0.16.3/include/cloog/block.h
deleted file mode 100644
index 95f2a44..0000000
--- a/cloog-0.16.3/include/cloog/block.h
+++ /dev/null
@@ -1,117 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                             block.h                               **
-    **-------------------------------------------------------------------**
-    **                    First version: June 11th 2005                  **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-#ifndef CLOOG_BLOCK_H
-#define CLOOG_BLOCK_H
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-
-/**
- * CloogBlock structure:
- * this structure contains the informations of a statement block. It may happen
- * that users are lazy enough to ask CLooG to generate the code for statements
- * with exactly the same domain/scattering pair (possibly differing by only one
- * constant) instead of giving only one pair. CLooG provides them a last chance
- * to save time and memory by trying to find these blocks itself. The block
- * contains the statement list and the common informations of the statements.
- * This structure contains also the number of existing active references to it:
- * because CLooG uses many copies of blocks there is no need to actually copy
- * these blocks but just to return a pointer to them and to increment the number
- * of active references. Each time a CloogBlock will be freed, we will decrement
- * the active reference counter and actually free it if its value is zero.
- */
-struct cloogblock
-{
-  CloogState *state;            /**< State. */
-  CloogStatement * statement ;  /**< The list of statements in the block. */
-  int  nb_scaldims ;            /**< Number of scalar dimensions. */
-  cloog_int_t *scaldims;        /**< Scalar dimension values. */
-  int depth ;                   /**< Original block depth (outer loop number).*/
-  int references ;              /**< Number of references to this structure. */
-  void * usr;		        /**< User field, for library user convenience.
-				 *   This pointer is not freed when the
-				 *   CloogBlock structure is freed.
-			         */
-} ;
-typedef struct cloogblock CloogBlock ;
-
-
-/**
- * CloogBlockList structure:
- * this structure reprensents a node of a linked list of CloogBlock structures.
- */
-struct cloogblocklist
-{ CloogBlock * block ;          /**< An element of the list. */
-  struct cloogblocklist * next ;/**< Pointer to the next element of the list.*/
-} ;
-typedef struct cloogblocklist CloogBlockList ;
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-void cloog_block_print_structure(FILE *, CloogBlock *, int) ;
-void cloog_block_print(FILE *, CloogBlock *) ;
-void cloog_block_list_print(FILE *, CloogBlockList *) ;
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-void cloog_block_free(CloogBlock *) ;
-void cloog_block_list_free(CloogBlockList *) ;
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-CloogBlock     * cloog_block_malloc(CloogState *state);
-CloogBlock     * cloog_block_alloc(CloogStatement *statement, int nb_scaldims,
-				    cloog_int_t *scaldims, int depth);
-CloogBlockList * cloog_block_list_malloc(void);
-CloogBlockList * cloog_block_list_alloc(CloogBlock *) ;
-CloogBlock     * cloog_block_copy(CloogBlock * block) ;
-void             cloog_block_merge(CloogBlock *, CloogBlock *) ;
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
-
diff --git a/cloog-0.16.3/include/cloog/clast.h b/cloog-0.16.3/include/cloog/clast.h
deleted file mode 100644
index b455369..0000000
--- a/cloog-0.16.3/include/cloog/clast.h
+++ /dev/null
@@ -1,154 +0,0 @@
-#ifndef CLOOG_CLAST_H
-#define CLOOG_CLAST_H
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-enum clast_expr_type {
-    clast_expr_name,
-    clast_expr_term,
-    clast_expr_bin,
-    clast_expr_red
-};
-struct clast_expr {
-    enum clast_expr_type type;
-};
-
-struct clast_name {
-    struct clast_expr	expr;
-    const char *	name;
-};
-
-/* Represents the term
- *	val * var	(if var != NULL)
- * or
- *	val		(if var == NULL)
- */
-struct clast_term {
-    struct clast_expr	expr;
-    cloog_int_t		val;
-    struct clast_expr  *var;
-};
-
-enum clast_red_type { clast_red_sum, clast_red_min, clast_red_max };
-struct clast_reduction {
-    struct clast_expr	expr;
-    enum clast_red_type	type;
-    int			n;
-    struct clast_expr*	elts[1];
-};
-
-enum clast_bin_type { clast_bin_fdiv, clast_bin_cdiv, 
-		      clast_bin_div, clast_bin_mod };
-struct clast_binary {
-    struct clast_expr	expr;
-    enum clast_bin_type type;
-    struct clast_expr*	LHS;
-    cloog_int_t		RHS;
-};
-
-struct clast_stmt;
-struct clast_stmt_op {
-    void (*free)(struct clast_stmt *);
-};
-
-#define CLAST_STMT_IS_A(stmt, type) ((stmt)->op == &(type))
-
-extern const struct clast_stmt_op stmt_root;
-extern const struct clast_stmt_op stmt_ass;
-extern const struct clast_stmt_op stmt_user;
-extern const struct clast_stmt_op stmt_block;
-extern const struct clast_stmt_op stmt_for;
-extern const struct clast_stmt_op stmt_guard;
-
-struct clast_stmt {
-    const struct clast_stmt_op    *op;
-    struct clast_stmt	*next;
-};
-
-struct clast_root {
-    struct clast_stmt	stmt;
-    CloogNames *	names;       /**< Names of iterators and parameters. */
-};
-
-struct clast_assignment {
-    struct clast_stmt	stmt;
-    const char *	LHS;
-    struct clast_expr *	RHS;
-};
-
-struct clast_block {
-    struct clast_stmt	stmt;
-    struct clast_stmt *	body;
-};
-
-struct clast_user_stmt {
-    struct clast_stmt	stmt;
-    CloogDomain *	domain;
-    CloogStatement *	statement;
-    struct clast_stmt *	substitutions;
-};
-
-struct clast_for {
-    struct clast_stmt	stmt;
-    CloogDomain *	domain;
-    const char *	iterator;
-    struct clast_expr *	LB;
-    struct clast_expr *	UB;
-    cloog_int_t		stride;
-    struct clast_stmt *	body;
-};
-
-struct clast_equation {
-    struct clast_expr *	LHS;
-    struct clast_expr *	RHS;
-    int			sign;
-};
-
-struct clast_guard {
-    struct clast_stmt	stmt;
-    struct clast_stmt *	then;
-    int			n;
-    struct clast_equation	eq[1];
-};
-
-
-struct clast_stmt *cloog_clast_create_from_input(CloogInput *input,
-						 CloogOptions *options);
-struct clast_stmt *cloog_clast_create(CloogProgram *program,
-				      CloogOptions *options);
-void cloog_clast_free(struct clast_stmt *s);
-
-struct clast_name *new_clast_name(const char *name);
-struct clast_term *new_clast_term(cloog_int_t c, struct clast_expr *v);
-struct clast_binary *new_clast_binary(enum clast_bin_type t, 
-				      struct clast_expr *lhs, cloog_int_t rhs);
-struct clast_reduction *new_clast_reduction(enum clast_red_type t, int n);
-struct clast_root *new_clast_root(CloogNames *names);
-struct clast_assignment *new_clast_assignment(const char *lhs,
-					      struct clast_expr *rhs);
-struct clast_user_stmt *new_clast_user_stmt(CloogDomain *domain,
-    CloogStatement *stmt, struct clast_stmt *subs);
-struct clast_block *new_clast_block(void);
-struct clast_for *new_clast_for(CloogDomain *domain, const char *it,
-                                struct clast_expr *LB, struct clast_expr *UB,
-                                CloogStride *stride);
-struct clast_guard *new_clast_guard(int n);
-
-void free_clast_name(struct clast_name *t);
-void free_clast_term(struct clast_term *t);
-void free_clast_binary(struct clast_binary *b);
-void free_clast_reduction(struct clast_reduction *r);
-void free_clast_expr(struct clast_expr *e);
-void free_clast_stmt(struct clast_stmt *s);
-
-int clast_expr_equal(struct clast_expr *e1, struct clast_expr *e2);
-
-struct clast_expr *clast_bound_from_constraint(CloogConstraint *constraint,
-					       int level, CloogNames *names);
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.16.3/include/cloog/cloog.h b/cloog-0.16.3/include/cloog/cloog.h
deleted file mode 100644
index a8c3f28..0000000
--- a/cloog-0.16.3/include/cloog/cloog.h
+++ /dev/null
@@ -1,62 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                               CLooG                               **
-    **-------------------------------------------------------------------**
-    **                              cloog.h                              **
-    **-------------------------------------------------------------------**
-    **                   First version: july 25th 2002                   **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-/******************************************************************************
- *  THIS FILE HAS BEEN AUTOMATICALLY GENERATED FROM clooh.h.in BY configure   *
- ******************************************************************************/
-
-#ifndef CLOOG_H
-#define CLOOG_H
-
-#include <cloog/version.h>
-#include <cloog/int.h>
-#include <cloog/matrix.h>
-#include <cloog/state.h>
-#include <cloog/options.h>
-#include <cloog/names.h>
-#include <cloog/constraints.h>
-#include <cloog/stride.h>
-#include <cloog/domain.h>
-#include <cloog/statement.h>
-#include <cloog/block.h>
-#include <cloog/loop.h>
-#include <cloog/union_domain.h>
-#include <cloog/input.h>
-#include <cloog/program.h>
-#include <cloog/clast.h>
-#include <cloog/pprint.h>
-
-#endif /* !CLOOG_H */
diff --git a/cloog-0.16.3/include/cloog/constraints.h b/cloog-0.16.3/include/cloog/constraints.h
deleted file mode 100644
index 4818c4c..0000000
--- a/cloog-0.16.3/include/cloog/constraints.h
+++ /dev/null
@@ -1,121 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                               CLooG                               **
-    **-------------------------------------------------------------------**
-    **                           constraints.h                           **
-    **-------------------------------------------------------------------**
-    **                    First version: april 17th 2005                 **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2005 Cedric Bastoul                                          *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-#ifndef CLOOG_CONSTRAINTS_H
-#define CLOOG_CONSTRAINTS_H
-
-struct cloogconstraint;
-typedef struct cloogconstraint CloogConstraint;
-struct cloogconstraintset;
-typedef struct cloogconstraintset CloogConstraintSet;
-struct cloogequalities;
-typedef struct cloogequalities CloogEqualities;
-
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-/******************************************************************************
- *                        Equalities spreading functions                      *
- ******************************************************************************/
-CloogEqualities *cloog_equal_alloc(int n, int nb_levels,
-			int nb_parameters);
-void		 cloog_equal_free(CloogEqualities *equal);
-int              cloog_equal_count(CloogEqualities *equal);
-int              cloog_equal_type(CloogEqualities *equal, int level);
-void             cloog_equal_del(CloogEqualities *equal, int level);
-int              cloog_equal_total_dimension(CloogEqualities *equal);
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-void          cloog_constraint_set_normalize(CloogConstraintSet *, int);
-void          cloog_constraint_set_free(CloogConstraintSet *);
-int           cloog_constraint_set_contains_level(CloogConstraintSet *constraints,
-			int level, int nb_parameters);
-int           cloog_constraint_set_total_dimension(CloogConstraintSet *constraints);
-int           cloog_constraint_set_n_iterators(CloogConstraintSet *constraints,
-			int nb_parameters);
-CloogConstraintSet *cloog_constraint_set_copy(CloogConstraintSet *);
-CloogConstraintSet *cloog_constraint_set_simplify(CloogConstraintSet *, CloogEqualities *, int, int);
-
-int cloog_constraint_needs_reduction(CloogConstraint *upper, int level);
-CloogConstraintSet *cloog_constraint_set_for_reduction(CloogConstraint *upper,
-	       CloogConstraint *lower);
-CloogConstraintSet *cloog_constraint_set_reduce(CloogConstraintSet *constraints,
-	int level, CloogEqualities *equal, int nb_par, cloog_int_t *bound);
-int cloog_constraint_set_foreach_constraint(CloogConstraintSet *constraints,
-	int (*fn)(CloogConstraint *constraint, void *user), void *user);
-int              cloog_constraint_is_valid(CloogConstraint *constraint);
-CloogConstraint *cloog_constraint_copy(CloogConstraint *constraint);
-void             cloog_constraint_release(CloogConstraint *constraint);
-CloogConstraint *cloog_constraint_invalid(void);
-int              cloog_constraint_total_dimension(CloogConstraint *constraint);
-
-CloogConstraint *cloog_equal_constraint(CloogEqualities *equal, int j);
-void             cloog_equal_add(CloogEqualities *equal,
-				  CloogConstraintSet *constraints,
-				  int level, CloogConstraint *line, int nb_par);
-
-CloogConstraint *cloog_constraint_set_defining_equality(
-			CloogConstraintSet *constraints, int level);
-CloogConstraint *cloog_constraint_set_defining_inequalities(
-			CloogConstraintSet *constraints,
-			int level, CloogConstraint **lower, int nb_parameters);
-int           cloog_constraint_involves(CloogConstraint *constraint, int v);
-int           cloog_constraint_is_lower_bound(CloogConstraint *constraint, int v);
-int           cloog_constraint_is_upper_bound(CloogConstraint *constraint, int v);
-int           cloog_constraint_is_equality(CloogConstraint *constraint);
-void          cloog_constraint_constant_get(CloogConstraint *constraint,
-			cloog_int_t *val);
-void          cloog_constraint_coefficient_get(CloogConstraint *constraint,
-			int var, cloog_int_t *val);
-void          cloog_constraint_coefficient_set(CloogConstraint *constraint,
-			int var, cloog_int_t val);
-void          cloog_constraint_copy_coefficients(CloogConstraint *constraint,
-			cloog_int_t *dst);
-CloogConstraintSet *cloog_constraint_set_drop_constraint(
-	CloogConstraintSet *constraints, CloogConstraint *constraint);
-
-struct clast_expr *cloog_constraint_variable_expr(CloogConstraint *constraint,
-			int level, CloogNames *names);
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.16.3/include/cloog/domain.h b/cloog-0.16.3/include/cloog/domain.h
deleted file mode 100644
index 65fda66..0000000
--- a/cloog-0.16.3/include/cloog/domain.h
+++ /dev/null
@@ -1,172 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                               CLooG                               **
-    **-------------------------------------------------------------------**
-    **                             domain.h                              **
-    **-------------------------------------------------------------------**
-    **                  First version: october 28th 2001                 **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-#ifndef CLOOG_DOMAIN_H
-#define CLOOG_DOMAIN_H
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-
-struct cloogdomain;
-typedef struct cloogdomain CloogDomain ;
-struct cloogscattering;
-typedef struct cloogscattering CloogScattering;
-
-
-/**
- * CloogDomainList structure:
- * this structure reprensents a node of a linked list of CloogDomain structures.
- */
-struct cloogdomainlist {
-  CloogDomain *domain;         /**< An element of the list. */
-  struct cloogdomainlist *next;/**< Pointer to the next element of the list.*/
-} ;
-typedef struct cloogdomainlist CloogDomainList;
-
-
-/**
- * CloogScatteringList structure:
- * this structure reprensents a node of a linked list of CloogScattering structures.
- */
-struct cloogscatteringlist {
-  CloogScattering *scatt;          /**< An element of the list. */
-  struct cloogscatteringlist *next;/**< Pointer to the next element of the list.*/
-} ;
-typedef struct cloogscatteringlist CloogScatteringList;
-
-
-/******************************************************************************
- *                              PolyLib interface                             *
- ******************************************************************************/
-void          cloog_domain_print_constraints(FILE *, CloogDomain *,
-						int print_number);
-void          cloog_scattering_print_constraints(FILE *, CloogScattering *);
-void          cloog_domain_free(CloogDomain *) ;
-void          cloog_scattering_free(CloogScattering *);
-CloogDomain * cloog_domain_copy(CloogDomain *) ;
-CloogDomain * cloog_domain_convex(CloogDomain * Pol) ;
-CloogDomain * cloog_domain_simple_convex(CloogDomain * domain);
-CloogDomain * cloog_domain_simplify(CloogDomain *, CloogDomain *) ;
-CloogDomain * cloog_domain_union(CloogDomain *, CloogDomain *) ;
-CloogDomain * cloog_domain_intersection(CloogDomain *, CloogDomain *) ;
-CloogDomain * cloog_domain_difference(CloogDomain *, CloogDomain *) ;
-void          cloog_domain_sort(CloogDomain**,unsigned,unsigned,int *);
-int cloog_domain_follows(CloogDomain *dom1, CloogDomain *dom2, unsigned level);
-CloogDomain * cloog_domain_empty(CloogDomain *model);
-int cloog_domain_is_bounded(CloogDomain *dim, unsigned level);
-CloogDomain *cloog_domain_bound_splitter(CloogDomain *dom, int level);
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-void cloog_domain_print_structure(FILE *file, CloogDomain *domain, int level,
-				  const char *name);
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-void cloog_domain_list_free(CloogDomainList *);
-void cloog_scattering_list_free(CloogScatteringList *);
-
-
-/*+****************************************************************************
- *                               Reading function                             *
- ******************************************************************************/
-CloogDomain * cloog_domain_read_context(CloogState *state, FILE * foo);
-CloogDomain * cloog_domain_union_read(CloogState *state, FILE *foo, int nb_par);
-CloogScattering *cloog_domain_read_scattering(CloogDomain *domain, FILE *foo);
-
-CloogDomain * cloog_domain_from_cloog_matrix(CloogState *state,
-				CloogMatrix *matrix, int nb_par);
-CloogScattering * cloog_scattering_from_cloog_matrix(CloogState *state,
-				CloogMatrix *matrix, int nb_scat, int nb_par);
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-CloogConstraintSet *cloog_domain_constraints(CloogDomain *);
-int           cloog_domain_isempty(CloogDomain *) ;
-CloogDomain * cloog_domain_universe(CloogState *state, unsigned dim);
-CloogDomain * cloog_domain_project(CloogDomain *, int);
-CloogDomain * cloog_domain_extend(CloogDomain *, int);
-int           cloog_domain_never_integral(CloogDomain *) ;
-void          cloog_domain_stride(CloogDomain *, int, cloog_int_t *, cloog_int_t *);
-int           cloog_domain_can_stride(CloogDomain *domain, int level);
-int           cloog_domain_is_otl(CloogDomain *domain, int level);
-CloogDomain * cloog_domain_stride_lower_bound(CloogDomain *domain, int level,
-					CloogStride *stride);
-CloogDomain * cloog_domain_add_stride_constraint(CloogDomain *domain,
-					CloogStride *stride);
-int           cloog_domain_can_unroll(CloogDomain *domain, int level,
-				cloog_int_t *n, CloogConstraint **lb);
-CloogDomain * cloog_domain_fixed_offset(CloogDomain *domain, int level,
-				CloogConstraint *lb, cloog_int_t offset);
-int           cloog_domain_lazy_disjoint(CloogDomain *, CloogDomain *) ;
-int           cloog_domain_lazy_equal(CloogDomain *, CloogDomain *) ;
-int           cloog_scattering_lazy_block(CloogScattering *, CloogScattering *,
-                                      CloogScatteringList *, int);
-int           cloog_scattering_lazy_isscalar(CloogScattering *, int,
-								cloog_int_t *);
-int           cloog_domain_lazy_isconstant(CloogDomain *domain, int dimension,
-					   cloog_int_t *value);
-int           cloog_scattering_list_lazy_same(CloogScatteringList *);
-CloogDomain * cloog_domain_cut_first(CloogDomain *domain, CloogDomain **rest);
-CloogDomain * cloog_domain_simplify_union(CloogDomain *domain);
-CloogScattering * cloog_scattering_erase_dimension(CloogScattering *, int);
-
-int           cloog_domain_dimension(CloogDomain *) ;
-int           cloog_domain_parameter_dimension(CloogDomain *domain);
-int           cloog_scattering_dimension(CloogScattering *, CloogDomain *);
-int           cloog_domain_isconvex(CloogDomain *) ;
-CloogDomain * cloog_domain_cube(CloogState *state,
-				int dim, cloog_int_t min, cloog_int_t max);
-CloogDomain * cloog_domain_from_context(CloogDomain *context);
-CloogDomain * cloog_domain_scatter(CloogDomain *domain, CloogScattering *scatt);
-int           cloog_scattering_fully_specified(CloogScattering *scattering,
-						CloogDomain *domain);
-
-CloogStride *cloog_domain_list_stride(CloogDomainList *list, int level);
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.16.3/include/cloog/input.h b/cloog-0.16.3/include/cloog/input.h
deleted file mode 100644
index 4ad59fa..0000000
--- a/cloog-0.16.3/include/cloog/input.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef CLOOG_INPUT_H
-#define CLOOG_INPUT_H
-
-#if defined(__cplusplus)
-extern "C" {
-#endif 
-
-struct clooginput {
-	CloogDomain *context;
-	CloogUnionDomain *ud;
-};
-typedef struct clooginput CloogInput;
-
-CloogInput *cloog_input_read(FILE *file, CloogOptions *options);
-CloogInput *cloog_input_alloc(CloogDomain *context, CloogUnionDomain *ud);
-void cloog_input_free(CloogInput *input);
-
-void cloog_input_dump_cloog(FILE *file, CloogInput *input, CloogOptions *opt);
-
-#if defined(__cplusplus)
-}
-#endif 
-
-#endif
diff --git a/cloog-0.16.3/include/cloog/int.h b/cloog-0.16.3/include/cloog/int.h
deleted file mode 100644
index 623a1cb..0000000
--- a/cloog-0.16.3/include/cloog/int.h
+++ /dev/null
@@ -1,174 +0,0 @@
-#ifndef CLOOG_INT_H
-#define CLOOG_INT_H
-
-#include <assert.h>
-#include <stdio.h>
-#if defined(CLOOG_INT_GMP)
-#include <string.h>
-#include <gmp.h>
-#ifndef mp_get_memory_functions
-void mp_get_memory_functions(
-		void *(**alloc_func_ptr) (size_t),
-		void *(**realloc_func_ptr) (void *, size_t, size_t),
-		void (**free_func_ptr) (void *, size_t));
-#endif
-#endif
-
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-#if defined(CLOOG_INT_INT)
-typedef int		cloog_int_t;
-#define CLOOG_INT_FORMAT	"%d"
-#elif defined(CLOOG_INT_LONG)
-typedef long		cloog_int_t;
-#define CLOOG_INT_FORMAT	"%ld"
-#elif defined(CLOOG_INT_LONG_LONG)
-typedef long long	cloog_int_t;
-#define CLOOG_INT_FORMAT	"%lld"
-#elif defined(CLOOG_INT_GMP)
-typedef mpz_t		cloog_int_t;
-#else
-#error "No integer type defined"
-#endif
-
-#if defined(CLOOG_INT_GMP)
-
-#define cloog_int_init(i)	mpz_init(i)
-#define cloog_int_clear(i)	mpz_clear(i);
-
-#define cloog_int_set(r,i)	mpz_set(r,i)
-#define cloog_int_set_si(r,i)	mpz_set_si(r,i)
-#define cloog_int_abs(r,i)	mpz_abs(r,i)
-#define cloog_int_neg(r,i)	mpz_neg(r,i)
-#define cloog_int_swap(i,j)	mpz_swap(i,j)
-
-#define cloog_int_add(r,i,j)	mpz_add(r,i,j)
-#define cloog_int_add_ui(r,i,j)	mpz_add_ui(r,i,j)
-#define cloog_int_sub(r,i,j)	mpz_sub(r,i,j)
-#define cloog_int_sub_ui(r,i,j)	mpz_sub_ui(r,i,j)
-#define cloog_int_mul(r,i,j)	mpz_mul(r,i,j)
-#define cloog_int_addmul(r,i,j)	mpz_addmul(r,i,j)
-#define cloog_int_divexact(r,i,j)	mpz_divexact(r,i,j)
-#define cloog_int_tdiv_q(r,i,j)	mpz_tdiv_q(r,i,j)
-#define cloog_int_fdiv_q(r,i,j)	mpz_fdiv_q(r,i,j)
-#define cloog_int_fdiv_r(r,i,j)	mpz_fdiv_r(r,i,j)
-#define cloog_int_cdiv_q(r,i,j)	mpz_cdiv_q(r,i,j)
-#define cloog_int_gcd(r,i,j)	mpz_gcd(r,i,j)
-
-#define cloog_int_sgn(i)	mpz_sgn(i)
-#define cloog_int_cmp(i,j)	mpz_cmp(i,j)
-#define cloog_int_abs_cmp(i,j)	mpz_cmpabs(i,j)
-#define cloog_int_cmp_si(i,si)	mpz_cmp_si(i,si)
-#define cloog_int_eq(i,j)	(mpz_cmp(i,j) == 0)
-#define cloog_int_ne(i,j)	(mpz_cmp(i,j) != 0)
-#define cloog_int_gt(i,j)	(mpz_cmp(i,j) > 0)
-
-#define cloog_int_is_divisible_by(i,j)	mpz_divisible_p(i,j)
-
-#define cloog_int_read(r,s)	mpz_set_str(r,s,10)
-typedef void (*cloog_int_print_gmp_free_t)(void *, size_t);
-#define cloog_int_print(out,i)						\
-	do {								\
-		char *s;						\
-		cloog_int_print_gmp_free_t gmp_free;			\
-		s = mpz_get_str(0, 10, i);				\
-		fprintf(out, "%s", s);					\
-		mp_get_memory_functions(NULL, NULL, &gmp_free);		\
-		(*gmp_free)(s, strlen(s)+1);				\
-	} while (0)
-
-#else
-
-#define cloog_int_init(i)	((i) = 0)
-#define cloog_int_clear(i)	do { } while (0)
-
-#define cloog_int_set(r,i)	((r) = (i))
-#define cloog_int_set_si(r,i)	((r) = (i))
-#define cloog_int_abs(r,i)	((r) = (i) > 0 ? (i) : -(i))
-#define cloog_int_neg(r,i)	((r) = -(i))
-#define cloog_int_swap(i,j)	do {					\
-					cloog_int_t _t = i;		\
-					i = j;				\
-					j = _t;				\
-				} while (0)
-
-#define cloog_int_add(r,i,j)	((r) = (i) + (j))
-#define cloog_int_add_ui(r,i,j)	((r) = (i) + (j))
-#define cloog_int_sub(r,i,j)	((r) = (i) - (j))
-#define cloog_int_sub_ui(r,i,j)	((r) = (i) - (j))
-#define cloog_int_mul(r,i,j)	((r) = (i) * (j))
-#define cloog_int_addmul(r,i,j)	((r) += (i) * (j))
-#define cloog_int_divexact(r,i,j)	((r) = (i) / (j))
-#define cloog_int_tdiv_q(r,i,j)	((r) = (i) / (j))
-#define cloog_int_fdiv_q(r,i,j)	do {					\
-					assert((j) > 0);		\
-					(r) = (i) >= 0 ? (i) / (j) :	\
-					    -((-(i)+(j)-1)/(j));	\
-				} while (0)
-#define cloog_int_fdiv_r(r,i,j)	do {					\
-					assert((j) > 0);		\
-					(r) = (i) >= 0 ? (i) % (j) :	\
-					    (j)-1 - ((-(i)+(j)-1)%(j));	\
-				} while (0)
-#define cloog_int_cdiv_q(r,i,j)	do {					\
-					assert((j) > 0);		\
-					(r) = (i) >= 0 ?		\
-					    ((i)+(j)-1) / (j) :		\
-					    -(-(i)/(j));		\
-				} while (0)
-cloog_int_t cloog_gcd(cloog_int_t a, cloog_int_t b);
-#define cloog_int_gcd(r,i,j)	(r) = cloog_gcd(i,j)
-
-#define cloog_int_sgn(i)	((i) > 0 ? 1 : (i) < 0 ? -1 : 0)
-#define cloog_int_cmp(i,j)	(i - j)
-#define cloog_int_abs_cmp(i,j)	(((i) > 0 ? (i) : -(i)) - ((j) > 0 ? (j) : -(j)))
-#define cloog_int_cmp_si(i,si)	(i - si)
-#define cloog_int_eq(i,j)	((i) == (j))
-#define cloog_int_ne(i,j)	((i) != (j))
-#define cloog_int_gt(i,j)	((i) > (j))
-
-#define cloog_int_is_divisible_by(i,j)	((i) % (j) == 0)
-
-#define cloog_int_read(i,s)	sscanf(s, CLOOG_INT_FORMAT, &i)
-#define cloog_int_print(out,i)	fprintf(out, CLOOG_INT_FORMAT, i)
-
-#endif
-
-#define cloog_int_is_pos(i)	(cloog_int_sgn(i) > 0)
-#define cloog_int_is_neg(i)	(cloog_int_sgn(i) < 0)
-#define cloog_int_is_zero(i)	(cloog_int_sgn(i) == 0)
-#define cloog_int_is_one(i)	(cloog_int_cmp_si(i,1) == 0)
-#define cloog_int_is_neg_one(i)	(cloog_int_cmp_si(i,-1) == 0)
-#define cloog_int_gt_si(i,si)	(cloog_int_cmp_si(i,si) > 0)
-#define cloog_int_ne_si(i,j)	(cloog_int_cmp_si(i,j) != 0)
-#define cloog_int_lt(i,j)	(cloog_int_cmp(i,j) < 0)
-#define cloog_int_le(i,j)	(cloog_int_cmp(i,j) <= 0)
-#define cloog_int_abs_ne(i,j)	(cloog_int_abs_cmp(i,j) != 0)
-#define cloog_int_abs_ge(i,j)	(cloog_int_abs_cmp(i,j) >= 0)
-#define cloog_int_abs_lt(i,j)	(cloog_int_abs_cmp(i,j) < 0)
-
-struct cloog_vec {
-	unsigned	size;
-	cloog_int_t	*p;
-};
-
-struct cloog_vec *cloog_vec_alloc(unsigned size);
-void cloog_vec_free(struct cloog_vec *vec);
-
-int cloog_seq_first_non_zero(cloog_int_t *p, unsigned len);
-void cloog_seq_cpy(cloog_int_t *dst, cloog_int_t *src, unsigned len);
-void cloog_seq_neg(cloog_int_t *dst, cloog_int_t *src, unsigned len);
-void cloog_seq_combine(cloog_int_t *dst, cloog_int_t m1, cloog_int_t *src1,
-			cloog_int_t m2, cloog_int_t *src2, unsigned len);
-void cloog_seq_gcd(cloog_int_t *p, unsigned len, cloog_int_t *gcd);
-int cloog_seq_is_neg(cloog_int_t *p1, cloog_int_t *p2, unsigned len);
-void cloog_seq_normalize(cloog_int_t *p, unsigned len);
-
-#if defined(__cplusplus)
-  }
-#endif 
-
-#endif
diff --git a/cloog-0.16.3/include/cloog/isl/backend.h b/cloog-0.16.3/include/cloog/isl/backend.h
deleted file mode 100644
index e4576d9..0000000
--- a/cloog-0.16.3/include/cloog/isl/backend.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef CLOOG_ISL_BACKEND_H
-#define CLOOG_ISL_BACKEND_H
-
-#include <isl/constraint.h>
-
-struct cloogbackend {
-	struct isl_ctx	*ctx;
-	unsigned	ctx_allocated : 1;
-};
-
-#endif /* define _H */
diff --git a/cloog-0.16.3/include/cloog/isl/cloog.h b/cloog-0.16.3/include/cloog/isl/cloog.h
deleted file mode 100644
index 9379054..0000000
--- a/cloog-0.16.3/include/cloog/isl/cloog.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef CLOOG_ISL_H
-#define CLOOG_ISL_H
-
-#ifndef CLOOG_INT_GMP
-#define CLOOG_INT_GMP
-#endif
-
-#include <cloog/cloog.h>
-#include <cloog/isl/constraintset.h>
-#include <cloog/isl/domain.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif 
-
-CloogState *cloog_isl_state_malloc(struct isl_ctx *ctx);
-
-#if defined(__cplusplus)
-}
-#endif 
-
-#endif /* define _H */
diff --git a/cloog-0.16.3/include/cloog/isl/constraintset.h b/cloog-0.16.3/include/cloog/isl/constraintset.h
deleted file mode 100644
index c3c2eed..0000000
--- a/cloog-0.16.3/include/cloog/isl/constraintset.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef CLOOG_ISL_CONSTRAINTSET_H
-#define CLOOG_ISL_CONSTRAINTSET_H
-
-#include <cloog/isl/backend.h>
-
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-struct cloogconstraintset {
-	int dummy;	/* Solaris cc doesn't like zero-sized structs */
-};
-
-struct cloogequalities {
-	int			  n;
-	unsigned		  total_dim;
-	isl_constraint		**constraints;
-	int			 *types;
-};
-
-struct cloogconstraint {
-	int dummy;	/* Solaris cc doesn't like zero-sized structs */
-};
-
-CloogConstraintSet *cloog_constraint_set_from_isl_basic_set(struct isl_basic_set *bset);
-CloogConstraint *cloog_constraint_from_isl_constraint(struct isl_constraint *constraint);
-isl_constraint *cloog_constraint_to_isl(CloogConstraint *constraint);
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.16.3/include/cloog/isl/domain.h b/cloog-0.16.3/include/cloog/isl/domain.h
deleted file mode 100644
index 289b711..0000000
--- a/cloog-0.16.3/include/cloog/isl/domain.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef CLOOG_ISL_DOMAIN_H
-#define CLOOG_ISL_DOMAIN_H
-
-#include <isl/map.h>
-#include <isl/set.h>
-#include <isl/union_map.h>
-#include <isl/union_set.h>
-
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-
-struct cloogdomain {
-	int dummy;	/* Solaris cc doesn't like zero-sized structs */
-};
-
-struct cloogscattering {
-	int dummy;	/* Solaris cc doesn't like zero-sized structs */
-};
-
-CloogDomain *cloog_domain_from_isl_set(struct isl_set *set);
-CloogScattering *cloog_scattering_from_isl_map(struct isl_map *map);
-CloogUnionDomain *cloog_union_domain_from_isl_union_map(
-	__isl_take isl_union_map *umap);
-CloogUnionDomain *cloog_union_domain_from_isl_union_set(
-	__isl_take isl_union_set *uset);
-
-__isl_give isl_set *isl_set_from_cloog_domain(CloogDomain *domain);
-
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.16.3/include/cloog/loop.h b/cloog-0.16.3/include/cloog/loop.h
deleted file mode 100644
index b62a274..0000000
--- a/cloog-0.16.3/include/cloog/loop.h
+++ /dev/null
@@ -1,120 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                             loop.h                                **
-    **-------------------------------------------------------------------**
-    **                 First version: october 26th 2001                  **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-#ifndef CLOOG_LOOP_H
-#define CLOOG_LOOP_H
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-/**
- * CloogLoop structure:
- * this structure contains all the informations of a loop generated or to be
- * generated.
- * - if the loop has not been processed yet (it is not a result of a call to
- *   cloog_loop_generate), the domain is the whole iteration domain of a given
- *   block, the stride is 1 (i.e. there is no stride), block is necessarily not
- *   NULL and inner is NULL.
- * - if the loop comes as a result of a cloog_loop_generate call, the domain
- *   describes the constraints (guards and loop bounds) for only one dimension
- *   (the last one: outer dimensions being considered as parameters), the stride
- *   may differ from one (this means that on the considered dimension, a step of
- *   'stride' must be considered between integral point, the first integral
- *   point to be considered being the lower bound of the loop), inner may differ
- *   from NULL, meaning that there are further dimensions and nesting levels in
- *   the loop.
- */
-struct cloogloop
-{
-  CloogState *state;          /**< State. */
-  CloogDomain * domain ;      /**< The iteration domain. */
-  CloogDomain *unsimplified;  /**< Unsimplified version of domain. */
-  int otl;                    /**< Loop is executed at most once. */
-  CloogStride *stride;        /**< If not NULL, stride information on iterator
-                               *   (filled only after loop generation).
-                               */
-  CloogBlock * block ;        /**< The included statement block, NULL if none.*/
-  void * usr;		      /**< User field, for library user convenience.
-			       *   This pointer is not freed when the
-			       *   CloogLoop structure is freed.
-			       */
-  struct cloogloop * inner ;  /**< Loops at the next level. */
-  struct cloogloop * next ;   /**< Next loop at the same level. */
-} ;
-typedef struct cloogloop CloogLoop ;
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-void cloog_loop_print_structure(FILE *, CloogLoop *, int) ;
-void cloog_loop_print(FILE *, CloogLoop *) ;
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-void cloog_loop_free(CloogLoop *) ;
-
-
-/******************************************************************************
- *                              Reading functions                             *
- ******************************************************************************/
-CloogLoop *cloog_loop_from_domain(CloogState *state, CloogDomain *domain,
-				  int number);
-CloogLoop * cloog_loop_read(CloogState *state,
-			    FILE * foo, int number, int nb_parameters);
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-CloogLoop * cloog_loop_block(CloogLoop *loop, int *scaldims, int nb_scattdims);
-CloogLoop * cloog_loop_malloc(CloogState *state);
-CloogLoop *cloog_loop_generate(CloogLoop *loop, CloogDomain *context,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	CloogOptions *options);
-CloogLoop *cloog_loop_simplify(CloogLoop *loop, CloogDomain *context, int level,
-	int nb_scattdims, CloogOptions *options);
-void cloog_loop_scatter(CloogLoop *, CloogScattering *);
-
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.16.3/include/cloog/matrix.h b/cloog-0.16.3/include/cloog/matrix.h
deleted file mode 100644
index 2b73039..0000000
--- a/cloog-0.16.3/include/cloog/matrix.h
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef CLOOG_MATRIX_H
-#define CLOOG_MATRIX_H
-#if defined(__cplusplus)
-extern "C"
-  {
-#endif
-
-/* The CloogMatrix structure is equivalent to the PolyLib Matrix data structure
- * (see Wil93). This structure is devoted to represent a set of constraints.
- *
- * The whole matrix is stored in memory row after row at the p_Init address. p
- * is an array of pointers where p[i] points to the first element of the i^{th
- * row. NbRows and NbColumns are respectively the number of rows and columns of
- * the matrix. Each row corresponds to a constraint. The first element of each
- * row is an equality/inequality tag. The constraint is an equality p(x) = 0 if
- * the first element is 0, but it is an inequality p(x) \geq 0 if the first
- * element is 1. The next elements are the unknown coefficients, followed by
- * the parameter coefficients, then the constant term. For instance, the
- * following three constraints:
- *
- *     -i + m  = 0
- *     -j + n >= 0
- *  i + j - k >= 0
- *
- * would be represented by the following rows:
- *
- * # eq/in  i   j   k   m   n   cst
- *     0    0  -1   0   1   0    0
- *     1   -1   0   0   0   1    0
- *     1    1   1  -1   0   0    0
- *
- * To be able to provide different precision version (CLooG supports 32 bits,
- * 64 bits and arbitrary precision through the GMP library), the cloog_int_t
- * type depends on the configuration options (it may be long int for 32 bits
- * version, long long int for 64 bits version, and mpz_t for multiple precision
- * version). */
-
-struct cloogmatrix
-{ unsigned NbRows;    /* Number of rows. */
-  unsigned NbColumns; /* Number of columns. */
-  cloog_int_t ** p;         /* Array of pointers to the matrix rows. */
-  cloog_int_t * p_Init;     /* Matrix rows contiguously in memory. */
-};
-
-typedef struct cloogmatrix CloogMatrix;
-
-CloogMatrix *cloog_matrix_alloc (unsigned, unsigned);
-void cloog_matrix_free (CloogMatrix *);
-void cloog_matrix_print_structure(FILE *file, CloogMatrix *M,
-		const char *prefix, const char *suffix);
-CloogMatrix *cloog_matrix_read(FILE *input);
-CloogMatrix *cloog_matrix_read_of_size(FILE *input,
-		unsigned n_row, unsigned n_col);
-void cloog_matrix_print(FILE*, CloogMatrix*);
-
-#if defined(__cplusplus)
-  }
-#endif
-#endif /* define _H */
diff --git a/cloog-0.16.3/include/cloog/matrix/constraintset.h b/cloog-0.16.3/include/cloog/matrix/constraintset.h
deleted file mode 100644
index 5023162..0000000
--- a/cloog-0.16.3/include/cloog/matrix/constraintset.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef CLOOG_MATRIX_CONSTRAINTSET_H
-#define CLOOG_MATRIX_CONSTRAINTSET_H
-
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-struct cloogconstraintset {
-	CloogMatrix M;
-};
-
-struct cloogequalities {
-	CloogConstraintSet	*constraints;
-	int			*types;
-};
-
-struct cloogconstraint {
-	CloogConstraintSet	*set;
-	cloog_int_t		**line;
-};
-
-CloogConstraintSet *cloog_constraint_set_from_cloog_matrix(CloogMatrix *M);
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.16.3/include/cloog/names.h b/cloog-0.16.3/include/cloog/names.h
deleted file mode 100644
index 7f566f1..0000000
--- a/cloog-0.16.3/include/cloog/names.h
+++ /dev/null
@@ -1,103 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                             names.h                               **
-    **-------------------------------------------------------------------**
-    **                  First version: august 1st 2002                   **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-#ifndef CLOOG_NAMES_H
-#define CLOOG_NAMES_H
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-
-# define MAX_NAME 50
-# define FIRST_PARAMETER 'M'
-# define FIRST_ITERATOR  'i'
-
-
-/**
- * CloogNames structure:
- * this structure contains all the informations about parameter and iterator
- * names (as strings).
- */
-struct cloognames
-{ int nb_scalars ;         /**< Scalar dimension number. */
-  int nb_scattering ;      /**< Scattering iterator number. */
-  int nb_iterators ;       /**< Iterator number. */
-  int nb_parameters ;      /**< Parameter number. */
-  char ** scalars ;        /**< The scalar names     (an array of strings). */
-  char ** scattering ;     /**< The scattering names (an array of strings). */
-  char ** iterators ;      /**< The iterator names   (an array of strings). */
-  char ** parameters ;     /**< The parameter names  (an array of strings). */
-  int references;          /**< Number of references to this structure. */
-} ;
-typedef struct cloognames CloogNames ;
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-void cloog_names_print_structure(FILE *, CloogNames *, int) ;
-void cloog_names_print(FILE *, CloogNames *) ;
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-void cloog_names_free(CloogNames *) ;
-
-
-/******************************************************************************
- *                              Reading functions                             *
- ******************************************************************************/
-char ** cloog_names_read_strings(FILE *file, int nb_items);
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-CloogNames * cloog_names_malloc(void);
-CloogNames * cloog_names_copy(CloogNames *names);
-CloogNames * cloog_names_alloc(void);
-char ** cloog_names_generate_items(int, char *, char) ;
-CloogNames * cloog_names_generate(int, int, int, int, char, char, char, char) ;
-void cloog_names_scalarize(CloogNames *, int, int *) ;
-const char * cloog_names_name_at_level(CloogNames *names, int level);
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.16.3/include/cloog/options.h b/cloog-0.16.3/include/cloog/options.h
deleted file mode 100644
index 97e482e..0000000
--- a/cloog-0.16.3/include/cloog/options.h
+++ /dev/null
@@ -1,159 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                               CLooG                               **
-    **-------------------------------------------------------------------**
-    **                             options.h                             **
-    **-------------------------------------------------------------------**
-    **                  First version: april 19th 2003                   **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-#include <stdio.h>
-
-#ifndef CLOOG_OPTIONS_H
-#define CLOOG_OPTIONS_H
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-
-/* Uncomment the following line if you want some information about
- * maximum total allocated memory for code generation.
-#define CLOOG_MEMORY 
- */
-#define CLOOG_SCALARS
-
-struct cloogoptions;
-typedef struct cloogoptions CloogOptions;
-
-struct cloogoptions
-{
-  CloogState *state; /* State. */
-  /* OPTIONS FOR LOOP GENERATION */
-  int l ;         /* Last level to optimize. */
-  int f ;         /* First level to optimize. */
-  int stop ;      /* Level to stop code generation. */
-  int strides ;   /* 1 if user wants to handle non-unit strides (then loop
-                   * increment can be something else than one), 0 otherwise.
-		   */
-  int sh;	  /* 1 for computing simple hulls */
-  int first_unroll;
-
-  /* OPTIONS FOR PRETTY PRINTING */
-  int esp ;       /* 1 if user wants to spread all equalities, i.e. when there
-                   * is something like "i = 3*j + 1 ; A[i] = 0 ;" the generator
-                   * will write "A[3*j + 1] = 0 ;", 0 otherwise.
-                   */
-  int fsp ;       /* The iteration level where equalities spreading can begin
-                   * (it might happen that the user wants not to spread values
-                   * of scattering iterators).
-                   */
-  int otl ;       /* 1 for eliminate loops running just one time and write them
-                   * as an affectation of the iterator, 0 otherwise.
-                   */
-  int block ;     /* 1 to make one new block {...} per new dimension,
-                   * 0 otherwise.
-                   */
-  int compilable; /* 1 to generate a compilable code by using
-                   * preprocessing, 0 otherwise.
-                   */
-  int callable;   /* 1 to generate callable code by using
-                   * preprocessing, 0 otherwise.
-                   */
-  int language;   /* 1 to generate FORTRAN, 0 for C otherwise. */
-
-  int save_domains;/* Save unsimplified copy of domain. */
-
-  /* MISC OPTIONS */
-  char * name ;   /* Name of the input file. */
-  float time ;    /* Time spent for code generation in seconds. */
-#ifdef CLOOG_MEMORY
-  int memory ;    /* Memory spent for code generation in kilobytes. */
-#endif
-  int quiet;      /* Don't print any informational messages. */
-  /* UNDOCUMENTED OPTIONS FOR THE AUTHOR ONLY */
-  int leaks ;     /* 1 if I want to print the allocation statistics,
-                   * 0 otherwise.
-		   */
-  int backtrack;  /* 1 to perform backtracking in 
-                   * Quillere's algorithm, 0 otherwise.
-		   */
-  int override ;  /* 1 if I want to bypass CLooG decisions on option correctness
-                   * (generated code may be incorrect), 0 otherwise.
-		   */
-  int structure ; /* 1 if I want to print the CloogProgram structure before the
-                   * pretty printed code, 0 otherwise.
-		   */
-  int noblocks ;  /* 1 if I don't want to make statement blocks, 0 otherwise. */
-  int noscalars ; /* 1 if I don't want to use scalar dimensions, 0 otherwise. */
-  int nosimplify; /* 1 if I don't want to simplify polyhedra, 0 otherwise. */
-} ;
-
-
-/******************************************************************************
- *                          Error reporting functions                         *
- ******************************************************************************/
-
-enum cloog_msg_type { CLOOG_ERROR, CLOOG_WARNING, CLOOG_INFO };
-
-void cloog_msg(CloogOptions *options, enum cloog_msg_type type,
-		const char *msg, ...);
-void cloog_die(const char *msg, ...);
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-void cloog_options_print(FILE *, CloogOptions *) ;
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-void cloog_options_free(CloogOptions *) ;
-
-
-/******************************************************************************
- *                               Reading function                             *
- ******************************************************************************/
-void cloog_options_read(CloogState *state, int argc, char **argv,
-			FILE **input, FILE **output, CloogOptions **options);
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-CloogOptions *cloog_options_malloc(CloogState *state);
-
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.16.3/include/cloog/pprint.h b/cloog-0.16.3/include/cloog/pprint.h
deleted file mode 100644
index 62fb244..0000000
--- a/cloog-0.16.3/include/cloog/pprint.h
+++ /dev/null
@@ -1,68 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                             pprint.h                              **
-    **-------------------------------------------------------------------**
-    **                 First version: october 26th 2001                  **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-#ifndef CLOOG_PPRINT_H
-#define CLOOG_PPRINT_H
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-
-# define MAX_STRING_VAL 32
-# define INDENT_STEP 2
-
-# define EQTYPE_NONE	 0
-# define EQTYPE_CONSTANT 1
-# define EQTYPE_PUREITEM 2
-# define EQTYPE_EXAFFINE 3
-
-# define LANGUAGE_C 0
-# define LANGUAGE_FORTRAN 1
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-void clast_pprint(FILE *foo, struct clast_stmt *root, int indent, 
-	    CloogOptions *options);
-
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.16.3/include/cloog/program.h b/cloog-0.16.3/include/cloog/program.h
deleted file mode 100644
index 530d21f..0000000
--- a/cloog-0.16.3/include/cloog/program.h
+++ /dev/null
@@ -1,116 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                            program.h                              **
-    **-------------------------------------------------------------------**
-    **                 First version: october 25th 2001                  **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-#ifndef CLOOG_PROGRAM_H
-#define CLOOG_PROGRAM_H
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-
-# define MAX_STRING 1024
-# define MEGA 1000000  /* One million. */
-
-
-/**
- * CloogProgram structure:
- * this structure contains all the informations of a program generated or to be
- * generated.
- */
-struct cloogprogram
-{ /* Basic program description fields. */
-  char language ;              /**< The language of the program. */
-  int  nb_scattdims ;          /**< Scattering dimension number. */
-  CloogDomain    * context ;   /**< The context of the program. */
-  CloogLoop      * loop ;      /**< The loops of the program. */
-  CloogNames     * names ;     /**< Iterators and parameters names. */
-  CloogBlockList * blocklist ; /**< The statement block list. */
-  
-  /* Internal service fields, filled up by cloog_program_scatter function. */
-  int * scaldims ;             /**< Boolean array saying whether a given
-                                *   scattering dimension is scalar or not.
-				*/
-  /* Library user reserved field. */
-  void * usr;		       /**< User field, for library user convenience.
-			        *   This pointer is not freed when the
-			        *   CloogProgram structure is freed.
-			        */
-} ;
-typedef struct cloogprogram CloogProgram ;
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-void cloog_program_print_structure(FILE *, CloogProgram *, int) ;
-void cloog_program_print(FILE *, CloogProgram *) ;
-void cloog_program_pprint(FILE *, CloogProgram *, CloogOptions *) ;
-void cloog_program_dump_cloog(FILE *, CloogProgram *, CloogScatteringList *);
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-void cloog_program_free(CloogProgram *) ;
-
-
-/******************************************************************************
- *                               Reading function                             *
- ******************************************************************************/
-CloogProgram * cloog_program_read(FILE *, CloogOptions *) ;
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-CloogProgram * cloog_program_malloc(void);
-CloogProgram * cloog_program_alloc(CloogDomain *context, CloogUnionDomain *ud,
-	CloogOptions *options);
-CloogProgram * cloog_program_generate(CloogProgram *, CloogOptions *) ;
-void cloog_program_block(CloogProgram *program,
-	CloogScatteringList *scattering, CloogOptions *options);
-void cloog_program_extract_scalars(CloogProgram *program,
-	CloogScatteringList *scattering, CloogOptions *options);
-void cloog_program_scatter(CloogProgram *program,
-			CloogScatteringList *scattering, CloogOptions *options);
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
-
diff --git a/cloog-0.16.3/include/cloog/state.h b/cloog-0.16.3/include/cloog/state.h
deleted file mode 100644
index ebc3272..0000000
--- a/cloog-0.16.3/include/cloog/state.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef CLOOG_STATE_H
-#define CLOOG_STATE_H
-
-struct cloogbackend;
-typedef struct cloogbackend CloogBackend;
-
-#if defined(__cplusplus)
-extern "C" {
-#endif 
-
-struct cloogstate {
-  CloogBackend *backend;
-
-  cloog_int_t zero;
-  cloog_int_t one;
-  cloog_int_t negone;
-
-  int block_allocated;
-  int block_freed;
-  int block_max;
-
-  int domain_allocated;
-  int domain_freed;
-  int domain_max;
-
-  int loop_allocated;
-  int loop_freed;
-  int loop_max;
-
-  int statement_allocated;
-  int statement_freed;
-  int statement_max;
-};
-typedef struct cloogstate CloogState;
-
-CloogState *cloog_core_state_malloc(void);
-CloogState *cloog_state_malloc(void);
-
-void cloog_core_state_free(CloogState *state);
-void cloog_state_free(CloogState *state);
-
-#if defined(__cplusplus)
-}
-#endif 
-
-#endif
diff --git a/cloog-0.16.3/include/cloog/statement.h b/cloog-0.16.3/include/cloog/statement.h
deleted file mode 100644
index abc505e..0000000
--- a/cloog-0.16.3/include/cloog/statement.h
+++ /dev/null
@@ -1,85 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                           statement.h                             **
-    **-------------------------------------------------------------------**
-    **                  First version: november 4th 2001                 **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-#ifndef CLOOG_STATEMENT_H
-#define CLOOG_STATEMENT_H
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-
-struct cloogstatement
-{
-  CloogState *state;             /* State. */
-  char *name;			 /* Name of the statement. */
-  int number;                    /* The statement unique number. */
-  void * usr ;                   /* A pointer for library users convenience. */
-  struct cloogstatement * next ; /* Pointer to the next statement with the
-                                  * same original domain and the same
-				  * scattering function.
-				  */
-} ;
-typedef struct cloogstatement CloogStatement ;
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-void cloog_statement_print_structure(FILE *, CloogStatement *, int) ;
-void cloog_statement_print(FILE *, CloogStatement *) ;
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-void cloog_statement_free(CloogStatement *) ;
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-CloogStatement * cloog_statement_malloc(CloogState *state);
-CloogStatement * cloog_statement_alloc(CloogState *state, int);
-CloogStatement * cloog_statement_copy(CloogStatement *) ;
-void cloog_statement_add(CloogStatement**, CloogStatement**, CloogStatement*) ;
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
-
diff --git a/cloog-0.16.3/include/cloog/stride.h b/cloog-0.16.3/include/cloog/stride.h
deleted file mode 100644
index f93dc4e..0000000
--- a/cloog-0.16.3/include/cloog/stride.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef CLOOG_STRIDE_H
-#define CLOOG_STRIDE_H
-
-#if defined(__cplusplus)
-extern "C" {
-#endif 
-
-/**
- * Information about strides.
- */
-struct cloogstride {
-  int references;
-  cloog_int_t stride;         /**< The actual stride. */
-  cloog_int_t offset;         /**< Offset of strided loop. */
-  cloog_int_t factor;
-  CloogConstraint *constraint;
-};
-typedef struct cloogstride CloogStride;
-
-CloogStride *cloog_stride_alloc(cloog_int_t stride, cloog_int_t offset);
-CloogStride *cloog_stride_alloc_from_constraint(cloog_int_t stride,
-	CloogConstraint *constraint, cloog_int_t factor);
-CloogStride *cloog_stride_copy(CloogStride *stride);
-void cloog_stride_free(CloogStride *stride);
-
-CloogConstraint *cloog_constraint_stride_lower_bound(CloogConstraint *c,
-	int level, CloogStride *stride);
-
-#if defined(__cplusplus)
-}
-#endif 
-
-#endif
diff --git a/cloog-0.16.3/include/cloog/union_domain.h b/cloog-0.16.3/include/cloog/union_domain.h
deleted file mode 100644
index 7fc9eef..0000000
--- a/cloog-0.16.3/include/cloog/union_domain.h
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef CLOOG_UNION_DOMAIN_H
-#define CLOOG_UNION_DOMAIN_H
-
-#if defined(__cplusplus)
-extern "C" {
-#endif 
-
-/**
- * CloogNamedDomainList structure:
- * this structure reprensents a node of a linked list of CloogDomain structures.
- */
-struct cloognameddomainlist {
-  CloogDomain *domain;              /**< An element of the list. */
-  CloogScattering *scattering;      /**< Scattering function for domain. */
-  char *name;                       /**< Name of the domain. */
-  void *usr;                        /**< A pointer for library user's convenience. */
-  struct cloognameddomainlist *next;/**< Pointer to the next element of the list.*/
-};
-typedef struct cloognameddomainlist CloogNamedDomainList;
-
-/**
- * A structure representing the input domains and scattering functions.
- */
-struct clooguniondomain {
-	int n_name[3];
-	char **name[3];
-	CloogNamedDomainList *domain;
-	CloogNamedDomainList **next_domain;
-};
-typedef struct clooguniondomain CloogUnionDomain;
-
-enum cloog_dim_type { CLOOG_PARAM, CLOOG_ITER, CLOOG_SCAT };
-
-CloogUnionDomain *cloog_union_domain_read(FILE *file, int nb_par,
-	CloogOptions *options);
-CloogUnionDomain *cloog_union_domain_alloc(int nb_par);
-CloogUnionDomain *cloog_union_domain_add_domain(CloogUnionDomain *ud,
-	const char *name, CloogDomain *domain, CloogScattering *scattering,
-	void *usr);
-CloogUnionDomain *cloog_union_domain_set_name(CloogUnionDomain *ud,
-	enum cloog_dim_type type, int index, const char *name);
-void cloog_union_domain_free(CloogUnionDomain *ud);
-
-#if defined(__cplusplus)
-}
-#endif 
-
-#endif
diff --git a/cloog-0.16.3/include/cloog/version.h b/cloog-0.16.3/include/cloog/version.h
deleted file mode 100644
index c24b9d3..0000000
--- a/cloog-0.16.3/include/cloog/version.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-#ifndef CLOOG_VERSION_H
-#define CLOOG_VERSION_H
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-#define CLOOG_VERSION_MAJOR 0
-#define CLOOG_VERSION_MINOR 16
-#define CLOOG_VERSION_REVISION 3
-
-const char *cloog_version(void);
-
-int cloog_version_major(void);
-
-int cloog_version_minor(void);
-
-int cloog_version_revision(void);
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.16.3/include/cloog/version.h.in b/cloog-0.16.3/include/cloog/version.h.in
deleted file mode 100644
index cee91a0..0000000
--- a/cloog-0.16.3/include/cloog/version.h.in
+++ /dev/null
@@ -1,50 +0,0 @@
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-#ifndef CLOOG_VERSION_H
-#define CLOOG_VERSION_H
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-#define CLOOG_VERSION_MAJOR @VERSION_MAJOR@
-#define CLOOG_VERSION_MINOR @VERSION_MINOR@
-#define CLOOG_VERSION_REVISION @VERSION_REVISION@
-
-const char *cloog_version(void);
-
-int cloog_version_major(void);
-
-int cloog_version_minor(void);
-
-int cloog_version_revision(void);
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.16.3/isl/AUTHORS b/cloog-0.16.3/isl/AUTHORS
deleted file mode 100644
index 965ed11..0000000
--- a/cloog-0.16.3/isl/AUTHORS
+++ /dev/null
@@ -1,19 +0,0 @@
-isl was written by
-
-	    Sven Verdoolaege
-2006-2007   Leiden Institute of Advanced Computer Science
-	    Universiteit Leiden
-	    Niels Bohrweg 1
-	    2333 CA Leiden
-	    The Netherlands
-2008-2009   K.U.Leuven
-	    Departement Computerwetenschappen
-	    Celestijnenlaan 200A
-	    B-3001 Leuven
-	    Belgium
-2010	    INRIA Saclay - Ile-de-France
-	    Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod
-	    91893 Orsay
-	    France
-
-The quicksort implementation was written by Douglas C. Schmidt.
diff --git a/cloog-0.16.3/isl/ChangeLog b/cloog-0.16.3/isl/ChangeLog
deleted file mode 100644
index 96e77a3..0000000
--- a/cloog-0.16.3/isl/ChangeLog
+++ /dev/null
@@ -1,51 +0,0 @@
-version: 0.07
-date: Tue Jul 12 19:34:51 CEST 2011
-changes:
-	- hide internal structures of isl_div and isl_constraint
-	- preliminary scheduling
-	- add support for local spaces and (piecewise) quasi-affine expressions
----
-version: 0.06
-date: Fri Mar 18 15:59:16 CET 2011
-changes:
-	- improved parsing
-	- consistency changes in API
-	- hide internal structure of isl_ctx
----
-version: 0.05.1
-date: Wed Jan  5 10:21:42 CET 2011
-changes:
-	- fix simple symmetry detection in parametric integer programming
----
-version: 0.05
-date: Thu Dec 23 17:03:14 CET 2010
-changes:
-	- rename header files from isl_header.h to isl/header.h
-	- add higher level interface for dependence analysis
-	- improved argument parsing
-	- optionally triangulate domains during Bernstein expansion
-	- support extended PolyLib format
-	- hide internal structure of some data types
-	- improved coalescing
-	- add simple symmetry detection in parametric integer programming
----
-version: 0.04
-date: Fri Sep 10 12:57:50 CEST 2010
-changes:
-	- rename isl_pw_qpolynomial_fold_add
-	- add isl_map_apply_pw_qpolynomial_fold
-	- support named and nested spaces
-	- support union sets and maps
-	- add public API for matrices
----
-version: 0.03
-date: Tue Jun 29 13:16:46 CEST 2010
-changes:
-	- new printing functions
-	- support for "may" accesses in dependence analysis
-	- improved coalescing
-	- improved transitive closure
-	- fix several hard to trigger bugs
-	- improved argument parsing
-	- support parametric vertex enumeration for barvinok
-	- optionally use Bernstein expansion to compute bounds
diff --git a/cloog-0.16.3/isl/GIT_HEAD_ID b/cloog-0.16.3/isl/GIT_HEAD_ID
deleted file mode 100644
index 6c13e12..0000000
--- a/cloog-0.16.3/isl/GIT_HEAD_ID
+++ /dev/null
@@ -1 +0,0 @@
-isl-0.07
diff --git a/cloog-0.16.3/isl/Makefile.am b/cloog-0.16.3/isl/Makefile.am
deleted file mode 100644
index e3e96d0..0000000
--- a/cloog-0.16.3/isl/Makefile.am
+++ /dev/null
@@ -1,263 +0,0 @@
-SUBDIRS = . doc
-DIST_SUBDIRS = doc
-
-ACLOCAL_AMFLAGS = -I m4
-AUTOMAKE_OPTIONS = nostdinc
-
-lib_LTLIBRARIES = libisl.la
-noinst_PROGRAMS = isl_test isl_polyhedron_sample isl_pip \
-	isl_polyhedron_minimize isl_polytope_scan \
-	isl_polyhedron_detect_equalities isl_cat \
-	isl_closure isl_bound
-TESTS = isl_test pip_test.sh bound_test.sh
-
-if HAVE_PIPLIB
-ISL_PIPLIB = \
-	isl_lp_piplib.c \
-	isl_map_piplib.c \
-	isl_sample_piplib.c \
-	isl_sample_piplib.h \
-	isl_piplib.c
-else
-ISL_PIPLIB = \
-	isl_lp_no_piplib.c \
-	isl_map_no_piplib.c \
-	isl_sample_no_piplib.c
-endif
-
-if NEED_GET_MEMORY_FUNCTIONS
-GET_MEMORY_FUNCTIONS=mp_get_memory_functions.c
-endif
-
-INCLUDES = -I. -I$(srcdir) -I$(srcdir)/include -Iinclude/ 
-AM_CFLAGS = @WARNING_FLAGS@
-
-libisl_la_SOURCES = \
-	$(ISL_PIPLIB) \
-	$(GET_MEMORY_FUNCTIONS) \
-	isl_aff.c \
-	isl_aff_private.h \
-	isl_affine_hull.c \
-	isl_arg.c \
-	isl_band.c \
-	isl_band_private.h \
-	isl_basis_reduction.h \
-	basis_reduction_tab.c \
-	isl_bernstein.c \
-	isl_bernstein.h \
-	isl_blk.c \
-	isl_bound.c \
-	isl_bound.h \
-	isl_coalesce.c \
-	isl_constraint.c \
-	isl_constraint_private.h \
-	isl_convex_hull.c \
-	isl_ctx.c \
-	isl_ctx_private.h \
-	isl_dim.c \
-	isl_dim_private.h \
-	isl_dim_map.h \
-	isl_dim_map.c \
-	isl_div.c \
-	isl_div_private.h \
-	isl_equalities.c \
-	isl_equalities.h \
-	isl_factorization.c \
-	isl_factorization.h \
-	isl_farkas.c \
-	isl_flow.c \
-	isl_fold.c \
-	isl_gmp.c \
-	isl_hash.c \
-	isl_hmap_map_basic_set.c \
-	isl_hmap_map_basic_set.h \
-	isl_ilp.c \
-	isl_input.c \
-	isl_list.c \
-	isl_list_private.h \
-	isl_local_space_private.h \
-	isl_local_space.c \
-	isl_lp.c \
-	isl_lp_piplib.h \
-	isl_map.c \
-	isl_map_simplify.c \
-	isl_map_subtract.c \
-	isl_map_private.h \
-	isl_map_piplib.h \
-	isl_mat.c \
-	isl_mat_private.h \
-	isl_morph.c \
-	isl_morph.h \
-	isl_name.c \
-	isl_name.h \
-	isl_obj.c \
-	isl_options.c \
-	isl_output.c \
-	isl_qsort.c \
-	isl_qsort.h \
-	isl_piplib.h \
-	isl_point_private.h \
-	isl_point.c \
-	isl_polynomial_private.h \
-	isl_polynomial.c \
-	isl_printer_private.h \
-	isl_printer.c \
-	isl_range.c \
-	isl_range.h \
-	isl_reordering.c \
-	isl_reordering.h \
-	isl_sample.h \
-	isl_sample.c \
-	isl_scan.c \
-	isl_scan.h \
-	isl_schedule.c \
-	isl_schedule_private.h \
-	isl_stream.c \
-	isl_seq.c \
-	isl_tab.c \
-	isl_tab.h \
-	isl_tab_pip.c \
-	isl_transitive_closure.c \
-	isl_union_map.c \
-	isl_union_map_private.h \
-	isl_vec.c \
-	isl_version.c \
-	isl_vertices_private.h \
-	isl_vertices.c
-EXTRA_libisl_la_SOURCES = \
-	isl_lp_piplib.c \
-	isl_lp_no_piplib.c \
-	isl_map_piplib.c \
-	isl_map_no_piplib.c \
-	isl_sample_no_piplib.c \
-	isl_sample_piplib.c \
-	isl_sample_piplib.h \
-	isl_piplib.c
-libisl_la_LIBADD = @PIPLIB_LIBS@ -lgmp
-libisl_la_LDFLAGS = -version-info @versioninfo@ \
-	@PIPLIB_LDFLAGS@ @GMP_LDFLAGS@
-libisl_la_CPPFLAGS = $(INCLUDES) @PIPLIB_CPPFLAGS@ @GMP_CPPFLAGS@
-
-isl_test_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_test_LDFLAGS = @GMP_LDFLAGS@
-isl_test_LDADD = libisl.la -lgmp
-
-isl_polyhedron_sample_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_polyhedron_sample_LDADD = libisl.la
-isl_polyhedron_sample_SOURCES = \
-	polyhedron_sample.c
-
-isl_pip_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_pip_LDFLAGS = @GMP_LDFLAGS@
-isl_pip_LDADD = libisl.la -lgmp
-isl_pip_SOURCES = \
-	pip.c
-
-isl_bound_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_bound_LDFLAGS = @GMP_LDFLAGS@
-isl_bound_LDADD = libisl.la -lgmp
-isl_bound_SOURCES = \
-	bound.c
-
-isl_polyhedron_minimize_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_polyhedron_minimize_LDFLAGS = @GMP_LDFLAGS@
-isl_polyhedron_minimize_LDADD = libisl.la -lgmp
-isl_polyhedron_minimize_SOURCES = \
-	polyhedron_minimize.c
-
-isl_polytope_scan_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_polytope_scan_LDADD = libisl.la
-isl_polytope_scan_SOURCES = \
-	polytope_scan.c
-
-isl_polyhedron_detect_equalities_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_polyhedron_detect_equalities_LDADD = libisl.la
-isl_polyhedron_detect_equalities_SOURCES = \
-	polyhedron_detect_equalities.c
-
-isl_cat_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_cat_LDADD = libisl.la
-isl_cat_SOURCES = \
-	cat.c
-
-isl_closure_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_closure_LDADD = libisl.la
-isl_closure_SOURCES = \
-	closure.c
-
-nodist_pkginclude_HEADERS = \
-	include/isl/config.h \
-	include/isl/stdint.h
-pkginclude_HEADERS = \
-	include/isl/aff.h \
-	include/isl/aff_type.h \
-	include/isl/arg.h \
-	include/isl/band.h \
-	include/isl/blk.h \
-	include/isl/constraint.h \
-	include/isl/ctx.h \
-	include/isl/dim.h \
-	include/isl/div.h \
-	include/isl/flow.h \
-	include/isl/ilp.h \
-	include/isl/int.h \
-	include/isl/hash.h \
-	include/isl/list.h \
-	include/isl/local_space.h \
-	include/isl/lp.h \
-	include/isl/mat.h \
-	include/isl/map.h \
-	include/isl/map_type.h \
-	include/isl/obj.h \
-	include/isl/options.h \
-	include/isl/point.h \
-	include/isl/polynomial.h \
-	include/isl/printer.h \
-	include/isl/schedule.h \
-	include/isl/seq.h \
-	include/isl/set.h \
-	include/isl/set_type.h \
-	include/isl/stream.h \
-	include/isl/union_map.h \
-	include/isl/union_set.h \
-	include/isl/vec.h \
-	include/isl/version.h \
-	include/isl/vertices.h
-
-EXTRA_DIST = \
-	isl_config_post.h \
-	basis_reduction_templ.c \
-	isl_list_templ.c \
-	isl_list_templ.h \
-	isl_pw_templ.c \
-	isl_union_templ.c \
-	isl.py \
-	doc/chicago.bst \
-	doc/chicago.sty \
-	doc/implementation.tex \
-	doc/isl.bib \
-	doc/mypod2latex \
-	doc/manual.tex \
-	doc/user.pod \
-	test_inputs
-
-dist-hook:
-	echo @GIT_HEAD_VERSION@ > $(distdir)/GIT_HEAD_ID
-	(cd doc; make manual.pdf)
-	cp doc/manual.pdf $(distdir)/doc/
-
-pkgconfigdir=$(pkgconfig_libdir)
-pkgconfig_DATA = $(pkgconfig_libfile)
-
-gitversion.h: @GIT_HEAD@
-	$(AM_V_GEN)echo '#define GIT_HEAD_ID "'@GIT_HEAD_VERSION@'"' > $@
-
-install-data-local: $(srcdir)/isl.py
-	@libisl=`sed -ne "/^library_names=/{s/.*='//;s/'$$//;s/ .*//;p}" \
-		 $(builddir)/libisl.la`; \
-	case $$libisl in \
-	'') echo Cannot find isl library name. GDB bindings not installed.;; \
-	*) echo $(INSTALL_DATA) $(srcdir)/isl.py \
-		$(DESTDIR)$(libdir)/$$libisl-gdb.py; \
-	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"; \
-	$(INSTALL_DATA) $(srcdir)/isl.py $(DESTDIR)$(libdir)/$$libisl-gdb.py; esac
diff --git a/cloog-0.16.3/isl/Makefile.in b/cloog-0.16.3/isl/Makefile.in
deleted file mode 100644
index 1ff453f..0000000
--- a/cloog-0.16.3/isl/Makefile.in
+++ /dev/null
@@ -1,2198 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-
-
-
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-noinst_PROGRAMS = isl_test$(EXEEXT) isl_polyhedron_sample$(EXEEXT) \
-	isl_pip$(EXEEXT) isl_polyhedron_minimize$(EXEEXT) \
-	isl_polytope_scan$(EXEEXT) \
-	isl_polyhedron_detect_equalities$(EXEEXT) isl_cat$(EXEEXT) \
-	isl_closure$(EXEEXT) isl_bound$(EXEEXT)
-TESTS = isl_test$(EXEEXT) pip_test.sh bound_test.sh
-subdir = .
-DIST_COMMON = $(am__configure_deps) $(pkginclude_HEADERS) \
-	$(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-	$(srcdir)/bound_test.sh.in $(srcdir)/isl_config.h.in \
-	$(srcdir)/pip_test.sh.in $(top_srcdir)/configure \
-	$(top_srcdir)/include/isl/config.h.in AUTHORS ChangeLog \
-	config.guess config.sub depcomp install-sh ltmain.sh missing
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_c___attribute__.m4 \
-	$(top_srcdir)/m4/ax_cc_maxopt.m4 \
-	$(top_srcdir)/m4/ax_check_compiler_flags.m4 \
-	$(top_srcdir)/m4/ax_compiler_vendor.m4 \
-	$(top_srcdir)/m4/ax_create_pkgconfig_info.m4 \
-	$(top_srcdir)/m4/ax_create_stdint_h.m4 \
-	$(top_srcdir)/m4/ax_detect_git_head.m4 \
-	$(top_srcdir)/m4/ax_gcc_archflag.m4 \
-	$(top_srcdir)/m4/ax_gcc_warn_unused_result.m4 \
-	$(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \
-	$(top_srcdir)/m4/ax_set_warning_flags.m4 \
-	$(top_srcdir)/m4/ax_submodule.m4 $(top_srcdir)/m4/libtool.m4 \
-	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno config.status.lineno
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = isl_config.h $(top_builddir)/include/isl/config.h
-CONFIG_CLEAN_FILES = bound_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 \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" \
-	"$(DESTDIR)$(pkgincludedir)" "$(DESTDIR)$(pkgincludedir)"
-LTLIBRARIES = $(lib_LTLIBRARIES)
-libisl_la_DEPENDENCIES =
-am__libisl_la_SOURCES_DIST = isl_lp_no_piplib.c isl_map_no_piplib.c \
-	isl_sample_no_piplib.c isl_lp_piplib.c isl_map_piplib.c \
-	isl_sample_piplib.c isl_sample_piplib.h isl_piplib.c \
-	mp_get_memory_functions.c isl_aff.c isl_aff_private.h \
-	isl_affine_hull.c isl_arg.c isl_band.c isl_band_private.h \
-	isl_basis_reduction.h basis_reduction_tab.c isl_bernstein.c \
-	isl_bernstein.h isl_blk.c isl_bound.c isl_bound.h \
-	isl_coalesce.c isl_constraint.c isl_constraint_private.h \
-	isl_convex_hull.c isl_ctx.c isl_ctx_private.h isl_dim.c \
-	isl_dim_private.h isl_dim_map.h isl_dim_map.c isl_div.c \
-	isl_div_private.h isl_equalities.c isl_equalities.h \
-	isl_factorization.c isl_factorization.h isl_farkas.c \
-	isl_flow.c isl_fold.c isl_gmp.c isl_hash.c \
-	isl_hmap_map_basic_set.c isl_hmap_map_basic_set.h isl_ilp.c \
-	isl_input.c isl_list.c isl_list_private.h \
-	isl_local_space_private.h isl_local_space.c isl_lp.c \
-	isl_lp_piplib.h isl_map.c isl_map_simplify.c \
-	isl_map_subtract.c isl_map_private.h isl_map_piplib.h \
-	isl_mat.c isl_mat_private.h isl_morph.c isl_morph.h isl_name.c \
-	isl_name.h isl_obj.c isl_options.c isl_output.c isl_qsort.c \
-	isl_qsort.h isl_piplib.h isl_point_private.h isl_point.c \
-	isl_polynomial_private.h isl_polynomial.c \
-	isl_printer_private.h isl_printer.c isl_range.c isl_range.h \
-	isl_reordering.c isl_reordering.h isl_sample.h isl_sample.c \
-	isl_scan.c isl_scan.h isl_schedule.c isl_schedule_private.h \
-	isl_stream.c isl_seq.c isl_tab.c isl_tab.h isl_tab_pip.c \
-	isl_transitive_closure.c isl_union_map.c \
-	isl_union_map_private.h isl_vec.c isl_version.c \
-	isl_vertices_private.h isl_vertices.c
-@HAVE_PIPLIB_FALSE@am__objects_1 = libisl_la-isl_lp_no_piplib.lo \
-@HAVE_PIPLIB_FALSE@	libisl_la-isl_map_no_piplib.lo \
-@HAVE_PIPLIB_FALSE@	libisl_la-isl_sample_no_piplib.lo
-@HAVE_PIPLIB_TRUE@am__objects_1 = libisl_la-isl_lp_piplib.lo \
-@HAVE_PIPLIB_TRUE@	libisl_la-isl_map_piplib.lo \
-@HAVE_PIPLIB_TRUE@	libisl_la-isl_sample_piplib.lo \
-@HAVE_PIPLIB_TRUE@	libisl_la-isl_piplib.lo
-@NEED_GET_MEMORY_FUNCTIONS_TRUE@am__objects_2 = libisl_la-mp_get_memory_functions.lo
-am_libisl_la_OBJECTS = $(am__objects_1) $(am__objects_2) \
-	libisl_la-isl_aff.lo libisl_la-isl_affine_hull.lo \
-	libisl_la-isl_arg.lo libisl_la-isl_band.lo \
-	libisl_la-basis_reduction_tab.lo libisl_la-isl_bernstein.lo \
-	libisl_la-isl_blk.lo libisl_la-isl_bound.lo \
-	libisl_la-isl_coalesce.lo libisl_la-isl_constraint.lo \
-	libisl_la-isl_convex_hull.lo libisl_la-isl_ctx.lo \
-	libisl_la-isl_dim.lo libisl_la-isl_dim_map.lo \
-	libisl_la-isl_div.lo libisl_la-isl_equalities.lo \
-	libisl_la-isl_factorization.lo libisl_la-isl_farkas.lo \
-	libisl_la-isl_flow.lo libisl_la-isl_fold.lo \
-	libisl_la-isl_gmp.lo libisl_la-isl_hash.lo \
-	libisl_la-isl_hmap_map_basic_set.lo libisl_la-isl_ilp.lo \
-	libisl_la-isl_input.lo libisl_la-isl_list.lo \
-	libisl_la-isl_local_space.lo libisl_la-isl_lp.lo \
-	libisl_la-isl_map.lo libisl_la-isl_map_simplify.lo \
-	libisl_la-isl_map_subtract.lo libisl_la-isl_mat.lo \
-	libisl_la-isl_morph.lo libisl_la-isl_name.lo \
-	libisl_la-isl_obj.lo libisl_la-isl_options.lo \
-	libisl_la-isl_output.lo libisl_la-isl_qsort.lo \
-	libisl_la-isl_point.lo libisl_la-isl_polynomial.lo \
-	libisl_la-isl_printer.lo libisl_la-isl_range.lo \
-	libisl_la-isl_reordering.lo libisl_la-isl_sample.lo \
-	libisl_la-isl_scan.lo libisl_la-isl_schedule.lo \
-	libisl_la-isl_stream.lo libisl_la-isl_seq.lo \
-	libisl_la-isl_tab.lo libisl_la-isl_tab_pip.lo \
-	libisl_la-isl_transitive_closure.lo libisl_la-isl_union_map.lo \
-	libisl_la-isl_vec.lo libisl_la-isl_version.lo \
-	libisl_la-isl_vertices.lo
-libisl_la_OBJECTS = $(am_libisl_la_OBJECTS)
-AM_V_lt = $(am__v_lt_$(V))
-am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
-am__v_lt_0 = --silent
-libisl_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(libisl_la_LDFLAGS) $(LDFLAGS) -o $@
-PROGRAMS = $(noinst_PROGRAMS)
-am_isl_bound_OBJECTS = isl_bound-bound.$(OBJEXT)
-isl_bound_OBJECTS = $(am_isl_bound_OBJECTS)
-isl_bound_DEPENDENCIES = libisl.la
-isl_bound_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(isl_bound_LDFLAGS) $(LDFLAGS) -o $@
-am_isl_cat_OBJECTS = isl_cat-cat.$(OBJEXT)
-isl_cat_OBJECTS = $(am_isl_cat_OBJECTS)
-isl_cat_DEPENDENCIES = libisl.la
-am_isl_closure_OBJECTS = isl_closure-closure.$(OBJEXT)
-isl_closure_OBJECTS = $(am_isl_closure_OBJECTS)
-isl_closure_DEPENDENCIES = libisl.la
-am_isl_pip_OBJECTS = isl_pip-pip.$(OBJEXT)
-isl_pip_OBJECTS = $(am_isl_pip_OBJECTS)
-isl_pip_DEPENDENCIES = libisl.la
-isl_pip_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(isl_pip_LDFLAGS) $(LDFLAGS) -o $@
-am_isl_polyhedron_detect_equalities_OBJECTS = isl_polyhedron_detect_equalities-polyhedron_detect_equalities.$(OBJEXT)
-isl_polyhedron_detect_equalities_OBJECTS =  \
-	$(am_isl_polyhedron_detect_equalities_OBJECTS)
-isl_polyhedron_detect_equalities_DEPENDENCIES = libisl.la
-am_isl_polyhedron_minimize_OBJECTS =  \
-	isl_polyhedron_minimize-polyhedron_minimize.$(OBJEXT)
-isl_polyhedron_minimize_OBJECTS =  \
-	$(am_isl_polyhedron_minimize_OBJECTS)
-isl_polyhedron_minimize_DEPENDENCIES = libisl.la
-isl_polyhedron_minimize_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
-	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
-	$(AM_CFLAGS) $(CFLAGS) $(isl_polyhedron_minimize_LDFLAGS) \
-	$(LDFLAGS) -o $@
-am_isl_polyhedron_sample_OBJECTS =  \
-	isl_polyhedron_sample-polyhedron_sample.$(OBJEXT)
-isl_polyhedron_sample_OBJECTS = $(am_isl_polyhedron_sample_OBJECTS)
-isl_polyhedron_sample_DEPENDENCIES = libisl.la
-am_isl_polytope_scan_OBJECTS =  \
-	isl_polytope_scan-polytope_scan.$(OBJEXT)
-isl_polytope_scan_OBJECTS = $(am_isl_polytope_scan_OBJECTS)
-isl_polytope_scan_DEPENDENCIES = libisl.la
-isl_test_SOURCES = isl_test.c
-isl_test_OBJECTS = isl_test-isl_test.$(OBJEXT)
-isl_test_DEPENDENCIES = libisl.la
-isl_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(isl_test_LDFLAGS) $(LDFLAGS) -o $@
-DEFAULT_INCLUDES = 
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_$(V))
-am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
-am__v_CC_0 = @echo "  CC    " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
-CCLD = $(CC)
-LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_$(V))
-am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
-am__v_CCLD_0 = @echo "  CCLD  " $@;
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
-SOURCES = $(libisl_la_SOURCES) $(EXTRA_libisl_la_SOURCES) \
-	$(isl_bound_SOURCES) $(isl_cat_SOURCES) $(isl_closure_SOURCES) \
-	$(isl_pip_SOURCES) $(isl_polyhedron_detect_equalities_SOURCES) \
-	$(isl_polyhedron_minimize_SOURCES) \
-	$(isl_polyhedron_sample_SOURCES) $(isl_polytope_scan_SOURCES) \
-	isl_test.c
-DIST_SOURCES = $(am__libisl_la_SOURCES_DIST) \
-	$(EXTRA_libisl_la_SOURCES) $(isl_bound_SOURCES) \
-	$(isl_cat_SOURCES) $(isl_closure_SOURCES) $(isl_pip_SOURCES) \
-	$(isl_polyhedron_detect_equalities_SOURCES) \
-	$(isl_polyhedron_minimize_SOURCES) \
-	$(isl_polyhedron_sample_SOURCES) $(isl_polytope_scan_SOURCES) \
-	isl_test.c
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-dvi-recursive install-exec-recursive \
-	install-html-recursive install-info-recursive \
-	install-pdf-recursive install-ps-recursive install-recursive \
-	installcheck-recursive installdirs-recursive pdf-recursive \
-	ps-recursive uninstall-recursive
-DATA = $(pkgconfig_DATA)
-HEADERS = $(nodist_pkginclude_HEADERS) $(pkginclude_HEADERS)
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
-  distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
-	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
-	distdir dist dist-all distcheck
-ETAGS = etags
-CTAGS = ctags
-am__tty_colors = \
-red=; grn=; lgn=; blu=; std=
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-distdir = $(PACKAGE)-$(VERSION)
-top_distdir = $(distdir)
-am__remove_distdir = \
-  { test ! -d "$(distdir)" \
-    || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
-         && rm -fr "$(distdir)"; }; }
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-DIST_ARCHIVES = $(distdir).tar.gz
-GZIP_ENV = --best
-distuninstallcheck_listfiles = find . -type f -print
-distcleancheck_listfiles = find . -type f -print
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GIT_HEAD = @GIT_HEAD@
-GIT_HEAD_ID = @GIT_HEAD_ID@
-GIT_HEAD_VERSION = @GIT_HEAD_VERSION@
-GMP_CPPFLAGS = @GMP_CPPFLAGS@
-GMP_LDFLAGS = @GMP_LDFLAGS@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PDFLATEX = @PDFLATEX@
-PERL = @PERL@
-PIPLIB_CPPFLAGS = @PIPLIB_CPPFLAGS@
-PIPLIB_LDFLAGS = @PIPLIB_LDFLAGS@
-PIPLIB_LIBS = @PIPLIB_LIBS@
-POD2HTML = @POD2HTML@
-PRTDIAG = @PRTDIAG@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-WARNING_FLAGS = @WARNING_FLAGS@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-pkgconfig_libdir = @pkgconfig_libdir@
-pkgconfig_libfile = @pkgconfig_libfile@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-versioninfo = @versioninfo@
-SUBDIRS = . doc
-DIST_SUBDIRS = doc
-ACLOCAL_AMFLAGS = -I m4
-AUTOMAKE_OPTIONS = nostdinc
-lib_LTLIBRARIES = libisl.la
-@HAVE_PIPLIB_FALSE@ISL_PIPLIB = \
-@HAVE_PIPLIB_FALSE@	isl_lp_no_piplib.c \
-@HAVE_PIPLIB_FALSE@	isl_map_no_piplib.c \
-@HAVE_PIPLIB_FALSE@	isl_sample_no_piplib.c
-
-@HAVE_PIPLIB_TRUE@ISL_PIPLIB = \
-@HAVE_PIPLIB_TRUE@	isl_lp_piplib.c \
-@HAVE_PIPLIB_TRUE@	isl_map_piplib.c \
-@HAVE_PIPLIB_TRUE@	isl_sample_piplib.c \
-@HAVE_PIPLIB_TRUE@	isl_sample_piplib.h \
-@HAVE_PIPLIB_TRUE@	isl_piplib.c
-
-@NEED_GET_MEMORY_FUNCTIONS_TRUE@GET_MEMORY_FUNCTIONS = mp_get_memory_functions.c
-INCLUDES = -I. -I$(srcdir) -I$(srcdir)/include -Iinclude/ 
-AM_CFLAGS = @WARNING_FLAGS@
-libisl_la_SOURCES = \
-	$(ISL_PIPLIB) \
-	$(GET_MEMORY_FUNCTIONS) \
-	isl_aff.c \
-	isl_aff_private.h \
-	isl_affine_hull.c \
-	isl_arg.c \
-	isl_band.c \
-	isl_band_private.h \
-	isl_basis_reduction.h \
-	basis_reduction_tab.c \
-	isl_bernstein.c \
-	isl_bernstein.h \
-	isl_blk.c \
-	isl_bound.c \
-	isl_bound.h \
-	isl_coalesce.c \
-	isl_constraint.c \
-	isl_constraint_private.h \
-	isl_convex_hull.c \
-	isl_ctx.c \
-	isl_ctx_private.h \
-	isl_dim.c \
-	isl_dim_private.h \
-	isl_dim_map.h \
-	isl_dim_map.c \
-	isl_div.c \
-	isl_div_private.h \
-	isl_equalities.c \
-	isl_equalities.h \
-	isl_factorization.c \
-	isl_factorization.h \
-	isl_farkas.c \
-	isl_flow.c \
-	isl_fold.c \
-	isl_gmp.c \
-	isl_hash.c \
-	isl_hmap_map_basic_set.c \
-	isl_hmap_map_basic_set.h \
-	isl_ilp.c \
-	isl_input.c \
-	isl_list.c \
-	isl_list_private.h \
-	isl_local_space_private.h \
-	isl_local_space.c \
-	isl_lp.c \
-	isl_lp_piplib.h \
-	isl_map.c \
-	isl_map_simplify.c \
-	isl_map_subtract.c \
-	isl_map_private.h \
-	isl_map_piplib.h \
-	isl_mat.c \
-	isl_mat_private.h \
-	isl_morph.c \
-	isl_morph.h \
-	isl_name.c \
-	isl_name.h \
-	isl_obj.c \
-	isl_options.c \
-	isl_output.c \
-	isl_qsort.c \
-	isl_qsort.h \
-	isl_piplib.h \
-	isl_point_private.h \
-	isl_point.c \
-	isl_polynomial_private.h \
-	isl_polynomial.c \
-	isl_printer_private.h \
-	isl_printer.c \
-	isl_range.c \
-	isl_range.h \
-	isl_reordering.c \
-	isl_reordering.h \
-	isl_sample.h \
-	isl_sample.c \
-	isl_scan.c \
-	isl_scan.h \
-	isl_schedule.c \
-	isl_schedule_private.h \
-	isl_stream.c \
-	isl_seq.c \
-	isl_tab.c \
-	isl_tab.h \
-	isl_tab_pip.c \
-	isl_transitive_closure.c \
-	isl_union_map.c \
-	isl_union_map_private.h \
-	isl_vec.c \
-	isl_version.c \
-	isl_vertices_private.h \
-	isl_vertices.c
-
-EXTRA_libisl_la_SOURCES = \
-	isl_lp_piplib.c \
-	isl_lp_no_piplib.c \
-	isl_map_piplib.c \
-	isl_map_no_piplib.c \
-	isl_sample_no_piplib.c \
-	isl_sample_piplib.c \
-	isl_sample_piplib.h \
-	isl_piplib.c
-
-libisl_la_LIBADD = @PIPLIB_LIBS@ -lgmp
-libisl_la_LDFLAGS = -version-info @versioninfo@ \
-	@PIPLIB_LDFLAGS@ @GMP_LDFLAGS@
-
-libisl_la_CPPFLAGS = $(INCLUDES) @PIPLIB_CPPFLAGS@ @GMP_CPPFLAGS@
-isl_test_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_test_LDFLAGS = @GMP_LDFLAGS@
-isl_test_LDADD = libisl.la -lgmp
-isl_polyhedron_sample_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_polyhedron_sample_LDADD = libisl.la
-isl_polyhedron_sample_SOURCES = \
-	polyhedron_sample.c
-
-isl_pip_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_pip_LDFLAGS = @GMP_LDFLAGS@
-isl_pip_LDADD = libisl.la -lgmp
-isl_pip_SOURCES = \
-	pip.c
-
-isl_bound_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_bound_LDFLAGS = @GMP_LDFLAGS@
-isl_bound_LDADD = libisl.la -lgmp
-isl_bound_SOURCES = \
-	bound.c
-
-isl_polyhedron_minimize_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_polyhedron_minimize_LDFLAGS = @GMP_LDFLAGS@
-isl_polyhedron_minimize_LDADD = libisl.la -lgmp
-isl_polyhedron_minimize_SOURCES = \
-	polyhedron_minimize.c
-
-isl_polytope_scan_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_polytope_scan_LDADD = libisl.la
-isl_polytope_scan_SOURCES = \
-	polytope_scan.c
-
-isl_polyhedron_detect_equalities_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_polyhedron_detect_equalities_LDADD = libisl.la
-isl_polyhedron_detect_equalities_SOURCES = \
-	polyhedron_detect_equalities.c
-
-isl_cat_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_cat_LDADD = libisl.la
-isl_cat_SOURCES = \
-	cat.c
-
-isl_closure_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_closure_LDADD = libisl.la
-isl_closure_SOURCES = \
-	closure.c
-
-nodist_pkginclude_HEADERS = \
-	include/isl/config.h \
-	include/isl/stdint.h
-
-pkginclude_HEADERS = \
-	include/isl/aff.h \
-	include/isl/aff_type.h \
-	include/isl/arg.h \
-	include/isl/band.h \
-	include/isl/blk.h \
-	include/isl/constraint.h \
-	include/isl/ctx.h \
-	include/isl/dim.h \
-	include/isl/div.h \
-	include/isl/flow.h \
-	include/isl/ilp.h \
-	include/isl/int.h \
-	include/isl/hash.h \
-	include/isl/list.h \
-	include/isl/local_space.h \
-	include/isl/lp.h \
-	include/isl/mat.h \
-	include/isl/map.h \
-	include/isl/map_type.h \
-	include/isl/obj.h \
-	include/isl/options.h \
-	include/isl/point.h \
-	include/isl/polynomial.h \
-	include/isl/printer.h \
-	include/isl/schedule.h \
-	include/isl/seq.h \
-	include/isl/set.h \
-	include/isl/set_type.h \
-	include/isl/stream.h \
-	include/isl/union_map.h \
-	include/isl/union_set.h \
-	include/isl/vec.h \
-	include/isl/version.h \
-	include/isl/vertices.h
-
-EXTRA_DIST = \
-	isl_config_post.h \
-	basis_reduction_templ.c \
-	isl_list_templ.c \
-	isl_list_templ.h \
-	isl_pw_templ.c \
-	isl_union_templ.c \
-	isl.py \
-	doc/chicago.bst \
-	doc/chicago.sty \
-	doc/implementation.tex \
-	doc/isl.bib \
-	doc/mypod2latex \
-	doc/manual.tex \
-	doc/user.pod \
-	test_inputs
-
-pkgconfigdir = $(pkgconfig_libdir)
-pkgconfig_DATA = $(pkgconfig_libfile)
-all: isl_config.h
-	$(MAKE) $(AM_MAKEFLAGS) all-recursive
-
-.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
-am--refresh:
-	@:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
-	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    echo ' $(SHELL) ./config.status'; \
-	    $(SHELL) ./config.status;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	$(SHELL) ./config.status --recheck
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	$(am__cd) $(srcdir) && $(AUTOCONF)
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
-$(am__aclocal_m4_deps):
-
-isl_config.h: stamp-h1
-	@if test ! -f $@; then \
-	  rm -f stamp-h1; \
-	  $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
-	else :; fi
-
-stamp-h1: $(srcdir)/isl_config.h.in $(top_builddir)/config.status
-	@rm -f stamp-h1
-	cd $(top_builddir) && $(SHELL) ./config.status isl_config.h
-$(srcdir)/isl_config.h.in:  $(am__configure_deps) 
-	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
-	rm -f stamp-h1
-	touch $@
-
-include/isl/config.h: include/isl/stamp-h2
-	@if test ! -f $@; then \
-	  rm -f include/isl/stamp-h2; \
-	  $(MAKE) $(AM_MAKEFLAGS) include/isl/stamp-h2; \
-	else :; fi
-
-include/isl/stamp-h2: $(top_srcdir)/include/isl/config.h.in $(top_builddir)/config.status
-	@rm -f include/isl/stamp-h2
-	cd $(top_builddir) && $(SHELL) ./config.status include/isl/config.h
-
-distclean-hdr:
-	-rm -f isl_config.h stamp-h1 include/isl/config.h include/isl/stamp-h2
-bound_test.sh: $(top_builddir)/config.status $(srcdir)/bound_test.sh.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-pip_test.sh: $(top_builddir)/config.status $(srcdir)/pip_test.sh.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
-	}
-
-uninstall-libLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
-	done
-
-clean-libLTLIBRARIES:
-	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
-	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" != "$$p" || dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-libisl.la: $(libisl_la_OBJECTS) $(libisl_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(libisl_la_LINK) -rpath $(libdir) $(libisl_la_OBJECTS) $(libisl_la_LIBADD) $(LIBS)
-
-clean-noinstPROGRAMS:
-	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
-	echo " rm -f" $$list; \
-	rm -f $$list || exit $$?; \
-	test -n "$(EXEEXT)" || exit 0; \
-	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
-	echo " rm -f" $$list; \
-	rm -f $$list
-isl_bound$(EXEEXT): $(isl_bound_OBJECTS) $(isl_bound_DEPENDENCIES) 
-	@rm -f isl_bound$(EXEEXT)
-	$(AM_V_CCLD)$(isl_bound_LINK) $(isl_bound_OBJECTS) $(isl_bound_LDADD) $(LIBS)
-isl_cat$(EXEEXT): $(isl_cat_OBJECTS) $(isl_cat_DEPENDENCIES) 
-	@rm -f isl_cat$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(isl_cat_OBJECTS) $(isl_cat_LDADD) $(LIBS)
-isl_closure$(EXEEXT): $(isl_closure_OBJECTS) $(isl_closure_DEPENDENCIES) 
-	@rm -f isl_closure$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(isl_closure_OBJECTS) $(isl_closure_LDADD) $(LIBS)
-isl_pip$(EXEEXT): $(isl_pip_OBJECTS) $(isl_pip_DEPENDENCIES) 
-	@rm -f isl_pip$(EXEEXT)
-	$(AM_V_CCLD)$(isl_pip_LINK) $(isl_pip_OBJECTS) $(isl_pip_LDADD) $(LIBS)
-isl_polyhedron_detect_equalities$(EXEEXT): $(isl_polyhedron_detect_equalities_OBJECTS) $(isl_polyhedron_detect_equalities_DEPENDENCIES) 
-	@rm -f isl_polyhedron_detect_equalities$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(isl_polyhedron_detect_equalities_OBJECTS) $(isl_polyhedron_detect_equalities_LDADD) $(LIBS)
-isl_polyhedron_minimize$(EXEEXT): $(isl_polyhedron_minimize_OBJECTS) $(isl_polyhedron_minimize_DEPENDENCIES) 
-	@rm -f isl_polyhedron_minimize$(EXEEXT)
-	$(AM_V_CCLD)$(isl_polyhedron_minimize_LINK) $(isl_polyhedron_minimize_OBJECTS) $(isl_polyhedron_minimize_LDADD) $(LIBS)
-isl_polyhedron_sample$(EXEEXT): $(isl_polyhedron_sample_OBJECTS) $(isl_polyhedron_sample_DEPENDENCIES) 
-	@rm -f isl_polyhedron_sample$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(isl_polyhedron_sample_OBJECTS) $(isl_polyhedron_sample_LDADD) $(LIBS)
-isl_polytope_scan$(EXEEXT): $(isl_polytope_scan_OBJECTS) $(isl_polytope_scan_DEPENDENCIES) 
-	@rm -f isl_polytope_scan$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(isl_polytope_scan_OBJECTS) $(isl_polytope_scan_LDADD) $(LIBS)
-isl_test$(EXEEXT): $(isl_test_OBJECTS) $(isl_test_DEPENDENCIES) 
-	@rm -f isl_test$(EXEEXT)
-	$(AM_V_CCLD)$(isl_test_LINK) $(isl_test_OBJECTS) $(isl_test_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_bound-bound.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_cat-cat.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_closure-closure.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_pip-pip.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_polyhedron_detect_equalities-polyhedron_detect_equalities.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_polyhedron_minimize-polyhedron_minimize.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_polyhedron_sample-polyhedron_sample.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_polytope_scan-polytope_scan.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_test-isl_test.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-basis_reduction_tab.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_aff.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_affine_hull.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_arg.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_band.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_bernstein.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_blk.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_bound.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_coalesce.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_constraint.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_convex_hull.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_ctx.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_dim.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_dim_map.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_div.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_equalities.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_factorization.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_farkas.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_flow.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_fold.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_gmp.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_hash.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_hmap_map_basic_set.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_ilp.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_input.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_list.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_local_space.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_lp.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_lp_no_piplib.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_lp_piplib.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_map.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_map_no_piplib.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_map_piplib.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_map_simplify.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_map_subtract.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_mat.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_morph.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_name.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_obj.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_options.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_output.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_piplib.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_point.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_polynomial.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_printer.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_qsort.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_range.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_reordering.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_sample.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_sample_no_piplib.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_sample_piplib.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_scan.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_schedule.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_seq.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_stream.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_tab.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_tab_pip.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_transitive_closure.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_union_map.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_vec.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_version.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_vertices.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-mp_get_memory_functions.Plo@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c $<
-
-.c.obj:
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.c.lo:
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
-
-libisl_la-isl_lp_no_piplib.lo: isl_lp_no_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_lp_no_piplib.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_lp_no_piplib.Tpo -c -o libisl_la-isl_lp_no_piplib.lo `test -f 'isl_lp_no_piplib.c' || echo '$(srcdir)/'`isl_lp_no_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_lp_no_piplib.Tpo $(DEPDIR)/libisl_la-isl_lp_no_piplib.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_lp_no_piplib.c' object='libisl_la-isl_lp_no_piplib.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_lp_no_piplib.lo `test -f 'isl_lp_no_piplib.c' || echo '$(srcdir)/'`isl_lp_no_piplib.c
-
-libisl_la-isl_map_no_piplib.lo: isl_map_no_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_map_no_piplib.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_map_no_piplib.Tpo -c -o libisl_la-isl_map_no_piplib.lo `test -f 'isl_map_no_piplib.c' || echo '$(srcdir)/'`isl_map_no_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_map_no_piplib.Tpo $(DEPDIR)/libisl_la-isl_map_no_piplib.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_map_no_piplib.c' object='libisl_la-isl_map_no_piplib.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_map_no_piplib.lo `test -f 'isl_map_no_piplib.c' || echo '$(srcdir)/'`isl_map_no_piplib.c
-
-libisl_la-isl_sample_no_piplib.lo: isl_sample_no_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_sample_no_piplib.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_sample_no_piplib.Tpo -c -o libisl_la-isl_sample_no_piplib.lo `test -f 'isl_sample_no_piplib.c' || echo '$(srcdir)/'`isl_sample_no_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_sample_no_piplib.Tpo $(DEPDIR)/libisl_la-isl_sample_no_piplib.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_sample_no_piplib.c' object='libisl_la-isl_sample_no_piplib.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_sample_no_piplib.lo `test -f 'isl_sample_no_piplib.c' || echo '$(srcdir)/'`isl_sample_no_piplib.c
-
-libisl_la-isl_lp_piplib.lo: isl_lp_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_lp_piplib.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_lp_piplib.Tpo -c -o libisl_la-isl_lp_piplib.lo `test -f 'isl_lp_piplib.c' || echo '$(srcdir)/'`isl_lp_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_lp_piplib.Tpo $(DEPDIR)/libisl_la-isl_lp_piplib.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_lp_piplib.c' object='libisl_la-isl_lp_piplib.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_lp_piplib.lo `test -f 'isl_lp_piplib.c' || echo '$(srcdir)/'`isl_lp_piplib.c
-
-libisl_la-isl_map_piplib.lo: isl_map_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_map_piplib.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_map_piplib.Tpo -c -o libisl_la-isl_map_piplib.lo `test -f 'isl_map_piplib.c' || echo '$(srcdir)/'`isl_map_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_map_piplib.Tpo $(DEPDIR)/libisl_la-isl_map_piplib.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_map_piplib.c' object='libisl_la-isl_map_piplib.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_map_piplib.lo `test -f 'isl_map_piplib.c' || echo '$(srcdir)/'`isl_map_piplib.c
-
-libisl_la-isl_sample_piplib.lo: isl_sample_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_sample_piplib.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_sample_piplib.Tpo -c -o libisl_la-isl_sample_piplib.lo `test -f 'isl_sample_piplib.c' || echo '$(srcdir)/'`isl_sample_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_sample_piplib.Tpo $(DEPDIR)/libisl_la-isl_sample_piplib.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_sample_piplib.c' object='libisl_la-isl_sample_piplib.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_sample_piplib.lo `test -f 'isl_sample_piplib.c' || echo '$(srcdir)/'`isl_sample_piplib.c
-
-libisl_la-isl_piplib.lo: isl_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_piplib.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_piplib.Tpo -c -o libisl_la-isl_piplib.lo `test -f 'isl_piplib.c' || echo '$(srcdir)/'`isl_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_piplib.Tpo $(DEPDIR)/libisl_la-isl_piplib.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_piplib.c' object='libisl_la-isl_piplib.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_piplib.lo `test -f 'isl_piplib.c' || echo '$(srcdir)/'`isl_piplib.c
-
-libisl_la-mp_get_memory_functions.lo: mp_get_memory_functions.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-mp_get_memory_functions.lo -MD -MP -MF $(DEPDIR)/libisl_la-mp_get_memory_functions.Tpo -c -o libisl_la-mp_get_memory_functions.lo `test -f 'mp_get_memory_functions.c' || echo '$(srcdir)/'`mp_get_memory_functions.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-mp_get_memory_functions.Tpo $(DEPDIR)/libisl_la-mp_get_memory_functions.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mp_get_memory_functions.c' object='libisl_la-mp_get_memory_functions.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-mp_get_memory_functions.lo `test -f 'mp_get_memory_functions.c' || echo '$(srcdir)/'`mp_get_memory_functions.c
-
-libisl_la-isl_aff.lo: isl_aff.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_aff.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_aff.Tpo -c -o libisl_la-isl_aff.lo `test -f 'isl_aff.c' || echo '$(srcdir)/'`isl_aff.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_aff.Tpo $(DEPDIR)/libisl_la-isl_aff.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_aff.c' object='libisl_la-isl_aff.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_aff.lo `test -f 'isl_aff.c' || echo '$(srcdir)/'`isl_aff.c
-
-libisl_la-isl_affine_hull.lo: isl_affine_hull.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_affine_hull.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_affine_hull.Tpo -c -o libisl_la-isl_affine_hull.lo `test -f 'isl_affine_hull.c' || echo '$(srcdir)/'`isl_affine_hull.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_affine_hull.Tpo $(DEPDIR)/libisl_la-isl_affine_hull.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_affine_hull.c' object='libisl_la-isl_affine_hull.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_affine_hull.lo `test -f 'isl_affine_hull.c' || echo '$(srcdir)/'`isl_affine_hull.c
-
-libisl_la-isl_arg.lo: isl_arg.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_arg.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_arg.Tpo -c -o libisl_la-isl_arg.lo `test -f 'isl_arg.c' || echo '$(srcdir)/'`isl_arg.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_arg.Tpo $(DEPDIR)/libisl_la-isl_arg.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_arg.c' object='libisl_la-isl_arg.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_arg.lo `test -f 'isl_arg.c' || echo '$(srcdir)/'`isl_arg.c
-
-libisl_la-isl_band.lo: isl_band.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_band.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_band.Tpo -c -o libisl_la-isl_band.lo `test -f 'isl_band.c' || echo '$(srcdir)/'`isl_band.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_band.Tpo $(DEPDIR)/libisl_la-isl_band.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_band.c' object='libisl_la-isl_band.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_band.lo `test -f 'isl_band.c' || echo '$(srcdir)/'`isl_band.c
-
-libisl_la-basis_reduction_tab.lo: basis_reduction_tab.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-basis_reduction_tab.lo -MD -MP -MF $(DEPDIR)/libisl_la-basis_reduction_tab.Tpo -c -o libisl_la-basis_reduction_tab.lo `test -f 'basis_reduction_tab.c' || echo '$(srcdir)/'`basis_reduction_tab.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-basis_reduction_tab.Tpo $(DEPDIR)/libisl_la-basis_reduction_tab.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='basis_reduction_tab.c' object='libisl_la-basis_reduction_tab.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-basis_reduction_tab.lo `test -f 'basis_reduction_tab.c' || echo '$(srcdir)/'`basis_reduction_tab.c
-
-libisl_la-isl_bernstein.lo: isl_bernstein.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_bernstein.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_bernstein.Tpo -c -o libisl_la-isl_bernstein.lo `test -f 'isl_bernstein.c' || echo '$(srcdir)/'`isl_bernstein.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_bernstein.Tpo $(DEPDIR)/libisl_la-isl_bernstein.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_bernstein.c' object='libisl_la-isl_bernstein.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_bernstein.lo `test -f 'isl_bernstein.c' || echo '$(srcdir)/'`isl_bernstein.c
-
-libisl_la-isl_blk.lo: isl_blk.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_blk.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_blk.Tpo -c -o libisl_la-isl_blk.lo `test -f 'isl_blk.c' || echo '$(srcdir)/'`isl_blk.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_blk.Tpo $(DEPDIR)/libisl_la-isl_blk.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_blk.c' object='libisl_la-isl_blk.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_blk.lo `test -f 'isl_blk.c' || echo '$(srcdir)/'`isl_blk.c
-
-libisl_la-isl_bound.lo: isl_bound.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_bound.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_bound.Tpo -c -o libisl_la-isl_bound.lo `test -f 'isl_bound.c' || echo '$(srcdir)/'`isl_bound.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_bound.Tpo $(DEPDIR)/libisl_la-isl_bound.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_bound.c' object='libisl_la-isl_bound.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_bound.lo `test -f 'isl_bound.c' || echo '$(srcdir)/'`isl_bound.c
-
-libisl_la-isl_coalesce.lo: isl_coalesce.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_coalesce.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_coalesce.Tpo -c -o libisl_la-isl_coalesce.lo `test -f 'isl_coalesce.c' || echo '$(srcdir)/'`isl_coalesce.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_coalesce.Tpo $(DEPDIR)/libisl_la-isl_coalesce.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_coalesce.c' object='libisl_la-isl_coalesce.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_coalesce.lo `test -f 'isl_coalesce.c' || echo '$(srcdir)/'`isl_coalesce.c
-
-libisl_la-isl_constraint.lo: isl_constraint.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_constraint.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_constraint.Tpo -c -o libisl_la-isl_constraint.lo `test -f 'isl_constraint.c' || echo '$(srcdir)/'`isl_constraint.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_constraint.Tpo $(DEPDIR)/libisl_la-isl_constraint.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_constraint.c' object='libisl_la-isl_constraint.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_constraint.lo `test -f 'isl_constraint.c' || echo '$(srcdir)/'`isl_constraint.c
-
-libisl_la-isl_convex_hull.lo: isl_convex_hull.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_convex_hull.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_convex_hull.Tpo -c -o libisl_la-isl_convex_hull.lo `test -f 'isl_convex_hull.c' || echo '$(srcdir)/'`isl_convex_hull.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_convex_hull.Tpo $(DEPDIR)/libisl_la-isl_convex_hull.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_convex_hull.c' object='libisl_la-isl_convex_hull.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_convex_hull.lo `test -f 'isl_convex_hull.c' || echo '$(srcdir)/'`isl_convex_hull.c
-
-libisl_la-isl_ctx.lo: isl_ctx.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_ctx.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_ctx.Tpo -c -o libisl_la-isl_ctx.lo `test -f 'isl_ctx.c' || echo '$(srcdir)/'`isl_ctx.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_ctx.Tpo $(DEPDIR)/libisl_la-isl_ctx.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_ctx.c' object='libisl_la-isl_ctx.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_ctx.lo `test -f 'isl_ctx.c' || echo '$(srcdir)/'`isl_ctx.c
-
-libisl_la-isl_dim.lo: isl_dim.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_dim.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_dim.Tpo -c -o libisl_la-isl_dim.lo `test -f 'isl_dim.c' || echo '$(srcdir)/'`isl_dim.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_dim.Tpo $(DEPDIR)/libisl_la-isl_dim.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_dim.c' object='libisl_la-isl_dim.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_dim.lo `test -f 'isl_dim.c' || echo '$(srcdir)/'`isl_dim.c
-
-libisl_la-isl_dim_map.lo: isl_dim_map.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_dim_map.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_dim_map.Tpo -c -o libisl_la-isl_dim_map.lo `test -f 'isl_dim_map.c' || echo '$(srcdir)/'`isl_dim_map.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_dim_map.Tpo $(DEPDIR)/libisl_la-isl_dim_map.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_dim_map.c' object='libisl_la-isl_dim_map.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_dim_map.lo `test -f 'isl_dim_map.c' || echo '$(srcdir)/'`isl_dim_map.c
-
-libisl_la-isl_div.lo: isl_div.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_div.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_div.Tpo -c -o libisl_la-isl_div.lo `test -f 'isl_div.c' || echo '$(srcdir)/'`isl_div.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_div.Tpo $(DEPDIR)/libisl_la-isl_div.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_div.c' object='libisl_la-isl_div.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_div.lo `test -f 'isl_div.c' || echo '$(srcdir)/'`isl_div.c
-
-libisl_la-isl_equalities.lo: isl_equalities.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_equalities.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_equalities.Tpo -c -o libisl_la-isl_equalities.lo `test -f 'isl_equalities.c' || echo '$(srcdir)/'`isl_equalities.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_equalities.Tpo $(DEPDIR)/libisl_la-isl_equalities.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_equalities.c' object='libisl_la-isl_equalities.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_equalities.lo `test -f 'isl_equalities.c' || echo '$(srcdir)/'`isl_equalities.c
-
-libisl_la-isl_factorization.lo: isl_factorization.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_factorization.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_factorization.Tpo -c -o libisl_la-isl_factorization.lo `test -f 'isl_factorization.c' || echo '$(srcdir)/'`isl_factorization.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_factorization.Tpo $(DEPDIR)/libisl_la-isl_factorization.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_factorization.c' object='libisl_la-isl_factorization.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_factorization.lo `test -f 'isl_factorization.c' || echo '$(srcdir)/'`isl_factorization.c
-
-libisl_la-isl_farkas.lo: isl_farkas.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_farkas.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_farkas.Tpo -c -o libisl_la-isl_farkas.lo `test -f 'isl_farkas.c' || echo '$(srcdir)/'`isl_farkas.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_farkas.Tpo $(DEPDIR)/libisl_la-isl_farkas.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_farkas.c' object='libisl_la-isl_farkas.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_farkas.lo `test -f 'isl_farkas.c' || echo '$(srcdir)/'`isl_farkas.c
-
-libisl_la-isl_flow.lo: isl_flow.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_flow.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_flow.Tpo -c -o libisl_la-isl_flow.lo `test -f 'isl_flow.c' || echo '$(srcdir)/'`isl_flow.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_flow.Tpo $(DEPDIR)/libisl_la-isl_flow.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_flow.c' object='libisl_la-isl_flow.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_flow.lo `test -f 'isl_flow.c' || echo '$(srcdir)/'`isl_flow.c
-
-libisl_la-isl_fold.lo: isl_fold.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_fold.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_fold.Tpo -c -o libisl_la-isl_fold.lo `test -f 'isl_fold.c' || echo '$(srcdir)/'`isl_fold.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_fold.Tpo $(DEPDIR)/libisl_la-isl_fold.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_fold.c' object='libisl_la-isl_fold.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_fold.lo `test -f 'isl_fold.c' || echo '$(srcdir)/'`isl_fold.c
-
-libisl_la-isl_gmp.lo: isl_gmp.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_gmp.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_gmp.Tpo -c -o libisl_la-isl_gmp.lo `test -f 'isl_gmp.c' || echo '$(srcdir)/'`isl_gmp.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_gmp.Tpo $(DEPDIR)/libisl_la-isl_gmp.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_gmp.c' object='libisl_la-isl_gmp.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_gmp.lo `test -f 'isl_gmp.c' || echo '$(srcdir)/'`isl_gmp.c
-
-libisl_la-isl_hash.lo: isl_hash.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_hash.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_hash.Tpo -c -o libisl_la-isl_hash.lo `test -f 'isl_hash.c' || echo '$(srcdir)/'`isl_hash.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_hash.Tpo $(DEPDIR)/libisl_la-isl_hash.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_hash.c' object='libisl_la-isl_hash.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_hash.lo `test -f 'isl_hash.c' || echo '$(srcdir)/'`isl_hash.c
-
-libisl_la-isl_hmap_map_basic_set.lo: isl_hmap_map_basic_set.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_hmap_map_basic_set.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_hmap_map_basic_set.Tpo -c -o libisl_la-isl_hmap_map_basic_set.lo `test -f 'isl_hmap_map_basic_set.c' || echo '$(srcdir)/'`isl_hmap_map_basic_set.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_hmap_map_basic_set.Tpo $(DEPDIR)/libisl_la-isl_hmap_map_basic_set.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_hmap_map_basic_set.c' object='libisl_la-isl_hmap_map_basic_set.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_hmap_map_basic_set.lo `test -f 'isl_hmap_map_basic_set.c' || echo '$(srcdir)/'`isl_hmap_map_basic_set.c
-
-libisl_la-isl_ilp.lo: isl_ilp.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_ilp.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_ilp.Tpo -c -o libisl_la-isl_ilp.lo `test -f 'isl_ilp.c' || echo '$(srcdir)/'`isl_ilp.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_ilp.Tpo $(DEPDIR)/libisl_la-isl_ilp.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_ilp.c' object='libisl_la-isl_ilp.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_ilp.lo `test -f 'isl_ilp.c' || echo '$(srcdir)/'`isl_ilp.c
-
-libisl_la-isl_input.lo: isl_input.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_input.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_input.Tpo -c -o libisl_la-isl_input.lo `test -f 'isl_input.c' || echo '$(srcdir)/'`isl_input.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_input.Tpo $(DEPDIR)/libisl_la-isl_input.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_input.c' object='libisl_la-isl_input.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_input.lo `test -f 'isl_input.c' || echo '$(srcdir)/'`isl_input.c
-
-libisl_la-isl_list.lo: isl_list.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_list.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_list.Tpo -c -o libisl_la-isl_list.lo `test -f 'isl_list.c' || echo '$(srcdir)/'`isl_list.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_list.Tpo $(DEPDIR)/libisl_la-isl_list.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_list.c' object='libisl_la-isl_list.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_list.lo `test -f 'isl_list.c' || echo '$(srcdir)/'`isl_list.c
-
-libisl_la-isl_local_space.lo: isl_local_space.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_local_space.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_local_space.Tpo -c -o libisl_la-isl_local_space.lo `test -f 'isl_local_space.c' || echo '$(srcdir)/'`isl_local_space.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_local_space.Tpo $(DEPDIR)/libisl_la-isl_local_space.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_local_space.c' object='libisl_la-isl_local_space.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_local_space.lo `test -f 'isl_local_space.c' || echo '$(srcdir)/'`isl_local_space.c
-
-libisl_la-isl_lp.lo: isl_lp.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_lp.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_lp.Tpo -c -o libisl_la-isl_lp.lo `test -f 'isl_lp.c' || echo '$(srcdir)/'`isl_lp.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_lp.Tpo $(DEPDIR)/libisl_la-isl_lp.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_lp.c' object='libisl_la-isl_lp.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_lp.lo `test -f 'isl_lp.c' || echo '$(srcdir)/'`isl_lp.c
-
-libisl_la-isl_map.lo: isl_map.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_map.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_map.Tpo -c -o libisl_la-isl_map.lo `test -f 'isl_map.c' || echo '$(srcdir)/'`isl_map.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_map.Tpo $(DEPDIR)/libisl_la-isl_map.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_map.c' object='libisl_la-isl_map.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_map.lo `test -f 'isl_map.c' || echo '$(srcdir)/'`isl_map.c
-
-libisl_la-isl_map_simplify.lo: isl_map_simplify.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_map_simplify.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_map_simplify.Tpo -c -o libisl_la-isl_map_simplify.lo `test -f 'isl_map_simplify.c' || echo '$(srcdir)/'`isl_map_simplify.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_map_simplify.Tpo $(DEPDIR)/libisl_la-isl_map_simplify.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_map_simplify.c' object='libisl_la-isl_map_simplify.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_map_simplify.lo `test -f 'isl_map_simplify.c' || echo '$(srcdir)/'`isl_map_simplify.c
-
-libisl_la-isl_map_subtract.lo: isl_map_subtract.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_map_subtract.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_map_subtract.Tpo -c -o libisl_la-isl_map_subtract.lo `test -f 'isl_map_subtract.c' || echo '$(srcdir)/'`isl_map_subtract.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_map_subtract.Tpo $(DEPDIR)/libisl_la-isl_map_subtract.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_map_subtract.c' object='libisl_la-isl_map_subtract.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_map_subtract.lo `test -f 'isl_map_subtract.c' || echo '$(srcdir)/'`isl_map_subtract.c
-
-libisl_la-isl_mat.lo: isl_mat.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_mat.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_mat.Tpo -c -o libisl_la-isl_mat.lo `test -f 'isl_mat.c' || echo '$(srcdir)/'`isl_mat.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_mat.Tpo $(DEPDIR)/libisl_la-isl_mat.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_mat.c' object='libisl_la-isl_mat.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_mat.lo `test -f 'isl_mat.c' || echo '$(srcdir)/'`isl_mat.c
-
-libisl_la-isl_morph.lo: isl_morph.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_morph.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_morph.Tpo -c -o libisl_la-isl_morph.lo `test -f 'isl_morph.c' || echo '$(srcdir)/'`isl_morph.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_morph.Tpo $(DEPDIR)/libisl_la-isl_morph.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_morph.c' object='libisl_la-isl_morph.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_morph.lo `test -f 'isl_morph.c' || echo '$(srcdir)/'`isl_morph.c
-
-libisl_la-isl_name.lo: isl_name.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_name.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_name.Tpo -c -o libisl_la-isl_name.lo `test -f 'isl_name.c' || echo '$(srcdir)/'`isl_name.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_name.Tpo $(DEPDIR)/libisl_la-isl_name.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_name.c' object='libisl_la-isl_name.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_name.lo `test -f 'isl_name.c' || echo '$(srcdir)/'`isl_name.c
-
-libisl_la-isl_obj.lo: isl_obj.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_obj.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_obj.Tpo -c -o libisl_la-isl_obj.lo `test -f 'isl_obj.c' || echo '$(srcdir)/'`isl_obj.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_obj.Tpo $(DEPDIR)/libisl_la-isl_obj.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_obj.c' object='libisl_la-isl_obj.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_obj.lo `test -f 'isl_obj.c' || echo '$(srcdir)/'`isl_obj.c
-
-libisl_la-isl_options.lo: isl_options.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_options.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_options.Tpo -c -o libisl_la-isl_options.lo `test -f 'isl_options.c' || echo '$(srcdir)/'`isl_options.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_options.Tpo $(DEPDIR)/libisl_la-isl_options.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_options.c' object='libisl_la-isl_options.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_options.lo `test -f 'isl_options.c' || echo '$(srcdir)/'`isl_options.c
-
-libisl_la-isl_output.lo: isl_output.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_output.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_output.Tpo -c -o libisl_la-isl_output.lo `test -f 'isl_output.c' || echo '$(srcdir)/'`isl_output.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_output.Tpo $(DEPDIR)/libisl_la-isl_output.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_output.c' object='libisl_la-isl_output.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_output.lo `test -f 'isl_output.c' || echo '$(srcdir)/'`isl_output.c
-
-libisl_la-isl_qsort.lo: isl_qsort.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_qsort.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_qsort.Tpo -c -o libisl_la-isl_qsort.lo `test -f 'isl_qsort.c' || echo '$(srcdir)/'`isl_qsort.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_qsort.Tpo $(DEPDIR)/libisl_la-isl_qsort.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_qsort.c' object='libisl_la-isl_qsort.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_qsort.lo `test -f 'isl_qsort.c' || echo '$(srcdir)/'`isl_qsort.c
-
-libisl_la-isl_point.lo: isl_point.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_point.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_point.Tpo -c -o libisl_la-isl_point.lo `test -f 'isl_point.c' || echo '$(srcdir)/'`isl_point.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_point.Tpo $(DEPDIR)/libisl_la-isl_point.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_point.c' object='libisl_la-isl_point.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_point.lo `test -f 'isl_point.c' || echo '$(srcdir)/'`isl_point.c
-
-libisl_la-isl_polynomial.lo: isl_polynomial.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_polynomial.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_polynomial.Tpo -c -o libisl_la-isl_polynomial.lo `test -f 'isl_polynomial.c' || echo '$(srcdir)/'`isl_polynomial.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_polynomial.Tpo $(DEPDIR)/libisl_la-isl_polynomial.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_polynomial.c' object='libisl_la-isl_polynomial.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_polynomial.lo `test -f 'isl_polynomial.c' || echo '$(srcdir)/'`isl_polynomial.c
-
-libisl_la-isl_printer.lo: isl_printer.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_printer.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_printer.Tpo -c -o libisl_la-isl_printer.lo `test -f 'isl_printer.c' || echo '$(srcdir)/'`isl_printer.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_printer.Tpo $(DEPDIR)/libisl_la-isl_printer.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_printer.c' object='libisl_la-isl_printer.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_printer.lo `test -f 'isl_printer.c' || echo '$(srcdir)/'`isl_printer.c
-
-libisl_la-isl_range.lo: isl_range.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_range.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_range.Tpo -c -o libisl_la-isl_range.lo `test -f 'isl_range.c' || echo '$(srcdir)/'`isl_range.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_range.Tpo $(DEPDIR)/libisl_la-isl_range.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_range.c' object='libisl_la-isl_range.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_range.lo `test -f 'isl_range.c' || echo '$(srcdir)/'`isl_range.c
-
-libisl_la-isl_reordering.lo: isl_reordering.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_reordering.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_reordering.Tpo -c -o libisl_la-isl_reordering.lo `test -f 'isl_reordering.c' || echo '$(srcdir)/'`isl_reordering.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_reordering.Tpo $(DEPDIR)/libisl_la-isl_reordering.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_reordering.c' object='libisl_la-isl_reordering.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_reordering.lo `test -f 'isl_reordering.c' || echo '$(srcdir)/'`isl_reordering.c
-
-libisl_la-isl_sample.lo: isl_sample.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_sample.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_sample.Tpo -c -o libisl_la-isl_sample.lo `test -f 'isl_sample.c' || echo '$(srcdir)/'`isl_sample.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_sample.Tpo $(DEPDIR)/libisl_la-isl_sample.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_sample.c' object='libisl_la-isl_sample.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_sample.lo `test -f 'isl_sample.c' || echo '$(srcdir)/'`isl_sample.c
-
-libisl_la-isl_scan.lo: isl_scan.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_scan.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_scan.Tpo -c -o libisl_la-isl_scan.lo `test -f 'isl_scan.c' || echo '$(srcdir)/'`isl_scan.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_scan.Tpo $(DEPDIR)/libisl_la-isl_scan.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_scan.c' object='libisl_la-isl_scan.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_scan.lo `test -f 'isl_scan.c' || echo '$(srcdir)/'`isl_scan.c
-
-libisl_la-isl_schedule.lo: isl_schedule.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_schedule.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_schedule.Tpo -c -o libisl_la-isl_schedule.lo `test -f 'isl_schedule.c' || echo '$(srcdir)/'`isl_schedule.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_schedule.Tpo $(DEPDIR)/libisl_la-isl_schedule.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_schedule.c' object='libisl_la-isl_schedule.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_schedule.lo `test -f 'isl_schedule.c' || echo '$(srcdir)/'`isl_schedule.c
-
-libisl_la-isl_stream.lo: isl_stream.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_stream.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_stream.Tpo -c -o libisl_la-isl_stream.lo `test -f 'isl_stream.c' || echo '$(srcdir)/'`isl_stream.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_stream.Tpo $(DEPDIR)/libisl_la-isl_stream.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_stream.c' object='libisl_la-isl_stream.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_stream.lo `test -f 'isl_stream.c' || echo '$(srcdir)/'`isl_stream.c
-
-libisl_la-isl_seq.lo: isl_seq.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_seq.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_seq.Tpo -c -o libisl_la-isl_seq.lo `test -f 'isl_seq.c' || echo '$(srcdir)/'`isl_seq.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_seq.Tpo $(DEPDIR)/libisl_la-isl_seq.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_seq.c' object='libisl_la-isl_seq.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_seq.lo `test -f 'isl_seq.c' || echo '$(srcdir)/'`isl_seq.c
-
-libisl_la-isl_tab.lo: isl_tab.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_tab.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_tab.Tpo -c -o libisl_la-isl_tab.lo `test -f 'isl_tab.c' || echo '$(srcdir)/'`isl_tab.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_tab.Tpo $(DEPDIR)/libisl_la-isl_tab.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_tab.c' object='libisl_la-isl_tab.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_tab.lo `test -f 'isl_tab.c' || echo '$(srcdir)/'`isl_tab.c
-
-libisl_la-isl_tab_pip.lo: isl_tab_pip.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_tab_pip.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_tab_pip.Tpo -c -o libisl_la-isl_tab_pip.lo `test -f 'isl_tab_pip.c' || echo '$(srcdir)/'`isl_tab_pip.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_tab_pip.Tpo $(DEPDIR)/libisl_la-isl_tab_pip.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_tab_pip.c' object='libisl_la-isl_tab_pip.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_tab_pip.lo `test -f 'isl_tab_pip.c' || echo '$(srcdir)/'`isl_tab_pip.c
-
-libisl_la-isl_transitive_closure.lo: isl_transitive_closure.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_transitive_closure.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_transitive_closure.Tpo -c -o libisl_la-isl_transitive_closure.lo `test -f 'isl_transitive_closure.c' || echo '$(srcdir)/'`isl_transitive_closure.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_transitive_closure.Tpo $(DEPDIR)/libisl_la-isl_transitive_closure.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_transitive_closure.c' object='libisl_la-isl_transitive_closure.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_transitive_closure.lo `test -f 'isl_transitive_closure.c' || echo '$(srcdir)/'`isl_transitive_closure.c
-
-libisl_la-isl_union_map.lo: isl_union_map.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_union_map.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_union_map.Tpo -c -o libisl_la-isl_union_map.lo `test -f 'isl_union_map.c' || echo '$(srcdir)/'`isl_union_map.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_union_map.Tpo $(DEPDIR)/libisl_la-isl_union_map.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_union_map.c' object='libisl_la-isl_union_map.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_union_map.lo `test -f 'isl_union_map.c' || echo '$(srcdir)/'`isl_union_map.c
-
-libisl_la-isl_vec.lo: isl_vec.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_vec.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_vec.Tpo -c -o libisl_la-isl_vec.lo `test -f 'isl_vec.c' || echo '$(srcdir)/'`isl_vec.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_vec.Tpo $(DEPDIR)/libisl_la-isl_vec.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_vec.c' object='libisl_la-isl_vec.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_vec.lo `test -f 'isl_vec.c' || echo '$(srcdir)/'`isl_vec.c
-
-libisl_la-isl_version.lo: isl_version.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_version.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_version.Tpo -c -o libisl_la-isl_version.lo `test -f 'isl_version.c' || echo '$(srcdir)/'`isl_version.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_version.Tpo $(DEPDIR)/libisl_la-isl_version.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_version.c' object='libisl_la-isl_version.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_version.lo `test -f 'isl_version.c' || echo '$(srcdir)/'`isl_version.c
-
-libisl_la-isl_vertices.lo: isl_vertices.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_vertices.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_vertices.Tpo -c -o libisl_la-isl_vertices.lo `test -f 'isl_vertices.c' || echo '$(srcdir)/'`isl_vertices.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_vertices.Tpo $(DEPDIR)/libisl_la-isl_vertices.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_vertices.c' object='libisl_la-isl_vertices.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_vertices.lo `test -f 'isl_vertices.c' || echo '$(srcdir)/'`isl_vertices.c
-
-isl_bound-bound.o: bound.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_bound_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_bound-bound.o -MD -MP -MF $(DEPDIR)/isl_bound-bound.Tpo -c -o isl_bound-bound.o `test -f 'bound.c' || echo '$(srcdir)/'`bound.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_bound-bound.Tpo $(DEPDIR)/isl_bound-bound.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='bound.c' object='isl_bound-bound.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_bound_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_bound-bound.o `test -f 'bound.c' || echo '$(srcdir)/'`bound.c
-
-isl_bound-bound.obj: bound.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_bound_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_bound-bound.obj -MD -MP -MF $(DEPDIR)/isl_bound-bound.Tpo -c -o isl_bound-bound.obj `if test -f 'bound.c'; then $(CYGPATH_W) 'bound.c'; else $(CYGPATH_W) '$(srcdir)/bound.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_bound-bound.Tpo $(DEPDIR)/isl_bound-bound.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='bound.c' object='isl_bound-bound.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_bound_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_bound-bound.obj `if test -f 'bound.c'; then $(CYGPATH_W) 'bound.c'; else $(CYGPATH_W) '$(srcdir)/bound.c'; fi`
-
-isl_cat-cat.o: cat.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_cat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_cat-cat.o -MD -MP -MF $(DEPDIR)/isl_cat-cat.Tpo -c -o isl_cat-cat.o `test -f 'cat.c' || echo '$(srcdir)/'`cat.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_cat-cat.Tpo $(DEPDIR)/isl_cat-cat.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='cat.c' object='isl_cat-cat.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_cat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_cat-cat.o `test -f 'cat.c' || echo '$(srcdir)/'`cat.c
-
-isl_cat-cat.obj: cat.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_cat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_cat-cat.obj -MD -MP -MF $(DEPDIR)/isl_cat-cat.Tpo -c -o isl_cat-cat.obj `if test -f 'cat.c'; then $(CYGPATH_W) 'cat.c'; else $(CYGPATH_W) '$(srcdir)/cat.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_cat-cat.Tpo $(DEPDIR)/isl_cat-cat.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='cat.c' object='isl_cat-cat.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_cat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_cat-cat.obj `if test -f 'cat.c'; then $(CYGPATH_W) 'cat.c'; else $(CYGPATH_W) '$(srcdir)/cat.c'; fi`
-
-isl_closure-closure.o: closure.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_closure_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_closure-closure.o -MD -MP -MF $(DEPDIR)/isl_closure-closure.Tpo -c -o isl_closure-closure.o `test -f 'closure.c' || echo '$(srcdir)/'`closure.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_closure-closure.Tpo $(DEPDIR)/isl_closure-closure.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='closure.c' object='isl_closure-closure.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_closure_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_closure-closure.o `test -f 'closure.c' || echo '$(srcdir)/'`closure.c
-
-isl_closure-closure.obj: closure.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_closure_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_closure-closure.obj -MD -MP -MF $(DEPDIR)/isl_closure-closure.Tpo -c -o isl_closure-closure.obj `if test -f 'closure.c'; then $(CYGPATH_W) 'closure.c'; else $(CYGPATH_W) '$(srcdir)/closure.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_closure-closure.Tpo $(DEPDIR)/isl_closure-closure.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='closure.c' object='isl_closure-closure.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_closure_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_closure-closure.obj `if test -f 'closure.c'; then $(CYGPATH_W) 'closure.c'; else $(CYGPATH_W) '$(srcdir)/closure.c'; fi`
-
-isl_pip-pip.o: pip.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_pip_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_pip-pip.o -MD -MP -MF $(DEPDIR)/isl_pip-pip.Tpo -c -o isl_pip-pip.o `test -f 'pip.c' || echo '$(srcdir)/'`pip.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_pip-pip.Tpo $(DEPDIR)/isl_pip-pip.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='pip.c' object='isl_pip-pip.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_pip_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_pip-pip.o `test -f 'pip.c' || echo '$(srcdir)/'`pip.c
-
-isl_pip-pip.obj: pip.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_pip_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_pip-pip.obj -MD -MP -MF $(DEPDIR)/isl_pip-pip.Tpo -c -o isl_pip-pip.obj `if test -f 'pip.c'; then $(CYGPATH_W) 'pip.c'; else $(CYGPATH_W) '$(srcdir)/pip.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_pip-pip.Tpo $(DEPDIR)/isl_pip-pip.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='pip.c' object='isl_pip-pip.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_pip_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_pip-pip.obj `if test -f 'pip.c'; then $(CYGPATH_W) 'pip.c'; else $(CYGPATH_W) '$(srcdir)/pip.c'; fi`
-
-isl_polyhedron_detect_equalities-polyhedron_detect_equalities.o: polyhedron_detect_equalities.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_detect_equalities_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_polyhedron_detect_equalities-polyhedron_detect_equalities.o -MD -MP -MF $(DEPDIR)/isl_polyhedron_detect_equalities-polyhedron_detect_equalities.Tpo -c -o isl_polyhedron_detect_equalities-polyhedron_detect_equalities.o `test -f 'polyhedron_detect_equalities.c' || echo '$(srcdir)/'`polyhedron_detect_equalities.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_polyhedron_detect_equalities-polyhedron_detect_equalities.Tpo $(DEPDIR)/isl_polyhedron_detect_equalities-polyhedron_detect_equalities.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='polyhedron_detect_equalities.c' object='isl_polyhedron_detect_equalities-polyhedron_detect_equalities.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_detect_equalities_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_polyhedron_detect_equalities-polyhedron_detect_equalities.o `test -f 'polyhedron_detect_equalities.c' || echo '$(srcdir)/'`polyhedron_detect_equalities.c
-
-isl_polyhedron_detect_equalities-polyhedron_detect_equalities.obj: polyhedron_detect_equalities.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_detect_equalities_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_polyhedron_detect_equalities-polyhedron_detect_equalities.obj -MD -MP -MF $(DEPDIR)/isl_polyhedron_detect_equalities-polyhedron_detect_equalities.Tpo -c -o isl_polyhedron_detect_equalities-polyhedron_detect_equalities.obj `if test -f 'polyhedron_detect_equalities.c'; then $(CYGPATH_W) 'polyhedron_detect_equalities.c'; else $(CYGPATH_W) '$(srcdir)/polyhedron_detect_equalities.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_polyhedron_detect_equalities-polyhedron_detect_equalities.Tpo $(DEPDIR)/isl_polyhedron_detect_equalities-polyhedron_detect_equalities.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='polyhedron_detect_equalities.c' object='isl_polyhedron_detect_equalities-polyhedron_detect_equalities.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_detect_equalities_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_polyhedron_detect_equalities-polyhedron_detect_equalities.obj `if test -f 'polyhedron_detect_equalities.c'; then $(CYGPATH_W) 'polyhedron_detect_equalities.c'; else $(CYGPATH_W) '$(srcdir)/polyhedron_detect_equalities.c'; fi`
-
-isl_polyhedron_minimize-polyhedron_minimize.o: polyhedron_minimize.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_minimize_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_polyhedron_minimize-polyhedron_minimize.o -MD -MP -MF $(DEPDIR)/isl_polyhedron_minimize-polyhedron_minimize.Tpo -c -o isl_polyhedron_minimize-polyhedron_minimize.o `test -f 'polyhedron_minimize.c' || echo '$(srcdir)/'`polyhedron_minimize.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_polyhedron_minimize-polyhedron_minimize.Tpo $(DEPDIR)/isl_polyhedron_minimize-polyhedron_minimize.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='polyhedron_minimize.c' object='isl_polyhedron_minimize-polyhedron_minimize.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_minimize_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_polyhedron_minimize-polyhedron_minimize.o `test -f 'polyhedron_minimize.c' || echo '$(srcdir)/'`polyhedron_minimize.c
-
-isl_polyhedron_minimize-polyhedron_minimize.obj: polyhedron_minimize.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_minimize_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_polyhedron_minimize-polyhedron_minimize.obj -MD -MP -MF $(DEPDIR)/isl_polyhedron_minimize-polyhedron_minimize.Tpo -c -o isl_polyhedron_minimize-polyhedron_minimize.obj `if test -f 'polyhedron_minimize.c'; then $(CYGPATH_W) 'polyhedron_minimize.c'; else $(CYGPATH_W) '$(srcdir)/polyhedron_minimize.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_polyhedron_minimize-polyhedron_minimize.Tpo $(DEPDIR)/isl_polyhedron_minimize-polyhedron_minimize.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='polyhedron_minimize.c' object='isl_polyhedron_minimize-polyhedron_minimize.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_minimize_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_polyhedron_minimize-polyhedron_minimize.obj `if test -f 'polyhedron_minimize.c'; then $(CYGPATH_W) 'polyhedron_minimize.c'; else $(CYGPATH_W) '$(srcdir)/polyhedron_minimize.c'; fi`
-
-isl_polyhedron_sample-polyhedron_sample.o: polyhedron_sample.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_sample_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_polyhedron_sample-polyhedron_sample.o -MD -MP -MF $(DEPDIR)/isl_polyhedron_sample-polyhedron_sample.Tpo -c -o isl_polyhedron_sample-polyhedron_sample.o `test -f 'polyhedron_sample.c' || echo '$(srcdir)/'`polyhedron_sample.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_polyhedron_sample-polyhedron_sample.Tpo $(DEPDIR)/isl_polyhedron_sample-polyhedron_sample.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='polyhedron_sample.c' object='isl_polyhedron_sample-polyhedron_sample.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_sample_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_polyhedron_sample-polyhedron_sample.o `test -f 'polyhedron_sample.c' || echo '$(srcdir)/'`polyhedron_sample.c
-
-isl_polyhedron_sample-polyhedron_sample.obj: polyhedron_sample.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_sample_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_polyhedron_sample-polyhedron_sample.obj -MD -MP -MF $(DEPDIR)/isl_polyhedron_sample-polyhedron_sample.Tpo -c -o isl_polyhedron_sample-polyhedron_sample.obj `if test -f 'polyhedron_sample.c'; then $(CYGPATH_W) 'polyhedron_sample.c'; else $(CYGPATH_W) '$(srcdir)/polyhedron_sample.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_polyhedron_sample-polyhedron_sample.Tpo $(DEPDIR)/isl_polyhedron_sample-polyhedron_sample.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='polyhedron_sample.c' object='isl_polyhedron_sample-polyhedron_sample.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_sample_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_polyhedron_sample-polyhedron_sample.obj `if test -f 'polyhedron_sample.c'; then $(CYGPATH_W) 'polyhedron_sample.c'; else $(CYGPATH_W) '$(srcdir)/polyhedron_sample.c'; fi`
-
-isl_polytope_scan-polytope_scan.o: polytope_scan.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polytope_scan_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_polytope_scan-polytope_scan.o -MD -MP -MF $(DEPDIR)/isl_polytope_scan-polytope_scan.Tpo -c -o isl_polytope_scan-polytope_scan.o `test -f 'polytope_scan.c' || echo '$(srcdir)/'`polytope_scan.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_polytope_scan-polytope_scan.Tpo $(DEPDIR)/isl_polytope_scan-polytope_scan.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='polytope_scan.c' object='isl_polytope_scan-polytope_scan.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polytope_scan_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_polytope_scan-polytope_scan.o `test -f 'polytope_scan.c' || echo '$(srcdir)/'`polytope_scan.c
-
-isl_polytope_scan-polytope_scan.obj: polytope_scan.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polytope_scan_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_polytope_scan-polytope_scan.obj -MD -MP -MF $(DEPDIR)/isl_polytope_scan-polytope_scan.Tpo -c -o isl_polytope_scan-polytope_scan.obj `if test -f 'polytope_scan.c'; then $(CYGPATH_W) 'polytope_scan.c'; else $(CYGPATH_W) '$(srcdir)/polytope_scan.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_polytope_scan-polytope_scan.Tpo $(DEPDIR)/isl_polytope_scan-polytope_scan.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='polytope_scan.c' object='isl_polytope_scan-polytope_scan.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polytope_scan_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_polytope_scan-polytope_scan.obj `if test -f 'polytope_scan.c'; then $(CYGPATH_W) 'polytope_scan.c'; else $(CYGPATH_W) '$(srcdir)/polytope_scan.c'; fi`
-
-isl_test-isl_test.o: isl_test.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_test-isl_test.o -MD -MP -MF $(DEPDIR)/isl_test-isl_test.Tpo -c -o isl_test-isl_test.o `test -f 'isl_test.c' || echo '$(srcdir)/'`isl_test.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_test-isl_test.Tpo $(DEPDIR)/isl_test-isl_test.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_test.c' object='isl_test-isl_test.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_test-isl_test.o `test -f 'isl_test.c' || echo '$(srcdir)/'`isl_test.c
-
-isl_test-isl_test.obj: isl_test.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_test-isl_test.obj -MD -MP -MF $(DEPDIR)/isl_test-isl_test.Tpo -c -o isl_test-isl_test.obj `if test -f 'isl_test.c'; then $(CYGPATH_W) 'isl_test.c'; else $(CYGPATH_W) '$(srcdir)/isl_test.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_test-isl_test.Tpo $(DEPDIR)/isl_test-isl_test.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_test.c' object='isl_test-isl_test.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_test-isl_test.obj `if test -f 'isl_test.c'; then $(CYGPATH_W) 'isl_test.c'; else $(CYGPATH_W) '$(srcdir)/isl_test.c'; fi`
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool config.lt
-install-pkgconfigDATA: $(pkgconfig_DATA)
-	@$(NORMAL_INSTALL)
-	test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)"
-	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \
-	done
-
-uninstall-pkgconfigDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files
-install-nodist_pkgincludeHEADERS: $(nodist_pkginclude_HEADERS)
-	@$(NORMAL_INSTALL)
-	test -z "$(pkgincludedir)" || $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)"
-	@list='$(nodist_pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
-	done
-
-uninstall-nodist_pkgincludeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(nodist_pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(pkgincludedir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(pkgincludedir)" && rm -f $$files
-install-pkgincludeHEADERS: $(pkginclude_HEADERS)
-	@$(NORMAL_INSTALL)
-	test -z "$(pkgincludedir)" || $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)"
-	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
-	done
-
-uninstall-pkgincludeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(pkgincludedir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(pkgincludedir)" && rm -f $$files
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) isl_config.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS) isl_config.h.in $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES) isl_config.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS) isl_config.h.in $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-check-TESTS: $(TESTS)
-	@failed=0; all=0; xfail=0; xpass=0; skip=0; \
-	srcdir=$(srcdir); export srcdir; \
-	list=' $(TESTS) '; \
-	$(am__tty_colors); \
-	if test -n "$$list"; then \
-	  for tst in $$list; do \
-	    if test -f ./$$tst; then dir=./; \
-	    elif test -f $$tst; then dir=; \
-	    else dir="$(srcdir)/"; fi; \
-	    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
-	      all=`expr $$all + 1`; \
-	      case " $(XFAIL_TESTS) " in \
-	      *[\ \	]$$tst[\ \	]*) \
-		xpass=`expr $$xpass + 1`; \
-		failed=`expr $$failed + 1`; \
-		col=$$red; res=XPASS; \
-	      ;; \
-	      *) \
-		col=$$grn; res=PASS; \
-	      ;; \
-	      esac; \
-	    elif test $$? -ne 77; then \
-	      all=`expr $$all + 1`; \
-	      case " $(XFAIL_TESTS) " in \
-	      *[\ \	]$$tst[\ \	]*) \
-		xfail=`expr $$xfail + 1`; \
-		col=$$lgn; res=XFAIL; \
-	      ;; \
-	      *) \
-		failed=`expr $$failed + 1`; \
-		col=$$red; res=FAIL; \
-	      ;; \
-	      esac; \
-	    else \
-	      skip=`expr $$skip + 1`; \
-	      col=$$blu; res=SKIP; \
-	    fi; \
-	    echo "$${col}$$res$${std}: $$tst"; \
-	  done; \
-	  if test "$$all" -eq 1; then \
-	    tests="test"; \
-	    All=""; \
-	  else \
-	    tests="tests"; \
-	    All="All "; \
-	  fi; \
-	  if test "$$failed" -eq 0; then \
-	    if test "$$xfail" -eq 0; then \
-	      banner="$$All$$all $$tests passed"; \
-	    else \
-	      if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
-	      banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
-	    fi; \
-	  else \
-	    if test "$$xpass" -eq 0; then \
-	      banner="$$failed of $$all $$tests failed"; \
-	    else \
-	      if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
-	      banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
-	    fi; \
-	  fi; \
-	  dashes="$$banner"; \
-	  skipped=""; \
-	  if test "$$skip" -ne 0; then \
-	    if test "$$skip" -eq 1; then \
-	      skipped="($$skip test was not run)"; \
-	    else \
-	      skipped="($$skip tests were not run)"; \
-	    fi; \
-	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
-	      dashes="$$skipped"; \
-	  fi; \
-	  report=""; \
-	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
-	    report="Please report to $(PACKAGE_BUGREPORT)"; \
-	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
-	      dashes="$$report"; \
-	  fi; \
-	  dashes=`echo "$$dashes" | sed s/./=/g`; \
-	  if test "$$failed" -eq 0; then \
-	    echo "$$grn$$dashes"; \
-	  else \
-	    echo "$$red$$dashes"; \
-	  fi; \
-	  echo "$$banner"; \
-	  test -z "$$skipped" || echo "$$skipped"; \
-	  test -z "$$report" || echo "$$report"; \
-	  echo "$$dashes$$std"; \
-	  test "$$failed" -eq 0; \
-	else :; fi
-
-distdir: $(DISTFILES)
-	$(am__remove_distdir)
-	test -d "$(distdir)" || mkdir "$(distdir)"
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test -d "$(distdir)/$$subdir" \
-	    || $(MKDIR_P) "$(distdir)/$$subdir" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-	    $(am__relativize); \
-	    new_distdir=$$reldir; \
-	    dir1=$$subdir; dir2="$(top_distdir)"; \
-	    $(am__relativize); \
-	    new_top_distdir=$$reldir; \
-	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-	    ($(am__cd) $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$new_top_distdir" \
-	        distdir="$$new_distdir" \
-		am__remove_distdir=: \
-		am__skip_length_check=: \
-		am__skip_mode_fix=: \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-	$(MAKE) $(AM_MAKEFLAGS) \
-	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
-	  dist-hook
-	-test -n "$(am__skip_mode_fix)" \
-	|| find "$(distdir)" -type d ! -perm -755 \
-		-exec chmod u+rwx,go+rx {} \; -o \
-	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
-	|| chmod -R a+r "$(distdir)"
-dist-gzip: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__remove_distdir)
-
-dist-bzip2: distdir
-	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
-	$(am__remove_distdir)
-
-dist-lzma: distdir
-	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
-	$(am__remove_distdir)
-
-dist-xz: distdir
-	tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
-	$(am__remove_distdir)
-
-dist-tarZ: distdir
-	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
-	$(am__remove_distdir)
-
-dist-shar: distdir
-	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
-	$(am__remove_distdir)
-
-dist-zip: distdir
-	-rm -f $(distdir).zip
-	zip -rq $(distdir).zip $(distdir)
-	$(am__remove_distdir)
-
-dist dist-all: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__remove_distdir)
-
-# This target untars the dist file and tries a VPATH configuration.  Then
-# it guarantees that the distribution is self-contained by making another
-# tarfile.
-distcheck: dist
-	case '$(DIST_ARCHIVES)' in \
-	*.tar.gz*) \
-	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
-	*.tar.bz2*) \
-	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
-	*.tar.lzma*) \
-	  lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
-	*.tar.xz*) \
-	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
-	*.tar.Z*) \
-	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
-	*.shar.gz*) \
-	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
-	*.zip*) \
-	  unzip $(distdir).zip ;;\
-	esac
-	chmod -R a-w $(distdir); chmod a+w $(distdir)
-	mkdir $(distdir)/_build
-	mkdir $(distdir)/_inst
-	chmod a-w $(distdir)
-	test -d $(distdir)/_build || exit 0; \
-	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
-	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
-	  && am__cwd=`pwd` \
-	  && $(am__cd) $(distdir)/_build \
-	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
-	    $(DISTCHECK_CONFIGURE_FLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
-	  && $(MAKE) $(AM_MAKEFLAGS) check \
-	  && $(MAKE) $(AM_MAKEFLAGS) install \
-	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
-	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
-	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
-	        distuninstallcheck \
-	  && chmod -R a-w "$$dc_install_base" \
-	  && ({ \
-	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
-	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
-	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
-	  && rm -rf "$$dc_destdir" \
-	  && $(MAKE) $(AM_MAKEFLAGS) dist \
-	  && rm -rf $(DIST_ARCHIVES) \
-	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
-	  && cd "$$am__cwd" \
-	  || exit 1
-	$(am__remove_distdir)
-	@(echo "$(distdir) archives ready for distribution: "; \
-	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
-	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
-distuninstallcheck:
-	@$(am__cd) '$(distuninstallcheck_dir)' \
-	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
-	   || { echo "ERROR: files left after uninstall:" ; \
-	        if test -n "$(DESTDIR)"; then \
-	          echo "  (check DESTDIR support)"; \
-	        fi ; \
-	        $(distuninstallcheck_listfiles) ; \
-	        exit 1; } >&2
-distcleancheck: distclean
-	@if test '$(srcdir)' = . ; then \
-	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
-	  exit 1 ; \
-	fi
-	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
-	  || { echo "ERROR: files left in build directory after distclean:" ; \
-	       $(distcleancheck_listfiles) ; \
-	       exit 1; } >&2
-check-am: all-am
-	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
-check: check-recursive
-all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) $(HEADERS) \
-		isl_config.h
-installdirs: installdirs-recursive
-installdirs-am:
-	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(pkgincludedir)" "$(DESTDIR)$(pkgincludedir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
-	clean-noinstPROGRAMS mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-hdr distclean-libtool distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am: install-data-local install-nodist_pkgincludeHEADERS \
-	install-pkgconfigDATA install-pkgincludeHEADERS
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am: install-libLTLIBRARIES
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf $(top_srcdir)/autom4te.cache
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-libLTLIBRARIES \
-	uninstall-nodist_pkgincludeHEADERS uninstall-pkgconfigDATA \
-	uninstall-pkgincludeHEADERS
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check-am \
-	ctags-recursive install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-	all all-am am--refresh check check-TESTS check-am clean \
-	clean-generic clean-libLTLIBRARIES clean-libtool \
-	clean-noinstPROGRAMS ctags ctags-recursive dist dist-all \
-	dist-bzip2 dist-gzip dist-hook dist-lzma dist-shar dist-tarZ \
-	dist-xz dist-zip distcheck distclean distclean-compile \
-	distclean-generic distclean-hdr distclean-libtool \
-	distclean-tags distcleancheck distdir distuninstallcheck dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-data-local install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am \
-	install-libLTLIBRARIES install-man \
-	install-nodist_pkgincludeHEADERS install-pdf install-pdf-am \
-	install-pkgconfigDATA install-pkgincludeHEADERS install-ps \
-	install-ps-am install-strip installcheck installcheck-am \
-	installdirs installdirs-am maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags tags-recursive uninstall uninstall-am \
-	uninstall-libLTLIBRARIES uninstall-nodist_pkgincludeHEADERS \
-	uninstall-pkgconfigDATA uninstall-pkgincludeHEADERS
-
-
-dist-hook:
-	echo @GIT_HEAD_VERSION@ > $(distdir)/GIT_HEAD_ID
-	(cd doc; make manual.pdf)
-	cp doc/manual.pdf $(distdir)/doc/
-
-gitversion.h: @GIT_HEAD@
-	$(AM_V_GEN)echo '#define GIT_HEAD_ID "'@GIT_HEAD_VERSION@'"' > $@
-
-install-data-local: $(srcdir)/isl.py
-	@libisl=`sed -ne "/^library_names=/{s/.*='//;s/'$$//;s/ .*//;p}" \
-		 $(builddir)/libisl.la`; \
-	case $$libisl in \
-	'') echo Cannot find isl library name. GDB bindings not installed.;; \
-	*) echo $(INSTALL_DATA) $(srcdir)/isl.py \
-		$(DESTDIR)$(libdir)/$$libisl-gdb.py; \
-	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"; \
-	$(INSTALL_DATA) $(srcdir)/isl.py $(DESTDIR)$(libdir)/$$libisl-gdb.py; esac
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/cloog-0.16.3/isl/aclocal.m4 b/cloog-0.16.3/isl/aclocal.m4
deleted file mode 100644
index acf1a0c..0000000
--- a/cloog-0.16.3/isl/aclocal.m4
+++ /dev/null
@@ -1,995 +0,0 @@
-# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-m4_ifndef([AC_AUTOCONF_VERSION],
-  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],,
-[m4_warning([this file was generated for autoconf 2.65.
-You have another version of autoconf.  It may work, but is not guaranteed to.
-If you have problems, you may need to regenerate the build system entirely.
-To do so, use the procedure documented by the package, typically `autoreconf'.])])
-
-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_AUTOMAKE_VERSION(VERSION)
-# ----------------------------
-# Automake X.Y traces this macro to ensure aclocal.m4 has been
-# generated from the m4 files accompanying Automake X.Y.
-# (This private macro should not be called outside this file.)
-AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.11'
-dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
-dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.11.1], [],
-      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
-])
-
-# _AM_AUTOCONF_VERSION(VERSION)
-# -----------------------------
-# aclocal traces this macro to find the Autoconf version.
-# This is a private macro too.  Using m4_define simplifies
-# the logic in aclocal, which can simply ignore this definition.
-m4_define([_AM_AUTOCONF_VERSION], [])
-
-# AM_SET_CURRENT_AUTOMAKE_VERSION
-# -------------------------------
-# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
-# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
-AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.1])dnl
-m4_ifndef([AC_AUTOCONF_VERSION],
-  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
-
-# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
-# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
-#
-# Of course, Automake must honor this variable whenever it calls a
-# tool from the auxiliary directory.  The problem is that $srcdir (and
-# therefore $ac_aux_dir as well) can be either absolute or relative,
-# depending on how configure is run.  This is pretty annoying, since
-# it makes $ac_aux_dir quite unusable in subdirectories: in the top
-# source directory, any form will work fine, but in subdirectories a
-# relative path needs to be adjusted first.
-#
-# $ac_aux_dir/missing
-#    fails when called from a subdirectory if $ac_aux_dir is relative
-# $top_srcdir/$ac_aux_dir/missing
-#    fails if $ac_aux_dir is absolute,
-#    fails when called from a subdirectory in a VPATH build with
-#          a relative $ac_aux_dir
-#
-# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
-# are both prefixed by $srcdir.  In an in-source build this is usually
-# harmless because $srcdir is `.', but things will broke when you
-# start a VPATH build or use an absolute $srcdir.
-#
-# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
-# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
-#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
-# and then we would define $MISSING as
-#   MISSING="\${SHELL} $am_aux_dir/missing"
-# This will work as long as MISSING is not called from configure, because
-# unfortunately $(top_srcdir) has no meaning in configure.
-# However there are other variables, like CC, which are often used in
-# configure, and could therefore not use this "fixed" $ac_aux_dir.
-#
-# Another solution, used here, is to always expand $ac_aux_dir to an
-# absolute PATH.  The drawback is that using absolute paths prevent a
-# configured tree to be moved without reconfiguration.
-
-AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-])
-
-# AM_CONDITIONAL                                            -*- Autoconf -*-
-
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 9
-
-# AM_CONDITIONAL(NAME, SHELL-CONDITION)
-# -------------------------------------
-# Define a conditional.
-AC_DEFUN([AM_CONDITIONAL],
-[AC_PREREQ(2.52)dnl
- ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
-	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
-AC_SUBST([$1_TRUE])dnl
-AC_SUBST([$1_FALSE])dnl
-_AM_SUBST_NOTMAKE([$1_TRUE])dnl
-_AM_SUBST_NOTMAKE([$1_FALSE])dnl
-m4_define([_AM_COND_VALUE_$1], [$2])dnl
-if $2; then
-  $1_TRUE=
-  $1_FALSE='#'
-else
-  $1_TRUE='#'
-  $1_FALSE=
-fi
-AC_CONFIG_COMMANDS_PRE(
-[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
-  AC_MSG_ERROR([[conditional "$1" was never defined.
-Usually this means the macro was only invoked conditionally.]])
-fi])])
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 10
-
-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
-# written in clear, in which case automake, when reading aclocal.m4,
-# will think it sees a *use*, and therefore will trigger all it's
-# C support machinery.  Also note that it means that autoscan, seeing
-# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
-
-
-# _AM_DEPENDENCIES(NAME)
-# ----------------------
-# See how the compiler implements dependency checking.
-# NAME is "CC", "CXX", "GCJ", or "OBJC".
-# We try a few techniques and use that to set a single cache variable.
-#
-# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
-# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
-# dependency, and given that the user is not expected to run this macro,
-# just rely on AC_PROG_CC.
-AC_DEFUN([_AM_DEPENDENCIES],
-[AC_REQUIRE([AM_SET_DEPDIR])dnl
-AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
-AC_REQUIRE([AM_MAKE_INCLUDE])dnl
-AC_REQUIRE([AM_DEP_TRACK])dnl
-
-ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
-       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
-       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
-       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
-       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
-                   [depcc="$$1"   am_compiler_list=])
-
-AC_CACHE_CHECK([dependency style of $depcc],
-               [am_cv_$1_dependencies_compiler_type],
-[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_$1_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
-  fi
-  am__universal=false
-  m4_case([$1], [CC],
-    [case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac],
-    [CXX],
-    [case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac])
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_$1_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_$1_dependencies_compiler_type=none
-fi
-])
-AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
-AM_CONDITIONAL([am__fastdep$1], [
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
-])
-
-
-# AM_SET_DEPDIR
-# -------------
-# Choose a directory name for dependency files.
-# This macro is AC_REQUIREd in _AM_DEPENDENCIES
-AC_DEFUN([AM_SET_DEPDIR],
-[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
-])
-
-
-# AM_DEP_TRACK
-# ------------
-AC_DEFUN([AM_DEP_TRACK],
-[AC_ARG_ENABLE(dependency-tracking,
-[  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors])
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-fi
-AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
-AC_SUBST([AMDEPBACKSLASH])dnl
-_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
-])
-
-# Generate code to set up dependency tracking.              -*- Autoconf -*-
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-#serial 5
-
-# _AM_OUTPUT_DEPENDENCY_COMMANDS
-# ------------------------------
-AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
-[{
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
-  # are listed without --file.  Let's play safe and only enable the eval
-  # if we detect the quoting.
-  case $CONFIG_FILES in
-  *\'*) eval set x "$CONFIG_FILES" ;;
-  *)   set x $CONFIG_FILES ;;
-  esac
-  shift
-  for mf
-  do
-    # Strip MF so we end up with the name of the file.
-    mf=`echo "$mf" | sed -e 's/:.*$//'`
-    # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
-    # some people rename them; so instead we look at the file content.
-    # Grep'ing the first line is not enough: some people post-process
-    # each Makefile.in and add a new line on top of each file to say so.
-    # Grep'ing the whole file is not good either: AIX grep has a line
-    # limit of 2048, but all sed's we know have understand at least 4000.
-    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-      dirpart=`AS_DIRNAME("$mf")`
-    else
-      continue
-    fi
-    # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
-    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-    test -z "$DEPDIR" && continue
-    am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
-    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
-    # Find all dependency output files, they are included files with
-    # $(DEPDIR) in their names.  We invoke sed twice because it is the
-    # simplest approach to changing $(DEPDIR) to its actual value in the
-    # expansion.
-    for file in `sed -n "
-      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-      # Make sure the directory exists.
-      test -f "$dirpart/$file" && continue
-      fdir=`AS_DIRNAME(["$file"])`
-      AS_MKDIR_P([$dirpart/$fdir])
-      # echo "creating $dirpart/$file"
-      echo '# dummy' > "$dirpart/$file"
-    done
-  done
-}
-])# _AM_OUTPUT_DEPENDENCY_COMMANDS
-
-
-# AM_OUTPUT_DEPENDENCY_COMMANDS
-# -----------------------------
-# This macro should only be invoked once -- use via AC_REQUIRE.
-#
-# This code is only required when automatic dependency tracking
-# is enabled.  FIXME.  This creates each `.P' file that we will
-# need in order to bootstrap the dependency handling code.
-AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
-[AC_CONFIG_COMMANDS([depfiles],
-     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
-     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
-])
-
-# Do all the work for Automake.                             -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 16
-
-# This macro actually does too much.  Some checks are only needed if
-# your package does certain things.  But this isn't really a big deal.
-
-# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
-# AM_INIT_AUTOMAKE([OPTIONS])
-# -----------------------------------------------
-# The call with PACKAGE and VERSION arguments is the old style
-# call (pre autoconf-2.50), which is being phased out.  PACKAGE
-# and VERSION should now be passed to AC_INIT and removed from
-# the call to AM_INIT_AUTOMAKE.
-# We support both call styles for the transition.  After
-# the next Automake release, Autoconf can make the AC_INIT
-# arguments mandatory, and then we can depend on a new Autoconf
-# release and drop the old call support.
-AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.62])dnl
-dnl Autoconf wants to disallow AM_ names.  We explicitly allow
-dnl the ones we care about.
-m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
-AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
-AC_REQUIRE([AC_PROG_INSTALL])dnl
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-AC_SUBST([CYGPATH_W])
-
-# Define the identity of the package.
-dnl Distinguish between old-style and new-style calls.
-m4_ifval([$2],
-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
- AC_SUBST([PACKAGE], [$1])dnl
- AC_SUBST([VERSION], [$2])],
-[_AM_SET_OPTIONS([$1])dnl
-dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
-m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
-  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
-
-_AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
-
-# Some tools Automake needs.
-AC_REQUIRE([AM_SANITY_CHECK])dnl
-AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
-AM_MISSING_PROG(AUTOCONF, autoconf)
-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
-AM_MISSING_PROG(AUTOHEADER, autoheader)
-AM_MISSING_PROG(MAKEINFO, makeinfo)
-AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
-AC_REQUIRE([AM_PROG_MKDIR_P])dnl
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([AC_PROG_MAKE_SET])dnl
-AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
-	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
-			     [_AM_PROG_TAR([v7])])])
-_AM_IF_OPTION([no-dependencies],,
-[AC_PROVIDE_IFELSE([AC_PROG_CC],
-		  [_AM_DEPENDENCIES(CC)],
-		  [define([AC_PROG_CC],
-			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_CXX],
-		  [_AM_DEPENDENCIES(CXX)],
-		  [define([AC_PROG_CXX],
-			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_OBJC],
-		  [_AM_DEPENDENCIES(OBJC)],
-		  [define([AC_PROG_OBJC],
-			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
-])
-_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
-dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
-dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
-dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
-AC_CONFIG_COMMANDS_PRE(dnl
-[m4_provide_if([_AM_COMPILER_EXEEXT],
-  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
-])
-
-dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
-dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
-dnl mangled by Autoconf and run in a shell conditional statement.
-m4_define([_AC_COMPILER_EXEEXT],
-m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
-
-
-# When config.status generates a header, we must update the stamp-h file.
-# This file resides in the same directory as the config header
-# that is generated.  The stamp files are numbered to have different names.
-
-# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
-# loop where config.status creates the headers, so we can generate
-# our stamp files there.
-AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
-[# Compute $1's index in $config_headers.
-_am_arg=$1
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $_am_arg | $_am_arg:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
-
-# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_INSTALL_SH
-# ------------------
-# Define $install_sh.
-AC_DEFUN([AM_PROG_INSTALL_SH],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-if test x"${install_sh}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
-  *)
-    install_sh="\${SHELL} $am_aux_dir/install-sh"
-  esac
-fi
-AC_SUBST(install_sh)])
-
-# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# Check whether the underlying file-system supports filenames
-# with a leading dot.  For instance MS-DOS doesn't.
-AC_DEFUN([AM_SET_LEADING_DOT],
-[rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
-else
-  am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-AC_SUBST([am__leading_dot])])
-
-# Check to see how 'make' treats includes.	            -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 4
-
-# AM_MAKE_INCLUDE()
-# -----------------
-# Check to see how make treats includes.
-AC_DEFUN([AM_MAKE_INCLUDE],
-[am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-	@echo this is the am__doit target
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-AC_MSG_CHECKING([for style of include used by $am_make])
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
-  am__include=include
-  am__quote=
-  _am_result=GNU
-  ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   case `$am_make -s -f confmf 2> /dev/null` in #(
-   *the\ am__doit\ target*)
-     am__include=.include
-     am__quote="\""
-     _am_result=BSD
-     ;;
-   esac
-fi
-AC_SUBST([am__include])
-AC_SUBST([am__quote])
-AC_MSG_RESULT([$_am_result])
-rm -f confinc confmf
-])
-
-# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
-
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 6
-
-# AM_MISSING_PROG(NAME, PROGRAM)
-# ------------------------------
-AC_DEFUN([AM_MISSING_PROG],
-[AC_REQUIRE([AM_MISSING_HAS_RUN])
-$1=${$1-"${am_missing_run}$2"}
-AC_SUBST($1)])
-
-
-# AM_MISSING_HAS_RUN
-# ------------------
-# Define MISSING if not defined so far and test if it supports --run.
-# If it does, set am_missing_run to use it, otherwise, to nothing.
-AC_DEFUN([AM_MISSING_HAS_RUN],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([missing])dnl
-if test x"${MISSING+set}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
-  *)
-    MISSING="\${SHELL} $am_aux_dir/missing" ;;
-  esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  AC_MSG_WARN([`missing' script is too old or missing])
-fi
-])
-
-# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_MKDIR_P
-# ---------------
-# Check for `mkdir -p'.
-AC_DEFUN([AM_PROG_MKDIR_P],
-[AC_PREREQ([2.60])dnl
-AC_REQUIRE([AC_PROG_MKDIR_P])dnl
-dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
-dnl while keeping a definition of mkdir_p for backward compatibility.
-dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
-dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
-dnl Makefile.ins that do not define MKDIR_P, so we do our own
-dnl adjustment using top_builddir (which is defined more often than
-dnl MKDIR_P).
-AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
-case $mkdir_p in
-  [[\\/$]]* | ?:[[\\/]]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-])
-
-# Helper functions for option handling.                     -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 4
-
-# _AM_MANGLE_OPTION(NAME)
-# -----------------------
-AC_DEFUN([_AM_MANGLE_OPTION],
-[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
-
-# _AM_SET_OPTION(NAME)
-# ------------------------------
-# Set option NAME.  Presently that only means defining a flag for this option.
-AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
-
-# _AM_SET_OPTIONS(OPTIONS)
-# ----------------------------------
-# OPTIONS is a space-separated list of Automake options.
-AC_DEFUN([_AM_SET_OPTIONS],
-[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
-
-# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
-# -------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-AC_DEFUN([_AM_IF_OPTION],
-[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-
-# Check to make sure that the build environment is sane.    -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# AM_SANITY_CHECK
-# ---------------
-AC_DEFUN([AM_SANITY_CHECK],
-[AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name.  Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
-  *[[\\\"\#\$\&\'\`$am_lf]]*)
-    AC_MSG_ERROR([unsafe absolute working directory name]);;
-esac
-case $srcdir in
-  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
-    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$[*]" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$[*]" != "X $srcdir/configure conftest.file" \
-      && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
-alias in your environment])
-   fi
-
-   test "$[2]" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   AC_MSG_ERROR([newly created file is older than distributed files!
-Check your system clock])
-fi
-AC_MSG_RESULT(yes)])
-
-# Copyright (C) 2009  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_SILENT_RULES([DEFAULT])
-# --------------------------
-# Enable less verbose build rules; with the default set to DEFAULT
-# (`yes' being less verbose, `no' or empty being verbose).
-AC_DEFUN([AM_SILENT_RULES],
-[AC_ARG_ENABLE([silent-rules],
-[  --enable-silent-rules          less verbose build output (undo: `make V=1')
-  --disable-silent-rules         verbose build output (undo: `make V=0')])
-case $enable_silent_rules in
-yes) AM_DEFAULT_VERBOSITY=0;;
-no)  AM_DEFAULT_VERBOSITY=1;;
-*)   AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
-esac
-AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
-AM_BACKSLASH='\'
-AC_SUBST([AM_BACKSLASH])dnl
-_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
-])
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_INSTALL_STRIP
-# ---------------------
-# One issue with vendor `install' (even GNU) is that you can't
-# specify the program used to strip binaries.  This is especially
-# annoying in cross-compiling environments, where the build's strip
-# is unlikely to handle the host's binaries.
-# Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in `make install-strip', and initialize
-# STRIPPROG with the value of the STRIP variable (set by the user).
-AC_DEFUN([AM_PROG_INSTALL_STRIP],
-[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
-if test "$cross_compiling" != no; then
-  AC_CHECK_TOOL([STRIP], [strip], :)
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-AC_SUBST([INSTALL_STRIP_PROGRAM])])
-
-# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# _AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
-# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
-# This macro is traced by Automake.
-AC_DEFUN([_AM_SUBST_NOTMAKE])
-
-# AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
-# Public sister of _AM_SUBST_NOTMAKE.
-AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
-
-# Check how to create a tarball.                            -*- Autoconf -*-
-
-# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# _AM_PROG_TAR(FORMAT)
-# --------------------
-# Check how to create a tarball in format FORMAT.
-# FORMAT should be one of `v7', `ustar', or `pax'.
-#
-# Substitute a variable $(am__tar) that is a command
-# writing to stdout a FORMAT-tarball containing the directory
-# $tardir.
-#     tardir=directory && $(am__tar) > result.tar
-#
-# Substitute a variable $(am__untar) that extract such
-# a tarball read from stdin.
-#     $(am__untar) < result.tar
-AC_DEFUN([_AM_PROG_TAR],
-[# Always define AMTAR for backward compatibility.
-AM_MISSING_PROG([AMTAR], [tar])
-m4_if([$1], [v7],
-     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
-     [m4_case([$1], [ustar],, [pax],,
-              [m4_fatal([Unknown tar format])])
-AC_MSG_CHECKING([how to create a $1 tar archive])
-# Loop over all known methods to create a tar archive until one works.
-_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
-_am_tools=${am_cv_prog_tar_$1-$_am_tools}
-# Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of `-'.
-for _am_tool in $_am_tools
-do
-  case $_am_tool in
-  gnutar)
-    for _am_tar in tar gnutar gtar;
-    do
-      AM_RUN_LOG([$_am_tar --version]) && break
-    done
-    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
-    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
-    am__untar="$_am_tar -xf -"
-    ;;
-  plaintar)
-    # Must skip GNU tar: if it does not support --format= it doesn't create
-    # ustar tarball either.
-    (tar --version) >/dev/null 2>&1 && continue
-    am__tar='tar chf - "$$tardir"'
-    am__tar_='tar chf - "$tardir"'
-    am__untar='tar xf -'
-    ;;
-  pax)
-    am__tar='pax -L -x $1 -w "$$tardir"'
-    am__tar_='pax -L -x $1 -w "$tardir"'
-    am__untar='pax -r'
-    ;;
-  cpio)
-    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
-    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
-    am__untar='cpio -i -H $1 -d'
-    ;;
-  none)
-    am__tar=false
-    am__tar_=false
-    am__untar=false
-    ;;
-  esac
-
-  # If the value was cached, stop now.  We just wanted to have am__tar
-  # and am__untar set.
-  test -n "${am_cv_prog_tar_$1}" && break
-
-  # tar/untar a dummy directory, and stop if the command works
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  echo GrepMe > conftest.dir/file
-  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
-  rm -rf conftest.dir
-  if test -s conftest.tar; then
-    AM_RUN_LOG([$am__untar <conftest.tar])
-    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
-  fi
-done
-rm -rf conftest.dir
-
-AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
-AC_MSG_RESULT([$am_cv_prog_tar_$1])])
-AC_SUBST([am__tar])
-AC_SUBST([am__untar])
-]) # _AM_PROG_TAR
-
-m4_include([m4/ax_c___attribute__.m4])
-m4_include([m4/ax_cc_maxopt.m4])
-m4_include([m4/ax_check_compiler_flags.m4])
-m4_include([m4/ax_compiler_vendor.m4])
-m4_include([m4/ax_create_pkgconfig_info.m4])
-m4_include([m4/ax_create_stdint_h.m4])
-m4_include([m4/ax_detect_git_head.m4])
-m4_include([m4/ax_gcc_archflag.m4])
-m4_include([m4/ax_gcc_warn_unused_result.m4])
-m4_include([m4/ax_gcc_x86_cpuid.m4])
-m4_include([m4/ax_set_warning_flags.m4])
-m4_include([m4/ax_submodule.m4])
-m4_include([m4/libtool.m4])
-m4_include([m4/ltoptions.m4])
-m4_include([m4/ltsugar.m4])
-m4_include([m4/ltversion.m4])
-m4_include([m4/lt~obsolete.m4])
diff --git a/cloog-0.16.3/isl/basis_reduction_tab.c b/cloog-0.16.3/isl/basis_reduction_tab.c
deleted file mode 100644
index af54569..0000000
--- a/cloog-0.16.3/isl/basis_reduction_tab.c
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <assert.h>
-#include <isl_map_private.h>
-#include <isl/seq.h>
-#include "isl_tab.h"
-
-struct tab_lp {
-	struct isl_ctx  *ctx;
-	struct isl_vec  *row;
-	struct isl_tab  *tab;
-	struct isl_tab_undo	**stack;
-	isl_int		*obj;
-	isl_int		 opt;
-	isl_int		 opt_denom;
-	isl_int		 tmp;
-	isl_int		 tmp2;
-	int	         neq;
-	unsigned	 dim;
-	/* number of constraints in initial product tableau */
-	int		 con_offset;
-	/* objective function has fixed or no integer value */
-	int		 is_fixed;
-};
-
-static struct tab_lp *init_lp(struct isl_tab *tab);
-static void set_lp_obj(struct tab_lp *lp, isl_int *row, int dim);
-static int solve_lp(struct tab_lp *lp);
-static void get_obj_val(struct tab_lp* lp, mpq_t *F);
-static void delete_lp(struct tab_lp *lp);
-static int add_lp_row(struct tab_lp *lp, isl_int *row, int dim);
-static void get_alpha(struct tab_lp* lp, int row, mpq_t *alpha);
-static int del_lp_row(struct tab_lp *lp) WARN_UNUSED;
-static int cut_lp_to_hyperplane(struct tab_lp *lp, isl_int *row);
-
-#define GBR_LP			    	    struct tab_lp
-#define GBR_type		    	    mpq_t
-#define GBR_init(v)		    	    mpq_init(v)
-#define GBR_clear(v)		    	    mpq_clear(v)
-#define GBR_set(a,b)			    mpq_set(a,b)
-#define GBR_set_ui(a,b)			    mpq_set_ui(a,b,1)
-#define GBR_mul(a,b,c)			    mpq_mul(a,b,c)
-#define GBR_lt(a,b)			    (mpq_cmp(a,b) < 0)
-#define GBR_is_zero(a)			    (mpq_sgn(a) == 0)
-#define GBR_floor(a,b)			    mpz_fdiv_q(a,mpq_numref(b),mpq_denref(b))
-#define GBR_ceil(a,b)			    mpz_cdiv_q(a,mpq_numref(b),mpq_denref(b))
-#define GBR_lp_init(P)		    	    init_lp(P)
-#define GBR_lp_set_obj(lp, obj, dim)	    set_lp_obj(lp, obj, dim)
-#define GBR_lp_solve(lp)		    solve_lp(lp)
-#define GBR_lp_get_obj_val(lp, F)	    get_obj_val(lp, F)
-#define GBR_lp_delete(lp)		    delete_lp(lp)
-#define GBR_lp_next_row(lp)		    lp->neq
-#define GBR_lp_add_row(lp, row, dim)	    add_lp_row(lp, row, dim)
-#define GBR_lp_get_alpha(lp, row, alpha)    get_alpha(lp, row, alpha)
-#define GBR_lp_del_row(lp)		    del_lp_row(lp)
-#define GBR_lp_is_fixed(lp)		    (lp)->is_fixed
-#define GBR_lp_cut(lp, obj)	    	    cut_lp_to_hyperplane(lp, obj)
-#include "basis_reduction_templ.c"
-
-/* Set up a tableau for the Cartesian product of bset with itself.
- * This could be optimized by first setting up a tableau for bset
- * and then performing the Cartesian product on the tableau.
- */
-static struct isl_tab *gbr_tab(struct isl_tab *tab, struct isl_vec *row)
-{
-	unsigned dim;
-	struct isl_tab *prod;
-
-	if (!tab || !row)
-		return NULL;
-
-	dim = tab->n_var;
-	prod = isl_tab_product(tab, tab);
-	if (isl_tab_extend_cons(prod, 3 * dim + 1) < 0) {
-		isl_tab_free(prod);
-		return NULL;
-	}
-	return prod;
-}
-
-static struct tab_lp *init_lp(struct isl_tab *tab)
-{
-	struct tab_lp *lp = NULL;
-
-	if (!tab)
-		return NULL;
-
-	lp = isl_calloc_type(tab->mat->ctx, struct tab_lp);
-	if (!lp)
-		return NULL;
-
-	isl_int_init(lp->opt);
-	isl_int_init(lp->opt_denom);
-	isl_int_init(lp->tmp);
-	isl_int_init(lp->tmp2);
-
-	lp->dim = tab->n_var;
-
-	lp->ctx = tab->mat->ctx;
-	isl_ctx_ref(lp->ctx);
-
-	lp->stack = isl_alloc_array(lp->ctx, struct isl_tab_undo *, lp->dim);
-
-	lp->row = isl_vec_alloc(lp->ctx, 1 + 2 * lp->dim);
-	if (!lp->row)
-		goto error;
-	lp->tab = gbr_tab(tab, lp->row);
-	if (!lp->tab)
-		goto error;
-	lp->con_offset = lp->tab->n_con;
-	lp->obj = NULL;
-	lp->neq = 0;
-
-	return lp;
-error:
-	delete_lp(lp);
-	return NULL;
-}
-
-static void set_lp_obj(struct tab_lp *lp, isl_int *row, int dim)
-{
-	lp->obj = row;
-}
-
-static int solve_lp(struct tab_lp *lp)
-{
-	enum isl_lp_result res;
-	unsigned flags = 0;
-
-	lp->is_fixed = 0;
-
-	isl_int_set_si(lp->row->el[0], 0);
-	isl_seq_cpy(lp->row->el + 1, lp->obj, lp->dim);
-	isl_seq_neg(lp->row->el + 1 + lp->dim, lp->obj, lp->dim);
-	if (lp->neq)
-		flags = ISL_TAB_SAVE_DUAL;
-	res = isl_tab_min(lp->tab, lp->row->el, lp->ctx->one,
-			  &lp->opt, &lp->opt_denom, flags);
-	isl_int_mul_ui(lp->opt_denom, lp->opt_denom, 2);
-	if (isl_int_abs_lt(lp->opt, lp->opt_denom)) {
-		struct isl_vec *sample = isl_tab_get_sample_value(lp->tab);
-		if (!sample)
-			return -1;
-		isl_seq_inner_product(lp->obj, sample->el + 1, lp->dim, &lp->tmp);
-		isl_seq_inner_product(lp->obj, sample->el + 1 + lp->dim, lp->dim, &lp->tmp2);
-		isl_int_cdiv_q(lp->tmp, lp->tmp, sample->el[0]);
-		isl_int_fdiv_q(lp->tmp2, lp->tmp2, sample->el[0]);
-		if (isl_int_ge(lp->tmp, lp->tmp2))
-			lp->is_fixed = 1;
-		isl_vec_free(sample);
-	}
-	isl_int_divexact_ui(lp->opt_denom, lp->opt_denom, 2);
-	if (res != isl_lp_ok)
-		return -1;
-	return 0;
-}
-
-/* The current objective function has a fixed (or no) integer value.
- * Cut the tableau to the hyperplane that fixes this value in
- * both halves of the tableau.
- * Return 1 if the resulting tableau is empty.
- */
-static int cut_lp_to_hyperplane(struct tab_lp *lp, isl_int *row)
-{
-	enum isl_lp_result res;
-
-	isl_int_set_si(lp->row->el[0], 0);
-	isl_seq_cpy(lp->row->el + 1, row, lp->dim);
-	isl_seq_clr(lp->row->el + 1 + lp->dim, lp->dim);
-	res = isl_tab_min(lp->tab, lp->row->el, lp->ctx->one,
-			  &lp->tmp, NULL, 0);
-	if (res != isl_lp_ok)
-		return -1;
-
-	isl_int_neg(lp->row->el[0], lp->tmp);
-	if (isl_tab_add_eq(lp->tab, lp->row->el) < 0)
-		return -1;
-
-	isl_seq_cpy(lp->row->el + 1 + lp->dim, row, lp->dim);
-	isl_seq_clr(lp->row->el + 1, lp->dim);
-	if (isl_tab_add_eq(lp->tab, lp->row->el) < 0)
-		return -1;
-
-	lp->con_offset += 2;
-
-	return lp->tab->empty;
-}
-
-static void get_obj_val(struct tab_lp* lp, mpq_t *F)
-{
-	isl_int_neg(mpq_numref(*F), lp->opt);
-	isl_int_set(mpq_denref(*F), lp->opt_denom);
-}
-
-static void delete_lp(struct tab_lp *lp)
-{
-	if (!lp)
-		return;
-
-	isl_int_clear(lp->opt);
-	isl_int_clear(lp->opt_denom);
-	isl_int_clear(lp->tmp);
-	isl_int_clear(lp->tmp2);
-	isl_vec_free(lp->row);
-	free(lp->stack);
-	isl_tab_free(lp->tab);
-	isl_ctx_deref(lp->ctx);
-	free(lp);
-}
-
-static int add_lp_row(struct tab_lp *lp, isl_int *row, int dim)
-{
-	lp->stack[lp->neq] = isl_tab_snap(lp->tab);
-
-	isl_int_set_si(lp->row->el[0], 0);
-	isl_seq_cpy(lp->row->el + 1, row, lp->dim);
-	isl_seq_neg(lp->row->el + 1 + lp->dim, row, lp->dim);
-
-	if (isl_tab_add_valid_eq(lp->tab, lp->row->el) < 0)
-		return -1;
-
-	return lp->neq++;
-}
-
-static void get_alpha(struct tab_lp* lp, int row, mpq_t *alpha)
-{
-	row += lp->con_offset;
-	isl_int_neg(mpq_numref(*alpha), lp->tab->dual->el[1 + row]);
-	isl_int_set(mpq_denref(*alpha), lp->tab->dual->el[0]);
-}
-
-static int del_lp_row(struct tab_lp *lp)
-{
-	lp->neq--;
-	return isl_tab_rollback(lp->tab, lp->stack[lp->neq]);
-}
diff --git a/cloog-0.16.3/isl/basis_reduction_templ.c b/cloog-0.16.3/isl/basis_reduction_templ.c
deleted file mode 100644
index 2e4034f..0000000
--- a/cloog-0.16.3/isl/basis_reduction_templ.c
+++ /dev/null
@@ -1,356 +0,0 @@
-/*
- * Copyright 2006-2007 Universiteit Leiden
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, Leiden Institute of Advanced Computer Science,
- * Universiteit Leiden, Niels Bohrweg 1, 2333 CA Leiden, The Netherlands
- * and K.U.Leuven, Departement Computerwetenschappen, Celestijnenlaan 200A,
- * B-3001 Leuven, Belgium
- */
-
-#include <stdlib.h>
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include "isl_basis_reduction.h"
-
-static void save_alpha(GBR_LP *lp, int first, int n, GBR_type *alpha)
-{
-	int i;
-
-	for (i = 0; i < n; ++i)
-		GBR_lp_get_alpha(lp, first + i, &alpha[i]);
-}
-
-/* Compute a reduced basis for the set represented by the tableau "tab".
- * tab->basis, which must be initialized by the calling function to an affine
- * unimodular basis, is updated to reflect the reduced basis.
- * The first tab->n_zero rows of the basis (ignoring the constant row)
- * are assumed to correspond to equalities and are left untouched.
- * tab->n_zero is updated to reflect any additional equalities that
- * have been detected in the first rows of the new basis.
- * The final tab->n_unbounded rows of the basis are assumed to correspond
- * to unbounded directions and are also left untouched.
- * In particular this means that the remaining rows are assumed to
- * correspond to bounded directions.
- *
- * This function implements the algorithm described in
- * "An Implementation of the Generalized Basis Reduction Algorithm
- *  for Integer Programming" of Cook el al. to compute a reduced basis.
- * We use \epsilon = 1/4.
- *
- * If ctx->opt->gbr_only_first is set, the user is only interested
- * in the first direction.  In this case we stop the basis reduction when
- * the width in the first direction becomes smaller than 2.
- */
-struct isl_tab *isl_tab_compute_reduced_basis(struct isl_tab *tab)
-{
-	unsigned dim;
-	struct isl_ctx *ctx;
-	struct isl_mat *B;
-	int unbounded;
-	int i;
-	GBR_LP *lp = NULL;
-	GBR_type F_old, alpha, F_new;
-	int row;
-	isl_int tmp;
-	struct isl_vec *b_tmp;
-	GBR_type *F = NULL;
-	GBR_type *alpha_buffer[2] = { NULL, NULL };
-	GBR_type *alpha_saved;
-	GBR_type F_saved;
-	int use_saved = 0;
-	isl_int mu[2];
-	GBR_type mu_F[2];
-	GBR_type two;
-	GBR_type one;
-	int empty = 0;
-	int fixed = 0;
-	int fixed_saved = 0;
-	int mu_fixed[2];
-	int n_bounded;
-	int gbr_only_first;
-
-	if (!tab)
-		return NULL;
-
-	if (tab->empty)
-		return tab;
-
-	ctx = tab->mat->ctx;
-	gbr_only_first = ctx->opt->gbr_only_first;
-	dim = tab->n_var;
-	B = tab->basis;
-	if (!B)
-		return tab;
-
-	n_bounded = dim - tab->n_unbounded;
-	if (n_bounded <= tab->n_zero + 1)
-		return tab;
-
-	isl_int_init(tmp);
-	isl_int_init(mu[0]);
-	isl_int_init(mu[1]);
-
-	GBR_init(alpha);
-	GBR_init(F_old);
-	GBR_init(F_new);
-	GBR_init(F_saved);
-	GBR_init(mu_F[0]);
-	GBR_init(mu_F[1]);
-	GBR_init(two);
-	GBR_init(one);
-
-	b_tmp = isl_vec_alloc(ctx, dim);
-	if (!b_tmp)
-		goto error;
-
-	F = isl_alloc_array(ctx, GBR_type, n_bounded);
-	alpha_buffer[0] = isl_alloc_array(ctx, GBR_type, n_bounded);
-	alpha_buffer[1] = isl_alloc_array(ctx, GBR_type, n_bounded);
-	alpha_saved = alpha_buffer[0];
-
-	if (!F || !alpha_buffer[0] || !alpha_buffer[1])
-		goto error;
-
-	for (i = 0; i < n_bounded; ++i) {
-		GBR_init(F[i]);
-		GBR_init(alpha_buffer[0][i]);
-		GBR_init(alpha_buffer[1][i]);
-	}
-
-	GBR_set_ui(two, 2);
-	GBR_set_ui(one, 1);
-
-	lp = GBR_lp_init(tab);
-	if (!lp)
-		goto error;
-
-	i = tab->n_zero;
-
-	GBR_lp_set_obj(lp, B->row[1+i]+1, dim);
-	ctx->stats->gbr_solved_lps++;
-	unbounded = GBR_lp_solve(lp);
-	isl_assert(ctx, !unbounded, goto error);
-	GBR_lp_get_obj_val(lp, &F[i]);
-
-	if (GBR_lt(F[i], one)) {
-		if (!GBR_is_zero(F[i])) {
-			empty = GBR_lp_cut(lp, B->row[1+i]+1);
-			if (empty)
-				goto done;
-			GBR_set_ui(F[i], 0);
-		}
-		tab->n_zero++;
-	}
-
-	do {
-		if (i+1 == tab->n_zero) {
-			GBR_lp_set_obj(lp, B->row[1+i+1]+1, dim);
-			ctx->stats->gbr_solved_lps++;
-			unbounded = GBR_lp_solve(lp);
-			isl_assert(ctx, !unbounded, goto error);
-			GBR_lp_get_obj_val(lp, &F_new);
-			fixed = GBR_lp_is_fixed(lp);
-			GBR_set_ui(alpha, 0);
-		} else
-		if (use_saved) {
-			row = GBR_lp_next_row(lp);
-			GBR_set(F_new, F_saved);
-			fixed = fixed_saved;
-			GBR_set(alpha, alpha_saved[i]);
-		} else {
-			row = GBR_lp_add_row(lp, B->row[1+i]+1, dim);
-			GBR_lp_set_obj(lp, B->row[1+i+1]+1, dim);
-			ctx->stats->gbr_solved_lps++;
-			unbounded = GBR_lp_solve(lp);
-			isl_assert(ctx, !unbounded, goto error);
-			GBR_lp_get_obj_val(lp, &F_new);
-			fixed = GBR_lp_is_fixed(lp);
-
-			GBR_lp_get_alpha(lp, row, &alpha);
-
-			if (i > 0)
-				save_alpha(lp, row-i, i, alpha_saved);
-
-			if (GBR_lp_del_row(lp) < 0)
-				goto error;
-		}
-		GBR_set(F[i+1], F_new);
-
-		GBR_floor(mu[0], alpha);
-		GBR_ceil(mu[1], alpha);
-
-		if (isl_int_eq(mu[0], mu[1]))
-			isl_int_set(tmp, mu[0]);
-		else {
-			int j;
-
-			for (j = 0; j <= 1; ++j) {
-				isl_int_set(tmp, mu[j]);
-				isl_seq_combine(b_tmp->el,
-						ctx->one, B->row[1+i+1]+1,
-						tmp, B->row[1+i]+1, dim);
-				GBR_lp_set_obj(lp, b_tmp->el, dim);
-				ctx->stats->gbr_solved_lps++;
-				unbounded = GBR_lp_solve(lp);
-				isl_assert(ctx, !unbounded, goto error);
-				GBR_lp_get_obj_val(lp, &mu_F[j]);
-				mu_fixed[j] = GBR_lp_is_fixed(lp);
-				if (i > 0)
-					save_alpha(lp, row-i, i, alpha_buffer[j]);
-			}
-
-			if (GBR_lt(mu_F[0], mu_F[1]))
-				j = 0;
-			else
-				j = 1;
-
-			isl_int_set(tmp, mu[j]);
-			GBR_set(F_new, mu_F[j]);
-			fixed = mu_fixed[j];
-			alpha_saved = alpha_buffer[j];
-		}
-		isl_seq_combine(B->row[1+i+1]+1, ctx->one, B->row[1+i+1]+1,
-				tmp, B->row[1+i]+1, dim);
-
-		if (i+1 == tab->n_zero && fixed) {
-			if (!GBR_is_zero(F[i+1])) {
-				empty = GBR_lp_cut(lp, B->row[1+i+1]+1);
-				if (empty)
-					goto done;
-				GBR_set_ui(F[i+1], 0);
-			}
-			tab->n_zero++;
-		}
-
-		GBR_set(F_old, F[i]);
-
-		use_saved = 0;
-		/* mu_F[0] = 4 * F_new; mu_F[1] = 3 * F_old */
-		GBR_set_ui(mu_F[0], 4);
-		GBR_mul(mu_F[0], mu_F[0], F_new);
-		GBR_set_ui(mu_F[1], 3);
-		GBR_mul(mu_F[1], mu_F[1], F_old);
-		if (GBR_lt(mu_F[0], mu_F[1])) {
-			B = isl_mat_swap_rows(B, 1 + i, 1 + i + 1);
-			if (i > tab->n_zero) {
-				use_saved = 1;
-				GBR_set(F_saved, F_new);
-				fixed_saved = fixed;
-				if (GBR_lp_del_row(lp) < 0)
-					goto error;
-				--i;
-			} else {
-				GBR_set(F[tab->n_zero], F_new);
-				if (gbr_only_first && GBR_lt(F[tab->n_zero], two))
-					break;
-
-				if (fixed) {
-					if (!GBR_is_zero(F[tab->n_zero])) {
-						empty = GBR_lp_cut(lp, B->row[1+tab->n_zero]+1);
-						if (empty)
-							goto done;
-						GBR_set_ui(F[tab->n_zero], 0);
-					}
-					tab->n_zero++;
-				}
-			}
-		} else {
-			GBR_lp_add_row(lp, B->row[1+i]+1, dim);
-			++i;
-		}
-	} while (i < n_bounded - 1);
-
-	if (0) {
-done:
-		if (empty < 0) {
-error:
-			isl_mat_free(B);
-			B = NULL;
-		}
-	}
-
-	GBR_lp_delete(lp);
-
-	if (alpha_buffer[1])
-		for (i = 0; i < n_bounded; ++i) {
-			GBR_clear(F[i]);
-			GBR_clear(alpha_buffer[0][i]);
-			GBR_clear(alpha_buffer[1][i]);
-		}
-	free(F);
-	free(alpha_buffer[0]);
-	free(alpha_buffer[1]);
-
-	isl_vec_free(b_tmp);
-
-	GBR_clear(alpha);
-	GBR_clear(F_old);
-	GBR_clear(F_new);
-	GBR_clear(F_saved);
-	GBR_clear(mu_F[0]);
-	GBR_clear(mu_F[1]);
-	GBR_clear(two);
-	GBR_clear(one);
-
-	isl_int_clear(tmp);
-	isl_int_clear(mu[0]);
-	isl_int_clear(mu[1]);
-
-	tab->basis = B;
-
-	return tab;
-}
-
-/* Compute an affine form of a reduced basis of the given basic
- * non-parametric set, which is assumed to be bounded and not
- * include any integer divisions.
- * The first column and the first row correspond to the constant term.
- *
- * If the input contains any equalities, we first create an initial
- * basis with the equalities first.  Otherwise, we start off with
- * the identity matrix.
- */
-struct isl_mat *isl_basic_set_reduced_basis(struct isl_basic_set *bset)
-{
-	struct isl_mat *basis;
-	struct isl_tab *tab;
-
-	if (!bset)
-		return NULL;
-
-	if (isl_basic_set_dim(bset, isl_dim_div) != 0)
-		isl_die(bset->ctx, isl_error_invalid,
-			"no integer division allowed", return NULL);
-	if (isl_basic_set_dim(bset, isl_dim_param) != 0)
-		isl_die(bset->ctx, isl_error_invalid,
-			"no parameters allowed", return NULL);
-
-	tab = isl_tab_from_basic_set(bset);
-	if (!tab)
-		return NULL;
-
-	if (bset->n_eq == 0)
-		tab->basis = isl_mat_identity(bset->ctx, 1 + tab->n_var);
-	else {
-		isl_mat *eq;
-		unsigned nvar = isl_basic_set_total_dim(bset);
-		eq = isl_mat_sub_alloc6(bset->ctx, bset->eq, 0, bset->n_eq,
-					1, nvar);
-		eq = isl_mat_left_hermite(eq, 0, NULL, &tab->basis);
-		tab->basis = isl_mat_lin_to_aff(tab->basis);
-		tab->n_zero = bset->n_eq;
-		isl_mat_free(eq);
-	}
-	tab = isl_tab_compute_reduced_basis(tab);
-	if (!tab)
-		return NULL;
-
-	basis = isl_mat_copy(tab->basis);
-
-	isl_tab_free(tab);
-
-	return basis;
-}
diff --git a/cloog-0.16.3/isl/bound.c b/cloog-0.16.3/isl/bound.c
deleted file mode 100644
index f83e025..0000000
--- a/cloog-0.16.3/isl/bound.c
+++ /dev/null
@@ -1,278 +0,0 @@
-#include <assert.h>
-#include <isl/stream.h>
-#include <isl_polynomial_private.h>
-#include <isl_scan.h>
-
-struct bound_options {
-	struct isl_options	*isl;
-	unsigned		 verify;
-	int			 print_all;
-	int			 continue_on_error;
-};
-
-struct isl_arg bound_options_arg[] = {
-ISL_ARG_CHILD(struct bound_options, isl, "isl", isl_options_arg, "isl options")
-ISL_ARG_BOOL(struct bound_options, verify, 'T', "verify", 0, NULL)
-ISL_ARG_BOOL(struct bound_options, print_all, 'A', "print-all", 0, NULL)
-ISL_ARG_BOOL(struct bound_options, continue_on_error, '\0', "continue-on-error", 0, NULL)
-ISL_ARG_END
-};
-
-ISL_ARG_DEF(bound_options, struct bound_options, bound_options_arg)
-
-static __isl_give isl_set *set_bounds(__isl_take isl_set *set)
-{
-	unsigned nparam;
-	int i, r;
-	isl_point *pt, *pt2;
-	isl_set *box;
-
-	nparam = isl_set_dim(set, isl_dim_param);
-	r = nparam >= 8 ? 5 : nparam >= 5 ? 15 : 50;
-
-	pt = isl_set_sample_point(isl_set_copy(set));
-	pt2 = isl_point_copy(pt);
-
-	for (i = 0; i < nparam; ++i) {
-		pt = isl_point_add_ui(pt, isl_dim_param, i, r);
-		pt2 = isl_point_sub_ui(pt2, isl_dim_param, i, r);
-	}
-
-	box = isl_set_box_from_points(pt, pt2);
-
-	return isl_set_intersect(set, box);
-}
-
-struct verify_point_bound {
-	struct bound_options *options;
-	int stride;
-	int n;
-	int exact;
-	int error;
-
-	isl_pw_qpolynomial_fold *pwf;
-	isl_pw_qpolynomial_fold *bound;
-};
-
-static int verify_point(__isl_take isl_point *pnt, void *user)
-{
-	int i;
-	unsigned nvar;
-	unsigned nparam;
-	struct verify_point_bound *vpb = (struct verify_point_bound *) user;
-	isl_int t;
-	isl_pw_qpolynomial_fold *pwf;
-	isl_qpolynomial *bound = NULL;
-	isl_qpolynomial *opt = NULL;
-	isl_set *dom = NULL;
-	const char *minmax;
-	int bounded;
-	int sign;
-	int ok;
-	FILE *out = vpb->options->print_all ? stdout : stderr;
-
-	vpb->n--;
-
-	if (1) {
-		minmax = "ub";
-		sign = 1;
-	} else {
-		minmax = "lb";
-		sign = -1;
-	}
-
-	isl_int_init(t);
-
-	pwf = isl_pw_qpolynomial_fold_copy(vpb->pwf);
-
-	nparam = isl_pw_qpolynomial_fold_dim(pwf, isl_dim_param);
-	for (i = 0; i < nparam; ++i) {
-		isl_point_get_coordinate(pnt, isl_dim_param, i, &t);
-		pwf = isl_pw_qpolynomial_fold_fix_dim(pwf, isl_dim_param, i, t);
-	}
-
-	bound = isl_pw_qpolynomial_fold_eval(
-				    isl_pw_qpolynomial_fold_copy(vpb->bound),
-				    isl_point_copy(pnt));
-
-	dom = isl_pw_qpolynomial_fold_domain(isl_pw_qpolynomial_fold_copy(pwf));
-	bounded = isl_set_is_bounded(dom);
-
-	if (bounded < 0)
-		goto error;
-
-	if (!bounded)
-		opt = isl_pw_qpolynomial_fold_eval(
-				    isl_pw_qpolynomial_fold_copy(pwf),
-				    isl_set_sample_point(isl_set_copy(dom)));
-	else if (sign > 0)
-		opt = isl_pw_qpolynomial_fold_max(isl_pw_qpolynomial_fold_copy(pwf));
-	else
-		opt = isl_pw_qpolynomial_fold_min(isl_pw_qpolynomial_fold_copy(pwf));
-
-	nvar = isl_set_dim(dom, isl_dim_set);
-	opt = isl_qpolynomial_drop_dims(opt, isl_dim_set, 0, nvar);
-	if (vpb->exact && bounded)
-		ok = isl_qpolynomial_plain_is_equal(opt, bound);
-	else if (sign > 0)
-		ok = isl_qpolynomial_le_cst(opt, bound);
-	else
-		ok = isl_qpolynomial_le_cst(bound, opt);
-	if (ok < 0)
-		goto error;
-
-	if (vpb->options->print_all || !ok) {
-		fprintf(out, "%s(", minmax);
-		for (i = 0; i < nparam; ++i) {
-			if (i)
-				fprintf(out, ", ");
-			isl_point_get_coordinate(pnt, isl_dim_param, i, &t);
-			isl_int_print(out, t, 0);
-		}
-		fprintf(out, ") = ");
-		isl_qpolynomial_print(bound, out, ISL_FORMAT_ISL);
-		fprintf(out, ", %s = ", bounded ? "opt" : "sample");
-		isl_qpolynomial_print(opt, out, ISL_FORMAT_ISL);
-		if (ok)
-			fprintf(out, ". OK\n");
-		else
-			fprintf(out, ". NOT OK\n");
-	} else if ((vpb->n % vpb->stride) == 0) {
-		printf("o");
-		fflush(stdout);
-	}
-
-	if (0) {
-error:
-		ok = 0;
-	}
-
-	isl_pw_qpolynomial_fold_free(pwf);
-	isl_qpolynomial_free(bound);
-	isl_qpolynomial_free(opt);
-	isl_point_free(pnt);
-	isl_set_free(dom);
-
-	isl_int_clear(t);
-
-	if (!ok)
-		vpb->error = 1;
-
-	if (vpb->options->continue_on_error)
-		ok = 1;
-
-	return (vpb->n >= 1 && ok) ? 0 : -1;
-}
-
-static int check_solution(__isl_take isl_pw_qpolynomial_fold *pwf,
-	__isl_take isl_pw_qpolynomial_fold *bound, int exact,
-	struct bound_options *options)
-{
-	struct verify_point_bound vpb;
-	isl_int count, max;
-	isl_set *dom;
-	isl_set *context;
-	int i, r, n;
-
-	dom = isl_pw_qpolynomial_fold_domain(isl_pw_qpolynomial_fold_copy(pwf));
-	context = isl_set_remove_dims(isl_set_copy(dom), isl_dim_set,
-					0, isl_set_dim(dom, isl_dim_set));
-	context = isl_set_remove_divs(context);
-	context = set_bounds(context);
-
-	isl_int_init(count);
-	isl_int_init(max);
-
-	isl_int_set_si(max, 200);
-	r = isl_set_count_upto(context, max, &count);
-	assert(r >= 0);
-	n = isl_int_get_si(count);
-
-	isl_int_clear(max);
-	isl_int_clear(count);
-
-	vpb.options = options;
-	vpb.pwf = pwf;
-	vpb.bound = bound;
-	vpb.n = n;
-	vpb.stride = n > 70 ? 1 + (n + 1)/70 : 1;
-	vpb.error = 0;
-	vpb.exact = exact;
-
-	if (!options->print_all) {
-		for (i = 0; i < vpb.n; i += vpb.stride)
-			printf(".");
-		printf("\r");
-		fflush(stdout);
-	}
-
-	isl_set_foreach_point(context, verify_point, &vpb);
-
-	isl_set_free(context);
-	isl_set_free(dom);
-	isl_pw_qpolynomial_fold_free(pwf);
-	isl_pw_qpolynomial_fold_free(bound);
-
-	if (!options->print_all)
-		printf("\n");
-
-	if (vpb.error) {
-		fprintf(stderr, "Check failed !\n");
-		return -1;
-	}
-
-	return 0;
-}
-
-int main(int argc, char **argv)
-{
-	isl_ctx *ctx;
-	isl_pw_qpolynomial_fold *copy;
-	isl_pw_qpolynomial_fold *pwf;
-	struct isl_stream *s;
-	struct isl_obj obj;
-	struct bound_options *options;
-	int exact;
-	int r = 0;
-
-	options = bound_options_new_with_defaults();
-	assert(options);
-	argc = bound_options_parse(options, argc, argv, ISL_ARG_ALL);
-
-	ctx = isl_ctx_alloc_with_options(bound_options_arg, options);
-
-	s = isl_stream_new_file(ctx, stdin);
-	obj = isl_stream_read_obj(s);
-	if (obj.type == isl_obj_pw_qpolynomial)
-		pwf = isl_pw_qpolynomial_fold_from_pw_qpolynomial(isl_fold_max,
-								  obj.v);
-	else if (obj.type == isl_obj_pw_qpolynomial_fold)
-		pwf = obj.v;
-	else {
-		obj.type->free(obj.v);
-		isl_die(ctx, isl_error_invalid, "invalid input", goto error);
-	}
-
-	if (options->verify)
-		copy = isl_pw_qpolynomial_fold_copy(pwf);
-
-	pwf = isl_pw_qpolynomial_fold_bound(pwf, &exact);
-	pwf = isl_pw_qpolynomial_fold_coalesce(pwf);
-
-	if (options->verify) {
-		r = check_solution(copy, pwf, exact, options);
-	} else {
-		if (!exact)
-			printf("# NOT exact\n");
-		isl_pw_qpolynomial_fold_print(pwf, stdout, 0);
-		fprintf(stdout, "\n");
-		isl_pw_qpolynomial_fold_free(pwf);
-	}
-
-error:
-	isl_stream_free(s);
-
-	isl_ctx_free(ctx);
-
-	return r;
-}
diff --git a/cloog-0.16.3/isl/bound_test.sh.in b/cloog-0.16.3/isl/bound_test.sh.in
deleted file mode 100755
index e3fc037..0000000
--- a/cloog-0.16.3/isl/bound_test.sh.in
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/bin/sh
-
-EXEEXT=@EXEEXT@
-
-BOUND_TESTS="\
-	basicLinear2.pwqp \
-	basicLinear.pwqp \
-	basicTestParameterPosNeg.pwqp \
-	basicTest.pwqp \
-	devos.pwqp \
-	equality1.pwqp \
-	equality2.pwqp \
-	equality3.pwqp \
-	equality4.pwqp \
-	equality5.pwqp \
-	faddeev.pwqp \
-	linearExample.pwqp \
-	neg.pwqp \
-	philippe3vars3pars.pwqp \
-	philippe3vars.pwqp \
-	philippeNeg.pwqp \
-	philippePolynomialCoeff1P.pwqp \
-	philippePolynomialCoeff.pwqp \
-	philippe.pwqp \
-	product.pwqp \
-	split.pwqp \
-	test3Deg3Var.pwqp \
-	toplas.pwqp \
-	unexpanded.pwqp"
-
-for i in $BOUND_TESTS; do
-	echo $i;
-	./isl_bound$EXEEXT -T --bound=bernstein < $srcdir/test_inputs/$i || exit
-	./isl_bound$EXEEXT -T --bound=range < $srcdir/test_inputs/$i || exit
-done
diff --git a/cloog-0.16.3/isl/cat.c b/cloog-0.16.3/isl/cat.c
deleted file mode 100644
index f278e9c..0000000
--- a/cloog-0.16.3/isl/cat.c
+++ /dev/null
@@ -1,58 +0,0 @@
-#include <assert.h>
-#include <isl/obj.h>
-#include <isl/printer.h>
-#include <isl/stream.h>
-
-struct isl_arg_choice cat_format[] = {
-	{"isl",		ISL_FORMAT_ISL},
-	{"omega",	ISL_FORMAT_OMEGA},
-	{"polylib",	ISL_FORMAT_POLYLIB},
-	{"ext-polylib",	ISL_FORMAT_EXT_POLYLIB},
-	{"latex",	ISL_FORMAT_LATEX},
-	{0}
-};
-
-struct cat_options {
-	struct isl_options	*isl;
-	unsigned		 format;
-};
-
-struct isl_arg cat_options_arg[] = {
-ISL_ARG_CHILD(struct cat_options, isl, "isl", isl_options_arg, "isl options")
-ISL_ARG_CHOICE(struct cat_options, format, 0, "format", \
-	cat_format,	ISL_FORMAT_ISL, "output format")
-ISL_ARG_END
-};
-
-ISL_ARG_DEF(cat_options, struct cat_options, cat_options_arg)
-
-int main(int argc, char **argv)
-{
-	struct isl_ctx *ctx;
-	struct isl_stream *s;
-	struct isl_obj obj;
-	struct cat_options *options;
-	isl_printer *p;
-
-	options = cat_options_new_with_defaults();
-	assert(options);
-	argc = cat_options_parse(options, argc, argv, ISL_ARG_ALL);
-
-	ctx = isl_ctx_alloc_with_options(cat_options_arg, options);
-
-	s = isl_stream_new_file(ctx, stdin);
-	obj = isl_stream_read_obj(s);
-	isl_stream_free(s);
-
-	p = isl_printer_to_file(ctx, stdout);
-	p = isl_printer_set_output_format(p, options->format);
-	p = obj.type->print(p, obj.v);
-	p = isl_printer_end_line(p);
-	isl_printer_free(p);
-
-	obj.type->free(obj.v);
-
-	isl_ctx_free(ctx);
-
-	return 0;
-}
diff --git a/cloog-0.16.3/isl/closure.c b/cloog-0.16.3/isl/closure.c
deleted file mode 100644
index 43d69d4..0000000
--- a/cloog-0.16.3/isl/closure.c
+++ /dev/null
@@ -1,33 +0,0 @@
-#include <assert.h>
-#include <isl/map.h>
-
-int main(int argc, char **argv)
-{
-	struct isl_ctx *ctx;
-	struct isl_map *map;
-	struct isl_options *options;
-	int exact;
-
-	options = isl_options_new_with_defaults();
-	assert(options);
-	argc = isl_options_parse(options, argc, argv, ISL_ARG_ALL);
-
-	ctx = isl_ctx_alloc_with_options(isl_options_arg, options);
-
-	map = isl_map_read_from_file(ctx, stdin, -1);
-	map = isl_map_transitive_closure(map, &exact);
-	if (!exact)
-		printf("# NOT exact\n");
-	isl_map_print(map, stdout, 0, ISL_FORMAT_ISL);
-	printf("\n");
-	map = isl_map_compute_divs(map);
-	map = isl_map_coalesce(map);
-	printf("# coalesced\n");
-	isl_map_print(map, stdout, 0, ISL_FORMAT_ISL);
-	printf("\n");
-	isl_map_free(map);
-
-	isl_ctx_free(ctx);
-
-	return 0;
-}
diff --git a/cloog-0.16.3/isl/config.guess b/cloog-0.16.3/isl/config.guess
deleted file mode 100755
index 115f944..0000000
--- a/cloog-0.16.3/isl/config.guess
+++ /dev/null
@@ -1,1502 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-#   Free Software Foundation, Inc.
-
-timestamp='2010-04-03'
-
-# 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
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner.  Please send patches (context
-# diff format) to <config-patches@gnu.org> and include a ChangeLog
-# entry.
-#
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
-#
-# 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
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help" >&2
-       exit 1 ;;
-    * )
-       break ;;
-  esac
-done
-
-if test $# != 0; then
-  echo "$me: too many arguments$help" >&2
-  exit 1
-fi
-
-trap 'exit 1' HUP INT TERM
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
-
-set_cc_for_build='
-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" HUP INT PIPE TERM ;
-: ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
-dummy=$tmp/dummy ;
-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
-case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,)    echo "int x;" > $dummy.c ;
-	for c in cc gcc c89 c99 ; do
-	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
-	     CC_FOR_BUILD="$c"; break ;
-	  fi ;
-	done ;
-	if test x"$CC_FOR_BUILD" = x ; then
-	  CC_FOR_BUILD=no_compiler_found ;
-	fi
-	;;
- ,,*)   CC_FOR_BUILD=$CC ;;
- ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
-esac ; set_cc_for_build= ;'
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
-	PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
-    *:NetBSD:*:*)
-	# NetBSD (nbsd) targets should (where applicable) match one or
-	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
-	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
-	# switched to ELF, *-*-netbsd* would select the old
-	# object file format.  This provides both forward
-	# compatibility and a consistent mechanism for selecting the
-	# object file format.
-	#
-	# Note: NetBSD doesn't particularly care about the vendor
-	# portion of the name.  We always set it to "unknown".
-	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
-	case "${UNAME_MACHINE_ARCH}" in
-	    armeb) machine=armeb-unknown ;;
-	    arm*) machine=arm-unknown ;;
-	    sh3el) machine=shl-unknown ;;
-	    sh3eb) machine=sh-unknown ;;
-	    sh5el) machine=sh5le-unknown ;;
-	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
-	esac
-	# The Operating System including object format, if it has switched
-	# to ELF recently, or will in the future.
-	case "${UNAME_MACHINE_ARCH}" in
-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
-		eval $set_cc_for_build
-		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
-			| grep -q __ELF__
-		then
-		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
-		    # Return netbsd for either.  FIX?
-		    os=netbsd
-		else
-		    os=netbsdelf
-		fi
-		;;
-	    *)
-	        os=netbsd
-		;;
-	esac
-	# The OS release
-	# Debian GNU/NetBSD machines have a different userland, and
-	# thus, need a distinct triplet. However, they do not need
-	# kernel version information, so it can be replaced with a
-	# suitable tag, in the style of linux-gnu.
-	case "${UNAME_VERSION}" in
-	    Debian*)
-		release='-gnu'
-		;;
-	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
-		;;
-	esac
-	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
-	# contains redundant information, the shorter form:
-	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
-	exit ;;
-    *:OpenBSD:*:*)
-	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
-	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
-	exit ;;
-    *:ekkoBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
-	exit ;;
-    *:SolidBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
-	exit ;;
-    macppc:MirBSD:*:*)
-	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    *:MirBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    alpha:OSF1:*:*)
-	case $UNAME_RELEASE in
-	*4.0)
-		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
-		;;
-	*5.*)
-	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
-		;;
-	esac
-	# According to Compaq, /usr/sbin/psrinfo has been available on
-	# OSF/1 and Tru64 systems produced since 1995.  I hope that
-	# covers most systems running today.  This code pipes the CPU
-	# types through head -n 1, so we only detect the type of CPU 0.
-	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" ;;
-	    "EV4.5 (21064)")
-		UNAME_MACHINE="alpha" ;;
-	    "LCA4 (21066/21068)")
-		UNAME_MACHINE="alpha" ;;
-	    "EV5 (21164)")
-		UNAME_MACHINE="alphaev5" ;;
-	    "EV5.6 (21164A)")
-		UNAME_MACHINE="alphaev56" ;;
-	    "EV5.6 (21164PC)")
-		UNAME_MACHINE="alphapca56" ;;
-	    "EV5.7 (21164PC)")
-		UNAME_MACHINE="alphapca57" ;;
-	    "EV6 (21264)")
-		UNAME_MACHINE="alphaev6" ;;
-	    "EV6.7 (21264A)")
-		UNAME_MACHINE="alphaev67" ;;
-	    "EV6.8CB (21264C)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8AL (21264B)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8CX (21264D)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.9A (21264/EV69A)")
-		UNAME_MACHINE="alphaev69" ;;
-	    "EV7 (21364)")
-		UNAME_MACHINE="alphaev7" ;;
-	    "EV7.9 (21364A)")
-		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'`
-	exit ;;
-    Alpha\ *:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# Should we change UNAME_MACHINE based on the output of uname instead
-	# of the specific Alpha model?
-	echo alpha-pc-interix
-	exit ;;
-    21064:Windows_NT:50:3)
-	echo alpha-dec-winnt3.5
-	exit ;;
-    Amiga*:UNIX_System_V:4.0:*)
-	echo m68k-unknown-sysv4
-	exit ;;
-    *:[Aa]miga[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-amigaos
-	exit ;;
-    *:[Mm]orph[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-morphos
-	exit ;;
-    *:OS/390:*:*)
-	echo i370-ibm-openedition
-	exit ;;
-    *:z/VM:*:*)
-	echo s390-ibm-zvmoe
-	exit ;;
-    *:OS400:*:*)
-        echo powerpc-ibm-os400
-	exit ;;
-    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
-	echo arm-acorn-riscix${UNAME_RELEASE}
-	exit ;;
-    arm:riscos:*:*|arm:RISCOS:*:*)
-	echo arm-unknown-riscos
-	exit ;;
-    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
-	echo hppa1.1-hitachi-hiuxmpp
-	exit ;;
-    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
-	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
-	if test "`(/bin/universe) 2>/dev/null`" = att ; then
-		echo pyramid-pyramid-sysv3
-	else
-		echo pyramid-pyramid-bsd
-	fi
-	exit ;;
-    NILE*:*:*:dcosx)
-	echo pyramid-pyramid-svr4
-	exit ;;
-    DRS?6000:unix:4.0:6*)
-	echo sparc-icl-nx6
-	exit ;;
-    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
-	case `/usr/bin/uname -p` in
-	    sparc) echo sparc-icl-nx7; exit ;;
-	esac ;;
-    s390x:SunOS:*:*)
-	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4H:SunOS:5.*:*)
-	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
-	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
-	echo i386-pc-auroraux${UNAME_RELEASE}
-	exit ;;
-    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
-	eval $set_cc_for_build
-	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 (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
-		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		grep IS_64BIT_ARCH >/dev/null
-	    then
-		SUN_ARCH="x86_64"
-	    fi
-	fi
-	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:6*:*)
-	# According to config.sub, this is the proper way to canonicalize
-	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
-	# it's likely to be more like Solaris than SunOS4.
-	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:*:*)
-	case "`/usr/bin/arch -k`" in
-	    Series*|S4*)
-		UNAME_RELEASE=`uname -v`
-		;;
-	esac
-	# Japanese Language versions have a version number like `4.1.3-JL'.
-	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
-	exit ;;
-    sun3*:SunOS:*:*)
-	echo m68k-sun-sunos${UNAME_RELEASE}
-	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
-	case "`/bin/arch`" in
-	    sun3)
-		echo m68k-sun-sunos${UNAME_RELEASE}
-		;;
-	    sun4)
-		echo sparc-sun-sunos${UNAME_RELEASE}
-		;;
-	esac
-	exit ;;
-    aushp:SunOS:*:*)
-	echo sparc-auspex-sunos${UNAME_RELEASE}
-	exit ;;
-    # The situation for MiNT is a little confusing.  The machine name
-    # can be virtually everything (everything which is not
-    # "atarist" or "atariste" at least should have a processor
-    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
-    # to the lowercase version "mint" (or "freemint").  Finally
-    # the system name "TOS" denotes a system which is actually not
-    # MiNT.  But MiNT is downward compatible to TOS, so this should
-    # be no problem.
-    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
-	echo m68k-atari-mint${UNAME_RELEASE}
-        exit ;;
-    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-        echo m68k-milan-mint${UNAME_RELEASE}
-        exit ;;
-    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-        echo m68k-hades-mint${UNAME_RELEASE}
-        exit ;;
-    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-        echo m68k-unknown-mint${UNAME_RELEASE}
-        exit ;;
-    m68k:machten:*:*)
-	echo m68k-apple-machten${UNAME_RELEASE}
-	exit ;;
-    powerpc:machten:*:*)
-	echo powerpc-apple-machten${UNAME_RELEASE}
-	exit ;;
-    RISC*:Mach:*:*)
-	echo mips-dec-mach_bsd4.3
-	exit ;;
-    RISC*:ULTRIX:*:*)
-	echo mips-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    VAX*:ULTRIX*:*:*)
-	echo vax-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    2020:CLIX:*:* | 2430:CLIX:*:*)
-	echo clipper-intergraph-clix${UNAME_RELEASE}
-	exit ;;
-    mips:*:*:UMIPS | mips:*:*:RISCos)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-#ifdef __cplusplus
-#include <stdio.h>  /* for printf() prototype */
-	int main (int argc, char *argv[]) {
-#else
-	int main (argc, argv) int argc; char *argv[]; {
-#endif
-	#if defined (host_mips) && defined (MIPSEB)
-	#if defined (SYSTYPE_SYSV)
-	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_SVR4)
-	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
-	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
-	#endif
-	#endif
-	  exit (-1);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c &&
-	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
-	  SYSTEM_NAME=`$dummy $dummyarg` &&
-	    { echo "$SYSTEM_NAME"; exit; }
-	echo mips-mips-riscos${UNAME_RELEASE}
-	exit ;;
-    Motorola:PowerMAX_OS:*:*)
-	echo powerpc-motorola-powermax
-	exit ;;
-    Motorola:*:4.3:PL8-*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:Power_UNIX:*:*)
-	echo powerpc-harris-powerunix
-	exit ;;
-    m88k:CX/UX:7*:*)
-	echo m88k-harris-cxux7
-	exit ;;
-    m88k:*:4*:R4*)
-	echo m88k-motorola-sysv4
-	exit ;;
-    m88k:*:3*:R3*)
-	echo m88k-motorola-sysv3
-	exit ;;
-    AViiON:dgux:*:*)
-        # DG/UX returns AViiON for all architectures
-        UNAME_PROCESSOR=`/usr/bin/uname -p`
-	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
-	then
-	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
-	       [ ${TARGET_BINARY_INTERFACE}x = x ]
-	    then
-		echo m88k-dg-dgux${UNAME_RELEASE}
-	    else
-		echo m88k-dg-dguxbcs${UNAME_RELEASE}
-	    fi
-	else
-	    echo i586-dg-dgux${UNAME_RELEASE}
-	fi
- 	exit ;;
-    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
-	echo m88k-dolphin-sysv3
-	exit ;;
-    M88*:*:R3*:*)
-	# Delta 88k system running SVR3
-	echo m88k-motorola-sysv3
-	exit ;;
-    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
-	echo m88k-tektronix-sysv3
-	exit ;;
-    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
-	echo m68k-tektronix-bsd
-	exit ;;
-    *:IRIX*:*:*)
-	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
-	exit ;;
-    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
-	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
-    i*86:AIX:*:*)
-	echo i386-ibm-aix
-	exit ;;
-    ia64:AIX:*:*)
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:2:3)
-	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
-		eval $set_cc_for_build
-		sed 's/^		//' << EOF >$dummy.c
-		#include <sys/systemcfg.h>
-
-		main()
-			{
-			if (!__power_pc())
-				exit(1);
-			puts("powerpc-ibm-aix3.2.5");
-			exit(0);
-			}
-EOF
-		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
-		then
-			echo "$SYSTEM_NAME"
-		else
-			echo rs6000-ibm-aix3.2.5
-		fi
-	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
-		echo rs6000-ibm-aix3.2.4
-	else
-		echo rs6000-ibm-aix3.2
-	fi
-	exit ;;
-    *:AIX:*:[456])
-	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
-	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
-		IBM_ARCH=rs6000
-	else
-		IBM_ARCH=powerpc
-	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:*:*)
-	echo rs6000-ibm-aix
-	exit ;;
-    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
-	echo romp-ibm-bsd4.4
-	exit ;;
-    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
-	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
-	exit ;;                             # report: romp-ibm BSD 4.3
-    *:BOSX:*:*)
-	echo rs6000-bull-bosx
-	exit ;;
-    DPX/2?00:B.O.S.:*:*)
-	echo m68k-bull-sysv3
-	exit ;;
-    9000/[34]??:4.3bsd:1.*:*)
-	echo m68k-hp-bsd
-	exit ;;
-    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
-	echo m68k-hp-bsd4.4
-	exit ;;
-    9000/[34678]??:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	case "${UNAME_MACHINE}" in
-	    9000/31? )            HP_ARCH=m68000 ;;
-	    9000/[34]?? )         HP_ARCH=m68k ;;
-	    9000/[678][0-9][0-9])
-		if [ -x /usr/bin/getconf ]; then
-		    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
-                      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
-                        esac ;;
-                    esac
-		fi
-		if [ "${HP_ARCH}" = "" ]; then
-		    eval $set_cc_for_build
-		    sed 's/^              //' << EOF >$dummy.c
-
-              #define _HPUX_SOURCE
-              #include <stdlib.h>
-              #include <unistd.h>
-
-              int main ()
-              {
-              #if defined(_SC_KERNEL_BITS)
-                  long bits = sysconf(_SC_KERNEL_BITS);
-              #endif
-                  long cpu  = sysconf (_SC_CPU_VERSION);
-
-                  switch (cpu)
-              	{
-              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-              	case CPU_PA_RISC2_0:
-              #if defined(_SC_KERNEL_BITS)
-              	    switch (bits)
-              		{
-              		case 64: puts ("hppa2.0w"); break;
-              		case 32: puts ("hppa2.0n"); break;
-              		default: puts ("hppa2.0"); break;
-              		} break;
-              #else  /* !defined(_SC_KERNEL_BITS) */
-              	    puts ("hppa2.0"); break;
-              #endif
-              	default: puts ("hppa1.0"); break;
-              	}
-                  exit (0);
-              }
-EOF
-		    (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" ]
-	then
-	    eval $set_cc_for_build
-
-	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
-	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
-	    # generating 64-bit code.  GNU and HP use different nomenclature:
-	    #
-	    # $ CC_FOR_BUILD=cc ./config.guess
-	    # => hppa2.0w-hp-hpux11.23
-	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
-	    # => hppa64-hp-hpux11.23
-
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
-		grep -q __LP64__
-	    then
-		HP_ARCH="hppa2.0w"
-	    else
-		HP_ARCH="hppa64"
-	    fi
-	fi
-	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
-	exit ;;
-    ia64:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	echo ia64-hp-hpux${HPUX_REV}
-	exit ;;
-    3050*:HI-UX:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <unistd.h>
-	int
-	main ()
-	{
-	  long cpu = sysconf (_SC_CPU_VERSION);
-	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
-	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
-	     results, however.  */
-	  if (CPU_IS_PA_RISC (cpu))
-	    {
-	      switch (cpu)
-		{
-		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
-		  default: puts ("hppa-hitachi-hiuxwe2"); break;
-		}
-	    }
-	  else if (CPU_IS_HP_MC68K (cpu))
-	    puts ("m68k-hitachi-hiuxwe2");
-	  else puts ("unknown-hitachi-hiuxwe2");
-	  exit (0);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
-		{ echo "$SYSTEM_NAME"; exit; }
-	echo unknown-hitachi-hiuxwe2
-	exit ;;
-    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
-	echo hppa1.1-hp-bsd
-	exit ;;
-    9000/8??:4.3bsd:*:*)
-	echo hppa1.0-hp-bsd
-	exit ;;
-    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
-	echo hppa1.0-hp-mpeix
-	exit ;;
-    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
-	echo hppa1.1-hp-osf
-	exit ;;
-    hp8??:OSF1:*:*)
-	echo hppa1.0-hp-osf
-	exit ;;
-    i*86:OSF1:*:*)
-	if [ -x /usr/sbin/sysversion ] ; then
-	    echo ${UNAME_MACHINE}-unknown-osf1mk
-	else
-	    echo ${UNAME_MACHINE}-unknown-osf1
-	fi
-	exit ;;
-    parisc*:Lites*:*:*)
-	echo hppa1.1-hp-lites
-	exit ;;
-    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
-	echo c1-convex-bsd
-        exit ;;
-    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-        exit ;;
-    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
-	echo c34-convex-bsd
-        exit ;;
-    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
-	echo c38-convex-bsd
-        exit ;;
-    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
-	echo c4-convex-bsd
-        exit ;;
-    CRAY*Y-MP:*:*:*)
-	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*[A-Z]90:*:*:*)
-	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
-	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
-	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
-	      -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*TS:*:*:*)
-	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*T3E:*:*:*)
-	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*SV1:*:*:*)
-	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    *:UNICOS/mp:*:*)
-	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_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/ /_/'`
-        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-	exit ;;
-    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
-	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
-	exit ;;
-    sparc*:BSD/OS:*:*)
-	echo sparc-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:BSD/OS:*:*)
-	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:FreeBSD:*:*)
-	case ${UNAME_MACHINE} in
-	    pc98)
-		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    amd64)
-		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    *)
-		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	esac
-	exit ;;
-    i*:CYGWIN*:*)
-	echo ${UNAME_MACHINE}-pc-cygwin
-	exit ;;
-    *:MINGW*:*)
-	echo ${UNAME_MACHINE}-pc-mingw32
-	exit ;;
-    i*:windows32*:*)
-    	# uname -m includes "-pc" on this system.
-    	echo ${UNAME_MACHINE}-mingw32
-	exit ;;
-    i*:PW*:*)
-	echo ${UNAME_MACHINE}-pc-pw32
-	exit ;;
-    *:Interix*:*)
-    	case ${UNAME_MACHINE} in
-	    x86)
-		echo i586-pc-interix${UNAME_RELEASE}
-		exit ;;
-	    authenticamd | genuineintel | EM64T)
-		echo x86_64-unknown-interix${UNAME_RELEASE}
-		exit ;;
-	    IA64)
-		echo ia64-unknown-interix${UNAME_RELEASE}
-		exit ;;
-	esac ;;
-    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
-	echo i${UNAME_MACHINE}-pc-mks
-	exit ;;
-    8664:Windows_NT:*)
-	echo x86_64-pc-mks
-	exit ;;
-    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
-	# UNAME_MACHINE based on the output of uname instead of i386?
-	echo i586-pc-interix
-	exit ;;
-    i*:UWIN*:*)
-	echo ${UNAME_MACHINE}-pc-uwin
-	exit ;;
-    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
-	echo x86_64-unknown-cygwin
-	exit ;;
-    p*:CYGWIN*:*)
-	echo powerpcle-unknown-cygwin
-	exit ;;
-    prep*:SunOS:5.*:*)
-	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    *:GNU:*:*)
-	# the GNU system
-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-	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/[-(].*//'`-gnu
-	exit ;;
-    i*86:Minix:*:*)
-	echo ${UNAME_MACHINE}-pc-minix
-	exit ;;
-    alpha:Linux:*:*)
-	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
-	  EV5)   UNAME_MACHINE=alphaev5 ;;
-	  EV56)  UNAME_MACHINE=alphaev56 ;;
-	  PCA56) UNAME_MACHINE=alphapca56 ;;
-	  PCA57) UNAME_MACHINE=alphapca56 ;;
-	  EV6)   UNAME_MACHINE=alphaev6 ;;
-	  EV67)  UNAME_MACHINE=alphaev67 ;;
-	  EV68*) UNAME_MACHINE=alphaev68 ;;
-        esac
-	objdump --private-headers /bin/sh | grep -q ld.so.1
-	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
-	exit ;;
-    arm*:Linux:*:*)
-	eval $set_cc_for_build
-	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
-	    | grep -q __ARM_EABI__
-	then
-	    echo ${UNAME_MACHINE}-unknown-linux-gnu
-	else
-	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
-	fi
-	exit ;;
-    avr32*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    cris:Linux:*:*)
-	echo cris-axis-linux-gnu
-	exit ;;
-    crisv32:Linux:*:*)
-	echo crisv32-axis-linux-gnu
-	exit ;;
-    frv:Linux:*:*)
-    	echo frv-unknown-linux-gnu
-	exit ;;
-    i*86:Linux:*:*)
-	LIBC=gnu
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#ifdef __dietlibc__
-	LIBC=dietlibc
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
-	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
-	exit ;;
-    ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m32r*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    mips:Linux:*:* | mips64:Linux:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#undef CPU
-	#undef ${UNAME_MACHINE}
-	#undef ${UNAME_MACHINE}el
-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=${UNAME_MACHINE}el
-	#else
-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=${UNAME_MACHINE}
-	#else
-	CPU=
-	#endif
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
-	;;
-    or32:Linux:*:*)
-	echo or32-unknown-linux-gnu
-	exit ;;
-    padre:Linux:*:*)
-	echo sparc-unknown-linux-gnu
-	exit ;;
-    parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-gnu
-	exit ;;
-    parisc:Linux:*:* | hppa:Linux:*:*)
-	# Look for CPU level
-	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
-	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
-	  *)    echo hppa-unknown-linux-gnu ;;
-	esac
-	exit ;;
-    ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-gnu
-	exit ;;
-    ppc:Linux:*:*)
-	echo powerpc-unknown-linux-gnu
-	exit ;;
-    s390:Linux:*:* | s390x:Linux:*:*)
-	echo ${UNAME_MACHINE}-ibm-linux
-	exit ;;
-    sh64*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sh*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    vax:Linux:*:*)
-	echo ${UNAME_MACHINE}-dec-linux-gnu
-	exit ;;
-    x86_64:Linux:*:*)
-	echo x86_64-unknown-linux-gnu
-	exit ;;
-    xtensa*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    i*86:DYNIX/ptx:4*:*)
-	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
-	# earlier versions are messed up and put the nodename in both
-	# sysname and nodename.
-	echo i386-sequent-sysv4
-	exit ;;
-    i*86:UNIX_SV:4.2MP:2.*)
-        # Unixware is an offshoot of SVR4, but it has its own version
-        # number series starting with 2...
-        # I am not positive that other SVR4 systems won't match this,
-	# I just have to hope.  -- rms.
-        # Use sysv4.2uw... so that sysv4* matches it.
-	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
-	exit ;;
-    i*86:OS/2:*:*)
-	# If we were able to find `uname', then EMX Unix compatibility
-	# is probably installed.
-	echo ${UNAME_MACHINE}-pc-os2-emx
-	exit ;;
-    i*86:XTS-300:*:STOP)
-	echo ${UNAME_MACHINE}-unknown-stop
-	exit ;;
-    i*86:atheos:*:*)
-	echo ${UNAME_MACHINE}-unknown-atheos
-	exit ;;
-    i*86:syllable:*:*)
-	echo ${UNAME_MACHINE}-pc-syllable
-	exit ;;
-    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
-	echo i386-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    i*86:*DOS:*:*)
-	echo ${UNAME_MACHINE}-pc-msdosdjgpp
-	exit ;;
-    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
-	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
-	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
-		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
-	else
-		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
-	fi
-	exit ;;
-    i*86:*:5:[678]*)
-    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
-	case `/bin/uname -X | grep "^Machine"` in
-	    *486*)	     UNAME_MACHINE=i486 ;;
-	    *Pentium)	     UNAME_MACHINE=i586 ;;
-	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
-	esac
-	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
-	exit ;;
-    i*86:*:3.2:*)
-	if test -f /usr/options/cb.name; then
-		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
-		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
-	elif /bin/uname -X 2>/dev/null >/dev/null ; then
-		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
-		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
-		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
-			&& UNAME_MACHINE=i586
-		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
-	else
-		echo ${UNAME_MACHINE}-pc-sysv32
-	fi
-	exit ;;
-    pc:*:*:*)
-	# Left here for compatibility:
-        # 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
-	# this is a cross-build.
-	echo i586-pc-msdosdjgpp
-        exit ;;
-    Intel:Mach:3*:*)
-	echo i386-pc-mach3
-	exit ;;
-    paragon:*:*:*)
-	echo i860-intel-osf1
-	exit ;;
-    i860:*:4.*:*) # i860-SVR4
-	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
-	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
-	else # Add other i860-SVR4 vendors below as they are discovered.
-	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
-	fi
-	exit ;;
-    mini*:CTIX:SYS*5:*)
-	# "miniframe"
-	echo m68010-convergent-sysv
-	exit ;;
-    mc68k:UNIX:SYSTEM5:3.51m)
-	echo m68k-convergent-sysv
-	exit ;;
-    M680?0:D-NIX:5.3:*)
-	echo m68k-diab-dnix
-	exit ;;
-    M68*:*:R3V[5678]*:*)
-	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
-    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
-	OS_REL=''
-	test -r /etc/.relid \
-	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-          && { echo i486-ncr-sysv4; exit; } ;;
-    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
-	OS_REL='.3'
-	test -r /etc/.relid \
-	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
-	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
-	echo m68k-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    mc68030:UNIX_System_V:4.*:*)
-	echo m68k-atari-sysv4
-	exit ;;
-    TSUNAMI:LynxOS:2.*:*)
-	echo sparc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    rs6000:LynxOS:2.*:*)
-	echo rs6000-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
-	echo powerpc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    SM[BE]S:UNIX_SV:*:*)
-	echo mips-dde-sysv${UNAME_RELEASE}
-	exit ;;
-    RM*:ReliantUNIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    RM*:SINIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    *:SINIX-*:*:*)
-	if uname -p 2>/dev/null >/dev/null ; then
-		UNAME_MACHINE=`(uname -p) 2>/dev/null`
-		echo ${UNAME_MACHINE}-sni-sysv4
-	else
-		echo ns32k-sni-sysv
-	fi
-	exit ;;
-    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-                      # says <Richard.M.Bartel@ccMail.Census.GOV>
-        echo i586-unisys-sysv4
-        exit ;;
-    *:UNIX_System_V:4*:FTX*)
-	# From Gerald Hewes <hewes@openmarket.com>.
-	# How about differentiating between stratus architectures? -djm
-	echo hppa1.1-stratus-sysv4
-	exit ;;
-    *:*:*:FTX*)
-	# From seanf@swdc.stratus.com.
-	echo i860-stratus-sysv4
-	exit ;;
-    i*86:VOS:*:*)
-	# From Paul.Green@stratus.com.
-	echo ${UNAME_MACHINE}-stratus-vos
-	exit ;;
-    *:VOS:*:*)
-	# From Paul.Green@stratus.com.
-	echo hppa1.1-stratus-vos
-	exit ;;
-    mc68*:A/UX:*:*)
-	echo m68k-apple-aux${UNAME_RELEASE}
-	exit ;;
-    news*:NEWS-OS:6*:*)
-	echo mips-sony-newsos6
-	exit ;;
-    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
-	if [ -d /usr/nec ]; then
-	        echo mips-nec-sysv${UNAME_RELEASE}
-	else
-	        echo mips-unknown-sysv${UNAME_RELEASE}
-	fi
-        exit ;;
-    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
-	echo powerpc-be-beos
-	exit ;;
-    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
-	echo powerpc-apple-beos
-	exit ;;
-    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
-	echo i586-pc-beos
-	exit ;;
-    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
-	echo i586-pc-haiku
-	exit ;;
-    SX-4:SUPER-UX:*:*)
-	echo sx4-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-5:SUPER-UX:*:*)
-	echo sx5-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-6:SUPER-UX:*:*)
-	echo sx6-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-7:SUPER-UX:*:*)
-	echo sx7-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-8:SUPER-UX:*:*)
-	echo sx8-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-8R:SUPER-UX:*:*)
-	echo sx8r-nec-superux${UNAME_RELEASE}
-	exit ;;
-    Power*:Rhapsody:*:*)
-	echo powerpc-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Rhapsody:*:*)
-	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Darwin:*:*)
-	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-	case $UNAME_PROCESSOR in
-	    i386)
-		eval $set_cc_for_build
-		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) | \
-		      grep IS_64BIT_ARCH >/dev/null
-		  then
-		      UNAME_PROCESSOR="x86_64"
-		  fi
-		fi ;;
-	    unknown) UNAME_PROCESSOR=powerpc ;;
-	esac
-	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
-	exit ;;
-    *:procnto*:*:* | *:QNX:[0123456789]*:*)
-	UNAME_PROCESSOR=`uname -p`
-	if test "$UNAME_PROCESSOR" = "x86"; then
-		UNAME_PROCESSOR=i386
-		UNAME_MACHINE=pc
-	fi
-	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
-	exit ;;
-    *:QNX:*:4*)
-	echo i386-pc-qnx
-	exit ;;
-    NSE-?:NONSTOP_KERNEL:*:*)
-	echo nse-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    NSR-?:NONSTOP_KERNEL:*:*)
-	echo nsr-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    *:NonStop-UX:*:*)
-	echo mips-compaq-nonstopux
-	exit ;;
-    BS2000:POSIX*:*:*)
-	echo bs2000-siemens-sysv
-	exit ;;
-    DS/*:UNIX_System_V:*:*)
-	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
-	exit ;;
-    *:Plan9:*:*)
-	# "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
-	    UNAME_MACHINE=i386
-	else
-	    UNAME_MACHINE="$cputype"
-	fi
-	echo ${UNAME_MACHINE}-unknown-plan9
-	exit ;;
-    *:TOPS-10:*:*)
-	echo pdp10-unknown-tops10
-	exit ;;
-    *:TENEX:*:*)
-	echo pdp10-unknown-tenex
-	exit ;;
-    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
-	echo pdp10-dec-tops20
-	exit ;;
-    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
-	echo pdp10-xkl-tops20
-	exit ;;
-    *:TOPS-20:*:*)
-	echo pdp10-unknown-tops20
-	exit ;;
-    *:ITS:*:*)
-	echo pdp10-unknown-its
-	exit ;;
-    SEI:*:*:SEIUX)
-        echo mips-sei-seiux${UNAME_RELEASE}
-	exit ;;
-    *:DragonFly:*:*)
-	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
-	exit ;;
-    *:*VMS:*:*)
-    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
-	case "${UNAME_MACHINE}" in
-	    A*) echo alpha-dec-vms ; exit ;;
-	    I*) echo ia64-dec-vms ; exit ;;
-	    V*) echo vax-dec-vms ; exit ;;
-	esac ;;
-    *:XENIX:*:SysV)
-	echo i386-pc-xenix
-	exit ;;
-    i*86:skyos:*:*)
-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
-	exit ;;
-    i*86:rdos:*:*)
-	echo ${UNAME_MACHINE}-pc-rdos
-	exit ;;
-    i*86:AROS:*:*)
-	echo ${UNAME_MACHINE}-pc-aros
-	exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-          "4"
-#else
-	  ""
-#endif
-         ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
-	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    c34*)
-	echo c34-convex-bsd
-	exit ;;
-    c38*)
-	echo c38-convex-bsd
-	exit ;;
-    c4*)
-	echo c4-convex-bsd
-	exit ;;
-    esac
-fi
-
-cat >&2 <<EOF
-$0: unable to guess system type
-
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
-
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
-and
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches@gnu.org> in order to provide the needed
-information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
-
-hostinfo               = `(hostinfo) 2>/dev/null`
-/bin/universe          = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch              = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
-
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM  = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
-EOF
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/cloog-0.16.3/isl/config.sub b/cloog-0.16.3/isl/config.sub
deleted file mode 100755
index 204218c..0000000
--- a/cloog-0.16.3/isl/config.sub
+++ /dev/null
@@ -1,1731 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-#   Free Software Foundation, Inc.
-
-timestamp='2010-05-21'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# 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
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted GNU ChangeLog entry.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support.  The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help"
-       exit 1 ;;
-
-    *local*)
-       # First pass through any local machine types.
-       echo $1
-       exit ;;
-
-    * )
-       break ;;
-  esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
-    exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
-    exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
-  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
-  knetbsd*-gnu* | netbsd*-gnu* | \
-  kopensolaris*-gnu* | \
-  storm-chaos* | os2-emx* | rtmk-nova*)
-    os=-$maybe_os
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
-    ;;
-  *)
-    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
-    if [ $basic_machine != $1 ]
-    then os=`echo $1 | sed 's/.*-/-/'`
-    else os=; fi
-    ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work.  We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
-	-sun*os*)
-		# Prevent following clause from handling this invalid input.
-		;;
-	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis | -knuth | -cray | -microblaze)
-		os=
-		basic_machine=$1
-		;;
-        -bluegene*)
-	        os=-cnk
-		;;
-	-sim | -cisco | -oki | -wec | -winbond)
-		os=
-		basic_machine=$1
-		;;
-	-scout)
-		;;
-	-wrs)
-		os=-vxworks
-		basic_machine=$1
-		;;
-	-chorusos*)
-		os=-chorusos
-		basic_machine=$1
-		;;
- 	-chorusrdb)
- 		os=-chorusrdb
-		basic_machine=$1
- 		;;
-	-hiux*)
-		os=-hiuxwe2
-		;;
-	-sco6)
-		os=-sco5v6
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5)
-		os=-sco3.2v5
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco4)
-		os=-sco3.2v4
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2.[4-9]*)
-		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2v[4-9]*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5v6*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco*)
-		os=-sco3.2v2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-udk*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-isc)
-		os=-isc2.2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-clix*)
-		basic_machine=clipper-intergraph
-		;;
-	-isc*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-lynx*)
-		os=-lynxos
-		;;
-	-ptx*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
-		;;
-	-windowsnt*)
-		os=`echo $os | sed -e 's/windowsnt/winnt/'`
-		;;
-	-psos*)
-		os=-psos
-		;;
-	-mint | -mint[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
-	# Recognize the basic CPU types without company name.
-	# Some are omitted here because they have special meanings below.
-	1750a | 580 \
-	| a29k \
-	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
-	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
-	| am33_2.0 \
-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
-	| bfin \
-	| c4x | clipper \
-	| d10v | d30v | dlx | dsp16xx \
-	| fido | fr30 | frv \
-	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
-	| i370 | i860 | i960 | ia64 \
-	| ip2k | iq2000 \
-	| lm32 \
-	| m32c | m32r | m32rle | m68000 | m68k | m88k \
-	| maxq | mb | microblaze | mcore | mep | metag \
-	| mips | mipsbe | mipseb | mipsel | mipsle \
-	| mips16 \
-	| mips64 | mips64el \
-	| mips64octeon | mips64octeonel \
-	| mips64orion | mips64orionel \
-	| mips64r5900 | mips64r5900el \
-	| mips64vr | mips64vrel \
-	| mips64vr4100 | mips64vr4100el \
-	| mips64vr4300 | mips64vr4300el \
-	| mips64vr5000 | mips64vr5000el \
-	| mips64vr5900 | mips64vr5900el \
-	| mipsisa32 | mipsisa32el \
-	| mipsisa32r2 | mipsisa32r2el \
-	| mipsisa64 | mipsisa64el \
-	| mipsisa64r2 | mipsisa64r2el \
-	| mipsisa64sb1 | mipsisa64sb1el \
-	| mipsisa64sr71k | mipsisa64sr71kel \
-	| mipstx39 | mipstx39el \
-	| mn10200 | mn10300 \
-	| moxie \
-	| mt \
-	| msp430 \
-	| nios | nios2 \
-	| ns16k | ns32k \
-	| or32 \
-	| pdp10 | pdp11 | pj | pjl \
-	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
-	| pyramid \
-	| rx \
-	| score \
-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
-	| sh64 | sh64le \
-	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
-	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-	| spu | strongarm \
-	| tahoe | thumb | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
-	| ubicom32 \
-	| v850 | v850e \
-	| we32k \
-	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
-	| z8k | z80)
-		basic_machine=$basic_machine-unknown
-		;;
-	c54x)
-		basic_machine=tic54x-unknown
-		;;
-	c55x)
-		basic_machine=tic55x-unknown
-		;;
-	c6x)
-		basic_machine=tic6x-unknown
-		;;
-	m6811 | m68hc11 | m6812 | m68hc12 | picochip)
-		# Motorola 68HC11/12.
-		basic_machine=$basic_machine-unknown
-		os=-none
-		;;
-	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
-		;;
-	ms1)
-		basic_machine=mt-unknown
-		;;
-
-	# We use `pc' rather than `unknown'
-	# because (1) that's what they normally are, and
-	# (2) the word "unknown" tends to confuse beginning users.
-	i*86 | x86_64)
-	  basic_machine=$basic_machine-pc
-	  ;;
-	# Object if more than one company name word.
-	*-*-*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-	# Recognize the basic CPU types with company name.
-	580-* \
-	| a29k-* \
-	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
-	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
-	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
-	| avr-* | avr32-* \
-	| bfin-* | bs2000-* \
-	| c[123]* | c30-* | [cjt]90-* | c4x-* \
-	| clipper-* | craynv-* | cydra-* \
-	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
-	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
-	| h8300-* | h8500-* \
-	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
-	| i*86-* | i860-* | i960-* | ia64-* \
-	| ip2k-* | iq2000-* \
-	| lm32-* \
-	| m32c-* | m32r-* | m32rle-* \
-	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
-	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
-	| mips16-* \
-	| mips64-* | mips64el-* \
-	| mips64octeon-* | mips64octeonel-* \
-	| mips64orion-* | mips64orionel-* \
-	| mips64r5900-* | mips64r5900el-* \
-	| mips64vr-* | mips64vrel-* \
-	| mips64vr4100-* | mips64vr4100el-* \
-	| mips64vr4300-* | mips64vr4300el-* \
-	| mips64vr5000-* | mips64vr5000el-* \
-	| mips64vr5900-* | mips64vr5900el-* \
-	| mipsisa32-* | mipsisa32el-* \
-	| mipsisa32r2-* | mipsisa32r2el-* \
-	| mipsisa64-* | mipsisa64el-* \
-	| mipsisa64r2-* | mipsisa64r2el-* \
-	| mipsisa64sb1-* | mipsisa64sb1el-* \
-	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
-	| mipstx39-* | mipstx39el-* \
-	| mmix-* \
-	| mt-* \
-	| msp430-* \
-	| nios-* | nios2-* \
-	| none-* | np1-* | ns16k-* | ns32k-* \
-	| orion-* \
-	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
-	| pyramid-* \
-	| romp-* | rs6000-* | rx-* \
-	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
-	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
-	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
-	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
-	| tahoe-* | thumb-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
-	| tile-* | tilegx-* \
-	| tron-* \
-	| ubicom32-* \
-	| v850-* | v850e-* | vax-* \
-	| we32k-* \
-	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
-	| xstormy16-* | xtensa*-* \
-	| ymp-* \
-	| z8k-* | z80-*)
-		;;
-	# Recognize the basic CPU types without company name, with glob match.
-	xtensa*)
-		basic_machine=$basic_machine-unknown
-		;;
-	# Recognize the various machine names and aliases which stand
-	# for a CPU type and a company and sometimes even an OS.
-	386bsd)
-		basic_machine=i386-unknown
-		os=-bsd
-		;;
-	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
-		basic_machine=m68000-att
-		;;
-	3b*)
-		basic_machine=we32k-att
-		;;
-	a29khif)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-    	abacus)
-		basic_machine=abacus-unknown
-		;;
-	adobe68k)
-		basic_machine=m68010-adobe
-		os=-scout
-		;;
-	alliant | fx80)
-		basic_machine=fx80-alliant
-		;;
-	altos | altos3068)
-		basic_machine=m68k-altos
-		;;
-	am29k)
-		basic_machine=a29k-none
-		os=-bsd
-		;;
-	amd64)
-		basic_machine=x86_64-pc
-		;;
-	amd64-*)
-		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	amdahl)
-		basic_machine=580-amdahl
-		os=-sysv
-		;;
-	amiga | amiga-*)
-		basic_machine=m68k-unknown
-		;;
-	amigaos | amigados)
-		basic_machine=m68k-unknown
-		os=-amigaos
-		;;
-	amigaunix | amix)
-		basic_machine=m68k-unknown
-		os=-sysv4
-		;;
-	apollo68)
-		basic_machine=m68k-apollo
-		os=-sysv
-		;;
-	apollo68bsd)
-		basic_machine=m68k-apollo
-		os=-bsd
-		;;
-	aros)
-		basic_machine=i386-pc
-		os=-aros
-		;;
-	aux)
-		basic_machine=m68k-apple
-		os=-aux
-		;;
-	balance)
-		basic_machine=ns32k-sequent
-		os=-dynix
-		;;
-	blackfin)
-		basic_machine=bfin-unknown
-		os=-linux
-		;;
-	blackfin-*)
-		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	bluegene*)
-		basic_machine=powerpc-ibm
-		os=-cnk
-		;;
-	c54x-*)
-		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c55x-*)
-		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c6x-*)
-		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c90)
-		basic_machine=c90-cray
-		os=-unicos
-		;;
-        cegcc)
-		basic_machine=arm-unknown
-		os=-cegcc
-		;;
-	convex-c1)
-		basic_machine=c1-convex
-		os=-bsd
-		;;
-	convex-c2)
-		basic_machine=c2-convex
-		os=-bsd
-		;;
-	convex-c32)
-		basic_machine=c32-convex
-		os=-bsd
-		;;
-	convex-c34)
-		basic_machine=c34-convex
-		os=-bsd
-		;;
-	convex-c38)
-		basic_machine=c38-convex
-		os=-bsd
-		;;
-	cray | j90)
-		basic_machine=j90-cray
-		os=-unicos
-		;;
-	craynv)
-		basic_machine=craynv-cray
-		os=-unicosmp
-		;;
-	cr16)
-		basic_machine=cr16-unknown
-		os=-elf
-		;;
-	crds | unos)
-		basic_machine=m68k-crds
-		;;
-	crisv32 | crisv32-* | etraxfs*)
-		basic_machine=crisv32-axis
-		;;
-	cris | cris-* | etrax*)
-		basic_machine=cris-axis
-		;;
-	crx)
-		basic_machine=crx-unknown
-		os=-elf
-		;;
-	da30 | da30-*)
-		basic_machine=m68k-da30
-		;;
-	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
-		basic_machine=mips-dec
-		;;
-	decsystem10* | dec10*)
-		basic_machine=pdp10-dec
-		os=-tops10
-		;;
-	decsystem20* | dec20*)
-		basic_machine=pdp10-dec
-		os=-tops20
-		;;
-	delta | 3300 | motorola-3300 | motorola-delta \
-	      | 3300-motorola | delta-motorola)
-		basic_machine=m68k-motorola
-		;;
-	delta88)
-		basic_machine=m88k-motorola
-		os=-sysv3
-		;;
-	dicos)
-		basic_machine=i686-pc
-		os=-dicos
-		;;
-	djgpp)
-		basic_machine=i586-pc
-		os=-msdosdjgpp
-		;;
-	dpx20 | dpx20-*)
-		basic_machine=rs6000-bull
-		os=-bosx
-		;;
-	dpx2* | dpx2*-bull)
-		basic_machine=m68k-bull
-		os=-sysv3
-		;;
-	ebmon29k)
-		basic_machine=a29k-amd
-		os=-ebmon
-		;;
-	elxsi)
-		basic_machine=elxsi-elxsi
-		os=-bsd
-		;;
-	encore | umax | mmax)
-		basic_machine=ns32k-encore
-		;;
-	es1800 | OSE68k | ose68k | ose | OSE)
-		basic_machine=m68k-ericsson
-		os=-ose
-		;;
-	fx2800)
-		basic_machine=i860-alliant
-		;;
-	genix)
-		basic_machine=ns32k-ns
-		;;
-	gmicro)
-		basic_machine=tron-gmicro
-		os=-sysv
-		;;
-	go32)
-		basic_machine=i386-pc
-		os=-go32
-		;;
-	h3050r* | hiux*)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	h8300hms)
-		basic_machine=h8300-hitachi
-		os=-hms
-		;;
-	h8300xray)
-		basic_machine=h8300-hitachi
-		os=-xray
-		;;
-	h8500hms)
-		basic_machine=h8500-hitachi
-		os=-hms
-		;;
-	harris)
-		basic_machine=m88k-harris
-		os=-sysv3
-		;;
-	hp300-*)
-		basic_machine=m68k-hp
-		;;
-	hp300bsd)
-		basic_machine=m68k-hp
-		os=-bsd
-		;;
-	hp300hpux)
-		basic_machine=m68k-hp
-		os=-hpux
-		;;
-	hp3k9[0-9][0-9] | hp9[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k2[0-9][0-9] | hp9k31[0-9])
-		basic_machine=m68000-hp
-		;;
-	hp9k3[2-9][0-9])
-		basic_machine=m68k-hp
-		;;
-	hp9k6[0-9][0-9] | hp6[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k7[0-79][0-9] | hp7[0-79][0-9])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k78[0-9] | hp78[0-9])
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][13679] | hp8[0-9][13679])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][0-9] | hp8[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hppa-next)
-		os=-nextstep3
-		;;
-	hppaosf)
-		basic_machine=hppa1.1-hp
-		os=-osf
-		;;
-	hppro)
-		basic_machine=hppa1.1-hp
-		os=-proelf
-		;;
-	i370-ibm* | ibm*)
-		basic_machine=i370-ibm
-		;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
-	i*86v32)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv32
-		;;
-	i*86v4*)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv4
-		;;
-	i*86v)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv
-		;;
-	i*86sol2)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-solaris2
-		;;
-	i386mach)
-		basic_machine=i386-mach
-		os=-mach
-		;;
-	i386-vsta | vsta)
-		basic_machine=i386-unknown
-		os=-vsta
-		;;
-	iris | iris4d)
-		basic_machine=mips-sgi
-		case $os in
-		    -irix*)
-			;;
-		    *)
-			os=-irix4
-			;;
-		esac
-		;;
-	isi68 | isi)
-		basic_machine=m68k-isi
-		os=-sysv
-		;;
-	m68knommu)
-		basic_machine=m68k-unknown
-		os=-linux
-		;;
-	m68knommu-*)
-		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	m88k-omron*)
-		basic_machine=m88k-omron
-		;;
-	magnum | m3230)
-		basic_machine=mips-mips
-		os=-sysv
-		;;
-	merlin)
-		basic_machine=ns32k-utek
-		os=-sysv
-		;;
-        microblaze)
-		basic_machine=microblaze-xilinx
-		;;
-	mingw32)
-		basic_machine=i386-pc
-		os=-mingw32
-		;;
-	mingw32ce)
-		basic_machine=arm-unknown
-		os=-mingw32ce
-		;;
-	miniframe)
-		basic_machine=m68000-convergent
-		;;
-	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-	mips3*-*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
-		;;
-	mips3*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
-		;;
-	monitor)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	morphos)
-		basic_machine=powerpc-unknown
-		os=-morphos
-		;;
-	msdos)
-		basic_machine=i386-pc
-		os=-msdos
-		;;
-	ms1-*)
-		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
-		;;
-	mvs)
-		basic_machine=i370-ibm
-		os=-mvs
-		;;
-	ncr3000)
-		basic_machine=i486-ncr
-		os=-sysv4
-		;;
-	netbsd386)
-		basic_machine=i386-unknown
-		os=-netbsd
-		;;
-	netwinder)
-		basic_machine=armv4l-rebel
-		os=-linux
-		;;
-	news | news700 | news800 | news900)
-		basic_machine=m68k-sony
-		os=-newsos
-		;;
-	news1000)
-		basic_machine=m68030-sony
-		os=-newsos
-		;;
-	news-3600 | risc-news)
-		basic_machine=mips-sony
-		os=-newsos
-		;;
-	necv70)
-		basic_machine=v70-nec
-		os=-sysv
-		;;
-	next | m*-next )
-		basic_machine=m68k-next
-		case $os in
-		    -nextstep* )
-			;;
-		    -ns2*)
-		      os=-nextstep2
-			;;
-		    *)
-		      os=-nextstep3
-			;;
-		esac
-		;;
-	nh3000)
-		basic_machine=m68k-harris
-		os=-cxux
-		;;
-	nh[45]000)
-		basic_machine=m88k-harris
-		os=-cxux
-		;;
-	nindy960)
-		basic_machine=i960-intel
-		os=-nindy
-		;;
-	mon960)
-		basic_machine=i960-intel
-		os=-mon960
-		;;
-	nonstopux)
-		basic_machine=mips-compaq
-		os=-nonstopux
-		;;
-	np1)
-		basic_machine=np1-gould
-		;;
-	nsr-tandem)
-		basic_machine=nsr-tandem
-		;;
-	op50n-* | op60c-*)
-		basic_machine=hppa1.1-oki
-		os=-proelf
-		;;
-	openrisc | openrisc-*)
-		basic_machine=or32-unknown
-		;;
-	os400)
-		basic_machine=powerpc-ibm
-		os=-os400
-		;;
-	OSE68000 | ose68000)
-		basic_machine=m68000-ericsson
-		os=-ose
-		;;
-	os68k)
-		basic_machine=m68k-none
-		os=-os68k
-		;;
-	pa-hitachi)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	paragon)
-		basic_machine=i860-intel
-		os=-osf
-		;;
-	parisc)
-		basic_machine=hppa-unknown
-		os=-linux
-		;;
-	parisc-*)
-		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	pbd)
-		basic_machine=sparc-tti
-		;;
-	pbb)
-		basic_machine=m68k-tti
-		;;
-	pc532 | pc532-*)
-		basic_machine=ns32k-pc532
-		;;
-	pc98)
-		basic_machine=i386-pc
-		;;
-	pc98-*)
-		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium | p5 | k5 | k6 | nexgen | viac3)
-		basic_machine=i586-pc
-		;;
-	pentiumpro | p6 | 6x86 | athlon | athlon_*)
-		basic_machine=i686-pc
-		;;
-	pentiumii | pentium2 | pentiumiii | pentium3)
-		basic_machine=i686-pc
-		;;
-	pentium4)
-		basic_machine=i786-pc
-		;;
-	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
-		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumpro-* | p6-* | 6x86-* | athlon-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium4-*)
-		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pn)
-		basic_machine=pn-gould
-		;;
-	power)	basic_machine=power-ibm
-		;;
-	ppc)	basic_machine=powerpc-unknown
-		;;
-	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppcle | powerpclittle | ppc-le | powerpc-little)
-		basic_machine=powerpcle-unknown
-		;;
-	ppcle-* | powerpclittle-*)
-		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64)	basic_machine=powerpc64-unknown
-		;;
-	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
-		basic_machine=powerpc64le-unknown
-		;;
-	ppc64le-* | powerpc64little-*)
-		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ps2)
-		basic_machine=i386-ibm
-		;;
-	pw32)
-		basic_machine=i586-unknown
-		os=-pw32
-		;;
-	rdos)
-		basic_machine=i386-pc
-		os=-rdos
-		;;
-	rom68k)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	rm[46]00)
-		basic_machine=mips-siemens
-		;;
-	rtpc | rtpc-*)
-		basic_machine=romp-ibm
-		;;
-	s390 | s390-*)
-		basic_machine=s390-ibm
-		;;
-	s390x | s390x-*)
-		basic_machine=s390x-ibm
-		;;
-	sa29200)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	sb1)
-		basic_machine=mipsisa64sb1-unknown
-		;;
-	sb1el)
-		basic_machine=mipsisa64sb1el-unknown
-		;;
-	sde)
-		basic_machine=mipsisa32-sde
-		os=-elf
-		;;
-	sei)
-		basic_machine=mips-sei
-		os=-seiux
-		;;
-	sequent)
-		basic_machine=i386-sequent
-		;;
-	sh)
-		basic_machine=sh-hitachi
-		os=-hms
-		;;
-	sh5el)
-		basic_machine=sh5le-unknown
-		;;
-	sh64)
-		basic_machine=sh64-unknown
-		;;
-	sparclite-wrs | simso-wrs)
-		basic_machine=sparclite-wrs
-		os=-vxworks
-		;;
-	sps7)
-		basic_machine=m68k-bull
-		os=-sysv2
-		;;
-	spur)
-		basic_machine=spur-unknown
-		;;
-	st2000)
-		basic_machine=m68k-tandem
-		;;
-	stratus)
-		basic_machine=i860-stratus
-		os=-sysv4
-		;;
-	sun2)
-		basic_machine=m68000-sun
-		;;
-	sun2os3)
-		basic_machine=m68000-sun
-		os=-sunos3
-		;;
-	sun2os4)
-		basic_machine=m68000-sun
-		os=-sunos4
-		;;
-	sun3os3)
-		basic_machine=m68k-sun
-		os=-sunos3
-		;;
-	sun3os4)
-		basic_machine=m68k-sun
-		os=-sunos4
-		;;
-	sun4os3)
-		basic_machine=sparc-sun
-		os=-sunos3
-		;;
-	sun4os4)
-		basic_machine=sparc-sun
-		os=-sunos4
-		;;
-	sun4sol2)
-		basic_machine=sparc-sun
-		os=-solaris2
-		;;
-	sun3 | sun3-*)
-		basic_machine=m68k-sun
-		;;
-	sun4)
-		basic_machine=sparc-sun
-		;;
-	sun386 | sun386i | roadrunner)
-		basic_machine=i386-sun
-		;;
-	sv1)
-		basic_machine=sv1-cray
-		os=-unicos
-		;;
-	symmetry)
-		basic_machine=i386-sequent
-		os=-dynix
-		;;
-	t3e)
-		basic_machine=alphaev5-cray
-		os=-unicos
-		;;
-	t90)
-		basic_machine=t90-cray
-		os=-unicos
-		;;
-        # This must be matched before tile*.
-        tilegx*)
-		basic_machine=tilegx-unknown
-		os=-linux-gnu
-		;;
-	tile*)
-		basic_machine=tile-unknown
-		os=-linux-gnu
-		;;
-	tx39)
-		basic_machine=mipstx39-unknown
-		;;
-	tx39el)
-		basic_machine=mipstx39el-unknown
-		;;
-	toad1)
-		basic_machine=pdp10-xkl
-		os=-tops20
-		;;
-	tower | tower-32)
-		basic_machine=m68k-ncr
-		;;
-	tpf)
-		basic_machine=s390x-ibm
-		os=-tpf
-		;;
-	udi29k)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	ultra3)
-		basic_machine=a29k-nyu
-		os=-sym1
-		;;
-	v810 | necv810)
-		basic_machine=v810-nec
-		os=-none
-		;;
-	vaxv)
-		basic_machine=vax-dec
-		os=-sysv
-		;;
-	vms)
-		basic_machine=vax-dec
-		os=-vms
-		;;
-	vpp*|vx|vx-*)
-		basic_machine=f301-fujitsu
-		;;
-	vxworks960)
-		basic_machine=i960-wrs
-		os=-vxworks
-		;;
-	vxworks68)
-		basic_machine=m68k-wrs
-		os=-vxworks
-		;;
-	vxworks29k)
-		basic_machine=a29k-wrs
-		os=-vxworks
-		;;
-	w65*)
-		basic_machine=w65-wdc
-		os=-none
-		;;
-	w89k-*)
-		basic_machine=hppa1.1-winbond
-		os=-proelf
-		;;
-	xbox)
-		basic_machine=i686-pc
-		os=-mingw32
-		;;
-	xps | xps100)
-		basic_machine=xps100-honeywell
-		;;
-	ymp)
-		basic_machine=ymp-cray
-		os=-unicos
-		;;
-	z8k-*-coff)
-		basic_machine=z8k-unknown
-		os=-sim
-		;;
-	z80-*-coff)
-		basic_machine=z80-unknown
-		os=-sim
-		;;
-	none)
-		basic_machine=none-none
-		os=-none
-		;;
-
-# Here we handle the default manufacturer of certain CPU types.  It is in
-# some cases the only manufacturer, in others, it is the most popular.
-	w89k)
-		basic_machine=hppa1.1-winbond
-		;;
-	op50n)
-		basic_machine=hppa1.1-oki
-		;;
-	op60c)
-		basic_machine=hppa1.1-oki
-		;;
-	romp)
-		basic_machine=romp-ibm
-		;;
-	mmix)
-		basic_machine=mmix-knuth
-		;;
-	rs6000)
-		basic_machine=rs6000-ibm
-		;;
-	vax)
-		basic_machine=vax-dec
-		;;
-	pdp10)
-		# there are many clones, so DEC is not a safe bet
-		basic_machine=pdp10-unknown
-		;;
-	pdp11)
-		basic_machine=pdp11-dec
-		;;
-	we32k)
-		basic_machine=we32k-att
-		;;
-	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
-		basic_machine=sh-unknown
-		;;
-	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
-		basic_machine=sparc-sun
-		;;
-	cydra)
-		basic_machine=cydra-cydrome
-		;;
-	orion)
-		basic_machine=orion-highlevel
-		;;
-	orion105)
-		basic_machine=clipper-highlevel
-		;;
-	mac | mpw | mac-mpw)
-		basic_machine=m68k-apple
-		;;
-	pmac | pmac-mpw)
-		basic_machine=powerpc-apple
-		;;
-	*-unknown)
-		# Make sure to match an already-canonicalized machine name.
-		;;
-	*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
-	*-digital*)
-		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
-		;;
-	*-commodore*)
-		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
-		;;
-	*)
-		;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
-        # First match some system type aliases
-        # that might get confused with valid system types.
-	# -solaris* is a basic system type, with this one exception.
-        -auroraux)
-	        os=-auroraux
-		;;
-	-solaris1 | -solaris1.*)
-		os=`echo $os | sed -e 's|solaris1|sunos4|'`
-		;;
-	-solaris)
-		os=-solaris2
-		;;
-	-svr4*)
-		os=-sysv4
-		;;
-	-unixware*)
-		os=-sysv4.2uw
-		;;
-	-gnu/linux*)
-		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
-		;;
-	# First accept the basic system types.
-	# The portable systems comes first.
-	# Each alternative MUST END IN A *, to match a version number.
-	# -sysv* is not here because it comes later, after sysvr4.
-	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
-	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
-	      | -sym* | -kopensolaris* \
-	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* | -aros* \
-	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
-	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
-	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -openbsd* | -solidbsd* \
-	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
-	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
-	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
-	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-	      | -chorusos* | -chorusrdb* | -cegcc* \
-	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -linux-android* \
-	      | -linux-newlib* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
-	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
-	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
-	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
-	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
-	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
-	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
-	# Remember, each alternative MUST END IN *, to match a version number.
-		;;
-	-qnx*)
-		case $basic_machine in
-		    x86-* | i*86-*)
-			;;
-		    *)
-			os=-nto$os
-			;;
-		esac
-		;;
-	-nto-qnx*)
-		;;
-	-nto*)
-		os=`echo $os | sed -e 's|nto|nto-qnx|'`
-		;;
-	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
-	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
-	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
-		;;
-	-mac*)
-		os=`echo $os | sed -e 's|mac|macos|'`
-		;;
-	-linux-dietlibc)
-		os=-linux-dietlibc
-		;;
-	-linux*)
-		os=`echo $os | sed -e 's|linux|linux-gnu|'`
-		;;
-	-sunos5*)
-		os=`echo $os | sed -e 's|sunos5|solaris2|'`
-		;;
-	-sunos6*)
-		os=`echo $os | sed -e 's|sunos6|solaris3|'`
-		;;
-	-opened*)
-		os=-openedition
-		;;
-        -os400*)
-		os=-os400
-		;;
-	-wince*)
-		os=-wince
-		;;
-	-osfrose*)
-		os=-osfrose
-		;;
-	-osf*)
-		os=-osf
-		;;
-	-utek*)
-		os=-bsd
-		;;
-	-dynix*)
-		os=-bsd
-		;;
-	-acis*)
-		os=-aos
-		;;
-	-atheos*)
-		os=-atheos
-		;;
-	-syllable*)
-		os=-syllable
-		;;
-	-386bsd)
-		os=-bsd
-		;;
-	-ctix* | -uts*)
-		os=-sysv
-		;;
-	-nova*)
-		os=-rtmk-nova
-		;;
-	-ns2 )
-		os=-nextstep2
-		;;
-	-nsk*)
-		os=-nsk
-		;;
-	# Preserve the version number of sinix5.
-	-sinix5.*)
-		os=`echo $os | sed -e 's|sinix|sysv|'`
-		;;
-	-sinix*)
-		os=-sysv4
-		;;
-        -tpf*)
-		os=-tpf
-		;;
-	-triton*)
-		os=-sysv3
-		;;
-	-oss*)
-		os=-sysv3
-		;;
-	-svr4)
-		os=-sysv4
-		;;
-	-svr3)
-		os=-sysv3
-		;;
-	-sysvr4)
-		os=-sysv4
-		;;
-	# This must come after -sysvr4.
-	-sysv*)
-		;;
-	-ose*)
-		os=-ose
-		;;
-	-es1800*)
-		os=-ose
-		;;
-	-xenix)
-		os=-xenix
-		;;
-	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-		os=-mint
-		;;
-	-aros*)
-		os=-aros
-		;;
-	-kaos*)
-		os=-kaos
-		;;
-	-zvmoe)
-		os=-zvmoe
-		;;
-	-dicos*)
-		os=-dicos
-		;;
-        -nacl*)
-	        ;;
-	-none)
-		;;
-	*)
-		# Get rid of the `-' at the beginning of $os.
-		os=`echo $os | sed 's/[^-]*-//'`
-		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
-		exit 1
-		;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system.  Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
-        score-*)
-		os=-elf
-		;;
-        spu-*)
-		os=-elf
-		;;
-	*-acorn)
-		os=-riscix1.2
-		;;
-	arm*-rebel)
-		os=-linux
-		;;
-	arm*-semi)
-		os=-aout
-		;;
-        c4x-* | tic4x-*)
-        	os=-coff
-		;;
-	tic54x-*)
-		os=-coff
-		;;
-	tic55x-*)
-		os=-coff
-		;;
-	tic6x-*)
-		os=-coff
-		;;
-	# This must come before the *-dec entry.
-	pdp10-*)
-		os=-tops20
-		;;
-	pdp11-*)
-		os=-none
-		;;
-	*-dec | vax-*)
-		os=-ultrix4.2
-		;;
-	m68*-apollo)
-		os=-domain
-		;;
-	i386-sun)
-		os=-sunos4.0.2
-		;;
-	m68000-sun)
-		os=-sunos3
-		# This also exists in the configure program, but was not the
-		# default.
-		# os=-sunos4
-		;;
-	m68*-cisco)
-		os=-aout
-		;;
-        mep-*)
-		os=-elf
-		;;
-	mips*-cisco)
-		os=-elf
-		;;
-	mips*-*)
-		os=-elf
-		;;
-	or32-*)
-		os=-coff
-		;;
-	*-tti)	# must be before sparc entry or we get the wrong os.
-		os=-sysv3
-		;;
-	sparc-* | *-sun)
-		os=-sunos4.1.1
-		;;
-	*-be)
-		os=-beos
-		;;
-	*-haiku)
-		os=-haiku
-		;;
-	*-ibm)
-		os=-aix
-		;;
-    	*-knuth)
-		os=-mmixware
-		;;
-	*-wec)
-		os=-proelf
-		;;
-	*-winbond)
-		os=-proelf
-		;;
-	*-oki)
-		os=-proelf
-		;;
-	*-hp)
-		os=-hpux
-		;;
-	*-hitachi)
-		os=-hiux
-		;;
-	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
-		os=-sysv
-		;;
-	*-cbm)
-		os=-amigaos
-		;;
-	*-dg)
-		os=-dgux
-		;;
-	*-dolphin)
-		os=-sysv3
-		;;
-	m68k-ccur)
-		os=-rtu
-		;;
-	m88k-omron*)
-		os=-luna
-		;;
-	*-next )
-		os=-nextstep
-		;;
-	*-sequent)
-		os=-ptx
-		;;
-	*-crds)
-		os=-unos
-		;;
-	*-ns)
-		os=-genix
-		;;
-	i370-*)
-		os=-mvs
-		;;
-	*-next)
-		os=-nextstep3
-		;;
-	*-gould)
-		os=-sysv
-		;;
-	*-highlevel)
-		os=-bsd
-		;;
-	*-encore)
-		os=-bsd
-		;;
-	*-sgi)
-		os=-irix
-		;;
-	*-siemens)
-		os=-sysv4
-		;;
-	*-masscomp)
-		os=-rtu
-		;;
-	f30[01]-fujitsu | f700-fujitsu)
-		os=-uxpv
-		;;
-	*-rom68k)
-		os=-coff
-		;;
-	*-*bug)
-		os=-coff
-		;;
-	*-apple)
-		os=-macos
-		;;
-	*-atari*)
-		os=-mint
-		;;
-	*)
-		os=-none
-		;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer.  We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
-	*-unknown)
-		case $os in
-			-riscix*)
-				vendor=acorn
-				;;
-			-sunos*)
-				vendor=sun
-				;;
-			-cnk*|-aix*)
-				vendor=ibm
-				;;
-			-beos*)
-				vendor=be
-				;;
-			-hpux*)
-				vendor=hp
-				;;
-			-mpeix*)
-				vendor=hp
-				;;
-			-hiux*)
-				vendor=hitachi
-				;;
-			-unos*)
-				vendor=crds
-				;;
-			-dgux*)
-				vendor=dg
-				;;
-			-luna*)
-				vendor=omron
-				;;
-			-genix*)
-				vendor=ns
-				;;
-			-mvs* | -opened*)
-				vendor=ibm
-				;;
-			-os400*)
-				vendor=ibm
-				;;
-			-ptx*)
-				vendor=sequent
-				;;
-			-tpf*)
-				vendor=ibm
-				;;
-			-vxsim* | -vxworks* | -windiss*)
-				vendor=wrs
-				;;
-			-aux*)
-				vendor=apple
-				;;
-			-hms*)
-				vendor=hitachi
-				;;
-			-mpw* | -macos*)
-				vendor=apple
-				;;
-			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-				vendor=atari
-				;;
-			-vos*)
-				vendor=stratus
-				;;
-		esac
-		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
-		;;
-esac
-
-echo $basic_machine$os
-exit
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/cloog-0.16.3/isl/configure b/cloog-0.16.3/isl/configure
deleted file mode 100755
index 4b7f26e..0000000
--- a/cloog-0.16.3/isl/configure
+++ /dev/null
@@ -1,15960 +0,0 @@
-#! /bin/sh
-# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.65 for isl 0.07.
-#
-# Report bugs to <isl-development@googlegroups.com>.
-#
-#
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
-#
-#
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
-      PATH_SEPARATOR=';'
-  }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-case $0 in #((
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-  done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test "x$CONFIG_SHELL" = x; then
-  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '\${1+\"\$@\"}'='\"\$@\"'
-  setopt NO_GLOB_SUBST
-else
-  case \`(set -o) 2>/dev/null\` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-"
-  as_required="as_fn_return () { (exit \$1); }
-as_fn_success () { as_fn_return 0; }
-as_fn_failure () { as_fn_return 1; }
-as_fn_ret_success () { return 0; }
-as_fn_ret_failure () { return 1; }
-
-exitcode=0
-as_fn_success || { exitcode=1; echo as_fn_success failed.; }
-as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
-as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
-as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
-
-else
-  exitcode=1; echo positional parameters were not saved.
-fi
-test x\$exitcode = x0 || exit 1"
-  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
-  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
-  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
-  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
-
-  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
-    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
-    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
-    PATH=/empty FPATH=/empty; export PATH FPATH
-    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
-      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
-test \$(( 1 + 1 )) = 2 || exit 1"
-  if (eval "$as_required") 2>/dev/null; then :
-  as_have_required=yes
-else
-  as_have_required=no
-fi
-  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
-
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_found=false
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  as_found=:
-  case $as_dir in #(
-	 /*)
-	   for as_base in sh bash ksh sh5; do
-	     # Try only shells that exist, to save several forks.
-	     as_shell=$as_dir/$as_base
-	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
-		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
-  CONFIG_SHELL=$as_shell as_have_required=yes
-		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
-  break 2
-fi
-fi
-	   done;;
-       esac
-  as_found=false
-done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
-	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
-  CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
-IFS=$as_save_IFS
-
-
-      if test "x$CONFIG_SHELL" != x; then :
-  # We cannot yet assume a decent shell, so we have to provide a
-	# neutralization value for shells without unset; and this also
-	# works around shells that cannot unset nonexistent variables.
-	BASH_ENV=/dev/null
-	ENV=/dev/null
-	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-	export CONFIG_SHELL
-	exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
-fi
-
-    if test x$as_have_required = xno; then :
-  $as_echo "$0: This script requires a shell more modern than all"
-  $as_echo "$0: the shells that I found on your system."
-  if test x${ZSH_VERSION+set} = xset ; then
-    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
-    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
-  else
-    $as_echo "$0: Please tell bug-autoconf@gnu.org and
-$0: isl-development@googlegroups.com about your system,
-$0: including any error possibly output before this
-$0: message. Then install a modern shell, or manually run
-$0: the script under such a shell if you do have one."
-  fi
-  exit 1
-fi
-fi
-fi
-SHELL=${CONFIG_SHELL-/bin/sh}
-export SHELL
-# Unset more variables known to interfere with behavior of common tools.
-CLICOLOR_FORCE= GREP_OPTIONS=
-unset CLICOLOR_FORCE GREP_OPTIONS
-
-## --------------------- ##
-## M4sh Shell Functions. ##
-## --------------------- ##
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
-  { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
-  return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
-  set +e
-  as_fn_set_status $1
-  exit $1
-} # as_fn_exit
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || eval $as_mkdir_p || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
-  eval 'as_fn_append ()
-  {
-    eval $1+=\$2
-  }'
-else
-  as_fn_append ()
-  {
-    eval $1=\$$1\$2
-  }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
-  eval 'as_fn_arith ()
-  {
-    as_val=$(( $* ))
-  }'
-else
-  as_fn_arith ()
-  {
-    as_val=`expr "$@" || test $? -eq 1`
-  }
-fi # as_fn_arith
-
-
-# as_fn_error ERROR [LINENO LOG_FD]
-# ---------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with status $?, using 1 if that was 0.
-as_fn_error ()
-{
-  as_status=$?; test $as_status -eq 0 && as_status=1
-  if test "$3"; then
-    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
-  fi
-  $as_echo "$as_me: error: $1" >&2
-  as_fn_exit $as_status
-} # as_fn_error
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-
-  as_lineno_1=$LINENO as_lineno_1a=$LINENO
-  as_lineno_2=$LINENO as_lineno_2a=$LINENO
-  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
-  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
-  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
-  sed -n '
-    p
-    /[$]LINENO/=
-  ' <$as_myself |
-    sed '
-      s/[$]LINENO.*/&-/
-      t lineno
-      b
-      :lineno
-      N
-      :loop
-      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
-      t loop
-      s/-\n.*//
-    ' >$as_me.lineno &&
-  chmod +x "$as_me.lineno" ||
-    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
-
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensitive to this).
-  . "./$as_me.lineno"
-  # Exit status is that of the last command.
-  exit
-}
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
-  case `echo 'xy\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  xy)  ECHO_C='\c';;
-  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
-       ECHO_T='	';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
-  if ln -s conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s='ln -s'
-    # ... but there are two gotchas:
-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
-  elif ln conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s=ln
-  else
-    as_ln_s='cp -p'
-  fi
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p='mkdir -p "$as_dir"'
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-	test -d "$1/.";
-      else
-	case $1 in #(
-	-*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-
-test -n "$DJDIR" || exec 7<&0 </dev/null
-exec 6>&1
-
-# Name of the host.
-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
-# so uname gets run too.
-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
-#
-# Initializations.
-#
-ac_default_prefix=/usr/local
-ac_clean_files=
-ac_config_libobj_dir=.
-LIBOBJS=
-cross_compiling=no
-subdirs=
-MFLAGS=
-MAKEFLAGS=
-
-# Identity of this package.
-PACKAGE_NAME='isl'
-PACKAGE_TARNAME='isl'
-PACKAGE_VERSION='0.07'
-PACKAGE_STRING='isl 0.07'
-PACKAGE_BUGREPORT='isl-development@googlegroups.com'
-PACKAGE_URL=''
-
-# Factoring default headers for most tests.
-ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#ifdef STDC_HEADERS
-# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-#  include <stdlib.h>
-# endif
-#endif
-#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-#  include <memory.h>
-# endif
-# include <string.h>
-#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-#ifdef HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif"
-
-ac_subst_vars='am__EXEEXT_FALSE
-am__EXEEXT_TRUE
-LTLIBOBJS
-LIBOBJS
-GIT_HEAD_VERSION
-GIT_HEAD
-GIT_HEAD_ID
-pkgconfig_libfile
-pkgconfig_libdir
-WARNING_FLAGS
-HAVE_PIPLIB_FALSE
-HAVE_PIPLIB_TRUE
-PIPLIB_LIBS
-PIPLIB_LDFLAGS
-PIPLIB_CPPFLAGS
-NEED_GET_MEMORY_FUNCTIONS_FALSE
-NEED_GET_MEMORY_FUNCTIONS_TRUE
-GMP_LDFLAGS
-GMP_CPPFLAGS
-GENERATE_DOC_FALSE
-GENERATE_DOC_TRUE
-POD2HTML
-PDFLATEX
-PERL
-CPP
-OTOOL64
-OTOOL
-LIPO
-NMEDIT
-DSYMUTIL
-RANLIB
-AR
-OBJDUMP
-LN_S
-NM
-ac_ct_DUMPBIN
-DUMPBIN
-LD
-FGREP
-EGREP
-GREP
-SED
-LIBTOOL
-PRTDIAG
-host_os
-host_vendor
-host_cpu
-host
-build_os
-build_vendor
-build_cpu
-build
-am__fastdepCC_FALSE
-am__fastdepCC_TRUE
-CCDEPMODE
-AMDEPBACKSLASH
-AMDEP_FALSE
-AMDEP_TRUE
-am__quote
-am__include
-DEPDIR
-OBJEXT
-EXEEXT
-ac_ct_CC
-CPPFLAGS
-LDFLAGS
-CFLAGS
-CC
-versioninfo
-AM_BACKSLASH
-AM_DEFAULT_VERBOSITY
-am__untar
-am__tar
-AMTAR
-am__leading_dot
-SET_MAKE
-AWK
-mkdir_p
-MKDIR_P
-INSTALL_STRIP_PROGRAM
-STRIP
-install_sh
-MAKEINFO
-AUTOHEADER
-AUTOMAKE
-AUTOCONF
-ACLOCAL
-VERSION
-PACKAGE
-CYGPATH_W
-am__isrc
-INSTALL_DATA
-INSTALL_SCRIPT
-INSTALL_PROGRAM
-target_alias
-host_alias
-build_alias
-LIBS
-ECHO_T
-ECHO_N
-ECHO_C
-DEFS
-mandir
-localedir
-libdir
-psdir
-pdfdir
-dvidir
-htmldir
-infodir
-docdir
-oldincludedir
-includedir
-localstatedir
-sharedstatedir
-sysconfdir
-datadir
-datarootdir
-libexecdir
-sbindir
-bindir
-program_transform_name
-prefix
-exec_prefix
-PACKAGE_URL
-PACKAGE_BUGREPORT
-PACKAGE_STRING
-PACKAGE_VERSION
-PACKAGE_TARNAME
-PACKAGE_NAME
-PATH_SEPARATOR
-SHELL'
-ac_subst_files=''
-ac_user_opts='
-enable_option_checking
-enable_silent_rules
-enable_dependency_tracking
-enable_portable_binary
-with_gcc_arch
-enable_shared
-enable_static
-with_pic
-enable_fast_install
-with_gnu_ld
-enable_libtool_lock
-with_gmp_prefix
-with_gmp_exec_prefix
-with_piplib
-with_piplib_prefix
-with_piplib_exec_prefix
-with_piplib_builddir
-'
-      ac_precious_vars='build_alias
-host_alias
-target_alias
-CC
-CFLAGS
-LDFLAGS
-LIBS
-CPPFLAGS
-CPP'
-
-
-# Initialize some variables set by options.
-ac_init_help=
-ac_init_version=false
-ac_unrecognized_opts=
-ac_unrecognized_sep=
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-cache_file=/dev/null
-exec_prefix=NONE
-no_create=
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-verbose=
-x_includes=NONE
-x_libraries=NONE
-
-# Installation directory options.
-# These are left unexpanded so users can "make install exec_prefix=/foo"
-# and all the variables that are supposed to be based on exec_prefix
-# by default will actually change.
-# Use braces instead of parens because sh, perl, etc. also accept them.
-# (The list follows the same order as the GNU Coding Standards.)
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datarootdir='${prefix}/share'
-datadir='${datarootdir}'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
-infodir='${datarootdir}/info'
-htmldir='${docdir}'
-dvidir='${docdir}'
-pdfdir='${docdir}'
-psdir='${docdir}'
-libdir='${exec_prefix}/lib'
-localedir='${datarootdir}/locale'
-mandir='${datarootdir}/man'
-
-ac_prev=
-ac_dashdash=
-for ac_option
-do
-  # If the previous option needs an argument, assign it.
-  if test -n "$ac_prev"; then
-    eval $ac_prev=\$ac_option
-    ac_prev=
-    continue
-  fi
-
-  case $ac_option in
-  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
-  *)	ac_optarg=yes ;;
-  esac
-
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
-  case $ac_dashdash$ac_option in
-  --)
-    ac_dashdash=yes ;;
-
-  -bindir | --bindir | --bindi | --bind | --bin | --bi)
-    ac_prev=bindir ;;
-  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
-    bindir=$ac_optarg ;;
-
-  -build | --build | --buil | --bui | --bu)
-    ac_prev=build_alias ;;
-  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
-    build_alias=$ac_optarg ;;
-
-  -cache-file | --cache-file | --cache-fil | --cache-fi \
-  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-    ac_prev=cache_file ;;
-  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
-    cache_file=$ac_optarg ;;
-
-  --config-cache | -C)
-    cache_file=config.cache ;;
-
-  -datadir | --datadir | --datadi | --datad)
-    ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=*)
-    datadir=$ac_optarg ;;
-
-  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
-  | --dataroo | --dataro | --datar)
-    ac_prev=datarootdir ;;
-  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
-  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
-    datarootdir=$ac_optarg ;;
-
-  -disable-* | --disable-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid feature name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"enable_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval enable_$ac_useropt=no ;;
-
-  -docdir | --docdir | --docdi | --doc | --do)
-    ac_prev=docdir ;;
-  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
-    docdir=$ac_optarg ;;
-
-  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
-    ac_prev=dvidir ;;
-  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
-    dvidir=$ac_optarg ;;
-
-  -enable-* | --enable-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid feature name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"enable_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval enable_$ac_useropt=\$ac_optarg ;;
-
-  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
-  | --exec | --exe | --ex)
-    ac_prev=exec_prefix ;;
-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
-  | --exec=* | --exe=* | --ex=*)
-    exec_prefix=$ac_optarg ;;
-
-  -gas | --gas | --ga | --g)
-    # Obsolete; use --with-gas.
-    with_gas=yes ;;
-
-  -help | --help | --hel | --he | -h)
-    ac_init_help=long ;;
-  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
-    ac_init_help=recursive ;;
-  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
-    ac_init_help=short ;;
-
-  -host | --host | --hos | --ho)
-    ac_prev=host_alias ;;
-  -host=* | --host=* | --hos=* | --ho=*)
-    host_alias=$ac_optarg ;;
-
-  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
-    ac_prev=htmldir ;;
-  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
-  | --ht=*)
-    htmldir=$ac_optarg ;;
-
-  -includedir | --includedir | --includedi | --included | --include \
-  | --includ | --inclu | --incl | --inc)
-    ac_prev=includedir ;;
-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
-  | --includ=* | --inclu=* | --incl=* | --inc=*)
-    includedir=$ac_optarg ;;
-
-  -infodir | --infodir | --infodi | --infod | --info | --inf)
-    ac_prev=infodir ;;
-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
-    infodir=$ac_optarg ;;
-
-  -libdir | --libdir | --libdi | --libd)
-    ac_prev=libdir ;;
-  -libdir=* | --libdir=* | --libdi=* | --libd=*)
-    libdir=$ac_optarg ;;
-
-  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
-  | --libexe | --libex | --libe)
-    ac_prev=libexecdir ;;
-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
-  | --libexe=* | --libex=* | --libe=*)
-    libexecdir=$ac_optarg ;;
-
-  -localedir | --localedir | --localedi | --localed | --locale)
-    ac_prev=localedir ;;
-  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
-    localedir=$ac_optarg ;;
-
-  -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst | --locals)
-    ac_prev=localstatedir ;;
-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
-    localstatedir=$ac_optarg ;;
-
-  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
-    ac_prev=mandir ;;
-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
-    mandir=$ac_optarg ;;
-
-  -nfp | --nfp | --nf)
-    # Obsolete; use --without-fp.
-    with_fp=no ;;
-
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c | -n)
-    no_create=yes ;;
-
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
-    no_recursion=yes ;;
-
-  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
-  | --oldin | --oldi | --old | --ol | --o)
-    ac_prev=oldincludedir ;;
-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
-    oldincludedir=$ac_optarg ;;
-
-  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-    ac_prev=prefix ;;
-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-    prefix=$ac_optarg ;;
-
-  -program-prefix | --program-prefix | --program-prefi | --program-pref \
-  | --program-pre | --program-pr | --program-p)
-    ac_prev=program_prefix ;;
-  -program-prefix=* | --program-prefix=* | --program-prefi=* \
-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
-    program_prefix=$ac_optarg ;;
-
-  -program-suffix | --program-suffix | --program-suffi | --program-suff \
-  | --program-suf | --program-su | --program-s)
-    ac_prev=program_suffix ;;
-  -program-suffix=* | --program-suffix=* | --program-suffi=* \
-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
-    program_suffix=$ac_optarg ;;
-
-  -program-transform-name | --program-transform-name \
-  | --program-transform-nam | --program-transform-na \
-  | --program-transform-n | --program-transform- \
-  | --program-transform | --program-transfor \
-  | --program-transfo | --program-transf \
-  | --program-trans | --program-tran \
-  | --progr-tra | --program-tr | --program-t)
-    ac_prev=program_transform_name ;;
-  -program-transform-name=* | --program-transform-name=* \
-  | --program-transform-nam=* | --program-transform-na=* \
-  | --program-transform-n=* | --program-transform-=* \
-  | --program-transform=* | --program-transfor=* \
-  | --program-transfo=* | --program-transf=* \
-  | --program-trans=* | --program-tran=* \
-  | --progr-tra=* | --program-tr=* | --program-t=*)
-    program_transform_name=$ac_optarg ;;
-
-  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
-    ac_prev=pdfdir ;;
-  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
-    pdfdir=$ac_optarg ;;
-
-  -psdir | --psdir | --psdi | --psd | --ps)
-    ac_prev=psdir ;;
-  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
-    psdir=$ac_optarg ;;
-
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil)
-    silent=yes ;;
-
-  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
-    ac_prev=sbindir ;;
-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
-  | --sbi=* | --sb=*)
-    sbindir=$ac_optarg ;;
-
-  -sharedstatedir | --sharedstatedir | --sharedstatedi \
-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
-  | --sharedst | --shareds | --shared | --share | --shar \
-  | --sha | --sh)
-    ac_prev=sharedstatedir ;;
-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
-  | --sha=* | --sh=*)
-    sharedstatedir=$ac_optarg ;;
-
-  -site | --site | --sit)
-    ac_prev=site ;;
-  -site=* | --site=* | --sit=*)
-    site=$ac_optarg ;;
-
-  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-    ac_prev=srcdir ;;
-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-    srcdir=$ac_optarg ;;
-
-  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
-  | --syscon | --sysco | --sysc | --sys | --sy)
-    ac_prev=sysconfdir ;;
-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
-    sysconfdir=$ac_optarg ;;
-
-  -target | --target | --targe | --targ | --tar | --ta | --t)
-    ac_prev=target_alias ;;
-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
-    target_alias=$ac_optarg ;;
-
-  -v | -verbose | --verbose | --verbos | --verbo | --verb)
-    verbose=yes ;;
-
-  -version | --version | --versio | --versi | --vers | -V)
-    ac_init_version=: ;;
-
-  -with-* | --with-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid package name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"with_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval with_$ac_useropt=\$ac_optarg ;;
-
-  -without-* | --without-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid package name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"with_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval with_$ac_useropt=no ;;
-
-  --x)
-    # Obsolete; use --with-x.
-    with_x=yes ;;
-
-  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
-  | --x-incl | --x-inc | --x-in | --x-i)
-    ac_prev=x_includes ;;
-  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
-  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
-    x_includes=$ac_optarg ;;
-
-  -x-libraries | --x-libraries | --x-librarie | --x-librari \
-  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
-    ac_prev=x_libraries ;;
-  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
-  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
-    x_libraries=$ac_optarg ;;
-
-  -*) as_fn_error "unrecognized option: \`$ac_option'
-Try \`$0 --help' for more information."
-    ;;
-
-  *=*)
-    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
-    # Reject names that are not valid shell variable names.
-    case $ac_envvar in #(
-      '' | [0-9]* | *[!_$as_cr_alnum]* )
-      as_fn_error "invalid variable name: \`$ac_envvar'" ;;
-    esac
-    eval $ac_envvar=\$ac_optarg
-    export $ac_envvar ;;
-
-  *)
-    # FIXME: should be removed in autoconf 3.0.
-    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
-    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
-    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
-    ;;
-
-  esac
-done
-
-if test -n "$ac_prev"; then
-  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
-  as_fn_error "missing argument to $ac_option"
-fi
-
-if test -n "$ac_unrecognized_opts"; then
-  case $enable_option_checking in
-    no) ;;
-    fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;;
-    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
-  esac
-fi
-
-# Check all directory arguments for consistency.
-for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
-		datadir sysconfdir sharedstatedir localstatedir includedir \
-		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
-do
-  eval ac_val=\$$ac_var
-  # Remove trailing slashes.
-  case $ac_val in
-    */ )
-      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
-      eval $ac_var=\$ac_val;;
-  esac
-  # Be sure to have absolute directory names.
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* )  continue;;
-    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
-  esac
-  as_fn_error "expected an absolute directory name for --$ac_var: $ac_val"
-done
-
-# There might be people who depend on the old broken behavior: `$host'
-# used to hold the argument of --host etc.
-# FIXME: To remove some day.
-build=$build_alias
-host=$host_alias
-target=$target_alias
-
-# FIXME: To remove some day.
-if test "x$host_alias" != x; then
-  if test "x$build_alias" = x; then
-    cross_compiling=maybe
-    $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
-    If a cross compiler is detected then cross compile mode will be used." >&2
-  elif test "x$build_alias" != "x$host_alias"; then
-    cross_compiling=yes
-  fi
-fi
-
-ac_tool_prefix=
-test -n "$host_alias" && ac_tool_prefix=$host_alias-
-
-test "$silent" = yes && exec 6>/dev/null
-
-
-ac_pwd=`pwd` && test -n "$ac_pwd" &&
-ac_ls_di=`ls -di .` &&
-ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
-  as_fn_error "working directory cannot be determined"
-test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
-  as_fn_error "pwd does not report name of working directory"
-
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
-  ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then the parent directory.
-  ac_confdir=`$as_dirname -- "$as_myself" ||
-$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_myself" : 'X\(//\)[^/]' \| \
-	 X"$as_myself" : 'X\(//\)$' \| \
-	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  srcdir=$ac_confdir
-  if test ! -r "$srcdir/$ac_unique_file"; then
-    srcdir=..
-  fi
-else
-  ac_srcdir_defaulted=no
-fi
-if test ! -r "$srcdir/$ac_unique_file"; then
-  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
-  as_fn_error "cannot find sources ($ac_unique_file) in $srcdir"
-fi
-ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
-ac_abs_confdir=`(
-	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg"
-	pwd)`
-# When building in place, set srcdir=.
-if test "$ac_abs_confdir" = "$ac_pwd"; then
-  srcdir=.
-fi
-# Remove unnecessary trailing slashes from srcdir.
-# Double slashes in file names in object file debugging info
-# mess up M-x gdb in Emacs.
-case $srcdir in
-*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
-esac
-for ac_var in $ac_precious_vars; do
-  eval ac_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_env_${ac_var}_value=\$${ac_var}
-  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_cv_env_${ac_var}_value=\$${ac_var}
-done
-
-#
-# Report the --help message.
-#
-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.07 to adapt to many kinds of systems.
-
-Usage: $0 [OPTION]... [VAR=VALUE]...
-
-To assign environment variables (e.g., CC, CFLAGS...), specify them as
-VAR=VALUE.  See below for descriptions of some of the useful variables.
-
-Defaults for the options are specified in brackets.
-
-Configuration:
-  -h, --help              display this help and exit
-      --help=short        display options specific to this package
-      --help=recursive    display the short help of all the included packages
-  -V, --version           display version information and exit
-  -q, --quiet, --silent   do not print \`checking...' messages
-      --cache-file=FILE   cache test results in FILE [disabled]
-  -C, --config-cache      alias for \`--cache-file=config.cache'
-  -n, --no-create         do not create output files
-      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
-
-Installation directories:
-  --prefix=PREFIX         install architecture-independent files in PREFIX
-                          [$ac_default_prefix]
-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-                          [PREFIX]
-
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
-
-For better control, use the options below.
-
-Fine tuning of the installation directories:
-  --bindir=DIR            user executables [EPREFIX/bin]
-  --sbindir=DIR           system admin executables [EPREFIX/sbin]
-  --libexecdir=DIR        program executables [EPREFIX/libexec]
-  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
-  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
-  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
-  --libdir=DIR            object code libraries [EPREFIX/lib]
-  --includedir=DIR        C header files [PREFIX/include]
-  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
-  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
-  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
-  --infodir=DIR           info documentation [DATAROOTDIR/info]
-  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
-  --mandir=DIR            man documentation [DATAROOTDIR/man]
-  --docdir=DIR            documentation root [DATAROOTDIR/doc/isl]
-  --htmldir=DIR           html documentation [DOCDIR]
-  --dvidir=DIR            dvi documentation [DOCDIR]
-  --pdfdir=DIR            pdf documentation [DOCDIR]
-  --psdir=DIR             ps documentation [DOCDIR]
-_ACEOF
-
-  cat <<\_ACEOF
-
-Program names:
-  --program-prefix=PREFIX            prepend PREFIX to installed program names
-  --program-suffix=SUFFIX            append SUFFIX to installed program names
-  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
-
-System types:
-  --build=BUILD     configure for building on BUILD [guessed]
-  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
-_ACEOF
-fi
-
-if test -n "$ac_init_help"; then
-  case $ac_init_help in
-     short | recursive ) echo "Configuration of isl 0.07:";;
-   esac
-  cat <<\_ACEOF
-
-Optional Features:
-  --disable-option-checking  ignore unrecognized --enable/--with options
-  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
-  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --enable-silent-rules          less verbose build output (undo: `make V=1')
-  --disable-silent-rules         verbose build output (undo: `make V=0')
-  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors
-  --enable-portable-binary
-                          disable compiler optimizations that would produce
-                          unportable binaries
-  --enable-shared[=PKGS]  build shared libraries [default=yes]
-  --enable-static[=PKGS]  build static libraries [default=yes]
-  --enable-fast-install[=PKGS]
-                          optimize for fast installation [default=yes]
-  --disable-libtool-lock  avoid locking (might break parallel builds)
-
-Optional Packages:
-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --with-gcc-arch=<arch>  use architecture <arch> for gcc -march/-mtune,
-                          instead of guessing
-  --with-pic              try to use only PIC/non-PIC objects [default=use
-                          both]
-  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
-  --with-gmp-prefix=DIR   Prefix of gmp installation
-  --with-gmp-exec-prefix=DIR
-                          Exec prefix of gmp installation
-  --with-piplib=no|system|build
-                          Which piplib to use [default=no]
-  --with-piplib-prefix=DIR
-                          Prefix of piplib installation
-  --with-piplib-exec-prefix=DIR
-                          Exec prefix of piplib installation
-  --with-piplib-builddir=DIR
-                          Location of piplib builddir
-
-Some influential environment variables:
-  CC          C compiler command
-  CFLAGS      C compiler flags
-  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
-              nonstandard directory <lib dir>
-  LIBS        libraries to pass to the linker, e.g. -l<library>
-  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
-              you have headers in a nonstandard directory <include dir>
-  CPP         C preprocessor
-
-Use these variables to override the choices made by `configure' or to help
-it to find libraries and programs with nonstandard names/locations.
-
-Report bugs to <isl-development@googlegroups.com>.
-_ACEOF
-ac_status=$?
-fi
-
-if test "$ac_init_help" = "recursive"; then
-  # If there are subdirs, report their specific --help.
-  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d "$ac_dir" ||
-      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
-      continue
-    ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-    cd "$ac_dir" || { ac_status=$?; continue; }
-    # Check for guested configure.
-    if test -f "$ac_srcdir/configure.gnu"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
-    elif test -f "$ac_srcdir/configure"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure" --help=recursive
-    else
-      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
-    fi || ac_status=$?
-    cd "$ac_pwd" || { ac_status=$?; break; }
-  done
-fi
-
-test -n "$ac_init_help" && exit $ac_status
-if $ac_init_version; then
-  cat <<\_ACEOF
-isl configure 0.07
-generated by GNU Autoconf 2.65
-
-Copyright (C) 2009 Free Software Foundation, Inc.
-This configure script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it.
-_ACEOF
-  exit
-fi
-
-## ------------------------ ##
-## Autoconf initialization. ##
-## ------------------------ ##
-
-# ac_fn_c_try_compile LINENO
-# --------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext
-  if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_compile
-
-# ac_fn_c_try_run LINENO
-# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_c_try_run ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-       $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-       ac_retval=$ac_status
-fi
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_run
-
-# ac_fn_c_try_link LINENO
-# -----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
-  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
-  # interfere with the next link command; also delete a directory that is
-  # left behind by Apple's compiler.  We do this before executing the actions.
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_link
-
-# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists and can be compiled using the include files in
-# INCLUDES, setting the cache variable VAR accordingly.
-ac_fn_c_check_header_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_header_compile
-
-# ac_fn_c_try_cpp LINENO
-# ----------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_cpp ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-    ac_retval=1
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_cpp
-
-# ac_fn_c_check_func LINENO FUNC VAR
-# ----------------------------------
-# Tests whether FUNC exists, setting the cache variable VAR accordingly
-ac_fn_c_check_func ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $2 innocuous_$2
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $2 (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $2
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $2 ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined __stub_$2 || defined __stub___$2
-choke me
-#endif
-
-int
-main ()
-{
-return $2 ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_func
-
-# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
-# -------------------------------------------
-# Tests whether TYPE exists after having included INCLUDES, setting cache
-# variable VAR accordingly.
-ac_fn_c_check_type ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=no"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof ($2))
-	 return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof (($2)))
-	    return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  eval "$3=yes"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_type
-
-# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
-# --------------------------------------------
-# Tries to find the compile-time value of EXPR in a program that includes
-# INCLUDES, setting VAR accordingly. Returns whether the value could be
-# computed
-ac_fn_c_compute_int ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if test "$cross_compiling" = yes; then
-    # Depending upon the size, compute the lo and hi bounds.
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) >= 0)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_lo=0 ac_mid=0
-  while :; do
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) <= $ac_mid)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_hi=$ac_mid; break
-else
-  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
-			if test $ac_lo -le $ac_mid; then
-			  ac_lo= ac_hi=
-			  break
-			fi
-			as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  done
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) < 0)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_hi=-1 ac_mid=-1
-  while :; do
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) >= $ac_mid)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_lo=$ac_mid; break
-else
-  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
-			if test $ac_mid -le $ac_hi; then
-			  ac_lo= ac_hi=
-			  break
-			fi
-			as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  done
-else
-  ac_lo= ac_hi=
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-# Binary search between lo and hi bounds.
-while test "x$ac_lo" != "x$ac_hi"; do
-  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) <= $ac_mid)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_hi=$ac_mid
-else
-  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-case $ac_lo in #((
-?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
-'') ac_retval=1 ;;
-esac
-  else
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-static long int longval () { return $2; }
-static unsigned long int ulongval () { return $2; }
-#include <stdio.h>
-#include <stdlib.h>
-int
-main ()
-{
-
-  FILE *f = fopen ("conftest.val", "w");
-  if (! f)
-    return 1;
-  if (($2) < 0)
-    {
-      long int i = longval ();
-      if (i != ($2))
-	return 1;
-      fprintf (f, "%ld", i);
-    }
-  else
-    {
-      unsigned long int i = ulongval ();
-      if (i != ($2))
-	return 1;
-      fprintf (f, "%lu", i);
-    }
-  /* Do not output a trailing newline, as this causes \r\n confusion
-     on some platforms.  */
-  return ferror (f) || fclose (f) != 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  echo >>conftest.val; read $3 <conftest.val; ac_retval=0
-else
-  ac_retval=1
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-rm -f conftest.val
-
-  fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_compute_int
-
-# ac_fn_c_check_decl LINENO SYMBOL VAR
-# ------------------------------------
-# Tests whether SYMBOL is declared, setting cache variable VAR accordingly.
-ac_fn_c_check_decl ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $2 is declared" >&5
-$as_echo_n "checking whether $2 is declared... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-#ifndef $2
-  (void) $2;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_decl
-
-# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
-# ----------------------------------------------------
-# Tries to find if the field MEMBER exists in type AGGR, after including
-# INCLUDES, setting cache variable VAR accordingly.
-ac_fn_c_check_member ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
-$as_echo_n "checking for $2.$3... " >&6; }
-if { as_var=$4; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$5
-int
-main ()
-{
-static $2 ac_aggr;
-if (ac_aggr.$3)
-return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$4=yes"
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$5
-int
-main ()
-{
-static $2 ac_aggr;
-if (sizeof ac_aggr.$3)
-return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$4=yes"
-else
-  eval "$4=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$4
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_member
-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.07, which was
-generated by GNU Autoconf 2.65.  Invocation command line was
-
-  $ $0 $@
-
-_ACEOF
-exec 5>>config.log
-{
-cat <<_ASUNAME
-## --------- ##
-## Platform. ##
-## --------- ##
-
-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
-
-/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
-/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
-/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
-
-_ASUNAME
-
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    $as_echo "PATH: $as_dir"
-  done
-IFS=$as_save_IFS
-
-} >&5
-
-cat >&5 <<_ACEOF
-
-
-## ----------- ##
-## Core tests. ##
-## ----------- ##
-
-_ACEOF
-
-
-# Keep a trace of the command line.
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Strip out --silent because we don't want to record it for future runs.
-# Also quote any args containing shell meta-characters.
-# Make two passes to allow for proper duplicate-argument suppression.
-ac_configure_args=
-ac_configure_args0=
-ac_configure_args1=
-ac_must_keep_next=false
-for ac_pass in 1 2
-do
-  for ac_arg
-  do
-    case $ac_arg in
-    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
-    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-    | -silent | --silent | --silen | --sile | --sil)
-      continue ;;
-    *\'*)
-      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    case $ac_pass in
-    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
-    2)
-      as_fn_append ac_configure_args1 " '$ac_arg'"
-      if test $ac_must_keep_next = true; then
-	ac_must_keep_next=false # Got value, back to normal.
-      else
-	case $ac_arg in
-	  *=* | --config-cache | -C | -disable-* | --disable-* \
-	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
-	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
-	  | -with-* | --with-* | -without-* | --without-* | --x)
-	    case "$ac_configure_args0 " in
-	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
-	    esac
-	    ;;
-	  -* ) ac_must_keep_next=true ;;
-	esac
-      fi
-      as_fn_append ac_configure_args " '$ac_arg'"
-      ;;
-    esac
-  done
-done
-{ ac_configure_args0=; unset ac_configure_args0;}
-{ ac_configure_args1=; unset ac_configure_args1;}
-
-# When interrupted or exit'd, cleanup temporary files, and complete
-# config.log.  We remove comments because anyway the quotes in there
-# would cause problems or look ugly.
-# WARNING: Use '\'' to represent an apostrophe within the trap.
-# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
-trap 'exit_status=$?
-  # Save into config.log some information that might help in debugging.
-  {
-    echo
-
-    cat <<\_ASBOX
-## ---------------- ##
-## Cache variables. ##
-## ---------------- ##
-_ASBOX
-    echo
-    # The following way of writing the cache mishandles newlines in values,
-(
-  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) { eval $ac_var=; unset $ac_var;} ;;
-      esac ;;
-    esac
-  done
-  (set) 2>&1 |
-    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      sed -n \
-	"s/'\''/'\''\\\\'\'''\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
-      ;; #(
-    *)
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-)
-    echo
-
-    cat <<\_ASBOX
-## ----------------- ##
-## Output variables. ##
-## ----------------- ##
-_ASBOX
-    echo
-    for ac_var in $ac_subst_vars
-    do
-      eval ac_val=\$$ac_var
-      case $ac_val in
-      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-      esac
-      $as_echo "$ac_var='\''$ac_val'\''"
-    done | sort
-    echo
-
-    if test -n "$ac_subst_files"; then
-      cat <<\_ASBOX
-## ------------------- ##
-## File substitutions. ##
-## ------------------- ##
-_ASBOX
-      echo
-      for ac_var in $ac_subst_files
-      do
-	eval ac_val=\$$ac_var
-	case $ac_val in
-	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-	esac
-	$as_echo "$ac_var='\''$ac_val'\''"
-      done | sort
-      echo
-    fi
-
-    if test -s confdefs.h; then
-      cat <<\_ASBOX
-## ----------- ##
-## confdefs.h. ##
-## ----------- ##
-_ASBOX
-      echo
-      cat confdefs.h
-      echo
-    fi
-    test "$ac_signal" != 0 &&
-      $as_echo "$as_me: caught signal $ac_signal"
-    $as_echo "$as_me: exit $exit_status"
-  } >&5
-  rm -f core *.core core.conftest.* &&
-    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
-    exit $exit_status
-' 0
-for ac_signal in 1 2 13 15; do
-  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
-done
-ac_signal=0
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -f -r conftest* confdefs.h
-
-$as_echo "/* confdefs.h */" > confdefs.h
-
-# Predefined preprocessor variables.
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
-
-
-# Let the site file select an alternate cache file if it wants to.
-# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
-if test -n "$CONFIG_SITE"; then
-  ac_site_file1=$CONFIG_SITE
-elif test "x$prefix" != xNONE; then
-  ac_site_file1=$prefix/share/config.site
-  ac_site_file2=$prefix/etc/config.site
-else
-  ac_site_file1=$ac_default_prefix/share/config.site
-  ac_site_file2=$ac_default_prefix/etc/config.site
-fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
-do
-  test "x$ac_site_file" = xNONE && continue
-  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
-    sed 's/^/| /' "$ac_site_file" >&5
-    . "$ac_site_file"
-  fi
-done
-
-if test -r "$cache_file"; then
-  # Some versions of bash will fail to source /dev/null (special files
-  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
-  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
-    case $cache_file in
-      [\\/]* | ?:[\\/]* ) . "$cache_file";;
-      *)                      . "./$cache_file";;
-    esac
-  fi
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
-  >$cache_file
-fi
-
-# Check that the precious variables saved in the cache have kept the same
-# value.
-ac_cache_corrupted=false
-for ac_var in $ac_precious_vars; do
-  eval ac_old_set=\$ac_cv_env_${ac_var}_set
-  eval ac_new_set=\$ac_env_${ac_var}_set
-  eval ac_old_val=\$ac_cv_env_${ac_var}_value
-  eval ac_new_val=\$ac_env_${ac_var}_value
-  case $ac_old_set,$ac_new_set in
-    set,)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,set)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,);;
-    *)
-      if test "x$ac_old_val" != "x$ac_new_val"; then
-	# differences in whitespace do not lead to failure.
-	ac_old_val_w=`echo x $ac_old_val`
-	ac_new_val_w=`echo x $ac_new_val`
-	if test "$ac_old_val_w" != "$ac_new_val_w"; then
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
-	  ac_cache_corrupted=:
-	else
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
-	  eval $ac_var=\$ac_old_val
-	fi
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
-$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
-$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
-      fi;;
-  esac
-  # Pass precious variables to config.status.
-  if test "$ac_new_set" = set; then
-    case $ac_new_val in
-    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
-    *) ac_arg=$ac_var=$ac_new_val ;;
-    esac
-    case " $ac_configure_args " in
-      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
-      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
-    esac
-  fi
-done
-if $ac_cache_corrupted; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-  as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
-fi
-## -------------------- ##
-## Main body of script. ##
-## -------------------- ##
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-ac_aux_dir=
-for ac_dir in . "$srcdir"/.; do
-  for ac_t in install-sh install.sh shtool; do
-    if test -f "$ac_dir/$ac_t"; then
-      ac_aux_dir=$ac_dir
-      ac_install_sh="$ac_aux_dir/$ac_t -c"
-      break 2
-    fi
-  done
-done
-if test -z "$ac_aux_dir"; then
-  as_fn_error "cannot find install-sh, install.sh, or shtool in . \"$srcdir\"/." "$LINENO" 5
-fi
-
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
-
-
-
-am__api_version='1.11'
-
-# Find a good install program.  We prefer a C program (faster),
-# so one script is as good as another.  But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AmigaOS /C/install, which installs bootblocks on floppy discs
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# OS/2's system install, which has a completely different semantic
-# ./install, which can be erroneously created by make from ./install.sh.
-# Reject install programs that cannot install multiple files.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
-$as_echo_n "checking for a BSD-compatible install... " >&6; }
-if test -z "$INSTALL"; then
-if test "${ac_cv_path_install+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in #((
-  ./ | .// | /[cC]/* | \
-  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
-  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
-  /usr/ucb/* ) ;;
-  *)
-    # OSF1 and SCO ODT 3.0 have their own names for install.
-    # Don't use installbsd from OSF since it installs stuff as root
-    # by default.
-    for ac_prog in ginstall scoinst install; do
-      for ac_exec_ext in '' $ac_executable_extensions; do
-	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
-	  if test $ac_prog = install &&
-	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # AIX install.  It has an incompatible calling convention.
-	    :
-	  elif test $ac_prog = install &&
-	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # program-specific install script used by HP pwplus--don't use.
-	    :
-	  else
-	    rm -rf conftest.one conftest.two conftest.dir
-	    echo one > conftest.one
-	    echo two > conftest.two
-	    mkdir conftest.dir
-	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
-	      test -s conftest.one && test -s conftest.two &&
-	      test -s conftest.dir/conftest.one &&
-	      test -s conftest.dir/conftest.two
-	    then
-	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
-	      break 3
-	    fi
-	  fi
-	fi
-      done
-    done
-    ;;
-esac
-
-  done
-IFS=$as_save_IFS
-
-rm -rf conftest.one conftest.two conftest.dir
-
-fi
-  if test "${ac_cv_path_install+set}" = set; then
-    INSTALL=$ac_cv_path_install
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for INSTALL within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    INSTALL=$ac_install_sh
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
-$as_echo "$INSTALL" >&6; }
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
-$as_echo_n "checking whether build environment is sane... " >&6; }
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name.  Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
-  *[\\\"\#\$\&\'\`$am_lf]*)
-    as_fn_error "unsafe absolute working directory name" "$LINENO" 5;;
-esac
-case $srcdir in
-  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
-    as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$*" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$*" != "X $srcdir/configure conftest.file" \
-      && test "$*" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      as_fn_error "ls -t appears to fail.  Make sure there is not a broken
-alias in your environment" "$LINENO" 5
-   fi
-
-   test "$2" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   as_fn_error "newly created file is older than distributed files!
-Check your system clock" "$LINENO" 5
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-test "$program_prefix" != NONE &&
-  program_transform_name="s&^&$program_prefix&;$program_transform_name"
-# Use a double $ so make ignores it.
-test "$program_suffix" != NONE &&
-  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
-# Double any \ or $.
-# By default was `s,x,x', remove it if useless.
-ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
-program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
-
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-
-if test x"${MISSING+set}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
-  *)
-    MISSING="\${SHELL} $am_aux_dir/missing" ;;
-  esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
-$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
-fi
-
-if test x"${install_sh}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
-  *)
-    install_sh="\${SHELL} $am_aux_dir/install-sh"
-  esac
-fi
-
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-if test "$cross_compiling" != no; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
-$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
-if test -z "$MKDIR_P"; then
-  if test "${ac_cv_path_mkdir+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in mkdir gmkdir; do
-	 for ac_exec_ext in '' $ac_executable_extensions; do
-	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
-	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
-	     'mkdir (GNU coreutils) '* | \
-	     'mkdir (coreutils) '* | \
-	     'mkdir (fileutils) '4.1*)
-	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
-	       break 3;;
-	   esac
-	 done
-       done
-  done
-IFS=$as_save_IFS
-
-fi
-
-  test -d ./--version && rmdir ./--version
-  if test "${ac_cv_path_mkdir+set}" = set; then
-    MKDIR_P="$ac_cv_path_mkdir -p"
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for MKDIR_P within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    MKDIR_P="$ac_install_sh -d"
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
-$as_echo "$MKDIR_P" >&6; }
-
-mkdir_p="$MKDIR_P"
-case $mkdir_p in
-  [\\/$]* | ?:[\\/]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-
-for ac_prog in gawk mawk nawk awk
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_AWK+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$AWK"; then
-  ac_cv_prog_AWK="$AWK" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_AWK="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-AWK=$ac_cv_prog_AWK
-if test -n "$AWK"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
-$as_echo "$AWK" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$AWK" && break
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
-set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.make <<\_ACEOF
-SHELL = /bin/sh
-all:
-	@echo '@@@%%%=$(MAKE)=@@@%%%'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-case `${MAKE-make} -f conftest.make 2>/dev/null` in
-  *@@@%%%=?*=@@@%%%*)
-    eval ac_cv_prog_make_${ac_make}_set=yes;;
-  *)
-    eval ac_cv_prog_make_${ac_make}_set=no;;
-esac
-rm -f conftest.make
-fi
-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-  SET_MAKE=
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-  SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
-else
-  am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  am__isrc=' -I$(srcdir)'
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-
-
-# Define the identity of the package.
- PACKAGE='isl'
- VERSION='0.07'
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE "$PACKAGE"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define VERSION "$VERSION"
-_ACEOF
-
-# Some tools Automake needs.
-
-ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
-
-
-AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
-
-
-AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
-
-
-AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
-
-
-MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
-
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-# Always define AMTAR for backward compatibility.
-
-AMTAR=${AMTAR-"${am_missing_run}tar"}
-
-am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
-
-
-
-
-
-# Check whether --enable-silent-rules was given.
-if test "${enable_silent_rules+set}" = set; then :
-  enableval=$enable_silent_rules;
-fi
-
-case $enable_silent_rules in
-yes) AM_DEFAULT_VERBOSITY=0;;
-no)  AM_DEFAULT_VERBOSITY=1;;
-*)   AM_DEFAULT_VERBOSITY=0;;
-esac
-AM_BACKSLASH='\'
-
-
-versioninfo=7:0:0
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
-          if test -n "$ac_tool_prefix"; then
-    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  fi
-fi
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_CC="cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
-  fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl.exe
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$CC" && break
-  done
-fi
-if test -z "$CC"; then
-  ac_ct_CC=$CC
-  for ac_prog in cl.exe
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_CC" && break
-done
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-fi
-
-fi
-
-
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "no acceptable C compiler found in \$PATH
-See \`config.log' for more details." "$LINENO" 5; }
-
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
-  { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    sed '10a\
-... rest of stderr output deleted ...
-         10q' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-  fi
-  rm -f conftest.er1 conftest.err
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-done
-
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-
-# The possible output files:
-ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
-
-ac_rmfiles=
-for ac_file in $ac_files
-do
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
-  esac
-done
-rm -f $ac_rmfiles
-
-if { { ac_try="$ac_link_default"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link_default") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
-# in a Makefile.  We should not override ac_cv_exeext if it was cached,
-# so that the user can short-circuit this test for compilers unknown to
-# Autoconf.
-for ac_file in $ac_files ''
-do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
-	;;
-    [ab].out )
-	# We found the default executable, but exeext='' is most
-	# certainly right.
-	break;;
-    *.* )
-	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
-	then :; else
-	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	fi
-	# We set ac_cv_exeext here because the later test for it is not
-	# safe: cross compilers may not add the suffix if given an `-o'
-	# argument, so we may need to know it at that point already.
-	# Even if this section looks crufty: it has the advantage of
-	# actually working.
-	break;;
-    * )
-	break;;
-  esac
-done
-test "$ac_cv_exeext" = no && ac_cv_exeext=
-
-else
-  ac_file=''
-fi
-if test -z "$ac_file"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "C compiler cannot create executables
-See \`config.log' for more details." "$LINENO" 5; }; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
-ac_exeext=$ac_cv_exeext
-
-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
-if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	  break;;
-    * ) break;;
-  esac
-done
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." "$LINENO" 5; }
-fi
-rm -f conftest conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-FILE *f = fopen ("conftest.out", "w");
- return ferror (f) || fclose (f) != 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files="$ac_clean_files conftest.out"
-# Check that the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
-if test "$cross_compiling" != yes; then
-  { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-  if { ac_try='./conftest$ac_cv_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then
-    cross_compiling=no
-  else
-    if test "$cross_compiling" = maybe; then
-	cross_compiling=yes
-    else
-	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." "$LINENO" 5; }
-    fi
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
-
-rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if test "${ac_cv_objext+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  for ac_file in conftest.o conftest.obj conftest.*; do
-  test -f "$ac_file" || continue;
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
-    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
-       break;;
-  esac
-done
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." "$LINENO" 5; }
-fi
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if test "${ac_cv_c_compiler_gnu+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_compiler_gnu=yes
-else
-  ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
-  GCC=yes
-else
-  GCC=
-fi
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if test "${ac_cv_prog_cc_g+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_save_c_werror_flag=$ac_c_werror_flag
-   ac_c_werror_flag=yes
-   ac_cv_prog_cc_g=no
-   CFLAGS="-g"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-else
-  CFLAGS=""
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  ac_c_werror_flag=$ac_save_c_werror_flag
-	 CFLAGS="-g"
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if test "${ac_cv_prog_cc_c89+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
-     char **p;
-     int i;
-{
-  return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
-  char *s;
-  va_list v;
-  va_start (v,p);
-  s = g (p, va_arg (v,int));
-  va_end (v);
-  return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
-   function prototypes and stuff, but not '\xHH' hex character constants.
-   These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std is added to get
-   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
-   array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std.  */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
-   inside strings and character constants.  */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
-  ;
-  return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
-	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_c89=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
-  test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
-  x)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
-  xno)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
-  *)
-    CC="$CC $ac_cv_prog_cc_c89"
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
-
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-DEPDIR="${am__leading_dot}deps"
-
-ac_config_commands="$ac_config_commands depfiles"
-
-
-am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-	@echo this is the am__doit target
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
-$as_echo_n "checking for style of include used by $am_make... " >&6; }
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
-  am__include=include
-  am__quote=
-  _am_result=GNU
-  ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   case `$am_make -s -f confmf 2> /dev/null` in #(
-   *the\ am__doit\ target*)
-     am__include=.include
-     am__quote="\""
-     _am_result=BSD
-     ;;
-   esac
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
-$as_echo "$_am_result" >&6; }
-rm -f confinc confmf
-
-# Check whether --enable-dependency-tracking was given.
-if test "${enable_dependency_tracking+set}" = set; then :
-  enableval=$enable_dependency_tracking;
-fi
-
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-fi
- if test "x$enable_dependency_tracking" != xno; then
-  AMDEP_TRUE=
-  AMDEP_FALSE='#'
-else
-  AMDEP_TRUE='#'
-  AMDEP_FALSE=
-fi
-
-
-
-depcc="$CC"   am_compiler_list=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_CC_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  am__universal=false
-  case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CC_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CC_dependencies_compiler_type=none
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
-CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
-
- if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
-  am__fastdepCC_TRUE=
-  am__fastdepCC_FALSE='#'
-else
-  am__fastdepCC_TRUE='#'
-  am__fastdepCC_FALSE=
-fi
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler vendor" >&5
-$as_echo_n "checking for C compiler vendor... " >&6; }
-if test "${ax_cv_c_compiler_vendor+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ax_cv_c_compiler_vendor=unknown
-  # note: don't check for gcc first since some other compilers define __GNUC__
-  for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale:__PATHCC__,__PATHSCALE__ clang:__clang__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do
-    vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")"
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-#if !($vencpp)
-      thisisanerror;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_c_compiler_vendor=`echo $ventest | cut -d: -f1`; break
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  done
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_vendor" >&5
-$as_echo "$ax_cv_c_compiler_vendor" >&6; }
-
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if test "${ac_cv_build+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
-  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
-test "x$ac_build_alias" = x &&
-  as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) as_fn_error "invalid value of canonical build" "$LINENO" 5;;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if test "${ac_cv_host+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "x$host_alias" = x; then
-  ac_cv_host=$ac_cv_build
-else
-  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
-    as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
-case $ac_cv_host in
-*-*-*) ;;
-*) as_fn_error "invalid value of canonical host" "$LINENO" 5;;
-esac
-host=$ac_cv_host
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_host
-shift
-host_cpu=$1
-host_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-host_os=$*
-IFS=$ac_save_IFS
-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
-
-
-
-
-
-
-
-# Check whether --enable-portable-binary was given.
-if test "${enable_portable_binary+set}" = set; then :
-  enableval=$enable_portable_binary; acx_maxopt_portable=$withval
-else
-  acx_maxopt_portable=no
-fi
-
-
-# Try to determine "good" native compiler flags if none specified via CFLAGS
-if test "$ac_test_CFLAGS" != "set"; then
-  CFLAGS=""
-  case $ax_cv_c_compiler_vendor in
-    dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host"
-	 if test "x$acx_maxopt_portable" = xno; then
-           CFLAGS="$CFLAGS -arch host"
-         fi;;
-
-    sun) CFLAGS="-native -fast -xO5 -dalign"
-	 if test "x$acx_maxopt_portable" = xyes; then
-	   CFLAGS="$CFLAGS -xarch=generic"
-         fi;;
-
-    hp)  CFLAGS="+Oall +Optrs_ansi +DSnative"
-	 if test "x$acx_maxopt_portable" = xyes; then
-	   CFLAGS="$CFLAGS +DAportable"
-	 fi;;
-
-    ibm) if test "x$acx_maxopt_portable" = xno; then
-           xlc_opt="-qarch=auto -qtune=auto"
-	 else
-           xlc_opt="-qtune=auto"
-	 fi
-          { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $xlc_opt" >&5
-$as_echo_n "checking whether C compiler accepts $xlc_opt... " >&6; }
-ax_save_FLAGS=$CFLAGS
-   CFLAGS="$xlc_opt"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval `$as_echo "ax_cv_c_flags_$xlc_opt" | $as_tr_sh`=yes
-else
-  eval `$as_echo "ax_cv_c_flags_$xlc_opt" | $as_tr_sh`=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   CFLAGS=$ax_save_FLAGS
-eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$xlc_opt" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	CFLAGS="-O3 -qansialias -w $xlc_opt"
-else
-	CFLAGS="-O3 -qansialias -w"
-                echo "******************************************************"
-                echo "*  You seem to have the IBM  C compiler.  It is      *"
-                echo "*  recommended for best performance that you use:    *"
-                echo "*                                                    *"
-                echo "*    CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *"
-                echo "*                      ^^^        ^^^                *"
-                echo "*  where xxx is pwr2, pwr3, 604, or whatever kind of *"
-                echo "*  CPU you have.  (Set the CFLAGS environment var.   *"
-                echo "*  and re-run configure.)  For more info, man cc.    *"
-                echo "******************************************************"
-fi
-
-         ;;
-
-    intel) CFLAGS="-O3 -ansi_alias"
-	if test "x$acx_maxopt_portable" = xno; then
-	  icc_archflag=unknown
-	  icc_flags=""
-	  case $host_cpu in
-	    i686*|x86_64*)
-              # icc accepts gcc assembly syntax, so these should work:
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0 output" >&5
-$as_echo_n "checking for x86 cpuid 0 output... " >&6; }
-if test "${ax_cv_gcc_x86_cpuid_0+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ax_cv_gcc_x86_cpuid_0=unknown
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-
-     int op = 0, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ax_cv_gcc_x86_cpuid_0=`cat conftest_cpuid`; rm -f conftest_cpuid
-else
-  ax_cv_gcc_x86_cpuid_0=unknown; rm -f conftest_cpuid
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0" >&5
-$as_echo "$ax_cv_gcc_x86_cpuid_0" >&6; }
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 1 output" >&5
-$as_echo_n "checking for x86 cpuid 1 output... " >&6; }
-if test "${ax_cv_gcc_x86_cpuid_1+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ax_cv_gcc_x86_cpuid_1=unknown
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-
-     int op = 1, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ax_cv_gcc_x86_cpuid_1=`cat conftest_cpuid`; rm -f conftest_cpuid
-else
-  ax_cv_gcc_x86_cpuid_1=unknown; rm -f conftest_cpuid
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_1" >&5
-$as_echo "$ax_cv_gcc_x86_cpuid_1" >&6; }
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-	      case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG
-                *:756e6547:*:*) # Intel
-                  case $ax_cv_gcc_x86_cpuid_1 in
-                    *6a?:*[234]:*:*|*6[789b]?:*:*:*) icc_flags="-xK";;
-                    *f3[347]:*:*:*|*f41347:*:*:*) icc_flags="-xP -xN -xW -xK";;
-                    *f??:*:*:*) icc_flags="-xN -xW -xK";;
-                  esac ;;
-              esac ;;
-          esac
-          if test "x$icc_flags" != x; then
-            for flag in $icc_flags; do
-               { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
-$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
-ax_save_FLAGS=$CFLAGS
-   CFLAGS="$flag"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=yes
-else
-  eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   CFLAGS=$ax_save_FLAGS
-eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	icc_archflag=$flag; break
-else
-	:
-fi
-
-            done
-          fi
-          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for icc architecture flag" >&5
-$as_echo_n "checking for icc architecture flag... " >&6; }
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $icc_archflag" >&5
-$as_echo "$icc_archflag" >&6; }
-          if test "x$icc_archflag" != xunknown; then
-            CFLAGS="$CFLAGS $icc_archflag"
-          fi
-        fi
-	;;
-
-    gnu)
-     # default optimization flags for gcc on all systems
-     CFLAGS="-O3 -fomit-frame-pointer"
-
-     # -malign-double for x86 systems
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -malign-double" >&5
-$as_echo_n "checking whether C compiler accepts -malign-double... " >&6; }
-if test "${ax_cv_c_flags__malign_double+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      ax_save_FLAGS=$CFLAGS
-      CFLAGS="-malign-double"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_c_flags__malign_double=yes
-else
-  ax_cv_c_flags__malign_double=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-      CFLAGS=$ax_save_FLAGS
-fi
-
-eval ax_check_compiler_flags=$ax_cv_c_flags__malign_double
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	CFLAGS="$CFLAGS -malign-double"
-else
-	:
-fi
-
-
-     #  -fstrict-aliasing for gcc-2.95+
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fstrict-aliasing" >&5
-$as_echo_n "checking whether C compiler accepts -fstrict-aliasing... " >&6; }
-if test "${ax_cv_c_flags__fstrict_aliasing+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      ax_save_FLAGS=$CFLAGS
-      CFLAGS="-fstrict-aliasing"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_c_flags__fstrict_aliasing=yes
-else
-  ax_cv_c_flags__fstrict_aliasing=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-      CFLAGS=$ax_save_FLAGS
-fi
-
-eval ax_check_compiler_flags=$ax_cv_c_flags__fstrict_aliasing
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	CFLAGS="$CFLAGS -fstrict-aliasing"
-else
-	:
-fi
-
-
-     # note that we enable "unsafe" fp optimization with other compilers, too
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -ffast-math" >&5
-$as_echo_n "checking whether C compiler accepts -ffast-math... " >&6; }
-if test "${ax_cv_c_flags__ffast_math+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      ax_save_FLAGS=$CFLAGS
-      CFLAGS="-ffast-math"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_c_flags__ffast_math=yes
-else
-  ax_cv_c_flags__ffast_math=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-      CFLAGS=$ax_save_FLAGS
-fi
-
-eval ax_check_compiler_flags=$ax_cv_c_flags__ffast_math
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	CFLAGS="$CFLAGS -ffast-math"
-else
-	:
-fi
-
-
-
-
-
-
-# Check whether --with-gcc-arch was given.
-if test "${with_gcc_arch+set}" = set; then :
-  withval=$with_gcc_arch; ax_gcc_arch=$withval
-else
-  ax_gcc_arch=yes
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc architecture flag" >&5
-$as_echo_n "checking for gcc architecture flag... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
-$as_echo "" >&6; }
-if test "${ax_cv_gcc_archflag+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-ax_cv_gcc_archflag="unknown"
-
-if test "$GCC" = yes; then
-
-if test "x$ax_gcc_arch" = xyes; then
-ax_gcc_arch=""
-if test "$cross_compiling" = no; then
-case $host_cpu in
-  i[3456]86*|x86_64*) # use cpuid codes, in part from x86info-1.7 by D. Jones
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0 output" >&5
-$as_echo_n "checking for x86 cpuid 0 output... " >&6; }
-if test "${ax_cv_gcc_x86_cpuid_0+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ax_cv_gcc_x86_cpuid_0=unknown
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-
-     int op = 0, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ax_cv_gcc_x86_cpuid_0=`cat conftest_cpuid`; rm -f conftest_cpuid
-else
-  ax_cv_gcc_x86_cpuid_0=unknown; rm -f conftest_cpuid
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0" >&5
-$as_echo "$ax_cv_gcc_x86_cpuid_0" >&6; }
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 1 output" >&5
-$as_echo_n "checking for x86 cpuid 1 output... " >&6; }
-if test "${ax_cv_gcc_x86_cpuid_1+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ax_cv_gcc_x86_cpuid_1=unknown
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-
-     int op = 1, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ax_cv_gcc_x86_cpuid_1=`cat conftest_cpuid`; rm -f conftest_cpuid
-else
-  ax_cv_gcc_x86_cpuid_1=unknown; rm -f conftest_cpuid
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_1" >&5
-$as_echo "$ax_cv_gcc_x86_cpuid_1" >&6; }
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-     case $ax_cv_gcc_x86_cpuid_0 in
-       *:756e6547:*:*) # Intel
-          case $ax_cv_gcc_x86_cpuid_1 in
-	    *5[48]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;;
-	    *5??:*:*:*) ax_gcc_arch=pentium ;;
-	    *6[3456]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
-	    *6a?:*[01]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
-	    *6a?:*[234]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
-	    *6[9d]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;;
-	    *6[78b]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
-	    *6??:*:*:*) ax_gcc_arch=pentiumpro ;;
-            *f3[347]:*:*:*|*f41347:*:*:*)
-		case $host_cpu in
-                  x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;;
-                  *) ax_gcc_arch="prescott pentium4 pentiumpro" ;;
-                esac ;;
-            *f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";;
-          esac ;;
-       *:68747541:*:*) # AMD
-          case $ax_cv_gcc_x86_cpuid_1 in
-	    *5[67]?:*:*:*) ax_gcc_arch=k6 ;;
-	    *5[8d]?:*:*:*) ax_gcc_arch="k6-2 k6" ;;
-	    *5[9]?:*:*:*) ax_gcc_arch="k6-3 k6" ;;
-	    *60?:*:*:*) ax_gcc_arch=k7 ;;
-	    *6[12]?:*:*:*) ax_gcc_arch="athlon k7" ;;
-	    *6[34]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;;
-	    *67?:*:*:*) ax_gcc_arch="athlon-4 athlon k7" ;;
-	    *6[68a]?:*:*:*)
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0x80000006 output" >&5
-$as_echo_n "checking for x86 cpuid 0x80000006 output... " >&6; }
-if test "${ax_cv_gcc_x86_cpuid_0x80000006+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ax_cv_gcc_x86_cpuid_0x80000006=unknown
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-
-     int op = 0x80000006, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ax_cv_gcc_x86_cpuid_0x80000006=`cat conftest_cpuid`; rm -f conftest_cpuid
-else
-  ax_cv_gcc_x86_cpuid_0x80000006=unknown; rm -f conftest_cpuid
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0x80000006" >&5
-$as_echo "$ax_cv_gcc_x86_cpuid_0x80000006" >&6; }
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
- # L2 cache size
-	       case $ax_cv_gcc_x86_cpuid_0x80000006 in
-                 *:*:*[1-9a-f]??????:*) # (L2 = ecx >> 16) >= 256
-			ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;;
-                 *) ax_gcc_arch="athlon-4 athlon k7" ;;
-	       esac ;;
-	    *f[4cef8b]?:*:*:*) ax_gcc_arch="athlon64 k8" ;;
-	    *f5?:*:*:*) ax_gcc_arch="opteron k8" ;;
-	    *f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;;
-	    *f??:*:*:*) ax_gcc_arch="k8" ;;
-          esac ;;
-	*:746e6543:*:*) # IDT
-	   case $ax_cv_gcc_x86_cpuid_1 in
-	     *54?:*:*:*) ax_gcc_arch=winchip-c6 ;;
-	     *58?:*:*:*) ax_gcc_arch=winchip2 ;;
-	     *6[78]?:*:*:*) ax_gcc_arch=c3 ;;
-	     *69?:*:*:*) ax_gcc_arch="c3-2 c3" ;;
-	   esac ;;
-     esac
-     if test x"$ax_gcc_arch" = x; then # fallback
-	case $host_cpu in
-	  i586*) ax_gcc_arch=pentium ;;
-	  i686*) ax_gcc_arch=pentiumpro ;;
-        esac
-     fi
-     ;;
-
-  sparc*)
-     # Extract the first word of "prtdiag", so it can be a program name with args.
-set dummy prtdiag; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_PRTDIAG+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $PRTDIAG in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_PRTDIAG="$PRTDIAG" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_dummy="$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/"
-for as_dir in $as_dummy
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_path_PRTDIAG="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-  test -z "$ac_cv_path_PRTDIAG" && ac_cv_path_PRTDIAG="prtdiag"
-  ;;
-esac
-fi
-PRTDIAG=$ac_cv_path_PRTDIAG
-if test -n "$PRTDIAG"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PRTDIAG" >&5
-$as_echo "$PRTDIAG" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-     cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null`
-     cputype=`echo "$cputype" | tr -d ' -' |tr $as_cr_LETTERS $as_cr_letters`
-     case $cputype in
-         *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;;
-         *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;;
-         *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;;
-         *supersparc*|*tms390z5[05]*) ax_gcc_arch="supersparc v8" ;;
-         *hypersparc*|*rt62[056]*) ax_gcc_arch="hypersparc v8" ;;
-         *cypress*) ax_gcc_arch=cypress ;;
-     esac ;;
-
-  alphaev5) ax_gcc_arch=ev5 ;;
-  alphaev56) ax_gcc_arch=ev56 ;;
-  alphapca56) ax_gcc_arch="pca56 ev56" ;;
-  alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;;
-  alphaev6) ax_gcc_arch=ev6 ;;
-  alphaev67) ax_gcc_arch=ev67 ;;
-  alphaev68) ax_gcc_arch="ev68 ev67" ;;
-  alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;;
-  alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;;
-  alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;;
-
-  powerpc*)
-     cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null`
-     cputype=`echo $cputype | sed -e 's/ppc//g;s/ *//g'`
-     case $cputype in
-       *750*) ax_gcc_arch="750 G3" ;;
-       *740[0-9]*) ax_gcc_arch="$cputype 7400 G4" ;;
-       *74[4-5][0-9]*) ax_gcc_arch="$cputype 7450 G4" ;;
-       *74[0-9][0-9]*) ax_gcc_arch="$cputype G4" ;;
-       *970*) ax_gcc_arch="970 G5 power4";;
-       *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";;
-       *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";;
-       603ev|8240) ax_gcc_arch="$cputype 603e 603";;
-       *) ax_gcc_arch=$cputype ;;
-     esac
-     ax_gcc_arch="$ax_gcc_arch powerpc"
-     ;;
-esac
-fi # not cross-compiling
-fi # guess arch
-
-if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then
-for arch in $ax_gcc_arch; do
-  if test "x$acx_maxopt_portable" = xyes; then # if we require portable code
-    flags="-mtune=$arch"
-    # -mcpu=$arch and m$arch generate nonportable code on every arch except
-    # x86.  And some other arches (e.g. Alpha) don't accept -mtune.  Grrr.
-    case $host_cpu in i*86|x86_64*) flags="$flags -mcpu=$arch -m$arch";; esac
-  else
-    flags="-march=$arch -mcpu=$arch -m$arch"
-  fi
-  for flag in $flags; do
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
-$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
-ax_save_FLAGS=$CFLAGS
-   CFLAGS="$flag"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=yes
-else
-  eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   CFLAGS=$ax_save_FLAGS
-eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	ax_cv_gcc_archflag=$flag; break
-else
-	:
-fi
-
-  done
-  test "x$ax_cv_gcc_archflag" = xunknown || break
-done
-fi
-
-fi # $GCC=yes
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc architecture flag" >&5
-$as_echo_n "checking for gcc architecture flag... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_archflag" >&5
-$as_echo "$ax_cv_gcc_archflag" >&6; }
-if test "x$ax_cv_gcc_archflag" = xunknown; then
-  :
-else
-  CFLAGS="$CFLAGS $ax_cv_gcc_archflag"
-fi
-
-
-     # drop to -O1 for gcc 4.2
-     $CC --version |
-	sed -e 's/.* \([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\1 \2/' |
-	(read major minor
-	    if test $major -eq 4 -a $minor -eq 2; then
-				exit 0
-	    fi
-	    exit 1
-	) && CFLAGS="-O1"
-     ;;
-  esac
-
-  if test -z "$CFLAGS"; then
-	echo ""
-	echo "********************************************************"
-        echo "* WARNING: Don't know the best CFLAGS for this system  *"
-        echo "* Use ./configure CFLAGS=... to specify your own flags *"
-	echo "* (otherwise, a default of CFLAGS=-O3 will be used)    *"
-	echo "********************************************************"
-	echo ""
-        CFLAGS="-O3"
-  fi
-
-   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CFLAGS" >&5
-$as_echo_n "checking whether C compiler accepts $CFLAGS... " >&6; }
-ax_save_FLAGS=$CFLAGS
-   CFLAGS="$CFLAGS"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval `$as_echo "ax_cv_c_flags_$CFLAGS" | $as_tr_sh`=yes
-else
-  eval `$as_echo "ax_cv_c_flags_$CFLAGS" | $as_tr_sh`=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   CFLAGS=$ax_save_FLAGS
-eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$CFLAGS" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	:
-else
-
-	echo ""
-        echo "********************************************************"
-        echo "* WARNING: The guessed CFLAGS don't seem to work with  *"
-        echo "* your compiler.                                       *"
-        echo "* Use ./configure CFLAGS=... to specify your own flags *"
-        echo "********************************************************"
-        echo ""
-        CFLAGS=""
-
-fi
-
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports function __attribute__((__warn_unused_result__))" >&5
-$as_echo_n "checking whether the compiler supports function __attribute__((__warn_unused_result__))... " >&6; }
-if test "${ax_cv_gcc_warn_unused_result+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-__attribute__((__warn_unused_result__))
- int f(int i) { return i; }
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_gcc_warn_unused_result=yes
-else
-  ax_cv_gcc_warn_unused_result=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_warn_unused_result" >&5
-$as_echo "$ax_cv_gcc_warn_unused_result" >&6; }
- if test "$ax_cv_gcc_warn_unused_result" = yes; then
-
-$as_echo "#define GCC_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__))" >>confdefs.h
-
- fi
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __attribute__" >&5
-$as_echo_n "checking for __attribute__... " >&6; }
-if test "${ax_cv___attribute__+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-	  static void foo(void) __attribute__ ((unused));
-	  static void
-	  foo(void) {
-	      exit(1);
-	  }
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv___attribute__=yes
-else
-  ax_cv___attribute__=no
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv___attribute__" >&5
-$as_echo "$ax_cv___attribute__" >&6; }
-  if test "$ax_cv___attribute__" = "yes"; then
-
-$as_echo "#define HAVE___ATTRIBUTE__ 1" >>confdefs.h
-
-  fi
-
-
-case `pwd` in
-  *\ * | *\	*)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
-$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
-esac
-
-
-
-macro_version='2.2.8'
-macro_revision='1.3169'
-
-
-
-
-
-
-
-
-
-
-
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-# Backslashify metacharacters that are still active within
-# double-quoted strings.
-sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
-ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
-$as_echo_n "checking how to print strings... " >&6; }
-# Test print first, because it will be a builtin if present.
-if test "X`print -r -- -n 2>/dev/null`" = X-n && \
-   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='print -r --'
-elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='printf %s\n'
-else
-  # Use this function as a fallback that always works.
-  func_fallback_echo ()
-  {
-    eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
-  }
-  ECHO='func_fallback_echo'
-fi
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO ""
-}
-
-case "$ECHO" in
-  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
-$as_echo "printf" >&6; } ;;
-  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
-$as_echo "print -r" >&6; } ;;
-  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
-$as_echo "cat" >&6; } ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
-$as_echo_n "checking for a sed that does not truncate output... " >&6; }
-if test "${ac_cv_path_SED+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
-     for ac_i in 1 2 3 4 5 6 7; do
-       ac_script="$ac_script$as_nl$ac_script"
-     done
-     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
-     { ac_script=; unset ac_script;}
-     if test -z "$SED"; then
-  ac_path_SED_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
-# Check for GNU ac_path_SED and select it if it is found.
-  # Check for GNU $ac_path_SED
-case `"$ac_path_SED" --version 2>&1` in
-*GNU*)
-  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo '' >> "conftest.nl"
-    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_SED_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_SED="$ac_path_SED"
-      ac_path_SED_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_SED_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_SED"; then
-    as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5
-  fi
-else
-  ac_cv_path_SED=$SED
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
-$as_echo "$ac_cv_path_SED" >&6; }
- SED="$ac_cv_path_SED"
-  rm -f conftest.sed
-
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if test "${ac_cv_path_GREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$GREP"; then
-  ac_path_GREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in grep ggrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
-# Check for GNU ac_path_GREP and select it if it is found.
-  # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'GREP' >> "conftest.nl"
-    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_GREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_GREP="$ac_path_GREP"
-      ac_path_GREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_GREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_GREP"; then
-    as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if test "${ac_cv_path_EGREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
-   then ac_cv_path_EGREP="$GREP -E"
-   else
-     if test -z "$EGREP"; then
-  ac_path_EGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in egrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
-  # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'EGREP' >> "conftest.nl"
-    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_EGREP="$ac_path_EGREP"
-      ac_path_EGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_EGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_EGREP"; then
-    as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_EGREP=$EGREP
-fi
-
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
-$as_echo_n "checking for fgrep... " >&6; }
-if test "${ac_cv_path_FGREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
-   then ac_cv_path_FGREP="$GREP -F"
-   else
-     if test -z "$FGREP"; then
-  ac_path_FGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in fgrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
-# Check for GNU ac_path_FGREP and select it if it is found.
-  # Check for GNU $ac_path_FGREP
-case `"$ac_path_FGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'FGREP' >> "conftest.nl"
-    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_FGREP="$ac_path_FGREP"
-      ac_path_FGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_FGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_FGREP"; then
-    as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_FGREP=$FGREP
-fi
-
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
-$as_echo "$ac_cv_path_FGREP" >&6; }
- FGREP="$ac_cv_path_FGREP"
-
-
-test -z "$GREP" && GREP=grep
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | ?:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if test "${lt_cv_path_LD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if test "${lt_cv_prog_gnu_ld+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
-$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
-if test "${lt_cv_path_NM+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  : ${lt_cv_path_NM=no}
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
-$as_echo "$lt_cv_path_NM" >&6; }
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
-else
-  # Didn't find any BSD compatible name lister, look for dumpbin.
-  if test -n "$DUMPBIN"; then :
-    # Let the user override the test.
-  else
-    if test -n "$ac_tool_prefix"; then
-  for ac_prog in dumpbin "link -dump"
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_DUMPBIN+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DUMPBIN"; then
-  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DUMPBIN=$ac_cv_prog_DUMPBIN
-if test -n "$DUMPBIN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
-$as_echo "$DUMPBIN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$DUMPBIN" && break
-  done
-fi
-if test -z "$DUMPBIN"; then
-  ac_ct_DUMPBIN=$DUMPBIN
-  for ac_prog in dumpbin "link -dump"
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DUMPBIN"; then
-  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
-if test -n "$ac_ct_DUMPBIN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
-$as_echo "$ac_ct_DUMPBIN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_DUMPBIN" && break
-done
-
-  if test "x$ac_ct_DUMPBIN" = x; then
-    DUMPBIN=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DUMPBIN=$ac_ct_DUMPBIN
-  fi
-fi
-
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
-    *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
-      ;;
-    *)
-      DUMPBIN=:
-      ;;
-    esac
-  fi
-
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
-  fi
-fi
-test -z "$NM" && NM=nm
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
-$as_echo_n "checking the name lister ($NM) interface... " >&6; }
-if test "${lt_cv_nm_interface+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_nm_interface="BSD nm"
-  echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
-  (eval "$ac_compile" 2>conftest.err)
-  cat conftest.err >&5
-  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
-  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
-  cat conftest.err >&5
-  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
-  cat conftest.out >&5
-  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
-    lt_cv_nm_interface="MS dumpbin"
-  fi
-  rm -f conftest*
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
-$as_echo "$lt_cv_nm_interface" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
-$as_echo_n "checking whether ln -s works... " >&6; }
-LN_S=$as_ln_s
-if test "$LN_S" = "ln -s"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
-$as_echo "no, using $LN_S" >&6; }
-fi
-
-# find the maximum length of command line arguments
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
-$as_echo_n "checking the maximum length of command line arguments... " >&6; }
-if test "${lt_cv_sys_max_cmd_len+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-    i=0
-  teststring="ABCD"
-
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
-
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
-
-  cygwin* | mingw* | cegcc*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  mint*)
-    # On MiNT this can take a long time and run out of memory.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
-
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
-
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    else
-      # Make teststring a little bigger before we do anything with it.
-      # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
-        teststring=$teststring$teststring
-      done
-      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-      # If test is not a shell built-in, we'll probably end up computing a
-      # maximum length that is only half of the actual maximum length, but
-      # we can't tell.
-      while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \
-	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
-      do
-        i=`expr $i + 1`
-        teststring=$teststring$teststring
-      done
-      # Only check the string length outside the loop.
-      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
-      teststring=
-      # Add a significant safety factor because C++ compilers can tack on
-      # massive amounts of additional arguments before passing them to the
-      # linker.  It appears as though 1/2 is a usable value.
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    fi
-    ;;
-  esac
-
-fi
-
-if test -n $lt_cv_sys_max_cmd_len ; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
-$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
-$as_echo "none" >&6; }
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-
-
-
-
-
-
-: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
-$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
-$as_echo "$xsi_shell" >&6; }
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
-$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
-$as_echo "$lt_shell_append" >&6; }
-
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  lt_unset=unset
-else
-  lt_unset=false
-fi
-
-
-
-
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  lt_SP2NL='tr \040 \012'
-  lt_NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  lt_SP2NL='tr \100 \n'
-  lt_NL2SP='tr \r\n \100\100'
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
-$as_echo_n "checking for $LD option to reload object files... " >&6; }
-if test "${lt_cv_ld_reload_flag+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_reload_flag='-r'
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
-$as_echo "$lt_cv_ld_reload_flag" >&6; }
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
-set dummy ${ac_tool_prefix}objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OBJDUMP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OBJDUMP"; then
-  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OBJDUMP=$ac_cv_prog_OBJDUMP
-if test -n "$OBJDUMP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
-$as_echo "$OBJDUMP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OBJDUMP"; then
-  ac_ct_OBJDUMP=$OBJDUMP
-  # Extract the first word of "objdump", so it can be a program name with args.
-set dummy objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OBJDUMP"; then
-  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OBJDUMP="objdump"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
-if test -n "$ac_ct_OBJDUMP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
-$as_echo "$ac_ct_OBJDUMP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OBJDUMP" = x; then
-    OBJDUMP="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OBJDUMP=$ac_ct_OBJDUMP
-  fi
-else
-  OBJDUMP="$ac_cv_prog_OBJDUMP"
-fi
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
-$as_echo_n "checking how to recognize dependent libraries... " >&6; }
-if test "${lt_cv_deplibs_check_method+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[4-9]*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[45]*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump',
-  # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
-    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-    lt_cv_file_magic_cmd='func_win32_libid'
-  else
-    # Keep this pattern in sync with the one in func_win32_libid.
-    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
-    lt_cv_file_magic_cmd='$OBJDUMP -f'
-  fi
-  ;;
-
-cegcc*)
-  # use the weaker test based on 'objdump'. See mingw*.
-  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
-
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-freebsd* | dragonfly*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
-
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-haiku*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
-
-interix[3-9]*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
-  fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-*nto* | *qnx*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-rdos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-tpf*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
-$as_echo "$lt_cv_deplibs_check_method" >&6; }
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_AR+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$AR"; then
-  ac_cv_prog_AR="$AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_AR="${ac_tool_prefix}ar"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-AR=$ac_cv_prog_AR
-if test -n "$AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
-$as_echo "$AR" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_AR"; then
-  ac_ct_AR=$AR
-  # Extract the first word of "ar", so it can be a program name with args.
-set dummy ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_AR+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_AR"; then
-  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_AR="ar"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_AR=$ac_cv_prog_ac_ct_AR
-if test -n "$ac_ct_AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
-$as_echo "$ac_ct_AR" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_AR" = x; then
-    AR="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    AR=$ac_ct_AR
-  fi
-else
-  AR="$ac_cv_prog_AR"
-fi
-
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-
-
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-test -z "$STRIP" && STRIP=:
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_RANLIB+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
-  ac_ct_RANLIB=$RANLIB
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_RANLIB"; then
-  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_RANLIB="ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_RANLIB" = x; then
-    RANLIB=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    RANLIB=$ac_ct_RANLIB
-  fi
-else
-  RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-test -z "$RANLIB" && RANLIB=:
-
-
-
-
-
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
-fi
-
-case $host_os in
-  darwin*)
-    lock_old_archive_extraction=yes ;;
-  *)
-    lock_old_archive_extraction=no ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
-$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
-if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[BCDEGRST]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[BCDT]'
-  ;;
-cygwin* | mingw* | pw32* | cegcc*)
-  symcode='[ABCDGISTW]'
-  ;;
-hpux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[ABCDEGRST]'
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[BCDEGRST]'
-  ;;
-osf*)
-  symcode='[BCDEGQRST]'
-  ;;
-solaris*)
-  symcode='[BDRT]'
-  ;;
-sco3.2v5*)
-  symcode='[DT]'
-  ;;
-sysv4.2uw2*)
-  symcode='[DT]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[ABDT]'
-  ;;
-sysv4)
-  symcode='[DFNSTU]'
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[ABCDGIRSTW]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
-    # Also find C++ and __fastcall symbols from MSVC++,
-    # which start with @ or ?.
-    lt_cv_sys_global_symbol_pipe="$AWK '"\
-"     {last_section=section; section=\$ 3};"\
-"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-"     \$ 0!~/External *\|/{next};"\
-"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-"     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-"     ' prfx=^$ac_symprfx"
-  else
-    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-  fi
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
-  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
-	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<_LT_EOF > conftest.$ac_ext
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
-	  cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols.  */
-const struct {
-  const char *name;
-  void       *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[] =
-{
-  { "@PROGRAM@", (void *) 0 },
-_LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
-	  cat <<\_LT_EOF >> conftest.$ac_ext
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_save_LIBS="$LIBS"
-	  lt_save_CFLAGS="$CFLAGS"
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS="$lt_save_LIBS"
-	  CFLAGS="$lt_save_CFLAGS"
-	else
-	  echo "cannot find nm_test_func in $nlist" >&5
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&5
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
-    fi
-  else
-    echo "$progname: failed program was:" >&5
-    cat conftest.$ac_ext >&5
-  fi
-  rm -rf conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-
-fi
-
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
-$as_echo "failed" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
-$as_echo "ok" >&6; }
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Check whether --enable-libtool-lock was given.
-if test "${enable_libtool_lock+set}" = set; then :
-  enableval=$enable_libtool_lock;
-fi
-
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.$ac_objext` in
-      *ELF-32*)
-	HPUX_IA64_MODE="32"
-	;;
-      *ELF-64*)
-	HPUX_IA64_MODE="64"
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -melf32bsmip"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -melf32bmipn32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -melf64bmip"
-	;;
-      esac
-    else
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -32"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -n32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -64"
-	  ;;
-      esac
-    fi
-  fi
-  rm -rf conftest*
-  ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.o` in
-      *32-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_i386_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_i386"
-	    ;;
-	  ppc64-*linux*|powerpc64-*linux*)
-	    LD="${LD-ld} -m elf32ppclinux"
-	    ;;
-	  s390x-*linux*)
-	    LD="${LD-ld} -m elf_s390"
-	    ;;
-	  sparc64-*linux*)
-	    LD="${LD-ld} -m elf32_sparc"
-	    ;;
-	esac
-	;;
-      *64-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_x86_64_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_x86_64"
-	    ;;
-	  ppc*-*linux*|powerpc*-*linux*)
-	    LD="${LD-ld} -m elf64ppc"
-	    ;;
-	  s390*-*linux*|s390*-*tpf*)
-	    LD="${LD-ld} -m elf64_s390"
-	    ;;
-	  sparc*-*linux*)
-	    LD="${LD-ld} -m elf64_sparc"
-	    ;;
-	esac
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
-$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
-if test "${lt_cv_cc_needs_belf+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_cc_needs_belf=yes
-else
-  lt_cv_cc_needs_belf=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-     ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
-$as_echo "$lt_cv_cc_needs_belf" >&6; }
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-sparc*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
-      *)
-	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
-	  LD="${LD-ld} -64"
-	fi
-	;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-esac
-
-need_locks="$enable_libtool_lock"
-
-
-  case $host_os in
-    rhapsody* | darwin*)
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
-set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_DSYMUTIL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DSYMUTIL"; then
-  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DSYMUTIL=$ac_cv_prog_DSYMUTIL
-if test -n "$DSYMUTIL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
-$as_echo "$DSYMUTIL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_DSYMUTIL"; then
-  ac_ct_DSYMUTIL=$DSYMUTIL
-  # Extract the first word of "dsymutil", so it can be a program name with args.
-set dummy dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DSYMUTIL"; then
-  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
-if test -n "$ac_ct_DSYMUTIL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
-$as_echo "$ac_ct_DSYMUTIL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_DSYMUTIL" = x; then
-    DSYMUTIL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DSYMUTIL=$ac_ct_DSYMUTIL
-  fi
-else
-  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
-set dummy ${ac_tool_prefix}nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_NMEDIT+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$NMEDIT"; then
-  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-NMEDIT=$ac_cv_prog_NMEDIT
-if test -n "$NMEDIT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
-$as_echo "$NMEDIT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_NMEDIT"; then
-  ac_ct_NMEDIT=$NMEDIT
-  # Extract the first word of "nmedit", so it can be a program name with args.
-set dummy nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_NMEDIT"; then
-  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_NMEDIT="nmedit"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
-if test -n "$ac_ct_NMEDIT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
-$as_echo "$ac_ct_NMEDIT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_NMEDIT" = x; then
-    NMEDIT=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    NMEDIT=$ac_ct_NMEDIT
-  fi
-else
-  NMEDIT="$ac_cv_prog_NMEDIT"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
-set dummy ${ac_tool_prefix}lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_LIPO+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$LIPO"; then
-  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-LIPO=$ac_cv_prog_LIPO
-if test -n "$LIPO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
-$as_echo "$LIPO" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_LIPO"; then
-  ac_ct_LIPO=$LIPO
-  # Extract the first word of "lipo", so it can be a program name with args.
-set dummy lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_LIPO"; then
-  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_LIPO="lipo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
-if test -n "$ac_ct_LIPO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
-$as_echo "$ac_ct_LIPO" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_LIPO" = x; then
-    LIPO=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    LIPO=$ac_ct_LIPO
-  fi
-else
-  LIPO="$ac_cv_prog_LIPO"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OTOOL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OTOOL"; then
-  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL=$ac_cv_prog_OTOOL
-if test -n "$OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
-$as_echo "$OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL"; then
-  ac_ct_OTOOL=$OTOOL
-  # Extract the first word of "otool", so it can be a program name with args.
-set dummy otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OTOOL"; then
-  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OTOOL="otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
-if test -n "$ac_ct_OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
-$as_echo "$ac_ct_OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OTOOL" = x; then
-    OTOOL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OTOOL=$ac_ct_OTOOL
-  fi
-else
-  OTOOL="$ac_cv_prog_OTOOL"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OTOOL64+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OTOOL64"; then
-  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL64=$ac_cv_prog_OTOOL64
-if test -n "$OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
-$as_echo "$OTOOL64" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL64"; then
-  ac_ct_OTOOL64=$OTOOL64
-  # Extract the first word of "otool64", so it can be a program name with args.
-set dummy otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OTOOL64"; then
-  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OTOOL64="otool64"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
-if test -n "$ac_ct_OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
-$as_echo "$ac_ct_OTOOL64" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OTOOL64" = x; then
-    OTOOL64=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OTOOL64=$ac_ct_OTOOL64
-  fi
-else
-  OTOOL64="$ac_cv_prog_OTOOL64"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
-$as_echo_n "checking for -single_module linker flag... " >&6; }
-if test "${lt_cv_apple_cc_single_mod+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
-	# By default we will add the -single_module flag. You can override
-	# by either setting the environment variable LT_MULTI_MODULE
-	# non-empty at configure time, or by adding -multi_module to the
-	# link flags.
-	rm -rf libconftest.dylib*
-	echo "int foo(void){return 1;}" > conftest.c
-	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&5
-	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
-        _lt_result=$?
-	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
-	  lt_cv_apple_cc_single_mod=yes
-	else
-	  cat conftest.err >&5
-	fi
-	rm -rf libconftest.dylib*
-	rm -f conftest.*
-      fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
-$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
-$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
-if test "${lt_cv_ld_exported_symbols_list+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_exported_symbols_list=no
-      save_LDFLAGS=$LDFLAGS
-      echo "_main" > conftest.sym
-      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_ld_exported_symbols_list=yes
-else
-  lt_cv_ld_exported_symbols_list=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-	LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
-$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
-$as_echo_n "checking for -force_load linker flag... " >&6; }
-if test "${lt_cv_ld_force_load+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_force_load=no
-      cat > conftest.c << _LT_EOF
-int forced_loaded() { return 2;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
-      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
-      echo "$AR cru libconftest.a conftest.o" >&5
-      $AR cru libconftest.a conftest.o 2>&5
-      echo "$RANLIB libconftest.a" >&5
-      $RANLIB libconftest.a 2>&5
-      cat > conftest.c << _LT_EOF
-int main() { return 0;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
-      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
-      _lt_result=$?
-      if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then
-	lt_cv_ld_force_load=yes
-      else
-	cat conftest.err >&5
-      fi
-        rm -f conftest.err libconftest.a conftest conftest.c
-        rm -rf conftest.dSYM
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
-$as_echo "$lt_cv_ld_force_load" >&6; }
-    case $host_os in
-    rhapsody* | darwin1.[012])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-    darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-    darwin*) # darwin 5.x on
-      # if running on 10.5 or later, the deployment target defaults
-      # to the OS version, if on x86, and 10.4, the deployment
-      # target defaults to 10.4. Don't you love it?
-      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[012]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-      esac
-    ;;
-  esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-      _lt_dar_single_mod='$single_module'
-    fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-    else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
-      _lt_dsymutil='~$DSYMUTIL $lib || :'
-    else
-      _lt_dsymutil=
-    fi
-    ;;
-  esac
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-  if test "${ac_cv_prog_CPP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-      # Double quotes because CPP needs to be expanded
-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-  break
-fi
-
-    done
-    ac_cv_prog_CPP=$CPP
-
-fi
-  CPP=$ac_cv_prog_CPP
-else
-  ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details." "$LINENO" 5; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if test "${ac_cv_header_stdc+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_stdc=yes
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      return 2;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
-		  inttypes.h stdint.h unistd.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-eval as_val=\$$as_ac_Header
-   if test "x$as_val" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in dlfcn.h
-do :
-  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
-"
-if test "x$ac_cv_header_dlfcn_h" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DLFCN_H 1
-_ACEOF
-
-fi
-
-done
-
-
-
-
-
-# Set options
-
-
-
-        enable_dlopen=no
-
-
-  enable_win32_dll=no
-
-
-            # Check whether --enable-shared was given.
-if test "${enable_shared+set}" = set; then :
-  enableval=$enable_shared; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_shared=yes
-fi
-
-
-
-
-
-
-
-
-
-  # Check whether --enable-static was given.
-if test "${enable_static+set}" = set; then :
-  enableval=$enable_static; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_static=yes
-fi
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-pic was given.
-if test "${with_pic+set}" = set; then :
-  withval=$with_pic; pic_mode="$withval"
-else
-  pic_mode=default
-fi
-
-
-test -z "$pic_mode" && pic_mode=default
-
-
-
-
-
-
-
-  # Check whether --enable-fast-install was given.
-if test "${enable_fast_install+set}" = set; then :
-  enableval=$enable_fast_install; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_fast_install=yes
-fi
-
-
-
-
-
-
-
-
-
-
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-test -z "$LN_S" && LN_S="ln -s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
-$as_echo_n "checking for objdir... " >&6; }
-if test "${lt_cv_objdir+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
-$as_echo "$lt_cv_objdir" >&6; }
-objdir=$lt_cv_objdir
-
-
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define LT_OBJDIR "$lt_cv_objdir/"
-_ACEOF
-
-
-
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
-$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/${ac_tool_prefix}file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-
-
-
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
-$as_echo_n "checking for file... " >&6; }
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  else
-    MAGIC_CMD=:
-  fi
-fi
-
-  fi
-  ;;
-esac
-
-# Use C for the default configuration in the libtool script
-
-lt_save_CC="$CC"
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-objext=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-
-lt_prog_compiler_no_builtin_flag=
-
-if test "$GCC" = yes; then
-  case $cc_basename in
-  nvcc*)
-    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
-  *)
-    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
-  esac
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
-if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_rtti_exceptions=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="-fno-rtti -fno-exceptions"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_rtti_exceptions=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
-$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
-
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
-    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
-else
-    :
-fi
-
-fi
-
-
-
-
-
-
-  lt_prog_compiler_wl=
-lt_prog_compiler_pic=
-lt_prog_compiler_static=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-
-  if test "$GCC" = yes; then
-    lt_prog_compiler_wl='-Wl,'
-    lt_prog_compiler_static='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            lt_prog_compiler_pic='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic='-fno-common'
-      ;;
-
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      lt_prog_compiler_static=
-      ;;
-
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='-fPIC'
-	;;
-      esac
-      ;;
-
-    interix[3-9]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      lt_prog_compiler_can_build_shared=no
-      enable_shared=no
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic='-fPIC -shared'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic=-Kconform_pic
-      fi
-      ;;
-
-    *)
-      lt_prog_compiler_pic='-fPIC'
-      ;;
-    esac
-
-    case $cc_basename in
-    nvcc*) # Cuda Compiler Driver 2.2
-      lt_prog_compiler_wl='-Xlinker '
-      lt_prog_compiler_pic='-Xcompiler -fPIC'
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      lt_prog_compiler_wl='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      else
-	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC (with -KPIC) is the default.
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
-      case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
-      ecc*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-KPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      # icc used to be incompatible with GCC.
-      # ICC 10 doesn't accept -KPIC any more.
-      icc* | ifort*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      # Lahey Fortran 8.1.
-      lf95*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='--shared'
-	lt_prog_compiler_static='--static'
-	;;
-      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fpic'
-	lt_prog_compiler_static='-Bstatic'
-        ;;
-      ccc*)
-        lt_prog_compiler_wl='-Wl,'
-        # All Alpha code is PIC.
-        lt_prog_compiler_static='-non_shared'
-        ;;
-      xl* | bgxl* | bgf* | mpixl*)
-	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-qpic'
-	lt_prog_compiler_static='-qstaticlink'
-	;;
-      *)
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ F* | *Sun*Fortran*)
-	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl=''
-	  ;;
-	*Sun\ C*)
-	  # Sun C 5.9
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl='-Wl,'
-	  ;;
-	esac
-	;;
-      esac
-      ;;
-
-    newsos6)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic='-fPIC -shared'
-      ;;
-
-    osf3* | osf4* | osf5*)
-      lt_prog_compiler_wl='-Wl,'
-      # All OSF/1 code is PIC.
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    rdos*)
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    solaris*)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
-	lt_prog_compiler_wl='-Qoption ld ';;
-      *)
-	lt_prog_compiler_wl='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      lt_prog_compiler_wl='-Qoption ld '
-      lt_prog_compiler_pic='-PIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	lt_prog_compiler_pic='-Kconform_pic'
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    unicos*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_can_build_shared=no
-      ;;
-
-    uts4*)
-      lt_prog_compiler_pic='-pic'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    *)
-      lt_prog_compiler_can_build_shared=no
-      ;;
-    esac
-  fi
-
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic=
-    ;;
-  *)
-    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
-    ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5
-$as_echo "$lt_prog_compiler_pic" >&6; }
-
-
-
-
-
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
-if test "${lt_cv_prog_compiler_pic_works+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_pic_works=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_pic_works=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
-    case $lt_prog_compiler_pic in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
-     esac
-else
-    lt_prog_compiler_pic=
-     lt_prog_compiler_can_build_shared=no
-fi
-
-fi
-
-
-
-
-
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if test "${lt_cv_prog_compiler_static_works+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_static_works=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler_static_works=yes
-       fi
-     else
-       lt_cv_prog_compiler_static_works=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
-$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_static_works" = xyes; then
-    :
-else
-    lt_prog_compiler_static=
-fi
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-
-  runpath_var=
-  allow_undefined_flag=
-  always_export_symbols=no
-  archive_cmds=
-  archive_expsym_cmds=
-  compiler_needs_object=no
-  enable_shared_with_static_runtimes=no
-  export_dynamic_flag_spec=
-  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  hardcode_automatic=no
-  hardcode_direct=no
-  hardcode_direct_absolute=no
-  hardcode_libdir_flag_spec=
-  hardcode_libdir_flag_spec_ld=
-  hardcode_libdir_separator=
-  hardcode_minus_L=no
-  hardcode_shlibpath_var=unsupported
-  inherit_rpath=no
-  link_all_deplibs=unknown
-  module_cmds=
-  module_expsym_cmds=
-  old_archive_from_new_cmds=
-  old_archive_from_expsyms_cmds=
-  thread_safe_flag_spec=
-  whole_archive_flag_spec=
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  include_expsyms=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  # Exclude shared library initialization/finalization symbols.
-  extract_expsyms_cmds=
-
-  case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  esac
-
-  ld_shlibs=yes
-
-  # On some targets, GNU ld is compatible enough with the native linker
-  # that we're better off using the native interface for both.
-  lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
-    case $host_os in
-      aix*)
-	# The AIX port of GNU ld has always aspired to compatibility
-	# with the native linker.  However, as the warning in the GNU ld
-	# block says, versions before 2.19.5* couldn't really create working
-	# shared libraries, regardless of the interface used.
-	case `$LD -v 2>&1` in
-	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
-	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
-	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
-	  *)
-	    lt_use_gnu_ld_interface=yes
-	    ;;
-	esac
-	;;
-      *)
-	lt_use_gnu_ld_interface=yes
-	;;
-    esac
-  fi
-
-  if test "$lt_use_gnu_ld_interface" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-    export_dynamic_flag_spec='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      whole_archive_flag_spec=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>&1` in
-      *GNU\ gold*) supports_anon_versioning=yes ;;
-      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[3-9]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.19, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to install binutils
-*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
-*** You will then need to restart the configuration process.
-
-_LT_EOF
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds=''
-        ;;
-      m68k)
-            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_minus_L=yes
-        ;;
-      esac
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	allow_undefined_flag=unsupported
-	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
-      # as there is no search path for DLLs.
-      hardcode_libdir_flag_spec='-L$libdir'
-      export_dynamic_flag_spec='${wl}--export-all-symbols'
-      allow_undefined_flag=unsupported
-      always_export_symbols=no
-      enable_shared_with_static_runtimes=yes
-      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
-
-      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    haiku*)
-      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      link_all_deplibs=yes
-      ;;
-
-    interix[3-9]*)
-      hardcode_direct=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
-	case $cc_basename in
-	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
-	esac
-      fi
-      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
-      then
-	tmp_addflag=
-	tmp_sharedflag='-shared'
-	case $cc_basename,$host_cpu in
-        pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95* | pgfortran*)
-					# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	lf95*)				# Lahey Fortran 8.1
-	  whole_archive_flag_spec=
-	  tmp_sharedflag='--shared' ;;
-	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
-	  tmp_sharedflag='-qmkshrobj'
-	  tmp_addflag= ;;
-	nvcc*)	# Cuda Compiler Driver 2.2
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object=yes
-	  ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object=yes
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	esac
-	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-        if test "x$supports_anon_versioning" = xyes; then
-          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-        fi
-
-	case $cc_basename in
-	xlf* | bgf* | bgxlf* | mpixlf*)
-	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
-	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
-	  hardcode_libdir_flag_spec=
-	  hardcode_libdir_flag_spec_ld='-rpath $libdir'
-	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
-	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
-	  fi
-	  ;;
-	esac
-      else
-        ld_shlibs=no
-      fi
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  # For security reasons, it is highly recommended that you always
-	  # use absolute paths for naming shared libraries, and exclude the
-	  # DT_RUNPATH tag from executables and libraries.  But doing so
-	  # requires that you compile everything twice, which is a pain.
-	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  else
-	    ld_shlibs=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-    esac
-
-    if test "$ld_shlibs" = no; then
-      runpath_var=
-      hardcode_libdir_flag_spec=
-      export_dynamic_flag_spec=
-      whole_archive_flag_spec=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      allow_undefined_flag=unsupported
-      always_export_symbols=yes
-      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      hardcode_minus_L=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	hardcode_direct=unsupported
-      fi
-      ;;
-
-    aix[4-9]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
-	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	else
-	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
-	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-	    aix_use_runtimelinking=yes
-	    break
-	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      archive_cmds=''
-      hardcode_direct=yes
-      hardcode_direct_absolute=yes
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      file_list_spec='${wl}-f,'
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[012]|aix4.[012].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	  # We have reworked collect2
-	  :
-	  else
-	  # We have old collect2
-	  hardcode_direct=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  hardcode_minus_L=yes
-	  hardcode_libdir_flag_spec='-L$libdir'
-	  hardcode_libdir_separator=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      export_dynamic_flag_spec='${wl}-bexpall'
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      always_export_symbols=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	allow_undefined_flag='-berok'
-        # Determine the default libpath from the value encoded in an
-        # empty executable.
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-      else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
-	  allow_undefined_flag="-z nodefs"
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an
-	 # empty executable.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag=' ${wl}-bernotok'
-	  allow_undefined_flag=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
-	    # We only use this code for GNU lds that support --whole-archive.
-	    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	  else
-	    # Exported symbols can be pulled into shared objects from archives
-	    whole_archive_flag_spec='$convenience'
-	  fi
-	  archive_cmds_need_lc=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds=''
-        ;;
-      m68k)
-            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_minus_L=yes
-        ;;
-      esac
-      ;;
-
-    bsdi[45]*)
-      export_dynamic_flag_spec=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      hardcode_libdir_flag_spec=' '
-      allow_undefined_flag=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      old_archive_from_new_cmds='true'
-      # FIXME: Should let the user specify the lib program.
-      old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
-      fix_srcfile_path='`cygpath -w "$srcfile"`'
-      enable_shared_with_static_runtimes=yes
-      ;;
-
-    darwin* | rhapsody*)
-
-
-  archive_cmds_need_lc=no
-  hardcode_direct=no
-  hardcode_automatic=yes
-  hardcode_shlibpath_var=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-  else
-    whole_archive_flag_spec=''
-  fi
-  link_all_deplibs=yes
-  allow_undefined_flag="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=func_echo_all
-    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-
-  else
-  ld_shlibs=no
-  fi
-
-      ;;
-
-    dgux*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
-
-    freebsd1*)
-      ld_shlibs=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_direct=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      hardcode_minus_L=yes
-      export_dynamic_flag_spec='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_flag_spec_ld='+b $libdir'
-	hardcode_libdir_separator=:
-	hardcode_direct=yes
-	hardcode_direct_absolute=yes
-	export_dynamic_flag_spec='${wl}-E'
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	hardcode_minus_L=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-
-	  # Older versions of the 11.00 compiler do not understand -b yet
-	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
-$as_echo_n "checking if $CC understands -b... " >&6; }
-if test "${lt_cv_prog_compiler__b+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler__b=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS -b"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler__b=yes
-       fi
-     else
-       lt_cv_prog_compiler__b=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
-$as_echo "$lt_cv_prog_compiler__b" >&6; }
-
-if test x"$lt_cv_prog_compiler__b" = xyes; then
-    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-else
-    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-fi
-
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  hardcode_direct=no
-	  hardcode_shlibpath_var=no
-	  ;;
-	*)
-	  hardcode_direct=yes
-	  hardcode_direct_absolute=yes
-	  export_dynamic_flag_spec='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  hardcode_minus_L=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	# Try to use the -exported_symbol ld option, if it does not
-	# work, assume that -exports_file does not work either and
-	# implicitly export all symbols.
-        save_LDFLAGS="$LDFLAGS"
-        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-int foo(void) {}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-        LDFLAGS="$save_LDFLAGS"
-      else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      inherit_rpath=yes
-      link_all_deplibs=yes
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    newsos6)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_shlibpath_var=no
-      ;;
-
-    *nto* | *qnx*)
-      ;;
-
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	hardcode_direct=yes
-	hardcode_shlibpath_var=no
-	hardcode_direct_absolute=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	  export_dynamic_flag_spec='${wl}-E'
-	else
-	  case $host_os in
-	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     hardcode_libdir_flag_spec='-R$libdir'
-	     ;;
-	   *)
-	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-	fi
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    os2*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_minus_L=yes
-      allow_undefined_flag=unsupported
-      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	hardcode_libdir_flag_spec='-rpath $libdir'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_separator=:
-      ;;
-
-    solaris*)
-      no_undefined_flag=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-      else
-	case `$CC -V 2>&1` in
-	*"Compilers 5.0"*)
-	  wlarc=''
-	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
-	  ;;
-	*)
-	  wlarc='${wl}'
-	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-	  ;;
-	esac
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_shlibpath_var=no
-      case $host_os in
-      solaris2.[0-5] | solaris2.[0-5].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
-	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      link_all_deplibs=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  reload_cmds='$CC -r -o $output$reload_objs'
-	  hardcode_direct=no
-        ;;
-	motorola)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      hardcode_shlibpath_var=no
-      ;;
-
-    sysv4.3*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_shlibpath_var=no
-      export_dynamic_flag_spec='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	hardcode_shlibpath_var=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	ld_shlibs=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag='${wl}-z,text'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      no_undefined_flag='${wl}-z,text'
-      allow_undefined_flag='${wl}-z,nodefs'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-R,$libdir'
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      export_dynamic_flag_spec='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
-
-    *)
-      ld_shlibs=no
-      ;;
-    esac
-
-    if test x$host_vendor = xsni; then
-      case $host in
-      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	export_dynamic_flag_spec='${wl}-Blargedynsym'
-	;;
-      esac
-    fi
-  fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
-$as_echo "$ld_shlibs" >&6; }
-test "$ld_shlibs" = no && can_build_shared=no
-
-with_gnu_ld=$with_gnu_ld
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-if test "${lt_cv_archive_cmds_need_lc+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  $RM conftest*
-	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } 2>conftest.err; then
-	  soname=conftest
-	  lib=conftest
-	  libobjs=conftest.$ac_objext
-	  deplibs=
-	  wl=$lt_prog_compiler_wl
-	  pic_flag=$lt_prog_compiler_pic
-	  compiler_flags=-v
-	  linker_flags=-v
-	  verstring=
-	  output_objdir=.
-	  libname=conftest
-	  lt_save_allow_undefined_flag=$allow_undefined_flag
-	  allow_undefined_flag=
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
-  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-	  then
-	    lt_cv_archive_cmds_need_lc=no
-	  else
-	    lt_cv_archive_cmds_need_lc=yes
-	  fi
-	  allow_undefined_flag=$lt_save_allow_undefined_flag
-	else
-	  cat conftest.err 1>&5
-	fi
-	$RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
-$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
-      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
-
-if test "$GCC" = yes; then
-  case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
-  esac
-  case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
-  esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
-  case $lt_search_path_spec in
-  *\;*)
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
-    ;;
-  *)
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
-    ;;
-  esac
-  # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
-  lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
-  for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
-      test -d "$lt_sys_path" && \
-	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
-    fi
-  done
-  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
-  for (lt_i = NF; lt_i > 0; lt_i--) {
-    if ($lt_i != "" && $lt_i != ".") {
-      if ($lt_i == "..") {
-        lt_count++;
-      } else {
-        if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
-        } else {
-          lt_count--;
-        }
-      }
-    }
-  }
-  if (lt_foo != "") { lt_freq[lt_foo]++; }
-  if (lt_freq[lt_foo] == 1) { print lt_foo; }
-}'`
-  # AWK program above erroneously prepends '/' to C:/dos/paths
-  # for these hosts.
-  case $host_os in
-    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
-  esac
-  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[4-9]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[45]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-
-      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
-
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-
-  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd1*)
-  dynamic_linker=no
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[123]*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
-
-haiku*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
-  postinstall_cmds='chmod 555 $lib'
-  # or fails outright, so override atomically:
-  install_override_mode=555
-  ;;
-
-interix[3-9]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-
-  # Some binutils ld are patched to set DT_RUNPATH
-  if test "${lt_cv_shlibpath_overrides_runpath+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_shlibpath_overrides_runpath=no
-    save_LDFLAGS=$LDFLAGS
-    save_libdir=$libdir
-    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
-	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
-  lt_cv_shlibpath_overrides_runpath=yes
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-    LDFLAGS=$save_LDFLAGS
-    libdir=$save_libdir
-
-fi
-
-  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
-hardcode_action=
-if test -n "$hardcode_libdir_flag_spec" ||
-   test -n "$runpath_var" ||
-   test "X$hardcode_automatic" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$hardcode_direct" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
-     test "$hardcode_minus_L" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action=unsupported
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
-$as_echo "$hardcode_action" >&6; }
-
-if test "$hardcode_action" = relink ||
-   test "$inherit_rpath" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-
-
-
-
-
-
-  if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-    ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-    ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-
-fi
-
-    ;;
-
-  *)
-    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
-if test "x$ac_cv_func_shl_load" = x""yes; then :
-  lt_cv_dlopen="shl_load"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
-$as_echo_n "checking for shl_load in -ldld... " >&6; }
-if test "${ac_cv_lib_dld_shl_load+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char shl_load ();
-int
-main ()
-{
-return shl_load ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dld_shl_load=yes
-else
-  ac_cv_lib_dld_shl_load=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
-$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
-if test "x$ac_cv_lib_dld_shl_load" = x""yes; then :
-  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
-else
-  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
-if test "x$ac_cv_func_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
-$as_echo_n "checking for dlopen in -lsvld... " >&6; }
-if test "${ac_cv_lib_svld_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsvld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_svld_dlopen=yes
-else
-  ac_cv_lib_svld_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
-$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
-if test "x$ac_cv_lib_svld_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
-$as_echo_n "checking for dld_link in -ldld... " >&6; }
-if test "${ac_cv_lib_dld_dld_link+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dld_link ();
-int
-main ()
-{
-return dld_link ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dld_dld_link=yes
-else
-  ac_cv_lib_dld_dld_link=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
-$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
-if test "x$ac_cv_lib_dld_dld_link" = x""yes; then :
-  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-    ;;
-  esac
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
-$as_echo_n "checking whether a program can dlopen itself... " >&6; }
-if test "${lt_cv_dlopen_self+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
-   correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-void fnord () __attribute__((visibility("default")));
-#endif
-
-void fnord () { int i=42; }
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else
-        {
-	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
-          else puts (dlerror ());
-	}
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}
-_LT_EOF
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self=no
-  fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
-$as_echo "$lt_cv_dlopen_self" >&6; }
-
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
-$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
-if test "${lt_cv_dlopen_self_static+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self_static=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
-   correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-void fnord () __attribute__((visibility("default")));
-#endif
-
-void fnord () { int i=42; }
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else
-        {
-	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
-          else puts (dlerror ());
-	}
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}
-_LT_EOF
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self_static=no
-  fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
-$as_echo "$lt_cv_dlopen_self_static" >&6; }
-    fi
-
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
-
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-striplib=
-old_striplib=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
-$as_echo_n "checking whether stripping libraries is possible... " >&6; }
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-  darwin*)
-    if test -n "$STRIP" ; then
-      striplib="$STRIP -x"
-      old_striplib="$STRIP -S"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-    else
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    fi
-    ;;
-  *)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    ;;
-  esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-  # Report which library types will actually be built
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
-$as_echo_n "checking if libtool supports shared libraries... " >&6; }
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
-$as_echo "$can_build_shared" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
-$as_echo_n "checking whether to build shared libraries... " >&6; }
-  test "$can_build_shared" = "no" && enable_shared=no
-
-  # On AIX, shared libraries and static libraries use the same namespace, and
-  # are all built from PIC.
-  case $host_os in
-  aix3*)
-    test "$enable_shared" = yes && enable_static=no
-    if test -n "$RANLIB"; then
-      archive_cmds="$archive_cmds~\$RANLIB \$lib"
-      postinstall_cmds='$RANLIB $lib'
-    fi
-    ;;
-
-  aix[4-9]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
-    fi
-    ;;
-  esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
-$as_echo "$enable_shared" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
-$as_echo_n "checking whether to build static libraries... " >&6; }
-  # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
-$as_echo "$enable_static" >&6; }
-
-
-
-
-fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-CC="$lt_save_CC"
-
-
-
-
-
-
-
-
-
-
-
-
-
-        ac_config_commands="$ac_config_commands libtool"
-
-
-
-
-# Only expand once:
-
-
-
-# Extract the first word of "perl", so it can be a program name with args.
-set dummy perl; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_PERL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$PERL"; then
-  ac_cv_prog_PERL="$PERL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_PERL="perl"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-PERL=$ac_cv_prog_PERL
-if test -n "$PERL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5
-$as_echo "$PERL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-# Extract the first word of "pdflatex", so it can be a program name with args.
-set dummy pdflatex; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_PDFLATEX+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$PDFLATEX"; then
-  ac_cv_prog_PDFLATEX="$PDFLATEX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_PDFLATEX="pdflatex"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-PDFLATEX=$ac_cv_prog_PDFLATEX
-if test -n "$PDFLATEX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PDFLATEX" >&5
-$as_echo "$PDFLATEX" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-# Extract the first word of "pod2html", so it can be a program name with args.
-set dummy pod2html; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_POD2HTML+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$POD2HTML"; then
-  ac_cv_prog_POD2HTML="$POD2HTML" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_POD2HTML="pod2html"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-POD2HTML=$ac_cv_prog_POD2HTML
-if test -n "$POD2HTML"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $POD2HTML" >&5
-$as_echo "$POD2HTML" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-
- if test -n "$PERL" -a -n "$PDFLATEX" -a -n "$POD2HTML"; then
-  GENERATE_DOC_TRUE=
-  GENERATE_DOC_FALSE='#'
-else
-  GENERATE_DOC_TRUE='#'
-  GENERATE_DOC_FALSE=
-fi
-
-
-# ------ AX CREATE STDINT H -------------------------------------
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint types" >&5
-$as_echo_n "checking for stdint types... " >&6; }
-ac_stdint_h=`echo include/isl/stdint.h`
-# try to shortcircuit - if the default include path of the compiler
-# can find a "stdint.h" header then we assume that all compilers can.
-if test "${ac_cv_header_stdint_t+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-old_CXXFLAGS="$CXXFLAGS" ; CXXFLAGS=""
-old_CPPFLAGS="$CPPFLAGS" ; CPPFLAGS=""
-old_CFLAGS="$CFLAGS"     ; CFLAGS=""
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdint.h>
-int
-main ()
-{
-int_least32_t v = 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_stdint_result="(assuming C99 compatible system)"
- ac_cv_header_stdint_t="stdint.h";
-else
-  ac_cv_header_stdint_t=""
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-if test "$GCC" = "yes" && test ".$ac_cv_header_stdint_t" = "."; then
-CFLAGS="-std=c99"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdint.h>
-int
-main ()
-{
-int_least32_t v = 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: your GCC compiler has a defunct stdint.h for its default-mode" >&5
-$as_echo "$as_me: WARNING: your GCC compiler has a defunct stdint.h for its default-mode" >&2;}
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-CXXFLAGS="$old_CXXFLAGS"
-CPPFLAGS="$old_CPPFLAGS"
-CFLAGS="$old_CFLAGS"
-fi
-
-
-v="... $ac_cv_header_stdint_h"
-if test "$ac_stdint_h" = "stdint.h" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: (are you sure you want them in ./stdint.h?)" >&5
-$as_echo "(are you sure you want them in ./stdint.h?)" >&6; }
-elif test "$ac_stdint_h" = "inttypes.h" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: (are you sure you want them in ./inttypes.h?)" >&5
-$as_echo "(are you sure you want them in ./inttypes.h?)" >&6; }
-elif test "_$ac_cv_header_stdint_t" = "_" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: (putting them into $ac_stdint_h)$v" >&5
-$as_echo "(putting them into $ac_stdint_h)$v" >&6; }
-else
- ac_cv_header_stdint="$ac_cv_header_stdint_t"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint (shortcircuit)" >&5
-$as_echo "$ac_cv_header_stdint (shortcircuit)" >&6; }
-fi
-
-if test "_$ac_cv_header_stdint_t" = "_" ; then # can not shortcircuit..
-
-
-inttype_headers=`echo  | sed -e 's/,/ /g'`
-
-ac_cv_stdint_result="(no helpful system typedefs seen)"
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uintptr_t" >&5
-$as_echo_n "checking for stdint uintptr_t... " >&6; }
-if test "${ac_cv_header_stdint_x+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
- ac_cv_header_stdint_x="" # the 1997 typedefs (inttypes.h)
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5
-$as_echo "(..)" >&6; }
-  for i in    stdint.h inttypes.h sys/inttypes.h $inttype_headers
-  do
-   unset ac_cv_type_uintptr_t
-   unset ac_cv_type_uint64_t
-   ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "#include <$i>
-"
-if test "x$ac_cv_type_uintptr_t" = x""yes; then :
-  ac_cv_header_stdint_x=$i
-else
-  continue
-fi
-
-   ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "#include<$i>
-"
-if test "x$ac_cv_type_uint64_t" = x""yes; then :
-  and64="/uint64_t"
-else
-  and64=""
-fi
-
-   ac_cv_stdint_result="(seen uintptr_t$and64 in $i)"
- break
-  done
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uintptr_t" >&5
-$as_echo_n "checking for stdint uintptr_t... " >&6; }
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint_x" >&5
-$as_echo "$ac_cv_header_stdint_x" >&6; }
-
-
-if test "_$ac_cv_header_stdint_x" = "_" ; then
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uint32_t" >&5
-$as_echo_n "checking for stdint uint32_t... " >&6; }
-if test "${ac_cv_header_stdint_o+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
- ac_cv_header_stdint_o="" # the 1995 typedefs (sys/inttypes.h)
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5
-$as_echo "(..)" >&6; }
-  for i in    inttypes.h sys/inttypes.h stdint.h $inttype_headers
-  do
-   unset ac_cv_type_uint32_t
-   unset ac_cv_type_uint64_t
-   ac_fn_c_check_type "$LINENO" "uint32_t" "ac_cv_type_uint32_t" "#include <$i>
-"
-if test "x$ac_cv_type_uint32_t" = x""yes; then :
-  ac_cv_header_stdint_o=$i
-else
-  continue
-fi
-
-   ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "#include<$i>
-"
-if test "x$ac_cv_type_uint64_t" = x""yes; then :
-  and64="/uint64_t"
-else
-  and64=""
-fi
-
-   ac_cv_stdint_result="(seen uint32_t$and64 in $i)"
- break
-   break;
-  done
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uint32_t" >&5
-$as_echo_n "checking for stdint uint32_t... " >&6; }
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint_o" >&5
-$as_echo "$ac_cv_header_stdint_o" >&6; }
-
-fi
-
-if test "_$ac_cv_header_stdint_x" = "_" ; then
-if test "_$ac_cv_header_stdint_o" = "_" ; then
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint u_int32_t" >&5
-$as_echo_n "checking for stdint u_int32_t... " >&6; }
-if test "${ac_cv_header_stdint_u+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
- ac_cv_header_stdint_u="" # the BSD typedefs (sys/types.h)
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5
-$as_echo "(..)" >&6; }
-  for i in    sys/types.h inttypes.h sys/inttypes.h $inttype_headers ; do
-   unset ac_cv_type_u_int32_t
-   unset ac_cv_type_u_int64_t
-   ac_fn_c_check_type "$LINENO" "u_int32_t" "ac_cv_type_u_int32_t" "#include <$i>
-"
-if test "x$ac_cv_type_u_int32_t" = x""yes; then :
-  ac_cv_header_stdint_u=$i
-else
-  continue
-fi
-
-   ac_fn_c_check_type "$LINENO" "u_int64_t" "ac_cv_type_u_int64_t" "#include<$i>
-"
-if test "x$ac_cv_type_u_int64_t" = x""yes; then :
-  and64="/u_int64_t"
-else
-  and64=""
-fi
-
-   ac_cv_stdint_result="(seen u_int32_t$and64 in $i)"
- break
-   break;
-  done
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint u_int32_t" >&5
-$as_echo_n "checking for stdint u_int32_t... " >&6; }
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint_u" >&5
-$as_echo "$ac_cv_header_stdint_u" >&6; }
-
-fi fi
-
-if test "_$ac_cv_header_stdint_x" = "_" ; then
-   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint datatype model" >&5
-$as_echo_n "checking for stdint datatype model... " >&6; }
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5
-$as_echo "(..)" >&6; }
-
-   # The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char" >&5
-$as_echo_n "checking size of char... " >&6; }
-if test "${ac_cv_sizeof_char+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_char" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "cannot compute sizeof (char)
-See \`config.log' for more details." "$LINENO" 5; }; }
-   else
-     ac_cv_sizeof_char=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_char" >&5
-$as_echo "$ac_cv_sizeof_char" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_CHAR $ac_cv_sizeof_char
-_ACEOF
-
-
-   # The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5
-$as_echo_n "checking size of short... " >&6; }
-if test "${ac_cv_sizeof_short+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_short" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "cannot compute sizeof (short)
-See \`config.log' for more details." "$LINENO" 5; }; }
-   else
-     ac_cv_sizeof_short=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5
-$as_echo "$ac_cv_sizeof_short" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_SHORT $ac_cv_sizeof_short
-_ACEOF
-
-
-   # The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
-$as_echo_n "checking size of int... " >&6; }
-if test "${ac_cv_sizeof_int+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_int" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "cannot compute sizeof (int)
-See \`config.log' for more details." "$LINENO" 5; }; }
-   else
-     ac_cv_sizeof_int=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
-$as_echo "$ac_cv_sizeof_int" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_INT $ac_cv_sizeof_int
-_ACEOF
-
-
-   # The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
-$as_echo_n "checking size of long... " >&6; }
-if test "${ac_cv_sizeof_long+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_long" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "cannot compute sizeof (long)
-See \`config.log' for more details." "$LINENO" 5; }; }
-   else
-     ac_cv_sizeof_long=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
-$as_echo "$ac_cv_sizeof_long" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_LONG $ac_cv_sizeof_long
-_ACEOF
-
-
-   # The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void*" >&5
-$as_echo_n "checking size of void*... " >&6; }
-if test "${ac_cv_sizeof_voidp+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ac_cv_sizeof_voidp"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_voidp" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "cannot compute sizeof (void*)
-See \`config.log' for more details." "$LINENO" 5; }; }
-   else
-     ac_cv_sizeof_voidp=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_voidp" >&5
-$as_echo "$ac_cv_sizeof_voidp" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_VOIDP $ac_cv_sizeof_voidp
-_ACEOF
-
-
-   ac_cv_char_data_model=""
-   ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_char"
-   ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_short"
-   ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_int"
-   ac_cv_long_data_model=""
-   ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_int"
-   ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_long"
-   ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_voidp"
-   { $as_echo "$as_me:${as_lineno-$LINENO}: checking data model" >&5
-$as_echo_n "checking data model... " >&6; }
-   case "$ac_cv_char_data_model/$ac_cv_long_data_model" in
-    122/242)     ac_cv_data_model="IP16"  ; n="standard 16bit machine" ;;
-    122/244)     ac_cv_data_model="LP32"  ; n="standard 32bit machine" ;;
-    122/*)       ac_cv_data_model="i16"   ; n="unusual int16 model" ;;
-    124/444)     ac_cv_data_model="ILP32" ; n="standard 32bit unixish" ;;
-    124/488)     ac_cv_data_model="LP64"  ; n="standard 64bit unixish" ;;
-    124/448)     ac_cv_data_model="LLP64" ; n="unusual 64bit unixish" ;;
-    124/*)       ac_cv_data_model="i32"   ; n="unusual int32 model" ;;
-    128/888)     ac_cv_data_model="ILP64" ; n="unusual 64bit numeric" ;;
-    128/*)       ac_cv_data_model="i64"   ; n="unusual int64 model" ;;
-    222/*2)      ac_cv_data_model="DSP16" ; n="strict 16bit dsptype" ;;
-    333/*3)      ac_cv_data_model="DSP24" ; n="strict 24bit dsptype" ;;
-    444/*4)      ac_cv_data_model="DSP32" ; n="strict 32bit dsptype" ;;
-    666/*6)      ac_cv_data_model="DSP48" ; n="strict 48bit dsptype" ;;
-    888/*8)      ac_cv_data_model="DSP64" ; n="strict 64bit dsptype" ;;
-    222/*|333/*|444/*|666/*|888/*) :
-                 ac_cv_data_model="iDSP"  ; n="unusual dsptype" ;;
-     *)          ac_cv_data_model="none"  ; n="very unusual model" ;;
-   esac
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_data_model ($ac_cv_long_data_model, $n)" >&5
-$as_echo "$ac_cv_data_model ($ac_cv_long_data_model, $n)" >&6; }
-
-fi
-
-if test "_$ac_cv_header_stdint_x" != "_" ; then
-   ac_cv_header_stdint="$ac_cv_header_stdint_x"
-elif  test "_$ac_cv_header_stdint_o" != "_" ; then
-   ac_cv_header_stdint="$ac_cv_header_stdint_o"
-elif  test "_$ac_cv_header_stdint_u" != "_" ; then
-   ac_cv_header_stdint="$ac_cv_header_stdint_u"
-else
-   ac_cv_header_stdint="stddef.h"
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for extra inttypes in chosen header" >&5
-$as_echo_n "checking for extra inttypes in chosen header... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ($ac_cv_header_stdint)" >&5
-$as_echo "($ac_cv_header_stdint)" >&6; }
-unset ac_cv_type_int_least32_t
-unset ac_cv_type_int_fast32_t
-ac_fn_c_check_type "$LINENO" "int_least32_t" "ac_cv_type_int_least32_t" "#include <$ac_cv_header_stdint>
-"
-if test "x$ac_cv_type_int_least32_t" = x""yes; then :
-
-fi
-
-ac_fn_c_check_type "$LINENO" "int_fast32_t" "ac_cv_type_int_fast32_t" "#include<$ac_cv_header_stdint>
-"
-if test "x$ac_cv_type_int_fast32_t" = x""yes; then :
-
-fi
-
-ac_fn_c_check_type "$LINENO" "intmax_t" "ac_cv_type_intmax_t" "#include <$ac_cv_header_stdint>
-"
-if test "x$ac_cv_type_intmax_t" = x""yes; then :
-
-fi
-
-
-fi # shortcircut to system "stdint.h"
-# ------------------ PREPARE VARIABLES ------------------------------
-if test "$GCC" = "yes" ; then
-ac_cv_stdint_message="using gnu compiler "`$CC --version | head -1`
-else
-ac_cv_stdint_message="using $CC"
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: make use of $ac_cv_header_stdint in $ac_stdint_h $ac_cv_stdint_result" >&5
-$as_echo "make use of $ac_cv_header_stdint in $ac_stdint_h $ac_cv_stdint_result" >&6; }
-
-# ----------------- DONE inttypes.h checks START header -------------
-ac_config_commands="$ac_config_commands $ac_stdint_h"
-
-
-
-
-
-
-case "system" in
-system)
-
-# Check whether --with-gmp_prefix was given.
-if test "${with_gmp_prefix+set}" = set; then :
-  withval=$with_gmp_prefix;
-fi
-
-
-# Check whether --with-gmp_exec_prefix was given.
-if test "${with_gmp_exec_prefix+set}" = set; then :
-  withval=$with_gmp_exec_prefix;
-fi
-
-esac
-
-if test "x$with_gmp_prefix" != "x" -a "x$with_gmp_exec_prefix" = "x"; then
-	with_gmp_exec_prefix=$with_gmp_prefix
-fi
-if test "x$with_gmp_prefix" != "x" -o "x$with_gmp_exec_prefix" != "x"; then
-	if test "x$with_gmp" != "x" -a "x$with_gmp" != "xyes" -a "x$with_gmp" != "xsystem"; then
-		as_fn_error "Setting $with_gmp_prefix implies use of system gmp" "$LINENO" 5
-	fi
-	with_gmp="system"
-fi
-if test "x$with_gmp_builddir" != "x"; then
-	if test "x$with_gmp" != "x" -a "x$with_gmp" != "xyes" -a "x$with_gmp" != "xbuild"; then
-		as_fn_error "Setting $with_gmp_builddir implies use of build gmp" "$LINENO" 5
-	fi
-	with_gmp="build"
-	gmp_srcdir=`echo @abs_srcdir@ | $with_gmp_builddir/config.status --file=-`
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: gmp sources in $gmp_srcdir" >&5
-$as_echo "$as_me: gmp sources in $gmp_srcdir" >&6;}
-fi
-if test "x$with_gmp_exec_prefix" != "x"; then
-	export PKG_CONFIG_PATH="$with_gmp_exec_prefix/lib/pkgconfig${PKG_CONFIG_PATH+:$PKG_CONFIG_PATH}"
-fi
-case "$with_gmp" in
-system)
-	;;
-*)
-	case "system" in
-	bundled)
-		if test -d $srcdir/.git -a \
-			-d $srcdir/gmp -a \
-			! -d $srcdir/gmp/.git; then
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: git repo detected, but submodule gmp not initialized" >&5
-$as_echo "$as_me: WARNING: git repo detected, but submodule gmp not initialized" >&2;}
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You may want to run" >&5
-$as_echo "$as_me: WARNING: You may want to run" >&2;}
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	git submodule init" >&5
-$as_echo "$as_me: WARNING: 	git submodule init" >&2;}
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	git submodule update" >&5
-$as_echo "$as_me: WARNING: 	git submodule update" >&2;}
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	sh autogen.sh" >&5
-$as_echo "$as_me: WARNING: 	sh autogen.sh" >&2;}
-		fi
-		if test -f $srcdir/gmp/configure; then
-			with_gmp="bundled"
-		else
-			with_gmp="no"
-		fi
-		;;
-	*)
-		with_gmp="system"
-		;;
-	esac
-	;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which gmp to use" >&5
-$as_echo_n "checking which gmp to use... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_gmp" >&5
-$as_echo "$with_gmp" >&6; }
-
-
-
-
-
-if test "x$with_gmp_prefix" != "x"; then
-	isl_configure_args="$isl_configure_args --with-gmp=$with_gmp_prefix"
-	GMP_CPPFLAGS="-I$with_gmp_prefix/include"
-	GMP_LDFLAGS="-L$with_gmp_prefix/lib"
-fi
-SAVE_CPPFLAGS="$CPPFLAGS"
-CPPFLAGS="$GMP_CPPFLAGS $CPPFLAGS"
-need_get_memory_functions=false
-ac_fn_c_check_decl "$LINENO" "mp_get_memory_functions" "ac_cv_have_decl_mp_get_memory_functions" "#include <gmp.h>
-"
-if test "x$ac_cv_have_decl_mp_get_memory_functions" = x""yes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_MP_GET_MEMORY_FUNCTIONS $ac_have_decl
-_ACEOF
-if test $ac_have_decl = 1; then :
-
-else
-
-	need_get_memory_functions=true
-
-fi
-
-CPPFLAGS="$SAVE_CPPFLAGS"
- if test x$need_get_memory_functions = xtrue; then
-  NEED_GET_MEMORY_FUNCTIONS_TRUE=
-  NEED_GET_MEMORY_FUNCTIONS_FALSE='#'
-else
-  NEED_GET_MEMORY_FUNCTIONS_TRUE='#'
-  NEED_GET_MEMORY_FUNCTIONS_FALSE=
-fi
-
-ac_fn_c_check_decl "$LINENO" "ffs" "ac_cv_have_decl_ffs" "#include <strings.h>
-"
-if test "x$ac_cv_have_decl_ffs" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FFS $ac_have_decl
-_ACEOF
-
-ac_fn_c_check_decl "$LINENO" "__builtin_ffs" "ac_cv_have_decl___builtin_ffs" "$ac_includes_default"
-if test "x$ac_cv_have_decl___builtin_ffs" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL___BUILTIN_FFS $ac_have_decl
-_ACEOF
-
-
-
-
-
-# Check whether --with-piplib was given.
-if test "${with_piplib+set}" = set; then :
-  withval=$with_piplib;
-fi
-
-case "system" in
-no|system|build)
-
-# Check whether --with-piplib_prefix was given.
-if test "${with_piplib_prefix+set}" = set; then :
-  withval=$with_piplib_prefix;
-fi
-
-
-# Check whether --with-piplib_exec_prefix was given.
-if test "${with_piplib_exec_prefix+set}" = set; then :
-  withval=$with_piplib_exec_prefix;
-fi
-
-esac
-
-# Check whether --with-piplib_builddir was given.
-if test "${with_piplib_builddir+set}" = set; then :
-  withval=$with_piplib_builddir;
-fi
-
-if test "x$with_piplib_prefix" != "x" -a "x$with_piplib_exec_prefix" = "x"; then
-	with_piplib_exec_prefix=$with_piplib_prefix
-fi
-if test "x$with_piplib_prefix" != "x" -o "x$with_piplib_exec_prefix" != "x"; then
-	if test "x$with_piplib" != "x" -a "x$with_piplib" != "xyes" -a "x$with_piplib" != "xsystem"; then
-		as_fn_error "Setting $with_piplib_prefix implies use of system piplib" "$LINENO" 5
-	fi
-	with_piplib="system"
-fi
-if test "x$with_piplib_builddir" != "x"; then
-	if test "x$with_piplib" != "x" -a "x$with_piplib" != "xyes" -a "x$with_piplib" != "xbuild"; then
-		as_fn_error "Setting $with_piplib_builddir implies use of build piplib" "$LINENO" 5
-	fi
-	with_piplib="build"
-	piplib_srcdir=`echo @abs_srcdir@ | $with_piplib_builddir/config.status --file=-`
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: piplib sources in $piplib_srcdir" >&5
-$as_echo "$as_me: piplib sources in $piplib_srcdir" >&6;}
-fi
-if test "x$with_piplib_exec_prefix" != "x"; then
-	export PKG_CONFIG_PATH="$with_piplib_exec_prefix/lib/pkgconfig${PKG_CONFIG_PATH+:$PKG_CONFIG_PATH}"
-fi
-case "$with_piplib" in
-no|system|build)
-	;;
-*)
-	case "no" in
-	bundled)
-		if test -d $srcdir/.git -a \
-			-d $srcdir/piplib -a \
-			! -d $srcdir/piplib/.git; then
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: git repo detected, but submodule piplib not initialized" >&5
-$as_echo "$as_me: WARNING: git repo detected, but submodule piplib not initialized" >&2;}
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You may want to run" >&5
-$as_echo "$as_me: WARNING: You may want to run" >&2;}
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	git submodule init" >&5
-$as_echo "$as_me: WARNING: 	git submodule init" >&2;}
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	git submodule update" >&5
-$as_echo "$as_me: WARNING: 	git submodule update" >&2;}
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	sh autogen.sh" >&5
-$as_echo "$as_me: WARNING: 	sh autogen.sh" >&2;}
-		fi
-		if test -f $srcdir/piplib/configure; then
-			with_piplib="bundled"
-		else
-			with_piplib="no"
-		fi
-		;;
-	*)
-		with_piplib="no"
-		;;
-	esac
-	;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which piplib to use" >&5
-$as_echo_n "checking which piplib to use... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_piplib" >&5
-$as_echo "$with_piplib" >&6; }
-
-
-
-have_piplib=false
-
-
-
-case "$with_piplib" in
-	build)
-		PIPLIB_CPPFLAGS="-I$piplib_srcdir/include"
-		PIPLIB_LIBS="$with_piplib_builddir/libpiplibMP.la"
-	;;
-	system)
-		PIPLIB_LIBS="-lpiplibMP"
-		if test "x$with_piplib_prefix" != "x"; then
-			PIPLIB_CPPFLAGS="-I$with_piplib_prefix/include"
-			PIPLIB_LDFLAGS="-L$with_piplib_prefix/lib"
-		fi
-		SAVE_CPPFLAGS="$CPPFLAGS"
-		SAVE_LDFLAGS="$LDFLAGS"
-		CPPFLAGS="$PIPLIB_CPPFLAGS $CPPFLAGS"
-		LDFLAGS="$PIPLIB_LDFLAGS $LDFLAGS"
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pip_solve in -lpiplibMP" >&5
-$as_echo_n "checking for pip_solve in -lpiplibMP... " >&6; }
-if test "${ac_cv_lib_piplibMP_pip_solve+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lpiplibMP  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char pip_solve ();
-int
-main ()
-{
-return pip_solve ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_piplibMP_pip_solve=yes
-else
-  ac_cv_lib_piplibMP_pip_solve=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_piplibMP_pip_solve" >&5
-$as_echo "$ac_cv_lib_piplibMP_pip_solve" >&6; }
-if test "x$ac_cv_lib_piplibMP_pip_solve" = x""yes; then :
-
-			ac_fn_c_check_member "$LINENO" "PipOptions" "Urs_parms" "ac_cv_member_PipOptions_Urs_parms" "#include <piplib/piplibMP.h>
-"
-if test "x$ac_cv_member_PipOptions_Urs_parms" = x""yes; then :
-
-else
-
-				as_fn_error "Piplib too old; please install version 1.3.6 or newer" "$LINENO" 5
-
-fi
-
-
-else
-
-			as_fn_error "Piplib not found" "$LINENO" 5
-
-fi
-
-		CPPFLAGS="$SAVE_CPPFLAGS"
-		LDFLAGS="$SAVE_LDFLAGS"
-	;;
-	no)
-	;;
-	*)
-		as_fn_error "unsupported" "$LINENO" 5
-	;;
-esac
-if test "$with_piplib" != "no"; then
-
-$as_echo "#define ISL_PIPLIB /**/" >>confdefs.h
-
-	have_piplib=true
-fi
- if test x$have_piplib = xtrue; then
-  HAVE_PIPLIB_TRUE=
-  HAVE_PIPLIB_FALSE='#'
-else
-  HAVE_PIPLIB_TRUE='#'
-  HAVE_PIPLIB_FALSE=
-fi
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler vendor" >&5
-$as_echo_n "checking for C compiler vendor... " >&6; }
-if test "${ax_cv_c_compiler_vendor+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ax_cv_c_compiler_vendor=unknown
-  # note: don't check for gcc first since some other compilers define __GNUC__
-  for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale:__PATHCC__,__PATHSCALE__ clang:__clang__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do
-    vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")"
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-#if !($vencpp)
-      thisisanerror;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_c_compiler_vendor=`echo $ventest | cut -d: -f1`; break
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  done
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_vendor" >&5
-$as_echo "$ax_cv_c_compiler_vendor" >&6; }
-
-
-	WARNING_FLAGS=""
-
-	if test "${ax_cv_c_compiler_vendor}" = "clang"; then
-												WARNING_FLAGS="-Wall"
-	fi
-
-
-
-
-PACKAGE_CFLAGS="$GMP_CPPFLAGS"
-PACKAGE_LDFLAGS="$GMP_LDFLAGS"
-PACKAGE_LIBS="-lisl -lgmp"
-
-# we need the expanded forms...
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig libname" >&5
-$as_echo_n "checking our pkgconfig libname... " >&6; }
-test ".$ax_create_pkgconfig_libname" != "." || \
-ax_create_pkgconfig_libname="${PACKAGE_NAME}"
-test ".$ax_create_pkgconfig_libname" != "." || \
-ax_create_pkgconfig_libname="$PACKAGE"
-ax_create_pkgconfig_libname=`eval echo "$ax_create_pkgconfig_libname"`
-ax_create_pkgconfig_libname=`eval echo "$ax_create_pkgconfig_libname"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_libname" >&5
-$as_echo "$ax_create_pkgconfig_libname" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig version" >&5
-$as_echo_n "checking our pkgconfig version... " >&6; }
-test ".$ax_create_pkgconfig_version" != "." || \
-ax_create_pkgconfig_version="${PACKAGE_VERSION}"
-test ".$ax_create_pkgconfig_version" != "." || \
-ax_create_pkgconfig_version="$VERSION"
-ax_create_pkgconfig_version=`eval echo "$ax_create_pkgconfig_version"`
-ax_create_pkgconfig_version=`eval echo "$ax_create_pkgconfig_version"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_version" >&5
-$as_echo "$ax_create_pkgconfig_version" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig_libdir" >&5
-$as_echo_n "checking our pkgconfig_libdir... " >&6; }
-test ".$pkgconfig_libdir" = "." && \
-pkgconfig_libdir='${libdir}/pkgconfig'
-ax_create_pkgconfig_libdir=`eval echo "$pkgconfig_libdir"`
-ax_create_pkgconfig_libdir=`eval echo "$ax_create_pkgconfig_libdir"`
-ax_create_pkgconfig_libdir=`eval echo "$ax_create_pkgconfig_libdir"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pkgconfig_libdir" >&5
-$as_echo "$pkgconfig_libdir" >&6; }
-test "$pkgconfig_libdir" != "$ax_create_pkgconfig_libdir" && (
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: expanded our pkgconfig_libdir... $ax_create_pkgconfig_libdir" >&5
-$as_echo "expanded our pkgconfig_libdir... $ax_create_pkgconfig_libdir" >&6; })
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig_libfile" >&5
-$as_echo_n "checking our pkgconfig_libfile... " >&6; }
-test ".$pkgconfig_libfile" != "." || \
-pkgconfig_libfile="$ax_create_pkgconfig_libname.pc"
-ax_create_pkgconfig_libfile=`eval echo "$pkgconfig_libfile"`
-ax_create_pkgconfig_libfile=`eval echo "$ax_create_pkgconfig_libfile"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pkgconfig_libfile" >&5
-$as_echo "$pkgconfig_libfile" >&6; }
-test "$pkgconfig_libfile" != "$ax_create_pkgconfig_libfile" && (
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: expanded our pkgconfig_libfile... $ax_create_pkgconfig_libfile" >&5
-$as_echo "expanded our pkgconfig_libfile... $ax_create_pkgconfig_libfile" >&6; })
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our package / suffix" >&5
-$as_echo_n "checking our package / suffix... " >&6; }
-ax_create_pkgconfig_suffix="$program_suffix"
-test ".$ax_create_pkgconfig_suffix" != .NONE || ax_create_pkgconfig_suffix=""
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${PACKAGE_NAME} / ${ax_create_pkgconfig_suffix}" >&5
-$as_echo "${PACKAGE_NAME} / ${ax_create_pkgconfig_suffix}" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig description" >&5
-$as_echo_n "checking our pkgconfig description... " >&6; }
-ax_create_pkgconfig_description="$PACKAGE_SUMMARY"
-test ".$ax_create_pkgconfig_description" != "." || \
-ax_create_pkgconfig_description="$ax_create_pkgconfig_libname Library"
-ax_create_pkgconfig_description=`eval echo "$ax_create_pkgconfig_description"`
-ax_create_pkgconfig_description=`eval echo "$ax_create_pkgconfig_description"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_description" >&5
-$as_echo "$ax_create_pkgconfig_description" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig requires" >&5
-$as_echo_n "checking our pkgconfig requires... " >&6; }
-ax_create_pkgconfig_requires="$PACKAGE_REQUIRES"
-ax_create_pkgconfig_requires=`eval echo "$ax_create_pkgconfig_requires"`
-ax_create_pkgconfig_requires=`eval echo "$ax_create_pkgconfig_requires"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_requires" >&5
-$as_echo "$ax_create_pkgconfig_requires" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig ext libs" >&5
-$as_echo_n "checking our pkgconfig ext libs... " >&6; }
-ax_create_pkgconfig_pkglibs="$PACKAGE_LIBS"
-test ".$ax_create_pkgconfig_pkglibs" != "." || ax_create_pkgconfig_pkglibs="-l$ax_create_pkgconfig_libname"
-ax_create_pkgconfig_libs="$ax_create_pkgconfig_pkglibs $LIBS"
-ax_create_pkgconfig_libs=`eval echo "$ax_create_pkgconfig_libs"`
-ax_create_pkgconfig_libs=`eval echo "$ax_create_pkgconfig_libs"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_libs" >&5
-$as_echo "$ax_create_pkgconfig_libs" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig cppflags" >&5
-$as_echo_n "checking our pkgconfig cppflags... " >&6; }
-ax_create_pkgconfig_cppflags="$CPPFLAGS $PACKAGE_CFLAGS"
-ax_create_pkgconfig_cppflags=`eval echo "$ax_create_pkgconfig_cppflags"`
-ax_create_pkgconfig_cppflags=`eval echo "$ax_create_pkgconfig_cppflags"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_cppflags" >&5
-$as_echo "$ax_create_pkgconfig_cppflags" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig ldflags" >&5
-$as_echo_n "checking our pkgconfig ldflags... " >&6; }
-ax_create_pkgconfig_ldflags="$LDFLAGS $PACKAGE_LDFLAGS"
-ax_create_pkgconfig_ldflags=`eval echo "$ax_create_pkgconfig_ldflags"`
-ax_create_pkgconfig_ldflags=`eval echo "$ax_create_pkgconfig_ldflags"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_ldflags" >&5
-$as_echo "$ax_create_pkgconfig_ldflags" >&6; }
-
-test ".$ax_create_pkgconfig_generate" != "." || \
-ax_create_pkgconfig_generate="$ax_create_pkgconfig_libname.pc"
-ax_create_pkgconfig_generate=`eval echo "$ax_create_pkgconfig_generate"`
-ax_create_pkgconfig_generate=`eval echo "$ax_create_pkgconfig_generate"`
-test "$pkgconfig_libfile" != "$ax_create_pkgconfig_generate" && (
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: generate the pkgconfig later... $ax_create_pkgconfig_generate" >&5
-$as_echo "generate the pkgconfig later... $ax_create_pkgconfig_generate" >&6; })
-
-if test ".$ax_create_pkgconfig_src_libdir" = "." ; then
-ax_create_pkgconfig_src_libdir=`pwd`
-ax_create_pkgconfig_src_libdir=`$as_dirname -- "$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" ||
-$as_expr X"$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" : 'X\(//\)[^/]' \| \
-	 X"$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" : 'X\(//\)$' \| \
-	 X"$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-test ! -d $ax_create_pkgconfig_src_libdir/src || \
-ax_create_pkgconfig_src_libdir="$ax_create_pkgconfig_src_libdir/src"
-case ".$objdir" in
-*libs) ax_create_pkgconfig_src_libdir="$ax_create_pkgconfig_src_libdir/$objdir" ;; esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: noninstalled pkgconfig -L $ax_create_pkgconfig_src_libdir" >&5
-$as_echo "noninstalled pkgconfig -L $ax_create_pkgconfig_src_libdir" >&6; }
-fi
-
-if test ".$ax_create_pkgconfig_src_headers" = "." ; then
-ax_create_pkgconfig_src_headers=`pwd`
-v="$ac_top_srcdir" ;
-test ".$v" != "." || v="$ax_spec_dir"
-test ".$v" != "." || v="$srcdir"
-case "$v" in /*) ax_create_pkgconfig_src_headers="" ;; esac
-ax_create_pkgconfig_src_headers=`$as_dirname -- "$ax_create_pkgconfig_src_headers/$v/x" ||
-$as_expr X"$ax_create_pkgconfig_src_headers/$v/x" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ax_create_pkgconfig_src_headers/$v/x" : 'X\(//\)[^/]' \| \
-	 X"$ax_create_pkgconfig_src_headers/$v/x" : 'X\(//\)$' \| \
-	 X"$ax_create_pkgconfig_src_headers/$v/x" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ax_create_pkgconfig_src_headers/$v/x" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-test ! -d $ax_create_pkgconfig_src_headers/include || \
-ax_create_pkgconfig_src_headers="$ax_create_pkgconfig_src_headers/include"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: noninstalled pkgconfig -I $ax_create_pkgconfig_src_headers" >&5
-$as_echo "noninstalled pkgconfig -I $ax_create_pkgconfig_src_headers" >&6; }
-fi
-
-
-ac_config_commands="$ac_config_commands $ax_create_pkgconfig_generate"
-
-
-
-
-
-
-	if test -f $srcdir/.git/HEAD; then
-		GIT_HEAD="$srcdir/.git/index"
-		GIT_REPO="$srcdir/.git"
-		GIT_HEAD_ID=`GIT_DIR=$GIT_REPO git describe`
-	elif test -f $srcdir/GIT_HEAD_ID; then
-		GIT_HEAD_ID=`cat $srcdir/GIT_HEAD_ID`
-	else
-		mysrcdir=`(cd $srcdir; pwd)`
-		head=`basename $mysrcdir | sed -e 's/.*-//'`
-		head2=`echo $head | sed -e 's/^0-9a-f//'`
-		head3=`echo $head2 | sed -e 's/........................................//'`
-		if test "x$head3" = "x" -a "x$head" = "x$head2"; then
-			GIT_HEAD_ID="$head"
-		else
-			GIT_HEAD_ID="UNKNOWN"
-		fi
-	fi
-	if test -z "$GIT_REPO" ; then
-		GIT_HEAD_VERSION="$GIT_HEAD_ID"
-	else
-	    GIT_HEAD_VERSION="\`GIT_DIR=$GIT_REPO git describe\`"
-	fi
-
-echo '#define GIT_HEAD_ID "'$GIT_HEAD_ID'"' > gitversion.h
-
-
-ac_config_headers="$ac_config_headers isl_config.h"
-
-ac_config_headers="$ac_config_headers include/isl/config.h"
-
-ac_config_files="$ac_config_files Makefile"
-
-ac_config_files="$ac_config_files doc/Makefile"
-
-ac_config_files="$ac_config_files bound_test.sh"
-
-ac_config_files="$ac_config_files pip_test.sh"
-
-
-cat >confcache <<\_ACEOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs, see configure's option --config-cache.
-# It is not useful on other systems.  If it contains results you don't
-# want to keep, you may remove or edit it.
-#
-# config.status only pays attention to the cache file if you give it
-# the --recheck option to rerun configure.
-#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
-# following values.
-
-_ACEOF
-
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, we kill variables containing newlines.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(
-  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) { eval $ac_var=; unset $ac_var;} ;;
-      esac ;;
-    esac
-  done
-
-  (set) 2>&1 |
-    case $as_nl`(ac_space=' '; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      # `set' does not quote correctly, so add quotes: double-quote
-      # substitution turns \\\\ into \\, and sed turns \\ into \.
-      sed -n \
-	"s/'/'\\\\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
-      ;; #(
-    *)
-      # `set' quotes correctly as required by POSIX, so do not add quotes.
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-) |
-  sed '
-     /^ac_cv_env_/b end
-     t clear
-     :clear
-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
-     t end
-     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
-     :end' >>confcache
-if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
-  if test -w "$cache_file"; then
-    test "x$cache_file" != "x/dev/null" &&
-      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
-    cat confcache >$cache_file
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
-  fi
-fi
-rm -f confcache
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-DEFS=-DHAVE_CONFIG_H
-
-ac_libobjs=
-ac_ltlibobjs=
-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
-  # 1. Remove the extension, and $U if already installed.
-  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
-  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
-  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
-  #    will be set to the directory where LIBOBJS objects are built.
-  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
-  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
-done
-LIBOBJS=$ac_libobjs
-
-LTLIBOBJS=$ac_ltlibobjs
-
-
- if test -n "$EXEEXT"; then
-  am__EXEEXT_TRUE=
-  am__EXEEXT_FALSE='#'
-else
-  am__EXEEXT_TRUE='#'
-  am__EXEEXT_FALSE=
-fi
-
-if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
-  as_fn_error "conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
-  as_fn_error "conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${GENERATE_DOC_TRUE}" && test -z "${GENERATE_DOC_FALSE}"; then
-  as_fn_error "conditional \"GENERATE_DOC\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${NEED_GET_MEMORY_FUNCTIONS_TRUE}" && test -z "${NEED_GET_MEMORY_FUNCTIONS_FALSE}"; then
-  as_fn_error "conditional \"NEED_GET_MEMORY_FUNCTIONS\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${HAVE_PIPLIB_TRUE}" && test -z "${HAVE_PIPLIB_FALSE}"; then
-  as_fn_error "conditional \"HAVE_PIPLIB\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-
-: ${CONFIG_STATUS=./config.status}
-ac_write_fail=0
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
-as_write_fail=0
-cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate the current configuration.
-# Compiler output produced by configure, useful for debugging
-# configure, is in config.log if it exists.
-
-debug=false
-ac_cs_recheck=false
-ac_cs_silent=false
-
-SHELL=\${CONFIG_SHELL-$SHELL}
-export SHELL
-_ASEOF
-cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
-      PATH_SEPARATOR=';'
-  }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-case $0 in #((
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-  done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-
-# as_fn_error ERROR [LINENO LOG_FD]
-# ---------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with status $?, using 1 if that was 0.
-as_fn_error ()
-{
-  as_status=$?; test $as_status -eq 0 && as_status=1
-  if test "$3"; then
-    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
-  fi
-  $as_echo "$as_me: error: $1" >&2
-  as_fn_exit $as_status
-} # as_fn_error
-
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
-  return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
-  set +e
-  as_fn_set_status $1
-  exit $1
-} # as_fn_exit
-
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
-  { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
-  eval 'as_fn_append ()
-  {
-    eval $1+=\$2
-  }'
-else
-  as_fn_append ()
-  {
-    eval $1=\$$1\$2
-  }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
-  eval 'as_fn_arith ()
-  {
-    as_val=$(( $* ))
-  }'
-else
-  as_fn_arith ()
-  {
-    as_val=`expr "$@" || test $? -eq 1`
-  }
-fi # as_fn_arith
-
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
-  case `echo 'xy\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  xy)  ECHO_C='\c';;
-  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
-       ECHO_T='	';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
-  if ln -s conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s='ln -s'
-    # ... but there are two gotchas:
-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
-  elif ln conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s=ln
-  else
-    as_ln_s='cp -p'
-  fi
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || eval $as_mkdir_p || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p='mkdir -p "$as_dir"'
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-	test -d "$1/.";
-      else
-	case $1 in #(
-	-*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-exec 6>&1
-## ----------------------------------- ##
-## Main body of $CONFIG_STATUS script. ##
-## ----------------------------------- ##
-_ASEOF
-test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# Save the log message, to keep $0 and so on meaningful, and to
-# 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.07, which was
-generated by GNU Autoconf 2.65.  Invocation command line was
-
-  CONFIG_FILES    = $CONFIG_FILES
-  CONFIG_HEADERS  = $CONFIG_HEADERS
-  CONFIG_LINKS    = $CONFIG_LINKS
-  CONFIG_COMMANDS = $CONFIG_COMMANDS
-  $ $0 $@
-
-on `(hostname || uname -n) 2>/dev/null | sed 1q`
-"
-
-_ACEOF
-
-case $ac_config_files in *"
-"*) set x $ac_config_files; shift; ac_config_files=$*;;
-esac
-
-case $ac_config_headers in *"
-"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
-esac
-
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-# Files that config.status was made for.
-config_files="$ac_config_files"
-config_headers="$ac_config_headers"
-config_commands="$ac_config_commands"
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-ac_cs_usage="\
-\`$as_me' instantiates files and other configuration actions
-from templates according to the current configuration.  Unless the files
-and actions are specified as TAGs, all are instantiated by default.
-
-Usage: $0 [OPTION]... [TAG]...
-
-  -h, --help       print this help, then exit
-  -V, --version    print version number and configuration settings, then exit
-      --config     print configuration, then exit
-  -q, --quiet, --silent
-                   do not print progress messages
-  -d, --debug      don't remove temporary files
-      --recheck    update $as_me by reconfiguring in the same conditions
-      --file=FILE[:TEMPLATE]
-                   instantiate the configuration file FILE
-      --header=FILE[:TEMPLATE]
-                   instantiate the configuration header FILE
-
-Configuration files:
-$config_files
-
-Configuration headers:
-$config_headers
-
-Configuration commands:
-$config_commands
-
-Report bugs to <isl-development@googlegroups.com>."
-
-_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.07
-configured by $0, generated by GNU Autoconf 2.65,
-  with options \\"\$ac_cs_config\\"
-
-Copyright (C) 2009 Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-
-ac_pwd='$ac_pwd'
-srcdir='$srcdir'
-INSTALL='$INSTALL'
-MKDIR_P='$MKDIR_P'
-AWK='$AWK'
-test -n "\$AWK" || AWK=awk
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# The default lists apply if the user does not specify any file.
-ac_need_defaults=:
-while test $# != 0
-do
-  case $1 in
-  --*=*)
-    ac_option=`expr "X$1" : 'X\([^=]*\)='`
-    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
-    ac_shift=:
-    ;;
-  *)
-    ac_option=$1
-    ac_optarg=$2
-    ac_shift=shift
-    ;;
-  esac
-
-  case $ac_option in
-  # Handling of the options.
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    ac_cs_recheck=: ;;
-  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
-    $as_echo "$ac_cs_version"; exit ;;
-  --config | --confi | --conf | --con | --co | --c )
-    $as_echo "$ac_cs_config"; exit ;;
-  --debug | --debu | --deb | --de | --d | -d )
-    debug=: ;;
-  --file | --fil | --fi | --f )
-    $ac_shift
-    case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    as_fn_append CONFIG_FILES " '$ac_optarg'"
-    ac_need_defaults=false;;
-  --header | --heade | --head | --hea )
-    $ac_shift
-    case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
-    ac_need_defaults=false;;
-  --he | --h)
-    # Conflict between --help and --header
-    as_fn_error "ambiguous option: \`$1'
-Try \`$0 --help' for more information.";;
-  --help | --hel | -h )
-    $as_echo "$ac_cs_usage"; exit ;;
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil | --si | --s)
-    ac_cs_silent=: ;;
-
-  # This is an error.
-  -*) as_fn_error "unrecognized option: \`$1'
-Try \`$0 --help' for more information." ;;
-
-  *) as_fn_append ac_config_targets " $1"
-     ac_need_defaults=false ;;
-
-  esac
-  shift
-done
-
-ac_configure_extra_args=
-
-if $ac_cs_silent; then
-  exec 6>/dev/null
-  ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-if \$ac_cs_recheck; then
-  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
-  shift
-  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
-  CONFIG_SHELL='$SHELL'
-  export CONFIG_SHELL
-  exec "\$@"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-exec 5>>config.log
-{
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-  $as_echo "$ac_log"
-} >&5
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-#
-# INIT-COMMANDS
-#
-AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
-
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
-macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
-enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
-enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
-pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
-enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
-SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
-ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
-host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
-host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
-host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
-build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
-build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
-build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
-SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
-Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
-GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
-EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
-FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
-LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
-NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
-LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
-max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
-ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
-exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
-lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
-lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
-lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
-reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
-reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
-OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
-deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
-file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
-AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
-AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
-STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
-RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
-old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
-old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
-old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
-lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
-CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
-CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
-compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
-GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
-objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
-MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
-lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
-lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
-need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
-DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
-NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
-LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
-OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
-OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
-libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
-shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
-extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
-archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
-enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
-export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
-whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
-compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
-old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
-old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
-archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
-archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
-module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
-module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
-with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
-allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
-no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
-hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
-hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
-hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
-hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
-hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
-inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
-link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
-fix_srcfile_path='`$ECHO "$fix_srcfile_path" | $SED "$delay_single_quote_subst"`'
-always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
-export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
-exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
-include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
-prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
-file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
-variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
-need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
-need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
-version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
-runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
-shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
-shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
-libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
-library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
-soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
-install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
-postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
-postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
-finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
-finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
-hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
-sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
-sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
-hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
-enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
-enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
-enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
-old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
-striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
-
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-\$1
-_LTECHO_EOF'
-}
-
-# Quote evaled strings.
-for var in SHELL \
-ECHO \
-SED \
-GREP \
-EGREP \
-FGREP \
-LD \
-NM \
-LN_S \
-lt_SP2NL \
-lt_NL2SP \
-reload_flag \
-OBJDUMP \
-deplibs_check_method \
-file_magic_cmd \
-AR \
-AR_FLAGS \
-STRIP \
-RANLIB \
-CC \
-CFLAGS \
-compiler \
-lt_cv_sys_global_symbol_pipe \
-lt_cv_sys_global_symbol_to_cdecl \
-lt_cv_sys_global_symbol_to_c_name_address \
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
-lt_prog_compiler_no_builtin_flag \
-lt_prog_compiler_wl \
-lt_prog_compiler_pic \
-lt_prog_compiler_static \
-lt_cv_prog_compiler_c_o \
-need_locks \
-DSYMUTIL \
-NMEDIT \
-LIPO \
-OTOOL \
-OTOOL64 \
-shrext_cmds \
-export_dynamic_flag_spec \
-whole_archive_flag_spec \
-compiler_needs_object \
-with_gnu_ld \
-allow_undefined_flag \
-no_undefined_flag \
-hardcode_libdir_flag_spec \
-hardcode_libdir_flag_spec_ld \
-hardcode_libdir_separator \
-fix_srcfile_path \
-exclude_expsyms \
-include_expsyms \
-file_list_spec \
-variables_saved_for_relink \
-libname_spec \
-library_names_spec \
-soname_spec \
-install_override_mode \
-finish_eval \
-old_striplib \
-striplib; do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Double-quote double-evaled strings.
-for var in reload_cmds \
-old_postinstall_cmds \
-old_postuninstall_cmds \
-old_archive_cmds \
-extract_expsyms_cmds \
-old_archive_from_new_cmds \
-old_archive_from_expsyms_cmds \
-archive_cmds \
-archive_expsym_cmds \
-module_cmds \
-module_expsym_cmds \
-export_symbols_cmds \
-prelink_cmds \
-postinstall_cmds \
-postuninstall_cmds \
-finish_cmds \
-sys_lib_search_path_spec \
-sys_lib_dlsearch_path_spec; do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-ac_aux_dir='$ac_aux_dir'
-xsi_shell='$xsi_shell'
-lt_shell_append='$lt_shell_append'
-
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-
-    PACKAGE='$PACKAGE'
-    VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
-    RM='$RM'
-    ofile='$ofile'
-
-
-
-# variables for create stdint.h replacement
-PACKAGE="$PACKAGE"
-VERSION="$VERSION"
-ac_stdint_h="$ac_stdint_h"
-_ac_stdint_h=`$as_echo "_$PACKAGE-$ac_stdint_h" | $as_tr_cpp`
-ac_cv_stdint_message="$ac_cv_stdint_message"
-ac_cv_header_stdint_t="$ac_cv_header_stdint_t"
-ac_cv_header_stdint_x="$ac_cv_header_stdint_x"
-ac_cv_header_stdint_o="$ac_cv_header_stdint_o"
-ac_cv_header_stdint_u="$ac_cv_header_stdint_u"
-ac_cv_type_uint64_t="$ac_cv_type_uint64_t"
-ac_cv_type_u_int64_t="$ac_cv_type_u_int64_t"
-ac_cv_char_data_model="$ac_cv_char_data_model"
-ac_cv_long_data_model="$ac_cv_long_data_model"
-ac_cv_type_int_least32_t="$ac_cv_type_int_least32_t"
-ac_cv_type_int_fast32_t="$ac_cv_type_int_fast32_t"
-ac_cv_type_intmax_t="$ac_cv_type_intmax_t"
-
-
-ax_create_pkgconfig_generate="$ax_create_pkgconfig_generate"
-pkgconfig_prefix='$prefix'
-pkgconfig_execprefix='$exec_prefix'
-pkgconfig_bindir='$bindir'
-pkgconfig_libdir='$libdir'
-pkgconfig_includedir='$includedir'
-pkgconfig_datarootdir='$datarootdir'
-pkgconfig_datadir='$datadir'
-pkgconfig_sysconfdir='$sysconfdir'
-pkgconfig_suffix='$ax_create_pkgconfig_suffix'
-pkgconfig_package='$PACKAGE_NAME'
-pkgconfig_libname='$ax_create_pkgconfig_libname'
-pkgconfig_description='$ax_create_pkgconfig_description'
-pkgconfig_version='$ax_create_pkgconfig_version'
-pkgconfig_requires='$ax_create_pkgconfig_requires'
-pkgconfig_libs='$ax_create_pkgconfig_libs'
-pkgconfig_ldflags='$ax_create_pkgconfig_ldflags'
-pkgconfig_cppflags='$ax_create_pkgconfig_cppflags'
-pkgconfig_src_libdir='$ax_create_pkgconfig_src_libdir'
-pkgconfig_src_headers='$ax_create_pkgconfig_src_headers'
-
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-
-# Handling of arguments.
-for ac_config_target in $ac_config_targets
-do
-  case $ac_config_target in
-    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
-    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
-    "$ac_stdint_h") CONFIG_COMMANDS="$CONFIG_COMMANDS $ac_stdint_h" ;;
-    "$ax_create_pkgconfig_generate") CONFIG_COMMANDS="$CONFIG_COMMANDS $ax_create_pkgconfig_generate" ;;
-    "isl_config.h") CONFIG_HEADERS="$CONFIG_HEADERS isl_config.h" ;;
-    "include/isl/config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/isl/config.h" ;;
-    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-    "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
-    "bound_test.sh") CONFIG_FILES="$CONFIG_FILES bound_test.sh" ;;
-    "pip_test.sh") CONFIG_FILES="$CONFIG_FILES pip_test.sh" ;;
-
-  *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
-  esac
-done
-
-
-# If the user did not use the arguments to specify the items to instantiate,
-# then the envvar interface is used.  Set only those that are not.
-# We use the long form for the default assignment because of an extremely
-# bizarre bug on SunOS 4.1.3.
-if $ac_need_defaults; then
-  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
-  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
-  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
-fi
-
-# Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason against having it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Hook for its removal unless debugging.
-# Note that there is a small window in which the directory will not be cleaned:
-# after its creation but before its name has been assigned to `$tmp'.
-$debug ||
-{
-  tmp=
-  trap 'exit_status=$?
-  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
-' 0
-  trap 'as_fn_exit 1' 1 2 13 15
-}
-# Create a (secure) tmp directory for tmp files.
-
-{
-  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
-  test -n "$tmp" && test -d "$tmp"
-}  ||
-{
-  tmp=./conf$$-$RANDOM
-  (umask 077 && mkdir "$tmp")
-} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5
-
-# Set up the scripts for CONFIG_FILES section.
-# No need to generate them if there are no CONFIG_FILES.
-# This happens for instance with `./config.status config.h'.
-if test -n "$CONFIG_FILES"; then
-
-
-ac_cr=`echo X | tr X '\015'`
-# On cygwin, bash can eat \r inside `` if the user requested igncr.
-# But we know of no other shell where ac_cr would be empty at this
-# point, so we can use a bashism as a fallback.
-if test "x$ac_cr" = x; then
-  eval ac_cr=\$\'\\r\'
-fi
-ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
-if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
-  ac_cs_awk_cr='\r'
-else
-  ac_cs_awk_cr=$ac_cr
-fi
-
-echo 'BEGIN {' >"$tmp/subs1.awk" &&
-_ACEOF
-
-
-{
-  echo "cat >conf$$subs.awk <<_ACEOF" &&
-  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
-  echo "_ACEOF"
-} >conf$$subs.sh ||
-  as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
-ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
-ac_delim='%!_!# '
-for ac_last_try in false false false false false :; do
-  . ./conf$$subs.sh ||
-    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
-
-  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
-  if test $ac_delim_n = $ac_delim_num; then
-    break
-  elif $ac_last_try; then
-    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
-  else
-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
-  fi
-done
-rm -f conf$$subs.sh
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
-_ACEOF
-sed -n '
-h
-s/^/S["/; s/!.*/"]=/
-p
-g
-s/^[^!]*!//
-:repl
-t repl
-s/'"$ac_delim"'$//
-t delim
-:nl
-h
-s/\(.\{148\}\)..*/\1/
-t more1
-s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
-p
-n
-b repl
-:more1
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t nl
-:delim
-h
-s/\(.\{148\}\)..*/\1/
-t more2
-s/["\\]/\\&/g; s/^/"/; s/$/"/
-p
-b
-:more2
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t delim
-' <conf$$subs.awk | sed '
-/^[^""]/{
-  N
-  s/\n//
-}
-' >>$CONFIG_STATUS || ac_write_fail=1
-rm -f conf$$subs.awk
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-_ACAWK
-cat >>"\$tmp/subs1.awk" <<_ACAWK &&
-  for (key in S) S_is_set[key] = 1
-  FS = ""
-
-}
-{
-  line = $ 0
-  nfields = split(line, field, "@")
-  substed = 0
-  len = length(field[1])
-  for (i = 2; i < nfields; i++) {
-    key = field[i]
-    keylen = length(key)
-    if (S_is_set[key]) {
-      value = S[key]
-      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
-      len += length(value) + length(field[++i])
-      substed = 1
-    } else
-      len += 1 + keylen
-  }
-
-  print line
-}
-
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
-  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
-else
-  cat
-fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
-  || as_fn_error "could not setup config files machinery" "$LINENO" 5
-_ACEOF
-
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
-s/:*\$(srcdir):*/:/
-s/:*\${srcdir}:*/:/
-s/:*@srcdir@:*/:/
-s/^\([^=]*=[	 ]*\):*/\1/
-s/:*$//
-s/^[^=]*=[	 ]*$//
-}'
-fi
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-fi # test -n "$CONFIG_FILES"
-
-# Set up the scripts for CONFIG_HEADERS section.
-# No need to generate them if there are no CONFIG_HEADERS.
-# This happens for instance with `./config.status Makefile'.
-if test -n "$CONFIG_HEADERS"; then
-cat >"$tmp/defines.awk" <<\_ACAWK ||
-BEGIN {
-_ACEOF
-
-# Transform confdefs.h into an awk script `defines.awk', embedded as
-# here-document in config.status, that substitutes the proper values into
-# config.h.in to produce config.h.
-
-# Create a delimiter string that does not exist in confdefs.h, to ease
-# handling of long lines.
-ac_delim='%!_!# '
-for ac_last_try in false false :; do
-  ac_t=`sed -n "/$ac_delim/p" confdefs.h`
-  if test -z "$ac_t"; then
-    break
-  elif $ac_last_try; then
-    as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5
-  else
-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
-  fi
-done
-
-# For the awk script, D is an array of macro values keyed by name,
-# likewise P contains macro parameters if any.  Preserve backslash
-# newline sequences.
-
-ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
-sed -n '
-s/.\{148\}/&'"$ac_delim"'/g
-t rset
-:rset
-s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
-t def
-d
-:def
-s/\\$//
-t bsnl
-s/["\\]/\\&/g
-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
-D["\1"]=" \3"/p
-s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
-d
-:bsnl
-s/["\\]/\\&/g
-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
-D["\1"]=" \3\\\\\\n"\\/p
-t cont
-s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
-t cont
-d
-:cont
-n
-s/.\{148\}/&'"$ac_delim"'/g
-t clear
-:clear
-s/\\$//
-t bsnlc
-s/["\\]/\\&/g; s/^/"/; s/$/"/p
-d
-:bsnlc
-s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
-b cont
-' <confdefs.h | sed '
-s/'"$ac_delim"'/"\\\
-"/g' >>$CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-  for (key in D) D_is_set[key] = 1
-  FS = ""
-}
-/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
-  line = \$ 0
-  split(line, arg, " ")
-  if (arg[1] == "#") {
-    defundef = arg[2]
-    mac1 = arg[3]
-  } else {
-    defundef = substr(arg[1], 2)
-    mac1 = arg[2]
-  }
-  split(mac1, mac2, "(") #)
-  macro = mac2[1]
-  prefix = substr(line, 1, index(line, defundef) - 1)
-  if (D_is_set[macro]) {
-    # Preserve the white space surrounding the "#".
-    print prefix "define", macro P[macro] D[macro]
-    next
-  } else {
-    # Replace #undef with comments.  This is necessary, for example,
-    # in the case of _POSIX_SOURCE, which is predefined and required
-    # on some systems where configure will not decide to define it.
-    if (defundef == "undef") {
-      print "/*", prefix defundef, macro, "*/"
-      next
-    }
-  }
-}
-{ print }
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-  as_fn_error "could not setup config headers machinery" "$LINENO" 5
-fi # test -n "$CONFIG_HEADERS"
-
-
-eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
-shift
-for ac_tag
-do
-  case $ac_tag in
-  :[FHLC]) ac_mode=$ac_tag; continue;;
-  esac
-  case $ac_mode$ac_tag in
-  :[FHL]*:*);;
-  :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;;
-  :[FH]-) ac_tag=-:-;;
-  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
-  esac
-  ac_save_IFS=$IFS
-  IFS=:
-  set x $ac_tag
-  IFS=$ac_save_IFS
-  shift
-  ac_file=$1
-  shift
-
-  case $ac_mode in
-  :L) ac_source=$1;;
-  :[FH])
-    ac_file_inputs=
-    for ac_f
-    do
-      case $ac_f in
-      -) ac_f="$tmp/stdin";;
-      *) # Look for the file first in the build tree, then in the source tree
-	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
-	 # because $ac_f cannot contain `:'.
-	 test -f "$ac_f" ||
-	   case $ac_f in
-	   [\\/$]*) false;;
-	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
-	   esac ||
-	   as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;;
-      esac
-      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
-      as_fn_append ac_file_inputs " '$ac_f'"
-    done
-
-    # Let's still pretend it is `configure' which instantiates (i.e., don't
-    # use $as_me), people would be surprised to read:
-    #    /* config.h.  Generated by config.status.  */
-    configure_input='Generated from '`
-	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
-	`' by configure.'
-    if test x"$ac_file" != x-; then
-      configure_input="$ac_file.  $configure_input"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
-    fi
-    # Neutralize special characters interpreted by sed in replacement strings.
-    case $configure_input in #(
-    *\&* | *\|* | *\\* )
-       ac_sed_conf_input=`$as_echo "$configure_input" |
-       sed 's/[\\\\&|]/\\\\&/g'`;; #(
-    *) ac_sed_conf_input=$configure_input;;
-    esac
-
-    case $ac_tag in
-    *:-:* | *:-) cat >"$tmp/stdin" \
-      || as_fn_error "could not create $ac_file" "$LINENO" 5 ;;
-    esac
-    ;;
-  esac
-
-  ac_dir=`$as_dirname -- "$ac_file" ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  as_dir="$ac_dir"; as_fn_mkdir_p
-  ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-
-  case $ac_mode in
-  :F)
-  #
-  # CONFIG_FILE
-  #
-
-  case $INSTALL in
-  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
-  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
-  esac
-  ac_MKDIR_P=$MKDIR_P
-  case $MKDIR_P in
-  [\\/$]* | ?:[\\/]* ) ;;
-  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
-  esac
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# If the template does not know about datarootdir, expand it.
-# FIXME: This hack should be removed a few years after 2.60.
-ac_datarootdir_hack=; ac_datarootdir_seen=
-ac_sed_dataroot='
-/datarootdir/ {
-  p
-  q
-}
-/@datadir@/p
-/@docdir@/p
-/@infodir@/p
-/@localedir@/p
-/@mandir@/p'
-case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
-*datarootdir*) ac_datarootdir_seen=yes;;
-*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-  ac_datarootdir_hack='
-  s&@datadir@&$datadir&g
-  s&@docdir@&$docdir&g
-  s&@infodir@&$infodir&g
-  s&@localedir@&$localedir&g
-  s&@mandir@&$mandir&g
-  s&\\\${datarootdir}&$datarootdir&g' ;;
-esac
-_ACEOF
-
-# Neutralize VPATH when `$srcdir' = `.'.
-# Shell code in configure.ac might set extrasub.
-# FIXME: do we really want to maintain this feature?
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_sed_extra="$ac_vpsub
-$extrasub
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s|@configure_input@|$ac_sed_conf_input|;t t
-s&@top_builddir@&$ac_top_builddir_sub&;t t
-s&@top_build_prefix@&$ac_top_build_prefix&;t t
-s&@srcdir@&$ac_srcdir&;t t
-s&@abs_srcdir@&$ac_abs_srcdir&;t t
-s&@top_srcdir@&$ac_top_srcdir&;t t
-s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
-s&@builddir@&$ac_builddir&;t t
-s&@abs_builddir@&$ac_abs_builddir&;t t
-s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
-s&@INSTALL@&$ac_INSTALL&;t t
-s&@MKDIR_P@&$ac_MKDIR_P&;t t
-$ac_datarootdir_hack
-"
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
-  || as_fn_error "could not create $ac_file" "$LINENO" 5
-
-test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
-  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
-  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined." >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined." >&2;}
-
-  rm -f "$tmp/stdin"
-  case $ac_file in
-  -) cat "$tmp/out" && rm -f "$tmp/out";;
-  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
-  esac \
-  || as_fn_error "could not create $ac_file" "$LINENO" 5
- ;;
-  :H)
-  #
-  # CONFIG_HEADER
-  #
-  if test x"$ac_file" != x-; then
-    {
-      $as_echo "/* $configure_input  */" \
-      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
-    } >"$tmp/config.h" \
-      || as_fn_error "could not create $ac_file" "$LINENO" 5
-    if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
-$as_echo "$as_me: $ac_file is unchanged" >&6;}
-    else
-      rm -f "$ac_file"
-      mv "$tmp/config.h" "$ac_file" \
-	|| as_fn_error "could not create $ac_file" "$LINENO" 5
-    fi
-  else
-    $as_echo "/* $configure_input  */" \
-      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
-      || as_fn_error "could not create -" "$LINENO" 5
-  fi
-# Compute "$ac_file"'s index in $config_headers.
-_am_arg="$ac_file"
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $_am_arg | $_am_arg:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
-$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$_am_arg" : 'X\(//\)[^/]' \| \
-	 X"$_am_arg" : 'X\(//\)$' \| \
-	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$_am_arg" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`/stamp-h$_am_stamp_count
- ;;
-
-  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
-$as_echo "$as_me: executing $ac_file commands" >&6;}
- ;;
-  esac
-
-
-  case $ac_file$ac_mode in
-    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
-  # are listed without --file.  Let's play safe and only enable the eval
-  # if we detect the quoting.
-  case $CONFIG_FILES in
-  *\'*) eval set x "$CONFIG_FILES" ;;
-  *)   set x $CONFIG_FILES ;;
-  esac
-  shift
-  for mf
-  do
-    # Strip MF so we end up with the name of the file.
-    mf=`echo "$mf" | sed -e 's/:.*$//'`
-    # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
-    # some people rename them; so instead we look at the file content.
-    # Grep'ing the first line is not enough: some people post-process
-    # each Makefile.in and add a new line on top of each file to say so.
-    # Grep'ing the whole file is not good either: AIX grep has a line
-    # limit of 2048, but all sed's we know have understand at least 4000.
-    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-      dirpart=`$as_dirname -- "$mf" ||
-$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$mf" : 'X\(//\)[^/]' \| \
-	 X"$mf" : 'X\(//\)$' \| \
-	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$mf" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-    else
-      continue
-    fi
-    # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
-    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-    test -z "$DEPDIR" && continue
-    am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
-    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
-    # Find all dependency output files, they are included files with
-    # $(DEPDIR) in their names.  We invoke sed twice because it is the
-    # simplest approach to changing $(DEPDIR) to its actual value in the
-    # expansion.
-    for file in `sed -n "
-      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-      # Make sure the directory exists.
-      test -f "$dirpart/$file" && continue
-      fdir=`$as_dirname -- "$file" ||
-$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$file" : 'X\(//\)[^/]' \| \
-	 X"$file" : 'X\(//\)$' \| \
-	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      as_dir=$dirpart/$fdir; as_fn_mkdir_p
-      # echo "creating $dirpart/$file"
-      echo '# dummy' > "$dirpart/$file"
-    done
-  done
-}
- ;;
-    "libtool":C)
-
-    # See if we are running on zsh, and set the options which allow our
-    # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
-      setopt NO_GLOB_SUBST
-    fi
-
-    cfgfile="${ofile}T"
-    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
-    $RM "$cfgfile"
-
-    cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $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.
-#
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010 Free Software Foundation,
-#                 Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-
-# The names of the tagged configurations supported by this script.
-available_tags=""
-
-# ### BEGIN LIBTOOL CONFIG
-
-# Which release of libtool.m4 was used?
-macro_version=$macro_version
-macro_revision=$macro_revision
-
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
-
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
-
-# What type of objects to build.
-pic_mode=$pic_mode
-
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
-
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
-
-# An echo program that protects backslashes.
-ECHO=$lt_ECHO
-
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
-
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
-
-# A sed program that does not truncate output.
-SED=$lt_SED
-
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="\$SED -e 1s/^X//"
-
-# A grep program that handles long lines.
-GREP=$lt_GREP
-
-# An ERE matcher.
-EGREP=$lt_EGREP
-
-# A literal string matcher.
-FGREP=$lt_FGREP
-
-# A BSD- or MS-compatible name lister.
-NM=$lt_NM
-
-# Whether we need soft or hard links.
-LN_S=$lt_LN_S
-
-# What is the maximum length of a command?
-max_cmd_len=$max_cmd_len
-
-# Object file suffix (normally "o").
-objext=$ac_objext
-
-# Executable file suffix (normally "").
-exeext=$exeext
-
-# whether the shell understands "unset".
-lt_unset=$lt_unset
-
-# turn spaces into newlines.
-SP2NL=$lt_lt_SP2NL
-
-# turn newlines into spaces.
-NL2SP=$lt_lt_NL2SP
-
-# An object symbol dumper.
-OBJDUMP=$lt_OBJDUMP
-
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
-
-# Command to use when deplibs_check_method == "file_magic".
-file_magic_cmd=$lt_file_magic_cmd
-
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
-
-# A symbol stripping program.
-STRIP=$lt_STRIP
-
-# Commands used to install an old-style archive.
-RANLIB=$lt_RANLIB
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
-
-# Whether to use a lock for old archive extraction.
-lock_old_archive_extraction=$lock_old_archive_extraction
-
-# A C compiler.
-LTCC=$lt_CC
-
-# LTCC compiler flags.
-LTCFLAGS=$lt_CFLAGS
-
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
-
-# Transform the output of nm in a proper C declaration.
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
-
-# Transform the output of nm in a C name address pair.
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
-
-# Transform the output of nm in a C name address pair when lib prefix is needed.
-global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
-
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
-
-# Used to examine libraries when file_magic_cmd begins with "file".
-MAGIC_CMD=$MAGIC_CMD
-
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
-
-# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
-DSYMUTIL=$lt_DSYMUTIL
-
-# Tool to change global to local symbols on Mac OS X.
-NMEDIT=$lt_NMEDIT
-
-# Tool to manipulate fat objects and archives on Mac OS X.
-LIPO=$lt_LIPO
-
-# ldd/readelf like tool for Mach-O binaries on Mac OS X.
-OTOOL=$lt_OTOOL
-
-# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
-OTOOL64=$lt_OTOOL64
-
-# Old archive suffix (normally "a").
-libext=$libext
-
-# Shared library suffix (normally ".so").
-shrext_cmds=$lt_shrext_cmds
-
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
-
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at link time.
-variables_saved_for_relink=$lt_variables_saved_for_relink
-
-# Do we need the "lib" prefix for modules?
-need_lib_prefix=$need_lib_prefix
-
-# Do we need a version for libraries?
-need_version=$need_version
-
-# Library versioning type.
-version_type=$version_type
-
-# Shared library runtime path variable.
-runpath_var=$runpath_var
-
-# Shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
-
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
-
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME
-library_names_spec=$lt_library_names_spec
-
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
-
-# Permission mode override for installation of shared libraries.
-install_override_mode=$lt_install_override_mode
-
-# Command to use after installation of a shared archive.
-postinstall_cmds=$lt_postinstall_cmds
-
-# Command to use after uninstallation of a shared archive.
-postuninstall_cmds=$lt_postuninstall_cmds
-
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
-
-# As "finish_cmds", except a single script fragment to be evaled but
-# not shown.
-finish_eval=$lt_finish_eval
-
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
-
-# Compile-time system search path for libraries.
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
-
-# Run-time system search path for libraries.
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
-
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
-
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
-
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
-
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
-
-
-# The linker used to build libraries.
-LD=$lt_LD
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
-
-# Commands used to build an old-style archive.
-old_archive_cmds=$lt_old_archive_cmds
-
-# A language specific compiler.
-CC=$lt_compiler
-
-# Is the compiler the GNU compiler?
-with_gcc=$GCC
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
-
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc
-
-# Whether or not to disallow shared libs when runtime libs are static.
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec
-
-# Whether the compiler copes with passing no objects directly.
-compiler_needs_object=$lt_compiler_needs_object
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
-
-# Commands used to build a shared archive.
-archive_cmds=$lt_archive_cmds
-archive_expsym_cmds=$lt_archive_expsym_cmds
-
-# Commands used to build a loadable module if different from building
-# a shared archive.
-module_cmds=$lt_module_cmds
-module_expsym_cmds=$lt_module_expsym_cmds
-
-# Whether we are building with GNU ld or not.
-with_gnu_ld=$lt_with_gnu_ld
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag
-
-# Flag that enforces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
-
-# If ld is used when linking, flag to hardcode \$libdir into a binary
-# during linking.  This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
-
-# Whether we need a single "-rpath" flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary.
-hardcode_direct=$hardcode_direct
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
-# library is relocated.
-hardcode_direct_absolute=$hardcode_direct_absolute
-
-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-# into the resulting binary.
-hardcode_minus_L=$hardcode_minus_L
-
-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-# into the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var
-
-# Set to "yes" if building a shared library automatically hardcodes DIR
-# into the library and all subsequent libraries and executables linked
-# against it.
-hardcode_automatic=$hardcode_automatic
-
-# Set to yes if linker adds runtime paths of dependent libraries
-# to runtime path list.
-inherit_rpath=$inherit_rpath
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs
-
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path=$lt_fix_srcfile_path
-
-# Set to "yes" if exported symbols are required.
-always_export_symbols=$always_export_symbols
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms
-
-# Commands necessary for linking programs (against libraries) with templates.
-prelink_cmds=$lt_prelink_cmds
-
-# Specify filename containing input files.
-file_list_spec=$lt_file_list_spec
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action
-
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
-  case $host_os in
-  aix3*)
-    cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-_LT_EOF
-    ;;
-  esac
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  case $xsi_shell in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result="${1##*/}"
-}
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-  func_basename_result="${1##*/}"
-}
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-func_stripname ()
-{
-  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-  # positional parameters, so assign one to ordinary parameter first.
-  func_stripname_result=${3}
-  func_stripname_result=${func_stripname_result#"${1}"}
-  func_stripname_result=${func_stripname_result%"${2}"}
-}
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=${1%%=*}
-  func_opt_split_arg=${1#*=}
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  case ${1} in
-    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-    *)    func_lo2o_result=${1} ;;
-  esac
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=${1%.*}.lo
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=$(( $* ))
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=${#1}
-}
-
-_LT_EOF
-    ;;
-  *) # Bourne compatible functions.
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result=`$ECHO "${1}" | $SED "$basename"`
-}
-
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-  case ${2} in
-    .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-    *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
-  esac
-}
-
-# sed scripts:
-my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q'
-my_sed_long_arg='1s/^-[^=]*=//'
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=`$ECHO "${1}" | $SED "$my_sed_long_opt"`
-  func_opt_split_arg=`$ECHO "${1}" | $SED "$my_sed_long_arg"`
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=`expr "$@"`
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
-}
-
-_LT_EOF
-esac
-
-case $lt_shell_append in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$1+=\$2"
-}
-_LT_EOF
-    ;;
-  *)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$1=\$$1\$2"
-}
-
-_LT_EOF
-    ;;
-  esac
-
-
-  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  mv -f "$cfgfile" "$ofile" ||
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
-
- ;;
-    "$ac_stdint_h":C)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_stdint_h : $_ac_stdint_h" >&5
-$as_echo "$as_me: creating $ac_stdint_h : $_ac_stdint_h" >&6;}
-ac_stdint=$tmp/_stdint.h
-
-echo "#ifndef" $_ac_stdint_h >$ac_stdint
-echo "#define" $_ac_stdint_h "1" >>$ac_stdint
-echo "#ifndef" _GENERATED_STDINT_H >>$ac_stdint
-echo "#define" _GENERATED_STDINT_H '"'$PACKAGE $VERSION'"' >>$ac_stdint
-echo "/* generated $ac_cv_stdint_message */" >>$ac_stdint
-if test "_$ac_cv_header_stdint_t" != "_" ; then
-echo "#define _STDINT_HAVE_STDINT_H" "1" >>$ac_stdint
-echo "#include <stdint.h>" >>$ac_stdint
-echo "#endif" >>$ac_stdint
-echo "#endif" >>$ac_stdint
-else
-
-cat >>$ac_stdint <<STDINT_EOF
-
-/* ................... shortcircuit part ........................... */
-
-#if defined HAVE_STDINT_H || defined _STDINT_HAVE_STDINT_H
-#include <stdint.h>
-#else
-#include <stddef.h>
-
-/* .................... configured part ............................ */
-
-STDINT_EOF
-
-echo "/* whether we have a C99 compatible stdint header file */" >>$ac_stdint
-if test "_$ac_cv_header_stdint_x" != "_" ; then
-  ac_header="$ac_cv_header_stdint_x"
-  echo "#define _STDINT_HEADER_INTPTR" '"'"$ac_header"'"' >>$ac_stdint
-else
-  echo "/* #undef _STDINT_HEADER_INTPTR */" >>$ac_stdint
-fi
-
-echo "/* whether we have a C96 compatible inttypes header file */" >>$ac_stdint
-if  test "_$ac_cv_header_stdint_o" != "_" ; then
-  ac_header="$ac_cv_header_stdint_o"
-  echo "#define _STDINT_HEADER_UINT32" '"'"$ac_header"'"' >>$ac_stdint
-else
-  echo "/* #undef _STDINT_HEADER_UINT32 */" >>$ac_stdint
-fi
-
-echo "/* whether we have a BSD compatible inet types header */" >>$ac_stdint
-if  test "_$ac_cv_header_stdint_u" != "_" ; then
-  ac_header="$ac_cv_header_stdint_u"
-  echo "#define _STDINT_HEADER_U_INT32" '"'"$ac_header"'"' >>$ac_stdint
-else
-  echo "/* #undef _STDINT_HEADER_U_INT32 */" >>$ac_stdint
-fi
-
-echo "" >>$ac_stdint
-
-if test "_$ac_header" != "_" ; then if test "$ac_header" != "stddef.h" ; then
-  echo "#include <$ac_header>" >>$ac_stdint
-  echo "" >>$ac_stdint
-fi fi
-
-echo "/* which 64bit typedef has been found */" >>$ac_stdint
-if test "$ac_cv_type_uint64_t" = "yes" ; then
-echo "#define   _STDINT_HAVE_UINT64_T" "1"  >>$ac_stdint
-else
-echo "/* #undef _STDINT_HAVE_UINT64_T */" >>$ac_stdint
-fi
-if test "$ac_cv_type_u_int64_t" = "yes" ; then
-echo "#define   _STDINT_HAVE_U_INT64_T" "1"  >>$ac_stdint
-else
-echo "/* #undef _STDINT_HAVE_U_INT64_T */" >>$ac_stdint
-fi
-echo "" >>$ac_stdint
-
-echo "/* which type model has been detected */" >>$ac_stdint
-if test "_$ac_cv_char_data_model" != "_" ; then
-echo "#define   _STDINT_CHAR_MODEL" "$ac_cv_char_data_model" >>$ac_stdint
-echo "#define   _STDINT_LONG_MODEL" "$ac_cv_long_data_model" >>$ac_stdint
-else
-echo "/* #undef _STDINT_CHAR_MODEL // skipped */" >>$ac_stdint
-echo "/* #undef _STDINT_LONG_MODEL // skipped */" >>$ac_stdint
-fi
-echo "" >>$ac_stdint
-
-echo "/* whether int_least types were detected */" >>$ac_stdint
-if test "$ac_cv_type_int_least32_t" = "yes"; then
-echo "#define   _STDINT_HAVE_INT_LEAST32_T" "1"  >>$ac_stdint
-else
-echo "/* #undef _STDINT_HAVE_INT_LEAST32_T */" >>$ac_stdint
-fi
-echo "/* whether int_fast types were detected */" >>$ac_stdint
-if test "$ac_cv_type_int_fast32_t" = "yes"; then
-echo "#define   _STDINT_HAVE_INT_FAST32_T" "1" >>$ac_stdint
-else
-echo "/* #undef _STDINT_HAVE_INT_FAST32_T */" >>$ac_stdint
-fi
-echo "/* whether intmax_t type was detected */" >>$ac_stdint
-if test "$ac_cv_type_intmax_t" = "yes"; then
-echo "#define   _STDINT_HAVE_INTMAX_T" "1" >>$ac_stdint
-else
-echo "/* #undef _STDINT_HAVE_INTMAX_T */" >>$ac_stdint
-fi
-echo "" >>$ac_stdint
-
-  cat >>$ac_stdint <<STDINT_EOF
-/* .................... detections part ............................ */
-
-/* whether we need to define bitspecific types from compiler base types */
-#ifndef _STDINT_HEADER_INTPTR
-#ifndef _STDINT_HEADER_UINT32
-#ifndef _STDINT_HEADER_U_INT32
-#define _STDINT_NEED_INT_MODEL_T
-#else
-#define _STDINT_HAVE_U_INT_TYPES
-#endif
-#endif
-#endif
-
-#ifdef _STDINT_HAVE_U_INT_TYPES
-#undef _STDINT_NEED_INT_MODEL_T
-#endif
-
-#ifdef  _STDINT_CHAR_MODEL
-#if     _STDINT_CHAR_MODEL+0 == 122 || _STDINT_CHAR_MODEL+0 == 124
-#ifndef _STDINT_BYTE_MODEL
-#define _STDINT_BYTE_MODEL 12
-#endif
-#endif
-#endif
-
-#ifndef _STDINT_HAVE_INT_LEAST32_T
-#define _STDINT_NEED_INT_LEAST_T
-#endif
-
-#ifndef _STDINT_HAVE_INT_FAST32_T
-#define _STDINT_NEED_INT_FAST_T
-#endif
-
-#ifndef _STDINT_HEADER_INTPTR
-#define _STDINT_NEED_INTPTR_T
-#ifndef _STDINT_HAVE_INTMAX_T
-#define _STDINT_NEED_INTMAX_T
-#endif
-#endif
-
-
-/* .................... definition part ............................ */
-
-/* some system headers have good uint64_t */
-#ifndef _HAVE_UINT64_T
-#if     defined _STDINT_HAVE_UINT64_T  || defined HAVE_UINT64_T
-#define _HAVE_UINT64_T
-#elif   defined _STDINT_HAVE_U_INT64_T || defined HAVE_U_INT64_T
-#define _HAVE_UINT64_T
-typedef u_int64_t uint64_t;
-#endif
-#endif
-
-#ifndef _HAVE_UINT64_T
-/* .. here are some common heuristics using compiler runtime specifics */
-#if defined __STDC_VERSION__ && defined __STDC_VERSION__ >= 199901L
-#define _HAVE_UINT64_T
-#define _HAVE_LONGLONG_UINT64_T
-typedef long long int64_t;
-typedef unsigned long long uint64_t;
-
-#elif !defined __STRICT_ANSI__
-#if defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__
-#define _HAVE_UINT64_T
-typedef __int64 int64_t;
-typedef unsigned __int64 uint64_t;
-
-#elif defined __GNUC__ || defined __MWERKS__ || defined __ELF__
-/* note: all ELF-systems seem to have loff-support which needs 64-bit */
-#if !defined _NO_LONGLONG
-#define _HAVE_UINT64_T
-#define _HAVE_LONGLONG_UINT64_T
-typedef long long int64_t;
-typedef unsigned long long uint64_t;
-#endif
-
-#elif defined __alpha || (defined __mips && defined _ABIN32)
-#if !defined _NO_LONGLONG
-typedef long int64_t;
-typedef unsigned long uint64_t;
-#endif
-  /* compiler/cpu type to define int64_t */
-#endif
-#endif
-#endif
-
-#if defined _STDINT_HAVE_U_INT_TYPES
-/* int8_t int16_t int32_t defined by inet code, redeclare the u_intXX types */
-typedef u_int8_t uint8_t;
-typedef u_int16_t uint16_t;
-typedef u_int32_t uint32_t;
-
-/* glibc compatibility */
-#ifndef __int8_t_defined
-#define __int8_t_defined
-#endif
-#endif
-
-#ifdef _STDINT_NEED_INT_MODEL_T
-/* we must guess all the basic types. Apart from byte-adressable system, */
-/* there a few 32-bit-only dsp-systems that we guard with BYTE_MODEL 8-} */
-/* (btw, those nibble-addressable systems are way off, or so we assume) */
-
-
-#if defined _STDINT_BYTE_MODEL
-#if _STDINT_LONG_MODEL+0 == 242
-/* 2:4:2 =  IP16 = a normal 16-bit system                */
-typedef unsigned char   uint8_t;
-typedef unsigned short  uint16_t;
-typedef unsigned long   uint32_t;
-#ifndef __int8_t_defined
-#define __int8_t_defined
-typedef          char    int8_t;
-typedef          short   int16_t;
-typedef          long    int32_t;
-#endif
-#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL == 444
-/* 2:4:4 =  LP32 = a 32-bit system derived from a 16-bit */
-/* 4:4:4 = ILP32 = a normal 32-bit system                */
-typedef unsigned char   uint8_t;
-typedef unsigned short  uint16_t;
-typedef unsigned int    uint32_t;
-#ifndef __int8_t_defined
-#define __int8_t_defined
-typedef          char    int8_t;
-typedef          short   int16_t;
-typedef          int     int32_t;
-#endif
-#elif _STDINT_LONG_MODEL+0 == 484 || _STDINT_LONG_MODEL+0 == 488
-/* 4:8:4 =  IP32 = a 32-bit system prepared for 64-bit    */
-/* 4:8:8 =  LP64 = a normal 64-bit system                 */
-typedef unsigned char   uint8_t;
-typedef unsigned short  uint16_t;
-typedef unsigned int    uint32_t;
-#ifndef __int8_t_defined
-#define __int8_t_defined
-typedef          char    int8_t;
-typedef          short   int16_t;
-typedef          int     int32_t;
-#endif
-/* this system has a "long" of 64bit */
-#ifndef _HAVE_UINT64_T
-#define _HAVE_UINT64_T
-typedef unsigned long   uint64_t;
-typedef          long    int64_t;
-#endif
-#elif _STDINT_LONG_MODEL+0 == 448
-/*      LLP64   a 64-bit system derived from a 32-bit system */
-typedef unsigned char   uint8_t;
-typedef unsigned short  uint16_t;
-typedef unsigned int    uint32_t;
-#ifndef __int8_t_defined
-#define __int8_t_defined
-typedef          char    int8_t;
-typedef          short   int16_t;
-typedef          int     int32_t;
-#endif
-/* assuming the system has a "long long" */
-#ifndef _HAVE_UINT64_T
-#define _HAVE_UINT64_T
-#define _HAVE_LONGLONG_UINT64_T
-typedef unsigned long long uint64_t;
-typedef          long long  int64_t;
-#endif
-#else
-#define _STDINT_NO_INT32_T
-#endif
-#else
-#define _STDINT_NO_INT8_T
-#define _STDINT_NO_INT32_T
-#endif
-#endif
-
-/*
- * quote from SunOS-5.8 sys/inttypes.h:
- * Use at your own risk.  As of February 1996, the committee is squarely
- * behind the fixed sized types; the "least" and "fast" types are still being
- * discussed.  The probability that the "fast" types may be removed before
- * the standard is finalized is high enough that they are not currently
- * implemented.
- */
-
-#if defined _STDINT_NEED_INT_LEAST_T
-typedef  int8_t    int_least8_t;
-typedef  int16_t   int_least16_t;
-typedef  int32_t   int_least32_t;
-#ifdef _HAVE_UINT64_T
-typedef  int64_t   int_least64_t;
-#endif
-
-typedef uint8_t   uint_least8_t;
-typedef uint16_t  uint_least16_t;
-typedef uint32_t  uint_least32_t;
-#ifdef _HAVE_UINT64_T
-typedef uint64_t  uint_least64_t;
-#endif
-  /* least types */
-#endif
-
-#if defined _STDINT_NEED_INT_FAST_T
-typedef  int8_t    int_fast8_t;
-typedef  int       int_fast16_t;
-typedef  int32_t   int_fast32_t;
-#ifdef _HAVE_UINT64_T
-typedef  int64_t   int_fast64_t;
-#endif
-
-typedef uint8_t   uint_fast8_t;
-typedef unsigned  uint_fast16_t;
-typedef uint32_t  uint_fast32_t;
-#ifdef _HAVE_UINT64_T
-typedef uint64_t  uint_fast64_t;
-#endif
-  /* fast types */
-#endif
-
-#ifdef _STDINT_NEED_INTMAX_T
-#ifdef _HAVE_UINT64_T
-typedef  int64_t       intmax_t;
-typedef uint64_t      uintmax_t;
-#else
-typedef          long  intmax_t;
-typedef unsigned long uintmax_t;
-#endif
-#endif
-
-#ifdef _STDINT_NEED_INTPTR_T
-#ifndef __intptr_t_defined
-#define __intptr_t_defined
-/* we encourage using "long" to store pointer values, never use "int" ! */
-#if   _STDINT_LONG_MODEL+0 == 242 || _STDINT_LONG_MODEL+0 == 484
-typedef  unsigned int   uintptr_t;
-typedef           int    intptr_t;
-#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL+0 == 444
-typedef  unsigned long  uintptr_t;
-typedef           long   intptr_t;
-#elif _STDINT_LONG_MODEL+0 == 448 && defined _HAVE_UINT64_T
-typedef        uint64_t uintptr_t;
-typedef         int64_t  intptr_t;
-#else /* matches typical system types ILP32 and LP64 - but not IP16 or LLP64 */
-typedef  unsigned long  uintptr_t;
-typedef           long   intptr_t;
-#endif
-#endif
-#endif
-
-/* The ISO C99 standard specifies that in C++ implementations these
-   should only be defined if explicitly requested.  */
-#if !defined __cplusplus || defined __STDC_CONSTANT_MACROS
-#ifndef UINT32_C
-
-/* Signed.  */
-# define INT8_C(c)      c
-# define INT16_C(c)     c
-# define INT32_C(c)     c
-# ifdef _HAVE_LONGLONG_UINT64_T
-#  define INT64_C(c)    c ## L
-# else
-#  define INT64_C(c)    c ## LL
-# endif
-
-/* Unsigned.  */
-# define UINT8_C(c)     c ## U
-# define UINT16_C(c)    c ## U
-# define UINT32_C(c)    c ## U
-# ifdef _HAVE_LONGLONG_UINT64_T
-#  define UINT64_C(c)   c ## UL
-# else
-#  define UINT64_C(c)   c ## ULL
-# endif
-
-/* Maximal type.  */
-# ifdef _HAVE_LONGLONG_UINT64_T
-#  define INTMAX_C(c)   c ## L
-#  define UINTMAX_C(c)  c ## UL
-# else
-#  define INTMAX_C(c)   c ## LL
-#  define UINTMAX_C(c)  c ## ULL
-# endif
-
-  /* literalnumbers */
-#endif
-#endif
-
-/* These limits are merily those of a two complement byte-oriented system */
-
-/* Minimum of signed integral types.  */
-# define INT8_MIN               (-128)
-# define INT16_MIN              (-32767-1)
-# define INT32_MIN              (-2147483647-1)
-#ifndef INT64_MIN
-# define INT64_MIN              (-__INT64_C(9223372036854775807)-1)
-#endif
-/* Maximum of signed integral types.  */
-# define INT8_MAX               (127)
-# define INT16_MAX              (32767)
-# define INT32_MAX              (2147483647)
-#ifndef INT64_MAX
-# define INT64_MAX              (__INT64_C(9223372036854775807))
-#endif
-
-/* Maximum of unsigned integral types.  */
-#ifndef UINT8_MAX
-# define UINT8_MAX              (255)
-#endif
-#ifndef UINT16_MAX
-# define UINT16_MAX             (65535)
-#endif
-# define UINT32_MAX             (4294967295U)
-#ifndef UINT64_MAX
-# define UINT64_MAX             (__UINT64_C(18446744073709551615))
-#endif
-
-/* Minimum of signed integral types having a minimum size.  */
-# define INT_LEAST8_MIN         INT8_MIN
-# define INT_LEAST16_MIN        INT16_MIN
-# define INT_LEAST32_MIN        INT32_MIN
-# define INT_LEAST64_MIN        INT64_MIN
-/* Maximum of signed integral types having a minimum size.  */
-# define INT_LEAST8_MAX         INT8_MAX
-# define INT_LEAST16_MAX        INT16_MAX
-# define INT_LEAST32_MAX        INT32_MAX
-# define INT_LEAST64_MAX        INT64_MAX
-
-/* Maximum of unsigned integral types having a minimum size.  */
-# define UINT_LEAST8_MAX        UINT8_MAX
-# define UINT_LEAST16_MAX       UINT16_MAX
-# define UINT_LEAST32_MAX       UINT32_MAX
-# define UINT_LEAST64_MAX       UINT64_MAX
-
-  /* shortcircuit*/
-#endif
-  /* once */
-#endif
-#endif
-STDINT_EOF
-fi
-    if cmp -s $ac_stdint_h $ac_stdint 2>/dev/null; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_stdint_h is unchanged" >&5
-$as_echo "$as_me: $ac_stdint_h is unchanged" >&6;}
-    else
-      ac_dir=`$as_dirname -- "$ac_stdint_h" ||
-$as_expr X"$ac_stdint_h" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_stdint_h" : 'X\(//\)[^/]' \| \
-	 X"$ac_stdint_h" : 'X\(//\)$' \| \
-	 X"$ac_stdint_h" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_stdint_h" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      as_dir="$ac_dir"; as_fn_mkdir_p
-      rm -f $ac_stdint_h
-      mv $ac_stdint $ac_stdint_h
-    fi
- ;;
-    "$ax_create_pkgconfig_generate":C)
-pkgconfig_generate="$ax_create_pkgconfig_generate"
-if test ! -f "$pkgconfig_generate.in"
-then generate="true"
-elif grep ' generated by configure ' $pkgconfig_generate.in >/dev/null
-then generate="true"
-else generate="false";
-fi
-if $generate ; then
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $pkgconfig_generate.in" >&5
-$as_echo "$as_me: creating $pkgconfig_generate.in" >&6;}
-cat > $pkgconfig_generate.in <<AXEOF
-# generated by configure / remove this line to disable regeneration
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-bindir=@bindir@
-libdir=@libdir@
-datarootdir=@datarootdir@
-datadir=@datadir@
-sysconfdir=@sysconfdir@
-includedir=@includedir@
-package=@PACKAGE@
-suffix=@suffix@
-
-Name: @PACKAGE_NAME@
-Description: @PACKAGE_DESCRIPTION@
-Version: @PACKAGE_VERSION@
-Requires: @PACKAGE_REQUIRES@
-Libs: -L\${libdir} @LDFLAGS@ @LIBS@
-Cflags: -I\${includedir} @CPPFLAGS@
-AXEOF
-fi # DONE generate $pkgconfig_generate.in
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $pkgconfig_generate" >&5
-$as_echo "$as_me: creating $pkgconfig_generate" >&6;}
-cat >conftest.sed <<AXEOF
-s|@prefix@|${pkgconfig_prefix}|
-s|@exec_prefix@|${pkgconfig_execprefix}|
-s|@bindir@|${pkgconfig_bindir}|
-s|@libdir@|${pkgconfig_libdir}|
-s|@datarootdir@|${pkgconfig_datarootdir}|
-s|@datadir@|${pkgconfig_datadir}|
-s|@sysconfdir@|${pkgconfig_sysconfdir}|
-s|@includedir@|${pkgconfig_includedir}|
-s|@suffix@|${pkgconfig_suffix}|
-s|@PACKAGE@|${pkgconfig_package}|
-s|@PACKAGE_NAME@|${pkgconfig_libname}|
-s|@PACKAGE_DESCRIPTION@|${pkgconfig_description}|
-s|@PACKAGE_VERSION@|${pkgconfig_version}|
-s|@PACKAGE_REQUIRES@|${pkgconfig_requires}|
-s|@LIBS@|${pkgconfig_libs}|
-s|@LDFLAGS@|${pkgconfig_ldflags}|
-s|@CPPFLAGS@|${pkgconfig_cppflags}|
-AXEOF
-sed -f conftest.sed  $pkgconfig_generate.in > $pkgconfig_generate
-if test ! -s $pkgconfig_generate ; then
-    as_fn_error "$pkgconfig_generate is empty" "$LINENO" 5
-fi ; rm conftest.sed # DONE generate $pkgconfig_generate
-pkgconfig_uninstalled=`echo $pkgconfig_generate |sed 's/.pc$/-uninstalled.pc/'`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $pkgconfig_uninstalled" >&5
-$as_echo "$as_me: creating $pkgconfig_uninstalled" >&6;}
-cat >conftest.sed <<AXEOF
-s|@prefix@|${pkgconfig_prefix}|
-s|@exec_prefix@|${pkgconfig_execprefix}|
-s|@bindir@|${pkgconfig_bindir}|
-s|@libdir@|${pkgconfig_src_libdir}|
-s|@datarootdir@|${pkgconfig_datarootdir}|
-s|@datadir@|${pkgconfig_datadir}|
-s|@sysconfdir@|${pkgconfig_sysconfdir}|
-s|@includedir@|${pkgconfig_src_headers}|
-s|@suffix@|${pkgconfig_suffix}|
-s|@PACKAGE@|${pkgconfig_package}|
-s|@PACKAGE_NAME@|${pkgconfig_libname}|
-s|@PACKAGE_DESCRIPTION@|${pkgconfig_description}|
-s|@PACKAGE_VERSION@|${pkgconfig_version}|
-s|@PACKAGE_REQUIRES@|${pkgconfig_requires}|
-s|@LIBS@|${pkgconfig_libs}|
-s|@LDFLAGS@|${pkgconfig_ldflags}|
-s|@CPPFLAGS@|${pkgconfig_cppflags}|
-AXEOF
-sed -f conftest.sed $pkgconfig_generate.in > $pkgconfig_uninstalled
-if test ! -s $pkgconfig_uninstalled ; then
-    as_fn_error "$pkgconfig_uninstalled is empty" "$LINENO" 5
-fi ; rm conftest.sed # DONE generate $pkgconfig_uninstalled
-           pkgconfig_requires_add=`echo ${pkgconfig_requires}`
-if test ".$pkgconfig_requires_add" != "." ; then
-           pkgconfig_requires_add="pkg-config $pkgconfig_requires_add"
-    else   pkgconfig_requires_add=":" ; fi
-pkgconfig_uninstalled=`echo $pkgconfig_generate |sed 's/.pc$/-uninstalled.sh/'`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $pkgconfig_uninstalled" >&5
-$as_echo "$as_me: creating $pkgconfig_uninstalled" >&6;}
-cat >conftest.sed <<AXEOF
-s|@prefix@|\"${pkgconfig_prefix}\"|
-s|@exec_prefix@|\"${pkgconfig_execprefix}\"|
-s|@bindir@|\"${pkgconfig_bindir}\"|
-s|@libdir@|\"${pkgconfig_src_libdir}\"|
-s|@datarootdir@|\"${pkgconfig_datarootdir}\"|
-s|@datadir@|\"${pkgconfig_datadir}\"|
-s|@sysconfdir@|\"${pkgconfig_sysconfdir}\"|
-s|@includedir@|\"${pkgconfig_src_headers}\"|
-s|@suffix@|\"${pkgconfig_suffix}\"|
-s|@PACKAGE@|\"${pkgconfig_package}\"|
-s|@PACKAGE_NAME@|\"${pkgconfig_libname}\"|
-s|@PACKAGE_DESCRIPTION@|\"${pkgconfig_description}\"|
-s|@PACKAGE_VERSION@|\"${pkgconfig_version}\"|
-s|@PACKAGE_REQUIRES@|\"${pkgconfig_requires}\"|
-s|@LIBS@|\"${pkgconfig_libs}\"|
-s|@LDFLAGS@|\"${pkgconfig_ldflags}\"|
-s|@CPPFLAGS@|\"${pkgconfig_cppflags}\"|
-s>Name:>for option\\; do case \"\$option\" in --list-all|--name) echo >
-s>Description: *>\\;\\; --help) pkg-config --help \\; echo Buildscript Of >
-s>Version: *>\\;\\; --modversion|--version) echo >
-s>Requires:>\\;\\; --requires) echo $pkgconfig_requires_add>
-s>Libs: *>\\;\\; --libs) echo >
-s>Cflags: *>\\;\\; --cflags) echo >
-/--libs)/a\\
-       $pkgconfig_requires_add
-/--cflags)/a\\
-       $pkgconfig_requires_add\\
-;; --variable=*) eval echo '\$'\`echo \$option | sed -e 's/.*=//'\`\\
-;; --uninstalled) exit 0 \\
-;; *) ;; esac done
-AXEOF
-sed -f conftest.sed  $pkgconfig_generate.in > $pkgconfig_uninstalled
-if test ! -s $pkgconfig_uninstalled ; then
-    as_fn_error "$pkgconfig_uninstalled is empty" "$LINENO" 5
-fi ; rm conftest.sed # DONE generate $pkgconfig_uninstalled
- ;;
-    "bound_test.sh":F) chmod +x bound_test.sh ;;
-    "pip_test.sh":F) chmod +x pip_test.sh ;;
-
-  esac
-done # for ac_tag
-
-
-as_fn_exit 0
-_ACEOF
-ac_clean_files=$ac_clean_files_save
-
-test $ac_write_fail = 0 ||
-  as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5
-
-
-			ac_configure_args="$ac_configure_args $isl_configure_args"
-
-
-# configure is writing to config.log, and then calls config.status.
-# config.status does its own redirection, appending to config.log.
-# Unfortunately, on DOS this fails, as config.log is still kept open
-# by configure, so config.status won't be able to write to it; its
-# output is simply discarded.  So we exec the FD to /dev/null,
-# effectively closing config.log, so it can be properly (re)opened and
-# appended to by config.status.  When coming back to configure, we
-# need to make the FD available again.
-if test "$no_create" != yes; then
-  ac_cs_success=:
-  ac_config_status_args=
-  test "$silent" = yes &&
-    ac_config_status_args="$ac_config_status_args --quiet"
-  exec 5>/dev/null
-  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
-  exec 5>>config.log
-  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
-  # would make configure fail if this is the last instruction.
-  $ac_cs_success || as_fn_exit $?
-fi
-if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
-fi
-
diff --git a/cloog-0.16.3/isl/configure.ac b/cloog-0.16.3/isl/configure.ac
deleted file mode 100644
index 8df2cbe..0000000
--- a/cloog-0.16.3/isl/configure.ac
+++ /dev/null
@@ -1,112 +0,0 @@
-AC_INIT([isl], [0.07], [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=7:0:0
-
-AC_PROG_CC
-
-AX_CC_MAXOPT
-AX_GCC_WARN_UNUSED_RESULT
-AX_C___ATTRIBUTE__
-
-AC_PROG_LIBTOOL
-
-AC_CHECK_PROG(PERL, perl, perl, [])
-AC_CHECK_PROG(PDFLATEX, pdflatex, pdflatex, [])
-AC_CHECK_PROG(POD2HTML, pod2html, pod2html, [])
-
-AM_CONDITIONAL(GENERATE_DOC, test -n "$PERL" -a -n "$PDFLATEX" -a -n "$POD2HTML")
-
-AX_CREATE_STDINT_H(include/isl/stdint.h)
-
-AX_SUBMODULE(gmp,system,system)
-
-AC_SUBST(GMP_CPPFLAGS)
-AC_SUBST(GMP_LDFLAGS)
-if test "x$with_gmp_prefix" != "x"; then
-	isl_configure_args="$isl_configure_args --with-gmp=$with_gmp_prefix"
-	GMP_CPPFLAGS="-I$with_gmp_prefix/include"
-	GMP_LDFLAGS="-L$with_gmp_prefix/lib"
-fi
-SAVE_CPPFLAGS="$CPPFLAGS"
-CPPFLAGS="$GMP_CPPFLAGS $CPPFLAGS"
-need_get_memory_functions=false
-AC_CHECK_DECLS(mp_get_memory_functions,[],[
-	need_get_memory_functions=true
-],[#include <gmp.h>])
-CPPFLAGS="$SAVE_CPPFLAGS"
-AM_CONDITIONAL(NEED_GET_MEMORY_FUNCTIONS, test x$need_get_memory_functions = xtrue)
-AC_CHECK_DECLS(ffs,[],[],[#include <strings.h>])
-AC_CHECK_DECLS(__builtin_ffs,[],[],[])
-
-AX_SUBMODULE(piplib,no|system|build,no)
-
-have_piplib=false
-AC_SUBST(PIPLIB_CPPFLAGS)
-AC_SUBST(PIPLIB_LDFLAGS)
-AC_SUBST(PIPLIB_LIBS)
-case "$with_piplib" in
-	build)
-		PIPLIB_CPPFLAGS="-I$piplib_srcdir/include"
-		PIPLIB_LIBS="$with_piplib_builddir/libpiplibMP.la"
-	;;
-	system)
-		PIPLIB_LIBS="-lpiplibMP"
-		if test "x$with_piplib_prefix" != "x"; then
-			PIPLIB_CPPFLAGS="-I$with_piplib_prefix/include"
-			PIPLIB_LDFLAGS="-L$with_piplib_prefix/lib"
-		fi
-		SAVE_CPPFLAGS="$CPPFLAGS"
-		SAVE_LDFLAGS="$LDFLAGS"
-		CPPFLAGS="$PIPLIB_CPPFLAGS $CPPFLAGS"
-		LDFLAGS="$PIPLIB_LDFLAGS $LDFLAGS"
-		AC_CHECK_LIB(piplibMP, pip_solve,[
-			AC_CHECK_MEMBER(PipOptions.Urs_parms, [], [
-				AC_MSG_ERROR([Piplib too old; please install version 1.3.6 or newer])
-			],[#include <piplib/piplibMP.h>])
-		],[
-			AC_MSG_ERROR([Piplib not found])
-		])
-		CPPFLAGS="$SAVE_CPPFLAGS"
-		LDFLAGS="$SAVE_LDFLAGS"
-	;;
-	no)
-	;;
-	*)
-		AC_MSG_ERROR(unsupported)
-	;;
-esac
-if test "$with_piplib" != "no"; then
-	AC_DEFINE(ISL_PIPLIB,,piplib is available)
-	have_piplib=true
-fi
-AM_CONDITIONAL(HAVE_PIPLIB, test x$have_piplib = xtrue)
-
-AX_SET_WARNING_FLAGS
-
-AC_SUBST(WARNING_FLAGS)
-
-PACKAGE_CFLAGS="$GMP_CPPFLAGS"
-PACKAGE_LDFLAGS="$GMP_LDFLAGS"
-PACKAGE_LIBS="-lisl -lgmp"
-AX_CREATE_PKGCONFIG_INFO
-
-AX_DETECT_GIT_HEAD
-echo '#define GIT_HEAD_ID "'$GIT_HEAD_ID'"' > gitversion.h
-
-AH_BOTTOM([#include <isl_config_post.h>])
-AC_CONFIG_HEADERS(isl_config.h)
-AC_CONFIG_HEADERS(include/isl/config.h)
-AC_CONFIG_FILES(Makefile)
-AC_CONFIG_FILES(doc/Makefile)
-AC_CONFIG_FILES([bound_test.sh], [chmod +x bound_test.sh])
-AC_CONFIG_FILES([pip_test.sh], [chmod +x pip_test.sh])
-AC_CONFIG_COMMANDS_POST([
-	dnl pass on arguments to subdir configures, but don't
-	dnl add them to config.status
-	ac_configure_args="$ac_configure_args $isl_configure_args"
-])
-AC_OUTPUT
diff --git a/cloog-0.16.3/isl/depcomp b/cloog-0.16.3/isl/depcomp
deleted file mode 100755
index e5f9736..0000000
--- a/cloog-0.16.3/isl/depcomp
+++ /dev/null
@@ -1,589 +0,0 @@
-#! /bin/sh
-# depcomp - compile a program generating dependencies as side-effects
-
-scriptversion=2007-03-29.01
-
-# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 Free Software
-# Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301, USA.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
-
-case $1 in
-  '')
-     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
-     exit 1;
-     ;;
-  -h | --h*)
-    cat <<\EOF
-Usage: depcomp [--help] [--version] PROGRAM [ARGS]
-
-Run PROGRAMS ARGS to compile a file, generating dependencies
-as side-effects.
-
-Environment variables:
-  depmode     Dependency tracking mode.
-  source      Source file read by `PROGRAMS ARGS'.
-  object      Object file output by `PROGRAMS ARGS'.
-  DEPDIR      directory where to store dependencies.
-  depfile     Dependency file to output.
-  tmpdepfile  Temporary file to use when outputing dependencies.
-  libtool     Whether libtool is used (yes/no).
-
-Report bugs to <bug-automake@gnu.org>.
-EOF
-    exit $?
-    ;;
-  -v | --v*)
-    echo "depcomp $scriptversion"
-    exit $?
-    ;;
-esac
-
-if test -z "$depmode" || test -z "$source" || test -z "$object"; then
-  echo "depcomp: Variables source, object and depmode must be set" 1>&2
-  exit 1
-fi
-
-# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
-depfile=${depfile-`echo "$object" |
-  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
-tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
-
-rm -f "$tmpdepfile"
-
-# Some modes work just like other modes, but use different flags.  We
-# parameterize here, but still list the modes in the big case below,
-# to make depend.m4 easier to write.  Note that we *cannot* use a case
-# here, because this file can only contain one case statement.
-if test "$depmode" = hp; then
-  # HP compiler uses -M and no extra arg.
-  gccflag=-M
-  depmode=gcc
-fi
-
-if test "$depmode" = dashXmstdout; then
-   # This is just like dashmstdout with a different argument.
-   dashmflag=-xM
-   depmode=dashmstdout
-fi
-
-case "$depmode" in
-gcc3)
-## gcc 3 implements dependency tracking that does exactly what
-## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
-## it if -MD -MP comes after the -MF stuff.  Hmm.
-## Unfortunately, FreeBSD c89 acceptance of flags depends upon
-## the command line argument order; so add the flags where they
-## appear in depend2.am.  Note that the slowdown incurred here
-## affects only configure: in makefiles, %FASTDEP% shortcuts this.
-  for arg
-  do
-    case $arg in
-    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
-    *)  set fnord "$@" "$arg" ;;
-    esac
-    shift # fnord
-    shift # $arg
-  done
-  "$@"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  mv "$tmpdepfile" "$depfile"
-  ;;
-
-gcc)
-## There are various ways to get dependency output from gcc.  Here's
-## why we pick this rather obscure method:
-## - Don't want to use -MD because we'd like the dependencies to end
-##   up in a subdir.  Having to rename by hand is ugly.
-##   (We might end up doing this anyway to support other compilers.)
-## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
-##   -MM, not -M (despite what the docs say).
-## - Using -M directly means running the compiler twice (even worse
-##   than renaming).
-  if test -z "$gccflag"; then
-    gccflag=-MD,
-  fi
-  "$@" -Wp,"$gccflag$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
-## The second -e expression handles DOS-style file names with drive letters.
-  sed -e 's/^[^:]*: / /' \
-      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the `deleted header file' problem.
-## The problem is that when a header file which appears in a .P file
-## is deleted, the dependency causes make to die (because there is
-## typically no way to rebuild the header).  We avoid this by adding
-## dummy dependencies for each header file.  Too bad gcc doesn't do
-## this for us directly.
-  tr ' ' '
-' < "$tmpdepfile" |
-## Some versions of gcc put a space before the `:'.  On the theory
-## that the space means something, we add a space to the output as
-## well.
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-hp)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-sgi)
-  if test "$libtool" = yes; then
-    "$@" "-Wp,-MDupdate,$tmpdepfile"
-  else
-    "$@" -MDupdate "$tmpdepfile"
-  fi
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-
-  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
-    echo "$object : \\" > "$depfile"
-
-    # Clip off the initial element (the dependent).  Don't try to be
-    # clever and replace this with sed code, as IRIX sed won't handle
-    # lines with more than a fixed number of characters (4096 in
-    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
-    # the IRIX cc adds comments like `#:fec' to the end of the
-    # dependency line.
-    tr ' ' '
-' < "$tmpdepfile" \
-    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
-    tr '
-' ' ' >> $depfile
-    echo >> $depfile
-
-    # The second pass generates a dummy entry for each header file.
-    tr ' ' '
-' < "$tmpdepfile" \
-   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
-   >> $depfile
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile"
-  ;;
-
-aix)
-  # The C for AIX Compiler uses -M and outputs the dependencies
-  # in a .u file.  In older versions, this file always lives in the
-  # current directory.  Also, the AIX compiler puts `$object:' at the
-  # start of each line; $object doesn't have directory information.
-  # Version 6 uses the directory in both cases.
-  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-  test "x$dir" = "x$object" && dir=
-  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-  if test "$libtool" = yes; then
-    tmpdepfile1=$dir$base.u
-    tmpdepfile2=$base.u
-    tmpdepfile3=$dir.libs/$base.u
-    "$@" -Wc,-M
-  else
-    tmpdepfile1=$dir$base.u
-    tmpdepfile2=$dir$base.u
-    tmpdepfile3=$dir$base.u
-    "$@" -M
-  fi
-  stat=$?
-
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
-    exit $stat
-  fi
-
-  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
-  do
-    test -f "$tmpdepfile" && break
-  done
-  if test -f "$tmpdepfile"; then
-    # Each line is of the form `foo.o: dependent.h'.
-    # Do two passes, one to just change these to
-    # `$object: dependent.h' and one to simply `dependent.h:'.
-    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-    # That's a tab and a space in the [].
-    sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile"
-  ;;
-
-icc)
-  # Intel's C compiler understands `-MD -MF file'.  However on
-  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
-  # ICC 7.0 will fill foo.d with something like
-  #    foo.o: sub/foo.c
-  #    foo.o: sub/foo.h
-  # which is wrong.  We want:
-  #    sub/foo.o: sub/foo.c
-  #    sub/foo.o: sub/foo.h
-  #    sub/foo.c:
-  #    sub/foo.h:
-  # ICC 7.1 will output
-  #    foo.o: sub/foo.c sub/foo.h
-  # and will wrap long lines using \ :
-  #    foo.o: sub/foo.c ... \
-  #     sub/foo.h ... \
-  #     ...
-
-  "$@" -MD -MF "$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  # Each line is of the form `foo.o: dependent.h',
-  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
-  # Do two passes, one to just change these to
-  # `$object: dependent.h' and one to simply `dependent.h:'.
-  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
-  # Some versions of the HPUX 10.20 sed can't process this invocation
-  # correctly.  Breaking it into two sed invocations is a workaround.
-  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
-    sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-hp2)
-  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
-  # compilers, which have integrated preprocessors.  The correct option
-  # to use with these is +Maked; it writes dependencies to a file named
-  # 'foo.d', which lands next to the object file, wherever that
-  # happens to be.
-  # Much of this is similar to the tru64 case; see comments there.
-  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-  test "x$dir" = "x$object" && dir=
-  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-  if test "$libtool" = yes; then
-    tmpdepfile1=$dir$base.d
-    tmpdepfile2=$dir.libs/$base.d
-    "$@" -Wc,+Maked
-  else
-    tmpdepfile1=$dir$base.d
-    tmpdepfile2=$dir$base.d
-    "$@" +Maked
-  fi
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-     rm -f "$tmpdepfile1" "$tmpdepfile2"
-     exit $stat
-  fi
-
-  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
-  do
-    test -f "$tmpdepfile" && break
-  done
-  if test -f "$tmpdepfile"; then
-    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
-    # Add `dependent.h:' lines.
-    sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile"
-  else
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile" "$tmpdepfile2"
-  ;;
-
-tru64)
-   # The Tru64 compiler uses -MD to generate dependencies as a side
-   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
-   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
-   # dependencies in `foo.d' instead, so we check for that too.
-   # Subdirectories are respected.
-   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-   test "x$dir" = "x$object" && dir=
-   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-
-   if test "$libtool" = yes; then
-      # With Tru64 cc, shared objects can also be used to make a
-      # static library.  This mechanism is used in libtool 1.4 series to
-      # handle both shared and static libraries in a single compilation.
-      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
-      #
-      # With libtool 1.5 this exception was removed, and libtool now
-      # generates 2 separate objects for the 2 libraries.  These two
-      # compilations output dependencies in $dir.libs/$base.o.d and
-      # in $dir$base.o.d.  We have to check for both files, because
-      # one of the two compilations can be disabled.  We should prefer
-      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
-      # automatically cleaned when .libs/ is deleted, while ignoring
-      # the former would cause a distcleancheck panic.
-      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
-      tmpdepfile2=$dir$base.o.d          # libtool 1.5
-      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
-      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
-      "$@" -Wc,-MD
-   else
-      tmpdepfile1=$dir$base.o.d
-      tmpdepfile2=$dir$base.d
-      tmpdepfile3=$dir$base.d
-      tmpdepfile4=$dir$base.d
-      "$@" -MD
-   fi
-
-   stat=$?
-   if test $stat -eq 0; then :
-   else
-      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-      exit $stat
-   fi
-
-   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-   do
-     test -f "$tmpdepfile" && break
-   done
-   if test -f "$tmpdepfile"; then
-      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-      # That's a tab and a space in the [].
-      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-   else
-      echo "#dummy" > "$depfile"
-   fi
-   rm -f "$tmpdepfile"
-   ;;
-
-#nosideeffect)
-  # This comment above is used by automake to tell side-effect
-  # dependency tracking mechanisms from slower ones.
-
-dashmstdout)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout, regardless of -o.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove `-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  test -z "$dashmflag" && dashmflag=-M
-  # Require at least two characters before searching for `:'
-  # in the target name.  This is to cope with DOS-style filenames:
-  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
-  "$@" $dashmflag |
-    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
-  rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  tr ' ' '
-' < "$tmpdepfile" | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-dashXmstdout)
-  # This case only exists to satisfy depend.m4.  It is never actually
-  # run, as this mode is specially recognized in the preamble.
-  exit 1
-  ;;
-
-makedepend)
-  "$@" || exit $?
-  # Remove any Libtool call
-  if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-  # X makedepend
-  shift
-  cleared=no
-  for arg in "$@"; do
-    case $cleared in
-    no)
-      set ""; shift
-      cleared=yes ;;
-    esac
-    case "$arg" in
-    -D*|-I*)
-      set fnord "$@" "$arg"; shift ;;
-    # Strip any option that makedepend may not understand.  Remove
-    # the object too, otherwise makedepend will parse it as a source file.
-    -*|$object)
-      ;;
-    *)
-      set fnord "$@" "$arg"; shift ;;
-    esac
-  done
-  obj_suffix="`echo $object | sed 's/^.*\././'`"
-  touch "$tmpdepfile"
-  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
-  rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  sed '1,2d' "$tmpdepfile" | tr ' ' '
-' | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile" "$tmpdepfile".bak
-  ;;
-
-cpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove `-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  "$@" -E |
-    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
-       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
-    sed '$ s: \\$::' > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  cat < "$tmpdepfile" >> "$depfile"
-  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-msvisualcpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout, regardless of -o,
-  # because we must use -o when running libtool.
-  "$@" || exit $?
-  IFS=" "
-  for arg
-  do
-    case "$arg" in
-    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
-	set fnord "$@"
-	shift
-	shift
-	;;
-    *)
-	set fnord "$@" "$arg"
-	shift
-	shift
-	;;
-    esac
-  done
-  "$@" -E |
-  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
-  echo "	" >> "$depfile"
-  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-none)
-  exec "$@"
-  ;;
-
-*)
-  echo "Unknown depmode $depmode" 1>&2
-  exit 1
-  ;;
-esac
-
-exit 0
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
-# End:
diff --git a/cloog-0.16.3/isl/doc/Makefile.am b/cloog-0.16.3/isl/doc/Makefile.am
deleted file mode 100644
index aa79a6c..0000000
--- a/cloog-0.16.3/isl/doc/Makefile.am
+++ /dev/null
@@ -1,17 +0,0 @@
-if GENERATE_DOC
-export TEXINPUTS := $(srcdir):$(TEXINPUTS)
-export BIBINPUTS := $(srcdir):$(BIBINPUTS)
-export BSTINPUTS := $(srcdir):$(BSTINPUTS)
-
-user.tex: user.pod
-	$(PERL) $(srcdir)/mypod2latex $< $@
-manual.pdf: manual.tex user.tex $(srcdir)/implementation.tex
-	(cd ..; echo "@GIT_HEAD_VERSION@") > version.tex
-	$(PDFLATEX) $<
-	bibtex manual
-	$(PDFLATEX) $<
-	$(PDFLATEX) $<
-user.html: user.pod
-	(cd ..; echo "@GIT_HEAD_VERSION@") > version
-	$(POD2HTML) --infile=$< --outfile=$@ --title="Integer Set Library: Manual [version `cat version`]"
-endif
diff --git a/cloog-0.16.3/isl/doc/Makefile.in b/cloog-0.16.3/isl/doc/Makefile.in
deleted file mode 100644
index 72da0fc..0000000
--- a/cloog-0.16.3/isl/doc/Makefile.in
+++ /dev/null
@@ -1,399 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = doc
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_c___attribute__.m4 \
-	$(top_srcdir)/m4/ax_cc_maxopt.m4 \
-	$(top_srcdir)/m4/ax_check_compiler_flags.m4 \
-	$(top_srcdir)/m4/ax_compiler_vendor.m4 \
-	$(top_srcdir)/m4/ax_create_pkgconfig_info.m4 \
-	$(top_srcdir)/m4/ax_create_stdint_h.m4 \
-	$(top_srcdir)/m4/ax_detect_git_head.m4 \
-	$(top_srcdir)/m4/ax_gcc_archflag.m4 \
-	$(top_srcdir)/m4/ax_gcc_warn_unused_result.m4 \
-	$(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \
-	$(top_srcdir)/m4/ax_set_warning_flags.m4 \
-	$(top_srcdir)/m4/ax_submodule.m4 $(top_srcdir)/m4/libtool.m4 \
-	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/isl_config.h \
-	$(top_builddir)/include/isl/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
-SOURCES =
-DIST_SOURCES =
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GIT_HEAD = @GIT_HEAD@
-GIT_HEAD_ID = @GIT_HEAD_ID@
-GIT_HEAD_VERSION = @GIT_HEAD_VERSION@
-GMP_CPPFLAGS = @GMP_CPPFLAGS@
-GMP_LDFLAGS = @GMP_LDFLAGS@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PDFLATEX = @PDFLATEX@
-PERL = @PERL@
-PIPLIB_CPPFLAGS = @PIPLIB_CPPFLAGS@
-PIPLIB_LDFLAGS = @PIPLIB_LDFLAGS@
-PIPLIB_LIBS = @PIPLIB_LIBS@
-POD2HTML = @POD2HTML@
-PRTDIAG = @PRTDIAG@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-WARNING_FLAGS = @WARNING_FLAGS@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-pkgconfig_libdir = @pkgconfig_libdir@
-pkgconfig_libfile = @pkgconfig_libfile@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-versioninfo = @versioninfo@
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign doc/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-	distclean distclean-generic distclean-libtool distdir dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-man install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
-
-@GENERATE_DOC_TRUE@export TEXINPUTS := $(srcdir):$(TEXINPUTS)
-@GENERATE_DOC_TRUE@export BIBINPUTS := $(srcdir):$(BIBINPUTS)
-@GENERATE_DOC_TRUE@export BSTINPUTS := $(srcdir):$(BSTINPUTS)
-
-@GENERATE_DOC_TRUE@user.tex: user.pod
-@GENERATE_DOC_TRUE@	$(PERL) $(srcdir)/mypod2latex $< $@
-@GENERATE_DOC_TRUE@manual.pdf: manual.tex user.tex $(srcdir)/implementation.tex
-@GENERATE_DOC_TRUE@	(cd ..; echo "@GIT_HEAD_VERSION@") > version.tex
-@GENERATE_DOC_TRUE@	$(PDFLATEX) $<
-@GENERATE_DOC_TRUE@	bibtex manual
-@GENERATE_DOC_TRUE@	$(PDFLATEX) $<
-@GENERATE_DOC_TRUE@	$(PDFLATEX) $<
-@GENERATE_DOC_TRUE@user.html: user.pod
-@GENERATE_DOC_TRUE@	(cd ..; echo "@GIT_HEAD_VERSION@") > version
-@GENERATE_DOC_TRUE@	$(POD2HTML) --infile=$< --outfile=$@ --title="Integer Set Library: Manual [version `cat version`]"
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/cloog-0.16.3/isl/doc/chicago.bst b/cloog-0.16.3/isl/doc/chicago.bst
deleted file mode 100644
index ba05833..0000000
--- a/cloog-0.16.3/isl/doc/chicago.bst
+++ /dev/null
@@ -1,1726 +0,0 @@
-%%% ====================================================================
-%%%  @BibTeX-style-file{
-%%%     author          = "Glenn Paulley",
-%%%     version         = "4",
-%%%     date            = "28 August 1992",
-%%%     time            = "10:23:39 199",
-%%%     filename        = "chicago.bst",
-%%%     address         = "Data Structuring Group
-%%%                        Department of Computer Science
-%%%                        University of Waterloo
-%%%                        Waterloo, Ontario, Canada
-%%%                        N2L 3G1",
-%%%     telephone       = "(519) 885-1211",
-%%%     FAX             = "(519) 885-1208",
-%%%     checksum        = "26323 1654 5143 37417",
-%%%     email           = "gnpaulle@bluebox.uwaterloo.ca",
-%%%     codetable       = "ISO/ASCII",
-%%%     keywords        = "",
-%%%     supported       = "yes",
-%%%     abstract        = "A BibTeX bibliography style that follows the
-%%%                        `B' reference style of the 13th Edition of
-%%%                        the Chicago Manual of Style. A detailed
-%%%                        feature list is given below.",
-%%%     docstring       = "The checksum field above contains a CRC-16
-%%%                        checksum as the first value, followed by the
-%%%                        equivalent of the standard UNIX wc (word
-%%%                        count) utility output of lines, words, and
-%%%                        characters.  This is produced by Robert
-%%%                        Solovay's checksum utility.",
-%%%  }
-%%% ====================================================================
-%
-% "Chicago" BibTeX style, chicago.bst
-% ===================================
-%
-% BibTeX `chicago' style file for BibTeX version 0.99c, LaTeX version 2.09
-% Place it in a file called chicago.bst in the BibTeX search path.
-% You need to include chicago.sty as a \documentstyle option.
-% (Placing it in the same directory as the LaTeX document should also work.)
-% This "chicago" style is based on newapa.bst (American Psych. Assoc.)
-% found at ymir.claremont.edu.
-%
-%   Citation format: (author-last-name year)
-%             (author-last-name and author-last-name year)
-%             (author-last-name, author-last-name, and author-last-name year)
-%             (author-last-name et al. year)
-%             (author-last-name)
-%             author-last-name (year)
-%             (author-last-name and author-last-name)
-%             (author-last-name et al.)
-%             (year) or (year,year)
-%             year or year,year
-%
-%   Reference list ordering: alphabetical by author or whatever passes
-%    for author in the absence of one.
-%
-% This BibTeX style has support for abbreviated author lists and for
-%    year-only citations.  This is done by having the citations
-%    actually look like
-%
-%    \citeauthoryear{full-author-info}{abbrev-author-info}{year}
-%
-% The LaTeX style has to have the following (or similar)
-%
-%     \let\@internalcite\cite
-%     \def\fullcite{\def\citeauthoryear##1##2##3{##1, ##3}\@internalcite}
-%     \def\fullciteA{\def\citeauthoryear##1##2##3{##1}\@internalcite}
-%     \def\shortcite{\def\citeauthoryear##1##2##3{##2, ##3}\@internalcite}
-%     \def\shortciteA{\def\citeauthoryear##1##2##3{##2}\@internalcite}
-%     \def\citeyear{\def\citeauthoryear##1##2##3{##3}\@internalcite}
-%
-% These TeX macro definitions are found in chicago.sty. Additional
-% commands to manipulate different components of a citation can be defined
-% so that, for example, you can list author's names without parentheses
-% if using a citation as a noun or object in a sentence.
-%
-% This file was originally copied from newapa.bst at ymir.claremont.edu.
-%
-% Features of chicago.bst:
-% =======================
-%
-% - full names used in citations, but abbreviated citations are available
-%   (see above)
-% - if an entry has a "month", then the month and year are also printed
-%   as part of that bibitem.
-% - all conjunctions use "and" instead of "\&"
-% - major modification from Chicago Manual of Style (13th ed.) is that
-%   only the first author in a reference appears last name first-
-%   additional authors appear as J. Q. Public.
-% - pages are listed as "pp. xx-xx" in all entry types except
-%   article entries.
-% - book, inbook, and manual use "location: publisher" (or organization)
-%   for address and publisher. All other types list publishers separately.
-% - "pp." are used to identify page numbers for all entry types except
-%   articles.
-% - organization is used as a citation label if neither author nor editor
-%   is present (for manuals).
-% - "et al." is used for long author and editor lists, or when "others"
-%   is used.
-%
-% Modifications and bug fixes from newapa.bst:
-% ===========================================
-%
-%   - added month, year to bib entries if month is present
-%   - fixed bug with In proceedings, added necessary comma after title
-%   - all conjunctions changed to "and" from "\&"
-%   - fixed bug with author labels in my.full.label: "et al." now is
-%        generated when "others" is an author name
-%   - major modification from Chicago Manual of Style (13th ed.) is that
-%     only the first author in a reference appears last name first-
-%     additional authors appear as J. Q. Public.
-%   - pages are listed as "pp. xx-xx" in all entry types except
-%     article entries. Unnecessary (IMHO) "()" around page numbers
-%     were removed, and page numbers now don't end with a period.
-%   - created chicago.sty for use with this bibstyle (required).
-%   - fixed bugs in FUNCTION {format.vol.num.pages} for missing volume,
-%     number, and /or pages. Renamed to format.jour.vol.
-%   - fixed bug in formatting booktitles: additional period an error if
-%     book has a volume.
-%   - fixed bug: editors usually given redundant period before next clause
-%     (format.editors.dot) removed.
-%   - added label support for organizations, if both author and editor
-%     are missing (from alpha.bst). If organization is too long, then
-%     the key field is used for abbreviated citations.
-%   - In proceedings or books of several volumes, no comma was written
-%     between the "Volume x" and the page numbers (this was intentional
-%     in newapa.bst). Fixed.
-%   - Some journals may not have volumes/numbers, only month/year (eg.
-%     IEEE Computer). Fixed bug in article style that assumed volume/number
-%     was always present.
-%
-% Original documentation for newapa.sty:
-% =====================================
-%
-% This version was made by modifying the master file made by
-% Oren Patashnik (PATASHNIK@SCORE.STANFORD.EDU), and the 'named' BibTeX
-% style of Peter F. Patel-Schneider.
-%
-% Copyright (C) 1985, all rights reserved.
-% Copying of this file is authorized only if either
-% (1) you make absolutely no changes to your copy, including name, or
-% (2) if you do make changes, you name it something other than 'newapa.bst'.
-% There are undoubtably bugs in this style.  If you make bug fixes,
-% improvements, etc.  please let me know.  My e-mail address is:
-%    spencer@cgrg.ohio.state.edu or 71160.3141@compuserve.com
-%
-% This style was made from 'plain.bst', 'named.bst', and 'apalike.bst',
-% with lots of tweaking to make it look like APA style, along with tips
-% from Young Ryu and Brian Reiser's modifications of 'apalike.bst'.
-
-ENTRY
-  { address
-    author
-    booktitle
-    chapter
-    edition
-    editor
-    fjournal
-    howpublished
-    institution
-    journal
-    key
-    month
-    note
-    number
-    organization
-    pages
-    publisher
-    school
-    series
-    title
-    type
-    volume
-    year
-  }
-  {}
-  { label.year extra.label sort.year sort.label }
-
-INTEGERS { output.state before.all mid.sentence after.sentence after.block }
-
-FUNCTION {init.state.consts}
-{ #0 'before.all :=
-  #1 'mid.sentence :=
-  #2 'after.sentence :=
-  #3 'after.block :=
-}
-
-STRINGS { s t u }
-
-FUNCTION {output.nonnull}
-{ 's :=
-  output.state mid.sentence =
-    { ", " * write$ }
-    { output.state after.block =
-    { add.period$ write$
-      newline$
-      "\newblock " write$
-    }
-    { output.state before.all =
-        'write$
-        { add.period$ " " * write$ }
-      if$
-    }
-      if$
-      mid.sentence 'output.state :=
-    }
-  if$
-  s
-}
-
-% Use a colon to separate output. Used only for address/publisher
-% combination in book/inbook types, address/institution for manuals,
-% and organization:publisher for proceedings (inproceedings).
-%
-FUNCTION {output.nonnull.colon}
-{ 's :=
-  output.state mid.sentence =
-    { ": " * write$ }
-    { output.state after.block =
-    { add.period$ write$
-      newline$
-      "\newblock " write$
-    }
-    { output.state before.all =
-        'write$
-        { add.period$ " " * write$ }
-      if$
-    }
-      if$
-      mid.sentence 'output.state :=
-    }
-  if$
-  s
-}
-
-FUNCTION {output}
-{ duplicate$ empty$
-    'pop$
-    'output.nonnull
-  if$
-}
-
-FUNCTION {output.colon}
-{ duplicate$ empty$
-    'pop$
-    'output.nonnull.colon
-  if$
-}
-
-FUNCTION {output.check}
-{ 't :=
-  duplicate$ empty$
-    { pop$ "empty " t * " in " * cite$ * warning$ }
-    'output.nonnull
-  if$
-}
-
-FUNCTION {output.check.colon}
-{ 't :=
-  duplicate$ empty$
-    { pop$ "empty " t * " in " * cite$ * warning$ }
-    'output.nonnull.colon
-  if$
-}
-
-FUNCTION {output.year.check}
-{ year empty$
-     { "empty year in " cite$ * warning$ }
-     { write$
-        " (" year * extra.label *
-       month empty$
-          { ")" * }
-          { ", " * month * ")" * }
-       if$
-       mid.sentence 'output.state :=
-     }
-  if$
-}
-
-
-FUNCTION {fin.entry}
-{ add.period$
-  write$
-  newline$
-}
-
-FUNCTION {new.block}
-{ output.state before.all =
-    'skip$
-    { after.block 'output.state := }
-  if$
-}
-
-FUNCTION {new.sentence}
-{ output.state after.block =
-    'skip$
-    { output.state before.all =
-    'skip$
-    { after.sentence 'output.state := }
-      if$
-    }
-  if$
-}
-
-FUNCTION {not}
-{   { #0 }
-    { #1 }
-  if$
-}
-
-FUNCTION {and}
-{   'skip$
-    { pop$ #0 }
-  if$
-}
-
-FUNCTION {or}
-{   { pop$ #1 }
-    'skip$
-  if$
-}
-
-FUNCTION {new.block.checka}
-{ empty$
-    'skip$
-    'new.block
-  if$
-}
-
-FUNCTION {new.block.checkb}
-{ empty$
-  swap$ empty$
-  and
-    'skip$
-    'new.block
-  if$
-}
-
-FUNCTION {new.sentence.checka}
-{ empty$
-    'skip$
-    'new.sentence
-  if$
-}
-
-FUNCTION {new.sentence.checkb}
-{ empty$
-  swap$ empty$
-  and
-    'skip$
-    'new.sentence
-  if$
-}
-
-FUNCTION {field.or.null}
-{ duplicate$ empty$
-    { pop$ "" }
-    'skip$
-  if$
-}
-
-%
-% Emphasize the top string on the stack.
-%
-FUNCTION {emphasize}
-{ duplicate$ empty$
-    { pop$ "" }
-    { "{\em " swap$ * "}" * }
-  if$
-}
-
-%
-% Emphasize the top string on the stack, but add a trailing space.
-%
-FUNCTION {emphasize.space}
-{ duplicate$ empty$
-    { pop$ "" }
-    { "{\em " swap$ * "\/}" * }
-  if$
-}
-
-INTEGERS { nameptr namesleft numnames }
-%
-% Format bibliographical entries with the first author last name first,
-% and subsequent authors with initials followed by last name.
-% All names are formatted in this routine.
-%
-FUNCTION {format.names}
-{ 's :=
-  #1 'nameptr :=               % nameptr = 1;
-  s num.names$ 'numnames :=    % numnames = num.name$(s);
-  numnames 'namesleft :=
-    { namesleft #0 > }
-
-    { nameptr #1 =
-        {s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := }
-        {s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't := }
-      if$
-      nameptr #1 >
-        { namesleft #1 >
-              { ", " * t * }
-              { numnames #2 >
-                  { "," * }
-                  'skip$
-                if$
-                t "others" =
-                    { " et~al." * }
-                    { " and " * t * } % from Chicago Manual of Style
-                  if$
-               }
-               if$
-             }
-            't
-        if$
-        s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := 
-	"\protect \index {" * t * "|hyperemph}" *
-        nameptr #1 + 'nameptr :=          % nameptr += 1;
-        namesleft #1 - 'namesleft :=      % namesleft =- 1;
-    }
-  while$
-}
-
-FUNCTION {my.full.label}
-{ 's :=
-  #1 'nameptr :=               % nameptr = 1;
-  s num.names$ 'numnames :=    % numnames = num.name$(s);
-  numnames 'namesleft :=
-    { namesleft #0 > }
-
-    { s nameptr "{vv~}{ll}" format.name$ 't :=  % get the next name
-      nameptr #1 >
-        { namesleft #1 >
-              { ", " * t * }
-              { numnames #2 >
-                  { "," * }
-                  'skip$
-                if$
-                t "others" =
-                    { " et~al." * }
-                    { " and " * t * } % from Chicago Manual of Style
-                  if$
-               }
-               if$
-             }
-            't
-        if$
-        s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := 
-	"\protect \index {" * t * "|bold}" *
-        nameptr #1 + 'nameptr :=          % nameptr += 1;
-        namesleft #1 - 'namesleft :=      % namesleft =- 1;
-    }
-  while$
-
-}
-
-FUNCTION {format.names.fml}
-%
-% Format names in "familiar" format, with first initial followed by
-% last name. Like format.names, ALL names are formatted.
-%
-{ 's :=
-  #1 'nameptr :=               % nameptr = 1;
-  s num.names$ 'numnames :=    % numnames = num.name$(s);
-  numnames 'namesleft :=
-    { namesleft #0 > }
-
-    { s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't :=
-
-      nameptr #1 >
-        { namesleft #1 >
-              { ", " * t * }
-               { numnames #2 >
-                    { "," * }
-                    'skip$
-                  if$
-                  t "others" =
-                        { " et~al." * }
-                        { " and " * t * }
-%                       { " \& " * t * }
-                      if$
-                }
-               if$
-             }
-            't
-        if$
-        nameptr #1 + 'nameptr :=          % nameptr += 1;
-        namesleft #1 - 'namesleft :=      % namesleft =- 1;
-    }
-  while$
-}
-
-FUNCTION {format.authors}
-{ author empty$
-    { "" }
-    { author format.names }
-  if$
-}
-
-FUNCTION {format.key}
-{ empty$
-    { key field.or.null }
-    { "" }
-  if$
-}
-
-%
-% Format editor names for use in the "in" types: inbook, incollection,
-% inproceedings: first initial, then last names. When editors are the
-% LABEL for an entry, then format.editor is used which lists editors
-% by last name first.
-%
-FUNCTION {format.editors.fml}
-{ editor empty$
-    { "" }
-    { editor format.names.fml
-      editor num.names$ #1 >
-    { " (Eds.)" * }
-    { " (Ed.)" * }
-      if$
-    }
-  if$
-}
-
-%
-% Format editor names for use in labels, last names first.
-%
-FUNCTION {format.editors}
-{ editor empty$
-    { "" }
-    { editor format.names
-      editor num.names$ #1 >
-    { " (Eds.)" * }
-    { " (Ed.)" * }
-      if$
-    }
-  if$
-}
-
-FUNCTION {format.title}
-{ title empty$
-    { "" }
-    { title "t" change.case$ }
-  if$
-}
-
-% Note that the APA style requres case changes
-% in article titles. The following does not
-% change cases. If you perfer it, uncomment the
-% following and comment out the above.
-
-%FUNCTION {format.title}
-%{ title empty$
-%    { "" }
-%    { title }
-%  if$
-%}
-
-FUNCTION {n.dashify}
-{ 't :=
-  ""
-    { t empty$ not }
-    { t #1 #1 substring$ "-" =
-    { t #1 #2 substring$ "--" = not
-        { "--" *
-          t #2 global.max$ substring$ 't :=
-        }
-        {   { t #1 #1 substring$ "-" = }
-        { "-" *
-          t #2 global.max$ substring$ 't :=
-        }
-          while$
-        }
-      if$
-    }
-    { t #1 #1 substring$ *
-      t #2 global.max$ substring$ 't :=
-    }
-      if$
-    }
-  while$
-}
-
-FUNCTION {format.btitle}
-{ edition empty$
-  { title emphasize }
-  { title empty$
-    { title emphasize }
-    { volume empty$     % gnp - check for volume, then don't need period
-       { "{\em " title * "\/} (" * edition * " ed.)" * "." * }
-       { "{\em " title * "\/} (" * edition * " ed.)" * }
-      if$
-    }
-    if$
-  }
-  if$
-}
-
-FUNCTION {format.emphasize.booktitle}
-{ edition empty$
-  { booktitle emphasize }
-  { booktitle empty$
-    { booktitle emphasize }
-    { volume empty$    % gnp - extra period an error if book has a volume
-        { "{\em " booktitle * "\/} (" * edition * " ed.)" * "." *}
-        { "{\em " booktitle * "\/} (" * edition * " ed.)" * }
-      if$
-      }
-    if$
-    }
-  if$
-  }
-
-
-FUNCTION {tie.or.space.connect}
-{ duplicate$ text.length$ #3 <
-    { "~" }
-    { " " }
-  if$
-  swap$ * *
-}
-
-FUNCTION {either.or.check}
-{ empty$
-    'pop$
-    { "can't use both " swap$ * " fields in " * cite$ * warning$ }
-  if$
-}
-
-FUNCTION {format.bvolume}
-{ volume empty$
-    { "" }
-    { "Volume" volume tie.or.space.connect % gnp - changed to mixed case
-      series empty$
-        'skip$
-        { " of " * series emphasize * }
-      if$
-      "volume and number" number either.or.check
-    }
-  if$
-}
-
-FUNCTION {format.number.series}
-{ volume empty$
-    { number empty$
-    { series field.or.null }
-    { output.state mid.sentence =
-        { "Number" } % gnp - changed to mixed case always
-        { "Number" }
-      if$
-      number tie.or.space.connect
-      series empty$
-        { "there's a number but no series in " cite$ * warning$ }
-        { " in " * series * }
-      if$
-    }
-      if$
-    }
-    { "" }
-  if$
-}
-
-INTEGERS { multiresult }
-
-FUNCTION {multi.page.check}
-{ 't :=
-  #0 'multiresult :=
-    { multiresult not
-      t empty$ not
-      and
-    }
-    { t #1 #1 substring$
-      duplicate$ "-" =
-      swap$ duplicate$ "," =
-      swap$ "+" =
-      or or
-    { #1 'multiresult := }
-    { t #2 global.max$ substring$ 't := }
-      if$
-    }
-  while$
-  multiresult
-}
-
-FUNCTION {format.pages}
-{ pages empty$
-  { "" }
-  { pages multi.page.check
-	{ "pp.\ " pages n.dashify tie.or.space.connect } % gnp - removed ()
-	{ "pp.\ " pages tie.or.space.connect }
-    if$
-  }
-  if$
-}
-
-% By Young (and Spencer)
-% GNP - fixed bugs with missing volume, number, and/or pages
-%
-% Format journal, volume, number, pages for article types.
-%
-FUNCTION {format.jour.vol}
-{ fjournal empty$
-    { journal empty$
-	{ "no journal in " cite$ * warning$
-	  "" }
-	{ journal emphasize.space }
-	if$
-    } 
-    { fjournal emphasize.space }
-    if$
-  number empty$
-    { volume empty$
-       { "no number and no volume in " cite$ * warning$
-         "" * }
-       { "~{\em " * Volume * "}" * }
-      if$
-    }
-    { volume empty$
-      {"no volume for " cite$ * warning$
-       "~(" * number * ")" * }
-      { "~" *
-        volume emphasize.space
-        "(" * number * ")" * * }
-      if$
-    }
-  if$
-  pages empty$
-    {"page numbers missing in " cite$ * warning$
-     "" * } % gnp - place a null string on the stack for output
-    { duplicate$ empty$
-      { pop$ format.pages }
-      { ", " *  pages n.dashify * } % gnp - removed pp. for articles
-      if$
-    }
-  if$
-}
-
-FUNCTION {format.chapter.pages}
-{ chapter empty$
-    'format.pages
-    { type empty$
-        { "Chapter" } % gnp - changed to mixed case
-        { type "t" change.case$ }
-      if$
-      chapter tie.or.space.connect
-      pages empty$
-        {"page numbers missing in " cite$ * warning$} % gnp - added check
-        { ", " * format.pages * }
-      if$
-    }
-  if$
-}
-
-FUNCTION {format.in.ed.booktitle}
-{ booktitle empty$
-  { "" }
-  { editor empty$
-    { "In " format.emphasize.booktitle * }
-    { "In " format.editors.fml * ", " * format.emphasize.booktitle * }
-    if$
-  }
-  if$
-}
-
-FUNCTION {format.thesis.type}
-{ type empty$
-    'skip$
-    { pop$
-      type "t" change.case$
-    }
-  if$
-}
-
-FUNCTION {format.tr.number}
-{ type empty$
-    { "Technical Report" }
-    'type
-  if$
-  number empty$
-    { "t" change.case$ }
-    { number tie.or.space.connect }
-  if$
-}
-
-FUNCTION {format.article.crossref}
-{ "See"
-  "\citeN{" * crossref * "}" *
-}
-
-FUNCTION {format.crossref.editor}
-{ editor #1 "{vv~}{ll}" format.name$
-  editor num.names$ duplicate$
-  #2 >
-    { pop$ " et~al." * }
-    { #2 <
-    'skip$
-    { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
-        { " et~al." * }
-        { " and " * editor #2 "{vv~}{ll}" format.name$ * }
-      if$
-    }
-      if$
-    }
-  if$
-}
-
-FUNCTION {format.book.crossref}
-{ volume empty$
-    { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
-      "In "
-    }
-    { "Volume" volume tie.or.space.connect % gnp - changed to mixed case
-      " of " *
-    }
-  if$
-  editor empty$
-  editor field.or.null author field.or.null =
-  or
-    { key empty$
-    { series empty$
-        { "need editor, key, or series for " cite$ * " to crossref " *
-          crossref * warning$
-          "" *
-        }
-        { "{\em " * series * "\/}" * }
-      if$
-    }
-    { key * }
-      if$
-    }
-    { format.crossref.editor * }
-  if$
-  " \citeN{" * crossref * "}" *
-}
-
-FUNCTION {format.incoll.inproc.crossref}
-{ "See"
-  " \citeN{" * crossref * "}" *
-}
-
-% format.lab.names:
-%
-% determines "short" names for the abbreviated author information.
-% "Long" labels are created in calc.label, using the routine my.full.label
-% to format author and editor fields.
-%
-% There are 4 cases for labels.   (n=3 in the example)
-% a) one author             Foo
-% b) one to n               Foo, Bar and Baz
-% c) use of "and others"    Foo, Bar et al.
-% d) more than n            Foo et al.
-%
-FUNCTION {format.lab.names}
-{ 's :=
-  s num.names$ 'numnames :=
-  numnames #2 >    % change number to number of others allowed before
-		   % forcing "et al".
-    { s #1 "{vv~}{ll}" format.name$ 
-      "\protect \index {" * 
-      s #1 "{vv~}{ll}{, jj}{, f.}" format.name$ *
-      "}" *
-	"\protect\chicagoetal/" * }
-    {
-      numnames #1 - 'namesleft :=
-      #2 'nameptr :=
-      s #1 "{vv~}{ll}" format.name$
-      "\protect \index {" * 
-      s #1 "{vv~}{ll}{, jj}{, f.}" format.name$ *
-      "}" *
-	{ namesleft #0 > }
-	{ nameptr numnames =
-	    { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" =
-		{ "\protect\chicagoetal/" * }
-		{ "\protect\chicagoand/" * s nameptr "{vv~}{ll}" format.name$ * 
-		  "\protect \index {" * 
-		  s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ *
-		  "}" *
-                }
-	      if$
-	    }
-	    { ", " * s nameptr "{vv~}{ll}" format.name$ * }
-	  if$
-	  nameptr #1 + 'nameptr :=
-	  namesleft #1 - 'namesleft :=
-	}
-      while$
-    }
-  if$
-}
-
-FUNCTION {author.key.label}
-{ author empty$
-    { key empty$
-          { "no key, author in " cite$ * warning$
-            cite$ #1 #3 substring$ }
-         'key
-      if$
-    }
-    { author format.lab.names }
-  if$
-}
-
-FUNCTION {editor.key.label}
-{ editor empty$
-    { key empty$
-          { "no key, editor in " cite$ * warning$
-            cite$ #1 #3 substring$ }
-          'key
-        if$
-     }
-     { editor format.lab.names }
-  if$
-}
-
-FUNCTION {author.key.organization.label}
-%
-% added - gnp. Provide label formatting by organization if author is null.
-%
-{ author empty$
-    { organization empty$
-	{ key empty$
-	    { "no key, author or organization in " cite$ * warning$
-              cite$ #1 #3 substring$ }
-	    'key
-	  if$
-	}
-        { organization }
-      if$
-    }
-    { author format.lab.names }
-  if$
-}
-
-FUNCTION {editor.key.organization.label}
-%
-% added - gnp. Provide label formatting by organization if editor is null.
-%
-{ editor empty$
-    { organization empty$
-	{ key empty$
-	    { "no key, editor or organization in " cite$ * warning$
-              cite$ #1 #3 substring$ }
-	    'key
-	  if$
-	}
-        { organization }
-      if$
-    }
-    { editor format.lab.names }
-  if$
-}
-
-FUNCTION {author.editor.key.label}
-{ author empty$
-    { editor empty$
-          { key empty$
-               { "no key, author, or editor in " cite$ * warning$
-                 cite$ #1 #3 substring$ }
-             'key
-           if$
-         }
-          { editor format.lab.names }
-      if$
-    }
-    { author format.lab.names }
-  if$
-}
-
-FUNCTION {calc.label.orig}
-%
-% Changed - GNP. See also author.organization.sort, editor.organization.sort
-% Form label for BibTeX entry. The classification of which fields are used
-% for which type of entry (book, inbook, etc.) are taken from alpha.bst.
-% The change here from newapa is to also include organization as a
-% citation label if author or editor is missing.
-%
-{ type$ "book" =
-  type$ "inbook" =
-  or
-    'author.editor.key.label
-    { type$ "proceedings" =
-	'editor.key.organization.label
-	{ type$ "manual" =
-	    'author.key.organization.label
-	    'author.key.label
-	  if$
-	}
-      if$
-    }
-  if$
-
-  author empty$  % generate the full label citation information.
-    { editor empty$
-        { organization empty$
-           { "no author, editor, or organization in " cite$ * warning$
-             "??" }
-           { organization }
-           if$
-        }
-        { editor my.full.label }
-        if$
-    }
-    { author.key.label }
-  if$
-
-% leave label on the stack, to be popped when required.
-
-  "}{" * swap$ *
-%  year field.or.null purify$ #-1 #4 substring$ *
-%
-% save the year for sort processing afterwards (adding a, b, c, etc.)
-%
-  year field.or.null purify$ #-1 #4 substring$
-  'label.year :=
-}
-
-FUNCTION {calc.label}
-%
-% Changed - GNP. See also author.organization.sort, editor.organization.sort
-% Form label for BibTeX entry. The classification of which fields are used
-% for which type of entry (book, inbook, etc.) are taken from alpha.bst.
-% The change here from newapa is to also include organization as a
-% citation label if author or editor is missing.
-%
-{ type$ "book" =
-  type$ "inbook" =
-  or
-    'author.editor.key.label
-    { type$ "proceedings" =
-	'editor.key.organization.label
-	{ type$ "manual" =
-	    'author.key.organization.label
-	    'author.key.label
-	  if$
-	}
-      if$
-    }
-  if$
-
-  author empty$  % generate the full label citation information.
-    { editor empty$
-        { organization empty$
-           { "no author, editor, or organization in " cite$ * warning$
-             "??" }
-           { organization }
-           if$
-        }
-        { editor my.full.label }
-        if$
-    }
-    { author my.full.label }
-  if$
-
-% leave label on the stack, to be popped when required.
-
-  "}{" * swap$ * "}{" * title * "}{" *
-%  year field.or.null purify$ #-1 #4 substring$ *
-%
-% save the year for sort processing afterwards (adding a, b, c, etc.)
-%
-  year field.or.null purify$ #-1 #4 substring$
-  'label.year :=
-}
-
-FUNCTION {output.bibitem}
-{ newline$
-
-  "\bibitem[\protect\citeauthortitleyear{" write$
-  calc.label write$
-  sort.year write$
-  "}]{" write$
-
-  cite$ write$
-  "}" write$
-  newline$
-  ""
-  before.all 'output.state :=
-}
-
-FUNCTION {article}
-{ output.bibitem
-  format.authors
-  "author" output.check
-  author format.key output          % added
-  output.year.check                 % added
-  new.block
-  format.title
-  "title" output.check
-  new.block
-  crossref missing$
-    { format.jour.vol output
-    }
-    { format.article.crossref output.nonnull
-      format.pages output
-    }
-  if$
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {book}
-{ output.bibitem
-  author empty$
-    { format.editors
-	  "author and editor" output.check }
-    { format.authors
-	  output.nonnull
-      crossref missing$
-    	{ "author and editor" editor either.or.check }
-    	'skip$
-      if$
-    }
-  if$
-  output.year.check       % added
-  new.block
-  format.btitle
-  "title" output.check
-  crossref missing$
-    { format.bvolume output
-      new.block
-      format.number.series output
-      new.sentence
-      address output
-      publisher "publisher" output.check.colon
-    }
-    { new.block
-      format.book.crossref output.nonnull
-    }
-  if$
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {booklet}
-{ output.bibitem
-  format.authors output
-  author format.key output          % added
-  output.year.check                 % added
-  new.block
-  format.title
-  "title" output.check
-  new.block
-  howpublished output
-  address output
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {inbook}
-{ output.bibitem
-  author empty$
-    { format.editors
-      "author and editor" output.check
-    }
-    { format.authors output.nonnull
-      crossref missing$
-    { "author and editor" editor either.or.check }
-    'skip$
-      if$
-    }
-  if$
-  output.year.check                 % added
-  new.block
-  format.btitle
-  "title" output.check
-  crossref missing$
-    { format.bvolume output
-      format.chapter.pages
-      "chapter and pages" output.check
-      new.block
-      format.number.series output
-      new.sentence
-      address output
-      publisher
-      "publisher" output.check.colon
-    }
-    { format.chapter.pages "chapter and pages" output.check
-      new.block
-      format.book.crossref output.nonnull
-    }
-  if$
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {incollection}
-{ output.bibitem
-  format.authors
-  "author" output.check
-  author format.key output       % added
-  output.year.check              % added
-  new.block
-  format.title
-  "title" output.check
-  new.block
-  crossref missing$
-  { format.in.ed.booktitle
-    "booktitle" output.check
-    format.bvolume output
-    format.number.series output
-    format.chapter.pages output % gnp - was special.output.nonnull
-%                                 left out comma before page numbers
-    new.sentence
-    address output
-    publisher "publisher" output.check.colon
-  }
-  { format.incoll.inproc.crossref
-	output.nonnull
-    format.chapter.pages output
-  }
-  if$
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {inproceedings}
-{ output.bibitem
-  format.authors
-  "author" output.check
-  author format.key output            % added
-  output.year.check                   % added
-  new.block
-  format.title
-  "title" output.check
-  new.block
-  crossref missing$
-    { format.in.ed.booktitle
-	  "booktitle" output.check
-      format.bvolume output
-      format.number.series output
-      address output
-      format.pages output
-      new.sentence
-      organization output
-      publisher output.colon
-      }
-    { format.incoll.inproc.crossref output.nonnull
-      format.pages output
-    }
-  if$
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {conference} { inproceedings }
-
-FUNCTION {manual}
-{ output.bibitem
-  author empty$
-    { editor empty$
-      { organization "organization" output.check
-        organization format.key output }  % if all else fails, use key
-      { format.editors "author and editor" output.check }
-      if$
-    }
-    { format.authors output.nonnull }
-    if$
-  output.year.check                 % added
-  new.block
-  format.btitle
-  "title" output.check
-  organization address new.block.checkb
-% Reversed the order of "address" and "organization", added the ":".
-  address output
-  organization "organization" output.check.colon
-%  address output
-%  ":" output
-%  organization output
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {mastersthesis}
-{ output.bibitem
-  format.authors
-  "author" output.check
-  author format.key output          % added
-  output.year.check                 % added
-  new.block
-  format.title
-  "title" output.check
-  new.block
-  "Master's thesis" format.thesis.type output.nonnull
-  school "school" output.check
-  address output
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {misc}
-{ output.bibitem
-  format.authors output
-  author format.key output            % added
-  output.year.check                   % added
-  title howpublished new.block.checkb
-  format.title output
-  new.block
-  howpublished output
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {phdthesis}
-{ output.bibitem
-  format.authors
-  "author" output.check
-  author format.key output            % added
-  output.year.check                   % added
-  new.block
-  format.btitle
-  "title" output.check
-  new.block
-  "Ph.\ D. thesis" format.thesis.type output.nonnull
-  school "school" output.check
-  address output
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {proceedings}
-{ output.bibitem
-  editor empty$
-    { organization output
-      organization format.key output }  % gnp - changed from author format.key
-    { format.editors output.nonnull }
-  if$
-% author format.key output             % gnp - removed (should be either
-%                                        editor or organization
-  output.year.check                    % added (newapa)
-  new.block
-  format.btitle
-  "title" output.check
-  format.bvolume output
-  format.number.series output
-  address output
-  new.sentence
-  organization output
-  publisher output.colon
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {techreport}
-{ output.bibitem
-  format.authors
-  "author" output.check
-  author format.key output             % added
-  output.year.check                    % added
-  new.block
-  format.title
-  "title" output.check
-  new.block
-  format.tr.number output.nonnull
-  institution
-  "institution" output.check
-  address output
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {unpublished}
-{ output.bibitem
-  format.authors
-  "author" output.check
-  author format.key output              % added
-  output.year.check                      % added
-  new.block
-  format.title
-  "title" output.check
-  new.block
-  note "note" output.check
-  fin.entry
-}
-
-FUNCTION {default.type} { misc }
-
-MACRO {jan} {"January"}
-
-MACRO {feb} {"February"}
-
-MACRO {mar} {"March"}
-
-MACRO {apr} {"April"}
-
-MACRO {may} {"May"}
-
-MACRO {jun} {"June"}
-
-MACRO {jul} {"July"}
-
-MACRO {aug} {"August"}
-
-MACRO {sep} {"September"}
-
-MACRO {oct} {"October"}
-
-MACRO {nov} {"November"}
-
-MACRO {dec} {"December"}
-
-MACRO {acmcs} {"ACM Computing Surveys"}
-
-MACRO {acta} {"Acta Informatica"}
-
-MACRO {ai} {"Artificial Intelligence"}
-
-MACRO {cacm} {"Communications of the ACM"}
-
-MACRO {ibmjrd} {"IBM Journal of Research and Development"}
-
-MACRO {ibmsj} {"IBM Systems Journal"}
-
-MACRO {ieeese} {"IEEE Transactions on Software Engineering"}
-
-MACRO {ieeetc} {"IEEE Transactions on Computers"}
-
-MACRO {ieeetcad}
- {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"}
-
-MACRO {ipl} {"Information Processing Letters"}
-
-MACRO {jacm} {"Journal of the ACM"}
-
-MACRO {jcss} {"Journal of Computer and System Sciences"}
-
-MACRO {scp} {"Science of Computer Programming"}
-
-MACRO {sicomp} {"SIAM Journal on Computing"}
-
-MACRO {tocs} {"ACM Transactions on Computer Systems"}
-
-MACRO {tods} {"ACM Transactions on Database Systems"}
-
-MACRO {tog} {"ACM Transactions on Graphics"}
-
-MACRO {toms} {"ACM Transactions on Mathematical Software"}
-
-MACRO {toois} {"ACM Transactions on Office Information Systems"}
-
-MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"}
-
-MACRO {tcs} {"Theoretical Computer Science"}
-
-READ
-
-FUNCTION {sortify}
-{ purify$
-  "l" change.case$
-}
-
-INTEGERS { len }
-
-FUNCTION {chop.word}
-{ 's :=
-  'len :=
-  s #1 len substring$ =
-    { s len #1 + global.max$ substring$ }
-    's
-  if$
-}
-
-
-
-FUNCTION {sort.format.names}
-{ 's :=
-  #1 'nameptr :=
-  ""
-  s num.names$ 'numnames :=
-  numnames 'namesleft :=
-    { namesleft #0 > }
-    { nameptr #2 =
-	{ year field.or.null purify$ #-1 #4 substring$ * }
-	'skip$
-      if$
-      nameptr #1 >
-          { "   " * }
-         'skip$
-      if$
-      s nameptr "{vv{ } }{ll{ }}{  f{ }}{  jj{ }}" format.name$ 't :=
-      nameptr numnames = t "others" = and
-          { " et~al" * }
-          { t sortify * }
-      if$
-      nameptr #1 + 'nameptr :=
-      namesleft #1 - 'namesleft :=
-    }
-  while$
-}
-
-FUNCTION {sort.format.title}
-{ 't :=
-  "A " #2
-    "An " #3
-      "The " #4 t chop.word
-    chop.word
-  chop.word
-  sortify
-  #1 global.max$ substring$
-}
-
-FUNCTION {author.sort}
-{ author empty$
-    { key empty$
-         { "to sort, need author or key in " cite$ * warning$
-           "" }
-         { key sortify }
-      if$
-    }
-    { author sort.format.names }
-  if$
-}
-
-FUNCTION {editor.sort}
-{ editor empty$
-    { key empty$
-         { "to sort, need editor or key in " cite$ * warning$
-           ""
-         }
-         { key sortify }
-      if$
-    }
-    { editor sort.format.names }
-  if$
-}
-
-FUNCTION {author.editor.sort}
-{ author empty$
-    { "missing author in " cite$ * warning$
-      editor empty$
-         { key empty$
-             { "to sort, need author, editor, or key in " cite$ * warning$
-               ""
-             }
-             { key sortify }
-           if$
-         }
-         { editor sort.format.names }
-      if$
-    }
-    { author sort.format.names }
-  if$
-}
-
-FUNCTION {author.organization.sort}
-%
-% added - GNP. Stack author or organization for sorting (from alpha.bst).
-% Unlike alpha.bst, we need entire names, not abbreviations
-%
-{ author empty$
-    { organization empty$
-	{ key empty$
-	    { "to sort, need author, organization, or key in " cite$ * warning$
-	      ""
-	    }
-	    { key sortify }
-	  if$
-	}
-	{ organization sortify }
-      if$
-    }
-    { author sort.format.names }
-  if$
-}
-
-FUNCTION {editor.organization.sort}
-%
-% added - GNP. Stack editor or organization for sorting (from alpha.bst).
-% Unlike alpha.bst, we need entire names, not abbreviations
-%
-{ editor empty$
-    { organization empty$
-	{ key empty$
-	    { "to sort, need editor, organization, or key in " cite$ * warning$
-	      ""
-	    }
-	    { key sortify }
-	  if$
-	}
-	{ organization sortify }
-      if$
-    }
-    { editor sort.format.names }
-  if$
-}
-
-FUNCTION {presort}
-%
-% Presort creates the bibentry's label via a call to calc.label, and then
-% sorts the entries based on entry type. Chicago.bst adds support for
-% including organizations as the sort key; the following is stolen from
-% alpha.bst.
-%
-{ %calc.label sortify % recalculate bibitem label
-  %year field.or.null purify$ #-1 #4 substring$ * % add year
-  %duplicate$ warning$
-  %"    "
-  %*
-  type$ "book" =
-  type$ "inbook" =
-  or
-    'author.editor.sort
-    { type$ "proceedings" =
-	'editor.organization.sort
-	{ type$ "manual" =
-	    'author.organization.sort
-	    'author.sort
-	  if$
-	}
-      if$
-    }
-  if$
-  #1 entry.max$ substring$        % added for newapa
-  'sort.label :=                  % added for newapa
-  sort.label                      % added for newapa
-  %*
-  "    "
-  *
-  title field.or.null
-  sort.format.title
-  *
-  #1 entry.max$ substring$
-  'sort.key$ :=
-}
-
-ITERATE {presort}
-
-SORT             % by label, year, author/editor, title
-
-STRINGS { last.label next.extra }
-
-INTEGERS { last.extra.num }
-
-FUNCTION {initialize.extra.label.stuff}
-{ #0 int.to.chr$ 'last.label :=
-  "" 'next.extra :=
-  #0 'last.extra.num :=
-}
-
-FUNCTION {forward.pass}
-%
-% Pass through all entries, comparing current entry to last one.
-% Need to concatenate year to the stack (done by calc.label) to determine
-% if two entries are the same (see presort)
-%
-{ last.label
-  calc.label.orig year field.or.null purify$ #-1 #4 substring$ * % add year
-  #1 entry.max$ substring$ =     % are they equal?
-     { last.extra.num #1 + 'last.extra.num :=
-       last.extra.num int.to.chr$ 'extra.label :=
-     }
-     { "a" chr.to.int$ 'last.extra.num :=
-       "" 'extra.label :=
-       calc.label.orig year field.or.null purify$ #-1 #4 substring$ * % add year
-       #1 entry.max$ substring$ 'last.label := % assign to last.label
-     }
-  if$
-}
-
-FUNCTION {reverse.pass}
-{ next.extra "b" =
-    { "a" 'extra.label := }
-     'skip$
-  if$
-  label.year extra.label * 'sort.year :=
-  extra.label 'next.extra :=
-}
-
-EXECUTE {initialize.extra.label.stuff}
-
-ITERATE {forward.pass}
-
-REVERSE {reverse.pass}
-
-FUNCTION {bib.sort.order}
-{ sort.label
-  "    "
-  *
-  year field.or.null sortify
-  *
-  "    "
-  *
-  title field.or.null
-  sort.format.title
-  *
-  #1 entry.max$ substring$
-  'sort.key$ :=
-}
-
-ITERATE {bib.sort.order}
-
-SORT             % by sort.label, year, title --- giving final bib. order.
-
-FUNCTION {begin.bib}
-
-{ preamble$ empty$
-    'skip$
-    { preamble$ write$ newline$ }
-  if$
-  "\begin{thebibliography}{}" write$ newline$
-}
-
-
-EXECUTE {begin.bib}
-
-EXECUTE {init.state.consts}
-
-ITERATE {call.type$}
-
-FUNCTION {end.bib}
-{ newline$
-  "\end{thebibliography}" write$ newline$
-}
-
-EXECUTE {end.bib}
-
diff --git a/cloog-0.16.3/isl/doc/chicago.sty b/cloog-0.16.3/isl/doc/chicago.sty
deleted file mode 100644
index 33588db..0000000
--- a/cloog-0.16.3/isl/doc/chicago.sty
+++ /dev/null
@@ -1,320 +0,0 @@
-% -*- LaTeX -*-
-%%% ====================================================================
-%%%  @LaTeX-style-file{
-%%%     author          = "Glenn Paulley",
-%%%     version         = "4",
-%%%     date            = "31 August 1992",
-%%%     time            = "09:42:44 199",
-%%%     filename        = "chicago.sty",
-%%%     address         = "Data Structuring Group
-%%%                        Department of Computer Science
-%%%                        University of Waterloo
-%%%                        Waterloo, Ontario, Canada
-%%%                        N2L 3G1",
-%%%     telephone       = "(519) 885-1211",
-%%%     FAX             = "(519) 885-1208",
-%%%     checksum        = "44674 264 1050 10394",
-%%%     email           = "gnpaulle@bluebox.uwaterloo.ca",
-%%%     codetable       = "ISO/ASCII",
-%%%     keywords        = "",
-%%%     supported       = "yes",
-%%%     abstract        = "Contains the LaTeX style command definitions
-%%%                        for the Chicago BibTeX styles chicago.bst and
-%%%                        chicagoa.bst. For details, see below.",
-%%%     docstring       = "The checksum field above contains a CRC-16
-%%%                        checksum as the first value, followed by the
-%%%                        equivalent of the standard UNIX wc (word
-%%%                        count) utility output of lines, words, and
-%%%                        characters.  This is produced by Robert
-%%%                        Solovay's checksum utility.",
-%%%  }
-%%% ====================================================================
-%
-% chicago.sty: Style file for use with bibtex style chicago.bst, for
-% bibliographies formatted according to the 13th Edition of the Chicago
-% Manual of Style.
-%
-% 'newapa.bst' was made from 'plain.bst', 'named.bst', and 'apalike.bst',
-% with lots of tweaking to make it look like APA style, along with tips
-% from Young Ryu and Brian Reiser's modifications of 'apalike.bst'.
-% newapa.sty formed the basis of this style, chicago.sty. Author-date
-% references in newapa.bst formed the basis for chicago.bst. Chicagoa.bst
-% supports annotations.
-%
-% Version 4 (August, 1992):
-% - fixed chicago.bst and chicagoa.bst to handle long author lists in
-%   sorting
-% - fixed chicago.bst and chicagoa.bst so that missing page numbers in
-%   ``article'' entries are handled correctly
-% - modified chicago.sty to format entries with 2nd and subsequent lines
-%   indented.
-%
-%   Citation format: (author-last-name year)
-%             (author-last-name and author-last-name year)
-%             (author-last-name et al. year)
-%             (author-last-name)
-%             author-last-name
-%             author-last-name (year)
-%             (author-last-name and author-last-name)
-%             (author-last-name et al.)
-%             (year) or (year,year)
-%             year or year,year
-%
-%   Reference list ordering: alphabetical by author or whatever passes
-%    for author in the absence of one.
-%
-% This BibTeX style has support for abbreviated author lists and for
-%    year-only citations.  This is done by having the citations
-%    actually look like
-%
-%    \citeauthoryear{full-author-info}{abbrev-author-info}{year}
-%
-% The LaTeX style has to have the following (or similar)
-%
-%     \let\@internalcite\cite
-%     \def\fullcite{\def\citeauthoryear##1##2##3{##1, ##3}\@internalcite}
-%     \def\fullciteA{\def\citeauthoryear##1##2##3{##1}\@internalcite}
-%     \def\shortcite{\def\citeauthoryear##1##2##3{##2, ##3}\@internalcite}
-%     \def\shortciteA{\def\citeauthoryear##1##2##3{##2}\@internalcite}
-%     \def\citeyear{\def\citeauthoryear##1##2##3{##3}\@internalcite}
-%
-% -------------------------------------------------------------------------
-% This file implements citations for the ``chicago'' bibliography style.
-%  Place it in a file called chicago.sty in the TeX search path.
-%(Placing it in the same directory as the LaTeX document should also work.)
-%
-%    This file is a modification of the ``newapa'' LaTeX style,
-%    originally adapted by Steven Spencer from the ``apalike'' LaTeX style.
-%    It was originally modified by Stephen N. Spencer, with further
-%    modifications by Young U. Ryu.
-%
-% The ``chicago'' BibTeX bibliography style creates citations with labels:
-%       \citeauthoryear{author-info}{abbrev. author-info}{year}
-%
-% These labels are processed by the following LaTeX commands:
-%
-%  \cite{key}
-%    which produces citations with full author list and year.
-%    eg. (Brown 1978; Jarke, Turner, Stohl, et al. 1985)
-%  \citeNP{key}
-%    which produces citations with full author list and year, but without
-%    enclosing parentheses:
-%    eg. Brown 1978; Jarke, Turner and Stohl 1985
-%  \citeA{key}
-%    which produces citations with only the full author list.
-%    eg. (Brown; Jarke, Turner and Stohl)
-%  \citeANP{key}
-%    which produces citations with only the full author list, without
-%    parentheses eg. Brown; Jarke, Turner and Stohl
-%  \citeN{key}
-%    which produces citations with the full author list and year, but
-%    can be used as nouns in a sentence; no parentheses appear around
-%    the author names, but only around the year.
-%      eg. Shneiderman (1978) states that......
-%    \citeN should only be used for a single citation.
-%  \shortcite{key}
-%    which produces citations with abbreviated author list and year.
-%  \shortciteNP{key}
-%    which produces citations with abbreviated author list and year.
-%  \shortciteA{key}
-%    which produces only the abbreviated author list.
-%  \shortciteANP{key}
-%    which produces only the abbreviated author list.
-%  \shortciteN{key}
-%    which produces the abbreviated author list and year, with only the
-%    year in parentheses. Use with only one citation.
-%  \citeyear{key}
-%    which produces the year information only, within parentheses.
-%  \citeyearNP{key}
-%    which produces the year information only.
-%
-% Abbreviated author lists use the ``et al.'' construct.
-%
-% `NP' means `no parentheses'.
-%
-% This LaTeX style file must be used with the ``chicago'' or ``chicagoa''
-% (annotated chicago style) BibTeX styles.
-%
-\typeout{Using Chicago Manual of Style bibliography: 31 August 1992}
-%
-% -------------------------------------------------------------------------
-%
-% Citation macros.
-%
-\def\chicagoand/{ and }
-\def\chicagoetal/{ et~al.}
-%
-\let\@internalcite\cite
-%
-\def\cite{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{(##1\if@tempswa , ##2\fi)}%
-    \def\citeauthortitleyear##1##2##3##4{##1\ ##4}\@internalcite}
-\def\citeNP{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{##1\if@tempswa , ##2\fi}%
-    \def\citeauthortitleyear##1##2##3##4{##1\ ##4}\@internalcite}
-\def\citetitleN{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{##1\if@tempswa , ##2)\else{)}\fi}%
-    \def\citeauthortitleyear##1##2##3##4{##3\ (##1; ##4}\@citedata}
-\def\citeN{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{##1\if@tempswa , ##2)\else{)}\fi}%
-    \def\citeauthortitleyear##1##2##3##4{##1\ (##4}\@citedata}
-\def\citeA{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{(##1\if@tempswa , ##2\fi)}%
-    \def\citeauthortitleyear##1##2##3##4{##1}\@internalcite}
-\def\citeANP{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{##1\if@tempswa , ##2\fi}%
-    \def\citeauthortitleyear##1##2##3##4{##1}\@internalcite}
-%
-\def\shortcite{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{(##1\if@tempswa , ##2\fi)}%
-    \def\citeauthortitleyear##1##2##3##4{##2\ ##4}\@internalcite}
-\def\shortciteNP{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{##1\if@tempswa , ##2\fi}%
-    \def\citeauthortitleyear##1##2##3##4{##2\ ##4}\@internalcite}
-\def\shortciteN{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{##1\if@tempswa , ##2)\else{)}\fi}%
-    \def\citeauthortitleyear##1##2##3##4{##2\ (##4}\@citedata}
-\def\shortciteA{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{(##1\if@tempswa , ##2\fi)}%
-    \def\citeauthortitleyear##1##2##3##4{##2}\@internalcite}
-\def\shortciteANP{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{##1\if@tempswa , ##2\fi}%
-    \def\citeauthortitleyear##1##2##3##4{##2}\@internalcite}
-%
-\def\citeyear{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{(##1\if@tempswa , ##2\fi)}%
-    \def\citeauthortitleyear##1##2##3##4{##4}\@citedata}
-\def\citeyearNP{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{##1\if@tempswa , ##2\fi}%
-    \def\citeauthortitleyear##1##2##3##4{##4}\@citedata}
-
-%
-% \@citedata and \@citedatax:
-%
-% Place commas in-between citations in the same \citeyear, \citeyearNP,
-% \citeN, or \shortciteN command.
-% Use something like \citeN{ref1,ref2,ref3} and \citeN{ref4} for a list.
-%
-\def\@citedata{%
-	\@ifnextchar [{\@tempswatrue\@citedatax}%
-				  {\@tempswafalse\@citedatax[]}%
-}
-
-\def\@citedatax[#1]#2{%
-\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi%
-  \def\@citea{}\@cite{\@for\@citeb:=#2\do%
-    {\@citea\def\@citea{), }\@ifundefined% by Young
-       {b@\@citeb}{{\bf ?}%
-       \@warning{Citation `\@citeb' on page \thepage \space undefined}}%
-{\csname b@\@citeb\endcsname}}}{#1}}%
-
-\@ifpackageloaded{hyperref}{%
-  \let\BRorg@citedatax\@citedatax 
-  \def\@citedatax[#1]#2{%
-    \BRorg@citedatax[#1]{#2}%
-    \Hy@backout{#2}%
-  }%
-}{}
-\@ifpackageloaded{hyperref}{%
-\def\hyperemph#1{{\em\hyperpage{#1}}}%
-\def\bold#1{{\bf\hyperpage{#1}}}%
-}{%
-\def\hyperemph#1{{\em #1}}%
-\def\bold#1{{\bf #1}}%
-}
-
-\def\BR@@lbibitem[#1]#2#3\par{%
-  \BRorg@bibitem[#1]{#2}#3\hfill\penalty100\hbox{}
-  \newblock
-  \backref\hfill[{\csname br@#2\endcsname}%
-  ]\parskip=-10pt\penalty-10000\hbox{}\nobreak\par
-}%
-\def\BR@@bibitem#1#2\par{%
-  \BRorg@bibitem{#1}#2
-  \newblock
-  \backref\penalty-100\hbox{}\nobreak\hfill[\hbox{\csname br@#2\endcsname}%
-  ]\par
-}
-\def\thepageorcolor{\thepage}
-\def\Hy@backout#1{%
-  \@bsphack
-  \ifx\@empty\@currentlabel
-    \protected@write\@auxout{}{%
-      \string\@writefile{brf}{%
-        \string\backcite{#1}{{\thepageorcolor}{(document)}{Doc-Start}}%
-      }%
-    }%
-  \else
-   \protected@write\@auxout{}{%
-     \string\@writefile{brf}{%
-       \string\backcite{#1}{{\thepageorcolor}{\@currentlabel}{\@currentHref}}%
-     }%
-   }%
-  \fi
-  \@esphack
-}
-
-% don't box citations, separate with ; and a space
-% also, make the penalty between citations negative: a good place to break.
-%
-\def\@citex[#1]#2{%
-\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi%
-  \def\@citea{}\@cite{\@for\@citeb:=#2\do%
-    {\@citea\def\@citea{; }\@ifundefined% by Young
-       {b@\@citeb}{{\bf ?}%
-       \@warning{Citation `\@citeb' on page \thepage \space undefined}}%
-{\csname b@\@citeb\endcsname}}}{#1}}%
-
-% (from apalike.sty)
-% No labels in the bibliography.
-%
-\def\@biblabel#1{}
-
-% (from apalike.sty)
-% Set length of hanging indentation for bibliography entries.
-%
-\newlength{\bibhang}
-\setlength{\bibhang}{2em}
-
-% Indent second and subsequent lines of bibliographic entries. Stolen
-% from openbib.sty: \newblock is set to {}.
-
-\newdimen\bibindent
-\bibindent=1.5em
-\@ifundefined{refname}%
-   {\@ifundefined{chapter}%
-     {\newcommand{\refname}{References}}%
-     {\newcommand{\refname}{Bibliography}}%
-   }%
-   {}%
-\@ifundefined{chapter}%
- {\def\thebibliography#1{\section*{\refname\@mkboth
-   {\uppercase{\refname}}{\uppercase{\refname}}}
-   \addcontentsline{toc}{section}{References}
-   \list
-   {[\arabic{enumi}]}{\settowidth\labelwidth{[#1]}
-   \leftmargin\labelwidth
-   \advance\leftmargin\labelsep
-   \advance\leftmargin\bibindent
-   \itemindent -\bibindent
-   \listparindent \itemindent
-   \parsep \z@
-   \usecounter{enumi}}
-   \def\newblock{}
-   \sloppy
-   \sfcode`\.=1000\relax}}
- {\def\thebibliography#1{\chapter*{\refname\@mkboth
-   {\refname}{\refname}}
-   \addcontentsline{toc}{chapter}{References}
-   \list
-   {[\arabic{enumi}]}{\settowidth\labelwidth{[#1]}
-   \leftmargin\labelwidth
-   \advance\leftmargin\labelsep
-   \advance\leftmargin\bibindent
-   \itemindent -\bibindent
-   \listparindent \itemindent
-   \parsep \z@
-   \usecounter{enumi}}
-   \def\newblock{}
-   \sloppy
-   \sfcode`\.=1000\relax}}
diff --git a/cloog-0.16.3/isl/doc/implementation.tex b/cloog-0.16.3/isl/doc/implementation.tex
deleted file mode 100644
index d5ece80..0000000
--- a/cloog-0.16.3/isl/doc/implementation.tex
+++ /dev/null
@@ -1,2036 +0,0 @@
-\section{Sets and Relations}
-
-\begin{definition}[Polyhedral Set]
-A {\em polyhedral set}\index{polyhedral set} $S$ is a finite union of basic sets
-$S = \bigcup_i S_i$, each of which can be represented using affine
-constraints
-$$
-S_i : \Z^n \to 2^{\Z^d} : \vec s \mapsto
-S_i(\vec s) =
-\{\, \vec x \in \Z^d \mid \exists \vec z \in \Z^e :
-A \vec x + B \vec s + D \vec z + \vec c \geq \vec 0 \,\}
-,
-$$
-with $A \in \Z^{m \times d}$,
-$B \in \Z^{m \times n}$,
-$D \in \Z^{m \times e}$
-and $\vec c \in \Z^m$.
-\end{definition}
-
-\begin{definition}[Parameter Domain of a Set]
-Let $S \in \Z^n \to 2^{\Z^d}$ be a set.
-The {\em parameter domain} of $S$ is the set
-$$\pdom S \coloneqq \{\, \vec s \in \Z^n \mid S(\vec s) \ne \emptyset \,\}.$$
-\end{definition}
-
-\begin{definition}[Polyhedral Relation]
-A {\em polyhedral relation}\index{polyhedral relation}
-$R$ is a finite union of basic relations
-$R = \bigcup_i R_i$ of type
-$\Z^n \to 2^{\Z^{d_1+d_2}}$,
-each of which can be represented using affine
-constraints
-$$
-R_i = \vec s \mapsto
-R_i(\vec s) =
-\{\, \vec x_1 \to \vec x_2 \in \Z^{d_1} \times \Z^{d_2}
-\mid \exists \vec z \in \Z^e :
-A_1 \vec x_1 + A_2 \vec x_2 + B \vec s + D \vec z + \vec c \geq \vec 0 \,\}
-,
-$$
-with $A_i \in \Z^{m \times d_i}$,
-$B \in \Z^{m \times n}$,
-$D \in \Z^{m \times e}$
-and $\vec c \in \Z^m$.
-\end{definition}
-
-\begin{definition}[Parameter Domain of a Relation]
-Let $R \in \Z^n \to 2^{\Z^{d+d}}$ be a relation.
-The {\em parameter domain} of $R$ is the set
-$$\pdom R \coloneqq \{\, \vec s \in \Z^n \mid R(\vec s) \ne \emptyset \,\}.$$
-\end{definition}
-
-\begin{definition}[Domain of a Relation]
-Let $R \in \Z^n \to 2^{\Z^{d+d}}$ be a relation.
-The {\em domain} of $R$ is the polyhedral set
-$$\domain R \coloneqq \vec s \mapsto
-\{\, \vec x_1 \in \Z^{d_1} \mid \exists \vec x_2 \in \Z^{d_2} :
-(\vec x_1, \vec x_2) \in R(\vec s) \,\}
-.
-$$
-\end{definition}
-
-\begin{definition}[Range of a Relation]
-Let $R \in \Z^n \to 2^{\Z^{d+d}}$ be a relation.
-The {\em range} of $R$ is the polyhedral set
-$$
-\range R \coloneqq \vec s \mapsto
-\{\, \vec x_2 \in \Z^{d_2} \mid \exists \vec x_1 \in \Z^{d_1} :
-(\vec x_1, \vec x_2) \in R(\vec s) \,\}
-.
-$$
-\end{definition}
-
-\begin{definition}[Composition of Relations]
-Let $R \in \Z^n \to 2^{\Z^{d_1+d_2}}$ and
-$S \in \Z^n \to 2^{\Z^{d_2+d_3}}$ be two relations,
-then the composition of
-$R$ and $S$ is defined as
-$$
-S \circ R \coloneqq
-\vec s \mapsto
-\{\, \vec x_1 \to \vec x_3 \in \Z^{d_1} \times \Z^{d_3}
-\mid \exists \vec x_2 \in \Z^{d_2} :
-\vec x_1 \to \vec x_2 \in R(\vec s) \wedge
-\vec x_2 \to \vec x_3 \in S(\vec s)
-\,\}
-.
-$$
-\end{definition}
-
-\begin{definition}[Difference Set of a Relation]
-Let $R \in \Z^n \to 2^{\Z^{d+d}}$ be a relation.
-The difference set ($\Delta \, R$) of $R$ is the set
-of differences between image elements and the corresponding
-domain elements,
-$$
-\diff R \coloneqq
-\vec s \mapsto
-\{\, \vec \delta \in \Z^{d} \mid \exists \vec x \to \vec y \in R :
-\vec \delta = \vec y - \vec x
-\,\}
-$$
-\end{definition}
-
-\section{Simple Hull}\label{s:simple hull}
-
-It is sometimes useful to have a single
-basic set or basic relation that contains a given set or relation.
-For rational sets, the obvious choice would be to compute the
-(rational) convex hull.  For integer sets, the obvious choice
-would be the integer hull.
-However, {\tt isl} currently does not support an integer hull operation
-and even if it did, it would be fairly expensive to compute.
-The convex hull operation is supported, but it is also fairly
-expensive to compute given only an implicit representation.
-
-Usually, it is not required to compute the exact integer hull,
-and an overapproximation of this hull is sufficient.
-The ``simple hull'' of a set is such an overapproximation
-and it is defined as the (inclusion-wise) smallest basic set
-that is described by constraints that are translates of
-the constraints in the input set.
-This means that the simple hull is relatively cheap to compute
-and that the number of constraints in the simple hull is no
-larger than the number of constraints in the input.
-\begin{definition}[Simple Hull of a Set]
-The {\em simple hull} of a set
-$S = \bigcup_{1 \le i \le v} S_i$, with
-$$
-S : \Z^n \to 2^{\Z^d} : \vec s \mapsto
-S(\vec s) =
-\left\{\, \vec x \in \Z^d \mid \exists \vec z \in \Z^e :
-\bigvee_{1 \le i \le v}
-A_i \vec x + B_i \vec s + D_i \vec z + \vec c_i \geq \vec 0 \,\right\}
-$$
-is the set
-$$
-H : \Z^n \to 2^{\Z^d} : \vec s \mapsto
-S(\vec s) =
-\left\{\, \vec x \in \Z^d \mid \exists \vec z \in \Z^e :
-\bigwedge_{1 \le i \le v}
-A_i \vec x + B_i \vec s + D_i \vec z + \vec c_i + \vec K_i \geq \vec 0
-\,\right\}
-,
-$$
-with $\vec K_i$ the (component-wise) smallest non-negative integer vectors
-such that $S \subseteq H$.
-\end{definition}
-The $\vec K_i$ can be obtained by solving a number of
-LP problems, one for each element of each $\vec K_i$.
-If any LP problem is unbounded, then the corresponding constraint
-is dropped.
-
-\section{Parametric Integer Programming}
-
-\subsection{Introduction}\label{s:intro}
-
-Parametric integer programming \shortcite{Feautrier88parametric}
-is used to solve many problems within the context of the polyhedral model.
-Here, we are mainly interested in dependence analysis \shortcite{Fea91}
-and in computing a unique representation for existentially quantified
-variables.  The latter operation has been used for counting elements
-in sets involving such variables
-\shortcite{BouletRe98,Verdoolaege2005experiences} and lies at the core
-of the internal representation of {\tt isl}.
-
-Parametric integer programming was first implemented in \texttt{PipLib}.
-An alternative method for parametric integer programming
-was later implemented in {\tt barvinok} \cite{barvinok-0.22}.
-This method is not based on Feautrier's algorithm, but on rational
-generating functions \cite{Woods2003short} and was inspired by the
-``digging'' technique of \shortciteN{DeLoera2004Three} for solving
-non-parametric integer programming problems.
-
-In the following sections, we briefly recall the dual simplex
-method combined with Gomory cuts and describe some extensions
-and optimizations.  The main algorithm is applied to a matrix
-data structure known as a tableau.  In case of parametric problems,
-there are two tableaus, one for the main problem and one for
-the constraints on the parameters, known as the context tableau.
-The handling of the context tableau is described in \autoref{s:context}.
-
-\subsection{The Dual Simplex Method}
-
-Tableaus can be represented in several slightly different ways.
-In {\tt isl}, the dual simplex method uses the same representation
-as that used by its incremental LP solver based on the \emph{primal}
-simplex method.  The implementation of this LP solver is based
-on that of {\tt Simplify} \shortcite{Detlefs2005simplify}, which, in turn,
-was derived from the work of \shortciteN{Nelson1980phd}.
-In the original \shortcite{Nelson1980phd}, the tableau was implemented
-as a sparse matrix, but neither {\tt Simplify} nor the current
-implementation of {\tt isl} does so.
-
-Given some affine constraints on the variables,
-$A \vec x + \vec b \ge \vec 0$, the tableau represents the relationship
-between the variables $\vec x$ and non-negative variables
-$\vec y = A \vec x + \vec b$ corresponding to the constraints.
-The initial tableau contains $\begin{pmatrix}
-\vec b & A
-\end{pmatrix}$ and expresses the constraints $\vec y$ in the rows in terms
-of the variables $\vec x$ in the columns.  The main operation defined
-on a tableau exchanges a column and a row variable and is called a pivot.
-During this process, some coefficients may become rational.
-As in the \texttt{PipLib} implementation,
-{\tt isl} maintains a shared denominator per row.
-The sample value of a tableau is one where each column variable is assigned
-zero and each row variable is assigned the constant term of the row.
-This sample value represents a valid solution if each constraint variable
-is assigned a non-negative value, i.e., if the constant terms of
-rows corresponding to constraints are all non-negative.
-
-The dual simplex method starts from an initial sample value that
-may be invalid, but that is known to be (lexicographically) no
-greater than any solution, and gradually increments this sample value
-through pivoting until a valid solution is obtained.
-In particular, each pivot exchanges a row variable
-$r = -n + \sum_i a_i \, c_i$ with negative
-sample value $-n$ with a column variable $c_j$
-such that $a_j > 0$.  Since $c_j = (n + r - \sum_{i\ne j} a_i \, c_i)/a_j$,
-the new row variable will have a positive sample value $n$.
-If no such column can be found, then the problem is infeasible.
-By always choosing the column that leads to the (lexicographically)
-smallest increment in the variables $\vec x$,
-the first solution found is guaranteed to be the (lexicographically)
-minimal solution \cite{Feautrier88parametric}.
-In order to be able to determine the smallest increment, the tableau
-is (implicitly) extended with extra rows defining the original
-variables in terms of the column variables.
-If we assume that all variables are non-negative, then we know
-that the zero vector is no greater than the minimal solution and
-then the initial extended tableau looks as follows.
-$$
-\begin{tikzpicture}
-\matrix (m) [matrix of math nodes]
-{
-& {} & 1 & \vec c \\
-\vec x && |(top)| \vec 0 & I \\
-\vec r && \vec b & |(bottom)|A \\
-};
-\begin{pgfonlayer}{background}
-\node (core) [inner sep=0pt,fill=black!20,right delimiter=),left delimiter=(,fit=(top)(bottom)] {};
-\end{pgfonlayer}
-\end{tikzpicture}
-$$
-Each column in this extended tableau is lexicographically positive
-and will remain so because of the column choice explained above.
-It is then clear that the value of $\vec x$ will increase in each step.
-Note that there is no need to store the extra rows explicitly.
-If a given $x_i$ is a column variable, then the corresponding row
-is the unit vector $e_i$.  If, on the other hand, it is a row variable,
-then the row already appears somewhere else in the tableau.
-
-In case of parametric problems, the sign of the constant term
-may depend on the parameters.  Each time the constant term of a constraint row
-changes, we therefore need to check whether the new term can attain
-negative and/or positive values over the current set of possible
-parameter values, i.e., the context.
-If all these terms can only attain non-negative values, the current
-state of the tableau represents a solution.  If one of the terms
-can only attain non-positive values and is not identically zero,
-the corresponding row can be pivoted.
-Otherwise, we pick one of the terms that can attain both positive
-and negative values and split the context into a part where
-it only attains non-negative values and a part where it only attains
-negative values.
-
-\subsection{Gomory Cuts}
-
-The solution found by the dual simplex method may have
-non-integral coordinates.  If so, some rational solutions
-(including the current sample value), can be cut off by
-applying a (parametric) Gomory cut.
-Let $r = b(\vec p) + \sp {\vec a} {\vec c}$ be the row
-corresponding to the first non-integral coordinate of $\vec x$,
-with $b(\vec p)$ the constant term, an affine expression in the
-parameters $\vec p$, i.e., $b(\vec p) = \sp {\vec f} {\vec p} + g$.
-Note that only row variables can attain
-non-integral values as the sample value of the column variables is zero.
-Consider the expression
-$b(\vec p) - \ceil{b(\vec p)} + \sp {\fract{\vec a}} {\vec c}$,
-with $\ceil\cdot$ the ceiling function and $\fract\cdot$ the
-fractional part.  This expression is negative at the sample value
-since $\vec c = \vec 0$ and $r = b(\vec p)$ is fractional, i.e.,
-$\ceil{b(\vec p)} > b(\vec p)$.  On the other hand, for each integral
-value of $r$ and $\vec c \ge 0$, the expression is non-negative
-because $b(\vec p) - \ceil{b(\vec p)} > -1$.
-Imposing this expression to be non-negative therefore does not
-invalidate any integral solutions, while it does cut away the current
-fractional sample value.  To be able to formulate this constraint,
-a new variable $q = \floor{-b(\vec p)} = - \ceil{b(\vec p)}$ is added
-to the context.  This integral variable is uniquely defined by the constraints
-$0 \le -d \, b(\vec p) - d \, q \le d - 1$, with $d$ the common
-denominator of $\vec f$ and $g$.  In practice, the variable
-$q' = \floor{\sp {\fract{-f}} {\vec p} + \fract{-g}}$ is used instead
-and the coefficients of the new constraint are adjusted accordingly.
-The sign of the constant term of this new constraint need not be determined
-as it is non-positive by construction.
-When several of these extra context variables are added, it is important
-to avoid adding duplicates.
-Recent versions of {\tt PipLib} also check for such duplicates.
-
-\subsection{Negative Unknowns and Maximization}
-
-There are two places in the above algorithm where the unknowns $\vec x$
-are assumed to be non-negative: the initial tableau starts from
-sample value $\vec x = \vec 0$ and $\vec c$ is assumed to be non-negative
-during the construction of Gomory cuts.
-To deal with negative unknowns, \shortciteN[Appendix A.2]{Fea91}
-proposed to use a ``big parameter'', say $M$, that is taken to be
-an arbitrarily large positive number.  Instead of looking for the
-lexicographically minimal value of $\vec x$, we search instead
-for the lexicographically minimal value of $\vec x' = \vec M + \vec x$.
-The sample value $\vec x' = \vec 0$ of the initial tableau then
-corresponds to $\vec x = -\vec M$, which is clearly not greater than
-any potential solution.  The sign of the constant term of a row
-is determined lexicographically, with the coefficient of $M$ considered
-first.  That is, if the coefficient of $M$ is not zero, then its sign
-is the sign of the entire term.  Otherwise, the sign is determined
-by the remaining affine expression in the parameters.
-If the original problem has a bounded optimum, then the final sample
-value will be of the form $\vec M + \vec v$ and the optimal value
-of the original problem is then $\vec v$.
-Maximization problems can be handled in a similar way by computing
-the minimum of $\vec M - \vec x$.
-
-When the optimum is unbounded, the optimal value computed for
-the original problem will involve the big parameter.
-In the original implementation of {\tt PipLib}, the big parameter could
-even appear in some of the extra variables $\vec q$ created during
-the application of a Gomory cut.  The final result could then contain
-implicit conditions on the big parameter through conditions on such
-$\vec q$ variables.  This problem was resolved in later versions
-of {\tt PipLib} by taking $M$ to be divisible by any positive number.
-The big parameter can then never appear in any $\vec q$ because
-$\fract {\alpha M } = 0$.  It should be noted, though, that an unbounded
-problem usually (but not always)
-indicates an incorrect formulation of the problem.
-
-The original version of {\tt PipLib} required the user to ``manually''
-add a big parameter, perform the reformulation and interpret the result
-\shortcite{Feautrier02}.  Recent versions allow the user to simply
-specify that the unknowns may be negative or that the maximum should
-be computed and then these transformations are performed internally.
-Although there are some application, e.g.,
-that of \shortciteN{Feautrier92multi},
-where it is useful to have explicit control over the big parameter,
-negative unknowns and maximization are by far the most common applications
-of the big parameter and we believe that the user should not be bothered
-with such implementation issues.
-The current version of {\tt isl} therefore does not
-provide any interface for specifying big parameters.  Instead, the user
-can specify whether a maximum needs to be computed and no assumptions
-are made on the sign of the unknowns.  Instead, the sign of the unknowns
-is checked internally and a big parameter is automatically introduced when
-needed.  For compatibility with {\tt PipLib}, the {\tt isl\_pip} tool
-does explicitly add non-negativity constraints on the unknowns unless
-the \verb+Urs_unknowns+ option is specified.
-Currently, there is also no way in {\tt isl} of expressing a big
-parameter in the output.  Even though
-{\tt isl} makes the same divisibility assumption on the big parameter
-as recent versions of {\tt PipLib}, it will therefore eventually
-produce an error if the problem turns out to be unbounded.
-
-\subsection{Preprocessing}
-
-In this section, we describe some transformations that are
-or can be applied in advance to reduce the running time
-of the actual dual simplex method with Gomory cuts.
-
-\subsubsection{Feasibility Check and Detection of Equalities}
-
-Experience with the original {\tt PipLib} has shown that Gomory cuts
-do not perform very well on problems that are (non-obviously) empty,
-i.e., problems with rational solutions, but no integer solutions.
-In {\tt isl}, we therefore first perform a feasibility check on
-the original problem considered as a non-parametric problem
-over the combined space of unknowns and parameters.
-In fact, we do not simply check the feasibility, but we also
-check for implicit equalities among the integer points by computing
-the integer affine hull.  The algorithm used is the same as that
-described in \autoref{s:GBR} below.
-Computing the affine hull is fairly expensive, but it can
-bring huge benefits if any equalities can be found or if the problem
-turns out to be empty.
-
-\subsubsection{Constraint Simplification}
-
-If the coefficients of the unknown and parameters in a constraint
-have a common factor, then this factor should be removed, possibly
-rounding down the constant term.  For example, the constraint
-$2 x - 5 \ge 0$ should be simplified to $x - 3 \ge 0$.
-{\tt isl} performs such simplifications on all sets and relations.
-Recent versions of {\tt PipLib} also perform this simplification
-on the input.
-
-\subsubsection{Exploiting Equalities}\label{s:equalities}
-
-If there are any (explicit) equalities in the input description,
-{\tt PipLib} converts each into a pair of inequalities.
-It is also possible to write $r$ equalities as $r+1$ inequalities
-\shortcite{Feautrier02}, but it is even better to \emph{exploit} the
-equalities to reduce the dimensionality of the problem.
-Given an equality involving at least one unknown, we pivot
-the row corresponding to the equality with the column corresponding
-to the last unknown with non-zero coefficient.  The new column variable
-can then be removed completely because it is identically zero,
-thereby reducing the dimensionality of the problem by one.
-The last unknown is chosen to ensure that the columns of the initial
-tableau remain lexicographically positive.  In particular, if
-the equality is of the form $b + \sum_{i \le j} a_i \, x_i = 0$ with
-$a_j \ne 0$, then the (implicit) top rows of the initial tableau
-are changed as follows
-$$
-\begin{tikzpicture}
-\matrix [matrix of math nodes]
-{
- & {} & |(top)| 0 & I_1 & |(j)| &  \\
-j && 0 & & 1 & \\
-  && 0 & & & |(bottom)|I_2 \\
-};
-\node[overlay,above=2mm of j,anchor=south]{j};
-\begin{pgfonlayer}{background}
-\node (m) [inner sep=0pt,fill=black!20,right delimiter=),left delimiter=(,fit=(top)(bottom)] {};
-\end{pgfonlayer}
-\begin{scope}[xshift=4cm]
-\matrix [matrix of math nodes]
-{
- & {} & |(top)| 0 & I_1 &  \\
-j && |(left)| -b/a_j & -a_i/a_j & \\
-  && 0 & & |(bottom)|I_2 \\
-};
-\begin{pgfonlayer}{background}
-\node (m2) [inner sep=0pt,fill=black!20,right delimiter=),left delimiter=(,fit=(top)(bottom)(left)] {};
-\end{pgfonlayer}
-\end{scope}
- \draw [shorten >=7mm,-to,thick,decorate,
-        decoration={snake,amplitude=.4mm,segment length=2mm,
-                    pre=moveto,pre length=5mm,post length=8mm}]
-   (m) -- (m2);
-\end{tikzpicture}
-$$
-Currently, {\tt isl} also eliminates equalities involving only parameters
-in a similar way, provided at least one of the coefficients is equal to one.
-The application of parameter compression (see below)
-would obviate the need for removing parametric equalities.
-
-\subsubsection{Offline Symmetry Detection}\label{s:offline}
-
-Some problems, notably those of \shortciteN{Bygde2010licentiate},
-have a collection of constraints, say
-$b_i(\vec p) + \sp {\vec a} {\vec x} \ge 0$,
-that only differ in their (parametric) constant terms.
-These constant terms will be non-negative on different parts
-of the context and this context may have to be split for each
-of the constraints.  In the worst case, the basic algorithm may
-have to consider all possible orderings of the constant terms.
-Instead, {\tt isl} introduces a new parameter, say $u$, and
-replaces the collection of constraints by the single
-constraint $u + \sp {\vec a} {\vec x} \ge 0$ along with
-context constraints $u \le b_i(\vec p)$.
-Any solution to the new system is also a solution
-to the original system since
-$\sp {\vec a} {\vec x} \ge -u \ge -b_i(\vec p)$.
-Conversely, $m = \min_i b_i(\vec p)$ satisfies the constraints
-on $u$ and therefore extends a solution to the new system.
-It can also be plugged into a new solution.
-See \autoref{s:post} for how this substitution is currently performed
-in {\tt isl}.
-The method described in this section can only detect symmetries
-that are explicitly available in the input.
-See \autoref{s:online} for the detection
-and exploitation of symmetries that appear during the course of
-the dual simplex method.
-
-\subsubsection{Parameter Compression}\label{s:compression}
-
-It may in some cases be apparent from the equalities in the problem
-description that there can only be a solution for a sublattice
-of the parameters.  In such cases ``parameter compression''
-\shortcite{Meister2004PhD,Meister2008} can be used to replace
-the parameters by alternative ``dense'' parameters.
-For example, if there is a constraint $2x = n$, then the system
-will only have solutions for even values of $n$ and $n$ can be replaced
-by $2n'$.  Similarly, the parameters $n$ and $m$ in a system with
-the constraint $2n = 3m$ can be replaced by a single parameter $n'$
-with $n=3n'$ and $m=2n'$.
-It is also possible to perform a similar compression on the unknowns,
-but it would be more complicated as the compression would have to
-preserve the lexicographical order.  Moreover, due to our handling
-of equalities described above there should be
-no need for such variable compression.
-Although parameter compression has been implemented in {\tt isl},
-it is currently not yet used during parametric integer programming.
-
-\subsection{Postprocessing}\label{s:post}
-
-The output of {\tt PipLib} is a quast (quasi-affine selection tree).
-Each internal node in this tree corresponds to a split of the context
-based on a parametric constant term in the main tableau with indeterminate
-sign.  Each of these nodes may introduce extra variables in the context
-corresponding to integer divisions.  Each leaf of the tree prescribes
-the solution in that part of the context that satisfies all the conditions
-on the path leading to the leaf.
-Such a quast is a very economical way of representing the solution, but
-it would not be suitable as the (only) internal representation of
-sets and relations in {\tt isl}.  Instead, {\tt isl} represents
-the constraints of a set or relation in disjunctive normal form.
-The result of a parametric integer programming problem is then also
-converted to this internal representation.  Unfortunately, the conversion
-to disjunctive normal form can lead to an explosion of the size
-of the representation.
-In some cases, this overhead would have to be paid anyway in subsequent
-operations, but in other cases, especially for outside users that just
-want to solve parametric integer programming problems, we would like
-to avoid this overhead in future.  That is, we are planning on introducing
-quasts or a related representation as one of several possible internal
-representations and on allowing the output of {\tt isl\_pip} to optionally
-be printed as a quast.
-
-Currently, {\tt isl} also does not have an internal representation
-for expressions such as $\min_i b_i(\vec p)$ from the offline
-symmetry detection of \autoref{s:offline}.
-Assume that one of these expressions has $n$ bounds $b_i(\vec p)$.
-If the expression
-does not appear in the affine expression describing the solution,
-but only in the constraints, and if moreover, the expression
-only appears with a positive coefficient, i.e.,
-$\min_i b_i(\vec p) \ge f_j(\vec p)$, then each of these constraints
-can simply be reduplicated $n$ times, once for each of the bounds.
-Otherwise, a conversion to disjunctive normal form
-leads to $n$ cases, each described as $u = b_i(\vec p)$ with constraints
-$b_i(\vec p) \le b_j(\vec p)$ for $j > i$
-and
-$b_i(\vec p)  < b_j(\vec p)$ for $j < i$.
-Note that even though this conversion leads to a size increase
-by a factor of $n$, not detecting the symmetry could lead to
-an increase by a factor of $n!$ if all possible orderings end up being
-considered.
-
-\subsection{Context Tableau}\label{s:context}
-
-The main operation that a context tableau needs to provide is a test
-on the sign of an affine expression over the elements of the context.
-This sign can be determined by solving two integer linear feasibility
-problems, one with a constraint added to the context that enforces
-the expression to be non-negative and one where the expression is
-negative.  As already mentioned by \shortciteN{Feautrier88parametric},
-any integer linear feasibility solver could be used, but the {\tt PipLib}
-implementation uses a recursive call to the dual simplex with Gomory
-cuts algorithm to determine the feasibility of a context.
-In {\tt isl}, two ways of handling the context have been implemented,
-one that performs the recursive call and one, used by default, that
-uses generalized basis reduction.
-We start with some optimizations that are shared between the two
-implementations and then discuss additional details of each of them.
-
-\subsubsection{Maintaining Witnesses}\label{s:witness}
-
-A common feature of both integer linear feasibility solvers is that
-they will not only say whether a set is empty or not, but if the set
-is non-empty, they will also provide a \emph{witness} for this result,
-i.e., a point that belongs to the set.  By maintaining a list of such
-witnesses, we can avoid many feasibility tests during the determination
-of the signs of affine expressions.  In particular, if the expression
-evaluates to a positive number on some of these points and to a negative
-number on some others, then no feasibility test needs to be performed.
-If all the evaluations are non-negative, we only need to check for the
-possibility of a negative value and similarly in case of all
-non-positive evaluations.  Finally, in the rare case that all points
-evaluate to zero or at the start, when no points have been collected yet,
-one or two feasibility tests need to be performed depending on the result
-of the first test.
-
-When a new constraint is added to the context, the points that
-violate the constraint are temporarily removed.  They are reconsidered
-when we backtrack over the addition of the constraint, as they will
-satisfy the negation of the constraint.  It is only when we backtrack
-over the addition of the points that they are finally removed completely.
-When an extra integer division is added to the context,
-the new coordinates of the
-witnesses can easily be computed by evaluating the integer division.
-The idea of keeping track of witnesses was first used in {\tt barvinok}.
-
-\subsubsection{Choice of Constant Term on which to Split}
-
-Recall that if there are no rows with a non-positive constant term,
-but there are rows with an indeterminate sign, then the context
-needs to be split along the constant term of one of these rows.
-If there is more than one such row, then we need to choose which row
-to split on first.  {\tt PipLib} uses a heuristic based on the (absolute)
-sizes of the coefficients.  In particular, it takes the largest coefficient
-of each row and then selects the row where this largest coefficient is smaller
-than those of the other rows.
-
-In {\tt isl}, we take that row for which non-negativity of its constant
-term implies non-negativity of as many of the constant terms of the other
-rows as possible.  The intuition behind this heuristic is that on the
-positive side, we will have fewer negative and indeterminate signs,
-while on the negative side, we need to perform a pivot, which may
-affect any number of rows meaning that the effect on the signs
-is difficult to predict.  This heuristic is of course much more
-expensive to evaluate than the heuristic used by {\tt PipLib}.
-More extensive tests are needed to evaluate whether the heuristic is worthwhile.
-
-\subsubsection{Dual Simplex + Gomory Cuts}
-
-When a new constraint is added to the context, the first steps
-of the dual simplex method applied to this new context will be the same
-or at least very similar to those taken on the original context, i.e.,
-before the constraint was added.  In {\tt isl}, we therefore apply
-the dual simplex method incrementally on the context and backtrack
-to a previous state when a constraint is removed again.
-An initial implementation that was never made public would also
-keep the Gomory cuts, but the current implementation backtracks
-to before the point where Gomory cuts are added before adding
-an extra constraint to the context.
-Keeping the Gomory cuts has the advantage that the sample value
-is always an integer point and that this point may also satisfy
-the new constraint.  However, due to the technique of maintaining
-witnesses explained above,
-we would not perform a feasibility test in such cases and then
-the previously added cuts may be redundant, possibly resulting
-in an accumulation of a large number of cuts.
-
-If the parameters may be negative, then the same big parameter trick
-used in the main tableau is applied to the context.  This big parameter
-is of course unrelated to the big parameter from the main tableau.
-Note that it is not a requirement for this parameter to be ``big'',
-but it does allow for some code reuse in {\tt isl}.
-In {\tt PipLib}, the extra parameter is not ``big'', but this may be because
-the big parameter of the main tableau also appears
-in the context tableau.
-
-Finally, it was reported by \shortciteN{Galea2009personal}, who
-worked on a parametric integer programming implementation
-in {\tt PPL} \shortcite{PPL},
-that it is beneficial to add cuts for \emph{all} rational coordinates
-in the context tableau.  Based on this report,
-the initial {\tt isl} implementation was adapted accordingly.
-
-\subsubsection{Generalized Basis Reduction}\label{s:GBR}
-
-The default algorithm used in {\tt isl} for feasibility checking
-is generalized basis reduction \shortcite{Cook1991implementation}.
-This algorithm is also used in the {\tt barvinok} implementation.
-The algorithm is fairly robust, but it has some overhead.
-We therefore try to avoid calling the algorithm in easy cases.
-In particular, we incrementally keep track of points for which
-the entire unit hypercube positioned at that point lies in the context.
-This set is described by translates of the constraints of the context
-and if (rationally) non-empty, any rational point
-in the set can be rounded up to yield an integer point in the context.
-
-A restriction of the algorithm is that it only works on bounded sets.
-The affine hull of the recession cone therefore needs to be projected
-out first.  As soon as the algorithm is invoked, we then also
-incrementally keep track of this recession cone.  The reduced basis
-found by one call of the algorithm is also reused as initial basis
-for the next call.
-
-Some problems lead to the
-introduction of many integer divisions.  Within a given context,
-some of these integer divisions may be equal to each other, even
-if the expressions are not identical, or they may be equal to some
-affine combination of other variables.
-To detect such cases, we compute the affine hull of the context
-each time a new integer division is added.  The algorithm used
-for computing this affine hull is that of \shortciteN{Karr1976affine},
-while the points used in this algorithm are obtained by performing
-integer feasibility checks on that part of the context outside
-the current approximation of the affine hull.
-The list of witnesses is used to construct an initial approximation
-of the hull, while any extra points found during the construction
-of the hull is added to this list.
-Any equality found in this way that expresses an integer division
-as an \emph{integer} affine combination of other variables is
-propagated to the main tableau, where it is used to eliminate that
-integer division.
-
-\subsection{Experiments}
-
-\autoref{t:comparison} compares the execution times of {\tt isl}
-(with both types of context tableau)
-on some more difficult instances to those of other tools,
-run on an Intel Xeon W3520 @ 2.66GHz.
-Easier problems such as the
-test cases distributed with {\tt Pip\-Lib} can be solved so quickly
-that we would only be measuring overhead such as input/output and conversions
-and not the running time of the actual algorithm.
-We compare the following versions:
-{\tt piplib-1.4.0-5-g0132fd9},
-{\tt barvinok-0.32.1-73-gc5d7751},
-{\tt isl-0.05.1-82-g3a37260}
-and {\tt PPL} version 0.11.2.
-
-The first test case is the following dependence analysis problem
-originating from the Phideo project \shortcite{Verhaegh1995PhD}
-that was communicated to us by Bart Kienhuis:
-\begin{lstlisting}[flexiblecolumns=true,breaklines=true]{}
-lexmax { [j1,j2] -> [i1,i2,i3,i4,i5,i6,i7,i8,i9,i10] : 1 <= i1,j1 <= 8 and 1 <= i2,i3,i4,i5,i6,i7,i8,i9,i10 <= 2 and 1 <= j2 <= 128 and i1-1 = j1-1 and i2-1+2*i3-2+4*i4-4+8*i5-8+16*i6-16+32*i7-32+64*i8-64+128*i9-128+256*i10-256=3*j2-3+66 };
-\end{lstlisting}
-This problem was the main inspiration
-for some of the optimizations in \autoref{s:GBR}.
-The second group of test cases are projections used during counting.
-The first nine of these come from \shortciteN{Seghir2006minimizing}.
-The remaining two come from \shortciteN{Verdoolaege2005experiences} and
-were used to drive the first, Gomory cuts based, implementation
-in {\tt isl}.
-The third and final group of test cases are borrowed from
-\shortciteN{Bygde2010licentiate} and inspired the offline symmetry detection
-of \autoref{s:offline}.  Without symmetry detection, the running times
-are 11s and 5.9s.
-All running times of {\tt barvinok} and {\tt isl} include a conversion
-to disjunctive normal form.  Without this conversion, the final two
-cases can be solved in 0.07s and 0.21s.
-The {\tt PipLib} implementation has some fixed limits and will
-sometimes report the problem to be too complex (TC), while on some other
-problems it will run out of memory (OOM).
-The {\tt barvinok} implementation does not support problems
-with a non-trivial lineality space (line) nor maximization problems (max).
-The Gomory cuts based {\tt isl} implementation was terminated after 1000
-minutes on the first problem.  The gbr version introduces some
-overhead on some of the easier problems, but is overall the clear winner.
-
-\begin{table}
-\begin{center}
-\begin{tabular}{lrrrrr}
-    & {\tt PipLib} & {\tt barvinok} & {\tt isl} cut & {\tt isl} gbr & {\tt PPL} \\
-\hline
-\hline
-% bart.pip
-Phideo & TC    & 793m   & $>$999m &   2.7s  & 372m \\
-\hline
-e1 & 0.33s & 3.5s & 0.08s & 0.11s & 0.18s \\
-e3 & 0.14s & 0.13s & 0.10s & 0.10s & 0.17s \\
-e4 & 0.24s & 9.1s & 0.09s & 0.11s & 0.70s \\
-e5 & 0.12s & 6.0s & 0.06s & 0.14s & 0.17s \\
-e6 & 0.10s & 6.8s & 0.17s & 0.08s & 0.21s \\
-e7 & 0.03s & 0.27s & 0.04s & 0.04s & 0.03s \\
-e8 & 0.03s & 0.18s & 0.03s & 0.04s & 0.01s \\
-e9 & OOM & 70m & 2.6s & 0.94s & 22s \\
-vd & 0.04s & 0.10s & 0.03s & 0.03s & 0.03s \\
-bouleti & 0.25s & line & 0.06s & 0.06s & 0.15s \\
-difficult & OOM & 1.3s & 1.7s & 0.33s & 1.4s \\
-\hline
-cnt/sum & TC & max & 2.2s & 2.2s & OOM \\
-jcomplex & TC & max & 3.7s & 3.9s & OOM \\
-\end{tabular}
-\caption{Comparison of Execution Times}
-\label{t:comparison}
-\end{center}
-\end{table}
-
-\subsection{Online Symmetry Detection}\label{s:online}
-
-Manual experiments on small instances of the problems of
-\shortciteN{Bygde2010licentiate} and an analysis of the results
-by the approximate MPA method developed by \shortciteN{Bygde2010licentiate}
-have revealed that these problems contain many more symmetries
-than can be detected using the offline method of \autoref{s:offline}.
-In this section, we present an online detection mechanism that has
-not been implemented yet, but that has shown promising results
-in manual applications.
-
-Let us first consider what happens when we do not perform offline
-symmetry detection.  At some point, one of the
-$b_i(\vec p) + \sp {\vec a} {\vec x} \ge 0$ constraints,
-say the $j$th constraint, appears as a column
-variable, say $c_1$, while the other constraints are represented
-as rows of the form $b_i(\vec p) - b_j(\vec p) + c$.
-The context is then split according to the relative order of
-$b_j(\vec p)$ and one of the remaining $b_i(\vec p)$.
-The offline method avoids this split by replacing all $b_i(\vec p)$
-by a single newly introduced parameter that represents the minimum
-of these $b_i(\vec p)$.
-In the online method the split is similarly avoided by the introduction
-of a new parameter.  In particular, a new parameter is introduced
-that represents
-$\left| b_j(\vec p) - b_i(\vec p) \right|_+ =
-\max(b_j(\vec p) - b_i(\vec p), 0)$.
-
-In general, let $r = b(\vec p) + \sp {\vec a} {\vec c}$ be a row
-of the tableau such that the sign of $b(\vec p)$ is indeterminate
-and such that exactly one of the elements of $\vec a$ is a $1$,
-while all remaining elements are non-positive.
-That is, $r = b(\vec p) + c_j - f$ with $f = -\sum_{i\ne j} a_i c_i \ge 0$.
-We introduce a new parameter $t$ with
-context constraints $t \ge -b(\vec p)$ and $t \ge 0$ and replace
-the column variable $c_j$ by $c' + t$.  The row $r$ is now equal
-to $b(\vec p) + t + c' - f$.  The constant term of this row is always
-non-negative because any negative value of $b(\vec p)$ is compensated
-by $t \ge -b(\vec p)$ while and non-negative value remains non-negative
-because $t \ge 0$.
-
-We need to show that this transformation does not eliminate any valid
-solutions and that it does not introduce any spurious solutions.
-Given a valid solution for the original problem, we need to find
-a non-negative value of $c'$ satisfying the constraints.
-If $b(\vec p) \ge 0$, we can take $t = 0$ so that
-$c' = c_j - t = c_j \ge 0$.
-If $b(\vec p) < 0$, we can take $t = -b(\vec p)$.
-Since $r = b(\vec p) + c_j - f \ge 0$ and $f \ge 0$, we have 
-$c' = c_j + b(\vec p) \ge 0$.
-Note that these choices amount to plugging in
-$t = \left|-b(\vec p)\right|_+ = \max(-b(\vec p), 0)$.
-Conversely, given a solution to the new problem, we need to find
-a non-negative value of $c_j$, but this is easy since $c_j = c' + t$
-and both of these are non-negative.
-
-Plugging in $t = \max(-b(\vec p), 0)$ can be performed as in
-\autoref{s:post}, but, as in the case of offline symmetry detection,
-it may be better to provide a direct representation for such
-expressions in the internal representation of sets and relations
-or at least in a quast-like output format.
-
-\section{Coalescing}\label{s:coalescing}
-
-See \shortciteN{Verdoolaege2009isl}, for now.
-More details will be added later.
-
-\section{Transitive Closure}
-
-\subsection{Introduction}
-
-\begin{definition}[Power of a Relation]
-Let $R \in \Z^n \to 2^{\Z^{d+d}}$ be a relation and
-$k \in \Z_{\ge 1}$
-a positive number, then power $k$ of relation $R$ is defined as
-\begin{equation}
-\label{eq:transitive:power}
-R^k \coloneqq
-\begin{cases}
-R & \text{if $k = 1$}
-\\
-R \circ R^{k-1} & \text{if $k \ge 2$}
-.
-\end{cases}
-\end{equation}
-\end{definition}
-
-\begin{definition}[Transitive Closure of a Relation]
-Let $R \in \Z^n \to 2^{\Z^{d+d}}$ be a relation,
-then the transitive closure $R^+$ of $R$ is the union
-of all positive powers of $R$,
-$$
-R^+ \coloneqq \bigcup_{k \ge 1} R^k
-.
-$$
-\end{definition}
-Alternatively, the transitive closure may be defined
-inductively as
-\begin{equation}
-\label{eq:transitive:inductive}
-R^+ \coloneqq R \cup \left(R \circ R^+\right)
-.
-\end{equation}
-
-Since the transitive closure of a polyhedral relation
-may no longer be a polyhedral relation \shortcite{Kelly1996closure},
-we can, in the general case, only compute an approximation
-of the transitive closure.
-Whereas \shortciteN{Kelly1996closure} compute underapproximations,
-we, like \shortciteN{Beletska2009}, compute overapproximations.
-That is, given a relation $R$, we will compute a relation $T$
-such that $R^+ \subseteq T$.  Of course, we want this approximation
-to be as close as possible to the actual transitive closure
-$R^+$ and we want to detect the cases where the approximation is
-exact, i.e., where $T = R^+$.
-
-For computing an approximation of the transitive closure of $R$,
-we follow the same general strategy as \shortciteN{Beletska2009}
-and first compute an approximation of $R^k$ for $k \ge 1$ and then project
-out the parameter $k$ from the resulting relation.
-
-\begin{example}
-As a trivial example, consider the relation
-$R = \{\, x \to x + 1 \,\}$.  The $k$th power of this map
-for arbitrary $k$ is
-$$
-R^k = k \mapsto \{\, x \to x + k \mid k \ge 1 \,\}
-.
-$$
-The transitive closure is then
-$$
-\begin{aligned}
-R^+ & = \{\, x \to y \mid \exists k \in \Z_{\ge 1} : y = x + k \,\}
-\\
-& = \{\, x \to y \mid y \ge x + 1 \,\}
-.
-\end{aligned}
-$$
-\end{example}
-
-\subsection{Computing an Approximation of $R^k$}
-\label{s:power}
-
-There are some special cases where the computation of $R^k$ is very easy.
-One such case is that where $R$ does not compose with itself,
-i.e., $R \circ R = \emptyset$ or $\domain R \cap \range R = \emptyset$.
-In this case, $R^k$ is only non-empty for $k=1$ where it is equal
-to $R$ itself.
-
-In general, it is impossible to construct a closed form
-of $R^k$ as a polyhedral relation.
-We will therefore need to make some approximations.
-As a first approximations, we will consider each of the basic
-relations in $R$ as simply adding one or more offsets to a domain element
-to arrive at an image element and ignore the fact that some of these
-offsets may only be applied to some of the domain elements.
-That is, we will only consider the difference set $\Delta\,R$ of the relation.
-In particular, we will first construct a collection $P$ of paths
-that move through
-a total of $k$ offsets and then intersect domain and range of this
-collection with those of $R$.
-That is, 
-\begin{equation}
-\label{eq:transitive:approx}
-K = P \cap \left(\domain R \to \range R\right)
-,
-\end{equation}
-with
-\begin{equation}
-\label{eq:transitive:path}
-P = \vec s \mapsto \{\, \vec x \to \vec y \mid
-\exists k_i \in \Z_{\ge 0}, \vec\delta_i \in k_i \, \Delta_i(\vec s) :
-\vec y = \vec x + \sum_i \vec\delta_i
-\wedge
-\sum_i k_i = k > 0
-\,\}
-\end{equation}
-and with $\Delta_i$ the basic sets that compose
-the difference set $\Delta\,R$.
-Note that the number of basic sets $\Delta_i$ need not be
-the same as the number of basic relations in $R$.
-Also note that since addition is commutative, it does not
-matter in which order we add the offsets and so we are allowed
-to group them as we did in \eqref{eq:transitive:path}.
-
-If all the $\Delta_i$s are singleton sets
-$\Delta_i = \{\, \vec \delta_i \,\}$ with $\vec \delta_i \in \Z^d$,
-then \eqref{eq:transitive:path} simplifies to
-\begin{equation}
-\label{eq:transitive:singleton}
-P = \{\, \vec x \to \vec y \mid
-\exists k_i \in \Z_{\ge 0} :
-\vec y = \vec x + \sum_i k_i \, \vec \delta_i
-\wedge
-\sum_i k_i = k > 0
-\,\}
-\end{equation}
-and then the approximation computed in \eqref{eq:transitive:approx}
-is essentially the same as that of \shortciteN{Beletska2009}.
-If some of the $\Delta_i$s are not singleton sets or if
-some of $\vec \delta_i$s are parametric, then we need
-to resort to further approximations.
-
-To ease both the exposition and the implementation, we will for
-the remainder of this section work with extended offsets
-$\Delta_i' = \Delta_i \times \{\, 1 \,\}$.
-That is, each offset is extended with an extra coordinate that is
-set equal to one.  The paths constructed by summing such extended
-offsets have the length encoded as the difference of their
-final coordinates.  The path $P'$ can then be decomposed into
-paths $P_i'$, one for each $\Delta_i$,
-\begin{equation}
-\label{eq:transitive:decompose}
-P' = \left(
-(P_m' \cup \identity) \circ \cdots \circ
-(P_2' \cup \identity) \circ
-(P_1' \cup \identity)
-\right) \cap
-\{\,
-\vec x' \to \vec y' \mid y_{d+1} - x_{d+1} = k > 0
-\,\}
-,
-\end{equation}
-with
-$$
-P_i' = \vec s \mapsto \{\, \vec x' \to \vec y' \mid
-\exists k \in \Z_{\ge 1}, \vec \delta \in k \, \Delta_i'(\vec s) :
-\vec y' = \vec x' + \vec \delta
-\,\}
-.
-$$
-Note that each $P_i'$ contains paths of length at least one.
-We therefore need to take the union with the identity relation
-when composing the $P_i'$s to allow for paths that do not contain
-any offsets from one or more $\Delta_i'$.
-The path that consists of only identity relations is removed
-by imposing the constraint $y_{d+1} - x_{d+1} > 0$.
-Taking the union with the identity relation means that
-that the relations we compose in \eqref{eq:transitive:decompose}
-each consist of two basic relations.  If there are $m$
-disjuncts in the input relation, then a direct application
-of the composition operation may therefore result in a relation
-with $2^m$ disjuncts, which is prohibitively expensive.
-It is therefore crucial to apply coalescing (\autoref{s:coalescing})
-after each composition.
-
-Let us now consider how to compute an overapproximation of $P_i'$.
-Those that correspond to singleton $\Delta_i$s are grouped together
-and handled as in \eqref{eq:transitive:singleton}.
-Note that this is just an optimization.  The procedure described
-below would produce results that are at least as accurate.
-For simplicity, we first assume that no constraint in $\Delta_i'$
-involves any existentially quantified variables.
-We will return to existentially quantified variables at the end
-of this section.
-Without existentially quantified variables, we can classify
-the constraints of $\Delta_i'$ as follows
-\begin{enumerate}
-\item non-parametric constraints
-\begin{equation}
-\label{eq:transitive:non-parametric}
-A_1 \vec x + \vec c_1 \geq \vec 0
-\end{equation}
-\item purely parametric constraints
-\begin{equation}
-\label{eq:transitive:parametric}
-B_2 \vec s + \vec c_2 \geq \vec 0
-\end{equation}
-\item negative mixed constraints
-\begin{equation}
-\label{eq:transitive:mixed}
-A_3 \vec x + B_3 \vec s + \vec c_3 \geq \vec 0
-\end{equation}
-such that for each row $j$ and for all $\vec s$,
-$$
-\Delta_i'(\vec s) \cap
-\{\, \vec \delta' \mid B_{3,j} \vec s + c_{3,j} > 0 \,\}
-= \emptyset
-$$
-\item positive mixed constraints
-$$
-A_4 \vec x + B_4 \vec s + \vec c_4 \geq \vec 0
-$$
-such that for each row $j$, there is at least one $\vec s$ such that
-$$
-\Delta_i'(\vec s) \cap
-\{\, \vec \delta' \mid B_{4,j} \vec s + c_{4,j} > 0 \,\}
-\ne \emptyset
-$$
-\end{enumerate}
-We will use the following approximation $Q_i$ for $P_i'$:
-\begin{equation}
-\label{eq:transitive:Q}
-\begin{aligned}
-Q_i = \vec s \mapsto
-\{\,
-\vec x' \to \vec y'
-\mid {} & \exists k \in \Z_{\ge 1}, \vec f \in \Z^d :
-\vec y' = \vec x' + (\vec f, k)
-\wedge {}
-\\
-&
-A_1 \vec f + k \vec c_1 \geq \vec 0
-\wedge
-B_2 \vec s + \vec c_2 \geq \vec 0
-\wedge
-A_3 \vec f + B_3 \vec s + \vec c_3 \geq \vec 0
-\,\}
-.
-\end{aligned}
-\end{equation}
-To prove that $Q_i$ is indeed an overapproximation of $P_i'$,
-we need to show that for every $\vec s \in \Z^n$, for every
-$k \in \Z_{\ge 1}$ and for every $\vec f \in k \, \Delta_i(\vec s)$
-we have that
-$(\vec f, k)$ satisfies the constraints in \eqref{eq:transitive:Q}.
-If $\Delta_i(\vec s)$ is non-empty, then $\vec s$ must satisfy
-the constraints in \eqref{eq:transitive:parametric}.
-Each element $(\vec f, k) \in k \, \Delta_i'(\vec s)$ is a sum
-of $k$ elements $(\vec f_j, 1)$ in $\Delta_i'(\vec s)$.
-Each of these elements satisfies the constraints in
-\eqref{eq:transitive:non-parametric}, i.e.,
-$$
-\left[
-\begin{matrix}
-A_1 & \vec c_1
-\end{matrix}
-\right]
-\left[
-\begin{matrix}
-\vec f_j \\ 1
-\end{matrix}
-\right]
-\ge \vec 0
-.
-$$
-The sum of these elements therefore satisfies the same set of inequalities,
-i.e., $A_1 \vec f + k \vec c_1 \geq \vec 0$.
-Finally, the constraints in \eqref{eq:transitive:mixed} are such
-that for any $\vec s$ in the parameter domain of $\Delta$,
-we have $-\vec r(\vec s) \coloneqq B_3 \vec s + \vec c_3 \le \vec 0$,
-i.e., $A_3 \vec f_j \ge \vec r(\vec s) \ge \vec 0$
-and therefore also $A_3 \vec f \ge \vec r(\vec s)$.
-Note that if there are no mixed constraints and if the
-rational relaxation of $\Delta_i(\vec s)$, i.e.,
-$\{\, \vec x \in \Q^d \mid A_1 \vec x + \vec c_1 \ge \vec 0\,\}$,
-has integer vertices, then the approximation is exact, i.e.,
-$Q_i = P_i'$.  In this case, the vertices of $\Delta'_i(\vec s)$
-generate the rational cone
-$\{\, \vec x' \in \Q^{d+1} \mid \left[
-\begin{matrix}
-A_1 & \vec c_1
-\end{matrix}
-\right] \vec x' \,\}$ and therefore $\Delta'_i(\vec s)$ is
-a Hilbert basis of this cone \shortcite[Theorem~16.4]{Schrijver1986}.
-
-Note however that, as pointed out by \shortciteN{DeSmet2010personal},
-if there \emph{are} any mixed constraints, then the above procedure may
-not compute the most accurate affine approximation of
-$k \, \Delta_i(\vec s)$ with $k \ge 1$.
-In particular, we only consider the negative mixed constraints that
-happen to appear in the description of $\Delta_i(\vec s)$, while we
-should instead consider \emph{all} valid such constraints.
-It is also sufficient to consider those constraints because any
-constraint that is valid for $k \, \Delta_i(\vec s)$ is also
-valid for $1 \, \Delta_i(\vec s) = \Delta_i(\vec s)$.
-Take therefore any constraint
-$\spv a x + \spv b s + c \ge 0$ valid for $\Delta_i(\vec s)$.
-This constraint is also valid for $k \, \Delta_i(\vec s)$ iff
-$k \, \spv a x + \spv b s + c \ge 0$.
-If $\spv b s + c$ can attain any positive value, then $\spv a x$
-may be negative for some elements of $\Delta_i(\vec s)$.
-We then have $k \, \spv a x < \spv a x$ for $k > 1$ and so the constraint
-is not valid for $k \, \Delta_i(\vec s)$.
-We therefore need to impose $\spv b s + c \le 0$ for all values
-of $\vec s$ such that $\Delta_i(\vec s)$ is non-empty, i.e.,
-$\vec b$ and $c$ need to be such that $- \spv b s - c \ge 0$ is a valid
-constraint of $\Delta_i(\vec s)$.  That is, $(\vec b, c)$ are the opposites
-of the coefficients of a valid constraint of $\Delta_i(\vec s)$.
-The approximation of $k \, \Delta_i(\vec s)$ can therefore be obtained
-using three applications of Farkas' lemma.  The first obtains the coefficients
-of constraints valid for $\Delta_i(\vec s)$.  The second obtains
-the coefficients of constraints valid for the projection of $\Delta_i(\vec s)$
-onto the parameters.  The opposite of the second set is then computed
-and intersected with the first set.  The result is the set of coefficients
-of constraints valid for $k \, \Delta_i(\vec s)$.  A final application
-of Farkas' lemma is needed to obtain the approximation of
-$k \, \Delta_i(\vec s)$ itself.
-
-\begin{example}
-Consider the relation
-$$
-n \to \{\, (x, y) \to (1 + x, 1 - n + y) \mid n \ge 2 \,\}
-.
-$$
-The difference set of this relation is
-$$
-\Delta = n \to \{\, (1, 1 - n) \mid n \ge 2 \,\}
-.
-$$
-Using our approach, we would only consider the mixed constraint
-$y - 1 + n \ge 0$, leading to the following approximation of the
-transitive closure:
-$$
-n \to \{\, (x, y) \to (o_0, o_1) \mid n \ge 2 \wedge o_1 \le 1 - n + y \wedge o_0 \ge 1 + x \,\}
-.
-$$
-If, instead, we apply Farkas's lemma to $\Delta$, i.e.,
-\begin{verbatim}
-D := [n] -> { [1, 1 - n] : n >= 2 };
-CD := coefficients D;
-CD;
-\end{verbatim}
-we obtain
-\begin{verbatim}
-{ rat: coefficients[[c_cst, c_n] -> [i2, i3]] : i3 <= c_n and
-  i3 <= c_cst + 2c_n + i2 }
-\end{verbatim}
-The pure-parametric constraints valid for $\Delta$,
-\begin{verbatim}
-P := { [a,b] -> [] }(D);
-CP := coefficients P;
-CP;
-\end{verbatim}
-are
-\begin{verbatim}
-{ rat: coefficients[[c_cst, c_n] -> []] : c_n >= 0 and 2c_n >= -c_cst }
-\end{verbatim}
-Negating these coefficients and intersecting with \verb+CD+,
-\begin{verbatim}
-NCP := { rat: coefficients[[a,b] -> []]
-              -> coefficients[[-a,-b] -> []] }(CP);
-CK := wrap((unwrap CD) * (dom (unwrap NCP)));
-CK;
-\end{verbatim}
-we obtain
-\begin{verbatim}
-{ rat: [[c_cst, c_n] -> [i2, i3]] : i3 <= c_n and
-  i3 <= c_cst + 2c_n + i2 and c_n <= 0 and 2c_n <= -c_cst }
-\end{verbatim}
-The approximation for $k\,\Delta$,
-\begin{verbatim}
-K := solutions CK;
-K;
-\end{verbatim}
-is then
-\begin{verbatim}
-[n] -> { rat: [i0, i1] : i1 <= -i0 and i0 >= 1 and i1 <= 2 - n - i0 }
-\end{verbatim}
-Finally, the computed approximation for $R^+$,
-\begin{verbatim}
-T := unwrap({ [dx,dy] -> [[x,y] -> [x+dx,y+dy]] }(K));
-R := [n] -> { [x,y] -> [x+1,y+1-n] : n >= 2 };
-T := T * ((dom R) -> (ran R));
-T;
-\end{verbatim}
-is
-\begin{verbatim}
-[n] -> { [x, y] -> [o0, o1] : o1 <= x + y - o0 and
-         o0 >= 1 + x and o1 <= 2 - n + x + y - o0 and n >= 2 }
-\end{verbatim}
-\end{example}
-
-Existentially quantified variables can be handled by
-classifying them into variables that are uniquely
-determined by the parameters, variables that are independent
-of the parameters and others.  The first set can be treated
-as parameters and the second as variables.  Constraints involving
-the other existentially quantified variables are removed.
-
-\begin{example}
-Consider the relation
-$$
-R =
-n \to \{\, x \to y \mid \exists \, \alpha_0, \alpha_1: 7\alpha_0 = -2 + n \wedge 5\alpha_1 = -1 - x + y \wedge y \ge 6 + x \,\}
-.
-$$
-The difference set of this relation is
-$$
-\Delta = \Delta \, R =
-n \to \{\, x \mid \exists \, \alpha_0, \alpha_1: 7\alpha_0 = -2 + n \wedge 5\alpha_1 = -1 + x \wedge x \ge 6 \,\}
-.
-$$
-The existentially quantified variables can be defined in terms
-of the parameters and variables as
-$$
-\alpha_0 = \floor{\frac{-2 + n}7}
-\qquad
-\text{and}
-\qquad
-\alpha_1 = \floor{\frac{-1 + x}5}
-.
-$$
-$\alpha_0$ can therefore be treated as a parameter,
-while $\alpha_1$ can be treated as a variable.
-This in turn means that $7\alpha_0 = -2 + n$ can be treated as
-a purely parametric constraint, while the other two constraints are
-non-parametric.
-The corresponding $Q$~\eqref{eq:transitive:Q} is therefore
-$$
-\begin{aligned}
-n \to \{\, (x,z) \to (y,w) \mid
-\exists\, \alpha_0, \alpha_1, k, f : {} &
-k \ge 1 \wedge
-y = x + f \wedge
-w = z + k \wedge {} \\
-&
-7\alpha_0 = -2 + n \wedge
-5\alpha_1 = -k + x \wedge
-x \ge 6 k
-\,\}
-.
-\end{aligned}
-$$
-Projecting out the final coordinates encoding the length of the paths,
-results in the exact transitive closure
-$$
-R^+ =
-n \to \{\, x \to y \mid \exists \, \alpha_0, \alpha_1: 7\alpha_1 = -2 + n \wedge 6\alpha_0 \ge -x + y \wedge 5\alpha_0 \le -1 - x + y \,\}
-.
-$$
-\end{example}
-
-The fact that we ignore some impure constraints clearly leads
-to a loss of accuracy.  In some cases, some of this loss can be recovered
-by not considering the parameters in a special way.
-That is, instead of considering the set
-$$
-\Delta = \diff R =
-\vec s \mapsto
-\{\, \vec \delta \in \Z^{d} \mid \exists \vec x \to \vec y \in R :
-\vec \delta = \vec y - \vec x
-\,\}
-$$
-we consider the set
-$$
-\Delta' = \diff R' =
-\{\, \vec \delta \in \Z^{n+d} \mid \exists
-(\vec s, \vec x) \to (\vec s, \vec y) \in R' :
-\vec \delta = (\vec s - \vec s, \vec y - \vec x)
-\,\}
-.
-$$
-The first $n$ coordinates of every element in $\Delta'$ are zero.
-Projecting out these zero coordinates from $\Delta'$ is equivalent
-to projecting out the parameters in $\Delta$.
-The result is obviously a superset of $\Delta$, but all its constraints
-are of type \eqref{eq:transitive:non-parametric} and they can therefore
-all be used in the construction of $Q_i$.
-
-\begin{example}
-Consider the relation
-$$
-% [n] -> { [x, y] -> [1 + x, 1 - n + y] | n >= 2 }
-R = n \to \{\, (x, y) \to (1 + x, 1 - n + y) \mid n \ge 2 \,\}
-.
-$$
-We have
-$$
-\diff R = n \to \{\, (1, 1 - n) \mid n \ge 2 \,\}
-$$
-and so, by treating the parameters in a special way, we obtain
-the following approximation for $R^+$:
-$$
-n \to \{\, (x, y) \to (x', y') \mid n \ge 2 \wedge y' \le 1 - n + y \wedge x' \ge 1 + x \,\}
-.
-$$
-If we consider instead
-$$
-R' = \{\, (n, x, y) \to (n, 1 + x, 1 - n + y) \mid n \ge 2 \,\}
-$$
-then
-$$
-\diff R' = \{\, (0, 1, y) \mid y \le -1 \,\}
-$$
-and we obtain the approximation
-$$
-n \to \{\, (x, y) \to (x', y') \mid n \ge 2 \wedge x' \ge 1 + x \wedge y' \le x + y - x' \,\}
-.
-$$
-If we consider both $\diff R$ and $\diff R'$, then we obtain
-$$
-n \to \{\, (x, y) \to (x', y') \mid n \ge 2 \wedge y' \le 1 - n + y \wedge x' \ge 1 + x \wedge y' \le x + y - x' \,\}
-.
-$$
-Note, however, that this is not the most accurate affine approximation that
-can be obtained.  That would be
-$$
-n \to \{\, (x, y) \to (x', y') \mid y' \le 2 - n + x + y - x' \wedge n \ge 2 \wedge x' \ge 1 + x \,\}
-.
-$$
-\end{example}
-
-\subsection{Checking Exactness}
-
-The approximation $T$ for the transitive closure $R^+$ can be obtained
-by projecting out the parameter $k$ from the approximation $K$
-\eqref{eq:transitive:approx} of the power $R^k$.
-Since $K$ is an overapproximation of $R^k$, $T$ will also be an
-overapproximation of $R^+$.
-To check whether the results are exact, we need to consider two
-cases depending on whether $R$ is {\em cyclic}, where $R$ is defined
-to be cyclic if $R^+$ maps any element to itself, i.e.,
-$R^+ \cap \identity \ne \emptyset$.
-If $R$ is acyclic, then the inductive definition of
-\eqref{eq:transitive:inductive} is equivalent to its completion,
-i.e.,
-$$
-R^+ = R \cup \left(R \circ R^+\right)
-$$
-is a defining property.
-Since $T$ is known to be an overapproximation, we only need to check
-whether
-$$
-T \subseteq R \cup \left(R \circ T\right)
-.
-$$
-This is essentially Theorem~5 of \shortciteN{Kelly1996closure}.
-The only difference is that they only consider lexicographically
-forward relations, a special case of acyclic relations.
-
-If, on the other hand, $R$ is cyclic, then we have to resort
-to checking whether the approximation $K$ of the power is exact.
-Note that $T$ may be exact even if $K$ is not exact, so the check
-is sound, but incomplete.
-To check exactness of the power, we simply need to check
-\eqref{eq:transitive:power}.  Since again $K$ is known
-to be an overapproximation, we only need to check whether
-$$
-\begin{aligned}
-K'|_{y_{d+1} - x_{d+1} = 1} & \subseteq R'
-\\
-K'|_{y_{d+1} - x_{d+1} \ge 2} & \subseteq R' \circ K'|_{y_{d+1} - x_{d+1} \ge 1}
-,
-\end{aligned}
-$$
-where $R' = \{\, \vec x' \to \vec y' \mid \vec x \to \vec y \in R
-\wedge y_{d+1} - x_{d+1} = 1\,\}$, i.e., $R$ extended with path
-lengths equal to 1.
-
-All that remains is to explain how to check the cyclicity of $R$.
-Note that the exactness on the power is always sound, even
-in the acyclic case, so we only need to be careful that we find
-all cyclic cases.  Now, if $R$ is cyclic, i.e.,
-$R^+ \cap \identity \ne \emptyset$, then, since $T$ is
-an overapproximation of $R^+$, also
-$T \cap \identity \ne \emptyset$.  This in turn means
-that $\Delta \, K'$ contains a point whose first $d$ coordinates
-are zero and whose final coordinate is positive.
-In the implementation we currently perform this test on $P'$ instead of $K'$.
-Note that if $R^+$ is acyclic and $T$ is not, then the approximation
-is clearly not exact and the approximation of the power $K$
-will not be exact either.
-
-\subsection{Decomposing $R$ into strongly connected components}
-
-If the input relation $R$ is a union of several basic relations
-that can be partially ordered
-then the accuracy of the approximation may be improved by computing
-an approximation of each strongly connected components separately.
-For example, if $R = R_1 \cup R_2$ and $R_1 \circ R_2 = \emptyset$,
-then we know that any path that passes through $R_2$ cannot later
-pass through $R_1$, i.e.,
-\begin{equation}
-\label{eq:transitive:components}
-R^+ = R_1^+ \cup R_2^+ \cup \left(R_2^+ \circ R_1^+\right)
-.
-\end{equation}
-We can therefore compute (approximations of) transitive closures
-of $R_1$ and $R_2$ separately.
-Note, however, that the condition $R_1 \circ R_2 = \emptyset$
-is actually too strong.
-If $R_1 \circ R_2$ is a subset of $R_2 \circ R_1$
-then we can reorder the segments
-in any path that moves through both $R_1$ and $R_2$ to
-first move through $R_1$ and then through $R_2$.
-
-This idea can be generalized to relations that are unions
-of more than two basic relations by constructing the
-strongly connected components in the graph with as vertices
-the basic relations and an edge between two basic relations
-$R_i$ and $R_j$ if $R_i$ needs to follow $R_j$ in some paths.
-That is, there is an edge from $R_i$ to $R_j$ iff
-\begin{equation}
-\label{eq:transitive:edge}
-R_i \circ R_j
-\not\subseteq
-R_j \circ R_i
-.
-\end{equation}
-The components can be obtained from the graph by applying
-Tarjan's algorithm \shortcite{Tarjan1972}.
-
-In practice, we compute the (extended) powers $K_i'$ of each component
-separately and then compose them as in \eqref{eq:transitive:decompose}.
-Note, however, that in this case the order in which we apply them is
-important and should correspond to a topological ordering of the
-strongly connected components.  Simply applying Tarjan's
-algorithm will produce topologically sorted strongly connected components.
-The graph on which Tarjan's algorithm is applied is constructed on-the-fly.
-That is, whenever the algorithm checks if there is an edge between
-two vertices, we evaluate \eqref{eq:transitive:edge}.
-The exactness check is performed on each component separately.
-If the approximation turns out to be inexact for any of the components,
-then the entire result is marked inexact and the exactness check
-is skipped on the components that still need to be handled.
-
-It should be noted that \eqref{eq:transitive:components}
-is only valid for exact transitive closures.
-If overapproximations are computed in the right hand side, then the result will
-still be an overapproximation of the left hand side, but this result
-may not be transitively closed.  If we only separate components based
-on the condition $R_i \circ R_j = \emptyset$, then there is no problem,
-as this condition will still hold on the computed approximations
-of the transitive closures.  If, however, we have exploited
-\eqref{eq:transitive:edge} during the decomposition and if the
-result turns out not to be exact, then we check whether
-the result is transitively closed.  If not, we recompute
-the transitive closure, skipping the decomposition.
-Note that testing for transitive closedness on the result may
-be fairly expensive, so we may want to make this check
-configurable.
-
-\begin{figure}
-\begin{center}
-\begin{tikzpicture}[x=0.5cm,y=0.5cm,>=stealth,shorten >=1pt]
-\foreach \x in {1,...,10}{
-    \foreach \y in {1,...,10}{
-	\draw[->] (\x,\y) -- (\x,\y+1);
-    }
-}
-\foreach \x in {1,...,20}{
-    \foreach \y in {5,...,15}{
-	\draw[->] (\x,\y) -- (\x+1,\y);
-    }
-}
-\end{tikzpicture}
-\end{center}
-\caption{The relation from \autoref{ex:closure4}}
-\label{f:closure4}
-\end{figure}
-\begin{example}
-\label{ex:closure4}
-Consider the relation in example {\tt closure4} that comes with
-the Omega calculator~\shortcite{Omega_calc}, $R = R_1 \cup R_2$,
-with
-$$
-\begin{aligned}
-R_1 & = \{\, (x,y) \to (x,y+1) \mid 1 \le x,y \le 10 \,\}
-\\
-R_2 & = \{\, (x,y) \to (x+1,y) \mid 1 \le x \le 20 \wedge 5 \le y \le 15 \,\}
-.
-\end{aligned}
-$$
-This relation is shown graphically in \autoref{f:closure4}.
-We have
-$$
-\begin{aligned}
-R_1 \circ R_2 &=
-\{\, (x,y) \to (x+1,y+1) \mid 1 \le x \le 9 \wedge 5 \le y \le 10 \,\}
-\\
-R_2 \circ R_1 &=
-\{\, (x,y) \to (x+1,y+1) \mid 1 \le x \le 10 \wedge 4 \le y \le 10 \,\}
-.
-\end{aligned}
-$$
-Clearly, $R_1 \circ R_2 \subseteq R_2 \circ R_1$ and so
-$$
-\left(
-R_1 \cup R_2
-\right)^+
-=
-\left(R_2^+ \circ R_1^+\right)
-\cup R_1^+
-\cup R_2^+
-.
-$$
-\end{example}
-
-\begin{figure}
-\newcounter{n}
-\newcounter{t1}
-\newcounter{t2}
-\newcounter{t3}
-\newcounter{t4}
-\begin{center}
-\begin{tikzpicture}[>=stealth,shorten >=1pt]
-\setcounter{n}{7}
-\foreach \i in {1,...,\value{n}}{
-    \foreach \j in {1,...,\value{n}}{
-	\setcounter{t1}{2 * \j - 4 - \i + 1}
-	\setcounter{t2}{\value{n} - 3 - \i + 1}
-	\setcounter{t3}{2 * \i - 1 - \j + 1}
-	\setcounter{t4}{\value{n} - \j + 1}
-	\ifnum\value{t1}>0\ifnum\value{t2}>0
-	\ifnum\value{t3}>0\ifnum\value{t4}>0
-	    \draw[thick,->] (\i,\j) to[out=20] (\i+3,\j);
-	\fi\fi\fi\fi
-	\setcounter{t1}{2 * \j - 1 - \i + 1}
-	\setcounter{t2}{\value{n} - \i + 1}
-	\setcounter{t3}{2 * \i - 4 - \j + 1}
-	\setcounter{t4}{\value{n} - 3 - \j + 1}
-	\ifnum\value{t1}>0\ifnum\value{t2}>0
-	\ifnum\value{t3}>0\ifnum\value{t4}>0
-	    \draw[thick,->] (\i,\j) to[in=-20,out=20] (\i,\j+3);
-	\fi\fi\fi\fi
-	\setcounter{t1}{2 * \j - 1 - \i + 1}
-	\setcounter{t2}{\value{n} - 1 - \i + 1}
-	\setcounter{t3}{2 * \i - 1 - \j + 1}
-	\setcounter{t4}{\value{n} - 1 - \j + 1}
-	\ifnum\value{t1}>0\ifnum\value{t2}>0
-	\ifnum\value{t3}>0\ifnum\value{t4}>0
-	    \draw[thick,->] (\i,\j) to (\i+1,\j+1);
-	\fi\fi\fi\fi
-    }
-}
-\end{tikzpicture}
-\end{center}
-\caption{The relation from \autoref{ex:decomposition}}
-\label{f:decomposition}
-\end{figure}
-\begin{example}
-\label{ex:decomposition}
-Consider the relation on the right of \shortciteN[Figure~2]{Beletska2009},
-reproduced in \autoref{f:decomposition}.
-The relation can be described as $R = R_1 \cup R_2 \cup R_3$,
-with
-$$
-\begin{aligned}
-R_1 &= n \mapsto \{\, (i,j) \to (i+3,j) \mid
-i \le 2 j - 4 \wedge
-i \le n - 3 \wedge
-j \le 2 i - 1 \wedge
-j \le n \,\}
-\\
-R_2 &= n \mapsto \{\, (i,j) \to (i,j+3) \mid
-i \le 2 j - 1 \wedge
-i \le n \wedge
-j \le 2 i - 4 \wedge
-j \le n - 3 \,\}
-\\
-R_3 &= n \mapsto \{\, (i,j) \to (i+1,j+1) \mid
-i \le 2 j - 1 \wedge
-i \le n - 1 \wedge
-j \le 2 i - 1 \wedge
-j \le n - 1\,\}
-.
-\end{aligned}
-$$
-The figure shows this relation for $n = 7$.
-Both
-$R_3 \circ R_1 \subseteq R_1 \circ R_3$
-and
-$R_3 \circ R_2 \subseteq R_2 \circ R_3$,
-which the reader can verify using the {\tt iscc} calculator:
-\begin{verbatim}
-R1 := [n] -> { [i,j] -> [i+3,j] : i <= 2 j - 4 and i <= n - 3 and
-                                  j <= 2 i - 1 and j <= n };
-R2 := [n] -> { [i,j] -> [i,j+3] : i <= 2 j - 1 and i <= n and
-                                  j <= 2 i - 4 and j <= n - 3 };
-R3 := [n] -> { [i,j] -> [i+1,j+1] : i <= 2 j - 1 and i <= n - 1 and
-                                    j <= 2 i - 1 and j <= n - 1 };
-(R1 . R3) - (R3 . R1);
-(R2 . R3) - (R3 . R2);
-\end{verbatim}
-$R_3$ can therefore be moved forward in any path.
-For the other two basic relations, we have both
-$R_2 \circ R_1 \not\subseteq R_1 \circ R_2$
-and
-$R_1 \circ R_2 \not\subseteq R_2 \circ R_1$
-and so $R_1$ and $R_2$ form a strongly connected component.
-By computing the power of $R_3$ and $R_1 \cup R_2$ separately
-and composing the results, the power of $R$ can be computed exactly
-using \eqref{eq:transitive:singleton}.
-As explained by \shortciteN{Beletska2009}, applying the same formula
-to $R$ directly, without a decomposition, would result in
-an overapproximation of the power.
-\end{example}
-
-\subsection{Partitioning the domains and ranges of $R$}
-
-The algorithm of \autoref{s:power} assumes that the input relation $R$
-can be treated as a union of translations.
-This is a reasonable assumption if $R$ maps elements of a given
-abstract domain to the same domain.
-However, if $R$ is a union of relations that map between different
-domains, then this assumption no longer holds.
-In particular, when an entire dependence graph is encoded
-in a single relation, as is done by, e.g.,
-\shortciteN[Section~6.1]{Barthou2000MSE}, then it does not make
-sense to look at differences between iterations of different domains.
-Now, arguably, a modified Floyd-Warshall algorithm should
-be applied to the dependence graph, as advocated by
-\shortciteN{Kelly1996closure}, with the transitive closure operation
-only being applied to relations from a given domain to itself.
-However, it is also possible to detect disjoint domains and ranges
-and to apply Floyd-Warshall internally.
-
-\linesnumbered
-\begin{algorithm}
-\caption{The modified Floyd-Warshall algorithm of
-\protect\shortciteN{Kelly1996closure}}
-\label{a:Floyd}
-\SetKwInput{Input}{Input}
-\SetKwInput{Output}{Output}
-\Input{Relations $R_{pq}$, $0 \le p, q < n$}
-\Output{Updated relations $R_{pq}$ such that each relation
-$R_{pq}$ contains all indirect paths from $p$ to $q$ in the input graph}
-%
-\BlankLine
-\SetVline
-\dontprintsemicolon
-%
-\For{$r \in [0, n-1]$}{
-    $R_{rr} \coloneqq R_{rr}^+$ \nllabel{l:Floyd:closure}\;
-    \For{$p \in [0, n-1]$}{
-	\For{$q \in [0, n-1]$}{
-	    \If{$p \ne r$ or $q \ne r$}{
-		$R_{pq} \coloneqq R_{pq} \cup \left(R_{rq} \circ R_{pr}\right)
-			     \cup \left(R_{rq} \circ R_{rr} \circ R_{pr}\right)$
-	     \nllabel{l:Floyd:update}
-	     }
-	}
-    }
-}
-\end{algorithm}
-
-Let the input relation $R$ be a union of $m$ basic relations $R_i$.
-Let $D_{2i}$ be the domains of $R_i$ and $D_{2i+1}$ the ranges of $R_i$.
-The first step is to group overlapping $D_j$ until a partition is
-obtained.  If the resulting partition consists of a single part,
-then we continue with the algorithm of \autoref{s:power}.
-Otherwise, we apply Floyd-Warshall on the graph with as vertices
-the parts of the partition and as edges the $R_i$ attached to
-the appropriate pairs of vertices.
-In particular, let there be $n$ parts $P_k$ in the partition.
-We construct $n^2$ relations
-$$
-R_{pq} \coloneqq \bigcup_{i \text{ s.t. } \domain R_i \subseteq P_p \wedge
-				 \range R_i \subseteq P_q} R_i
-,
-$$
-apply \autoref{a:Floyd} and return the union of all resulting
-$R_{pq}$ as the transitive closure of $R$.
-Each iteration of the $r$-loop in \autoref{a:Floyd} updates
-all relations $R_{pq}$ to include paths that go from $p$ to $r$,
-possibly stay there for a while, and then go from $r$ to $q$.
-Note that paths that ``stay in $r$'' include all paths that
-pass through earlier vertices since $R_{rr}$ itself has been updated
-accordingly in previous iterations of the outer loop.
-In principle, it would be sufficient to use the $R_{pr}$
-and $R_{rq}$ computed in the previous iteration of the
-$r$-loop in Line~\ref{l:Floyd:update}.
-However, from an implementation perspective, it is easier
-to allow either or both of these to have been updated
-in the same iteration of the $r$-loop.
-This may result in duplicate paths, but these can usually
-be removed by coalescing (\autoref{s:coalescing}) the result of the union
-in Line~\ref{l:Floyd:update}, which should be done in any case.
-The transitive closure in Line~\ref{l:Floyd:closure}
-is performed using a recursive call.  This recursive call
-includes the partitioning step, but the resulting partition will
-usually be a singleton.
-The result of the recursive call will either be exact or an
-overapproximation.  The final result of Floyd-Warshall is therefore
-also exact or an overapproximation.
-
-\begin{figure}
-\begin{center}
-\begin{tikzpicture}[x=1cm,y=1cm,>=stealth,shorten >=3pt]
-\foreach \x/\y in {0/0,1/1,3/2} {
-    \fill (\x,\y) circle (2pt);
-}
-\foreach \x/\y in {0/1,2/2,3/3} {
-    \draw (\x,\y) circle (2pt);
-}
-\draw[->] (0,0) -- (0,1);
-\draw[->] (0,1) -- (1,1);
-\draw[->] (2,2) -- (3,2);
-\draw[->] (3,2) -- (3,3);
-\draw[->,dashed] (2,2) -- (3,3);
-\draw[->,dotted] (0,0) -- (1,1);
-\end{tikzpicture}
-\end{center}
-\caption{The relation (solid arrows) on the right of Figure~1 of
-\protect\shortciteN{Beletska2009} and its transitive closure}
-\label{f:COCOA:1}
-\end{figure}
-\begin{example}
-Consider the relation on the right of Figure~1 of
-\shortciteN{Beletska2009},
-reproduced in \autoref{f:COCOA:1}.
-This relation can be described as
-$$
-\begin{aligned}
-\{\, (x, y) \to (x_2, y_2) \mid {} & (3y = 2x \wedge x_2 = x \wedge 3y_2 = 3 + 2x \wedge x \ge 0 \wedge x \le 3) \vee {} \\
-& (x_2 = 1 + x \wedge y_2 = y \wedge x \ge 0 \wedge 3y \ge 2 + 2x \wedge x \le 2 \wedge 3y \le 3 + 2x) \,\}
-.
-\end{aligned}
-$$
-Note that the domain of the upward relation overlaps with the range
-of the rightward relation and vice versa, but that the domain
-of neither relation overlaps with its own range or the domain of
-the other relation.
-The domains and ranges can therefore be partitioned into two parts,
-$P_0$ and $P_1$, shown as the white and black dots in \autoref{f:COCOA:1},
-respectively.
-Initially, we have
-$$
-\begin{aligned}
-R_{00} & = \emptyset
-\\
-R_{01} & = 
-\{\, (x, y) \to (x+1, y) \mid 
-(x \ge 0 \wedge 3y \ge 2 + 2x \wedge x \le 2 \wedge 3y \le 3 + 2x) \,\}
-\\
-R_{10} & =
-\{\, (x, y) \to (x_2, y_2) \mid (3y = 2x \wedge x_2 = x \wedge 3y_2 = 3 + 2x \wedge x \ge 0 \wedge x \le 3) \,\}
-\\
-R_{11} & = \emptyset
-.
-\end{aligned}
-$$
-In the first iteration, $R_{00}$ remains the same ($\emptyset^+ = \emptyset$).
-$R_{01}$ and $R_{10}$ are therefore also unaffected, but
-$R_{11}$ is updated to include $R_{01} \circ R_{10}$, i.e.,
-the dashed arrow in the figure.
-This new $R_{11}$ is obviously transitively closed, so it is not
-changed in the second iteration and it does not have an effect
-on $R_{01}$ and $R_{10}$.  However, $R_{00}$ is updated to
-include $R_{10} \circ R_{01}$, i.e., the dotted arrow in the figure.
-The transitive closure of the original relation is then equal to
-$R_{00} \cup R_{01} \cup R_{10} \cup R_{11}$.
-\end{example}
-
-\subsection{Incremental Computation}
-\label{s:incremental}
-
-In some cases it is possible and useful to compute the transitive closure
-of union of basic relations incrementally.  In particular,
-if $R$ is a union of $m$ basic maps,
-$$
-R = \bigcup_j R_j
-,
-$$
-then we can pick some $R_i$ and compute the transitive closure of $R$ as
-\begin{equation}
-\label{eq:transitive:incremental}
-R^+ = R_i^+ \cup
-\left(
-\bigcup_{j \ne i}
-R_i^* \circ R_j \circ R_i^*
-\right)^+
-.
-\end{equation}
-For this approach to be successful, it is crucial that each
-of the disjuncts in the argument of the second transitive
-closure in \eqref{eq:transitive:incremental} be representable
-as a single basic relation, i.e., without a union.
-If this condition holds, then by using \eqref{eq:transitive:incremental},
-the number of disjuncts in the argument of the transitive closure
-can be reduced by one.
-Now, $R_i^* = R_i^+ \cup \identity$, but in some cases it is possible
-to relax the constraints of $R_i^+$ to include part of the identity relation,
-say on domain $D$.  We will use the notation
-${\cal C}(R_i,D) = R_i^+ \cup \identity_D$ to represent
-this relaxed version of $R^+$.
-\shortciteN{Kelly1996closure} use the notation $R_i^?$.
-${\cal C}(R_i,D)$ can be computed by allowing $k$ to attain
-the value $0$ in \eqref{eq:transitive:Q} and by using
-$$
-P \cap \left(D \to D\right)
-$$
-instead of \eqref{eq:transitive:approx}.
-Typically, $D$ will be a strict superset of both $\domain R_i$
-and $\range R_i$.  We therefore need to check that domain
-and range of the transitive closure are part of ${\cal C}(R_i,D)$,
-i.e., the part that results from the paths of positive length ($k \ge 1$),
-are equal to the domain and range of $R_i$.
-If not, then the incremental approach cannot be applied for
-the given choice of $R_i$ and $D$.
-
-In order to be able to replace $R^*$ by ${\cal C}(R_i,D)$
-in \eqref{eq:transitive:incremental}, $D$ should be chosen
-to include both $\domain R$ and $\range R$, i.e., such
-that $\identity_D \circ R_j \circ \identity_D = R_j$ for all $j\ne i$.
-\shortciteN{Kelly1996closure} say that they use
-$D = \domain R_i \cup \range R_i$, but presumably they mean that
-they use $D = \domain R \cup \range R$.
-Now, this expression of $D$ contains a union, so it not directly usable.
-\shortciteN{Kelly1996closure} do not explain how they avoid this union.
-Apparently, in their implementation,
-they are using the convex hull of $\domain R \cup \range R$
-or at least an approximation of this convex hull.
-We use the simple hull (\autoref{s:simple hull}) of $\domain R \cup \range R$.
-
-It is also possible to use a domain $D$ that does {\em not\/}
-include $\domain R \cup \range R$, but then we have to
-compose with ${\cal C}(R_i,D)$ more selectively.
-In particular, if we have
-\begin{equation}
-\label{eq:transitive:right}
-\text{for each $j \ne i$ either }
-\domain R_j \subseteq D \text{ or } \domain R_j \cap \range R_i = \emptyset
-\end{equation}
-and, similarly,
-\begin{equation}
-\label{eq:transitive:left}
-\text{for each $j \ne i$ either }
-\range R_j \subseteq D \text{ or } \range R_j \cap \domain R_i = \emptyset
-\end{equation}
-then we can refine \eqref{eq:transitive:incremental} to
-$$
-R_i^+ \cup
-\left(
-\left(
-\bigcup_{\shortstack{$\scriptstyle\domain R_j \subseteq D $\\
-		     $\scriptstyle\range R_j \subseteq D$}}
-{\cal C} \circ R_j \circ {\cal C}
-\right)
-\cup
-\left(
-\bigcup_{\shortstack{$\scriptstyle\domain R_j \cap \range R_i = \emptyset$\\
-		     $\scriptstyle\range R_j \subseteq D$}}
-\!\!\!\!\!
-{\cal C} \circ R_j
-\right)
-\cup
-\left(
-\bigcup_{\shortstack{$\scriptstyle\domain R_j \subseteq D $\\
-		     $\scriptstyle\range R_j \cap \domain R_i = \emptyset$}}
-\!\!\!\!\!
-R_j \circ {\cal C}
-\right)
-\cup
-\left(
-\bigcup_{\shortstack{$\scriptstyle\domain R_j \cap \range R_i = \emptyset$\\
-		     $\scriptstyle\range R_j \cap \domain R_i = \emptyset$}}
-\!\!\!\!\!
-R_j
-\right)
-\right)^+
-.
-$$
-If only property~\eqref{eq:transitive:right} holds,
-we can use
-$$
-R_i^+ \cup
-\left(
-\left(
-R_i^+ \cup \identity
-\right)
-\circ
-\left(
-\left(
-\bigcup_{\shortstack{$\scriptstyle\domain R_j \subseteq D $}}
-R_j \circ {\cal C}
-\right)
-\cup
-\left(
-\bigcup_{\shortstack{$\scriptstyle\domain R_j \cap \range R_i = \emptyset$}}
-\!\!\!\!\!
-R_j
-\right)
-\right)^+
-\right)
-,
-$$
-while if only property~\eqref{eq:transitive:left} holds,
-we can use
-$$
-R_i^+ \cup
-\left(
-\left(
-\left(
-\bigcup_{\shortstack{$\scriptstyle\range R_j \subseteq D $}}
-{\cal C} \circ R_j
-\right)
-\cup
-\left(
-\bigcup_{\shortstack{$\scriptstyle\range R_j \cap \domain R_i = \emptyset$}}
-\!\!\!\!\!
-R_j
-\right)
-\right)^+
-\circ
-\left(
-R_i^+ \cup \identity
-\right)
-\right)
-.
-$$
-
-It should be noted that if we want the result of the incremental
-approach to be transitively closed, then we can only apply it
-if all of the transitive closure operations involved are exact.
-If, say, the second transitive closure in \eqref{eq:transitive:incremental}
-contains extra elements, then the result does not necessarily contain
-the composition of these extra elements with powers of $R_i$.
-
-\subsection{An {\tt Omega}-like implementation}
-
-While the main algorithm of \shortciteN{Kelly1996closure} is
-designed to compute and underapproximation of the transitive closure,
-the authors mention that they could also compute overapproximations.
-In this section, we describe our implementation of an algorithm
-that is based on their ideas.
-Note that the {\tt Omega} library computes underapproximations
-\shortcite[Section 6.4]{Omega_lib}.
-
-The main tool is Equation~(2) of \shortciteN{Kelly1996closure}.
-The input relation $R$ is first overapproximated by a ``d-form'' relation
-$$
-\{\, \vec i \to \vec j \mid \exists \vec \alpha :
-\vec L \le \vec j - \vec i \le \vec U
-\wedge
-(\forall p : j_p - i_p = M_p \alpha_p)
-\,\}
-,
-$$
-where $p$ ranges over the dimensions and $\vec L$, $\vec U$ and
-$\vec M$ are constant integer vectors.  The elements of $\vec U$
-may be $\infty$, meaning that there is no upper bound corresponding
-to that element, and similarly for $\vec L$.
-Such an overapproximation can be obtained by computing strides,
-lower and upper bounds on the difference set $\Delta \, R$.
-The transitive closure of such a ``d-form'' relation is
-\begin{equation}
-\label{eq:omega}
-\{\, \vec i \to \vec j \mid \exists \vec \alpha, k :
-k \ge 1 \wedge
-k \, \vec L \le \vec j - \vec i \le k \, \vec U
-\wedge
-(\forall p : j_p - i_p = M_p \alpha_p)
-\,\}
-.
-\end{equation}
-The domain and range of this transitive closure are then
-intersected with those of the input relation.
-This is a special case of the algorithm in \autoref{s:power}.
-
-In their algorithm for computing lower bounds, the authors
-use the above algorithm as a substep on the disjuncts in the relation.
-At the end, they say
-\begin{quote}
-If an upper bound is required, it can be calculated in a manner
-similar to that of a single conjunct [sic] relation.
-\end{quote}
-Presumably, the authors mean that a ``d-form'' approximation
-of the whole input relation should be used.
-However, the accuracy can be improved by also trying to
-apply the incremental technique from the same paper,
-which is explained in more detail in \autoref{s:incremental}.
-In this case, ${\cal C}(R_i,D)$ can be obtained by
-allowing the value zero for $k$ in \eqref{eq:omega},
-i.e., by computing
-$$
-\{\, \vec i \to \vec j \mid \exists \vec \alpha, k :
-k \ge 0 \wedge
-k \, \vec L \le \vec j - \vec i \le k \, \vec U
-\wedge
-(\forall p : j_p - i_p = M_p \alpha_p)
-\,\}
-.
-$$
-In our implementation we take as $D$ the simple hull
-(\autoref{s:simple hull}) of $\domain R \cup \range R$.
-To determine whether it is safe to use ${\cal C}(R_i,D)$,
-we check the following conditions, as proposed by
-\shortciteN{Kelly1996closure}:
-${\cal C}(R_i,D) - R_i^+$ is not a union and for each $j \ne i$
-the condition
-$$
-\left({\cal C}(R_i,D) - R_i^+\right)
-\circ
-R_j
-\circ
-\left({\cal C}(R_i,D) - R_i^+\right)
-=
-R_j
-$$
-holds.
diff --git a/cloog-0.16.3/isl/doc/isl.bib b/cloog-0.16.3/isl/doc/isl.bib
deleted file mode 100644
index cfe8081..0000000
--- a/cloog-0.16.3/isl/doc/isl.bib
+++ /dev/null
@@ -1,313 +0,0 @@
-@inproceedings{Kelly1996closure,
-  author    = {Wayne Kelly and
-               William Pugh and
-               Evan Rosser and
-               Tatiana Shpeisman},
-  title     = {Transitive Closure of Infinite Graphs and Its Applications},
-  pages     = {126-140},
-  editor    = {Chua-Huang Huang and
-               P. Sadayappan and
-               Utpal Banerjee and
-               David Gelernter and
-               Alexandru Nicolau and
-               David A. Padua},
-  booktitle = {Languages and Compilers for Parallel Computing, 8th International
-               Workshop, LCPC'95, Columbus, Ohio, USA, August 10-12, 1995,
-               Proceedings},
-  publisher = {Springer},
-  series    = {Lecture Notes in Computer Science},
-  volume    = {1033},
-  year      = {1996},
-  isbn      = {3-540-60765-X},
-}
-
-@inproceedings{Beletska2009,
-  author = {Beletska, Anna and Barthou, Denis and Bielecki, Wlodzimierz and Cohen, Albert},
-  title = {Computing the Transitive Closure of a Union of Affine Integer Tuple Relations},
-  booktitle = {COCOA '09: Proceedings of the 3rd International Conference on Combinatorial Optimization and Applications},
-  year = {2009},
-  isbn = {978-3-642-02025-4},
-  pages = {98--109},
-  location = {Huangshan, China},
-  doi = {10.1007/978-3-642-02026-1_9},
-  publisher = {Springer-Verlag},
-  address = {Berlin, Heidelberg},
-}
-
-@book{Schrijver1986,
-    author  =	"Schrijver, Alexander",
-    title   =	"Theory of Linear and Integer Programming",
-    publisher	=   "John Wiley \& Sons",
-    year    =	1986
-}
-
-@article{Tarjan1972,
-    author = {Tarjan, Robert},
-    journal = {SIAM Journal on Computing},
-    number = {2},
-    pages = {146--160},
-    publisher = {SIAM},
-    title = {Depth-First Search and Linear Graph Algorithms},
-    volume = {1},
-    year = {1972}
-}
-
-@TechReport{ Omega_calc,
-    author = "Wayne Kelly and Vadim Maslov and William Pugh and Evan Rosser and Tatiana Shpeisman and Dave Wonnacott",
-    title = "The {Omega} Calculator and Library",
-    month = nov,
-    institution = "University of Maryland",
-    year = 1996
-}
-
-@TechReport{ Omega_lib,
-    author = "Wayne Kelly and Vadim Maslov and William Pugh and Evan Rosser and Tatiana Shpeisman and Dave Wonnacott",
-    title = "The {Omega} Library",
-    month = nov,
-    institution = "University of Maryland",
-    year = 1996
-}
-
-@unpublished{Verdoolaege2009isl,
-  author = "Verdoolaege, Sven",
-  title = "An integer set library for program analysis",
-  note = "Advances in the Theory of Integer Linear Optimization and its Extensions,AMS 2009 Spring Western Section Meeting, San Francisco, California, 25-26 April 2009",
-  month = Apr,
-  year = "2009",
-  url = "https://lirias.kuleuven.be/handle/123456789/228373",
-}
-
-@article{Barthou2000MSE,
-  author = {Barthou, Denis and Cohen, Albert and Collard, Jean-Fran\c{c}ois},
-  title = {Maximal Static Expansion},
-  journal = {Int. J. Parallel Program.},
-  volume = {28},
-  number = {3},
-  year = {2000},
-  issn = {0885-7458},
-  pages = {213--243},
-  doi = {10.1023/A:1007500431910},
-  publisher = {Kluwer Academic Publishers},
-  address = {Norwell, MA, USA},
-}
-
-@article{ Feautrier88parametric,
-    author = "P. Feautrier",
-    title = "Parametric Integer Programming",
-    journal = "RAIRO Recherche Op\'erationnelle",
-    volume = "22",
-    number = "3",
-    pages = "243--268",
-    year = "1988",
-}
-
-@Article{ Fea91,
-  author =       {Feautrier, P.},
-  title =        {Dataflow analysis of array and scalar references},
-  journal =      {International Journal of Parallel Programming},
-  year =         {1991},
-  OPTkey =         {},
-  volume =       {20},
-  number =       {1},
-  OPTmonth =     {},
-  pages =        {23--53},
-  OPTnote =      {},
-  OPTannote =    {},
-}
-
-@INPROCEEDINGS{BouletRe98,
-  AUTHOR = {Pierre Boulet and Xavier Redon},
-  TITLE = {Communication Pre-evaluation in {HPF}},
-  BOOKTITLE = {EUROPAR'98},
-  PAGES = {263--272},
-  YEAR = 1998,
-  VOLUME = 1470,
-  series =	 {Lecture Notes in Computer Science},
-  PUBLISHER = {Springer-Verlag, Berlin},
-  ABSTRACT = {  Parallel computers are difficult to program efficiently.  We believe
-  that a good way to help programmers write efficient programs is to
-  provide them with tools that show them how their programs behave on
-  a parallel computer.  Data distribution is the major performance
-  factor of data-parallel programs and so automatic data layout for
-  HPF programs has been studied by many researchers recently.  The
-  communication volume induced by a data distribution is a good
-  estimator of the efficiency of this data distribution.
-
-  We present here a symbolic method to compute the communication
-  volume generated by a given data distribution during the program
-  writing phase (before compilation). We stay machine-independent to
-  assure portability.  Our goal is to help the programmer understand
-  the data movements its program generates and thus find a good data
-  distribution. Our method is based on parametric polyhedral
-  computations. It can be applied to a large class of regular codes.},
-}
-
-@INPROCEEDINGS {Verdoolaege2005experiences,
-  AUTHOR = "Verdoolaege, Sven and Beyls, Kristof and Bruynooghe, Maurice and Catthoor, Francky",
-  TITLE = {{E}xperiences with enumeration of integer projections of parametric polytopes},
-  BOOKTITLE = {{P}roceedings of 14th {I}nternational {C}onference on {C}ompiler {C}onstruction, {E}dinburgh, {S}cotland},
-  YEAR = {2005},
-  EDITOR = {Bodik, R.},
-  VOLUME = 3443,
-    pages = "91-105",
-    series = "Lecture Notes in Computer Science",
-    publisher = "Springer-Verlag",
-    address = "Berlin",
-    doi = "10.1007/b107108",
-}
-
-@article{Detlefs2005simplify,
- author = {David Detlefs and Greg Nelson and James B. Saxe},
- title = {Simplify: a theorem prover for program checking},
- journal = {J. ACM},
- volume = {52},
- number = {3},
- year = {2005},
- issn = {0004-5411},
- pages = {365--473},
- doi = {10.1145/1066100.1066102},
- publisher = {ACM},
- address = {New York, NY, USA},
- }
-
-@phdthesis{Nelson1980phd,
- author = {Charles Gregory Nelson},
- title = {Techniques for program verification},
- year = {1980},
- order_no = {AAI8011683},
- school = {Stanford University},
- address = {Stanford, CA, USA},
- }
-
-@article{Woods2003short,
-    year = 2003,
-    Journal = "J. Amer. Math. Soc.",
-    volume =  16,
-    pages = "957--979",
-    month = apr,
-    title = {{Short rational generating functions for lattice point
-        problems}},
-    author = {Alexander Barvinok and Kevin Woods},
-}
-
-@misc{barvinok-0.22,
-  author = {Sven Verdoolaege},
-  title = {{\texttt{barvinok}}, version 0.22},
-  howpublished = {Available from \url{http://freshmeat.net/projects/barvinok/}},
-  year = 2006
-}
-
-@inproceedings{DeLoera2004Three,
-    title = "Three Kinds of Integer Programming Algorithms based on Barvinok's Rational Functions",
-    author = "De Loera, J. A. and D. Haws and R. Hemmecke and P. Huggins and R. Yoshida",
-    booktitle = "Integer Programming and Combinatorial Optimization: 10th International IPCO Conference",
-    year = "2004",
-    month = jan,
-    series = "Lecture Notes in Computer Science",
-    Volume = 3064,
-    Pages = "244-255",
-}
-
-@TechReport{Feautrier02,
-  author = 	 {P. Feautrier and J. Collard and C. Bastoul},
-  title = 	 {Solving systems of affine (in)equalities},
-  institution =  {PRiSM, Versailles University},
-  year = 	 2002
-}
-
-@article{ Feautrier92multi,
-    author = "Paul Feautrier",
-    title = "Some Efficient Solutions to the Affine Scheduling Problem. {P}art {II}. Multidimensional Time",
-    journal = "International Journal of Parallel Programming",
-    volume = "21",
-    number = "6",
-    pages = "389--420",
-    year = "1992",
-    month = dec,
-    url = "citeseer.nj.nec.com/article/feautrier92some.html",
-}
-
-@misc{Bygde2010licentiate,
-   author = {Stefan Bygde},
-   title = {Static {WCET} Analysis based on Abstract Interpretation and Counting of Elements},
-   month = {March},
-   year = {2010},
-   howpublished = {Licentiate thesis},
-   publisher = {M{\"{a}}lardalen University Press},
-   url = {http://www.mrtc.mdh.se/index.php?choice=publications&id=2144},
-}
-
-@phdthesis{Meister2004PhD,
-	title = {Stating and Manipulating Periodicity in the Polytope Model. Applications to Program Analysis and Optimization},
-	author= {Beno\^it Meister},
- 	school = {Universit\'e Louis Pasteur},
-	month = Dec,
-	year  = {2004},
-}
-
-@inproceedings{Meister2008,
-  author = {Beno\^it Meister and Sven Verdoolaege},
-  title = {Polynomial Approximations in the Polytope Model: Bringing the Power
-  of Quasi-Polynomials to the Masses},
-  year = {2008},
-  booktitle = {Digest of the 6th Workshop on Optimization for DSP and Embedded Systems, ODES-6},
-  editor = "Jagadeesh Sankaran and Vander Aa, Tom",
-  month = apr,
-}
-
-@misc{Galea2009personal,
-    author = "Fran\c{c}ois Galea",
-    title = "personal communication",
-    year = 2009,
-    month = nov,
-}
-
-@misc{PPL,
-  author = "R. Bagnara and P. M. Hill and E. Zaffanella",
-  title = "The {Parma Polyhedra Library}",
-  howpublished = {\url{http://www.cs.unipr.it/ppl/}},
-}
-
-@TECHREPORT{Cook1991implementation,
-AUTHOR={William Cook and Thomas Rutherford and Herbert E. Scarf and David F. Shallcross},
-TITLE={An Implementation of the Generalized Basis Reduction Algorithm for Integer Programming},
-YEAR=1991,
-MONTH=Aug,
-INSTITUTION={Cowles Foundation, Yale University},
-TYPE={Cowles Foundation Discussion Papers},
-NOTE={available at \url{http://ideas.repec.org/p/cwl/cwldpp/990.html}},
-NUMBER={990},
-}
-
- @article{Karr1976affine,
-author={ Michael Karr},
-title={ Affine Relationships Among Variables of a Program },
-journal={Acta Informatica},
-Volume={6},
-pages={133-151},
-year={1976},
-publisher={Springer-Verlag},
-ignore={ },
-}
-
-@PhdThesis{Verhaegh1995PhD,
-	title = "Multidimensional Periodic Scheduling",
-	author = "Wim F. J. Verhaegh",
-	school = "Technische Universiteit Eindhoven",
-	year = 1995,
-}
-
-@INPROCEEDINGS{Seghir2006minimizing,
-  AUTHOR = "Rachid Seghir and Vincent Loechner",
-  TITLE = {Memory Optimization by Counting Points in Integer Transformations of Parametric Polytopes},
-  BOOKTITLE = {{P}roceedings of the {I}nternational {C}onference on {C}ompilers, {A}rchitectures, and {S}ynthesis for {E}mbedded Systems, CASES 2006, {S}eoul, {K}orea},
-  month = oct,
-  YEAR = {2006}
-}
-
-@misc{DeSmet2010personal,
-    author = "De Smet, Sven",
-    title = "personal communication",
-    year = 2010,
-    month = apr,
-}
diff --git a/cloog-0.16.3/isl/doc/manual.pdf b/cloog-0.16.3/isl/doc/manual.pdf
deleted file mode 100644
index 89a2a0a..0000000
--- a/cloog-0.16.3/isl/doc/manual.pdf
+++ /dev/null
Binary files differ
diff --git a/cloog-0.16.3/isl/doc/manual.tex b/cloog-0.16.3/isl/doc/manual.tex
deleted file mode 100644
index 91b3db0..0000000
--- a/cloog-0.16.3/isl/doc/manual.tex
+++ /dev/null
@@ -1,75 +0,0 @@
-\documentclass{report}
-\usepackage[plainpages=false,pdfpagelabels,breaklinks,pagebackref]{hyperref}
-\usepackage{amsmath}
-\usepackage{amssymb}
-\usepackage{txfonts}
-\usepackage{chicago}
-\usepackage{aliascnt}
-\usepackage{tikz}
-\usepackage{calc}
-\usepackage[ruled]{algorithm2e}
-\usetikzlibrary{matrix,fit,backgrounds,decorations.pathmorphing,positioning}
-\usepackage{listings}
-
-\lstset{basicstyle=\tt,flexiblecolumns=false}
-
-\def\vec#1{\mathchoice{\mbox{\boldmath$\displaystyle\bf#1$}}
-{\mbox{\boldmath$\textstyle\bf#1$}}
-{\mbox{\boldmath$\scriptstyle\bf#1$}}
-{\mbox{\boldmath$\scriptscriptstyle\bf#1$}}}
-
-\providecommand{\fract}[1]{\left\{#1\right\}}
-\providecommand{\floor}[1]{\left\lfloor#1\right\rfloor}
-\providecommand{\ceil}[1]{\left\lceil#1\right\rceil}
-\def\sp#1#2{\langle #1, #2 \rangle}
-\def\spv#1#2{\langle\vec #1,\vec #2\rangle}
-
-\newtheorem{theorem}{Theorem}
-\newaliascnt{example}{theorem}
-\newtheorem{example}[example]{Example}
-\newaliascnt{def}{theorem}
-\newtheorem{definition}[def]{Definition}
-\aliascntresetthe{example}
-\aliascntresetthe{def}
-\numberwithin{theorem}{section}
-\numberwithin{def}{section}
-\numberwithin{example}{section}
-
-\newcommand{\algocflineautorefname}{Algorithm}
-\newcommand{\exampleautorefname}{Example}
-\newcommand{\lstnumberautorefname}{Line}
-\renewcommand{\sectionautorefname}{Section}
-\renewcommand{\subsectionautorefname}{Section}
-
-\def\Z{\mathbb{Z}}
-\def\Q{\mathbb{Q}}
-
-\def\pdom{\mathop{\rm pdom}\nolimits}
-\def\domain{\mathop{\rm dom}\nolimits}
-\def\range{\mathop{\rm ran}\nolimits}
-\def\identity{\mathop{\rm Id}\nolimits}
-\def\diff{\mathop{\Delta}\nolimits}
-
-\providecommand{\floor}[1]{\left\lfloor#1\right\rfloor}
-
-\begin{document}
-
-\title{Integer Set Library: Manual\\
-\small Version: \input{version} }
-\author{Sven Verdoolaege}
-
-\maketitle
-\tableofcontents
-
-\chapter{User Manual}
-
-\input{user}
-
-\chapter{Implementation Details}
-
-\input{implementation}
-
-\bibliography{isl}
-\bibliographystyle{chicago}
-
-\end{document}
diff --git a/cloog-0.16.3/isl/doc/mypod2latex b/cloog-0.16.3/isl/doc/mypod2latex
deleted file mode 100755
index b11c059..0000000
--- a/cloog-0.16.3/isl/doc/mypod2latex
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use Pod::LaTeX;
-
-my ($in, $out) = @ARGV;
-
-my $parser = new Pod::LaTeX(
-		AddPreamble => 0,
-		AddPostamble => 0,
-		LevelNoNum => 5,
-	     );
-
-$parser->parse_from_file($in, $out);
diff --git a/cloog-0.16.3/isl/doc/user.pod b/cloog-0.16.3/isl/doc/user.pod
deleted file mode 100644
index 76799c1..0000000
--- a/cloog-0.16.3/isl/doc/user.pod
+++ /dev/null
@@ -1,3376 +0,0 @@
-=head1 Introduction
-
-C<isl> is a thread-safe C library for manipulating
-sets and relations of integer points bounded by affine constraints.
-The descriptions of the sets and relations may involve
-both parameters and existentially quantified variables.
-All computations are performed in exact integer arithmetic
-using C<GMP>.
-The C<isl> library offers functionality that is similar
-to that offered by the C<Omega> and C<Omega+> libraries,
-but the underlying algorithms are in most cases completely different.
-
-The library is by no means complete and some fairly basic
-functionality is still missing.
-Still, even in its current form, the library has been successfully
-used as a backend polyhedral library for the polyhedral
-scanner C<CLooG> and as part of an equivalence checker of
-static affine programs.
-For bug reports, feature requests and questions,
-visit the the discussion group at
-L<http://groups.google.com/group/isl-development>.
-
-=head2 Backward Incompatible Changes
-
-=head3 Changes since isl-0.02
-
-=over
-
-=item * The old printing functions have been deprecated
-and replaced by C<isl_printer> functions, see L<Input and Output>.
-
-=item * Most functions related to dependence analysis have acquired
-an extra C<must> argument.  To obtain the old behavior, this argument
-should be given the value 1.  See L<Dependence Analysis>.
-
-=back
-
-=head3 Changes since isl-0.03
-
-=over
-
-=item * The function C<isl_pw_qpolynomial_fold_add> has been
-renamed to C<isl_pw_qpolynomial_fold_fold>.
-Similarly, C<isl_union_pw_qpolynomial_fold_add> has been
-renamed to C<isl_union_pw_qpolynomial_fold_fold>.
-
-=back
-
-=head3 Changes since isl-0.04
-
-=over
-
-=item * All header files have been renamed from C<isl_header.h>
-to C<isl/header.h>.
-
-=back
-
-=head3 Changes since isl-0.05
-
-=over
-
-=item * The functions C<isl_printer_print_basic_set> and
-C<isl_printer_print_basic_map> no longer print a newline.
-
-=item * The functions C<isl_flow_get_no_source>
-and C<isl_union_map_compute_flow> now return
-the accesses for which no source could be found instead of
-the iterations where those accesses occur.
-
-=item * The functions C<isl_basic_map_identity> and
-C<isl_map_identity> now take the dimension specification
-of a B<map> as input.  An old call
-C<isl_map_identity(dim)> can be rewritten to
-C<isl_map_identity(isl_dim_map_from_set(dim))>.
-
-=item * The function C<isl_map_power> no longer takes
-a parameter position as input.  Instead, the exponent
-is now expressed as the domain of the resulting relation.
-
-=back
-
-=head3 Changes since isl-0.06
-
-=over
-
-=item * The format of C<isl_printer_print_qpolynomial>'s
-C<ISL_FORMAT_ISL> output has changed.
-Use C<ISL_FORMAT_C> to obtain the old output.
-
-=item * The C<*_fast_*> functions have been renamed to C<*_plain_*>.
-Some of the old names have been kept for backward compatibility,
-but they will be removed in the future.
-
-=back
-
-=head1 Installation
-
-The source of C<isl> can be obtained either as a tarball
-or from the git repository.  Both are available from
-L<http://freshmeat.net/projects/isl/>.
-The installation process depends on how you obtained
-the source.
-
-=head2 Installation from the git repository
-
-=over
-
-=item 1 Clone or update the repository
-
-The first time the source is obtained, you need to clone
-the repository.
-
-	git clone git://repo.or.cz/isl.git
-
-To obtain updates, you need to pull in the latest changes
-
-	git pull
-
-=item 2 Generate C<configure>
-
-	./autogen.sh
-
-=back
-
-After performing the above steps, continue
-with the L<Common installation instructions>.
-
-=head2 Common installation instructions
-
-=over
-
-=item 1 Obtain C<GMP>
-
-Building C<isl> requires C<GMP>, including its headers files.
-Your distribution may not provide these header files by default
-and you may need to install a package called C<gmp-devel> or something
-similar.  Alternatively, C<GMP> can be built from
-source, available from L<http://gmplib.org/>.
-
-=item 2 Configure
-
-C<isl> uses the standard C<autoconf> C<configure> script.
-To run it, just type
-
-	./configure
-
-optionally followed by some configure options.
-A complete list of options can be obtained by running
-
-	./configure --help
-
-Below we discuss some of the more common options.
-
-C<isl> can optionally use C<piplib>, but no
-C<piplib> functionality is currently used by default.
-The C<--with-piplib> option can
-be used to specify which C<piplib>
-library to use, either an installed version (C<system>),
-an externally built version (C<build>)
-or no version (C<no>).  The option C<build> is mostly useful
-in C<configure> scripts of larger projects that bundle both C<isl>
-and C<piplib>.
-
-=over
-
-=item C<--prefix>
-
-Installation prefix for C<isl>
-
-=item C<--with-gmp-prefix>
-
-Installation prefix for C<GMP> (architecture-independent files).
-
-=item C<--with-gmp-exec-prefix>
-
-Installation prefix for C<GMP> (architecture-dependent files).
-
-=item C<--with-piplib>
-
-Which copy of C<piplib> to use, either C<no> (default), C<system> or C<build>.
-
-=item C<--with-piplib-prefix>
-
-Installation prefix for C<system> C<piplib> (architecture-independent files).
-
-=item C<--with-piplib-exec-prefix>
-
-Installation prefix for C<system> C<piplib> (architecture-dependent files).
-
-=item C<--with-piplib-builddir>
-
-Location where C<build> C<piplib> was built.
-
-=back
-
-=item 3 Compile
-
-	make
-
-=item 4 Install (optional)
-
-	make install
-
-=back
-
-=head1 Library
-
-=head2 Initialization
-
-All manipulations of integer sets and relations occur within
-the context of an C<isl_ctx>.
-A given C<isl_ctx> can only be used within a single thread.
-All arguments of a function are required to have been allocated
-within the same context.
-There are currently no functions available for moving an object
-from one C<isl_ctx> to another C<isl_ctx>.  This means that
-there is currently no way of safely moving an object from one
-thread to another, unless the whole C<isl_ctx> is moved.
-
-An C<isl_ctx> can be allocated using C<isl_ctx_alloc> and
-freed using C<isl_ctx_free>.
-All objects allocated within an C<isl_ctx> should be freed
-before the C<isl_ctx> itself is freed.
-
-	isl_ctx *isl_ctx_alloc();
-	void isl_ctx_free(isl_ctx *ctx);
-
-=head2 Integers
-
-All operations on integers, mainly the coefficients
-of the constraints describing the sets and relations,
-are performed in exact integer arithmetic using C<GMP>.
-However, to allow future versions of C<isl> to optionally
-support fixed integer arithmetic, all calls to C<GMP>
-are wrapped inside C<isl> specific macros.
-The basic type is C<isl_int> and the operations below
-are available on this type.
-The meanings of these operations are essentially the same
-as their C<GMP> C<mpz_> counterparts.
-As always with C<GMP> types, C<isl_int>s need to be
-initialized with C<isl_int_init> before they can be used
-and they need to be released with C<isl_int_clear>
-after the last use.
-The user should not assume that an C<isl_int> is represented
-as a C<mpz_t>, but should instead explicitly convert between
-C<mpz_t>s and C<isl_int>s using C<isl_int_set_gmp> and
-C<isl_int_get_gmp> whenever a C<mpz_t> is required.
-
-=over
-
-=item isl_int_init(i)
-
-=item isl_int_clear(i)
-
-=item isl_int_set(r,i)
-
-=item isl_int_set_si(r,i)
-
-=item isl_int_set_gmp(r,g)
-
-=item isl_int_get_gmp(i,g)
-
-=item isl_int_abs(r,i)
-
-=item isl_int_neg(r,i)
-
-=item isl_int_swap(i,j)
-
-=item isl_int_swap_or_set(i,j)
-
-=item isl_int_add_ui(r,i,j)
-
-=item isl_int_sub_ui(r,i,j)
-
-=item isl_int_add(r,i,j)
-
-=item isl_int_sub(r,i,j)
-
-=item isl_int_mul(r,i,j)
-
-=item isl_int_mul_ui(r,i,j)
-
-=item isl_int_addmul(r,i,j)
-
-=item isl_int_submul(r,i,j)
-
-=item isl_int_gcd(r,i,j)
-
-=item isl_int_lcm(r,i,j)
-
-=item isl_int_divexact(r,i,j)
-
-=item isl_int_cdiv_q(r,i,j)
-
-=item isl_int_fdiv_q(r,i,j)
-
-=item isl_int_fdiv_r(r,i,j)
-
-=item isl_int_fdiv_q_ui(r,i,j)
-
-=item isl_int_read(r,s)
-
-=item isl_int_print(out,i,width)
-
-=item isl_int_sgn(i)
-
-=item isl_int_cmp(i,j)
-
-=item isl_int_cmp_si(i,si)
-
-=item isl_int_eq(i,j)
-
-=item isl_int_ne(i,j)
-
-=item isl_int_lt(i,j)
-
-=item isl_int_le(i,j)
-
-=item isl_int_gt(i,j)
-
-=item isl_int_ge(i,j)
-
-=item isl_int_abs_eq(i,j)
-
-=item isl_int_abs_ne(i,j)
-
-=item isl_int_abs_lt(i,j)
-
-=item isl_int_abs_gt(i,j)
-
-=item isl_int_abs_ge(i,j)
-
-=item isl_int_is_zero(i)
-
-=item isl_int_is_one(i)
-
-=item isl_int_is_negone(i)
-
-=item isl_int_is_pos(i)
-
-=item isl_int_is_neg(i)
-
-=item isl_int_is_nonpos(i)
-
-=item isl_int_is_nonneg(i)
-
-=item isl_int_is_divisible_by(i,j)
-
-=back
-
-=head2 Sets and Relations
-
-C<isl> uses six types of objects for representing sets and relations,
-C<isl_basic_set>, C<isl_basic_map>, C<isl_set>, C<isl_map>,
-C<isl_union_set> and C<isl_union_map>.
-C<isl_basic_set> and C<isl_basic_map> represent sets and relations that
-can be described as a conjunction of affine constraints, while
-C<isl_set> and C<isl_map> represent unions of
-C<isl_basic_set>s and C<isl_basic_map>s, respectively.
-However, all C<isl_basic_set>s or C<isl_basic_map>s in the union need
-to have the same dimension.  C<isl_union_set>s and C<isl_union_map>s
-represent unions of C<isl_set>s or C<isl_map>s of I<different> dimensions,
-where dimensions with different space names
-(see L<Dimension Specifications>) are considered different as well.
-The difference between sets and relations (maps) is that sets have
-one set of variables, while relations have two sets of variables,
-input variables and output variables.
-
-=head2 Memory Management
-
-Since a high-level operation on sets and/or relations usually involves
-several substeps and since the user is usually not interested in
-the intermediate results, most functions that return a new object
-will also release all the objects passed as arguments.
-If the user still wants to use one or more of these arguments
-after the function call, she should pass along a copy of the
-object rather than the object itself.
-The user is then responsible for making sure that the original
-object gets used somewhere else or is explicitly freed.
-
-The arguments and return values of all documents functions are
-annotated to make clear which arguments are released and which
-arguments are preserved.  In particular, the following annotations
-are used
-
-=over
-
-=item C<__isl_give>
-
-C<__isl_give> means that a new object is returned.
-The user should make sure that the returned pointer is
-used exactly once as a value for an C<__isl_take> argument.
-In between, it can be used as a value for as many
-C<__isl_keep> arguments as the user likes.
-There is one exception, and that is the case where the
-pointer returned is C<NULL>.  Is this case, the user
-is free to use it as an C<__isl_take> argument or not.
-
-=item C<__isl_take>
-
-C<__isl_take> means that the object the argument points to
-is taken over by the function and may no longer be used
-by the user as an argument to any other function.
-The pointer value must be one returned by a function
-returning an C<__isl_give> pointer.
-If the user passes in a C<NULL> value, then this will
-be treated as an error in the sense that the function will
-not perform its usual operation.  However, it will still
-make sure that all the the other C<__isl_take> arguments
-are released.
-
-=item C<__isl_keep>
-
-C<__isl_keep> means that the function will only use the object
-temporarily.  After the function has finished, the user
-can still use it as an argument to other functions.
-A C<NULL> value will be treated in the same way as
-a C<NULL> value for an C<__isl_take> argument.
-
-=back
-
-=head2 Dimension Specifications
-
-Whenever a new set or relation is created from scratch,
-its dimension needs to be specified using an C<isl_dim>.
-
-	#include <isl/dim.h>
-	__isl_give isl_dim *isl_dim_alloc(isl_ctx *ctx,
-		unsigned nparam, unsigned n_in, unsigned n_out);
-	__isl_give isl_dim *isl_dim_set_alloc(isl_ctx *ctx,
-		unsigned nparam, unsigned dim);
-	__isl_give isl_dim *isl_dim_copy(__isl_keep isl_dim *dim);
-	void isl_dim_free(__isl_take isl_dim *dim);
-	unsigned isl_dim_size(__isl_keep isl_dim *dim,
-		enum isl_dim_type type);
-
-The dimension specification used for creating a set
-needs to be created using C<isl_dim_set_alloc>, while
-that for creating a relation
-needs to be created using C<isl_dim_alloc>.
-C<isl_dim_size> can be used
-to find out the number of dimensions of each type in
-a dimension specification, where type may be
-C<isl_dim_param>, C<isl_dim_in> (only for relations),
-C<isl_dim_out> (only for relations), C<isl_dim_set>
-(only for sets) or C<isl_dim_all>.
-
-It is often useful to create objects that live in the
-same space as some other object.  This can be accomplished
-by creating the new objects
-(see L<Creating New Sets and Relations> or
-L<Creating New (Piecewise) Quasipolynomials>) based on the dimension
-specification of the original object.
-
-	#include <isl/set.h>
-	__isl_give isl_dim *isl_basic_set_get_dim(
-		__isl_keep isl_basic_set *bset);
-	__isl_give isl_dim *isl_set_get_dim(__isl_keep isl_set *set);
-
-	#include <isl/union_set.h>
-	__isl_give isl_dim *isl_union_set_get_dim(
-		__isl_keep isl_union_set *uset);
-
-	#include <isl/map.h>
-	__isl_give isl_dim *isl_basic_map_get_dim(
-		__isl_keep isl_basic_map *bmap);
-	__isl_give isl_dim *isl_map_get_dim(__isl_keep isl_map *map);
-
-	#include <isl/union_map.h>
-	__isl_give isl_dim *isl_union_map_get_dim(
-		__isl_keep isl_union_map *umap);
-
-	#include <isl/constraint.h>
-	__isl_give isl_dim *isl_constraint_get_dim(
-		__isl_keep isl_constraint *constraint);
-
-	#include <isl/polynomial.h>
-	__isl_give isl_dim *isl_qpolynomial_get_dim(
-		__isl_keep isl_qpolynomial *qp);
-	__isl_give isl_dim *isl_qpolynomial_fold_get_dim(
-		__isl_keep isl_qpolynomial_fold *fold);
-	__isl_give isl_dim *isl_pw_qpolynomial_get_dim(
-		__isl_keep isl_pw_qpolynomial *pwqp);
-	__isl_give isl_dim *isl_union_pw_qpolynomial_get_dim(
-		__isl_keep isl_union_pw_qpolynomial *upwqp);
-	__isl_give isl_dim *isl_union_pw_qpolynomial_fold_get_dim(
-		__isl_keep isl_union_pw_qpolynomial_fold *upwf);
-
-	#include <isl/aff.h>
-	__isl_give isl_dim *isl_aff_get_dim(
-		__isl_keep isl_aff *aff);
-	__isl_give isl_dim *isl_pw_aff_get_dim(
-		__isl_keep isl_pw_aff *pwaff);
-
-	#include <isl/point.h>
-	__isl_give isl_dim *isl_point_get_dim(
-		__isl_keep isl_point *pnt);
-
-The names of the individual dimensions may be set or read off
-using the following functions.
-
-	#include <isl/dim.h>
-	__isl_give isl_dim *isl_dim_set_name(__isl_take isl_dim *dim,
-				 enum isl_dim_type type, unsigned pos,
-				 __isl_keep const char *name);
-	__isl_keep const char *isl_dim_get_name(__isl_keep isl_dim *dim,
-				 enum isl_dim_type type, unsigned pos);
-
-Note that C<isl_dim_get_name> returns a pointer to some internal
-data structure, so the result can only be used while the
-corresponding C<isl_dim> is alive.
-Also note that every function that operates on two sets or relations
-requires that both arguments have the same parameters.  This also
-means that if one of the arguments has named parameters, then the
-other needs to have named parameters too and the names need to match.
-Pairs of C<isl_union_set> and/or C<isl_union_map> arguments may
-have different parameters (as long as they are named), in which case
-the result will have as parameters the union of the parameters of
-the arguments.
-
-The names of entire spaces may be set or read off
-using the following functions.
-
-	#include <isl/dim.h>
-	__isl_give isl_dim *isl_dim_set_tuple_name(
-		__isl_take isl_dim *dim,
-		enum isl_dim_type type, const char *s);
-	const char *isl_dim_get_tuple_name(__isl_keep isl_dim *dim,
-		enum isl_dim_type type);
-
-The C<dim> argument needs to be one of C<isl_dim_in>, C<isl_dim_out>
-or C<isl_dim_set>.  As with C<isl_dim_get_name>,
-the C<isl_dim_get_tuple_name> function returns a pointer to some internal
-data structure.
-Binary operations require the corresponding spaces of their arguments
-to have the same name.
-
-Spaces can be nested.  In particular, the domain of a set or
-the domain or range of a relation can be a nested relation.
-The following functions can be used to construct and deconstruct
-such nested dimension specifications.
-
-	#include <isl/dim.h>
-	int isl_dim_is_wrapping(__isl_keep isl_dim *dim);
-	__isl_give isl_dim *isl_dim_wrap(__isl_take isl_dim *dim);
-	__isl_give isl_dim *isl_dim_unwrap(__isl_take isl_dim *dim);
-
-The input to C<isl_dim_is_wrapping> and C<isl_dim_unwrap> should
-be the dimension specification of a set, while that of
-C<isl_dim_wrap> should be the dimension specification of a relation.
-Conversely, the output of C<isl_dim_unwrap> is the dimension specification
-of a relation, while that of C<isl_dim_wrap> is the dimension specification
-of a set.
-
-Dimension specifications can be created from other dimension
-specifications using the following functions.
-
-	__isl_give isl_dim *isl_dim_domain(__isl_take isl_dim *dim);
-	__isl_give isl_dim *isl_dim_from_domain(__isl_take isl_dim *dim);
-	__isl_give isl_dim *isl_dim_range(__isl_take isl_dim *dim);
-	__isl_give isl_dim *isl_dim_from_range(__isl_take isl_dim *dim);
-	__isl_give isl_dim *isl_dim_reverse(__isl_take isl_dim *dim);
-	__isl_give isl_dim *isl_dim_join(__isl_take isl_dim *left,
-		__isl_take isl_dim *right);
-	__isl_give isl_dim *isl_dim_align_params(
-		__isl_take isl_dim *dim1, __isl_take isl_dim *dim2)
-	__isl_give isl_dim *isl_dim_insert(__isl_take isl_dim *dim,
-		enum isl_dim_type type, unsigned pos, unsigned n);
-	__isl_give isl_dim *isl_dim_add(__isl_take isl_dim *dim,
-		enum isl_dim_type type, unsigned n);
-	__isl_give isl_dim *isl_dim_drop(__isl_take isl_dim *dim,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	__isl_give isl_dim *isl_dim_map_from_set(
-		__isl_take isl_dim *dim);
-	__isl_give isl_dim *isl_dim_zip(__isl_take isl_dim *dim);
-
-Note that if dimensions are added or removed from a space, then
-the name and the internal structure are lost.
-
-=head2 Local Spaces
-
-A local space is essentially a dimension specification with
-zero or more existentially quantified variables.
-The local space of a basic set or relation can be obtained
-using the following functions.
-
-	#include <isl/set.h>
-	__isl_give isl_local_space *isl_basic_set_get_local_space(
-		__isl_keep isl_basic_set *bset);
-
-	#include <isl/map.h>
-	__isl_give isl_local_space *isl_basic_map_get_local_space(
-		__isl_keep isl_basic_map *bmap);
-
-A new local space can be created from a dimension specification using
-
-	#include <isl/local_space.h>
-	__isl_give isl_local_space *isl_local_space_from_dim(
-		__isl_take isl_dim *dim);
-
-They can be inspected, copied and freed using the following functions.
-
-	#include <isl/local_space.h>
-	isl_ctx *isl_local_space_get_ctx(
-		__isl_keep isl_local_space *ls);
-	int isl_local_space_dim(__isl_keep isl_local_space *ls,
-		enum isl_dim_type type);
-	const char *isl_local_space_get_dim_name(
-		__isl_keep isl_local_space *ls,
-		enum isl_dim_type type, unsigned pos);
-	__isl_give isl_local_space *isl_local_space_set_dim_name(
-		__isl_take isl_local_space *ls,
-		enum isl_dim_type type, unsigned pos, const char *s);
-	__isl_give isl_dim *isl_local_space_get_dim(
-		__isl_keep isl_local_space *ls);
-	__isl_give isl_div *isl_local_space_get_div(
-		__isl_keep isl_local_space *ls, int pos);
-	__isl_give isl_local_space *isl_local_space_copy(
-		__isl_keep isl_local_space *ls);
-	void *isl_local_space_free(__isl_take isl_local_space *ls);
-
-Two local spaces can be compared using
-
-	int isl_local_space_is_equal(__isl_keep isl_local_space *ls1,
-		__isl_keep isl_local_space *ls2);
-
-Local spaces can be created from other local spaces
-using the following functions.
-
-	__isl_give isl_local_space *isl_local_space_from_domain(
-		__isl_take isl_local_space *ls);
-	__isl_give isl_local_space *isl_local_space_add_dims(
-		__isl_take isl_local_space *ls,
-		enum isl_dim_type type, unsigned n);
-	__isl_give isl_local_space *isl_local_space_insert_dims(
-		__isl_take isl_local_space *ls,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	__isl_give isl_local_space *isl_local_space_drop_dims(
-		__isl_take isl_local_space *ls,
-		enum isl_dim_type type, unsigned first, unsigned n);
-
-=head2 Input and Output
-
-C<isl> supports its own input/output format, which is similar
-to the C<Omega> format, but also supports the C<PolyLib> format
-in some cases.
-
-=head3 C<isl> format
-
-The C<isl> format is similar to that of C<Omega>, but has a different
-syntax for describing the parameters and allows for the definition
-of an existentially quantified variable as the integer division
-of an affine expression.
-For example, the set of integers C<i> between C<0> and C<n>
-such that C<i % 10 <= 6> can be described as
-
-	[n] -> { [i] : exists (a = [i/10] : 0 <= i and i <= n and
-				i - 10 a <= 6) }
-
-A set or relation can have several disjuncts, separated
-by the keyword C<or>.  Each disjunct is either a conjunction
-of constraints or a projection (C<exists>) of a conjunction
-of constraints.  The constraints are separated by the keyword
-C<and>.
-
-=head3 C<PolyLib> format
-
-If the represented set is a union, then the first line
-contains a single number representing the number of disjuncts.
-Otherwise, a line containing the number C<1> is optional.
-
-Each disjunct is represented by a matrix of constraints.
-The first line contains two numbers representing
-the number of rows and columns,
-where the number of rows is equal to the number of constraints
-and the number of columns is equal to two plus the number of variables.
-The following lines contain the actual rows of the constraint matrix.
-In each row, the first column indicates whether the constraint
-is an equality (C<0>) or inequality (C<1>).  The final column
-corresponds to the constant term.
-
-If the set is parametric, then the coefficients of the parameters
-appear in the last columns before the constant column.
-The coefficients of any existentially quantified variables appear
-between those of the set variables and those of the parameters.
-
-=head3 Extended C<PolyLib> format
-
-The extended C<PolyLib> format is nearly identical to the
-C<PolyLib> format.  The only difference is that the line
-containing the number of rows and columns of a constraint matrix
-also contains four additional numbers:
-the number of output dimensions, the number of input dimensions,
-the number of local dimensions (i.e., the number of existentially
-quantified variables) and the number of parameters.
-For sets, the number of ``output'' dimensions is equal
-to the number of set dimensions, while the number of ``input''
-dimensions is zero.
-
-=head3 Input
-
-	#include <isl/set.h>
-	__isl_give isl_basic_set *isl_basic_set_read_from_file(
-		isl_ctx *ctx, FILE *input, int nparam);
-	__isl_give isl_basic_set *isl_basic_set_read_from_str(
-		isl_ctx *ctx, const char *str, int nparam);
-	__isl_give isl_set *isl_set_read_from_file(isl_ctx *ctx,
-		FILE *input, int nparam);
-	__isl_give isl_set *isl_set_read_from_str(isl_ctx *ctx,
-		const char *str, int nparam);
-
-	#include <isl/map.h>
-	__isl_give isl_basic_map *isl_basic_map_read_from_file(
-		isl_ctx *ctx, FILE *input, int nparam);
-	__isl_give isl_basic_map *isl_basic_map_read_from_str(
-		isl_ctx *ctx, const char *str, int nparam);
-	__isl_give isl_map *isl_map_read_from_file(
-		struct isl_ctx *ctx, FILE *input, int nparam);
-	__isl_give isl_map *isl_map_read_from_str(isl_ctx *ctx,
-		const char *str, int nparam);
-
-	#include <isl/union_set.h>
-	__isl_give isl_union_set *isl_union_set_read_from_file(
-		isl_ctx *ctx, FILE *input);
-	__isl_give isl_union_set *isl_union_set_read_from_str(
-		struct isl_ctx *ctx, const char *str);
-
-	#include <isl/union_map.h>
-	__isl_give isl_union_map *isl_union_map_read_from_file(
-		isl_ctx *ctx, FILE *input);
-	__isl_give isl_union_map *isl_union_map_read_from_str(
-		struct isl_ctx *ctx, const char *str);
-
-The input format is autodetected and may be either the C<PolyLib> format
-or the C<isl> format.
-C<nparam> specifies how many of the final columns in
-the C<PolyLib> format correspond to parameters.
-If input is given in the C<isl> format, then the number
-of parameters needs to be equal to C<nparam>.
-If C<nparam> is negative, then any number of parameters
-is accepted in the C<isl> format and zero parameters
-are assumed in the C<PolyLib> format.
-
-=head3 Output
-
-Before anything can be printed, an C<isl_printer> needs to
-be created.
-
-	__isl_give isl_printer *isl_printer_to_file(isl_ctx *ctx,
-		FILE *file);
-	__isl_give isl_printer *isl_printer_to_str(isl_ctx *ctx);
-	void isl_printer_free(__isl_take isl_printer *printer);
-	__isl_give char *isl_printer_get_str(
-		__isl_keep isl_printer *printer);
-
-The behavior of the printer can be modified in various ways
-
-	__isl_give isl_printer *isl_printer_set_output_format(
-		__isl_take isl_printer *p, int output_format);
-	__isl_give isl_printer *isl_printer_set_indent(
-		__isl_take isl_printer *p, int indent);
-	__isl_give isl_printer *isl_printer_indent(
-		__isl_take isl_printer *p, int indent);
-	__isl_give isl_printer *isl_printer_set_prefix(
-		__isl_take isl_printer *p, const char *prefix);
-	__isl_give isl_printer *isl_printer_set_suffix(
-		__isl_take isl_printer *p, const char *suffix);
-
-The C<output_format> may be either C<ISL_FORMAT_ISL>, C<ISL_FORMAT_OMEGA>,
-C<ISL_FORMAT_POLYLIB>, C<ISL_FORMAT_EXT_POLYLIB> or C<ISL_FORMAT_LATEX>
-and defaults to C<ISL_FORMAT_ISL>.
-Each line in the output is indented by C<indent> (set by
-C<isl_printer_set_indent>) spaces
-(default: 0), prefixed by C<prefix> and suffixed by C<suffix>.
-In the C<PolyLib> format output,
-the coefficients of the existentially quantified variables
-appear between those of the set variables and those
-of the parameters.
-The function C<isl_printer_indent> increases the indentation
-by the specified amount (which may be negative).
-
-To actually print something, use
-
-	#include <isl/set.h>
-	__isl_give isl_printer *isl_printer_print_basic_set(
-		__isl_take isl_printer *printer,
-		__isl_keep isl_basic_set *bset);
-	__isl_give isl_printer *isl_printer_print_set(
-		__isl_take isl_printer *printer,
-		__isl_keep isl_set *set);
-
-	#include <isl/map.h>
-	__isl_give isl_printer *isl_printer_print_basic_map(
-		__isl_take isl_printer *printer,
-		__isl_keep isl_basic_map *bmap);
-	__isl_give isl_printer *isl_printer_print_map(
-		__isl_take isl_printer *printer,
-		__isl_keep isl_map *map);
-
-	#include <isl/union_set.h>
-	__isl_give isl_printer *isl_printer_print_union_set(
-		__isl_take isl_printer *p,
-		__isl_keep isl_union_set *uset);
-
-	#include <isl/union_map.h>
-	__isl_give isl_printer *isl_printer_print_union_map(
-		__isl_take isl_printer *p,
-		__isl_keep isl_union_map *umap);
-
-When called on a file printer, the following function flushes
-the file.  When called on a string printer, the buffer is cleared.
-
-	__isl_give isl_printer *isl_printer_flush(
-		__isl_take isl_printer *p);
-
-=head2 Creating New Sets and Relations
-
-C<isl> has functions for creating some standard sets and relations.
-
-=over
-
-=item * Empty sets and relations
-
-	__isl_give isl_basic_set *isl_basic_set_empty(
-		__isl_take isl_dim *dim);
-	__isl_give isl_basic_map *isl_basic_map_empty(
-		__isl_take isl_dim *dim);
-	__isl_give isl_set *isl_set_empty(
-		__isl_take isl_dim *dim);
-	__isl_give isl_map *isl_map_empty(
-		__isl_take isl_dim *dim);
-	__isl_give isl_union_set *isl_union_set_empty(
-		__isl_take isl_dim *dim);
-	__isl_give isl_union_map *isl_union_map_empty(
-		__isl_take isl_dim *dim);
-
-For C<isl_union_set>s and C<isl_union_map>s, the dimensions specification
-is only used to specify the parameters.
-
-=item * Universe sets and relations
-
-	__isl_give isl_basic_set *isl_basic_set_universe(
-		__isl_take isl_dim *dim);
-	__isl_give isl_basic_map *isl_basic_map_universe(
-		__isl_take isl_dim *dim);
-	__isl_give isl_set *isl_set_universe(
-		__isl_take isl_dim *dim);
-	__isl_give isl_map *isl_map_universe(
-		__isl_take isl_dim *dim);
-	__isl_give isl_union_set *isl_union_set_universe(
-		__isl_take isl_union_set *uset);
-	__isl_give isl_union_map *isl_union_map_universe(
-		__isl_take isl_union_map *umap);
-
-The sets and relations constructed by the functions above
-contain all integer values, while those constructed by the
-functions below only contain non-negative values.
-
-	__isl_give isl_basic_set *isl_basic_set_nat_universe(
-		__isl_take isl_dim *dim);
-	__isl_give isl_basic_map *isl_basic_map_nat_universe(
-		__isl_take isl_dim *dim);
-	__isl_give isl_set *isl_set_nat_universe(
-		__isl_take isl_dim *dim);
-	__isl_give isl_map *isl_map_nat_universe(
-		__isl_take isl_dim *dim);
-
-=item * Identity relations
-
-	__isl_give isl_basic_map *isl_basic_map_identity(
-		__isl_take isl_dim *dim);
-	__isl_give isl_map *isl_map_identity(
-		__isl_take isl_dim *dim);
-
-The number of input and output dimensions in C<dim> needs
-to be the same.
-
-=item * Lexicographic order
-
-	__isl_give isl_map *isl_map_lex_lt(
-		__isl_take isl_dim *set_dim);
-	__isl_give isl_map *isl_map_lex_le(
-		__isl_take isl_dim *set_dim);
-	__isl_give isl_map *isl_map_lex_gt(
-		__isl_take isl_dim *set_dim);
-	__isl_give isl_map *isl_map_lex_ge(
-		__isl_take isl_dim *set_dim);
-	__isl_give isl_map *isl_map_lex_lt_first(
-		__isl_take isl_dim *dim, unsigned n);
-	__isl_give isl_map *isl_map_lex_le_first(
-		__isl_take isl_dim *dim, unsigned n);
-	__isl_give isl_map *isl_map_lex_gt_first(
-		__isl_take isl_dim *dim, unsigned n);
-	__isl_give isl_map *isl_map_lex_ge_first(
-		__isl_take isl_dim *dim, unsigned n);
-
-The first four functions take a dimension specification for a B<set>
-and return relations that express that the elements in the domain
-are lexicographically less
-(C<isl_map_lex_lt>), less or equal (C<isl_map_lex_le>),
-greater (C<isl_map_lex_gt>) or greater or equal (C<isl_map_lex_ge>)
-than the elements in the range.
-The last four functions take a dimension specification for a map
-and return relations that express that the first C<n> dimensions
-in the domain are lexicographically less
-(C<isl_map_lex_lt_first>), less or equal (C<isl_map_lex_le_first>),
-greater (C<isl_map_lex_gt_first>) or greater or equal (C<isl_map_lex_ge_first>)
-than the first C<n> dimensions in the range.
-
-=back
-
-A basic set or relation can be converted to a set or relation
-using the following functions.
-
-	__isl_give isl_set *isl_set_from_basic_set(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_map *isl_map_from_basic_map(
-		__isl_take isl_basic_map *bmap);
-
-Sets and relations can be converted to union sets and relations
-using the following functions.
-
-	__isl_give isl_union_map *isl_union_map_from_map(
-		__isl_take isl_map *map);
-	__isl_give isl_union_set *isl_union_set_from_set(
-		__isl_take isl_set *set);
-
-The inverse conversions below can only be used if the input
-union set or relation is known to contain elements in exactly one
-space.
-
-	__isl_give isl_set *isl_set_from_union_set(
-		__isl_take isl_union_set *uset);
-	__isl_give isl_map *isl_map_from_union_map(
-		__isl_take isl_union_map *umap);
-
-Sets and relations can be copied and freed again using the following
-functions.
-
-	__isl_give isl_basic_set *isl_basic_set_copy(
-		__isl_keep isl_basic_set *bset);
-	__isl_give isl_set *isl_set_copy(__isl_keep isl_set *set);
-	__isl_give isl_union_set *isl_union_set_copy(
-		__isl_keep isl_union_set *uset);
-	__isl_give isl_basic_map *isl_basic_map_copy(
-		__isl_keep isl_basic_map *bmap);
-	__isl_give isl_map *isl_map_copy(__isl_keep isl_map *map);
-	__isl_give isl_union_map *isl_union_map_copy(
-		__isl_keep isl_union_map *umap);
-	void isl_basic_set_free(__isl_take isl_basic_set *bset);
-	void isl_set_free(__isl_take isl_set *set);
-	void *isl_union_set_free(__isl_take isl_union_set *uset);
-	void isl_basic_map_free(__isl_take isl_basic_map *bmap);
-	void isl_map_free(__isl_take isl_map *map);
-	void *isl_union_map_free(__isl_take isl_union_map *umap);
-
-Other sets and relations can be constructed by starting
-from a universe set or relation, adding equality and/or
-inequality constraints and then projecting out the
-existentially quantified variables, if any.
-Constraints can be constructed, manipulated and
-added to (or removed from) (basic) sets and relations
-using the following functions.
-
-	#include <isl/constraint.h>
-	__isl_give isl_constraint *isl_equality_alloc(
-		__isl_take isl_dim *dim);
-	__isl_give isl_constraint *isl_inequality_alloc(
-		__isl_take isl_dim *dim);
-	void isl_constraint_set_constant(
-		__isl_keep isl_constraint *constraint, isl_int v);
-	void isl_constraint_set_coefficient(
-		__isl_keep isl_constraint *constraint,
-		enum isl_dim_type type, int pos, isl_int v);
-	__isl_give isl_basic_map *isl_basic_map_add_constraint(
-		__isl_take isl_basic_map *bmap,
-		__isl_take isl_constraint *constraint);
-	__isl_give isl_basic_set *isl_basic_set_add_constraint(
-		__isl_take isl_basic_set *bset,
-		__isl_take isl_constraint *constraint);
-	__isl_give isl_map *isl_map_add_constraint(
-		__isl_take isl_map *map,
-		__isl_take isl_constraint *constraint);
-	__isl_give isl_set *isl_set_add_constraint(
-		__isl_take isl_set *set,
-		__isl_take isl_constraint *constraint);
-	__isl_give isl_basic_set *isl_basic_set_drop_constraint(
-		__isl_take isl_basic_set *bset,
-		__isl_take isl_constraint *constraint);
-
-For example, to create a set containing the even integers
-between 10 and 42, you would use the following code.
-
-	isl_int v;
-	struct isl_dim *dim;
-	struct isl_constraint *c;
-	struct isl_basic_set *bset;
-
-	isl_int_init(v);
-	dim = isl_dim_set_alloc(ctx, 0, 2);
-	bset = isl_basic_set_universe(isl_dim_copy(dim));
-
-	c = isl_equality_alloc(isl_dim_copy(dim));
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 2);
-	isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	c = isl_inequality_alloc(isl_dim_copy(dim));
-	isl_int_set_si(v, -10);
-	isl_constraint_set_constant(c, v);
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	c = isl_inequality_alloc(dim);
-	isl_int_set_si(v, 42);
-	isl_constraint_set_constant(c, v);
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 1, 1);
-
-	isl_int_clear(v);
-
-Or, alternatively,
-
-	struct isl_basic_set *bset;
-	bset = isl_basic_set_read_from_str(ctx,
-		"{[i] : exists (a : i = 2a and i >= 10 and i <= 42)}", -1);
-
-A basic set or relation can also be constructed from two matrices
-describing the equalities and the inequalities.
-
-	__isl_give isl_basic_set *isl_basic_set_from_constraint_matrices(
-		__isl_take isl_dim *dim,
-		__isl_take isl_mat *eq, __isl_take isl_mat *ineq,
-		enum isl_dim_type c1,
-		enum isl_dim_type c2, enum isl_dim_type c3,
-		enum isl_dim_type c4);
-	__isl_give isl_basic_map *isl_basic_map_from_constraint_matrices(
-		__isl_take isl_dim *dim,
-		__isl_take isl_mat *eq, __isl_take isl_mat *ineq,
-		enum isl_dim_type c1,
-		enum isl_dim_type c2, enum isl_dim_type c3,
-		enum isl_dim_type c4, enum isl_dim_type c5);
-
-The C<isl_dim_type> arguments indicate the order in which
-different kinds of variables appear in the input matrices
-and should be a permutation of C<isl_dim_cst>, C<isl_dim_param>,
-C<isl_dim_set> and C<isl_dim_div> for sets and
-of C<isl_dim_cst>, C<isl_dim_param>,
-C<isl_dim_in>, C<isl_dim_out> and C<isl_dim_div> for relations.
-
-A (basic) relation can also be constructed from a (piecewise) affine expression
-or a list of affine expressions (See L<"Piecewise Quasi Affine Expressions">).
-
-	__isl_give isl_basic_map *isl_basic_map_from_aff(
-		__isl_take isl_aff *aff);
-	__isl_give isl_map *isl_map_from_pw_aff(
-		__isl_take isl_pw_aff *pwaff);
-	__isl_give isl_basic_map *isl_basic_map_from_aff_list(
-		__isl_take isl_dim *domain_dim,
-		__isl_take isl_aff_list *list);
-
-The C<domain_dim> argument describes the domain of the resulting
-basic relation.  It is required because the C<list> may consist
-of zero affine expressions.
-
-=head2 Inspecting Sets and Relations
-
-Usually, the user should not have to care about the actual constraints
-of the sets and maps, but should instead apply the abstract operations
-explained in the following sections.
-Occasionally, however, it may be required to inspect the individual
-coefficients of the constraints.  This section explains how to do so.
-In these cases, it may also be useful to have C<isl> compute
-an explicit representation of the existentially quantified variables.
-
-	__isl_give isl_set *isl_set_compute_divs(
-		__isl_take isl_set *set);
-	__isl_give isl_map *isl_map_compute_divs(
-		__isl_take isl_map *map);
-	__isl_give isl_union_set *isl_union_set_compute_divs(
-		__isl_take isl_union_set *uset);
-	__isl_give isl_union_map *isl_union_map_compute_divs(
-		__isl_take isl_union_map *umap);
-
-This explicit representation defines the existentially quantified
-variables as integer divisions of the other variables, possibly
-including earlier existentially quantified variables.
-An explicitly represented existentially quantified variable therefore
-has a unique value when the values of the other variables are known.
-If, furthermore, the same existentials, i.e., existentials
-with the same explicit representations, should appear in the
-same order in each of the disjuncts of a set or map, then the user should call
-either of the following functions.
-
-	__isl_give isl_set *isl_set_align_divs(
-		__isl_take isl_set *set);
-	__isl_give isl_map *isl_map_align_divs(
-		__isl_take isl_map *map);
-
-Alternatively, the existentially quantified variables can be removed
-using the following functions, which compute an overapproximation.
-
-	__isl_give isl_basic_set *isl_basic_set_remove_divs(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_basic_map *isl_basic_map_remove_divs(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_set *isl_set_remove_divs(
-		__isl_take isl_set *set);
-	__isl_give isl_map *isl_map_remove_divs(
-		__isl_take isl_map *map);
-
-To iterate over all the sets or maps in a union set or map, use
-
-	int isl_union_set_foreach_set(__isl_keep isl_union_set *uset,
-		int (*fn)(__isl_take isl_set *set, void *user),
-		void *user);
-	int isl_union_map_foreach_map(__isl_keep isl_union_map *umap,
-		int (*fn)(__isl_take isl_map *map, void *user),
-		void *user);
-
-The number of sets or maps in a union set or map can be obtained
-from
-
-	int isl_union_set_n_set(__isl_keep isl_union_set *uset);
-	int isl_union_map_n_map(__isl_keep isl_union_map *umap);
-
-To extract the set or map from a union with a given dimension
-specification, use
-
-	__isl_give isl_set *isl_union_set_extract_set(
-		__isl_keep isl_union_set *uset,
-		__isl_take isl_dim *dim);
-	__isl_give isl_map *isl_union_map_extract_map(
-		__isl_keep isl_union_map *umap,
-		__isl_take isl_dim *dim);
-
-To iterate over all the basic sets or maps in a set or map, use
-
-	int isl_set_foreach_basic_set(__isl_keep isl_set *set,
-		int (*fn)(__isl_take isl_basic_set *bset, void *user),
-		void *user);
-	int isl_map_foreach_basic_map(__isl_keep isl_map *map,
-		int (*fn)(__isl_take isl_basic_map *bmap, void *user),
-		void *user);
-
-The callback function C<fn> should return 0 if successful and
--1 if an error occurs.  In the latter case, or if any other error
-occurs, the above functions will return -1.
-
-It should be noted that C<isl> does not guarantee that
-the basic sets or maps passed to C<fn> are disjoint.
-If this is required, then the user should call one of
-the following functions first.
-
-	__isl_give isl_set *isl_set_make_disjoint(
-		__isl_take isl_set *set);
-	__isl_give isl_map *isl_map_make_disjoint(
-		__isl_take isl_map *map);
-
-The number of basic sets in a set can be obtained
-from
-
-	int isl_set_n_basic_set(__isl_keep isl_set *set);
-
-To iterate over the constraints of a basic set or map, use
-
-	#include <isl/constraint.h>
-
-	int isl_basic_map_foreach_constraint(
-		__isl_keep isl_basic_map *bmap,
-		int (*fn)(__isl_take isl_constraint *c, void *user),
-		void *user);
-	void isl_constraint_free(struct isl_constraint *c);
-
-Again, the callback function C<fn> should return 0 if successful and
--1 if an error occurs.  In the latter case, or if any other error
-occurs, the above functions will return -1.
-The constraint C<c> represents either an equality or an inequality.
-Use the following function to find out whether a constraint
-represents an equality.  If not, it represents an inequality.
-
-	int isl_constraint_is_equality(
-		__isl_keep isl_constraint *constraint);
-
-The coefficients of the constraints can be inspected using
-the following functions.
-
-	void isl_constraint_get_constant(
-		__isl_keep isl_constraint *constraint, isl_int *v);
-	void isl_constraint_get_coefficient(
-		__isl_keep isl_constraint *constraint,
-		enum isl_dim_type type, int pos, isl_int *v);
-	int isl_constraint_involves_dims(
-		__isl_keep isl_constraint *constraint,
-		enum isl_dim_type type, unsigned first, unsigned n);
-
-The explicit representations of the existentially quantified
-variables can be inspected using the following functions.
-Note that the user is only allowed to use these functions
-if the inspected set or map is the result of a call
-to C<isl_set_compute_divs> or C<isl_map_compute_divs>.
-
-	__isl_give isl_div *isl_constraint_div(
-		__isl_keep isl_constraint *constraint, int pos);
-	isl_ctx *isl_div_get_ctx(__isl_keep isl_div *div);
-	void isl_div_get_constant(__isl_keep isl_div *div,
-		isl_int *v);
-	void isl_div_get_denominator(__isl_keep isl_div *div,
-		isl_int *v);
-	void isl_div_get_coefficient(__isl_keep isl_div *div,
-		enum isl_dim_type type, int pos, isl_int *v);
-
-To obtain the constraints of a basic set or map in matrix
-form, use the following functions.
-
-	__isl_give isl_mat *isl_basic_set_equalities_matrix(
-		__isl_keep isl_basic_set *bset,
-		enum isl_dim_type c1, enum isl_dim_type c2,
-		enum isl_dim_type c3, enum isl_dim_type c4);
-	__isl_give isl_mat *isl_basic_set_inequalities_matrix(
-		__isl_keep isl_basic_set *bset,
-		enum isl_dim_type c1, enum isl_dim_type c2,
-		enum isl_dim_type c3, enum isl_dim_type c4);
-	__isl_give isl_mat *isl_basic_map_equalities_matrix(
-		__isl_keep isl_basic_map *bmap,
-		enum isl_dim_type c1,
-		enum isl_dim_type c2, enum isl_dim_type c3,
-		enum isl_dim_type c4, enum isl_dim_type c5);
-	__isl_give isl_mat *isl_basic_map_inequalities_matrix(
-		__isl_keep isl_basic_map *bmap,
-		enum isl_dim_type c1,
-		enum isl_dim_type c2, enum isl_dim_type c3,
-		enum isl_dim_type c4, enum isl_dim_type c5);
-
-The C<isl_dim_type> arguments dictate the order in which
-different kinds of variables appear in the resulting matrix
-and should be a permutation of C<isl_dim_cst>, C<isl_dim_param>,
-C<isl_dim_in>, C<isl_dim_out> and C<isl_dim_div>.
-
-The names of the domain and range spaces of a set or relation can be
-read off or set using the following functions.
-
-	const char *isl_basic_set_get_tuple_name(
-		__isl_keep isl_basic_set *bset);
-	__isl_give isl_basic_set *isl_basic_set_set_tuple_name(
-		__isl_take isl_basic_set *set, const char *s);
-	const char *isl_set_get_tuple_name(
-		__isl_keep isl_set *set);
-	const char *isl_basic_map_get_tuple_name(
-		__isl_keep isl_basic_map *bmap,
-		enum isl_dim_type type);
-	const char *isl_map_get_tuple_name(
-		__isl_keep isl_map *map,
-		enum isl_dim_type type);
-
-As with C<isl_dim_get_tuple_name>, the value returned points to
-an internal data structure.
-The names of individual dimensions can be read off using
-the following functions.
-
-	const char *isl_constraint_get_dim_name(
-		__isl_keep isl_constraint *constraint,
-		enum isl_dim_type type, unsigned pos);
-	const char *isl_basic_set_get_dim_name(
-		__isl_keep isl_basic_set *bset,
-		enum isl_dim_type type, unsigned pos);
-	const char *isl_set_get_dim_name(
-		__isl_keep isl_set *set,
-		enum isl_dim_type type, unsigned pos);
-	const char *isl_basic_map_get_dim_name(
-		__isl_keep isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned pos);
-	const char *isl_map_get_dim_name(
-		__isl_keep isl_map *map,
-		enum isl_dim_type type, unsigned pos);
-
-These functions are mostly useful to obtain the names
-of the parameters.
-
-=head2 Properties
-
-=head3 Unary Properties
-
-=over
-
-=item * Emptiness
-
-The following functions test whether the given set or relation
-contains any integer points.  The ``plain'' variants do not perform
-any computations, but simply check if the given set or relation
-is already known to be empty.
-
-	int isl_basic_set_plain_is_empty(__isl_keep isl_basic_set *bset);
-	int isl_basic_set_is_empty(__isl_keep isl_basic_set *bset);
-	int isl_set_plain_is_empty(__isl_keep isl_set *set);
-	int isl_set_is_empty(__isl_keep isl_set *set);
-	int isl_union_set_is_empty(__isl_keep isl_union_set *uset);
-	int isl_basic_map_plain_is_empty(__isl_keep isl_basic_map *bmap);
-	int isl_basic_map_is_empty(__isl_keep isl_basic_map *bmap);
-	int isl_map_plain_is_empty(__isl_keep isl_map *map);
-	int isl_map_is_empty(__isl_keep isl_map *map);
-	int isl_union_map_is_empty(__isl_keep isl_union_map *umap);
-
-=item * Universality
-
-	int isl_basic_set_is_universe(__isl_keep isl_basic_set *bset);
-	int isl_basic_map_is_universe(__isl_keep isl_basic_map *bmap);
-	int isl_set_plain_is_universe(__isl_keep isl_set *set);
-
-=item * Single-valuedness
-
-	int isl_map_is_single_valued(__isl_keep isl_map *map);
-	int isl_union_map_is_single_valued(__isl_keep isl_union_map *umap);
-
-=item * Injectivity
-
-	int isl_map_plain_is_injective(__isl_keep isl_map *map);
-	int isl_map_is_injective(__isl_keep isl_map *map);
-	int isl_union_map_plain_is_injective(
-		__isl_keep isl_union_map *umap);
-	int isl_union_map_is_injective(
-		__isl_keep isl_union_map *umap);
-
-=item * Bijectivity
-
-	int isl_map_is_bijective(__isl_keep isl_map *map);
-	int isl_union_map_is_bijective(__isl_keep isl_union_map *umap);
-
-=item * Wrapping
-
-The following functions check whether the domain of the given
-(basic) set is a wrapped relation.
-
-	int isl_basic_set_is_wrapping(
-		__isl_keep isl_basic_set *bset);
-	int isl_set_is_wrapping(__isl_keep isl_set *set);
-
-=item * Internal Product
-
-	int isl_basic_map_can_zip(
-		__isl_keep isl_basic_map *bmap);
-	int isl_map_can_zip(__isl_keep isl_map *map);
-
-Check whether the product of domain and range of the given relation
-can be computed,
-i.e., whether both domain and range are nested relations.
-
-=back
-
-=head3 Binary Properties
-
-=over
-
-=item * Equality
-
-	int isl_set_plain_is_equal(__isl_keep isl_set *set1,
-		__isl_keep isl_set *set2);
-	int isl_set_is_equal(__isl_keep isl_set *set1,
-		__isl_keep isl_set *set2);
-	int isl_union_set_is_equal(
-		__isl_keep isl_union_set *uset1,
-		__isl_keep isl_union_set *uset2);
-	int isl_basic_map_is_equal(
-		__isl_keep isl_basic_map *bmap1,
-		__isl_keep isl_basic_map *bmap2);
-	int isl_map_is_equal(__isl_keep isl_map *map1,
-		__isl_keep isl_map *map2);
-	int isl_map_plain_is_equal(__isl_keep isl_map *map1,
-		__isl_keep isl_map *map2);
-	int isl_union_map_is_equal(
-		__isl_keep isl_union_map *umap1,
-		__isl_keep isl_union_map *umap2);
-
-=item * Disjointness
-
-	int isl_set_plain_is_disjoint(__isl_keep isl_set *set1,
-		__isl_keep isl_set *set2);
-
-=item * Subset
-
-	int isl_set_is_subset(__isl_keep isl_set *set1,
-		__isl_keep isl_set *set2);
-	int isl_set_is_strict_subset(
-		__isl_keep isl_set *set1,
-		__isl_keep isl_set *set2);
-	int isl_union_set_is_subset(
-		__isl_keep isl_union_set *uset1,
-		__isl_keep isl_union_set *uset2);
-	int isl_union_set_is_strict_subset(
-		__isl_keep isl_union_set *uset1,
-		__isl_keep isl_union_set *uset2);
-	int isl_basic_map_is_subset(
-		__isl_keep isl_basic_map *bmap1,
-		__isl_keep isl_basic_map *bmap2);
-	int isl_basic_map_is_strict_subset(
-		__isl_keep isl_basic_map *bmap1,
-		__isl_keep isl_basic_map *bmap2);
-	int isl_map_is_subset(
-		__isl_keep isl_map *map1,
-		__isl_keep isl_map *map2);
-	int isl_map_is_strict_subset(
-		__isl_keep isl_map *map1,
-		__isl_keep isl_map *map2);
-	int isl_union_map_is_subset(
-		__isl_keep isl_union_map *umap1,
-		__isl_keep isl_union_map *umap2);
-	int isl_union_map_is_strict_subset(
-		__isl_keep isl_union_map *umap1,
-		__isl_keep isl_union_map *umap2);
-
-=back
-
-=head2 Unary Operations
-
-=over
-
-=item * Complement
-
-	__isl_give isl_set *isl_set_complement(
-		__isl_take isl_set *set);
-
-=item * Inverse map
-
-	__isl_give isl_basic_map *isl_basic_map_reverse(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_map *isl_map_reverse(
-		__isl_take isl_map *map);
-	__isl_give isl_union_map *isl_union_map_reverse(
-		__isl_take isl_union_map *umap);
-
-=item * Projection
-
-	__isl_give isl_basic_set *isl_basic_set_project_out(
-		__isl_take isl_basic_set *bset,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	__isl_give isl_basic_map *isl_basic_map_project_out(
-		__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	__isl_give isl_set *isl_set_project_out(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	__isl_give isl_map *isl_map_project_out(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	__isl_give isl_basic_set *isl_basic_map_domain(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_basic_set *isl_basic_map_range(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_set *isl_map_domain(
-		__isl_take isl_map *bmap);
-	__isl_give isl_set *isl_map_range(
-		__isl_take isl_map *map);
-	__isl_give isl_union_set *isl_union_map_domain(
-		__isl_take isl_union_map *umap);
-	__isl_give isl_union_set *isl_union_map_range(
-		__isl_take isl_union_map *umap);
-
-	__isl_give isl_basic_map *isl_basic_map_domain_map(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_basic_map *isl_basic_map_range_map(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_map *isl_map_domain_map(__isl_take isl_map *map);
-	__isl_give isl_map *isl_map_range_map(__isl_take isl_map *map);
-	__isl_give isl_union_map *isl_union_map_domain_map(
-		__isl_take isl_union_map *umap);
-	__isl_give isl_union_map *isl_union_map_range_map(
-		__isl_take isl_union_map *umap);
-
-The functions above construct a (basic, regular or union) relation
-that maps (a wrapped version of) the input relation to its domain or range.
-
-=item * Elimination
-
-	__isl_give isl_set *isl_set_eliminate(
-		__isl_take isl_set *set, enum isl_dim_type type,
-		unsigned first, unsigned n);
-
-Eliminate the coefficients for the given dimensions from the constraints,
-without removing the dimensions.
-
-=item * Slicing
-
-	__isl_give isl_basic_set *isl_basic_set_fix(
-		__isl_take isl_basic_set *bset,
-		enum isl_dim_type type, unsigned pos,
-		isl_int value);
-	__isl_give isl_basic_set *isl_basic_set_fix_si(
-		__isl_take isl_basic_set *bset,
-		enum isl_dim_type type, unsigned pos, int value);
-	__isl_give isl_set *isl_set_fix(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos,
-		isl_int value);
-	__isl_give isl_set *isl_set_fix_si(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos, int value);
-	__isl_give isl_basic_map *isl_basic_map_fix_si(
-		__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned pos, int value);
-	__isl_give isl_map *isl_map_fix_si(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned pos, int value);
-
-Intersect the set or relation with the hyperplane where the given
-dimension has the fixed given value.
-
-=item * Identity
-
-	__isl_give isl_map *isl_set_identity(
-		__isl_take isl_set *set);
-	__isl_give isl_union_map *isl_union_set_identity(
-		__isl_take isl_union_set *uset);
-
-Construct an identity relation on the given (union) set.
-
-=item * Deltas
-
-	__isl_give isl_basic_set *isl_basic_map_deltas(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_set *isl_map_deltas(__isl_take isl_map *map);
-	__isl_give isl_union_set *isl_union_map_deltas(
-		__isl_take isl_union_map *umap);
-
-These functions return a (basic) set containing the differences
-between image elements and corresponding domain elements in the input.
-
-	__isl_give isl_basic_map *isl_basic_map_deltas_map(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_map *isl_map_deltas_map(
-		__isl_take isl_map *map);
-	__isl_give isl_union_map *isl_union_map_deltas_map(
-		__isl_take isl_union_map *umap);
-
-The functions above construct a (basic, regular or union) relation
-that maps (a wrapped version of) the input relation to its delta set.
-
-=item * Coalescing
-
-Simplify the representation of a set or relation by trying
-to combine pairs of basic sets or relations into a single
-basic set or relation.
-
-	__isl_give isl_set *isl_set_coalesce(__isl_take isl_set *set);
-	__isl_give isl_map *isl_map_coalesce(__isl_take isl_map *map);
-	__isl_give isl_union_set *isl_union_set_coalesce(
-		__isl_take isl_union_set *uset);
-	__isl_give isl_union_map *isl_union_map_coalesce(
-		__isl_take isl_union_map *umap);
-
-=item * Detecting equalities
-
-	__isl_give isl_basic_set *isl_basic_set_detect_equalities(
-                __isl_take isl_basic_set *bset);
-	__isl_give isl_basic_map *isl_basic_map_detect_equalities(
-                __isl_take isl_basic_map *bmap);
-	__isl_give isl_set *isl_set_detect_equalities(
-		__isl_take isl_set *set);
-	__isl_give isl_map *isl_map_detect_equalities(
-		__isl_take isl_map *map);
-	__isl_give isl_union_set *isl_union_set_detect_equalities(
-		__isl_take isl_union_set *uset);
-	__isl_give isl_union_map *isl_union_map_detect_equalities(
-		__isl_take isl_union_map *umap);
-
-Simplify the representation of a set or relation by detecting implicit
-equalities.
-
-=item * Removing redundant constraints
-
-	__isl_give isl_basic_set *isl_basic_set_remove_redundancies(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_set *isl_set_remove_redundancies(
-		__isl_take isl_set *set);
-	__isl_give isl_basic_map *isl_basic_map_remove_redundancies(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_map *isl_map_remove_redundancies(
-		__isl_take isl_map *map);
-
-=item * Convex hull
-
-	__isl_give isl_basic_set *isl_set_convex_hull(
-		__isl_take isl_set *set);
-	__isl_give isl_basic_map *isl_map_convex_hull(
-		__isl_take isl_map *map);
-
-If the input set or relation has any existentially quantified
-variables, then the result of these operations is currently undefined.
-
-=item * Simple hull
-
-	__isl_give isl_basic_set *isl_set_simple_hull(
-		__isl_take isl_set *set);
-	__isl_give isl_basic_map *isl_map_simple_hull(
-		__isl_take isl_map *map);
-	__isl_give isl_union_map *isl_union_map_simple_hull(
-		__isl_take isl_union_map *umap);
-
-These functions compute a single basic set or relation
-that contains the whole input set or relation.
-In particular, the output is described by translates
-of the constraints describing the basic sets or relations in the input.
-
-=begin latex
-
-(See \autoref{s:simple hull}.)
-
-=end latex
-
-=item * Affine hull
-
-	__isl_give isl_basic_set *isl_basic_set_affine_hull(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_basic_set *isl_set_affine_hull(
-		__isl_take isl_set *set);
-	__isl_give isl_union_set *isl_union_set_affine_hull(
-		__isl_take isl_union_set *uset);
-	__isl_give isl_basic_map *isl_basic_map_affine_hull(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_basic_map *isl_map_affine_hull(
-		__isl_take isl_map *map);
-	__isl_give isl_union_map *isl_union_map_affine_hull(
-		__isl_take isl_union_map *umap);
-
-In case of union sets and relations, the affine hull is computed
-per space.
-
-=item * Polyhedral hull
-
-	__isl_give isl_basic_set *isl_set_polyhedral_hull(
-		__isl_take isl_set *set);
-	__isl_give isl_basic_map *isl_map_polyhedral_hull(
-		__isl_take isl_map *map);
-	__isl_give isl_union_set *isl_union_set_polyhedral_hull(
-		__isl_take isl_union_set *uset);
-	__isl_give isl_union_map *isl_union_map_polyhedral_hull(
-		__isl_take isl_union_map *umap);
-
-These functions compute a single basic set or relation
-not involving any existentially quantified variables
-that contains the whole input set or relation.
-In case of union sets and relations, the polyhedral hull is computed
-per space.
-
-=item * Optimization
-
-	#include <isl/ilp.h>
-	enum isl_lp_result isl_basic_set_max(
-		__isl_keep isl_basic_set *bset,
-		__isl_keep isl_aff *obj, isl_int *opt)
-	enum isl_lp_result isl_set_max(__isl_keep isl_set *set,
-		__isl_keep isl_aff *obj, isl_int *opt);
-
-Compute the maximum of the integer affine expression C<obj>
-over the points in C<set>, returning the result in C<opt>.
-The return value may be one of C<isl_lp_error>,
-C<isl_lp_ok>, C<isl_lp_unbounded> or C<isl_lp_empty>.
-
-=item * Parametric optimization
-
-	__isl_give isl_pw_aff *isl_set_dim_max(
-		__isl_take isl_set *set, int pos);
-
-Compute the maximum of the given set dimension as a function of the
-parameters, but independently of the other set dimensions.
-For lexicographic optimization, see L<"Lexicographic Optimization">.
-
-=item * Dual
-
-The following functions compute either the set of (rational) coefficient
-values of valid constraints for the given set or the set of (rational)
-values satisfying the constraints with coefficients from the given set.
-Internally, these two sets of functions perform essentially the
-same operations, except that the set of coefficients is assumed to
-be a cone, while the set of values may be any polyhedron.
-The current implementation is based on the Farkas lemma and
-Fourier-Motzkin elimination, but this may change or be made optional
-in future.  In particular, future implementations may use different
-dualization algorithms or skip the elimination step.
-
-	__isl_give isl_basic_set *isl_basic_set_coefficients(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_basic_set *isl_set_coefficients(
-		__isl_take isl_set *set);
-	__isl_give isl_union_set *isl_union_set_coefficients(
-		__isl_take isl_union_set *bset);
-	__isl_give isl_basic_set *isl_basic_set_solutions(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_basic_set *isl_set_solutions(
-		__isl_take isl_set *set);
-	__isl_give isl_union_set *isl_union_set_solutions(
-		__isl_take isl_union_set *bset);
-
-=item * Power
-
-	__isl_give isl_map *isl_map_power(__isl_take isl_map *map,
-		int *exact);
-	__isl_give isl_union_map *isl_union_map_power(
-		__isl_take isl_union_map *umap, int *exact);
-
-Compute a parametric representation for all positive powers I<k> of C<map>.
-The result maps I<k> to a nested relation corresponding to the
-I<k>th power of C<map>.
-The result may be an overapproximation.  If the result is known to be exact,
-then C<*exact> is set to C<1>.
-
-=item * Transitive closure
-
-	__isl_give isl_map *isl_map_transitive_closure(
-		__isl_take isl_map *map, int *exact);
-	__isl_give isl_union_map *isl_union_map_transitive_closure(
-		__isl_take isl_union_map *umap, int *exact);
-
-Compute the transitive closure of C<map>.
-The result may be an overapproximation.  If the result is known to be exact,
-then C<*exact> is set to C<1>.
-
-=item * Reaching path lengths
-
-	__isl_give isl_map *isl_map_reaching_path_lengths(
-		__isl_take isl_map *map, int *exact);
-
-Compute a relation that maps each element in the range of C<map>
-to the lengths of all paths composed of edges in C<map> that
-end up in the given element.
-The result may be an overapproximation.  If the result is known to be exact,
-then C<*exact> is set to C<1>.
-To compute the I<maximal> path length, the resulting relation
-should be postprocessed by C<isl_map_lexmax>.
-In particular, if the input relation is a dependence relation
-(mapping sources to sinks), then the maximal path length corresponds
-to the free schedule.
-Note, however, that C<isl_map_lexmax> expects the maximum to be
-finite, so if the path lengths are unbounded (possibly due to
-the overapproximation), then you will get an error message.
-
-=item * Wrapping
-
-	__isl_give isl_basic_set *isl_basic_map_wrap(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_set *isl_map_wrap(
-		__isl_take isl_map *map);
-	__isl_give isl_union_set *isl_union_map_wrap(
-		__isl_take isl_union_map *umap);
-	__isl_give isl_basic_map *isl_basic_set_unwrap(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_map *isl_set_unwrap(
-		__isl_take isl_set *set);
-	__isl_give isl_union_map *isl_union_set_unwrap(
-		__isl_take isl_union_set *uset);
-
-=item * Flattening
-
-Remove any internal structure of domain (and range) of the given
-set or relation.  If there is any such internal structure in the input,
-then the name of the space is also removed.
-
-	__isl_give isl_basic_set *isl_basic_set_flatten(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_set *isl_set_flatten(
-		__isl_take isl_set *set);
-	__isl_give isl_basic_map *isl_basic_map_flatten_range(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_map *isl_map_flatten_range(
-		__isl_take isl_map *map);
-	__isl_give isl_basic_map *isl_basic_map_flatten(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_map *isl_map_flatten(
-		__isl_take isl_map *map);
-
-	__isl_give isl_map *isl_set_flatten_map(
-		__isl_take isl_set *set);
-
-The function above constructs a relation
-that maps the input set to a flattened version of the set.
-
-=item * Lifting
-
-Lift the input set to a space with extra dimensions corresponding
-to the existentially quantified variables in the input.
-In particular, the result lives in a wrapped map where the domain
-is the original space and the range corresponds to the original
-existentially quantified variables.
-
-	__isl_give isl_basic_set *isl_basic_set_lift(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_set *isl_set_lift(
-		__isl_take isl_set *set);
-	__isl_give isl_union_set *isl_union_set_lift(
-		__isl_take isl_union_set *uset);
-
-=item * Internal Product
-
-	__isl_give isl_basic_map *isl_basic_map_zip(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_map *isl_map_zip(
-		__isl_take isl_map *map);
-	__isl_give isl_union_map *isl_union_map_zip(
-		__isl_take isl_union_map *umap);
-
-Given a relation with nested relations for domain and range,
-interchange the range of the domain with the domain of the range.
-
-=item * Aligning parameters
-
-	__isl_give isl_set *isl_set_align_params(
-		__isl_take isl_set *set,
-		__isl_take isl_dim *model);
-	__isl_give isl_map *isl_map_align_params(
-		__isl_take isl_map *map,
-		__isl_take isl_dim *model);
-
-Change the order of the parameters of the given set or relation
-such that the first parameters match those of C<model>.
-This may involve the introduction of extra parameters.
-All parameters need to be named.
-
-=item * Dimension manipulation
-
-	__isl_give isl_set *isl_set_add_dims(
-		__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned n);
-	__isl_give isl_map *isl_map_add_dims(
-		__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned n);
-
-It is usually not advisable to directly change the (input or output)
-space of a set or a relation as this removes the name and the internal
-structure of the space.  However, the above functions can be useful
-to add new parameters, assuming
-C<isl_set_align_params> and C<isl_map_align_params>
-are not sufficient.
-
-=back
-
-=head2 Binary Operations
-
-The two arguments of a binary operation not only need to live
-in the same C<isl_ctx>, they currently also need to have
-the same (number of) parameters.
-
-=head3 Basic Operations
-
-=over
-
-=item * Intersection
-
-	__isl_give isl_basic_set *isl_basic_set_intersect(
-		__isl_take isl_basic_set *bset1,
-		__isl_take isl_basic_set *bset2);
-	__isl_give isl_set *isl_set_intersect_params(
-		__isl_take isl_set *set,
-		__isl_take isl_set *params);
-	__isl_give isl_set *isl_set_intersect(
-		__isl_take isl_set *set1,
-		__isl_take isl_set *set2);
-	__isl_give isl_union_set *isl_union_set_intersect(
-		__isl_take isl_union_set *uset1,
-		__isl_take isl_union_set *uset2);
-	__isl_give isl_basic_map *isl_basic_map_intersect_domain(
-		__isl_take isl_basic_map *bmap,
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_basic_map *isl_basic_map_intersect_range(
-		__isl_take isl_basic_map *bmap,
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_basic_map *isl_basic_map_intersect(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-	__isl_give isl_map *isl_map_intersect_params(
-		__isl_take isl_map *map,
-		__isl_take isl_set *params);
-	__isl_give isl_map *isl_map_intersect_domain(
-		__isl_take isl_map *map,
-		__isl_take isl_set *set);
-	__isl_give isl_map *isl_map_intersect_range(
-		__isl_take isl_map *map,
-		__isl_take isl_set *set);
-	__isl_give isl_map *isl_map_intersect(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-	__isl_give isl_union_map *isl_union_map_intersect_domain(
-		__isl_take isl_union_map *umap,
-		__isl_take isl_union_set *uset);
-	__isl_give isl_union_map *isl_union_map_intersect_range(
-		__isl_take isl_union_map *umap,
-		__isl_take isl_union_set *uset);
-	__isl_give isl_union_map *isl_union_map_intersect(
-		__isl_take isl_union_map *umap1,
-		__isl_take isl_union_map *umap2);
-
-=item * Union
-
-	__isl_give isl_set *isl_basic_set_union(
-		__isl_take isl_basic_set *bset1,
-		__isl_take isl_basic_set *bset2);
-	__isl_give isl_map *isl_basic_map_union(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-	__isl_give isl_set *isl_set_union(
-		__isl_take isl_set *set1,
-		__isl_take isl_set *set2);
-	__isl_give isl_map *isl_map_union(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-	__isl_give isl_union_set *isl_union_set_union(
-		__isl_take isl_union_set *uset1,
-		__isl_take isl_union_set *uset2);
-	__isl_give isl_union_map *isl_union_map_union(
-		__isl_take isl_union_map *umap1,
-		__isl_take isl_union_map *umap2);
-
-=item * Set difference
-
-	__isl_give isl_set *isl_set_subtract(
-		__isl_take isl_set *set1,
-		__isl_take isl_set *set2);
-	__isl_give isl_map *isl_map_subtract(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-	__isl_give isl_union_set *isl_union_set_subtract(
-		__isl_take isl_union_set *uset1,
-		__isl_take isl_union_set *uset2);
-	__isl_give isl_union_map *isl_union_map_subtract(
-		__isl_take isl_union_map *umap1,
-		__isl_take isl_union_map *umap2);
-
-=item * Application
-
-	__isl_give isl_basic_set *isl_basic_set_apply(
-		__isl_take isl_basic_set *bset,
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_set *isl_set_apply(
-		__isl_take isl_set *set,
-		__isl_take isl_map *map);
-	__isl_give isl_union_set *isl_union_set_apply(
-		__isl_take isl_union_set *uset,
-		__isl_take isl_union_map *umap);
-	__isl_give isl_basic_map *isl_basic_map_apply_domain(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-	__isl_give isl_basic_map *isl_basic_map_apply_range(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-	__isl_give isl_map *isl_map_apply_domain(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-	__isl_give isl_union_map *isl_union_map_apply_domain(
-		__isl_take isl_union_map *umap1,
-		__isl_take isl_union_map *umap2);
-	__isl_give isl_map *isl_map_apply_range(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-	__isl_give isl_union_map *isl_union_map_apply_range(
-		__isl_take isl_union_map *umap1,
-		__isl_take isl_union_map *umap2);
-
-=item * Cartesian Product
-
-	__isl_give isl_set *isl_set_product(
-		__isl_take isl_set *set1,
-		__isl_take isl_set *set2);
-	__isl_give isl_union_set *isl_union_set_product(
-		__isl_take isl_union_set *uset1,
-		__isl_take isl_union_set *uset2);
-	__isl_give isl_basic_map *isl_basic_map_range_product(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-	__isl_give isl_map *isl_map_range_product(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-	__isl_give isl_union_map *isl_union_map_range_product(
-		__isl_take isl_union_map *umap1,
-		__isl_take isl_union_map *umap2);
-	__isl_give isl_map *isl_map_product(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-	__isl_give isl_union_map *isl_union_map_product(
-		__isl_take isl_union_map *umap1,
-		__isl_take isl_union_map *umap2);
-
-The above functions compute the cross product of the given
-sets or relations.  The domains and ranges of the results
-are wrapped maps between domains and ranges of the inputs.
-To obtain a ``flat'' product, use the following functions
-instead.
-
-	__isl_give isl_basic_set *isl_basic_set_flat_product(
-		__isl_take isl_basic_set *bset1,
-		__isl_take isl_basic_set *bset2);
-	__isl_give isl_set *isl_set_flat_product(
-		__isl_take isl_set *set1,
-		__isl_take isl_set *set2);
-	__isl_give isl_basic_map *isl_basic_map_flat_range_product(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-	__isl_give isl_map *isl_map_flat_range_product(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-	__isl_give isl_union_map *isl_union_map_flat_range_product(
-		__isl_take isl_union_map *umap1,
-		__isl_take isl_union_map *umap2);
-	__isl_give isl_basic_map *isl_basic_map_flat_product(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-	__isl_give isl_map *isl_map_flat_product(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-
-=item * Simplification
-
-	__isl_give isl_basic_set *isl_basic_set_gist(
-		__isl_take isl_basic_set *bset,
-		__isl_take isl_basic_set *context);
-	__isl_give isl_set *isl_set_gist(__isl_take isl_set *set,
-		__isl_take isl_set *context);
-	__isl_give isl_union_set *isl_union_set_gist(
-		__isl_take isl_union_set *uset,
-		__isl_take isl_union_set *context);
-	__isl_give isl_basic_map *isl_basic_map_gist(
-		__isl_take isl_basic_map *bmap,
-		__isl_take isl_basic_map *context);
-	__isl_give isl_map *isl_map_gist(__isl_take isl_map *map,
-		__isl_take isl_map *context);
-	__isl_give isl_union_map *isl_union_map_gist(
-		__isl_take isl_union_map *umap,
-		__isl_take isl_union_map *context);
-
-The gist operation returns a set or relation that has the
-same intersection with the context as the input set or relation.
-Any implicit equality in the intersection is made explicit in the result,
-while all inequalities that are redundant with respect to the intersection
-are removed.
-In case of union sets and relations, the gist operation is performed
-per space.
-
-=back
-
-=head3 Lexicographic Optimization
-
-Given a (basic) set C<set> (or C<bset>) and a zero-dimensional domain C<dom>,
-the following functions
-compute a set that contains the lexicographic minimum or maximum
-of the elements in C<set> (or C<bset>) for those values of the parameters
-that satisfy C<dom>.
-If C<empty> is not C<NULL>, then C<*empty> is assigned a set
-that contains the parameter values in C<dom> for which C<set> (or C<bset>)
-has no elements.
-In other words, the union of the parameter values
-for which the result is non-empty and of C<*empty>
-is equal to C<dom>.
-
-	__isl_give isl_set *isl_basic_set_partial_lexmin(
-		__isl_take isl_basic_set *bset,
-		__isl_take isl_basic_set *dom,
-		__isl_give isl_set **empty);
-	__isl_give isl_set *isl_basic_set_partial_lexmax(
-		__isl_take isl_basic_set *bset,
-		__isl_take isl_basic_set *dom,
-		__isl_give isl_set **empty);
-	__isl_give isl_set *isl_set_partial_lexmin(
-		__isl_take isl_set *set, __isl_take isl_set *dom,
-		__isl_give isl_set **empty);
-	__isl_give isl_set *isl_set_partial_lexmax(
-		__isl_take isl_set *set, __isl_take isl_set *dom,
-		__isl_give isl_set **empty);
-
-Given a (basic) set C<set> (or C<bset>), the following functions simply
-return a set containing the lexicographic minimum or maximum
-of the elements in C<set> (or C<bset>).
-In case of union sets, the optimum is computed per space.
-
-	__isl_give isl_set *isl_basic_set_lexmin(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_set *isl_basic_set_lexmax(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_set *isl_set_lexmin(
-		__isl_take isl_set *set);
-	__isl_give isl_set *isl_set_lexmax(
-		__isl_take isl_set *set);
-	__isl_give isl_union_set *isl_union_set_lexmin(
-		__isl_take isl_union_set *uset);
-	__isl_give isl_union_set *isl_union_set_lexmax(
-		__isl_take isl_union_set *uset);
-
-Given a (basic) relation C<map> (or C<bmap>) and a domain C<dom>,
-the following functions
-compute a relation that maps each element of C<dom>
-to the single lexicographic minimum or maximum
-of the elements that are associated to that same
-element in C<map> (or C<bmap>).
-If C<empty> is not C<NULL>, then C<*empty> is assigned a set
-that contains the elements in C<dom> that do not map
-to any elements in C<map> (or C<bmap>).
-In other words, the union of the domain of the result and of C<*empty>
-is equal to C<dom>.
-
-	__isl_give isl_map *isl_basic_map_partial_lexmax(
-		__isl_take isl_basic_map *bmap,
-		__isl_take isl_basic_set *dom,
-		__isl_give isl_set **empty);
-	__isl_give isl_map *isl_basic_map_partial_lexmin(
-		__isl_take isl_basic_map *bmap,
-		__isl_take isl_basic_set *dom,
-		__isl_give isl_set **empty);
-	__isl_give isl_map *isl_map_partial_lexmax(
-		__isl_take isl_map *map, __isl_take isl_set *dom,
-		__isl_give isl_set **empty);
-	__isl_give isl_map *isl_map_partial_lexmin(
-		__isl_take isl_map *map, __isl_take isl_set *dom,
-		__isl_give isl_set **empty);
-
-Given a (basic) map C<map> (or C<bmap>), the following functions simply
-return a map mapping each element in the domain of
-C<map> (or C<bmap>) to the lexicographic minimum or maximum
-of all elements associated to that element.
-In case of union relations, the optimum is computed per space.
-
-	__isl_give isl_map *isl_basic_map_lexmin(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_map *isl_basic_map_lexmax(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_map *isl_map_lexmin(
-		__isl_take isl_map *map);
-	__isl_give isl_map *isl_map_lexmax(
-		__isl_take isl_map *map);
-	__isl_give isl_union_map *isl_union_map_lexmin(
-		__isl_take isl_union_map *umap);
-	__isl_give isl_union_map *isl_union_map_lexmax(
-		__isl_take isl_union_map *umap);
-
-=head2 Lists
-
-Lists are defined over several element types, including
-C<isl_aff>, C<isl_basic_set> and C<isl_set>.
-Here we take lists of C<isl_set>s as an example.
-Lists can be created, copied and freed using the following functions.
-
-	#include <isl/list.h>
-	__isl_give isl_set_list *isl_set_list_alloc(
-		isl_ctx *ctx, int n);
-	__isl_give isl_set_list *isl_set_list_copy(
-		__isl_keep isl_set_list *list);
-	__isl_give isl_set_list *isl_set_list_add(
-		__isl_take isl_set_list *list,
-		__isl_take isl_set *el);
-	void isl_set_list_free(__isl_take isl_set_list *list);
-
-C<isl_set_list_alloc> creates an empty list with a capacity for
-C<n> elements.
-
-Lists can be inspected using the following functions.
-
-	#include <isl/list.h>
-	isl_ctx *isl_set_list_get_ctx(__isl_keep isl_set_list *list);
-	int isl_set_list_n_set(__isl_keep isl_set_list *list);
-	__isl_give struct isl_set *isl_set_list_get_set(
-		__isl_keep isl_set_list *list, int index);
-	int isl_set_list_foreach(__isl_keep isl_set_list *list,
-		int (*fn)(__isl_take struct isl_set *el, void *user),
-		void *user);
-
-Lists can be printed using
-
-	#include <isl/list.h>
-	__isl_give isl_printer *isl_printer_print_set_list(
-		__isl_take isl_printer *p,
-		__isl_keep isl_set_list *list);
-
-=head2 Matrices
-
-Matrices can be created, copied and freed using the following functions.
-
-	#include <isl/mat.h>
-	__isl_give isl_mat *isl_mat_alloc(struct isl_ctx *ctx,
-		unsigned n_row, unsigned n_col);
-	__isl_give isl_mat *isl_mat_copy(__isl_keep isl_mat *mat);
-	void isl_mat_free(__isl_take isl_mat *mat);
-
-Note that the elements of a newly created matrix may have arbitrary values.
-The elements can be changed and inspected using the following functions.
-
-	isl_ctx *isl_mat_get_ctx(__isl_keep isl_mat *mat);
-	int isl_mat_rows(__isl_keep isl_mat *mat);
-	int isl_mat_cols(__isl_keep isl_mat *mat);
-	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,
-		int row, int col, isl_int v);
-	__isl_give isl_mat *isl_mat_set_element_si(__isl_take isl_mat *mat,
-		int row, int col, int v);
-
-C<isl_mat_get_element> will return a negative value if anything went wrong.
-In that case, the value of C<*v> is undefined.
-
-The following function can be used to compute the (right) inverse
-of a matrix, i.e., a matrix such that the product of the original
-and the inverse (in that order) is a multiple of the identity matrix.
-The input matrix is assumed to be of full row-rank.
-
-	__isl_give isl_mat *isl_mat_right_inverse(__isl_take isl_mat *mat);
-
-The following function can be used to compute the (right) kernel
-(or null space) of a matrix, i.e., a matrix such that the product of
-the original and the kernel (in that order) is the zero matrix.
-
-	__isl_give isl_mat *isl_mat_right_kernel(__isl_take isl_mat *mat);
-
-=head2 Piecewise Quasi Affine Expressions
-
-The zero quasi affine expression can be created using
-
-	__isl_give isl_aff *isl_aff_zero(
-		__isl_take isl_local_space *ls);
-
-A quasi affine expression can also be initialized from an C<isl_div>:
-
-	#include <isl/div.h>
-	__isl_give isl_aff *isl_aff_from_div(__isl_take isl_div *div);
-
-An empty piecewise quasi affine expression (one with no cells)
-or a piecewise quasi affine expression with a single cell can
-be created using the following functions.
-
-	#include <isl/aff.h>
-	__isl_give isl_pw_aff *isl_pw_aff_empty(
-		__isl_take isl_dim *dim);
-	__isl_give isl_pw_aff *isl_pw_aff_alloc(
-		__isl_take isl_set *set, __isl_take isl_aff *aff);
-
-Quasi affine expressions can be copied and freed using
-
-	#include <isl/aff.h>
-	__isl_give isl_aff *isl_aff_copy(__isl_keep isl_aff *aff);
-	void *isl_aff_free(__isl_take isl_aff *aff);
-
-	__isl_give isl_pw_aff *isl_pw_aff_copy(
-		__isl_keep isl_pw_aff *pwaff);
-	void *isl_pw_aff_free(__isl_take isl_pw_aff *pwaff);
-
-A (rational) bound on a dimension can be extracted from an C<isl_constraint>
-using the following function.  The constraint is required to have
-a non-zero coefficient for the specified dimension.
-
-	#include <isl/constraint.h>
-	__isl_give isl_aff *isl_constraint_get_bound(
-		__isl_keep isl_constraint *constraint,
-		enum isl_dim_type type, int pos);
-
-The entire affine expression of the constraint can also be extracted
-using the following function.
-
-	#include <isl/constraint.h>
-	__isl_give isl_aff *isl_constraint_get_aff(
-		__isl_keep isl_constraint *constraint);
-
-Conversely, an equality constraint equating
-the affine expression to zero or an inequality constraint enforcing
-the affine expression to be non-negative, can be constructed using
-
-	__isl_give isl_constraint *isl_equality_from_aff(
-		__isl_take isl_aff *aff);
-	__isl_give isl_constraint *isl_inequality_from_aff(
-		__isl_take isl_aff *aff);
-
-The expression can be inspected using
-
-	#include <isl/aff.h>
-	isl_ctx *isl_aff_get_ctx(__isl_keep isl_aff *aff);
-	int isl_aff_dim(__isl_keep isl_aff *aff,
-		enum isl_dim_type type);
-	__isl_give isl_local_space *isl_aff_get_local_space(
-		__isl_keep isl_aff *aff);
-	const char *isl_aff_get_dim_name(__isl_keep isl_aff *aff,
-		enum isl_dim_type type, unsigned pos);
-	int isl_aff_get_constant(__isl_keep isl_aff *aff,
-		isl_int *v);
-	int isl_aff_get_coefficient(__isl_keep isl_aff *aff,
-		enum isl_dim_type type, int pos, isl_int *v);
-	int isl_aff_get_denominator(__isl_keep isl_aff *aff,
-		isl_int *v);
-	__isl_give isl_div *isl_aff_get_div(
-		__isl_keep isl_aff *aff, int pos);
-
-	int isl_aff_involves_dims(__isl_keep isl_aff *aff,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	int isl_pw_aff_involves_dims(__isl_keep isl_pw_aff *pwaff,
-		enum isl_dim_type type, unsigned first, unsigned n);
-
-	isl_ctx *isl_pw_aff_get_ctx(__isl_keep isl_pw_aff *pwaff);
-	unsigned isl_pw_aff_dim(__isl_keep isl_pw_aff *pwaff,
-		enum isl_dim_type type);
-	int isl_pw_aff_is_empty(__isl_keep isl_pw_aff *pwaff);
-
-It can be modified using
-
-	#include <isl/aff.h>
-	__isl_give isl_aff *isl_aff_set_dim_name(
-		__isl_take isl_aff *aff, enum isl_dim_type type,
-		unsigned pos, const char *s);
-	__isl_give isl_aff *isl_aff_set_constant(
-		__isl_take isl_aff *aff, isl_int v);
-	__isl_give isl_aff *isl_aff_set_constant_si(
-		__isl_take isl_aff *aff, int v);
-	__isl_give isl_aff *isl_aff_set_coefficient(
-		__isl_take isl_aff *aff,
-		enum isl_dim_type type, int pos, isl_int v);
-	__isl_give isl_aff *isl_aff_set_coefficient_si(
-		__isl_take isl_aff *aff,
-		enum isl_dim_type type, int pos, int v);
-	__isl_give isl_aff *isl_aff_set_denominator(
-		__isl_take isl_aff *aff, isl_int v);
-
-	__isl_give isl_aff *isl_aff_add_constant(
-		__isl_take isl_aff *aff, isl_int v);
-	__isl_give isl_aff *isl_aff_add_constant_si(
-		__isl_take isl_aff *aff, int v);
-	__isl_give isl_aff *isl_aff_add_coefficient(
-		__isl_take isl_aff *aff,
-		enum isl_dim_type type, int pos, isl_int v);
-	__isl_give isl_aff *isl_aff_add_coefficient_si(
-		__isl_take isl_aff *aff,
-		enum isl_dim_type type, int pos, int v);
-
-	__isl_give isl_aff *isl_aff_insert_dims(
-		__isl_take isl_aff *aff,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	__isl_give isl_pw_aff *isl_pw_aff_insert_dims(
-		__isl_take isl_pw_aff *pwaff,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	__isl_give isl_aff *isl_aff_add_dims(
-		__isl_take isl_aff *aff,
-		enum isl_dim_type type, unsigned n);
-	__isl_give isl_pw_aff *isl_pw_aff_add_dims(
-		__isl_take isl_pw_aff *pwaff,
-		enum isl_dim_type type, unsigned n);
-	__isl_give isl_aff *isl_aff_drop_dims(
-		__isl_take isl_aff *aff,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	__isl_give isl_pw_aff *isl_pw_aff_drop_dims(
-		__isl_take isl_pw_aff *pwaff,
-		enum isl_dim_type type, unsigned first, unsigned n);
-
-Note that the C<set_constant> and C<set_coefficient> functions
-set the I<numerator> of the constant or coefficient, while
-C<add_constant> and C<add_coefficient> add an integer value to
-the possibly rational constant or coefficient.
-
-To check whether an affine expressions is obviously zero
-or obviously equal to some other affine expression, use
-
-	#include <isl/aff.h>
-	int isl_aff_plain_is_zero(__isl_keep isl_aff *aff);
-	int isl_aff_plain_is_equal(__isl_keep isl_aff *aff1,
-		__isl_keep isl_aff *aff2);
-
-Operations include
-
-	#include <isl/aff.h>
-	__isl_give isl_aff *isl_aff_add(__isl_take isl_aff *aff1,
-		__isl_take isl_aff *aff2);
-	__isl_give isl_pw_aff *isl_pw_aff_add(
-		__isl_take isl_pw_aff *pwaff1,
-		__isl_take isl_pw_aff *pwaff2);
-	__isl_give isl_aff *isl_aff_sub(__isl_take isl_aff *aff1,
-		__isl_take isl_aff *aff2);
-	__isl_give isl_pw_aff *isl_pw_aff_sub(
-		__isl_take isl_pw_aff *pwaff1,
-		__isl_take isl_pw_aff *pwaff2);
-	__isl_give isl_aff *isl_aff_neg(__isl_take isl_aff *aff);
-	__isl_give isl_pw_aff *isl_pw_aff_neg(
-		__isl_take isl_pw_aff *pwaff);
-	__isl_give isl_aff *isl_aff_ceil(__isl_take isl_aff *aff);
-	__isl_give isl_pw_aff *isl_pw_aff_ceil(
-		__isl_take isl_pw_aff *pwaff);
-	__isl_give isl_aff *isl_aff_floor(__isl_take isl_aff *aff);
-	__isl_give isl_pw_aff *isl_pw_aff_floor(
-		__isl_take isl_pw_aff *pwaff);
-	__isl_give isl_aff *isl_aff_scale(__isl_take isl_aff *aff,
-		isl_int f);
-	__isl_give isl_pw_aff *isl_pw_aff_scale(
-		__isl_take isl_pw_aff *pwaff, isl_int f);
-	__isl_give isl_aff *isl_aff_scale_down(__isl_take isl_aff *aff,
-		isl_int f);
-	__isl_give isl_aff *isl_aff_scale_down_ui(
-		__isl_take isl_aff *aff, unsigned f);
-	__isl_give isl_pw_aff *isl_pw_aff_scale_down(
-		__isl_take isl_pw_aff *pwaff, isl_int f);
-
-	__isl_give isl_pw_aff *isl_pw_aff_coalesce(
-		__isl_take isl_pw_aff *pwqp);
-
-	__isl_give isl_pw_aff *isl_pw_aff_align_params(
-		__isl_take isl_pw_aff *pwaff,
-		__isl_take isl_dim *model);
-
-	__isl_give isl_aff *isl_aff_gist(__isl_take isl_aff *aff,
-		__isl_take isl_set *context);
-	__isl_give isl_pw_aff *isl_pw_aff_gist(
-		__isl_take isl_pw_aff *pwaff,
-		__isl_take isl_set *context);
-
-	__isl_give isl_set *isl_pw_aff_domain(
-		__isl_take isl_pw_aff *pwaff);
-
-	__isl_give isl_basic_set *isl_aff_ge_basic_set(
-		__isl_take isl_aff *aff1, __isl_take isl_aff *aff2);
-	__isl_give isl_set *isl_pw_aff_eq_set(
-		__isl_take isl_pw_aff *pwaff1,
-		__isl_take isl_pw_aff *pwaff2);
-	__isl_give isl_set *isl_pw_aff_le_set(
-		__isl_take isl_pw_aff *pwaff1,
-		__isl_take isl_pw_aff *pwaff2);
-	__isl_give isl_set *isl_pw_aff_lt_set(
-		__isl_take isl_pw_aff *pwaff1,
-		__isl_take isl_pw_aff *pwaff2);
-	__isl_give isl_set *isl_pw_aff_ge_set(
-		__isl_take isl_pw_aff *pwaff1,
-		__isl_take isl_pw_aff *pwaff2);
-	__isl_give isl_set *isl_pw_aff_gt_set(
-		__isl_take isl_pw_aff *pwaff1,
-		__isl_take isl_pw_aff *pwaff2);
-
-The function C<isl_aff_ge_basic_set> returns a basic set
-containing those elements in the shared space
-of C<aff1> and C<aff2> where C<aff1> is greater than or equal to C<aff2>.
-The function C<isl_aff_ge_set> returns a set
-containing those elements in the shared domain
-of C<pwaff1> and C<pwaff2> where C<pwaff1> is greater than or equal to C<pwaff2>.
-
-	#include <isl/aff.h>
-	__isl_give isl_set *isl_pw_aff_nonneg_set(
-		__isl_take isl_pw_aff *pwaff);
-
-The function C<isl_pw_aff_nonneg_set> returns a set
-containing those elements in the domain
-of C<pwaff> where C<pwaff> is non-negative.
-
-	#include <isl/aff.h>
-	__isl_give isl_pw_aff *isl_pw_aff_cond(
-		__isl_take isl_set *cond,
-		__isl_take isl_pw_aff *pwaff_true,
-		__isl_take isl_pw_aff *pwaff_false);
-
-The function C<isl_pw_aff_cond> performs a conditional operator
-and returns an expression that is equal to C<pwaff_true>
-for elements in C<cond> and equal to C<pwaff_false> for elements
-not in C<cond>.
-
-	#include <isl/aff.h>
-	__isl_give isl_pw_aff *isl_pw_aff_max(
-		__isl_take isl_pw_aff *pwaff1,
-		__isl_take isl_pw_aff *pwaff2);
-
-The function C<isl_pw_aff_max> computes a piecewise quasi-affine
-expression with a domain that is the union of those of C<pwaff1> and
-C<pwaff2> and such that on each cell, the quasi-affine expression is
-the maximum of those of C<pwaff1> and C<pwaff2>.  If only one of
-C<pwaff1> or C<pwaff2> is defined on a given cell, then the
-associated expression is the defined one.
-
-An expression can be printed using
-
-	#include <isl/aff.h>
-	__isl_give isl_printer *isl_printer_print_aff(
-		__isl_take isl_printer *p, __isl_keep isl_aff *aff);
-
-	__isl_give isl_printer *isl_printer_print_pw_aff(
-		__isl_take isl_printer *p,
-		__isl_keep isl_pw_aff *pwaff);
-
-=head2 Points
-
-Points are elements of a set.  They can be used to construct
-simple sets (boxes) or they can be used to represent the
-individual elements of a set.
-The zero point (the origin) can be created using
-
-	__isl_give isl_point *isl_point_zero(__isl_take isl_dim *dim);
-
-The coordinates of a point can be inspected, set and changed
-using
-
-	void isl_point_get_coordinate(__isl_keep isl_point *pnt,
-		enum isl_dim_type type, int pos, isl_int *v);
-	__isl_give isl_point *isl_point_set_coordinate(
-		__isl_take isl_point *pnt,
-		enum isl_dim_type type, int pos, isl_int v);
-
-	__isl_give isl_point *isl_point_add_ui(
-		__isl_take isl_point *pnt,
-		enum isl_dim_type type, int pos, unsigned val);
-	__isl_give isl_point *isl_point_sub_ui(
-		__isl_take isl_point *pnt,
-		enum isl_dim_type type, int pos, unsigned val);
-
-Other properties can be obtained using
-
-	isl_ctx *isl_point_get_ctx(__isl_keep isl_point *pnt);
-
-Points can be copied or freed using
-
-	__isl_give isl_point *isl_point_copy(
-		__isl_keep isl_point *pnt);
-	void isl_point_free(__isl_take isl_point *pnt);
-
-A singleton set can be created from a point using
-
-	__isl_give isl_basic_set *isl_basic_set_from_point(
-		__isl_take isl_point *pnt);
-	__isl_give isl_set *isl_set_from_point(
-		__isl_take isl_point *pnt);
-
-and a box can be created from two opposite extremal points using
-
-	__isl_give isl_basic_set *isl_basic_set_box_from_points(
-		__isl_take isl_point *pnt1,
-		__isl_take isl_point *pnt2);
-	__isl_give isl_set *isl_set_box_from_points(
-		__isl_take isl_point *pnt1,
-		__isl_take isl_point *pnt2);
-
-All elements of a B<bounded> (union) set can be enumerated using
-the following functions.
-
-	int isl_set_foreach_point(__isl_keep isl_set *set,
-		int (*fn)(__isl_take isl_point *pnt, void *user),
-		void *user);
-	int isl_union_set_foreach_point(__isl_keep isl_union_set *uset,
-		int (*fn)(__isl_take isl_point *pnt, void *user),
-		void *user);
-
-The function C<fn> is called for each integer point in
-C<set> with as second argument the last argument of
-the C<isl_set_foreach_point> call.  The function C<fn>
-should return C<0> on success and C<-1> on failure.
-In the latter case, C<isl_set_foreach_point> will stop
-enumerating and return C<-1> as well.
-If the enumeration is performed successfully and to completion,
-then C<isl_set_foreach_point> returns C<0>.
-
-To obtain a single point of a (basic) set, use
-
-	__isl_give isl_point *isl_basic_set_sample_point(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_point *isl_set_sample_point(
-		__isl_take isl_set *set);
-
-If C<set> does not contain any (integer) points, then the
-resulting point will be ``void'', a property that can be
-tested using
-
-	int isl_point_is_void(__isl_keep isl_point *pnt);
-
-=head2 Piecewise Quasipolynomials
-
-A piecewise quasipolynomial is a particular kind of function that maps
-a parametric point to a rational value.
-More specifically, a quasipolynomial is a polynomial expression in greatest
-integer parts of affine expressions of parameters and variables.
-A piecewise quasipolynomial is a subdivision of a given parametric
-domain into disjoint cells with a quasipolynomial associated to
-each cell.  The value of the piecewise quasipolynomial at a given
-point is the value of the quasipolynomial associated to the cell
-that contains the point.  Outside of the union of cells,
-the value is assumed to be zero.
-For example, the piecewise quasipolynomial
-
-	[n] -> { [x] -> ((1 + n) - x) : x <= n and x >= 0 }
-
-maps C<x> to C<1 + n - x> for values of C<x> between C<0> and C<n>.
-A given piecewise quasipolynomial has a fixed domain dimension.
-Union piecewise quasipolynomials are used to contain piecewise quasipolynomials
-defined over different domains.
-Piecewise quasipolynomials are mainly used by the C<barvinok>
-library for representing the number of elements in a parametric set or map.
-For example, the piecewise quasipolynomial above represents
-the number of points in the map
-
-	[n] -> { [x] -> [y] : x,y >= 0 and 0 <= x + y <= n }
-
-=head3 Printing (Piecewise) Quasipolynomials
-
-Quasipolynomials and piecewise quasipolynomials can be printed
-using the following functions.
-
-	__isl_give isl_printer *isl_printer_print_qpolynomial(
-		__isl_take isl_printer *p,
-		__isl_keep isl_qpolynomial *qp);
-
-	__isl_give isl_printer *isl_printer_print_pw_qpolynomial(
-		__isl_take isl_printer *p,
-		__isl_keep isl_pw_qpolynomial *pwqp);
-
-	__isl_give isl_printer *isl_printer_print_union_pw_qpolynomial(
-		__isl_take isl_printer *p,
-		__isl_keep isl_union_pw_qpolynomial *upwqp);
-
-The output format of the printer
-needs to be set to either C<ISL_FORMAT_ISL> or C<ISL_FORMAT_C>.
-For C<isl_printer_print_union_pw_qpolynomial>, only C<ISL_FORMAT_ISL>
-is supported.
-In case of printing in C<ISL_FORMAT_C>, the user may want
-to set the names of all dimensions
-
-	__isl_give isl_qpolynomial *isl_qpolynomial_set_dim_name(
-		__isl_take isl_qpolynomial *qp,
-		enum isl_dim_type type, unsigned pos,
-		const char *s);
-	__isl_give isl_pw_qpolynomial *
-	isl_pw_qpolynomial_set_dim_name(
-		__isl_take isl_pw_qpolynomial *pwqp,
-		enum isl_dim_type type, unsigned pos,
-		const char *s);
-
-=head3 Creating New (Piecewise) Quasipolynomials
-
-Some simple quasipolynomials can be created using the following functions.
-More complicated quasipolynomials can be created by applying
-operations such as addition and multiplication
-on the resulting quasipolynomials
-
-	__isl_give isl_qpolynomial *isl_qpolynomial_zero(
-		__isl_take isl_dim *dim);
-	__isl_give isl_qpolynomial *isl_qpolynomial_one(
-		__isl_take isl_dim *dim);
-	__isl_give isl_qpolynomial *isl_qpolynomial_infty(
-		__isl_take isl_dim *dim);
-	__isl_give isl_qpolynomial *isl_qpolynomial_neginfty(
-		__isl_take isl_dim *dim);
-	__isl_give isl_qpolynomial *isl_qpolynomial_nan(
-		__isl_take isl_dim *dim);
-	__isl_give isl_qpolynomial *isl_qpolynomial_rat_cst(
-		__isl_take isl_dim *dim,
-		const isl_int n, const isl_int d);
-	__isl_give isl_qpolynomial *isl_qpolynomial_div(
-		__isl_take isl_div *div);
-	__isl_give isl_qpolynomial *isl_qpolynomial_var(
-		__isl_take isl_dim *dim,
-		enum isl_dim_type type, unsigned pos);
-	__isl_give isl_qpolynomial *isl_qpolynomial_from_aff(
-		__isl_take isl_aff *aff);
-
-The zero piecewise quasipolynomial or a piecewise quasipolynomial
-with a single cell can be created using the following functions.
-Multiple of these single cell piecewise quasipolynomials can
-be combined to create more complicated piecewise quasipolynomials.
-
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_zero(
-		__isl_take isl_dim *dim);
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_alloc(
-		__isl_take isl_set *set,
-		__isl_take isl_qpolynomial *qp);
-
-	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_zero(
-		__isl_take isl_dim *dim);
-	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_from_pw_qpolynomial(
-		__isl_take isl_pw_qpolynomial *pwqp);
-	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_add_pw_qpolynomial(
-		__isl_take isl_union_pw_qpolynomial *upwqp,
-		__isl_take isl_pw_qpolynomial *pwqp);
-
-Quasipolynomials can be copied and freed again using the following
-functions.
-
-	__isl_give isl_qpolynomial *isl_qpolynomial_copy(
-		__isl_keep isl_qpolynomial *qp);
-	void isl_qpolynomial_free(__isl_take isl_qpolynomial *qp);
-
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_copy(
-		__isl_keep isl_pw_qpolynomial *pwqp);
-	void *isl_pw_qpolynomial_free(
-		__isl_take isl_pw_qpolynomial *pwqp);
-
-	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_copy(
-		__isl_keep isl_union_pw_qpolynomial *upwqp);
-	void isl_union_pw_qpolynomial_free(
-		__isl_take isl_union_pw_qpolynomial *upwqp);
-
-=head3 Inspecting (Piecewise) Quasipolynomials
-
-To iterate over all piecewise quasipolynomials in a union
-piecewise quasipolynomial, use the following function
-
-	int isl_union_pw_qpolynomial_foreach_pw_qpolynomial(
-		__isl_keep isl_union_pw_qpolynomial *upwqp,
-		int (*fn)(__isl_take isl_pw_qpolynomial *pwqp, void *user),
-		void *user);
-
-To extract the piecewise quasipolynomial from a union with a given dimension
-specification, use
-
-	__isl_give isl_pw_qpolynomial *
-	isl_union_pw_qpolynomial_extract_pw_qpolynomial(
-		__isl_keep isl_union_pw_qpolynomial *upwqp,
-		__isl_take isl_dim *dim);
-
-To iterate over the cells in a piecewise quasipolynomial,
-use either of the following two functions
-
-	int isl_pw_qpolynomial_foreach_piece(
-		__isl_keep isl_pw_qpolynomial *pwqp,
-		int (*fn)(__isl_take isl_set *set,
-			  __isl_take isl_qpolynomial *qp,
-			  void *user), void *user);
-	int isl_pw_qpolynomial_foreach_lifted_piece(
-		__isl_keep isl_pw_qpolynomial *pwqp,
-		int (*fn)(__isl_take isl_set *set,
-			  __isl_take isl_qpolynomial *qp,
-			  void *user), void *user);
-
-As usual, the function C<fn> should return C<0> on success
-and C<-1> on failure.  The difference between
-C<isl_pw_qpolynomial_foreach_piece> and
-C<isl_pw_qpolynomial_foreach_lifted_piece> is that
-C<isl_pw_qpolynomial_foreach_lifted_piece> will first
-compute unique representations for all existentially quantified
-variables and then turn these existentially quantified variables
-into extra set variables, adapting the associated quasipolynomial
-accordingly.  This means that the C<set> passed to C<fn>
-will not have any existentially quantified variables, but that
-the dimensions of the sets may be different for different
-invocations of C<fn>.
-
-To iterate over all terms in a quasipolynomial,
-use
-
-	int isl_qpolynomial_foreach_term(
-		__isl_keep isl_qpolynomial *qp,
-		int (*fn)(__isl_take isl_term *term,
-			  void *user), void *user);
-
-The terms themselves can be inspected and freed using
-these functions
-
-	unsigned isl_term_dim(__isl_keep isl_term *term,
-		enum isl_dim_type type);
-	void isl_term_get_num(__isl_keep isl_term *term,
-		isl_int *n);
-	void isl_term_get_den(__isl_keep isl_term *term,
-		isl_int *d);
-	int isl_term_get_exp(__isl_keep isl_term *term,
-		enum isl_dim_type type, unsigned pos);
-	__isl_give isl_div *isl_term_get_div(
-		__isl_keep isl_term *term, unsigned pos);
-	void isl_term_free(__isl_take isl_term *term);
-
-Each term is a product of parameters, set variables and
-integer divisions.  The function C<isl_term_get_exp>
-returns the exponent of a given dimensions in the given term.
-The C<isl_int>s in the arguments of C<isl_term_get_num>
-and C<isl_term_get_den> need to have been initialized
-using C<isl_int_init> before calling these functions.
-
-=head3 Properties of (Piecewise) Quasipolynomials
-
-To check whether a quasipolynomial is actually a constant,
-use the following function.
-
-	int isl_qpolynomial_is_cst(__isl_keep isl_qpolynomial *qp,
-		isl_int *n, isl_int *d);
-
-If C<qp> is a constant and if C<n> and C<d> are not C<NULL>
-then the numerator and denominator of the constant
-are returned in C<*n> and C<*d>, respectively.
-
-=head3 Operations on (Piecewise) Quasipolynomials
-
-	__isl_give isl_qpolynomial *isl_qpolynomial_scale(
-		__isl_take isl_qpolynomial *qp, isl_int v);
-	__isl_give isl_qpolynomial *isl_qpolynomial_neg(
-		__isl_take isl_qpolynomial *qp);
-	__isl_give isl_qpolynomial *isl_qpolynomial_add(
-		__isl_take isl_qpolynomial *qp1,
-		__isl_take isl_qpolynomial *qp2);
-	__isl_give isl_qpolynomial *isl_qpolynomial_sub(
-		__isl_take isl_qpolynomial *qp1,
-		__isl_take isl_qpolynomial *qp2);
-	__isl_give isl_qpolynomial *isl_qpolynomial_mul(
-		__isl_take isl_qpolynomial *qp1,
-		__isl_take isl_qpolynomial *qp2);
-	__isl_give isl_qpolynomial *isl_qpolynomial_pow(
-		__isl_take isl_qpolynomial *qp, unsigned exponent);
-
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add(
-		__isl_take isl_pw_qpolynomial *pwqp1,
-		__isl_take isl_pw_qpolynomial *pwqp2);
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_sub(
-		__isl_take isl_pw_qpolynomial *pwqp1,
-		__isl_take isl_pw_qpolynomial *pwqp2);
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add_disjoint(
-		__isl_take isl_pw_qpolynomial *pwqp1,
-		__isl_take isl_pw_qpolynomial *pwqp2);
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_neg(
-		__isl_take isl_pw_qpolynomial *pwqp);
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_mul(
-		__isl_take isl_pw_qpolynomial *pwqp1,
-		__isl_take isl_pw_qpolynomial *pwqp2);
-
-	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_add(
-		__isl_take isl_union_pw_qpolynomial *upwqp1,
-		__isl_take isl_union_pw_qpolynomial *upwqp2);
-	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_sub(
-		__isl_take isl_union_pw_qpolynomial *upwqp1,
-		__isl_take isl_union_pw_qpolynomial *upwqp2);
-	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_mul(
-		__isl_take isl_union_pw_qpolynomial *upwqp1,
-		__isl_take isl_union_pw_qpolynomial *upwqp2);
-
-	__isl_give isl_qpolynomial *isl_pw_qpolynomial_eval(
-		__isl_take isl_pw_qpolynomial *pwqp,
-		__isl_take isl_point *pnt);
-
-	__isl_give isl_qpolynomial *isl_union_pw_qpolynomial_eval(
-		__isl_take isl_union_pw_qpolynomial *upwqp,
-		__isl_take isl_point *pnt);
-
-	__isl_give isl_set *isl_pw_qpolynomial_domain(
-		__isl_take isl_pw_qpolynomial *pwqp);
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_intersect_domain(
-		__isl_take isl_pw_qpolynomial *pwpq,
-		__isl_take isl_set *set);
-
-	__isl_give isl_union_set *isl_union_pw_qpolynomial_domain(
-		__isl_take isl_union_pw_qpolynomial *upwqp);
-	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_intersect_domain(
-		__isl_take isl_union_pw_qpolynomial *upwpq,
-		__isl_take isl_union_set *uset);
-
-	__isl_give isl_qpolynomial *isl_qpolynomial_align_params(
-		__isl_take isl_qpolynomial *qp,
-		__isl_take isl_dim *model);
-
-	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_coalesce(
-		__isl_take isl_union_pw_qpolynomial *upwqp);
-
-	__isl_give isl_qpolynomial *isl_qpolynomial_gist(
-		__isl_take isl_qpolynomial *qp,
-		__isl_take isl_set *context);
-
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_gist(
-		__isl_take isl_pw_qpolynomial *pwqp,
-		__isl_take isl_set *context);
-
-	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_gist(
-		__isl_take isl_union_pw_qpolynomial *upwqp,
-		__isl_take isl_union_set *context);
-
-The gist operation applies the gist operation to each of
-the cells in the domain of the input piecewise quasipolynomial.
-The context is also exploited
-to simplify the quasipolynomials associated to each cell.
-
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_to_polynomial(
-		__isl_take isl_pw_qpolynomial *pwqp, int sign);
-	__isl_give isl_union_pw_qpolynomial *
-	isl_union_pw_qpolynomial_to_polynomial(
-		__isl_take isl_union_pw_qpolynomial *upwqp, int sign);
-
-Approximate each quasipolynomial by a polynomial.  If C<sign> is positive,
-the polynomial will be an overapproximation.  If C<sign> is negative,
-it will be an underapproximation.  If C<sign> is zero, the approximation
-will lie somewhere in between.
-
-=head2 Bounds on Piecewise Quasipolynomials and Piecewise Quasipolynomial Reductions
-
-A piecewise quasipolynomial reduction is a piecewise
-reduction (or fold) of quasipolynomials.
-In particular, the reduction can be maximum or a minimum.
-The objects are mainly used to represent the result of
-an upper or lower bound on a quasipolynomial over its domain,
-i.e., as the result of the following function.
-
-	__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_bound(
-		__isl_take isl_pw_qpolynomial *pwqp,
-		enum isl_fold type, int *tight);
-
-	__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_bound(
-		__isl_take isl_union_pw_qpolynomial *upwqp,
-		enum isl_fold type, int *tight);
-
-The C<type> argument may be either C<isl_fold_min> or C<isl_fold_max>.
-If C<tight> is not C<NULL>, then C<*tight> is set to C<1>
-is the returned bound is known be tight, i.e., for each value
-of the parameters there is at least
-one element in the domain that reaches the bound.
-If the domain of C<pwqp> is not wrapping, then the bound is computed
-over all elements in that domain and the result has a purely parametric
-domain.  If the domain of C<pwqp> is wrapping, then the bound is
-computed over the range of the wrapped relation.  The domain of the
-wrapped relation becomes the domain of the result.
-
-A (piecewise) quasipolynomial reduction can be copied or freed using the
-following functions.
-
-	__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_copy(
-		__isl_keep isl_qpolynomial_fold *fold);
-	__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_copy(
-		__isl_keep isl_pw_qpolynomial_fold *pwf);
-	__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_copy(
-		__isl_keep isl_union_pw_qpolynomial_fold *upwf);
-	void isl_qpolynomial_fold_free(
-		__isl_take isl_qpolynomial_fold *fold);
-	void *isl_pw_qpolynomial_fold_free(
-		__isl_take isl_pw_qpolynomial_fold *pwf);
-	void isl_union_pw_qpolynomial_fold_free(
-		__isl_take isl_union_pw_qpolynomial_fold *upwf);
-
-=head3 Printing Piecewise Quasipolynomial Reductions
-
-Piecewise quasipolynomial reductions can be printed
-using the following function.
-
-	__isl_give isl_printer *isl_printer_print_pw_qpolynomial_fold(
-		__isl_take isl_printer *p,
-		__isl_keep isl_pw_qpolynomial_fold *pwf);
-	__isl_give isl_printer *isl_printer_print_union_pw_qpolynomial_fold(
-		__isl_take isl_printer *p,
-		__isl_keep isl_union_pw_qpolynomial_fold *upwf);
-
-For C<isl_printer_print_pw_qpolynomial_fold>,
-output format of the printer
-needs to be set to either C<ISL_FORMAT_ISL> or C<ISL_FORMAT_C>.
-For C<isl_printer_print_union_pw_qpolynomial_fold>,
-output format of the printer
-needs to be set to C<ISL_FORMAT_ISL>.
-In case of printing in C<ISL_FORMAT_C>, the user may want
-to set the names of all dimensions
-
-	__isl_give isl_pw_qpolynomial_fold *
-	isl_pw_qpolynomial_fold_set_dim_name(
-		__isl_take isl_pw_qpolynomial_fold *pwf,
-		enum isl_dim_type type, unsigned pos,
-		const char *s);
-
-=head3 Inspecting (Piecewise) Quasipolynomial Reductions
-
-To iterate over all piecewise quasipolynomial reductions in a union
-piecewise quasipolynomial reduction, use the following function
-
-	int isl_union_pw_qpolynomial_fold_foreach_pw_qpolynomial_fold(
-		__isl_keep isl_union_pw_qpolynomial_fold *upwf,
-		int (*fn)(__isl_take isl_pw_qpolynomial_fold *pwf,
-			    void *user), void *user);
-
-To iterate over the cells in a piecewise quasipolynomial reduction,
-use either of the following two functions
-
-	int isl_pw_qpolynomial_fold_foreach_piece(
-		__isl_keep isl_pw_qpolynomial_fold *pwf,
-		int (*fn)(__isl_take isl_set *set,
-			  __isl_take isl_qpolynomial_fold *fold,
-			  void *user), void *user);
-	int isl_pw_qpolynomial_fold_foreach_lifted_piece(
-		__isl_keep isl_pw_qpolynomial_fold *pwf,
-		int (*fn)(__isl_take isl_set *set,
-			  __isl_take isl_qpolynomial_fold *fold,
-			  void *user), void *user);
-
-See L<Inspecting (Piecewise) Quasipolynomials> for an explanation
-of the difference between these two functions.
-
-To iterate over all quasipolynomials in a reduction, use
-
-	int isl_qpolynomial_fold_foreach_qpolynomial(
-		__isl_keep isl_qpolynomial_fold *fold,
-		int (*fn)(__isl_take isl_qpolynomial *qp,
-			  void *user), void *user);
-
-=head3 Operations on Piecewise Quasipolynomial Reductions
-
-	__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale(
-		__isl_take isl_qpolynomial_fold *fold, isl_int v);
-
-	__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_add(
-		__isl_take isl_pw_qpolynomial_fold *pwf1,
-		__isl_take isl_pw_qpolynomial_fold *pwf2);
-
-	__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_fold(
-		__isl_take isl_pw_qpolynomial_fold *pwf1,
-		__isl_take isl_pw_qpolynomial_fold *pwf2);
-
-	__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_fold(
-		__isl_take isl_union_pw_qpolynomial_fold *upwf1,
-		__isl_take isl_union_pw_qpolynomial_fold *upwf2);
-
-	__isl_give isl_qpolynomial *isl_pw_qpolynomial_fold_eval(
-		__isl_take isl_pw_qpolynomial_fold *pwf,
-		__isl_take isl_point *pnt);
-
-	__isl_give isl_qpolynomial *isl_union_pw_qpolynomial_fold_eval(
-		__isl_take isl_union_pw_qpolynomial_fold *upwf,
-		__isl_take isl_point *pnt);
-
-	__isl_give isl_union_set *isl_union_pw_qpolynomial_fold_domain(
-		__isl_take isl_union_pw_qpolynomial_fold *upwf);
-	__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_intersect_domain(
-		__isl_take isl_union_pw_qpolynomial_fold *upwf,
-		__isl_take isl_union_set *uset);
-
-	__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_coalesce(
-		__isl_take isl_pw_qpolynomial_fold *pwf);
-
-	__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_coalesce(
-		__isl_take isl_union_pw_qpolynomial_fold *upwf);
-
-	__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_gist(
-		__isl_take isl_pw_qpolynomial_fold *pwf,
-		__isl_take isl_set *context);
-
-	__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_gist(
-		__isl_take isl_union_pw_qpolynomial_fold *upwf,
-		__isl_take isl_union_set *context);
-
-The gist operation applies the gist operation to each of
-the cells in the domain of the input piecewise quasipolynomial reduction.
-In future, the operation will also exploit the context
-to simplify the quasipolynomial reductions associated to each cell.
-
-	__isl_give isl_pw_qpolynomial_fold *
-	isl_set_apply_pw_qpolynomial_fold(
-		__isl_take isl_set *set,
-		__isl_take isl_pw_qpolynomial_fold *pwf,
-		int *tight);
-	__isl_give isl_pw_qpolynomial_fold *
-	isl_map_apply_pw_qpolynomial_fold(
-		__isl_take isl_map *map,
-		__isl_take isl_pw_qpolynomial_fold *pwf,
-		int *tight);
-	__isl_give isl_union_pw_qpolynomial_fold *
-	isl_union_set_apply_union_pw_qpolynomial_fold(
-		__isl_take isl_union_set *uset,
-		__isl_take isl_union_pw_qpolynomial_fold *upwf,
-		int *tight);
-	__isl_give isl_union_pw_qpolynomial_fold *
-	isl_union_map_apply_union_pw_qpolynomial_fold(
-		__isl_take isl_union_map *umap,
-		__isl_take isl_union_pw_qpolynomial_fold *upwf,
-		int *tight);
-
-The functions taking a map
-compose the given map with the given piecewise quasipolynomial reduction.
-That is, compute a bound (of the same type as C<pwf> or C<upwf> itself)
-over all elements in the intersection of the range of the map
-and the domain of the piecewise quasipolynomial reduction
-as a function of an element in the domain of the map.
-The functions taking a set compute a bound over all elements in the
-intersection of the set and the domain of the
-piecewise quasipolynomial reduction.
-
-=head2 Dependence Analysis
-
-C<isl> contains specialized functionality for performing
-array dataflow analysis.  That is, given a I<sink> access relation
-and a collection of possible I<source> access relations,
-C<isl> can compute relations that describe
-for each iteration of the sink access, which iteration
-of which of the source access relations was the last
-to access the same data element before the given iteration
-of the sink access.
-To compute standard flow dependences, the sink should be
-a read, while the sources should be writes.
-If any of the source accesses are marked as being I<may>
-accesses, then there will be a dependence to the last
-I<must> access B<and> to any I<may> access that follows
-this last I<must> access.
-In particular, if I<all> sources are I<may> accesses,
-then memory based dependence analysis is performed.
-If, on the other hand, all sources are I<must> accesses,
-then value based dependence analysis is performed.
-
-	#include <isl/flow.h>
-
-	typedef int (*isl_access_level_before)(void *first, void *second);
-
-	__isl_give isl_access_info *isl_access_info_alloc(
-		__isl_take isl_map *sink,
-		void *sink_user, isl_access_level_before fn,
-		int max_source);
-	__isl_give isl_access_info *isl_access_info_add_source(
-		__isl_take isl_access_info *acc,
-		__isl_take isl_map *source, int must,
-		void *source_user);
-	void isl_access_info_free(__isl_take isl_access_info *acc);
-
-	__isl_give isl_flow *isl_access_info_compute_flow(
-		__isl_take isl_access_info *acc);
-
-	int isl_flow_foreach(__isl_keep isl_flow *deps,
-		int (*fn)(__isl_take isl_map *dep, int must,
-			  void *dep_user, void *user),
-		void *user);
-	__isl_give isl_map *isl_flow_get_no_source(
-		__isl_keep isl_flow *deps, int must);
-	void isl_flow_free(__isl_take isl_flow *deps);
-
-The function C<isl_access_info_compute_flow> performs the actual
-dependence analysis.  The other functions are used to construct
-the input for this function or to read off the output.
-
-The input is collected in an C<isl_access_info>, which can
-be created through a call to C<isl_access_info_alloc>.
-The arguments to this functions are the sink access relation
-C<sink>, a token C<sink_user> used to identify the sink
-access to the user, a callback function for specifying the
-relative order of source and sink accesses, and the number
-of source access relations that will be added.
-The callback function has type C<int (*)(void *first, void *second)>.
-The function is called with two user supplied tokens identifying
-either a source or the sink and it should return the shared nesting
-level and the relative order of the two accesses.
-In particular, let I<n> be the number of loops shared by
-the two accesses.  If C<first> precedes C<second> textually,
-then the function should return I<2 * n + 1>; otherwise,
-it should return I<2 * n>.
-The sources can be added to the C<isl_access_info> by performing
-(at most) C<max_source> calls to C<isl_access_info_add_source>.
-C<must> indicates whether the source is a I<must> access
-or a I<may> access.  Note that a multi-valued access relation
-should only be marked I<must> if every iteration in the domain
-of the relation accesses I<all> elements in its image.
-The C<source_user> token is again used to identify
-the source access.  The range of the source access relation
-C<source> should have the same dimension as the range
-of the sink access relation.
-The C<isl_access_info_free> function should usually not be
-called explicitly, because it is called implicitly by
-C<isl_access_info_compute_flow>.
-
-The result of the dependence analysis is collected in an
-C<isl_flow>.  There may be elements of
-the sink access for which no preceding source access could be
-found or for which all preceding sources are I<may> accesses.
-The relations containing these elements can be obtained through
-calls to C<isl_flow_get_no_source>, the first with C<must> set
-and the second with C<must> unset.
-In the case of standard flow dependence analysis,
-with the sink a read and the sources I<must> writes,
-the first relation corresponds to the reads from uninitialized
-array elements and the second relation is empty.
-The actual flow dependences can be extracted using
-C<isl_flow_foreach>.  This function will call the user-specified
-callback function C<fn> for each B<non-empty> dependence between
-a source and the sink.  The callback function is called
-with four arguments, the actual flow dependence relation
-mapping source iterations to sink iterations, a boolean that
-indicates whether it is a I<must> or I<may> dependence, a token
-identifying the source and an additional C<void *> with value
-equal to the third argument of the C<isl_flow_foreach> call.
-A dependence is marked I<must> if it originates from a I<must>
-source and if it is not followed by any I<may> sources.
-
-After finishing with an C<isl_flow>, the user should call
-C<isl_flow_free> to free all associated memory.
-
-A higher-level interface to dependence analysis is provided
-by the following function.
-
-	#include <isl/flow.h>
-
-	int isl_union_map_compute_flow(__isl_take isl_union_map *sink,
-		__isl_take isl_union_map *must_source,
-		__isl_take isl_union_map *may_source,
-		__isl_take isl_union_map *schedule,
-		__isl_give isl_union_map **must_dep,
-		__isl_give isl_union_map **may_dep,
-		__isl_give isl_union_map **must_no_source,
-		__isl_give isl_union_map **may_no_source);
-
-The arrays are identified by the tuple names of the ranges
-of the accesses.  The iteration domains by the tuple names
-of the domains of the accesses and of the schedule.
-The relative order of the iteration domains is given by the
-schedule.  The relations returned through C<must_no_source>
-and C<may_no_source> are subsets of C<sink>.
-Any of C<must_dep>, C<may_dep>, C<must_no_source>
-or C<may_no_source> may be C<NULL>, but a C<NULL> value for
-any of the other arguments is treated as an error.
-
-=head2 Scheduling
-
-B<The functionality described in this section is fairly new
-and may be subject to change.>
-
-The following function can be used to compute a schedule
-for a union of domains.  The generated schedule respects
-all C<validity> dependences.  That is, all dependence distances
-over these dependences in the scheduled space are lexicographically
-positive.  The generated schedule schedule also tries to minimize
-the dependence distances over C<proximity> dependences.
-Moreover, it tries to obtain sequences (bands) of schedule dimensions
-for groups of domains where the dependence distances have only
-non-negative values.
-The algorithm used to construct the schedule is similar to that
-of C<Pluto>.
-
-	#include <isl/schedule.h>
-	__isl_give isl_schedule *isl_union_set_compute_schedule(
-		__isl_take isl_union_set *domain,
-		__isl_take isl_union_map *validity,
-		__isl_take isl_union_map *proximity);
-	void *isl_schedule_free(__isl_take isl_schedule *sched);
-
-A mapping from the domains to the scheduled space can be obtained
-from an C<isl_schedule> using the following function.
-
-	__isl_give isl_union_map *isl_schedule_get_map(
-		__isl_keep isl_schedule *sched);
-
-A representation of the schedule can be printed using
-	 
-	__isl_give isl_printer *isl_printer_print_schedule(
-		__isl_take isl_printer *p,
-		__isl_keep isl_schedule *schedule);
-
-A representation of the schedule as a forest of bands can be obtained
-using the following function.
-
-	__isl_give isl_band_list *isl_schedule_get_band_forest(
-		__isl_keep isl_schedule *schedule);
-
-The list can be manipulated as explained in L<"Lists">.
-The bands inside the list can be copied and freed using the following
-functions.
-
-	#include <isl/band.h>
-	__isl_give isl_band *isl_band_copy(
-		__isl_keep isl_band *band);
-	void *isl_band_free(__isl_take isl_band *band);
-
-Each band contains zero or more scheduling dimensions.
-These are referred to as the members of the band.
-The section of the schedule that corresponds to the band is
-referred to as the partial schedule of the band.
-For those nodes that participate in a band, the outer scheduling
-dimensions form the prefix schedule, while the inner scheduling
-dimensions form the suffix schedule.
-That is, if we take a cut of the band forest, then the union of
-the concatenations of the prefix, partial and suffix schedules of
-each band in the cut is equal to the entire schedule (modulo
-some possible padding at the end with zero scheduling dimensions).
-The properties of a band can be inspected using the following functions.
-
-	#include <isl/band.h>
-	isl_ctx *isl_band_get_ctx(__isl_keep isl_band *band);
-
-	int isl_band_has_children(__isl_keep isl_band *band);
-	__isl_give isl_band_list *isl_band_get_children(
-		__isl_keep isl_band *band);
-
-	__isl_give isl_union_map *isl_band_get_prefix_schedule(
-		__isl_keep isl_band *band);
-	__isl_give isl_union_map *isl_band_get_partial_schedule(
-		__isl_keep isl_band *band);
-	__isl_give isl_union_map *isl_band_get_suffix_schedule(
-		__isl_keep isl_band *band);
-
-	int isl_band_n_member(__isl_keep isl_band *band);
-	int isl_band_member_is_zero_distance(
-		__isl_keep isl_band *band, int pos);
-
-Note that a scheduling dimension is considered to be ``zero
-distance'' if it does not carry any proximity dependences
-within its band.
-That is, if the dependence distances of the proximity
-dependences are all zero in that direction (for fixed
-iterations of outer bands).
-
-A representation of the band can be printed using
-
-	#include <isl/band.h>
-	__isl_give isl_printer *isl_printer_print_band(
-		__isl_take isl_printer *p,
-		__isl_keep isl_band *band);
-
-=head2 Parametric Vertex Enumeration
-
-The parametric vertex enumeration described in this section
-is mainly intended to be used internally and by the C<barvinok>
-library.
-
-	#include <isl/vertices.h>
-	__isl_give isl_vertices *isl_basic_set_compute_vertices(
-		__isl_keep isl_basic_set *bset);
-
-The function C<isl_basic_set_compute_vertices> performs the
-actual computation of the parametric vertices and the chamber
-decomposition and store the result in an C<isl_vertices> object.
-This information can be queried by either iterating over all
-the vertices or iterating over all the chambers or cells
-and then iterating over all vertices that are active on the chamber.
-
-	int isl_vertices_foreach_vertex(
-		__isl_keep isl_vertices *vertices,
-		int (*fn)(__isl_take isl_vertex *vertex, void *user),
-		void *user);
-
-	int isl_vertices_foreach_cell(
-		__isl_keep isl_vertices *vertices,
-		int (*fn)(__isl_take isl_cell *cell, void *user),
-		void *user);
-	int isl_cell_foreach_vertex(__isl_keep isl_cell *cell,
-		int (*fn)(__isl_take isl_vertex *vertex, void *user),
-		void *user);
-
-Other operations that can be performed on an C<isl_vertices> object are
-the following.
-
-	isl_ctx *isl_vertices_get_ctx(
-		__isl_keep isl_vertices *vertices);
-	int isl_vertices_get_n_vertices(
-		__isl_keep isl_vertices *vertices);
-	void isl_vertices_free(__isl_take isl_vertices *vertices);
-
-Vertices can be inspected and destroyed using the following functions.
-
-	isl_ctx *isl_vertex_get_ctx(__isl_keep isl_vertex *vertex);
-	int isl_vertex_get_id(__isl_keep isl_vertex *vertex);
-	__isl_give isl_basic_set *isl_vertex_get_domain(
-		__isl_keep isl_vertex *vertex);
-	__isl_give isl_basic_set *isl_vertex_get_expr(
-		__isl_keep isl_vertex *vertex);
-	void isl_vertex_free(__isl_take isl_vertex *vertex);
-
-C<isl_vertex_get_expr> returns a singleton parametric set describing
-the vertex, while C<isl_vertex_get_domain> returns the activity domain
-of the vertex.
-Note that C<isl_vertex_get_domain> and C<isl_vertex_get_expr> return
-B<rational> basic sets, so they should mainly be used for inspection
-and should not be mixed with integer sets.
-
-Chambers can be inspected and destroyed using the following functions.
-
-	isl_ctx *isl_cell_get_ctx(__isl_keep isl_cell *cell);
-	__isl_give isl_basic_set *isl_cell_get_domain(
-		__isl_keep isl_cell *cell);
-	void isl_cell_free(__isl_take isl_cell *cell);
-
-=head1 Applications
-
-Although C<isl> is mainly meant to be used as a library,
-it also contains some basic applications that use some
-of the functionality of C<isl>.
-The input may be specified in either the L<isl format>
-or the L<PolyLib format>.
-
-=head2 C<isl_polyhedron_sample>
-
-C<isl_polyhedron_sample> takes a polyhedron as input and prints
-an integer element of the polyhedron, if there is any.
-The first column in the output is the denominator and is always
-equal to 1.  If the polyhedron contains no integer points,
-then a vector of length zero is printed.
-
-=head2 C<isl_pip>
-
-C<isl_pip> takes the same input as the C<example> program
-from the C<piplib> distribution, i.e., a set of constraints
-on the parameters, a line containing only -1 and finally a set
-of constraints on a parametric polyhedron.
-The coefficients of the parameters appear in the last columns
-(but before the final constant column).
-The output is the lexicographic minimum of the parametric polyhedron.
-As C<isl> currently does not have its own output format, the output
-is just a dump of the internal state.
-
-=head2 C<isl_polyhedron_minimize>
-
-C<isl_polyhedron_minimize> computes the minimum of some linear
-or affine objective function over the integer points in a polyhedron.
-If an affine objective function
-is given, then the constant should appear in the last column.
-
-=head2 C<isl_polytope_scan>
-
-Given a polytope, C<isl_polytope_scan> prints
-all integer points in the polytope.
diff --git a/cloog-0.16.3/isl/include/isl/aff.h b/cloog-0.16.3/isl/include/isl/aff.h
deleted file mode 100644
index ffeca4b..0000000
--- a/cloog-0.16.3/isl/include/isl/aff.h
+++ /dev/null
@@ -1,160 +0,0 @@
-#ifndef ISL_AFF_H
-#define ISL_AFF_H
-
-#include <isl/div.h>
-#include <isl/local_space.h>
-#include <isl/printer.h>
-#include <isl/set_type.h>
-#include <isl/aff_type.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-__isl_give isl_aff *isl_aff_zero(__isl_take isl_local_space *ls);
-
-__isl_give isl_aff *isl_aff_copy(__isl_keep isl_aff *aff);
-void *isl_aff_free(__isl_take isl_aff *aff);
-
-isl_ctx *isl_aff_get_ctx(__isl_keep isl_aff *aff);
-
-int isl_aff_dim(__isl_keep isl_aff *aff, enum isl_dim_type type);
-int isl_aff_involves_dims(__isl_keep isl_aff *aff,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-__isl_give isl_dim *isl_aff_get_dim(__isl_keep isl_aff *aff);
-__isl_give isl_local_space *isl_aff_get_local_space(__isl_keep isl_aff *aff);
-
-const char *isl_aff_get_dim_name(__isl_keep isl_aff *aff,
-	enum isl_dim_type type, unsigned pos);
-int isl_aff_get_constant(__isl_keep isl_aff *aff, isl_int *v);
-int isl_aff_get_coefficient(__isl_keep isl_aff *aff,
-	enum isl_dim_type type, int pos, isl_int *v);
-int isl_aff_get_denominator(__isl_keep isl_aff *aff, isl_int *v);
-__isl_give isl_aff *isl_aff_set_constant(__isl_take isl_aff *aff, isl_int v);
-__isl_give isl_aff *isl_aff_set_constant_si(__isl_take isl_aff *aff, int v);
-__isl_give isl_aff *isl_aff_set_coefficient(__isl_take isl_aff *aff,
-	enum isl_dim_type type, int pos, isl_int v);
-__isl_give isl_aff *isl_aff_set_coefficient_si(__isl_take isl_aff *aff,
-	enum isl_dim_type type, int pos, int v);
-__isl_give isl_aff *isl_aff_set_denominator(__isl_take isl_aff *aff, isl_int v);
-__isl_give isl_aff *isl_aff_add_constant(__isl_take isl_aff *aff, isl_int v);
-__isl_give isl_aff *isl_aff_add_constant_si(__isl_take isl_aff *aff, int v);
-__isl_give isl_aff *isl_aff_add_coefficient(__isl_take isl_aff *aff,
-	enum isl_dim_type type, int pos, isl_int v);
-__isl_give isl_aff *isl_aff_add_coefficient_si(__isl_take isl_aff *aff,
-	enum isl_dim_type type, int pos, int v);
-
-__isl_give isl_aff *isl_aff_set_dim_name(__isl_take isl_aff *aff,
-	enum isl_dim_type type, unsigned pos, const char *s);
-
-int isl_aff_plain_is_equal(__isl_keep isl_aff *aff1, __isl_keep isl_aff *aff2);
-int isl_aff_plain_is_zero(__isl_keep isl_aff *aff);
-
-__isl_give isl_div *isl_aff_get_div(__isl_keep isl_aff *aff, int pos);
-
-__isl_give isl_aff *isl_aff_neg(__isl_take isl_aff *aff);
-__isl_give isl_aff *isl_aff_ceil(__isl_take isl_aff *aff);
-__isl_give isl_aff *isl_aff_floor(__isl_take isl_aff *aff);
-
-__isl_give isl_aff *isl_aff_add(__isl_take isl_aff *aff1,
-	__isl_take isl_aff *aff2);
-__isl_give isl_aff *isl_aff_sub(__isl_take isl_aff *aff1,
-	__isl_take isl_aff *aff2);
-
-__isl_give isl_aff *isl_aff_scale(__isl_take isl_aff *aff, isl_int f);
-__isl_give isl_aff *isl_aff_scale_down(__isl_take isl_aff *aff, isl_int f);
-__isl_give isl_aff *isl_aff_scale_down_ui(__isl_take isl_aff *aff, unsigned f);
-
-__isl_give isl_aff *isl_aff_insert_dims(__isl_take isl_aff *aff,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_aff *isl_aff_add_dims(__isl_take isl_aff *aff,
-	enum isl_dim_type type, unsigned n);
-__isl_give isl_aff *isl_aff_drop_dims(__isl_take isl_aff *aff,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-__isl_give isl_aff *isl_aff_gist(__isl_take isl_aff *aff,
-	__isl_take isl_set *context);
-
-__isl_give isl_basic_set *isl_aff_ge_basic_set(__isl_take isl_aff *aff1,
-	__isl_take isl_aff *aff2);
-
-__isl_give isl_printer *isl_printer_print_aff(__isl_take isl_printer *p,
-	__isl_keep isl_aff *aff);
-void isl_aff_dump(__isl_keep isl_aff *aff);
-
-isl_ctx *isl_pw_aff_get_ctx(__isl_keep isl_pw_aff *pwaff);
-__isl_give isl_dim *isl_pw_aff_get_dim(__isl_keep isl_pw_aff *pwaff);
-
-__isl_give isl_pw_aff *isl_pw_aff_empty(__isl_take isl_dim *dim);
-__isl_give isl_pw_aff *isl_pw_aff_alloc(__isl_take isl_set *set,
-	__isl_take isl_aff *aff);
-
-int isl_pw_aff_is_empty(__isl_keep isl_pw_aff *pwaff);
-
-__isl_give isl_pw_aff *isl_pw_aff_max(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2);
-
-__isl_give isl_pw_aff *isl_pw_aff_copy(__isl_keep isl_pw_aff *pwaff);
-void *isl_pw_aff_free(__isl_take isl_pw_aff *pwaff);
-
-unsigned isl_pw_aff_dim(__isl_keep isl_pw_aff *pwaff, enum isl_dim_type type);
-int isl_pw_aff_involves_dims(__isl_keep isl_pw_aff *pwaff,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-__isl_give isl_pw_aff *isl_pw_aff_align_params(__isl_take isl_pw_aff *pwaff,
-	__isl_take isl_dim *model);
-
-__isl_give isl_set *isl_pw_aff_domain(__isl_take isl_pw_aff *pwaff);
-
-__isl_give isl_pw_aff *isl_pw_aff_add(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2);
-__isl_give isl_pw_aff *isl_pw_aff_sub(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2);
-__isl_give isl_pw_aff *isl_pw_aff_neg(__isl_take isl_pw_aff *pwaff);
-__isl_give isl_pw_aff *isl_pw_aff_ceil(__isl_take isl_pw_aff *pwaff);
-__isl_give isl_pw_aff *isl_pw_aff_floor(__isl_take isl_pw_aff *pwaff);
-
-__isl_give isl_pw_aff *isl_pw_aff_cond(__isl_take isl_set *cond,
-	__isl_take isl_pw_aff *pwaff_true, __isl_take isl_pw_aff *pwaff_false);
-
-__isl_give isl_pw_aff *isl_pw_aff_scale(__isl_take isl_pw_aff *pwaff,
-	isl_int f);
-__isl_give isl_pw_aff *isl_pw_aff_scale_down(__isl_take isl_pw_aff *pwaff,
-	isl_int f);
-
-__isl_give isl_pw_aff *isl_pw_aff_insert_dims(__isl_take isl_pw_aff *pwaff,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_pw_aff *isl_pw_aff_add_dims(__isl_take isl_pw_aff *pwaff,
-	enum isl_dim_type type, unsigned n);
-__isl_give isl_pw_aff *isl_pw_aff_drop_dims(__isl_take isl_pw_aff *pwaff,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-__isl_give isl_pw_aff *isl_pw_aff_coalesce(__isl_take isl_pw_aff *pwqp);
-__isl_give isl_pw_aff *isl_pw_aff_gist(__isl_take isl_pw_aff *pwaff,
-	__isl_take isl_set *context);
-
-__isl_give isl_map *isl_map_from_pw_aff(__isl_take isl_pw_aff *pwaff);
-
-__isl_give isl_set *isl_pw_aff_nonneg_set(__isl_take isl_pw_aff *pwaff);
-
-__isl_give isl_set *isl_pw_aff_eq_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2);
-__isl_give isl_set *isl_pw_aff_le_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2);
-__isl_give isl_set *isl_pw_aff_lt_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2);
-__isl_give isl_set *isl_pw_aff_ge_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2);
-__isl_give isl_set *isl_pw_aff_gt_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2);
-
-__isl_give isl_printer *isl_printer_print_pw_aff(__isl_take isl_printer *p,
-	__isl_keep isl_pw_aff *pwaff);
-void isl_pw_aff_dump(__isl_keep isl_pw_aff *pwaff);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/aff_type.h b/cloog-0.16.3/isl/include/isl/aff_type.h
deleted file mode 100644
index 549ec80..0000000
--- a/cloog-0.16.3/isl/include/isl/aff_type.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef ISL_AFF_TYPE_H
-#define ISL_AFF_TYPE_H
-
-struct isl_aff;
-typedef struct isl_aff isl_aff;
-
-struct isl_pw_aff;
-typedef struct isl_pw_aff isl_pw_aff;
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/arg.h b/cloog-0.16.3/isl/include/isl/arg.h
deleted file mode 100644
index d37e495..0000000
--- a/cloog-0.16.3/isl/include/isl/arg.h
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_ARG_H
-#define ISL_ARG_H
-
-#include <stddef.h>
-#include <stdlib.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_arg_choice {
-	const char	*name;
-	unsigned	 value;
-};
-
-struct isl_arg_flags {
-	const char	*name;
-	unsigned	 mask;
-	unsigned	 value;
-};
-
-enum isl_arg_type {
-	isl_arg_end,
-	isl_arg_alias,
-	isl_arg_arg,
-	isl_arg_bool,
-	isl_arg_child,
-	isl_arg_choice,
-	isl_arg_flags,
-	isl_arg_footer,
-	isl_arg_int,
-	isl_arg_user,
-	isl_arg_long,
-	isl_arg_ulong,
-	isl_arg_str,
-	isl_arg_version
-};
-
-struct isl_arg {
-	enum isl_arg_type	 type;
-	char			 short_name;
-	const char		*long_name;
-	const char		*argument_name;
-	size_t			 offset;
-	const char		*help_msg;
-#define ISL_ARG_SINGLE_DASH	(1 << 0)
-#define ISL_ARG_BOOL_ARG	(1 << 1)
-#define ISL_ARG_HIDDEN		(1 << 2)
-	unsigned		 flags;
-	union {
-	struct {
-		struct isl_arg_choice	*choice;
-		unsigned	 	 default_value;
-		unsigned	 	 default_selected;
-		int (*set)(void *opt, unsigned val);
-	} choice;
-	struct {
-		struct isl_arg_flags	*flags;
-		unsigned	 	 default_value;
-	} flags;
-	struct {
-		unsigned		 default_value;
-		int (*set)(void *opt, unsigned val);
-	} b;
-	struct {
-		int			default_value;
-	} i;
-	struct {
-		long		 	default_value;
-		long		 	default_selected;
-		int (*set)(void *opt, long val);
-	} l;
-	struct {
-		unsigned long		default_value;
-	} ul;
-	struct {
-		const char		*default_value;
-	} str;
-	struct {
-		struct isl_arg		*child;
-		size_t			 size;
-	} child;
-	struct {
-		void (*print_version)(void);
-	} version;
-	struct {
-		int (*init)(void*);
-		void (*clear)(void*);
-	} user;
-	} u;
-};
-
-#define ISL_ARG_ALIAS(l)	{					\
-	.type = isl_arg_alias,						\
-	.long_name = l,							\
-},
-#define ISL_ARG_ARG(st,f,a,d)	{					\
-	.type = isl_arg_arg,						\
-	.argument_name = a,						\
-	.offset = offsetof(st, f),					\
-	.u = { .str = { .default_value = d } }				\
-},
-#define ISL_ARG_FOOTER(h)	{					\
-	.type = isl_arg_footer,						\
-	.help_msg = h,							\
-},
-#define ISL_ARG_CHOICE(st,f,s,l,c,d,h)	{				\
-	.type = isl_arg_choice,						\
-	.short_name = s,						\
-	.long_name = l,							\
-	.offset = offsetof(st, f),					\
-	.help_msg = h,							\
-	.u = { .choice = { .choice = c, .default_value = d,		\
-			    .default_selected = d, .set = NULL } }	\
-},
-#define ISL_ARG_OPT_CHOICE(st,f,s,l,c,d,ds,h)	{			\
-	.type = isl_arg_choice,						\
-	.short_name = s,						\
-	.long_name = l,							\
-	.offset = offsetof(st, f),					\
-	.help_msg = h,							\
-	.u = { .choice = { .choice = c, .default_value = d,		\
-			    .default_selected = ds, .set = NULL } }	\
-},
-#define ISL_ARG_USER_OPT_CHOICE(st,f,s,l,c,setter,d,ds,h)	{	\
-	.type = isl_arg_choice,						\
-	.short_name = s,						\
-	.long_name = l,							\
-	.offset = offsetof(st, f),					\
-	.help_msg = h,							\
-	.u = { .choice = { .choice = c, .default_value = d,		\
-			    .default_selected = ds, .set = setter } }	\
-},
-#define _ISL_ARG_BOOL_F(o,s,l,setter,d,h,fl)	{			\
-	.type = isl_arg_bool,						\
-	.short_name = s,						\
-	.long_name = l,							\
-	.offset = o,							\
-	.help_msg = h,							\
-	.flags = fl,							\
-	.u = { .b = { .default_value = d, .set = setter } }		\
-},
-#define ISL_ARG_BOOL_F(st,f,s,l,d,h,fl)					\
-	_ISL_ARG_BOOL_F(offsetof(st, f),s,l,NULL,d,h,fl)
-#define ISL_ARG_BOOL(st,f,s,l,d,h)					\
-	ISL_ARG_BOOL_F(st,f,s,l,d,h,0)
-#define ISL_ARG_PHANTOM_BOOL_F(s,l,setter,h,fl)				\
-	_ISL_ARG_BOOL_F(-1,s,l,setter,0,h,fl)
-#define ISL_ARG_PHANTOM_BOOL(s,l,setter,h)				\
-	ISL_ARG_PHANTOM_BOOL_F(s,l,setter,h,0)
-#define ISL_ARG_INT_F(st,f,s,l,a,d,h,fl)	{			\
-	.type = isl_arg_int,						\
-	.short_name = s,						\
-	.long_name = l,							\
-	.argument_name = a,						\
-	.offset = offsetof(st, f),					\
-	.help_msg = h,							\
-	.flags = fl,							\
-	.u = { .ul = { .default_value = d } }				\
-},
-#define ISL_ARG_INT(st,f,s,l,a,d,h)					\
-	ISL_ARG_INT_F(st,f,s,l,a,d,h,0)
-#define ISL_ARG_LONG(st,f,s,lo,d,h)	{				\
-	.type = isl_arg_long,						\
-	.short_name = s,						\
-	.long_name = lo,						\
-	.offset = offsetof(st, f),					\
-	.help_msg = h,							\
-	.u = { .l = { .default_value = d, .default_selected = d,	\
-		      .set = NULL } }					\
-},
-#define ISL_ARG_USER_LONG(st,f,s,lo,setter,d,h)	{			\
-	.type = isl_arg_long,						\
-	.short_name = s,						\
-	.long_name = lo,						\
-	.offset = offsetof(st, f),					\
-	.help_msg = h,							\
-	.u = { .l = { .default_value = d, .default_selected = d,	\
-		      .set = setter } }					\
-},
-#define ISL_ARG_OPT_LONG(st,f,s,lo,d,ds,h)	{			\
-	.type = isl_arg_long,						\
-	.short_name = s,						\
-	.long_name = lo,						\
-	.offset = offsetof(st, f),					\
-	.help_msg = h,							\
-	.u = { .l = { .default_value = d, .default_selected = ds,	\
-		      .set = NULL } }					\
-},
-#define ISL_ARG_ULONG(st,f,s,l,d,h)	{				\
-	.type = isl_arg_ulong,						\
-	.short_name = s,						\
-	.long_name = l,							\
-	.offset = offsetof(st, f),					\
-	.help_msg = h,							\
-	.u = { .ul = { .default_value = d } }				\
-},
-#define ISL_ARG_STR(st,f,s,l,a,d,h)	{				\
-	.type = isl_arg_str,						\
-	.short_name = s,						\
-	.long_name = l,							\
-	.argument_name = a,						\
-	.offset = offsetof(st, f),					\
-	.help_msg = h,							\
-	.u = { .str = { .default_value = d } }				\
-},
-#define _ISL_ARG_CHILD(o,sz,l,c,h,fl)	{				\
-	.type = isl_arg_child,						\
-	.long_name = l,							\
-	.offset = o,							\
-	.help_msg = h,							\
-	.flags = fl,							\
-	.u = { .child = { .child = c, .size = sz } }			\
-},
-#define ISL_ARG_CHILD(st,f,l,c,h)					\
-	_ISL_ARG_CHILD(offsetof(st, f),sizeof(*((st *)NULL)->f),l,c,h,0)
-#define ISL_ARG_GROUP_F(c,h,fl)						\
-	_ISL_ARG_CHILD(-1,0,NULL,c,h,fl)
-#define ISL_ARG_GROUP(c,h)						\
-	ISL_ARG_GROUP_F(c,h,0)
-#define ISL_ARG_FLAGS(st,f,s,l,c,d,h)	{				\
-	.type = isl_arg_flags,						\
-	.short_name = s,						\
-	.long_name = l,							\
-	.offset = offsetof(st, f),					\
-	.help_msg = h,							\
-	.u = { .flags = { .flags = c, .default_value = d } }		\
-},
-#define ISL_ARG_USER(st,f,i,c) {					\
-	.type = isl_arg_user,						\
-	.offset = offsetof(st, f),					\
-	.u = { .user = { .init = i, .clear = c} }			\
-},
-#define ISL_ARG_VERSION(print) {					\
-	.type = isl_arg_version,					\
-	.u = { .version = { .print_version = print } }			\
-},
-#define ISL_ARG_END	{ isl_arg_end }
-
-#define ISL_ARG_ALL	(1 << 0)
-
-void isl_arg_set_defaults(struct isl_arg *arg, void *opt);
-void isl_arg_free(struct isl_arg *arg, void *opt);
-int isl_arg_parse(struct isl_arg *arg, int argc, char **argv, void *opt,
-	unsigned flags);
-
-#define ISL_ARG_DECL(prefix,st,arg)					\
-extern struct isl_arg arg[];						\
-st *prefix ## _new_with_defaults();					\
-void prefix ## _free(st *opt);						\
-int prefix ## _parse(st *opt, int argc, char **argv, unsigned flags);
-
-#define ISL_ARG_DEF(prefix,st,arg)					\
-st *prefix ## _new_with_defaults()					\
-{									\
-	st *opt = (st *)calloc(1, sizeof(st));				\
-	if (opt)							\
-		isl_arg_set_defaults(arg, opt);				\
-	return opt;							\
-}									\
-									\
-void prefix ## _free(st *opt)						\
-{									\
-	isl_arg_free(arg, opt);						\
-}									\
-									\
-int prefix ## _parse(st *opt, int argc, char **argv, unsigned flags)	\
-{									\
-	return isl_arg_parse(arg, argc, argv, opt, flags);		\
-}
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/band.h b/cloog-0.16.3/isl/include/isl/band.h
deleted file mode 100644
index 880cb12..0000000
--- a/cloog-0.16.3/isl/include/isl/band.h
+++ /dev/null
@@ -1,42 +0,0 @@
-#ifndef ISL_BAND_H
-#define ISL_BAND_H
-
-#include <isl/printer.h>
-#include <isl/list.h>
-#include <isl/union_map.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_band;
-typedef struct isl_band isl_band;
-
-__isl_give isl_band *isl_band_copy(__isl_keep isl_band *band);
-void *isl_band_free(__isl_take isl_band *band);
-
-isl_ctx *isl_band_get_ctx(__isl_keep isl_band *band);
-
-int isl_band_has_children(__isl_keep isl_band *band);
-__isl_give isl_band_list *isl_band_get_children(
-	__isl_keep isl_band *band);
-
-__isl_give isl_union_map *isl_band_get_prefix_schedule(
-	__isl_keep isl_band *band);
-__isl_give isl_union_map *isl_band_get_partial_schedule(
-	__isl_keep isl_band *band);
-__isl_give isl_union_map *isl_band_get_suffix_schedule(
-	__isl_keep isl_band *band);
-
-int isl_band_n_member(__isl_keep isl_band *band);
-int isl_band_member_is_zero_distance(__isl_keep isl_band *band, int pos);
-
-__isl_give isl_printer *isl_printer_print_band(__isl_take isl_printer *p,
-	__isl_keep isl_band *band);
-void isl_band_dump(__isl_keep isl_band *band);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/blk.h b/cloog-0.16.3/isl/include/isl/blk.h
deleted file mode 100644
index 8094e2a..0000000
--- a/cloog-0.16.3/isl/include/isl/blk.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_BLK_H
-#define ISL_BLK_H
-
-#include <isl/int.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_blk {
-	size_t size;
-	isl_int *data;
-};
-
-#define ISL_BLK_CACHE_SIZE	20
-
-struct isl_ctx;
-
-struct isl_blk isl_blk_alloc(struct isl_ctx *ctx, size_t n);
-struct isl_blk isl_blk_empty();
-int isl_blk_is_error(struct isl_blk block);
-struct isl_blk isl_blk_extend(struct isl_ctx *ctx, struct isl_blk block,
-				size_t new_n);
-void isl_blk_free(struct isl_ctx *ctx, struct isl_blk block);
-void isl_blk_clear_cache(struct isl_ctx *ctx);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/config.h.in b/cloog-0.16.3/isl/include/isl/config.h.in
deleted file mode 100644
index 231575e..0000000
--- a/cloog-0.16.3/isl/include/isl/config.h.in
+++ /dev/null
@@ -1,3 +0,0 @@
-#undef GCC_WARN_UNUSED_RESULT
-
-#undef ISL_PIPLIB
diff --git a/cloog-0.16.3/isl/include/isl/constraint.h b/cloog-0.16.3/isl/include/isl/constraint.h
deleted file mode 100644
index 6f2e8c7..0000000
--- a/cloog-0.16.3/isl/include/isl/constraint.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_CONSTRAINT_H
-#define ISL_CONSTRAINT_H
-
-#include <isl/aff_type.h>
-#include <isl/div.h>
-#include <isl/set_type.h>
-#include <isl/printer.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_constraint;
-typedef struct isl_constraint isl_constraint;
-
-isl_ctx *isl_constraint_get_ctx(__isl_keep isl_constraint *c);
-
-__isl_give isl_constraint *isl_equality_alloc(__isl_take isl_dim *dim);
-__isl_give isl_constraint *isl_inequality_alloc(__isl_take isl_dim *dim);
-
-struct isl_constraint *isl_constraint_cow(struct isl_constraint *c);
-struct isl_constraint *isl_constraint_copy(struct isl_constraint *c);
-void isl_constraint_free(struct isl_constraint *c);
-
-__isl_give isl_constraint *isl_basic_map_first_constraint(
-	__isl_take isl_basic_map *bmap);
-__isl_give isl_constraint *isl_basic_set_first_constraint(
-	__isl_take isl_basic_set *bset);
-struct isl_constraint *isl_constraint_next(struct isl_constraint *c);
-int isl_basic_map_foreach_constraint(__isl_keep isl_basic_map *bmap,
-	int (*fn)(__isl_take isl_constraint *c, void *user), void *user);
-int isl_basic_set_foreach_constraint(__isl_keep isl_basic_set *bset,
-	int (*fn)(__isl_take isl_constraint *c, void *user), void *user);
-int isl_constraint_is_equal(struct isl_constraint *constraint1,
-			    struct isl_constraint *constraint2);
-
-int isl_basic_set_foreach_bound_pair(__isl_keep isl_basic_set *bset,
-	enum isl_dim_type type, unsigned pos,
-	int (*fn)(__isl_take isl_constraint *lower,
-		  __isl_take isl_constraint *upper,
-		  __isl_take isl_basic_set *bset, void *user), void *user);
-
-__isl_give isl_basic_map *isl_basic_map_add_constraint(
-	__isl_take isl_basic_map *bmap, __isl_take isl_constraint *constraint);
-__isl_give isl_basic_set *isl_basic_set_add_constraint(
-	__isl_take isl_basic_set *bset, __isl_take isl_constraint *constraint);
-__isl_give isl_map *isl_map_add_constraint(__isl_take isl_map *map,
-	__isl_take isl_constraint *constraint);
-__isl_give isl_set *isl_set_add_constraint(__isl_take isl_set *set,
-	__isl_take isl_constraint *constraint);
-
-int isl_basic_map_has_defining_equality(
-	__isl_keep isl_basic_map *bmap, enum isl_dim_type type, int pos,
-	__isl_give isl_constraint **c);
-int isl_basic_set_has_defining_equality(
-	struct isl_basic_set *bset, enum isl_dim_type type, int pos,
-	struct isl_constraint **constraint);
-int isl_basic_set_has_defining_inequalities(
-	struct isl_basic_set *bset, enum isl_dim_type type, int pos,
-	struct isl_constraint **lower,
-	struct isl_constraint **upper);
-
-__isl_give isl_dim *isl_constraint_get_dim(
-	__isl_keep isl_constraint *constraint);
-int isl_constraint_dim(struct isl_constraint *constraint,
-	enum isl_dim_type type);
-
-int isl_constraint_involves_dims(__isl_keep isl_constraint *constraint,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-const char *isl_constraint_get_dim_name(__isl_keep isl_constraint *constraint,
-	enum isl_dim_type type, unsigned pos);
-void isl_constraint_get_constant(__isl_keep isl_constraint *constraint,
-	isl_int *v);
-void isl_constraint_get_coefficient(__isl_keep isl_constraint *constraint,
-	enum isl_dim_type type, int pos, isl_int *v);
-void isl_constraint_set_constant(__isl_keep isl_constraint *constraint, isl_int v);
-void isl_constraint_set_constant_si(__isl_keep isl_constraint *constraint,
-	int v);
-void isl_constraint_set_coefficient(__isl_keep isl_constraint *constraint,
-	enum isl_dim_type type, int pos, isl_int v);
-void isl_constraint_set_coefficient_si(__isl_keep isl_constraint *constraint,
-	enum isl_dim_type type, int pos, int v);
-
-__isl_give isl_div *isl_constraint_div(__isl_keep isl_constraint *constraint,
-	int pos);
-struct isl_constraint *isl_constraint_add_div(struct isl_constraint *constraint,
-	struct isl_div *div, int *pos);
-
-void isl_constraint_clear(struct isl_constraint *constraint);
-struct isl_constraint *isl_constraint_negate(struct isl_constraint *constraint);
-
-int isl_constraint_is_equality(__isl_keep isl_constraint *constraint);
-int isl_constraint_is_div_constraint(__isl_keep isl_constraint *constraint);
-
-__isl_give isl_basic_map *isl_basic_map_from_constraint(
-	__isl_take isl_constraint *constraint);
-struct isl_basic_set *isl_basic_set_from_constraint(
-	struct isl_constraint *constraint);
-
-__isl_give isl_aff *isl_constraint_get_bound(
-	__isl_keep isl_constraint *constraint, enum isl_dim_type type, int pos);
-__isl_give isl_aff *isl_constraint_get_aff(
-	__isl_keep isl_constraint *constraint);
-__isl_give isl_constraint *isl_equality_from_aff(__isl_take isl_aff *aff);
-__isl_give isl_constraint *isl_inequality_from_aff(__isl_take isl_aff *aff);
-
-__isl_give isl_basic_set *isl_basic_set_drop_constraint(
-	__isl_take isl_basic_set *bset, __isl_take isl_constraint *constraint);
-
-__isl_give isl_printer *isl_printer_print_constraint(__isl_take isl_printer *p,
-	__isl_keep isl_constraint *c);
-void isl_constraint_dump(__isl_keep isl_constraint *c);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/ctx.h b/cloog-0.16.3/isl/include/isl/ctx.h
deleted file mode 100644
index b653ed6..0000000
--- a/cloog-0.16.3/isl/include/isl/ctx.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_CTX_H
-#define ISL_CTX_H
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <isl/int.h>
-#include <isl/options.h>
-#include <isl/blk.h>
-#include <isl/hash.h>
-#include <isl/config.h>
-
-#define __isl_give
-#define __isl_take
-#define __isl_keep
-
-#ifdef GCC_WARN_UNUSED_RESULT
-#define	WARN_UNUSED	GCC_WARN_UNUSED_RESULT
-#else
-#define WARN_UNUSED
-#endif
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/* Nearly all isa functions require a struct isl_ctx allocated using
- * isl_ctx_alloc.  This ctx contains (or will contain) options that
- * control the behavior of the library and some caches.
- *
- * An object allocated within a given ctx should never be used inside
- * another ctx.  Functions for moving objects from one ctx to another
- * will be added as the need arises.
- *
- * A given context should only be used inside a single thread.
- * A global context for synchronization between different threads
- * as well as functions for moving a context to a different thread
- * will be added as the need arises.
- *
- * If anything goes wrong (out of memory, failed assertion), then
- * the library will currently simply abort.  This will be made
- * configurable in the future.
- * Users of the library should expect functions that return
- * a pointer to a structure, to return NULL, indicating failure.
- * Any function accepting a pointer to a structure will treat
- * a NULL argument as a failure, resulting in the function freeing
- * the remaining structures (if any) and returning NULL itself
- * (in case of pointer return type).
- * The only exception is the isl_ctx argument, which should never be NULL.
- */
-struct isl_stats {
-	long	gbr_solved_lps;
-};
-enum isl_error {
-	isl_error_none = 0,
-	isl_error_abort,
-	isl_error_unknown,
-	isl_error_internal,
-	isl_error_invalid,
-	isl_error_unsupported
-};
-struct isl_ctx;
-typedef struct isl_ctx isl_ctx;
-
-/* Some helper macros */
-
-#define ISL_FL_INIT(l, f)   (l) = (f)               /* Specific flags location. */
-#define ISL_FL_SET(l, f)    ((l) |= (f))
-#define ISL_FL_CLR(l, f)    ((l) &= ~(f))
-#define ISL_FL_ISSET(l, f)  (!!((l) & (f)))
-
-#define ISL_F_INIT(p, f)    ISL_FL_INIT((p)->flags, f)  /* Structure element flags. */
-#define ISL_F_SET(p, f)     ISL_FL_SET((p)->flags, f)
-#define ISL_F_CLR(p, f)     ISL_FL_CLR((p)->flags, f)
-#define ISL_F_ISSET(p, f)   ISL_FL_ISSET((p)->flags, f)
-
-/* isl_check_ctx() checks at compile time if 'ctx' is of type 'isl_ctx *' and
- * returns the value of 'expr'. It is used to ensure, that always an isl_ctx is
- * passed to the following macros, even if they currently do not use it.
- */
-#define isl_check_ctx(ctx, expr)	(ctx != (isl_ctx *) 0) ? expr : expr
-
-#define isl_alloc(ctx,type,size)	isl_check_ctx(ctx, (type *)malloc(size))
-#define isl_calloc(ctx,type,size)	isl_check_ctx(ctx, \
-						(type *)calloc(1, size))
-#define isl_realloc(ctx,ptr,type,size)	isl_check_ctx(ctx, \
-						(type *)realloc(ptr,size))
-#define isl_alloc_type(ctx,type)	isl_alloc(ctx,type,sizeof(type))
-#define isl_calloc_type(ctx,type)	isl_calloc(ctx,type,sizeof(type))
-#define isl_realloc_type(ctx,ptr,type)	isl_realloc(ctx,ptr,type,sizeof(type))
-#define isl_alloc_array(ctx,type,n)	isl_alloc(ctx,type,(n)*sizeof(type))
-#define isl_calloc_array(ctx,type,n)	isl_check_ctx(ctx,\
-						(type *)calloc(n, sizeof(type)))
-#define isl_realloc_array(ctx,ptr,type,n) \
-				    isl_realloc(ctx,ptr,type,(n)*sizeof(type))
-
-#define isl_die(ctx,errno,msg,code)					\
-	do {								\
-		isl_ctx_set_error(ctx, errno);				\
-		fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, msg);	\
-		code;							\
-	} while (0)
-#define isl_assert4(ctx,test,code,errno)				\
-	do {								\
-		if (test)						\
-			break;						\
-		isl_die(ctx, errno, "Assertion \"" #test "\" failed", code);	\
-	} while (0)
-#define isl_assert(ctx,test,code)					\
-	isl_assert4(ctx,test,code,isl_error_unknown)
-
-#define isl_min(a,b)			((a < b) ? (a) : (b))
-
-/* struct isl_ctx functions */
-
-struct isl_options *isl_ctx_options(isl_ctx *ctx);
-
-isl_ctx *isl_ctx_alloc_with_options(struct isl_arg *arg, __isl_take void *opt);
-isl_ctx *isl_ctx_alloc();
-void *isl_ctx_peek_options(isl_ctx *ctx, struct isl_arg *arg);
-void isl_ctx_ref(struct isl_ctx *ctx);
-void isl_ctx_deref(struct isl_ctx *ctx);
-void isl_ctx_free(isl_ctx *ctx);
-
-void isl_ctx_abort(isl_ctx *ctx);
-void isl_ctx_resume(isl_ctx *ctx);
-int isl_ctx_aborted(isl_ctx *ctx);
-
-#define ISL_ARG_CTX_DECL(prefix,st,arg)					\
-st *isl_ctx_peek_ ## prefix(isl_ctx *ctx);
-
-#define ISL_ARG_CTX_DEF(prefix,st,arg)					\
-st *isl_ctx_peek_ ## prefix(isl_ctx *ctx)				\
-{									\
-	return (st *)isl_ctx_peek_options(ctx, arg);			\
-}
-
-enum isl_error isl_ctx_last_error(isl_ctx *ctx);
-void isl_ctx_reset_error(isl_ctx *ctx);
-void isl_ctx_set_error(isl_ctx *ctx, enum isl_error error);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/dim.h b/cloog-0.16.3/isl/include/isl/dim.h
deleted file mode 100644
index 5cb2664..0000000
--- a/cloog-0.16.3/isl/include/isl/dim.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_DIM_H
-#define ISL_DIM_H
-
-#include <isl/ctx.h>
-#include <isl/printer.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_dim;
-typedef struct isl_dim isl_dim;
-
-enum isl_dim_type {
-	isl_dim_cst,
-	isl_dim_param,
-	isl_dim_in,
-	isl_dim_out,
-	isl_dim_set = isl_dim_out,
-	isl_dim_div,
-	isl_dim_all
-};
-
-isl_ctx *isl_dim_get_ctx(__isl_keep isl_dim *dim);
-__isl_give isl_dim *isl_dim_alloc(isl_ctx *ctx,
-			unsigned nparam, unsigned n_in, unsigned n_out);
-__isl_give isl_dim *isl_dim_set_alloc(isl_ctx *ctx,
-			unsigned nparam, unsigned dim);
-__isl_give isl_dim *isl_dim_copy(__isl_keep isl_dim *dim);
-struct isl_dim *isl_dim_cow(struct isl_dim *dim);
-void isl_dim_free(__isl_take isl_dim *dim);
-
-__isl_give isl_dim *isl_dim_set_tuple_name(__isl_take isl_dim *dim,
-	enum isl_dim_type type, const char *s);
-const char *isl_dim_get_tuple_name(__isl_keep isl_dim *dim,
-				 enum isl_dim_type type);
-
-__isl_give isl_dim *isl_dim_set_name(__isl_take isl_dim *dim,
-				 enum isl_dim_type type, unsigned pos,
-				 __isl_keep const char *name);
-__isl_keep const char *isl_dim_get_name(__isl_keep isl_dim *dim,
-				 enum isl_dim_type type, unsigned pos);
-
-struct isl_dim *isl_dim_extend(struct isl_dim *dim,
-			unsigned nparam, unsigned n_in, unsigned n_out);
-__isl_give isl_dim *isl_dim_add(__isl_take isl_dim *dim, enum isl_dim_type type,
-		unsigned n);
-__isl_give isl_dim *isl_dim_move(__isl_take isl_dim *dim,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n);
-__isl_give isl_dim *isl_dim_insert(__isl_take isl_dim *dim,
-	enum isl_dim_type type, unsigned pos, unsigned n);
-__isl_give isl_dim *isl_dim_join(__isl_take isl_dim *left,
-	__isl_take isl_dim *right);
-struct isl_dim *isl_dim_product(struct isl_dim *left, struct isl_dim *right);
-__isl_give isl_dim *isl_dim_range_product(__isl_take isl_dim *left,
-	__isl_take isl_dim *right);
-__isl_give isl_dim *isl_dim_map_from_set(__isl_take isl_dim *dim);
-__isl_give isl_dim *isl_dim_reverse(__isl_take isl_dim *dim);
-__isl_give isl_dim *isl_dim_drop(__isl_take isl_dim *dim,
-	enum isl_dim_type type, unsigned first, unsigned num);
-struct isl_dim *isl_dim_drop_inputs(struct isl_dim *dim,
-		unsigned first, unsigned n);
-struct isl_dim *isl_dim_drop_outputs(struct isl_dim *dim,
-		unsigned first, unsigned n);
-__isl_give isl_dim *isl_dim_domain(__isl_take isl_dim *dim);
-__isl_give isl_dim *isl_dim_from_domain(__isl_take isl_dim *dim);
-__isl_give isl_dim *isl_dim_range(__isl_take isl_dim *dim);
-__isl_give isl_dim *isl_dim_from_range(__isl_take isl_dim *dim);
-struct isl_dim *isl_dim_underlying(struct isl_dim *dim, unsigned n_div);
-
-__isl_give isl_dim *isl_dim_align_params(__isl_take isl_dim *dim1,
-	__isl_take isl_dim *dim2);
-
-int isl_dim_is_wrapping(__isl_keep isl_dim *dim);
-__isl_give isl_dim *isl_dim_wrap(__isl_take isl_dim *dim);
-__isl_give isl_dim *isl_dim_unwrap(__isl_take isl_dim *dim);
-
-int isl_dim_can_zip(__isl_keep isl_dim *dim);
-__isl_give isl_dim *isl_dim_zip(__isl_take isl_dim *dim);
-
-int isl_dim_equal(struct isl_dim *dim1, struct isl_dim *dim2);
-int isl_dim_match(struct isl_dim *dim1, enum isl_dim_type dim1_type,
-		struct isl_dim *dim2, enum isl_dim_type dim2_type);
-int isl_dim_tuple_match(__isl_keep isl_dim *dim1, enum isl_dim_type dim1_type,
-			__isl_keep isl_dim *dim2, enum isl_dim_type dim2_type);
-int isl_dim_compatible(struct isl_dim *dim1, struct isl_dim *dim2);
-unsigned isl_dim_size(__isl_keep isl_dim *dim, enum isl_dim_type type);
-unsigned isl_dim_total(struct isl_dim *dim);
-
-__isl_give isl_printer *isl_printer_print_dim(__isl_take isl_printer *p,
-	__isl_keep isl_dim *dim);
-void isl_dim_dump(__isl_keep isl_dim *dim);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/div.h b/cloog-0.16.3/isl/include/isl/div.h
deleted file mode 100644
index 398c7be..0000000
--- a/cloog-0.16.3/isl/include/isl/div.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_DIV_H
-#define ISL_DIV_H
-
-#include <isl/dim.h>
-#include <isl/aff_type.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_div;
-typedef struct isl_div isl_div;
-
-isl_ctx *isl_div_get_ctx(__isl_keep isl_div *div);
-
-struct isl_div *isl_div_alloc(struct isl_dim *dim);
-__isl_give isl_div *isl_div_copy(__isl_keep isl_div *div);
-void isl_div_free(struct isl_div *c);
-
-void isl_div_get_constant(__isl_keep isl_div *div, isl_int *v);
-void isl_div_get_denominator(__isl_keep isl_div *div, isl_int *v);
-void isl_div_get_coefficient(__isl_keep isl_div *div,
-	enum isl_dim_type type, int pos, isl_int *v);
-void isl_div_set_constant(struct isl_div *div, isl_int v);
-void isl_div_set_denominator(struct isl_div *div, isl_int v);
-void isl_div_set_coefficient(struct isl_div *div,
-	enum isl_dim_type type, int pos, isl_int v);
-
-unsigned isl_div_dim(__isl_keep isl_div *div, enum isl_dim_type type);
-__isl_give isl_div *isl_div_div(__isl_take isl_div *div, int pos);
-
-__isl_give isl_aff *isl_aff_from_div(__isl_take isl_div *div);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/flow.h b/cloog-0.16.3/isl/include/isl/flow.h
deleted file mode 100644
index 8fc2698..0000000
--- a/cloog-0.16.3/isl/include/isl/flow.h
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef ISL_FLOW_H
-#define ISL_FLOW_H
-
-#include <isl/set_type.h>
-#include <isl/map_type.h>
-#include <isl/union_set.h>
-#include <isl/union_map.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/* Let n (>= 0) be the number of iterators shared by first and second.
- * If first precedes second textually return 2 * n + 1,
- * otherwise return 2 * n.
- */
-typedef int (*isl_access_level_before)(void *first, void *second);
-
-struct isl_access_info;
-typedef struct isl_access_info isl_access_info;
-struct isl_flow;
-typedef struct isl_flow isl_flow;
-
-__isl_give isl_access_info *isl_access_info_alloc(__isl_take isl_map *sink,
-	void *sink_user, isl_access_level_before fn, int max_source);
-__isl_give isl_access_info *isl_access_info_add_source(
-	__isl_take isl_access_info *acc, __isl_take isl_map *source,
-	int must, void *source_user);
-void isl_access_info_free(__isl_take isl_access_info *acc);
-
-isl_ctx *isl_access_info_get_ctx(__isl_keep isl_access_info *acc);
-
-__isl_give isl_flow *isl_access_info_compute_flow(__isl_take isl_access_info *acc);
-int isl_flow_foreach(__isl_keep isl_flow *deps,
-	int (*fn)(__isl_take isl_map *dep, int must, void *dep_user, void *user),
-	void *user);
-__isl_give isl_map *isl_flow_get_no_source(__isl_keep isl_flow *deps, int must);
-void isl_flow_free(__isl_take isl_flow *deps);
-
-isl_ctx *isl_flow_get_ctx(__isl_keep isl_flow *deps);
-
-int isl_union_map_compute_flow(__isl_take isl_union_map *sink,
-	__isl_take isl_union_map *must_source,
-	__isl_take isl_union_map *may_source,
-	__isl_take isl_union_map *schedule,
-	__isl_give isl_union_map **must_dep, __isl_give isl_union_map **may_dep,
-	__isl_give isl_union_map **must_no_source,
-	__isl_give isl_union_map **may_no_source);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/hash.h b/cloog-0.16.3/isl/include/isl/hash.h
deleted file mode 100644
index 654b6b6..0000000
--- a/cloog-0.16.3/isl/include/isl/hash.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_HASH_H
-#define ISL_HASH_H
-
-#include <stdlib.h>
-#include <isl/stdint.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-#define isl_hash_init()		(2166136261u)
-#define isl_hash_byte(h,b)	do {					\
-					h *= 16777619;			\
-					h ^= b;				\
-				} while(0)
-#define isl_hash_hash(h,h2)						\
-	do {								\
-		isl_hash_byte(h, (h2) & 0xFF);				\
-		isl_hash_byte(h, ((h2) >> 8) & 0xFF);			\
-		isl_hash_byte(h, ((h2) >> 16) & 0xFF);			\
-		isl_hash_byte(h, ((h2) >> 24) & 0xFF);			\
-	} while(0)
-#define isl_hash_bits(h,bits)						\
-	((bits) == 32) ? (h) :						\
-	((bits) >= 16) ?						\
-	      ((h) >> (bits)) ^ ((h) & (((uint32_t)1 << (bits)) - 1)) :	\
-	      (((h) >> (bits)) ^ (h)) & (((uint32_t)1 << (bits)) - 1)
-
-uint32_t isl_hash_string(uint32_t hash, const char *s);
-uint32_t isl_hash_mem(uint32_t hash, const void *p, size_t len);
-
-#define isl_hash_builtin(h,l)	isl_hash_mem(h, &l, sizeof(l))
-
-struct isl_hash_table_entry
-{
-	uint32_t  hash;
-	void     *data;
-};
-
-struct isl_hash_table {
-	int    bits;
-	int    n;
-	struct isl_hash_table_entry *entries;
-};
-
-struct isl_ctx;
-
-struct isl_hash_table *isl_hash_table_alloc(struct isl_ctx *ctx, int min_size);
-void isl_hash_table_free(struct isl_ctx *ctx, struct isl_hash_table *table);
-
-int isl_hash_table_init(struct isl_ctx *ctx, struct isl_hash_table *table,
-			int min_size);
-void isl_hash_table_clear(struct isl_hash_table *table);
-struct isl_hash_table_entry *isl_hash_table_find(struct isl_ctx *ctx,
-				struct isl_hash_table *table,
-				uint32_t key_hash,
-				int (*eq)(const void *entry, const void *val),
-				const void *val, int reserve);
-int isl_hash_table_foreach(struct isl_ctx *ctx,
-			    struct isl_hash_table *table,
-			    int (*fn)(void **entry, void *user), void *user);
-void isl_hash_table_remove(struct isl_ctx *ctx,
-				struct isl_hash_table *table,
-				struct isl_hash_table_entry *entry);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/ilp.h b/cloog-0.16.3/isl/include/isl/ilp.h
deleted file mode 100644
index 460aaed..0000000
--- a/cloog-0.16.3/isl/include/isl/ilp.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_ILP_H
-#define ISL_ILP_H
-
-#include <isl/aff_type.h>
-#include <isl/lp.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-enum isl_lp_result isl_basic_set_solve_ilp(struct isl_basic_set *bset, int max,
-				      isl_int *f, isl_int *opt,
-				      struct isl_vec **sol_p);
-enum isl_lp_result isl_basic_set_max(__isl_keep isl_basic_set *bset,
-	__isl_keep isl_aff *obj, isl_int *opt);
-enum isl_lp_result isl_set_max(__isl_keep isl_set *set,
-	__isl_keep isl_aff *obj, isl_int *opt);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/int.h b/cloog-0.16.3/isl/include/isl/int.h
deleted file mode 100644
index 7c292d0..0000000
--- a/cloog-0.16.3/isl/include/isl/int.h
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_INT_H
-#define ISL_INT_H
-
-#include <isl/hash.h>
-#include <string.h>
-#include <gmp.h>
-#if defined(__cplusplus)
-#include <iostream>
-#endif
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-#ifndef mp_get_memory_functions
-void mp_get_memory_functions(
-		void *(**alloc_func_ptr) (size_t),
-		void *(**realloc_func_ptr) (void *, size_t, size_t),
-		void (**free_func_ptr) (void *, size_t));
-#endif
-
-/* isl_int is the basic integer type.  It currently always corresponds
- * to a gmp mpz_t, but in the future, different types such as long long
- * or cln::cl_I will be supported.
- */
-typedef mpz_t	isl_int;
-
-#define isl_int_init(i)		mpz_init(i)
-#define isl_int_clear(i)	mpz_clear(i)
-
-#define isl_int_set(r,i)	mpz_set(r,i)
-#define isl_int_set_gmp(r,i)	mpz_set(r,i)
-#define isl_int_set_si(r,i)	mpz_set_si(r,i)
-#define isl_int_set_ui(r,i)	mpz_set_ui(r,i)
-#define isl_int_get_gmp(i,g)	mpz_set(g,i)
-#define isl_int_get_si(r)	mpz_get_si(r)
-#define isl_int_get_ui(r)	mpz_get_ui(r)
-#define isl_int_get_d(r)	mpz_get_d(r)
-#define isl_int_get_str(r)	mpz_get_str(0, 10, r)
-#define isl_int_abs(r,i)	mpz_abs(r,i)
-#define isl_int_neg(r,i)	mpz_neg(r,i)
-#define isl_int_swap(i,j)	mpz_swap(i,j)
-#define isl_int_swap_or_set(i,j)	mpz_swap(i,j)
-#define isl_int_add_ui(r,i,j)	mpz_add_ui(r,i,j)
-#define isl_int_sub_ui(r,i,j)	mpz_sub_ui(r,i,j)
-
-#define isl_int_add(r,i,j)	mpz_add(r,i,j)
-#define isl_int_sub(r,i,j)	mpz_sub(r,i,j)
-#define isl_int_mul(r,i,j)	mpz_mul(r,i,j)
-#define isl_int_mul_ui(r,i,j)	mpz_mul_ui(r,i,j)
-#define isl_int_pow_ui(r,i,j)	mpz_pow_ui(r,i,j)
-#define isl_int_addmul(r,i,j)	mpz_addmul(r,i,j)
-#define isl_int_submul(r,i,j)	mpz_submul(r,i,j)
-
-#define isl_int_gcd(r,i,j)	mpz_gcd(r,i,j)
-#define isl_int_lcm(r,i,j)	mpz_lcm(r,i,j)
-#define isl_int_divexact(r,i,j)	mpz_divexact(r,i,j)
-#define isl_int_divexact_ui(r,i,j)	mpz_divexact_ui(r,i,j)
-#define isl_int_tdiv_q(r,i,j)	mpz_tdiv_q(r,i,j)
-#define isl_int_cdiv_q(r,i,j)	mpz_cdiv_q(r,i,j)
-#define isl_int_fdiv_q(r,i,j)	mpz_fdiv_q(r,i,j)
-#define isl_int_fdiv_r(r,i,j)	mpz_fdiv_r(r,i,j)
-#define isl_int_fdiv_q_ui(r,i,j)	mpz_fdiv_q_ui(r,i,j)
-
-#define isl_int_read(r,s)	mpz_set_str(r,s,10)
-typedef void (*isl_int_print_gmp_free_t)(void *, size_t);
-#define isl_int_print(out,i,width)					\
-	do {								\
-		char *s;						\
-		isl_int_print_gmp_free_t gmp_free;			\
-		s = mpz_get_str(0, 10, i);				\
-		fprintf(out, "%*s", width, s);				\
-		mp_get_memory_functions(NULL, NULL, &gmp_free);		\
-		(*gmp_free)(s, strlen(s)+1);				\
-	} while (0)
-
-#define isl_int_sgn(i)		mpz_sgn(i)
-#define isl_int_cmp(i,j)	mpz_cmp(i,j)
-#define isl_int_cmp_si(i,si)	mpz_cmp_si(i,si)
-#define isl_int_eq(i,j)		(mpz_cmp(i,j) == 0)
-#define isl_int_ne(i,j)		(mpz_cmp(i,j) != 0)
-#define isl_int_lt(i,j)		(mpz_cmp(i,j) < 0)
-#define isl_int_le(i,j)		(mpz_cmp(i,j) <= 0)
-#define isl_int_gt(i,j)		(mpz_cmp(i,j) > 0)
-#define isl_int_ge(i,j)		(mpz_cmp(i,j) >= 0)
-#define isl_int_abs_eq(i,j)	(mpz_cmpabs(i,j) == 0)
-#define isl_int_abs_ne(i,j)	(mpz_cmpabs(i,j) != 0)
-#define isl_int_abs_lt(i,j)	(mpz_cmpabs(i,j) < 0)
-#define isl_int_abs_gt(i,j)	(mpz_cmpabs(i,j) > 0)
-#define isl_int_abs_ge(i,j)	(mpz_cmpabs(i,j) >= 0)
-
-
-#define isl_int_is_zero(i)	(isl_int_sgn(i) == 0)
-#define isl_int_is_one(i)	(isl_int_cmp_si(i,1) == 0)
-#define isl_int_is_negone(i)	(isl_int_cmp_si(i,-1) == 0)
-#define isl_int_is_pos(i)	(isl_int_sgn(i) > 0)
-#define isl_int_is_neg(i)	(isl_int_sgn(i) < 0)
-#define isl_int_is_nonpos(i)	(isl_int_sgn(i) <= 0)
-#define isl_int_is_nonneg(i)	(isl_int_sgn(i) >= 0)
-#define isl_int_is_divisible_by(i,j)	mpz_divisible_p(i,j)
-
-uint32_t isl_gmp_hash(mpz_t v, uint32_t hash);
-#define isl_int_hash(v,h)	isl_gmp_hash(v,h)
-
-#if defined(__cplusplus)
-}
-#endif
-
-#if defined(__cplusplus)
-extern "C" { typedef void (*isl_gmp_free_t)(void *, size_t); }
-
-static inline std::ostream &operator<<(std::ostream &os, isl_int i)
-{
-	char *s;
-	isl_gmp_free_t gmp_free;
-	s = mpz_get_str(0, 10, i);
-	os << s;
-	mp_get_memory_functions(NULL, NULL, &gmp_free);
-	(*gmp_free)(s, strlen(s)+1);
-	return os;
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/list.h b/cloog-0.16.3/isl/include/isl/list.h
deleted file mode 100644
index 51387c3..0000000
--- a/cloog-0.16.3/isl/include/isl/list.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_LIST_H
-#define ISL_LIST_H
-
-#include <isl/ctx.h>
-#include <isl/printer.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-#define ISL_DECLARE_LIST(EL)						\
-struct isl_##EL;							\
-struct isl_##EL##_list;							\
-typedef struct isl_##EL##_list isl_##EL##_list;				\
-isl_ctx *isl_##EL##_list_get_ctx(__isl_keep isl_##EL##_list *list);	\
-__isl_give isl_##EL##_list *isl_##EL##_list_alloc(isl_ctx *ctx, int n);	\
-__isl_give isl_##EL##_list *isl_##EL##_list_copy(			\
-	__isl_keep isl_##EL##_list *list);				\
-void isl_##EL##_list_free(__isl_take isl_##EL##_list *list);		\
-__isl_give isl_##EL##_list *isl_##EL##_list_add(			\
-	__isl_take isl_##EL##_list *list,				\
-	__isl_take struct isl_##EL *el);				\
-int isl_##EL##_list_n_##EL(__isl_keep isl_##EL##_list *list);		\
-__isl_give struct isl_##EL *isl_##EL##_list_get_##EL(			\
-	__isl_keep isl_##EL##_list *list, int index);			\
-int isl_##EL##_list_foreach(__isl_keep isl_##EL##_list *list,		\
-	int (*fn)(__isl_take struct isl_##EL *el, void *user),		\
-	void *user);							\
-__isl_give isl_printer *isl_printer_print_##EL##_list(			\
-	__isl_take isl_printer *p, __isl_keep isl_##EL##_list *list);	\
-void isl_##EL##_list_dump(__isl_keep isl_##EL##_list *list);
-
-ISL_DECLARE_LIST(basic_set)
-ISL_DECLARE_LIST(set)
-ISL_DECLARE_LIST(aff)
-ISL_DECLARE_LIST(band)
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/local_space.h b/cloog-0.16.3/isl/include/isl/local_space.h
deleted file mode 100644
index 3faa041..0000000
--- a/cloog-0.16.3/isl/include/isl/local_space.h
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef ISL_LOCAL_SPACE_H
-#define ISL_LOCAL_SPACE_H
-
-#include <isl/div.h>
-#include <isl/printer.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_local_space;
-typedef struct isl_local_space isl_local_space;
-
-isl_ctx *isl_local_space_get_ctx(__isl_keep isl_local_space *ls);
-
-__isl_give isl_local_space *isl_local_space_from_dim(__isl_take isl_dim *dim);
-
-__isl_give isl_local_space *isl_local_space_copy(
-	__isl_keep isl_local_space *ls);
-void *isl_local_space_free(__isl_take isl_local_space *ls);
-
-int isl_local_space_dim(__isl_keep isl_local_space *ls,
-	enum isl_dim_type type);
-const char *isl_local_space_get_dim_name(__isl_keep isl_local_space *ls,
-	enum isl_dim_type type, unsigned pos);
-__isl_give isl_local_space *isl_local_space_set_dim_name(
-	__isl_take isl_local_space *ls,
-	enum isl_dim_type type, unsigned pos, const char *s);
-__isl_give isl_dim *isl_local_space_get_dim(__isl_keep isl_local_space *ls);
-__isl_give isl_div *isl_local_space_get_div(__isl_keep isl_local_space *ls,
-	int pos);
-
-__isl_give isl_local_space *isl_local_space_from_domain(
-	__isl_take isl_local_space *ls);
-__isl_give isl_local_space *isl_local_space_add_dims(
-	__isl_take isl_local_space *ls, enum isl_dim_type type, unsigned n);
-__isl_give isl_local_space *isl_local_space_drop_dims(
-	__isl_take isl_local_space *ls,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_local_space *isl_local_space_insert_dims(
-	__isl_take isl_local_space *ls,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-int isl_local_space_is_equal(__isl_keep isl_local_space *ls1,
-	__isl_keep isl_local_space *ls2);
-
-__isl_give isl_printer *isl_printer_print_local_space(__isl_take isl_printer *p,
-	__isl_keep isl_local_space *ls);
-void isl_local_space_dump(__isl_keep isl_local_space *ls);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/lp.h b/cloog-0.16.3/isl/include/isl/lp.h
deleted file mode 100644
index 9f7a912..0000000
--- a/cloog-0.16.3/isl/include/isl/lp.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_LP_H
-#define ISL_LP_H
-
-#include <isl/int.h>
-#include <isl/vec.h>
-#include <isl/map_type.h>
-#include <isl/set_type.h>
-
-enum isl_lp_result {
-	isl_lp_error = -1,
-	isl_lp_ok = 0,
-	isl_lp_unbounded,
-	isl_lp_empty
-};
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-enum isl_lp_result isl_basic_map_solve_lp(struct isl_basic_map *bmap, int max,
-				      isl_int *f, isl_int denom, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **sol);
-enum isl_lp_result isl_basic_set_solve_lp(struct isl_basic_set *bset, int max,
-				      isl_int *f, isl_int denom, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **sol);
-enum isl_lp_result isl_map_solve_lp(__isl_keep isl_map *map, int max,
-				      isl_int *f, isl_int denom, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **sol);
-enum isl_lp_result isl_set_solve_lp(__isl_keep isl_set *set, int max,
-				      isl_int *f, isl_int denom, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **sol);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/map.h b/cloog-0.16.3/isl/include/isl/map.h
deleted file mode 100644
index 4678227..0000000
--- a/cloog-0.16.3/isl/include/isl/map.h
+++ /dev/null
@@ -1,472 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_MAP_H
-#define ISL_MAP_H
-
-#include <stdio.h>
-
-#include <isl/int.h>
-#include <isl/ctx.h>
-#include <isl/blk.h>
-#include <isl/dim.h>
-#include <isl/div.h>
-#include <isl/vec.h>
-#include <isl/mat.h>
-#include <isl/printer.h>
-#include <isl/local_space.h>
-#include <isl/aff_type.h>
-#include <isl/list.h>
-#include <isl/map_type.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/* General notes:
- *
- * All structures are reference counted to allow reuse without duplication.
- * A *_copy operation will increase the reference count, while a *_free
- * operation will decrease the reference count and only actually release
- * the structures when the reference count drops to zero.
- *
- * Functions that return an isa structure will in general _destroy_
- * all argument isa structures (the obvious execption begin the _copy
- * functions).  A pointer passed to such a function may therefore
- * never be used after the function call.  If you want to keep a
- * reference to the old structure(s), use the appropriate _copy function.
- */
-
-unsigned isl_basic_map_n_in(const struct isl_basic_map *bmap);
-unsigned isl_basic_map_n_out(const struct isl_basic_map *bmap);
-unsigned isl_basic_map_n_param(const struct isl_basic_map *bmap);
-unsigned isl_basic_map_n_div(const struct isl_basic_map *bmap);
-unsigned isl_basic_map_total_dim(const struct isl_basic_map *bmap);
-unsigned isl_basic_map_dim(const struct isl_basic_map *bmap,
-				enum isl_dim_type type);
-
-unsigned isl_map_n_in(const struct isl_map *map);
-unsigned isl_map_n_out(const struct isl_map *map);
-unsigned isl_map_n_param(const struct isl_map *map);
-unsigned isl_map_dim(const struct isl_map *map, enum isl_dim_type type);
-
-isl_ctx *isl_basic_map_get_ctx(__isl_keep isl_basic_map *bmap);
-isl_ctx *isl_map_get_ctx(__isl_keep isl_map *map);
-__isl_give isl_dim *isl_basic_map_get_dim(__isl_keep isl_basic_map *bmap);
-__isl_give isl_dim *isl_map_get_dim(__isl_keep isl_map *map);
-
-struct isl_div *isl_basic_map_div(struct isl_basic_map *bmap, int pos);
-
-__isl_give isl_local_space *isl_basic_map_get_local_space(
-	__isl_keep isl_basic_map *bmap);
-
-__isl_give isl_basic_map *isl_basic_map_set_tuple_name(
-	__isl_take isl_basic_map *bmap, enum isl_dim_type type, const char *s);
-const char *isl_basic_map_get_tuple_name(__isl_keep isl_basic_map *bmap,
-	enum isl_dim_type type);
-const char *isl_map_get_tuple_name(__isl_keep isl_map *map,
-	enum isl_dim_type type);
-__isl_give isl_map *isl_map_set_tuple_name(__isl_take isl_map *map,
-	enum isl_dim_type type, const char *s);
-const char *isl_basic_map_get_dim_name(__isl_keep isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned pos);
-const char *isl_map_get_dim_name(__isl_keep isl_map *map,
-	enum isl_dim_type type, unsigned pos);
-__isl_give isl_basic_map *isl_basic_map_set_dim_name(
-	__isl_take isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned pos, const char *s);
-__isl_give isl_map *isl_map_set_dim_name(__isl_take isl_map *map,
-	enum isl_dim_type type, unsigned pos, const char *s);
-
-int isl_basic_map_is_rational(__isl_keep isl_basic_map *bmap);
-
-struct isl_basic_map *isl_basic_map_alloc(struct isl_ctx *ctx,
-		unsigned nparam, unsigned in, unsigned out, unsigned extra,
-		unsigned n_eq, unsigned n_ineq);
-__isl_give isl_basic_map *isl_basic_map_identity(__isl_take isl_dim *dim);
-struct isl_basic_map *isl_basic_map_identity_like(struct isl_basic_map *model);
-struct isl_basic_map *isl_basic_map_finalize(struct isl_basic_map *bmap);
-void isl_basic_map_free(__isl_take isl_basic_map *bmap);
-__isl_give isl_basic_map *isl_basic_map_copy(__isl_keep isl_basic_map *bmap);
-struct isl_basic_map *isl_basic_map_extend(struct isl_basic_map *base,
-		unsigned nparam, unsigned n_in, unsigned n_out, unsigned extra,
-		unsigned n_eq, unsigned n_ineq);
-struct isl_basic_map *isl_basic_map_extend_constraints(
-		struct isl_basic_map *base, unsigned n_eq, unsigned n_ineq);
-struct isl_basic_map *isl_basic_map_equal(
-		struct isl_dim *dim, unsigned n_equal);
-struct isl_basic_map *isl_basic_map_less_at(struct isl_dim *dim, unsigned pos);
-struct isl_basic_map *isl_basic_map_more_at(struct isl_dim *dim, unsigned pos);
-__isl_give isl_basic_map *isl_basic_map_empty(__isl_take isl_dim *dim);
-struct isl_basic_map *isl_basic_map_empty_like(struct isl_basic_map *model);
-struct isl_basic_map *isl_basic_map_empty_like_map(struct isl_map *model);
-__isl_give isl_basic_map *isl_basic_map_universe(__isl_take isl_dim *dim);
-__isl_give isl_basic_map *isl_basic_map_nat_universe(__isl_take isl_dim *dim);
-__isl_give isl_basic_map *isl_basic_map_universe_like(
-		__isl_keep isl_basic_map *bmap);
-__isl_give isl_basic_map *isl_basic_map_remove_redundancies(
-	__isl_take isl_basic_map *bmap);
-__isl_give isl_map *isl_map_remove_redundancies(__isl_take isl_map *map);
-__isl_give isl_basic_map *isl_map_simple_hull(__isl_take isl_map *map);
-
-__isl_give isl_basic_map *isl_basic_map_intersect_domain(
-		__isl_take isl_basic_map *bmap,
-		__isl_take isl_basic_set *bset);
-__isl_give isl_basic_map *isl_basic_map_intersect_range(
-		__isl_take isl_basic_map *bmap,
-		__isl_take isl_basic_set *bset);
-__isl_give isl_basic_map *isl_basic_map_intersect(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-__isl_give isl_map *isl_basic_map_union(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-__isl_give isl_basic_map *isl_basic_map_apply_domain(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-__isl_give isl_basic_map *isl_basic_map_apply_range(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-__isl_give isl_basic_map *isl_basic_map_affine_hull(
-		__isl_take isl_basic_map *bmap);
-__isl_give isl_basic_map *isl_basic_map_reverse(__isl_take isl_basic_map *bmap);
-__isl_give isl_basic_set *isl_basic_map_domain(__isl_take isl_basic_map *bmap);
-__isl_give isl_basic_set *isl_basic_map_range(__isl_take isl_basic_map *bmap);
-__isl_give isl_basic_map *isl_basic_map_domain_map(
-	__isl_take isl_basic_map *bmap);
-__isl_give isl_basic_map *isl_basic_map_range_map(
-	__isl_take isl_basic_map *bmap);
-__isl_give isl_basic_map *isl_basic_map_remove_dims(
-	__isl_take isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned first, unsigned n);
-struct isl_basic_map *isl_basic_map_from_basic_set(struct isl_basic_set *bset,
-		struct isl_dim *dim);
-struct isl_basic_set *isl_basic_set_from_basic_map(struct isl_basic_map *bmap);
-__isl_give isl_basic_map *isl_basic_map_sample(__isl_take isl_basic_map *bmap);
-struct isl_basic_map *isl_basic_map_simplify(struct isl_basic_map *bmap);
-struct isl_basic_map *isl_basic_map_detect_equalities(
-						struct isl_basic_map *bmap);
-__isl_give isl_basic_map *isl_basic_map_read_from_file(isl_ctx *ctx,
-		FILE *input, int nparam);
-__isl_give isl_basic_map *isl_basic_map_read_from_str(isl_ctx *ctx,
-		const char *str, int nparam);
-__isl_give isl_map *isl_map_read_from_file(struct isl_ctx *ctx,
-		FILE *input, int nparam);
-__isl_give isl_map *isl_map_read_from_str(isl_ctx *ctx,
-		const char *str, int nparam);
-void isl_basic_map_dump(__isl_keep isl_basic_map *bmap);
-void isl_basic_map_print(__isl_keep isl_basic_map *bmap, FILE *out, int indent,
-	const char *prefix, const char *suffix, unsigned output_format);
-void isl_map_dump(__isl_keep isl_map *map);
-void isl_map_print(__isl_keep isl_map *map, FILE *out, int indent,
-	unsigned output_format);
-__isl_give isl_printer *isl_printer_print_basic_map(
-	__isl_take isl_printer *printer, __isl_keep isl_basic_map *bmap);
-__isl_give isl_printer *isl_printer_print_map(__isl_take isl_printer *printer,
-	__isl_keep isl_map *map);
-__isl_give isl_basic_map *isl_basic_map_fix_si(__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned pos, int value);
-__isl_give isl_basic_map *isl_basic_map_lower_bound_si(
-		__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned pos, int value);
-
-struct isl_basic_map *isl_basic_map_sum(
-		struct isl_basic_map *bmap1, struct isl_basic_map *bmap2);
-struct isl_basic_map *isl_basic_map_neg(struct isl_basic_map *bmap);
-struct isl_basic_map *isl_basic_map_floordiv(struct isl_basic_map *bmap,
-		isl_int d);
-
-struct isl_map *isl_map_sum(struct isl_map *map1, struct isl_map *map2);
-struct isl_map *isl_map_neg(struct isl_map *map);
-struct isl_map *isl_map_floordiv(struct isl_map *map, isl_int d);
-
-int isl_basic_map_is_equal(
-		__isl_keep isl_basic_map *bmap1,
-		__isl_keep isl_basic_map *bmap2);
-
-__isl_give isl_map *isl_basic_map_partial_lexmax(
-		__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-		__isl_give isl_set **empty);
-__isl_give isl_map *isl_basic_map_partial_lexmin(
-		__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-		__isl_give isl_set **empty);
-__isl_give isl_map *isl_map_partial_lexmax(
-		__isl_take isl_map *map, __isl_take isl_set *dom,
-		__isl_give isl_set **empty);
-__isl_give isl_map *isl_map_partial_lexmin(
-		__isl_take isl_map *map, __isl_take isl_set *dom,
-		__isl_give isl_set **empty);
-__isl_give isl_map *isl_basic_map_lexmin(__isl_take isl_basic_map *bmap);
-__isl_give isl_map *isl_basic_map_lexmax(__isl_take isl_basic_map *bmap);
-__isl_give isl_map *isl_map_lexmin(__isl_take isl_map *map);
-__isl_give isl_map *isl_map_lexmax(__isl_take isl_map *map);
-int isl_basic_map_foreach_lexmin(__isl_keep isl_basic_map *bmap,
-	int (*fn)(__isl_take isl_basic_set *dom, __isl_take isl_aff_list *list,
-		  void *user),
-	void *user);
-int isl_basic_map_foreach_lexmax(__isl_keep isl_basic_map *bmap,
-	int (*fn)(__isl_take isl_basic_set *dom, __isl_take isl_aff_list *list,
-		  void *user),
-	void *user);
-
-void isl_basic_map_print_internal(__isl_keep isl_basic_map *bmap,
-	FILE *out, int indent);
-
-struct isl_basic_map *isl_map_copy_basic_map(struct isl_map *map);
-__isl_give isl_map *isl_map_drop_basic_map(__isl_take isl_map *map,
-						__isl_keep isl_basic_map *bmap);
-
-int isl_basic_map_plain_is_fixed(struct isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned pos, isl_int *val);
-
-int isl_basic_map_image_is_bounded(__isl_keep isl_basic_map *bmap);
-int isl_basic_map_is_universe(__isl_keep isl_basic_map *bmap);
-int isl_basic_map_plain_is_empty(__isl_keep isl_basic_map *bmap);
-int isl_basic_map_fast_is_empty(__isl_keep isl_basic_map *bmap);
-int isl_basic_map_is_empty(__isl_keep isl_basic_map *bmap);
-int isl_basic_map_is_subset(__isl_keep isl_basic_map *bmap1,
-		__isl_keep isl_basic_map *bmap2);
-int isl_basic_map_is_strict_subset(__isl_keep isl_basic_map *bmap1,
-		__isl_keep isl_basic_map *bmap2);
-
-struct isl_map *isl_map_alloc(struct isl_ctx *ctx,
-		unsigned nparam, unsigned in, unsigned out, int n,
-		unsigned flags);
-__isl_give isl_map *isl_map_universe(__isl_take isl_dim *dim);
-__isl_give isl_map *isl_map_nat_universe(__isl_take isl_dim *dim);
-__isl_give isl_map *isl_map_empty(__isl_take isl_dim *dim);
-struct isl_map *isl_map_empty_like(struct isl_map *model);
-struct isl_map *isl_map_empty_like_basic_map(struct isl_basic_map *model);
-struct isl_map *isl_map_dup(struct isl_map *map);
-__isl_give isl_map *isl_map_add_basic_map(__isl_take isl_map *map,
-						__isl_take isl_basic_map *bmap);
-__isl_give isl_map *isl_map_identity(__isl_take isl_dim *dim);
-struct isl_map *isl_map_identity_like(struct isl_map *model);
-struct isl_map *isl_map_identity_like_basic_map(struct isl_basic_map *model);
-__isl_give isl_map *isl_map_lex_lt_first(__isl_take isl_dim *dim, unsigned n);
-__isl_give isl_map *isl_map_lex_le_first(__isl_take isl_dim *dim, unsigned n);
-__isl_give isl_map *isl_map_lex_lt(__isl_take isl_dim *set_dim);
-__isl_give isl_map *isl_map_lex_le(__isl_take isl_dim *set_dim);
-__isl_give isl_map *isl_map_lex_gt_first(__isl_take isl_dim *dim, unsigned n);
-__isl_give isl_map *isl_map_lex_ge_first(__isl_take isl_dim *dim, unsigned n);
-__isl_give isl_map *isl_map_lex_gt(__isl_take isl_dim *set_dim);
-__isl_give isl_map *isl_map_lex_ge(__isl_take isl_dim *set_dim);
-struct isl_map *isl_map_finalize(struct isl_map *map);
-void isl_map_free(__isl_take isl_map *map);
-__isl_give isl_map *isl_map_copy(__isl_keep isl_map *map);
-struct isl_map *isl_map_extend(struct isl_map *base,
-		unsigned nparam, unsigned n_in, unsigned n_out);
-__isl_give isl_map *isl_map_reverse(__isl_take isl_map *map);
-__isl_give isl_map *isl_map_union(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-struct isl_map *isl_map_union_disjoint(
-			struct isl_map *map1, struct isl_map *map2);
-__isl_give isl_map *isl_map_intersect_domain(
-		__isl_take isl_map *map,
-		__isl_take isl_set *set);
-__isl_give isl_map *isl_map_intersect_range(
-		__isl_take isl_map *map,
-		__isl_take isl_set *set);
-__isl_give isl_map *isl_map_apply_domain(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-__isl_give isl_map *isl_map_apply_range(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-__isl_give isl_map *isl_map_product(__isl_take isl_map *map1,
-	__isl_take isl_map *map2);
-__isl_give isl_basic_map *isl_basic_map_range_product(
-	__isl_take isl_basic_map *bmap1, __isl_take isl_basic_map *bmap2);
-__isl_give isl_map *isl_map_range_product(__isl_take isl_map *map1,
-	__isl_take isl_map *map2);
-__isl_give isl_basic_map *isl_basic_map_flat_product(
-	__isl_take isl_basic_map *bmap1, __isl_take isl_basic_map *bmap2);
-__isl_give isl_map *isl_map_flat_product(__isl_take isl_map *map1,
-	__isl_take isl_map *map2);
-__isl_give isl_basic_map *isl_basic_map_flat_range_product(
-	__isl_take isl_basic_map *bmap1, __isl_take isl_basic_map *bmap2);
-__isl_give isl_map *isl_map_flat_range_product(__isl_take isl_map *map1,
-	__isl_take isl_map *map2);
-__isl_give isl_map *isl_map_intersect(__isl_take isl_map *map1,
-				      __isl_take isl_map *map2);
-__isl_give isl_map *isl_map_intersect_params(__isl_take isl_map *map,
-		__isl_take isl_set *params);
-__isl_give isl_map *isl_map_subtract(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-struct isl_map *isl_map_fix_input_si(struct isl_map *map,
-		unsigned input, int value);
-__isl_give isl_map *isl_map_fix_si(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned pos, int value);
-__isl_give isl_map *isl_map_lower_bound_si(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned pos, int value);
-__isl_give isl_basic_set *isl_basic_map_deltas(__isl_take isl_basic_map *bmap);
-__isl_give isl_set *isl_map_deltas(__isl_take isl_map *map);
-__isl_give isl_basic_map *isl_basic_map_deltas_map(
-	__isl_take isl_basic_map *bmap);
-__isl_give isl_map *isl_map_deltas_map(__isl_take isl_map *map);
-struct isl_map *isl_map_detect_equalities(struct isl_map *map);
-__isl_give isl_basic_map *isl_map_affine_hull(__isl_take isl_map *map);
-__isl_give isl_basic_map *isl_map_convex_hull(__isl_take isl_map *map);
-__isl_give isl_basic_map *isl_map_polyhedral_hull(__isl_take isl_map *map);
-__isl_give isl_basic_map *isl_basic_map_add(__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned n);
-__isl_give isl_map *isl_map_add_dims(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned n);
-__isl_give isl_map *isl_map_insert(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned pos, unsigned n);
-__isl_give isl_basic_map *isl_basic_map_move_dims(
-	__isl_take isl_basic_map *bmap,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n);
-__isl_give isl_map *isl_map_move_dims(__isl_take isl_map *map,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n);
-__isl_give isl_basic_map *isl_basic_map_project_out(
-		__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_map *isl_map_project_out(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_basic_map *isl_basic_map_remove_divs(
-	__isl_take isl_basic_map *bmap);
-__isl_give isl_map *isl_map_remove_divs(__isl_take isl_map *map);
-__isl_give isl_map *isl_map_remove_dims(__isl_take isl_map *map,
-	enum isl_dim_type type, unsigned first, unsigned n);
-struct isl_map *isl_map_remove_inputs(struct isl_map *map,
-	unsigned first, unsigned n);
-
-__isl_give isl_map *isl_set_identity(__isl_take isl_set *set);
-
-int isl_basic_set_is_wrapping(__isl_keep isl_basic_set *bset);
-int isl_set_is_wrapping(__isl_keep isl_set *set);
-__isl_give isl_basic_set *isl_basic_map_wrap(__isl_take isl_basic_map *bmap);
-__isl_give isl_set *isl_map_wrap(__isl_take isl_map *map);
-__isl_give isl_basic_map *isl_basic_set_unwrap(__isl_take isl_basic_set *bset);
-__isl_give isl_map *isl_set_unwrap(__isl_take isl_set *set);
-__isl_give isl_basic_map *isl_basic_map_flatten(__isl_take isl_basic_map *bmap);
-__isl_give isl_map *isl_map_flatten(__isl_take isl_map *map);
-__isl_give isl_basic_map *isl_basic_map_flatten_range(
-	__isl_take isl_basic_map *bmap);
-__isl_give isl_map *isl_map_flatten_range(__isl_take isl_map *map);
-__isl_give isl_basic_set *isl_basic_set_flatten(__isl_take isl_basic_set *bset);
-__isl_give isl_set *isl_set_flatten(__isl_take isl_set *set);
-__isl_give isl_map *isl_set_flatten_map(__isl_take isl_set *set);
-__isl_give isl_set *isl_map_domain(__isl_take isl_map *bmap);
-__isl_give isl_set *isl_map_range(__isl_take isl_map *map);
-__isl_give isl_map *isl_map_domain_map(__isl_take isl_map *map);
-__isl_give isl_map *isl_map_range_map(__isl_take isl_map *map);
-__isl_give isl_map *isl_map_from_basic_map(__isl_take isl_basic_map *bmap);
-__isl_give isl_map *isl_map_from_domain(__isl_take isl_set *set);
-__isl_give isl_basic_map *isl_basic_map_from_domain(
-	__isl_take isl_basic_set *bset);
-__isl_give isl_basic_map *isl_basic_map_from_range(
-	__isl_take isl_basic_set *bset);
-struct isl_map *isl_map_from_range(struct isl_set *set);
-__isl_give isl_basic_map *isl_basic_map_from_domain_and_range(
-	__isl_take isl_basic_set *domain, __isl_take isl_basic_set *range);
-__isl_give isl_map *isl_map_from_domain_and_range(__isl_take isl_set *domain,
-	__isl_take isl_set *range);
-struct isl_map *isl_map_from_set(struct isl_set *set, struct isl_dim *dim);
-struct isl_set *isl_set_from_map(struct isl_map *map);
-__isl_give isl_basic_map *isl_map_sample(__isl_take isl_map *map);
-
-int isl_map_plain_is_empty(__isl_keep isl_map *map);
-int isl_map_fast_is_empty(__isl_keep isl_map *map);
-int isl_map_plain_is_universe(__isl_keep isl_map *map);
-int isl_map_is_empty(__isl_keep isl_map *map);
-int isl_map_is_subset(__isl_keep isl_map *map1, __isl_keep isl_map *map2);
-int isl_map_is_strict_subset(__isl_keep isl_map *map1, __isl_keep isl_map *map2);
-int isl_map_is_equal(__isl_keep isl_map *map1, __isl_keep isl_map *map2);
-int isl_map_is_single_valued(__isl_keep isl_map *map);
-int isl_map_plain_is_injective(__isl_keep isl_map *map);
-int isl_map_is_injective(__isl_keep isl_map *map);
-int isl_map_is_bijective(__isl_keep isl_map *map);
-int isl_map_is_translation(__isl_keep isl_map *map);
-int isl_map_has_equal_dim(__isl_keep isl_map *map1, __isl_keep isl_map *map2);
-
-int isl_basic_map_can_zip(__isl_keep isl_basic_map *bmap);
-int isl_map_can_zip(__isl_keep isl_map *map);
-__isl_give isl_basic_map *isl_basic_map_zip(__isl_take isl_basic_map *bmap);
-__isl_give isl_map *isl_map_zip(__isl_take isl_map *map);
-
-__isl_give isl_map *isl_map_make_disjoint(__isl_take isl_map *map);
-__isl_give isl_map *isl_basic_map_compute_divs(__isl_take isl_basic_map *bmap);
-__isl_give isl_map *isl_map_compute_divs(__isl_take isl_map *map);
-__isl_give isl_map *isl_map_align_divs(__isl_take isl_map *map);
-
-void isl_map_print_internal(__isl_keep isl_map *map, FILE *out, int indent);
-
-int isl_map_plain_input_is_fixed(__isl_keep isl_map *map,
-		unsigned in, isl_int *val);
-int isl_map_plain_is_fixed(struct isl_map *map,
-	enum isl_dim_type type, unsigned pos, isl_int *val);
-int isl_map_fast_is_fixed(__isl_keep isl_map *map,
-	enum isl_dim_type type, unsigned pos, isl_int *val);
-
-__isl_give isl_basic_map *isl_basic_map_gist(__isl_take isl_basic_map *bmap,
-	__isl_take isl_basic_map *context);
-__isl_give isl_map *isl_map_gist(__isl_take isl_map *map,
-	__isl_take isl_map *context);
-__isl_give isl_map *isl_map_gist_basic_map(__isl_take isl_map *map,
-	__isl_take isl_basic_map *context);
-
-__isl_give isl_map *isl_map_coalesce(__isl_take isl_map *map);
-
-int isl_map_plain_is_equal(__isl_keep isl_map *map1, __isl_keep isl_map *map2);
-int isl_map_fast_is_equal(__isl_keep isl_map *map1, __isl_keep isl_map *map2);
-
-uint32_t isl_map_get_hash(__isl_keep isl_map *map);
-
-int isl_map_foreach_basic_map(__isl_keep isl_map *map,
-	int (*fn)(__isl_take isl_basic_map *bmap, void *user), void *user);
-
-__isl_give isl_map *isl_set_lifting(__isl_take isl_set *set);
-
-__isl_give isl_map *isl_map_power(__isl_take isl_map *map, int *exact);
-__isl_give isl_map *isl_map_reaching_path_lengths(__isl_take isl_map *map,
-	int *exact);
-__isl_give isl_map *isl_map_transitive_closure(__isl_take isl_map *map,
-	int *exact);
-
-__isl_give isl_map *isl_map_lex_le_map(__isl_take isl_map *map1,
-	__isl_take isl_map *map2);
-__isl_give isl_map *isl_map_lex_lt_map(__isl_take isl_map *map1,
-	__isl_take isl_map *map2);
-__isl_give isl_map *isl_map_lex_ge_map(__isl_take isl_map *map1,
-	__isl_take isl_map *map2);
-__isl_give isl_map *isl_map_lex_gt_map(__isl_take isl_map *map1,
-	__isl_take isl_map *map2);
-
-__isl_give isl_map *isl_map_align_params(__isl_take isl_map *map,
-	__isl_take isl_dim *model);
-
-__isl_give isl_mat *isl_basic_map_equalities_matrix(
-		__isl_keep isl_basic_map *bmap, enum isl_dim_type c1,
-		enum isl_dim_type c2, enum isl_dim_type c3,
-		enum isl_dim_type c4, enum isl_dim_type c5);
-__isl_give isl_mat *isl_basic_map_inequalities_matrix(
-		__isl_keep isl_basic_map *bmap, enum isl_dim_type c1,
-		enum isl_dim_type c2, enum isl_dim_type c3,
-		enum isl_dim_type c4, enum isl_dim_type c5);
-__isl_give isl_basic_map *isl_basic_map_from_constraint_matrices(
-	__isl_take isl_dim *dim,
-	__isl_take isl_mat *eq, __isl_take isl_mat *ineq, enum isl_dim_type c1,
-	enum isl_dim_type c2, enum isl_dim_type c3,
-	enum isl_dim_type c4, enum isl_dim_type c5);
-
-__isl_give isl_basic_map *isl_basic_map_from_aff(__isl_take isl_aff *aff);
-__isl_give isl_basic_map *isl_basic_map_from_aff_list(
-	__isl_take isl_dim *domain_dim, __isl_take isl_aff_list *list);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/map_type.h b/cloog-0.16.3/isl/include/isl/map_type.h
deleted file mode 100644
index 1ba26e0..0000000
--- a/cloog-0.16.3/isl/include/isl/map_type.h
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifndef ISL_MAP_TYPE_H
-#define ISL_MAP_TYPE_H
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_basic_map;
-typedef struct isl_basic_map isl_basic_map;
-struct isl_map;
-typedef struct isl_map isl_map;
-
-#ifndef isl_basic_set
-struct isl_basic_set;
-typedef struct isl_basic_set isl_basic_set;
-#endif
-#ifndef isl_set
-struct isl_set;
-typedef struct isl_set isl_set;
-#endif
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/mat.h b/cloog-0.16.3/isl/include/isl/mat.h
deleted file mode 100644
index eda1048..0000000
--- a/cloog-0.16.3/isl/include/isl/mat.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_MAT_H
-#define ISL_MAT_H
-
-#include <stdio.h>
-
-#include <isl/int.h>
-#include <isl/ctx.h>
-#include <isl/blk.h>
-#include <isl/vec.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_mat;
-typedef struct isl_mat	isl_mat;
-
-isl_ctx *isl_mat_get_ctx(__isl_keep isl_mat *mat);
-
-__isl_give isl_mat *isl_mat_alloc(struct isl_ctx *ctx,
-	unsigned n_row, unsigned n_col);
-struct isl_mat *isl_mat_dup(struct isl_mat *mat);
-struct isl_mat *isl_mat_extend(struct isl_mat *mat,
-	unsigned n_row, unsigned n_col);
-struct isl_mat *isl_mat_identity(struct isl_ctx *ctx, unsigned n_row);
-__isl_give isl_mat *isl_mat_copy(__isl_keep isl_mat *mat);
-struct isl_mat *isl_mat_cow(struct isl_mat *mat);
-void isl_mat_free(__isl_take isl_mat *mat);
-
-int isl_mat_rows(__isl_keep isl_mat *mat);
-int isl_mat_cols(__isl_keep isl_mat *mat);
-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,
-	int row, int col, isl_int v);
-__isl_give isl_mat *isl_mat_set_element_si(__isl_take isl_mat *mat,
-	int row, int col, int v);
-
-struct isl_mat *isl_mat_swap_cols(struct isl_mat *mat, unsigned i, unsigned j);
-struct isl_mat *isl_mat_swap_rows(struct isl_mat *mat, unsigned i, unsigned j);
-
-struct isl_vec *isl_mat_vec_product(struct isl_mat *mat, struct isl_vec *vec);
-struct isl_vec *isl_vec_mat_product(struct isl_vec *vec, struct isl_mat *mat);
-__isl_give isl_vec *isl_mat_vec_inverse_product(__isl_take isl_mat *mat,
-						__isl_take isl_vec *vec);
-struct isl_mat *isl_mat_aff_direct_sum(struct isl_mat *left,
-					struct isl_mat *right);
-__isl_give isl_mat *isl_mat_diagonal(__isl_take isl_mat *mat1,
-	__isl_take isl_mat *mat2);
-struct isl_mat *isl_mat_left_hermite(struct isl_mat *M,
-	int neg, struct isl_mat **U, struct isl_mat **Q);
-struct isl_mat *isl_mat_lin_to_aff(struct isl_mat *mat);
-struct isl_mat *isl_mat_inverse_product(struct isl_mat *left,
-	struct isl_mat *right);
-struct isl_mat *isl_mat_product(struct isl_mat *left, struct isl_mat *right);
-struct isl_mat *isl_mat_transpose(struct isl_mat *mat);
-__isl_give isl_mat *isl_mat_right_inverse(__isl_take isl_mat *mat);
-__isl_give isl_mat *isl_mat_right_kernel(__isl_take isl_mat *mat);
-
-__isl_give isl_mat *isl_mat_normalize(__isl_take isl_mat *mat);
-__isl_give isl_mat *isl_mat_normalize_row(__isl_take isl_mat *mat, int row);
-
-struct isl_mat *isl_mat_drop_cols(struct isl_mat *mat,
-				unsigned col, unsigned n);
-struct isl_mat *isl_mat_drop_rows(struct isl_mat *mat,
-				unsigned row, unsigned n);
-__isl_give isl_mat *isl_mat_insert_cols(__isl_take isl_mat *mat,
-				unsigned col, unsigned n);
-__isl_give isl_mat *isl_mat_insert_rows(__isl_take isl_mat *mat,
-				unsigned row, unsigned n);
-__isl_give isl_mat *isl_mat_move_cols(__isl_take isl_mat *mat,
-	unsigned dst_col, unsigned src_col, unsigned n);
-__isl_give isl_mat *isl_mat_add_rows(__isl_take isl_mat *mat, unsigned n);
-__isl_give isl_mat *isl_mat_insert_zero_cols(__isl_take isl_mat *mat,
-	unsigned first, unsigned n);
-__isl_give isl_mat *isl_mat_add_zero_cols(__isl_take isl_mat *mat, unsigned n);
-__isl_give isl_mat *isl_mat_insert_zero_rows(__isl_take isl_mat *mat,
-	unsigned row, unsigned n);
-__isl_give isl_mat *isl_mat_add_zero_rows(__isl_take isl_mat *mat, unsigned n);
-
-void isl_mat_col_add(__isl_keep isl_mat *mat, int dst_col, int src_col);
-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);
-
-struct isl_mat *isl_mat_unimodular_complete(struct isl_mat *M, int row);
-
-__isl_give isl_mat *isl_mat_from_row_vec(__isl_take isl_vec *vec);
-__isl_give isl_mat *isl_mat_concat(__isl_take isl_mat *top,
-	__isl_take isl_mat *bot);
-__isl_give isl_mat *isl_mat_vec_concat(__isl_take isl_mat *top,
-	__isl_take isl_vec *bot);
-
-int isl_mat_is_equal(__isl_keep isl_mat *mat1, __isl_keep isl_mat *mat2);
-
-int isl_mat_initial_non_zero_cols(__isl_keep isl_mat *mat);
-
-void isl_mat_print_internal(__isl_keep isl_mat *mat, FILE *out, int indent);
-void isl_mat_dump(__isl_keep isl_mat *mat);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/obj.h b/cloog-0.16.3/isl/include/isl/obj.h
deleted file mode 100644
index b2a6afc..0000000
--- a/cloog-0.16.3/isl/include/isl/obj.h
+++ /dev/null
@@ -1,64 +0,0 @@
-#ifndef ISL_OBJ_H
-#define ISL_OBJ_H
-
-#include <isl/set_type.h>
-#include <isl/map_type.h>
-#include <isl/union_set.h>
-#include <isl/union_map.h>
-#include <isl/polynomial.h>
-#include <isl/printer.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_obj_vtable {
-	void *(*copy)(void *v1);
-	void *(*add)(void *v1, void *v2);
-	__isl_give isl_printer *(*print)(__isl_take isl_printer *p, void *v);
-	void (*free)(void *v);
-};
-typedef struct isl_obj_vtable *isl_obj_type;
-extern struct isl_obj_vtable isl_obj_none_vtable;
-#define isl_obj_none		(&isl_obj_none_vtable)
-extern struct isl_obj_vtable isl_obj_int_vtable;
-#define isl_obj_int		(&isl_obj_int_vtable)
-extern struct isl_obj_vtable isl_obj_set_vtable;
-#define isl_obj_set		(&isl_obj_set_vtable)
-extern struct isl_obj_vtable isl_obj_union_set_vtable;
-#define isl_obj_union_set	(&isl_obj_union_set_vtable)
-extern struct isl_obj_vtable isl_obj_map_vtable;
-#define isl_obj_map		(&isl_obj_map_vtable)
-extern struct isl_obj_vtable isl_obj_union_map_vtable;
-#define isl_obj_union_map	(&isl_obj_union_map_vtable)
-extern struct isl_obj_vtable isl_obj_pw_qpolynomial_vtable;
-#define isl_obj_pw_qpolynomial	(&isl_obj_pw_qpolynomial_vtable)
-extern struct isl_obj_vtable isl_obj_union_pw_qpolynomial_vtable;
-#define isl_obj_union_pw_qpolynomial	(&isl_obj_union_pw_qpolynomial_vtable)
-extern struct isl_obj_vtable isl_obj_pw_qpolynomial_fold_vtable;
-#define isl_obj_pw_qpolynomial_fold	(&isl_obj_pw_qpolynomial_fold_vtable)
-extern struct isl_obj_vtable isl_obj_union_pw_qpolynomial_fold_vtable;
-#define isl_obj_union_pw_qpolynomial_fold	(&isl_obj_union_pw_qpolynomial_fold_vtable)
-struct isl_obj {
-	isl_obj_type	type;
-	void		*v;
-};
-
-struct isl_int_obj;
-typedef struct isl_int_obj isl_int_obj;
-
-__isl_give isl_int_obj *isl_int_obj_alloc(isl_ctx *ctx, isl_int v);
-void isl_int_obj_free(__isl_take isl_int_obj *i);
-__isl_give isl_int_obj *isl_int_obj_add(__isl_take isl_int_obj *i1,
-	__isl_take isl_int_obj *i2);
-__isl_give isl_int_obj *isl_int_obj_sub(__isl_take isl_int_obj *i1,
-	__isl_take isl_int_obj *i2);
-__isl_give isl_int_obj *isl_int_obj_mul(__isl_take isl_int_obj *i1,
-	__isl_take isl_int_obj *i2);
-void isl_int_obj_get_int(__isl_keep isl_int_obj *i, isl_int *v);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/options.h b/cloog-0.16.3/isl/include/isl/options.h
deleted file mode 100644
index d280ab3..0000000
--- a/cloog-0.16.3/isl/include/isl/options.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_OPTIONS_H
-#define ISL_OPTIONS_H
-
-#include <isl/arg.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_options {
-	#define			ISL_LP_TAB	0
-	#define			ISL_LP_PIP	1
-	unsigned		lp_solver;
-
-	#define			ISL_ILP_GBR	0
-	#define			ISL_ILP_PIP	1
-	unsigned		ilp_solver;
-
-	#define			ISL_PIP_TAB	0
-	#define			ISL_PIP_PIP	1
-	unsigned		pip;
-
-	#define			ISL_CONTEXT_GBR		0
-	#define			ISL_CONTEXT_LEXMIN	1
-	unsigned		context;
-
-	#define			ISL_GBR_NEVER	0
-	#define			ISL_GBR_ONCE	1
-	#define			ISL_GBR_ALWAYS	2
-	unsigned		gbr;
-	unsigned		gbr_only_first;
-
-	#define			ISL_CLOSURE_ISL		0
-	#define			ISL_CLOSURE_BOX		1
-	unsigned		closure;
-
-	#define			ISL_BOUND_BERNSTEIN	0
-	#define			ISL_BOUND_RANGE		1
-	int			bound;
-
-	#define			ISL_BERNSTEIN_FACTORS	1
-	#define			ISL_BERNSTEIN_INTERVALS	2
-	int			bernstein_recurse;
-
-	int			bernstein_triangulate;
-
-	int			pip_symmetry;
-
-	#define			ISL_CONVEX_HULL_WRAP	0
-	#define			ISL_CONVEX_HULL_FM	1
-	int			convex;
-
-	int			schedule_parametric;
-	int			schedule_outer_zero_distance;
-	int			schedule_maximize_band_depth;
-	int			schedule_split_parallel;
-};
-
-ISL_ARG_DECL(isl_options, struct isl_options, isl_options_arg)
-
-extern struct isl_arg isl_options_arg[];
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/point.h b/cloog-0.16.3/isl/include/isl/point.h
deleted file mode 100644
index a5a7f93..0000000
--- a/cloog-0.16.3/isl/include/isl/point.h
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef ISL_POINT_H
-#define ISL_POINT_H
-
-#include <stdio.h>
-#include <isl/dim.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_point;
-typedef struct isl_point isl_point;
-
-isl_ctx *isl_point_get_ctx(__isl_keep isl_point *pnt);
-__isl_give isl_dim *isl_point_get_dim(__isl_keep isl_point *pnt);
-
-__isl_give isl_point *isl_point_zero(__isl_take isl_dim *dim);
-__isl_give isl_point *isl_point_copy(__isl_keep isl_point *pnt);
-void isl_point_free(__isl_take isl_point *pnt);
-
-void isl_point_get_coordinate(__isl_keep isl_point *pnt,
-	enum isl_dim_type type, int pos, isl_int *v);
-__isl_give isl_point *isl_point_set_coordinate(__isl_take isl_point *pnt,
-	enum isl_dim_type type, int pos, isl_int v);
-
-__isl_give isl_point *isl_point_add_ui(__isl_take isl_point *pnt,
-	enum isl_dim_type type, int pos, unsigned val);
-__isl_give isl_point *isl_point_sub_ui(__isl_take isl_point *pnt,
-	enum isl_dim_type type, int pos, unsigned val);
-
-__isl_give isl_point *isl_point_void(__isl_take isl_dim *dim);
-int isl_point_is_void(__isl_keep isl_point *pnt);
-
-void isl_point_print(__isl_keep isl_point *pnt, FILE *out);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/polynomial.h b/cloog-0.16.3/isl/include/isl/polynomial.h
deleted file mode 100644
index 389d6ce..0000000
--- a/cloog-0.16.3/isl/include/isl/polynomial.h
+++ /dev/null
@@ -1,555 +0,0 @@
-#ifndef ISL_POLYNOMIAL_H
-#define ISL_POLYNOMIAL_H
-
-#include <isl/ctx.h>
-#include <isl/constraint.h>
-#include <isl/dim.h>
-#include <isl/div.h>
-#include <isl/set_type.h>
-#include <isl/point.h>
-#include <isl/printer.h>
-#include <isl/union_set.h>
-#include <isl/aff_type.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_qpolynomial;
-typedef struct isl_qpolynomial isl_qpolynomial;
-
-isl_ctx *isl_qpolynomial_get_ctx(__isl_keep isl_qpolynomial *qp);
-__isl_give isl_dim *isl_qpolynomial_get_dim(__isl_keep isl_qpolynomial *qp);
-__isl_give isl_qpolynomial *isl_qpolynomial_reset_dim(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_dim *dim);
-unsigned isl_qpolynomial_dim(__isl_keep isl_qpolynomial *qp,
-	enum isl_dim_type type);
-int isl_qpolynomial_involves_dims(__isl_keep isl_qpolynomial *qp,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_set_dim_name(
-	__isl_take isl_qpolynomial *qp,
-	enum isl_dim_type type, unsigned pos, const char *s);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_zero(__isl_take isl_dim *dim);
-__isl_give isl_qpolynomial *isl_qpolynomial_one(__isl_take isl_dim *dim);
-__isl_give isl_qpolynomial *isl_qpolynomial_infty(__isl_take isl_dim *dim);
-__isl_give isl_qpolynomial *isl_qpolynomial_neginfty(__isl_take isl_dim *dim);
-__isl_give isl_qpolynomial *isl_qpolynomial_nan(__isl_take isl_dim *dim);
-__isl_give isl_qpolynomial *isl_qpolynomial_rat_cst(__isl_take isl_dim *dim,
-	const isl_int n, const isl_int d);
-__isl_give isl_qpolynomial *isl_qpolynomial_div(__isl_take isl_div *div);
-__isl_give isl_qpolynomial *isl_qpolynomial_var(__isl_take isl_dim *dim,
-	enum isl_dim_type type, unsigned pos);
-__isl_give isl_qpolynomial *isl_qpolynomial_copy(__isl_keep isl_qpolynomial *qp);
-void isl_qpolynomial_free(__isl_take isl_qpolynomial *qp);
-
-int isl_qpolynomial_plain_is_equal(__isl_keep isl_qpolynomial *qp1,
-	__isl_keep isl_qpolynomial *qp2);
-int isl_qpolynomial_is_zero(__isl_keep isl_qpolynomial *qp);
-int isl_qpolynomial_is_nan(__isl_keep isl_qpolynomial *qp);
-int isl_qpolynomial_is_infty(__isl_keep isl_qpolynomial *qp);
-int isl_qpolynomial_is_neginfty(__isl_keep isl_qpolynomial *qp);
-int isl_qpolynomial_sgn(__isl_keep isl_qpolynomial *qp);
-int isl_qpolynomial_is_cst(__isl_keep isl_qpolynomial *qp,
-	isl_int *n, isl_int *d);
-void isl_qpolynomial_get_den(__isl_keep isl_qpolynomial *qp, isl_int *d);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_neg(__isl_take isl_qpolynomial *qp);
-__isl_give isl_qpolynomial *isl_qpolynomial_add(__isl_take isl_qpolynomial *qp1,
-	__isl_take isl_qpolynomial *qp2);
-__isl_give isl_qpolynomial *isl_qpolynomial_sub(__isl_take isl_qpolynomial *qp1,
-	__isl_take isl_qpolynomial *qp2);
-__isl_give isl_qpolynomial *isl_qpolynomial_mul(__isl_take isl_qpolynomial *qp1,
-	__isl_take isl_qpolynomial *qp2);
-__isl_give isl_qpolynomial *isl_qpolynomial_pow(__isl_take isl_qpolynomial *qp,
-	unsigned power);
-__isl_give isl_qpolynomial *isl_qpolynomial_add_isl_int(
-	__isl_take isl_qpolynomial *qp, isl_int v);
-__isl_give isl_qpolynomial *isl_qpolynomial_mul_isl_int(
-	__isl_take isl_qpolynomial *qp, isl_int v);
-__isl_give isl_qpolynomial *isl_qpolynomial_scale(
-	__isl_take isl_qpolynomial *qp, isl_int v);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_insert_dims(
-	__isl_take isl_qpolynomial *qp, enum isl_dim_type type,
-	unsigned first, unsigned n);
-__isl_give isl_qpolynomial *isl_qpolynomial_add_dims(
-	__isl_take isl_qpolynomial *qp, enum isl_dim_type type, unsigned n);
-__isl_give isl_qpolynomial *isl_qpolynomial_move_dims(
-	__isl_take isl_qpolynomial *qp,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n);
-__isl_give isl_qpolynomial *isl_qpolynomial_drop_dims(
-	__isl_take isl_qpolynomial *qp,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_substitute(
-	__isl_take isl_qpolynomial *qp,
-	enum isl_dim_type type, unsigned first, unsigned n,
-	__isl_keep isl_qpolynomial **subs);
-
-int isl_qpolynomial_as_polynomial_on_domain(__isl_keep isl_qpolynomial *qp,
-	__isl_keep isl_basic_set *bset,
-	int (*fn)(__isl_take isl_basic_set *bset,
-		  __isl_take isl_qpolynomial *poly, void *user), void *user);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_homogenize(
-	__isl_take isl_qpolynomial *poly);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_align_params(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_dim *model);
-
-struct isl_term;
-typedef struct isl_term isl_term;
-
-isl_ctx *isl_term_get_ctx(__isl_keep isl_term *term);
-
-void isl_term_free(__isl_take isl_term *term);
-
-unsigned isl_term_dim(__isl_keep isl_term *term, enum isl_dim_type type);
-void isl_term_get_num(__isl_keep isl_term *term, isl_int *n);
-void isl_term_get_den(__isl_keep isl_term *term, isl_int *d);
-int isl_term_get_exp(__isl_keep isl_term *term,
-	enum isl_dim_type type, unsigned pos);
-__isl_give isl_div *isl_term_get_div(__isl_keep isl_term *term, unsigned pos);
-
-int isl_qpolynomial_foreach_term(__isl_keep isl_qpolynomial *qp,
-	int (*fn)(__isl_take isl_term *term, void *user), void *user);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_eval(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_point *pnt);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_gist(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_set *context);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_from_constraint(
-	__isl_take isl_constraint *c, enum isl_dim_type type, unsigned pos);
-__isl_give isl_qpolynomial *isl_qpolynomial_from_term(__isl_take isl_term *term);
-__isl_give isl_qpolynomial *isl_qpolynomial_from_aff(__isl_take isl_aff *aff);
-__isl_give isl_basic_map *isl_basic_map_from_qpolynomial(
-	__isl_take isl_qpolynomial *qp);
-
-__isl_give isl_printer *isl_printer_print_qpolynomial(
-	__isl_take isl_printer *p, __isl_keep isl_qpolynomial *qp);
-void isl_qpolynomial_print(__isl_keep isl_qpolynomial *qp, FILE *out,
-	unsigned output_format);
-void isl_qpolynomial_dump(__isl_keep isl_qpolynomial *qp);
-
-struct isl_pw_qpolynomial;
-typedef struct isl_pw_qpolynomial isl_pw_qpolynomial;
-
-isl_ctx *isl_pw_qpolynomial_get_ctx(__isl_keep isl_pw_qpolynomial *pwqp);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_zero(__isl_take isl_dim *dim);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_alloc(__isl_take isl_set *set,
-	__isl_take isl_qpolynomial *qp);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_copy(
-	__isl_keep isl_pw_qpolynomial *pwqp);
-void *isl_pw_qpolynomial_free(__isl_take isl_pw_qpolynomial *pwqp);
-
-int isl_pw_qpolynomial_is_zero(__isl_keep isl_pw_qpolynomial *pwqp);
-
-__isl_give isl_dim *isl_pw_qpolynomial_get_dim(
-	__isl_keep isl_pw_qpolynomial *pwqp);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_reset_dim(
-	__isl_take isl_pw_qpolynomial *pwqp, __isl_take isl_dim *dim);
-unsigned isl_pw_qpolynomial_dim(__isl_keep isl_pw_qpolynomial *pwqp,
-	enum isl_dim_type type);
-int isl_pw_qpolynomial_involves_dims(__isl_keep isl_pw_qpolynomial *pwqp,
-	enum isl_dim_type type, unsigned first, unsigned n);
-int isl_pw_qpolynomial_has_equal_dim(__isl_keep isl_pw_qpolynomial *pwqp1,
-	__isl_keep isl_pw_qpolynomial *pwqp2);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_set_dim_name(
-	__isl_take isl_pw_qpolynomial *pwqp,
-	enum isl_dim_type type, unsigned pos, const char *s);
-
-__isl_give isl_set *isl_pw_qpolynomial_domain(__isl_take isl_pw_qpolynomial *pwqp);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_intersect_domain(
-	__isl_take isl_pw_qpolynomial *pwpq, __isl_take isl_set *set);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_drop_dims(
-	__isl_take isl_pw_qpolynomial *pwqp,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_split_dims(
-	__isl_take isl_pw_qpolynomial *pwqp,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add(
-	__isl_take isl_pw_qpolynomial *pwqp1,
-	__isl_take isl_pw_qpolynomial *pwqp2);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_sub(
-	__isl_take isl_pw_qpolynomial *pwqp1,
-	__isl_take isl_pw_qpolynomial *pwqp2);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add_disjoint(
-	__isl_take isl_pw_qpolynomial *pwqp1,
-	__isl_take isl_pw_qpolynomial *pwqp2);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_neg(
-	__isl_take isl_pw_qpolynomial *pwqp);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_mul(
-	__isl_take isl_pw_qpolynomial *pwqp1,
-	__isl_take isl_pw_qpolynomial *pwqp2);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_mul_isl_int(
-	__isl_take isl_pw_qpolynomial *pwqp, isl_int v);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_insert_dims(
-	__isl_take isl_pw_qpolynomial *pwqp, enum isl_dim_type type,
-	unsigned first, unsigned n);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add_dims(
-	__isl_take isl_pw_qpolynomial *pwqp,
-	enum isl_dim_type type, unsigned n);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_move_dims(
-	__isl_take isl_pw_qpolynomial *pwqp,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_fix_dim(
-	__isl_take isl_pw_qpolynomial *pwqp,
-	enum isl_dim_type type, unsigned n, isl_int v);
-
-__isl_give isl_qpolynomial *isl_pw_qpolynomial_eval(
-	__isl_take isl_pw_qpolynomial *pwqp, __isl_take isl_point *pnt);
-
-__isl_give isl_qpolynomial *isl_pw_qpolynomial_max(
-	__isl_take isl_pw_qpolynomial *pwqp);
-__isl_give isl_qpolynomial *isl_pw_qpolynomial_min(
-	__isl_take isl_pw_qpolynomial *pwqp);
-
-int isl_pw_qpolynomial_foreach_piece(__isl_keep isl_pw_qpolynomial *pwqp,
-	int (*fn)(__isl_take isl_set *set, __isl_take isl_qpolynomial *qp,
-		    void *user), void *user);
-int isl_pw_qpolynomial_foreach_lifted_piece(__isl_keep isl_pw_qpolynomial *pwqp,
-	int (*fn)(__isl_take isl_set *set, __isl_take isl_qpolynomial *qp,
-		    void *user), void *user);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_read_from_str(isl_ctx *ctx,
-		const char *str);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_read_from_file(isl_ctx *ctx,
-		FILE *input);
-__isl_give isl_printer *isl_printer_print_pw_qpolynomial(
-	__isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial *pwqp);
-void isl_pw_qpolynomial_print(__isl_keep isl_pw_qpolynomial *pwqp, FILE *out,
-	unsigned output_format);
-void isl_pw_qpolynomial_dump(__isl_keep isl_pw_qpolynomial *pwqp);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_coalesce(
-	__isl_take isl_pw_qpolynomial *pwqp);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_gist(
-	__isl_take isl_pw_qpolynomial *pwqp, __isl_take isl_set *context);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_split_periods(
-	__isl_take isl_pw_qpolynomial *pwqp, int max_periods);
-
-__isl_give isl_pw_qpolynomial *isl_basic_set_multiplicative_call(
-	__isl_take isl_basic_set *bset,
-	__isl_give isl_pw_qpolynomial *(*fn)(__isl_take isl_basic_set *bset));
-
-enum isl_fold {
-	isl_fold_min,
-	isl_fold_max,
-	isl_fold_list
-};
-
-struct isl_qpolynomial_fold;
-typedef struct isl_qpolynomial_fold isl_qpolynomial_fold;
-
-isl_ctx *isl_qpolynomial_fold_get_ctx(__isl_keep isl_qpolynomial_fold *fold);
-enum isl_fold isl_qpolynomial_fold_get_type(__isl_keep isl_qpolynomial_fold *fold);
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_empty(enum isl_fold type,
-	__isl_take isl_dim *dim);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_alloc(
-	enum isl_fold type, __isl_take isl_qpolynomial *qp);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_copy(
-	__isl_keep isl_qpolynomial_fold *fold);
-void isl_qpolynomial_fold_free(__isl_take isl_qpolynomial_fold *fold);
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_reset_dim(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_dim *dim);
-
-int isl_qpolynomial_fold_is_empty(__isl_keep isl_qpolynomial_fold *fold);
-int isl_qpolynomial_fold_plain_is_equal(__isl_keep isl_qpolynomial_fold *fold1,
-	__isl_keep isl_qpolynomial_fold *fold2);
-
-__isl_give isl_dim *isl_qpolynomial_fold_get_dim(
-	__isl_keep isl_qpolynomial_fold *fold);
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_fold(
-	__isl_take isl_qpolynomial_fold *fold1,
-	__isl_take isl_qpolynomial_fold *fold2);
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_mul_isl_int(
-	__isl_take isl_qpolynomial_fold *fold, isl_int v);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale(
-	__isl_take isl_qpolynomial_fold *fold, isl_int v);
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_move_dims(
-	__isl_take isl_qpolynomial_fold *fold,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n);
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_substitute(
-	__isl_take isl_qpolynomial_fold *fold,
-	enum isl_dim_type type, unsigned first, unsigned n,
-	__isl_keep isl_qpolynomial **subs);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_fold_eval(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_point *pnt);
-
-int isl_qpolynomial_fold_foreach_qpolynomial(
-	__isl_keep isl_qpolynomial_fold *fold,
-	int (*fn)(__isl_take isl_qpolynomial *qp, void *user), void *user);
-
-__isl_give isl_printer *isl_printer_print_qpolynomial_fold(
-	__isl_take isl_printer *p, __isl_keep isl_qpolynomial_fold *fold);
-void isl_qpolynomial_fold_print(__isl_keep isl_qpolynomial_fold *fold, FILE *out,
-	unsigned output_format);
-void isl_qpolynomial_fold_dump(__isl_keep isl_qpolynomial_fold *fold);
-
-struct isl_pw_qpolynomial_fold;
-typedef struct isl_pw_qpolynomial_fold isl_pw_qpolynomial_fold;
-
-isl_ctx *isl_pw_qpolynomial_fold_get_ctx(__isl_keep isl_pw_qpolynomial_fold *pwf);
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_from_pw_qpolynomial(
-	enum isl_fold type, __isl_take isl_pw_qpolynomial *pwqp);
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_alloc(
-	enum isl_fold type,
-	__isl_take isl_set *set, __isl_take isl_qpolynomial_fold *fold);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_copy(
-	__isl_keep isl_pw_qpolynomial_fold *pwf);
-void *isl_pw_qpolynomial_fold_free(__isl_take isl_pw_qpolynomial_fold *pwf);
-
-int isl_pw_qpolynomial_fold_is_zero(__isl_keep isl_pw_qpolynomial_fold *pwf);
-
-__isl_give isl_dim *isl_pw_qpolynomial_fold_get_dim(
-	__isl_keep isl_pw_qpolynomial_fold *pwf);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_reset_dim(
-	__isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_dim *dim);
-unsigned isl_pw_qpolynomial_fold_dim(__isl_keep isl_pw_qpolynomial_fold *pwf,
-	enum isl_dim_type type);
-int isl_pw_qpolynomial_fold_has_equal_dim(
-	__isl_keep isl_pw_qpolynomial_fold *pwf1,
-	__isl_keep isl_pw_qpolynomial_fold *pwf2);
-
-size_t isl_pw_qpolynomial_fold_size(__isl_keep isl_pw_qpolynomial_fold *pwf);
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_zero(
-	__isl_take isl_dim *dim, enum isl_fold type);
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_set_dim_name(
-	__isl_take isl_pw_qpolynomial_fold *pwf,
-	enum isl_dim_type type, unsigned pos, const char *s);
-
-__isl_give isl_set *isl_pw_qpolynomial_fold_domain(
-	__isl_take isl_pw_qpolynomial_fold *pwf);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_intersect_domain(
-	__isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_set *set);
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_add(
-	__isl_take isl_pw_qpolynomial_fold *pwf1,
-	__isl_take isl_pw_qpolynomial_fold *pwf2);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_fold(
-	__isl_take isl_pw_qpolynomial_fold *pwf1,
-	__isl_take isl_pw_qpolynomial_fold *pwf2);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_add_disjoint(
-	__isl_take isl_pw_qpolynomial_fold *pwf1,
-	__isl_take isl_pw_qpolynomial_fold *pwf2);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_mul_isl_int(
-	__isl_take isl_pw_qpolynomial_fold *pwf, isl_int v);
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_drop_dims(
-	__isl_take isl_pw_qpolynomial_fold *pwf,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_move_dims(
-	__isl_take isl_pw_qpolynomial_fold *pwf,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n);
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_fix_dim(
-	__isl_take isl_pw_qpolynomial_fold *pwf,
-	enum isl_dim_type type, unsigned n, isl_int v);
-
-__isl_give isl_qpolynomial *isl_pw_qpolynomial_fold_eval(
-	__isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_point *pnt);
-
-int isl_pw_qpolynomial_fold_foreach_piece(
-	__isl_keep isl_pw_qpolynomial_fold *pwf,
-	int (*fn)(__isl_take isl_set *set, __isl_take isl_qpolynomial_fold *fold,
-		    void *user), void *user);
-int isl_pw_qpolynomial_fold_foreach_lifted_piece(
-	__isl_keep isl_pw_qpolynomial_fold *pwf,
-	int (*fn)(__isl_take isl_set *set, __isl_take isl_qpolynomial_fold *fold,
-		    void *user), void *user);
-
-__isl_give isl_printer *isl_printer_print_pw_qpolynomial_fold(
-	__isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial_fold *pwf);
-void isl_pw_qpolynomial_fold_print(__isl_keep isl_pw_qpolynomial_fold *pwf,
-	FILE *out, unsigned output_format);
-void isl_pw_qpolynomial_fold_dump(__isl_keep isl_pw_qpolynomial_fold *pwf);
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_coalesce(
-	__isl_take isl_pw_qpolynomial_fold *pwf);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_gist(
-	__isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_set *context);
-
-__isl_give isl_qpolynomial *isl_pw_qpolynomial_fold_max(
-	__isl_take isl_pw_qpolynomial_fold *pwf);
-__isl_give isl_qpolynomial *isl_pw_qpolynomial_fold_min(
-	__isl_take isl_pw_qpolynomial_fold *pwf);
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_bound(
-	__isl_take isl_pw_qpolynomial *pwqp, enum isl_fold type, int *tight);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_bound(
-	__isl_take isl_pw_qpolynomial_fold *pwf, int *tight);
-__isl_give isl_pw_qpolynomial_fold *isl_set_apply_pw_qpolynomial_fold(
-	__isl_take isl_set *set, __isl_take isl_pw_qpolynomial_fold *pwf,
-	int *tight);
-__isl_give isl_pw_qpolynomial_fold *isl_map_apply_pw_qpolynomial_fold(
-	__isl_take isl_map *map, __isl_take isl_pw_qpolynomial_fold *pwf,
-	int *tight);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_to_polynomial(
-	__isl_take isl_pw_qpolynomial *pwqp, int sign);
-
-struct isl_union_pw_qpolynomial;
-typedef struct isl_union_pw_qpolynomial isl_union_pw_qpolynomial;
-
-isl_ctx *isl_union_pw_qpolynomial_get_ctx(
-	__isl_keep isl_union_pw_qpolynomial *upwqp);
-
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_from_pw_qpolynomial(__isl_take isl_pw_qpolynomial *pwqp);
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_zero(
-	__isl_take isl_dim *dim);
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_add_pw_qpolynomial(
-	__isl_take isl_union_pw_qpolynomial *upwqp,
-	__isl_take isl_pw_qpolynomial *pwqp);
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_copy(
-	__isl_keep isl_union_pw_qpolynomial *upwqp);
-void isl_union_pw_qpolynomial_free(__isl_take isl_union_pw_qpolynomial *upwqp);
-
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_add(
-	__isl_take isl_union_pw_qpolynomial *upwqp1,
-	__isl_take isl_union_pw_qpolynomial *upwqp2);
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_sub(
-	__isl_take isl_union_pw_qpolynomial *upwqp1,
-	__isl_take isl_union_pw_qpolynomial *upwqp2);
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_mul(
-	__isl_take isl_union_pw_qpolynomial *upwqp1,
-	__isl_take isl_union_pw_qpolynomial *upwqp2);
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_mul_isl_int(
-	__isl_take isl_union_pw_qpolynomial *upwqp, isl_int v);
-
-__isl_give isl_union_set *isl_union_pw_qpolynomial_domain(
-	__isl_take isl_union_pw_qpolynomial *upwqp);
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_intersect_domain(
-	__isl_take isl_union_pw_qpolynomial *upwpq,
-	__isl_take isl_union_set *uset);
-
-__isl_give isl_dim *isl_union_pw_qpolynomial_get_dim(
-	__isl_keep isl_union_pw_qpolynomial *upwqp);
-
-__isl_give isl_qpolynomial *isl_union_pw_qpolynomial_eval(
-	__isl_take isl_union_pw_qpolynomial *upwqp, __isl_take isl_point *pnt);
-
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_coalesce(
-	__isl_take isl_union_pw_qpolynomial *upwqp);
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_gist(
-	__isl_take isl_union_pw_qpolynomial *upwqp,
-	__isl_take isl_union_set *context);
-
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_align_params(
-	__isl_take isl_union_pw_qpolynomial *upwqp,
-	__isl_take isl_dim *model);
-
-int isl_union_pw_qpolynomial_foreach_pw_qpolynomial(
-	__isl_keep isl_union_pw_qpolynomial *upwqp,
-	int (*fn)(__isl_take isl_pw_qpolynomial *pwqp, void *user), void *user);
-__isl_give isl_pw_qpolynomial *isl_union_pw_qpolynomial_extract_pw_qpolynomial(
-	__isl_keep isl_union_pw_qpolynomial *upwqp, __isl_take isl_dim *dim);
-
-__isl_give isl_printer *isl_printer_print_union_pw_qpolynomial(
-	__isl_take isl_printer *p, __isl_keep isl_union_pw_qpolynomial *upwqp);
-
-struct isl_union_pw_qpolynomial_fold;
-typedef struct isl_union_pw_qpolynomial_fold isl_union_pw_qpolynomial_fold;
-
-isl_ctx *isl_union_pw_qpolynomial_fold_get_ctx(
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf);
-
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_from_pw_qpolynomial_fold(__isl_take isl_pw_qpolynomial_fold *pwf);
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_zero(
-	__isl_take isl_dim *dim, enum isl_fold type);
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_fold_pw_qpolynomial_fold(
-	__isl_take isl_union_pw_qpolynomial_fold *upwqp,
-	__isl_take isl_pw_qpolynomial_fold *pwqp);
-void isl_union_pw_qpolynomial_fold_free(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf);
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_copy(
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf);
-
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_fold(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf1,
-	__isl_take isl_union_pw_qpolynomial_fold *upwf2);
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_add_union_pw_qpolynomial(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf,
-	__isl_take isl_union_pw_qpolynomial *upwqp);
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_mul_isl_int(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf, isl_int v);
-
-__isl_give isl_union_set *isl_union_pw_qpolynomial_fold_domain(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf);
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_intersect_domain(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf,
-	__isl_take isl_union_set *uset);
-
-enum isl_fold isl_union_pw_qpolynomial_fold_get_type(
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf);
-__isl_give isl_dim *isl_union_pw_qpolynomial_fold_get_dim(
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf);
-
-__isl_give isl_qpolynomial *isl_union_pw_qpolynomial_fold_eval(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf,
-	__isl_take isl_point *pnt);
-
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_coalesce(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf);
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_gist(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf,
-	__isl_take isl_union_set *context);
-
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_align_params(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf,
-	__isl_take isl_dim *model);
-
-int isl_union_pw_qpolynomial_fold_foreach_pw_qpolynomial_fold(
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf,
-	int (*fn)(__isl_take isl_pw_qpolynomial_fold *pwf,
-		    void *user), void *user);
-__isl_give isl_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_extract_pw_qpolynomial_fold(
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf, __isl_take isl_dim *dim);
-
-__isl_give isl_printer *isl_printer_print_union_pw_qpolynomial_fold(
-	__isl_take isl_printer *p,
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf);
-
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_bound(
-	__isl_take isl_union_pw_qpolynomial *upwqp,
-	enum isl_fold type, int *tight);
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_set_apply_union_pw_qpolynomial_fold(
-	__isl_take isl_union_set *uset,
-	__isl_take isl_union_pw_qpolynomial_fold *upwf, int *tight);
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_map_apply_union_pw_qpolynomial_fold(
-	__isl_take isl_union_map *umap,
-	__isl_take isl_union_pw_qpolynomial_fold *upwf, int *tight);
-
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_to_polynomial(
-	__isl_take isl_union_pw_qpolynomial *upwqp, int sign);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/printer.h b/cloog-0.16.3/isl/include/isl/printer.h
deleted file mode 100644
index da2f043..0000000
--- a/cloog-0.16.3/isl/include/isl/printer.h
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef ISL_PRINTER_H
-#define ISL_PRINTER_H
-
-#include <stdio.h>
-#include <isl/ctx.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_printer;
-typedef struct isl_printer isl_printer;
-
-__isl_give isl_printer *isl_printer_to_file(isl_ctx *ctx, FILE *file);
-__isl_give isl_printer *isl_printer_to_str(isl_ctx *ctx);
-void isl_printer_free(__isl_take isl_printer *printer);
-
-isl_ctx *isl_printer_get_ctx(__isl_keep isl_printer *printer);
-
-__isl_give char *isl_printer_get_str(__isl_keep isl_printer *printer);
-
-__isl_give isl_printer *isl_printer_set_indent(__isl_take isl_printer *p,
-	int indent);
-__isl_give isl_printer *isl_printer_indent(__isl_take isl_printer *p,
-	int indent);
-
-#define ISL_FORMAT_ISL			0
-#define ISL_FORMAT_POLYLIB		1
-#define ISL_FORMAT_POLYLIB_CONSTRAINTS	2
-#define ISL_FORMAT_OMEGA		3
-#define ISL_FORMAT_C			4
-#define ISL_FORMAT_LATEX		5
-#define ISL_FORMAT_EXT_POLYLIB		6
-__isl_give isl_printer *isl_printer_set_output_format(__isl_take isl_printer *p,
-	int output_format);
-
-__isl_give isl_printer *isl_printer_set_prefix(__isl_take isl_printer *p,
-	const char *prefix);
-__isl_give isl_printer *isl_printer_set_suffix(__isl_take isl_printer *p,
-	const char *suffix);
-__isl_give isl_printer *isl_printer_set_isl_int_width(__isl_take isl_printer *p,
-	int width);
-
-__isl_give isl_printer *isl_printer_start_line(__isl_take isl_printer *p);
-__isl_give isl_printer *isl_printer_end_line(__isl_take isl_printer *p);
-__isl_give isl_printer *isl_printer_print_int(__isl_take isl_printer *p, int i);
-__isl_give isl_printer *isl_printer_print_isl_int(__isl_take isl_printer *p,
-	isl_int i);
-__isl_give isl_printer *isl_printer_print_str(__isl_take isl_printer *p,
-	const char *s);
-
-__isl_give isl_printer *isl_printer_flush(__isl_take isl_printer *p);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/schedule.h b/cloog-0.16.3/isl/include/isl/schedule.h
deleted file mode 100644
index 20cb40b..0000000
--- a/cloog-0.16.3/isl/include/isl/schedule.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef ISL_SCHEDULE_H
-#define ISL_SCHEDULE_H
-
-#include <isl/union_set.h>
-#include <isl/union_map.h>
-#include <isl/list.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_schedule;
-typedef struct isl_schedule isl_schedule;
-
-__isl_give isl_schedule *isl_union_set_compute_schedule(
-	__isl_take isl_union_set *domain,
-	__isl_take isl_union_map *validity,
-	__isl_take isl_union_map *proximity);
-void *isl_schedule_free(__isl_take isl_schedule *sched);
-__isl_give isl_union_map *isl_schedule_get_map(__isl_keep isl_schedule *sched);
-
-isl_ctx *isl_schedule_get_ctx(__isl_keep isl_schedule *sched);
-
-__isl_give isl_band_list *isl_schedule_get_band_forest(
-	__isl_keep isl_schedule *schedule);
-
-__isl_give isl_printer *isl_printer_print_schedule(__isl_take isl_printer *p,
-	__isl_keep isl_schedule *schedule);
-void isl_schedule_dump(__isl_keep isl_schedule *schedule);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/seq.h b/cloog-0.16.3/isl/include/isl/seq.h
deleted file mode 100644
index eda8818..0000000
--- a/cloog-0.16.3/isl/include/isl/seq.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_SEQ_H
-#define ISL_SEQ_H
-
-#include <sys/types.h>
-#include <isl/int.h>
-#include <isl/ctx.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/* Some common operations on sequences of isl_int's */
-
-void isl_seq_clr(isl_int *p, unsigned len);
-void isl_seq_set(isl_int *p, isl_int v, unsigned len);
-void isl_seq_neg(isl_int *dat, isl_int *src, unsigned len);
-void isl_seq_cpy(isl_int *dst, isl_int *src, unsigned len);
-void isl_seq_addmul(isl_int *dst, isl_int f, isl_int *src, unsigned len);
-void isl_seq_submul(isl_int *dst, isl_int f, isl_int *src, unsigned len);
-void isl_seq_swp_or_cpy(isl_int *dst, isl_int *src, unsigned len);
-void isl_seq_scale(isl_int *dst, isl_int *src, isl_int f, unsigned len);
-void isl_seq_scale_down(isl_int *dst, isl_int *src, isl_int f, unsigned len);
-void isl_seq_cdiv_q(isl_int *dst, isl_int *src, isl_int m, unsigned len);
-void isl_seq_fdiv_q(isl_int *dst, isl_int *src, isl_int m, unsigned len);
-void isl_seq_fdiv_r(isl_int *dst, isl_int *src, isl_int m, unsigned len);
-void isl_seq_combine(isl_int *dst, isl_int m1, isl_int *src1,
-			isl_int m2, isl_int *src2, unsigned len);
-void isl_seq_elim(isl_int *dst, isl_int *src, unsigned pos, unsigned len,
-		  isl_int *m);
-void isl_seq_gcd(isl_int *p, unsigned len, isl_int *gcd);
-void isl_seq_lcm(isl_int *p, unsigned len, isl_int *lcm);
-void isl_seq_normalize(struct isl_ctx *ctx, isl_int *p, unsigned len);
-void isl_seq_inner_product(isl_int *p1, isl_int *p2, unsigned len,
-			   isl_int *prod);
-int isl_seq_first_non_zero(isl_int *p, unsigned len);
-int isl_seq_last_non_zero(isl_int *p, unsigned len);
-int isl_seq_abs_min_non_zero(isl_int *p, unsigned len);
-int isl_seq_eq(isl_int *p1, isl_int *p2, unsigned len);
-int isl_seq_cmp(isl_int *p1, isl_int *p2, unsigned len);
-int isl_seq_is_neg(isl_int *p1, isl_int *p2, unsigned len);
-
-uint32_t isl_seq_get_hash(isl_int *p, unsigned len);
-uint32_t isl_seq_get_hash_bits(isl_int *p, unsigned len, unsigned bits);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/set.h b/cloog-0.16.3/isl/include/isl/set.h
deleted file mode 100644
index 026adc3..0000000
--- a/cloog-0.16.3/isl/include/isl/set.h
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_SET_H
-#define ISL_SET_H
-
-#include <isl/map_type.h>
-#include <isl/aff_type.h>
-#include <isl/list.h>
-#include <isl/mat.h>
-#include <isl/point.h>
-#include <isl/local_space.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-unsigned isl_basic_set_n_dim(const struct isl_basic_set *bset);
-unsigned isl_basic_set_n_param(const struct isl_basic_set *bset);
-unsigned isl_basic_set_total_dim(const struct isl_basic_set *bset);
-unsigned isl_basic_set_dim(const struct isl_basic_set *bset,
-				enum isl_dim_type type);
-
-unsigned isl_set_n_dim(const struct isl_set *set);
-unsigned isl_set_n_param(const struct isl_set *set);
-unsigned isl_set_dim(const struct isl_set *set, enum isl_dim_type type);
-
-isl_ctx *isl_basic_set_get_ctx(__isl_keep isl_basic_set *bset);
-isl_ctx *isl_set_get_ctx(__isl_keep isl_set *set);
-__isl_give isl_dim *isl_basic_set_get_dim(__isl_keep isl_basic_set *bset);
-__isl_give isl_dim *isl_set_get_dim(__isl_keep isl_set *set);
-__isl_give isl_set *isl_set_reset_dim(__isl_take isl_set *set,
-	__isl_take isl_dim *dim);
-
-struct isl_div *isl_basic_set_div(struct isl_basic_set *bset, int pos);
-
-__isl_give isl_local_space *isl_basic_set_get_local_space(
-	__isl_keep isl_basic_set *bset);
-
-const char *isl_basic_set_get_tuple_name(__isl_keep isl_basic_set *bset);
-const char *isl_set_get_tuple_name(__isl_keep isl_set *set);
-__isl_give isl_basic_set *isl_basic_set_set_tuple_name(
-	__isl_take isl_basic_set *set, const char *s);
-__isl_give isl_set *isl_set_set_tuple_name(__isl_take isl_set *set,
-	const char *s);
-const char *isl_basic_set_get_dim_name(__isl_keep isl_basic_set *bset,
-	enum isl_dim_type type, unsigned pos);
-__isl_give isl_basic_set *isl_basic_set_set_dim_name(
-	__isl_take isl_basic_set *bset,
-	enum isl_dim_type type, unsigned pos, const char *s);
-const char *isl_set_get_dim_name(__isl_keep isl_set *set,
-	enum isl_dim_type type, unsigned pos);
-__isl_give isl_set *isl_set_set_dim_name(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned pos, const char *s);
-
-int isl_basic_set_is_rational(__isl_keep isl_basic_set *bset);
-
-struct isl_basic_set *isl_basic_set_alloc(struct isl_ctx *ctx,
-		unsigned nparam, unsigned dim, unsigned extra,
-		unsigned n_eq, unsigned n_ineq);
-struct isl_basic_set *isl_basic_set_extend(struct isl_basic_set *base,
-		unsigned nparam, unsigned dim, unsigned extra,
-		unsigned n_eq, unsigned n_ineq);
-struct isl_basic_set *isl_basic_set_extend_constraints(
-		struct isl_basic_set *base, unsigned n_eq, unsigned n_ineq);
-struct isl_basic_set *isl_basic_set_finalize(struct isl_basic_set *bset);
-void isl_basic_set_free(__isl_take isl_basic_set *bset);
-__isl_give isl_basic_set *isl_basic_set_copy(__isl_keep isl_basic_set *bset);
-struct isl_basic_set *isl_basic_set_dup(struct isl_basic_set *bset);
-__isl_give isl_basic_set *isl_basic_set_empty(__isl_take isl_dim *dim);
-struct isl_basic_set *isl_basic_set_empty_like(struct isl_basic_set *bset);
-__isl_give isl_basic_set *isl_basic_set_universe(__isl_take isl_dim *dim);
-__isl_give isl_basic_set *isl_basic_set_nat_universe(__isl_take isl_dim *dim);
-struct isl_basic_set *isl_basic_set_universe_like(struct isl_basic_set *bset);
-__isl_give isl_basic_set *isl_basic_set_universe_like_set(
-	__isl_keep isl_set *model);
-struct isl_basic_set *isl_basic_set_interval(struct isl_ctx *ctx,
-	isl_int min, isl_int max);
-struct isl_basic_set *isl_basic_set_positive_orthant(struct isl_dim *dims);
-void isl_basic_set_print_internal(__isl_keep isl_basic_set *bset,
-				FILE *out, int indent);
-__isl_give isl_basic_set *isl_basic_set_intersect(
-		__isl_take isl_basic_set *bset1,
-		__isl_take isl_basic_set *bset2);
-__isl_give isl_basic_set *isl_basic_set_apply(
-		__isl_take isl_basic_set *bset,
-		__isl_take isl_basic_map *bmap);
-__isl_give isl_basic_set *isl_basic_set_affine_hull(
-		__isl_take isl_basic_set *bset);
-__isl_give isl_basic_set *isl_basic_set_remove_dims(
-	__isl_take isl_basic_set *bset,
-	enum isl_dim_type type, unsigned first, unsigned n);
-struct isl_basic_set *isl_basic_set_simplify(struct isl_basic_set *bset);
-__isl_give isl_basic_set *isl_basic_set_detect_equalities(
-						__isl_take isl_basic_set *bset);
-__isl_give isl_basic_set *isl_basic_set_remove_redundancies(
-	__isl_take isl_basic_set *bset);
-__isl_give isl_set *isl_set_remove_redundancies(__isl_take isl_set *set);
-__isl_give isl_basic_set *isl_basic_set_list_product(
-	__isl_take struct isl_basic_set_list *list);
-
-__isl_give isl_basic_set *isl_basic_set_read_from_file(isl_ctx *ctx,
-		FILE *input, int nparam);
-__isl_give isl_basic_set *isl_basic_set_read_from_str(isl_ctx *ctx,
-		const char *str, int nparam);
-__isl_give isl_set *isl_set_read_from_file(isl_ctx *ctx,
-		FILE *input, int nparam);
-__isl_give isl_set *isl_set_read_from_str(isl_ctx *ctx,
-		const char *str, int nparam);
-void isl_basic_set_dump(__isl_keep isl_basic_set *bset);
-void isl_set_dump(__isl_keep isl_set *set);
-__isl_give isl_printer *isl_printer_print_basic_set(
-	__isl_take isl_printer *printer, __isl_keep isl_basic_set *bset);
-__isl_give isl_printer *isl_printer_print_set(__isl_take isl_printer *printer,
-	__isl_keep isl_set *map);
-void isl_basic_set_print(__isl_keep isl_basic_set *bset, FILE *out, int indent,
-	const char *prefix, const char *suffix, unsigned output_format);
-void isl_set_print(__isl_keep struct isl_set *set, FILE *out, int indent,
-	unsigned output_format);
-__isl_give isl_basic_set *isl_basic_set_fix(__isl_take isl_basic_set *bset,
-		enum isl_dim_type type, unsigned pos, isl_int value);
-__isl_give isl_basic_set *isl_basic_set_fix_si(__isl_take isl_basic_set *bset,
-		enum isl_dim_type type, unsigned pos, int value);
-__isl_give isl_set *isl_set_fix_si(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos, int value);
-__isl_give isl_set *isl_set_lower_bound_si(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos, int value);
-
-struct isl_basic_set *isl_basic_set_from_underlying_set(
-	struct isl_basic_set *bset, struct isl_basic_set *like);
-struct isl_set *isl_set_from_underlying_set(
-	struct isl_set *set, struct isl_basic_set *like);
-struct isl_set *isl_set_to_underlying_set(struct isl_set *set);
-
-int isl_basic_set_is_equal(
-		struct isl_basic_set *bset1, struct isl_basic_set *bset2);
-
-__isl_give isl_set *isl_basic_set_partial_lexmin(
-		__isl_take isl_basic_set *bset, __isl_take isl_basic_set *dom,
-		__isl_give isl_set **empty);
-__isl_give isl_set *isl_basic_set_partial_lexmax(
-		__isl_take isl_basic_set *bset, __isl_take isl_basic_set *dom,
-		__isl_give isl_set **empty);
-__isl_give isl_set *isl_set_partial_lexmin(
-		__isl_take isl_set *set, __isl_take isl_set *dom,
-		__isl_give isl_set **empty);
-__isl_give isl_set *isl_set_partial_lexmax(
-		__isl_take isl_set *set, __isl_take isl_set *dom,
-		__isl_give isl_set **empty);
-__isl_give isl_set *isl_basic_set_lexmin(__isl_take isl_basic_set *bset);
-__isl_give isl_set *isl_basic_set_lexmax(__isl_take isl_basic_set *bset);
-__isl_give isl_set *isl_set_lexmin(__isl_take isl_set *set);
-__isl_give isl_set *isl_set_lexmax(__isl_take isl_set *set);
-int isl_basic_set_foreach_lexmax(__isl_keep isl_basic_set *bset,
-	int (*fn)(__isl_take isl_basic_set *dom, __isl_take isl_aff_list *list,
-		  void *user),
-	void *user);
-
-__isl_give isl_set *isl_basic_set_union(
-		__isl_take isl_basic_set *bset1,
-		__isl_take isl_basic_set *bset2);
-
-int isl_basic_set_compare_at(struct isl_basic_set *bset1,
-	struct isl_basic_set *bset2, int pos);
-int isl_set_follows_at(__isl_keep isl_set *set1,
-	__isl_keep isl_set *set2, int pos);
-
-int isl_basic_set_dims_get_sign(__isl_keep isl_basic_set *bset,
-	enum isl_dim_type type, unsigned pos, unsigned n, int *signs);
-
-int isl_basic_set_is_universe(__isl_keep isl_basic_set *bset);
-int isl_basic_set_plain_is_empty(__isl_keep isl_basic_set *bset);
-int isl_basic_set_fast_is_empty(__isl_keep isl_basic_set *bset);
-int isl_basic_set_is_empty(__isl_keep isl_basic_set *bset);
-int isl_basic_set_is_bounded(__isl_keep isl_basic_set *bset);
-
-struct isl_set *isl_set_alloc(struct isl_ctx *ctx,
-		unsigned nparam, unsigned dim, int n, unsigned flags);
-struct isl_set *isl_set_extend(struct isl_set *base,
-		unsigned nparam, unsigned dim);
-__isl_give isl_set *isl_set_empty(__isl_take isl_dim *dim);
-struct isl_set *isl_set_empty_like(struct isl_set *set);
-__isl_give isl_set *isl_set_universe(__isl_take isl_dim *dim);
-__isl_give isl_set *isl_set_nat_universe(__isl_take isl_dim *dim);
-__isl_give isl_set *isl_set_universe_like(__isl_keep isl_set *model);
-__isl_give isl_set *isl_set_add_basic_set(__isl_take isl_set *set,
-						__isl_take isl_basic_set *bset);
-struct isl_set *isl_set_finalize(struct isl_set *set);
-__isl_give isl_set *isl_set_copy(__isl_keep isl_set *set);
-void isl_set_free(__isl_take isl_set *set);
-struct isl_set *isl_set_dup(struct isl_set *set);
-__isl_give isl_set *isl_set_from_basic_set(__isl_take isl_basic_set *bset);
-__isl_give isl_basic_set *isl_set_sample(__isl_take isl_set *set);
-__isl_give isl_point *isl_basic_set_sample_point(__isl_take isl_basic_set *bset);
-__isl_give isl_point *isl_set_sample_point(__isl_take isl_set *set);
-__isl_give isl_set *isl_set_detect_equalities(__isl_take isl_set *set);
-__isl_give isl_basic_set *isl_set_affine_hull(__isl_take isl_set *set);
-__isl_give isl_basic_set *isl_set_convex_hull(__isl_take isl_set *set);
-__isl_give isl_basic_set *isl_set_polyhedral_hull(__isl_take isl_set *set);
-__isl_give isl_basic_set *isl_set_simple_hull(__isl_take isl_set *set);
-struct isl_basic_set *isl_set_bounded_simple_hull(struct isl_set *set);
-__isl_give isl_set *isl_set_recession_cone(__isl_take isl_set *set);
-
-struct isl_set *isl_set_union_disjoint(
-			struct isl_set *set1, struct isl_set *set2);
-__isl_give isl_set *isl_set_union(
-		__isl_take isl_set *set1,
-		__isl_take isl_set *set2);
-__isl_give isl_set *isl_set_product(__isl_take isl_set *set1,
-	__isl_take isl_set *set2);
-__isl_give isl_basic_set *isl_basic_set_flat_product(
-	__isl_take isl_basic_set *bset1, __isl_take isl_basic_set *bset2);
-__isl_give isl_set *isl_set_flat_product(__isl_take isl_set *set1,
-	__isl_take isl_set *set2);
-__isl_give isl_set *isl_set_intersect(
-		__isl_take isl_set *set1,
-		__isl_take isl_set *set2);
-__isl_give isl_set *isl_set_intersect_params(__isl_take isl_set *set,
-		__isl_take isl_set *params);
-__isl_give isl_set *isl_set_subtract(
-		__isl_take isl_set *set1,
-		__isl_take isl_set *set2);
-__isl_give isl_set *isl_set_complement(__isl_take isl_set *set);
-__isl_give isl_set *isl_set_apply(
-		__isl_take isl_set *set,
-		__isl_take isl_map *map);
-__isl_give isl_set *isl_set_fix(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos, isl_int value);
-struct isl_set *isl_set_fix_dim_si(struct isl_set *set,
-		unsigned dim, int value);
-struct isl_set *isl_set_lower_bound_dim(struct isl_set *set,
-		unsigned dim, isl_int value);
-__isl_give isl_set *isl_set_insert(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos, unsigned n);
-__isl_give isl_basic_set *isl_basic_set_add(__isl_take isl_basic_set *bset,
-		enum isl_dim_type type, unsigned n);
-__isl_give isl_set *isl_set_add_dims(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned n);
-__isl_give isl_basic_set *isl_basic_set_move_dims(__isl_take isl_basic_set *bset,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n);
-__isl_give isl_set *isl_set_move_dims(__isl_take isl_set *set,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n);
-__isl_give isl_basic_set *isl_basic_set_project_out(
-		__isl_take isl_basic_set *bset,
-		enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_set *isl_set_project_out(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_basic_set *isl_basic_set_remove_divs(
-	__isl_take isl_basic_set *bset);
-__isl_give isl_set *isl_set_eliminate(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned first, unsigned n);
-struct isl_set *isl_set_eliminate_dims(struct isl_set *set,
-		unsigned first, unsigned n);
-__isl_give isl_set *isl_set_remove_dims(__isl_take isl_set *bset,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_set *isl_set_remove_divs_involving_dims(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_set *isl_set_remove_unknown_divs(__isl_take isl_set *set);
-__isl_give isl_set *isl_set_remove_divs(__isl_take isl_set *set);
-__isl_give isl_set *isl_set_split_dims(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-int isl_basic_set_involves_dims(__isl_keep isl_basic_set *bset,
-	enum isl_dim_type type, unsigned first, unsigned n);
-int isl_set_involves_dims(__isl_keep isl_set *set,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-void isl_set_print_internal(__isl_keep isl_set *set, FILE *out, int indent);
-int isl_set_plain_is_empty(__isl_keep isl_set *set);
-int isl_set_fast_is_empty(__isl_keep isl_set *set);
-int isl_set_plain_is_universe(__isl_keep isl_set *set);
-int isl_set_fast_is_universe(__isl_keep isl_set *set);
-int isl_set_is_empty(__isl_keep isl_set *set);
-int isl_set_is_bounded(__isl_keep isl_set *set);
-int isl_set_is_subset(__isl_keep isl_set *set1, __isl_keep isl_set *set2);
-int isl_set_is_strict_subset(__isl_keep isl_set *set1, __isl_keep isl_set *set2);
-int isl_set_is_equal(__isl_keep isl_set *set1, __isl_keep isl_set *set2);
-int isl_set_is_singleton(__isl_keep isl_set *set);
-int isl_set_is_box(__isl_keep isl_set *set);
-int isl_set_has_equal_dim(__isl_keep isl_set *set1, __isl_keep isl_set *set2);
-
-__isl_give isl_set *isl_set_sum(__isl_take isl_set *set1,
-	__isl_take isl_set *set2);
-__isl_give isl_basic_set *isl_basic_set_neg(__isl_take isl_basic_set *bset);
-__isl_give isl_set *isl_set_neg(__isl_take isl_set *set);
-
-__isl_give isl_set *isl_set_make_disjoint(__isl_take isl_set *set);
-struct isl_set *isl_basic_set_compute_divs(struct isl_basic_set *bset);
-__isl_give isl_set *isl_set_compute_divs(__isl_take isl_set *set);
-__isl_give isl_set *isl_set_align_divs(__isl_take isl_set *set);
-
-struct isl_basic_set *isl_set_copy_basic_set(struct isl_set *set);
-struct isl_set *isl_set_drop_basic_set(struct isl_set *set,
-						struct isl_basic_set *bset);
-
-int isl_basic_set_plain_dim_is_fixed(__isl_keep isl_basic_set *bset,
-	unsigned dim, isl_int *val);
-
-int isl_set_plain_dim_is_fixed(__isl_keep isl_set *set,
-	unsigned dim, isl_int *val);
-int isl_set_fast_dim_is_fixed(__isl_keep isl_set *set,
-	unsigned dim, isl_int *val);
-int isl_set_plain_dim_has_fixed_lower_bound(__isl_keep isl_set *set,
-	unsigned dim, isl_int *val);
-int isl_set_dim_is_bounded(__isl_keep isl_set *set,
-	enum isl_dim_type type, unsigned pos);
-
-__isl_give isl_basic_set *isl_basic_set_gist(__isl_take isl_basic_set *bset,
-					    __isl_take isl_basic_set *context);
-__isl_give isl_set *isl_set_gist_basic_set(__isl_take isl_set *set,
-	__isl_take isl_basic_set *context);
-__isl_give isl_set *isl_set_gist(__isl_take isl_set *set,
-	__isl_take isl_set *context);
-int isl_basic_set_dim_residue_class(struct isl_basic_set *bset,
-	int pos, isl_int *modulo, isl_int *residue);
-int isl_set_dim_residue_class(struct isl_set *set,
-	int pos, isl_int *modulo, isl_int *residue);
-
-__isl_give isl_set *isl_set_coalesce(__isl_take isl_set *set);
-
-int isl_set_plain_is_equal(__isl_keep isl_set *set1, __isl_keep isl_set *set2);
-int isl_set_fast_is_equal(__isl_keep isl_set *set1, __isl_keep isl_set *set2);
-int isl_set_plain_is_disjoint(__isl_keep isl_set *set1,
-	__isl_keep isl_set *set2);
-int isl_set_fast_is_disjoint(__isl_keep isl_set *set1,
-	__isl_keep isl_set *set2);
-
-uint32_t isl_set_get_hash(struct isl_set *set);
-
-int isl_set_dim_is_unique(struct isl_set *set, unsigned dim);
-
-int isl_set_n_basic_set(__isl_keep isl_set *set);
-int isl_set_foreach_basic_set(__isl_keep isl_set *set,
-	int (*fn)(__isl_take isl_basic_set *bset, void *user), void *user);
-
-int isl_set_foreach_point(__isl_keep isl_set *set,
-	int (*fn)(__isl_take isl_point *pnt, void *user), void *user);
-int isl_set_count(__isl_keep isl_set *set, isl_int *count);
-int isl_basic_set_count_upto(__isl_keep isl_basic_set *bset,
-	isl_int max, isl_int *count);
-int isl_set_count_upto(__isl_keep isl_set *set, isl_int max, isl_int *count);
-
-__isl_give isl_basic_set *isl_basic_set_from_point(__isl_take isl_point *pnt);
-__isl_give isl_set *isl_set_from_point(__isl_take isl_point *pnt);
-__isl_give isl_basic_set *isl_basic_set_box_from_points(
-	__isl_take isl_point *pnt1, __isl_take isl_point *pnt2);
-__isl_give isl_set *isl_set_box_from_points(__isl_take isl_point *pnt1,
-	__isl_take isl_point *pnt2);
-
-__isl_give isl_basic_set *isl_basic_set_lift(__isl_take isl_basic_set *bset);
-__isl_give isl_set *isl_set_lift(__isl_take isl_set *set);
-
-__isl_give isl_map *isl_set_lex_le_set(__isl_take isl_set *set1,
-	__isl_take isl_set *set2);
-__isl_give isl_map *isl_set_lex_lt_set(__isl_take isl_set *set1,
-	__isl_take isl_set *set2);
-__isl_give isl_map *isl_set_lex_ge_set(__isl_take isl_set *set1,
-	__isl_take isl_set *set2);
-__isl_give isl_map *isl_set_lex_gt_set(__isl_take isl_set *set1,
-	__isl_take isl_set *set2);
-
-int isl_set_size(__isl_keep isl_set *set);
-
-__isl_give isl_set *isl_set_align_params(__isl_take isl_set *set,
-	__isl_take isl_dim *model);
-
-__isl_give isl_mat *isl_basic_set_equalities_matrix(
-	__isl_keep isl_basic_set *bset, enum isl_dim_type c1,
-	enum isl_dim_type c2, enum isl_dim_type c3, enum isl_dim_type c4);
-__isl_give isl_mat *isl_basic_set_inequalities_matrix(
-	__isl_keep isl_basic_set *bset, enum isl_dim_type c1,
-	enum isl_dim_type c2, enum isl_dim_type c3, enum isl_dim_type c4);
-__isl_give isl_basic_set *isl_basic_set_from_constraint_matrices(
-	__isl_take isl_dim *dim,
-	__isl_take isl_mat *eq, __isl_take isl_mat *ineq, enum isl_dim_type c1,
-	enum isl_dim_type c2, enum isl_dim_type c3, enum isl_dim_type c4);
-
-__isl_give isl_mat *isl_basic_set_reduced_basis(__isl_keep isl_basic_set *bset);
-
-__isl_give isl_basic_set *isl_basic_set_coefficients(
-	__isl_take isl_basic_set *bset);
-__isl_give isl_basic_set *isl_set_coefficients(__isl_take isl_set *set);
-__isl_give isl_basic_set *isl_basic_set_solutions(
-	__isl_take isl_basic_set *bset);
-__isl_give isl_basic_set *isl_set_solutions(__isl_take isl_set *set);
-
-__isl_give isl_pw_aff *isl_set_dim_max(__isl_take isl_set *set, int pos);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/set_type.h b/cloog-0.16.3/isl/include/isl/set_type.h
deleted file mode 100644
index ce349e1..0000000
--- a/cloog-0.16.3/isl/include/isl/set_type.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef ISL_SET_TYPE_H
-#define ISL_SET_TYPE_H
-
-#include <isl/map_type.h>
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/stream.h b/cloog-0.16.3/isl/include/isl/stream.h
deleted file mode 100644
index 779c6cf..0000000
--- a/cloog-0.16.3/isl/include/isl/stream.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_STREAM_H
-#define ISL_STREAM_H
-
-#include <stdio.h>
-#include <isl/hash.h>
-#include <isl/obj.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-enum isl_token_type { ISL_TOKEN_ERROR = -1,
-			ISL_TOKEN_UNKNOWN = 256, ISL_TOKEN_VALUE,
-			ISL_TOKEN_IDENT, ISL_TOKEN_GE,
-			ISL_TOKEN_LE, ISL_TOKEN_GT, ISL_TOKEN_LT,
-			ISL_TOKEN_LEX_GE, ISL_TOKEN_LEX_LE,
-			ISL_TOKEN_LEX_GT, ISL_TOKEN_LEX_LT,
-			ISL_TOKEN_TO, ISL_TOKEN_AND,
-			ISL_TOKEN_OR, ISL_TOKEN_EXISTS, ISL_TOKEN_NOT,
-			ISL_TOKEN_DEF, ISL_TOKEN_INFTY, ISL_TOKEN_NAN,
-			ISL_TOKEN_MIN, ISL_TOKEN_MAX, ISL_TOKEN_RAT,
-			ISL_TOKEN_TRUE, ISL_TOKEN_FALSE,
-			ISL_TOKEN_CEILD, ISL_TOKEN_FLOORD,
-			ISL_TOKEN_STRING,
-			ISL_TOKEN_LAST };
-
-struct isl_token {
-	enum isl_token_type  type;
-
-	unsigned int on_new_line : 1;
-	unsigned is_keyword : 1;
-	int line;
-	int col;
-
-	union {
-		isl_int	v;
-		char	*s;
-	} u;
-};
-
-void isl_token_free(struct isl_token *tok);
-
-struct isl_stream {
-	struct isl_ctx	*ctx;
-	FILE        	*file;
-	const char  	*str;
-	int	    	line;
-	int	    	col;
-	int	    	eof;
-
-	char	    	*buffer;
-	size_t	    	size;
-	size_t	    	len;
-	int	    	c;
-	int		un[5];
-	int		n_un;
-
-	struct isl_token	*tokens[5];
-	int	    	n_token;
-
-	struct isl_hash_table	*keywords;
-	enum isl_token_type	 next_type;
-};
-
-struct isl_stream* isl_stream_new_file(struct isl_ctx *ctx, FILE *file);
-struct isl_stream* isl_stream_new_str(struct isl_ctx *ctx, const char *str);
-void isl_stream_free(struct isl_stream *s);
-
-void isl_stream_error(struct isl_stream *s, struct isl_token *tok, char *msg);
-
-struct isl_token *isl_stream_next_token(struct isl_stream *s);
-struct isl_token *isl_stream_next_token_on_same_line(struct isl_stream *s);
-int isl_stream_next_token_is(struct isl_stream *s, int type);
-void isl_stream_push_token(struct isl_stream *s, struct isl_token *tok);
-void isl_stream_flush_tokens(struct isl_stream *s);
-int isl_stream_eat_if_available(struct isl_stream *s, int type);
-char *isl_stream_read_ident_if_available(struct isl_stream *s);
-int isl_stream_eat(struct isl_stream *s, int type);
-int isl_stream_is_empty(struct isl_stream *s);
-int isl_stream_skip_line(struct isl_stream *s);
-
-enum isl_token_type isl_stream_register_keyword(struct isl_stream *s,
-	const char *name);
-
-struct isl_obj isl_stream_read_obj(struct isl_stream *s);
-__isl_give isl_map *isl_stream_read_map(struct isl_stream *s, int nparam);
-__isl_give isl_set *isl_stream_read_set(struct isl_stream *s, int nparam);
-__isl_give isl_pw_qpolynomial *isl_stream_read_pw_qpolynomial(
-	struct isl_stream *s);
-__isl_give isl_union_map *isl_stream_read_union_map(struct isl_stream *s);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/union_map.h b/cloog-0.16.3/isl/include/isl/union_map.h
deleted file mode 100644
index 5f61d0a..0000000
--- a/cloog-0.16.3/isl/include/isl/union_map.h
+++ /dev/null
@@ -1,150 +0,0 @@
-#ifndef ISL_UNION_MAP_H
-#define ISL_UNION_MAP_H
-
-#include <isl/dim.h>
-#include <isl/map_type.h>
-#include <isl/printer.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_union_map;
-typedef struct isl_union_map isl_union_map;
-#ifndef isl_union_set
-struct isl_union_set;
-typedef struct isl_union_set isl_union_set;
-#endif
-
-__isl_give isl_union_map *isl_union_map_from_map(__isl_take isl_map *map);
-__isl_give isl_union_map *isl_union_map_empty(__isl_take isl_dim *dim);
-__isl_give isl_union_map *isl_union_map_copy(__isl_keep isl_union_map *umap);
-void *isl_union_map_free(__isl_take isl_union_map *umap);
-
-isl_ctx *isl_union_map_get_ctx(__isl_keep isl_union_map *umap);
-__isl_give isl_dim *isl_union_map_get_dim(__isl_keep isl_union_map *umap);
-
-__isl_give isl_union_map *isl_union_map_universe(
-	__isl_take isl_union_map *umap);
-__isl_give isl_union_set *isl_union_map_domain(__isl_take isl_union_map *umap);
-__isl_give isl_union_set *isl_union_map_range(__isl_take isl_union_map *umap);
-__isl_give isl_union_map *isl_union_map_domain_map(
-	__isl_take isl_union_map *umap);
-__isl_give isl_union_map *isl_union_map_range_map(
-	__isl_take isl_union_map *umap);
-__isl_give isl_union_map *isl_union_map_from_domain(
-	__isl_take isl_union_set *uset);
-__isl_give isl_union_map *isl_union_map_from_range(
-	__isl_take isl_union_set *uset);
-
-__isl_give isl_union_map *isl_union_map_affine_hull(
-	__isl_take isl_union_map *umap);
-__isl_give isl_union_map *isl_union_map_polyhedral_hull(
-	__isl_take isl_union_map *umap);
-__isl_give isl_union_map *isl_union_map_simple_hull(
-	__isl_take isl_union_map *umap);
-__isl_give isl_union_map *isl_union_map_coalesce(
-	__isl_take isl_union_map *umap);
-__isl_give isl_union_map *isl_union_map_compute_divs(
-	__isl_take isl_union_map *umap);
-__isl_give isl_union_map *isl_union_map_lexmin(__isl_take isl_union_map *umap);
-__isl_give isl_union_map *isl_union_map_lexmax(__isl_take isl_union_map *umap);
-
-__isl_give isl_union_map *isl_union_map_add_map(__isl_take isl_union_map *umap,
-	__isl_take isl_map *map);
-__isl_give isl_union_map *isl_union_map_union(__isl_take isl_union_map *umap1,
-	__isl_take isl_union_map *umap2);
-__isl_give isl_union_map *isl_union_map_subtract(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2);
-__isl_give isl_union_map *isl_union_map_intersect(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2);
-__isl_give isl_union_map *isl_union_map_product(__isl_take isl_union_map *umap1,
-	__isl_take isl_union_map *umap2);
-__isl_give isl_union_map *isl_union_map_range_product(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2);
-__isl_give isl_union_map *isl_union_map_flat_range_product(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2);
-__isl_give isl_union_map *isl_union_map_gist(__isl_take isl_union_map *umap,
-	__isl_take isl_union_map *context);
-
-__isl_give isl_union_map *isl_union_map_intersect_domain(
-	__isl_take isl_union_map *umap, __isl_take isl_union_set *uset);
-__isl_give isl_union_map *isl_union_map_intersect_range(
-	__isl_take isl_union_map *umap, __isl_take isl_union_set *uset);
-
-__isl_give isl_union_map *isl_union_map_apply_domain(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2);
-__isl_give isl_union_map *isl_union_map_apply_range(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2);
-__isl_give isl_union_map *isl_union_map_reverse(__isl_take isl_union_map *umap);
-__isl_give isl_union_map *isl_union_map_from_domain_and_range(
-	__isl_take isl_union_set *domain, __isl_take isl_union_set *range);
-
-__isl_give isl_union_map *isl_union_map_detect_equalities(
-	__isl_keep isl_union_map *umap);
-__isl_give isl_union_set *isl_union_map_deltas(__isl_take isl_union_map *umap);
-__isl_give isl_union_map *isl_union_map_deltas_map(
-	__isl_take isl_union_map *umap);
-__isl_give isl_union_map *isl_union_set_identity(__isl_take isl_union_set *uset);
-
-int isl_union_map_is_empty(__isl_keep isl_union_map *umap);
-int isl_union_map_is_single_valued(__isl_keep isl_union_map *umap);
-int isl_union_map_plain_is_injective(__isl_keep isl_union_map *umap);
-int isl_union_map_is_injective(__isl_keep isl_union_map *umap);
-int isl_union_map_is_bijective(__isl_keep isl_union_map *umap);
-
-int isl_union_map_is_subset(__isl_keep isl_union_map *umap1,
-	__isl_keep isl_union_map *umap2);
-int isl_union_map_is_equal(__isl_keep isl_union_map *umap1,
-	__isl_keep isl_union_map *umap2);
-int isl_union_map_is_strict_subset(__isl_keep isl_union_map *umap1,
-	__isl_keep isl_union_map *umap2);
-
-int isl_union_map_n_map(__isl_keep isl_union_map *umap);
-int isl_union_map_foreach_map(__isl_keep isl_union_map *umap,
-	int (*fn)(__isl_take isl_map *map, void *user), void *user);
-__isl_give int isl_union_map_contains(__isl_keep isl_union_map *umap,
-	__isl_keep isl_dim *dim);
-__isl_give isl_map *isl_union_map_extract_map(__isl_keep isl_union_map *umap,
-	__isl_take isl_dim *dim);
-__isl_give isl_map *isl_map_from_union_map(__isl_take isl_union_map *umap);
-
-__isl_give isl_basic_map *isl_union_map_sample(__isl_take isl_union_map *umap);
-
-__isl_give isl_union_map *isl_union_map_power(__isl_take isl_union_map *umap,
-	int *exact);
-__isl_give isl_union_map *isl_union_map_transitive_closure(
-	__isl_take isl_union_map *umap, int *exact);
-
-__isl_give isl_union_map *isl_union_map_lex_lt_union_map(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2);
-__isl_give isl_union_map *isl_union_map_lex_le_union_map(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2);
-__isl_give isl_union_map *isl_union_map_lex_gt_union_map(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2);
-__isl_give isl_union_map *isl_union_map_lex_ge_union_map(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2);
-
-__isl_give isl_union_map *isl_union_map_read_from_file(isl_ctx *ctx,
-	FILE *input);
-__isl_give isl_union_map *isl_union_map_read_from_str(struct isl_ctx *ctx,
-	const char *str);
-__isl_give isl_printer *isl_printer_print_union_map(__isl_take isl_printer *p,
-	__isl_keep isl_union_map *umap);
-void isl_union_map_dump(__isl_keep isl_union_map *umap);
-
-__isl_give isl_union_set *isl_union_map_wrap(__isl_take isl_union_map *umap);
-__isl_give isl_union_map *isl_union_set_unwrap(__isl_take isl_union_set *uset);
-
-__isl_give isl_union_map *isl_union_map_zip(__isl_take isl_union_map *umap);
-
-__isl_give isl_union_map *isl_union_map_align_params(
-	__isl_take isl_union_map *umap, __isl_take isl_dim *model);
-__isl_give isl_union_set *isl_union_set_align_params(
-	__isl_take isl_union_set *uset, __isl_take isl_dim *model);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/union_set.h b/cloog-0.16.3/isl/include/isl/union_set.h
deleted file mode 100644
index 3401f4e..0000000
--- a/cloog-0.16.3/isl/include/isl/union_set.h
+++ /dev/null
@@ -1,103 +0,0 @@
-#ifndef ISL_UNION_SET_H
-#define ISL_UNION_SET_H
-
-#include <isl/point.h>
-#include <isl/union_map.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-__isl_give isl_union_set *isl_union_set_from_set(__isl_take isl_set *set);
-__isl_give isl_union_set *isl_union_set_empty(__isl_take isl_dim *dim);
-__isl_give isl_union_set *isl_union_set_copy(__isl_keep isl_union_set *uset);
-void *isl_union_set_free(__isl_take isl_union_set *uset);
-
-isl_ctx *isl_union_set_get_ctx(__isl_keep isl_union_set *uset);
-__isl_give isl_dim *isl_union_set_get_dim(__isl_keep isl_union_set *uset);
-
-__isl_give isl_union_set *isl_union_set_universe(
-	__isl_take isl_union_set *uset);
-
-__isl_give isl_union_set *isl_union_set_detect_equalities(
-	__isl_take isl_union_set *uset);
-__isl_give isl_union_set *isl_union_set_affine_hull(
-	__isl_take isl_union_set *uset);
-__isl_give isl_union_set *isl_union_set_polyhedral_hull(
-	__isl_take isl_union_set *uset);
-__isl_give isl_union_set *isl_union_set_simple_hull(
-	__isl_take isl_union_set *uset);
-__isl_give isl_union_set *isl_union_set_coalesce(
-	__isl_take isl_union_set *uset);
-__isl_give isl_union_set *isl_union_set_compute_divs(
-	__isl_take isl_union_set *uset);
-__isl_give isl_union_set *isl_union_set_lexmin(__isl_take isl_union_set *uset);
-__isl_give isl_union_set *isl_union_set_lexmax(__isl_take isl_union_set *uset);
-
-__isl_give isl_union_set *isl_union_set_add_set(__isl_take isl_union_set *uset,
-	__isl_take isl_set *set);
-__isl_give isl_union_set *isl_union_set_union(__isl_take isl_union_set *uset1,
-	__isl_take isl_union_set *uset2);
-__isl_give isl_union_set *isl_union_set_subtract(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2);
-__isl_give isl_union_set *isl_union_set_intersect(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2);
-__isl_give isl_union_set *isl_union_set_product(__isl_take isl_union_set *uset1,
-	__isl_take isl_union_set *uset2);
-__isl_give isl_union_set *isl_union_set_gist(__isl_take isl_union_set *uset,
-	__isl_take isl_union_set *context);
-
-__isl_give isl_union_set *isl_union_set_apply(
-	__isl_take isl_union_set *uset, __isl_take isl_union_map *umap);
-
-int isl_union_set_is_empty(__isl_keep isl_union_set *uset);
-
-int isl_union_set_is_subset(__isl_keep isl_union_set *uset1,
-	__isl_keep isl_union_set *uset2);
-int isl_union_set_is_equal(__isl_keep isl_union_set *uset1,
-	__isl_keep isl_union_set *uset2);
-int isl_union_set_is_strict_subset(__isl_keep isl_union_set *uset1,
-	__isl_keep isl_union_set *uset2);
-
-int isl_union_set_n_set(__isl_keep isl_union_set *uset);
-int isl_union_set_foreach_set(__isl_keep isl_union_set *uset,
-	int (*fn)(__isl_take isl_set *set, void *user), void *user);
-__isl_give int isl_union_set_contains(__isl_keep isl_union_set *uset,
-	__isl_keep isl_dim *dim);
-__isl_give isl_set *isl_union_set_extract_set(__isl_keep isl_union_set *uset,
-	__isl_take isl_dim *dim);
-__isl_give isl_set *isl_set_from_union_set(__isl_take isl_union_set *uset);
-int isl_union_set_foreach_point(__isl_keep isl_union_set *uset,
-	int (*fn)(__isl_take isl_point *pnt, void *user), void *user);
-
-__isl_give isl_basic_set *isl_union_set_sample(__isl_take isl_union_set *uset);
-
-__isl_give isl_union_set *isl_union_set_lift(__isl_take isl_union_set *uset);
-
-__isl_give isl_union_map *isl_union_set_lex_lt_union_set(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2);
-__isl_give isl_union_map *isl_union_set_lex_le_union_set(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2);
-__isl_give isl_union_map *isl_union_set_lex_gt_union_set(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2);
-__isl_give isl_union_map *isl_union_set_lex_ge_union_set(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2);
-
-__isl_give isl_union_set *isl_union_set_coefficients(
-	__isl_take isl_union_set *bset);
-__isl_give isl_union_set *isl_union_set_solutions(
-	__isl_take isl_union_set *bset);
-
-__isl_give isl_union_set *isl_union_set_read_from_file(isl_ctx *ctx,
-	FILE *input);
-__isl_give isl_union_set *isl_union_set_read_from_str(struct isl_ctx *ctx,
-	const char *str);
-__isl_give isl_printer *isl_printer_print_union_set(__isl_take isl_printer *p,
-	__isl_keep isl_union_set *uset);
-void isl_union_set_dump(__isl_keep isl_union_set *uset);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/vec.h b/cloog-0.16.3/isl/include/isl/vec.h
deleted file mode 100644
index e592838..0000000
--- a/cloog-0.16.3/isl/include/isl/vec.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_VEC_H
-#define ISL_VEC_H
-
-#include <stdio.h>
-
-#include <isl/int.h>
-#include <isl/ctx.h>
-#include <isl/blk.h>
-#include <isl/printer.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_vec {
-	int ref;
-
-	struct isl_ctx *ctx;
-
-	unsigned size;
-	isl_int *el;
-
-	struct isl_blk block;
-};
-typedef struct isl_vec isl_vec;
-
-struct isl_vec *isl_vec_alloc(struct isl_ctx *ctx, unsigned size);
-struct isl_vec *isl_vec_copy(struct isl_vec *vec);
-struct isl_vec *isl_vec_cow(struct isl_vec *vec);
-void isl_vec_free(struct isl_vec *vec);
-
-isl_ctx *isl_vec_get_ctx(__isl_keep isl_vec *vec);
-
-int isl_vec_is_equal(__isl_keep isl_vec *vec1, __isl_keep isl_vec *vec2);
-
-void isl_vec_dump(__isl_keep isl_vec *vec);
-__isl_give isl_printer *isl_printer_print_vec(__isl_take isl_printer *printer,
-	__isl_keep isl_vec *vec);
-
-void isl_vec_lcm(struct isl_vec *vec, isl_int *lcm);
-struct isl_vec *isl_vec_ceil(struct isl_vec *vec);
-struct isl_vec *isl_vec_normalize(struct isl_vec *vec);
-__isl_give isl_vec *isl_vec_clr(__isl_take isl_vec *vec);
-__isl_give isl_vec *isl_vec_scale(__isl_take isl_vec *vec, isl_int m);
-__isl_give isl_vec *isl_vec_add(__isl_take isl_vec *vec1,
-	__isl_take isl_vec *vec2);
-__isl_give isl_vec *isl_vec_extend(__isl_take isl_vec *vec, unsigned size);
-__isl_give isl_vec *isl_vec_zero_extend(__isl_take isl_vec *vec, unsigned size);
-
-__isl_give isl_vec *isl_vec_sort(__isl_take isl_vec *vec);
-
-__isl_give isl_vec *isl_vec_read_from_file(isl_ctx *ctx, FILE *input);
-
-__isl_give isl_vec *isl_vec_drop_els(__isl_take isl_vec *vec,
-	unsigned pos, unsigned n);
-__isl_give isl_vec *isl_vec_insert_els(__isl_take isl_vec *vec,
-	unsigned pos, unsigned n);
-__isl_give isl_vec *isl_vec_insert_zero_els(__isl_take isl_vec *vec,
-	unsigned pos, unsigned n);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/version.h b/cloog-0.16.3/isl/include/isl/version.h
deleted file mode 100644
index 7f8f23d..0000000
--- a/cloog-0.16.3/isl/include/isl/version.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef ISL_VERSION_H
-#define ISL_VERSION_H
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-const char *isl_version(void);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/include/isl/vertices.h b/cloog-0.16.3/isl/include/isl/vertices.h
deleted file mode 100644
index 3e8460d..0000000
--- a/cloog-0.16.3/isl/include/isl/vertices.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef ISL_VERTICES_H
-#define ISL_VERTICES_H
-
-#include <isl/set_type.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_external_vertex;
-typedef struct isl_external_vertex	isl_vertex;
-
-struct isl_cell;
-typedef struct isl_cell		isl_cell;
-
-struct isl_vertices;
-typedef struct isl_vertices	isl_vertices;
-
-isl_ctx *isl_vertex_get_ctx(__isl_keep isl_vertex *vertex);
-int isl_vertex_get_id(__isl_keep isl_vertex *vertex);
-__isl_give isl_basic_set *isl_vertex_get_domain(__isl_keep isl_vertex *vertex);
-__isl_give isl_basic_set *isl_vertex_get_expr(__isl_keep isl_vertex *vertex);
-void isl_vertex_free(__isl_take isl_vertex *vertex);
-
-__isl_give isl_vertices *isl_basic_set_compute_vertices(
-	__isl_keep isl_basic_set *bset);
-isl_ctx *isl_vertices_get_ctx(__isl_keep isl_vertices *vertices);
-int isl_vertices_get_n_vertices(__isl_keep isl_vertices *vertices);
-int isl_vertices_foreach_vertex(__isl_keep isl_vertices *vertices,
-	int (*fn)(__isl_take isl_vertex *vertex, void *user), void *user);
-void isl_vertices_free(__isl_take isl_vertices *vertices);
-
-isl_ctx *isl_cell_get_ctx(__isl_keep isl_cell *cell);
-__isl_give isl_basic_set *isl_cell_get_domain(__isl_keep isl_cell *cell);
-int isl_cell_foreach_vertex(__isl_keep isl_cell *cell,
-	int (*fn)(__isl_take isl_vertex *vertex, void *user), void *user);
-void isl_cell_free(__isl_take isl_cell *cell);
-
-int isl_vertices_foreach_cell(__isl_keep isl_vertices *vertices,
-	int (*fn)(__isl_take isl_cell *cell, void *user), void *user);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/install-sh b/cloog-0.16.3/isl/install-sh
deleted file mode 100755
index 3f83ce9..0000000
--- a/cloog-0.16.3/isl/install-sh
+++ /dev/null
@@ -1,524 +0,0 @@
-#!/bin/sh
-# install - install a program, script, or datafile
-
-scriptversion=2010-02-06.18; # UTC
-
-# This originates from X11R5 (mit/util/scripts/install.sh), which was
-# later released in X11R6 (xc/config/util/install.sh) with the
-# following copyright and license.
-#
-# Copyright (C) 1994 X Consortium
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
-# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-# Except as contained in this notice, the name of the X Consortium shall not
-# be used in advertising or otherwise to promote the sale, use or other deal-
-# ings in this Software without prior written authorization from the X Consor-
-# tium.
-#
-#
-# FSF changes to this file are in the public domain.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.
-
-nl='
-'
-IFS=" ""	$nl"
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit=${DOITPROG-}
-if test -z "$doit"; then
-  doit_exec=exec
-else
-  doit_exec=$doit
-fi
-
-# Put in absolute file names if you don't have them in your path;
-# or use environment vars.
-
-chgrpprog=${CHGRPPROG-chgrp}
-chmodprog=${CHMODPROG-chmod}
-chownprog=${CHOWNPROG-chown}
-cmpprog=${CMPPROG-cmp}
-cpprog=${CPPROG-cp}
-mkdirprog=${MKDIRPROG-mkdir}
-mvprog=${MVPROG-mv}
-rmprog=${RMPROG-rm}
-stripprog=${STRIPPROG-strip}
-
-posix_glob='?'
-initialize_posix_glob='
-  test "$posix_glob" != "?" || {
-    if (set -f) 2>/dev/null; then
-      posix_glob=
-    else
-      posix_glob=:
-    fi
-  }
-'
-
-posix_mkdir=
-
-# Desired mode of installed file.
-mode=0755
-
-chgrpcmd=
-chmodcmd=$chmodprog
-chowncmd=
-mvcmd=$mvprog
-rmcmd="$rmprog -f"
-stripcmd=
-
-src=
-dst=
-dir_arg=
-dst_arg=
-
-copy_on_change=false
-no_target_directory=
-
-usage="\
-Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
-   or: $0 [OPTION]... SRCFILES... DIRECTORY
-   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
-   or: $0 [OPTION]... -d DIRECTORIES...
-
-In the 1st form, copy SRCFILE to DSTFILE.
-In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
-In the 4th, create DIRECTORIES.
-
-Options:
-     --help     display this help and exit.
-     --version  display version info and exit.
-
-  -c            (ignored)
-  -C            install only if different (preserve the last data modification time)
-  -d            create directories instead of installing files.
-  -g GROUP      $chgrpprog installed files to GROUP.
-  -m MODE       $chmodprog installed files to MODE.
-  -o USER       $chownprog installed files to USER.
-  -s            $stripprog installed files.
-  -t DIRECTORY  install into DIRECTORY.
-  -T            report an error if DSTFILE is a directory.
-
-Environment variables override the default commands:
-  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
-  RMPROG STRIPPROG
-"
-
-while test $# -ne 0; do
-  case $1 in
-    -c) ;;
-
-    -C) copy_on_change=true;;
-
-    -d) dir_arg=true;;
-
-    -g) chgrpcmd="$chgrpprog $2"
-	shift;;
-
-    --help) echo "$usage"; exit $?;;
-
-    -m) mode=$2
-	case $mode in
-	  *' '* | *'	'* | *'
-'*	  | *'*'* | *'?'* | *'['*)
-	    echo "$0: invalid mode: $mode" >&2
-	    exit 1;;
-	esac
-	shift;;
-
-    -o) chowncmd="$chownprog $2"
-	shift;;
-
-    -s) stripcmd=$stripprog;;
-
-    -t) dst_arg=$2
-	shift;;
-
-    -T) no_target_directory=true;;
-
-    --version) echo "$0 $scriptversion"; exit $?;;
-
-    --)	shift
-	break;;
-
-    -*)	echo "$0: invalid option: $1" >&2
-	exit 1;;
-
-    *)  break;;
-  esac
-  shift
-done
-
-if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
-  # When -d is used, all remaining arguments are directories to create.
-  # When -t is used, the destination is already specified.
-  # Otherwise, the last argument is the destination.  Remove it from $@.
-  for arg
-  do
-    if test -n "$dst_arg"; then
-      # $@ is not empty: it contains at least $arg.
-      set fnord "$@" "$dst_arg"
-      shift # fnord
-    fi
-    shift # arg
-    dst_arg=$arg
-  done
-fi
-
-if test $# -eq 0; then
-  if test -z "$dir_arg"; then
-    echo "$0: no input file specified." >&2
-    exit 1
-  fi
-  # It's OK to call `install-sh -d' without argument.
-  # This can happen when creating conditional directories.
-  exit 0
-fi
-
-if test -z "$dir_arg"; then
-  do_exit='(exit $ret); exit $ret'
-  trap "ret=129; $do_exit" 1
-  trap "ret=130; $do_exit" 2
-  trap "ret=141; $do_exit" 13
-  trap "ret=143; $do_exit" 15
-
-  # Set umask so as not to create temps with too-generous modes.
-  # However, 'strip' requires both read and write access to temps.
-  case $mode in
-    # Optimize common cases.
-    *644) cp_umask=133;;
-    *755) cp_umask=22;;
-
-    *[0-7])
-      if test -z "$stripcmd"; then
-	u_plus_rw=
-      else
-	u_plus_rw='% 200'
-      fi
-      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
-    *)
-      if test -z "$stripcmd"; then
-	u_plus_rw=
-      else
-	u_plus_rw=,u+rw
-      fi
-      cp_umask=$mode$u_plus_rw;;
-  esac
-fi
-
-for src
-do
-  # Protect names starting with `-'.
-  case $src in
-    -*) src=./$src;;
-  esac
-
-  if test -n "$dir_arg"; then
-    dst=$src
-    dstdir=$dst
-    test -d "$dstdir"
-    dstdir_status=$?
-  else
-
-    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
-    # might cause directories to be created, which would be especially bad
-    # if $src (and thus $dsttmp) contains '*'.
-    if test ! -f "$src" && test ! -d "$src"; then
-      echo "$0: $src does not exist." >&2
-      exit 1
-    fi
-
-    if test -z "$dst_arg"; then
-      echo "$0: no destination specified." >&2
-      exit 1
-    fi
-
-    dst=$dst_arg
-    # Protect names starting with `-'.
-    case $dst in
-      -*) dst=./$dst;;
-    esac
-
-    # If destination is a directory, append the input filename; won't work
-    # if double slashes aren't ignored.
-    if test -d "$dst"; then
-      if test -n "$no_target_directory"; then
-	echo "$0: $dst_arg: Is a directory" >&2
-	exit 1
-      fi
-      dstdir=$dst
-      dst=$dstdir/`basename "$src"`
-      dstdir_status=0
-    else
-      # Prefer dirname, but fall back on a substitute if dirname fails.
-      dstdir=`
-	(dirname "$dst") 2>/dev/null ||
-	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	     X"$dst" : 'X\(//\)[^/]' \| \
-	     X"$dst" : 'X\(//\)$' \| \
-	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
-	echo X"$dst" |
-	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)[^/].*/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\).*/{
-		   s//\1/
-		   q
-		 }
-		 s/.*/./; q'
-      `
-
-      test -d "$dstdir"
-      dstdir_status=$?
-    fi
-  fi
-
-  obsolete_mkdir_used=false
-
-  if test $dstdir_status != 0; then
-    case $posix_mkdir in
-      '')
-	# Create intermediate dirs using mode 755 as modified by the umask.
-	# This is like FreeBSD 'install' as of 1997-10-28.
-	umask=`umask`
-	case $stripcmd.$umask in
-	  # Optimize common cases.
-	  *[2367][2367]) mkdir_umask=$umask;;
-	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
-	  *[0-7])
-	    mkdir_umask=`expr $umask + 22 \
-	      - $umask % 100 % 40 + $umask % 20 \
-	      - $umask % 10 % 4 + $umask % 2
-	    `;;
-	  *) mkdir_umask=$umask,go-w;;
-	esac
-
-	# With -d, create the new directory with the user-specified mode.
-	# Otherwise, rely on $mkdir_umask.
-	if test -n "$dir_arg"; then
-	  mkdir_mode=-m$mode
-	else
-	  mkdir_mode=
-	fi
-
-	posix_mkdir=false
-	case $umask in
-	  *[123567][0-7][0-7])
-	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
-	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-	    ;;
-	  *)
-	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-	    if (umask $mkdir_umask &&
-		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
-	    then
-	      if test -z "$dir_arg" || {
-		   # Check for POSIX incompatibilities with -m.
-		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-		   # other-writeable bit of parent directory when it shouldn't.
-		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
-		   case $ls_ld_tmpdir in
-		     d????-?r-*) different_mode=700;;
-		     d????-?--*) different_mode=755;;
-		     *) false;;
-		   esac &&
-		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
-		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
-		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-		   }
-		 }
-	      then posix_mkdir=:
-	      fi
-	      rmdir "$tmpdir/d" "$tmpdir"
-	    else
-	      # Remove any dirs left behind by ancient mkdir implementations.
-	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
-	    fi
-	    trap '' 0;;
-	esac;;
-    esac
-
-    if
-      $posix_mkdir && (
-	umask $mkdir_umask &&
-	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
-      )
-    then :
-    else
-
-      # The umask is ridiculous, or mkdir does not conform to POSIX,
-      # or it failed possibly due to a race condition.  Create the
-      # directory the slow way, step by step, checking for races as we go.
-
-      case $dstdir in
-	/*) prefix='/';;
-	-*) prefix='./';;
-	*)  prefix='';;
-      esac
-
-      eval "$initialize_posix_glob"
-
-      oIFS=$IFS
-      IFS=/
-      $posix_glob set -f
-      set fnord $dstdir
-      shift
-      $posix_glob set +f
-      IFS=$oIFS
-
-      prefixes=
-
-      for d
-      do
-	test -z "$d" && continue
-
-	prefix=$prefix$d
-	if test -d "$prefix"; then
-	  prefixes=
-	else
-	  if $posix_mkdir; then
-	    (umask=$mkdir_umask &&
-	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-	    # Don't fail if two instances are running concurrently.
-	    test -d "$prefix" || exit 1
-	  else
-	    case $prefix in
-	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-	      *) qprefix=$prefix;;
-	    esac
-	    prefixes="$prefixes '$qprefix'"
-	  fi
-	fi
-	prefix=$prefix/
-      done
-
-      if test -n "$prefixes"; then
-	# Don't fail if two instances are running concurrently.
-	(umask $mkdir_umask &&
-	 eval "\$doit_exec \$mkdirprog $prefixes") ||
-	  test -d "$dstdir" || exit 1
-	obsolete_mkdir_used=true
-      fi
-    fi
-  fi
-
-  if test -n "$dir_arg"; then
-    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
-    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
-      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
-  else
-
-    # Make a couple of temp file names in the proper directory.
-    dsttmp=$dstdir/_inst.$$_
-    rmtmp=$dstdir/_rm.$$_
-
-    # Trap to clean up those temp files at exit.
-    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
-
-    # Copy the file name to the temp name.
-    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
-
-    # and set any options; do chmod last to preserve setuid bits.
-    #
-    # If any of these fail, we abort the whole thing.  If we want to
-    # ignore errors from any of these, just make sure not to ignore
-    # errors from the above "$doit $cpprog $src $dsttmp" command.
-    #
-    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
-    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
-    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
-
-    # If -C, don't bother to copy if it wouldn't change the file.
-    if $copy_on_change &&
-       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
-       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
-
-       eval "$initialize_posix_glob" &&
-       $posix_glob set -f &&
-       set X $old && old=:$2:$4:$5:$6 &&
-       set X $new && new=:$2:$4:$5:$6 &&
-       $posix_glob set +f &&
-
-       test "$old" = "$new" &&
-       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
-    then
-      rm -f "$dsttmp"
-    else
-      # Rename the file to the real destination.
-      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
-
-      # The rename failed, perhaps because mv can't rename something else
-      # to itself, or perhaps because mv is so ancient that it does not
-      # support -f.
-      {
-	# Now remove or move aside any old file at destination location.
-	# We try this two ways since rm can't unlink itself on some
-	# systems and the destination file might be busy for other
-	# reasons.  In this case, the final cleanup might fail but the new
-	# file should still install successfully.
-	{
-	  test ! -f "$dst" ||
-	  $doit $rmcmd -f "$dst" 2>/dev/null ||
-	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
-	  } ||
-	  { echo "$0: cannot unlink or rename $dst" >&2
-	    (exit 1); exit 1
-	  }
-	} &&
-
-	# Now rename the file to the real destination.
-	$doit $mvcmd "$dsttmp" "$dst"
-      }
-    fi || exit 1
-
-    trap '' 0
-  fi
-done
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/cloog-0.16.3/isl/isl.py b/cloog-0.16.3/isl/isl.py
deleted file mode 100644
index 6382f63..0000000
--- a/cloog-0.16.3/isl/isl.py
+++ /dev/null
@@ -1,100 +0,0 @@
-import gdb
-import re
-
-# GDB Pretty Printers for most isl objects
-class IslObjectPrinter:
-	"""Print an isl object"""
-	def __init__ (self, val, type):
-                self.val = val
-                self.type = type
-
-	def to_string (self):
-                # Cast val to a void pointer to stop gdb using this pretty
-                # printer for the pointer which would lead to an infinite loop.
-                void_ptr = gdb.lookup_type('void').pointer()
-                value = str(self.val.cast(void_ptr))
-                printer = gdb.parse_and_eval("isl_printer_to_str(isl_"
-                                             + str(self.type)
-					     + "_get_ctx(" + value + "))")
-                printer = gdb.parse_and_eval("isl_printer_print_"
-                                             + str(self.type) + "("
-                                             + str(printer) + ", "
-                                             + value + ")")
-                string = gdb.parse_and_eval("(char*)isl_printer_get_str("
-                                            + str(printer) + ")")
-                gdb.parse_and_eval("isl_printer_free(" + str(printer) + ")")
-                return string
-
-	def display_hint (self):
-                return 'string'
-
-class IslIntPrinter:
-	"""Print an isl_int """
-	def __init__ (self, val):
-                self.val = val
-
-	def to_string (self):
-                # Cast val to a void pointer to stop gdb using this pretty
-                # printer for the pointer which would lead to an infinite loop.
-                void_ptr = gdb.lookup_type('void').pointer()
-                value = str(self.val.cast(void_ptr))
-
-                context = gdb.parse_and_eval("isl_ctx_alloc()")
-                printer = gdb.parse_and_eval("isl_printer_to_str("
-                                             + str(context) + ")")
-                printer = gdb.parse_and_eval("isl_printer_print_isl_int("
-                                             + str(printer) + ", "
-                                             + value + ")")
-                string = gdb.parse_and_eval("(char*)isl_printer_get_str("
-                                            + str(printer) + ")")
-                gdb.parse_and_eval("isl_printer_free(" + str(printer) + ")")
-                gdb.parse_and_eval("isl_ctx_free(" + str(context) + ")")
-                return string
-
-	def display_hint (self):
-                return 'string'
-
-class IslPrintCommand (gdb.Command):
-        """Print an isl value."""
-        def __init__ (self):
-                super (IslPrintCommand, self).__init__ ("islprint",
-                                                        gdb.COMMAND_OBSCURE)
-        def invoke (self, arg, from_tty):
-                arg = gdb.parse_and_eval(arg);
-                printer = str_lookup_function(arg)
-
-                if printer == None:
-                        print "No isl printer for this type"
-                        return
-
-                print printer.to_string()
-
-IslPrintCommand()
-
-def str_lookup_function (val):
-	if val.type.code != gdb.TYPE_CODE_PTR:
-		if str(val.type) == "isl_int":
-			return IslIntPrinter(val)
-                else:
-                        return None
-
-	lookup_tag = val.type.target()
-	regex = re.compile ("^isl_(.*)$")
-
-	if lookup_tag == None:
-		return None
-
-	m = regex.match (str(lookup_tag))
-
-	if m:
-                # Those types of printers defined in isl.
-                if m.group(1) in ["basic_set", "set", "union_set", "basic_map",
-                                  "map", "union_map", "qpolynomial",
-                                  "pw_qpolynomial", "pw_qpolynomial_fold",
-                                  "union_pw_qpolynomial",
-                                  "union_pw_qpolynomial_fold"]:
-                        return IslObjectPrinter(val, m.group(1))
-        return None
-
-# Do not register the pretty printer.
-# gdb.current_objfile().pretty_printers.append(str_lookup_function)
diff --git a/cloog-0.16.3/isl/isl_aff.c b/cloog-0.16.3/isl/isl_aff.c
deleted file mode 100644
index f4f1976..0000000
--- a/cloog-0.16.3/isl/isl_aff.c
+++ /dev/null
@@ -1,1347 +0,0 @@
-/*
- * Copyright 2011      INRIA Saclay
- * Copyright 2011      Universiteit Leiden
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France
- * and Leiden Institute of Advanced Computer Science,
- * Universiteit Leiden, Niels Bohrweg 1, 2333 CA Leiden, The Netherlands
- */
-
-#include <isl_map_private.h>
-#include <isl_aff_private.h>
-#include <isl_dim_private.h>
-#include <isl_local_space_private.h>
-#include <isl_mat_private.h>
-#include <isl/constraint.h>
-#include <isl/seq.h>
-#include <isl/set.h>
-
-__isl_give isl_aff *isl_aff_alloc_vec(__isl_take isl_local_space *ls,
-	__isl_take isl_vec *v)
-{
-	isl_aff *aff;
-
-	if (!ls || !v)
-		goto error;
-
-	aff = isl_calloc_type(v->ctx, struct isl_aff);
-	if (!aff)
-		goto error;
-
-	aff->ref = 1;
-	aff->ls = ls;
-	aff->v = v;
-
-	return aff;
-error:
-	isl_local_space_free(ls);
-	isl_vec_free(v);
-	return NULL;
-}
-
-__isl_give isl_aff *isl_aff_alloc(__isl_take isl_local_space *ls)
-{
-	isl_ctx *ctx;
-	isl_vec *v;
-	unsigned total;
-
-	if (!ls)
-		return NULL;
-
-	ctx = isl_local_space_get_ctx(ls);
-	if (!isl_local_space_divs_known(ls))
-		isl_die(ctx, isl_error_invalid, "local space has unknown divs",
-			goto error);
-
-	total = isl_local_space_dim(ls, isl_dim_all);
-	v = isl_vec_alloc(ctx, 1 + 1 + total);
-	return isl_aff_alloc_vec(ls, v);
-error:
-	isl_local_space_free(ls);
-	return NULL;
-}
-
-__isl_give isl_aff *isl_aff_zero(__isl_take isl_local_space *ls)
-{
-	isl_aff *aff;
-
-	aff = isl_aff_alloc(ls);
-	if (!aff)
-		return NULL;
-
-	isl_int_set_si(aff->v->el[0], 1);
-	isl_seq_clr(aff->v->el + 1, aff->v->size - 1);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_copy(__isl_keep isl_aff *aff)
-{
-	if (!aff)
-		return NULL;
-
-	aff->ref++;
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_dup(__isl_keep isl_aff *aff)
-{
-	if (!aff)
-		return NULL;
-
-	return isl_aff_alloc_vec(isl_local_space_copy(aff->ls),
-				 isl_vec_copy(aff->v));
-}
-
-__isl_give isl_aff *isl_aff_cow(__isl_take isl_aff *aff)
-{
-	if (!aff)
-		return NULL;
-
-	if (aff->ref == 1)
-		return aff;
-	aff->ref--;
-	return isl_aff_dup(aff);
-}
-
-void *isl_aff_free(__isl_take isl_aff *aff)
-{
-	if (!aff)
-		return NULL;
-
-	if (--aff->ref > 0)
-		return NULL;
-
-	isl_local_space_free(aff->ls);
-	isl_vec_free(aff->v);
-
-	free(aff);
-
-	return NULL;
-}
-
-isl_ctx *isl_aff_get_ctx(__isl_keep isl_aff *aff)
-{
-	return aff ? isl_local_space_get_ctx(aff->ls) : NULL;
-}
-
-int isl_aff_dim(__isl_keep isl_aff *aff, enum isl_dim_type type)
-{
-	return aff ? isl_local_space_dim(aff->ls, type) : 0;
-}
-
-__isl_give isl_dim *isl_aff_get_dim(__isl_keep isl_aff *aff)
-{
-	return aff ? isl_local_space_get_dim(aff->ls) : NULL;
-}
-
-__isl_give isl_local_space *isl_aff_get_local_space(__isl_keep isl_aff *aff)
-{
-	return aff ? isl_local_space_copy(aff->ls) : NULL;
-}
-
-const char *isl_aff_get_dim_name(__isl_keep isl_aff *aff,
-	enum isl_dim_type type, unsigned pos)
-{
-	return aff ? isl_local_space_get_dim_name(aff->ls, type, pos) : 0;
-}
-
-__isl_give isl_aff *isl_aff_reset_dim(__isl_take isl_aff *aff,
-	__isl_take isl_dim *dim)
-{
-	aff = isl_aff_cow(aff);
-	if (!aff || !dim)
-		goto error;
-
-	aff->ls = isl_local_space_reset_dim(aff->ls, dim);
-	if (!aff->ls)
-		return isl_aff_free(aff);
-
-	return aff;
-error:
-	isl_aff_free(aff);
-	isl_dim_free(dim);
-	return NULL;
-}
-
-/* Reorder the coefficients of the affine expression based
- * on the given reodering.
- * The reordering r is assumed to have been extended with the local
- * variables.
- */
-static __isl_give isl_vec *vec_reorder(__isl_take isl_vec *vec,
-	__isl_take isl_reordering *r, int n_div)
-{
-	isl_vec *res;
-	int i;
-
-	if (!vec || !r)
-		goto error;
-
-	res = isl_vec_alloc(vec->ctx, 2 + isl_dim_total(r->dim) + n_div);
-	isl_seq_cpy(res->el, vec->el, 2);
-	isl_seq_clr(res->el + 2, res->size - 2);
-	for (i = 0; i < r->len; ++i)
-		isl_int_set(res->el[2 + r->pos[i]], vec->el[2 + i]);
-
-	isl_reordering_free(r);
-	isl_vec_free(vec);
-	return res;
-error:
-	isl_vec_free(vec);
-	isl_reordering_free(r);
-	return NULL;
-}
-
-/* Reorder the dimensions of "aff" according to the given reordering.
- */
-__isl_give isl_aff *isl_aff_realign(__isl_take isl_aff *aff,
-	__isl_take isl_reordering *r)
-{
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		goto error;
-
-	r = isl_reordering_extend(r, aff->ls->div->n_row);
-	aff->v = vec_reorder(aff->v, isl_reordering_copy(r),
-				aff->ls->div->n_row);
-	aff->ls = isl_local_space_realign(aff->ls, r);
-
-	if (!aff->v || !aff->ls)
-		return isl_aff_free(aff);
-
-	return aff;
-error:
-	isl_aff_free(aff);
-	isl_reordering_free(r);
-	return NULL;
-}
-
-int isl_aff_plain_is_zero(__isl_keep isl_aff *aff)
-{
-	if (!aff)
-		return -1;
-
-	return isl_seq_first_non_zero(aff->v->el + 1, aff->v->size - 1) < 0;
-}
-
-int isl_aff_plain_is_equal(__isl_keep isl_aff *aff1, __isl_keep isl_aff *aff2)
-{
-	int equal;
-
-	if (!aff1 || !aff2)
-		return -1;
-
-	equal = isl_local_space_is_equal(aff1->ls, aff2->ls);
-	if (equal < 0 || !equal)
-		return equal;
-
-	return isl_vec_is_equal(aff1->v, aff2->v);
-}
-
-int isl_aff_get_denominator(__isl_keep isl_aff *aff, isl_int *v)
-{
-	if (!aff)
-		return -1;
-	isl_int_set(*v, aff->v->el[0]);
-	return 0;
-}
-
-int isl_aff_get_constant(__isl_keep isl_aff *aff, isl_int *v)
-{
-	if (!aff)
-		return -1;
-	isl_int_set(*v, aff->v->el[1]);
-	return 0;
-}
-
-int isl_aff_get_coefficient(__isl_keep isl_aff *aff,
-	enum isl_dim_type type, int pos, isl_int *v)
-{
-	if (!aff)
-		return -1;
-
-	if (pos >= isl_local_space_dim(aff->ls, type))
-		isl_die(aff->v->ctx, isl_error_invalid,
-			"position out of bounds", return -1);
-
-	pos += isl_local_space_offset(aff->ls, type);
-	isl_int_set(*v, aff->v->el[1 + pos]);
-
-	return 0;
-}
-
-__isl_give isl_aff *isl_aff_set_denominator(__isl_take isl_aff *aff, isl_int v)
-{
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-
-	aff->v = isl_vec_cow(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	isl_int_set(aff->v->el[0], v);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_set_constant(__isl_take isl_aff *aff, isl_int v)
-{
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-
-	aff->v = isl_vec_cow(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	isl_int_set(aff->v->el[1], v);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_add_constant(__isl_take isl_aff *aff, isl_int v)
-{
-	if (isl_int_is_zero(v))
-		return aff;
-
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-
-	aff->v = isl_vec_cow(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	isl_int_addmul(aff->v->el[1], aff->v->el[0], v);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_add_constant_si(__isl_take isl_aff *aff, int v)
-{
-	isl_int t;
-
-	isl_int_init(t);
-	isl_int_set_si(t, v);
-	aff = isl_aff_add_constant(aff, t);
-	isl_int_clear(t);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_set_constant_si(__isl_take isl_aff *aff, int v)
-{
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-
-	aff->v = isl_vec_cow(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	isl_int_set_si(aff->v->el[1], v);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_set_coefficient(__isl_take isl_aff *aff,
-	enum isl_dim_type type, int pos, isl_int v)
-{
-	if (!aff)
-		return NULL;
-
-	if (pos >= isl_local_space_dim(aff->ls, type))
-		isl_die(aff->v->ctx, isl_error_invalid,
-			"position out of bounds", return isl_aff_free(aff));
-
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-
-	aff->v = isl_vec_cow(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	pos += isl_local_space_offset(aff->ls, type);
-	isl_int_set(aff->v->el[1 + pos], v);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_set_coefficient_si(__isl_take isl_aff *aff,
-	enum isl_dim_type type, int pos, int v)
-{
-	if (!aff)
-		return NULL;
-
-	if (pos >= isl_local_space_dim(aff->ls, type))
-		isl_die(aff->v->ctx, isl_error_invalid,
-			"position out of bounds", return isl_aff_free(aff));
-
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-
-	aff->v = isl_vec_cow(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	pos += isl_local_space_offset(aff->ls, type);
-	isl_int_set_si(aff->v->el[1 + pos], v);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_add_coefficient(__isl_take isl_aff *aff,
-	enum isl_dim_type type, int pos, isl_int v)
-{
-	if (!aff)
-		return NULL;
-
-	if (pos >= isl_local_space_dim(aff->ls, type))
-		isl_die(aff->v->ctx, isl_error_invalid,
-			"position out of bounds", return isl_aff_free(aff));
-
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-
-	aff->v = isl_vec_cow(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	pos += isl_local_space_offset(aff->ls, type);
-	isl_int_addmul(aff->v->el[1 + pos], aff->v->el[0], v);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_add_coefficient_si(__isl_take isl_aff *aff,
-	enum isl_dim_type type, int pos, int v)
-{
-	isl_int t;
-
-	isl_int_init(t);
-	isl_int_set_si(t, v);
-	aff = isl_aff_add_coefficient(aff, type, pos, t);
-	isl_int_clear(t);
-
-	return aff;
-}
-
-__isl_give isl_div *isl_aff_get_div(__isl_keep isl_aff *aff, int pos)
-{
-	if (!aff)
-		return NULL;
-
-	return isl_local_space_get_div(aff->ls, pos);
-}
-
-__isl_give isl_aff *isl_aff_neg(__isl_take isl_aff *aff)
-{
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-	aff->v = isl_vec_cow(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	isl_seq_neg(aff->v->el + 1, aff->v->el + 1, aff->v->size - 1);
-
-	return aff;
-}
-
-/* Given f, return floor(f).
- * If f is an integer expression, then just return f.
- * Otherwise, create a new div d = [f] and return the expression d.
- */
-__isl_give isl_aff *isl_aff_floor(__isl_take isl_aff *aff)
-{
-	int size;
-	isl_ctx *ctx;
-
-	if (!aff)
-		return NULL;
-
-	if (isl_int_is_one(aff->v->el[0]))
-		return aff;
-
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-
-	aff->ls = isl_local_space_add_div(aff->ls, isl_vec_copy(aff->v));
-	if (!aff->ls)
-		return isl_aff_free(aff);
-
-	ctx = isl_aff_get_ctx(aff);
-	size = aff->v->size;
-	isl_vec_free(aff->v);
-	aff->v = isl_vec_alloc(ctx, size + 1);
-	aff->v = isl_vec_clr(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-	isl_int_set_si(aff->v->el[0], 1);
-	isl_int_set_si(aff->v->el[size], 1);
-
-	return aff;
-}
-
-/* Given f, return ceil(f).
- * If f is an integer expression, then just return f.
- * Otherwise, create a new div d = [-f] and return the expression -d.
- */
-__isl_give isl_aff *isl_aff_ceil(__isl_take isl_aff *aff)
-{
-	if (!aff)
-		return NULL;
-
-	if (isl_int_is_one(aff->v->el[0]))
-		return aff;
-
-	aff = isl_aff_neg(aff);
-	aff = isl_aff_floor(aff);
-	aff = isl_aff_neg(aff);
-
-	return aff;
-}
-
-/* Apply the expansion computed by isl_merge_divs.
- * The expansion itself is given by "exp" while the resulting
- * list of divs is given by "div".
- */
-__isl_give isl_aff *isl_aff_expand_divs( __isl_take isl_aff *aff,
-	__isl_take isl_mat *div, int *exp)
-{
-	int i, j;
-	int old_n_div;
-	int new_n_div;
-	int offset;
-
-	aff = isl_aff_cow(aff);
-	if (!aff || !div)
-		goto error;
-
-	old_n_div = isl_local_space_dim(aff->ls, isl_dim_div);
-	new_n_div = isl_mat_rows(div);
-	if (new_n_div < old_n_div)
-		isl_die(isl_mat_get_ctx(div), isl_error_invalid,
-			"not an expansion", goto error);
-
-	aff->v = isl_vec_extend(aff->v, aff->v->size + new_n_div - old_n_div);
-	if (!aff->v)
-		goto error;
-
-	offset = 1 + isl_local_space_offset(aff->ls, isl_dim_div);
-	j = old_n_div - 1;
-	for (i = new_n_div - 1; i >= 0; --i) {
-		if (j >= 0 && exp[j] == i) {
-			if (i != j)
-				isl_int_swap(aff->v->el[offset + i],
-					     aff->v->el[offset + j]);
-			j--;
-		} else
-			isl_int_set_si(aff->v->el[offset + i], 0);
-	}
-
-	aff->ls = isl_local_space_replace_divs(aff->ls, isl_mat_copy(div));
-	if (!aff->ls)
-		goto error;
-	isl_mat_free(div);
-	return aff;
-error:
-	isl_aff_free(aff);
-	isl_mat_free(div);
-	return NULL;
-}
-
-/* Add two affine expressions that live in the same local space.
- */
-static __isl_give isl_aff *add_expanded(__isl_take isl_aff *aff1,
-	__isl_take isl_aff *aff2)
-{
-	isl_int gcd, f;
-
-	aff1 = isl_aff_cow(aff1);
-	if (!aff1 || !aff2)
-		goto error;
-
-	aff1->v = isl_vec_cow(aff1->v);
-	if (!aff1->v)
-		goto error;
-
-	isl_int_init(gcd);
-	isl_int_init(f);
-	isl_int_gcd(gcd, aff1->v->el[0], aff2->v->el[0]);
-	isl_int_divexact(f, aff2->v->el[0], gcd);
-	isl_seq_scale(aff1->v->el + 1, aff1->v->el + 1, f, aff1->v->size - 1);
-	isl_int_divexact(f, aff1->v->el[0], gcd);
-	isl_seq_addmul(aff1->v->el + 1, f, aff2->v->el + 1, aff1->v->size - 1);
-	isl_int_divexact(f, aff2->v->el[0], gcd);
-	isl_int_mul(aff1->v->el[0], aff1->v->el[0], f);
-	isl_int_clear(f);
-	isl_int_clear(gcd);
-
-	isl_aff_free(aff2);
-	return aff1;
-error:
-	isl_aff_free(aff1);
-	isl_aff_free(aff2);
-	return NULL;
-}
-
-__isl_give isl_aff *isl_aff_add(__isl_take isl_aff *aff1,
-	__isl_take isl_aff *aff2)
-{
-	isl_ctx *ctx;
-	int *exp1 = NULL;
-	int *exp2 = NULL;
-	isl_mat *div;
-
-	if (!aff1 || !aff2)
-		goto error;
-
-	ctx = isl_aff_get_ctx(aff1);
-	if (!isl_dim_equal(aff1->ls->dim, aff2->ls->dim))
-		isl_die(ctx, isl_error_invalid,
-			"spaces don't match", goto error);
-
-	if (aff1->ls->div->n_row == 0 && aff2->ls->div->n_row == 0)
-		return add_expanded(aff1, aff2);
-
-	exp1 = isl_alloc_array(ctx, int, aff1->ls->div->n_row);
-	exp2 = isl_alloc_array(ctx, int, aff2->ls->div->n_row);
-	if (!exp1 || !exp2)
-		goto error;
-
-	div = isl_merge_divs(aff1->ls->div, aff2->ls->div, exp1, exp2);
-	aff1 = isl_aff_expand_divs(aff1, isl_mat_copy(div), exp1);
-	aff2 = isl_aff_expand_divs(aff2, div, exp2);
-	free(exp1);
-	free(exp2);
-
-	return add_expanded(aff1, aff2);
-error:
-	free(exp1);
-	free(exp2);
-	isl_aff_free(aff1);
-	isl_aff_free(aff2);
-	return NULL;
-}
-
-__isl_give isl_aff *isl_aff_sub(__isl_take isl_aff *aff1,
-	__isl_take isl_aff *aff2)
-{
-	return isl_aff_add(aff1, isl_aff_neg(aff2));
-}
-
-__isl_give isl_aff *isl_aff_scale(__isl_take isl_aff *aff, isl_int f)
-{
-	isl_int gcd;
-
-	if (isl_int_is_one(f))
-		return aff;
-
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-	aff->v = isl_vec_cow(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	isl_int_init(gcd);
-	isl_int_gcd(gcd, aff->v->el[0], f);
-	isl_int_divexact(aff->v->el[0], aff->v->el[0], gcd);
-	isl_int_divexact(gcd, f, gcd);
-	isl_seq_scale(aff->v->el + 1, aff->v->el + 1, gcd, aff->v->size - 1);
-	isl_int_clear(gcd);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_scale_down(__isl_take isl_aff *aff, isl_int f)
-{
-	isl_int gcd;
-
-	if (isl_int_is_one(f))
-		return aff;
-
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-	aff->v = isl_vec_cow(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	isl_int_init(gcd);
-	isl_seq_gcd(aff->v->el + 1, aff->v->size - 1, &gcd);
-	isl_int_gcd(gcd, gcd, f);
-	isl_seq_scale_down(aff->v->el + 1, aff->v->el + 1, gcd, aff->v->size - 1);
-	isl_int_divexact(gcd, f, gcd);
-	isl_int_mul(aff->v->el[0], aff->v->el[0], gcd);
-	isl_int_clear(gcd);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_scale_down_ui(__isl_take isl_aff *aff, unsigned f)
-{
-	isl_int v;
-
-	if (f == 1)
-		return aff;
-
-	isl_int_init(v);
-	isl_int_set_ui(v, f);
-	aff = isl_aff_scale_down(aff, v);
-	isl_int_clear(v);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_set_dim_name(__isl_take isl_aff *aff,
-	enum isl_dim_type type, unsigned pos, const char *s)
-{
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-	aff->ls = isl_local_space_set_dim_name(aff->ls, type, pos, s);
-	if (!aff->ls)
-		return isl_aff_free(aff);
-
-	return aff;
-}
-
-/* Exploit the equalities in "eq" to simplify the affine expression
- * and the expressions of the integer divisions in the local space.
- * The integer divisions in this local space are assumed to appear
- * as regular dimensions in "eq".
- */
-static __isl_give isl_aff *isl_aff_substitute_equalities(
-	__isl_take isl_aff *aff, __isl_take isl_basic_set *eq)
-{
-	int i, j;
-	unsigned total;
-	unsigned n_div;
-
-	if (!eq)
-		goto error;
-	if (eq->n_eq == 0) {
-		isl_basic_set_free(eq);
-		return aff;
-	}
-
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		goto error;
-
-	aff->ls = isl_local_space_substitute_equalities(aff->ls,
-							isl_basic_set_copy(eq));
-	if (!aff->ls)
-		goto error;
-
-	total = 1 + isl_dim_total(eq->dim);
-	n_div = eq->n_div;
-	for (i = 0; i < eq->n_eq; ++i) {
-		j = isl_seq_last_non_zero(eq->eq[i], total + n_div);
-		if (j < 0 || j == 0 || j >= total)
-			continue;
-
-		isl_seq_elim(aff->v->el + 1, eq->eq[i], j, total,
-				&aff->v->el[0]);
-	}
-
-	isl_basic_set_free(eq);
-	return aff;
-error:
-	isl_basic_set_free(eq);
-	isl_aff_free(aff);
-	return NULL;
-}
-
-/* Look for equalities among the variables shared by context and aff
- * and the integer divisions of aff, if any.
- * The equalities are then used to eliminate coefficients and/or integer
- * divisions from aff.
- */
-__isl_give isl_aff *isl_aff_gist(__isl_take isl_aff *aff,
-	__isl_take isl_set *context)
-{
-	isl_basic_set *hull;
-	int n_div;
-
-	if (!aff)
-		goto error;
-	n_div = isl_local_space_dim(aff->ls, isl_dim_div);
-	if (n_div > 0) {
-		isl_basic_set *bset;
-		context = isl_set_add_dims(context, isl_dim_set, n_div);
-		bset = isl_basic_set_from_local_space(
-					    isl_aff_get_local_space(aff));
-		bset = isl_basic_set_lift(bset);
-		bset = isl_basic_set_flatten(bset);
-		context = isl_set_intersect(context,
-					    isl_set_from_basic_set(bset));
-	}
-
-	hull = isl_set_affine_hull(context);
-	return isl_aff_substitute_equalities(aff, hull);
-error:
-	isl_aff_free(aff);
-	isl_set_free(context);
-	return NULL;
-}
-
-/* Return a basic set containing those elements in the space
- * of aff where it is non-negative.
- */
-__isl_give isl_basic_set *isl_aff_nonneg_basic_set(__isl_take isl_aff *aff)
-{
-	isl_constraint *ineq;
-
-	ineq = isl_inequality_from_aff(aff);
-
-	return isl_basic_set_from_constraint(ineq);
-}
-
-/* Return a basic set containing those elements in the space
- * of aff where it is zero.
- */
-__isl_give isl_basic_set *isl_aff_zero_basic_set(__isl_take isl_aff *aff)
-{
-	isl_constraint *ineq;
-
-	ineq = isl_equality_from_aff(aff);
-
-	return isl_basic_set_from_constraint(ineq);
-}
-
-/* Return a basic set containing those elements in the shared space
- * of aff1 and aff2 where aff1 is greater than or equal to aff2.
- */
-__isl_give isl_basic_set *isl_aff_ge_basic_set(__isl_take isl_aff *aff1,
-	__isl_take isl_aff *aff2)
-{
-	aff1 = isl_aff_sub(aff1, aff2);
-
-	return isl_aff_nonneg_basic_set(aff1);
-}
-
-__isl_give isl_aff *isl_aff_add_on_domain(__isl_keep isl_set *dom,
-	__isl_take isl_aff *aff1, __isl_take isl_aff *aff2)
-{
-	aff1 = isl_aff_add(aff1, aff2);
-	aff1 = isl_aff_gist(aff1, isl_set_copy(dom));
-	return aff1;
-}
-
-int isl_aff_is_empty(__isl_keep isl_aff *aff)
-{
-	if (!aff)
-		return -1;
-
-	return 0;
-}
-
-/* Set active[i] to 1 if the dimension at position i is involved
- * in the affine expression.
- */
-static int set_active(__isl_keep isl_aff *aff, int *active)
-{
-	int i, j;
-	unsigned total;
-	unsigned offset;
-
-	if (!aff || !active)
-		return -1;
-
-	total = aff->v->size - 2;
-	for (i = 0; i < total; ++i)
-		active[i] = !isl_int_is_zero(aff->v->el[2 + i]);
-
-	offset = isl_local_space_offset(aff->ls, isl_dim_div) - 1;
-	for (i = aff->ls->div->n_row - 1; i >= 0; --i) {
-		if (!active[offset + i])
-			continue;
-		for (j = 0; j < total; ++j)
-			active[j] |=
-				!isl_int_is_zero(aff->ls->div->row[i][2 + j]);
-	}
-
-	return 0;
-}
-
-/* Check whether the given affine expression has non-zero coefficient
- * for any dimension in the given range or if any of these dimensions
- * appear with non-zero coefficients in any of the integer divisions
- * involved in the affine expression.
- */
-int isl_aff_involves_dims(__isl_keep isl_aff *aff,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-	isl_ctx *ctx;
-	int *active = NULL;
-	int involves = 0;
-
-	if (!aff)
-		return -1;
-	if (n == 0)
-		return 0;
-
-	ctx = isl_aff_get_ctx(aff);
-	if (first + n > isl_aff_dim(aff, type))
-		isl_die(ctx, isl_error_invalid,
-			"range out of bounds", return -1);
-
-	active = isl_calloc_array(ctx, int,
-				  isl_local_space_dim(aff->ls, isl_dim_all));
-	if (set_active(aff, active) < 0)
-		goto error;
-
-	first += isl_local_space_offset(aff->ls, type) - 1;
-	for (i = 0; i < n; ++i)
-		if (active[first + i]) {
-			involves = 1;
-			break;
-		}
-
-	free(active);
-
-	return involves;
-error:
-	free(active);
-	return -1;
-}
-
-__isl_give isl_aff *isl_aff_drop_dims(__isl_take isl_aff *aff,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	isl_ctx *ctx;
-
-	if (!aff)
-		return NULL;
-	if (n == 0 && !isl_local_space_is_named_or_nested(aff->ls, type))
-		return aff;
-
-	ctx = isl_aff_get_ctx(aff);
-	if (first + n > isl_aff_dim(aff, type))
-		isl_die(ctx, isl_error_invalid, "range out of bounds",
-			return isl_aff_free(aff));
-
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-
-	aff->ls = isl_local_space_drop_dims(aff->ls, type, first, n);
-	if (!aff->ls)
-		return isl_aff_free(aff);
-
-	first += 1 + isl_local_space_offset(aff->ls, type);
-	aff->v = isl_vec_drop_els(aff->v, first, n);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_insert_dims(__isl_take isl_aff *aff,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	isl_ctx *ctx;
-
-	if (!aff)
-		return NULL;
-	if (n == 0 && !isl_local_space_is_named_or_nested(aff->ls, type))
-		return aff;
-
-	ctx = isl_aff_get_ctx(aff);
-	if (first > isl_aff_dim(aff, type))
-		isl_die(ctx, isl_error_invalid, "position out of bounds",
-			return isl_aff_free(aff));
-
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-
-	aff->ls = isl_local_space_insert_dims(aff->ls, type, first, n);
-	if (!aff->ls)
-		return isl_aff_free(aff);
-
-	first += 1 + isl_local_space_offset(aff->ls, type);
-	aff->v = isl_vec_insert_zero_els(aff->v, first, n);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_add_dims(__isl_take isl_aff *aff,
-	enum isl_dim_type type, unsigned n)
-{
-	unsigned pos;
-
-	pos = isl_aff_dim(aff, type);
-
-	return isl_aff_insert_dims(aff, type, pos, n);
-}
-
-__isl_give isl_pw_aff *isl_pw_aff_add_dims(__isl_take isl_pw_aff *pwaff,
-	enum isl_dim_type type, unsigned n)
-{
-	unsigned pos;
-
-	pos = isl_pw_aff_dim(pwaff, type);
-
-	return isl_pw_aff_insert_dims(pwaff, type, pos, n);
-}
-
-#undef PW
-#define PW isl_pw_aff
-#undef EL
-#define EL isl_aff
-#undef EL_IS_ZERO
-#define EL_IS_ZERO is_empty
-#undef ZERO
-#define ZERO empty
-#undef IS_ZERO
-#define IS_ZERO is_empty
-#undef FIELD
-#define FIELD aff
-
-#define NO_EVAL
-#define NO_OPT
-#define NO_MOVE_DIMS
-#define NO_LIFT
-#define NO_MORPH
-
-#include <isl_pw_templ.c>
-
-/* Compute a piecewise quasi-affine expression with a domain that
- * is the union of those of pwaff1 and pwaff2 and such that on each
- * cell, the quasi-affine expression is the maximum of those of pwaff1
- * and pwaff2.  If only one of pwaff1 or pwaff2 is defined on a given
- * cell, then the associated expression is the defined one.
- */
-__isl_give isl_pw_aff *isl_pw_aff_max(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	int i, j, n;
-	isl_pw_aff *res;
-	isl_ctx *ctx;
-	isl_set *set;
-
-	if (!pwaff1 || !pwaff2)
-		goto error;
-
-	ctx = isl_dim_get_ctx(pwaff1->dim);
-	if (!isl_dim_equal(pwaff1->dim, pwaff2->dim))
-		isl_die(ctx, isl_error_invalid,
-			"arguments should live in same space", goto error);
-
-	if (isl_pw_aff_is_empty(pwaff1)) {
-		isl_pw_aff_free(pwaff1);
-		return pwaff2;
-	}
-
-	if (isl_pw_aff_is_empty(pwaff2)) {
-		isl_pw_aff_free(pwaff2);
-		return pwaff1;
-	}
-
-	n = 2 * (pwaff1->n + 1) * (pwaff2->n + 1);
-	res = isl_pw_aff_alloc_(isl_dim_copy(pwaff1->dim), n);
-
-	for (i = 0; i < pwaff1->n; ++i) {
-		set = isl_set_copy(pwaff1->p[i].set);
-		for (j = 0; j < pwaff2->n; ++j) {
-			struct isl_set *common;
-			isl_set *ge;
-
-			common = isl_set_intersect(
-					isl_set_copy(pwaff1->p[i].set),
-					isl_set_copy(pwaff2->p[j].set));
-			ge = isl_set_from_basic_set(isl_aff_ge_basic_set(
-					isl_aff_copy(pwaff2->p[j].aff),
-					isl_aff_copy(pwaff1->p[i].aff)));
-			ge = isl_set_intersect(common, ge);
-			if (isl_set_plain_is_empty(ge)) {
-				isl_set_free(ge);
-				continue;
-			}
-			set = isl_set_subtract(set, isl_set_copy(ge));
-
-			res = isl_pw_aff_add_piece(res, ge,
-						isl_aff_copy(pwaff2->p[j].aff));
-		}
-		res = isl_pw_aff_add_piece(res, set,
-						isl_aff_copy(pwaff1->p[i].aff));
-	}
-
-	for (j = 0; j < pwaff2->n; ++j) {
-		set = isl_set_copy(pwaff2->p[j].set);
-		for (i = 0; i < pwaff1->n; ++i)
-			set = isl_set_subtract(set,
-					isl_set_copy(pwaff1->p[i].set));
-		res = isl_pw_aff_add_piece(res, set,
-						isl_aff_copy(pwaff2->p[j].aff));
-	}
-
-	isl_pw_aff_free(pwaff1);
-	isl_pw_aff_free(pwaff2);
-
-	return res;
-error:
-	isl_pw_aff_free(pwaff1);
-	isl_pw_aff_free(pwaff2);
-	return NULL;
-}
-
-/* Construct a map with as domain the domain of pwaff and
- * one-dimensional range corresponding to the affine expressions.
- */
-__isl_give isl_map *isl_map_from_pw_aff(__isl_take isl_pw_aff *pwaff)
-{
-	int i;
-	isl_dim *dim;
-	isl_map *map;
-
-	if (!pwaff)
-		return NULL;
-
-	dim = isl_pw_aff_get_dim(pwaff);
-	dim = isl_dim_from_domain(dim);
-	dim = isl_dim_add(dim, isl_dim_out, 1);
-	map = isl_map_empty(dim);
-
-	for (i = 0; i < pwaff->n; ++i) {
-		isl_basic_map *bmap;
-		isl_map *map_i;
-
-		bmap = isl_basic_map_from_aff(isl_aff_copy(pwaff->p[i].aff));
-		map_i = isl_map_from_basic_map(bmap);
-		map_i = isl_map_intersect_domain(map_i,
-						isl_set_copy(pwaff->p[i].set));
-		map = isl_map_union_disjoint(map, map_i);
-	}
-
-	isl_pw_aff_free(pwaff);
-
-	return map;
-}
-
-/* Return a set containing those elements in the domain
- * of pwaff where it is non-negative.
- */
-__isl_give isl_set *isl_pw_aff_nonneg_set(__isl_take isl_pw_aff *pwaff)
-{
-	int i;
-	isl_set *set;
-
-	if (!pwaff)
-		return NULL;
-
-	set = isl_set_empty(isl_pw_aff_get_dim(pwaff));
-
-	for (i = 0; i < pwaff->n; ++i) {
-		isl_basic_set *bset;
-		isl_set *set_i;
-
-		bset = isl_aff_nonneg_basic_set(isl_aff_copy(pwaff->p[i].aff));
-		set_i = isl_set_from_basic_set(bset);
-		set_i = isl_set_intersect(set_i, isl_set_copy(pwaff->p[i].set));
-		set = isl_set_union_disjoint(set, set_i);
-	}
-
-	isl_pw_aff_free(pwaff);
-
-	return set;
-}
-
-/* Return a set containing those elements in the domain
- * of pwaff where it is zero.
- */
-__isl_give isl_set *isl_pw_aff_zero_set(__isl_take isl_pw_aff *pwaff)
-{
-	int i;
-	isl_set *set;
-
-	if (!pwaff)
-		return NULL;
-
-	set = isl_set_empty(isl_pw_aff_get_dim(pwaff));
-
-	for (i = 0; i < pwaff->n; ++i) {
-		isl_basic_set *bset;
-		isl_set *set_i;
-
-		bset = isl_aff_zero_basic_set(isl_aff_copy(pwaff->p[i].aff));
-		set_i = isl_set_from_basic_set(bset);
-		set_i = isl_set_intersect(set_i, isl_set_copy(pwaff->p[i].set));
-		set = isl_set_union_disjoint(set, set_i);
-	}
-
-	isl_pw_aff_free(pwaff);
-
-	return set;
-}
-
-/* Return a set containing those elements in the shared domain
- * of pwaff1 and pwaff2 where pwaff1 is greater than (or equal) to pwaff2.
- *
- * We compute the difference on the shared domain and then construct
- * the set of values where this difference is non-negative.
- * If strict is set, we first subtract 1 from the difference.
- * If equal is set, we only return the elements where pwaff1 and pwaff2
- * are equal.
- */
-static __isl_give isl_set *pw_aff_gte_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2, int strict, int equal)
-{
-	isl_set *set1, *set2;
-
-	set1 = isl_pw_aff_domain(isl_pw_aff_copy(pwaff1));
-	set2 = isl_pw_aff_domain(isl_pw_aff_copy(pwaff2));
-	set1 = isl_set_intersect(set1, set2);
-	pwaff1 = isl_pw_aff_intersect_domain(pwaff1, isl_set_copy(set1));
-	pwaff2 = isl_pw_aff_intersect_domain(pwaff2, isl_set_copy(set1));
-	pwaff1 = isl_pw_aff_add(pwaff1, isl_pw_aff_neg(pwaff2));
-
-	if (strict) {
-		isl_dim *dim = isl_set_get_dim(set1);
-		isl_aff *aff;
-		aff = isl_aff_zero(isl_local_space_from_dim(dim));
-		aff = isl_aff_add_constant_si(aff, -1);
-		pwaff1 = isl_pw_aff_add(pwaff1, isl_pw_aff_alloc(set1, aff));
-	} else
-		isl_set_free(set1);
-
-	if (equal)
-		return isl_pw_aff_zero_set(pwaff1);
-	return isl_pw_aff_nonneg_set(pwaff1);
-}
-
-/* Return a set containing those elements in the shared domain
- * of pwaff1 and pwaff2 where pwaff1 is equal to pwaff2.
- */
-__isl_give isl_set *isl_pw_aff_eq_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return pw_aff_gte_set(pwaff1, pwaff2, 0, 1);
-}
-
-/* Return a set containing those elements in the shared domain
- * of pwaff1 and pwaff2 where pwaff1 is greater than or equal to pwaff2.
- */
-__isl_give isl_set *isl_pw_aff_ge_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return pw_aff_gte_set(pwaff1, pwaff2, 0, 0);
-}
-
-/* Return a set containing those elements in the shared domain
- * of pwaff1 and pwaff2 where pwaff1 is strictly greater than pwaff2.
- */
-__isl_give isl_set *isl_pw_aff_gt_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return pw_aff_gte_set(pwaff1, pwaff2, 1, 0);
-}
-
-__isl_give isl_set *isl_pw_aff_le_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return isl_pw_aff_ge_set(pwaff2, pwaff1);
-}
-
-__isl_give isl_set *isl_pw_aff_lt_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return isl_pw_aff_gt_set(pwaff2, pwaff1);
-}
-
-__isl_give isl_pw_aff *isl_pw_aff_scale_down(__isl_take isl_pw_aff *pwaff,
-	isl_int v)
-{
-	int i;
-
-	if (isl_int_is_one(v))
-		return pwaff;
-	if (!isl_int_is_pos(v))
-		isl_die(isl_pw_aff_get_ctx(pwaff), isl_error_invalid,
-			"factor needs to be positive",
-			return isl_pw_aff_free(pwaff));
-	pwaff = isl_pw_aff_cow(pwaff);
-	if (!pwaff)
-		return NULL;
-	if (pwaff->n == 0)
-		return pwaff;
-
-	for (i = 0; i < pwaff->n; ++i) {
-		pwaff->p[i].aff = isl_aff_scale_down(pwaff->p[i].aff, v);
-		if (!pwaff->p[i].aff)
-			return isl_pw_aff_free(pwaff);
-	}
-
-	return pwaff;
-}
-
-__isl_give isl_pw_aff *isl_pw_aff_floor(__isl_take isl_pw_aff *pwaff)
-{
-	int i;
-
-	pwaff = isl_pw_aff_cow(pwaff);
-	if (!pwaff)
-		return NULL;
-	if (pwaff->n == 0)
-		return pwaff;
-
-	for (i = 0; i < pwaff->n; ++i) {
-		pwaff->p[i].aff = isl_aff_floor(pwaff->p[i].aff);
-		if (!pwaff->p[i].aff)
-			return isl_pw_aff_free(pwaff);
-	}
-
-	return pwaff;
-}
-
-__isl_give isl_pw_aff *isl_pw_aff_ceil(__isl_take isl_pw_aff *pwaff)
-{
-	int i;
-
-	pwaff = isl_pw_aff_cow(pwaff);
-	if (!pwaff)
-		return NULL;
-	if (pwaff->n == 0)
-		return pwaff;
-
-	for (i = 0; i < pwaff->n; ++i) {
-		pwaff->p[i].aff = isl_aff_ceil(pwaff->p[i].aff);
-		if (!pwaff->p[i].aff)
-			return isl_pw_aff_free(pwaff);
-	}
-
-	return pwaff;
-}
-
-/* Return an affine expression that is equal to pwaff_true for elements
- * in "cond" and to pwaff_false for elements not in "cond".
- * That is, return cond ? pwaff_true : pwaff_false;
- */
-__isl_give isl_pw_aff *isl_pw_aff_cond(__isl_take isl_set *cond,
-	__isl_take isl_pw_aff *pwaff_true, __isl_take isl_pw_aff *pwaff_false)
-{
-	isl_set *comp;
-
-	comp = isl_set_complement(isl_set_copy(cond));
-	pwaff_true = isl_pw_aff_intersect_domain(pwaff_true, cond);
-	pwaff_false = isl_pw_aff_intersect_domain(pwaff_false, comp);
-
-	return isl_pw_aff_add_disjoint(pwaff_true, pwaff_false);
-}
diff --git a/cloog-0.16.3/isl/isl_aff_private.h b/cloog-0.16.3/isl/isl_aff_private.h
deleted file mode 100644
index cd51804..0000000
--- a/cloog-0.16.3/isl/isl_aff_private.h
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef ISL_AFF_PRIVATE_H
-#define ISL_AFF_PRIVATE_H
-
-#include <isl/aff.h>
-#include <isl/vec.h>
-#include <isl/mat.h>
-#include <isl/local_space.h>
-
-struct isl_aff {
-	int ref;
-
-	isl_local_space	*ls;
-	isl_vec		*v;
-};
-
-struct isl_pw_aff_piece {
-	struct isl_set *set;
-	struct isl_aff *aff;
-};
-
-struct isl_pw_aff {
-	int ref;
-
-	isl_dim *dim;
-
-	int n;
-
-	size_t size;
-	struct isl_pw_aff_piece p[1];
-};
-
-__isl_give isl_aff *isl_aff_alloc(__isl_take isl_local_space *ls);
-
-__isl_give isl_aff *isl_aff_reset_dim(__isl_take isl_aff *aff,
-	__isl_take isl_dim *dim);
-__isl_give isl_aff *isl_aff_realign(__isl_take isl_aff *aff,
-	__isl_take isl_reordering *r);
-
-__isl_give isl_aff *isl_aff_expand_divs( __isl_take isl_aff *aff,
-	__isl_take isl_mat *div, int *exp);
-
-__isl_give isl_pw_aff *isl_pw_aff_add_disjoint(
-	__isl_take isl_pw_aff *pwaff1, __isl_take isl_pw_aff *pwaff2);
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_affine_hull.c b/cloog-0.16.3/isl/isl_affine_hull.c
deleted file mode 100644
index ffb775b..0000000
--- a/cloog-0.16.3/isl/isl_affine_hull.c
+++ /dev/null
@@ -1,1018 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl/seq.h>
-#include <isl/set.h>
-#include <isl/lp.h>
-#include <isl/map.h>
-#include "isl_equalities.h"
-#include "isl_sample.h"
-#include "isl_tab.h"
-#include <isl_mat_private.h>
-
-struct isl_basic_map *isl_basic_map_implicit_equalities(
-						struct isl_basic_map *bmap)
-{
-	struct isl_tab *tab;
-
-	if (!bmap)
-		return bmap;
-
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY))
-		return bmap;
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_NO_IMPLICIT))
-		return bmap;
-	if (bmap->n_ineq <= 1)
-		return bmap;
-
-	tab = isl_tab_from_basic_map(bmap);
-	if (isl_tab_detect_implicit_equalities(tab) < 0)
-		goto error;
-	bmap = isl_basic_map_update_from_tab(bmap, tab);
-	isl_tab_free(tab);
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	ISL_F_SET(bmap, ISL_BASIC_MAP_NO_IMPLICIT);
-	return bmap;
-error:
-	isl_tab_free(tab);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_implicit_equalities(
-						struct isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_implicit_equalities((struct isl_basic_map*)bset);
-}
-
-struct isl_map *isl_map_implicit_equalities(struct isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return map;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_implicit_equalities(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Make eq[row][col] of both bmaps equal so we can add the row
- * add the column to the common matrix.
- * Note that because of the echelon form, the columns of row row
- * after column col are zero.
- */
-static void set_common_multiple(
-	struct isl_basic_set *bset1, struct isl_basic_set *bset2,
-	unsigned row, unsigned col)
-{
-	isl_int m, c;
-
-	if (isl_int_eq(bset1->eq[row][col], bset2->eq[row][col]))
-		return;
-
-	isl_int_init(c);
-	isl_int_init(m);
-	isl_int_lcm(m, bset1->eq[row][col], bset2->eq[row][col]);
-	isl_int_divexact(c, m, bset1->eq[row][col]);
-	isl_seq_scale(bset1->eq[row], bset1->eq[row], c, col+1);
-	isl_int_divexact(c, m, bset2->eq[row][col]);
-	isl_seq_scale(bset2->eq[row], bset2->eq[row], c, col+1);
-	isl_int_clear(c);
-	isl_int_clear(m);
-}
-
-/* Delete a given equality, moving all the following equalities one up.
- */
-static void delete_row(struct isl_basic_set *bset, unsigned row)
-{
-	isl_int *t;
-	int r;
-
-	t = bset->eq[row];
-	bset->n_eq--;
-	for (r = row; r < bset->n_eq; ++r)
-		bset->eq[r] = bset->eq[r+1];
-	bset->eq[bset->n_eq] = t;
-}
-
-/* Make first row entries in column col of bset1 identical to
- * those of bset2, using the fact that entry bset1->eq[row][col]=a
- * is non-zero.  Initially, these elements of bset1 are all zero.
- * For each row i < row, we set
- *		A[i] = a * A[i] + B[i][col] * A[row]
- *		B[i] = a * B[i]
- * so that
- *		A[i][col] = B[i][col] = a * old(B[i][col])
- */
-static void construct_column(
-	struct isl_basic_set *bset1, struct isl_basic_set *bset2,
-	unsigned row, unsigned col)
-{
-	int r;
-	isl_int a;
-	isl_int b;
-	unsigned total;
-
-	isl_int_init(a);
-	isl_int_init(b);
-	total = 1 + isl_basic_set_n_dim(bset1);
-	for (r = 0; r < row; ++r) {
-		if (isl_int_is_zero(bset2->eq[r][col]))
-			continue;
-		isl_int_gcd(b, bset2->eq[r][col], bset1->eq[row][col]);
-		isl_int_divexact(a, bset1->eq[row][col], b);
-		isl_int_divexact(b, bset2->eq[r][col], b);
-		isl_seq_combine(bset1->eq[r], a, bset1->eq[r],
-					      b, bset1->eq[row], total);
-		isl_seq_scale(bset2->eq[r], bset2->eq[r], a, total);
-	}
-	isl_int_clear(a);
-	isl_int_clear(b);
-	delete_row(bset1, row);
-}
-
-/* Make first row entries in column col of bset1 identical to
- * those of bset2, using only these entries of the two matrices.
- * Let t be the last row with different entries.
- * For each row i < t, we set
- *	A[i] = (A[t][col]-B[t][col]) * A[i] + (B[i][col]-A[i][col) * A[t]
- *	B[i] = (A[t][col]-B[t][col]) * B[i] + (B[i][col]-A[i][col) * B[t]
- * so that
- *	A[i][col] = B[i][col] = old(A[t][col]*B[i][col]-A[i][col]*B[t][col])
- */
-static int transform_column(
-	struct isl_basic_set *bset1, struct isl_basic_set *bset2,
-	unsigned row, unsigned col)
-{
-	int i, t;
-	isl_int a, b, g;
-	unsigned total;
-
-	for (t = row-1; t >= 0; --t)
-		if (isl_int_ne(bset1->eq[t][col], bset2->eq[t][col]))
-			break;
-	if (t < 0)
-		return 0;
-
-	total = 1 + isl_basic_set_n_dim(bset1);
-	isl_int_init(a);
-	isl_int_init(b);
-	isl_int_init(g);
-	isl_int_sub(b, bset1->eq[t][col], bset2->eq[t][col]);
-	for (i = 0; i < t; ++i) {
-		isl_int_sub(a, bset2->eq[i][col], bset1->eq[i][col]);
-		isl_int_gcd(g, a, b);
-		isl_int_divexact(a, a, g);
-		isl_int_divexact(g, b, g);
-		isl_seq_combine(bset1->eq[i], g, bset1->eq[i], a, bset1->eq[t],
-				total);
-		isl_seq_combine(bset2->eq[i], g, bset2->eq[i], a, bset2->eq[t],
-				total);
-	}
-	isl_int_clear(a);
-	isl_int_clear(b);
-	isl_int_clear(g);
-	delete_row(bset1, t);
-	delete_row(bset2, t);
-	return 1;
-}
-
-/* The implementation is based on Section 5.2 of Michael Karr,
- * "Affine Relationships Among Variables of a Program",
- * except that the echelon form we use starts from the last column
- * and that we are dealing with integer coefficients.
- */
-static struct isl_basic_set *affine_hull(
-	struct isl_basic_set *bset1, struct isl_basic_set *bset2)
-{
-	unsigned total;
-	int col;
-	int row;
-
-	if (!bset1 || !bset2)
-		goto error;
-
-	total = 1 + isl_basic_set_n_dim(bset1);
-
-	row = 0;
-	for (col = total-1; col >= 0; --col) {
-		int is_zero1 = row >= bset1->n_eq ||
-			isl_int_is_zero(bset1->eq[row][col]);
-		int is_zero2 = row >= bset2->n_eq ||
-			isl_int_is_zero(bset2->eq[row][col]);
-		if (!is_zero1 && !is_zero2) {
-			set_common_multiple(bset1, bset2, row, col);
-			++row;
-		} else if (!is_zero1 && is_zero2) {
-			construct_column(bset1, bset2, row, col);
-		} else if (is_zero1 && !is_zero2) {
-			construct_column(bset2, bset1, row, col);
-		} else {
-			if (transform_column(bset1, bset2, row, col))
-				--row;
-		}
-	}
-	isl_assert(bset1->ctx, row == bset1->n_eq, goto error);
-	isl_basic_set_free(bset2);
-	bset1 = isl_basic_set_normalize_constraints(bset1);
-	return bset1;
-error:
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	return NULL;
-}
-
-/* Find an integer point in the set represented by "tab"
- * that lies outside of the equality "eq" e(x) = 0.
- * If "up" is true, look for a point satisfying e(x) - 1 >= 0.
- * Otherwise, look for a point satisfying -e(x) - 1 >= 0 (i.e., e(x) <= -1).
- * The point, if found, is returned.
- * If no point can be found, a zero-length vector is returned.
- *
- * Before solving an ILP problem, we first check if simply
- * adding the normal of the constraint to one of the known
- * integer points in the basic set represented by "tab"
- * yields another point inside the basic set.
- *
- * The caller of this function ensures that the tableau is bounded or
- * that tab->basis and tab->n_unbounded have been set appropriately.
- */
-static struct isl_vec *outside_point(struct isl_tab *tab, isl_int *eq, int up)
-{
-	struct isl_ctx *ctx;
-	struct isl_vec *sample = NULL;
-	struct isl_tab_undo *snap;
-	unsigned dim;
-
-	if (!tab)
-		return NULL;
-	ctx = tab->mat->ctx;
-
-	dim = tab->n_var;
-	sample = isl_vec_alloc(ctx, 1 + dim);
-	if (!sample)
-		return NULL;
-	isl_int_set_si(sample->el[0], 1);
-	isl_seq_combine(sample->el + 1,
-		ctx->one, tab->bmap->sample->el + 1,
-		up ? ctx->one : ctx->negone, eq + 1, dim);
-	if (isl_basic_map_contains(tab->bmap, sample))
-		return sample;
-	isl_vec_free(sample);
-	sample = NULL;
-
-	snap = isl_tab_snap(tab);
-
-	if (!up)
-		isl_seq_neg(eq, eq, 1 + dim);
-	isl_int_sub_ui(eq[0], eq[0], 1);
-
-	if (isl_tab_extend_cons(tab, 1) < 0)
-		goto error;
-	if (isl_tab_add_ineq(tab, eq) < 0)
-		goto error;
-
-	sample = isl_tab_sample(tab);
-
-	isl_int_add_ui(eq[0], eq[0], 1);
-	if (!up)
-		isl_seq_neg(eq, eq, 1 + dim);
-
-	if (sample && isl_tab_rollback(tab, snap) < 0)
-		goto error;
-
-	return sample;
-error:
-	isl_vec_free(sample);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_recession_cone(struct isl_basic_set *bset)
-{
-	int i;
-
-	bset = isl_basic_set_cow(bset);
-	if (!bset)
-		return NULL;
-	isl_assert(bset->ctx, bset->n_div == 0, goto error);
-
-	for (i = 0; i < bset->n_eq; ++i)
-		isl_int_set_si(bset->eq[i][0], 0);
-
-	for (i = 0; i < bset->n_ineq; ++i)
-		isl_int_set_si(bset->ineq[i][0], 0);
-
-	ISL_F_CLR(bset, ISL_BASIC_SET_NO_IMPLICIT);
-	return isl_basic_set_implicit_equalities(bset);
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_recession_cone(__isl_take isl_set *set)
-{
-	int i;
-
-	if (!set)
-		return NULL;
-	if (set->n == 0)
-		return set;
-
-	set = isl_set_remove_divs(set);
-	set = isl_set_cow(set);
-	if (!set)
-		return NULL;
-
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_basic_set_recession_cone(set->p[i]);
-		if (!set->p[i])
-			goto error;
-	}
-
-	return set;
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-/* Extend an initial (under-)approximation of the affine hull of basic
- * set represented by the tableau "tab"
- * by looking for points that do not satisfy one of the equalities
- * in the current approximation and adding them to that approximation
- * until no such points can be found any more.
- *
- * The caller of this function ensures that "tab" is bounded or
- * that tab->basis and tab->n_unbounded have been set appropriately.
- */
-static struct isl_basic_set *extend_affine_hull(struct isl_tab *tab,
-	struct isl_basic_set *hull)
-{
-	int i, j;
-	unsigned dim;
-
-	if (!tab || !hull)
-		goto error;
-
-	dim = tab->n_var;
-
-	if (isl_tab_extend_cons(tab, 2 * dim + 1) < 0)
-		goto error;
-
-	for (i = 0; i < dim; ++i) {
-		struct isl_vec *sample;
-		struct isl_basic_set *point;
-		for (j = 0; j < hull->n_eq; ++j) {
-			sample = outside_point(tab, hull->eq[j], 1);
-			if (!sample)
-				goto error;
-			if (sample->size > 0)
-				break;
-			isl_vec_free(sample);
-			sample = outside_point(tab, hull->eq[j], 0);
-			if (!sample)
-				goto error;
-			if (sample->size > 0)
-				break;
-			isl_vec_free(sample);
-
-			if (isl_tab_add_eq(tab, hull->eq[j]) < 0)
-				goto error;
-		}
-		if (j == hull->n_eq)
-			break;
-		if (tab->samples)
-			tab = isl_tab_add_sample(tab, isl_vec_copy(sample));
-		if (!tab)
-			goto error;
-		point = isl_basic_set_from_vec(sample);
-		hull = affine_hull(hull, point);
-		if (!hull)
-			return NULL;
-	}
-
-	return hull;
-error:
-	isl_basic_set_free(hull);
-	return NULL;
-}
-
-/* Drop all constraints in bset that involve any of the dimensions
- * first to first+n-1.
- */
-__isl_give isl_basic_set *isl_basic_set_drop_constraints_involving(
-	__isl_take isl_basic_set *bset, unsigned first, unsigned n)
-{
-	int i;
-
-	if (n == 0)
-		return bset;
-
-	bset = isl_basic_set_cow(bset);
-
-	if (!bset)
-		return NULL;
-
-	for (i = bset->n_eq - 1; i >= 0; --i) {
-		if (isl_seq_first_non_zero(bset->eq[i] + 1 + first, n) == -1)
-			continue;
-		isl_basic_set_drop_equality(bset, i);
-	}
-
-	for (i = bset->n_ineq - 1; i >= 0; --i) {
-		if (isl_seq_first_non_zero(bset->ineq[i] + 1 + first, n) == -1)
-			continue;
-		isl_basic_set_drop_inequality(bset, i);
-	}
-
-	return bset;
-}
-
-/* Look for all equalities satisfied by the integer points in bset,
- * which is assumed to be bounded.
- *
- * The equalities are obtained by successively looking for
- * a point that is affinely independent of the points found so far.
- * In particular, for each equality satisfied by the points so far,
- * we check if there is any point on a hyperplane parallel to the
- * corresponding hyperplane shifted by at least one (in either direction).
- */
-static struct isl_basic_set *uset_affine_hull_bounded(struct isl_basic_set *bset)
-{
-	struct isl_vec *sample = NULL;
-	struct isl_basic_set *hull;
-	struct isl_tab *tab = NULL;
-	unsigned dim;
-
-	if (isl_basic_set_plain_is_empty(bset))
-		return bset;
-
-	dim = isl_basic_set_n_dim(bset);
-
-	if (bset->sample && bset->sample->size == 1 + dim) {
-		int contains = isl_basic_set_contains(bset, bset->sample);
-		if (contains < 0)
-			goto error;
-		if (contains) {
-			if (dim == 0)
-				return bset;
-			sample = isl_vec_copy(bset->sample);
-		} else {
-			isl_vec_free(bset->sample);
-			bset->sample = NULL;
-		}
-	}
-
-	tab = isl_tab_from_basic_set(bset);
-	if (!tab)
-		goto error;
-	if (tab->empty) {
-		isl_tab_free(tab);
-		isl_vec_free(sample);
-		return isl_basic_set_set_to_empty(bset);
-	}
-	if (isl_tab_track_bset(tab, isl_basic_set_copy(bset)) < 0)
-		goto error;
-
-	if (!sample) {
-		struct isl_tab_undo *snap;
-		snap = isl_tab_snap(tab);
-		sample = isl_tab_sample(tab);
-		if (isl_tab_rollback(tab, snap) < 0)
-			goto error;
-		isl_vec_free(tab->bmap->sample);
-		tab->bmap->sample = isl_vec_copy(sample);
-	}
-
-	if (!sample)
-		goto error;
-	if (sample->size == 0) {
-		isl_tab_free(tab);
-		isl_vec_free(sample);
-		return isl_basic_set_set_to_empty(bset);
-	}
-
-	hull = isl_basic_set_from_vec(sample);
-
-	isl_basic_set_free(bset);
-	hull = extend_affine_hull(tab, hull);
-	isl_tab_free(tab);
-
-	return hull;
-error:
-	isl_vec_free(sample);
-	isl_tab_free(tab);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Given an unbounded tableau and an integer point satisfying the tableau,
- * construct an initial affine hull containing the recession cone
- * shifted to the given point.
- *
- * The unbounded directions are taken from the last rows of the basis,
- * which is assumed to have been initialized appropriately.
- */
-static __isl_give isl_basic_set *initial_hull(struct isl_tab *tab,
-	__isl_take isl_vec *vec)
-{
-	int i;
-	int k;
-	struct isl_basic_set *bset = NULL;
-	struct isl_ctx *ctx;
-	unsigned dim;
-
-	if (!vec || !tab)
-		return NULL;
-	ctx = vec->ctx;
-	isl_assert(ctx, vec->size != 0, goto error);
-
-	bset = isl_basic_set_alloc(ctx, 0, vec->size - 1, 0, vec->size - 1, 0);
-	if (!bset)
-		goto error;
-	dim = isl_basic_set_n_dim(bset) - tab->n_unbounded;
-	for (i = 0; i < dim; ++i) {
-		k = isl_basic_set_alloc_equality(bset);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(bset->eq[k] + 1, tab->basis->row[1 + i] + 1,
-			    vec->size - 1);
-		isl_seq_inner_product(bset->eq[k] + 1, vec->el +1,
-				      vec->size - 1, &bset->eq[k][0]);
-		isl_int_neg(bset->eq[k][0], bset->eq[k][0]);
-	}
-	bset->sample = vec;
-	bset = isl_basic_set_gauss(bset, NULL);
-
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	isl_vec_free(vec);
-	return NULL;
-}
-
-/* Given a tableau of a set and a tableau of the corresponding
- * recession cone, detect and add all equalities to the tableau.
- * If the tableau is bounded, then we can simply keep the
- * tableau in its state after the return from extend_affine_hull.
- * However, if the tableau is unbounded, then
- * isl_tab_set_initial_basis_with_cone will add some additional
- * constraints to the tableau that have to be removed again.
- * In this case, we therefore rollback to the state before
- * any constraints were added and then add the equalities back in.
- */
-struct isl_tab *isl_tab_detect_equalities(struct isl_tab *tab,
-	struct isl_tab *tab_cone)
-{
-	int j;
-	struct isl_vec *sample;
-	struct isl_basic_set *hull;
-	struct isl_tab_undo *snap;
-
-	if (!tab || !tab_cone)
-		goto error;
-
-	snap = isl_tab_snap(tab);
-
-	isl_mat_free(tab->basis);
-	tab->basis = NULL;
-
-	isl_assert(tab->mat->ctx, tab->bmap, goto error);
-	isl_assert(tab->mat->ctx, tab->samples, goto error);
-	isl_assert(tab->mat->ctx, tab->samples->n_col == 1 + tab->n_var, goto error);
-	isl_assert(tab->mat->ctx, tab->n_sample > tab->n_outside, goto error);
-
-	if (isl_tab_set_initial_basis_with_cone(tab, tab_cone) < 0)
-		goto error;
-
-	sample = isl_vec_alloc(tab->mat->ctx, 1 + tab->n_var);
-	if (!sample)
-		goto error;
-
-	isl_seq_cpy(sample->el, tab->samples->row[tab->n_outside], sample->size);
-
-	isl_vec_free(tab->bmap->sample);
-	tab->bmap->sample = isl_vec_copy(sample);
-
-	if (tab->n_unbounded == 0)
-		hull = isl_basic_set_from_vec(isl_vec_copy(sample));
-	else
-		hull = initial_hull(tab, isl_vec_copy(sample));
-
-	for (j = tab->n_outside + 1; j < tab->n_sample; ++j) {
-		isl_seq_cpy(sample->el, tab->samples->row[j], sample->size);
-		hull = affine_hull(hull,
-				isl_basic_set_from_vec(isl_vec_copy(sample)));
-	}
-
-	isl_vec_free(sample);
-
-	hull = extend_affine_hull(tab, hull);
-	if (!hull)
-		goto error;
-
-	if (tab->n_unbounded == 0) {
-		isl_basic_set_free(hull);
-		return tab;
-	}
-
-	if (isl_tab_rollback(tab, snap) < 0)
-		goto error;
-
-	if (hull->n_eq > tab->n_zero) {
-		for (j = 0; j < hull->n_eq; ++j) {
-			isl_seq_normalize(tab->mat->ctx, hull->eq[j], 1 + tab->n_var);
-			if (isl_tab_add_eq(tab, hull->eq[j]) < 0)
-				goto error;
-		}
-	}
-
-	isl_basic_set_free(hull);
-
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-/* Compute the affine hull of "bset", where "cone" is the recession cone
- * of "bset".
- *
- * We first compute a unimodular transformation that puts the unbounded
- * directions in the last dimensions.  In particular, we take a transformation
- * that maps all equalities to equalities (in HNF) on the first dimensions.
- * Let x be the original dimensions and y the transformed, with y_1 bounded
- * and y_2 unbounded.
- *
- *	       [ y_1 ]			[ y_1 ]   [ Q_1 ]
- *	x = U  [ y_2 ]			[ y_2 ] = [ Q_2 ] x
- *
- * Let's call the input basic set S.  We compute S' = preimage(S, U)
- * and drop the final dimensions including any constraints involving them.
- * This results in set S''.
- * Then we compute the affine hull A'' of S''.
- * Let F y_1 >= g be the constraint system of A''.  In the transformed
- * space the y_2 are unbounded, so we can add them back without any constraints,
- * resulting in
- *
- *		        [ y_1 ]
- *		[ F 0 ] [ y_2 ] >= g
- * or
- *		        [ Q_1 ]
- *		[ F 0 ] [ Q_2 ] x >= g
- * or
- *		F Q_1 x >= g
- *
- * The affine hull in the original space is then obtained as
- * A = preimage(A'', Q_1).
- */
-static struct isl_basic_set *affine_hull_with_cone(struct isl_basic_set *bset,
-	struct isl_basic_set *cone)
-{
-	unsigned total;
-	unsigned cone_dim;
-	struct isl_basic_set *hull;
-	struct isl_mat *M, *U, *Q;
-
-	if (!bset || !cone)
-		goto error;
-
-	total = isl_basic_set_total_dim(cone);
-	cone_dim = total - cone->n_eq;
-
-	M = isl_mat_sub_alloc6(bset->ctx, cone->eq, 0, cone->n_eq, 1, total);
-	M = isl_mat_left_hermite(M, 0, &U, &Q);
-	if (!M)
-		goto error;
-	isl_mat_free(M);
-
-	U = isl_mat_lin_to_aff(U);
-	bset = isl_basic_set_preimage(bset, isl_mat_copy(U));
-
-	bset = isl_basic_set_drop_constraints_involving(bset, total - cone_dim,
-							cone_dim);
-	bset = isl_basic_set_drop_dims(bset, total - cone_dim, cone_dim);
-
-	Q = isl_mat_lin_to_aff(Q);
-	Q = isl_mat_drop_rows(Q, 1 + total - cone_dim, cone_dim);
-
-	if (bset && bset->sample && bset->sample->size == 1 + total)
-		bset->sample = isl_mat_vec_product(isl_mat_copy(Q), bset->sample);
-
-	hull = uset_affine_hull_bounded(bset);
-
-	if (!hull)
-		isl_mat_free(U);
-	else {
-		struct isl_vec *sample = isl_vec_copy(hull->sample);
-		U = isl_mat_drop_cols(U, 1 + total - cone_dim, cone_dim);
-		if (sample && sample->size > 0)
-			sample = isl_mat_vec_product(U, sample);
-		else
-			isl_mat_free(U);
-		hull = isl_basic_set_preimage(hull, Q);
-		if (hull) {
-			isl_vec_free(hull->sample);
-			hull->sample = sample;
-		} else
-			isl_vec_free(sample);
-	}
-
-	isl_basic_set_free(cone);
-
-	return hull;
-error:
-	isl_basic_set_free(bset);
-	isl_basic_set_free(cone);
-	return NULL;
-}
-
-/* Look for all equalities satisfied by the integer points in bset,
- * which is assumed not to have any explicit equalities.
- *
- * The equalities are obtained by successively looking for
- * a point that is affinely independent of the points found so far.
- * In particular, for each equality satisfied by the points so far,
- * we check if there is any point on a hyperplane parallel to the
- * corresponding hyperplane shifted by at least one (in either direction).
- *
- * Before looking for any outside points, we first compute the recession
- * cone.  The directions of this recession cone will always be part
- * of the affine hull, so there is no need for looking for any points
- * in these directions.
- * In particular, if the recession cone is full-dimensional, then
- * the affine hull is simply the whole universe.
- */
-static struct isl_basic_set *uset_affine_hull(struct isl_basic_set *bset)
-{
-	struct isl_basic_set *cone;
-
-	if (isl_basic_set_plain_is_empty(bset))
-		return bset;
-
-	cone = isl_basic_set_recession_cone(isl_basic_set_copy(bset));
-	if (!cone)
-		goto error;
-	if (cone->n_eq == 0) {
-		struct isl_basic_set *hull;
-		isl_basic_set_free(cone);
-		hull = isl_basic_set_universe_like(bset);
-		isl_basic_set_free(bset);
-		return hull;
-	}
-
-	if (cone->n_eq < isl_basic_set_total_dim(cone))
-		return affine_hull_with_cone(bset, cone);
-
-	isl_basic_set_free(cone);
-	return uset_affine_hull_bounded(bset);
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Look for all equalities satisfied by the integer points in bmap
- * that are independent of the equalities already explicitly available
- * in bmap.
- *
- * We first remove all equalities already explicitly available,
- * then look for additional equalities in the reduced space
- * and then transform the result to the original space.
- * The original equalities are _not_ added to this set.  This is
- * the responsibility of the calling function.
- * The resulting basic set has all meaning about the dimensions removed.
- * In particular, dimensions that correspond to existential variables
- * in bmap and that are found to be fixed are not removed.
- */
-static struct isl_basic_set *equalities_in_underlying_set(
-						struct isl_basic_map *bmap)
-{
-	struct isl_mat *T1 = NULL;
-	struct isl_mat *T2 = NULL;
-	struct isl_basic_set *bset = NULL;
-	struct isl_basic_set *hull = NULL;
-
-	bset = isl_basic_map_underlying_set(bmap);
-	if (!bset)
-		return NULL;
-	if (bset->n_eq)
-		bset = isl_basic_set_remove_equalities(bset, &T1, &T2);
-	if (!bset)
-		goto error;
-
-	hull = uset_affine_hull(bset);
-	if (!T2)
-		return hull;
-
-	if (!hull) {
-		isl_mat_free(T1);
-		isl_mat_free(T2);
-	} else {
-		struct isl_vec *sample = isl_vec_copy(hull->sample);
-		if (sample && sample->size > 0)
-			sample = isl_mat_vec_product(T1, sample);
-		else
-			isl_mat_free(T1);
-		hull = isl_basic_set_preimage(hull, T2);
-		if (hull) {
-			isl_vec_free(hull->sample);
-			hull->sample = sample;
-		} else
-			isl_vec_free(sample);
-	}
-
-	return hull;
-error:
-	isl_mat_free(T2);
-	isl_basic_set_free(bset);
-	isl_basic_set_free(hull);
-	return NULL;
-}
-
-/* Detect and make explicit all equalities satisfied by the (integer)
- * points in bmap.
- */
-struct isl_basic_map *isl_basic_map_detect_equalities(
-						struct isl_basic_map *bmap)
-{
-	int i, j;
-	struct isl_basic_set *hull = NULL;
-
-	if (!bmap)
-		return NULL;
-	if (bmap->n_ineq == 0)
-		return bmap;
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY))
-		return bmap;
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_ALL_EQUALITIES))
-		return bmap;
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL))
-		return isl_basic_map_implicit_equalities(bmap);
-
-	hull = equalities_in_underlying_set(isl_basic_map_copy(bmap));
-	if (!hull)
-		goto error;
-	if (ISL_F_ISSET(hull, ISL_BASIC_SET_EMPTY)) {
-		isl_basic_set_free(hull);
-		return isl_basic_map_set_to_empty(bmap);
-	}
-	bmap = isl_basic_map_extend_dim(bmap, isl_dim_copy(bmap->dim), 0,
-					hull->n_eq, 0);
-	for (i = 0; i < hull->n_eq; ++i) {
-		j = isl_basic_map_alloc_equality(bmap);
-		if (j < 0)
-			goto error;
-		isl_seq_cpy(bmap->eq[j], hull->eq[i],
-				1 + isl_basic_set_total_dim(hull));
-	}
-	isl_vec_free(bmap->sample);
-	bmap->sample = isl_vec_copy(hull->sample);
-	isl_basic_set_free(hull);
-	ISL_F_SET(bmap, ISL_BASIC_MAP_NO_IMPLICIT | ISL_BASIC_MAP_ALL_EQUALITIES);
-	bmap = isl_basic_map_simplify(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_set_free(hull);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_detect_equalities(
-						__isl_take isl_basic_set *bset)
-{
-	return (isl_basic_set *)
-		isl_basic_map_detect_equalities((isl_basic_map *)bset);
-}
-
-__isl_give isl_map *isl_map_inline_foreach_basic_map(__isl_take isl_map *map,
-	__isl_give isl_basic_map *(*fn)(__isl_take isl_basic_map *bmap))
-{
-	struct isl_basic_map *bmap;
-	int i;
-
-	if (!map)
-		return NULL;
-
-	for (i = 0; i < map->n; ++i) {
-		bmap = isl_basic_map_copy(map->p[i]);
-		bmap = fn(bmap);
-		if (!bmap)
-			goto error;
-		isl_basic_map_free(map->p[i]);
-		map->p[i] = bmap;
-	}
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_detect_equalities(__isl_take isl_map *map)
-{
-	return isl_map_inline_foreach_basic_map(map,
-					    &isl_basic_map_detect_equalities);
-}
-
-__isl_give isl_set *isl_set_detect_equalities(__isl_take isl_set *set)
-{
-	return (isl_set *)isl_map_detect_equalities((isl_map *)set);
-}
-
-/* After computing the rational affine hull (by detecting the implicit
- * equalities), we compute the additional equalities satisfied by
- * the integer points (if any) and add the original equalities back in.
- */
-struct isl_basic_map *isl_basic_map_affine_hull(struct isl_basic_map *bmap)
-{
-	bmap = isl_basic_map_detect_equalities(bmap);
-	bmap = isl_basic_map_cow(bmap);
-	if (bmap)
-		isl_basic_map_free_inequality(bmap, bmap->n_ineq);
-	bmap = isl_basic_map_finalize(bmap);
-	return bmap;
-}
-
-struct isl_basic_set *isl_basic_set_affine_hull(struct isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_affine_hull((struct isl_basic_map *)bset);
-}
-
-struct isl_basic_map *isl_map_affine_hull(struct isl_map *map)
-{
-	int i;
-	struct isl_basic_map *model = NULL;
-	struct isl_basic_map *hull = NULL;
-	struct isl_set *set;
-
-	map = isl_map_detect_equalities(map);
-	map = isl_map_align_divs(map);
-
-	if (!map)
-		return NULL;
-
-	if (map->n == 0) {
-		hull = isl_basic_map_empty_like_map(map);
-		isl_map_free(map);
-		return hull;
-	}
-
-	model = isl_basic_map_copy(map->p[0]);
-	set = isl_map_underlying_set(map);
-	set = isl_set_cow(set);
-	if (!set)
-		goto error;
-
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_basic_set_cow(set->p[i]);
-		set->p[i] = isl_basic_set_affine_hull(set->p[i]);
-		set->p[i] = isl_basic_set_gauss(set->p[i], NULL);
-		if (!set->p[i])
-			goto error;
-	}
-	set = isl_set_remove_empty_parts(set);
-	if (set->n == 0) {
-		hull = isl_basic_map_empty_like(model);
-		isl_basic_map_free(model);
-	} else {
-		struct isl_basic_set *bset;
-		while (set->n > 1) {
-			set->p[0] = affine_hull(set->p[0], set->p[--set->n]);
-			if (!set->p[0])
-				goto error;
-		}
-		bset = isl_basic_set_copy(set->p[0]);
-		hull = isl_basic_map_overlying_set(bset, model);
-	}
-	isl_set_free(set);
-	hull = isl_basic_map_simplify(hull);
-	return isl_basic_map_finalize(hull);
-error:
-	isl_basic_map_free(model);
-	isl_set_free(set);
-	return NULL;
-}
-
-struct isl_basic_set *isl_set_affine_hull(struct isl_set *set)
-{
-	return (struct isl_basic_set *)
-		isl_map_affine_hull((struct isl_map *)set);
-}
diff --git a/cloog-0.16.3/isl/isl_arg.c b/cloog-0.16.3/isl/isl_arg.c
deleted file mode 100644
index f470478..0000000
--- a/cloog-0.16.3/isl/isl_arg.c
+++ /dev/null
@@ -1,1110 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <isl/arg.h>
-#include <isl/ctx.h>
-
-static struct isl_arg help_arg[] = {
-ISL_ARG_PHANTOM_BOOL('h', "help", NULL, "print this help, then exit")
-ISL_ARG_END
-};
-
-static void set_default_choice(struct isl_arg *arg, void *opt)
-{
-	*(unsigned *)(((char *)opt) + arg->offset) = arg->u.choice.default_value;
-}
-
-static void set_default_flags(struct isl_arg *arg, void *opt)
-{
-	*(unsigned *)(((char *)opt) + arg->offset) = arg->u.flags.default_value;
-}
-
-static void set_default_bool(struct isl_arg *arg, void *opt)
-{
-	if (arg->offset == (size_t) -1)
-		return;
-	*(unsigned *)(((char *)opt) + arg->offset) = arg->u.b.default_value;
-}
-
-static void set_default_child(struct isl_arg *arg, void *opt)
-{
-	void *child;
-
-	if (arg->offset == (size_t) -1)
-		child = opt;
-	else {
-		child = calloc(1, arg->u.child.size);
-		*(void **)(((char *)opt) + arg->offset) = child;
-	}
-
-	if (child)
-		isl_arg_set_defaults(arg->u.child.child, child);
-}
-
-static void set_default_user(struct isl_arg *arg, void *opt)
-{
-	arg->u.user.init(((char *)opt) + arg->offset);
-}
-
-static void set_default_int(struct isl_arg *arg, void *opt)
-{
-	*(int *)(((char *)opt) + arg->offset) = arg->u.i.default_value;
-}
-
-static void set_default_long(struct isl_arg *arg, void *opt)
-{
-	*(long *)(((char *)opt) + arg->offset) = arg->u.l.default_value;
-}
-
-static void set_default_ulong(struct isl_arg *arg, void *opt)
-{
-	*(unsigned long *)(((char *)opt) + arg->offset) = arg->u.ul.default_value;
-}
-
-static void set_default_str(struct isl_arg *arg, void *opt)
-{
-	const char *str = NULL;
-	if (arg->u.str.default_value)
-		str = strdup(arg->u.str.default_value);
-	*(const char **)(((char *)opt) + arg->offset) = str;
-}
-
-void isl_arg_set_defaults(struct isl_arg *arg, void *opt)
-{
-	int i;
-
-	for (i = 0; arg[i].type != isl_arg_end; ++i) {
-		switch (arg[i].type) {
-		case isl_arg_choice:
-			set_default_choice(&arg[i], opt);
-			break;
-		case isl_arg_flags:
-			set_default_flags(&arg[i], opt);
-			break;
-		case isl_arg_bool:
-			set_default_bool(&arg[i], opt);
-			break;
-		case isl_arg_child:
-			set_default_child(&arg[i], opt);
-			break;
-		case isl_arg_user:
-			set_default_user(&arg[i], opt);
-			break;
-		case isl_arg_int:
-			set_default_int(&arg[i], opt);
-			break;
-		case isl_arg_long:
-			set_default_long(&arg[i], opt);
-			break;
-		case isl_arg_ulong:
-			set_default_ulong(&arg[i], opt);
-			break;
-		case isl_arg_arg:
-		case isl_arg_str:
-			set_default_str(&arg[i], opt);
-			break;
-		case isl_arg_alias:
-		case isl_arg_footer:
-		case isl_arg_version:
-		case isl_arg_end:
-			break;
-		}
-	}
-}
-
-static void free_args(struct isl_arg *arg, void *opt)
-{
-	int i;
-
-	for (i = 0; arg[i].type != isl_arg_end; ++i) {
-		switch (arg[i].type) {
-		case isl_arg_child:
-			if (arg[i].offset == (size_t) -1)
-				free_args(arg[i].u.child.child, opt);
-			else
-				isl_arg_free(arg[i].u.child.child,
-				    *(void **)(((char *)opt) + arg[i].offset));
-			break;
-		case isl_arg_arg:
-		case isl_arg_str:
-			free(*(char **)(((char *)opt) + arg[i].offset));
-			break;
-		case isl_arg_user:
-			if (arg[i].u.user.clear)
-				arg[i].u.user.clear(((char *)opt) + arg[i].offset);
-			break;
-		case isl_arg_alias:
-		case isl_arg_bool:
-		case isl_arg_choice:
-		case isl_arg_flags:
-		case isl_arg_int:
-		case isl_arg_long:
-		case isl_arg_ulong:
-		case isl_arg_version:
-		case isl_arg_footer:
-		case isl_arg_end:
-			break;
-		}
-	}
-}
-
-void isl_arg_free(struct isl_arg *arg, void *opt)
-{
-	if (!opt)
-		return;
-
-	free_args(arg, opt);
-
-	free(opt);
-}
-
-static int print_arg_help(struct isl_arg *decl, const char *prefix, int no)
-{
-	int len = 0;
-
-	if (!decl->long_name) {
-		printf("  -%c", decl->short_name);
-		return 4;
-	}
-
-	if (decl->short_name) {
-		printf("  -%c, --", decl->short_name);
-		len += 8;
-	} else if (decl->flags & ISL_ARG_SINGLE_DASH) {
-		printf("  -");
-		len += 3;
-	} else {
-		printf("      --");
-		len += 8;
-	}
-
-	if (prefix) {
-		printf("%s-", prefix);
-		len += strlen(prefix) + 1;
-	}
-	if (no) {
-		printf("no-");
-		len += 3;
-	}
-	printf("%s", decl->long_name);
-	len += strlen(decl->long_name);
-
-	while ((++decl)->type == isl_arg_alias) {
-		printf(", --");
-		len += 4;
-		if (no) {
-			printf("no-");
-			len += 3;
-		}
-		printf("%s", decl->long_name);
-		len += strlen(decl->long_name);
-	}
-
-	return len;
-}
-
-const void *isl_memrchr(const void *s, int c, size_t n)
-{
-	const char *p = s;
-	while (n-- > 0)
-		if (p[n] == c)
-			return p + n;
-	return NULL;
-}
-
-static int wrap_msg(const char *s, int indent, int pos)
-{
-	int len;
-	int wrap_len = 75 - indent;
-
-	if (pos + 1 >= indent)
-		printf("\n%*s", indent, "");
-	else
-		printf("%*s", indent - pos, "");
-
-	len = strlen(s);
-	while (len > wrap_len) {
-		const char *space = isl_memrchr(s, ' ', wrap_len);
-		int l;
-
-		if (!space)
-			space = strchr(s + wrap_len, ' ');
-		if (!space)
-			break;
-		l = space - s;
-		printf("%.*s", l, s);
-		s = space + 1;
-		len -= l + 1;
-		printf("\n%*s", indent, "");
-	}
-
-	printf("%s", s);
-	return len;
-}
-
-static int print_help_msg(struct isl_arg *decl, int pos)
-{
-	if (!decl->help_msg)
-		return pos;
-
-	return wrap_msg(decl->help_msg, 30, pos);
-}
-
-static void print_default(struct isl_arg *decl, const char *def, int pos)
-{
-	const char *default_prefix = "[default: ";
-	const char *default_suffix = "]";
-	int len;
-
-	len = strlen(default_prefix) + strlen(def) + strlen(default_suffix);
-
-	if (!decl->help_msg) {
-		if (pos >= 29)
-			printf("\n%30s", "");
-		else
-			printf("%*s", 30 - pos, "");
-		pos = 0;
-	} else {
-		if (pos + len >= 48)
-			printf("\n%30s", "");
-		else
-			printf(" ");
-	}
-	printf("%s%s%s", default_prefix, def, default_suffix);
-}
-
-static void print_default_choice(struct isl_arg *decl, int pos)
-{
-	int i;
-	const char *s = "none";
-
-	for (i = 0; decl->u.choice.choice[i].name; ++i)
-		if (decl->u.choice.choice[i].value == decl->u.choice.default_value) {
-			s = decl->u.choice.choice[i].name;
-			break;
-		}
-
-	print_default(decl, s, pos);
-}
-
-static void print_choice_help(struct isl_arg *decl, const char *prefix)
-{
-	int i;
-	int pos;
-
-	pos = print_arg_help(decl, prefix, 0);
-	printf("=");
-	pos++;
-
-	for (i = 0; decl->u.choice.choice[i].name; ++i) {
-		if (i) {
-			printf("|");
-			pos++;
-		}
-		printf("%s", decl->u.choice.choice[i].name);
-		pos += strlen(decl->u.choice.choice[i].name);
-	}
-
-	pos = print_help_msg(decl, pos);
-	print_default_choice(decl, pos);
-
-	printf("\n");
-}
-
-static void print_default_flags(struct isl_arg *decl, int pos)
-{
-	int i, first;
-	const char *default_prefix = "[default: ";
-	const char *default_suffix = "]";
-	int len = strlen(default_prefix) + strlen(default_suffix);
-
-	for (i = 0; decl->u.flags.flags[i].name; ++i)
-		if ((decl->u.flags.default_value & decl->u.flags.flags[i].mask) ==
-		     decl->u.flags.flags[i].value)
-			len += strlen(decl->u.flags.flags[i].name);
-
-	if (!decl->help_msg) {
-		if (pos >= 29)
-			printf("\n%30s", "");
-		else
-			printf("%*s", 30 - pos, "");
-		pos = 0;
-	} else {
-		if (pos + len >= 48)
-			printf("\n%30s", "");
-		else
-			printf(" ");
-	}
-	printf("%s", default_prefix);
-
-	for (first = 1, i = 0; decl->u.flags.flags[i].name; ++i)
-		if ((decl->u.flags.default_value & decl->u.flags.flags[i].mask) ==
-		     decl->u.flags.flags[i].value) {
-			if (!first)
-				printf(",");
-			printf("%s", decl->u.flags.flags[i].name);
-			first = 0;
-		}
-
-	printf("%s", default_suffix);
-}
-
-static void print_flags_help(struct isl_arg *decl, const char *prefix)
-{
-	int i, j;
-	int pos;
-
-	pos = print_arg_help(decl, prefix, 0);
-	printf("=");
-	pos++;
-
-	for (i = 0; decl->u.flags.flags[i].name; ++i) {
-		if (i) {
-			printf(",");
-			pos++;
-		}
-		for (j = i;
-		     decl->u.flags.flags[j].mask == decl->u.flags.flags[i].mask;
-		     ++j) {
-			if (j != i) {
-				printf("|");
-				pos++;
-			}
-			printf("%s", decl->u.flags.flags[j].name);
-			pos += strlen(decl->u.flags.flags[j].name);
-		}
-		i = j - 1;
-	}
-
-	pos = print_help_msg(decl, pos);
-	print_default_flags(decl, pos);
-
-	printf("\n");
-}
-
-static void print_bool_help(struct isl_arg *decl, const char *prefix)
-{
-	int pos;
-	int no = decl->u.b.default_value == 1;
-	pos = print_arg_help(decl, prefix, no);
-	pos = print_help_msg(decl, pos);
-	if (decl->offset != (size_t) -1)
-		print_default(decl, no ? "yes" : "no", pos);
-	printf("\n");
-}
-
-static int print_argument_name(struct isl_arg *decl, const char *name, int pos)
-{
-	printf("%c<%s>", decl->long_name ? '=' : ' ', name);
-	return pos + 3 + strlen(name);
-}
-
-static void print_int_help(struct isl_arg *decl, const char *prefix)
-{
-	int pos;
-	char val[20];
-	pos = print_arg_help(decl, prefix, 0);
-	pos = print_argument_name(decl, decl->argument_name, pos);
-	pos = print_help_msg(decl, pos);
-	snprintf(val, sizeof(val), "%d", decl->u.i.default_value);
-	print_default(decl, val, pos);
-	printf("\n");
-}
-
-static void print_long_help(struct isl_arg *decl, const char *prefix)
-{
-	int pos;
-	pos = print_arg_help(decl, prefix, 0);
-	if (decl->u.l.default_value != decl->u.l.default_selected) {
-		printf("[");
-		pos++;
-	}
-	printf("=long");
-	pos += 5;
-	if (decl->u.l.default_value != decl->u.l.default_selected) {
-		printf("]");
-		pos++;
-	}
-	print_help_msg(decl, pos);
-	printf("\n");
-}
-
-static void print_ulong_help(struct isl_arg *decl, const char *prefix)
-{
-	int pos;
-	pos = print_arg_help(decl, prefix, 0);
-	printf("=ulong");
-	pos += 6;
-	print_help_msg(decl, pos);
-	printf("\n");
-}
-
-static void print_str_help(struct isl_arg *decl, const char *prefix)
-{
-	int pos;
-	const char *a = decl->argument_name ? decl->argument_name : "string";
-	pos = print_arg_help(decl, prefix, 0);
-	pos = print_argument_name(decl, a, pos);
-	pos = print_help_msg(decl, pos);
-	if (decl->u.str.default_value)
-		print_default(decl, decl->u.str.default_value, pos);
-	printf("\n");
-}
-
-static void print_help(struct isl_arg *arg, const char *prefix)
-{
-	int i;
-	int any = 0;
-
-	for (i = 0; arg[i].type != isl_arg_end; ++i) {
-		if (arg[i].flags & ISL_ARG_HIDDEN)
-			continue;
-		switch (arg[i].type) {
-		case isl_arg_flags:
-			print_flags_help(&arg[i], prefix);
-			any = 1;
-			break;
-		case isl_arg_choice:
-			print_choice_help(&arg[i], prefix);
-			any = 1;
-			break;
-		case isl_arg_bool:
-			print_bool_help(&arg[i], prefix);
-			any = 1;
-			break;
-		case isl_arg_int:
-			print_int_help(&arg[i], prefix);
-			any = 1;
-			break;
-		case isl_arg_long:
-			print_long_help(&arg[i], prefix);
-			any = 1;
-			break;
-		case isl_arg_ulong:
-			print_ulong_help(&arg[i], prefix);
-			any = 1;
-			break;
-		case isl_arg_str:
-			print_str_help(&arg[i], prefix);
-			any = 1;
-			break;
-		case isl_arg_alias:
-		case isl_arg_version:
-		case isl_arg_arg:
-		case isl_arg_footer:
-		case isl_arg_child:
-		case isl_arg_user:
-		case isl_arg_end:
-			break;
-		}
-	}
-
-	for (i = 0; arg[i].type != isl_arg_end; ++i) {
-		if (arg[i].type != isl_arg_child)
-			continue;
-		if (arg[i].flags & ISL_ARG_HIDDEN)
-			continue;
-
-		if (any)
-			printf("\n");
-		if (arg[i].help_msg)
-			printf(" %s\n", arg[i].help_msg);
-		print_help(arg[i].u.child.child, arg[i].long_name);
-		any = 1;
-	}
-}
-
-static const char *prog_name(const char *prog)
-{
-	const char *slash;
-
-	slash = strrchr(prog, '/');
-	if (slash)
-		prog = slash + 1;
-	if (strncmp(prog, "lt-", 3) == 0)
-		prog += 3;
-
-	return prog;
-}
-
-static int any_version(struct isl_arg *decl)
-{
-	int i;
-
-	for (i = 0; decl[i].type != isl_arg_end; ++i) {
-		switch (decl[i].type) {
-		case isl_arg_version:
-			return 1;
-		case isl_arg_child:
-			if (any_version(decl[i].u.child.child))
-				return 1;
-			break;
-		default:
-			break;
-		}
-	}
-
-	return 0;
-}
-
-static void print_help_and_exit(struct isl_arg *arg, const char *prog)
-{
-	int i;
-
-	printf("Usage: %s [OPTION...]", prog_name(prog));
-
-	for (i = 0; arg[i].type != isl_arg_end; ++i)
-		if (arg[i].type == isl_arg_arg)
-			printf(" %s", arg[i].argument_name);
-
-	printf("\n\n");
-
-	print_help(arg, NULL);
-	printf("\n");
-	if (any_version(arg))
-		printf("  -V, --version\n");
-	print_bool_help(help_arg, NULL);
-
-	for (i = 0; arg[i].type != isl_arg_end; ++i) {
-		if (arg[i].type != isl_arg_footer)
-			continue;
-		wrap_msg(arg[i].help_msg, 0, 0);
-		printf("\n");
-	}
-
-	exit(0);
-}
-
-static int match_long_name(struct isl_arg *decl,
-	const char *start, const char *end)
-{
-	do {
-		if (end - start == strlen(decl->long_name) &&
-		    !strncmp(start, decl->long_name, end - start))
-			return 1;
-	} while ((++decl)->type == isl_arg_alias);
-
-	return 0;
-}
-
-static const char *skip_dash_dash(struct isl_arg *decl, const char *arg)
-{
-	if (!strncmp(arg, "--", 2))
-		return arg + 2;
-	if ((decl->flags & ISL_ARG_SINGLE_DASH) && arg[0] == '-')
-		return arg + 1;
-	return NULL;
-}
-
-static const char *skip_name(struct isl_arg *decl, const char *arg,
-	const char *prefix, int need_argument, int *has_argument)
-{
-	const char *equal;
-	const char *name;
-	const char *end;
-
-	if (arg[0] == '-' && arg[1] && arg[1] == decl->short_name) {
-		if (need_argument && !arg[2])
-			return NULL;
-		if (has_argument)
-			*has_argument = arg[2] != '\0';
-		return arg + 2;
-	}
-	if (!decl->long_name)
-		return NULL;
-
-	name = skip_dash_dash(decl, arg);
-	if (!name)
-		return NULL;
-
-	equal = strchr(name, '=');
-	if (need_argument && !equal)
-		return NULL;
-
-	if (has_argument)
-		*has_argument = !!equal;
-	end = equal ? equal : name + strlen(name);
-
-	if (prefix) {
-		size_t prefix_len = strlen(prefix);
-		if (strncmp(name, prefix, prefix_len) == 0 &&
-		    name[prefix_len] == '-')
-			name += prefix_len + 1;
-	}
-
-	if (!match_long_name(decl, name, end))
-		return NULL;
-
-	return equal ? equal + 1 : end;
-}
-
-static int parse_choice_option(struct isl_arg *decl, char **arg,
-	const char *prefix, void *opt)
-{
-	int i;
-	int has_argument;
-	const char *choice;
-
-	choice = skip_name(decl, arg[0], prefix, 0, &has_argument);
-	if (!choice)
-		return 0;
-
-	if (!has_argument && (!arg[1] || arg[1][0] == '-')) {
-		unsigned u = decl->u.choice.default_selected;
-		if (decl->u.choice.set)
-			decl->u.choice.set(opt, u);
-		else
-			*(unsigned *)(((char *)opt) + decl->offset) = u;
-
-		return 1;
-	}
-
-	if (!has_argument)
-		choice = arg[1];
-
-	for (i = 0; decl->u.choice.choice[i].name; ++i) {
-		unsigned u;
-
-		if (strcmp(choice, decl->u.choice.choice[i].name))
-			continue;
-
-		u = decl->u.choice.choice[i].value;
-		if (decl->u.choice.set)
-			decl->u.choice.set(opt, u);
-		else
-			*(unsigned *)(((char *)opt) + decl->offset) = u;
-
-		return has_argument ? 1 : 2;
-	}
-
-	return 0;
-}
-
-static int set_flag(struct isl_arg *decl, unsigned *val, const char *flag,
-	size_t len)
-{
-	int i;
-
-	for (i = 0; decl->u.flags.flags[i].name; ++i) {
-		if (strncmp(flag, decl->u.flags.flags[i].name, len))
-			continue;
-
-		*val &= ~decl->u.flags.flags[i].mask;
-		*val |= decl->u.flags.flags[i].value;
-
-		return 1;
-	}
-
-	return 0;
-}
-
-static int parse_flags_option(struct isl_arg *decl, char **arg,
-	const char *prefix, void *opt)
-{
-	int has_argument;
-	const char *flags;
-	const char *comma;
-	unsigned val;
-
-	flags = skip_name(decl, arg[0], prefix, 0, &has_argument);
-	if (!flags)
-		return 0;
-
-	if (!has_argument && !arg[1])
-		return 0;
-
-	if (!has_argument)
-		flags = arg[1];
-
-	val = *(unsigned *)(((char *)opt) + decl->offset);
-
-	while ((comma = strchr(flags, ',')) != NULL) {
-		if (!set_flag(decl, &val, flags, comma - flags))
-			return 0;
-		flags = comma + 1;
-	}
-	if (!set_flag(decl, &val, flags, strlen(flags)))
-		return 0;
-
-	*(unsigned *)(((char *)opt) + decl->offset) = val;
-
-	return has_argument ? 1 : 2;
-}
-
-static int parse_bool_option(struct isl_arg *decl, char **arg,
-	const char *prefix, void *opt)
-{
-	const char *name;
-	unsigned *p = (unsigned *)(((char *)opt) + decl->offset);
-
-	if (skip_name(decl, arg[0], prefix, 0, NULL)) {
-		if ((decl->flags & ISL_ARG_BOOL_ARG) && arg[1]) {
-			char *endptr;
-			int val = strtol(arg[1], &endptr, 0);
-			if (*endptr == '\0' && (val == 0 || val == 1)) {
-				if (decl->u.b.set)
-					decl->u.b.set(opt, val);
-				else if (decl->offset != (size_t) -1)
-					*p = val;
-				return 2;
-			}
-		}
-		if (decl->u.b.set)
-			decl->u.b.set(opt, 1);
-		else if (decl->offset != (size_t) -1)
-			*p = 1;
-
-		return 1;
-	}
-
-	if (!decl->long_name)
-		return 0;
-
-	name = skip_dash_dash(decl, arg[0]);
-	if (!name)
-		return 0;
-
-	if (prefix) {
-		size_t prefix_len = strlen(prefix);
-		if (strncmp(name, prefix, prefix_len) == 0 &&
-		    name[prefix_len] == '-') {
-			name += prefix_len + 1;
-			prefix = NULL;
-		}
-	}
-
-	if (strncmp(name, "no-", 3))
-		return 0;
-	name += 3;
-
-	if (prefix) {
-		size_t prefix_len = strlen(prefix);
-		if (strncmp(name, prefix, prefix_len) == 0 &&
-		    name[prefix_len] == '-')
-			name += prefix_len + 1;
-	}
-
-	if (match_long_name(decl, name, name + strlen(name))) {
-		if (decl->u.b.set)
-			decl->u.b.set(opt, 0);
-		else if (decl->offset != (size_t) -1)
-			*p = 0;
-
-		return 1;
-	}
-
-	return 0;
-}
-
-static int parse_str_option(struct isl_arg *decl, char **arg,
-	const char *prefix, void *opt)
-{
-	int has_argument;
-	const char *s;
-	char **p = (char **)(((char *)opt) + decl->offset);
-
-	s = skip_name(decl, arg[0], prefix, 0, &has_argument);
-	if (!s)
-		return 0;
-
-	if (has_argument) {
-		free(*p);
-		*p = strdup(s);
-		return 1;
-	}
-
-	if (arg[1]) {
-		free(*p);
-		*p = strdup(arg[1]);
-		return 2;
-	}
-
-	return 0;
-}
-
-static int parse_int_option(struct isl_arg *decl, char **arg,
-	const char *prefix, void *opt)
-{
-	int has_argument;
-	const char *val;
-	char *endptr;
-	int *p = (int *)(((char *)opt) + decl->offset);
-
-	val = skip_name(decl, arg[0], prefix, 0, &has_argument);
-	if (!val)
-		return 0;
-
-	if (has_argument) {
-		*p = atoi(val);
-		return 1;
-	}
-
-	if (arg[1]) {
-		int i = strtol(arg[1], &endptr, 0);
-		if (*endptr == '\0') {
-			*p = i;
-			return 2;
-		}
-	}
-
-	return 0;
-}
-
-static int parse_long_option(struct isl_arg *decl, char **arg,
-	const char *prefix, void *opt)
-{
-	int has_argument;
-	const char *val;
-	char *endptr;
-	long *p = (long *)(((char *)opt) + decl->offset);
-
-	val = skip_name(decl, arg[0], prefix, 0, &has_argument);
-	if (!val)
-		return 0;
-
-	if (has_argument) {
-		long l = strtol(val, NULL, 0);
-		if (decl->u.l.set)
-			decl->u.l.set(opt, l);
-		else
-			*p = l;
-		return 1;
-	}
-
-	if (arg[1]) {
-		long l = strtol(arg[1], &endptr, 0);
-		if (*endptr == '\0') {
-			if (decl->u.l.set)
-				decl->u.l.set(opt, l);
-			else
-				*p = l;
-			return 2;
-		}
-	}
-
-	if (decl->u.l.default_value != decl->u.l.default_selected) {
-		if (decl->u.l.set)
-			decl->u.l.set(opt, decl->u.l.default_selected);
-		else
-			*p = decl->u.l.default_selected;
-		return 1;
-	}
-
-	return 0;
-}
-
-static int parse_ulong_option(struct isl_arg *decl, char **arg,
-	const char *prefix, void *opt)
-{
-	int has_argument;
-	const char *val;
-	char *endptr;
-	unsigned long *p = (unsigned long *)(((char *)opt) + decl->offset);
-
-	val = skip_name(decl, arg[0], prefix, 0, &has_argument);
-	if (!val)
-		return 0;
-
-	if (has_argument) {
-		*p = strtoul(val, NULL, 0);
-		return 1;
-	}
-
-	if (arg[1]) {
-		unsigned long ul = strtoul(arg[1], &endptr, 0);
-		if (*endptr == '\0') {
-			*p = ul;
-			return 2;
-		}
-	}
-
-	return 0;
-}
-
-static int parse_option(struct isl_arg *decl, char **arg,
-	const char *prefix, void *opt);
-
-static int parse_child_option(struct isl_arg *decl, char **arg,
-	const char *prefix, void *opt)
-{
-	void *child;
-
-	if (decl->offset == (size_t) -1)
-		child = opt;
-	else {
-		child = *(void **)(((char *)opt) + decl->offset);
-		prefix = decl->long_name;
-	}
-	return parse_option(decl->u.child.child, arg, prefix, child);
-}
-
-static int parse_option(struct isl_arg *decl, char **arg,
-	const char *prefix, void *opt)
-{
-	int i;
-
-	for (i = 0; decl[i].type != isl_arg_end; ++i) {
-		int parsed = 0;
-		switch (decl[i].type) {
-		case isl_arg_choice:
-			parsed = parse_choice_option(&decl[i], arg, prefix, opt);
-			break;
-		case isl_arg_flags:
-			parsed = parse_flags_option(&decl[i], arg, prefix, opt);
-			break;
-		case isl_arg_int:
-			parsed = parse_int_option(&decl[i], arg, prefix, opt);
-			break;
-		case isl_arg_long:
-			parsed = parse_long_option(&decl[i], arg, prefix, opt);
-			break;
-		case isl_arg_ulong:
-			parsed = parse_ulong_option(&decl[i], arg, prefix, opt);
-			break;
-		case isl_arg_bool:
-			parsed = parse_bool_option(&decl[i], arg, prefix, opt);
-			break;
-		case isl_arg_str:
-			parsed = parse_str_option(&decl[i], arg, prefix, opt);
-			break;
-		case isl_arg_child:
-			parsed = parse_child_option(&decl[i], arg, prefix, opt);
-			break;
-		case isl_arg_alias:
-		case isl_arg_arg:
-		case isl_arg_footer:
-		case isl_arg_user:
-		case isl_arg_version:
-		case isl_arg_end:
-			break;
-		}
-		if (parsed)
-			return parsed;
-	}
-
-	return 0;
-}
-
-static void print_version(struct isl_arg *decl)
-{
-	int i;
-
-	for (i = 0; decl[i].type != isl_arg_end; ++i) {
-		switch (decl[i].type) {
-		case isl_arg_version:
-			decl[i].u.version.print_version();
-			break;
-		case isl_arg_child:
-			print_version(decl[i].u.child.child);
-			break;
-		default:
-			break;
-		}
-	}
-}
-
-static void print_version_and_exit(struct isl_arg *decl)
-{
-	print_version(decl);
-
-	exit(0);
-}
-
-static int drop_argument(int argc, char **argv, int drop, int n)
-{
-	for (; drop < argc; ++drop)
-		argv[drop] = argv[drop + n];
-
-	return argc - n;
-}
-
-static int n_arg(struct isl_arg *arg)
-{
-	int i;
-	int n_arg = 0;
-
-	for (i = 0; arg[i].type != isl_arg_end; ++i)
-		if (arg[i].type == isl_arg_arg)
-			n_arg++;
-
-	return n_arg;
-}
-
-static int next_arg(struct isl_arg *arg, int a)
-{
-	for (++a; arg[a].type != isl_arg_end; ++a)
-		if (arg[a].type == isl_arg_arg)
-			return a;
-
-	return -1;
-}
-
-int isl_arg_parse(struct isl_arg *arg, int argc, char **argv, void *opt,
-	unsigned flags)
-{
-	int a = -1;
-	int skip = 0;
-	int i;
-	int n;
-
-	n = n_arg(arg);
-
-	for (i = 1; i < argc; ++i) {
-		if (strcmp(argv[i], "--help") == 0)
-			print_help_and_exit(arg, argv[0]);
-	}
-
-	for (i = 1; i < argc; ++i) {
-		if ((strcmp(argv[i], "--version") == 0 ||
-		     strcmp(argv[i], "-V") == 0) && any_version(arg))
-			print_version_and_exit(arg);
-	}
-
-	while (argc > 1 + skip) {
-		int parsed;
-		if (argv[1 + skip][0] != '-') {
-			a = next_arg(arg, a);
-			if (a >= 0) {
-				char **p;
-				p = (char **)(((char *)opt)+arg[a].offset);
-				free(*p);
-				*p = strdup(argv[1 + skip]);
-				argc = drop_argument(argc, argv, 1 + skip, 1);
-				--n;
-			} else if (ISL_FL_ISSET(flags, ISL_ARG_ALL)) {
-				fprintf(stderr, "%s: extra argument: %s\n",
-					    prog_name(argv[0]), argv[1 + skip]);
-				exit(-1);
-			} else
-				++skip;
-			continue;
-		}
-		parsed = parse_option(arg, &argv[1 + skip], NULL, opt);
-		if (parsed)
-			argc = drop_argument(argc, argv, 1 + skip, parsed);
-		else if (ISL_FL_ISSET(flags, ISL_ARG_ALL)) {
-			fprintf(stderr, "%s: unrecognized option: %s\n",
-					prog_name(argv[0]), argv[1 + skip]);
-			exit(-1);
-		} else
-			++skip;
-	}
-
-	if (n > 0) {
-		fprintf(stderr, "%s: expecting %d more argument(s)\n",
-				prog_name(argv[0]), n);
-		exit(-1);
-	}
-
-	return argc;
-}
diff --git a/cloog-0.16.3/isl/isl_band.c b/cloog-0.16.3/isl/isl_band.c
deleted file mode 100644
index e4fbf93..0000000
--- a/cloog-0.16.3/isl/isl_band.c
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright 2011      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France
- */
-
-#include <isl_band_private.h>
-#include <isl_schedule_private.h>
-#include <isl_list_private.h>
-
-isl_ctx *isl_band_get_ctx(__isl_keep isl_band *band)
-{
-	return band ? isl_union_map_get_ctx(band->map) : NULL;
-}
-
-/* We not only increment the reference count of the band,
- * but also that of the schedule that contains this band.
- * This ensures that the schedule won't disappear while there
- * is still a reference to the band outside of the schedule.
- * There is no need to increment the reference count of the parent
- * band as the parent band is part of the same schedule.
- */
-__isl_give isl_band *isl_band_copy(__isl_keep isl_band *band)
-{
-	if (!band)
-		return NULL;
-
-	band->ref++;
-	band->schedule->ref++;
-	return band;
-}
-
-/* If this is not the last reference to the band (the one from within the
- * schedule), then we also need to decrement the reference count of the
- * containing schedule as it was incremented in isl_band_copy.
- */
-void *isl_band_free(__isl_take isl_band *band)
-{
-	if (!band)
-		return NULL;
-
-	if (--band->ref > 0)
-		return isl_schedule_free(band->schedule);
-
-	isl_union_map_free(band->map);
-	isl_band_list_free(band->children);
-	free(band->zero);
-	free(band);
-
-	return NULL;
-}
-
-int isl_band_has_children(__isl_keep isl_band *band)
-{
-	if (!band)
-		return -1;
-
-	return band->children != NULL;
-}
-
-__isl_give isl_band_list *isl_band_get_children(
-	__isl_keep isl_band *band)
-{
-	if (!band)
-		return NULL;
-	if (!band->children)
-		isl_die(isl_band_get_ctx(band), isl_error_invalid,
-			"band has no children", return NULL);
-	return isl_band_list_dup(band->children);
-}
-
-int isl_band_n_member(__isl_keep isl_band *band)
-{
-	return band ? band->n : 0;
-}
-
-/* Is the given scheduling dimension zero distance within the band and
- * with respect to the proximity dependences.
- */
-int isl_band_member_is_zero_distance(__isl_keep isl_band *band, int pos)
-{
-	if (!band)
-		return -1;
-
-	if (pos < 0 || pos >= band->n)
-		isl_die(isl_band_get_ctx(band), isl_error_invalid,
-			"invalid member position", return -1);
-
-	return band->zero[pos];
-}
-
-/* Return the schedule that leads up to this band.
- */
-__isl_give isl_union_map *isl_band_get_prefix_schedule(
-	__isl_keep isl_band *band)
-{
-	isl_union_map *prefix;
-	isl_band *a;
-
-	if (!band)
-		return NULL;
-
-	prefix = isl_union_map_copy(band->map);
-	prefix = isl_union_map_from_domain(isl_union_map_domain(prefix));
-
-	for (a = band->parent; a; a = a->parent) {
-		isl_union_map *partial = isl_union_map_copy(a->map);
-		prefix = isl_union_map_flat_range_product(partial, prefix);
-	}
-
-	return prefix;
-}
-
-/* Return the schedule of the band in isolation.
- */
-__isl_give isl_union_map *isl_band_get_partial_schedule(
-	__isl_keep isl_band *band)
-{
-	return band ? isl_union_map_copy(band->map) : NULL;
-}
-
-/* Return the schedule for the forest underneath the given band.
- */
-__isl_give isl_union_map *isl_band_get_suffix_schedule(
-	__isl_keep isl_band *band)
-{
-	isl_union_map *suffix;
-
-	if (!band)
-		return NULL;
-
-	if (!isl_band_has_children(band)) {
-		suffix = isl_union_map_copy(band->map);
-		suffix = isl_union_map_from_domain(isl_union_map_domain(suffix));
-	} else {
-		int i, n;
-		isl_band_list *children;
-
-		suffix = isl_union_map_empty(isl_union_map_get_dim(band->map));
-		children = isl_band_get_children(band);
-		n = isl_band_list_n_band(children);
-		for (i = 0; i < n; ++i) {
-			isl_band *child;
-			isl_union_map *partial_i;
-			isl_union_map *suffix_i;
-
-			child = isl_band_list_get_band(children, i);
-			partial_i = isl_band_get_partial_schedule(child);
-			suffix_i = isl_band_get_suffix_schedule(child);
-			suffix_i = isl_union_map_flat_range_product(partial_i,
-								    suffix_i);
-			suffix = isl_union_map_union(suffix, suffix_i);
-
-			isl_band_free(child);
-		}
-		isl_band_list_free(children);
-	}
-
-	return suffix;
-}
-
-__isl_give isl_printer *isl_printer_print_band(__isl_take isl_printer *p,
-	__isl_keep isl_band *band)
-{
-	isl_union_map *prefix, *partial, *suffix;
-
-	prefix = isl_band_get_prefix_schedule(band);
-	partial = isl_band_get_partial_schedule(band);
-	suffix = isl_band_get_suffix_schedule(band);
-
-	p = isl_printer_print_str(p, "(");
-	p = isl_printer_print_union_map(p, prefix);
-	p = isl_printer_print_str(p, ",");
-	p = isl_printer_print_union_map(p, partial);
-	p = isl_printer_print_str(p, ",");
-	p = isl_printer_print_union_map(p, suffix);
-	p = isl_printer_print_str(p, ")");
-
-	isl_union_map_free(prefix);
-	isl_union_map_free(partial);
-	isl_union_map_free(suffix);
-
-	return p;
-}
-
-void isl_band_dump(__isl_keep isl_band *band)
-{
-	isl_printer *printer;
-
-	if (!band)
-		return;
-
-	printer = isl_printer_to_file(isl_band_get_ctx(band), stderr);
-	printer = isl_printer_print_band(printer, band);
-	printer = isl_printer_end_line(printer);
-
-	isl_printer_free(printer);
-}
diff --git a/cloog-0.16.3/isl/isl_band_private.h b/cloog-0.16.3/isl/isl_band_private.h
deleted file mode 100644
index 579ef66..0000000
--- a/cloog-0.16.3/isl/isl_band_private.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef ISL_BAND_PRIVATE_H
-#define ISL_BAND_PRIVATE_H
-
-#include <isl/band.h>
-#include <isl/list.h>
-#include <isl/schedule.h>
-#include <isl/union_map.h>
-
-/* Information about a band within a schedule.
- *
- * n is the number of scheduling dimensions within the band.
- * zero is an array of length n, indicating whether a scheduling dimension
- *	results in zero dependence distances for the proximity dependences.
- * map is the partial map corresponding to this band.
- * schedule is the schedule that contains this band.
- * parent is the parent of this band (or NULL if the band is a root).
- * children are the children of this band (or NULL if the band is a leaf).
- *
- * To avoid circular dependences in the reference counting,
- * the schedule and parent pointers are not reference counted.
- * isl_band_copy increments the reference count of schedule to ensure
- * that outside references to the band keep the schedule alive.
- */
-struct isl_band {
-	int ref;
-
-	int n;
-	int *zero;
-
-	isl_union_map *map;
-	isl_schedule *schedule;
-	isl_band *parent;
-	isl_band_list *children;
-};
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_basis_reduction.h b/cloog-0.16.3/isl/isl_basis_reduction.h
deleted file mode 100644
index fd63560..0000000
--- a/cloog-0.16.3/isl/isl_basis_reduction.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_BASIS_REDUCTION_H
-#define ISL_BASIS_REDUCTION_H
-
-#include <isl/set.h>
-#include <isl_mat_private.h>
-#include "isl_tab.h"
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_tab *isl_tab_compute_reduced_basis(struct isl_tab *tab);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_bernstein.c b/cloog-0.16.3/isl/isl_bernstein.c
deleted file mode 100644
index 1458e27..0000000
--- a/cloog-0.16.3/isl/isl_bernstein.c
+++ /dev/null
@@ -1,548 +0,0 @@
-/*
- * Copyright 2006-2007 Universiteit Leiden
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, Leiden Institute of Advanced Computer Science,
- * Universiteit Leiden, Niels Bohrweg 1, 2333 CA Leiden, The Netherlands
- * and K.U.Leuven, Departement Computerwetenschappen, Celestijnenlaan 200A,
- * B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl/set.h>
-#include <isl/seq.h>
-#include <isl_morph.h>
-#include <isl_factorization.h>
-#include <isl_vertices_private.h>
-#include <isl_polynomial_private.h>
-#include <isl_bernstein.h>
-
-struct bernstein_data {
-	enum isl_fold type;
-	isl_qpolynomial *poly;
-	int check_tight;
-
-	isl_cell *cell;
-
-	isl_qpolynomial_fold *fold;
-	isl_qpolynomial_fold *fold_tight;
-	isl_pw_qpolynomial_fold *pwf;
-	isl_pw_qpolynomial_fold *pwf_tight;
-};
-
-static int vertex_is_integral(__isl_keep isl_basic_set *vertex)
-{
-	unsigned nvar;
-	unsigned nparam;
-	int i;
-
-	nvar = isl_basic_set_dim(vertex, isl_dim_set);
-	nparam = isl_basic_set_dim(vertex, isl_dim_param);
-	for (i = 0; i < nvar; ++i) {
-		int r = nvar - 1 - i;
-		if (!isl_int_is_one(vertex->eq[r][1 + nparam + i]) &&
-		    !isl_int_is_negone(vertex->eq[r][1 + nparam + i]))
-			return 0;
-	}
-
-	return 1;
-}
-
-static __isl_give isl_qpolynomial *vertex_coordinate(
-	__isl_keep isl_basic_set *vertex, int i, __isl_take isl_dim *dim)
-{
-	unsigned nvar;
-	unsigned nparam;
-	int r;
-	isl_int denom;
-	isl_qpolynomial *v;
-
-	nvar = isl_basic_set_dim(vertex, isl_dim_set);
-	nparam = isl_basic_set_dim(vertex, isl_dim_param);
-	r = nvar - 1 - i;
-
-	isl_int_init(denom);
-	isl_int_set(denom, vertex->eq[r][1 + nparam + i]);
-	isl_assert(vertex->ctx, !isl_int_is_zero(denom), goto error);
-
-	if (isl_int_is_pos(denom))
-		isl_seq_neg(vertex->eq[r], vertex->eq[r],
-				1 + isl_basic_set_total_dim(vertex));
-	else
-		isl_int_neg(denom, denom);
-
-	v = isl_qpolynomial_from_affine(dim, vertex->eq[r], denom);
-	isl_int_clear(denom);
-
-	return v;
-error:
-	isl_dim_free(dim);
-	isl_int_clear(denom);
-	return NULL;
-}
-
-/* Check whether the bound associated to the selection "k" is tight,
- * which is the case if we select exactly one vertex and if that vertex
- * is integral for all values of the parameters.
- */
-static int is_tight(int *k, int n, int d, isl_cell *cell)
-{
-	int i;
-
-	for (i = 0; i < n; ++i) {
-		int v;
-		if (k[i] != d) {
-			if (k[i])
-				return 0;
-			continue;
-		}
-		v = cell->ids[n - 1 - i];
-		return vertex_is_integral(cell->vertices->v[v].vertex);
-	}
-
-	return 0;
-}
-
-static void add_fold(__isl_take isl_qpolynomial *b, __isl_keep isl_set *dom,
-	int *k, int n, int d, struct bernstein_data *data)
-{
-	isl_qpolynomial_fold *fold;
-
-	fold = isl_qpolynomial_fold_alloc(data->type, b);
-
-	if (data->check_tight && is_tight(k, n, d, data->cell))
-		data->fold_tight = isl_qpolynomial_fold_fold_on_domain(dom,
-							data->fold_tight, fold);
-	else
-		data->fold = isl_qpolynomial_fold_fold_on_domain(dom,
-							data->fold, fold);
-}
-
-/* Extract the coefficients of the Bernstein base polynomials and store
- * them in data->fold and data->fold_tight.
- *
- * In particular, the coefficient of each monomial
- * of multi-degree (k[0], k[1], ..., k[n-1]) is divided by the corresponding
- * multinomial coefficient d!/k[0]! k[1]! ... k[n-1]!
- *
- * c[i] contains the coefficient of the selected powers of the first i+1 vars.
- * multinom[i] contains the partial multinomial coefficient.
- */
-static void extract_coefficients(isl_qpolynomial *poly,
-	__isl_keep isl_set *dom, struct bernstein_data *data)
-{
-	int i;
-	int d;
-	int n;
-	isl_ctx *ctx;
-	isl_qpolynomial **c = NULL;
-	int *k = NULL;
-	int *left = NULL;
-	isl_vec *multinom = NULL;
-
-	if (!poly)
-		return;
-
-	ctx = isl_qpolynomial_get_ctx(poly);
-	n = isl_qpolynomial_dim(poly, isl_dim_set);
-	d = isl_qpolynomial_degree(poly);
-	isl_assert(ctx, n >= 2, return);
-
-	c = isl_calloc_array(ctx, isl_qpolynomial *, n);
-	k = isl_alloc_array(ctx, int, n);
-	left = isl_alloc_array(ctx, int, n);
-	multinom = isl_vec_alloc(ctx, n);
-	if (!c || !k || !left || !multinom)
-		goto error;
-
-	isl_int_set_si(multinom->el[0], 1);
-	for (k[0] = d; k[0] >= 0; --k[0]) {
-		int i = 1;
-		isl_qpolynomial_free(c[0]);
-		c[0] = isl_qpolynomial_coeff(poly, isl_dim_set, n - 1, k[0]);
-		left[0] = d - k[0];
-		k[1] = -1;
-		isl_int_set(multinom->el[1], multinom->el[0]);
-		while (i > 0) {
-			if (i == n - 1) {
-				int j;
-				isl_dim *dim;
-				isl_qpolynomial *b;
-				isl_qpolynomial *f;
-				for (j = 2; j <= left[i - 1]; ++j)
-					isl_int_divexact_ui(multinom->el[i],
-						multinom->el[i], j);
-				b = isl_qpolynomial_coeff(c[i - 1], isl_dim_set,
-					n - 1 - i, left[i - 1]);
-				b = isl_qpolynomial_drop_dims(b, isl_dim_set,
-								0, n);
-				dim = isl_qpolynomial_get_dim(b);
-				f = isl_qpolynomial_rat_cst(dim, ctx->one,
-					multinom->el[i]);
-				b = isl_qpolynomial_mul(b, f);
-				k[n - 1] = left[n - 2];
-				add_fold(b, dom, k, n, d, data);
-				--i;
-				continue;
-			}
-			if (k[i] >= left[i - 1]) {
-				--i;
-				continue;
-			}
-			++k[i];
-			if (k[i])
-				isl_int_divexact_ui(multinom->el[i],
-					multinom->el[i], k[i]);
-			isl_qpolynomial_free(c[i]);
-			c[i] = isl_qpolynomial_coeff(c[i - 1], isl_dim_set,
-					n - 1 - i, k[i]);
-			left[i] = left[i - 1] - k[i];
-			k[i + 1] = -1;
-			isl_int_set(multinom->el[i + 1], multinom->el[i]);
-			++i;
-		}
-		isl_int_mul_ui(multinom->el[0], multinom->el[0], k[0]);
-	}
-
-	for (i = 0; i < n; ++i)
-		isl_qpolynomial_free(c[i]);
-
-	isl_vec_free(multinom);
-	free(left);
-	free(k);
-	free(c);
-	return;
-error:
-	isl_vec_free(multinom);
-	free(left);
-	free(k);
-	if (c)
-		for (i = 0; i < n; ++i)
-			isl_qpolynomial_free(c[i]);
-	free(c);
-	return;
-}
-
-/* Perform bernstein expansion on the parametric vertices that are active
- * on "cell".
- *
- * data->poly has been homogenized in the calling function.
- *
- * We plug in the barycentric coordinates for the set variables
- *
- *		\vec x = \sum_i \alpha_i v_i(\vec p)
- *
- * and the constant "1 = \sum_i \alpha_i" for the homogeneous dimension.
- * Next, we extract the coefficients of the Bernstein base polynomials.
- */
-static int bernstein_coefficients_cell(__isl_take isl_cell *cell, void *user)
-{
-	int i, j;
-	struct bernstein_data *data = (struct bernstein_data *)user;
-	isl_dim *dim_param;
-	isl_dim *dim_dst;
-	isl_qpolynomial *poly = data->poly;
-	unsigned nvar;
-	int n_vertices;
-	isl_qpolynomial **subs;
-	isl_pw_qpolynomial_fold *pwf;
-	isl_set *dom;
-	isl_ctx *ctx;
-
-	nvar = isl_qpolynomial_dim(poly, isl_dim_set) - 1;
-	n_vertices = cell->n_vertices;
-
-	ctx = isl_qpolynomial_get_ctx(poly);
-	if (n_vertices > nvar + 1 && ctx->opt->bernstein_triangulate)
-		return isl_cell_foreach_simplex(cell,
-					    &bernstein_coefficients_cell, user);
-
-	subs = isl_alloc_array(ctx, isl_qpolynomial *, 1 + nvar);
-	if (!subs)
-		goto error;
-
-	dim_param = isl_basic_set_get_dim(cell->dom);
-	dim_dst = isl_qpolynomial_get_dim(poly);
-	dim_dst = isl_dim_add(dim_dst, isl_dim_set, n_vertices);
-
-	for (i = 0; i < 1 + nvar; ++i)
-		subs[i] = isl_qpolynomial_zero(isl_dim_copy(dim_dst));
-
-	for (i = 0; i < n_vertices; ++i) {
-		isl_qpolynomial *c;
-		c = isl_qpolynomial_var(isl_dim_copy(dim_dst), isl_dim_set,
-					1 + nvar + i);
-		for (j = 0; j < nvar; ++j) {
-			int k = cell->ids[i];
-			isl_qpolynomial *v;
-			v = vertex_coordinate(cell->vertices->v[k].vertex, j,
-						isl_dim_copy(dim_param));
-			v = isl_qpolynomial_add_dims(v, isl_dim_set,
-							1 + nvar + n_vertices);
-			v = isl_qpolynomial_mul(v, isl_qpolynomial_copy(c));
-			subs[1 + j] = isl_qpolynomial_add(subs[1 + j], v);
-		}
-		subs[0] = isl_qpolynomial_add(subs[0], c);
-	}
-	isl_dim_free(dim_dst);
-
-	poly = isl_qpolynomial_copy(poly);
-
-	poly = isl_qpolynomial_add_dims(poly, isl_dim_set, n_vertices);
-	poly = isl_qpolynomial_substitute(poly, isl_dim_set, 0, 1 + nvar, subs);
-	poly = isl_qpolynomial_drop_dims(poly, isl_dim_set, 0, 1 + nvar);
-
-	data->cell = cell;
-	dom = isl_set_from_basic_set(isl_basic_set_copy(cell->dom));
-	data->fold = isl_qpolynomial_fold_empty(data->type, isl_dim_copy(dim_param));
-	data->fold_tight = isl_qpolynomial_fold_empty(data->type, dim_param);
-	extract_coefficients(poly, dom, data);
-
-	pwf = isl_pw_qpolynomial_fold_alloc(data->type, isl_set_copy(dom),
-					    data->fold);
-	data->pwf = isl_pw_qpolynomial_fold_fold(data->pwf, pwf);
-	pwf = isl_pw_qpolynomial_fold_alloc(data->type, dom, data->fold_tight);
-	data->pwf_tight = isl_pw_qpolynomial_fold_fold(data->pwf_tight, pwf);
-
-	isl_qpolynomial_free(poly);
-	isl_cell_free(cell);
-	for (i = 0; i < 1 + nvar; ++i)
-		isl_qpolynomial_free(subs[i]);
-	free(subs);
-	return 0;
-error:
-	isl_cell_free(cell);
-	return -1;
-}
-
-/* Base case of applying bernstein expansion.
- *
- * We compute the chamber decomposition of the parametric polytope "bset"
- * and then perform bernstein expansion on the parametric vertices
- * that are active on each chamber.
- */
-static __isl_give isl_pw_qpolynomial_fold *bernstein_coefficients_base(
-	__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, struct bernstein_data *data, int *tight)
-{
-	unsigned nvar;
-	isl_dim *dim;
-	isl_pw_qpolynomial_fold *pwf;
-	isl_vertices *vertices;
-	int covers;
-
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-	if (nvar == 0) {
-		isl_set *dom;
-		isl_qpolynomial_fold *fold;
-		fold = isl_qpolynomial_fold_alloc(data->type, poly);
-		dom = isl_set_from_basic_set(bset);
-		if (tight)
-			*tight = 1;
-		return isl_pw_qpolynomial_fold_alloc(data->type, dom, fold);
-	}
-
-	if (isl_qpolynomial_is_zero(poly)) {
-		isl_set *dom;
-		isl_qpolynomial_fold *fold;
-		fold = isl_qpolynomial_fold_alloc(data->type, poly);
-		dom = isl_set_from_basic_set(bset);
-		pwf = isl_pw_qpolynomial_fold_alloc(data->type, dom, fold);
-		if (tight)
-			*tight = 1;
-		return isl_pw_qpolynomial_fold_drop_dims(pwf,
-							    isl_dim_set, 0, nvar);
-	}
-
-	dim = isl_basic_set_get_dim(bset);
-	dim = isl_dim_drop(dim, isl_dim_set, 0, nvar);
-	data->pwf = isl_pw_qpolynomial_fold_zero(isl_dim_copy(dim), data->type);
-	data->pwf_tight = isl_pw_qpolynomial_fold_zero(dim, data->type);
-	data->poly = isl_qpolynomial_homogenize(isl_qpolynomial_copy(poly));
-	vertices = isl_basic_set_compute_vertices(bset);
-	isl_vertices_foreach_disjoint_cell(vertices,
-		&bernstein_coefficients_cell, data);
-	isl_vertices_free(vertices);
-	isl_qpolynomial_free(data->poly);
-
-	isl_basic_set_free(bset);
-	isl_qpolynomial_free(poly);
-
-	covers = isl_pw_qpolynomial_fold_covers(data->pwf_tight, data->pwf);
-	if (covers < 0)
-		goto error;
-
-	if (tight)
-		*tight = covers;
-
-	if (covers) {
-		isl_pw_qpolynomial_fold_free(data->pwf);
-		return data->pwf_tight;
-	}
-
-	data->pwf = isl_pw_qpolynomial_fold_fold(data->pwf, data->pwf_tight);
-
-	return data->pwf;
-error:
-	isl_pw_qpolynomial_fold_free(data->pwf_tight);
-	isl_pw_qpolynomial_fold_free(data->pwf);
-	return NULL;
-}
-
-/* Apply bernstein expansion recursively by working in on len[i]
- * set variables at a time, with i ranging from n_group - 1 to 0.
- */
-static __isl_give isl_pw_qpolynomial_fold *bernstein_coefficients_recursive(
-	__isl_take isl_pw_qpolynomial *pwqp,
-	int n_group, int *len, struct bernstein_data *data, int *tight)
-{
-	int i;
-	unsigned nparam;
-	unsigned nvar;
-	isl_pw_qpolynomial_fold *pwf;
-
-	if (!pwqp)
-		return NULL;
-
-	nparam = isl_pw_qpolynomial_dim(pwqp, isl_dim_param);
-	nvar = isl_pw_qpolynomial_dim(pwqp, isl_dim_set);
-
-	pwqp = isl_pw_qpolynomial_move_dims(pwqp, isl_dim_param, nparam,
-					isl_dim_set, 0, nvar - len[n_group - 1]);
-	pwf = isl_pw_qpolynomial_bound(pwqp, data->type, tight);
-
-	for (i = n_group - 2; i >= 0; --i) {
-		nparam = isl_pw_qpolynomial_fold_dim(pwf, isl_dim_param);
-		pwf = isl_pw_qpolynomial_fold_move_dims(pwf, isl_dim_set, 0,
-				isl_dim_param, nparam - len[i], len[i]);
-		if (tight && !*tight)
-			tight = NULL;
-		pwf = isl_pw_qpolynomial_fold_bound(pwf, tight);
-	}
-
-	return pwf;
-}
-
-static __isl_give isl_pw_qpolynomial_fold *bernstein_coefficients_factors(
-	__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, struct bernstein_data *data, int *tight)
-{
-	isl_factorizer *f;
-	isl_set *set;
-	isl_pw_qpolynomial *pwqp;
-	isl_pw_qpolynomial_fold *pwf;
-
-	f = isl_basic_set_factorizer(bset);
-	if (!f)
-		goto error;
-	if (f->n_group == 0) {
-		isl_factorizer_free(f);
-		return  bernstein_coefficients_base(bset, poly, data, tight);
-	}
-
-	set = isl_set_from_basic_set(bset);
-	pwqp = isl_pw_qpolynomial_alloc(set, poly);
-	pwqp = isl_pw_qpolynomial_morph(pwqp, isl_morph_copy(f->morph));
-
-	pwf = bernstein_coefficients_recursive(pwqp, f->n_group, f->len, data,
-						tight);
-
-	isl_factorizer_free(f);
-
-	return pwf;
-error:
-	isl_basic_set_free(bset);
-	isl_qpolynomial_free(poly);
-	return NULL;
-}
-
-static __isl_give isl_pw_qpolynomial_fold *bernstein_coefficients_full_recursive(
-	__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, struct bernstein_data *data, int *tight)
-{
-	int i;
-	int *len;
-	unsigned nvar;
-	isl_pw_qpolynomial_fold *pwf;
-	isl_set *set;
-	isl_pw_qpolynomial *pwqp;
-
-	if (!bset || !poly)
-		goto error;
-
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-	
-	len = isl_alloc_array(bset->ctx, int, nvar);
-	if (!len)
-		goto error;
-
-	for (i = 0; i < nvar; ++i)
-		len[i] = 1;
-
-	set = isl_set_from_basic_set(bset);
-	pwqp = isl_pw_qpolynomial_alloc(set, poly);
-
-	pwf = bernstein_coefficients_recursive(pwqp, nvar, len, data, tight);
-
-	free(len);
-
-	return pwf;
-error:
-	isl_basic_set_free(bset);
-	isl_qpolynomial_free(poly);
-	return NULL;
-}
-
-/* Compute a bound on the polynomial defined over the parametric polytope
- * using bernstein expansion and store the result
- * in bound->pwf and bound->pwf_tight.
- *
- * If bernstein_recurse is set to ISL_BERNSTEIN_FACTORS, we check if
- * the polytope can be factorized and apply bernstein expansion recursively
- * on the factors.
- * If bernstein_recurse is set to ISL_BERNSTEIN_INTERVALS, we apply
- * bernstein expansion recursively on each dimension.
- * Otherwise, we apply bernstein expansion on the entire polytope.
- */
-int isl_qpolynomial_bound_on_domain_bernstein(__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, struct isl_bound *bound)
-{
-	struct bernstein_data data;
-	isl_pw_qpolynomial_fold *pwf;
-	unsigned nvar;
-	int tight = 0;
-	int *tp = bound->check_tight ? &tight : NULL;
-
-	if (!bset || !poly)
-		goto error;
-
-	data.type = bound->type;
-	data.check_tight = bound->check_tight;
-
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-
-	if (bset->ctx->opt->bernstein_recurse & ISL_BERNSTEIN_FACTORS)
-		pwf = bernstein_coefficients_factors(bset, poly, &data, tp);
-	else if (nvar > 1 &&
-	    (bset->ctx->opt->bernstein_recurse & ISL_BERNSTEIN_INTERVALS))
-		pwf = bernstein_coefficients_full_recursive(bset, poly, &data, tp);
-	else
-		pwf = bernstein_coefficients_base(bset, poly, &data, tp);
-
-	if (tight)
-		bound->pwf_tight = isl_pw_qpolynomial_fold_fold(bound->pwf_tight, pwf);
-	else
-		bound->pwf = isl_pw_qpolynomial_fold_fold(bound->pwf, pwf);
-
-	return 0;
-error:
-	isl_basic_set_free(bset);
-	isl_qpolynomial_free(poly);
-	return -1;
-}
diff --git a/cloog-0.16.3/isl/isl_bernstein.h b/cloog-0.16.3/isl/isl_bernstein.h
deleted file mode 100644
index 7694b04..0000000
--- a/cloog-0.16.3/isl/isl_bernstein.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#include <isl_bound.h>
-
-int isl_qpolynomial_bound_on_domain_bernstein(__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, struct isl_bound *bound);
diff --git a/cloog-0.16.3/isl/isl_blk.c b/cloog-0.16.3/isl/isl_blk.c
deleted file mode 100644
index 0c1dae7..0000000
--- a/cloog-0.16.3/isl/isl_blk.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl/blk.h>
-#include <isl_ctx_private.h>
-
-/* The maximal number of cache misses before first element is evicted */
-#define ISL_BLK_MAX_MISS	100
-
-struct isl_blk isl_blk_empty()
-{
-	struct isl_blk block;
-	block.size = 0;
-	block.data = NULL;
-	return block;
-}
-
-static int isl_blk_is_empty(struct isl_blk block)
-{
-	return block.size == 0 && block.data == NULL;
-}
-
-static struct isl_blk isl_blk_error()
-{
-	struct isl_blk block;
-	block.size = -1;
-	block.data = NULL;
-	return block;
-}
-
-int isl_blk_is_error(struct isl_blk block)
-{
-	return block.size == -1 && block.data == NULL;
-}
-
-static struct isl_blk extend(struct isl_ctx *ctx, struct isl_blk block,
-				size_t new_n)
-{
-	int i;
-	isl_int *p;
-
-	if (block.size >= new_n)
-		return block;
-
-	p = block.data;
-	block.data = isl_realloc_array(ctx, block.data, isl_int, new_n);
-	if (!block.data) {
-		free(p);
-		return isl_blk_error();
-	}
-
-	for (i = block.size; i < new_n; ++i)
-		isl_int_init(block.data[i]);
-	block.size = new_n;
-
-	return block;
-}
-
-static void isl_blk_free_force(struct isl_ctx *ctx, struct isl_blk block)
-{
-	int i;
-
-	for (i = 0; i < block.size; ++i)
-		isl_int_clear(block.data[i]);
-	free(block.data);
-}
-
-struct isl_blk isl_blk_alloc(struct isl_ctx *ctx, size_t n)
-{
-	int i;
-	struct isl_blk block;
-
-	block = isl_blk_empty();
-	if (n && ctx->n_cached) {
-		int best = 0;
-		for (i = 1; ctx->cache[best].size != n && i < ctx->n_cached; ++i) {
-			if (ctx->cache[best].size < n) {
-				if (ctx->cache[i].size > ctx->cache[best].size)
-					best = i;
-			} else if (ctx->cache[i].size >= n &&
-				   ctx->cache[i].size < ctx->cache[best].size)
-					best = i;
-		}
-		if (ctx->cache[best].size < 2 * n + 100) {
-			block = ctx->cache[best];
-			if (--ctx->n_cached != best)
-				ctx->cache[best] = ctx->cache[ctx->n_cached];
-			if (best == 0)
-				ctx->n_miss = 0;
-		} else if (ctx->n_miss++ >= ISL_BLK_MAX_MISS) {
-			isl_blk_free_force(ctx, ctx->cache[0]);
-			if (--ctx->n_cached != 0)
-				ctx->cache[0] = ctx->cache[ctx->n_cached];
-			ctx->n_miss = 0;
-		}
-	}
-
-	return extend(ctx, block, n);
-}
-
-struct isl_blk isl_blk_extend(struct isl_ctx *ctx, struct isl_blk block,
-				size_t new_n)
-{
-	if (isl_blk_is_empty(block))
-		return isl_blk_alloc(ctx, new_n);
-
-	return extend(ctx, block, new_n);
-}
-
-void isl_blk_free(struct isl_ctx *ctx, struct isl_blk block)
-{
-	if (isl_blk_is_empty(block) || isl_blk_is_error(block))
-		return;
-
-	if (ctx->n_cached < ISL_BLK_CACHE_SIZE)
-		ctx->cache[ctx->n_cached++] = block;
-	else
-		isl_blk_free_force(ctx, block);
-}
-
-void isl_blk_clear_cache(struct isl_ctx *ctx)
-{
-	int i;
-
-	for (i = 0; i < ctx->n_cached; ++i)
-		isl_blk_free_force(ctx, ctx->cache[i]);
-	ctx->n_cached = 0;
-}
diff --git a/cloog-0.16.3/isl/isl_bound.c b/cloog-0.16.3/isl/isl_bound.c
deleted file mode 100644
index 3828f8d..0000000
--- a/cloog-0.16.3/isl/isl_bound.c
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France 
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl_bound.h>
-#include <isl_bernstein.h>
-#include <isl_range.h>
-#include <isl_polynomial_private.h>
-
-/* Compute a bound on the polynomial defined over the parametric polytope
- * using either range propagation or bernstein expansion and
- * store the result in bound->pwf and bound->pwf_tight.
- * Since bernstein expansion requires bounded domains, we apply
- * range propagation on unbounded domains.  Otherwise, we respect the choice
- * of the user.
- */
-static int compressed_guarded_poly_bound(__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, void *user)
-{
-	struct isl_bound *bound = (struct isl_bound *)user;
-	int bounded;
-
-	if (!bset || !poly)
-		goto error;
-
-	if (bset->ctx->opt->bound == ISL_BOUND_RANGE)
-		return isl_qpolynomial_bound_on_domain_range(bset, poly, bound);
-
-	bounded = isl_basic_set_is_bounded(bset);
-	if (bounded < 0)
-		goto error;
-	if (bounded)
-		return isl_qpolynomial_bound_on_domain_bernstein(bset, poly, bound);
-	else
-		return isl_qpolynomial_bound_on_domain_range(bset, poly, bound);
-error:
-	isl_basic_set_free(bset);
-	isl_qpolynomial_free(poly);
-	return -1;
-}
-
-static int unwrapped_guarded_poly_bound(__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, void *user)
-{
-	struct isl_bound *bound = (struct isl_bound *)user;
-	isl_pw_qpolynomial_fold *top_pwf;
-	isl_pw_qpolynomial_fold *top_pwf_tight;
-	isl_dim *dim;
-	isl_morph *morph;
-	unsigned orig_nvar, final_nvar;
-	int r;
-
-	bset = isl_basic_set_detect_equalities(bset);
-
-	if (!bset)
-		goto error;
-
-	if (bset->n_eq == 0)
-		return compressed_guarded_poly_bound(bset, poly, user);
-
-	orig_nvar = isl_basic_set_dim(bset, isl_dim_set);
-
-	morph = isl_basic_set_full_compression(bset);
-
-	bset = isl_morph_basic_set(isl_morph_copy(morph), bset);
-	poly = isl_qpolynomial_morph(poly, isl_morph_copy(morph));
-
-	final_nvar = isl_basic_set_dim(bset, isl_dim_set);
-
-	dim = isl_morph_get_ran_dim(morph);
-	dim = isl_dim_drop(dim, isl_dim_set, 0, isl_dim_size(dim, isl_dim_set));
-
-	top_pwf = bound->pwf;
-	top_pwf_tight = bound->pwf_tight;
-
-	bound->pwf = isl_pw_qpolynomial_fold_zero(isl_dim_copy(dim),
-						  bound->type);
-	bound->pwf_tight = isl_pw_qpolynomial_fold_zero(dim, bound->type);
-
-	r = compressed_guarded_poly_bound(bset, poly, user);
-
-	morph = isl_morph_remove_dom_dims(morph, isl_dim_set, 0, orig_nvar);
-	morph = isl_morph_remove_ran_dims(morph, isl_dim_set, 0, final_nvar);
-	morph = isl_morph_inverse(morph);
-
-	bound->pwf = isl_pw_qpolynomial_fold_morph(bound->pwf,
-							isl_morph_copy(morph));
-	bound->pwf_tight = isl_pw_qpolynomial_fold_morph(bound->pwf_tight, morph);
-
-	bound->pwf = isl_pw_qpolynomial_fold_fold(top_pwf, bound->pwf);
-	bound->pwf_tight = isl_pw_qpolynomial_fold_fold(top_pwf_tight,
-							bound->pwf_tight);
-
-	return r;
-error:
-	isl_basic_set_free(bset);
-	isl_qpolynomial_free(poly);
-	return -1;
-}
-
-static int guarded_poly_bound(__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, void *user)
-{
-	struct isl_bound *bound = (struct isl_bound *)user;
-	isl_dim *dim;
-	isl_pw_qpolynomial_fold *top_pwf;
-	isl_pw_qpolynomial_fold *top_pwf_tight;
-	int nparam;
-	int n_in;
-	int r;
-
-	if (!bound->wrapping)
-		return unwrapped_guarded_poly_bound(bset, poly, user);
-
-	nparam = isl_dim_size(bound->dim, isl_dim_param);
-	n_in = isl_dim_size(bound->dim, isl_dim_set);
-
-	bset = isl_basic_set_move_dims(bset, isl_dim_param, nparam,
-					isl_dim_set, 0, n_in);
-	poly = isl_qpolynomial_move_dims(poly, isl_dim_param, nparam,
-					isl_dim_set, 0, n_in);
-
-	dim = isl_basic_set_get_dim(bset);
-	dim = isl_dim_drop(dim, isl_dim_set, 0, isl_dim_size(dim, isl_dim_set));
-
-	top_pwf = bound->pwf;
-	top_pwf_tight = bound->pwf_tight;
-
-	bound->pwf = isl_pw_qpolynomial_fold_zero(isl_dim_copy(dim),
-						  bound->type);
-	bound->pwf_tight = isl_pw_qpolynomial_fold_zero(dim, bound->type);
-
-	r = unwrapped_guarded_poly_bound(bset, poly, user);
-
-	bound->pwf = isl_pw_qpolynomial_fold_reset_dim(bound->pwf,
-						    isl_dim_copy(bound->dim));
-	bound->pwf_tight = isl_pw_qpolynomial_fold_reset_dim(bound->pwf_tight,
-						    isl_dim_copy(bound->dim));
-
-	bound->pwf = isl_pw_qpolynomial_fold_fold(top_pwf, bound->pwf);
-	bound->pwf_tight = isl_pw_qpolynomial_fold_fold(top_pwf_tight,
-							bound->pwf_tight);
-
-	return r;
-}
-
-static int guarded_qp(__isl_take isl_qpolynomial *qp, void *user)
-{
-	struct isl_bound *bound = (struct isl_bound *)user;
-	int r;
-
-	r = isl_qpolynomial_as_polynomial_on_domain(qp, bound->bset,
-						    &guarded_poly_bound, user);
-	isl_qpolynomial_free(qp);
-	return r;
-}
-
-static int basic_guarded_fold(__isl_take isl_basic_set *bset, void *user)
-{
-	struct isl_bound *bound = (struct isl_bound *)user;
-	int r;
-
-	bound->bset = bset;
-	r = isl_qpolynomial_fold_foreach_qpolynomial(bound->fold,
-							&guarded_qp, user);
-	isl_basic_set_free(bset);
-	return r;
-}
-
-static int guarded_fold(__isl_take isl_set *set,
-	__isl_take isl_qpolynomial_fold *fold, void *user)
-{
-	struct isl_bound *bound = (struct isl_bound *)user;
-
-	if (!set || !fold)
-		goto error;
-
-	set = isl_set_make_disjoint(set);
-
-	bound->fold = fold;
-	bound->type = isl_qpolynomial_fold_get_type(fold);
-
-	if (isl_set_foreach_basic_set(set, &basic_guarded_fold, bound) < 0)
-		goto error;
-
-	isl_set_free(set);
-	isl_qpolynomial_fold_free(fold);
-
-	return 0;
-error:
-	isl_set_free(set);
-	isl_qpolynomial_fold_free(fold);
-	return -1;
-}
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_bound(
-	__isl_take isl_pw_qpolynomial_fold *pwf, int *tight)
-{
-	unsigned nvar;
-	struct isl_bound bound;
-	int covers;
-
-	if (!pwf)
-		return NULL;
-
-	bound.dim = isl_pw_qpolynomial_fold_get_dim(pwf);
-	nvar = isl_dim_size(bound.dim, isl_dim_set);
-
-	bound.wrapping = isl_dim_is_wrapping(bound.dim);
-	if (bound.wrapping) {
-		bound.dim = isl_dim_unwrap(bound.dim);
-		nvar = isl_dim_size(bound.dim, isl_dim_out);
-		bound.dim = isl_dim_domain(bound.dim);
-	} else
-		bound.dim = isl_dim_drop(bound.dim, isl_dim_set, 0, nvar);
-
-	if (nvar == 0) {
-		if (tight)
-			*tight = 1;
-		return isl_pw_qpolynomial_fold_reset_dim(pwf, bound.dim);
-	}
-
-	if (isl_pw_qpolynomial_fold_is_zero(pwf)) {
-		enum isl_fold type = pwf->type;
-		isl_pw_qpolynomial_fold_free(pwf);
-		if (tight)
-			*tight = 1;
-		return isl_pw_qpolynomial_fold_zero(bound.dim, type);
-	}
-
-	bound.pwf = isl_pw_qpolynomial_fold_zero(isl_dim_copy(bound.dim),
-							pwf->type);
-	bound.pwf_tight = isl_pw_qpolynomial_fold_zero(isl_dim_copy(bound.dim),
-							pwf->type);
-	bound.check_tight = !!tight;
-
-	if (isl_pw_qpolynomial_fold_foreach_lifted_piece(pwf,
-							guarded_fold, &bound) < 0)
-		goto error;
-
-	covers = isl_pw_qpolynomial_fold_covers(bound.pwf_tight, bound.pwf);
-	if (covers < 0)
-		goto error;
-
-	if (tight)
-		*tight = covers;
-
-	isl_dim_free(bound.dim);
-	isl_pw_qpolynomial_fold_free(pwf);
-
-	if (covers) {
-		isl_pw_qpolynomial_fold_free(bound.pwf);
-		return bound.pwf_tight;
-	}
-
-	bound.pwf = isl_pw_qpolynomial_fold_fold(bound.pwf, bound.pwf_tight);
-
-	return bound.pwf;
-error:
-	isl_pw_qpolynomial_fold_free(bound.pwf_tight);
-	isl_pw_qpolynomial_fold_free(bound.pwf);
-	isl_pw_qpolynomial_fold_free(pwf);
-	isl_dim_free(bound.dim);
-	return NULL;
-}
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_bound(
-	__isl_take isl_pw_qpolynomial *pwqp, enum isl_fold type, int *tight)
-{
-	isl_pw_qpolynomial_fold *pwf;
-
-	pwf = isl_pw_qpolynomial_fold_from_pw_qpolynomial(type, pwqp);
-	return isl_pw_qpolynomial_fold_bound(pwf, tight);
-}
-
-struct isl_union_bound_data {
-	enum isl_fold type;
-	int tight;
-	isl_union_pw_qpolynomial_fold *res;
-};
-
-static int bound_pw(__isl_take isl_pw_qpolynomial *pwqp, void *user)
-{
-	struct isl_union_bound_data *data = user;
-	isl_pw_qpolynomial_fold *pwf;
-
-	pwf = isl_pw_qpolynomial_bound(pwqp, data->type,
-					data->tight ? &data->tight : NULL);
-	data->res = isl_union_pw_qpolynomial_fold_fold_pw_qpolynomial_fold(
-								data->res, pwf);
-
-	return 0;
-}
-
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_bound(
-	__isl_take isl_union_pw_qpolynomial *upwqp,
-	enum isl_fold type, int *tight)
-{
-	isl_dim *dim;
-	struct isl_union_bound_data data = { type, 1, NULL };
-
-	if (!upwqp)
-		return NULL;
-
-	if (!tight)
-		data.tight = 0;
-
-	dim = isl_union_pw_qpolynomial_get_dim(upwqp);
-	data.res = isl_union_pw_qpolynomial_fold_zero(dim, type);
-	if (isl_union_pw_qpolynomial_foreach_pw_qpolynomial(upwqp,
-						    &bound_pw, &data) < 0)
-		goto error;
-
-	isl_union_pw_qpolynomial_free(upwqp);
-	if (tight)
-		*tight = data.tight;
-
-	return data.res;
-error:
-	isl_union_pw_qpolynomial_free(upwqp);
-	isl_union_pw_qpolynomial_fold_free(data.res);
-	return NULL;
-}
diff --git a/cloog-0.16.3/isl/isl_bound.h b/cloog-0.16.3/isl/isl_bound.h
deleted file mode 100644
index b3a40db..0000000
--- a/cloog-0.16.3/isl/isl_bound.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef ISL_BOUND_H
-#define ISL_BOUND_H
-
-#include <isl/polynomial.h>
-
-struct isl_bound {
-	/* input */
-	int check_tight;
-	int wrapping;
-	enum isl_fold type;
-	isl_dim *dim;
-	isl_basic_set *bset;
-	isl_qpolynomial_fold *fold;
-
-	/* output */
-	isl_pw_qpolynomial_fold *pwf;
-	isl_pw_qpolynomial_fold *pwf_tight;
-};
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_coalesce.c b/cloog-0.16.3/isl/isl_coalesce.c
deleted file mode 100644
index 8cb942e..0000000
--- a/cloog-0.16.3/isl/isl_coalesce.c
+++ /dev/null
@@ -1,1294 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France 
- */
-
-#include "isl_map_private.h"
-#include <isl/seq.h>
-#include "isl_tab.h"
-#include <isl_mat_private.h>
-
-#define STATUS_ERROR		-1
-#define STATUS_REDUNDANT	 1
-#define STATUS_VALID	 	 2
-#define STATUS_SEPARATE	 	 3
-#define STATUS_CUT	 	 4
-#define STATUS_ADJ_EQ	 	 5
-#define STATUS_ADJ_INEQ	 	 6
-
-static int status_in(isl_int *ineq, struct isl_tab *tab)
-{
-	enum isl_ineq_type type = isl_tab_ineq_type(tab, ineq);
-	switch (type) {
-	default:
-	case isl_ineq_error:		return STATUS_ERROR;
-	case isl_ineq_redundant:	return STATUS_VALID;
-	case isl_ineq_separate:		return STATUS_SEPARATE;
-	case isl_ineq_cut:		return STATUS_CUT;
-	case isl_ineq_adj_eq:		return STATUS_ADJ_EQ;
-	case isl_ineq_adj_ineq:		return STATUS_ADJ_INEQ;
-	}
-}
-
-/* Compute the position of the equalities of basic map "i"
- * with respect to basic map "j".
- * The resulting array has twice as many entries as the number
- * of equalities corresponding to the two inequalties to which
- * each equality corresponds.
- */
-static int *eq_status_in(struct isl_map *map, int i, int j,
-	struct isl_tab **tabs)
-{
-	int k, l;
-	int *eq = isl_calloc_array(map->ctx, int, 2 * map->p[i]->n_eq);
-	unsigned dim;
-
-	dim = isl_basic_map_total_dim(map->p[i]);
-	for (k = 0; k < map->p[i]->n_eq; ++k) {
-		for (l = 0; l < 2; ++l) {
-			isl_seq_neg(map->p[i]->eq[k], map->p[i]->eq[k], 1+dim);
-			eq[2 * k + l] = status_in(map->p[i]->eq[k], tabs[j]);
-			if (eq[2 * k + l] == STATUS_ERROR)
-				goto error;
-		}
-		if (eq[2 * k] == STATUS_SEPARATE ||
-		    eq[2 * k + 1] == STATUS_SEPARATE)
-			break;
-	}
-
-	return eq;
-error:
-	free(eq);
-	return NULL;
-}
-
-/* Compute the position of the inequalities of basic map "i"
- * with respect to basic map "j".
- */
-static int *ineq_status_in(struct isl_map *map, int i, int j,
-	struct isl_tab **tabs)
-{
-	int k;
-	unsigned n_eq = map->p[i]->n_eq;
-	int *ineq = isl_calloc_array(map->ctx, int, map->p[i]->n_ineq);
-
-	for (k = 0; k < map->p[i]->n_ineq; ++k) {
-		if (isl_tab_is_redundant(tabs[i], n_eq + k)) {
-			ineq[k] = STATUS_REDUNDANT;
-			continue;
-		}
-		ineq[k] = status_in(map->p[i]->ineq[k], tabs[j]);
-		if (ineq[k] == STATUS_ERROR)
-			goto error;
-		if (ineq[k] == STATUS_SEPARATE)
-			break;
-	}
-
-	return ineq;
-error:
-	free(ineq);
-	return NULL;
-}
-
-static int any(int *con, unsigned len, int status)
-{
-	int i;
-
-	for (i = 0; i < len ; ++i)
-		if (con[i] == status)
-			return 1;
-	return 0;
-}
-
-static int count(int *con, unsigned len, int status)
-{
-	int i;
-	int c = 0;
-
-	for (i = 0; i < len ; ++i)
-		if (con[i] == status)
-			c++;
-	return c;
-}
-
-static int all(int *con, unsigned len, int status)
-{
-	int i;
-
-	for (i = 0; i < len ; ++i) {
-		if (con[i] == STATUS_REDUNDANT)
-			continue;
-		if (con[i] != status)
-			return 0;
-	}
-	return 1;
-}
-
-static void drop(struct isl_map *map, int i, struct isl_tab **tabs)
-{
-	isl_basic_map_free(map->p[i]);
-	isl_tab_free(tabs[i]);
-
-	if (i != map->n - 1) {
-		map->p[i] = map->p[map->n - 1];
-		tabs[i] = tabs[map->n - 1];
-	}
-	tabs[map->n - 1] = NULL;
-	map->n--;
-}
-
-/* Replace the pair of basic maps i and j by the basic map bounded
- * by the valid constraints in both basic maps and the constraint
- * in extra (if not NULL).
- */
-static int fuse(struct isl_map *map, int i, int j,
-	struct isl_tab **tabs, int *eq_i, int *ineq_i, int *eq_j, int *ineq_j,
-	__isl_keep isl_mat *extra)
-{
-	int k, l;
-	struct isl_basic_map *fused = NULL;
-	struct isl_tab *fused_tab = NULL;
-	unsigned total = isl_basic_map_total_dim(map->p[i]);
-	unsigned extra_rows = extra ? extra->n_row : 0;
-
-	fused = isl_basic_map_alloc_dim(isl_dim_copy(map->p[i]->dim),
-			map->p[i]->n_div,
-			map->p[i]->n_eq + map->p[j]->n_eq,
-			map->p[i]->n_ineq + map->p[j]->n_ineq + extra_rows);
-	if (!fused)
-		goto error;
-
-	for (k = 0; k < map->p[i]->n_eq; ++k) {
-		if (eq_i && (eq_i[2 * k] != STATUS_VALID ||
-			     eq_i[2 * k + 1] != STATUS_VALID))
-			continue;
-		l = isl_basic_map_alloc_equality(fused);
-		if (l < 0)
-			goto error;
-		isl_seq_cpy(fused->eq[l], map->p[i]->eq[k], 1 + total);
-	}
-
-	for (k = 0; k < map->p[j]->n_eq; ++k) {
-		if (eq_j && (eq_j[2 * k] != STATUS_VALID ||
-			     eq_j[2 * k + 1] != STATUS_VALID))
-			continue;
-		l = isl_basic_map_alloc_equality(fused);
-		if (l < 0)
-			goto error;
-		isl_seq_cpy(fused->eq[l], map->p[j]->eq[k], 1 + total);
-	}
-
-	for (k = 0; k < map->p[i]->n_ineq; ++k) {
-		if (ineq_i[k] != STATUS_VALID)
-			continue;
-		l = isl_basic_map_alloc_inequality(fused);
-		if (l < 0)
-			goto error;
-		isl_seq_cpy(fused->ineq[l], map->p[i]->ineq[k], 1 + total);
-	}
-
-	for (k = 0; k < map->p[j]->n_ineq; ++k) {
-		if (ineq_j[k] != STATUS_VALID)
-			continue;
-		l = isl_basic_map_alloc_inequality(fused);
-		if (l < 0)
-			goto error;
-		isl_seq_cpy(fused->ineq[l], map->p[j]->ineq[k], 1 + total);
-	}
-
-	for (k = 0; k < map->p[i]->n_div; ++k) {
-		int l = isl_basic_map_alloc_div(fused);
-		if (l < 0)
-			goto error;
-		isl_seq_cpy(fused->div[l], map->p[i]->div[k], 1 + 1 + total);
-	}
-
-	for (k = 0; k < extra_rows; ++k) {
-		l = isl_basic_map_alloc_inequality(fused);
-		if (l < 0)
-			goto error;
-		isl_seq_cpy(fused->ineq[l], extra->row[k], 1 + total);
-	}
-
-	fused = isl_basic_map_gauss(fused, NULL);
-	ISL_F_SET(fused, ISL_BASIC_MAP_FINAL);
-	if (ISL_F_ISSET(map->p[i], ISL_BASIC_MAP_RATIONAL) &&
-	    ISL_F_ISSET(map->p[j], ISL_BASIC_MAP_RATIONAL))
-		ISL_F_SET(fused, ISL_BASIC_MAP_RATIONAL);
-
-	fused_tab = isl_tab_from_basic_map(fused);
-	if (isl_tab_detect_redundant(fused_tab) < 0)
-		goto error;
-
-	isl_basic_map_free(map->p[i]);
-	map->p[i] = fused;
-	isl_tab_free(tabs[i]);
-	tabs[i] = fused_tab;
-	drop(map, j, tabs);
-
-	return 1;
-error:
-	isl_tab_free(fused_tab);
-	isl_basic_map_free(fused);
-	return -1;
-}
-
-/* Given a pair of basic maps i and j such that all constraints are either
- * "valid" or "cut", check if the facets corresponding to the "cut"
- * constraints of i lie entirely within basic map j.
- * If so, replace the pair by the basic map consisting of the valid
- * constraints in both basic maps.
- *
- * To see that we are not introducing any extra points, call the
- * two basic maps A and B and the resulting map U and let x
- * be an element of U \setminus ( A \cup B ).
- * Then there is a pair of cut constraints c_1 and c_2 in A and B such that x
- * violates them.  Let X be the intersection of U with the opposites
- * of these constraints.  Then x \in X.
- * The facet corresponding to c_1 contains the corresponding facet of A.
- * This facet is entirely contained in B, so c_2 is valid on the facet.
- * However, since it is also (part of) a facet of X, -c_2 is also valid
- * on the facet.  This means c_2 is saturated on the facet, so c_1 and
- * c_2 must be opposites of each other, but then x could not violate
- * both of them.
- */
-static int check_facets(struct isl_map *map, int i, int j,
-	struct isl_tab **tabs, int *ineq_i, int *ineq_j)
-{
-	int k, l;
-	struct isl_tab_undo *snap;
-	unsigned n_eq = map->p[i]->n_eq;
-
-	snap = isl_tab_snap(tabs[i]);
-
-	for (k = 0; k < map->p[i]->n_ineq; ++k) {
-		if (ineq_i[k] != STATUS_CUT)
-			continue;
-		if (isl_tab_select_facet(tabs[i], n_eq + k) < 0)
-			return -1;
-		for (l = 0; l < map->p[j]->n_ineq; ++l) {
-			int stat;
-			if (ineq_j[l] != STATUS_CUT)
-				continue;
-			stat = status_in(map->p[j]->ineq[l], tabs[i]);
-			if (stat != STATUS_VALID)
-				break;
-		}
-		if (isl_tab_rollback(tabs[i], snap) < 0)
-			return -1;
-		if (l < map->p[j]->n_ineq)
-			break;
-	}
-
-	if (k < map->p[i]->n_ineq)
-		/* BAD CUT PAIR */
-		return 0;
-	return fuse(map, i, j, tabs, NULL, ineq_i, NULL, ineq_j, NULL);
-}
-
-/* Both basic maps have at least one inequality with and adjacent
- * (but opposite) inequality in the other basic map.
- * Check that there are no cut constraints and that there is only
- * a single pair of adjacent inequalities.
- * If so, we can replace the pair by a single basic map described
- * by all but the pair of adjacent inequalities.
- * Any additional points introduced lie strictly between the two
- * adjacent hyperplanes and can therefore be integral.
- *
- *        ____			  _____
- *       /    ||\		 /     \
- *      /     || \		/       \
- *      \     ||  \	=>	\        \
- *       \    ||  /		 \       /
- *        \___||_/		  \_____/
- *
- * The test for a single pair of adjancent inequalities is important
- * for avoiding the combination of two basic maps like the following
- *
- *       /|
- *      / |
- *     /__|
- *         _____
- *         |   |
- *         |   |
- *         |___|
- */
-static int check_adj_ineq(struct isl_map *map, int i, int j,
-	struct isl_tab **tabs, int *ineq_i, int *ineq_j)
-{
-	int changed = 0;
-
-	if (any(ineq_i, map->p[i]->n_ineq, STATUS_CUT) ||
-	    any(ineq_j, map->p[j]->n_ineq, STATUS_CUT))
-		/* ADJ INEQ CUT */
-		;
-	else if (count(ineq_i, map->p[i]->n_ineq, STATUS_ADJ_INEQ) == 1 &&
-		 count(ineq_j, map->p[j]->n_ineq, STATUS_ADJ_INEQ) == 1)
-		changed = fuse(map, i, j, tabs, NULL, ineq_i, NULL, ineq_j, NULL);
-	/* else ADJ INEQ TOO MANY */
-
-	return changed;
-}
-
-/* Check if basic map "i" contains the basic map represented
- * by the tableau "tab".
- */
-static int contains(struct isl_map *map, int i, int *ineq_i,
-	struct isl_tab *tab)
-{
-	int k, l;
-	unsigned dim;
-
-	dim = isl_basic_map_total_dim(map->p[i]);
-	for (k = 0; k < map->p[i]->n_eq; ++k) {
-		for (l = 0; l < 2; ++l) {
-			int stat;
-			isl_seq_neg(map->p[i]->eq[k], map->p[i]->eq[k], 1+dim);
-			stat = status_in(map->p[i]->eq[k], tab);
-			if (stat != STATUS_VALID)
-				return 0;
-		}
-	}
-
-	for (k = 0; k < map->p[i]->n_ineq; ++k) {
-		int stat;
-		if (ineq_i[k] == STATUS_REDUNDANT)
-			continue;
-		stat = status_in(map->p[i]->ineq[k], tab);
-		if (stat != STATUS_VALID)
-			return 0;
-	}
-	return 1;
-}
-
-/* Basic map "i" has an inequality "k" that is adjacent to some equality
- * of basic map "j".  All the other inequalities are valid for "j".
- * Check if basic map "j" forms an extension of basic map "i".
- *
- * In particular, we relax constraint "k", compute the corresponding
- * facet and check whether it is included in the other basic map.
- * If so, we know that relaxing the constraint extends the basic
- * map with exactly the other basic map (we already know that this
- * other basic map is included in the extension, because there
- * were no "cut" inequalities in "i") and we can replace the
- * two basic maps by thie extension.
- *        ____			  _____
- *       /    || 		 /     |
- *      /     ||  		/      |
- *      \     ||   	=>	\      |
- *       \    ||		 \     |
- *        \___||		  \____|
- */
-static int is_extension(struct isl_map *map, int i, int j, int k,
-	struct isl_tab **tabs, int *eq_i, int *ineq_i, int *eq_j, int *ineq_j)
-{
-	int changed = 0;
-	int super;
-	struct isl_tab_undo *snap, *snap2;
-	unsigned n_eq = map->p[i]->n_eq;
-
-	snap = isl_tab_snap(tabs[i]);
-	tabs[i] = isl_tab_relax(tabs[i], n_eq + k);
-	snap2 = isl_tab_snap(tabs[i]);
-	if (isl_tab_select_facet(tabs[i], n_eq + k) < 0)
-		return -1;
-	super = contains(map, j, ineq_j, tabs[i]);
-	if (super) {
-		if (isl_tab_rollback(tabs[i], snap2) < 0)
-			return -1;
-		map->p[i] = isl_basic_map_cow(map->p[i]);
-		if (!map->p[i])
-			return -1;
-		isl_int_add_ui(map->p[i]->ineq[k][0], map->p[i]->ineq[k][0], 1);
-		ISL_F_SET(map->p[i], ISL_BASIC_MAP_FINAL);
-		drop(map, j, tabs);
-		changed = 1;
-	} else
-		if (isl_tab_rollback(tabs[i], snap) < 0)
-			return -1;
-
-	return changed;
-}
-
-/* For each non-redundant constraint in "bmap" (as determined by "tab"),
- * wrap the constraint around "bound" such that it includes the whole
- * set "set" and append the resulting constraint to "wraps".
- * "wraps" is assumed to have been pre-allocated to the appropriate size.
- * wraps->n_row is the number of actual wrapped constraints that have
- * been added.
- * If any of the wrapping problems results in a constraint that is
- * identical to "bound", then this means that "set" is unbounded in such
- * way that no wrapping is possible.  If this happens then wraps->n_row
- * is reset to zero.
- */
-static int add_wraps(__isl_keep isl_mat *wraps, __isl_keep isl_basic_map *bmap,
-	struct isl_tab *tab, isl_int *bound, __isl_keep isl_set *set)
-{
-	int l;
-	int w;
-	unsigned total = isl_basic_map_total_dim(bmap);
-
-	w = wraps->n_row;
-
-	for (l = 0; l < bmap->n_ineq; ++l) {
-		if (isl_seq_is_neg(bound, bmap->ineq[l], 1 + total))
-			continue;
-		if (isl_seq_eq(bound, bmap->ineq[l], 1 + total))
-			continue;
-		if (isl_tab_is_redundant(tab, bmap->n_eq + l))
-			continue;
-
-		isl_seq_cpy(wraps->row[w], bound, 1 + total);
-		if (!isl_set_wrap_facet(set, wraps->row[w], bmap->ineq[l]))
-			return -1;
-		if (isl_seq_eq(wraps->row[w], bound, 1 + total))
-			goto unbounded;
-		++w;
-	}
-	for (l = 0; l < bmap->n_eq; ++l) {
-		if (isl_seq_is_neg(bound, bmap->eq[l], 1 + total))
-			continue;
-		if (isl_seq_eq(bound, bmap->eq[l], 1 + total))
-			continue;
-
-		isl_seq_cpy(wraps->row[w], bound, 1 + total);
-		isl_seq_neg(wraps->row[w + 1], bmap->eq[l], 1 + total);
-		if (!isl_set_wrap_facet(set, wraps->row[w], wraps->row[w + 1]))
-			return -1;
-		if (isl_seq_eq(wraps->row[w], bound, 1 + total))
-			goto unbounded;
-		++w;
-
-		isl_seq_cpy(wraps->row[w], bound, 1 + total);
-		if (!isl_set_wrap_facet(set, wraps->row[w], bmap->eq[l]))
-			return -1;
-		if (isl_seq_eq(wraps->row[w], bound, 1 + total))
-			goto unbounded;
-		++w;
-	}
-
-	wraps->n_row = w;
-	return 0;
-unbounded:
-	wraps->n_row = 0;
-	return 0;
-}
-
-/* Check if the constraints in "wraps" from "first" until the last
- * are all valid for the basic set represented by "tab".
- * If not, wraps->n_row is set to zero.
- */
-static int check_wraps(__isl_keep isl_mat *wraps, int first,
-	struct isl_tab *tab)
-{
-	int i;
-
-	for (i = first; i < wraps->n_row; ++i) {
-		enum isl_ineq_type type;
-		type = isl_tab_ineq_type(tab, wraps->row[i]);
-		if (type == isl_ineq_error)
-			return -1;
-		if (type == isl_ineq_redundant)
-			continue;
-		wraps->n_row = 0;
-		return 0;
-	}
-
-	return 0;
-}
-
-/* Return a set that corresponds to the non-redudant constraints
- * (as recorded in tab) of bmap.
- *
- * It's important to remove the redundant constraints as some
- * of the other constraints may have been modified after the
- * constraints were marked redundant.
- * In particular, a constraint may have been relaxed.
- * Redundant constraints are ignored when a constraint is relaxed
- * and should therefore continue to be ignored ever after.
- * Otherwise, the relaxation might be thwarted by some of
- * these constraints.
- */
-static __isl_give isl_set *set_from_updated_bmap(__isl_keep isl_basic_map *bmap,
-	struct isl_tab *tab)
-{
-	bmap = isl_basic_map_copy(bmap);
-	bmap = isl_basic_map_cow(bmap);
-	bmap = isl_basic_map_update_from_tab(bmap, tab);
-	return isl_set_from_basic_set(isl_basic_map_underlying_set(bmap));
-}
-
-/* Given a basic set i with a constraint k that is adjacent to either the
- * whole of basic set j or a facet of basic set j, check if we can wrap
- * both the facet corresponding to k and the facet of j (or the whole of j)
- * around their ridges to include the other set.
- * If so, replace the pair of basic sets by their union.
- *
- * All constraints of i (except k) are assumed to be valid for j.
- *
- * However, the constraints of j may not be valid for i and so
- * we have to check that the wrapping constraints for j are valid for i.
- *
- * In the case where j has a facet adjacent to i, tab[j] is assumed
- * to have been restricted to this facet, so that the non-redundant
- * constraints in tab[j] are the ridges of the facet.
- * Note that for the purpose of wrapping, it does not matter whether
- * we wrap the ridges of i around the whole of j or just around
- * the facet since all the other constraints are assumed to be valid for j.
- * In practice, we wrap to include the whole of j.
- *        ____			  _____
- *       /    | 		 /     \
- *      /     ||  		/      |
- *      \     ||   	=>	\      |
- *       \    ||		 \     |
- *        \___||		  \____|
- *
- */
-static int can_wrap_in_facet(struct isl_map *map, int i, int j, int k,
-	struct isl_tab **tabs, int *eq_i, int *ineq_i, int *eq_j, int *ineq_j)
-{
-	int changed = 0;
-	struct isl_mat *wraps = NULL;
-	struct isl_set *set_i = NULL;
-	struct isl_set *set_j = NULL;
-	struct isl_vec *bound = NULL;
-	unsigned total = isl_basic_map_total_dim(map->p[i]);
-	struct isl_tab_undo *snap;
-	int n;
-
-	set_i = set_from_updated_bmap(map->p[i], tabs[i]);
-	set_j = set_from_updated_bmap(map->p[j], tabs[j]);
-	wraps = isl_mat_alloc(map->ctx, 2 * (map->p[i]->n_eq + map->p[j]->n_eq) +
-					map->p[i]->n_ineq + map->p[j]->n_ineq,
-					1 + total);
-	bound = isl_vec_alloc(map->ctx, 1 + total);
-	if (!set_i || !set_j || !wraps || !bound)
-		goto error;
-
-	isl_seq_cpy(bound->el, map->p[i]->ineq[k], 1 + total);
-	isl_int_add_ui(bound->el[0], bound->el[0], 1);
-
-	isl_seq_cpy(wraps->row[0], bound->el, 1 + total);
-	wraps->n_row = 1;
-
-	if (add_wraps(wraps, map->p[j], tabs[j], bound->el, set_i) < 0)
-		goto error;
-	if (!wraps->n_row)
-		goto unbounded;
-
-	snap = isl_tab_snap(tabs[i]);
-
-	if (isl_tab_select_facet(tabs[i], map->p[i]->n_eq + k) < 0)
-		goto error;
-	if (isl_tab_detect_redundant(tabs[i]) < 0)
-		goto error;
-
-	isl_seq_neg(bound->el, map->p[i]->ineq[k], 1 + total);
-
-	n = wraps->n_row;
-	if (add_wraps(wraps, map->p[i], tabs[i], bound->el, set_j) < 0)
-		goto error;
-
-	if (isl_tab_rollback(tabs[i], snap) < 0)
-		goto error;
-	if (check_wraps(wraps, n, tabs[i]) < 0)
-		goto error;
-	if (!wraps->n_row)
-		goto unbounded;
-
-	changed = fuse(map, i, j, tabs, eq_i, ineq_i, eq_j, ineq_j, wraps);
-
-unbounded:
-	isl_mat_free(wraps);
-
-	isl_set_free(set_i);
-	isl_set_free(set_j);
-
-	isl_vec_free(bound);
-
-	return changed;
-error:
-	isl_vec_free(bound);
-	isl_mat_free(wraps);
-	isl_set_free(set_i);
-	isl_set_free(set_j);
-	return -1;
-}
-
-/* Set the is_redundant property of the "n" constraints in "cuts",
- * except "k" to "v".
- * This is a fairly tricky operation as it bypasses isl_tab.c.
- * The reason we want to temporarily mark some constraints redundant
- * is that we want to ignore them in add_wraps.
- *
- * Initially all cut constraints are non-redundant, but the
- * selection of a facet right before the call to this function
- * may have made some of them redundant.
- * Likewise, the same constraints are marked non-redundant
- * in the second call to this function, before they are officially
- * made non-redundant again in the subsequent rollback.
- */
-static void set_is_redundant(struct isl_tab *tab, unsigned n_eq,
-	int *cuts, int n, int k, int v)
-{
-	int l;
-
-	for (l = 0; l < n; ++l) {
-		if (l == k)
-			continue;
-		tab->con[n_eq + cuts[l]].is_redundant = v;
-	}
-}
-
-/* Given a pair of basic maps i and j such that j sticks out
- * of i at n cut constraints, each time by at most one,
- * try to compute wrapping constraints and replace the two
- * basic maps by a single basic map.
- * The other constraints of i are assumed to be valid for j.
- *
- * The facets of i corresponding to the cut constraints are
- * wrapped around their ridges, except those ridges determined
- * by any of the other cut constraints.
- * The intersections of cut constraints need to be ignored
- * as the result of wrapping one cut constraint around another
- * would result in a constraint cutting the union.
- * In each case, the facets are wrapped to include the union
- * of the two basic maps.
- *
- * The pieces of j that lie at an offset of exactly one from
- * one of the cut constraints of i are wrapped around their edges.
- * Here, there is no need to ignore intersections because we
- * are wrapping around the union of the two basic maps.
- *
- * If any wrapping fails, i.e., if we cannot wrap to touch
- * the union, then we give up.
- * Otherwise, the pair of basic maps is replaced by their union.
- */
-static int wrap_in_facets(struct isl_map *map, int i, int j,
-	int *cuts, int n, struct isl_tab **tabs,
-	int *eq_i, int *ineq_i, int *eq_j, int *ineq_j)
-{
-	int changed = 0;
-	isl_mat *wraps = NULL;
-	isl_set *set = NULL;
-	isl_vec *bound = NULL;
-	unsigned total = isl_basic_map_total_dim(map->p[i]);
-	int max_wrap;
-	int k;
-	struct isl_tab_undo *snap_i, *snap_j;
-
-	if (isl_tab_extend_cons(tabs[j], 1) < 0)
-		goto error;
-
-	max_wrap = 2 * (map->p[i]->n_eq + map->p[j]->n_eq) +
-		    map->p[i]->n_ineq + map->p[j]->n_ineq;
-	max_wrap *= n;
-
-	set = isl_set_union(set_from_updated_bmap(map->p[i], tabs[i]),
-			    set_from_updated_bmap(map->p[j], tabs[j]));
-	wraps = isl_mat_alloc(map->ctx, max_wrap, 1 + total);
-	bound = isl_vec_alloc(map->ctx, 1 + total);
-	if (!set || !wraps || !bound)
-		goto error;
-
-	snap_i = isl_tab_snap(tabs[i]);
-	snap_j = isl_tab_snap(tabs[j]);
-
-	wraps->n_row = 0;
-
-	for (k = 0; k < n; ++k) {
-		if (isl_tab_select_facet(tabs[i], map->p[i]->n_eq + cuts[k]) < 0)
-			goto error;
-		if (isl_tab_detect_redundant(tabs[i]) < 0)
-			goto error;
-		set_is_redundant(tabs[i], map->p[i]->n_eq, cuts, n, k, 1);
-
-		isl_seq_neg(bound->el, map->p[i]->ineq[cuts[k]], 1 + total);
-		if (add_wraps(wraps, map->p[i], tabs[i], bound->el, set) < 0)
-			goto error;
-
-		set_is_redundant(tabs[i], map->p[i]->n_eq, cuts, n, k, 0);
-		if (isl_tab_rollback(tabs[i], snap_i) < 0)
-			goto error;
-
-		if (!wraps->n_row)
-			break;
-
-		isl_seq_cpy(bound->el, map->p[i]->ineq[cuts[k]], 1 + total);
-		isl_int_add_ui(bound->el[0], bound->el[0], 1);
-		if (isl_tab_add_eq(tabs[j], bound->el) < 0)
-			goto error;
-		if (isl_tab_detect_redundant(tabs[j]) < 0)
-			goto error;
-
-		if (!tabs[j]->empty &&
-		    add_wraps(wraps, map->p[j], tabs[j], bound->el, set) < 0)
-			goto error;
-
-		if (isl_tab_rollback(tabs[j], snap_j) < 0)
-			goto error;
-
-		if (!wraps->n_row)
-			break;
-	}
-
-	if (k == n)
-		changed = fuse(map, i, j, tabs,
-				eq_i, ineq_i, eq_j, ineq_j, wraps);
-
-	isl_vec_free(bound);
-	isl_mat_free(wraps);
-	isl_set_free(set);
-
-	return changed;
-error:
-	isl_vec_free(bound);
-	isl_mat_free(wraps);
-	isl_set_free(set);
-	return -1;
-}
-
-/* Given two basic sets i and j such that i has no cut equalities,
- * check if relaxing all the cut inequalities of i by one turns
- * them into valid constraint for j and check if we can wrap in
- * the bits that are sticking out.
- * If so, replace the pair by their union.
- *
- * We first check if all relaxed cut inequalities of i are valid for j
- * and then try to wrap in the intersections of the relaxed cut inequalities
- * with j.
- *
- * During this wrapping, we consider the points of j that lie at a distance
- * of exactly 1 from i.  In particular, we ignore the points that lie in
- * between this lower-dimensional space and the basic map i.
- * We can therefore only apply this to integer maps.
- *        ____			  _____
- *       / ___|_		 /     \
- *      / |    |  		/      |
- *      \ |    |   	=>	\      |
- *       \|____|		 \     |
- *        \___| 		  \____/
- *
- *	 _____			 ______
- *	| ____|_		|      \
- *	| |     |		|       |
- *	| |	|	=>	|       |
- *	|_|     |		|       |
- *	  |_____|		 \______|
- *
- *	 _______
- *	|       |
- *	|  |\   |
- *	|  | \  |
- *	|  |  \ |
- *	|  |   \|
- *	|  |    \
- *	|  |_____\
- *	|       |
- *	|_______|
- *
- * Wrapping can fail if the result of wrapping one of the facets
- * around its edges does not produce any new facet constraint.
- * In particular, this happens when we try to wrap in unbounded sets.
- *
- *	 _______________________________________________________________________
- *	|
- *	|  ___
- *	| |   |
- *	|_|   |_________________________________________________________________
- *	  |___|
- *
- * The following is not an acceptable result of coalescing the above two
- * sets as it includes extra integer points.
- *	 _______________________________________________________________________
- *	|
- *	|     
- *	|      
- *	|
- *	 \______________________________________________________________________
- */
-static int can_wrap_in_set(struct isl_map *map, int i, int j,
-	struct isl_tab **tabs, int *eq_i, int *ineq_i, int *eq_j, int *ineq_j)
-{
-	int changed = 0;
-	int k, m;
-	int n;
-	int *cuts = NULL;
-
-	if (ISL_F_ISSET(map->p[i], ISL_BASIC_MAP_RATIONAL) ||
-	    ISL_F_ISSET(map->p[j], ISL_BASIC_MAP_RATIONAL))
-		return 0;
-
-	n = count(ineq_i, map->p[i]->n_ineq, STATUS_CUT);
-	if (n == 0)
-		return 0;
-
-	cuts = isl_alloc_array(map->ctx, int, n);
-	if (!cuts)
-		return -1;
-
-	for (k = 0, m = 0; m < n; ++k) {
-		enum isl_ineq_type type;
-
-		if (ineq_i[k] != STATUS_CUT)
-			continue;
-
-		isl_int_add_ui(map->p[i]->ineq[k][0], map->p[i]->ineq[k][0], 1);
-		type = isl_tab_ineq_type(tabs[j], map->p[i]->ineq[k]);
-		isl_int_sub_ui(map->p[i]->ineq[k][0], map->p[i]->ineq[k][0], 1);
-		if (type == isl_ineq_error)
-			goto error;
-		if (type != isl_ineq_redundant)
-			break;
-		cuts[m] = k;
-		++m;
-	}
-
-	if (m == n)
-		changed = wrap_in_facets(map, i, j, cuts, n, tabs,
-					 eq_i, ineq_i, eq_j, ineq_j);
-
-	free(cuts);
-
-	return changed;
-error:
-	free(cuts);
-	return -1;
-}
-
-/* Check if either i or j has a single cut constraint that can
- * be used to wrap in (a facet of) the other basic set.
- * if so, replace the pair by their union.
- */
-static int check_wrap(struct isl_map *map, int i, int j,
-	struct isl_tab **tabs, int *eq_i, int *ineq_i, int *eq_j, int *ineq_j)
-{
-	int changed = 0;
-
-	if (!any(eq_i, 2 * map->p[i]->n_eq, STATUS_CUT))
-		changed = can_wrap_in_set(map, i, j, tabs,
-					    eq_i, ineq_i, eq_j, ineq_j);
-	if (changed)
-		return changed;
-
-	if (!any(eq_j, 2 * map->p[j]->n_eq, STATUS_CUT))
-		changed = can_wrap_in_set(map, j, i, tabs,
-					    eq_j, ineq_j, eq_i, ineq_i);
-	return changed;
-}
-
-/* At least one of the basic maps has an equality that is adjacent
- * to inequality.  Make sure that only one of the basic maps has
- * such an equality and that the other basic map has exactly one
- * inequality adjacent to an equality.
- * We call the basic map that has the inequality "i" and the basic
- * map that has the equality "j".
- * If "i" has any "cut" (in)equality, then relaxing the inequality
- * by one would not result in a basic map that contains the other
- * basic map.
- */
-static int check_adj_eq(struct isl_map *map, int i, int j,
-	struct isl_tab **tabs, int *eq_i, int *ineq_i, int *eq_j, int *ineq_j)
-{
-	int changed = 0;
-	int k;
-
-	if (any(eq_i, 2 * map->p[i]->n_eq, STATUS_ADJ_INEQ) &&
-	    any(eq_j, 2 * map->p[j]->n_eq, STATUS_ADJ_INEQ))
-		/* ADJ EQ TOO MANY */
-		return 0;
-
-	if (any(eq_i, 2 * map->p[i]->n_eq, STATUS_ADJ_INEQ))
-		return check_adj_eq(map, j, i, tabs,
-					eq_j, ineq_j, eq_i, ineq_i);
-
-	/* j has an equality adjacent to an inequality in i */
-
-	if (any(eq_i, 2 * map->p[i]->n_eq, STATUS_CUT))
-		return 0;
-	if (any(ineq_i, map->p[i]->n_ineq, STATUS_CUT))
-		/* ADJ EQ CUT */
-		return 0;
-	if (count(ineq_i, map->p[i]->n_ineq, STATUS_ADJ_EQ) != 1 ||
-	    any(ineq_j, map->p[j]->n_ineq, STATUS_ADJ_EQ) ||
-	    any(ineq_i, map->p[i]->n_ineq, STATUS_ADJ_INEQ) ||
-	    any(ineq_j, map->p[j]->n_ineq, STATUS_ADJ_INEQ))
-		/* ADJ EQ TOO MANY */
-		return 0;
-
-	for (k = 0; k < map->p[i]->n_ineq ; ++k)
-		if (ineq_i[k] == STATUS_ADJ_EQ)
-			break;
-
-	changed = is_extension(map, i, j, k, tabs, eq_i, ineq_i, eq_j, ineq_j);
-	if (changed)
-		return changed;
-
-	if (count(eq_j, 2 * map->p[j]->n_eq, STATUS_ADJ_INEQ) != 1)
-		return 0;
-
-	changed = can_wrap_in_facet(map, i, j, k, tabs, eq_i, ineq_i, eq_j, ineq_j);
-
-	return changed;
-}
-
-/* The two basic maps lie on adjacent hyperplanes.  In particular,
- * basic map "i" has an equality that lies parallel to basic map "j".
- * Check if we can wrap the facets around the parallel hyperplanes
- * to include the other set.
- *
- * We perform basically the same operations as can_wrap_in_facet,
- * except that we don't need to select a facet of one of the sets.
- *				_
- *	\\			\\
- *	 \\		=>	 \\
- *	  \			  \|
- *
- * We only allow one equality of "i" to be adjacent to an equality of "j"
- * to avoid coalescing
- *
- *	[m, n] -> { [x, y] -> [x, 1 + y] : x >= 1 and y >= 1 and
- *					    x <= 10 and y <= 10;
- *		    [x, y] -> [1 + x, y] : x >= 1 and x <= 20 and
- *					    y >= 5 and y <= 15 }
- *
- * to
- *
- *	[m, n] -> { [x, y] -> [x2, y2] : x >= 1 and 10y2 <= 20 - x + 10y and
- *					4y2 >= 5 + 3y and 5y2 <= 15 + 4y and
- *					y2 <= 1 + x + y - x2 and y2 >= y and
- *					y2 >= 1 + x + y - x2 }
- */
-static int check_eq_adj_eq(struct isl_map *map, int i, int j,
-	struct isl_tab **tabs, int *eq_i, int *ineq_i, int *eq_j, int *ineq_j)
-{
-	int k;
-	int changed = 0;
-	struct isl_mat *wraps = NULL;
-	struct isl_set *set_i = NULL;
-	struct isl_set *set_j = NULL;
-	struct isl_vec *bound = NULL;
-	unsigned total = isl_basic_map_total_dim(map->p[i]);
-
-	if (count(eq_i, 2 * map->p[i]->n_eq, STATUS_ADJ_EQ) != 1)
-		return 0;
-
-	for (k = 0; k < 2 * map->p[i]->n_eq ; ++k)
-		if (eq_i[k] == STATUS_ADJ_EQ)
-			break;
-
-	set_i = set_from_updated_bmap(map->p[i], tabs[i]);
-	set_j = set_from_updated_bmap(map->p[j], tabs[j]);
-	wraps = isl_mat_alloc(map->ctx, 2 * (map->p[i]->n_eq + map->p[j]->n_eq) +
-					map->p[i]->n_ineq + map->p[j]->n_ineq,
-					1 + total);
-	bound = isl_vec_alloc(map->ctx, 1 + total);
-	if (!set_i || !set_j || !wraps || !bound)
-		goto error;
-
-	if (k % 2 == 0)
-		isl_seq_neg(bound->el, map->p[i]->eq[k / 2], 1 + total);
-	else
-		isl_seq_cpy(bound->el, map->p[i]->eq[k / 2], 1 + total);
-	isl_int_add_ui(bound->el[0], bound->el[0], 1);
-
-	isl_seq_cpy(wraps->row[0], bound->el, 1 + total);
-	wraps->n_row = 1;
-
-	if (add_wraps(wraps, map->p[j], tabs[j], bound->el, set_i) < 0)
-		goto error;
-	if (!wraps->n_row)
-		goto unbounded;
-
-	isl_int_sub_ui(bound->el[0], bound->el[0], 1);
-	isl_seq_neg(bound->el, bound->el, 1 + total);
-
-	isl_seq_cpy(wraps->row[wraps->n_row], bound->el, 1 + total);
-	wraps->n_row++;
-
-	if (add_wraps(wraps, map->p[i], tabs[i], bound->el, set_j) < 0)
-		goto error;
-	if (!wraps->n_row)
-		goto unbounded;
-
-	changed = fuse(map, i, j, tabs, eq_i, ineq_i, eq_j, ineq_j, wraps);
-
-	if (0) {
-error:		changed = -1;
-	}
-unbounded:
-
-	isl_mat_free(wraps);
-	isl_set_free(set_i);
-	isl_set_free(set_j);
-	isl_vec_free(bound);
-
-	return changed;
-}
-
-/* Check if the union of the given pair of basic maps
- * can be represented by a single basic map.
- * If so, replace the pair by the single basic map and return 1.
- * Otherwise, return 0;
- *
- * We first check the effect of each constraint of one basic map
- * on the other basic map.
- * The constraint may be
- *	redundant	the constraint is redundant in its own
- *			basic map and should be ignore and removed
- *			in the end
- *	valid		all (integer) points of the other basic map
- *			satisfy the constraint
- *	separate	no (integer) point of the other basic map
- *			satisfies the constraint
- *	cut		some but not all points of the other basic map
- *			satisfy the constraint
- *	adj_eq		the given constraint is adjacent (on the outside)
- *			to an equality of the other basic map
- *	adj_ineq	the given constraint is adjacent (on the outside)
- *			to an inequality of the other basic map
- *
- * We consider seven cases in which we can replace the pair by a single
- * basic map.  We ignore all "redundant" constraints.
- *
- *	1. all constraints of one basic map are valid
- *		=> the other basic map is a subset and can be removed
- *
- *	2. all constraints of both basic maps are either "valid" or "cut"
- *	   and the facets corresponding to the "cut" constraints
- *	   of one of the basic maps lies entirely inside the other basic map
- *		=> the pair can be replaced by a basic map consisting
- *		   of the valid constraints in both basic maps
- *
- *	3. there is a single pair of adjacent inequalities
- *	   (all other constraints are "valid")
- *		=> the pair can be replaced by a basic map consisting
- *		   of the valid constraints in both basic maps
- *
- *	4. there is a single adjacent pair of an inequality and an equality,
- *	   the other constraints of the basic map containing the inequality are
- *	   "valid".  Moreover, if the inequality the basic map is relaxed
- *	   and then turned into an equality, then resulting facet lies
- *	   entirely inside the other basic map
- *		=> the pair can be replaced by the basic map containing
- *		   the inequality, with the inequality relaxed.
- *
- *	5. there is a single adjacent pair of an inequality and an equality,
- *	   the other constraints of the basic map containing the inequality are
- *	   "valid".  Moreover, the facets corresponding to both
- *	   the inequality and the equality can be wrapped around their
- *	   ridges to include the other basic map
- *		=> the pair can be replaced by a basic map consisting
- *		   of the valid constraints in both basic maps together
- *		   with all wrapping constraints
- *
- *	6. one of the basic maps extends beyond the other by at most one.
- *	   Moreover, the facets corresponding to the cut constraints and
- *	   the pieces of the other basic map at offset one from these cut
- *	   constraints can be wrapped around their ridges to include
- *	   the union of the two basic maps
- *		=> the pair can be replaced by a basic map consisting
- *		   of the valid constraints in both basic maps together
- *		   with all wrapping constraints
- *
- *	7. the two basic maps live in adjacent hyperplanes.  In principle
- *	   such sets can always be combined through wrapping, but we impose
- *	   that there is only one such pair, to avoid overeager coalescing.
- *
- * Throughout the computation, we maintain a collection of tableaus
- * corresponding to the basic maps.  When the basic maps are dropped
- * or combined, the tableaus are modified accordingly.
- */
-static int coalesce_pair(struct isl_map *map, int i, int j,
-	struct isl_tab **tabs)
-{
-	int changed = 0;
-	int *eq_i = NULL;
-	int *eq_j = NULL;
-	int *ineq_i = NULL;
-	int *ineq_j = NULL;
-
-	eq_i = eq_status_in(map, i, j, tabs);
-	if (!eq_i)
-		goto error;
-	if (any(eq_i, 2 * map->p[i]->n_eq, STATUS_ERROR))
-		goto error;
-	if (any(eq_i, 2 * map->p[i]->n_eq, STATUS_SEPARATE))
-		goto done;
-
-	eq_j = eq_status_in(map, j, i, tabs);
-	if (!eq_j)
-		goto error;
-	if (any(eq_j, 2 * map->p[j]->n_eq, STATUS_ERROR))
-		goto error;
-	if (any(eq_j, 2 * map->p[j]->n_eq, STATUS_SEPARATE))
-		goto done;
-
-	ineq_i = ineq_status_in(map, i, j, tabs);
-	if (!ineq_i)
-		goto error;
-	if (any(ineq_i, map->p[i]->n_ineq, STATUS_ERROR))
-		goto error;
-	if (any(ineq_i, map->p[i]->n_ineq, STATUS_SEPARATE))
-		goto done;
-
-	ineq_j = ineq_status_in(map, j, i, tabs);
-	if (!ineq_j)
-		goto error;
-	if (any(ineq_j, map->p[j]->n_ineq, STATUS_ERROR))
-		goto error;
-	if (any(ineq_j, map->p[j]->n_ineq, STATUS_SEPARATE))
-		goto done;
-
-	if (all(eq_i, 2 * map->p[i]->n_eq, STATUS_VALID) &&
-	    all(ineq_i, map->p[i]->n_ineq, STATUS_VALID)) {
-		drop(map, j, tabs);
-		changed = 1;
-	} else if (all(eq_j, 2 * map->p[j]->n_eq, STATUS_VALID) &&
-		   all(ineq_j, map->p[j]->n_ineq, STATUS_VALID)) {
-		drop(map, i, tabs);
-		changed = 1;
-	} else if (any(eq_i, 2 * map->p[i]->n_eq, STATUS_ADJ_EQ)) {
-		changed = check_eq_adj_eq(map, i, j, tabs,
-					eq_i, ineq_i, eq_j, ineq_j);
-	} else if (any(eq_j, 2 * map->p[j]->n_eq, STATUS_ADJ_EQ)) {
-		changed = check_eq_adj_eq(map, j, i, tabs,
-					eq_j, ineq_j, eq_i, ineq_i);
-	} else if (any(eq_i, 2 * map->p[i]->n_eq, STATUS_ADJ_INEQ) ||
-		   any(eq_j, 2 * map->p[j]->n_eq, STATUS_ADJ_INEQ)) {
-		changed = check_adj_eq(map, i, j, tabs,
-					eq_i, ineq_i, eq_j, ineq_j);
-	} else if (any(ineq_i, map->p[i]->n_ineq, STATUS_ADJ_EQ) ||
-		   any(ineq_j, map->p[j]->n_ineq, STATUS_ADJ_EQ)) {
-		/* Can't happen */
-		/* BAD ADJ INEQ */
-	} else if (any(ineq_i, map->p[i]->n_ineq, STATUS_ADJ_INEQ) ||
-		   any(ineq_j, map->p[j]->n_ineq, STATUS_ADJ_INEQ)) {
-		if (!any(eq_i, 2 * map->p[i]->n_eq, STATUS_CUT) &&
-		    !any(eq_j, 2 * map->p[j]->n_eq, STATUS_CUT))
-			changed = check_adj_ineq(map, i, j, tabs,
-						 ineq_i, ineq_j);
-	} else {
-		if (!any(eq_i, 2 * map->p[i]->n_eq, STATUS_CUT) &&
-		    !any(eq_j, 2 * map->p[j]->n_eq, STATUS_CUT))
-			changed = check_facets(map, i, j, tabs, ineq_i, ineq_j);
-		if (!changed)
-			changed = check_wrap(map, i, j, tabs,
-						eq_i, ineq_i, eq_j, ineq_j);
-	}
-
-done:
-	free(eq_i);
-	free(eq_j);
-	free(ineq_i);
-	free(ineq_j);
-	return changed;
-error:
-	free(eq_i);
-	free(eq_j);
-	free(ineq_i);
-	free(ineq_j);
-	return -1;
-}
-
-static struct isl_map *coalesce(struct isl_map *map, struct isl_tab **tabs)
-{
-	int i, j;
-
-	for (i = map->n - 2; i >= 0; --i)
-restart:
-		for (j = i + 1; j < map->n; ++j) {
-			int changed;
-			changed = coalesce_pair(map, i, j, tabs);
-			if (changed < 0)
-				goto error;
-			if (changed)
-				goto restart;
-		}
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/* For each pair of basic maps in the map, check if the union of the two
- * can be represented by a single basic map.
- * If so, replace the pair by the single basic map and start over.
- */
-struct isl_map *isl_map_coalesce(struct isl_map *map)
-{
-	int i;
-	unsigned n;
-	struct isl_tab **tabs = NULL;
-
-	if (!map)
-		return NULL;
-
-	if (map->n <= 1)
-		return map;
-
-	map = isl_map_align_divs(map);
-
-	tabs = isl_calloc_array(map->ctx, struct isl_tab *, map->n);
-	if (!tabs)
-		goto error;
-
-	n = map->n;
-	for (i = 0; i < map->n; ++i) {
-		tabs[i] = isl_tab_from_basic_map(map->p[i]);
-		if (!tabs[i])
-			goto error;
-		if (!ISL_F_ISSET(map->p[i], ISL_BASIC_MAP_NO_IMPLICIT))
-			if (isl_tab_detect_implicit_equalities(tabs[i]) < 0)
-				goto error;
-		if (!ISL_F_ISSET(map->p[i], ISL_BASIC_MAP_NO_REDUNDANT))
-			if (isl_tab_detect_redundant(tabs[i]) < 0)
-				goto error;
-	}
-	for (i = map->n - 1; i >= 0; --i)
-		if (tabs[i]->empty)
-			drop(map, i, tabs);
-
-	map = coalesce(map, tabs);
-
-	if (map)
-		for (i = 0; i < map->n; ++i) {
-			map->p[i] = isl_basic_map_update_from_tab(map->p[i],
-								    tabs[i]);
-			map->p[i] = isl_basic_map_finalize(map->p[i]);
-			if (!map->p[i])
-				goto error;
-			ISL_F_SET(map->p[i], ISL_BASIC_MAP_NO_IMPLICIT);
-			ISL_F_SET(map->p[i], ISL_BASIC_MAP_NO_REDUNDANT);
-		}
-
-	for (i = 0; i < n; ++i)
-		isl_tab_free(tabs[i]);
-
-	free(tabs);
-
-	return map;
-error:
-	if (tabs)
-		for (i = 0; i < n; ++i)
-			isl_tab_free(tabs[i]);
-	free(tabs);
-	isl_map_free(map);
-	return NULL;
-}
-
-/* For each pair of basic sets in the set, check if the union of the two
- * can be represented by a single basic set.
- * If so, replace the pair by the single basic set and start over.
- */
-struct isl_set *isl_set_coalesce(struct isl_set *set)
-{
-	return (struct isl_set *)isl_map_coalesce((struct isl_map *)set);
-}
diff --git a/cloog-0.16.3/isl/isl_config.h.in b/cloog-0.16.3/isl/isl_config.h.in
deleted file mode 100644
index b63f626..0000000
--- a/cloog-0.16.3/isl/isl_config.h.in
+++ /dev/null
@@ -1,100 +0,0 @@
-/* isl_config.h.in.  Generated from configure.ac by autoheader.  */
-
-/* most gcc compilers know a function __attribute__((__warn_unused_result__))
-   */
-#undef GCC_WARN_UNUSED_RESULT
-
-/* Define to 1 if you have the declaration of `ffs', and to 0 if you don't. */
-#undef HAVE_DECL_FFS
-
-/* Define to 1 if you have the declaration of `mp_get_memory_functions', and
-   to 0 if you don't. */
-#undef HAVE_DECL_MP_GET_MEMORY_FUNCTIONS
-
-/* Define to 1 if you have the declaration of `__builtin_ffs', and to 0 if you
-   don't. */
-#undef HAVE_DECL___BUILTIN_FFS
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#undef HAVE_DLFCN_H
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* define if your compiler has __attribute__ */
-#undef HAVE___ATTRIBUTE__
-
-/* piplib is available */
-#undef ISL_PIPLIB
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
-   */
-#undef LT_OBJDIR
-
-/* Name of package */
-#undef PACKAGE
-
-/* Define to the address where bug reports for this package should be sent. */
-#undef PACKAGE_BUGREPORT
-
-/* Define to the full name of this package. */
-#undef PACKAGE_NAME
-
-/* Define to the full name and version of this package. */
-#undef PACKAGE_STRING
-
-/* Define to the one symbol short name of this package. */
-#undef PACKAGE_TARNAME
-
-/* Define to the home page for this package. */
-#undef PACKAGE_URL
-
-/* Define to the version of this package. */
-#undef PACKAGE_VERSION
-
-/* The size of `char', as computed by sizeof. */
-#undef SIZEOF_CHAR
-
-/* The size of `int', as computed by sizeof. */
-#undef SIZEOF_INT
-
-/* The size of `long', as computed by sizeof. */
-#undef SIZEOF_LONG
-
-/* The size of `short', as computed by sizeof. */
-#undef SIZEOF_SHORT
-
-/* The size of `void*', as computed by sizeof. */
-#undef SIZEOF_VOIDP
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Version number of package */
-#undef VERSION
-
-#include <isl_config_post.h>
diff --git a/cloog-0.16.3/isl/isl_config_post.h b/cloog-0.16.3/isl/isl_config_post.h
deleted file mode 100644
index a9c23f4..0000000
--- a/cloog-0.16.3/isl/isl_config_post.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef HAVE___ATTRIBUTE__
-#define __attribute__(x)
-#endif
-
-#if (HAVE_DECL_FFS==0) && (HAVE_DECL___BUILTIN_FFS==1)
-# define ffs __builtin_ffs
-#endif
diff --git a/cloog-0.16.3/isl/isl_constraint.c b/cloog-0.16.3/isl/isl_constraint.c
deleted file mode 100644
index 7c4b778..0000000
--- a/cloog-0.16.3/isl/isl_constraint.c
+++ /dev/null
@@ -1,1181 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France 
- */
-
-#include <isl_map_private.h>
-#include <isl_constraint_private.h>
-#include <isl_dim_private.h>
-#include <isl_div_private.h>
-#include <isl/seq.h>
-#include <isl_aff_private.h>
-
-isl_ctx *isl_constraint_get_ctx(__isl_keep isl_constraint *c)
-{
-	return c ? c->ctx : NULL;
-}
-
-static unsigned n(struct isl_constraint *c, enum isl_dim_type type)
-{
-	return isl_basic_map_dim(c->bmap, type);
-}
-
-static unsigned offset(struct isl_constraint *c, enum isl_dim_type type)
-{
-	struct isl_dim *dim = c->bmap->dim;
-	switch (type) {
-	case isl_dim_param:	return 1;
-	case isl_dim_in:	return 1 + dim->nparam;
-	case isl_dim_out:	return 1 + dim->nparam + dim->n_in;
-	case isl_dim_div:	return 1 + dim->nparam + dim->n_in + dim->n_out;
-	default:		return 0;
-	}
-}
-
-static unsigned basic_map_offset(__isl_keep isl_basic_map *bmap,
-							enum isl_dim_type type)
-{
-	return type == isl_dim_div ? 1 + isl_dim_total(bmap->dim)
-				   : 1 + isl_dim_offset(bmap->dim, type);
-}
-
-static unsigned basic_set_offset(struct isl_basic_set *bset,
-							enum isl_dim_type type)
-{
-	struct isl_dim *dim = bset->dim;
-	switch (type) {
-	case isl_dim_param:	return 1;
-	case isl_dim_in:	return 1 + dim->nparam;
-	case isl_dim_out:	return 1 + dim->nparam + dim->n_in;
-	case isl_dim_div:	return 1 + dim->nparam + dim->n_in + dim->n_out;
-	default:		return 0;
-	}
-}
-
-struct isl_constraint *isl_basic_map_constraint(struct isl_basic_map *bmap,
-	isl_int **line)
-{
-	struct isl_constraint *constraint;
-
-	if (!bmap || !line)
-		goto error;
-	
-	constraint = isl_alloc_type(bmap->ctx, struct isl_constraint);
-	if (!constraint)
-		goto error;
-
-	constraint->ctx = bmap->ctx;
-	isl_ctx_ref(constraint->ctx);
-	constraint->ref = 1;
-	constraint->bmap = bmap;
-	constraint->line = line;
-
-	return constraint;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_constraint *isl_basic_set_constraint(struct isl_basic_set *bset,
-	isl_int **line)
-{
-	return isl_basic_map_constraint((struct isl_basic_map *)bset, line);
-}
-
-struct isl_constraint *isl_equality_alloc(struct isl_dim *dim)
-{
-	struct isl_basic_map *bmap;
-
-	if (!dim)
-		return NULL;
-
-	bmap = isl_basic_map_alloc_dim(dim, 0, 1, 0);
-	if (!bmap)
-		return NULL;
-
-	isl_basic_map_alloc_equality(bmap);
-	isl_seq_clr(bmap->eq[0], 1 + isl_basic_map_total_dim(bmap));
-	return isl_basic_map_constraint(bmap, &bmap->eq[0]);
-}
-
-struct isl_constraint *isl_inequality_alloc(struct isl_dim *dim)
-{
-	struct isl_basic_map *bmap;
-
-	if (!dim)
-		return NULL;
-
-	bmap = isl_basic_map_alloc_dim(dim, 0, 0, 1);
-	if (!bmap)
-		return NULL;
-
-	isl_basic_map_alloc_inequality(bmap);
-	isl_seq_clr(bmap->ineq[0], 1 + isl_basic_map_total_dim(bmap));
-	return isl_basic_map_constraint(bmap, &bmap->ineq[0]);
-}
-
-struct isl_constraint *isl_constraint_dup(struct isl_constraint *c)
-{
-	struct isl_basic_map *bmap;
-	int i;
-	int eq;
-
-	if (!c)
-		return NULL;
-
-	eq = c->line < c->bmap->eq + c->bmap->n_eq;
-	i = eq ? c->line - c->bmap->eq : c->line - c->bmap->ineq;
-	bmap = isl_basic_map_copy(c->bmap);
-	if (!bmap)
-		return NULL;
-	return isl_basic_map_constraint(bmap, eq ? bmap->eq + i : bmap->ineq + i);
-}
-
-struct isl_constraint *isl_constraint_cow(struct isl_constraint *c)
-{
-	if (!c)
-		return NULL;
-
-	if (c->ref == 1)
-		return c;
-	c->ref--;
-	return isl_constraint_dup(c);
-}
-
-struct isl_constraint *isl_constraint_copy(struct isl_constraint *constraint)
-{
-	if (!constraint)
-		return NULL;
-
-	constraint->ref++;
-	return constraint;
-}
-
-void isl_constraint_free(struct isl_constraint *c)
-{
-	if (!c)
-		return;
-
-	if (--c->ref > 0)
-		return;
-
-	isl_basic_map_free(c->bmap);
-	isl_ctx_deref(c->ctx);
-	free(c);
-}
-
-__isl_give isl_constraint *isl_basic_map_first_constraint(
-	__isl_take isl_basic_map *bmap)
-{
-	if (!bmap)
-		return NULL;
-
-	if (bmap->n_eq > 0)
-		return isl_basic_map_constraint(bmap, &bmap->eq[0]);
-
-	if (bmap->n_ineq > 0)
-		return isl_basic_map_constraint(bmap, &bmap->ineq[0]);
-
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_constraint *isl_basic_set_first_constraint(
-	__isl_take isl_basic_set *bset)
-{
-	return isl_basic_map_first_constraint((struct isl_basic_map *)bset);
-}
-
-struct isl_constraint *isl_constraint_next(struct isl_constraint *c)
-{
-	c = isl_constraint_cow(c);
-	if (c->line >= c->bmap->eq) {
-		c->line++;
-		if (c->line < c->bmap->eq + c->bmap->n_eq)
-			return c;
-		c->line = c->bmap->ineq;
-	} else
-		c->line++;
-	if (c->line < c->bmap->ineq + c->bmap->n_ineq)
-		return c;
-	isl_constraint_free(c);
-	return NULL;
-}
-
-int isl_basic_map_foreach_constraint(__isl_keep isl_basic_map *bmap,
-	int (*fn)(__isl_take isl_constraint *c, void *user), void *user)
-{
-	int i;
-	struct isl_constraint *c;
-
-	if (!bmap)
-		return -1;
-
-	isl_assert(bmap->ctx, ISL_F_ISSET(bmap, ISL_BASIC_MAP_FINAL),
-			return -1);
-
-	for (i = 0; i < bmap->n_eq; ++i) {
-		c = isl_basic_map_constraint(isl_basic_map_copy(bmap),
-						&bmap->eq[i]);
-		if (!c)
-			return -1;
-		if (fn(c, user) < 0)
-			return -1;
-	}
-
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		c = isl_basic_map_constraint(isl_basic_map_copy(bmap),
-						&bmap->ineq[i]);
-		if (!c)
-			return -1;
-		if (fn(c, user) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-int isl_basic_set_foreach_constraint(__isl_keep isl_basic_set *bset,
-	int (*fn)(__isl_take isl_constraint *c, void *user), void *user)
-{
-	return isl_basic_map_foreach_constraint((isl_basic_map *)bset, fn, user);
-}
-
-int isl_constraint_is_equal(struct isl_constraint *constraint1,
-	struct isl_constraint *constraint2)
-{
-	if (!constraint1 || !constraint2)
-		return 0;
-	return constraint1->bmap == constraint2->bmap &&
-	       constraint1->line == constraint2->line;
-}
-
-struct isl_basic_map *isl_basic_map_add_constraint(
-	struct isl_basic_map *bmap, struct isl_constraint *constraint)
-{
-	if (!bmap || !constraint)
-		goto error;
-
-	isl_assert(constraint->ctx,
-		isl_dim_equal(bmap->dim, constraint->bmap->dim), goto error);
-
-	bmap = isl_basic_map_intersect(bmap,
-				isl_basic_map_from_constraint(constraint));
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	isl_constraint_free(constraint);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_add_constraint(
-	struct isl_basic_set *bset, struct isl_constraint *constraint)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_add_constraint((struct isl_basic_map *)bset,
-						constraint);
-}
-
-__isl_give isl_map *isl_map_add_constraint(__isl_take isl_map *map,
-	__isl_take isl_constraint *constraint)
-{
-	isl_basic_map *bmap;
-
-	bmap = isl_basic_map_from_constraint(constraint);
-	map = isl_map_intersect(map, isl_map_from_basic_map(bmap));
-
-	return map;
-}
-
-__isl_give isl_set *isl_set_add_constraint(__isl_take isl_set *set,
-	__isl_take isl_constraint *constraint)
-{
-	return isl_map_add_constraint(set, constraint);
-}
-
-struct isl_constraint *isl_constraint_add_div(struct isl_constraint *constraint,
-	struct isl_div *div, int *pos)
-{
-	if (!constraint || !div)
-		goto error;
-
-	isl_assert(constraint->ctx,
-	    isl_dim_equal(div->bmap->dim, constraint->bmap->dim), goto error);
-	isl_assert(constraint->ctx,
-	    constraint->bmap->n_eq + constraint->bmap->n_ineq == 1, goto error);
-
-	constraint->bmap = isl_basic_map_cow(constraint->bmap);
-	constraint->bmap = isl_basic_map_extend_dim(constraint->bmap,
-				isl_dim_copy(constraint->bmap->dim), 1, 0, 0);
-	if (!constraint->bmap)
-		goto error;
-	constraint->line = &constraint->bmap->ineq[0];
-	*pos = isl_basic_map_alloc_div(constraint->bmap);
-	if (*pos < 0)
-		goto error;
-	isl_seq_cpy(constraint->bmap->div[*pos], div->line[0],
-			1 + 1 + isl_basic_map_total_dim(constraint->bmap));
-	isl_div_free(div);
-	return constraint;
-error:
-	isl_constraint_free(constraint);
-	isl_div_free(div);
-	return NULL;
-}
-
-__isl_give isl_dim *isl_constraint_get_dim(
-	__isl_keep isl_constraint *constraint)
-{
-	return constraint ? isl_basic_map_get_dim(constraint->bmap) : NULL;
-}
-
-int isl_constraint_dim(struct isl_constraint *constraint,
-	enum isl_dim_type type)
-{
-	if (!constraint)
-		return -1;
-	return n(constraint, type);
-}
-
-int isl_constraint_involves_dims(__isl_keep isl_constraint *constraint,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	if (!constraint)
-		return -1;
-
-	if (first + n > isl_basic_set_dim(constraint->bmap, type))
-		isl_die(constraint->ctx, isl_error_invalid,
-			"index out of bounds", return -1);
-
-	first += isl_basic_map_offset(constraint->bmap, type);
-
-	if (isl_seq_first_non_zero(constraint->line[0] + first, n) >= 0)
-		return 1;
-
-	return 0;
-}
-
-const char *isl_constraint_get_dim_name(__isl_keep isl_constraint *constraint,
-	enum isl_dim_type type, unsigned pos)
-{
-	return constraint ?
-	    isl_basic_map_get_dim_name(constraint->bmap, type, pos) : NULL;
-}
-
-void isl_constraint_get_constant(struct isl_constraint *constraint, isl_int *v)
-{
-	if (!constraint)
-		return;
-	isl_int_set(*v, constraint->line[0][0]);
-}
-
-void isl_constraint_get_coefficient(struct isl_constraint *constraint,
-	enum isl_dim_type type, int pos, isl_int *v)
-{
-	if (!constraint)
-		return;
-
-	isl_assert(constraint->ctx, pos < n(constraint, type), return);
-	isl_int_set(*v, constraint->line[0][offset(constraint, type) + pos]);
-}
-
-struct isl_div *isl_constraint_div(struct isl_constraint *constraint, int pos)
-{
-	if (!constraint)
-		return NULL;
-
-	isl_assert(constraint->ctx, pos < n(constraint, isl_dim_div),
-			return NULL);
-	isl_assert(constraint->ctx,
-		!isl_int_is_zero(constraint->bmap->div[pos][0]), return NULL);
-	return isl_basic_map_div(isl_basic_map_copy(constraint->bmap), pos);
-}
-
-void isl_constraint_set_constant(struct isl_constraint *constraint, isl_int v)
-{
-	if (!constraint)
-		return;
-	isl_int_set(constraint->line[0][0], v);
-}
-
-void isl_constraint_set_constant_si(__isl_keep isl_constraint *constraint,
-	int v)
-{
-	if (!constraint)
-		return;
-	isl_int_set_si(constraint->line[0][0], v);
-}
-
-void isl_constraint_set_coefficient(struct isl_constraint *constraint,
-	enum isl_dim_type type, int pos, isl_int v)
-{
-	if (!constraint)
-		return;
-
-	isl_assert(constraint->ctx, pos < n(constraint, type), return);
-	isl_int_set(constraint->line[0][offset(constraint, type) + pos], v);
-}
-
-void isl_constraint_set_coefficient_si(__isl_keep isl_constraint *constraint,
-	enum isl_dim_type type, int pos, int v)
-{
-	if (!constraint)
-		return;
-
-	isl_assert(constraint->ctx, pos < n(constraint, type), return);
-	isl_int_set_si(constraint->line[0][offset(constraint, type) + pos], v);
-}
-
-void isl_constraint_clear(struct isl_constraint *constraint)
-{
-	unsigned total;
-
-	if (!constraint)
-		return;
-	total = isl_basic_map_total_dim(constraint->bmap);
-	isl_seq_clr(constraint->line[0], 1 + total);
-}
-
-/* Check whether the two basic maps have identical divs in the same order.
- */
-static int equal_divs(__isl_keep isl_basic_map *bmap1,
-	__isl_keep isl_basic_map *bmap2)
-{
-	int i;
-	unsigned total;
-
-	if (!isl_basic_map_divs_known(bmap1))
-		return 0;
-	if (!isl_basic_map_divs_known(bmap2))
-		return 0;
-	if (bmap1->n_div != bmap2->n_div)
-		return 0;
-
-	total = isl_basic_map_total_dim(bmap1);
-	for (i = 0; i < bmap1->n_div; ++i)
-		if (!isl_seq_eq(bmap1->div[i], bmap2->div[i], 2 + total))
-			return 0;
-
-	return 1;
-}
-
-/* Drop any constraint from "bset" that is identical to "constraint".
- * In particular, this means that the local spaces of "bset" and
- * "constraint" need to be the same.
- *
- * Since the given constraint may actually be a pointer into the bset,
- * we have to be careful not to reorder the constraints as the user
- * may be holding on to other constraints from the same bset.
- * This should be cleaned up when the internal representation of
- * isl_constraint is changed to use isl_aff.
- */
-__isl_give isl_basic_set *isl_basic_set_drop_constraint(
-	__isl_take isl_basic_set *bset, __isl_take isl_constraint *constraint)
-{
-	int i;
-	unsigned n;
-	isl_int **row;
-	unsigned total;
-
-	if (!bset || !constraint)
-		goto error;
-
-	if (!isl_dim_equal(bset->dim, constraint->bmap->dim))
-		isl_die(bset->ctx, isl_error_invalid,
-			"spaces don't match", goto error);
-
-	if (bset != constraint->bmap && !equal_divs(bset, constraint->bmap)) {
-		isl_constraint_free(constraint);
-		return bset;
-	}
-
-	if (isl_constraint_is_equality(constraint)) {
-		n = bset->n_eq;
-		row = bset->eq;
-	} else {
-		n = bset->n_ineq;
-		row = bset->ineq;
-	}
-
-	total = isl_basic_map_total_dim(constraint->bmap);
-	for (i = 0; i < n; ++i)
-		if (isl_seq_eq(row[i], constraint->line[0], 1 + total))
-			isl_seq_clr(row[i], 1 + total);
-			
-	isl_constraint_free(constraint);
-	return bset;
-error:
-	isl_constraint_free(constraint);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-struct isl_constraint *isl_constraint_negate(struct isl_constraint *constraint)
-{
-	unsigned total;
-
-	if (!constraint)
-		return NULL;
-
-	isl_assert(constraint->ctx, !isl_constraint_is_equality(constraint),
-			goto error);
-	isl_assert(constraint->ctx, constraint->bmap->ref == 1, goto error);
-	total = isl_basic_map_total_dim(constraint->bmap);
-	isl_seq_neg(constraint->line[0], constraint->line[0], 1 + total);
-	isl_int_sub_ui(constraint->line[0][0], constraint->line[0][0], 1);
-	ISL_F_CLR(constraint->bmap, ISL_BASIC_MAP_NORMALIZED);
-	return constraint;
-error:
-	isl_constraint_free(constraint);
-	return NULL;
-}
-
-int isl_constraint_is_equality(struct isl_constraint *constraint)
-{
-	if (!constraint)
-		return -1;
-	return constraint->line >= constraint->bmap->eq;
-}
-
-int isl_constraint_is_div_constraint(__isl_keep isl_constraint *constraint)
-{
-	int i;
-
-	if (!constraint)
-		return -1;
-	if (isl_constraint_is_equality(constraint))
-		return 0;
-	for (i = 0; i < constraint->bmap->n_div; ++i) {
-		if (isl_int_is_zero(constraint->bmap->div[i][0]))
-			continue;
-		if (isl_basic_map_is_div_constraint(constraint->bmap,
-					constraint->line[0], i))
-			return 1;
-	}
-
-	return 0;
-}
-
-/* We manually set ISL_BASIC_SET_FINAL instead of calling
- * isl_basic_map_finalize because we want to keep the position
- * of the divs and we therefore do not want to throw away redundant divs.
- * This is arguably a bit fragile.
- */
-__isl_give isl_basic_map *isl_basic_map_from_constraint(
-	__isl_take isl_constraint *constraint)
-{
-	int k;
-	struct isl_basic_map *bmap;
-	isl_int *c;
-	unsigned total;
-
-	if (!constraint)
-		return NULL;
-
-	if (constraint->bmap->n_eq == 1 && constraint->bmap->n_ineq == 0) {
-		bmap = isl_basic_map_copy(constraint->bmap);
-		isl_constraint_free(constraint);
-		return bmap;
-	}
-
-	bmap = isl_basic_map_universe_like(constraint->bmap);
-	bmap = isl_basic_map_align_divs(bmap, constraint->bmap);
-	bmap = isl_basic_map_cow(bmap);
-	bmap = isl_basic_map_extend_constraints(bmap, 1, 1);
-	if (isl_constraint_is_equality(constraint)) {
-		k = isl_basic_map_alloc_equality(bmap);
-		if (k < 0)
-			goto error;
-		c = bmap->eq[k];
-	}
-	else {
-		k = isl_basic_map_alloc_inequality(bmap);
-		if (k < 0)
-			goto error;
-		c = bmap->ineq[k];
-	}
-	total = isl_basic_map_total_dim(bmap);
-	isl_seq_cpy(c, constraint->line[0], 1 + total);
-	isl_constraint_free(constraint);
-	if (bmap)
-		ISL_F_SET(bmap, ISL_BASIC_SET_FINAL);
-	return bmap;
-error:
-	isl_constraint_free(constraint);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_from_constraint(
-	struct isl_constraint *constraint)
-{
-	if (!constraint)
-		return NULL;
-
-	isl_assert(constraint->ctx,n(constraint, isl_dim_in) == 0, goto error);
-	return (isl_basic_set *)isl_basic_map_from_constraint(constraint);
-error:
-	isl_constraint_free(constraint);
-	return NULL;
-}
-
-int isl_basic_map_has_defining_equality(
-	__isl_keep isl_basic_map *bmap, enum isl_dim_type type, int pos,
-	__isl_give isl_constraint **c)
-{
-	int i;
-	unsigned offset;
-	unsigned total;
-
-	if (!bmap)
-		return -1;
-	offset = basic_map_offset(bmap, type);
-	total = isl_basic_map_total_dim(bmap);
-	isl_assert(bmap->ctx, pos < isl_basic_map_dim(bmap, type), return -1);
-	for (i = 0; i < bmap->n_eq; ++i)
-		if (!isl_int_is_zero(bmap->eq[i][offset + pos]) &&
-		    isl_seq_first_non_zero(bmap->eq[i]+offset+pos+1,
-					   1+total-offset-pos-1) == -1) {
-			*c = isl_basic_map_constraint(isl_basic_map_copy(bmap),
-								&bmap->eq[i]);
-			return 1;
-		}
-	return 0;
-}
-
-int isl_basic_set_has_defining_equality(
-	__isl_keep isl_basic_set *bset, enum isl_dim_type type, int pos,
-	__isl_give isl_constraint **c)
-{
-	return isl_basic_map_has_defining_equality((isl_basic_map *)bset,
-						    type, pos, c);
-}
-
-int isl_basic_set_has_defining_inequalities(
-	struct isl_basic_set *bset, enum isl_dim_type type, int pos,
-	struct isl_constraint **lower,
-	struct isl_constraint **upper)
-{
-	int i, j;
-	unsigned offset;
-	unsigned total;
-	isl_int m;
-	isl_int **lower_line, **upper_line;
-
-	if (!bset)
-		return -1;
-	offset = basic_set_offset(bset, type);
-	total = isl_basic_set_total_dim(bset);
-	isl_assert(bset->ctx, pos < isl_basic_set_dim(bset, type), return -1);
-	isl_int_init(m);
-	for (i = 0; i < bset->n_ineq; ++i) {
-		if (isl_int_is_zero(bset->ineq[i][offset + pos]))
-			continue;
-		if (isl_int_is_one(bset->ineq[i][offset + pos]))
-			continue;
-		if (isl_int_is_negone(bset->ineq[i][offset + pos]))
-			continue;
-		if (isl_seq_first_non_zero(bset->ineq[i]+offset+pos+1,
-						1+total-offset-pos-1) != -1)
-			continue;
-		for (j = i + 1; j < bset->n_ineq; ++j) {
-			if (!isl_seq_is_neg(bset->ineq[i]+1, bset->ineq[j]+1,
-					    total))
-				continue;
-			isl_int_add(m, bset->ineq[i][0], bset->ineq[j][0]);
-			if (isl_int_abs_ge(m, bset->ineq[i][offset+pos]))
-				continue;
-
-			if (isl_int_is_pos(bset->ineq[i][offset+pos])) {
-				lower_line = &bset->ineq[i];
-				upper_line = &bset->ineq[j];
-			} else {
-				lower_line = &bset->ineq[j];
-				upper_line = &bset->ineq[i];
-			}
-			*lower = isl_basic_set_constraint(
-					isl_basic_set_copy(bset), lower_line);
-			*upper = isl_basic_set_constraint(
-					isl_basic_set_copy(bset), upper_line);
-			isl_int_clear(m);
-			return 1;
-		}
-	}
-	*lower = NULL;
-	*upper = NULL;
-	isl_int_clear(m);
-	return 0;
-}
-
-/* Given two constraints "a" and "b" on the variable at position "abs_pos"
- * (in "a" and "b"), add a constraint to "bset" that ensures that the
- * bound implied by "a" is (strictly) larger than the bound implied by "b".
- *
- * If both constraints imply lower bounds, then this means that "a" is
- * active in the result.
- * If both constraints imply upper bounds, then this means that "b" is
- * active in the result.
- */
-static __isl_give isl_basic_set *add_larger_bound_constraint(
-	__isl_take isl_basic_set *bset, isl_int *a, isl_int *b,
-	unsigned abs_pos, int strict)
-{
-	int k;
-	isl_int t;
-	unsigned total;
-
-	k = isl_basic_set_alloc_inequality(bset);
-	if (k < 0)
-		goto error;
-
-	total = isl_basic_set_dim(bset, isl_dim_all);
-
-	isl_int_init(t);
-	isl_int_neg(t, b[1 + abs_pos]);
-
-	isl_seq_combine(bset->ineq[k], t, a, a[1 + abs_pos], b, 1 + abs_pos);
-	isl_seq_combine(bset->ineq[k] + 1 + abs_pos,
-		t, a + 1 + abs_pos + 1, a[1 + abs_pos], b + 1 + abs_pos + 1,
-		total - abs_pos);
-
-	if (strict)
-		isl_int_sub_ui(bset->ineq[k][0], bset->ineq[k][0], 1);
-
-	isl_int_clear(t);
-
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Add constraints to "context" that ensure that "u" is the smallest
- * (and therefore active) upper bound on "abs_pos" in "bset" and return
- * the resulting basic set.
- */
-static __isl_give isl_basic_set *set_smallest_upper_bound(
-	__isl_keep isl_basic_set *context,
-	__isl_keep isl_basic_set *bset, unsigned abs_pos, int n_upper, int u)
-{
-	int j;
-
-	context = isl_basic_set_copy(context);
-	context = isl_basic_set_cow(context);
-
-	context = isl_basic_set_extend_constraints(context, 0, n_upper - 1);
-
-	for (j = 0; j < bset->n_ineq; ++j) {
-		if (j == u)
-			continue;
-		if (!isl_int_is_neg(bset->ineq[j][1 + abs_pos]))
-			continue;
-		context = add_larger_bound_constraint(context,
-			bset->ineq[j], bset->ineq[u], abs_pos, j > u);
-	}
-
-	context = isl_basic_set_simplify(context);
-	context = isl_basic_set_finalize(context);
-
-	return context;
-}
-
-/* Add constraints to "context" that ensure that "u" is the largest
- * (and therefore active) upper bound on "abs_pos" in "bset" and return
- * the resulting basic set.
- */
-static __isl_give isl_basic_set *set_largest_lower_bound(
-	__isl_keep isl_basic_set *context,
-	__isl_keep isl_basic_set *bset, unsigned abs_pos, int n_lower, int l)
-{
-	int j;
-
-	context = isl_basic_set_copy(context);
-	context = isl_basic_set_cow(context);
-
-	context = isl_basic_set_extend_constraints(context, 0, n_lower - 1);
-
-	for (j = 0; j < bset->n_ineq; ++j) {
-		if (j == l)
-			continue;
-		if (!isl_int_is_pos(bset->ineq[j][1 + abs_pos]))
-			continue;
-		context = add_larger_bound_constraint(context,
-			bset->ineq[l], bset->ineq[j], abs_pos, j > l);
-	}
-
-	context = isl_basic_set_simplify(context);
-	context = isl_basic_set_finalize(context);
-
-	return context;
-}
-
-static int foreach_upper_bound(__isl_keep isl_basic_set *bset,
-	enum isl_dim_type type, unsigned abs_pos,
-	__isl_take isl_basic_set *context, int n_upper,
-	int (*fn)(__isl_take isl_constraint *lower,
-		  __isl_take isl_constraint *upper,
-		  __isl_take isl_basic_set *bset, void *user), void *user)
-{
-	isl_basic_set *context_i;
-	isl_constraint *upper = NULL;
-	int i;
-
-	for (i = 0; i < bset->n_ineq; ++i) {
-		if (isl_int_is_zero(bset->ineq[i][1 + abs_pos]))
-			continue;
-
-		context_i = set_smallest_upper_bound(context, bset,
-							abs_pos, n_upper, i);
-		if (isl_basic_set_is_empty(context_i)) {
-			isl_basic_set_free(context_i);
-			continue;
-		}
-		upper = isl_basic_set_constraint(isl_basic_set_copy(bset),
-						&bset->ineq[i]);
-		if (!upper || !context_i)
-			goto error;
-		if (fn(NULL, upper, context_i, user) < 0)
-			break;
-	}
-
-	isl_basic_set_free(context);
-
-	if (i < bset->n_ineq)
-		return -1;
-
-	return 0;
-error:
-	isl_constraint_free(upper);
-	isl_basic_set_free(context_i);
-	isl_basic_set_free(context);
-	return -1;
-}
-
-static int foreach_lower_bound(__isl_keep isl_basic_set *bset,
-	enum isl_dim_type type, unsigned abs_pos,
-	__isl_take isl_basic_set *context, int n_lower,
-	int (*fn)(__isl_take isl_constraint *lower,
-		  __isl_take isl_constraint *upper,
-		  __isl_take isl_basic_set *bset, void *user), void *user)
-{
-	isl_basic_set *context_i;
-	isl_constraint *lower = NULL;
-	int i;
-
-	for (i = 0; i < bset->n_ineq; ++i) {
-		if (isl_int_is_zero(bset->ineq[i][1 + abs_pos]))
-			continue;
-
-		context_i = set_largest_lower_bound(context, bset,
-							abs_pos, n_lower, i);
-		if (isl_basic_set_is_empty(context_i)) {
-			isl_basic_set_free(context_i);
-			continue;
-		}
-		lower = isl_basic_set_constraint(isl_basic_set_copy(bset),
-						&bset->ineq[i]);
-		if (!lower || !context_i)
-			goto error;
-		if (fn(lower, NULL, context_i, user) < 0)
-			break;
-	}
-
-	isl_basic_set_free(context);
-
-	if (i < bset->n_ineq)
-		return -1;
-
-	return 0;
-error:
-	isl_constraint_free(lower);
-	isl_basic_set_free(context_i);
-	isl_basic_set_free(context);
-	return -1;
-}
-
-static int foreach_bound_pair(__isl_keep isl_basic_set *bset,
-	enum isl_dim_type type, unsigned abs_pos,
-	__isl_take isl_basic_set *context, int n_lower, int n_upper,
-	int (*fn)(__isl_take isl_constraint *lower,
-		  __isl_take isl_constraint *upper,
-		  __isl_take isl_basic_set *bset, void *user), void *user)
-{
-	isl_basic_set *context_i, *context_j;
-	isl_constraint *lower = NULL;
-	isl_constraint *upper = NULL;
-	int i, j;
-
-	for (i = 0; i < bset->n_ineq; ++i) {
-		if (!isl_int_is_pos(bset->ineq[i][1 + abs_pos]))
-			continue;
-
-		context_i = set_largest_lower_bound(context, bset,
-							abs_pos, n_lower, i);
-		if (isl_basic_set_is_empty(context_i)) {
-			isl_basic_set_free(context_i);
-			continue;
-		}
-
-		for (j = 0; j < bset->n_ineq; ++j) {
-			if (!isl_int_is_neg(bset->ineq[j][1 + abs_pos]))
-				continue;
-
-			context_j = set_smallest_upper_bound(context_i, bset,
-							    abs_pos, n_upper, j);
-			context_j = isl_basic_set_extend_constraints(context_j,
-									0, 1);
-			context_j = add_larger_bound_constraint(context_j,
-				bset->ineq[i], bset->ineq[j], abs_pos, 0);
-			context_j = isl_basic_set_simplify(context_j);
-			context_j = isl_basic_set_finalize(context_j);
-			if (isl_basic_set_is_empty(context_j)) {
-				isl_basic_set_free(context_j);
-				continue;
-			}
-			lower = isl_basic_set_constraint(isl_basic_set_copy(bset),
-							&bset->ineq[i]);
-			upper = isl_basic_set_constraint(isl_basic_set_copy(bset),
-							&bset->ineq[j]);
-			if (!lower || !upper || !context_j)
-				goto error;
-			if (fn(lower, upper, context_j, user) < 0)
-				break;
-		}
-
-		isl_basic_set_free(context_i);
-
-		if (j < bset->n_ineq)
-			break;
-	}
-
-	isl_basic_set_free(context);
-
-	if (i < bset->n_ineq)
-		return -1;
-
-	return 0;
-error:
-	isl_constraint_free(lower);
-	isl_constraint_free(upper);
-	isl_basic_set_free(context_i);
-	isl_basic_set_free(context_j);
-	isl_basic_set_free(context);
-	return -1;
-}
-
-/* For each pair of lower and upper bounds on the variable "pos"
- * of type "type", call "fn" with these lower and upper bounds and the
- * set of constraints on the remaining variables where these bounds
- * are active, i.e., (stricly) larger/smaller than the other lower/upper bounds.
- *
- * If the designated variable is equal to an affine combination of the
- * other variables then fn is called with both lower and upper
- * set to the corresponding equality.
- *
- * If there is no lower (or upper) bound, then NULL is passed
- * as the corresponding bound.
- *
- * We first check if the variable is involved in any equality.
- * If not, we count the number of lower and upper bounds and
- * act accordingly.
- */
-int isl_basic_set_foreach_bound_pair(__isl_keep isl_basic_set *bset,
-	enum isl_dim_type type, unsigned pos,
-	int (*fn)(__isl_take isl_constraint *lower,
-		  __isl_take isl_constraint *upper,
-		  __isl_take isl_basic_set *bset, void *user), void *user)
-{
-	int i;
-	isl_constraint *lower = NULL;
-	isl_constraint *upper = NULL;
-	isl_basic_set *context = NULL;
-	unsigned abs_pos;
-	int n_lower, n_upper;
-
-	if (!bset)
-		return -1;
-	isl_assert(bset->ctx, pos < isl_basic_set_dim(bset, type), return -1);
-	isl_assert(bset->ctx, type == isl_dim_param || type == isl_dim_set,
-		return -1);
-
-	abs_pos = pos;
-	if (type == isl_dim_set)
-		abs_pos += isl_basic_set_dim(bset, isl_dim_param);
-
-	for (i = 0; i < bset->n_eq; ++i) {
-		if (isl_int_is_zero(bset->eq[i][1 + abs_pos]))
-			continue;
-
-		lower = isl_basic_set_constraint(isl_basic_set_copy(bset),
-						&bset->eq[i]);
-		upper = isl_constraint_copy(lower);
-		context = isl_basic_set_remove_dims(isl_basic_set_copy(bset),
-					type, pos, 1);
-		if (!lower || !upper || !context)
-			goto error;
-		return fn(lower, upper, context, user);
-	}
-
-	n_lower = 0;
-	n_upper = 0;
-	for (i = 0; i < bset->n_ineq; ++i) {
-		if (isl_int_is_pos(bset->ineq[i][1 + abs_pos]))
-			n_lower++;
-		else if (isl_int_is_neg(bset->ineq[i][1 + abs_pos]))
-			n_upper++;
-	}
-
-	context = isl_basic_set_copy(bset);
-	context = isl_basic_set_cow(context);
-	if (!context)
-		goto error;
-	for (i = context->n_ineq - 1; i >= 0; --i)
-		if (!isl_int_is_zero(context->ineq[i][1 + abs_pos]))
-			isl_basic_set_drop_inequality(context, i);
-
-	context = isl_basic_set_drop(context, type, pos, 1);
-	if (!n_lower && !n_upper)
-		return fn(NULL, NULL, context, user);
-	if (!n_lower)
-		return foreach_upper_bound(bset, type, abs_pos, context, n_upper,
-						fn, user);
-	if (!n_upper)
-		return foreach_lower_bound(bset, type, abs_pos, context, n_lower,
-						fn, user);
-	return foreach_bound_pair(bset, type, abs_pos, context, n_lower, n_upper,
-					fn, user);
-error:
-	isl_constraint_free(lower);
-	isl_constraint_free(upper);
-	isl_basic_set_free(context);
-	return -1;
-}
-
-__isl_give isl_aff *isl_constraint_get_bound(
-	__isl_keep isl_constraint *constraint, enum isl_dim_type type, int pos)
-{
-	isl_aff *aff;
-	isl_local_space *ls;
-
-	if (!constraint)
-		return NULL;
-	if (pos >= isl_basic_set_dim(constraint->bmap, type))
-		isl_die(constraint->ctx, isl_error_invalid,
-			"index out of bounds", return NULL);
-	if (!isl_basic_map_may_be_set(constraint->bmap))
-		isl_die(constraint->ctx, isl_error_invalid,
-			"not a set constraint", return NULL);
-
-	pos += offset(constraint, type);
-	if (isl_int_is_zero(constraint->line[0][pos]))
-		isl_die(constraint->ctx, isl_error_invalid,
-			"constraint does not define a bound on given dimension",
-			return NULL);
-
-	ls = isl_basic_set_get_local_space(constraint->bmap);
-	aff = isl_aff_alloc(ls);
-	if (!aff)
-		return NULL;
-
-	if (isl_int_is_neg(constraint->line[0][pos]))
-		isl_seq_cpy(aff->v->el + 1, constraint->line[0],
-			    aff->v->size - 1);
-	else
-		isl_seq_neg(aff->v->el + 1, constraint->line[0],
-			    aff->v->size - 1);
-	isl_int_set_si(aff->v->el[1 + pos], 0);
-	isl_int_abs(aff->v->el[0], constraint->line[0][pos]);
-
-	return aff;
-}
-
-/* For an inequality constraint
- *
- *	f >= 0
- *
- * or an equality constraint
- *
- *	f = 0
- *
- * return the affine expression f.
- */
-__isl_give isl_aff *isl_constraint_get_aff(
-	__isl_keep isl_constraint *constraint)
-{
-	isl_aff *aff;
-	isl_local_space *ls;
-
-	if (!constraint)
-		return NULL;
-
-	ls = isl_basic_set_get_local_space(constraint->bmap);
-	aff = isl_aff_alloc(ls);
-	if (!aff)
-		return NULL;
-
-	isl_seq_cpy(aff->v->el + 1, constraint->line[0], aff->v->size - 1);
-	isl_int_set_si(aff->v->el[0], 1);
-
-	return aff;
-}
-
-/* Construct an equality constraint equating the given affine expression
- * to zero.
- */
-__isl_give isl_constraint *isl_equality_from_aff(__isl_take isl_aff *aff)
-{
-	int k;
-	isl_basic_set *bset;
-
-	if (!aff)
-		return NULL;
-
-	bset = isl_basic_set_from_local_space(isl_aff_get_local_space(aff));
-	bset = isl_basic_set_extend_constraints(bset, 1, 0);
-	k = isl_basic_set_alloc_equality(bset);
-	if (k < 0)
-		goto error;
-
-	isl_seq_cpy(bset->eq[k], aff->v->el + 1, aff->v->size - 1);
-	isl_aff_free(aff);
-
-	return isl_basic_set_constraint(bset, &bset->eq[k]);
-error:
-	isl_aff_free(aff);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Construct an inequality constraint enforcing the given affine expression
- * to be non-negative.
- */
-__isl_give isl_constraint *isl_inequality_from_aff(__isl_take isl_aff *aff)
-{
-	int k;
-	isl_basic_set *bset;
-
-	if (!aff)
-		return NULL;
-
-	bset = isl_basic_set_from_local_space(isl_aff_get_local_space(aff));
-	bset = isl_basic_set_extend_constraints(bset, 0, 1);
-	k = isl_basic_set_alloc_inequality(bset);
-	if (k < 0)
-		goto error;
-
-	isl_seq_cpy(bset->ineq[k], aff->v->el + 1, aff->v->size - 1);
-	isl_aff_free(aff);
-
-	return isl_basic_set_constraint(bset, &bset->ineq[k]);
-error:
-	isl_aff_free(aff);
-	isl_basic_set_free(bset);
-	return NULL;
-}
diff --git a/cloog-0.16.3/isl/isl_constraint_private.h b/cloog-0.16.3/isl/isl_constraint_private.h
deleted file mode 100644
index 8fab9d4..0000000
--- a/cloog-0.16.3/isl/isl_constraint_private.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef ISL_CONSTRAINT_PRIVATE_H
-#define ISL_CONSTRAINT_PRIVATE_H
-
-#include <isl/constraint.h>
-
-struct isl_constraint {
-	int ref;
-	struct isl_ctx *ctx;
-
-	struct isl_basic_map	*bmap;
-	isl_int			**line;
-};
-
-struct isl_constraint *isl_basic_set_constraint(struct isl_basic_set *bset,
-	isl_int **line);
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_convex_hull.c b/cloog-0.16.3/isl/isl_convex_hull.c
deleted file mode 100644
index 266d9a7..0000000
--- a/cloog-0.16.3/isl/isl_convex_hull.c
+++ /dev/null
@@ -1,2426 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl/lp.h>
-#include <isl/map.h>
-#include <isl_mat_private.h>
-#include <isl/set.h>
-#include <isl/seq.h>
-#include "isl_equalities.h"
-#include "isl_tab.h"
-
-static struct isl_basic_set *uset_convex_hull_wrap_bounded(struct isl_set *set);
-
-/* Return 1 if constraint c is redundant with respect to the constraints
- * in bmap.  If c is a lower [upper] bound in some variable and bmap
- * does not have a lower [upper] bound in that variable, then c cannot
- * be redundant and we do not need solve any lp.
- */
-int isl_basic_map_constraint_is_redundant(struct isl_basic_map **bmap,
-	isl_int *c, isl_int *opt_n, isl_int *opt_d)
-{
-	enum isl_lp_result res;
-	unsigned total;
-	int i, j;
-
-	if (!bmap)
-		return -1;
-
-	total = isl_basic_map_total_dim(*bmap);
-	for (i = 0; i < total; ++i) {
-		int sign;
-		if (isl_int_is_zero(c[1+i]))
-			continue;
-		sign = isl_int_sgn(c[1+i]);
-		for (j = 0; j < (*bmap)->n_ineq; ++j)
-			if (sign == isl_int_sgn((*bmap)->ineq[j][1+i]))
-				break;
-		if (j == (*bmap)->n_ineq)
-			break;
-	}
-	if (i < total)
-		return 0;
-
-	res = isl_basic_map_solve_lp(*bmap, 0, c, (*bmap)->ctx->one,
-					opt_n, opt_d, NULL);
-	if (res == isl_lp_unbounded)
-		return 0;
-	if (res == isl_lp_error)
-		return -1;
-	if (res == isl_lp_empty) {
-		*bmap = isl_basic_map_set_to_empty(*bmap);
-		return 0;
-	}
-	return !isl_int_is_neg(*opt_n);
-}
-
-int isl_basic_set_constraint_is_redundant(struct isl_basic_set **bset,
-	isl_int *c, isl_int *opt_n, isl_int *opt_d)
-{
-	return isl_basic_map_constraint_is_redundant(
-			(struct isl_basic_map **)bset, c, opt_n, opt_d);
-}
-
-/* Remove redundant
- * constraints.  If the minimal value along the normal of a constraint
- * is the same if the constraint is removed, then the constraint is redundant.
- *
- * Alternatively, we could have intersected the basic map with the
- * corresponding equality and the checked if the dimension was that
- * of a facet.
- */
-__isl_give isl_basic_map *isl_basic_map_remove_redundancies(
-	__isl_take isl_basic_map *bmap)
-{
-	struct isl_tab *tab;
-
-	if (!bmap)
-		return NULL;
-
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY))
-		return bmap;
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_NO_REDUNDANT))
-		return bmap;
-	if (bmap->n_ineq <= 1)
-		return bmap;
-
-	tab = isl_tab_from_basic_map(bmap);
-	if (isl_tab_detect_implicit_equalities(tab) < 0)
-		goto error;
-	if (isl_tab_detect_redundant(tab) < 0)
-		goto error;
-	bmap = isl_basic_map_update_from_tab(bmap, tab);
-	isl_tab_free(tab);
-	ISL_F_SET(bmap, ISL_BASIC_MAP_NO_IMPLICIT);
-	ISL_F_SET(bmap, ISL_BASIC_MAP_NO_REDUNDANT);
-	return bmap;
-error:
-	isl_tab_free(tab);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_remove_redundancies(
-	__isl_take isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_remove_redundancies((struct isl_basic_map *)bset);
-}
-
-/* Remove redundant constraints in each of the basic maps.
- */
-__isl_give isl_map *isl_map_remove_redundancies(__isl_take isl_map *map)
-{
-	return isl_map_inline_foreach_basic_map(map,
-					    &isl_basic_map_remove_redundancies);
-}
-
-__isl_give isl_set *isl_set_remove_redundancies(__isl_take isl_set *set)
-{
-	return isl_map_remove_redundancies(set);
-}
-
-/* Check if the set set is bound in the direction of the affine
- * constraint c and if so, set the constant term such that the
- * resulting constraint is a bounding constraint for the set.
- */
-static int uset_is_bound(struct isl_set *set, isl_int *c, unsigned len)
-{
-	int first;
-	int j;
-	isl_int opt;
-	isl_int opt_denom;
-
-	isl_int_init(opt);
-	isl_int_init(opt_denom);
-	first = 1;
-	for (j = 0; j < set->n; ++j) {
-		enum isl_lp_result res;
-
-		if (ISL_F_ISSET(set->p[j], ISL_BASIC_SET_EMPTY))
-			continue;
-
-		res = isl_basic_set_solve_lp(set->p[j],
-				0, c, set->ctx->one, &opt, &opt_denom, NULL);
-		if (res == isl_lp_unbounded)
-			break;
-		if (res == isl_lp_error)
-			goto error;
-		if (res == isl_lp_empty) {
-			set->p[j] = isl_basic_set_set_to_empty(set->p[j]);
-			if (!set->p[j])
-				goto error;
-			continue;
-		}
-		if (first || isl_int_is_neg(opt)) {
-			if (!isl_int_is_one(opt_denom))
-				isl_seq_scale(c, c, opt_denom, len);
-			isl_int_sub(c[0], c[0], opt);
-		}
-		first = 0;
-	}
-	isl_int_clear(opt);
-	isl_int_clear(opt_denom);
-	return j >= set->n;
-error:
-	isl_int_clear(opt);
-	isl_int_clear(opt_denom);
-	return -1;
-}
-
-__isl_give isl_basic_map *isl_basic_map_set_rational(
-	__isl_take isl_basic_set *bmap)
-{
-	if (!bmap)
-		return NULL;
-
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL))
-		return bmap;
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-
-	ISL_F_SET(bmap, ISL_BASIC_MAP_RATIONAL);
-
-	return isl_basic_map_finalize(bmap);
-}
-
-__isl_give isl_basic_set *isl_basic_set_set_rational(
-	__isl_take isl_basic_set *bset)
-{
-	return isl_basic_map_set_rational(bset);
-}
-
-static struct isl_set *isl_set_set_rational(struct isl_set *set)
-{
-	int i;
-
-	set = isl_set_cow(set);
-	if (!set)
-		return NULL;
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_basic_set_set_rational(set->p[i]);
-		if (!set->p[i])
-			goto error;
-	}
-	return set;
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-static struct isl_basic_set *isl_basic_set_add_equality(
-	struct isl_basic_set *bset, isl_int *c)
-{
-	int i;
-	unsigned dim;
-
-	if (!bset)
-		return NULL;
-
-	if (ISL_F_ISSET(bset, ISL_BASIC_SET_EMPTY))
-		return bset;
-
-	isl_assert(bset->ctx, isl_basic_set_n_param(bset) == 0, goto error);
-	isl_assert(bset->ctx, bset->n_div == 0, goto error);
-	dim = isl_basic_set_n_dim(bset);
-	bset = isl_basic_set_cow(bset);
-	bset = isl_basic_set_extend(bset, 0, dim, 0, 1, 0);
-	i = isl_basic_set_alloc_equality(bset);
-	if (i < 0)
-		goto error;
-	isl_seq_cpy(bset->eq[i], c, 1 + dim);
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-static struct isl_set *isl_set_add_basic_set_equality(struct isl_set *set, isl_int *c)
-{
-	int i;
-
-	set = isl_set_cow(set);
-	if (!set)
-		return NULL;
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_basic_set_add_equality(set->p[i], c);
-		if (!set->p[i])
-			goto error;
-	}
-	return set;
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-/* Given a union of basic sets, construct the constraints for wrapping
- * a facet around one of its ridges.
- * In particular, if each of n the d-dimensional basic sets i in "set"
- * contains the origin, satisfies the constraints x_1 >= 0 and x_2 >= 0
- * and is defined by the constraints
- *				    [ 1 ]
- *				A_i [ x ]  >= 0
- *
- * then the resulting set is of dimension n*(1+d) and has as constraints
- *
- *				    [ a_i ]
- *				A_i [ x_i ] >= 0
- *
- *				      a_i   >= 0
- *
- *			\sum_i x_{i,1} = 1
- */
-static struct isl_basic_set *wrap_constraints(struct isl_set *set)
-{
-	struct isl_basic_set *lp;
-	unsigned n_eq;
-	unsigned n_ineq;
-	int i, j, k;
-	unsigned dim, lp_dim;
-
-	if (!set)
-		return NULL;
-
-	dim = 1 + isl_set_n_dim(set);
-	n_eq = 1;
-	n_ineq = set->n;
-	for (i = 0; i < set->n; ++i) {
-		n_eq += set->p[i]->n_eq;
-		n_ineq += set->p[i]->n_ineq;
-	}
-	lp = isl_basic_set_alloc(set->ctx, 0, dim * set->n, 0, n_eq, n_ineq);
-	lp = isl_basic_set_set_rational(lp);
-	if (!lp)
-		return NULL;
-	lp_dim = isl_basic_set_n_dim(lp);
-	k = isl_basic_set_alloc_equality(lp);
-	isl_int_set_si(lp->eq[k][0], -1);
-	for (i = 0; i < set->n; ++i) {
-		isl_int_set_si(lp->eq[k][1+dim*i], 0);
-		isl_int_set_si(lp->eq[k][1+dim*i+1], 1);
-		isl_seq_clr(lp->eq[k]+1+dim*i+2, dim-2);
-	}
-	for (i = 0; i < set->n; ++i) {
-		k = isl_basic_set_alloc_inequality(lp);
-		isl_seq_clr(lp->ineq[k], 1+lp_dim);
-		isl_int_set_si(lp->ineq[k][1+dim*i], 1);
-
-		for (j = 0; j < set->p[i]->n_eq; ++j) {
-			k = isl_basic_set_alloc_equality(lp);
-			isl_seq_clr(lp->eq[k], 1+dim*i);
-			isl_seq_cpy(lp->eq[k]+1+dim*i, set->p[i]->eq[j], dim);
-			isl_seq_clr(lp->eq[k]+1+dim*(i+1), dim*(set->n-i-1));
-		}
-
-		for (j = 0; j < set->p[i]->n_ineq; ++j) {
-			k = isl_basic_set_alloc_inequality(lp);
-			isl_seq_clr(lp->ineq[k], 1+dim*i);
-			isl_seq_cpy(lp->ineq[k]+1+dim*i, set->p[i]->ineq[j], dim);
-			isl_seq_clr(lp->ineq[k]+1+dim*(i+1), dim*(set->n-i-1));
-		}
-	}
-	return lp;
-}
-
-/* Given a facet "facet" of the convex hull of "set" and a facet "ridge"
- * of that facet, compute the other facet of the convex hull that contains
- * the ridge.
- *
- * We first transform the set such that the facet constraint becomes
- *
- *			x_1 >= 0
- *
- * I.e., the facet lies in
- *
- *			x_1 = 0
- *
- * and on that facet, the constraint that defines the ridge is
- *
- *			x_2 >= 0
- *
- * (This transformation is not strictly needed, all that is needed is
- * that the ridge contains the origin.)
- *
- * Since the ridge contains the origin, the cone of the convex hull
- * will be of the form
- *
- *			x_1 >= 0
- *			x_2 >= a x_1
- *
- * with this second constraint defining the new facet.
- * The constant a is obtained by settting x_1 in the cone of the
- * convex hull to 1 and minimizing x_2.
- * Now, each element in the cone of the convex hull is the sum
- * of elements in the cones of the basic sets.
- * If a_i is the dilation factor of basic set i, then the problem
- * we need to solve is
- *
- *			min \sum_i x_{i,2}
- *			st
- *				\sum_i x_{i,1} = 1
- *				    a_i   >= 0
- *				  [ a_i ]
- *				A [ x_i ] >= 0
- *
- * with
- *				    [  1  ]
- *				A_i [ x_i ] >= 0
- *
- * the constraints of each (transformed) basic set.
- * If a = n/d, then the constraint defining the new facet (in the transformed
- * space) is
- *
- *			-n x_1 + d x_2 >= 0
- *
- * In the original space, we need to take the same combination of the
- * corresponding constraints "facet" and "ridge".
- *
- * If a = -infty = "-1/0", then we just return the original facet constraint.
- * This means that the facet is unbounded, but has a bounded intersection
- * with the union of sets.
- */
-isl_int *isl_set_wrap_facet(__isl_keep isl_set *set,
-	isl_int *facet, isl_int *ridge)
-{
-	int i;
-	isl_ctx *ctx;
-	struct isl_mat *T = NULL;
-	struct isl_basic_set *lp = NULL;
-	struct isl_vec *obj;
-	enum isl_lp_result res;
-	isl_int num, den;
-	unsigned dim;
-
-	if (!set)
-		return NULL;
-	ctx = set->ctx;
-	set = isl_set_copy(set);
-	set = isl_set_set_rational(set);
-
-	dim = 1 + isl_set_n_dim(set);
-	T = isl_mat_alloc(ctx, 3, dim);
-	if (!T)
-		goto error;
-	isl_int_set_si(T->row[0][0], 1);
-	isl_seq_clr(T->row[0]+1, dim - 1);
-	isl_seq_cpy(T->row[1], facet, dim);
-	isl_seq_cpy(T->row[2], ridge, dim);
-	T = isl_mat_right_inverse(T);
-	set = isl_set_preimage(set, T);
-	T = NULL;
-	if (!set)
-		goto error;
-	lp = wrap_constraints(set);
-	obj = isl_vec_alloc(ctx, 1 + dim*set->n);
-	if (!obj)
-		goto error;
-	isl_int_set_si(obj->block.data[0], 0);
-	for (i = 0; i < set->n; ++i) {
-		isl_seq_clr(obj->block.data + 1 + dim*i, 2);
-		isl_int_set_si(obj->block.data[1 + dim*i+2], 1);
-		isl_seq_clr(obj->block.data + 1 + dim*i+3, dim-3);
-	}
-	isl_int_init(num);
-	isl_int_init(den);
-	res = isl_basic_set_solve_lp(lp, 0,
-			    obj->block.data, ctx->one, &num, &den, NULL);
-	if (res == isl_lp_ok) {
-		isl_int_neg(num, num);
-		isl_seq_combine(facet, num, facet, den, ridge, dim);
-		isl_seq_normalize(ctx, facet, dim);
-	}
-	isl_int_clear(num);
-	isl_int_clear(den);
-	isl_vec_free(obj);
-	isl_basic_set_free(lp);
-	isl_set_free(set);
-	if (res == isl_lp_error)
-		return NULL;
-	isl_assert(ctx, res == isl_lp_ok || res == isl_lp_unbounded, 
-		   return NULL);
-	return facet;
-error:
-	isl_basic_set_free(lp);
-	isl_mat_free(T);
-	isl_set_free(set);
-	return NULL;
-}
-
-/* Compute the constraint of a facet of "set".
- *
- * We first compute the intersection with a bounding constraint
- * that is orthogonal to one of the coordinate axes.
- * If the affine hull of this intersection has only one equality,
- * we have found a facet.
- * Otherwise, we wrap the current bounding constraint around
- * one of the equalities of the face (one that is not equal to
- * the current bounding constraint).
- * This process continues until we have found a facet.
- * The dimension of the intersection increases by at least
- * one on each iteration, so termination is guaranteed.
- */
-static __isl_give isl_mat *initial_facet_constraint(__isl_keep isl_set *set)
-{
-	struct isl_set *slice = NULL;
-	struct isl_basic_set *face = NULL;
-	int i;
-	unsigned dim = isl_set_n_dim(set);
-	int is_bound;
-	isl_mat *bounds;
-
-	isl_assert(set->ctx, set->n > 0, goto error);
-	bounds = isl_mat_alloc(set->ctx, 1, 1 + dim);
-	if (!bounds)
-		return NULL;
-
-	isl_seq_clr(bounds->row[0], dim);
-	isl_int_set_si(bounds->row[0][1 + dim - 1], 1);
-	is_bound = uset_is_bound(set, bounds->row[0], 1 + dim);
-	if (is_bound < 0)
-		goto error;
-	isl_assert(set->ctx, is_bound, goto error);
-	isl_seq_normalize(set->ctx, bounds->row[0], 1 + dim);
-	bounds->n_row = 1;
-
-	for (;;) {
-		slice = isl_set_copy(set);
-		slice = isl_set_add_basic_set_equality(slice, bounds->row[0]);
-		face = isl_set_affine_hull(slice);
-		if (!face)
-			goto error;
-		if (face->n_eq == 1) {
-			isl_basic_set_free(face);
-			break;
-		}
-		for (i = 0; i < face->n_eq; ++i)
-			if (!isl_seq_eq(bounds->row[0], face->eq[i], 1 + dim) &&
-			    !isl_seq_is_neg(bounds->row[0],
-						face->eq[i], 1 + dim))
-				break;
-		isl_assert(set->ctx, i < face->n_eq, goto error);
-		if (!isl_set_wrap_facet(set, bounds->row[0], face->eq[i]))
-			goto error;
-		isl_seq_normalize(set->ctx, bounds->row[0], bounds->n_col);
-		isl_basic_set_free(face);
-	}
-
-	return bounds;
-error:
-	isl_basic_set_free(face);
-	isl_mat_free(bounds);
-	return NULL;
-}
-
-/* Given the bounding constraint "c" of a facet of the convex hull of "set",
- * compute a hyperplane description of the facet, i.e., compute the facets
- * of the facet.
- *
- * We compute an affine transformation that transforms the constraint
- *
- *			  [ 1 ]
- *			c [ x ] = 0
- *
- * to the constraint
- *
- *			   z_1  = 0
- *
- * by computing the right inverse U of a matrix that starts with the rows
- *
- *			[ 1 0 ]
- *			[  c  ]
- *
- * Then
- *			[ 1 ]     [ 1 ]
- *			[ x ] = U [ z ]
- * and
- *			[ 1 ]     [ 1 ]
- *			[ z ] = Q [ x ]
- *
- * with Q = U^{-1}
- * Since z_1 is zero, we can drop this variable as well as the corresponding
- * column of U to obtain
- *
- *			[ 1 ]      [ 1  ]
- *			[ x ] = U' [ z' ]
- * and
- *			[ 1  ]      [ 1 ]
- *			[ z' ] = Q' [ x ]
- *
- * with Q' equal to Q, but without the corresponding row.
- * After computing the facets of the facet in the z' space,
- * we convert them back to the x space through Q.
- */
-static struct isl_basic_set *compute_facet(struct isl_set *set, isl_int *c)
-{
-	struct isl_mat *m, *U, *Q;
-	struct isl_basic_set *facet = NULL;
-	struct isl_ctx *ctx;
-	unsigned dim;
-
-	ctx = set->ctx;
-	set = isl_set_copy(set);
-	dim = isl_set_n_dim(set);
-	m = isl_mat_alloc(set->ctx, 2, 1 + dim);
-	if (!m)
-		goto error;
-	isl_int_set_si(m->row[0][0], 1);
-	isl_seq_clr(m->row[0]+1, dim);
-	isl_seq_cpy(m->row[1], c, 1+dim);
-	U = isl_mat_right_inverse(m);
-	Q = isl_mat_right_inverse(isl_mat_copy(U));
-	U = isl_mat_drop_cols(U, 1, 1);
-	Q = isl_mat_drop_rows(Q, 1, 1);
-	set = isl_set_preimage(set, U);
-	facet = uset_convex_hull_wrap_bounded(set);
-	facet = isl_basic_set_preimage(facet, Q);
-	if (facet)
-		isl_assert(ctx, facet->n_eq == 0, goto error);
-	return facet;
-error:
-	isl_basic_set_free(facet);
-	isl_set_free(set);
-	return NULL;
-}
-
-/* Given an initial facet constraint, compute the remaining facets.
- * We do this by running through all facets found so far and computing
- * the adjacent facets through wrapping, adding those facets that we
- * hadn't already found before.
- *
- * For each facet we have found so far, we first compute its facets
- * in the resulting convex hull.  That is, we compute the ridges
- * of the resulting convex hull contained in the facet.
- * We also compute the corresponding facet in the current approximation
- * of the convex hull.  There is no need to wrap around the ridges
- * in this facet since that would result in a facet that is already
- * present in the current approximation.
- *
- * This function can still be significantly optimized by checking which of
- * the facets of the basic sets are also facets of the convex hull and
- * using all the facets so far to help in constructing the facets of the
- * facets
- * and/or
- * using the technique in section "3.1 Ridge Generation" of
- * "Extended Convex Hull" by Fukuda et al.
- */
-static struct isl_basic_set *extend(struct isl_basic_set *hull,
-	struct isl_set *set)
-{
-	int i, j, f;
-	int k;
-	struct isl_basic_set *facet = NULL;
-	struct isl_basic_set *hull_facet = NULL;
-	unsigned dim;
-
-	if (!hull)
-		return NULL;
-
-	isl_assert(set->ctx, set->n > 0, goto error);
-
-	dim = isl_set_n_dim(set);
-
-	for (i = 0; i < hull->n_ineq; ++i) {
-		facet = compute_facet(set, hull->ineq[i]);
-		facet = isl_basic_set_add_equality(facet, hull->ineq[i]);
-		facet = isl_basic_set_gauss(facet, NULL);
-		facet = isl_basic_set_normalize_constraints(facet);
-		hull_facet = isl_basic_set_copy(hull);
-		hull_facet = isl_basic_set_add_equality(hull_facet, hull->ineq[i]);
-		hull_facet = isl_basic_set_gauss(hull_facet, NULL);
-		hull_facet = isl_basic_set_normalize_constraints(hull_facet);
-		if (!facet || !hull_facet)
-			goto error;
-		hull = isl_basic_set_cow(hull);
-		hull = isl_basic_set_extend_dim(hull,
-			isl_dim_copy(hull->dim), 0, 0, facet->n_ineq);
-		if (!hull)
-			goto error;
-		for (j = 0; j < facet->n_ineq; ++j) {
-			for (f = 0; f < hull_facet->n_ineq; ++f)
-				if (isl_seq_eq(facet->ineq[j],
-						hull_facet->ineq[f], 1 + dim))
-					break;
-			if (f < hull_facet->n_ineq)
-				continue;
-			k = isl_basic_set_alloc_inequality(hull);
-			if (k < 0)
-				goto error;
-			isl_seq_cpy(hull->ineq[k], hull->ineq[i], 1+dim);
-			if (!isl_set_wrap_facet(set, hull->ineq[k], facet->ineq[j]))
-				goto error;
-		}
-		isl_basic_set_free(hull_facet);
-		isl_basic_set_free(facet);
-	}
-	hull = isl_basic_set_simplify(hull);
-	hull = isl_basic_set_finalize(hull);
-	return hull;
-error:
-	isl_basic_set_free(hull_facet);
-	isl_basic_set_free(facet);
-	isl_basic_set_free(hull);
-	return NULL;
-}
-
-/* Special case for computing the convex hull of a one dimensional set.
- * We simply collect the lower and upper bounds of each basic set
- * and the biggest of those.
- */
-static struct isl_basic_set *convex_hull_1d(struct isl_set *set)
-{
-	struct isl_mat *c = NULL;
-	isl_int *lower = NULL;
-	isl_int *upper = NULL;
-	int i, j, k;
-	isl_int a, b;
-	struct isl_basic_set *hull;
-
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_basic_set_simplify(set->p[i]);
-		if (!set->p[i])
-			goto error;
-	}
-	set = isl_set_remove_empty_parts(set);
-	if (!set)
-		goto error;
-	isl_assert(set->ctx, set->n > 0, goto error);
-	c = isl_mat_alloc(set->ctx, 2, 2);
-	if (!c)
-		goto error;
-
-	if (set->p[0]->n_eq > 0) {
-		isl_assert(set->ctx, set->p[0]->n_eq == 1, goto error);
-		lower = c->row[0];
-		upper = c->row[1];
-		if (isl_int_is_pos(set->p[0]->eq[0][1])) {
-			isl_seq_cpy(lower, set->p[0]->eq[0], 2);
-			isl_seq_neg(upper, set->p[0]->eq[0], 2);
-		} else {
-			isl_seq_neg(lower, set->p[0]->eq[0], 2);
-			isl_seq_cpy(upper, set->p[0]->eq[0], 2);
-		}
-	} else {
-		for (j = 0; j < set->p[0]->n_ineq; ++j) {
-			if (isl_int_is_pos(set->p[0]->ineq[j][1])) {
-				lower = c->row[0];
-				isl_seq_cpy(lower, set->p[0]->ineq[j], 2);
-			} else {
-				upper = c->row[1];
-				isl_seq_cpy(upper, set->p[0]->ineq[j], 2);
-			}
-		}
-	}
-
-	isl_int_init(a);
-	isl_int_init(b);
-	for (i = 0; i < set->n; ++i) {
-		struct isl_basic_set *bset = set->p[i];
-		int has_lower = 0;
-		int has_upper = 0;
-
-		for (j = 0; j < bset->n_eq; ++j) {
-			has_lower = 1;
-			has_upper = 1;
-			if (lower) {
-				isl_int_mul(a, lower[0], bset->eq[j][1]);
-				isl_int_mul(b, lower[1], bset->eq[j][0]);
-				if (isl_int_lt(a, b) && isl_int_is_pos(bset->eq[j][1]))
-					isl_seq_cpy(lower, bset->eq[j], 2);
-				if (isl_int_gt(a, b) && isl_int_is_neg(bset->eq[j][1]))
-					isl_seq_neg(lower, bset->eq[j], 2);
-			}
-			if (upper) {
-				isl_int_mul(a, upper[0], bset->eq[j][1]);
-				isl_int_mul(b, upper[1], bset->eq[j][0]);
-				if (isl_int_lt(a, b) && isl_int_is_pos(bset->eq[j][1]))
-					isl_seq_neg(upper, bset->eq[j], 2);
-				if (isl_int_gt(a, b) && isl_int_is_neg(bset->eq[j][1]))
-					isl_seq_cpy(upper, bset->eq[j], 2);
-			}
-		}
-		for (j = 0; j < bset->n_ineq; ++j) {
-			if (isl_int_is_pos(bset->ineq[j][1]))
-				has_lower = 1;
-			if (isl_int_is_neg(bset->ineq[j][1]))
-				has_upper = 1;
-			if (lower && isl_int_is_pos(bset->ineq[j][1])) {
-				isl_int_mul(a, lower[0], bset->ineq[j][1]);
-				isl_int_mul(b, lower[1], bset->ineq[j][0]);
-				if (isl_int_lt(a, b))
-					isl_seq_cpy(lower, bset->ineq[j], 2);
-			}
-			if (upper && isl_int_is_neg(bset->ineq[j][1])) {
-				isl_int_mul(a, upper[0], bset->ineq[j][1]);
-				isl_int_mul(b, upper[1], bset->ineq[j][0]);
-				if (isl_int_gt(a, b))
-					isl_seq_cpy(upper, bset->ineq[j], 2);
-			}
-		}
-		if (!has_lower)
-			lower = NULL;
-		if (!has_upper)
-			upper = NULL;
-	}
-	isl_int_clear(a);
-	isl_int_clear(b);
-
-	hull = isl_basic_set_alloc(set->ctx, 0, 1, 0, 0, 2);
-	hull = isl_basic_set_set_rational(hull);
-	if (!hull)
-		goto error;
-	if (lower) {
-		k = isl_basic_set_alloc_inequality(hull);
-		isl_seq_cpy(hull->ineq[k], lower, 2);
-	}
-	if (upper) {
-		k = isl_basic_set_alloc_inequality(hull);
-		isl_seq_cpy(hull->ineq[k], upper, 2);
-	}
-	hull = isl_basic_set_finalize(hull);
-	isl_set_free(set);
-	isl_mat_free(c);
-	return hull;
-error:
-	isl_set_free(set);
-	isl_mat_free(c);
-	return NULL;
-}
-
-static struct isl_basic_set *convex_hull_0d(struct isl_set *set)
-{
-	struct isl_basic_set *convex_hull;
-
-	if (!set)
-		return NULL;
-
-	if (isl_set_is_empty(set))
-		convex_hull = isl_basic_set_empty(isl_dim_copy(set->dim));
-	else
-		convex_hull = isl_basic_set_universe(isl_dim_copy(set->dim));
-	isl_set_free(set);
-	return convex_hull;
-}
-
-/* Compute the convex hull of a pair of basic sets without any parameters or
- * integer divisions using Fourier-Motzkin elimination.
- * The convex hull is the set of all points that can be written as
- * the sum of points from both basic sets (in homogeneous coordinates).
- * We set up the constraints in a space with dimensions for each of
- * the three sets and then project out the dimensions corresponding
- * to the two original basic sets, retaining only those corresponding
- * to the convex hull.
- */
-static struct isl_basic_set *convex_hull_pair_elim(struct isl_basic_set *bset1,
-	struct isl_basic_set *bset2)
-{
-	int i, j, k;
-	struct isl_basic_set *bset[2];
-	struct isl_basic_set *hull = NULL;
-	unsigned dim;
-
-	if (!bset1 || !bset2)
-		goto error;
-
-	dim = isl_basic_set_n_dim(bset1);
-	hull = isl_basic_set_alloc(bset1->ctx, 0, 2 + 3 * dim, 0,
-				1 + dim + bset1->n_eq + bset2->n_eq,
-				2 + bset1->n_ineq + bset2->n_ineq);
-	bset[0] = bset1;
-	bset[1] = bset2;
-	for (i = 0; i < 2; ++i) {
-		for (j = 0; j < bset[i]->n_eq; ++j) {
-			k = isl_basic_set_alloc_equality(hull);
-			if (k < 0)
-				goto error;
-			isl_seq_clr(hull->eq[k], (i+1) * (1+dim));
-			isl_seq_clr(hull->eq[k]+(i+2)*(1+dim), (1-i)*(1+dim));
-			isl_seq_cpy(hull->eq[k]+(i+1)*(1+dim), bset[i]->eq[j],
-					1+dim);
-		}
-		for (j = 0; j < bset[i]->n_ineq; ++j) {
-			k = isl_basic_set_alloc_inequality(hull);
-			if (k < 0)
-				goto error;
-			isl_seq_clr(hull->ineq[k], (i+1) * (1+dim));
-			isl_seq_clr(hull->ineq[k]+(i+2)*(1+dim), (1-i)*(1+dim));
-			isl_seq_cpy(hull->ineq[k]+(i+1)*(1+dim),
-					bset[i]->ineq[j], 1+dim);
-		}
-		k = isl_basic_set_alloc_inequality(hull);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(hull->ineq[k], 1+2+3*dim);
-		isl_int_set_si(hull->ineq[k][(i+1)*(1+dim)], 1);
-	}
-	for (j = 0; j < 1+dim; ++j) {
-		k = isl_basic_set_alloc_equality(hull);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(hull->eq[k], 1+2+3*dim);
-		isl_int_set_si(hull->eq[k][j], -1);
-		isl_int_set_si(hull->eq[k][1+dim+j], 1);
-		isl_int_set_si(hull->eq[k][2*(1+dim)+j], 1);
-	}
-	hull = isl_basic_set_set_rational(hull);
-	hull = isl_basic_set_remove_dims(hull, isl_dim_set, dim, 2*(1+dim));
-	hull = isl_basic_set_remove_redundancies(hull);
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	return hull;
-error:
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	isl_basic_set_free(hull);
-	return NULL;
-}
-
-/* Is the set bounded for each value of the parameters?
- */
-int isl_basic_set_is_bounded(__isl_keep isl_basic_set *bset)
-{
-	struct isl_tab *tab;
-	int bounded;
-
-	if (!bset)
-		return -1;
-	if (isl_basic_set_plain_is_empty(bset))
-		return 1;
-
-	tab = isl_tab_from_recession_cone(bset, 1);
-	bounded = isl_tab_cone_is_bounded(tab);
-	isl_tab_free(tab);
-	return bounded;
-}
-
-/* Is the image bounded for each value of the parameters and
- * the domain variables?
- */
-int isl_basic_map_image_is_bounded(__isl_keep isl_basic_map *bmap)
-{
-	unsigned nparam = isl_basic_map_dim(bmap, isl_dim_param);
-	unsigned n_in = isl_basic_map_dim(bmap, isl_dim_in);
-	int bounded;
-
-	bmap = isl_basic_map_copy(bmap);
-	bmap = isl_basic_map_cow(bmap);
-	bmap = isl_basic_map_move_dims(bmap, isl_dim_param, nparam,
-					isl_dim_in, 0, n_in);
-	bounded = isl_basic_set_is_bounded((isl_basic_set *)bmap);
-	isl_basic_map_free(bmap);
-
-	return bounded;
-}
-
-/* Is the set bounded for each value of the parameters?
- */
-int isl_set_is_bounded(__isl_keep isl_set *set)
-{
-	int i;
-
-	if (!set)
-		return -1;
-
-	for (i = 0; i < set->n; ++i) {
-		int bounded = isl_basic_set_is_bounded(set->p[i]);
-		if (!bounded || bounded < 0)
-			return bounded;
-	}
-	return 1;
-}
-
-/* Compute the lineality space of the convex hull of bset1 and bset2.
- *
- * We first compute the intersection of the recession cone of bset1
- * with the negative of the recession cone of bset2 and then compute
- * the linear hull of the resulting cone.
- */
-static struct isl_basic_set *induced_lineality_space(
-	struct isl_basic_set *bset1, struct isl_basic_set *bset2)
-{
-	int i, k;
-	struct isl_basic_set *lin = NULL;
-	unsigned dim;
-
-	if (!bset1 || !bset2)
-		goto error;
-
-	dim = isl_basic_set_total_dim(bset1);
-	lin = isl_basic_set_alloc_dim(isl_basic_set_get_dim(bset1), 0,
-					bset1->n_eq + bset2->n_eq,
-					bset1->n_ineq + bset2->n_ineq);
-	lin = isl_basic_set_set_rational(lin);
-	if (!lin)
-		goto error;
-	for (i = 0; i < bset1->n_eq; ++i) {
-		k = isl_basic_set_alloc_equality(lin);
-		if (k < 0)
-			goto error;
-		isl_int_set_si(lin->eq[k][0], 0);
-		isl_seq_cpy(lin->eq[k] + 1, bset1->eq[i] + 1, dim);
-	}
-	for (i = 0; i < bset1->n_ineq; ++i) {
-		k = isl_basic_set_alloc_inequality(lin);
-		if (k < 0)
-			goto error;
-		isl_int_set_si(lin->ineq[k][0], 0);
-		isl_seq_cpy(lin->ineq[k] + 1, bset1->ineq[i] + 1, dim);
-	}
-	for (i = 0; i < bset2->n_eq; ++i) {
-		k = isl_basic_set_alloc_equality(lin);
-		if (k < 0)
-			goto error;
-		isl_int_set_si(lin->eq[k][0], 0);
-		isl_seq_neg(lin->eq[k] + 1, bset2->eq[i] + 1, dim);
-	}
-	for (i = 0; i < bset2->n_ineq; ++i) {
-		k = isl_basic_set_alloc_inequality(lin);
-		if (k < 0)
-			goto error;
-		isl_int_set_si(lin->ineq[k][0], 0);
-		isl_seq_neg(lin->ineq[k] + 1, bset2->ineq[i] + 1, dim);
-	}
-
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	return isl_basic_set_affine_hull(lin);
-error:
-	isl_basic_set_free(lin);
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	return NULL;
-}
-
-static struct isl_basic_set *uset_convex_hull(struct isl_set *set);
-
-/* Given a set and a linear space "lin" of dimension n > 0,
- * project the linear space from the set, compute the convex hull
- * and then map the set back to the original space.
- *
- * Let
- *
- *	M x = 0
- *
- * describe the linear space.  We first compute the Hermite normal
- * form H = M U of M = H Q, to obtain
- *
- *	H Q x = 0
- *
- * The last n rows of H will be zero, so the last n variables of x' = Q x
- * are the one we want to project out.  We do this by transforming each
- * basic set A x >= b to A U x' >= b and then removing the last n dimensions.
- * After computing the convex hull in x'_1, i.e., A' x'_1 >= b',
- * we transform the hull back to the original space as A' Q_1 x >= b',
- * with Q_1 all but the last n rows of Q.
- */
-static struct isl_basic_set *modulo_lineality(struct isl_set *set,
-	struct isl_basic_set *lin)
-{
-	unsigned total = isl_basic_set_total_dim(lin);
-	unsigned lin_dim;
-	struct isl_basic_set *hull;
-	struct isl_mat *M, *U, *Q;
-
-	if (!set || !lin)
-		goto error;
-	lin_dim = total - lin->n_eq;
-	M = isl_mat_sub_alloc6(set->ctx, lin->eq, 0, lin->n_eq, 1, total);
-	M = isl_mat_left_hermite(M, 0, &U, &Q);
-	if (!M)
-		goto error;
-	isl_mat_free(M);
-	isl_basic_set_free(lin);
-
-	Q = isl_mat_drop_rows(Q, Q->n_row - lin_dim, lin_dim);
-
-	U = isl_mat_lin_to_aff(U);
-	Q = isl_mat_lin_to_aff(Q);
-
-	set = isl_set_preimage(set, U);
-	set = isl_set_remove_dims(set, isl_dim_set, total - lin_dim, lin_dim);
-	hull = uset_convex_hull(set);
-	hull = isl_basic_set_preimage(hull, Q);
-
-	return hull;
-error:
-	isl_basic_set_free(lin);
-	isl_set_free(set);
-	return NULL;
-}
-
-/* Given two polyhedra with as constraints h_{ij} x >= 0 in homegeneous space,
- * set up an LP for solving
- *
- *	\sum_j \alpha_{1j} h_{1j} = \sum_j \alpha_{2j} h_{2j}
- *
- * \alpha{i0} corresponds to the (implicit) positivity constraint 1 >= 0
- * The next \alpha{ij} correspond to the equalities and come in pairs.
- * The final \alpha{ij} correspond to the inequalities.
- */
-static struct isl_basic_set *valid_direction_lp(
-	struct isl_basic_set *bset1, struct isl_basic_set *bset2)
-{
-	struct isl_dim *dim;
-	struct isl_basic_set *lp;
-	unsigned d;
-	int n;
-	int i, j, k;
-
-	if (!bset1 || !bset2)
-		goto error;
-	d = 1 + isl_basic_set_total_dim(bset1);
-	n = 2 +
-	    2 * bset1->n_eq + bset1->n_ineq + 2 * bset2->n_eq + bset2->n_ineq;
-	dim = isl_dim_set_alloc(bset1->ctx, 0, n);
-	lp = isl_basic_set_alloc_dim(dim, 0, d, n);
-	if (!lp)
-		goto error;
-	for (i = 0; i < n; ++i) {
-		k = isl_basic_set_alloc_inequality(lp);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(lp->ineq[k] + 1, n);
-		isl_int_set_si(lp->ineq[k][0], -1);
-		isl_int_set_si(lp->ineq[k][1 + i], 1);
-	}
-	for (i = 0; i < d; ++i) {
-		k = isl_basic_set_alloc_equality(lp);
-		if (k < 0)
-			goto error;
-		n = 0;
-		isl_int_set_si(lp->eq[k][n], 0); n++;
-		/* positivity constraint 1 >= 0 */
-		isl_int_set_si(lp->eq[k][n], i == 0); n++;
-		for (j = 0; j < bset1->n_eq; ++j) {
-			isl_int_set(lp->eq[k][n], bset1->eq[j][i]); n++;
-			isl_int_neg(lp->eq[k][n], bset1->eq[j][i]); n++;
-		}
-		for (j = 0; j < bset1->n_ineq; ++j) {
-			isl_int_set(lp->eq[k][n], bset1->ineq[j][i]); n++;
-		}
-		/* positivity constraint 1 >= 0 */
-		isl_int_set_si(lp->eq[k][n], -(i == 0)); n++;
-		for (j = 0; j < bset2->n_eq; ++j) {
-			isl_int_neg(lp->eq[k][n], bset2->eq[j][i]); n++;
-			isl_int_set(lp->eq[k][n], bset2->eq[j][i]); n++;
-		}
-		for (j = 0; j < bset2->n_ineq; ++j) {
-			isl_int_neg(lp->eq[k][n], bset2->ineq[j][i]); n++;
-		}
-	}
-	lp = isl_basic_set_gauss(lp, NULL);
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	return lp;
-error:
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	return NULL;
-}
-
-/* Compute a vector s in the homogeneous space such that <s, r> > 0
- * for all rays in the homogeneous space of the two cones that correspond
- * to the input polyhedra bset1 and bset2.
- *
- * We compute s as a vector that satisfies
- *
- *	s = \sum_j \alpha_{ij} h_{ij}	for i = 1,2			(*)
- *
- * with h_{ij} the normals of the facets of polyhedron i
- * (including the "positivity constraint" 1 >= 0) and \alpha_{ij}
- * strictly positive numbers.  For simplicity we impose \alpha_{ij} >= 1.
- * We first set up an LP with as variables the \alpha{ij}.
- * In this formulation, for each polyhedron i,
- * the first constraint is the positivity constraint, followed by pairs
- * of variables for the equalities, followed by variables for the inequalities.
- * We then simply pick a feasible solution and compute s using (*).
- *
- * Note that we simply pick any valid direction and make no attempt
- * to pick a "good" or even the "best" valid direction.
- */
-static struct isl_vec *valid_direction(
-	struct isl_basic_set *bset1, struct isl_basic_set *bset2)
-{
-	struct isl_basic_set *lp;
-	struct isl_tab *tab;
-	struct isl_vec *sample = NULL;
-	struct isl_vec *dir;
-	unsigned d;
-	int i;
-	int n;
-
-	if (!bset1 || !bset2)
-		goto error;
-	lp = valid_direction_lp(isl_basic_set_copy(bset1),
-				isl_basic_set_copy(bset2));
-	tab = isl_tab_from_basic_set(lp);
-	sample = isl_tab_get_sample_value(tab);
-	isl_tab_free(tab);
-	isl_basic_set_free(lp);
-	if (!sample)
-		goto error;
-	d = isl_basic_set_total_dim(bset1);
-	dir = isl_vec_alloc(bset1->ctx, 1 + d);
-	if (!dir)
-		goto error;
-	isl_seq_clr(dir->block.data + 1, dir->size - 1);
-	n = 1;
-	/* positivity constraint 1 >= 0 */
-	isl_int_set(dir->block.data[0], sample->block.data[n]); n++;
-	for (i = 0; i < bset1->n_eq; ++i) {
-		isl_int_sub(sample->block.data[n],
-			    sample->block.data[n], sample->block.data[n+1]);
-		isl_seq_combine(dir->block.data,
-				bset1->ctx->one, dir->block.data,
-				sample->block.data[n], bset1->eq[i], 1 + d);
-
-		n += 2;
-	}
-	for (i = 0; i < bset1->n_ineq; ++i)
-		isl_seq_combine(dir->block.data,
-				bset1->ctx->one, dir->block.data,
-				sample->block.data[n++], bset1->ineq[i], 1 + d);
-	isl_vec_free(sample);
-	isl_seq_normalize(bset1->ctx, dir->el, dir->size);
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	return dir;
-error:
-	isl_vec_free(sample);
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	return NULL;
-}
-
-/* Given a polyhedron b_i + A_i x >= 0 and a map T = S^{-1},
- * compute b_i' + A_i' x' >= 0, with
- *
- *	[ b_i A_i ]        [ y' ]		              [ y' ]
- *	[  1   0  ] S^{-1} [ x' ] >= 0	or	[ b_i' A_i' ] [ x' ] >= 0
- *
- * In particular, add the "positivity constraint" and then perform
- * the mapping.
- */
-static struct isl_basic_set *homogeneous_map(struct isl_basic_set *bset,
-	struct isl_mat *T)
-{
-	int k;
-
-	if (!bset)
-		goto error;
-	bset = isl_basic_set_extend_constraints(bset, 0, 1);
-	k = isl_basic_set_alloc_inequality(bset);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(bset->ineq[k] + 1, isl_basic_set_total_dim(bset));
-	isl_int_set_si(bset->ineq[k][0], 1);
-	bset = isl_basic_set_preimage(bset, T);
-	return bset;
-error:
-	isl_mat_free(T);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Compute the convex hull of a pair of basic sets without any parameters or
- * integer divisions, where the convex hull is known to be pointed,
- * but the basic sets may be unbounded.
- *
- * We turn this problem into the computation of a convex hull of a pair
- * _bounded_ polyhedra by "changing the direction of the homogeneous
- * dimension".  This idea is due to Matthias Koeppe.
- *
- * Consider the cones in homogeneous space that correspond to the
- * input polyhedra.  The rays of these cones are also rays of the
- * polyhedra if the coordinate that corresponds to the homogeneous
- * dimension is zero.  That is, if the inner product of the rays
- * with the homogeneous direction is zero.
- * The cones in the homogeneous space can also be considered to
- * correspond to other pairs of polyhedra by chosing a different
- * homogeneous direction.  To ensure that both of these polyhedra
- * are bounded, we need to make sure that all rays of the cones
- * correspond to vertices and not to rays.
- * Let s be a direction such that <s, r> > 0 for all rays r of both cones.
- * Then using s as a homogeneous direction, we obtain a pair of polytopes.
- * The vector s is computed in valid_direction.
- *
- * Note that we need to consider _all_ rays of the cones and not just
- * the rays that correspond to rays in the polyhedra.  If we were to
- * only consider those rays and turn them into vertices, then we
- * may inadvertently turn some vertices into rays.
- *
- * The standard homogeneous direction is the unit vector in the 0th coordinate.
- * We therefore transform the two polyhedra such that the selected
- * direction is mapped onto this standard direction and then proceed
- * with the normal computation.
- * Let S be a non-singular square matrix with s as its first row,
- * then we want to map the polyhedra to the space
- *
- *	[ y' ]     [ y ]		[ y ]          [ y' ]
- *	[ x' ] = S [ x ]	i.e.,	[ x ] = S^{-1} [ x' ]
- *
- * We take S to be the unimodular completion of s to limit the growth
- * of the coefficients in the following computations.
- *
- * Let b_i + A_i x >= 0 be the constraints of polyhedron i.
- * We first move to the homogeneous dimension
- *
- *	b_i y + A_i x >= 0		[ b_i A_i ] [ y ]    [ 0 ]
- *	    y         >= 0	or	[  1   0  ] [ x ] >= [ 0 ]
- *
- * Then we change directoin
- *
- *	[ b_i A_i ]        [ y' ]		              [ y' ]
- *	[  1   0  ] S^{-1} [ x' ] >= 0	or	[ b_i' A_i' ] [ x' ] >= 0
- *
- * Then we compute the convex hull of the polytopes b_i' + A_i' x' >= 0
- * resulting in b' + A' x' >= 0, which we then convert back
- *
- *	            [ y ]		        [ y ]
- *	[ b' A' ] S [ x ] >= 0	or	[ b A ] [ x ] >= 0
- *
- * The polyhedron b + A x >= 0 is then the convex hull of the input polyhedra.
- */
-static struct isl_basic_set *convex_hull_pair_pointed(
-	struct isl_basic_set *bset1, struct isl_basic_set *bset2)
-{
-	struct isl_ctx *ctx = NULL;
-	struct isl_vec *dir = NULL;
-	struct isl_mat *T = NULL;
-	struct isl_mat *T2 = NULL;
-	struct isl_basic_set *hull;
-	struct isl_set *set;
-
-	if (!bset1 || !bset2)
-		goto error;
-	ctx = bset1->ctx;
-	dir = valid_direction(isl_basic_set_copy(bset1),
-				isl_basic_set_copy(bset2));
-	if (!dir)
-		goto error;
-	T = isl_mat_alloc(bset1->ctx, dir->size, dir->size);
-	if (!T)
-		goto error;
-	isl_seq_cpy(T->row[0], dir->block.data, dir->size);
-	T = isl_mat_unimodular_complete(T, 1);
-	T2 = isl_mat_right_inverse(isl_mat_copy(T));
-
-	bset1 = homogeneous_map(bset1, isl_mat_copy(T2));
-	bset2 = homogeneous_map(bset2, T2);
-	set = isl_set_alloc_dim(isl_basic_set_get_dim(bset1), 2, 0);
-	set = isl_set_add_basic_set(set, bset1);
-	set = isl_set_add_basic_set(set, bset2);
-	hull = uset_convex_hull(set);
-	hull = isl_basic_set_preimage(hull, T);
-	 
-	isl_vec_free(dir);
-
-	return hull;
-error:
-	isl_vec_free(dir);
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	return NULL;
-}
-
-static struct isl_basic_set *uset_convex_hull_wrap(struct isl_set *set);
-static struct isl_basic_set *modulo_affine_hull(
-	struct isl_set *set, struct isl_basic_set *affine_hull);
-
-/* Compute the convex hull of a pair of basic sets without any parameters or
- * integer divisions.
- *
- * This function is called from uset_convex_hull_unbounded, which
- * means that the complete convex hull is unbounded.  Some pairs
- * of basic sets may still be bounded, though.
- * They may even lie inside a lower dimensional space, in which
- * case they need to be handled inside their affine hull since
- * the main algorithm assumes that the result is full-dimensional.
- *
- * If the convex hull of the two basic sets would have a non-trivial
- * lineality space, we first project out this lineality space.
- */
-static struct isl_basic_set *convex_hull_pair(struct isl_basic_set *bset1,
-	struct isl_basic_set *bset2)
-{
-	isl_basic_set *lin, *aff;
-	int bounded1, bounded2;
-
-	if (bset1->ctx->opt->convex == ISL_CONVEX_HULL_FM)
-		return convex_hull_pair_elim(bset1, bset2);
-
-	aff = isl_set_affine_hull(isl_basic_set_union(isl_basic_set_copy(bset1),
-						    isl_basic_set_copy(bset2)));
-	if (!aff)
-		goto error;
-	if (aff->n_eq != 0) 
-		return modulo_affine_hull(isl_basic_set_union(bset1, bset2), aff);
-	isl_basic_set_free(aff);
-
-	bounded1 = isl_basic_set_is_bounded(bset1);
-	bounded2 = isl_basic_set_is_bounded(bset2);
-
-	if (bounded1 < 0 || bounded2 < 0)
-		goto error;
-
-	if (bounded1 && bounded2)
-		uset_convex_hull_wrap(isl_basic_set_union(bset1, bset2));
-
-	if (bounded1 || bounded2)
-		return convex_hull_pair_pointed(bset1, bset2);
-
-	lin = induced_lineality_space(isl_basic_set_copy(bset1),
-				      isl_basic_set_copy(bset2));
-	if (!lin)
-		goto error;
-	if (isl_basic_set_is_universe(lin)) {
-		isl_basic_set_free(bset1);
-		isl_basic_set_free(bset2);
-		return lin;
-	}
-	if (lin->n_eq < isl_basic_set_total_dim(lin)) {
-		struct isl_set *set;
-		set = isl_set_alloc_dim(isl_basic_set_get_dim(bset1), 2, 0);
-		set = isl_set_add_basic_set(set, bset1);
-		set = isl_set_add_basic_set(set, bset2);
-		return modulo_lineality(set, lin);
-	}
-	isl_basic_set_free(lin);
-
-	return convex_hull_pair_pointed(bset1, bset2);
-error:
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	return NULL;
-}
-
-/* Compute the lineality space of a basic set.
- * We currently do not allow the basic set to have any divs.
- * We basically just drop the constants and turn every inequality
- * into an equality.
- */
-struct isl_basic_set *isl_basic_set_lineality_space(struct isl_basic_set *bset)
-{
-	int i, k;
-	struct isl_basic_set *lin = NULL;
-	unsigned dim;
-
-	if (!bset)
-		goto error;
-	isl_assert(bset->ctx, bset->n_div == 0, goto error);
-	dim = isl_basic_set_total_dim(bset);
-
-	lin = isl_basic_set_alloc_dim(isl_basic_set_get_dim(bset), 0, dim, 0);
-	if (!lin)
-		goto error;
-	for (i = 0; i < bset->n_eq; ++i) {
-		k = isl_basic_set_alloc_equality(lin);
-		if (k < 0)
-			goto error;
-		isl_int_set_si(lin->eq[k][0], 0);
-		isl_seq_cpy(lin->eq[k] + 1, bset->eq[i] + 1, dim);
-	}
-	lin = isl_basic_set_gauss(lin, NULL);
-	if (!lin)
-		goto error;
-	for (i = 0; i < bset->n_ineq && lin->n_eq < dim; ++i) {
-		k = isl_basic_set_alloc_equality(lin);
-		if (k < 0)
-			goto error;
-		isl_int_set_si(lin->eq[k][0], 0);
-		isl_seq_cpy(lin->eq[k] + 1, bset->ineq[i] + 1, dim);
-		lin = isl_basic_set_gauss(lin, NULL);
-		if (!lin)
-			goto error;
-	}
-	isl_basic_set_free(bset);
-	return lin;
-error:
-	isl_basic_set_free(lin);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Compute the (linear) hull of the lineality spaces of the basic sets in the
- * "underlying" set "set".
- */
-static struct isl_basic_set *uset_combined_lineality_space(struct isl_set *set)
-{
-	int i;
-	struct isl_set *lin = NULL;
-
-	if (!set)
-		return NULL;
-	if (set->n == 0) {
-		struct isl_dim *dim = isl_set_get_dim(set);
-		isl_set_free(set);
-		return isl_basic_set_empty(dim);
-	}
-
-	lin = isl_set_alloc_dim(isl_set_get_dim(set), set->n, 0);
-	for (i = 0; i < set->n; ++i)
-		lin = isl_set_add_basic_set(lin,
-		    isl_basic_set_lineality_space(isl_basic_set_copy(set->p[i])));
-	isl_set_free(set);
-	return isl_set_affine_hull(lin);
-}
-
-/* Compute the convex hull of a set without any parameters or
- * integer divisions.
- * In each step, we combined two basic sets until only one
- * basic set is left.
- * The input basic sets are assumed not to have a non-trivial
- * lineality space.  If any of the intermediate results has
- * a non-trivial lineality space, it is projected out.
- */
-static struct isl_basic_set *uset_convex_hull_unbounded(struct isl_set *set)
-{
-	struct isl_basic_set *convex_hull = NULL;
-
-	convex_hull = isl_set_copy_basic_set(set);
-	set = isl_set_drop_basic_set(set, convex_hull);
-	if (!set)
-		goto error;
-	while (set->n > 0) {
-		struct isl_basic_set *t;
-		t = isl_set_copy_basic_set(set);
-		if (!t)
-			goto error;
-		set = isl_set_drop_basic_set(set, t);
-		if (!set)
-			goto error;
-		convex_hull = convex_hull_pair(convex_hull, t);
-		if (set->n == 0)
-			break;
-		t = isl_basic_set_lineality_space(isl_basic_set_copy(convex_hull));
-		if (!t)
-			goto error;
-		if (isl_basic_set_is_universe(t)) {
-			isl_basic_set_free(convex_hull);
-			convex_hull = t;
-			break;
-		}
-		if (t->n_eq < isl_basic_set_total_dim(t)) {
-			set = isl_set_add_basic_set(set, convex_hull);
-			return modulo_lineality(set, t);
-		}
-		isl_basic_set_free(t);
-	}
-	isl_set_free(set);
-	return convex_hull;
-error:
-	isl_set_free(set);
-	isl_basic_set_free(convex_hull);
-	return NULL;
-}
-
-/* Compute an initial hull for wrapping containing a single initial
- * facet.
- * This function assumes that the given set is bounded.
- */
-static struct isl_basic_set *initial_hull(struct isl_basic_set *hull,
-	struct isl_set *set)
-{
-	struct isl_mat *bounds = NULL;
-	unsigned dim;
-	int k;
-
-	if (!hull)
-		goto error;
-	bounds = initial_facet_constraint(set);
-	if (!bounds)
-		goto error;
-	k = isl_basic_set_alloc_inequality(hull);
-	if (k < 0)
-		goto error;
-	dim = isl_set_n_dim(set);
-	isl_assert(set->ctx, 1 + dim == bounds->n_col, goto error);
-	isl_seq_cpy(hull->ineq[k], bounds->row[0], bounds->n_col);
-	isl_mat_free(bounds);
-
-	return hull;
-error:
-	isl_basic_set_free(hull);
-	isl_mat_free(bounds);
-	return NULL;
-}
-
-struct max_constraint {
-	struct isl_mat *c;
-	int	 	count;
-	int		ineq;
-};
-
-static int max_constraint_equal(const void *entry, const void *val)
-{
-	struct max_constraint *a = (struct max_constraint *)entry;
-	isl_int *b = (isl_int *)val;
-
-	return isl_seq_eq(a->c->row[0] + 1, b, a->c->n_col - 1);
-}
-
-static void update_constraint(struct isl_ctx *ctx, struct isl_hash_table *table,
-	isl_int *con, unsigned len, int n, int ineq)
-{
-	struct isl_hash_table_entry *entry;
-	struct max_constraint *c;
-	uint32_t c_hash;
-
-	c_hash = isl_seq_get_hash(con + 1, len);
-	entry = isl_hash_table_find(ctx, table, c_hash, max_constraint_equal,
-			con + 1, 0);
-	if (!entry)
-		return;
-	c = entry->data;
-	if (c->count < n) {
-		isl_hash_table_remove(ctx, table, entry);
-		return;
-	}
-	c->count++;
-	if (isl_int_gt(c->c->row[0][0], con[0]))
-		return;
-	if (isl_int_eq(c->c->row[0][0], con[0])) {
-		if (ineq)
-			c->ineq = ineq;
-		return;
-	}
-	c->c = isl_mat_cow(c->c);
-	isl_int_set(c->c->row[0][0], con[0]);
-	c->ineq = ineq;
-}
-
-/* Check whether the constraint hash table "table" constains the constraint
- * "con".
- */
-static int has_constraint(struct isl_ctx *ctx, struct isl_hash_table *table,
-	isl_int *con, unsigned len, int n)
-{
-	struct isl_hash_table_entry *entry;
-	struct max_constraint *c;
-	uint32_t c_hash;
-
-	c_hash = isl_seq_get_hash(con + 1, len);
-	entry = isl_hash_table_find(ctx, table, c_hash, max_constraint_equal,
-			con + 1, 0);
-	if (!entry)
-		return 0;
-	c = entry->data;
-	if (c->count < n)
-		return 0;
-	return isl_int_eq(c->c->row[0][0], con[0]);
-}
-
-/* Check for inequality constraints of a basic set without equalities
- * such that the same or more stringent copies of the constraint appear
- * in all of the basic sets.  Such constraints are necessarily facet
- * constraints of the convex hull.
- *
- * If the resulting basic set is by chance identical to one of
- * the basic sets in "set", then we know that this basic set contains
- * all other basic sets and is therefore the convex hull of set.
- * In this case we set *is_hull to 1.
- */
-static struct isl_basic_set *common_constraints(struct isl_basic_set *hull,
-	struct isl_set *set, int *is_hull)
-{
-	int i, j, s, n;
-	int min_constraints;
-	int best;
-	struct max_constraint *constraints = NULL;
-	struct isl_hash_table *table = NULL;
-	unsigned total;
-
-	*is_hull = 0;
-
-	for (i = 0; i < set->n; ++i)
-		if (set->p[i]->n_eq == 0)
-			break;
-	if (i >= set->n)
-		return hull;
-	min_constraints = set->p[i]->n_ineq;
-	best = i;
-	for (i = best + 1; i < set->n; ++i) {
-		if (set->p[i]->n_eq != 0)
-			continue;
-		if (set->p[i]->n_ineq >= min_constraints)
-			continue;
-		min_constraints = set->p[i]->n_ineq;
-		best = i;
-	}
-	constraints = isl_calloc_array(hull->ctx, struct max_constraint,
-					min_constraints);
-	if (!constraints)
-		return hull;
-	table = isl_alloc_type(hull->ctx, struct isl_hash_table);
-	if (isl_hash_table_init(hull->ctx, table, min_constraints))
-		goto error;
-
-	total = isl_dim_total(set->dim);
-	for (i = 0; i < set->p[best]->n_ineq; ++i) {
-		constraints[i].c = isl_mat_sub_alloc6(hull->ctx,
-			set->p[best]->ineq + i, 0, 1, 0, 1 + total);
-		if (!constraints[i].c)
-			goto error;
-		constraints[i].ineq = 1;
-	}
-	for (i = 0; i < min_constraints; ++i) {
-		struct isl_hash_table_entry *entry;
-		uint32_t c_hash;
-		c_hash = isl_seq_get_hash(constraints[i].c->row[0] + 1, total);
-		entry = isl_hash_table_find(hull->ctx, table, c_hash,
-			max_constraint_equal, constraints[i].c->row[0] + 1, 1);
-		if (!entry)
-			goto error;
-		isl_assert(hull->ctx, !entry->data, goto error);
-		entry->data = &constraints[i];
-	}
-
-	n = 0;
-	for (s = 0; s < set->n; ++s) {
-		if (s == best)
-			continue;
-
-		for (i = 0; i < set->p[s]->n_eq; ++i) {
-			isl_int *eq = set->p[s]->eq[i];
-			for (j = 0; j < 2; ++j) {
-				isl_seq_neg(eq, eq, 1 + total);
-				update_constraint(hull->ctx, table,
-							    eq, total, n, 0);
-			}
-		}
-		for (i = 0; i < set->p[s]->n_ineq; ++i) {
-			isl_int *ineq = set->p[s]->ineq[i];
-			update_constraint(hull->ctx, table, ineq, total, n,
-				set->p[s]->n_eq == 0);
-		}
-		++n;
-	}
-
-	for (i = 0; i < min_constraints; ++i) {
-		if (constraints[i].count < n)
-			continue;
-		if (!constraints[i].ineq)
-			continue;
-		j = isl_basic_set_alloc_inequality(hull);
-		if (j < 0)
-			goto error;
-		isl_seq_cpy(hull->ineq[j], constraints[i].c->row[0], 1 + total);
-	}
-
-	for (s = 0; s < set->n; ++s) {
-		if (set->p[s]->n_eq)
-			continue;
-		if (set->p[s]->n_ineq != hull->n_ineq)
-			continue;
-		for (i = 0; i < set->p[s]->n_ineq; ++i) {
-			isl_int *ineq = set->p[s]->ineq[i];
-			if (!has_constraint(hull->ctx, table, ineq, total, n))
-				break;
-		}
-		if (i == set->p[s]->n_ineq)
-			*is_hull = 1;
-	}
-
-	isl_hash_table_clear(table);
-	for (i = 0; i < min_constraints; ++i)
-		isl_mat_free(constraints[i].c);
-	free(constraints);
-	free(table);
-	return hull;
-error:
-	isl_hash_table_clear(table);
-	free(table);
-	if (constraints)
-		for (i = 0; i < min_constraints; ++i)
-			isl_mat_free(constraints[i].c);
-	free(constraints);
-	return hull;
-}
-
-/* Create a template for the convex hull of "set" and fill it up
- * obvious facet constraints, if any.  If the result happens to
- * be the convex hull of "set" then *is_hull is set to 1.
- */
-static struct isl_basic_set *proto_hull(struct isl_set *set, int *is_hull)
-{
-	struct isl_basic_set *hull;
-	unsigned n_ineq;
-	int i;
-
-	n_ineq = 1;
-	for (i = 0; i < set->n; ++i) {
-		n_ineq += set->p[i]->n_eq;
-		n_ineq += set->p[i]->n_ineq;
-	}
-	hull = isl_basic_set_alloc_dim(isl_dim_copy(set->dim), 0, 0, n_ineq);
-	hull = isl_basic_set_set_rational(hull);
-	if (!hull)
-		return NULL;
-	return common_constraints(hull, set, is_hull);
-}
-
-static struct isl_basic_set *uset_convex_hull_wrap(struct isl_set *set)
-{
-	struct isl_basic_set *hull;
-	int is_hull;
-
-	hull = proto_hull(set, &is_hull);
-	if (hull && !is_hull) {
-		if (hull->n_ineq == 0)
-			hull = initial_hull(hull, set);
-		hull = extend(hull, set);
-	}
-	isl_set_free(set);
-
-	return hull;
-}
-
-/* Compute the convex hull of a set without any parameters or
- * integer divisions.  Depending on whether the set is bounded,
- * we pass control to the wrapping based convex hull or
- * the Fourier-Motzkin elimination based convex hull.
- * We also handle a few special cases before checking the boundedness.
- */
-static struct isl_basic_set *uset_convex_hull(struct isl_set *set)
-{
-	struct isl_basic_set *convex_hull = NULL;
-	struct isl_basic_set *lin;
-
-	if (isl_set_n_dim(set) == 0)
-		return convex_hull_0d(set);
-
-	set = isl_set_coalesce(set);
-	set = isl_set_set_rational(set);
-
-	if (!set)
-		goto error;
-	if (!set)
-		return NULL;
-	if (set->n == 1) {
-		convex_hull = isl_basic_set_copy(set->p[0]);
-		isl_set_free(set);
-		return convex_hull;
-	}
-	if (isl_set_n_dim(set) == 1)
-		return convex_hull_1d(set);
-
-	if (isl_set_is_bounded(set) &&
-	    set->ctx->opt->convex == ISL_CONVEX_HULL_WRAP)
-		return uset_convex_hull_wrap(set);
-
-	lin = uset_combined_lineality_space(isl_set_copy(set));
-	if (!lin)
-		goto error;
-	if (isl_basic_set_is_universe(lin)) {
-		isl_set_free(set);
-		return lin;
-	}
-	if (lin->n_eq < isl_basic_set_total_dim(lin))
-		return modulo_lineality(set, lin);
-	isl_basic_set_free(lin);
-
-	return uset_convex_hull_unbounded(set);
-error:
-	isl_set_free(set);
-	isl_basic_set_free(convex_hull);
-	return NULL;
-}
-
-/* This is the core procedure, where "set" is a "pure" set, i.e.,
- * without parameters or divs and where the convex hull of set is
- * known to be full-dimensional.
- */
-static struct isl_basic_set *uset_convex_hull_wrap_bounded(struct isl_set *set)
-{
-	struct isl_basic_set *convex_hull = NULL;
-
-	if (!set)
-		goto error;
-
-	if (isl_set_n_dim(set) == 0) {
-		convex_hull = isl_basic_set_universe(isl_dim_copy(set->dim));
-		isl_set_free(set);
-		convex_hull = isl_basic_set_set_rational(convex_hull);
-		return convex_hull;
-	}
-
-	set = isl_set_set_rational(set);
-	set = isl_set_coalesce(set);
-	if (!set)
-		goto error;
-	if (set->n == 1) {
-		convex_hull = isl_basic_set_copy(set->p[0]);
-		isl_set_free(set);
-		return convex_hull;
-	}
-	if (isl_set_n_dim(set) == 1)
-		return convex_hull_1d(set);
-
-	return uset_convex_hull_wrap(set);
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-/* Compute the convex hull of set "set" with affine hull "affine_hull",
- * We first remove the equalities (transforming the set), compute the
- * convex hull of the transformed set and then add the equalities back
- * (after performing the inverse transformation.
- */
-static struct isl_basic_set *modulo_affine_hull(
-	struct isl_set *set, struct isl_basic_set *affine_hull)
-{
-	struct isl_mat *T;
-	struct isl_mat *T2;
-	struct isl_basic_set *dummy;
-	struct isl_basic_set *convex_hull;
-
-	dummy = isl_basic_set_remove_equalities(
-			isl_basic_set_copy(affine_hull), &T, &T2);
-	if (!dummy)
-		goto error;
-	isl_basic_set_free(dummy);
-	set = isl_set_preimage(set, T);
-	convex_hull = uset_convex_hull(set);
-	convex_hull = isl_basic_set_preimage(convex_hull, T2);
-	convex_hull = isl_basic_set_intersect(convex_hull, affine_hull);
-	return convex_hull;
-error:
-	isl_basic_set_free(affine_hull);
-	isl_set_free(set);
-	return NULL;
-}
-
-/* Compute the convex hull of a map.
- *
- * The implementation was inspired by "Extended Convex Hull" by Fukuda et al.,
- * specifically, the wrapping of facets to obtain new facets.
- */
-struct isl_basic_map *isl_map_convex_hull(struct isl_map *map)
-{
-	struct isl_basic_set *bset;
-	struct isl_basic_map *model = NULL;
-	struct isl_basic_set *affine_hull = NULL;
-	struct isl_basic_map *convex_hull = NULL;
-	struct isl_set *set = NULL;
-	struct isl_ctx *ctx;
-
-	if (!map)
-		goto error;
-
-	ctx = map->ctx;
-	if (map->n == 0) {
-		convex_hull = isl_basic_map_empty_like_map(map);
-		isl_map_free(map);
-		return convex_hull;
-	}
-
-	map = isl_map_detect_equalities(map);
-	map = isl_map_align_divs(map);
-	if (!map)
-		goto error;
-	model = isl_basic_map_copy(map->p[0]);
-	set = isl_map_underlying_set(map);
-	if (!set)
-		goto error;
-
-	affine_hull = isl_set_affine_hull(isl_set_copy(set));
-	if (!affine_hull)
-		goto error;
-	if (affine_hull->n_eq != 0)
-		bset = modulo_affine_hull(set, affine_hull);
-	else {
-		isl_basic_set_free(affine_hull);
-		bset = uset_convex_hull(set);
-	}
-
-	convex_hull = isl_basic_map_overlying_set(bset, model);
-	if (!convex_hull)
-		return NULL;
-
-	ISL_F_SET(convex_hull, ISL_BASIC_MAP_NO_IMPLICIT);
-	ISL_F_SET(convex_hull, ISL_BASIC_MAP_ALL_EQUALITIES);
-	ISL_F_CLR(convex_hull, ISL_BASIC_MAP_RATIONAL);
-	return convex_hull;
-error:
-	isl_set_free(set);
-	isl_basic_map_free(model);
-	return NULL;
-}
-
-struct isl_basic_set *isl_set_convex_hull(struct isl_set *set)
-{
-	return (struct isl_basic_set *)
-		isl_map_convex_hull((struct isl_map *)set);
-}
-
-__isl_give isl_basic_map *isl_map_polyhedral_hull(__isl_take isl_map *map)
-{
-	isl_basic_map *hull;
-
-	hull = isl_map_convex_hull(map);
-	return isl_basic_map_remove_divs(hull);
-}
-
-__isl_give isl_basic_set *isl_set_polyhedral_hull(__isl_take isl_set *set)
-{
-	return (isl_basic_set *)isl_map_polyhedral_hull((isl_map *)set);
-}
-
-struct sh_data_entry {
-	struct isl_hash_table	*table;
-	struct isl_tab		*tab;
-};
-
-/* Holds the data needed during the simple hull computation.
- * In particular,
- *	n		the number of basic sets in the original set
- *	hull_table	a hash table of already computed constraints
- *			in the simple hull
- *	p		for each basic set,
- *		table		a hash table of the constraints
- *		tab		the tableau corresponding to the basic set
- */
-struct sh_data {
-	struct isl_ctx		*ctx;
-	unsigned		n;
-	struct isl_hash_table	*hull_table;
-	struct sh_data_entry	p[1];
-};
-
-static void sh_data_free(struct sh_data *data)
-{
-	int i;
-
-	if (!data)
-		return;
-	isl_hash_table_free(data->ctx, data->hull_table);
-	for (i = 0; i < data->n; ++i) {
-		isl_hash_table_free(data->ctx, data->p[i].table);
-		isl_tab_free(data->p[i].tab);
-	}
-	free(data);
-}
-
-struct ineq_cmp_data {
-	unsigned	len;
-	isl_int		*p;
-};
-
-static int has_ineq(const void *entry, const void *val)
-{
-	isl_int *row = (isl_int *)entry;
-	struct ineq_cmp_data *v = (struct ineq_cmp_data *)val;
-
-	return isl_seq_eq(row + 1, v->p + 1, v->len) ||
-	       isl_seq_is_neg(row + 1, v->p + 1, v->len);
-}
-
-static int hash_ineq(struct isl_ctx *ctx, struct isl_hash_table *table,
-			isl_int *ineq, unsigned len)
-{
-	uint32_t c_hash;
-	struct ineq_cmp_data v;
-	struct isl_hash_table_entry *entry;
-
-	v.len = len;
-	v.p = ineq;
-	c_hash = isl_seq_get_hash(ineq + 1, len);
-	entry = isl_hash_table_find(ctx, table, c_hash, has_ineq, &v, 1);
-	if (!entry)
-		return - 1;
-	entry->data = ineq;
-	return 0;
-}
-
-/* Fill hash table "table" with the constraints of "bset".
- * Equalities are added as two inequalities.
- * The value in the hash table is a pointer to the (in)equality of "bset".
- */
-static int hash_basic_set(struct isl_hash_table *table,
-				struct isl_basic_set *bset)
-{
-	int i, j;
-	unsigned dim = isl_basic_set_total_dim(bset);
-
-	for (i = 0; i < bset->n_eq; ++i) {
-		for (j = 0; j < 2; ++j) {
-			isl_seq_neg(bset->eq[i], bset->eq[i], 1 + dim);
-			if (hash_ineq(bset->ctx, table, bset->eq[i], dim) < 0)
-				return -1;
-		}
-	}
-	for (i = 0; i < bset->n_ineq; ++i) {
-		if (hash_ineq(bset->ctx, table, bset->ineq[i], dim) < 0)
-			return -1;
-	}
-	return 0;
-}
-
-static struct sh_data *sh_data_alloc(struct isl_set *set, unsigned n_ineq)
-{
-	struct sh_data *data;
-	int i;
-
-	data = isl_calloc(set->ctx, struct sh_data,
-		sizeof(struct sh_data) +
-		(set->n - 1) * sizeof(struct sh_data_entry));
-	if (!data)
-		return NULL;
-	data->ctx = set->ctx;
-	data->n = set->n;
-	data->hull_table = isl_hash_table_alloc(set->ctx, n_ineq);
-	if (!data->hull_table)
-		goto error;
-	for (i = 0; i < set->n; ++i) {
-		data->p[i].table = isl_hash_table_alloc(set->ctx,
-				    2 * set->p[i]->n_eq + set->p[i]->n_ineq);
-		if (!data->p[i].table)
-			goto error;
-		if (hash_basic_set(data->p[i].table, set->p[i]) < 0)
-			goto error;
-	}
-	return data;
-error:
-	sh_data_free(data);
-	return NULL;
-}
-
-/* Check if inequality "ineq" is a bound for basic set "j" or if
- * it can be relaxed (by increasing the constant term) to become
- * a bound for that basic set.  In the latter case, the constant
- * term is updated.
- * Return 1 if "ineq" is a bound
- *	  0 if "ineq" may attain arbitrarily small values on basic set "j"
- *	 -1 if some error occurred
- */
-static int is_bound(struct sh_data *data, struct isl_set *set, int j,
-			isl_int *ineq)
-{
-	enum isl_lp_result res;
-	isl_int opt;
-
-	if (!data->p[j].tab) {
-		data->p[j].tab = isl_tab_from_basic_set(set->p[j]);
-		if (!data->p[j].tab)
-			return -1;
-	}
-
-	isl_int_init(opt);
-
-	res = isl_tab_min(data->p[j].tab, ineq, data->ctx->one,
-				&opt, NULL, 0);
-	if (res == isl_lp_ok && isl_int_is_neg(opt))
-		isl_int_sub(ineq[0], ineq[0], opt);
-
-	isl_int_clear(opt);
-
-	return (res == isl_lp_ok || res == isl_lp_empty) ? 1 :
-	       res == isl_lp_unbounded ? 0 : -1;
-}
-
-/* Check if inequality "ineq" from basic set "i" can be relaxed to
- * become a bound on the whole set.  If so, add the (relaxed) inequality
- * to "hull".
- *
- * We first check if "hull" already contains a translate of the inequality.
- * If so, we are done.
- * Then, we check if any of the previous basic sets contains a translate
- * of the inequality.  If so, then we have already considered this
- * inequality and we are done.
- * Otherwise, for each basic set other than "i", we check if the inequality
- * is a bound on the basic set.
- * For previous basic sets, we know that they do not contain a translate
- * of the inequality, so we directly call is_bound.
- * For following basic sets, we first check if a translate of the
- * inequality appears in its description and if so directly update
- * the inequality accordingly.
- */
-static struct isl_basic_set *add_bound(struct isl_basic_set *hull,
-	struct sh_data *data, struct isl_set *set, int i, isl_int *ineq)
-{
-	uint32_t c_hash;
-	struct ineq_cmp_data v;
-	struct isl_hash_table_entry *entry;
-	int j, k;
-
-	if (!hull)
-		return NULL;
-
-	v.len = isl_basic_set_total_dim(hull);
-	v.p = ineq;
-	c_hash = isl_seq_get_hash(ineq + 1, v.len);
-
-	entry = isl_hash_table_find(hull->ctx, data->hull_table, c_hash,
-					has_ineq, &v, 0);
-	if (entry)
-		return hull;
-
-	for (j = 0; j < i; ++j) {
-		entry = isl_hash_table_find(hull->ctx, data->p[j].table,
-						c_hash, has_ineq, &v, 0);
-		if (entry)
-			break;
-	}
-	if (j < i)
-		return hull;
-
-	k = isl_basic_set_alloc_inequality(hull);
-	isl_seq_cpy(hull->ineq[k], ineq, 1 + v.len);
-	if (k < 0)
-		goto error;
-
-	for (j = 0; j < i; ++j) {
-		int bound;
-		bound = is_bound(data, set, j, hull->ineq[k]);
-		if (bound < 0)
-			goto error;
-		if (!bound)
-			break;
-	}
-	if (j < i) {
-		isl_basic_set_free_inequality(hull, 1);
-		return hull;
-	}
-
-	for (j = i + 1; j < set->n; ++j) {
-		int bound, neg;
-		isl_int *ineq_j;
-		entry = isl_hash_table_find(hull->ctx, data->p[j].table,
-						c_hash, has_ineq, &v, 0);
-		if (entry) {
-			ineq_j = entry->data;
-			neg = isl_seq_is_neg(ineq_j + 1,
-					     hull->ineq[k] + 1, v.len);
-			if (neg)
-				isl_int_neg(ineq_j[0], ineq_j[0]);
-			if (isl_int_gt(ineq_j[0], hull->ineq[k][0]))
-				isl_int_set(hull->ineq[k][0], ineq_j[0]);
-			if (neg)
-				isl_int_neg(ineq_j[0], ineq_j[0]);
-			continue;
-		}
-		bound = is_bound(data, set, j, hull->ineq[k]);
-		if (bound < 0)
-			goto error;
-		if (!bound)
-			break;
-	}
-	if (j < set->n) {
-		isl_basic_set_free_inequality(hull, 1);
-		return hull;
-	}
-
-	entry = isl_hash_table_find(hull->ctx, data->hull_table, c_hash,
-					has_ineq, &v, 1);
-	if (!entry)
-		goto error;
-	entry->data = hull->ineq[k];
-
-	return hull;
-error:
-	isl_basic_set_free(hull);
-	return NULL;
-}
-
-/* Check if any inequality from basic set "i" can be relaxed to
- * become a bound on the whole set.  If so, add the (relaxed) inequality
- * to "hull".
- */
-static struct isl_basic_set *add_bounds(struct isl_basic_set *bset,
-	struct sh_data *data, struct isl_set *set, int i)
-{
-	int j, k;
-	unsigned dim = isl_basic_set_total_dim(bset);
-
-	for (j = 0; j < set->p[i]->n_eq; ++j) {
-		for (k = 0; k < 2; ++k) {
-			isl_seq_neg(set->p[i]->eq[j], set->p[i]->eq[j], 1+dim);
-			bset = add_bound(bset, data, set, i, set->p[i]->eq[j]);
-		}
-	}
-	for (j = 0; j < set->p[i]->n_ineq; ++j)
-		bset = add_bound(bset, data, set, i, set->p[i]->ineq[j]);
-	return bset;
-}
-
-/* Compute a superset of the convex hull of set that is described
- * by only translates of the constraints in the constituents of set.
- */
-static struct isl_basic_set *uset_simple_hull(struct isl_set *set)
-{
-	struct sh_data *data = NULL;
-	struct isl_basic_set *hull = NULL;
-	unsigned n_ineq;
-	int i;
-
-	if (!set)
-		return NULL;
-
-	n_ineq = 0;
-	for (i = 0; i < set->n; ++i) {
-		if (!set->p[i])
-			goto error;
-		n_ineq += 2 * set->p[i]->n_eq + set->p[i]->n_ineq;
-	}
-
-	hull = isl_basic_set_alloc_dim(isl_dim_copy(set->dim), 0, 0, n_ineq);
-	if (!hull)
-		goto error;
-
-	data = sh_data_alloc(set, n_ineq);
-	if (!data)
-		goto error;
-
-	for (i = 0; i < set->n; ++i)
-		hull = add_bounds(hull, data, set, i);
-
-	sh_data_free(data);
-	isl_set_free(set);
-
-	return hull;
-error:
-	sh_data_free(data);
-	isl_basic_set_free(hull);
-	isl_set_free(set);
-	return NULL;
-}
-
-/* Compute a superset of the convex hull of map that is described
- * by only translates of the constraints in the constituents of map.
- */
-struct isl_basic_map *isl_map_simple_hull(struct isl_map *map)
-{
-	struct isl_set *set = NULL;
-	struct isl_basic_map *model = NULL;
-	struct isl_basic_map *hull;
-	struct isl_basic_map *affine_hull;
-	struct isl_basic_set *bset = NULL;
-
-	if (!map)
-		return NULL;
-	if (map->n == 0) {
-		hull = isl_basic_map_empty_like_map(map);
-		isl_map_free(map);
-		return hull;
-	}
-	if (map->n == 1) {
-		hull = isl_basic_map_copy(map->p[0]);
-		isl_map_free(map);
-		return hull;
-	}
-
-	map = isl_map_detect_equalities(map);
-	affine_hull = isl_map_affine_hull(isl_map_copy(map));
-	map = isl_map_align_divs(map);
-	model = isl_basic_map_copy(map->p[0]);
-
-	set = isl_map_underlying_set(map);
-
-	bset = uset_simple_hull(set);
-
-	hull = isl_basic_map_overlying_set(bset, model);
-
-	hull = isl_basic_map_intersect(hull, affine_hull);
-	hull = isl_basic_map_remove_redundancies(hull);
-	ISL_F_SET(hull, ISL_BASIC_MAP_NO_IMPLICIT);
-	ISL_F_SET(hull, ISL_BASIC_MAP_ALL_EQUALITIES);
-
-	return hull;
-}
-
-struct isl_basic_set *isl_set_simple_hull(struct isl_set *set)
-{
-	return (struct isl_basic_set *)
-		isl_map_simple_hull((struct isl_map *)set);
-}
-
-/* Given a set "set", return parametric bounds on the dimension "dim".
- */
-static struct isl_basic_set *set_bounds(struct isl_set *set, int dim)
-{
-	unsigned set_dim = isl_set_dim(set, isl_dim_set);
-	set = isl_set_copy(set);
-	set = isl_set_eliminate_dims(set, dim + 1, set_dim - (dim + 1));
-	set = isl_set_eliminate_dims(set, 0, dim);
-	return isl_set_convex_hull(set);
-}
-
-/* Computes a "simple hull" and then check if each dimension in the
- * resulting hull is bounded by a symbolic constant.  If not, the
- * hull is intersected with the corresponding bounds on the whole set.
- */
-struct isl_basic_set *isl_set_bounded_simple_hull(struct isl_set *set)
-{
-	int i, j;
-	struct isl_basic_set *hull;
-	unsigned nparam, left;
-	int removed_divs = 0;
-
-	hull = isl_set_simple_hull(isl_set_copy(set));
-	if (!hull)
-		goto error;
-
-	nparam = isl_basic_set_dim(hull, isl_dim_param);
-	for (i = 0; i < isl_basic_set_dim(hull, isl_dim_set); ++i) {
-		int lower = 0, upper = 0;
-		struct isl_basic_set *bounds;
-
-		left = isl_basic_set_total_dim(hull) - nparam - i - 1;
-		for (j = 0; j < hull->n_eq; ++j) {
-			if (isl_int_is_zero(hull->eq[j][1 + nparam + i]))
-				continue;
-			if (isl_seq_first_non_zero(hull->eq[j]+1+nparam+i+1,
-						    left) == -1)
-				break;
-		}
-		if (j < hull->n_eq)
-			continue;
-
-		for (j = 0; j < hull->n_ineq; ++j) {
-			if (isl_int_is_zero(hull->ineq[j][1 + nparam + i]))
-				continue;
-			if (isl_seq_first_non_zero(hull->ineq[j]+1+nparam+i+1,
-						    left) != -1 ||
-			    isl_seq_first_non_zero(hull->ineq[j]+1+nparam,
-						    i) != -1)
-				continue;
-			if (isl_int_is_pos(hull->ineq[j][1 + nparam + i]))
-				lower = 1;
-			else
-				upper = 1;
-			if (lower && upper)
-				break;
-		}
-
-		if (lower && upper)
-			continue;
-
-		if (!removed_divs) {
-			set = isl_set_remove_divs(set);
-			if (!set)
-				goto error;
-			removed_divs = 1;
-		}
-		bounds = set_bounds(set, i);
-		hull = isl_basic_set_intersect(hull, bounds);
-		if (!hull)
-			goto error;
-	}
-
-	isl_set_free(set);
-	return hull;
-error:
-	isl_set_free(set);
-	return NULL;
-}
diff --git a/cloog-0.16.3/isl/isl_ctx.c b/cloog-0.16.3/isl/isl_ctx.c
deleted file mode 100644
index 5b37bf5..0000000
--- a/cloog-0.16.3/isl/isl_ctx.c
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl/vec.h>
-
-static struct isl_options *find_nested_options(struct isl_arg *arg,
-	void *opt, struct isl_arg *wanted)
-{
-	int i;
-	struct isl_options *options;
-
-	if (arg == wanted)
-		return opt;
-
-	for (i = 0; arg[i].type != isl_arg_end; ++i) {
-		if (arg[i].type != isl_arg_child)
-			continue;
-		options = find_nested_options(arg[i].u.child.child,
-				*(void **)(((char *)opt) + arg->offset), wanted);
-		if (options)
-			return options;
-	}
-
-	return NULL;
-}
-
-static struct isl_options *find_nested_isl_options(struct isl_arg *arg,
-	void *opt)
-{
-	return find_nested_options(arg, opt, isl_options_arg);
-}
-
-void *isl_ctx_peek_options(isl_ctx *ctx, struct isl_arg *arg)
-{
-	if (!ctx)
-		return NULL;
-	return find_nested_options(ctx->user_arg, ctx->user_opt, arg);
-}
-
-isl_ctx *isl_ctx_alloc_with_options(struct isl_arg *arg, void *user_opt)
-{
-	struct isl_ctx *ctx = NULL;
-	struct isl_options *opt = NULL;
-	int opt_allocated = 0;
-
-	if (!user_opt)
-		return NULL;
-
-	opt = find_nested_isl_options(arg, user_opt);
-	if (!opt) {
-		opt = isl_options_new_with_defaults();
-		if (!opt)
-			goto error;
-		opt_allocated = 1;
-	}
-
-	ctx = isl_calloc_type(NULL, struct isl_ctx);
-	if (!ctx)
-		goto error;
-
-	if (isl_hash_table_init(ctx, &ctx->name_hash, 0))
-		goto error;
-
-	ctx->stats = isl_calloc_type(ctx, struct isl_stats);
-	if (!ctx->stats)
-		goto error;
-
-	ctx->user_arg = arg;
-	ctx->user_opt = user_opt;
-	ctx->opt_allocated = opt_allocated;
-	ctx->opt = opt;
-	ctx->ref = 0;
-
-	isl_int_init(ctx->zero);
-	isl_int_set_si(ctx->zero, 0);
-
-	isl_int_init(ctx->one);
-	isl_int_set_si(ctx->one, 1);
-
-	isl_int_init(ctx->two);
-	isl_int_set_si(ctx->two, 2);
-
-	isl_int_init(ctx->negone);
-	isl_int_set_si(ctx->negone, -1);
-
-	isl_int_init(ctx->normalize_gcd);
-
-	ctx->n_cached = 0;
-	ctx->n_miss = 0;
-
-	ctx->error = isl_error_none;
-
-	return ctx;
-error:
-	isl_arg_free(arg, user_opt);
-	if (opt_allocated)
-		isl_options_free(opt);
-	free(ctx);
-	return NULL;
-}
-
-struct isl_ctx *isl_ctx_alloc()
-{
-	struct isl_options *opt;
-
-	opt = isl_options_new_with_defaults();
-
-	return isl_ctx_alloc_with_options(isl_options_arg, opt);
-}
-
-void isl_ctx_ref(struct isl_ctx *ctx)
-{
-	ctx->ref++;
-}
-
-void isl_ctx_deref(struct isl_ctx *ctx)
-{
-	isl_assert(ctx, ctx->ref > 0, return);
-	ctx->ref--;
-}
-
-void isl_ctx_free(struct isl_ctx *ctx)
-{
-	if (!ctx)
-		return;
-	isl_assert(ctx, ctx->ref == 0, return);
-	isl_hash_table_clear(&ctx->name_hash);
-	isl_blk_clear_cache(ctx);
-	isl_int_clear(ctx->zero);
-	isl_int_clear(ctx->one);
-	isl_int_clear(ctx->two);
-	isl_int_clear(ctx->negone);
-	isl_int_clear(ctx->normalize_gcd);
-	isl_arg_free(ctx->user_arg, ctx->user_opt);
-	if (ctx->opt_allocated)
-		free(ctx->opt);
-	free(ctx->stats);
-	free(ctx);
-}
-
-struct isl_options *isl_ctx_options(isl_ctx *ctx)
-{
-	if (!ctx)
-		return NULL;
-	return ctx->opt;
-}
-
-enum isl_error isl_ctx_last_error(isl_ctx *ctx)
-{
-	return ctx->error;
-}
-
-void isl_ctx_reset_error(isl_ctx *ctx)
-{
-	ctx->error = isl_error_none;
-}
-
-void isl_ctx_set_error(isl_ctx *ctx, enum isl_error error)
-{
-	if (ctx)
-		ctx->error = error;
-}
-
-void isl_ctx_abort(isl_ctx *ctx)
-{
-	if (ctx)
-		ctx->abort = 1;
-}
-
-void isl_ctx_resume(isl_ctx *ctx)
-{
-	if (ctx)
-		ctx->abort = 0;
-}
-
-int isl_ctx_aborted(isl_ctx *ctx)
-{
-	return ctx ? ctx->abort : -1;
-}
diff --git a/cloog-0.16.3/isl/isl_ctx_private.h b/cloog-0.16.3/isl/isl_ctx_private.h
deleted file mode 100644
index a943b24..0000000
--- a/cloog-0.16.3/isl/isl_ctx_private.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <isl/ctx.h>
-
-struct isl_ctx {
-	int			ref;
-
-	struct isl_stats	*stats;
-
-	int			 opt_allocated;
-	struct isl_options	*opt;
-	void			*user_opt;
-	struct isl_arg		*user_arg;
-
-	isl_int			zero;
-	isl_int			one;
-	isl_int			two;
-	isl_int			negone;
-
-	isl_int			normalize_gcd;
-
-	int			n_cached;
-	int			n_miss;
-	struct isl_blk		cache[ISL_BLK_CACHE_SIZE];
-	struct isl_hash_table	name_hash;
-
-	enum isl_error		error;
-
-	int			abort;
-};
diff --git a/cloog-0.16.3/isl/isl_dim.c b/cloog-0.16.3/isl/isl_dim.c
deleted file mode 100644
index 6aa67f0..0000000
--- a/cloog-0.16.3/isl/isl_dim.c
+++ /dev/null
@@ -1,1345 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France 
- */
-
-#include <stdlib.h>
-#include <isl_dim_private.h>
-#include "isl_name.h"
-#include <isl_reordering.h>
-
-isl_ctx *isl_dim_get_ctx(__isl_keep isl_dim *dim)
-{
-	return dim ? dim->ctx : NULL;
-}
-
-struct isl_dim *isl_dim_alloc(struct isl_ctx *ctx,
-			unsigned nparam, unsigned n_in, unsigned n_out)
-{
-	struct isl_dim *dim;
-
-	dim = isl_alloc_type(ctx, struct isl_dim);
-	if (!dim)
-		return NULL;
-
-	dim->ctx = ctx;
-	isl_ctx_ref(ctx);
-	dim->ref = 1;
-	dim->nparam = nparam;
-	dim->n_in = n_in;
-	dim->n_out = n_out;
-
-	dim->tuple_name[0] = NULL;
-	dim->tuple_name[1] = NULL;
-
-	dim->nested[0] = NULL;
-	dim->nested[1] = NULL;
-
-	dim->n_name = 0;
-	dim->names = NULL;
-
-	return dim;
-}
-
-struct isl_dim *isl_dim_set_alloc(struct isl_ctx *ctx,
-			unsigned nparam, unsigned dim)
-{
-	return isl_dim_alloc(ctx, nparam, 0, dim);
-}
-
-static unsigned global_pos(struct isl_dim *dim,
-				 enum isl_dim_type type, unsigned pos)
-{
-	struct isl_ctx *ctx = dim->ctx;
-
-	switch (type) {
-	case isl_dim_param:
-		isl_assert(ctx, pos < dim->nparam, return isl_dim_total(dim));
-		return pos;
-	case isl_dim_in:
-		isl_assert(ctx, pos < dim->n_in, return isl_dim_total(dim));
-		return pos + dim->nparam;
-	case isl_dim_out:
-		isl_assert(ctx, pos < dim->n_out, return isl_dim_total(dim));
-		return pos + dim->nparam + dim->n_in;
-	default:
-		isl_assert(ctx, 0, return isl_dim_total(dim));
-	}
-	return isl_dim_total(dim);
-}
-
-/* Extend length of names array to the total number of dimensions.
- */
-static __isl_give isl_dim *extend_names(__isl_take isl_dim *dim)
-{
-	struct isl_name **names;
-	int i;
-
-	if (isl_dim_total(dim) <= dim->n_name)
-		return dim;
-
-	if (!dim->names) {
-		dim->names = isl_calloc_array(dim->ctx,
-				struct isl_name *, isl_dim_total(dim));
-		if (!dim->names)
-			goto error;
-	} else {
-		names = isl_realloc_array(dim->ctx, dim->names,
-				struct isl_name *, isl_dim_total(dim));
-		if (!names)
-			goto error;
-		dim->names = names;
-		for (i = dim->n_name; i < isl_dim_total(dim); ++i)
-			dim->names[i] = NULL;
-	}
-
-	dim->n_name = isl_dim_total(dim);
-
-	return dim;
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-static struct isl_dim *set_name(struct isl_dim *dim,
-				 enum isl_dim_type type, unsigned pos,
-				 struct isl_name *name)
-{
-	struct isl_ctx *ctx = dim->ctx;
-	dim = isl_dim_cow(dim);
-
-	if (!dim)
-		goto error;
-
-	pos = global_pos(dim, type, pos);
-	if (pos == isl_dim_total(dim))
-		goto error;
-
-	if (pos >= dim->n_name) {
-		if (!name)
-			return dim;
-		dim = extend_names(dim);
-		if (!dim)
-			goto error;
-	}
-
-	dim->names[pos] = name;
-
-	return dim;
-error:
-	isl_name_free(ctx, name);
-	isl_dim_free(dim);
-	return NULL;
-}
-
-static struct isl_name *get_name(struct isl_dim *dim,
-				 enum isl_dim_type type, unsigned pos)
-{
-	if (!dim)
-		return NULL;
-
-	pos = global_pos(dim, type, pos);
-	if (pos == isl_dim_total(dim))
-		return NULL;
-	if (pos >= dim->n_name)
-		return NULL;
-	return dim->names[pos];
-}
-
-static unsigned offset(struct isl_dim *dim, enum isl_dim_type type)
-{
-	switch (type) {
-	case isl_dim_param:	return 0;
-	case isl_dim_in:	return dim->nparam;
-	case isl_dim_out:	return dim->nparam + dim->n_in;
-	default:		return 0;
-	}
-}
-
-static unsigned n(struct isl_dim *dim, enum isl_dim_type type)
-{
-	switch (type) {
-	case isl_dim_param:	return dim->nparam;
-	case isl_dim_in:	return dim->n_in;
-	case isl_dim_out:	return dim->n_out;
-	case isl_dim_all:	return dim->nparam + dim->n_in + dim->n_out;
-	default:		return 0;
-	}
-}
-
-unsigned isl_dim_size(struct isl_dim *dim, enum isl_dim_type type)
-{
-	if (!dim)
-		return 0;
-	return n(dim, type);
-}
-
-unsigned isl_dim_offset(__isl_keep isl_dim *dim, enum isl_dim_type type)
-{
-	if (!dim)
-		return 0;
-	return offset(dim, type);
-}
-
-static struct isl_dim *copy_names(struct isl_dim *dst,
-	enum isl_dim_type dst_type, unsigned offset, struct isl_dim *src,
-	enum isl_dim_type src_type)
-{
-	int i;
-	struct isl_name *name;
-
-	if (!dst)
-		return NULL;
-
-	for (i = 0; i < n(src, src_type); ++i) {
-		name = get_name(src, src_type, i);
-		if (!name)
-			continue;
-		dst = set_name(dst, dst_type, offset + i,
-					isl_name_copy(dst->ctx, name));
-		if (!dst)
-			return NULL;
-	}
-	return dst;
-}
-
-struct isl_dim *isl_dim_dup(struct isl_dim *dim)
-{
-	struct isl_dim *dup;
-	if (!dim)
-		return NULL;
-	dup = isl_dim_alloc(dim->ctx, dim->nparam, dim->n_in, dim->n_out);
-	if (dim->tuple_name[0] &&
-	    !(dup->tuple_name[0] = isl_name_copy(dim->ctx, dim->tuple_name[0])))
-		goto error;
-	if (dim->tuple_name[1] &&
-	    !(dup->tuple_name[1] = isl_name_copy(dim->ctx, dim->tuple_name[1])))
-		goto error;
-	if (dim->nested[0] && !(dup->nested[0] = isl_dim_copy(dim->nested[0])))
-		goto error;
-	if (dim->nested[1] && !(dup->nested[1] = isl_dim_copy(dim->nested[1])))
-		goto error;
-	if (!dim->names)
-		return dup;
-	dup = copy_names(dup, isl_dim_param, 0, dim, isl_dim_param);
-	dup = copy_names(dup, isl_dim_in, 0, dim, isl_dim_in);
-	dup = copy_names(dup, isl_dim_out, 0, dim, isl_dim_out);
-	return dup;
-error:
-	isl_dim_free(dup);
-	return NULL;
-}
-
-struct isl_dim *isl_dim_cow(struct isl_dim *dim)
-{
-	if (!dim)
-		return NULL;
-
-	if (dim->ref == 1)
-		return dim;
-	dim->ref--;
-	return isl_dim_dup(dim);
-}
-
-struct isl_dim *isl_dim_copy(struct isl_dim *dim)
-{
-	if (!dim)
-		return NULL;
-
-	dim->ref++;
-	return dim;
-}
-
-void isl_dim_free(struct isl_dim *dim)
-{
-	int i;
-
-	if (!dim)
-		return;
-
-	if (--dim->ref > 0)
-		return;
-
-	isl_name_free(dim->ctx, dim->tuple_name[0]);
-	isl_name_free(dim->ctx, dim->tuple_name[1]);
-
-	isl_dim_free(dim->nested[0]);
-	isl_dim_free(dim->nested[1]);
-
-	for (i = 0; i < dim->n_name; ++i)
-		isl_name_free(dim->ctx, dim->names[i]);
-	free(dim->names);
-	isl_ctx_deref(dim->ctx);
-	
-	free(dim);
-}
-
-static int name_ok(isl_ctx *ctx, const char *s)
-{
-	char *p;
-	long dummy;
-
-	dummy = strtol(s, &p, 0);
-	if (p != s)
-		isl_die(ctx, isl_error_invalid, "name looks like a number",
-			return 0);
-
-	return 1;
-}
-
-__isl_give isl_dim *isl_dim_set_tuple_name(__isl_take isl_dim *dim,
-	enum isl_dim_type type, const char *s)
-{
-	struct isl_name *name;
-
-	dim = isl_dim_cow(dim);
-	if (!dim)
-		return NULL;
-	if (type != isl_dim_in && type != isl_dim_out)
-		isl_die(dim->ctx, isl_error_invalid,
-			"only input, output and set tuples can have names",
-			goto error);
-	if (!s) {
-		name = NULL;
-	} else {
-		if (!name_ok(dim->ctx, s))
-			goto error;
-		name = isl_name_get(dim->ctx, s);
-		if (!name)
-			goto error;
-	}
-
-	isl_name_free(dim->ctx, dim->tuple_name[type - isl_dim_in]);
-	dim->tuple_name[type - isl_dim_in] = name;
-
-	return dim;
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-const char *isl_dim_get_tuple_name(__isl_keep isl_dim *dim,
-	 enum isl_dim_type type)
-{
-	struct isl_name *name;
-	if (!dim)
-		return NULL;
-	if (type != isl_dim_in && type != isl_dim_out)
-		return NULL;
-	name = dim->tuple_name[type - isl_dim_in];
-	return name ? name->name : NULL;
-}
-
-struct isl_dim *isl_dim_set_name(struct isl_dim *dim,
-				 enum isl_dim_type type, unsigned pos,
-				 const char *s)
-{
-	struct isl_name *name;
-
-	if (!dim)
-		return NULL;
-	if (!name_ok(dim->ctx, s))
-		goto error;
-	isl_name_free(dim->ctx, get_name(dim, type, pos));
-	name = isl_name_get(dim->ctx, s);
-	if (!name)
-		goto error;
-	return set_name(dim, type, pos, name);
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-const char *isl_dim_get_name(struct isl_dim *dim,
-				 enum isl_dim_type type, unsigned pos)
-{
-	struct isl_name *name = get_name(dim, type, pos);
-	return name ? name->name : NULL;
-}
-
-static struct isl_name *tuple_name(__isl_keep isl_dim *dim,
-	enum isl_dim_type type)
-{
-	if (!dim)
-		return NULL;
-	if (type == isl_dim_in)
-		return dim->tuple_name[0];
-	if (type == isl_dim_out)
-		return dim->tuple_name[1];
-	return NULL;
-}
-
-static __isl_keep isl_dim *nested(__isl_keep isl_dim *dim,
-	enum isl_dim_type type)
-{
-	if (!dim)
-		return NULL;
-	if (type == isl_dim_in)
-		return dim->nested[0];
-	if (type == isl_dim_out)
-		return dim->nested[1];
-	return NULL;
-}
-
-int isl_dim_tuple_match(__isl_keep isl_dim *dim1, enum isl_dim_type dim1_type,
-			__isl_keep isl_dim *dim2, enum isl_dim_type dim2_type)
-{
-	struct isl_name *name1, *name2;
-	isl_dim *nested1, *nested2;
-
-	if (n(dim1, dim1_type) != n(dim2, dim2_type))
-		return 0;
-	name1 = tuple_name(dim1, dim1_type);
-	name2 = tuple_name(dim2, dim2_type);
-	if (!name1 ^ !name2)
-		return 0;
-	if (name1 && name1->name != name2->name)
-		return 0;
-	nested1 = nested(dim1, dim1_type);
-	nested2 = nested(dim2, dim2_type);
-	if (!nested1 ^ !nested2)
-		return 0;
-	if (nested1 && !isl_dim_equal(nested1, nested2))
-		return 0;
-	return 1;
-}
-
-static int match(struct isl_dim *dim1, enum isl_dim_type dim1_type,
-		struct isl_dim *dim2, enum isl_dim_type dim2_type)
-{
-	int i;
-
-	if (!isl_dim_tuple_match(dim1, dim1_type, dim2, dim2_type))
-		return 0;
-
-	if (!dim1->names && !dim2->names)
-		return 1;
-
-	for (i = 0; i < n(dim1, dim1_type); ++i) {
-		if (get_name(dim1, dim1_type, i) !=
-		    get_name(dim2, dim2_type, i))
-			return 0;
-	}
-	return 1;
-}
-
-int isl_dim_match(struct isl_dim *dim1, enum isl_dim_type dim1_type,
-		struct isl_dim *dim2, enum isl_dim_type dim2_type)
-{
-	return match(dim1, dim1_type, dim2, dim2_type);
-}
-
-static void get_names(struct isl_dim *dim, enum isl_dim_type type,
-	unsigned first, unsigned n, struct isl_name **names)
-{
-	int i;
-
-	for (i = 0; i < n ; ++i)
-		names[i] = get_name(dim, type, first+i);
-}
-
-struct isl_dim *isl_dim_extend(struct isl_dim *dim,
-			unsigned nparam, unsigned n_in, unsigned n_out)
-{
-	struct isl_name **names = NULL;
-
-	if (!dim)
-		return NULL;
-	if (dim->nparam == nparam && dim->n_in == n_in && dim->n_out == n_out)
-		return dim;
-
-	isl_assert(dim->ctx, dim->nparam <= nparam, goto error);
-	isl_assert(dim->ctx, dim->n_in <= n_in, goto error);
-	isl_assert(dim->ctx, dim->n_out <= n_out, goto error);
-
-	dim = isl_dim_cow(dim);
-
-	if (dim->names) {
-		names = isl_calloc_array(dim->ctx, struct isl_name *,
-					 nparam + n_in + n_out);
-		if (!names)
-			goto error;
-		get_names(dim, isl_dim_param, 0, dim->nparam, names);
-		get_names(dim, isl_dim_in, 0, dim->n_in, names + nparam);
-		get_names(dim, isl_dim_out, 0, dim->n_out,
-				names + nparam + n_in);
-		free(dim->names);
-		dim->names = names;
-		dim->n_name = nparam + n_in + n_out;
-	}
-	dim->nparam = nparam;
-	dim->n_in = n_in;
-	dim->n_out = n_out;
-
-	return dim;
-error:
-	free(names);
-	isl_dim_free(dim);
-	return NULL;
-}
-
-struct isl_dim *isl_dim_add(struct isl_dim *dim, enum isl_dim_type type,
-	unsigned n)
-{
-	if (!dim)
-		return NULL;
-	dim = isl_dim_reset(dim, type);
-	switch (type) {
-	case isl_dim_param:
-		dim = isl_dim_extend(dim,
-					dim->nparam + n, dim->n_in, dim->n_out);
-		if (dim && dim->nested[0] &&
-		    !(dim->nested[0] = isl_dim_add(dim->nested[0],
-						    isl_dim_param, n)))
-			goto error;
-		if (dim && dim->nested[1] &&
-		    !(dim->nested[1] = isl_dim_add(dim->nested[1],
-						    isl_dim_param, n)))
-			goto error;
-		return dim;
-	case isl_dim_in:
-		return isl_dim_extend(dim,
-					dim->nparam, dim->n_in + n, dim->n_out);
-	case isl_dim_out:
-		return isl_dim_extend(dim,
-					dim->nparam, dim->n_in, dim->n_out + n);
-	default:
-		isl_die(dim->ctx, isl_error_invalid,
-			"cannot add dimensions of specified type", goto error);
-	}
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-static int valid_dim_type(enum isl_dim_type type)
-{
-	switch (type) {
-	case isl_dim_param:
-	case isl_dim_in:
-	case isl_dim_out:
-		return 1;
-	default:
-		return 0;
-	}
-}
-
-__isl_give isl_dim *isl_dim_insert(__isl_take isl_dim *dim,
-	enum isl_dim_type type, unsigned pos, unsigned n)
-{
-	struct isl_name **names = NULL;
-
-	if (!dim)
-		return NULL;
-	if (n == 0)
-		return isl_dim_reset(dim, type);
-
-	if (!valid_dim_type(type))
-		isl_die(dim->ctx, isl_error_invalid,
-			"cannot insert dimensions of specified type",
-			goto error);
-
-	isl_assert(dim->ctx, pos <= isl_dim_size(dim, type), goto error);
-
-	dim = isl_dim_cow(dim);
-	if (!dim)
-		return NULL;
-
-	if (dim->names) {
-		enum isl_dim_type t;
-		int off;
-		int s[3];
-		int *size = s - isl_dim_param;
-		names = isl_calloc_array(dim->ctx, struct isl_name *,
-				     dim->nparam + dim->n_in + dim->n_out + n);
-		if (!names)
-			goto error;
-		off = 0;
-		size[isl_dim_param] = dim->nparam;
-		size[isl_dim_in] = dim->n_in;
-		size[isl_dim_out] = dim->n_out;
-		for (t = isl_dim_param; t <= isl_dim_out; ++t) {
-			if (t != type) {
-				get_names(dim, t, 0, size[t], names + off);
-				off += size[t];
-			} else {
-				get_names(dim, t, 0, pos, names + off);
-				off += pos + n;
-				get_names(dim, t, pos, size[t]-pos, names+off);
-				off += size[t] - pos;
-			}
-		}
-		free(dim->names);
-		dim->names = names;
-		dim->n_name = dim->nparam + dim->n_in + dim->n_out + n;
-	}
-	switch (type) {
-	case isl_dim_param:	dim->nparam += n; break;
-	case isl_dim_in:	dim->n_in += n; break;
-	case isl_dim_out:	dim->n_out += n; break;
-	default:		;
-	}
-	dim = isl_dim_reset(dim, type);
-
-	return dim;
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-__isl_give isl_dim *isl_dim_move(__isl_take isl_dim *dim,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n)
-{
-	int i;
-
-	if (!dim)
-		return NULL;
-	if (n == 0)
-		return dim;
-
-	isl_assert(dim->ctx, src_pos + n <= isl_dim_size(dim, src_type),
-		goto error);
-
-	if (dst_type == src_type && dst_pos == src_pos)
-		return dim;
-
-	isl_assert(dim->ctx, dst_type != src_type, goto error);
-
-	dim = isl_dim_reset(dim, src_type);
-	dim = isl_dim_reset(dim, dst_type);
-
-	dim = isl_dim_cow(dim);
-	if (!dim)
-		return NULL;
-
-	if (dim->names) {
-		struct isl_name **names;
-		enum isl_dim_type t;
-		int off;
-		int s[3];
-		int *size = s - isl_dim_param;
-		names = isl_calloc_array(dim->ctx, struct isl_name *,
-					 dim->nparam + dim->n_in + dim->n_out);
-		if (!names)
-			goto error;
-		off = 0;
-		size[isl_dim_param] = dim->nparam;
-		size[isl_dim_in] = dim->n_in;
-		size[isl_dim_out] = dim->n_out;
-		for (t = isl_dim_param; t <= isl_dim_out; ++t) {
-			if (t == dst_type) {
-				get_names(dim, t, 0, dst_pos, names + off);
-				off += dst_pos;
-				get_names(dim, src_type, src_pos, n, names+off);
-				off += n;
-				get_names(dim, t, dst_pos, size[t] - dst_pos,
-						names + off);
-				off += size[t] - dst_pos;
-			} else if (t == src_type) {
-				get_names(dim, t, 0, src_pos, names + off);
-				off += src_pos;
-				get_names(dim, t, src_pos + n,
-					    size[t] - src_pos - n, names + off);
-				off += size[t] - src_pos - n;
-			} else {
-				get_names(dim, t, 0, size[t], names + off);
-				off += size[t];
-			}
-		}
-		free(dim->names);
-		dim->names = names;
-		dim->n_name = dim->nparam + dim->n_in + dim->n_out;
-	}
-
-	switch (dst_type) {
-	case isl_dim_param:	dim->nparam += n; break;
-	case isl_dim_in:	dim->n_in += n; break;
-	case isl_dim_out:	dim->n_out += n; break;
-	default:		;
-	}
-
-	switch (src_type) {
-	case isl_dim_param:	dim->nparam -= n; break;
-	case isl_dim_in:	dim->n_in -= n; break;
-	case isl_dim_out:	dim->n_out -= n; break;
-	default:		;
-	}
-
-	if (dst_type != isl_dim_param && src_type != isl_dim_param)
-		return dim;
-
-	for (i = 0; i < 2; ++i) {
-		if (!dim->nested[i])
-			continue;
-		dim->nested[i] = isl_dim_replace(dim->nested[i],
-						 isl_dim_param, dim);
-		if (!dim->nested[i])
-			goto error;
-	}
-
-	return dim;
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-struct isl_dim *isl_dim_join(struct isl_dim *left, struct isl_dim *right)
-{
-	struct isl_dim *dim;
-
-	if (!left || !right)
-		goto error;
-
-	isl_assert(left->ctx, match(left, isl_dim_param, right, isl_dim_param),
-			goto error);
-	isl_assert(left->ctx,
-		isl_dim_tuple_match(left, isl_dim_out, right, isl_dim_in),
-		goto error);
-
-	dim = isl_dim_alloc(left->ctx, left->nparam, left->n_in, right->n_out);
-	if (!dim)
-		goto error;
-
-	dim = copy_names(dim, isl_dim_param, 0, left, isl_dim_param);
-	dim = copy_names(dim, isl_dim_in, 0, left, isl_dim_in);
-	dim = copy_names(dim, isl_dim_out, 0, right, isl_dim_out);
-
-	if (dim && left->tuple_name[0] &&
-	    !(dim->tuple_name[0] = isl_name_copy(dim->ctx, left->tuple_name[0])))
-		goto error;
-	if (dim && right->tuple_name[1] &&
-	    !(dim->tuple_name[1] = isl_name_copy(dim->ctx, right->tuple_name[1])))
-		goto error;
-	if (dim && left->nested[0] &&
-	    !(dim->nested[0] = isl_dim_copy(left->nested[0])))
-		goto error;
-	if (dim && right->nested[1] &&
-	    !(dim->nested[1] = isl_dim_copy(right->nested[1])))
-		goto error;
-
-	isl_dim_free(left);
-	isl_dim_free(right);
-
-	return dim;
-error:
-	isl_dim_free(left);
-	isl_dim_free(right);
-	return NULL;
-}
-
-struct isl_dim *isl_dim_product(struct isl_dim *left, struct isl_dim *right)
-{
-	isl_dim *dom1, *dom2, *nest1, *nest2;
-
-	if (!left || !right)
-		goto error;
-
-	isl_assert(left->ctx, match(left, isl_dim_param, right, isl_dim_param),
-			goto error);
-
-	dom1 = isl_dim_domain(isl_dim_copy(left));
-	dom2 = isl_dim_domain(isl_dim_copy(right));
-	nest1 = isl_dim_wrap(isl_dim_join(isl_dim_reverse(dom1), dom2));
-
-	dom1 = isl_dim_range(left);
-	dom2 = isl_dim_range(right);
-	nest2 = isl_dim_wrap(isl_dim_join(isl_dim_reverse(dom1), dom2));
-
-	return isl_dim_join(isl_dim_reverse(nest1), nest2);
-error:
-	isl_dim_free(left);
-	isl_dim_free(right);
-	return NULL;
-}
-
-__isl_give isl_dim *isl_dim_range_product(__isl_take isl_dim *left,
-	__isl_take isl_dim *right)
-{
-	isl_dim *dom, *ran1, *ran2, *nest;
-
-	if (!left || !right)
-		goto error;
-
-	isl_assert(left->ctx, match(left, isl_dim_param, right, isl_dim_param),
-			goto error);
-	if (!isl_dim_match(left, isl_dim_in, right, isl_dim_in))
-		isl_die(left->ctx, isl_error_invalid,
-			"domains need to match", goto error);
-
-	dom = isl_dim_domain(isl_dim_copy(left));
-
-	ran1 = isl_dim_range(left);
-	ran2 = isl_dim_range(right);
-	nest = isl_dim_wrap(isl_dim_join(isl_dim_reverse(ran1), ran2));
-
-	return isl_dim_join(isl_dim_reverse(dom), nest);
-error:
-	isl_dim_free(left);
-	isl_dim_free(right);
-	return NULL;
-}
-
-__isl_give isl_dim *isl_dim_map_from_set(__isl_take isl_dim *dim)
-{
-	struct isl_name **names = NULL;
-
-	if (!dim)
-		return NULL;
-	isl_assert(dim->ctx, dim->n_in == 0, goto error);
-	if (dim->n_out == 0 && !isl_dim_is_named_or_nested(dim, isl_dim_out))
-		return dim;
-	dim = isl_dim_cow(dim);
-	if (!dim)
-		return NULL;
-	if (dim->names) {
-		names = isl_calloc_array(dim->ctx, struct isl_name *,
-					dim->nparam + dim->n_out + dim->n_out);
-		if (!names)
-			goto error;
-		get_names(dim, isl_dim_param, 0, dim->nparam, names);
-		get_names(dim, isl_dim_out, 0, dim->n_out, names + dim->nparam);
-	}
-	dim->n_in = dim->n_out;
-	if (names) {
-		free(dim->names);
-		dim->names = names;
-		dim->n_name = dim->nparam + dim->n_out + dim->n_out;
-		dim = copy_names(dim, isl_dim_out, 0, dim, isl_dim_in);
-	}
-	isl_name_free(dim->ctx, dim->tuple_name[0]);
-	dim->tuple_name[0] = isl_name_copy(dim->ctx, dim->tuple_name[1]);
-	isl_dim_free(dim->nested[0]);
-	dim->nested[0] = isl_dim_copy(dim->nested[1]);
-	return dim;
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-static struct isl_dim *set_names(struct isl_dim *dim, enum isl_dim_type type,
-	unsigned first, unsigned n, struct isl_name **names)
-{
-	int i;
-
-	for (i = 0; i < n ; ++i)
-		dim = set_name(dim, type, first+i, names[i]);
-
-	return dim;
-}
-
-struct isl_dim *isl_dim_reverse(struct isl_dim *dim)
-{
-	unsigned t;
-	isl_dim *nested;
-	struct isl_name **names = NULL;
-	struct isl_name *name;
-
-	if (!dim)
-		return NULL;
-	if (match(dim, isl_dim_in, dim, isl_dim_out))
-		return dim;
-
-	dim = isl_dim_cow(dim);
-	if (!dim)
-		return NULL;
-
-	name = dim->tuple_name[0];
-	dim->tuple_name[0] = dim->tuple_name[1];
-	dim->tuple_name[1] = name;
-
-	nested = dim->nested[0];
-	dim->nested[0] = dim->nested[1];
-	dim->nested[1] = nested;
-
-	if (dim->names) {
-		names = isl_alloc_array(dim->ctx, struct isl_name *,
-					dim->n_in + dim->n_out);
-		if (!names)
-			goto error;
-		get_names(dim, isl_dim_in, 0, dim->n_in, names);
-		get_names(dim, isl_dim_out, 0, dim->n_out, names + dim->n_in);
-	}
-
-	t = dim->n_in;
-	dim->n_in = dim->n_out;
-	dim->n_out = t;
-
-	if (dim->names) {
-		dim = set_names(dim, isl_dim_out, 0, dim->n_out, names);
-		dim = set_names(dim, isl_dim_in, 0, dim->n_in, names + dim->n_out);
-		free(names);
-	}
-
-	return dim;
-error:
-	free(names);
-	isl_dim_free(dim);
-	return NULL;
-}
-
-struct isl_dim *isl_dim_drop(struct isl_dim *dim, enum isl_dim_type type,
-		unsigned first, unsigned num)
-{
-	int i;
-
-	if (!dim)
-		return NULL;
-
-	if (num == 0)
-		return isl_dim_reset(dim, type);
-
-	if (!valid_dim_type(type))
-		isl_die(dim->ctx, isl_error_invalid,
-			"cannot drop dimensions of specified type", goto error);
-
-	isl_assert(dim->ctx, first + num <= n(dim, type), goto error);
-	dim = isl_dim_cow(dim);
-	if (!dim)
-		goto error;
-	if (dim->names) {
-		dim = extend_names(dim);
-		if (!dim)
-			goto error;
-		for (i = 0; i < num; ++i)
-			isl_name_free(dim->ctx, get_name(dim, type, first+i));
-		for (i = first+num; i < n(dim, type); ++i)
-			set_name(dim, type, i - num, get_name(dim, type, i));
-		switch (type) {
-		case isl_dim_param:
-			get_names(dim, isl_dim_in, 0, dim->n_in,
-				dim->names + offset(dim, isl_dim_in) - num);
-		case isl_dim_in:
-			get_names(dim, isl_dim_out, 0, dim->n_out,
-				dim->names + offset(dim, isl_dim_out) - num);
-		default:
-			;
-		}
-		dim->n_name -= num;
-	}
-	switch (type) {
-	case isl_dim_param:	dim->nparam -= num; break;
-	case isl_dim_in:	dim->n_in -= num; break;
-	case isl_dim_out:	dim->n_out -= num; break;
-	default:		;
-	}
-	dim = isl_dim_reset(dim, type);
-	if (type == isl_dim_param) {
-		if (dim && dim->nested[0] &&
-		    !(dim->nested[0] = isl_dim_drop(dim->nested[0],
-						    isl_dim_param, first, num)))
-			goto error;
-		if (dim && dim->nested[1] &&
-		    !(dim->nested[1] = isl_dim_drop(dim->nested[1],
-						    isl_dim_param, first, num)))
-			goto error;
-	}
-	return dim;
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-struct isl_dim *isl_dim_drop_inputs(struct isl_dim *dim,
-		unsigned first, unsigned n)
-{
-	if (!dim)
-		return NULL;
-	return isl_dim_drop(dim, isl_dim_in, first, n);
-}
-
-struct isl_dim *isl_dim_drop_outputs(struct isl_dim *dim,
-		unsigned first, unsigned n)
-{
-	if (!dim)
-		return NULL;
-	return isl_dim_drop(dim, isl_dim_out, first, n);
-}
-
-struct isl_dim *isl_dim_domain(struct isl_dim *dim)
-{
-	if (!dim)
-		return NULL;
-	dim = isl_dim_drop_outputs(dim, 0, dim->n_out);
-	return isl_dim_reverse(dim);
-}
-
-__isl_give isl_dim *isl_dim_from_domain(__isl_take isl_dim *dim)
-{
-	return isl_dim_reverse(dim);
-}
-
-struct isl_dim *isl_dim_range(struct isl_dim *dim)
-{
-	if (!dim)
-		return NULL;
-	return isl_dim_drop_inputs(dim, 0, dim->n_in);
-}
-
-__isl_give isl_dim *isl_dim_from_range(__isl_take isl_dim *dim)
-{
-	return dim;
-}
-
-__isl_give isl_dim *isl_dim_as_set_dim(__isl_take isl_dim *dim)
-{
-	dim = isl_dim_cow(dim);
-	if (!dim)
-		return NULL;
-
-	dim->n_out += dim->n_in;
-	dim->n_in = 0;
-	dim = isl_dim_reset(dim, isl_dim_in);
-	dim = isl_dim_reset(dim, isl_dim_out);
-
-	return dim;
-}
-
-struct isl_dim *isl_dim_underlying(struct isl_dim *dim, unsigned n_div)
-{
-	int i;
-
-	if (!dim)
-		return NULL;
-	if (n_div == 0 &&
-	    dim->nparam == 0 && dim->n_in == 0 && dim->n_name == 0)
-		return isl_dim_reset(isl_dim_reset(dim, isl_dim_in), isl_dim_out);
-	dim = isl_dim_cow(dim);
-	if (!dim)
-		return NULL;
-	dim->n_out += dim->nparam + dim->n_in + n_div;
-	dim->nparam = 0;
-	dim->n_in = 0;
-
-	for (i = 0; i < dim->n_name; ++i)
-		isl_name_free(dim->ctx, get_name(dim, isl_dim_out, i));
-	dim->n_name = 0;
-	dim = isl_dim_reset(dim, isl_dim_in);
-	dim = isl_dim_reset(dim, isl_dim_out);
-
-	return dim;
-}
-
-unsigned isl_dim_total(struct isl_dim *dim)
-{
-	return dim ? dim->nparam + dim->n_in + dim->n_out : 0;
-}
-
-int isl_dim_equal(struct isl_dim *dim1, struct isl_dim *dim2)
-{
-	return match(dim1, isl_dim_param, dim2, isl_dim_param) &&
-	       isl_dim_tuple_match(dim1, isl_dim_in, dim2, isl_dim_in) &&
-	       isl_dim_tuple_match(dim1, isl_dim_out, dim2, isl_dim_out);
-}
-
-int isl_dim_compatible(struct isl_dim *dim1, struct isl_dim *dim2)
-{
-	return dim1->nparam == dim2->nparam &&
-	       dim1->n_in + dim1->n_out == dim2->n_in + dim2->n_out;
-}
-
-static uint32_t isl_hash_dim(uint32_t hash, __isl_keep isl_dim *dim)
-{
-	int i;
-	struct isl_name *name;
-
-	if (!dim)
-		return hash;
-
-	hash = isl_hash_builtin(hash, dim->nparam);
-	hash = isl_hash_builtin(hash, dim->n_in);
-	hash = isl_hash_builtin(hash, dim->n_out);
-
-	for (i = 0; i < dim->nparam; ++i) {
-		name = get_name(dim, isl_dim_param, i);
-		hash = isl_hash_name(hash, name);
-	}
-
-	name = tuple_name(dim, isl_dim_in);
-	hash = isl_hash_name(hash, name);
-	name = tuple_name(dim, isl_dim_out);
-	hash = isl_hash_name(hash, name);
-
-	hash = isl_hash_dim(hash, dim->nested[0]);
-	hash = isl_hash_dim(hash, dim->nested[1]);
-
-	return hash;
-}
-
-uint32_t isl_dim_get_hash(__isl_keep isl_dim *dim)
-{
-	uint32_t hash;
-
-	if (!dim)
-		return 0;
-
-	hash = isl_hash_init();
-	hash = isl_hash_dim(hash, dim);
-
-	return hash;
-}
-
-int isl_dim_is_wrapping(__isl_keep isl_dim *dim)
-{
-	if (!dim)
-		return -1;
-
-	if (dim->n_in != 0 || dim->tuple_name[0] || dim->nested[0])
-		return 0;
-
-	return dim->nested[1] != NULL;
-}
-
-__isl_give isl_dim *isl_dim_wrap(__isl_take isl_dim *dim)
-{
-	isl_dim *wrap;
-
-	if (!dim)
-		return NULL;
-
-	wrap = isl_dim_alloc(dim->ctx, dim->nparam, 0, dim->n_in + dim->n_out);
-
-	wrap = copy_names(wrap, isl_dim_param, 0, dim, isl_dim_param);
-	wrap = copy_names(wrap, isl_dim_set, 0, dim, isl_dim_in);
-	wrap = copy_names(wrap, isl_dim_set, dim->n_in, dim, isl_dim_out);
-
-	if (!wrap)
-		goto error;
-
-	wrap->nested[1] = dim;
-
-	return wrap;
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-__isl_give isl_dim *isl_dim_unwrap(__isl_take isl_dim *dim)
-{
-	isl_dim *unwrap;
-
-	if (!dim)
-		return NULL;
-
-	if (!isl_dim_is_wrapping(dim))
-		isl_die(dim->ctx, isl_error_invalid, "not a wrapping dim",
-			goto error);
-
-	unwrap = isl_dim_copy(dim->nested[1]);
-	isl_dim_free(dim);
-
-	return unwrap;
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-int isl_dim_is_named_or_nested(__isl_keep isl_dim *dim, enum isl_dim_type type)
-{
-	if (type != isl_dim_in && type != isl_dim_out)
-		return 0;
-	if (!dim)
-		return -1;
-	if (dim->tuple_name[type - isl_dim_in])
-		return 1;
-	if (dim->nested[type - isl_dim_in])
-		return 1;
-	return 0;
-}
-
-int isl_dim_may_be_set(__isl_keep isl_dim *dim)
-{
-	if (!dim)
-		return -1;
-	if (isl_dim_size(dim, isl_dim_in) != 0)
-		return 0;
-	if (isl_dim_is_named_or_nested(dim, isl_dim_in))
-		return 0;
-	return 1;
-}
-
-__isl_give isl_dim *isl_dim_reset(__isl_take isl_dim *dim,
-	enum isl_dim_type type)
-{
-	if (!isl_dim_is_named_or_nested(dim, type))
-		return dim;
-
-	dim = isl_dim_cow(dim);
-	if (!dim)
-		return NULL;
-
-	isl_name_free(dim->ctx, dim->tuple_name[type - isl_dim_in]);
-	dim->tuple_name[type - isl_dim_in] = NULL;
-	isl_dim_free(dim->nested[type - isl_dim_in]);
-	dim->nested[type - isl_dim_in] = NULL;
-
-	return dim;
-}
-
-__isl_give isl_dim *isl_dim_flatten(__isl_take isl_dim *dim)
-{
-	if (!dim)
-		return NULL;
-	if (!dim->nested[0] && !dim->nested[1])
-		return dim;
-
-	if (dim->nested[0])
-		dim = isl_dim_reset(dim, isl_dim_in);
-	if (dim && dim->nested[1])
-		dim = isl_dim_reset(dim, isl_dim_out);
-
-	return dim;
-}
-
-__isl_give isl_dim *isl_dim_flatten_range(__isl_take isl_dim *dim)
-{
-	if (!dim)
-		return NULL;
-	if (!dim->nested[1])
-		return dim;
-
-	return isl_dim_reset(dim, isl_dim_out);
-}
-
-/* Replace the dimensions of the given type of dst by those of src.
- */
-__isl_give isl_dim *isl_dim_replace(__isl_take isl_dim *dst,
-	enum isl_dim_type type, __isl_keep isl_dim *src)
-{
-	dst = isl_dim_cow(dst);
-
-	if (!dst || !src)
-		goto error;
-
-	dst = isl_dim_drop(dst, type, 0, isl_dim_size(dst, type));
-	dst = isl_dim_add(dst, type, isl_dim_size(src, type));
-	dst = copy_names(dst, type, 0, src, type);
-
-	if (dst && type == isl_dim_param) {
-		int i;
-		for (i = 0; i <= 1; ++i) {
-			if (!dst->nested[i])
-				continue;
-			dst->nested[i] = isl_dim_replace(dst->nested[i],
-							 type, src);
-			if (!dst->nested[i])
-				goto error;
-		}
-	}
-
-	return dst;
-error:
-	isl_dim_free(dst);
-	return NULL;
-}
-
-/* Given a dimension specification "dim" of a set, create a dimension
- * specification for the lift of the set.  In particular, the result
- * is of the form [dim -> local[..]], with n_local variables in the
- * range of the wrapped map.
- */
-__isl_give isl_dim *isl_dim_lift(__isl_take isl_dim *dim, unsigned n_local)
-{
-	isl_dim *local_dim;
-
-	if (!dim)
-		return NULL;
-
-	local_dim = isl_dim_dup(dim);
-	local_dim = isl_dim_drop(local_dim, isl_dim_set, 0, dim->n_out);
-	local_dim = isl_dim_add(local_dim, isl_dim_set, n_local);
-	local_dim = isl_dim_set_tuple_name(local_dim, isl_dim_set, "local");
-	dim = isl_dim_join(isl_dim_from_domain(dim),
-			    isl_dim_from_range(local_dim));
-	dim = isl_dim_wrap(dim);
-	dim = isl_dim_set_tuple_name(dim, isl_dim_set, "lifted");
-
-	return dim;
-}
-
-int isl_dim_can_zip(__isl_keep isl_dim *dim)
-{
-	if (!dim)
-		return -1;
-
-	return dim->nested[0] && dim->nested[1];
-}
-
-__isl_give isl_dim *isl_dim_zip(__isl_take isl_dim *dim)
-{
-	isl_dim *dom, *ran;
-	isl_dim *dom_dom, *dom_ran, *ran_dom, *ran_ran;
-
-	if (!isl_dim_can_zip(dim))
-		isl_die(dim->ctx, isl_error_invalid, "dim cannot be zipped",
-			goto error);
-
-	if (!dim)
-		return 0;
-	dom = isl_dim_unwrap(isl_dim_domain(isl_dim_copy(dim)));
-	ran = isl_dim_unwrap(isl_dim_range(dim));
-	dom_dom = isl_dim_domain(isl_dim_copy(dom));
-	dom_ran = isl_dim_range(dom);
-	ran_dom = isl_dim_domain(isl_dim_copy(ran));
-	ran_ran = isl_dim_range(ran);
-	dom = isl_dim_join(isl_dim_from_domain(dom_dom),
-			   isl_dim_from_range(ran_dom));
-	ran = isl_dim_join(isl_dim_from_domain(dom_ran),
-			   isl_dim_from_range(ran_ran));
-	return isl_dim_join(isl_dim_from_domain(isl_dim_wrap(dom)),
-			    isl_dim_from_range(isl_dim_wrap(ran)));
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-int isl_dim_has_named_params(__isl_keep isl_dim *dim)
-{
-	int i;
-	unsigned off;
-
-	if (!dim)
-		return -1;
-	if (dim->nparam == 0)
-		return 1;
-	off = isl_dim_offset(dim, isl_dim_param);
-	if (off + dim->nparam > dim->n_name)
-		return 0;
-	for (i = 0; i < dim->nparam; ++i)
-		if (!dim->names[off + i])
-			return 0;
-	return 1;
-}
-
-/* Align the initial parameters of dim1 to match the order in dim2.
- */
-__isl_give isl_dim *isl_dim_align_params(__isl_take isl_dim *dim1,
-	__isl_take isl_dim *dim2)
-{
-	isl_reordering *exp;
-
-	if (!isl_dim_has_named_params(dim1) || !isl_dim_has_named_params(dim2))
-		isl_die(isl_dim_get_ctx(dim1), isl_error_invalid,
-			"parameter alignment requires named parameters",
-			goto error);
-
-	exp = isl_parameter_alignment_reordering(dim1, dim2);
-	isl_dim_free(dim1);
-	isl_dim_free(dim2);
-	if (!exp)
-		return NULL;
-	dim1 = isl_dim_copy(exp->dim);
-	isl_reordering_free(exp);
-	return dim1;
-error:
-	isl_dim_free(dim1);
-	isl_dim_free(dim2);
-	return NULL;
-}
diff --git a/cloog-0.16.3/isl/isl_dim_map.c b/cloog-0.16.3/isl/isl_dim_map.c
deleted file mode 100644
index ab3d303..0000000
--- a/cloog-0.16.3/isl/isl_dim_map.c
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2010-2011 INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France 
- */
-
-#include <isl_map_private.h>
-#include <isl_dim_private.h>
-#include <isl_dim_map.h>
-#include <isl_reordering.h>
-
-struct isl_dim_map_entry {
-	int pos;
-	int sgn;
-};
-
-/* Maps dst positions to src positions */
-struct isl_dim_map {
-	unsigned len;
-	struct isl_dim_map_entry m[1];
-};
-
-__isl_give isl_dim_map *isl_dim_map_alloc(isl_ctx *ctx, unsigned len)
-{
-	int i;
-	struct isl_dim_map *dim_map;
-	dim_map = isl_alloc(ctx, struct isl_dim_map,
-	    sizeof(struct isl_dim_map) + len * sizeof(struct isl_dim_map_entry));
-	if (!dim_map)
-		return NULL;
-	dim_map->len = 1 + len;
-	dim_map->m[0].pos = 0;
-	dim_map->m[0].sgn = 1;
-	for (i = 0; i < len; ++i)
-		dim_map->m[1 + i].sgn = 0;
-	return dim_map;
-}
-
-void isl_dim_map_range(__isl_keep isl_dim_map *dim_map,
-	unsigned dst_pos, unsigned dst_stride,
-	unsigned src_pos, unsigned src_stride,
-	unsigned n, int sign)
-{
-	int i;
-
-	if (!dim_map)
-		return;
-
-	for (i = 0; i < n; ++i) {
-		unsigned d = 1 + dst_pos + dst_stride * i;
-		unsigned s = 1 + src_pos + src_stride * i;
-		dim_map->m[d].pos = s;
-		dim_map->m[d].sgn = sign;
-	}
-}
-
-void isl_dim_map_dim_range(__isl_keep isl_dim_map *dim_map,
-	struct isl_dim *dim, enum isl_dim_type type,
-	unsigned first, unsigned n, unsigned dst_pos)
-{
-	int i;
-	unsigned src_pos;
-
-	if (!dim_map || !dim)
-		return;
-	
-	src_pos = 1 + isl_dim_offset(dim, type);
-	for (i = 0; i < n; ++i) {
-		dim_map->m[1 + dst_pos + i].pos = src_pos + first + i;
-		dim_map->m[1 + dst_pos + i].sgn = 1;
-	}
-}
-
-void isl_dim_map_dim(__isl_keep isl_dim_map *dim_map, __isl_keep isl_dim *dim,
-	enum isl_dim_type type, unsigned dst_pos)
-{
-	isl_dim_map_dim_range(dim_map, dim, type,
-			      0, isl_dim_size(dim, type), dst_pos);
-}
-
-void isl_dim_map_div(__isl_keep isl_dim_map *dim_map,
-	__isl_keep isl_basic_map *bmap, unsigned dst_pos)
-{
-	int i;
-	unsigned src_pos;
-
-	if (!dim_map || !bmap)
-		return;
-	
-	src_pos = 1 + isl_dim_total(bmap->dim);
-	for (i = 0; i < bmap->n_div; ++i) {
-		dim_map->m[1 + dst_pos + i].pos = src_pos + i;
-		dim_map->m[1 + dst_pos + i].sgn = 1;
-	}
-}
-
-void isl_dim_map_dump(struct isl_dim_map *dim_map)
-{
-	int i;
-
-	for (i = 0; i < dim_map->len; ++i)
-		fprintf(stderr, "%d -> %d * %d; ", i,
-			dim_map->m[i].sgn, dim_map->m[i].pos);
-	fprintf(stderr, "\n");
-}
-
-static void copy_constraint_dim_map(isl_int *dst, isl_int *src,
-					struct isl_dim_map *dim_map)
-{
-	int i;
-
-	for (i = 0; i < dim_map->len; ++i) {
-		if (dim_map->m[i].sgn == 0)
-			isl_int_set_si(dst[i], 0);
-		else if (dim_map->m[i].sgn > 0)
-			isl_int_set(dst[i], src[dim_map->m[i].pos]);
-		else
-			isl_int_neg(dst[i], src[dim_map->m[i].pos]);
-	}
-}
-
-static void copy_div_dim_map(isl_int *dst, isl_int *src,
-					struct isl_dim_map *dim_map)
-{
-	isl_int_set(dst[0], src[0]);
-	copy_constraint_dim_map(dst+1, src+1, dim_map);
-}
-
-__isl_give isl_basic_map *isl_basic_map_add_constraints_dim_map(
-	__isl_take isl_basic_map *dst, __isl_take isl_basic_map *src,
-	__isl_take isl_dim_map *dim_map)
-{
-	int i;
-
-	if (!src || !dst || !dim_map)
-		goto error;
-
-	for (i = 0; i < src->n_eq; ++i) {
-		int i1 = isl_basic_map_alloc_equality(dst);
-		if (i1 < 0)
-			goto error;
-		copy_constraint_dim_map(dst->eq[i1], src->eq[i], dim_map);
-	}
-
-	for (i = 0; i < src->n_ineq; ++i) {
-		int i1 = isl_basic_map_alloc_inequality(dst);
-		if (i1 < 0)
-			goto error;
-		copy_constraint_dim_map(dst->ineq[i1], src->ineq[i], dim_map);
-	}
-
-	for (i = 0; i < src->n_div; ++i) {
-		int i1 = isl_basic_map_alloc_div(dst);
-		if (i1 < 0)
-			goto error;
-		copy_div_dim_map(dst->div[i1], src->div[i], dim_map);
-	}
-
-	free(dim_map);
-	isl_basic_map_free(src);
-
-	return dst;
-error:
-	free(dim_map);
-	isl_basic_map_free(src);
-	isl_basic_map_free(dst);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_add_constraints_dim_map(
-	__isl_take isl_basic_set *dst, __isl_take isl_basic_set *src,
-	__isl_take isl_dim_map *dim_map)
-{
-	return isl_basic_map_add_constraints_dim_map(dst, src, dim_map);
-}
-
-/* Extend the given dim_map with mappings for the divs in bmap.
- */
-__isl_give isl_dim_map *isl_dim_map_extend(__isl_keep isl_dim_map *dim_map,
-	__isl_keep isl_basic_map *bmap)
-{
-	int i;
-	struct isl_dim_map *res;
-	int offset;
-
-	offset = isl_basic_map_offset(bmap, isl_dim_div);
-
-	res = isl_dim_map_alloc(bmap->ctx, dim_map->len - 1 + bmap->n_div);
-	if (!res)
-		return NULL;
-
-	for (i = 0; i < dim_map->len; ++i)
-		res->m[i] = dim_map->m[i];
-	for (i = 0; i < bmap->n_div; ++i) {
-		res->m[dim_map->len + i].pos = offset + i;
-		res->m[dim_map->len + i].sgn = 1;
-	}
-
-	return res;
-}
-
-/* Extract a dim_map from a reordering.
- * We essentially need to reverse the mapping, and add an offset
- * of 1 for the constant term.
- */
-__isl_give isl_dim_map *isl_dim_map_from_reordering(
-	__isl_keep isl_reordering *exp)
-{
-	int i;
-	isl_ctx *ctx;
-	struct isl_dim_map *dim_map;
-
-	if (!exp)
-		return NULL;
-
-	ctx = isl_dim_get_ctx(exp->dim);
-	dim_map = isl_dim_map_alloc(ctx, isl_dim_total(exp->dim));
-	if (!dim_map)
-		return NULL;
-
-	for (i = 0; i < exp->len; ++i) {
-		dim_map->m[1 + exp->pos[i]].pos = 1 + i;
-		dim_map->m[1 + exp->pos[i]].sgn = 1;
-	}
-
-	return dim_map;
-}
diff --git a/cloog-0.16.3/isl/isl_dim_map.h b/cloog-0.16.3/isl/isl_dim_map.h
deleted file mode 100644
index 0dcdc73..0000000
--- a/cloog-0.16.3/isl/isl_dim_map.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef ISL_DIM_MAP_H
-#define ISL_DIM_MAP_H
-
-#include <isl/ctx.h>
-#include <isl/dim.h>
-#include <isl/map.h>
-
-struct isl_dim_map;
-typedef struct isl_dim_map isl_dim_map;
-
-__isl_give isl_dim_map *isl_dim_map_alloc(isl_ctx *ctx, unsigned len);
-void isl_dim_map_range(__isl_keep isl_dim_map *dim_map,
-	unsigned dst_pos, unsigned dst_stride,
-	unsigned src_pos, unsigned src_stride,
-	unsigned n, int sign);
-void isl_dim_map_dim_range(__isl_keep isl_dim_map *dim_map,
-	struct isl_dim *dim, enum isl_dim_type type,
-	unsigned first, unsigned n, unsigned dst_pos);
-void isl_dim_map_dim(__isl_keep isl_dim_map *dim_map, __isl_keep isl_dim *dim,
-	enum isl_dim_type type, unsigned dst_pos);
-void isl_dim_map_div(__isl_keep isl_dim_map *dim_map,
-	__isl_keep isl_basic_map *bmap, unsigned dst_pos);
-__isl_give isl_basic_set *isl_basic_set_add_constraints_dim_map(
-	__isl_take isl_basic_set *dst, __isl_take isl_basic_set *src,
-	__isl_take isl_dim_map *dim_map);
-__isl_give isl_basic_map *isl_basic_map_add_constraints_dim_map(
-	__isl_take isl_basic_map *dst, __isl_take isl_basic_map *src,
-	__isl_take isl_dim_map *dim_map);
-
-__isl_give isl_dim_map *isl_dim_map_extend(__isl_keep isl_dim_map *dim_map,
-	__isl_keep isl_basic_map *bmap);
-
-__isl_give isl_dim_map *isl_dim_map_from_reordering(
-	__isl_keep isl_reordering *exp);
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_dim_private.h b/cloog-0.16.3/isl/isl_dim_private.h
deleted file mode 100644
index c9e5ca8..0000000
--- a/cloog-0.16.3/isl/isl_dim_private.h
+++ /dev/null
@@ -1,38 +0,0 @@
-#include <isl/dim.h>
-#include <isl/hash.h>
-
-struct isl_name;
-struct isl_dim {
-	int ref;
-
-	struct isl_ctx *ctx;
-
-	unsigned nparam;
-	unsigned n_in;		/* zero for sets */
-	unsigned n_out;		/* dim for sets */
-
-	struct isl_name *tuple_name[2];
-	struct isl_dim *nested[2];
-
-	unsigned n_name;
-	struct isl_name **names;
-};
-
-uint32_t isl_dim_get_hash(__isl_keep isl_dim *dim);
-
-__isl_give isl_dim *isl_dim_as_set_dim(__isl_take isl_dim *dim);
-
-unsigned isl_dim_offset(__isl_keep isl_dim *dim, enum isl_dim_type type);
-
-int isl_dim_may_be_set(__isl_keep isl_dim *dim);
-int isl_dim_is_named_or_nested(__isl_keep isl_dim *dim, enum isl_dim_type type);
-int isl_dim_has_named_params(__isl_keep isl_dim *dim);
-__isl_give isl_dim *isl_dim_reset(__isl_take isl_dim *dim,
-	enum isl_dim_type type);
-__isl_give isl_dim *isl_dim_flatten(__isl_take isl_dim *dim);
-__isl_give isl_dim *isl_dim_flatten_range(__isl_take isl_dim *dim);
-
-__isl_give isl_dim *isl_dim_replace(__isl_take isl_dim *dst,
-	enum isl_dim_type type, __isl_keep isl_dim *src);
-
-__isl_give isl_dim *isl_dim_lift(__isl_take isl_dim *dim, unsigned n_local);
diff --git a/cloog-0.16.3/isl/isl_div.c b/cloog-0.16.3/isl/isl_div.c
deleted file mode 100644
index a04646f..0000000
--- a/cloog-0.16.3/isl/isl_div.c
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_map_private.h>
-#include <isl_div_private.h>
-#include <isl/map.h>
-#include <isl_dim_private.h>
-#include <isl/seq.h>
-#include <isl/aff.h>
-
-isl_ctx *isl_div_get_ctx(__isl_keep isl_div *div)
-{
-	return div ? div->ctx : NULL;
-}
-
-static unsigned n(struct isl_div *d, enum isl_dim_type type)
-{
-	struct isl_dim *dim = d->bmap->dim;
-	switch (type) {
-	case isl_dim_param:	return dim->nparam;
-	case isl_dim_in:	return dim->n_in;
-	case isl_dim_out:	return dim->n_out;
-	case isl_dim_div:	return d->bmap->n_div;
-	default:		return 0;
-	}
-}
-
-unsigned isl_div_dim(__isl_keep isl_div *div, enum isl_dim_type type)
-{
-	return n(div, type);
-}
-
-static unsigned offset(struct isl_div *d, enum isl_dim_type type)
-{
-	struct isl_dim *dim = d->bmap->dim;
-	switch (type) {
-	case isl_dim_param: return 1 + 1;
-	case isl_dim_in:    return 1 + 1 + dim->nparam;
-	case isl_dim_out:   return 1 + 1 + dim->nparam + dim->n_in;
-	case isl_dim_div:   return 1 + 1 + dim->nparam + dim->n_in + dim->n_out;
-	default:	    return 0;
-	}
-}
-
-struct isl_div *isl_basic_map_div(struct isl_basic_map *bmap, int pos)
-{
-	struct isl_div *div;
-
-	if (!bmap)
-		goto error;
-
-	isl_assert(bmap->ctx, pos < bmap->n_div, goto error);
-	
-	div = isl_alloc_type(bmap->ctx, struct isl_div);
-	if (!div)
-		goto error;
-
-	div->ctx = bmap->ctx;
-	isl_ctx_ref(div->ctx);
-	div->ref = 1;
-	div->bmap = bmap;
-	div->line = &bmap->div[pos];
-
-	return div;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_div *isl_basic_set_div(struct isl_basic_set *bset, int pos)
-{
-	return isl_basic_map_div((struct isl_basic_map *)bset, pos);
-}
-
-__isl_give isl_div *isl_div_div(__isl_take isl_div *div, int pos)
-{
-	isl_basic_map *bmap;
-	if (!div)
-		return NULL;
-	bmap = isl_basic_map_copy(div->bmap);
-	isl_div_free(div);
-	return isl_basic_map_div(bmap, pos);
-}
-
-struct isl_div *isl_div_alloc(struct isl_dim *dim)
-{
-	struct isl_basic_map *bmap;
-
-	if (!dim)
-		return NULL;
-
-	bmap = isl_basic_map_alloc_dim(dim, 1, 0, 0);
-	if (!bmap)
-		return NULL;
-
-	isl_basic_map_alloc_div(bmap);
-	isl_seq_clr(bmap->div[0], 1 + 1 + isl_basic_map_total_dim(bmap));
-	return isl_basic_map_div(bmap, 0);
-}
-
-__isl_give isl_div *isl_div_copy(__isl_keep isl_div *div)
-{
-	if (!div)
-		return NULL;
-
-	div->ref++;
-	return div;
-}
-
-void isl_div_free(struct isl_div *c)
-{
-	if (!c)
-		return;
-
-	if (--c->ref > 0)
-		return;
-
-	isl_basic_map_free(c->bmap);
-	isl_ctx_deref(c->ctx);
-	free(c);
-}
-
-void isl_div_get_constant(struct isl_div *div, isl_int *v)
-{
-	if (!div)
-		return;
-	isl_int_set(*v, div->line[0][1]);
-}
-
-void isl_div_get_denominator(struct isl_div *div, isl_int *v)
-{
-	if (!div)
-		return;
-	isl_int_set(*v, div->line[0][0]);
-}
-
-void isl_div_get_coefficient(struct isl_div *div,
-	enum isl_dim_type type, int pos, isl_int *v)
-{
-	if (!div)
-		return;
-
-	isl_assert(div->ctx, pos < n(div, type), return);
-	isl_int_set(*v, div->line[0][offset(div, type) + pos]);
-}
-
-void isl_div_set_constant(struct isl_div *div, isl_int v)
-{
-	if (!div)
-		return;
-	isl_int_set(div->line[0][1], v);
-}
-
-void isl_div_set_denominator(struct isl_div *div, isl_int v)
-{
-	if (!div)
-		return;
-	isl_int_set(div->line[0][0], v);
-}
-
-void isl_div_set_coefficient(struct isl_div *div,
-	enum isl_dim_type type, int pos, isl_int v)
-{
-	if (!div)
-		return;
-
-	isl_assert(div->ctx, pos < n(div, type), return);
-	isl_int_set(div->line[0][offset(div, type) + pos], v);
-}
-
-__isl_give isl_aff *isl_aff_from_div(__isl_take isl_div *div)
-{
-	isl_aff *aff;
-	int pos;
-
-	if (!div)
-		return NULL;
-
-	pos = div->line - div->bmap->div;
-	aff = isl_aff_zero(isl_basic_map_get_local_space(div->bmap));
-	aff = isl_aff_set_coefficient_si(aff, isl_dim_div, pos, 1);
-
-	isl_div_free(div);
-	return aff;
-}
diff --git a/cloog-0.16.3/isl/isl_div_private.h b/cloog-0.16.3/isl/isl_div_private.h
deleted file mode 100644
index f0a88f9..0000000
--- a/cloog-0.16.3/isl/isl_div_private.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <isl/div.h>
-#include <isl/map.h>
-
-struct isl_div {
-	int ref;
-	struct isl_ctx *ctx;
-
-	struct isl_basic_map	*bmap;
-	isl_int			**line;
-};
diff --git a/cloog-0.16.3/isl/isl_equalities.c b/cloog-0.16.3/isl/isl_equalities.c
deleted file mode 100644
index 68d2c89..0000000
--- a/cloog-0.16.3/isl/isl_equalities.c
+++ /dev/null
@@ -1,697 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_mat_private.h>
-#include <isl/seq.h>
-#include "isl_map_private.h"
-#include "isl_equalities.h"
-
-/* Given a set of modulo constraints
- *
- *		c + A y = 0 mod d
- *
- * this function computes a particular solution y_0
- *
- * The input is given as a matrix B = [ c A ] and a vector d.
- *
- * The output is matrix containing the solution y_0 or
- * a zero-column matrix if the constraints admit no integer solution.
- *
- * The given set of constrains is equivalent to
- *
- *		c + A y = -D x
- *
- * with D = diag d and x a fresh set of variables.
- * Reducing both c and A modulo d does not change the
- * value of y in the solution and may lead to smaller coefficients.
- * Let M = [ D A ] and [ H 0 ] = M U, the Hermite normal form of M.
- * Then
- *		  [ x ]
- *		M [ y ] = - c
- * and so
- *		               [ x ]
- *		[ H 0 ] U^{-1} [ y ] = - c
- * Let
- *		[ A ]          [ x ]
- *		[ B ] = U^{-1} [ y ]
- * then
- *		H A + 0 B = -c
- *
- * so B may be chosen arbitrarily, e.g., B = 0, and then
- *
- *		       [ x ] = [ -c ]
- *		U^{-1} [ y ] = [  0 ]
- * or
- *		[ x ]     [ -c ]
- *		[ y ] = U [  0 ]
- * specifically,
- *
- *		y = U_{2,1} (-c)
- *
- * If any of the coordinates of this y are non-integer
- * then the constraints admit no integer solution and
- * a zero-column matrix is returned.
- */
-static struct isl_mat *particular_solution(struct isl_mat *B, struct isl_vec *d)
-{
-	int i, j;
-	struct isl_mat *M = NULL;
-	struct isl_mat *C = NULL;
-	struct isl_mat *U = NULL;
-	struct isl_mat *H = NULL;
-	struct isl_mat *cst = NULL;
-	struct isl_mat *T = NULL;
-
-	M = isl_mat_alloc(B->ctx, B->n_row, B->n_row + B->n_col - 1);
-	C = isl_mat_alloc(B->ctx, 1 + B->n_row, 1);
-	if (!M || !C)
-		goto error;
-	isl_int_set_si(C->row[0][0], 1);
-	for (i = 0; i < B->n_row; ++i) {
-		isl_seq_clr(M->row[i], B->n_row);
-		isl_int_set(M->row[i][i], d->block.data[i]);
-		isl_int_neg(C->row[1 + i][0], B->row[i][0]);
-		isl_int_fdiv_r(C->row[1+i][0], C->row[1+i][0], M->row[i][i]);
-		for (j = 0; j < B->n_col - 1; ++j)
-			isl_int_fdiv_r(M->row[i][B->n_row + j],
-					B->row[i][1 + j], M->row[i][i]);
-	}
-	M = isl_mat_left_hermite(M, 0, &U, NULL);
-	if (!M || !U)
-		goto error;
-	H = isl_mat_sub_alloc(M, 0, B->n_row, 0, B->n_row);
-	H = isl_mat_lin_to_aff(H);
-	C = isl_mat_inverse_product(H, C);
-	if (!C)
-		goto error;
-	for (i = 0; i < B->n_row; ++i) {
-		if (!isl_int_is_divisible_by(C->row[1+i][0], C->row[0][0]))
-			break;
-		isl_int_divexact(C->row[1+i][0], C->row[1+i][0], C->row[0][0]);
-	}
-	if (i < B->n_row)
-		cst = isl_mat_alloc(B->ctx, B->n_row, 0);
-	else
-		cst = isl_mat_sub_alloc(C, 1, B->n_row, 0, 1);
-	T = isl_mat_sub_alloc(U, B->n_row, B->n_col - 1, 0, B->n_row);
-	cst = isl_mat_product(T, cst);
-	isl_mat_free(M);
-	isl_mat_free(C);
-	isl_mat_free(U);
-	return cst;
-error:
-	isl_mat_free(M);
-	isl_mat_free(C);
-	isl_mat_free(U);
-	return NULL;
-}
-
-/* Compute and return the matrix
- *
- *		U_1^{-1} diag(d_1, 1, ..., 1)
- *
- * with U_1 the unimodular completion of the first (and only) row of B.
- * The columns of this matrix generate the lattice that satisfies
- * the single (linear) modulo constraint.
- */
-static struct isl_mat *parameter_compression_1(
-			struct isl_mat *B, struct isl_vec *d)
-{
-	struct isl_mat *U;
-
-	U = isl_mat_alloc(B->ctx, B->n_col - 1, B->n_col - 1);
-	if (!U)
-		return NULL;
-	isl_seq_cpy(U->row[0], B->row[0] + 1, B->n_col - 1);
-	U = isl_mat_unimodular_complete(U, 1);
-	U = isl_mat_right_inverse(U);
-	if (!U)
-		return NULL;
-	isl_mat_col_mul(U, 0, d->block.data[0], 0);
-	U = isl_mat_lin_to_aff(U);
-	return U;
-}
-
-/* Compute a common lattice of solutions to the linear modulo
- * constraints specified by B and d.
- * See also the documentation of isl_mat_parameter_compression.
- * We put the matrix
- * 
- *		A = [ L_1^{-T} L_2^{-T} ... L_k^{-T} ]
- *
- * on a common denominator.  This denominator D is the lcm of modulos d.
- * Since L_i = U_i^{-1} diag(d_i, 1, ... 1), we have
- * L_i^{-T} = U_i^T diag(d_i, 1, ... 1)^{-T} = U_i^T diag(1/d_i, 1, ..., 1).
- * Putting this on the common denominator, we have
- * D * L_i^{-T} = U_i^T diag(D/d_i, D, ..., D).
- */
-static struct isl_mat *parameter_compression_multi(
-			struct isl_mat *B, struct isl_vec *d)
-{
-	int i, j, k;
-	isl_int D;
-	struct isl_mat *A = NULL, *U = NULL;
-	struct isl_mat *T;
-	unsigned size;
-
-	isl_int_init(D);
-
-	isl_vec_lcm(d, &D);
-
-	size = B->n_col - 1;
-	A = isl_mat_alloc(B->ctx, size, B->n_row * size);
-	U = isl_mat_alloc(B->ctx, size, size);
-	if (!U || !A)
-		goto error;
-	for (i = 0; i < B->n_row; ++i) {
-		isl_seq_cpy(U->row[0], B->row[i] + 1, size);
-		U = isl_mat_unimodular_complete(U, 1);
-		if (!U)
-			goto error;
-		isl_int_divexact(D, D, d->block.data[i]);
-		for (k = 0; k < U->n_col; ++k)
-			isl_int_mul(A->row[k][i*size+0], D, U->row[0][k]);
-		isl_int_mul(D, D, d->block.data[i]);
-		for (j = 1; j < U->n_row; ++j)
-			for (k = 0; k < U->n_col; ++k)
-				isl_int_mul(A->row[k][i*size+j],
-						D, U->row[j][k]);
-	}
-	A = isl_mat_left_hermite(A, 0, NULL, NULL);
-	T = isl_mat_sub_alloc(A, 0, A->n_row, 0, A->n_row);
-	T = isl_mat_lin_to_aff(T);
-	if (!T)
-		goto error;
-	isl_int_set(T->row[0][0], D);
-	T = isl_mat_right_inverse(T);
-	if (!T)
-		goto error;
-	isl_assert(T->ctx, isl_int_is_one(T->row[0][0]), goto error);
-	T = isl_mat_transpose(T);
-	isl_mat_free(A);
-	isl_mat_free(U);
-
-	isl_int_clear(D);
-	return T;
-error:
-	isl_mat_free(A);
-	isl_mat_free(U);
-	isl_int_clear(D);
-	return NULL;
-}
-
-/* Given a set of modulo constraints
- *
- *		c + A y = 0 mod d
- *
- * this function returns an affine transformation T,
- *
- *		y = T y'
- *
- * that bijectively maps the integer vectors y' to integer
- * vectors y that satisfy the modulo constraints.
- *
- * This function is inspired by Section 2.5.3
- * of B. Meister, "Stating and Manipulating Periodicity in the Polytope
- * Model.  Applications to Program Analysis and Optimization".
- * However, the implementation only follows the algorithm of that
- * section for computing a particular solution and not for computing
- * a general homogeneous solution.  The latter is incomplete and
- * may remove some valid solutions.
- * Instead, we use an adaptation of the algorithm in Section 7 of
- * B. Meister, S. Verdoolaege, "Polynomial Approximations in the Polytope
- * Model: Bringing the Power of Quasi-Polynomials to the Masses".
- *
- * The input is given as a matrix B = [ c A ] and a vector d.
- * Each element of the vector d corresponds to a row in B.
- * The output is a lower triangular matrix.
- * If no integer vector y satisfies the given constraints then
- * a matrix with zero columns is returned.
- *
- * We first compute a particular solution y_0 to the given set of
- * modulo constraints in particular_solution.  If no such solution
- * exists, then we return a zero-columned transformation matrix.
- * Otherwise, we compute the generic solution to
- *
- *		A y = 0 mod d
- *
- * That is we want to compute G such that
- *
- *		y = G y''
- *
- * with y'' integer, describes the set of solutions.
- *
- * We first remove the common factors of each row.
- * In particular if gcd(A_i,d_i) != 1, then we divide the whole
- * row i (including d_i) by this common factor.  If afterwards gcd(A_i) != 1,
- * then we divide this row of A by the common factor, unless gcd(A_i) = 0.
- * In the later case, we simply drop the row (in both A and d).
- *
- * If there are no rows left in A, then G is the identity matrix. Otherwise,
- * for each row i, we now determine the lattice of integer vectors
- * that satisfies this row.  Let U_i be the unimodular extension of the
- * row A_i.  This unimodular extension exists because gcd(A_i) = 1.
- * The first component of
- *
- *		y' = U_i y
- *
- * needs to be a multiple of d_i.  Let y' = diag(d_i, 1, ..., 1) y''.
- * Then,
- *
- *		y = U_i^{-1} diag(d_i, 1, ..., 1) y''
- *
- * for arbitrary integer vectors y''.  That is, y belongs to the lattice
- * generated by the columns of L_i = U_i^{-1} diag(d_i, 1, ..., 1).
- * If there is only one row, then G = L_1.
- *
- * If there is more than one row left, we need to compute the intersection
- * of the lattices.  That is, we need to compute an L such that
- *
- *		L = L_i L_i'	for all i
- *
- * with L_i' some integer matrices.  Let A be constructed as follows
- *
- *		A = [ L_1^{-T} L_2^{-T} ... L_k^{-T} ]
- *
- * and computed the Hermite Normal Form of A = [ H 0 ] U
- * Then,
- *
- *		L_i^{-T} = H U_{1,i}
- *
- * or
- *
- *		H^{-T} = L_i U_{1,i}^T
- *
- * In other words G = L = H^{-T}.
- * To ensure that G is lower triangular, we compute and use its Hermite
- * normal form.
- *
- * The affine transformation matrix returned is then
- *
- *		[  1   0  ]
- *		[ y_0  G  ]
- *
- * as any y = y_0 + G y' with y' integer is a solution to the original
- * modulo constraints.
- */
-struct isl_mat *isl_mat_parameter_compression(
-			struct isl_mat *B, struct isl_vec *d)
-{
-	int i;
-	struct isl_mat *cst = NULL;
-	struct isl_mat *T = NULL;
-	isl_int D;
-
-	if (!B || !d)
-		goto error;
-	isl_assert(B->ctx, B->n_row == d->size, goto error);
-	cst = particular_solution(B, d);
-	if (!cst)
-		goto error;
-	if (cst->n_col == 0) {
-		T = isl_mat_alloc(B->ctx, B->n_col, 0);
-		isl_mat_free(cst);
-		isl_mat_free(B);
-		isl_vec_free(d);
-		return T;
-	}
-	isl_int_init(D);
-	/* Replace a*g*row = 0 mod g*m by row = 0 mod m */
-	for (i = 0; i < B->n_row; ++i) {
-		isl_seq_gcd(B->row[i] + 1, B->n_col - 1, &D);
-		if (isl_int_is_one(D))
-			continue;
-		if (isl_int_is_zero(D)) {
-			B = isl_mat_drop_rows(B, i, 1);
-			d = isl_vec_cow(d);
-			if (!B || !d)
-				goto error2;
-			isl_seq_cpy(d->block.data+i, d->block.data+i+1,
-							d->size - (i+1));
-			d->size--;
-			i--;
-			continue;
-		}
-		B = isl_mat_cow(B);
-		if (!B)
-			goto error2;
-		isl_seq_scale_down(B->row[i] + 1, B->row[i] + 1, D, B->n_col-1);
-		isl_int_gcd(D, D, d->block.data[i]);
-		d = isl_vec_cow(d);
-		if (!d)
-			goto error2;
-		isl_int_divexact(d->block.data[i], d->block.data[i], D);
-	}
-	isl_int_clear(D);
-	if (B->n_row == 0)
-		T = isl_mat_identity(B->ctx, B->n_col);
-	else if (B->n_row == 1)
-		T = parameter_compression_1(B, d);
-	else
-		T = parameter_compression_multi(B, d);
-	T = isl_mat_left_hermite(T, 0, NULL, NULL);
-	if (!T)
-		goto error;
-	isl_mat_sub_copy(T->ctx, T->row + 1, cst->row, cst->n_row, 0, 0, 1);
-	isl_mat_free(cst);
-	isl_mat_free(B);
-	isl_vec_free(d);
-	return T;
-error2:
-	isl_int_clear(D);
-error:
-	isl_mat_free(cst);
-	isl_mat_free(B);
-	isl_vec_free(d);
-	return NULL;
-}
-
-/* Given a set of equalities
- *
- *		M x - c = 0
- *
- * this function computes a unimodular transformation from a lower-dimensional
- * space to the original space that bijectively maps the integer points x'
- * in the lower-dimensional space to the integer points x in the original
- * space that satisfy the equalities.
- *
- * The input is given as a matrix B = [ -c M ] and the output is a
- * matrix that maps [1 x'] to [1 x].
- * If T2 is not NULL, then *T2 is set to a matrix mapping [1 x] to [1 x'].
- *
- * First compute the (left) Hermite normal form of M,
- *
- *		M [U1 U2] = M U = H = [H1 0]
- * or
- *		              M = H Q = [H1 0] [Q1]
- *                                             [Q2]
- *
- * with U, Q unimodular, Q = U^{-1} (and H lower triangular).
- * Define the transformed variables as
- *
- *		x = [U1 U2] [ x1' ] = [U1 U2] [Q1] x
- *		            [ x2' ]           [Q2]
- *
- * The equalities then become
- *
- *		H1 x1' - c = 0   or   x1' = H1^{-1} c = c'
- *
- * If any of the c' is non-integer, then the original set has no
- * integer solutions (since the x' are a unimodular transformation
- * of the x) and a zero-column matrix is returned.
- * Otherwise, the transformation is given by
- *
- *		x = U1 H1^{-1} c + U2 x2'
- *
- * The inverse transformation is simply
- *
- *		x2' = Q2 x
- */
-struct isl_mat *isl_mat_variable_compression(struct isl_mat *B,
-	struct isl_mat **T2)
-{
-	int i;
-	struct isl_mat *H = NULL, *C = NULL, *H1, *U = NULL, *U1, *U2, *TC;
-	unsigned dim;
-
-	if (T2)
-		*T2 = NULL;
-	if (!B)
-		goto error;
-
-	dim = B->n_col - 1;
-	H = isl_mat_sub_alloc(B, 0, B->n_row, 1, dim);
-	H = isl_mat_left_hermite(H, 0, &U, T2);
-	if (!H || !U || (T2 && !*T2))
-		goto error;
-	if (T2) {
-		*T2 = isl_mat_drop_rows(*T2, 0, B->n_row);
-		*T2 = isl_mat_lin_to_aff(*T2);
-		if (!*T2)
-			goto error;
-	}
-	C = isl_mat_alloc(B->ctx, 1+B->n_row, 1);
-	if (!C)
-		goto error;
-	isl_int_set_si(C->row[0][0], 1);
-	isl_mat_sub_neg(C->ctx, C->row+1, B->row, B->n_row, 0, 0, 1);
-	H1 = isl_mat_sub_alloc(H, 0, H->n_row, 0, H->n_row);
-	H1 = isl_mat_lin_to_aff(H1);
-	TC = isl_mat_inverse_product(H1, C);
-	if (!TC)
-		goto error;
-	isl_mat_free(H);
-	if (!isl_int_is_one(TC->row[0][0])) {
-		for (i = 0; i < B->n_row; ++i) {
-			if (!isl_int_is_divisible_by(TC->row[1+i][0], TC->row[0][0])) {
-				struct isl_ctx *ctx = B->ctx;
-				isl_mat_free(B);
-				isl_mat_free(TC);
-				isl_mat_free(U);
-				if (T2) {
-					isl_mat_free(*T2);
-					*T2 = NULL;
-				}
-				return isl_mat_alloc(ctx, 1 + dim, 0);
-			}
-			isl_seq_scale_down(TC->row[1+i], TC->row[1+i], TC->row[0][0], 1);
-		}
-		isl_int_set_si(TC->row[0][0], 1);
-	}
-	U1 = isl_mat_sub_alloc(U, 0, U->n_row, 0, B->n_row);
-	U1 = isl_mat_lin_to_aff(U1);
-	U2 = isl_mat_sub_alloc(U, 0, U->n_row, B->n_row, U->n_row - B->n_row);
-	U2 = isl_mat_lin_to_aff(U2);
-	isl_mat_free(U);
-	TC = isl_mat_product(U1, TC);
-	TC = isl_mat_aff_direct_sum(TC, U2);
-
-	isl_mat_free(B);
-
-	return TC;
-error:
-	isl_mat_free(B);
-	isl_mat_free(H);
-	isl_mat_free(U);
-	if (T2) {
-		isl_mat_free(*T2);
-		*T2 = NULL;
-	}
-	return NULL;
-}
-
-/* Use the n equalities of bset to unimodularly transform the
- * variables x such that n transformed variables x1' have a constant value
- * and rewrite the constraints of bset in terms of the remaining
- * transformed variables x2'.  The matrix pointed to by T maps
- * the new variables x2' back to the original variables x, while T2
- * maps the original variables to the new variables.
- */
-static struct isl_basic_set *compress_variables(
-	struct isl_basic_set *bset, struct isl_mat **T, struct isl_mat **T2)
-{
-	struct isl_mat *B, *TC;
-	unsigned dim;
-
-	if (T)
-		*T = NULL;
-	if (T2)
-		*T2 = NULL;
-	if (!bset)
-		goto error;
-	isl_assert(bset->ctx, isl_basic_set_n_param(bset) == 0, goto error);
-	isl_assert(bset->ctx, bset->n_div == 0, goto error);
-	dim = isl_basic_set_n_dim(bset);
-	isl_assert(bset->ctx, bset->n_eq <= dim, goto error);
-	if (bset->n_eq == 0)
-		return bset;
-
-	B = isl_mat_sub_alloc6(bset->ctx, bset->eq, 0, bset->n_eq, 0, 1 + dim);
-	TC = isl_mat_variable_compression(B, T2);
-	if (!TC)
-		goto error;
-	if (TC->n_col == 0) {
-		isl_mat_free(TC);
-		if (T2) {
-			isl_mat_free(*T2);
-			*T2 = NULL;
-		}
-		return isl_basic_set_set_to_empty(bset);
-	}
-
-	bset = isl_basic_set_preimage(bset, T ? isl_mat_copy(TC) : TC);
-	if (T)
-		*T = TC;
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_remove_equalities(
-	struct isl_basic_set *bset, struct isl_mat **T, struct isl_mat **T2)
-{
-	if (T)
-		*T = NULL;
-	if (T2)
-		*T2 = NULL;
-	if (!bset)
-		return NULL;
-	isl_assert(bset->ctx, isl_basic_set_n_param(bset) == 0, goto error);
-	bset = isl_basic_set_gauss(bset, NULL);
-	if (ISL_F_ISSET(bset, ISL_BASIC_SET_EMPTY))
-		return bset;
-	bset = compress_variables(bset, T, T2);
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	*T = NULL;
-	return NULL;
-}
-
-/* Check if dimension dim belongs to a residue class
- *		i_dim \equiv r mod m
- * with m != 1 and if so return m in *modulo and r in *residue.
- * As a special case, when i_dim has a fixed value v, then
- * *modulo is set to 0 and *residue to v.
- *
- * If i_dim does not belong to such a residue class, then *modulo
- * is set to 1 and *residue is set to 0.
- */
-int isl_basic_set_dim_residue_class(struct isl_basic_set *bset,
-	int pos, isl_int *modulo, isl_int *residue)
-{
-	struct isl_ctx *ctx;
-	struct isl_mat *H = NULL, *U = NULL, *C, *H1, *U1;
-	unsigned total;
-	unsigned nparam;
-
-	if (!bset || !modulo || !residue)
-		return -1;
-
-	if (isl_basic_set_plain_dim_is_fixed(bset, pos, residue)) {
-		isl_int_set_si(*modulo, 0);
-		return 0;
-	}
-
-	ctx = bset->ctx;
-	total = isl_basic_set_total_dim(bset);
-	nparam = isl_basic_set_n_param(bset);
-	H = isl_mat_sub_alloc6(bset->ctx, bset->eq, 0, bset->n_eq, 1, total);
-	H = isl_mat_left_hermite(H, 0, &U, NULL);
-	if (!H)
-		return -1;
-
-	isl_seq_gcd(U->row[nparam + pos]+bset->n_eq,
-			total-bset->n_eq, modulo);
-	if (isl_int_is_zero(*modulo))
-		isl_int_set_si(*modulo, 1);
-	if (isl_int_is_one(*modulo)) {
-		isl_int_set_si(*residue, 0);
-		isl_mat_free(H);
-		isl_mat_free(U);
-		return 0;
-	}
-
-	C = isl_mat_alloc(bset->ctx, 1+bset->n_eq, 1);
-	if (!C)
-		goto error;
-	isl_int_set_si(C->row[0][0], 1);
-	isl_mat_sub_neg(C->ctx, C->row+1, bset->eq, bset->n_eq, 0, 0, 1);
-	H1 = isl_mat_sub_alloc(H, 0, H->n_row, 0, H->n_row);
-	H1 = isl_mat_lin_to_aff(H1);
-	C = isl_mat_inverse_product(H1, C);
-	isl_mat_free(H);
-	U1 = isl_mat_sub_alloc(U, nparam+pos, 1, 0, bset->n_eq);
-	U1 = isl_mat_lin_to_aff(U1);
-	isl_mat_free(U);
-	C = isl_mat_product(U1, C);
-	if (!C)
-		goto error;
-	if (!isl_int_is_divisible_by(C->row[1][0], C->row[0][0])) {
-		bset = isl_basic_set_copy(bset);
-		bset = isl_basic_set_set_to_empty(bset);
-		isl_basic_set_free(bset);
-		isl_int_set_si(*modulo, 1);
-		isl_int_set_si(*residue, 0);
-		return 0;
-	}
-	isl_int_divexact(*residue, C->row[1][0], C->row[0][0]);
-	isl_int_fdiv_r(*residue, *residue, *modulo);
-	isl_mat_free(C);
-	return 0;
-error:
-	isl_mat_free(H);
-	isl_mat_free(U);
-	return -1;
-}
-
-/* Check if dimension dim belongs to a residue class
- *		i_dim \equiv r mod m
- * with m != 1 and if so return m in *modulo and r in *residue.
- * As a special case, when i_dim has a fixed value v, then
- * *modulo is set to 0 and *residue to v.
- *
- * If i_dim does not belong to such a residue class, then *modulo
- * is set to 1 and *residue is set to 0.
- */
-int isl_set_dim_residue_class(struct isl_set *set,
-	int pos, isl_int *modulo, isl_int *residue)
-{
-	isl_int m;
-	isl_int r;
-	int i;
-
-	if (!set || !modulo || !residue)
-		return -1;
-
-	if (set->n == 0) {
-		isl_int_set_si(*modulo, 0);
-		isl_int_set_si(*residue, 0);
-		return 0;
-	}
-
-	if (isl_basic_set_dim_residue_class(set->p[0], pos, modulo, residue)<0)
-		return -1;
-
-	if (set->n == 1)
-		return 0;
-
-	if (isl_int_is_one(*modulo))
-		return 0;
-
-	isl_int_init(m);
-	isl_int_init(r);
-
-	for (i = 1; i < set->n; ++i) {
-		if (isl_basic_set_dim_residue_class(set->p[0], pos, &m, &r) < 0)
-			goto error;
-		isl_int_gcd(*modulo, *modulo, m);
-		if (!isl_int_is_zero(*modulo))
-			isl_int_fdiv_r(*residue, *residue, *modulo);
-		if (isl_int_is_one(*modulo))
-			break;
-		if (!isl_int_is_zero(*modulo))
-			isl_int_fdiv_r(r, r, *modulo);
-		if (isl_int_ne(*residue, r)) {
-			isl_int_set_si(*modulo, 1);
-			isl_int_set_si(*residue, 0);
-			break;
-		}
-	}
-
-	isl_int_clear(m);
-	isl_int_clear(r);
-
-	return 0;
-error:
-	isl_int_clear(m);
-	isl_int_clear(r);
-	return -1;
-}
diff --git a/cloog-0.16.3/isl/isl_equalities.h b/cloog-0.16.3/isl/isl_equalities.h
deleted file mode 100644
index ceb5544..0000000
--- a/cloog-0.16.3/isl/isl_equalities.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_EQUALITIES_H
-#define ISL_EQUALITIES_H
-
-#include <isl/set.h>
-#include <isl/mat.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_mat *isl_mat_variable_compression(
-			struct isl_mat *B, struct isl_mat **T2);
-struct isl_mat *isl_mat_parameter_compression(
-			struct isl_mat *B, struct isl_vec *d);
-struct isl_basic_set *isl_basic_set_remove_equalities(
-	struct isl_basic_set *bset, struct isl_mat **T, struct isl_mat **T2);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_factorization.c b/cloog-0.16.3/isl/isl_factorization.c
deleted file mode 100644
index 6acfd73..0000000
--- a/cloog-0.16.3/isl/isl_factorization.c
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- * Copyright 2005-2007 Universiteit Leiden
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, Leiden Institute of Advanced Computer Science,
- * Universiteit Leiden, Niels Bohrweg 1, 2333 CA Leiden, The Netherlands
- * and K.U.Leuven, Departement Computerwetenschappen, Celestijnenlaan 200A,
- * B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France 
- */
-
-#include <isl_map_private.h>
-#include <isl_factorization.h>
-#include <isl_dim_private.h>
-#include <isl_mat_private.h>
-
-static __isl_give isl_factorizer *isl_factorizer_alloc(
-	__isl_take isl_morph *morph, int n_group)
-{
-	isl_factorizer *f = NULL;
-	int *len = NULL;
-
-	if (!morph)
-		return NULL;
-
-	if (n_group > 0) {
-		len = isl_alloc_array(morph->dom->ctx, int, n_group);
-		if (!len)
-			goto error;
-	}
-
-	f = isl_alloc_type(morph->dom->ctx, struct isl_factorizer);
-	if (!f)
-		goto error;
-
-	f->morph = morph;
-	f->n_group = n_group;
-	f->len = len;
-
-	return f;
-error:
-	free(len);
-	isl_morph_free(morph);
-	return NULL;
-}
-
-void isl_factorizer_free(__isl_take isl_factorizer *f)
-{
-	if (!f)
-		return;
-
-	isl_morph_free(f->morph);
-	free(f->len);
-	free(f);
-}
-
-void isl_factorizer_dump(__isl_take isl_factorizer *f, FILE *out)
-{
-	int i;
-
-	if (!f)
-		return;
-
-	isl_morph_dump(f->morph, out);
-	fprintf(out, "[");
-	for (i = 0; i < f->n_group; ++i) {
-		if (i)
-			fprintf(out, ", ");
-		fprintf(out, "%d", f->len[i]);
-	}
-	fprintf(out, "]\n");
-}
-
-__isl_give isl_factorizer *isl_factorizer_identity(__isl_keep isl_basic_set *bset)
-{
-	return isl_factorizer_alloc(isl_morph_identity(bset), 0);
-}
-
-__isl_give isl_factorizer *isl_factorizer_groups(__isl_keep isl_basic_set *bset,
-	__isl_take isl_mat *Q, __isl_take isl_mat *U, int n, int *len)
-{
-	int i;
-	unsigned nvar;
-	unsigned ovar;
-	isl_dim *dim;
-	isl_basic_set *dom;
-	isl_basic_set *ran;
-	isl_morph *morph;
-	isl_factorizer *f;
-	isl_mat *id;
-
-	if (!bset || !Q || !U)
-		goto error;
-
-	ovar = 1 + isl_dim_offset(bset->dim, isl_dim_set);
-	id = isl_mat_identity(bset->ctx, ovar);
-	Q = isl_mat_diagonal(isl_mat_copy(id), Q);
-	U = isl_mat_diagonal(id, U);
-
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-	dim = isl_basic_set_get_dim(bset);
-	dom = isl_basic_set_universe(isl_dim_copy(dim));
-	dim = isl_dim_drop(dim, isl_dim_set, 0, nvar);
-	dim = isl_dim_add(dim, isl_dim_set, nvar);
-	ran = isl_basic_set_universe(dim);
-	morph = isl_morph_alloc(dom, ran, Q, U);
-	f = isl_factorizer_alloc(morph, n);
-	if (!f)
-		return NULL;
-	for (i = 0; i < n; ++i)
-		f->len[i] = len[i];
-	return f;
-error:
-	isl_mat_free(Q);
-	isl_mat_free(U);
-	return NULL;
-}
-
-struct isl_factor_groups {
-	int *pos;		/* for each column: row position of pivot */
-	int *group;		/* group to which a column belongs */
-	int *cnt;		/* number of columns in the group */
-	int *rowgroup;		/* group to which a constraint belongs */
-};
-
-/* Initialize isl_factor_groups structure: find pivot row positions,
- * each column initially belongs to its own group and the groups
- * of the constraints are still unknown.
- */
-static int init_groups(struct isl_factor_groups *g, __isl_keep isl_mat *H)
-{
-	int i, j;
-
-	if (!H)
-		return -1;
-
-	g->pos = isl_alloc_array(H->ctx, int, H->n_col);
-	g->group = isl_alloc_array(H->ctx, int, H->n_col);
-	g->cnt = isl_alloc_array(H->ctx, int, H->n_col);
-	g->rowgroup = isl_alloc_array(H->ctx, int, H->n_row);
-
-	if (!g->pos || !g->group || !g->cnt || !g->rowgroup)
-		return -1;
-
-	for (i = 0; i < H->n_row; ++i)
-		g->rowgroup[i] = -1;
-	for (i = 0, j = 0; i < H->n_col; ++i) {
-		for ( ; j < H->n_row; ++j)
-			if (!isl_int_is_zero(H->row[j][i]))
-				break;
-		g->pos[i] = j;
-	}
-	for (i = 0; i < H->n_col; ++i) {
-		g->group[i] = i;
-		g->cnt[i] = 1;
-	}
-
-	return 0;
-}
-
-/* Update group[k] to the group column k belongs to.
- * When merging two groups, only the group of the current
- * group leader is changed.  Here we change the group of
- * the other members to also point to the group that the
- * old group leader now points to.
- */
-static void update_group(struct isl_factor_groups *g, int k)
-{
-	int p = g->group[k];
-	while (g->cnt[p] == 0)
-		p = g->group[p];
-	g->group[k] = p;
-}
-
-/* Merge group i with all groups of the subsequent columns
- * with non-zero coefficients in row j of H.
- * (The previous columns are all zero; otherwise we would have handled
- * the row before.)
- */
-static int update_group_i_with_row_j(struct isl_factor_groups *g, int i, int j,
-	__isl_keep isl_mat *H)
-{
-	int k;
-
-	g->rowgroup[j] = g->group[i];
-	for (k = i + 1; k < H->n_col && j >= g->pos[k]; ++k) {
-		update_group(g, k);
-		update_group(g, i);
-		if (g->group[k] != g->group[i] &&
-		    !isl_int_is_zero(H->row[j][k])) {
-			isl_assert(H->ctx, g->cnt[g->group[k]] != 0, return -1);
-			isl_assert(H->ctx, g->cnt[g->group[i]] != 0, return -1);
-			if (g->group[i] < g->group[k]) {
-				g->cnt[g->group[i]] += g->cnt[g->group[k]];
-				g->cnt[g->group[k]] = 0;
-				g->group[g->group[k]] = g->group[i];
-			} else {
-				g->cnt[g->group[k]] += g->cnt[g->group[i]];
-				g->cnt[g->group[i]] = 0;
-				g->group[g->group[i]] = g->group[k];
-			}
-		}
-	}
-
-	return 0;
-}
-
-/* Update the group information based on the constraint matrix.
- */
-static int update_groups(struct isl_factor_groups *g, __isl_keep isl_mat *H)
-{
-	int i, j;
-
-	for (i = 0; i < H->n_col && g->cnt[0] < H->n_col; ++i) {
-		if (g->pos[i] == H->n_row)
-			continue; /* A line direction */
-		if (g->rowgroup[g->pos[i]] == -1)
-			g->rowgroup[g->pos[i]] = i;
-		for (j = g->pos[i] + 1; j < H->n_row; ++j) {
-			if (isl_int_is_zero(H->row[j][i]))
-				continue;
-			if (g->rowgroup[j] != -1)
-				continue;
-			if (update_group_i_with_row_j(g, i, j, H) < 0)
-				return -1;
-		}
-	}
-	for (i = 1; i < H->n_col; ++i)
-		update_group(g, i);
-
-	return 0;
-}
-
-static void clear_groups(struct isl_factor_groups *g)
-{
-	if (!g)
-		return;
-	free(g->pos);
-	free(g->group);
-	free(g->cnt);
-	free(g->rowgroup);
-}
-
-/* Determine if the set variables of the basic set can be factorized and
- * return the results in an isl_factorizer.
- *
- * The algorithm works by first computing the Hermite normal form
- * and then grouping columns linked by one or more constraints together,
- * where a constraints "links" two or more columns if the constraint
- * has nonzero coefficients in the columns.
- */
-__isl_give isl_factorizer *isl_basic_set_factorizer(
-	__isl_keep isl_basic_set *bset)
-{
-	int i, j, n, done;
-	isl_mat *H, *U, *Q;
-	unsigned nvar;
-	struct isl_factor_groups g = { 0 };
-	isl_factorizer *f;
-
-	if (!bset)
-		return NULL;
-
-	isl_assert(bset->ctx, isl_basic_set_dim(bset, isl_dim_div) == 0,
-		return NULL);
-
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-	if (nvar <= 1)
-		return isl_factorizer_identity(bset);
-
-	H = isl_mat_alloc(bset->ctx, bset->n_eq + bset->n_ineq, nvar);
-	if (!H)
-		return NULL;
-	isl_mat_sub_copy(bset->ctx, H->row, bset->eq, bset->n_eq,
-		0, 1 + isl_dim_offset(bset->dim, isl_dim_set), nvar);
-	isl_mat_sub_copy(bset->ctx, H->row + bset->n_eq, bset->ineq, bset->n_ineq,
-		0, 1 + isl_dim_offset(bset->dim, isl_dim_set), nvar);
-	H = isl_mat_left_hermite(H, 0, &U, &Q);
-
-	if (init_groups(&g, H) < 0)
-		goto error;
-	if (update_groups(&g, H) < 0)
-		goto error;
-
-	if (g.cnt[0] == nvar) {
-		isl_mat_free(H);
-		isl_mat_free(U);
-		isl_mat_free(Q);
-		clear_groups(&g);
-
-		return isl_factorizer_identity(bset);
-	}
-
-	done = 0;
-	n = 0;
-	while (done != nvar) {
-		int group = g.group[done];
-		for (i = 1; i < g.cnt[group]; ++i) {
-			if (g.group[done + i] == group)
-				continue;
-			for (j = done + g.cnt[group]; j < nvar; ++j)
-				if (g.group[j] == group)
-					break;
-			if (j == nvar)
-				isl_die(bset->ctx, isl_error_internal,
-					"internal error", goto error);
-			g.group[j] = g.group[done + i];
-			Q = isl_mat_swap_rows(Q, done + i, j);
-			U = isl_mat_swap_cols(U, done + i, j);
-		}
-		done += g.cnt[group];
-		g.pos[n++] = g.cnt[group];
-	}
-
-	f = isl_factorizer_groups(bset, Q, U, n, g.pos);
-
-	isl_mat_free(H);
-	clear_groups(&g);
-
-	return f;
-error:
-	isl_mat_free(H);
-	isl_mat_free(U);
-	isl_mat_free(Q);
-	clear_groups(&g);
-	return NULL;
-}
diff --git a/cloog-0.16.3/isl/isl_factorization.h b/cloog-0.16.3/isl/isl_factorization.h
deleted file mode 100644
index f0d3518..0000000
--- a/cloog-0.16.3/isl/isl_factorization.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#include <isl/set.h>
-#include <isl_morph.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/* Data for factorizing a particular basic set.
- * After applying "morph" to the basic set, there are "n_group"
- * groups of consecutive set variables, each of length "len[i]",
- * with 0 <= i < n_group.
- * If no factorization is possible, then "n_group" is set to 0.
- */
-struct isl_factorizer {
-	isl_morph	*morph;
-	int		n_group;
-	int		*len;
-};
-typedef struct isl_factorizer isl_factorizer;
-
-__isl_give isl_factorizer *isl_basic_set_factorizer(
-	__isl_keep isl_basic_set *bset);
-
-void isl_factorizer_free(__isl_take isl_factorizer *f);
-void isl_factorizer_dump(__isl_take isl_factorizer *f, FILE *out);
-
-#if defined(__cplusplus)
-}
-#endif
diff --git a/cloog-0.16.3/isl/isl_farkas.c b/cloog-0.16.3/isl/isl_farkas.c
deleted file mode 100644
index 2dc617e..0000000
--- a/cloog-0.16.3/isl/isl_farkas.c
+++ /dev/null
@@ -1,385 +0,0 @@
-/*
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France 
- */
-
-#include <isl_map_private.h>
-#include <isl/set.h>
-#include <isl_dim_private.h>
-#include <isl/seq.h>
-
-/*
- * Let C be a cone and define
- *
- *	C' := { y | forall x in C : y x >= 0 }
- *
- * C' contains the coefficients of all linear constraints
- * that are valid for C.
- * Furthermore, C'' = C.
- *
- * If C is defined as { x | A x >= 0 }
- * then any element in C' must be a non-negative combination
- * of the rows of A, i.e., y = t A with t >= 0.  That is,
- *
- *	C' = { y | exists t >= 0 : y = t A }
- *
- * If any of the rows in A actually represents an equality, then
- * also negative combinations of this row are allowed and so the
- * non-negativity constraint on the corresponding element of t
- * can be dropped.
- *
- * A polyhedron P = { x | b + A x >= 0 } can be represented
- * in homogeneous coordinates by the cone
- * C = { [z,x] | b z + A x >= and z >= 0 }
- * The valid linear constraints on C correspond to the valid affine
- * constraints on P.
- * This is essentially Farkas' lemma.
- *
- * Let A' = [b A], then, since
- *				  [ 1 0 ]
- *		[ w y ] = [t_0 t] [ b A ]
- *
- * we have
- *
- *	C' = { w, y | exists t_0, t >= 0 : y = t A' and w = t_0 + t b }
- * or
- *
- *	C' = { w, y | exists t >= 0 : y = t A' and w - t b >= 0 }
- *
- * In practice, we introduce an extra variable (w), shifting all
- * other variables to the right, and an extra inequality
- * (w - t b >= 0) corresponding to the positivity constraint on
- * the homogeneous coordinate.
- *
- * When going back from coefficients to solutions, we immediately
- * plug in 1 for z, which corresponds to shifting all variables
- * to the left, with the leftmost ending up in the constant position.
- */
-
-/* Add the given prefix to all named isl_dim_set dimensions in "dim".
- */
-static __isl_give isl_dim *isl_dim_prefix(__isl_take isl_dim *dim,
-	const char *prefix)
-{
-	int i;
-	isl_ctx *ctx;
-	unsigned nvar;
-	size_t prefix_len = strlen(prefix);
-
-	if (!dim)
-		return NULL;
-
-	ctx = isl_dim_get_ctx(dim);
-	nvar = isl_dim_size(dim, isl_dim_set);
-
-	for (i = 0; i < nvar; ++i) {
-		const char *name;
-		char *prefix_name;
-
-		name = isl_dim_get_name(dim, isl_dim_set, i);
-		if (!name)
-			continue;
-
-		prefix_name = isl_alloc_array(ctx, char,
-					      prefix_len + strlen(name) + 1);
-		if (!prefix_name)
-			goto error;
-		memcpy(prefix_name, prefix, prefix_len);
-		strcpy(prefix_name + prefix_len, name);
-
-		dim = isl_dim_set_name(dim, isl_dim_set, i, prefix_name);
-		free(prefix_name);
-	}
-
-	return dim;
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-/* Given a dimension specification of the solutions space, construct
- * a dimension specification for the space of coefficients.
- *
- * In particular transform
- *
- *	[params] -> { S }
- *
- * to
- *
- *	{ coefficients[[cst, params] -> S] }
- *
- * and prefix each dimension name with "c_".
- */
-static __isl_give isl_dim *isl_dim_coefficients(__isl_take isl_dim *dim)
-{
-	isl_dim *dim_param;
-	unsigned nvar;
-	unsigned nparam;
-
-	nvar = isl_dim_size(dim, isl_dim_set);
-	nparam = isl_dim_size(dim, isl_dim_param);
-	dim_param = isl_dim_copy(dim);
-	dim_param = isl_dim_drop(dim_param, isl_dim_set, 0, nvar);
-	dim_param = isl_dim_move(dim_param, isl_dim_set, 0,
-				 isl_dim_param, 0, nparam);
-	dim_param = isl_dim_prefix(dim_param, "c_");
-	dim_param = isl_dim_insert(dim_param, isl_dim_set, 0, 1);
-	dim_param = isl_dim_set_name(dim_param, isl_dim_set, 0, "c_cst");
-	dim = isl_dim_drop(dim, isl_dim_param, 0, nparam);
-	dim = isl_dim_prefix(dim, "c_");
-	dim = isl_dim_join(isl_dim_from_domain(dim_param),
-			   isl_dim_from_range(dim));
-	dim = isl_dim_wrap(dim);
-	dim = isl_dim_set_tuple_name(dim, isl_dim_set, "coefficients");
-
-	return dim;
-}
-
-/* Drop the given prefix from all named dimensions of type "type" in "dim".
- */
-static __isl_give isl_dim *isl_dim_unprefix(__isl_take isl_dim *dim,
-	enum isl_dim_type type, const char *prefix)
-{
-	int i;
-	unsigned n;
-	size_t prefix_len = strlen(prefix);
-
-	n = isl_dim_size(dim, type);
-
-	for (i = 0; i < n; ++i) {
-		const char *name;
-
-		name = isl_dim_get_name(dim, type, i);
-		if (!name)
-			continue;
-		if (strncmp(name, prefix, prefix_len))
-			continue;
-
-		dim = isl_dim_set_name(dim, type, i, name + prefix_len);
-	}
-
-	return dim;
-}
-
-/* Given a dimension specification of the space of coefficients, construct
- * a dimension specification for the space of solutions.
- *
- * In particular transform
- *
- *	{ coefficients[[cst, params] -> S] }
- *
- * to
- *
- *	[params] -> { S }
- *
- * and drop the "c_" prefix from the dimension names.
- */
-static __isl_give isl_dim *isl_dim_solutions(__isl_take isl_dim *dim)
-{
-	unsigned nparam;
-
-	dim = isl_dim_unwrap(dim);
-	dim = isl_dim_drop(dim, isl_dim_in, 0, 1);
-	dim = isl_dim_unprefix(dim, isl_dim_in, "c_");
-	dim = isl_dim_unprefix(dim, isl_dim_out, "c_");
-	nparam = isl_dim_size(dim, isl_dim_in);
-	dim = isl_dim_move(dim, isl_dim_param, 0, isl_dim_in, 0, nparam);
-	dim = isl_dim_range(dim);
-
-	return dim;
-}
-
-/* Compute the dual of "bset" by applying Farkas' lemma.
- * As explained above, we add an extra dimension to represent
- * the coefficient of the constant term when going from solutions
- * to coefficients (shift == 1) and we drop the extra dimension when going
- * in the opposite direction (shift == -1).  "dim" is the space in which
- * the dual should be created.
- */
-static __isl_give isl_basic_set *farkas(__isl_take isl_dim *dim,
-	__isl_take isl_basic_set *bset, int shift)
-{
-	int i, j, k;
-	isl_basic_set *dual = NULL;
-	unsigned total;
-
-	total = isl_basic_set_total_dim(bset);
-
-	dual = isl_basic_set_alloc_dim(dim, bset->n_eq + bset->n_ineq,
-					total, bset->n_ineq + (shift > 0));
-	dual = isl_basic_set_set_rational(dual);
-
-	for (i = 0; i < bset->n_eq + bset->n_ineq; ++i) {
-		k = isl_basic_set_alloc_div(dual);
-		if (k < 0)
-			goto error;
-		isl_int_set_si(dual->div[k][0], 0);
-	}
-
-	for (i = 0; i < total; ++i) {
-		k = isl_basic_set_alloc_equality(dual);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(dual->eq[k], 1 + shift + total);
-		isl_int_set_si(dual->eq[k][1 + shift + i], -1);
-		for (j = 0; j < bset->n_eq; ++j)
-			isl_int_set(dual->eq[k][1 + shift + total + j],
-				    bset->eq[j][1 + i]);
-		for (j = 0; j < bset->n_ineq; ++j)
-			isl_int_set(dual->eq[k][1 + shift + total + bset->n_eq + j],
-				    bset->ineq[j][1 + i]);
-	}
-
-	for (i = 0; i < bset->n_ineq; ++i) {
-		k = isl_basic_set_alloc_inequality(dual);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(dual->ineq[k],
-			    1 + shift + total + bset->n_eq + bset->n_ineq);
-		isl_int_set_si(dual->ineq[k][1 + shift + total + bset->n_eq + i], 1);
-	}
-
-	if (shift > 0) {
-		k = isl_basic_set_alloc_inequality(dual);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(dual->ineq[k], 2 + total);
-		isl_int_set_si(dual->ineq[k][1], 1);
-		for (j = 0; j < bset->n_eq; ++j)
-			isl_int_neg(dual->ineq[k][2 + total + j],
-				    bset->eq[j][0]);
-		for (j = 0; j < bset->n_ineq; ++j)
-			isl_int_neg(dual->ineq[k][2 + total + bset->n_eq + j],
-				    bset->ineq[j][0]);
-	}
-
-	dual = isl_basic_set_remove_divs(dual);
-	isl_basic_set_simplify(dual);
-	isl_basic_set_finalize(dual);
-
-	isl_basic_set_free(bset);
-	return dual;
-error:
-	isl_basic_set_free(bset);
-	isl_basic_set_free(dual);
-	return NULL;
-}
-
-/* Construct a basic set containing the tuples of coefficients of all
- * valid affine constraints on the given basic set.
- */
-__isl_give isl_basic_set *isl_basic_set_coefficients(
-	__isl_take isl_basic_set *bset)
-{
-	isl_dim *dim;
-
-	if (!bset)
-		return NULL;
-	if (bset->n_div)
-		isl_die(bset->ctx, isl_error_invalid,
-			"input set not allowed to have local variables",
-			goto error);
-
-	dim = isl_basic_set_get_dim(bset);
-	dim = isl_dim_coefficients(dim);
-
-	return farkas(dim, bset, 1);
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Construct a basic set containing the elements that satisfy all
- * affine constraints whose coefficient tuples are
- * contained in the given basic set.
- */
-__isl_give isl_basic_set *isl_basic_set_solutions(
-	__isl_take isl_basic_set *bset)
-{
-	isl_dim *dim;
-
-	if (!bset)
-		return NULL;
-	if (bset->n_div)
-		isl_die(bset->ctx, isl_error_invalid,
-			"input set not allowed to have local variables",
-			goto error);
-
-	dim = isl_basic_set_get_dim(bset);
-	dim = isl_dim_solutions(dim);
-
-	return farkas(dim, bset, -1);
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Construct a basic set containing the tuples of coefficients of all
- * valid affine constraints on the given set.
- */
-__isl_give isl_basic_set *isl_set_coefficients(__isl_take isl_set *set)
-{
-	int i;
-	isl_basic_set *coeff;
-
-	if (!set)
-		return NULL;
-	if (set->n == 0) {
-		isl_dim *dim = isl_set_get_dim(set);
-		dim = isl_dim_coefficients(dim);
-		coeff = isl_basic_set_universe(dim);
-		coeff = isl_basic_set_set_rational(coeff);
-		isl_set_free(set);
-		return coeff;
-	}
-
-	coeff = isl_basic_set_coefficients(isl_basic_set_copy(set->p[0]));
-
-	for (i = 1; i < set->n; ++i) {
-		isl_basic_set *bset, *coeff_i;
-		bset = isl_basic_set_copy(set->p[i]);
-		coeff_i = isl_basic_set_coefficients(bset);
-		coeff = isl_basic_set_intersect(coeff, coeff_i);
-	}
-
-	isl_set_free(set);
-	return coeff;
-}
-
-/* Construct a basic set containing the elements that satisfy all
- * affine constraints whose coefficient tuples are
- * contained in the given set.
- */
-__isl_give isl_basic_set *isl_set_solutions(__isl_take isl_set *set)
-{
-	int i;
-	isl_basic_set *sol;
-
-	if (!set)
-		return NULL;
-	if (set->n == 0) {
-		isl_dim *dim = isl_set_get_dim(set);
-		dim = isl_dim_solutions(dim);
-		sol = isl_basic_set_universe(dim);
-		sol = isl_basic_set_set_rational(sol);
-		isl_set_free(set);
-		return sol;
-	}
-
-	sol = isl_basic_set_solutions(isl_basic_set_copy(set->p[0]));
-
-	for (i = 1; i < set->n; ++i) {
-		isl_basic_set *bset, *sol_i;
-		bset = isl_basic_set_copy(set->p[i]);
-		sol_i = isl_basic_set_solutions(bset);
-		sol = isl_basic_set_intersect(sol, sol_i);
-	}
-
-	isl_set_free(set);
-	return sol;
-}
diff --git a/cloog-0.16.3/isl/isl_flow.c b/cloog-0.16.3/isl/isl_flow.c
deleted file mode 100644
index 128aee5..0000000
--- a/cloog-0.16.3/isl/isl_flow.c
+++ /dev/null
@@ -1,1304 +0,0 @@
-/*
- * Copyright 2005-2007 Universiteit Leiden
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, Leiden Institute of Advanced Computer Science,
- * Universiteit Leiden, Niels Bohrweg 1, 2333 CA Leiden, The Netherlands
- * and K.U.Leuven, Departement Computerwetenschappen, Celestijnenlaan 200A,
- * B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France 
- */
-
-#include <isl/set.h>
-#include <isl/map.h>
-#include <isl/flow.h>
-
-/* A private structure to keep track of a mapping together with
- * a user-specified identifier and a boolean indicating whether
- * the map represents a must or may access/dependence.
- */
-struct isl_labeled_map {
-	struct isl_map	*map;
-	void		*data;
-	int		must;
-};
-
-/* A structure containing the input for dependence analysis:
- * - a sink
- * - n_must + n_may (<= max_source) sources
- * - a function for determining the relative order of sources and sink
- * The must sources are placed before the may sources.
- */
-struct isl_access_info {
-	struct isl_labeled_map	sink;
-	isl_access_level_before	level_before;
-	int		    	max_source;
-	int		    	n_must;
-	int		    	n_may;
-	struct isl_labeled_map	source[1];
-};
-
-/* A structure containing the output of dependence analysis:
- * - n_source dependences
- * - a wrapped subset of the sink for which definitely no source could be found
- * - a wrapped subset of the sink for which possibly no source could be found
- */
-struct isl_flow {
-	isl_set			*must_no_source;
-	isl_set			*may_no_source;
-	int			n_source;
-	struct isl_labeled_map	*dep;
-};
-
-/* Construct an isl_access_info structure and fill it up with
- * the given data.  The number of sources is set to 0.
- */
-__isl_give isl_access_info *isl_access_info_alloc(__isl_take isl_map *sink,
-	void *sink_user, isl_access_level_before fn, int max_source)
-{
-	isl_ctx *ctx;
-	struct isl_access_info *acc;
-
-	if (!sink)
-		return NULL;
-
-	ctx = isl_map_get_ctx(sink);
-	isl_assert(ctx, max_source >= 0, goto error);
-
-	acc = isl_alloc(ctx, struct isl_access_info,
-			sizeof(struct isl_access_info) +
-			(max_source - 1) * sizeof(struct isl_labeled_map));
-	if (!acc)
-		goto error;
-
-	acc->sink.map = sink;
-	acc->sink.data = sink_user;
-	acc->level_before = fn;
-	acc->max_source = max_source;
-	acc->n_must = 0;
-	acc->n_may = 0;
-
-	return acc;
-error:
-	isl_map_free(sink);
-	return NULL;
-}
-
-/* Free the given isl_access_info structure.
- */
-void isl_access_info_free(__isl_take isl_access_info *acc)
-{
-	int i;
-
-	if (!acc)
-		return;
-	isl_map_free(acc->sink.map);
-	for (i = 0; i < acc->n_must + acc->n_may; ++i)
-		isl_map_free(acc->source[i].map);
-	free(acc);
-}
-
-isl_ctx *isl_access_info_get_ctx(__isl_keep isl_access_info *acc)
-{
-	return acc ? isl_map_get_ctx(acc->sink.map) : NULL;
-}
-
-/* Add another source to an isl_access_info structure, making
- * sure the "must" sources are placed before the "may" sources.
- * This function may be called at most max_source times on a
- * given isl_access_info structure, with max_source as specified
- * in the call to isl_access_info_alloc that constructed the structure.
- */
-__isl_give isl_access_info *isl_access_info_add_source(
-	__isl_take isl_access_info *acc, __isl_take isl_map *source,
-	int must, void *source_user)
-{
-	isl_ctx *ctx;
-
-	if (!acc)
-		return NULL;
-	ctx = isl_map_get_ctx(acc->sink.map);
-	isl_assert(ctx, acc->n_must + acc->n_may < acc->max_source, goto error);
-	
-	if (must) {
-		if (acc->n_may)
-			acc->source[acc->n_must + acc->n_may] =
-				acc->source[acc->n_must];
-		acc->source[acc->n_must].map = source;
-		acc->source[acc->n_must].data = source_user;
-		acc->source[acc->n_must].must = 1;
-		acc->n_must++;
-	} else {
-		acc->source[acc->n_must + acc->n_may].map = source;
-		acc->source[acc->n_must + acc->n_may].data = source_user;
-		acc->source[acc->n_must + acc->n_may].must = 0;
-		acc->n_may++;
-	}
-
-	return acc;
-error:
-	isl_map_free(source);
-	isl_access_info_free(acc);
-	return NULL;
-}
-
-/* A temporary structure used while sorting the accesses in an isl_access_info.
- */
-struct isl_access_sort_info {
-	struct isl_map		*source_map;
-	void			*source_data;
-	struct isl_access_info	*acc;
-};
-
-/* Return -n, 0 or n (with n a positive value), depending on whether
- * the source access identified by p1 should be sorted before, together
- * or after that identified by p2.
- *
- * If p1 and p2 share a different number of levels with the sink,
- * then the one with the lowest number of shared levels should be
- * sorted first.
- * If they both share no levels, then the order is irrelevant.
- * Otherwise, if p1 appears before p2, then it should be sorted first.
- * For more generic initial schedules, it is possible that neither
- * p1 nor p2 appears before the other, or at least not in any obvious way.
- * We therefore also check if p2 appears before p1, in which case p2
- * should be sorted first.
- * If not, we try to order the two statements based on the description
- * of the iteration domains.  This results in an arbitrary, but fairly
- * stable ordering.
- */
-static int access_sort_cmp(const void *p1, const void *p2)
-{
-	const struct isl_access_sort_info *i1, *i2;
-	int level1, level2;
-	uint32_t h1, h2;
-	i1 = (const struct isl_access_sort_info *) p1;
-	i2 = (const struct isl_access_sort_info *) p2;
-
-	level1 = i1->acc->level_before(i1->source_data, i1->acc->sink.data);
-	level2 = i2->acc->level_before(i2->source_data, i2->acc->sink.data);
-
-	if (level1 != level2 || !level1)
-		return level1 - level2;
-
-	level1 = i1->acc->level_before(i1->source_data, i2->source_data);
-	if (level1 % 2)
-		return -1;
-
-	level2 = i1->acc->level_before(i2->source_data, i1->source_data);
-	if (level2 % 2)
-		return 1;
-
-	h1 = isl_map_get_hash(i1->source_map);
-	h2 = isl_map_get_hash(i2->source_map);
-	return h1 > h2 ? 1 : h1 < h2 ? -1 : 0;
-}
-
-/* Sort the must source accesses in order of increasing number of shared
- * levels with the sink access.
- * Source accesses with the same number of shared levels are sorted
- * in their textual order.
- */
-static __isl_give isl_access_info *isl_access_info_sort_sources(
-	__isl_take isl_access_info *acc)
-{
-	int i;
-	isl_ctx *ctx;
-	struct isl_access_sort_info *array;
-
-	if (!acc)
-		return NULL;
-	if (acc->n_must <= 1)
-		return acc;
-
-	ctx = isl_map_get_ctx(acc->sink.map);
-	array = isl_alloc_array(ctx, struct isl_access_sort_info, acc->n_must);
-	if (!array)
-		goto error;
-
-	for (i = 0; i < acc->n_must; ++i) {
-		array[i].source_map = acc->source[i].map;
-		array[i].source_data = acc->source[i].data;
-		array[i].acc = acc;
-	}
-
-	qsort(array, acc->n_must, sizeof(struct isl_access_sort_info),
-		access_sort_cmp);
-
-	for (i = 0; i < acc->n_must; ++i) {
-		acc->source[i].map = array[i].source_map;
-		acc->source[i].data = array[i].source_data;
-	}
-
-	free(array);
-
-	return acc;
-error:
-	isl_access_info_free(acc);
-	return NULL;
-}
-
-/* Initialize an empty isl_flow structure corresponding to a given
- * isl_access_info structure.
- * For each must access, two dependences are created (initialized
- * to the empty relation), one for the resulting must dependences
- * and one for the resulting may dependences.  May accesses can
- * only lead to may dependences, so only one dependence is created
- * for each of them.
- * This function is private as isl_flow structures are only supposed
- * to be created by isl_access_info_compute_flow.
- */
-static __isl_give isl_flow *isl_flow_alloc(__isl_keep isl_access_info *acc)
-{
-	int i;
-	struct isl_ctx *ctx;
-	struct isl_flow *dep;
-
-	if (!acc)
-		return NULL;
-
-	ctx = isl_map_get_ctx(acc->sink.map);
-	dep = isl_calloc_type(ctx, struct isl_flow);
-	if (!dep)
-		return NULL;
-
-	dep->dep = isl_calloc_array(ctx, struct isl_labeled_map,
-					2 * acc->n_must + acc->n_may);
-	if (!dep->dep)
-		goto error;
-
-	dep->n_source = 2 * acc->n_must + acc->n_may;
-	for (i = 0; i < acc->n_must; ++i) {
-		struct isl_dim *dim;
-		dim = isl_dim_join(isl_map_get_dim(acc->source[i].map),
-			    isl_dim_reverse(isl_map_get_dim(acc->sink.map)));
-		dep->dep[2 * i].map = isl_map_empty(dim);
-		dep->dep[2 * i + 1].map = isl_map_copy(dep->dep[2 * i].map);
-		dep->dep[2 * i].data = acc->source[i].data;
-		dep->dep[2 * i + 1].data = acc->source[i].data;
-		dep->dep[2 * i].must = 1;
-		dep->dep[2 * i + 1].must = 0;
-		if (!dep->dep[2 * i].map || !dep->dep[2 * i + 1].map)
-			goto error;
-	}
-	for (i = acc->n_must; i < acc->n_must + acc->n_may; ++i) {
-		struct isl_dim *dim;
-		dim = isl_dim_join(isl_map_get_dim(acc->source[i].map),
-			    isl_dim_reverse(isl_map_get_dim(acc->sink.map)));
-		dep->dep[acc->n_must + i].map = isl_map_empty(dim);
-		dep->dep[acc->n_must + i].data = acc->source[i].data;
-		dep->dep[acc->n_must + i].must = 0;
-		if (!dep->dep[acc->n_must + i].map)
-			goto error;
-	}
-
-	return dep;
-error:
-	isl_flow_free(dep);
-	return NULL;
-}
-
-/* Iterate over all sources and for each resulting flow dependence
- * that is not empty, call the user specfied function.
- * The second argument in this function call identifies the source,
- * while the third argument correspond to the final argument of
- * the isl_flow_foreach call.
- */
-int isl_flow_foreach(__isl_keep isl_flow *deps,
-	int (*fn)(__isl_take isl_map *dep, int must, void *dep_user, void *user),
-	void *user)
-{
-	int i;
-
-	if (!deps)
-		return -1;
-
-	for (i = 0; i < deps->n_source; ++i) {
-		if (isl_map_plain_is_empty(deps->dep[i].map))
-			continue;
-		if (fn(isl_map_copy(deps->dep[i].map), deps->dep[i].must,
-				deps->dep[i].data, user) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-/* Return a copy of the subset of the sink for which no source could be found.
- */
-__isl_give isl_map *isl_flow_get_no_source(__isl_keep isl_flow *deps, int must)
-{
-	if (!deps)
-		return NULL;
-	
-	if (must)
-		return isl_set_unwrap(isl_set_copy(deps->must_no_source));
-	else
-		return isl_set_unwrap(isl_set_copy(deps->may_no_source));
-}
-
-void isl_flow_free(__isl_take isl_flow *deps)
-{
-	int i;
-
-	if (!deps)
-		return;
-	isl_set_free(deps->must_no_source);
-	isl_set_free(deps->may_no_source);
-	if (deps->dep) {
-		for (i = 0; i < deps->n_source; ++i)
-			isl_map_free(deps->dep[i].map);
-		free(deps->dep);
-	}
-	free(deps);
-}
-
-isl_ctx *isl_flow_get_ctx(__isl_keep isl_flow *deps)
-{
-	return deps ? isl_set_get_ctx(deps->must_no_source) : NULL;
-}
-
-/* Return a map that enforces that the domain iteration occurs after
- * the range iteration at the given level.
- * If level is odd, then the domain iteration should occur after
- * the target iteration in their shared level/2 outermost loops.
- * In this case we simply need to enforce that these outermost
- * loop iterations are the same.
- * If level is even, then the loop iterator of the domain should
- * be greater than the loop iterator of the range at the last
- * of the level/2 shared loops, i.e., loop level/2 - 1.
- */
-static __isl_give isl_map *after_at_level(struct isl_dim *dim, int level)
-{
-	struct isl_basic_map *bmap;
-
-	if (level % 2)
-		bmap = isl_basic_map_equal(dim, level/2);
-	else
-		bmap = isl_basic_map_more_at(dim, level/2 - 1);
-
-	return isl_map_from_basic_map(bmap);
-}
-
-/* Compute the last iteration of must source j that precedes the sink
- * at the given level for sink iterations in set_C.
- * The subset of set_C for which no such iteration can be found is returned
- * in *empty.
- */
-static struct isl_map *last_source(struct isl_access_info *acc, 
-				    struct isl_set *set_C,
-				    int j, int level, struct isl_set **empty)
-{
-	struct isl_map *read_map;
-	struct isl_map *write_map;
-	struct isl_map *dep_map;
-	struct isl_map *after;
-	struct isl_map *result;
-
-	read_map = isl_map_copy(acc->sink.map);
-	write_map = isl_map_copy(acc->source[j].map);
-	write_map = isl_map_reverse(write_map);
-	dep_map = isl_map_apply_range(read_map, write_map);
-	after = after_at_level(isl_map_get_dim(dep_map), level);
-	dep_map = isl_map_intersect(dep_map, after);
-	result = isl_map_partial_lexmax(dep_map, set_C, empty);
-	result = isl_map_reverse(result);
-
-	return result;
-}
-
-/* For a given mapping between iterations of must source j and iterations
- * of the sink, compute the last iteration of must source k preceding
- * the sink at level before_level for any of the sink iterations,
- * but following the corresponding iteration of must source j at level
- * after_level.
- */
-static struct isl_map *last_later_source(struct isl_access_info *acc,
-					 struct isl_map *old_map,
-					 int j, int before_level,
-					 int k, int after_level,
-					 struct isl_set **empty)
-{
-	struct isl_dim *dim;
-	struct isl_set *set_C;
-	struct isl_map *read_map;
-	struct isl_map *write_map;
-	struct isl_map *dep_map;
-	struct isl_map *after_write;
-	struct isl_map *before_read;
-	struct isl_map *result;
-
-	set_C = isl_map_range(isl_map_copy(old_map));
-	read_map = isl_map_copy(acc->sink.map);
-	write_map = isl_map_copy(acc->source[k].map);
-
-	write_map = isl_map_reverse(write_map);
-	dep_map = isl_map_apply_range(read_map, write_map);
-	dim = isl_dim_join(isl_map_get_dim(acc->source[k].map),
-		    isl_dim_reverse(isl_map_get_dim(acc->source[j].map)));
-	after_write = after_at_level(dim, after_level);
-	after_write = isl_map_apply_range(after_write, old_map);
-	after_write = isl_map_reverse(after_write);
-	dep_map = isl_map_intersect(dep_map, after_write);
-	before_read = after_at_level(isl_map_get_dim(dep_map), before_level);
-	dep_map = isl_map_intersect(dep_map, before_read);
-	result = isl_map_partial_lexmax(dep_map, set_C, empty);
-	result = isl_map_reverse(result);
-
-	return result;
-}
-
-/* Given a shared_level between two accesses, return 1 if the
- * the first can precede the second at the requested target_level.
- * If the target level is odd, i.e., refers to a statement level
- * dimension, then first needs to precede second at the requested
- * level, i.e., shared_level must be equal to target_level.
- * If the target level is odd, then the two loops should share
- * at least the requested number of outer loops.
- */
-static int can_precede_at_level(int shared_level, int target_level)
-{
-	if (shared_level < target_level)
-		return 0;
-	if ((target_level % 2) && shared_level > target_level)
-		return 0;
-	return 1;
-}
-
-/* Given a possible flow dependence temp_rel[j] between source j and the sink
- * at level sink_level, remove those elements for which
- * there is an iteration of another source k < j that is closer to the sink.
- * The flow dependences temp_rel[k] are updated with the improved sources.
- * Any improved source needs to precede the sink at the same level
- * and needs to follow source j at the same or a deeper level.
- * The lower this level, the later the execution date of source k.
- * We therefore consider lower levels first.
- *
- * If temp_rel[j] is empty, then there can be no improvement and
- * we return immediately.
- */
-static int intermediate_sources(__isl_keep isl_access_info *acc,
-	struct isl_map **temp_rel, int j, int sink_level)
-{
-	int k, level;
-	int depth = 2 * isl_map_dim(acc->source[j].map, isl_dim_in) + 1;
-
-	if (isl_map_plain_is_empty(temp_rel[j]))
-		return 0;
-
-	for (k = j - 1; k >= 0; --k) {
-		int plevel, plevel2;
-		plevel = acc->level_before(acc->source[k].data, acc->sink.data);
-		if (!can_precede_at_level(plevel, sink_level))
-			continue;
-
-		plevel2 = acc->level_before(acc->source[j].data,
-						acc->source[k].data);
-
-		for (level = sink_level; level <= depth; ++level) {
-			struct isl_map *T;
-			struct isl_set *trest;
-			struct isl_map *copy;
-
-			if (!can_precede_at_level(plevel2, level))
-				continue;
-
-			copy = isl_map_copy(temp_rel[j]);
-			T = last_later_source(acc, copy, j, sink_level, k,
-					      level, &trest);
-			if (isl_map_plain_is_empty(T)) {
-				isl_set_free(trest);
-				isl_map_free(T);
-				continue;
-			}
-			temp_rel[j] = isl_map_intersect_range(temp_rel[j], trest);
-			temp_rel[k] = isl_map_union_disjoint(temp_rel[k], T);
-		}
-	}
-
-	return 0;
-}
-
-/* Compute all iterations of may source j that precedes the sink at the given
- * level for sink iterations in set_C.
- */
-static __isl_give isl_map *all_sources(__isl_keep isl_access_info *acc,
-				    __isl_take isl_set *set_C, int j, int level)
-{
-	isl_map *read_map;
-	isl_map *write_map;
-	isl_map *dep_map;
-	isl_map *after;
-
-	read_map = isl_map_copy(acc->sink.map);
-	read_map = isl_map_intersect_domain(read_map, set_C);
-	write_map = isl_map_copy(acc->source[acc->n_must + j].map);
-	write_map = isl_map_reverse(write_map);
-	dep_map = isl_map_apply_range(read_map, write_map);
-	after = after_at_level(isl_map_get_dim(dep_map), level);
-	dep_map = isl_map_intersect(dep_map, after);
-
-	return isl_map_reverse(dep_map);
-}
-
-/* For a given mapping between iterations of must source k and iterations
- * of the sink, compute the all iteration of may source j preceding
- * the sink at level before_level for any of the sink iterations,
- * but following the corresponding iteration of must source k at level
- * after_level.
- */
-static __isl_give isl_map *all_later_sources(__isl_keep isl_access_info *acc,
-	__isl_keep isl_map *old_map,
-	int j, int before_level, int k, int after_level)
-{
-	isl_dim *dim;
-	isl_set *set_C;
-	isl_map *read_map;
-	isl_map *write_map;
-	isl_map *dep_map;
-	isl_map *after_write;
-	isl_map *before_read;
-
-	set_C = isl_map_range(isl_map_copy(old_map));
-	read_map = isl_map_copy(acc->sink.map);
-	read_map = isl_map_intersect_domain(read_map, set_C);
-	write_map = isl_map_copy(acc->source[acc->n_must + j].map);
-
-	write_map = isl_map_reverse(write_map);
-	dep_map = isl_map_apply_range(read_map, write_map);
-	dim = isl_dim_join(isl_map_get_dim(acc->source[acc->n_must + j].map),
-		    isl_dim_reverse(isl_map_get_dim(acc->source[k].map)));
-	after_write = after_at_level(dim, after_level);
-	after_write = isl_map_apply_range(after_write, old_map);
-	after_write = isl_map_reverse(after_write);
-	dep_map = isl_map_intersect(dep_map, after_write);
-	before_read = after_at_level(isl_map_get_dim(dep_map), before_level);
-	dep_map = isl_map_intersect(dep_map, before_read);
-	return isl_map_reverse(dep_map);
-}
-
-/* Given the must and may dependence relations for the must accesses
- * for level sink_level, check if there are any accesses of may access j
- * that occur in between and return their union.
- * If some of these accesses are intermediate with respect to
- * (previously thought to be) must dependences, then these
- * must dependences are turned into may dependences.
- */
-static __isl_give isl_map *all_intermediate_sources(
-	__isl_keep isl_access_info *acc, __isl_take isl_map *map,
-	struct isl_map **must_rel, struct isl_map **may_rel,
-	int j, int sink_level)
-{
-	int k, level;
-	int depth = 2 * isl_map_dim(acc->source[acc->n_must + j].map,
-					isl_dim_in) + 1;
-
-	for (k = 0; k < acc->n_must; ++k) {
-		int plevel;
-
-		if (isl_map_plain_is_empty(may_rel[k]) &&
-		    isl_map_plain_is_empty(must_rel[k]))
-			continue;
-
-		plevel = acc->level_before(acc->source[k].data,
-					acc->source[acc->n_must + j].data);
-
-		for (level = sink_level; level <= depth; ++level) {
-			isl_map *T;
-			isl_map *copy;
-			isl_set *ran;
-
-			if (!can_precede_at_level(plevel, level))
-				continue;
-
-			copy = isl_map_copy(may_rel[k]);
-			T = all_later_sources(acc, copy, j, sink_level, k, level);
-			map = isl_map_union(map, T);
-
-			copy = isl_map_copy(must_rel[k]);
-			T = all_later_sources(acc, copy, j, sink_level, k, level);
-			ran = isl_map_range(isl_map_copy(T));
-			map = isl_map_union(map, T);
-			may_rel[k] = isl_map_union_disjoint(may_rel[k],
-			    isl_map_intersect_range(isl_map_copy(must_rel[k]),
-						    isl_set_copy(ran)));
-			T = isl_map_from_domain_and_range(
-			    isl_set_universe(
-				isl_dim_domain(isl_map_get_dim(must_rel[k]))),
-			    ran);
-			must_rel[k] = isl_map_subtract(must_rel[k], T);
-		}
-	}
-
-	return map;
-}
-
-/* Compute dependences for the case where all accesses are "may"
- * accesses, which boils down to computing memory based dependences.
- * The generic algorithm would also work in this case, but it would
- * be overkill to use it.
- */
-static __isl_give isl_flow *compute_mem_based_dependences(
-	__isl_take isl_access_info *acc)
-{
-	int i;
-	isl_set *mustdo;
-	isl_set *maydo;
-	isl_flow *res;
-
-	res = isl_flow_alloc(acc);
-	if (!res)
-		goto error;
-
-	mustdo = isl_map_domain(isl_map_copy(acc->sink.map));
-	maydo = isl_set_copy(mustdo);
-
-	for (i = 0; i < acc->n_may; ++i) {
-		int plevel;
-		int is_before;
-		isl_dim *dim;
-		isl_map *before;
-		isl_map *dep;
-
-		plevel = acc->level_before(acc->source[i].data, acc->sink.data);
-		is_before = plevel & 1;
-		plevel >>= 1;
-
-		dim = isl_map_get_dim(res->dep[i].map);
-		if (is_before)
-			before = isl_map_lex_le_first(dim, plevel);
-		else
-			before = isl_map_lex_lt_first(dim, plevel);
-		dep = isl_map_apply_range(isl_map_copy(acc->source[i].map),
-			isl_map_reverse(isl_map_copy(acc->sink.map)));
-		dep = isl_map_intersect(dep, before);
-		mustdo = isl_set_subtract(mustdo,
-					    isl_map_range(isl_map_copy(dep)));
-		res->dep[i].map = isl_map_union(res->dep[i].map, dep);
-	}
-
-	res->may_no_source = isl_set_subtract(maydo, isl_set_copy(mustdo));
-	res->must_no_source = mustdo;
-
-	isl_access_info_free(acc);
-
-	return res;
-error:
-	isl_access_info_free(acc);
-	return NULL;
-}
-
-/* Compute dependences for the case where there is at least one
- * "must" access.
- *
- * The core algorithm considers all levels in which a source may precede
- * the sink, where a level may either be a statement level or a loop level.
- * The outermost statement level is 1, the first loop level is 2, etc...
- * The algorithm basically does the following:
- * for all levels l of the read access from innermost to outermost
- *	for all sources w that may precede the sink access at that level
- *	    compute the last iteration of the source that precedes the sink access
- *					    at that level
- *	    add result to possible last accesses at level l of source w
- *	    for all sources w2 that we haven't considered yet at this level that may
- *					    also precede the sink access
- *		for all levels l2 of w from l to innermost
- *		    for all possible last accesses dep of w at l
- *			compute last iteration of w2 between the source and sink
- *								of dep
- *			add result to possible last accesses at level l of write w2
- *			and replace possible last accesses dep by the remainder
- *
- *
- * The above algorithm is applied to the must access.  During the course
- * of the algorithm, we keep track of sink iterations that still
- * need to be considered.  These iterations are split into those that
- * haven't been matched to any source access (mustdo) and those that have only
- * been matched to may accesses (maydo).
- * At the end of each level, we also consider the may accesses.
- * In particular, we consider may accesses that precede the remaining
- * sink iterations, moving elements from mustdo to maydo when appropriate,
- * and may accesses that occur between a must source and a sink of any 
- * dependences found at the current level, turning must dependences into
- * may dependences when appropriate.
- * 
- */
-static __isl_give isl_flow *compute_val_based_dependences(
-	__isl_take isl_access_info *acc)
-{
-	isl_ctx *ctx;
-	isl_flow *res;
-	isl_set *mustdo = NULL;
-	isl_set *maydo = NULL;
-	int level, j;
-	int depth;
-	isl_map **must_rel = NULL;
-	isl_map **may_rel = NULL;
-
-	acc = isl_access_info_sort_sources(acc);
-	if (!acc)
-		return NULL;
-
-	res = isl_flow_alloc(acc);
-	if (!res)
-		goto error;
-	ctx = isl_map_get_ctx(acc->sink.map);
-
-	depth = 2 * isl_map_dim(acc->sink.map, isl_dim_in) + 1;
-	mustdo = isl_map_domain(isl_map_copy(acc->sink.map));
-	maydo = isl_set_empty_like(mustdo);
-	if (!mustdo || !maydo)
-		goto error;
-	if (isl_set_plain_is_empty(mustdo))
-		goto done;
-
-	must_rel = isl_alloc_array(ctx, struct isl_map *, acc->n_must);
-	may_rel = isl_alloc_array(ctx, struct isl_map *, acc->n_must);
-	if (!must_rel || !may_rel)
-		goto error;
-
-	for (level = depth; level >= 1; --level) {
-		for (j = acc->n_must-1; j >=0; --j) {
-			must_rel[j] = isl_map_empty_like(res->dep[j].map);
-			may_rel[j] = isl_map_copy(must_rel[j]);
-		}
-
-		for (j = acc->n_must - 1; j >= 0; --j) {
-			struct isl_map *T;
-			struct isl_set *rest;
-			int plevel;
-
-			plevel = acc->level_before(acc->source[j].data,
-						     acc->sink.data);
-			if (!can_precede_at_level(plevel, level))
-				continue;
-
-			T = last_source(acc, mustdo, j, level, &rest);
-			must_rel[j] = isl_map_union_disjoint(must_rel[j], T);
-			mustdo = rest;
-
-			intermediate_sources(acc, must_rel, j, level);
-
-			T = last_source(acc, maydo, j, level, &rest);
-			may_rel[j] = isl_map_union_disjoint(may_rel[j], T);
-			maydo = rest;
-
-			intermediate_sources(acc, may_rel, j, level);
-
-			if (isl_set_plain_is_empty(mustdo) &&
-			    isl_set_plain_is_empty(maydo))
-				break;
-		}
-		for (j = j - 1; j >= 0; --j) {
-			int plevel;
-
-			plevel = acc->level_before(acc->source[j].data,
-						     acc->sink.data);
-			if (!can_precede_at_level(plevel, level))
-				continue;
-
-			intermediate_sources(acc, must_rel, j, level);
-			intermediate_sources(acc, may_rel, j, level);
-		}
-
-		for (j = 0; j < acc->n_may; ++j) {
-			int plevel;
-			isl_map *T;
-			isl_set *ran;
-
-			plevel = acc->level_before(acc->source[acc->n_must + j].data,
-						     acc->sink.data);
-			if (!can_precede_at_level(plevel, level))
-				continue;
-
-			T = all_sources(acc, isl_set_copy(maydo), j, level);
-			res->dep[2 * acc->n_must + j].map =
-			    isl_map_union(res->dep[2 * acc->n_must + j].map, T);
-			T = all_sources(acc, isl_set_copy(mustdo), j, level);
-			ran = isl_map_range(isl_map_copy(T));
-			res->dep[2 * acc->n_must + j].map =
-			    isl_map_union(res->dep[2 * acc->n_must + j].map, T);
-			mustdo = isl_set_subtract(mustdo, isl_set_copy(ran));
-			maydo = isl_set_union_disjoint(maydo, ran);
-
-			T = res->dep[2 * acc->n_must + j].map;
-			T = all_intermediate_sources(acc, T, must_rel, may_rel,
-							j, level);
-			res->dep[2 * acc->n_must + j].map = T;
-		}
-
-		for (j = acc->n_must - 1; j >= 0; --j) {
-			res->dep[2 * j].map =
-				isl_map_union_disjoint(res->dep[2 * j].map,
-							     must_rel[j]);
-			res->dep[2 * j + 1].map =
-				isl_map_union_disjoint(res->dep[2 * j + 1].map,
-							     may_rel[j]);
-		}
-
-		if (isl_set_plain_is_empty(mustdo) &&
-		    isl_set_plain_is_empty(maydo))
-			break;
-	}
-
-	free(must_rel);
-	free(may_rel);
-done:
-	res->must_no_source = mustdo;
-	res->may_no_source = maydo;
-	isl_access_info_free(acc);
-	return res;
-error:
-	isl_access_info_free(acc);
-	isl_flow_free(res);
-	isl_set_free(mustdo);
-	isl_set_free(maydo);
-	free(must_rel);
-	free(may_rel);
-	return NULL;
-}
-
-/* Given a "sink" access, a list of n "source" accesses,
- * compute for each iteration of the sink access
- * and for each element accessed by that iteration,
- * the source access in the list that last accessed the
- * element accessed by the sink access before this sink access.
- * Each access is given as a map from the loop iterators
- * to the array indices.
- * The result is a list of n relations between source and sink
- * iterations and a subset of the domain of the sink access,
- * corresponding to those iterations that access an element
- * not previously accessed.
- *
- * To deal with multi-valued sink access relations, the sink iteration
- * domain is first extended with dimensions that correspond to the data
- * space.  After the computation is finished, these extra dimensions are
- * projected out again.
- */
-__isl_give isl_flow *isl_access_info_compute_flow(__isl_take isl_access_info *acc)
-{
-	int j;
-	struct isl_flow *res;
-	isl_map *domain_map = NULL;
-
-	if (!acc)
-		return NULL;
-
-	domain_map = isl_map_domain_map(isl_map_copy(acc->sink.map));
-	acc->sink.map = isl_map_range_map(acc->sink.map);
-	if (!acc->sink.map)
-		goto error;
-
-	if (acc->n_must == 0)
-		res = compute_mem_based_dependences(acc);
-	else
-		res = compute_val_based_dependences(acc);
-	if (!res)
-		return NULL;
-
-	for (j = 0; j < res->n_source; ++j) {
-		res->dep[j].map = isl_map_apply_range(res->dep[j].map,
-					isl_map_copy(domain_map));
-		if (!res->dep[j].map)
-			goto error2;
-	}
-	if (!res->must_no_source || !res->may_no_source)
-		goto error2;
-
-	isl_map_free(domain_map);
-	return res;
-error:
-	isl_map_free(domain_map);
-	isl_access_info_free(acc);
-	return NULL;
-error2:
-	isl_map_free(domain_map);
-	isl_flow_free(res);
-	return NULL;
-}
-
-
-/* Keep track of some information about a schedule for a given
- * access.  In particular, keep track of which dimensions
- * have a constant value and of the actual constant values.
- */
-struct isl_sched_info {
-	int *is_cst;
-	isl_vec *cst;
-};
-
-static void sched_info_free(__isl_take struct isl_sched_info *info)
-{
-	if (!info)
-		return;
-	isl_vec_free(info->cst);
-	free(info->is_cst);
-	free(info);
-}
-
-/* Extract information on the constant dimensions of the schedule
- * for a given access.  The "map" is of the form
- *
- *	[S -> D] -> A
- *
- * with S the schedule domain, D the iteration domain and A the data domain.
- */
-static __isl_give struct isl_sched_info *sched_info_alloc(
-	__isl_keep isl_map *map)
-{
-	isl_ctx *ctx;
-	isl_dim *dim;
-	struct isl_sched_info *info;
-	int i, n;
-
-	if (!map)
-		return NULL;
-
-	dim = isl_dim_unwrap(isl_dim_domain(isl_map_get_dim(map)));
-	if (!dim)
-		return NULL;
-	n = isl_dim_size(dim, isl_dim_in);
-	isl_dim_free(dim);
-
-	ctx = isl_map_get_ctx(map);
-	info = isl_alloc_type(ctx, struct isl_sched_info);
-	if (!info)
-		return NULL;
-	info->is_cst = isl_alloc_array(ctx, int, n);
-	info->cst = isl_vec_alloc(ctx, n);
-	if (!info->is_cst || !info->cst)
-		goto error;
-
-	for (i = 0; i < n; ++i)
-		info->is_cst[i] = isl_map_plain_is_fixed(map, isl_dim_in, i,
-							&info->cst->el[i]);
-
-	return info;
-error:
-	sched_info_free(info);
-	return NULL;
-}
-
-struct isl_compute_flow_data {
-	isl_union_map *must_source;
-	isl_union_map *may_source;
-	isl_union_map *must_dep;
-	isl_union_map *may_dep;
-	isl_union_map *must_no_source;
-	isl_union_map *may_no_source;
-
-	int count;
-	int must;
-	isl_dim *dim;
-	struct isl_sched_info *sink_info;
-	struct isl_sched_info **source_info;
-	isl_access_info *accesses;
-};
-
-static int count_matching_array(__isl_take isl_map *map, void *user)
-{
-	int eq;
-	isl_dim *dim;
-	struct isl_compute_flow_data *data;
-
-	data = (struct isl_compute_flow_data *)user;
-
-	dim = isl_dim_range(isl_map_get_dim(map));
-
-	eq = isl_dim_equal(dim, data->dim);
-
-	isl_dim_free(dim);
-	isl_map_free(map);
-
-	if (eq < 0)
-		return -1;
-	if (eq)
-		data->count++;
-
-	return 0;
-}
-
-static int collect_matching_array(__isl_take isl_map *map, void *user)
-{
-	int eq;
-	isl_dim *dim;
-	struct isl_sched_info *info;
-	struct isl_compute_flow_data *data;
-
-	data = (struct isl_compute_flow_data *)user;
-
-	dim = isl_dim_range(isl_map_get_dim(map));
-
-	eq = isl_dim_equal(dim, data->dim);
-
-	isl_dim_free(dim);
-
-	if (eq < 0)
-		goto error;
-	if (!eq) {
-		isl_map_free(map);
-		return 0;
-	}
-
-	info = sched_info_alloc(map);
-	data->source_info[data->count] = info;
-
-	data->accesses = isl_access_info_add_source(data->accesses,
-						    map, data->must, info);
-
-	data->count++;
-
-	return 0;
-error:
-	isl_map_free(map);
-	return -1;
-}
-
-/* Determine the shared nesting level and the "textual order" of
- * the given accesses.
- *
- * We first determine the minimal schedule dimension for both accesses.
- *
- * If among those dimensions, we can find one where both have a fixed
- * value and if moreover those values are different, then the previous
- * dimension is the last shared nesting level and the textual order
- * is determined based on the order of the fixed values.
- * If no such fixed values can be found, then we set the shared
- * nesting level to the minimal schedule dimension, with no textual ordering.
- */
-static int before(void *first, void *second)
-{
-	struct isl_sched_info *info1 = first;
-	struct isl_sched_info *info2 = second;
-	int n1, n2;
-	int i;
-
-	n1 = info1->cst->size;
-	n2 = info2->cst->size;
-
-	if (n2 < n1)
-		n1 = n2;
-
-	for (i = 0; i < n1; ++i) {
-		if (!info1->is_cst[i])
-			continue;
-		if (!info2->is_cst[i])
-			continue;
-		if (isl_int_eq(info1->cst->el[i], info2->cst->el[i]))
-			continue;
-		return 2 * i + isl_int_lt(info1->cst->el[i], info2->cst->el[i]);
-	}
-
-	return 2 * n1;
-}
-
-/* Given a sink access, look for all the source accesses that access
- * the same array and perform dataflow analysis on them using
- * isl_access_info_compute_flow.
- */
-static int compute_flow(__isl_take isl_map *map, void *user)
-{
-	int i;
-	isl_ctx *ctx;
-	struct isl_compute_flow_data *data;
-	isl_flow *flow;
-
-	data = (struct isl_compute_flow_data *)user;
-
-	ctx = isl_map_get_ctx(map);
-
-	data->accesses = NULL;
-	data->sink_info = NULL;
-	data->source_info = NULL;
-	data->count = 0;
-	data->dim = isl_dim_range(isl_map_get_dim(map));
-
-	if (isl_union_map_foreach_map(data->must_source,
-					&count_matching_array, data) < 0)
-		goto error;
-	if (isl_union_map_foreach_map(data->may_source,
-					&count_matching_array, data) < 0)
-		goto error;
-
-	data->sink_info = sched_info_alloc(map);
-	data->source_info = isl_calloc_array(ctx, struct isl_sched_info *,
-					     data->count);
-
-	data->accesses = isl_access_info_alloc(isl_map_copy(map),
-				data->sink_info, &before, data->count);
-	if (!data->sink_info || !data->source_info || !data->accesses)
-		goto error;
-	data->count = 0;
-	data->must = 1;
-	if (isl_union_map_foreach_map(data->must_source,
-					&collect_matching_array, data) < 0)
-		goto error;
-	data->must = 0;
-	if (isl_union_map_foreach_map(data->may_source,
-					&collect_matching_array, data) < 0)
-		goto error;
-
-	flow = isl_access_info_compute_flow(data->accesses);
-	data->accesses = NULL;
-
-	if (!flow)
-		goto error;
-
-	data->must_no_source = isl_union_map_union(data->must_no_source,
-		    isl_union_map_from_map(isl_flow_get_no_source(flow, 1)));
-	data->may_no_source = isl_union_map_union(data->may_no_source,
-		    isl_union_map_from_map(isl_flow_get_no_source(flow, 0)));
-
-	for (i = 0; i < flow->n_source; ++i) {
-		isl_union_map *dep;
-		dep = isl_union_map_from_map(isl_map_copy(flow->dep[i].map));
-		if (flow->dep[i].must)
-			data->must_dep = isl_union_map_union(data->must_dep, dep);
-		else
-			data->may_dep = isl_union_map_union(data->may_dep, dep);
-	}
-
-	isl_flow_free(flow);
-
-	sched_info_free(data->sink_info);
-	if (data->source_info) {
-		for (i = 0; i < data->count; ++i)
-			sched_info_free(data->source_info[i]);
-		free(data->source_info);
-	}
-	isl_dim_free(data->dim);
-	isl_map_free(map);
-
-	return 0;
-error:
-	isl_access_info_free(data->accesses);
-	sched_info_free(data->sink_info);
-	if (data->source_info) {
-		for (i = 0; i < data->count; ++i)
-			sched_info_free(data->source_info[i]);
-		free(data->source_info);
-	}
-	isl_dim_free(data->dim);
-	isl_map_free(map);
-
-	return -1;
-}
-
-/* Given a collection of "sink" and "source" accesses,
- * compute for each iteration of a sink access
- * and for each element accessed by that iteration,
- * the source access in the list that last accessed the
- * element accessed by the sink access before this sink access.
- * Each access is given as a map from the loop iterators
- * to the array indices.
- * The result is a relations between source and sink
- * iterations and a subset of the domain of the sink accesses,
- * corresponding to those iterations that access an element
- * not previously accessed.
- *
- * We first prepend the schedule dimensions to the domain
- * of the accesses so that we can easily compare their relative order.
- * Then we consider each sink access individually in compute_flow.
- */
-int isl_union_map_compute_flow(__isl_take isl_union_map *sink,
-	__isl_take isl_union_map *must_source,
-	__isl_take isl_union_map *may_source,
-	__isl_take isl_union_map *schedule,
-	__isl_give isl_union_map **must_dep, __isl_give isl_union_map **may_dep,
-	__isl_give isl_union_map **must_no_source,
-	__isl_give isl_union_map **may_no_source)
-{
-	isl_dim *dim;
-	isl_union_map *range_map = NULL;
-	struct isl_compute_flow_data data;
-
-	sink = isl_union_map_align_params(sink,
-					    isl_union_map_get_dim(must_source));
-	sink = isl_union_map_align_params(sink,
-					    isl_union_map_get_dim(may_source));
-	sink = isl_union_map_align_params(sink,
-					    isl_union_map_get_dim(schedule));
-	dim = isl_union_map_get_dim(sink);
-	must_source = isl_union_map_align_params(must_source, isl_dim_copy(dim));
-	may_source = isl_union_map_align_params(may_source, isl_dim_copy(dim));
-	schedule = isl_union_map_align_params(schedule, isl_dim_copy(dim));
-
-	schedule = isl_union_map_reverse(schedule);
-	range_map = isl_union_map_range_map(schedule);
-	schedule = isl_union_map_reverse(isl_union_map_copy(range_map));
-	sink = isl_union_map_apply_domain(sink, isl_union_map_copy(schedule));
-	must_source = isl_union_map_apply_domain(must_source,
-						isl_union_map_copy(schedule));
-	may_source = isl_union_map_apply_domain(may_source, schedule);
-
-	data.must_source = must_source;
-	data.may_source = may_source;
-	data.must_dep = must_dep ?
-		isl_union_map_empty(isl_dim_copy(dim)) : NULL;
-	data.may_dep = may_dep ? isl_union_map_empty(isl_dim_copy(dim)) : NULL;
-	data.must_no_source = must_no_source ?
-		isl_union_map_empty(isl_dim_copy(dim)) : NULL;
-	data.may_no_source = may_no_source ?
-		isl_union_map_empty(isl_dim_copy(dim)) : NULL;
-
-	isl_dim_free(dim);
-
-	if (isl_union_map_foreach_map(sink, &compute_flow, &data) < 0)
-		goto error;
-
-	isl_union_map_free(sink);
-	isl_union_map_free(must_source);
-	isl_union_map_free(may_source);
-
-	if (must_dep) {
-		data.must_dep = isl_union_map_apply_domain(data.must_dep,
-					isl_union_map_copy(range_map));
-		data.must_dep = isl_union_map_apply_range(data.must_dep,
-					isl_union_map_copy(range_map));
-		*must_dep = data.must_dep;
-	}
-	if (may_dep) {
-		data.may_dep = isl_union_map_apply_domain(data.may_dep,
-					isl_union_map_copy(range_map));
-		data.may_dep = isl_union_map_apply_range(data.may_dep,
-					isl_union_map_copy(range_map));
-		*may_dep = data.may_dep;
-	}
-	if (must_no_source) {
-		data.must_no_source = isl_union_map_apply_domain(
-			data.must_no_source, isl_union_map_copy(range_map));
-		*must_no_source = data.must_no_source;
-	}
-	if (may_no_source) {
-		data.may_no_source = isl_union_map_apply_domain(
-			data.may_no_source, isl_union_map_copy(range_map));
-		*may_no_source = data.may_no_source;
-	}
-
-	isl_union_map_free(range_map);
-
-	return 0;
-error:
-	isl_union_map_free(range_map);
-	isl_union_map_free(sink);
-	isl_union_map_free(must_source);
-	isl_union_map_free(may_source);
-	isl_union_map_free(data.must_dep);
-	isl_union_map_free(data.may_dep);
-	isl_union_map_free(data.must_no_source);
-	isl_union_map_free(data.may_no_source);
-
-	if (must_dep)
-		*must_dep = NULL;
-	if (may_dep)
-		*may_dep = NULL;
-	if (must_no_source)
-		*must_no_source = NULL;
-	if (may_no_source)
-		*may_no_source = NULL;
-	return -1;
-}
diff --git a/cloog-0.16.3/isl/isl_fold.c b/cloog-0.16.3/isl/isl_fold.c
deleted file mode 100644
index dbf0578..0000000
--- a/cloog-0.16.3/isl/isl_fold.c
+++ /dev/null
@@ -1,1583 +0,0 @@
-/*
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France 
- */
-
-#include <isl_map_private.h>
-#include <isl_union_map_private.h>
-#include <isl_polynomial_private.h>
-#include <isl_point_private.h>
-#include <isl_dim_private.h>
-#include <isl/lp.h>
-#include <isl/seq.h>
-#include <isl_mat_private.h>
-#include <isl_config.h>
-
-enum isl_fold isl_fold_type_negate(enum isl_fold type)
-{
-	switch (type) {
-	case isl_fold_min:
-		return isl_fold_max;
-	case isl_fold_max:
-		return isl_fold_min;
-	case isl_fold_list:
-		return isl_fold_list;
-	}
-
-	isl_die(NULL, isl_error_internal, "unhandled isl_fold type", abort());
-}
-
-static __isl_give isl_qpolynomial_fold *qpolynomial_fold_alloc(
-	enum isl_fold type, __isl_take isl_dim *dim, int n)
-{
-	isl_qpolynomial_fold *fold;
-
-	if (!dim)
-		goto error;
-
-	isl_assert(dim->ctx, n >= 0, goto error);
-	fold = isl_calloc(dim->ctx, struct isl_qpolynomial_fold,
-			sizeof(struct isl_qpolynomial_fold) +
-			(n - 1) * sizeof(struct isl_qpolynomial *));
-	if (!fold)
-		goto error;
-
-	fold->ref = 1;
-	fold->size = n;
-	fold->n = 0;
-	fold->type = type;
-	fold->dim = dim;
-
-	return fold;
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-isl_ctx *isl_qpolynomial_fold_get_ctx(__isl_keep isl_qpolynomial_fold *fold)
-{
-	return fold ? fold->dim->ctx : NULL;
-}
-
-__isl_give isl_dim *isl_qpolynomial_fold_get_dim(
-	__isl_keep isl_qpolynomial_fold *fold)
-{
-	return fold ? isl_dim_copy(fold->dim) : NULL;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_reset_dim(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_dim *dim)
-{
-	int i;
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold || !dim)
-		goto error;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_reset_dim(fold->qp[i],
-							isl_dim_copy(dim));
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	isl_dim_free(fold->dim);
-	fold->dim = dim;
-
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	isl_dim_free(dim);
-	return NULL;
-}
-
-int isl_qpolynomial_fold_involves_dims(__isl_keep isl_qpolynomial_fold *fold,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!fold)
-		return -1;
-	if (fold->n == 0 || n == 0)
-		return 0;
-
-	for (i = 0; i < fold->n; ++i) {
-		int involves = isl_qpolynomial_involves_dims(fold->qp[i],
-							    type, first, n);
-		if (involves < 0 || involves)
-			return involves;
-	}
-	return 0;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_set_dim_name(
-	__isl_take isl_qpolynomial_fold *fold,
-	enum isl_dim_type type, unsigned pos, const char *s)
-{
-	int i;
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold)
-		return NULL;
-	fold->dim = isl_dim_set_name(fold->dim, type, pos, s);
-	if (!fold->dim)
-		goto error;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_set_dim_name(fold->qp[i],
-							    type, pos, s);
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_drop_dims(
-	__isl_take isl_qpolynomial_fold *fold,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!fold)
-		return NULL;
-	if (n == 0)
-		return fold;
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold)
-		return NULL;
-	fold->dim = isl_dim_drop(fold->dim, type, first, n);
-	if (!fold->dim)
-		goto error;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_drop_dims(fold->qp[i],
-							    type, first, n);
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_insert_dims(
-	__isl_take isl_qpolynomial_fold *fold,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!fold)
-		return NULL;
-	if (n == 0 && !isl_dim_is_named_or_nested(fold->dim, type))
-		return fold;
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold)
-		return NULL;
-	fold->dim = isl_dim_insert(fold->dim, type, first, n);
-	if (!fold->dim)
-		goto error;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_insert_dims(fold->qp[i],
-							    type, first, n);
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	return NULL;
-}
-
-static int isl_qpolynomial_cst_sign(__isl_keep isl_qpolynomial *qp)
-{
-	struct isl_upoly_cst *cst;
-
-	cst = isl_upoly_as_cst(qp->upoly);
-	if (!cst)
-		return 0;
-
-	return isl_int_sgn(cst->n) < 0 ? -1 : 1;
-}
-
-static int isl_qpolynomial_aff_sign(__isl_keep isl_set *set,
-	__isl_keep isl_qpolynomial *qp)
-{
-	enum isl_lp_result res;
-	isl_vec *aff;
-	isl_int opt;
-	int sgn = 0;
-
-	aff = isl_qpolynomial_extract_affine(qp);
-	if (!aff)
-		return 0;
-
-	isl_int_init(opt);
-
-	res = isl_set_solve_lp(set, 0, aff->el + 1, aff->el[0],
-				&opt, NULL, NULL);
-	if (res == isl_lp_error)
-		goto done;
-	if (res == isl_lp_empty ||
-	    (res == isl_lp_ok && !isl_int_is_neg(opt))) {
-		sgn = 1;
-		goto done;
-	}
-
-	res = isl_set_solve_lp(set, 1, aff->el + 1, aff->el[0],
-				&opt, NULL, NULL);
-	if (res == isl_lp_ok && !isl_int_is_pos(opt))
-		sgn = -1;
-
-done:
-	isl_int_clear(opt);
-	isl_vec_free(aff);
-	return sgn;
-}
-
-/* Determine, if possible, the sign of the quasipolynomial "qp" on
- * the domain "set".
- *
- * If qp is a constant, then the problem is trivial.
- * If qp is linear, then we check if the minimum of the corresponding
- * affine constraint is non-negative or if the maximum is non-positive.
- *
- * Otherwise, we check if the outermost variable "v" has a lower bound "l"
- * in "set".  If so, we write qp(v,v') as
- *
- *	q(v,v') * (v - l) + r(v')
- *
- * if q(v,v') and r(v') have the same known sign, then the original
- * quasipolynomial has the same sign as well.
- *
- * Return
- *	-1 if qp <= 0
- *	 1 if qp >= 0
- *	 0 if unknown
- */
-static int isl_qpolynomial_sign(__isl_keep isl_set *set,
-	__isl_keep isl_qpolynomial *qp)
-{
-	int d;
-	int i;
-	int is;
-	struct isl_upoly_rec *rec;
-	isl_vec *v;
-	isl_int l;
-	enum isl_lp_result res;
-	int sgn = 0;
-
-	is = isl_qpolynomial_is_cst(qp, NULL, NULL);
-	if (is < 0)
-		return 0;
-	if (is)
-		return isl_qpolynomial_cst_sign(qp);
-
-	is = isl_qpolynomial_is_affine(qp);
-	if (is < 0)
-		return 0;
-	if (is)
-		return isl_qpolynomial_aff_sign(set, qp);
-
-	if (qp->div->n_row > 0)
-		return 0;
-
-	rec = isl_upoly_as_rec(qp->upoly);
-	if (!rec)
-		return 0;
-
-	d = isl_dim_total(qp->dim);
-	v = isl_vec_alloc(set->ctx, 2 + d);
-	if (!v)
-		return 0;
-
-	isl_seq_clr(v->el + 1, 1 + d);
-	isl_int_set_si(v->el[0], 1);
-	isl_int_set_si(v->el[2 + qp->upoly->var], 1);
-
-	isl_int_init(l);
-
-	res = isl_set_solve_lp(set, 0, v->el + 1, v->el[0], &l, NULL, NULL);
-	if (res == isl_lp_ok) {
-		isl_qpolynomial *min;
-		isl_qpolynomial *base;
-		isl_qpolynomial *r, *q;
-		isl_qpolynomial *t;
-
-		min = isl_qpolynomial_cst(isl_dim_copy(qp->dim), l);
-		base = isl_qpolynomial_var_pow(isl_dim_copy(qp->dim),
-						qp->upoly->var, 1);
-
-		r = isl_qpolynomial_alloc(isl_dim_copy(qp->dim), 0,
-					  isl_upoly_copy(rec->p[rec->n - 1]));
-		q = isl_qpolynomial_copy(r);
-
-		for (i = rec->n - 2; i >= 0; --i) {
-			r = isl_qpolynomial_mul(r, isl_qpolynomial_copy(min));
-			t = isl_qpolynomial_alloc(isl_dim_copy(qp->dim), 0,
-						  isl_upoly_copy(rec->p[i]));
-			r = isl_qpolynomial_add(r, t);
-			if (i == 0)
-				break;
-			q = isl_qpolynomial_mul(q, isl_qpolynomial_copy(base));
-			q = isl_qpolynomial_add(q, isl_qpolynomial_copy(r));
-		}
-
-		if (isl_qpolynomial_is_zero(q))
-			sgn = isl_qpolynomial_sign(set, r);
-		else if (isl_qpolynomial_is_zero(r))
-			sgn = isl_qpolynomial_sign(set, q);
-		else {
-			int sgn_q, sgn_r;
-			sgn_r = isl_qpolynomial_sign(set, r);
-			sgn_q = isl_qpolynomial_sign(set, q);
-			if (sgn_r == sgn_q)
-				sgn = sgn_r;
-		}
-
-		isl_qpolynomial_free(min);
-		isl_qpolynomial_free(base);
-		isl_qpolynomial_free(q);
-		isl_qpolynomial_free(r);
-	}
-
-	isl_int_clear(l);
-
-	isl_vec_free(v);
-
-	return sgn;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_fold_on_domain(
-	__isl_keep isl_set *set,
-	__isl_take isl_qpolynomial_fold *fold1,
-	__isl_take isl_qpolynomial_fold *fold2)
-{
-	int i, j;
-	int n1;
-	struct isl_qpolynomial_fold *res = NULL;
-	int better;
-
-	if (!fold1 || !fold2)
-		goto error;
-
-	isl_assert(fold1->dim->ctx, fold1->type == fold2->type, goto error);
-	isl_assert(fold1->dim->ctx, isl_dim_equal(fold1->dim, fold2->dim),
-			goto error);
-
-	better = fold1->type == isl_fold_max ? -1 : 1;
-
-	if (isl_qpolynomial_fold_is_empty(fold1)) {
-		isl_qpolynomial_fold_free(fold1);
-		return fold2;
-	}
-
-	if (isl_qpolynomial_fold_is_empty(fold2)) {
-		isl_qpolynomial_fold_free(fold2);
-		return fold1;
-	}
-
-	res = qpolynomial_fold_alloc(fold1->type, isl_dim_copy(fold1->dim),
-					fold1->n + fold2->n);
-	if (!res)
-		goto error;
-
-	for (i = 0; i < fold1->n; ++i) {
-		res->qp[res->n] = isl_qpolynomial_copy(fold1->qp[i]);
-		if (!res->qp[res->n])
-			goto error;
-		res->n++;
-	}
-	n1 = res->n;
-
-	for (i = 0; i < fold2->n; ++i) {
-		for (j = n1 - 1; j >= 0; --j) {
-			isl_qpolynomial *d;
-			int sgn;
-			d = isl_qpolynomial_sub(
-				isl_qpolynomial_copy(res->qp[j]),
-				isl_qpolynomial_copy(fold2->qp[i]));
-			sgn = isl_qpolynomial_sign(set, d);
-			isl_qpolynomial_free(d);
-			if (sgn == 0)
-				continue;
-			if (sgn != better)
-				break;
-			isl_qpolynomial_free(res->qp[j]);
-			if (j != n1 - 1)
-				res->qp[j] = res->qp[n1 - 1];
-			n1--;
-			if (n1 != res->n - 1)
-				res->qp[n1] = res->qp[res->n - 1];
-			res->n--;
-		}
-		if (j >= 0)
-			continue;
-		res->qp[res->n] = isl_qpolynomial_copy(fold2->qp[i]);
-		if (!res->qp[res->n])
-			goto error;
-		res->n++;
-	}
-
-	isl_qpolynomial_fold_free(fold1);
-	isl_qpolynomial_fold_free(fold2);
-
-	return res;
-error:
-	isl_qpolynomial_fold_free(res);
-	isl_qpolynomial_fold_free(fold1);
-	isl_qpolynomial_fold_free(fold2);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_add_qpolynomial(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_qpolynomial *qp)
-{
-	int i;
-
-	if (!fold || !qp)
-		goto error;
-
-	if (isl_qpolynomial_is_zero(qp)) {
-		isl_qpolynomial_free(qp);
-		return fold;
-	}
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold)
-		goto error;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_add(fold->qp[i],
-						isl_qpolynomial_copy(qp));
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	isl_qpolynomial_free(qp);
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_add_on_domain(
-	__isl_keep isl_set *dom,
-	__isl_take isl_qpolynomial_fold *fold1,
-	__isl_take isl_qpolynomial_fold *fold2)
-{
-	int i;
-	isl_qpolynomial_fold *res = NULL;
-
-	if (!fold1 || !fold2)
-		goto error;
-
-	if (isl_qpolynomial_fold_is_empty(fold1)) {
-		isl_qpolynomial_fold_free(fold1);
-		return fold2;
-	}
-
-	if (isl_qpolynomial_fold_is_empty(fold2)) {
-		isl_qpolynomial_fold_free(fold2);
-		return fold1;
-	}
-
-	if (fold1->n == 1 && fold2->n != 1)
-		return isl_qpolynomial_fold_add_on_domain(dom, fold2, fold1);
-
-	if (fold2->n == 1) {
-		res = isl_qpolynomial_fold_add_qpolynomial(fold1,
-					isl_qpolynomial_copy(fold2->qp[0]));
-		isl_qpolynomial_fold_free(fold2);
-		return res;
-	}
-
-	res = isl_qpolynomial_fold_add_qpolynomial(
-				isl_qpolynomial_fold_copy(fold1),
-				isl_qpolynomial_copy(fold2->qp[0]));
-
-	for (i = 1; i < fold2->n; ++i) {
-		isl_qpolynomial_fold *res_i;
-		res_i = isl_qpolynomial_fold_add_qpolynomial(
-					isl_qpolynomial_fold_copy(fold1),
-					isl_qpolynomial_copy(fold2->qp[i]));
-		res = isl_qpolynomial_fold_fold_on_domain(dom, res, res_i);
-	}
-
-	isl_qpolynomial_fold_free(fold1);
-	isl_qpolynomial_fold_free(fold2);
-	return res;
-error:
-	isl_qpolynomial_fold_free(res);
-	isl_qpolynomial_fold_free(fold1);
-	isl_qpolynomial_fold_free(fold2);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_substitute_equalities(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_basic_set *eq)
-{
-	int i;
-
-	if (!fold || !eq)
-		goto error;
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold)
-		return NULL;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_substitute_equalities(fold->qp[i],
-							isl_basic_set_copy(eq));
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	isl_basic_set_free(eq);
-	return fold;
-error:
-	isl_basic_set_free(eq);
-	isl_qpolynomial_fold_free(fold);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_gist(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_set *context)
-{
-	int i;
-
-	if (!fold || !context)
-		goto error;
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold)
-		return NULL;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_gist(fold->qp[i],
-							isl_set_copy(context));
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	isl_set_free(context);
-	return fold;
-error:
-	isl_set_free(context);
-	isl_qpolynomial_fold_free(fold);
-	return NULL;
-}
-
-#define HAS_TYPE
-
-#undef PW
-#define PW isl_pw_qpolynomial_fold
-#undef EL
-#define EL isl_qpolynomial_fold
-#undef EL_IS_ZERO
-#define EL_IS_ZERO is_empty
-#undef ZERO
-#define ZERO zero
-#undef IS_ZERO
-#define IS_ZERO is_zero
-#undef FIELD
-#define FIELD fold
-
-#define NO_NEG
-
-#include <isl_pw_templ.c>
-
-#undef UNION
-#define UNION isl_union_pw_qpolynomial_fold
-#undef PART
-#define PART isl_pw_qpolynomial_fold
-#undef PARTS
-#define PARTS pw_qpolynomial_fold
-
-#include <isl_union_templ.c>
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_empty(enum isl_fold type,
-	__isl_take isl_dim *dim)
-{
-	return qpolynomial_fold_alloc(type, dim, 0);
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_alloc(
-	enum isl_fold type, __isl_take isl_qpolynomial *qp)
-{
-	isl_qpolynomial_fold *fold;
-
-	if (!qp)
-		return NULL;
-
-	fold = qpolynomial_fold_alloc(type, isl_dim_copy(qp->dim), 1);
-	if (!fold)
-		goto error;
-
-	fold->qp[0] = qp;
-	fold->n++;
-
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_copy(
-	__isl_keep isl_qpolynomial_fold *fold)
-{
-	if (!fold)
-		return NULL;
-
-	fold->ref++;
-	return fold;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_dup(
-	__isl_keep isl_qpolynomial_fold *fold)
-{
-	int i;
-	isl_qpolynomial_fold *dup;
-
-	if (!fold)
-		return NULL;
-	dup = qpolynomial_fold_alloc(fold->type,
-					isl_dim_copy(fold->dim), fold->n);
-	if (!dup)
-		return NULL;
-	
-	dup->n = fold->n;
-	for (i = 0; i < fold->n; ++i) {
-		dup->qp[i] = isl_qpolynomial_copy(fold->qp[i]);
-		if (!dup->qp[i])
-			goto error;
-	}
-
-	return dup;
-error:
-	isl_qpolynomial_fold_free(dup);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_cow(
-	__isl_take isl_qpolynomial_fold *fold)
-{
-	if (!fold)
-		return NULL;
-
-	if (fold->ref == 1)
-		return fold;
-	fold->ref--;
-	return isl_qpolynomial_fold_dup(fold);
-}
-
-void isl_qpolynomial_fold_free(__isl_take isl_qpolynomial_fold *fold)
-{
-	int i;
-
-	if (!fold)
-		return;
-	if (--fold->ref > 0)
-		return;
-
-	for (i = 0; i < fold->n; ++i)
-		isl_qpolynomial_free(fold->qp[i]);
-	isl_dim_free(fold->dim);
-	free(fold);
-}
-
-int isl_qpolynomial_fold_is_empty(__isl_keep isl_qpolynomial_fold *fold)
-{
-	if (!fold)
-		return -1;
-
-	return fold->n == 0;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_fold(
-	__isl_take isl_qpolynomial_fold *fold1,
-	__isl_take isl_qpolynomial_fold *fold2)
-{
-	int i;
-	struct isl_qpolynomial_fold *res = NULL;
-
-	if (!fold1 || !fold2)
-		goto error;
-
-	isl_assert(fold1->dim->ctx, fold1->type == fold2->type, goto error);
-	isl_assert(fold1->dim->ctx, isl_dim_equal(fold1->dim, fold2->dim),
-			goto error);
-
-	if (isl_qpolynomial_fold_is_empty(fold1)) {
-		isl_qpolynomial_fold_free(fold1);
-		return fold2;
-	}
-
-	if (isl_qpolynomial_fold_is_empty(fold2)) {
-		isl_qpolynomial_fold_free(fold2);
-		return fold1;
-	}
-
-	res = qpolynomial_fold_alloc(fold1->type, isl_dim_copy(fold1->dim),
-					fold1->n + fold2->n);
-	if (!res)
-		goto error;
-
-	for (i = 0; i < fold1->n; ++i) {
-		res->qp[res->n] = isl_qpolynomial_copy(fold1->qp[i]);
-		if (!res->qp[res->n])
-			goto error;
-		res->n++;
-	}
-
-	for (i = 0; i < fold2->n; ++i) {
-		res->qp[res->n] = isl_qpolynomial_copy(fold2->qp[i]);
-		if (!res->qp[res->n])
-			goto error;
-		res->n++;
-	}
-
-	isl_qpolynomial_fold_free(fold1);
-	isl_qpolynomial_fold_free(fold2);
-
-	return res;
-error:
-	isl_qpolynomial_fold_free(res);
-	isl_qpolynomial_fold_free(fold1);
-	isl_qpolynomial_fold_free(fold2);
-	return NULL;
-}
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_fold(
-	__isl_take isl_pw_qpolynomial_fold *pw1,
-	__isl_take isl_pw_qpolynomial_fold *pw2)
-{
-	int i, j, n;
-	struct isl_pw_qpolynomial_fold *res;
-	isl_set *set;
-
-	if (!pw1 || !pw2)
-		goto error;
-
-	isl_assert(pw1->dim->ctx, isl_dim_equal(pw1->dim, pw2->dim), goto error);
-
-	if (isl_pw_qpolynomial_fold_is_zero(pw1)) {
-		isl_pw_qpolynomial_fold_free(pw1);
-		return pw2;
-	}
-
-	if (isl_pw_qpolynomial_fold_is_zero(pw2)) {
-		isl_pw_qpolynomial_fold_free(pw2);
-		return pw1;
-	}
-
-	if (pw1->type != pw2->type)
-		isl_die(pw1->dim->ctx, isl_error_invalid,
-			"fold types don't match", goto error);
-
-	n = (pw1->n + 1) * (pw2->n + 1);
-	res = isl_pw_qpolynomial_fold_alloc_(isl_dim_copy(pw1->dim),
-						pw1->type, n);
-
-	for (i = 0; i < pw1->n; ++i) {
-		set = isl_set_copy(pw1->p[i].set);
-		for (j = 0; j < pw2->n; ++j) {
-			struct isl_set *common;
-			isl_qpolynomial_fold *sum;
-			set = isl_set_subtract(set,
-					isl_set_copy(pw2->p[j].set));
-			common = isl_set_intersect(isl_set_copy(pw1->p[i].set),
-						isl_set_copy(pw2->p[j].set));
-			if (isl_set_plain_is_empty(common)) {
-				isl_set_free(common);
-				continue;
-			}
-
-			sum = isl_qpolynomial_fold_fold_on_domain(common,
-			       isl_qpolynomial_fold_copy(pw1->p[i].fold),
-			       isl_qpolynomial_fold_copy(pw2->p[j].fold));
-
-			res = isl_pw_qpolynomial_fold_add_piece(res, common, sum);
-		}
-		res = isl_pw_qpolynomial_fold_add_piece(res, set,
-			isl_qpolynomial_fold_copy(pw1->p[i].fold));
-	}
-
-	for (j = 0; j < pw2->n; ++j) {
-		set = isl_set_copy(pw2->p[j].set);
-		for (i = 0; i < pw1->n; ++i)
-			set = isl_set_subtract(set, isl_set_copy(pw1->p[i].set));
-		res = isl_pw_qpolynomial_fold_add_piece(res, set,
-				    isl_qpolynomial_fold_copy(pw2->p[j].fold));
-	}
-
-	isl_pw_qpolynomial_fold_free(pw1);
-	isl_pw_qpolynomial_fold_free(pw2);
-
-	return res;
-error:
-	isl_pw_qpolynomial_fold_free(pw1);
-	isl_pw_qpolynomial_fold_free(pw2);
-	return NULL;
-}
-
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_fold_pw_qpolynomial_fold(
-	__isl_take isl_union_pw_qpolynomial_fold *u,
-	__isl_take isl_pw_qpolynomial_fold *part)
-{
-	uint32_t hash;
-	struct isl_hash_table_entry *entry;
-
-	u = isl_union_pw_qpolynomial_fold_cow(u);
-
-	if (!part || !u)
-		goto error;
-
-	isl_assert(u->dim->ctx, isl_dim_match(part->dim, isl_dim_param, u->dim,
-					      isl_dim_param), goto error);
-
-	hash = isl_dim_get_hash(part->dim);
-	entry = isl_hash_table_find(u->dim->ctx, &u->table, hash,
-				    &has_dim, part->dim, 1);
-	if (!entry)
-		goto error;
-
-	if (!entry->data)
-		entry->data = part;
-	else {
-		entry->data = isl_pw_qpolynomial_fold_fold(entry->data,
-					    isl_pw_qpolynomial_fold_copy(part));
-		if (!entry->data)
-			goto error;
-		isl_pw_qpolynomial_fold_free(part);
-	}
-
-	return u;
-error:
-	isl_pw_qpolynomial_fold_free(part);
-	isl_union_pw_qpolynomial_fold_free(u);
-	return NULL;
-}
-
-static int fold_part(__isl_take isl_pw_qpolynomial_fold *part, void *user)
-{
-	isl_union_pw_qpolynomial_fold **u;
-	u = (isl_union_pw_qpolynomial_fold **)user;
-
-	*u = isl_union_pw_qpolynomial_fold_fold_pw_qpolynomial_fold(*u, part);
-
-	return 0;
-}
-
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_fold(
-	__isl_take isl_union_pw_qpolynomial_fold *u1,
-	__isl_take isl_union_pw_qpolynomial_fold *u2)
-{
-	u1 = isl_union_pw_qpolynomial_fold_cow(u1);
-
-	if (!u1 || !u2)
-		goto error;
-
-	if (isl_union_pw_qpolynomial_fold_foreach_pw_qpolynomial_fold(u2,
-							&fold_part, &u1) < 0)
-		goto error;
-
-	isl_union_pw_qpolynomial_fold_free(u2);
-
-	return u1;
-error:
-	isl_union_pw_qpolynomial_fold_free(u1);
-	isl_union_pw_qpolynomial_fold_free(u2);
-	return NULL;
-}
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_from_pw_qpolynomial(
-	enum isl_fold type, __isl_take isl_pw_qpolynomial *pwqp)
-{
-	int i;
-	isl_pw_qpolynomial_fold *pwf;
-
-	if (!pwqp)
-		return NULL;
-	
-	pwf = isl_pw_qpolynomial_fold_alloc_(isl_dim_copy(pwqp->dim), type,
-						pwqp->n);
-
-	for (i = 0; i < pwqp->n; ++i)
-		pwf = isl_pw_qpolynomial_fold_add_piece(pwf,
-			isl_set_copy(pwqp->p[i].set),
-			isl_qpolynomial_fold_alloc(type,
-				isl_qpolynomial_copy(pwqp->p[i].qp)));
-
-	isl_pw_qpolynomial_free(pwqp);
-
-	return pwf;
-}
-
-int isl_qpolynomial_fold_plain_is_equal(__isl_keep isl_qpolynomial_fold *fold1,
-	__isl_keep isl_qpolynomial_fold *fold2)
-{
-	int i;
-
-	if (!fold1 || !fold2)
-		return -1;
-
-	if (fold1->n != fold2->n)
-		return 0;
-
-	/* We probably want to sort the qps first... */
-	for (i = 0; i < fold1->n; ++i) {
-		int eq = isl_qpolynomial_plain_is_equal(fold1->qp[i], fold2->qp[i]);
-		if (eq < 0 || !eq)
-			return eq;
-	}
-
-	return 1;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_fold_eval(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_point *pnt)
-{
-	isl_qpolynomial *qp;
-
-	if (!fold || !pnt)
-		goto error;
-	isl_assert(pnt->dim->ctx, isl_dim_equal(pnt->dim, fold->dim), goto error);
-	isl_assert(pnt->dim->ctx,
-		fold->type == isl_fold_max || fold->type == isl_fold_min,
-		goto error);
-
-	if (fold->n == 0)
-		qp = isl_qpolynomial_zero(isl_dim_copy(fold->dim));
-	else {
-		int i;
-		qp = isl_qpolynomial_eval(isl_qpolynomial_copy(fold->qp[0]),
-						isl_point_copy(pnt));
-		for (i = 1; i < fold->n; ++i) {
-			isl_qpolynomial *qp_i;
-			qp_i = isl_qpolynomial_eval(
-					    isl_qpolynomial_copy(fold->qp[i]),
-					    isl_point_copy(pnt));
-			if (fold->type == isl_fold_max)
-				qp = isl_qpolynomial_max_cst(qp, qp_i);
-			else
-				qp = isl_qpolynomial_min_cst(qp, qp_i);
-		}
-	}
-	isl_qpolynomial_fold_free(fold);
-	isl_point_free(pnt);
-
-	return qp;
-error:
-	isl_qpolynomial_fold_free(fold);
-	isl_point_free(pnt);
-	return NULL;
-}
-
-size_t isl_pw_qpolynomial_fold_size(__isl_keep isl_pw_qpolynomial_fold *pwf)
-{
-	int i;
-	size_t n = 0;
-
-	for (i = 0; i < pwf->n; ++i)
-		n += pwf->p[i].fold->n;
-
-	return n;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_fold_opt_on_domain(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_set *set, int max)
-{
-	int i;
-	isl_qpolynomial *opt;
-
-	if (!set || !fold)
-		goto error;
-
-	if (fold->n == 0) {
-		isl_dim *dim = isl_dim_copy(fold->dim);
-		isl_set_free(set);
-		isl_qpolynomial_fold_free(fold);
-		return isl_qpolynomial_zero(dim);
-	}
-
-	opt = isl_qpolynomial_opt_on_domain(isl_qpolynomial_copy(fold->qp[0]),
-						isl_set_copy(set), max);
-	for (i = 1; i < fold->n; ++i) {
-		isl_qpolynomial *opt_i;
-		opt_i = isl_qpolynomial_opt_on_domain(
-				isl_qpolynomial_copy(fold->qp[i]),
-				isl_set_copy(set), max);
-		if (max)
-			opt = isl_qpolynomial_max_cst(opt, opt_i);
-		else
-			opt = isl_qpolynomial_min_cst(opt, opt_i);
-	}
-
-	isl_set_free(set);
-	isl_qpolynomial_fold_free(fold);
-
-	return opt;
-error:
-	isl_set_free(set);
-	isl_qpolynomial_fold_free(fold);
-	return NULL;
-}
-
-/* Check whether for each quasi-polynomial in "fold2" there is
- * a quasi-polynomial in "fold1" that dominates it on "set".
- */
-static int qpolynomial_fold_covers_on_domain(__isl_keep isl_set *set,
-	__isl_keep isl_qpolynomial_fold *fold1,
-	__isl_keep isl_qpolynomial_fold *fold2)
-{
-	int i, j;
-	int covers;
-
-	if (!set || !fold1 || !fold2)
-		return -1;
-
-	covers = fold1->type == isl_fold_max ? 1 : -1;
-
-	for (i = 0; i < fold2->n; ++i) {
-		for (j = 0; j < fold1->n; ++j) {
-			isl_qpolynomial *d;
-			int sgn;
-
-			d = isl_qpolynomial_sub(
-				isl_qpolynomial_copy(fold1->qp[j]),
-				isl_qpolynomial_copy(fold2->qp[i]));
-			sgn = isl_qpolynomial_sign(set, d);
-			isl_qpolynomial_free(d);
-			if (sgn == covers)
-				break;
-		}
-		if (j >= fold1->n)
-			return 0;
-	}
-
-	return 1;
-}
-
-/* Check whether "pwf1" dominated "pwf2", i.e., the domain of "pwf1" contains
- * that of "pwf2" and on each cell, the corresponding fold from pwf1 dominates
- * that of pwf2.
- */
-int isl_pw_qpolynomial_fold_covers(__isl_keep isl_pw_qpolynomial_fold *pwf1,
-	__isl_keep isl_pw_qpolynomial_fold *pwf2)
-{
-	int i, j;
-	isl_set *dom1, *dom2;
-	int is_subset;
-
-	if (!pwf1 || !pwf2)
-		return -1;
-
-	if (pwf2->n == 0)
-		return 1;
-	if (pwf1->n == 0)
-		return 0;
-
-	dom1 = isl_pw_qpolynomial_fold_domain(isl_pw_qpolynomial_fold_copy(pwf1));
-	dom2 = isl_pw_qpolynomial_fold_domain(isl_pw_qpolynomial_fold_copy(pwf2));
-	is_subset = isl_set_is_subset(dom2, dom1);
-	isl_set_free(dom1);
-	isl_set_free(dom2);
-
-	if (is_subset < 0 || !is_subset)
-		return is_subset;
-
-	for (i = 0; i < pwf2->n; ++i) {
-		for (j = 0; j < pwf1->n; ++j) {
-			int is_empty;
-			isl_set *common;
-			int covers;
-
-			common = isl_set_intersect(isl_set_copy(pwf1->p[j].set),
-						   isl_set_copy(pwf2->p[i].set));
-			is_empty = isl_set_is_empty(common);
-			if (is_empty < 0 || is_empty) {
-				isl_set_free(common);
-				if (is_empty < 0)
-					return -1;
-				continue;
-			}
-			covers = qpolynomial_fold_covers_on_domain(common,
-					pwf1->p[j].fold, pwf2->p[i].fold);
-			isl_set_free(common);
-			if (covers < 0 || !covers)
-				return covers;
-		}
-	}
-
-	return 1;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_morph(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_morph *morph)
-{
-	int i;
-	isl_ctx *ctx;
-
-	if (!fold || !morph)
-		goto error;
-
-	ctx = fold->dim->ctx;
-	isl_assert(ctx, isl_dim_equal(fold->dim, morph->dom->dim), goto error);
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold)
-		goto error;
-
-	isl_dim_free(fold->dim);
-	fold->dim = isl_dim_copy(morph->ran->dim);
-	if (!fold->dim)
-		goto error;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_morph(fold->qp[i],
-						isl_morph_copy(morph));
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	isl_morph_free(morph);
-
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	isl_morph_free(morph);
-	return NULL;
-}
-
-enum isl_fold isl_qpolynomial_fold_get_type(__isl_keep isl_qpolynomial_fold *fold)
-{
-	if (!fold)
-		return isl_fold_list;
-	return fold->type;
-}
-
-enum isl_fold isl_union_pw_qpolynomial_fold_get_type(
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf)
-{
-	if (!upwf)
-		return isl_fold_list;
-	return upwf->type;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_lift(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_dim *dim)
-{
-	int i;
-
-	if (!fold || !dim)
-		goto error;
-
-	if (isl_dim_equal(fold->dim, dim)) {
-		isl_dim_free(dim);
-		return fold;
-	}
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold)
-		goto error;
-
-	isl_dim_free(fold->dim);
-	fold->dim = isl_dim_copy(dim);
-	if (!fold->dim)
-		goto error;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_lift(fold->qp[i],
-						isl_dim_copy(dim));
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	isl_dim_free(dim);
-
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	isl_dim_free(dim);
-	return NULL;
-}
-
-int isl_qpolynomial_fold_foreach_qpolynomial(
-	__isl_keep isl_qpolynomial_fold *fold,
-	int (*fn)(__isl_take isl_qpolynomial *qp, void *user), void *user)
-{
-	int i;
-
-	if (!fold)
-		return -1;
-
-	for (i = 0; i < fold->n; ++i)
-		if (fn(isl_qpolynomial_copy(fold->qp[i]), user) < 0)
-			return -1;
-
-	return 0;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_move_dims(
-	__isl_take isl_qpolynomial_fold *fold,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n)
-{
-	int i;
-
-	if (n == 0)
-		return fold;
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold)
-		return NULL;
-
-	fold->dim = isl_dim_move(fold->dim, dst_type, dst_pos,
-						src_type, src_pos, n);
-	if (!fold->dim)
-		goto error;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_move_dims(fold->qp[i],
-				dst_type, dst_pos, src_type, src_pos, n);
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	return NULL;
-}
-
-/* For each 0 <= i < "n", replace variable "first" + i of type "type"
- * in fold->qp[k] by subs[i].
- */
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_substitute(
-	__isl_take isl_qpolynomial_fold *fold,
-	enum isl_dim_type type, unsigned first, unsigned n,
-	__isl_keep isl_qpolynomial **subs)
-{
-	int i;
-
-	if (n == 0)
-		return fold;
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold)
-		return NULL;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_substitute(fold->qp[i],
-				type, first, n, subs);
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	return NULL;
-}
-
-static int add_pwqp(__isl_take isl_pw_qpolynomial *pwqp, void *user)
-{
-	isl_ctx *ctx;
-	isl_pw_qpolynomial_fold *pwf;
-	isl_union_pw_qpolynomial_fold **upwf;
-	uint32_t hash;
-	struct isl_hash_table_entry *entry;
-
-	upwf = (isl_union_pw_qpolynomial_fold **)user;
-
-	ctx = pwqp->dim->ctx;
-	hash = isl_dim_get_hash(pwqp->dim);
-	entry = isl_hash_table_find(ctx, &(*upwf)->table,
-				     hash, &has_dim, pwqp->dim, 1);
-	if (!entry)
-		goto error;
-
-	pwf = isl_pw_qpolynomial_fold_from_pw_qpolynomial((*upwf)->type, pwqp);
-	if (!entry->data)
-		entry->data = pwf;
-	else {
-		entry->data = isl_pw_qpolynomial_fold_add(entry->data, pwf);
-		if (!entry->data)
-			return -1;
-		if (isl_pw_qpolynomial_fold_is_zero(entry->data)) {
-			isl_pw_qpolynomial_fold_free(entry->data);
-			isl_hash_table_remove(ctx, &(*upwf)->table, entry);
-		}
-	}
-
-	return 0;
-error:
-	isl_pw_qpolynomial_free(pwqp);
-	return -1;
-}
-
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_add_union_pw_qpolynomial(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf,
-	__isl_take isl_union_pw_qpolynomial *upwqp)
-{
-	upwf = isl_union_pw_qpolynomial_fold_align_params(upwf,
-				isl_union_pw_qpolynomial_get_dim(upwqp));
-	upwqp = isl_union_pw_qpolynomial_align_params(upwqp,
-				isl_union_pw_qpolynomial_fold_get_dim(upwf));
-
-	upwf = isl_union_pw_qpolynomial_fold_cow(upwf);
-	if (!upwf || !upwqp)
-		goto error;
-
-	if (isl_union_pw_qpolynomial_foreach_pw_qpolynomial(upwqp, &add_pwqp,
-							 &upwf) < 0)
-		goto error;
-
-	isl_union_pw_qpolynomial_free(upwqp);
-
-	return upwf;
-error:
-	isl_union_pw_qpolynomial_fold_free(upwf);
-	isl_union_pw_qpolynomial_free(upwqp);
-	return NULL;
-}
-
-static int compatible_range(__isl_keep isl_dim *dim1, __isl_keep isl_dim *dim2)
-{
-	int m;
-	m = isl_dim_match(dim1, isl_dim_param, dim2, isl_dim_param);
-	if (m < 0 || !m)
-		return m;
-	return isl_dim_tuple_match(dim1, isl_dim_out, dim2, isl_dim_set);
-}
-
-/* Compute the intersection of the range of the map and the domain
- * of the piecewise quasipolynomial reduction and then compute a bound
- * on the associated quasipolynomial reduction over all elements
- * in this intersection.
- *
- * We first introduce some unconstrained dimensions in the
- * piecewise quasipolynomial, intersect the resulting domain
- * with the wrapped map and the compute the sum.
- */
-__isl_give isl_pw_qpolynomial_fold *isl_map_apply_pw_qpolynomial_fold(
-	__isl_take isl_map *map, __isl_take isl_pw_qpolynomial_fold *pwf,
-	int *tight)
-{
-	isl_ctx *ctx;
-	isl_set *dom;
-	isl_dim *map_dim;
-	isl_dim *pwf_dim;
-	unsigned n_in;
-	int ok;
-
-	ctx = isl_map_get_ctx(map);
-	if (!ctx)
-		goto error;
-
-	map_dim = isl_map_get_dim(map);
-	pwf_dim = isl_pw_qpolynomial_fold_get_dim(pwf);
-	ok = compatible_range(map_dim, pwf_dim);
-	isl_dim_free(map_dim);
-	isl_dim_free(pwf_dim);
-	if (!ok)
-		isl_die(ctx, isl_error_invalid, "incompatible dimensions",
-			goto error);
-
-	n_in = isl_map_dim(map, isl_dim_in);
-	pwf = isl_pw_qpolynomial_fold_insert_dims(pwf, isl_dim_set, 0, n_in);
-
-	dom = isl_map_wrap(map);
-	pwf = isl_pw_qpolynomial_fold_reset_dim(pwf, isl_set_get_dim(dom));
-
-	pwf = isl_pw_qpolynomial_fold_intersect_domain(pwf, dom);
-	pwf = isl_pw_qpolynomial_fold_bound(pwf, tight);
-	
-	return pwf;
-error:
-	isl_map_free(map);
-	isl_pw_qpolynomial_fold_free(pwf);
-	return NULL;
-}
-
-__isl_give isl_pw_qpolynomial_fold *isl_set_apply_pw_qpolynomial_fold(
-	__isl_take isl_set *set, __isl_take isl_pw_qpolynomial_fold *pwf,
-	int *tight)
-{
-	isl_map *map;
-
-	map = isl_map_from_range(set);
-	return isl_map_apply_pw_qpolynomial_fold(map, pwf, tight);
-}
-
-struct isl_apply_fold_data {
-	isl_union_pw_qpolynomial_fold *upwf;
-	isl_union_pw_qpolynomial_fold *res;
-	isl_map *map;
-	int tight;
-};
-
-static int pw_qpolynomial_fold_apply(__isl_take isl_pw_qpolynomial_fold *pwf,
-	void *user)
-{
-	isl_dim *map_dim;
-	isl_dim *pwf_dim;
-	struct isl_apply_fold_data *data = user;
-	int ok;
-
-	map_dim = isl_map_get_dim(data->map);
-	pwf_dim = isl_pw_qpolynomial_fold_get_dim(pwf);
-	ok = compatible_range(map_dim, pwf_dim);
-	isl_dim_free(map_dim);
-	isl_dim_free(pwf_dim);
-
-	if (ok) {
-		pwf = isl_map_apply_pw_qpolynomial_fold(isl_map_copy(data->map),
-				    pwf, data->tight ? &data->tight : NULL);
-		data->res = isl_union_pw_qpolynomial_fold_fold_pw_qpolynomial_fold(
-							data->res, pwf);
-	} else
-		isl_pw_qpolynomial_fold_free(pwf);
-
-	return 0;
-}
-
-static int map_apply(__isl_take isl_map *map, void *user)
-{
-	struct isl_apply_fold_data *data = user;
-	int r;
-
-	data->map = map;
-	r = isl_union_pw_qpolynomial_fold_foreach_pw_qpolynomial_fold(
-				data->upwf, &pw_qpolynomial_fold_apply, data);
-
-	isl_map_free(map);
-	return r;
-}
-
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_map_apply_union_pw_qpolynomial_fold(
-	__isl_take isl_union_map *umap,
-	__isl_take isl_union_pw_qpolynomial_fold *upwf, int *tight)
-{
-	isl_dim *dim;
-	enum isl_fold type;
-	struct isl_apply_fold_data data;
-
-	upwf = isl_union_pw_qpolynomial_fold_align_params(upwf,
-				isl_union_map_get_dim(umap));
-	umap = isl_union_map_align_params(umap,
-				isl_union_pw_qpolynomial_fold_get_dim(upwf));
-
-	data.upwf = upwf;
-	data.tight = tight ? 1 : 0;
-	dim = isl_union_pw_qpolynomial_fold_get_dim(upwf);
-	type = isl_union_pw_qpolynomial_fold_get_type(upwf);
-	data.res = isl_union_pw_qpolynomial_fold_zero(dim, type);
-	if (isl_union_map_foreach_map(umap, &map_apply, &data) < 0)
-		goto error;
-
-	isl_union_map_free(umap);
-	isl_union_pw_qpolynomial_fold_free(upwf);
-
-	if (tight)
-		*tight = data.tight;
-
-	return data.res;
-error:
-	isl_union_map_free(umap);
-	isl_union_pw_qpolynomial_fold_free(upwf);
-	isl_union_pw_qpolynomial_fold_free(data.res);
-	return NULL;
-}
-
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_set_apply_union_pw_qpolynomial_fold(
-	__isl_take isl_union_set *uset,
-	__isl_take isl_union_pw_qpolynomial_fold *upwf, int *tight)
-{
-	return isl_union_map_apply_union_pw_qpolynomial_fold(uset, upwf, tight);
-}
-
-/* Reorder the dimension of "fold" according to the given reordering.
- */
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_realign(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_reordering *r)
-{
-	int i;
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold || !r)
-		goto error;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_realign(fold->qp[i],
-						    isl_reordering_copy(r));
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	fold = isl_qpolynomial_fold_reset_dim(fold, isl_dim_copy(r->dim));
-
-	isl_reordering_free(r);
-
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	isl_reordering_free(r);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_mul_isl_int(
-	__isl_take isl_qpolynomial_fold *fold, isl_int v)
-{
-	int i;
-
-	if (isl_int_is_one(v))
-		return fold;
-	if (fold && isl_int_is_zero(v)) {
-		isl_qpolynomial_fold *zero;
-		isl_dim *dim = isl_dim_copy(fold->dim);
-		zero = isl_qpolynomial_fold_empty(fold->type, dim);
-		isl_qpolynomial_fold_free(fold);
-		return zero;
-	}
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold)
-		return NULL;
-
-	if (isl_int_is_neg(v))
-		fold->type = isl_fold_type_negate(fold->type);
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_mul_isl_int(fold->qp[i], v);
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale(
-	__isl_take isl_qpolynomial_fold *fold, isl_int v)
-{
-	return isl_qpolynomial_fold_mul_isl_int(fold, v);
-}
diff --git a/cloog-0.16.3/isl/isl_gmp.c b/cloog-0.16.3/isl/isl_gmp.c
deleted file mode 100644
index 0c8db59..0000000
--- a/cloog-0.16.3/isl/isl_gmp.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl/int.h>
-
-uint32_t isl_gmp_hash(mpz_t v, uint32_t hash)
-{
-	int sa = v[0]._mp_size;
-	int abs_sa = sa < 0 ? -sa : sa;
-	unsigned char *data = (unsigned char *)v[0]._mp_d;
-	unsigned char *end = data + abs_sa * sizeof(v[0]._mp_d[0]);
-
-	if (sa < 0)
-		isl_hash_byte(hash, 0xFF);
-	for (; data < end; ++data)
-		isl_hash_byte(hash, *data);
-	return hash;
-}
diff --git a/cloog-0.16.3/isl/isl_hash.c b/cloog-0.16.3/isl/isl_hash.c
deleted file mode 100644
index 52e3135..0000000
--- a/cloog-0.16.3/isl/isl_hash.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <stdlib.h>
-#include <strings.h>
-#include <isl/hash.h>
-#include <isl/ctx.h>
-#include "isl_config.h"
-
-uint32_t isl_hash_string(uint32_t hash, const char *s)
-{
-	for (; *s; s++)
-		isl_hash_byte(hash, *s);
-	return hash;
-}
-
-uint32_t isl_hash_mem(uint32_t hash, const void *p, size_t len)
-{
-	int i;
-	const char *s = p;
-	for (i = 0; i < len; ++i)
-		isl_hash_byte(hash, s[i]);
-	return hash;
-}
-
-static unsigned int round_up(unsigned int v)
-{
-	int old_v = v;
-
-	while (v) {
-		old_v = v;
-		v ^= v & -v;
-	}
-	return old_v << 1;
-}
-
-int isl_hash_table_init(struct isl_ctx *ctx, struct isl_hash_table *table,
-			int min_size)
-{
-	size_t size;
-
-	if (!table)
-		return -1;
-
-	if (min_size < 2)
-		min_size = 2;
-	table->bits = ffs(round_up(4 * (min_size + 1) / 3 - 1)) - 1;
-	table->n = 0;
-
-	size = 1 << table->bits;
-	table->entries = isl_calloc_array(ctx, struct isl_hash_table_entry,
-					  size);
-	if (!table->entries)
-		return -1;
-
-	return 0;
-}
-
-static int grow_table(struct isl_ctx *ctx, struct isl_hash_table *table,
-			int (*eq)(const void *entry, const void *val))
-{
-	size_t old_size, size;
-	struct isl_hash_table_entry *entries;
-	uint32_t h;
-
-	entries = table->entries;
-	old_size = 1 << table->bits;
-	size = 2 * old_size;
-	table->entries = isl_calloc_array(ctx, struct isl_hash_table_entry,
-					  size);
-	if (!table->entries) {
-		table->entries = entries;
-		return -1;
-	}
-
-	table->bits++;
-
-	for (h = 0; h < old_size; ++h) {
-		struct isl_hash_table_entry *entry;
-
-		if (!entries[h].data)
-			continue;
-
-		entry = isl_hash_table_find(ctx, table, entries[h].hash,
-					    eq, entries[h].data, 1);
-		if (!entry) {
-			table->bits--;
-			free(table->entries);
-			table->entries = entries;
-			return -1;
-		}
-
-		*entry = entries[h];
-	}
-
-	free(entries);
-
-	return 0;
-}
-
-struct isl_hash_table *isl_hash_table_alloc(struct isl_ctx *ctx, int min_size)
-{
-	struct isl_hash_table *table = NULL;
-
-	table = isl_alloc_type(ctx, struct isl_hash_table);
-	if (isl_hash_table_init(ctx, table, min_size))
-		goto error;
-	return table;
-error:
-	isl_hash_table_free(ctx, table);
-	return NULL;
-}
-
-void isl_hash_table_clear(struct isl_hash_table *table)
-{
-	if (!table)
-		return;
-	free(table->entries);
-}
-
-void isl_hash_table_free(struct isl_ctx *ctx, struct isl_hash_table *table)
-{
-	if (!table)
-		return;
-	isl_hash_table_clear(table);
-	free(table);
-}
-
-struct isl_hash_table_entry *isl_hash_table_find(struct isl_ctx *ctx,
-				struct isl_hash_table *table,
-				uint32_t key_hash,
-				int (*eq)(const void *entry, const void *val),
-				const void *val, int reserve)
-{
-	size_t size;
-	uint32_t h, key_bits;
-
-	key_bits = isl_hash_bits(key_hash, table->bits);
-	size = 1 << table->bits;
-	for (h = key_bits; table->entries[h].data; h = (h+1) % size)
-		if (table->entries[h].hash == key_hash &&
-		    eq(table->entries[h].data, val))
-			return &table->entries[h];
-
-	if (!reserve)
-		return NULL;
-
-	if (4 * table->n >= 3 * size) {
-		if (grow_table(ctx, table, eq) < 0)
-			return NULL;
-		return isl_hash_table_find(ctx, table, key_hash, eq, val, 1);
-	}
-
-	table->n++;
-	table->entries[h].hash = key_hash;
-
-	return &table->entries[h];
-}
-
-int isl_hash_table_foreach(struct isl_ctx *ctx,
-				struct isl_hash_table *table,
-				int (*fn)(void **entry, void *user), void *user)
-{
-	size_t size;
-	uint32_t h;
-
-	size = 1 << table->bits;
-	for (h = 0; h < size; ++ h)
-		if (table->entries[h].data &&
-		    fn(&table->entries[h].data, user) < 0)
-			return -1;
-	
-	return 0;
-}
-
-void isl_hash_table_remove(struct isl_ctx *ctx,
-				struct isl_hash_table *table,
-				struct isl_hash_table_entry *entry)
-{
-	int h, h2;
-	size_t size;
-
-	if (!table || !entry)
-		return;
-
-	size = 1 << table->bits;
-	h = entry - table->entries;
-	isl_assert(ctx, h >= 0 && h < size, return);
-
-	for (h2 = h+1; table->entries[h2 % size].data; h2++) {
-		uint32_t bits = isl_hash_bits(table->entries[h2 % size].hash,
-						table->bits);
-		uint32_t offset = (size + bits - (h+1)) % size;
-		if (offset <= h2 - (h+1))
-			continue;
-		*entry = table->entries[h2 % size];
-		h = h2;
-		entry = &table->entries[h % size];
-	}
-
-	entry->hash = 0;
-	entry->data = NULL;
-	table->n--;
-}
diff --git a/cloog-0.16.3/isl/isl_hmap_map_basic_set.c b/cloog-0.16.3/isl/isl_hmap_map_basic_set.c
deleted file mode 100644
index b303516..0000000
--- a/cloog-0.16.3/isl/isl_hmap_map_basic_set.c
+++ /dev/null
@@ -1,102 +0,0 @@
-#include <isl_hmap_map_basic_set.h>
-
-struct isl_map_basic_set_pair {
-	isl_map		*key;
-	isl_basic_set	*val;
-};
-
-__isl_give isl_hmap_map_basic_set *isl_hmap_map_basic_set_alloc(isl_ctx *ctx,
-	int min_size)
-{
-	return (isl_hmap_map_basic_set *) isl_hash_table_alloc(ctx, min_size);
-}
-
-static int free_pair(void **entry, void *user)
-{
-	struct isl_map_basic_set_pair *pair = *entry;
-	isl_map_free(pair->key);
-	isl_basic_set_free(pair->val);
-	free(pair);
-	*entry = NULL;
-	return 0;
-}
-
-void isl_hmap_map_basic_set_free(isl_ctx *ctx,
-	__isl_take isl_hmap_map_basic_set *hmap)
-{
-	if (!hmap)
-		return;
-	isl_hash_table_foreach(ctx, &hmap->table, &free_pair, NULL);
-	isl_hash_table_free(ctx, &hmap->table);
-}
-
-static int has_key(const void *entry, const void *key)
-{
-	const struct isl_map_basic_set_pair *pair = entry;
-	isl_map *map = (isl_map *)key;
-
-	return isl_map_plain_is_equal(pair->key, map);
-}
-
-int isl_hmap_map_basic_set_has(isl_ctx *ctx,
-	__isl_keep isl_hmap_map_basic_set *hmap, __isl_keep isl_map *key)
-{
-	uint32_t hash;
-
-	hash = isl_map_get_hash(key);
-	return !!isl_hash_table_find(ctx, &hmap->table, hash, &has_key, key, 0);
-}
-
-__isl_give isl_basic_set *isl_hmap_map_basic_set_get(isl_ctx *ctx,
-	__isl_keep isl_hmap_map_basic_set *hmap, __isl_take isl_map *key)
-{
-	struct isl_hash_table_entry *entry;
-	struct isl_map_basic_set_pair *pair;
-	uint32_t hash;
-
-	hash = isl_map_get_hash(key);
-	entry = isl_hash_table_find(ctx, &hmap->table, hash, &has_key, key, 0);
-	isl_map_free(key);
-
-	if (!entry)
-		return NULL;
-
-	pair = entry->data;
-
-	return isl_basic_set_copy(pair->val);
-}
-
-int isl_hmap_map_basic_set_set(isl_ctx *ctx,
-	__isl_keep isl_hmap_map_basic_set *hmap, __isl_take isl_map *key,
-	__isl_take isl_basic_set *val)
-{
-	struct isl_hash_table_entry *entry;
-	struct isl_map_basic_set_pair *pair;
-	uint32_t hash;
-
-	hash = isl_map_get_hash(key);
-	entry = isl_hash_table_find(ctx, &hmap->table, hash, &has_key, key, 1);
-
-	if (!entry)
-		return -1;
-
-	if (entry->data) {
-		pair = entry->data;
-		isl_basic_set_free(pair->val);
-		pair->val = val;
-		isl_map_free(key);
-		return 0;
-	}
-
-	pair = isl_alloc_type(ctx, struct isl_map_basic_set_pair);
-	if (!pair) {
-		isl_map_free(key);
-		isl_basic_set_free(val);
-		return -1;
-	}
-
-	entry->data = pair;
-	pair->key = key;
-	pair->val = val;
-	return 0;
-}
diff --git a/cloog-0.16.3/isl/isl_hmap_map_basic_set.h b/cloog-0.16.3/isl/isl_hmap_map_basic_set.h
deleted file mode 100644
index 905791d..0000000
--- a/cloog-0.16.3/isl/isl_hmap_map_basic_set.h
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifndef ISL_HMAP_MAP_BASIC_SET_H
-#define ISL_HMAP_MAP_BASIC_SET_H
-
-#include <isl/hash.h>
-#include <isl/map.h>
-#include <isl/set.h>
-
-struct isl_hmap_map_basic_set {
-	struct isl_hash_table table;
-};
-typedef struct isl_hmap_map_basic_set	isl_hmap_map_basic_set;
-
-__isl_give isl_hmap_map_basic_set *isl_hmap_map_basic_set_alloc( isl_ctx *ctx,
-	int min_size);
-void isl_hmap_map_basic_set_free(isl_ctx *ctx,
-	__isl_take isl_hmap_map_basic_set *hmap);
-
-int isl_hmap_map_basic_set_has(isl_ctx *ctx,
-	__isl_keep isl_hmap_map_basic_set *hmap, __isl_keep isl_map *key);
-__isl_give isl_basic_set *isl_hmap_map_basic_set_get(isl_ctx *ctx,
-	__isl_keep isl_hmap_map_basic_set *hmap, __isl_take isl_map *key);
-int isl_hmap_map_basic_set_set(isl_ctx *ctx,
-	__isl_keep isl_hmap_map_basic_set *hmap, __isl_take isl_map *key,
-	__isl_take isl_basic_set *val);
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_ilp.c b/cloog-0.16.3/isl/isl_ilp.c
deleted file mode 100644
index 1994a68..0000000
--- a/cloog-0.16.3/isl/isl_ilp.c
+++ /dev/null
@@ -1,479 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl/ilp.h>
-#include "isl_sample.h"
-#include <isl/seq.h>
-#include "isl_equalities.h"
-#include <isl_aff_private.h>
-#include <isl_local_space_private.h>
-#include <isl_mat_private.h>
-
-/* Given a basic set "bset", construct a basic set U such that for
- * each element x in U, the whole unit box positioned at x is inside
- * the given basic set.
- * Note that U may not contain all points that satisfy this property.
- *
- * We simply add the sum of all negative coefficients to the constant
- * term.  This ensures that if x satisfies the resulting constraints,
- * then x plus any sum of unit vectors satisfies the original constraints.
- */
-static struct isl_basic_set *unit_box_base_points(struct isl_basic_set *bset)
-{
-	int i, j, k;
-	struct isl_basic_set *unit_box = NULL;
-	unsigned total;
-
-	if (!bset)
-		goto error;
-
-	if (bset->n_eq != 0) {
-		unit_box = isl_basic_set_empty_like(bset);
-		isl_basic_set_free(bset);
-		return unit_box;
-	}
-
-	total = isl_basic_set_total_dim(bset);
-	unit_box = isl_basic_set_alloc_dim(isl_basic_set_get_dim(bset),
-					0, 0, bset->n_ineq);
-
-	for (i = 0; i < bset->n_ineq; ++i) {
-		k = isl_basic_set_alloc_inequality(unit_box);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(unit_box->ineq[k], bset->ineq[i], 1 + total);
-		for (j = 0; j < total; ++j) {
-			if (isl_int_is_nonneg(unit_box->ineq[k][1 + j]))
-				continue;
-			isl_int_add(unit_box->ineq[k][0],
-				unit_box->ineq[k][0], unit_box->ineq[k][1 + j]);
-		}
-	}
-
-	isl_basic_set_free(bset);
-	return unit_box;
-error:
-	isl_basic_set_free(bset);
-	isl_basic_set_free(unit_box);
-	return NULL;
-}
-
-/* Find an integer point in "bset", preferably one that is
- * close to minimizing "f".
- *
- * We first check if we can easily put unit boxes inside bset.
- * If so, we take the best base point of any of the unit boxes we can find
- * and round it up to the nearest integer.
- * If not, we simply pick any integer point in "bset".
- */
-static struct isl_vec *initial_solution(struct isl_basic_set *bset, isl_int *f)
-{
-	enum isl_lp_result res;
-	struct isl_basic_set *unit_box;
-	struct isl_vec *sol;
-
-	unit_box = unit_box_base_points(isl_basic_set_copy(bset));
-
-	res = isl_basic_set_solve_lp(unit_box, 0, f, bset->ctx->one,
-					NULL, NULL, &sol);
-	if (res == isl_lp_ok) {
-		isl_basic_set_free(unit_box);
-		return isl_vec_ceil(sol);
-	}
-
-	isl_basic_set_free(unit_box);
-
-	return isl_basic_set_sample_vec(isl_basic_set_copy(bset));
-}
-
-/* Restrict "bset" to those points with values for f in the interval [l, u].
- */
-static struct isl_basic_set *add_bounds(struct isl_basic_set *bset,
-	isl_int *f, isl_int l, isl_int u)
-{
-	int k;
-	unsigned total;
-
-	total = isl_basic_set_total_dim(bset);
-	bset = isl_basic_set_extend_constraints(bset, 0, 2);
-
-	k = isl_basic_set_alloc_inequality(bset);
-	if (k < 0)
-		goto error;
-	isl_seq_cpy(bset->ineq[k], f, 1 + total);
-	isl_int_sub(bset->ineq[k][0], bset->ineq[k][0], l);
-
-	k = isl_basic_set_alloc_inequality(bset);
-	if (k < 0)
-		goto error;
-	isl_seq_neg(bset->ineq[k], f, 1 + total);
-	isl_int_add(bset->ineq[k][0], bset->ineq[k][0], u);
-
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Find an integer point in "bset" that minimizes f (in any) such that
- * the value of f lies inside the interval [l, u].
- * Return this integer point if it can be found.
- * Otherwise, return sol.
- *
- * We perform a number of steps until l > u.
- * In each step, we look for an integer point with value in either
- * the whole interval [l, u] or half of the interval [l, l+floor(u-l-1/2)].
- * The choice depends on whether we have found an integer point in the
- * previous step.  If so, we look for the next point in half of the remaining
- * interval.
- * If we find a point, the current solution is updated and u is set
- * to its value minus 1.
- * If no point can be found, we update l to the upper bound of the interval
- * we checked (u or l+floor(u-l-1/2)) plus 1.
- */
-static struct isl_vec *solve_ilp_search(struct isl_basic_set *bset,
-	isl_int *f, isl_int *opt, struct isl_vec *sol, isl_int l, isl_int u)
-{
-	isl_int tmp;
-	int divide = 1;
-
-	isl_int_init(tmp);
-
-	while (isl_int_le(l, u)) {
-		struct isl_basic_set *slice;
-		struct isl_vec *sample;
-
-		if (!divide)
-			isl_int_set(tmp, u);
-		else {
-			isl_int_sub(tmp, u, l);
-			isl_int_fdiv_q_ui(tmp, tmp, 2);
-			isl_int_add(tmp, tmp, l);
-		}
-		slice = add_bounds(isl_basic_set_copy(bset), f, l, tmp);
-		sample = isl_basic_set_sample_vec(slice);
-		if (!sample) {
-			isl_vec_free(sol);
-			sol = NULL;
-			break;
-		}
-		if (sample->size > 0) {
-			isl_vec_free(sol);
-			sol = sample;
-			isl_seq_inner_product(f, sol->el, sol->size, opt);
-			isl_int_sub_ui(u, *opt, 1);
-			divide = 1;
-		} else {
-			isl_vec_free(sample);
-			if (!divide)
-				break;
-			isl_int_add_ui(l, tmp, 1);
-			divide = 0;
-		}
-	}
-
-	isl_int_clear(tmp);
-
-	return sol;
-}
-
-/* Find an integer point in "bset" that minimizes f (if any).
- * If sol_p is not NULL then the integer point is returned in *sol_p.
- * The optimal value of f is returned in *opt.
- *
- * The algorithm maintains a currently best solution and an interval [l, u]
- * of values of f for which integer solutions could potentially still be found.
- * The initial value of the best solution so far is any solution.
- * The initial value of l is minimal value of f over the rationals
- * (rounded up to the nearest integer).
- * The initial value of u is the value of f at the initial solution minus 1.
- *
- * We then call solve_ilp_search to perform a binary search on the interval.
- */
-static enum isl_lp_result solve_ilp(struct isl_basic_set *bset,
-				      isl_int *f, isl_int *opt,
-				      struct isl_vec **sol_p)
-{
-	enum isl_lp_result res;
-	isl_int l, u;
-	struct isl_vec *sol;
-
-	res = isl_basic_set_solve_lp(bset, 0, f, bset->ctx->one,
-					opt, NULL, &sol);
-	if (res == isl_lp_ok && isl_int_is_one(sol->el[0])) {
-		if (sol_p)
-			*sol_p = sol;
-		else
-			isl_vec_free(sol);
-		return isl_lp_ok;
-	}
-	isl_vec_free(sol);
-	if (res == isl_lp_error || res == isl_lp_empty)
-		return res;
-
-	sol = initial_solution(bset, f);
-	if (!sol)
-		return isl_lp_error;
-	if (sol->size == 0) {
-		isl_vec_free(sol);
-		return isl_lp_empty;
-	}
-	if (res == isl_lp_unbounded) {
-		isl_vec_free(sol);
-		return isl_lp_unbounded;
-	}
-
-	isl_int_init(l);
-	isl_int_init(u);
-
-	isl_int_set(l, *opt);
-
-	isl_seq_inner_product(f, sol->el, sol->size, opt);
-	isl_int_sub_ui(u, *opt, 1);
-
-	sol = solve_ilp_search(bset, f, opt, sol, l, u);
-	if (!sol)
-		res = isl_lp_error;
-
-	isl_int_clear(l);
-	isl_int_clear(u);
-
-	if (sol_p)
-		*sol_p = sol;
-	else
-		isl_vec_free(sol);
-
-	return res;
-}
-
-static enum isl_lp_result solve_ilp_with_eq(struct isl_basic_set *bset, int max,
-				      isl_int *f, isl_int *opt,
-				      struct isl_vec **sol_p)
-{
-	unsigned dim;
-	enum isl_lp_result res;
-	struct isl_mat *T = NULL;
-	struct isl_vec *v;
-
-	bset = isl_basic_set_copy(bset);
-	dim = isl_basic_set_total_dim(bset);
-	v = isl_vec_alloc(bset->ctx, 1 + dim);
-	if (!v)
-		goto error;
-	isl_seq_cpy(v->el, f, 1 + dim);
-	bset = isl_basic_set_remove_equalities(bset, &T, NULL);
-	v = isl_vec_mat_product(v, isl_mat_copy(T));
-	if (!v)
-		goto error;
-	res = isl_basic_set_solve_ilp(bset, max, v->el, opt, sol_p);
-	isl_vec_free(v);
-	if (res == isl_lp_ok && sol_p) {
-		*sol_p = isl_mat_vec_product(T, *sol_p);
-		if (!*sol_p)
-			res = isl_lp_error;
-	} else
-		isl_mat_free(T);
-	isl_basic_set_free(bset);
-	return res;
-error:
-	isl_mat_free(T);
-	isl_basic_set_free(bset);
-	return isl_lp_error;
-}
-
-/* Find an integer point in "bset" that minimizes (or maximizes if max is set)
- * f (if any).
- * If sol_p is not NULL then the integer point is returned in *sol_p.
- * The optimal value of f is returned in *opt.
- *
- * If there is any equality among the points in "bset", then we first
- * project it out.  Otherwise, we continue with solve_ilp above.
- */
-enum isl_lp_result isl_basic_set_solve_ilp(struct isl_basic_set *bset, int max,
-				      isl_int *f, isl_int *opt,
-				      struct isl_vec **sol_p)
-{
-	unsigned dim;
-	enum isl_lp_result res;
-
-	if (!bset)
-		return isl_lp_error;
-	if (sol_p)
-		*sol_p = NULL;
-
-	isl_assert(bset->ctx, isl_basic_set_n_param(bset) == 0, goto error);
-
-	if (isl_basic_set_plain_is_empty(bset))
-		return isl_lp_empty;
-
-	if (bset->n_eq)
-		return solve_ilp_with_eq(bset, max, f, opt, sol_p);
-
-	dim = isl_basic_set_total_dim(bset);
-
-	if (max)
-		isl_seq_neg(f, f, 1 + dim);
-
-	res = solve_ilp(bset, f, opt, sol_p);
-
-	if (max) {
-		isl_seq_neg(f, f, 1 + dim);
-		isl_int_neg(*opt, *opt);
-	}
-
-	return res;
-error:
-	isl_basic_set_free(bset);
-	return isl_lp_error;
-}
-
-static enum isl_lp_result basic_set_opt(__isl_keep isl_basic_set *bset, int max,
-	__isl_keep isl_aff *obj, isl_int *opt)
-{
-	enum isl_lp_result res;
-
-	if (!obj)
-		return isl_lp_error;
-	bset = isl_basic_set_copy(bset);
-	bset = isl_basic_set_underlying_set(bset);
-	res = isl_basic_set_solve_ilp(bset, max, obj->v->el + 1, opt, NULL);
-	isl_basic_set_free(bset);
-	return res;
-}
-
-static __isl_give isl_mat *extract_divs(__isl_keep isl_basic_set *bset)
-{
-	int i;
-	isl_ctx *ctx = isl_basic_set_get_ctx(bset);
-	isl_mat *div;
-
-	div = isl_mat_alloc(ctx, bset->n_div,
-			    1 + 1 + isl_basic_set_total_dim(bset));
-	if (!div)
-		return NULL;
-
-	for (i = 0; i < bset->n_div; ++i)
-		isl_seq_cpy(div->row[i], bset->div[i], div->n_col);
-
-	return div;
-}
-
-enum isl_lp_result isl_basic_set_opt(__isl_keep isl_basic_set *bset, int max,
-	__isl_keep isl_aff *obj, isl_int *opt)
-{
-	int *exp1 = NULL;
-	int *exp2 = NULL;
-	isl_ctx *ctx;
-	isl_mat *bset_div = NULL;
-	isl_mat *div = NULL;
-	enum isl_lp_result res;
-
-	if (!bset || !obj)
-		return isl_lp_error;
-
-	ctx = isl_aff_get_ctx(obj);
-	if (!isl_dim_equal(bset->dim, obj->ls->dim))
-		isl_die(ctx, isl_error_invalid,
-			"spaces don't match", return isl_lp_error);
-	if (!isl_int_is_one(obj->v->el[0]))
-		isl_die(ctx, isl_error_unsupported,
-			"expecting integer affine expression",
-			return isl_lp_error);
-
-	if (bset->n_div == 0 && obj->ls->div->n_row == 0)
-		return basic_set_opt(bset, max, obj, opt);
-
-	bset = isl_basic_set_copy(bset);
-	obj = isl_aff_copy(obj);
-
-	bset_div = extract_divs(bset);
-	exp1 = isl_alloc_array(ctx, int, bset_div->n_row);
-	exp2 = isl_alloc_array(ctx, int, obj->ls->div->n_row);
-	if (!bset_div || !exp1 || !exp2)
-		goto error;
-
-	div = isl_merge_divs(bset_div, obj->ls->div, exp1, exp2);
-
-	bset = isl_basic_set_expand_divs(bset, isl_mat_copy(div), exp1);
-	obj = isl_aff_expand_divs(obj, isl_mat_copy(div), exp2);
-
-	res = basic_set_opt(bset, max, obj, opt);
-
-	isl_mat_free(bset_div);
-	isl_mat_free(div);
-	free(exp1);
-	free(exp2);
-	isl_basic_set_free(bset);
-	isl_aff_free(obj);
-
-	return res;
-error:
-	isl_mat_free(div);
-	isl_mat_free(bset_div);
-	free(exp1);
-	free(exp2);
-	isl_basic_set_free(bset);
-	isl_aff_free(obj);
-	return isl_lp_error;
-}
-
-/* Compute the minimum (maximum if max is set) of the integer affine
- * expression obj over the points in set and put the result in *opt.
- */
-enum isl_lp_result isl_set_opt(__isl_keep isl_set *set, int max,
-	__isl_keep isl_aff *obj, isl_int *opt)
-{
-	int i;
-	enum isl_lp_result res;
-	int empty = 1;
-	isl_int opt_i;
-
-	if (!set || !obj)
-		return isl_lp_error;
-	if (set->n == 0)
-		return isl_lp_empty;
-
-	res = isl_basic_set_opt(set->p[0], max, obj, opt);
-	if (res == isl_lp_error || res == isl_lp_unbounded)
-		return res;
-	if (set->n == 1)
-		return res;
-	if (res == isl_lp_ok)
-		empty = 0;
-
-	isl_int_init(opt_i);
-	for (i = 1; i < set->n; ++i) {
-		res = isl_basic_set_opt(set->p[i], max, obj, &opt_i);
-		if (res == isl_lp_error || res == isl_lp_unbounded) {
-			isl_int_clear(opt_i);
-			return res;
-		}
-		if (res == isl_lp_ok)
-			empty = 0;
-		if (isl_int_gt(opt_i, *opt))
-			isl_int_set(*opt, opt_i);
-	}
-	isl_int_clear(opt_i);
-
-	return empty ? isl_lp_empty : isl_lp_ok;
-}
-
-enum isl_lp_result isl_basic_set_max(__isl_keep isl_basic_set *bset,
-	__isl_keep isl_aff *obj, isl_int *opt)
-{
-	return isl_basic_set_opt(bset, 1, obj, opt);
-}
-
-enum isl_lp_result isl_set_max(__isl_keep isl_set *set,
-	__isl_keep isl_aff *obj, isl_int *opt)
-{
-	return isl_set_opt(set, 1, obj, opt);
-}
diff --git a/cloog-0.16.3/isl/isl_input.c b/cloog-0.16.3/isl/isl_input.c
deleted file mode 100644
index a1cf268..0000000
--- a/cloog-0.16.3/isl/isl_input.c
+++ /dev/null
@@ -1,2554 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France 
- */
-
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl/set.h>
-#include <isl/seq.h>
-#include <isl/div.h>
-#include <isl/stream.h>
-#include <isl/obj.h>
-#include "isl_polynomial_private.h"
-#include <isl/union_map.h>
-#include <isl_mat_private.h>
-
-struct variable {
-	char    	    	*name;
-	int	     		 pos;
-	isl_vec			*def;
-	/* non-zero if variable represents a min (-1) or a max (1) */
-	int			 sign;
-	isl_mat			*list;
-	struct variable		*next;
-};
-
-struct vars {
-	struct isl_ctx	*ctx;
-	int		 n;
-	struct variable	*v;
-};
-
-static struct vars *vars_new(struct isl_ctx *ctx)
-{
-	struct vars *v;
-	v = isl_alloc_type(ctx, struct vars);
-	if (!v)
-		return NULL;
-	v->ctx = ctx;
-	v->n = 0;
-	v->v = NULL;
-	return v;
-}
-
-static void variable_free(struct variable *var)
-{
-	while (var) {
-		struct variable *next = var->next;
-		isl_mat_free(var->list);
-		isl_vec_free(var->def);
-		free(var->name);
-		free(var);
-		var = next;
-	}
-}
-
-static void vars_free(struct vars *v)
-{
-	if (!v)
-		return;
-	variable_free(v->v);
-	free(v);
-}
-
-static void vars_drop(struct vars *v, int n)
-{
-	struct variable *var;
-
-	if (!v || !v->v)
-		return;
-
-	v->n -= n;
-
-	var = v->v;
-	while (--n >= 0) {
-		struct variable *next = var->next;
-		isl_mat_free(var->list);
-		isl_vec_free(var->def);
-		free(var->name);
-		free(var);
-		var = next;
-	}
-	v->v = var;
-}
-
-static struct variable *variable_new(struct vars *v, const char *name, int len,
-				int pos)
-{
-	struct variable *var;
-	var = isl_calloc_type(v->ctx, struct variable);
-	if (!var)
-		goto error;
-	var->name = strdup(name);
-	var->name[len] = '\0';
-	var->pos = pos;
-	var->def = NULL;
-	var->next = v->v;
-	return var;
-error:
-	variable_free(v->v);
-	return NULL;
-}
-
-static int vars_pos(struct vars *v, const char *s, int len)
-{
-	int pos;
-	struct variable *q;
-
-	if (len == -1)
-		len = strlen(s);
-	for (q = v->v; q; q = q->next) {
-		if (strncmp(q->name, s, len) == 0 && q->name[len] == '\0')
-			break;
-	}
-	if (q)
-		pos = q->pos;
-	else {
-		pos = v->n;
-		v->v = variable_new(v, s, len, v->n);
-		if (!v->v)
-			return -1;
-		v->n++;
-	}
-	return pos;
-}
-
-static int vars_add_anon(struct vars *v)
-{
-	v->v = variable_new(v, "", 0, v->n);
-
-	if (!v->v)
-		return -1;
-	v->n++;
-
-	return 0;
-}
-
-static __isl_give isl_basic_map *set_name(__isl_take isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned pos, char *name)
-{
-	char *prime;
-
-	if (!bmap)
-		return NULL;
-	if (!name)
-		return bmap;
-
-	prime = strchr(name, '\'');
-	if (prime)
-		*prime = '\0';
-	bmap = isl_basic_map_set_dim_name(bmap, type, pos, name);
-	if (prime)
-		*prime = '\'';
-
-	return bmap;
-}
-
-/* Obtain next token, with some preprocessing.
- * In particular, evaluate expressions of the form x^y,
- * with x and y values.
- */
-static struct isl_token *next_token(struct isl_stream *s)
-{
-	struct isl_token *tok, *tok2;
-
-	tok = isl_stream_next_token(s);
-	if (!tok || tok->type != ISL_TOKEN_VALUE)
-		return tok;
-	if (!isl_stream_eat_if_available(s, '^'))
-		return tok;
-	tok2 = isl_stream_next_token(s);
-	if (!tok2 || tok2->type != ISL_TOKEN_VALUE) {
-		isl_stream_error(s, tok2, "expecting constant value");
-		goto error;
-	}
-
-	isl_int_pow_ui(tok->u.v, tok->u.v, isl_int_get_ui(tok2->u.v));
-
-	isl_token_free(tok2);
-	return tok;
-error:
-	isl_token_free(tok);
-	isl_token_free(tok2);
-	return NULL;
-}
-
-static int accept_cst_factor(struct isl_stream *s, isl_int *f)
-{
-	struct isl_token *tok;
-
-	tok = next_token(s);
-	if (!tok || tok->type != ISL_TOKEN_VALUE) {
-		isl_stream_error(s, tok, "expecting constant value");
-		goto error;
-	}
-
-	isl_int_mul(*f, *f, tok->u.v);
-
-	isl_token_free(tok);
-
-	if (isl_stream_eat_if_available(s, '*'))
-		return accept_cst_factor(s, f);
-
-	return 0;
-error:
-	isl_token_free(tok);
-	return -1;
-}
-
-/* Given an affine expression aff, return an affine expression
- * for aff % d, with d the next token on the stream, which is
- * assumed to be a constant.
- *
- * We introduce an integer division q = [aff/d] and the result
- * is set to aff - d q.
- */
-static __isl_give isl_vec *affine_mod(struct isl_stream *s,
-	struct vars *v, __isl_take isl_vec *aff)
-{
-	struct isl_token *tok;
-	struct variable *var;
-	isl_vec *mod;
-
-	tok = next_token(s);
-	if (!tok || tok->type != ISL_TOKEN_VALUE) {
-		isl_stream_error(s, tok, "expecting constant value");
-		goto error;
-	}
-
-	if (vars_add_anon(v) < 0)
-		goto error;
-
-	var = v->v;
-
-	var->def = isl_vec_alloc(s->ctx, 2 + v->n);
-	if (!var->def)
-		goto error;
-	isl_seq_cpy(var->def->el + 1, aff->el, aff->size);
-	isl_int_set_si(var->def->el[1 + aff->size], 0);
-	isl_int_set(var->def->el[0], tok->u.v);
-
-	mod = isl_vec_alloc(v->ctx, 1 + v->n);
-	if (!mod)
-		goto error;
-
-	isl_seq_cpy(mod->el, aff->el, aff->size);
-	isl_int_neg(mod->el[aff->size], tok->u.v);
-
-	isl_vec_free(aff);
-	isl_token_free(tok);
-	return mod;
-error:
-	isl_vec_free(aff);
-	isl_token_free(tok);
-	return NULL;
-}
-
-static struct isl_vec *accept_affine(struct isl_stream *s, struct vars *v);
-static int read_div_definition(struct isl_stream *s, struct vars *v);
-static int read_minmax_definition(struct isl_stream *s, struct vars *v);
-
-static __isl_give isl_vec *accept_affine_factor(struct isl_stream *s,
-	struct vars *v)
-{
-	struct isl_token *tok = NULL;
-	isl_vec *aff = NULL;
-
-	tok = next_token(s);
-	if (!tok) {
-		isl_stream_error(s, NULL, "unexpected EOF");
-		goto error;
-	}
-	if (tok->type == ISL_TOKEN_IDENT) {
-		int n = v->n;
-		int pos = vars_pos(v, tok->u.s, -1);
-		if (pos < 0)
-			goto error;
-		if (pos >= n) {
-			isl_stream_error(s, tok, "unknown identifier");
-			goto error;
-		}
-
-		aff = isl_vec_alloc(v->ctx, 1 + v->n);
-		if (!aff)
-			goto error;
-		isl_seq_clr(aff->el, aff->size);
-		isl_int_set_si(aff->el[1 + pos], 1);
-		isl_token_free(tok);
-	} else if (tok->type == ISL_TOKEN_VALUE) {
-		if (isl_stream_eat_if_available(s, '*')) {
-			aff = accept_affine_factor(s, v);
-			aff = isl_vec_scale(aff, tok->u.v);
-		} else {
-			aff = isl_vec_alloc(v->ctx, 1 + v->n);
-			if (!aff)
-				goto error;
-			isl_seq_clr(aff->el, aff->size);
-			isl_int_set(aff->el[0], tok->u.v);
-		}
-		isl_token_free(tok);
-	} else if (tok->type == '(') {
-		isl_token_free(tok);
-		tok = NULL;
-		aff = accept_affine(s, v);
-		if (!aff)
-			goto error;
-		if (isl_stream_eat(s, ')'))
-			goto error;
-	} else if (tok->type == '[' ||
-		    tok->type == ISL_TOKEN_FLOORD ||
-		    tok->type == ISL_TOKEN_CEILD) {
-		int ceil = tok->type == ISL_TOKEN_CEILD;
-		struct variable *var;
-		if (vars_add_anon(v) < 0)
-			goto error;
-		var = v->v;
-		aff = isl_vec_alloc(v->ctx, 1 + v->n);
-		if (!aff)
-			goto error;
-		isl_seq_clr(aff->el, aff->size);
-		isl_int_set_si(aff->el[1 + v->n - 1], ceil ? -1 : 1);
-		isl_stream_push_token(s, tok);
-		tok = NULL;
-		if (read_div_definition(s, v) < 0)
-			goto error;
-		if (ceil)
-			isl_seq_neg(var->def->el + 1, var->def->el + 1,
-				    var->def->size - 1);
-		aff = isl_vec_zero_extend(aff, 1 + v->n);
-	} else if (tok->type == ISL_TOKEN_MIN || tok->type == ISL_TOKEN_MAX) {
-		if (vars_add_anon(v) < 0)
-			goto error;
-		aff = isl_vec_alloc(v->ctx, 1 + v->n);
-		if (!aff)
-			goto error;
-		isl_seq_clr(aff->el, aff->size);
-		isl_int_set_si(aff->el[1 + v->n - 1], 1);
-		isl_stream_push_token(s, tok);
-		tok = NULL;
-		if (read_minmax_definition(s, v) < 0)
-			goto error;
-		aff = isl_vec_zero_extend(aff, 1 + v->n);
-	} else {
-		isl_stream_error(s, tok, "expecting factor");
-		goto error;
-	}
-	if (isl_stream_eat_if_available(s, '%'))
-		return affine_mod(s, v, aff);
-	if (isl_stream_eat_if_available(s, '*')) {
-		isl_int f;
-		isl_int_init(f);
-		isl_int_set_si(f, 1);
-		if (accept_cst_factor(s, &f) < 0) {
-			isl_int_clear(f);
-			goto error2;
-		}
-		aff = isl_vec_scale(aff, f);
-		isl_int_clear(f);
-	}
-
-	return aff;
-error:
-	isl_token_free(tok);
-error2:
-	isl_vec_free(aff);
-	return NULL;
-}
-
-static struct isl_vec *accept_affine(struct isl_stream *s, struct vars *v)
-{
-	struct isl_token *tok = NULL;
-	struct isl_vec *aff;
-	int sign = 1;
-
-	aff = isl_vec_alloc(v->ctx, 1 + v->n);
-	if (!aff)
-		return NULL;
-	isl_seq_clr(aff->el, aff->size);
-
-	for (;;) {
-		tok = next_token(s);
-		if (!tok) {
-			isl_stream_error(s, NULL, "unexpected EOF");
-			goto error;
-		}
-		if (tok->type == '-') {
-			sign = -sign;
-			isl_token_free(tok);
-			continue;
-		}
-		if (tok->type == '(' || tok->type == '[' ||
-		    tok->type == ISL_TOKEN_MIN || tok->type == ISL_TOKEN_MAX ||
-		    tok->type == ISL_TOKEN_FLOORD ||
-		    tok->type == ISL_TOKEN_CEILD ||
-		    tok->type == ISL_TOKEN_IDENT) {
-			isl_vec *aff2;
-			isl_stream_push_token(s, tok);
-			tok = NULL;
-			aff2 = accept_affine_factor(s, v);
-			if (sign < 0)
-				aff2 = isl_vec_scale(aff2, s->ctx->negone);
-			aff = isl_vec_zero_extend(aff, 1 + v->n);
-			aff = isl_vec_add(aff, aff2);
-			if (!aff)
-				goto error;
-			sign = 1;
-		} else if (tok->type == ISL_TOKEN_VALUE) {
-			if (sign < 0)
-				isl_int_neg(tok->u.v, tok->u.v);
-			if (isl_stream_eat_if_available(s, '*') ||
-			    isl_stream_next_token_is(s, ISL_TOKEN_IDENT)) {
-				isl_vec *aff2;
-				aff2 = accept_affine_factor(s, v);
-				aff2 = isl_vec_scale(aff2, tok->u.v);
-				aff = isl_vec_zero_extend(aff, 1 + v->n);
-				aff = isl_vec_add(aff, aff2);
-				if (!aff)
-					goto error;
-			} else {
-				isl_int_add(aff->el[0], aff->el[0], tok->u.v);
-			}
-			sign = 1;
-		} else {
-			isl_stream_error(s, tok, "unexpected isl_token");
-			isl_stream_push_token(s, tok);
-			isl_vec_free(aff);
-			return NULL;
-		}
-		isl_token_free(tok);
-
-		tok = next_token(s);
-		if (tok && tok->type == '-') {
-			sign = -sign;
-			isl_token_free(tok);
-		} else if (tok && tok->type == '+') {
-			/* nothing */
-			isl_token_free(tok);
-		} else if (tok && tok->type == ISL_TOKEN_VALUE &&
-			   isl_int_is_neg(tok->u.v)) {
-			isl_stream_push_token(s, tok);
-		} else {
-			if (tok)
-				isl_stream_push_token(s, tok);
-			break;
-		}
-	}
-
-	return aff;
-error:
-	isl_token_free(tok);
-	isl_vec_free(aff);
-	return NULL;
-}
-
-/* Add any variables in the variable list "v" that are not already in "bmap"
- * as existentially quantified variables in "bmap".
- */
-static __isl_give isl_basic_map *add_divs(__isl_take isl_basic_map *bmap,
-	struct vars *v)
-{
-	int i;
-	int extra;
-	struct variable *var;
-
-	extra = v->n - isl_basic_map_total_dim(bmap);
-
-	if (extra == 0)
-		return bmap;
-
-	bmap = isl_basic_map_extend_dim(bmap, isl_basic_map_get_dim(bmap),
-					extra, 0, 2 * extra);
-
-	for (i = 0; i < extra; ++i)
-		if (isl_basic_map_alloc_div(bmap) < 0)
-			goto error;
-
-	for (i = 0, var = v->v; i < extra; ++i, var = var->next) {
-		int k = bmap->n_div - 1 - i;
-
-		isl_seq_cpy(bmap->div[k], var->def->el, var->def->size);
-		isl_seq_clr(bmap->div[k] + var->def->size,
-			    2 + v->n - var->def->size);
-
-		if (isl_basic_map_add_div_constraints(bmap, k) < 0)
-			goto error;
-	}
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static __isl_give isl_basic_map *read_var_def(struct isl_stream *s,
-	__isl_take isl_basic_map *bmap, enum isl_dim_type type, struct vars *v)
-{
-	isl_dim *dim;
-	isl_basic_map *def = NULL;
-	struct isl_vec *vec;
-	int k;
-	int n;
-
-	if (vars_add_anon(v) < 0)
-		goto error;
-	n = v->n;
-
-	vec = accept_affine(s, v);
-	if (!vec)
-		goto error;
-
-	dim = isl_basic_map_get_dim(bmap);
-	def = isl_basic_map_universe(dim);
-	def = add_divs(def, v);
-	def = isl_basic_map_extend_constraints(def, 1, 0);
-	k = isl_basic_map_alloc_equality(def);
-	if (k >= 0) {
-		isl_seq_cpy(def->eq[k], vec->el, vec->size);
-		isl_int_set_si(def->eq[k][1 + n - 1], -1);
-	}
-	isl_vec_free(vec);
-	if (k < 0)
-		goto error;
-
-	vars_drop(v, v->n - n);
-
-	def = isl_basic_map_simplify(def);
-	def = isl_basic_map_finalize(def);
-	bmap = isl_basic_map_intersect(bmap, def);
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	isl_basic_map_free(def);
-	return NULL;
-}
-
-static __isl_give isl_basic_map *read_var_list(struct isl_stream *s,
-	__isl_take isl_basic_map *bmap, enum isl_dim_type type, struct vars *v)
-{
-	int i = 0;
-	struct isl_token *tok;
-
-	while ((tok = next_token(s)) != NULL) {
-		int new_name = 0;
-
-		if (tok->type == ISL_TOKEN_IDENT) {
-			int n = v->n;
-			int p = vars_pos(v, tok->u.s, -1);
-			if (p < 0)
-				goto error;
-			new_name = p >= n;
-		}
-
-		if (new_name) {
-			bmap = isl_basic_map_add(bmap, type, 1);
-			bmap = set_name(bmap, type, i, v->v->name);
-			isl_token_free(tok);
-		} else if (tok->type == ISL_TOKEN_IDENT ||
-			   tok->type == ISL_TOKEN_VALUE ||
-			   tok->type == '-' ||
-			   tok->type == '(') {
-			if (type == isl_dim_param) {
-				isl_stream_error(s, tok,
-						"expecting unique identifier");
-				goto error;
-			}
-			isl_stream_push_token(s, tok);
-			tok = NULL;
-			bmap = isl_basic_map_add(bmap, type, 1);
-			bmap = read_var_def(s, bmap, type, v);
-		} else
-			break;
-
-		tok = isl_stream_next_token(s);
-		if (tok && tok->type == ']' &&
-		    isl_stream_next_token_is(s, '[')) {
-			isl_token_free(tok);
-			tok = isl_stream_next_token(s);
-		} else if (!tok || tok->type != ',')
-			break;
-
-		isl_token_free(tok);
-		i++;
-	}
-	if (tok)
-		isl_stream_push_token(s, tok);
-
-	return bmap;
-error:
-	isl_token_free(tok);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static __isl_give isl_mat *accept_affine_list(struct isl_stream *s,
-	struct vars *v)
-{
-	struct isl_vec *vec;
-	struct isl_mat *mat;
-	struct isl_token *tok = NULL;
-
-	vec = accept_affine(s, v);
-	mat = isl_mat_from_row_vec(vec);
-	if (!mat)
-		return NULL;
-
-	for (;;) {
-		tok = isl_stream_next_token(s);
-		if (!tok) {
-			isl_stream_error(s, NULL, "unexpected EOF");
-			goto error;
-		}
-		if (tok->type != ',') {
-			isl_stream_push_token(s, tok);
-			break;
-		}
-		isl_token_free(tok);
-
-		vec = accept_affine(s, v);
-		mat = isl_mat_add_zero_cols(mat, 1 + v->n - isl_mat_cols(mat));
-		mat = isl_mat_vec_concat(mat, vec);
-		if (!mat)
-			return NULL;
-	}
-
-	return mat;
-error:
-	isl_mat_free(mat);
-	return NULL;
-}
-
-static int read_minmax_definition(struct isl_stream *s, struct vars *v)
-{
-	struct isl_token *tok;
-	struct variable *var;
-
-	var = v->v;
-
-	tok = isl_stream_next_token(s);
-	if (!tok)
-		return -1;
-	var->sign = tok->type == ISL_TOKEN_MIN ? -1 : 1;
-	isl_token_free(tok);
-
-	if (isl_stream_eat(s, '('))
-		return -1;
-
-	var->list = accept_affine_list(s, v);
-	if (!var->list)
-		return -1;
-
-	if (isl_stream_eat(s, ')'))
-		return -1;
-
-	return 0;
-}
-
-static int read_div_definition(struct isl_stream *s, struct vars *v)
-{
-	struct isl_token *tok;
-	int seen_paren = 0;
-	struct isl_vec *aff;
-	struct variable *var;
-	int fc = 0;
-
-	if (isl_stream_eat_if_available(s, ISL_TOKEN_FLOORD) ||
-	    isl_stream_eat_if_available(s, ISL_TOKEN_CEILD)) {
-		fc = 1;
-		if (isl_stream_eat(s, '('))
-			return -1;
-	} else {
-		if (isl_stream_eat(s, '['))
-			return -1;
-		if (isl_stream_eat_if_available(s, '('))
-			seen_paren = 1;
-	}
-
-	var = v->v;
-
-	aff = accept_affine(s, v);
-	if (!aff)
-		return -1;
-
-	var->def = isl_vec_alloc(s->ctx, 2 + v->n);
-	if (!var->def) {
-		isl_vec_free(aff);
-		return -1;
-	}
-
-	isl_seq_cpy(var->def->el + 1, aff->el, aff->size);
-
-	isl_vec_free(aff);
-
-	if (fc) {
-		if (isl_stream_eat(s, ','))
-			return -1;
-	} else {
-		if (seen_paren && isl_stream_eat(s, ')'))
-			return -1;
-		if (isl_stream_eat(s, '/'))
-			return -1;
-	}
-
-	tok = next_token(s);
-	if (!tok)
-		return -1;
-	if (tok->type != ISL_TOKEN_VALUE) {
-		isl_stream_error(s, tok, "expected denominator");
-		isl_stream_push_token(s, tok);
-		return -1;
-	}
-	isl_int_set(var->def->el[0], tok->u.v);
-	isl_token_free(tok);
-
-	if (fc) {
-		if (isl_stream_eat(s, ')'))
-			return -1;
-	} else {
-		if (isl_stream_eat(s, ']'))
-			return -1;
-	}
-
-	return 0;
-}
-
-static struct isl_basic_map *add_div_definition(struct isl_stream *s,
-	struct vars *v, struct isl_basic_map *bmap, int pos)
-{
-	struct variable *var = v->v;
-	unsigned o_out = isl_basic_map_offset(bmap, isl_dim_out) - 1;
-
-	if (read_div_definition(s, v) < 0)
-		goto error;
-
-	if (isl_basic_map_add_div_constraints_var(bmap, o_out + pos,
-						  var->def->el) < 0)
-		goto error;
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static struct isl_basic_map *read_defined_var_list(struct isl_stream *s,
-	struct vars *v, struct isl_basic_map *bmap)
-{
-	struct isl_token *tok;
-
-	while ((tok = isl_stream_next_token(s)) != NULL) {
-		int p;
-		int n = v->n;
-		unsigned n_out = isl_basic_map_dim(bmap, isl_dim_out);
-
-		if (tok->type != ISL_TOKEN_IDENT)
-			break;
-
-		p = vars_pos(v, tok->u.s, -1);
-		if (p < 0)
-			goto error;
-		if (p < n) {
-			isl_stream_error(s, tok, "expecting unique identifier");
-			goto error;
-		}
-
-		bmap = isl_basic_map_cow(bmap);
-		bmap = isl_basic_map_add(bmap, isl_dim_out, 1);
-		bmap = isl_basic_map_extend_dim(bmap, isl_dim_copy(bmap->dim),
-						0, 0, 2);
-
-		isl_token_free(tok);
-		tok = isl_stream_next_token(s);
-		if (tok && tok->type == '=') {
-			isl_token_free(tok);
-			bmap = add_div_definition(s, v, bmap, n_out);
-			tok = isl_stream_next_token(s);
-		}
-
-		if (!tok || tok->type != ',')
-			break;
-
-		isl_token_free(tok);
-	}
-	if (tok)
-		isl_stream_push_token(s, tok);
-
-	return bmap;
-error:
-	isl_token_free(tok);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static int next_is_tuple(struct isl_stream *s)
-{
-	struct isl_token *tok;
-	int is_tuple;
-
-	tok = isl_stream_next_token(s);
-	if (!tok)
-		return 0;
-	if (tok->type == '[') {
-		isl_stream_push_token(s, tok);
-		return 1;
-	}
-	if (tok->type != ISL_TOKEN_IDENT && !tok->is_keyword) {
-		isl_stream_push_token(s, tok);
-		return 0;
-	}
-
-	is_tuple = isl_stream_next_token_is(s, '[');
-
-	isl_stream_push_token(s, tok);
-
-	return is_tuple;
-}
-
-static __isl_give isl_basic_map *read_tuple(struct isl_stream *s,
-	__isl_take isl_basic_map *bmap, enum isl_dim_type type, struct vars *v);
-
-static __isl_give isl_basic_map *read_nested_tuple(struct isl_stream *s,
-	__isl_take isl_basic_map *bmap, struct vars *v)
-{
-	bmap = read_tuple(s, bmap, isl_dim_in, v);
-	if (isl_stream_eat(s, ISL_TOKEN_TO))
-		goto error;
-	bmap = read_tuple(s, bmap, isl_dim_out, v);
-	bmap = isl_basic_map_from_range(isl_basic_map_wrap(bmap));
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static __isl_give isl_basic_map *read_tuple(struct isl_stream *s,
-	__isl_take isl_basic_map *bmap, enum isl_dim_type type, struct vars *v)
-{
-	struct isl_token *tok;
-	char *name = NULL;
-
-	tok = isl_stream_next_token(s);
-	if (tok && (tok->type == ISL_TOKEN_IDENT || tok->is_keyword)) {
-		name = strdup(tok->u.s);
-		if (!name)
-			goto error;
-		isl_token_free(tok);
-		tok = isl_stream_next_token(s);
-	}
-	if (!tok || tok->type != '[') {
-		isl_stream_error(s, tok, "expecting '['");
-		goto error;
-	}
-	isl_token_free(tok);
-	if (type != isl_dim_param && next_is_tuple(s)) {
-		isl_dim *dim = isl_basic_map_get_dim(bmap);
-		int nparam = isl_dim_size(dim, isl_dim_param);
-		int n_in = isl_dim_size(dim, isl_dim_in);
-		isl_basic_map *nested;
-		if (type == isl_dim_out)
-			dim = isl_dim_move(dim, isl_dim_param, nparam,
-						isl_dim_in, 0, n_in);
-		nested = isl_basic_map_alloc_dim(dim, 0, 0, 0);
-		nested = read_nested_tuple(s, nested, v);
-		if (type == isl_dim_in) {
-			nested = isl_basic_map_reverse(nested);
-			bmap = isl_basic_map_intersect(nested, bmap);
-		} else {
-			isl_basic_set *bset;
-			dim = isl_dim_range(isl_basic_map_get_dim(nested));
-			dim = isl_dim_drop(dim, isl_dim_param, nparam, n_in);
-			dim = isl_dim_join(isl_basic_map_get_dim(bmap), dim);
-			bset = isl_basic_map_domain(bmap);
-			nested = isl_basic_map_reset_dim(nested, dim);
-			bmap = isl_basic_map_intersect_domain(nested, bset);
-		}
-	} else
-		bmap = read_var_list(s, bmap, type, v);
-	tok = isl_stream_next_token(s);
-	if (!tok || tok->type != ']') {
-		isl_stream_error(s, tok, "expecting ']'");
-		goto error;
-	}
-	isl_token_free(tok);
-
-	if (name) {
-		bmap = isl_basic_map_set_tuple_name(bmap, type, name);
-		free(name);
-	}
-
-	return bmap;
-error:
-	if (tok)
-		isl_token_free(tok);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static __isl_give isl_basic_map *construct_constraint(
-	__isl_take isl_basic_map *bmap, enum isl_token_type type,
-	isl_int *left, isl_int *right)
-{
-	int k;
-	unsigned len;
-	struct isl_ctx *ctx;
-
-	if (!bmap)
-		return NULL;
-	len = 1 + isl_basic_map_total_dim(bmap);
-	ctx = bmap->ctx;
-
-	k = isl_basic_map_alloc_inequality(bmap);
-	if (k < 0)
-		goto error;
-	if (type == ISL_TOKEN_LE)
-		isl_seq_combine(bmap->ineq[k], ctx->negone, left,
-					       ctx->one, right,
-					       len);
-	else if (type == ISL_TOKEN_GE)
-		isl_seq_combine(bmap->ineq[k], ctx->one, left,
-					       ctx->negone, right,
-					       len);
-	else if (type == ISL_TOKEN_LT) {
-		isl_seq_combine(bmap->ineq[k], ctx->negone, left,
-					       ctx->one, right,
-					       len);
-		isl_int_sub_ui(bmap->ineq[k][0], bmap->ineq[k][0], 1);
-	} else if (type == ISL_TOKEN_GT) {
-		isl_seq_combine(bmap->ineq[k], ctx->one, left,
-					       ctx->negone, right,
-					       len);
-		isl_int_sub_ui(bmap->ineq[k][0], bmap->ineq[k][0], 1);
-	} else {
-		isl_seq_combine(bmap->ineq[k], ctx->one, left,
-					       ctx->negone, right,
-					       len);
-		isl_basic_map_inequality_to_equality(bmap, k);
-	}
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static int is_comparator(struct isl_token *tok)
-{
-	if (!tok)
-		return 0;
-
-	switch (tok->type) {
-	case ISL_TOKEN_LT:
-	case ISL_TOKEN_GT:
-	case ISL_TOKEN_LE:
-	case ISL_TOKEN_GE:
-	case '=':
-		return 1;
-	default:
-		return 0;
-	}
-}
-
-/* Add any variables in the variable list "v" that are not already in "bmap"
- * as output variables in "bmap".
- */
-static __isl_give isl_basic_map *add_lifted_divs(__isl_take isl_basic_map *bmap,
-	struct vars *v)
-{
-	int i;
-	int extra;
-	struct variable *var;
-
-	extra = v->n - isl_basic_map_total_dim(bmap);
-
-	if (extra == 0)
-		return bmap;
-
-	bmap = isl_basic_map_add(bmap, isl_dim_out, extra);
-	bmap = isl_basic_map_extend_dim(bmap, isl_basic_map_get_dim(bmap),
-					0, 0, 2 * extra);
-
-	for (i = 0, var = v->v; i < extra; ++i, var = var->next) {
-		if (!var->def)
-			continue;
-		var->def = isl_vec_zero_extend(var->def, 2 + v->n);
-		if (!var->def)
-			goto error;
-		if (isl_basic_map_add_div_constraints_var(bmap, var->pos,
-							  var->def->el) < 0)
-			goto error;
-	}
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static struct isl_basic_map *add_constraint(struct isl_stream *s,
-	struct vars *v, struct isl_basic_map *bmap)
-{
-	int i, j;
-	struct isl_token *tok = NULL;
-	struct isl_mat *aff1 = NULL, *aff2 = NULL;
-
-	bmap = isl_basic_map_cow(bmap);
-
-	aff1 = accept_affine_list(s, v);
-	if (!aff1)
-		goto error;
-	tok = isl_stream_next_token(s);
-	if (!is_comparator(tok)) {
-		isl_stream_error(s, tok, "missing operator");
-		if (tok)
-			isl_stream_push_token(s, tok);
-		tok = NULL;
-		goto error;
-	}
-	for (;;) {
-		aff2 = accept_affine_list(s, v);
-		if (!aff2)
-			goto error;
-
-		aff1 = isl_mat_add_zero_cols(aff1, aff2->n_col - aff1->n_col);
-		if (!aff1)
-			goto error;
-		bmap = add_lifted_divs(bmap, v);
-		bmap = isl_basic_map_extend_constraints(bmap, 0,
-						aff1->n_row * aff2->n_row);
-		for (i = 0; i < aff1->n_row; ++i)
-			for (j = 0; j < aff2->n_row; ++j)
-				bmap = construct_constraint(bmap, tok->type,
-						    aff1->row[i], aff2->row[j]);
-		isl_token_free(tok);
-		isl_mat_free(aff1);
-		aff1 = aff2;
-
-		tok = isl_stream_next_token(s);
-		if (!is_comparator(tok)) {
-			if (tok)
-				isl_stream_push_token(s, tok);
-			break;
-		}
-	}
-	isl_mat_free(aff1);
-
-	return bmap;
-error:
-	if (tok)
-		isl_token_free(tok);
-	isl_mat_free(aff1);
-	isl_mat_free(aff2);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Return first variable, starting at n, representing a min or max,
- * or NULL if there is no such variable.
- */
-static struct variable *first_minmax(struct vars *v, int n)
-{
-	struct variable *first = NULL;
-	struct variable *var;
-
-	for (var = v->v; var && var->pos >= n; var = var->next)
-		if (var->list)
-			first = var;
-
-	return first;
-}
-
-/* Check whether the variable at the given position only occurs in
- * inequalities and only with the given sign.
- */
-static int all_coefficients_of_sign(__isl_keep isl_map *map, int pos, int sign)
-{
-	int i, j;
-
-	if (!map)
-		return -1;
-
-	for (i = 0; i < map->n; ++i) {
-		isl_basic_map *bmap = map->p[i];
-
-		for (j = 0; j < bmap->n_eq; ++j)
-			if (!isl_int_is_zero(bmap->eq[j][1 + pos]))
-				return 0;
-		for (j = 0; j < bmap->n_ineq; ++j) {
-			int s = isl_int_sgn(bmap->ineq[j][1 + pos]);
-			if (s == 0)
-				continue;
-			if (s != sign)
-				return 0;
-		}
-	}
-
-	return 1;
-}
-
-/* Given a variable m which represents a min or a max of n expressions
- * b_i, add the constraints
- *
- *	m <= b_i
- *
- * in case of a min (var->sign < 0) and m >= b_i in case of a max.
- */
-static __isl_give isl_map *bound_minmax(__isl_take isl_map *map,
-	struct variable *var)
-{
-	int i, k;
-	isl_basic_map *bound;
-	int total;
-
-	total = isl_map_dim(map, isl_dim_all);
-	bound = isl_basic_map_alloc_dim(isl_map_get_dim(map),
-					0, 0, var->list->n_row);
-
-	for (i = 0; i < var->list->n_row; ++i) {
-		k = isl_basic_map_alloc_inequality(bound);
-		if (k < 0)
-			goto error;
-		if (var->sign < 0)
-			isl_seq_cpy(bound->ineq[k], var->list->row[i],
-				    var->list->n_col);
-		else
-			isl_seq_neg(bound->ineq[k], var->list->row[i],
-				    var->list->n_col);
-		isl_int_set_si(bound->ineq[k][1 + var->pos], var->sign);
-		isl_seq_clr(bound->ineq[k] + var->list->n_col,
-			    1 + total - var->list->n_col);
-	}
-
-	map = isl_map_intersect(map, isl_map_from_basic_map(bound));
-
-	return map;
-error:
-	isl_basic_map_free(bound);
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Given a variable m which represents a min (or max) of n expressions
- * b_i, add constraints that assigns the minimal upper bound to m, i.e.,
- * divide the space into cells where one
- * of the upper bounds is smaller than all the others and assign
- * this upper bound to m.
- *
- * In particular, if there are n bounds b_i, then the input map
- * is split into n pieces, each with the extra constraints
- *
- *	m = b_i
- *	b_i <= b_j	for j > i
- *	b_i <  b_j	for j < i
- *
- * in case of a min (var->sign < 0) and similarly in case of a max.
- *
- * Note: this function is very similar to set_minimum in isl_tab_pip.c
- * Perhaps we should try to merge the two.
- */
-static __isl_give isl_map *set_minmax(__isl_take isl_map *map,
-	struct variable *var)
-{
-	int i, j, k;
-	isl_basic_map *bmap = NULL;
-	isl_ctx *ctx;
-	isl_map *split = NULL;
-	int total;
-
-	ctx = isl_map_get_ctx(map);
-	total = isl_map_dim(map, isl_dim_all);
-	split = isl_map_alloc_dim(isl_map_get_dim(map),
-				var->list->n_row, ISL_SET_DISJOINT);
-
-	for (i = 0; i < var->list->n_row; ++i) {
-		bmap = isl_basic_map_alloc_dim(isl_map_get_dim(map), 0,
-					       1, var->list->n_row - 1);
-		k = isl_basic_map_alloc_equality(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(bmap->eq[k], var->list->row[i], var->list->n_col);
-		isl_int_set_si(bmap->eq[k][1 + var->pos], -1);
-		for (j = 0; j < var->list->n_row; ++j) {
-			if (j == i)
-				continue;
-			k = isl_basic_map_alloc_inequality(bmap);
-			if (k < 0)
-				goto error;
-			if (var->sign < 0)
-				isl_seq_combine(bmap->ineq[k],
-						ctx->one, var->list->row[j],
-						ctx->negone, var->list->row[i],
-						var->list->n_col);
-			else
-				isl_seq_combine(bmap->ineq[k],
-						ctx->negone, var->list->row[j],
-						ctx->one, var->list->row[i],
-						var->list->n_col);
-			isl_seq_clr(bmap->ineq[k] + var->list->n_col,
-				    1 + total - var->list->n_col);
-			if (j < i)
-				isl_int_sub_ui(bmap->ineq[k][0],
-					       bmap->ineq[k][0], 1);
-		}
-		bmap = isl_basic_map_finalize(bmap);
-		split = isl_map_add_basic_map(split, bmap);
-	}
-
-	map = isl_map_intersect(map, split);
-
-	return map;
-error:
-	isl_basic_map_free(bmap);
-	isl_map_free(split);
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Plug in the definitions of all min and max expressions.
- * If a min expression only appears in inequalities and only
- * with a positive coefficient, then we can simply bound
- * the variable representing the min by its defining terms
- * and similarly for a max expression.
- * Otherwise, we have to assign the different terms to the
- * variable under the condition that the assigned term is smaller
- * than the other terms.
- */
-static __isl_give isl_map *add_minmax(__isl_take isl_map *map,
-	struct vars *v, int n)
-{
-	struct variable *var;
-
-	while (n < v->n) {
-		var = first_minmax(v, n);
-		if (!var)
-			break;
-		if (all_coefficients_of_sign(map, var->pos, -var->sign))
-			map = bound_minmax(map, var);
-		else
-			map = set_minmax(map, var);
-		n = var->pos + 1;
-	}
-
-	return map;
-}
-
-static isl_map *read_constraint(struct isl_stream *s,
-	struct vars *v, __isl_take isl_basic_map *bmap)
-{
-	int n = v->n;
-	isl_map *map;
-	unsigned total;
-
-	if (!bmap)
-		return NULL;
-
-	bmap = isl_basic_set_unwrap(isl_basic_set_lift(isl_basic_map_wrap(bmap)));
-	total = isl_basic_map_total_dim(bmap);
-	while (v->n < total)
-		if (vars_add_anon(v) < 0)
-			goto error;
-
-	bmap = add_constraint(s, v, bmap);
-	bmap = isl_basic_map_simplify(bmap);
-	bmap = isl_basic_map_finalize(bmap);
-
-	map = isl_map_from_basic_map(bmap);
-
-	map = add_minmax(map, v, n);
-
-	map = isl_set_unwrap(isl_map_domain(map));
-
-	vars_drop(v, v->n - n);
-
-	return map;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static struct isl_map *read_disjuncts(struct isl_stream *s,
-	struct vars *v, __isl_take isl_basic_map *bmap);
-
-static __isl_give isl_map *read_exists(struct isl_stream *s,
-	struct vars *v, __isl_take isl_basic_map *bmap)
-{
-	int n = v->n;
-	int seen_paren = isl_stream_eat_if_available(s, '(');
-	isl_map *map = NULL;
-
-	bmap = isl_basic_map_from_domain(isl_basic_map_wrap(bmap));
-	bmap = read_defined_var_list(s, v, bmap);
-
-	if (isl_stream_eat(s, ':'))
-		goto error;
-
-	map = read_disjuncts(s, v, bmap);
-	map = isl_set_unwrap(isl_map_domain(map));
-	bmap = NULL;
-
-	vars_drop(v, v->n - n);
-	if (seen_paren && isl_stream_eat(s, ')'))
-		goto error;
-
-	return map;
-error:
-	isl_basic_map_free(bmap);
-	isl_map_free(map);
-	return NULL;
-}
-
-static __isl_give isl_map *read_conjunct(struct isl_stream *s,
-	struct vars *v, __isl_take isl_basic_map *bmap)
-{
-	isl_map *map;
-
-	if (isl_stream_eat_if_available(s, '(')) {
-		map = read_disjuncts(s, v, bmap);
-		if (isl_stream_eat(s, ')'))
-			goto error;
-		return map;
-	}
-
-	if (isl_stream_eat_if_available(s, ISL_TOKEN_EXISTS))
-		return read_exists(s, v, bmap);
-
-	if (isl_stream_eat_if_available(s, ISL_TOKEN_TRUE))
-		return isl_map_from_basic_map(bmap);
-
-	if (isl_stream_eat_if_available(s, ISL_TOKEN_FALSE)) {
-		isl_dim *dim = isl_basic_map_get_dim(bmap);
-		isl_basic_map_free(bmap);
-		return isl_map_empty(dim);
-	}
-		
-	return read_constraint(s, v, bmap);
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-static __isl_give isl_map *read_conjuncts(struct isl_stream *s,
-	struct vars *v, __isl_take isl_basic_map *bmap)
-{
-	isl_map *map;
-	int negate;
-
-	negate = isl_stream_eat_if_available(s, ISL_TOKEN_NOT);
-	map = read_conjunct(s, v, isl_basic_map_copy(bmap));
-	if (negate) {
-		isl_map *t;
-		t = isl_map_from_basic_map(isl_basic_map_copy(bmap));
-		map = isl_map_subtract(t, map);
-	}
-
-	while (isl_stream_eat_if_available(s, ISL_TOKEN_AND)) {
-		isl_map *map_i;
-
-		negate = isl_stream_eat_if_available(s, ISL_TOKEN_NOT);
-		map_i = read_conjunct(s, v, isl_basic_map_copy(bmap));
-		if (negate)
-			map = isl_map_subtract(map, map_i);
-		else
-			map = isl_map_intersect(map, map_i);
-	}
-
-	isl_basic_map_free(bmap);
-	return map;
-}
-
-static struct isl_map *read_disjuncts(struct isl_stream *s,
-	struct vars *v, __isl_take isl_basic_map *bmap)
-{
-	struct isl_map *map;
-
-	if (isl_stream_next_token_is(s, '}')) {
-		isl_dim *dim = isl_basic_map_get_dim(bmap);
-		isl_basic_map_free(bmap);
-		return isl_map_universe(dim);
-	}
-
-	map = read_conjuncts(s, v, isl_basic_map_copy(bmap));
-	while (isl_stream_eat_if_available(s, ISL_TOKEN_OR)) {
-		isl_map *map_i;
-
-		map_i = read_conjuncts(s, v, isl_basic_map_copy(bmap));
-		map = isl_map_union(map, map_i);
-	}
-
-	isl_basic_map_free(bmap);
-	return map;
-}
-
-static int polylib_pos_to_isl_pos(__isl_keep isl_basic_map *bmap, int pos)
-{
-	if (pos < isl_basic_map_dim(bmap, isl_dim_out))
-		return 1 + isl_basic_map_dim(bmap, isl_dim_param) +
-			   isl_basic_map_dim(bmap, isl_dim_in) + pos;
-	pos -= isl_basic_map_dim(bmap, isl_dim_out);
-
-	if (pos < isl_basic_map_dim(bmap, isl_dim_in))
-		return 1 + isl_basic_map_dim(bmap, isl_dim_param) + pos;
-	pos -= isl_basic_map_dim(bmap, isl_dim_in);
-
-	if (pos < isl_basic_map_dim(bmap, isl_dim_div))
-		return 1 + isl_basic_map_dim(bmap, isl_dim_param) +
-			   isl_basic_map_dim(bmap, isl_dim_in) +
-			   isl_basic_map_dim(bmap, isl_dim_out) + pos;
-	pos -= isl_basic_map_dim(bmap, isl_dim_div);
-
-	if (pos < isl_basic_map_dim(bmap, isl_dim_param))
-		return 1 + pos;
-
-	return 0;
-}
-
-static __isl_give isl_basic_map *basic_map_read_polylib_constraint(
-	struct isl_stream *s, __isl_take isl_basic_map *bmap)
-{
-	int j;
-	struct isl_token *tok;
-	int type;
-	int k;
-	isl_int *c;
-	unsigned nparam;
-	unsigned dim;
-
-	if (!bmap)
-		return NULL;
-
-	nparam = isl_basic_map_dim(bmap, isl_dim_param);
-	dim = isl_basic_map_dim(bmap, isl_dim_out);
-
-	tok = isl_stream_next_token(s);
-	if (!tok || tok->type != ISL_TOKEN_VALUE) {
-		isl_stream_error(s, tok, "expecting coefficient");
-		if (tok)
-			isl_stream_push_token(s, tok);
-		goto error;
-	}
-	if (!tok->on_new_line) {
-		isl_stream_error(s, tok, "coefficient should appear on new line");
-		isl_stream_push_token(s, tok);
-		goto error;
-	}
-
-	type = isl_int_get_si(tok->u.v);
-	isl_token_free(tok);
-
-	isl_assert(s->ctx, type == 0 || type == 1, goto error);
-	if (type == 0) {
-		k = isl_basic_map_alloc_equality(bmap);
-		c = bmap->eq[k];
-	} else {
-		k = isl_basic_map_alloc_inequality(bmap);
-		c = bmap->ineq[k];
-	}
-	if (k < 0)
-		goto error;
-
-	for (j = 0; j < 1 + isl_basic_map_total_dim(bmap); ++j) {
-		int pos;
-		tok = isl_stream_next_token(s);
-		if (!tok || tok->type != ISL_TOKEN_VALUE) {
-			isl_stream_error(s, tok, "expecting coefficient");
-			if (tok)
-				isl_stream_push_token(s, tok);
-			goto error;
-		}
-		if (tok->on_new_line) {
-			isl_stream_error(s, tok,
-				"coefficient should not appear on new line");
-			isl_stream_push_token(s, tok);
-			goto error;
-		}
-		pos = polylib_pos_to_isl_pos(bmap, j);
-		isl_int_set(c[pos], tok->u.v);
-		isl_token_free(tok);
-	}
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static __isl_give isl_basic_map *basic_map_read_polylib(struct isl_stream *s,
-	int nparam)
-{
-	int i;
-	struct isl_token *tok;
-	struct isl_token *tok2;
-	int n_row, n_col;
-	int on_new_line;
-	unsigned in = 0, out, local = 0;
-	struct isl_basic_map *bmap = NULL;
-
-	if (nparam < 0)
-		nparam = 0;
-
-	tok = isl_stream_next_token(s);
-	if (!tok) {
-		isl_stream_error(s, NULL, "unexpected EOF");
-		return NULL;
-	}
-	tok2 = isl_stream_next_token(s);
-	if (!tok2) {
-		isl_token_free(tok);
-		isl_stream_error(s, NULL, "unexpected EOF");
-		return NULL;
-	}
-	if (tok->type != ISL_TOKEN_VALUE || tok2->type != ISL_TOKEN_VALUE) {
-		isl_stream_push_token(s, tok2);
-		isl_stream_push_token(s, tok);
-		isl_stream_error(s, NULL,
-				 "expecting constraint matrix dimensions");
-		return NULL;
-	}
-	n_row = isl_int_get_si(tok->u.v);
-	n_col = isl_int_get_si(tok2->u.v);
-	on_new_line = tok2->on_new_line;
-	isl_token_free(tok2);
-	isl_token_free(tok);
-	isl_assert(s->ctx, !on_new_line, return NULL);
-	isl_assert(s->ctx, n_row >= 0, return NULL);
-	isl_assert(s->ctx, n_col >= 2 + nparam, return NULL);
-	tok = isl_stream_next_token_on_same_line(s);
-	if (tok) {
-		if (tok->type != ISL_TOKEN_VALUE) {
-			isl_stream_error(s, tok,
-				    "expecting number of output dimensions");
-			isl_stream_push_token(s, tok);
-			goto error;
-		}
-		out = isl_int_get_si(tok->u.v);
-		isl_token_free(tok);
-
-		tok = isl_stream_next_token_on_same_line(s);
-		if (!tok || tok->type != ISL_TOKEN_VALUE) {
-			isl_stream_error(s, tok,
-				    "expecting number of input dimensions");
-			if (tok)
-				isl_stream_push_token(s, tok);
-			goto error;
-		}
-		in = isl_int_get_si(tok->u.v);
-		isl_token_free(tok);
-
-		tok = isl_stream_next_token_on_same_line(s);
-		if (!tok || tok->type != ISL_TOKEN_VALUE) {
-			isl_stream_error(s, tok,
-				    "expecting number of existentials");
-			if (tok)
-				isl_stream_push_token(s, tok);
-			goto error;
-		}
-		local = isl_int_get_si(tok->u.v);
-		isl_token_free(tok);
-
-		tok = isl_stream_next_token_on_same_line(s);
-		if (!tok || tok->type != ISL_TOKEN_VALUE) {
-			isl_stream_error(s, tok,
-				    "expecting number of parameters");
-			if (tok)
-				isl_stream_push_token(s, tok);
-			goto error;
-		}
-		nparam = isl_int_get_si(tok->u.v);
-		isl_token_free(tok);
-		if (n_col != 1 + out + in + local + nparam + 1) {
-			isl_stream_error(s, NULL,
-				    "dimensions don't match");
-			goto error;
-		}
-	} else
-		out = n_col - 2 - nparam;
-	bmap = isl_basic_map_alloc(s->ctx, nparam, in, out, local, n_row, n_row);
-	if (!bmap)
-		return NULL;
-
-	for (i = 0; i < local; ++i) {
-		int k = isl_basic_map_alloc_div(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(bmap->div[k], 1 + 1 + nparam + in + out + local);
-	}
-
-	for (i = 0; i < n_row; ++i)
-		bmap = basic_map_read_polylib_constraint(s, bmap);
-
-	tok = isl_stream_next_token_on_same_line(s);
-	if (tok) {
-		isl_stream_error(s, tok, "unexpected extra token on line");
-		isl_stream_push_token(s, tok);
-		goto error;
-	}
-
-	bmap = isl_basic_map_simplify(bmap);
-	bmap = isl_basic_map_finalize(bmap);
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static struct isl_map *map_read_polylib(struct isl_stream *s, int nparam)
-{
-	struct isl_token *tok;
-	struct isl_token *tok2;
-	int i, n;
-	struct isl_map *map;
-
-	tok = isl_stream_next_token(s);
-	if (!tok) {
-		isl_stream_error(s, NULL, "unexpected EOF");
-		return NULL;
-	}
-	tok2 = isl_stream_next_token_on_same_line(s);
-	if (tok2 && tok2->type == ISL_TOKEN_VALUE) {
-		isl_stream_push_token(s, tok2);
-		isl_stream_push_token(s, tok);
-		return isl_map_from_basic_map(basic_map_read_polylib(s, nparam));
-	}
-	if (tok2) {
-		isl_stream_error(s, tok2, "unexpected token");
-		isl_stream_push_token(s, tok2);
-		isl_stream_push_token(s, tok);
-		return NULL;
-	}
-	n = isl_int_get_si(tok->u.v);
-	isl_token_free(tok);
-
-	isl_assert(s->ctx, n >= 1, return NULL);
-
-	map = isl_map_from_basic_map(basic_map_read_polylib(s, nparam));
-
-	for (i = 1; map && i < n; ++i)
-		map = isl_map_union(map,
-			isl_map_from_basic_map(basic_map_read_polylib(s, nparam)));
-
-	return map;
-}
-
-static int optional_power(struct isl_stream *s)
-{
-	int pow;
-	struct isl_token *tok;
-
-	tok = isl_stream_next_token(s);
-	if (!tok)
-		return 1;
-	if (tok->type != '^') {
-		isl_stream_push_token(s, tok);
-		return 1;
-	}
-	isl_token_free(tok);
-	tok = isl_stream_next_token(s);
-	if (!tok || tok->type != ISL_TOKEN_VALUE) {
-		isl_stream_error(s, tok, "expecting exponent");
-		if (tok)
-			isl_stream_push_token(s, tok);
-		return 1;
-	}
-	pow = isl_int_get_si(tok->u.v);
-	isl_token_free(tok);
-	return pow;
-}
-
-static __isl_give isl_div *read_div(struct isl_stream *s,
-	__isl_take isl_dim *dim, struct vars *v)
-{
-	int n;
-	isl_basic_map *bmap;
-
-	n = v->n;
-	bmap = isl_basic_map_universe(dim);
-
-	if (vars_add_anon(v) < 0)
-		goto error;
-	if (read_div_definition(s, v) < 0)
-		goto error;
-	bmap = add_divs(bmap, v);
-	bmap = isl_basic_map_order_divs(bmap);
-	if (!bmap)
-		goto error;
-	vars_drop(v, v->n - n);
-
-	return isl_basic_map_div(bmap, bmap->n_div - 1);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static __isl_give isl_qpolynomial *read_term(struct isl_stream *s,
-	__isl_keep isl_basic_map *bmap, struct vars *v);
-
-static __isl_give isl_qpolynomial *read_factor(struct isl_stream *s,
-	__isl_keep isl_basic_map *bmap, struct vars *v)
-{
-	struct isl_qpolynomial *qp;
-	struct isl_token *tok;
-
-	tok = next_token(s);
-	if (!tok) {
-		isl_stream_error(s, NULL, "unexpected EOF");
-		return NULL;
-	}
-	if (tok->type == '(') {
-		int pow;
-
-		isl_token_free(tok);
-		qp = read_term(s, bmap, v);
-		if (!qp)
-			return NULL;
-		if (isl_stream_eat(s, ')'))
-			goto error;
-		pow = optional_power(s);
-		qp = isl_qpolynomial_pow(qp, pow);
-	} else if (tok->type == ISL_TOKEN_VALUE) {
-		struct isl_token *tok2;
-		tok2 = isl_stream_next_token(s);
-		if (tok2 && tok2->type == '/') {
-			isl_token_free(tok2);
-			tok2 = next_token(s);
-			if (!tok2 || tok2->type != ISL_TOKEN_VALUE) {
-				isl_stream_error(s, tok2, "expected denominator");
-				isl_token_free(tok);
-				isl_token_free(tok2);
-				return NULL;
-			}
-			qp = isl_qpolynomial_rat_cst(isl_basic_map_get_dim(bmap),
-						    tok->u.v, tok2->u.v);
-			isl_token_free(tok2);
-		} else {
-			isl_stream_push_token(s, tok2);
-			qp = isl_qpolynomial_cst(isl_basic_map_get_dim(bmap),
-						tok->u.v);
-		}
-		isl_token_free(tok);
-	} else if (tok->type == ISL_TOKEN_INFTY) {
-		isl_token_free(tok);
-		qp = isl_qpolynomial_infty(isl_basic_map_get_dim(bmap));
-	} else if (tok->type == ISL_TOKEN_NAN) {
-		isl_token_free(tok);
-		qp = isl_qpolynomial_nan(isl_basic_map_get_dim(bmap));
-	} else if (tok->type == ISL_TOKEN_IDENT) {
-		int n = v->n;
-		int pos = vars_pos(v, tok->u.s, -1);
-		int pow;
-		if (pos < 0) {
-			isl_token_free(tok);
-			return NULL;
-		}
-		if (pos >= n) {
-			vars_drop(v, v->n - n);
-			isl_stream_error(s, tok, "unknown identifier");
-			isl_token_free(tok);
-			return NULL;
-		}
-		isl_token_free(tok);
-		pow = optional_power(s);
-		qp = isl_qpolynomial_var_pow(isl_basic_map_get_dim(bmap), pos, pow);
-	} else if (tok->type == '[') {
-		isl_div *div;
-		int pow;
-
-		isl_stream_push_token(s, tok);
-		div = read_div(s, isl_basic_map_get_dim(bmap), v);
-		pow = optional_power(s);
-		qp = isl_qpolynomial_div_pow(div, pow);
-	} else if (tok->type == '-') {
-		struct isl_qpolynomial *qp2;
-
-		isl_token_free(tok);
-		qp = isl_qpolynomial_cst(isl_basic_map_get_dim(bmap),
-					    s->ctx->negone);
-		qp2 = read_factor(s, bmap, v);
-		qp = isl_qpolynomial_mul(qp, qp2);
-	} else {
-		isl_stream_error(s, tok, "unexpected isl_token");
-		isl_stream_push_token(s, tok);
-		return NULL;
-	}
-
-	if (isl_stream_eat_if_available(s, '*') ||
-	    isl_stream_next_token_is(s, ISL_TOKEN_IDENT)) {
-		struct isl_qpolynomial *qp2;
-
-		qp2 = read_factor(s, bmap, v);
-		qp = isl_qpolynomial_mul(qp, qp2);
-	}
-
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-static __isl_give isl_qpolynomial *read_term(struct isl_stream *s,
-	__isl_keep isl_basic_map *bmap, struct vars *v)
-{
-	struct isl_token *tok;
-	struct isl_qpolynomial *qp;
-
-	qp = read_factor(s, bmap, v);
-
-	for (;;) {
-		tok = next_token(s);
-		if (!tok)
-			return qp;
-
-		if (tok->type == '+') {
-			struct isl_qpolynomial *qp2;
-
-			isl_token_free(tok);
-			qp2 = read_factor(s, bmap, v);
-			qp = isl_qpolynomial_add(qp, qp2);
-		} else if (tok->type == '-') {
-			struct isl_qpolynomial *qp2;
-
-			isl_token_free(tok);
-			qp2 = read_factor(s, bmap, v);
-			qp = isl_qpolynomial_sub(qp, qp2);
-		} else if (tok->type == ISL_TOKEN_VALUE &&
-			    isl_int_is_neg(tok->u.v)) {
-			struct isl_qpolynomial *qp2;
-
-			isl_stream_push_token(s, tok);
-			qp2 = read_factor(s, bmap, v);
-			qp = isl_qpolynomial_add(qp, qp2);
-		} else {
-			isl_stream_push_token(s, tok);
-			break;
-		}
-	}
-
-	return qp;
-}
-
-static __isl_give isl_map *read_optional_disjuncts(struct isl_stream *s,
-	__isl_take isl_basic_map *bmap, struct vars *v)
-{
-	struct isl_token *tok;
-	struct isl_map *map;
-
-	tok = isl_stream_next_token(s);
-	if (!tok) {
-		isl_stream_error(s, NULL, "unexpected EOF");
-		goto error;
-	}
-	map = isl_map_from_basic_map(isl_basic_map_copy(bmap));
-	if (tok->type == ':' ||
-	    (tok->type == ISL_TOKEN_OR && !strcmp(tok->u.s, "|"))) {
-		isl_token_free(tok);
-		map = isl_map_intersect(map,
-			    read_disjuncts(s, v, isl_basic_map_copy(bmap)));
-	} else
-		isl_stream_push_token(s, tok);
-
-	isl_basic_map_free(bmap);
-
-	return map;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static struct isl_obj obj_read_poly(struct isl_stream *s,
-	__isl_take isl_basic_map *bmap, struct vars *v, int n)
-{
-	struct isl_obj obj = { isl_obj_pw_qpolynomial, NULL };
-	struct isl_pw_qpolynomial *pwqp;
-	struct isl_qpolynomial *qp;
-	struct isl_map *map;
-	struct isl_set *set;
-
-	qp = read_term(s, bmap, v);
-	map = read_optional_disjuncts(s, bmap, v);
-	set = isl_map_range(map);
-
-	pwqp = isl_pw_qpolynomial_alloc(set, qp);
-
-	vars_drop(v, v->n - n);
-
-	obj.v = pwqp;
-	return obj;
-}
-
-static struct isl_obj obj_read_poly_or_fold(struct isl_stream *s,
-	__isl_take isl_basic_map *bmap, struct vars *v, int n)
-{
-	struct isl_obj obj = { isl_obj_pw_qpolynomial_fold, NULL };
-	isl_qpolynomial *qp;
-	isl_qpolynomial_fold *fold = NULL;
-	isl_pw_qpolynomial_fold *pwf;
-	isl_map *map;
-	isl_set *set;
-
-	if (!isl_stream_eat_if_available(s, ISL_TOKEN_MAX))
-		return obj_read_poly(s, bmap, v, n);
-
-	if (isl_stream_eat(s, '('))
-		goto error;
-
-	qp = read_term(s, bmap, v);
-	fold = isl_qpolynomial_fold_alloc(isl_fold_max, qp);
-
-	while (isl_stream_eat_if_available(s, ',')) {
-		isl_qpolynomial_fold *fold_i;
-		qp = read_term(s, bmap, v);
-		fold_i = isl_qpolynomial_fold_alloc(isl_fold_max, qp);
-		fold = isl_qpolynomial_fold_fold(fold, fold_i);
-	}
-
-	if (isl_stream_eat(s, ')'))
-		goto error;
-
-	map = read_optional_disjuncts(s, bmap, v);
-	set = isl_map_range(map);
-	pwf = isl_pw_qpolynomial_fold_alloc(isl_fold_max, set, fold);
-
-	vars_drop(v, v->n - n);
-
-	obj.v = pwf;
-	return obj;
-error:
-	isl_basic_map_free(bmap);
-	isl_qpolynomial_fold_free(fold);
-	obj.type = isl_obj_none;
-	return obj;
-}
-
-static int is_rational(struct isl_stream *s)
-{
-	struct isl_token *tok;
-
-	tok = isl_stream_next_token(s);
-	if (!tok)
-		return 0;
-	if (tok->type == ISL_TOKEN_RAT && isl_stream_next_token_is(s, ':')) {
-		isl_token_free(tok);
-		isl_stream_eat(s, ':');
-		return 1;
-	}
-
-	isl_stream_push_token(s, tok);
-
-	return 0;
-}
-
-static struct isl_obj obj_read_body(struct isl_stream *s,
-	__isl_take isl_basic_map *bmap, struct vars *v)
-{
-	struct isl_map *map = NULL;
-	struct isl_token *tok;
-	struct isl_obj obj = { isl_obj_set, NULL };
-	int n = v->n;
-
-	if (is_rational(s))
-		bmap = isl_basic_map_set_rational(bmap);
-
-	if (!next_is_tuple(s))
-		return obj_read_poly_or_fold(s, bmap, v, n);
-
-	bmap = read_tuple(s, bmap, isl_dim_in, v);
-	if (!bmap)
-		goto error;
-	tok = isl_stream_next_token(s);
-	if (tok && tok->type == ISL_TOKEN_TO) {
-		obj.type = isl_obj_map;
-		isl_token_free(tok);
-		if (!next_is_tuple(s)) {
-			bmap = isl_basic_map_reverse(bmap);
-			return obj_read_poly_or_fold(s, bmap, v, n);
-		}
-		bmap = read_tuple(s, bmap, isl_dim_out, v);
-		if (!bmap)
-			goto error;
-	} else {
-		bmap = isl_basic_map_reverse(bmap);
-		if (tok)
-			isl_stream_push_token(s, tok);
-	}
-
-	map = read_optional_disjuncts(s, bmap, v);
-
-	vars_drop(v, v->n - n);
-
-	obj.v = map;
-	return obj;
-error:
-	isl_basic_map_free(bmap);
-	obj.type = isl_obj_none;
-	return obj;
-}
-
-static struct isl_obj to_union(isl_ctx *ctx, struct isl_obj obj)
-{
-	if (obj.type == isl_obj_map) {
-		obj.v = isl_union_map_from_map(obj.v);
-		obj.type = isl_obj_union_map;
-	} else if (obj.type == isl_obj_set) {
-		obj.v = isl_union_set_from_set(obj.v);
-		obj.type = isl_obj_union_set;
-	} else if (obj.type == isl_obj_pw_qpolynomial) {
-		obj.v = isl_union_pw_qpolynomial_from_pw_qpolynomial(obj.v);
-		obj.type = isl_obj_union_pw_qpolynomial;
-	} else if (obj.type == isl_obj_pw_qpolynomial_fold) {
-		obj.v = isl_union_pw_qpolynomial_fold_from_pw_qpolynomial_fold(obj.v);
-		obj.type = isl_obj_union_pw_qpolynomial_fold;
-	} else
-		isl_assert(ctx, 0, goto error);
-	return obj;
-error:
-	obj.type->free(obj.v);
-	obj.type = isl_obj_none;
-	return obj;
-}
-
-static struct isl_obj obj_add(struct isl_ctx *ctx,
-	struct isl_obj obj1, struct isl_obj obj2)
-{
-	if (obj1.type == isl_obj_set && obj2.type == isl_obj_union_set)
-		obj1 = to_union(ctx, obj1);
-	if (obj1.type == isl_obj_union_set && obj2.type == isl_obj_set)
-		obj2 = to_union(ctx, obj2);
-	if (obj1.type == isl_obj_map && obj2.type == isl_obj_union_map)
-		obj1 = to_union(ctx, obj1);
-	if (obj1.type == isl_obj_union_map && obj2.type == isl_obj_map)
-		obj2 = to_union(ctx, obj2);
-	if (obj1.type == isl_obj_pw_qpolynomial &&
-	    obj2.type == isl_obj_union_pw_qpolynomial)
-		obj1 = to_union(ctx, obj1);
-	if (obj1.type == isl_obj_union_pw_qpolynomial &&
-	    obj2.type == isl_obj_pw_qpolynomial)
-		obj2 = to_union(ctx, obj2);
-	if (obj1.type == isl_obj_pw_qpolynomial_fold &&
-	    obj2.type == isl_obj_union_pw_qpolynomial_fold)
-		obj1 = to_union(ctx, obj1);
-	if (obj1.type == isl_obj_union_pw_qpolynomial_fold &&
-	    obj2.type == isl_obj_pw_qpolynomial_fold)
-		obj2 = to_union(ctx, obj2);
-	isl_assert(ctx, obj1.type == obj2.type, goto error);
-	if (obj1.type == isl_obj_map && !isl_map_has_equal_dim(obj1.v, obj2.v)) {
-		obj1 = to_union(ctx, obj1);
-		obj2 = to_union(ctx, obj2);
-	}
-	if (obj1.type == isl_obj_set && !isl_set_has_equal_dim(obj1.v, obj2.v)) {
-		obj1 = to_union(ctx, obj1);
-		obj2 = to_union(ctx, obj2);
-	}
-	if (obj1.type == isl_obj_pw_qpolynomial &&
-	    !isl_pw_qpolynomial_has_equal_dim(obj1.v, obj2.v)) {
-		obj1 = to_union(ctx, obj1);
-		obj2 = to_union(ctx, obj2);
-	}
-	if (obj1.type == isl_obj_pw_qpolynomial_fold &&
-	    !isl_pw_qpolynomial_fold_has_equal_dim(obj1.v, obj2.v)) {
-		obj1 = to_union(ctx, obj1);
-		obj2 = to_union(ctx, obj2);
-	}
-	obj1.v = obj1.type->add(obj1.v, obj2.v);
-	return obj1;
-error:
-	obj1.type->free(obj1.v);
-	obj2.type->free(obj2.v);
-	obj1.type = isl_obj_none;
-	obj1.v = NULL;
-	return obj1;
-}
-
-static struct isl_obj obj_read(struct isl_stream *s, int nparam)
-{
-	isl_basic_map *bmap = NULL;
-	struct isl_token *tok;
-	struct vars *v = NULL;
-	struct isl_obj obj = { isl_obj_set, NULL };
-
-	tok = next_token(s);
-	if (!tok) {
-		isl_stream_error(s, NULL, "unexpected EOF");
-		goto error;
-	}
-	if (tok->type == ISL_TOKEN_VALUE) {
-		struct isl_token *tok2;
-		struct isl_map *map;
-
-		tok2 = isl_stream_next_token(s);
-		if (!tok2 || tok2->type != ISL_TOKEN_VALUE ||
-		    isl_int_is_neg(tok2->u.v)) {
-			if (tok2)
-				isl_stream_push_token(s, tok2);
-			obj.type = isl_obj_int;
-			obj.v = isl_int_obj_alloc(s->ctx, tok->u.v);
-			isl_token_free(tok);
-			return obj;
-		}
-		isl_stream_push_token(s, tok2);
-		isl_stream_push_token(s, tok);
-		map = map_read_polylib(s, nparam);
-		if (!map)
-			goto error;
-		if (isl_map_dim(map, isl_dim_in) > 0)
-			obj.type = isl_obj_map;
-		obj.v = map;
-		return obj;
-	}
-	v = vars_new(s->ctx);
-	if (!v) {
-		isl_stream_push_token(s, tok);
-		goto error;
-	}
-	bmap = isl_basic_map_alloc(s->ctx, 0, 0, 0, 0, 0, 0);
-	if (tok->type == '[') {
-		isl_stream_push_token(s, tok);
-		bmap = read_tuple(s, bmap, isl_dim_param, v);
-		if (!bmap)
-			goto error;
-		if (nparam >= 0)
-			isl_assert(s->ctx, nparam == v->n, goto error);
-		tok = isl_stream_next_token(s);
-		if (!tok || tok->type != ISL_TOKEN_TO) {
-			isl_stream_error(s, tok, "expecting '->'");
-			if (tok)
-				isl_stream_push_token(s, tok);
-			goto error;
-		}
-		isl_token_free(tok);
-		tok = isl_stream_next_token(s);
-	} else if (nparam > 0)
-		bmap = isl_basic_map_add(bmap, isl_dim_param, nparam);
-	if (!tok || tok->type != '{') {
-		isl_stream_error(s, tok, "expecting '{'");
-		if (tok)
-			isl_stream_push_token(s, tok);
-		goto error;
-	}
-	isl_token_free(tok);
-
-	tok = isl_stream_next_token(s);
-	if (!tok)
-		;
-	else if (tok->type == ISL_TOKEN_IDENT && !strcmp(tok->u.s, "Sym")) {
-		isl_token_free(tok);
-		if (isl_stream_eat(s, '='))
-			goto error;
-		bmap = read_tuple(s, bmap, isl_dim_param, v);
-		if (!bmap)
-			goto error;
-		if (nparam >= 0)
-			isl_assert(s->ctx, nparam == v->n, goto error);
-	} else if (tok->type == '}') {
-		obj.type = isl_obj_union_set;
-		obj.v = isl_union_set_empty(isl_basic_map_get_dim(bmap));
-		isl_token_free(tok);
-		goto done;
-	} else
-		isl_stream_push_token(s, tok);
-
-	for (;;) {
-		struct isl_obj o;
-		tok = NULL;
-		o = obj_read_body(s, isl_basic_map_copy(bmap), v);
-		if (o.type == isl_obj_none || !o.v)
-			goto error;
-		if (!obj.v)
-			obj = o;
-		else {
-			obj = obj_add(s->ctx, obj, o);
-			if (obj.type == isl_obj_none || !obj.v)
-				goto error;
-		}
-		tok = isl_stream_next_token(s);
-		if (!tok || tok->type != ';')
-			break;
-		isl_token_free(tok);
-		if (isl_stream_next_token_is(s, '}')) {
-			tok = isl_stream_next_token(s);
-			break;
-		}
-	}
-
-	if (tok && tok->type == '}') {
-		isl_token_free(tok);
-	} else {
-		isl_stream_error(s, tok, "unexpected isl_token");
-		if (tok)
-			isl_token_free(tok);
-		goto error;
-	}
-done:
-	vars_free(v);
-	isl_basic_map_free(bmap);
-
-	return obj;
-error:
-	isl_basic_map_free(bmap);
-	obj.type->free(obj.v);
-	if (v)
-		vars_free(v);
-	obj.v = NULL;
-	return obj;
-}
-
-struct isl_obj isl_stream_read_obj(struct isl_stream *s)
-{
-	return obj_read(s, -1);
-}
-
-__isl_give isl_map *isl_stream_read_map(struct isl_stream *s, int nparam)
-{
-	struct isl_obj obj;
-
-	obj = obj_read(s, nparam);
-	if (obj.v)
-		isl_assert(s->ctx, obj.type == isl_obj_map ||
-				   obj.type == isl_obj_set, goto error);
-
-	return obj.v;
-error:
-	obj.type->free(obj.v);
-	return NULL;
-}
-
-__isl_give isl_set *isl_stream_read_set(struct isl_stream *s, int nparam)
-{
-	struct isl_obj obj;
-
-	obj = obj_read(s, nparam);
-	if (obj.v)
-		isl_assert(s->ctx, obj.type == isl_obj_set, goto error);
-
-	return obj.v;
-error:
-	obj.type->free(obj.v);
-	return NULL;
-}
-
-__isl_give isl_union_map *isl_stream_read_union_map(struct isl_stream *s)
-{
-	struct isl_obj obj;
-
-	obj = obj_read(s, -1);
-	if (obj.type == isl_obj_map) {
-		obj.type = isl_obj_union_map;
-		obj.v = isl_union_map_from_map(obj.v);
-	}
-	if (obj.type == isl_obj_set) {
-		obj.type = isl_obj_union_set;
-		obj.v = isl_union_set_from_set(obj.v);
-	}
-	if (obj.v)
-		isl_assert(s->ctx, obj.type == isl_obj_union_map ||
-				   obj.type == isl_obj_union_set, goto error);
-
-	return obj.v;
-error:
-	obj.type->free(obj.v);
-	return NULL;
-}
-
-__isl_give isl_union_set *isl_stream_read_union_set(struct isl_stream *s)
-{
-	struct isl_obj obj;
-
-	obj = obj_read(s, -1);
-	if (obj.type == isl_obj_set) {
-		obj.type = isl_obj_union_set;
-		obj.v = isl_union_set_from_set(obj.v);
-	}
-	if (obj.v)
-		isl_assert(s->ctx, obj.type == isl_obj_union_set, goto error);
-
-	return obj.v;
-error:
-	obj.type->free(obj.v);
-	return NULL;
-}
-
-static struct isl_basic_map *basic_map_read(struct isl_stream *s, int nparam)
-{
-	struct isl_obj obj;
-	struct isl_map *map;
-	struct isl_basic_map *bmap;
-
-	obj = obj_read(s, nparam);
-	map = obj.v;
-	if (!map)
-		return NULL;
-
-	isl_assert(map->ctx, map->n <= 1, goto error);
-
-	if (map->n == 0)
-		bmap = isl_basic_map_empty_like_map(map);
-	else
-		bmap = isl_basic_map_copy(map->p[0]);
-
-	isl_map_free(map);
-
-	return bmap;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_read_from_file(isl_ctx *ctx,
-		FILE *input, int nparam)
-{
-	struct isl_basic_map *bmap;
-	struct isl_stream *s = isl_stream_new_file(ctx, input);
-	if (!s)
-		return NULL;
-	bmap = basic_map_read(s, nparam);
-	isl_stream_free(s);
-	return bmap;
-}
-
-__isl_give isl_basic_set *isl_basic_set_read_from_file(isl_ctx *ctx,
-		FILE *input, int nparam)
-{
-	struct isl_basic_map *bmap;
-	bmap = isl_basic_map_read_from_file(ctx, input, nparam);
-	if (!bmap)
-		return NULL;
-	isl_assert(ctx, isl_basic_map_n_in(bmap) == 0, goto error);
-	return (struct isl_basic_set *)bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_map *isl_basic_map_read_from_str(struct isl_ctx *ctx,
-		const char *str, int nparam)
-{
-	struct isl_basic_map *bmap;
-	struct isl_stream *s = isl_stream_new_str(ctx, str);
-	if (!s)
-		return NULL;
-	bmap = basic_map_read(s, nparam);
-	isl_stream_free(s);
-	return bmap;
-}
-
-struct isl_basic_set *isl_basic_set_read_from_str(struct isl_ctx *ctx,
-		const char *str, int nparam)
-{
-	struct isl_basic_map *bmap;
-	bmap = isl_basic_map_read_from_str(ctx, str, nparam);
-	if (!bmap)
-		return NULL;
-	isl_assert(ctx, isl_basic_map_n_in(bmap) == 0, goto error);
-	return (struct isl_basic_set *)bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_read_from_file(struct isl_ctx *ctx,
-		FILE *input, int nparam)
-{
-	struct isl_map *map;
-	struct isl_stream *s = isl_stream_new_file(ctx, input);
-	if (!s)
-		return NULL;
-	map = isl_stream_read_map(s, nparam);
-	isl_stream_free(s);
-	return map;
-}
-
-__isl_give isl_map *isl_map_read_from_str(struct isl_ctx *ctx,
-		const char *str, int nparam)
-{
-	struct isl_map *map;
-	struct isl_stream *s = isl_stream_new_str(ctx, str);
-	if (!s)
-		return NULL;
-	map = isl_stream_read_map(s, nparam);
-	isl_stream_free(s);
-	return map;
-}
-
-__isl_give isl_set *isl_set_read_from_file(struct isl_ctx *ctx,
-		FILE *input, int nparam)
-{
-	struct isl_map *map;
-	map = isl_map_read_from_file(ctx, input, nparam);
-	if (!map)
-		return NULL;
-	isl_assert(ctx, isl_map_n_in(map) == 0, goto error);
-	return (struct isl_set *)map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-struct isl_set *isl_set_read_from_str(struct isl_ctx *ctx,
-		const char *str, int nparam)
-{
-	struct isl_map *map;
-	map = isl_map_read_from_str(ctx, str, nparam);
-	if (!map)
-		return NULL;
-	isl_assert(ctx, isl_map_n_in(map) == 0, goto error);
-	return (struct isl_set *)map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_union_map *isl_union_map_read_from_file(isl_ctx *ctx,
-	FILE *input)
-{
-	isl_union_map *umap;
-	struct isl_stream *s = isl_stream_new_file(ctx, input);
-	if (!s)
-		return NULL;
-	umap = isl_stream_read_union_map(s);
-	isl_stream_free(s);
-	return umap;
-}
-
-__isl_give isl_union_map *isl_union_map_read_from_str(struct isl_ctx *ctx,
-		const char *str)
-{
-	isl_union_map *umap;
-	struct isl_stream *s = isl_stream_new_str(ctx, str);
-	if (!s)
-		return NULL;
-	umap = isl_stream_read_union_map(s);
-	isl_stream_free(s);
-	return umap;
-}
-
-__isl_give isl_union_set *isl_union_set_read_from_file(isl_ctx *ctx,
-	FILE *input)
-{
-	isl_union_set *uset;
-	struct isl_stream *s = isl_stream_new_file(ctx, input);
-	if (!s)
-		return NULL;
-	uset = isl_stream_read_union_set(s);
-	isl_stream_free(s);
-	return uset;
-}
-
-__isl_give isl_union_set *isl_union_set_read_from_str(struct isl_ctx *ctx,
-		const char *str)
-{
-	isl_union_set *uset;
-	struct isl_stream *s = isl_stream_new_str(ctx, str);
-	if (!s)
-		return NULL;
-	uset = isl_stream_read_union_set(s);
-	isl_stream_free(s);
-	return uset;
-}
-
-static __isl_give isl_vec *isl_vec_read_polylib(struct isl_stream *s)
-{
-	struct isl_vec *vec = NULL;
-	struct isl_token *tok;
-	unsigned size;
-	int j;
-
-	tok = isl_stream_next_token(s);
-	if (!tok || tok->type != ISL_TOKEN_VALUE) {
-		isl_stream_error(s, tok, "expecting vector length");
-		goto error;
-	}
-
-	size = isl_int_get_si(tok->u.v);
-	isl_token_free(tok);
-
-	vec = isl_vec_alloc(s->ctx, size);
-
-	for (j = 0; j < size; ++j) {
-		tok = isl_stream_next_token(s);
-		if (!tok || tok->type != ISL_TOKEN_VALUE) {
-			isl_stream_error(s, tok, "expecting constant value");
-			goto error;
-		}
-		isl_int_set(vec->el[j], tok->u.v);
-		isl_token_free(tok);
-	}
-
-	return vec;
-error:
-	isl_token_free(tok);
-	isl_vec_free(vec);
-	return NULL;
-}
-
-static __isl_give isl_vec *vec_read(struct isl_stream *s)
-{
-	return isl_vec_read_polylib(s);
-}
-
-__isl_give isl_vec *isl_vec_read_from_file(isl_ctx *ctx, FILE *input)
-{
-	isl_vec *v;
-	struct isl_stream *s = isl_stream_new_file(ctx, input);
-	if (!s)
-		return NULL;
-	v = vec_read(s);
-	isl_stream_free(s);
-	return v;
-}
-
-__isl_give isl_pw_qpolynomial *isl_stream_read_pw_qpolynomial(
-	struct isl_stream *s)
-{
-	struct isl_obj obj;
-
-	obj = obj_read(s, -1);
-	if (obj.v)
-		isl_assert(s->ctx, obj.type == isl_obj_pw_qpolynomial,
-			   goto error);
-
-	return obj.v;
-error:
-	obj.type->free(obj.v);
-	return NULL;
-}
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_read_from_str(isl_ctx *ctx,
-		const char *str)
-{
-	isl_pw_qpolynomial *pwqp;
-	struct isl_stream *s = isl_stream_new_str(ctx, str);
-	if (!s)
-		return NULL;
-	pwqp = isl_stream_read_pw_qpolynomial(s);
-	isl_stream_free(s);
-	return pwqp;
-}
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_read_from_file(isl_ctx *ctx,
-		FILE *input)
-{
-	isl_pw_qpolynomial *pwqp;
-	struct isl_stream *s = isl_stream_new_file(ctx, input);
-	if (!s)
-		return NULL;
-	pwqp = isl_stream_read_pw_qpolynomial(s);
-	isl_stream_free(s);
-	return pwqp;
-}
diff --git a/cloog-0.16.3/isl/isl_list.c b/cloog-0.16.3/isl/isl_list.c
deleted file mode 100644
index ec1dd29..0000000
--- a/cloog-0.16.3/isl/isl_list.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_list_private.h>
-#include <isl/set.h>
-#include <isl/aff.h>
-#include <isl/band.h>
-
-#undef BASE
-#define BASE basic_set
-
-#include <isl_list_templ.c>
-
-#undef BASE
-#define BASE set
-
-#include <isl_list_templ.c>
-
-#undef BASE
-#define BASE aff
-
-#include <isl_list_templ.c>
-
-#undef BASE
-#define BASE band
-
-#include <isl_list_templ.c>
diff --git a/cloog-0.16.3/isl/isl_list_private.h b/cloog-0.16.3/isl/isl_list_private.h
deleted file mode 100644
index 15c0547..0000000
--- a/cloog-0.16.3/isl/isl_list_private.h
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifndef ISL_LIST_PRIVATE_H
-#define ISL_LIST_PRIVATE_H
-
-#include <isl/list.h>
-
-#undef EL
-#define EL isl_basic_set
-
-#include <isl_list_templ.h>
-
-#undef EL
-#define EL isl_set
-
-#include <isl_list_templ.h>
-
-#undef EL
-#define EL isl_aff
-
-#include <isl_list_templ.h>
-
-#undef EL
-#define EL isl_band
-
-#include <isl_list_templ.h>
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_list_templ.c b/cloog-0.16.3/isl/isl_list_templ.c
deleted file mode 100644
index 0bf8294..0000000
--- a/cloog-0.16.3/isl/isl_list_templ.c
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2011      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France
- */
-
-#define xCAT(A,B) A ## B
-#define CAT(A,B) xCAT(A,B)
-#undef EL
-#define EL CAT(isl_,BASE)
-#define xFN(TYPE,NAME) TYPE ## _ ## NAME
-#define FN(TYPE,NAME) xFN(TYPE,NAME)
-#define xLIST(EL) EL ## _list
-#define LIST(EL) xLIST(EL)
-
-isl_ctx *FN(LIST(EL),get_ctx)(__isl_keep LIST(EL) *list)
-{
-	return list ? list->ctx : NULL;
-}
-
-__isl_give LIST(EL) *FN(LIST(EL),alloc)(isl_ctx *ctx, int n)
-{
-	LIST(EL) *list;
-
-	if (n < 0)
-		isl_die(ctx, isl_error_invalid,
-			"cannot create list of negative length",
-			return NULL);
-	list = isl_alloc(ctx, LIST(EL),
-			 sizeof(LIST(EL)) + (n - 1) * sizeof(struct EL *));
-	if (!list)
-		return NULL;
-
-	list->ctx = ctx;
-	isl_ctx_ref(ctx);
-	list->ref = 1;
-	list->size = n;
-	list->n = 0;
-	return list;
-}
-
-__isl_give LIST(EL) *FN(LIST(EL),copy)(__isl_keep LIST(EL) *list)
-{
-	if (!list)
-		return NULL;
-
-	list->ref++;
-	return list;
-}
-
-__isl_give LIST(EL) *FN(LIST(EL),dup)(__isl_keep LIST(EL) *list)
-{
-	int i;
-	LIST(EL) *dup;
-
-	if (!list)
-		return NULL;
-
-	dup = FN(LIST(EL),alloc)(FN(LIST(EL),get_ctx)(list), list->n);
-	if (!dup)
-		return NULL;
-	for (i = 0; i < list->n; ++i)
-		dup = FN(LIST(EL),add)(dup, FN(EL,copy)(list->p[i]));
-	return dup;
-}
-
-__isl_give LIST(EL) *FN(LIST(EL),add)(__isl_take LIST(EL) *list,
-	__isl_take struct EL *el)
-{
-	if (!list || !el)
-		goto error;
-	isl_assert(list->ctx, list->n < list->size, goto error);
-	list->p[list->n] = el;
-	list->n++;
-	return list;
-error:
-	FN(EL,free)(el);
-	FN(LIST(EL),free)(list);
-	return NULL;
-}
-
-void FN(LIST(EL),free)(__isl_take LIST(EL) *list)
-{
-	int i;
-
-	if (!list)
-		return;
-
-	if (--list->ref > 0)
-		return;
-
-	isl_ctx_deref(list->ctx);
-	for (i = 0; i < list->n; ++i)
-		FN(EL,free)(list->p[i]);
-	free(list);
-}
-
-int FN(FN(LIST(EL),n),BASE)(__isl_keep LIST(EL) *list)
-{
-	return list ? list->n : 0;
-}
-
-__isl_give EL *FN(FN(LIST(EL),get),BASE)(__isl_keep LIST(EL) *list, int index)
-{
-	if (!list)
-		return NULL;
-	if (index < 0 || index >= list->n)
-		isl_die(list->ctx, isl_error_invalid,
-			"index out of bounds", return NULL);
-	return FN(EL,copy)(list->p[index]);
-}
-
-int FN(LIST(EL),foreach)(__isl_keep LIST(EL) *list,
-	int (*fn)(__isl_take EL *el, void *user), void *user)
-{
-	int i;
-
-	if (!list)
-		return -1;
-
-	for (i = 0; i < list->n; ++i) {
-		EL *el = FN(EL,copy(list->p[i]));
-		if (!el)
-			return -1;
-		if (fn(el, user) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-__isl_give isl_printer *CAT(isl_printer_print_,LIST(BASE))(
-	__isl_take isl_printer *p, __isl_keep LIST(EL) *list)
-{
-	int i;
-
-	if (!p || !list)
-		goto error;
-	p = isl_printer_print_str(p, "(");
-	for (i = 0; i < list->n; ++i) {
-		if (i)
-			p = isl_printer_print_str(p, ",");
-		p = CAT(isl_printer_print_,BASE)(p, list->p[i]);
-	}
-	p = isl_printer_print_str(p, ")");
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void FN(LIST(EL),dump)(__isl_keep LIST(EL) *list)
-{
-	isl_printer *printer;
-
-	if (!list)
-		return;
-
-	printer = isl_printer_to_file(FN(LIST(EL),get_ctx)(list), stderr);
-	printer = CAT(isl_printer_print_,LIST(BASE))(printer, list);
-	printer = isl_printer_end_line(printer);
-
-	isl_printer_free(printer);
-}
diff --git a/cloog-0.16.3/isl/isl_list_templ.h b/cloog-0.16.3/isl/isl_list_templ.h
deleted file mode 100644
index a959980..0000000
--- a/cloog-0.16.3/isl/isl_list_templ.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#define xFN(TYPE,NAME) TYPE ## _ ## NAME
-#define FN(TYPE,NAME) xFN(TYPE,NAME)
-#define xLIST(EL) EL ## _list
-#define LIST(EL) xLIST(EL)
-
-struct LIST(EL) {
-	int ref;
-	isl_ctx *ctx;
-
-	int n;
-
-	size_t size;
-	struct EL *p[1];
-};
-
-#define ISL_DECLARE_LIST_PRIVATE(EL)					\
-__isl_give isl_##EL##_list *isl_##EL##_list_dup(			\
-	__isl_keep isl_##EL##_list *list);
-
-ISL_DECLARE_LIST_PRIVATE(basic_set)
-ISL_DECLARE_LIST_PRIVATE(set)
-ISL_DECLARE_LIST_PRIVATE(aff)
-ISL_DECLARE_LIST_PRIVATE(band)
diff --git a/cloog-0.16.3/isl/isl_local_space.c b/cloog-0.16.3/isl/isl_local_space.c
deleted file mode 100644
index 17ac9ea..0000000
--- a/cloog-0.16.3/isl/isl_local_space.c
+++ /dev/null
@@ -1,612 +0,0 @@
-/*
- * Copyright 2011      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl_local_space_private.h>
-#include <isl_dim_private.h>
-#include <isl_mat_private.h>
-#include <isl/seq.h>
-
-isl_ctx *isl_local_space_get_ctx(__isl_keep isl_local_space *ls)
-{
-	return ls ? ls->dim->ctx : NULL;
-}
-
-__isl_give isl_local_space *isl_local_space_alloc_div(__isl_take isl_dim *dim,
-	__isl_take isl_mat *div)
-{
-	isl_ctx *ctx;
-	isl_local_space *ls = NULL;
-
-	if (!dim)
-		goto error;
-
-	ctx = isl_dim_get_ctx(dim);
-	ls = isl_calloc_type(ctx, struct isl_local_space);
-	if (!ls)
-		goto error;
-
-	ls->ref = 1;
-	ls->dim = dim;
-	ls->div = div;
-
-	return ls;
-error:
-	isl_dim_free(dim);
-	isl_local_space_free(ls);
-	return NULL;
-}
-
-__isl_give isl_local_space *isl_local_space_alloc(__isl_take isl_dim *dim,
-	unsigned n_div)
-{
-	isl_ctx *ctx;
-	isl_mat *div;
-	unsigned total;
-
-	if (!dim)
-		return NULL;
-
-	total = isl_dim_total(dim);
-
-	ctx = isl_dim_get_ctx(dim);
-	div = isl_mat_alloc(ctx, n_div, 1 + 1 + total + n_div);
-	return isl_local_space_alloc_div(dim, div);
-}
-
-__isl_give isl_local_space *isl_local_space_from_dim(__isl_take isl_dim *dim)
-{
-	return isl_local_space_alloc(dim, 0);
-}
-
-__isl_give isl_local_space *isl_local_space_copy(__isl_keep isl_local_space *ls)
-{
-	if (!ls)
-		return NULL;
-
-	ls->ref++;
-	return ls;
-}
-
-__isl_give isl_local_space *isl_local_space_dup(__isl_keep isl_local_space *ls)
-{
-	if (!ls)
-		return NULL;
-
-	return isl_local_space_alloc_div(isl_dim_copy(ls->dim),
-					 isl_mat_copy(ls->div));
-
-}
-
-__isl_give isl_local_space *isl_local_space_cow(__isl_take isl_local_space *ls)
-{
-	if (!ls)
-		return NULL;
-
-	if (ls->ref == 1)
-		return ls;
-	ls->ref--;
-	return isl_local_space_dup(ls);
-}
-
-void *isl_local_space_free(__isl_take isl_local_space *ls)
-{
-	if (!ls)
-		return NULL;
-
-	if (--ls->ref > 0)
-		return NULL;
-
-	isl_dim_free(ls->dim);
-	isl_mat_free(ls->div);
-
-	free(ls);
-
-	return NULL;
-}
-
-/* Return true if the two local spaces are identical, with identical
- * expressions for the integer divisions.
- */
-int isl_local_space_is_equal(__isl_keep isl_local_space *ls1,
-	__isl_keep isl_local_space *ls2)
-{
-	int equal;
-
-	if (!ls1 || !ls2)
-		return -1;
-
-	equal = isl_dim_equal(ls1->dim, ls2->dim);
-	if (equal < 0 || !equal)
-		return equal;
-
-	if (!isl_local_space_divs_known(ls1))
-		return 0;
-	if (!isl_local_space_divs_known(ls2))
-		return 0;
-
-	return isl_mat_is_equal(ls1->div, ls2->div);
-}
-
-int isl_local_space_dim(__isl_keep isl_local_space *ls,
-	enum isl_dim_type type)
-{
-	if (!ls)
-		return 0;
-	if (type == isl_dim_div)
-		return ls->div->n_row;
-	if (type == isl_dim_all)
-		return isl_dim_size(ls->dim, isl_dim_all) + ls->div->n_row;
-	return isl_dim_size(ls->dim, type);
-}
-
-unsigned isl_local_space_offset(__isl_keep isl_local_space *ls,
-	enum isl_dim_type type)
-{
-	isl_dim *dim;
-
-	if (!ls)
-		return 0;
-
-	dim = ls->dim;
-	switch (type) {
-	case isl_dim_cst:	return 0;
-	case isl_dim_param:	return 1;
-	case isl_dim_in:	return 1 + dim->nparam;
-	case isl_dim_out:	return 1 + dim->nparam + dim->n_in;
-	case isl_dim_div:	return 1 + dim->nparam + dim->n_in + dim->n_out;
-	default:		return 0;
-	}
-}
-
-const char *isl_local_space_get_dim_name(__isl_keep isl_local_space *ls,
-	enum isl_dim_type type, unsigned pos)
-{
-	return ls ? isl_dim_get_name(ls->dim, type, pos) : NULL;
-}
-
-__isl_give isl_div *isl_local_space_get_div(__isl_keep isl_local_space *ls,
-	int pos)
-{
-	isl_basic_map *bmap;
-
-	if (!ls)
-		return NULL;
-
-	if (pos < 0 || pos >= ls->div->n_row)
-		isl_die(isl_local_space_get_ctx(ls), isl_error_invalid,
-			"index out of bounds", return NULL);
-
-	if (isl_int_is_zero(ls->div->row[pos][0]))
-		isl_die(isl_local_space_get_ctx(ls), isl_error_invalid,
-			"expression of div unknown", return NULL);
-
-	bmap = isl_basic_map_from_local_space(isl_local_space_copy(ls));
-	return isl_basic_map_div(bmap, pos);
-}
-
-__isl_give isl_dim *isl_local_space_get_dim(__isl_keep isl_local_space *ls)
-{
-	if (!ls)
-		return NULL;
-
-	return isl_dim_copy(ls->dim);
-}
-
-__isl_give isl_local_space *isl_local_space_set_dim_name(
-	__isl_take isl_local_space *ls,
-	enum isl_dim_type type, unsigned pos, const char *s)
-{
-	ls = isl_local_space_cow(ls);
-	if (!ls)
-		return NULL;
-	ls->dim = isl_dim_set_name(ls->dim, type, pos, s);
-	if (!ls->dim)
-		return isl_local_space_free(ls);
-
-	return ls;
-}
-
-__isl_give isl_local_space *isl_local_space_reset_dim(
-	__isl_take isl_local_space *ls, __isl_take isl_dim *dim)
-{
-	ls = isl_local_space_cow(ls);
-	if (!ls || !dim)
-		goto error;
-
-	isl_dim_free(ls->dim);
-	ls->dim = dim;
-
-	return ls;
-error:
-	isl_local_space_free(ls);
-	isl_dim_free(dim);
-	return NULL;
-}
-
-/* Reorder the columns of the given div definitions according to the
- * given reordering.
- * The order of the divs themselves is assumed not to change.
- */
-static __isl_give isl_mat *reorder_divs(__isl_take isl_mat *div,
-	__isl_take isl_reordering *r)
-{
-	int i, j;
-	isl_mat *mat;
-	int extra;
-
-	if (!div || !r)
-		goto error;
-
-	extra = isl_dim_total(r->dim) + div->n_row - r->len;
-	mat = isl_mat_alloc(div->ctx, div->n_row, div->n_col + extra);
-	if (!mat)
-		goto error;
-
-	for (i = 0; i < div->n_row; ++i) {
-		isl_seq_cpy(mat->row[i], div->row[i], 2);
-		isl_seq_clr(mat->row[i] + 2, mat->n_col - 2);
-		for (j = 0; j < r->len; ++j)
-			isl_int_set(mat->row[i][2 + r->pos[j]],
-				    div->row[i][2 + j]);
-	}
-
-	isl_reordering_free(r);
-	isl_mat_free(div);
-	return mat;
-error:
-	isl_reordering_free(r);
-	isl_mat_free(div);
-	return NULL;
-}
-
-/* Reorder the dimensions of "ls" according to the given reordering.
- * The reordering r is assumed to have been extended with the local
- * variables, leaving them in the same order.
- */
-__isl_give isl_local_space *isl_local_space_realign(
-	__isl_take isl_local_space *ls, __isl_take isl_reordering *r)
-{
-	ls = isl_local_space_cow(ls);
-	if (!ls || !r)
-		goto error;
-
-	ls->div = reorder_divs(ls->div, isl_reordering_copy(r));
-	if (!ls->div)
-		goto error;
-
-	ls = isl_local_space_reset_dim(ls, isl_dim_copy(r->dim));
-
-	isl_reordering_free(r);
-	return ls;
-error:
-	isl_local_space_free(ls);
-	isl_reordering_free(r);
-	return NULL;
-}
-
-__isl_give isl_local_space *isl_local_space_add_div(
-	__isl_take isl_local_space *ls, __isl_take isl_vec *div)
-{
-	ls = isl_local_space_cow(ls);
-	if (!ls || !div)
-		goto error;
-
-	if (ls->div->n_col != div->size)
-		isl_die(isl_local_space_get_ctx(ls), isl_error_invalid,
-			"incompatible dimensions", goto error);
-
-	ls->div = isl_mat_add_zero_cols(ls->div, 1);
-	ls->div = isl_mat_add_rows(ls->div, 1);
-	if (!ls->div)
-		goto error;
-
-	isl_seq_cpy(ls->div->row[ls->div->n_row - 1], div->el, div->size);
-	isl_int_set_si(ls->div->row[ls->div->n_row - 1][div->size], 0);
-
-	isl_vec_free(div);
-	return ls;
-error:
-	isl_local_space_free(ls);
-	isl_vec_free(div);
-	return NULL;
-}
-
-__isl_give isl_local_space *isl_local_space_replace_divs(
-	__isl_take isl_local_space *ls, __isl_take isl_mat *div)
-{
-	ls = isl_local_space_cow(ls);
-
-	if (!ls || !div)
-		goto error;
-
-	isl_mat_free(ls->div);
-	ls->div = div;
-	return ls;
-error:
-	isl_mat_free(div);
-	isl_local_space_free(ls);
-	return NULL;
-}
-
-/* Copy row "s" of "src" to row "d" of "dst", applying the expansion
- * defined by "exp".
- */
-static void expand_row(__isl_keep isl_mat *dst, int d,
-	__isl_keep isl_mat *src, int s, int *exp)
-{
-	int i;
-	unsigned c = src->n_col - src->n_row;
-
-	isl_seq_cpy(dst->row[d], src->row[s], c);
-	isl_seq_clr(dst->row[d] + c, dst->n_col - c);
-
-	for (i = 0; i < s; ++i)
-		isl_int_set(dst->row[d][c + exp[i]], src->row[s][c + i]);
-}
-
-/* Compare (known) divs.
- * Return non-zero if at least one of the two divs is unknown.
- */
-static int cmp_row(__isl_keep isl_mat *div, int i, int j)
-{
-	int li, lj;
-
-	if (isl_int_is_zero(div->row[j][0]))
-		return -1;
-	if (isl_int_is_zero(div->row[i][0]))
-		return 1;
-
-	li = isl_seq_last_non_zero(div->row[i], div->n_col);
-	lj = isl_seq_last_non_zero(div->row[j], div->n_col);
-
-	if (li != lj)
-		return li - lj;
-
-	return isl_seq_cmp(div->row[i], div->row[j], div->n_col);
-}
-
-/* Combine the two lists of divs into a single list.
- * For each row i in div1, exp1[i] is set to the position of the corresponding
- * row in the result.  Similarly for div2 and exp2.
- * This function guarantees
- *	exp1[i] >= i
- *	exp1[i+1] > exp1[i]
- * For optimal merging, the two input list should have been sorted.
- */
-__isl_give isl_mat *isl_merge_divs(__isl_keep isl_mat *div1,
-	__isl_keep isl_mat *div2, int *exp1, int *exp2)
-{
-	int i, j, k;
-	isl_mat *div = NULL;
-	unsigned d = div1->n_col - div1->n_row;
-
-	div = isl_mat_alloc(div1->ctx, 1 + div1->n_row + div2->n_row,
-				d + div1->n_row + div2->n_row);
-	if (!div)
-		return NULL;
-
-	for (i = 0, j = 0, k = 0; i < div1->n_row && j < div2->n_row; ++k) {
-		int cmp;
-
-		expand_row(div, k, div1, i, exp1);
-		expand_row(div, k + 1, div2, j, exp2);
-
-		cmp = cmp_row(div, k, k + 1);
-		if (cmp == 0) {
-			exp1[i++] = k;
-			exp2[j++] = k;
-		} else if (cmp < 0) {
-			exp1[i++] = k;
-		} else {
-			exp2[j++] = k;
-			isl_seq_cpy(div->row[k], div->row[k + 1], div->n_col);
-		}
-	}
-	for (; i < div1->n_row; ++i, ++k) {
-		expand_row(div, k, div1, i, exp1);
-		exp1[i] = k;
-	}
-	for (; j < div2->n_row; ++j, ++k) {
-		expand_row(div, k, div2, j, exp2);
-		exp2[j] = k;
-	}
-
-	div->n_row = k;
-	div->n_col = d + k;
-
-	return div;
-}
-
-int isl_local_space_divs_known(__isl_keep isl_local_space *ls)
-{
-	int i;
-
-	if (!ls)
-		return -1;
-
-	for (i = 0; i < ls->div->n_row; ++i)
-		if (isl_int_is_zero(ls->div->row[i][0]))
-			return 0;
-
-	return 1;
-}
-
-/* Construct a local space for a map that has the given local
- * space as domain and that has a zero-dimensional range.
- */
-__isl_give isl_local_space *isl_local_space_from_domain(
-	__isl_take isl_local_space *ls)
-{
-	ls = isl_local_space_cow(ls);
-	if (!ls)
-		return NULL;
-	ls->dim = isl_dim_from_domain(ls->dim);
-	if (!ls->dim)
-		return isl_local_space_free(ls);
-	return ls;
-}
-
-__isl_give isl_local_space *isl_local_space_add_dims(
-	__isl_take isl_local_space *ls, enum isl_dim_type type, unsigned n)
-{
-	int pos;
-
-	if (!ls)
-		return NULL;
-	pos = isl_local_space_dim(ls, type);
-	return isl_local_space_insert_dims(ls, type, pos, n);
-}
-
-/* Remove common factor of non-constant terms and denominator.
- */
-static void normalize_div(__isl_keep isl_local_space *ls, int div)
-{
-	isl_ctx *ctx = ls->div->ctx;
-	unsigned total = ls->div->n_col - 2;
-
-	isl_seq_gcd(ls->div->row[div] + 2, total, &ctx->normalize_gcd);
-	isl_int_gcd(ctx->normalize_gcd,
-		    ctx->normalize_gcd, ls->div->row[div][0]);
-	if (isl_int_is_one(ctx->normalize_gcd))
-		return;
-
-	isl_seq_scale_down(ls->div->row[div] + 2, ls->div->row[div] + 2,
-			    ctx->normalize_gcd, total);
-	isl_int_divexact(ls->div->row[div][0], ls->div->row[div][0],
-			    ctx->normalize_gcd);
-	isl_int_fdiv_q(ls->div->row[div][1], ls->div->row[div][1],
-			    ctx->normalize_gcd);
-}
-
-/* Exploit the equalities in "eq" to simplify the expressions of
- * the integer divisions in "ls".
- * The integer divisions in "ls" are assumed to appear as regular
- * dimensions in "eq".
- */
-__isl_give isl_local_space *isl_local_space_substitute_equalities(
-	__isl_take isl_local_space *ls, __isl_take isl_basic_set *eq)
-{
-	int i, j, k;
-	unsigned total;
-	unsigned n_div;
-
-	ls = isl_local_space_cow(ls);
-	if (!ls || !eq)
-		goto error;
-
-	total = isl_dim_total(eq->dim);
-	if (isl_local_space_dim(ls, isl_dim_all) != total)
-		isl_die(isl_local_space_get_ctx(ls), isl_error_invalid,
-			"dimensions don't match", goto error);
-	total++;
-	n_div = eq->n_div;
-	for (i = 0; i < eq->n_eq; ++i) {
-		j = isl_seq_last_non_zero(eq->eq[i], total + n_div);
-		if (j < 0 || j == 0 || j >= total)
-			continue;
-
-		for (k = 0; k < ls->div->n_row; ++k) {
-			if (isl_int_is_zero(ls->div->row[k][1 + j]))
-				continue;
-			isl_seq_elim(ls->div->row[k] + 1, eq->eq[i], j, total,
-					&ls->div->row[k][0]);
-			normalize_div(ls, k);
-		}
-	}
-
-	isl_basic_set_free(eq);
-	return ls;
-error:
-	isl_basic_set_free(eq);
-	isl_local_space_free(ls);
-	return NULL;
-}
-
-int isl_local_space_is_named_or_nested(__isl_keep isl_local_space *ls,
-	enum isl_dim_type type)
-{
-	if (!ls)
-		return -1;
-	return isl_dim_is_named_or_nested(ls->dim, type);
-}
-
-__isl_give isl_local_space *isl_local_space_drop_dims(
-	__isl_take isl_local_space *ls,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	isl_ctx *ctx;
-
-	if (!ls)
-		return NULL;
-	if (n == 0 && !isl_local_space_is_named_or_nested(ls, type))
-		return ls;
-
-	ctx = isl_local_space_get_ctx(ls);
-	if (first + n > isl_local_space_dim(ls, type))
-		isl_die(ctx, isl_error_invalid, "range out of bounds",
-			return isl_local_space_free(ls));
-
-	ls = isl_local_space_cow(ls);
-	if (!ls)
-		return NULL;
-
-	if (type == isl_dim_div) {
-		ls->div = isl_mat_drop_rows(ls->div, first, n);
-	} else {
-		ls->dim = isl_dim_drop(ls->dim, type, first, n);
-		if (!ls->dim)
-			return isl_local_space_free(ls);
-	}
-
-	first += 1 + isl_local_space_offset(ls, type);
-	ls->div = isl_mat_drop_cols(ls->div, first, n);
-	if (!ls->div)
-		return isl_local_space_free(ls);
-
-	return ls;
-}
-
-__isl_give isl_local_space *isl_local_space_insert_dims(
-	__isl_take isl_local_space *ls,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	isl_ctx *ctx;
-
-	if (!ls)
-		return NULL;
-	if (n == 0 && !isl_local_space_is_named_or_nested(ls, type))
-		return ls;
-
-	ctx = isl_local_space_get_ctx(ls);
-	if (first > isl_local_space_dim(ls, type))
-		isl_die(ctx, isl_error_invalid, "position out of bounds",
-			return isl_local_space_free(ls));
-
-	ls = isl_local_space_cow(ls);
-	if (!ls)
-		return NULL;
-
-	if (type == isl_dim_div) {
-		ls->div = isl_mat_insert_zero_rows(ls->div, first, n);
-	} else {
-		ls->dim = isl_dim_insert(ls->dim, type, first, n);
-		if (!ls->dim)
-			return isl_local_space_free(ls);
-	}
-
-	first += 1 + isl_local_space_offset(ls, type);
-	ls->div = isl_mat_insert_zero_cols(ls->div, first, n);
-	if (!ls->div)
-		return isl_local_space_free(ls);
-
-	return ls;
-}
diff --git a/cloog-0.16.3/isl/isl_local_space_private.h b/cloog-0.16.3/isl/isl_local_space_private.h
deleted file mode 100644
index 6f3e93d..0000000
--- a/cloog-0.16.3/isl/isl_local_space_private.h
+++ /dev/null
@@ -1,43 +0,0 @@
-#ifndef ISL_LOCAL_SPACE_PRIVATE_H
-#define ISL_LOCAL_SPACE_PRIVATE_H
-
-#include <isl/div.h>
-#include <isl/mat.h>
-#include <isl/set.h>
-#include <isl/local_space.h>
-
-struct isl_local_space {
-	int ref;
-
-	isl_dim *dim;
-	isl_mat *div;
-};
-
-__isl_give isl_local_space *isl_local_space_alloc(__isl_take isl_dim *dim,
-	unsigned n_div);
-
-__isl_give isl_local_space *isl_local_space_add_div(
-	__isl_take isl_local_space *ls, __isl_take isl_vec *div);
-
-__isl_give isl_mat *isl_merge_divs(__isl_keep isl_mat *div1,
-	__isl_keep isl_mat *div2, int *exp1, int *exp2);
-
-unsigned isl_local_space_offset(__isl_keep isl_local_space *ls,
-	enum isl_dim_type type);
-
-__isl_give isl_local_space *isl_local_space_replace_divs(
-	__isl_take isl_local_space *ls, __isl_take isl_mat *div);
-int isl_local_space_divs_known(__isl_keep isl_local_space *ls);
-
-__isl_give isl_local_space *isl_local_space_substitute_equalities(
-	__isl_take isl_local_space *ls, __isl_take isl_basic_set *eq);
-
-int isl_local_space_is_named_or_nested(__isl_keep isl_local_space *ls,
-	enum isl_dim_type type);
-
-__isl_give isl_local_space *isl_local_space_reset_dim(
-	__isl_take isl_local_space *ls, __isl_take isl_dim *dim);
-__isl_give isl_local_space *isl_local_space_realign(
-	__isl_take isl_local_space *ls, __isl_take isl_reordering *r);
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_lp.c b/cloog-0.16.3/isl/isl_lp.c
deleted file mode 100644
index 1673b5b..0000000
--- a/cloog-0.16.3/isl/isl_lp.c
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl/lp.h>
-#include "isl_lp_piplib.h"
-#include <isl/seq.h>
-#include "isl_tab.h"
-
-enum isl_lp_result isl_tab_solve_lp(struct isl_basic_map *bmap, int maximize,
-				      isl_int *f, isl_int denom, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **sol)
-{
-	struct isl_tab *tab;
-	enum isl_lp_result res;
-	unsigned dim = isl_basic_map_total_dim(bmap);
-
-	if (maximize)
-		isl_seq_neg(f, f, 1 + dim);
-
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	tab = isl_tab_from_basic_map(bmap);
-	res = isl_tab_min(tab, f, denom, opt, opt_denom, 0);
-	if (res == isl_lp_ok && sol) {
-		*sol = isl_tab_get_sample_value(tab);
-		if (!*sol)
-			res = isl_lp_error;
-	}
-	isl_tab_free(tab);
-
-	if (maximize)
-		isl_seq_neg(f, f, 1 + dim);
-	if (maximize && opt)
-		isl_int_neg(*opt, *opt);
-
-	return res;
-}
-
-/* Given a basic map "bmap" and an affine combination of the variables "f"
- * with denominator "denom", set *opt / *opt_denom to the minimal
- * (or maximal if "maximize" is true) value attained by f/d over "bmap",
- * assuming the basic map is not empty and the expression cannot attain
- * arbitrarily small (or large) values.
- * If opt_denom is NULL, then *opt is rounded up (or down)
- * to the nearest integer.
- * The return value reflects the nature of the result (empty, unbounded,
- * minmimal or maximal value returned in *opt).
- */
-enum isl_lp_result isl_basic_map_solve_lp(struct isl_basic_map *bmap, int max,
-				      isl_int *f, isl_int d, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **sol)
-{
-	if (sol)
-		*sol = NULL;
-
-	if (!bmap)
-		return isl_lp_error;
-
-	switch (bmap->ctx->opt->lp_solver) {
-	case ISL_LP_PIP:
-		return isl_pip_solve_lp(bmap, max, f, d, opt, opt_denom, sol);
-	case ISL_LP_TAB:
-		return isl_tab_solve_lp(bmap, max, f, d, opt, opt_denom, sol);
-	default:
-		return isl_lp_error;
-	}
-}
-
-enum isl_lp_result isl_basic_set_solve_lp(struct isl_basic_set *bset, int max,
-				      isl_int *f, isl_int d, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **sol)
-{
-	return isl_basic_map_solve_lp((struct isl_basic_map *)bset, max,
-					f, d, opt, opt_denom, sol);
-}
-
-enum isl_lp_result isl_map_solve_lp(__isl_keep isl_map *map, int max,
-				      isl_int *f, isl_int d, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **sol)
-{
-	int i;
-	isl_int o;
-	isl_int t;
-	isl_int opt_i;
-	isl_int opt_denom_i;
-	enum isl_lp_result res;
-	int max_div;
-	isl_vec *v = NULL;
-
-	if (!map)
-		return isl_lp_error;
-	if (map->n == 0)
-		return isl_lp_empty;
-
-	max_div = 0;
-	for (i = 0; i < map->n; ++i)
-		if (map->p[i]->n_div > max_div)
-			max_div = map->p[i]->n_div;
-	if (max_div > 0) {
-		unsigned total = isl_dim_total(map->dim);
-		v = isl_vec_alloc(map->ctx, 1 + total + max_div);
-		if (!v)
-			return isl_lp_error;
-		isl_seq_cpy(v->el, f, 1 + total);
-		isl_seq_clr(v->el + 1 + total, max_div);
-		f = v->el;
-	}
-
-	if (!opt && map->n > 1 && sol) {
-		isl_int_init(o);
-		opt = &o;
-	}
-	if (map->n > 0)
-		isl_int_init(opt_i);
-	if (map->n > 0 && opt_denom) {
-		isl_int_init(opt_denom_i);
-		isl_int_init(t);
-	}
-
-	res = isl_basic_map_solve_lp(map->p[0], max, f, d,
-					opt, opt_denom, sol);
-	if (res == isl_lp_error || res == isl_lp_unbounded)
-		goto done;
-
-	if (sol)
-		*sol = NULL;
-
-	for (i = 1; i < map->n; ++i) {
-		isl_vec *sol_i = NULL;
-		enum isl_lp_result res_i;
-		int better;
-
-		res_i = isl_basic_map_solve_lp(map->p[i], max, f, d,
-					    &opt_i,
-					    opt_denom ? &opt_denom_i : NULL,
-					    sol ? &sol_i : NULL);
-		if (res_i == isl_lp_error || res_i == isl_lp_unbounded) {
-			res = res_i;
-			goto done;
-		}
-		if (res_i == isl_lp_empty)
-			continue;
-		if (res == isl_lp_empty) {
-			better = 1;
-		} else if (!opt_denom) {
-			if (max)
-				better = isl_int_gt(opt_i, *opt);
-			else
-				better = isl_int_lt(opt_i, *opt);
-		} else {
-			isl_int_mul(t, opt_i, *opt_denom);
-			isl_int_submul(t, *opt, opt_denom_i);
-			if (max)
-				better = isl_int_is_pos(t);
-			else
-				better = isl_int_is_neg(t);
-		}
-		if (better) {
-			res = res_i;
-			if (opt)
-				isl_int_set(*opt, opt_i);
-			if (opt_denom)
-				isl_int_set(*opt_denom, opt_denom_i);
-			if (sol) {
-				isl_vec_free(*sol);
-				*sol = sol_i;
-			}
-		} else
-			isl_vec_free(sol_i);
-	}
-
-done:
-	isl_vec_free(v);
-	if (map->n > 0 && opt_denom) {
-		isl_int_clear(opt_denom_i);
-		isl_int_clear(t);
-	}
-	if (map->n > 0)
-		isl_int_clear(opt_i);
-	if (opt == &o)
-		isl_int_clear(o);
-	return res;
-}
-
-enum isl_lp_result isl_set_solve_lp(__isl_keep isl_set *set, int max,
-				      isl_int *f, isl_int d, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **sol)
-{
-	return isl_map_solve_lp((struct isl_map *)set, max,
-					f, d, opt, opt_denom, sol);
-}
diff --git a/cloog-0.16.3/isl/isl_lp_no_piplib.c b/cloog-0.16.3/isl/isl_lp_no_piplib.c
deleted file mode 100644
index 54c0135..0000000
--- a/cloog-0.16.3/isl/isl_lp_no_piplib.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include "isl_lp_piplib.h"
-
-enum isl_lp_result isl_pip_solve_lp(struct isl_basic_map *bmap, int maximize,
-				      isl_int *f, isl_int denom, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **sol)
-{
-	return isl_lp_error;
-}
diff --git a/cloog-0.16.3/isl/isl_lp_piplib.c b/cloog-0.16.3/isl/isl_lp_piplib.c
deleted file mode 100644
index d4b92af..0000000
--- a/cloog-0.16.3/isl/isl_lp_piplib.c
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl/map.h>
-#include <isl/vec.h>
-#include <isl/lp.h>
-#include "isl_piplib.h"
-#include "isl_map_piplib.h"
-
-static void copy_solution(struct isl_vec *vec, int maximize, isl_int *opt,
-	isl_int *opt_denom, PipQuast *sol)
-{
-	int i;
-	PipList *list;
-	isl_int tmp;
-
-	if (opt) {
-		if (opt_denom) {
-			isl_seq_cpy_from_pip(opt,
-				 &sol->list->vector->the_vector[0], 1);
-			isl_seq_cpy_from_pip(opt_denom,
-				 &sol->list->vector->the_deno[0], 1);
-		} else if (maximize)
-			mpz_fdiv_q(*opt, sol->list->vector->the_vector[0],
-					 sol->list->vector->the_deno[0]);
-		else
-			mpz_cdiv_q(*opt, sol->list->vector->the_vector[0],
-					 sol->list->vector->the_deno[0]);
-	}
-
-	if (!vec)
-		return;
-
-	isl_int_init(tmp);
-	isl_int_set_si(vec->el[0], 1);
-	for (i = 0, list = sol->list->next; list; ++i, list = list->next) {
-		isl_seq_cpy_from_pip(&vec->el[1 + i],
-			&list->vector->the_deno[0], 1);
-		isl_int_lcm(vec->el[0], vec->el[0], vec->el[1 + i]);
-	}
-	for (i = 0, list = sol->list->next; list; ++i, list = list->next) {
-		isl_seq_cpy_from_pip(&tmp, &list->vector->the_deno[0], 1);
-		isl_int_divexact(tmp, vec->el[0], tmp);
-		isl_seq_cpy_from_pip(&vec->el[1 + i],
-			&list->vector->the_vector[0], 1);
-		isl_int_mul(vec->el[1 + i], vec->el[1 + i], tmp);
-	}
-	isl_int_clear(tmp);
-}
-
-enum isl_lp_result isl_pip_solve_lp(struct isl_basic_map *bmap, int maximize,
-				      isl_int *f, isl_int denom, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **vec)
-{
-	enum isl_lp_result res = isl_lp_ok;
-	PipMatrix	*domain = NULL;
-	PipOptions	*options;
-	PipQuast   	*sol;
-	unsigned	 total;
-
-	total = isl_basic_map_total_dim(bmap);
-	domain = isl_basic_map_to_pip(bmap, 0, 1, 0);
-	if (!domain)
-		goto error;
-	entier_set_si(domain->p[0][1], -1);
-	isl_int_set(domain->p[0][domain->NbColumns - 1], f[0]);
-	isl_seq_cpy_to_pip(domain->p[0]+2, f+1, total);
-
-	options = pip_options_init();
-	if (!options)
-		goto error;
-	options->Urs_unknowns = -1;
-	options->Maximize = maximize;
-	options->Nq = 0;
-	sol = pip_solve(domain, NULL, -1, options);
-	pip_options_free(options);
-	if (!sol)
-		goto error;
-
-	if (vec) {
-		isl_ctx *ctx = isl_basic_map_get_ctx(bmap);
-		*vec = isl_vec_alloc(ctx, 1 + total);
-	}
-	if (vec && !*vec)
-		res = isl_lp_error;
-	else if (!sol->list)
-		res = isl_lp_empty;
-	else if (entier_zero_p(sol->list->vector->the_deno[0]))
-		res = isl_lp_unbounded;
-	else
-		copy_solution(*vec, maximize, opt, opt_denom, sol);
-	pip_matrix_free(domain);
-	pip_quast_free(sol);
-	return res;
-error:
-	if (domain)
-		pip_matrix_free(domain);
-	return isl_lp_error;
-}
diff --git a/cloog-0.16.3/isl/isl_lp_piplib.h b/cloog-0.16.3/isl/isl_lp_piplib.h
deleted file mode 100644
index e69a3b4..0000000
--- a/cloog-0.16.3/isl/isl_lp_piplib.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_LP_PIPLIB_H
-#define ISL_LP_PIPLIB_H
-
-#include <isl/lp.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-enum isl_lp_result isl_pip_solve_lp(struct isl_basic_map *bmap, int maximize,
-				      isl_int *f, isl_int denom, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **sol);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_map.c b/cloog-0.16.3/isl/isl_map.c
deleted file mode 100644
index 3d30064..0000000
--- a/cloog-0.16.3/isl/isl_map.c
+++ /dev/null
@@ -1,8951 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France 
- */
-
-#include <string.h>
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl/blk.h>
-#include "isl_dim_private.h"
-#include "isl_equalities.h"
-#include <isl_list_private.h>
-#include <isl/lp.h>
-#include <isl/seq.h>
-#include <isl/set.h>
-#include <isl/map.h>
-#include "isl_map_piplib.h"
-#include <isl_reordering.h>
-#include "isl_sample.h"
-#include "isl_tab.h"
-#include <isl/vec.h>
-#include <isl_mat_private.h>
-#include <isl_dim_map.h>
-#include <isl_local_space_private.h>
-#include <isl_aff_private.h>
-
-static unsigned n(struct isl_dim *dim, enum isl_dim_type type)
-{
-	switch (type) {
-	case isl_dim_param:	return dim->nparam;
-	case isl_dim_in:	return dim->n_in;
-	case isl_dim_out:	return dim->n_out;
-	case isl_dim_all:	return dim->nparam + dim->n_in + dim->n_out;
-	default:		return 0;
-	}
-}
-
-static unsigned pos(struct isl_dim *dim, enum isl_dim_type type)
-{
-	switch (type) {
-	case isl_dim_param:	return 1;
-	case isl_dim_in:	return 1 + dim->nparam;
-	case isl_dim_out:	return 1 + dim->nparam + dim->n_in;
-	default:		return 0;
-	}
-}
-
-unsigned isl_basic_map_dim(const struct isl_basic_map *bmap,
-				enum isl_dim_type type)
-{
-	if (!bmap)
-		return 0;
-	switch (type) {
-	case isl_dim_cst:	return 1;
-	case isl_dim_param:
-	case isl_dim_in:
-	case isl_dim_out:	return isl_dim_size(bmap->dim, type);
-	case isl_dim_div:	return bmap->n_div;
-	case isl_dim_all:	return isl_basic_map_total_dim(bmap);
-	default:		return 0;
-	}
-}
-
-unsigned isl_map_dim(const struct isl_map *map, enum isl_dim_type type)
-{
-	return map ? n(map->dim, type) : 0;
-}
-
-unsigned isl_set_dim(const struct isl_set *set, enum isl_dim_type type)
-{
-	return set ? n(set->dim, type) : 0;
-}
-
-unsigned isl_basic_map_offset(struct isl_basic_map *bmap,
-					enum isl_dim_type type)
-{
-	struct isl_dim *dim = bmap->dim;
-	switch (type) {
-	case isl_dim_cst:	return 0;
-	case isl_dim_param:	return 1;
-	case isl_dim_in:	return 1 + dim->nparam;
-	case isl_dim_out:	return 1 + dim->nparam + dim->n_in;
-	case isl_dim_div:	return 1 + dim->nparam + dim->n_in + dim->n_out;
-	default:		return 0;
-	}
-}
-
-unsigned isl_basic_set_offset(struct isl_basic_set *bset,
-					enum isl_dim_type type)
-{
-	return isl_basic_map_offset(bset, type);
-}
-
-static unsigned map_offset(struct isl_map *map, enum isl_dim_type type)
-{
-	return pos(map->dim, type);
-}
-
-unsigned isl_basic_set_dim(const struct isl_basic_set *bset,
-				enum isl_dim_type type)
-{
-	return isl_basic_map_dim((const struct isl_basic_map*)bset, type);
-}
-
-unsigned isl_basic_set_n_dim(const struct isl_basic_set *bset)
-{
-	return isl_basic_set_dim(bset, isl_dim_set);
-}
-
-unsigned isl_basic_set_n_param(const struct isl_basic_set *bset)
-{
-	return isl_basic_set_dim(bset, isl_dim_param);
-}
-
-unsigned isl_basic_set_total_dim(const struct isl_basic_set *bset)
-{
-	return isl_dim_total(bset->dim) + bset->n_div;
-}
-
-unsigned isl_set_n_dim(const struct isl_set *set)
-{
-	return isl_set_dim(set, isl_dim_set);
-}
-
-unsigned isl_set_n_param(const struct isl_set *set)
-{
-	return isl_set_dim(set, isl_dim_param);
-}
-
-unsigned isl_basic_map_n_in(const struct isl_basic_map *bmap)
-{
-	return bmap ? bmap->dim->n_in : 0;
-}
-
-unsigned isl_basic_map_n_out(const struct isl_basic_map *bmap)
-{
-	return bmap ? bmap->dim->n_out : 0;
-}
-
-unsigned isl_basic_map_n_param(const struct isl_basic_map *bmap)
-{
-	return bmap ? bmap->dim->nparam : 0;
-}
-
-unsigned isl_basic_map_n_div(const struct isl_basic_map *bmap)
-{
-	return bmap ? bmap->n_div : 0;
-}
-
-unsigned isl_basic_map_total_dim(const struct isl_basic_map *bmap)
-{
-	return bmap ? isl_dim_total(bmap->dim) + bmap->n_div : 0;
-}
-
-unsigned isl_map_n_in(const struct isl_map *map)
-{
-	return map->dim->n_in;
-}
-
-unsigned isl_map_n_out(const struct isl_map *map)
-{
-	return map->dim->n_out;
-}
-
-unsigned isl_map_n_param(const struct isl_map *map)
-{
-	return map->dim->nparam;
-}
-
-int isl_map_compatible_domain(struct isl_map *map, struct isl_set *set)
-{
-	int m;
-	if (!map || !set)
-		return -1;
-	m = isl_dim_match(map->dim, isl_dim_param, set->dim, isl_dim_param);
-	if (m < 0 || !m)
-		return m;
-	return isl_dim_tuple_match(map->dim, isl_dim_in, set->dim, isl_dim_set);
-}
-
-int isl_basic_map_compatible_domain(struct isl_basic_map *bmap,
-		struct isl_basic_set *bset)
-{
-	int m;
-	if (!bmap || !bset)
-		return -1;
-	m = isl_dim_match(bmap->dim, isl_dim_param, bset->dim, isl_dim_param);
-	if (m < 0 || !m)
-		return m;
-	return isl_dim_tuple_match(bmap->dim, isl_dim_in, bset->dim, isl_dim_set);
-}
-
-int isl_map_compatible_range(__isl_keep isl_map *map, __isl_keep isl_set *set)
-{
-	int m;
-	if (!map || !set)
-		return -1;
-	m = isl_dim_match(map->dim, isl_dim_param, set->dim, isl_dim_param);
-	if (m < 0 || !m)
-		return m;
-	return isl_dim_tuple_match(map->dim, isl_dim_out, set->dim, isl_dim_set);
-}
-
-int isl_basic_map_compatible_range(struct isl_basic_map *bmap,
-		struct isl_basic_set *bset)
-{
-	int m;
-	if (!bmap || !bset)
-		return -1;
-	m = isl_dim_match(bmap->dim, isl_dim_param, bset->dim, isl_dim_param);
-	if (m < 0 || !m)
-		return m;
-	return isl_dim_tuple_match(bmap->dim, isl_dim_out, bset->dim, isl_dim_set);
-}
-
-isl_ctx *isl_basic_map_get_ctx(__isl_keep isl_basic_map *bmap)
-{
-	return bmap ? bmap->ctx : NULL;
-}
-
-isl_ctx *isl_basic_set_get_ctx(__isl_keep isl_basic_set *bset)
-{
-	return bset ? bset->ctx : NULL;
-}
-
-isl_ctx *isl_map_get_ctx(__isl_keep isl_map *map)
-{
-	return map ? map->ctx : NULL;
-}
-
-isl_ctx *isl_set_get_ctx(__isl_keep isl_set *set)
-{
-	return set ? set->ctx : NULL;
-}
-
-struct isl_dim *isl_basic_map_get_dim(struct isl_basic_map *bmap)
-{
-	if (!bmap)
-		return NULL;
-	return isl_dim_copy(bmap->dim);
-}
-
-struct isl_dim *isl_basic_set_get_dim(struct isl_basic_set *bset)
-{
-	if (!bset)
-		return NULL;
-	return isl_dim_copy(bset->dim);
-}
-
-__isl_give isl_local_space *isl_basic_map_get_local_space(
-	__isl_keep isl_basic_map *bmap)
-{
-	int i;
-	isl_local_space *ls;
-	unsigned total;
-
-	if (!bmap)
-		return NULL;
-
-	total = isl_basic_map_total_dim(bmap);
-	ls = isl_local_space_alloc(isl_dim_copy(bmap->dim), bmap->n_div);
-	if (!ls)
-		return NULL;
-
-	for (i = 0; i < bmap->n_div; ++i)
-		isl_seq_cpy(ls->div->row[i], bmap->div[i], 2 + total);
-
-	return ls;
-}
-
-__isl_give isl_local_space *isl_basic_set_get_local_space(
-	__isl_keep isl_basic_set *bset)
-{
-	return isl_basic_map_get_local_space(bset);
-}
-
-__isl_give isl_basic_map *isl_basic_map_from_local_space(
-	__isl_take isl_local_space *ls)
-{
-	int i;
-	int n_div;
-	isl_basic_map *bmap;
-
-	if (!ls)
-		return NULL;
-
-	n_div = isl_local_space_dim(ls, isl_dim_div);
-	bmap = isl_basic_map_alloc_dim(isl_local_space_get_dim(ls),
-					n_div, 0, 2 * n_div);
-
-	for (i = 0; i < n_div; ++i)
-		if (isl_basic_map_alloc_div(bmap) < 0)
-			goto error;
-
-	for (i = 0; i < n_div; ++i) {
-		isl_seq_cpy(bmap->div[i], ls->div->row[i], ls->div->n_col);
-		if (isl_basic_map_add_div_constraints(bmap, i) < 0)
-			goto error;
-	}
-					
-	isl_local_space_free(ls);
-	return bmap;
-error:
-	isl_local_space_free(ls);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_from_local_space(
-	__isl_take isl_local_space *ls)
-{
-	return isl_basic_map_from_local_space(ls);
-}
-
-struct isl_dim *isl_map_get_dim(struct isl_map *map)
-{
-	if (!map)
-		return NULL;
-	return isl_dim_copy(map->dim);
-}
-
-struct isl_dim *isl_set_get_dim(struct isl_set *set)
-{
-	if (!set)
-		return NULL;
-	return isl_dim_copy(set->dim);
-}
-
-__isl_give isl_basic_map *isl_basic_map_set_tuple_name(
-	__isl_take isl_basic_map *bmap, enum isl_dim_type type, const char *s)
-{
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-	bmap->dim = isl_dim_set_tuple_name(bmap->dim, type, s);
-	if (!bmap->dim)
-		goto error;
-	bmap = isl_basic_map_finalize(bmap);
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_set_tuple_name(
-	__isl_take isl_basic_set *bset, const char *s)
-{
-	return isl_basic_map_set_tuple_name(bset, isl_dim_set, s);
-}
-
-const char *isl_basic_map_get_tuple_name(__isl_keep isl_basic_map *bmap,
-	enum isl_dim_type type)
-{
-	return bmap ? isl_dim_get_tuple_name(bmap->dim, type) : NULL;
-}
-
-__isl_give isl_map *isl_map_set_tuple_name(__isl_take isl_map *map,
-	enum isl_dim_type type, const char *s)
-{
-	int i;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	map->dim = isl_dim_set_tuple_name(map->dim, type, s);
-	if (!map->dim)
-		goto error;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_set_tuple_name(map->p[i], type, s);
-		if (!map->p[i])
-			goto error;
-	}
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-const char *isl_map_get_tuple_name(__isl_keep isl_map *map,
-	enum isl_dim_type type)
-{
-	return map ? isl_dim_get_tuple_name(map->dim, type) : NULL;
-}
-
-__isl_give isl_set *isl_set_set_tuple_name(__isl_take isl_set *set,
-	const char *s)
-{
-	return (isl_set *)isl_map_set_tuple_name((isl_map *)set, isl_dim_set, s);
-}
-
-const char *isl_basic_set_get_tuple_name(__isl_keep isl_basic_set *bset)
-{
-	return bset ? isl_dim_get_tuple_name(bset->dim, isl_dim_set) : NULL;
-}
-
-const char *isl_set_get_tuple_name(__isl_keep isl_set *set)
-{
-	return set ? isl_dim_get_tuple_name(set->dim, isl_dim_set) : NULL;
-}
-
-const char *isl_basic_map_get_dim_name(__isl_keep isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned pos)
-{
-	return bmap ? isl_dim_get_name(bmap->dim, type, pos) : NULL;
-}
-
-const char *isl_basic_set_get_dim_name(__isl_keep isl_basic_set *bset,
-	enum isl_dim_type type, unsigned pos)
-{
-	return bset ? isl_dim_get_name(bset->dim, type, pos) : NULL;
-}
-
-const char *isl_map_get_dim_name(__isl_keep isl_map *map,
-	enum isl_dim_type type, unsigned pos)
-{
-	return map ? isl_dim_get_name(map->dim, type, pos) : NULL;
-}
-
-const char *isl_set_get_dim_name(__isl_keep isl_set *set,
-	enum isl_dim_type type, unsigned pos)
-{
-	return set ? isl_dim_get_name(set->dim, type, pos) : NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_set_dim_name(
-	__isl_take isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned pos, const char *s)
-{
-	if (!bmap)
-		return NULL;
-	bmap->dim = isl_dim_set_name(bmap->dim, type, pos, s);
-	if (!bmap->dim)
-		goto error;
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_set_dim_name(__isl_take isl_map *map,
-	enum isl_dim_type type, unsigned pos, const char *s)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-
-	map->dim = isl_dim_set_name(map->dim, type, pos, s);
-	if (!map->dim)
-		goto error;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_set_dim_name(map->p[i], type, pos, s);
-		if (!map->p[i])
-			goto error;
-	}
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_set_dim_name(
-	__isl_take isl_basic_set *bset,
-	enum isl_dim_type type, unsigned pos, const char *s)
-{
-	return (isl_basic_set *)isl_basic_map_set_dim_name(
-		(isl_basic_map *)bset, type, pos, s);
-}
-
-__isl_give isl_set *isl_set_set_dim_name(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned pos, const char *s)
-{
-	return (isl_set *)isl_map_set_dim_name((isl_map *)set, type, pos, s);
-}
-
-int isl_basic_map_is_rational(__isl_keep isl_basic_map *bmap)
-{
-	if (!bmap)
-		return -1;
-	return ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL);
-}
-
-int isl_basic_set_is_rational(__isl_keep isl_basic_set *bset)
-{
-	return isl_basic_map_is_rational(bset);
-}
-
-static struct isl_basic_map *basic_map_init(struct isl_ctx *ctx,
-		struct isl_basic_map *bmap, unsigned extra,
-		unsigned n_eq, unsigned n_ineq)
-{
-	int i;
-	size_t row_size = 1 + isl_dim_total(bmap->dim) + extra;
-
-	bmap->ctx = ctx;
-	isl_ctx_ref(ctx);
-
-	bmap->block = isl_blk_alloc(ctx, (n_ineq + n_eq) * row_size);
-	if (isl_blk_is_error(bmap->block))
-		goto error;
-
-	bmap->ineq = isl_alloc_array(ctx, isl_int *, n_ineq + n_eq);
-	if (!bmap->ineq)
-		goto error;
-
-	if (extra == 0) {
-		bmap->block2 = isl_blk_empty();
-		bmap->div = NULL;
-	} else {
-		bmap->block2 = isl_blk_alloc(ctx, extra * (1 + row_size));
-		if (isl_blk_is_error(bmap->block2))
-			goto error;
-
-		bmap->div = isl_alloc_array(ctx, isl_int *, extra);
-		if (!bmap->div)
-			goto error;
-	}
-
-	for (i = 0; i < n_ineq + n_eq; ++i)
-		bmap->ineq[i] = bmap->block.data + i * row_size;
-
-	for (i = 0; i < extra; ++i)
-		bmap->div[i] = bmap->block2.data + i * (1 + row_size);
-
-	bmap->ref = 1;
-	bmap->flags = 0;
-	bmap->c_size = n_eq + n_ineq;
-	bmap->eq = bmap->ineq + n_ineq;
-	bmap->extra = extra;
-	bmap->n_eq = 0;
-	bmap->n_ineq = 0;
-	bmap->n_div = 0;
-	bmap->sample = NULL;
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_alloc(struct isl_ctx *ctx,
-		unsigned nparam, unsigned dim, unsigned extra,
-		unsigned n_eq, unsigned n_ineq)
-{
-	struct isl_basic_map *bmap;
-	bmap = isl_basic_map_alloc(ctx, nparam, 0, dim, extra, n_eq, n_ineq);
-	return (struct isl_basic_set *)bmap;
-}
-
-struct isl_basic_set *isl_basic_set_alloc_dim(struct isl_dim *dim,
-		unsigned extra, unsigned n_eq, unsigned n_ineq)
-{
-	struct isl_basic_map *bmap;
-	if (!dim)
-		return NULL;
-	isl_assert(dim->ctx, dim->n_in == 0, goto error);
-	bmap = isl_basic_map_alloc_dim(dim, extra, n_eq, n_ineq);
-	return (struct isl_basic_set *)bmap;
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-struct isl_basic_map *isl_basic_map_alloc_dim(struct isl_dim *dim,
-		unsigned extra, unsigned n_eq, unsigned n_ineq)
-{
-	struct isl_basic_map *bmap;
-
-	if (!dim)
-		return NULL;
-	bmap = isl_calloc_type(dim->ctx, struct isl_basic_map);
-	if (!bmap)
-		goto error;
-	bmap->dim = dim;
-
-	return basic_map_init(dim->ctx, bmap, extra, n_eq, n_ineq);
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-struct isl_basic_map *isl_basic_map_alloc(struct isl_ctx *ctx,
-		unsigned nparam, unsigned in, unsigned out, unsigned extra,
-		unsigned n_eq, unsigned n_ineq)
-{
-	struct isl_basic_map *bmap;
-	struct isl_dim *dim;
-
-	dim = isl_dim_alloc(ctx, nparam, in, out);
-	if (!dim)
-		return NULL;
-
-	bmap = isl_basic_map_alloc_dim(dim, extra, n_eq, n_ineq);
-	return bmap;
-}
-
-static void dup_constraints(
-		struct isl_basic_map *dst, struct isl_basic_map *src)
-{
-	int i;
-	unsigned total = isl_basic_map_total_dim(src);
-
-	for (i = 0; i < src->n_eq; ++i) {
-		int j = isl_basic_map_alloc_equality(dst);
-		isl_seq_cpy(dst->eq[j], src->eq[i], 1+total);
-	}
-
-	for (i = 0; i < src->n_ineq; ++i) {
-		int j = isl_basic_map_alloc_inequality(dst);
-		isl_seq_cpy(dst->ineq[j], src->ineq[i], 1+total);
-	}
-
-	for (i = 0; i < src->n_div; ++i) {
-		int j = isl_basic_map_alloc_div(dst);
-		isl_seq_cpy(dst->div[j], src->div[i], 1+1+total);
-	}
-	ISL_F_SET(dst, ISL_BASIC_SET_FINAL);
-}
-
-struct isl_basic_map *isl_basic_map_dup(struct isl_basic_map *bmap)
-{
-	struct isl_basic_map *dup;
-
-	if (!bmap)
-		return NULL;
-	dup = isl_basic_map_alloc_dim(isl_dim_copy(bmap->dim),
-			bmap->n_div, bmap->n_eq, bmap->n_ineq);
-	if (!dup)
-		return NULL;
-	dup_constraints(dup, bmap);
-	dup->flags = bmap->flags;
-	dup->sample = isl_vec_copy(bmap->sample);
-	return dup;
-}
-
-struct isl_basic_set *isl_basic_set_dup(struct isl_basic_set *bset)
-{
-	struct isl_basic_map *dup;
-
-	dup = isl_basic_map_dup((struct isl_basic_map *)bset);
-	return (struct isl_basic_set *)dup;
-}
-
-struct isl_basic_set *isl_basic_set_copy(struct isl_basic_set *bset)
-{
-	if (!bset)
-		return NULL;
-
-	if (ISL_F_ISSET(bset, ISL_BASIC_SET_FINAL)) {
-		bset->ref++;
-		return bset;
-	}
-	return isl_basic_set_dup(bset);
-}
-
-struct isl_set *isl_set_copy(struct isl_set *set)
-{
-	if (!set)
-		return NULL;
-
-	set->ref++;
-	return set;
-}
-
-struct isl_basic_map *isl_basic_map_copy(struct isl_basic_map *bmap)
-{
-	if (!bmap)
-		return NULL;
-
-	if (ISL_F_ISSET(bmap, ISL_BASIC_SET_FINAL)) {
-		bmap->ref++;
-		return bmap;
-	}
-	bmap = isl_basic_map_dup(bmap);
-	if (bmap)
-		ISL_F_SET(bmap, ISL_BASIC_SET_FINAL);
-	return bmap;
-}
-
-struct isl_map *isl_map_copy(struct isl_map *map)
-{
-	if (!map)
-		return NULL;
-
-	map->ref++;
-	return map;
-}
-
-void isl_basic_map_free(struct isl_basic_map *bmap)
-{
-	if (!bmap)
-		return;
-
-	if (--bmap->ref > 0)
-		return;
-
-	isl_ctx_deref(bmap->ctx);
-	free(bmap->div);
-	isl_blk_free(bmap->ctx, bmap->block2);
-	free(bmap->ineq);
-	isl_blk_free(bmap->ctx, bmap->block);
-	isl_vec_free(bmap->sample);
-	isl_dim_free(bmap->dim);
-	free(bmap);
-}
-
-void isl_basic_set_free(struct isl_basic_set *bset)
-{
-	isl_basic_map_free((struct isl_basic_map *)bset);
-}
-
-static int room_for_con(struct isl_basic_map *bmap, unsigned n)
-{
-	return bmap->n_eq + bmap->n_ineq + n <= bmap->c_size;
-}
-
-int isl_basic_map_alloc_equality(struct isl_basic_map *bmap)
-{
-	struct isl_ctx *ctx;
-	if (!bmap)
-		return -1;
-	ctx = bmap->ctx;
-	isl_assert(ctx, room_for_con(bmap, 1), return -1);
-	isl_assert(ctx, (bmap->eq - bmap->ineq) + bmap->n_eq <= bmap->c_size,
-			return -1);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NO_REDUNDANT);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NO_IMPLICIT);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_ALL_EQUALITIES);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED_DIVS);
-	if ((bmap->eq - bmap->ineq) + bmap->n_eq == bmap->c_size) {
-		isl_int *t;
-		int j = isl_basic_map_alloc_inequality(bmap);
-		if (j < 0)
-			return -1;
-		t = bmap->ineq[j];
-		bmap->ineq[j] = bmap->ineq[bmap->n_ineq - 1];
-		bmap->ineq[bmap->n_ineq - 1] = bmap->eq[-1];
-		bmap->eq[-1] = t;
-		bmap->n_eq++;
-		bmap->n_ineq--;
-		bmap->eq--;
-		return 0;
-	}
-	isl_seq_clr(bmap->eq[bmap->n_eq] + 1 + isl_basic_map_total_dim(bmap),
-		      bmap->extra - bmap->n_div);
-	return bmap->n_eq++;
-}
-
-int isl_basic_set_alloc_equality(struct isl_basic_set *bset)
-{
-	return isl_basic_map_alloc_equality((struct isl_basic_map *)bset);
-}
-
-int isl_basic_map_free_equality(struct isl_basic_map *bmap, unsigned n)
-{
-	if (!bmap)
-		return -1;
-	isl_assert(bmap->ctx, n <= bmap->n_eq, return -1);
-	bmap->n_eq -= n;
-	return 0;
-}
-
-int isl_basic_set_free_equality(struct isl_basic_set *bset, unsigned n)
-{
-	return isl_basic_map_free_equality((struct isl_basic_map *)bset, n);
-}
-
-int isl_basic_map_drop_equality(struct isl_basic_map *bmap, unsigned pos)
-{
-	isl_int *t;
-	if (!bmap)
-		return -1;
-	isl_assert(bmap->ctx, pos < bmap->n_eq, return -1);
-
-	if (pos != bmap->n_eq - 1) {
-		t = bmap->eq[pos];
-		bmap->eq[pos] = bmap->eq[bmap->n_eq - 1];
-		bmap->eq[bmap->n_eq - 1] = t;
-	}
-	bmap->n_eq--;
-	return 0;
-}
-
-int isl_basic_set_drop_equality(struct isl_basic_set *bset, unsigned pos)
-{
-	return isl_basic_map_drop_equality((struct isl_basic_map *)bset, pos);
-}
-
-void isl_basic_map_inequality_to_equality(
-		struct isl_basic_map *bmap, unsigned pos)
-{
-	isl_int *t;
-
-	t = bmap->ineq[pos];
-	bmap->ineq[pos] = bmap->ineq[bmap->n_ineq - 1];
-	bmap->ineq[bmap->n_ineq - 1] = bmap->eq[-1];
-	bmap->eq[-1] = t;
-	bmap->n_eq++;
-	bmap->n_ineq--;
-	bmap->eq--;
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NO_REDUNDANT);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED_DIVS);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_ALL_EQUALITIES);
-}
-
-static int room_for_ineq(struct isl_basic_map *bmap, unsigned n)
-{
-	return bmap->n_ineq + n <= bmap->eq - bmap->ineq;
-}
-
-int isl_basic_map_alloc_inequality(struct isl_basic_map *bmap)
-{
-	struct isl_ctx *ctx;
-	if (!bmap)
-		return -1;
-	ctx = bmap->ctx;
-	isl_assert(ctx, room_for_ineq(bmap, 1), return -1);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NO_IMPLICIT);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NO_REDUNDANT);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_ALL_EQUALITIES);
-	isl_seq_clr(bmap->ineq[bmap->n_ineq] +
-		      1 + isl_basic_map_total_dim(bmap),
-		      bmap->extra - bmap->n_div);
-	return bmap->n_ineq++;
-}
-
-int isl_basic_set_alloc_inequality(struct isl_basic_set *bset)
-{
-	return isl_basic_map_alloc_inequality((struct isl_basic_map *)bset);
-}
-
-int isl_basic_map_free_inequality(struct isl_basic_map *bmap, unsigned n)
-{
-	if (!bmap)
-		return -1;
-	isl_assert(bmap->ctx, n <= bmap->n_ineq, return -1);
-	bmap->n_ineq -= n;
-	return 0;
-}
-
-int isl_basic_set_free_inequality(struct isl_basic_set *bset, unsigned n)
-{
-	return isl_basic_map_free_inequality((struct isl_basic_map *)bset, n);
-}
-
-int isl_basic_map_drop_inequality(struct isl_basic_map *bmap, unsigned pos)
-{
-	isl_int *t;
-	if (!bmap)
-		return -1;
-	isl_assert(bmap->ctx, pos < bmap->n_ineq, return -1);
-
-	if (pos != bmap->n_ineq - 1) {
-		t = bmap->ineq[pos];
-		bmap->ineq[pos] = bmap->ineq[bmap->n_ineq - 1];
-		bmap->ineq[bmap->n_ineq - 1] = t;
-		ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-	}
-	bmap->n_ineq--;
-	return 0;
-}
-
-int isl_basic_set_drop_inequality(struct isl_basic_set *bset, unsigned pos)
-{
-	return isl_basic_map_drop_inequality((struct isl_basic_map *)bset, pos);
-}
-
-__isl_give isl_basic_map *isl_basic_map_add_eq(__isl_take isl_basic_map *bmap,
-	isl_int *eq)
-{
-	int k;
-
-	bmap = isl_basic_map_extend_constraints(bmap, 1, 0);
-	if (!bmap)
-		return NULL;
-	k = isl_basic_map_alloc_equality(bmap);
-	if (k < 0)
-		goto error;
-	isl_seq_cpy(bmap->eq[k], eq, 1 + isl_basic_map_total_dim(bmap));
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_add_eq(__isl_take isl_basic_set *bset,
-	isl_int *eq)
-{
-	return (isl_basic_set *)
-		isl_basic_map_add_eq((isl_basic_map *)bset, eq);
-}
-
-__isl_give isl_basic_map *isl_basic_map_add_ineq(__isl_take isl_basic_map *bmap,
-	isl_int *ineq)
-{
-	int k;
-
-	bmap = isl_basic_map_extend_constraints(bmap, 0, 1);
-	if (!bmap)
-		return NULL;
-	k = isl_basic_map_alloc_inequality(bmap);
-	if (k < 0)
-		goto error;
-	isl_seq_cpy(bmap->ineq[k], ineq, 1 + isl_basic_map_total_dim(bmap));
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_add_ineq(__isl_take isl_basic_set *bset,
-	isl_int *ineq)
-{
-	return (isl_basic_set *)
-		isl_basic_map_add_ineq((isl_basic_map *)bset, ineq);
-}
-
-int isl_basic_map_alloc_div(struct isl_basic_map *bmap)
-{
-	if (!bmap)
-		return -1;
-	isl_assert(bmap->ctx, bmap->n_div < bmap->extra, return -1);
-	isl_seq_clr(bmap->div[bmap->n_div] +
-		      1 + 1 + isl_basic_map_total_dim(bmap),
-		      bmap->extra - bmap->n_div);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED_DIVS);
-	return bmap->n_div++;
-}
-
-int isl_basic_set_alloc_div(struct isl_basic_set *bset)
-{
-	return isl_basic_map_alloc_div((struct isl_basic_map *)bset);
-}
-
-int isl_basic_map_free_div(struct isl_basic_map *bmap, unsigned n)
-{
-	if (!bmap)
-		return -1;
-	isl_assert(bmap->ctx, n <= bmap->n_div, return -1);
-	bmap->n_div -= n;
-	return 0;
-}
-
-int isl_basic_set_free_div(struct isl_basic_set *bset, unsigned n)
-{
-	return isl_basic_map_free_div((struct isl_basic_map *)bset, n);
-}
-
-/* Copy constraint from src to dst, putting the vars of src at offset
- * dim_off in dst and the divs of src at offset div_off in dst.
- * If both sets are actually map, then dim_off applies to the input
- * variables.
- */
-static void copy_constraint(struct isl_basic_map *dst_map, isl_int *dst,
-			    struct isl_basic_map *src_map, isl_int *src,
-			    unsigned in_off, unsigned out_off, unsigned div_off)
-{
-	unsigned src_nparam = isl_basic_map_n_param(src_map);
-	unsigned dst_nparam = isl_basic_map_n_param(dst_map);
-	unsigned src_in = isl_basic_map_n_in(src_map);
-	unsigned dst_in = isl_basic_map_n_in(dst_map);
-	unsigned src_out = isl_basic_map_n_out(src_map);
-	unsigned dst_out = isl_basic_map_n_out(dst_map);
-	isl_int_set(dst[0], src[0]);
-	isl_seq_cpy(dst+1, src+1, isl_min(dst_nparam, src_nparam));
-	if (dst_nparam > src_nparam)
-		isl_seq_clr(dst+1+src_nparam,
-				dst_nparam - src_nparam);
-	isl_seq_clr(dst+1+dst_nparam, in_off);
-	isl_seq_cpy(dst+1+dst_nparam+in_off,
-		    src+1+src_nparam,
-		    isl_min(dst_in-in_off, src_in));
-	if (dst_in-in_off > src_in)
-		isl_seq_clr(dst+1+dst_nparam+in_off+src_in,
-				dst_in - in_off - src_in);
-	isl_seq_clr(dst+1+dst_nparam+dst_in, out_off);
-	isl_seq_cpy(dst+1+dst_nparam+dst_in+out_off,
-		    src+1+src_nparam+src_in,
-		    isl_min(dst_out-out_off, src_out));
-	if (dst_out-out_off > src_out)
-		isl_seq_clr(dst+1+dst_nparam+dst_in+out_off+src_out,
-				dst_out - out_off - src_out);
-	isl_seq_clr(dst+1+dst_nparam+dst_in+dst_out, div_off);
-	isl_seq_cpy(dst+1+dst_nparam+dst_in+dst_out+div_off,
-		    src+1+src_nparam+src_in+src_out,
-		    isl_min(dst_map->extra-div_off, src_map->n_div));
-	if (dst_map->n_div-div_off > src_map->n_div)
-		isl_seq_clr(dst+1+dst_nparam+dst_in+dst_out+
-				div_off+src_map->n_div,
-				dst_map->n_div - div_off - src_map->n_div);
-}
-
-static void copy_div(struct isl_basic_map *dst_map, isl_int *dst,
-		     struct isl_basic_map *src_map, isl_int *src,
-		     unsigned in_off, unsigned out_off, unsigned div_off)
-{
-	isl_int_set(dst[0], src[0]);
-	copy_constraint(dst_map, dst+1, src_map, src+1, in_off, out_off, div_off);
-}
-
-static struct isl_basic_map *add_constraints(struct isl_basic_map *bmap1,
-		struct isl_basic_map *bmap2, unsigned i_pos, unsigned o_pos)
-{
-	int i;
-	unsigned div_off;
-
-	if (!bmap1 || !bmap2)
-		goto error;
-
-	div_off = bmap1->n_div;
-
-	for (i = 0; i < bmap2->n_eq; ++i) {
-		int i1 = isl_basic_map_alloc_equality(bmap1);
-		if (i1 < 0)
-			goto error;
-		copy_constraint(bmap1, bmap1->eq[i1], bmap2, bmap2->eq[i],
-				i_pos, o_pos, div_off);
-	}
-
-	for (i = 0; i < bmap2->n_ineq; ++i) {
-		int i1 = isl_basic_map_alloc_inequality(bmap1);
-		if (i1 < 0)
-			goto error;
-		copy_constraint(bmap1, bmap1->ineq[i1], bmap2, bmap2->ineq[i],
-				i_pos, o_pos, div_off);
-	}
-
-	for (i = 0; i < bmap2->n_div; ++i) {
-		int i1 = isl_basic_map_alloc_div(bmap1);
-		if (i1 < 0)
-			goto error;
-		copy_div(bmap1, bmap1->div[i1], bmap2, bmap2->div[i],
-			 i_pos, o_pos, div_off);
-	}
-
-	isl_basic_map_free(bmap2);
-
-	return bmap1;
-
-error:
-	isl_basic_map_free(bmap1);
-	isl_basic_map_free(bmap2);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_add_constraints(struct isl_basic_set *bset1,
-		struct isl_basic_set *bset2, unsigned pos)
-{
-	return (struct isl_basic_set *)
-		add_constraints((struct isl_basic_map *)bset1,
-				(struct isl_basic_map *)bset2, 0, pos);
-}
-
-struct isl_basic_map *isl_basic_map_extend_dim(struct isl_basic_map *base,
-		struct isl_dim *dim, unsigned extra,
-		unsigned n_eq, unsigned n_ineq)
-{
-	struct isl_basic_map *ext;
-	unsigned flags;
-	int dims_ok;
-
-	if (!dim)
-		goto error;
-
-	if (!base)
-		goto error;
-
-	dims_ok = isl_dim_equal(base->dim, dim) &&
-		  base->extra >= base->n_div + extra;
-
-	if (dims_ok && room_for_con(base, n_eq + n_ineq) &&
-		       room_for_ineq(base, n_ineq)) {
-		isl_dim_free(dim);
-		return base;
-	}
-
-	isl_assert(base->ctx, base->dim->nparam <= dim->nparam, goto error);
-	isl_assert(base->ctx, base->dim->n_in <= dim->n_in, goto error);
-	isl_assert(base->ctx, base->dim->n_out <= dim->n_out, goto error);
-	extra += base->extra;
-	n_eq += base->n_eq;
-	n_ineq += base->n_ineq;
-
-	ext = isl_basic_map_alloc_dim(dim, extra, n_eq, n_ineq);
-	dim = NULL;
-	if (!ext)
-		goto error;
-
-	if (dims_ok)
-		ext->sample = isl_vec_copy(base->sample);
-	flags = base->flags;
-	ext = add_constraints(ext, base, 0, 0);
-	if (ext) {
-		ext->flags = flags;
-		ISL_F_CLR(ext, ISL_BASIC_SET_FINAL);
-	}
-
-	return ext;
-
-error:
-	isl_dim_free(dim);
-	isl_basic_map_free(base);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_extend_dim(struct isl_basic_set *base,
-		struct isl_dim *dim, unsigned extra,
-		unsigned n_eq, unsigned n_ineq)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_extend_dim((struct isl_basic_map *)base, dim,
-							extra, n_eq, n_ineq);
-}
-
-struct isl_basic_map *isl_basic_map_extend_constraints(
-		struct isl_basic_map *base, unsigned n_eq, unsigned n_ineq)
-{
-	if (!base)
-		return NULL;
-	return isl_basic_map_extend_dim(base, isl_dim_copy(base->dim),
-					0, n_eq, n_ineq);
-}
-
-struct isl_basic_map *isl_basic_map_extend(struct isl_basic_map *base,
-		unsigned nparam, unsigned n_in, unsigned n_out, unsigned extra,
-		unsigned n_eq, unsigned n_ineq)
-{
-	struct isl_basic_map *bmap;
-	struct isl_dim *dim;
-
-	if (!base)
-		return NULL;
-	dim = isl_dim_alloc(base->ctx, nparam, n_in, n_out);
-	if (!dim)
-		goto error;
-
-	bmap = isl_basic_map_extend_dim(base, dim, extra, n_eq, n_ineq);
-	return bmap;
-error:
-	isl_basic_map_free(base);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_extend(struct isl_basic_set *base,
-		unsigned nparam, unsigned dim, unsigned extra,
-		unsigned n_eq, unsigned n_ineq)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_extend((struct isl_basic_map *)base,
-					nparam, 0, dim, extra, n_eq, n_ineq);
-}
-
-struct isl_basic_set *isl_basic_set_extend_constraints(
-		struct isl_basic_set *base, unsigned n_eq, unsigned n_ineq)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_extend_constraints((struct isl_basic_map *)base,
-						    n_eq, n_ineq);
-}
-
-struct isl_basic_set *isl_basic_set_cow(struct isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_cow((struct isl_basic_map *)bset);
-}
-
-struct isl_basic_map *isl_basic_map_cow(struct isl_basic_map *bmap)
-{
-	if (!bmap)
-		return NULL;
-
-	if (bmap->ref > 1) {
-		bmap->ref--;
-		bmap = isl_basic_map_dup(bmap);
-	}
-	if (bmap)
-		ISL_F_CLR(bmap, ISL_BASIC_SET_FINAL);
-	return bmap;
-}
-
-struct isl_set *isl_set_cow(struct isl_set *set)
-{
-	if (!set)
-		return NULL;
-
-	if (set->ref == 1)
-		return set;
-	set->ref--;
-	return isl_set_dup(set);
-}
-
-struct isl_map *isl_map_cow(struct isl_map *map)
-{
-	if (!map)
-		return NULL;
-
-	if (map->ref == 1)
-		return map;
-	map->ref--;
-	return isl_map_dup(map);
-}
-
-static void swap_vars(struct isl_blk blk, isl_int *a,
-			unsigned a_len, unsigned b_len)
-{
-	isl_seq_cpy(blk.data, a+a_len, b_len);
-	isl_seq_cpy(blk.data+b_len, a, a_len);
-	isl_seq_cpy(a, blk.data, b_len+a_len);
-}
-
-static __isl_give isl_basic_map *isl_basic_map_swap_vars(
-	__isl_take isl_basic_map *bmap, unsigned pos, unsigned n1, unsigned n2)
-{
-	int i;
-	struct isl_blk blk;
-
-	if (!bmap)
-		goto error;
-
-	isl_assert(bmap->ctx,
-		pos + n1 + n2 <= 1 + isl_basic_map_total_dim(bmap), goto error);
-
-	if (n1 == 0 || n2 == 0)
-		return bmap;
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-
-	blk = isl_blk_alloc(bmap->ctx, n1 + n2);
-	if (isl_blk_is_error(blk))
-		goto error;
-
-	for (i = 0; i < bmap->n_eq; ++i)
-		swap_vars(blk,
-			  bmap->eq[i] + pos, n1, n2);
-
-	for (i = 0; i < bmap->n_ineq; ++i)
-		swap_vars(blk,
-			  bmap->ineq[i] + pos, n1, n2);
-
-	for (i = 0; i < bmap->n_div; ++i)
-		swap_vars(blk,
-			  bmap->div[i]+1 + pos, n1, n2);
-
-	isl_blk_free(bmap->ctx, blk);
-
-	ISL_F_CLR(bmap, ISL_BASIC_SET_NORMALIZED);
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static __isl_give isl_basic_set *isl_basic_set_swap_vars(
-	__isl_take isl_basic_set *bset, unsigned n)
-{
-	unsigned dim;
-	unsigned nparam;
-
-	nparam = isl_basic_set_n_param(bset);
-	dim = isl_basic_set_n_dim(bset);
-	isl_assert(bset->ctx, n <= dim, goto error);
-
-	return isl_basic_map_swap_vars(bset, 1 + nparam, n, dim - n);
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-struct isl_basic_map *isl_basic_map_set_to_empty(struct isl_basic_map *bmap)
-{
-	int i = 0;
-	unsigned total;
-	if (!bmap)
-		goto error;
-	total = isl_basic_map_total_dim(bmap);
-	isl_basic_map_free_div(bmap, bmap->n_div);
-	isl_basic_map_free_inequality(bmap, bmap->n_ineq);
-	if (bmap->n_eq > 0)
-		isl_basic_map_free_equality(bmap, bmap->n_eq-1);
-	else {
-		i = isl_basic_map_alloc_equality(bmap);
-		if (i < 0)
-			goto error;
-	}
-	isl_int_set_si(bmap->eq[i][0], 1);
-	isl_seq_clr(bmap->eq[i]+1, total);
-	ISL_F_SET(bmap, ISL_BASIC_MAP_EMPTY);
-	isl_vec_free(bmap->sample);
-	bmap->sample = NULL;
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_set_to_empty(struct isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_set_to_empty((struct isl_basic_map *)bset);
-}
-
-void isl_basic_map_swap_div(struct isl_basic_map *bmap, int a, int b)
-{
-	int i;
-	unsigned off = isl_dim_total(bmap->dim);
-	isl_int *t = bmap->div[a];
-	bmap->div[a] = bmap->div[b];
-	bmap->div[b] = t;
-
-	for (i = 0; i < bmap->n_eq; ++i)
-		isl_int_swap(bmap->eq[i][1+off+a], bmap->eq[i][1+off+b]);
-
-	for (i = 0; i < bmap->n_ineq; ++i)
-		isl_int_swap(bmap->ineq[i][1+off+a], bmap->ineq[i][1+off+b]);
-
-	for (i = 0; i < bmap->n_div; ++i)
-		isl_int_swap(bmap->div[i][1+1+off+a], bmap->div[i][1+1+off+b]);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-}
-
-/* Eliminate the specified n dimensions starting at first from the
- * constraints using Fourier-Motzkin.  The dimensions themselves
- * are not removed.
- */
-__isl_give isl_map *isl_map_eliminate(__isl_take isl_map *map,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-	if (n == 0)
-		return map;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-	isl_assert(map->ctx, first + n <= isl_map_dim(map, type), goto error);
-	first += pos(map->dim, type) - 1;
-	
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_eliminate_vars(map->p[i], first, n);
-		if (!map->p[i])
-			goto error;
-	}
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Eliminate the specified n dimensions starting at first from the
- * constraints using Fourier-Motzkin.  The dimensions themselves
- * are not removed.
- */
-__isl_give isl_set *isl_set_eliminate(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	return (isl_set *)isl_map_eliminate((isl_map *)set, type, first, n);
-}
-
-/* Eliminate the specified n dimensions starting at first from the
- * constraints using Fourier-Motzkin.  The dimensions themselves
- * are not removed.
- */
-__isl_give isl_set *isl_set_eliminate_dims(__isl_take isl_set *set,
-	unsigned first, unsigned n)
-{
-	return isl_set_eliminate(set, isl_dim_set, first, n);
-}
-
-__isl_give isl_basic_map *isl_basic_map_remove_divs(
-	__isl_take isl_basic_map *bmap)
-{
-	bmap = isl_basic_map_eliminate_vars(bmap, isl_dim_total(bmap->dim),
-						bmap->n_div);
-	if (!bmap)
-		return NULL;
-	bmap->n_div = 0;
-	return isl_basic_map_finalize(bmap);
-}
-
-__isl_give isl_basic_set *isl_basic_set_remove_divs(
-	__isl_take isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)isl_basic_map_remove_divs(
-			(struct isl_basic_map *)bset);
-}
-
-__isl_give isl_map *isl_map_remove_divs(__isl_take isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-	if (map->n == 0)
-		return map;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-	
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_remove_divs(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_remove_divs(__isl_take isl_set *set)
-{
-	return isl_map_remove_divs(set);
-}
-
-struct isl_basic_map *isl_basic_map_remove_dims(struct isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	if (!bmap)
-		return NULL;
-	isl_assert(bmap->ctx, first + n <= isl_basic_map_dim(bmap, type),
-			goto error);
-	if (n == 0)
-		return bmap;
-	bmap = isl_basic_map_eliminate_vars(bmap,
-			isl_basic_map_offset(bmap, type) - 1 + first, n);
-	if (!bmap)
-		return bmap;
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY) && type == isl_dim_div)
-		return bmap;
-	bmap = isl_basic_map_drop(bmap, type, first, n);
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Return true if the definition of the given div (recursively) involves
- * any of the given variables.
- */
-static int div_involves_vars(__isl_keep isl_basic_map *bmap, int div,
-	unsigned first, unsigned n)
-{
-	int i;
-	unsigned div_offset = isl_basic_map_offset(bmap, isl_dim_div);
-
-	if (isl_int_is_zero(bmap->div[div][0]))
-		return 0;
-	if (isl_seq_first_non_zero(bmap->div[div] + 1 + first, n) >= 0)
-		return 1;
-
-	for (i = bmap->n_div - 1; i >= 0; --i) {
-		if (isl_int_is_zero(bmap->div[div][1 + div_offset + i]))
-			continue;
-		if (div_involves_vars(bmap, i, first, n))
-			return 1;
-	}
-
-	return 0;
-}
-
-/* Remove all divs (recursively) involving any of the given dimensions
- * in their definitions.
- */
-__isl_give isl_basic_map *isl_basic_map_remove_divs_involving_dims(
-	__isl_take isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!bmap)
-		return NULL;
-	isl_assert(bmap->ctx, first + n <= isl_basic_map_dim(bmap, type),
-			goto error);
-	first += isl_basic_map_offset(bmap, type);
-
-	for (i = bmap->n_div - 1; i >= 0; --i) {
-		if (!div_involves_vars(bmap, i, first, n))
-			continue;
-		bmap = isl_basic_map_remove_dims(bmap, isl_dim_div, i, 1);
-		if (!bmap)
-			return NULL;
-		i = bmap->n_div;
-	}
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_remove_divs_involving_dims(__isl_take isl_map *map,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-	if (map->n == 0)
-		return map;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_remove_divs_involving_dims(map->p[i],
-								type, first, n);
-		if (!map->p[i])
-			goto error;
-	}
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_remove_divs_involving_dims(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	return (isl_set *)isl_map_remove_divs_involving_dims((isl_map *)set,
-							      type, first, n);
-}
-
-int isl_basic_set_involves_dims(__isl_keep isl_basic_set *bset,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!bset)
-		return -1;
-
-	if (first + n > isl_basic_set_dim(bset, type))
-		isl_die(bset->ctx, isl_error_invalid,
-			"index out of bounds", return -1);
-
-	first += isl_basic_set_offset(bset, type);
-	for (i = 0; i < bset->n_eq; ++i)
-		if (isl_seq_first_non_zero(bset->eq[i] + first, n) >= 0)
-			return 1;
-	for (i = 0; i < bset->n_ineq; ++i)
-		if (isl_seq_first_non_zero(bset->ineq[i] + first, n) >= 0)
-			return 1;
-
-	return 0;
-}
-
-int isl_set_involves_dims(__isl_keep isl_set *set,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!set)
-		return -1;
-
-	if (first + n > isl_set_dim(set, type))
-		isl_die(set->ctx, isl_error_invalid,
-			"index out of bounds", return -1);
-
-	for (i = 0; i < set->n; ++i) {
-		int involves = isl_basic_set_involves_dims(set->p[i],
-							    type, first, n);
-		if (involves < 0 || !involves)
-			return involves;
-	}
-
-	return 1;
-}
-
-/* Return true if the definition of the given div is unknown or depends
- * on unknown divs.
- */
-static int div_is_unknown(__isl_keep isl_basic_map *bmap, int div)
-{
-	int i;
-	unsigned div_offset = isl_basic_map_offset(bmap, isl_dim_div);
-
-	if (isl_int_is_zero(bmap->div[div][0]))
-		return 1;
-
-	for (i = bmap->n_div - 1; i >= 0; --i) {
-		if (isl_int_is_zero(bmap->div[div][1 + div_offset + i]))
-			continue;
-		if (div_is_unknown(bmap, i))
-			return 1;
-	}
-
-	return 0;
-}
-
-/* Remove all divs that are unknown or defined in terms of unknown divs.
- */
-__isl_give isl_basic_map *isl_basic_map_remove_unknown_divs(
-	__isl_take isl_basic_map *bmap)
-{
-	int i;
-
-	if (!bmap)
-		return NULL;
-
-	for (i = bmap->n_div - 1; i >= 0; --i) {
-		if (!div_is_unknown(bmap, i))
-			continue;
-		bmap = isl_basic_map_remove_dims(bmap, isl_dim_div, i, 1);
-	}
-
-	return bmap;
-}
-
-__isl_give isl_map *isl_map_remove_unknown_divs(__isl_take isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-	if (map->n == 0)
-		return map;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_remove_unknown_divs(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_remove_unknown_divs(__isl_take isl_set *set)
-{
-	return (isl_set *)isl_map_remove_unknown_divs((isl_map *)set);
-}
-
-__isl_give isl_basic_set *isl_basic_set_remove_dims(
-	__isl_take isl_basic_set *bset,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	return (isl_basic_set *)
-	    isl_basic_map_remove_dims((isl_basic_map *)bset, type, first, n);
-}
-
-struct isl_map *isl_map_remove_dims(struct isl_map *map,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (n == 0)
-		return map;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-	isl_assert(map->ctx, first + n <= isl_map_dim(map, type), goto error);
-	
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_eliminate_vars(map->p[i],
-			isl_basic_map_offset(map->p[i], type) - 1 + first, n);
-		if (!map->p[i])
-			goto error;
-	}
-	map = isl_map_drop(map, type, first, n);
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_remove_dims(__isl_take isl_set *bset,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	return (isl_set *)isl_map_remove_dims((isl_map *)bset, type, first, n);
-}
-
-/* Project out n inputs starting at first using Fourier-Motzkin */
-struct isl_map *isl_map_remove_inputs(struct isl_map *map,
-	unsigned first, unsigned n)
-{
-	return isl_map_remove_dims(map, isl_dim_in, first, n);
-}
-
-static void dump_term(struct isl_basic_map *bmap,
-			isl_int c, int pos, FILE *out)
-{
-	const char *name;
-	unsigned in = isl_basic_map_n_in(bmap);
-	unsigned dim = in + isl_basic_map_n_out(bmap);
-	unsigned nparam = isl_basic_map_n_param(bmap);
-	if (!pos)
-		isl_int_print(out, c, 0);
-	else {
-		if (!isl_int_is_one(c))
-			isl_int_print(out, c, 0);
-		if (pos < 1 + nparam) {
-			name = isl_dim_get_name(bmap->dim,
-						isl_dim_param, pos - 1);
-			if (name)
-				fprintf(out, "%s", name);
-			else
-				fprintf(out, "p%d", pos - 1);
-		} else if (pos < 1 + nparam + in)
-			fprintf(out, "i%d", pos - 1 - nparam);
-		else if (pos < 1 + nparam + dim)
-			fprintf(out, "o%d", pos - 1 - nparam - in);
-		else
-			fprintf(out, "e%d", pos - 1 - nparam - dim);
-	}
-}
-
-static void dump_constraint_sign(struct isl_basic_map *bmap, isl_int *c,
-				int sign, FILE *out)
-{
-	int i;
-	int first;
-	unsigned len = 1 + isl_basic_map_total_dim(bmap);
-	isl_int v;
-
-	isl_int_init(v);
-	for (i = 0, first = 1; i < len; ++i) {
-		if (isl_int_sgn(c[i]) * sign <= 0)
-			continue;
-		if (!first)
-			fprintf(out, " + ");
-		first = 0;
-		isl_int_abs(v, c[i]);
-		dump_term(bmap, v, i, out);
-	}
-	isl_int_clear(v);
-	if (first)
-		fprintf(out, "0");
-}
-
-static void dump_constraint(struct isl_basic_map *bmap, isl_int *c,
-				const char *op, FILE *out, int indent)
-{
-	int i;
-
-	fprintf(out, "%*s", indent, "");
-
-	dump_constraint_sign(bmap, c, 1, out);
-	fprintf(out, " %s ", op);
-	dump_constraint_sign(bmap, c, -1, out);
-
-	fprintf(out, "\n");
-
-	for (i = bmap->n_div; i < bmap->extra; ++i) {
-		if (isl_int_is_zero(c[1+isl_dim_total(bmap->dim)+i]))
-			continue;
-		fprintf(out, "%*s", indent, "");
-		fprintf(out, "ERROR: unused div coefficient not zero\n");
-		abort();
-	}
-}
-
-static void dump_constraints(struct isl_basic_map *bmap,
-				isl_int **c, unsigned n,
-				const char *op, FILE *out, int indent)
-{
-	int i;
-
-	for (i = 0; i < n; ++i)
-		dump_constraint(bmap, c[i], op, out, indent);
-}
-
-static void dump_affine(struct isl_basic_map *bmap, isl_int *exp, FILE *out)
-{
-	int j;
-	int first = 1;
-	unsigned total = isl_basic_map_total_dim(bmap);
-
-	for (j = 0; j < 1 + total; ++j) {
-		if (isl_int_is_zero(exp[j]))
-			continue;
-		if (!first && isl_int_is_pos(exp[j]))
-			fprintf(out, "+");
-		dump_term(bmap, exp[j], j, out);
-		first = 0;
-	}
-}
-
-static void dump(struct isl_basic_map *bmap, FILE *out, int indent)
-{
-	int i;
-
-	dump_constraints(bmap, bmap->eq, bmap->n_eq, "=", out, indent);
-	dump_constraints(bmap, bmap->ineq, bmap->n_ineq, ">=", out, indent);
-
-	for (i = 0; i < bmap->n_div; ++i) {
-		fprintf(out, "%*s", indent, "");
-		fprintf(out, "e%d = [(", i);
-		dump_affine(bmap, bmap->div[i]+1, out);
-		fprintf(out, ")/");
-		isl_int_print(out, bmap->div[i][0], 0);
-		fprintf(out, "]\n");
-	}
-}
-
-void isl_basic_set_print_internal(struct isl_basic_set *bset,
-	FILE *out, int indent)
-{
-	if (!bset) {
-		fprintf(out, "null basic set\n");
-		return;
-	}
-
-	fprintf(out, "%*s", indent, "");
-	fprintf(out, "ref: %d, nparam: %d, dim: %d, extra: %d, flags: %x\n",
-			bset->ref, bset->dim->nparam, bset->dim->n_out,
-			bset->extra, bset->flags);
-	dump((struct isl_basic_map *)bset, out, indent);
-}
-
-void isl_basic_map_print_internal(struct isl_basic_map *bmap,
-	FILE *out, int indent)
-{
-	if (!bmap) {
-		fprintf(out, "null basic map\n");
-		return;
-	}
-
-	fprintf(out, "%*s", indent, "");
-	fprintf(out, "ref: %d, nparam: %d, in: %d, out: %d, extra: %d, "
-			"flags: %x, n_name: %d\n",
-		bmap->ref,
-		bmap->dim->nparam, bmap->dim->n_in, bmap->dim->n_out,
-		bmap->extra, bmap->flags, bmap->dim->n_name);
-	dump(bmap, out, indent);
-}
-
-int isl_inequality_negate(struct isl_basic_map *bmap, unsigned pos)
-{
-	unsigned total;
-	if (!bmap)
-		return -1;
-	total = isl_basic_map_total_dim(bmap);
-	isl_assert(bmap->ctx, pos < bmap->n_ineq, return -1);
-	isl_seq_neg(bmap->ineq[pos], bmap->ineq[pos], 1 + total);
-	isl_int_sub_ui(bmap->ineq[pos][0], bmap->ineq[pos][0], 1);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-	return 0;
-}
-
-struct isl_set *isl_set_alloc_dim(struct isl_dim *dim, int n, unsigned flags)
-{
-	struct isl_set *set;
-
-	if (!dim)
-		return NULL;
-	isl_assert(dim->ctx, dim->n_in == 0, goto error);
-	isl_assert(dim->ctx, n >= 0, goto error);
-	set = isl_alloc(dim->ctx, struct isl_set,
-			sizeof(struct isl_set) +
-			(n - 1) * sizeof(struct isl_basic_set *));
-	if (!set)
-		goto error;
-
-	set->ctx = dim->ctx;
-	isl_ctx_ref(set->ctx);
-	set->ref = 1;
-	set->size = n;
-	set->n = 0;
-	set->dim = dim;
-	set->flags = flags;
-	return set;
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-struct isl_set *isl_set_alloc(struct isl_ctx *ctx,
-		unsigned nparam, unsigned dim, int n, unsigned flags)
-{
-	struct isl_set *set;
-	struct isl_dim *dims;
-
-	dims = isl_dim_alloc(ctx, nparam, 0, dim);
-	if (!dims)
-		return NULL;
-
-	set = isl_set_alloc_dim(dims, n, flags);
-	return set;
-}
-
-/* Make sure "map" has room for at least "n" more basic maps.
- */
-struct isl_map *isl_map_grow(struct isl_map *map, int n)
-{
-	int i;
-	struct isl_map *grown = NULL;
-
-	if (!map)
-		return NULL;
-	isl_assert(map->ctx, n >= 0, goto error);
-	if (map->n + n <= map->size)
-		return map;
-	grown = isl_map_alloc_dim(isl_map_get_dim(map), map->n + n, map->flags);
-	if (!grown)
-		goto error;
-	for (i = 0; i < map->n; ++i) {
-		grown->p[i] = isl_basic_map_copy(map->p[i]);
-		if (!grown->p[i])
-			goto error;
-		grown->n++;
-	}
-	isl_map_free(map);
-	return grown;
-error:
-	isl_map_free(grown);
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Make sure "set" has room for at least "n" more basic sets.
- */
-struct isl_set *isl_set_grow(struct isl_set *set, int n)
-{
-	return (struct isl_set *)isl_map_grow((struct isl_map *)set, n);
-}
-
-struct isl_set *isl_set_dup(struct isl_set *set)
-{
-	int i;
-	struct isl_set *dup;
-
-	if (!set)
-		return NULL;
-
-	dup = isl_set_alloc_dim(isl_dim_copy(set->dim), set->n, set->flags);
-	if (!dup)
-		return NULL;
-	for (i = 0; i < set->n; ++i)
-		dup = isl_set_add_basic_set(dup, isl_basic_set_copy(set->p[i]));
-	return dup;
-}
-
-struct isl_set *isl_set_from_basic_set(struct isl_basic_set *bset)
-{
-	return isl_map_from_basic_map(bset);
-}
-
-struct isl_map *isl_map_from_basic_map(struct isl_basic_map *bmap)
-{
-	struct isl_map *map;
-
-	if (!bmap)
-		return NULL;
-
-	map = isl_map_alloc_dim(isl_dim_copy(bmap->dim), 1, ISL_MAP_DISJOINT);
-	return isl_map_add_basic_map(map, bmap);
-}
-
-__isl_give isl_set *isl_set_add_basic_set(__isl_take isl_set *set,
-						__isl_take isl_basic_set *bset)
-{
-	return (struct isl_set *)isl_map_add_basic_map((struct isl_map *)set,
-						(struct isl_basic_map *)bset);
-}
-
-void isl_set_free(struct isl_set *set)
-{
-	int i;
-
-	if (!set)
-		return;
-
-	if (--set->ref > 0)
-		return;
-
-	isl_ctx_deref(set->ctx);
-	for (i = 0; i < set->n; ++i)
-		isl_basic_set_free(set->p[i]);
-	isl_dim_free(set->dim);
-	free(set);
-}
-
-void isl_set_print_internal(struct isl_set *set, FILE *out, int indent)
-{
-	int i;
-
-	if (!set) {
-		fprintf(out, "null set\n");
-		return;
-	}
-
-	fprintf(out, "%*s", indent, "");
-	fprintf(out, "ref: %d, n: %d, nparam: %d, dim: %d, flags: %x\n",
-			set->ref, set->n, set->dim->nparam, set->dim->n_out,
-			set->flags);
-	for (i = 0; i < set->n; ++i) {
-		fprintf(out, "%*s", indent, "");
-		fprintf(out, "basic set %d:\n", i);
-		isl_basic_set_print_internal(set->p[i], out, indent+4);
-	}
-}
-
-void isl_map_print_internal(struct isl_map *map, FILE *out, int indent)
-{
-	int i;
-
-	if (!map) {
-		fprintf(out, "null map\n");
-		return;
-	}
-
-	fprintf(out, "%*s", indent, "");
-	fprintf(out, "ref: %d, n: %d, nparam: %d, in: %d, out: %d, "
-		     "flags: %x, n_name: %d\n",
-			map->ref, map->n, map->dim->nparam, map->dim->n_in,
-			map->dim->n_out, map->flags, map->dim->n_name);
-	for (i = 0; i < map->n; ++i) {
-		fprintf(out, "%*s", indent, "");
-		fprintf(out, "basic map %d:\n", i);
-		isl_basic_map_print_internal(map->p[i], out, indent+4);
-	}
-}
-
-struct isl_basic_map *isl_basic_map_intersect_domain(
-		struct isl_basic_map *bmap, struct isl_basic_set *bset)
-{
-	struct isl_basic_map *bmap_domain;
-
-	if (!bmap || !bset)
-		goto error;
-
-	isl_assert(bset->ctx, isl_dim_match(bmap->dim, isl_dim_param,
-					bset->dim, isl_dim_param), goto error);
-
-	if (isl_dim_size(bset->dim, isl_dim_set) != 0)
-		isl_assert(bset->ctx,
-		    isl_basic_map_compatible_domain(bmap, bset), goto error);
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		goto error;
-	bmap = isl_basic_map_extend_dim(bmap, isl_dim_copy(bmap->dim),
-			bset->n_div, bset->n_eq, bset->n_ineq);
-	bmap_domain = isl_basic_map_from_domain(bset);
-	bmap = add_constraints(bmap, bmap_domain, 0, 0);
-
-	bmap = isl_basic_map_simplify(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-struct isl_basic_map *isl_basic_map_intersect_range(
-		struct isl_basic_map *bmap, struct isl_basic_set *bset)
-{
-	struct isl_basic_map *bmap_range;
-
-	if (!bmap || !bset)
-		goto error;
-
-	isl_assert(bset->ctx, isl_dim_match(bmap->dim, isl_dim_param,
-					bset->dim, isl_dim_param), goto error);
-
-	if (isl_dim_size(bset->dim, isl_dim_set) != 0)
-		isl_assert(bset->ctx,
-		    isl_basic_map_compatible_range(bmap, bset), goto error);
-
-	if (isl_basic_set_is_universe(bset)) {
-		isl_basic_set_free(bset);
-		return bmap;
-	}
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		goto error;
-	bmap = isl_basic_map_extend_dim(bmap, isl_dim_copy(bmap->dim),
-			bset->n_div, bset->n_eq, bset->n_ineq);
-	bmap_range = isl_basic_map_from_basic_set(bset, isl_dim_copy(bset->dim));
-	bmap = add_constraints(bmap, bmap_range, 0, 0);
-
-	bmap = isl_basic_map_simplify(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-int isl_basic_map_contains(struct isl_basic_map *bmap, struct isl_vec *vec)
-{
-	int i;
-	unsigned total;
-	isl_int s;
-
-	total = 1 + isl_basic_map_total_dim(bmap);
-	if (total != vec->size)
-		return -1;
-
-	isl_int_init(s);
-
-	for (i = 0; i < bmap->n_eq; ++i) {
-		isl_seq_inner_product(vec->el, bmap->eq[i], total, &s);
-		if (!isl_int_is_zero(s)) {
-			isl_int_clear(s);
-			return 0;
-		}
-	}
-
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		isl_seq_inner_product(vec->el, bmap->ineq[i], total, &s);
-		if (isl_int_is_neg(s)) {
-			isl_int_clear(s);
-			return 0;
-		}
-	}
-
-	isl_int_clear(s);
-
-	return 1;
-}
-
-int isl_basic_set_contains(struct isl_basic_set *bset, struct isl_vec *vec)
-{
-	return isl_basic_map_contains((struct isl_basic_map *)bset, vec);
-}
-
-struct isl_basic_map *isl_basic_map_intersect(
-		struct isl_basic_map *bmap1, struct isl_basic_map *bmap2)
-{
-	struct isl_vec *sample = NULL;
-
-	if (!bmap1 || !bmap2)
-		goto error;
-
-	isl_assert(bmap1->ctx, isl_dim_match(bmap1->dim, isl_dim_param,
-				     bmap2->dim, isl_dim_param), goto error);
-	if (isl_dim_total(bmap1->dim) ==
-				isl_dim_size(bmap1->dim, isl_dim_param) &&
-	    isl_dim_total(bmap2->dim) !=
-				isl_dim_size(bmap2->dim, isl_dim_param))
-		return isl_basic_map_intersect(bmap2, bmap1);
-
-	if (isl_dim_total(bmap2->dim) !=
-					isl_dim_size(bmap2->dim, isl_dim_param))
-		isl_assert(bmap1->ctx,
-			    isl_dim_equal(bmap1->dim, bmap2->dim), goto error);
-
-	if (bmap1->sample &&
-	    isl_basic_map_contains(bmap1, bmap1->sample) > 0 &&
-	    isl_basic_map_contains(bmap2, bmap1->sample) > 0)
-		sample = isl_vec_copy(bmap1->sample);
-	else if (bmap2->sample &&
-	    isl_basic_map_contains(bmap1, bmap2->sample) > 0 &&
-	    isl_basic_map_contains(bmap2, bmap2->sample) > 0)
-		sample = isl_vec_copy(bmap2->sample);
-
-	bmap1 = isl_basic_map_cow(bmap1);
-	if (!bmap1)
-		goto error;
-	bmap1 = isl_basic_map_extend_dim(bmap1, isl_dim_copy(bmap1->dim),
-			bmap2->n_div, bmap2->n_eq, bmap2->n_ineq);
-	bmap1 = add_constraints(bmap1, bmap2, 0, 0);
-
-	if (!bmap1)
-		isl_vec_free(sample);
-	else if (sample) {
-		isl_vec_free(bmap1->sample);
-		bmap1->sample = sample;
-	}
-
-	bmap1 = isl_basic_map_simplify(bmap1);
-	return isl_basic_map_finalize(bmap1);
-error:
-	if (sample)
-		isl_vec_free(sample);
-	isl_basic_map_free(bmap1);
-	isl_basic_map_free(bmap2);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_intersect(
-		struct isl_basic_set *bset1, struct isl_basic_set *bset2)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_intersect(
-			(struct isl_basic_map *)bset1,
-			(struct isl_basic_map *)bset2);
-}
-
-/* Special case of isl_map_intersect, where both map1 and map2
- * are convex, without any divs and such that either map1 or map2
- * contains a single constraint.  This constraint is then simply
- * added to the other map.
- */
-static __isl_give isl_map *map_intersect_add_constraint(
-	__isl_take isl_map *map1, __isl_take isl_map *map2)
-{
-	isl_assert(map1->ctx, map1->n == 1, goto error);
-	isl_assert(map2->ctx, map1->n == 1, goto error);
-	isl_assert(map1->ctx, map1->p[0]->n_div == 0, goto error);
-	isl_assert(map2->ctx, map1->p[0]->n_div == 0, goto error);
-
-	if (map2->p[0]->n_eq + map2->p[0]->n_ineq != 1)
-		return isl_map_intersect(map2, map1);
-
-	isl_assert(map2->ctx,
-		    map2->p[0]->n_eq + map2->p[0]->n_ineq == 1, goto error);
-
-	map1 = isl_map_cow(map1);
-	if (!map1)
-		goto error;
-	if (isl_map_plain_is_empty(map1)) {
-		isl_map_free(map2);
-		return map1;
-	}
-	map1->p[0] = isl_basic_map_cow(map1->p[0]);
-	if (map2->p[0]->n_eq == 1)
-		map1->p[0] = isl_basic_map_add_eq(map1->p[0], map2->p[0]->eq[0]);
-	else
-		map1->p[0] = isl_basic_map_add_ineq(map1->p[0],
-							map2->p[0]->ineq[0]);
-
-	map1->p[0] = isl_basic_map_simplify(map1->p[0]);
-	map1->p[0] = isl_basic_map_finalize(map1->p[0]);
-	if (!map1->p[0])
-		goto error;
-
-	if (isl_basic_map_plain_is_empty(map1->p[0])) {
-		isl_basic_map_free(map1->p[0]);
-		map1->n = 0;
-	}
-
-	isl_map_free(map2);
-
-	return map1;
-error:
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return NULL;
-}
-
-struct isl_map *isl_map_intersect(struct isl_map *map1, struct isl_map *map2)
-{
-	unsigned flags = 0;
-	struct isl_map *result;
-	int i, j;
-
-	if (!map1 || !map2)
-		goto error;
-
-	if (isl_map_plain_is_empty(map1)) {
-		isl_map_free(map2);
-		return map1;
-	}
-	if (isl_map_plain_is_empty(map2)) {
-		isl_map_free(map1);
-		return map2;
-	}
-
-	if (map1->n == 1 && map2->n == 1 &&
-	    map1->p[0]->n_div == 0 && map2->p[0]->n_div == 0 &&
-	    isl_dim_equal(map1->dim, map2->dim) &&
-	    (map1->p[0]->n_eq + map1->p[0]->n_ineq == 1 ||
-	     map2->p[0]->n_eq + map2->p[0]->n_ineq == 1))
-		return map_intersect_add_constraint(map1, map2);
-	isl_assert(map1->ctx, isl_dim_match(map1->dim, isl_dim_param,
-					 map2->dim, isl_dim_param), goto error);
-	if (isl_dim_total(map1->dim) ==
-				isl_dim_size(map1->dim, isl_dim_param) &&
-	    isl_dim_total(map2->dim) != isl_dim_size(map2->dim, isl_dim_param))
-		return isl_map_intersect(map2, map1);
-
-	if (isl_dim_total(map2->dim) != isl_dim_size(map2->dim, isl_dim_param))
-		isl_assert(map1->ctx,
-			    isl_dim_equal(map1->dim, map2->dim), goto error);
-
-	if (ISL_F_ISSET(map1, ISL_MAP_DISJOINT) &&
-	    ISL_F_ISSET(map2, ISL_MAP_DISJOINT))
-		ISL_FL_SET(flags, ISL_MAP_DISJOINT);
-
-	result = isl_map_alloc_dim(isl_dim_copy(map1->dim),
-				map1->n * map2->n, flags);
-	if (!result)
-		goto error;
-	for (i = 0; i < map1->n; ++i)
-		for (j = 0; j < map2->n; ++j) {
-			struct isl_basic_map *part;
-			part = isl_basic_map_intersect(
-				    isl_basic_map_copy(map1->p[i]),
-				    isl_basic_map_copy(map2->p[j]));
-			if (isl_basic_map_is_empty(part))
-				isl_basic_map_free(part);
-			else
-				result = isl_map_add_basic_map(result, part);
-			if (!result)
-				goto error;
-		}
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return result;
-error:
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return NULL;
-}
-
-struct isl_set *isl_set_intersect(struct isl_set *set1, struct isl_set *set2)
-{
-	return (struct isl_set *)
-		isl_map_intersect((struct isl_map *)set1,
-				  (struct isl_map *)set2);
-}
-
-/* The current implementation of isl_map_intersect accepts intersections
- * with parameter domains, so we can just call that for now.
- */
-__isl_give isl_map *isl_map_intersect_params(__isl_take isl_map *map,
-		__isl_take isl_set *params)
-{
-	return isl_map_intersect(map, params);
-}
-
-__isl_give isl_set *isl_set_intersect_params(__isl_take isl_set *set,
-		__isl_take isl_set *params)
-{
-	return isl_map_intersect_params(set, params);
-}
-
-struct isl_basic_map *isl_basic_map_reverse(struct isl_basic_map *bmap)
-{
-	struct isl_dim *dim;
-	struct isl_basic_set *bset;
-	unsigned in;
-
-	if (!bmap)
-		return NULL;
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-	dim = isl_dim_reverse(isl_dim_copy(bmap->dim));
-	in = isl_basic_map_n_in(bmap);
-	bset = isl_basic_set_from_basic_map(bmap);
-	bset = isl_basic_set_swap_vars(bset, in);
-	return isl_basic_map_from_basic_set(bset, dim);
-}
-
-__isl_give isl_basic_map *isl_basic_map_insert(__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned pos, unsigned n)
-{
-	struct isl_dim *res_dim;
-	struct isl_basic_map *res;
-	struct isl_dim_map *dim_map;
-	unsigned total, off;
-	enum isl_dim_type t;
-
-	if (n == 0)
-		return bmap;
-
-	if (!bmap)
-		return NULL;
-
-	res_dim = isl_dim_insert(isl_basic_map_get_dim(bmap), type, pos, n);
-
-	total = isl_basic_map_total_dim(bmap) + n;
-	dim_map = isl_dim_map_alloc(bmap->ctx, total);
-	off = 0;
-	for (t = isl_dim_param; t <= isl_dim_out; ++t) {
-		if (t != type) {
-			isl_dim_map_dim(dim_map, bmap->dim, t, off);
-		} else {
-			unsigned size = isl_basic_map_dim(bmap, t);
-			isl_dim_map_dim_range(dim_map, bmap->dim, t,
-						0, pos, off);
-			isl_dim_map_dim_range(dim_map, bmap->dim, t,
-						pos, size - pos, off + pos + n);
-		}
-		off += isl_dim_size(res_dim, t);
-	}
-	isl_dim_map_div(dim_map, bmap, off);
-
-	res = isl_basic_map_alloc_dim(res_dim,
-			bmap->n_div, bmap->n_eq, bmap->n_ineq);
-	if (isl_basic_map_is_rational(bmap))
-		res = isl_basic_map_set_rational(res);
-	res = isl_basic_map_add_constraints_dim_map(res, bmap, dim_map);
-	return isl_basic_map_finalize(res);
-}
-
-__isl_give isl_basic_map *isl_basic_map_add(__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned n)
-{
-	if (!bmap)
-		return NULL;
-	return isl_basic_map_insert(bmap, type,
-					isl_basic_map_dim(bmap, type), n);
-}
-
-__isl_give isl_basic_set *isl_basic_set_add(__isl_take isl_basic_set *bset,
-		enum isl_dim_type type, unsigned n)
-{
-	if (!bset)
-		return NULL;
-	isl_assert(bset->ctx, type != isl_dim_in, goto error);
-	return (isl_basic_set *)isl_basic_map_add((isl_basic_map *)bset, type, n);
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_insert(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned pos, unsigned n)
-{
-	int i;
-
-	if (n == 0)
-		return map;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	map->dim = isl_dim_insert(map->dim, type, pos, n);
-	if (!map->dim)
-		goto error;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_insert(map->p[i], type, pos, n);
-		if (!map->p[i])
-			goto error;
-	}
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_insert(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos, unsigned n)
-{
-	return (isl_set *)isl_map_insert((isl_map *)set, type, pos, n);
-}
-
-__isl_give isl_map *isl_map_add_dims(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned n)
-{
-	if (!map)
-		return NULL;
-	return isl_map_insert(map, type, isl_map_dim(map, type), n);
-}
-
-__isl_give isl_set *isl_set_add_dims(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned n)
-{
-	if (!set)
-		return NULL;
-	isl_assert(set->ctx, type != isl_dim_in, goto error);
-	return (isl_set *)isl_map_add_dims((isl_map *)set, type, n);
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_move_dims(
-	__isl_take isl_basic_map *bmap,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n)
-{
-	struct isl_dim_map *dim_map;
-	struct isl_basic_map *res;
-	enum isl_dim_type t;
-	unsigned total, off;
-
-	if (!bmap)
-		return NULL;
-	if (n == 0)
-		return bmap;
-
-	isl_assert(bmap->ctx, src_pos + n <= isl_basic_map_dim(bmap, src_type),
-		goto error);
-
-	if (dst_type == src_type && dst_pos == src_pos)
-		return bmap;
-
-	isl_assert(bmap->ctx, dst_type != src_type, goto error);
-
-	if (pos(bmap->dim, dst_type) + dst_pos ==
-	    pos(bmap->dim, src_type) + src_pos +
-					    ((src_type < dst_type) ? n : 0)) {
-		bmap = isl_basic_map_cow(bmap);
-		if (!bmap)
-			return NULL;
-
-		bmap->dim = isl_dim_move(bmap->dim, dst_type, dst_pos,
-						src_type, src_pos, n);
-		if (!bmap->dim)
-			goto error;
-
-		bmap = isl_basic_map_finalize(bmap);
-
-		return bmap;
-	}
-
-	total = isl_basic_map_total_dim(bmap);
-	dim_map = isl_dim_map_alloc(bmap->ctx, total);
-
-	off = 0;
-	for (t = isl_dim_param; t <= isl_dim_out; ++t) {
-		unsigned size = isl_dim_size(bmap->dim, t);
-		if (t == dst_type) {
-			isl_dim_map_dim_range(dim_map, bmap->dim, t,
-					    0, dst_pos, off);
-			off += dst_pos;
-			isl_dim_map_dim_range(dim_map, bmap->dim, src_type,
-					    src_pos, n, off);
-			off += n;
-			isl_dim_map_dim_range(dim_map, bmap->dim, t,
-					    dst_pos, size - dst_pos, off);
-			off += size - dst_pos;
-		} else if (t == src_type) {
-			isl_dim_map_dim_range(dim_map, bmap->dim, t,
-					    0, src_pos, off);
-			off += src_pos;
-			isl_dim_map_dim_range(dim_map, bmap->dim, t,
-					src_pos + n, size - src_pos - n, off);
-			off += size - src_pos - n;
-		} else {
-			isl_dim_map_dim(dim_map, bmap->dim, t, off);
-			off += size;
-		}
-	}
-	isl_dim_map_div(dim_map, bmap, off);
-
-	res = isl_basic_map_alloc_dim(isl_basic_map_get_dim(bmap),
-			bmap->n_div, bmap->n_eq, bmap->n_ineq);
-	bmap = isl_basic_map_add_constraints_dim_map(res, bmap, dim_map);
-
-	bmap->dim = isl_dim_move(bmap->dim, dst_type, dst_pos,
-					src_type, src_pos, n);
-	if (!bmap->dim)
-		goto error;
-
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	bmap = isl_basic_map_finalize(bmap);
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_move_dims(__isl_take isl_basic_set *bset,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n)
-{
-	return (isl_basic_set *)isl_basic_map_move_dims(
-		(isl_basic_map *)bset, dst_type, dst_pos, src_type, src_pos, n);
-}
-
-__isl_give isl_set *isl_set_move_dims(__isl_take isl_set *set,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n)
-{
-	if (!set)
-		return NULL;
-	isl_assert(set->ctx, dst_type != isl_dim_in, goto error);
-	return (isl_set *)isl_map_move_dims((isl_map *)set, dst_type, dst_pos,
-					src_type, src_pos, n);
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_move_dims(__isl_take isl_map *map,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-	if (n == 0)
-		return map;
-
-	isl_assert(map->ctx, src_pos + n <= isl_map_dim(map, src_type),
-		goto error);
-
-	if (dst_type == src_type && dst_pos == src_pos)
-		return map;
-
-	isl_assert(map->ctx, dst_type != src_type, goto error);
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	map->dim = isl_dim_move(map->dim, dst_type, dst_pos, src_type, src_pos, n);
-	if (!map->dim)
-		goto error;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_move_dims(map->p[i],
-						dst_type, dst_pos,
-						src_type, src_pos, n);
-		if (!map->p[i])
-			goto error;
-	}
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Move the specified dimensions to the last columns right before
- * the divs.  Don't change the dimension specification of bmap.
- * That's the responsibility of the caller.
- */
-static __isl_give isl_basic_map *move_last(__isl_take isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	struct isl_dim_map *dim_map;
-	struct isl_basic_map *res;
-	enum isl_dim_type t;
-	unsigned total, off;
-
-	if (!bmap)
-		return NULL;
-	if (pos(bmap->dim, type) + first + n == 1 + isl_dim_total(bmap->dim))
-		return bmap;
-
-	total = isl_basic_map_total_dim(bmap);
-	dim_map = isl_dim_map_alloc(bmap->ctx, total);
-
-	off = 0;
-	for (t = isl_dim_param; t <= isl_dim_out; ++t) {
-		unsigned size = isl_dim_size(bmap->dim, t);
-		if (t == type) {
-			isl_dim_map_dim_range(dim_map, bmap->dim, t,
-					    0, first, off);
-			off += first;
-			isl_dim_map_dim_range(dim_map, bmap->dim, t,
-					    first, n, total - bmap->n_div - n);
-			isl_dim_map_dim_range(dim_map, bmap->dim, t,
-					    first + n, size - (first + n), off);
-			off += size - (first + n);
-		} else {
-			isl_dim_map_dim(dim_map, bmap->dim, t, off);
-			off += size;
-		}
-	}
-	isl_dim_map_div(dim_map, bmap, off + n);
-
-	res = isl_basic_map_alloc_dim(isl_basic_map_get_dim(bmap),
-			bmap->n_div, bmap->n_eq, bmap->n_ineq);
-	res = isl_basic_map_add_constraints_dim_map(res, bmap, dim_map);
-	return res;
-}
-
-/* Turn the n dimensions of type type, starting at first
- * into existentially quantified variables.
- */
-__isl_give isl_basic_map *isl_basic_map_project_out(
-		__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-	size_t row_size;
-	isl_int **new_div;
-	isl_int *old;
-
-	if (n == 0)
-		return bmap;
-
-	if (!bmap)
-		return NULL;
-
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL))
-		return isl_basic_map_remove_dims(bmap, type, first, n);
-
-	isl_assert(bmap->ctx, first + n <= isl_basic_map_dim(bmap, type),
-			goto error);
-
-	bmap = move_last(bmap, type, first, n);
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-
-	row_size = 1 + isl_dim_total(bmap->dim) + bmap->extra;
-	old = bmap->block2.data;
-	bmap->block2 = isl_blk_extend(bmap->ctx, bmap->block2,
-					(bmap->extra + n) * (1 + row_size));
-	if (!bmap->block2.data)
-		goto error;
-	new_div = isl_alloc_array(bmap->ctx, isl_int *, bmap->extra + n);
-	if (!new_div)
-		goto error;
-	for (i = 0; i < n; ++i) {
-		new_div[i] = bmap->block2.data +
-				(bmap->extra + i) * (1 + row_size);
-		isl_seq_clr(new_div[i], 1 + row_size);
-	}
-	for (i = 0; i < bmap->extra; ++i)
-		new_div[n + i] = bmap->block2.data + (bmap->div[i] - old);
-	free(bmap->div);
-	bmap->div = new_div;
-	bmap->n_div += n;
-	bmap->extra += n;
-
-	bmap->dim = isl_dim_drop(bmap->dim, type, first, n);
-	if (!bmap->dim)
-		goto error;
-	bmap = isl_basic_map_simplify(bmap);
-	bmap = isl_basic_map_drop_redundant_divs(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Turn the n dimensions of type type, starting at first
- * into existentially quantified variables.
- */
-struct isl_basic_set *isl_basic_set_project_out(struct isl_basic_set *bset,
-		enum isl_dim_type type, unsigned first, unsigned n)
-{
-	return (isl_basic_set *)isl_basic_map_project_out(
-			(isl_basic_map *)bset, type, first, n);
-}
-
-/* Turn the n dimensions of type type, starting at first
- * into existentially quantified variables.
- */
-__isl_give isl_map *isl_map_project_out(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-
-	if (n == 0)
-		return map;
-
-	isl_assert(map->ctx, first + n <= isl_map_dim(map, type), goto error);
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	map->dim = isl_dim_drop(map->dim, type, first, n);
-	if (!map->dim)
-		goto error;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_project_out(map->p[i], type, first, n);
-		if (!map->p[i])
-			goto error;
-	}
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Turn the n dimensions of type type, starting at first
- * into existentially quantified variables.
- */
-__isl_give isl_set *isl_set_project_out(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned first, unsigned n)
-{
-	return (isl_set *)isl_map_project_out((isl_map *)set, type, first, n);
-}
-
-static struct isl_basic_map *add_divs(struct isl_basic_map *bmap, unsigned n)
-{
-	int i, j;
-
-	for (i = 0; i < n; ++i) {
-		j = isl_basic_map_alloc_div(bmap);
-		if (j < 0)
-			goto error;
-		isl_seq_clr(bmap->div[j], 1+1+isl_basic_map_total_dim(bmap));
-	}
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_map *isl_basic_map_apply_range(
-		struct isl_basic_map *bmap1, struct isl_basic_map *bmap2)
-{
-	struct isl_dim *dim_result = NULL;
-	struct isl_basic_map *bmap;
-	unsigned n_in, n_out, n, nparam, total, pos;
-	struct isl_dim_map *dim_map1, *dim_map2;
-
-	if (!bmap1 || !bmap2)
-		goto error;
-
-	dim_result = isl_dim_join(isl_dim_copy(bmap1->dim),
-				  isl_dim_copy(bmap2->dim));
-
-	n_in = isl_basic_map_n_in(bmap1);
-	n_out = isl_basic_map_n_out(bmap2);
-	n = isl_basic_map_n_out(bmap1);
-	nparam = isl_basic_map_n_param(bmap1);
-
-	total = nparam + n_in + n_out + bmap1->n_div + bmap2->n_div + n;
-	dim_map1 = isl_dim_map_alloc(bmap1->ctx, total);
-	dim_map2 = isl_dim_map_alloc(bmap1->ctx, total);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_param, pos = 0);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_param, pos = 0);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_in, pos += nparam);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_out, pos += n_in);
-	isl_dim_map_div(dim_map1, bmap1, pos += n_out);
-	isl_dim_map_div(dim_map2, bmap2, pos += bmap1->n_div);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_out, pos += bmap2->n_div);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_in, pos);
-
-	bmap = isl_basic_map_alloc_dim(dim_result,
-			bmap1->n_div + bmap2->n_div + n,
-			bmap1->n_eq + bmap2->n_eq,
-			bmap1->n_ineq + bmap2->n_ineq);
-	bmap = isl_basic_map_add_constraints_dim_map(bmap, bmap1, dim_map1);
-	bmap = isl_basic_map_add_constraints_dim_map(bmap, bmap2, dim_map2);
-	bmap = add_divs(bmap, n);
-	bmap = isl_basic_map_simplify(bmap);
-	bmap = isl_basic_map_drop_redundant_divs(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap1);
-	isl_basic_map_free(bmap2);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_apply(
-		struct isl_basic_set *bset, struct isl_basic_map *bmap)
-{
-	if (!bset || !bmap)
-		goto error;
-
-	isl_assert(bset->ctx, isl_basic_map_compatible_domain(bmap, bset),
-		    goto error);
-
-	return (struct isl_basic_set *)
-		isl_basic_map_apply_range((struct isl_basic_map *)bset, bmap);
-error:
-	isl_basic_set_free(bset);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_map *isl_basic_map_apply_domain(
-		struct isl_basic_map *bmap1, struct isl_basic_map *bmap2)
-{
-	if (!bmap1 || !bmap2)
-		goto error;
-
-	isl_assert(bmap1->ctx,
-	    isl_basic_map_n_in(bmap1) == isl_basic_map_n_in(bmap2), goto error);
-	isl_assert(bmap1->ctx,
-	    isl_basic_map_n_param(bmap1) == isl_basic_map_n_param(bmap2),
-	    goto error);
-
-	bmap1 = isl_basic_map_reverse(bmap1);
-	bmap1 = isl_basic_map_apply_range(bmap1, bmap2);
-	return isl_basic_map_reverse(bmap1);
-error:
-	isl_basic_map_free(bmap1);
-	isl_basic_map_free(bmap2);
-	return NULL;
-}
-
-/* Given two basic maps A -> f(A) and B -> g(B), construct a basic map
- * A \cap B -> f(A) + f(B)
- */
-struct isl_basic_map *isl_basic_map_sum(
-		struct isl_basic_map *bmap1, struct isl_basic_map *bmap2)
-{
-	unsigned n_in, n_out, nparam, total, pos;
-	struct isl_basic_map *bmap = NULL;
-	struct isl_dim_map *dim_map1, *dim_map2;
-	int i;
-
-	if (!bmap1 || !bmap2)
-		goto error;
-
-	isl_assert(bmap1->ctx, isl_dim_equal(bmap1->dim, bmap2->dim),
-		goto error);
-
-	nparam = isl_basic_map_n_param(bmap1);
-	n_in = isl_basic_map_n_in(bmap1);
-	n_out = isl_basic_map_n_out(bmap1);
-
-	total = nparam + n_in + n_out + bmap1->n_div + bmap2->n_div + 2 * n_out;
-	dim_map1 = isl_dim_map_alloc(bmap1->ctx, total);
-	dim_map2 = isl_dim_map_alloc(bmap2->ctx, total);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_param, pos = 0);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_param, pos);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_in, pos += nparam);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_in, pos);
-	isl_dim_map_div(dim_map1, bmap1, pos += n_in + n_out);
-	isl_dim_map_div(dim_map2, bmap2, pos += bmap1->n_div);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_out, pos += bmap2->n_div);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_out, pos += n_out);
-
-	bmap = isl_basic_map_alloc_dim(isl_dim_copy(bmap1->dim),
-			bmap1->n_div + bmap2->n_div + 2 * n_out,
-			bmap1->n_eq + bmap2->n_eq + n_out,
-			bmap1->n_ineq + bmap2->n_ineq);
-	for (i = 0; i < n_out; ++i) {
-		int j = isl_basic_map_alloc_equality(bmap);
-		if (j < 0)
-			goto error;
-		isl_seq_clr(bmap->eq[j], 1+total);
-		isl_int_set_si(bmap->eq[j][1+nparam+n_in+i], -1);
-		isl_int_set_si(bmap->eq[j][1+pos+i], 1);
-		isl_int_set_si(bmap->eq[j][1+pos-n_out+i], 1);
-	}
-	bmap = isl_basic_map_add_constraints_dim_map(bmap, bmap1, dim_map1);
-	bmap = isl_basic_map_add_constraints_dim_map(bmap, bmap2, dim_map2);
-	bmap = add_divs(bmap, 2 * n_out);
-
-	bmap = isl_basic_map_simplify(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	isl_basic_map_free(bmap1);
-	isl_basic_map_free(bmap2);
-	return NULL;
-}
-
-/* Given two maps A -> f(A) and B -> g(B), construct a map
- * A \cap B -> f(A) + f(B)
- */
-struct isl_map *isl_map_sum(struct isl_map *map1, struct isl_map *map2)
-{
-	struct isl_map *result;
-	int i, j;
-
-	if (!map1 || !map2)
-		goto error;
-
-	isl_assert(map1->ctx, isl_dim_equal(map1->dim, map2->dim), goto error);
-
-	result = isl_map_alloc_dim(isl_dim_copy(map1->dim),
-				map1->n * map2->n, 0);
-	if (!result)
-		goto error;
-	for (i = 0; i < map1->n; ++i)
-		for (j = 0; j < map2->n; ++j) {
-			struct isl_basic_map *part;
-			part = isl_basic_map_sum(
-				    isl_basic_map_copy(map1->p[i]),
-				    isl_basic_map_copy(map2->p[j]));
-			if (isl_basic_map_is_empty(part))
-				isl_basic_map_free(part);
-			else
-				result = isl_map_add_basic_map(result, part);
-			if (!result)
-				goto error;
-		}
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return result;
-error:
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_sum(__isl_take isl_set *set1,
-	__isl_take isl_set *set2)
-{
-	return (isl_set *)isl_map_sum((isl_map *)set1, (isl_map *)set2);
-}
-
-/* Given a basic map A -> f(A), construct A -> -f(A).
- */
-struct isl_basic_map *isl_basic_map_neg(struct isl_basic_map *bmap)
-{
-	int i, j;
-	unsigned off, n;
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-
-	n = isl_basic_map_dim(bmap, isl_dim_out);
-	off = isl_basic_map_offset(bmap, isl_dim_out);
-	for (i = 0; i < bmap->n_eq; ++i)
-		for (j = 0; j < n; ++j)
-			isl_int_neg(bmap->eq[i][off+j], bmap->eq[i][off+j]);
-	for (i = 0; i < bmap->n_ineq; ++i)
-		for (j = 0; j < n; ++j)
-			isl_int_neg(bmap->ineq[i][off+j], bmap->ineq[i][off+j]);
-	for (i = 0; i < bmap->n_div; ++i)
-		for (j = 0; j < n; ++j)
-			isl_int_neg(bmap->div[i][1+off+j], bmap->div[i][1+off+j]);
-	return isl_basic_map_finalize(bmap);
-}
-
-__isl_give isl_basic_set *isl_basic_set_neg(__isl_take isl_basic_set *bset)
-{
-	return isl_basic_map_neg(bset);
-}
-
-/* Given a map A -> f(A), construct A -> -f(A).
- */
-struct isl_map *isl_map_neg(struct isl_map *map)
-{
-	int i;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_neg(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_neg(__isl_take isl_set *set)
-{
-	return (isl_set *)isl_map_neg((isl_map *)set);
-}
-
-/* Given a basic map A -> f(A) and an integer d, construct a basic map
- * A -> floor(f(A)/d).
- */
-struct isl_basic_map *isl_basic_map_floordiv(struct isl_basic_map *bmap,
-		isl_int d)
-{
-	unsigned n_in, n_out, nparam, total, pos;
-	struct isl_basic_map *result = NULL;
-	struct isl_dim_map *dim_map;
-	int i;
-
-	if (!bmap)
-		return NULL;
-
-	nparam = isl_basic_map_n_param(bmap);
-	n_in = isl_basic_map_n_in(bmap);
-	n_out = isl_basic_map_n_out(bmap);
-
-	total = nparam + n_in + n_out + bmap->n_div + n_out;
-	dim_map = isl_dim_map_alloc(bmap->ctx, total);
-	isl_dim_map_dim(dim_map, bmap->dim, isl_dim_param, pos = 0);
-	isl_dim_map_dim(dim_map, bmap->dim, isl_dim_in, pos += nparam);
-	isl_dim_map_div(dim_map, bmap, pos += n_in + n_out);
-	isl_dim_map_dim(dim_map, bmap->dim, isl_dim_out, pos += bmap->n_div);
-
-	result = isl_basic_map_alloc_dim(isl_dim_copy(bmap->dim),
-			bmap->n_div + n_out,
-			bmap->n_eq, bmap->n_ineq + 2 * n_out);
-	result = isl_basic_map_add_constraints_dim_map(result, bmap, dim_map);
-	result = add_divs(result, n_out);
-	for (i = 0; i < n_out; ++i) {
-		int j;
-		j = isl_basic_map_alloc_inequality(result);
-		if (j < 0)
-			goto error;
-		isl_seq_clr(result->ineq[j], 1+total);
-		isl_int_neg(result->ineq[j][1+nparam+n_in+i], d);
-		isl_int_set_si(result->ineq[j][1+pos+i], 1);
-		j = isl_basic_map_alloc_inequality(result);
-		if (j < 0)
-			goto error;
-		isl_seq_clr(result->ineq[j], 1+total);
-		isl_int_set(result->ineq[j][1+nparam+n_in+i], d);
-		isl_int_set_si(result->ineq[j][1+pos+i], -1);
-		isl_int_sub_ui(result->ineq[j][0], d, 1);
-	}
-
-	result = isl_basic_map_simplify(result);
-	return isl_basic_map_finalize(result);
-error:
-	isl_basic_map_free(result);
-	return NULL;
-}
-
-/* Given a map A -> f(A) and an integer d, construct a map
- * A -> floor(f(A)/d).
- */
-struct isl_map *isl_map_floordiv(struct isl_map *map, isl_int d)
-{
-	int i;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	ISL_F_CLR(map, ISL_MAP_DISJOINT);
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_floordiv(map->p[i], d);
-		if (!map->p[i])
-			goto error;
-	}
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-static struct isl_basic_map *var_equal(struct isl_basic_map *bmap, unsigned pos)
-{
-	int i;
-	unsigned nparam;
-	unsigned n_in;
-
-	i = isl_basic_map_alloc_equality(bmap);
-	if (i < 0)
-		goto error;
-	nparam = isl_basic_map_n_param(bmap);
-	n_in = isl_basic_map_n_in(bmap);
-	isl_seq_clr(bmap->eq[i], 1 + isl_basic_map_total_dim(bmap));
-	isl_int_set_si(bmap->eq[i][1+nparam+pos], -1);
-	isl_int_set_si(bmap->eq[i][1+nparam+n_in+pos], 1);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Add a constraints to "bmap" expressing i_pos < o_pos
- */
-static struct isl_basic_map *var_less(struct isl_basic_map *bmap, unsigned pos)
-{
-	int i;
-	unsigned nparam;
-	unsigned n_in;
-
-	i = isl_basic_map_alloc_inequality(bmap);
-	if (i < 0)
-		goto error;
-	nparam = isl_basic_map_n_param(bmap);
-	n_in = isl_basic_map_n_in(bmap);
-	isl_seq_clr(bmap->ineq[i], 1 + isl_basic_map_total_dim(bmap));
-	isl_int_set_si(bmap->ineq[i][0], -1);
-	isl_int_set_si(bmap->ineq[i][1+nparam+pos], -1);
-	isl_int_set_si(bmap->ineq[i][1+nparam+n_in+pos], 1);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Add a constraint to "bmap" expressing i_pos <= o_pos
- */
-static __isl_give isl_basic_map *var_less_or_equal(
-	__isl_take isl_basic_map *bmap, unsigned pos)
-{
-	int i;
-	unsigned nparam;
-	unsigned n_in;
-
-	i = isl_basic_map_alloc_inequality(bmap);
-	if (i < 0)
-		goto error;
-	nparam = isl_basic_map_n_param(bmap);
-	n_in = isl_basic_map_n_in(bmap);
-	isl_seq_clr(bmap->ineq[i], 1 + isl_basic_map_total_dim(bmap));
-	isl_int_set_si(bmap->ineq[i][1+nparam+pos], -1);
-	isl_int_set_si(bmap->ineq[i][1+nparam+n_in+pos], 1);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Add a constraints to "bmap" expressing i_pos > o_pos
- */
-static struct isl_basic_map *var_more(struct isl_basic_map *bmap, unsigned pos)
-{
-	int i;
-	unsigned nparam;
-	unsigned n_in;
-
-	i = isl_basic_map_alloc_inequality(bmap);
-	if (i < 0)
-		goto error;
-	nparam = isl_basic_map_n_param(bmap);
-	n_in = isl_basic_map_n_in(bmap);
-	isl_seq_clr(bmap->ineq[i], 1 + isl_basic_map_total_dim(bmap));
-	isl_int_set_si(bmap->ineq[i][0], -1);
-	isl_int_set_si(bmap->ineq[i][1+nparam+pos], 1);
-	isl_int_set_si(bmap->ineq[i][1+nparam+n_in+pos], -1);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Add a constraint to "bmap" expressing i_pos >= o_pos
- */
-static __isl_give isl_basic_map *var_more_or_equal(
-	__isl_take isl_basic_map *bmap, unsigned pos)
-{
-	int i;
-	unsigned nparam;
-	unsigned n_in;
-
-	i = isl_basic_map_alloc_inequality(bmap);
-	if (i < 0)
-		goto error;
-	nparam = isl_basic_map_n_param(bmap);
-	n_in = isl_basic_map_n_in(bmap);
-	isl_seq_clr(bmap->ineq[i], 1 + isl_basic_map_total_dim(bmap));
-	isl_int_set_si(bmap->ineq[i][1+nparam+pos], 1);
-	isl_int_set_si(bmap->ineq[i][1+nparam+n_in+pos], -1);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_map *isl_basic_map_equal(struct isl_dim *dim, unsigned n_equal)
-{
-	int i;
-	struct isl_basic_map *bmap;
-	bmap = isl_basic_map_alloc_dim(dim, 0, n_equal, 0);
-	if (!bmap)
-		return NULL;
-	for (i = 0; i < n_equal && bmap; ++i)
-		bmap = var_equal(bmap, i);
-	return isl_basic_map_finalize(bmap);
-}
-
-/* Return a relation on of dimension "dim" expressing i_[0..pos] << o_[0..pos]
- */
-struct isl_basic_map *isl_basic_map_less_at(struct isl_dim *dim, unsigned pos)
-{
-	int i;
-	struct isl_basic_map *bmap;
-	bmap = isl_basic_map_alloc_dim(dim, 0, pos, 1);
-	if (!bmap)
-		return NULL;
-	for (i = 0; i < pos && bmap; ++i)
-		bmap = var_equal(bmap, i);
-	if (bmap)
-		bmap = var_less(bmap, pos);
-	return isl_basic_map_finalize(bmap);
-}
-
-/* Return a relation on of dimension "dim" expressing i_[0..pos] <<= o_[0..pos]
- */
-__isl_give isl_basic_map *isl_basic_map_less_or_equal_at(
-	__isl_take isl_dim *dim, unsigned pos)
-{
-	int i;
-	isl_basic_map *bmap;
-
-	bmap = isl_basic_map_alloc_dim(dim, 0, pos, 1);
-	for (i = 0; i < pos; ++i)
-		bmap = var_equal(bmap, i);
-	bmap = var_less_or_equal(bmap, pos);
-	return isl_basic_map_finalize(bmap);
-}
-
-/* Return a relation on pairs of sets of dimension "dim" expressing i_pos > o_pos
- */
-struct isl_basic_map *isl_basic_map_more_at(struct isl_dim *dim, unsigned pos)
-{
-	int i;
-	struct isl_basic_map *bmap;
-	bmap = isl_basic_map_alloc_dim(dim, 0, pos, 1);
-	if (!bmap)
-		return NULL;
-	for (i = 0; i < pos && bmap; ++i)
-		bmap = var_equal(bmap, i);
-	if (bmap)
-		bmap = var_more(bmap, pos);
-	return isl_basic_map_finalize(bmap);
-}
-
-/* Return a relation on of dimension "dim" expressing i_[0..pos] >>= o_[0..pos]
- */
-__isl_give isl_basic_map *isl_basic_map_more_or_equal_at(
-	__isl_take isl_dim *dim, unsigned pos)
-{
-	int i;
-	isl_basic_map *bmap;
-
-	bmap = isl_basic_map_alloc_dim(dim, 0, pos, 1);
-	for (i = 0; i < pos; ++i)
-		bmap = var_equal(bmap, i);
-	bmap = var_more_or_equal(bmap, pos);
-	return isl_basic_map_finalize(bmap);
-}
-
-static __isl_give isl_map *map_lex_lte_first(__isl_take isl_dim *dims,
-	unsigned n, int equal)
-{
-	struct isl_map *map;
-	int i;
-
-	if (n == 0 && equal)
-		return isl_map_universe(dims);
-
-	map = isl_map_alloc_dim(isl_dim_copy(dims), n, ISL_MAP_DISJOINT);
-
-	for (i = 0; i + 1 < n; ++i)
-		map = isl_map_add_basic_map(map,
-				  isl_basic_map_less_at(isl_dim_copy(dims), i));
-	if (n > 0) {
-		if (equal)
-			map = isl_map_add_basic_map(map,
-			      isl_basic_map_less_or_equal_at(dims, n - 1));
-		else
-			map = isl_map_add_basic_map(map,
-			      isl_basic_map_less_at(dims, n - 1));
-	} else
-		isl_dim_free(dims);
-
-	return map;
-}
-
-static __isl_give isl_map *map_lex_lte(__isl_take isl_dim *dims, int equal)
-{
-	if (!dims)
-		return NULL;
-	return map_lex_lte_first(dims, dims->n_out, equal);
-}
-
-__isl_give isl_map *isl_map_lex_lt_first(__isl_take isl_dim *dim, unsigned n)
-{
-	return map_lex_lte_first(dim, n, 0);
-}
-
-__isl_give isl_map *isl_map_lex_le_first(__isl_take isl_dim *dim, unsigned n)
-{
-	return map_lex_lte_first(dim, n, 1);
-}
-
-__isl_give isl_map *isl_map_lex_lt(__isl_take isl_dim *set_dim)
-{
-	return map_lex_lte(isl_dim_map_from_set(set_dim), 0);
-}
-
-__isl_give isl_map *isl_map_lex_le(__isl_take isl_dim *set_dim)
-{
-	return map_lex_lte(isl_dim_map_from_set(set_dim), 1);
-}
-
-static __isl_give isl_map *map_lex_gte_first(__isl_take isl_dim *dims,
-	unsigned n, int equal)
-{
-	struct isl_map *map;
-	int i;
-
-	if (n == 0 && equal)
-		return isl_map_universe(dims);
-
-	map = isl_map_alloc_dim(isl_dim_copy(dims), n, ISL_MAP_DISJOINT);
-
-	for (i = 0; i + 1 < n; ++i)
-		map = isl_map_add_basic_map(map,
-				  isl_basic_map_more_at(isl_dim_copy(dims), i));
-	if (n > 0) {
-		if (equal)
-			map = isl_map_add_basic_map(map,
-			      isl_basic_map_more_or_equal_at(dims, n - 1));
-		else
-			map = isl_map_add_basic_map(map,
-			      isl_basic_map_more_at(dims, n - 1));
-	} else
-		isl_dim_free(dims);
-
-	return map;
-}
-
-static __isl_give isl_map *map_lex_gte(__isl_take isl_dim *dims, int equal)
-{
-	if (!dims)
-		return NULL;
-	return map_lex_gte_first(dims, dims->n_out, equal);
-}
-
-__isl_give isl_map *isl_map_lex_gt_first(__isl_take isl_dim *dim, unsigned n)
-{
-	return map_lex_gte_first(dim, n, 0);
-}
-
-__isl_give isl_map *isl_map_lex_ge_first(__isl_take isl_dim *dim, unsigned n)
-{
-	return map_lex_gte_first(dim, n, 1);
-}
-
-__isl_give isl_map *isl_map_lex_gt(__isl_take isl_dim *set_dim)
-{
-	return map_lex_gte(isl_dim_map_from_set(set_dim), 0);
-}
-
-__isl_give isl_map *isl_map_lex_ge(__isl_take isl_dim *set_dim)
-{
-	return map_lex_gte(isl_dim_map_from_set(set_dim), 1);
-}
-
-__isl_give isl_map *isl_set_lex_le_set(__isl_take isl_set *set1,
-	__isl_take isl_set *set2)
-{
-	isl_map *map;
-	map = isl_map_lex_le(isl_set_get_dim(set1));
-	map = isl_map_intersect_domain(map, set1);
-	map = isl_map_intersect_range(map, set2);
-	return map;
-}
-
-__isl_give isl_map *isl_set_lex_lt_set(__isl_take isl_set *set1,
-	__isl_take isl_set *set2)
-{
-	isl_map *map;
-	map = isl_map_lex_lt(isl_set_get_dim(set1));
-	map = isl_map_intersect_domain(map, set1);
-	map = isl_map_intersect_range(map, set2);
-	return map;
-}
-
-__isl_give isl_map *isl_set_lex_ge_set(__isl_take isl_set *set1,
-	__isl_take isl_set *set2)
-{
-	isl_map *map;
-	map = isl_map_lex_ge(isl_set_get_dim(set1));
-	map = isl_map_intersect_domain(map, set1);
-	map = isl_map_intersect_range(map, set2);
-	return map;
-}
-
-__isl_give isl_map *isl_set_lex_gt_set(__isl_take isl_set *set1,
-	__isl_take isl_set *set2)
-{
-	isl_map *map;
-	map = isl_map_lex_gt(isl_set_get_dim(set1));
-	map = isl_map_intersect_domain(map, set1);
-	map = isl_map_intersect_range(map, set2);
-	return map;
-}
-
-__isl_give isl_map *isl_map_lex_le_map(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	isl_map *map;
-	map = isl_map_lex_le(isl_dim_range(isl_map_get_dim(map1)));
-	map = isl_map_apply_domain(map, isl_map_reverse(map1));
-	map = isl_map_apply_range(map, isl_map_reverse(map2));
-	return map;
-}
-
-__isl_give isl_map *isl_map_lex_lt_map(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	isl_map *map;
-	map = isl_map_lex_lt(isl_dim_range(isl_map_get_dim(map1)));
-	map = isl_map_apply_domain(map, isl_map_reverse(map1));
-	map = isl_map_apply_range(map, isl_map_reverse(map2));
-	return map;
-}
-
-__isl_give isl_map *isl_map_lex_ge_map(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	isl_map *map;
-	map = isl_map_lex_ge(isl_dim_range(isl_map_get_dim(map1)));
-	map = isl_map_apply_domain(map, isl_map_reverse(map1));
-	map = isl_map_apply_range(map, isl_map_reverse(map2));
-	return map;
-}
-
-__isl_give isl_map *isl_map_lex_gt_map(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	isl_map *map;
-	map = isl_map_lex_gt(isl_dim_range(isl_map_get_dim(map1)));
-	map = isl_map_apply_domain(map, isl_map_reverse(map1));
-	map = isl_map_apply_range(map, isl_map_reverse(map2));
-	return map;
-}
-
-struct isl_basic_map *isl_basic_map_from_basic_set(
-		struct isl_basic_set *bset, struct isl_dim *dim)
-{
-	struct isl_basic_map *bmap;
-
-	bset = isl_basic_set_cow(bset);
-	if (!bset || !dim)
-		goto error;
-
-	isl_assert(bset->ctx, isl_dim_compatible(bset->dim, dim), goto error);
-	isl_dim_free(bset->dim);
-	bmap = (struct isl_basic_map *) bset;
-	bmap->dim = dim;
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_set_free(bset);
-	isl_dim_free(dim);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_from_basic_map(struct isl_basic_map *bmap)
-{
-	if (!bmap)
-		goto error;
-	if (bmap->dim->n_in == 0)
-		return (struct isl_basic_set *)bmap;
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		goto error;
-	bmap->dim = isl_dim_as_set_dim(bmap->dim);
-	if (!bmap->dim)
-		goto error;
-	bmap = isl_basic_map_finalize(bmap);
-	return (struct isl_basic_set *)bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* For a div d = floor(f/m), add the constraints
- *
- *		f - m d >= 0
- *		-(f-(n-1)) + m d >= 0
- *
- * Note that the second constraint is the negation of
- *
- *		f - m d >= n
- */
-int isl_basic_map_add_div_constraints_var(__isl_keep isl_basic_map *bmap,
-	unsigned pos, isl_int *div)
-{
-	int i, j;
-	unsigned total = isl_basic_map_total_dim(bmap);
-
-	i = isl_basic_map_alloc_inequality(bmap);
-	if (i < 0)
-		return -1;
-	isl_seq_cpy(bmap->ineq[i], div + 1, 1 + total);
-	isl_int_neg(bmap->ineq[i][1 + pos], div[0]);
-
-	j = isl_basic_map_alloc_inequality(bmap);
-	if (j < 0)
-		return -1;
-	isl_seq_neg(bmap->ineq[j], bmap->ineq[i], 1 + total);
-	isl_int_add(bmap->ineq[j][0], bmap->ineq[j][0], bmap->ineq[j][1 + pos]);
-	isl_int_sub_ui(bmap->ineq[j][0], bmap->ineq[j][0], 1);
-	return j;
-}
-
-int isl_basic_set_add_div_constraints_var(__isl_keep isl_basic_set *bset,
-	unsigned pos, isl_int *div)
-{
-	return isl_basic_map_add_div_constraints_var((isl_basic_map *)bset,
-							pos, div);
-}
-
-int isl_basic_map_add_div_constraints(struct isl_basic_map *bmap, unsigned div)
-{
-	unsigned total = isl_basic_map_total_dim(bmap);
-	unsigned div_pos = total - bmap->n_div + div;
-
-	return isl_basic_map_add_div_constraints_var(bmap, div_pos,
-							bmap->div[div]);
-}
-
-struct isl_basic_set *isl_basic_map_underlying_set(
-		struct isl_basic_map *bmap)
-{
-	if (!bmap)
-		goto error;
-	if (bmap->dim->nparam == 0 && bmap->dim->n_in == 0 &&
-	    bmap->n_div == 0 &&
-	    !isl_dim_is_named_or_nested(bmap->dim, isl_dim_in) &&
-	    !isl_dim_is_named_or_nested(bmap->dim, isl_dim_out))
-		return (struct isl_basic_set *)bmap;
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		goto error;
-	bmap->dim = isl_dim_underlying(bmap->dim, bmap->n_div);
-	if (!bmap->dim)
-		goto error;
-	bmap->extra -= bmap->n_div;
-	bmap->n_div = 0;
-	bmap = isl_basic_map_finalize(bmap);
-	return (struct isl_basic_set *)bmap;
-error:
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_underlying_set(
-		__isl_take isl_basic_set *bset)
-{
-	return isl_basic_map_underlying_set((isl_basic_map *)bset);
-}
-
-struct isl_basic_map *isl_basic_map_overlying_set(
-	struct isl_basic_set *bset, struct isl_basic_map *like)
-{
-	struct isl_basic_map *bmap;
-	struct isl_ctx *ctx;
-	unsigned total;
-	int i;
-
-	if (!bset || !like)
-		goto error;
-	ctx = bset->ctx;
-	isl_assert(ctx, bset->n_div == 0, goto error);
-	isl_assert(ctx, isl_basic_set_n_param(bset) == 0, goto error);
-	isl_assert(ctx, bset->dim->n_out == isl_basic_map_total_dim(like),
-			goto error);
-	if (isl_dim_equal(bset->dim, like->dim) && like->n_div == 0) {
-		isl_basic_map_free(like);
-		return (struct isl_basic_map *)bset;
-	}
-	bset = isl_basic_set_cow(bset);
-	if (!bset)
-		goto error;
-	total = bset->dim->n_out + bset->extra;
-	bmap = (struct isl_basic_map *)bset;
-	isl_dim_free(bmap->dim);
-	bmap->dim = isl_dim_copy(like->dim);
-	if (!bmap->dim)
-		goto error;
-	bmap->n_div = like->n_div;
-	bmap->extra += like->n_div;
-	if (bmap->extra) {
-		unsigned ltotal;
-		isl_int **div;
-		ltotal = total - bmap->extra + like->extra;
-		if (ltotal > total)
-			ltotal = total;
-		bmap->block2 = isl_blk_extend(ctx, bmap->block2,
-					bmap->extra * (1 + 1 + total));
-		if (isl_blk_is_error(bmap->block2))
-			goto error;
-		div = isl_realloc_array(ctx, bmap->div, isl_int *, bmap->extra);
-		if (!div)
-			goto error;
-		bmap->div = div;
-		for (i = 0; i < bmap->extra; ++i)
-			bmap->div[i] = bmap->block2.data + i * (1 + 1 + total);
-		for (i = 0; i < like->n_div; ++i) {
-			isl_seq_cpy(bmap->div[i], like->div[i], 1 + 1 + ltotal);
-			isl_seq_clr(bmap->div[i]+1+1+ltotal, total - ltotal);
-		}
-		bmap = isl_basic_map_extend_constraints(bmap, 
-							0, 2 * like->n_div);
-		for (i = 0; i < like->n_div; ++i) {
-			if (isl_int_is_zero(bmap->div[i][0]))
-				continue;
-			if (isl_basic_map_add_div_constraints(bmap, i) < 0)
-				goto error;
-		}
-	}
-	isl_basic_map_free(like);
-	bmap = isl_basic_map_simplify(bmap);
-	bmap = isl_basic_map_finalize(bmap);
-	return bmap;
-error:
-	isl_basic_map_free(like);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_from_underlying_set(
-	struct isl_basic_set *bset, struct isl_basic_set *like)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_overlying_set(bset, (struct isl_basic_map *)like);
-}
-
-struct isl_set *isl_set_from_underlying_set(
-	struct isl_set *set, struct isl_basic_set *like)
-{
-	int i;
-
-	if (!set || !like)
-		goto error;
-	isl_assert(set->ctx, set->dim->n_out == isl_basic_set_total_dim(like),
-		    goto error);
-	if (isl_dim_equal(set->dim, like->dim) && like->n_div == 0) {
-		isl_basic_set_free(like);
-		return set;
-	}
-	set = isl_set_cow(set);
-	if (!set)
-		goto error;
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_basic_set_from_underlying_set(set->p[i],
-						      isl_basic_set_copy(like));
-		if (!set->p[i])
-			goto error;
-	}
-	isl_dim_free(set->dim);
-	set->dim = isl_dim_copy(like->dim);
-	if (!set->dim)
-		goto error;
-	isl_basic_set_free(like);
-	return set;
-error:
-	isl_basic_set_free(like);
-	isl_set_free(set);
-	return NULL;
-}
-
-struct isl_set *isl_map_underlying_set(struct isl_map *map)
-{
-	int i;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-	map->dim = isl_dim_cow(map->dim);
-	if (!map->dim)
-		goto error;
-
-	for (i = 1; i < map->n; ++i)
-		isl_assert(map->ctx, map->p[0]->n_div == map->p[i]->n_div,
-				goto error);
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = (struct isl_basic_map *)
-				isl_basic_map_underlying_set(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	if (map->n == 0)
-		map->dim = isl_dim_underlying(map->dim, 0);
-	else {
-		isl_dim_free(map->dim);
-		map->dim = isl_dim_copy(map->p[0]->dim);
-	}
-	if (!map->dim)
-		goto error;
-	return (struct isl_set *)map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-struct isl_set *isl_set_to_underlying_set(struct isl_set *set)
-{
-	return (struct isl_set *)isl_map_underlying_set((struct isl_map *)set);
-}
-
-__isl_give isl_basic_map *isl_basic_map_reset_dim(
-	__isl_take isl_basic_map *bmap, __isl_take isl_dim *dim)
-{
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap || !dim)
-		goto error;
-
-	isl_dim_free(bmap->dim);
-	bmap->dim = dim;
-
-	bmap = isl_basic_map_finalize(bmap);
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	isl_dim_free(dim);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_reset_dim(
-	__isl_take isl_basic_set *bset, __isl_take isl_dim *dim)
-{
-	return (isl_basic_set *)isl_basic_map_reset_dim((isl_basic_map *)bset,
-							dim);
-}
-
-__isl_give isl_map *isl_map_reset_dim(__isl_take isl_map *map,
-	__isl_take isl_dim *dim)
-{
-	int i;
-
-	map = isl_map_cow(map);
-	if (!map || !dim)
-		goto error;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_reset_dim(map->p[i],
-						    isl_dim_copy(dim));
-		if (!map->p[i])
-			goto error;
-	}
-	isl_dim_free(map->dim);
-	map->dim = dim;
-
-	return map;
-error:
-	isl_map_free(map);
-	isl_dim_free(dim);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_reset_dim(__isl_take isl_set *set,
-	__isl_take isl_dim *dim)
-{
-	return (struct isl_set *) isl_map_reset_dim((struct isl_map *)set, dim);
-}
-
-struct isl_basic_set *isl_basic_map_domain(struct isl_basic_map *bmap)
-{
-	isl_dim *dim;
-	struct isl_basic_set *domain;
-	unsigned n_in;
-	unsigned n_out;
-
-	if (!bmap)
-		return NULL;
-	dim = isl_dim_domain(isl_basic_map_get_dim(bmap));
-
-	n_in = isl_basic_map_n_in(bmap);
-	n_out = isl_basic_map_n_out(bmap);
-	domain = isl_basic_set_from_basic_map(bmap);
-	domain = isl_basic_set_project_out(domain, isl_dim_set, n_in, n_out);
-
-	domain = isl_basic_set_reset_dim(domain, dim);
-
-	return domain;
-}
-
-int isl_basic_map_may_be_set(__isl_keep isl_basic_map *bmap)
-{
-	if (!bmap)
-		return -1;
-	return isl_dim_may_be_set(bmap->dim);
-}
-
-struct isl_basic_set *isl_basic_map_range(struct isl_basic_map *bmap)
-{
-	if (!bmap)
-		return NULL;
-	if (isl_basic_map_may_be_set(bmap))
-		return bmap;
-	return isl_basic_map_domain(isl_basic_map_reverse(bmap));
-}
-
-__isl_give isl_basic_map *isl_basic_map_domain_map(
-	__isl_take isl_basic_map *bmap)
-{
-	int i, k;
-	isl_dim *dim;
-	isl_basic_map *domain;
-	int nparam, n_in, n_out;
-	unsigned total;
-
-	nparam = isl_basic_map_dim(bmap, isl_dim_param);
-	n_in = isl_basic_map_dim(bmap, isl_dim_in);
-	n_out = isl_basic_map_dim(bmap, isl_dim_out);
-
-	dim = isl_dim_from_range(isl_dim_domain(isl_basic_map_get_dim(bmap)));
-	domain = isl_basic_map_universe(dim);
-
-	bmap = isl_basic_map_from_domain(isl_basic_map_wrap(bmap));
-	bmap = isl_basic_map_apply_range(bmap, domain);
-	bmap = isl_basic_map_extend_constraints(bmap, n_in, 0);
-
-	total = isl_basic_map_total_dim(bmap);
-
-	for (i = 0; i < n_in; ++i) {
-		k = isl_basic_map_alloc_equality(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(bmap->eq[k], 1 + total);
-		isl_int_set_si(bmap->eq[k][1 + nparam + i], -1);
-		isl_int_set_si(bmap->eq[k][1 + nparam + n_in + n_out + i], 1);
-	}
-
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_range_map(
-	__isl_take isl_basic_map *bmap)
-{
-	int i, k;
-	isl_dim *dim;
-	isl_basic_map *range;
-	int nparam, n_in, n_out;
-	unsigned total;
-
-	nparam = isl_basic_map_dim(bmap, isl_dim_param);
-	n_in = isl_basic_map_dim(bmap, isl_dim_in);
-	n_out = isl_basic_map_dim(bmap, isl_dim_out);
-
-	dim = isl_dim_from_range(isl_dim_range(isl_basic_map_get_dim(bmap)));
-	range = isl_basic_map_universe(dim);
-
-	bmap = isl_basic_map_from_domain(isl_basic_map_wrap(bmap));
-	bmap = isl_basic_map_apply_range(bmap, range);
-	bmap = isl_basic_map_extend_constraints(bmap, n_out, 0);
-
-	total = isl_basic_map_total_dim(bmap);
-
-	for (i = 0; i < n_out; ++i) {
-		k = isl_basic_map_alloc_equality(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(bmap->eq[k], 1 + total);
-		isl_int_set_si(bmap->eq[k][1 + nparam + n_in + i], -1);
-		isl_int_set_si(bmap->eq[k][1 + nparam + n_in + n_out + i], 1);
-	}
-
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-int isl_map_may_be_set(__isl_keep isl_map *map)
-{
-	if (!map)
-		return -1;
-	return isl_dim_may_be_set(map->dim);
-}
-
-struct isl_set *isl_map_range(struct isl_map *map)
-{
-	int i;
-	struct isl_set *set;
-
-	if (!map)
-		goto error;
-	if (isl_map_may_be_set(map))
-		return (isl_set *)map;
-
-	map = isl_map_cow(map);
-	if (!map)
-		goto error;
-
-	set = (struct isl_set *) map;
-	set->dim = isl_dim_drop_inputs(set->dim, 0, set->dim->n_in);
-	if (!set->dim)
-		goto error;
-	for (i = 0; i < map->n; ++i) {
-		set->p[i] = isl_basic_map_range(map->p[i]);
-		if (!set->p[i])
-			goto error;
-	}
-	ISL_F_CLR(set, ISL_MAP_DISJOINT);
-	ISL_F_CLR(set, ISL_SET_NORMALIZED);
-	return set;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_domain_map(__isl_take isl_map *map)
-{
-	int i;
-	isl_dim *domain_dim;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	domain_dim = isl_dim_from_range(isl_dim_domain(isl_map_get_dim(map)));
-	map->dim = isl_dim_from_domain(isl_dim_wrap(map->dim));
-	map->dim = isl_dim_join(map->dim, domain_dim);
-	if (!map->dim)
-		goto error;
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_domain_map(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	ISL_F_CLR(map, ISL_MAP_DISJOINT);
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_range_map(__isl_take isl_map *map)
-{
-	int i;
-	isl_dim *range_dim;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	range_dim = isl_dim_range(isl_map_get_dim(map));
-	map->dim = isl_dim_from_domain(isl_dim_wrap(map->dim));
-	map->dim = isl_dim_join(map->dim, range_dim);
-	if (!map->dim)
-		goto error;
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_range_map(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	ISL_F_CLR(map, ISL_MAP_DISJOINT);
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-struct isl_map *isl_map_from_set(struct isl_set *set, struct isl_dim *dim)
-{
-	int i;
-	struct isl_map *map = NULL;
-
-	set = isl_set_cow(set);
-	if (!set || !dim)
-		goto error;
-	isl_assert(set->ctx, isl_dim_compatible(set->dim, dim), goto error);
-	map = (struct isl_map *)set;
-	for (i = 0; i < set->n; ++i) {
-		map->p[i] = isl_basic_map_from_basic_set(
-				set->p[i], isl_dim_copy(dim));
-		if (!map->p[i])
-			goto error;
-	}
-	isl_dim_free(map->dim);
-	map->dim = dim;
-	return map;
-error:
-	isl_dim_free(dim);
-	isl_set_free(set);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_from_domain(
-	__isl_take isl_basic_set *bset)
-{
-	return isl_basic_map_reverse(isl_basic_map_from_range(bset));
-}
-
-__isl_give isl_basic_map *isl_basic_map_from_range(
-	__isl_take isl_basic_set *bset)
-{
-	return (isl_basic_map *)bset;
-}
-
-struct isl_map *isl_map_from_range(struct isl_set *set)
-{
-	return (struct isl_map *)set;
-}
-
-__isl_give isl_map *isl_map_from_domain(__isl_take isl_set *set)
-{
-	return isl_map_reverse(isl_map_from_range(set));
-}
-
-__isl_give isl_basic_map *isl_basic_map_from_domain_and_range(
-	__isl_take isl_basic_set *domain, __isl_take isl_basic_set *range)
-{
-	return isl_basic_map_apply_range(isl_basic_map_from_domain(domain),
-					 isl_basic_map_from_range(range));
-}
-
-__isl_give isl_map *isl_map_from_domain_and_range(__isl_take isl_set *domain,
-	__isl_take isl_set *range)
-{
-	return isl_map_apply_range(isl_map_from_domain(domain),
-				   isl_map_from_range(range));
-}
-
-struct isl_set *isl_set_from_map(struct isl_map *map)
-{
-	int i;
-	struct isl_set *set = NULL;
-
-	if (!map)
-		return NULL;
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-	map->dim = isl_dim_as_set_dim(map->dim);
-	if (!map->dim)
-		goto error;
-	set = (struct isl_set *)map;
-	for (i = 0; i < map->n; ++i) {
-		set->p[i] = isl_basic_set_from_basic_map(map->p[i]);
-		if (!set->p[i])
-			goto error;
-	}
-	return set;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-struct isl_map *isl_map_alloc_dim(struct isl_dim *dim, int n, unsigned flags)
-{
-	struct isl_map *map;
-
-	if (!dim)
-		return NULL;
-	isl_assert(dim->ctx, n >= 0, return NULL);
-	map = isl_alloc(dim->ctx, struct isl_map,
-			sizeof(struct isl_map) +
-			(n - 1) * sizeof(struct isl_basic_map *));
-	if (!map)
-		goto error;
-
-	map->ctx = dim->ctx;
-	isl_ctx_ref(map->ctx);
-	map->ref = 1;
-	map->size = n;
-	map->n = 0;
-	map->dim = dim;
-	map->flags = flags;
-	return map;
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-struct isl_map *isl_map_alloc(struct isl_ctx *ctx,
-		unsigned nparam, unsigned in, unsigned out, int n,
-		unsigned flags)
-{
-	struct isl_map *map;
-	struct isl_dim *dims;
-
-	dims = isl_dim_alloc(ctx, nparam, in, out);
-	if (!dims)
-		return NULL;
-
-	map = isl_map_alloc_dim(dims, n, flags);
-	return map;
-}
-
-struct isl_basic_map *isl_basic_map_empty(struct isl_dim *dim)
-{
-	struct isl_basic_map *bmap;
-	bmap = isl_basic_map_alloc_dim(dim, 0, 1, 0);
-	bmap = isl_basic_map_set_to_empty(bmap);
-	return bmap;
-}
-
-struct isl_basic_set *isl_basic_set_empty(struct isl_dim *dim)
-{
-	struct isl_basic_set *bset;
-	bset = isl_basic_set_alloc_dim(dim, 0, 1, 0);
-	bset = isl_basic_set_set_to_empty(bset);
-	return bset;
-}
-
-struct isl_basic_map *isl_basic_map_empty_like(struct isl_basic_map *model)
-{
-	struct isl_basic_map *bmap;
-	if (!model)
-		return NULL;
-	bmap = isl_basic_map_alloc_dim(isl_dim_copy(model->dim), 0, 1, 0);
-	bmap = isl_basic_map_set_to_empty(bmap);
-	return bmap;
-}
-
-struct isl_basic_map *isl_basic_map_empty_like_map(struct isl_map *model)
-{
-	struct isl_basic_map *bmap;
-	if (!model)
-		return NULL;
-	bmap = isl_basic_map_alloc_dim(isl_dim_copy(model->dim), 0, 1, 0);
-	bmap = isl_basic_map_set_to_empty(bmap);
-	return bmap;
-}
-
-struct isl_basic_set *isl_basic_set_empty_like(struct isl_basic_set *model)
-{
-	struct isl_basic_set *bset;
-	if (!model)
-		return NULL;
-	bset = isl_basic_set_alloc_dim(isl_dim_copy(model->dim), 0, 1, 0);
-	bset = isl_basic_set_set_to_empty(bset);
-	return bset;
-}
-
-struct isl_basic_map *isl_basic_map_universe(struct isl_dim *dim)
-{
-	struct isl_basic_map *bmap;
-	bmap = isl_basic_map_alloc_dim(dim, 0, 0, 0);
-	bmap = isl_basic_map_finalize(bmap);
-	return bmap;
-}
-
-struct isl_basic_set *isl_basic_set_universe(struct isl_dim *dim)
-{
-	struct isl_basic_set *bset;
-	bset = isl_basic_set_alloc_dim(dim, 0, 0, 0);
-	bset = isl_basic_set_finalize(bset);
-	return bset;
-}
-
-__isl_give isl_basic_map *isl_basic_map_nat_universe(__isl_take isl_dim *dim)
-{
-	int i;
-	unsigned total = isl_dim_total(dim);
-	isl_basic_map *bmap;
-
-	bmap= isl_basic_map_alloc_dim(dim, 0, 0, total);
-	for (i = 0; i < total; ++i) {
-		int k = isl_basic_map_alloc_inequality(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(bmap->ineq[k], 1 + total);
-		isl_int_set_si(bmap->ineq[k][1 + i], 1);
-	}
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_nat_universe(__isl_take isl_dim *dim)
-{
-	return isl_basic_map_nat_universe(dim);
-}
-
-__isl_give isl_map *isl_map_nat_universe(__isl_take isl_dim *dim)
-{
-	return isl_map_from_basic_map(isl_basic_map_nat_universe(dim));
-}
-
-__isl_give isl_set *isl_set_nat_universe(__isl_take isl_dim *dim)
-{
-	return isl_map_nat_universe(dim);
-}
-
-__isl_give isl_basic_map *isl_basic_map_universe_like(
-		__isl_keep isl_basic_map *model)
-{
-	if (!model)
-		return NULL;
-	return isl_basic_map_alloc_dim(isl_dim_copy(model->dim), 0, 0, 0);
-}
-
-struct isl_basic_set *isl_basic_set_universe_like(struct isl_basic_set *model)
-{
-	if (!model)
-		return NULL;
-	return isl_basic_set_alloc_dim(isl_dim_copy(model->dim), 0, 0, 0);
-}
-
-__isl_give isl_basic_set *isl_basic_set_universe_like_set(
-	__isl_keep isl_set *model)
-{
-	if (!model)
-		return NULL;
-	return isl_basic_set_alloc_dim(isl_dim_copy(model->dim), 0, 0, 0);
-}
-
-struct isl_map *isl_map_empty(struct isl_dim *dim)
-{
-	return isl_map_alloc_dim(dim, 0, ISL_MAP_DISJOINT);
-}
-
-struct isl_map *isl_map_empty_like(struct isl_map *model)
-{
-	if (!model)
-		return NULL;
-	return isl_map_alloc_dim(isl_dim_copy(model->dim), 0, ISL_MAP_DISJOINT);
-}
-
-struct isl_map *isl_map_empty_like_basic_map(struct isl_basic_map *model)
-{
-	if (!model)
-		return NULL;
-	return isl_map_alloc_dim(isl_dim_copy(model->dim), 0, ISL_MAP_DISJOINT);
-}
-
-struct isl_set *isl_set_empty(struct isl_dim *dim)
-{
-	return isl_set_alloc_dim(dim, 0, ISL_MAP_DISJOINT);
-}
-
-struct isl_set *isl_set_empty_like(struct isl_set *model)
-{
-	if (!model)
-		return NULL;
-	return isl_set_empty(isl_dim_copy(model->dim));
-}
-
-struct isl_map *isl_map_universe(struct isl_dim *dim)
-{
-	struct isl_map *map;
-	if (!dim)
-		return NULL;
-	map = isl_map_alloc_dim(isl_dim_copy(dim), 1, ISL_MAP_DISJOINT);
-	map = isl_map_add_basic_map(map, isl_basic_map_universe(dim));
-	return map;
-}
-
-struct isl_set *isl_set_universe(struct isl_dim *dim)
-{
-	struct isl_set *set;
-	if (!dim)
-		return NULL;
-	set = isl_set_alloc_dim(isl_dim_copy(dim), 1, ISL_MAP_DISJOINT);
-	set = isl_set_add_basic_set(set, isl_basic_set_universe(dim));
-	return set;
-}
-
-__isl_give isl_set *isl_set_universe_like(__isl_keep isl_set *model)
-{
-	if (!model)
-		return NULL;
-	return isl_set_universe(isl_dim_copy(model->dim));
-}
-
-struct isl_map *isl_map_dup(struct isl_map *map)
-{
-	int i;
-	struct isl_map *dup;
-
-	if (!map)
-		return NULL;
-	dup = isl_map_alloc_dim(isl_dim_copy(map->dim), map->n, map->flags);
-	for (i = 0; i < map->n; ++i)
-		dup = isl_map_add_basic_map(dup, isl_basic_map_copy(map->p[i]));
-	return dup;
-}
-
-__isl_give isl_map *isl_map_add_basic_map(__isl_take isl_map *map,
-						__isl_take isl_basic_map *bmap)
-{
-	if (!bmap || !map)
-		goto error;
-	if (isl_basic_map_plain_is_empty(bmap)) {
-		isl_basic_map_free(bmap);
-		return map;
-	}
-	isl_assert(map->ctx, isl_dim_equal(map->dim, bmap->dim), goto error);
-	isl_assert(map->ctx, map->n < map->size, goto error);
-	map->p[map->n] = bmap;
-	map->n++;
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-error:
-	if (map)
-		isl_map_free(map);
-	if (bmap)
-		isl_basic_map_free(bmap);
-	return NULL;
-}
-
-void isl_map_free(struct isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return;
-
-	if (--map->ref > 0)
-		return;
-
-	isl_ctx_deref(map->ctx);
-	for (i = 0; i < map->n; ++i)
-		isl_basic_map_free(map->p[i]);
-	isl_dim_free(map->dim);
-	free(map);
-}
-
-struct isl_map *isl_map_extend(struct isl_map *base,
-		unsigned nparam, unsigned n_in, unsigned n_out)
-{
-	int i;
-
-	base = isl_map_cow(base);
-	if (!base)
-		return NULL;
-
-	base->dim = isl_dim_extend(base->dim, nparam, n_in, n_out);
-	if (!base->dim)
-		goto error;
-	for (i = 0; i < base->n; ++i) {
-		base->p[i] = isl_basic_map_extend_dim(base->p[i],
-				isl_dim_copy(base->dim), 0, 0, 0);
-		if (!base->p[i])
-			goto error;
-	}
-	return base;
-error:
-	isl_map_free(base);
-	return NULL;
-}
-
-struct isl_set *isl_set_extend(struct isl_set *base,
-		unsigned nparam, unsigned dim)
-{
-	return (struct isl_set *)isl_map_extend((struct isl_map *)base,
-							nparam, 0, dim);
-}
-
-static struct isl_basic_map *isl_basic_map_fix_pos_si(
-	struct isl_basic_map *bmap, unsigned pos, int value)
-{
-	int j;
-
-	bmap = isl_basic_map_cow(bmap);
-	bmap = isl_basic_map_extend_constraints(bmap, 1, 0);
-	j = isl_basic_map_alloc_equality(bmap);
-	if (j < 0)
-		goto error;
-	isl_seq_clr(bmap->eq[j] + 1, isl_basic_map_total_dim(bmap));
-	isl_int_set_si(bmap->eq[j][pos], -1);
-	isl_int_set_si(bmap->eq[j][0], value);
-	bmap = isl_basic_map_simplify(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static __isl_give isl_basic_map *isl_basic_map_fix_pos(
-	__isl_take isl_basic_map *bmap, unsigned pos, isl_int value)
-{
-	int j;
-
-	bmap = isl_basic_map_cow(bmap);
-	bmap = isl_basic_map_extend_constraints(bmap, 1, 0);
-	j = isl_basic_map_alloc_equality(bmap);
-	if (j < 0)
-		goto error;
-	isl_seq_clr(bmap->eq[j] + 1, isl_basic_map_total_dim(bmap));
-	isl_int_set_si(bmap->eq[j][pos], -1);
-	isl_int_set(bmap->eq[j][0], value);
-	bmap = isl_basic_map_simplify(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_map *isl_basic_map_fix_si(struct isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned pos, int value)
-{
-	if (!bmap)
-		return NULL;
-	isl_assert(bmap->ctx, pos < isl_basic_map_dim(bmap, type), goto error);
-	return isl_basic_map_fix_pos_si(bmap,
-		isl_basic_map_offset(bmap, type) + pos, value);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_fix(__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned pos, isl_int value)
-{
-	if (!bmap)
-		return NULL;
-	isl_assert(bmap->ctx, pos < isl_basic_map_dim(bmap, type), goto error);
-	return isl_basic_map_fix_pos(bmap,
-		isl_basic_map_offset(bmap, type) + pos, value);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_fix_si(struct isl_basic_set *bset,
-		enum isl_dim_type type, unsigned pos, int value)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_fix_si((struct isl_basic_map *)bset,
-					type, pos, value);
-}
-
-__isl_give isl_basic_set *isl_basic_set_fix(__isl_take isl_basic_set *bset,
-		enum isl_dim_type type, unsigned pos, isl_int value)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_fix((struct isl_basic_map *)bset,
-					type, pos, value);
-}
-
-struct isl_basic_map *isl_basic_map_fix_input_si(struct isl_basic_map *bmap,
-		unsigned input, int value)
-{
-	return isl_basic_map_fix_si(bmap, isl_dim_in, input, value);
-}
-
-struct isl_basic_set *isl_basic_set_fix_dim_si(struct isl_basic_set *bset,
-		unsigned dim, int value)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_fix_si((struct isl_basic_map *)bset,
-					isl_dim_set, dim, value);
-}
-
-struct isl_map *isl_map_fix_si(struct isl_map *map,
-		enum isl_dim_type type, unsigned pos, int value)
-{
-	int i;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	isl_assert(map->ctx, pos < isl_map_dim(map, type), goto error);
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_fix_si(map->p[i], type, pos, value);
-		if (!map->p[i])
-			goto error;
-	}
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_fix_si(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos, int value)
-{
-	return (struct isl_set *)
-		isl_map_fix_si((struct isl_map *)set, type, pos, value);
-}
-
-__isl_give isl_map *isl_map_fix(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned pos, isl_int value)
-{
-	int i;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	isl_assert(map->ctx, pos < isl_map_dim(map, type), goto error);
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_fix(map->p[i], type, pos, value);
-		if (!map->p[i])
-			goto error;
-	}
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_fix(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos, isl_int value)
-{
-	return (struct isl_set *)isl_map_fix((isl_map *)set, type, pos, value);
-}
-
-struct isl_map *isl_map_fix_input_si(struct isl_map *map,
-		unsigned input, int value)
-{
-	return isl_map_fix_si(map, isl_dim_in, input, value);
-}
-
-struct isl_set *isl_set_fix_dim_si(struct isl_set *set, unsigned dim, int value)
-{
-	return (struct isl_set *)
-		isl_map_fix_si((struct isl_map *)set, isl_dim_set, dim, value);
-}
-
-__isl_give isl_basic_map *isl_basic_map_lower_bound_si(
-		__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned pos, int value)
-{
-	int j;
-
-	if (!bmap)
-		return NULL;
-	isl_assert(bmap->ctx, pos < isl_basic_map_dim(bmap, type), goto error);
-	pos += isl_basic_map_offset(bmap, type);
-	bmap = isl_basic_map_cow(bmap);
-	bmap = isl_basic_map_extend_constraints(bmap, 0, 1);
-	j = isl_basic_map_alloc_inequality(bmap);
-	if (j < 0)
-		goto error;
-	isl_seq_clr(bmap->ineq[j], 1 + isl_basic_map_total_dim(bmap));
-	isl_int_set_si(bmap->ineq[j][pos], 1);
-	isl_int_set_si(bmap->ineq[j][0], -value);
-	bmap = isl_basic_map_simplify(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_lower_bound_dim(struct isl_basic_set *bset,
-	unsigned dim, isl_int value)
-{
-	int j;
-
-	bset = isl_basic_set_cow(bset);
-	bset = isl_basic_set_extend_constraints(bset, 0, 1);
-	j = isl_basic_set_alloc_inequality(bset);
-	if (j < 0)
-		goto error;
-	isl_seq_clr(bset->ineq[j], 1 + isl_basic_set_total_dim(bset));
-	isl_int_set_si(bset->ineq[j][1 + isl_basic_set_n_param(bset) + dim], 1);
-	isl_int_neg(bset->ineq[j][0], value);
-	bset = isl_basic_set_simplify(bset);
-	return isl_basic_set_finalize(bset);
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_lower_bound_si(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned pos, int value)
-{
-	int i;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	isl_assert(map->ctx, pos < isl_map_dim(map, type), goto error);
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_lower_bound_si(map->p[i],
-							 type, pos, value);
-		if (!map->p[i])
-			goto error;
-	}
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_lower_bound_si(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos, int value)
-{
-	return (struct isl_set *)
-		isl_map_lower_bound_si((struct isl_map *)set, type, pos, value);
-}
-
-struct isl_set *isl_set_lower_bound_dim(struct isl_set *set, unsigned dim,
-					isl_int value)
-{
-	int i;
-
-	set = isl_set_cow(set);
-	if (!set)
-		return NULL;
-
-	isl_assert(set->ctx, dim < isl_set_n_dim(set), goto error);
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_basic_set_lower_bound_dim(set->p[i], dim, value);
-		if (!set->p[i])
-			goto error;
-	}
-	return set;
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-struct isl_map *isl_map_reverse(struct isl_map *map)
-{
-	int i;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	map->dim = isl_dim_reverse(map->dim);
-	if (!map->dim)
-		goto error;
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_reverse(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-static struct isl_map *isl_basic_map_partial_lexopt(
-		struct isl_basic_map *bmap, struct isl_basic_set *dom,
-		struct isl_set **empty, int max)
-{
-	if (!bmap)
-		goto error;
-	if (bmap->ctx->opt->pip == ISL_PIP_PIP)
-		return isl_pip_basic_map_lexopt(bmap, dom, empty, max);
-	else
-		return isl_tab_basic_map_partial_lexopt(bmap, dom, empty, max);
-error:
-	isl_basic_map_free(bmap);
-	isl_basic_set_free(dom);
-	if (empty)
-		*empty = NULL;
-	return NULL;
-}
-
-struct isl_map *isl_basic_map_partial_lexmax(
-		struct isl_basic_map *bmap, struct isl_basic_set *dom,
-		struct isl_set **empty)
-{
-	return isl_basic_map_partial_lexopt(bmap, dom, empty, 1);
-}
-
-struct isl_map *isl_basic_map_partial_lexmin(
-		struct isl_basic_map *bmap, struct isl_basic_set *dom,
-		struct isl_set **empty)
-{
-	return isl_basic_map_partial_lexopt(bmap, dom, empty, 0);
-}
-
-struct isl_set *isl_basic_set_partial_lexmin(
-		struct isl_basic_set *bset, struct isl_basic_set *dom,
-		struct isl_set **empty)
-{
-	return (struct isl_set *)
-		isl_basic_map_partial_lexmin((struct isl_basic_map *)bset,
-			dom, empty);
-}
-
-struct isl_set *isl_basic_set_partial_lexmax(
-		struct isl_basic_set *bset, struct isl_basic_set *dom,
-		struct isl_set **empty)
-{
-	return (struct isl_set *)
-		isl_basic_map_partial_lexmax((struct isl_basic_map *)bset,
-			dom, empty);
-}
-
-/* Given a basic map "bmap", compute the lexicographically minimal
- * (or maximal) image element for each domain element in dom.
- * Set *empty to those elements in dom that do not have an image element.
- *
- * We first make sure the basic sets in dom are disjoint and then
- * simply collect the results over each of the basic sets separately.
- * We could probably improve the efficiency a bit by moving the union
- * domain down into the parametric integer programming.
- */
-static __isl_give isl_map *basic_map_partial_lexopt(
-		__isl_take isl_basic_map *bmap, __isl_take isl_set *dom,
-		__isl_give isl_set **empty, int max)
-{
-	int i;
-	struct isl_map *res;
-
-	dom = isl_set_make_disjoint(dom);
-	if (!dom)
-		goto error;
-
-	if (isl_set_plain_is_empty(dom)) {
-		res = isl_map_empty_like_basic_map(bmap);
-		*empty = isl_set_empty_like(dom);
-		isl_set_free(dom);
-		isl_basic_map_free(bmap);
-		return res;
-	}
-
-	res = isl_basic_map_partial_lexopt(isl_basic_map_copy(bmap),
-			isl_basic_set_copy(dom->p[0]), empty, max);
-		
-	for (i = 1; i < dom->n; ++i) {
-		struct isl_map *res_i;
-		struct isl_set *empty_i;
-
-		res_i = isl_basic_map_partial_lexopt(isl_basic_map_copy(bmap),
-				isl_basic_set_copy(dom->p[i]), &empty_i, max);
-
-		res = isl_map_union_disjoint(res, res_i);
-		*empty = isl_set_union_disjoint(*empty, empty_i);
-	}
-
-	isl_set_free(dom);
-	isl_basic_map_free(bmap);
-	return res;
-error:
-	*empty = NULL;
-	isl_set_free(dom);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Given a map "map", compute the lexicographically minimal
- * (or maximal) image element for each domain element in dom.
- * Set *empty to those elements in dom that do not have an image element.
- *
- * We first compute the lexicographically minimal or maximal element
- * in the first basic map.  This results in a partial solution "res"
- * and a subset "todo" of dom that still need to be handled.
- * We then consider each of the remaining maps in "map" and successively
- * improve both "res" and "todo".
- *
- * Let res^k and todo^k be the results after k steps and let i = k + 1.
- * Assume we are computing the lexicographical maximum.
- * We first compute the lexicographically maximal element in basic map i.
- * This results in a partial solution res_i and a subset todo_i.
- * Then we combine these results with those obtain for the first k basic maps
- * to obtain a result that is valid for the first k+1 basic maps.
- * In particular, the set where there is no solution is the set where
- * there is no solution for the first k basic maps and also no solution
- * for the ith basic map, i.e.,
- *
- *	todo^i = todo^k * todo_i
- *
- * On dom(res^k) * dom(res_i), we need to pick the larger of the two
- * solutions, arbitrarily breaking ties in favor of res^k.
- * That is, when res^k(a) >= res_i(a), we pick res^k and
- * when res^k(a) < res_i(a), we pick res_i.  (Here, ">=" and "<" denote
- * the lexicographic order.)
- * In practice, we compute
- *
- *	res^k * (res_i . "<=")
- *
- * and
- *
- *	res_i * (res^k . "<")
- *
- * Finally, we consider the symmetric difference of dom(res^k) and dom(res_i),
- * where only one of res^k and res_i provides a solution and we simply pick
- * that one, i.e.,
- *
- *	res^k * todo_i
- * and
- *	res_i * todo^k
- *
- * Note that we only compute these intersections when dom(res^k) intersects
- * dom(res_i).  Otherwise, the only effect of these intersections is to
- * potentially break up res^k and res_i into smaller pieces.
- * We want to avoid such splintering as much as possible.
- * In fact, an earlier implementation of this function would look for
- * better results in the domain of res^k and for extra results in todo^k,
- * but this would always result in a splintering according to todo^k,
- * even when the domain of basic map i is disjoint from the domains of
- * the previous basic maps.
- */
-static __isl_give isl_map *isl_map_partial_lexopt(
-		__isl_take isl_map *map, __isl_take isl_set *dom,
-		__isl_give isl_set **empty, int max)
-{
-	int i;
-	struct isl_map *res;
-	struct isl_set *todo;
-
-	if (!map || !dom)
-		goto error;
-
-	if (isl_map_plain_is_empty(map)) {
-		if (empty)
-			*empty = dom;
-		else
-			isl_set_free(dom);
-		return map;
-	}
-
-	res = basic_map_partial_lexopt(isl_basic_map_copy(map->p[0]),
-					isl_set_copy(dom), &todo, max);
-
-	for (i = 1; i < map->n; ++i) {
-		isl_map *lt, *le;
-		isl_map *res_i;
-		isl_set *todo_i;
-		isl_dim *dim = isl_dim_range(isl_map_get_dim(res));
-
-		res_i = basic_map_partial_lexopt(isl_basic_map_copy(map->p[i]),
-					isl_set_copy(dom), &todo_i, max);
-
-		if (max) {
-			lt = isl_map_lex_lt(isl_dim_copy(dim));
-			le = isl_map_lex_le(dim);
-		} else {
-			lt = isl_map_lex_gt(isl_dim_copy(dim));
-			le = isl_map_lex_ge(dim);
-		}
-		lt = isl_map_apply_range(isl_map_copy(res), lt);
-		lt = isl_map_intersect(lt, isl_map_copy(res_i));
-		le = isl_map_apply_range(isl_map_copy(res_i), le);
-		le = isl_map_intersect(le, isl_map_copy(res));
-
-		if (!isl_map_is_empty(lt) || !isl_map_is_empty(le)) {
-			res = isl_map_intersect_domain(res,
-							isl_set_copy(todo_i));
-			res_i = isl_map_intersect_domain(res_i,
-							isl_set_copy(todo));
-		}
-
-		res = isl_map_union_disjoint(res, res_i);
-		res = isl_map_union_disjoint(res, lt);
-		res = isl_map_union_disjoint(res, le);
-
-		todo = isl_set_intersect(todo, todo_i);
-	}
-
-	isl_set_free(dom);
-	isl_map_free(map);
-
-	if (empty)
-		*empty = todo;
-	else
-		isl_set_free(todo);
-
-	return res;
-error:
-	if (empty)
-		*empty = NULL;
-	isl_set_free(dom);
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_partial_lexmax(
-		__isl_take isl_map *map, __isl_take isl_set *dom,
-		__isl_give isl_set **empty)
-{
-	return isl_map_partial_lexopt(map, dom, empty, 1);
-}
-
-__isl_give isl_map *isl_map_partial_lexmin(
-		__isl_take isl_map *map, __isl_take isl_set *dom,
-		__isl_give isl_set **empty)
-{
-	return isl_map_partial_lexopt(map, dom, empty, 0);
-}
-
-__isl_give isl_set *isl_set_partial_lexmin(
-		__isl_take isl_set *set, __isl_take isl_set *dom,
-		__isl_give isl_set **empty)
-{
-	return (struct isl_set *)
-		isl_map_partial_lexmin((struct isl_map *)set,
-			dom, empty);
-}
-
-__isl_give isl_set *isl_set_partial_lexmax(
-		__isl_take isl_set *set, __isl_take isl_set *dom,
-		__isl_give isl_set **empty)
-{
-	return (struct isl_set *)
-		isl_map_partial_lexmax((struct isl_map *)set,
-			dom, empty);
-}
-
-__isl_give isl_map *isl_basic_map_lexopt(__isl_take isl_basic_map *bmap, int max)
-{
-	struct isl_basic_set *dom = NULL;
-	struct isl_dim *dom_dim;
-
-	if (!bmap)
-		goto error;
-	dom_dim = isl_dim_domain(isl_dim_copy(bmap->dim));
-	dom = isl_basic_set_universe(dom_dim);
-	return isl_basic_map_partial_lexopt(bmap, dom, NULL, max);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_map *isl_basic_map_lexmin(__isl_take isl_basic_map *bmap)
-{
-	return isl_basic_map_lexopt(bmap, 0);
-}
-
-__isl_give isl_map *isl_basic_map_lexmax(__isl_take isl_basic_map *bmap)
-{
-	return isl_basic_map_lexopt(bmap, 1);
-}
-
-__isl_give isl_set *isl_basic_set_lexmin(__isl_take isl_basic_set *bset)
-{
-	return (isl_set *)isl_basic_map_lexmin((isl_basic_map *)bset);
-}
-
-__isl_give isl_set *isl_basic_set_lexmax(__isl_take isl_basic_set *bset)
-{
-	return (isl_set *)isl_basic_map_lexmax((isl_basic_map *)bset);
-}
-
-__isl_give isl_map *isl_map_lexopt(__isl_take isl_map *map, int max)
-{
-	struct isl_set *dom = NULL;
-	struct isl_dim *dom_dim;
-
-	if (!map)
-		goto error;
-	dom_dim = isl_dim_domain(isl_dim_copy(map->dim));
-	dom = isl_set_universe(dom_dim);
-	return isl_map_partial_lexopt(map, dom, NULL, max);
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_lexmin(__isl_take isl_map *map)
-{
-	return isl_map_lexopt(map, 0);
-}
-
-__isl_give isl_map *isl_map_lexmax(__isl_take isl_map *map)
-{
-	return isl_map_lexopt(map, 1);
-}
-
-__isl_give isl_set *isl_set_lexmin(__isl_take isl_set *set)
-{
-	return (isl_set *)isl_map_lexmin((isl_map *)set);
-}
-
-__isl_give isl_set *isl_set_lexmax(__isl_take isl_set *set)
-{
-	return (isl_set *)isl_map_lexmax((isl_map *)set);
-}
-
-/* Construct a map that equates the two given dimensions in the given space.
- */
-static __isl_give isl_map *equate(__isl_take isl_dim *dim,
-	enum isl_dim_type src_type, int src_pos,
-	enum isl_dim_type dst_type, int dst_pos)
-{
-	isl_basic_map *bmap;
-	int k;
-
-	bmap = isl_basic_map_alloc_dim(dim, 0, 1, 0);
-	k = isl_basic_map_alloc_equality(bmap);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(bmap->eq[k], 1 + isl_basic_map_total_dim(bmap));
-	src_pos += isl_basic_map_offset(bmap, src_type);
-	dst_pos += isl_basic_map_offset(bmap, dst_type);
-	isl_int_set_si(bmap->eq[k][src_pos], 1);
-	isl_int_set_si(bmap->eq[k][dst_pos], -1);
-
-	return isl_map_from_basic_map(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Extract the first and only affine expression from list
- * and then add it to *pwaff with the given dom.
- * This domain is known to be disjoint from other domains
- * because of the way isl_basic_set_foreach_lexmax works.
- */
-static int update_dim_max(__isl_take isl_basic_set *dom,
-	__isl_take isl_aff_list *list, void *user)
-{
-	isl_ctx *ctx = isl_basic_set_get_ctx(dom);
-	isl_aff *aff;
-	isl_pw_aff **pwaff = user;
-	isl_pw_aff *pwaff_i;
-
-	if (isl_aff_list_n_aff(list) != 1)
-		isl_die(ctx, isl_error_internal,
-			"expecting single element list", goto error);
-
-	aff = isl_aff_list_get_aff(list, 0);
-	pwaff_i = isl_pw_aff_alloc(isl_set_from_basic_set(dom), aff);
-
-	*pwaff = isl_pw_aff_add_disjoint(*pwaff, pwaff_i);
-
-	isl_aff_list_free(list);
-
-	return 0;
-error:
-	isl_basic_set_free(dom);
-	isl_aff_list_free(list);
-	return -1;
-}
-
-/* Given a one-dimensional basic set, compute the maximum of that
- * dimension as an isl_pw_aff.
- *
- * The isl_pw_aff is constructed by having isl_basic_set_foreach_lexmax
- * call update_dim_max on each leaf of the result.
- */
-static __isl_give isl_pw_aff *basic_set_dim_max(__isl_keep isl_basic_set *bset)
-{
-	isl_dim *dim = isl_basic_set_get_dim(bset);
-	isl_pw_aff *pwaff;
-	int r;
-
-	dim = isl_dim_domain(isl_dim_from_range(dim));
-	pwaff = isl_pw_aff_empty(dim);
-
-	r = isl_basic_set_foreach_lexmax(bset, &update_dim_max, &pwaff);
-	if (r < 0)
-		return isl_pw_aff_free(pwaff);
-
-	return pwaff;
-}
-
-/* Compute the maximum of the given set dimension as a function of the
- * parameters, but independently of the other set dimensions.
- *
- * We first project the set onto the given dimension and then compute
- * the "lexicographic" maximum in each basic set, combining the results
- * using isl_pw_aff_max.
- */
-__isl_give isl_pw_aff *isl_set_dim_max(__isl_take isl_set *set, int pos)
-{
-	int i;
-	isl_map *map;
-	isl_pw_aff *pwaff;
-
-	map = isl_map_from_domain(set);
-	map = isl_map_add_dims(map, isl_dim_out, 1);
-	map = isl_map_intersect(map,
-		equate(isl_map_get_dim(map), isl_dim_in, pos,
-					     isl_dim_out, 0));
-	set = isl_map_range(map);
-	if (!set)
-		return NULL;
-
-	if (set->n == 0) {
-		isl_dim *dim = isl_set_get_dim(set);
-		dim = isl_dim_domain(isl_dim_from_range(dim));
-		isl_set_free(set);
-		return isl_pw_aff_empty(dim);
-	}
-
-	pwaff = basic_set_dim_max(set->p[0]);
-	for (i = 1; i < set->n; ++i) {
-		isl_pw_aff *pwaff_i;
-
-		pwaff_i = basic_set_dim_max(set->p[i]);
-		pwaff = isl_pw_aff_max(pwaff, pwaff_i);
-	}
-
-	isl_set_free(set);
-
-	return pwaff;
-}
-
-/* Apply a preimage specified by "mat" on the parameters of "bset".
- * bset is assumed to have only parameters and divs.
- */
-static struct isl_basic_set *basic_set_parameter_preimage(
-	struct isl_basic_set *bset, struct isl_mat *mat)
-{
-	unsigned nparam;
-
-	if (!bset || !mat)
-		goto error;
-
-	bset->dim = isl_dim_cow(bset->dim);
-	if (!bset->dim)
-		goto error;
-
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-
-	isl_assert(bset->ctx, mat->n_row == 1 + nparam, goto error);
-
-	bset->dim->nparam = 0;
-	bset->dim->n_out = nparam;
-	bset = isl_basic_set_preimage(bset, mat);
-	if (bset) {
-		bset->dim->nparam = bset->dim->n_out;
-		bset->dim->n_out = 0;
-	}
-	return bset;
-error:
-	isl_mat_free(mat);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Apply a preimage specified by "mat" on the parameters of "set".
- * set is assumed to have only parameters and divs.
- */
-static struct isl_set *set_parameter_preimage(
-	struct isl_set *set, struct isl_mat *mat)
-{
-	struct isl_dim *dim = NULL;
-	unsigned nparam;
-
-	if (!set || !mat)
-		goto error;
-
-	dim = isl_dim_copy(set->dim);
-	dim = isl_dim_cow(dim);
-	if (!dim)
-		goto error;
-
-	nparam = isl_set_dim(set, isl_dim_param);
-
-	isl_assert(set->ctx, mat->n_row == 1 + nparam, goto error);
-
-	dim->nparam = 0;
-	dim->n_out = nparam;
-	isl_set_reset_dim(set, dim);
-	set = isl_set_preimage(set, mat);
-	if (!set)
-		goto error2;
-	dim = isl_dim_copy(set->dim);
-	dim = isl_dim_cow(dim);
-	if (!dim)
-		goto error2;
-	dim->nparam = dim->n_out;
-	dim->n_out = 0;
-	isl_set_reset_dim(set, dim);
-	return set;
-error:
-	isl_dim_free(dim);
-	isl_mat_free(mat);
-error2:
-	isl_set_free(set);
-	return NULL;
-}
-
-/* Intersect the basic set "bset" with the affine space specified by the
- * equalities in "eq".
- */
-static struct isl_basic_set *basic_set_append_equalities(
-	struct isl_basic_set *bset, struct isl_mat *eq)
-{
-	int i, k;
-	unsigned len;
-
-	if (!bset || !eq)
-		goto error;
-
-	bset = isl_basic_set_extend_dim(bset, isl_dim_copy(bset->dim), 0,
-					eq->n_row, 0);
-	if (!bset)
-		goto error;
-
-	len = 1 + isl_dim_total(bset->dim) + bset->extra;
-	for (i = 0; i < eq->n_row; ++i) {
-		k = isl_basic_set_alloc_equality(bset);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(bset->eq[k], eq->row[i], eq->n_col);
-		isl_seq_clr(bset->eq[k] + eq->n_col, len - eq->n_col);
-	}
-	isl_mat_free(eq);
-
-	bset = isl_basic_set_gauss(bset, NULL);
-	bset = isl_basic_set_finalize(bset);
-
-	return bset;
-error:
-	isl_mat_free(eq);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Intersect the set "set" with the affine space specified by the
- * equalities in "eq".
- */
-static struct isl_set *set_append_equalities(struct isl_set *set,
-	struct isl_mat *eq)
-{
-	int i;
-
-	if (!set || !eq)
-		goto error;
-
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = basic_set_append_equalities(set->p[i],
-					isl_mat_copy(eq));
-		if (!set->p[i])
-			goto error;
-	}
-	isl_mat_free(eq);
-	return set;
-error:
-	isl_mat_free(eq);
-	isl_set_free(set);
-	return NULL;
-}
-
-/* Project the given basic set onto its parameter domain, possibly introducing
- * new, explicit, existential variables in the constraints.
- * The input has parameters and (possibly implicit) existential variables.
- * The output has the same parameters, but only
- * explicit existentially quantified variables.
- *
- * The actual projection is performed by pip, but pip doesn't seem
- * to like equalities very much, so we first remove the equalities
- * among the parameters by performing a variable compression on
- * the parameters.  Afterward, an inverse transformation is performed
- * and the equalities among the parameters are inserted back in.
- */
-static struct isl_set *parameter_compute_divs(struct isl_basic_set *bset)
-{
-	int i, j;
-	struct isl_mat *eq;
-	struct isl_mat *T, *T2;
-	struct isl_set *set;
-	unsigned nparam, n_div;
-
-	bset = isl_basic_set_cow(bset);
-	if (!bset)
-		return NULL;
-
-	if (bset->n_eq == 0)
-		return isl_basic_set_lexmin(bset);
-
-	isl_basic_set_gauss(bset, NULL);
-
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-	n_div = isl_basic_set_dim(bset, isl_dim_div);
-
-	for (i = 0, j = n_div - 1; i < bset->n_eq && j >= 0; --j) {
-		if (!isl_int_is_zero(bset->eq[i][1 + nparam + j]))
-			++i;
-	}
-	if (i == bset->n_eq)
-		return isl_basic_set_lexmin(bset);
-
-	eq = isl_mat_sub_alloc6(bset->ctx, bset->eq, i, bset->n_eq - i,
-		0, 1 + nparam);
-	eq = isl_mat_cow(eq);
-	T = isl_mat_variable_compression(isl_mat_copy(eq), &T2);
-	if (T && T->n_col == 0) {
-		isl_mat_free(T);
-		isl_mat_free(T2);
-		isl_mat_free(eq);
-		bset = isl_basic_set_set_to_empty(bset);
-		return isl_set_from_basic_set(bset);
-	}
-	bset = basic_set_parameter_preimage(bset, T);
-
-	set = isl_basic_set_lexmin(bset);
-	set = set_parameter_preimage(set, T2);
-	set = set_append_equalities(set, eq);
-	return set;
-}
-
-/* Compute an explicit representation for all the existentially
- * quantified variables.
- * The input and output dimensions are first turned into parameters.
- * compute_divs then returns a map with the same parameters and
- * no input or output dimensions and the dimension specification
- * is reset to that of the input.
- */
-static struct isl_map *compute_divs(struct isl_basic_map *bmap)
-{
-	struct isl_basic_set *bset;
-	struct isl_set *set;
-	struct isl_map *map;
-	struct isl_dim *dim, *orig_dim = NULL;
-	unsigned	 nparam;
-	unsigned	 n_in;
-	unsigned	 n_out;
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-
-	nparam = isl_basic_map_dim(bmap, isl_dim_param);
-	n_in = isl_basic_map_dim(bmap, isl_dim_in);
-	n_out = isl_basic_map_dim(bmap, isl_dim_out);
-	dim = isl_dim_set_alloc(bmap->ctx, nparam + n_in + n_out, 0);
-	if (!dim)
-		goto error;
-
-	orig_dim = bmap->dim;
-	bmap->dim = dim;
-	bset = (struct isl_basic_set *)bmap;
-
-	set = parameter_compute_divs(bset);
-	map = (struct isl_map *)set;
-	map = isl_map_reset_dim(map, orig_dim);
-
-	return map;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-int isl_basic_map_divs_known(__isl_keep isl_basic_map *bmap)
-{
-	int i;
-	unsigned off;
-
-	if (!bmap)
-		return -1;
-
-	off = isl_dim_total(bmap->dim);
-	for (i = 0; i < bmap->n_div; ++i) {
-		if (isl_int_is_zero(bmap->div[i][0]))
-			return 0;
-		isl_assert(bmap->ctx, isl_int_is_zero(bmap->div[i][1+1+off+i]),
-				return -1);
-	}
-	return 1;
-}
-
-static int map_divs_known(__isl_keep isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return -1;
-
-	for (i = 0; i < map->n; ++i) {
-		int known = isl_basic_map_divs_known(map->p[i]);
-		if (known <= 0)
-			return known;
-	}
-
-	return 1;
-}
-
-/* If bmap contains any unknown divs, then compute explicit
- * expressions for them.  However, this computation may be
- * quite expensive, so first try to remove divs that aren't
- * strictly needed.
- */
-struct isl_map *isl_basic_map_compute_divs(struct isl_basic_map *bmap)
-{
-	int known;
-	struct isl_map *map;
-
-	known = isl_basic_map_divs_known(bmap);
-	if (known < 0)
-		goto error;
-	if (known)
-		return isl_map_from_basic_map(bmap);
-
-	bmap = isl_basic_map_drop_redundant_divs(bmap);
-
-	known = isl_basic_map_divs_known(bmap);
-	if (known < 0)
-		goto error;
-	if (known)
-		return isl_map_from_basic_map(bmap);
-
-	map = compute_divs(bmap);
-	return map;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_map *isl_map_compute_divs(struct isl_map *map)
-{
-	int i;
-	int known;
-	struct isl_map *res;
-
-	if (!map)
-		return NULL;
-	if (map->n == 0)
-		return map;
-
-	known = map_divs_known(map);
-	if (known < 0) {
-		isl_map_free(map);
-		return NULL;
-	}
-	if (known)
-		return map;
-
-	res = isl_basic_map_compute_divs(isl_basic_map_copy(map->p[0]));
-	for (i = 1 ; i < map->n; ++i) {
-		struct isl_map *r2;
-		r2 = isl_basic_map_compute_divs(isl_basic_map_copy(map->p[i]));
-		if (ISL_F_ISSET(map, ISL_MAP_DISJOINT))
-			res = isl_map_union_disjoint(res, r2);
-		else
-			res = isl_map_union(res, r2);
-	}
-	isl_map_free(map);
-
-	return res;
-}
-
-struct isl_set *isl_basic_set_compute_divs(struct isl_basic_set *bset)
-{
-	return (struct isl_set *)
-		isl_basic_map_compute_divs((struct isl_basic_map *)bset);
-}
-
-struct isl_set *isl_set_compute_divs(struct isl_set *set)
-{
-	return (struct isl_set *)
-		isl_map_compute_divs((struct isl_map *)set);
-}
-
-struct isl_set *isl_map_domain(struct isl_map *map)
-{
-	int i;
-	struct isl_set *set;
-
-	if (!map)
-		goto error;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	set = (struct isl_set *)map;
-	set->dim = isl_dim_domain(set->dim);
-	if (!set->dim)
-		goto error;
-	for (i = 0; i < map->n; ++i) {
-		set->p[i] = isl_basic_map_domain(map->p[i]);
-		if (!set->p[i])
-			goto error;
-	}
-	ISL_F_CLR(set, ISL_MAP_DISJOINT);
-	ISL_F_CLR(set, ISL_SET_NORMALIZED);
-	return set;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-struct isl_map *isl_map_union_disjoint(
-			struct isl_map *map1, struct isl_map *map2)
-{
-	int i;
-	unsigned flags = 0;
-	struct isl_map *map = NULL;
-
-	if (!map1 || !map2)
-		goto error;
-
-	if (map1->n == 0) {
-		isl_map_free(map1);
-		return map2;
-	}
-	if (map2->n == 0) {
-		isl_map_free(map2);
-		return map1;
-	}
-
-	isl_assert(map1->ctx, isl_dim_equal(map1->dim, map2->dim), goto error);
-
-	if (ISL_F_ISSET(map1, ISL_MAP_DISJOINT) &&
-	    ISL_F_ISSET(map2, ISL_MAP_DISJOINT))
-		ISL_FL_SET(flags, ISL_MAP_DISJOINT);
-
-	map = isl_map_alloc_dim(isl_dim_copy(map1->dim),
-				map1->n + map2->n, flags);
-	if (!map)
-		goto error;
-	for (i = 0; i < map1->n; ++i) {
-		map = isl_map_add_basic_map(map,
-				  isl_basic_map_copy(map1->p[i]));
-		if (!map)
-			goto error;
-	}
-	for (i = 0; i < map2->n; ++i) {
-		map = isl_map_add_basic_map(map,
-				  isl_basic_map_copy(map2->p[i]));
-		if (!map)
-			goto error;
-	}
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return map;
-error:
-	isl_map_free(map);
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return NULL;
-}
-
-struct isl_map *isl_map_union(struct isl_map *map1, struct isl_map *map2)
-{
-	map1 = isl_map_union_disjoint(map1, map2);
-	if (!map1)
-		return NULL;
-	if (map1->n > 1)
-		ISL_F_CLR(map1, ISL_MAP_DISJOINT);
-	return map1;
-}
-
-struct isl_set *isl_set_union_disjoint(
-			struct isl_set *set1, struct isl_set *set2)
-{
-	return (struct isl_set *)
-		isl_map_union_disjoint(
-			(struct isl_map *)set1, (struct isl_map *)set2);
-}
-
-struct isl_set *isl_set_union(struct isl_set *set1, struct isl_set *set2)
-{
-	return (struct isl_set *)
-		isl_map_union((struct isl_map *)set1, (struct isl_map *)set2);
-}
-
-struct isl_map *isl_map_intersect_range(
-		struct isl_map *map, struct isl_set *set)
-{
-	unsigned flags = 0;
-	struct isl_map *result;
-	int i, j;
-
-	if (!map || !set)
-		goto error;
-
-	if (!isl_dim_match(map->dim, isl_dim_param, set->dim, isl_dim_param))
-		isl_die(set->ctx, isl_error_invalid,
-			"parameters don't match", goto error);
-
-	if (isl_dim_size(set->dim, isl_dim_set) != 0 &&
-	    !isl_map_compatible_range(map, set))
-		isl_die(set->ctx, isl_error_invalid,
-			"incompatible spaces", goto error);
-
-	if (isl_set_plain_is_universe(set)) {
-		isl_set_free(set);
-		return map;
-	}
-
-	if (ISL_F_ISSET(map, ISL_MAP_DISJOINT) &&
-	    ISL_F_ISSET(set, ISL_MAP_DISJOINT))
-		ISL_FL_SET(flags, ISL_MAP_DISJOINT);
-
-	result = isl_map_alloc_dim(isl_dim_copy(map->dim),
-					map->n * set->n, flags);
-	if (!result)
-		goto error;
-	for (i = 0; i < map->n; ++i)
-		for (j = 0; j < set->n; ++j) {
-			result = isl_map_add_basic_map(result,
-			    isl_basic_map_intersect_range(
-				isl_basic_map_copy(map->p[i]),
-				isl_basic_set_copy(set->p[j])));
-			if (!result)
-				goto error;
-		}
-	isl_map_free(map);
-	isl_set_free(set);
-	return result;
-error:
-	isl_map_free(map);
-	isl_set_free(set);
-	return NULL;
-}
-
-struct isl_map *isl_map_intersect_domain(
-		struct isl_map *map, struct isl_set *set)
-{
-	return isl_map_reverse(
-		isl_map_intersect_range(isl_map_reverse(map), set));
-}
-
-struct isl_map *isl_map_apply_domain(
-		struct isl_map *map1, struct isl_map *map2)
-{
-	if (!map1 || !map2)
-		goto error;
-	map1 = isl_map_reverse(map1);
-	map1 = isl_map_apply_range(map1, map2);
-	return isl_map_reverse(map1);
-error:
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return NULL;
-}
-
-struct isl_map *isl_map_apply_range(
-		struct isl_map *map1, struct isl_map *map2)
-{
-	struct isl_dim *dim_result;
-	struct isl_map *result;
-	int i, j;
-
-	if (!map1 || !map2)
-		goto error;
-
-	dim_result = isl_dim_join(isl_dim_copy(map1->dim),
-				  isl_dim_copy(map2->dim));
-
-	result = isl_map_alloc_dim(dim_result, map1->n * map2->n, 0);
-	if (!result)
-		goto error;
-	for (i = 0; i < map1->n; ++i)
-		for (j = 0; j < map2->n; ++j) {
-			result = isl_map_add_basic_map(result,
-			    isl_basic_map_apply_range(
-				isl_basic_map_copy(map1->p[i]),
-				isl_basic_map_copy(map2->p[j])));
-			if (!result)
-				goto error;
-		}
-	isl_map_free(map1);
-	isl_map_free(map2);
-	if (result && result->n <= 1)
-		ISL_F_SET(result, ISL_MAP_DISJOINT);
-	return result;
-error:
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return NULL;
-}
-
-/*
- * returns range - domain
- */
-struct isl_basic_set *isl_basic_map_deltas(struct isl_basic_map *bmap)
-{
-	isl_dim *dims, *target_dim;
-	struct isl_basic_set *bset;
-	unsigned dim;
-	unsigned nparam;
-	int i;
-
-	if (!bmap)
-		goto error;
-	isl_assert(bmap->ctx, isl_dim_tuple_match(bmap->dim, isl_dim_in,
-						  bmap->dim, isl_dim_out),
-		   goto error);
-	target_dim = isl_dim_domain(isl_basic_map_get_dim(bmap));
-	dim = isl_basic_map_n_in(bmap);
-	nparam = isl_basic_map_n_param(bmap);
-	bset = isl_basic_set_from_basic_map(bmap);
-	bset = isl_basic_set_cow(bset);
-	dims = isl_basic_set_get_dim(bset);
-	dims = isl_dim_add(dims, isl_dim_set, dim);
-	bset = isl_basic_set_extend_dim(bset, dims, 0, dim, 0);
-	bset = isl_basic_set_swap_vars(bset, 2*dim);
-	for (i = 0; i < dim; ++i) {
-		int j = isl_basic_map_alloc_equality(
-					    (struct isl_basic_map *)bset);
-		if (j < 0)
-			goto error;
-		isl_seq_clr(bset->eq[j], 1 + isl_basic_set_total_dim(bset));
-		isl_int_set_si(bset->eq[j][1+nparam+i], 1);
-		isl_int_set_si(bset->eq[j][1+nparam+dim+i], 1);
-		isl_int_set_si(bset->eq[j][1+nparam+2*dim+i], -1);
-	}
-	bset = isl_basic_set_project_out(bset, isl_dim_set, dim, 2*dim);
-	bset = isl_basic_set_reset_dim(bset, target_dim);
-	return bset;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/*
- * returns range - domain
- */
-struct isl_set *isl_map_deltas(struct isl_map *map)
-{
-	int i;
-	isl_dim *dim;
-	struct isl_set *result;
-
-	if (!map)
-		return NULL;
-
-	isl_assert(map->ctx, isl_dim_tuple_match(map->dim, isl_dim_in,
-						 map->dim, isl_dim_out),
-		   goto error);
-	dim = isl_map_get_dim(map);
-	dim = isl_dim_domain(dim);
-	result = isl_set_alloc_dim(dim, map->n, 0);
-	if (!result)
-		goto error;
-	for (i = 0; i < map->n; ++i)
-		result = isl_set_add_basic_set(result,
-			  isl_basic_map_deltas(isl_basic_map_copy(map->p[i])));
-	isl_map_free(map);
-	return result;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/*
- * returns [domain -> range] -> range - domain
- */
-__isl_give isl_basic_map *isl_basic_map_deltas_map(
-	__isl_take isl_basic_map *bmap)
-{
-	int i, k;
-	isl_dim *dim;
-	isl_basic_map *domain;
-	int nparam, n;
-	unsigned total;
-
-	if (!isl_dim_tuple_match(bmap->dim, isl_dim_in, bmap->dim, isl_dim_out))
-		isl_die(bmap->ctx, isl_error_invalid,
-			"domain and range don't match", goto error);
-
-	nparam = isl_basic_map_dim(bmap, isl_dim_param);
-	n = isl_basic_map_dim(bmap, isl_dim_in);
-
-	dim = isl_dim_from_range(isl_dim_domain(isl_basic_map_get_dim(bmap)));
-	domain = isl_basic_map_universe(dim);
-
-	bmap = isl_basic_map_from_domain(isl_basic_map_wrap(bmap));
-	bmap = isl_basic_map_apply_range(bmap, domain);
-	bmap = isl_basic_map_extend_constraints(bmap, n, 0);
-
-	total = isl_basic_map_total_dim(bmap);
-
-	for (i = 0; i < n; ++i) {
-		k = isl_basic_map_alloc_equality(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(bmap->eq[k], 1 + total);
-		isl_int_set_si(bmap->eq[k][1 + nparam + i], 1);
-		isl_int_set_si(bmap->eq[k][1 + nparam + n + i], -1);
-		isl_int_set_si(bmap->eq[k][1 + nparam + n + n + i], 1);
-	}
-
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/*
- * returns [domain -> range] -> range - domain
- */
-__isl_give isl_map *isl_map_deltas_map(__isl_take isl_map *map)
-{
-	int i;
-	isl_dim *domain_dim;
-
-	if (!map)
-		return NULL;
-
-	if (!isl_dim_tuple_match(map->dim, isl_dim_in, map->dim, isl_dim_out))
-		isl_die(map->ctx, isl_error_invalid,
-			"domain and range don't match", goto error);
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	domain_dim = isl_dim_from_range(isl_dim_domain(isl_map_get_dim(map)));
-	map->dim = isl_dim_from_domain(isl_dim_wrap(map->dim));
-	map->dim = isl_dim_join(map->dim, domain_dim);
-	if (!map->dim)
-		goto error;
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_deltas_map(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-static struct isl_basic_map *basic_map_identity(struct isl_dim *dims)
-{
-	struct isl_basic_map *bmap;
-	unsigned nparam;
-	unsigned dim;
-	int i;
-
-	if (!dims)
-		return NULL;
-
-	nparam = dims->nparam;
-	dim = dims->n_out;
-	bmap = isl_basic_map_alloc_dim(dims, 0, dim, 0);
-	if (!bmap)
-		goto error;
-
-	for (i = 0; i < dim; ++i) {
-		int j = isl_basic_map_alloc_equality(bmap);
-		if (j < 0)
-			goto error;
-		isl_seq_clr(bmap->eq[j], 1 + isl_basic_map_total_dim(bmap));
-		isl_int_set_si(bmap->eq[j][1+nparam+i], 1);
-		isl_int_set_si(bmap->eq[j][1+nparam+dim+i], -1);
-	}
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_identity(__isl_take isl_dim *dim)
-{
-	if (!dim)
-		return NULL;
-	if (dim->n_in != dim->n_out)
-		isl_die(dim->ctx, isl_error_invalid,
-			"number of input and output dimensions needs to be "
-			"the same", goto error);
-	return basic_map_identity(dim);
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-struct isl_basic_map *isl_basic_map_identity_like(struct isl_basic_map *model)
-{
-	if (!model || !model->dim)
-		return NULL;
-	return isl_basic_map_identity(isl_dim_copy(model->dim));
-}
-
-__isl_give isl_map *isl_map_identity(__isl_take isl_dim *dim)
-{
-	return isl_map_from_basic_map(isl_basic_map_identity(dim));
-}
-
-struct isl_map *isl_map_identity_like(struct isl_map *model)
-{
-	if (!model || !model->dim)
-		return NULL;
-	return isl_map_identity(isl_dim_copy(model->dim));
-}
-
-struct isl_map *isl_map_identity_like_basic_map(struct isl_basic_map *model)
-{
-	if (!model || !model->dim)
-		return NULL;
-	return isl_map_identity(isl_dim_copy(model->dim));
-}
-
-__isl_give isl_map *isl_set_identity(__isl_take isl_set *set)
-{
-	isl_dim *dim = isl_set_get_dim(set);
-	isl_map *id;
-	id = isl_map_identity(isl_dim_map_from_set(dim));
-	return isl_map_intersect_range(id, set);
-}
-
-/* Construct a basic set with all set dimensions having only non-negative
- * values.
- */
-struct isl_basic_set *isl_basic_set_positive_orthant(struct isl_dim *dims)
-{
-	int i;
-	unsigned nparam;
-	unsigned dim;
-	struct isl_basic_set *bset;
-
-	if (!dims)
-		return NULL;
-	nparam = dims->nparam;
-	dim = dims->n_out;
-	bset = isl_basic_set_alloc_dim(dims, 0, 0, dim);
-	if (!bset)
-		return NULL;
-	for (i = 0; i < dim; ++i) {
-		int k = isl_basic_set_alloc_inequality(bset);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(bset->ineq[k], 1 + isl_basic_set_total_dim(bset));
-		isl_int_set_si(bset->ineq[k][1 + nparam + i], 1);
-	}
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Construct the half-space x_pos >= 0.
- */
-static __isl_give isl_basic_set *nonneg_halfspace(__isl_take isl_dim *dim,
-	int pos)
-{
-	int k;
-	isl_basic_set *nonneg;
-
-	nonneg = isl_basic_set_alloc_dim(dim, 0, 0, 1);
-	k = isl_basic_set_alloc_inequality(nonneg);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(nonneg->ineq[k], 1 + isl_basic_set_total_dim(nonneg));
-	isl_int_set_si(nonneg->ineq[k][pos], 1);
-
-	return isl_basic_set_finalize(nonneg);
-error:
-	isl_basic_set_free(nonneg);
-	return NULL;
-}
-
-/* Construct the half-space x_pos <= -1.
- */
-static __isl_give isl_basic_set *neg_halfspace(__isl_take isl_dim *dim, int pos)
-{
-	int k;
-	isl_basic_set *neg;
-
-	neg = isl_basic_set_alloc_dim(dim, 0, 0, 1);
-	k = isl_basic_set_alloc_inequality(neg);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(neg->ineq[k], 1 + isl_basic_set_total_dim(neg));
-	isl_int_set_si(neg->ineq[k][0], -1);
-	isl_int_set_si(neg->ineq[k][pos], -1);
-
-	return isl_basic_set_finalize(neg);
-error:
-	isl_basic_set_free(neg);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_split_dims(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-	isl_basic_set *nonneg;
-	isl_basic_set *neg;
-
-	if (!set)
-		return NULL;
-	if (n == 0)
-		return set;
-
-	isl_assert(set->ctx, first + n <= isl_set_dim(set, type), goto error);
-
-	for (i = 0; i < n; ++i) {
-		nonneg = nonneg_halfspace(isl_set_get_dim(set),
-					  pos(set->dim, type) + first + i);
-		neg = neg_halfspace(isl_set_get_dim(set),
-					  pos(set->dim, type) + first + i);
-
-		set = isl_set_intersect(set, isl_basic_set_union(nonneg, neg));
-	}
-
-	return set;
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-static int foreach_orthant(__isl_take isl_set *set, int *signs, int first,
-	int len, int (*fn)(__isl_take isl_set *orthant, int *signs, void *user),
-	void *user)
-{
-	isl_set *half;
-
-	if (!set)
-		return -1;
-	if (isl_set_plain_is_empty(set)) {
-		isl_set_free(set);
-		return 0;
-	}
-	if (first == len)
-		return fn(set, signs, user);
-
-	signs[first] = 1;
-	half = isl_set_from_basic_set(nonneg_halfspace(isl_set_get_dim(set),
-							1 + first));
-	half = isl_set_intersect(half, isl_set_copy(set));
-	if (foreach_orthant(half, signs, first + 1, len, fn, user) < 0)
-		goto error;
-
-	signs[first] = -1;
-	half = isl_set_from_basic_set(neg_halfspace(isl_set_get_dim(set),
-							1 + first));
-	half = isl_set_intersect(half, set);
-	return foreach_orthant(half, signs, first + 1, len, fn, user);
-error:
-	isl_set_free(set);
-	return -1;
-}
-
-/* Call "fn" on the intersections of "set" with each of the orthants
- * (except for obviously empty intersections).  The orthant is identified
- * by the signs array, with each entry having value 1 or -1 according
- * to the sign of the corresponding variable.
- */
-int isl_set_foreach_orthant(__isl_keep isl_set *set,
-	int (*fn)(__isl_take isl_set *orthant, int *signs, void *user),
-	void *user)
-{
-	unsigned nparam;
-	unsigned nvar;
-	int *signs;
-	int r;
-
-	if (!set)
-		return -1;
-	if (isl_set_plain_is_empty(set))
-		return 0;
-
-	nparam = isl_set_dim(set, isl_dim_param);
-	nvar = isl_set_dim(set, isl_dim_set);
-
-	signs = isl_alloc_array(set->ctx, int, nparam + nvar);
-
-	r = foreach_orthant(isl_set_copy(set), signs, 0, nparam + nvar,
-			    fn, user);
-
-	free(signs);
-
-	return r;
-}
-
-int isl_set_is_equal(struct isl_set *set1, struct isl_set *set2)
-{
-	return isl_map_is_equal((struct isl_map *)set1, (struct isl_map *)set2);
-}
-
-int isl_basic_map_is_subset(
-		struct isl_basic_map *bmap1, struct isl_basic_map *bmap2)
-{
-	int is_subset;
-	struct isl_map *map1;
-	struct isl_map *map2;
-
-	if (!bmap1 || !bmap2)
-		return -1;
-
-	map1 = isl_map_from_basic_map(isl_basic_map_copy(bmap1));
-	map2 = isl_map_from_basic_map(isl_basic_map_copy(bmap2));
-
-	is_subset = isl_map_is_subset(map1, map2);
-
-	isl_map_free(map1);
-	isl_map_free(map2);
-
-	return is_subset;
-}
-
-int isl_basic_map_is_equal(
-		struct isl_basic_map *bmap1, struct isl_basic_map *bmap2)
-{
-	int is_subset;
-
-	if (!bmap1 || !bmap2)
-		return -1;
-	is_subset = isl_basic_map_is_subset(bmap1, bmap2);
-	if (is_subset != 1)
-		return is_subset;
-	is_subset = isl_basic_map_is_subset(bmap2, bmap1);
-	return is_subset;
-}
-
-int isl_basic_set_is_equal(
-		struct isl_basic_set *bset1, struct isl_basic_set *bset2)
-{
-	return isl_basic_map_is_equal(
-		(struct isl_basic_map *)bset1, (struct isl_basic_map *)bset2);
-}
-
-int isl_map_is_empty(struct isl_map *map)
-{
-	int i;
-	int is_empty;
-
-	if (!map)
-		return -1;
-	for (i = 0; i < map->n; ++i) {
-		is_empty = isl_basic_map_is_empty(map->p[i]);
-		if (is_empty < 0)
-			return -1;
-		if (!is_empty)
-			return 0;
-	}
-	return 1;
-}
-
-int isl_map_plain_is_empty(__isl_keep isl_map *map)
-{
-	return map ? map->n == 0 : -1;
-}
-
-int isl_map_fast_is_empty(__isl_keep isl_map *map)
-{
-	return isl_map_plain_is_empty(map);
-}
-
-int isl_set_plain_is_empty(struct isl_set *set)
-{
-	return set ? set->n == 0 : -1;
-}
-
-int isl_set_fast_is_empty(__isl_keep isl_set *set)
-{
-	return isl_set_plain_is_empty(set);
-}
-
-int isl_set_is_empty(struct isl_set *set)
-{
-	return isl_map_is_empty((struct isl_map *)set);
-}
-
-int isl_map_has_equal_dim(__isl_keep isl_map *map1, __isl_keep isl_map *map2)
-{
-	if (!map1 || !map2)
-		return -1;
-
-	return isl_dim_equal(map1->dim, map2->dim);
-}
-
-int isl_set_has_equal_dim(__isl_keep isl_set *set1, __isl_keep isl_set *set2)
-{
-	if (!set1 || !set2)
-		return -1;
-
-	return isl_dim_equal(set1->dim, set2->dim);
-}
-
-int isl_map_is_equal(struct isl_map *map1, struct isl_map *map2)
-{
-	int is_subset;
-
-	if (!map1 || !map2)
-		return -1;
-	is_subset = isl_map_is_subset(map1, map2);
-	if (is_subset != 1)
-		return is_subset;
-	is_subset = isl_map_is_subset(map2, map1);
-	return is_subset;
-}
-
-int isl_basic_map_is_strict_subset(
-		struct isl_basic_map *bmap1, struct isl_basic_map *bmap2)
-{
-	int is_subset;
-
-	if (!bmap1 || !bmap2)
-		return -1;
-	is_subset = isl_basic_map_is_subset(bmap1, bmap2);
-	if (is_subset != 1)
-		return is_subset;
-	is_subset = isl_basic_map_is_subset(bmap2, bmap1);
-	if (is_subset == -1)
-		return is_subset;
-	return !is_subset;
-}
-
-int isl_map_is_strict_subset(struct isl_map *map1, struct isl_map *map2)
-{
-	int is_subset;
-
-	if (!map1 || !map2)
-		return -1;
-	is_subset = isl_map_is_subset(map1, map2);
-	if (is_subset != 1)
-		return is_subset;
-	is_subset = isl_map_is_subset(map2, map1);
-	if (is_subset == -1)
-		return is_subset;
-	return !is_subset;
-}
-
-int isl_set_is_strict_subset(__isl_keep isl_set *set1, __isl_keep isl_set *set2)
-{
-	return isl_map_is_strict_subset((isl_map *)set1, (isl_map *)set2);
-}
-
-int isl_basic_map_is_universe(struct isl_basic_map *bmap)
-{
-	if (!bmap)
-		return -1;
-	return bmap->n_eq == 0 && bmap->n_ineq == 0;
-}
-
-int isl_basic_set_is_universe(struct isl_basic_set *bset)
-{
-	if (!bset)
-		return -1;
-	return bset->n_eq == 0 && bset->n_ineq == 0;
-}
-
-int isl_map_plain_is_universe(__isl_keep isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return -1;
-
-	for (i = 0; i < map->n; ++i) {
-		int r = isl_basic_map_is_universe(map->p[i]);
-		if (r < 0 || r)
-			return r;
-	}
-
-	return 0;
-}
-
-int isl_set_plain_is_universe(__isl_keep isl_set *set)
-{
-	return isl_map_plain_is_universe((isl_map *) set);
-}
-
-int isl_set_fast_is_universe(__isl_keep isl_set *set)
-{
-	return isl_set_plain_is_universe(set);
-}
-
-int isl_basic_map_is_empty(struct isl_basic_map *bmap)
-{
-	struct isl_basic_set *bset = NULL;
-	struct isl_vec *sample = NULL;
-	int empty;
-	unsigned total;
-
-	if (!bmap)
-		return -1;
-
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY))
-		return 1;
-
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL)) {
-		struct isl_basic_map *copy = isl_basic_map_copy(bmap);
-		copy = isl_basic_map_remove_redundancies(copy);
-		empty = ISL_F_ISSET(copy, ISL_BASIC_MAP_EMPTY);
-		isl_basic_map_free(copy);
-		return empty;
-	}
-
-	total = 1 + isl_basic_map_total_dim(bmap);
-	if (bmap->sample && bmap->sample->size == total) {
-		int contains = isl_basic_map_contains(bmap, bmap->sample);
-		if (contains < 0)
-			return -1;
-		if (contains)
-			return 0;
-	}
-	isl_vec_free(bmap->sample);
-	bmap->sample = NULL;
-	bset = isl_basic_map_underlying_set(isl_basic_map_copy(bmap));
-	if (!bset)
-		return -1;
-	sample = isl_basic_set_sample_vec(bset);
-	if (!sample)
-		return -1;
-	empty = sample->size == 0;
-	isl_vec_free(bmap->sample);
-	bmap->sample = sample;
-	if (empty)
-		ISL_F_SET(bmap, ISL_BASIC_MAP_EMPTY);
-
-	return empty;
-}
-
-int isl_basic_map_plain_is_empty(__isl_keep isl_basic_map *bmap)
-{
-	if (!bmap)
-		return -1;
-	return ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY);
-}
-
-int isl_basic_map_fast_is_empty(__isl_keep isl_basic_map *bmap)
-{
-	return isl_basic_map_plain_is_empty(bmap);
-}
-
-int isl_basic_set_plain_is_empty(__isl_keep isl_basic_set *bset)
-{
-	if (!bset)
-		return -1;
-	return ISL_F_ISSET(bset, ISL_BASIC_SET_EMPTY);
-}
-
-int isl_basic_set_fast_is_empty(__isl_keep isl_basic_set *bset)
-{
-	return isl_basic_set_plain_is_empty(bset);
-}
-
-int isl_basic_set_is_empty(struct isl_basic_set *bset)
-{
-	return isl_basic_map_is_empty((struct isl_basic_map *)bset);
-}
-
-struct isl_map *isl_basic_map_union(
-	struct isl_basic_map *bmap1, struct isl_basic_map *bmap2)
-{
-	struct isl_map *map;
-	if (!bmap1 || !bmap2)
-		return NULL;
-
-	isl_assert(bmap1->ctx, isl_dim_equal(bmap1->dim, bmap2->dim), goto error);
-
-	map = isl_map_alloc_dim(isl_dim_copy(bmap1->dim), 2, 0);
-	if (!map)
-		goto error;
-	map = isl_map_add_basic_map(map, bmap1);
-	map = isl_map_add_basic_map(map, bmap2);
-	return map;
-error:
-	isl_basic_map_free(bmap1);
-	isl_basic_map_free(bmap2);
-	return NULL;
-}
-
-struct isl_set *isl_basic_set_union(
-		struct isl_basic_set *bset1, struct isl_basic_set *bset2)
-{
-	return (struct isl_set *)isl_basic_map_union(
-					    (struct isl_basic_map *)bset1,
-					    (struct isl_basic_map *)bset2);
-}
-
-/* Order divs such that any div only depends on previous divs */
-struct isl_basic_map *isl_basic_map_order_divs(struct isl_basic_map *bmap)
-{
-	int i;
-	unsigned off;
-
-	if (!bmap)
-		return NULL;
-
-	off = isl_dim_total(bmap->dim);
-
-	for (i = 0; i < bmap->n_div; ++i) {
-		int pos;
-		if (isl_int_is_zero(bmap->div[i][0]))
-			continue;
-		pos = isl_seq_first_non_zero(bmap->div[i]+1+1+off+i,
-							    bmap->n_div-i);
-		if (pos == -1)
-			continue;
-		isl_basic_map_swap_div(bmap, i, i + pos);
-		--i;
-	}
-	return bmap;
-}
-
-struct isl_basic_set *isl_basic_set_order_divs(struct isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_order_divs((struct isl_basic_map *)bset);
-}
-
-__isl_give isl_map *isl_map_order_divs(__isl_take isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return 0;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_order_divs(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Apply the expansion computed by isl_merge_divs.
- * The expansion itself is given by "exp" while the resulting
- * list of divs is given by "div".
- */
-__isl_give isl_basic_set *isl_basic_set_expand_divs(
-	__isl_take isl_basic_set *bset, __isl_take isl_mat *div, int *exp)
-{
-	int i, j;
-	int n_div;
-
-	bset = isl_basic_set_cow(bset);
-	if (!bset || !div)
-		goto error;
-
-	if (div->n_row < bset->n_div)
-		isl_die(isl_mat_get_ctx(div), isl_error_invalid,
-			"not an expansion", goto error);
-
-	bset = isl_basic_map_extend_dim(bset, isl_dim_copy(bset->dim),
-					div->n_row - bset->n_div, 0,
-					2 * (div->n_row - bset->n_div));
-
-	n_div = bset->n_div;
-	for (i = n_div; i < div->n_row; ++i)
-		if (isl_basic_set_alloc_div(bset) < 0)
-			goto error;
-
-	j = n_div - 1;
-	for (i = div->n_row - 1; i >= 0; --i) {
-		if (j >= 0 && exp[j] == i) {
-			if (i != j)
-				isl_basic_map_swap_div(bset, i, j);
-			j--;
-		} else {
-			isl_seq_cpy(bset->div[i], div->row[i], div->n_col);
-			if (isl_basic_map_add_div_constraints(bset, i) < 0)
-				goto error;
-		}
-	}
-
-	isl_mat_free(div);
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	isl_mat_free(div);
-	return NULL;
-}
-
-/* Look for a div in dst that corresponds to the div "div" in src.
- * The divs before "div" in src and dst are assumed to be the same.
- * 
- * Returns -1 if no corresponding div was found and the position
- * of the corresponding div in dst otherwise.
- */
-static int find_div(struct isl_basic_map *dst,
-			struct isl_basic_map *src, unsigned div)
-{
-	int i;
-
-	unsigned total = isl_dim_total(src->dim);
-
-	isl_assert(dst->ctx, div <= dst->n_div, return -1);
-	for (i = div; i < dst->n_div; ++i)
-		if (isl_seq_eq(dst->div[i], src->div[div], 1+1+total+div) &&
-		    isl_seq_first_non_zero(dst->div[i]+1+1+total+div,
-						dst->n_div - div) == -1)
-			return i;
-	return -1;
-}
-
-struct isl_basic_map *isl_basic_map_align_divs(
-		struct isl_basic_map *dst, struct isl_basic_map *src)
-{
-	int i;
-	unsigned total = isl_dim_total(src->dim);
-
-	if (!dst || !src)
-		goto error;
-
-	if (src->n_div == 0)
-		return dst;
-
-	for (i = 0; i < src->n_div; ++i)
-		isl_assert(src->ctx, !isl_int_is_zero(src->div[i][0]), goto error);
-
-	src = isl_basic_map_order_divs(src);
-	dst = isl_basic_map_cow(dst);
-	dst = isl_basic_map_extend_dim(dst, isl_dim_copy(dst->dim),
-			src->n_div, 0, 2 * src->n_div);
-	if (!dst)
-		return NULL;
-	for (i = 0; i < src->n_div; ++i) {
-		int j = find_div(dst, src, i);
-		if (j < 0) {
-			j = isl_basic_map_alloc_div(dst);
-			if (j < 0)
-				goto error;
-			isl_seq_cpy(dst->div[j], src->div[i], 1+1+total+i);
-			isl_seq_clr(dst->div[j]+1+1+total+i, dst->n_div - i);
-			if (isl_basic_map_add_div_constraints(dst, j) < 0)
-				goto error;
-		}
-		if (j != i)
-			isl_basic_map_swap_div(dst, i, j);
-	}
-	return dst;
-error:
-	isl_basic_map_free(dst);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_align_divs(
-		struct isl_basic_set *dst, struct isl_basic_set *src)
-{
-	return (struct isl_basic_set *)isl_basic_map_align_divs(
-		(struct isl_basic_map *)dst, (struct isl_basic_map *)src);
-}
-
-struct isl_map *isl_map_align_divs(struct isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-	if (map->n == 0)
-		return map;
-	map = isl_map_compute_divs(map);
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	for (i = 1; i < map->n; ++i)
-		map->p[0] = isl_basic_map_align_divs(map->p[0], map->p[i]);
-	for (i = 1; i < map->n; ++i)
-		map->p[i] = isl_basic_map_align_divs(map->p[i], map->p[0]);
-
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-}
-
-struct isl_set *isl_set_align_divs(struct isl_set *set)
-{
-	return (struct isl_set *)isl_map_align_divs((struct isl_map *)set);
-}
-
-struct isl_set *isl_set_apply(struct isl_set *set, struct isl_map *map)
-{
-	if (!set || !map)
-		goto error;
-	isl_assert(set->ctx, isl_map_compatible_domain(map, set), goto error);
-	map = isl_map_intersect_domain(map, set);
-	set = isl_map_range(map);
-	return set;
-error:
-	isl_set_free(set);
-	isl_map_free(map);
-	return NULL;
-}
-
-/* There is no need to cow as removing empty parts doesn't change
- * the meaning of the set.
- */
-struct isl_map *isl_map_remove_empty_parts(struct isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-
-	for (i = map->n-1; i >= 0; --i) {
-		if (!ISL_F_ISSET(map->p[i], ISL_BASIC_MAP_EMPTY))
-			continue;
-		isl_basic_map_free(map->p[i]);
-		if (i != map->n-1) {
-			ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-			map->p[i] = map->p[map->n-1];
-		}
-		map->n--;
-	}
-
-	return map;
-}
-
-struct isl_set *isl_set_remove_empty_parts(struct isl_set *set)
-{
-	return (struct isl_set *)
-		isl_map_remove_empty_parts((struct isl_map *)set);
-}
-
-struct isl_basic_map *isl_map_copy_basic_map(struct isl_map *map)
-{
-	struct isl_basic_map *bmap;
-	if (!map || map->n == 0)
-		return NULL;
-	bmap = map->p[map->n-1];
-	isl_assert(map->ctx, ISL_F_ISSET(bmap, ISL_BASIC_SET_FINAL), return NULL);
-	return isl_basic_map_copy(bmap);
-}
-
-struct isl_basic_set *isl_set_copy_basic_set(struct isl_set *set)
-{
-	return (struct isl_basic_set *)
-		isl_map_copy_basic_map((struct isl_map *)set);
-}
-
-__isl_give isl_map *isl_map_drop_basic_map(__isl_take isl_map *map,
-						__isl_keep isl_basic_map *bmap)
-{
-	int i;
-
-	if (!map || !bmap)
-		goto error;
-	for (i = map->n-1; i >= 0; --i) {
-		if (map->p[i] != bmap)
-			continue;
-		map = isl_map_cow(map);
-		if (!map)
-			goto error;
-		isl_basic_map_free(map->p[i]);
-		if (i != map->n-1) {
-			ISL_F_CLR(map, ISL_SET_NORMALIZED);
-			map->p[i] = map->p[map->n-1];
-		}
-		map->n--;
-		return map;
-	}
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-struct isl_set *isl_set_drop_basic_set(struct isl_set *set,
-						struct isl_basic_set *bset)
-{
-	return (struct isl_set *)isl_map_drop_basic_map((struct isl_map *)set,
-						(struct isl_basic_map *)bset);
-}
-
-/* Given two basic sets bset1 and bset2, compute the maximal difference
- * between the values of dimension pos in bset1 and those in bset2
- * for any common value of the parameters and dimensions preceding pos.
- */
-static enum isl_lp_result basic_set_maximal_difference_at(
-	__isl_keep isl_basic_set *bset1, __isl_keep isl_basic_set *bset2,
-	int pos, isl_int *opt)
-{
-	struct isl_dim *dims;
-	struct isl_basic_map *bmap1 = NULL;
-	struct isl_basic_map *bmap2 = NULL;
-	struct isl_ctx *ctx;
-	struct isl_vec *obj;
-	unsigned total;
-	unsigned nparam;
-	unsigned dim1, dim2;
-	enum isl_lp_result res;
-
-	if (!bset1 || !bset2)
-		return isl_lp_error;
-
-	nparam = isl_basic_set_n_param(bset1);
-	dim1 = isl_basic_set_n_dim(bset1);
-	dim2 = isl_basic_set_n_dim(bset2);
-	dims = isl_dim_alloc(bset1->ctx, nparam, pos, dim1 - pos);
-	bmap1 = isl_basic_map_from_basic_set(isl_basic_set_copy(bset1), dims);
-	dims = isl_dim_alloc(bset2->ctx, nparam, pos, dim2 - pos);
-	bmap2 = isl_basic_map_from_basic_set(isl_basic_set_copy(bset2), dims);
-	if (!bmap1 || !bmap2)
-		goto error;
-	bmap1 = isl_basic_map_cow(bmap1);
-	bmap1 = isl_basic_map_extend(bmap1, nparam,
-			pos, (dim1 - pos) + (dim2 - pos),
-			bmap2->n_div, bmap2->n_eq, bmap2->n_ineq);
-	bmap1 = add_constraints(bmap1, bmap2, 0, dim1 - pos);
-	if (!bmap1)
-		goto error;
-	total = isl_basic_map_total_dim(bmap1);
-	ctx = bmap1->ctx;
-	obj = isl_vec_alloc(ctx, 1 + total);
-	isl_seq_clr(obj->block.data, 1 + total);
-	isl_int_set_si(obj->block.data[1+nparam+pos], 1);
-	isl_int_set_si(obj->block.data[1+nparam+pos+(dim1-pos)], -1);
-	if (!obj)
-		goto error;
-	res = isl_basic_map_solve_lp(bmap1, 1, obj->block.data, ctx->one,
-					opt, NULL, NULL);
-	isl_basic_map_free(bmap1);
-	isl_vec_free(obj);
-	return res;
-error:
-	isl_basic_map_free(bmap1);
-	isl_basic_map_free(bmap2);
-	return isl_lp_error;
-}
-
-/* Given two _disjoint_ basic sets bset1 and bset2, check whether
- * for any common value of the parameters and dimensions preceding pos
- * in both basic sets, the values of dimension pos in bset1 are
- * smaller or larger than those in bset2.
- *
- * Returns
- *	 1 if bset1 follows bset2
- *	-1 if bset1 precedes bset2
- *	 0 if bset1 and bset2 are incomparable
- *	-2 if some error occurred.
- */
-int isl_basic_set_compare_at(struct isl_basic_set *bset1,
-	struct isl_basic_set *bset2, int pos)
-{
-	isl_int opt;
-	enum isl_lp_result res;
-	int cmp;
-
-	isl_int_init(opt);
-
-	res = basic_set_maximal_difference_at(bset1, bset2, pos, &opt);
-
-	if (res == isl_lp_empty)
-		cmp = 0;
-	else if ((res == isl_lp_ok && isl_int_is_pos(opt)) ||
-		  res == isl_lp_unbounded)
-		cmp = 1;
-	else if (res == isl_lp_ok && isl_int_is_neg(opt))
-		cmp = -1;
-	else
-		cmp = -2;
-
-	isl_int_clear(opt);
-	return cmp;
-}
-
-/* Given two basic sets bset1 and bset2, check whether
- * for any common value of the parameters and dimensions preceding pos
- * there is a value of dimension pos in bset1 that is larger
- * than a value of the same dimension in bset2.
- *
- * Return
- *	 1 if there exists such a pair
- *	 0 if there is no such pair, but there is a pair of equal values
- *	-1 otherwise
- *	-2 if some error occurred.
- */
-int isl_basic_set_follows_at(__isl_keep isl_basic_set *bset1,
-	__isl_keep isl_basic_set *bset2, int pos)
-{
-	isl_int opt;
-	enum isl_lp_result res;
-	int cmp;
-
-	isl_int_init(opt);
-
-	res = basic_set_maximal_difference_at(bset1, bset2, pos, &opt);
-
-	if (res == isl_lp_empty)
-		cmp = -1;
-	else if ((res == isl_lp_ok && isl_int_is_pos(opt)) ||
-		  res == isl_lp_unbounded)
-		cmp = 1;
-	else if (res == isl_lp_ok && isl_int_is_neg(opt))
-		cmp = -1;
-	else if (res == isl_lp_ok)
-		cmp = 0;
-	else
-		cmp = -2;
-
-	isl_int_clear(opt);
-	return cmp;
-}
-
-/* Given two sets set1 and set2, check whether
- * for any common value of the parameters and dimensions preceding pos
- * there is a value of dimension pos in set1 that is larger
- * than a value of the same dimension in set2.
- *
- * Return
- *	 1 if there exists such a pair
- *	 0 if there is no such pair, but there is a pair of equal values
- *	-1 otherwise
- *	-2 if some error occurred.
- */
-int isl_set_follows_at(__isl_keep isl_set *set1,
-	__isl_keep isl_set *set2, int pos)
-{
-	int i, j;
-	int follows = -1;
-
-	if (!set1 || !set2)
-		return -2;
-
-	for (i = 0; i < set1->n; ++i)
-		for (j = 0; j < set2->n; ++j) {
-			int f;
-			f = isl_basic_set_follows_at(set1->p[i], set2->p[j], pos);
-			if (f == 1 || f == -2)
-				return f;
-			if (f > follows)
-				follows = f;
-		}
-
-	return follows;
-}
-
-static int isl_basic_map_plain_has_fixed_var(__isl_keep isl_basic_map *bmap,
-	unsigned pos, isl_int *val)
-{
-	int i;
-	int d;
-	unsigned total;
-
-	if (!bmap)
-		return -1;
-	total = isl_basic_map_total_dim(bmap);
-	for (i = 0, d = total-1; i < bmap->n_eq && d+1 > pos; ++i) {
-		for (; d+1 > pos; --d)
-			if (!isl_int_is_zero(bmap->eq[i][1+d]))
-				break;
-		if (d != pos)
-			continue;
-		if (isl_seq_first_non_zero(bmap->eq[i]+1, d) != -1)
-			return 0;
-		if (isl_seq_first_non_zero(bmap->eq[i]+1+d+1, total-d-1) != -1)
-			return 0;
-		if (!isl_int_is_one(bmap->eq[i][1+d]))
-			return 0;
-		if (val)
-			isl_int_neg(*val, bmap->eq[i][0]);
-		return 1;
-	}
-	return 0;
-}
-
-static int isl_map_plain_has_fixed_var(__isl_keep isl_map *map,
-	unsigned pos, isl_int *val)
-{
-	int i;
-	isl_int v;
-	isl_int tmp;
-	int fixed;
-
-	if (!map)
-		return -1;
-	if (map->n == 0)
-		return 0;
-	if (map->n == 1)
-		return isl_basic_map_plain_has_fixed_var(map->p[0], pos, val); 
-	isl_int_init(v);
-	isl_int_init(tmp);
-	fixed = isl_basic_map_plain_has_fixed_var(map->p[0], pos, &v); 
-	for (i = 1; fixed == 1 && i < map->n; ++i) {
-		fixed = isl_basic_map_plain_has_fixed_var(map->p[i], pos, &tmp); 
-		if (fixed == 1 && isl_int_ne(tmp, v))
-			fixed = 0;
-	}
-	if (val)
-		isl_int_set(*val, v);
-	isl_int_clear(tmp);
-	isl_int_clear(v);
-	return fixed;
-}
-
-static int isl_basic_set_plain_has_fixed_var(__isl_keep isl_basic_set *bset,
-	unsigned pos, isl_int *val)
-{
-	return isl_basic_map_plain_has_fixed_var((struct isl_basic_map *)bset,
-						pos, val);
-}
-
-static int isl_set_plain_has_fixed_var(__isl_keep isl_set *set, unsigned pos,
-	isl_int *val)
-{
-	return isl_map_plain_has_fixed_var((struct isl_map *)set, pos, val);
-}
-
-int isl_basic_map_plain_is_fixed(__isl_keep isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned pos, isl_int *val)
-{
-	if (pos >= isl_basic_map_dim(bmap, type))
-		return -1;
-	return isl_basic_map_plain_has_fixed_var(bmap,
-		isl_basic_map_offset(bmap, type) - 1 + pos, val);
-}
-
-int isl_map_plain_is_fixed(__isl_keep isl_map *map,
-	enum isl_dim_type type, unsigned pos, isl_int *val)
-{
-	if (pos >= isl_map_dim(map, type))
-		return -1;
-	return isl_map_plain_has_fixed_var(map,
-		map_offset(map, type) - 1 + pos, val);
-}
-
-int isl_map_fast_is_fixed(__isl_keep isl_map *map,
-	enum isl_dim_type type, unsigned pos, isl_int *val)
-{
-	return isl_map_plain_is_fixed(map, type, pos, val);
-}
-
-/* Check if dimension dim has fixed value and if so and if val is not NULL,
- * then return this fixed value in *val.
- */
-int isl_basic_set_plain_dim_is_fixed(__isl_keep isl_basic_set *bset,
-	unsigned dim, isl_int *val)
-{
-	return isl_basic_set_plain_has_fixed_var(bset,
-					isl_basic_set_n_param(bset) + dim, val);
-}
-
-/* Check if dimension dim has fixed value and if so and if val is not NULL,
- * then return this fixed value in *val.
- */
-int isl_set_plain_dim_is_fixed(__isl_keep isl_set *set,
-	unsigned dim, isl_int *val)
-{
-	return isl_set_plain_has_fixed_var(set, isl_set_n_param(set) + dim, val);
-}
-
-int isl_set_fast_dim_is_fixed(__isl_keep isl_set *set,
-	unsigned dim, isl_int *val)
-{
-	return isl_set_plain_dim_is_fixed(set, dim, val);
-}
-
-/* Check if input variable in has fixed value and if so and if val is not NULL,
- * then return this fixed value in *val.
- */
-int isl_map_plain_input_is_fixed(__isl_keep isl_map *map,
-	unsigned in, isl_int *val)
-{
-	return isl_map_plain_has_fixed_var(map, isl_map_n_param(map) + in, val);
-}
-
-/* Check if dimension dim has an (obvious) fixed lower bound and if so
- * and if val is not NULL, then return this lower bound in *val.
- */
-int isl_basic_set_plain_dim_has_fixed_lower_bound(
-	__isl_keep isl_basic_set *bset, unsigned dim, isl_int *val)
-{
-	int i, i_eq = -1, i_ineq = -1;
-	isl_int *c;
-	unsigned total;
-	unsigned nparam;
-
-	if (!bset)
-		return -1;
-	total = isl_basic_set_total_dim(bset);
-	nparam = isl_basic_set_n_param(bset);
-	for (i = 0; i < bset->n_eq; ++i) {
-		if (isl_int_is_zero(bset->eq[i][1+nparam+dim]))
-			continue;
-		if (i_eq != -1)
-			return 0;
-		i_eq = i;
-	}
-	for (i = 0; i < bset->n_ineq; ++i) {
-		if (!isl_int_is_pos(bset->ineq[i][1+nparam+dim]))
-			continue;
-		if (i_eq != -1 || i_ineq != -1)
-			return 0;
-		i_ineq = i;
-	}
-	if (i_eq == -1 && i_ineq == -1)
-		return 0;
-	c = i_eq != -1 ? bset->eq[i_eq] : bset->ineq[i_ineq];
-	/* The coefficient should always be one due to normalization. */
-	if (!isl_int_is_one(c[1+nparam+dim]))
-		return 0;
-	if (isl_seq_first_non_zero(c+1, nparam+dim) != -1)
-		return 0;
-	if (isl_seq_first_non_zero(c+1+nparam+dim+1,
-					total - nparam - dim - 1) != -1)
-		return 0;
-	if (val)
-		isl_int_neg(*val, c[0]);
-	return 1;
-}
-
-int isl_set_plain_dim_has_fixed_lower_bound(__isl_keep isl_set *set,
-	unsigned dim, isl_int *val)
-{
-	int i;
-	isl_int v;
-	isl_int tmp;
-	int fixed;
-
-	if (!set)
-		return -1;
-	if (set->n == 0)
-		return 0;
-	if (set->n == 1)
-		return isl_basic_set_plain_dim_has_fixed_lower_bound(set->p[0],
-								dim, val);
-	isl_int_init(v);
-	isl_int_init(tmp);
-	fixed = isl_basic_set_plain_dim_has_fixed_lower_bound(set->p[0],
-								dim, &v);
-	for (i = 1; fixed == 1 && i < set->n; ++i) {
-		fixed = isl_basic_set_plain_dim_has_fixed_lower_bound(set->p[i],
-								dim, &tmp);
-		if (fixed == 1 && isl_int_ne(tmp, v))
-			fixed = 0;
-	}
-	if (val)
-		isl_int_set(*val, v);
-	isl_int_clear(tmp);
-	isl_int_clear(v);
-	return fixed;
-}
-
-struct constraint {
-	unsigned	size;
-	isl_int		*c;
-};
-
-/* uset_gist depends on constraints without existentially quantified
- * variables sorting first.
- */
-static int qsort_constraint_cmp(const void *p1, const void *p2)
-{
-	const struct constraint *c1 = (const struct constraint *)p1;
-	const struct constraint *c2 = (const struct constraint *)p2;
-	int l1, l2;
-	unsigned size = isl_min(c1->size, c2->size);
-
-	l1 = isl_seq_last_non_zero(c1->c, size);
-	l2 = isl_seq_last_non_zero(c2->c, size);
-
-	if (l1 != l2)
-		return l1 - l2;
-
-	return isl_seq_cmp(c1->c, c2->c, size);
-}
-
-static struct isl_basic_map *isl_basic_map_sort_constraints(
-	struct isl_basic_map *bmap)
-{
-	int i;
-	struct constraint *c;
-	unsigned total;
-
-	if (!bmap)
-		return NULL;
-	total = isl_basic_map_total_dim(bmap);
-	c = isl_alloc_array(bmap->ctx, struct constraint, bmap->n_ineq);
-	if (!c)
-		goto error;
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		c[i].size = total;
-		c[i].c = bmap->ineq[i];
-	}
-	qsort(c, bmap->n_ineq, sizeof(struct constraint), qsort_constraint_cmp);
-	for (i = 0; i < bmap->n_ineq; ++i)
-		bmap->ineq[i] = c[i].c;
-	free(c);
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_sort_constraints(
-	__isl_take isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)isl_basic_map_sort_constraints(
-						(struct isl_basic_map *)bset);
-}
-
-struct isl_basic_map *isl_basic_map_normalize(struct isl_basic_map *bmap)
-{
-	if (!bmap)
-		return NULL;
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_NORMALIZED))
-		return bmap;
-	bmap = isl_basic_map_remove_redundancies(bmap);
-	bmap = isl_basic_map_sort_constraints(bmap);
-	ISL_F_SET(bmap, ISL_BASIC_MAP_NORMALIZED);
-	return bmap;
-}
-
-struct isl_basic_set *isl_basic_set_normalize(struct isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)isl_basic_map_normalize(
-						(struct isl_basic_map *)bset);
-}
-
-int isl_basic_map_plain_cmp(const __isl_keep isl_basic_map *bmap1,
-	const __isl_keep isl_basic_map *bmap2)
-{
-	int i, cmp;
-	unsigned total;
-
-	if (bmap1 == bmap2)
-		return 0;
-	if (ISL_F_ISSET(bmap1, ISL_BASIC_MAP_RATIONAL) !=
-	    ISL_F_ISSET(bmap2, ISL_BASIC_MAP_RATIONAL))
-		return ISL_F_ISSET(bmap1, ISL_BASIC_MAP_RATIONAL) ? -1 : 1;
-	if (isl_basic_map_n_param(bmap1) != isl_basic_map_n_param(bmap2))
-		return isl_basic_map_n_param(bmap1) - isl_basic_map_n_param(bmap2);
-	if (isl_basic_map_n_in(bmap1) != isl_basic_map_n_in(bmap2))
-		return isl_basic_map_n_out(bmap1) - isl_basic_map_n_out(bmap2);
-	if (isl_basic_map_n_out(bmap1) != isl_basic_map_n_out(bmap2))
-		return isl_basic_map_n_out(bmap1) - isl_basic_map_n_out(bmap2);
-	if (ISL_F_ISSET(bmap1, ISL_BASIC_MAP_EMPTY) &&
-	    ISL_F_ISSET(bmap2, ISL_BASIC_MAP_EMPTY))
-		return 0;
-	if (ISL_F_ISSET(bmap1, ISL_BASIC_MAP_EMPTY))
-		return 1;
-	if (ISL_F_ISSET(bmap2, ISL_BASIC_MAP_EMPTY))
-		return -1;
-	if (bmap1->n_eq != bmap2->n_eq)
-		return bmap1->n_eq - bmap2->n_eq;
-	if (bmap1->n_ineq != bmap2->n_ineq)
-		return bmap1->n_ineq - bmap2->n_ineq;
-	if (bmap1->n_div != bmap2->n_div)
-		return bmap1->n_div - bmap2->n_div;
-	total = isl_basic_map_total_dim(bmap1);
-	for (i = 0; i < bmap1->n_eq; ++i) {
-		cmp = isl_seq_cmp(bmap1->eq[i], bmap2->eq[i], 1+total);
-		if (cmp)
-			return cmp;
-	}
-	for (i = 0; i < bmap1->n_ineq; ++i) {
-		cmp = isl_seq_cmp(bmap1->ineq[i], bmap2->ineq[i], 1+total);
-		if (cmp)
-			return cmp;
-	}
-	for (i = 0; i < bmap1->n_div; ++i) {
-		cmp = isl_seq_cmp(bmap1->div[i], bmap2->div[i], 1+1+total);
-		if (cmp)
-			return cmp;
-	}
-	return 0;
-}
-
-int isl_basic_map_plain_is_equal(__isl_keep isl_basic_map *bmap1,
-	__isl_keep isl_basic_map *bmap2)
-{
-	return isl_basic_map_plain_cmp(bmap1, bmap2) == 0;
-}
-
-int isl_basic_set_plain_is_equal(__isl_keep isl_basic_set *bset1,
-	__isl_keep isl_basic_set *bset2)
-{
-	return isl_basic_map_plain_is_equal((isl_basic_map *)bset1,
-					    (isl_basic_map *)bset2);
-}
-
-static int qsort_bmap_cmp(const void *p1, const void *p2)
-{
-	const struct isl_basic_map *bmap1 = *(const struct isl_basic_map **)p1;
-	const struct isl_basic_map *bmap2 = *(const struct isl_basic_map **)p2;
-
-	return isl_basic_map_plain_cmp(bmap1, bmap2);
-}
-
-/* We normalize in place, but if anything goes wrong we need
- * to return NULL, so we need to make sure we don't change the
- * meaning of any possible other copies of map.
- */
-struct isl_map *isl_map_normalize(struct isl_map *map)
-{
-	int i, j;
-	struct isl_basic_map *bmap;
-
-	if (!map)
-		return NULL;
-	if (ISL_F_ISSET(map, ISL_MAP_NORMALIZED))
-		return map;
-	for (i = 0; i < map->n; ++i) {
-		bmap = isl_basic_map_normalize(isl_basic_map_copy(map->p[i]));
-		if (!bmap)
-			goto error;
-		isl_basic_map_free(map->p[i]);
-		map->p[i] = bmap;
-	}
-	qsort(map->p, map->n, sizeof(struct isl_basic_map *), qsort_bmap_cmp);
-	ISL_F_SET(map, ISL_MAP_NORMALIZED);
-	map = isl_map_remove_empty_parts(map);
-	if (!map)
-		return NULL;
-	for (i = map->n - 1; i >= 1; --i) {
-		if (!isl_basic_map_plain_is_equal(map->p[i-1], map->p[i]))
-			continue;
-		isl_basic_map_free(map->p[i-1]);
-		for (j = i; j < map->n; ++j)
-			map->p[j-1] = map->p[j];
-		map->n--;
-	}
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-
-}
-
-struct isl_set *isl_set_normalize(struct isl_set *set)
-{
-	return (struct isl_set *)isl_map_normalize((struct isl_map *)set);
-}
-
-int isl_map_plain_is_equal(__isl_keep isl_map *map1, __isl_keep isl_map *map2)
-{
-	int i;
-	int equal;
-
-	if (!map1 || !map2)
-		return -1;
-
-	if (map1 == map2)
-		return 1;
-	if (!isl_dim_equal(map1->dim, map2->dim))
-		return 0;
-
-	map1 = isl_map_copy(map1);
-	map2 = isl_map_copy(map2);
-	map1 = isl_map_normalize(map1);
-	map2 = isl_map_normalize(map2);
-	if (!map1 || !map2)
-		goto error;
-	equal = map1->n == map2->n;
-	for (i = 0; equal && i < map1->n; ++i) {
-		equal = isl_basic_map_plain_is_equal(map1->p[i], map2->p[i]);
-		if (equal < 0)
-			goto error;
-	}
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return equal;
-error:
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return -1;
-}
-
-int isl_map_fast_is_equal(__isl_keep isl_map *map1, __isl_keep isl_map *map2)
-{
-	return isl_map_plain_is_equal(map1, map2);
-}
-
-int isl_set_plain_is_equal(__isl_keep isl_set *set1, __isl_keep isl_set *set2)
-{
-	return isl_map_plain_is_equal((struct isl_map *)set1,
-						(struct isl_map *)set2);
-}
-
-int isl_set_fast_is_equal(__isl_keep isl_set *set1, __isl_keep isl_set *set2)
-{
-	return isl_set_plain_is_equal(set1, set2);
-}
-
-/* Return an interval that ranges from min to max (inclusive)
- */
-struct isl_basic_set *isl_basic_set_interval(struct isl_ctx *ctx,
-	isl_int min, isl_int max)
-{
-	int k;
-	struct isl_basic_set *bset = NULL;
-
-	bset = isl_basic_set_alloc(ctx, 0, 1, 0, 0, 2);
-	if (!bset)
-		goto error;
-
-	k = isl_basic_set_alloc_inequality(bset);
-	if (k < 0)
-		goto error;
-	isl_int_set_si(bset->ineq[k][1], 1);
-	isl_int_neg(bset->ineq[k][0], min);
-
-	k = isl_basic_set_alloc_inequality(bset);
-	if (k < 0)
-		goto error;
-	isl_int_set_si(bset->ineq[k][1], -1);
-	isl_int_set(bset->ineq[k][0], max);
-
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Return the Cartesian product of the basic sets in list (in the given order).
- */
-__isl_give isl_basic_set *isl_basic_set_list_product(
-	__isl_take struct isl_basic_set_list *list)
-{
-	int i;
-	unsigned dim;
-	unsigned nparam;
-	unsigned extra;
-	unsigned n_eq;
-	unsigned n_ineq;
-	struct isl_basic_set *product = NULL;
-
-	if (!list)
-		goto error;
-	isl_assert(list->ctx, list->n > 0, goto error);
-	isl_assert(list->ctx, list->p[0], goto error);
-	nparam = isl_basic_set_n_param(list->p[0]);
-	dim = isl_basic_set_n_dim(list->p[0]);
-	extra = list->p[0]->n_div;
-	n_eq = list->p[0]->n_eq;
-	n_ineq = list->p[0]->n_ineq;
-	for (i = 1; i < list->n; ++i) {
-		isl_assert(list->ctx, list->p[i], goto error);
-		isl_assert(list->ctx,
-		    nparam == isl_basic_set_n_param(list->p[i]), goto error);
-		dim += isl_basic_set_n_dim(list->p[i]);
-		extra += list->p[i]->n_div;
-		n_eq += list->p[i]->n_eq;
-		n_ineq += list->p[i]->n_ineq;
-	}
-	product = isl_basic_set_alloc(list->ctx, nparam, dim, extra,
-					n_eq, n_ineq);
-	if (!product)
-		goto error;
-	dim = 0;
-	for (i = 0; i < list->n; ++i) {
-		isl_basic_set_add_constraints(product,
-					isl_basic_set_copy(list->p[i]), dim);
-		dim += isl_basic_set_n_dim(list->p[i]);
-	}
-	isl_basic_set_list_free(list);
-	return product;
-error:
-	isl_basic_set_free(product);
-	isl_basic_set_list_free(list);
-	return NULL;
-}
-
-struct isl_basic_map *isl_basic_map_product(
-		struct isl_basic_map *bmap1, struct isl_basic_map *bmap2)
-{
-	struct isl_dim *dim_result = NULL;
-	struct isl_basic_map *bmap;
-	unsigned in1, in2, out1, out2, nparam, total, pos;
-	struct isl_dim_map *dim_map1, *dim_map2;
-
-	if (!bmap1 || !bmap2)
-		goto error;
-
-	isl_assert(bmap1->ctx, isl_dim_match(bmap1->dim, isl_dim_param,
-				     bmap2->dim, isl_dim_param), goto error);
-	dim_result = isl_dim_product(isl_dim_copy(bmap1->dim),
-						   isl_dim_copy(bmap2->dim));
-
-	in1 = isl_basic_map_n_in(bmap1);
-	in2 = isl_basic_map_n_in(bmap2);
-	out1 = isl_basic_map_n_out(bmap1);
-	out2 = isl_basic_map_n_out(bmap2);
-	nparam = isl_basic_map_n_param(bmap1);
-
-	total = nparam + in1 + in2 + out1 + out2 + bmap1->n_div + bmap2->n_div;
-	dim_map1 = isl_dim_map_alloc(bmap1->ctx, total);
-	dim_map2 = isl_dim_map_alloc(bmap1->ctx, total);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_param, pos = 0);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_param, pos = 0);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_in, pos += nparam);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_in, pos += in1);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_out, pos += in2);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_out, pos += out1);
-	isl_dim_map_div(dim_map1, bmap1, pos += out2);
-	isl_dim_map_div(dim_map2, bmap2, pos += bmap1->n_div);
-
-	bmap = isl_basic_map_alloc_dim(dim_result,
-			bmap1->n_div + bmap2->n_div,
-			bmap1->n_eq + bmap2->n_eq,
-			bmap1->n_ineq + bmap2->n_ineq);
-	bmap = isl_basic_map_add_constraints_dim_map(bmap, bmap1, dim_map1);
-	bmap = isl_basic_map_add_constraints_dim_map(bmap, bmap2, dim_map2);
-	bmap = isl_basic_map_simplify(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap1);
-	isl_basic_map_free(bmap2);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_flat_product(
-	__isl_take isl_basic_map *bmap1, __isl_take isl_basic_map *bmap2)
-{
-	isl_basic_map *prod;
-
-	prod = isl_basic_map_product(bmap1, bmap2);
-	prod = isl_basic_map_flatten(prod);
-	return prod;
-}
-
-__isl_give isl_basic_set *isl_basic_set_flat_product(
-	__isl_take isl_basic_set *bset1, __isl_take isl_basic_set *bset2)
-{
-	return isl_basic_map_flat_product(bset1, bset2);
-}
-
-__isl_give isl_basic_map *isl_basic_map_range_product(
-	__isl_take isl_basic_map *bmap1, __isl_take isl_basic_map *bmap2)
-{
-	isl_dim *dim_result = NULL;
-	isl_basic_map *bmap;
-	unsigned in, out1, out2, nparam, total, pos;
-	struct isl_dim_map *dim_map1, *dim_map2;
-
-	if (!bmap1 || !bmap2)
-		goto error;
-
-	dim_result = isl_dim_range_product(isl_dim_copy(bmap1->dim),
-					   isl_dim_copy(bmap2->dim));
-
-	in = isl_basic_map_dim(bmap1, isl_dim_in);
-	out1 = isl_basic_map_n_out(bmap1);
-	out2 = isl_basic_map_n_out(bmap2);
-	nparam = isl_basic_map_n_param(bmap1);
-
-	total = nparam + in + out1 + out2 + bmap1->n_div + bmap2->n_div;
-	dim_map1 = isl_dim_map_alloc(bmap1->ctx, total);
-	dim_map2 = isl_dim_map_alloc(bmap1->ctx, total);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_param, pos = 0);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_param, pos = 0);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_in, pos += nparam);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_in, pos);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_out, pos += in);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_out, pos += out1);
-	isl_dim_map_div(dim_map1, bmap1, pos += out2);
-	isl_dim_map_div(dim_map2, bmap2, pos += bmap1->n_div);
-
-	bmap = isl_basic_map_alloc_dim(dim_result,
-			bmap1->n_div + bmap2->n_div,
-			bmap1->n_eq + bmap2->n_eq,
-			bmap1->n_ineq + bmap2->n_ineq);
-	bmap = isl_basic_map_add_constraints_dim_map(bmap, bmap1, dim_map1);
-	bmap = isl_basic_map_add_constraints_dim_map(bmap, bmap2, dim_map2);
-	bmap = isl_basic_map_simplify(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap1);
-	isl_basic_map_free(bmap2);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_flat_range_product(
-	__isl_take isl_basic_map *bmap1, __isl_take isl_basic_map *bmap2)
-{
-	isl_basic_map *prod;
-
-	prod = isl_basic_map_range_product(bmap1, bmap2);
-	prod = isl_basic_map_flatten_range(prod);
-	return prod;
-}
-
-static __isl_give isl_map *map_product(__isl_take isl_map *map1,
-	__isl_take isl_map *map2,
-	__isl_give isl_dim *(*dim_product)(__isl_take isl_dim *left,
-					   __isl_take isl_dim *right),
-	__isl_give isl_basic_map *(*basic_map_product)(
-		__isl_take isl_basic_map *left, __isl_take isl_basic_map *right))
-{
-	unsigned flags = 0;
-	struct isl_map *result;
-	int i, j;
-
-	if (!map1 || !map2)
-		goto error;
-
-	isl_assert(map1->ctx, isl_dim_match(map1->dim, isl_dim_param,
-					 map2->dim, isl_dim_param), goto error);
-
-	if (ISL_F_ISSET(map1, ISL_MAP_DISJOINT) &&
-	    ISL_F_ISSET(map2, ISL_MAP_DISJOINT))
-		ISL_FL_SET(flags, ISL_MAP_DISJOINT);
-
-	result = isl_map_alloc_dim(dim_product(isl_dim_copy(map1->dim),
-					       isl_dim_copy(map2->dim)),
-				map1->n * map2->n, flags);
-	if (!result)
-		goto error;
-	for (i = 0; i < map1->n; ++i)
-		for (j = 0; j < map2->n; ++j) {
-			struct isl_basic_map *part;
-			part = basic_map_product(isl_basic_map_copy(map1->p[i]),
-						 isl_basic_map_copy(map2->p[j]));
-			if (isl_basic_map_is_empty(part))
-				isl_basic_map_free(part);
-			else
-				result = isl_map_add_basic_map(result, part);
-			if (!result)
-				goto error;
-		}
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return result;
-error:
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return NULL;
-}
-
-/* Given two maps A -> B and C -> D, construct a map [A -> C] -> [B -> D]
- */
-struct isl_map *isl_map_product(struct isl_map *map1, struct isl_map *map2)
-{
-	return map_product(map1, map2, &isl_dim_product, &isl_basic_map_product);
-}
-
-/* Given two maps A -> B and C -> D, construct a map (A, C) -> (B, D)
- */
-__isl_give isl_map *isl_map_flat_product(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	isl_map *prod;
-
-	prod = isl_map_product(map1, map2);
-	prod = isl_map_flatten(prod);
-	return prod;
-}
-
-/* Given two set A and B, construct its Cartesian product A x B.
- */
-struct isl_set *isl_set_product(struct isl_set *set1, struct isl_set *set2)
-{
-	return (struct isl_set *)isl_map_product((struct isl_map *)set1,
-						 (struct isl_map *)set2);
-}
-
-__isl_give isl_set *isl_set_flat_product(__isl_take isl_set *set1,
-	__isl_take isl_set *set2)
-{
-	return (isl_set *)isl_map_flat_product((isl_map *)set1, (isl_map *)set2);
-}
-
-/* Given two maps A -> B and C -> D, construct a map (A * C) -> [B -> D]
- */
-__isl_give isl_map *isl_map_range_product(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	return map_product(map1, map2, &isl_dim_range_product,
-				&isl_basic_map_range_product);
-}
-
-/* Given two maps A -> B and C -> D, construct a map (A * C) -> (B, D)
- */
-__isl_give isl_map *isl_map_flat_range_product(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	isl_map *prod;
-
-	prod = isl_map_range_product(map1, map2);
-	prod = isl_map_flatten_range(prod);
-	return prod;
-}
-
-uint32_t isl_basic_map_get_hash(__isl_keep isl_basic_map *bmap)
-{
-	int i;
-	uint32_t hash = isl_hash_init();
-	unsigned total;
-
-	if (!bmap)
-		return 0;
-	bmap = isl_basic_map_copy(bmap);
-	bmap = isl_basic_map_normalize(bmap);
-	if (!bmap)
-		return 0;
-	total = isl_basic_map_total_dim(bmap);
-	isl_hash_byte(hash, bmap->n_eq & 0xFF);
-	for (i = 0; i < bmap->n_eq; ++i) {
-		uint32_t c_hash;
-		c_hash = isl_seq_get_hash(bmap->eq[i], 1 + total);
-		isl_hash_hash(hash, c_hash);
-	}
-	isl_hash_byte(hash, bmap->n_ineq & 0xFF);
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		uint32_t c_hash;
-		c_hash = isl_seq_get_hash(bmap->ineq[i], 1 + total);
-		isl_hash_hash(hash, c_hash);
-	}
-	isl_hash_byte(hash, bmap->n_div & 0xFF);
-	for (i = 0; i < bmap->n_div; ++i) {
-		uint32_t c_hash;
-		if (isl_int_is_zero(bmap->div[i][0]))
-			continue;
-		isl_hash_byte(hash, i & 0xFF);
-		c_hash = isl_seq_get_hash(bmap->div[i], 1 + 1 + total);
-		isl_hash_hash(hash, c_hash);
-	}
-	isl_basic_map_free(bmap);
-	return hash;
-}
-
-uint32_t isl_basic_set_get_hash(__isl_keep isl_basic_set *bset)
-{
-	return isl_basic_map_get_hash((isl_basic_map *)bset);
-}
-
-uint32_t isl_map_get_hash(__isl_keep isl_map *map)
-{
-	int i;
-	uint32_t hash;
-
-	if (!map)
-		return 0;
-	map = isl_map_copy(map);
-	map = isl_map_normalize(map);
-	if (!map)
-		return 0;
-
-	hash = isl_hash_init();
-	for (i = 0; i < map->n; ++i) {
-		uint32_t bmap_hash;
-		bmap_hash = isl_basic_map_get_hash(map->p[i]);
-		isl_hash_hash(hash, bmap_hash);
-	}
-		
-	isl_map_free(map);
-
-	return hash;
-}
-
-uint32_t isl_set_get_hash(__isl_keep isl_set *set)
-{
-	return isl_map_get_hash((isl_map *)set);
-}
-
-/* Check if the value for dimension dim is completely determined
- * by the values of the other parameters and variables.
- * That is, check if dimension dim is involved in an equality.
- */
-int isl_basic_set_dim_is_unique(struct isl_basic_set *bset, unsigned dim)
-{
-	int i;
-	unsigned nparam;
-
-	if (!bset)
-		return -1;
-	nparam = isl_basic_set_n_param(bset);
-	for (i = 0; i < bset->n_eq; ++i)
-		if (!isl_int_is_zero(bset->eq[i][1 + nparam + dim]))
-			return 1;
-	return 0;
-}
-
-/* Check if the value for dimension dim is completely determined
- * by the values of the other parameters and variables.
- * That is, check if dimension dim is involved in an equality
- * for each of the subsets.
- */
-int isl_set_dim_is_unique(struct isl_set *set, unsigned dim)
-{
-	int i;
-
-	if (!set)
-		return -1;
-	for (i = 0; i < set->n; ++i) {
-		int unique;
-		unique = isl_basic_set_dim_is_unique(set->p[i], dim);
-		if (unique != 1)
-			return unique;
-	}
-	return 1;
-}
-
-int isl_set_n_basic_set(__isl_keep isl_set *set)
-{
-	return set ? set->n : 0;
-}
-
-int isl_map_foreach_basic_map(__isl_keep isl_map *map,
-	int (*fn)(__isl_take isl_basic_map *bmap, void *user), void *user)
-{
-	int i;
-
-	if (!map)
-		return -1;
-
-	for (i = 0; i < map->n; ++i)
-		if (fn(isl_basic_map_copy(map->p[i]), user) < 0)
-			return -1;
-
-	return 0;
-}
-
-int isl_set_foreach_basic_set(__isl_keep isl_set *set,
-	int (*fn)(__isl_take isl_basic_set *bset, void *user), void *user)
-{
-	int i;
-
-	if (!set)
-		return -1;
-
-	for (i = 0; i < set->n; ++i)
-		if (fn(isl_basic_set_copy(set->p[i]), user) < 0)
-			return -1;
-
-	return 0;
-}
-
-__isl_give isl_basic_set *isl_basic_set_lift(__isl_take isl_basic_set *bset)
-{
-	struct isl_dim *dim;
-
-	if (!bset)
-		return NULL;
-
-	bset = isl_basic_set_cow(bset);
-	if (!bset)
-		return NULL;
-
-	dim = isl_basic_set_get_dim(bset);
-	dim = isl_dim_lift(dim, bset->n_div);
-	if (!dim)
-		goto error;
-	isl_dim_free(bset->dim);
-	bset->dim = dim;
-	bset->extra -= bset->n_div;
-	bset->n_div = 0;
-
-	bset = isl_basic_set_finalize(bset);
-
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_lift(__isl_take isl_set *set)
-{
-	int i;
-	struct isl_dim *dim;
-	unsigned n_div;
-
-	set = isl_set_align_divs(set);
-
-	if (!set)
-		return NULL;
-
-	set = isl_set_cow(set);
-	if (!set)
-		return NULL;
-
-	n_div = set->p[0]->n_div;
-	dim = isl_set_get_dim(set);
-	dim = isl_dim_lift(dim, n_div);
-	if (!dim)
-		goto error;
-	isl_dim_free(set->dim);
-	set->dim = dim;
-
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_basic_set_lift(set->p[i]);
-		if (!set->p[i])
-			goto error;
-	}
-
-	return set;
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-__isl_give isl_map *isl_set_lifting(__isl_take isl_set *set)
-{
-	struct isl_dim *dim;
-	struct isl_basic_map *bmap;
-	unsigned n_set;
-	unsigned n_div;
-	unsigned n_param;
-	unsigned total;
-	int i, k, l;
-
-	set = isl_set_align_divs(set);
-
-	if (!set)
-		return NULL;
-
-	dim = isl_set_get_dim(set);
-	if (set->n == 0 || set->p[0]->n_div == 0) {
-		isl_set_free(set);
-		return isl_map_identity(isl_dim_map_from_set(dim));
-	}
-
-	n_div = set->p[0]->n_div;
-	dim = isl_dim_map_from_set(dim);
-	n_param = isl_dim_size(dim, isl_dim_param);
-	n_set = isl_dim_size(dim, isl_dim_in);
-	dim = isl_dim_extend(dim, n_param, n_set, n_set + n_div);
-	bmap = isl_basic_map_alloc_dim(dim, 0, n_set, 2 * n_div);
-	for (i = 0; i < n_set; ++i)
-		bmap = var_equal(bmap, i);
-
-	total = n_param + n_set + n_set + n_div;
-	for (i = 0; i < n_div; ++i) {
-		k = isl_basic_map_alloc_inequality(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(bmap->ineq[k], set->p[0]->div[i]+1, 1+n_param);
-		isl_seq_clr(bmap->ineq[k]+1+n_param, n_set);
-		isl_seq_cpy(bmap->ineq[k]+1+n_param+n_set,
-			    set->p[0]->div[i]+1+1+n_param, n_set + n_div);
-		isl_int_neg(bmap->ineq[k][1+n_param+n_set+n_set+i],
-			    set->p[0]->div[i][0]);
-
-		l = isl_basic_map_alloc_inequality(bmap);
-		if (l < 0)
-			goto error;
-		isl_seq_neg(bmap->ineq[l], bmap->ineq[k], 1 + total);
-		isl_int_add(bmap->ineq[l][0], bmap->ineq[l][0],
-			    set->p[0]->div[i][0]);
-		isl_int_sub_ui(bmap->ineq[l][0], bmap->ineq[l][0], 1);
-	}
-
-	isl_set_free(set);
-	bmap = isl_basic_map_simplify(bmap);
-	bmap = isl_basic_map_finalize(bmap);
-	return isl_map_from_basic_map(bmap);
-error:
-	isl_set_free(set);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-int isl_basic_set_size(__isl_keep isl_basic_set *bset)
-{
-	unsigned dim;
-	int size = 0;
-
-	if (!bset)
-		return -1;
-
-	dim = isl_basic_set_total_dim(bset);
-	size += bset->n_eq * (1 + dim);
-	size += bset->n_ineq * (1 + dim);
-	size += bset->n_div * (2 + dim);
-
-	return size;
-}
-
-int isl_set_size(__isl_keep isl_set *set)
-{
-	int i;
-	int size = 0;
-
-	if (!set)
-		return -1;
-
-	for (i = 0; i < set->n; ++i)
-		size += isl_basic_set_size(set->p[i]);
-
-	return size;
-}
-
-int isl_basic_map_dim_is_bounded(__isl_keep isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned pos)
-{
-	int i;
-	int lower, upper;
-
-	if (!bmap)
-		return -1;
-
-	isl_assert(bmap->ctx, pos < isl_basic_map_dim(bmap, type), return -1);
-
-	pos += isl_basic_map_offset(bmap, type);
-
-	for (i = 0; i < bmap->n_eq; ++i)
-		if (!isl_int_is_zero(bmap->eq[i][pos]))
-			return 1;
-
-	lower = upper = 0;
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		int sgn = isl_int_sgn(bmap->ineq[i][pos]);
-		if (sgn > 0)
-			lower = 1;
-		if (sgn < 0)
-			upper = 1;
-	}
-
-	return lower && upper;
-}
-
-int isl_map_dim_is_bounded(__isl_keep isl_map *map,
-	enum isl_dim_type type, unsigned pos)
-{
-	int i;
-
-	if (!map)
-		return -1;
-
-	for (i = 0; i < map->n; ++i) {
-		int bounded;
-		bounded = isl_basic_map_dim_is_bounded(map->p[i], type, pos);
-		if (bounded < 0 || !bounded)
-			return bounded;
-	}
-
-	return 1;
-}
-
-/* Return 1 if the specified dim is involved in both an upper bound
- * and a lower bound.
- */
-int isl_set_dim_is_bounded(__isl_keep isl_set *set,
-	enum isl_dim_type type, unsigned pos)
-{
-	return isl_map_dim_is_bounded((isl_map *)set, type, pos);
-}
-
-/* For each of the "n" variables starting at "first", determine
- * the sign of the variable and put the results in the first "n"
- * elements of the array "signs".
- * Sign
- *	1 means that the variable is non-negative
- *	-1 means that the variable is non-positive
- *	0 means the variable attains both positive and negative values.
- */
-int isl_basic_set_vars_get_sign(__isl_keep isl_basic_set *bset,
-	unsigned first, unsigned n, int *signs)
-{
-	isl_vec *bound = NULL;
-	struct isl_tab *tab = NULL;
-	struct isl_tab_undo *snap;
-	int i;
-
-	if (!bset || !signs)
-		return -1;
-
-	bound = isl_vec_alloc(bset->ctx, 1 + isl_basic_set_total_dim(bset));
-	tab = isl_tab_from_basic_set(bset);
-	if (!bound || !tab)
-		goto error;
-
-	isl_seq_clr(bound->el, bound->size);
-	isl_int_set_si(bound->el[0], -1);
-
-	snap = isl_tab_snap(tab);
-	for (i = 0; i < n; ++i) {
-		int empty;
-
-		isl_int_set_si(bound->el[1 + first + i], -1);
-		if (isl_tab_add_ineq(tab, bound->el) < 0)
-			goto error;
-		empty = tab->empty;
-		isl_int_set_si(bound->el[1 + first + i], 0);
-		if (isl_tab_rollback(tab, snap) < 0)
-			goto error;
-
-		if (empty) {
-			signs[i] = 1;
-			continue;
-		}
-
-		isl_int_set_si(bound->el[1 + first + i], 1);
-		if (isl_tab_add_ineq(tab, bound->el) < 0)
-			goto error;
-		empty = tab->empty;
-		isl_int_set_si(bound->el[1 + first + i], 0);
-		if (isl_tab_rollback(tab, snap) < 0)
-			goto error;
-
-		signs[i] = empty ? -1 : 0;
-	}
-
-	isl_tab_free(tab);
-	isl_vec_free(bound);
-	return 0;
-error:
-	isl_tab_free(tab);
-	isl_vec_free(bound);
-	return -1;
-}
-
-int isl_basic_set_dims_get_sign(__isl_keep isl_basic_set *bset,
-	enum isl_dim_type type, unsigned first, unsigned n, int *signs)
-{
-	if (!bset || !signs)
-		return -1;
-	isl_assert(bset->ctx, first + n <= isl_basic_set_dim(bset, type),
-		return -1);
-
-	first += pos(bset->dim, type) - 1;
-	return isl_basic_set_vars_get_sign(bset, first, n, signs);
-}
-
-/* Check if the given basic map is obviously single-valued.
- * In particular, for each output dimension, check that there is
- * an equality that defines the output dimension in terms of
- * earlier dimensions.
- */
-int isl_basic_map_plain_is_single_valued(__isl_keep isl_basic_map *bmap)
-{
-	int i, j;
-	unsigned total;
-	unsigned n_out;
-	unsigned o_out;
-
-	if (!bmap)
-		return -1;
-
-	total = 1 + isl_basic_map_total_dim(bmap);
-	n_out = isl_basic_map_dim(bmap, isl_dim_out);
-	o_out = isl_basic_map_offset(bmap, isl_dim_out);
-
-	for (i = 0; i < n_out; ++i) {
-		for (j = 0; j < bmap->n_eq; ++j) {
-			if (isl_int_is_zero(bmap->eq[j][o_out + i]))
-				continue;
-			if (isl_seq_first_non_zero(bmap->eq[j] + o_out + i + 1,
-						total - (o_out + i + 1)) == -1)
-				break;
-		}
-		if (j >= bmap->n_eq)
-			return 0;
-	}
-
-	return 1;
-}
-
-/* Check if the given map is obviously single-valued.
- */
-int isl_map_plain_is_single_valued(__isl_keep isl_map *map)
-{
-	if (!map)
-		return -1;
-	if (map->n == 0)
-		return 1;
-	if (map->n >= 2)
-		return 0;
-
-	return isl_basic_map_plain_is_single_valued(map->p[0]);
-}
-
-/* Check if the given map is single-valued.
- * We simply compute
- *
- *	M \circ M^-1
- *
- * and check if the result is a subset of the identity mapping.
- */
-int isl_map_is_single_valued(__isl_keep isl_map *map)
-{
-	isl_dim *dim;
-	isl_map *test;
-	isl_map *id;
-	int sv;
-
-	sv = isl_map_plain_is_single_valued(map);
-	if (sv < 0 || sv)
-		return sv;
-
-	test = isl_map_reverse(isl_map_copy(map));
-	test = isl_map_apply_range(test, isl_map_copy(map));
-
-	dim = isl_dim_map_from_set(isl_dim_range(isl_map_get_dim(map)));
-	id = isl_map_identity(dim);
-
-	sv = isl_map_is_subset(test, id);
-
-	isl_map_free(test);
-	isl_map_free(id);
-
-	return sv;
-}
-
-int isl_map_is_injective(__isl_keep isl_map *map)
-{
-	int in;
-
-	map = isl_map_copy(map);
-	map = isl_map_reverse(map);
-	in = isl_map_is_single_valued(map);
-	isl_map_free(map);
-
-	return in;
-}
-
-/* Check if the given map is obviously injective.
- */
-int isl_map_plain_is_injective(__isl_keep isl_map *map)
-{
-	int in;
-
-	map = isl_map_copy(map);
-	map = isl_map_reverse(map);
-	in = isl_map_plain_is_single_valued(map);
-	isl_map_free(map);
-
-	return in;
-}
-
-int isl_map_is_bijective(__isl_keep isl_map *map)
-{
-	int sv;
-
-	sv = isl_map_is_single_valued(map);
-	if (sv < 0 || !sv)
-		return sv;
-
-	return isl_map_is_injective(map);
-}
-
-int isl_set_is_singleton(__isl_keep isl_set *set)
-{
-	return isl_map_is_single_valued((isl_map *)set);
-}
-
-int isl_map_is_translation(__isl_keep isl_map *map)
-{
-	int ok;
-	isl_set *delta;
-
-	delta = isl_map_deltas(isl_map_copy(map));
-	ok = isl_set_is_singleton(delta);
-	isl_set_free(delta);
-
-	return ok;
-}
-
-static int unique(isl_int *p, unsigned pos, unsigned len)
-{
-	if (isl_seq_first_non_zero(p, pos) != -1)
-		return 0;
-	if (isl_seq_first_non_zero(p + pos + 1, len - pos - 1) != -1)
-		return 0;
-	return 1;
-}
-
-int isl_basic_set_is_box(__isl_keep isl_basic_set *bset)
-{
-	int i, j;
-	unsigned nvar;
-	unsigned ovar;
-
-	if (!bset)
-		return -1;
-
-	if (isl_basic_set_dim(bset, isl_dim_div) != 0)
-		return 0;
-
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-	ovar = isl_dim_offset(bset->dim, isl_dim_set);
-	for (j = 0; j < nvar; ++j) {
-		int lower = 0, upper = 0;
-		for (i = 0; i < bset->n_eq; ++i) {
-			if (isl_int_is_zero(bset->eq[i][1 + ovar + j]))
-				continue;
-			if (!unique(bset->eq[i] + 1 + ovar, j, nvar))
-				return 0;
-			break;
-		}
-		if (i < bset->n_eq)
-			continue;
-		for (i = 0; i < bset->n_ineq; ++i) {
-			if (isl_int_is_zero(bset->ineq[i][1 + ovar + j]))
-				continue;
-			if (!unique(bset->ineq[i] + 1 + ovar, j, nvar))
-				return 0;
-			if (isl_int_is_pos(bset->ineq[i][1 + ovar + j]))
-				lower = 1;
-			else
-				upper = 1;
-		}
-		if (!lower || !upper)
-			return 0;
-	}
-
-	return 1;
-}
-
-int isl_set_is_box(__isl_keep isl_set *set)
-{
-	if (!set)
-		return -1;
-	if (set->n != 1)
-		return 0;
-
-	return isl_basic_set_is_box(set->p[0]);
-}
-
-int isl_basic_set_is_wrapping(__isl_keep isl_basic_set *bset)
-{
-	if (!bset)
-		return -1;
-	
-	return isl_dim_is_wrapping(bset->dim);
-}
-
-int isl_set_is_wrapping(__isl_keep isl_set *set)
-{
-	if (!set)
-		return -1;
-	
-	return isl_dim_is_wrapping(set->dim);
-}
-
-__isl_give isl_basic_set *isl_basic_map_wrap(__isl_take isl_basic_map *bmap)
-{
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-
-	bmap->dim = isl_dim_wrap(bmap->dim);
-	if (!bmap->dim)
-		goto error;
-
-	bmap = isl_basic_map_finalize(bmap);
-
-	return (isl_basic_set *)bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_set *isl_map_wrap(__isl_take isl_map *map)
-{
-	int i;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = (isl_basic_map *)isl_basic_map_wrap(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	map->dim = isl_dim_wrap(map->dim);
-	if (!map->dim)
-		goto error;
-
-	return (isl_set *)map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_set_unwrap(__isl_take isl_basic_set *bset)
-{
-	bset = isl_basic_set_cow(bset);
-	if (!bset)
-		return NULL;
-
-	bset->dim = isl_dim_unwrap(bset->dim);
-	if (!bset->dim)
-		goto error;
-
-	bset = isl_basic_set_finalize(bset);
-
-	return (isl_basic_map *)bset;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-__isl_give isl_map *isl_set_unwrap(__isl_take isl_set *set)
-{
-	int i;
-
-	if (!set)
-		return NULL;
-
-	if (!isl_set_is_wrapping(set))
-		isl_die(set->ctx, isl_error_invalid, "not a wrapping set",
-			goto error);
-
-	set = isl_set_cow(set);
-	if (!set)
-		return NULL;
-
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = (isl_basic_set *)isl_basic_set_unwrap(set->p[i]);
-		if (!set->p[i])
-			goto error;
-	}
-
-	set->dim = isl_dim_unwrap(set->dim);
-	if (!set->dim)
-		goto error;
-
-	return (isl_map *)set;
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_reset(__isl_take isl_basic_map *bmap,
-	enum isl_dim_type type)
-{
-	if (!bmap)
-		return NULL;
-
-	if (!isl_dim_is_named_or_nested(bmap->dim, type))
-		return bmap;
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-
-	bmap->dim = isl_dim_reset(bmap->dim, type);
-	if (!bmap->dim)
-		goto error;
-
-	bmap = isl_basic_map_finalize(bmap);
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_reset(__isl_take isl_map *map,
-	enum isl_dim_type type)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-
-	if (!isl_dim_is_named_or_nested(map->dim, type))
-		return map;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_reset(map->p[i], type);
-		if (!map->p[i])
-			goto error;
-	}
-	map->dim = isl_dim_reset(map->dim, type);
-	if (!map->dim)
-		goto error;
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_flatten(__isl_take isl_basic_map *bmap)
-{
-	if (!bmap)
-		return NULL;
-
-	if (!bmap->dim->nested[0] && !bmap->dim->nested[1])
-		return bmap;
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-
-	bmap->dim = isl_dim_flatten(bmap->dim);
-	if (!bmap->dim)
-		goto error;
-
-	bmap = isl_basic_map_finalize(bmap);
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_flatten(__isl_take isl_basic_set *bset)
-{
-	return (isl_basic_set *)isl_basic_map_flatten((isl_basic_map *)bset);
-}
-
-__isl_give isl_basic_map *isl_basic_map_flatten_range(
-	__isl_take isl_basic_map *bmap)
-{
-	if (!bmap)
-		return NULL;
-
-	if (!bmap->dim->nested[1])
-		return bmap;
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-
-	bmap->dim = isl_dim_flatten_range(bmap->dim);
-	if (!bmap->dim)
-		goto error;
-
-	bmap = isl_basic_map_finalize(bmap);
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_flatten(__isl_take isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-
-	if (!map->dim->nested[0] && !map->dim->nested[1])
-		return map;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_flatten(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	map->dim = isl_dim_flatten(map->dim);
-	if (!map->dim)
-		goto error;
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_flatten(__isl_take isl_set *set)
-{
-	return (isl_set *)isl_map_flatten((isl_map *)set);
-}
-
-__isl_give isl_map *isl_set_flatten_map(__isl_take isl_set *set)
-{
-	isl_dim *dim, *flat_dim;
-	isl_map *map;
-
-	dim = isl_set_get_dim(set);
-	flat_dim = isl_dim_flatten(isl_dim_copy(dim));
-	map = isl_map_identity(isl_dim_join(isl_dim_reverse(dim), flat_dim));
-	map = isl_map_intersect_domain(map, set);
-
-	return map;
-}
-
-__isl_give isl_map *isl_map_flatten_range(__isl_take isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-
-	if (!map->dim->nested[1])
-		return map;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_flatten_range(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	map->dim = isl_dim_flatten_range(map->dim);
-	if (!map->dim)
-		goto error;
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Reorder the dimensions of "bmap" according to the given dim_map
- * and set the dimension specification to "dim".
- */
-__isl_give isl_basic_map *isl_basic_map_realign(__isl_take isl_basic_map *bmap,
-	__isl_take isl_dim *dim, __isl_take struct isl_dim_map *dim_map)
-{
-	isl_basic_map *res;
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap || !dim || !dim_map)
-		goto error;
-
-	res = isl_basic_map_alloc_dim(dim,
-			bmap->n_div, bmap->n_eq, bmap->n_ineq);
-	res = isl_basic_map_add_constraints_dim_map(res, bmap, dim_map);
-	res = isl_basic_map_finalize(res);
-	return res;
-error:
-	free(dim_map);
-	isl_basic_map_free(bmap);
-	isl_dim_free(dim);
-	return NULL;
-}
-
-/* Reorder the dimensions of "map" according to given reordering.
- */
-__isl_give isl_map *isl_map_realign(__isl_take isl_map *map,
-	__isl_take isl_reordering *r)
-{
-	int i;
-	struct isl_dim_map *dim_map;
-
-	map = isl_map_cow(map);
-	dim_map = isl_dim_map_from_reordering(r);
-	if (!map || !r || !dim_map)
-		goto error;
-
-	for (i = 0; i < map->n; ++i) {
-		struct isl_dim_map *dim_map_i;
-
-		dim_map_i = isl_dim_map_extend(dim_map, map->p[i]);
-
-		map->p[i] = isl_basic_map_realign(map->p[i],
-					    isl_dim_copy(r->dim), dim_map_i);
-
-		if (!map->p[i])
-			goto error;
-	}
-
-	map = isl_map_reset_dim(map, isl_dim_copy(r->dim));
-
-	isl_reordering_free(r);
-	free(dim_map);
-	return map;
-error:
-	free(dim_map);
-	isl_map_free(map);
-	isl_reordering_free(r);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_realign(__isl_take isl_set *set,
-	__isl_take isl_reordering *r)
-{
-	return (isl_set *)isl_map_realign((isl_map *)set, r);
-}
-
-__isl_give isl_map *isl_map_align_params(__isl_take isl_map *map,
-	__isl_take isl_dim *model)
-{
-	isl_ctx *ctx;
-
-	if (!map || !model)
-		goto error;
-
-	ctx = isl_dim_get_ctx(model);
-	if (!isl_dim_has_named_params(model))
-		isl_die(ctx, isl_error_invalid,
-			"model has unnamed parameters", goto error);
-	if (!isl_dim_has_named_params(map->dim))
-		isl_die(ctx, isl_error_invalid,
-			"relation has unnamed parameters", goto error);
-	if (!isl_dim_match(map->dim, isl_dim_param, model, isl_dim_param)) {
-		isl_reordering *exp;
-
-		model = isl_dim_drop(model, isl_dim_in,
-					0, isl_dim_size(model, isl_dim_in));
-		model = isl_dim_drop(model, isl_dim_out,
-					0, isl_dim_size(model, isl_dim_out));
-		exp = isl_parameter_alignment_reordering(map->dim, model);
-		exp = isl_reordering_extend_dim(exp, isl_map_get_dim(map));
-		map = isl_map_realign(map, exp);
-	}
-
-	isl_dim_free(model);
-	return map;
-error:
-	isl_dim_free(model);
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_align_params(__isl_take isl_set *set,
-	__isl_take isl_dim *model)
-{
-	return isl_map_align_params(set, model);
-}
-
-__isl_give isl_mat *isl_basic_map_equalities_matrix(
-		__isl_keep isl_basic_map *bmap, enum isl_dim_type c1,
-		enum isl_dim_type c2, enum isl_dim_type c3,
-		enum isl_dim_type c4, enum isl_dim_type c5)
-{
-	enum isl_dim_type c[5] = { c1, c2, c3, c4, c5 };
-	struct isl_mat *mat;
-	int i, j, k;
-	int pos;
-
-	if (!bmap)
-		return NULL;
-	mat = isl_mat_alloc(bmap->ctx, bmap->n_eq,
-				isl_basic_map_total_dim(bmap) + 1);
-	if (!mat)
-		return NULL;
-	for (i = 0; i < bmap->n_eq; ++i)
-		for (j = 0, pos = 0; j < 5; ++j) {
-			int off = isl_basic_map_offset(bmap, c[j]);
-			for (k = 0; k < isl_basic_map_dim(bmap, c[j]); ++k) {
-				isl_int_set(mat->row[i][pos],
-					    bmap->eq[i][off + k]);
-				++pos;
-			}
-		}
-
-	return mat;
-}
-
-__isl_give isl_mat *isl_basic_map_inequalities_matrix(
-		__isl_keep isl_basic_map *bmap, enum isl_dim_type c1,
-		enum isl_dim_type c2, enum isl_dim_type c3,
-		enum isl_dim_type c4, enum isl_dim_type c5)
-{
-	enum isl_dim_type c[5] = { c1, c2, c3, c4, c5 };
-	struct isl_mat *mat;
-	int i, j, k;
-	int pos;
-
-	if (!bmap)
-		return NULL;
-	mat = isl_mat_alloc(bmap->ctx, bmap->n_ineq,
-				isl_basic_map_total_dim(bmap) + 1);
-	if (!mat)
-		return NULL;
-	for (i = 0; i < bmap->n_ineq; ++i)
-		for (j = 0, pos = 0; j < 5; ++j) {
-			int off = isl_basic_map_offset(bmap, c[j]);
-			for (k = 0; k < isl_basic_map_dim(bmap, c[j]); ++k) {
-				isl_int_set(mat->row[i][pos],
-					    bmap->ineq[i][off + k]);
-				++pos;
-			}
-		}
-
-	return mat;
-}
-
-__isl_give isl_basic_map *isl_basic_map_from_constraint_matrices(
-	__isl_take isl_dim *dim,
-	__isl_take isl_mat *eq, __isl_take isl_mat *ineq, enum isl_dim_type c1,
-	enum isl_dim_type c2, enum isl_dim_type c3,
-	enum isl_dim_type c4, enum isl_dim_type c5)
-{
-	enum isl_dim_type c[5] = { c1, c2, c3, c4, c5 };
-	isl_basic_map *bmap;
-	unsigned total;
-	unsigned extra;
-	int i, j, k, l;
-	int pos;
-
-	if (!dim || !eq || !ineq)
-		goto error;
-
-	if (eq->n_col != ineq->n_col)
-		isl_die(dim->ctx, isl_error_invalid,
-			"equalities and inequalities matrices should have "
-			"same number of columns", goto error);
-
-	total = 1 + isl_dim_total(dim);
-
-	if (eq->n_col < total)
-		isl_die(dim->ctx, isl_error_invalid,
-			"number of columns too small", goto error);
-
-	extra = eq->n_col - total;
-
-	bmap = isl_basic_map_alloc_dim(isl_dim_copy(dim), extra,
-				       eq->n_row, ineq->n_row);
-	if (!bmap)
-		goto error;
-	for (i = 0; i < extra; ++i) {
-		k = isl_basic_map_alloc_div(bmap);
-		if (k < 0)
-			goto error;
-		isl_int_set_si(bmap->div[k][0], 0);
-	}
-	for (i = 0; i < eq->n_row; ++i) {
-		l = isl_basic_map_alloc_equality(bmap);
-		if (l < 0)
-			goto error;
-		for (j = 0, pos = 0; j < 5; ++j) {
-			int off = isl_basic_map_offset(bmap, c[j]);
-			for (k = 0; k < isl_basic_map_dim(bmap, c[j]); ++k) {
-				isl_int_set(bmap->eq[l][off + k], 
-					    eq->row[i][pos]);
-				++pos;
-			}
-		}
-	}
-	for (i = 0; i < ineq->n_row; ++i) {
-		l = isl_basic_map_alloc_inequality(bmap);
-		if (l < 0)
-			goto error;
-		for (j = 0, pos = 0; j < 5; ++j) {
-			int off = isl_basic_map_offset(bmap, c[j]);
-			for (k = 0; k < isl_basic_map_dim(bmap, c[j]); ++k) {
-				isl_int_set(bmap->ineq[l][off + k], 
-					    ineq->row[i][pos]);
-				++pos;
-			}
-		}
-	}
-
-	isl_dim_free(dim);
-	isl_mat_free(eq);
-	isl_mat_free(ineq);
-
-	return bmap;
-error:
-	isl_dim_free(dim);
-	isl_mat_free(eq);
-	isl_mat_free(ineq);
-	return NULL;
-}
-
-__isl_give isl_mat *isl_basic_set_equalities_matrix(
-	__isl_keep isl_basic_set *bset, enum isl_dim_type c1,
-	enum isl_dim_type c2, enum isl_dim_type c3, enum isl_dim_type c4)
-{
-	return isl_basic_map_equalities_matrix((isl_basic_map *)bset,
-						c1, c2, c3, c4, isl_dim_in);
-}
-
-__isl_give isl_mat *isl_basic_set_inequalities_matrix(
-	__isl_keep isl_basic_set *bset, enum isl_dim_type c1,
-	enum isl_dim_type c2, enum isl_dim_type c3, enum isl_dim_type c4)
-{
-	return isl_basic_map_inequalities_matrix((isl_basic_map *)bset,
-						 c1, c2, c3, c4, isl_dim_in);
-}
-
-__isl_give isl_basic_set *isl_basic_set_from_constraint_matrices(
-	__isl_take isl_dim *dim,
-	__isl_take isl_mat *eq, __isl_take isl_mat *ineq, enum isl_dim_type c1,
-	enum isl_dim_type c2, enum isl_dim_type c3, enum isl_dim_type c4)
-{
-	return (isl_basic_set*)
-	    isl_basic_map_from_constraint_matrices(dim, eq, ineq,
-						   c1, c2, c3, c4, isl_dim_in);
-}
-
-int isl_basic_map_can_zip(__isl_keep isl_basic_map *bmap)
-{
-	if (!bmap)
-		return -1;
-	
-	return isl_dim_can_zip(bmap->dim);
-}
-
-int isl_map_can_zip(__isl_keep isl_map *map)
-{
-	if (!map)
-		return -1;
-	
-	return isl_dim_can_zip(map->dim);
-}
-
-/* Given a basic map (A -> B) -> (C -> D), return the corresponding basic map
- * (A -> C) -> (B -> D).
- */
-__isl_give isl_basic_map *isl_basic_map_zip(__isl_take isl_basic_map *bmap)
-{
-	unsigned pos;
-	unsigned n1;
-	unsigned n2;
-
-	if (!bmap)
-		return NULL;
-
-	if (!isl_basic_map_can_zip(bmap))
-		isl_die(bmap->ctx, isl_error_invalid,
-			"basic map cannot be zipped", goto error);
-	pos = isl_basic_map_offset(bmap, isl_dim_in) +
-		isl_dim_size(bmap->dim->nested[0], isl_dim_in);
-	n1 = isl_dim_size(bmap->dim->nested[0], isl_dim_out);
-	n2 = isl_dim_size(bmap->dim->nested[1], isl_dim_in);
-	bmap = isl_basic_map_swap_vars(bmap, pos, n1, n2);
-	if (!bmap)
-		return NULL;
-	bmap->dim = isl_dim_zip(bmap->dim);
-	if (!bmap->dim)
-		goto error;
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Given a map (A -> B) -> (C -> D), return the corresponding map
- * (A -> C) -> (B -> D).
- */
-__isl_give isl_map *isl_map_zip(__isl_take isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-
-	if (!isl_map_can_zip(map))
-		isl_die(map->ctx, isl_error_invalid, "map cannot be zipped",
-			goto error);
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_zip(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-
-	map->dim = isl_dim_zip(map->dim);
-	if (!map->dim)
-		goto error;
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Construct a basic map mapping the domain of the affine expression
- * to a one-dimensional range prescribed by the affine expression.
- */
-__isl_give isl_basic_map *isl_basic_map_from_aff(__isl_take isl_aff *aff)
-{
-	int k;
-	int pos;
-	isl_local_space *ls;
-	isl_basic_map *bmap;
-
-	if (!aff)
-		return NULL;
-
-	ls = isl_aff_get_local_space(aff);
-	ls = isl_local_space_from_domain(ls);
-	ls = isl_local_space_add_dims(ls, isl_dim_out, 1);
-	bmap = isl_basic_map_from_local_space(ls);
-	bmap = isl_basic_map_extend_constraints(bmap, 1, 0);
-	k = isl_basic_map_alloc_equality(bmap);
-	if (k < 0)
-		goto error;
-
-	pos = isl_basic_map_offset(bmap, isl_dim_out);
-	isl_seq_cpy(bmap->eq[k], aff->v->el + 1, pos);
-	isl_int_neg(bmap->eq[k][pos], aff->v->el[0]);
-	isl_seq_cpy(bmap->eq[k] + pos + 1, aff->v->el + 1 + pos,
-		    aff->v->size - (pos + 1));
-
-	isl_aff_free(aff);
-	bmap = isl_basic_map_finalize(bmap);
-	return bmap;
-error:
-	isl_aff_free(aff);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Construct a basic map mapping a domain in the given space to
- * to an n-dimensional range, with n the number of elements in the list,
- * where each coordinate in the range is prescribed by the
- * corresponding affine expression.
- * The domains of all affine expressions in the list are assumed to match
- * domain_dim.
- */
-__isl_give isl_basic_map *isl_basic_map_from_aff_list(
-	__isl_take isl_dim *domain_dim, __isl_take isl_aff_list *list)
-{
-	int i;
-	isl_dim *dim;
-	isl_basic_map *bmap;
-
-	if (!list)
-		return NULL;
-
-	dim = isl_dim_from_domain(domain_dim);
-	bmap = isl_basic_map_universe(dim);
-
-	for (i = 0; i < list->n; ++i) {
-		isl_aff *aff;
-		isl_basic_map *bmap_i;
-
-		aff = isl_aff_copy(list->p[i]);
-		bmap_i = isl_basic_map_from_aff(aff);
-
-		bmap = isl_basic_map_flat_range_product(bmap, bmap_i);
-	}
-
-	isl_aff_list_free(list);
-	return bmap;
-}
diff --git a/cloog-0.16.3/isl/isl_map_no_piplib.c b/cloog-0.16.3/isl/isl_map_no_piplib.c
deleted file mode 100644
index 8a28b07..0000000
--- a/cloog-0.16.3/isl/isl_map_no_piplib.c
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include "isl_map_piplib.h"
-#include <isl/set.h>
-
-struct isl_map *isl_pip_basic_map_lexopt(
-		struct isl_basic_map *bmap, struct isl_basic_set *dom,
-		struct isl_set **empty, int max)
-{
-	isl_basic_map_free(bmap);
-	isl_basic_set_free(dom);
-	return NULL;
-}
diff --git a/cloog-0.16.3/isl/isl_map_piplib.c b/cloog-0.16.3/isl/isl_map_piplib.c
deleted file mode 100644
index b1434eb..0000000
--- a/cloog-0.16.3/isl/isl_map_piplib.c
+++ /dev/null
@@ -1,476 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl/set.h>
-#include <isl/map.h>
-#include <isl/mat.h>
-#include <isl/seq.h>
-#include "isl_piplib.h"
-#include "isl_map_piplib.h"
-
-static void copy_values_from(isl_int *dst, Entier *src, unsigned n)
-{
-	int i;
-
-	for (i = 0; i < n; ++i)
-		entier_assign(dst[i], src[i]);
-}
-
-static void add_value(isl_int *dst, Entier *src)
-{
-	mpz_add(*dst, *dst, *src);
-}
-
-static void copy_constraint_from(isl_int *dst, PipVector *src,
-		unsigned nparam, unsigned n_in, unsigned n_out,
-		unsigned extra, int *pos)
-{
-	int i;
-
-	copy_values_from(dst, src->the_vector+src->nb_elements-1, 1);
-	copy_values_from(dst+1, src->the_vector, nparam+n_in);
-	isl_seq_clr(dst+1+nparam+n_in, n_out);
-	isl_seq_clr(dst+1+nparam+n_in+n_out, extra);
-	for (i = 0; i + n_in + nparam < src->nb_elements-1; ++i) {
-		int p = pos[i];
-		add_value(&dst[1+nparam+n_in+n_out+p],
-			  &src->the_vector[n_in+nparam+i]);
-	}
-}
-
-static int add_inequality(struct isl_ctx *ctx,
-		   struct isl_basic_map *bmap, int *pos, PipVector *vec)
-{
-	unsigned nparam = isl_basic_map_n_param(bmap);
-	unsigned n_in = isl_basic_map_n_in(bmap);
-	unsigned n_out = isl_basic_map_n_out(bmap);
-	unsigned n_div = isl_basic_map_n_div(bmap);
-	int i = isl_basic_map_alloc_inequality(bmap);
-	if (i < 0)
-		return -1;
-	copy_constraint_from(bmap->ineq[i], vec,
-	    nparam, n_in, n_out, n_div, pos);
-
-	return i;
-}
-
-/* For a div d = floor(f/m), add the constraints
- *
- *		f - m d >= 0
- *		-(f-(n-1)) + m d >= 0
- *
- * Note that the second constraint is the negation of
- *
- *		f - m d >= n
- */
-static int add_div_constraints(struct isl_ctx *ctx,
-	struct isl_basic_map *bmap, int *pos, PipNewparm *p, unsigned div)
-{
-	int i, j;
-	unsigned total = isl_basic_map_total_dim(bmap);
-	unsigned div_pos = 1 + total - bmap->n_div + div;
-
-	i = add_inequality(ctx, bmap, pos, p->vector);
-	if (i < 0)
-		return -1;
-	copy_values_from(&bmap->ineq[i][div_pos], &p->deno, 1);
-	isl_int_neg(bmap->ineq[i][div_pos], bmap->ineq[i][div_pos]);
-
-	j = isl_basic_map_alloc_inequality(bmap);
-	if (j < 0)
-		return -1;
-	isl_seq_neg(bmap->ineq[j], bmap->ineq[i], 1 + total);
-	isl_int_add(bmap->ineq[j][0], bmap->ineq[j][0], bmap->ineq[j][div_pos]);
-	isl_int_sub_ui(bmap->ineq[j][0], bmap->ineq[j][0], 1);
-	return j;
-}
-
-static int add_equality(struct isl_ctx *ctx,
-		   struct isl_basic_map *bmap, int *pos,
-		   unsigned var, PipVector *vec)
-{
-	int i;
-	unsigned nparam = isl_basic_map_n_param(bmap);
-	unsigned n_in = isl_basic_map_n_in(bmap);
-	unsigned n_out = isl_basic_map_n_out(bmap);
-
-	isl_assert(ctx, var < n_out, return -1);
-
-	i = isl_basic_map_alloc_equality(bmap);
-	if (i < 0)
-		return -1;
-	copy_constraint_from(bmap->eq[i], vec,
-	    nparam, n_in, n_out, bmap->extra, pos);
-	isl_int_set_si(bmap->eq[i][1+nparam+n_in+var], -1);
-
-	return i;
-}
-
-static int find_div(struct isl_ctx *ctx,
-		   struct isl_basic_map *bmap, int *pos, PipNewparm *p)
-{
-	int i, j;
-	unsigned nparam = isl_basic_map_n_param(bmap);
-	unsigned n_in = isl_basic_map_n_in(bmap);
-	unsigned n_out = isl_basic_map_n_out(bmap);
-
-	i = isl_basic_map_alloc_div(bmap);
-	if (i < 0)
-		return -1;
-
-	copy_constraint_from(bmap->div[i]+1, p->vector,
-	    nparam, n_in, n_out, bmap->extra, pos);
-
-	copy_values_from(bmap->div[i], &p->deno, 1);
-	for (j = 0; j < i; ++j)
-		if (isl_seq_eq(bmap->div[i], bmap->div[j],
-				1+1+isl_basic_map_total_dim(bmap)+j)) {
-			isl_basic_map_free_div(bmap, 1);
-			return j;
-		}
-
-	if (add_div_constraints(ctx, bmap, pos, p, i) < 0)
-		return -1;
-
-	return i;
-}
-
-/* Count some properties of a quast
- * - maximal number of new parameters
- * - maximal depth
- * - total number of solutions
- * - total number of empty branches
- */
-static void quast_count(PipQuast *q, int *maxnew, int depth, int *maxdepth,
-		        int *sol, int *nosol)
-{
-	PipNewparm *p;
-
-	for (p = q->newparm; p; p = p->next)
-		if (p->rank > *maxnew)
-			*maxnew = p->rank;
-	if (q->condition) {
-		if (++depth > *maxdepth)
-			*maxdepth = depth;
-		quast_count(q->next_else, maxnew, depth, maxdepth, sol, nosol);
-		quast_count(q->next_then, maxnew, depth, maxdepth, sol, nosol);
-	} else {
-		if (q->list)
-			++(*sol);
-		else
-			++(*nosol);
-	}
-}
-
-/*
- * pos: array of length bmap->set.extra, mapping each of the existential
- *		variables PIP proposes to an existential variable in bmap
- * bmap: collects the currently active constraints
- * rest: collects the empty leaves of the quast (if not NULL)
- */
-struct scan_data {
-	struct isl_ctx 			*ctx;
-	struct isl_basic_map 		*bmap;
-	struct isl_set			**rest;
-	int	   *pos;
-};
-
-/*
- * New existentially quantified variables are places after the existing ones.
- */
-static struct isl_map *scan_quast_r(struct scan_data *data, PipQuast *q,
-				    struct isl_map *map)
-{
-	PipNewparm *p;
-	struct isl_basic_map *bmap = data->bmap;
-	unsigned old_n_div = bmap->n_div;
-	unsigned nparam = isl_basic_map_n_param(bmap);
-	unsigned n_in = isl_basic_map_n_in(bmap);
-	unsigned n_out = isl_basic_map_n_out(bmap);
-
-	if (!map)
-		goto error;
-
-	for (p = q->newparm; p; p = p->next) {
-		int pos;
-		unsigned pip_param = nparam + n_in;
-
-		pos = find_div(data->ctx, bmap, data->pos, p);
-		if (pos < 0)
-			goto error;
-		data->pos[p->rank - pip_param] = pos;
-	}
-
-	if (q->condition) {
-		int pos = add_inequality(data->ctx, bmap, data->pos,
-					 q->condition);
-		if (pos < 0)
-			goto error;
-		map = scan_quast_r(data, q->next_then, map);
-
-		if (isl_inequality_negate(bmap, pos))
-			goto error;
-		map = scan_quast_r(data, q->next_else, map);
-
-		if (isl_basic_map_free_inequality(bmap, 1))
-			goto error;
-	} else if (q->list) {
-		PipList *l;
-		int j;
-		/* if bmap->n_out is zero, we are only interested in the domains
-		 * where a solution exists and not in the actual solution
-		 */
-		for (j = 0, l = q->list; j < n_out && l; ++j, l = l->next)
-			if (add_equality(data->ctx, bmap, data->pos, j,
-						l->vector) < 0)
-				goto error;
-		map = isl_map_add_basic_map(map, isl_basic_map_copy(bmap));
-		if (isl_basic_map_free_equality(bmap, n_out))
-			goto error;
-	} else if (data->rest) {
-		struct isl_basic_set *bset;
-		bset = isl_basic_set_from_basic_map(isl_basic_map_copy(bmap));
-		bset = isl_basic_set_drop_dims(bset, n_in, n_out);
-		if (!bset)
-			goto error;
-		*data->rest = isl_set_add_basic_set(*data->rest, bset);
-	}
-
-	if (isl_basic_map_free_inequality(bmap, 2*(bmap->n_div - old_n_div)))
-		goto error;
-	if (isl_basic_map_free_div(bmap, bmap->n_div - old_n_div))
-		goto error;
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/*
- * Returns a map of dimension "keep_dim" with "context" as domain and
- * as range the first "isl_dim_size(keep_dim, isl_dim_out)" variables
- * in the quast lists.
- */
-static struct isl_map *isl_map_from_quast(struct isl_ctx *ctx, PipQuast *q,
-		struct isl_dim *keep_dim,
-		struct isl_basic_set *context,
-		struct isl_set **rest)
-{
-	int		pip_param;
-	int		nexist;
-	int		max_depth;
-	int		n_sol, n_nosol;
-	struct scan_data	data;
-	struct isl_map		*map = NULL;
-	struct isl_dim		*dims;
-	unsigned		nparam;
-	unsigned		dim;
-	unsigned		keep;
-
-	data.ctx = ctx;
-	data.rest = rest;
-	data.bmap = NULL;
-	data.pos = NULL;
-
-	if (!context || !keep_dim)
-		goto error;
-
-	dim = isl_basic_set_n_dim(context);
-	nparam = isl_basic_set_n_param(context);
-	keep = isl_dim_size(keep_dim, isl_dim_out);
-	pip_param = nparam + dim;
-
-	max_depth = 0;
-	n_sol = 0;
-	n_nosol = 0;
-	nexist = pip_param-1;
-	quast_count(q, &nexist, 0, &max_depth, &n_sol, &n_nosol);
-	nexist -= pip_param-1;
-
-	if (rest) {
-		*rest = isl_set_alloc_dim(isl_dim_copy(context->dim), n_nosol,
-					ISL_MAP_DISJOINT);
-		if (!*rest)
-			goto error;
-	}
-	map = isl_map_alloc_dim(isl_dim_copy(keep_dim), n_sol,
-				ISL_MAP_DISJOINT);
-	if (!map)
-		goto error;
-
-	dims = isl_dim_reverse(isl_dim_copy(context->dim));
-	data.bmap = isl_basic_map_from_basic_set(context, dims);
-	data.bmap = isl_basic_map_extend_dim(data.bmap,
-		keep_dim, nexist, keep, max_depth+2*nexist);
-	if (!data.bmap)
-		goto error2;
-
-	if (data.bmap->extra) {
-		int i;
-		data.pos = isl_alloc_array(ctx, int, data.bmap->extra);
-		if (!data.pos)
-			goto error;
-		for (i = 0; i < data.bmap->n_div; ++i)
-			data.pos[i] = i;
-	}
-
-	map = scan_quast_r(&data, q, map);
-	map = isl_map_finalize(map);
-	if (!map)
-		goto error2;
-	if (rest) {
-		*rest = isl_set_finalize(*rest);
-		if (!*rest)
-			goto error2;
-	}
-	isl_basic_map_free(data.bmap);
-	if (data.pos)
-		free(data.pos);
-	return map;
-error:
-	isl_basic_set_free(context);
-	isl_dim_free(keep_dim);
-error2:
-	if (data.pos)
-		free(data.pos);
-	isl_basic_map_free(data.bmap);
-	isl_map_free(map);
-	if (rest) {
-		isl_set_free(*rest);
-		*rest = NULL;
-	}
-	return NULL;
-}
-
-static void copy_values_to(Entier *dst, isl_int *src, unsigned n)
-{
-	int i;
-
-	for (i = 0; i < n; ++i)
-		entier_assign(dst[i], src[i]);
-}
-
-static void copy_constraint_to(Entier *dst, isl_int *src,
-		unsigned pip_param, unsigned pip_var,
-		unsigned extra_front, unsigned extra_back)
-{
-	copy_values_to(dst+1+extra_front+pip_var+pip_param+extra_back, src, 1);
-	copy_values_to(dst+1+extra_front+pip_var, src+1, pip_param);
-	copy_values_to(dst+1+extra_front, src+1+pip_param, pip_var);
-}
-
-PipMatrix *isl_basic_map_to_pip(struct isl_basic_map *bmap, unsigned pip_param,
-			 unsigned extra_front, unsigned extra_back)
-{
-	int i;
-	unsigned nrow;
-	unsigned ncol;
-	PipMatrix *M;
-	unsigned off;
-	unsigned pip_var = isl_basic_map_total_dim(bmap) - pip_param;
-
-	nrow = extra_front + bmap->n_eq + bmap->n_ineq;
-	ncol = 1 + extra_front + pip_var + pip_param + extra_back + 1;
-	M = pip_matrix_alloc(nrow, ncol);
-	if (!M)
-		return NULL;
-
-	off = extra_front;
-	for (i = 0; i < bmap->n_eq; ++i) {
-		entier_set_si(M->p[off+i][0], 0);
-		copy_constraint_to(M->p[off+i], bmap->eq[i],
-				   pip_param, pip_var, extra_front, extra_back);
-	}
-	off += bmap->n_eq;
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		entier_set_si(M->p[off+i][0], 1);
-		copy_constraint_to(M->p[off+i], bmap->ineq[i],
-				   pip_param, pip_var, extra_front, extra_back);
-	}
-	return M;
-}
-
-PipMatrix *isl_basic_set_to_pip(struct isl_basic_set *bset, unsigned pip_param,
-			 unsigned extra_front, unsigned extra_back)
-{
-	return isl_basic_map_to_pip((struct isl_basic_map *)bset,
-					pip_param, extra_front, extra_back);
-}
-
-struct isl_map *isl_pip_basic_map_lexopt(
-		struct isl_basic_map *bmap, struct isl_basic_set *dom,
-		struct isl_set **empty, int max)
-{
-	PipOptions	*options;
-	PipQuast	*sol;
-	struct isl_map	*map;
-	struct isl_ctx  *ctx;
-	PipMatrix *domain = NULL, *context = NULL;
-	unsigned	 nparam, n_in, n_out;
-
-	bmap = isl_basic_map_detect_equalities(bmap);
-	if (!bmap || !dom)
-		goto error;
-
-	ctx = bmap->ctx;
-	isl_assert(ctx, isl_basic_map_compatible_domain(bmap, dom), goto error);
-	nparam = isl_basic_map_n_param(bmap);
-	n_in = isl_basic_map_n_in(bmap);
-	n_out = isl_basic_map_n_out(bmap);
-
-	domain = isl_basic_map_to_pip(bmap, nparam + n_in, 0, dom->n_div);
-	if (!domain)
-		goto error;
-	context = isl_basic_map_to_pip((struct isl_basic_map *)dom, 0, 0, 0);
-	if (!context)
-		goto error;
-
-	options = pip_options_init();
-	options->Simplify = 1;
-	options->Maximize = max;
-	options->Urs_unknowns = -1;
-	options->Urs_parms = -1;
-	sol = pip_solve(domain, context, -1, options);
-
-	if (sol) {
-		struct isl_basic_set *copy;
-		copy = isl_basic_set_copy(dom);
-		map = isl_map_from_quast(ctx, sol,
-				isl_dim_copy(bmap->dim), copy, empty);
-	} else {
-		map = isl_map_empty_like_basic_map(bmap);
-		if (empty)
-			*empty = NULL;
-	}
-	if (!map)
-		goto error;
-	if (map->n == 0 && empty) {
-		isl_set_free(*empty);
-		*empty = isl_set_from_basic_set(dom);
-	} else
-		isl_basic_set_free(dom);
-	isl_basic_map_free(bmap);
-
-	pip_quast_free(sol);
-	pip_options_free(options);
-	pip_matrix_free(domain);
-	pip_matrix_free(context);
-
-	return map;
-error:
-	if (domain)
-		pip_matrix_free(domain);
-	if (context)
-		pip_matrix_free(context);
-	isl_basic_map_free(bmap);
-	isl_basic_set_free(dom);
-	return NULL;
-}
diff --git a/cloog-0.16.3/isl/isl_map_piplib.h b/cloog-0.16.3/isl/isl_map_piplib.h
deleted file mode 100644
index e796e4a..0000000
--- a/cloog-0.16.3/isl/isl_map_piplib.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_MAP_PIPLIB_H
-#define ISL_MAP_PIPLIB_H
-
-#include <isl/map.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_map *isl_pip_basic_map_lexopt(
-		struct isl_basic_map *bmap, struct isl_basic_set *dom,
-		struct isl_set **empty, int max);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_map_private.h b/cloog-0.16.3/isl/isl_map_private.h
deleted file mode 100644
index a3b106b..0000000
--- a/cloog-0.16.3/isl/isl_map_private.h
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_MAP_PRIVATE_H
-#define ISL_MAP_PRIVATE_H
-
-#define isl_basic_set	isl_basic_map
-#define isl_set		isl_map
-#define isl_basic_set_list	isl_basic_map_list
-#include <isl/set.h>
-#include <isl/map.h>
-#include <isl_reordering.h>
-#include <isl/vec.h>
-
-/* A "basic map" is a relation between two sets of variables,
- * called the "in" and "out" variables.
- * A "basic set" is a basic map with a zero-dimensional
- * domain.
- *
- * It is implemented as a set with two extra fields:
- * n_in is the number of in variables
- * n_out is the number of out variables
- * n_in + n_out should be equal to set.dim
- */
-struct isl_basic_map {
-	int ref;
-#define ISL_BASIC_MAP_FINAL		(1 << 0)
-#define ISL_BASIC_MAP_EMPTY		(1 << 1)
-#define ISL_BASIC_MAP_NO_IMPLICIT	(1 << 2)
-#define ISL_BASIC_MAP_NO_REDUNDANT	(1 << 3)
-#define ISL_BASIC_MAP_RATIONAL		(1 << 4)
-#define ISL_BASIC_MAP_NORMALIZED	(1 << 5)
-#define ISL_BASIC_MAP_NORMALIZED_DIVS	(1 << 6)
-#define ISL_BASIC_MAP_ALL_EQUALITIES	(1 << 7)
-#define ISL_BASIC_SET_FINAL		(1 << 0)
-#define ISL_BASIC_SET_EMPTY		(1 << 1)
-#define ISL_BASIC_SET_NO_IMPLICIT	(1 << 2)
-#define ISL_BASIC_SET_NO_REDUNDANT	(1 << 3)
-#define ISL_BASIC_SET_RATIONAL		(1 << 4)
-#define ISL_BASIC_SET_NORMALIZED	(1 << 5)
-#define ISL_BASIC_SET_NORMALIZED_DIVS	(1 << 6)
-#define ISL_BASIC_SET_ALL_EQUALITIES	(1 << 7)
-	unsigned flags;
-
-	struct isl_ctx *ctx;
-
-	struct isl_dim *dim;
-	unsigned extra;
-
-	unsigned n_eq;
-	unsigned n_ineq;
-
-	size_t c_size;
-	isl_int **eq;
-	isl_int **ineq;
-
-	unsigned n_div;
-
-	isl_int **div;
-
-	struct isl_vec *sample;
-
-	struct isl_blk block;
-	struct isl_blk block2;
-};
-
-/* A "map" is a (possibly disjoint) union of basic maps.
- * A "set" is a (possibly disjoint) union of basic sets.
- *
- * Currently, the isl_set structure is identical to the isl_map structure
- * and the library depends on this correspondence internally.
- * However, users should not depend on this correspondence.
- */
-struct isl_map {
-	int ref;
-#define ISL_MAP_DISJOINT		(1 << 0)
-#define ISL_MAP_NORMALIZED		(1 << 1)
-#define ISL_SET_DISJOINT		(1 << 0)
-#define ISL_SET_NORMALIZED		(1 << 1)
-	unsigned flags;
-
-	struct isl_ctx *ctx;
-
-	struct isl_dim *dim;
-
-	int n;
-
-	size_t size;
-	struct isl_basic_map *p[1];
-};
-
-__isl_give isl_map *isl_map_realign(__isl_take isl_map *map,
-	__isl_take isl_reordering *r);
-__isl_give isl_set *isl_set_realign(__isl_take isl_set *set,
-	__isl_take isl_reordering *r);
-
-__isl_give isl_map *isl_map_reset(__isl_take isl_map *map,
-	enum isl_dim_type type);
-
-__isl_give isl_basic_set *isl_basic_set_reset_dim(
-	__isl_take isl_basic_set *bset, __isl_take isl_dim *dim);
-__isl_give isl_basic_map *isl_basic_map_reset_dim(
-	__isl_take isl_basic_map *bmap, __isl_take isl_dim *dim);
-__isl_give isl_map *isl_map_reset_dim(__isl_take isl_map *map,
-	__isl_take isl_dim *dim);
-
-unsigned isl_basic_map_offset(struct isl_basic_map *bmap,
-					enum isl_dim_type type);
-unsigned isl_basic_set_offset(struct isl_basic_set *bset,
-					enum isl_dim_type type);
-
-int isl_basic_map_may_be_set(__isl_keep isl_basic_map *bmap);
-int isl_map_may_be_set(__isl_keep isl_map *map);
-int isl_map_compatible_domain(struct isl_map *map, struct isl_set *set);
-int isl_basic_map_compatible_domain(struct isl_basic_map *bmap,
-		struct isl_basic_set *bset);
-int isl_basic_map_compatible_range(struct isl_basic_map *bmap,
-		struct isl_basic_set *bset);
-
-struct isl_basic_map *isl_basic_map_extend_dim(struct isl_basic_map *base,
-		struct isl_dim *dim, unsigned extra,
-		unsigned n_eq, unsigned n_ineq);
-struct isl_basic_set *isl_basic_set_extend_dim(struct isl_basic_set *base,
-		struct isl_dim *dim, unsigned extra,
-		unsigned n_eq, unsigned n_ineq);
-struct isl_basic_set *isl_basic_set_add_constraints(struct isl_basic_set *bset1,
-		struct isl_basic_set *bset2, unsigned pos);
-
-struct isl_map *isl_map_grow(struct isl_map *map, int n);
-struct isl_set *isl_set_grow(struct isl_set *set, int n);
-
-int isl_basic_set_contains(struct isl_basic_set *bset, struct isl_vec *vec);
-int isl_basic_map_contains(struct isl_basic_map *bmap, struct isl_vec *vec);
-
-struct isl_basic_set *isl_basic_set_alloc_dim(struct isl_dim *dim,
-		unsigned extra, unsigned n_eq, unsigned n_ineq);
-struct isl_set *isl_set_alloc_dim(struct isl_dim *dim, int n, unsigned flags);
-struct isl_basic_map *isl_basic_map_alloc_dim(struct isl_dim *dim,
-		unsigned extra, unsigned n_eq, unsigned n_ineq);
-struct isl_map *isl_map_alloc_dim(struct isl_dim *dim, int n, unsigned flags);
-
-unsigned isl_basic_map_total_dim(const struct isl_basic_map *bmap);
-
-int isl_basic_map_alloc_equality(struct isl_basic_map *bmap);
-int isl_basic_set_alloc_equality(struct isl_basic_set *bset);
-int isl_basic_set_free_inequality(struct isl_basic_set *bset, unsigned n);
-int isl_basic_map_free_equality(struct isl_basic_map *bmap, unsigned n);
-int isl_basic_set_free_equality(struct isl_basic_set *bset, unsigned n);
-int isl_basic_set_alloc_inequality(struct isl_basic_set *bset);
-int isl_basic_map_alloc_inequality(struct isl_basic_map *bmap);
-int isl_basic_map_free_inequality(struct isl_basic_map *bmap, unsigned n);
-int isl_basic_map_alloc_div(struct isl_basic_map *bmap);
-int isl_basic_set_alloc_div(struct isl_basic_set *bset);
-int isl_basic_map_free_div(struct isl_basic_map *bmap, unsigned n);
-int isl_basic_set_free_div(struct isl_basic_set *bset, unsigned n);
-void isl_basic_map_inequality_to_equality(
-		struct isl_basic_map *bmap, unsigned pos);
-int isl_basic_map_drop_equality(struct isl_basic_map *bmap, unsigned pos);
-int isl_basic_set_drop_equality(struct isl_basic_set *bset, unsigned pos);
-int isl_basic_set_drop_inequality(struct isl_basic_set *bset, unsigned pos);
-int isl_basic_map_drop_inequality(struct isl_basic_map *bmap, unsigned pos);
-__isl_give isl_basic_set *isl_basic_set_add_eq(__isl_take isl_basic_set *bset,
-	isl_int *eq);
-__isl_give isl_basic_map *isl_basic_map_add_eq(__isl_take isl_basic_map *bmap,
-	isl_int *eq);
-__isl_give isl_basic_set *isl_basic_set_add_ineq(__isl_take isl_basic_set *bset,
-	isl_int *ineq);
-__isl_give isl_basic_map *isl_basic_map_add_ineq(__isl_take isl_basic_map *bmap,
-	isl_int *ineq);
-
-int isl_inequality_negate(struct isl_basic_map *bmap, unsigned pos);
-
-struct isl_basic_set *isl_basic_set_cow(struct isl_basic_set *bset);
-struct isl_basic_map *isl_basic_map_cow(struct isl_basic_map *bmap);
-struct isl_set *isl_set_cow(struct isl_set *set);
-struct isl_map *isl_map_cow(struct isl_map *map);
-
-struct isl_basic_map *isl_basic_map_set_to_empty(struct isl_basic_map *bmap);
-struct isl_basic_set *isl_basic_set_set_to_empty(struct isl_basic_set *bset);
-struct isl_basic_set *isl_basic_set_order_divs(struct isl_basic_set *bset);
-void isl_basic_map_swap_div(struct isl_basic_map *bmap, int a, int b);
-struct isl_basic_map *isl_basic_map_order_divs(struct isl_basic_map *bmap);
-__isl_give isl_map *isl_map_order_divs(__isl_take isl_map *map);
-struct isl_basic_map *isl_basic_map_align_divs(
-		struct isl_basic_map *dst, struct isl_basic_map *src);
-struct isl_basic_set *isl_basic_set_align_divs(
-		struct isl_basic_set *dst, struct isl_basic_set *src);
-struct isl_basic_map *isl_basic_map_gauss(
-	struct isl_basic_map *bmap, int *progress);
-struct isl_basic_set *isl_basic_set_gauss(
-	struct isl_basic_set *bset, int *progress);
-__isl_give isl_basic_set *isl_basic_set_sort_constraints(
-	__isl_take isl_basic_set *bset);
-int isl_basic_map_plain_cmp(const __isl_keep isl_basic_map *bmap1,
-	const __isl_keep isl_basic_map *bmap2);
-int isl_basic_set_plain_is_equal(__isl_keep isl_basic_set *bset1,
-	__isl_keep isl_basic_set *bset2);
-int isl_basic_map_plain_is_equal(__isl_keep isl_basic_map *bmap1,
-	__isl_keep isl_basic_map *bmap2);
-struct isl_basic_map *isl_basic_map_normalize_constraints(
-	struct isl_basic_map *bmap);
-struct isl_basic_set *isl_basic_set_normalize_constraints(
-	struct isl_basic_set *bset);
-struct isl_basic_map *isl_basic_map_implicit_equalities(
-						struct isl_basic_map *bmap);
-struct isl_basic_set *isl_basic_map_underlying_set(struct isl_basic_map *bmap);
-__isl_give isl_basic_set *isl_basic_set_underlying_set(
-		__isl_take isl_basic_set *bset);
-struct isl_set *isl_map_underlying_set(struct isl_map *map);
-struct isl_basic_map *isl_basic_map_overlying_set(struct isl_basic_set *bset,
-	struct isl_basic_map *like);
-__isl_give isl_basic_set *isl_basic_set_drop_constraints_involving(
-	__isl_take isl_basic_set *bset, unsigned first, unsigned n);
-__isl_give isl_basic_set *isl_basic_set_drop(__isl_take isl_basic_set *bset,
-	enum isl_dim_type type, unsigned first, unsigned n);
-struct isl_basic_map *isl_basic_map_drop(struct isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned first, unsigned n);
-struct isl_set *isl_set_drop(struct isl_set *set,
-	enum isl_dim_type type, unsigned first, unsigned n);
-struct isl_basic_set *isl_basic_set_drop_dims(
-		struct isl_basic_set *bset, unsigned first, unsigned n);
-struct isl_set *isl_set_drop_dims(
-		struct isl_set *set, unsigned first, unsigned n);
-struct isl_map *isl_map_drop_inputs(
-		struct isl_map *map, unsigned first, unsigned n);
-struct isl_map *isl_map_drop(struct isl_map *map,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-struct isl_map *isl_map_remove_empty_parts(struct isl_map *map);
-struct isl_set *isl_set_remove_empty_parts(struct isl_set *set);
-
-struct isl_set *isl_set_normalize(struct isl_set *set);
-
-struct isl_set *isl_set_drop_vars(
-		struct isl_set *set, unsigned first, unsigned n);
-
-struct isl_basic_map *isl_basic_map_eliminate_vars(
-	struct isl_basic_map *bmap, unsigned pos, unsigned n);
-struct isl_basic_set *isl_basic_set_eliminate_vars(
-	struct isl_basic_set *bset, unsigned pos, unsigned n);
-
-__isl_give isl_map *isl_map_eliminate(__isl_take isl_map *map,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_set *isl_set_eliminate(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-int isl_basic_set_constraint_is_redundant(struct isl_basic_set **bset,
-	isl_int *c, isl_int *opt_n, isl_int *opt_d);
-
-int isl_basic_map_add_div_constraints(struct isl_basic_map *bmap, unsigned div);
-struct isl_basic_map *isl_basic_map_drop_redundant_divs(
-	struct isl_basic_map *bmap);
-struct isl_basic_set *isl_basic_set_drop_redundant_divs(
-	struct isl_basic_set *bset);
-
-struct isl_basic_set *isl_basic_set_recession_cone(struct isl_basic_set *bset);
-struct isl_basic_set *isl_basic_set_lineality_space(struct isl_basic_set *bset);
-
-struct isl_basic_set *isl_basic_set_set_rational(struct isl_basic_set *bset);
-__isl_give isl_basic_map *isl_basic_map_set_rational(
-	__isl_take isl_basic_map *bmap);
-
-struct isl_mat;
-
-struct isl_basic_set *isl_basic_set_preimage(struct isl_basic_set *bset,
-	struct isl_mat *mat);
-struct isl_set *isl_set_preimage(struct isl_set *set, struct isl_mat *mat);
-
-__isl_give isl_basic_set *isl_basic_set_transform_dims(
-	__isl_take isl_basic_set *bset, enum isl_dim_type type, unsigned first,
-	__isl_take isl_mat *trans);
-
-isl_int *isl_set_wrap_facet(__isl_keep isl_set *set,
-	isl_int *facet, isl_int *ridge);
-
-int isl_basic_map_contains_point(__isl_keep isl_basic_map *bmap,
-	__isl_keep isl_point *point);
-int isl_set_contains_point(__isl_keep isl_set *set, __isl_keep isl_point *point);
-
-int isl_basic_set_vars_get_sign(__isl_keep isl_basic_set *bset,
-	unsigned first, unsigned n, int *signs);
-int isl_set_foreach_orthant(__isl_keep isl_set *set,
-	int (*fn)(__isl_take isl_set *orthant, int *signs, void *user),
-	void *user);
-
-int isl_basic_map_add_div_constraints_var(__isl_keep isl_basic_map *bmap,
-	unsigned pos, isl_int *div);
-int isl_basic_set_add_div_constraints_var(__isl_keep isl_basic_set *bset,
-	unsigned pos, isl_int *div);
-int isl_basic_map_is_div_constraint(__isl_keep isl_basic_map *bmap,
-	isl_int *constraint, unsigned div);
-
-__isl_give isl_basic_set *isl_basic_set_from_local_space(
-	__isl_take isl_local_space *ls);
-__isl_give isl_basic_map *isl_basic_map_from_local_space(
-	__isl_take isl_local_space *ls);
-__isl_give isl_basic_set *isl_basic_set_expand_divs(
-	__isl_take isl_basic_set *bset, __isl_take isl_mat *div, int *exp);
-
-int isl_basic_map_divs_known(__isl_keep isl_basic_map *bmap);
-
-__isl_give isl_map *isl_map_inline_foreach_basic_map(__isl_take isl_map *map,
-	__isl_give isl_basic_map *(*fn)(__isl_take isl_basic_map *bmap));
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_map_simplify.c b/cloog-0.16.3/isl/isl_map_simplify.c
deleted file mode 100644
index 7a24c5b..0000000
--- a/cloog-0.16.3/isl/isl_map_simplify.c
+++ /dev/null
@@ -1,2497 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <strings.h>
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include "isl_equalities.h"
-#include <isl/map.h>
-#include <isl/seq.h>
-#include "isl_tab.h"
-#include <isl_dim_private.h>
-#include <isl_mat_private.h>
-
-static void swap_equality(struct isl_basic_map *bmap, int a, int b)
-{
-	isl_int *t = bmap->eq[a];
-	bmap->eq[a] = bmap->eq[b];
-	bmap->eq[b] = t;
-}
-
-static void swap_inequality(struct isl_basic_map *bmap, int a, int b)
-{
-	if (a != b) {
-		isl_int *t = bmap->ineq[a];
-		bmap->ineq[a] = bmap->ineq[b];
-		bmap->ineq[b] = t;
-	}
-}
-
-static void constraint_drop_vars(isl_int *c, unsigned n, unsigned rem)
-{
-	isl_seq_cpy(c, c + n, rem);
-	isl_seq_clr(c + rem, n);
-}
-
-/* Drop n dimensions starting at first.
- *
- * In principle, this frees up some extra variables as the number
- * of columns remains constant, but we would have to extend
- * the div array too as the number of rows in this array is assumed
- * to be equal to extra.
- */
-struct isl_basic_set *isl_basic_set_drop_dims(
-		struct isl_basic_set *bset, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!bset)
-		goto error;
-
-	isl_assert(bset->ctx, first + n <= bset->dim->n_out, goto error);
-
-	if (n == 0 && !isl_dim_get_tuple_name(bset->dim, isl_dim_set))
-		return bset;
-
-	bset = isl_basic_set_cow(bset);
-	if (!bset)
-		return NULL;
-
-	for (i = 0; i < bset->n_eq; ++i)
-		constraint_drop_vars(bset->eq[i]+1+bset->dim->nparam+first, n,
-				     (bset->dim->n_out-first-n)+bset->extra);
-
-	for (i = 0; i < bset->n_ineq; ++i)
-		constraint_drop_vars(bset->ineq[i]+1+bset->dim->nparam+first, n,
-				     (bset->dim->n_out-first-n)+bset->extra);
-
-	for (i = 0; i < bset->n_div; ++i)
-		constraint_drop_vars(bset->div[i]+1+1+bset->dim->nparam+first, n,
-				     (bset->dim->n_out-first-n)+bset->extra);
-
-	bset->dim = isl_dim_drop_outputs(bset->dim, first, n);
-	if (!bset->dim)
-		goto error;
-
-	ISL_F_CLR(bset, ISL_BASIC_SET_NORMALIZED);
-	bset = isl_basic_set_simplify(bset);
-	return isl_basic_set_finalize(bset);
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-struct isl_set *isl_set_drop_dims(
-		struct isl_set *set, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!set)
-		goto error;
-
-	isl_assert(set->ctx, first + n <= set->dim->n_out, goto error);
-
-	if (n == 0 && !isl_dim_get_tuple_name(set->dim, isl_dim_set))
-		return set;
-	set = isl_set_cow(set);
-	if (!set)
-		goto error;
-	set->dim = isl_dim_drop_outputs(set->dim, first, n);
-	if (!set->dim)
-		goto error;
-
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_basic_set_drop_dims(set->p[i], first, n);
-		if (!set->p[i])
-			goto error;
-	}
-
-	ISL_F_CLR(set, ISL_SET_NORMALIZED);
-	return set;
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-/* Move "n" divs starting at "first" to the end of the list of divs.
- */
-static struct isl_basic_map *move_divs_last(struct isl_basic_map *bmap,
-	unsigned first, unsigned n)
-{
-	isl_int **div;
-	int i;
-
-	if (first + n == bmap->n_div)
-		return bmap;
-
-	div = isl_alloc_array(bmap->ctx, isl_int *, n);
-	if (!div)
-		goto error;
-	for (i = 0; i < n; ++i)
-		div[i] = bmap->div[first + i];
-	for (i = 0; i < bmap->n_div - first - n; ++i)
-		bmap->div[first + i] = bmap->div[first + n + i];
-	for (i = 0; i < n; ++i)
-		bmap->div[bmap->n_div - n + i] = div[i];
-	free(div);
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Drop "n" dimensions of type "type" starting at "first".
- *
- * In principle, this frees up some extra variables as the number
- * of columns remains constant, but we would have to extend
- * the div array too as the number of rows in this array is assumed
- * to be equal to extra.
- */
-struct isl_basic_map *isl_basic_map_drop(struct isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-	unsigned dim;
-	unsigned offset;
-	unsigned left;
-
-	if (!bmap)
-		goto error;
-
-	dim = isl_basic_map_dim(bmap, type);
-	isl_assert(bmap->ctx, first + n <= dim, goto error);
-
-	if (n == 0 && !isl_dim_get_tuple_name(bmap->dim, type))
-		return bmap;
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-
-	offset = isl_basic_map_offset(bmap, type) + first;
-	left = isl_basic_map_total_dim(bmap) - (offset - 1) - n;
-	for (i = 0; i < bmap->n_eq; ++i)
-		constraint_drop_vars(bmap->eq[i]+offset, n, left);
-
-	for (i = 0; i < bmap->n_ineq; ++i)
-		constraint_drop_vars(bmap->ineq[i]+offset, n, left);
-
-	for (i = 0; i < bmap->n_div; ++i)
-		constraint_drop_vars(bmap->div[i]+1+offset, n, left);
-
-	if (type == isl_dim_div) {
-		bmap = move_divs_last(bmap, first, n);
-		if (!bmap)
-			goto error;
-		isl_basic_map_free_div(bmap, n);
-	} else
-		bmap->dim = isl_dim_drop(bmap->dim, type, first, n);
-	if (!bmap->dim)
-		goto error;
-
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-	bmap = isl_basic_map_simplify(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_drop(__isl_take isl_basic_set *bset,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	return (isl_basic_set *)isl_basic_map_drop((isl_basic_map *)bset,
-							type, first, n);
-}
-
-struct isl_basic_map *isl_basic_map_drop_inputs(
-		struct isl_basic_map *bmap, unsigned first, unsigned n)
-{
-	return isl_basic_map_drop(bmap, isl_dim_in, first, n);
-}
-
-struct isl_map *isl_map_drop(struct isl_map *map,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!map)
-		goto error;
-
-	isl_assert(map->ctx, first + n <= isl_map_dim(map, type), goto error);
-
-	if (n == 0 && !isl_dim_get_tuple_name(map->dim, type))
-		return map;
-	map = isl_map_cow(map);
-	if (!map)
-		goto error;
-	map->dim = isl_dim_drop(map->dim, type, first, n);
-	if (!map->dim)
-		goto error;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_drop(map->p[i], type, first, n);
-		if (!map->p[i])
-			goto error;
-	}
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-struct isl_set *isl_set_drop(struct isl_set *set,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	return (isl_set *)isl_map_drop((isl_map *)set, type, first, n);
-}
-
-struct isl_map *isl_map_drop_inputs(
-		struct isl_map *map, unsigned first, unsigned n)
-{
-	return isl_map_drop(map, isl_dim_in, first, n);
-}
-
-/*
- * We don't cow, as the div is assumed to be redundant.
- */
-static struct isl_basic_map *isl_basic_map_drop_div(
-		struct isl_basic_map *bmap, unsigned div)
-{
-	int i;
-	unsigned pos;
-
-	if (!bmap)
-		goto error;
-
-	pos = 1 + isl_dim_total(bmap->dim) + div;
-
-	isl_assert(bmap->ctx, div < bmap->n_div, goto error);
-
-	for (i = 0; i < bmap->n_eq; ++i)
-		constraint_drop_vars(bmap->eq[i]+pos, 1, bmap->extra-div-1);
-
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		if (!isl_int_is_zero(bmap->ineq[i][pos])) {
-			isl_basic_map_drop_inequality(bmap, i);
-			--i;
-			continue;
-		}
-		constraint_drop_vars(bmap->ineq[i]+pos, 1, bmap->extra-div-1);
-	}
-
-	for (i = 0; i < bmap->n_div; ++i)
-		constraint_drop_vars(bmap->div[i]+1+pos, 1, bmap->extra-div-1);
-
-	if (div != bmap->n_div - 1) {
-		int j;
-		isl_int *t = bmap->div[div];
-
-		for (j = div; j < bmap->n_div - 1; ++j)
-			bmap->div[j] = bmap->div[j+1];
-
-		bmap->div[bmap->n_div - 1] = t;
-	}
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-	isl_basic_map_free_div(bmap, 1);
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_map *isl_basic_map_normalize_constraints(
-	struct isl_basic_map *bmap)
-{
-	int i;
-	isl_int gcd;
-	unsigned total = isl_basic_map_total_dim(bmap);
-
-	if (!bmap)
-		return NULL;
-
-	isl_int_init(gcd);
-	for (i = bmap->n_eq - 1; i >= 0; --i) {
-		isl_seq_gcd(bmap->eq[i]+1, total, &gcd);
-		if (isl_int_is_zero(gcd)) {
-			if (!isl_int_is_zero(bmap->eq[i][0])) {
-				bmap = isl_basic_map_set_to_empty(bmap);
-				break;
-			}
-			isl_basic_map_drop_equality(bmap, i);
-			continue;
-		}
-		if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL))
-			isl_int_gcd(gcd, gcd, bmap->eq[i][0]);
-		if (isl_int_is_one(gcd))
-			continue;
-		if (!isl_int_is_divisible_by(bmap->eq[i][0], gcd)) {
-			bmap = isl_basic_map_set_to_empty(bmap);
-			break;
-		}
-		isl_seq_scale_down(bmap->eq[i], bmap->eq[i], gcd, 1+total);
-	}
-
-	for (i = bmap->n_ineq - 1; i >= 0; --i) {
-		isl_seq_gcd(bmap->ineq[i]+1, total, &gcd);
-		if (isl_int_is_zero(gcd)) {
-			if (isl_int_is_neg(bmap->ineq[i][0])) {
-				bmap = isl_basic_map_set_to_empty(bmap);
-				break;
-			}
-			isl_basic_map_drop_inequality(bmap, i);
-			continue;
-		}
-		if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL))
-			isl_int_gcd(gcd, gcd, bmap->ineq[i][0]);
-		if (isl_int_is_one(gcd))
-			continue;
-		isl_int_fdiv_q(bmap->ineq[i][0], bmap->ineq[i][0], gcd);
-		isl_seq_scale_down(bmap->ineq[i]+1, bmap->ineq[i]+1, gcd, total);
-	}
-	isl_int_clear(gcd);
-
-	return bmap;
-}
-
-struct isl_basic_set *isl_basic_set_normalize_constraints(
-	struct isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)isl_basic_map_normalize_constraints(
-		(struct isl_basic_map *)bset);
-}
-
-/* Assumes divs have been ordered if keep_divs is set.
- */
-static void eliminate_var_using_equality(struct isl_basic_map *bmap,
-	unsigned pos, isl_int *eq, int keep_divs, int *progress)
-{
-	unsigned total;
-	int k;
-	int last_div;
-
-	total = isl_basic_map_total_dim(bmap);
-	last_div = isl_seq_last_non_zero(eq + 1 + isl_dim_total(bmap->dim),
-						bmap->n_div);
-	for (k = 0; k < bmap->n_eq; ++k) {
-		if (bmap->eq[k] == eq)
-			continue;
-		if (isl_int_is_zero(bmap->eq[k][1+pos]))
-			continue;
-		if (progress)
-			*progress = 1;
-		isl_seq_elim(bmap->eq[k], eq, 1+pos, 1+total, NULL);
-		isl_seq_normalize(bmap->ctx, bmap->eq[k], 1 + total);
-	}
-
-	for (k = 0; k < bmap->n_ineq; ++k) {
-		if (isl_int_is_zero(bmap->ineq[k][1+pos]))
-			continue;
-		if (progress)
-			*progress = 1;
-		isl_seq_elim(bmap->ineq[k], eq, 1+pos, 1+total, NULL);
-		isl_seq_normalize(bmap->ctx, bmap->ineq[k], 1 + total);
-		ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-	}
-
-	for (k = 0; k < bmap->n_div; ++k) {
-		if (isl_int_is_zero(bmap->div[k][0]))
-			continue;
-		if (isl_int_is_zero(bmap->div[k][1+1+pos]))
-			continue;
-		if (progress)
-			*progress = 1;
-		/* We need to be careful about circular definitions,
-		 * so for now we just remove the definition of div k
-		 * if the equality contains any divs.
-		 * If keep_divs is set, then the divs have been ordered
-		 * and we can keep the definition as long as the result
-		 * is still ordered.
-		 */
-		if (last_div == -1 || (keep_divs && last_div < k))
-			isl_seq_elim(bmap->div[k]+1, eq,
-					1+pos, 1+total, &bmap->div[k][0]);
-		else
-			isl_seq_clr(bmap->div[k], 1 + total);
-		ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-	}
-}
-
-/* Assumes divs have been ordered if keep_divs is set.
- */
-static void eliminate_div(struct isl_basic_map *bmap, isl_int *eq,
-	unsigned div, int keep_divs)
-{
-	unsigned pos = isl_dim_total(bmap->dim) + div;
-
-	eliminate_var_using_equality(bmap, pos, eq, keep_divs, NULL);
-
-	isl_basic_map_drop_div(bmap, div);
-}
-
-/* Check if elimination of div "div" using equality "eq" would not
- * result in a div depending on a later div.
- */
-static int ok_to_eliminate_div(struct isl_basic_map *bmap, isl_int *eq,
-	unsigned div)
-{
-	int k;
-	int last_div;
-	unsigned pos = isl_dim_total(bmap->dim) + div;
-
-	last_div = isl_seq_last_non_zero(eq + 1 + isl_dim_total(bmap->dim),
-						bmap->n_div);
-	if (last_div < 0 || last_div <= div)
-		return 1;
-
-	for (k = 0; k <= last_div; ++k) {
-		if (isl_int_is_zero(bmap->div[k][0]))
-			return 1;
-		if (!isl_int_is_zero(bmap->div[k][1 + 1 + pos]))
-			return 0;
-	}
-
-	return 1;
-}
-
-/* Elimininate divs based on equalities
- */
-static struct isl_basic_map *eliminate_divs_eq(
-		struct isl_basic_map *bmap, int *progress)
-{
-	int d;
-	int i;
-	int modified = 0;
-	unsigned off;
-
-	bmap = isl_basic_map_order_divs(bmap);
-
-	if (!bmap)
-		return NULL;
-
-	off = 1 + isl_dim_total(bmap->dim);
-
-	for (d = bmap->n_div - 1; d >= 0 ; --d) {
-		for (i = 0; i < bmap->n_eq; ++i) {
-			if (!isl_int_is_one(bmap->eq[i][off + d]) &&
-			    !isl_int_is_negone(bmap->eq[i][off + d]))
-				continue;
-			if (!ok_to_eliminate_div(bmap, bmap->eq[i], d))
-				continue;
-			modified = 1;
-			*progress = 1;
-			eliminate_div(bmap, bmap->eq[i], d, 1);
-			isl_basic_map_drop_equality(bmap, i);
-			break;
-		}
-	}
-	if (modified)
-		return eliminate_divs_eq(bmap, progress);
-	return bmap;
-}
-
-/* Elimininate divs based on inequalities
- */
-static struct isl_basic_map *eliminate_divs_ineq(
-		struct isl_basic_map *bmap, int *progress)
-{
-	int d;
-	int i;
-	unsigned off;
-	struct isl_ctx *ctx;
-
-	if (!bmap)
-		return NULL;
-
-	ctx = bmap->ctx;
-	off = 1 + isl_dim_total(bmap->dim);
-
-	for (d = bmap->n_div - 1; d >= 0 ; --d) {
-		for (i = 0; i < bmap->n_eq; ++i)
-			if (!isl_int_is_zero(bmap->eq[i][off + d]))
-				break;
-		if (i < bmap->n_eq)
-			continue;
-		for (i = 0; i < bmap->n_ineq; ++i)
-			if (isl_int_abs_gt(bmap->ineq[i][off + d], ctx->one))
-				break;
-		if (i < bmap->n_ineq)
-			continue;
-		*progress = 1;
-		bmap = isl_basic_map_eliminate_vars(bmap, (off-1)+d, 1);
-		if (!bmap || ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY))
-			break;
-		bmap = isl_basic_map_drop_div(bmap, d);
-		if (!bmap)
-			break;
-	}
-	return bmap;
-}
-
-struct isl_basic_map *isl_basic_map_gauss(
-	struct isl_basic_map *bmap, int *progress)
-{
-	int k;
-	int done;
-	int last_var;
-	unsigned total_var;
-	unsigned total;
-
-	bmap = isl_basic_map_order_divs(bmap);
-
-	if (!bmap)
-		return NULL;
-
-	total = isl_basic_map_total_dim(bmap);
-	total_var = total - bmap->n_div;
-
-	last_var = total - 1;
-	for (done = 0; done < bmap->n_eq; ++done) {
-		for (; last_var >= 0; --last_var) {
-			for (k = done; k < bmap->n_eq; ++k)
-				if (!isl_int_is_zero(bmap->eq[k][1+last_var]))
-					break;
-			if (k < bmap->n_eq)
-				break;
-		}
-		if (last_var < 0)
-			break;
-		if (k != done)
-			swap_equality(bmap, k, done);
-		if (isl_int_is_neg(bmap->eq[done][1+last_var]))
-			isl_seq_neg(bmap->eq[done], bmap->eq[done], 1+total);
-
-		eliminate_var_using_equality(bmap, last_var, bmap->eq[done], 1,
-						progress);
-
-		if (last_var >= total_var &&
-		    isl_int_is_zero(bmap->div[last_var - total_var][0])) {
-			unsigned div = last_var - total_var;
-			isl_seq_neg(bmap->div[div]+1, bmap->eq[done], 1+total);
-			isl_int_set_si(bmap->div[div][1+1+last_var], 0);
-			isl_int_set(bmap->div[div][0],
-				    bmap->eq[done][1+last_var]);
-			ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-		}
-	}
-	if (done == bmap->n_eq)
-		return bmap;
-	for (k = done; k < bmap->n_eq; ++k) {
-		if (isl_int_is_zero(bmap->eq[k][0]))
-			continue;
-		return isl_basic_map_set_to_empty(bmap);
-	}
-	isl_basic_map_free_equality(bmap, bmap->n_eq-done);
-	return bmap;
-}
-
-struct isl_basic_set *isl_basic_set_gauss(
-	struct isl_basic_set *bset, int *progress)
-{
-	return (struct isl_basic_set*)isl_basic_map_gauss(
-			(struct isl_basic_map *)bset, progress);
-}
-
-
-static unsigned int round_up(unsigned int v)
-{
-	int old_v = v;
-
-	while (v) {
-		old_v = v;
-		v ^= v & -v;
-	}
-	return old_v << 1;
-}
-
-static int hash_index(isl_int ***index, unsigned int size, int bits,
-			struct isl_basic_map *bmap, int k)
-{
-	int h;
-	unsigned total = isl_basic_map_total_dim(bmap);
-	uint32_t hash = isl_seq_get_hash_bits(bmap->ineq[k]+1, total, bits);
-	for (h = hash; index[h]; h = (h+1) % size)
-		if (&bmap->ineq[k] != index[h] &&
-		    isl_seq_eq(bmap->ineq[k]+1, index[h][0]+1, total))
-			break;
-	return h;
-}
-
-static int set_hash_index(isl_int ***index, unsigned int size, int bits,
-			  struct isl_basic_set *bset, int k)
-{
-	return hash_index(index, size, bits, (struct isl_basic_map *)bset, k);
-}
-
-/* If we can eliminate more than one div, then we need to make
- * sure we do it from last div to first div, in order not to
- * change the position of the other divs that still need to
- * be removed.
- */
-static struct isl_basic_map *remove_duplicate_divs(
-	struct isl_basic_map *bmap, int *progress)
-{
-	unsigned int size;
-	int *index;
-	int *elim_for;
-	int k, l, h;
-	int bits;
-	struct isl_blk eq;
-	unsigned total_var;
-	unsigned total;
-	struct isl_ctx *ctx;
-
-	if (!bmap || bmap->n_div <= 1)
-		return bmap;
-
-	total_var = isl_dim_total(bmap->dim);
-	total = total_var + bmap->n_div;
-
-	ctx = bmap->ctx;
-	for (k = bmap->n_div - 1; k >= 0; --k)
-		if (!isl_int_is_zero(bmap->div[k][0]))
-			break;
-	if (k <= 0)
-		return bmap;
-
-	elim_for = isl_calloc_array(ctx, int, bmap->n_div);
-	size = round_up(4 * bmap->n_div / 3 - 1);
-	bits = ffs(size) - 1;
-	index = isl_calloc_array(ctx, int, size);
-	if (!index)
-		return bmap;
-	eq = isl_blk_alloc(ctx, 1+total);
-	if (isl_blk_is_error(eq))
-		goto out;
-
-	isl_seq_clr(eq.data, 1+total);
-	index[isl_seq_get_hash_bits(bmap->div[k], 2+total, bits)] = k + 1;
-	for (--k; k >= 0; --k) {
-		uint32_t hash;
-
-		if (isl_int_is_zero(bmap->div[k][0]))
-			continue;
-
-		hash = isl_seq_get_hash_bits(bmap->div[k], 2+total, bits);
-		for (h = hash; index[h]; h = (h+1) % size)
-			if (isl_seq_eq(bmap->div[k],
-				       bmap->div[index[h]-1], 2+total))
-				break;
-		if (index[h]) {
-			*progress = 1;
-			l = index[h] - 1;
-			elim_for[l] = k + 1;
-		}
-		index[h] = k+1;
-	}
-	for (l = bmap->n_div - 1; l >= 0; --l) {
-		if (!elim_for[l])
-			continue;
-		k = elim_for[l] - 1;
-		isl_int_set_si(eq.data[1+total_var+k], -1);
-		isl_int_set_si(eq.data[1+total_var+l], 1);
-		eliminate_div(bmap, eq.data, l, 0);
-		isl_int_set_si(eq.data[1+total_var+k], 0);
-		isl_int_set_si(eq.data[1+total_var+l], 0);
-	}
-
-	isl_blk_free(ctx, eq);
-out:
-	free(index);
-	free(elim_for);
-	return bmap;
-}
-
-static int n_pure_div_eq(struct isl_basic_map *bmap)
-{
-	int i, j;
-	unsigned total;
-
-	total = isl_dim_total(bmap->dim);
-	for (i = 0, j = bmap->n_div-1; i < bmap->n_eq; ++i) {
-		while (j >= 0 && isl_int_is_zero(bmap->eq[i][1 + total + j]))
-			--j;
-		if (j < 0)
-			break;
-		if (isl_seq_first_non_zero(bmap->eq[i] + 1 + total, j) != -1)
-			return 0;
-	}
-	return i;
-}
-
-/* Normalize divs that appear in equalities.
- *
- * In particular, we assume that bmap contains some equalities
- * of the form
- *
- *	a x = m * e_i
- *
- * and we want to replace the set of e_i by a minimal set and
- * such that the new e_i have a canonical representation in terms
- * of the vector x.
- * If any of the equalities involves more than one divs, then
- * we currently simply bail out.
- *
- * Let us first additionally assume that all equalities involve
- * a div.  The equalities then express modulo constraints on the
- * remaining variables and we can use "parameter compression"
- * to find a minimal set of constraints.  The result is a transformation
- *
- *	x = T(x') = x_0 + G x'
- *
- * with G a lower-triangular matrix with all elements below the diagonal
- * non-negative and smaller than the diagonal element on the same row.
- * We first normalize x_0 by making the same property hold in the affine
- * T matrix.
- * The rows i of G with a 1 on the diagonal do not impose any modulo
- * constraint and simply express x_i = x'_i.
- * For each of the remaining rows i, we introduce a div and a corresponding
- * equality.  In particular
- *
- *	g_ii e_j = x_i - g_i(x')
- *
- * where each x'_k is replaced either by x_k (if g_kk = 1) or the
- * corresponding div (if g_kk != 1).
- *
- * If there are any equalities not involving any div, then we
- * first apply a variable compression on the variables x:
- *
- *	x = C x''	x'' = C_2 x
- *
- * and perform the above parameter compression on A C instead of on A.
- * The resulting compression is then of the form
- *
- *	x'' = T(x') = x_0 + G x'
- *
- * and in constructing the new divs and the corresponding equalities,
- * we have to replace each x'', i.e., the x'_k with (g_kk = 1),
- * by the corresponding row from C_2.
- */
-static struct isl_basic_map *normalize_divs(
-	struct isl_basic_map *bmap, int *progress)
-{
-	int i, j, k;
-	int total;
-	int div_eq;
-	struct isl_mat *B;
-	struct isl_vec *d;
-	struct isl_mat *T = NULL;
-	struct isl_mat *C = NULL;
-	struct isl_mat *C2 = NULL;
-	isl_int v;
-	int *pos;
-	int dropped, needed;
-
-	if (!bmap)
-		return NULL;
-
-	if (bmap->n_div == 0)
-		return bmap;
-
-	if (bmap->n_eq == 0)
-		return bmap;
-
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_NORMALIZED_DIVS))
-		return bmap;
-
-	total = isl_dim_total(bmap->dim);
-	div_eq = n_pure_div_eq(bmap);
-	if (div_eq == 0)
-		return bmap;
-
-	if (div_eq < bmap->n_eq) {
-		B = isl_mat_sub_alloc6(bmap->ctx, bmap->eq, div_eq,
-					bmap->n_eq - div_eq, 0, 1 + total);
-		C = isl_mat_variable_compression(B, &C2);
-		if (!C || !C2)
-			goto error;
-		if (C->n_col == 0) {
-			bmap = isl_basic_map_set_to_empty(bmap);
-			isl_mat_free(C);
-			isl_mat_free(C2);
-			goto done;
-		}
-	}
-
-	d = isl_vec_alloc(bmap->ctx, div_eq);
-	if (!d)
-		goto error;
-	for (i = 0, j = bmap->n_div-1; i < div_eq; ++i) {
-		while (j >= 0 && isl_int_is_zero(bmap->eq[i][1 + total + j]))
-			--j;
-		isl_int_set(d->block.data[i], bmap->eq[i][1 + total + j]);
-	}
-	B = isl_mat_sub_alloc6(bmap->ctx, bmap->eq, 0, div_eq, 0, 1 + total);
-
-	if (C) {
-		B = isl_mat_product(B, C);
-		C = NULL;
-	}
-
-	T = isl_mat_parameter_compression(B, d);
-	if (!T)
-		goto error;
-	if (T->n_col == 0) {
-		bmap = isl_basic_map_set_to_empty(bmap);
-		isl_mat_free(C2);
-		isl_mat_free(T);
-		goto done;
-	}
-	isl_int_init(v);
-	for (i = 0; i < T->n_row - 1; ++i) {
-		isl_int_fdiv_q(v, T->row[1 + i][0], T->row[1 + i][1 + i]);
-		if (isl_int_is_zero(v))
-			continue;
-		isl_mat_col_submul(T, 0, v, 1 + i);
-	}
-	isl_int_clear(v);
-	pos = isl_alloc_array(bmap->ctx, int, T->n_row);
-	if (!pos)
-		goto error;
-	/* We have to be careful because dropping equalities may reorder them */
-	dropped = 0;
-	for (j = bmap->n_div - 1; j >= 0; --j) {
-		for (i = 0; i < bmap->n_eq; ++i)
-			if (!isl_int_is_zero(bmap->eq[i][1 + total + j]))
-				break;
-		if (i < bmap->n_eq) {
-			bmap = isl_basic_map_drop_div(bmap, j);
-			isl_basic_map_drop_equality(bmap, i);
-			++dropped;
-		}
-	}
-	pos[0] = 0;
-	needed = 0;
-	for (i = 1; i < T->n_row; ++i) {
-		if (isl_int_is_one(T->row[i][i]))
-			pos[i] = i;
-		else
-			needed++;
-	}
-	if (needed > dropped) {
-		bmap = isl_basic_map_extend_dim(bmap, isl_dim_copy(bmap->dim),
-				needed, needed, 0);
-		if (!bmap)
-			goto error;
-	}
-	for (i = 1; i < T->n_row; ++i) {
-		if (isl_int_is_one(T->row[i][i]))
-			continue;
-		k = isl_basic_map_alloc_div(bmap);
-		pos[i] = 1 + total + k;
-		isl_seq_clr(bmap->div[k] + 1, 1 + total + bmap->n_div);
-		isl_int_set(bmap->div[k][0], T->row[i][i]);
-		if (C2)
-			isl_seq_cpy(bmap->div[k] + 1, C2->row[i], 1 + total);
-		else
-			isl_int_set_si(bmap->div[k][1 + i], 1);
-		for (j = 0; j < i; ++j) {
-			if (isl_int_is_zero(T->row[i][j]))
-				continue;
-			if (pos[j] < T->n_row && C2)
-				isl_seq_submul(bmap->div[k] + 1, T->row[i][j],
-						C2->row[pos[j]], 1 + total);
-			else
-				isl_int_neg(bmap->div[k][1 + pos[j]],
-								T->row[i][j]);
-		}
-		j = isl_basic_map_alloc_equality(bmap);
-		isl_seq_neg(bmap->eq[j], bmap->div[k]+1, 1+total+bmap->n_div);
-		isl_int_set(bmap->eq[j][pos[i]], bmap->div[k][0]);
-	}
-	free(pos);
-	isl_mat_free(C2);
-	isl_mat_free(T);
-
-	if (progress)
-		*progress = 1;
-done:
-	ISL_F_SET(bmap, ISL_BASIC_MAP_NORMALIZED_DIVS);
-
-	return bmap;
-error:
-	isl_mat_free(C);
-	isl_mat_free(C2);
-	isl_mat_free(T);
-	return bmap;
-}
-
-static struct isl_basic_map *set_div_from_lower_bound(
-	struct isl_basic_map *bmap, int div, int ineq)
-{
-	unsigned total = 1 + isl_dim_total(bmap->dim);
-
-	isl_seq_neg(bmap->div[div] + 1, bmap->ineq[ineq], total + bmap->n_div);
-	isl_int_set(bmap->div[div][0], bmap->ineq[ineq][total + div]);
-	isl_int_add(bmap->div[div][1], bmap->div[div][1], bmap->div[div][0]);
-	isl_int_sub_ui(bmap->div[div][1], bmap->div[div][1], 1);
-	isl_int_set_si(bmap->div[div][1 + total + div], 0);
-
-	return bmap;
-}
-
-/* Check whether it is ok to define a div based on an inequality.
- * To avoid the introduction of circular definitions of divs, we
- * do not allow such a definition if the resulting expression would refer to
- * any other undefined divs or if any known div is defined in
- * terms of the unknown div.
- */
-static int ok_to_set_div_from_bound(struct isl_basic_map *bmap,
-	int div, int ineq)
-{
-	int j;
-	unsigned total = 1 + isl_dim_total(bmap->dim);
-
-	/* Not defined in terms of unknown divs */
-	for (j = 0; j < bmap->n_div; ++j) {
-		if (div == j)
-			continue;
-		if (isl_int_is_zero(bmap->ineq[ineq][total + j]))
-			continue;
-		if (isl_int_is_zero(bmap->div[j][0]))
-			return 0;
-	}
-
-	/* No other div defined in terms of this one => avoid loops */
-	for (j = 0; j < bmap->n_div; ++j) {
-		if (div == j)
-			continue;
-		if (isl_int_is_zero(bmap->div[j][0]))
-			continue;
-		if (!isl_int_is_zero(bmap->div[j][1 + total + div]))
-			return 0;
-	}
-
-	return 1;
-}
-
-/* Given two constraints "k" and "l" that are opposite to each other,
- * except for the constant term, check if we can use them
- * to obtain an expression for one of the hitherto unknown divs.
- * "sum" is the sum of the constant terms of the constraints.
- * If this sum is strictly smaller than the coefficient of one
- * of the divs, then this pair can be used define the div.
- * To avoid the introduction of circular definitions of divs, we
- * do not use the pair if the resulting expression would refer to
- * any other undefined divs or if any known div is defined in
- * terms of the unknown div.
- */
-static struct isl_basic_map *check_for_div_constraints(
-	struct isl_basic_map *bmap, int k, int l, isl_int sum, int *progress)
-{
-	int i;
-	unsigned total = 1 + isl_dim_total(bmap->dim);
-
-	for (i = 0; i < bmap->n_div; ++i) {
-		if (!isl_int_is_zero(bmap->div[i][0]))
-			continue;
-		if (isl_int_is_zero(bmap->ineq[k][total + i]))
-			continue;
-		if (isl_int_abs_ge(sum, bmap->ineq[k][total + i]))
-			continue;
-		if (!ok_to_set_div_from_bound(bmap, i, k))
-			break;
-		if (isl_int_is_pos(bmap->ineq[k][total + i]))
-			bmap = set_div_from_lower_bound(bmap, i, k);
-		else
-			bmap = set_div_from_lower_bound(bmap, i, l);
-		if (progress)
-			*progress = 1;
-		break;
-	}
-	return bmap;
-}
-
-static struct isl_basic_map *remove_duplicate_constraints(
-	struct isl_basic_map *bmap, int *progress, int detect_divs)
-{
-	unsigned int size;
-	isl_int ***index;
-	int k, l, h;
-	int bits;
-	unsigned total = isl_basic_map_total_dim(bmap);
-	isl_int sum;
-	isl_ctx *ctx;
-
-	if (!bmap || bmap->n_ineq <= 1)
-		return bmap;
-
-	size = round_up(4 * (bmap->n_ineq+1) / 3 - 1);
-	bits = ffs(size) - 1;
-	ctx = isl_basic_map_get_ctx(bmap);
-	index = isl_calloc_array(ctx, isl_int **, size);
-	if (!index)
-		return bmap;
-
-	index[isl_seq_get_hash_bits(bmap->ineq[0]+1, total, bits)] = &bmap->ineq[0];
-	for (k = 1; k < bmap->n_ineq; ++k) {
-		h = hash_index(index, size, bits, bmap, k);
-		if (!index[h]) {
-			index[h] = &bmap->ineq[k];
-			continue;
-		}
-		if (progress)
-			*progress = 1;
-		l = index[h] - &bmap->ineq[0];
-		if (isl_int_lt(bmap->ineq[k][0], bmap->ineq[l][0]))
-			swap_inequality(bmap, k, l);
-		isl_basic_map_drop_inequality(bmap, k);
-		--k;
-	}
-	isl_int_init(sum);
-	for (k = 0; k < bmap->n_ineq-1; ++k) {
-		isl_seq_neg(bmap->ineq[k]+1, bmap->ineq[k]+1, total);
-		h = hash_index(index, size, bits, bmap, k);
-		isl_seq_neg(bmap->ineq[k]+1, bmap->ineq[k]+1, total);
-		if (!index[h])
-			continue;
-		l = index[h] - &bmap->ineq[0];
-		isl_int_add(sum, bmap->ineq[k][0], bmap->ineq[l][0]);
-		if (isl_int_is_pos(sum)) {
-			if (detect_divs)
-				bmap = check_for_div_constraints(bmap, k, l,
-								 sum, progress);
-			continue;
-		}
-		if (isl_int_is_zero(sum)) {
-			/* We need to break out of the loop after these
-			 * changes since the contents of the hash
-			 * will no longer be valid.
-			 * Plus, we probably we want to regauss first.
-			 */
-			if (progress)
-				*progress = 1;
-			isl_basic_map_drop_inequality(bmap, l);
-			isl_basic_map_inequality_to_equality(bmap, k);
-		} else
-			bmap = isl_basic_map_set_to_empty(bmap);
-		break;
-	}
-	isl_int_clear(sum);
-
-	free(index);
-	return bmap;
-}
-
-
-struct isl_basic_map *isl_basic_map_simplify(struct isl_basic_map *bmap)
-{
-	int progress = 1;
-	if (!bmap)
-		return NULL;
-	while (progress) {
-		progress = 0;
-		bmap = isl_basic_map_normalize_constraints(bmap);
-		bmap = remove_duplicate_divs(bmap, &progress);
-		bmap = eliminate_divs_eq(bmap, &progress);
-		bmap = eliminate_divs_ineq(bmap, &progress);
-		bmap = isl_basic_map_gauss(bmap, &progress);
-		/* requires equalities in normal form */
-		bmap = normalize_divs(bmap, &progress);
-		bmap = remove_duplicate_constraints(bmap, &progress, 1);
-	}
-	return bmap;
-}
-
-struct isl_basic_set *isl_basic_set_simplify(struct isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_simplify((struct isl_basic_map *)bset);
-}
-
-
-int isl_basic_map_is_div_constraint(__isl_keep isl_basic_map *bmap,
-	isl_int *constraint, unsigned div)
-{
-	unsigned pos;
-
-	if (!bmap)
-		return -1;
-
-	pos = 1 + isl_dim_total(bmap->dim) + div;
-
-	if (isl_int_eq(constraint[pos], bmap->div[div][0])) {
-		int neg;
-		isl_int_sub(bmap->div[div][1],
-				bmap->div[div][1], bmap->div[div][0]);
-		isl_int_add_ui(bmap->div[div][1], bmap->div[div][1], 1);
-		neg = isl_seq_is_neg(constraint, bmap->div[div]+1, pos);
-		isl_int_sub_ui(bmap->div[div][1], bmap->div[div][1], 1);
-		isl_int_add(bmap->div[div][1],
-				bmap->div[div][1], bmap->div[div][0]);
-		if (!neg)
-			return 0;
-		if (isl_seq_first_non_zero(constraint+pos+1,
-					    bmap->n_div-div-1) != -1)
-			return 0;
-	} else if (isl_int_abs_eq(constraint[pos], bmap->div[div][0])) {
-		if (!isl_seq_eq(constraint, bmap->div[div]+1, pos))
-			return 0;
-		if (isl_seq_first_non_zero(constraint+pos+1,
-					    bmap->n_div-div-1) != -1)
-			return 0;
-	} else
-		return 0;
-
-	return 1;
-}
-
-
-/* If the only constraints a div d=floor(f/m)
- * appears in are its two defining constraints
- *
- *	f - m d >=0
- *	-(f - (m - 1)) + m d >= 0
- *
- * then it can safely be removed.
- */
-static int div_is_redundant(struct isl_basic_map *bmap, int div)
-{
-	int i;
-	unsigned pos = 1 + isl_dim_total(bmap->dim) + div;
-
-	for (i = 0; i < bmap->n_eq; ++i)
-		if (!isl_int_is_zero(bmap->eq[i][pos]))
-			return 0;
-
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		if (isl_int_is_zero(bmap->ineq[i][pos]))
-			continue;
-		if (!isl_basic_map_is_div_constraint(bmap, bmap->ineq[i], div))
-			return 0;
-	}
-
-	for (i = 0; i < bmap->n_div; ++i)
-		if (!isl_int_is_zero(bmap->div[i][1+pos]))
-			return 0;
-
-	return 1;
-}
-
-/*
- * Remove divs that don't occur in any of the constraints or other divs.
- * These can arise when dropping some of the variables in a quast
- * returned by piplib.
- */
-static struct isl_basic_map *remove_redundant_divs(struct isl_basic_map *bmap)
-{
-	int i;
-
-	if (!bmap)
-		return NULL;
-
-	for (i = bmap->n_div-1; i >= 0; --i) {
-		if (!div_is_redundant(bmap, i))
-			continue;
-		bmap = isl_basic_map_drop_div(bmap, i);
-	}
-	return bmap;
-}
-
-struct isl_basic_map *isl_basic_map_finalize(struct isl_basic_map *bmap)
-{
-	bmap = remove_redundant_divs(bmap);
-	if (!bmap)
-		return NULL;
-	ISL_F_SET(bmap, ISL_BASIC_SET_FINAL);
-	return bmap;
-}
-
-struct isl_basic_set *isl_basic_set_finalize(struct isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_finalize((struct isl_basic_map *)bset);
-}
-
-struct isl_set *isl_set_finalize(struct isl_set *set)
-{
-	int i;
-
-	if (!set)
-		return NULL;
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_basic_set_finalize(set->p[i]);
-		if (!set->p[i])
-			goto error;
-	}
-	return set;
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-struct isl_map *isl_map_finalize(struct isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_finalize(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-
-/* Remove definition of any div that is defined in terms of the given variable.
- * The div itself is not removed.  Functions such as
- * eliminate_divs_ineq depend on the other divs remaining in place.
- */
-static struct isl_basic_map *remove_dependent_vars(struct isl_basic_map *bmap,
-									int pos)
-{
-	int i;
-
-	for (i = 0; i < bmap->n_div; ++i) {
-		if (isl_int_is_zero(bmap->div[i][0]))
-			continue;
-		if (isl_int_is_zero(bmap->div[i][1+1+pos]))
-			continue;
-		isl_int_set_si(bmap->div[i][0], 0);
-	}
-	return bmap;
-}
-
-/* Eliminate the specified variables from the constraints using
- * Fourier-Motzkin.  The variables themselves are not removed.
- */
-struct isl_basic_map *isl_basic_map_eliminate_vars(
-	struct isl_basic_map *bmap, unsigned pos, unsigned n)
-{
-	int d;
-	int i, j, k;
-	unsigned total;
-
-	if (n == 0)
-		return bmap;
-	if (!bmap)
-		return NULL;
-	total = isl_basic_map_total_dim(bmap);
-
-	bmap = isl_basic_map_cow(bmap);
-	for (d = pos + n - 1; d >= 0 && d >= pos; --d)
-		bmap = remove_dependent_vars(bmap, d);
-
-	for (d = pos + n - 1;
-	     d >= 0 && d >= total - bmap->n_div && d >= pos; --d)
-		isl_seq_clr(bmap->div[d-(total-bmap->n_div)], 2+total);
-	for (d = pos + n - 1; d >= 0 && d >= pos; --d) {
-		int n_lower, n_upper;
-		if (!bmap)
-			return NULL;
-		for (i = 0; i < bmap->n_eq; ++i) {
-			if (isl_int_is_zero(bmap->eq[i][1+d]))
-				continue;
-			eliminate_var_using_equality(bmap, d, bmap->eq[i], 0, NULL);
-			isl_basic_map_drop_equality(bmap, i);
-			break;
-		}
-		if (i < bmap->n_eq)
-			continue;
-		n_lower = 0;
-		n_upper = 0;
-		for (i = 0; i < bmap->n_ineq; ++i) {
-			if (isl_int_is_pos(bmap->ineq[i][1+d]))
-				n_lower++;
-			else if (isl_int_is_neg(bmap->ineq[i][1+d]))
-				n_upper++;
-		}
-		bmap = isl_basic_map_extend_constraints(bmap,
-				0, n_lower * n_upper);
-		if (!bmap)
-			goto error;
-		for (i = bmap->n_ineq - 1; i >= 0; --i) {
-			int last;
-			if (isl_int_is_zero(bmap->ineq[i][1+d]))
-				continue;
-			last = -1;
-			for (j = 0; j < i; ++j) {
-				if (isl_int_is_zero(bmap->ineq[j][1+d]))
-					continue;
-				last = j;
-				if (isl_int_sgn(bmap->ineq[i][1+d]) ==
-				    isl_int_sgn(bmap->ineq[j][1+d]))
-					continue;
-				k = isl_basic_map_alloc_inequality(bmap);
-				if (k < 0)
-					goto error;
-				isl_seq_cpy(bmap->ineq[k], bmap->ineq[i],
-						1+total);
-				isl_seq_elim(bmap->ineq[k], bmap->ineq[j],
-						1+d, 1+total, NULL);
-			}
-			isl_basic_map_drop_inequality(bmap, i);
-			i = last + 1;
-		}
-		if (n_lower > 0 && n_upper > 0) {
-			bmap = isl_basic_map_normalize_constraints(bmap);
-			bmap = remove_duplicate_constraints(bmap, NULL, 0);
-			bmap = isl_basic_map_gauss(bmap, NULL);
-			bmap = isl_basic_map_remove_redundancies(bmap);
-			if (!bmap)
-				goto error;
-			if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY))
-				break;
-		}
-	}
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_eliminate_vars(
-	struct isl_basic_set *bset, unsigned pos, unsigned n)
-{
-	return (struct isl_basic_set *)isl_basic_map_eliminate_vars(
-			(struct isl_basic_map *)bset, pos, n);
-}
-
-/* Don't assume equalities are in order, because align_divs
- * may have changed the order of the divs.
- */
-static void compute_elimination_index(struct isl_basic_map *bmap, int *elim)
-{
-	int d, i;
-	unsigned total;
-
-	total = isl_dim_total(bmap->dim);
-	for (d = 0; d < total; ++d)
-		elim[d] = -1;
-	for (i = 0; i < bmap->n_eq; ++i) {
-		for (d = total - 1; d >= 0; --d) {
-			if (isl_int_is_zero(bmap->eq[i][1+d]))
-				continue;
-			elim[d] = i;
-			break;
-		}
-	}
-}
-
-static void set_compute_elimination_index(struct isl_basic_set *bset, int *elim)
-{
-	compute_elimination_index((struct isl_basic_map *)bset, elim);
-}
-
-static int reduced_using_equalities(isl_int *dst, isl_int *src,
-	struct isl_basic_map *bmap, int *elim)
-{
-	int d;
-	int copied = 0;
-	unsigned total;
-
-	total = isl_dim_total(bmap->dim);
-	for (d = total - 1; d >= 0; --d) {
-		if (isl_int_is_zero(src[1+d]))
-			continue;
-		if (elim[d] == -1)
-			continue;
-		if (!copied) {
-			isl_seq_cpy(dst, src, 1 + total);
-			copied = 1;
-		}
-		isl_seq_elim(dst, bmap->eq[elim[d]], 1 + d, 1 + total, NULL);
-	}
-	return copied;
-}
-
-static int set_reduced_using_equalities(isl_int *dst, isl_int *src,
-	struct isl_basic_set *bset, int *elim)
-{
-	return reduced_using_equalities(dst, src,
-					(struct isl_basic_map *)bset, elim);
-}
-
-static struct isl_basic_set *isl_basic_set_reduce_using_equalities(
-	struct isl_basic_set *bset, struct isl_basic_set *context)
-{
-	int i;
-	int *elim;
-
-	if (!bset || !context)
-		goto error;
-
-	if (context->n_eq == 0) {
-		isl_basic_set_free(context);
-		return bset;
-	}
-
-	bset = isl_basic_set_cow(bset);
-	if (!bset)
-		goto error;
-
-	elim = isl_alloc_array(bset->ctx, int, isl_basic_set_n_dim(bset));
-	if (!elim)
-		goto error;
-	set_compute_elimination_index(context, elim);
-	for (i = 0; i < bset->n_eq; ++i)
-		set_reduced_using_equalities(bset->eq[i], bset->eq[i],
-							context, elim);
-	for (i = 0; i < bset->n_ineq; ++i)
-		set_reduced_using_equalities(bset->ineq[i], bset->ineq[i],
-							context, elim);
-	isl_basic_set_free(context);
-	free(elim);
-	bset = isl_basic_set_simplify(bset);
-	bset = isl_basic_set_finalize(bset);
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	isl_basic_set_free(context);
-	return NULL;
-}
-
-static struct isl_basic_set *remove_shifted_constraints(
-	struct isl_basic_set *bset, struct isl_basic_set *context)
-{
-	unsigned int size;
-	isl_int ***index;
-	int bits;
-	int k, h, l;
-	isl_ctx *ctx;
-
-	if (!bset)
-		return NULL;
-
-	size = round_up(4 * (context->n_ineq+1) / 3 - 1);
-	bits = ffs(size) - 1;
-	ctx = isl_basic_set_get_ctx(bset);
-	index = isl_calloc_array(ctx, isl_int **, size);
-	if (!index)
-		return bset;
-
-	for (k = 0; k < context->n_ineq; ++k) {
-		h = set_hash_index(index, size, bits, context, k);
-		index[h] = &context->ineq[k];
-	}
-	for (k = 0; k < bset->n_ineq; ++k) {
-		h = set_hash_index(index, size, bits, bset, k);
-		if (!index[h])
-			continue;
-		l = index[h] - &context->ineq[0];
-		if (isl_int_lt(bset->ineq[k][0], context->ineq[l][0]))
-			continue;
-		bset = isl_basic_set_cow(bset);
-		if (!bset)
-			goto error;
-		isl_basic_set_drop_inequality(bset, k);
-		--k;
-	}
-	free(index);
-	return bset;
-error:
-	free(index);
-	return bset;
-}
-
-/* Remove all information from bset that is redundant in the context
- * of context.  Both bset and context are assumed to be full-dimensional.
- *
- * We first * remove the inequalities from "bset"
- * that are obviously redundant with respect to some inequality in "context".
- *
- * If there are any inequalities left, we construct a tableau for
- * the context and then add the inequalities of "bset".
- * Before adding these inequalities, we freeze all constraints such that
- * they won't be considered redundant in terms of the constraints of "bset".
- * Then we detect all redundant constraints (among the
- * constraints that weren't frozen), first by checking for redundancy in the
- * the tableau and then by checking if replacing a constraint by its negation
- * would lead to an empty set.  This last step is fairly expensive
- * and could be optimized by more reuse of the tableau.
- * Finally, we update bset according to the results.
- */
-static __isl_give isl_basic_set *uset_gist_full(__isl_take isl_basic_set *bset,
-	__isl_take isl_basic_set *context)
-{
-	int i, k;
-	isl_basic_set *combined = NULL;
-	struct isl_tab *tab = NULL;
-	unsigned context_ineq;
-	unsigned total;
-
-	if (!bset || !context)
-		goto error;
-
-	if (isl_basic_set_is_universe(bset)) {
-		isl_basic_set_free(context);
-		return bset;
-	}
-
-	if (isl_basic_set_is_universe(context)) {
-		isl_basic_set_free(context);
-		return bset;
-	}
-
-	bset = remove_shifted_constraints(bset, context);
-	if (!bset)
-		goto error;
-	if (bset->n_ineq == 0)
-		goto done;
-
-	context_ineq = context->n_ineq;
-	combined = isl_basic_set_cow(isl_basic_set_copy(context));
-	combined = isl_basic_set_extend_constraints(combined, 0, bset->n_ineq);
-	tab = isl_tab_from_basic_set(combined);
-	for (i = 0; i < context_ineq; ++i)
-		if (isl_tab_freeze_constraint(tab, i) < 0)
-			goto error;
-	tab = isl_tab_extend(tab, bset->n_ineq);
-	for (i = 0; i < bset->n_ineq; ++i)
-		if (isl_tab_add_ineq(tab, bset->ineq[i]) < 0)
-			goto error;
-	bset = isl_basic_set_add_constraints(combined, bset, 0);
-	combined = NULL;
-	if (!bset)
-		goto error;
-	if (isl_tab_detect_redundant(tab) < 0)
-		goto error;
-	total = isl_basic_set_total_dim(bset);
-	for (i = context_ineq; i < bset->n_ineq; ++i) {
-		int is_empty;
-		if (tab->con[i].is_redundant)
-			continue;
-		tab->con[i].is_redundant = 1;
-		combined = isl_basic_set_dup(bset);
-		combined = isl_basic_set_update_from_tab(combined, tab);
-		combined = isl_basic_set_extend_constraints(combined, 0, 1);
-		k = isl_basic_set_alloc_inequality(combined);
-		if (k < 0)
-			goto error;
-		isl_seq_neg(combined->ineq[k], bset->ineq[i], 1 + total);
-		isl_int_sub_ui(combined->ineq[k][0], combined->ineq[k][0], 1);
-		is_empty = isl_basic_set_is_empty(combined);
-		if (is_empty < 0)
-			goto error;
-		isl_basic_set_free(combined);
-		combined = NULL;
-		if (!is_empty)
-			tab->con[i].is_redundant = 0;
-	}
-	for (i = 0; i < context_ineq; ++i)
-		tab->con[i].is_redundant = 1;
-	bset = isl_basic_set_update_from_tab(bset, tab);
-	if (bset) {
-		ISL_F_SET(bset, ISL_BASIC_SET_NO_IMPLICIT);
-		ISL_F_SET(bset, ISL_BASIC_SET_NO_REDUNDANT);
-	}
-
-	isl_tab_free(tab);
-done:
-	bset = isl_basic_set_simplify(bset);
-	bset = isl_basic_set_finalize(bset);
-	isl_basic_set_free(context);
-	return bset;
-error:
-	isl_tab_free(tab);
-	isl_basic_set_free(combined);
-	isl_basic_set_free(context);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Remove all information from bset that is redundant in the context
- * of context.  In particular, equalities that are linear combinations
- * of those in context are removed.  Then the inequalities that are
- * redundant in the context of the equalities and inequalities of
- * context are removed.
- *
- * We first compute the integer affine hull of the intersection,
- * compute the gist inside this affine hull and then add back
- * those equalities that are not implied by the context.
- *
- * If two constraints are mutually redundant, then uset_gist_full
- * will remove the second of those constraints.  We therefore first
- * sort the constraints so that constraints not involving existentially
- * quantified variables are given precedence over those that do.
- * We have to perform this sorting before the variable compression,
- * because that may effect the order of the variables.
- */
-static __isl_give isl_basic_set *uset_gist(__isl_take isl_basic_set *bset,
-	__isl_take isl_basic_set *context)
-{
-	isl_mat *eq;
-	isl_mat *T, *T2;
-	isl_basic_set *aff;
-	isl_basic_set *aff_context;
-	unsigned total;
-
-	if (!bset || !context)
-		goto error;
-
-	bset = isl_basic_set_intersect(bset, isl_basic_set_copy(context));
-	if (isl_basic_set_plain_is_empty(bset)) {
-		isl_basic_set_free(context);
-		return bset;
-	}
-	bset = isl_basic_set_sort_constraints(bset);
-	aff = isl_basic_set_affine_hull(isl_basic_set_copy(bset));
-	if (!aff)
-		goto error;
-	if (isl_basic_set_plain_is_empty(aff)) {
-		isl_basic_set_free(aff);
-		isl_basic_set_free(context);
-		return bset;
-	}
-	if (aff->n_eq == 0) {
-		isl_basic_set_free(aff);
-		return uset_gist_full(bset, context);
-	}
-	total = isl_basic_set_total_dim(bset);
-	eq = isl_mat_sub_alloc6(bset->ctx, aff->eq, 0, aff->n_eq, 0, 1 + total);
-	eq = isl_mat_cow(eq);
-	T = isl_mat_variable_compression(eq, &T2);
-	if (T && T->n_col == 0) {
-		isl_mat_free(T);
-		isl_mat_free(T2);
-		isl_basic_set_free(context);
-		isl_basic_set_free(aff);
-		return isl_basic_set_set_to_empty(bset);
-	}
-
-	aff_context = isl_basic_set_affine_hull(isl_basic_set_copy(context));
-
-	bset = isl_basic_set_preimage(bset, isl_mat_copy(T));
-	context = isl_basic_set_preimage(context, T);
-
-	bset = uset_gist_full(bset, context);
-	bset = isl_basic_set_preimage(bset, T2);
-	bset = isl_basic_set_intersect(bset, aff);
-	bset = isl_basic_set_reduce_using_equalities(bset, aff_context);
-
-	if (bset) {
-		ISL_F_SET(bset, ISL_BASIC_SET_NO_IMPLICIT);
-		ISL_F_SET(bset, ISL_BASIC_SET_NO_REDUNDANT);
-	}
-
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	isl_basic_set_free(context);
-	return NULL;
-}
-
-/* Normalize the divs in "bmap" in the context of the equalities in "context".
- * We simply add the equalities in context to bmap and then do a regular
- * div normalizations.  Better results can be obtained by normalizing
- * only the divs in bmap than do not also appear in context.
- * We need to be careful to reduce the divs using the equalities
- * so that later calls to isl_basic_map_overlying_set wouldn't introduce
- * spurious constraints.
- */
-static struct isl_basic_map *normalize_divs_in_context(
-	struct isl_basic_map *bmap, struct isl_basic_map *context)
-{
-	int i;
-	unsigned total_context;
-	int div_eq;
-
-	div_eq = n_pure_div_eq(bmap);
-	if (div_eq == 0)
-		return bmap;
-
-	if (context->n_div > 0)
-		bmap = isl_basic_map_align_divs(bmap, context);
-
-	total_context = isl_basic_map_total_dim(context);
-	bmap = isl_basic_map_extend_constraints(bmap, context->n_eq, 0);
-	for (i = 0; i < context->n_eq; ++i) {
-		int k;
-		k = isl_basic_map_alloc_equality(bmap);
-		isl_seq_cpy(bmap->eq[k], context->eq[i], 1 + total_context);
-		isl_seq_clr(bmap->eq[k] + 1 + total_context,
-				isl_basic_map_total_dim(bmap) - total_context);
-	}
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	bmap = normalize_divs(bmap, NULL);
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	return bmap;
-}
-
-struct isl_basic_map *isl_basic_map_gist(struct isl_basic_map *bmap,
-	struct isl_basic_map *context)
-{
-	struct isl_basic_set *bset;
-
-	if (!bmap || !context)
-		goto error;
-
-	if (isl_basic_map_is_universe(bmap)) {
-		isl_basic_map_free(context);
-		return bmap;
-	}
-	if (isl_basic_map_plain_is_empty(context)) {
-		struct isl_dim *dim = isl_dim_copy(bmap->dim);
-		isl_basic_map_free(context);
-		isl_basic_map_free(bmap);
-		return isl_basic_map_universe(dim);
-	}
-	if (isl_basic_map_plain_is_empty(bmap)) {
-		isl_basic_map_free(context);
-		return bmap;
-	}
-
-	bmap = isl_basic_map_remove_redundancies(bmap);
-	context = isl_basic_map_remove_redundancies(context);
-
-	if (context->n_eq)
-		bmap = normalize_divs_in_context(bmap, context);
-
-	context = isl_basic_map_align_divs(context, bmap);
-	bmap = isl_basic_map_align_divs(bmap, context);
-
-	bset = uset_gist(isl_basic_map_underlying_set(isl_basic_map_copy(bmap)),
-			 isl_basic_map_underlying_set(context));
-
-	return isl_basic_map_overlying_set(bset, bmap);
-error:
-	isl_basic_map_free(bmap);
-	isl_basic_map_free(context);
-	return NULL;
-}
-
-/*
- * Assumes context has no implicit divs.
- */
-__isl_give isl_map *isl_map_gist_basic_map(__isl_take isl_map *map,
-	__isl_take isl_basic_map *context)
-{
-	int i;
-
-	if (!map || !context)
-		goto error;;
-
-	if (isl_basic_map_plain_is_empty(context)) {
-		struct isl_dim *dim = isl_dim_copy(map->dim);
-		isl_basic_map_free(context);
-		isl_map_free(map);
-		return isl_map_universe(dim);
-	}
-
-	context = isl_basic_map_remove_redundancies(context);
-	map = isl_map_cow(map);
-	if (!map || !context)
-		goto error;;
-	isl_assert(map->ctx, isl_dim_equal(map->dim, context->dim), goto error);
-	map = isl_map_compute_divs(map);
-	for (i = 0; i < map->n; ++i)
-		context = isl_basic_map_align_divs(context, map->p[i]);
-	for (i = map->n - 1; i >= 0; --i) {
-		map->p[i] = isl_basic_map_gist(map->p[i],
-						isl_basic_map_copy(context));
-		if (!map->p[i])
-			goto error;
-		if (isl_basic_map_plain_is_empty(map->p[i])) {
-			isl_basic_map_free(map->p[i]);
-			if (i != map->n - 1)
-				map->p[i] = map->p[map->n - 1];
-			map->n--;
-		}
-	}
-	isl_basic_map_free(context);
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-error:
-	isl_map_free(map);
-	isl_basic_map_free(context);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_gist(__isl_take isl_map *map,
-	__isl_take isl_map *context)
-{
-	context = isl_map_compute_divs(context);
-	return isl_map_gist_basic_map(map, isl_map_simple_hull(context));
-}
-
-struct isl_basic_set *isl_basic_set_gist(struct isl_basic_set *bset,
-						struct isl_basic_set *context)
-{
-	return (struct isl_basic_set *)isl_basic_map_gist(
-		(struct isl_basic_map *)bset, (struct isl_basic_map *)context);
-}
-
-__isl_give isl_set *isl_set_gist_basic_set(__isl_take isl_set *set,
-	__isl_take isl_basic_set *context)
-{
-	return (struct isl_set *)isl_map_gist_basic_map((struct isl_map *)set,
-					(struct isl_basic_map *)context);
-}
-
-__isl_give isl_set *isl_set_gist(__isl_take isl_set *set,
-	__isl_take isl_set *context)
-{
-	return (struct isl_set *)isl_map_gist((struct isl_map *)set,
-					(struct isl_map *)context);
-}
-
-/* Quick check to see if two basic maps are disjoint.
- * In particular, we reduce the equalities and inequalities of
- * one basic map in the context of the equalities of the other
- * basic map and check if we get a contradiction.
- */
-int isl_basic_map_plain_is_disjoint(__isl_keep isl_basic_map *bmap1,
-	__isl_keep isl_basic_map *bmap2)
-{
-	struct isl_vec *v = NULL;
-	int *elim = NULL;
-	unsigned total;
-	int i;
-
-	if (!bmap1 || !bmap2)
-		return -1;
-	isl_assert(bmap1->ctx, isl_dim_equal(bmap1->dim, bmap2->dim),
-			return -1);
-	if (bmap1->n_div || bmap2->n_div)
-		return 0;
-	if (!bmap1->n_eq && !bmap2->n_eq)
-		return 0;
-
-	total = isl_dim_total(bmap1->dim);
-	if (total == 0)
-		return 0;
-	v = isl_vec_alloc(bmap1->ctx, 1 + total);
-	if (!v)
-		goto error;
-	elim = isl_alloc_array(bmap1->ctx, int, total);
-	if (!elim)
-		goto error;
-	compute_elimination_index(bmap1, elim);
-	for (i = 0; i < bmap2->n_eq; ++i) {
-		int reduced;
-		reduced = reduced_using_equalities(v->block.data, bmap2->eq[i],
-							bmap1, elim);
-		if (reduced && !isl_int_is_zero(v->block.data[0]) &&
-		    isl_seq_first_non_zero(v->block.data + 1, total) == -1)
-			goto disjoint;
-	}
-	for (i = 0; i < bmap2->n_ineq; ++i) {
-		int reduced;
-		reduced = reduced_using_equalities(v->block.data,
-						bmap2->ineq[i], bmap1, elim);
-		if (reduced && isl_int_is_neg(v->block.data[0]) &&
-		    isl_seq_first_non_zero(v->block.data + 1, total) == -1)
-			goto disjoint;
-	}
-	compute_elimination_index(bmap2, elim);
-	for (i = 0; i < bmap1->n_ineq; ++i) {
-		int reduced;
-		reduced = reduced_using_equalities(v->block.data,
-						bmap1->ineq[i], bmap2, elim);
-		if (reduced && isl_int_is_neg(v->block.data[0]) &&
-		    isl_seq_first_non_zero(v->block.data + 1, total) == -1)
-			goto disjoint;
-	}
-	isl_vec_free(v);
-	free(elim);
-	return 0;
-disjoint:
-	isl_vec_free(v);
-	free(elim);
-	return 1;
-error:
-	isl_vec_free(v);
-	free(elim);
-	return -1;
-}
-
-int isl_basic_set_plain_is_disjoint(__isl_keep isl_basic_set *bset1,
-	__isl_keep isl_basic_set *bset2)
-{
-	return isl_basic_map_plain_is_disjoint((struct isl_basic_map *)bset1,
-					      (struct isl_basic_map *)bset2);
-}
-
-int isl_map_plain_is_disjoint(__isl_keep isl_map *map1,
-	__isl_keep isl_map *map2)
-{
-	int i, j;
-
-	if (!map1 || !map2)
-		return -1;
-
-	if (isl_map_plain_is_equal(map1, map2))
-		return 0;
-
-	for (i = 0; i < map1->n; ++i) {
-		for (j = 0; j < map2->n; ++j) {
-			int d = isl_basic_map_plain_is_disjoint(map1->p[i],
-							       map2->p[j]);
-			if (d != 1)
-				return d;
-		}
-	}
-	return 1;
-}
-
-int isl_set_plain_is_disjoint(__isl_keep isl_set *set1,
-	__isl_keep isl_set *set2)
-{
-	return isl_map_plain_is_disjoint((struct isl_map *)set1,
-					(struct isl_map *)set2);
-}
-
-int isl_set_fast_is_disjoint(__isl_keep isl_set *set1, __isl_keep isl_set *set2)
-{
-	return isl_set_plain_is_disjoint(set1, set2);
-}
-
-/* Check if we can combine a given div with lower bound l and upper
- * bound u with some other div and if so return that other div.
- * Otherwise return -1.
- *
- * We first check that
- *	- the bounds are opposites of each other (except for the constant
- *	  term)
- *	- the bounds do not reference any other div
- *	- no div is defined in terms of this div
- *
- * Let m be the size of the range allowed on the div by the bounds.
- * That is, the bounds are of the form
- *
- *	e <= a <= e + m - 1
- *
- * with e some expression in the other variables.
- * We look for another div b such that no third div is defined in terms
- * of this second div b and such that in any constraint that contains
- * a (except for the given lower and upper bound), also contains b
- * with a coefficient that is m times that of b.
- * That is, all constraints (execpt for the lower and upper bound)
- * are of the form
- *
- *	e + f (a + m b) >= 0
- *
- * If so, we return b so that "a + m b" can be replaced by
- * a single div "c = a + m b".
- */
-static int div_find_coalesce(struct isl_basic_map *bmap, int *pairs,
-	unsigned div, unsigned l, unsigned u)
-{
-	int i, j;
-	unsigned dim;
-	int coalesce = -1;
-
-	if (bmap->n_div <= 1)
-		return -1;
-	dim = isl_dim_total(bmap->dim);
-	if (isl_seq_first_non_zero(bmap->ineq[l] + 1 + dim, div) != -1)
-		return -1;
-	if (isl_seq_first_non_zero(bmap->ineq[l] + 1 + dim + div + 1,
-				   bmap->n_div - div - 1) != -1)
-		return -1;
-	if (!isl_seq_is_neg(bmap->ineq[l] + 1, bmap->ineq[u] + 1,
-			    dim + bmap->n_div))
-		return -1;
-
-	for (i = 0; i < bmap->n_div; ++i) {
-		if (isl_int_is_zero(bmap->div[i][0]))
-			continue;
-		if (!isl_int_is_zero(bmap->div[i][1 + 1 + dim + div]))
-			return -1;
-	}
-
-	isl_int_add(bmap->ineq[l][0], bmap->ineq[l][0], bmap->ineq[u][0]);
-	if (isl_int_is_neg(bmap->ineq[l][0])) {
-		isl_int_sub(bmap->ineq[l][0],
-			    bmap->ineq[l][0], bmap->ineq[u][0]);
-		bmap = isl_basic_map_copy(bmap);
-		bmap = isl_basic_map_set_to_empty(bmap);
-		isl_basic_map_free(bmap);
-		return -1;
-	}
-	isl_int_add_ui(bmap->ineq[l][0], bmap->ineq[l][0], 1);
-	for (i = 0; i < bmap->n_div; ++i) {
-		if (i == div)
-			continue;
-		if (!pairs[i])
-			continue;
-		for (j = 0; j < bmap->n_div; ++j) {
-			if (isl_int_is_zero(bmap->div[j][0]))
-				continue;
-			if (!isl_int_is_zero(bmap->div[j][1 + 1 + dim + i]))
-				break;
-		}
-		if (j < bmap->n_div)
-			continue;
-		for (j = 0; j < bmap->n_ineq; ++j) {
-			int valid;
-			if (j == l || j == u)
-				continue;
-			if (isl_int_is_zero(bmap->ineq[j][1 + dim + div]))
-				continue;
-			if (isl_int_is_zero(bmap->ineq[j][1 + dim + i]))
-				break;
-			isl_int_mul(bmap->ineq[j][1 + dim + div],
-				    bmap->ineq[j][1 + dim + div],
-				    bmap->ineq[l][0]);
-			valid = isl_int_eq(bmap->ineq[j][1 + dim + div],
-					   bmap->ineq[j][1 + dim + i]);
-			isl_int_divexact(bmap->ineq[j][1 + dim + div],
-					 bmap->ineq[j][1 + dim + div],
-					 bmap->ineq[l][0]);
-			if (!valid)
-				break;
-		}
-		if (j < bmap->n_ineq)
-			continue;
-		coalesce = i;
-		break;
-	}
-	isl_int_sub_ui(bmap->ineq[l][0], bmap->ineq[l][0], 1);
-	isl_int_sub(bmap->ineq[l][0], bmap->ineq[l][0], bmap->ineq[u][0]);
-	return coalesce;
-}
-
-/* Given a lower and an upper bound on div i, construct an inequality
- * that when nonnegative ensures that this pair of bounds always allows
- * for an integer value of the given div.
- * The lower bound is inequality l, while the upper bound is inequality u.
- * The constructed inequality is stored in ineq.
- * g, fl, fu are temporary scalars.
- *
- * Let the upper bound be
- *
- *	-n_u a + e_u >= 0
- *
- * and the lower bound
- *
- *	n_l a + e_l >= 0
- *
- * Let n_u = f_u g and n_l = f_l g, with g = gcd(n_u, n_l).
- * We have
- *
- *	- f_u e_l <= f_u f_l g a <= f_l e_u
- *
- * Since all variables are integer valued, this is equivalent to
- *
- *	- f_u e_l - (f_u - 1) <= f_u f_l g a <= f_l e_u + (f_l - 1)
- *
- * If this interval is at least f_u f_l g, then it contains at least
- * one integer value for a.
- * That is, the test constraint is
- *
- *	f_l e_u + f_u e_l + f_l - 1 + f_u - 1 + 1 >= f_u f_l g
- */
-static void construct_test_ineq(struct isl_basic_map *bmap, int i,
-	int l, int u, isl_int *ineq, isl_int g, isl_int fl, isl_int fu)
-{
-	unsigned dim;
-	dim = isl_dim_total(bmap->dim);
-
-	isl_int_gcd(g, bmap->ineq[l][1 + dim + i], bmap->ineq[u][1 + dim + i]);
-	isl_int_divexact(fl, bmap->ineq[l][1 + dim + i], g);
-	isl_int_divexact(fu, bmap->ineq[u][1 + dim + i], g);
-	isl_int_neg(fu, fu);
-	isl_seq_combine(ineq, fl, bmap->ineq[u], fu, bmap->ineq[l],
-			1 + dim + bmap->n_div);
-	isl_int_add(ineq[0], ineq[0], fl);
-	isl_int_add(ineq[0], ineq[0], fu);
-	isl_int_sub_ui(ineq[0], ineq[0], 1);
-	isl_int_mul(g, g, fl);
-	isl_int_mul(g, g, fu);
-	isl_int_sub(ineq[0], ineq[0], g);
-}
-
-/* Remove more kinds of divs that are not strictly needed.
- * In particular, if all pairs of lower and upper bounds on a div
- * are such that they allow at least one integer value of the div,
- * the we can eliminate the div using Fourier-Motzkin without
- * introducing any spurious solutions.
- */
-static struct isl_basic_map *drop_more_redundant_divs(
-	struct isl_basic_map *bmap, int *pairs, int n)
-{
-	struct isl_tab *tab = NULL;
-	struct isl_vec *vec = NULL;
-	unsigned dim;
-	int remove = -1;
-	isl_int g, fl, fu;
-
-	isl_int_init(g);
-	isl_int_init(fl);
-	isl_int_init(fu);
-
-	if (!bmap)
-		goto error;
-
-	dim = isl_dim_total(bmap->dim);
-	vec = isl_vec_alloc(bmap->ctx, 1 + dim + bmap->n_div);
-	if (!vec)
-		goto error;
-
-	tab = isl_tab_from_basic_map(bmap);
-
-	while (n > 0) {
-		int i, l, u;
-		int best = -1;
-		enum isl_lp_result res;
-
-		for (i = 0; i < bmap->n_div; ++i) {
-			if (!pairs[i])
-				continue;
-			if (best >= 0 && pairs[best] <= pairs[i])
-				continue;
-			best = i;
-		}
-
-		i = best;
-		for (l = 0; l < bmap->n_ineq; ++l) {
-			if (!isl_int_is_pos(bmap->ineq[l][1 + dim + i]))
-				continue;
-			for (u = 0; u < bmap->n_ineq; ++u) {
-				if (!isl_int_is_neg(bmap->ineq[u][1 + dim + i]))
-					continue;
-				construct_test_ineq(bmap, i, l, u,
-						    vec->el, g, fl, fu);
-				res = isl_tab_min(tab, vec->el,
-						  bmap->ctx->one, &g, NULL, 0);
-				if (res == isl_lp_error)
-					goto error;
-				if (res == isl_lp_empty) {
-					bmap = isl_basic_map_set_to_empty(bmap);
-					break;
-				}
-				if (res != isl_lp_ok || isl_int_is_neg(g))
-					break;
-			}
-			if (u < bmap->n_ineq)
-				break;
-		}
-		if (l == bmap->n_ineq) {
-			remove = i;
-			break;
-		}
-		pairs[i] = 0;
-		--n;
-	}
-
-	isl_tab_free(tab);
-	isl_vec_free(vec);
-
-	isl_int_clear(g);
-	isl_int_clear(fl);
-	isl_int_clear(fu);
-
-	free(pairs);
-
-	if (remove < 0)
-		return bmap;
-
-	bmap = isl_basic_map_remove_dims(bmap, isl_dim_div, remove, 1);
-	return isl_basic_map_drop_redundant_divs(bmap);
-error:
-	free(pairs);
-	isl_basic_map_free(bmap);
-	isl_tab_free(tab);
-	isl_vec_free(vec);
-	isl_int_clear(g);
-	isl_int_clear(fl);
-	isl_int_clear(fu);
-	return NULL;
-}
-
-/* Given a pair of divs div1 and div2 such that, expect for the lower bound l
- * and the upper bound u, div1 always occurs together with div2 in the form 
- * (div1 + m div2), where m is the constant range on the variable div1
- * allowed by l and u, replace the pair div1 and div2 by a single
- * div that is equal to div1 + m div2.
- *
- * The new div will appear in the location that contains div2.
- * We need to modify all constraints that contain
- * div2 = (div - div1) / m
- * (If a constraint does not contain div2, it will also not contain div1.)
- * If the constraint also contains div1, then we know they appear
- * as f (div1 + m div2) and we can simply replace (div1 + m div2) by div,
- * i.e., the coefficient of div is f.
- *
- * Otherwise, we first need to introduce div1 into the constraint.
- * Let the l be
- *
- *	div1 + f >=0
- *
- * and u
- *
- *	-div1 + f' >= 0
- *
- * A lower bound on div2
- *
- *	n div2 + t >= 0
- *
- * can be replaced by
- *
- *	(n * (m div 2 + div1) + m t + n f)/g >= 0
- *
- * with g = gcd(m,n).
- * An upper bound
- *
- *	-n div2 + t >= 0
- *
- * can be replaced by
- *
- *	(-n * (m div2 + div1) + m t + n f')/g >= 0
- *
- * These constraint are those that we would obtain from eliminating
- * div1 using Fourier-Motzkin.
- *
- * After all constraints have been modified, we drop the lower and upper
- * bound and then drop div1.
- */
-static struct isl_basic_map *coalesce_divs(struct isl_basic_map *bmap,
-	unsigned div1, unsigned div2, unsigned l, unsigned u)
-{
-	isl_int a;
-	isl_int b;
-	isl_int m;
-	unsigned dim, total;
-	int i;
-
-	dim = isl_dim_total(bmap->dim);
-	total = 1 + dim + bmap->n_div;
-
-	isl_int_init(a);
-	isl_int_init(b);
-	isl_int_init(m);
-	isl_int_add(m, bmap->ineq[l][0], bmap->ineq[u][0]);
-	isl_int_add_ui(m, m, 1);
-
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		if (i == l || i == u)
-			continue;
-		if (isl_int_is_zero(bmap->ineq[i][1 + dim + div2]))
-			continue;
-		if (isl_int_is_zero(bmap->ineq[i][1 + dim + div1])) {
-			isl_int_gcd(b, m, bmap->ineq[i][1 + dim + div2]);
-			isl_int_divexact(a, m, b);
-			isl_int_divexact(b, bmap->ineq[i][1 + dim + div2], b);
-			if (isl_int_is_pos(b)) {
-				isl_seq_combine(bmap->ineq[i], a, bmap->ineq[i],
-						b, bmap->ineq[l], total);
-			} else {
-				isl_int_neg(b, b);
-				isl_seq_combine(bmap->ineq[i], a, bmap->ineq[i],
-						b, bmap->ineq[u], total);
-			}
-		}
-		isl_int_set(bmap->ineq[i][1 + dim + div2],
-			    bmap->ineq[i][1 + dim + div1]);
-		isl_int_set_si(bmap->ineq[i][1 + dim + div1], 0);
-	}
-
-	isl_int_clear(a);
-	isl_int_clear(b);
-	isl_int_clear(m);
-	if (l > u) {
-		isl_basic_map_drop_inequality(bmap, l);
-		isl_basic_map_drop_inequality(bmap, u);
-	} else {
-		isl_basic_map_drop_inequality(bmap, u);
-		isl_basic_map_drop_inequality(bmap, l);
-	}
-	bmap = isl_basic_map_drop_div(bmap, div1);
-	return bmap;
-}
-
-/* First check if we can coalesce any pair of divs and
- * then continue with dropping more redundant divs.
- *
- * We loop over all pairs of lower and upper bounds on a div
- * with coefficient 1 and -1, respectively, check if there
- * is any other div "c" with which we can coalesce the div
- * and if so, perform the coalescing.
- */
-static struct isl_basic_map *coalesce_or_drop_more_redundant_divs(
-	struct isl_basic_map *bmap, int *pairs, int n)
-{
-	int i, l, u;
-	unsigned dim;
-
-	dim = isl_dim_total(bmap->dim);
-
-	for (i = 0; i < bmap->n_div; ++i) {
-		if (!pairs[i])
-			continue;
-		for (l = 0; l < bmap->n_ineq; ++l) {
-			if (!isl_int_is_one(bmap->ineq[l][1 + dim + i]))
-				continue;
-			for (u = 0; u < bmap->n_ineq; ++u) {
-				int c;
-
-				if (!isl_int_is_negone(bmap->ineq[u][1+dim+i]))
-					continue;
-				c = div_find_coalesce(bmap, pairs, i, l, u);
-				if (c < 0)
-					continue;
-				free(pairs);
-				bmap = coalesce_divs(bmap, i, c, l, u);
-				return isl_basic_map_drop_redundant_divs(bmap);
-			}
-		}
-	}
-
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY))
-		return bmap;
-
-	return drop_more_redundant_divs(bmap, pairs, n);
-}
-
-/* Remove divs that are not strictly needed.
- * In particular, if a div only occurs positively (or negatively)
- * in constraints, then it can simply be dropped.
- * Also, if a div occurs only occurs in two constraints and if moreover
- * those two constraints are opposite to each other, except for the constant
- * term and if the sum of the constant terms is such that for any value
- * of the other values, there is always at least one integer value of the
- * div, i.e., if one plus this sum is greater than or equal to
- * the (absolute value) of the coefficent of the div in the constraints,
- * then we can also simply drop the div.
- *
- * If any divs are left after these simple checks then we move on
- * to more complicated cases in drop_more_redundant_divs.
- */
-struct isl_basic_map *isl_basic_map_drop_redundant_divs(
-	struct isl_basic_map *bmap)
-{
-	int i, j;
-	unsigned off;
-	int *pairs = NULL;
-	int n = 0;
-
-	if (!bmap)
-		goto error;
-
-	off = isl_dim_total(bmap->dim);
-	pairs = isl_calloc_array(bmap->ctx, int, bmap->n_div);
-	if (!pairs)
-		goto error;
-
-	for (i = 0; i < bmap->n_div; ++i) {
-		int pos, neg;
-		int last_pos, last_neg;
-		int redundant;
-		int defined;
-
-		defined = !isl_int_is_zero(bmap->div[i][0]);
-		for (j = 0; j < bmap->n_eq; ++j)
-			if (!isl_int_is_zero(bmap->eq[j][1 + off + i]))
-				break;
-		if (j < bmap->n_eq)
-			continue;
-		++n;
-		pos = neg = 0;
-		for (j = 0; j < bmap->n_ineq; ++j) {
-			if (isl_int_is_pos(bmap->ineq[j][1 + off + i])) {
-				last_pos = j;
-				++pos;
-			}
-			if (isl_int_is_neg(bmap->ineq[j][1 + off + i])) {
-				last_neg = j;
-				++neg;
-			}
-		}
-		pairs[i] = pos * neg;
-		if (pairs[i] == 0) {
-			for (j = bmap->n_ineq - 1; j >= 0; --j)
-				if (!isl_int_is_zero(bmap->ineq[j][1+off+i]))
-					isl_basic_map_drop_inequality(bmap, j);
-			bmap = isl_basic_map_drop_div(bmap, i);
-			free(pairs);
-			return isl_basic_map_drop_redundant_divs(bmap);
-		}
-		if (pairs[i] != 1)
-			continue;
-		if (!isl_seq_is_neg(bmap->ineq[last_pos] + 1,
-				    bmap->ineq[last_neg] + 1,
-				    off + bmap->n_div))
-			continue;
-
-		isl_int_add(bmap->ineq[last_pos][0],
-			    bmap->ineq[last_pos][0], bmap->ineq[last_neg][0]);
-		isl_int_add_ui(bmap->ineq[last_pos][0],
-			       bmap->ineq[last_pos][0], 1);
-		redundant = isl_int_ge(bmap->ineq[last_pos][0],
-				bmap->ineq[last_pos][1+off+i]);
-		isl_int_sub_ui(bmap->ineq[last_pos][0],
-			       bmap->ineq[last_pos][0], 1);
-		isl_int_sub(bmap->ineq[last_pos][0],
-			    bmap->ineq[last_pos][0], bmap->ineq[last_neg][0]);
-		if (!redundant) {
-			if (defined ||
-			    !ok_to_set_div_from_bound(bmap, i, last_pos)) {
-				pairs[i] = 0;
-				--n;
-				continue;
-			}
-			bmap = set_div_from_lower_bound(bmap, i, last_pos);
-			bmap = isl_basic_map_simplify(bmap);
-			free(pairs);
-			return isl_basic_map_drop_redundant_divs(bmap);
-		}
-		if (last_pos > last_neg) {
-			isl_basic_map_drop_inequality(bmap, last_pos);
-			isl_basic_map_drop_inequality(bmap, last_neg);
-		} else {
-			isl_basic_map_drop_inequality(bmap, last_neg);
-			isl_basic_map_drop_inequality(bmap, last_pos);
-		}
-		bmap = isl_basic_map_drop_div(bmap, i);
-		free(pairs);
-		return isl_basic_map_drop_redundant_divs(bmap);
-	}
-
-	if (n > 0)
-		return coalesce_or_drop_more_redundant_divs(bmap, pairs, n);
-
-	free(pairs);
-	return bmap;
-error:
-	free(pairs);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_drop_redundant_divs(
-	struct isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)
-	    isl_basic_map_drop_redundant_divs((struct isl_basic_map *)bset);
-}
-
-struct isl_map *isl_map_drop_redundant_divs(struct isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_drop_redundant_divs(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-struct isl_set *isl_set_drop_redundant_divs(struct isl_set *set)
-{
-	return (struct isl_set *)
-	    isl_map_drop_redundant_divs((struct isl_map *)set);
-}
diff --git a/cloog-0.16.3/isl/isl_map_subtract.c b/cloog-0.16.3/isl/isl_map_subtract.c
deleted file mode 100644
index 0510657..0000000
--- a/cloog-0.16.3/isl/isl_map_subtract.c
+++ /dev/null
@@ -1,790 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_map_private.h>
-#include <isl/seq.h>
-#include <isl/set.h>
-#include <isl/map.h>
-#include "isl_tab.h"
-#include <isl_point_private.h>
-
-static void expand_constraint(isl_vec *v, unsigned dim,
-	isl_int *c, int *div_map, unsigned n_div)
-{
-	int i;
-
-	isl_seq_cpy(v->el, c, 1 + dim);
-	isl_seq_clr(v->el + 1 + dim, v->size - (1 + dim));
-
-	for (i = 0; i < n_div; ++i)
-		isl_int_set(v->el[1 + dim + div_map[i]], c[1 + dim + i]);
-}
-
-/* Add all constraints of bmap to tab.  The equalities of bmap
- * are added as a pair of inequalities.
- */
-static int tab_add_constraints(struct isl_tab *tab,
-	__isl_keep isl_basic_map *bmap, int *div_map)
-{
-	int i;
-	unsigned dim;
-	unsigned tab_total;
-	unsigned bmap_total;
-	isl_vec *v;
-
-	if (!tab || !bmap)
-		return -1;
-
-	tab_total = isl_basic_map_total_dim(tab->bmap);
-	bmap_total = isl_basic_map_total_dim(bmap);
-	dim = isl_dim_total(tab->bmap->dim);
-
-	if (isl_tab_extend_cons(tab, 2 * bmap->n_eq + bmap->n_ineq) < 0)
-		return -1;
-
-	v = isl_vec_alloc(bmap->ctx, 1 + tab_total);
-	if (!v)
-		return -1;
-
-	for (i = 0; i < bmap->n_eq; ++i) {
-		expand_constraint(v, dim, bmap->eq[i], div_map, bmap->n_div);
-		if (isl_tab_add_ineq(tab, v->el) < 0)
-			goto error;
-		isl_seq_neg(bmap->eq[i], bmap->eq[i], 1 + bmap_total);
-		expand_constraint(v, dim, bmap->eq[i], div_map, bmap->n_div);
-		if (isl_tab_add_ineq(tab, v->el) < 0)
-			goto error;
-		isl_seq_neg(bmap->eq[i], bmap->eq[i], 1 + bmap_total);
-		if (tab->empty)
-			break;
-	}
-
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		expand_constraint(v, dim, bmap->ineq[i], div_map, bmap->n_div);
-		if (isl_tab_add_ineq(tab, v->el) < 0)
-			goto error;
-		if (tab->empty)
-			break;
-	}
-
-	isl_vec_free(v);
-	return 0;
-error:
-	isl_vec_free(v);
-	return -1;
-}
-
-/* Add a specific constraint of bmap (or its opposite) to tab.
- * The position of the constraint is specified by "c", where
- * the equalities of bmap are counted twice, once for the inequality
- * that is equal to the equality, and once for its negation.
- */
-static int tab_add_constraint(struct isl_tab *tab,
-	__isl_keep isl_basic_map *bmap, int *div_map, int c, int oppose)
-{
-	unsigned dim;
-	unsigned tab_total;
-	unsigned bmap_total;
-	isl_vec *v;
-	int r;
-
-	if (!tab || !bmap)
-		return -1;
-
-	tab_total = isl_basic_map_total_dim(tab->bmap);
-	bmap_total = isl_basic_map_total_dim(bmap);
-	dim = isl_dim_total(tab->bmap->dim);
-
-	v = isl_vec_alloc(bmap->ctx, 1 + tab_total);
-	if (!v)
-		return -1;
-
-	if (c < 2 * bmap->n_eq) {
-		if ((c % 2) != oppose)
-			isl_seq_neg(bmap->eq[c/2], bmap->eq[c/2],
-					1 + bmap_total);
-		if (oppose)
-			isl_int_sub_ui(bmap->eq[c/2][0], bmap->eq[c/2][0], 1);
-		expand_constraint(v, dim, bmap->eq[c/2], div_map, bmap->n_div);
-		r = isl_tab_add_ineq(tab, v->el);
-		if (oppose)
-			isl_int_add_ui(bmap->eq[c/2][0], bmap->eq[c/2][0], 1);
-		if ((c % 2) != oppose)
-			isl_seq_neg(bmap->eq[c/2], bmap->eq[c/2],
-					1 + bmap_total);
-	} else {
-		c -= 2 * bmap->n_eq;
-		if (oppose) {
-			isl_seq_neg(bmap->ineq[c], bmap->ineq[c],
-					1 + bmap_total);
-			isl_int_sub_ui(bmap->ineq[c][0], bmap->ineq[c][0], 1);
-		}
-		expand_constraint(v, dim, bmap->ineq[c], div_map, bmap->n_div);
-		r = isl_tab_add_ineq(tab, v->el);
-		if (oppose) {
-			isl_int_add_ui(bmap->ineq[c][0], bmap->ineq[c][0], 1);
-			isl_seq_neg(bmap->ineq[c], bmap->ineq[c],
-					1 + bmap_total);
-		}
-	}
-
-	isl_vec_free(v);
-	return r;
-}
-
-static int tab_add_divs(struct isl_tab *tab, __isl_keep isl_basic_map *bmap,
-	int **div_map)
-{
-	int i, j;
-	struct isl_vec *vec;
-	unsigned total;
-	unsigned dim;
-
-	if (!bmap)
-		return -1;
-	if (!bmap->n_div)
-		return 0;
-
-	if (!*div_map)
-		*div_map = isl_alloc_array(bmap->ctx, int, bmap->n_div);
-	if (!*div_map)
-		return -1;
-
-	total = isl_basic_map_total_dim(tab->bmap);
-	dim = total - tab->bmap->n_div;
-	vec = isl_vec_alloc(bmap->ctx, 2 + total + bmap->n_div);
-	if (!vec)
-		return -1;
-
-	for (i = 0; i < bmap->n_div; ++i) {
-		isl_seq_cpy(vec->el, bmap->div[i], 2 + dim);
-		isl_seq_clr(vec->el + 2 + dim, tab->bmap->n_div);
-		for (j = 0; j < i; ++j)
-			isl_int_set(vec->el[2 + dim + (*div_map)[j]],
-					bmap->div[i][2 + dim + j]);
-		for (j = 0; j < tab->bmap->n_div; ++j)
-			if (isl_seq_eq(tab->bmap->div[j],
-					vec->el, 2 + dim + tab->bmap->n_div))
-				break;
-		(*div_map)[i] = j;
-		if (j == tab->bmap->n_div) {
-			vec->size = 2 + dim + tab->bmap->n_div;
-			if (isl_tab_add_div(tab, vec, NULL, NULL) < 0)
-				goto error;
-		}
-	}
-
-	isl_vec_free(vec);
-
-	return 0;
-error:
-	isl_vec_free(vec);
-
-	return -1;
-}
-
-/* Freeze all constraints of tableau tab.
- */
-static int tab_freeze_constraints(struct isl_tab *tab)
-{
-	int i;
-
-	for (i = 0; i < tab->n_con; ++i)
-		if (isl_tab_freeze_constraint(tab, i) < 0)
-			return -1;
-
-	return 0;
-}
-
-/* Check for redundant constraints starting at offset.
- * Put the indices of the redundant constraints in index
- * and return the number of redundant constraints.
- */
-static int n_non_redundant(isl_ctx *ctx, struct isl_tab *tab,
-	int offset, int **index)
-{
-	int i, n;
-	int n_test = tab->n_con - offset;
-
-	if (isl_tab_detect_redundant(tab) < 0)
-		return -1;
-
-	if (!*index)
-		*index = isl_alloc_array(ctx, int, n_test);
-	if (!*index)
-		return -1;
-
-	for (n = 0, i = 0; i < n_test; ++i) {
-		int r;
-		r = isl_tab_is_redundant(tab, offset + i);
-		if (r < 0)
-			return -1;
-		if (r)
-			continue;
-		(*index)[n++] = i;
-	}
-
-	return n;
-}
-
-/* basic_map_collect_diff calls add on each of the pieces of
- * the set difference between bmap and map until the add method
- * return a negative value.
- */
-struct isl_diff_collector {
-	int (*add)(struct isl_diff_collector *dc,
-		    __isl_take isl_basic_map *bmap);
-};
-
-/* Compute the set difference between bmap and map and call
- * dc->add on each of the piece until this function returns
- * a negative value.
- * Return 0 on success and -1 on error.  dc->add returning
- * a negative value is treated as an error, but the calling
- * function can interpret the results based on the state of dc.
- *
- * Assumes that map has known divs.
- *
- * The difference is computed by a backtracking algorithm.
- * Each level corresponds to a basic map in "map".
- * When a node in entered for the first time, we check
- * if the corresonding basic map intersects the current piece
- * of "bmap".  If not, we move to the next level.
- * Otherwise, we split the current piece into as many
- * pieces as there are non-redundant constraints of the current
- * basic map in the intersection.  Each of these pieces is
- * handled by a child of the current node.
- * In particular, if there are n non-redundant constraints,
- * then for each 0 <= i < n, a piece is cut off by adding
- * constraints 0 <= j < i and adding the opposite of constraint i.
- * If there are no non-redundant constraints, meaning that the current
- * piece is a subset of the current basic map, then we simply backtrack.
- *
- * In the leaves, we check if the remaining piece has any integer points
- * and if so, pass it along to dc->add.  As a special case, if nothing
- * has been removed when we end up in a leaf, we simply pass along
- * the original basic map.
- */
-static int basic_map_collect_diff(__isl_take isl_basic_map *bmap,
-	__isl_take isl_map *map, struct isl_diff_collector *dc)
-{
-	int i;
-	int modified;
-	int level;
-	int init;
-	int empty;
-	isl_ctx *ctx;
-	struct isl_tab *tab = NULL;
-	struct isl_tab_undo **snap = NULL;
-	int *k = NULL;
-	int *n = NULL;
-	int **index = NULL;
-	int **div_map = NULL;
-
-	empty = isl_basic_map_is_empty(bmap);
-	if (empty) {
-		isl_basic_map_free(bmap);
-		isl_map_free(map);
-		return empty < 0 ? -1 : 0;
-	}
-
-	bmap = isl_basic_map_cow(bmap);
-	map = isl_map_cow(map);
-
-	if (!bmap || !map)
-		goto error;
-
-	ctx = map->ctx;
-	snap = isl_alloc_array(map->ctx, struct isl_tab_undo *, map->n);
-	k = isl_alloc_array(map->ctx, int, map->n);
-	n = isl_alloc_array(map->ctx, int, map->n);
-	index = isl_calloc_array(map->ctx, int *, map->n);
-	div_map = isl_calloc_array(map->ctx, int *, map->n);
-	if (!snap || !k || !n || !index || !div_map)
-		goto error;
-
-	bmap = isl_basic_map_order_divs(bmap);
-	map = isl_map_order_divs(map);
-
-	tab = isl_tab_from_basic_map(bmap);
-	if (isl_tab_track_bmap(tab, isl_basic_map_copy(bmap)) < 0)
-		goto error;
-
-	modified = 0;
-	level = 0;
-	init = 1;
-
-	while (level >= 0) {
-		if (level >= map->n) {
-			int empty;
-			struct isl_basic_map *bm;
-			if (!modified) {
-				if (dc->add(dc, isl_basic_map_copy(bmap)) < 0)
-					goto error;
-				break;
-			}
-			bm = isl_basic_map_copy(tab->bmap);
-			bm = isl_basic_map_cow(bm);
-			bm = isl_basic_map_update_from_tab(bm, tab);
-			bm = isl_basic_map_simplify(bm);
-			bm = isl_basic_map_finalize(bm);
-			empty = isl_basic_map_is_empty(bm);
-			if (empty)
-				isl_basic_map_free(bm);
-			else if (dc->add(dc, bm) < 0)
-				goto error;
-			if (empty < 0)
-				goto error;
-			level--;
-			init = 0;
-			continue;
-		}
-		if (init) {
-			int offset;
-			struct isl_tab_undo *snap2;
-			snap2 = isl_tab_snap(tab);
-			if (tab_add_divs(tab, map->p[level],
-					 &div_map[level]) < 0)
-				goto error;
-			offset = tab->n_con;
-			snap[level] = isl_tab_snap(tab);
-			if (tab_freeze_constraints(tab) < 0)
-				goto error;
-			if (tab_add_constraints(tab, map->p[level],
-						div_map[level]) < 0)
-				goto error;
-			k[level] = 0;
-			n[level] = 0;
-			if (tab->empty) {
-				if (isl_tab_rollback(tab, snap2) < 0)
-					goto error;
-				level++;
-				continue;
-			}
-			modified = 1;
-			n[level] = n_non_redundant(ctx, tab, offset,
-						    &index[level]);
-			if (n[level] < 0)
-				goto error;
-			if (n[level] == 0) {
-				level--;
-				init = 0;
-				continue;
-			}
-			if (isl_tab_rollback(tab, snap[level]) < 0)
-				goto error;
-			if (tab_add_constraint(tab, map->p[level],
-					div_map[level], index[level][0], 1) < 0)
-				goto error;
-			level++;
-			continue;
-		} else {
-			if (k[level] + 1 >= n[level]) {
-				level--;
-				continue;
-			}
-			if (isl_tab_rollback(tab, snap[level]) < 0)
-				goto error;
-			if (tab_add_constraint(tab, map->p[level],
-						div_map[level],
-						index[level][k[level]], 0) < 0)
-				goto error;
-			snap[level] = isl_tab_snap(tab);
-			k[level]++;
-			if (tab_add_constraint(tab, map->p[level],
-						div_map[level],
-						index[level][k[level]], 1) < 0)
-				goto error;
-			level++;
-			init = 1;
-			continue;
-		}
-	}
-
-	isl_tab_free(tab);
-	free(snap);
-	free(n);
-	free(k);
-	for (i = 0; index && i < map->n; ++i)
-		free(index[i]);
-	free(index);
-	for (i = 0; div_map && i < map->n; ++i)
-		free(div_map[i]);
-	free(div_map);
-
-	isl_basic_map_free(bmap);
-	isl_map_free(map);
-
-	return 0;
-error:
-	isl_tab_free(tab);
-	free(snap);
-	free(n);
-	free(k);
-	for (i = 0; index && i < map->n; ++i)
-		free(index[i]);
-	free(index);
-	for (i = 0; div_map && i < map->n; ++i)
-		free(div_map[i]);
-	free(div_map);
-	isl_basic_map_free(bmap);
-	isl_map_free(map);
-	return -1;
-}
-
-/* A diff collector that actually collects all parts of the
- * set difference in the field diff.
- */
-struct isl_subtract_diff_collector {
-	struct isl_diff_collector dc;
-	struct isl_map *diff;
-};
-
-/* isl_subtract_diff_collector callback.
- */
-static int basic_map_subtract_add(struct isl_diff_collector *dc,
-			    __isl_take isl_basic_map *bmap)
-{
-	struct isl_subtract_diff_collector *sdc;
-	sdc = (struct isl_subtract_diff_collector *)dc;
-
-	sdc->diff = isl_map_union_disjoint(sdc->diff,
-			isl_map_from_basic_map(bmap));
-
-	return sdc->diff ? 0 : -1;
-}
-
-/* Return the set difference between bmap and map.
- */
-static __isl_give isl_map *basic_map_subtract(__isl_take isl_basic_map *bmap,
-	__isl_take isl_map *map)
-{
-	struct isl_subtract_diff_collector sdc;
-	sdc.dc.add = &basic_map_subtract_add;
-	sdc.diff = isl_map_empty_like_basic_map(bmap);
-	if (basic_map_collect_diff(bmap, map, &sdc.dc) < 0) {
-		isl_map_free(sdc.diff);
-		sdc.diff = NULL;
-	}
-	return sdc.diff;
-}
-
-/* Return the set difference between map1 and map2.
- * (U_i A_i) \ (U_j B_j) is computed as U_i (A_i \ (U_j B_j))
- */
-struct isl_map *isl_map_subtract(struct isl_map *map1, struct isl_map *map2)
-{
-	int i;
-	struct isl_map *diff;
-
-	if (!map1 || !map2)
-		goto error;
-
-	isl_assert(map1->ctx, isl_dim_equal(map1->dim, map2->dim), goto error);
-
-	if (isl_map_is_empty(map2)) {
-		isl_map_free(map2);
-		return map1;
-	}
-
-	map1 = isl_map_compute_divs(map1);
-	map2 = isl_map_compute_divs(map2);
-	if (!map1 || !map2)
-		goto error;
-
-	map1 = isl_map_remove_empty_parts(map1);
-	map2 = isl_map_remove_empty_parts(map2);
-
-	diff = isl_map_empty_like(map1);
-	for (i = 0; i < map1->n; ++i) {
-		struct isl_map *d;
-		d = basic_map_subtract(isl_basic_map_copy(map1->p[i]),
-				       isl_map_copy(map2));
-		if (ISL_F_ISSET(map1, ISL_MAP_DISJOINT))
-			diff = isl_map_union_disjoint(diff, d);
-		else
-			diff = isl_map_union(diff, d);
-	}
-
-	isl_map_free(map1);
-	isl_map_free(map2);
-
-	return diff;
-error:
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return NULL;
-}
-
-struct isl_set *isl_set_subtract(struct isl_set *set1, struct isl_set *set2)
-{
-	return (struct isl_set *)
-		isl_map_subtract(
-			(struct isl_map *)set1, (struct isl_map *)set2);
-}
-
-/* A diff collector that aborts as soon as its add function is called,
- * setting empty to 0.
- */
-struct isl_is_empty_diff_collector {
-	struct isl_diff_collector dc;
-	int empty;
-};
-
-/* isl_is_empty_diff_collector callback.
- */
-static int basic_map_is_empty_add(struct isl_diff_collector *dc,
-			    __isl_take isl_basic_map *bmap)
-{
-	struct isl_is_empty_diff_collector *edc;
-	edc = (struct isl_is_empty_diff_collector *)dc;
-
-	edc->empty = 0;
-
-	isl_basic_map_free(bmap);
-	return -1;
-}
-
-/* Check if bmap \ map is empty by computing this set difference
- * and breaking off as soon as the difference is known to be non-empty.
- */
-static int basic_map_diff_is_empty(__isl_keep isl_basic_map *bmap,
-	__isl_keep isl_map *map)
-{
-	int r;
-	struct isl_is_empty_diff_collector edc;
-
-	r = isl_basic_map_plain_is_empty(bmap);
-	if (r)
-		return r;
-
-	edc.dc.add = &basic_map_is_empty_add;
-	edc.empty = 1;
-	r = basic_map_collect_diff(isl_basic_map_copy(bmap),
-				   isl_map_copy(map), &edc.dc);
-	if (!edc.empty)
-		return 0;
-
-	return r < 0 ? -1 : 1;
-}
-
-/* Check if map1 \ map2 is empty by checking if the set difference is empty
- * for each of the basic maps in map1.
- */
-static int map_diff_is_empty(__isl_keep isl_map *map1, __isl_keep isl_map *map2)
-{
-	int i;
-	int is_empty = 1;
-
-	if (!map1 || !map2)
-		return -1;
-	
-	for (i = 0; i < map1->n; ++i) {
-		is_empty = basic_map_diff_is_empty(map1->p[i], map2);
-		if (is_empty < 0 || !is_empty)
-			 break;
-	}
-
-	return is_empty;
-}
-
-/* Return 1 if "bmap" contains a single element.
- */
-int isl_basic_map_plain_is_singleton(__isl_keep isl_basic_map *bmap)
-{
-	if (!bmap)
-		return -1;
-	if (bmap->n_div)
-		return 0;
-	if (bmap->n_ineq)
-		return 0;
-	return bmap->n_eq == isl_basic_map_total_dim(bmap);
-}
-
-/* Return 1 if "map" contains a single element.
- */
-int isl_map_plain_is_singleton(__isl_keep isl_map *map)
-{
-	if (!map)
-		return -1;
-	if (map->n != 1)
-		return 0;
-
-	return isl_basic_map_plain_is_singleton(map->p[0]);
-}
-
-/* Given a singleton basic map, extract the single element
- * as an isl_point.
- */
-static __isl_give isl_point *singleton_extract_point(
-	__isl_keep isl_basic_map *bmap)
-{
-	int j;
-	unsigned dim;
-	struct isl_vec *point;
-	isl_int m;
-
-	if (!bmap)
-		return NULL;
-
-	dim = isl_basic_map_total_dim(bmap);
-	isl_assert(bmap->ctx, bmap->n_eq == dim, return NULL);
-	point = isl_vec_alloc(bmap->ctx, 1 + dim);
-	if (!point)
-		return NULL;
-
-	isl_int_init(m);
-
-	isl_int_set_si(point->el[0], 1);
-	for (j = 0; j < bmap->n_eq; ++j) {
-		int i = dim - 1 - j;
-		isl_assert(bmap->ctx,
-		    isl_seq_first_non_zero(bmap->eq[j] + 1, i) == -1,
-		    goto error);
-		isl_assert(bmap->ctx,
-		    isl_int_is_one(bmap->eq[j][1 + i]) ||
-		    isl_int_is_negone(bmap->eq[j][1 + i]),
-		    goto error);
-		isl_assert(bmap->ctx,
-		    isl_seq_first_non_zero(bmap->eq[j]+1+i+1, dim-i-1) == -1,
-		    goto error);
-
-		isl_int_gcd(m, point->el[0], bmap->eq[j][1 + i]);
-		isl_int_divexact(m, bmap->eq[j][1 + i], m);
-		isl_int_abs(m, m);
-		isl_seq_scale(point->el, point->el, m, 1 + i);
-		isl_int_divexact(m, point->el[0], bmap->eq[j][1 + i]);
-		isl_int_neg(m, m);
-		isl_int_mul(point->el[1 + i], m, bmap->eq[j][0]);
-	}
-
-	isl_int_clear(m);
-	return isl_point_alloc(isl_basic_map_get_dim(bmap), point);
-error:
-	isl_int_clear(m);
-	isl_vec_free(point);
-	return NULL;
-}
-
-/* Return 1 is the singleton map "map1" is a subset of "map2",
- * i.e., if the single element of "map1" is also an element of "map2".
- * Assumes "map2" has known divs.
- */
-static int map_is_singleton_subset(__isl_keep isl_map *map1,
-	__isl_keep isl_map *map2)
-{
-	int i;
-	int is_subset = 0;
-	struct isl_point *point;
-
-	if (!map1 || !map2)
-		return -1;
-	if (map1->n != 1)
-		return -1;
-
-	point = singleton_extract_point(map1->p[0]);
-	if (!point)
-		return -1;
-
-	for (i = 0; i < map2->n; ++i) {
-		is_subset = isl_basic_map_contains_point(map2->p[i], point);
-		if (is_subset)
-			break;
-	}
-
-	isl_point_free(point);
-	return is_subset;
-}
-
-int isl_map_is_subset(struct isl_map *map1, struct isl_map *map2)
-{
-	int is_subset = 0;
-
-	if (!map1 || !map2)
-		return -1;
-
-	if (isl_map_is_empty(map1))
-		return 1;
-
-	if (isl_map_is_empty(map2))
-		return 0;
-
-	if (isl_map_plain_is_universe(map2))
-		return 1;
-
-	map2 = isl_map_compute_divs(isl_map_copy(map2));
-	if (isl_map_plain_is_singleton(map1)) {
-		is_subset = map_is_singleton_subset(map1, map2);
-		isl_map_free(map2);
-		return is_subset;
-	}
-	is_subset = map_diff_is_empty(map1, map2);
-	isl_map_free(map2);
-
-	return is_subset;
-}
-
-int isl_set_is_subset(struct isl_set *set1, struct isl_set *set2)
-{
-	return isl_map_is_subset(
-			(struct isl_map *)set1, (struct isl_map *)set2);
-}
-
-__isl_give isl_map *isl_map_make_disjoint(__isl_take isl_map *map)
-{
-	int i;
-	struct isl_subtract_diff_collector sdc;
-	sdc.dc.add = &basic_map_subtract_add;
-
-	if (!map)
-		return NULL;
-	if (ISL_F_ISSET(map, ISL_MAP_DISJOINT))
-		return map;
-	if (map->n <= 1)
-		return map;
-
-	map = isl_map_compute_divs(map);
-	map = isl_map_remove_empty_parts(map);
-
-	if (!map || map->n <= 1)
-		return map;
-
-	sdc.diff = isl_map_from_basic_map(isl_basic_map_copy(map->p[0]));
-
-	for (i = 1; i < map->n; ++i) {
-		struct isl_basic_map *bmap = isl_basic_map_copy(map->p[i]);
-		struct isl_map *copy = isl_map_copy(sdc.diff);
-		if (basic_map_collect_diff(bmap, copy, &sdc.dc) < 0) {
-			isl_map_free(sdc.diff);
-			sdc.diff = NULL;
-			break;
-		}
-	}
-
-	isl_map_free(map);
-
-	return sdc.diff;
-}
-
-__isl_give isl_set *isl_set_make_disjoint(__isl_take isl_set *set)
-{
-	return (struct isl_set *)isl_map_make_disjoint((struct isl_map *)set);
-}
-
-__isl_give isl_set *isl_set_complement(__isl_take isl_set *set)
-{
-	isl_set *universe;
-
-	if (!set)
-		return NULL;
-
-	universe = isl_set_universe(isl_set_get_dim(set));
-
-	return isl_set_subtract(universe, set);
-}
diff --git a/cloog-0.16.3/isl/isl_mat.c b/cloog-0.16.3/isl/isl_mat.c
deleted file mode 100644
index e64beae..0000000
--- a/cloog-0.16.3/isl/isl_mat.c
+++ /dev/null
@@ -1,1625 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl/dim.h>
-#include <isl/seq.h>
-#include <isl_mat_private.h>
-#include "isl_map_private.h"
-#include <isl_dim_private.h>
-
-isl_ctx *isl_mat_get_ctx(__isl_keep isl_mat *mat)
-{
-	return mat ? mat->ctx : NULL;
-}
-
-struct isl_mat *isl_mat_alloc(struct isl_ctx *ctx,
-	unsigned n_row, unsigned n_col)
-{
-	int i;
-	struct isl_mat *mat;
-
-	mat = isl_alloc_type(ctx, struct isl_mat);
-	if (!mat)
-		return NULL;
-
-	mat->row = NULL;
-	mat->block = isl_blk_alloc(ctx, n_row * n_col);
-	if (isl_blk_is_error(mat->block))
-		goto error;
-	mat->row = isl_alloc_array(ctx, isl_int *, n_row);
-	if (!mat->row)
-		goto error;
-
-	for (i = 0; i < n_row; ++i)
-		mat->row[i] = mat->block.data + i * n_col;
-
-	mat->ctx = ctx;
-	isl_ctx_ref(ctx);
-	mat->ref = 1;
-	mat->n_row = n_row;
-	mat->n_col = n_col;
-	mat->max_col = n_col;
-	mat->flags = 0;
-
-	return mat;
-error:
-	isl_blk_free(ctx, mat->block);
-	free(mat);
-	return NULL;
-}
-
-struct isl_mat *isl_mat_extend(struct isl_mat *mat,
-	unsigned n_row, unsigned n_col)
-{
-	int i;
-	isl_int *old;
-	isl_int **row;
-
-	if (!mat)
-		return NULL;
-
-	if (mat->max_col >= n_col && mat->n_row >= n_row) {
-		if (mat->n_col < n_col)
-			mat->n_col = n_col;
-		return mat;
-	}
-
-	if (mat->max_col < n_col) {
-		struct isl_mat *new_mat;
-
-		if (n_row < mat->n_row)
-			n_row = mat->n_row;
-		new_mat = isl_mat_alloc(mat->ctx, n_row, n_col);
-		if (!new_mat)
-			goto error;
-		for (i = 0; i < mat->n_row; ++i)
-			isl_seq_cpy(new_mat->row[i], mat->row[i], mat->n_col);
-		isl_mat_free(mat);
-		return new_mat;
-	}
-
-	mat = isl_mat_cow(mat);
-	if (!mat)
-		goto error;
-
-	old = mat->block.data;
-	mat->block = isl_blk_extend(mat->ctx, mat->block, n_row * mat->max_col);
-	if (isl_blk_is_error(mat->block))
-		goto error;
-	row = isl_realloc_array(mat->ctx, mat->row, isl_int *, n_row);
-	if (!row)
-		goto error;
-	mat->row = row;
-
-	for (i = 0; i < mat->n_row; ++i)
-		mat->row[i] = mat->block.data + (mat->row[i] - old);
-	for (i = mat->n_row; i < n_row; ++i)
-		mat->row[i] = mat->block.data + i * mat->max_col;
-	mat->n_row = n_row;
-	if (mat->n_col < n_col)
-		mat->n_col = n_col;
-
-	return mat;
-error:
-	isl_mat_free(mat);
-	return NULL;
-}
-
-__isl_give isl_mat *isl_mat_sub_alloc6(isl_ctx *ctx, isl_int **row,
-	unsigned first_row, unsigned n_row, unsigned first_col, unsigned n_col)
-{
-	int i;
-	struct isl_mat *mat;
-
-	mat = isl_alloc_type(ctx, struct isl_mat);
-	if (!mat)
-		return NULL;
-	mat->row = isl_alloc_array(ctx, isl_int *, n_row);
-	if (!mat->row)
-		goto error;
-	for (i = 0; i < n_row; ++i)
-		mat->row[i] = row[first_row+i] + first_col;
-	mat->ctx = ctx;
-	isl_ctx_ref(ctx);
-	mat->ref = 1;
-	mat->n_row = n_row;
-	mat->n_col = n_col;
-	mat->block = isl_blk_empty();
-	mat->flags = ISL_MAT_BORROWED;
-	return mat;
-error:
-	free(mat);
-	return NULL;
-}
-
-__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)
-{
-	if (!mat)
-		return NULL;
-	return isl_mat_sub_alloc6(mat->ctx, mat->row, first_row, n_row,
-				  first_col, n_col);
-}
-
-void isl_mat_sub_copy(struct isl_ctx *ctx, isl_int **dst, isl_int **src,
-	unsigned n_row, unsigned dst_col, unsigned src_col, unsigned n_col)
-{
-	int i;
-
-	for (i = 0; i < n_row; ++i)
-		isl_seq_cpy(dst[i]+dst_col, src[i]+src_col, n_col);
-}
-
-void isl_mat_sub_neg(struct isl_ctx *ctx, isl_int **dst, isl_int **src,
-	unsigned n_row, unsigned dst_col, unsigned src_col, unsigned n_col)
-{
-	int i;
-
-	for (i = 0; i < n_row; ++i)
-		isl_seq_neg(dst[i]+dst_col, src[i]+src_col, n_col);
-}
-
-struct isl_mat *isl_mat_copy(struct isl_mat *mat)
-{
-	if (!mat)
-		return NULL;
-
-	mat->ref++;
-	return mat;
-}
-
-struct isl_mat *isl_mat_dup(struct isl_mat *mat)
-{
-	int i;
-	struct isl_mat *mat2;
-
-	if (!mat)
-		return NULL;
-	mat2 = isl_mat_alloc(mat->ctx, mat->n_row, mat->n_col);
-	if (!mat2)
-		return NULL;
-	for (i = 0; i < mat->n_row; ++i)
-		isl_seq_cpy(mat2->row[i], mat->row[i], mat->n_col);
-	return mat2;
-}
-
-struct isl_mat *isl_mat_cow(struct isl_mat *mat)
-{
-	struct isl_mat *mat2;
-	if (!mat)
-		return NULL;
-
-	if (mat->ref == 1 && !ISL_F_ISSET(mat, ISL_MAT_BORROWED))
-		return mat;
-
-	mat2 = isl_mat_dup(mat);
-	isl_mat_free(mat);
-	return mat2;
-}
-
-void isl_mat_free(struct isl_mat *mat)
-{
-	if (!mat)
-		return;
-
-	if (--mat->ref > 0)
-		return;
-
-	if (!ISL_F_ISSET(mat, ISL_MAT_BORROWED))
-		isl_blk_free(mat->ctx, mat->block);
-	isl_ctx_deref(mat->ctx);
-	free(mat->row);
-	free(mat);
-}
-
-int isl_mat_rows(__isl_keep isl_mat *mat)
-{
-	return mat ? mat->n_row : -1;
-}
-
-int isl_mat_cols(__isl_keep isl_mat *mat)
-{
-	return mat ? mat->n_col : -1;
-}
-
-int isl_mat_get_element(__isl_keep isl_mat *mat, int row, int col, isl_int *v)
-{
-	if (!mat)
-		return -1;
-	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);
-	isl_int_set(*v, mat->row[row][col]);
-	return 0;
-}
-
-__isl_give isl_mat *isl_mat_set_element(__isl_take isl_mat *mat,
-	int row, int col, isl_int v)
-{
-	mat = isl_mat_cow(mat);
-	if (!mat)
-		return NULL;
-	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);
-	isl_int_set(mat->row[row][col], v);
-	return mat;
-error:
-	isl_mat_free(mat);
-	return NULL;
-}
-
-__isl_give isl_mat *isl_mat_set_element_si(__isl_take isl_mat *mat,
-	int row, int col, int v)
-{
-	mat = isl_mat_cow(mat);
-	if (!mat)
-		return NULL;
-	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);
-	isl_int_set_si(mat->row[row][col], v);
-	return mat;
-error:
-	isl_mat_free(mat);
-	return NULL;
-}
-
-struct isl_mat *isl_mat_identity(struct isl_ctx *ctx, unsigned n_row)
-{
-	int i;
-	struct isl_mat *mat;
-
-	mat = isl_mat_alloc(ctx, n_row, n_row);
-	if (!mat)
-		return NULL;
-	for (i = 0; i < n_row; ++i) {
-		isl_seq_clr(mat->row[i], i);
-		isl_int_set_si(mat->row[i][i], 1);
-		isl_seq_clr(mat->row[i]+i+1, n_row-(i+1));
-	}
-
-	return mat;
-}
-
-struct isl_vec *isl_mat_vec_product(struct isl_mat *mat, struct isl_vec *vec)
-{
-	int i;
-	struct isl_vec *prod;
-
-	if (!mat || !vec)
-		goto error;
-
-	isl_assert(mat->ctx, mat->n_col == vec->size, goto error);
-
-	prod = isl_vec_alloc(mat->ctx, mat->n_row);
-	if (!prod)
-		goto error;
-
-	for (i = 0; i < prod->size; ++i)
-		isl_seq_inner_product(mat->row[i], vec->el, vec->size,
-					&prod->block.data[i]);
-	isl_mat_free(mat);
-	isl_vec_free(vec);
-	return prod;
-error:
-	isl_mat_free(mat);
-	isl_vec_free(vec);
-	return NULL;
-}
-
-__isl_give isl_vec *isl_mat_vec_inverse_product(__isl_take isl_mat *mat,
-	__isl_take isl_vec *vec)
-{
-	struct isl_mat *vec_mat;
-	int i;
-
-	if (!mat || !vec)
-		goto error;
-	vec_mat = isl_mat_alloc(vec->ctx, vec->size, 1);
-	if (!vec_mat)
-		goto error;
-	for (i = 0; i < vec->size; ++i)
-		isl_int_set(vec_mat->row[i][0], vec->el[i]);
-	vec_mat = isl_mat_inverse_product(mat, vec_mat);
-	isl_vec_free(vec);
-	if (!vec_mat)
-		return NULL;
-	vec = isl_vec_alloc(vec_mat->ctx, vec_mat->n_row);
-	if (vec)
-		for (i = 0; i < vec->size; ++i)
-			isl_int_set(vec->el[i], vec_mat->row[i][0]);
-	isl_mat_free(vec_mat);
-	return vec;
-error:
-	isl_mat_free(mat);
-	isl_vec_free(vec);
-	return NULL;
-}
-
-struct isl_vec *isl_vec_mat_product(struct isl_vec *vec, struct isl_mat *mat)
-{
-	int i, j;
-	struct isl_vec *prod;
-
-	if (!mat || !vec)
-		goto error;
-
-	isl_assert(mat->ctx, mat->n_row == vec->size, goto error);
-
-	prod = isl_vec_alloc(mat->ctx, mat->n_col);
-	if (!prod)
-		goto error;
-
-	for (i = 0; i < prod->size; ++i) {
-		isl_int_set_si(prod->el[i], 0);
-		for (j = 0; j < vec->size; ++j)
-			isl_int_addmul(prod->el[i], vec->el[j], mat->row[j][i]);
-	}
-	isl_mat_free(mat);
-	isl_vec_free(vec);
-	return prod;
-error:
-	isl_mat_free(mat);
-	isl_vec_free(vec);
-	return NULL;
-}
-
-struct isl_mat *isl_mat_aff_direct_sum(struct isl_mat *left,
-	struct isl_mat *right)
-{
-	int i;
-	struct isl_mat *sum;
-
-	if (!left || !right)
-		goto error;
-
-	isl_assert(left->ctx, left->n_row == right->n_row, goto error);
-	isl_assert(left->ctx, left->n_row >= 1, goto error);
-	isl_assert(left->ctx, left->n_col >= 1, goto error);
-	isl_assert(left->ctx, right->n_col >= 1, goto error);
-	isl_assert(left->ctx,
-	    isl_seq_first_non_zero(left->row[0]+1, left->n_col-1) == -1,
-	    goto error);
-	isl_assert(left->ctx,
-	    isl_seq_first_non_zero(right->row[0]+1, right->n_col-1) == -1,
-	    goto error);
-
-	sum = isl_mat_alloc(left->ctx, left->n_row, left->n_col + right->n_col - 1);
-	if (!sum)
-		goto error;
-	isl_int_lcm(sum->row[0][0], left->row[0][0], right->row[0][0]);
-	isl_int_divexact(left->row[0][0], sum->row[0][0], left->row[0][0]);
-	isl_int_divexact(right->row[0][0], sum->row[0][0], right->row[0][0]);
-
-	isl_seq_clr(sum->row[0]+1, sum->n_col-1);
-	for (i = 1; i < sum->n_row; ++i) {
-		isl_int_mul(sum->row[i][0], left->row[0][0], left->row[i][0]);
-		isl_int_addmul(sum->row[i][0],
-				right->row[0][0], right->row[i][0]);
-		isl_seq_scale(sum->row[i]+1, left->row[i]+1, left->row[0][0],
-				left->n_col-1);
-		isl_seq_scale(sum->row[i]+left->n_col,
-				right->row[i]+1, right->row[0][0],
-				right->n_col-1);
-	}
-
-	isl_int_divexact(left->row[0][0], sum->row[0][0], left->row[0][0]);
-	isl_int_divexact(right->row[0][0], sum->row[0][0], right->row[0][0]);
-	isl_mat_free(left);
-	isl_mat_free(right);
-	return sum;
-error:
-	isl_mat_free(left);
-	isl_mat_free(right);
-	return NULL;
-}
-
-static void exchange(struct isl_mat *M, struct isl_mat **U,
-	struct isl_mat **Q, unsigned row, unsigned i, unsigned j)
-{
-	int r;
-	for (r = row; r < M->n_row; ++r)
-		isl_int_swap(M->row[r][i], M->row[r][j]);
-	if (U) {
-		for (r = 0; r < (*U)->n_row; ++r)
-			isl_int_swap((*U)->row[r][i], (*U)->row[r][j]);
-	}
-	if (Q)
-		isl_mat_swap_rows(*Q, i, j);
-}
-
-static void subtract(struct isl_mat *M, struct isl_mat **U,
-	struct isl_mat **Q, unsigned row, unsigned i, unsigned j, isl_int m)
-{
-	int r;
-	for (r = row; r < M->n_row; ++r)
-		isl_int_submul(M->row[r][j], m, M->row[r][i]);
-	if (U) {
-		for (r = 0; r < (*U)->n_row; ++r)
-			isl_int_submul((*U)->row[r][j], m, (*U)->row[r][i]);
-	}
-	if (Q) {
-		for (r = 0; r < (*Q)->n_col; ++r)
-			isl_int_addmul((*Q)->row[i][r], m, (*Q)->row[j][r]);
-	}
-}
-
-static void oppose(struct isl_mat *M, struct isl_mat **U,
-	struct isl_mat **Q, unsigned row, unsigned col)
-{
-	int r;
-	for (r = row; r < M->n_row; ++r)
-		isl_int_neg(M->row[r][col], M->row[r][col]);
-	if (U) {
-		for (r = 0; r < (*U)->n_row; ++r)
-			isl_int_neg((*U)->row[r][col], (*U)->row[r][col]);
-	}
-	if (Q)
-		isl_seq_neg((*Q)->row[col], (*Q)->row[col], (*Q)->n_col);
-}
-
-/* Given matrix M, compute
- *
- *		M U = H
- *		M   = H Q
- *
- * with U and Q unimodular matrices and H a matrix in column echelon form
- * such that on each echelon row the entries in the non-echelon column
- * are non-negative (if neg == 0) or non-positive (if neg == 1)
- * and stricly smaller (in absolute value) than the entries in the echelon
- * column.
- * If U or Q are NULL, then these matrices are not computed.
- */
-struct isl_mat *isl_mat_left_hermite(struct isl_mat *M, int neg,
-	struct isl_mat **U, struct isl_mat **Q)
-{
-	isl_int c;
-	int row, col;
-
-	if (U)
-		*U = NULL;
-	if (Q)
-		*Q = NULL;
-	if (!M)
-		goto error;
-	M = isl_mat_cow(M);
-	if (!M)
-		goto error;
-	if (U) {
-		*U = isl_mat_identity(M->ctx, M->n_col);
-		if (!*U)
-			goto error;
-	}
-	if (Q) {
-		*Q = isl_mat_identity(M->ctx, M->n_col);
-		if (!*Q)
-			goto error;
-	}
-
-	col = 0;
-	isl_int_init(c);
-	for (row = 0; row < M->n_row; ++row) {
-		int first, i, off;
-		first = isl_seq_abs_min_non_zero(M->row[row]+col, M->n_col-col);
-		if (first == -1)
-			continue;
-		first += col;
-		if (first != col)
-			exchange(M, U, Q, row, first, col);
-		if (isl_int_is_neg(M->row[row][col]))
-			oppose(M, U, Q, row, col);
-		first = col+1;
-		while ((off = isl_seq_first_non_zero(M->row[row]+first,
-						       M->n_col-first)) != -1) {
-			first += off;
-			isl_int_fdiv_q(c, M->row[row][first], M->row[row][col]);
-			subtract(M, U, Q, row, col, first, c);
-			if (!isl_int_is_zero(M->row[row][first]))
-				exchange(M, U, Q, row, first, col);
-			else
-				++first;
-		}
-		for (i = 0; i < col; ++i) {
-			if (isl_int_is_zero(M->row[row][i]))
-				continue;
-			if (neg)
-				isl_int_cdiv_q(c, M->row[row][i], M->row[row][col]);
-			else
-				isl_int_fdiv_q(c, M->row[row][i], M->row[row][col]);
-			if (isl_int_is_zero(c))
-				continue;
-			subtract(M, U, Q, row, col, i, c);
-		}
-		++col;
-	}
-	isl_int_clear(c);
-
-	return M;
-error:
-	if (Q) {
-		isl_mat_free(*Q);
-		*Q = NULL;
-	}
-	if (U) {
-		isl_mat_free(*U);
-		*U = NULL;
-	}
-	isl_mat_free(M);
-	return NULL;
-}
-
-struct isl_mat *isl_mat_right_kernel(struct isl_mat *mat)
-{
-	int i, rank;
-	struct isl_mat *U = NULL;
-	struct isl_mat *K;
-
-	mat = isl_mat_left_hermite(mat, 0, &U, NULL);
-	if (!mat || !U)
-		goto error;
-
-	for (i = 0, rank = 0; rank < mat->n_col; ++rank) {
-		while (i < mat->n_row && isl_int_is_zero(mat->row[i][rank]))
-			++i;
-		if (i >= mat->n_row)
-			break;
-	}
-	K = isl_mat_alloc(U->ctx, U->n_row, U->n_col - rank);
-	if (!K)
-		goto error;
-	isl_mat_sub_copy(K->ctx, K->row, U->row, U->n_row, 0, rank, U->n_col-rank);
-	isl_mat_free(mat);
-	isl_mat_free(U);
-	return K;
-error:
-	isl_mat_free(mat);
-	isl_mat_free(U);
-	return NULL;
-}
-
-struct isl_mat *isl_mat_lin_to_aff(struct isl_mat *mat)
-{
-	int i;
-	struct isl_mat *mat2;
-
-	if (!mat)
-		return NULL;
-	mat2 = isl_mat_alloc(mat->ctx, 1+mat->n_row, 1+mat->n_col);
-	if (!mat2)
-		goto error;
-	isl_int_set_si(mat2->row[0][0], 1);
-	isl_seq_clr(mat2->row[0]+1, mat->n_col);
-	for (i = 0; i < mat->n_row; ++i) {
-		isl_int_set_si(mat2->row[1+i][0], 0);
-		isl_seq_cpy(mat2->row[1+i]+1, mat->row[i], mat->n_col);
-	}
-	isl_mat_free(mat);
-	return mat2;
-error:
-	isl_mat_free(mat);
-	return NULL;
-}
-
-/* Given two matrices M1 and M2, return the block matrix
- *
- *	[ M1  0  ]
- *	[ 0   M2 ]
- */
-__isl_give isl_mat *isl_mat_diagonal(__isl_take isl_mat *mat1,
-	__isl_take isl_mat *mat2)
-{
-	int i;
-	isl_mat *mat;
-
-	if (!mat1 || !mat2)
-		goto error;
-
-	mat = isl_mat_alloc(mat1->ctx, mat1->n_row + mat2->n_row,
-				       mat1->n_col + mat2->n_col);
-	if (!mat)
-		goto error;
-	for (i = 0; i < mat1->n_row; ++i) {
-		isl_seq_cpy(mat->row[i], mat1->row[i], mat1->n_col);
-		isl_seq_clr(mat->row[i] + mat1->n_col, mat2->n_col);
-	}
-	for (i = 0; i < mat2->n_row; ++i) {
-		isl_seq_clr(mat->row[mat1->n_row + i], mat1->n_col);
-		isl_seq_cpy(mat->row[mat1->n_row + i] + mat1->n_col,
-						    mat2->row[i], mat2->n_col);
-	}
-	isl_mat_free(mat1);
-	isl_mat_free(mat2);
-	return mat;
-error:
-	isl_mat_free(mat1);
-	isl_mat_free(mat2);
-	return NULL;
-}
-
-static int row_first_non_zero(isl_int **row, unsigned n_row, unsigned col)
-{
-	int i;
-
-	for (i = 0; i < n_row; ++i)
-		if (!isl_int_is_zero(row[i][col]))
-			return i;
-	return -1;
-}
-
-static int row_abs_min_non_zero(isl_int **row, unsigned n_row, unsigned col)
-{
-	int i, min = row_first_non_zero(row, n_row, col);
-	if (min < 0)
-		return -1;
-	for (i = min + 1; i < n_row; ++i) {
-		if (isl_int_is_zero(row[i][col]))
-			continue;
-		if (isl_int_abs_lt(row[i][col], row[min][col]))
-			min = i;
-	}
-	return min;
-}
-
-static void inv_exchange(struct isl_mat *left, struct isl_mat *right,
-	unsigned i, unsigned j)
-{
-	left = isl_mat_swap_rows(left, i, j);
-	right = isl_mat_swap_rows(right, i, j);
-}
-
-static void inv_oppose(
-	struct isl_mat *left, struct isl_mat *right, unsigned row)
-{
-	isl_seq_neg(left->row[row]+row, left->row[row]+row, left->n_col-row);
-	isl_seq_neg(right->row[row], right->row[row], right->n_col);
-}
-
-static void inv_subtract(struct isl_mat *left, struct isl_mat *right,
-	unsigned row, unsigned i, isl_int m)
-{
-	isl_int_neg(m, m);
-	isl_seq_combine(left->row[i]+row,
-			left->ctx->one, left->row[i]+row,
-			m, left->row[row]+row,
-			left->n_col-row);
-	isl_seq_combine(right->row[i], right->ctx->one, right->row[i],
-			m, right->row[row], right->n_col);
-}
-
-/* Compute inv(left)*right
- */
-struct isl_mat *isl_mat_inverse_product(struct isl_mat *left,
-	struct isl_mat *right)
-{
-	int row;
-	isl_int a, b;
-
-	if (!left || !right)
-		goto error;
-
-	isl_assert(left->ctx, left->n_row == left->n_col, goto error);
-	isl_assert(left->ctx, left->n_row == right->n_row, goto error);
-
-	if (left->n_row == 0) {
-		isl_mat_free(left);
-		return right;
-	}
-
-	left = isl_mat_cow(left);
-	right = isl_mat_cow(right);
-	if (!left || !right)
-		goto error;
-
-	isl_int_init(a);
-	isl_int_init(b);
-	for (row = 0; row < left->n_row; ++row) {
-		int pivot, first, i, off;
-		pivot = row_abs_min_non_zero(left->row+row, left->n_row-row, row);
-		if (pivot < 0) {
-			isl_int_clear(a);
-			isl_int_clear(b);
-			isl_assert(left->ctx, pivot >= 0, goto error);
-		}
-		pivot += row;
-		if (pivot != row)
-			inv_exchange(left, right, pivot, row);
-		if (isl_int_is_neg(left->row[row][row]))
-			inv_oppose(left, right, row);
-		first = row+1;
-		while ((off = row_first_non_zero(left->row+first,
-					left->n_row-first, row)) != -1) {
-			first += off;
-			isl_int_fdiv_q(a, left->row[first][row],
-					left->row[row][row]);
-			inv_subtract(left, right, row, first, a);
-			if (!isl_int_is_zero(left->row[first][row]))
-				inv_exchange(left, right, row, first);
-			else
-				++first;
-		}
-		for (i = 0; i < row; ++i) {
-			if (isl_int_is_zero(left->row[i][row]))
-				continue;
-			isl_int_gcd(a, left->row[row][row], left->row[i][row]);
-			isl_int_divexact(b, left->row[i][row], a);
-			isl_int_divexact(a, left->row[row][row], a);
-			isl_int_neg(b, b);
-			isl_seq_combine(left->row[i] + i,
-					a, left->row[i] + i,
-					b, left->row[row] + i,
-					left->n_col - i);
-			isl_seq_combine(right->row[i], a, right->row[i],
-					b, right->row[row], right->n_col);
-		}
-	}
-	isl_int_clear(b);
-
-	isl_int_set(a, left->row[0][0]);
-	for (row = 1; row < left->n_row; ++row)
-		isl_int_lcm(a, a, left->row[row][row]);
-	if (isl_int_is_zero(a)){
-		isl_int_clear(a);
-		isl_assert(left->ctx, 0, goto error);
-	}
-	for (row = 0; row < left->n_row; ++row) {
-		isl_int_divexact(left->row[row][row], a, left->row[row][row]);
-		if (isl_int_is_one(left->row[row][row]))
-			continue;
-		isl_seq_scale(right->row[row], right->row[row],
-				left->row[row][row], right->n_col);
-	}
-	isl_int_clear(a);
-
-	isl_mat_free(left);
-	return right;
-error:
-	isl_mat_free(left);
-	isl_mat_free(right);
-	return NULL;
-}
-
-void isl_mat_col_scale(struct isl_mat *mat, unsigned col, isl_int m)
-{
-	int i;
-
-	for (i = 0; i < mat->n_row; ++i)
-		isl_int_mul(mat->row[i][col], mat->row[i][col], m);
-}
-
-void isl_mat_col_combine(struct isl_mat *mat, unsigned dst,
-	isl_int m1, unsigned src1, isl_int m2, unsigned src2)
-{
-	int i;
-	isl_int tmp;
-
-	isl_int_init(tmp);
-	for (i = 0; i < mat->n_row; ++i) {
-		isl_int_mul(tmp, m1, mat->row[i][src1]);
-		isl_int_addmul(tmp, m2, mat->row[i][src2]);
-		isl_int_set(mat->row[i][dst], tmp);
-	}
-	isl_int_clear(tmp);
-}
-
-struct isl_mat *isl_mat_right_inverse(struct isl_mat *mat)
-{
-	struct isl_mat *inv;
-	int row;
-	isl_int a, b;
-
-	mat = isl_mat_cow(mat);
-	if (!mat)
-		return NULL;
-
-	inv = isl_mat_identity(mat->ctx, mat->n_col);
-	inv = isl_mat_cow(inv);
-	if (!inv)
-		goto error;
-
-	isl_int_init(a);
-	isl_int_init(b);
-	for (row = 0; row < mat->n_row; ++row) {
-		int pivot, first, i, off;
-		pivot = isl_seq_abs_min_non_zero(mat->row[row]+row, mat->n_col-row);
-		if (pivot < 0) {
-			isl_int_clear(a);
-			isl_int_clear(b);
-			isl_assert(mat->ctx, pivot >= 0, goto error);
-		}
-		pivot += row;
-		if (pivot != row)
-			exchange(mat, &inv, NULL, row, pivot, row);
-		if (isl_int_is_neg(mat->row[row][row]))
-			oppose(mat, &inv, NULL, row, row);
-		first = row+1;
-		while ((off = isl_seq_first_non_zero(mat->row[row]+first,
-						    mat->n_col-first)) != -1) {
-			first += off;
-			isl_int_fdiv_q(a, mat->row[row][first],
-						    mat->row[row][row]);
-			subtract(mat, &inv, NULL, row, row, first, a);
-			if (!isl_int_is_zero(mat->row[row][first]))
-				exchange(mat, &inv, NULL, row, row, first);
-			else
-				++first;
-		}
-		for (i = 0; i < row; ++i) {
-			if (isl_int_is_zero(mat->row[row][i]))
-				continue;
-			isl_int_gcd(a, mat->row[row][row], mat->row[row][i]);
-			isl_int_divexact(b, mat->row[row][i], a);
-			isl_int_divexact(a, mat->row[row][row], a);
-			isl_int_neg(a, a);
-			isl_mat_col_combine(mat, i, a, i, b, row);
-			isl_mat_col_combine(inv, i, a, i, b, row);
-		}
-	}
-	isl_int_clear(b);
-
-	isl_int_set(a, mat->row[0][0]);
-	for (row = 1; row < mat->n_row; ++row)
-		isl_int_lcm(a, a, mat->row[row][row]);
-	if (isl_int_is_zero(a)){
-		isl_int_clear(a);
-		goto error;
-	}
-	for (row = 0; row < mat->n_row; ++row) {
-		isl_int_divexact(mat->row[row][row], a, mat->row[row][row]);
-		if (isl_int_is_one(mat->row[row][row]))
-			continue;
-		isl_mat_col_scale(inv, row, mat->row[row][row]);
-	}
-	isl_int_clear(a);
-
-	isl_mat_free(mat);
-
-	return inv;
-error:
-	isl_mat_free(mat);
-	isl_mat_free(inv);
-	return NULL;
-}
-
-struct isl_mat *isl_mat_transpose(struct isl_mat *mat)
-{
-	struct isl_mat *transpose = NULL;
-	int i, j;
-
-	if (mat->n_col == mat->n_row) {
-		mat = isl_mat_cow(mat);
-		if (!mat)
-			return NULL;
-		for (i = 0; i < mat->n_row; ++i)
-			for (j = i + 1; j < mat->n_col; ++j)
-				isl_int_swap(mat->row[i][j], mat->row[j][i]);
-		return mat;
-	}
-	transpose = isl_mat_alloc(mat->ctx, mat->n_col, mat->n_row);
-	if (!transpose)
-		goto error;
-	for (i = 0; i < mat->n_row; ++i)
-		for (j = 0; j < mat->n_col; ++j)
-			isl_int_set(transpose->row[j][i], mat->row[i][j]);
-	isl_mat_free(mat);
-	return transpose;
-error:
-	isl_mat_free(mat);
-	return NULL;
-}
-
-struct isl_mat *isl_mat_swap_cols(struct isl_mat *mat, unsigned i, unsigned j)
-{
-	int r;
-
-	mat = isl_mat_cow(mat);
-	if (!mat)
-		return NULL;
-	isl_assert(mat->ctx, i < mat->n_col, goto error);
-	isl_assert(mat->ctx, j < mat->n_col, goto error);
-
-	for (r = 0; r < mat->n_row; ++r)
-		isl_int_swap(mat->row[r][i], mat->row[r][j]);
-	return mat;
-error:
-	isl_mat_free(mat);
-	return NULL;
-}
-
-struct isl_mat *isl_mat_swap_rows(struct isl_mat *mat, unsigned i, unsigned j)
-{
-	isl_int *t;
-
-	if (!mat)
-		return NULL;
-	mat = isl_mat_cow(mat);
-	if (!mat)
-		return NULL;
-	t = mat->row[i];
-	mat->row[i] = mat->row[j];
-	mat->row[j] = t;
-	return mat;
-}
-
-struct isl_mat *isl_mat_product(struct isl_mat *left, struct isl_mat *right)
-{
-	int i, j, k;
-	struct isl_mat *prod;
-
-	if (!left || !right)
-		goto error;
-	isl_assert(left->ctx, left->n_col == right->n_row, goto error);
-	prod = isl_mat_alloc(left->ctx, left->n_row, right->n_col);
-	if (!prod)
-		goto error;
-	if (left->n_col == 0) {
-		for (i = 0; i < prod->n_row; ++i)
-			isl_seq_clr(prod->row[i], prod->n_col);
-		isl_mat_free(left);
-		isl_mat_free(right);
-		return prod;
-	}
-	for (i = 0; i < prod->n_row; ++i) {
-		for (j = 0; j < prod->n_col; ++j) {
-			isl_int_mul(prod->row[i][j],
-				    left->row[i][0], right->row[0][j]);
-			for (k = 1; k < left->n_col; ++k)
-				isl_int_addmul(prod->row[i][j],
-					    left->row[i][k], right->row[k][j]);
-		}
-	}
-	isl_mat_free(left);
-	isl_mat_free(right);
-	return prod;
-error:
-	isl_mat_free(left);
-	isl_mat_free(right);
-	return NULL;
-}
-
-/* Replace the variables x in the rows q by x' given by x = M x',
- * with M the matrix mat.
- *
- * If the number of new variables is greater than the original
- * number of variables, then the rows q have already been
- * preextended.  If the new number is smaller, then the coefficients
- * of the divs, which are not changed, need to be shifted down.
- * The row q may be the equalities, the inequalities or the
- * div expressions.  In the latter case, has_div is true and
- * we need to take into account the extra denominator column.
- */
-static int preimage(struct isl_ctx *ctx, isl_int **q, unsigned n,
-	unsigned n_div, int has_div, struct isl_mat *mat)
-{
-	int i;
-	struct isl_mat *t;
-	int e;
-
-	if (mat->n_col >= mat->n_row)
-		e = 0;
-	else
-		e = mat->n_row - mat->n_col;
-	if (has_div)
-		for (i = 0; i < n; ++i)
-			isl_int_mul(q[i][0], q[i][0], mat->row[0][0]);
-	t = isl_mat_sub_alloc6(mat->ctx, q, 0, n, has_div, mat->n_row);
-	t = isl_mat_product(t, mat);
-	if (!t)
-		return -1;
-	for (i = 0; i < n; ++i) {
-		isl_seq_swp_or_cpy(q[i] + has_div, t->row[i], t->n_col);
-		isl_seq_cpy(q[i] + has_div + t->n_col,
-			    q[i] + has_div + t->n_col + e, n_div);
-		isl_seq_clr(q[i] + has_div + t->n_col + n_div, e);
-	}
-	isl_mat_free(t);
-	return 0;
-}
-
-/* Replace the variables x in bset by x' given by x = M x', with
- * M the matrix mat.
- *
- * If there are fewer variables x' then there are x, then we perform
- * the transformation in place, which that, in principle,
- * this frees up some extra variables as the number
- * of columns remains constant, but we would have to extend
- * the div array too as the number of rows in this array is assumed
- * to be equal to extra.
- */
-struct isl_basic_set *isl_basic_set_preimage(struct isl_basic_set *bset,
-	struct isl_mat *mat)
-{
-	struct isl_ctx *ctx;
-
-	if (!bset || !mat)
-		goto error;
-
-	ctx = bset->ctx;
-	bset = isl_basic_set_cow(bset);
-	if (!bset)
-		goto error;
-
-	isl_assert(ctx, bset->dim->nparam == 0, goto error);
-	isl_assert(ctx, 1+bset->dim->n_out == mat->n_row, goto error);
-	isl_assert(ctx, mat->n_col > 0, goto error);
-
-	if (mat->n_col > mat->n_row) {
-		bset = isl_basic_set_extend(bset, 0, mat->n_col-1, 0, 0, 0);
-		if (!bset)
-			goto error;
-	} else if (mat->n_col < mat->n_row) {
-		bset->dim = isl_dim_cow(bset->dim);
-		if (!bset->dim)
-			goto error;
-		bset->dim->n_out -= mat->n_row - mat->n_col;
-	}
-
-	if (preimage(ctx, bset->eq, bset->n_eq, bset->n_div, 0,
-			isl_mat_copy(mat)) < 0)
-		goto error;
-
-	if (preimage(ctx, bset->ineq, bset->n_ineq, bset->n_div, 0,
-			isl_mat_copy(mat)) < 0)
-		goto error;
-
-	if (preimage(ctx, bset->div, bset->n_div, bset->n_div, 1, mat) < 0)
-		goto error2;
-
-	ISL_F_CLR(bset, ISL_BASIC_SET_NO_IMPLICIT);
-	ISL_F_CLR(bset, ISL_BASIC_SET_NO_REDUNDANT);
-	ISL_F_CLR(bset, ISL_BASIC_SET_NORMALIZED);
-	ISL_F_CLR(bset, ISL_BASIC_SET_NORMALIZED_DIVS);
-	ISL_F_CLR(bset, ISL_BASIC_SET_ALL_EQUALITIES);
-
-	bset = isl_basic_set_simplify(bset);
-	bset = isl_basic_set_finalize(bset);
-
-	return bset;
-error:
-	isl_mat_free(mat);
-error2:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-struct isl_set *isl_set_preimage(struct isl_set *set, struct isl_mat *mat)
-{
-	struct isl_ctx *ctx;
-	int i;
-
-	set = isl_set_cow(set);
-	if (!set)
-		return NULL;
-
-	ctx = set->ctx;
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_basic_set_preimage(set->p[i],
-						    isl_mat_copy(mat));
-		if (!set->p[i])
-			goto error;
-	}
-	if (mat->n_col != mat->n_row) {
-		set->dim = isl_dim_cow(set->dim);
-		if (!set->dim)
-			goto error;
-		set->dim->n_out += mat->n_col;
-		set->dim->n_out -= mat->n_row;
-	}
-	isl_mat_free(mat);
-	ISL_F_CLR(set, ISL_SET_NORMALIZED);
-	return set;
-error:
-	isl_set_free(set);
-	isl_mat_free(mat);
-	return NULL;
-}
-
-/* Replace the variables x starting at pos in the rows q
- * by x' with x = M x' with M the matrix mat.
- * That is, replace the corresponding coefficients c by c M.
- */
-static int transform(isl_ctx *ctx, isl_int **q, unsigned n,
-	unsigned pos, __isl_take isl_mat *mat)
-{
-	int i;
-	isl_mat *t;
-
-	t = isl_mat_sub_alloc6(ctx, q, 0, n, pos, mat->n_row);
-	t = isl_mat_product(t, mat);
-	if (!t)
-		return -1;
-	for (i = 0; i < n; ++i)
-		isl_seq_swp_or_cpy(q[i] + pos, t->row[i], t->n_col);
-	isl_mat_free(t);
-	return 0;
-}
-
-/* Replace the variables x of type "type" starting at "first" in "bset"
- * by x' with x = M x' with M the matrix trans.
- * That is, replace the corresponding coefficients c by c M.
- *
- * The transformation matrix should be a square matrix.
- */
-__isl_give isl_basic_set *isl_basic_set_transform_dims(
-	__isl_take isl_basic_set *bset, enum isl_dim_type type, unsigned first,
-	__isl_take isl_mat *trans)
-{
-	isl_ctx *ctx;
-	unsigned pos;
-
-	bset = isl_basic_set_cow(bset);
-	if (!bset || !trans)
-		goto error;
-
-	ctx = isl_basic_set_get_ctx(bset);
-	if (trans->n_row != trans->n_col)
-		isl_die(trans->ctx, isl_error_invalid,
-			"expecting square transformation matrix", goto error);
-	if (first + trans->n_row > isl_basic_set_dim(bset, type))
-		isl_die(trans->ctx, isl_error_invalid,
-			"oversized transformation matrix", goto error);
-
-	pos = isl_basic_set_offset(bset, type) + first;
-
-	if (transform(ctx, bset->eq, bset->n_eq, pos, isl_mat_copy(trans)) < 0)
-		goto error;
-	if (transform(ctx, bset->ineq, bset->n_ineq, pos,
-		      isl_mat_copy(trans)) < 0)
-		goto error;
-	if (transform(ctx, bset->div, bset->n_div, 1 + pos,
-		      isl_mat_copy(trans)) < 0)
-		goto error;
-
-	ISL_F_CLR(bset, ISL_BASIC_SET_NORMALIZED);
-	ISL_F_CLR(bset, ISL_BASIC_SET_NORMALIZED_DIVS);
-
-	isl_mat_free(trans);
-	return bset;
-error:
-	isl_mat_free(trans);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-void isl_mat_print_internal(__isl_keep isl_mat *mat, FILE *out, int indent)
-{
-	int i, j;
-
-	if (!mat) {
-		fprintf(out, "%*snull mat\n", indent, "");
-		return;
-	}
-
-	if (mat->n_row == 0)
-		fprintf(out, "%*s[]\n", indent, "");
-
-	for (i = 0; i < mat->n_row; ++i) {
-		if (!i)
-			fprintf(out, "%*s[[", indent, "");
-		else
-			fprintf(out, "%*s[", indent+1, "");
-		for (j = 0; j < mat->n_col; ++j) {
-			if (j)
-			    fprintf(out, ",");
-			isl_int_print(out, mat->row[i][j], 0);
-		}
-		if (i == mat->n_row-1)
-			fprintf(out, "]]\n");
-		else
-			fprintf(out, "]\n");
-	}
-}
-
-void isl_mat_dump(__isl_keep isl_mat *mat)
-{
-	isl_mat_print_internal(mat, stderr, 0);
-}
-
-struct isl_mat *isl_mat_drop_cols(struct isl_mat *mat, unsigned col, unsigned n)
-{
-	int r;
-
-	mat = isl_mat_cow(mat);
-	if (!mat)
-		return NULL;
-
-	if (col != mat->n_col-n) {
-		for (r = 0; r < mat->n_row; ++r)
-			isl_seq_cpy(mat->row[r]+col, mat->row[r]+col+n,
-					mat->n_col - col - n);
-	}
-	mat->n_col -= n;
-	return mat;
-}
-
-struct isl_mat *isl_mat_drop_rows(struct isl_mat *mat, unsigned row, unsigned n)
-{
-	int r;
-
-	mat = isl_mat_cow(mat);
-	if (!mat)
-		return NULL;
-
-	for (r = row; r+n < mat->n_row; ++r)
-		mat->row[r] = mat->row[r+n];
-
-	mat->n_row -= n;
-	return mat;
-}
-
-__isl_give isl_mat *isl_mat_insert_cols(__isl_take isl_mat *mat,
-				unsigned col, unsigned n)
-{
-	isl_mat *ext;
-
-	if (!mat)
-		return NULL;
-	if (n == 0)
-		return mat;
-
-	ext = isl_mat_alloc(mat->ctx, mat->n_row, mat->n_col + n);
-	if (!ext)
-		goto error;
-
-	isl_mat_sub_copy(mat->ctx, ext->row, mat->row, mat->n_row, 0, 0, col);
-	isl_mat_sub_copy(mat->ctx, ext->row, mat->row, mat->n_row,
-				col + n, col, mat->n_col - col);
-
-	isl_mat_free(mat);
-	return ext;
-error:
-	isl_mat_free(mat);
-	return NULL;
-}
-
-__isl_give isl_mat *isl_mat_insert_zero_cols(__isl_take isl_mat *mat,
-	unsigned first, unsigned n)
-{
-	int i;
-
-	if (!mat)
-		return NULL;
-	mat = isl_mat_insert_cols(mat, first, n);
-	if (!mat)
-		return NULL;
-
-	for (i = 0; i < mat->n_row; ++i)
-		isl_seq_clr(mat->row[i] + first, n);
-
-	return mat;
-}
-
-__isl_give isl_mat *isl_mat_add_zero_cols(__isl_take isl_mat *mat, unsigned n)
-{
-	if (!mat)
-		return NULL;
-
-	return isl_mat_insert_zero_cols(mat, mat->n_col, n);
-}
-
-__isl_give isl_mat *isl_mat_insert_rows(__isl_take isl_mat *mat,
-				unsigned row, unsigned n)
-{
-	isl_mat *ext;
-
-	if (!mat)
-		return NULL;
-	if (n == 0)
-		return mat;
-
-	ext = isl_mat_alloc(mat->ctx, mat->n_row + n, mat->n_col);
-	if (!ext)
-		goto error;
-
-	isl_mat_sub_copy(mat->ctx, ext->row, mat->row, row, 0, 0, mat->n_col);
-	isl_mat_sub_copy(mat->ctx, ext->row + row + n, mat->row + row,
-				mat->n_row - row, 0, 0, mat->n_col);
-
-	isl_mat_free(mat);
-	return ext;
-error:
-	isl_mat_free(mat);
-	return NULL;
-}
-
-__isl_give isl_mat *isl_mat_add_rows(__isl_take isl_mat *mat, unsigned n)
-{
-	if (!mat)
-		return NULL;
-
-	return isl_mat_insert_rows(mat, mat->n_row, n);
-}
-
-__isl_give isl_mat *isl_mat_insert_zero_rows(__isl_take isl_mat *mat,
-	unsigned row, unsigned n)
-{
-	int i;
-
-	mat = isl_mat_insert_rows(mat, row, n);
-	if (!mat)
-		return NULL;
-	
-	for (i = 0; i < n; ++i)
-		isl_seq_clr(mat->row[row + i], mat->n_col);
-
-	return mat;
-}
-
-__isl_give isl_mat *isl_mat_add_zero_rows(__isl_take isl_mat *mat, unsigned n)
-{
-	if (!mat)
-		return NULL;
-
-	return isl_mat_insert_zero_rows(mat, mat->n_row, n);
-}
-
-void isl_mat_col_submul(struct isl_mat *mat,
-			int dst_col, isl_int f, int src_col)
-{
-	int i;
-
-	for (i = 0; i < mat->n_row; ++i)
-		isl_int_submul(mat->row[i][dst_col], f, mat->row[i][src_col]);
-}
-
-void isl_mat_col_add(__isl_keep isl_mat *mat, int dst_col, int src_col)
-{
-	int i;
-
-	if (!mat)
-		return;
-
-	for (i = 0; i < mat->n_row; ++i)
-		isl_int_add(mat->row[i][dst_col],
-			    mat->row[i][dst_col], mat->row[i][src_col]);
-}
-
-void isl_mat_col_mul(struct isl_mat *mat, int dst_col, isl_int f, int src_col)
-{
-	int i;
-
-	for (i = 0; i < mat->n_row; ++i)
-		isl_int_mul(mat->row[i][dst_col], f, mat->row[i][src_col]);
-}
-
-struct isl_mat *isl_mat_unimodular_complete(struct isl_mat *M, int row)
-{
-	int r;
-	struct isl_mat *H = NULL, *Q = NULL;
-
-	if (!M)
-		return NULL;
-
-	isl_assert(M->ctx, M->n_row == M->n_col, goto error);
-	M->n_row = row;
-	H = isl_mat_left_hermite(isl_mat_copy(M), 0, NULL, &Q);
-	M->n_row = M->n_col;
-	if (!H)
-		goto error;
-	for (r = 0; r < row; ++r)
-		isl_assert(M->ctx, isl_int_is_one(H->row[r][r]), goto error);
-	for (r = row; r < M->n_row; ++r)
-		isl_seq_cpy(M->row[r], Q->row[r], M->n_col);
-	isl_mat_free(H);
-	isl_mat_free(Q);
-	return M;
-error:
-	isl_mat_free(H);
-	isl_mat_free(Q);
-	isl_mat_free(M);
-	return NULL;
-}
-
-__isl_give isl_mat *isl_mat_concat(__isl_take isl_mat *top,
-	__isl_take isl_mat *bot)
-{
-	struct isl_mat *mat;
-
-	if (!top || !bot)
-		goto error;
-
-	isl_assert(top->ctx, top->n_col == bot->n_col, goto error);
-	if (top->n_row == 0) {
-		isl_mat_free(top);
-		return bot;
-	}
-	if (bot->n_row == 0) {
-		isl_mat_free(bot);
-		return top;
-	}
-
-	mat = isl_mat_alloc(top->ctx, top->n_row + bot->n_row, top->n_col);
-	if (!mat)
-		goto error;
-	isl_mat_sub_copy(mat->ctx, mat->row, top->row, top->n_row,
-			 0, 0, mat->n_col);
-	isl_mat_sub_copy(mat->ctx, mat->row + top->n_row, bot->row, bot->n_row,
-			 0, 0, mat->n_col);
-	isl_mat_free(top);
-	isl_mat_free(bot);
-	return mat;
-error:
-	isl_mat_free(top);
-	isl_mat_free(bot);
-	return NULL;
-}
-
-int isl_mat_is_equal(__isl_keep isl_mat *mat1, __isl_keep isl_mat *mat2)
-{
-	int i;
-
-	if (!mat1 || !mat2)
-		return -1;
-
-	if (mat1->n_row != mat2->n_row)
-		return 0;
-
-	if (mat1->n_col != mat2->n_col)
-		return 0;
-
-	for (i = 0; i < mat1->n_row; ++i)
-		if (!isl_seq_eq(mat1->row[i], mat2->row[i], mat1->n_col))
-			return 0;
-
-	return 1;
-}
-
-__isl_give isl_mat *isl_mat_from_row_vec(__isl_take isl_vec *vec)
-{
-	struct isl_mat *mat;
-
-	if (!vec)
-		return NULL;
-	mat = isl_mat_alloc(vec->ctx, 1, vec->size);
-	if (!mat)
-		goto error;
-
-	isl_seq_cpy(mat->row[0], vec->el, vec->size);
-
-	isl_vec_free(vec);
-	return mat;
-error:
-	isl_vec_free(vec);
-	return NULL;
-}
-
-__isl_give isl_mat *isl_mat_vec_concat(__isl_take isl_mat *top,
-	__isl_take isl_vec *bot)
-{
-	return isl_mat_concat(top, isl_mat_from_row_vec(bot));
-}
-
-__isl_give isl_mat *isl_mat_move_cols(__isl_take isl_mat *mat,
-	unsigned dst_col, unsigned src_col, unsigned n)
-{
-	isl_mat *res;
-
-	if (!mat)
-		return NULL;
-	if (n == 0 || dst_col == src_col)
-		return mat;
-
-	res = isl_mat_alloc(mat->ctx, mat->n_row, mat->n_col);
-	if (!res)
-		goto error;
-
-	if (dst_col < src_col) {
-		isl_mat_sub_copy(res->ctx, res->row, mat->row, mat->n_row,
-				 0, 0, dst_col);
-		isl_mat_sub_copy(res->ctx, res->row, mat->row, mat->n_row,
-				 dst_col, src_col, n);
-		isl_mat_sub_copy(res->ctx, res->row, mat->row, mat->n_row,
-				 dst_col + n, dst_col, src_col - dst_col);
-		isl_mat_sub_copy(res->ctx, res->row, mat->row, mat->n_row,
-				 src_col + n, src_col + n,
-				 res->n_col - src_col - n);
-	} else {
-		isl_mat_sub_copy(res->ctx, res->row, mat->row, mat->n_row,
-				 0, 0, src_col);
-		isl_mat_sub_copy(res->ctx, res->row, mat->row, mat->n_row,
-				 src_col, src_col + n, dst_col - src_col);
-		isl_mat_sub_copy(res->ctx, res->row, mat->row, mat->n_row,
-				 dst_col, src_col, n);
-		isl_mat_sub_copy(res->ctx, res->row, mat->row, mat->n_row,
-				 dst_col + n, dst_col + n,
-				 res->n_col - dst_col - n);
-	}
-	isl_mat_free(mat);
-
-	return res;
-error:
-	isl_mat_free(mat);
-	return NULL;
-}
-
-void isl_mat_gcd(__isl_keep isl_mat *mat, isl_int *gcd)
-{
-	int i;
-	isl_int g;
-
-	isl_int_set_si(*gcd, 0);
-	if (!mat)
-		return;
-
-	isl_int_init(g);
-	for (i = 0; i < mat->n_row; ++i) {
-		isl_seq_gcd(mat->row[i], mat->n_col, &g);
-		isl_int_gcd(*gcd, *gcd, g);
-	}
-	isl_int_clear(g);
-}
-
-__isl_give isl_mat *isl_mat_scale_down(__isl_take isl_mat *mat, isl_int m)
-{
-	int i;
-
-	if (isl_int_is_one(m))
-		return mat;
-
-	mat = isl_mat_cow(mat);
-	if (!mat)
-		return NULL;
-
-	for (i = 0; i < mat->n_row; ++i)
-		isl_seq_scale_down(mat->row[i], mat->row[i], m, mat->n_col);
-
-	return mat;
-}
-
-__isl_give isl_mat *isl_mat_normalize(__isl_take isl_mat *mat)
-{
-	isl_int gcd;
-
-	if (!mat)
-		return NULL;
-
-	isl_int_init(gcd);
-	isl_mat_gcd(mat, &gcd);
-	mat = isl_mat_scale_down(mat, gcd);
-	isl_int_clear(gcd);
-
-	return mat;
-}
-
-__isl_give isl_mat *isl_mat_normalize_row(__isl_take isl_mat *mat, int row)
-{
-	mat = isl_mat_cow(mat);
-	if (!mat)
-		return NULL;
-
-	isl_seq_normalize(mat->ctx, mat->row[row], mat->n_col);
-
-	return mat;
-}
-
-/* Number of initial non-zero columns.
- */
-int isl_mat_initial_non_zero_cols(__isl_keep isl_mat *mat)
-{
-	int i;
-
-	if (!mat)
-		return -1;
-
-	for (i = 0; i < mat->n_col; ++i)
-		if (row_first_non_zero(mat->row, mat->n_row, i) < 0)
-			break;
-
-	return i;
-}
diff --git a/cloog-0.16.3/isl/isl_mat_private.h b/cloog-0.16.3/isl/isl_mat_private.h
deleted file mode 100644
index 5ba4990..0000000
--- a/cloog-0.16.3/isl/isl_mat_private.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#include <isl/mat.h>
-
-struct isl_mat {
-	int ref;
-
-	struct isl_ctx *ctx;
-
-#define ISL_MAT_BORROWED		(1 << 0)
-	unsigned flags;
-
-	unsigned n_row;
-	unsigned n_col;
-
-	isl_int **row;
-
-	/* actual size of the rows in memory; n_col <= max_col */
-	unsigned max_col;
-
-	struct isl_blk block;
-};
-
-__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,
-	unsigned first_row, unsigned n_row, unsigned first_col, unsigned n_col);
-void isl_mat_sub_copy(struct isl_ctx *ctx, isl_int **dst, isl_int **src,
-	unsigned n_row, unsigned dst_col, unsigned src_col, unsigned n_col);
-void isl_mat_sub_neg(struct isl_ctx *ctx, isl_int **dst, isl_int **src,
-	unsigned n_row, unsigned dst_col, unsigned src_col, unsigned n_col);
diff --git a/cloog-0.16.3/isl/isl_morph.c b/cloog-0.16.3/isl/isl_morph.c
deleted file mode 100644
index 5887403..0000000
--- a/cloog-0.16.3/isl/isl_morph.c
+++ /dev/null
@@ -1,777 +0,0 @@
-/*
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France 
- */
-
-#include <isl_map_private.h>
-#include <isl_morph.h>
-#include <isl/seq.h>
-#include <isl_mat_private.h>
-#include <isl_dim_private.h>
-#include <isl_equalities.h>
-
-__isl_give isl_morph *isl_morph_alloc(
-	__isl_take isl_basic_set *dom, __isl_take isl_basic_set *ran,
-	__isl_take isl_mat *map, __isl_take isl_mat *inv)
-{
-	isl_morph *morph;
-
-	if (!dom || !ran || !map || !inv)
-		goto error;
-
-	morph = isl_alloc_type(dom->ctx, struct isl_morph);
-	if (!morph)
-		goto error;
-
-	morph->ref = 1;
-	morph->dom = dom;
-	morph->ran = ran;
-	morph->map = map;
-	morph->inv = inv;
-
-	return morph;
-error:
-	isl_basic_set_free(dom);
-	isl_basic_set_free(ran);
-	isl_mat_free(map);
-	isl_mat_free(inv);
-	return NULL;
-}
-
-__isl_give isl_morph *isl_morph_copy(__isl_keep isl_morph *morph)
-{
-	if (!morph)
-		return NULL;
-
-	morph->ref++;
-	return morph;
-}
-
-__isl_give isl_morph *isl_morph_dup(__isl_keep isl_morph *morph)
-{
-	if (!morph)
-		return NULL;
-
-	return isl_morph_alloc(isl_basic_set_copy(morph->dom),
-		isl_basic_set_copy(morph->ran),
-		isl_mat_copy(morph->map), isl_mat_copy(morph->inv));
-}
-
-__isl_give isl_morph *isl_morph_cow(__isl_take isl_morph *morph)
-{
-	if (!morph)
-		return NULL;
-
-	if (morph->ref == 1)
-		return morph;
-	morph->ref--;
-	return isl_morph_dup(morph);
-}
-
-void isl_morph_free(__isl_take isl_morph *morph)
-{
-	if (!morph)
-		return;
-
-	if (--morph->ref > 0)
-		return;
-
-	isl_basic_set_free(morph->dom);
-	isl_basic_set_free(morph->ran);
-	isl_mat_free(morph->map);
-	isl_mat_free(morph->inv);
-	free(morph);
-}
-
-__isl_give isl_dim *isl_morph_get_ran_dim(__isl_keep isl_morph *morph)
-{
-	if (!morph)
-		return NULL;
-	
-	return isl_dim_copy(morph->ran->dim);
-}
-
-unsigned isl_morph_dom_dim(__isl_keep isl_morph *morph, enum isl_dim_type type)
-{
-	if (!morph)
-		return 0;
-
-	return isl_basic_set_dim(morph->dom, type);
-}
-
-unsigned isl_morph_ran_dim(__isl_keep isl_morph *morph, enum isl_dim_type type)
-{
-	if (!morph)
-		return 0;
-
-	return isl_basic_set_dim(morph->ran, type);
-}
-
-__isl_give isl_morph *isl_morph_remove_dom_dims(__isl_take isl_morph *morph,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	unsigned dom_offset;
-
-	if (n == 0)
-		return morph;
-
-	morph = isl_morph_cow(morph);
-	if (!morph)
-		return NULL;
-
-	dom_offset = 1 + isl_dim_offset(morph->dom->dim, type);
-
-	morph->dom = isl_basic_set_remove_dims(morph->dom, type, first, n);
-
-	morph->map = isl_mat_drop_cols(morph->map, dom_offset + first, n);
-
-	morph->inv = isl_mat_drop_rows(morph->inv, dom_offset + first, n);
-
-	if (morph->dom && morph->ran && morph->map && morph->inv)
-		return morph;
-
-	isl_morph_free(morph);
-	return NULL;
-}
-
-__isl_give isl_morph *isl_morph_remove_ran_dims(__isl_take isl_morph *morph,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	unsigned ran_offset;
-
-	if (n == 0)
-		return morph;
-
-	morph = isl_morph_cow(morph);
-	if (!morph)
-		return NULL;
-
-	ran_offset = 1 + isl_dim_offset(morph->ran->dim, type);
-
-	morph->ran = isl_basic_set_remove_dims(morph->ran, type, first, n);
-
-	morph->map = isl_mat_drop_rows(morph->map, ran_offset + first, n);
-
-	morph->inv = isl_mat_drop_cols(morph->inv, ran_offset + first, n);
-
-	if (morph->dom && morph->ran && morph->map && morph->inv)
-		return morph;
-
-	isl_morph_free(morph);
-	return NULL;
-}
-
-void isl_morph_dump(__isl_take isl_morph *morph, FILE *out)
-{
-	if (!morph)
-		return;
-
-	isl_basic_set_print(morph->dom, out, 0, "", "", ISL_FORMAT_ISL);
-	isl_basic_set_print(morph->ran, out, 0, "", "", ISL_FORMAT_ISL);
-	isl_mat_print_internal(morph->map, out, 4);
-	isl_mat_print_internal(morph->inv, out, 4);
-}
-
-__isl_give isl_morph *isl_morph_identity(__isl_keep isl_basic_set *bset)
-{
-	isl_mat *id;
-	isl_basic_set *universe;
-	unsigned total;
-
-	if (!bset)
-		return NULL;
-
-	total = isl_basic_set_total_dim(bset);
-	id = isl_mat_identity(bset->ctx, 1 + total);
-	universe = isl_basic_set_universe(isl_dim_copy(bset->dim));
-
-	return isl_morph_alloc(universe, isl_basic_set_copy(universe),
-		id, isl_mat_copy(id));
-}
-
-/* Create a(n identity) morphism between empty sets of the same dimension
- * a "bset".
- */
-__isl_give isl_morph *isl_morph_empty(__isl_keep isl_basic_set *bset)
-{
-	isl_mat *id;
-	isl_basic_set *empty;
-	unsigned total;
-
-	if (!bset)
-		return NULL;
-
-	total = isl_basic_set_total_dim(bset);
-	id = isl_mat_identity(bset->ctx, 1 + total);
-	empty = isl_basic_set_empty(isl_dim_copy(bset->dim));
-
-	return isl_morph_alloc(empty, isl_basic_set_copy(empty),
-		id, isl_mat_copy(id));
-}
-
-/* Given a matrix that maps a (possibly) parametric domain to
- * a parametric domain, add in rows that map the "nparam" parameters onto
- * themselves.
- */
-static __isl_give isl_mat *insert_parameter_rows(__isl_take isl_mat *mat,
-	unsigned nparam)
-{
-	int i;
-
-	if (nparam == 0)
-		return mat;
-	if (!mat)
-		return NULL;
-
-	mat = isl_mat_insert_rows(mat, 1, nparam);
-	if (!mat)
-		return NULL;
-
-	for (i = 0; i < nparam; ++i) {
-		isl_seq_clr(mat->row[1 + i], mat->n_col);
-		isl_int_set(mat->row[1 + i][1 + i], mat->row[0][0]);
-	}
-
-	return mat;
-}
-
-/* Construct a basic set described by the "n" equalities of "bset" starting
- * at "first".
- */
-static __isl_give isl_basic_set *copy_equalities(__isl_keep isl_basic_set *bset,
-	unsigned first, unsigned n)
-{
-	int i, k;
-	isl_basic_set *eq;
-	unsigned total;
-
-	isl_assert(bset->ctx, bset->n_div == 0, return NULL);
-
-	total = isl_basic_set_total_dim(bset);
-	eq = isl_basic_set_alloc_dim(isl_dim_copy(bset->dim), 0, n, 0);
-	if (!eq)
-		return NULL;
-	for (i = 0; i < n; ++i) {
-		k = isl_basic_set_alloc_equality(eq);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(eq->eq[k], bset->eq[first + k], 1 + total);
-	}
-
-	return eq;
-error:
-	isl_basic_set_free(eq);
-	return NULL;
-}
-
-/* Given a basic set, exploit the equalties in the a basic set to construct
- * a morphishm that maps the basic set to a lower-dimensional space.
- * Specifically, the morphism reduces the number of dimensions of type "type".
- *
- * This function is a slight generalization of isl_mat_variable_compression
- * in that it allows the input to be parametric and that it allows for the
- * compression of either parameters or set variables.
- *
- * We first select the equalities of interest, that is those that involve
- * variables of type "type" and no later variables.
- * Denote those equalities as
- *
- *		-C(p) + M x = 0
- *
- * where C(p) depends on the parameters if type == isl_dim_set and
- * is a constant if type == isl_dim_param.
- *
- * First compute the (left) Hermite normal form of M,
- *
- *		M [U1 U2] = M U = H = [H1 0]
- * or
- *		              M = H Q = [H1 0] [Q1]
- *                                             [Q2]
- *
- * with U, Q unimodular, Q = U^{-1} (and H lower triangular).
- * Define the transformed variables as
- *
- *		x = [U1 U2] [ x1' ] = [U1 U2] [Q1] x
- *		            [ x2' ]           [Q2]
- *
- * The equalities then become
- *
- *		-C(p) + H1 x1' = 0   or   x1' = H1^{-1} C(p) = C'(p)
- *
- * If the denominator of the constant term does not divide the
- * the common denominator of the parametric terms, then every
- * integer point is mapped to a non-integer point and then the original set has no
- * integer solutions (since the x' are a unimodular transformation
- * of the x).  In this case, an empty morphism is returned.
- * Otherwise, the transformation is given by
- *
- *		x = U1 H1^{-1} C(p) + U2 x2'
- *
- * The inverse transformation is simply
- *
- *		x2' = Q2 x
- *
- * Both matrices are extended to map the full original space to the full
- * compressed space.
- */
-__isl_give isl_morph *isl_basic_set_variable_compression(
-	__isl_keep isl_basic_set *bset, enum isl_dim_type type)
-{
-	unsigned otype;
-	unsigned ntype;
-	unsigned orest;
-	unsigned nrest;
-	int f_eq, n_eq;
-	isl_dim *dim;
-	isl_mat *H, *U, *Q, *C = NULL, *H1, *U1, *U2;
-	isl_basic_set *dom, *ran;
-
-	if (!bset)
-		return NULL;
-
-	if (isl_basic_set_plain_is_empty(bset))
-		return isl_morph_empty(bset);
-
-	isl_assert(bset->ctx, bset->n_div == 0, return NULL);
-
-	otype = 1 + isl_dim_offset(bset->dim, type);
-	ntype = isl_basic_set_dim(bset, type);
-	orest = otype + ntype;
-	nrest = isl_basic_set_total_dim(bset) - (orest - 1);
-
-	for (f_eq = 0; f_eq < bset->n_eq; ++f_eq)
-		if (isl_seq_first_non_zero(bset->eq[f_eq] + orest, nrest) == -1)
-			break;
-	for (n_eq = 0; f_eq + n_eq < bset->n_eq; ++n_eq)
-		if (isl_seq_first_non_zero(bset->eq[f_eq + n_eq] + otype, ntype) == -1)
-			break;
-	if (n_eq == 0)
-		return isl_morph_identity(bset);
-
-	H = isl_mat_sub_alloc6(bset->ctx, bset->eq, f_eq, n_eq, otype, ntype);
-	H = isl_mat_left_hermite(H, 0, &U, &Q);
-	if (!H || !U || !Q)
-		goto error;
-	Q = isl_mat_drop_rows(Q, 0, n_eq);
-	Q = isl_mat_diagonal(isl_mat_identity(bset->ctx, otype), Q);
-	Q = isl_mat_diagonal(Q, isl_mat_identity(bset->ctx, nrest));
-	C = isl_mat_alloc(bset->ctx, 1 + n_eq, otype);
-	if (!C)
-		goto error;
-	isl_int_set_si(C->row[0][0], 1);
-	isl_seq_clr(C->row[0] + 1, otype - 1);
-	isl_mat_sub_neg(C->ctx, C->row + 1, bset->eq + f_eq, n_eq, 0, 0, otype);
-	H1 = isl_mat_sub_alloc(H, 0, H->n_row, 0, H->n_row);
-	H1 = isl_mat_lin_to_aff(H1);
-	C = isl_mat_inverse_product(H1, C);
-	if (!C)
-		goto error;
-	isl_mat_free(H);
-
-	if (!isl_int_is_one(C->row[0][0])) {
-		int i;
-		isl_int g;
-
-		isl_int_init(g);
-		for (i = 0; i < n_eq; ++i) {
-			isl_seq_gcd(C->row[1 + i] + 1, otype - 1, &g);
-			isl_int_gcd(g, g, C->row[0][0]);
-			if (!isl_int_is_divisible_by(C->row[1 + i][0], g))
-				break;
-		}
-		isl_int_clear(g);
-
-		if (i < n_eq) {
-			isl_mat_free(C);
-			isl_mat_free(U);
-			isl_mat_free(Q);
-			return isl_morph_empty(bset);
-		}
-
-		C = isl_mat_normalize(C);
-	}
-
-	U1 = isl_mat_sub_alloc(U, 0, U->n_row, 0, n_eq);
-	U1 = isl_mat_lin_to_aff(U1);
-	U2 = isl_mat_sub_alloc(U, 0, U->n_row, n_eq, U->n_row - n_eq);
-	U2 = isl_mat_lin_to_aff(U2);
-	isl_mat_free(U);
-
-	C = isl_mat_product(U1, C);
-	C = isl_mat_aff_direct_sum(C, U2);
-	C = insert_parameter_rows(C, otype - 1);
-	C = isl_mat_diagonal(C, isl_mat_identity(bset->ctx, nrest));
-
-	dim = isl_dim_copy(bset->dim);
-	dim = isl_dim_drop(dim, type, 0, ntype);
-	dim = isl_dim_add(dim, type, ntype - n_eq);
-	ran = isl_basic_set_universe(dim);
-	dom = copy_equalities(bset, f_eq, n_eq);
-
-	return isl_morph_alloc(dom, ran, Q, C);
-error:
-	isl_mat_free(C);
-	isl_mat_free(H);
-	isl_mat_free(U);
-	isl_mat_free(Q);
-	return NULL;
-}
-
-/* Construct a parameter compression for "bset".
- * We basically just call isl_mat_parameter_compression with the right input
- * and then extend the resulting matrix to include the variables.
- *
- * Let the equalities be given as
- *
- *	B(p) + A x = 0
- *
- * and let [H 0] be the Hermite Normal Form of A, then
- *
- *	H^-1 B(p)
- *
- * needs to be integer, so we impose that each row is divisible by
- * the denominator.
- */
-__isl_give isl_morph *isl_basic_set_parameter_compression(
-	__isl_keep isl_basic_set *bset)
-{
-	unsigned nparam;
-	unsigned nvar;
-	int n_eq;
-	isl_mat *H, *B;
-	isl_vec *d;
-	isl_mat *map, *inv;
-	isl_basic_set *dom, *ran;
-
-	if (!bset)
-		return NULL;
-
-	if (isl_basic_set_plain_is_empty(bset))
-		return isl_morph_empty(bset);
-	if (bset->n_eq == 0)
-		return isl_morph_identity(bset);
-
-	isl_assert(bset->ctx, bset->n_div == 0, return NULL);
-
-	n_eq = bset->n_eq;
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-
-	isl_assert(bset->ctx, n_eq <= nvar, return NULL);
-
-	d = isl_vec_alloc(bset->ctx, n_eq);
-	B = isl_mat_sub_alloc6(bset->ctx, bset->eq, 0, n_eq, 0, 1 + nparam);
-	H = isl_mat_sub_alloc6(bset->ctx, bset->eq, 0, n_eq, 1 + nparam, nvar);
-	H = isl_mat_left_hermite(H, 0, NULL, NULL);
-	H = isl_mat_drop_cols(H, n_eq, nvar - n_eq);
-	H = isl_mat_lin_to_aff(H);
-	H = isl_mat_right_inverse(H);
-	if (!H || !d)
-		goto error;
-	isl_seq_set(d->el, H->row[0][0], d->size);
-	H = isl_mat_drop_rows(H, 0, 1);
-	H = isl_mat_drop_cols(H, 0, 1);
-	B = isl_mat_product(H, B);
-	inv = isl_mat_parameter_compression(B, d);
-	inv = isl_mat_diagonal(inv, isl_mat_identity(bset->ctx, nvar));
-	map = isl_mat_right_inverse(isl_mat_copy(inv));
-
-	dom = isl_basic_set_universe(isl_dim_copy(bset->dim));
-	ran = isl_basic_set_universe(isl_dim_copy(bset->dim));
-
-	return isl_morph_alloc(dom, ran, map, inv);
-error:
-	isl_mat_free(H);
-	isl_mat_free(B);
-	isl_vec_free(d);
-	return NULL;
-}
-
-/* Add stride constraints to "bset" based on the inverse mapping
- * that was plugged in.  In particular, if morph maps x' to x,
- * the the constraints of the original input
- *
- *	A x' + b >= 0
- *
- * have been rewritten to
- *
- *	A inv x + b >= 0
- *
- * However, this substitution may loose information on the integrality of x',
- * so we need to impose that
- *
- *	inv x
- *
- * is integral.  If inv = B/d, this means that we need to impose that
- *
- *	B x = 0		mod d
- *
- * or
- *
- *	exists alpha in Z^m: B x = d alpha
- *
- */
-static __isl_give isl_basic_set *add_strides(__isl_take isl_basic_set *bset,
-	__isl_keep isl_morph *morph)
-{
-	int i, div, k;
-	isl_int gcd;
-
-	if (isl_int_is_one(morph->inv->row[0][0]))
-		return bset;
-
-	isl_int_init(gcd);
-
-	for (i = 0; 1 + i < morph->inv->n_row; ++i) {
-		isl_seq_gcd(morph->inv->row[1 + i], morph->inv->n_col, &gcd);
-		if (isl_int_is_divisible_by(gcd, morph->inv->row[0][0]))
-			continue;
-		div = isl_basic_set_alloc_div(bset);
-		if (div < 0)
-			goto error;
-		k = isl_basic_set_alloc_equality(bset);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(bset->eq[k], morph->inv->row[1 + i],
-			    morph->inv->n_col);
-		isl_seq_clr(bset->eq[k] + morph->inv->n_col, bset->n_div);
-		isl_int_set(bset->eq[k][morph->inv->n_col + div],
-			    morph->inv->row[0][0]);
-	}
-
-	isl_int_clear(gcd);
-
-	return bset;
-error:
-	isl_int_clear(gcd);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Apply the morphism to the basic set.
- * We basically just compute the preimage of "bset" under the inverse mapping
- * in morph, add in stride constraints and intersect with the range
- * of the morphism.
- */
-__isl_give isl_basic_set *isl_morph_basic_set(__isl_take isl_morph *morph,
-	__isl_take isl_basic_set *bset)
-{
-	isl_basic_set *res = NULL;
-	isl_mat *mat = NULL;
-	int i, k;
-	int max_stride;
-
-	if (!morph || !bset)
-		goto error;
-
-	isl_assert(bset->ctx, isl_dim_equal(bset->dim, morph->dom->dim),
-		    goto error);
-
-	max_stride = morph->inv->n_row - 1;
-	if (isl_int_is_one(morph->inv->row[0][0]))
-		max_stride = 0;
-	res = isl_basic_set_alloc_dim(isl_dim_copy(morph->ran->dim),
-		bset->n_div + max_stride, bset->n_eq + max_stride, bset->n_ineq);
-
-	for (i = 0; i < bset->n_div; ++i)
-		if (isl_basic_set_alloc_div(res) < 0)
-			goto error;
-
-	mat = isl_mat_sub_alloc6(bset->ctx, bset->eq, 0, bset->n_eq,
-					0, morph->inv->n_row);
-	mat = isl_mat_product(mat, isl_mat_copy(morph->inv));
-	if (!mat)
-		goto error;
-	for (i = 0; i < bset->n_eq; ++i) {
-		k = isl_basic_set_alloc_equality(res);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(res->eq[k], mat->row[i], mat->n_col);
-		isl_seq_scale(res->eq[k] + mat->n_col, bset->eq[i] + mat->n_col,
-				morph->inv->row[0][0], bset->n_div);
-	}
-	isl_mat_free(mat);
-
-	mat = isl_mat_sub_alloc6(bset->ctx, bset->ineq, 0, bset->n_ineq,
-					0, morph->inv->n_row);
-	mat = isl_mat_product(mat, isl_mat_copy(morph->inv));
-	if (!mat)
-		goto error;
-	for (i = 0; i < bset->n_ineq; ++i) {
-		k = isl_basic_set_alloc_inequality(res);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(res->ineq[k], mat->row[i], mat->n_col);
-		isl_seq_scale(res->ineq[k] + mat->n_col,
-				bset->ineq[i] + mat->n_col,
-				morph->inv->row[0][0], bset->n_div);
-	}
-	isl_mat_free(mat);
-
-	mat = isl_mat_sub_alloc6(bset->ctx, bset->div, 0, bset->n_div,
-					1, morph->inv->n_row);
-	mat = isl_mat_product(mat, isl_mat_copy(morph->inv));
-	if (!mat)
-		goto error;
-	for (i = 0; i < bset->n_div; ++i) {
-		isl_int_mul(res->div[i][0],
-				morph->inv->row[0][0], bset->div[i][0]);
-		isl_seq_cpy(res->div[i] + 1, mat->row[i], mat->n_col);
-		isl_seq_scale(res->div[i] + 1 + mat->n_col,
-				bset->div[i] + 1 + mat->n_col,
-				morph->inv->row[0][0], bset->n_div);
-	}
-	isl_mat_free(mat);
-
-	res = add_strides(res, morph);
-
-	if (isl_basic_set_is_rational(bset))
-		res = isl_basic_set_set_rational(res);
-
-	res = isl_basic_set_simplify(res);
-	res = isl_basic_set_finalize(res);
-
-	res = isl_basic_set_intersect(res, isl_basic_set_copy(morph->ran));
-
-	isl_morph_free(morph);
-	isl_basic_set_free(bset);
-	return res;
-error:
-	isl_mat_free(mat);
-	isl_morph_free(morph);
-	isl_basic_set_free(bset);
-	isl_basic_set_free(res);
-	return NULL;
-}
-
-/* Apply the morphism to the set.
- */
-__isl_give isl_set *isl_morph_set(__isl_take isl_morph *morph,
-	__isl_take isl_set *set)
-{
-	int i;
-
-	if (!morph || !set)
-		goto error;
-
-	isl_assert(set->ctx, isl_dim_equal(set->dim, morph->dom->dim), goto error);
-
-	set = isl_set_cow(set);
-	if (!set)
-		goto error;
-
-	isl_dim_free(set->dim);
-	set->dim = isl_dim_copy(morph->ran->dim);
-	if (!set->dim)
-		goto error;
-
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_morph_basic_set(isl_morph_copy(morph), set->p[i]);
-		if (!set->p[i])
-			goto error;
-	}
-
-	isl_morph_free(morph);
-
-	ISL_F_CLR(set, ISL_SET_NORMALIZED);
-
-	return set;
-error:
-	isl_set_free(set);
-	isl_morph_free(morph);
-	return NULL;
-}
-
-/* Construct a morphism that first does morph2 and then morph1.
- */
-__isl_give isl_morph *isl_morph_compose(__isl_take isl_morph *morph1,
-	__isl_take isl_morph *morph2)
-{
-	isl_mat *map, *inv;
-	isl_basic_set *dom, *ran;
-
-	if (!morph1 || !morph2)
-		goto error;
-
-	map = isl_mat_product(isl_mat_copy(morph1->map), isl_mat_copy(morph2->map));
-	inv = isl_mat_product(isl_mat_copy(morph2->inv), isl_mat_copy(morph1->inv));
-	dom = isl_morph_basic_set(isl_morph_inverse(isl_morph_copy(morph2)),
-				  isl_basic_set_copy(morph1->dom));
-	dom = isl_basic_set_intersect(dom, isl_basic_set_copy(morph2->dom));
-	ran = isl_morph_basic_set(isl_morph_copy(morph1),
-				  isl_basic_set_copy(morph2->ran));
-	ran = isl_basic_set_intersect(ran, isl_basic_set_copy(morph1->ran));
-
-	isl_morph_free(morph1);
-	isl_morph_free(morph2);
-
-	return isl_morph_alloc(dom, ran, map, inv);
-error:
-	isl_morph_free(morph1);
-	isl_morph_free(morph2);
-	return NULL;
-}
-
-__isl_give isl_morph *isl_morph_inverse(__isl_take isl_morph *morph)
-{
-	isl_basic_set *bset;
-	isl_mat *mat;
-
-	morph = isl_morph_cow(morph);
-	if (!morph)
-		return NULL;
-
-	bset = morph->dom;
-	morph->dom = morph->ran;
-	morph->ran = bset;
-
-	mat = morph->map;
-	morph->map = morph->inv;
-	morph->inv = mat;
-
-	return morph;
-}
-
-__isl_give isl_morph *isl_basic_set_full_compression(
-	__isl_keep isl_basic_set *bset)
-{
-	isl_morph *morph, *morph2;
-
-	bset = isl_basic_set_copy(bset);
-
-	morph = isl_basic_set_variable_compression(bset, isl_dim_param);
-	bset = isl_morph_basic_set(isl_morph_copy(morph), bset);
-
-	morph2 = isl_basic_set_parameter_compression(bset);
-	bset = isl_morph_basic_set(isl_morph_copy(morph2), bset);
-
-	morph = isl_morph_compose(morph2, morph);
-
-	morph2 = isl_basic_set_variable_compression(bset, isl_dim_set);
-	isl_basic_set_free(bset);
-
-	morph = isl_morph_compose(morph2, morph);
-
-	return morph;
-}
-
-__isl_give isl_vec *isl_morph_vec(__isl_take isl_morph *morph,
-	__isl_take isl_vec *vec)
-{
-	if (!morph)
-		goto error;
-
-	vec = isl_mat_vec_product(isl_mat_copy(morph->map), vec);
-
-	isl_morph_free(morph);
-	return vec;
-error:
-	isl_morph_free(morph);
-	isl_vec_free(vec);
-	return NULL;
-}
diff --git a/cloog-0.16.3/isl/isl_morph.h b/cloog-0.16.3/isl/isl_morph.h
deleted file mode 100644
index f125cdc..0000000
--- a/cloog-0.16.3/isl/isl_morph.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France 
- */
-
-#ifndef ISL_MORHP_H
-#define ISL_MORHP_H
-
-#include <stdio.h>
-#include <isl/dim.h>
-#include <isl/mat.h>
-#include <isl/set.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/* An isl_morph is a "morphism" on (basic) sets.
- * "map" is an affine mapping from "dom" to "ran"
- * and "inv" is the inverse mapping.
- */
-struct isl_morph {
-	int ref;
-
-	isl_basic_set *dom;
-	isl_basic_set *ran;
-
-	isl_mat *map;
-	isl_mat *inv;
-};
-typedef struct isl_morph isl_morph;
-
-__isl_give isl_morph *isl_morph_alloc(
-	__isl_take isl_basic_set *dom, __isl_take isl_basic_set *ran,
-	__isl_take isl_mat *map, __isl_take isl_mat *inv);
-__isl_give isl_morph *isl_morph_copy(__isl_keep isl_morph *morph);
-__isl_give isl_morph *isl_morph_identity(__isl_keep isl_basic_set *bset);
-void isl_morph_free(__isl_take isl_morph *morph);
-
-__isl_give isl_dim *isl_morph_get_ran_dim(__isl_keep isl_morph *morph);
-unsigned isl_morph_dom_dim(__isl_keep isl_morph *morph, enum isl_dim_type type);
-unsigned isl_morph_ran_dim(__isl_keep isl_morph *morph, enum isl_dim_type type);
-
-__isl_give isl_morph *isl_morph_remove_dom_dims(__isl_take isl_morph *morph,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_morph *isl_morph_remove_ran_dims(__isl_take isl_morph *morph,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-__isl_give isl_morph *isl_morph_compose(__isl_take isl_morph *morph1,
-	__isl_take isl_morph *morph2);
-__isl_give isl_morph *isl_morph_inverse(__isl_take isl_morph *morph);
-
-void isl_morph_dump(__isl_take isl_morph *morph, FILE *out);
-
-__isl_give isl_morph *isl_basic_set_variable_compression(
-	__isl_keep isl_basic_set *bset, enum isl_dim_type type);
-__isl_give isl_morph *isl_basic_set_parameter_compression(
-	__isl_keep isl_basic_set *bset);
-__isl_give isl_morph *isl_basic_set_full_compression(
-	__isl_keep isl_basic_set *bset);
-
-__isl_give isl_basic_set *isl_morph_basic_set(__isl_take isl_morph *morph,
-	__isl_take isl_basic_set *bset);
-__isl_give isl_set *isl_morph_set(__isl_take isl_morph *morph,
-	__isl_take isl_set *set);
-__isl_give isl_vec *isl_morph_vec(__isl_take isl_morph *morph,
-	__isl_take isl_vec *vec);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_name.c b/cloog-0.16.3/isl/isl_name.c
deleted file mode 100644
index a9a6382..0000000
--- a/cloog-0.16.3/isl/isl_name.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <string.h>
-#include <isl_ctx_private.h>
-#include "isl_name.h"
-
-struct isl_name *isl_name_alloc(struct isl_ctx *ctx, const char *s)
-{
-	const char *copy = strdup(s);
-	struct isl_name *name;
-
-	if (!copy)
-		return NULL;
-	name = isl_alloc_type(ctx, struct isl_name);
-	if (!name)
-		goto error;
-
-	name->ref = 1;
-	name->name = copy;
-
-	name->hash = isl_hash_init();
-	name->hash = isl_hash_string(name->hash, s);
-
-	return name;
-error:
-	free((char *)copy);
-	return NULL;
-}
-
-static int isl_name_has_name(const void *entry, const void *val)
-{
-	struct isl_name *name = (struct isl_name *)entry;
-	const char *s = (const char *)val;
-
-	return !strcmp(name->name, s);
-}
-
-struct isl_name *isl_name_get(struct isl_ctx *ctx, const char *name)
-{
-	struct isl_hash_table_entry *entry;
-	uint32_t name_hash;
-
-	name_hash = isl_hash_string(isl_hash_init(), name);
-	entry = isl_hash_table_find(ctx, &ctx->name_hash, name_hash,
-					isl_name_has_name, name, 1);
-	if (!entry)
-		return NULL;
-	if (entry->data)
-		return isl_name_copy(ctx, entry->data);
-	entry->data = isl_name_alloc(ctx, name);
-	if (!entry->data)
-		ctx->name_hash.n--;
-	return entry->data;
-}
-
-struct isl_name *isl_name_copy(struct isl_ctx *ctx, struct isl_name *name)
-{
-	if (!name)
-		return NULL;
-
-	name->ref++;
-	return name;
-}
-
-static int isl_name_eq(const void *entry, const void *name)
-{
-	return entry == name;
-}
-
-uint32_t isl_hash_name(uint32_t hash, struct isl_name *name)
-{
-	if (name)
-		isl_hash_hash(hash, name->hash);
-
-	return hash;
-}
-
-void isl_name_free(struct isl_ctx *ctx, struct isl_name *name)
-{
-	uint32_t name_hash;
-	struct isl_hash_table_entry *entry;
-
-	if (!name)
-		return;
-
-	if (--name->ref > 0)
-		return;
-
-	name_hash = isl_hash_string(isl_hash_init(), name->name);
-	entry = isl_hash_table_find(ctx, &ctx->name_hash, name_hash,
-					isl_name_eq, name, 0);
-	isl_assert(ctx, entry, return);
-	isl_hash_table_remove(ctx, &ctx->name_hash, entry);
-
-	free((char *)name->name);
-	free(name);
-}
diff --git a/cloog-0.16.3/isl/isl_name.h b/cloog-0.16.3/isl/isl_name.h
deleted file mode 100644
index 3db7683..0000000
--- a/cloog-0.16.3/isl/isl_name.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_NAME_H
-#define ISL_NAME_H
-
-#include <isl/ctx.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_name {
-	int ref;
-
-	const char *name;
-	uint32_t hash;
-};
-
-struct isl_name *isl_name_alloc(struct isl_ctx *ctx, const char *name);
-struct isl_name *isl_name_get(struct isl_ctx *ctx, const char *name);
-struct isl_name *isl_name_copy(struct isl_ctx *ctx, struct isl_name *name);
-uint32_t isl_hash_name(uint32_t hash, struct isl_name *name);
-void isl_name_free(struct isl_ctx *ctx, struct isl_name *name);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_obj.c b/cloog-0.16.3/isl/isl_obj.c
deleted file mode 100644
index 928982d..0000000
--- a/cloog-0.16.3/isl/isl_obj.c
+++ /dev/null
@@ -1,425 +0,0 @@
-/*
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France 
- */
-
-#include <isl/set.h>
-#include <isl/map.h>
-#include <isl/obj.h>
-
-struct isl_int_obj {
-	int ref;
-	isl_ctx *ctx;
-	isl_int v;
-};
-
-__isl_give isl_int_obj *isl_int_obj_alloc(isl_ctx *ctx, isl_int v)
-{
-	isl_int_obj *i;
-
-	i = isl_alloc_type(ctx, isl_int_obj);
-	if (!i)
-		return NULL;
-	
-	i->ctx = ctx;
-	isl_ctx_ref(ctx);
-	i->ref = 1;
-	isl_int_init(i->v);
-	isl_int_set(i->v, v);
-
-	return i;
-}
-
-__isl_give isl_int_obj *isl_int_obj_copy(__isl_keep isl_int_obj *i)
-{
-	if (!i)
-		return NULL;
-
-	i->ref++;
-	return i;
-}
-
-__isl_give isl_int_obj *isl_int_obj_dup(__isl_keep isl_int_obj *i)
-{
-	if (!i)
-		return NULL;
-
-	return isl_int_obj_alloc(i->ctx, i->v);
-}
-
-__isl_give isl_int_obj *isl_int_obj_cow(__isl_take isl_int_obj *i)
-{
-	if (!i)
-		return NULL;
-
-	if (i->ref == 1)
-		return i;
-	i->ref--;
-	return isl_int_obj_dup(i);
-}
-
-void isl_int_obj_free(__isl_take isl_int_obj *i)
-{
-	if (!i)
-		return;
-
-	if (--i->ref > 0)
-		return;
-
-	isl_ctx_deref(i->ctx);
-	isl_int_clear(i->v);
-	free(i);
-}
-
-__isl_give isl_int_obj *isl_int_obj_add(__isl_take isl_int_obj *i1,
-	__isl_take isl_int_obj *i2)
-{
-	i1 = isl_int_obj_cow(i1);
-	if (!i1 || !i2)
-		goto error;
-	
-	isl_int_add(i1->v, i1->v, i2->v);
-
-	isl_int_obj_free(i2);
-	return i1;
-error:
-	isl_int_obj_free(i1);
-	isl_int_obj_free(i2);
-	return NULL;
-}
-
-__isl_give isl_int_obj *isl_int_obj_sub(__isl_take isl_int_obj *i1,
-	__isl_take isl_int_obj *i2)
-{
-	i1 = isl_int_obj_cow(i1);
-	if (!i1 || !i2)
-		goto error;
-	
-	isl_int_sub(i1->v, i1->v, i2->v);
-
-	isl_int_obj_free(i2);
-	return i1;
-error:
-	isl_int_obj_free(i1);
-	isl_int_obj_free(i2);
-	return NULL;
-}
-
-__isl_give isl_int_obj *isl_int_obj_mul(__isl_take isl_int_obj *i1,
-	__isl_take isl_int_obj *i2)
-{
-	i1 = isl_int_obj_cow(i1);
-	if (!i1 || !i2)
-		goto error;
-	
-	isl_int_mul(i1->v, i1->v, i2->v);
-
-	isl_int_obj_free(i2);
-	return i1;
-error:
-	isl_int_obj_free(i1);
-	isl_int_obj_free(i2);
-	return NULL;
-}
-
-void isl_int_obj_get_int(__isl_keep isl_int_obj *i, isl_int *v)
-{
-	if (!i)
-		return;
-	isl_int_set(*v, i->v);
-}
-
-static void *isl_obj_int_copy(void *v)
-{
-	return isl_int_obj_copy((isl_int_obj *)v);
-}
-
-static void isl_obj_int_free(void *v)
-{
-	isl_int_obj_free((isl_int_obj *)v);
-}
-
-static __isl_give isl_printer *isl_obj_int_print(__isl_take isl_printer *p,
-	void *v)
-{
-	isl_int_obj *i = v;
-	return isl_printer_print_isl_int(p, i->v);
-}
-
-static void *isl_obj_int_add(void *v1, void *v2)
-{
-	return isl_int_obj_add((isl_int_obj *)v1, (isl_int_obj *)v2);
-}
-
-struct isl_obj_vtable isl_obj_int_vtable = {
-	isl_obj_int_copy,
-	isl_obj_int_add,
-	isl_obj_int_print,
-	isl_obj_int_free
-};
-
-static void *isl_obj_map_copy(void *v)
-{
-	return isl_map_copy((struct isl_map *)v);
-}
-
-static void isl_obj_map_free(void *v)
-{
-	isl_map_free((struct isl_map *)v);
-}
-
-static __isl_give isl_printer *isl_obj_map_print(__isl_take isl_printer *p,
-	void *v)
-{
-	return isl_printer_print_map(p, (struct isl_map *)v);
-}
-
-static void *isl_obj_map_add(void *v1, void *v2)
-{
-	return isl_map_union((struct isl_map *)v1, (struct isl_map *)v2);
-}
-
-struct isl_obj_vtable isl_obj_map_vtable = {
-	isl_obj_map_copy,
-	isl_obj_map_add,
-	isl_obj_map_print,
-	isl_obj_map_free
-};
-
-static void *isl_obj_union_map_copy(void *v)
-{
-	return isl_union_map_copy((isl_union_map *)v);
-}
-
-static void isl_obj_union_map_free(void *v)
-{
-	isl_union_map_free((isl_union_map *)v);
-}
-
-static __isl_give isl_printer *isl_obj_union_map_print(__isl_take isl_printer *p,
-	void *v)
-{
-	return isl_printer_print_union_map(p, (isl_union_map *)v);
-}
-
-static void *isl_obj_union_map_add(void *v1, void *v2)
-{
-	return isl_union_map_union((isl_union_map *)v1, (isl_union_map *)v2);
-}
-
-struct isl_obj_vtable isl_obj_union_map_vtable = {
-	isl_obj_union_map_copy,
-	isl_obj_union_map_add,
-	isl_obj_union_map_print,
-	isl_obj_union_map_free
-};
-
-static void *isl_obj_set_copy(void *v)
-{
-	return isl_set_copy((struct isl_set *)v);
-}
-
-static void isl_obj_set_free(void *v)
-{
-	isl_set_free((struct isl_set *)v);
-}
-
-static __isl_give isl_printer *isl_obj_set_print(__isl_take isl_printer *p,
-	void *v)
-{
-	return isl_printer_print_set(p, (struct isl_set *)v);
-}
-
-static void *isl_obj_set_add(void *v1, void *v2)
-{
-	return isl_set_union((struct isl_set *)v1, (struct isl_set *)v2);
-}
-
-struct isl_obj_vtable isl_obj_set_vtable = {
-	isl_obj_set_copy,
-	isl_obj_set_add,
-	isl_obj_set_print,
-	isl_obj_set_free
-};
-
-static void *isl_obj_union_set_copy(void *v)
-{
-	return isl_union_set_copy((isl_union_set *)v);
-}
-
-static void isl_obj_union_set_free(void *v)
-{
-	isl_union_set_free((isl_union_set *)v);
-}
-
-static __isl_give isl_printer *isl_obj_union_set_print(__isl_take isl_printer *p,
-	void *v)
-{
-	return isl_printer_print_union_set(p, (isl_union_set *)v);
-}
-
-static void *isl_obj_union_set_add(void *v1, void *v2)
-{
-	return isl_union_set_union((isl_union_set *)v1, (isl_union_set *)v2);
-}
-
-struct isl_obj_vtable isl_obj_union_set_vtable = {
-	isl_obj_union_set_copy,
-	isl_obj_union_set_add,
-	isl_obj_union_set_print,
-	isl_obj_union_set_free
-};
-
-static void *isl_obj_none_copy(void *v)
-{
-	return v;
-}
-
-static void isl_obj_none_free(void *v)
-{
-}
-
-static __isl_give isl_printer *isl_obj_none_print(__isl_take isl_printer *p,
-	void *v)
-{
-	return p;
-}
-
-static void *isl_obj_none_add(void *v1, void *v2)
-{
-	return NULL;
-}
-
-struct isl_obj_vtable isl_obj_none_vtable = {
-	isl_obj_none_copy,
-	isl_obj_none_add,
-	isl_obj_none_print,
-	isl_obj_none_free
-};
-
-static void *isl_obj_pw_qp_copy(void *v)
-{
-	return isl_pw_qpolynomial_copy((struct isl_pw_qpolynomial *)v);
-}
-
-static void isl_obj_pw_qp_free(void *v)
-{
-	isl_pw_qpolynomial_free((struct isl_pw_qpolynomial *)v);
-}
-
-static __isl_give isl_printer *isl_obj_pw_qp_print(__isl_take isl_printer *p,
-	void *v)
-{
-	return isl_printer_print_pw_qpolynomial(p,
-						(struct isl_pw_qpolynomial *)v);
-}
-
-static void *isl_obj_pw_qp_add(void *v1, void *v2)
-{
-	return isl_pw_qpolynomial_add((struct isl_pw_qpolynomial *)v1,
-					(struct isl_pw_qpolynomial *)v2);
-}
-
-struct isl_obj_vtable isl_obj_pw_qpolynomial_vtable = {
-	isl_obj_pw_qp_copy,
-	isl_obj_pw_qp_add,
-	isl_obj_pw_qp_print,
-	isl_obj_pw_qp_free
-};
-
-static void *isl_obj_union_pw_qp_copy(void *v)
-{
-	return isl_union_pw_qpolynomial_copy((struct isl_union_pw_qpolynomial *)v);
-}
-
-static void isl_obj_union_pw_qp_free(void *v)
-{
-	isl_union_pw_qpolynomial_free((struct isl_union_pw_qpolynomial *)v);
-}
-
-static __isl_give isl_printer *isl_obj_union_pw_qp_print(
-	__isl_take isl_printer *p, void *v)
-{
-	return isl_printer_print_union_pw_qpolynomial(p,
-					(struct isl_union_pw_qpolynomial *)v);
-}
-
-static void *isl_obj_union_pw_qp_add(void *v1, void *v2)
-{
-	return isl_union_pw_qpolynomial_add(
-					(struct isl_union_pw_qpolynomial *)v1,
-					(struct isl_union_pw_qpolynomial *)v2);
-}
-
-struct isl_obj_vtable isl_obj_union_pw_qpolynomial_vtable = {
-	isl_obj_union_pw_qp_copy,
-	isl_obj_union_pw_qp_add,
-	isl_obj_union_pw_qp_print,
-	isl_obj_union_pw_qp_free
-};
-
-static void *isl_obj_pw_qpf_copy(void *v)
-{
-	return isl_pw_qpolynomial_fold_copy((struct isl_pw_qpolynomial_fold *)v);
-}
-
-static void isl_obj_pw_qpf_free(void *v)
-{
-	isl_pw_qpolynomial_fold_free((struct isl_pw_qpolynomial_fold *)v);
-}
-
-static __isl_give isl_printer *isl_obj_pw_qpf_print(__isl_take isl_printer *p,
-	void *v)
-{
-	return isl_printer_print_pw_qpolynomial_fold(p,
-					(struct isl_pw_qpolynomial_fold *)v);
-}
-
-static void *isl_obj_pw_qpf_add(void *v1, void *v2)
-{
-	return isl_pw_qpolynomial_fold_fold((struct isl_pw_qpolynomial_fold *)v1,
-					    (struct isl_pw_qpolynomial_fold *)v2);
-}
-
-struct isl_obj_vtable isl_obj_pw_qpolynomial_fold_vtable = {
-	isl_obj_pw_qpf_copy,
-	isl_obj_pw_qpf_add,
-	isl_obj_pw_qpf_print,
-	isl_obj_pw_qpf_free
-};
-
-static void *isl_obj_union_pw_qpf_copy(void *v)
-{
-	return isl_union_pw_qpolynomial_fold_copy((struct isl_union_pw_qpolynomial_fold *)v);
-}
-
-static void isl_obj_union_pw_qpf_free(void *v)
-{
-	isl_union_pw_qpolynomial_fold_free((struct isl_union_pw_qpolynomial_fold *)v);
-}
-
-static __isl_give isl_printer *isl_obj_union_pw_qpf_print(
-	__isl_take isl_printer *p, void *v)
-{
-	return isl_printer_print_union_pw_qpolynomial_fold(p,
-				    (struct isl_union_pw_qpolynomial_fold *)v);
-}
-
-static void *isl_obj_union_pw_qpf_add(void *v1, void *v2)
-{
-	return isl_union_pw_qpolynomial_fold_fold(
-				    (struct isl_union_pw_qpolynomial_fold *)v1,
-				    (struct isl_union_pw_qpolynomial_fold *)v2);
-}
-
-struct isl_obj_vtable isl_obj_union_pw_qpolynomial_fold_vtable = {
-	isl_obj_union_pw_qpf_copy,
-	isl_obj_union_pw_qpf_add,
-	isl_obj_union_pw_qpf_print,
-	isl_obj_union_pw_qpf_free
-};
diff --git a/cloog-0.16.3/isl/isl_options.c b/cloog-0.16.3/isl/isl_options.c
deleted file mode 100644
index 1948c2b..0000000
--- a/cloog-0.16.3/isl/isl_options.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <isl/ctx.h>
-#include <isl/options.h>
-#include <isl/version.h>
-
-struct isl_arg_choice isl_lp_solver_choice[] = {
-	{"tab",		ISL_LP_TAB},
-#ifdef ISL_PIPLIB
-	{"pip",		ISL_LP_PIP},
-#endif
-	{0}
-};
-
-struct isl_arg_choice isl_ilp_solver_choice[] = {
-	{"gbr",		ISL_ILP_GBR},
-#ifdef ISL_PIPLIB
-	{"pip",		ISL_ILP_PIP},
-#endif
-	{0}
-};
-
-struct isl_arg_choice isl_pip_solver_choice[] = {
-	{"tab",		ISL_PIP_TAB},
-#ifdef ISL_PIPLIB
-	{"pip",		ISL_PIP_PIP},
-#endif
-	{0}
-};
-
-struct isl_arg_choice isl_pip_context_choice[] = {
-	{"gbr",		ISL_CONTEXT_GBR},
-	{"lexmin",	ISL_CONTEXT_LEXMIN},
-	{0}
-};
-
-struct isl_arg_choice isl_gbr_choice[] = {
-	{"never",	ISL_GBR_NEVER},
-	{"once",	ISL_GBR_ONCE},
-	{"always",	ISL_GBR_ALWAYS},
-	{0}
-};
-
-struct isl_arg_choice isl_closure_choice[] = {
-	{"isl",		ISL_CLOSURE_ISL},
-	{"box",		ISL_CLOSURE_BOX},
-	{0}
-};
-
-static struct isl_arg_choice bound[] = {
-	{"bernstein",	ISL_BOUND_BERNSTEIN},
-	{"range",	ISL_BOUND_RANGE},
-	{0}
-};
-
-static struct isl_arg_flags bernstein_recurse[] = {
-	{"none",	ISL_BERNSTEIN_FACTORS | ISL_BERNSTEIN_INTERVALS, 0},
-	{"factors",	ISL_BERNSTEIN_FACTORS | ISL_BERNSTEIN_INTERVALS,
-			ISL_BERNSTEIN_FACTORS},
-	{"intervals",	ISL_BERNSTEIN_FACTORS | ISL_BERNSTEIN_INTERVALS,
-			ISL_BERNSTEIN_INTERVALS},
-	{"full",	ISL_BERNSTEIN_FACTORS | ISL_BERNSTEIN_INTERVALS,
-			ISL_BERNSTEIN_FACTORS | ISL_BERNSTEIN_INTERVALS},
-	{0}
-};
-
-static struct isl_arg_choice convex[] = {
-	{"wrap",	ISL_CONVEX_HULL_WRAP},
-	{"fm",		ISL_CONVEX_HULL_FM},
-	{0}
-};
-
-static void print_version(void)
-{
-	printf("%s", isl_version());
-}
-
-struct isl_arg isl_options_arg[] = {
-ISL_ARG_CHOICE(struct isl_options, lp_solver, 0, "lp-solver", \
-	isl_lp_solver_choice,	ISL_LP_TAB, "lp solver to use")
-ISL_ARG_CHOICE(struct isl_options, ilp_solver, 0, "ilp-solver", \
-	isl_ilp_solver_choice,	ISL_ILP_GBR, "ilp solver to use")
-ISL_ARG_CHOICE(struct isl_options, pip, 0, "pip", \
-	isl_pip_solver_choice,	ISL_PIP_TAB, "pip solver to use")
-ISL_ARG_CHOICE(struct isl_options, context, 0, "context", \
-	isl_pip_context_choice,	ISL_CONTEXT_GBR,
-	"how to handle the pip context tableau")
-ISL_ARG_CHOICE(struct isl_options, gbr, 0, "gbr", \
-	isl_gbr_choice,	ISL_GBR_ONCE,
-	"how often to use generalized basis reduction")
-ISL_ARG_CHOICE(struct isl_options, closure, 0, "closure", \
-	isl_closure_choice,	ISL_CLOSURE_ISL,
-	"closure operation to use")
-ISL_ARG_BOOL(struct isl_options, gbr_only_first, 0, "gbr-only-first", 0,
-	"only perform basis reduction in first direction")
-ISL_ARG_CHOICE(struct isl_options, bound, 0, "bound", bound,
-	ISL_BOUND_BERNSTEIN, "algorithm to use for computing bounds")
-ISL_ARG_FLAGS(struct isl_options, bernstein_recurse, 0,
-	"bernstein-recurse", bernstein_recurse, ISL_BERNSTEIN_FACTORS, NULL)
-ISL_ARG_BOOL(struct isl_options, bernstein_triangulate, 0,
-	"bernstein-triangulate", 1,
-	"triangulate domains during Bernstein expansion")
-ISL_ARG_BOOL(struct isl_options, pip_symmetry, 0, "pip-symmetry", 1,
-	"detect simple symmetries in PIP input")
-ISL_ARG_CHOICE(struct isl_options, convex, 0, "convex-hull", \
-	convex,	ISL_CONVEX_HULL_WRAP, "convex hull algorithm to use")
-ISL_ARG_BOOL(struct isl_options, schedule_parametric, 0,
-	"schedule-parametric", 1, "construct possibly parametric schedules")
-ISL_ARG_BOOL(struct isl_options, schedule_outer_zero_distance, 0,
-	"schedule-outer-zero-distance", 0,
-	"try to construct schedules with outer zero distances over "
-	"proximity dependences")
-ISL_ARG_BOOL(struct isl_options, schedule_maximize_band_depth, 0,
-	"schedule-maximize-band-depth", 0,
-	"maximize the number of scheduling dimensions in a band")
-ISL_ARG_BOOL(struct isl_options, schedule_split_parallel, 0,
-	"schedule-split-parallel", 1,
-	"split non-tilable bands with parallel schedules")
-ISL_ARG_VERSION(print_version)
-ISL_ARG_END
-};
-
-ISL_ARG_DEF(isl_options, struct isl_options, isl_options_arg)
diff --git a/cloog-0.16.3/isl/isl_output.c b/cloog-0.16.3/isl/isl_output.c
deleted file mode 100644
index ec2d664..0000000
--- a/cloog-0.16.3/isl/isl_output.c
+++ /dev/null
@@ -1,2465 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France 
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl/set.h>
-#include <isl/seq.h>
-#include <isl_polynomial_private.h>
-#include <isl_printer_private.h>
-#include <isl_dim_private.h>
-#include <isl_mat_private.h>
-#include <isl/union_map.h>
-#include <isl/constraint.h>
-#include <isl_local_space_private.h>
-#include <isl_aff_private.h>
-
-static const char *s_to[2] = { " -> ", " \\to " };
-static const char *s_and[2] = { " and ", " \\wedge " };
-static const char *s_or[2] = { " or ", " \\vee " };
-static const char *s_le[2] = { "<=", "\\le" };
-static const char *s_ge[2] = { ">=", "\\ge" };
-static const char *s_open_set[2] = { "{ ", "\\{\\, " };
-static const char *s_close_set[2] = { " }", " \\,\\}" };
-static const char *s_open_list[2] = { "[", "(" };
-static const char *s_close_list[2] = { "]", ")" };
-static const char *s_such_that[2] = { " : ", " \\mid " };
-static const char *s_open_exists[2] = { "exists (", "\\exists \\, " };
-static const char *s_close_exists[2] = { ")", "" };
-static const char *s_div_prefix[2] = { "e", "\\alpha_" };
-static const char *s_param_prefix[2] = { "p", "p_" };
-static const char *s_input_prefix[2] = { "i", "i_" };
-static const char *s_output_prefix[2] = { "o", "o_" };
-
-static __isl_give isl_printer *print_constraint_polylib(
-	struct isl_basic_map *bmap, int ineq, int n, __isl_take isl_printer *p)
-{
-	int i;
-	unsigned n_in = isl_basic_map_dim(bmap, isl_dim_in);
-	unsigned n_out = isl_basic_map_dim(bmap, isl_dim_out);
-	unsigned nparam = isl_basic_map_dim(bmap, isl_dim_param);
-	isl_int *c = ineq ? bmap->ineq[n] : bmap->eq[n];
-
-	p = isl_printer_start_line(p);
-	p = isl_printer_print_int(p, ineq);
-	for (i = 0; i < n_out; ++i) {
-		p = isl_printer_print_str(p, " ");
-		p = isl_printer_print_isl_int(p, c[1+nparam+n_in+i]);
-	}
-	for (i = 0; i < n_in; ++i) {
-		p = isl_printer_print_str(p, " ");
-		p = isl_printer_print_isl_int(p, c[1+nparam+i]);
-	}
-	for (i = 0; i < bmap->n_div; ++i) {
-		p = isl_printer_print_str(p, " ");
-		p = isl_printer_print_isl_int(p, c[1+nparam+n_in+n_out+i]);
-	}
-	for (i = 0; i < nparam; ++i) {
-		p = isl_printer_print_str(p, " ");
-		p = isl_printer_print_isl_int(p, c[1+i]);
-	}
-	p = isl_printer_print_str(p, " ");
-	p = isl_printer_print_isl_int(p, c[0]);
-	p = isl_printer_end_line(p);
-	return p;
-}
-
-static __isl_give isl_printer *print_constraints_polylib(
-	struct isl_basic_map *bmap, __isl_take isl_printer *p)
-{
-	int i;
-
-	p = isl_printer_set_isl_int_width(p, 5);
-
-	for (i = 0; i < bmap->n_eq; ++i)
-		p = print_constraint_polylib(bmap, 0, i, p);
-	for (i = 0; i < bmap->n_ineq; ++i)
-		p = print_constraint_polylib(bmap, 1, i, p);
-
-	return p;
-}
-
-static __isl_give isl_printer *bset_print_constraints_polylib(
-	struct isl_basic_set *bset, __isl_take isl_printer *p)
-{
-	return print_constraints_polylib((struct isl_basic_map *)bset, p);
-}
-
-static __isl_give isl_printer *isl_basic_map_print_polylib(
-	__isl_keep isl_basic_map *bmap, __isl_take isl_printer *p, int ext)
-{
-	unsigned total = isl_basic_map_total_dim(bmap);
-	p = isl_printer_start_line(p);
-	p = isl_printer_print_int(p, bmap->n_eq + bmap->n_ineq);
-	p = isl_printer_print_str(p, " ");
-	p = isl_printer_print_int(p, 1 + total + 1);
-	if (ext) {
-		p = isl_printer_print_str(p, " ");
-		p = isl_printer_print_int(p,
-				    isl_basic_map_dim(bmap, isl_dim_out));
-		p = isl_printer_print_str(p, " ");
-		p = isl_printer_print_int(p,
-				    isl_basic_map_dim(bmap, isl_dim_in));
-		p = isl_printer_print_str(p, " ");
-		p = isl_printer_print_int(p,
-				    isl_basic_map_dim(bmap, isl_dim_div));
-		p = isl_printer_print_str(p, " ");
-		p = isl_printer_print_int(p,
-				    isl_basic_map_dim(bmap, isl_dim_param));
-	}
-	p = isl_printer_end_line(p);
-	return print_constraints_polylib(bmap, p);
-}
-
-static __isl_give isl_printer *isl_basic_set_print_polylib(
-	__isl_keep isl_basic_set *bset, __isl_take isl_printer *p, int ext)
-{
-	return isl_basic_map_print_polylib((struct isl_basic_map *)bset, p, ext);
-}
-
-static __isl_give isl_printer *isl_map_print_polylib(__isl_keep isl_map *map,
-	__isl_take isl_printer *p, int ext)
-{
-	int i;
-
-	p = isl_printer_start_line(p);
-	p = isl_printer_print_int(p, map->n);
-	p = isl_printer_end_line(p);
-	for (i = 0; i < map->n; ++i) {
-		p = isl_printer_start_line(p);
-		p = isl_printer_end_line(p);
-		p = isl_basic_map_print_polylib(map->p[i], p, ext);
-	}
-	return p;
-}
-
-static __isl_give isl_printer *isl_set_print_polylib(__isl_keep isl_set *set,
-	__isl_take isl_printer *p, int ext)
-{
-	return isl_map_print_polylib((struct isl_map *)set, p, ext);
-}
-
-static int count_same_name(__isl_keep isl_dim *dim,
-	enum isl_dim_type type, unsigned pos, const char *name)
-{
-	enum isl_dim_type t;
-	unsigned p, s;
-	int count = 0;
-
-	for (t = isl_dim_param; t <= type && t <= isl_dim_out; ++t) {
-		s = t == type ? pos : isl_dim_size(dim, t);
-		for (p = 0; p < s; ++p) {
-			const char *n = isl_dim_get_name(dim, t, p);
-			if (n && !strcmp(n, name))
-				count++;
-		}
-	}
-	return count;
-}
-
-static __isl_give isl_printer *print_name(__isl_keep isl_dim *dim,
-	__isl_take isl_printer *p, enum isl_dim_type type, unsigned pos,
-	int set, int latex)
-{
-	const char *name;
-	char buffer[20];
-	int primes;
-
-	name = type == isl_dim_div ? NULL : isl_dim_get_name(dim, type, pos);
-
-	if (!name) {
-		const char *prefix;
-		if (type == isl_dim_param)
-			prefix = s_param_prefix[latex];
-		else if (type == isl_dim_div)
-			prefix = s_div_prefix[latex];
-		else if (set || type == isl_dim_in)
-			prefix = s_input_prefix[latex];
-		else
-			prefix = s_output_prefix[latex];
-		snprintf(buffer, sizeof(buffer), "%s%d", prefix, pos);
-		name = buffer;
-	}
-	primes = count_same_name(dim, name == buffer ? isl_dim_div : type,
-				 pos, name);
-	p = isl_printer_print_str(p, name);
-	while (primes-- > 0)
-		p = isl_printer_print_str(p, "'");
-	return p;
-}
-
-static enum isl_dim_type pos2type(__isl_keep isl_dim *dim, unsigned *pos)
-{
-	enum isl_dim_type type;
-	unsigned n_in = isl_dim_size(dim, isl_dim_in);
-	unsigned n_out = isl_dim_size(dim, isl_dim_out);
-	unsigned nparam = isl_dim_size(dim, isl_dim_param);
-
-	if (*pos < 1 + nparam) {
-		type = isl_dim_param;
-		*pos -= 1;
-	} else if (*pos < 1 + nparam + n_in) {
-		type = isl_dim_in;
-		*pos -= 1 + nparam;
-	} else if (*pos < 1 + nparam + n_in + n_out) {
-		type = isl_dim_out;
-		*pos -= 1 + nparam + n_in;
-	} else {
-		type = isl_dim_div;
-		*pos -= 1 + nparam + n_in + n_out;
-	}
-
-	return type;
-}
-
-static __isl_give isl_printer *print_div(__isl_keep isl_dim *dim,
-	__isl_keep isl_mat *div, int pos, __isl_take isl_printer *p);
-
-static __isl_give isl_printer *print_term(__isl_keep isl_dim *dim,
-	__isl_keep isl_mat *div,
-	isl_int c, unsigned pos, __isl_take isl_printer *p, int set, int latex)
-{
-	enum isl_dim_type type;
-	int print_div_def;
-
-	if (pos == 0)
-		return isl_printer_print_isl_int(p, c);
-
-	type = pos2type(dim, &pos);
-	print_div_def = type == isl_dim_div && div &&
-			!isl_int_is_zero(div->row[pos][0]);
-
-	if (isl_int_is_one(c))
-		;
-	else if (isl_int_is_negone(c))
-		p = isl_printer_print_str(p, "-");
-	else {
-		p = isl_printer_print_isl_int(p, c);
-		if (p->output_format == ISL_FORMAT_C || print_div_def)
-			p = isl_printer_print_str(p, "*");
-	}
-	if (print_div_def)
-		p = print_div(dim, div, pos, p);
-	else
-		p = print_name(dim, p, type, pos, set, latex);
-	return p;
-}
-
-static __isl_give isl_printer *print_affine_of_len(__isl_keep isl_dim *dim,
-	__isl_keep isl_mat *div,
-	__isl_take isl_printer *p, isl_int *c, int len, int set)
-{
-	int i;
-	int first;
-
-	for (i = 0, first = 1; i < len; ++i) {
-		int flip = 0;
-		if (isl_int_is_zero(c[i]))
-			continue;
-		if (!first) {
-			if (isl_int_is_neg(c[i])) {
-				flip = 1;
-				isl_int_neg(c[i], c[i]);
-				p = isl_printer_print_str(p, " - ");
-			} else 
-				p = isl_printer_print_str(p, " + ");
-		}
-		first = 0;
-		p = print_term(dim, div, c[i], i, p, set, 0);
-		if (flip)
-			isl_int_neg(c[i], c[i]);
-	}
-	if (first)
-		p = isl_printer_print_str(p, "0");
-	return p;
-}
-
-static __isl_give isl_printer *print_affine(__isl_keep isl_basic_map *bmap,
-	__isl_keep isl_dim *dim, __isl_take isl_printer *p, isl_int *c, int set)
-{
-	unsigned len = 1 + isl_basic_map_total_dim(bmap);
-	return print_affine_of_len(dim, NULL, p, c, len, set);
-}
-
-static int defining_equality(__isl_keep isl_basic_map *eq,
-	__isl_keep isl_dim *dim, enum isl_dim_type type, int pos)
-{
-	int i;
-	unsigned total;
-
-	if (!eq)
-		return -1;
-
-	pos += isl_dim_offset(dim, type);
-	total = isl_basic_map_total_dim(eq);
-
-	for (i = 0; i < eq->n_eq; ++i) {
-		if (isl_seq_last_non_zero(eq->eq[i] + 1, total) != pos)
-			continue;
-		if (isl_int_is_one(eq->eq[i][1 + pos]))
-			isl_seq_neg(eq->eq[i], eq->eq[i], 1 + total);
-		return i;
-	}
-
-	return -1;
-}
-
-/* offset is the offset of local_dim inside global_type of global_dim.
- */
-static __isl_give isl_printer *print_nested_var_list(__isl_take isl_printer *p,
-	__isl_keep isl_dim *global_dim, enum isl_dim_type global_type,
-	__isl_keep isl_dim *local_dim, enum isl_dim_type local_type,
-	int set, int latex, __isl_keep isl_basic_map *eq, int offset)
-{
-	int i, j;
-
-	if (global_dim != local_dim && local_type == isl_dim_out)
-		offset += local_dim->n_in;
-
-	for (i = 0; i < isl_dim_size(local_dim, local_type); ++i) {
-		if (i)
-			p = isl_printer_print_str(p, ", ");
-		j = defining_equality(eq, global_dim, global_type, offset + i);
-		if (j >= 0) {
-			int pos = 1 + isl_dim_offset(global_dim, global_type)
-				    + offset + i;
-			p = print_affine_of_len(eq->dim, NULL,
-						p, eq->eq[j], pos, set);
-		} else {
-			p = print_name(global_dim, p, global_type, offset + i,
-					set, latex);
-		}
-	}
-	return p;
-}
-
-static __isl_give isl_printer *print_var_list(__isl_keep isl_dim *dim,
-	__isl_take isl_printer *p, enum isl_dim_type type,
-	int set, int latex, __isl_keep isl_basic_map *eq)
-{
-	return print_nested_var_list(p, dim, type, dim, type, set, latex, eq, 0);
-}
-
-static __isl_give isl_printer *print_nested_map_dim(__isl_take isl_printer *p,
-	__isl_keep isl_dim *global_dim, enum isl_dim_type global_type,
-	__isl_keep isl_dim *local_dim,
-	 int set, int latex, __isl_keep isl_basic_map *eq, int offset);
-
-static __isl_give isl_printer *print_nested_tuple(__isl_take isl_printer *p,
-	__isl_keep isl_dim *global_dim, enum isl_dim_type global_type,
-	__isl_keep isl_dim *local_dim, enum isl_dim_type local_type,
-	int set, int latex, __isl_keep isl_basic_map *eq, int offset)
-{
-	const char *name = NULL;
-	unsigned n = isl_dim_size(local_dim, local_type);
-	if ((local_type == isl_dim_in || local_type == isl_dim_out)) {
-		name = isl_dim_get_tuple_name(local_dim, local_type);
-		if (name) {
-			if (latex)
-				p = isl_printer_print_str(p, "\\mathrm{");
-			p = isl_printer_print_str(p, name);
-			if (latex)
-				p = isl_printer_print_str(p, "}");
-		}
-	}
-	if (!latex || n != 1 || name)
-		p = isl_printer_print_str(p, s_open_list[latex]);
-	if ((local_type == isl_dim_in || local_type == isl_dim_out) &&
-	    local_dim->nested[local_type - isl_dim_in]) {
-		if (global_dim != local_dim && local_type == isl_dim_out)
-			offset += local_dim->n_in;
-		p = print_nested_map_dim(p, global_dim, global_type,
-				local_dim->nested[local_type - isl_dim_in],
-				set, latex, eq, offset);
-	} else
-		p = print_nested_var_list(p, global_dim, global_type,
-				 local_dim, local_type, set, latex, eq, offset);
-	if (!latex || n != 1 || name)
-		p = isl_printer_print_str(p, s_close_list[latex]);
-	return p;
-}
-
-static __isl_give isl_printer *print_tuple(__isl_keep isl_dim *dim,
-	__isl_take isl_printer *p, enum isl_dim_type type,
-	int set, int latex, __isl_keep isl_basic_map *eq)
-{
-	return print_nested_tuple(p, dim, type, dim, type, set, latex, eq, 0);
-}
-
-static __isl_give isl_printer *print_nested_map_dim(__isl_take isl_printer *p,
-	__isl_keep isl_dim *global_dim, enum isl_dim_type global_type,
-	__isl_keep isl_dim *local_dim,
-	 int set, int latex, __isl_keep isl_basic_map *eq, int offset)
-{
-	p = print_nested_tuple(p, global_dim, global_type,
-			local_dim, isl_dim_in, set, latex, eq, offset);
-	p = isl_printer_print_str(p, s_to[latex]);
-	p = print_nested_tuple(p, global_dim, global_type,
-			local_dim, isl_dim_out, set, latex, eq, offset);
-
-	return p;
-}
-
-static __isl_give isl_printer *print_dim(__isl_keep isl_dim *dim,
-	__isl_take isl_printer *p, int set, int latex, int rational,
-	__isl_keep isl_basic_map *eq)
-{
-	if (rational && !latex)
-		p = isl_printer_print_str(p, "rat: ");
-	if (set)
-		p = print_tuple(dim, p, isl_dim_set, 1, latex, eq);
-	else {
-		p = print_tuple(dim, p, isl_dim_in, 0, latex, eq);
-		p = isl_printer_print_str(p, s_to[latex]);
-		p = print_tuple(dim, p, isl_dim_out, 0, latex, eq);
-	}
-
-	return p;
-}
-
-static __isl_give isl_printer *print_omega_parameters(__isl_keep isl_dim *dim,
-	__isl_take isl_printer *p)
-{
-	if (isl_dim_size(dim, isl_dim_param) == 0)
-		return p;
-
-	p = isl_printer_start_line(p);
-	p = isl_printer_print_str(p, "symbolic ");
-	p = print_var_list(dim, p, isl_dim_param, 0, 0, NULL);
-	p = isl_printer_print_str(p, ";");
-	p = isl_printer_end_line(p);
-	return p;
-}
-
-static __isl_give isl_printer *print_constraint(struct isl_basic_map *bmap,
-	__isl_keep isl_dim *dim, __isl_take isl_printer *p,
-	isl_int *c, int last, const char *op, int first_constraint, int set,
-	int latex)
-{
-	if (!first_constraint)
-		p = isl_printer_print_str(p, s_and[latex]);
-
-	isl_int_abs(c[last], c[last]);
-
-	p = print_term(dim, NULL, c[last], last, p, set, latex);
-
-	p = isl_printer_print_str(p, " ");
-	p = isl_printer_print_str(p, op);
-	p = isl_printer_print_str(p, " ");
-
-	isl_int_set_si(c[last], 0);
-	p = print_affine(bmap, dim, p, c, set);
-
-	return p;
-}
-
-static __isl_give isl_printer *print_constraints(__isl_keep isl_basic_map *bmap,
-	__isl_keep isl_dim *dim, __isl_take isl_printer *p, int set, int latex)
-{
-	int i;
-	struct isl_vec *c;
-	unsigned total = isl_basic_map_total_dim(bmap);
-
-	c = isl_vec_alloc(bmap->ctx, 1 + total);
-	if (!c)
-		goto error;
-
-	for (i = bmap->n_eq - 1; i >= 0; --i) {
-		int l = isl_seq_last_non_zero(bmap->eq[i], 1 + total);
-		if (l < 0) {
-			if (i != bmap->n_eq - 1)
-				p = isl_printer_print_str(p, s_and[latex]);
-			p = isl_printer_print_str(p, "0 = 0");
-			continue;
-		}
-		if (isl_int_is_neg(bmap->eq[i][l]))
-			isl_seq_cpy(c->el, bmap->eq[i], 1 + total);
-		else
-			isl_seq_neg(c->el, bmap->eq[i], 1 + total);
-		p = print_constraint(bmap, dim, p, c->el, l,
-				    "=", i == bmap->n_eq - 1, set, latex);
-	}
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		int l = isl_seq_last_non_zero(bmap->ineq[i], 1 + total);
-		int s;
-		const char *op;
-		if (l < 0)
-			continue;
-		s = isl_int_sgn(bmap->ineq[i][l]);
-		if (s < 0)
-			isl_seq_cpy(c->el, bmap->ineq[i], 1 + total);
-		else
-			isl_seq_neg(c->el, bmap->ineq[i], 1 + total);
-		op = s < 0 ? s_le[latex] : s_ge[latex];
-		p = print_constraint(bmap, dim, p, c->el, l,
-					op, !bmap->n_eq && !i, set, latex);
-	}
-
-	isl_vec_free(c);
-
-	return p;
-error:
-	isl_vec_free(c);
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_omega_constraints(
-	__isl_keep isl_basic_map *bmap, __isl_take isl_printer *p, int set)
-{
-	if (bmap->n_eq + bmap->n_ineq == 0)
-		return p;
-
-	p = isl_printer_print_str(p, ": ");
-	if (bmap->n_div > 0) {
-		int i;
-		p = isl_printer_print_str(p, "exists (");
-		for (i = 0; i < bmap->n_div; ++i) {
-			if (i)
-				p = isl_printer_print_str(p, ", ");
-			p = print_name(bmap->dim, p, isl_dim_div, i, 0, 0);
-		}
-		p = isl_printer_print_str(p, ": ");
-	}
-	p = print_constraints(bmap, bmap->dim, p, set, 0);
-	if (bmap->n_div > 0)
-		p = isl_printer_print_str(p, ")");
-	return p;
-}
-
-static __isl_give isl_printer *basic_map_print_omega(
-	__isl_keep isl_basic_map *bmap, __isl_take isl_printer *p)
-{
-	p = isl_printer_print_str(p, "{ [");
-	p = print_var_list(bmap->dim, p, isl_dim_in, 0, 0, NULL);
-	p = isl_printer_print_str(p, "] -> [");
-	p = print_var_list(bmap->dim, p, isl_dim_out, 0, 0, NULL);
-	p = isl_printer_print_str(p, "] ");
-	p = print_omega_constraints(bmap, p, 0);
-	p = isl_printer_print_str(p, " }");
-	return p;
-}
-
-static __isl_give isl_printer *isl_basic_map_print_omega(
-	__isl_keep isl_basic_map *bmap, __isl_take isl_printer *p)
-{
-	p = print_omega_parameters(bmap->dim, p);
-
-	p = isl_printer_start_line(p);
-	p = basic_map_print_omega(bmap, p);
-	p = isl_printer_end_line(p);
-	return p;
-}
-
-static __isl_give isl_printer *basic_set_print_omega(
-	__isl_keep isl_basic_set *bset, __isl_take isl_printer *p)
-{
-	p = isl_printer_print_str(p, "{ [");
-	p = print_var_list(bset->dim, p, isl_dim_set, 1, 0, NULL);
-	p = isl_printer_print_str(p, "] ");
-	p = print_omega_constraints((isl_basic_map *)bset, p, 1);
-	p = isl_printer_print_str(p, " }");
-	return p;
-}
-
-static __isl_give isl_printer *isl_basic_set_print_omega(
-	__isl_keep isl_basic_set *bset, __isl_take isl_printer *p)
-{
-	p = print_omega_parameters(bset->dim, p);
-
-	p = isl_printer_start_line(p);
-	p = basic_set_print_omega(bset, p);
-	p = isl_printer_end_line(p);
-	return p;
-}
-
-static __isl_give isl_printer *isl_map_print_omega(__isl_keep isl_map *map,
-	__isl_take isl_printer *p)
-{
-	int i;
-
-	p = print_omega_parameters(map->dim, p);
-
-	p = isl_printer_start_line(p);
-	for (i = 0; i < map->n; ++i) {
-		if (i)
-			p = isl_printer_print_str(p, " union ");
-		p = basic_map_print_omega(map->p[i], p);
-	}
-	p = isl_printer_end_line(p);
-	return p;
-}
-
-static __isl_give isl_printer *isl_set_print_omega(__isl_keep isl_set *set,
-	__isl_take isl_printer *p)
-{
-	int i;
-
-	p = print_omega_parameters(set->dim, p);
-
-	p = isl_printer_start_line(p);
-	for (i = 0; i < set->n; ++i) {
-		if (i)
-			p = isl_printer_print_str(p, " union ");
-		p = basic_set_print_omega(set->p[i], p);
-	}
-	p = isl_printer_end_line(p);
-	return p;
-}
-
-static __isl_give isl_printer *print_disjunct(__isl_keep isl_basic_map *bmap,
-	__isl_keep isl_dim *dim, __isl_take isl_printer *p, int set, int latex)
-{
-	if (bmap->n_div > 0) {
-		int i;
-		p = isl_printer_print_str(p, s_open_exists[latex]);
-		for (i = 0; i < bmap->n_div; ++i) {
-			if (i)
-				p = isl_printer_print_str(p, ", ");
-			p = print_name(dim, p, isl_dim_div, i, 0, latex);
-			if (latex || isl_int_is_zero(bmap->div[i][0]))
-				continue;
-			p = isl_printer_print_str(p, " = [(");
-			p = print_affine(bmap, dim, p, bmap->div[i] + 1, set);
-			p = isl_printer_print_str(p, ")/");
-			p = isl_printer_print_isl_int(p, bmap->div[i][0]);
-			p = isl_printer_print_str(p, "]");
-		}
-		p = isl_printer_print_str(p, ": ");
-	}
-
-	p = print_constraints(bmap, dim, p, set, latex);
-
-	if (bmap->n_div > 0)
-		p = isl_printer_print_str(p, s_close_exists[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 set, int 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, 0, latex, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	p = isl_printer_print_str(p, "{ ");
-	p = print_dim(bmap->dim, p, set, latex, rational, NULL);
-	p = isl_printer_print_str(p, " : ");
-	p = print_disjunct(bmap, bmap->dim, p, set, latex);
-	p = isl_printer_print_str(p, " }");
-	return p;
-}
-
-static __isl_give isl_printer *print_disjuncts(__isl_keep isl_map *map,
-	__isl_take isl_printer *p, int set, int latex)
-{
-	int i;
-
-	if (isl_map_plain_is_universe(map))
-		return p;
-
-	p = isl_printer_print_str(p, s_such_that[latex]);
-	if (map->n == 0)
-		p = isl_printer_print_str(p, "1 = 0");
-	for (i = 0; i < map->n; ++i) {
-		if (i)
-			p = isl_printer_print_str(p, s_or[latex]);
-		if (map->n > 1 && map->p[i]->n_eq + map->p[i]->n_ineq > 1)
-			p = isl_printer_print_str(p, "(");
-		p = print_disjunct(map->p[i], map->dim, p, set, latex);
-		if (map->n > 1 && map->p[i]->n_eq + map->p[i]->n_ineq > 1)
-			p = isl_printer_print_str(p, ")");
-	}
-	return p;
-}
-
-struct isl_aff_split {
-	isl_basic_map *aff;
-	isl_map *map;
-};
-
-static void free_split(__isl_take struct isl_aff_split *split, int n)
-{
-	int i;
-
-	if (!split)
-		return;
-
-	for (i = 0; i < n; ++i) {
-		isl_basic_map_free(split[i].aff);
-		isl_map_free(split[i].map);
-	}
-
-	free(split);
-}
-
-static __isl_give isl_basic_map *get_aff(__isl_take isl_basic_map *bmap)
-{
-	int i, j;
-	unsigned nparam, n_in, n_out, total;
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-	if (isl_basic_map_free_inequality(bmap, bmap->n_ineq) < 0)
-		goto error;
-
-	nparam = isl_basic_map_dim(bmap, isl_dim_param);
-	n_in = isl_basic_map_dim(bmap, isl_dim_in);
-	n_out = isl_basic_map_dim(bmap, isl_dim_out);
-	total = isl_basic_map_dim(bmap, isl_dim_all);
-	for (i = bmap->n_eq - 1; i >= 0; --i) {
-		j = isl_seq_last_non_zero(bmap->eq[i] + 1, total);
-		if (j >= nparam && j < nparam + n_in + n_out &&
-		    (isl_int_is_one(bmap->eq[i][1 + j]) ||
-		     isl_int_is_negone(bmap->eq[i][1 + j])))
-			continue;
-		if (isl_basic_map_drop_equality(bmap, i) < 0)
-			goto error;
-	}
-
-	bmap = isl_basic_map_finalize(bmap);
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static int aff_split_cmp(const void *p1, const void *p2)
-{
-	const struct isl_aff_split *s1, *s2;
-	s1 = (const struct isl_aff_split *) p1;
-	s2 = (const struct isl_aff_split *) p2;
-
-	return isl_basic_map_plain_cmp(s1->aff, s2->aff);
-}
-
-static __isl_give isl_basic_map *drop_aff(__isl_take isl_basic_map *bmap,
-	__isl_keep isl_basic_map *aff)
-{
-	int i, j;
-	unsigned total;
-
-	if (!bmap || !aff)
-		goto error;
-
-	total = isl_dim_total(bmap->dim);
-
-	for (i = bmap->n_eq - 1; i >= 0; --i) {
-		if (isl_seq_first_non_zero(bmap->eq[i] + 1 + total,
-					    bmap->n_div) != -1)
-			continue;
-		for (j = 0; j < aff->n_eq; ++j) {
-			if (!isl_seq_eq(bmap->eq[i], aff->eq[j], 1 + total) &&
-			    !isl_seq_is_neg(bmap->eq[i], aff->eq[j], 1 + total))
-				continue;
-			if (isl_basic_map_drop_equality(bmap, i) < 0)
-				goto error;
-			break;
-		}
-	}
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static __isl_give struct isl_aff_split *split_aff(__isl_keep isl_map *map)
-{
-	int i, n;
-	struct isl_aff_split *split;
-	isl_ctx *ctx;
-
-	ctx = isl_map_get_ctx(map);
-	split = isl_calloc_array(ctx, struct isl_aff_split, map->n);
-	if (!split)
-		return NULL;
-
-	for (i = 0; i < map->n; ++i) {
-		isl_basic_map *bmap;
-		split[i].aff = get_aff(isl_basic_map_copy(map->p[i]));
-		bmap = isl_basic_map_copy(map->p[i]);
-		bmap = isl_basic_map_cow(bmap);
-		bmap = drop_aff(bmap, split[i].aff);
-		split[i].map = isl_map_from_basic_map(bmap);
-		if (!split[i].aff || !split[i].map)
-			goto error;
-	}
-
-	qsort(split, map->n, sizeof(struct isl_aff_split), &aff_split_cmp);
-
-	n = map->n;
-	for (i = n - 1; i >= 1; --i) {
-		if (!isl_basic_map_plain_is_equal(split[i - 1].aff,
-						 split[i].aff))
-			continue;
-		isl_basic_map_free(split[i].aff);
-		split[i - 1].map = isl_map_union(split[i - 1].map,
-						 split[i].map);
-		if (i != n - 1)
-			split[i] = split[n - 1];
-		split[n - 1].aff = NULL;
-		split[n - 1].map = NULL;
-		--n;
-	}
-
-	return split;
-error:
-	free_split(split, map->n);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_split_map(__isl_take isl_printer *p,
-	struct isl_aff_split *split, int n, int set)
-{
-	int i;
-	int rational;
-
-	for (i = 0; i < n; ++i) {
-		isl_dim *dim;
-
-		if (!split[i].map)
-			break;
-		dim = split[i].map->dim;
-		rational = split[i].map->n > 0 &&
-		    ISL_F_ISSET(split[i].map->p[0], ISL_BASIC_MAP_RATIONAL);
-		if (i)
-			p = isl_printer_print_str(p, "; ");
-		p = print_dim(dim, p, set, 0, rational, split[i].aff);
-		p = print_disjuncts(split[i].map, p, set, 0);
-	}
-
-	return p;
-}
-
-static __isl_give isl_printer *isl_map_print_isl_body(__isl_keep isl_map *map,
-	__isl_take isl_printer *p, int set)
-{
-	struct isl_aff_split *split = NULL;
-	int rational;
-
-	if (map->n > 0)
-		split = split_aff(map);
-	if (split) {
-		p = print_split_map(p, split, map->n, set);
-	} else {
-		rational = map->n > 0 &&
-		    ISL_F_ISSET(map->p[0], ISL_BASIC_MAP_RATIONAL);
-		p = print_dim(map->dim, p, set, 0, rational, NULL);
-		p = print_disjuncts(map, p, set, 0);
-	}
-	free_split(split, map->n);
-	return p;
-}
-
-static __isl_give isl_printer *isl_map_print_isl(__isl_keep isl_map *map,
-	__isl_take isl_printer *p, int set)
-{
-	if (isl_map_dim(map, isl_dim_param) > 0) {
-		p = print_tuple(map->dim, p, isl_dim_param, set, 0, NULL);
-		p = isl_printer_print_str(p, s_to[0]);
-	}
-	p = isl_printer_print_str(p, s_open_set[0]);
-	p = isl_map_print_isl_body(map, p, set);
-	p = isl_printer_print_str(p, s_close_set[0]);
-	return p;
-}
-
-static __isl_give isl_printer *print_latex_map(__isl_keep isl_map *map,
-	__isl_take isl_printer *p, __isl_keep isl_basic_map *aff, int set)
-{
-	if (isl_map_dim(map, isl_dim_param) > 0) {
-		p = print_tuple(map->dim, p, isl_dim_param, set, 1, NULL);
-		p = isl_printer_print_str(p, s_to[1]);
-	}
-	p = isl_printer_print_str(p, s_open_set[1]);
-	p = print_dim(map->dim, p, set, 1, 0, aff);
-	p = print_disjuncts(map, p, set, 1);
-	p = isl_printer_print_str(p, s_close_set[1]);
-
-	return p;
-}
-
-static __isl_give isl_printer *isl_map_print_latex(__isl_keep isl_map *map,
-	__isl_take isl_printer *p, int set)
-{
-	int i;
-	struct isl_aff_split *split = NULL;
-
-	if (map->n > 0)
-		split = split_aff(map);
-
-	if (!split)
-		return print_latex_map(map, p, NULL, set);
-
-	for (i = 0; i < map->n; ++i) {
-		if (!split[i].map)
-			break;
-		if (i)
-			p = isl_printer_print_str(p, " \\cup ");
-		p = print_latex_map(split[i].map, p, split[i].aff, set);
-	}
-
-	free_split(split, map->n);
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_print_basic_map(__isl_take isl_printer *p,
-	__isl_keep isl_basic_map *bmap)
-{
-	if (!p || !bmap)
-		goto error;
-	if (p->output_format == ISL_FORMAT_ISL)
-		return isl_basic_map_print_isl(bmap, p, 0, 0);
-	else if (p->output_format == ISL_FORMAT_OMEGA)
-		return isl_basic_map_print_omega(bmap, p);
-	isl_assert(bmap->ctx, 0, goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void isl_basic_map_print(__isl_keep isl_basic_map *bmap, FILE *out, int indent,
-	const char *prefix, const char *suffix, unsigned output_format)
-{
-	isl_printer *printer;
-
-	if (!bmap)
-		return;
-
-	printer = isl_printer_to_file(bmap->ctx, out);
-	printer = isl_printer_set_indent(printer, indent);
-	printer = isl_printer_set_prefix(printer, prefix);
-	printer = isl_printer_set_suffix(printer, suffix);
-	printer = isl_printer_set_output_format(printer, output_format);
-	isl_printer_print_basic_map(printer, bmap);
-
-	isl_printer_free(printer);
-}
-
-__isl_give isl_printer *isl_printer_print_basic_set(__isl_take isl_printer *p,
-	__isl_keep isl_basic_set *bset)
-{
-	if (!p || !bset)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return isl_basic_map_print_isl(bset, p, 1, 0);
-	else if (p->output_format == ISL_FORMAT_POLYLIB)
-		return isl_basic_set_print_polylib(bset, p, 0);
-	else if (p->output_format == ISL_FORMAT_EXT_POLYLIB)
-		return isl_basic_set_print_polylib(bset, p, 1);
-	else if (p->output_format == ISL_FORMAT_POLYLIB_CONSTRAINTS)
-		return bset_print_constraints_polylib(bset, p);
-	else if (p->output_format == ISL_FORMAT_OMEGA)
-		return isl_basic_set_print_omega(bset, p);
-	isl_assert(p->ctx, 0, goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void isl_basic_set_print(struct isl_basic_set *bset, FILE *out, int indent,
-	const char *prefix, const char *suffix, unsigned output_format)
-{
-	isl_printer *printer;
-
-	if (!bset)
-		return;
-
-	printer = isl_printer_to_file(bset->ctx, out);
-	printer = isl_printer_set_indent(printer, indent);
-	printer = isl_printer_set_prefix(printer, prefix);
-	printer = isl_printer_set_suffix(printer, suffix);
-	printer = isl_printer_set_output_format(printer, output_format);
-	isl_printer_print_basic_set(printer, bset);
-
-	isl_printer_free(printer);
-}
-
-__isl_give isl_printer *isl_printer_print_set(__isl_take isl_printer *p,
-	__isl_keep isl_set *set)
-{
-	if (!p || !set)
-		goto error;
-	if (p->output_format == ISL_FORMAT_ISL)
-		return isl_map_print_isl((isl_map *)set, p, 1);
-	else if (p->output_format == ISL_FORMAT_POLYLIB)
-		return isl_set_print_polylib(set, p, 0);
-	else if (p->output_format == ISL_FORMAT_EXT_POLYLIB)
-		return isl_set_print_polylib(set, p, 1);
-	else if (p->output_format == ISL_FORMAT_OMEGA)
-		return isl_set_print_omega(set, p);
-	else if (p->output_format == ISL_FORMAT_LATEX)
-		return isl_map_print_latex((isl_map *)set, p, 1);
-	isl_assert(set->ctx, 0, goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void isl_set_print(struct isl_set *set, FILE *out, int indent,
-	unsigned output_format)
-{
-	isl_printer *printer;
-
-	if (!set)
-		return;
-
-	printer = isl_printer_to_file(set->ctx, out);
-	printer = isl_printer_set_indent(printer, indent);
-	printer = isl_printer_set_output_format(printer, output_format);
-	printer = isl_printer_print_set(printer, set);
-
-	isl_printer_free(printer);
-}
-
-__isl_give isl_printer *isl_printer_print_map(__isl_take isl_printer *p,
-	__isl_keep isl_map *map)
-{
-	if (!p || !map)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return isl_map_print_isl(map, p, 0);
-	else if (p->output_format == ISL_FORMAT_POLYLIB)
-		return isl_map_print_polylib(map, p, 0);
-	else if (p->output_format == ISL_FORMAT_EXT_POLYLIB)
-		return isl_map_print_polylib(map, p, 1);
-	else if (p->output_format == ISL_FORMAT_OMEGA)
-		return isl_map_print_omega(map, p);
-	else if (p->output_format == ISL_FORMAT_LATEX)
-		return isl_map_print_latex(map, p, 0);
-	isl_assert(map->ctx, 0, goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-struct isl_union_print_data {
-	isl_printer *p;
-	int set;
-	int first;
-};
-
-static int print_map_body(__isl_take isl_map *map, void *user)
-{
-	struct isl_union_print_data *data;
-	data = (struct isl_union_print_data *)user;
-
-	if (!data->first)
-		data->p = isl_printer_print_str(data->p, "; ");
-	data->first = 0;
-
-	data->p = isl_map_print_isl_body(map, data->p, data->set);
-	isl_map_free(map);
-
-	return 0;
-}
-
-static __isl_give isl_printer *isl_union_map_print_isl(
-	__isl_keep isl_union_map *umap, __isl_take isl_printer *p, int set)
-{
-	struct isl_union_print_data data = { p, set, 1 };
-	isl_dim *dim;
-	dim = isl_union_map_get_dim(umap);
-	if (isl_dim_size(dim, isl_dim_param) > 0) {
-		p = print_tuple(dim, p, isl_dim_param, set, 0, NULL);
-		p = isl_printer_print_str(p, s_to[0]);
-	}
-	isl_dim_free(dim);
-	p = isl_printer_print_str(p, s_open_set[0]);
-	isl_union_map_foreach_map(umap, &print_map_body, &data);
-	p = data.p;
-	p = isl_printer_print_str(p, s_close_set[0]);
-	return p;
-}
-
-static int print_latex_map_body(__isl_take isl_map *map, void *user)
-{
-	struct isl_union_print_data *data;
-	data = (struct isl_union_print_data *)user;
-
-	if (!data->first)
-		data->p = isl_printer_print_str(data->p, " \\cup ");
-	data->first = 0;
-
-	data->p = isl_map_print_latex(map, data->p, data->set);
-	isl_map_free(map);
-
-	return 0;
-}
-
-static __isl_give isl_printer *isl_union_map_print_latex(
-	__isl_keep isl_union_map *umap, __isl_take isl_printer *p, int set)
-{
-	struct isl_union_print_data data = { p, set, 1 };
-	isl_union_map_foreach_map(umap, &print_latex_map_body, &data);
-	p = data.p;
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_print_union_map(__isl_take isl_printer *p,
-	__isl_keep isl_union_map *umap)
-{
-	if (!p || !umap)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return isl_union_map_print_isl(umap, p, 0);
-	if (p->output_format == ISL_FORMAT_LATEX)
-		return isl_union_map_print_latex(umap, p, 0);
-
-	isl_die(p->ctx, isl_error_invalid,
-		"invalid output format for isl_union_map", goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-__isl_give isl_printer *isl_printer_print_union_set(__isl_take isl_printer *p,
-	__isl_keep isl_union_set *uset)
-{
-	if (!p || !uset)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return isl_union_map_print_isl((isl_union_map *)uset, p, 1);
-	if (p->output_format == ISL_FORMAT_LATEX)
-		return isl_union_map_print_latex((isl_union_map *)uset, p, 1);
-
-	isl_die(p->ctx, isl_error_invalid,
-		"invalid output format for isl_union_set", goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void isl_map_print(__isl_keep isl_map *map, FILE *out, int indent,
-	unsigned output_format)
-{
-	isl_printer *printer;
-
-	if (!map)
-		return;
-
-	printer = isl_printer_to_file(map->ctx, out);
-	printer = isl_printer_set_indent(printer, indent);
-	printer = isl_printer_set_output_format(printer, output_format);
-	printer = isl_printer_print_map(printer, map);
-
-	isl_printer_free(printer);
-}
-
-void isl_basic_map_dump(__isl_keep isl_basic_map *bmap)
-{
-	isl_printer *printer;
-
-	if (!bmap)
-		return;
-
-	printer = isl_printer_to_file(isl_basic_map_get_ctx(bmap), stderr);
-	printer = isl_printer_print_basic_map(printer, bmap);
-	printer = isl_printer_end_line(printer);
-
-	isl_printer_free(printer);
-}
-
-void isl_basic_set_dump(__isl_keep isl_basic_set *bset)
-{
-	isl_printer *printer;
-
-	if (!bset)
-		return;
-
-	printer = isl_printer_to_file(isl_basic_set_get_ctx(bset), stderr);
-	printer = isl_printer_print_basic_set(printer, bset);
-	printer = isl_printer_end_line(printer);
-
-	isl_printer_free(printer);
-}
-
-void isl_map_dump(__isl_keep isl_map *map)
-{
-	isl_printer *printer;
-
-	if (!map)
-		return;
-
-	printer = isl_printer_to_file(isl_map_get_ctx(map), stderr);
-	printer = isl_printer_print_map(printer, map);
-	printer = isl_printer_end_line(printer);
-
-	isl_printer_free(printer);
-}
-
-void isl_set_dump(__isl_keep isl_set *set)
-{
-	isl_printer *printer;
-
-	if (!set)
-		return;
-
-	printer = isl_printer_to_file(isl_set_get_ctx(set), stderr);
-	printer = isl_printer_print_set(printer, set);
-	printer = isl_printer_end_line(printer);
-
-	isl_printer_free(printer);
-}
-
-void isl_union_map_dump(__isl_keep isl_union_map *umap)
-{
-	isl_printer *printer;
-
-	if (!umap)
-		return;
-
-	printer = isl_printer_to_file(isl_union_map_get_ctx(umap), stderr);
-	printer = isl_printer_print_union_map(printer, umap);
-	printer = isl_printer_end_line(printer);
-
-	isl_printer_free(printer);
-}
-
-void isl_union_set_dump(__isl_keep isl_union_set *uset)
-{
-	isl_printer *printer;
-
-	if (!uset)
-		return;
-
-	printer = isl_printer_to_file(isl_union_set_get_ctx(uset), stderr);
-	printer = isl_printer_print_union_set(printer, uset);
-	printer = isl_printer_end_line(printer);
-
-	isl_printer_free(printer);
-}
-
-void isl_union_pw_qpolynomial_dump(__isl_keep isl_union_pw_qpolynomial *upwqp)
-{
-	isl_printer *printer;
-
-	if (!upwqp)
-		return;
-
-	printer = isl_printer_to_file(isl_union_pw_qpolynomial_get_ctx(upwqp),
-					stderr);
-	printer = isl_printer_print_union_pw_qpolynomial(printer, upwqp);
-	printer = isl_printer_end_line(printer);
-
-	isl_printer_free(printer);
-}
-
-void isl_qpolynomial_dump(__isl_keep isl_qpolynomial *qp)
-{
-	isl_printer *printer;
-
-	if (!qp)
-		return;
-
-	printer = isl_printer_to_file(isl_qpolynomial_get_ctx(qp), stderr);
-	printer = isl_printer_print_qpolynomial(printer, qp);
-	printer = isl_printer_end_line(printer);
-
-	isl_printer_free(printer);
-}
-
-void isl_qpolynomial_fold_dump(__isl_keep isl_qpolynomial_fold *fold)
-{
-	isl_printer *printer;
-
-	if (!fold)
-		return;
-
-	printer = isl_printer_to_file(isl_qpolynomial_fold_get_ctx(fold),
-					stderr);
-	printer = isl_printer_print_qpolynomial_fold(printer, fold);
-	printer = isl_printer_end_line(printer);
-
-	isl_printer_free(printer);
-}
-
-void isl_pw_qpolynomial_dump(__isl_keep isl_pw_qpolynomial *pwqp)
-{
-	isl_printer *printer;
-
-	if (!pwqp)
-		return;
-
-	printer = isl_printer_to_file(isl_pw_qpolynomial_get_ctx(pwqp), stderr);
-	printer = isl_printer_print_pw_qpolynomial(printer, pwqp);
-	printer = isl_printer_end_line(printer);
-
-	isl_printer_free(printer);
-}
-
-void isl_pw_qpolynomial_fold_dump(__isl_keep isl_pw_qpolynomial_fold *pwf)
-{
-	isl_printer *printer;
-
-	if (!pwf)
-		return;
-
-	printer = isl_printer_to_file(
-			isl_pw_qpolynomial_fold_get_ctx(pwf), stderr);
-	printer = isl_printer_print_pw_qpolynomial_fold(printer, pwf);
-	printer = isl_printer_end_line(printer);
-
-	isl_printer_free(printer);
-}
-
-void isl_union_pw_qpolynomial_fold_dump(
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf)
-{
-	isl_printer *printer;
-
-	if (!upwf)
-		return;
-
-	printer = isl_printer_to_file(
-			isl_union_pw_qpolynomial_fold_get_ctx(upwf), stderr);
-	printer = isl_printer_print_union_pw_qpolynomial_fold(printer, upwf);
-	printer = isl_printer_end_line(printer);
-
-	isl_printer_free(printer);
-}
-
-static int upoly_rec_n_non_zero(__isl_keep struct isl_upoly_rec *rec)
-{
-	int i;
-	int n;
-
-	for (i = 0, n = 0; i < rec->n; ++i)
-		if (!isl_upoly_is_zero(rec->p[i]))
-			++n;
-
-	return n;
-}
-
-static __isl_give isl_printer *print_div(__isl_keep isl_dim *dim,
-	__isl_keep isl_mat *div, int pos, __isl_take isl_printer *p)
-{
-	int c = p->output_format == ISL_FORMAT_C;
-	p = isl_printer_print_str(p, c ? "floord(" : "[(");
-	p = print_affine_of_len(dim, div, p,
-				div->row[pos] + 1, div->n_col - 1, 1);
-	p = isl_printer_print_str(p, c ? ", " : ")/");
-	p = isl_printer_print_isl_int(p, div->row[pos][0]);
-	p = isl_printer_print_str(p, c ? ")" : "]");
-	return p;
-}
-
-static __isl_give isl_printer *upoly_print_cst(__isl_keep struct isl_upoly *up,
-	__isl_take isl_printer *p, int first)
-{
-	struct isl_upoly_cst *cst;
-	int neg;
-
-	cst = isl_upoly_as_cst(up);
-	if (!cst)
-		goto error;
-	neg = !first && isl_int_is_neg(cst->n);
-	if (!first)
-		p = isl_printer_print_str(p, neg ? " - " :  " + ");
-	if (neg)
-		isl_int_neg(cst->n, cst->n);
-	if (isl_int_is_zero(cst->d)) {
-		int sgn = isl_int_sgn(cst->n);
-		p = isl_printer_print_str(p, sgn < 0 ? "-infty" :
-					    sgn == 0 ? "NaN" : "infty");
-	} else
-		p = isl_printer_print_isl_int(p, cst->n);
-	if (neg)
-		isl_int_neg(cst->n, cst->n);
-	if (!isl_int_is_zero(cst->d) && !isl_int_is_one(cst->d)) {
-		p = isl_printer_print_str(p, "/");
-		p = isl_printer_print_isl_int(p, cst->d);
-	}
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_base(__isl_take isl_printer *p,
-	__isl_keep isl_dim *dim, __isl_keep isl_mat *div, int var)
-{
-	unsigned total;
-
-	total = isl_dim_total(dim);
-	if (var < total)
-		p = print_term(dim, NULL, dim->ctx->one, 1 + var, p, 1, 0);
-	else
-		p = print_div(dim, div, var - total, p);
-	return p;
-}
-
-static __isl_give isl_printer *print_pow(__isl_take isl_printer *p,
-	__isl_keep isl_dim *dim, __isl_keep isl_mat *div, int var, int exp)
-{
-	p = print_base(p, dim, div, var);
-	if (exp == 1)
-		return p;
-	if (p->output_format == ISL_FORMAT_C) {
-		int i;
-		for (i = 1; i < exp; ++i) {
-			p = isl_printer_print_str(p, "*");
-			p = print_base(p, dim, div, var);
-		}
-	} else {
-		p = isl_printer_print_str(p, "^");
-		p = isl_printer_print_int(p, exp);
-	}
-	return p;
-}
-
-static __isl_give isl_printer *upoly_print(__isl_keep struct isl_upoly *up,
-	__isl_keep isl_dim *dim, __isl_keep isl_mat *div,
-	__isl_take isl_printer *p, int outer)
-{
-	int i, n, first, print_parens;
-	struct isl_upoly_rec *rec;
-
-	if (!p || !up || !dim || !div)
-		goto error;
-
-	if (isl_upoly_is_cst(up))
-		return upoly_print_cst(up, p, 1);
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-	n = upoly_rec_n_non_zero(rec);
-	print_parens = n > 1 || (outer && rec->up.var >= isl_dim_total(dim));
-	if (print_parens)
-		p = isl_printer_print_str(p, "(");
-	for (i = 0, first = 1; i < rec->n; ++i) {
-		if (isl_upoly_is_zero(rec->p[i]))
-			continue;
-		if (isl_upoly_is_negone(rec->p[i])) {
-			if (!i)
-				p = isl_printer_print_str(p, "-1");
-			else if (first)
-				p = isl_printer_print_str(p, "-");
-			else
-				p = isl_printer_print_str(p, " - ");
-		} else if (isl_upoly_is_cst(rec->p[i]) &&
-				!isl_upoly_is_one(rec->p[i]))
-			p = upoly_print_cst(rec->p[i], p, first);
-		else {
-			if (!first)
-				p = isl_printer_print_str(p, " + ");
-			if (i == 0 || !isl_upoly_is_one(rec->p[i]))
-				p = upoly_print(rec->p[i], dim, div, p, 0);
-		}
-		first = 0;
-		if (i == 0)
-			continue;
-		if (!isl_upoly_is_one(rec->p[i]) &&
-		    !isl_upoly_is_negone(rec->p[i]))
-			p = isl_printer_print_str(p, " * ");
-		p = print_pow(p, dim, div, rec->up.var, i);
-	}
-	if (print_parens)
-		p = isl_printer_print_str(p, ")");
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_qpolynomial(__isl_take isl_printer *p,
-	__isl_keep isl_qpolynomial *qp)
-{
-	if (!p || !qp)
-		goto error;
-	p = upoly_print(qp->upoly, qp->dim, qp->div, p, 1);
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_qpolynomial_isl(__isl_take isl_printer *p,
-	__isl_keep isl_qpolynomial *qp)
-{
-	if (!p || !qp)
-		goto error;
-
-	if (isl_dim_size(qp->dim, isl_dim_param) > 0) {
-		p = print_tuple(qp->dim, p, isl_dim_param, 0, 0, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	p = isl_printer_print_str(p, "{ ");
-	if (isl_dim_size(qp->dim, isl_dim_set) > 0 ||
-	    isl_dim_is_named_or_nested(qp->dim, isl_dim_set)) {
-		p = print_dim(qp->dim, p, 1, 0, 0, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	p = print_qpolynomial(p, qp);
-	p = isl_printer_print_str(p, " }");
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_qpolynomial_c(__isl_take isl_printer *p,
-	__isl_keep isl_dim *dim, __isl_keep isl_qpolynomial *qp)
-{
-	isl_int den;
-
-	isl_int_init(den);
-	isl_qpolynomial_get_den(qp, &den);
-	if (!isl_int_is_one(den)) {
-		isl_qpolynomial *f;
-		p = isl_printer_print_str(p, "(");
-		qp = isl_qpolynomial_copy(qp);
-		f = isl_qpolynomial_rat_cst(isl_dim_copy(qp->dim),
-						den, qp->dim->ctx->one);
-		qp = isl_qpolynomial_mul(qp, f);
-	}
-	if (qp)
-		p = upoly_print(qp->upoly, dim, qp->div, p, 0);
-	if (!isl_int_is_one(den)) {
-		p = isl_printer_print_str(p, ")/");
-		p = isl_printer_print_isl_int(p, den);
-		isl_qpolynomial_free(qp);
-	}
-	isl_int_clear(den);
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_print_qpolynomial(
-	__isl_take isl_printer *p, __isl_keep isl_qpolynomial *qp)
-{
-	if (!p || !qp)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return print_qpolynomial_isl(p, qp);
-	else if (p->output_format == ISL_FORMAT_C)
-		return print_qpolynomial_c(p, qp->dim, qp);
-	else
-		isl_die(qp->dim->ctx, isl_error_unsupported,
-			"output format not supported for isl_qpolynomials",
-			goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void isl_qpolynomial_print(__isl_keep isl_qpolynomial *qp, FILE *out,
-	unsigned output_format)
-{
-	isl_printer *p;
-
-	if  (!qp)
-		return;
-
-	isl_assert(qp->dim->ctx, output_format == ISL_FORMAT_ISL, return);
-	p = isl_printer_to_file(qp->dim->ctx, out);
-	p = isl_printer_print_qpolynomial(p, qp);
-	isl_printer_free(p);
-}
-
-static __isl_give isl_printer *qpolynomial_fold_print(
-	__isl_keep isl_qpolynomial_fold *fold, __isl_take isl_printer *p)
-{
-	int i;
-
-	if (fold->type == isl_fold_min)
-		p = isl_printer_print_str(p, "min");
-	else if (fold->type == isl_fold_max)
-		p = isl_printer_print_str(p, "max");
-	p = isl_printer_print_str(p, "(");
-	for (i = 0; i < fold->n; ++i) {
-		if (i)
-			p = isl_printer_print_str(p, ", ");
-		p = print_qpolynomial(p, fold->qp[i]);
-	}
-	p = isl_printer_print_str(p, ")");
-	return p;
-}
-
-void isl_qpolynomial_fold_print(__isl_keep isl_qpolynomial_fold *fold,
-	FILE *out, unsigned output_format)
-{
-	isl_printer *p;
-
-	if (!fold)
-		return;
-
-	isl_assert(fold->dim->ctx, output_format == ISL_FORMAT_ISL, return);
-
-	p = isl_printer_to_file(fold->dim->ctx, out);
-	p = isl_printer_print_qpolynomial_fold(p, fold);
-
-	isl_printer_free(p);
-}
-
-static __isl_give isl_printer *isl_pwqp_print_isl_body(
-	__isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial *pwqp)
-{
-	int i = 0;
-
-	for (i = 0; i < pwqp->n; ++i) {
-		if (i)
-			p = isl_printer_print_str(p, "; ");
-		if (isl_dim_size(pwqp->dim, isl_dim_set) > 0 ||
-		    isl_dim_is_named_or_nested(pwqp->dim, isl_dim_set)) {
-			p = print_dim(pwqp->p[i].set->dim, p, 1, 0, 0, NULL);
-			p = isl_printer_print_str(p, " -> ");
-		}
-		p = print_qpolynomial(p, pwqp->p[i].qp);
-		p = print_disjuncts((isl_map *)pwqp->p[i].set, p, 1, 0);
-	}
-
-	return p;
-}
-
-static __isl_give isl_printer *print_pw_qpolynomial_isl(
-	__isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial *pwqp)
-{
-	if (!p || !pwqp)
-		goto error;
-
-	if (isl_dim_size(pwqp->dim, isl_dim_param) > 0) {
-		p = print_tuple(pwqp->dim, p, isl_dim_param, 0, 0, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	p = isl_printer_print_str(p, "{ ");
-	if (pwqp->n == 0) {
-		if (isl_dim_size(pwqp->dim, isl_dim_set) > 0 ||
-		    isl_dim_is_named_or_nested(pwqp->dim, isl_dim_set)) {
-			p = print_dim(pwqp->dim, p, 1, 0, 0, NULL);
-			p = isl_printer_print_str(p, " -> ");
-		}
-		p = isl_printer_print_str(p, "0");
-	}
-	p = isl_pwqp_print_isl_body(p, pwqp);
-	p = isl_printer_print_str(p, " }");
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void isl_pw_qpolynomial_print(__isl_keep isl_pw_qpolynomial *pwqp, FILE *out,
-	unsigned output_format)
-{
-	isl_printer *p;
-
-	if (!pwqp)
-		return;
-
-	p = isl_printer_to_file(pwqp->dim->ctx, out);
-	p = isl_printer_set_output_format(p, output_format);
-	p = isl_printer_print_pw_qpolynomial(p, pwqp);
-
-	isl_printer_free(p);
-}
-
-static __isl_give isl_printer *isl_pwf_print_isl_body(
-	__isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial_fold *pwf)
-{
-	int i = 0;
-
-	for (i = 0; i < pwf->n; ++i) {
-		if (i)
-			p = isl_printer_print_str(p, "; ");
-		if (isl_dim_size(pwf->dim, isl_dim_set) > 0 ||
-		    isl_dim_is_named_or_nested(pwf->dim, isl_dim_set)) {
-			p = print_dim(pwf->p[i].set->dim, p, 1, 0, 0, NULL);
-			p = isl_printer_print_str(p, " -> ");
-		}
-		p = qpolynomial_fold_print(pwf->p[i].fold, p);
-		p = print_disjuncts((isl_map *)pwf->p[i].set, p, 1, 0);
-	}
-
-	return p;
-}
-
-static __isl_give isl_printer *print_pw_qpolynomial_fold_isl(
-	__isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial_fold *pwf)
-{
-	if (isl_dim_size(pwf->dim, isl_dim_param) > 0) {
-		p = print_tuple(pwf->dim, p, isl_dim_param, 0, 0, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	p = isl_printer_print_str(p, "{ ");
-	if (pwf->n == 0) {
-		if (isl_dim_size(pwf->dim, isl_dim_set) > 0 ||
-		    isl_dim_is_named_or_nested(pwf->dim, isl_dim_set)) {
-			p = print_dim(pwf->dim, p, 1, 0, 0, NULL);
-			p = isl_printer_print_str(p, " -> ");
-		}
-		p = isl_printer_print_str(p, "0");
-	}
-	p = isl_pwf_print_isl_body(p, pwf);
-	p = isl_printer_print_str(p, " }");
-	return p;
-}
-
-static __isl_give isl_printer *print_affine_c(__isl_take isl_printer *p,
-	__isl_keep isl_dim *dim, __isl_keep isl_basic_set *bset, isl_int *c);
-
-static __isl_give isl_printer *print_name_c(__isl_take isl_printer *p,
-	__isl_keep isl_dim *dim,
-	__isl_keep isl_basic_set *bset, enum isl_dim_type type, unsigned pos)
-{
-	if (type == isl_dim_div) {
-		p = isl_printer_print_str(p, "floord(");
-		p = print_affine_c(p, dim, bset, bset->div[pos] + 1);
-		p = isl_printer_print_str(p, ", ");
-		p = isl_printer_print_isl_int(p, bset->div[pos][0]);
-		p = isl_printer_print_str(p, ")");
-	} else {
-		const char *name;
-
-		name = isl_dim_get_name(dim, type, pos);
-		if (!name)
-			name = "UNNAMED";
-		p = isl_printer_print_str(p, name);
-	}
-	return p;
-}
-
-static __isl_give isl_printer *print_term_c(__isl_take isl_printer *p,
-	__isl_keep isl_dim *dim,
-	__isl_keep isl_basic_set *bset, isl_int c, unsigned pos)
-{
-	enum isl_dim_type type;
-
-	if (pos == 0)
-		return isl_printer_print_isl_int(p, c);
-
-	if (isl_int_is_one(c))
-		;
-	else if (isl_int_is_negone(c))
-		p = isl_printer_print_str(p, "-");
-	else {
-		p = isl_printer_print_isl_int(p, c);
-		p = isl_printer_print_str(p, "*");
-	}
-	type = pos2type(dim, &pos);
-	p = print_name_c(p, dim, bset, type, pos);
-	return p;
-}
-
-static __isl_give isl_printer *print_partial_affine_c(__isl_take isl_printer *p,
-	__isl_keep isl_dim *dim,
-	__isl_keep isl_basic_set *bset, isl_int *c, unsigned len)
-{
-	int i;
-	int first;
-
-	for (i = 0, first = 1; i < len; ++i) {
-		int flip = 0;
-		if (isl_int_is_zero(c[i]))
-			continue;
-		if (!first) {
-			if (isl_int_is_neg(c[i])) {
-				flip = 1;
-				isl_int_neg(c[i], c[i]);
-				p = isl_printer_print_str(p, " - ");
-			} else 
-				p = isl_printer_print_str(p, " + ");
-		}
-		first = 0;
-		p = print_term_c(p, dim, bset, c[i], i);
-		if (flip)
-			isl_int_neg(c[i], c[i]);
-	}
-	if (first)
-		p = isl_printer_print_str(p, "0");
-	return p;
-}
-
-static __isl_give isl_printer *print_affine_c(__isl_take isl_printer *p,
-	__isl_keep isl_dim *dim, __isl_keep isl_basic_set *bset, isl_int *c)
-{
-	unsigned len = 1 + isl_basic_set_total_dim(bset);
-	return print_partial_affine_c(p, dim, bset, c, len);
-}
-
-static __isl_give isl_printer *print_constraint_c(__isl_take isl_printer *p,
-	__isl_keep isl_dim *dim,
-	__isl_keep isl_basic_set *bset, isl_int *c, const char *op, int first)
-{
-	if (!first)
-		p = isl_printer_print_str(p, " && ");
-
-	p = print_affine_c(p, dim, bset, c);
-	p = isl_printer_print_str(p, " ");
-	p = isl_printer_print_str(p, op);
-	p = isl_printer_print_str(p, " 0");
-	return p;
-}
-
-static __isl_give isl_printer *print_basic_set_c(__isl_take isl_printer *p,
-	__isl_keep isl_dim *dim, __isl_keep isl_basic_set *bset)
-{
-	int i, j;
-	unsigned n_div = isl_basic_set_dim(bset, isl_dim_div);
-	unsigned total = isl_basic_set_total_dim(bset) - n_div;
-
-	for (i = 0; i < bset->n_eq; ++i) {
-		j = isl_seq_last_non_zero(bset->eq[i] + 1 + total, n_div);
-		if (j < 0)
-			p = print_constraint_c(p, dim, bset,
-						bset->eq[i], "==", !i);
-		else {
-			if (i)
-				p = isl_printer_print_str(p, " && ");
-			p = isl_printer_print_str(p, "(");
-			p = print_partial_affine_c(p, dim, bset, bset->eq[i],
-						   1 + total + j);
-			p = isl_printer_print_str(p, ") % ");
-			p = isl_printer_print_isl_int(p,
-						bset->eq[i][1 + total + j]);
-			p = isl_printer_print_str(p, " == 0");
-		}
-	}
-	for (i = 0; i < bset->n_ineq; ++i)
-		p = print_constraint_c(p, dim, bset, bset->ineq[i], ">=",
-					!bset->n_eq && !i);
-	return p;
-}
-
-static __isl_give isl_printer *print_set_c(__isl_take isl_printer *p,
-	__isl_keep isl_dim *dim, __isl_keep isl_set *set)
-{
-	int i;
-
-	if (set->n == 0)
-		p = isl_printer_print_str(p, "0");
-
-	for (i = 0; i < set->n; ++i) {
-		if (i)
-			p = isl_printer_print_str(p, " || ");
-		if (set->n > 1)
-			p = isl_printer_print_str(p, "(");
-		p = print_basic_set_c(p, dim, set->p[i]);
-		if (set->n > 1)
-			p = isl_printer_print_str(p, ")");
-	}
-	return p;
-}
-
-static __isl_give isl_printer *print_pw_qpolynomial_c(
-	__isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial *pwqp)
-{
-	int i;
-
-	if (pwqp->n == 1 && isl_set_plain_is_universe(pwqp->p[0].set))
-		return print_qpolynomial_c(p, pwqp->dim, pwqp->p[0].qp);
-
-	for (i = 0; i < pwqp->n; ++i) {
-		p = isl_printer_print_str(p, "(");
-		p = print_set_c(p, pwqp->dim, pwqp->p[i].set);
-		p = isl_printer_print_str(p, ") ? (");
-		p = print_qpolynomial_c(p, pwqp->dim, pwqp->p[i].qp);
-		p = isl_printer_print_str(p, ") : ");
-	}
-
-	p = isl_printer_print_str(p, "0");
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_print_pw_qpolynomial(
-	__isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial *pwqp)
-{
-	if (!p || !pwqp)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return print_pw_qpolynomial_isl(p, pwqp);
-	else if (p->output_format == ISL_FORMAT_C)
-		return print_pw_qpolynomial_c(p, pwqp);
-	isl_assert(p->ctx, 0, goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static int print_pwqp_body(__isl_take isl_pw_qpolynomial *pwqp, void *user)
-{
-	struct isl_union_print_data *data;
-	data = (struct isl_union_print_data *)user;
-
-	if (!data->first)
-		data->p = isl_printer_print_str(data->p, "; ");
-	data->first = 0;
-
-	data->p = isl_pwqp_print_isl_body(data->p, pwqp);
-	isl_pw_qpolynomial_free(pwqp);
-
-	return 0;
-}
-
-static __isl_give isl_printer *print_union_pw_qpolynomial_isl(
-	__isl_take isl_printer *p, __isl_keep isl_union_pw_qpolynomial *upwqp)
-{
-	struct isl_union_print_data data = { p, 1, 1 };
-	isl_dim *dim;
-	dim = isl_union_pw_qpolynomial_get_dim(upwqp);
-	if (isl_dim_size(dim, isl_dim_param) > 0) {
-		p = print_tuple(dim, p, isl_dim_param, 1, 0, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	isl_dim_free(dim);
-	p = isl_printer_print_str(p, "{ ");
-	isl_union_pw_qpolynomial_foreach_pw_qpolynomial(upwqp, &print_pwqp_body,
-							&data);
-	p = data.p;
-	p = isl_printer_print_str(p, " }");
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_print_union_pw_qpolynomial(
-	__isl_take isl_printer *p, __isl_keep isl_union_pw_qpolynomial *upwqp)
-{
-	if (!p || !upwqp)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return print_union_pw_qpolynomial_isl(p, upwqp);
-	isl_die(p->ctx, isl_error_invalid,
-		"invalid output format for isl_union_pw_qpolynomial",
-		goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_qpolynomial_fold_c(
-	__isl_take isl_printer *p, __isl_keep isl_dim *dim,
-	__isl_keep isl_qpolynomial_fold *fold)
-{
-	int i;
-
-	for (i = 0; i < fold->n - 1; ++i)
-		if (fold->type == isl_fold_min)
-			p = isl_printer_print_str(p, "min(");
-		else if (fold->type == isl_fold_max)
-			p = isl_printer_print_str(p, "max(");
-
-	for (i = 0; i < fold->n; ++i) {
-		if (i)
-			p = isl_printer_print_str(p, ", ");
-		p = print_qpolynomial_c(p, dim, fold->qp[i]);
-		if (i)
-			p = isl_printer_print_str(p, ")");
-	}
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_print_qpolynomial_fold(
-	__isl_take isl_printer *p, __isl_keep isl_qpolynomial_fold *fold)
-{
-	if  (!p || !fold)
-		goto error;
-	if (p->output_format == ISL_FORMAT_ISL)
-		return qpolynomial_fold_print(fold, p);
-	else if (p->output_format == ISL_FORMAT_C)
-		return print_qpolynomial_fold_c(p, fold->dim, fold);
-	isl_die(p->ctx, isl_error_unsupported, "unsupported output format",
-		goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_pw_qpolynomial_fold_c(
-	__isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial_fold *pwf)
-{
-	int i;
-
-	if (pwf->n == 1 && isl_set_plain_is_universe(pwf->p[0].set))
-		return print_qpolynomial_fold_c(p, pwf->dim, pwf->p[0].fold);
-
-	for (i = 0; i < pwf->n; ++i) {
-		p = isl_printer_print_str(p, "(");
-		p = print_set_c(p, pwf->dim, pwf->p[i].set);
-		p = isl_printer_print_str(p, ") ? (");
-		p = print_qpolynomial_fold_c(p, pwf->dim, pwf->p[i].fold);
-		p = isl_printer_print_str(p, ") : ");
-	}
-
-	p = isl_printer_print_str(p, "0");
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_print_pw_qpolynomial_fold(
-	__isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial_fold *pwf)
-{
-	if (!p || !pwf)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return print_pw_qpolynomial_fold_isl(p, pwf);
-	else if (p->output_format == ISL_FORMAT_C)
-		return print_pw_qpolynomial_fold_c(p, pwf);
-	isl_assert(p->ctx, 0, goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void isl_pw_qpolynomial_fold_print(__isl_keep isl_pw_qpolynomial_fold *pwf,
-	FILE *out, unsigned output_format)
-{
-	isl_printer *p;
-
-	if (!pwf)
-		return;
-
-	p = isl_printer_to_file(pwf->dim->ctx, out);
-	p = isl_printer_set_output_format(p, output_format);
-	p = isl_printer_print_pw_qpolynomial_fold(p, pwf);
-
-	isl_printer_free(p);
-}
-
-static int print_pwf_body(__isl_take isl_pw_qpolynomial_fold *pwf, void *user)
-{
-	struct isl_union_print_data *data;
-	data = (struct isl_union_print_data *)user;
-
-	if (!data->first)
-		data->p = isl_printer_print_str(data->p, "; ");
-	data->first = 0;
-
-	data->p = isl_pwf_print_isl_body(data->p, pwf);
-	isl_pw_qpolynomial_fold_free(pwf);
-
-	return 0;
-}
-
-static __isl_give isl_printer *print_union_pw_qpolynomial_fold_isl(
-	__isl_take isl_printer *p,
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf)
-{
-	struct isl_union_print_data data = { p, 1, 1 };
-	isl_dim *dim;
-	dim = isl_union_pw_qpolynomial_fold_get_dim(upwf);
-	if (isl_dim_size(dim, isl_dim_param) > 0) {
-		p = print_tuple(dim, p, isl_dim_param, 1, 0, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	isl_dim_free(dim);
-	p = isl_printer_print_str(p, "{ ");
-	isl_union_pw_qpolynomial_fold_foreach_pw_qpolynomial_fold(upwf,
-							&print_pwf_body, &data);
-	p = data.p;
-	p = isl_printer_print_str(p, " }");
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_print_union_pw_qpolynomial_fold(
-	__isl_take isl_printer *p,
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf)
-{
-	if (!p || !upwf)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return print_union_pw_qpolynomial_fold_isl(p, upwf);
-	isl_die(p->ctx, isl_error_invalid,
-		"invalid output format for isl_union_pw_qpolynomial_fold",
-		goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-__isl_give isl_printer *isl_printer_print_constraint(__isl_take isl_printer *p,
-	__isl_keep isl_constraint *c)
-{
-	isl_basic_map *bmap;
-
-	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);
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void isl_constraint_dump(__isl_keep isl_constraint *c)
-{
-	isl_printer *printer;
-
-	if (!c)
-		return;
-
-	printer = isl_printer_to_file(isl_constraint_get_ctx(c), stderr);
-	printer = isl_printer_print_constraint(printer, c);
-	printer = isl_printer_end_line(printer);
-
-	isl_printer_free(printer);
-}
-
-__isl_give isl_printer *isl_printer_print_dim(__isl_take isl_printer *p,
-	__isl_keep isl_dim *dim)
-{
-	if (!dim)
-		goto error;
-
-	if (isl_dim_size(dim, isl_dim_param) > 0) {
-		p = print_tuple(dim, p, isl_dim_param, 0, 0, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-
-	p = isl_printer_print_str(p, "{ ");
-	p = print_tuple(dim, p, isl_dim_in, 0, 0, NULL);
-	p = isl_printer_print_str(p, " -> ");
-	p = print_tuple(dim, p, isl_dim_out, 0, 0, NULL);
-	p = isl_printer_print_str(p, " }");
-
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void isl_dim_dump(__isl_keep isl_dim *dim)
-{
-	isl_printer *printer;
-
-	if (!dim)
-		return;
-
-	printer = isl_printer_to_file(isl_dim_get_ctx(dim), stderr);
-	printer = isl_printer_print_dim(printer, dim);
-	printer = isl_printer_end_line(printer);
-
-	isl_printer_free(printer);
-}
-
-__isl_give isl_printer *isl_printer_print_local_space(__isl_take isl_printer *p,
-	__isl_keep isl_local_space *ls)
-{
-	unsigned total;
-	unsigned n_div;
-
-	if (!ls)
-		goto error;
-
-	total = isl_local_space_dim(ls, isl_dim_all);
-	if (isl_local_space_dim(ls, isl_dim_param) > 0) {
-		p = print_tuple(ls->dim, p, isl_dim_param, 0, 0, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	p = isl_printer_print_str(p, "{ ");
-	p = print_tuple(ls->dim, p, isl_dim_in, 0, 0, NULL);
-	p = isl_printer_print_str(p, " -> ");
-	p = print_tuple(ls->dim, p, isl_dim_out, 0, 0, NULL);
-	n_div = isl_local_space_dim(ls, isl_dim_div);
-	if (n_div > 0) {
-		int i;
-		p = isl_printer_print_str(p, " : ");
-		p = isl_printer_print_str(p, s_open_exists[0]);
-		for (i = 0; i < n_div; ++i) {
-			if (i)
-				p = isl_printer_print_str(p, ", ");
-			p = print_name(ls->dim, p, isl_dim_div, i, 0, 0);
-			if (isl_int_is_zero(ls->div->row[i][0]))
-				continue;
-			p = isl_printer_print_str(p, " = [(");
-			p = print_affine_of_len(ls->dim, ls->div, p,
-					    ls->div->row[i] + 1, 1 + total, 0);
-			p = isl_printer_print_str(p, ")/");
-			p = isl_printer_print_isl_int(p, ls->div->row[i][0]);
-			p = isl_printer_print_str(p, "]");
-		}
-	}
-	p = isl_printer_print_str(p, " }");
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void isl_local_space_dump(__isl_keep isl_local_space *ls)
-{
-	isl_printer *printer;
-
-	if (!ls)
-		return;
-
-	printer = isl_printer_to_file(isl_local_space_get_ctx(ls), stderr);
-	printer = isl_printer_print_local_space(printer, ls);
-	printer = isl_printer_end_line(printer);
-
-	isl_printer_free(printer);
-}
-
-static __isl_give isl_printer *print_aff(__isl_take isl_printer *p,
-	__isl_keep isl_aff *aff)
-{
-	unsigned total;
-
-	total = isl_local_space_dim(aff->ls, isl_dim_all);
-	p = print_tuple(aff->ls->dim, p, isl_dim_set, 1, 0, NULL);
-	p = isl_printer_print_str(p, " -> [");
-	p = isl_printer_print_str(p, "(");
-	p = print_affine_of_len(aff->ls->dim, aff->ls->div, p,
-				aff->v->el + 1, 1 + total, 1);
-	if (isl_int_is_one(aff->v->el[0]))
-		p = isl_printer_print_str(p, ")");
-	else {
-		p = isl_printer_print_str(p, ")/");
-		p = isl_printer_print_isl_int(p, aff->v->el[0]);
-	}
-	p = isl_printer_print_str(p, "]");
-
-	return p;
-}
-
-static __isl_give isl_printer *print_aff_isl(__isl_take isl_printer *p,
-	__isl_keep isl_aff *aff)
-{
-	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, 0, 0, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	p = isl_printer_print_str(p, "{ ");
-	p = print_aff(p, aff);
-	p = isl_printer_print_str(p, " }");
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void isl_aff_dump(__isl_keep isl_aff *aff)
-{
-	isl_printer *printer;
-
-	if (!aff)
-		return;
-
-	printer = isl_printer_to_file(isl_aff_get_ctx(aff), stderr);
-	printer = isl_printer_print_aff(printer, aff);
-	printer = isl_printer_end_line(printer);
-
-	isl_printer_free(printer);
-}
-
-static __isl_give isl_printer *print_pw_aff_isl(__isl_take isl_printer *p,
-	__isl_keep isl_pw_aff *pwaff)
-{
-	int i;
-
-	if (!pwaff)
-		goto error;
-
-	if (isl_dim_size(pwaff->dim, isl_dim_param) > 0) {
-		p = print_tuple(pwaff->dim, p, isl_dim_param, 0, 0, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	p = isl_printer_print_str(p, "{ ");
-	for (i = 0; i < pwaff->n; ++i) {
-		if (i)
-			p = isl_printer_print_str(p, "; ");
-		p = print_aff(p, pwaff->p[i].aff);
-		p = print_disjuncts((isl_map *)pwaff->p[i].set, p, 1, 0);
-	}
-	p = isl_printer_print_str(p, " }");
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_ls_affine_c(__isl_take isl_printer *p,
-	__isl_keep isl_local_space *ls, isl_int *c);
-
-static __isl_give isl_printer *print_ls_name_c(__isl_take isl_printer *p,
-	__isl_keep isl_local_space *ls, enum isl_dim_type type, unsigned pos)
-{
-	if (type == isl_dim_div) {
-		p = isl_printer_print_str(p, "floord(");
-		p = print_ls_affine_c(p, ls, ls->div->row[pos] + 1);
-		p = isl_printer_print_str(p, ", ");
-		p = isl_printer_print_isl_int(p, ls->div->row[pos][0]);
-		p = isl_printer_print_str(p, ")");
-	} else {
-		const char *name;
-
-		name = isl_dim_get_name(ls->dim, type, pos);
-		if (!name)
-			name = "UNNAMED";
-		p = isl_printer_print_str(p, name);
-	}
-	return p;
-}
-
-static __isl_give isl_printer *print_ls_term_c(__isl_take isl_printer *p,
-	__isl_keep isl_local_space *ls, isl_int c, unsigned pos)
-{
-	enum isl_dim_type type;
-
-	if (pos == 0)
-		return isl_printer_print_isl_int(p, c);
-
-	if (isl_int_is_one(c))
-		;
-	else if (isl_int_is_negone(c))
-		p = isl_printer_print_str(p, "-");
-	else {
-		p = isl_printer_print_isl_int(p, c);
-		p = isl_printer_print_str(p, "*");
-	}
-	type = pos2type(ls->dim, &pos);
-	p = print_ls_name_c(p, ls, type, pos);
-	return p;
-}
-
-static __isl_give isl_printer *print_ls_partial_affine_c(
-	__isl_take isl_printer *p, __isl_keep isl_local_space *ls,
-	isl_int *c, unsigned len)
-{
-	int i;
-	int first;
-
-	for (i = 0, first = 1; i < len; ++i) {
-		int flip = 0;
-		if (isl_int_is_zero(c[i]))
-			continue;
-		if (!first) {
-			if (isl_int_is_neg(c[i])) {
-				flip = 1;
-				isl_int_neg(c[i], c[i]);
-				p = isl_printer_print_str(p, " - ");
-			} else 
-				p = isl_printer_print_str(p, " + ");
-		}
-		first = 0;
-		p = print_ls_term_c(p, ls, c[i], i);
-		if (flip)
-			isl_int_neg(c[i], c[i]);
-	}
-	if (first)
-		p = isl_printer_print_str(p, "0");
-	return p;
-}
-
-static __isl_give isl_printer *print_ls_affine_c(__isl_take isl_printer *p,
-	__isl_keep isl_local_space *ls, isl_int *c)
-{
-	unsigned len = 1 + isl_local_space_dim(ls, isl_dim_all);
-	return print_ls_partial_affine_c(p, ls, c, len);
-}
-
-static __isl_give isl_printer *print_aff_c(__isl_take isl_printer *p,
-	__isl_keep isl_aff *aff)
-{
-	unsigned total;
-
-	total = isl_local_space_dim(aff->ls, isl_dim_all);
-	p = isl_printer_print_str(p, "(");
-	p = print_ls_partial_affine_c(p, aff->ls, aff->v->el + 1, 1 + total);
-	if (isl_int_is_one(aff->v->el[0]))
-		p = isl_printer_print_str(p, ")");
-	else {
-		p = isl_printer_print_str(p, ")/");
-		p = isl_printer_print_isl_int(p, aff->v->el[0]);
-	}
-	return p;
-}
-
-static __isl_give isl_printer *print_pw_aff_c(__isl_take isl_printer *p,
-	__isl_keep isl_pw_aff *pwaff)
-{
-	int i;
-
-	if (pwaff->n < 1)
-		isl_die(p->ctx, isl_error_unsupported,
-			"cannot print empty isl_pw_aff in C format", goto error);
-
-	for (i = 0; i < pwaff->n - 1; ++i) {
-		p = isl_printer_print_str(p, "(");
-		p = print_set_c(p, pwaff->dim, pwaff->p[i].set);
-		p = isl_printer_print_str(p, ") ? (");
-		p = print_aff_c(p, pwaff->p[i].aff);
-		p = isl_printer_print_str(p, ") : ");
-	}
-
-	return print_aff_c(p, pwaff->p[pwaff->n - 1].aff);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-__isl_give isl_printer *isl_printer_print_aff(__isl_take isl_printer *p,
-	__isl_keep isl_aff *aff)
-{
-	if (!p || !aff)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return print_aff_isl(p, aff);
-	else if (p->output_format == ISL_FORMAT_C)
-		return print_aff_c(p, aff);
-	isl_die(p->ctx, isl_error_unsupported, "unsupported output format",
-		goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-__isl_give isl_printer *isl_printer_print_pw_aff(__isl_take isl_printer *p,
-	__isl_keep isl_pw_aff *pwaff)
-{
-	if (!p || !pwaff)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return print_pw_aff_isl(p, pwaff);
-	else if (p->output_format == ISL_FORMAT_C)
-		return print_pw_aff_c(p, pwaff);
-	isl_die(p->ctx, isl_error_unsupported, "unsupported output format",
-		goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void isl_pw_aff_dump(__isl_keep isl_pw_aff *pwaff)
-{
-	isl_printer *printer;
-
-	if (!pwaff)
-		return;
-
-	printer = isl_printer_to_file(isl_pw_aff_get_ctx(pwaff), stderr);
-	printer = isl_printer_print_pw_aff(printer, pwaff);
-	printer = isl_printer_end_line(printer);
-
-	isl_printer_free(printer);
-}
diff --git a/cloog-0.16.3/isl/isl_piplib.c b/cloog-0.16.3/isl/isl_piplib.c
deleted file mode 100644
index e33b981..0000000
--- a/cloog-0.16.3/isl/isl_piplib.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include "isl_piplib.h"
-
-void isl_seq_cpy_to_pip(Entier *dst, isl_int *src, unsigned len)
-{
-	int i;
-
-	for (i = 0; i < len; ++i)
-		entier_assign(dst[i], src[i]);
-}
-
-void isl_seq_cpy_from_pip(isl_int *dst, Entier *src, unsigned len)
-{
-	int i;
-
-	for (i = 0; i < len; ++i)
-		entier_assign(dst[i], src[i]);
-}
diff --git a/cloog-0.16.3/isl/isl_piplib.h b/cloog-0.16.3/isl/isl_piplib.h
deleted file mode 100644
index 8408770..0000000
--- a/cloog-0.16.3/isl/isl_piplib.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_PIPLIB_H
-#define ISL_PIPLIB_H
-
-#include <isl/ctx.h>
-#include <isl/int.h>
-#include <isl/map.h>
-#ifndef ISL_PIPLIB
-#error "no piplib"
-#endif
-
-#include <piplib/piplibMP.h>
-
-void isl_seq_cpy_to_pip(Entier *dst, isl_int *src, unsigned len);
-void isl_seq_cpy_from_pip(isl_int *dst, Entier *src, unsigned len);
-
-PipMatrix *isl_basic_map_to_pip(struct isl_basic_map *bmap, unsigned pip_param,
-			 unsigned extra_front, unsigned extra_back);
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_point.c b/cloog-0.16.3/isl/isl_point.c
deleted file mode 100644
index e840162..0000000
--- a/cloog-0.16.3/isl/isl_point.c
+++ /dev/null
@@ -1,488 +0,0 @@
-#include <isl_map_private.h>
-#include <isl_point_private.h>
-#include <isl/set.h>
-#include <isl_sample.h>
-#include <isl_scan.h>
-#include <isl/seq.h>
-#include <isl_dim_private.h>
-
-isl_ctx *isl_point_get_ctx(__isl_keep isl_point *pnt)
-{
-	return pnt ? isl_dim_get_ctx(pnt->dim) : NULL;
-}
-
-__isl_give isl_dim *isl_point_get_dim(__isl_keep isl_point *pnt)
-{
-	return pnt ? isl_dim_copy(pnt->dim) : NULL;
-}
-
-__isl_give isl_point *isl_point_alloc(__isl_take isl_dim *dim,
-	__isl_take isl_vec *vec)
-{
-	struct isl_point *pnt;
-
-	if (!dim || !vec)
-		goto error;
-
-	if (vec->size > 1 + isl_dim_total(dim)) {
-		vec = isl_vec_cow(vec);
-		if (!vec)
-			goto error;
-		vec->size = 1 + isl_dim_total(dim);
-	}
-
-	pnt = isl_alloc_type(dim->ctx, struct isl_point);
-	if (!pnt)
-		goto error;
-
-	pnt->ref = 1;
-	pnt->dim = dim;
-	pnt->vec = vec;
-
-	return pnt;
-error:
-	isl_dim_free(dim);
-	isl_vec_free(vec);
-	return NULL;
-}
-
-__isl_give isl_point *isl_point_zero(__isl_take isl_dim *dim)
-{
-	isl_vec *vec;
-
-	if (!dim)
-		return NULL;
-	vec = isl_vec_alloc(dim->ctx, 1 + isl_dim_total(dim));
-	if (!vec)
-		goto error;
-	isl_int_set_si(vec->el[0], 1);
-	isl_seq_clr(vec->el + 1, vec->size - 1);
-	return isl_point_alloc(dim, vec);
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-__isl_give isl_point *isl_point_dup(__isl_keep isl_point *pnt)
-{
-	struct isl_point *pnt2;
-
-	if (!pnt)
-		return NULL;
-	pnt2 = isl_point_alloc(isl_dim_copy(pnt->dim), isl_vec_copy(pnt->vec));
-	return pnt2;
-}
-
-__isl_give isl_point *isl_point_cow(__isl_take isl_point *pnt)
-{
-	struct isl_point *pnt2;
-	if (!pnt)
-		return NULL;
-
-	if (pnt->ref == 1)
-		return pnt;
-
-	pnt2 = isl_point_dup(pnt);
-	isl_point_free(pnt);
-	return pnt2;
-}
-
-__isl_give isl_point *isl_point_copy(__isl_keep isl_point *pnt)
-{
-	if (!pnt)
-		return NULL;
-
-	pnt->ref++;
-	return pnt;
-}
-
-void isl_point_free(__isl_take isl_point *pnt)
-{
-	if (!pnt)
-		return;
-
-	if (--pnt->ref > 0)
-		return;
-
-	isl_dim_free(pnt->dim);
-	isl_vec_free(pnt->vec);
-	free(pnt);
-}
-
-__isl_give isl_point *isl_point_void(__isl_take isl_dim *dim)
-{
-	if (!dim)
-		return NULL;
-
-	return isl_point_alloc(dim, isl_vec_alloc(dim->ctx, 0));
-}
-
-int isl_point_is_void(__isl_keep isl_point *pnt)
-{
-	if (!pnt)
-		return -1;
-
-	return pnt->vec->size == 0;
-}
-
-void isl_point_get_coordinate(__isl_keep isl_point *pnt,
-	enum isl_dim_type type, int pos, isl_int *v)
-{
-	if (!pnt || isl_point_is_void(pnt))
-		return;
-	if (type == isl_dim_set)
-		pos += isl_dim_size(pnt->dim, isl_dim_param);
-	isl_int_set(*v, pnt->vec->el[1 + pos]);
-}
-
-__isl_give isl_point *isl_point_set_coordinate(__isl_take isl_point *pnt,
-	enum isl_dim_type type, int pos, isl_int v)
-{
-	if (!pnt || isl_point_is_void(pnt))
-		return pnt;
-
-	pnt = isl_point_cow(pnt);
-	if (!pnt)
-		return NULL;
-	pnt->vec = isl_vec_cow(pnt->vec);
-	if (!pnt->vec)
-		goto error;
-
-	if (type == isl_dim_set)
-		pos += isl_dim_size(pnt->dim, isl_dim_param);
-
-	isl_int_set(pnt->vec->el[1 + pos], v);
-
-	return pnt;
-error:
-	isl_point_free(pnt);
-	return NULL;
-}
-
-__isl_give isl_point *isl_point_add_ui(__isl_take isl_point *pnt,
-	enum isl_dim_type type, int pos, unsigned val)
-{
-	if (!pnt || isl_point_is_void(pnt))
-		return pnt;
-
-	pnt = isl_point_cow(pnt);
-	if (!pnt)
-		return NULL;
-	pnt->vec = isl_vec_cow(pnt->vec);
-	if (!pnt->vec)
-		goto error;
-
-	if (type == isl_dim_set)
-		pos += isl_dim_size(pnt->dim, isl_dim_param);
-
-	isl_int_add_ui(pnt->vec->el[1 + pos], pnt->vec->el[1 + pos], val);
-
-	return pnt;
-error:
-	isl_point_free(pnt);
-	return NULL;
-}
-
-__isl_give isl_point *isl_point_sub_ui(__isl_take isl_point *pnt,
-	enum isl_dim_type type, int pos, unsigned val)
-{
-	if (!pnt || isl_point_is_void(pnt))
-		return pnt;
-
-	pnt = isl_point_cow(pnt);
-	if (!pnt)
-		return NULL;
-	pnt->vec = isl_vec_cow(pnt->vec);
-	if (!pnt->vec)
-		goto error;
-
-	if (type == isl_dim_set)
-		pos += isl_dim_size(pnt->dim, isl_dim_param);
-
-	isl_int_sub_ui(pnt->vec->el[1 + pos], pnt->vec->el[1 + pos], val);
-
-	return pnt;
-error:
-	isl_point_free(pnt);
-	return NULL;
-}
-
-struct isl_foreach_point {
-	struct isl_scan_callback callback;
-	int (*fn)(__isl_take isl_point *pnt, void *user);
-	void *user;
-	isl_dim *dim;
-};
-
-static int foreach_point(struct isl_scan_callback *cb, __isl_take isl_vec *sample)
-{
-	struct isl_foreach_point *fp = (struct isl_foreach_point *)cb;
-	isl_point *pnt;
-
-	pnt = isl_point_alloc(isl_dim_copy(fp->dim), sample);
-
-	return fp->fn(pnt, fp->user);
-}
-
-int isl_set_foreach_point(__isl_keep isl_set *set,
-	int (*fn)(__isl_take isl_point *pnt, void *user), void *user)
-{
-	struct isl_foreach_point fp = { { &foreach_point }, fn, user };
-	int i;
-
-	if (!set)
-		return -1;
-
-	fp.dim = isl_set_get_dim(set);
-	if (!fp.dim)
-		return -1;
-
-	set = isl_set_copy(set);
-	set = isl_set_cow(set);
-	set = isl_set_make_disjoint(set);
-	set = isl_set_compute_divs(set);
-	if (!set)
-		goto error;
-
-	for (i = 0; i < set->n; ++i)
-		if (isl_basic_set_scan(isl_basic_set_copy(set->p[i]),
-					&fp.callback) < 0)
-			goto error;
-
-	isl_set_free(set);
-	isl_dim_free(fp.dim);
-
-	return 0;
-error:
-	isl_set_free(set);
-	isl_dim_free(fp.dim);
-	return -1;
-}
-
-/* Return 1 if "bmap" contains the point "point".
- * "bmap" is assumed to have known divs.
- * The point is first extended with the divs and then passed
- * to basic_map_contains.
- */
-int isl_basic_map_contains_point(__isl_keep isl_basic_map *bmap,
-	__isl_keep isl_point *point)
-{
-	int i;
-	struct isl_vec *vec;
-	unsigned dim;
-	int contains;
-
-	if (!bmap || !point)
-		return -1;
-	isl_assert(bmap->ctx, isl_dim_equal(bmap->dim, point->dim), return -1);
-	if (bmap->n_div == 0)
-		return isl_basic_map_contains(bmap, point->vec);
-
-	dim = isl_basic_map_total_dim(bmap) - bmap->n_div;
-	vec = isl_vec_alloc(bmap->ctx, 1 + dim + bmap->n_div);
-	if (!vec)
-		return -1;
-
-	isl_seq_cpy(vec->el, point->vec->el, point->vec->size);
-	for (i = 0; i < bmap->n_div; ++i) {
-		isl_seq_inner_product(bmap->div[i] + 1, vec->el,
-					1 + dim + i, &vec->el[1+dim+i]);
-		isl_int_fdiv_q(vec->el[1+dim+i], vec->el[1+dim+i],
-				bmap->div[i][0]);
-	}
-
-	contains = isl_basic_map_contains(bmap, vec);
-
-	isl_vec_free(vec);
-	return contains;
-}
-
-int isl_map_contains_point(__isl_keep isl_map *map, __isl_keep isl_point *point)
-{
-	int i;
-	int found = 0;
-
-	if (!map || !point)
-		return -1;
-
-	map = isl_map_copy(map);
-	map = isl_map_compute_divs(map);
-	if (!map)
-		return -1;
-
-	for (i = 0; i < map->n; ++i) {
-		found = isl_basic_map_contains_point(map->p[i], point);
-		if (found < 0)
-			goto error;
-		if (found)
-			break;
-	}
-	isl_map_free(map);
-
-	return found;
-error:
-	isl_map_free(map);
-	return -1;
-}
-
-int isl_set_contains_point(__isl_keep isl_set *set, __isl_keep isl_point *point)
-{
-	return isl_map_contains_point((isl_map *)set, point);
-}
-
-__isl_give isl_basic_set *isl_basic_set_from_point(__isl_take isl_point *pnt)
-{
-	isl_basic_set *bset;
-	isl_basic_set *model;
-
-	model = isl_basic_set_empty(isl_dim_copy(pnt->dim));
-	bset = isl_basic_set_from_vec(isl_vec_copy(pnt->vec));
-	bset = isl_basic_set_from_underlying_set(bset, model);
-	isl_point_free(pnt);
-
-	return bset;
-}
-
-__isl_give isl_set *isl_set_from_point(__isl_take isl_point *pnt)
-{
-	isl_basic_set *bset;
-	bset = isl_basic_set_from_point(pnt);
-	return isl_set_from_basic_set(bset);
-}
-
-__isl_give isl_basic_set *isl_basic_set_box_from_points(
-	__isl_take isl_point *pnt1, __isl_take isl_point *pnt2)
-{
-	isl_basic_set *bset;
-	unsigned total;
-	int i;
-	int k;
-	isl_int t;
-
-	isl_int_init(t);
-
-	if (!pnt1 || !pnt2)
-		goto error;
-
-	isl_assert(pnt1->dim->ctx,
-			isl_dim_equal(pnt1->dim, pnt2->dim), goto error);
-
-	if (isl_point_is_void(pnt1) && isl_point_is_void(pnt2)) {
-		isl_dim *dim = isl_dim_copy(pnt1->dim);
-		isl_point_free(pnt1);
-		isl_point_free(pnt2);
-		isl_int_clear(t);
-		return isl_basic_set_empty(dim);
-	}
-	if (isl_point_is_void(pnt1)) {
-		isl_point_free(pnt1);
-		isl_int_clear(t);
-		return isl_basic_set_from_point(pnt2);
-	}
-	if (isl_point_is_void(pnt2)) {
-		isl_point_free(pnt2);
-		isl_int_clear(t);
-		return isl_basic_set_from_point(pnt1);
-	}
-
-	total = isl_dim_total(pnt1->dim);
-	bset = isl_basic_set_alloc_dim(isl_dim_copy(pnt1->dim), 0, 0, 2 * total);
-
-	for (i = 0; i < total; ++i) {
-		isl_int_mul(t, pnt1->vec->el[1 + i], pnt2->vec->el[0]);
-		isl_int_submul(t, pnt2->vec->el[1 + i], pnt1->vec->el[0]);
-
-		k = isl_basic_set_alloc_inequality(bset);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(bset->ineq[k] + 1, total);
-		if (isl_int_is_pos(t)) {
-			isl_int_set_si(bset->ineq[k][1 + i], -1);
-			isl_int_set(bset->ineq[k][0], pnt1->vec->el[1 + i]);
-		} else {
-			isl_int_set_si(bset->ineq[k][1 + i], 1);
-			isl_int_neg(bset->ineq[k][0], pnt1->vec->el[1 + i]);
-		}
-		isl_int_fdiv_q(bset->ineq[k][0], bset->ineq[k][0], pnt1->vec->el[0]);
-
-		k = isl_basic_set_alloc_inequality(bset);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(bset->ineq[k] + 1, total);
-		if (isl_int_is_pos(t)) {
-			isl_int_set_si(bset->ineq[k][1 + i], 1);
-			isl_int_neg(bset->ineq[k][0], pnt2->vec->el[1 + i]);
-		} else {
-			isl_int_set_si(bset->ineq[k][1 + i], -1);
-			isl_int_set(bset->ineq[k][0], pnt2->vec->el[1 + i]);
-		}
-		isl_int_fdiv_q(bset->ineq[k][0], bset->ineq[k][0], pnt2->vec->el[0]);
-	}
-
-	bset = isl_basic_set_finalize(bset);
-
-	isl_point_free(pnt1);
-	isl_point_free(pnt2);
-
-	isl_int_clear(t);
-
-	return bset;
-error:
-	isl_point_free(pnt1);
-	isl_point_free(pnt2);
-	isl_int_clear(t);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_box_from_points(__isl_take isl_point *pnt1,
-	__isl_take isl_point *pnt2)
-{
-	isl_basic_set *bset;
-	bset = isl_basic_set_box_from_points(pnt1, pnt2);
-	return isl_set_from_basic_set(bset);
-}
-
-void isl_point_print(__isl_keep isl_point *pnt, FILE *out)
-{
-	int i;
-	unsigned nparam;
-	unsigned dim;
-
-	if (!pnt)
-		return;
-	if (isl_point_is_void(pnt)) {
-		fprintf(out, "void\n");
-		return;
-	}
-
-	nparam = isl_dim_size(pnt->dim, isl_dim_param);
-	dim = isl_dim_size(pnt->dim, isl_dim_set);
-	if (nparam > 0) {
-		fprintf(out, "[");
-		for (i = 0; i < nparam; ++i) {
-			const char *name;
-			if (i)
-				fprintf(out, ", ");
-			name = isl_dim_get_name(pnt->dim, isl_dim_param, i);
-			if (name)
-				fprintf(out, "%s = ", name);
-			isl_int_print(out, pnt->vec->el[1 + i], 0);
-			if (!isl_int_is_one(pnt->vec->el[0])) {
-				fprintf(out, "/");
-				isl_int_print(out, pnt->vec->el[0], 0);
-			}
-		}
-		fprintf(out, "] -> ");
-	}
-	fprintf(out, "[");
-	for (i = 0; i < dim; ++i) {
-		if (i)
-			fprintf(out, ", ");
-		isl_int_print(out, pnt->vec->el[1 + nparam + i], 0);
-		if (!isl_int_is_one(pnt->vec->el[0])) {
-			fprintf(out, "/");
-			isl_int_print(out, pnt->vec->el[0], 0);
-		}
-	}
-	fprintf(out, "]\n");
-}
diff --git a/cloog-0.16.3/isl/isl_point_private.h b/cloog-0.16.3/isl/isl_point_private.h
deleted file mode 100644
index 327f55f..0000000
--- a/cloog-0.16.3/isl/isl_point_private.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <isl/dim.h>
-#include <isl/point.h>
-#include <isl/vec.h>
-
-struct isl_point {
-	int		ref;
-	struct isl_dim	*dim;
-	struct isl_vec	*vec;
-};
-
-__isl_give isl_point *isl_point_alloc(__isl_take isl_dim *dim,
-	__isl_take isl_vec *vec);
diff --git a/cloog-0.16.3/isl/isl_polynomial.c b/cloog-0.16.3/isl/isl_polynomial.c
deleted file mode 100644
index 524aa6f..0000000
--- a/cloog-0.16.3/isl/isl_polynomial.c
+++ /dev/null
@@ -1,4624 +0,0 @@
-/*
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France 
- */
-
-#include <stdlib.h>
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl_factorization.h>
-#include <isl/lp.h>
-#include <isl/seq.h>
-#include <isl_union_map_private.h>
-#include <isl_constraint_private.h>
-#include <isl_polynomial_private.h>
-#include <isl_point_private.h>
-#include <isl_dim_private.h>
-#include <isl_div_private.h>
-#include <isl_mat_private.h>
-#include <isl_range.h>
-#include <isl_local_space_private.h>
-#include <isl_aff_private.h>
-#include <isl_config.h>
-
-static unsigned pos(__isl_keep isl_dim *dim, enum isl_dim_type type)
-{
-	switch (type) {
-	case isl_dim_param:	return 0;
-	case isl_dim_in:	return dim->nparam;
-	case isl_dim_out:	return dim->nparam + dim->n_in;
-	default:		return 0;
-	}
-}
-
-int isl_upoly_is_cst(__isl_keep struct isl_upoly *up)
-{
-	if (!up)
-		return -1;
-
-	return up->var < 0;
-}
-
-__isl_keep struct isl_upoly_cst *isl_upoly_as_cst(__isl_keep struct isl_upoly *up)
-{
-	if (!up)
-		return NULL;
-
-	isl_assert(up->ctx, up->var < 0, return NULL);
-
-	return (struct isl_upoly_cst *)up;
-}
-
-__isl_keep struct isl_upoly_rec *isl_upoly_as_rec(__isl_keep struct isl_upoly *up)
-{
-	if (!up)
-		return NULL;
-
-	isl_assert(up->ctx, up->var >= 0, return NULL);
-
-	return (struct isl_upoly_rec *)up;
-}
-
-int isl_upoly_is_equal(__isl_keep struct isl_upoly *up1,
-	__isl_keep struct isl_upoly *up2)
-{
-	int i;
-	struct isl_upoly_rec *rec1, *rec2;
-
-	if (!up1 || !up2)
-		return -1;
-	if (up1 == up2)
-		return 1;
-	if (up1->var != up2->var)
-		return 0;
-	if (isl_upoly_is_cst(up1)) {
-		struct isl_upoly_cst *cst1, *cst2;
-		cst1 = isl_upoly_as_cst(up1);
-		cst2 = isl_upoly_as_cst(up2);
-		if (!cst1 || !cst2)
-			return -1;
-		return isl_int_eq(cst1->n, cst2->n) &&
-		       isl_int_eq(cst1->d, cst2->d);
-	}
-
-	rec1 = isl_upoly_as_rec(up1);
-	rec2 = isl_upoly_as_rec(up2);
-	if (!rec1 || !rec2)
-		return -1;
-
-	if (rec1->n != rec2->n)
-		return 0;
-
-	for (i = 0; i < rec1->n; ++i) {
-		int eq = isl_upoly_is_equal(rec1->p[i], rec2->p[i]);
-		if (eq < 0 || !eq)
-			return eq;
-	}
-
-	return 1;
-}
-
-int isl_upoly_is_zero(__isl_keep struct isl_upoly *up)
-{
-	struct isl_upoly_cst *cst;
-
-	if (!up)
-		return -1;
-	if (!isl_upoly_is_cst(up))
-		return 0;
-
-	cst = isl_upoly_as_cst(up);
-	if (!cst)
-		return -1;
-
-	return isl_int_is_zero(cst->n) && isl_int_is_pos(cst->d);
-}
-
-int isl_upoly_sgn(__isl_keep struct isl_upoly *up)
-{
-	struct isl_upoly_cst *cst;
-
-	if (!up)
-		return 0;
-	if (!isl_upoly_is_cst(up))
-		return 0;
-
-	cst = isl_upoly_as_cst(up);
-	if (!cst)
-		return 0;
-
-	return isl_int_sgn(cst->n);
-}
-
-int isl_upoly_is_nan(__isl_keep struct isl_upoly *up)
-{
-	struct isl_upoly_cst *cst;
-
-	if (!up)
-		return -1;
-	if (!isl_upoly_is_cst(up))
-		return 0;
-
-	cst = isl_upoly_as_cst(up);
-	if (!cst)
-		return -1;
-
-	return isl_int_is_zero(cst->n) && isl_int_is_zero(cst->d);
-}
-
-int isl_upoly_is_infty(__isl_keep struct isl_upoly *up)
-{
-	struct isl_upoly_cst *cst;
-
-	if (!up)
-		return -1;
-	if (!isl_upoly_is_cst(up))
-		return 0;
-
-	cst = isl_upoly_as_cst(up);
-	if (!cst)
-		return -1;
-
-	return isl_int_is_pos(cst->n) && isl_int_is_zero(cst->d);
-}
-
-int isl_upoly_is_neginfty(__isl_keep struct isl_upoly *up)
-{
-	struct isl_upoly_cst *cst;
-
-	if (!up)
-		return -1;
-	if (!isl_upoly_is_cst(up))
-		return 0;
-
-	cst = isl_upoly_as_cst(up);
-	if (!cst)
-		return -1;
-
-	return isl_int_is_neg(cst->n) && isl_int_is_zero(cst->d);
-}
-
-int isl_upoly_is_one(__isl_keep struct isl_upoly *up)
-{
-	struct isl_upoly_cst *cst;
-
-	if (!up)
-		return -1;
-	if (!isl_upoly_is_cst(up))
-		return 0;
-
-	cst = isl_upoly_as_cst(up);
-	if (!cst)
-		return -1;
-
-	return isl_int_eq(cst->n, cst->d) && isl_int_is_pos(cst->d);
-}
-
-int isl_upoly_is_negone(__isl_keep struct isl_upoly *up)
-{
-	struct isl_upoly_cst *cst;
-
-	if (!up)
-		return -1;
-	if (!isl_upoly_is_cst(up))
-		return 0;
-
-	cst = isl_upoly_as_cst(up);
-	if (!cst)
-		return -1;
-
-	return isl_int_is_negone(cst->n) && isl_int_is_one(cst->d);
-}
-
-__isl_give struct isl_upoly_cst *isl_upoly_cst_alloc(struct isl_ctx *ctx)
-{
-	struct isl_upoly_cst *cst;
-
-	cst = isl_alloc_type(ctx, struct isl_upoly_cst);
-	if (!cst)
-		return NULL;
-
-	cst->up.ref = 1;
-	cst->up.ctx = ctx;
-	isl_ctx_ref(ctx);
-	cst->up.var = -1;
-
-	isl_int_init(cst->n);
-	isl_int_init(cst->d);
-
-	return cst;
-}
-
-__isl_give struct isl_upoly *isl_upoly_zero(struct isl_ctx *ctx)
-{
-	struct isl_upoly_cst *cst;
-
-	cst = isl_upoly_cst_alloc(ctx);
-	if (!cst)
-		return NULL;
-
-	isl_int_set_si(cst->n, 0);
-	isl_int_set_si(cst->d, 1);
-
-	return &cst->up;
-}
-
-__isl_give struct isl_upoly *isl_upoly_one(struct isl_ctx *ctx)
-{
-	struct isl_upoly_cst *cst;
-
-	cst = isl_upoly_cst_alloc(ctx);
-	if (!cst)
-		return NULL;
-
-	isl_int_set_si(cst->n, 1);
-	isl_int_set_si(cst->d, 1);
-
-	return &cst->up;
-}
-
-__isl_give struct isl_upoly *isl_upoly_infty(struct isl_ctx *ctx)
-{
-	struct isl_upoly_cst *cst;
-
-	cst = isl_upoly_cst_alloc(ctx);
-	if (!cst)
-		return NULL;
-
-	isl_int_set_si(cst->n, 1);
-	isl_int_set_si(cst->d, 0);
-
-	return &cst->up;
-}
-
-__isl_give struct isl_upoly *isl_upoly_neginfty(struct isl_ctx *ctx)
-{
-	struct isl_upoly_cst *cst;
-
-	cst = isl_upoly_cst_alloc(ctx);
-	if (!cst)
-		return NULL;
-
-	isl_int_set_si(cst->n, -1);
-	isl_int_set_si(cst->d, 0);
-
-	return &cst->up;
-}
-
-__isl_give struct isl_upoly *isl_upoly_nan(struct isl_ctx *ctx)
-{
-	struct isl_upoly_cst *cst;
-
-	cst = isl_upoly_cst_alloc(ctx);
-	if (!cst)
-		return NULL;
-
-	isl_int_set_si(cst->n, 0);
-	isl_int_set_si(cst->d, 0);
-
-	return &cst->up;
-}
-
-__isl_give struct isl_upoly *isl_upoly_rat_cst(struct isl_ctx *ctx,
-	isl_int n, isl_int d)
-{
-	struct isl_upoly_cst *cst;
-
-	cst = isl_upoly_cst_alloc(ctx);
-	if (!cst)
-		return NULL;
-
-	isl_int_set(cst->n, n);
-	isl_int_set(cst->d, d);
-
-	return &cst->up;
-}
-
-__isl_give struct isl_upoly_rec *isl_upoly_alloc_rec(struct isl_ctx *ctx,
-	int var, int size)
-{
-	struct isl_upoly_rec *rec;
-
-	isl_assert(ctx, var >= 0, return NULL);
-	isl_assert(ctx, size >= 0, return NULL);
-	rec = isl_calloc(ctx, struct isl_upoly_rec,
-			sizeof(struct isl_upoly_rec) +
-			size * sizeof(struct isl_upoly *));
-	if (!rec)
-		return NULL;
-
-	rec->up.ref = 1;
-	rec->up.ctx = ctx;
-	isl_ctx_ref(ctx);
-	rec->up.var = var;
-
-	rec->n = 0;
-	rec->size = size;
-
-	return rec;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_reset_dim(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_dim *dim)
-{
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp || !dim)
-		goto error;
-
-	isl_dim_free(qp->dim);
-	qp->dim = dim;
-
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	isl_dim_free(dim);
-	return NULL;
-}
-
-isl_ctx *isl_qpolynomial_get_ctx(__isl_keep isl_qpolynomial *qp)
-{
-	return qp ? qp->dim->ctx : NULL;
-}
-
-__isl_give isl_dim *isl_qpolynomial_get_dim(__isl_keep isl_qpolynomial *qp)
-{
-	return qp ? isl_dim_copy(qp->dim) : NULL;
-}
-
-unsigned isl_qpolynomial_dim(__isl_keep isl_qpolynomial *qp,
-	enum isl_dim_type type)
-{
-	return qp ? isl_dim_size(qp->dim, type) : 0;
-}
-
-int isl_qpolynomial_is_zero(__isl_keep isl_qpolynomial *qp)
-{
-	return qp ? isl_upoly_is_zero(qp->upoly) : -1;
-}
-
-int isl_qpolynomial_is_one(__isl_keep isl_qpolynomial *qp)
-{
-	return qp ? isl_upoly_is_one(qp->upoly) : -1;
-}
-
-int isl_qpolynomial_is_nan(__isl_keep isl_qpolynomial *qp)
-{
-	return qp ? isl_upoly_is_nan(qp->upoly) : -1;
-}
-
-int isl_qpolynomial_is_infty(__isl_keep isl_qpolynomial *qp)
-{
-	return qp ? isl_upoly_is_infty(qp->upoly) : -1;
-}
-
-int isl_qpolynomial_is_neginfty(__isl_keep isl_qpolynomial *qp)
-{
-	return qp ? isl_upoly_is_neginfty(qp->upoly) : -1;
-}
-
-int isl_qpolynomial_sgn(__isl_keep isl_qpolynomial *qp)
-{
-	return qp ? isl_upoly_sgn(qp->upoly) : 0;
-}
-
-static void upoly_free_cst(__isl_take struct isl_upoly_cst *cst)
-{
-	isl_int_clear(cst->n);
-	isl_int_clear(cst->d);
-}
-
-static void upoly_free_rec(__isl_take struct isl_upoly_rec *rec)
-{
-	int i;
-
-	for (i = 0; i < rec->n; ++i)
-		isl_upoly_free(rec->p[i]);
-}
-
-__isl_give struct isl_upoly *isl_upoly_copy(__isl_keep struct isl_upoly *up)
-{
-	if (!up)
-		return NULL;
-
-	up->ref++;
-	return up;
-}
-
-__isl_give struct isl_upoly *isl_upoly_dup_cst(__isl_keep struct isl_upoly *up)
-{
-	struct isl_upoly_cst *cst;
-	struct isl_upoly_cst *dup;
-
-	cst = isl_upoly_as_cst(up);
-	if (!cst)
-		return NULL;
-
-	dup = isl_upoly_as_cst(isl_upoly_zero(up->ctx));
-	if (!dup)
-		return NULL;
-	isl_int_set(dup->n, cst->n);
-	isl_int_set(dup->d, cst->d);
-
-	return &dup->up;
-}
-
-__isl_give struct isl_upoly *isl_upoly_dup_rec(__isl_keep struct isl_upoly *up)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-	struct isl_upoly_rec *dup;
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		return NULL;
-
-	dup = isl_upoly_alloc_rec(up->ctx, up->var, rec->n);
-	if (!dup)
-		return NULL;
-
-	for (i = 0; i < rec->n; ++i) {
-		dup->p[i] = isl_upoly_copy(rec->p[i]);
-		if (!dup->p[i])
-			goto error;
-		dup->n++;
-	}
-
-	return &dup->up;
-error:
-	isl_upoly_free(&dup->up);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_dup(__isl_keep struct isl_upoly *up)
-{
-	if (!up)
-		return NULL;
-
-	if (isl_upoly_is_cst(up))
-		return isl_upoly_dup_cst(up);
-	else
-		return isl_upoly_dup_rec(up);
-}
-
-__isl_give struct isl_upoly *isl_upoly_cow(__isl_take struct isl_upoly *up)
-{
-	if (!up)
-		return NULL;
-
-	if (up->ref == 1)
-		return up;
-	up->ref--;
-	return isl_upoly_dup(up);
-}
-
-void isl_upoly_free(__isl_take struct isl_upoly *up)
-{
-	if (!up)
-		return;
-
-	if (--up->ref > 0)
-		return;
-
-	if (up->var < 0)
-		upoly_free_cst((struct isl_upoly_cst *)up);
-	else
-		upoly_free_rec((struct isl_upoly_rec *)up);
-
-	isl_ctx_deref(up->ctx);
-	free(up);
-}
-
-static void isl_upoly_cst_reduce(__isl_keep struct isl_upoly_cst *cst)
-{
-	isl_int gcd;
-
-	isl_int_init(gcd);
-	isl_int_gcd(gcd, cst->n, cst->d);
-	if (!isl_int_is_zero(gcd) && !isl_int_is_one(gcd)) {
-		isl_int_divexact(cst->n, cst->n, gcd);
-		isl_int_divexact(cst->d, cst->d, gcd);
-	}
-	isl_int_clear(gcd);
-}
-
-__isl_give struct isl_upoly *isl_upoly_sum_cst(__isl_take struct isl_upoly *up1,
-	__isl_take struct isl_upoly *up2)
-{
-	struct isl_upoly_cst *cst1;
-	struct isl_upoly_cst *cst2;
-
-	up1 = isl_upoly_cow(up1);
-	if (!up1 || !up2)
-		goto error;
-
-	cst1 = isl_upoly_as_cst(up1);
-	cst2 = isl_upoly_as_cst(up2);
-
-	if (isl_int_eq(cst1->d, cst2->d))
-		isl_int_add(cst1->n, cst1->n, cst2->n);
-	else {
-		isl_int_mul(cst1->n, cst1->n, cst2->d);
-		isl_int_addmul(cst1->n, cst2->n, cst1->d);
-		isl_int_mul(cst1->d, cst1->d, cst2->d);
-	}
-
-	isl_upoly_cst_reduce(cst1);
-
-	isl_upoly_free(up2);
-	return up1;
-error:
-	isl_upoly_free(up1);
-	isl_upoly_free(up2);
-	return NULL;
-}
-
-static __isl_give struct isl_upoly *replace_by_zero(
-	__isl_take struct isl_upoly *up)
-{
-	struct isl_ctx *ctx;
-
-	if (!up)
-		return NULL;
-	ctx = up->ctx;
-	isl_upoly_free(up);
-	return isl_upoly_zero(ctx);
-}
-
-static __isl_give struct isl_upoly *replace_by_constant_term(
-	__isl_take struct isl_upoly *up)
-{
-	struct isl_upoly_rec *rec;
-	struct isl_upoly *cst;
-
-	if (!up)
-		return NULL;
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-	cst = isl_upoly_copy(rec->p[0]);
-	isl_upoly_free(up);
-	return cst;
-error:
-	isl_upoly_free(up);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_sum(__isl_take struct isl_upoly *up1,
-	__isl_take struct isl_upoly *up2)
-{
-	int i;
-	struct isl_upoly_rec *rec1, *rec2;
-
-	if (!up1 || !up2)
-		goto error;
-
-	if (isl_upoly_is_nan(up1)) {
-		isl_upoly_free(up2);
-		return up1;
-	}
-
-	if (isl_upoly_is_nan(up2)) {
-		isl_upoly_free(up1);
-		return up2;
-	}
-
-	if (isl_upoly_is_zero(up1)) {
-		isl_upoly_free(up1);
-		return up2;
-	}
-
-	if (isl_upoly_is_zero(up2)) {
-		isl_upoly_free(up2);
-		return up1;
-	}
-
-	if (up1->var < up2->var)
-		return isl_upoly_sum(up2, up1);
-
-	if (up2->var < up1->var) {
-		struct isl_upoly_rec *rec;
-		if (isl_upoly_is_infty(up2) || isl_upoly_is_neginfty(up2)) {
-			isl_upoly_free(up1);
-			return up2;
-		}
-		up1 = isl_upoly_cow(up1);
-		rec = isl_upoly_as_rec(up1);
-		if (!rec)
-			goto error;
-		rec->p[0] = isl_upoly_sum(rec->p[0], up2);
-		if (rec->n == 1)
-			up1 = replace_by_constant_term(up1);
-		return up1;
-	}
-
-	if (isl_upoly_is_cst(up1))
-		return isl_upoly_sum_cst(up1, up2);
-
-	rec1 = isl_upoly_as_rec(up1);
-	rec2 = isl_upoly_as_rec(up2);
-	if (!rec1 || !rec2)
-		goto error;
-
-	if (rec1->n < rec2->n)
-		return isl_upoly_sum(up2, up1);
-
-	up1 = isl_upoly_cow(up1);
-	rec1 = isl_upoly_as_rec(up1);
-	if (!rec1)
-		goto error;
-
-	for (i = rec2->n - 1; i >= 0; --i) {
-		rec1->p[i] = isl_upoly_sum(rec1->p[i],
-					    isl_upoly_copy(rec2->p[i]));
-		if (!rec1->p[i])
-			goto error;
-		if (i == rec1->n - 1 && isl_upoly_is_zero(rec1->p[i])) {
-			isl_upoly_free(rec1->p[i]);
-			rec1->n--;
-		}
-	}
-
-	if (rec1->n == 0)
-		up1 = replace_by_zero(up1);
-	else if (rec1->n == 1)
-		up1 = replace_by_constant_term(up1);
-
-	isl_upoly_free(up2);
-
-	return up1;
-error:
-	isl_upoly_free(up1);
-	isl_upoly_free(up2);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_cst_add_isl_int(
-	__isl_take struct isl_upoly *up, isl_int v)
-{
-	struct isl_upoly_cst *cst;
-
-	up = isl_upoly_cow(up);
-	if (!up)
-		return NULL;
-
-	cst = isl_upoly_as_cst(up);
-
-	isl_int_addmul(cst->n, cst->d, v);
-
-	return up;
-}
-
-__isl_give struct isl_upoly *isl_upoly_add_isl_int(
-	__isl_take struct isl_upoly *up, isl_int v)
-{
-	struct isl_upoly_rec *rec;
-
-	if (!up)
-		return NULL;
-
-	if (isl_upoly_is_cst(up))
-		return isl_upoly_cst_add_isl_int(up, v);
-
-	up = isl_upoly_cow(up);
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-
-	rec->p[0] = isl_upoly_add_isl_int(rec->p[0], v);
-	if (!rec->p[0])
-		goto error;
-
-	return up;
-error:
-	isl_upoly_free(up);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_cst_mul_isl_int(
-	__isl_take struct isl_upoly *up, isl_int v)
-{
-	struct isl_upoly_cst *cst;
-
-	if (isl_upoly_is_zero(up))
-		return up;
-
-	up = isl_upoly_cow(up);
-	if (!up)
-		return NULL;
-
-	cst = isl_upoly_as_cst(up);
-
-	isl_int_mul(cst->n, cst->n, v);
-
-	return up;
-}
-
-__isl_give struct isl_upoly *isl_upoly_mul_isl_int(
-	__isl_take struct isl_upoly *up, isl_int v)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-
-	if (!up)
-		return NULL;
-
-	if (isl_upoly_is_cst(up))
-		return isl_upoly_cst_mul_isl_int(up, v);
-
-	up = isl_upoly_cow(up);
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-
-	for (i = 0; i < rec->n; ++i) {
-		rec->p[i] = isl_upoly_mul_isl_int(rec->p[i], v);
-		if (!rec->p[i])
-			goto error;
-	}
-
-	return up;
-error:
-	isl_upoly_free(up);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_mul_cst(__isl_take struct isl_upoly *up1,
-	__isl_take struct isl_upoly *up2)
-{
-	struct isl_upoly_cst *cst1;
-	struct isl_upoly_cst *cst2;
-
-	up1 = isl_upoly_cow(up1);
-	if (!up1 || !up2)
-		goto error;
-
-	cst1 = isl_upoly_as_cst(up1);
-	cst2 = isl_upoly_as_cst(up2);
-
-	isl_int_mul(cst1->n, cst1->n, cst2->n);
-	isl_int_mul(cst1->d, cst1->d, cst2->d);
-
-	isl_upoly_cst_reduce(cst1);
-
-	isl_upoly_free(up2);
-	return up1;
-error:
-	isl_upoly_free(up1);
-	isl_upoly_free(up2);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_mul_rec(__isl_take struct isl_upoly *up1,
-	__isl_take struct isl_upoly *up2)
-{
-	struct isl_upoly_rec *rec1;
-	struct isl_upoly_rec *rec2;
-	struct isl_upoly_rec *res = NULL;
-	int i, j;
-	int size;
-
-	rec1 = isl_upoly_as_rec(up1);
-	rec2 = isl_upoly_as_rec(up2);
-	if (!rec1 || !rec2)
-		goto error;
-	size = rec1->n + rec2->n - 1;
-	res = isl_upoly_alloc_rec(up1->ctx, up1->var, size);
-	if (!res)
-		goto error;
-
-	for (i = 0; i < rec1->n; ++i) {
-		res->p[i] = isl_upoly_mul(isl_upoly_copy(rec2->p[0]),
-					    isl_upoly_copy(rec1->p[i]));
-		if (!res->p[i])
-			goto error;
-		res->n++;
-	}
-	for (; i < size; ++i) {
-		res->p[i] = isl_upoly_zero(up1->ctx);
-		if (!res->p[i])
-			goto error;
-		res->n++;
-	}
-	for (i = 0; i < rec1->n; ++i) {
-		for (j = 1; j < rec2->n; ++j) {
-			struct isl_upoly *up;
-			up = isl_upoly_mul(isl_upoly_copy(rec2->p[j]),
-					    isl_upoly_copy(rec1->p[i]));
-			res->p[i + j] = isl_upoly_sum(res->p[i + j], up);
-			if (!res->p[i + j])
-				goto error;
-		}
-	}
-
-	isl_upoly_free(up1);
-	isl_upoly_free(up2);
-
-	return &res->up;
-error:
-	isl_upoly_free(up1);
-	isl_upoly_free(up2);
-	isl_upoly_free(&res->up);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_mul(__isl_take struct isl_upoly *up1,
-	__isl_take struct isl_upoly *up2)
-{
-	if (!up1 || !up2)
-		goto error;
-
-	if (isl_upoly_is_nan(up1)) {
-		isl_upoly_free(up2);
-		return up1;
-	}
-
-	if (isl_upoly_is_nan(up2)) {
-		isl_upoly_free(up1);
-		return up2;
-	}
-
-	if (isl_upoly_is_zero(up1)) {
-		isl_upoly_free(up2);
-		return up1;
-	}
-
-	if (isl_upoly_is_zero(up2)) {
-		isl_upoly_free(up1);
-		return up2;
-	}
-
-	if (isl_upoly_is_one(up1)) {
-		isl_upoly_free(up1);
-		return up2;
-	}
-
-	if (isl_upoly_is_one(up2)) {
-		isl_upoly_free(up2);
-		return up1;
-	}
-
-	if (up1->var < up2->var)
-		return isl_upoly_mul(up2, up1);
-
-	if (up2->var < up1->var) {
-		int i;
-		struct isl_upoly_rec *rec;
-		if (isl_upoly_is_infty(up2) || isl_upoly_is_neginfty(up2)) {
-			isl_ctx *ctx = up1->ctx;
-			isl_upoly_free(up1);
-			isl_upoly_free(up2);
-			return isl_upoly_nan(ctx);
-		}
-		up1 = isl_upoly_cow(up1);
-		rec = isl_upoly_as_rec(up1);
-		if (!rec)
-			goto error;
-
-		for (i = 0; i < rec->n; ++i) {
-			rec->p[i] = isl_upoly_mul(rec->p[i],
-						    isl_upoly_copy(up2));
-			if (!rec->p[i])
-				goto error;
-		}
-		isl_upoly_free(up2);
-		return up1;
-	}
-
-	if (isl_upoly_is_cst(up1))
-		return isl_upoly_mul_cst(up1, up2);
-
-	return isl_upoly_mul_rec(up1, up2);
-error:
-	isl_upoly_free(up1);
-	isl_upoly_free(up2);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_pow(__isl_take struct isl_upoly *up,
-	unsigned power)
-{
-	struct isl_upoly *res;
-
-	if (!up)
-		return NULL;
-	if (power == 1)
-		return up;
-
-	if (power % 2)
-		res = isl_upoly_copy(up);
-	else
-		res = isl_upoly_one(up->ctx);
-
-	while (power >>= 1) {
-		up = isl_upoly_mul(up, isl_upoly_copy(up));
-		if (power % 2)
-			res = isl_upoly_mul(res, isl_upoly_copy(up));
-	}
-
-	isl_upoly_free(up);
-	return res;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_alloc(__isl_take isl_dim *dim,
-	unsigned n_div, __isl_take struct isl_upoly *up)
-{
-	struct isl_qpolynomial *qp = NULL;
-	unsigned total;
-
-	if (!dim || !up)
-		goto error;
-
-	total = isl_dim_total(dim);
-
-	qp = isl_calloc_type(dim->ctx, struct isl_qpolynomial);
-	if (!qp)
-		goto error;
-
-	qp->ref = 1;
-	qp->div = isl_mat_alloc(dim->ctx, n_div, 1 + 1 + total + n_div);
-	if (!qp->div)
-		goto error;
-
-	qp->dim = dim;
-	qp->upoly = up;
-
-	return qp;
-error:
-	isl_dim_free(dim);
-	isl_upoly_free(up);
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_copy(__isl_keep isl_qpolynomial *qp)
-{
-	if (!qp)
-		return NULL;
-
-	qp->ref++;
-	return qp;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_dup(__isl_keep isl_qpolynomial *qp)
-{
-	struct isl_qpolynomial *dup;
-
-	if (!qp)
-		return NULL;
-
-	dup = isl_qpolynomial_alloc(isl_dim_copy(qp->dim), qp->div->n_row,
-				    isl_upoly_copy(qp->upoly));
-	if (!dup)
-		return NULL;
-	isl_mat_free(dup->div);
-	dup->div = isl_mat_copy(qp->div);
-	if (!dup->div)
-		goto error;
-
-	return dup;
-error:
-	isl_qpolynomial_free(dup);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_cow(__isl_take isl_qpolynomial *qp)
-{
-	if (!qp)
-		return NULL;
-
-	if (qp->ref == 1)
-		return qp;
-	qp->ref--;
-	return isl_qpolynomial_dup(qp);
-}
-
-void isl_qpolynomial_free(__isl_take isl_qpolynomial *qp)
-{
-	if (!qp)
-		return;
-
-	if (--qp->ref > 0)
-		return;
-
-	isl_dim_free(qp->dim);
-	isl_mat_free(qp->div);
-	isl_upoly_free(qp->upoly);
-
-	free(qp);
-}
-
-__isl_give struct isl_upoly *isl_upoly_var_pow(isl_ctx *ctx, int pos, int power)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-	struct isl_upoly_cst *cst;
-
-	rec = isl_upoly_alloc_rec(ctx, pos, 1 + power);
-	if (!rec)
-		return NULL;
-	for (i = 0; i < 1 + power; ++i) {
-		rec->p[i] = isl_upoly_zero(ctx);
-		if (!rec->p[i])
-			goto error;
-		rec->n++;
-	}
-	cst = isl_upoly_as_cst(rec->p[power]);
-	isl_int_set_si(cst->n, 1);
-
-	return &rec->up;
-error:
-	isl_upoly_free(&rec->up);
-	return NULL;
-}
-
-/* r array maps original positions to new positions.
- */
-static __isl_give struct isl_upoly *reorder(__isl_take struct isl_upoly *up,
-	int *r)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-	struct isl_upoly *base;
-	struct isl_upoly *res;
-
-	if (isl_upoly_is_cst(up))
-		return up;
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-
-	isl_assert(up->ctx, rec->n >= 1, goto error);
-
-	base = isl_upoly_var_pow(up->ctx, r[up->var], 1);
-	res = reorder(isl_upoly_copy(rec->p[rec->n - 1]), r);
-
-	for (i = rec->n - 2; i >= 0; --i) {
-		res = isl_upoly_mul(res, isl_upoly_copy(base));
-		res = isl_upoly_sum(res, reorder(isl_upoly_copy(rec->p[i]), r));
-	}
-
-	isl_upoly_free(base);
-	isl_upoly_free(up);
-
-	return res;
-error:
-	isl_upoly_free(up);
-	return NULL;
-}
-
-static int compatible_divs(__isl_keep isl_mat *div1, __isl_keep isl_mat *div2)
-{
-	int n_row, n_col;
-	int equal;
-
-	isl_assert(div1->ctx, div1->n_row >= div2->n_row &&
-				div1->n_col >= div2->n_col, return -1);
-
-	if (div1->n_row == div2->n_row)
-		return isl_mat_is_equal(div1, div2);
-
-	n_row = div1->n_row;
-	n_col = div1->n_col;
-	div1->n_row = div2->n_row;
-	div1->n_col = div2->n_col;
-
-	equal = isl_mat_is_equal(div1, div2);
-
-	div1->n_row = n_row;
-	div1->n_col = n_col;
-
-	return equal;
-}
-
-static int cmp_row(__isl_keep isl_mat *div, int i, int j)
-{
-	int li, lj;
-
-	li = isl_seq_last_non_zero(div->row[i], div->n_col);
-	lj = isl_seq_last_non_zero(div->row[j], div->n_col);
-
-	if (li != lj)
-		return li - lj;
-
-	return isl_seq_cmp(div->row[i], div->row[j], div->n_col);
-}
-
-struct isl_div_sort_info {
-	isl_mat	*div;
-	int	 row;
-};
-
-static int div_sort_cmp(const void *p1, const void *p2)
-{
-	const struct isl_div_sort_info *i1, *i2;
-	i1 = (const struct isl_div_sort_info *) p1;
-	i2 = (const struct isl_div_sort_info *) p2;
-
-	return cmp_row(i1->div, i1->row, i2->row);
-}
-
-/* Sort divs and remove duplicates.
- */
-static __isl_give isl_qpolynomial *sort_divs(__isl_take isl_qpolynomial *qp)
-{
-	int i;
-	int skip;
-	int len;
-	struct isl_div_sort_info *array = NULL;
-	int *pos = NULL, *at = NULL;
-	int *reordering = NULL;
-	unsigned div_pos;
-
-	if (!qp)
-		return NULL;
-	if (qp->div->n_row <= 1)
-		return qp;
-
-	div_pos = isl_dim_total(qp->dim);
-
-	array = isl_alloc_array(qp->div->ctx, struct isl_div_sort_info,
-				qp->div->n_row);
-	pos = isl_alloc_array(qp->div->ctx, int, qp->div->n_row);
-	at = isl_alloc_array(qp->div->ctx, int, qp->div->n_row);
-	len = qp->div->n_col - 2;
-	reordering = isl_alloc_array(qp->div->ctx, int, len);
-	if (!array || !pos || !at || !reordering)
-		goto error;
-
-	for (i = 0; i < qp->div->n_row; ++i) {
-		array[i].div = qp->div;
-		array[i].row = i;
-		pos[i] = i;
-		at[i] = i;
-	}
-
-	qsort(array, qp->div->n_row, sizeof(struct isl_div_sort_info),
-		div_sort_cmp);
-
-	for (i = 0; i < div_pos; ++i)
-		reordering[i] = i;
-
-	for (i = 0; i < qp->div->n_row; ++i) {
-		if (pos[array[i].row] == i)
-			continue;
-		qp->div = isl_mat_swap_rows(qp->div, i, pos[array[i].row]);
-		pos[at[i]] = pos[array[i].row];
-		at[pos[array[i].row]] = at[i];
-		at[i] = array[i].row;
-		pos[array[i].row] = i;
-	}
-
-	skip = 0;
-	for (i = 0; i < len - div_pos; ++i) {
-		if (i > 0 &&
-		    isl_seq_eq(qp->div->row[i - skip - 1],
-			       qp->div->row[i - skip], qp->div->n_col)) {
-			qp->div = isl_mat_drop_rows(qp->div, i - skip, 1);
-			isl_mat_col_add(qp->div, 2 + div_pos + i - skip - 1,
-						 2 + div_pos + i - skip);
-			qp->div = isl_mat_drop_cols(qp->div,
-						    2 + div_pos + i - skip, 1);
-			skip++;
-		}
-		reordering[div_pos + array[i].row] = div_pos + i - skip;
-	}
-
-	qp->upoly = reorder(qp->upoly, reordering);
-
-	if (!qp->upoly || !qp->div)
-		goto error;
-
-	free(at);
-	free(pos);
-	free(array);
-	free(reordering);
-
-	return qp;
-error:
-	free(at);
-	free(pos);
-	free(array);
-	free(reordering);
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-static __isl_give struct isl_upoly *expand(__isl_take struct isl_upoly *up,
-	int *exp, int first)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-
-	if (isl_upoly_is_cst(up))
-		return up;
-
-	if (up->var < first)
-		return up;
-
-	if (exp[up->var - first] == up->var - first)
-		return up;
-
-	up = isl_upoly_cow(up);
-	if (!up)
-		goto error;
-
-	up->var = exp[up->var - first] + first;
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-
-	for (i = 0; i < rec->n; ++i) {
-		rec->p[i] = expand(rec->p[i], exp, first);
-		if (!rec->p[i])
-			goto error;
-	}
-
-	return up;
-error:
-	isl_upoly_free(up);
-	return NULL;
-}
-
-static __isl_give isl_qpolynomial *with_merged_divs(
-	__isl_give isl_qpolynomial *(*fn)(__isl_take isl_qpolynomial *qp1,
-					  __isl_take isl_qpolynomial *qp2),
-	__isl_take isl_qpolynomial *qp1, __isl_take isl_qpolynomial *qp2)
-{
-	int *exp1 = NULL;
-	int *exp2 = NULL;
-	isl_mat *div = NULL;
-
-	qp1 = isl_qpolynomial_cow(qp1);
-	qp2 = isl_qpolynomial_cow(qp2);
-
-	if (!qp1 || !qp2)
-		goto error;
-
-	isl_assert(qp1->div->ctx, qp1->div->n_row >= qp2->div->n_row &&
-				qp1->div->n_col >= qp2->div->n_col, goto error);
-
-	exp1 = isl_alloc_array(qp1->div->ctx, int, qp1->div->n_row);
-	exp2 = isl_alloc_array(qp2->div->ctx, int, qp2->div->n_row);
-	if (!exp1 || !exp2)
-		goto error;
-
-	div = isl_merge_divs(qp1->div, qp2->div, exp1, exp2);
-	if (!div)
-		goto error;
-
-	isl_mat_free(qp1->div);
-	qp1->div = isl_mat_copy(div);
-	isl_mat_free(qp2->div);
-	qp2->div = isl_mat_copy(div);
-
-	qp1->upoly = expand(qp1->upoly, exp1, div->n_col - div->n_row - 2);
-	qp2->upoly = expand(qp2->upoly, exp2, div->n_col - div->n_row - 2);
-
-	if (!qp1->upoly || !qp2->upoly)
-		goto error;
-
-	isl_mat_free(div);
-	free(exp1);
-	free(exp2);
-
-	return fn(qp1, qp2);
-error:
-	isl_mat_free(div);
-	free(exp1);
-	free(exp2);
-	isl_qpolynomial_free(qp1);
-	isl_qpolynomial_free(qp2);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_add(__isl_take isl_qpolynomial *qp1,
-	__isl_take isl_qpolynomial *qp2)
-{
-	qp1 = isl_qpolynomial_cow(qp1);
-
-	if (!qp1 || !qp2)
-		goto error;
-
-	if (qp1->div->n_row < qp2->div->n_row)
-		return isl_qpolynomial_add(qp2, qp1);
-
-	isl_assert(qp1->dim->ctx, isl_dim_equal(qp1->dim, qp2->dim), goto error);
-	if (!compatible_divs(qp1->div, qp2->div))
-		return with_merged_divs(isl_qpolynomial_add, qp1, qp2);
-
-	qp1->upoly = isl_upoly_sum(qp1->upoly, isl_upoly_copy(qp2->upoly));
-	if (!qp1->upoly)
-		goto error;
-
-	isl_qpolynomial_free(qp2);
-
-	return qp1;
-error:
-	isl_qpolynomial_free(qp1);
-	isl_qpolynomial_free(qp2);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_add_on_domain(
-	__isl_keep isl_set *dom,
-	__isl_take isl_qpolynomial *qp1,
-	__isl_take isl_qpolynomial *qp2)
-{
-	qp1 = isl_qpolynomial_add(qp1, qp2);
-	qp1 = isl_qpolynomial_gist(qp1, isl_set_copy(dom));
-	return qp1;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_sub(__isl_take isl_qpolynomial *qp1,
-	__isl_take isl_qpolynomial *qp2)
-{
-	return isl_qpolynomial_add(qp1, isl_qpolynomial_neg(qp2));
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_add_isl_int(
-	__isl_take isl_qpolynomial *qp, isl_int v)
-{
-	if (isl_int_is_zero(v))
-		return qp;
-
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		return NULL;
-
-	qp->upoly = isl_upoly_add_isl_int(qp->upoly, v);
-	if (!qp->upoly)
-		goto error;
-
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	return NULL;
-
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_neg(__isl_take isl_qpolynomial *qp)
-{
-	if (!qp)
-		return NULL;
-
-	return isl_qpolynomial_mul_isl_int(qp, qp->dim->ctx->negone);
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_mul_isl_int(
-	__isl_take isl_qpolynomial *qp, isl_int v)
-{
-	if (isl_int_is_one(v))
-		return qp;
-
-	if (qp && isl_int_is_zero(v)) {
-		isl_qpolynomial *zero;
-		zero = isl_qpolynomial_zero(isl_dim_copy(qp->dim));
-		isl_qpolynomial_free(qp);
-		return zero;
-	}
-	
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		return NULL;
-
-	qp->upoly = isl_upoly_mul_isl_int(qp->upoly, v);
-	if (!qp->upoly)
-		goto error;
-
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_scale(
-	__isl_take isl_qpolynomial *qp, isl_int v)
-{
-	return isl_qpolynomial_mul_isl_int(qp, v);
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_mul(__isl_take isl_qpolynomial *qp1,
-	__isl_take isl_qpolynomial *qp2)
-{
-	qp1 = isl_qpolynomial_cow(qp1);
-
-	if (!qp1 || !qp2)
-		goto error;
-
-	if (qp1->div->n_row < qp2->div->n_row)
-		return isl_qpolynomial_mul(qp2, qp1);
-
-	isl_assert(qp1->dim->ctx, isl_dim_equal(qp1->dim, qp2->dim), goto error);
-	if (!compatible_divs(qp1->div, qp2->div))
-		return with_merged_divs(isl_qpolynomial_mul, qp1, qp2);
-
-	qp1->upoly = isl_upoly_mul(qp1->upoly, isl_upoly_copy(qp2->upoly));
-	if (!qp1->upoly)
-		goto error;
-
-	isl_qpolynomial_free(qp2);
-
-	return qp1;
-error:
-	isl_qpolynomial_free(qp1);
-	isl_qpolynomial_free(qp2);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_pow(__isl_take isl_qpolynomial *qp,
-	unsigned power)
-{
-	qp = isl_qpolynomial_cow(qp);
-
-	if (!qp)
-		return NULL;
-
-	qp->upoly = isl_upoly_pow(qp->upoly, power);
-	if (!qp->upoly)
-		goto error;
-
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_zero(__isl_take isl_dim *dim)
-{
-	if (!dim)
-		return NULL;
-	return isl_qpolynomial_alloc(dim, 0, isl_upoly_zero(dim->ctx));
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_one(__isl_take isl_dim *dim)
-{
-	if (!dim)
-		return NULL;
-	return isl_qpolynomial_alloc(dim, 0, isl_upoly_one(dim->ctx));
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_infty(__isl_take isl_dim *dim)
-{
-	if (!dim)
-		return NULL;
-	return isl_qpolynomial_alloc(dim, 0, isl_upoly_infty(dim->ctx));
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_neginfty(__isl_take isl_dim *dim)
-{
-	if (!dim)
-		return NULL;
-	return isl_qpolynomial_alloc(dim, 0, isl_upoly_neginfty(dim->ctx));
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_nan(__isl_take isl_dim *dim)
-{
-	if (!dim)
-		return NULL;
-	return isl_qpolynomial_alloc(dim, 0, isl_upoly_nan(dim->ctx));
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_cst(__isl_take isl_dim *dim,
-	isl_int v)
-{
-	struct isl_qpolynomial *qp;
-	struct isl_upoly_cst *cst;
-
-	if (!dim)
-		return NULL;
-
-	qp = isl_qpolynomial_alloc(dim, 0, isl_upoly_zero(dim->ctx));
-	if (!qp)
-		return NULL;
-
-	cst = isl_upoly_as_cst(qp->upoly);
-	isl_int_set(cst->n, v);
-
-	return qp;
-}
-
-int isl_qpolynomial_is_cst(__isl_keep isl_qpolynomial *qp,
-	isl_int *n, isl_int *d)
-{
-	struct isl_upoly_cst *cst;
-
-	if (!qp)
-		return -1;
-
-	if (!isl_upoly_is_cst(qp->upoly))
-		return 0;
-
-	cst = isl_upoly_as_cst(qp->upoly);
-	if (!cst)
-		return -1;
-
-	if (n)
-		isl_int_set(*n, cst->n);
-	if (d)
-		isl_int_set(*d, cst->d);
-
-	return 1;
-}
-
-int isl_upoly_is_affine(__isl_keep struct isl_upoly *up)
-{
-	int is_cst;
-	struct isl_upoly_rec *rec;
-
-	if (!up)
-		return -1;
-
-	if (up->var < 0)
-		return 1;
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		return -1;
-
-	if (rec->n > 2)
-		return 0;
-
-	isl_assert(up->ctx, rec->n > 1, return -1);
-
-	is_cst = isl_upoly_is_cst(rec->p[1]);
-	if (is_cst < 0)
-		return -1;
-	if (!is_cst)
-		return 0;
-
-	return isl_upoly_is_affine(rec->p[0]);
-}
-
-int isl_qpolynomial_is_affine(__isl_keep isl_qpolynomial *qp)
-{
-	if (!qp)
-		return -1;
-
-	if (qp->div->n_row > 0)
-		return 0;
-
-	return isl_upoly_is_affine(qp->upoly);
-}
-
-static void update_coeff(__isl_keep isl_vec *aff,
-	__isl_keep struct isl_upoly_cst *cst, int pos)
-{
-	isl_int gcd;
-	isl_int f;
-
-	if (isl_int_is_zero(cst->n))
-		return;
-
-	isl_int_init(gcd);
-	isl_int_init(f);
-	isl_int_gcd(gcd, cst->d, aff->el[0]);
-	isl_int_divexact(f, cst->d, gcd);
-	isl_int_divexact(gcd, aff->el[0], gcd);
-	isl_seq_scale(aff->el, aff->el, f, aff->size);
-	isl_int_mul(aff->el[1 + pos], gcd, cst->n);
-	isl_int_clear(gcd);
-	isl_int_clear(f);
-}
-
-int isl_upoly_update_affine(__isl_keep struct isl_upoly *up,
-	__isl_keep isl_vec *aff)
-{
-	struct isl_upoly_cst *cst;
-	struct isl_upoly_rec *rec;
-
-	if (!up || !aff)
-		return -1;
-
-	if (up->var < 0) {
-		struct isl_upoly_cst *cst;
-
-		cst = isl_upoly_as_cst(up);
-		if (!cst)
-			return -1;
-		update_coeff(aff, cst, 0);
-		return 0;
-	}
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		return -1;
-	isl_assert(up->ctx, rec->n == 2, return -1);
-
-	cst = isl_upoly_as_cst(rec->p[1]);
-	if (!cst)
-		return -1;
-	update_coeff(aff, cst, 1 + up->var);
-
-	return isl_upoly_update_affine(rec->p[0], aff);
-}
-
-__isl_give isl_vec *isl_qpolynomial_extract_affine(
-	__isl_keep isl_qpolynomial *qp)
-{
-	isl_vec *aff;
-	unsigned d;
-
-	if (!qp)
-		return NULL;
-
-	d = isl_dim_total(qp->dim);
-	aff = isl_vec_alloc(qp->div->ctx, 2 + d + qp->div->n_row);
-	if (!aff)
-		return NULL;
-
-	isl_seq_clr(aff->el + 1, 1 + d + qp->div->n_row);
-	isl_int_set_si(aff->el[0], 1);
-
-	if (isl_upoly_update_affine(qp->upoly, aff) < 0)
-		goto error;
-
-	return aff;
-error:
-	isl_vec_free(aff);
-	return NULL;
-}
-
-int isl_qpolynomial_plain_is_equal(__isl_keep isl_qpolynomial *qp1,
-	__isl_keep isl_qpolynomial *qp2)
-{
-	int equal;
-
-	if (!qp1 || !qp2)
-		return -1;
-
-	equal = isl_dim_equal(qp1->dim, qp2->dim);
-	if (equal < 0 || !equal)
-		return equal;
-
-	equal = isl_mat_is_equal(qp1->div, qp2->div);
-	if (equal < 0 || !equal)
-		return equal;
-
-	return isl_upoly_is_equal(qp1->upoly, qp2->upoly);
-}
-
-static void upoly_update_den(__isl_keep struct isl_upoly *up, isl_int *d)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-
-	if (isl_upoly_is_cst(up)) {
-		struct isl_upoly_cst *cst;
-		cst = isl_upoly_as_cst(up);
-		if (!cst)
-			return;
-		isl_int_lcm(*d, *d, cst->d);
-		return;
-	}
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		return;
-
-	for (i = 0; i < rec->n; ++i)
-		upoly_update_den(rec->p[i], d);
-}
-
-void isl_qpolynomial_get_den(__isl_keep isl_qpolynomial *qp, isl_int *d)
-{
-	isl_int_set_si(*d, 1);
-	if (!qp)
-		return;
-	upoly_update_den(qp->upoly, d);
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_var_pow(__isl_take isl_dim *dim,
-	int pos, int power)
-{
-	struct isl_ctx *ctx;
-
-	if (!dim)
-		return NULL;
-
-	ctx = dim->ctx;
-
-	return isl_qpolynomial_alloc(dim, 0, isl_upoly_var_pow(ctx, pos, power));
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_var(__isl_take isl_dim *dim,
-	enum isl_dim_type type, unsigned pos)
-{
-	if (!dim)
-		return NULL;
-
-	isl_assert(dim->ctx, isl_dim_size(dim, isl_dim_in) == 0, goto error);
-	isl_assert(dim->ctx, pos < isl_dim_size(dim, type), goto error);
-
-	if (type == isl_dim_set)
-		pos += isl_dim_size(dim, isl_dim_param);
-
-	return isl_qpolynomial_var_pow(dim, pos, 1);
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_subs(__isl_take struct isl_upoly *up,
-	unsigned first, unsigned n, __isl_keep struct isl_upoly **subs)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-	struct isl_upoly *base, *res;
-
-	if (!up)
-		return NULL;
-
-	if (isl_upoly_is_cst(up))
-		return up;
-
-	if (up->var < first)
-		return up;
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-
-	isl_assert(up->ctx, rec->n >= 1, goto error);
-
-	if (up->var >= first + n)
-		base = isl_upoly_var_pow(up->ctx, up->var, 1);
-	else
-		base = isl_upoly_copy(subs[up->var - first]);
-
-	res = isl_upoly_subs(isl_upoly_copy(rec->p[rec->n - 1]), first, n, subs);
-	for (i = rec->n - 2; i >= 0; --i) {
-		struct isl_upoly *t;
-		t = isl_upoly_subs(isl_upoly_copy(rec->p[i]), first, n, subs);
-		res = isl_upoly_mul(res, isl_upoly_copy(base));
-		res = isl_upoly_sum(res, t);
-	}
-
-	isl_upoly_free(base);
-	isl_upoly_free(up);
-				
-	return res;
-error:
-	isl_upoly_free(up);
-	return NULL;
-}	
-
-__isl_give struct isl_upoly *isl_upoly_from_affine(isl_ctx *ctx, isl_int *f,
-	isl_int denom, unsigned len)
-{
-	int i;
-	struct isl_upoly *up;
-
-	isl_assert(ctx, len >= 1, return NULL);
-
-	up = isl_upoly_rat_cst(ctx, f[0], denom);
-	for (i = 0; i < len - 1; ++i) {
-		struct isl_upoly *t;
-		struct isl_upoly *c;
-
-		if (isl_int_is_zero(f[1 + i]))
-			continue;
-
-		c = isl_upoly_rat_cst(ctx, f[1 + i], denom);
-		t = isl_upoly_var_pow(ctx, i, 1);
-		t = isl_upoly_mul(c, t);
-		up = isl_upoly_sum(up, t);
-	}
-
-	return up;
-}
-
-/* Remove common factor of non-constant terms and denominator.
- */
-static void normalize_div(__isl_keep isl_qpolynomial *qp, int div)
-{
-	isl_ctx *ctx = qp->div->ctx;
-	unsigned total = qp->div->n_col - 2;
-
-	isl_seq_gcd(qp->div->row[div] + 2, total, &ctx->normalize_gcd);
-	isl_int_gcd(ctx->normalize_gcd,
-		    ctx->normalize_gcd, qp->div->row[div][0]);
-	if (isl_int_is_one(ctx->normalize_gcd))
-		return;
-
-	isl_seq_scale_down(qp->div->row[div] + 2, qp->div->row[div] + 2,
-			    ctx->normalize_gcd, total);
-	isl_int_divexact(qp->div->row[div][0], qp->div->row[div][0],
-			    ctx->normalize_gcd);
-	isl_int_fdiv_q(qp->div->row[div][1], qp->div->row[div][1],
-			    ctx->normalize_gcd);
-}
-
-/* Replace the integer division identified by "div" by the polynomial "s".
- * The integer division is assumed not to appear in the definition
- * of any other integer divisions.
- */
-static __isl_give isl_qpolynomial *substitute_div(
-	__isl_take isl_qpolynomial *qp,
-	int div, __isl_take struct isl_upoly *s)
-{
-	int i;
-	int total;
-	int *reordering;
-
-	if (!qp || !s)
-		goto error;
-
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		goto error;
-
-	total = isl_dim_total(qp->dim);
-	qp->upoly = isl_upoly_subs(qp->upoly, total + div, 1, &s);
-	if (!qp->upoly)
-		goto error;
-
-	reordering = isl_alloc_array(qp->dim->ctx, int, total + qp->div->n_row);
-	if (!reordering)
-		goto error;
-	for (i = 0; i < total + div; ++i)
-		reordering[i] = i;
-	for (i = total + div + 1; i < total + qp->div->n_row; ++i)
-		reordering[i] = i - 1;
-	qp->div = isl_mat_drop_rows(qp->div, div, 1);
-	qp->div = isl_mat_drop_cols(qp->div, 2 + total + div, 1);
-	qp->upoly = reorder(qp->upoly, reordering);
-	free(reordering);
-
-	if (!qp->upoly || !qp->div)
-		goto error;
-
-	isl_upoly_free(s);
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	isl_upoly_free(s);
-	return NULL;
-}
-
-/* Replace all integer divisions [e/d] that turn out to not actually be integer
- * divisions because d is equal to 1 by their definition, i.e., e.
- */
-static __isl_give isl_qpolynomial *substitute_non_divs(
-	__isl_take isl_qpolynomial *qp)
-{
-	int i, j;
-	int total;
-	struct isl_upoly *s;
-
-	if (!qp)
-		return NULL;
-
-	total = isl_dim_total(qp->dim);
-	for (i = 0; qp && i < qp->div->n_row; ++i) {
-		if (!isl_int_is_one(qp->div->row[i][0]))
-			continue;
-		for (j = i + 1; j < qp->div->n_row; ++j) {
-			if (isl_int_is_zero(qp->div->row[j][2 + total + i]))
-				continue;
-			isl_seq_combine(qp->div->row[j] + 1,
-				qp->div->ctx->one, qp->div->row[j] + 1,
-				qp->div->row[j][2 + total + i],
-				qp->div->row[i] + 1, 1 + total + i);
-			isl_int_set_si(qp->div->row[j][2 + total + i], 0);
-			normalize_div(qp, j);
-		}
-		s = isl_upoly_from_affine(qp->dim->ctx, qp->div->row[i] + 1,
-					qp->div->row[i][0], qp->div->n_col - 1);
-		qp = substitute_div(qp, i, s);
-		--i;
-	}
-
-	return qp;
-}
-
-/* Reduce the coefficients of div "div" to lie in the interval [0, d-1],
- * with d the denominator.  When replacing the coefficient e of x by
- * d * frac(e/d) = e - d * floor(e/d), we are subtracting d * floor(e/d) * x
- * 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").
- */
-static void reduce_div(__isl_keep isl_qpolynomial *qp, int div,
-	__isl_keep isl_vec *aff)
-{
-	int i, j;
-	isl_int v;
-	unsigned total = qp->div->n_col - qp->div->n_row - 2;
-
-	isl_int_init(v);
-	for (i = 0; i < 1 + total + div; ++i) {
-		if (isl_int_is_nonneg(qp->div->row[div][1 + i]) &&
-		    isl_int_lt(qp->div->row[div][1 + i], qp->div->row[div][0]))
-			continue;
-		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]);
-		for (j = div + 1; j < qp->div->n_row; ++j) {
-			if (isl_int_is_zero(qp->div->row[j][2 + total + div]))
-				continue;
-			isl_int_addmul(qp->div->row[j][1 + i],
-					v, qp->div->row[j][2 + total + div]);
-		}
-	}
-	isl_int_clear(v);
-}
-
-/* Check if the last non-zero coefficient is bigger that half of the
- * denominator.  If so, we will invert the div to further reduce the number
- * of distinct divs that may appear.
- * If the last non-zero coefficient is exactly half the denominator,
- * then we continue looking for earlier coefficients that are bigger
- * than half the denominator.
- */
-static int needs_invert(__isl_keep isl_mat *div, int row)
-{
-	int i;
-	int cmp;
-
-	for (i = div->n_col - 1; i >= 1; --i) {
-		if (isl_int_is_zero(div->row[row][i]))
-			continue;
-		isl_int_mul_ui(div->row[row][i], div->row[row][i], 2);
-		cmp = isl_int_cmp(div->row[row][i], div->row[row][0]);
-		isl_int_divexact_ui(div->row[row][i], div->row[row][i], 2);
-		if (cmp)
-			return cmp > 0;
-		if (i == 1)
-			return 1;
-	}
-
-	return 0;
-}
-
-/* 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
- * coefficients of e should be reduced again.
- */
-static void invert_div(__isl_keep isl_qpolynomial *qp, int div,
-	__isl_keep isl_vec *aff)
-{
-	unsigned total = qp->div->n_col - qp->div->n_row - 2;
-
-	isl_seq_neg(qp->div->row[div] + 1,
-		    qp->div->row[div] + 1, qp->div->n_col - 1);
-	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]);
-	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
- * 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.
- *
- * After the reduction, some divs may have become redundant or identical,
- * so we call substitute_non_divs and sort_divs.  If these functions
- * eliminate divs or merge two or more divs into one, the coefficients
- * of the enclosing divs may have to be reduced again, so we call
- * ourselves recursively if the number of divs decreases.
- */
-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;
-
-	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;
-
-	isl_int_set_si(aff->el[1 + qp->upoly->var], 1);
-
-	for (i = 0; i < qp->div->n_row; ++i) {
-		normalize_div(qp, i);
-		reduce_div(qp, i, aff);
-		if (needs_invert(qp->div, i)) {
-			invert_div(qp, i, aff);
-			reduce_div(qp, i, aff);
-		}
-	}
-
-	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);
-	if (!qp->upoly)
-		goto error;
-
-	isl_vec_free(aff);
-
-	n_div = qp->div->n_row;
-	qp = substitute_non_divs(qp);
-	qp = sort_divs(qp);
-	if (qp && qp->div->n_row < n_div)
-		return reduce_divs(qp);
-
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	isl_vec_free(aff);
-	return NULL;
-}
-
-/* Assumes each div only depends on earlier divs.
- */
-__isl_give isl_qpolynomial *isl_qpolynomial_div_pow(__isl_take isl_div *div,
-	int power)
-{
-	struct isl_qpolynomial *qp = NULL;
-	struct isl_upoly_rec *rec;
-	struct isl_upoly_cst *cst;
-	int i, d;
-	int pos;
-
-	if (!div)
-		return NULL;
-
-	d = div->line - div->bmap->div;
-
-	pos = isl_dim_total(div->bmap->dim) + d;
-	rec = isl_upoly_alloc_rec(div->ctx, pos, 1 + power);
-	qp = isl_qpolynomial_alloc(isl_basic_map_get_dim(div->bmap),
-				   div->bmap->n_div, &rec->up);
-	if (!qp)
-		goto error;
-
-	for (i = 0; i < div->bmap->n_div; ++i)
-		isl_seq_cpy(qp->div->row[i], div->bmap->div[i], qp->div->n_col);
-
-	for (i = 0; i < 1 + power; ++i) {
-		rec->p[i] = isl_upoly_zero(div->ctx);
-		if (!rec->p[i])
-			goto error;
-		rec->n++;
-	}
-	cst = isl_upoly_as_cst(rec->p[power]);
-	isl_int_set_si(cst->n, 1);
-
-	isl_div_free(div);
-
-	qp = reduce_divs(qp);
-
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	isl_div_free(div);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_div(__isl_take isl_div *div)
-{
-	return isl_qpolynomial_div_pow(div, 1);
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_rat_cst(__isl_take isl_dim *dim,
-	const isl_int n, const isl_int d)
-{
-	struct isl_qpolynomial *qp;
-	struct isl_upoly_cst *cst;
-
-	qp = isl_qpolynomial_alloc(dim, 0, isl_upoly_zero(dim->ctx));
-	if (!qp)
-		return NULL;
-
-	cst = isl_upoly_as_cst(qp->upoly);
-	isl_int_set(cst->n, n);
-	isl_int_set(cst->d, d);
-
-	return qp;
-}
-
-static int up_set_active(__isl_keep struct isl_upoly *up, int *active, int d)
-{
-	struct isl_upoly_rec *rec;
-	int i;
-
-	if (!up)
-		return -1;
-
-	if (isl_upoly_is_cst(up))
-		return 0;
-
-	if (up->var < d)
-		active[up->var] = 1;
-
-	rec = isl_upoly_as_rec(up);
-	for (i = 0; i < rec->n; ++i)
-		if (up_set_active(rec->p[i], active, d) < 0)
-			return -1;
-
-	return 0;
-}
-
-static int set_active(__isl_keep isl_qpolynomial *qp, int *active)
-{
-	int i, j;
-	int d = isl_dim_total(qp->dim);
-
-	if (!qp || !active)
-		return -1;
-
-	for (i = 0; i < d; ++i)
-		for (j = 0; j < qp->div->n_row; ++j) {
-			if (isl_int_is_zero(qp->div->row[j][2 + i]))
-				continue;
-			active[i] = 1;
-			break;
-		}
-
-	return up_set_active(qp->upoly, active, d);
-}
-
-int isl_qpolynomial_involves_dims(__isl_keep isl_qpolynomial *qp,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-	int *active = NULL;
-	int involves = 0;
-
-	if (!qp)
-		return -1;
-	if (n == 0)
-		return 0;
-
-	isl_assert(qp->dim->ctx, first + n <= isl_dim_size(qp->dim, type),
-			return -1);
-	isl_assert(qp->dim->ctx, type == isl_dim_param ||
-				 type == isl_dim_set, return -1);
-
-	active = isl_calloc_array(qp->dim->ctx, int, isl_dim_total(qp->dim));
-	if (set_active(qp, active) < 0)
-		goto error;
-
-	if (type == isl_dim_set)
-		first += isl_dim_size(qp->dim, isl_dim_param);
-	for (i = 0; i < n; ++i)
-		if (active[first + i]) {
-			involves = 1;
-			break;
-		}
-
-	free(active);
-
-	return involves;
-error:
-	free(active);
-	return -1;
-}
-
-/* Remove divs that do not appear in the quasi-polynomial, nor in any
- * of the divs that do appear in the quasi-polynomial.
- */
-static __isl_give isl_qpolynomial *remove_redundant_divs(
-	__isl_take isl_qpolynomial *qp)
-{
-	int i, j;
-	int d;
-	int len;
-	int skip;
-	int *active = NULL;
-	int *reordering = NULL;
-	int redundant = 0;
-	int n_div;
-	isl_ctx *ctx;
-
-	if (!qp)
-		return NULL;
-	if (qp->div->n_row == 0)
-		return qp;
-
-	d = isl_dim_total(qp->dim);
-	len = qp->div->n_col - 2;
-	ctx = isl_qpolynomial_get_ctx(qp);
-	active = isl_calloc_array(ctx, int, len);
-	if (!active)
-		goto error;
-
-	if (up_set_active(qp->upoly, active, len) < 0)
-		goto error;
-
-	for (i = qp->div->n_row - 1; i >= 0; --i) {
-		if (!active[d + i]) {
-			redundant = 1;
-			continue;
-		}
-		for (j = 0; j < i; ++j) {
-			if (isl_int_is_zero(qp->div->row[i][2 + d + j]))
-				continue;
-			active[d + j] = 1;
-			break;
-		}
-	}
-
-	if (!redundant) {
-		free(active);
-		return qp;
-	}
-
-	reordering = isl_alloc_array(qp->div->ctx, int, len);
-	if (!reordering)
-		goto error;
-
-	for (i = 0; i < d; ++i)
-		reordering[i] = i;
-
-	skip = 0;
-	n_div = qp->div->n_row;
-	for (i = 0; i < n_div; ++i) {
-		if (!active[d + i]) {
-			qp->div = isl_mat_drop_rows(qp->div, i - skip, 1);
-			qp->div = isl_mat_drop_cols(qp->div,
-						    2 + d + i - skip, 1);
-			skip++;
-		}
-		reordering[d + i] = d + i - skip;
-	}
-
-	qp->upoly = reorder(qp->upoly, reordering);
-
-	if (!qp->upoly || !qp->div)
-		goto error;
-
-	free(active);
-	free(reordering);
-
-	return qp;
-error:
-	free(active);
-	free(reordering);
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_drop(__isl_take struct isl_upoly *up,
-	unsigned first, unsigned n)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-
-	if (!up)
-		return NULL;
-	if (n == 0 || up->var < 0 || up->var < first)
-		return up;
-	if (up->var < first + n) {
-		up = replace_by_constant_term(up);
-		return isl_upoly_drop(up, first, n);
-	}
-	up = isl_upoly_cow(up);
-	if (!up)
-		return NULL;
-	up->var -= n;
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-
-	for (i = 0; i < rec->n; ++i) {
-		rec->p[i] = isl_upoly_drop(rec->p[i], first, n);
-		if (!rec->p[i])
-			goto error;
-	}
-
-	return up;
-error:
-	isl_upoly_free(up);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_set_dim_name(
-	__isl_take isl_qpolynomial *qp,
-	enum isl_dim_type type, unsigned pos, const char *s)
-{
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		return NULL;
-	qp->dim = isl_dim_set_name(qp->dim, type, pos, s);
-	if (!qp->dim)
-		goto error;
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_drop_dims(
-	__isl_take isl_qpolynomial *qp,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	if (!qp)
-		return NULL;
-	if (n == 0 && !isl_dim_is_named_or_nested(qp->dim, type))
-		return qp;
-
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		return NULL;
-
-	isl_assert(qp->dim->ctx, first + n <= isl_dim_size(qp->dim, type),
-			goto error);
-	isl_assert(qp->dim->ctx, type == isl_dim_param ||
-				 type == isl_dim_set, goto error);
-
-	qp->dim = isl_dim_drop(qp->dim, type, first, n);
-	if (!qp->dim)
-		goto error;
-
-	if (type == isl_dim_set)
-		first += isl_dim_size(qp->dim, isl_dim_param);
-
-	qp->div = isl_mat_drop_cols(qp->div, 2 + first, n);
-	if (!qp->div)
-		goto error;
-
-	qp->upoly = isl_upoly_drop(qp->upoly, first, n);
-	if (!qp->upoly)
-		goto error;
-
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_substitute_equalities(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_basic_set *eq)
-{
-	int i, j, k;
-	isl_int denom;
-	unsigned total;
-	unsigned n_div;
-	struct isl_upoly *up;
-
-	if (!eq)
-		goto error;
-	if (eq->n_eq == 0) {
-		isl_basic_set_free(eq);
-		return qp;
-	}
-
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		goto error;
-	qp->div = isl_mat_cow(qp->div);
-	if (!qp->div)
-		goto error;
-
-	total = 1 + isl_dim_total(eq->dim);
-	n_div = eq->n_div;
-	isl_int_init(denom);
-	for (i = 0; i < eq->n_eq; ++i) {
-		j = isl_seq_last_non_zero(eq->eq[i], total + n_div);
-		if (j < 0 || j == 0 || j >= total)
-			continue;
-
-		for (k = 0; k < qp->div->n_row; ++k) {
-			if (isl_int_is_zero(qp->div->row[k][1 + j]))
-				continue;
-			isl_seq_elim(qp->div->row[k] + 1, eq->eq[i], j, total,
-					&qp->div->row[k][0]);
-			normalize_div(qp, k);
-		}
-
-		if (isl_int_is_pos(eq->eq[i][j]))
-			isl_seq_neg(eq->eq[i], eq->eq[i], total);
-		isl_int_abs(denom, eq->eq[i][j]);
-		isl_int_set_si(eq->eq[i][j], 0);
-
-		up = isl_upoly_from_affine(qp->dim->ctx,
-						   eq->eq[i], denom, total);
-		qp->upoly = isl_upoly_subs(qp->upoly, j - 1, 1, &up);
-		isl_upoly_free(up);
-	}
-	isl_int_clear(denom);
-
-	if (!qp->upoly)
-		goto error;
-
-	isl_basic_set_free(eq);
-
-	qp = substitute_non_divs(qp);
-	qp = sort_divs(qp);
-
-	return qp;
-error:
-	isl_basic_set_free(eq);
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-static __isl_give isl_basic_set *add_div_constraints(
-	__isl_take isl_basic_set *bset, __isl_take isl_mat *div)
-{
-	int i;
-	unsigned total;
-
-	if (!bset || !div)
-		goto error;
-
-	bset = isl_basic_set_extend_constraints(bset, 0, 2 * div->n_row);
-	if (!bset)
-		goto error;
-	total = isl_basic_set_total_dim(bset);
-	for (i = 0; i < div->n_row; ++i)
-		if (isl_basic_set_add_div_constraints_var(bset,
-				    total - div->n_row + i, div->row[i]) < 0)
-			goto error;
-
-	isl_mat_free(div);
-	return bset;
-error:
-	isl_mat_free(div);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Look for equalities among the variables shared by context and qp
- * and the integer divisions of qp, if any.
- * The equalities are then used to eliminate variables and/or integer
- * divisions from qp.
- */
-__isl_give isl_qpolynomial *isl_qpolynomial_gist(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_set *context)
-{
-	isl_basic_set *aff;
-
-	if (!qp)
-		goto error;
-	if (qp->div->n_row > 0) {
-		isl_basic_set *bset;
-		context = isl_set_add_dims(context, isl_dim_set,
-					    qp->div->n_row);
-		bset = isl_basic_set_universe(isl_set_get_dim(context));
-		bset = add_div_constraints(bset, isl_mat_copy(qp->div));
-		context = isl_set_intersect(context,
-					    isl_set_from_basic_set(bset));
-	}
-
-	aff = isl_set_affine_hull(context);
-	return isl_qpolynomial_substitute_equalities(qp, aff);
-error:
-	isl_qpolynomial_free(qp);
-	isl_set_free(context);
-	return NULL;
-}
-
-#undef PW
-#define PW isl_pw_qpolynomial
-#undef EL
-#define EL isl_qpolynomial
-#undef EL_IS_ZERO
-#define EL_IS_ZERO is_zero
-#undef ZERO
-#define ZERO zero
-#undef IS_ZERO
-#define IS_ZERO is_zero
-#undef FIELD
-#define FIELD qp
-
-#include <isl_pw_templ.c>
-
-#undef UNION
-#define UNION isl_union_pw_qpolynomial
-#undef PART
-#define PART isl_pw_qpolynomial
-#undef PARTS
-#define PARTS pw_qpolynomial
-
-#include <isl_union_templ.c>
-
-int isl_pw_qpolynomial_is_one(__isl_keep isl_pw_qpolynomial *pwqp)
-{
-	if (!pwqp)
-		return -1;
-
-	if (pwqp->n != -1)
-		return 0;
-
-	if (!isl_set_plain_is_universe(pwqp->p[0].set))
-		return 0;
-
-	return isl_qpolynomial_is_one(pwqp->p[0].qp);
-}
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_mul(
-	__isl_take isl_pw_qpolynomial *pwqp1,
-	__isl_take isl_pw_qpolynomial *pwqp2)
-{
-	int i, j, n;
-	struct isl_pw_qpolynomial *res;
-
-	if (!pwqp1 || !pwqp2)
-		goto error;
-
-	isl_assert(pwqp1->dim->ctx, isl_dim_equal(pwqp1->dim, pwqp2->dim),
-			goto error);
-
-	if (isl_pw_qpolynomial_is_zero(pwqp1)) {
-		isl_pw_qpolynomial_free(pwqp2);
-		return pwqp1;
-	}
-
-	if (isl_pw_qpolynomial_is_zero(pwqp2)) {
-		isl_pw_qpolynomial_free(pwqp1);
-		return pwqp2;
-	}
-
-	if (isl_pw_qpolynomial_is_one(pwqp1)) {
-		isl_pw_qpolynomial_free(pwqp1);
-		return pwqp2;
-	}
-
-	if (isl_pw_qpolynomial_is_one(pwqp2)) {
-		isl_pw_qpolynomial_free(pwqp2);
-		return pwqp1;
-	}
-
-	n = pwqp1->n * pwqp2->n;
-	res = isl_pw_qpolynomial_alloc_(isl_dim_copy(pwqp1->dim), n);
-
-	for (i = 0; i < pwqp1->n; ++i) {
-		for (j = 0; j < pwqp2->n; ++j) {
-			struct isl_set *common;
-			struct isl_qpolynomial *prod;
-			common = isl_set_intersect(isl_set_copy(pwqp1->p[i].set),
-						isl_set_copy(pwqp2->p[j].set));
-			if (isl_set_plain_is_empty(common)) {
-				isl_set_free(common);
-				continue;
-			}
-
-			prod = isl_qpolynomial_mul(
-				isl_qpolynomial_copy(pwqp1->p[i].qp),
-				isl_qpolynomial_copy(pwqp2->p[j].qp));
-
-			res = isl_pw_qpolynomial_add_piece(res, common, prod);
-		}
-	}
-
-	isl_pw_qpolynomial_free(pwqp1);
-	isl_pw_qpolynomial_free(pwqp2);
-
-	return res;
-error:
-	isl_pw_qpolynomial_free(pwqp1);
-	isl_pw_qpolynomial_free(pwqp2);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_eval(
-	__isl_take struct isl_upoly *up, __isl_take isl_vec *vec)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-	struct isl_upoly *res;
-	struct isl_upoly *base;
-
-	if (isl_upoly_is_cst(up)) {
-		isl_vec_free(vec);
-		return up;
-	}
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-
-	isl_assert(up->ctx, rec->n >= 1, goto error);
-
-	base = isl_upoly_rat_cst(up->ctx, vec->el[1 + up->var], vec->el[0]);
-
-	res = isl_upoly_eval(isl_upoly_copy(rec->p[rec->n - 1]),
-				isl_vec_copy(vec));
-
-	for (i = rec->n - 2; i >= 0; --i) {
-		res = isl_upoly_mul(res, isl_upoly_copy(base));
-		res = isl_upoly_sum(res, 
-			    isl_upoly_eval(isl_upoly_copy(rec->p[i]),
-							    isl_vec_copy(vec)));
-	}
-
-	isl_upoly_free(base);
-	isl_upoly_free(up);
-	isl_vec_free(vec);
-	return res;
-error:
-	isl_upoly_free(up);
-	isl_vec_free(vec);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_eval(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_point *pnt)
-{
-	isl_vec *ext;
-	struct isl_upoly *up;
-	isl_dim *dim;
-
-	if (!qp || !pnt)
-		goto error;
-	isl_assert(pnt->dim->ctx, isl_dim_equal(pnt->dim, qp->dim), goto error);
-
-	if (qp->div->n_row == 0)
-		ext = isl_vec_copy(pnt->vec);
-	else {
-		int i;
-		unsigned dim = isl_dim_total(qp->dim);
-		ext = isl_vec_alloc(qp->dim->ctx, 1 + dim + qp->div->n_row);
-		if (!ext)
-			goto error;
-
-		isl_seq_cpy(ext->el, pnt->vec->el, pnt->vec->size);
-		for (i = 0; i < qp->div->n_row; ++i) {
-			isl_seq_inner_product(qp->div->row[i] + 1, ext->el,
-						1 + dim + i, &ext->el[1+dim+i]);
-			isl_int_fdiv_q(ext->el[1+dim+i], ext->el[1+dim+i],
-					qp->div->row[i][0]);
-		}
-	}
-
-	up = isl_upoly_eval(isl_upoly_copy(qp->upoly), ext);
-	if (!up)
-		goto error;
-
-	dim = isl_dim_copy(qp->dim);
-	isl_qpolynomial_free(qp);
-	isl_point_free(pnt);
-
-	return isl_qpolynomial_alloc(dim, 0, up);
-error:
-	isl_qpolynomial_free(qp);
-	isl_point_free(pnt);
-	return NULL;
-}
-
-int isl_upoly_cmp(__isl_keep struct isl_upoly_cst *cst1,
-	__isl_keep struct isl_upoly_cst *cst2)
-{
-	int cmp;
-	isl_int t;
-	isl_int_init(t);
-	isl_int_mul(t, cst1->n, cst2->d);
-	isl_int_submul(t, cst2->n, cst1->d);
-	cmp = isl_int_sgn(t);
-	isl_int_clear(t);
-	return cmp;
-}
-
-int isl_qpolynomial_le_cst(__isl_keep isl_qpolynomial *qp1,
-	__isl_keep isl_qpolynomial *qp2)
-{
-	struct isl_upoly_cst *cst1, *cst2;
-
-	if (!qp1 || !qp2)
-		return -1;
-	isl_assert(qp1->dim->ctx, isl_upoly_is_cst(qp1->upoly), return -1);
-	isl_assert(qp2->dim->ctx, isl_upoly_is_cst(qp2->upoly), return -1);
-	if (isl_qpolynomial_is_nan(qp1))
-		return -1;
-	if (isl_qpolynomial_is_nan(qp2))
-		return -1;
-	cst1 = isl_upoly_as_cst(qp1->upoly);
-	cst2 = isl_upoly_as_cst(qp2->upoly);
-
-	return isl_upoly_cmp(cst1, cst2) <= 0;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_min_cst(
-	__isl_take isl_qpolynomial *qp1, __isl_take isl_qpolynomial *qp2)
-{
-	struct isl_upoly_cst *cst1, *cst2;
-	int cmp;
-
-	if (!qp1 || !qp2)
-		goto error;
-	isl_assert(qp1->dim->ctx, isl_upoly_is_cst(qp1->upoly), goto error);
-	isl_assert(qp2->dim->ctx, isl_upoly_is_cst(qp2->upoly), goto error);
-	cst1 = isl_upoly_as_cst(qp1->upoly);
-	cst2 = isl_upoly_as_cst(qp2->upoly);
-	cmp = isl_upoly_cmp(cst1, cst2);
-
-	if (cmp <= 0) {
-		isl_qpolynomial_free(qp2);
-	} else {
-		isl_qpolynomial_free(qp1);
-		qp1 = qp2;
-	}
-	return qp1;
-error:
-	isl_qpolynomial_free(qp1);
-	isl_qpolynomial_free(qp2);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_max_cst(
-	__isl_take isl_qpolynomial *qp1, __isl_take isl_qpolynomial *qp2)
-{
-	struct isl_upoly_cst *cst1, *cst2;
-	int cmp;
-
-	if (!qp1 || !qp2)
-		goto error;
-	isl_assert(qp1->dim->ctx, isl_upoly_is_cst(qp1->upoly), goto error);
-	isl_assert(qp2->dim->ctx, isl_upoly_is_cst(qp2->upoly), goto error);
-	cst1 = isl_upoly_as_cst(qp1->upoly);
-	cst2 = isl_upoly_as_cst(qp2->upoly);
-	cmp = isl_upoly_cmp(cst1, cst2);
-
-	if (cmp >= 0) {
-		isl_qpolynomial_free(qp2);
-	} else {
-		isl_qpolynomial_free(qp1);
-		qp1 = qp2;
-	}
-	return qp1;
-error:
-	isl_qpolynomial_free(qp1);
-	isl_qpolynomial_free(qp2);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_insert_dims(
-	__isl_take isl_qpolynomial *qp, enum isl_dim_type type,
-	unsigned first, unsigned n)
-{
-	unsigned total;
-	unsigned g_pos;
-	int *exp;
-
-	if (n == 0 && !isl_dim_is_named_or_nested(qp->dim, type))
-		return qp;
-
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		return NULL;
-
-	isl_assert(qp->div->ctx, first <= isl_dim_size(qp->dim, type),
-		    goto error);
-
-	g_pos = pos(qp->dim, type) + first;
-
-	qp->div = isl_mat_insert_zero_cols(qp->div, 2 + g_pos, n);
-	if (!qp->div)
-		goto error;
-
-	total = qp->div->n_col - 2;
-	if (total > g_pos) {
-		int i;
-		exp = isl_alloc_array(qp->div->ctx, int, total - g_pos);
-		if (!exp)
-			goto error;
-		for (i = 0; i < total - g_pos; ++i)
-			exp[i] = i + n;
-		qp->upoly = expand(qp->upoly, exp, g_pos);
-		free(exp);
-		if (!qp->upoly)
-			goto error;
-	}
-
-	qp->dim = isl_dim_insert(qp->dim, type, first, n);
-	if (!qp->dim)
-		goto error;
-
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_add_dims(
-	__isl_take isl_qpolynomial *qp, enum isl_dim_type type, unsigned n)
-{
-	unsigned pos;
-
-	pos = isl_qpolynomial_dim(qp, type);
-
-	return isl_qpolynomial_insert_dims(qp, type, pos, n);
-}
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add_dims(
-	__isl_take isl_pw_qpolynomial *pwqp,
-	enum isl_dim_type type, unsigned n)
-{
-	unsigned pos;
-
-	pos = isl_pw_qpolynomial_dim(pwqp, type);
-
-	return isl_pw_qpolynomial_insert_dims(pwqp, type, pos, n);
-}
-
-static int *reordering_move(isl_ctx *ctx,
-	unsigned len, unsigned dst, unsigned src, unsigned n)
-{
-	int i;
-	int *reordering;
-
-	reordering = isl_alloc_array(ctx, int, len);
-	if (!reordering)
-		return NULL;
-
-	if (dst <= src) {
-		for (i = 0; i < dst; ++i)
-			reordering[i] = i;
-		for (i = 0; i < n; ++i)
-			reordering[src + i] = dst + i;
-		for (i = 0; i < src - dst; ++i)
-			reordering[dst + i] = dst + n + i;
-		for (i = 0; i < len - src - n; ++i)
-			reordering[src + n + i] = src + n + i;
-	} else {
-		for (i = 0; i < src; ++i)
-			reordering[i] = i;
-		for (i = 0; i < n; ++i)
-			reordering[src + i] = dst + i;
-		for (i = 0; i < dst - src; ++i)
-			reordering[src + n + i] = src + i;
-		for (i = 0; i < len - dst - n; ++i)
-			reordering[dst + n + i] = dst + n + i;
-	}
-
-	return reordering;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_move_dims(
-	__isl_take isl_qpolynomial *qp,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n)
-{
-	unsigned g_dst_pos;
-	unsigned g_src_pos;
-	int *reordering;
-
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		return NULL;
-
-	isl_assert(qp->dim->ctx, src_pos + n <= isl_dim_size(qp->dim, src_type),
-		goto error);
-
-	g_dst_pos = pos(qp->dim, dst_type) + dst_pos;
-	g_src_pos = pos(qp->dim, src_type) + src_pos;
-	if (dst_type > src_type)
-		g_dst_pos -= n;
-
-	qp->div = isl_mat_move_cols(qp->div, 2 + g_dst_pos, 2 + g_src_pos, n);
-	if (!qp->div)
-		goto error;
-	qp = sort_divs(qp);
-	if (!qp)
-		goto error;
-
-	reordering = reordering_move(qp->dim->ctx,
-				qp->div->n_col - 2, g_dst_pos, g_src_pos, n);
-	if (!reordering)
-		goto error;
-
-	qp->upoly = reorder(qp->upoly, reordering);
-	free(reordering);
-	if (!qp->upoly)
-		goto error;
-
-	qp->dim = isl_dim_move(qp->dim, dst_type, dst_pos, src_type, src_pos, n);
-	if (!qp->dim)
-		goto error;
-
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_from_affine(__isl_take isl_dim *dim,
-	isl_int *f, isl_int denom)
-{
-	struct isl_upoly *up;
-
-	if (!dim)
-		return NULL;
-
-	up = isl_upoly_from_affine(dim->ctx, f, denom, 1 + isl_dim_total(dim));
-
-	return isl_qpolynomial_alloc(dim, 0, up);
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_from_aff(__isl_take isl_aff *aff)
-{
-	isl_ctx *ctx;
-	struct isl_upoly *up;
-	isl_qpolynomial *qp;
-
-	if (!aff)
-		return NULL;
-
-	ctx = isl_aff_get_ctx(aff);
-	up = isl_upoly_from_affine(ctx, aff->v->el + 1, aff->v->el[0],
-				    aff->v->size - 1);
-
-	qp = isl_qpolynomial_alloc(isl_aff_get_dim(aff),
-				    aff->ls->div->n_row, up);
-	if (!qp)
-		goto error;
-
-	isl_mat_free(qp->div);
-	qp->div = isl_mat_copy(aff->ls->div);
-	qp->div = isl_mat_cow(qp->div);
-	if (!qp->div)
-		goto error;
-
-	isl_aff_free(aff);
-	qp = reduce_divs(qp);
-	qp = remove_redundant_divs(qp);
-	return qp;
-error:
-	isl_aff_free(aff);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_from_constraint(
-	__isl_take isl_constraint *c, enum isl_dim_type type, unsigned pos)
-{
-	isl_aff *aff;
-
-	aff = isl_constraint_get_bound(c, type, pos);
-	isl_constraint_free(c);
-	return isl_qpolynomial_from_aff(aff);
-}
-
-/* For each 0 <= i < "n", replace variable "first" + i of type "type"
- * in "qp" by subs[i].
- */
-__isl_give isl_qpolynomial *isl_qpolynomial_substitute(
-	__isl_take isl_qpolynomial *qp,
-	enum isl_dim_type type, unsigned first, unsigned n,
-	__isl_keep isl_qpolynomial **subs)
-{
-	int i;
-	struct isl_upoly **ups;
-
-	if (n == 0)
-		return qp;
-
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		return NULL;
-	for (i = 0; i < n; ++i)
-		if (!subs[i])
-			goto error;
-
-	isl_assert(qp->dim->ctx, first + n <= isl_dim_size(qp->dim, type),
-			goto error);
-
-	for (i = 0; i < n; ++i)
-		isl_assert(qp->dim->ctx, isl_dim_equal(qp->dim, subs[i]->dim),
-				goto error);
-
-	isl_assert(qp->dim->ctx, qp->div->n_row == 0, goto error);
-	for (i = 0; i < n; ++i)
-		isl_assert(qp->dim->ctx, subs[i]->div->n_row == 0, goto error);
-
-	first += pos(qp->dim, type);
-
-	ups = isl_alloc_array(qp->dim->ctx, struct isl_upoly *, n);
-	if (!ups)
-		goto error;
-	for (i = 0; i < n; ++i)
-		ups[i] = subs[i]->upoly;
-
-	qp->upoly = isl_upoly_subs(qp->upoly, first, n, ups);
-
-	free(ups);
-
-	if (!qp->upoly)
-		goto error;
-
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-/* Extend "bset" with extra set dimensions for each integer division
- * in "qp" and then call "fn" with the extended bset and the polynomial
- * that results from replacing each of the integer divisions by the
- * corresponding extra set dimension.
- */
-int isl_qpolynomial_as_polynomial_on_domain(__isl_keep isl_qpolynomial *qp,
-	__isl_keep isl_basic_set *bset,
-	int (*fn)(__isl_take isl_basic_set *bset,
-		  __isl_take isl_qpolynomial *poly, void *user), void *user)
-{
-	isl_dim *dim;
-	isl_mat *div;
-	isl_qpolynomial *poly;
-
-	if (!qp || !bset)
-		goto error;
-	if (qp->div->n_row == 0)
-		return fn(isl_basic_set_copy(bset), isl_qpolynomial_copy(qp),
-			  user);
-
-	div = isl_mat_copy(qp->div);
-	dim = isl_dim_copy(qp->dim);
-	dim = isl_dim_add(dim, isl_dim_set, qp->div->n_row);
-	poly = isl_qpolynomial_alloc(dim, 0, isl_upoly_copy(qp->upoly));
-	bset = isl_basic_set_copy(bset);
-	bset = isl_basic_set_add(bset, isl_dim_set, qp->div->n_row);
-	bset = add_div_constraints(bset, div);
-
-	return fn(bset, poly, user);
-error:
-	return -1;
-}
-
-/* Return total degree in variables first (inclusive) up to last (exclusive).
- */
-int isl_upoly_degree(__isl_keep struct isl_upoly *up, int first, int last)
-{
-	int deg = -1;
-	int i;
-	struct isl_upoly_rec *rec;
-
-	if (!up)
-		return -2;
-	if (isl_upoly_is_zero(up))
-		return -1;
-	if (isl_upoly_is_cst(up) || up->var < first)
-		return 0;
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		return -2;
-
-	for (i = 0; i < rec->n; ++i) {
-		int d;
-
-		if (isl_upoly_is_zero(rec->p[i]))
-			continue;
-		d = isl_upoly_degree(rec->p[i], first, last);
-		if (up->var < last)
-			d += i;
-		if (d > deg)
-			deg = d;
-	}
-
-	return deg;
-}
-
-/* Return total degree in set variables.
- */
-int isl_qpolynomial_degree(__isl_keep isl_qpolynomial *poly)
-{
-	unsigned ovar;
-	unsigned nvar;
-
-	if (!poly)
-		return -2;
-
-	ovar = isl_dim_offset(poly->dim, isl_dim_set);
-	nvar = isl_dim_size(poly->dim, isl_dim_set);
-	return isl_upoly_degree(poly->upoly, ovar, ovar + nvar);
-}
-
-__isl_give struct isl_upoly *isl_upoly_coeff(__isl_keep struct isl_upoly *up,
-	unsigned pos, int deg)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-
-	if (!up)
-		return NULL;
-
-	if (isl_upoly_is_cst(up) || up->var < pos) {
-		if (deg == 0)
-			return isl_upoly_copy(up);
-		else
-			return isl_upoly_zero(up->ctx);
-	}
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		return NULL;
-
-	if (up->var == pos) {
-		if (deg < rec->n)
-			return isl_upoly_copy(rec->p[deg]);
-		else
-			return isl_upoly_zero(up->ctx);
-	}
-
-	up = isl_upoly_copy(up);
-	up = isl_upoly_cow(up);
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-
-	for (i = 0; i < rec->n; ++i) {
-		struct isl_upoly *t;
-		t = isl_upoly_coeff(rec->p[i], pos, deg);
-		if (!t)
-			goto error;
-		isl_upoly_free(rec->p[i]);
-		rec->p[i] = t;
-	}
-
-	return up;
-error:
-	isl_upoly_free(up);
-	return NULL;
-}
-
-/* Return coefficient of power "deg" of variable "t_pos" of type "type".
- */
-__isl_give isl_qpolynomial *isl_qpolynomial_coeff(
-	__isl_keep isl_qpolynomial *qp,
-	enum isl_dim_type type, unsigned t_pos, int deg)
-{
-	unsigned g_pos;
-	struct isl_upoly *up;
-	isl_qpolynomial *c;
-
-	if (!qp)
-		return NULL;
-
-	isl_assert(qp->div->ctx, t_pos < isl_dim_size(qp->dim, type),
-			return NULL);
-
-	g_pos = pos(qp->dim, type) + t_pos;
-	up = isl_upoly_coeff(qp->upoly, g_pos, deg);
-
-	c = isl_qpolynomial_alloc(isl_dim_copy(qp->dim), qp->div->n_row, up);
-	if (!c)
-		return NULL;
-	isl_mat_free(c->div);
-	c->div = isl_mat_copy(qp->div);
-	if (!c->div)
-		goto error;
-	return c;
-error:
-	isl_qpolynomial_free(c);
-	return NULL;
-}
-
-/* Homogenize the polynomial in the variables first (inclusive) up to
- * last (exclusive) by inserting powers of variable first.
- * Variable first is assumed not to appear in the input.
- */
-__isl_give struct isl_upoly *isl_upoly_homogenize(
-	__isl_take struct isl_upoly *up, int deg, int target,
-	int first, int last)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-
-	if (!up)
-		return NULL;
-	if (isl_upoly_is_zero(up))
-		return up;
-	if (deg == target)
-		return up;
-	if (isl_upoly_is_cst(up) || up->var < first) {
-		struct isl_upoly *hom;
-
-		hom = isl_upoly_var_pow(up->ctx, first, target - deg);
-		if (!hom)
-			goto error;
-		rec = isl_upoly_as_rec(hom);
-		rec->p[target - deg] = isl_upoly_mul(rec->p[target - deg], up);
-
-		return hom;
-	}
-
-	up = isl_upoly_cow(up);
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-
-	for (i = 0; i < rec->n; ++i) {
-		if (isl_upoly_is_zero(rec->p[i]))
-			continue;
-		rec->p[i] = isl_upoly_homogenize(rec->p[i],
-				up->var < last ? deg + i : i, target,
-				first, last);
-		if (!rec->p[i])
-			goto error;
-	}
-
-	return up;
-error:
-	isl_upoly_free(up);
-	return NULL;
-}
-
-/* Homogenize the polynomial in the set variables by introducing
- * powers of an extra set variable at position 0.
- */
-__isl_give isl_qpolynomial *isl_qpolynomial_homogenize(
-	__isl_take isl_qpolynomial *poly)
-{
-	unsigned ovar;
-	unsigned nvar;
-	int deg = isl_qpolynomial_degree(poly);
-
-	if (deg < -1)
-		goto error;
-
-	poly = isl_qpolynomial_insert_dims(poly, isl_dim_set, 0, 1);
-	poly = isl_qpolynomial_cow(poly);
-	if (!poly)
-		goto error;
-
-	ovar = isl_dim_offset(poly->dim, isl_dim_set);
-	nvar = isl_dim_size(poly->dim, isl_dim_set);
-	poly->upoly = isl_upoly_homogenize(poly->upoly, 0, deg,
-						ovar, ovar + nvar);
-	if (!poly->upoly)
-		goto error;
-
-	return poly;
-error:
-	isl_qpolynomial_free(poly);
-	return NULL;
-}
-
-__isl_give isl_term *isl_term_alloc(__isl_take isl_dim *dim,
-	__isl_take isl_mat *div)
-{
-	isl_term *term;
-	int n;
-
-	if (!dim || !div)
-		goto error;
-
-	n = isl_dim_total(dim) + div->n_row;
-
-	term = isl_calloc(dim->ctx, struct isl_term,
-			sizeof(struct isl_term) + (n - 1) * sizeof(int));
-	if (!term)
-		goto error;
-
-	term->ref = 1;
-	term->dim = dim;
-	term->div = div;
-	isl_int_init(term->n);
-	isl_int_init(term->d);
-	
-	return term;
-error:
-	isl_dim_free(dim);
-	isl_mat_free(div);
-	return NULL;
-}
-
-__isl_give isl_term *isl_term_copy(__isl_keep isl_term *term)
-{
-	if (!term)
-		return NULL;
-
-	term->ref++;
-	return term;
-}
-
-__isl_give isl_term *isl_term_dup(__isl_keep isl_term *term)
-{
-	int i;
-	isl_term *dup;
-	unsigned total;
-
-	if (term)
-		return NULL;
-
-	total = isl_dim_total(term->dim) + term->div->n_row;
-
-	dup = isl_term_alloc(isl_dim_copy(term->dim), isl_mat_copy(term->div));
-	if (!dup)
-		return NULL;
-
-	isl_int_set(dup->n, term->n);
-	isl_int_set(dup->d, term->d);
-
-	for (i = 0; i < total; ++i)
-		dup->pow[i] = term->pow[i];
-
-	return dup;
-}
-
-__isl_give isl_term *isl_term_cow(__isl_take isl_term *term)
-{
-	if (!term)
-		return NULL;
-
-	if (term->ref == 1)
-		return term;
-	term->ref--;
-	return isl_term_dup(term);
-}
-
-void isl_term_free(__isl_take isl_term *term)
-{
-	if (!term)
-		return;
-
-	if (--term->ref > 0)
-		return;
-
-	isl_dim_free(term->dim);
-	isl_mat_free(term->div);
-	isl_int_clear(term->n);
-	isl_int_clear(term->d);
-	free(term);
-}
-
-unsigned isl_term_dim(__isl_keep isl_term *term, enum isl_dim_type type)
-{
-	if (!term)
-		return 0;
-
-	switch (type) {
-	case isl_dim_param:
-	case isl_dim_in:
-	case isl_dim_out:	return isl_dim_size(term->dim, type);
-	case isl_dim_div:	return term->div->n_row;
-	case isl_dim_all:	return isl_dim_total(term->dim) + term->div->n_row;
-	default:		return 0;
-	}
-}
-
-isl_ctx *isl_term_get_ctx(__isl_keep isl_term *term)
-{
-	return term ? term->dim->ctx : NULL;
-}
-
-void isl_term_get_num(__isl_keep isl_term *term, isl_int *n)
-{
-	if (!term)
-		return;
-	isl_int_set(*n, term->n);
-}
-
-void isl_term_get_den(__isl_keep isl_term *term, isl_int *d)
-{
-	if (!term)
-		return;
-	isl_int_set(*d, term->d);
-}
-
-int isl_term_get_exp(__isl_keep isl_term *term,
-	enum isl_dim_type type, unsigned pos)
-{
-	if (!term)
-		return -1;
-
-	isl_assert(term->dim->ctx, pos < isl_term_dim(term, type), return -1);
-
-	if (type >= isl_dim_set)
-		pos += isl_dim_size(term->dim, isl_dim_param);
-	if (type >= isl_dim_div)
-		pos += isl_dim_size(term->dim, isl_dim_set);
-
-	return term->pow[pos];
-}
-
-__isl_give isl_div *isl_term_get_div(__isl_keep isl_term *term, unsigned pos)
-{
-	isl_basic_map *bmap;
-	unsigned total;
-	int k;
-
-	if (!term)
-		return NULL;
-
-	isl_assert(term->dim->ctx, pos < isl_term_dim(term, isl_dim_div),
-			return NULL);
-
-	total = term->div->n_col - term->div->n_row - 2;
-	/* No nested divs for now */
-	isl_assert(term->dim->ctx,
-		isl_seq_first_non_zero(term->div->row[pos] + 2 + total,
-					term->div->n_row) == -1,
-		return NULL);
-
-	bmap = isl_basic_map_alloc_dim(isl_dim_copy(term->dim), 1, 0, 0);
-	if ((k = isl_basic_map_alloc_div(bmap)) < 0)
-		goto error;
-
-	isl_seq_cpy(bmap->div[k], term->div->row[pos], 2 + total);
-
-	return isl_basic_map_div(bmap, k);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_term *isl_upoly_foreach_term(__isl_keep struct isl_upoly *up,
-	int (*fn)(__isl_take isl_term *term, void *user),
-	__isl_take isl_term *term, void *user)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-
-	if (!up || !term)
-		goto error;
-
-	if (isl_upoly_is_zero(up))
-		return term;
-
-	isl_assert(up->ctx, !isl_upoly_is_nan(up), goto error);
-	isl_assert(up->ctx, !isl_upoly_is_infty(up), goto error);
-	isl_assert(up->ctx, !isl_upoly_is_neginfty(up), goto error);
-
-	if (isl_upoly_is_cst(up)) {
-		struct isl_upoly_cst *cst;
-		cst = isl_upoly_as_cst(up);
-		if (!cst)
-			goto error;
-		term = isl_term_cow(term);
-		if (!term)
-			goto error;
-		isl_int_set(term->n, cst->n);
-		isl_int_set(term->d, cst->d);
-		if (fn(isl_term_copy(term), user) < 0)
-			goto error;
-		return term;
-	}
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-
-	for (i = 0; i < rec->n; ++i) {
-		term = isl_term_cow(term);
-		if (!term)
-			goto error;
-		term->pow[up->var] = i;
-		term = isl_upoly_foreach_term(rec->p[i], fn, term, user);
-		if (!term)
-			goto error;
-	}
-	term->pow[up->var] = 0;
-
-	return term;
-error:
-	isl_term_free(term);
-	return NULL;
-}
-
-int isl_qpolynomial_foreach_term(__isl_keep isl_qpolynomial *qp,
-	int (*fn)(__isl_take isl_term *term, void *user), void *user)
-{
-	isl_term *term;
-
-	if (!qp)
-		return -1;
-
-	term = isl_term_alloc(isl_dim_copy(qp->dim), isl_mat_copy(qp->div));
-	if (!term)
-		return -1;
-
-	term = isl_upoly_foreach_term(qp->upoly, fn, term, user);
-
-	isl_term_free(term);
-
-	return term ? 0 : -1;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_from_term(__isl_take isl_term *term)
-{
-	struct isl_upoly *up;
-	isl_qpolynomial *qp;
-	int i, n;
-
-	if (!term)
-		return NULL;
-
-	n = isl_dim_total(term->dim) + term->div->n_row;
-
-	up = isl_upoly_rat_cst(term->dim->ctx, term->n, term->d);
-	for (i = 0; i < n; ++i) {
-		if (!term->pow[i])
-			continue;
-		up = isl_upoly_mul(up,
-			isl_upoly_var_pow(term->dim->ctx, i, term->pow[i]));
-	}
-
-	qp = isl_qpolynomial_alloc(isl_dim_copy(term->dim), term->div->n_row, up);
-	if (!qp)
-		goto error;
-	isl_mat_free(qp->div);
-	qp->div = isl_mat_copy(term->div);
-	if (!qp->div)
-		goto error;
-
-	isl_term_free(term);
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	isl_term_free(term);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_lift(__isl_take isl_qpolynomial *qp,
-	__isl_take isl_dim *dim)
-{
-	int i;
-	int extra;
-	unsigned total;
-
-	if (!qp || !dim)
-		goto error;
-
-	if (isl_dim_equal(qp->dim, dim)) {
-		isl_dim_free(dim);
-		return qp;
-	}
-
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		goto error;
-
-	extra = isl_dim_size(dim, isl_dim_set) -
-			isl_dim_size(qp->dim, isl_dim_set);
-	total = isl_dim_total(qp->dim);
-	if (qp->div->n_row) {
-		int *exp;
-
-		exp = isl_alloc_array(qp->div->ctx, int, qp->div->n_row);
-		if (!exp)
-			goto error;
-		for (i = 0; i < qp->div->n_row; ++i)
-			exp[i] = extra + i;
-		qp->upoly = expand(qp->upoly, exp, total);
-		free(exp);
-		if (!qp->upoly)
-			goto error;
-	}
-	qp->div = isl_mat_insert_cols(qp->div, 2 + total, extra);
-	if (!qp->div)
-		goto error;
-	for (i = 0; i < qp->div->n_row; ++i)
-		isl_seq_clr(qp->div->row[i] + 2 + total, extra);
-
-	isl_dim_free(qp->dim);
-	qp->dim = dim;
-
-	return qp;
-error:
-	isl_dim_free(dim);
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-/* For each parameter or variable that does not appear in qp,
- * first eliminate the variable from all constraints and then set it to zero.
- */
-static __isl_give isl_set *fix_inactive(__isl_take isl_set *set,
-	__isl_keep isl_qpolynomial *qp)
-{
-	int *active = NULL;
-	int i;
-	int d;
-	unsigned nparam;
-	unsigned nvar;
-
-	if (!set || !qp)
-		goto error;
-
-	d = isl_dim_total(set->dim);
-	active = isl_calloc_array(set->ctx, int, d);
-	if (set_active(qp, active) < 0)
-		goto error;
-
-	for (i = 0; i < d; ++i)
-		if (!active[i])
-			break;
-
-	if (i == d) {
-		free(active);
-		return set;
-	}
-
-	nparam = isl_dim_size(set->dim, isl_dim_param);
-	nvar = isl_dim_size(set->dim, isl_dim_set);
-	for (i = 0; i < nparam; ++i) {
-		if (active[i])
-			continue;
-		set = isl_set_eliminate(set, isl_dim_param, i, 1);
-		set = isl_set_fix_si(set, isl_dim_param, i, 0);
-	}
-	for (i = 0; i < nvar; ++i) {
-		if (active[nparam + i])
-			continue;
-		set = isl_set_eliminate(set, isl_dim_set, i, 1);
-		set = isl_set_fix_si(set, isl_dim_set, i, 0);
-	}
-
-	free(active);
-
-	return set;
-error:
-	free(active);
-	isl_set_free(set);
-	return NULL;
-}
-
-struct isl_opt_data {
-	isl_qpolynomial *qp;
-	int first;
-	isl_qpolynomial *opt;
-	int max;
-};
-
-static int opt_fn(__isl_take isl_point *pnt, void *user)
-{
-	struct isl_opt_data *data = (struct isl_opt_data *)user;
-	isl_qpolynomial *val;
-
-	val = isl_qpolynomial_eval(isl_qpolynomial_copy(data->qp), pnt);
-	if (data->first) {
-		data->first = 0;
-		data->opt = val;
-	} else if (data->max) {
-		data->opt = isl_qpolynomial_max_cst(data->opt, val);
-	} else {
-		data->opt = isl_qpolynomial_min_cst(data->opt, val);
-	}
-
-	return 0;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_opt_on_domain(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_set *set, int max)
-{
-	struct isl_opt_data data = { NULL, 1, NULL, max };
-
-	if (!set || !qp)
-		goto error;
-
-	if (isl_upoly_is_cst(qp->upoly)) {
-		isl_set_free(set);
-		return qp;
-	}
-
-	set = fix_inactive(set, qp);
-
-	data.qp = qp;
-	if (isl_set_foreach_point(set, opt_fn, &data) < 0)
-		goto error;
-
-	if (data.first)
-		data.opt = isl_qpolynomial_zero(isl_qpolynomial_get_dim(qp));
-
-	isl_set_free(set);
-	isl_qpolynomial_free(qp);
-	return data.opt;
-error:
-	isl_set_free(set);
-	isl_qpolynomial_free(qp);
-	isl_qpolynomial_free(data.opt);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_morph(__isl_take isl_qpolynomial *qp,
-	__isl_take isl_morph *morph)
-{
-	int i;
-	int n_sub;
-	isl_ctx *ctx;
-	struct isl_upoly **subs;
-	isl_mat *mat;
-
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp || !morph)
-		goto error;
-
-	ctx = qp->dim->ctx;
-	isl_assert(ctx, isl_dim_equal(qp->dim, morph->dom->dim), goto error);
-
-	n_sub = morph->inv->n_row - 1;
-	if (morph->inv->n_row != morph->inv->n_col)
-		n_sub += qp->div->n_row;
-	subs = isl_calloc_array(ctx, struct isl_upoly *, n_sub);
-	if (!subs)
-		goto error;
-
-	for (i = 0; 1 + i < morph->inv->n_row; ++i)
-		subs[i] = isl_upoly_from_affine(ctx, morph->inv->row[1 + i],
-					morph->inv->row[0][0], morph->inv->n_col);
-	if (morph->inv->n_row != morph->inv->n_col)
-		for (i = 0; i < qp->div->n_row; ++i)
-			subs[morph->inv->n_row - 1 + i] =
-			    isl_upoly_var_pow(ctx, morph->inv->n_col - 1 + i, 1);
-
-	qp->upoly = isl_upoly_subs(qp->upoly, 0, n_sub, subs);
-
-	for (i = 0; i < n_sub; ++i)
-		isl_upoly_free(subs[i]);
-	free(subs);
-
-	mat = isl_mat_diagonal(isl_mat_identity(ctx, 1), isl_mat_copy(morph->inv));
-	mat = isl_mat_diagonal(mat, isl_mat_identity(ctx, qp->div->n_row));
-	qp->div = isl_mat_product(qp->div, mat);
-	isl_dim_free(qp->dim);
-	qp->dim = isl_dim_copy(morph->ran->dim);
-
-	if (!qp->upoly || !qp->div || !qp->dim)
-		goto error;
-
-	isl_morph_free(morph);
-
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	isl_morph_free(morph);
-	return NULL;
-}
-
-static int neg_entry(void **entry, void *user)
-{
-	isl_pw_qpolynomial **pwqp = (isl_pw_qpolynomial **)entry;
-
-	*pwqp = isl_pw_qpolynomial_neg(*pwqp);
-
-	return *pwqp ? 0 : -1;
-}
-
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_neg(
-	__isl_take isl_union_pw_qpolynomial *upwqp)
-{
-	upwqp = isl_union_pw_qpolynomial_cow(upwqp);
-	if (!upwqp)
-		return NULL;
-
-	if (isl_hash_table_foreach(upwqp->dim->ctx, &upwqp->table,
-				   &neg_entry, NULL) < 0)
-		goto error;
-
-	return upwqp;
-error:
-	isl_union_pw_qpolynomial_free(upwqp);
-	return NULL;
-}
-
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_sub(
-	__isl_take isl_union_pw_qpolynomial *upwqp1,
-	__isl_take isl_union_pw_qpolynomial *upwqp2)
-{
-	return isl_union_pw_qpolynomial_add(upwqp1,
-					isl_union_pw_qpolynomial_neg(upwqp2));
-}
-
-static int mul_entry(void **entry, void *user)
-{
-	struct isl_union_pw_qpolynomial_match_bin_data *data = user;
-	uint32_t hash;
-	struct isl_hash_table_entry *entry2;
-	isl_pw_qpolynomial *pwpq = *entry;
-	int empty;
-
-	hash = isl_dim_get_hash(pwpq->dim);
-	entry2 = isl_hash_table_find(data->u2->dim->ctx, &data->u2->table,
-				     hash, &has_dim, pwpq->dim, 0);
-	if (!entry2)
-		return 0;
-
-	pwpq = isl_pw_qpolynomial_copy(pwpq);
-	pwpq = isl_pw_qpolynomial_mul(pwpq,
-				      isl_pw_qpolynomial_copy(entry2->data));
-
-	empty = isl_pw_qpolynomial_is_zero(pwpq);
-	if (empty < 0) {
-		isl_pw_qpolynomial_free(pwpq);
-		return -1;
-	}
-	if (empty) {
-		isl_pw_qpolynomial_free(pwpq);
-		return 0;
-	}
-
-	data->res = isl_union_pw_qpolynomial_add_pw_qpolynomial(data->res, pwpq);
-
-	return 0;
-}
-
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_mul(
-	__isl_take isl_union_pw_qpolynomial *upwqp1,
-	__isl_take isl_union_pw_qpolynomial *upwqp2)
-{
-	return match_bin_op(upwqp1, upwqp2, &mul_entry);
-}
-
-/* Reorder the columns of the given div definitions according to the
- * given reordering.
- */
-static __isl_give isl_mat *reorder_divs(__isl_take isl_mat *div,
-	__isl_take isl_reordering *r)
-{
-	int i, j;
-	isl_mat *mat;
-	int extra;
-
-	if (!div || !r)
-		goto error;
-
-	extra = isl_dim_total(r->dim) + div->n_row - r->len;
-	mat = isl_mat_alloc(div->ctx, div->n_row, div->n_col + extra);
-	if (!mat)
-		goto error;
-
-	for (i = 0; i < div->n_row; ++i) {
-		isl_seq_cpy(mat->row[i], div->row[i], 2);
-		isl_seq_clr(mat->row[i] + 2, mat->n_col - 2);
-		for (j = 0; j < r->len; ++j)
-			isl_int_set(mat->row[i][2 + r->pos[j]],
-				    div->row[i][2 + j]);
-	}
-
-	isl_reordering_free(r);
-	isl_mat_free(div);
-	return mat;
-error:
-	isl_reordering_free(r);
-	isl_mat_free(div);
-	return NULL;
-}
-
-/* Reorder the dimension of "qp" according to the given reordering.
- */
-__isl_give isl_qpolynomial *isl_qpolynomial_realign(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_reordering *r)
-{
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		goto error;
-
-	r = isl_reordering_extend(r, qp->div->n_row);
-	if (!r)
-		goto error;
-
-	qp->div = reorder_divs(qp->div, isl_reordering_copy(r));
-	if (!qp->div)
-		goto error;
-
-	qp->upoly = reorder(qp->upoly, r->pos);
-	if (!qp->upoly)
-		goto error;
-
-	qp = isl_qpolynomial_reset_dim(qp, isl_dim_copy(r->dim));
-
-	isl_reordering_free(r);
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	isl_reordering_free(r);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_align_params(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_dim *model)
-{
-	if (!qp || !model)
-		goto error;
-
-	if (!isl_dim_match(qp->dim, isl_dim_param, model, isl_dim_param)) {
-		isl_reordering *exp;
-
-		model = isl_dim_drop(model, isl_dim_in,
-					0, isl_dim_size(model, isl_dim_in));
-		model = isl_dim_drop(model, isl_dim_out,
-					0, isl_dim_size(model, isl_dim_out));
-		exp = isl_parameter_alignment_reordering(qp->dim, model);
-		exp = isl_reordering_extend_dim(exp,
-						isl_qpolynomial_get_dim(qp));
-		qp = isl_qpolynomial_realign(qp, exp);
-	}
-
-	isl_dim_free(model);
-	return qp;
-error:
-	isl_dim_free(model);
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-struct isl_split_periods_data {
-	int max_periods;
-	isl_pw_qpolynomial *res;
-};
-
-/* Create a slice where the integer division "div" has the fixed value "v".
- * In particular, if "div" refers to floor(f/m), then create a slice
- *
- *	m v <= f <= m v + (m - 1)
- *
- * or
- *
- *	f - m v >= 0
- *	-f + m v + (m - 1) >= 0
- */
-static __isl_give isl_set *set_div_slice(__isl_take isl_dim *dim,
-	__isl_keep isl_qpolynomial *qp, int div, isl_int v)
-{
-	int total;
-	isl_basic_set *bset = NULL;
-	int k;
-
-	if (!dim || !qp)
-		goto error;
-
-	total = isl_dim_total(dim);
-	bset = isl_basic_set_alloc_dim(isl_dim_copy(dim), 0, 0, 2);
-
-	k = isl_basic_set_alloc_inequality(bset);
-	if (k < 0)
-		goto error;
-	isl_seq_cpy(bset->ineq[k], qp->div->row[div] + 1, 1 + total);
-	isl_int_submul(bset->ineq[k][0], v, qp->div->row[div][0]);
-
-	k = isl_basic_set_alloc_inequality(bset);
-	if (k < 0)
-		goto error;
-	isl_seq_neg(bset->ineq[k], qp->div->row[div] + 1, 1 + total);
-	isl_int_addmul(bset->ineq[k][0], v, qp->div->row[div][0]);
-	isl_int_add(bset->ineq[k][0], bset->ineq[k][0], qp->div->row[div][0]);
-	isl_int_sub_ui(bset->ineq[k][0], bset->ineq[k][0], 1);
-
-	isl_dim_free(dim);
-	return isl_set_from_basic_set(bset);
-error:
-	isl_basic_set_free(bset);
-	isl_dim_free(dim);
-	return NULL;
-}
-
-static int split_periods(__isl_take isl_set *set,
-	__isl_take isl_qpolynomial *qp, void *user);
-
-/* Create a slice of the domain "set" such that integer division "div"
- * has the fixed value "v" and add the results to data->res,
- * replacing the integer division by "v" in "qp".
- */
-static int set_div(__isl_take isl_set *set,
-	__isl_take isl_qpolynomial *qp, int div, isl_int v,
-	struct isl_split_periods_data *data)
-{
-	int i;
-	int total;
-	isl_set *slice;
-	struct isl_upoly *cst;
-
-	slice = set_div_slice(isl_set_get_dim(set), qp, div, v);
-	set = isl_set_intersect(set, slice);
-
-	if (!qp)
-		goto error;
-
-	total = isl_dim_total(qp->dim);
-
-	for (i = div + 1; i < qp->div->n_row; ++i) {
-		if (isl_int_is_zero(qp->div->row[i][2 + total + div]))
-			continue;
-		isl_int_addmul(qp->div->row[i][1],
-				qp->div->row[i][2 + total + div], v);
-		isl_int_set_si(qp->div->row[i][2 + total + div], 0);
-	}
-
-	cst = isl_upoly_rat_cst(qp->dim->ctx, v, qp->dim->ctx->one);
-	qp = substitute_div(qp, div, cst);
-
-	return split_periods(set, qp, data);
-error:
-	isl_set_free(set);
-	isl_qpolynomial_free(qp);
-	return -1;
-}
-
-/* Split the domain "set" such that integer division "div"
- * has a fixed value (ranging from "min" to "max") on each slice
- * and add the results to data->res.
- */
-static int split_div(__isl_take isl_set *set,
-	__isl_take isl_qpolynomial *qp, int div, isl_int min, isl_int max,
-	struct isl_split_periods_data *data)
-{
-	for (; isl_int_le(min, max); isl_int_add_ui(min, min, 1)) {
-		isl_set *set_i = isl_set_copy(set);
-		isl_qpolynomial *qp_i = isl_qpolynomial_copy(qp);
-
-		if (set_div(set_i, qp_i, div, min, data) < 0)
-			goto error;
-	}
-	isl_set_free(set);
-	isl_qpolynomial_free(qp);
-	return 0;
-error:
-	isl_set_free(set);
-	isl_qpolynomial_free(qp);
-	return -1;
-}
-
-/* If "qp" refers to any integer division
- * that can only attain "max_periods" distinct values on "set"
- * then split the domain along those distinct values.
- * Add the results (or the original if no splitting occurs)
- * to data->res.
- */
-static int split_periods(__isl_take isl_set *set,
-	__isl_take isl_qpolynomial *qp, void *user)
-{
-	int i;
-	isl_pw_qpolynomial *pwqp;
-	struct isl_split_periods_data *data;
-	isl_int min, max;
-	int total;
-	int r = 0;
-
-	data = (struct isl_split_periods_data *)user;
-
-	if (!set || !qp)
-		goto error;
-
-	if (qp->div->n_row == 0) {
-		pwqp = isl_pw_qpolynomial_alloc(set, qp);
-		data->res = isl_pw_qpolynomial_add_disjoint(data->res, pwqp);
-		return 0;
-	}
-
-	isl_int_init(min);
-	isl_int_init(max);
-	total = isl_dim_total(qp->dim);
-	for (i = 0; i < qp->div->n_row; ++i) {
-		enum isl_lp_result lp_res;
-
-		if (isl_seq_first_non_zero(qp->div->row[i] + 2 + total,
-						qp->div->n_row) != -1)
-			continue;
-
-		lp_res = isl_set_solve_lp(set, 0, qp->div->row[i] + 1,
-					  set->ctx->one, &min, NULL, NULL);
-		if (lp_res == isl_lp_error)
-			goto error2;
-		if (lp_res == isl_lp_unbounded || lp_res == isl_lp_empty)
-			continue;
-		isl_int_fdiv_q(min, min, qp->div->row[i][0]);
-
-		lp_res = isl_set_solve_lp(set, 1, qp->div->row[i] + 1,
-					  set->ctx->one, &max, NULL, NULL);
-		if (lp_res == isl_lp_error)
-			goto error2;
-		if (lp_res == isl_lp_unbounded || lp_res == isl_lp_empty)
-			continue;
-		isl_int_fdiv_q(max, max, qp->div->row[i][0]);
-
-		isl_int_sub(max, max, min);
-		if (isl_int_cmp_si(max, data->max_periods) < 0) {
-			isl_int_add(max, max, min);
-			break;
-		}
-	}
-
-	if (i < qp->div->n_row) {
-		r = split_div(set, qp, i, min, max, data);
-	} else {
-		pwqp = isl_pw_qpolynomial_alloc(set, qp);
-		data->res = isl_pw_qpolynomial_add_disjoint(data->res, pwqp);
-	}
-
-	isl_int_clear(max);
-	isl_int_clear(min);
-
-	return r;
-error2:
-	isl_int_clear(max);
-	isl_int_clear(min);
-error:
-	isl_set_free(set);
-	isl_qpolynomial_free(qp);
-	return -1;
-}
-
-/* If any quasi-polynomial in pwqp refers to any integer division
- * that can only attain "max_periods" distinct values on its domain
- * then split the domain along those distinct values.
- */
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_split_periods(
-	__isl_take isl_pw_qpolynomial *pwqp, int max_periods)
-{
-	struct isl_split_periods_data data;
-
-	data.max_periods = max_periods;
-	data.res = isl_pw_qpolynomial_zero(isl_pw_qpolynomial_get_dim(pwqp));
-
-	if (isl_pw_qpolynomial_foreach_piece(pwqp, &split_periods, &data) < 0)
-		goto error;
-
-	isl_pw_qpolynomial_free(pwqp);
-
-	return data.res;
-error:
-	isl_pw_qpolynomial_free(data.res);
-	isl_pw_qpolynomial_free(pwqp);
-	return NULL;
-}
-
-/* Construct a piecewise quasipolynomial that is constant on the given
- * domain.  In particular, it is
- *	0	if cst == 0
- *	1	if cst == 1
- *  infinity	if cst == -1
- */
-static __isl_give isl_pw_qpolynomial *constant_on_domain(
-	__isl_take isl_basic_set *bset, int cst)
-{
-	isl_dim *dim;
-	isl_qpolynomial *qp;
-
-	if (!bset)
-		return NULL;
-
-	bset = isl_basic_map_domain(isl_basic_map_from_range(bset));
-	dim = isl_basic_set_get_dim(bset);
-	if (cst < 0)
-		qp = isl_qpolynomial_infty(dim);
-	else if (cst == 0)
-		qp = isl_qpolynomial_zero(dim);
-	else
-		qp = isl_qpolynomial_one(dim);
-	return isl_pw_qpolynomial_alloc(isl_set_from_basic_set(bset), qp);
-}
-
-/* Factor bset, call fn on each of the factors and return the product.
- *
- * If no factors can be found, simply call fn on the input.
- * Otherwise, construct the factors based on the factorizer,
- * call fn on each factor and compute the product.
- */
-static __isl_give isl_pw_qpolynomial *compressed_multiplicative_call(
-	__isl_take isl_basic_set *bset,
-	__isl_give isl_pw_qpolynomial *(*fn)(__isl_take isl_basic_set *bset))
-{
-	int i, n;
-	isl_dim *dim;
-	isl_set *set;
-	isl_factorizer *f;
-	isl_qpolynomial *qp;
-	isl_pw_qpolynomial *pwqp;
-	unsigned nparam;
-	unsigned nvar;
-
-	f = isl_basic_set_factorizer(bset);
-	if (!f)
-		goto error;
-	if (f->n_group == 0) {
-		isl_factorizer_free(f);
-		return fn(bset);
-	}
-
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-
-	dim = isl_basic_set_get_dim(bset);
-	dim = isl_dim_domain(dim);
-	set = isl_set_universe(isl_dim_copy(dim));
-	qp = isl_qpolynomial_one(dim);
-	pwqp = isl_pw_qpolynomial_alloc(set, qp);
-
-	bset = isl_morph_basic_set(isl_morph_copy(f->morph), bset);
-
-	for (i = 0, n = 0; i < f->n_group; ++i) {
-		isl_basic_set *bset_i;
-		isl_pw_qpolynomial *pwqp_i;
-
-		bset_i = isl_basic_set_copy(bset);
-		bset_i = isl_basic_set_drop_constraints_involving(bset_i,
-			    nparam + n + f->len[i], nvar - n - f->len[i]);
-		bset_i = isl_basic_set_drop_constraints_involving(bset_i,
-			    nparam, n);
-		bset_i = isl_basic_set_drop(bset_i, isl_dim_set,
-			    n + f->len[i], nvar - n - f->len[i]);
-		bset_i = isl_basic_set_drop(bset_i, isl_dim_set, 0, n);
-
-		pwqp_i = fn(bset_i);
-		pwqp = isl_pw_qpolynomial_mul(pwqp, pwqp_i);
-
-		n += f->len[i];
-	}
-
-	isl_basic_set_free(bset);
-	isl_factorizer_free(f);
-
-	return pwqp;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Factor bset, call fn on each of the factors and return the product.
- * The function is assumed to evaluate to zero on empty domains,
- * to one on zero-dimensional domains and to infinity on unbounded domains
- * and will not be called explicitly on zero-dimensional or unbounded domains.
- *
- * We first check for some special cases and remove all equalities.
- * Then we hand over control to compressed_multiplicative_call.
- */
-__isl_give isl_pw_qpolynomial *isl_basic_set_multiplicative_call(
-	__isl_take isl_basic_set *bset,
-	__isl_give isl_pw_qpolynomial *(*fn)(__isl_take isl_basic_set *bset))
-{
-	int bounded;
-	isl_morph *morph;
-	isl_pw_qpolynomial *pwqp;
-	unsigned orig_nvar, final_nvar;
-
-	if (!bset)
-		return NULL;
-
-	if (isl_basic_set_plain_is_empty(bset))
-		return constant_on_domain(bset, 0);
-
-	orig_nvar = isl_basic_set_dim(bset, isl_dim_set);
-
-	if (orig_nvar == 0)
-		return constant_on_domain(bset, 1);
-
-	bounded = isl_basic_set_is_bounded(bset);
-	if (bounded < 0)
-		goto error;
-	if (!bounded)
-		return constant_on_domain(bset, -1);
-
-	if (bset->n_eq == 0)
-		return compressed_multiplicative_call(bset, fn);
-
-	morph = isl_basic_set_full_compression(bset);
-	bset = isl_morph_basic_set(isl_morph_copy(morph), bset);
-
-	final_nvar = isl_basic_set_dim(bset, isl_dim_set);
-
-	pwqp = compressed_multiplicative_call(bset, fn);
-
-	morph = isl_morph_remove_dom_dims(morph, isl_dim_set, 0, orig_nvar);
-	morph = isl_morph_remove_ran_dims(morph, isl_dim_set, 0, final_nvar);
-	morph = isl_morph_inverse(morph);
-
-	pwqp = isl_pw_qpolynomial_morph(pwqp, morph);
-
-	return pwqp;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Drop all floors in "qp", turning each integer division [a/m] into
- * a rational division a/m.  If "down" is set, then the integer division
- * is replaces by (a-(m-1))/m instead.
- */
-static __isl_give isl_qpolynomial *qp_drop_floors(
-	__isl_take isl_qpolynomial *qp, int down)
-{
-	int i;
-	struct isl_upoly *s;
-
-	if (!qp)
-		return NULL;
-	if (qp->div->n_row == 0)
-		return qp;
-
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		return NULL;
-
-	for (i = qp->div->n_row - 1; i >= 0; --i) {
-		if (down) {
-			isl_int_sub(qp->div->row[i][1],
-				    qp->div->row[i][1], qp->div->row[i][0]);
-			isl_int_add_ui(qp->div->row[i][1],
-				       qp->div->row[i][1], 1);
-		}
-		s = isl_upoly_from_affine(qp->dim->ctx, qp->div->row[i] + 1,
-					qp->div->row[i][0], qp->div->n_col - 1);
-		qp = substitute_div(qp, i, s);
-		if (!qp)
-			return NULL;
-	}
-
-	return qp;
-}
-
-/* Drop all floors in "pwqp", turning each integer division [a/m] into
- * a rational division a/m.
- */
-static __isl_give isl_pw_qpolynomial *pwqp_drop_floors(
-	__isl_take isl_pw_qpolynomial *pwqp)
-{
-	int i;
-
-	if (!pwqp)
-		return NULL;
-
-	if (isl_pw_qpolynomial_is_zero(pwqp))
-		return pwqp;
-
-	pwqp = isl_pw_qpolynomial_cow(pwqp);
-	if (!pwqp)
-		return NULL;
-
-	for (i = 0; i < pwqp->n; ++i) {
-		pwqp->p[i].qp = qp_drop_floors(pwqp->p[i].qp, 0);
-		if (!pwqp->p[i].qp)
-			goto error;
-	}
-
-	return pwqp;
-error:
-	isl_pw_qpolynomial_free(pwqp);
-	return NULL;
-}
-
-/* Adjust all the integer divisions in "qp" such that they are at least
- * one over the given orthant (identified by "signs").  This ensures
- * that they will still be non-negative even after subtracting (m-1)/m.
- *
- * In particular, f is replaced by f' + v, changing f = [a/m]
- * to f' = [(a - m v)/m].
- * If the constant term k in a is smaller than m,
- * the constant term of v is set to floor(k/m) - 1.
- * For any other term, if the coefficient c and the variable x have
- * the same sign, then no changes are needed.
- * Otherwise, if the variable is positive (and c is negative),
- * then the coefficient of x in v is set to floor(c/m).
- * If the variable is negative (and c is positive),
- * then the coefficient of x in v is set to ceil(c/m).
- */
-static __isl_give isl_qpolynomial *make_divs_pos(__isl_take isl_qpolynomial *qp,
-	int *signs)
-{
-	int i, j;
-	int total;
-	isl_vec *v = NULL;
-	struct isl_upoly *s;
-
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		return NULL;
-	qp->div = isl_mat_cow(qp->div);
-	if (!qp->div)
-		goto error;
-
-	total = isl_dim_total(qp->dim);
-	v = isl_vec_alloc(qp->div->ctx, qp->div->n_col - 1);
-
-	for (i = 0; i < qp->div->n_row; ++i) {
-		isl_int *row = qp->div->row[i];
-		v = isl_vec_clr(v);
-		if (!v)
-			goto error;
-		if (isl_int_lt(row[1], row[0])) {
-			isl_int_fdiv_q(v->el[0], row[1], row[0]);
-			isl_int_sub_ui(v->el[0], v->el[0], 1);
-			isl_int_submul(row[1], row[0], v->el[0]);
-		}
-		for (j = 0; j < total; ++j) {
-			if (isl_int_sgn(row[2 + j]) * signs[j] >= 0)
-				continue;
-			if (signs[j] < 0)
-				isl_int_cdiv_q(v->el[1 + j], row[2 + j], row[0]);
-			else
-				isl_int_fdiv_q(v->el[1 + j], row[2 + j], row[0]);
-			isl_int_submul(row[2 + j], row[0], v->el[1 + j]);
-		}
-		for (j = 0; j < i; ++j) {
-			if (isl_int_sgn(row[2 + total + j]) >= 0)
-				continue;
-			isl_int_fdiv_q(v->el[1 + total + j],
-					row[2 + total + j], row[0]);
-			isl_int_submul(row[2 + total + j],
-					row[0], v->el[1 + total + j]);
-		}
-		for (j = i + 1; j < qp->div->n_row; ++j) {
-			if (isl_int_is_zero(qp->div->row[j][2 + total + i]))
-				continue;
-			isl_seq_combine(qp->div->row[j] + 1,
-				qp->div->ctx->one, qp->div->row[j] + 1,
-				qp->div->row[j][2 + total + i], v->el, v->size);
-		}
-		isl_int_set_si(v->el[1 + total + i], 1);
-		s = isl_upoly_from_affine(qp->dim->ctx, v->el,
-					qp->div->ctx->one, v->size);
-		qp->upoly = isl_upoly_subs(qp->upoly, total + i, 1, &s);
-		isl_upoly_free(s);
-		if (!qp->upoly)
-			goto error;
-	}
-
-	isl_vec_free(v);
-	return qp;
-error:
-	isl_vec_free(v);
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-struct isl_to_poly_data {
-	int sign;
-	isl_pw_qpolynomial *res;
-	isl_qpolynomial *qp;
-};
-
-/* Appoximate data->qp by a polynomial on the orthant identified by "signs".
- * We first make all integer divisions positive and then split the
- * quasipolynomials into terms with sign data->sign (the direction
- * of the requested approximation) and terms with the opposite sign.
- * In the first set of terms, each integer division [a/m] is
- * overapproximated by a/m, while in the second it is underapproximated
- * by (a-(m-1))/m.
- */
-static int to_polynomial_on_orthant(__isl_take isl_set *orthant, int *signs,
-	void *user)
-{
-	struct isl_to_poly_data *data = user;
-	isl_pw_qpolynomial *t;
-	isl_qpolynomial *qp, *up, *down;
-
-	qp = isl_qpolynomial_copy(data->qp);
-	qp = make_divs_pos(qp, signs);
-
-	up = isl_qpolynomial_terms_of_sign(qp, signs, data->sign);
-	up = qp_drop_floors(up, 0);
-	down = isl_qpolynomial_terms_of_sign(qp, signs, -data->sign);
-	down = qp_drop_floors(down, 1);
-
-	isl_qpolynomial_free(qp);
-	qp = isl_qpolynomial_add(up, down);
-
-	t = isl_pw_qpolynomial_alloc(orthant, qp);
-	data->res = isl_pw_qpolynomial_add_disjoint(data->res, t);
-
-	return 0;
-}
-
-/* Approximate each quasipolynomial by a polynomial.  If "sign" is positive,
- * the polynomial will be an overapproximation.  If "sign" is negative,
- * it will be an underapproximation.  If "sign" is zero, the approximation
- * will lie somewhere in between.
- *
- * In particular, is sign == 0, we simply drop the floors, turning
- * the integer divisions into rational divisions.
- * Otherwise, we split the domains into orthants, make all integer divisions
- * positive and then approximate each [a/m] by either a/m or (a-(m-1))/m,
- * depending on the requested sign and the sign of the term in which
- * the integer division appears.
- */
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_to_polynomial(
-	__isl_take isl_pw_qpolynomial *pwqp, int sign)
-{
-	int i;
-	struct isl_to_poly_data data;
-
-	if (sign == 0)
-		return pwqp_drop_floors(pwqp);
-
-	if (!pwqp)
-		return NULL;
-
-	data.sign = sign;
-	data.res = isl_pw_qpolynomial_zero(isl_pw_qpolynomial_get_dim(pwqp));
-
-	for (i = 0; i < pwqp->n; ++i) {
-		if (pwqp->p[i].qp->div->n_row == 0) {
-			isl_pw_qpolynomial *t;
-			t = isl_pw_qpolynomial_alloc(
-					isl_set_copy(pwqp->p[i].set),
-					isl_qpolynomial_copy(pwqp->p[i].qp));
-			data.res = isl_pw_qpolynomial_add_disjoint(data.res, t);
-			continue;
-		}
-		data.qp = pwqp->p[i].qp;
-		if (isl_set_foreach_orthant(pwqp->p[i].set,
-					&to_polynomial_on_orthant, &data) < 0)
-			goto error;
-	}
-
-	isl_pw_qpolynomial_free(pwqp);
-
-	return data.res;
-error:
-	isl_pw_qpolynomial_free(pwqp);
-	isl_pw_qpolynomial_free(data.res);
-	return NULL;
-}
-
-static int poly_entry(void **entry, void *user)
-{
-	int *sign = user;
-	isl_pw_qpolynomial **pwqp = (isl_pw_qpolynomial **)entry;
-
-	*pwqp = isl_pw_qpolynomial_to_polynomial(*pwqp, *sign);
-
-	return *pwqp ? 0 : -1;
-}
-
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_to_polynomial(
-	__isl_take isl_union_pw_qpolynomial *upwqp, int sign)
-{
-	upwqp = isl_union_pw_qpolynomial_cow(upwqp);
-	if (!upwqp)
-		return NULL;
-
-	if (isl_hash_table_foreach(upwqp->dim->ctx, &upwqp->table,
-				   &poly_entry, &sign) < 0)
-		goto error;
-
-	return upwqp;
-error:
-	isl_union_pw_qpolynomial_free(upwqp);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_from_qpolynomial(
-	__isl_take isl_qpolynomial *qp)
-{
-	int i, k;
-	isl_dim *dim;
-	isl_vec *aff = NULL;
-	isl_basic_map *bmap = NULL;
-	unsigned pos;
-	unsigned n_div;
-
-	if (!qp)
-		return NULL;
-	if (!isl_upoly_is_affine(qp->upoly))
-		isl_die(qp->dim->ctx, isl_error_invalid,
-			"input quasi-polynomial not affine", goto error);
-	aff = isl_qpolynomial_extract_affine(qp);
-	if (!aff)
-		goto error;
-	dim = isl_qpolynomial_get_dim(qp);
-	dim = isl_dim_from_domain(dim);
-	pos = 1 + isl_dim_offset(dim, isl_dim_out);
-	dim = isl_dim_add(dim, isl_dim_out, 1);
-	n_div = qp->div->n_row;
-	bmap = isl_basic_map_alloc_dim(dim, n_div, 1, 2 * n_div);
-
-	for (i = 0; i < n_div; ++i) {
-		k = isl_basic_map_alloc_div(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(bmap->div[k], qp->div->row[i], qp->div->n_col);
-		isl_int_set_si(bmap->div[k][qp->div->n_col], 0);
-		if (isl_basic_map_add_div_constraints(bmap, k) < 0)
-			goto error;
-	}
-	k = isl_basic_map_alloc_equality(bmap);
-	if (k < 0)
-		goto error;
-	isl_int_neg(bmap->eq[k][pos], aff->el[0]);
-	isl_seq_cpy(bmap->eq[k], aff->el + 1, pos);
-	isl_seq_cpy(bmap->eq[k] + pos + 1, aff->el + 1 + pos, n_div);
-
-	isl_vec_free(aff);
-	isl_qpolynomial_free(qp);
-	bmap = isl_basic_map_finalize(bmap);
-	return bmap;
-error:
-	isl_vec_free(aff);
-	isl_qpolynomial_free(qp);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
diff --git a/cloog-0.16.3/isl/isl_polynomial_private.h b/cloog-0.16.3/isl/isl_polynomial_private.h
deleted file mode 100644
index 8f6a7b7..0000000
--- a/cloog-0.16.3/isl/isl_polynomial_private.h
+++ /dev/null
@@ -1,215 +0,0 @@
-#include <stdio.h>
-#include <isl/div.h>
-#include <isl/map.h>
-#include <isl/mat.h>
-#include <isl_morph.h>
-#include <isl/polynomial.h>
-#include <isl_reordering.h>
-
-struct isl_upoly {
-	int ref;
-	struct isl_ctx *ctx;
-
-	int var;
-};
-
-struct isl_upoly_cst {
-	struct isl_upoly up;
-	isl_int n;
-	isl_int d;
-};
-
-struct isl_upoly_rec {
-	struct isl_upoly up;
-	int n;
-
-	size_t size;
-	struct isl_upoly *p[];
-};
-
-struct isl_qpolynomial {
-	int ref;
-
-	struct isl_dim *dim;
-	struct isl_mat *div;
-	struct isl_upoly *upoly;
-};
-
-struct isl_term {
-	int ref;
-
-	isl_int n;
-	isl_int d;
-
-	struct isl_dim *dim;
-	struct isl_mat *div;
-
-	int pow[1];
-};
-
-struct isl_pw_qpolynomial_piece {
-	struct isl_set *set;
-	struct isl_qpolynomial *qp;
-};
-
-struct isl_pw_qpolynomial {
-	int ref;
-
-	struct isl_dim *dim;
-
-	int n;
-
-	size_t size;
-	struct isl_pw_qpolynomial_piece p[1];
-};
-
-struct isl_qpolynomial_fold {
-	int ref;
-
-	enum isl_fold type;
-	struct isl_dim *dim;
-
-	int n;
-
-	size_t size;
-	struct isl_qpolynomial *qp[1];
-};
-
-struct isl_pw_qpolynomial_fold_piece {
-	struct isl_set *set;
-	struct isl_qpolynomial_fold *fold;
-};
-
-struct isl_pw_qpolynomial_fold {
-	int ref;
-
-	enum isl_fold type;
-	struct isl_dim *dim;
-
-	int n;
-
-	size_t size;
-	struct isl_pw_qpolynomial_fold_piece p[1];
-};
-
-__isl_give struct isl_upoly *isl_upoly_zero(struct isl_ctx *ctx);
-__isl_give struct isl_upoly *isl_upoly_copy(__isl_keep struct isl_upoly *up);
-__isl_give struct isl_upoly *isl_upoly_cow(__isl_take struct isl_upoly *up);
-__isl_give struct isl_upoly *isl_upoly_dup(__isl_keep struct isl_upoly *up);
-void isl_upoly_free(__isl_take struct isl_upoly *up);
-__isl_give struct isl_upoly *isl_upoly_mul(__isl_take struct isl_upoly *up1,
-	__isl_take struct isl_upoly *up2);
-
-int isl_upoly_is_cst(__isl_keep struct isl_upoly *up);
-int isl_upoly_is_zero(__isl_keep struct isl_upoly *up);
-int isl_upoly_is_one(__isl_keep struct isl_upoly *up);
-int isl_upoly_is_negone(__isl_keep struct isl_upoly *up);
-__isl_keep struct isl_upoly_cst *isl_upoly_as_cst(__isl_keep struct isl_upoly *up);
-__isl_keep struct isl_upoly_rec *isl_upoly_as_rec(__isl_keep struct isl_upoly *up);
-
-__isl_give struct isl_upoly *isl_upoly_sum(__isl_take struct isl_upoly *up1,
-	__isl_take struct isl_upoly *up2);
-__isl_give struct isl_upoly *isl_upoly_mul_isl_int(
-	__isl_take struct isl_upoly *up, isl_int v);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_alloc(__isl_take isl_dim *dim,
-	unsigned n_div, __isl_take struct isl_upoly *up);
-__isl_give isl_qpolynomial *isl_qpolynomial_cow(__isl_take isl_qpolynomial *qp);
-__isl_give isl_qpolynomial *isl_qpolynomial_dup(__isl_keep isl_qpolynomial *qp);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_cst(__isl_take isl_dim *dim,
-	isl_int v);
-__isl_give isl_qpolynomial *isl_qpolynomial_var_pow(__isl_take isl_dim *dim,
-	int pos, int power);
-__isl_give isl_qpolynomial *isl_qpolynomial_div_pow(__isl_take isl_div *div,
-	int power);
-int isl_qpolynomial_is_one(__isl_keep isl_qpolynomial *qp);
-int isl_qpolynomial_is_affine(__isl_keep isl_qpolynomial *qp);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_add_on_domain(
-	__isl_keep isl_set *dom,
-	__isl_take isl_qpolynomial *qp1,
-	__isl_take isl_qpolynomial *qp2);
-
-int isl_qpolynomial_le_cst(__isl_keep isl_qpolynomial *qp1,
-	__isl_keep isl_qpolynomial *qp2);
-__isl_give isl_qpolynomial *isl_qpolynomial_max_cst(
-	__isl_take isl_qpolynomial *qp1, __isl_take isl_qpolynomial *qp2);
-__isl_give isl_qpolynomial *isl_qpolynomial_min_cst(
-	__isl_take isl_qpolynomial *qp1, __isl_take isl_qpolynomial *qp2);
-
-int isl_qpolynomial_degree(__isl_keep isl_qpolynomial *poly);
-__isl_give isl_qpolynomial *isl_qpolynomial_coeff(
-	__isl_keep isl_qpolynomial *poly,
-	enum isl_dim_type type, unsigned pos, int deg);
-
-__isl_give isl_vec *isl_qpolynomial_extract_affine(
-	__isl_keep isl_qpolynomial *qp);
-__isl_give isl_qpolynomial *isl_qpolynomial_from_affine(__isl_take isl_dim *dim,
-	isl_int *f, isl_int denom);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_cow(
-	__isl_take isl_pw_qpolynomial *pwqp);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add_piece(
-	__isl_take isl_pw_qpolynomial *pwqp,
-	__isl_take isl_set *set, __isl_take isl_qpolynomial *qp);
-int isl_pw_qpolynomial_is_one(__isl_keep isl_pw_qpolynomial *pwqp);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_opt_on_domain(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_set *set, int max);
-
-enum isl_fold isl_fold_type_negate(enum isl_fold type);
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_cow(
-	__isl_take isl_qpolynomial_fold *fold);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_dup(
-	__isl_keep isl_qpolynomial_fold *fold);
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_cow(
-	__isl_take isl_pw_qpolynomial_fold *pwf);
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_add_on_domain(
-	__isl_keep isl_set *set,
-	__isl_take isl_qpolynomial_fold *fold1,
-	__isl_take isl_qpolynomial_fold *fold2);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_fold_on_domain(
-	__isl_keep isl_set *set,
-	__isl_take isl_qpolynomial_fold *fold1,
-	__isl_take isl_qpolynomial_fold *fold2);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_fold_opt_on_domain(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_set *set, int max);
-
-int isl_pw_qpolynomial_fold_covers(__isl_keep isl_pw_qpolynomial_fold *pwf1,
-	__isl_keep isl_pw_qpolynomial_fold *pwf2);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_morph(__isl_take isl_qpolynomial *qp,
-	__isl_take isl_morph *morph);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_morph(
-	__isl_take isl_pw_qpolynomial *pwqp, __isl_take isl_morph *morph);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_morph(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_morph *morph);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_morph(
-	__isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_morph *morph);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_lift(__isl_take isl_qpolynomial *qp,
-	__isl_take isl_dim *dim);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_lift(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_dim *dim);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_substitute_equalities(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_basic_set *eq);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_substitute_equalities(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_basic_set *eq);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_gist(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_set *context);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_realign(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_reordering *r);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_realign(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_reordering *r);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_realign(
-	__isl_take isl_pw_qpolynomial *pwqp, __isl_take isl_reordering *r);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_realign(
-	__isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_reordering *r);
diff --git a/cloog-0.16.3/isl/isl_printer.c b/cloog-0.16.3/isl/isl_printer.c
deleted file mode 100644
index fe8fab9..0000000
--- a/cloog-0.16.3/isl/isl_printer.c
+++ /dev/null
@@ -1,366 +0,0 @@
-#include <string.h>
-#include <isl_printer_private.h>
-
-static __isl_give isl_printer *file_start_line(__isl_take isl_printer *p)
-{
-	fprintf(p->file, "%*s%s", p->indent, "", p->prefix ? p->prefix : "");
-	return p;
-}
-
-static __isl_give isl_printer *file_end_line(__isl_take isl_printer *p)
-{
-	fprintf(p->file, "%s\n", p->suffix ? p->suffix : "");
-	return p;
-}
-
-static __isl_give isl_printer *file_flush(__isl_take isl_printer *p)
-{
-	fflush(p->file);
-	return p;
-}
-
-static __isl_give isl_printer *file_print_str(__isl_take isl_printer *p,
-	const char *s)
-{
-	fprintf(p->file, "%s", s);
-	return p;
-}
-
-static __isl_give isl_printer *file_print_int(__isl_take isl_printer *p, int i)
-{
-	fprintf(p->file, "%d", i);
-	return p;
-}
-
-static __isl_give isl_printer *file_print_isl_int(__isl_take isl_printer *p, isl_int i)
-{
-	isl_int_print(p->file, i, p->width);
-	return p;
-}
-
-static int grow_buf(__isl_keep isl_printer *p, int extra)
-{
-	int new_size;
-	char *new_buf;
-
-	if (p->buf_size == 0)
-		return -1;
-
-	new_size = ((p->buf_n + extra + 1) * 3) / 2;
-	new_buf = isl_realloc_array(p->ctx, p->buf, char, new_size);
-	if (!new_buf) {
-		p->buf_size = 0;
-		return -1;
-	}
-	p->buf = new_buf;
-	p->buf_size = new_size;
-
-	return 0;
-}
-
-static __isl_give isl_printer *str_print(__isl_take isl_printer *p,
-	const char *s, int len)
-{
-	if (p->buf_n + len + 1 >= p->buf_size && grow_buf(p, len))
-		goto error;
-	memcpy(p->buf + p->buf_n, s, len);
-	p->buf_n += len;
-
-	p->buf[p->buf_n] = '\0';
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *str_print_indent(__isl_take isl_printer *p,
-	int indent)
-{
-	int i;
-
-	if (p->buf_n + indent + 1 >= p->buf_size && grow_buf(p, indent))
-		goto error;
-	for (i = 0; i < indent; ++i)
-		p->buf[p->buf_n++] = ' ';
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *str_start_line(__isl_take isl_printer *p)
-{
-	p = str_print_indent(p, p->indent);
-	if (p->prefix)
-		p = str_print(p, p->prefix, strlen(p->prefix));
-	return p;
-}
-
-static __isl_give isl_printer *str_end_line(__isl_take isl_printer *p)
-{
-	if (p->suffix)
-		p = str_print(p, p->suffix, strlen(p->suffix));
-	p = str_print(p, "\n", strlen("\n"));
-	return p;
-}
-
-static __isl_give isl_printer *str_flush(__isl_take isl_printer *p)
-{
-	p->buf_n = 0;
-	return p;
-}
-
-static __isl_give isl_printer *str_print_str(__isl_take isl_printer *p,
-	const char *s)
-{
-	return str_print(p, s, strlen(s));
-}
-
-static __isl_give isl_printer *str_print_int(__isl_take isl_printer *p, int i)
-{
-	int left = p->buf_size - p->buf_n;
-	int need = snprintf(p->buf + p->buf_n, left, "%d", i);
-	if (need >= left) {
-		if (grow_buf(p, need))
-			goto error;
-		left = p->buf_size - p->buf_n;
-		need = snprintf(p->buf + p->buf_n, left, "%d", i);
-	}
-	p->buf_n += need;
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *str_print_isl_int(__isl_take isl_printer *p,
-	isl_int i)
-{
-	char *s;
-	int len;
-	isl_int_print_gmp_free_t gmp_free;
-
-	s = isl_int_get_str(i);
-	len = strlen(s);
-	if (len < p->width)
-		p = str_print_indent(p, p->width - len);
-	p = str_print(p, s, len);
-	mp_get_memory_functions(NULL, NULL, &gmp_free);
-	(*gmp_free)(s, len + 1);
-	return p;
-}
-
-struct isl_printer_ops {
-	__isl_give isl_printer *(*start_line)(__isl_take isl_printer *p);
-	__isl_give isl_printer *(*end_line)(__isl_take isl_printer *p);
-	__isl_give isl_printer *(*print_int)(__isl_take isl_printer *p, int i);
-	__isl_give isl_printer *(*print_isl_int)(__isl_take isl_printer *p,
-						isl_int i);
-	__isl_give isl_printer *(*print_str)(__isl_take isl_printer *p,
-						const char *s);
-	__isl_give isl_printer *(*flush)(__isl_take isl_printer *p);
-};
-
-static struct isl_printer_ops file_ops = {
-	file_start_line,
-	file_end_line,
-	file_print_int,
-	file_print_isl_int,
-	file_print_str,
-	file_flush
-};
-
-static struct isl_printer_ops str_ops = {
-	str_start_line,
-	str_end_line,
-	str_print_int,
-	str_print_isl_int,
-	str_print_str,
-	str_flush
-};
-
-__isl_give isl_printer *isl_printer_to_file(isl_ctx *ctx, FILE *file)
-{
-	struct isl_printer *p = isl_alloc_type(ctx, struct isl_printer);
-	if (!p)
-		return NULL;
-	p->ctx = ctx;
-	isl_ctx_ref(p->ctx);
-	p->ops = &file_ops;
-	p->file = file;
-	p->buf = NULL;
-	p->buf_n = 0;
-	p->buf_size = 0;
-	p->indent = 0;
-	p->output_format = ISL_FORMAT_ISL;
-	p->prefix = NULL;
-	p->suffix = NULL;
-	p->width = 0;
-
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_to_str(isl_ctx *ctx)
-{
-	struct isl_printer *p = isl_alloc_type(ctx, struct isl_printer);
-	if (!p)
-		return NULL;
-	p->ctx = ctx;
-	isl_ctx_ref(p->ctx);
-	p->ops = &str_ops;
-	p->file = NULL;
-	p->buf = isl_alloc_array(ctx, char, 256);
-	if (!p->buf)
-		goto error;
-	p->buf_n = 0;
-	p->buf_size = 256;
-	p->indent = 0;
-	p->output_format = ISL_FORMAT_ISL;
-	p->prefix = NULL;
-	p->suffix = NULL;
-	p->width = 0;
-
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void isl_printer_free(__isl_take isl_printer *p)
-{
-	if (!p)
-		return;
-	free(p->buf);
-	isl_ctx_deref(p->ctx);
-	free(p);
-}
-
-isl_ctx *isl_printer_get_ctx(__isl_keep isl_printer *printer)
-{
-	return printer ? printer->ctx : NULL;
-}
-
-__isl_give isl_printer *isl_printer_set_isl_int_width(__isl_take isl_printer *p,
-	int width)
-{
-	if (!p)
-		return NULL;
-
-	p->width = width;
-
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_set_indent(__isl_take isl_printer *p,
-	int indent)
-{
-	if (!p)
-		return NULL;
-
-	p->indent = indent;
-
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_indent(__isl_take isl_printer *p,
-	int indent)
-{
-	if (!p)
-		return NULL;
-
-	p->indent += indent;
-	if (p->indent < 0)
-		p->indent = 0;
-
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_set_prefix(__isl_take isl_printer *p,
-	const char *prefix)
-{
-	if (!p)
-		return NULL;
-
-	p->prefix = prefix;
-
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_set_suffix(__isl_take isl_printer *p,
-	const char *suffix)
-{
-	if (!p)
-		return NULL;
-
-	p->suffix = suffix;
-
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_set_output_format(__isl_take isl_printer *p,
-	int output_format)
-{
-	if (!p)
-		return NULL;
-
-	p->output_format = output_format;
-
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_print_str(__isl_take isl_printer *p,
-	const char *s)
-{
-	if (!p)
-		return NULL;
-
-	return p->ops->print_str(p, s);
-}
-
-__isl_give isl_printer *isl_printer_print_int(__isl_take isl_printer *p, int i)
-{
-	if (!p)
-		return NULL;
-
-	return p->ops->print_int(p, i);
-}
-
-__isl_give isl_printer *isl_printer_print_isl_int(__isl_take isl_printer *p,
-	isl_int i)
-{
-	if (!p)
-		return NULL;
-
-	return p->ops->print_isl_int(p, i);
-}
-
-__isl_give isl_printer *isl_printer_start_line(__isl_take isl_printer *p)
-{
-	if (!p)
-		return NULL;
-
-	return p->ops->start_line(p);
-}
-
-__isl_give isl_printer *isl_printer_end_line(__isl_take isl_printer *p)
-{
-	if (!p)
-		return NULL;
-
-	return p->ops->end_line(p);
-}
-
-char *isl_printer_get_str(__isl_keep isl_printer *printer)
-{
-	if (!printer || !printer->buf)
-		return NULL;
-	return strdup(printer->buf);
-}
-
-__isl_give isl_printer *isl_printer_flush(__isl_take isl_printer *p)
-{
-	if (!p)
-		return NULL;
-
-	return p->ops->flush(p);
-}
diff --git a/cloog-0.16.3/isl/isl_printer_private.h b/cloog-0.16.3/isl/isl_printer_private.h
deleted file mode 100644
index 9d76808..0000000
--- a/cloog-0.16.3/isl/isl_printer_private.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <isl/printer.h>
-
-struct isl_printer_ops;
-
-struct isl_printer {
-	struct isl_ctx	*ctx;
-	struct isl_printer_ops *ops;
-	FILE        	*file;
-	int		buf_n;
-	int		buf_size;
-	char		*buf;
-	int		indent;
-	int		output_format;
-	const char	*prefix;
-	const char	*suffix;
-	int		width;
-};
diff --git a/cloog-0.16.3/isl/isl_pw_templ.c b/cloog-0.16.3/isl/isl_pw_templ.c
deleted file mode 100644
index a446c43..0000000
--- a/cloog-0.16.3/isl/isl_pw_templ.c
+++ /dev/null
@@ -1,1074 +0,0 @@
-#define xFN(TYPE,NAME) TYPE ## _ ## NAME
-#define FN(TYPE,NAME) xFN(TYPE,NAME)
-#define xS(TYPE,NAME) struct TYPE ## _ ## NAME
-#define S(TYPE,NAME) xS(TYPE,NAME)
-
-#ifdef HAS_TYPE
-static __isl_give PW *FN(PW,alloc_)(__isl_take isl_dim *dim,
-	enum isl_fold type, int n)
-#else
-static __isl_give PW *FN(PW,alloc_)(__isl_take isl_dim *dim, int n)
-#endif
-{
-	isl_ctx *ctx;
-	struct PW *pw;
-
-	if (!dim)
-		return NULL;
-	ctx = isl_dim_get_ctx(dim);
-	isl_assert(ctx, n >= 0, goto error);
-	pw = isl_alloc(ctx, struct PW,
-			sizeof(struct PW) + (n - 1) * sizeof(S(PW,piece)));
-	if (!pw)
-		goto error;
-
-	pw->ref = 1;
-#ifdef HAS_TYPE
-	pw->type = type;
-#endif
-	pw->size = n;
-	pw->n = 0;
-	pw->dim = dim;
-	return pw;
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-#ifdef HAS_TYPE
-__isl_give PW *FN(PW,ZERO)(__isl_take isl_dim *dim, enum isl_fold type)
-{
-	return FN(PW,alloc_)(dim, type, 0);
-}
-#else
-__isl_give PW *FN(PW,ZERO)(__isl_take isl_dim *dim)
-{
-	return FN(PW,alloc_)(dim, 0);
-}
-#endif
-
-__isl_give PW *FN(PW,add_piece)(__isl_take PW *pw,
-	__isl_take isl_set *set, __isl_take EL *el)
-{
-	isl_ctx *ctx;
-	isl_dim *el_dim = NULL;
-
-	if (!pw || !set || !el)
-		goto error;
-
-	if (isl_set_plain_is_empty(set) || FN(EL,EL_IS_ZERO)(el)) {
-		isl_set_free(set);
-		FN(EL,free)(el);
-		return pw;
-	}
-
-	ctx = isl_set_get_ctx(set);
-#ifdef HAS_TYPE
-	if (pw->type != el->type)
-		isl_die(ctx, isl_error_invalid, "fold types don't match",
-			goto error);
-#endif
-	el_dim = FN(EL,get_dim(el));
-	isl_assert(ctx, isl_dim_equal(pw->dim, el_dim), goto error);
-	isl_assert(ctx, pw->n < pw->size, goto error);
-
-	pw->p[pw->n].set = set;
-	pw->p[pw->n].FIELD = el;
-	pw->n++;
-	
-	isl_dim_free(el_dim);
-	return pw;
-error:
-	isl_dim_free(el_dim);
-	FN(PW,free)(pw);
-	isl_set_free(set);
-	FN(EL,free)(el);
-	return NULL;
-}
-
-#ifdef HAS_TYPE
-__isl_give PW *FN(PW,alloc)(enum isl_fold type,
-	__isl_take isl_set *set, __isl_take EL *el)
-#else
-__isl_give PW *FN(PW,alloc)(__isl_take isl_set *set, __isl_take EL *el)
-#endif
-{
-	PW *pw;
-
-	if (!set || !el)
-		goto error;
-
-#ifdef HAS_TYPE
-	pw = FN(PW,alloc_)(isl_set_get_dim(set), type, 1);
-#else
-	pw = FN(PW,alloc_)(isl_set_get_dim(set), 1);
-#endif
-
-	return FN(PW,add_piece)(pw, set, el);
-error:
-	isl_set_free(set);
-	FN(EL,free)(el);
-	return NULL;
-}
-
-__isl_give PW *FN(PW,dup)(__isl_keep PW *pw)
-{
-	int i;
-	PW *dup;
-
-	if (!pw)
-		return NULL;
-
-#ifdef HAS_TYPE
-	dup = FN(PW,alloc_)(isl_dim_copy(pw->dim), pw->type, pw->n);
-#else
-	dup = FN(PW,alloc_)(isl_dim_copy(pw->dim), pw->n);
-#endif
-	if (!dup)
-		return NULL;
-
-	for (i = 0; i < pw->n; ++i)
-		dup = FN(PW,add_piece)(dup, isl_set_copy(pw->p[i].set),
-					    FN(EL,copy)(pw->p[i].FIELD));
-
-	return dup;
-}
-
-__isl_give PW *FN(PW,cow)(__isl_take PW *pw)
-{
-	if (!pw)
-		return NULL;
-
-	if (pw->ref == 1)
-		return pw;
-	pw->ref--;
-	return FN(PW,dup)(pw);
-}
-
-__isl_give PW *FN(PW,copy)(__isl_keep PW *pw)
-{
-	if (!pw)
-		return NULL;
-
-	pw->ref++;
-	return pw;
-}
-
-void *FN(PW,free)(__isl_take PW *pw)
-{
-	int i;
-
-	if (!pw)
-		return NULL;
-	if (--pw->ref > 0)
-		return NULL;
-
-	for (i = 0; i < pw->n; ++i) {
-		isl_set_free(pw->p[i].set);
-		FN(EL,free)(pw->p[i].FIELD);
-	}
-	isl_dim_free(pw->dim);
-	free(pw);
-
-	return NULL;
-}
-
-int FN(PW,IS_ZERO)(__isl_keep PW *pw)
-{
-	if (!pw)
-		return -1;
-
-	return pw->n == 0;
-}
-
-__isl_give PW *FN(PW,add)(__isl_take PW *pw1, __isl_take PW *pw2)
-{
-	int i, j, n;
-	struct PW *res;
-	isl_ctx *ctx;
-	isl_set *set;
-
-	if (!pw1 || !pw2)
-		goto error;
-
-	ctx = isl_dim_get_ctx(pw1->dim);
-#ifdef HAS_TYPE
-	if (pw1->type != pw2->type)
-		isl_die(ctx, isl_error_invalid,
-			"fold types don't match", goto error);
-#endif
-	isl_assert(ctx, isl_dim_equal(pw1->dim, pw2->dim), goto error);
-
-	if (FN(PW,IS_ZERO)(pw1)) {
-		FN(PW,free)(pw1);
-		return pw2;
-	}
-
-	if (FN(PW,IS_ZERO)(pw2)) {
-		FN(PW,free)(pw2);
-		return pw1;
-	}
-
-	n = (pw1->n + 1) * (pw2->n + 1);
-#ifdef HAS_TYPE
-	res = FN(PW,alloc_)(isl_dim_copy(pw1->dim), pw1->type, n);
-#else
-	res = FN(PW,alloc_)(isl_dim_copy(pw1->dim), n);
-#endif
-
-	for (i = 0; i < pw1->n; ++i) {
-		set = isl_set_copy(pw1->p[i].set);
-		for (j = 0; j < pw2->n; ++j) {
-			struct isl_set *common;
-			EL *sum;
-			set = isl_set_subtract(set,
-					isl_set_copy(pw2->p[j].set));
-			common = isl_set_intersect(isl_set_copy(pw1->p[i].set),
-						isl_set_copy(pw2->p[j].set));
-			if (isl_set_plain_is_empty(common)) {
-				isl_set_free(common);
-				continue;
-			}
-
-			sum = FN(EL,add_on_domain)(common,
-						   FN(EL,copy)(pw1->p[i].FIELD),
-						   FN(EL,copy)(pw2->p[j].FIELD));
-
-			res = FN(PW,add_piece)(res, common, sum);
-		}
-		res = FN(PW,add_piece)(res, set, FN(EL,copy)(pw1->p[i].FIELD));
-	}
-
-	for (j = 0; j < pw2->n; ++j) {
-		set = isl_set_copy(pw2->p[j].set);
-		for (i = 0; i < pw1->n; ++i)
-			set = isl_set_subtract(set,
-					isl_set_copy(pw1->p[i].set));
-		res = FN(PW,add_piece)(res, set, FN(EL,copy)(pw2->p[j].FIELD));
-	}
-
-	FN(PW,free)(pw1);
-	FN(PW,free)(pw2);
-
-	return res;
-error:
-	FN(PW,free)(pw1);
-	FN(PW,free)(pw2);
-	return NULL;
-}
-
-__isl_give PW *FN(PW,add_disjoint)(__isl_take PW *pw1, __isl_take PW *pw2)
-{
-	int i;
-	isl_ctx *ctx;
-	PW *res;
-
-	if (!pw1 || !pw2)
-		goto error;
-
-	ctx = isl_dim_get_ctx(pw1->dim);
-#ifdef HAS_TYPE
-	if (pw1->type != pw2->type)
-		isl_die(ctx, isl_error_invalid,
-			"fold types don't match", goto error);
-#endif
-	isl_assert(ctx, isl_dim_equal(pw1->dim, pw2->dim), goto error);
-
-	if (FN(PW,IS_ZERO)(pw1)) {
-		FN(PW,free)(pw1);
-		return pw2;
-	}
-
-	if (FN(PW,IS_ZERO)(pw2)) {
-		FN(PW,free)(pw2);
-		return pw1;
-	}
-
-#ifdef HAS_TYPE
-	res = FN(PW,alloc_)(isl_dim_copy(pw1->dim), pw1->type, pw1->n + pw2->n);
-#else
-	res = FN(PW,alloc_)(isl_dim_copy(pw1->dim), pw1->n + pw2->n);
-#endif
-
-	for (i = 0; i < pw1->n; ++i)
-		res = FN(PW,add_piece)(res,
-				isl_set_copy(pw1->p[i].set),
-				FN(EL,copy)(pw1->p[i].FIELD));
-
-	for (i = 0; i < pw2->n; ++i)
-		res = FN(PW,add_piece)(res,
-				isl_set_copy(pw2->p[i].set),
-				FN(EL,copy)(pw2->p[i].FIELD));
-
-	FN(PW,free)(pw1);
-	FN(PW,free)(pw2);
-
-	return res;
-error:
-	FN(PW,free)(pw1);
-	FN(PW,free)(pw2);
-	return NULL;
-}
-
-#ifndef NO_NEG
-__isl_give PW *FN(PW,neg)(__isl_take PW *pw)
-{
-	int i;
-
-	if (!pw)
-		return NULL;
-
-	if (FN(PW,IS_ZERO)(pw))
-		return pw;
-
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		return NULL;
-
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].FIELD = FN(EL,neg)(pw->p[i].FIELD);
-		if (!pw->p[i].FIELD)
-			return FN(PW,free)(pw);
-	}
-
-	return pw;
-}
-
-__isl_give PW *FN(PW,sub)(__isl_take PW *pw1, __isl_take PW *pw2)
-{
-	return FN(PW,add)(pw1, FN(PW,neg)(pw2));
-}
-#endif
-
-#ifndef NO_EVAL
-__isl_give isl_qpolynomial *FN(PW,eval)(__isl_take PW *pw,
-	__isl_take isl_point *pnt)
-{
-	int i;
-	int found = 0;
-	isl_ctx *ctx;
-	isl_dim *pnt_dim = NULL;
-	isl_qpolynomial *qp;
-
-	if (!pw || !pnt)
-		goto error;
-	ctx = isl_point_get_ctx(pnt);
-	pnt_dim = isl_point_get_dim(pnt);
-	isl_assert(ctx, isl_dim_equal(pnt_dim, pw->dim), goto error);
-
-	for (i = 0; i < pw->n; ++i) {
-		found = isl_set_contains_point(pw->p[i].set, pnt);
-		if (found < 0)
-			goto error;
-		if (found)
-			break;
-	}
-	if (found)
-		qp = FN(EL,eval)(FN(EL,copy)(pw->p[i].FIELD),
-					    isl_point_copy(pnt));
-	else
-		qp = isl_qpolynomial_zero(isl_dim_copy(pw->dim));
-	FN(PW,free)(pw);
-	isl_dim_free(pnt_dim);
-	isl_point_free(pnt);
-	return qp;
-error:
-	FN(PW,free)(pw);
-	isl_dim_free(pnt_dim);
-	isl_point_free(pnt);
-	return NULL;
-}
-#endif
-
-__isl_give isl_set *FN(PW,domain)(__isl_take PW *pw)
-{
-	int i;
-	isl_set *dom;
-
-	if (!pw)
-		return NULL;
-
-	dom = isl_set_empty(isl_dim_copy(pw->dim));
-	for (i = 0; i < pw->n; ++i)
-		dom = isl_set_union_disjoint(dom, isl_set_copy(pw->p[i].set));
-
-	FN(PW,free)(pw);
-
-	return dom;
-}
-
-__isl_give PW *FN(PW,intersect_domain)(__isl_take PW *pw, __isl_take isl_set *set)
-{
-	int i;
-
-	if (!pw || !set)
-		goto error;
-
-	if (pw->n == 0) {
-		isl_set_free(set);
-		return pw;
-	}
-
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		goto error;
-
-	for (i = pw->n - 1; i >= 0; --i) {
-		isl_basic_set *aff;
-		pw->p[i].set = isl_set_intersect(pw->p[i].set, isl_set_copy(set));
-		if (!pw->p[i].set)
-			goto error;
-		aff = isl_set_affine_hull(isl_set_copy(pw->p[i].set));
-		pw->p[i].FIELD = FN(EL,substitute_equalities)(pw->p[i].FIELD,
-								aff);
-		if (isl_set_plain_is_empty(pw->p[i].set)) {
-			isl_set_free(pw->p[i].set);
-			FN(EL,free)(pw->p[i].FIELD);
-			if (i != pw->n - 1)
-				pw->p[i] = pw->p[pw->n - 1];
-			pw->n--;
-		}
-	}
-	
-	isl_set_free(set);
-	return pw;
-error:
-	isl_set_free(set);
-	FN(PW,free)(pw);
-	return NULL;
-}
-
-__isl_give PW *FN(PW,gist)(__isl_take PW *pw, __isl_take isl_set *context)
-{
-	int i;
-	isl_basic_set *hull = NULL;
-
-	if (!pw || !context)
-		goto error;
-
-	if (pw->n == 0) {
-		isl_set_free(context);
-		return pw;
-	}
-
-	context = isl_set_compute_divs(context);
-	hull = isl_set_simple_hull(isl_set_copy(context));
-
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		goto error;
-
-	for (i = pw->n - 1; i >= 0; --i) {
-		pw->p[i].set = isl_set_intersect(pw->p[i].set,
-						 isl_set_copy(context));
-		if (!pw->p[i].set)
-			goto error;
-		pw->p[i].FIELD = FN(EL,gist)(pw->p[i].FIELD,
-					     isl_set_copy(pw->p[i].set));
-		pw->p[i].set = isl_set_gist_basic_set(pw->p[i].set,
-						isl_basic_set_copy(hull));
-		if (!pw->p[i].set)
-			goto error;
-		if (isl_set_plain_is_empty(pw->p[i].set)) {
-			isl_set_free(pw->p[i].set);
-			FN(EL,free)(pw->p[i].FIELD);
-			if (i != pw->n - 1)
-				pw->p[i] = pw->p[pw->n - 1];
-			pw->n--;
-		}
-	}
-
-	isl_basic_set_free(hull);
-	isl_set_free(context);
-
-	return pw;
-error:
-	FN(PW,free)(pw);
-	isl_basic_set_free(hull);
-	isl_set_free(context);
-	return NULL;
-}
-
-__isl_give PW *FN(PW,coalesce)(__isl_take PW *pw)
-{
-	int i, j;
-
-	if (!pw)
-		return NULL;
-	if (pw->n == 0)
-		return pw;
-
-	for (i = pw->n - 1; i >= 0; --i) {
-		for (j = i - 1; j >= 0; --j) {
-			if (!FN(EL,plain_is_equal)(pw->p[i].FIELD,
-							pw->p[j].FIELD))
-				continue;
-			pw->p[j].set = isl_set_union(pw->p[j].set,
-							pw->p[i].set);
-			FN(EL,free)(pw->p[i].FIELD);
-			if (i != pw->n - 1)
-				pw->p[i] = pw->p[pw->n - 1];
-			pw->n--;
-			break;
-		}
-		if (j >= 0)
-			continue;
-		pw->p[i].set = isl_set_coalesce(pw->p[i].set);
-		if (!pw->p[i].set)
-			goto error;
-	}
-
-	return pw;
-error:
-	FN(PW,free)(pw);
-	return NULL;
-}
-
-isl_ctx *FN(PW,get_ctx)(__isl_keep PW *pw)
-{
-	return pw ? isl_dim_get_ctx(pw->dim) : NULL;
-}
-
-#ifndef NO_INVOLVES_DIMS
-int FN(PW,involves_dims)(__isl_keep PW *pw, enum isl_dim_type type,
-	unsigned first, unsigned n)
-{
-	int i;
-
-	if (!pw)
-		return -1;
-	if (pw->n == 0 || n == 0)
-		return 0;
-	for (i = 0; i < pw->n; ++i) {
-		int involves = FN(EL,involves_dims)(pw->p[i].FIELD,
-							type, first, n);
-		if (involves < 0 || involves)
-			return involves;
-		involves = isl_set_involves_dims(pw->p[i].set, type, first, n);
-		if (involves < 0 || involves)
-			return involves;
-	}
-	return 0;
-}
-#endif
-
-__isl_give PW *FN(PW,set_dim_name)(__isl_take PW *pw,
-	enum isl_dim_type type, unsigned pos, const char *s)
-{
-	int i;
-
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		return NULL;
-
-	pw->dim = isl_dim_set_name(pw->dim, type, pos, s);
-	if (!pw->dim)
-		goto error;
-
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].set = isl_set_set_dim_name(pw->p[i].set, type, pos, s);
-		if (!pw->p[i].set)
-			goto error;
-		pw->p[i].FIELD = FN(EL,set_dim_name)(pw->p[i].FIELD, type, pos, s);
-		if (!pw->p[i].FIELD)
-			goto error;
-	}
-
-	return pw;
-error:
-	FN(PW,free)(pw);
-	return NULL;
-}
-
-#ifndef NO_DROP_DIMS
-__isl_give PW *FN(PW,drop_dims)(__isl_take PW *pw,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!pw)
-		return NULL;
-	if (n == 0 && !isl_dim_get_tuple_name(pw->dim, type))
-		return pw;
-
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		return NULL;
-	pw->dim = isl_dim_drop(pw->dim, type, first, n);
-	if (!pw->dim)
-		goto error;
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].set = isl_set_drop(pw->p[i].set, type, first, n);
-		if (!pw->p[i].set)
-			goto error;
-		pw->p[i].FIELD = FN(EL,drop_dims)(pw->p[i].FIELD, type, first, n);
-		if (!pw->p[i].FIELD)
-			goto error;
-	}
-
-	return pw;
-error:
-	FN(PW,free)(pw);
-	return NULL;
-}
-#endif
-
-#ifndef NO_INSERT_DIMS
-__isl_give PW *FN(PW,insert_dims)(__isl_take PW *pw, enum isl_dim_type type,
-	unsigned first, unsigned n)
-{
-	int i;
-
-	if (!pw)
-		return NULL;
-	if (n == 0 && !isl_dim_is_named_or_nested(pw->dim, type))
-		return pw;
-
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		return NULL;
-
-	pw->dim = isl_dim_insert(pw->dim, type, first, n);
-	if (!pw->dim)
-		goto error;
-
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].set = isl_set_insert(pw->p[i].set, type, first, n);
-		if (!pw->p[i].set)
-			goto error;
-		pw->p[i].FIELD = FN(EL,insert_dims)(pw->p[i].FIELD,
-								type, first, n);
-		if (!pw->p[i].FIELD)
-			goto error;
-	}
-
-	return pw;
-error:
-	FN(PW,free)(pw);
-	return NULL;
-}
-#endif
-
-__isl_give PW *FN(PW,fix_dim)(__isl_take PW *pw,
-	enum isl_dim_type type, unsigned pos, isl_int v)
-{
-	int i;
-
-	if (!pw)
-		return NULL;
-
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		return NULL;
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].set = isl_set_fix(pw->p[i].set, type, pos, v);
-		if (!pw->p[i].set)
-			goto error;
-	}
-
-	return pw;
-error:
-	FN(PW,free)(pw);
-	return NULL;
-}
-
-unsigned FN(PW,dim)(__isl_keep PW *pw, enum isl_dim_type type)
-{
-	return pw ? isl_dim_size(pw->dim, type) : 0;
-}
-
-__isl_give PW *FN(PW,split_dims)(__isl_take PW *pw,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!pw)
-		return NULL;
-	if (n == 0)
-		return pw;
-
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		return NULL;
-	if (!pw->dim)
-		goto error;
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].set = isl_set_split_dims(pw->p[i].set, type, first, n);
-		if (!pw->p[i].set)
-			goto error;
-	}
-
-	return pw;
-error:
-	FN(PW,free)(pw);
-	return NULL;
-}
-
-#ifndef NO_OPT
-/* Compute the maximal value attained by the piecewise quasipolynomial
- * on its domain or zero if the domain is empty.
- * In the worst case, the domain is scanned completely,
- * so the domain is assumed to be bounded.
- */
-__isl_give isl_qpolynomial *FN(PW,opt)(__isl_take PW *pw, int max)
-{
-	int i;
-	isl_qpolynomial *opt;
-
-	if (!pw)
-		return NULL;
-
-	if (pw->n == 0) {
-		isl_dim *dim = isl_dim_copy(pw->dim);
-		FN(PW,free)(pw);
-		return isl_qpolynomial_zero(dim);
-	}
-
-	opt = FN(EL,opt_on_domain)(FN(EL,copy)(pw->p[0].FIELD),
-					isl_set_copy(pw->p[0].set), max);
-	for (i = 1; i < pw->n; ++i) {
-		isl_qpolynomial *opt_i;
-		opt_i = FN(EL,opt_on_domain)(FN(EL,copy)(pw->p[i].FIELD),
-						isl_set_copy(pw->p[i].set), max);
-		if (max)
-			opt = isl_qpolynomial_max_cst(opt, opt_i);
-		else
-			opt = isl_qpolynomial_min_cst(opt, opt_i);
-	}
-
-	FN(PW,free)(pw);
-	return opt;
-}
-
-__isl_give isl_qpolynomial *FN(PW,max)(__isl_take PW *pw)
-{
-	return FN(PW,opt)(pw, 1);
-}
-
-__isl_give isl_qpolynomial *FN(PW,min)(__isl_take PW *pw)
-{
-	return FN(PW,opt)(pw, 0);
-}
-#endif
-
-__isl_give isl_dim *FN(PW,get_dim)(__isl_keep PW *pw)
-{
-	return pw ? isl_dim_copy(pw->dim) : NULL;
-}
-
-#ifndef NO_RESET_DIM
-__isl_give PW *FN(PW,reset_dim)(__isl_take PW *pw, __isl_take isl_dim *dim)
-{
-	int i;
-
-	pw = FN(PW,cow)(pw);
-	if (!pw || !dim)
-		goto error;
-
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].set = isl_set_reset_dim(pw->p[i].set,
-						 isl_dim_copy(dim));
-		if (!pw->p[i].set)
-			goto error;
-		pw->p[i].FIELD = FN(EL,reset_dim)(pw->p[i].FIELD,
-						  isl_dim_copy(dim));
-		if (!pw->p[i].FIELD)
-			goto error;
-	}
-	isl_dim_free(pw->dim);
-	pw->dim = dim;
-
-	return pw;
-error:
-	isl_dim_free(dim);
-	FN(PW,free)(pw);
-	return NULL;
-}
-#endif
-
-int FN(PW,has_equal_dim)(__isl_keep PW *pw1, __isl_keep PW *pw2)
-{
-	if (!pw1 || !pw2)
-		return -1;
-
-	return isl_dim_equal(pw1->dim, pw2->dim);
-}
-
-#ifndef NO_MORPH
-__isl_give PW *FN(PW,morph)(__isl_take PW *pw, __isl_take isl_morph *morph)
-{
-	int i;
-	isl_ctx *ctx;
-
-	if (!pw || !morph)
-		goto error;
-
-	ctx = isl_dim_get_ctx(pw->dim);
-	isl_assert(ctx, isl_dim_equal(pw->dim, morph->dom->dim),
-		goto error);
-
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		goto error;
-	isl_dim_free(pw->dim);
-	pw->dim = isl_dim_copy(morph->ran->dim);
-	if (!pw->dim)
-		goto error;
-
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].set = isl_morph_set(isl_morph_copy(morph), pw->p[i].set);
-		if (!pw->p[i].set)
-			goto error;
-		pw->p[i].FIELD = FN(EL,morph)(pw->p[i].FIELD,
-						isl_morph_copy(morph));
-		if (!pw->p[i].FIELD)
-			goto error;
-	}
-
-	isl_morph_free(morph);
-
-	return pw;
-error:
-	FN(PW,free)(pw);
-	isl_morph_free(morph);
-	return NULL;
-}
-#endif
-
-int FN(PW,foreach_piece)(__isl_keep PW *pw,
-	int (*fn)(__isl_take isl_set *set, __isl_take EL *el, void *user),
-	void *user)
-{
-	int i;
-
-	if (!pw)
-		return -1;
-
-	for (i = 0; i < pw->n; ++i)
-		if (fn(isl_set_copy(pw->p[i].set),
-				FN(EL,copy)(pw->p[i].FIELD), user) < 0)
-			return -1;
-
-	return 0;
-}
-
-#ifndef NO_LIFT
-static int any_divs(__isl_keep isl_set *set)
-{
-	int i;
-
-	if (!set)
-		return -1;
-
-	for (i = 0; i < set->n; ++i)
-		if (set->p[i]->n_div > 0)
-			return 1;
-
-	return 0;
-}
-
-static int foreach_lifted_subset(__isl_take isl_set *set, __isl_take EL *el,
-	int (*fn)(__isl_take isl_set *set, __isl_take EL *el,
-		    void *user), void *user)
-{
-	int i;
-
-	if (!set || !el)
-		goto error;
-
-	for (i = 0; i < set->n; ++i) {
-		isl_set *lift;
-		EL *copy;
-
-		lift = isl_set_from_basic_set(isl_basic_set_copy(set->p[i]));
-		lift = isl_set_lift(lift);
-
-		copy = FN(EL,copy)(el);
-		copy = FN(EL,lift)(copy, isl_set_get_dim(lift));
-
-		if (fn(lift, copy, user) < 0)
-			goto error;
-	}
-
-	isl_set_free(set);
-	FN(EL,free)(el);
-
-	return 0;
-error:
-	isl_set_free(set);
-	FN(EL,free)(el);
-	return -1;
-}
-
-int FN(PW,foreach_lifted_piece)(__isl_keep PW *pw,
-	int (*fn)(__isl_take isl_set *set, __isl_take EL *el,
-		    void *user), void *user)
-{
-	int i;
-
-	if (!pw)
-		return -1;
-
-	for (i = 0; i < pw->n; ++i) {
-		isl_set *set;
-		EL *el;
-
-		set = isl_set_copy(pw->p[i].set);
-		el = FN(EL,copy)(pw->p[i].FIELD);
-		if (!any_divs(set)) {
-			if (fn(set, el, user) < 0)
-				return -1;
-			continue;
-		}
-		if (foreach_lifted_subset(set, el, fn, user) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-#endif
-
-#ifndef NO_MOVE_DIMS
-__isl_give PW *FN(PW,move_dims)(__isl_take PW *pw,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n)
-{
-	int i;
-
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		return NULL;
-
-	pw->dim = isl_dim_move(pw->dim, dst_type, dst_pos, src_type, src_pos, n);
-	if (!pw->dim)
-		goto error;
-
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].set = isl_set_move_dims(pw->p[i].set,
-						dst_type, dst_pos,
-						src_type, src_pos, n);
-		if (!pw->p[i].set)
-			goto error;
-		pw->p[i].FIELD = FN(EL,move_dims)(pw->p[i].FIELD,
-					dst_type, dst_pos, src_type, src_pos, n);
-		if (!pw->p[i].FIELD)
-			goto error;
-	}
-
-	return pw;
-error:
-	FN(PW,free)(pw);
-	return NULL;
-}
-#endif
-
-#ifndef NO_REALIGN
-__isl_give PW *FN(PW,realign)(__isl_take PW *pw, __isl_take isl_reordering *exp)
-{
-	int i;
-
-	pw = FN(PW,cow)(pw);
-	if (!pw || !exp)
-		return NULL;
-
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].set = isl_set_realign(pw->p[i].set,
-						    isl_reordering_copy(exp));
-		if (!pw->p[i].set)
-			goto error;
-		pw->p[i].FIELD = FN(EL,realign)(pw->p[i].FIELD,
-						    isl_reordering_copy(exp));
-		if (!pw->p[i].FIELD)
-			goto error;
-	}
-
-	pw = FN(PW,reset_dim)(pw, isl_dim_copy(exp->dim));
-
-	isl_reordering_free(exp);
-	return pw;
-error:
-	isl_reordering_free(exp);
-	FN(PW,free)(pw);
-	return NULL;
-}
-
-/* Align the parameters of "pw" to those of "model".
- */
-__isl_give PW *FN(PW,align_params)(__isl_take PW *pw, __isl_take isl_dim *model)
-{
-	isl_ctx *ctx;
-
-	if (!pw || !model)
-		goto error;
-
-	ctx = isl_dim_get_ctx(model);
-	if (!isl_dim_has_named_params(model))
-		isl_die(ctx, isl_error_invalid,
-			"model has unnamed parameters", goto error);
-	if (!isl_dim_has_named_params(pw->dim))
-		isl_die(ctx, isl_error_invalid,
-			"input has unnamed parameters", goto error);
-	if (!isl_dim_match(pw->dim, isl_dim_param, model, isl_dim_param)) {
-		isl_reordering *exp;
-
-		model = isl_dim_drop(model, isl_dim_in,
-					0, isl_dim_size(model, isl_dim_in));
-		model = isl_dim_drop(model, isl_dim_out,
-					0, isl_dim_size(model, isl_dim_out));
-		exp = isl_parameter_alignment_reordering(pw->dim, model);
-		exp = isl_reordering_extend_dim(exp, FN(PW,get_dim)(pw));
-		pw = FN(PW,realign)(pw, exp);
-	}
-
-	isl_dim_free(model);
-	return pw;
-error:
-	isl_dim_free(model);
-	FN(PW,free)(pw);
-	return NULL;
-}
-#endif
-
-__isl_give PW *FN(PW,mul_isl_int)(__isl_take PW *pw, isl_int v)
-{
-	int i;
-
-	if (isl_int_is_one(v))
-		return pw;
-	if (pw && isl_int_is_zero(v)) {
-		PW *zero;
-		isl_dim *dim = FN(PW,get_dim)(pw);
-#ifdef HAS_TYPE
-		zero = FN(PW,ZERO)(dim, pw->type);
-#else
-		zero = FN(PW,ZERO)(dim);
-#endif
-		FN(PW,free)(pw);
-		return zero;
-	}
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		return NULL;
-	if (pw->n == 0)
-		return pw;
-
-#ifdef HAS_TYPE
-	if (isl_int_is_neg(v))
-		pw->type = isl_fold_type_negate(pw->type);
-#endif
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].FIELD = FN(EL,scale)(pw->p[i].FIELD, v);
-		if (!pw->p[i].FIELD)
-			goto error;
-	}
-
-	return pw;
-error:
-	FN(PW,free)(pw);
-	return NULL;
-}
-
-__isl_give PW *FN(PW,scale)(__isl_take PW *pw, isl_int v)
-{
-	return FN(PW,mul_isl_int)(pw, v);
-}
diff --git a/cloog-0.16.3/isl/isl_qsort.c b/cloog-0.16.3/isl/isl_qsort.c
deleted file mode 100644
index 3183048..0000000
--- a/cloog-0.16.3/isl/isl_qsort.c
+++ /dev/null
@@ -1,249 +0,0 @@
-/* Copyright (C) 1991,1992,1996,1997,1999,2004 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Written by Douglas C. Schmidt (schmidt@ics.uci.edu).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-/* If you consider tuning this algorithm, you should consult first:
-   Engineering a sort function; Jon Bentley and M. Douglas McIlroy;
-   Software - Practice and Experience; Vol. 23 (11), 1249-1265, 1993.  */
-
-#include <limits.h>
-#include <stdlib.h>
-#include <string.h>
-#include <isl_qsort.h>
-
-/* Byte-wise swap two items of size SIZE. */
-#define SWAP(a, b, size)						      \
-  do									      \
-    {									      \
-      register size_t __size = (size);					      \
-      register char *__a = (a), *__b = (b);				      \
-      do								      \
-	{								      \
-	  char __tmp = *__a;						      \
-	  *__a++ = *__b;						      \
-	  *__b++ = __tmp;						      \
-	} while (--__size > 0);						      \
-    } while (0)
-
-/* Discontinue quicksort algorithm when partition gets below this size.
-   This particular magic number was chosen to work best on a Sun 4/260. */
-#define MAX_THRESH 4
-
-/* Stack node declarations used to store unfulfilled partition obligations. */
-typedef struct
-  {
-    char *lo;
-    char *hi;
-  } stack_node;
-
-/* The next 4 #defines implement a very fast in-line stack abstraction. */
-/* The stack needs log (total_elements) entries (we could even subtract
-   log(MAX_THRESH)).  Since total_elements has type size_t, we get as
-   upper bound for log (total_elements):
-   bits per byte (CHAR_BIT) * sizeof(size_t).  */
-#define STACK_SIZE	(CHAR_BIT * sizeof(size_t))
-#define PUSH(low, high)	((void) ((top->lo = (low)), (top->hi = (high)), ++top))
-#define	POP(low, high)	((void) (--top, (low = top->lo), (high = top->hi)))
-#define	STACK_NOT_EMPTY	(stack < top)
-
-
-/* Order size using quicksort.  This implementation incorporates
-   four optimizations discussed in Sedgewick:
-
-   1. Non-recursive, using an explicit stack of pointer that store the
-      next array partition to sort.  To save time, this maximum amount
-      of space required to store an array of SIZE_MAX is allocated on the
-      stack.  Assuming a 32-bit (64 bit) integer for size_t, this needs
-      only 32 * sizeof(stack_node) == 256 bytes (for 64 bit: 1024 bytes).
-      Pretty cheap, actually.
-
-   2. Chose the pivot element using a median-of-three decision tree.
-      This reduces the probability of selecting a bad pivot value and
-      eliminates certain extraneous comparisons.
-
-   3. Only quicksorts TOTAL_ELEMS / MAX_THRESH partitions, leaving
-      insertion sort to order the MAX_THRESH items within each partition.
-      This is a big win, since insertion sort is faster for small, mostly
-      sorted array segments.
-
-   4. The larger of the two sub-partitions is always pushed onto the
-      stack first, with the algorithm then concentrating on the
-      smaller partition.  This *guarantees* no more than log (total_elems)
-      stack size is needed (actually O(1) in this case)!  */
-
-void isl_quicksort (void *const pbase, size_t total_elems, size_t size,
-	int (*cmp)(const void *, const void *, void *arg), void *arg)
-{
-  register char *base_ptr = (char *) pbase;
-
-  const size_t max_thresh = MAX_THRESH * size;
-
-  if (total_elems == 0)
-    /* Avoid lossage with unsigned arithmetic below.  */
-    return;
-
-  if (total_elems > MAX_THRESH)
-    {
-      char *lo = base_ptr;
-      char *hi = &lo[size * (total_elems - 1)];
-      stack_node stack[STACK_SIZE];
-      stack_node *top = stack;
-
-      PUSH (NULL, NULL);
-
-      while (STACK_NOT_EMPTY)
-        {
-          char *left_ptr;
-          char *right_ptr;
-
-	  /* Select median value from among LO, MID, and HI. Rearrange
-	     LO and HI so the three values are sorted. This lowers the
-	     probability of picking a pathological pivot value and
-	     skips a comparison for both the LEFT_PTR and RIGHT_PTR in
-	     the while loops. */
-
-	  char *mid = lo + size * ((hi - lo) / size >> 1);
-
-	  if ((*cmp) ((void *) mid, (void *) lo, arg) < 0)
-	    SWAP (mid, lo, size);
-	  if ((*cmp) ((void *) hi, (void *) mid, arg) < 0)
-	    SWAP (mid, hi, size);
-	  else
-	    goto jump_over;
-	  if ((*cmp) ((void *) mid, (void *) lo, arg) < 0)
-	    SWAP (mid, lo, size);
-	jump_over:;
-
-	  left_ptr  = lo + size;
-	  right_ptr = hi - size;
-
-	  /* Here's the famous ``collapse the walls'' section of quicksort.
-	     Gotta like those tight inner loops!  They are the main reason
-	     that this algorithm runs much faster than others. */
-	  do
-	    {
-	      while ((*cmp) ((void *) left_ptr, (void *) mid, arg) < 0)
-		left_ptr += size;
-
-	      while ((*cmp) ((void *) mid, (void *) right_ptr, arg) < 0)
-		right_ptr -= size;
-
-	      if (left_ptr < right_ptr)
-		{
-		  SWAP (left_ptr, right_ptr, size);
-		  if (mid == left_ptr)
-		    mid = right_ptr;
-		  else if (mid == right_ptr)
-		    mid = left_ptr;
-		  left_ptr += size;
-		  right_ptr -= size;
-		}
-	      else if (left_ptr == right_ptr)
-		{
-		  left_ptr += size;
-		  right_ptr -= size;
-		  break;
-		}
-	    }
-	  while (left_ptr <= right_ptr);
-
-          /* Set up pointers for next iteration.  First determine whether
-             left and right partitions are below the threshold size.  If so,
-             ignore one or both.  Otherwise, push the larger partition's
-             bounds on the stack and continue sorting the smaller one. */
-
-          if ((size_t) (right_ptr - lo) <= max_thresh)
-            {
-              if ((size_t) (hi - left_ptr) <= max_thresh)
-		/* Ignore both small partitions. */
-                POP (lo, hi);
-              else
-		/* Ignore small left partition. */
-                lo = left_ptr;
-            }
-          else if ((size_t) (hi - left_ptr) <= max_thresh)
-	    /* Ignore small right partition. */
-            hi = right_ptr;
-          else if ((right_ptr - lo) > (hi - left_ptr))
-            {
-	      /* Push larger left partition indices. */
-              PUSH (lo, right_ptr);
-              lo = left_ptr;
-            }
-          else
-            {
-	      /* Push larger right partition indices. */
-              PUSH (left_ptr, hi);
-              hi = right_ptr;
-            }
-        }
-    }
-
-  /* Once the BASE_PTR array is partially sorted by quicksort the rest
-     is completely sorted using insertion sort, since this is efficient
-     for partitions below MAX_THRESH size. BASE_PTR points to the beginning
-     of the array to sort, and END_PTR points at the very last element in
-     the array (*not* one beyond it!). */
-
-#define min(x, y) ((x) < (y) ? (x) : (y))
-
-  {
-    char *const end_ptr = &base_ptr[size * (total_elems - 1)];
-    char *tmp_ptr = base_ptr;
-    char *thresh = min(end_ptr, base_ptr + max_thresh);
-    register char *run_ptr;
-
-    /* Find smallest element in first threshold and place it at the
-       array's beginning.  This is the smallest array element,
-       and the operation speeds up insertion sort's inner loop. */
-
-    for (run_ptr = tmp_ptr + size; run_ptr <= thresh; run_ptr += size)
-      if ((*cmp) ((void *) run_ptr, (void *) tmp_ptr, arg) < 0)
-        tmp_ptr = run_ptr;
-
-    if (tmp_ptr != base_ptr)
-      SWAP (tmp_ptr, base_ptr, size);
-
-    /* Insertion sort, running from left-hand-side up to right-hand-side.  */
-
-    run_ptr = base_ptr + size;
-    while ((run_ptr += size) <= end_ptr)
-      {
-	tmp_ptr = run_ptr - size;
-	while ((*cmp) ((void *) run_ptr, (void *) tmp_ptr, arg) < 0)
-	  tmp_ptr -= size;
-
-	tmp_ptr += size;
-        if (tmp_ptr != run_ptr)
-          {
-            char *trav;
-
-	    trav = run_ptr + size;
-	    while (--trav >= run_ptr)
-              {
-                char c = *trav;
-                char *hi, *lo;
-
-                for (hi = lo = trav; (lo -= size) >= tmp_ptr; hi = lo)
-                  *hi = *lo;
-                *hi = c;
-              }
-          }
-      }
-  }
-}
diff --git a/cloog-0.16.3/isl/isl_qsort.h b/cloog-0.16.3/isl/isl_qsort.h
deleted file mode 100644
index 5ca1634..0000000
--- a/cloog-0.16.3/isl/isl_qsort.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef ISL_QSORT_H
-#define ISL_QSORT_H
-
-void isl_quicksort (void *const pbase, size_t total_elems, size_t size,
-	int (*cmp)(const void *, const void *, void *arg), void *arg);
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_range.c b/cloog-0.16.3/isl/isl_range.c
deleted file mode 100644
index d31f277..0000000
--- a/cloog-0.16.3/isl/isl_range.c
+++ /dev/null
@@ -1,483 +0,0 @@
-#include <isl_ctx_private.h>
-#include <isl/constraint.h>
-#include <isl/set.h>
-#include <isl_polynomial_private.h>
-#include <isl_morph.h>
-#include <isl_range.h>
-
-struct range_data {
-	struct isl_bound	*bound;
-	int 		    	*signs;
-	int			sign;
-	int			test_monotonicity;
-	int		    	monotonicity;
-	int			tight;
-	isl_qpolynomial	    	*poly;
-	isl_pw_qpolynomial_fold *pwf;
-	isl_pw_qpolynomial_fold *pwf_tight;
-};
-
-static int propagate_on_domain(__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, struct range_data *data);
-
-/* Check whether the polynomial "poly" has sign "sign" over "bset",
- * i.e., if sign == 1, check that the lower bound on the polynomial
- * is non-negative and if sign == -1, check that the upper bound on
- * the polynomial is non-positive.
- */
-static int has_sign(__isl_keep isl_basic_set *bset,
-	__isl_keep isl_qpolynomial *poly, int sign, int *signs)
-{
-	struct range_data data_m;
-	unsigned nvar;
-	unsigned nparam;
-	isl_dim *dim;
-	isl_qpolynomial *opt;
-	int r;
-	enum isl_fold type;
-
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-
-	bset = isl_basic_set_copy(bset);
-	poly = isl_qpolynomial_copy(poly);
-
-	bset = isl_basic_set_move_dims(bset, isl_dim_set, 0,
-					isl_dim_param, 0, nparam);
-	poly = isl_qpolynomial_move_dims(poly, isl_dim_set, 0,
-					isl_dim_param, 0, nparam);
-
-	dim = isl_qpolynomial_get_dim(poly);
-	dim = isl_dim_drop(dim, isl_dim_set, 0, isl_dim_size(dim, isl_dim_set));
-
-	data_m.test_monotonicity = 0;
-	data_m.signs = signs;
-	data_m.sign = -sign;
-	type = data_m.sign < 0 ? isl_fold_min : isl_fold_max;
-	data_m.pwf = isl_pw_qpolynomial_fold_zero(dim, type);
-	data_m.tight = 0;
-	data_m.pwf_tight = NULL;
-
-	if (propagate_on_domain(bset, poly, &data_m) < 0)
-		goto error;
-
-	if (sign > 0)
-		opt = isl_pw_qpolynomial_fold_min(data_m.pwf);
-	else
-		opt = isl_pw_qpolynomial_fold_max(data_m.pwf);
-
-	if (!opt)
-		r = -1;
-	else if (isl_qpolynomial_is_nan(opt) ||
-		 isl_qpolynomial_is_infty(opt) ||
-		 isl_qpolynomial_is_neginfty(opt))
-		r = 0;
-	else
-		r = sign * isl_qpolynomial_sgn(opt) >= 0;
-
-	isl_qpolynomial_free(opt);
-
-	return r;
-error:
-	isl_pw_qpolynomial_fold_free(data_m.pwf);
-	return -1;
-}
-
-/* Return  1 if poly is monotonically increasing in the last set variable,
- *        -1 if poly is monotonically decreasing in the last set variable,
- *	   0 if no conclusion,
- *	  -2 on error.
- *
- * We simply check the sign of p(x+1)-p(x)
- */
-static int monotonicity(__isl_keep isl_basic_set *bset,
-	__isl_keep isl_qpolynomial *poly, struct range_data *data)
-{
-	isl_ctx *ctx;
-	isl_dim *dim;
-	isl_qpolynomial *sub = NULL;
-	isl_qpolynomial *diff = NULL;
-	int result = 0;
-	int s;
-	unsigned nvar;
-
-	ctx = isl_qpolynomial_get_ctx(poly);
-	dim = isl_qpolynomial_get_dim(poly);
-
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-
-	sub = isl_qpolynomial_var(isl_dim_copy(dim), isl_dim_set, nvar - 1);
-	sub = isl_qpolynomial_add(sub,
-		isl_qpolynomial_rat_cst(dim, ctx->one, ctx->one));
-
-	diff = isl_qpolynomial_substitute(isl_qpolynomial_copy(poly),
-			isl_dim_set, nvar - 1, 1, &sub);
-	diff = isl_qpolynomial_sub(diff, isl_qpolynomial_copy(poly));
-
-	s = has_sign(bset, diff, 1, data->signs);
-	if (s < 0)
-		goto error;
-	if (s)
-		result = 1;
-	else {
-		s = has_sign(bset, diff, -1, data->signs);
-		if (s < 0)
-			goto error;
-		if (s)
-			result = -1;
-	}
-
-	isl_qpolynomial_free(diff);
-	isl_qpolynomial_free(sub);
-
-	return result;
-error:
-	isl_qpolynomial_free(diff);
-	isl_qpolynomial_free(sub);
-	return -2;
-}
-
-static __isl_give isl_qpolynomial *bound2poly(__isl_take isl_constraint *bound,
-	__isl_take isl_dim *dim, unsigned pos, int sign)
-{
-	if (!bound) {
-		if (sign > 0)
-			return isl_qpolynomial_infty(dim);
-		else
-			return isl_qpolynomial_neginfty(dim);
-	}
-	isl_dim_free(dim);
-	return isl_qpolynomial_from_constraint(bound, isl_dim_set, pos);
-}
-
-static int bound_is_integer(__isl_take isl_constraint *bound, unsigned pos)
-{
-	isl_int c;
-	int is_int;
-
-	if (!bound)
-		return 1;
-
-	isl_int_init(c);
-	isl_constraint_get_coefficient(bound, isl_dim_set, pos, &c);
-	is_int = isl_int_is_one(c) || isl_int_is_negone(c);
-	isl_int_clear(c);
-
-	return is_int;
-}
-
-struct isl_fixed_sign_data {
-	int		*signs;
-	int		sign;
-	isl_qpolynomial	*poly;
-};
-
-/* Add term "term" to data->poly if it has sign data->sign.
- * The sign is determined based on the signs of the parameters
- * and variables in data->signs.  The integer divisions, if
- * any, are assumed to be non-negative.
- */
-static int collect_fixed_sign_terms(__isl_take isl_term *term, void *user)
-{
-	struct isl_fixed_sign_data *data = (struct isl_fixed_sign_data *)user;
-	isl_int n;
-	int i;
-	int sign;
-	unsigned nparam;
-	unsigned nvar;
-
-	if (!term)
-		return -1;
-
-	nparam = isl_term_dim(term, isl_dim_param);
-	nvar = isl_term_dim(term, isl_dim_set);
-
-	isl_int_init(n);
-
-	isl_term_get_num(term, &n);
-
-	sign = isl_int_sgn(n);
-	for (i = 0; i < nparam; ++i) {
-		if (data->signs[i] > 0)
-			continue;
-		if (isl_term_get_exp(term, isl_dim_param, i) % 2)
-			sign = -sign;
-	}
-	for (i = 0; i < nvar; ++i) {
-		if (data->signs[nparam + i] > 0)
-			continue;
-		if (isl_term_get_exp(term, isl_dim_set, i) % 2)
-			sign = -sign;
-	}
-
-	if (sign == data->sign) {
-		isl_qpolynomial *t = isl_qpolynomial_from_term(term);
-
-		data->poly = isl_qpolynomial_add(data->poly, t);
-	} else
-		isl_term_free(term);
-
-	isl_int_clear(n);
-
-	return 0;
-}
-
-/* Construct and return a polynomial that consists of the terms
- * in "poly" that have sign "sign".  The integer divisions, if
- * any, are assumed to be non-negative.
- */
-__isl_give isl_qpolynomial *isl_qpolynomial_terms_of_sign(
-	__isl_keep isl_qpolynomial *poly, int *signs, int sign)
-{
-	struct isl_fixed_sign_data data = { signs, sign };
-	data.poly = isl_qpolynomial_zero(isl_qpolynomial_get_dim(poly));
-
-	if (isl_qpolynomial_foreach_term(poly, collect_fixed_sign_terms, &data) < 0)
-		goto error;
-
-	return data.poly;
-error:
-	isl_qpolynomial_free(data.poly);
-	return NULL;
-}
-
-/* Helper function to add a guarded polynomial to either pwf_tight or pwf,
- * depending on whether the result has been determined to be tight.
- */
-static int add_guarded_poly(__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, struct range_data *data)
-{
-	enum isl_fold type = data->sign < 0 ? isl_fold_min : isl_fold_max;
-	isl_set *set;
-	isl_qpolynomial_fold *fold;
-	isl_pw_qpolynomial_fold *pwf;
-
-	fold = isl_qpolynomial_fold_alloc(type, poly);
-	set = isl_set_from_basic_set(bset);
-	pwf = isl_pw_qpolynomial_fold_alloc(type, set, fold);
-	if (data->tight)
-		data->pwf_tight = isl_pw_qpolynomial_fold_fold(
-						data->pwf_tight, pwf);
-	else
-		data->pwf = isl_pw_qpolynomial_fold_fold(data->pwf, pwf);
-
-	return 0;
-}
-
-/* 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.
- * If the polynomial has been determined to be monotonic
- * in the variable, then simply plug in the appropriate bound.
- * If the current polynomial is tight and if this bound is integer,
- * then the result is still tight.  In all other cases, the results
- * may not be tight.
- * Otherwise, plug in the largest bound (in absolute value) in
- * the positive terms (if an upper bound is wanted) or the negative terms
- * (if a lower bounded is wanted) and the other bound in the other terms.
- *
- * If all variables have been eliminated, then record the result.
- * Ohterwise, recurse on the next variable.
- */
-static int propagate_on_bound_pair(__isl_take isl_constraint *lower,
-	__isl_take isl_constraint *upper, __isl_take isl_basic_set *bset,
-	void *user)
-{
-	struct range_data *data = (struct range_data *)user;
-	int save_tight = data->tight;
-	isl_qpolynomial *poly;
-	int r;
-	unsigned nvar;
-
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-
-	if (data->monotonicity) {
-		isl_qpolynomial *sub;
-		isl_dim *dim = isl_qpolynomial_get_dim(data->poly);
-		if (data->monotonicity * data->sign > 0) {
-			if (data->tight)
-				data->tight = bound_is_integer(upper, nvar);
-			sub = bound2poly(upper, dim, nvar, 1);
-			isl_constraint_free(lower);
-		} else {
-			if (data->tight)
-				data->tight = bound_is_integer(lower, nvar);
-			sub = bound2poly(lower, dim, nvar, -1);
-			isl_constraint_free(upper);
-		}
-		poly = isl_qpolynomial_copy(data->poly);
-		poly = isl_qpolynomial_substitute(poly, isl_dim_set, nvar, 1, &sub);
-		poly = isl_qpolynomial_drop_dims(poly, isl_dim_set, nvar, 1);
-
-		isl_qpolynomial_free(sub);
-	} else {
-		isl_qpolynomial *l, *u;
-		isl_qpolynomial *pos, *neg;
-		isl_dim *dim = isl_qpolynomial_get_dim(data->poly);
-		unsigned nparam = isl_basic_set_dim(bset, isl_dim_param);
-		int sign = data->sign * data->signs[nparam + nvar];
-
-		data->tight = 0;
-
-		u = bound2poly(upper, isl_dim_copy(dim), nvar, 1);
-		l = bound2poly(lower, dim, nvar, -1);
-
-		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_set, nvar, 1, &u);
-		neg = isl_qpolynomial_substitute(neg, isl_dim_set, nvar, 1, &l);
-
-		poly = isl_qpolynomial_add(pos, neg);
-		poly = isl_qpolynomial_drop_dims(poly, isl_dim_set, nvar, 1);
-
-		isl_qpolynomial_free(u);
-		isl_qpolynomial_free(l);
-	}
-
-	if (isl_basic_set_dim(bset, isl_dim_set) == 0)
-		r = add_guarded_poly(bset, poly, data);
-	else
-		r = propagate_on_domain(bset, poly, data);
-
-	data->tight = save_tight;
-
-	return r;
-}
-
-/* Recursively perform range propagation on the polynomial "poly"
- * defined over the basic set "bset" and collect the results in "data".
- */
-static int propagate_on_domain(__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, struct range_data *data)
-{
-	isl_ctx *ctx;
-	isl_qpolynomial *save_poly = data->poly;
-	int save_monotonicity = data->monotonicity;
-	unsigned d;
-
-	if (!bset || !poly)
-		goto error;
-
-	ctx = isl_basic_set_get_ctx(bset);
-	d = isl_basic_set_dim(bset, isl_dim_set);
-	isl_assert(ctx, d >= 1, goto error);
-
-	if (isl_qpolynomial_is_cst(poly, NULL, NULL)) {
-		bset = isl_basic_set_project_out(bset, isl_dim_set, 0, d);
-		poly = isl_qpolynomial_drop_dims(poly, isl_dim_set, 0, d);
-		return add_guarded_poly(bset, poly, data);
-	}
-
-	if (data->test_monotonicity)
-		data->monotonicity = monotonicity(bset, poly, data);
-	else
-		data->monotonicity = 0;
-	if (data->monotonicity < -1)
-		goto error;
-
-	data->poly = poly;
-	if (isl_basic_set_foreach_bound_pair(bset, isl_dim_set, d - 1,
-					    &propagate_on_bound_pair, data) < 0)
-		goto error;
-
-	isl_basic_set_free(bset);
-	isl_qpolynomial_free(poly);
-	data->monotonicity = save_monotonicity;
-	data->poly = save_poly;
-
-	return 0;
-error:
-	isl_basic_set_free(bset);
-	isl_qpolynomial_free(poly);
-	data->monotonicity = save_monotonicity;
-	data->poly = save_poly;
-	return -1;
-}
-
-static int basic_guarded_poly_bound(__isl_take isl_basic_set *bset, void *user)
-{
-	struct range_data *data = (struct range_data *)user;
-	isl_ctx *ctx;
-	unsigned nparam = isl_basic_set_dim(bset, isl_dim_param);
-	unsigned dim = isl_basic_set_dim(bset, isl_dim_set);
-	int r;
-
-	data->signs = NULL;
-
-	ctx = isl_basic_set_get_ctx(bset);
-	data->signs = isl_alloc_array(ctx, int,
-					isl_basic_set_dim(bset, isl_dim_all));
-
-	if (isl_basic_set_dims_get_sign(bset, isl_dim_set, 0, dim,
-					data->signs + nparam) < 0)
-		goto error;
-	if (isl_basic_set_dims_get_sign(bset, isl_dim_param, 0, nparam,
-					data->signs) < 0)
-		goto error;
-
-	r = propagate_on_domain(bset, isl_qpolynomial_copy(data->poly), data);
-
-	free(data->signs);
-
-	return r;
-error:
-	free(data->signs);
-	isl_basic_set_free(bset);
-	return -1;
-}
-
-static int qpolynomial_bound_on_domain_range(__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, struct range_data *data)
-{
-	unsigned nparam = isl_basic_set_dim(bset, isl_dim_param);
-	unsigned nvar = isl_basic_set_dim(bset, isl_dim_set);
-	isl_set *set;
-
-	if (!bset)
-		goto error;
-
-	if (nvar == 0)
-		return add_guarded_poly(bset, poly, data);
-
-	set = isl_set_from_basic_set(bset);
-	set = isl_set_split_dims(set, isl_dim_param, 0, nparam);
-	set = isl_set_split_dims(set, isl_dim_set, 0, nvar);
-
-	data->poly = poly;
-
-	data->test_monotonicity = 1;
-	if (isl_set_foreach_basic_set(set, &basic_guarded_poly_bound, data) < 0)
-		goto error;
-
-	isl_set_free(set);
-	isl_qpolynomial_free(poly);
-
-	return 0;
-error:
-	isl_set_free(set);
-	isl_qpolynomial_free(poly);
-	return -1;
-}
-
-int isl_qpolynomial_bound_on_domain_range(__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, struct isl_bound *bound)
-{
-	struct range_data data;
-	int r;
-
-	data.pwf = bound->pwf;
-	data.pwf_tight = bound->pwf_tight;
-	data.tight = bound->check_tight;
-	if (bound->type == isl_fold_min)
-		data.sign = -1;
-	else
-		data.sign = 1;
-
-	r = qpolynomial_bound_on_domain_range(bset, poly, &data);
-
-	bound->pwf = data.pwf;
-	bound->pwf_tight = data.pwf_tight;
-
-	return r;
-}
diff --git a/cloog-0.16.3/isl/isl_range.h b/cloog-0.16.3/isl/isl_range.h
deleted file mode 100644
index c097079..0000000
--- a/cloog-0.16.3/isl/isl_range.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <isl_bound.h>
-
-int isl_qpolynomial_bound_on_domain_range(__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, struct isl_bound *bound);
-__isl_give isl_qpolynomial *isl_qpolynomial_terms_of_sign(
-	__isl_keep isl_qpolynomial *poly, int *signs, int sign);
diff --git a/cloog-0.16.3/isl/isl_reordering.c b/cloog-0.16.3/isl/isl_reordering.c
deleted file mode 100644
index 392152f..0000000
--- a/cloog-0.16.3/isl/isl_reordering.c
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France
- */
-
-#include <isl_ctx_private.h>
-#include <isl_dim_private.h>
-#include <isl_reordering.h>
-
-__isl_give isl_reordering *isl_reordering_alloc(isl_ctx *ctx, int len)
-{
-	isl_reordering *exp;
-
-	exp = isl_alloc(ctx, struct isl_reordering,
-			sizeof(struct isl_reordering) + (len - 1) * sizeof(int));
-	if (!exp)
-		return NULL;
-
-	exp->ref = 1;
-	exp->len = len;
-	exp->dim = NULL;
-
-	return exp;
-}
-
-__isl_give isl_reordering *isl_reordering_copy(__isl_keep isl_reordering *exp)
-{
-	if (!exp)
-		return NULL;
-
-	exp->ref++;
-	return exp;
-}
-
-__isl_give isl_reordering *isl_reordering_dup(__isl_keep isl_reordering *r)
-{
-	int i;
-	isl_reordering *dup;
-
-	if (!r)
-		return NULL;
-
-	dup = isl_reordering_alloc(r->dim->ctx, r->len);
-	if (!dup)
-		return NULL;
-
-	dup->dim = isl_dim_copy(r->dim);
-	if (!dup->dim)
-		return isl_reordering_free(dup);
-	for (i = 0; i < dup->len; ++i)
-		dup->pos[i] = r->pos[i];
-
-	return dup;
-}
-
-__isl_give isl_reordering *isl_reordering_cow(__isl_take isl_reordering *r)
-{
-	if (!r)
-		return NULL;
-
-	if (r->ref == 1)
-		return r;
-	r->ref--;
-	return isl_reordering_dup(r);
-}
-
-void *isl_reordering_free(__isl_take isl_reordering *exp)
-{
-	if (!exp)
-		return NULL;
-
-	if (--exp->ref > 0)
-		return NULL;
-
-	isl_dim_free(exp->dim);
-	free(exp);
-	return NULL;
-}
-
-/* Construct a reordering that maps the parameters of "alignee"
- * to the corresponding parameters in a new dimension specification
- * that has the parameters of "aligner" first, followed by
- * any remaining parameters of "alignee" that do not occur in "aligner".
- */
-__isl_give isl_reordering *isl_parameter_alignment_reordering(
-	__isl_keep isl_dim *alignee, __isl_keep isl_dim *aligner)
-{
-	int i, j;
-	isl_reordering *exp;
-
-	if (!alignee || !aligner)
-		return NULL;
-
-	exp = isl_reordering_alloc(alignee->ctx, alignee->nparam);
-	if (!exp)
-		return NULL;
-
-	exp->dim = isl_dim_copy(aligner);
-
-	for (i = 0; i < alignee->nparam; ++i) {
-		const char *name_i;
-		name_i = isl_dim_get_name(alignee, isl_dim_param, i);
-		if (!name_i)
-			isl_die(alignee->ctx, isl_error_invalid,
-				"cannot align unnamed parameters", goto error);
-		for (j = 0; j < aligner->nparam; ++j) {
-			const char *name_j;
-			name_j = isl_dim_get_name(aligner, isl_dim_param, j);
-			if (name_i == name_j)
-				break;
-		}
-		if (j < aligner->nparam)
-			exp->pos[i] = j;
-		else {
-			int pos;
-			pos = isl_dim_size(exp->dim, isl_dim_param);
-			exp->dim = isl_dim_add(exp->dim, isl_dim_param, 1);
-			exp->dim = isl_dim_set_name(exp->dim,
-						isl_dim_param, pos, name_i);
-			exp->pos[i] = pos;
-		}
-	}
-
-	return exp;
-error:
-	isl_reordering_free(exp);
-	return NULL;
-}
-
-__isl_give isl_reordering *isl_reordering_extend(__isl_take isl_reordering *exp,
-	unsigned extra)
-{
-	int i;
-	isl_reordering *res;
-	int offset;
-
-	if (!exp)
-		return NULL;
-	if (extra == 0)
-		return exp;
-
-	offset = isl_dim_total(exp->dim) - exp->len;
-	res = isl_reordering_alloc(exp->dim->ctx, exp->len + extra);
-	if (!res)
-		goto error;
-	res->dim = isl_dim_copy(exp->dim);
-	for (i = 0; i < exp->len; ++i)
-		res->pos[i] = exp->pos[i];
-	for (i = exp->len; i < res->len; ++i)
-		res->pos[i] = offset + i;
-
-	isl_reordering_free(exp);
-
-	return res;
-error:
-	isl_reordering_free(exp);
-	return NULL;
-}
-
-__isl_give isl_reordering *isl_reordering_extend_dim(
-	__isl_take isl_reordering *exp, __isl_take isl_dim *dim)
-{
-	isl_reordering *res;
-
-	if (!exp || !dim)
-		goto error;
-
-	res = isl_reordering_extend(isl_reordering_copy(exp),
-					    isl_dim_total(dim) - exp->len);
-	res = isl_reordering_cow(res);
-	if (!res)
-		goto error;
-	isl_dim_free(res->dim);
-	res->dim = isl_dim_replace(dim, isl_dim_param, exp->dim);
-
-	isl_reordering_free(exp);
-
-	return res;
-error:
-	isl_reordering_free(exp);
-	isl_dim_free(dim);
-	return NULL;
-}
-
-void isl_reordering_dump(__isl_keep isl_reordering *exp)
-{
-	int i;
-
-	for (i = 0; i < exp->len; ++i)
-		fprintf(stderr, "%d -> %d; ", i, exp->pos[i]);
-	fprintf(stderr, "\n");
-}
diff --git a/cloog-0.16.3/isl/isl_reordering.h b/cloog-0.16.3/isl/isl_reordering.h
deleted file mode 100644
index 7560d3a..0000000
--- a/cloog-0.16.3/isl/isl_reordering.h
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef ISL_REORDERING_H
-#define ISL_REORDERING_H
-
-#include <isl/dim.h>
-
-/* pos maps original dimensions to new dimensions.
- * The final dimension is given by dim.
- * The number of dimensions (i.e., the range of values) in the result
- * may be larger than the number of dimensions in the input.
- * In particular, the possible values of the entries in pos ranges from 0 to
- * the total dimension of dim - 1, unless isl_reordering_extend
- * has been called.
- */
-struct isl_reordering {
-	int ref;
-	isl_dim *dim;
-	unsigned len;
-	int pos[1];
-};
-typedef struct isl_reordering isl_reordering;
-
-__isl_give isl_reordering *isl_parameter_alignment_reordering(
-	__isl_keep isl_dim *alignee, __isl_keep isl_dim *aligner);
-__isl_give isl_reordering *isl_reordering_copy(__isl_keep isl_reordering *exp);
-void *isl_reordering_free(__isl_take isl_reordering *exp);
-__isl_give isl_reordering *isl_reordering_extend_dim(
-	__isl_take isl_reordering *exp, __isl_take isl_dim *dim);
-__isl_give isl_reordering *isl_reordering_extend(__isl_take isl_reordering *exp,
-	unsigned extra);
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_sample.c b/cloog-0.16.3/isl/isl_sample.c
deleted file mode 100644
index 9c9fb6d..0000000
--- a/cloog-0.16.3/isl/isl_sample.c
+++ /dev/null
@@ -1,1357 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include "isl_sample.h"
-#include "isl_sample_piplib.h"
-#include <isl/vec.h>
-#include <isl/mat.h>
-#include <isl/seq.h>
-#include "isl_equalities.h"
-#include "isl_tab.h"
-#include "isl_basis_reduction.h"
-#include <isl_factorization.h>
-#include <isl_point_private.h>
-
-static struct isl_vec *empty_sample(struct isl_basic_set *bset)
-{
-	struct isl_vec *vec;
-
-	vec = isl_vec_alloc(bset->ctx, 0);
-	isl_basic_set_free(bset);
-	return vec;
-}
-
-/* Construct a zero sample of the same dimension as bset.
- * As a special case, if bset is zero-dimensional, this
- * function creates a zero-dimensional sample point.
- */
-static struct isl_vec *zero_sample(struct isl_basic_set *bset)
-{
-	unsigned dim;
-	struct isl_vec *sample;
-
-	dim = isl_basic_set_total_dim(bset);
-	sample = isl_vec_alloc(bset->ctx, 1 + dim);
-	if (sample) {
-		isl_int_set_si(sample->el[0], 1);
-		isl_seq_clr(sample->el + 1, dim);
-	}
-	isl_basic_set_free(bset);
-	return sample;
-}
-
-static struct isl_vec *interval_sample(struct isl_basic_set *bset)
-{
-	int i;
-	isl_int t;
-	struct isl_vec *sample;
-
-	bset = isl_basic_set_simplify(bset);
-	if (!bset)
-		return NULL;
-	if (isl_basic_set_plain_is_empty(bset))
-		return empty_sample(bset);
-	if (bset->n_eq == 0 && bset->n_ineq == 0)
-		return zero_sample(bset);
-
-	sample = isl_vec_alloc(bset->ctx, 2);
-	if (!sample)
-		goto error;
-	if (!bset)
-		return NULL;
-	isl_int_set_si(sample->block.data[0], 1);
-
-	if (bset->n_eq > 0) {
-		isl_assert(bset->ctx, bset->n_eq == 1, goto error);
-		isl_assert(bset->ctx, bset->n_ineq == 0, goto error);
-		if (isl_int_is_one(bset->eq[0][1]))
-			isl_int_neg(sample->el[1], bset->eq[0][0]);
-		else {
-			isl_assert(bset->ctx, isl_int_is_negone(bset->eq[0][1]),
-				   goto error);
-			isl_int_set(sample->el[1], bset->eq[0][0]);
-		}
-		isl_basic_set_free(bset);
-		return sample;
-	}
-
-	isl_int_init(t);
-	if (isl_int_is_one(bset->ineq[0][1]))
-		isl_int_neg(sample->block.data[1], bset->ineq[0][0]);
-	else
-		isl_int_set(sample->block.data[1], bset->ineq[0][0]);
-	for (i = 1; i < bset->n_ineq; ++i) {
-		isl_seq_inner_product(sample->block.data,
-					bset->ineq[i], 2, &t);
-		if (isl_int_is_neg(t))
-			break;
-	}
-	isl_int_clear(t);
-	if (i < bset->n_ineq) {
-		isl_vec_free(sample);
-		return empty_sample(bset);
-	}
-
-	isl_basic_set_free(bset);
-	return sample;
-error:
-	isl_basic_set_free(bset);
-	isl_vec_free(sample);
-	return NULL;
-}
-
-static struct isl_mat *independent_bounds(struct isl_basic_set *bset)
-{
-	int i, j, n;
-	struct isl_mat *dirs = NULL;
-	struct isl_mat *bounds = NULL;
-	unsigned dim;
-
-	if (!bset)
-		return NULL;
-
-	dim = isl_basic_set_n_dim(bset);
-	bounds = isl_mat_alloc(bset->ctx, 1+dim, 1+dim);
-	if (!bounds)
-		return NULL;
-
-	isl_int_set_si(bounds->row[0][0], 1);
-	isl_seq_clr(bounds->row[0]+1, dim);
-	bounds->n_row = 1;
-
-	if (bset->n_ineq == 0)
-		return bounds;
-
-	dirs = isl_mat_alloc(bset->ctx, dim, dim);
-	if (!dirs) {
-		isl_mat_free(bounds);
-		return NULL;
-	}
-	isl_seq_cpy(dirs->row[0], bset->ineq[0]+1, dirs->n_col);
-	isl_seq_cpy(bounds->row[1], bset->ineq[0], bounds->n_col);
-	for (j = 1, n = 1; n < dim && j < bset->n_ineq; ++j) {
-		int pos;
-
-		isl_seq_cpy(dirs->row[n], bset->ineq[j]+1, dirs->n_col);
-
-		pos = isl_seq_first_non_zero(dirs->row[n], dirs->n_col);
-		if (pos < 0)
-			continue;
-		for (i = 0; i < n; ++i) {
-			int pos_i;
-			pos_i = isl_seq_first_non_zero(dirs->row[i], dirs->n_col);
-			if (pos_i < pos)
-				continue;
-			if (pos_i > pos)
-				break;
-			isl_seq_elim(dirs->row[n], dirs->row[i], pos,
-					dirs->n_col, NULL);
-			pos = isl_seq_first_non_zero(dirs->row[n], dirs->n_col);
-			if (pos < 0)
-				break;
-		}
-		if (pos < 0)
-			continue;
-		if (i < n) {
-			int k;
-			isl_int *t = dirs->row[n];
-			for (k = n; k > i; --k)
-				dirs->row[k] = dirs->row[k-1];
-			dirs->row[i] = t;
-		}
-		++n;
-		isl_seq_cpy(bounds->row[n], bset->ineq[j], bounds->n_col);
-	}
-	isl_mat_free(dirs);
-	bounds->n_row = 1+n;
-	return bounds;
-}
-
-static void swap_inequality(struct isl_basic_set *bset, int a, int b)
-{
-	isl_int *t = bset->ineq[a];
-	bset->ineq[a] = bset->ineq[b];
-	bset->ineq[b] = t;
-}
-
-/* Skew into positive orthant and project out lineality space.
- *
- * We perform a unimodular transformation that turns a selected
- * maximal set of linearly independent bounds into constraints
- * on the first dimensions that impose that these first dimensions
- * are non-negative.  In particular, the constraint matrix is lower
- * triangular with positive entries on the diagonal and negative
- * entries below.
- * If "bset" has a lineality space then these constraints (and therefore
- * all constraints in bset) only involve the first dimensions.
- * The remaining dimensions then do not appear in any constraints and
- * we can select any value for them, say zero.  We therefore project
- * out this final dimensions and plug in the value zero later.  This
- * is accomplished by simply dropping the final columns of
- * the unimodular transformation.
- */
-static struct isl_basic_set *isl_basic_set_skew_to_positive_orthant(
-	struct isl_basic_set *bset, struct isl_mat **T)
-{
-	struct isl_mat *U = NULL;
-	struct isl_mat *bounds = NULL;
-	int i, j;
-	unsigned old_dim, new_dim;
-
-	*T = NULL;
-	if (!bset)
-		return NULL;
-
-	isl_assert(bset->ctx, isl_basic_set_n_param(bset) == 0, goto error);
-	isl_assert(bset->ctx, bset->n_div == 0, goto error);
-	isl_assert(bset->ctx, bset->n_eq == 0, goto error);
-	
-	old_dim = isl_basic_set_n_dim(bset);
-	/* Try to move (multiples of) unit rows up. */
-	for (i = 0, j = 0; i < bset->n_ineq; ++i) {
-		int pos = isl_seq_first_non_zero(bset->ineq[i]+1, old_dim);
-		if (pos < 0)
-			continue;
-		if (isl_seq_first_non_zero(bset->ineq[i]+1+pos+1,
-						old_dim-pos-1) >= 0)
-			continue;
-		if (i != j)
-			swap_inequality(bset, i, j);
-		++j;
-	}
-	bounds = independent_bounds(bset);
-	if (!bounds)
-		goto error;
-	new_dim = bounds->n_row - 1;
-	bounds = isl_mat_left_hermite(bounds, 1, &U, NULL);
-	if (!bounds)
-		goto error;
-	U = isl_mat_drop_cols(U, 1 + new_dim, old_dim - new_dim);
-	bset = isl_basic_set_preimage(bset, isl_mat_copy(U));
-	if (!bset)
-		goto error;
-	*T = U;
-	isl_mat_free(bounds);
-	return bset;
-error:
-	isl_mat_free(bounds);
-	isl_mat_free(U);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Find a sample integer point, if any, in bset, which is known
- * to have equalities.  If bset contains no integer points, then
- * return a zero-length vector.
- * We simply remove the known equalities, compute a sample
- * in the resulting bset, using the specified recurse function,
- * and then transform the sample back to the original space.
- */
-static struct isl_vec *sample_eq(struct isl_basic_set *bset,
-	struct isl_vec *(*recurse)(struct isl_basic_set *))
-{
-	struct isl_mat *T;
-	struct isl_vec *sample;
-
-	if (!bset)
-		return NULL;
-
-	bset = isl_basic_set_remove_equalities(bset, &T, NULL);
-	sample = recurse(bset);
-	if (!sample || sample->size == 0)
-		isl_mat_free(T);
-	else
-		sample = isl_mat_vec_product(T, sample);
-	return sample;
-}
-
-/* Return a matrix containing the equalities of the tableau
- * in constraint form.  The tableau is assumed to have
- * an associated bset that has been kept up-to-date.
- */
-static struct isl_mat *tab_equalities(struct isl_tab *tab)
-{
-	int i, j;
-	int n_eq;
-	struct isl_mat *eq;
-	struct isl_basic_set *bset;
-
-	if (!tab)
-		return NULL;
-
-	bset = isl_tab_peek_bset(tab);
-	isl_assert(tab->mat->ctx, bset, return NULL);
-
-	n_eq = tab->n_var - tab->n_col + tab->n_dead;
-	if (tab->empty || n_eq == 0)
-		return isl_mat_alloc(tab->mat->ctx, 0, tab->n_var);
-	if (n_eq == tab->n_var)
-		return isl_mat_identity(tab->mat->ctx, tab->n_var);
-
-	eq = isl_mat_alloc(tab->mat->ctx, n_eq, tab->n_var);
-	if (!eq)
-		return NULL;
-	for (i = 0, j = 0; i < tab->n_con; ++i) {
-		if (tab->con[i].is_row)
-			continue;
-		if (tab->con[i].index >= 0 && tab->con[i].index >= tab->n_dead)
-			continue;
-		if (i < bset->n_eq)
-			isl_seq_cpy(eq->row[j], bset->eq[i] + 1, tab->n_var);
-		else
-			isl_seq_cpy(eq->row[j],
-				    bset->ineq[i - bset->n_eq] + 1, tab->n_var);
-		++j;
-	}
-	isl_assert(bset->ctx, j == n_eq, goto error);
-	return eq;
-error:
-	isl_mat_free(eq);
-	return NULL;
-}
-
-/* Compute and return an initial basis for the bounded tableau "tab".
- *
- * If the tableau is either full-dimensional or zero-dimensional,
- * the we simply return an identity matrix.
- * Otherwise, we construct a basis whose first directions correspond
- * to equalities.
- */
-static struct isl_mat *initial_basis(struct isl_tab *tab)
-{
-	int n_eq;
-	struct isl_mat *eq;
-	struct isl_mat *Q;
-
-	tab->n_unbounded = 0;
-	tab->n_zero = n_eq = tab->n_var - tab->n_col + tab->n_dead;
-	if (tab->empty || n_eq == 0 || n_eq == tab->n_var)
-		return isl_mat_identity(tab->mat->ctx, 1 + tab->n_var);
-
-	eq = tab_equalities(tab);
-	eq = isl_mat_left_hermite(eq, 0, NULL, &Q);
-	if (!eq)
-		return NULL;
-	isl_mat_free(eq);
-
-	Q = isl_mat_lin_to_aff(Q);
-	return Q;
-}
-
-/* Given a tableau representing a set, find and return
- * an integer point in the set, if there is any.
- *
- * We perform a depth first search
- * for an integer point, by scanning all possible values in the range
- * attained by a basis vector, where an initial basis may have been set
- * by the calling function.  Otherwise an initial basis that exploits
- * the equalities in the tableau is created.
- * tab->n_zero is currently ignored and is clobbered by this function.
- *
- * The tableau is allowed to have unbounded direction, but then
- * the calling function needs to set an initial basis, with the
- * unbounded directions last and with tab->n_unbounded set
- * to the number of unbounded directions.
- * Furthermore, the calling functions needs to add shifted copies
- * of all constraints involving unbounded directions to ensure
- * that any feasible rational value in these directions can be rounded
- * up to yield a feasible integer value.
- * In particular, let B define the given basis x' = B x
- * and let T be the inverse of B, i.e., X = T x'.
- * Let a x + c >= 0 be a constraint of the set represented by the tableau,
- * or a T x' + c >= 0 in terms of the given basis.  Assume that
- * the bounded directions have an integer value, then we can safely
- * round up the values for the unbounded directions if we make sure
- * that x' not only satisfies the original constraint, but also
- * the constraint "a T x' + c + s >= 0" with s the sum of all
- * negative values in the last n_unbounded entries of "a T".
- * The calling function therefore needs to add the constraint
- * a x + c + s >= 0.  The current function then scans the first
- * directions for an integer value and once those have been found,
- * it can compute "T ceil(B x)" to yield an integer point in the set.
- * Note that during the search, the first rows of B may be changed
- * by a basis reduction, but the last n_unbounded rows of B remain
- * unaltered and are also not mixed into the first rows.
- *
- * The search is implemented iteratively.  "level" identifies the current
- * basis vector.  "init" is true if we want the first value at the current
- * level and false if we want the next value.
- *
- * The initial basis is the identity matrix.  If the range in some direction
- * contains more than one integer value, we perform basis reduction based
- * on the value of ctx->opt->gbr
- *	- ISL_GBR_NEVER:	never perform basis reduction
- *	- ISL_GBR_ONCE:		only perform basis reduction the first
- *				time such a range is encountered
- *	- ISL_GBR_ALWAYS:	always perform basis reduction when
- *				such a range is encountered
- *
- * When ctx->opt->gbr is set to ISL_GBR_ALWAYS, then we allow the basis
- * reduction computation to return early.  That is, as soon as it
- * finds a reasonable first direction.
- */ 
-struct isl_vec *isl_tab_sample(struct isl_tab *tab)
-{
-	unsigned dim;
-	unsigned gbr;
-	struct isl_ctx *ctx;
-	struct isl_vec *sample;
-	struct isl_vec *min;
-	struct isl_vec *max;
-	enum isl_lp_result res;
-	int level;
-	int init;
-	int reduced;
-	struct isl_tab_undo **snap;
-
-	if (!tab)
-		return NULL;
-	if (tab->empty)
-		return isl_vec_alloc(tab->mat->ctx, 0);
-
-	if (!tab->basis)
-		tab->basis = initial_basis(tab);
-	if (!tab->basis)
-		return NULL;
-	isl_assert(tab->mat->ctx, tab->basis->n_row == tab->n_var + 1,
-		    return NULL);
-	isl_assert(tab->mat->ctx, tab->basis->n_col == tab->n_var + 1,
-		    return NULL);
-
-	ctx = tab->mat->ctx;
-	dim = tab->n_var;
-	gbr = ctx->opt->gbr;
-
-	if (tab->n_unbounded == tab->n_var) {
-		sample = isl_tab_get_sample_value(tab);
-		sample = isl_mat_vec_product(isl_mat_copy(tab->basis), sample);
-		sample = isl_vec_ceil(sample);
-		sample = isl_mat_vec_inverse_product(isl_mat_copy(tab->basis),
-							sample);
-		return sample;
-	}
-
-	if (isl_tab_extend_cons(tab, dim + 1) < 0)
-		return NULL;
-
-	min = isl_vec_alloc(ctx, dim);
-	max = isl_vec_alloc(ctx, dim);
-	snap = isl_alloc_array(ctx, struct isl_tab_undo *, dim);
-
-	if (!min || !max || !snap)
-		goto error;
-
-	level = 0;
-	init = 1;
-	reduced = 0;
-
-	while (level >= 0) {
-		int empty = 0;
-		if (init) {
-			res = isl_tab_min(tab, tab->basis->row[1 + level],
-				    ctx->one, &min->el[level], NULL, 0);
-			if (res == isl_lp_empty)
-				empty = 1;
-			isl_assert(ctx, res != isl_lp_unbounded, goto error);
-			if (res == isl_lp_error)
-				goto error;
-			if (!empty && isl_tab_sample_is_integer(tab))
-				break;
-			isl_seq_neg(tab->basis->row[1 + level] + 1,
-				    tab->basis->row[1 + level] + 1, dim);
-			res = isl_tab_min(tab, tab->basis->row[1 + level],
-				    ctx->one, &max->el[level], NULL, 0);
-			isl_seq_neg(tab->basis->row[1 + level] + 1,
-				    tab->basis->row[1 + level] + 1, dim);
-			isl_int_neg(max->el[level], max->el[level]);
-			if (res == isl_lp_empty)
-				empty = 1;
-			isl_assert(ctx, res != isl_lp_unbounded, goto error);
-			if (res == isl_lp_error)
-				goto error;
-			if (!empty && isl_tab_sample_is_integer(tab))
-				break;
-			if (!empty && !reduced &&
-			    ctx->opt->gbr != ISL_GBR_NEVER &&
-			    isl_int_lt(min->el[level], max->el[level])) {
-				unsigned gbr_only_first;
-				if (ctx->opt->gbr == ISL_GBR_ONCE)
-					ctx->opt->gbr = ISL_GBR_NEVER;
-				tab->n_zero = level;
-				gbr_only_first = ctx->opt->gbr_only_first;
-				ctx->opt->gbr_only_first =
-					ctx->opt->gbr == ISL_GBR_ALWAYS;
-				tab = isl_tab_compute_reduced_basis(tab);
-				ctx->opt->gbr_only_first = gbr_only_first;
-				if (!tab || !tab->basis)
-					goto error;
-				reduced = 1;
-				continue;
-			}
-			reduced = 0;
-			snap[level] = isl_tab_snap(tab);
-		} else
-			isl_int_add_ui(min->el[level], min->el[level], 1);
-
-		if (empty || isl_int_gt(min->el[level], max->el[level])) {
-			level--;
-			init = 0;
-			if (level >= 0)
-				if (isl_tab_rollback(tab, snap[level]) < 0)
-					goto error;
-			continue;
-		}
-		isl_int_neg(tab->basis->row[1 + level][0], min->el[level]);
-		if (isl_tab_add_valid_eq(tab, tab->basis->row[1 + level]) < 0)
-			goto error;
-		isl_int_set_si(tab->basis->row[1 + level][0], 0);
-		if (level + tab->n_unbounded < dim - 1) {
-			++level;
-			init = 1;
-			continue;
-		}
-		break;
-	}
-
-	if (level >= 0) {
-		sample = isl_tab_get_sample_value(tab);
-		if (!sample)
-			goto error;
-		if (tab->n_unbounded && !isl_int_is_one(sample->el[0])) {
-			sample = isl_mat_vec_product(isl_mat_copy(tab->basis),
-						     sample);
-			sample = isl_vec_ceil(sample);
-			sample = isl_mat_vec_inverse_product(
-					isl_mat_copy(tab->basis), sample);
-		}
-	} else
-		sample = isl_vec_alloc(ctx, 0);
-
-	ctx->opt->gbr = gbr;
-	isl_vec_free(min);
-	isl_vec_free(max);
-	free(snap);
-	return sample;
-error:
-	ctx->opt->gbr = gbr;
-	isl_vec_free(min);
-	isl_vec_free(max);
-	free(snap);
-	return NULL;
-}
-
-static struct isl_vec *sample_bounded(struct isl_basic_set *bset);
-
-/* Compute a sample point of the given basic set, based on the given,
- * non-trivial factorization.
- */
-static __isl_give isl_vec *factored_sample(__isl_take isl_basic_set *bset,
-	__isl_take isl_factorizer *f)
-{
-	int i, n;
-	isl_vec *sample = NULL;
-	isl_ctx *ctx;
-	unsigned nparam;
-	unsigned nvar;
-
-	ctx = isl_basic_set_get_ctx(bset);
-	if (!ctx)
-		goto error;
-
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-
-	sample = isl_vec_alloc(ctx, 1 + isl_basic_set_total_dim(bset));
-	if (!sample)
-		goto error;
-	isl_int_set_si(sample->el[0], 1);
-
-	bset = isl_morph_basic_set(isl_morph_copy(f->morph), bset);
-
-	for (i = 0, n = 0; i < f->n_group; ++i) {
-		isl_basic_set *bset_i;
-		isl_vec *sample_i;
-
-		bset_i = isl_basic_set_copy(bset);
-		bset_i = isl_basic_set_drop_constraints_involving(bset_i,
-			    nparam + n + f->len[i], nvar - n - f->len[i]);
-		bset_i = isl_basic_set_drop_constraints_involving(bset_i,
-			    nparam, n);
-		bset_i = isl_basic_set_drop(bset_i, isl_dim_set,
-			    n + f->len[i], nvar - n - f->len[i]);
-		bset_i = isl_basic_set_drop(bset_i, isl_dim_set, 0, n);
-
-		sample_i = sample_bounded(bset_i);
-		if (!sample_i)
-			goto error;
-		if (sample_i->size == 0) {
-			isl_basic_set_free(bset);
-			isl_factorizer_free(f);
-			isl_vec_free(sample);
-			return sample_i;
-		}
-		isl_seq_cpy(sample->el + 1 + nparam + n,
-			    sample_i->el + 1, f->len[i]);
-		isl_vec_free(sample_i);
-
-		n += f->len[i];
-	}
-
-	f->morph = isl_morph_inverse(f->morph);
-	sample = isl_morph_vec(isl_morph_copy(f->morph), sample);
-
-	isl_basic_set_free(bset);
-	isl_factorizer_free(f);
-	return sample;
-error:
-	isl_basic_set_free(bset);
-	isl_factorizer_free(f);
-	isl_vec_free(sample);
-	return NULL;
-}
-
-/* Given a basic set that is known to be bounded, find and return
- * an integer point in the basic set, if there is any.
- *
- * After handling some trivial cases, we construct a tableau
- * and then use isl_tab_sample to find a sample, passing it
- * the identity matrix as initial basis.
- */ 
-static struct isl_vec *sample_bounded(struct isl_basic_set *bset)
-{
-	unsigned dim;
-	struct isl_ctx *ctx;
-	struct isl_vec *sample;
-	struct isl_tab *tab = NULL;
-	isl_factorizer *f;
-
-	if (!bset)
-		return NULL;
-
-	if (isl_basic_set_plain_is_empty(bset))
-		return empty_sample(bset);
-
-	dim = isl_basic_set_total_dim(bset);
-	if (dim == 0)
-		return zero_sample(bset);
-	if (dim == 1)
-		return interval_sample(bset);
-	if (bset->n_eq > 0)
-		return sample_eq(bset, sample_bounded);
-
-	f = isl_basic_set_factorizer(bset);
-	if (!f)
-		goto error;
-	if (f->n_group != 0)
-		return factored_sample(bset, f);
-	isl_factorizer_free(f);
-		
-	ctx = bset->ctx;
-
-	tab = isl_tab_from_basic_set(bset);
-	if (tab && tab->empty) {
-		isl_tab_free(tab);
-		ISL_F_SET(bset, ISL_BASIC_SET_EMPTY);
-		sample = isl_vec_alloc(bset->ctx, 0);
-		isl_basic_set_free(bset);
-		return sample;
-	}
-
-	if (isl_tab_track_bset(tab, isl_basic_set_copy(bset)) < 0)
-		goto error;
-	if (!ISL_F_ISSET(bset, ISL_BASIC_SET_NO_IMPLICIT))
-		if (isl_tab_detect_implicit_equalities(tab) < 0)
-			goto error;
-
-	sample = isl_tab_sample(tab);
-	if (!sample)
-		goto error;
-
-	if (sample->size > 0) {
-		isl_vec_free(bset->sample);
-		bset->sample = isl_vec_copy(sample);
-	}
-
-	isl_basic_set_free(bset);
-	isl_tab_free(tab);
-	return sample;
-error:
-	isl_basic_set_free(bset);
-	isl_tab_free(tab);
-	return NULL;
-}
-
-/* Given a basic set "bset" and a value "sample" for the first coordinates
- * of bset, plug in these values and drop the corresponding coordinates.
- *
- * We do this by computing the preimage of the transformation
- *
- *	     [ 1 0 ]
- *	x =  [ s 0 ] x'
- *	     [ 0 I ]
- *
- * where [1 s] is the sample value and I is the identity matrix of the
- * appropriate dimension.
- */
-static struct isl_basic_set *plug_in(struct isl_basic_set *bset,
-	struct isl_vec *sample)
-{
-	int i;
-	unsigned total;
-	struct isl_mat *T;
-
-	if (!bset || !sample)
-		goto error;
-
-	total = isl_basic_set_total_dim(bset);
-	T = isl_mat_alloc(bset->ctx, 1 + total, 1 + total - (sample->size - 1));
-	if (!T)
-		goto error;
-
-	for (i = 0; i < sample->size; ++i) {
-		isl_int_set(T->row[i][0], sample->el[i]);
-		isl_seq_clr(T->row[i] + 1, T->n_col - 1);
-	}
-	for (i = 0; i < T->n_col - 1; ++i) {
-		isl_seq_clr(T->row[sample->size + i], T->n_col);
-		isl_int_set_si(T->row[sample->size + i][1 + i], 1);
-	}
-	isl_vec_free(sample);
-
-	bset = isl_basic_set_preimage(bset, T);
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	isl_vec_free(sample);
-	return NULL;
-}
-
-/* Given a basic set "bset", return any (possibly non-integer) point
- * in the basic set.
- */
-static struct isl_vec *rational_sample(struct isl_basic_set *bset)
-{
-	struct isl_tab *tab;
-	struct isl_vec *sample;
-
-	if (!bset)
-		return NULL;
-
-	tab = isl_tab_from_basic_set(bset);
-	sample = isl_tab_get_sample_value(tab);
-	isl_tab_free(tab);
-
-	isl_basic_set_free(bset);
-
-	return sample;
-}
-
-/* Given a linear cone "cone" and a rational point "vec",
- * construct a polyhedron with shifted copies of the constraints in "cone",
- * i.e., a polyhedron with "cone" as its recession cone, such that each
- * point x in this polyhedron is such that the unit box positioned at x
- * lies entirely inside the affine cone 'vec + cone'.
- * Any rational point in this polyhedron may therefore be rounded up
- * to yield an integer point that lies inside said affine cone.
- *
- * Denote the constraints of cone by "<a_i, x> >= 0" and the rational
- * point "vec" by v/d.
- * Let b_i = <a_i, v>.  Then the affine cone 'vec + cone' is given
- * by <a_i, x> - b/d >= 0.
- * The polyhedron <a_i, x> - ceil{b/d} >= 0 is a subset of this affine cone.
- * We prefer this polyhedron over the actual affine cone because it doesn't
- * require a scaling of the constraints.
- * If each of the vertices of the unit cube positioned at x lies inside
- * this polyhedron, then the whole unit cube at x lies inside the affine cone.
- * We therefore impose that x' = x + \sum e_i, for any selection of unit
- * vectors lies inside the polyhedron, i.e.,
- *
- *	<a_i, x'> - ceil{b/d} = <a_i, x> + sum a_i - ceil{b/d} >= 0
- *
- * The most stringent of these constraints is the one that selects
- * all negative a_i, so the polyhedron we are looking for has constraints
- *
- *	<a_i, x> + sum_{a_i < 0} a_i - ceil{b/d} >= 0
- *
- * Note that if cone were known to have only non-negative rays
- * (which can be accomplished by a unimodular transformation),
- * then we would only have to check the points x' = x + e_i
- * and we only have to add the smallest negative a_i (if any)
- * instead of the sum of all negative a_i.
- */
-static struct isl_basic_set *shift_cone(struct isl_basic_set *cone,
-	struct isl_vec *vec)
-{
-	int i, j, k;
-	unsigned total;
-
-	struct isl_basic_set *shift = NULL;
-
-	if (!cone || !vec)
-		goto error;
-
-	isl_assert(cone->ctx, cone->n_eq == 0, goto error);
-
-	total = isl_basic_set_total_dim(cone);
-
-	shift = isl_basic_set_alloc_dim(isl_basic_set_get_dim(cone),
-					0, 0, cone->n_ineq);
-
-	for (i = 0; i < cone->n_ineq; ++i) {
-		k = isl_basic_set_alloc_inequality(shift);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(shift->ineq[k] + 1, cone->ineq[i] + 1, total);
-		isl_seq_inner_product(shift->ineq[k] + 1, vec->el + 1, total,
-				      &shift->ineq[k][0]);
-		isl_int_cdiv_q(shift->ineq[k][0],
-			       shift->ineq[k][0], vec->el[0]);
-		isl_int_neg(shift->ineq[k][0], shift->ineq[k][0]);
-		for (j = 0; j < total; ++j) {
-			if (isl_int_is_nonneg(shift->ineq[k][1 + j]))
-				continue;
-			isl_int_add(shift->ineq[k][0],
-				    shift->ineq[k][0], shift->ineq[k][1 + j]);
-		}
-	}
-
-	isl_basic_set_free(cone);
-	isl_vec_free(vec);
-
-	return isl_basic_set_finalize(shift);
-error:
-	isl_basic_set_free(shift);
-	isl_basic_set_free(cone);
-	isl_vec_free(vec);
-	return NULL;
-}
-
-/* Given a rational point vec in a (transformed) basic set,
- * such that cone is the recession cone of the original basic set,
- * "round up" the rational point to an integer point.
- *
- * We first check if the rational point just happens to be integer.
- * If not, we transform the cone in the same way as the basic set,
- * pick a point x in this cone shifted to the rational point such that
- * the whole unit cube at x is also inside this affine cone.
- * Then we simply round up the coordinates of x and return the
- * resulting integer point.
- */
-static struct isl_vec *round_up_in_cone(struct isl_vec *vec,
-	struct isl_basic_set *cone, struct isl_mat *U)
-{
-	unsigned total;
-
-	if (!vec || !cone || !U)
-		goto error;
-
-	isl_assert(vec->ctx, vec->size != 0, goto error);
-	if (isl_int_is_one(vec->el[0])) {
-		isl_mat_free(U);
-		isl_basic_set_free(cone);
-		return vec;
-	}
-
-	total = isl_basic_set_total_dim(cone);
-	cone = isl_basic_set_preimage(cone, U);
-	cone = isl_basic_set_remove_dims(cone, isl_dim_set,
-					 0, total - (vec->size - 1));
-
-	cone = shift_cone(cone, vec);
-
-	vec = rational_sample(cone);
-	vec = isl_vec_ceil(vec);
-	return vec;
-error:
-	isl_mat_free(U);
-	isl_vec_free(vec);
-	isl_basic_set_free(cone);
-	return NULL;
-}
-
-/* Concatenate two integer vectors, i.e., two vectors with denominator
- * (stored in element 0) equal to 1.
- */
-static struct isl_vec *vec_concat(struct isl_vec *vec1, struct isl_vec *vec2)
-{
-	struct isl_vec *vec;
-
-	if (!vec1 || !vec2)
-		goto error;
-	isl_assert(vec1->ctx, vec1->size > 0, goto error);
-	isl_assert(vec2->ctx, vec2->size > 0, goto error);
-	isl_assert(vec1->ctx, isl_int_is_one(vec1->el[0]), goto error);
-	isl_assert(vec2->ctx, isl_int_is_one(vec2->el[0]), goto error);
-
-	vec = isl_vec_alloc(vec1->ctx, vec1->size + vec2->size - 1);
-	if (!vec)
-		goto error;
-
-	isl_seq_cpy(vec->el, vec1->el, vec1->size);
-	isl_seq_cpy(vec->el + vec1->size, vec2->el + 1, vec2->size - 1);
-
-	isl_vec_free(vec1);
-	isl_vec_free(vec2);
-
-	return vec;
-error:
-	isl_vec_free(vec1);
-	isl_vec_free(vec2);
-	return NULL;
-}
-
-/* Give a basic set "bset" with recession cone "cone", compute and
- * return an integer point in bset, if any.
- *
- * If the recession cone is full-dimensional, then we know that
- * bset contains an infinite number of integer points and it is
- * fairly easy to pick one of them.
- * If the recession cone is not full-dimensional, then we first
- * transform bset such that the bounded directions appear as
- * the first dimensions of the transformed basic set.
- * We do this by using a unimodular transformation that transforms
- * the equalities in the recession cone to equalities on the first
- * dimensions.
- *
- * The transformed set is then projected onto its bounded dimensions.
- * Note that to compute this projection, we can simply drop all constraints
- * involving any of the unbounded dimensions since these constraints
- * cannot be combined to produce a constraint on the bounded dimensions.
- * To see this, assume that there is such a combination of constraints
- * that produces a constraint on the bounded dimensions.  This means
- * that some combination of the unbounded dimensions has both an upper
- * bound and a lower bound in terms of the bounded dimensions, but then
- * this combination would be a bounded direction too and would have been
- * transformed into a bounded dimensions.
- *
- * We then compute a sample value in the bounded dimensions.
- * If no such value can be found, then the original set did not contain
- * any integer points and we are done.
- * Otherwise, we plug in the value we found in the bounded dimensions,
- * project out these bounded dimensions and end up with a set with
- * a full-dimensional recession cone.
- * A sample point in this set is computed by "rounding up" any
- * rational point in the set.
- *
- * The sample points in the bounded and unbounded dimensions are
- * then combined into a single sample point and transformed back
- * to the original space.
- */
-__isl_give isl_vec *isl_basic_set_sample_with_cone(
-	__isl_take isl_basic_set *bset, __isl_take isl_basic_set *cone)
-{
-	unsigned total;
-	unsigned cone_dim;
-	struct isl_mat *M, *U;
-	struct isl_vec *sample;
-	struct isl_vec *cone_sample;
-	struct isl_ctx *ctx;
-	struct isl_basic_set *bounded;
-
-	if (!bset || !cone)
-		goto error;
-
-	ctx = bset->ctx;
-	total = isl_basic_set_total_dim(cone);
-	cone_dim = total - cone->n_eq;
-
-	M = isl_mat_sub_alloc6(bset->ctx, cone->eq, 0, cone->n_eq, 1, total);
-	M = isl_mat_left_hermite(M, 0, &U, NULL);
-	if (!M)
-		goto error;
-	isl_mat_free(M);
-
-	U = isl_mat_lin_to_aff(U);
-	bset = isl_basic_set_preimage(bset, isl_mat_copy(U));
-
-	bounded = isl_basic_set_copy(bset);
-	bounded = isl_basic_set_drop_constraints_involving(bounded,
-						   total - cone_dim, cone_dim);
-	bounded = isl_basic_set_drop_dims(bounded, total - cone_dim, cone_dim);
-	sample = sample_bounded(bounded);
-	if (!sample || sample->size == 0) {
-		isl_basic_set_free(bset);
-		isl_basic_set_free(cone);
-		isl_mat_free(U);
-		return sample;
-	}
-	bset = plug_in(bset, isl_vec_copy(sample));
-	cone_sample = rational_sample(bset);
-	cone_sample = round_up_in_cone(cone_sample, cone, isl_mat_copy(U));
-	sample = vec_concat(sample, cone_sample);
-	sample = isl_mat_vec_product(U, sample);
-	return sample;
-error:
-	isl_basic_set_free(cone);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-static void vec_sum_of_neg(struct isl_vec *v, isl_int *s)
-{
-	int i;
-
-	isl_int_set_si(*s, 0);
-
-	for (i = 0; i < v->size; ++i)
-		if (isl_int_is_neg(v->el[i]))
-			isl_int_add(*s, *s, v->el[i]);
-}
-
-/* Given a tableau "tab", a tableau "tab_cone" that corresponds
- * to the recession cone and the inverse of a new basis U = inv(B),
- * with the unbounded directions in B last,
- * add constraints to "tab" that ensure any rational value
- * in the unbounded directions can be rounded up to an integer value.
- *
- * The new basis is given by x' = B x, i.e., x = U x'.
- * For any rational value of the last tab->n_unbounded coordinates
- * in the update tableau, the value that is obtained by rounding
- * up this value should be contained in the original tableau.
- * For any constraint "a x + c >= 0", we therefore need to add
- * a constraint "a x + c + s >= 0", with s the sum of all negative
- * entries in the last elements of "a U".
- *
- * Since we are not interested in the first entries of any of the "a U",
- * we first drop the columns of U that correpond to bounded directions.
- */
-static int tab_shift_cone(struct isl_tab *tab,
-	struct isl_tab *tab_cone, struct isl_mat *U)
-{
-	int i;
-	isl_int v;
-	struct isl_basic_set *bset = NULL;
-
-	if (tab && tab->n_unbounded == 0) {
-		isl_mat_free(U);
-		return 0;
-	}
-	isl_int_init(v);
-	if (!tab || !tab_cone || !U)
-		goto error;
-	bset = isl_tab_peek_bset(tab_cone);
-	U = isl_mat_drop_cols(U, 0, tab->n_var - tab->n_unbounded);
-	for (i = 0; i < bset->n_ineq; ++i) {
-		int ok;
-		struct isl_vec *row = NULL;
-		if (isl_tab_is_equality(tab_cone, tab_cone->n_eq + i))
-			continue;
-		row = isl_vec_alloc(bset->ctx, tab_cone->n_var);
-		if (!row)
-			goto error;
-		isl_seq_cpy(row->el, bset->ineq[i] + 1, tab_cone->n_var);
-		row = isl_vec_mat_product(row, isl_mat_copy(U));
-		if (!row)
-			goto error;
-		vec_sum_of_neg(row, &v);
-		isl_vec_free(row);
-		if (isl_int_is_zero(v))
-			continue;
-		tab = isl_tab_extend(tab, 1);
-		isl_int_add(bset->ineq[i][0], bset->ineq[i][0], v);
-		ok = isl_tab_add_ineq(tab, bset->ineq[i]) >= 0;
-		isl_int_sub(bset->ineq[i][0], bset->ineq[i][0], v);
-		if (!ok)
-			goto error;
-	}
-
-	isl_mat_free(U);
-	isl_int_clear(v);
-	return 0;
-error:
-	isl_mat_free(U);
-	isl_int_clear(v);
-	return -1;
-}
-
-/* Compute and return an initial basis for the possibly
- * unbounded tableau "tab".  "tab_cone" is a tableau
- * for the corresponding recession cone.
- * Additionally, add constraints to "tab" that ensure
- * that any rational value for the unbounded directions
- * can be rounded up to an integer value.
- *
- * If the tableau is bounded, i.e., if the recession cone
- * is zero-dimensional, then we just use inital_basis.
- * Otherwise, we construct a basis whose first directions
- * correspond to equalities, followed by bounded directions,
- * i.e., equalities in the recession cone.
- * The remaining directions are then unbounded.
- */
-int isl_tab_set_initial_basis_with_cone(struct isl_tab *tab,
-	struct isl_tab *tab_cone)
-{
-	struct isl_mat *eq;
-	struct isl_mat *cone_eq;
-	struct isl_mat *U, *Q;
-
-	if (!tab || !tab_cone)
-		return -1;
-
-	if (tab_cone->n_col == tab_cone->n_dead) {
-		tab->basis = initial_basis(tab);
-		return tab->basis ? 0 : -1;
-	}
-
-	eq = tab_equalities(tab);
-	if (!eq)
-		return -1;
-	tab->n_zero = eq->n_row;
-	cone_eq = tab_equalities(tab_cone);
-	eq = isl_mat_concat(eq, cone_eq);
-	if (!eq)
-		return -1;
-	tab->n_unbounded = tab->n_var - (eq->n_row - tab->n_zero);
-	eq = isl_mat_left_hermite(eq, 0, &U, &Q);
-	if (!eq)
-		return -1;
-	isl_mat_free(eq);
-	tab->basis = isl_mat_lin_to_aff(Q);
-	if (tab_shift_cone(tab, tab_cone, U) < 0)
-		return -1;
-	if (!tab->basis)
-		return -1;
-	return 0;
-}
-
-/* Compute and return a sample point in bset using generalized basis
- * reduction.  We first check if the input set has a non-trivial
- * recession cone.  If so, we perform some extra preprocessing in
- * sample_with_cone.  Otherwise, we directly perform generalized basis
- * reduction.
- */
-static struct isl_vec *gbr_sample(struct isl_basic_set *bset)
-{
-	unsigned dim;
-	struct isl_basic_set *cone;
-
-	dim = isl_basic_set_total_dim(bset);
-
-	cone = isl_basic_set_recession_cone(isl_basic_set_copy(bset));
-	if (!cone)
-		goto error;
-
-	if (cone->n_eq < dim)
-		return isl_basic_set_sample_with_cone(bset, cone);
-
-	isl_basic_set_free(cone);
-	return sample_bounded(bset);
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-static struct isl_vec *pip_sample(struct isl_basic_set *bset)
-{
-	struct isl_mat *T;
-	struct isl_ctx *ctx;
-	struct isl_vec *sample;
-
-	bset = isl_basic_set_skew_to_positive_orthant(bset, &T);
-	if (!bset)
-		return NULL;
-
-	ctx = bset->ctx;
-	sample = isl_pip_basic_set_sample(bset);
-
-	if (sample && sample->size != 0)
-		sample = isl_mat_vec_product(T, sample);
-	else
-		isl_mat_free(T);
-
-	return sample;
-}
-
-static struct isl_vec *basic_set_sample(struct isl_basic_set *bset, int bounded)
-{
-	struct isl_ctx *ctx;
-	unsigned dim;
-	if (!bset)
-		return NULL;
-
-	ctx = bset->ctx;
-	if (isl_basic_set_plain_is_empty(bset))
-		return empty_sample(bset);
-
-	dim = isl_basic_set_n_dim(bset);
-	isl_assert(ctx, isl_basic_set_n_param(bset) == 0, goto error);
-	isl_assert(ctx, bset->n_div == 0, goto error);
-
-	if (bset->sample && bset->sample->size == 1 + dim) {
-		int contains = isl_basic_set_contains(bset, bset->sample);
-		if (contains < 0)
-			goto error;
-		if (contains) {
-			struct isl_vec *sample = isl_vec_copy(bset->sample);
-			isl_basic_set_free(bset);
-			return sample;
-		}
-	}
-	isl_vec_free(bset->sample);
-	bset->sample = NULL;
-
-	if (bset->n_eq > 0)
-		return sample_eq(bset, bounded ? isl_basic_set_sample_bounded
-					       : isl_basic_set_sample_vec);
-	if (dim == 0)
-		return zero_sample(bset);
-	if (dim == 1)
-		return interval_sample(bset);
-
-	switch (bset->ctx->opt->ilp_solver) {
-	case ISL_ILP_PIP:
-		return pip_sample(bset);
-	case ISL_ILP_GBR:
-		return bounded ? sample_bounded(bset) : gbr_sample(bset);
-	}
-	isl_assert(bset->ctx, 0, );
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-__isl_give isl_vec *isl_basic_set_sample_vec(__isl_take isl_basic_set *bset)
-{
-	return basic_set_sample(bset, 0);
-}
-
-/* Compute an integer sample in "bset", where the caller guarantees
- * that "bset" is bounded.
- */
-struct isl_vec *isl_basic_set_sample_bounded(struct isl_basic_set *bset)
-{
-	return basic_set_sample(bset, 1);
-}
-
-__isl_give isl_basic_set *isl_basic_set_from_vec(__isl_take isl_vec *vec)
-{
-	int i;
-	int k;
-	struct isl_basic_set *bset = NULL;
-	struct isl_ctx *ctx;
-	unsigned dim;
-
-	if (!vec)
-		return NULL;
-	ctx = vec->ctx;
-	isl_assert(ctx, vec->size != 0, goto error);
-
-	bset = isl_basic_set_alloc(ctx, 0, vec->size - 1, 0, vec->size - 1, 0);
-	if (!bset)
-		goto error;
-	dim = isl_basic_set_n_dim(bset);
-	for (i = dim - 1; i >= 0; --i) {
-		k = isl_basic_set_alloc_equality(bset);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(bset->eq[k], 1 + dim);
-		isl_int_neg(bset->eq[k][0], vec->el[1 + i]);
-		isl_int_set(bset->eq[k][1 + i], vec->el[0]);
-	}
-	bset->sample = vec;
-
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	isl_vec_free(vec);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_sample(__isl_take isl_basic_map *bmap)
-{
-	struct isl_basic_set *bset;
-	struct isl_vec *sample_vec;
-
-	bset = isl_basic_map_underlying_set(isl_basic_map_copy(bmap));
-	sample_vec = isl_basic_set_sample_vec(bset);
-	if (!sample_vec)
-		goto error;
-	if (sample_vec->size == 0) {
-		struct isl_basic_map *sample;
-		sample = isl_basic_map_empty_like(bmap);
-		isl_vec_free(sample_vec);
-		isl_basic_map_free(bmap);
-		return sample;
-	}
-	bset = isl_basic_set_from_vec(sample_vec);
-	return isl_basic_map_overlying_set(bset, bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_map_sample(__isl_take isl_map *map)
-{
-	int i;
-	isl_basic_map *sample = NULL;
-
-	if (!map)
-		goto error;
-
-	for (i = 0; i < map->n; ++i) {
-		sample = isl_basic_map_sample(isl_basic_map_copy(map->p[i]));
-		if (!sample)
-			goto error;
-		if (!ISL_F_ISSET(sample, ISL_BASIC_MAP_EMPTY))
-			break;
-		isl_basic_map_free(sample);
-	}
-	if (i == map->n)
-		sample = isl_basic_map_empty_like_map(map);
-	isl_map_free(map);
-	return sample;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_set_sample(__isl_take isl_set *set)
-{
-	return (isl_basic_set *) isl_map_sample((isl_map *)set);
-}
-
-__isl_give isl_point *isl_basic_set_sample_point(__isl_take isl_basic_set *bset)
-{
-	isl_vec *vec;
-	isl_dim *dim;
-
-	dim = isl_basic_set_get_dim(bset);
-	bset = isl_basic_set_underlying_set(bset);
-	vec = isl_basic_set_sample_vec(bset);
-
-	return isl_point_alloc(dim, vec);
-}
-
-__isl_give isl_point *isl_set_sample_point(__isl_take isl_set *set)
-{
-	int i;
-	isl_point *pnt;
-
-	if (!set)
-		return NULL;
-
-	for (i = 0; i < set->n; ++i) {
-		pnt = isl_basic_set_sample_point(isl_basic_set_copy(set->p[i]));
-		if (!pnt)
-			goto error;
-		if (!isl_point_is_void(pnt))
-			break;
-		isl_point_free(pnt);
-	}
-	if (i == set->n)
-		pnt = isl_point_void(isl_set_get_dim(set));
-
-	isl_set_free(set);
-	return pnt;
-error:
-	isl_set_free(set);
-	return NULL;
-}
diff --git a/cloog-0.16.3/isl/isl_sample.h b/cloog-0.16.3/isl/isl_sample.h
deleted file mode 100644
index b657e6e..0000000
--- a/cloog-0.16.3/isl/isl_sample.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_SAMPLE_H
-#define ISL_SAMPLE
-
-#include <isl/set.h>
-#include <isl_tab.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-__isl_give isl_vec *isl_basic_set_sample_vec(__isl_take isl_basic_set *bset);
-struct isl_vec *isl_basic_set_sample_bounded(struct isl_basic_set *bset);
-__isl_give isl_vec *isl_basic_set_sample_with_cone(
-	__isl_take isl_basic_set *bset, __isl_take isl_basic_set *cone);
-
-__isl_give isl_basic_set *isl_basic_set_from_vec(__isl_take isl_vec *vec);
-
-int isl_tab_set_initial_basis_with_cone(struct isl_tab *tab,
-	struct isl_tab *tab_cone);
-struct isl_vec *isl_tab_sample(struct isl_tab *tab);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_sample_no_piplib.c b/cloog-0.16.3/isl/isl_sample_no_piplib.c
deleted file mode 100644
index e2c7ea4..0000000
--- a/cloog-0.16.3/isl/isl_sample_no_piplib.c
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include "isl_sample_piplib.h"
-
-struct isl_vec *isl_pip_basic_set_sample(struct isl_basic_set *bset)
-{
-	isl_basic_set_free(bset);
-	return NULL;
-}
diff --git a/cloog-0.16.3/isl/isl_sample_piplib.c b/cloog-0.16.3/isl/isl_sample_piplib.c
deleted file mode 100644
index 3755008..0000000
--- a/cloog-0.16.3/isl/isl_sample_piplib.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl/mat.h>
-#include <isl/vec.h>
-#include <isl/seq.h>
-#include "isl_piplib.h"
-#include "isl_sample_piplib.h"
-
-struct isl_vec *isl_pip_basic_set_sample(struct isl_basic_set *bset)
-{
-	PipOptions	*options = NULL;
-	PipMatrix	*domain = NULL;
-	PipQuast	*sol = NULL;
-	struct isl_vec *vec = NULL;
-	unsigned	dim;
-	struct isl_ctx *ctx;
-
-	if (!bset)
-		goto error;
-	ctx = isl_basic_set_get_ctx(bset);
-	isl_assert(ctx, isl_basic_set_n_param(bset) == 0, goto error);
-	isl_assert(ctx, isl_basic_set_dim(bset, isl_dim_div) == 0, goto error);
-	dim = isl_basic_set_n_dim(bset);
-	domain = isl_basic_map_to_pip((struct isl_basic_map *)bset, 0, 0, 0);
-	if (!domain)
-		goto error;
-
-	options = pip_options_init();
-	if (!options)
-		goto error;
-	sol = pip_solve(domain, NULL, -1, options);
-	if (!sol)
-		goto error;
-	if (!sol->list)
-		vec = isl_vec_alloc(ctx, 0);
-	else {
-		PipList *l;
-		int i;
-		vec = isl_vec_alloc(ctx, 1 + dim);
-		if (!vec)
-			goto error;
-		isl_int_set_si(vec->block.data[0], 1);
-		for (i = 0, l = sol->list; l && i < dim; ++i, l = l->next) {
-			isl_seq_cpy_from_pip(&vec->block.data[1+i],
-					&l->vector->the_vector[0], 1);
-			isl_assert(ctx, !entier_zero_p(l->vector->the_deno[0]),
-					goto error);
-		}
-		isl_assert(ctx, i == dim, goto error);
-	}
-
-	pip_quast_free(sol);
-	pip_options_free(options);
-	pip_matrix_free(domain);
-
-	isl_basic_set_free(bset);
-	return vec;
-error:
-	isl_vec_free(vec);
-	isl_basic_set_free(bset);
-	if (sol)
-		pip_quast_free(sol);
-	if (domain)
-		pip_matrix_free(domain);
-	return NULL;
-}
diff --git a/cloog-0.16.3/isl/isl_sample_piplib.h b/cloog-0.16.3/isl/isl_sample_piplib.h
deleted file mode 100644
index 52f2156..0000000
--- a/cloog-0.16.3/isl/isl_sample_piplib.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_SAMPLE_PIP_H
-#define ISL_SAMPLE_PIP
-
-#include <isl/set.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_vec *isl_pip_basic_set_sample(struct isl_basic_set *bset);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_scan.c b/cloog-0.16.3/isl/isl_scan.c
deleted file mode 100644
index 64654be..0000000
--- a/cloog-0.16.3/isl/isl_scan.c
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include "isl_basis_reduction.h"
-#include "isl_scan.h"
-#include <isl/seq.h>
-#include "isl_tab.h"
-
-struct isl_counter {
-	struct isl_scan_callback callback;
-	isl_int count;
-	isl_int max;
-};
-
-static int increment_counter(struct isl_scan_callback *cb,
-	__isl_take isl_vec *sample)
-{
-	struct isl_counter *cnt = (struct isl_counter *)cb;
-
-	isl_int_add_ui(cnt->count, cnt->count, 1);
-
-	isl_vec_free(sample);
-
-	if (isl_int_is_zero(cnt->max) || isl_int_lt(cnt->count, cnt->max))
-		return 0;
-	return -1;
-}
-
-static int increment_range(struct isl_scan_callback *cb, isl_int min, isl_int max)
-{
-	struct isl_counter *cnt = (struct isl_counter *)cb;
-
-	isl_int_add(cnt->count, cnt->count, max);
-	isl_int_sub(cnt->count, cnt->count, min);
-	isl_int_add_ui(cnt->count, cnt->count, 1);
-
-	if (isl_int_is_zero(cnt->max) || isl_int_lt(cnt->count, cnt->max))
-		return 0;
-	isl_int_set(cnt->count, cnt->max);
-	return -1;
-}
-
-/* Call callback->add with the current sample value of the tableau "tab".
- */
-static int add_solution(struct isl_tab *tab, struct isl_scan_callback *callback)
-{
-	struct isl_vec *sample;
-
-	if (!tab)
-		return -1;
-	sample = isl_tab_get_sample_value(tab);
-	if (!sample)
-		return -1;
-
-	return callback->add(callback, sample);
-}
-
-static int scan_0D(struct isl_basic_set *bset,
-	struct isl_scan_callback *callback)
-{
-	struct isl_vec *sample;
-
-	sample = isl_vec_alloc(bset->ctx, 1);
-	isl_basic_set_free(bset);
-
-	if (!sample)
-		return -1;
-
-	isl_int_set_si(sample->el[0], 1);
-
-	return callback->add(callback, sample);
-}
-
-/* Look for all integer points in "bset", which is assumed to be bounded,
- * and call callback->add on each of them.
- *
- * We first compute a reduced basis for the set and then scan
- * the set in the directions of this basis.
- * We basically perform a depth first search, where in each level i
- * we compute the range in the i-th basis vector direction, given
- * fixed values in the directions of the previous basis vector.
- * We then add an equality to the tableau fixing the value in the
- * direction of the current basis vector to each value in the range
- * in turn and then continue to the next level.
- *
- * The search is implemented iteratively.  "level" identifies the current
- * basis vector.  "init" is true if we want the first value at the current
- * level and false if we want the next value.
- * Solutions are added in the leaves of the search tree, i.e., after
- * we have fixed a value in each direction of the basis.
- */
-int isl_basic_set_scan(struct isl_basic_set *bset,
-	struct isl_scan_callback *callback)
-{
-	unsigned dim;
-	struct isl_mat *B = NULL;
-	struct isl_tab *tab = NULL;
-	struct isl_vec *min;
-	struct isl_vec *max;
-	struct isl_tab_undo **snap;
-	int level;
-	int init;
-	enum isl_lp_result res;
-
-	if (!bset)
-		return -1;
-
-	dim = isl_basic_set_total_dim(bset);
-	if (dim == 0)
-		return scan_0D(bset, callback);
-
-	min = isl_vec_alloc(bset->ctx, dim);
-	max = isl_vec_alloc(bset->ctx, dim);
-	snap = isl_alloc_array(bset->ctx, struct isl_tab_undo *, dim);
-
-	if (!min || !max || !snap)
-		goto error;
-
-	tab = isl_tab_from_basic_set(bset);
-	if (!tab)
-		goto error;
-	if (isl_tab_extend_cons(tab, dim + 1) < 0)
-		goto error;
-
-	tab->basis = isl_mat_identity(bset->ctx, 1 + dim);
-	if (1)
-		tab = isl_tab_compute_reduced_basis(tab);
-	if (!tab)
-		goto error;
-	B = isl_mat_copy(tab->basis);
-	if (!B)
-		goto error;
-
-	level = 0;
-	init = 1;
-
-	while (level >= 0) {
-		int empty = 0;
-		if (init) {
-			res = isl_tab_min(tab, B->row[1 + level],
-				    bset->ctx->one, &min->el[level], NULL, 0);
-			if (res == isl_lp_empty)
-				empty = 1;
-			if (res == isl_lp_error || res == isl_lp_unbounded)
-				goto error;
-			isl_seq_neg(B->row[1 + level] + 1,
-				    B->row[1 + level] + 1, dim);
-			res = isl_tab_min(tab, B->row[1 + level],
-				    bset->ctx->one, &max->el[level], NULL, 0);
-			isl_seq_neg(B->row[1 + level] + 1,
-				    B->row[1 + level] + 1, dim);
-			isl_int_neg(max->el[level], max->el[level]);
-			if (res == isl_lp_empty)
-				empty = 1;
-			if (res == isl_lp_error || res == isl_lp_unbounded)
-				goto error;
-			snap[level] = isl_tab_snap(tab);
-		} else
-			isl_int_add_ui(min->el[level], min->el[level], 1);
-
-		if (empty || isl_int_gt(min->el[level], max->el[level])) {
-			level--;
-			init = 0;
-			if (level >= 0)
-				if (isl_tab_rollback(tab, snap[level]) < 0)
-					goto error;
-			continue;
-		}
-		if (level == dim - 1 && callback->add == increment_counter) {
-			if (increment_range(callback,
-					    min->el[level], max->el[level]))
-				goto error;
-			level--;
-			init = 0;
-			if (level >= 0)
-				if (isl_tab_rollback(tab, snap[level]) < 0)
-					goto error;
-			continue;
-		}
-		isl_int_neg(B->row[1 + level][0], min->el[level]);
-		if (isl_tab_add_valid_eq(tab, B->row[1 + level]) < 0)
-			goto error;
-		isl_int_set_si(B->row[1 + level][0], 0);
-		if (level < dim - 1) {
-			++level;
-			init = 1;
-			continue;
-		}
-		if (add_solution(tab, callback) < 0)
-			goto error;
-		init = 0;
-		if (isl_tab_rollback(tab, snap[level]) < 0)
-			goto error;
-	}
-
-	isl_tab_free(tab);
-	free(snap);
-	isl_vec_free(min);
-	isl_vec_free(max);
-	isl_basic_set_free(bset);
-	isl_mat_free(B);
-	return 0;
-error:
-	isl_tab_free(tab);
-	free(snap);
-	isl_vec_free(min);
-	isl_vec_free(max);
-	isl_basic_set_free(bset);
-	isl_mat_free(B);
-	return -1;
-}
-
-int isl_set_scan(__isl_take isl_set *set, struct isl_scan_callback *callback)
-{
-	int i;
-
-	if (!set || !callback)
-		goto error;
-
-	set = isl_set_cow(set);
-	set = isl_set_make_disjoint(set);
-	set = isl_set_compute_divs(set);
-	if (!set)
-		goto error;
-
-	for (i = 0; i < set->n; ++i)
-		if (isl_basic_set_scan(isl_basic_set_copy(set->p[i]),
-					callback) < 0)
-			goto error;
-
-	isl_set_free(set);
-	return 0;
-error:
-	isl_set_free(set);
-	return -1;
-}
-
-int isl_basic_set_count_upto(__isl_keep isl_basic_set *bset,
-	isl_int max, isl_int *count)
-{
-	struct isl_counter cnt = { { &increment_counter } };
-
-	if (!bset)
-		return -1;
-
-	isl_int_init(cnt.count);
-	isl_int_init(cnt.max);
-
-	isl_int_set_si(cnt.count, 0);
-	isl_int_set(cnt.max, max);
-	if (isl_basic_set_scan(isl_basic_set_copy(bset), &cnt.callback) < 0 &&
-	    isl_int_lt(cnt.count, cnt.max))
-		goto error;
-
-	isl_int_set(*count, cnt.count);
-	isl_int_clear(cnt.max);
-	isl_int_clear(cnt.count);
-
-	return 0;
-error:
-	isl_int_clear(cnt.count);
-	return -1;
-}
-
-int isl_set_count_upto(__isl_keep isl_set *set, isl_int max, isl_int *count)
-{
-	struct isl_counter cnt = { { &increment_counter } };
-
-	if (!set)
-		return -1;
-
-	isl_int_init(cnt.count);
-	isl_int_init(cnt.max);
-
-	isl_int_set_si(cnt.count, 0);
-	isl_int_set(cnt.max, max);
-	if (isl_set_scan(isl_set_copy(set), &cnt.callback) < 0 &&
-	    isl_int_lt(cnt.count, cnt.max))
-		goto error;
-
-	isl_int_set(*count, cnt.count);
-	isl_int_clear(cnt.max);
-	isl_int_clear(cnt.count);
-
-	return 0;
-error:
-	isl_int_clear(cnt.count);
-	return -1;
-}
-
-int isl_set_count(__isl_keep isl_set *set, isl_int *count)
-{
-	if (!set)
-		return -1;
-	return isl_set_count_upto(set, set->ctx->zero, count);
-}
diff --git a/cloog-0.16.3/isl/isl_scan.h b/cloog-0.16.3/isl/isl_scan.h
deleted file mode 100644
index 8e5ad74..0000000
--- a/cloog-0.16.3/isl/isl_scan.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_SCAN_H
-#define ISL_SCAN_H
-
-#include <isl/set.h>
-#include <isl/vec.h>
-
-struct isl_scan_callback {
-	int (*add)(struct isl_scan_callback *cb, __isl_take isl_vec *sample);
-};
-
-int isl_basic_set_scan(struct isl_basic_set *bset,
-	struct isl_scan_callback *callback);
-int isl_set_scan(__isl_take isl_set *set, struct isl_scan_callback *callback);
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_schedule.c b/cloog-0.16.3/isl/isl_schedule.c
deleted file mode 100644
index 320db6c..0000000
--- a/cloog-0.16.3/isl/isl_schedule.c
+++ /dev/null
@@ -1,2742 +0,0 @@
-/*
- * Copyright 2011      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl_dim_private.h>
-#include <isl/hash.h>
-#include <isl/constraint.h>
-#include <isl/schedule.h>
-#include <isl_mat_private.h>
-#include <isl/set.h>
-#include <isl/seq.h>
-#include <isl_tab.h>
-#include <isl_dim_map.h>
-#include <isl_hmap_map_basic_set.h>
-#include <isl_qsort.h>
-#include <isl_schedule_private.h>
-#include <isl_band_private.h>
-#include <isl_list_private.h>
-
-/*
- * The scheduling algorithm implemented in this file was inspired by
- * Bondhugula et al., "Automatic Transformations for Communication-Minimized
- * Parallelization and Locality Optimization in the Polyhedral Model".
- */
-
-
-/* Internal information about a node that is used during the construction
- * of a schedule.
- * dim represents the space in which the domain lives
- * sched is a matrix representation of the schedule being constructed
- *	for this node
- * sched_map is an isl_map representation of the same (partial) schedule
- *	sched_map may be NULL
- * rank is the number of linearly independent rows in the linear part
- *	of sched
- * the columns of cmap represent a change of basis for the schedule
- *	coefficients; the first rank columns span the linear part of
- *	the schedule rows
- * start is the first variable in the LP problem in the sequences that
- *	represents the schedule coefficients of this node
- * nvar is the dimension of the domain
- * nparam is the number of parameters or 0 if we are not constructing
- *	a parametric schedule
- *
- * scc is the index of SCC (or WCC) this node belongs to
- *
- * band contains the band index for each of the rows of the schedule.
- * band_id is used to differentiate between separate bands at the same
- * level within the same parent band, i.e., bands that are separated
- * by the parent band or bands that are independent of each other.
- * zero contains a boolean for each of the rows of the schedule,
- * indicating whether the corresponding scheduling dimension results
- * in zero dependence distances within its band and with respect
- * to the proximity edges.
- *
- * index, min_index and on_stack are used during the SCC detection
- * index represents the order in which nodes are visited.
- * min_index is the index of the root of a (sub)component.
- * on_stack indicates whether the node is currently on the stack.
- */
-struct isl_sched_node {
-	isl_dim *dim;
-	isl_mat *sched;
-	isl_map *sched_map;
-	int	 rank;
-	isl_mat *cmap;
-	int	 start;
-	int	 nvar;
-	int	 nparam;
-
-	int	 scc;
-
-	int	*band;
-	int	*band_id;
-	int	*zero;
-
-	/* scc detection */
-	int	 index;
-	int	 min_index;
-	int	 on_stack;
-};
-
-static int node_has_dim(const void *entry, const void *val)
-{
-	struct isl_sched_node *node = (struct isl_sched_node *)entry;
-	isl_dim *dim = (isl_dim *)val;
-
-	return isl_dim_equal(node->dim, dim);
-}
-
-/* An edge in the dependence graph.  An edge may be used to
- * ensure validity of the generated schedule, to minimize the dependence
- * distance or both
- *
- * map is the dependence relation
- * src is the source node
- * dst is the sink node
- * validity is set if the edge is used to ensure correctness
- * proximity is set if the edge is used to minimize dependence distances
- *
- * For validity edges, start and end mark the sequence of inequality
- * constraints in the LP problem that encode the validity constraint
- * corresponding to this edge.
- */
-struct isl_sched_edge {
-	isl_map *map;
-
-	struct isl_sched_node *src;
-	struct isl_sched_node *dst;
-
-	int validity;
-	int proximity;
-
-	int start;
-	int end;
-};
-
-/* Internal information about the dependence graph used during
- * the construction of the schedule.
- *
- * intra_hmap is a cache, mapping dependence relations to their dual,
- *	for dependences from a node to itself
- * inter_hmap is a cache, mapping dependence relations to their dual,
- *	for dependences between distinct nodes
- *
- * n is the number of nodes
- * node is the list of nodes
- * maxvar is the maximal number of variables over all nodes
- * n_row is the current (maximal) number of linearly independent
- *	rows in the node schedules
- * n_total_row is the current number of rows in the node schedules
- * n_band is the current number of completed bands
- * band_start is the starting row in the node schedules of the current band
- * root is set if this graph is the original dependence graph,
- *	without any splitting
- *
- * sorted contains a list of node indices sorted according to the
- *	SCC to which a node belongs
- *
- * n_edge is the number of edges
- * edge is the list of edges
- * edge_table contains pointers into the edge array, hashed on the source
- *	and sink spaces; the table only contains edges that represent
- *	validity constraints (and that may or may not also represent proximity
- *	constraints)
- *
- * node_table contains pointers into the node array, hashed on the space
- *
- * region contains a list of variable sequences that should be non-trivial
- *
- * lp contains the (I)LP problem used to obtain new schedule rows
- *
- * src_scc and dst_scc are the source and sink SCCs of an edge with
- *	conflicting constraints
- *
- * scc, sp, index and stack are used during the detection of SCCs
- * scc is the number of the next SCC
- * stack contains the nodes on the path from the root to the current node
- * sp is the stack pointer
- * index is the index of the last node visited
- */
-struct isl_sched_graph {
-	isl_hmap_map_basic_set *intra_hmap;
-	isl_hmap_map_basic_set *inter_hmap;
-
-	struct isl_sched_node *node;
-	int n;
-	int maxvar;
-	int n_row;
-
-	int *sorted;
-
-	int n_band;
-	int n_total_row;
-	int band_start;
-
-	int root;
-
-	struct isl_sched_edge *edge;
-	int n_edge;
-	struct isl_hash_table *edge_table;
-
-	struct isl_hash_table *node_table;
-	struct isl_region *region;
-
-	isl_basic_set *lp;
-
-	int src_scc;
-	int dst_scc;
-
-	/* scc detection */
-	int scc;
-	int sp;
-	int index;
-	int *stack;
-};
-
-/* Initialize node_table based on the list of nodes.
- */
-static int graph_init_table(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	int i;
-
-	graph->node_table = isl_hash_table_alloc(ctx, graph->n);
-	if (!graph->node_table)
-		return -1;
-
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_hash_table_entry *entry;
-		uint32_t hash;
-
-		hash = isl_dim_get_hash(graph->node[i].dim);
-		entry = isl_hash_table_find(ctx, graph->node_table, hash,
-					    &node_has_dim,
-					    graph->node[i].dim, 1);
-		if (!entry)
-			return -1;
-		entry->data = &graph->node[i];
-	}
-
-	return 0;
-}
-
-/* Return a pointer to the node that lives within the given space,
- * or NULL if there is no such node.
- */
-static struct isl_sched_node *graph_find_node(isl_ctx *ctx,
-	struct isl_sched_graph *graph, __isl_keep isl_dim *dim)
-{
-	struct isl_hash_table_entry *entry;
-	uint32_t hash;
-
-	hash = isl_dim_get_hash(dim);
-	entry = isl_hash_table_find(ctx, graph->node_table, hash,
-				    &node_has_dim, dim, 0);
-
-	return entry ? entry->data : NULL;
-}
-
-static int edge_has_src_and_dst(const void *entry, const void *val)
-{
-	const struct isl_sched_edge *edge = entry;
-	const struct isl_sched_edge *temp = val;
-
-	return edge->src == temp->src && edge->dst == temp->dst;
-}
-
-/* Initialize edge_table based on the list of edges.
- * Only edges with validity set are added to the table.
- */
-static int graph_init_edge_table(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	int i;
-
-	graph->edge_table = isl_hash_table_alloc(ctx, graph->n_edge);
-	if (!graph->edge_table)
-		return -1;
-
-	for (i = 0; i < graph->n_edge; ++i) {
-		struct isl_hash_table_entry *entry;
-		uint32_t hash;
-
-		if (!graph->edge[i].validity)
-			continue;
-
-		hash = isl_hash_init();
-		hash = isl_hash_builtin(hash, graph->edge[i].src);
-		hash = isl_hash_builtin(hash, graph->edge[i].dst);
-		entry = isl_hash_table_find(ctx, graph->edge_table, hash,
-					    &edge_has_src_and_dst,
-					    &graph->edge[i], 1);
-		if (!entry)
-			return -1;
-		entry->data = &graph->edge[i];
-	}
-
-	return 0;
-}
-
-/* Check whether the dependence graph has a (validity) edge
- * between the given two nodes.
- */
-static int graph_has_edge(struct isl_sched_graph *graph,
-	struct isl_sched_node *src, struct isl_sched_node *dst)
-{
-	isl_ctx *ctx = isl_dim_get_ctx(src->dim);
-	struct isl_hash_table_entry *entry;
-	uint32_t hash;
-	struct isl_sched_edge temp = { .src = src, .dst = dst };
-	struct isl_sched_edge *edge;
-	int empty;
-
-	hash = isl_hash_init();
-	hash = isl_hash_builtin(hash, temp.src);
-	hash = isl_hash_builtin(hash, temp.dst);
-	entry = isl_hash_table_find(ctx, graph->edge_table, hash,
-				    &edge_has_src_and_dst, &temp, 0);
-	if (!entry)
-		return 0;
-
-	edge = entry->data;
-	empty = isl_map_plain_is_empty(edge->map);
-	if (empty < 0)
-		return -1;
-
-	return !empty;
-}
-
-static int graph_alloc(isl_ctx *ctx, struct isl_sched_graph *graph,
-	int n_node, int n_edge)
-{
-	int i;
-
-	graph->n = n_node;
-	graph->n_edge = n_edge;
-	graph->node = isl_calloc_array(ctx, struct isl_sched_node, graph->n);
-	graph->sorted = isl_calloc_array(ctx, int, graph->n);
-	graph->region = isl_alloc_array(ctx, struct isl_region, graph->n);
-	graph->stack = isl_alloc_array(ctx, int, graph->n);
-	graph->edge = isl_calloc_array(ctx,
-					struct isl_sched_edge, graph->n_edge);
-
-	graph->intra_hmap = isl_hmap_map_basic_set_alloc(ctx, 2 * n_edge);
-	graph->inter_hmap = isl_hmap_map_basic_set_alloc(ctx, 2 * n_edge);
-
-	if (!graph->node || !graph->region || !graph->stack || !graph->edge ||
-	    !graph->sorted)
-		return -1;
-
-	for(i = 0; i < graph->n; ++i)
-		graph->sorted[i] = i;
-
-	return 0;
-}
-
-static void graph_free(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	int i;
-
-	isl_hmap_map_basic_set_free(ctx, graph->intra_hmap);
-	isl_hmap_map_basic_set_free(ctx, graph->inter_hmap);
-
-	for (i = 0; i < graph->n; ++i) {
-		isl_dim_free(graph->node[i].dim);
-		isl_mat_free(graph->node[i].sched);
-		isl_map_free(graph->node[i].sched_map);
-		isl_mat_free(graph->node[i].cmap);
-		if (graph->root) {
-			free(graph->node[i].band);
-			free(graph->node[i].band_id);
-			free(graph->node[i].zero);
-		}
-	}
-	free(graph->node);
-	free(graph->sorted);
-	for (i = 0; i < graph->n_edge; ++i)
-		isl_map_free(graph->edge[i].map);
-	free(graph->edge);
-	free(graph->region);
-	free(graph->stack);
-	isl_hash_table_free(ctx, graph->edge_table);
-	isl_hash_table_free(ctx, graph->node_table);
-	isl_basic_set_free(graph->lp);
-}
-
-/* Add a new node to the graph representing the given set.
- */
-static int extract_node(__isl_take isl_set *set, void *user)
-{
-	int nvar, nparam;
-	isl_ctx *ctx;
-	isl_dim *dim;
-	isl_mat *sched;
-	struct isl_sched_graph *graph = user;
-	int *band, *band_id, *zero;
-
-	ctx = isl_set_get_ctx(set);
-	dim = isl_set_get_dim(set);
-	isl_set_free(set);
-	nvar = isl_dim_size(dim, isl_dim_set);
-	nparam = isl_dim_size(dim, isl_dim_param);
-	if (!ctx->opt->schedule_parametric)
-		nparam = 0;
-	sched = isl_mat_alloc(ctx, 0, 1 + nparam + nvar);
-	graph->node[graph->n].dim = dim;
-	graph->node[graph->n].nvar = nvar;
-	graph->node[graph->n].nparam = nparam;
-	graph->node[graph->n].sched = sched;
-	graph->node[graph->n].sched_map = NULL;
-	band = isl_alloc_array(ctx, int, graph->n_edge + nvar);
-	graph->node[graph->n].band = band;
-	band_id = isl_calloc_array(ctx, int, graph->n_edge + nvar);
-	graph->node[graph->n].band_id = band_id;
-	zero = isl_calloc_array(ctx, int, graph->n_edge + nvar);
-	graph->node[graph->n].zero = zero;
-	graph->n++;
-
-	if (!sched || !band || !band_id || !zero)
-		return -1;
-
-	return 0;
-}
-
-/* Add a new edge to the graph based on the given map.
- * Edges are first extracted from the validity dependences,
- * from which the edge_table is constructed.
- * Afterwards, the proximity dependences are added.  If a proximity
- * dependence relation happens to be identical to one of the
- * validity dependence relations added before, then we don't create
- * a new edge, but instead mark the original edge as also representing
- * a proximity dependence.
- */
-static int extract_edge(__isl_take isl_map *map, void *user)
-{
-	isl_ctx *ctx = isl_map_get_ctx(map);
-	struct isl_sched_graph *graph = user;
-	struct isl_sched_node *src, *dst;
-	isl_dim *dim;
-
-	dim = isl_dim_domain(isl_map_get_dim(map));
-	src = graph_find_node(ctx, graph, dim);
-	isl_dim_free(dim);
-	dim = isl_dim_range(isl_map_get_dim(map));
-	dst = graph_find_node(ctx, graph, dim);
-	isl_dim_free(dim);
-
-	if (!src || !dst) {
-		isl_map_free(map);
-		return 0;
-	}
-
-	graph->edge[graph->n_edge].src = src;
-	graph->edge[graph->n_edge].dst = dst;
-	graph->edge[graph->n_edge].map = map;
-	graph->edge[graph->n_edge].validity = !graph->edge_table;
-	graph->edge[graph->n_edge].proximity = !!graph->edge_table;
-	graph->n_edge++;
-
-	if (graph->edge_table) {
-		uint32_t hash;
-		struct isl_hash_table_entry *entry;
-		struct isl_sched_edge *edge;
-		int is_equal;
-
-		hash = isl_hash_init();
-		hash = isl_hash_builtin(hash, src);
-		hash = isl_hash_builtin(hash, dst);
-		entry = isl_hash_table_find(ctx, graph->edge_table, hash,
-					    &edge_has_src_and_dst,
-					    &graph->edge[graph->n_edge - 1], 0);
-		if (!entry)
-			return 0;
-		edge = entry->data;
-		is_equal = isl_map_plain_is_equal(map, edge->map);
-		if (is_equal < 0)
-			return -1;
-		if (!is_equal)
-			return 0;
-
-		graph->n_edge--;
-		edge->proximity = 1;
-		isl_map_free(map);
-	}
-
-	return 0;
-}
-
-/* Check whether there is a validity dependence from src to dst,
- * forcing dst to follow src.
- */
-static int node_follows(struct isl_sched_graph *graph, 
-	struct isl_sched_node *dst, struct isl_sched_node *src)
-{
-	return graph_has_edge(graph, src, dst);
-}
-
-/* Perform Tarjan's algorithm for computing the strongly connected components
- * in the dependence graph (only validity edges).
- * If directed is not set, we consider the graph to be undirected and
- * we effectively compute the (weakly) connected components.
- */
-static int detect_sccs_tarjan(struct isl_sched_graph *g, int i, int directed)
-{
-	int j;
-
-	g->node[i].index = g->index;
-	g->node[i].min_index = g->index;
-	g->node[i].on_stack = 1;
-	g->index++;
-	g->stack[g->sp++] = i;
-
-	for (j = g->n - 1; j >= 0; --j) {
-		int f;
-
-		if (j == i)
-			continue;
-		if (g->node[j].index >= 0 &&
-			(!g->node[j].on_stack ||
-			 g->node[j].index > g->node[i].min_index))
-			continue;
-		
-		f = node_follows(g, &g->node[i], &g->node[j]);
-		if (f < 0)
-			return -1;
-		if (!f && !directed) {
-			f = node_follows(g, &g->node[j], &g->node[i]);
-			if (f < 0)
-				return -1;
-		}
-		if (!f)
-			continue;
-		if (g->node[j].index < 0) {
-			detect_sccs_tarjan(g, j, directed);
-			if (g->node[j].min_index < g->node[i].min_index)
-				g->node[i].min_index = g->node[j].min_index;
-		} else if (g->node[j].index < g->node[i].min_index)
-			g->node[i].min_index = g->node[j].index;
-	}
-
-	if (g->node[i].index != g->node[i].min_index)
-		return 0;
-
-	do {
-		j = g->stack[--g->sp];
-		g->node[j].on_stack = 0;
-		g->node[j].scc = g->scc;
-	} while (j != i);
-	g->scc++;
-
-	return 0;
-}
-
-static int detect_ccs(struct isl_sched_graph *graph, int directed)
-{
-	int i;
-
-	graph->index = 0;
-	graph->sp = 0;
-	graph->scc = 0;
-	for (i = graph->n - 1; i >= 0; --i)
-		graph->node[i].index = -1;
-
-	for (i = graph->n - 1; i >= 0; --i) {
-		if (graph->node[i].index >= 0)
-			continue;
-		if (detect_sccs_tarjan(graph, i, directed) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-/* Apply Tarjan's algorithm to detect the strongly connected components
- * in the dependence graph.
- */
-static int detect_sccs(struct isl_sched_graph *graph)
-{
-	return detect_ccs(graph, 1);
-}
-
-/* Apply Tarjan's algorithm to detect the (weakly) connected components
- * in the dependence graph.
- */
-static int detect_wccs(struct isl_sched_graph *graph)
-{
-	return detect_ccs(graph, 0);
-}
-
-static int cmp_scc(const void *a, const void *b, void *data)
-{
-	struct isl_sched_graph *graph = data;
-	const int *i1 = a;
-	const int *i2 = b;
-
-	return graph->node[*i1].scc - graph->node[*i2].scc;
-}
-
-/* Sort the elements of graph->sorted according to the corresponding SCCs.
- */
-static void sort_sccs(struct isl_sched_graph *graph)
-{
-	isl_quicksort(graph->sorted, graph->n, sizeof(int), &cmp_scc, graph);
-}
-
-/* Given a dependence relation R from a node to itself,
- * construct the set of coefficients of valid constraints for elements
- * in that dependence relation.
- * In particular, the result contains tuples of coefficients
- * c_0, c_n, c_x such that
- *
- *	c_0 + c_n n + c_x y - c_x x >= 0 for each (x,y) in R
- *
- * or, equivalently,
- *
- *	c_0 + c_n n + c_x d >= 0 for each d in delta R = { y - x | (x,y) in R }
- *
- * We choose here to compute the dual of delta R.
- * Alternatively, we could have computed the dual of R, resulting
- * in a set of tuples c_0, c_n, c_x, c_y, and then
- * plugged in (c_0, c_n, c_x, -c_x).
- */
-static __isl_give isl_basic_set *intra_coefficients(
-	struct isl_sched_graph *graph, __isl_take isl_map *map)
-{
-	isl_ctx *ctx = isl_map_get_ctx(map);
-	isl_set *delta;
-	isl_basic_set *coef;
-
-	if (isl_hmap_map_basic_set_has(ctx, graph->intra_hmap, map))
-		return isl_hmap_map_basic_set_get(ctx, graph->intra_hmap, map);
-
-	delta = isl_set_remove_divs(isl_map_deltas(isl_map_copy(map)));
-	coef = isl_set_coefficients(delta);
-	isl_hmap_map_basic_set_set(ctx, graph->intra_hmap, map,
-					isl_basic_set_copy(coef));
-
-	return coef;
-}
-
-/* Given a dependence relation R, * construct the set of coefficients
- * of valid constraints for elements in that dependence relation.
- * In particular, the result contains tuples of coefficients
- * c_0, c_n, c_x, c_y such that
- *
- *	c_0 + c_n n + c_x x + c_y y >= 0 for each (x,y) in R
- *
- */
-static __isl_give isl_basic_set *inter_coefficients(
-	struct isl_sched_graph *graph, __isl_take isl_map *map)
-{
-	isl_ctx *ctx = isl_map_get_ctx(map);
-	isl_set *set;
-	isl_basic_set *coef;
-
-	if (isl_hmap_map_basic_set_has(ctx, graph->inter_hmap, map))
-		return isl_hmap_map_basic_set_get(ctx, graph->inter_hmap, map);
-
-	set = isl_map_wrap(isl_map_remove_divs(isl_map_copy(map)));
-	coef = isl_set_coefficients(set);
-	isl_hmap_map_basic_set_set(ctx, graph->inter_hmap, map,
-					isl_basic_set_copy(coef));
-
-	return coef;
-}
-
-/* Add constraints to graph->lp that force validity for the given
- * dependence from a node i to itself.
- * That is, add constraints that enforce
- *
- *	(c_i_0 + c_i_n n + c_i_x y) - (c_i_0 + c_i_n n + c_i_x x)
- *	= c_i_x (y - x) >= 0
- *
- * for each (x,y) in R.
- * We obtain general constraints on coefficients (c_0, c_n, c_x)
- * of valid constraints for (y - x) and then plug in (0, 0, c_i_x^+ - c_i_x^-),
- * where c_i_x = c_i_x^+ - c_i_x^-, with c_i_x^+ and c_i_x^- non-negative.
- * In graph->lp, the c_i_x^- appear before their c_i_x^+ counterpart.
- *
- * Actually, we do not construct constraints for the c_i_x themselves,
- * but for the coefficients of c_i_x written as a linear combination
- * of the columns in node->cmap.
- */
-static int add_intra_validity_constraints(struct isl_sched_graph *graph,
-	struct isl_sched_edge *edge)
-{
-	unsigned total;
-	isl_map *map = isl_map_copy(edge->map);
-	isl_ctx *ctx = isl_map_get_ctx(map);
-	isl_dim *dim;
-	isl_dim_map *dim_map;
-	isl_basic_set *coef;
-	struct isl_sched_node *node = edge->src;
-
-	coef = intra_coefficients(graph, map);
-
-	dim = isl_dim_domain(isl_dim_unwrap(isl_basic_set_get_dim(coef)));
-
-	coef = isl_basic_set_transform_dims(coef, isl_dim_set,
-		    isl_dim_size(dim, isl_dim_set), isl_mat_copy(node->cmap));
-
-	total = isl_basic_set_total_dim(graph->lp);
-	dim_map = isl_dim_map_alloc(ctx, total);
-	isl_dim_map_range(dim_map, node->start + 2 * node->nparam + 1, 2,
-			  isl_dim_size(dim, isl_dim_set), 1,
-			  node->nvar, -1);
-	isl_dim_map_range(dim_map, node->start + 2 * node->nparam + 2, 2,
-			  isl_dim_size(dim, isl_dim_set), 1,
-			  node->nvar, 1);
-	graph->lp = isl_basic_set_extend_constraints(graph->lp,
-			coef->n_eq, coef->n_ineq);
-	graph->lp = isl_basic_set_add_constraints_dim_map(graph->lp,
-							   coef, dim_map);
-	isl_dim_free(dim);
-
-	return 0;
-}
-
-/* Add constraints to graph->lp that force validity for the given
- * dependence from node i to node j.
- * That is, add constraints that enforce
- *
- *	(c_j_0 + c_j_n n + c_j_x y) - (c_i_0 + c_i_n n + c_i_x x) >= 0
- *
- * for each (x,y) in R.
- * We obtain general constraints on coefficients (c_0, c_n, c_x, c_y)
- * of valid constraints for R and then plug in
- * (c_j_0 - c_i_0, c_j_n^+ - c_j_n^- - (c_i_n^+ - c_i_n^-),
- *  c_j_x^+ - c_j_x^- - (c_i_x^+ - c_i_x^-)),
- * where c_* = c_*^+ - c_*^-, with c_*^+ and c_*^- non-negative.
- * In graph->lp, the c_*^- appear before their c_*^+ counterpart.
- *
- * Actually, we do not construct constraints for the c_*_x themselves,
- * but for the coefficients of c_*_x written as a linear combination
- * of the columns in node->cmap.
- */
-static int add_inter_validity_constraints(struct isl_sched_graph *graph,
-	struct isl_sched_edge *edge)
-{
-	unsigned total;
-	isl_map *map = isl_map_copy(edge->map);
-	isl_ctx *ctx = isl_map_get_ctx(map);
-	isl_dim *dim;
-	isl_dim_map *dim_map;
-	isl_basic_set *coef;
-	struct isl_sched_node *src = edge->src;
-	struct isl_sched_node *dst = edge->dst;
-
-	coef = inter_coefficients(graph, map);
-
-	dim = isl_dim_domain(isl_dim_unwrap(isl_basic_set_get_dim(coef)));
-
-	coef = isl_basic_set_transform_dims(coef, isl_dim_set,
-		    isl_dim_size(dim, isl_dim_set), isl_mat_copy(src->cmap));
-	coef = isl_basic_set_transform_dims(coef, isl_dim_set,
-		    isl_dim_size(dim, isl_dim_set) + src->nvar,
-		    isl_mat_copy(dst->cmap));
-
-	total = isl_basic_set_total_dim(graph->lp);
-	dim_map = isl_dim_map_alloc(ctx, total);
-
-	isl_dim_map_range(dim_map, dst->start, 0, 0, 0, 1, 1);
-	isl_dim_map_range(dim_map, dst->start + 1, 2, 1, 1, dst->nparam, -1);
-	isl_dim_map_range(dim_map, dst->start + 2, 2, 1, 1, dst->nparam, 1);
-	isl_dim_map_range(dim_map, dst->start + 2 * dst->nparam + 1, 2,
-			  isl_dim_size(dim, isl_dim_set) + src->nvar, 1,
-			  dst->nvar, -1);
-	isl_dim_map_range(dim_map, dst->start + 2 * dst->nparam + 2, 2,
-			  isl_dim_size(dim, isl_dim_set) + src->nvar, 1,
-			  dst->nvar, 1);
-
-	isl_dim_map_range(dim_map, src->start, 0, 0, 0, 1, -1);
-	isl_dim_map_range(dim_map, src->start + 1, 2, 1, 1, src->nparam, 1);
-	isl_dim_map_range(dim_map, src->start + 2, 2, 1, 1, src->nparam, -1);
-	isl_dim_map_range(dim_map, src->start + 2 * src->nparam + 1, 2,
-			  isl_dim_size(dim, isl_dim_set), 1,
-			  src->nvar, 1);
-	isl_dim_map_range(dim_map, src->start + 2 * src->nparam + 2, 2,
-			  isl_dim_size(dim, isl_dim_set), 1,
-			  src->nvar, -1);
-
-	edge->start = graph->lp->n_ineq;
-	graph->lp = isl_basic_set_extend_constraints(graph->lp,
-			coef->n_eq, coef->n_ineq);
-	graph->lp = isl_basic_set_add_constraints_dim_map(graph->lp,
-							   coef, dim_map);
-	isl_dim_free(dim);
-	edge->end = graph->lp->n_ineq;
-
-	return 0;
-}
-
-/* Add constraints to graph->lp that bound the dependence distance for the given
- * dependence from a node i to itself.
- * If s = 1, we add the constraint
- *
- *	c_i_x (y - x) <= m_0 + m_n n
- *
- * or
- *
- *	-c_i_x (y - x) + m_0 + m_n n >= 0
- *
- * for each (x,y) in R.
- * If s = -1, we add the constraint
- *
- *	-c_i_x (y - x) <= m_0 + m_n n
- *
- * or
- *
- *	c_i_x (y - x) + m_0 + m_n n >= 0
- *
- * for each (x,y) in R.
- * We obtain general constraints on coefficients (c_0, c_n, c_x)
- * of valid constraints for (y - x) and then plug in (m_0, m_n, -s * c_i_x),
- * with each coefficient (except m_0) represented as a pair of non-negative
- * coefficients.
- *
- * Actually, we do not construct constraints for the c_i_x themselves,
- * but for the coefficients of c_i_x written as a linear combination
- * of the columns in node->cmap.
- */
-static int add_intra_proximity_constraints(struct isl_sched_graph *graph,
-	struct isl_sched_edge *edge, int s)
-{
-	unsigned total;
-	unsigned nparam;
-	isl_map *map = isl_map_copy(edge->map);
-	isl_ctx *ctx = isl_map_get_ctx(map);
-	isl_dim *dim;
-	isl_dim_map *dim_map;
-	isl_basic_set *coef;
-	struct isl_sched_node *node = edge->src;
-
-	coef = intra_coefficients(graph, map);
-
-	dim = isl_dim_domain(isl_dim_unwrap(isl_basic_set_get_dim(coef)));
-
-	coef = isl_basic_set_transform_dims(coef, isl_dim_set,
-		    isl_dim_size(dim, isl_dim_set), isl_mat_copy(node->cmap));
-
-	nparam = isl_dim_size(node->dim, isl_dim_param);
-	total = isl_basic_set_total_dim(graph->lp);
-	dim_map = isl_dim_map_alloc(ctx, total);
-	isl_dim_map_range(dim_map, 1, 0, 0, 0, 1, 1);
-	isl_dim_map_range(dim_map, 4, 2, 1, 1, nparam, -1);
-	isl_dim_map_range(dim_map, 5, 2, 1, 1, nparam, 1);
-	isl_dim_map_range(dim_map, node->start + 2 * node->nparam + 1, 2,
-			  isl_dim_size(dim, isl_dim_set), 1,
-			  node->nvar, s);
-	isl_dim_map_range(dim_map, node->start + 2 * node->nparam + 2, 2,
-			  isl_dim_size(dim, isl_dim_set), 1,
-			  node->nvar, -s);
-	graph->lp = isl_basic_set_extend_constraints(graph->lp,
-			coef->n_eq, coef->n_ineq);
-	graph->lp = isl_basic_set_add_constraints_dim_map(graph->lp,
-							   coef, dim_map);
-	isl_dim_free(dim);
-
-	return 0;
-}
-
-/* Add constraints to graph->lp that bound the dependence distance for the given
- * dependence from node i to node j.
- * If s = 1, we add the constraint
- *
- *	(c_j_0 + c_j_n n + c_j_x y) - (c_i_0 + c_i_n n + c_i_x x)
- *		<= m_0 + m_n n
- *
- * or
- *
- *	-(c_j_0 + c_j_n n + c_j_x y) + (c_i_0 + c_i_n n + c_i_x x) +
- *		m_0 + m_n n >= 0
- *
- * for each (x,y) in R.
- * If s = -1, we add the constraint
- *
- *	-((c_j_0 + c_j_n n + c_j_x y) - (c_i_0 + c_i_n n + c_i_x x))
- *		<= m_0 + m_n n
- *
- * or
- *
- *	(c_j_0 + c_j_n n + c_j_x y) - (c_i_0 + c_i_n n + c_i_x x) +
- *		m_0 + m_n n >= 0
- *
- * for each (x,y) in R.
- * We obtain general constraints on coefficients (c_0, c_n, c_x, c_y)
- * of valid constraints for R and then plug in
- * (m_0 - s*c_j_0 + s*c_i_0, m_n - s*c_j_n + s*c_i_n,
- *  -s*c_j_x+s*c_i_x)
- * with each coefficient (except m_0, c_j_0 and c_i_0)
- * represented as a pair of non-negative coefficients.
- *
- * Actually, we do not construct constraints for the c_*_x themselves,
- * but for the coefficients of c_*_x written as a linear combination
- * of the columns in node->cmap.
- */
-static int add_inter_proximity_constraints(struct isl_sched_graph *graph,
-	struct isl_sched_edge *edge, int s)
-{
-	unsigned total;
-	unsigned nparam;
-	isl_map *map = isl_map_copy(edge->map);
-	isl_ctx *ctx = isl_map_get_ctx(map);
-	isl_dim *dim;
-	isl_dim_map *dim_map;
-	isl_basic_set *coef;
-	struct isl_sched_node *src = edge->src;
-	struct isl_sched_node *dst = edge->dst;
-
-	coef = inter_coefficients(graph, map);
-
-	dim = isl_dim_domain(isl_dim_unwrap(isl_basic_set_get_dim(coef)));
-
-	coef = isl_basic_set_transform_dims(coef, isl_dim_set,
-		    isl_dim_size(dim, isl_dim_set), isl_mat_copy(src->cmap));
-	coef = isl_basic_set_transform_dims(coef, isl_dim_set,
-		    isl_dim_size(dim, isl_dim_set) + src->nvar,
-		    isl_mat_copy(dst->cmap));
-
-	nparam = isl_dim_size(src->dim, isl_dim_param);
-	total = isl_basic_set_total_dim(graph->lp);
-	dim_map = isl_dim_map_alloc(ctx, total);
-
-	isl_dim_map_range(dim_map, 1, 0, 0, 0, 1, 1);
-	isl_dim_map_range(dim_map, 4, 2, 1, 1, nparam, -1);
-	isl_dim_map_range(dim_map, 5, 2, 1, 1, nparam, 1);
-
-	isl_dim_map_range(dim_map, dst->start, 0, 0, 0, 1, -s);
-	isl_dim_map_range(dim_map, dst->start + 1, 2, 1, 1, dst->nparam, s);
-	isl_dim_map_range(dim_map, dst->start + 2, 2, 1, 1, dst->nparam, -s);
-	isl_dim_map_range(dim_map, dst->start + 2 * dst->nparam + 1, 2,
-			  isl_dim_size(dim, isl_dim_set) + src->nvar, 1,
-			  dst->nvar, s);
-	isl_dim_map_range(dim_map, dst->start + 2 * dst->nparam + 2, 2,
-			  isl_dim_size(dim, isl_dim_set) + src->nvar, 1,
-			  dst->nvar, -s);
-
-	isl_dim_map_range(dim_map, src->start, 0, 0, 0, 1, s);
-	isl_dim_map_range(dim_map, src->start + 1, 2, 1, 1, src->nparam, -s);
-	isl_dim_map_range(dim_map, src->start + 2, 2, 1, 1, src->nparam, s);
-	isl_dim_map_range(dim_map, src->start + 2 * src->nparam + 1, 2,
-			  isl_dim_size(dim, isl_dim_set), 1,
-			  src->nvar, -s);
-	isl_dim_map_range(dim_map, src->start + 2 * src->nparam + 2, 2,
-			  isl_dim_size(dim, isl_dim_set), 1,
-			  src->nvar, s);
-
-	graph->lp = isl_basic_set_extend_constraints(graph->lp,
-			coef->n_eq, coef->n_ineq);
-	graph->lp = isl_basic_set_add_constraints_dim_map(graph->lp,
-							   coef, dim_map);
-	isl_dim_free(dim);
-
-	return 0;
-}
-
-static int add_all_validity_constraints(struct isl_sched_graph *graph)
-{
-	int i;
-
-	for (i = 0; i < graph->n_edge; ++i) {
-		struct isl_sched_edge *edge= &graph->edge[i];
-		if (!edge->validity)
-			continue;
-		if (edge->src != edge->dst)
-			continue;
-		if (add_intra_validity_constraints(graph, edge) < 0)
-			return -1;
-	}
-
-	for (i = 0; i < graph->n_edge; ++i) {
-		struct isl_sched_edge *edge = &graph->edge[i];
-		if (!edge->validity)
-			continue;
-		if (edge->src == edge->dst)
-			continue;
-		if (add_inter_validity_constraints(graph, edge) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-/* Add constraints to graph->lp that bound the dependence distance
- * for all dependence relations.
- * If a given proximity dependence is identical to a validity
- * dependence, then the dependence distance is already bounded
- * from below (by zero), so we only need to bound the distance
- * from above.
- * Otherwise, we need to bound the distance both from above and from below.
- */
-static int add_all_proximity_constraints(struct isl_sched_graph *graph)
-{
-	int i;
-
-	for (i = 0; i < graph->n_edge; ++i) {
-		struct isl_sched_edge *edge= &graph->edge[i];
-		if (!edge->proximity)
-			continue;
-		if (edge->src == edge->dst &&
-		    add_intra_proximity_constraints(graph, edge, 1) < 0)
-			return -1;
-		if (edge->src != edge->dst &&
-		    add_inter_proximity_constraints(graph, edge, 1) < 0)
-			return -1;
-		if (edge->validity)
-			continue;
-		if (edge->src == edge->dst &&
-		    add_intra_proximity_constraints(graph, edge, -1) < 0)
-			return -1;
-		if (edge->src != edge->dst &&
-		    add_inter_proximity_constraints(graph, edge, -1) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-/* Compute a basis for the rows in the linear part of the schedule
- * and extend this basis to a full basis.  The remaining rows
- * can then be used to force linear independence from the rows
- * in the schedule.
- *
- * In particular, given the schedule rows S, we compute
- *
- *	S = H Q
- *
- * with H the Hermite normal form of S.  That is, all but the
- * first rank columns of Q are zero and so each row in S is
- * a linear combination of the first rank rows of Q.
- * The matrix Q is then transposed because we will write the
- * coefficients of the next schedule row as a column vector s
- * and express this s as a linear combination s = Q c of the
- * computed basis.
- */
-static int node_update_cmap(struct isl_sched_node *node)
-{
-	isl_mat *H, *Q;
-	int n_row = isl_mat_rows(node->sched);
-
-	H = isl_mat_sub_alloc(node->sched, 0, n_row,
-			      1 + node->nparam, node->nvar);
-
-	H = isl_mat_left_hermite(H, 0, NULL, &Q);
-	isl_mat_free(node->cmap);
-	node->cmap = isl_mat_transpose(Q);
-	node->rank = isl_mat_initial_non_zero_cols(H);
-	isl_mat_free(H);
-
-	if (!node->cmap || node->rank < 0)
-		return -1;
-	return 0;
-}
-
-/* Count the number of equality and inequality constraints
- * that will be added.  If once is set, then we count
- * each edge exactly once.  Otherwise, we count as follows
- * validity		-> 1 (>= 0)
- * validity+proximity	-> 2 (>= 0 and upper bound)
- * proximity		-> 2 (lower and upper bound)
- */
-static int count_constraints(struct isl_sched_graph *graph,
-	int *n_eq, int *n_ineq, int once)
-{
-	int i;
-	isl_basic_set *coef;
-
-	*n_eq = *n_ineq = 0;
-	for (i = 0; i < graph->n_edge; ++i) {
-		struct isl_sched_edge *edge= &graph->edge[i];
-		isl_map *map = isl_map_copy(edge->map);
-		int f = once ? 1 : edge->proximity ? 2 : 1;
-
-		if (edge->src == edge->dst)
-			coef = intra_coefficients(graph, map);
-		else
-			coef = inter_coefficients(graph, map);
-		if (!coef)
-			return -1;
-		*n_eq += f * coef->n_eq;
-		*n_ineq += f * coef->n_ineq;
-		isl_basic_set_free(coef);
-	}
-
-	return 0;
-}
-
-/* Construct an ILP problem for finding schedule coefficients
- * that result in non-negative, but small dependence distances
- * over all dependences.
- * In particular, the dependence distances over proximity edges
- * are bounded by m_0 + m_n n and we compute schedule coefficients
- * with small values (preferably zero) of m_n and m_0.
- *
- * All variables of the ILP are non-negative.  The actual coefficients
- * may be negative, so each coefficient is represented as the difference
- * of two non-negative variables.  The negative part always appears
- * immediately before the positive part.
- * Other than that, the variables have the following order
- *
- *	- sum of positive and negative parts of m_n coefficients
- *	- m_0
- *	- sum of positive and negative parts of all c_n coefficients
- *		(unconstrained when computing non-parametric schedules)
- *	- sum of positive and negative parts of all c_x coefficients
- *	- positive and negative parts of m_n coefficients
- *	- for each node
- *		- c_i_0
- *		- positive and negative parts of c_i_n (if parametric)
- *		- positive and negative parts of c_i_x
- *
- * The c_i_x are not represented directly, but through the columns of
- * node->cmap.  That is, the computed values are for variable t_i_x
- * such that c_i_x = Q t_i_x with Q equal to node->cmap.
- *
- * The constraints are those from the edges plus two or three equalities
- * to express the sums.
- *
- * If force_zero is set, then we add equalities to ensure that
- * the sum of the m_n coefficients and m_0 are both zero.
- */
-static int setup_lp(isl_ctx *ctx, struct isl_sched_graph *graph,
-	int force_zero)
-{
-	int i, j;
-	int k;
-	unsigned nparam;
-	unsigned total;
-	isl_dim *dim;
-	int parametric;
-	int param_pos;
-	int n_eq, n_ineq;
-
-	parametric = ctx->opt->schedule_parametric;
-	nparam = isl_dim_size(graph->node[0].dim, isl_dim_param);
-	param_pos = 4;
-	total = param_pos + 2 * nparam;
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[graph->sorted[i]];
-		if (node_update_cmap(node) < 0)
-			return -1;
-		node->start = total;
-		total += 1 + 2 * (node->nparam + node->nvar);
-	}
-
-	if (count_constraints(graph, &n_eq, &n_ineq, 0) < 0)
-		return -1;
-
-	dim = isl_dim_set_alloc(ctx, 0, total);
-	isl_basic_set_free(graph->lp);
-	n_eq += 2 + parametric + force_zero;
-	graph->lp = isl_basic_set_alloc_dim(dim, 0, n_eq, n_ineq);
-
-	k = isl_basic_set_alloc_equality(graph->lp);
-	if (k < 0)
-		return -1;
-	isl_seq_clr(graph->lp->eq[k], 1 +  total);
-	if (!force_zero)
-		isl_int_set_si(graph->lp->eq[k][1], -1);
-	for (i = 0; i < 2 * nparam; ++i)
-		isl_int_set_si(graph->lp->eq[k][1 + param_pos + i], 1);
-
-	if (force_zero) {
-		k = isl_basic_set_alloc_equality(graph->lp);
-		if (k < 0)
-			return -1;
-		isl_seq_clr(graph->lp->eq[k], 1 +  total);
-		isl_int_set_si(graph->lp->eq[k][2], -1);
-	}
-
-	if (parametric) {
-		k = isl_basic_set_alloc_equality(graph->lp);
-		if (k < 0)
-			return -1;
-		isl_seq_clr(graph->lp->eq[k], 1 +  total);
-		isl_int_set_si(graph->lp->eq[k][3], -1);
-		for (i = 0; i < graph->n; ++i) {
-			int pos = 1 + graph->node[i].start + 1;
-
-			for (j = 0; j < 2 * graph->node[i].nparam; ++j)
-				isl_int_set_si(graph->lp->eq[k][pos + j], 1);
-		}
-	}
-
-	k = isl_basic_set_alloc_equality(graph->lp);
-	if (k < 0)
-		return -1;
-	isl_seq_clr(graph->lp->eq[k], 1 +  total);
-	isl_int_set_si(graph->lp->eq[k][4], -1);
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[i];
-		int pos = 1 + node->start + 1 + 2 * node->nparam;
-
-		for (j = 0; j < 2 * node->nvar; ++j)
-			isl_int_set_si(graph->lp->eq[k][pos + j], 1);
-	}
-
-	if (add_all_validity_constraints(graph) < 0)
-		return -1;
-	if (add_all_proximity_constraints(graph) < 0)
-		return -1;
-
-	return 0;
-}
-
-/* Analyze the conflicting constraint found by
- * isl_tab_basic_set_non_trivial_lexmin.  If it corresponds to the validity
- * constraint of one of the edges between distinct nodes, living, moreover
- * in distinct SCCs, then record the source and sink SCC as this may
- * be a good place to cut between SCCs.
- */
-static int check_conflict(int con, void *user)
-{
-	int i;
-	struct isl_sched_graph *graph = user;
-
-	if (graph->src_scc >= 0)
-		return 0;
-
-	con -= graph->lp->n_eq;
-
-	if (con >= graph->lp->n_ineq)
-		return 0;
-
-	for (i = 0; i < graph->n_edge; ++i) {
-		if (!graph->edge[i].validity)
-			continue;
-		if (graph->edge[i].src == graph->edge[i].dst)
-			continue;
-		if (graph->edge[i].src->scc == graph->edge[i].dst->scc)
-			continue;
-		if (graph->edge[i].start > con)
-			continue;
-		if (graph->edge[i].end <= con)
-			continue;
-		graph->src_scc = graph->edge[i].src->scc;
-		graph->dst_scc = graph->edge[i].dst->scc;
-	}
-
-	return 0;
-}
-
-/* Check whether the next schedule row of the given node needs to be
- * non-trivial.  Lower-dimensional domains may have some trivial rows,
- * but as soon as the number of remaining required non-trivial rows
- * is as large as the number or remaining rows to be computed,
- * all remaining rows need to be non-trivial.
- */
-static int needs_row(struct isl_sched_graph *graph, struct isl_sched_node *node)
-{
-	return node->nvar - node->rank >= graph->maxvar - graph->n_row;
-}
-
-/* Solve the ILP problem constructed in setup_lp.
- * For each node such that all the remaining rows of its schedule
- * need to be non-trivial, we construct a non-triviality region.
- * This region imposes that the next row is independent of previous rows.
- * In particular the coefficients c_i_x are represented by t_i_x
- * variables with c_i_x = Q t_i_x and Q a unimodular matrix such that
- * its first columns span the rows of the previously computed part
- * of the schedule.  The non-triviality region enforces that at least
- * one of the remaining components of t_i_x is non-zero, i.e.,
- * that the new schedule row depends on at least one of the remaining
- * columns of Q.
- */
-static __isl_give isl_vec *solve_lp(struct isl_sched_graph *graph)
-{
-	int i;
-	isl_vec *sol;
-	isl_basic_set *lp;
-
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[i];
-		int skip = node->rank;
-		graph->region[i].pos = node->start + 1 + 2*(node->nparam+skip);
-		if (needs_row(graph, node))
-			graph->region[i].len = 2 * (node->nvar - skip);
-		else
-			graph->region[i].len = 0;
-	}
-	lp = isl_basic_set_copy(graph->lp);
-	sol = isl_tab_basic_set_non_trivial_lexmin(lp, 2, graph->n,
-				       graph->region, &check_conflict, graph);
-	return sol;
-}
-
-/* Update the schedules of all nodes based on the given solution
- * of the LP problem.
- * The new row is added to the current band.
- * All possibly negative coefficients are encoded as a difference
- * of two non-negative variables, so we need to perform the subtraction
- * here.  Moreover, if use_cmap is set, then the solution does
- * not refer to the actual coefficients c_i_x, but instead to variables
- * t_i_x such that c_i_x = Q t_i_x and Q is equal to node->cmap.
- * In this case, we then also need to perform this multiplication
- * to obtain the values of c_i_x.
- *
- * If check_zero is set, then the first two coordinates of sol are
- * assumed to correspond to the dependence distance.  If these two
- * coordinates are zero, then the corresponding scheduling dimension
- * is marked as being zero distance.
- */
-static int update_schedule(struct isl_sched_graph *graph,
-	__isl_take isl_vec *sol, int use_cmap, int check_zero)
-{
-	int i, j;
-	int zero = 0;
-	isl_vec *csol = NULL;
-
-	if (!sol)
-		goto error;
-	if (sol->size == 0)
-		isl_die(sol->ctx, isl_error_internal,
-			"no solution found", goto error);
-
-	if (check_zero)
-		zero = isl_int_is_zero(sol->el[1]) &&
-			   isl_int_is_zero(sol->el[2]);
-
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[i];
-		int pos = node->start;
-		int row = isl_mat_rows(node->sched);
-
-		isl_vec_free(csol);
-		csol = isl_vec_alloc(sol->ctx, node->nvar);
-		if (!csol)
-			goto error;
-
-		isl_map_free(node->sched_map);
-		node->sched_map = NULL;
-		node->sched = isl_mat_add_rows(node->sched, 1);
-		if (!node->sched)
-			goto error;
-		node->sched = isl_mat_set_element(node->sched, row, 0,
-						  sol->el[1 + pos]);
-		for (j = 0; j < node->nparam + node->nvar; ++j)
-			isl_int_sub(sol->el[1 + pos + 1 + 2 * j + 1],
-				    sol->el[1 + pos + 1 + 2 * j + 1],
-				    sol->el[1 + pos + 1 + 2 * j]);
-		for (j = 0; j < node->nparam; ++j)
-			node->sched = isl_mat_set_element(node->sched,
-					row, 1 + j, sol->el[1+pos+1+2*j+1]);
-		for (j = 0; j < node->nvar; ++j)
-			isl_int_set(csol->el[j],
-				    sol->el[1+pos+1+2*(node->nparam+j)+1]);
-		if (use_cmap)
-			csol = isl_mat_vec_product(isl_mat_copy(node->cmap),
-						   csol);
-		if (!csol)
-			goto error;
-		for (j = 0; j < node->nvar; ++j)
-			node->sched = isl_mat_set_element(node->sched,
-					row, 1 + node->nparam + j, csol->el[j]);
-		node->band[graph->n_total_row] = graph->n_band;
-		node->zero[graph->n_total_row] = zero;
-	}
-	isl_vec_free(sol);
-	isl_vec_free(csol);
-
-	graph->n_row++;
-	graph->n_total_row++;
-
-	return 0;
-error:
-	isl_vec_free(sol);
-	isl_vec_free(csol);
-	return -1;
-}
-
-/* Convert node->sched into a map and return this map.
- * We simply add equality constraints that express each output variable
- * as the affine combination of parameters and input variables specified
- * by the schedule matrix.
- *
- * The result is cached in node->sched_map, which needs to be released
- * whenever node->sched is updated.
- */
-static __isl_give isl_map *node_extract_schedule(struct isl_sched_node *node)
-{
-	int i, j;
-	isl_dim *dim;
-	isl_basic_map *bmap;
-	isl_constraint *c;
-	int nrow, ncol;
-	isl_int v;
-
-	if (node->sched_map)
-		return isl_map_copy(node->sched_map);
-
-	nrow = isl_mat_rows(node->sched);
-	ncol = isl_mat_cols(node->sched) - 1;
-	dim = isl_dim_from_domain(isl_dim_copy(node->dim));
-	dim = isl_dim_add(dim, isl_dim_out, nrow);
-	bmap = isl_basic_map_universe(isl_dim_copy(dim));
-
-	isl_int_init(v);
-
-	for (i = 0; i < nrow; ++i) {
-		c = isl_equality_alloc(isl_dim_copy(dim));
-		isl_constraint_set_coefficient_si(c, isl_dim_out, i, -1);
-		isl_mat_get_element(node->sched, i, 0, &v);
-		isl_constraint_set_constant(c, v);
-		for (j = 0; j < node->nparam; ++j) {
-			isl_mat_get_element(node->sched, i, 1 + j, &v);
-			isl_constraint_set_coefficient(c, isl_dim_param, j, v);
-		}
-		for (j = 0; j < node->nvar; ++j) {
-			isl_mat_get_element(node->sched,
-					    i, 1 + node->nparam + j, &v);
-			isl_constraint_set_coefficient(c, isl_dim_in, j, v);
-		}
-		bmap = isl_basic_map_add_constraint(bmap, c);
-	}
-
-	isl_int_clear(v);
-
-	isl_dim_free(dim);
-
-	node->sched_map = isl_map_from_basic_map(bmap);
-	return isl_map_copy(node->sched_map);
-}
-
-/* Update the given dependence relation based on the current schedule.
- * That is, intersect the dependence relation with a map expressing
- * that source and sink are executed within the same iteration of
- * the current schedule.
- * This is not the most efficient way, but this shouldn't be a critical
- * operation.
- */
-static __isl_give isl_map *specialize(__isl_take isl_map *map,
-	struct isl_sched_node *src, struct isl_sched_node *dst)
-{
-	isl_map *src_sched, *dst_sched, *id;
-
-	src_sched = node_extract_schedule(src);
-	dst_sched = node_extract_schedule(dst);
-	id = isl_map_apply_range(src_sched, isl_map_reverse(dst_sched));
-	return isl_map_intersect(map, id);
-}
-
-/* Update the dependence relations of all edges based on the current schedule.
- * If a dependence is carried completely by the current schedule, then
- * it is removed and edge_table is updated accordingly.
- */
-static int update_edges(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	int i;
-	int reset_table = 0;
-
-	for (i = graph->n_edge - 1; i >= 0; --i) {
-		struct isl_sched_edge *edge = &graph->edge[i];
-		edge->map = specialize(edge->map, edge->src, edge->dst);
-		if (!edge->map)
-			return -1;
-
-		if (isl_map_plain_is_empty(edge->map)) {
-			reset_table = 1;
-			isl_map_free(edge->map);
-			if (i != graph->n_edge - 1)
-				graph->edge[i] = graph->edge[graph->n_edge - 1];
-			graph->n_edge--;
-		}
-	}
-
-	if (reset_table) {
-		isl_hash_table_free(ctx, graph->edge_table);
-		graph->edge_table = NULL;
-		return graph_init_edge_table(ctx, graph);
-	}
-
-	return 0;
-}
-
-static void next_band(struct isl_sched_graph *graph)
-{
-	graph->band_start = graph->n_total_row;
-	graph->n_band++;
-}
-
-/* Topologically sort statements mapped to same schedule iteration
- * and add a row to the schedule corresponding to this order.
- */
-static int sort_statements(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	int i, j;
-
-	if (graph->n <= 1)
-		return 0;
-
-	if (update_edges(ctx, graph) < 0)
-		return -1;
-
-	if (graph->n_edge == 0)
-		return 0;
-
-	if (detect_sccs(graph) < 0)
-		return -1;
-
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[i];
-		int row = isl_mat_rows(node->sched);
-		int cols = isl_mat_cols(node->sched);
-
-		isl_map_free(node->sched_map);
-		node->sched_map = NULL;
-		node->sched = isl_mat_add_rows(node->sched, 1);
-		if (!node->sched)
-			return -1;
-		node->sched = isl_mat_set_element_si(node->sched, row, 0,
-						     node->scc);
-		for (j = 1; j < cols; ++j)
-			node->sched = isl_mat_set_element_si(node->sched,
-							     row, j, 0);
-		node->band[graph->n_total_row] = graph->n_band;
-	}
-
-	graph->n_total_row++;
-	next_band(graph);
-
-	return 0;
-}
-
-/* Construct an isl_schedule based on the computed schedule stored
- * in graph and with parameters specified by dim.
- */
-static __isl_give isl_schedule *extract_schedule(struct isl_sched_graph *graph,
-	__isl_take isl_dim *dim)
-{
-	int i;
-	isl_ctx *ctx;
-	isl_schedule *sched = NULL;
-		
-	if (!dim)
-		return NULL;
-
-	ctx = isl_dim_get_ctx(dim);
-	sched = isl_calloc(ctx, struct isl_schedule,
-			   sizeof(struct isl_schedule) +
-			   (graph->n - 1) * sizeof(struct isl_schedule_node));
-	if (!sched)
-		goto error;
-
-	sched->ref = 1;
-	sched->n = graph->n;
-	sched->n_band = graph->n_band;
-	sched->n_total_row = graph->n_total_row;
-
-	for (i = 0; i < sched->n; ++i) {
-		int r, b;
-		int *band_end, *band_id, *zero;
-
-		band_end = isl_alloc_array(ctx, int, graph->n_band);
-		band_id = isl_alloc_array(ctx, int, graph->n_band);
-		zero = isl_alloc_array(ctx, int, graph->n_total_row);
-		sched->node[i].sched = node_extract_schedule(&graph->node[i]);
-		sched->node[i].band_end = band_end;
-		sched->node[i].band_id = band_id;
-		sched->node[i].zero = zero;
-		if (!band_end || !band_id || !zero)
-			goto error;
-
-		for (r = 0; r < graph->n_total_row; ++r)
-			zero[r] = graph->node[i].zero[r];
-		for (r = b = 0; r < graph->n_total_row; ++r) {
-			if (graph->node[i].band[r] == b)
-				continue;
-			band_end[b++] = r;
-			if (graph->node[i].band[r] == -1)
-				break;
-		}
-		if (r == graph->n_total_row)
-			band_end[b++] = r;
-		sched->node[i].n_band = b;
-		for (--b; b >= 0; --b)
-			band_id[b] = graph->node[i].band_id[b];
-	}
-
-	sched->dim = dim;
-
-	return sched;
-error:
-	isl_dim_free(dim);
-	isl_schedule_free(sched);
-	return NULL;
-}
-
-/* Copy nodes that satisfy node_pred from the src dependence graph
- * to the dst dependence graph.
- */
-static int copy_nodes(struct isl_sched_graph *dst, struct isl_sched_graph *src,
-	int (*node_pred)(struct isl_sched_node *node, int data), int data)
-{
-	int i;
-
-	dst->n = 0;
-	for (i = 0; i < src->n; ++i) {
-		if (!node_pred(&src->node[i], data))
-			continue;
-		dst->node[dst->n].dim = isl_dim_copy(src->node[i].dim);
-		dst->node[dst->n].nvar = src->node[i].nvar;
-		dst->node[dst->n].nparam = src->node[i].nparam;
-		dst->node[dst->n].sched = isl_mat_copy(src->node[i].sched);
-		dst->node[dst->n].sched_map =
-			isl_map_copy(src->node[i].sched_map);
-		dst->node[dst->n].band = src->node[i].band;
-		dst->node[dst->n].band_id = src->node[i].band_id;
-		dst->node[dst->n].zero = src->node[i].zero;
-		dst->n++;
-	}
-
-	return 0;
-}
-
-/* Copy non-empty edges that satisfy edge_pred from the src dependence graph
- * to the dst dependence graph.
- */
-static int copy_edges(isl_ctx *ctx, struct isl_sched_graph *dst,
-	struct isl_sched_graph *src,
-	int (*edge_pred)(struct isl_sched_edge *edge, int data), int data)
-{
-	int i;
-
-	dst->n_edge = 0;
-	for (i = 0; i < src->n_edge; ++i) {
-		struct isl_sched_edge *edge = &src->edge[i];
-		isl_map *map;
-
-		if (!edge_pred(edge, data))
-			continue;
-
-		if (isl_map_plain_is_empty(edge->map))
-			continue;
-
-		map = isl_map_copy(edge->map);
-
-		dst->edge[dst->n_edge].src =
-			graph_find_node(ctx, dst, edge->src->dim);
-		dst->edge[dst->n_edge].dst =
-			graph_find_node(ctx, dst, edge->dst->dim);
-		dst->edge[dst->n_edge].map = map;
-		dst->edge[dst->n_edge].validity = edge->validity;
-		dst->edge[dst->n_edge].proximity = edge->proximity;
-		dst->n_edge++;
-	}
-
-	return 0;
-}
-
-/* Given a "src" dependence graph that contains the nodes from "dst"
- * that satisfy node_pred, copy the schedule computed in "src"
- * for those nodes back to "dst".
- */
-static int copy_schedule(struct isl_sched_graph *dst,
-	struct isl_sched_graph *src,
-	int (*node_pred)(struct isl_sched_node *node, int data), int data)
-{
-	int i;
-
-	src->n = 0;
-	for (i = 0; i < dst->n; ++i) {
-		if (!node_pred(&dst->node[i], data))
-			continue;
-		isl_mat_free(dst->node[i].sched);
-		isl_map_free(dst->node[i].sched_map);
-		dst->node[i].sched = isl_mat_copy(src->node[src->n].sched);
-		dst->node[i].sched_map =
-			isl_map_copy(src->node[src->n].sched_map);
-		src->n++;
-	}
-
-	dst->n_total_row = src->n_total_row;
-	dst->n_band = src->n_band;
-
-	return 0;
-}
-
-/* Compute the maximal number of variables over all nodes.
- * This is the maximal number of linearly independent schedule
- * rows that we need to compute.
- * Just in case we end up in a part of the dependence graph
- * with only lower-dimensional domains, we make sure we will
- * compute the required amount of extra linearly independent rows.
- */
-static int compute_maxvar(struct isl_sched_graph *graph)
-{
-	int i;
-
-	graph->maxvar = 0;
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[i];
-		int nvar;
-
-		if (node_update_cmap(node) < 0)
-			return -1;
-		nvar = node->nvar + graph->n_row - node->rank;
-		if (nvar > graph->maxvar)
-			graph->maxvar = nvar;
-	}
-
-	return 0;
-}
-
-static int compute_schedule(isl_ctx *ctx, struct isl_sched_graph *graph);
-static int compute_schedule_wcc(isl_ctx *ctx, struct isl_sched_graph *graph);
-
-/* Compute a schedule for a subgraph of "graph".  In particular, for
- * the graph composed of nodes that satisfy node_pred and edges that
- * that satisfy edge_pred.  The caller should precompute the number
- * of nodes and edges that satisfy these predicates and pass them along
- * as "n" and "n_edge".
- * If the subgraph is known to consist of a single component, then wcc should
- * be set and then we call compute_schedule_wcc on the constructed subgraph.
- * Otherwise, we call compute_schedule, which will check whether the subgraph
- * is connected.
- */
-static int compute_sub_schedule(isl_ctx *ctx,
-	struct isl_sched_graph *graph, int n, int n_edge,
-	int (*node_pred)(struct isl_sched_node *node, int data),
-	int (*edge_pred)(struct isl_sched_edge *edge, int data),
-	int data, int wcc)
-{
-	struct isl_sched_graph split = { 0 };
-
-	if (graph_alloc(ctx, &split, n, n_edge) < 0)
-		goto error;
-	if (copy_nodes(&split, graph, node_pred, data) < 0)
-		goto error;
-	if (graph_init_table(ctx, &split) < 0)
-		goto error;
-	if (copy_edges(ctx, &split, graph, edge_pred, data) < 0)
-		goto error;
-	if (graph_init_edge_table(ctx, &split) < 0)
-		goto error;
-	split.n_row = graph->n_row;
-	split.n_total_row = graph->n_total_row;
-	split.n_band = graph->n_band;
-	split.band_start = graph->band_start;
-
-	if (wcc && compute_schedule_wcc(ctx, &split) < 0)
-		goto error;
-	if (!wcc && compute_schedule(ctx, &split) < 0)
-		goto error;
-
-	copy_schedule(graph, &split, node_pred, data);
-
-	graph_free(ctx, &split);
-	return 0;
-error:
-	graph_free(ctx, &split);
-	return -1;
-}
-
-static int node_scc_exactly(struct isl_sched_node *node, int scc)
-{
-	return node->scc == scc;
-}
-
-static int node_scc_at_most(struct isl_sched_node *node, int scc)
-{
-	return node->scc <= scc;
-}
-
-static int node_scc_at_least(struct isl_sched_node *node, int scc)
-{
-	return node->scc >= scc;
-}
-
-static int edge_src_scc_exactly(struct isl_sched_edge *edge, int scc)
-{
-	return edge->src->scc == scc;
-}
-
-static int edge_dst_scc_at_most(struct isl_sched_edge *edge, int scc)
-{
-	return edge->dst->scc <= scc;
-}
-
-static int edge_src_scc_at_least(struct isl_sched_edge *edge, int scc)
-{
-	return edge->src->scc >= scc;
-}
-
-/* Pad the schedules of all nodes with zero rows such that in the end
- * they all have graph->n_total_row rows.
- * The extra rows don't belong to any band, so they get assigned band number -1.
- */
-static int pad_schedule(struct isl_sched_graph *graph)
-{
-	int i, j;
-
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[i];
-		int row = isl_mat_rows(node->sched);
-		if (graph->n_total_row > row) {
-			isl_map_free(node->sched_map);
-			node->sched_map = NULL;
-		}
-		node->sched = isl_mat_add_zero_rows(node->sched,
-						    graph->n_total_row - row);
-		if (!node->sched)
-			return -1;
-		for (j = row; j < graph->n_total_row; ++j)
-			node->band[j] = -1;
-	}
-
-	return 0;
-}
-
-/* Split the current graph into two parts and compute a schedule for each
- * part individually.  In particular, one part consists of all SCCs up
- * to and including graph->src_scc, while the other part contains the other
- * SCCS.
- *
- * The split is enforced in the schedule by constant rows with two different
- * values (0 and 1).  These constant rows replace the previously computed rows
- * in the current band.
- * It would be possible to reuse them as the first rows in the next
- * band, but recomputing them may result in better rows as we are looking
- * at a smaller part of the dependence graph.
- *
- * The band_id of the second group is set to n, where n is the number
- * of nodes in the first group.  This ensures that the band_ids over
- * the two groups remain disjoint, even if either or both of the two
- * groups contain independent components.
- */
-static int compute_split_schedule(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	int i, j, n, e1, e2;
-	int n_total_row, orig_total_row;
-	int n_band, orig_band;
-	int drop;
-
-	drop = graph->n_total_row - graph->band_start;
-	graph->n_total_row -= drop;
-	graph->n_row -= drop;
-
-	n = 0;
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[i];
-		int row = isl_mat_rows(node->sched) - drop;
-		int cols = isl_mat_cols(node->sched);
-		int before = node->scc <= graph->src_scc;
-
-		if (before)
-			n++;
-
-		isl_map_free(node->sched_map);
-		node->sched_map = NULL;
-		node->sched = isl_mat_drop_rows(node->sched,
-						graph->band_start, drop);
-		node->sched = isl_mat_add_rows(node->sched, 1);
-		if (!node->sched)
-			return -1;
-		node->sched = isl_mat_set_element_si(node->sched, row, 0,
-						     !before);
-		for (j = 1; j < cols; ++j)
-			node->sched = isl_mat_set_element_si(node->sched,
-							     row, j, 0);
-		node->band[graph->n_total_row] = graph->n_band;
-	}
-
-	e1 = e2 = 0;
-	for (i = 0; i < graph->n_edge; ++i) {
-		if (graph->edge[i].dst->scc <= graph->src_scc)
-			e1++;
-		if (graph->edge[i].src->scc > graph->src_scc)
-			e2++;
-	}
-
-	graph->n_total_row++;
-	next_band(graph);
-
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[i];
-		if (node->scc > graph->src_scc)
-			node->band_id[graph->n_band] = n;
-	}
-
-	orig_total_row = graph->n_total_row;
-	orig_band = graph->n_band;
-	if (compute_sub_schedule(ctx, graph, n, e1,
-				&node_scc_at_most, &edge_dst_scc_at_most,
-				graph->src_scc, 0) < 0)
-		return -1;
-	n_total_row = graph->n_total_row;
-	graph->n_total_row = orig_total_row;
-	n_band = graph->n_band;
-	graph->n_band = orig_band;
-	if (compute_sub_schedule(ctx, graph, graph->n - n, e2,
-				&node_scc_at_least, &edge_src_scc_at_least,
-				graph->src_scc + 1, 0) < 0)
-		return -1;
-	if (n_total_row > graph->n_total_row)
-		graph->n_total_row = n_total_row;
-	if (n_band > graph->n_band)
-		graph->n_band = n_band;
-
-	return pad_schedule(graph);
-}
-
-/* Compute the next band of the schedule after updating the dependence
- * relations based on the the current schedule.
- */
-static int compute_next_band(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	if (update_edges(ctx, graph) < 0)
-		return -1;
-	next_band(graph);
-		
-	return compute_schedule(ctx, graph);
-}
-
-/* Add constraints to graph->lp that force the dependence of edge i
- * to be respected and attempt to carry it, where edge i is one from
- * a node j to itself.
- * That is, add constraints that enforce
- *
- *	(c_j_0 + c_j_n n + c_j_x y) - (c_j_0 + c_j_n n + c_j_x x)
- *	= c_j_x (y - x) >= e_i
- *
- * for each (x,y) in R.
- * We obtain general constraints on coefficients (c_0, c_n, c_x)
- * of valid constraints for (y - x) and then plug in (-e_i, 0, c_j_x),
- * with each coefficient in c_j_x represented as a pair of non-negative
- * coefficients.
- */
-static int add_intra_constraints(struct isl_sched_graph *graph, int i)
-{
-	unsigned total;
-	struct isl_sched_edge *edge= &graph->edge[i];
-	isl_map *map = isl_map_copy(edge->map);
-	isl_ctx *ctx = isl_map_get_ctx(map);
-	isl_dim *dim;
-	isl_dim_map *dim_map;
-	isl_basic_set *coef;
-	struct isl_sched_node *node = edge->src;
-
-	coef = intra_coefficients(graph, map);
-
-	dim = isl_dim_domain(isl_dim_unwrap(isl_basic_set_get_dim(coef)));
-
-	total = isl_basic_set_total_dim(graph->lp);
-	dim_map = isl_dim_map_alloc(ctx, total);
-	isl_dim_map_range(dim_map, 3 + i, 0, 0, 0, 1, -1);
-	isl_dim_map_range(dim_map, node->start + 2 * node->nparam + 1, 2,
-			  isl_dim_size(dim, isl_dim_set), 1,
-			  node->nvar, -1);
-	isl_dim_map_range(dim_map, node->start + 2 * node->nparam + 2, 2,
-			  isl_dim_size(dim, isl_dim_set), 1,
-			  node->nvar, 1);
-	graph->lp = isl_basic_set_extend_constraints(graph->lp,
-			coef->n_eq, coef->n_ineq);
-	graph->lp = isl_basic_set_add_constraints_dim_map(graph->lp,
-							   coef, dim_map);
-	isl_dim_free(dim);
-
-	return 0;
-}
-
-/* Add constraints to graph->lp that force the dependence of edge i
- * to be respected and attempt to carry it, where edge i is one from
- * node j to node k.
- * That is, add constraints that enforce
- *
- *	(c_k_0 + c_k_n n + c_k_x y) - (c_j_0 + c_j_n n + c_j_x x) >= e_i
- *
- * for each (x,y) in R.
- * We obtain general constraints on coefficients (c_0, c_n, c_x)
- * of valid constraints for R and then plug in
- * (-e_i + c_k_0 - c_j_0, c_k_n - c_j_n, c_k_x - c_j_x)
- * with each coefficient (except e_i, c_k_0 and c_j_0)
- * represented as a pair of non-negative coefficients.
- */
-static int add_inter_constraints(struct isl_sched_graph *graph, int i)
-{
-	unsigned total;
-	struct isl_sched_edge *edge= &graph->edge[i];
-	isl_map *map = isl_map_copy(edge->map);
-	isl_ctx *ctx = isl_map_get_ctx(map);
-	isl_dim *dim;
-	isl_dim_map *dim_map;
-	isl_basic_set *coef;
-	struct isl_sched_node *src = edge->src;
-	struct isl_sched_node *dst = edge->dst;
-
-	coef = inter_coefficients(graph, map);
-
-	dim = isl_dim_domain(isl_dim_unwrap(isl_basic_set_get_dim(coef)));
-
-	total = isl_basic_set_total_dim(graph->lp);
-	dim_map = isl_dim_map_alloc(ctx, total);
-
-	isl_dim_map_range(dim_map, 3 + i, 0, 0, 0, 1, -1);
-
-	isl_dim_map_range(dim_map, dst->start, 0, 0, 0, 1, 1);
-	isl_dim_map_range(dim_map, dst->start + 1, 2, 1, 1, dst->nparam, -1);
-	isl_dim_map_range(dim_map, dst->start + 2, 2, 1, 1, dst->nparam, 1);
-	isl_dim_map_range(dim_map, dst->start + 2 * dst->nparam + 1, 2,
-			  isl_dim_size(dim, isl_dim_set) + src->nvar, 1,
-			  dst->nvar, -1);
-	isl_dim_map_range(dim_map, dst->start + 2 * dst->nparam + 2, 2,
-			  isl_dim_size(dim, isl_dim_set) + src->nvar, 1,
-			  dst->nvar, 1);
-
-	isl_dim_map_range(dim_map, src->start, 0, 0, 0, 1, -1);
-	isl_dim_map_range(dim_map, src->start + 1, 2, 1, 1, src->nparam, 1);
-	isl_dim_map_range(dim_map, src->start + 2, 2, 1, 1, src->nparam, -1);
-	isl_dim_map_range(dim_map, src->start + 2 * src->nparam + 1, 2,
-			  isl_dim_size(dim, isl_dim_set), 1,
-			  src->nvar, 1);
-	isl_dim_map_range(dim_map, src->start + 2 * src->nparam + 2, 2,
-			  isl_dim_size(dim, isl_dim_set), 1,
-			  src->nvar, -1);
-
-	graph->lp = isl_basic_set_extend_constraints(graph->lp,
-			coef->n_eq, coef->n_ineq);
-	graph->lp = isl_basic_set_add_constraints_dim_map(graph->lp,
-							   coef, dim_map);
-	isl_dim_free(dim);
-
-	return 0;
-}
-
-/* Add constraints to graph->lp that force all dependence
- * to be respected and attempt to carry it.
- */
-static int add_all_constraints(struct isl_sched_graph *graph)
-{
-	int i;
-
-	for (i = 0; i < graph->n_edge; ++i) {
-		struct isl_sched_edge *edge= &graph->edge[i];
-		if (edge->src == edge->dst &&
-		    add_intra_constraints(graph, i) < 0)
-			return -1;
-		if (edge->src != edge->dst &&
-		    add_inter_constraints(graph, i) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-/* Construct an LP problem for finding schedule coefficients
- * such that the schedule carries as many dependences as possible.
- * In particular, for each dependence i, we bound the dependence distance
- * from below by e_i, with 0 <= e_i <= 1 and then maximize the sum
- * of all e_i's.  Dependence with e_i = 0 in the solution are simply
- * respected, while those with e_i > 0 (in practice e_i = 1) are carried.
- *
- * All variables of the LP are non-negative.  The actual coefficients
- * may be negative, so each coefficient is represented as the difference
- * of two non-negative variables.  The negative part always appears
- * immediately before the positive part.
- * Other than that, the variables have the following order
- *
- *	- sum of (1 - e_i) over all edges
- *	- sum of positive and negative parts of all c_n coefficients
- *		(unconstrained when computing non-parametric schedules)
- *	- sum of positive and negative parts of all c_x coefficients
- *	- for each edge
- *		- e_i
- *	- for each node
- *		- c_i_0
- *		- positive and negative parts of c_i_n (if parametric)
- *		- positive and negative parts of c_i_x
- *
- * The constraints are those from the edges plus three equalities
- * to express the sums and n_edge inequalities to express e_i <= 1.
- */
-static int setup_carry_lp(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	int i, j;
-	int k;
-	isl_dim *dim;
-	unsigned total;
-	int n_eq, n_ineq;
-
-	total = 3 + graph->n_edge;
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[graph->sorted[i]];
-		node->start = total;
-		total += 1 + 2 * (node->nparam + node->nvar);
-	}
-
-	if (count_constraints(graph, &n_eq, &n_ineq, 1) < 0)
-		return -1;
-
-	dim = isl_dim_set_alloc(ctx, 0, total);
-	isl_basic_set_free(graph->lp);
-	n_eq += 3;
-	n_ineq += graph->n_edge;
-	graph->lp = isl_basic_set_alloc_dim(dim, 0, n_eq, n_ineq);
-	graph->lp = isl_basic_set_set_rational(graph->lp);
-
-	k = isl_basic_set_alloc_equality(graph->lp);
-	if (k < 0)
-		return -1;
-	isl_seq_clr(graph->lp->eq[k], 1 +  total);
-	isl_int_set_si(graph->lp->eq[k][0], -graph->n_edge);
-	isl_int_set_si(graph->lp->eq[k][1], 1);
-	for (i = 0; i < graph->n_edge; ++i)
-		isl_int_set_si(graph->lp->eq[k][4 + i], 1);
-
-	k = isl_basic_set_alloc_equality(graph->lp);
-	if (k < 0)
-		return -1;
-	isl_seq_clr(graph->lp->eq[k], 1 +  total);
-	isl_int_set_si(graph->lp->eq[k][2], -1);
-	for (i = 0; i < graph->n; ++i) {
-		int pos = 1 + graph->node[i].start + 1;
-
-		for (j = 0; j < 2 * graph->node[i].nparam; ++j)
-			isl_int_set_si(graph->lp->eq[k][pos + j], 1);
-	}
-
-	k = isl_basic_set_alloc_equality(graph->lp);
-	if (k < 0)
-		return -1;
-	isl_seq_clr(graph->lp->eq[k], 1 +  total);
-	isl_int_set_si(graph->lp->eq[k][3], -1);
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[i];
-		int pos = 1 + node->start + 1 + 2 * node->nparam;
-
-		for (j = 0; j < 2 * node->nvar; ++j)
-			isl_int_set_si(graph->lp->eq[k][pos + j], 1);
-	}
-
-	for (i = 0; i < graph->n_edge; ++i) {
-		k = isl_basic_set_alloc_inequality(graph->lp);
-		if (k < 0)
-			return -1;
-		isl_seq_clr(graph->lp->ineq[k], 1 +  total);
-		isl_int_set_si(graph->lp->ineq[k][4 + i], -1);
-		isl_int_set_si(graph->lp->ineq[k][0], 1);
-	}
-
-	if (add_all_constraints(graph) < 0)
-		return -1;
-
-	return 0;
-}
-
-/* If the schedule_split_parallel option is set and if the linear
- * parts of the scheduling rows for all nodes in the graphs are the same,
- * then split off the constant term from the linear part.
- * The constant term is then placed in a separate band and
- * the linear part is simplified.
- */
-static int split_parallel(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	int i;
-	int equal = 1;
-	int row, cols;
-	struct isl_sched_node *node0;
-
-	if (!ctx->opt->schedule_split_parallel)
-		return 0;
-	if (graph->n <= 1)
-		return 0;
-
-	node0 = &graph->node[0];
-	row = isl_mat_rows(node0->sched) - 1;
-	cols = isl_mat_cols(node0->sched);
-	for (i = 1; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[i];
-
-		if (!isl_seq_eq(node0->sched->row[row] + 1,
-				node->sched->row[row] + 1, cols - 1))
-			return 0;
-		if (equal &&
-		    isl_int_ne(node0->sched->row[row][0],
-			       node->sched->row[row][0]))
-			equal = 0;
-	}
-	if (equal)
-		return 0;
-
-	next_band(graph);
-
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[i];
-
-		isl_map_free(node->sched_map);
-		node->sched_map = NULL;
-		node->sched = isl_mat_add_zero_rows(node->sched, 1);
-		if (!node->sched)
-			return -1;
-		isl_int_set(node->sched->row[row + 1][0],
-			    node->sched->row[row][0]);
-		isl_int_set_si(node->sched->row[row][0], 0);
-		node->sched = isl_mat_normalize_row(node->sched, row);
-		if (!node->sched)
-			return -1;
-		node->band[graph->n_total_row] = graph->n_band;
-	}
-
-	graph->n_total_row++;
-
-	return 0;
-}
-
-/* Construct a schedule row for each node such that as many dependences
- * as possible are carried and then continue with the next band.
- */
-static int carry_dependences(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	isl_vec *sol;
-	isl_basic_set *lp;
-
-	if (setup_carry_lp(ctx, graph) < 0)
-		return -1;
-
-	lp = isl_basic_set_copy(graph->lp);
-	sol = isl_tab_basic_set_non_neg_lexmin(lp);
-	if (!sol)
-		return -1;
-
-	if (sol->size == 0) {
-		isl_vec_free(sol);
-		isl_die(ctx, isl_error_internal,
-			"error in schedule construction", return -1);
-	}
-
-	if (isl_int_cmp_si(sol->el[1], graph->n_edge) >= 0) {
-		isl_vec_free(sol);
-		isl_die(ctx, isl_error_unknown,
-			"unable to carry dependences", return -1);
-	}
-
-	if (update_schedule(graph, sol, 0, 0) < 0)
-		return -1;
-
-	if (split_parallel(ctx, graph) < 0)
-		return -1;
-
-	return compute_next_band(ctx, graph);
-}
-
-/* Compute a schedule for a connected dependence graph.
- * We try to find a sequence of as many schedule rows as possible that result
- * in non-negative dependence distances (independent of the previous rows
- * in the sequence, i.e., such that the sequence is tilable).
- * If we can't find any more rows we either
- * - split between SCCs and start over (assuming we found an interesting
- *	pair of SCCs between which to split)
- * - continue with the next band (assuming the current band has at least
- *	one row)
- * - try to carry as many dependences as possible and continue with the next
- *	band
- *
- * If we manage to complete the schedule, we finish off by topologically
- * sorting the statements based on the remaining dependences.
- *
- * If ctx->opt->schedule_outer_zero_distance is set, then we force the
- * outermost dimension in the current band to be zero distance.  If this
- * turns out to be impossible, we fall back on the general scheme above
- * and try to carry as many dependences as possible.
- */
-static int compute_schedule_wcc(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	int force_zero = 0;
-
-	if (detect_sccs(graph) < 0)
-		return -1;
-	sort_sccs(graph);
-
-	if (compute_maxvar(graph) < 0)
-		return -1;
-
-	if (ctx->opt->schedule_outer_zero_distance)
-		force_zero = 1;
-
-	while (graph->n_row < graph->maxvar) {
-		isl_vec *sol;
-
-		graph->src_scc = -1;
-		graph->dst_scc = -1;
-
-		if (setup_lp(ctx, graph, force_zero) < 0)
-			return -1;
-		sol = solve_lp(graph);
-		if (!sol)
-			return -1;
-		if (sol->size == 0) {
-			isl_vec_free(sol);
-			if (!ctx->opt->schedule_maximize_band_depth &&
-			    graph->n_total_row > graph->band_start)
-				return compute_next_band(ctx, graph);
-			if (graph->src_scc >= 0)
-				return compute_split_schedule(ctx, graph);
-			if (graph->n_total_row > graph->band_start)
-				return compute_next_band(ctx, graph);
-			return carry_dependences(ctx, graph);
-		}
-		if (update_schedule(graph, sol, 1, 1) < 0)
-			return -1;
-		force_zero = 0;
-	}
-
-	if (graph->n_total_row > graph->band_start)
-		next_band(graph);
-	return sort_statements(ctx, graph);
-}
-
-/* Compute a schedule for each component (identified by node->scc)
- * of the dependence graph separately and then combine the results.
- *
- * The band_id is adjusted such that each component has a separate id.
- * Note that the band_id may have already been set to a value different
- * from zero by compute_split_schedule.
- */
-static int compute_component_schedule(isl_ctx *ctx,
-	struct isl_sched_graph *graph)
-{
-	int wcc, i;
-	int n, n_edge;
-	int n_total_row, orig_total_row;
-	int n_band, orig_band;
-
-	n_total_row = 0;
-	orig_total_row = graph->n_total_row;
-	n_band = 0;
-	orig_band = graph->n_band;
-	for (i = 0; i < graph->n; ++i)
-		graph->node[i].band_id[graph->n_band] += graph->node[i].scc;
-	for (wcc = 0; wcc < graph->scc; ++wcc) {
-		n = 0;
-		for (i = 0; i < graph->n; ++i)
-			if (graph->node[i].scc == wcc)
-				n++;
-		n_edge = 0;
-		for (i = 0; i < graph->n_edge; ++i)
-			if (graph->edge[i].src->scc == wcc)
-				n_edge++;
-
-		if (compute_sub_schedule(ctx, graph, n, n_edge,
-				    &node_scc_exactly,
-				    &edge_src_scc_exactly, wcc, 1) < 0)
-			return -1;
-		if (graph->n_total_row > n_total_row)
-			n_total_row = graph->n_total_row;
-		graph->n_total_row = orig_total_row;
-		if (graph->n_band > n_band)
-			n_band = graph->n_band;
-		graph->n_band = orig_band;
-	}
-
-	graph->n_total_row = n_total_row;
-	graph->n_band = n_band;
-
-	return pad_schedule(graph);
-}
-
-/* Compute a schedule for the given dependence graph.
- * We first check if the graph is connected (through validity dependences)
- * and if so compute a schedule for each component separately.
- */
-static int compute_schedule(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	if (detect_wccs(graph) < 0)
-		return -1;
-
-	if (graph->scc > 1)
-		return compute_component_schedule(ctx, graph);
-
-	return compute_schedule_wcc(ctx, graph);
-}
-
-/* Compute a schedule for the given union of domains that respects
- * all the validity dependences and tries to minimize the dependence
- * distances over the proximity dependences.
- */
-__isl_give isl_schedule *isl_union_set_compute_schedule(
-	__isl_take isl_union_set *domain,
-	__isl_take isl_union_map *validity,
-	__isl_take isl_union_map *proximity)
-{
-	isl_ctx *ctx = isl_union_set_get_ctx(domain);
-	isl_dim *dim;
-	struct isl_sched_graph graph = { 0 };
-	isl_schedule *sched;
-
-	domain = isl_union_set_align_params(domain,
-					    isl_union_map_get_dim(validity));
-	domain = isl_union_set_align_params(domain,
-					    isl_union_map_get_dim(proximity));
-	dim = isl_union_set_get_dim(domain);
-	validity = isl_union_map_align_params(validity, isl_dim_copy(dim));
-	proximity = isl_union_map_align_params(proximity, dim);
-
-	if (!domain)
-		goto error;
-
-	graph.n = isl_union_set_n_set(domain);
-	if (graph.n == 0)
-		goto empty;
-	if (graph_alloc(ctx, &graph, graph.n,
-	    isl_union_map_n_map(validity) + isl_union_map_n_map(proximity)) < 0)
-		goto error;
-	graph.root = 1;
-	graph.n = 0;
-	if (isl_union_set_foreach_set(domain, &extract_node, &graph) < 0)
-		goto error;
-	if (graph_init_table(ctx, &graph) < 0)
-		goto error;
-	graph.n_edge = 0;
-	if (isl_union_map_foreach_map(validity, &extract_edge, &graph) < 0)
-		goto error;
-	if (graph_init_edge_table(ctx, &graph) < 0)
-		goto error;
-	if (isl_union_map_foreach_map(proximity, &extract_edge, &graph) < 0)
-		goto error;
-
-	if (compute_schedule(ctx, &graph) < 0)
-		goto error;
-
-empty:
-	sched = extract_schedule(&graph, isl_union_set_get_dim(domain));
-
-	graph_free(ctx, &graph);
-	isl_union_set_free(domain);
-	isl_union_map_free(validity);
-	isl_union_map_free(proximity);
-
-	return sched;
-error:
-	graph_free(ctx, &graph);
-	isl_union_set_free(domain);
-	isl_union_map_free(validity);
-	isl_union_map_free(proximity);
-	return NULL;
-}
-
-void *isl_schedule_free(__isl_take isl_schedule *sched)
-{
-	int i;
-	if (!sched)
-		return NULL;
-
-	if (--sched->ref > 0)
-		return NULL;
-
-	for (i = 0; i < sched->n; ++i) {
-		isl_map_free(sched->node[i].sched);
-		free(sched->node[i].band_end);
-		free(sched->node[i].band_id);
-		free(sched->node[i].zero);
-	}
-	isl_dim_free(sched->dim);
-	isl_band_list_free(sched->band_forest);
-	free(sched);
-	return NULL;
-}
-
-isl_ctx *isl_schedule_get_ctx(__isl_keep isl_schedule *schedule)
-{
-	return schedule ? isl_dim_get_ctx(schedule->dim) : NULL;
-}
-
-__isl_give isl_union_map *isl_schedule_get_map(__isl_keep isl_schedule *sched)
-{
-	int i;
-	isl_union_map *umap;
-
-	if (!sched)
-		return NULL;
-
-	umap = isl_union_map_empty(isl_dim_copy(sched->dim));
-	for (i = 0; i < sched->n; ++i)
-		umap = isl_union_map_add_map(umap,
-					    isl_map_copy(sched->node[i].sched));
-
-	return umap;
-}
-
-static __isl_give isl_band_list *construct_band_list(
-	__isl_keep isl_schedule *schedule, __isl_keep isl_band *parent,
-	int band_nr, int *parent_active, int n_active);
-
-/* Construct an isl_band structure for the band in the given schedule
- * with sequence number band_nr for the n_active nodes marked by active.
- * If the nodes don't have a band with the given sequence number,
- * then a band without members is created.
- *
- * Because of the way the schedule is constructed, we know that
- * the position of the band inside the schedule of a node is the same
- * for all active nodes.
- */
-static __isl_give isl_band *construct_band(__isl_keep isl_schedule *schedule,
-	__isl_keep isl_band *parent,
-	int band_nr, int *active, int n_active)
-{
-	int i, j;
-	isl_ctx *ctx = isl_schedule_get_ctx(schedule);
-	isl_band *band;
-	unsigned start, end;
-
-	band = isl_calloc_type(ctx, isl_band);
-	if (!band)
-		return NULL;
-
-	band->ref = 1;
-	band->schedule = schedule;
-	band->parent = parent;
-
-	for (i = 0; i < schedule->n; ++i)
-		if (active[i] && schedule->node[i].n_band > band_nr + 1)
-			break;
-
-	if (i < schedule->n) {
-		band->children = construct_band_list(schedule, band,
-						band_nr + 1, active, n_active);
-		if (!band->children)
-			goto error;
-	}
-
-	for (i = 0; i < schedule->n; ++i)
-		if (active[i])
-			break;
-
-	if (i >= schedule->n)
-		isl_die(ctx, isl_error_internal,
-			"band without active statements", goto error);
-
-	start = band_nr ? schedule->node[i].band_end[band_nr - 1] : 0;
-	end = band_nr < schedule->node[i].n_band ?
-		schedule->node[i].band_end[band_nr] : start;
-	band->n = end - start;
-
-	band->zero = isl_alloc_array(ctx, int, band->n);
-	if (!band->zero)
-		goto error;
-
-	for (j = 0; j < band->n; ++j)
-		band->zero[j] = schedule->node[i].zero[start + j];
-
-	band->map = isl_union_map_empty(isl_dim_copy(schedule->dim));
-	for (i = 0; i < schedule->n; ++i) {
-		isl_map *map;
-		unsigned n_out;
-
-		if (!active[i])
-			continue;
-
-		map = isl_map_copy(schedule->node[i].sched);
-		n_out = isl_map_dim(map, isl_dim_out);
-		map = isl_map_project_out(map, isl_dim_out, end, n_out - end);
-		map = isl_map_project_out(map, isl_dim_out, 0, start);
-		band->map = isl_union_map_union(band->map,
-						isl_union_map_from_map(map));
-	}
-	if (!band->map)
-		goto error;
-
-	return band;
-error:
-	isl_band_free(band);
-	return NULL;
-}
-
-/* Construct a list of bands that start at the same position (with
- * sequence number band_nr) in the schedules of the nodes that
- * were active in the parent band.
- *
- * A separate isl_band structure is created for each band_id
- * and for each node that does not have a band with sequence
- * number band_nr.  In the latter case, a band without members
- * is created.
- * This ensures that if a band has any children, then each node
- * that was active in the band is active in exactly one of the children.
- */
-static __isl_give isl_band_list *construct_band_list(
-	__isl_keep isl_schedule *schedule, __isl_keep isl_band *parent,
-	int band_nr, int *parent_active, int n_active)
-{
-	int i, j;
-	isl_ctx *ctx = isl_schedule_get_ctx(schedule);
-	int *active;
-	int n_band;
-	isl_band_list *list;
-
-	n_band = 0;
-	for (i = 0; i < n_active; ++i) {
-		for (j = 0; j < schedule->n; ++j) {
-			if (!parent_active[j])
-				continue;
-			if (schedule->node[j].n_band <= band_nr)
-				continue;
-			if (schedule->node[j].band_id[band_nr] == i) {
-				n_band++;
-				break;
-			}
-		}
-	}
-	for (j = 0; j < schedule->n; ++j)
-		if (schedule->node[j].n_band <= band_nr)
-			n_band++;
-
-	if (n_band == 1) {
-		isl_band *band;
-		list = isl_band_list_alloc(ctx, n_band);
-		band = construct_band(schedule, parent, band_nr,
-					parent_active, n_active);
-		return isl_band_list_add(list, band);
-	}
-
-	active = isl_alloc_array(ctx, int, schedule->n);
-	if (!active)
-		return NULL;
-
-	list = isl_band_list_alloc(ctx, n_band);
-
-	for (i = 0; i < n_active; ++i) {
-		int n = 0;
-		isl_band *band;
-
-		for (j = 0; j < schedule->n; ++j) {
-			active[j] = parent_active[j] &&
-					schedule->node[j].n_band > band_nr &&
-					schedule->node[j].band_id[band_nr] == i;
-			if (active[j])
-				n++;
-		}
-		if (n == 0)
-			continue;
-
-		band = construct_band(schedule, parent, band_nr, active, n);
-
-		list = isl_band_list_add(list, band);
-	}
-	for (i = 0; i < schedule->n; ++i) {
-		isl_band *band;
-		if (!parent_active[i])
-			continue;
-		if (schedule->node[i].n_band > band_nr)
-			continue;
-		for (j = 0; j < schedule->n; ++j)
-			active[j] = j == i;
-		band = construct_band(schedule, parent, band_nr, active, 1);
-		list = isl_band_list_add(list, band);
-	}
-
-	free(active);
-
-	return list;
-}
-
-/* Construct a band forest representation of the schedule and
- * return the list of roots.
- */
-static __isl_give isl_band_list *construct_forest(
-	__isl_keep isl_schedule *schedule)
-{
-	int i;
-	isl_ctx *ctx = isl_schedule_get_ctx(schedule);
-	isl_band_list *forest;
-	int *active;
-
-	active = isl_alloc_array(ctx, int, schedule->n);
-	if (!active)
-		return NULL;
-
-	for (i = 0; i < schedule->n; ++i)
-		active[i] = 1;
-
-	forest = construct_band_list(schedule, NULL, 0, active, schedule->n);
-
-	free(active);
-
-	return forest;
-}
-
-/* Return the roots of a band forest representation of the schedule.
- */
-__isl_give isl_band_list *isl_schedule_get_band_forest(
-	__isl_keep isl_schedule *schedule)
-{
-	if (!schedule)
-		return NULL;
-	if (!schedule->band_forest)
-		schedule->band_forest = construct_forest(schedule);
-	return isl_band_list_dup(schedule->band_forest);
-}
-
-static __isl_give isl_printer *print_band_list(__isl_take isl_printer *p,
-	__isl_keep isl_band_list *list);
-
-static __isl_give isl_printer *print_band(__isl_take isl_printer *p,
-	__isl_keep isl_band *band)
-{
-	isl_band_list *children;
-
-	p = isl_printer_start_line(p);
-	p = isl_printer_print_union_map(p, band->map);
-	p = isl_printer_end_line(p);
-
-	if (!isl_band_has_children(band))
-		return p;
-
-	children = isl_band_get_children(band);
-
-	p = isl_printer_indent(p, 4);
-	p = print_band_list(p, children);
-	p = isl_printer_indent(p, -4);
-
-	isl_band_list_free(children);
-
-	return p;
-}
-
-static __isl_give isl_printer *print_band_list(__isl_take isl_printer *p,
-	__isl_keep isl_band_list *list)
-{
-	int i, n;
-
-	n = isl_band_list_n_band(list);
-	for (i = 0; i < n; ++i) {
-		isl_band *band;
-		band = isl_band_list_get_band(list, i);
-		p = print_band(p, band);
-		isl_band_free(band);
-	}
-
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_print_schedule(__isl_take isl_printer *p,
-	__isl_keep isl_schedule *schedule)
-{
-	isl_band_list *forest;
-
-	forest = isl_schedule_get_band_forest(schedule);
-
-	p = print_band_list(p, forest);
-
-	isl_band_list_free(forest);
-
-	return p;
-}
-
-void isl_schedule_dump(__isl_keep isl_schedule *schedule)
-{
-	isl_printer *printer;
-
-	if (!schedule)
-		return;
-
-	printer = isl_printer_to_file(isl_schedule_get_ctx(schedule), stderr);
-	printer = isl_printer_print_schedule(printer, schedule);
-
-	isl_printer_free(printer);
-}
diff --git a/cloog-0.16.3/isl/isl_schedule_private.h b/cloog-0.16.3/isl/isl_schedule_private.h
deleted file mode 100644
index f5cf7d9..0000000
--- a/cloog-0.16.3/isl/isl_schedule_private.h
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef ISL_SCHEDLUE_PRIVATE_H
-#define ISL_SCHEDLUE_PRIVATE_H
-
-#include <isl/schedule.h>
-
-/* The schedule for an individual domain, plus information about the bands
- * and scheduling dimensions.
- * In particular, we keep track of the number of bands and for each
- * band, the starting position of the next band.  The first band starts at
- * position 0.
- * For each scheduling dimension, we keep track of whether it result
- * in zero dependence distances (within its band) with respect
- * to the proximity edges.
- */
-struct isl_schedule_node {
-	isl_map *sched;
-	int	 n_band;
-	int	*band_end;
-	int	*band_id;
-	int	*zero;
-};
-
-/* Information about the computed schedule.
- * n is the number of nodes/domains/statements.
- * n_band is the maximal number of bands.
- * n_total_row is the number of coordinates of the schedule.
- * dim contains a description of the parameters.
- * band_forest points to a band forest representation of the schedule
- * and may be NULL if the forest hasn't been created yet.
- */
-struct isl_schedule {
-	int ref;
-
-	int n;
-	int n_band;
-	int n_total_row;
-	isl_dim *dim;
-
-	isl_band_list *band_forest;
-
-	struct isl_schedule_node node[1];
-};
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_seq.c b/cloog-0.16.3/isl/isl_seq.c
deleted file mode 100644
index dd80c19..0000000
--- a/cloog-0.16.3/isl/isl_seq.c
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl/seq.h>
-
-void isl_seq_clr(isl_int *p, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_set_si(p[i], 0);
-}
-
-void isl_seq_set(isl_int *p, isl_int v, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_set(p[i], v);
-}
-
-void isl_seq_neg(isl_int *dst, isl_int *src, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_neg(dst[i], src[i]);
-}
-
-void isl_seq_cpy(isl_int *dst, isl_int *src, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_set(dst[i], src[i]);
-}
-
-void isl_seq_submul(isl_int *dst, isl_int f, isl_int *src, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_submul(dst[i], f, src[i]);
-}
-
-void isl_seq_addmul(isl_int *dst, isl_int f, isl_int *src, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_addmul(dst[i], f, src[i]);
-}
-
-void isl_seq_swp_or_cpy(isl_int *dst, isl_int *src, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_swap_or_set(dst[i], src[i]);
-}
-
-void isl_seq_scale(isl_int *dst, isl_int *src, isl_int m, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_mul(dst[i], src[i], m);
-}
-
-void isl_seq_scale_down(isl_int *dst, isl_int *src, isl_int m, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_divexact(dst[i], src[i], m);
-}
-
-void isl_seq_cdiv_q(isl_int *dst, isl_int *src, isl_int m, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_cdiv_q(dst[i], src[i], m);
-}
-
-void isl_seq_fdiv_q(isl_int *dst, isl_int *src, isl_int m, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_fdiv_q(dst[i], src[i], m);
-}
-
-void isl_seq_fdiv_r(isl_int *dst, isl_int *src, isl_int m, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_fdiv_r(dst[i], src[i], m);
-}
-
-void isl_seq_combine(isl_int *dst, isl_int m1, isl_int *src1,
-			isl_int m2, isl_int *src2, unsigned len)
-{
-	int i;
-	isl_int tmp;
-
-	isl_int_init(tmp);
-	for (i = 0; i < len; ++i) {
-		isl_int_mul(tmp, m1, src1[i]);
-		isl_int_addmul(tmp, m2, src2[i]);
-		isl_int_set(dst[i], tmp);
-	}
-	isl_int_clear(tmp);
-}
-
-/*
- * Let d = dst[pos] and s = src[pos]
- * dst is replaced by |s| dst - sgn(s)d src
- */
-void isl_seq_elim(isl_int *dst, isl_int *src, unsigned pos, unsigned len,
-		  isl_int *m)
-{
-	isl_int a;
-	isl_int b;
-
-	if (isl_int_is_zero(dst[pos]))
-		return;
-
-	isl_int_init(a);
-	isl_int_init(b);
-
-	isl_int_gcd(a, src[pos], dst[pos]);
-	isl_int_divexact(b, dst[pos], a);
-	if (isl_int_is_pos(src[pos]))
-		isl_int_neg(b, b);
-	isl_int_divexact(a, src[pos], a);
-	isl_int_abs(a, a);
-	isl_seq_combine(dst, a, dst, b, src, len);
-
-	if (m)
-		isl_int_mul(*m, *m, a);
-
-	isl_int_clear(a);
-	isl_int_clear(b);
-}
-
-int isl_seq_eq(isl_int *p1, isl_int *p2, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		if (isl_int_ne(p1[i], p2[i]))
-			return 0;
-	return 1;
-}
-
-int isl_seq_cmp(isl_int *p1, isl_int *p2, unsigned len)
-{
-	int i;
-	int cmp;
-	for (i = 0; i < len; ++i)
-		if ((cmp = isl_int_cmp(p1[i], p2[i])) != 0)
-			return cmp;
-	return 0;
-}
-
-int isl_seq_is_neg(isl_int *p1, isl_int *p2, unsigned len)
-{
-	int i;
-
-	for (i = 0; i < len; ++i) {
-		if (isl_int_abs_ne(p1[i], p2[i]))
-			return 0;
-		if (isl_int_is_zero(p1[i]))
-			continue;
-		if (isl_int_eq(p1[i], p2[i]))
-			return 0;
-	}
-	return 1;
-}
-
-int isl_seq_first_non_zero(isl_int *p, unsigned len)
-{
-	int i;
-
-	for (i = 0; i < len; ++i)
-		if (!isl_int_is_zero(p[i]))
-			return i;
-	return -1;
-}
-
-int isl_seq_last_non_zero(isl_int *p, unsigned len)
-{
-	int i;
-
-	for (i = len - 1; i >= 0; --i)
-		if (!isl_int_is_zero(p[i]))
-			return i;
-	return -1;
-}
-
-int isl_seq_abs_min_non_zero(isl_int *p, unsigned len)
-{
-	int i, min = isl_seq_first_non_zero(p, len);
-	if (min < 0)
-		return -1;
-	for (i = min + 1; i < len; ++i) {
-		if (isl_int_is_zero(p[i]))
-			continue;
-		if (isl_int_abs_lt(p[i], p[min]))
-			min = i;
-	}
-	return min;
-}
-
-void isl_seq_gcd(isl_int *p, unsigned len, isl_int *gcd)
-{
-	int i, min = isl_seq_abs_min_non_zero(p, len);
-
-	if (min < 0) {
-		isl_int_set_si(*gcd, 0);
-		return;
-	}
-	isl_int_abs(*gcd, p[min]);
-	for (i = 0; isl_int_cmp_si(*gcd, 1) > 0 && i < len; ++i) {
-		if (i == min)
-			continue;
-		if (isl_int_is_zero(p[i]))
-			continue;
-		isl_int_gcd(*gcd, *gcd, p[i]);
-	}
-}
-
-void isl_seq_normalize(struct isl_ctx *ctx, isl_int *p, unsigned len)
-{
-	if (len == 0)
-		return;
-	isl_seq_gcd(p, len, &ctx->normalize_gcd);
-	if (!isl_int_is_zero(ctx->normalize_gcd) &&
-	    !isl_int_is_one(ctx->normalize_gcd))
-		isl_seq_scale_down(p, p, ctx->normalize_gcd, len);
-}
-
-void isl_seq_lcm(isl_int *p, unsigned len, isl_int *lcm)
-{
-	int i;
-
-	if (len == 0) {
-		isl_int_set_si(*lcm, 1);
-		return;
-	}
-	isl_int_set(*lcm, p[0]);
-	for (i = 1; i < len; ++i)
-		isl_int_lcm(*lcm, *lcm, p[i]);
-}
-
-void isl_seq_inner_product(isl_int *p1, isl_int *p2, unsigned len,
-			   isl_int *prod)
-{
-	int i;
-	if (len == 0) {
-		isl_int_set_si(*prod, 0);
-		return;
-	}
-	isl_int_mul(*prod, p1[0], p2[0]);
-	for (i = 1; i < len; ++i)
-		isl_int_addmul(*prod, p1[i], p2[i]);
-}
-
-uint32_t isl_seq_hash(isl_int *p, unsigned len, uint32_t hash)
-{
-	int i;
-	for (i = 0; i < len; ++i) {
-		if (isl_int_is_zero(p[i]))
-			continue;
-		hash *= 16777619;
-		hash ^= (i & 0xFF);
-		hash = isl_int_hash(p[i], hash);
-	}
-	return hash;
-}
-
-uint32_t isl_seq_get_hash(isl_int *p, unsigned len)
-{
-	uint32_t hash = isl_hash_init();
-
-	return isl_seq_hash(p, len, hash);
-}
-
-uint32_t isl_seq_get_hash_bits(isl_int *p, unsigned len, unsigned bits)
-{
-	uint32_t hash;
-
-	hash = isl_seq_get_hash(p, len);
-	return isl_hash_bits(hash, bits);
-}
diff --git a/cloog-0.16.3/isl/isl_stream.c b/cloog-0.16.3/isl/isl_stream.c
deleted file mode 100644
index c544149..0000000
--- a/cloog-0.16.3/isl/isl_stream.c
+++ /dev/null
@@ -1,680 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <ctype.h>
-#include <string.h>
-#include <strings.h>
-#include <isl/ctx.h>
-#include <isl/stream.h>
-
-struct isl_keyword {
-	char			*name;
-	enum isl_token_type	type;
-};
-
-static int same_name(const void *entry, const void *val)
-{
-	const struct isl_keyword *keyword = (const struct isl_keyword *)entry;
-
-	return !strcmp(keyword->name, val);
-}
-
-enum isl_token_type isl_stream_register_keyword(struct isl_stream *s,
-	const char *name)
-{
-	struct isl_hash_table_entry *entry;
-	struct isl_keyword *keyword;
-	uint32_t name_hash;
-
-	if (!s->keywords) {
-		s->keywords = isl_hash_table_alloc(s->ctx, 10);
-		if (!s->keywords)
-			return ISL_TOKEN_ERROR;
-		s->next_type = ISL_TOKEN_LAST;
-	}
-
-	name_hash = isl_hash_string(isl_hash_init(), name);
-
-	entry = isl_hash_table_find(s->ctx, s->keywords, name_hash,
-					same_name, name, 1);
-	if (!entry)
-		return ISL_TOKEN_ERROR;
-	if (entry->data) {
-		keyword = entry->data;
-		return keyword->type;
-	}
-
-	keyword = isl_calloc_type(s->ctx, struct isl_keyword);
-	if (!keyword)
-		return ISL_TOKEN_ERROR;
-	keyword->type = s->next_type++;
-	keyword->name = strdup(name);
-	if (!keyword->name) {
-		free(keyword);
-		return ISL_TOKEN_ERROR;
-	}
-	entry->data = keyword;
-
-	return keyword->type;
-}
-
-static struct isl_token *isl_token_new(struct isl_ctx *ctx,
-	int line, int col, unsigned on_new_line)
-{
-	struct isl_token *tok = isl_alloc_type(ctx, struct isl_token);
-	if (!tok)
-		return NULL;
-	tok->line = line;
-	tok->col = col;
-	tok->on_new_line = on_new_line;
-	tok->is_keyword = 0;
-	tok->u.s = NULL;
-	return tok;
-}
-
-void isl_token_free(struct isl_token *tok)
-{
-	if (!tok)
-		return;
-	if (tok->type == ISL_TOKEN_VALUE)
-		isl_int_clear(tok->u.v);
-	else
-		free(tok->u.s);
-	free(tok);
-}
-
-void isl_stream_error(struct isl_stream *s, struct isl_token *tok, char *msg)
-{
-	int line = tok ? tok->line : s->line;
-	int col = tok ? tok->col : s->col;
-	fprintf(stderr, "syntax error (%d, %d): %s\n", line, col, msg);
-	if (tok) {
-		if (tok->type < 256)
-			fprintf(stderr, "got '%c'\n", tok->type);
-		else if (tok->type == ISL_TOKEN_IDENT)
-			fprintf(stderr, "got ident '%s'\n", tok->u.s);
-		else if (tok->is_keyword)
-			fprintf(stderr, "got keyword '%s'\n", tok->u.s);
-		else if (tok->type == ISL_TOKEN_VALUE) {
-			fprintf(stderr, "got value '");
-			isl_int_print(stderr, tok->u.v, 0);
-			fprintf(stderr, "'\n");
-		} else if (tok->u.s)
-			fprintf(stderr, "got token '%s'\n", tok->u.s);
-		else
-			fprintf(stderr, "got token type %d\n", tok->type);
-	}
-}
-
-static struct isl_stream* isl_stream_new(struct isl_ctx *ctx)
-{
-	int i;
-	struct isl_stream *s = isl_alloc_type(ctx, struct isl_stream);
-	if (!s)
-		return NULL;
-	s->ctx = ctx;
-	isl_ctx_ref(s->ctx);
-	s->file = NULL;
-	s->str = NULL;
-	s->len = 0;
-	s->line = 1;
-	s->col = 0;
-	s->eof = 0;
-	s->c = -1;
-	s->n_un = 0;
-	for (i = 0; i < 5; ++i)
-		s->tokens[i] = NULL;
-	s->n_token = 0;
-	s->keywords = NULL;
-	s->size = 256;
-	s->buffer = isl_alloc_array(ctx, char, s->size);
-	if (!s->buffer)
-		goto error;
-	return s;
-error:
-	isl_stream_free(s);
-	return NULL;
-}
-
-struct isl_stream* isl_stream_new_file(struct isl_ctx *ctx, FILE *file)
-{
-	struct isl_stream *s = isl_stream_new(ctx);
-	if (!s)
-		return NULL;
-	s->file = file;
-	return s;
-}
-
-struct isl_stream* isl_stream_new_str(struct isl_ctx *ctx, const char *str)
-{
-	struct isl_stream *s = isl_stream_new(ctx);
-	if (!s)
-		return NULL;
-	s->str = str;
-	return s;
-}
-
-static int stream_getc(struct isl_stream *s)
-{
-	int c;
-	if (s->eof)
-		return -1;
-	if (s->n_un)
-		return s->c = s->un[--s->n_un];
-	if (s->file)
-		c = fgetc(s->file);
-	else {
-		c = *s->str++;
-		if (c == '\0')
-			c = -1;
-	}
-	if (c == -1)
-		s->eof = 1;
-	if (!s->eof) {
-		if (s->c == '\n') {
-			s->line++;
-			s->col = 0;
-		} else
-			s->col++;
-	}
-	s->c = c;
-	return c;
-}
-
-static void isl_stream_ungetc(struct isl_stream *s, int c)
-{
-	isl_assert(s->ctx, s->n_un < 5, return);
-	s->un[s->n_un++] = c;
-	s->c = -1;
-}
-
-static int isl_stream_getc(struct isl_stream *s)
-{
-	int c;
-
-	do {
-		c = stream_getc(s);
-		if (c != '\\')
-			return c;
-		c = stream_getc(s);
-	} while (c == '\n');
-
-	isl_stream_ungetc(s, c);
-
-	return '\\';
-}
-
-static int isl_stream_push_char(struct isl_stream *s, int c)
-{
-	if (s->len >= s->size) {
-		char *buffer;
-		s->size = (3*s->size)/2;
-		buffer = isl_realloc_array(s->ctx, s->buffer, char, s->size);
-		if (!buffer)
-			return -1;
-		s->buffer = buffer;
-	}
-	s->buffer[s->len++] = c;
-	return 0;
-}
-
-void isl_stream_push_token(struct isl_stream *s, struct isl_token *tok)
-{
-	isl_assert(s->ctx, s->n_token < 5, return);
-	s->tokens[s->n_token++] = tok;
-}
-
-static enum isl_token_type check_keywords(struct isl_stream *s)
-{
-	struct isl_hash_table_entry *entry;
-	struct isl_keyword *keyword;
-	uint32_t name_hash;
-
-	if (!strcasecmp(s->buffer, "exists"))
-		return ISL_TOKEN_EXISTS;
-	if (!strcasecmp(s->buffer, "and"))
-		return ISL_TOKEN_AND;
-	if (!strcasecmp(s->buffer, "or"))
-		return ISL_TOKEN_OR;
-	if (!strcasecmp(s->buffer, "not"))
-		return ISL_TOKEN_NOT;
-	if (!strcasecmp(s->buffer, "infty"))
-		return ISL_TOKEN_INFTY;
-	if (!strcasecmp(s->buffer, "infinity"))
-		return ISL_TOKEN_INFTY;
-	if (!strcasecmp(s->buffer, "NaN"))
-		return ISL_TOKEN_NAN;
-	if (!strcasecmp(s->buffer, "min"))
-		return ISL_TOKEN_MIN;
-	if (!strcasecmp(s->buffer, "max"))
-		return ISL_TOKEN_MAX;
-	if (!strcasecmp(s->buffer, "rat"))
-		return ISL_TOKEN_RAT;
-	if (!strcasecmp(s->buffer, "true"))
-		return ISL_TOKEN_TRUE;
-	if (!strcasecmp(s->buffer, "false"))
-		return ISL_TOKEN_FALSE;
-	if (!strcasecmp(s->buffer, "ceild"))
-		return ISL_TOKEN_CEILD;
-	if (!strcasecmp(s->buffer, "floord"))
-		return ISL_TOKEN_FLOORD;
-
-	if (!s->keywords)
-		return ISL_TOKEN_IDENT;
-
-	name_hash = isl_hash_string(isl_hash_init(), s->buffer);
-	entry = isl_hash_table_find(s->ctx, s->keywords, name_hash, same_name,
-					s->buffer, 0);
-	if (entry) {
-		keyword = entry->data;
-		return keyword->type;
-	}
-
-	return ISL_TOKEN_IDENT;
-}
-
-int isl_stream_skip_line(struct isl_stream *s)
-{
-	int c;
-
-	while ((c = isl_stream_getc(s)) != -1 && c != '\n')
-		/* nothing */
-		;
-
-	return c == -1 ? -1 : 0;
-}
-
-static struct isl_token *next_token(struct isl_stream *s, int same_line)
-{
-	int c;
-	struct isl_token *tok = NULL;
-	int line, col;
-	int old_line = s->line;
-
-	if (s->n_token) {
-		if (same_line && s->tokens[s->n_token - 1]->on_new_line)
-			return NULL;
-		return s->tokens[--s->n_token];
-	}
-
-	if (same_line && s->c == '\n')
-		return NULL;
-
-	s->len = 0;
-
-	/* skip spaces and comment lines */
-	while ((c = isl_stream_getc(s)) != -1) {
-		if (c == '#') {
-			if (isl_stream_skip_line(s) < 0)
-				break;
-			c = '\n';
-			if (same_line)
-				break;
-		} else if (!isspace(c) || (same_line && c == '\n'))
-			break;
-	}
-
-	line = s->line;
-	col = s->col;
-
-	if (c == -1 || (same_line && c == '\n'))
-		return NULL;
-	if (c == '(' ||
-	    c == ')' ||
-	    c == '+' ||
-	    c == '*' ||
-	    c == '%' ||
-	    c == '^' ||
-	    c == '=' ||
-	    c == '@' ||
-	    c == '$' ||
-	    c == ',' ||
-	    c == '.' ||
-	    c == ';' ||
-	    c == '[' ||
-	    c == ']' ||
-	    c == '{' ||
-	    c == '}') {
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		tok->type = (enum isl_token_type)c;
-		return tok;
-	}
-	if (c == '-') {
-		int c;
-		if ((c = isl_stream_getc(s)) == '>') {
-			tok = isl_token_new(s->ctx, line, col, old_line != line);
-			if (!tok)
-				return NULL;
-			tok->u.s = strdup("->");
-			tok->type = ISL_TOKEN_TO;
-			return tok;
-		}
-		if (c != -1)
-			isl_stream_ungetc(s, c);
-		if (!isdigit(c)) {
-			tok = isl_token_new(s->ctx, line, col, old_line != line);
-			if (!tok)
-				return NULL;
-			tok->type = (enum isl_token_type) '-';
-			return tok;
-		}
-	}
-	if (c == '-' || isdigit(c)) {
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		tok->type = ISL_TOKEN_VALUE;
-		isl_int_init(tok->u.v);
-		if (isl_stream_push_char(s, c))
-			goto error;
-		while ((c = isl_stream_getc(s)) != -1 && isdigit(c))
-			if (isl_stream_push_char(s, c))
-				goto error;
-		if (c != -1)
-			isl_stream_ungetc(s, c);
-		isl_stream_push_char(s, '\0');
-		isl_int_read(tok->u.v, s->buffer);
-		return tok;
-	}
-	if (isalpha(c) || c == '_') {
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		isl_stream_push_char(s, c);
-		while ((c = isl_stream_getc(s)) != -1 &&
-				(isalnum(c) || c == '_'))
-			isl_stream_push_char(s, c);
-		if (c != -1)
-			isl_stream_ungetc(s, c);
-		while ((c = isl_stream_getc(s)) != -1 && c == '\'')
-			isl_stream_push_char(s, c);
-		if (c != -1)
-			isl_stream_ungetc(s, c);
-		isl_stream_push_char(s, '\0');
-		tok->type = check_keywords(s);
-		if (tok->type != ISL_TOKEN_IDENT)
-			tok->is_keyword = 1;
-		tok->u.s = strdup(s->buffer);
-		if (!tok->u.s)
-			goto error;
-		return tok;
-	}
-	if (c == '"') {
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		tok->type = ISL_TOKEN_STRING;
-		tok->u.s = NULL;
-		while ((c = isl_stream_getc(s)) != -1 && c != '"' && c != '\n')
-			isl_stream_push_char(s, c);
-		if (c != '"') {
-			isl_stream_error(s, NULL, "unterminated string");
-			goto error;
-		}
-		isl_stream_push_char(s, '\0');
-		tok->u.s = strdup(s->buffer);
-		return tok;
-	}
-	if (c == ':') {
-		int c;
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		if ((c = isl_stream_getc(s)) == '=') {
-			tok->u.s = strdup(":=");
-			tok->type = ISL_TOKEN_DEF;
-			return tok;
-		}
-		if (c != -1)
-			isl_stream_ungetc(s, c);
-		tok->type = (enum isl_token_type) ':';
-		return tok;
-	}
-	if (c == '>') {
-		int c;
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		if ((c = isl_stream_getc(s)) == '=') {
-			tok->u.s = strdup(">=");
-			tok->type = ISL_TOKEN_GE;
-			return tok;
-		} else if (c == '>') {
-			if ((c = isl_stream_getc(s)) == '=') {
-				tok->u.s = strdup(">>=");
-				tok->type = ISL_TOKEN_LEX_GE;
-				return tok;
-			}
-			tok->u.s = strdup(">>");
-			tok->type = ISL_TOKEN_LEX_GT;
-		} else {
-			tok->u.s = strdup(">");
-			tok->type = ISL_TOKEN_GT;
-		}
-		if (c != -1)
-			isl_stream_ungetc(s, c);
-		return tok;
-	}
-	if (c == '<') {
-		int c;
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		if ((c = isl_stream_getc(s)) == '=') {
-			tok->u.s = strdup("<=");
-			tok->type = ISL_TOKEN_LE;
-			return tok;
-		} else if (c == '<') {
-			if ((c = isl_stream_getc(s)) == '=') {
-				tok->u.s = strdup("<<=");
-				tok->type = ISL_TOKEN_LEX_LE;
-				return tok;
-			}
-			tok->u.s = strdup("<<");
-			tok->type = ISL_TOKEN_LEX_LT;
-		} else {
-			tok->u.s = strdup("<");
-			tok->type = ISL_TOKEN_LT;
-		}
-		if (c != -1)
-			isl_stream_ungetc(s, c);
-		return tok;
-	}
-	if (c == '&') {
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		tok->type = ISL_TOKEN_AND;
-		if ((c = isl_stream_getc(s)) != '&' && c != -1) {
-			tok->u.s = strdup("&");
-			isl_stream_ungetc(s, c);
-		} else
-			tok->u.s = strdup("&&");
-		return tok;
-	}
-	if (c == '|') {
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		tok->type = ISL_TOKEN_OR;
-		if ((c = isl_stream_getc(s)) != '|' && c != -1) {
-			tok->u.s = strdup("|");
-			isl_stream_ungetc(s, c);
-		} else
-			tok->u.s = strdup("||");
-		return tok;
-	}
-	if (c == '/') {
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		if ((c = isl_stream_getc(s)) != '\\' && c != -1) {
-			tok->type = (enum isl_token_type) '/';
-			isl_stream_ungetc(s, c);
-		} else {
-			tok->u.s = strdup("/\\");
-			tok->type = ISL_TOKEN_AND;
-		}
-		return tok;
-	}
-	if (c == '\\') {
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		if ((c = isl_stream_getc(s)) != '/' && c != -1) {
-			tok->type = (enum isl_token_type) '\\';
-			isl_stream_ungetc(s, c);
-		} else {
-			tok->u.s = strdup("\\/");
-			tok->type = ISL_TOKEN_OR;
-		}
-		return tok;
-	}
-	if (c == '!') {
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		tok->type = ISL_TOKEN_NOT;
-		tok->u.s = strdup("!");
-		return tok;
-	}
-
-	tok = isl_token_new(s->ctx, line, col, old_line != line);
-	if (!tok)
-		return NULL;
-	tok->type = ISL_TOKEN_UNKNOWN;
-	return tok;
-error:
-	isl_token_free(tok);
-	return NULL;
-}
-
-struct isl_token *isl_stream_next_token(struct isl_stream *s)
-{
-	return next_token(s, 0);
-}
-
-struct isl_token *isl_stream_next_token_on_same_line(struct isl_stream *s)
-{
-	return next_token(s, 1);
-}
-
-int isl_stream_eat_if_available(struct isl_stream *s, int type)
-{
-	struct isl_token *tok;
-
-	tok = isl_stream_next_token(s);
-	if (!tok)
-		return 0;
-	if (tok->type == type) {
-		isl_token_free(tok);
-		return 1;
-	}
-	isl_stream_push_token(s, tok);
-	return 0;
-}
-
-int isl_stream_next_token_is(struct isl_stream *s, int type)
-{
-	struct isl_token *tok;
-	int r;
-
-	tok = isl_stream_next_token(s);
-	if (!tok)
-		return 0;
-	r = tok->type == type;
-	isl_stream_push_token(s, tok);
-	return r;
-}
-
-char *isl_stream_read_ident_if_available(struct isl_stream *s)
-{
-	struct isl_token *tok;
-
-	tok = isl_stream_next_token(s);
-	if (!tok)
-		return NULL;
-	if (tok->type == ISL_TOKEN_IDENT) {
-		char *ident = strdup(tok->u.s);
-		isl_token_free(tok);
-		return ident;
-	}
-	isl_stream_push_token(s, tok);
-	return NULL;
-}
-
-int isl_stream_eat(struct isl_stream *s, int type)
-{
-	struct isl_token *tok;
-
-	tok = isl_stream_next_token(s);
-	if (!tok)
-		return -1;
-	if (tok->type == type) {
-		isl_token_free(tok);
-		return 0;
-	}
-	isl_stream_error(s, tok, "expecting other token");
-	isl_stream_push_token(s, tok);
-	return -1;
-}
-
-int isl_stream_is_empty(struct isl_stream *s)
-{
-	struct isl_token *tok;
-
-	tok = isl_stream_next_token(s);
-
-	if (!tok)
-		return 1;
-
-	isl_stream_push_token(s, tok);
-	return 0;
-}
-
-static int free_keyword(void **p, void *user)
-{
-	struct isl_keyword *keyword = *p;
-
-	free(keyword->name);
-	free(keyword);
-
-	return 0;
-}
-
-void isl_stream_flush_tokens(struct isl_stream *s)
-{
-	int i;
-
-	if (!s)
-		return;
-	for (i = 0; i < s->n_token; ++i)
-		isl_token_free(s->tokens[i]);
-	s->n_token = 0;
-}
-
-void isl_stream_free(struct isl_stream *s)
-{
-	if (!s)
-		return;
-	free(s->buffer);
-	if (s->n_token != 0) {
-		struct isl_token *tok = isl_stream_next_token(s);
-		isl_stream_error(s, tok, "unexpected token");
-		isl_token_free(tok);
-	}
-	if (s->keywords) {
-		isl_hash_table_foreach(s->ctx, s->keywords, &free_keyword, NULL);
-		isl_hash_table_free(s->ctx, s->keywords);
-	}
-	isl_ctx_deref(s->ctx);
-	free(s);
-}
diff --git a/cloog-0.16.3/isl/isl_tab.c b/cloog-0.16.3/isl/isl_tab.c
deleted file mode 100644
index 5151ab6..0000000
--- a/cloog-0.16.3/isl/isl_tab.c
+++ /dev/null
@@ -1,3342 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl_mat_private.h>
-#include "isl_map_private.h"
-#include "isl_tab.h"
-#include <isl/seq.h>
-#include <isl_config.h>
-
-/*
- * The implementation of tableaus in this file was inspired by Section 8
- * of David Detlefs, Greg Nelson and James B. Saxe, "Simplify: a theorem
- * prover for program checking".
- */
-
-struct isl_tab *isl_tab_alloc(struct isl_ctx *ctx,
-	unsigned n_row, unsigned n_var, unsigned M)
-{
-	int i;
-	struct isl_tab *tab;
-	unsigned off = 2 + M;
-
-	tab = isl_calloc_type(ctx, struct isl_tab);
-	if (!tab)
-		return NULL;
-	tab->mat = isl_mat_alloc(ctx, n_row, off + n_var);
-	if (!tab->mat)
-		goto error;
-	tab->var = isl_alloc_array(ctx, struct isl_tab_var, n_var);
-	if (!tab->var)
-		goto error;
-	tab->con = isl_alloc_array(ctx, struct isl_tab_var, n_row);
-	if (!tab->con)
-		goto error;
-	tab->col_var = isl_alloc_array(ctx, int, n_var);
-	if (!tab->col_var)
-		goto error;
-	tab->row_var = isl_alloc_array(ctx, int, n_row);
-	if (!tab->row_var)
-		goto error;
-	for (i = 0; i < n_var; ++i) {
-		tab->var[i].index = i;
-		tab->var[i].is_row = 0;
-		tab->var[i].is_nonneg = 0;
-		tab->var[i].is_zero = 0;
-		tab->var[i].is_redundant = 0;
-		tab->var[i].frozen = 0;
-		tab->var[i].negated = 0;
-		tab->col_var[i] = i;
-	}
-	tab->n_row = 0;
-	tab->n_con = 0;
-	tab->n_eq = 0;
-	tab->max_con = n_row;
-	tab->n_col = n_var;
-	tab->n_var = n_var;
-	tab->max_var = n_var;
-	tab->n_param = 0;
-	tab->n_div = 0;
-	tab->n_dead = 0;
-	tab->n_redundant = 0;
-	tab->strict_redundant = 0;
-	tab->need_undo = 0;
-	tab->rational = 0;
-	tab->empty = 0;
-	tab->in_undo = 0;
-	tab->M = M;
-	tab->cone = 0;
-	tab->bottom.type = isl_tab_undo_bottom;
-	tab->bottom.next = NULL;
-	tab->top = &tab->bottom;
-
-	tab->n_zero = 0;
-	tab->n_unbounded = 0;
-	tab->basis = NULL;
-
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-int isl_tab_extend_cons(struct isl_tab *tab, unsigned n_new)
-{
-	unsigned off;
-
-	if (!tab)
-		return -1;
-
-	off = 2 + tab->M;
-
-	if (tab->max_con < tab->n_con + n_new) {
-		struct isl_tab_var *con;
-
-		con = isl_realloc_array(tab->mat->ctx, tab->con,
-				    struct isl_tab_var, tab->max_con + n_new);
-		if (!con)
-			return -1;
-		tab->con = con;
-		tab->max_con += n_new;
-	}
-	if (tab->mat->n_row < tab->n_row + n_new) {
-		int *row_var;
-
-		tab->mat = isl_mat_extend(tab->mat,
-					tab->n_row + n_new, off + tab->n_col);
-		if (!tab->mat)
-			return -1;
-		row_var = isl_realloc_array(tab->mat->ctx, tab->row_var,
-					    int, tab->mat->n_row);
-		if (!row_var)
-			return -1;
-		tab->row_var = row_var;
-		if (tab->row_sign) {
-			enum isl_tab_row_sign *s;
-			s = isl_realloc_array(tab->mat->ctx, tab->row_sign,
-					enum isl_tab_row_sign, tab->mat->n_row);
-			if (!s)
-				return -1;
-			tab->row_sign = s;
-		}
-	}
-	return 0;
-}
-
-/* Make room for at least n_new extra variables.
- * Return -1 if anything went wrong.
- */
-int isl_tab_extend_vars(struct isl_tab *tab, unsigned n_new)
-{
-	struct isl_tab_var *var;
-	unsigned off = 2 + tab->M;
-
-	if (tab->max_var < tab->n_var + n_new) {
-		var = isl_realloc_array(tab->mat->ctx, tab->var,
-				    struct isl_tab_var, tab->n_var + n_new);
-		if (!var)
-			return -1;
-		tab->var = var;
-		tab->max_var += n_new;
-	}
-
-	if (tab->mat->n_col < off + tab->n_col + n_new) {
-		int *p;
-
-		tab->mat = isl_mat_extend(tab->mat,
-				    tab->mat->n_row, off + tab->n_col + n_new);
-		if (!tab->mat)
-			return -1;
-		p = isl_realloc_array(tab->mat->ctx, tab->col_var,
-					    int, tab->n_col + n_new);
-		if (!p)
-			return -1;
-		tab->col_var = p;
-	}
-
-	return 0;
-}
-
-struct isl_tab *isl_tab_extend(struct isl_tab *tab, unsigned n_new)
-{
-	if (isl_tab_extend_cons(tab, n_new) >= 0)
-		return tab;
-
-	isl_tab_free(tab);
-	return NULL;
-}
-
-static void free_undo_record(struct isl_tab_undo *undo)
-{
-	switch (undo->type) {
-	case isl_tab_undo_saved_basis:
-		free(undo->u.col_var);
-		break;
-	default:;
-	}
-	free(undo);
-}
-
-static void free_undo(struct isl_tab *tab)
-{
-	struct isl_tab_undo *undo, *next;
-
-	for (undo = tab->top; undo && undo != &tab->bottom; undo = next) {
-		next = undo->next;
-		free_undo_record(undo);
-	}
-	tab->top = undo;
-}
-
-void isl_tab_free(struct isl_tab *tab)
-{
-	if (!tab)
-		return;
-	free_undo(tab);
-	isl_mat_free(tab->mat);
-	isl_vec_free(tab->dual);
-	isl_basic_map_free(tab->bmap);
-	free(tab->var);
-	free(tab->con);
-	free(tab->row_var);
-	free(tab->col_var);
-	free(tab->row_sign);
-	isl_mat_free(tab->samples);
-	free(tab->sample_index);
-	isl_mat_free(tab->basis);
-	free(tab);
-}
-
-struct isl_tab *isl_tab_dup(struct isl_tab *tab)
-{
-	int i;
-	struct isl_tab *dup;
-	unsigned off;
-
-	if (!tab)
-		return NULL;
-
-	off = 2 + tab->M;
-	dup = isl_calloc_type(tab->mat->ctx, struct isl_tab);
-	if (!dup)
-		return NULL;
-	dup->mat = isl_mat_dup(tab->mat);
-	if (!dup->mat)
-		goto error;
-	dup->var = isl_alloc_array(tab->mat->ctx, struct isl_tab_var, tab->max_var);
-	if (!dup->var)
-		goto error;
-	for (i = 0; i < tab->n_var; ++i)
-		dup->var[i] = tab->var[i];
-	dup->con = isl_alloc_array(tab->mat->ctx, struct isl_tab_var, tab->max_con);
-	if (!dup->con)
-		goto error;
-	for (i = 0; i < tab->n_con; ++i)
-		dup->con[i] = tab->con[i];
-	dup->col_var = isl_alloc_array(tab->mat->ctx, int, tab->mat->n_col - off);
-	if (!dup->col_var)
-		goto error;
-	for (i = 0; i < tab->n_col; ++i)
-		dup->col_var[i] = tab->col_var[i];
-	dup->row_var = isl_alloc_array(tab->mat->ctx, int, tab->mat->n_row);
-	if (!dup->row_var)
-		goto error;
-	for (i = 0; i < tab->n_row; ++i)
-		dup->row_var[i] = tab->row_var[i];
-	if (tab->row_sign) {
-		dup->row_sign = isl_alloc_array(tab->mat->ctx, enum isl_tab_row_sign,
-						tab->mat->n_row);
-		if (!dup->row_sign)
-			goto error;
-		for (i = 0; i < tab->n_row; ++i)
-			dup->row_sign[i] = tab->row_sign[i];
-	}
-	if (tab->samples) {
-		dup->samples = isl_mat_dup(tab->samples);
-		if (!dup->samples)
-			goto error;
-		dup->sample_index = isl_alloc_array(tab->mat->ctx, int,
-							tab->samples->n_row);
-		if (!dup->sample_index)
-			goto error;
-		dup->n_sample = tab->n_sample;
-		dup->n_outside = tab->n_outside;
-	}
-	dup->n_row = tab->n_row;
-	dup->n_con = tab->n_con;
-	dup->n_eq = tab->n_eq;
-	dup->max_con = tab->max_con;
-	dup->n_col = tab->n_col;
-	dup->n_var = tab->n_var;
-	dup->max_var = tab->max_var;
-	dup->n_param = tab->n_param;
-	dup->n_div = tab->n_div;
-	dup->n_dead = tab->n_dead;
-	dup->n_redundant = tab->n_redundant;
-	dup->rational = tab->rational;
-	dup->empty = tab->empty;
-	dup->strict_redundant = 0;
-	dup->need_undo = 0;
-	dup->in_undo = 0;
-	dup->M = tab->M;
-	tab->cone = tab->cone;
-	dup->bottom.type = isl_tab_undo_bottom;
-	dup->bottom.next = NULL;
-	dup->top = &dup->bottom;
-
-	dup->n_zero = tab->n_zero;
-	dup->n_unbounded = tab->n_unbounded;
-	dup->basis = isl_mat_dup(tab->basis);
-
-	return dup;
-error:
-	isl_tab_free(dup);
-	return NULL;
-}
-
-/* Construct the coefficient matrix of the product tableau
- * of two tableaus.
- * mat{1,2} is the coefficient matrix of tableau {1,2}
- * row{1,2} is the number of rows in tableau {1,2}
- * col{1,2} is the number of columns in tableau {1,2}
- * off is the offset to the coefficient column (skipping the
- *	denominator, the constant term and the big parameter if any)
- * r{1,2} is the number of redundant rows in tableau {1,2}
- * d{1,2} is the number of dead columns in tableau {1,2}
- *
- * The order of the rows and columns in the result is as explained
- * in isl_tab_product.
- */
-static struct isl_mat *tab_mat_product(struct isl_mat *mat1,
-	struct isl_mat *mat2, unsigned row1, unsigned row2,
-	unsigned col1, unsigned col2,
-	unsigned off, unsigned r1, unsigned r2, unsigned d1, unsigned d2)
-{
-	int i;
-	struct isl_mat *prod;
-	unsigned n;
-
-	prod = isl_mat_alloc(mat1->ctx, mat1->n_row + mat2->n_row,
-					off + col1 + col2);
-	if (!prod)
-		return NULL;
-
-	n = 0;
-	for (i = 0; i < r1; ++i) {
-		isl_seq_cpy(prod->row[n + i], mat1->row[i], off + d1);
-		isl_seq_clr(prod->row[n + i] + off + d1, d2);
-		isl_seq_cpy(prod->row[n + i] + off + d1 + d2,
-				mat1->row[i] + off + d1, col1 - d1);
-		isl_seq_clr(prod->row[n + i] + off + col1 + d1, col2 - d2);
-	}
-
-	n += r1;
-	for (i = 0; i < r2; ++i) {
-		isl_seq_cpy(prod->row[n + i], mat2->row[i], off);
-		isl_seq_clr(prod->row[n + i] + off, d1);
-		isl_seq_cpy(prod->row[n + i] + off + d1,
-			    mat2->row[i] + off, d2);
-		isl_seq_clr(prod->row[n + i] + off + d1 + d2, col1 - d1);
-		isl_seq_cpy(prod->row[n + i] + off + col1 + d1,
-			    mat2->row[i] + off + d2, col2 - d2);
-	}
-
-	n += r2;
-	for (i = 0; i < row1 - r1; ++i) {
-		isl_seq_cpy(prod->row[n + i], mat1->row[r1 + i], off + d1);
-		isl_seq_clr(prod->row[n + i] + off + d1, d2);
-		isl_seq_cpy(prod->row[n + i] + off + d1 + d2,
-				mat1->row[r1 + i] + off + d1, col1 - d1);
-		isl_seq_clr(prod->row[n + i] + off + col1 + d1, col2 - d2);
-	}
-
-	n += row1 - r1;
-	for (i = 0; i < row2 - r2; ++i) {
-		isl_seq_cpy(prod->row[n + i], mat2->row[r2 + i], off);
-		isl_seq_clr(prod->row[n + i] + off, d1);
-		isl_seq_cpy(prod->row[n + i] + off + d1,
-			    mat2->row[r2 + i] + off, d2);
-		isl_seq_clr(prod->row[n + i] + off + d1 + d2, col1 - d1);
-		isl_seq_cpy(prod->row[n + i] + off + col1 + d1,
-			    mat2->row[r2 + i] + off + d2, col2 - d2);
-	}
-
-	return prod;
-}
-
-/* Update the row or column index of a variable that corresponds
- * to a variable in the first input tableau.
- */
-static void update_index1(struct isl_tab_var *var,
-	unsigned r1, unsigned r2, unsigned d1, unsigned d2)
-{
-	if (var->index == -1)
-		return;
-	if (var->is_row && var->index >= r1)
-		var->index += r2;
-	if (!var->is_row && var->index >= d1)
-		var->index += d2;
-}
-
-/* Update the row or column index of a variable that corresponds
- * to a variable in the second input tableau.
- */
-static void update_index2(struct isl_tab_var *var,
-	unsigned row1, unsigned col1,
-	unsigned r1, unsigned r2, unsigned d1, unsigned d2)
-{
-	if (var->index == -1)
-		return;
-	if (var->is_row) {
-		if (var->index < r2)
-			var->index += r1;
-		else
-			var->index += row1;
-	} else {
-		if (var->index < d2)
-			var->index += d1;
-		else
-			var->index += col1;
-	}
-}
-
-/* Create a tableau that represents the Cartesian product of the sets
- * represented by tableaus tab1 and tab2.
- * The order of the rows in the product is
- *	- redundant rows of tab1
- *	- redundant rows of tab2
- *	- non-redundant rows of tab1
- *	- non-redundant rows of tab2
- * The order of the columns is
- *	- denominator
- *	- constant term
- *	- coefficient of big parameter, if any
- *	- dead columns of tab1
- *	- dead columns of tab2
- *	- live columns of tab1
- *	- live columns of tab2
- * The order of the variables and the constraints is a concatenation
- * of order in the two input tableaus.
- */
-struct isl_tab *isl_tab_product(struct isl_tab *tab1, struct isl_tab *tab2)
-{
-	int i;
-	struct isl_tab *prod;
-	unsigned off;
-	unsigned r1, r2, d1, d2;
-
-	if (!tab1 || !tab2)
-		return NULL;
-
-	isl_assert(tab1->mat->ctx, tab1->M == tab2->M, return NULL);
-	isl_assert(tab1->mat->ctx, tab1->rational == tab2->rational, return NULL);
-	isl_assert(tab1->mat->ctx, tab1->cone == tab2->cone, return NULL);
-	isl_assert(tab1->mat->ctx, !tab1->row_sign, return NULL);
-	isl_assert(tab1->mat->ctx, !tab2->row_sign, return NULL);
-	isl_assert(tab1->mat->ctx, tab1->n_param == 0, return NULL);
-	isl_assert(tab1->mat->ctx, tab2->n_param == 0, return NULL);
-	isl_assert(tab1->mat->ctx, tab1->n_div == 0, return NULL);
-	isl_assert(tab1->mat->ctx, tab2->n_div == 0, return NULL);
-
-	off = 2 + tab1->M;
-	r1 = tab1->n_redundant;
-	r2 = tab2->n_redundant;
-	d1 = tab1->n_dead;
-	d2 = tab2->n_dead;
-	prod = isl_calloc_type(tab1->mat->ctx, struct isl_tab);
-	if (!prod)
-		return NULL;
-	prod->mat = tab_mat_product(tab1->mat, tab2->mat,
-				tab1->n_row, tab2->n_row,
-				tab1->n_col, tab2->n_col, off, r1, r2, d1, d2);
-	if (!prod->mat)
-		goto error;
-	prod->var = isl_alloc_array(tab1->mat->ctx, struct isl_tab_var,
-					tab1->max_var + tab2->max_var);
-	if (!prod->var)
-		goto error;
-	for (i = 0; i < tab1->n_var; ++i) {
-		prod->var[i] = tab1->var[i];
-		update_index1(&prod->var[i], r1, r2, d1, d2);
-	}
-	for (i = 0; i < tab2->n_var; ++i) {
-		prod->var[tab1->n_var + i] = tab2->var[i];
-		update_index2(&prod->var[tab1->n_var + i],
-				tab1->n_row, tab1->n_col,
-				r1, r2, d1, d2);
-	}
-	prod->con = isl_alloc_array(tab1->mat->ctx, struct isl_tab_var,
-					tab1->max_con +  tab2->max_con);
-	if (!prod->con)
-		goto error;
-	for (i = 0; i < tab1->n_con; ++i) {
-		prod->con[i] = tab1->con[i];
-		update_index1(&prod->con[i], r1, r2, d1, d2);
-	}
-	for (i = 0; i < tab2->n_con; ++i) {
-		prod->con[tab1->n_con + i] = tab2->con[i];
-		update_index2(&prod->con[tab1->n_con + i],
-				tab1->n_row, tab1->n_col,
-				r1, r2, d1, d2);
-	}
-	prod->col_var = isl_alloc_array(tab1->mat->ctx, int,
-					tab1->n_col + tab2->n_col);
-	if (!prod->col_var)
-		goto error;
-	for (i = 0; i < tab1->n_col; ++i) {
-		int pos = i < d1 ? i : i + d2;
-		prod->col_var[pos] = tab1->col_var[i];
-	}
-	for (i = 0; i < tab2->n_col; ++i) {
-		int pos = i < d2 ? d1 + i : tab1->n_col + i;
-		int t = tab2->col_var[i];
-		if (t >= 0)
-			t += tab1->n_var;
-		else
-			t -= tab1->n_con;
-		prod->col_var[pos] = t;
-	}
-	prod->row_var = isl_alloc_array(tab1->mat->ctx, int,
-					tab1->mat->n_row + tab2->mat->n_row);
-	if (!prod->row_var)
-		goto error;
-	for (i = 0; i < tab1->n_row; ++i) {
-		int pos = i < r1 ? i : i + r2;
-		prod->row_var[pos] = tab1->row_var[i];
-	}
-	for (i = 0; i < tab2->n_row; ++i) {
-		int pos = i < r2 ? r1 + i : tab1->n_row + i;
-		int t = tab2->row_var[i];
-		if (t >= 0)
-			t += tab1->n_var;
-		else
-			t -= tab1->n_con;
-		prod->row_var[pos] = t;
-	}
-	prod->samples = NULL;
-	prod->sample_index = NULL;
-	prod->n_row = tab1->n_row + tab2->n_row;
-	prod->n_con = tab1->n_con + tab2->n_con;
-	prod->n_eq = 0;
-	prod->max_con = tab1->max_con + tab2->max_con;
-	prod->n_col = tab1->n_col + tab2->n_col;
-	prod->n_var = tab1->n_var + tab2->n_var;
-	prod->max_var = tab1->max_var + tab2->max_var;
-	prod->n_param = 0;
-	prod->n_div = 0;
-	prod->n_dead = tab1->n_dead + tab2->n_dead;
-	prod->n_redundant = tab1->n_redundant + tab2->n_redundant;
-	prod->rational = tab1->rational;
-	prod->empty = tab1->empty || tab2->empty;
-	prod->strict_redundant = tab1->strict_redundant || tab2->strict_redundant;
-	prod->need_undo = 0;
-	prod->in_undo = 0;
-	prod->M = tab1->M;
-	prod->cone = tab1->cone;
-	prod->bottom.type = isl_tab_undo_bottom;
-	prod->bottom.next = NULL;
-	prod->top = &prod->bottom;
-
-	prod->n_zero = 0;
-	prod->n_unbounded = 0;
-	prod->basis = NULL;
-
-	return prod;
-error:
-	isl_tab_free(prod);
-	return NULL;
-}
-
-static struct isl_tab_var *var_from_index(struct isl_tab *tab, int i)
-{
-	if (i >= 0)
-		return &tab->var[i];
-	else
-		return &tab->con[~i];
-}
-
-struct isl_tab_var *isl_tab_var_from_row(struct isl_tab *tab, int i)
-{
-	return var_from_index(tab, tab->row_var[i]);
-}
-
-static struct isl_tab_var *var_from_col(struct isl_tab *tab, int i)
-{
-	return var_from_index(tab, tab->col_var[i]);
-}
-
-/* Check if there are any upper bounds on column variable "var",
- * i.e., non-negative rows where var appears with a negative coefficient.
- * Return 1 if there are no such bounds.
- */
-static int max_is_manifestly_unbounded(struct isl_tab *tab,
-	struct isl_tab_var *var)
-{
-	int i;
-	unsigned off = 2 + tab->M;
-
-	if (var->is_row)
-		return 0;
-	for (i = tab->n_redundant; i < tab->n_row; ++i) {
-		if (!isl_int_is_neg(tab->mat->row[i][off + var->index]))
-			continue;
-		if (isl_tab_var_from_row(tab, i)->is_nonneg)
-			return 0;
-	}
-	return 1;
-}
-
-/* Check if there are any lower bounds on column variable "var",
- * i.e., non-negative rows where var appears with a positive coefficient.
- * Return 1 if there are no such bounds.
- */
-static int min_is_manifestly_unbounded(struct isl_tab *tab,
-	struct isl_tab_var *var)
-{
-	int i;
-	unsigned off = 2 + tab->M;
-
-	if (var->is_row)
-		return 0;
-	for (i = tab->n_redundant; i < tab->n_row; ++i) {
-		if (!isl_int_is_pos(tab->mat->row[i][off + var->index]))
-			continue;
-		if (isl_tab_var_from_row(tab, i)->is_nonneg)
-			return 0;
-	}
-	return 1;
-}
-
-static int row_cmp(struct isl_tab *tab, int r1, int r2, int c, isl_int t)
-{
-	unsigned off = 2 + tab->M;
-
-	if (tab->M) {
-		int s;
-		isl_int_mul(t, tab->mat->row[r1][2], tab->mat->row[r2][off+c]);
-		isl_int_submul(t, tab->mat->row[r2][2], tab->mat->row[r1][off+c]);
-		s = isl_int_sgn(t);
-		if (s)
-			return s;
-	}
-	isl_int_mul(t, tab->mat->row[r1][1], tab->mat->row[r2][off + c]);
-	isl_int_submul(t, tab->mat->row[r2][1], tab->mat->row[r1][off + c]);
-	return isl_int_sgn(t);
-}
-
-/* Given the index of a column "c", return the index of a row
- * that can be used to pivot the column in, with either an increase
- * (sgn > 0) or a decrease (sgn < 0) of the corresponding variable.
- * If "var" is not NULL, then the row returned will be different from
- * the one associated with "var".
- *
- * Each row in the tableau is of the form
- *
- *	x_r = a_r0 + \sum_i a_ri x_i
- *
- * Only rows with x_r >= 0 and with the sign of a_ri opposite to "sgn"
- * impose any limit on the increase or decrease in the value of x_c
- * and this bound is equal to a_r0 / |a_rc|.  We are therefore looking
- * for the row with the smallest (most stringent) such bound.
- * Note that the common denominator of each row drops out of the fraction.
- * To check if row j has a smaller bound than row r, i.e.,
- * a_j0 / |a_jc| < a_r0 / |a_rc| or a_j0 |a_rc| < a_r0 |a_jc|,
- * we check if -sign(a_jc) (a_j0 a_rc - a_r0 a_jc) < 0,
- * where -sign(a_jc) is equal to "sgn".
- */
-static int pivot_row(struct isl_tab *tab,
-	struct isl_tab_var *var, int sgn, int c)
-{
-	int j, r, tsgn;
-	isl_int t;
-	unsigned off = 2 + tab->M;
-
-	isl_int_init(t);
-	r = -1;
-	for (j = tab->n_redundant; j < tab->n_row; ++j) {
-		if (var && j == var->index)
-			continue;
-		if (!isl_tab_var_from_row(tab, j)->is_nonneg)
-			continue;
-		if (sgn * isl_int_sgn(tab->mat->row[j][off + c]) >= 0)
-			continue;
-		if (r < 0) {
-			r = j;
-			continue;
-		}
-		tsgn = sgn * row_cmp(tab, r, j, c, t);
-		if (tsgn < 0 || (tsgn == 0 &&
-					    tab->row_var[j] < tab->row_var[r]))
-			r = j;
-	}
-	isl_int_clear(t);
-	return r;
-}
-
-/* Find a pivot (row and col) that will increase (sgn > 0) or decrease
- * (sgn < 0) the value of row variable var.
- * If not NULL, then skip_var is a row variable that should be ignored
- * while looking for a pivot row.  It is usually equal to var.
- *
- * As the given row in the tableau is of the form
- *
- *	x_r = a_r0 + \sum_i a_ri x_i
- *
- * we need to find a column such that the sign of a_ri is equal to "sgn"
- * (such that an increase in x_i will have the desired effect) or a
- * column with a variable that may attain negative values.
- * If a_ri is positive, then we need to move x_i in the same direction
- * to obtain the desired effect.  Otherwise, x_i has to move in the
- * opposite direction.
- */
-static void find_pivot(struct isl_tab *tab,
-	struct isl_tab_var *var, struct isl_tab_var *skip_var,
-	int sgn, int *row, int *col)
-{
-	int j, r, c;
-	isl_int *tr;
-
-	*row = *col = -1;
-
-	isl_assert(tab->mat->ctx, var->is_row, return);
-	tr = tab->mat->row[var->index] + 2 + tab->M;
-
-	c = -1;
-	for (j = tab->n_dead; j < tab->n_col; ++j) {
-		if (isl_int_is_zero(tr[j]))
-			continue;
-		if (isl_int_sgn(tr[j]) != sgn &&
-		    var_from_col(tab, j)->is_nonneg)
-			continue;
-		if (c < 0 || tab->col_var[j] < tab->col_var[c])
-			c = j;
-	}
-	if (c < 0)
-		return;
-
-	sgn *= isl_int_sgn(tr[c]);
-	r = pivot_row(tab, skip_var, sgn, c);
-	*row = r < 0 ? var->index : r;
-	*col = c;
-}
-
-/* Return 1 if row "row" represents an obviously redundant inequality.
- * This means
- *	- it represents an inequality or a variable
- *	- that is the sum of a non-negative sample value and a positive
- *	  combination of zero or more non-negative constraints.
- */
-int isl_tab_row_is_redundant(struct isl_tab *tab, int row)
-{
-	int i;
-	unsigned off = 2 + tab->M;
-
-	if (tab->row_var[row] < 0 && !isl_tab_var_from_row(tab, row)->is_nonneg)
-		return 0;
-
-	if (isl_int_is_neg(tab->mat->row[row][1]))
-		return 0;
-	if (tab->strict_redundant && isl_int_is_zero(tab->mat->row[row][1]))
-		return 0;
-	if (tab->M && isl_int_is_neg(tab->mat->row[row][2]))
-		return 0;
-
-	for (i = tab->n_dead; i < tab->n_col; ++i) {
-		if (isl_int_is_zero(tab->mat->row[row][off + i]))
-			continue;
-		if (tab->col_var[i] >= 0)
-			return 0;
-		if (isl_int_is_neg(tab->mat->row[row][off + i]))
-			return 0;
-		if (!var_from_col(tab, i)->is_nonneg)
-			return 0;
-	}
-	return 1;
-}
-
-static void swap_rows(struct isl_tab *tab, int row1, int row2)
-{
-	int t;
-	enum isl_tab_row_sign s;
-
-	t = tab->row_var[row1];
-	tab->row_var[row1] = tab->row_var[row2];
-	tab->row_var[row2] = t;
-	isl_tab_var_from_row(tab, row1)->index = row1;
-	isl_tab_var_from_row(tab, row2)->index = row2;
-	tab->mat = isl_mat_swap_rows(tab->mat, row1, row2);
-
-	if (!tab->row_sign)
-		return;
-	s = tab->row_sign[row1];
-	tab->row_sign[row1] = tab->row_sign[row2];
-	tab->row_sign[row2] = s;
-}
-
-static int push_union(struct isl_tab *tab,
-	enum isl_tab_undo_type type, union isl_tab_undo_val u) WARN_UNUSED;
-static int push_union(struct isl_tab *tab,
-	enum isl_tab_undo_type type, union isl_tab_undo_val u)
-{
-	struct isl_tab_undo *undo;
-
-	if (!tab->need_undo)
-		return 0;
-
-	undo = isl_alloc_type(tab->mat->ctx, struct isl_tab_undo);
-	if (!undo)
-		return -1;
-	undo->type = type;
-	undo->u = u;
-	undo->next = tab->top;
-	tab->top = undo;
-
-	return 0;
-}
-
-int isl_tab_push_var(struct isl_tab *tab,
-	enum isl_tab_undo_type type, struct isl_tab_var *var)
-{
-	union isl_tab_undo_val u;
-	if (var->is_row)
-		u.var_index = tab->row_var[var->index];
-	else
-		u.var_index = tab->col_var[var->index];
-	return push_union(tab, type, u);
-}
-
-int isl_tab_push(struct isl_tab *tab, enum isl_tab_undo_type type)
-{
-	union isl_tab_undo_val u = { 0 };
-	return push_union(tab, type, u);
-}
-
-/* Push a record on the undo stack describing the current basic
- * variables, so that the this state can be restored during rollback.
- */
-int isl_tab_push_basis(struct isl_tab *tab)
-{
-	int i;
-	union isl_tab_undo_val u;
-
-	u.col_var = isl_alloc_array(tab->mat->ctx, int, tab->n_col);
-	if (!u.col_var)
-		return -1;
-	for (i = 0; i < tab->n_col; ++i)
-		u.col_var[i] = tab->col_var[i];
-	return push_union(tab, isl_tab_undo_saved_basis, u);
-}
-
-int isl_tab_push_callback(struct isl_tab *tab, struct isl_tab_callback *callback)
-{
-	union isl_tab_undo_val u;
-	u.callback = callback;
-	return push_union(tab, isl_tab_undo_callback, u);
-}
-
-struct isl_tab *isl_tab_init_samples(struct isl_tab *tab)
-{
-	if (!tab)
-		return NULL;
-
-	tab->n_sample = 0;
-	tab->n_outside = 0;
-	tab->samples = isl_mat_alloc(tab->mat->ctx, 1, 1 + tab->n_var);
-	if (!tab->samples)
-		goto error;
-	tab->sample_index = isl_alloc_array(tab->mat->ctx, int, 1);
-	if (!tab->sample_index)
-		goto error;
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-struct isl_tab *isl_tab_add_sample(struct isl_tab *tab,
-	__isl_take isl_vec *sample)
-{
-	if (!tab || !sample)
-		goto error;
-
-	if (tab->n_sample + 1 > tab->samples->n_row) {
-		int *t = isl_realloc_array(tab->mat->ctx,
-			    tab->sample_index, int, tab->n_sample + 1);
-		if (!t)
-			goto error;
-		tab->sample_index = t;
-	}
-
-	tab->samples = isl_mat_extend(tab->samples,
-				tab->n_sample + 1, tab->samples->n_col);
-	if (!tab->samples)
-		goto error;
-
-	isl_seq_cpy(tab->samples->row[tab->n_sample], sample->el, sample->size);
-	isl_vec_free(sample);
-	tab->sample_index[tab->n_sample] = tab->n_sample;
-	tab->n_sample++;
-
-	return tab;
-error:
-	isl_vec_free(sample);
-	isl_tab_free(tab);
-	return NULL;
-}
-
-struct isl_tab *isl_tab_drop_sample(struct isl_tab *tab, int s)
-{
-	if (s != tab->n_outside) {
-		int t = tab->sample_index[tab->n_outside];
-		tab->sample_index[tab->n_outside] = tab->sample_index[s];
-		tab->sample_index[s] = t;
-		isl_mat_swap_rows(tab->samples, tab->n_outside, s);
-	}
-	tab->n_outside++;
-	if (isl_tab_push(tab, isl_tab_undo_drop_sample) < 0) {
-		isl_tab_free(tab);
-		return NULL;
-	}
-
-	return tab;
-}
-
-/* Record the current number of samples so that we can remove newer
- * samples during a rollback.
- */
-int isl_tab_save_samples(struct isl_tab *tab)
-{
-	union isl_tab_undo_val u;
-
-	if (!tab)
-		return -1;
-
-	u.n = tab->n_sample;
-	return push_union(tab, isl_tab_undo_saved_samples, u);
-}
-
-/* Mark row with index "row" as being redundant.
- * If we may need to undo the operation or if the row represents
- * a variable of the original problem, the row is kept,
- * but no longer considered when looking for a pivot row.
- * Otherwise, the row is simply removed.
- *
- * The row may be interchanged with some other row.  If it
- * is interchanged with a later row, return 1.  Otherwise return 0.
- * If the rows are checked in order in the calling function,
- * then a return value of 1 means that the row with the given
- * row number may now contain a different row that hasn't been checked yet.
- */
-int isl_tab_mark_redundant(struct isl_tab *tab, int row)
-{
-	struct isl_tab_var *var = isl_tab_var_from_row(tab, row);
-	var->is_redundant = 1;
-	isl_assert(tab->mat->ctx, row >= tab->n_redundant, return -1);
-	if (tab->need_undo || tab->row_var[row] >= 0) {
-		if (tab->row_var[row] >= 0 && !var->is_nonneg) {
-			var->is_nonneg = 1;
-			if (isl_tab_push_var(tab, isl_tab_undo_nonneg, var) < 0)
-				return -1;
-		}
-		if (row != tab->n_redundant)
-			swap_rows(tab, row, tab->n_redundant);
-		tab->n_redundant++;
-		return isl_tab_push_var(tab, isl_tab_undo_redundant, var);
-	} else {
-		if (row != tab->n_row - 1)
-			swap_rows(tab, row, tab->n_row - 1);
-		isl_tab_var_from_row(tab, tab->n_row - 1)->index = -1;
-		tab->n_row--;
-		return 1;
-	}
-}
-
-int isl_tab_mark_empty(struct isl_tab *tab)
-{
-	if (!tab)
-		return -1;
-	if (!tab->empty && tab->need_undo)
-		if (isl_tab_push(tab, isl_tab_undo_empty) < 0)
-			return -1;
-	tab->empty = 1;
-	return 0;
-}
-
-int isl_tab_freeze_constraint(struct isl_tab *tab, int con)
-{
-	struct isl_tab_var *var;
-
-	if (!tab)
-		return -1;
-
-	var = &tab->con[con];
-	if (var->frozen)
-		return 0;
-	if (var->index < 0)
-		return 0;
-	var->frozen = 1;
-
-	if (tab->need_undo)
-		return isl_tab_push_var(tab, isl_tab_undo_freeze, var);
-
-	return 0;
-}
-
-/* Update the rows signs after a pivot of "row" and "col", with "row_sgn"
- * the original sign of the pivot element.
- * We only keep track of row signs during PILP solving and in this case
- * we only pivot a row with negative sign (meaning the value is always
- * non-positive) using a positive pivot element.
- *
- * For each row j, the new value of the parametric constant is equal to
- *
- *	a_j0 - a_jc a_r0/a_rc
- *
- * where a_j0 is the original parametric constant, a_rc is the pivot element,
- * a_r0 is the parametric constant of the pivot row and a_jc is the
- * pivot column entry of the row j.
- * Since a_r0 is non-positive and a_rc is positive, the sign of row j
- * remains the same if a_jc has the same sign as the row j or if
- * a_jc is zero.  In all other cases, we reset the sign to "unknown".
- */
-static void update_row_sign(struct isl_tab *tab, int row, int col, int row_sgn)
-{
-	int i;
-	struct isl_mat *mat = tab->mat;
-	unsigned off = 2 + tab->M;
-
-	if (!tab->row_sign)
-		return;
-
-	if (tab->row_sign[row] == 0)
-		return;
-	isl_assert(mat->ctx, row_sgn > 0, return);
-	isl_assert(mat->ctx, tab->row_sign[row] == isl_tab_row_neg, return);
-	tab->row_sign[row] = isl_tab_row_pos;
-	for (i = 0; i < tab->n_row; ++i) {
-		int s;
-		if (i == row)
-			continue;
-		s = isl_int_sgn(mat->row[i][off + col]);
-		if (!s)
-			continue;
-		if (!tab->row_sign[i])
-			continue;
-		if (s < 0 && tab->row_sign[i] == isl_tab_row_neg)
-			continue;
-		if (s > 0 && tab->row_sign[i] == isl_tab_row_pos)
-			continue;
-		tab->row_sign[i] = isl_tab_row_unknown;
-	}
-}
-
-/* Given a row number "row" and a column number "col", pivot the tableau
- * such that the associated variables are interchanged.
- * The given row in the tableau expresses
- *
- *	x_r = a_r0 + \sum_i a_ri x_i
- *
- * or
- *
- *	x_c = 1/a_rc x_r - a_r0/a_rc + sum_{i \ne r} -a_ri/a_rc
- *
- * Substituting this equality into the other rows
- *
- *	x_j = a_j0 + \sum_i a_ji x_i
- *
- * with a_jc \ne 0, we obtain
- *
- *	x_j = a_jc/a_rc x_r + a_j0 - a_jc a_r0/a_rc + sum a_ji - a_jc a_ri/a_rc 
- *
- * The tableau
- *
- *	n_rc/d_r		n_ri/d_r
- *	n_jc/d_j		n_ji/d_j
- *
- * where i is any other column and j is any other row,
- * is therefore transformed into
- *
- * s(n_rc)d_r/|n_rc|		-s(n_rc)n_ri/|n_rc|
- * s(n_rc)d_r n_jc/(|n_rc| d_j)	(n_ji |n_rc| - s(n_rc)n_jc n_ri)/(|n_rc| d_j)
- *
- * The transformation is performed along the following steps
- *
- *	d_r/n_rc		n_ri/n_rc
- *	n_jc/d_j		n_ji/d_j
- *
- *	s(n_rc)d_r/|n_rc|	-s(n_rc)n_ri/|n_rc|
- *	n_jc/d_j		n_ji/d_j
- *
- *	s(n_rc)d_r/|n_rc|	-s(n_rc)n_ri/|n_rc|
- *	n_jc/(|n_rc| d_j)	n_ji/(|n_rc| d_j)
- *
- *	s(n_rc)d_r/|n_rc|	-s(n_rc)n_ri/|n_rc|
- *	n_jc/(|n_rc| d_j)	(n_ji |n_rc|)/(|n_rc| d_j)
- *
- *	s(n_rc)d_r/|n_rc|	-s(n_rc)n_ri/|n_rc|
- *	n_jc/(|n_rc| d_j)	(n_ji |n_rc| - s(n_rc)n_jc n_ri)/(|n_rc| d_j)
- *
- * s(n_rc)d_r/|n_rc|		-s(n_rc)n_ri/|n_rc|
- * s(n_rc)d_r n_jc/(|n_rc| d_j)	(n_ji |n_rc| - s(n_rc)n_jc n_ri)/(|n_rc| d_j)
- *
- */
-int isl_tab_pivot(struct isl_tab *tab, int row, int col)
-{
-	int i, j;
-	int sgn;
-	int t;
-	struct isl_mat *mat = tab->mat;
-	struct isl_tab_var *var;
-	unsigned off = 2 + tab->M;
-
-	if (tab->mat->ctx->abort) {
-		isl_ctx_set_error(tab->mat->ctx, isl_error_abort);
-		return -1;
-	}
-
-	isl_int_swap(mat->row[row][0], mat->row[row][off + col]);
-	sgn = isl_int_sgn(mat->row[row][0]);
-	if (sgn < 0) {
-		isl_int_neg(mat->row[row][0], mat->row[row][0]);
-		isl_int_neg(mat->row[row][off + col], mat->row[row][off + col]);
-	} else
-		for (j = 0; j < off - 1 + tab->n_col; ++j) {
-			if (j == off - 1 + col)
-				continue;
-			isl_int_neg(mat->row[row][1 + j], mat->row[row][1 + j]);
-		}
-	if (!isl_int_is_one(mat->row[row][0]))
-		isl_seq_normalize(mat->ctx, mat->row[row], off + tab->n_col);
-	for (i = 0; i < tab->n_row; ++i) {
-		if (i == row)
-			continue;
-		if (isl_int_is_zero(mat->row[i][off + col]))
-			continue;
-		isl_int_mul(mat->row[i][0], mat->row[i][0], mat->row[row][0]);
-		for (j = 0; j < off - 1 + tab->n_col; ++j) {
-			if (j == off - 1 + col)
-				continue;
-			isl_int_mul(mat->row[i][1 + j],
-				    mat->row[i][1 + j], mat->row[row][0]);
-			isl_int_addmul(mat->row[i][1 + j],
-				    mat->row[i][off + col], mat->row[row][1 + j]);
-		}
-		isl_int_mul(mat->row[i][off + col],
-			    mat->row[i][off + col], mat->row[row][off + col]);
-		if (!isl_int_is_one(mat->row[i][0]))
-			isl_seq_normalize(mat->ctx, mat->row[i], off + tab->n_col);
-	}
-	t = tab->row_var[row];
-	tab->row_var[row] = tab->col_var[col];
-	tab->col_var[col] = t;
-	var = isl_tab_var_from_row(tab, row);
-	var->is_row = 1;
-	var->index = row;
-	var = var_from_col(tab, col);
-	var->is_row = 0;
-	var->index = col;
-	update_row_sign(tab, row, col, sgn);
-	if (tab->in_undo)
-		return 0;
-	for (i = tab->n_redundant; i < tab->n_row; ++i) {
-		if (isl_int_is_zero(mat->row[i][off + col]))
-			continue;
-		if (!isl_tab_var_from_row(tab, i)->frozen &&
-		    isl_tab_row_is_redundant(tab, i)) {
-			int redo = isl_tab_mark_redundant(tab, i);
-			if (redo < 0)
-				return -1;
-			if (redo)
-				--i;
-		}
-	}
-	return 0;
-}
-
-/* If "var" represents a column variable, then pivot is up (sgn > 0)
- * or down (sgn < 0) to a row.  The variable is assumed not to be
- * unbounded in the specified direction.
- * If sgn = 0, then the variable is unbounded in both directions,
- * and we pivot with any row we can find.
- */
-static int to_row(struct isl_tab *tab, struct isl_tab_var *var, int sign) WARN_UNUSED;
-static int to_row(struct isl_tab *tab, struct isl_tab_var *var, int sign)
-{
-	int r;
-	unsigned off = 2 + tab->M;
-
-	if (var->is_row)
-		return 0;
-
-	if (sign == 0) {
-		for (r = tab->n_redundant; r < tab->n_row; ++r)
-			if (!isl_int_is_zero(tab->mat->row[r][off+var->index]))
-				break;
-		isl_assert(tab->mat->ctx, r < tab->n_row, return -1);
-	} else {
-		r = pivot_row(tab, NULL, sign, var->index);
-		isl_assert(tab->mat->ctx, r >= 0, return -1);
-	}
-
-	return isl_tab_pivot(tab, r, var->index);
-}
-
-/* Check whether all variables that are marked as non-negative
- * also have a non-negative sample value.  This function is not
- * called from the current code but is useful during debugging.
- */
-static void check_table(struct isl_tab *tab) __attribute__ ((unused));
-static void check_table(struct isl_tab *tab)
-{
-	int i;
-
-	if (tab->empty)
-		return;
-	for (i = tab->n_redundant; i < tab->n_row; ++i) {
-		struct isl_tab_var *var;
-		var = isl_tab_var_from_row(tab, i);
-		if (!var->is_nonneg)
-			continue;
-		if (tab->M) {
-			isl_assert(tab->mat->ctx,
-				!isl_int_is_neg(tab->mat->row[i][2]), abort());
-			if (isl_int_is_pos(tab->mat->row[i][2]))
-				continue;
-		}
-		isl_assert(tab->mat->ctx, !isl_int_is_neg(tab->mat->row[i][1]),
-				abort());
-	}
-}
-
-/* Return the sign of the maximal value of "var".
- * If the sign is not negative, then on return from this function,
- * the sample value will also be non-negative.
- *
- * If "var" is manifestly unbounded wrt positive values, we are done.
- * Otherwise, we pivot the variable up to a row if needed
- * Then we continue pivoting down until either
- *	- no more down pivots can be performed
- *	- the sample value is positive
- *	- the variable is pivoted into a manifestly unbounded column
- */
-static int sign_of_max(struct isl_tab *tab, struct isl_tab_var *var)
-{
-	int row, col;
-
-	if (max_is_manifestly_unbounded(tab, var))
-		return 1;
-	if (to_row(tab, var, 1) < 0)
-		return -2;
-	while (!isl_int_is_pos(tab->mat->row[var->index][1])) {
-		find_pivot(tab, var, var, 1, &row, &col);
-		if (row == -1)
-			return isl_int_sgn(tab->mat->row[var->index][1]);
-		if (isl_tab_pivot(tab, row, col) < 0)
-			return -2;
-		if (!var->is_row) /* manifestly unbounded */
-			return 1;
-	}
-	return 1;
-}
-
-int isl_tab_sign_of_max(struct isl_tab *tab, int con)
-{
-	struct isl_tab_var *var;
-
-	if (!tab)
-		return -2;
-
-	var = &tab->con[con];
-	isl_assert(tab->mat->ctx, !var->is_redundant, return -2);
-	isl_assert(tab->mat->ctx, !var->is_zero, return -2);
-
-	return sign_of_max(tab, var);
-}
-
-static int row_is_neg(struct isl_tab *tab, int row)
-{
-	if (!tab->M)
-		return isl_int_is_neg(tab->mat->row[row][1]);
-	if (isl_int_is_pos(tab->mat->row[row][2]))
-		return 0;
-	if (isl_int_is_neg(tab->mat->row[row][2]))
-		return 1;
-	return isl_int_is_neg(tab->mat->row[row][1]);
-}
-
-static int row_sgn(struct isl_tab *tab, int row)
-{
-	if (!tab->M)
-		return isl_int_sgn(tab->mat->row[row][1]);
-	if (!isl_int_is_zero(tab->mat->row[row][2]))
-		return isl_int_sgn(tab->mat->row[row][2]);
-	else
-		return isl_int_sgn(tab->mat->row[row][1]);
-}
-
-/* Perform pivots until the row variable "var" has a non-negative
- * sample value or until no more upward pivots can be performed.
- * Return the sign of the sample value after the pivots have been
- * performed.
- */
-static int restore_row(struct isl_tab *tab, struct isl_tab_var *var)
-{
-	int row, col;
-
-	while (row_is_neg(tab, var->index)) {
-		find_pivot(tab, var, var, 1, &row, &col);
-		if (row == -1)
-			break;
-		if (isl_tab_pivot(tab, row, col) < 0)
-			return -2;
-		if (!var->is_row) /* manifestly unbounded */
-			return 1;
-	}
-	return row_sgn(tab, var->index);
-}
-
-/* Perform pivots until we are sure that the row variable "var"
- * can attain non-negative values.  After return from this
- * function, "var" is still a row variable, but its sample
- * value may not be non-negative, even if the function returns 1.
- */
-static int at_least_zero(struct isl_tab *tab, struct isl_tab_var *var)
-{
-	int row, col;
-
-	while (isl_int_is_neg(tab->mat->row[var->index][1])) {
-		find_pivot(tab, var, var, 1, &row, &col);
-		if (row == -1)
-			break;
-		if (row == var->index) /* manifestly unbounded */
-			return 1;
-		if (isl_tab_pivot(tab, row, col) < 0)
-			return -1;
-	}
-	return !isl_int_is_neg(tab->mat->row[var->index][1]);
-}
-
-/* Return a negative value if "var" can attain negative values.
- * Return a non-negative value otherwise.
- *
- * If "var" is manifestly unbounded wrt negative values, we are done.
- * Otherwise, if var is in a column, we can pivot it down to a row.
- * Then we continue pivoting down until either
- *	- the pivot would result in a manifestly unbounded column
- *	  => we don't perform the pivot, but simply return -1
- *	- no more down pivots can be performed
- *	- the sample value is negative
- * If the sample value becomes negative and the variable is supposed
- * to be nonnegative, then we undo the last pivot.
- * However, if the last pivot has made the pivoting variable
- * obviously redundant, then it may have moved to another row.
- * In that case we look for upward pivots until we reach a non-negative
- * value again.
- */
-static int sign_of_min(struct isl_tab *tab, struct isl_tab_var *var)
-{
-	int row, col;
-	struct isl_tab_var *pivot_var = NULL;
-
-	if (min_is_manifestly_unbounded(tab, var))
-		return -1;
-	if (!var->is_row) {
-		col = var->index;
-		row = pivot_row(tab, NULL, -1, col);
-		pivot_var = var_from_col(tab, col);
-		if (isl_tab_pivot(tab, row, col) < 0)
-			return -2;
-		if (var->is_redundant)
-			return 0;
-		if (isl_int_is_neg(tab->mat->row[var->index][1])) {
-			if (var->is_nonneg) {
-				if (!pivot_var->is_redundant &&
-				    pivot_var->index == row) {
-					if (isl_tab_pivot(tab, row, col) < 0)
-						return -2;
-				} else
-					if (restore_row(tab, var) < -1)
-						return -2;
-			}
-			return -1;
-		}
-	}
-	if (var->is_redundant)
-		return 0;
-	while (!isl_int_is_neg(tab->mat->row[var->index][1])) {
-		find_pivot(tab, var, var, -1, &row, &col);
-		if (row == var->index)
-			return -1;
-		if (row == -1)
-			return isl_int_sgn(tab->mat->row[var->index][1]);
-		pivot_var = var_from_col(tab, col);
-		if (isl_tab_pivot(tab, row, col) < 0)
-			return -2;
-		if (var->is_redundant)
-			return 0;
-	}
-	if (pivot_var && var->is_nonneg) {
-		/* pivot back to non-negative value */
-		if (!pivot_var->is_redundant && pivot_var->index == row) {
-			if (isl_tab_pivot(tab, row, col) < 0)
-				return -2;
-		} else
-			if (restore_row(tab, var) < -1)
-				return -2;
-	}
-	return -1;
-}
-
-static int row_at_most_neg_one(struct isl_tab *tab, int row)
-{
-	if (tab->M) {
-		if (isl_int_is_pos(tab->mat->row[row][2]))
-			return 0;
-		if (isl_int_is_neg(tab->mat->row[row][2]))
-			return 1;
-	}
-	return isl_int_is_neg(tab->mat->row[row][1]) &&
-	       isl_int_abs_ge(tab->mat->row[row][1],
-			      tab->mat->row[row][0]);
-}
-
-/* Return 1 if "var" can attain values <= -1.
- * Return 0 otherwise.
- *
- * The sample value of "var" is assumed to be non-negative when the
- * the function is called.  If 1 is returned then the constraint
- * is not redundant and the sample value is made non-negative again before
- * the function returns.
- */
-int isl_tab_min_at_most_neg_one(struct isl_tab *tab, struct isl_tab_var *var)
-{
-	int row, col;
-	struct isl_tab_var *pivot_var;
-
-	if (min_is_manifestly_unbounded(tab, var))
-		return 1;
-	if (!var->is_row) {
-		col = var->index;
-		row = pivot_row(tab, NULL, -1, col);
-		pivot_var = var_from_col(tab, col);
-		if (isl_tab_pivot(tab, row, col) < 0)
-			return -1;
-		if (var->is_redundant)
-			return 0;
-		if (row_at_most_neg_one(tab, var->index)) {
-			if (var->is_nonneg) {
-				if (!pivot_var->is_redundant &&
-				    pivot_var->index == row) {
-					if (isl_tab_pivot(tab, row, col) < 0)
-						return -1;
-				} else
-					if (restore_row(tab, var) < -1)
-						return -1;
-			}
-			return 1;
-		}
-	}
-	if (var->is_redundant)
-		return 0;
-	do {
-		find_pivot(tab, var, var, -1, &row, &col);
-		if (row == var->index) {
-			if (restore_row(tab, var) < -1)
-				return -1;
-			return 1;
-		}
-		if (row == -1)
-			return 0;
-		pivot_var = var_from_col(tab, col);
-		if (isl_tab_pivot(tab, row, col) < 0)
-			return -1;
-		if (var->is_redundant)
-			return 0;
-	} while (!row_at_most_neg_one(tab, var->index));
-	if (var->is_nonneg) {
-		/* pivot back to non-negative value */
-		if (!pivot_var->is_redundant && pivot_var->index == row)
-			if (isl_tab_pivot(tab, row, col) < 0)
-				return -1;
-		if (restore_row(tab, var) < -1)
-			return -1;
-	}
-	return 1;
-}
-
-/* Return 1 if "var" can attain values >= 1.
- * Return 0 otherwise.
- */
-static int at_least_one(struct isl_tab *tab, struct isl_tab_var *var)
-{
-	int row, col;
-	isl_int *r;
-
-	if (max_is_manifestly_unbounded(tab, var))
-		return 1;
-	if (to_row(tab, var, 1) < 0)
-		return -1;
-	r = tab->mat->row[var->index];
-	while (isl_int_lt(r[1], r[0])) {
-		find_pivot(tab, var, var, 1, &row, &col);
-		if (row == -1)
-			return isl_int_ge(r[1], r[0]);
-		if (row == var->index) /* manifestly unbounded */
-			return 1;
-		if (isl_tab_pivot(tab, row, col) < 0)
-			return -1;
-	}
-	return 1;
-}
-
-static void swap_cols(struct isl_tab *tab, int col1, int col2)
-{
-	int t;
-	unsigned off = 2 + tab->M;
-	t = tab->col_var[col1];
-	tab->col_var[col1] = tab->col_var[col2];
-	tab->col_var[col2] = t;
-	var_from_col(tab, col1)->index = col1;
-	var_from_col(tab, col2)->index = col2;
-	tab->mat = isl_mat_swap_cols(tab->mat, off + col1, off + col2);
-}
-
-/* Mark column with index "col" as representing a zero variable.
- * If we may need to undo the operation the column is kept,
- * but no longer considered.
- * Otherwise, the column is simply removed.
- *
- * The column may be interchanged with some other column.  If it
- * is interchanged with a later column, return 1.  Otherwise return 0.
- * If the columns are checked in order in the calling function,
- * then a return value of 1 means that the column with the given
- * column number may now contain a different column that
- * hasn't been checked yet.
- */
-int isl_tab_kill_col(struct isl_tab *tab, int col)
-{
-	var_from_col(tab, col)->is_zero = 1;
-	if (tab->need_undo) {
-		if (isl_tab_push_var(tab, isl_tab_undo_zero,
-					    var_from_col(tab, col)) < 0)
-			return -1;
-		if (col != tab->n_dead)
-			swap_cols(tab, col, tab->n_dead);
-		tab->n_dead++;
-		return 0;
-	} else {
-		if (col != tab->n_col - 1)
-			swap_cols(tab, col, tab->n_col - 1);
-		var_from_col(tab, tab->n_col - 1)->index = -1;
-		tab->n_col--;
-		return 1;
-	}
-}
-
-static int row_is_manifestly_non_integral(struct isl_tab *tab, int row)
-{
-	unsigned off = 2 + tab->M;
-
-	if (tab->M && !isl_int_eq(tab->mat->row[row][2],
-				  tab->mat->row[row][0]))
-		return 0;
-	if (isl_seq_first_non_zero(tab->mat->row[row] + off + tab->n_dead,
-				    tab->n_col - tab->n_dead) != -1)
-		return 0;
-
-	return !isl_int_is_divisible_by(tab->mat->row[row][1],
-					tab->mat->row[row][0]);
-}
-
-/* For integer tableaus, check if any of the coordinates are stuck
- * at a non-integral value.
- */
-static int tab_is_manifestly_empty(struct isl_tab *tab)
-{
-	int i;
-
-	if (tab->empty)
-		return 1;
-	if (tab->rational)
-		return 0;
-
-	for (i = 0; i < tab->n_var; ++i) {
-		if (!tab->var[i].is_row)
-			continue;
-		if (row_is_manifestly_non_integral(tab, tab->var[i].index))
-			return 1;
-	}
-
-	return 0;
-}
-
-/* Row variable "var" is non-negative and cannot attain any values
- * larger than zero.  This means that the coefficients of the unrestricted
- * column variables are zero and that the coefficients of the non-negative
- * column variables are zero or negative.
- * Each of the non-negative variables with a negative coefficient can
- * then also be written as the negative sum of non-negative variables
- * and must therefore also be zero.
- */
-static int close_row(struct isl_tab *tab, struct isl_tab_var *var) WARN_UNUSED;
-static int close_row(struct isl_tab *tab, struct isl_tab_var *var)
-{
-	int j;
-	struct isl_mat *mat = tab->mat;
-	unsigned off = 2 + tab->M;
-
-	isl_assert(tab->mat->ctx, var->is_nonneg, return -1);
-	var->is_zero = 1;
-	if (tab->need_undo)
-		if (isl_tab_push_var(tab, isl_tab_undo_zero, var) < 0)
-			return -1;
-	for (j = tab->n_dead; j < tab->n_col; ++j) {
-		int recheck;
-		if (isl_int_is_zero(mat->row[var->index][off + j]))
-			continue;
-		isl_assert(tab->mat->ctx,
-		    isl_int_is_neg(mat->row[var->index][off + j]), return -1);
-		recheck = isl_tab_kill_col(tab, j);
-		if (recheck < 0)
-			return -1;
-		if (recheck)
-			--j;
-	}
-	if (isl_tab_mark_redundant(tab, var->index) < 0)
-		return -1;
-	if (tab_is_manifestly_empty(tab) && isl_tab_mark_empty(tab) < 0)
-		return -1;
-	return 0;
-}
-
-/* Add a constraint to the tableau and allocate a row for it.
- * Return the index into the constraint array "con".
- */
-int isl_tab_allocate_con(struct isl_tab *tab)
-{
-	int r;
-
-	isl_assert(tab->mat->ctx, tab->n_row < tab->mat->n_row, return -1);
-	isl_assert(tab->mat->ctx, tab->n_con < tab->max_con, return -1);
-
-	r = tab->n_con;
-	tab->con[r].index = tab->n_row;
-	tab->con[r].is_row = 1;
-	tab->con[r].is_nonneg = 0;
-	tab->con[r].is_zero = 0;
-	tab->con[r].is_redundant = 0;
-	tab->con[r].frozen = 0;
-	tab->con[r].negated = 0;
-	tab->row_var[tab->n_row] = ~r;
-
-	tab->n_row++;
-	tab->n_con++;
-	if (isl_tab_push_var(tab, isl_tab_undo_allocate, &tab->con[r]) < 0)
-		return -1;
-
-	return r;
-}
-
-/* Add a variable to the tableau and allocate a column for it.
- * Return the index into the variable array "var".
- */
-int isl_tab_allocate_var(struct isl_tab *tab)
-{
-	int r;
-	int i;
-	unsigned off = 2 + tab->M;
-
-	isl_assert(tab->mat->ctx, tab->n_col < tab->mat->n_col, return -1);
-	isl_assert(tab->mat->ctx, tab->n_var < tab->max_var, return -1);
-
-	r = tab->n_var;
-	tab->var[r].index = tab->n_col;
-	tab->var[r].is_row = 0;
-	tab->var[r].is_nonneg = 0;
-	tab->var[r].is_zero = 0;
-	tab->var[r].is_redundant = 0;
-	tab->var[r].frozen = 0;
-	tab->var[r].negated = 0;
-	tab->col_var[tab->n_col] = r;
-
-	for (i = 0; i < tab->n_row; ++i)
-		isl_int_set_si(tab->mat->row[i][off + tab->n_col], 0);
-
-	tab->n_var++;
-	tab->n_col++;
-	if (isl_tab_push_var(tab, isl_tab_undo_allocate, &tab->var[r]) < 0)
-		return -1;
-
-	return r;
-}
-
-/* Add a row to the tableau.  The row is given as an affine combination
- * of the original variables and needs to be expressed in terms of the
- * column variables.
- *
- * We add each term in turn.
- * If r = n/d_r is the current sum and we need to add k x, then
- * 	if x is a column variable, we increase the numerator of
- *		this column by k d_r
- *	if x = f/d_x is a row variable, then the new representation of r is
- *
- *		 n    k f   d_x/g n + d_r/g k f   m/d_r n + m/d_g k f
- *		--- + --- = ------------------- = -------------------
- *		d_r   d_r        d_r d_x/g                m
- *
- *	with g the gcd of d_r and d_x and m the lcm of d_r and d_x.
- *
- * If tab->M is set, then, internally, each variable x is represented
- * as x' - M.  We then also need no subtract k d_r from the coefficient of M.
- */
-int isl_tab_add_row(struct isl_tab *tab, isl_int *line)
-{
-	int i;
-	int r;
-	isl_int *row;
-	isl_int a, b;
-	unsigned off = 2 + tab->M;
-
-	r = isl_tab_allocate_con(tab);
-	if (r < 0)
-		return -1;
-
-	isl_int_init(a);
-	isl_int_init(b);
-	row = tab->mat->row[tab->con[r].index];
-	isl_int_set_si(row[0], 1);
-	isl_int_set(row[1], line[0]);
-	isl_seq_clr(row + 2, tab->M + tab->n_col);
-	for (i = 0; i < tab->n_var; ++i) {
-		if (tab->var[i].is_zero)
-			continue;
-		if (tab->var[i].is_row) {
-			isl_int_lcm(a,
-				row[0], tab->mat->row[tab->var[i].index][0]);
-			isl_int_swap(a, row[0]);
-			isl_int_divexact(a, row[0], a);
-			isl_int_divexact(b,
-				row[0], tab->mat->row[tab->var[i].index][0]);
-			isl_int_mul(b, b, line[1 + i]);
-			isl_seq_combine(row + 1, a, row + 1,
-			    b, tab->mat->row[tab->var[i].index] + 1,
-			    1 + tab->M + tab->n_col);
-		} else
-			isl_int_addmul(row[off + tab->var[i].index],
-							line[1 + i], row[0]);
-		if (tab->M && i >= tab->n_param && i < tab->n_var - tab->n_div)
-			isl_int_submul(row[2], line[1 + i], row[0]);
-	}
-	isl_seq_normalize(tab->mat->ctx, row, off + tab->n_col);
-	isl_int_clear(a);
-	isl_int_clear(b);
-
-	if (tab->row_sign)
-		tab->row_sign[tab->con[r].index] = isl_tab_row_unknown;
-
-	return r;
-}
-
-static int drop_row(struct isl_tab *tab, int row)
-{
-	isl_assert(tab->mat->ctx, ~tab->row_var[row] == tab->n_con - 1, return -1);
-	if (row != tab->n_row - 1)
-		swap_rows(tab, row, tab->n_row - 1);
-	tab->n_row--;
-	tab->n_con--;
-	return 0;
-}
-
-static int drop_col(struct isl_tab *tab, int col)
-{
-	isl_assert(tab->mat->ctx, tab->col_var[col] == tab->n_var - 1, return -1);
-	if (col != tab->n_col - 1)
-		swap_cols(tab, col, tab->n_col - 1);
-	tab->n_col--;
-	tab->n_var--;
-	return 0;
-}
-
-/* Add inequality "ineq" and check if it conflicts with the
- * previously added constraints or if it is obviously redundant.
- */
-int isl_tab_add_ineq(struct isl_tab *tab, isl_int *ineq)
-{
-	int r;
-	int sgn;
-	isl_int cst;
-
-	if (!tab)
-		return -1;
-	if (tab->bmap) {
-		struct isl_basic_map *bmap = tab->bmap;
-
-		isl_assert(tab->mat->ctx, tab->n_eq == bmap->n_eq, return -1);
-		isl_assert(tab->mat->ctx,
-			    tab->n_con == bmap->n_eq + bmap->n_ineq, return -1);
-		tab->bmap = isl_basic_map_add_ineq(tab->bmap, ineq);
-		if (isl_tab_push(tab, isl_tab_undo_bmap_ineq) < 0)
-			return -1;
-		if (!tab->bmap)
-			return -1;
-	}
-	if (tab->cone) {
-		isl_int_init(cst);
-		isl_int_swap(ineq[0], cst);
-	}
-	r = isl_tab_add_row(tab, ineq);
-	if (tab->cone) {
-		isl_int_swap(ineq[0], cst);
-		isl_int_clear(cst);
-	}
-	if (r < 0)
-		return -1;
-	tab->con[r].is_nonneg = 1;
-	if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r]) < 0)
-		return -1;
-	if (isl_tab_row_is_redundant(tab, tab->con[r].index)) {
-		if (isl_tab_mark_redundant(tab, tab->con[r].index) < 0)
-			return -1;
-		return 0;
-	}
-
-	sgn = restore_row(tab, &tab->con[r]);
-	if (sgn < -1)
-		return -1;
-	if (sgn < 0)
-		return isl_tab_mark_empty(tab);
-	if (tab->con[r].is_row && isl_tab_row_is_redundant(tab, tab->con[r].index))
-		if (isl_tab_mark_redundant(tab, tab->con[r].index) < 0)
-			return -1;
-	return 0;
-}
-
-/* Pivot a non-negative variable down until it reaches the value zero
- * and then pivot the variable into a column position.
- */
-static int to_col(struct isl_tab *tab, struct isl_tab_var *var) WARN_UNUSED;
-static int to_col(struct isl_tab *tab, struct isl_tab_var *var)
-{
-	int i;
-	int row, col;
-	unsigned off = 2 + tab->M;
-
-	if (!var->is_row)
-		return 0;
-
-	while (isl_int_is_pos(tab->mat->row[var->index][1])) {
-		find_pivot(tab, var, NULL, -1, &row, &col);
-		isl_assert(tab->mat->ctx, row != -1, return -1);
-		if (isl_tab_pivot(tab, row, col) < 0)
-			return -1;
-		if (!var->is_row)
-			return 0;
-	}
-
-	for (i = tab->n_dead; i < tab->n_col; ++i)
-		if (!isl_int_is_zero(tab->mat->row[var->index][off + i]))
-			break;
-
-	isl_assert(tab->mat->ctx, i < tab->n_col, return -1);
-	if (isl_tab_pivot(tab, var->index, i) < 0)
-		return -1;
-
-	return 0;
-}
-
-/* We assume Gaussian elimination has been performed on the equalities.
- * The equalities can therefore never conflict.
- * Adding the equalities is currently only really useful for a later call
- * to isl_tab_ineq_type.
- */
-static struct isl_tab *add_eq(struct isl_tab *tab, isl_int *eq)
-{
-	int i;
-	int r;
-
-	if (!tab)
-		return NULL;
-	r = isl_tab_add_row(tab, eq);
-	if (r < 0)
-		goto error;
-
-	r = tab->con[r].index;
-	i = isl_seq_first_non_zero(tab->mat->row[r] + 2 + tab->M + tab->n_dead,
-					tab->n_col - tab->n_dead);
-	isl_assert(tab->mat->ctx, i >= 0, goto error);
-	i += tab->n_dead;
-	if (isl_tab_pivot(tab, r, i) < 0)
-		goto error;
-	if (isl_tab_kill_col(tab, i) < 0)
-		goto error;
-	tab->n_eq++;
-
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-static int row_is_manifestly_zero(struct isl_tab *tab, int row)
-{
-	unsigned off = 2 + tab->M;
-
-	if (!isl_int_is_zero(tab->mat->row[row][1]))
-		return 0;
-	if (tab->M && !isl_int_is_zero(tab->mat->row[row][2]))
-		return 0;
-	return isl_seq_first_non_zero(tab->mat->row[row] + off + tab->n_dead,
-					tab->n_col - tab->n_dead) == -1;
-}
-
-/* Add an equality that is known to be valid for the given tableau.
- */
-int isl_tab_add_valid_eq(struct isl_tab *tab, isl_int *eq)
-{
-	struct isl_tab_var *var;
-	int r;
-
-	if (!tab)
-		return -1;
-	r = isl_tab_add_row(tab, eq);
-	if (r < 0)
-		return -1;
-
-	var = &tab->con[r];
-	r = var->index;
-	if (row_is_manifestly_zero(tab, r)) {
-		var->is_zero = 1;
-		if (isl_tab_mark_redundant(tab, r) < 0)
-			return -1;
-		return 0;
-	}
-
-	if (isl_int_is_neg(tab->mat->row[r][1])) {
-		isl_seq_neg(tab->mat->row[r] + 1, tab->mat->row[r] + 1,
-			    1 + tab->n_col);
-		var->negated = 1;
-	}
-	var->is_nonneg = 1;
-	if (to_col(tab, var) < 0)
-		return -1;
-	var->is_nonneg = 0;
-	if (isl_tab_kill_col(tab, var->index) < 0)
-		return -1;
-
-	return 0;
-}
-
-static int add_zero_row(struct isl_tab *tab)
-{
-	int r;
-	isl_int *row;
-
-	r = isl_tab_allocate_con(tab);
-	if (r < 0)
-		return -1;
-
-	row = tab->mat->row[tab->con[r].index];
-	isl_seq_clr(row + 1, 1 + tab->M + tab->n_col);
-	isl_int_set_si(row[0], 1);
-
-	return r;
-}
-
-/* Add equality "eq" and check if it conflicts with the
- * previously added constraints or if it is obviously redundant.
- */
-int isl_tab_add_eq(struct isl_tab *tab, isl_int *eq)
-{
-	struct isl_tab_undo *snap = NULL;
-	struct isl_tab_var *var;
-	int r;
-	int row;
-	int sgn;
-	isl_int cst;
-
-	if (!tab)
-		return -1;
-	isl_assert(tab->mat->ctx, !tab->M, return -1);
-
-	if (tab->need_undo)
-		snap = isl_tab_snap(tab);
-
-	if (tab->cone) {
-		isl_int_init(cst);
-		isl_int_swap(eq[0], cst);
-	}
-	r = isl_tab_add_row(tab, eq);
-	if (tab->cone) {
-		isl_int_swap(eq[0], cst);
-		isl_int_clear(cst);
-	}
-	if (r < 0)
-		return -1;
-
-	var = &tab->con[r];
-	row = var->index;
-	if (row_is_manifestly_zero(tab, row)) {
-		if (snap) {
-			if (isl_tab_rollback(tab, snap) < 0)
-				return -1;
-		} else
-			drop_row(tab, row);
-		return 0;
-	}
-
-	if (tab->bmap) {
-		tab->bmap = isl_basic_map_add_ineq(tab->bmap, eq);
-		if (isl_tab_push(tab, isl_tab_undo_bmap_ineq) < 0)
-			return -1;
-		isl_seq_neg(eq, eq, 1 + tab->n_var);
-		tab->bmap = isl_basic_map_add_ineq(tab->bmap, eq);
-		isl_seq_neg(eq, eq, 1 + tab->n_var);
-		if (isl_tab_push(tab, isl_tab_undo_bmap_ineq) < 0)
-			return -1;
-		if (!tab->bmap)
-			return -1;
-		if (add_zero_row(tab) < 0)
-			return -1;
-	}
-
-	sgn = isl_int_sgn(tab->mat->row[row][1]);
-
-	if (sgn > 0) {
-		isl_seq_neg(tab->mat->row[row] + 1, tab->mat->row[row] + 1,
-			    1 + tab->n_col);
-		var->negated = 1;
-		sgn = -1;
-	}
-
-	if (sgn < 0) {
-		sgn = sign_of_max(tab, var);
-		if (sgn < -1)
-			return -1;
-		if (sgn < 0) {
-			if (isl_tab_mark_empty(tab) < 0)
-				return -1;
-			return 0;
-		}
-	}
-
-	var->is_nonneg = 1;
-	if (to_col(tab, var) < 0)
-		return -1;
-	var->is_nonneg = 0;
-	if (isl_tab_kill_col(tab, var->index) < 0)
-		return -1;
-
-	return 0;
-}
-
-/* Construct and return an inequality that expresses an upper bound
- * on the given div.
- * In particular, if the div is given by
- *
- *	d = floor(e/m)
- *
- * then the inequality expresses
- *
- *	m d <= e
- */
-static struct isl_vec *ineq_for_div(struct isl_basic_map *bmap, unsigned div)
-{
-	unsigned total;
-	unsigned div_pos;
-	struct isl_vec *ineq;
-
-	if (!bmap)
-		return NULL;
-
-	total = isl_basic_map_total_dim(bmap);
-	div_pos = 1 + total - bmap->n_div + div;
-
-	ineq = isl_vec_alloc(bmap->ctx, 1 + total);
-	if (!ineq)
-		return NULL;
-
-	isl_seq_cpy(ineq->el, bmap->div[div] + 1, 1 + total);
-	isl_int_neg(ineq->el[div_pos], bmap->div[div][0]);
-	return ineq;
-}
-
-/* For a div d = floor(f/m), add the constraints
- *
- *		f - m d >= 0
- *		-(f-(m-1)) + m d >= 0
- *
- * Note that the second constraint is the negation of
- *
- *		f - m d >= m
- *
- * If add_ineq is not NULL, then this function is used
- * instead of isl_tab_add_ineq to effectively add the inequalities.
- */
-static int add_div_constraints(struct isl_tab *tab, unsigned div,
-	int (*add_ineq)(void *user, isl_int *), void *user)
-{
-	unsigned total;
-	unsigned div_pos;
-	struct isl_vec *ineq;
-
-	total = isl_basic_map_total_dim(tab->bmap);
-	div_pos = 1 + total - tab->bmap->n_div + div;
-
-	ineq = ineq_for_div(tab->bmap, div);
-	if (!ineq)
-		goto error;
-
-	if (add_ineq) {
-		if (add_ineq(user, ineq->el) < 0)
-			goto error;
-	} else {
-		if (isl_tab_add_ineq(tab, ineq->el) < 0)
-			goto error;
-	}
-
-	isl_seq_neg(ineq->el, tab->bmap->div[div] + 1, 1 + total);
-	isl_int_set(ineq->el[div_pos], tab->bmap->div[div][0]);
-	isl_int_add(ineq->el[0], ineq->el[0], ineq->el[div_pos]);
-	isl_int_sub_ui(ineq->el[0], ineq->el[0], 1);
-
-	if (add_ineq) {
-		if (add_ineq(user, ineq->el) < 0)
-			goto error;
-	} else {
-		if (isl_tab_add_ineq(tab, ineq->el) < 0)
-			goto error;
-	}
-
-	isl_vec_free(ineq);
-
-	return 0;
-error:
-	isl_vec_free(ineq);
-	return -1;
-}
-
-/* Check whether the div described by "div" is obviously non-negative.
- * If we are using a big parameter, then we will encode the div
- * as div' = M + div, which is always non-negative.
- * Otherwise, we check whether div is a non-negative affine combination
- * of non-negative variables.
- */
-static int div_is_nonneg(struct isl_tab *tab, __isl_keep isl_vec *div)
-{
-	int i;
-
-	if (tab->M)
-		return 1;
-
-	if (isl_int_is_neg(div->el[1]))
-		return 0;
-
-	for (i = 0; i < tab->n_var; ++i) {
-		if (isl_int_is_neg(div->el[2 + i]))
-			return 0;
-		if (isl_int_is_zero(div->el[2 + i]))
-			continue;
-		if (!tab->var[i].is_nonneg)
-			return 0;
-	}
-
-	return 1;
-}
-
-/* Add an extra div, prescribed by "div" to the tableau and
- * the associated bmap (which is assumed to be non-NULL).
- *
- * If add_ineq is not NULL, then this function is used instead
- * of isl_tab_add_ineq to add the div constraints.
- * This complication is needed because the code in isl_tab_pip
- * wants to perform some extra processing when an inequality
- * is added to the tableau.
- */
-int isl_tab_add_div(struct isl_tab *tab, __isl_keep isl_vec *div,
-	int (*add_ineq)(void *user, isl_int *), void *user)
-{
-	int r;
-	int k;
-	int nonneg;
-
-	if (!tab || !div)
-		return -1;
-
-	isl_assert(tab->mat->ctx, tab->bmap, return -1);
-
-	nonneg = div_is_nonneg(tab, div);
-
-	if (isl_tab_extend_cons(tab, 3) < 0)
-		return -1;
-	if (isl_tab_extend_vars(tab, 1) < 0)
-		return -1;
-	r = isl_tab_allocate_var(tab);
-	if (r < 0)
-		return -1;
-
-	if (nonneg)
-		tab->var[r].is_nonneg = 1;
-
-	tab->bmap = isl_basic_map_extend_dim(tab->bmap,
-		isl_basic_map_get_dim(tab->bmap), 1, 0, 2);
-	k = isl_basic_map_alloc_div(tab->bmap);
-	if (k < 0)
-		return -1;
-	isl_seq_cpy(tab->bmap->div[k], div->el, div->size);
-	if (isl_tab_push(tab, isl_tab_undo_bmap_div) < 0)
-		return -1;
-
-	if (add_div_constraints(tab, k, add_ineq, user) < 0)
-		return -1;
-
-	return r;
-}
-
-struct isl_tab *isl_tab_from_basic_map(struct isl_basic_map *bmap)
-{
-	int i;
-	struct isl_tab *tab;
-
-	if (!bmap)
-		return NULL;
-	tab = isl_tab_alloc(bmap->ctx,
-			    isl_basic_map_total_dim(bmap) + bmap->n_ineq + 1,
-			    isl_basic_map_total_dim(bmap), 0);
-	if (!tab)
-		return NULL;
-	tab->rational = ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL);
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY)) {
-		if (isl_tab_mark_empty(tab) < 0)
-			goto error;
-		return tab;
-	}
-	for (i = 0; i < bmap->n_eq; ++i) {
-		tab = add_eq(tab, bmap->eq[i]);
-		if (!tab)
-			return tab;
-	}
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		if (isl_tab_add_ineq(tab, bmap->ineq[i]) < 0)
-			goto error;
-		if (tab->empty)
-			return tab;
-	}
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-struct isl_tab *isl_tab_from_basic_set(struct isl_basic_set *bset)
-{
-	return isl_tab_from_basic_map((struct isl_basic_map *)bset);
-}
-
-/* Construct a tableau corresponding to the recession cone of "bset".
- */
-struct isl_tab *isl_tab_from_recession_cone(__isl_keep isl_basic_set *bset,
-	int parametric)
-{
-	isl_int cst;
-	int i;
-	struct isl_tab *tab;
-	unsigned offset = 0;
-
-	if (!bset)
-		return NULL;
-	if (parametric)
-		offset = isl_basic_set_dim(bset, isl_dim_param);
-	tab = isl_tab_alloc(bset->ctx, bset->n_eq + bset->n_ineq,
-				isl_basic_set_total_dim(bset) - offset, 0);
-	if (!tab)
-		return NULL;
-	tab->rational = ISL_F_ISSET(bset, ISL_BASIC_SET_RATIONAL);
-	tab->cone = 1;
-
-	isl_int_init(cst);
-	for (i = 0; i < bset->n_eq; ++i) {
-		isl_int_swap(bset->eq[i][offset], cst);
-		if (offset > 0) {
-			if (isl_tab_add_eq(tab, bset->eq[i] + offset) < 0)
-				goto error;
-		} else
-			tab = add_eq(tab, bset->eq[i]);
-		isl_int_swap(bset->eq[i][offset], cst);
-		if (!tab)
-			goto done;
-	}
-	for (i = 0; i < bset->n_ineq; ++i) {
-		int r;
-		isl_int_swap(bset->ineq[i][offset], cst);
-		r = isl_tab_add_row(tab, bset->ineq[i] + offset);
-		isl_int_swap(bset->ineq[i][offset], cst);
-		if (r < 0)
-			goto error;
-		tab->con[r].is_nonneg = 1;
-		if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r]) < 0)
-			goto error;
-	}
-done:
-	isl_int_clear(cst);
-	return tab;
-error:
-	isl_int_clear(cst);
-	isl_tab_free(tab);
-	return NULL;
-}
-
-/* Assuming "tab" is the tableau of a cone, check if the cone is
- * bounded, i.e., if it is empty or only contains the origin.
- */
-int isl_tab_cone_is_bounded(struct isl_tab *tab)
-{
-	int i;
-
-	if (!tab)
-		return -1;
-	if (tab->empty)
-		return 1;
-	if (tab->n_dead == tab->n_col)
-		return 1;
-
-	for (;;) {
-		for (i = tab->n_redundant; i < tab->n_row; ++i) {
-			struct isl_tab_var *var;
-			int sgn;
-			var = isl_tab_var_from_row(tab, i);
-			if (!var->is_nonneg)
-				continue;
-			sgn = sign_of_max(tab, var);
-			if (sgn < -1)
-				return -1;
-			if (sgn != 0)
-				return 0;
-			if (close_row(tab, var) < 0)
-				return -1;
-			break;
-		}
-		if (tab->n_dead == tab->n_col)
-			return 1;
-		if (i == tab->n_row)
-			return 0;
-	}
-}
-
-int isl_tab_sample_is_integer(struct isl_tab *tab)
-{
-	int i;
-
-	if (!tab)
-		return -1;
-
-	for (i = 0; i < tab->n_var; ++i) {
-		int row;
-		if (!tab->var[i].is_row)
-			continue;
-		row = tab->var[i].index;
-		if (!isl_int_is_divisible_by(tab->mat->row[row][1],
-						tab->mat->row[row][0]))
-			return 0;
-	}
-	return 1;
-}
-
-static struct isl_vec *extract_integer_sample(struct isl_tab *tab)
-{
-	int i;
-	struct isl_vec *vec;
-
-	vec = isl_vec_alloc(tab->mat->ctx, 1 + tab->n_var);
-	if (!vec)
-		return NULL;
-
-	isl_int_set_si(vec->block.data[0], 1);
-	for (i = 0; i < tab->n_var; ++i) {
-		if (!tab->var[i].is_row)
-			isl_int_set_si(vec->block.data[1 + i], 0);
-		else {
-			int row = tab->var[i].index;
-			isl_int_divexact(vec->block.data[1 + i],
-				tab->mat->row[row][1], tab->mat->row[row][0]);
-		}
-	}
-
-	return vec;
-}
-
-struct isl_vec *isl_tab_get_sample_value(struct isl_tab *tab)
-{
-	int i;
-	struct isl_vec *vec;
-	isl_int m;
-
-	if (!tab)
-		return NULL;
-
-	vec = isl_vec_alloc(tab->mat->ctx, 1 + tab->n_var);
-	if (!vec)
-		return NULL;
-
-	isl_int_init(m);
-
-	isl_int_set_si(vec->block.data[0], 1);
-	for (i = 0; i < tab->n_var; ++i) {
-		int row;
-		if (!tab->var[i].is_row) {
-			isl_int_set_si(vec->block.data[1 + i], 0);
-			continue;
-		}
-		row = tab->var[i].index;
-		isl_int_gcd(m, vec->block.data[0], tab->mat->row[row][0]);
-		isl_int_divexact(m, tab->mat->row[row][0], m);
-		isl_seq_scale(vec->block.data, vec->block.data, m, 1 + i);
-		isl_int_divexact(m, vec->block.data[0], tab->mat->row[row][0]);
-		isl_int_mul(vec->block.data[1 + i], m, tab->mat->row[row][1]);
-	}
-	vec = isl_vec_normalize(vec);
-
-	isl_int_clear(m);
-	return vec;
-}
-
-/* Update "bmap" based on the results of the tableau "tab".
- * In particular, implicit equalities are made explicit, redundant constraints
- * are removed and if the sample value happens to be integer, it is stored
- * in "bmap" (unless "bmap" already had an integer sample).
- *
- * The tableau is assumed to have been created from "bmap" using
- * isl_tab_from_basic_map.
- */
-struct isl_basic_map *isl_basic_map_update_from_tab(struct isl_basic_map *bmap,
-	struct isl_tab *tab)
-{
-	int i;
-	unsigned n_eq;
-
-	if (!bmap)
-		return NULL;
-	if (!tab)
-		return bmap;
-
-	n_eq = tab->n_eq;
-	if (tab->empty)
-		bmap = isl_basic_map_set_to_empty(bmap);
-	else
-		for (i = bmap->n_ineq - 1; i >= 0; --i) {
-			if (isl_tab_is_equality(tab, n_eq + i))
-				isl_basic_map_inequality_to_equality(bmap, i);
-			else if (isl_tab_is_redundant(tab, n_eq + i))
-				isl_basic_map_drop_inequality(bmap, i);
-		}
-	if (bmap->n_eq != n_eq)
-		isl_basic_map_gauss(bmap, NULL);
-	if (!tab->rational &&
-	    !bmap->sample && isl_tab_sample_is_integer(tab))
-		bmap->sample = extract_integer_sample(tab);
-	return bmap;
-}
-
-struct isl_basic_set *isl_basic_set_update_from_tab(struct isl_basic_set *bset,
-	struct isl_tab *tab)
-{
-	return (struct isl_basic_set *)isl_basic_map_update_from_tab(
-		(struct isl_basic_map *)bset, tab);
-}
-
-/* Given a non-negative variable "var", add a new non-negative variable
- * that is the opposite of "var", ensuring that var can only attain the
- * value zero.
- * If var = n/d is a row variable, then the new variable = -n/d.
- * If var is a column variables, then the new variable = -var.
- * If the new variable cannot attain non-negative values, then
- * the resulting tableau is empty.
- * Otherwise, we know the value will be zero and we close the row.
- */
-static int cut_to_hyperplane(struct isl_tab *tab, struct isl_tab_var *var)
-{
-	unsigned r;
-	isl_int *row;
-	int sgn;
-	unsigned off = 2 + tab->M;
-
-	if (var->is_zero)
-		return 0;
-	isl_assert(tab->mat->ctx, !var->is_redundant, return -1);
-	isl_assert(tab->mat->ctx, var->is_nonneg, return -1);
-
-	if (isl_tab_extend_cons(tab, 1) < 0)
-		return -1;
-
-	r = tab->n_con;
-	tab->con[r].index = tab->n_row;
-	tab->con[r].is_row = 1;
-	tab->con[r].is_nonneg = 0;
-	tab->con[r].is_zero = 0;
-	tab->con[r].is_redundant = 0;
-	tab->con[r].frozen = 0;
-	tab->con[r].negated = 0;
-	tab->row_var[tab->n_row] = ~r;
-	row = tab->mat->row[tab->n_row];
-
-	if (var->is_row) {
-		isl_int_set(row[0], tab->mat->row[var->index][0]);
-		isl_seq_neg(row + 1,
-			    tab->mat->row[var->index] + 1, 1 + tab->n_col);
-	} else {
-		isl_int_set_si(row[0], 1);
-		isl_seq_clr(row + 1, 1 + tab->n_col);
-		isl_int_set_si(row[off + var->index], -1);
-	}
-
-	tab->n_row++;
-	tab->n_con++;
-	if (isl_tab_push_var(tab, isl_tab_undo_allocate, &tab->con[r]) < 0)
-		return -1;
-
-	sgn = sign_of_max(tab, &tab->con[r]);
-	if (sgn < -1)
-		return -1;
-	if (sgn < 0) {
-		if (isl_tab_mark_empty(tab) < 0)
-			return -1;
-		return 0;
-	}
-	tab->con[r].is_nonneg = 1;
-	if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r]) < 0)
-		return -1;
-	/* sgn == 0 */
-	if (close_row(tab, &tab->con[r]) < 0)
-		return -1;
-
-	return 0;
-}
-
-/* Given a tableau "tab" and an inequality constraint "con" of the tableau,
- * relax the inequality by one.  That is, the inequality r >= 0 is replaced
- * by r' = r + 1 >= 0.
- * If r is a row variable, we simply increase the constant term by one
- * (taking into account the denominator).
- * If r is a column variable, then we need to modify each row that
- * refers to r = r' - 1 by substituting this equality, effectively
- * subtracting the coefficient of the column from the constant.
- * We should only do this if the minimum is manifestly unbounded,
- * however.  Otherwise, we may end up with negative sample values
- * for non-negative variables.
- * So, if r is a column variable with a minimum that is not
- * manifestly unbounded, then we need to move it to a row.
- * However, the sample value of this row may be negative,
- * even after the relaxation, so we need to restore it.
- * We therefore prefer to pivot a column up to a row, if possible.
- */
-struct isl_tab *isl_tab_relax(struct isl_tab *tab, int con)
-{
-	struct isl_tab_var *var;
-	unsigned off = 2 + tab->M;
-
-	if (!tab)
-		return NULL;
-
-	var = &tab->con[con];
-
-	if (!var->is_row && !max_is_manifestly_unbounded(tab, var))
-		if (to_row(tab, var, 1) < 0)
-			goto error;
-	if (!var->is_row && !min_is_manifestly_unbounded(tab, var))
-		if (to_row(tab, var, -1) < 0)
-			goto error;
-
-	if (var->is_row) {
-		isl_int_add(tab->mat->row[var->index][1],
-		    tab->mat->row[var->index][1], tab->mat->row[var->index][0]);
-		if (restore_row(tab, var) < 0)
-			goto error;
-	} else {
-		int i;
-
-		for (i = 0; i < tab->n_row; ++i) {
-			if (isl_int_is_zero(tab->mat->row[i][off + var->index]))
-				continue;
-			isl_int_sub(tab->mat->row[i][1], tab->mat->row[i][1],
-			    tab->mat->row[i][off + var->index]);
-		}
-
-	}
-
-	if (isl_tab_push_var(tab, isl_tab_undo_relax, var) < 0)
-		goto error;
-
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-int isl_tab_select_facet(struct isl_tab *tab, int con)
-{
-	if (!tab)
-		return -1;
-
-	return cut_to_hyperplane(tab, &tab->con[con]);
-}
-
-static int may_be_equality(struct isl_tab *tab, int row)
-{
-	return tab->rational ? isl_int_is_zero(tab->mat->row[row][1])
-			     : isl_int_lt(tab->mat->row[row][1],
-					    tab->mat->row[row][0]);
-}
-
-/* Check for (near) equalities among the constraints.
- * A constraint is an equality if it is non-negative and if
- * its maximal value is either
- *	- zero (in case of rational tableaus), or
- *	- strictly less than 1 (in case of integer tableaus)
- *
- * We first mark all non-redundant and non-dead variables that
- * are not frozen and not obviously not an equality.
- * Then we iterate over all marked variables if they can attain
- * any values larger than zero or at least one.
- * If the maximal value is zero, we mark any column variables
- * that appear in the row as being zero and mark the row as being redundant.
- * Otherwise, if the maximal value is strictly less than one (and the
- * tableau is integer), then we restrict the value to being zero
- * by adding an opposite non-negative variable.
- */
-int isl_tab_detect_implicit_equalities(struct isl_tab *tab)
-{
-	int i;
-	unsigned n_marked;
-
-	if (!tab)
-		return -1;
-	if (tab->empty)
-		return 0;
-	if (tab->n_dead == tab->n_col)
-		return 0;
-
-	n_marked = 0;
-	for (i = tab->n_redundant; i < tab->n_row; ++i) {
-		struct isl_tab_var *var = isl_tab_var_from_row(tab, i);
-		var->marked = !var->frozen && var->is_nonneg &&
-			may_be_equality(tab, i);
-		if (var->marked)
-			n_marked++;
-	}
-	for (i = tab->n_dead; i < tab->n_col; ++i) {
-		struct isl_tab_var *var = var_from_col(tab, i);
-		var->marked = !var->frozen && var->is_nonneg;
-		if (var->marked)
-			n_marked++;
-	}
-	while (n_marked) {
-		struct isl_tab_var *var;
-		int sgn;
-		for (i = tab->n_redundant; i < tab->n_row; ++i) {
-			var = isl_tab_var_from_row(tab, i);
-			if (var->marked)
-				break;
-		}
-		if (i == tab->n_row) {
-			for (i = tab->n_dead; i < tab->n_col; ++i) {
-				var = var_from_col(tab, i);
-				if (var->marked)
-					break;
-			}
-			if (i == tab->n_col)
-				break;
-		}
-		var->marked = 0;
-		n_marked--;
-		sgn = sign_of_max(tab, var);
-		if (sgn < 0)
-			return -1;
-		if (sgn == 0) {
-			if (close_row(tab, var) < 0)
-				return -1;
-		} else if (!tab->rational && !at_least_one(tab, var)) {
-			if (cut_to_hyperplane(tab, var) < 0)
-				return -1;
-			return isl_tab_detect_implicit_equalities(tab);
-		}
-		for (i = tab->n_redundant; i < tab->n_row; ++i) {
-			var = isl_tab_var_from_row(tab, i);
-			if (!var->marked)
-				continue;
-			if (may_be_equality(tab, i))
-				continue;
-			var->marked = 0;
-			n_marked--;
-		}
-	}
-
-	return 0;
-}
-
-static int con_is_redundant(struct isl_tab *tab, struct isl_tab_var *var)
-{
-	if (!tab)
-		return -1;
-	if (tab->rational) {
-		int sgn = sign_of_min(tab, var);
-		if (sgn < -1)
-			return -1;
-		return sgn >= 0;
-	} else {
-		int irred = isl_tab_min_at_most_neg_one(tab, var);
-		if (irred < 0)
-			return -1;
-		return !irred;
-	}
-}
-
-/* Check for (near) redundant constraints.
- * A constraint is redundant if it is non-negative and if
- * its minimal value (temporarily ignoring the non-negativity) is either
- *	- zero (in case of rational tableaus), or
- *	- strictly larger than -1 (in case of integer tableaus)
- *
- * We first mark all non-redundant and non-dead variables that
- * are not frozen and not obviously negatively unbounded.
- * Then we iterate over all marked variables if they can attain
- * any values smaller than zero or at most negative one.
- * If not, we mark the row as being redundant (assuming it hasn't
- * been detected as being obviously redundant in the mean time).
- */
-int isl_tab_detect_redundant(struct isl_tab *tab)
-{
-	int i;
-	unsigned n_marked;
-
-	if (!tab)
-		return -1;
-	if (tab->empty)
-		return 0;
-	if (tab->n_redundant == tab->n_row)
-		return 0;
-
-	n_marked = 0;
-	for (i = tab->n_redundant; i < tab->n_row; ++i) {
-		struct isl_tab_var *var = isl_tab_var_from_row(tab, i);
-		var->marked = !var->frozen && var->is_nonneg;
-		if (var->marked)
-			n_marked++;
-	}
-	for (i = tab->n_dead; i < tab->n_col; ++i) {
-		struct isl_tab_var *var = var_from_col(tab, i);
-		var->marked = !var->frozen && var->is_nonneg &&
-			!min_is_manifestly_unbounded(tab, var);
-		if (var->marked)
-			n_marked++;
-	}
-	while (n_marked) {
-		struct isl_tab_var *var;
-		int red;
-		for (i = tab->n_redundant; i < tab->n_row; ++i) {
-			var = isl_tab_var_from_row(tab, i);
-			if (var->marked)
-				break;
-		}
-		if (i == tab->n_row) {
-			for (i = tab->n_dead; i < tab->n_col; ++i) {
-				var = var_from_col(tab, i);
-				if (var->marked)
-					break;
-			}
-			if (i == tab->n_col)
-				break;
-		}
-		var->marked = 0;
-		n_marked--;
-		red = con_is_redundant(tab, var);
-		if (red < 0)
-			return -1;
-		if (red && !var->is_redundant)
-			if (isl_tab_mark_redundant(tab, var->index) < 0)
-				return -1;
-		for (i = tab->n_dead; i < tab->n_col; ++i) {
-			var = var_from_col(tab, i);
-			if (!var->marked)
-				continue;
-			if (!min_is_manifestly_unbounded(tab, var))
-				continue;
-			var->marked = 0;
-			n_marked--;
-		}
-	}
-
-	return 0;
-}
-
-int isl_tab_is_equality(struct isl_tab *tab, int con)
-{
-	int row;
-	unsigned off;
-
-	if (!tab)
-		return -1;
-	if (tab->con[con].is_zero)
-		return 1;
-	if (tab->con[con].is_redundant)
-		return 0;
-	if (!tab->con[con].is_row)
-		return tab->con[con].index < tab->n_dead;
-
-	row = tab->con[con].index;
-
-	off = 2 + tab->M;
-	return isl_int_is_zero(tab->mat->row[row][1]) &&
-		(!tab->M || isl_int_is_zero(tab->mat->row[row][2])) &&
-		isl_seq_first_non_zero(tab->mat->row[row] + off + tab->n_dead,
-					tab->n_col - tab->n_dead) == -1;
-}
-
-/* Return the minimal value of the affine expression "f" with denominator
- * "denom" in *opt, *opt_denom, assuming the tableau is not empty and
- * the expression cannot attain arbitrarily small values.
- * If opt_denom is NULL, then *opt is rounded up to the nearest integer.
- * The return value reflects the nature of the result (empty, unbounded,
- * minimal value returned in *opt).
- */
-enum isl_lp_result isl_tab_min(struct isl_tab *tab,
-	isl_int *f, isl_int denom, isl_int *opt, isl_int *opt_denom,
-	unsigned flags)
-{
-	int r;
-	enum isl_lp_result res = isl_lp_ok;
-	struct isl_tab_var *var;
-	struct isl_tab_undo *snap;
-
-	if (!tab)
-		return isl_lp_error;
-
-	if (tab->empty)
-		return isl_lp_empty;
-
-	snap = isl_tab_snap(tab);
-	r = isl_tab_add_row(tab, f);
-	if (r < 0)
-		return isl_lp_error;
-	var = &tab->con[r];
-	for (;;) {
-		int row, col;
-		find_pivot(tab, var, var, -1, &row, &col);
-		if (row == var->index) {
-			res = isl_lp_unbounded;
-			break;
-		}
-		if (row == -1)
-			break;
-		if (isl_tab_pivot(tab, row, col) < 0)
-			return isl_lp_error;
-	}
-	isl_int_mul(tab->mat->row[var->index][0],
-		    tab->mat->row[var->index][0], denom);
-	if (ISL_FL_ISSET(flags, ISL_TAB_SAVE_DUAL)) {
-		int i;
-
-		isl_vec_free(tab->dual);
-		tab->dual = isl_vec_alloc(tab->mat->ctx, 1 + tab->n_con);
-		if (!tab->dual)
-			return isl_lp_error;
-		isl_int_set(tab->dual->el[0], tab->mat->row[var->index][0]);
-		for (i = 0; i < tab->n_con; ++i) {
-			int pos;
-			if (tab->con[i].is_row) {
-				isl_int_set_si(tab->dual->el[1 + i], 0);
-				continue;
-			}
-			pos = 2 + tab->M + tab->con[i].index;
-			if (tab->con[i].negated)
-				isl_int_neg(tab->dual->el[1 + i],
-					    tab->mat->row[var->index][pos]);
-			else
-				isl_int_set(tab->dual->el[1 + i],
-					    tab->mat->row[var->index][pos]);
-		}
-	}
-	if (opt && res == isl_lp_ok) {
-		if (opt_denom) {
-			isl_int_set(*opt, tab->mat->row[var->index][1]);
-			isl_int_set(*opt_denom, tab->mat->row[var->index][0]);
-		} else
-			isl_int_cdiv_q(*opt, tab->mat->row[var->index][1],
-					     tab->mat->row[var->index][0]);
-	}
-	if (isl_tab_rollback(tab, snap) < 0)
-		return isl_lp_error;
-	return res;
-}
-
-int isl_tab_is_redundant(struct isl_tab *tab, int con)
-{
-	if (!tab)
-		return -1;
-	if (tab->con[con].is_zero)
-		return 0;
-	if (tab->con[con].is_redundant)
-		return 1;
-	return tab->con[con].is_row && tab->con[con].index < tab->n_redundant;
-}
-
-/* Take a snapshot of the tableau that can be restored by s call to
- * isl_tab_rollback.
- */
-struct isl_tab_undo *isl_tab_snap(struct isl_tab *tab)
-{
-	if (!tab)
-		return NULL;
-	tab->need_undo = 1;
-	return tab->top;
-}
-
-/* Undo the operation performed by isl_tab_relax.
- */
-static int unrelax(struct isl_tab *tab, struct isl_tab_var *var) WARN_UNUSED;
-static int unrelax(struct isl_tab *tab, struct isl_tab_var *var)
-{
-	unsigned off = 2 + tab->M;
-
-	if (!var->is_row && !max_is_manifestly_unbounded(tab, var))
-		if (to_row(tab, var, 1) < 0)
-			return -1;
-
-	if (var->is_row) {
-		isl_int_sub(tab->mat->row[var->index][1],
-		    tab->mat->row[var->index][1], tab->mat->row[var->index][0]);
-		if (var->is_nonneg) {
-			int sgn = restore_row(tab, var);
-			isl_assert(tab->mat->ctx, sgn >= 0, return -1);
-		}
-	} else {
-		int i;
-
-		for (i = 0; i < tab->n_row; ++i) {
-			if (isl_int_is_zero(tab->mat->row[i][off + var->index]))
-				continue;
-			isl_int_add(tab->mat->row[i][1], tab->mat->row[i][1],
-			    tab->mat->row[i][off + var->index]);
-		}
-
-	}
-
-	return 0;
-}
-
-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)
-{
-	struct isl_tab_var *var = var_from_index(tab, undo->u.var_index);
-	switch (undo->type) {
-	case isl_tab_undo_nonneg:
-		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;
-	case isl_tab_undo_freeze:
-		var->frozen = 0;
-		break;
-	case isl_tab_undo_zero:
-		var->is_zero = 0;
-		if (!var->is_row)
-			tab->n_dead--;
-		break;
-	case isl_tab_undo_allocate:
-		if (undo->u.var_index >= 0) {
-			isl_assert(tab->mat->ctx, !var->is_row, return -1);
-			drop_col(tab, var->index);
-			break;
-		}
-		if (!var->is_row) {
-			if (!max_is_manifestly_unbounded(tab, var)) {
-				if (to_row(tab, var, 1) < 0)
-					return -1;
-			} else if (!min_is_manifestly_unbounded(tab, var)) {
-				if (to_row(tab, var, -1) < 0)
-					return -1;
-			} else
-				if (to_row(tab, var, 0) < 0)
-					return -1;
-		}
-		drop_row(tab, var->index);
-		break;
-	case isl_tab_undo_relax:
-		return unrelax(tab, var);
-	default:
-		isl_die(tab->mat->ctx, isl_error_internal,
-			"perform_undo_var called on invalid undo record",
-			return -1);
-	}
-
-	return 0;
-}
-
-/* Restore the tableau to the state where the basic variables
- * are those in "col_var".
- * We first construct a list of variables that are currently in
- * the basis, but shouldn't.  Then we iterate over all variables
- * that should be in the basis and for each one that is currently
- * not in the basis, we exchange it with one of the elements of the
- * list constructed before.
- * We can always find an appropriate variable to pivot with because
- * the current basis is mapped to the old basis by a non-singular
- * matrix and so we can never end up with a zero row.
- */
-static int restore_basis(struct isl_tab *tab, int *col_var)
-{
-	int i, j;
-	int n_extra = 0;
-	int *extra = NULL;	/* current columns that contain bad stuff */
-	unsigned off = 2 + tab->M;
-
-	extra = isl_alloc_array(tab->mat->ctx, int, tab->n_col);
-	if (!extra)
-		goto error;
-	for (i = 0; i < tab->n_col; ++i) {
-		for (j = 0; j < tab->n_col; ++j)
-			if (tab->col_var[i] == col_var[j])
-				break;
-		if (j < tab->n_col)
-			continue;
-		extra[n_extra++] = i;
-	}
-	for (i = 0; i < tab->n_col && n_extra > 0; ++i) {
-		struct isl_tab_var *var;
-		int row;
-
-		for (j = 0; j < tab->n_col; ++j)
-			if (col_var[i] == tab->col_var[j])
-				break;
-		if (j < tab->n_col)
-			continue;
-		var = var_from_index(tab, col_var[i]);
-		row = var->index;
-		for (j = 0; j < n_extra; ++j)
-			if (!isl_int_is_zero(tab->mat->row[row][off+extra[j]]))
-				break;
-		isl_assert(tab->mat->ctx, j < n_extra, goto error);
-		if (isl_tab_pivot(tab, row, extra[j]) < 0)
-			goto error;
-		extra[j] = extra[--n_extra];
-	}
-
-	free(extra);
-	return 0;
-error:
-	free(extra);
-	return -1;
-}
-
-/* Remove all samples with index n or greater, i.e., those samples
- * that were added since we saved this number of samples in
- * isl_tab_save_samples.
- */
-static void drop_samples_since(struct isl_tab *tab, int n)
-{
-	int i;
-
-	for (i = tab->n_sample - 1; i >= 0 && tab->n_sample > n; --i) {
-		if (tab->sample_index[i] < n)
-			continue;
-
-		if (i != tab->n_sample - 1) {
-			int t = tab->sample_index[tab->n_sample-1];
-			tab->sample_index[tab->n_sample-1] = tab->sample_index[i];
-			tab->sample_index[i] = t;
-			isl_mat_swap_rows(tab->samples, tab->n_sample-1, i);
-		}
-		tab->n_sample--;
-	}
-}
-
-static int perform_undo(struct isl_tab *tab, struct isl_tab_undo *undo) WARN_UNUSED;
-static int perform_undo(struct isl_tab *tab, struct isl_tab_undo *undo)
-{
-	switch (undo->type) {
-	case isl_tab_undo_empty:
-		tab->empty = 0;
-		break;
-	case isl_tab_undo_nonneg:
-	case isl_tab_undo_redundant:
-	case isl_tab_undo_freeze:
-	case isl_tab_undo_zero:
-	case isl_tab_undo_allocate:
-	case isl_tab_undo_relax:
-		return perform_undo_var(tab, undo);
-	case isl_tab_undo_bmap_eq:
-		return isl_basic_map_free_equality(tab->bmap, 1);
-	case isl_tab_undo_bmap_ineq:
-		return isl_basic_map_free_inequality(tab->bmap, 1);
-	case isl_tab_undo_bmap_div:
-		if (isl_basic_map_free_div(tab->bmap, 1) < 0)
-			return -1;
-		if (tab->samples)
-			tab->samples->n_col--;
-		break;
-	case isl_tab_undo_saved_basis:
-		if (restore_basis(tab, undo->u.col_var) < 0)
-			return -1;
-		break;
-	case isl_tab_undo_drop_sample:
-		tab->n_outside--;
-		break;
-	case isl_tab_undo_saved_samples:
-		drop_samples_since(tab, undo->u.n);
-		break;
-	case isl_tab_undo_callback:
-		return undo->u.callback->run(undo->u.callback);
-	default:
-		isl_assert(tab->mat->ctx, 0, return -1);
-	}
-	return 0;
-}
-
-/* Return the tableau to the state it was in when the snapshot "snap"
- * was taken.
- */
-int isl_tab_rollback(struct isl_tab *tab, struct isl_tab_undo *snap)
-{
-	struct isl_tab_undo *undo, *next;
-
-	if (!tab)
-		return -1;
-
-	tab->in_undo = 1;
-	for (undo = tab->top; undo && undo != &tab->bottom; undo = next) {
-		next = undo->next;
-		if (undo == snap)
-			break;
-		if (perform_undo(tab, undo) < 0) {
-			tab->top = undo;
-			free_undo(tab);
-			tab->in_undo = 0;
-			return -1;
-		}
-		free_undo_record(undo);
-	}
-	tab->in_undo = 0;
-	tab->top = undo;
-	if (!undo)
-		return -1;
-	return 0;
-}
-
-/* The given row "row" represents an inequality violated by all
- * points in the tableau.  Check for some special cases of such
- * separating constraints.
- * In particular, if the row has been reduced to the constant -1,
- * then we know the inequality is adjacent (but opposite) to
- * an equality in the tableau.
- * If the row has been reduced to r = c*(-1 -r'), with r' an inequality
- * of the tableau and c a positive constant, then the inequality
- * is adjacent (but opposite) to the inequality r'.
- */
-static enum isl_ineq_type separation_type(struct isl_tab *tab, unsigned row)
-{
-	int pos;
-	unsigned off = 2 + tab->M;
-
-	if (tab->rational)
-		return isl_ineq_separate;
-
-	if (!isl_int_is_one(tab->mat->row[row][0]))
-		return isl_ineq_separate;
-
-	pos = isl_seq_first_non_zero(tab->mat->row[row] + off + tab->n_dead,
-					tab->n_col - tab->n_dead);
-	if (pos == -1) {
-		if (isl_int_is_negone(tab->mat->row[row][1]))
-			return isl_ineq_adj_eq;
-		else
-			return isl_ineq_separate;
-	}
-
-	if (!isl_int_eq(tab->mat->row[row][1],
-			tab->mat->row[row][off + tab->n_dead + pos]))
-		return isl_ineq_separate;
-
-	pos = isl_seq_first_non_zero(
-			tab->mat->row[row] + off + tab->n_dead + pos + 1,
-			tab->n_col - tab->n_dead - pos - 1);
-
-	return pos == -1 ? isl_ineq_adj_ineq : isl_ineq_separate;
-}
-
-/* Check the effect of inequality "ineq" on the tableau "tab".
- * The result may be
- *	isl_ineq_redundant:	satisfied by all points in the tableau
- *	isl_ineq_separate:	satisfied by no point in the tableau
- *	isl_ineq_cut:		satisfied by some by not all points
- *	isl_ineq_adj_eq:	adjacent to an equality
- *	isl_ineq_adj_ineq:	adjacent to an inequality.
- */
-enum isl_ineq_type isl_tab_ineq_type(struct isl_tab *tab, isl_int *ineq)
-{
-	enum isl_ineq_type type = isl_ineq_error;
-	struct isl_tab_undo *snap = NULL;
-	int con;
-	int row;
-
-	if (!tab)
-		return isl_ineq_error;
-
-	if (isl_tab_extend_cons(tab, 1) < 0)
-		return isl_ineq_error;
-
-	snap = isl_tab_snap(tab);
-
-	con = isl_tab_add_row(tab, ineq);
-	if (con < 0)
-		goto error;
-
-	row = tab->con[con].index;
-	if (isl_tab_row_is_redundant(tab, row))
-		type = isl_ineq_redundant;
-	else if (isl_int_is_neg(tab->mat->row[row][1]) &&
-		 (tab->rational ||
-		    isl_int_abs_ge(tab->mat->row[row][1],
-				   tab->mat->row[row][0]))) {
-		int nonneg = at_least_zero(tab, &tab->con[con]);
-		if (nonneg < 0)
-			goto error;
-		if (nonneg)
-			type = isl_ineq_cut;
-		else
-			type = separation_type(tab, row);
-	} else {
-		int red = con_is_redundant(tab, &tab->con[con]);
-		if (red < 0)
-			goto error;
-		if (!red)
-			type = isl_ineq_cut;
-		else
-			type = isl_ineq_redundant;
-	}
-
-	if (isl_tab_rollback(tab, snap))
-		return isl_ineq_error;
-	return type;
-error:
-	return isl_ineq_error;
-}
-
-int isl_tab_track_bmap(struct isl_tab *tab, __isl_take isl_basic_map *bmap)
-{
-	if (!tab || !bmap)
-		goto error;
-
-	isl_assert(tab->mat->ctx, tab->n_eq == bmap->n_eq, return -1);
-	isl_assert(tab->mat->ctx,
-		    tab->n_con == bmap->n_eq + bmap->n_ineq, return -1);
-
-	tab->bmap = bmap;
-
-	return 0;
-error:
-	isl_basic_map_free(bmap);
-	return -1;
-}
-
-int isl_tab_track_bset(struct isl_tab *tab, __isl_take isl_basic_set *bset)
-{
-	return isl_tab_track_bmap(tab, (isl_basic_map *)bset);
-}
-
-__isl_keep isl_basic_set *isl_tab_peek_bset(struct isl_tab *tab)
-{
-	if (!tab)
-		return NULL;
-
-	return (isl_basic_set *)tab->bmap;
-}
-
-static void isl_tab_print_internal(__isl_keep struct isl_tab *tab,
-	FILE *out, int indent)
-{
-	unsigned r, c;
-	int i;
-
-	if (!tab) {
-		fprintf(out, "%*snull tab\n", indent, "");
-		return;
-	}
-	fprintf(out, "%*sn_redundant: %d, n_dead: %d", indent, "",
-		tab->n_redundant, tab->n_dead);
-	if (tab->rational)
-		fprintf(out, ", rational");
-	if (tab->empty)
-		fprintf(out, ", empty");
-	fprintf(out, "\n");
-	fprintf(out, "%*s[", indent, "");
-	for (i = 0; i < tab->n_var; ++i) {
-		if (i)
-			fprintf(out, (i == tab->n_param ||
-				      i == tab->n_var - tab->n_div) ? "; "
-								    : ", ");
-		fprintf(out, "%c%d%s", tab->var[i].is_row ? 'r' : 'c',
-					tab->var[i].index,
-					tab->var[i].is_zero ? " [=0]" :
-					tab->var[i].is_redundant ? " [R]" : "");
-	}
-	fprintf(out, "]\n");
-	fprintf(out, "%*s[", indent, "");
-	for (i = 0; i < tab->n_con; ++i) {
-		if (i)
-			fprintf(out, ", ");
-		fprintf(out, "%c%d%s", tab->con[i].is_row ? 'r' : 'c',
-					tab->con[i].index,
-					tab->con[i].is_zero ? " [=0]" :
-					tab->con[i].is_redundant ? " [R]" : "");
-	}
-	fprintf(out, "]\n");
-	fprintf(out, "%*s[", indent, "");
-	for (i = 0; i < tab->n_row; ++i) {
-		const char *sign = "";
-		if (i)
-			fprintf(out, ", ");
-		if (tab->row_sign) {
-			if (tab->row_sign[i] == isl_tab_row_unknown)
-				sign = "?";
-			else if (tab->row_sign[i] == isl_tab_row_neg)
-				sign = "-";
-			else if (tab->row_sign[i] == isl_tab_row_pos)
-				sign = "+";
-			else
-				sign = "+-";
-		}
-		fprintf(out, "r%d: %d%s%s", i, tab->row_var[i],
-		    isl_tab_var_from_row(tab, i)->is_nonneg ? " [>=0]" : "", sign);
-	}
-	fprintf(out, "]\n");
-	fprintf(out, "%*s[", indent, "");
-	for (i = 0; i < tab->n_col; ++i) {
-		if (i)
-			fprintf(out, ", ");
-		fprintf(out, "c%d: %d%s", i, tab->col_var[i],
-		    var_from_col(tab, i)->is_nonneg ? " [>=0]" : "");
-	}
-	fprintf(out, "]\n");
-	r = tab->mat->n_row;
-	tab->mat->n_row = tab->n_row;
-	c = tab->mat->n_col;
-	tab->mat->n_col = 2 + tab->M + tab->n_col;
-	isl_mat_print_internal(tab->mat, out, indent);
-	tab->mat->n_row = r;
-	tab->mat->n_col = c;
-	if (tab->bmap)
-		isl_basic_map_print_internal(tab->bmap, out, indent);
-}
-
-void isl_tab_dump(__isl_keep struct isl_tab *tab)
-{
-	isl_tab_print_internal(tab, stderr, 0);
-}
diff --git a/cloog-0.16.3/isl/isl_tab.h b/cloog-0.16.3/isl/isl_tab.h
deleted file mode 100644
index 6888044..0000000
--- a/cloog-0.16.3/isl/isl_tab.h
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_TAB_H
-#define ISL_TAB_H
-
-#include <isl/lp.h>
-#include <isl/map.h>
-#include <isl/mat.h>
-#include <isl/set.h>
-
-struct isl_tab_var {
-	int index;
-	unsigned is_row : 1;
-	unsigned is_nonneg : 1;
-	unsigned is_zero : 1;
-	unsigned is_redundant : 1;
-	unsigned marked : 1;
-	unsigned frozen : 1;
-	unsigned negated : 1;
-};
-
-enum isl_tab_undo_type {
-	isl_tab_undo_bottom,
-	isl_tab_undo_empty,
-	isl_tab_undo_nonneg,
-	isl_tab_undo_redundant,
-	isl_tab_undo_freeze,
-	isl_tab_undo_zero,
-	isl_tab_undo_allocate,
-	isl_tab_undo_relax,
-	isl_tab_undo_bmap_ineq,
-	isl_tab_undo_bmap_eq,
-	isl_tab_undo_bmap_div,
-	isl_tab_undo_saved_basis,
-	isl_tab_undo_drop_sample,
-	isl_tab_undo_saved_samples,
-	isl_tab_undo_callback,
-};
-
-struct isl_tab_callback {
-	int (*run)(struct isl_tab_callback *cb);
-};
-
-union isl_tab_undo_val {
-	int		var_index;
-	int		*col_var;
-	int		n;
-	struct isl_tab_callback	*callback;
-};
-
-struct isl_tab_undo {
-	enum isl_tab_undo_type	type;
-	union isl_tab_undo_val	u;
-	struct isl_tab_undo	*next;
-};
-
-/* The tableau maintains equality relations.
- * Each column and each row is associated to a variable or a constraint.
- * The "value" of an inequality constraint is the value of the corresponding
- * slack variable.
- * The "row_var" and "col_var" arrays map column and row indices
- * to indices in the "var" and "con" arrays.  The elements of these
- * arrays maintain extra information about the variables and the constraints.
- * Each row expresses the corresponding row variable as an affine expression
- * of the column variables.
- * The first two columns in the matrix contain the common denominator of
- * the row and the numerator of the constant term.
- * If "M" is set, then the third column represents the "big parameter".
- * The third (M = 0) or fourth (M = 1) column
- * in the matrix is called column 0 with respect to the col_var array.
- * The sample value of the tableau is the value that assigns zero
- * to all the column variables and the constant term of each affine
- * expression to the corresponding row variable.
- * The operations on the tableau maintain the property that the sample
- * value satisfies the non-negativity constraints (usually on the slack
- * variables).
- *
- * The big parameter represents an arbitrarily big (and divisible)
- * positive number.  If present, then the sign of a row is determined
- * lexicographically, with the sign of the big parameter coefficient
- * considered first.  The big parameter is only used while
- * solving PILP problems.
- *
- * The first n_dead column variables have their values fixed to zero.
- * The corresponding tab_vars are flagged "is_zero".
- * Some of the rows that have have zero coefficients in all but
- * the dead columns are also flagged "is_zero".
- *
- * The first n_redundant rows correspond to inequality constraints
- * that are always satisfied for any value satisfying the non-redundant
- * rows.  The corresponding tab_vars are flagged "is_redundant".
- * A row variable that is flagged "is_zero" is also flagged "is_redundant"
- * since the constraint has been reduced to 0 = 0 and is therefore always
- * satisfied.
- *
- * There are "n_var" variables in total.  The first "n_param" of these
- * are called parameters and the last "n_div" of these are called divs.
- * The basic tableau operations makes no distinction between different
- * kinds of variables.  These special variables are only used while
- * solving PILP problems.
- *
- * Dead columns and redundant rows are detected on the fly.
- * However, the basic operations do not ensure that all dead columns
- * or all redundant rows are detected.
- * isl_tab_detect_implicit_equalities and isl_tab_detect_redundant can be used
- * to perform and exhaustive search for dead columns and redundant rows.
- *
- * The samples matrix contains "n_sample" integer points that have at some
- * point been elements satisfying the tableau.  The first "n_outside"
- * of them no longer satisfy the tableau.  They are kept because they
- * can be reinstated during rollback when the constraint that cut them
- * out is removed.  These samples are only maintained for the context
- * tableau while solving PILP problems.
- */
-enum isl_tab_row_sign {
-	isl_tab_row_unknown = 0,
-	isl_tab_row_pos,
-	isl_tab_row_neg,
-	isl_tab_row_any,
-};
-struct isl_tab {
-	struct isl_mat *mat;
-
-	unsigned n_row;
-	unsigned n_col;
-	unsigned n_dead;
-	unsigned n_redundant;
-
-	unsigned n_var;
-	unsigned n_param;
-	unsigned n_div;
-	unsigned max_var;
-	unsigned n_con;
-	unsigned n_eq;
-	unsigned max_con;
-	struct isl_tab_var *var;
-	struct isl_tab_var *con;
-	int *row_var;	/* v >= 0 -> var v;	v < 0 -> con ~v */
-	int *col_var;	/* v >= 0 -> var v;	v < 0 -> con ~v */
-	enum isl_tab_row_sign *row_sign;
-
-	struct isl_tab_undo bottom;
-	struct isl_tab_undo *top;
-
-	struct isl_vec *dual;
-	struct isl_basic_map *bmap;
-
-	unsigned n_sample;
-	unsigned n_outside;
-	int *sample_index;
-	struct isl_mat *samples;
-
-	int n_zero;
-	int n_unbounded;
-	struct isl_mat *basis;
-
-	int (*conflict)(int con, void *user);
-	void *conflict_user;
-
-	unsigned strict_redundant : 1;
-	unsigned need_undo : 1;
-	unsigned rational : 1;
-	unsigned empty : 1;
-	unsigned in_undo : 1;
-	unsigned M : 1;
-	unsigned cone : 1;
-};
-
-struct isl_tab *isl_tab_alloc(struct isl_ctx *ctx,
-	unsigned n_row, unsigned n_var, unsigned M);
-void isl_tab_free(struct isl_tab *tab);
-
-struct isl_tab *isl_tab_from_basic_map(struct isl_basic_map *bmap);
-struct isl_tab *isl_tab_from_basic_set(struct isl_basic_set *bset);
-struct isl_tab *isl_tab_from_recession_cone(struct isl_basic_set *bset,
-	int parametric);
-int isl_tab_cone_is_bounded(struct isl_tab *tab);
-struct isl_basic_map *isl_basic_map_update_from_tab(struct isl_basic_map *bmap,
-	struct isl_tab *tab);
-struct isl_basic_set *isl_basic_set_update_from_tab(struct isl_basic_set *bset,
-	struct isl_tab *tab);
-int isl_tab_detect_implicit_equalities(struct isl_tab *tab) WARN_UNUSED;
-int isl_tab_detect_redundant(struct isl_tab *tab) WARN_UNUSED;
-#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,
-	unsigned flags) WARN_UNUSED;
-
-struct isl_tab *isl_tab_extend(struct isl_tab *tab, unsigned n_new) WARN_UNUSED;
-int isl_tab_add_ineq(struct isl_tab *tab, isl_int *ineq) WARN_UNUSED;
-int isl_tab_add_eq(struct isl_tab *tab, isl_int *eq) WARN_UNUSED;
-int isl_tab_add_valid_eq(struct isl_tab *tab, isl_int *eq) WARN_UNUSED;
-
-int isl_tab_freeze_constraint(struct isl_tab *tab, int con) WARN_UNUSED;
-
-int isl_tab_track_bmap(struct isl_tab *tab, __isl_take isl_basic_map *bmap) WARN_UNUSED;
-int isl_tab_track_bset(struct isl_tab *tab, __isl_take isl_basic_set *bset) WARN_UNUSED;
-__isl_keep isl_basic_set *isl_tab_peek_bset(struct isl_tab *tab);
-
-int isl_tab_is_equality(struct isl_tab *tab, int con);
-int isl_tab_is_redundant(struct isl_tab *tab, int con);
-
-int isl_tab_sample_is_integer(struct isl_tab *tab);
-struct isl_vec *isl_tab_get_sample_value(struct isl_tab *tab);
-
-enum isl_ineq_type {
-	isl_ineq_error = -1,
-	isl_ineq_redundant,
-	isl_ineq_separate,
-	isl_ineq_cut,
-	isl_ineq_adj_eq,
-	isl_ineq_adj_ineq,
-};
-
-enum isl_ineq_type isl_tab_ineq_type(struct isl_tab *tab, isl_int *ineq);
-
-struct isl_tab_undo *isl_tab_snap(struct isl_tab *tab);
-int isl_tab_rollback(struct isl_tab *tab, struct isl_tab_undo *snap) WARN_UNUSED;
-
-struct isl_tab *isl_tab_relax(struct isl_tab *tab, int con) WARN_UNUSED;
-int isl_tab_select_facet(struct isl_tab *tab, int con) WARN_UNUSED;
-
-void isl_tab_dump(__isl_keep struct isl_tab *tab);
-
-struct isl_map *isl_tab_basic_map_partial_lexopt(
-		struct isl_basic_map *bmap, struct isl_basic_set *dom,
-		struct isl_set **empty, int max);
-
-/* An isl_region represents a sequence of consecutive variables.
- * pos is the location (starting at 0) of the first variable in the sequence.
- */
-struct isl_region {
-	int pos;
-	int len;
-};
-
-__isl_give isl_vec *isl_tab_basic_set_non_trivial_lexmin(
-	__isl_take isl_basic_set *bset, int n_op, int n_region,
-	struct isl_region *region,
-	int (*conflict)(int con, void *user), void *user);
-__isl_give isl_vec *isl_tab_basic_set_non_neg_lexmin(
-	__isl_take isl_basic_set *bset);
-
-/* private */
-
-struct isl_tab_var *isl_tab_var_from_row(struct isl_tab *tab, int i);
-int isl_tab_mark_redundant(struct isl_tab *tab, int row) WARN_UNUSED;
-int isl_tab_mark_empty(struct isl_tab *tab) WARN_UNUSED;
-struct isl_tab *isl_tab_dup(struct isl_tab *tab);
-struct isl_tab *isl_tab_product(struct isl_tab *tab1, struct isl_tab *tab2);
-int isl_tab_extend_cons(struct isl_tab *tab, unsigned n_new) WARN_UNUSED;
-int isl_tab_allocate_con(struct isl_tab *tab) WARN_UNUSED;
-int isl_tab_extend_vars(struct isl_tab *tab, unsigned n_new) WARN_UNUSED;
-int isl_tab_allocate_var(struct isl_tab *tab) WARN_UNUSED;
-int isl_tab_pivot(struct isl_tab *tab, int row, int col) WARN_UNUSED;
-int isl_tab_add_row(struct isl_tab *tab, isl_int *line) WARN_UNUSED;
-int isl_tab_row_is_redundant(struct isl_tab *tab, int row);
-int isl_tab_min_at_most_neg_one(struct isl_tab *tab, struct isl_tab_var *var);
-int isl_tab_sign_of_max(struct isl_tab *tab, int con);
-int isl_tab_kill_col(struct isl_tab *tab, int col) WARN_UNUSED;
-
-int isl_tab_push(struct isl_tab *tab, enum isl_tab_undo_type type) WARN_UNUSED;
-int isl_tab_push_var(struct isl_tab *tab,
-	enum isl_tab_undo_type type, struct isl_tab_var *var) WARN_UNUSED;
-int isl_tab_push_basis(struct isl_tab *tab) WARN_UNUSED;
-
-struct isl_tab *isl_tab_init_samples(struct isl_tab *tab) WARN_UNUSED;
-struct isl_tab *isl_tab_add_sample(struct isl_tab *tab,
-	__isl_take isl_vec *sample) WARN_UNUSED;
-struct isl_tab *isl_tab_drop_sample(struct isl_tab *tab, int s);
-int isl_tab_save_samples(struct isl_tab *tab) WARN_UNUSED;
-
-struct isl_tab *isl_tab_detect_equalities(struct isl_tab *tab,
-	struct isl_tab *tab_cone) WARN_UNUSED;
-
-int isl_tab_push_callback(struct isl_tab *tab,
-	struct isl_tab_callback *callback) WARN_UNUSED;
-
-int isl_tab_add_div(struct isl_tab *tab, __isl_keep isl_vec *div,
-	int (*add_ineq)(void *user, isl_int *), void *user);
-
-#endif
diff --git a/cloog-0.16.3/isl/isl_tab_pip.c b/cloog-0.16.3/isl/isl_tab_pip.c
deleted file mode 100644
index 2f39a08..0000000
--- a/cloog-0.16.3/isl/isl_tab_pip.c
+++ /dev/null
@@ -1,4991 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France 
- */
-
-#include <isl_ctx_private.h>
-#include "isl_map_private.h"
-#include <isl/seq.h>
-#include "isl_tab.h"
-#include "isl_sample.h"
-#include <isl_mat_private.h>
-#include <isl_aff_private.h>
-#include <isl_config.h>
-
-/*
- * The implementation of parametric integer linear programming in this file
- * was inspired by the paper "Parametric Integer Programming" and the
- * report "Solving systems of affine (in)equalities" by Paul Feautrier
- * (and others).
- *
- * The strategy used for obtaining a feasible solution is different
- * from the one used in isl_tab.c.  In particular, in isl_tab.c,
- * upon finding a constraint that is not yet satisfied, we pivot
- * in a row that increases the constant term of the row holding the
- * constraint, making sure the sample solution remains feasible
- * for all the constraints it already satisfied.
- * Here, we always pivot in the row holding the constraint,
- * choosing a column that induces the lexicographically smallest
- * increment to the sample solution.
- *
- * By starting out from a sample value that is lexicographically
- * smaller than any integer point in the problem space, the first
- * feasible integer sample point we find will also be the lexicographically
- * smallest.  If all variables can be assumed to be non-negative,
- * then the initial sample value may be chosen equal to zero.
- * However, we will not make this assumption.  Instead, we apply
- * the "big parameter" trick.  Any variable x is then not directly
- * used in the tableau, but instead it is represented by another
- * variable x' = M + x, where M is an arbitrarily large (positive)
- * value.  x' is therefore always non-negative, whatever the value of x.
- * Taking as initial sample value x' = 0 corresponds to x = -M,
- * which is always smaller than any possible value of x.
- *
- * The big parameter trick is used in the main tableau and
- * also in the context tableau if isl_context_lex is used.
- * In this case, each tableaus has its own big parameter.
- * Before doing any real work, we check if all the parameters
- * happen to be non-negative.  If so, we drop the column corresponding
- * to M from the initial context tableau.
- * If isl_context_gbr is used, then the big parameter trick is only
- * used in the main tableau.
- */
-
-struct isl_context;
-struct isl_context_op {
-	/* detect nonnegative parameters in context and mark them in tab */
-	struct isl_tab *(*detect_nonnegative_parameters)(
-			struct isl_context *context, struct isl_tab *tab);
-	/* return temporary reference to basic set representation of context */
-	struct isl_basic_set *(*peek_basic_set)(struct isl_context *context);
-	/* return temporary reference to tableau representation of context */
-	struct isl_tab *(*peek_tab)(struct isl_context *context);
-	/* add equality; check is 1 if eq may not be valid;
-	 * update is 1 if we may want to call ineq_sign on context later.
-	 */
-	void (*add_eq)(struct isl_context *context, isl_int *eq,
-			int check, int update);
-	/* add inequality; check is 1 if ineq may not be valid;
-	 * update is 1 if we may want to call ineq_sign on context later.
-	 */
-	void (*add_ineq)(struct isl_context *context, isl_int *ineq,
-			int check, int update);
-	/* check sign of ineq based on previous information.
-	 * strict is 1 if saturation should be treated as a positive sign.
-	 */
-	enum isl_tab_row_sign (*ineq_sign)(struct isl_context *context,
-			isl_int *ineq, int strict);
-	/* check if inequality maintains feasibility */
-	int (*test_ineq)(struct isl_context *context, isl_int *ineq);
-	/* return index of a div that corresponds to "div" */
-	int (*get_div)(struct isl_context *context, struct isl_tab *tab,
-			struct isl_vec *div);
-	/* add div "div" to context and return non-negativity */
-	int (*add_div)(struct isl_context *context, struct isl_vec *div);
-	int (*detect_equalities)(struct isl_context *context,
-			struct isl_tab *tab);
-	/* return row index of "best" split */
-	int (*best_split)(struct isl_context *context, struct isl_tab *tab);
-	/* check if context has already been determined to be empty */
-	int (*is_empty)(struct isl_context *context);
-	/* check if context is still usable */
-	int (*is_ok)(struct isl_context *context);
-	/* save a copy/snapshot of context */
-	void *(*save)(struct isl_context *context);
-	/* restore saved context */
-	void (*restore)(struct isl_context *context, void *);
-	/* invalidate context */
-	void (*invalidate)(struct isl_context *context);
-	/* free context */
-	void (*free)(struct isl_context *context);
-};
-
-struct isl_context {
-	struct isl_context_op *op;
-};
-
-struct isl_context_lex {
-	struct isl_context context;
-	struct isl_tab *tab;
-};
-
-struct isl_partial_sol {
-	int level;
-	struct isl_basic_set *dom;
-	struct isl_mat *M;
-
-	struct isl_partial_sol *next;
-};
-
-struct isl_sol;
-struct isl_sol_callback {
-	struct isl_tab_callback callback;
-	struct isl_sol *sol;
-};
-
-/* isl_sol is an interface for constructing a solution to
- * a parametric integer linear programming problem.
- * Every time the algorithm reaches a state where a solution
- * can be read off from the tableau (including cases where the tableau
- * is empty), the function "add" is called on the isl_sol passed
- * to find_solutions_main.
- *
- * The context tableau is owned by isl_sol and is updated incrementally.
- *
- * There are currently two implementations of this interface,
- * isl_sol_map, which simply collects the solutions in an isl_map
- * and (optionally) the parts of the context where there is no solution
- * in an isl_set, and
- * isl_sol_for, which calls a user-defined function for each part of
- * the solution.
- */
-struct isl_sol {
-	int error;
-	int rational;
-	int level;
-	int max;
-	int n_out;
-	struct isl_context *context;
-	struct isl_partial_sol *partial;
-	void (*add)(struct isl_sol *sol,
-			    struct isl_basic_set *dom, struct isl_mat *M);
-	void (*add_empty)(struct isl_sol *sol, struct isl_basic_set *bset);
-	void (*free)(struct isl_sol *sol);
-	struct isl_sol_callback	dec_level;
-};
-
-static void sol_free(struct isl_sol *sol)
-{
-	struct isl_partial_sol *partial, *next;
-	if (!sol)
-		return;
-	for (partial = sol->partial; partial; partial = next) {
-		next = partial->next;
-		isl_basic_set_free(partial->dom);
-		isl_mat_free(partial->M);
-		free(partial);
-	}
-	sol->free(sol);
-}
-
-/* Push a partial solution represented by a domain and mapping M
- * onto the stack of partial solutions.
- */
-static void sol_push_sol(struct isl_sol *sol,
-	struct isl_basic_set *dom, struct isl_mat *M)
-{
-	struct isl_partial_sol *partial;
-
-	if (sol->error || !dom)
-		goto error;
-
-	partial = isl_alloc_type(dom->ctx, struct isl_partial_sol);
-	if (!partial)
-		goto error;
-
-	partial->level = sol->level;
-	partial->dom = dom;
-	partial->M = M;
-	partial->next = sol->partial;
-
-	sol->partial = partial;
-
-	return;
-error:
-	isl_basic_set_free(dom);
-	sol->error = 1;
-}
-
-/* Pop one partial solution from the partial solution stack and
- * pass it on to sol->add or sol->add_empty.
- */
-static void sol_pop_one(struct isl_sol *sol)
-{
-	struct isl_partial_sol *partial;
-
-	partial = sol->partial;
-	sol->partial = partial->next;
-
-	if (partial->M)
-		sol->add(sol, partial->dom, partial->M);
-	else
-		sol->add_empty(sol, partial->dom);
-	free(partial);
-}
-
-/* Return a fresh copy of the domain represented by the context tableau.
- */
-static struct isl_basic_set *sol_domain(struct isl_sol *sol)
-{
-	struct isl_basic_set *bset;
-
-	if (sol->error)
-		return NULL;
-
-	bset = isl_basic_set_dup(sol->context->op->peek_basic_set(sol->context));
-	bset = isl_basic_set_update_from_tab(bset,
-			sol->context->op->peek_tab(sol->context));
-
-	return bset;
-}
-
-/* Check whether two partial solutions have the same mapping, where n_div
- * is the number of divs that the two partial solutions have in common.
- */
-static int same_solution(struct isl_partial_sol *s1, struct isl_partial_sol *s2,
-	unsigned n_div)
-{
-	int i;
-	unsigned dim;
-
-	if (!s1->M != !s2->M)
-		return 0;
-	if (!s1->M)
-		return 1;
-
-	dim = isl_basic_set_total_dim(s1->dom) - s1->dom->n_div;
-
-	for (i = 0; i < s1->M->n_row; ++i) {
-		if (isl_seq_first_non_zero(s1->M->row[i]+1+dim+n_div,
-					    s1->M->n_col-1-dim-n_div) != -1)
-			return 0;
-		if (isl_seq_first_non_zero(s2->M->row[i]+1+dim+n_div,
-					    s2->M->n_col-1-dim-n_div) != -1)
-			return 0;
-		if (!isl_seq_eq(s1->M->row[i], s2->M->row[i], 1+dim+n_div))
-			return 0;
-	}
-	return 1;
-}
-
-/* Pop all solutions from the partial solution stack that were pushed onto
- * the stack at levels that are deeper than the current level.
- * If the two topmost elements on the stack have the same level
- * and represent the same solution, then their domains are combined.
- * This combined domain is the same as the current context domain
- * as sol_pop is called each time we move back to a higher level.
- */
-static void sol_pop(struct isl_sol *sol)
-{
-	struct isl_partial_sol *partial;
-	unsigned n_div;
-
-	if (sol->error)
-		return;
-
-	if (sol->level == 0) {
-		for (partial = sol->partial; partial; partial = sol->partial)
-			sol_pop_one(sol);
-		return;
-	}
-
-	partial = sol->partial;
-	if (!partial)
-		return;
-
-	if (partial->level <= sol->level)
-		return;
-
-	if (partial->next && partial->next->level == partial->level) {
-		n_div = isl_basic_set_dim(
-				sol->context->op->peek_basic_set(sol->context),
-				isl_dim_div);
-
-		if (!same_solution(partial, partial->next, n_div)) {
-			sol_pop_one(sol);
-			sol_pop_one(sol);
-		} else {
-			struct isl_basic_set *bset;
-
-			bset = sol_domain(sol);
-
-			isl_basic_set_free(partial->next->dom);
-			partial->next->dom = bset;
-			partial->next->level = sol->level;
-
-			sol->partial = partial->next;
-			isl_basic_set_free(partial->dom);
-			isl_mat_free(partial->M);
-			free(partial);
-		}
-	} else
-		sol_pop_one(sol);
-}
-
-static void sol_dec_level(struct isl_sol *sol)
-{
-	if (sol->error)
-		return;
-
-	sol->level--;
-
-	sol_pop(sol);
-}
-
-static int sol_dec_level_wrap(struct isl_tab_callback *cb)
-{
-	struct isl_sol_callback *callback = (struct isl_sol_callback *)cb;
-
-	sol_dec_level(callback->sol);
-
-	return callback->sol->error ? -1 : 0;
-}
-
-/* Move down to next level and push callback onto context tableau
- * to decrease the level again when it gets rolled back across
- * the current state.  That is, dec_level will be called with
- * the context tableau in the same state as it is when inc_level
- * is called.
- */
-static void sol_inc_level(struct isl_sol *sol)
-{
-	struct isl_tab *tab;
-
-	if (sol->error)
-		return;
-
-	sol->level++;
-	tab = sol->context->op->peek_tab(sol->context);
-	if (isl_tab_push_callback(tab, &sol->dec_level.callback) < 0)
-		sol->error = 1;
-}
-
-static void scale_rows(struct isl_mat *mat, isl_int m, int n_row)
-{
-	int i;
-
-	if (isl_int_is_one(m))
-		return;
-
-	for (i = 0; i < n_row; ++i)
-		isl_seq_scale(mat->row[i], mat->row[i], m, mat->n_col);
-}
-
-/* Add the solution identified by the tableau and the context tableau.
- *
- * The layout of the variables is as follows.
- *	tab->n_var is equal to the total number of variables in the input
- *			map (including divs that were copied from the context)
- *			+ the number of extra divs constructed
- *      Of these, the first tab->n_param and the last tab->n_div variables
- *	correspond to the variables in the context, i.e.,
- *		tab->n_param + tab->n_div = context_tab->n_var
- *	tab->n_param is equal to the number of parameters and input
- *			dimensions in the input map
- *	tab->n_div is equal to the number of divs in the context
- *
- * If there is no solution, then call add_empty with a basic set
- * that corresponds to the context tableau.  (If add_empty is NULL,
- * then do nothing).
- *
- * If there is a solution, then first construct a matrix that maps
- * all dimensions of the context to the output variables, i.e.,
- * the output dimensions in the input map.
- * The divs in the input map (if any) that do not correspond to any
- * div in the context do not appear in the solution.
- * The algorithm will make sure that they have an integer value,
- * but these values themselves are of no interest.
- * We have to be careful not to drop or rearrange any divs in the
- * context because that would change the meaning of the matrix.
- *
- * To extract the value of the output variables, it should be noted
- * that we always use a big parameter M in the main tableau and so
- * the variable stored in this tableau is not an output variable x itself, but
- *	x' = M + x (in case of minimization)
- * or
- *	x' = M - x (in case of maximization)
- * If x' appears in a column, then its optimal value is zero,
- * which means that the optimal value of x is an unbounded number
- * (-M for minimization and M for maximization).
- * We currently assume that the output dimensions in the original map
- * are bounded, so this cannot occur.
- * Similarly, when x' appears in a row, then the coefficient of M in that
- * row is necessarily 1.
- * If the row in the tableau represents
- *	d x' = c + d M + e(y)
- * then, in case of minimization, the corresponding row in the matrix
- * will be
- *	a c + a e(y)
- * with a d = m, the (updated) common denominator of the matrix.
- * In case of maximization, the row will be
- *	-a c - a e(y)
- */
-static void sol_add(struct isl_sol *sol, struct isl_tab *tab)
-{
-	struct isl_basic_set *bset = NULL;
-	struct isl_mat *mat = NULL;
-	unsigned off;
-	int row;
-	isl_int m;
-
-	if (sol->error || !tab)
-		goto error;
-
-	if (tab->empty && !sol->add_empty)
-		return;
-
-	bset = sol_domain(sol);
-
-	if (tab->empty) {
-		sol_push_sol(sol, bset, NULL);
-		return;
-	}
-
-	off = 2 + tab->M;
-
-	mat = isl_mat_alloc(tab->mat->ctx, 1 + sol->n_out,
-					    1 + tab->n_param + tab->n_div);
-	if (!mat)
-		goto error;
-
-	isl_int_init(m);
-
-	isl_seq_clr(mat->row[0] + 1, mat->n_col - 1);
-	isl_int_set_si(mat->row[0][0], 1);
-	for (row = 0; row < sol->n_out; ++row) {
-		int i = tab->n_param + row;
-		int r, j;
-
-		isl_seq_clr(mat->row[1 + row], mat->n_col);
-		if (!tab->var[i].is_row) {
-			if (tab->M)
-				isl_die(mat->ctx, isl_error_invalid,
-					"unbounded optimum", goto error2);
-			continue;
-		}
-
-		r = tab->var[i].index;
-		if (tab->M &&
-		    isl_int_ne(tab->mat->row[r][2], tab->mat->row[r][0]))
-			isl_die(mat->ctx, isl_error_invalid,
-				"unbounded optimum", goto error2);
-		isl_int_gcd(m, mat->row[0][0], tab->mat->row[r][0]);
-		isl_int_divexact(m, tab->mat->row[r][0], m);
-		scale_rows(mat, m, 1 + row);
-		isl_int_divexact(m, mat->row[0][0], tab->mat->row[r][0]);
-		isl_int_mul(mat->row[1 + row][0], m, tab->mat->row[r][1]);
-		for (j = 0; j < tab->n_param; ++j) {
-			int col;
-			if (tab->var[j].is_row)
-				continue;
-			col = tab->var[j].index;
-			isl_int_mul(mat->row[1 + row][1 + j], m,
-				    tab->mat->row[r][off + col]);
-		}
-		for (j = 0; j < tab->n_div; ++j) {
-			int col;
-			if (tab->var[tab->n_var - tab->n_div+j].is_row)
-				continue;
-			col = tab->var[tab->n_var - tab->n_div+j].index;
-			isl_int_mul(mat->row[1 + row][1 + tab->n_param + j], m,
-				    tab->mat->row[r][off + col]);
-		}
-		if (sol->max)
-			isl_seq_neg(mat->row[1 + row], mat->row[1 + row],
-				    mat->n_col);
-	}
-
-	isl_int_clear(m);
-
-	sol_push_sol(sol, bset, mat);
-	return;
-error2:
-	isl_int_clear(m);
-error:
-	isl_basic_set_free(bset);
-	isl_mat_free(mat);
-	sol->error = 1;
-}
-
-struct isl_sol_map {
-	struct isl_sol	sol;
-	struct isl_map	*map;
-	struct isl_set	*empty;
-};
-
-static void sol_map_free(struct isl_sol_map *sol_map)
-{
-	if (!sol_map)
-		return;
-	if (sol_map->sol.context)
-		sol_map->sol.context->op->free(sol_map->sol.context);
-	isl_map_free(sol_map->map);
-	isl_set_free(sol_map->empty);
-	free(sol_map);
-}
-
-static void sol_map_free_wrap(struct isl_sol *sol)
-{
-	sol_map_free((struct isl_sol_map *)sol);
-}
-
-/* This function is called for parts of the context where there is
- * no solution, with "bset" corresponding to the context tableau.
- * Simply add the basic set to the set "empty".
- */
-static void sol_map_add_empty(struct isl_sol_map *sol,
-	struct isl_basic_set *bset)
-{
-	if (!bset)
-		goto error;
-	isl_assert(bset->ctx, sol->empty, goto error);
-
-	sol->empty = isl_set_grow(sol->empty, 1);
-	bset = isl_basic_set_simplify(bset);
-	bset = isl_basic_set_finalize(bset);
-	sol->empty = isl_set_add_basic_set(sol->empty, isl_basic_set_copy(bset));
-	if (!sol->empty)
-		goto error;
-	isl_basic_set_free(bset);
-	return;
-error:
-	isl_basic_set_free(bset);
-	sol->sol.error = 1;
-}
-
-static void sol_map_add_empty_wrap(struct isl_sol *sol,
-	struct isl_basic_set *bset)
-{
-	sol_map_add_empty((struct isl_sol_map *)sol, bset);
-}
-
-/* Add bset to sol's empty, but only if we are actually collecting
- * the empty set.
- */
-static void sol_map_add_empty_if_needed(struct isl_sol_map *sol,
-	struct isl_basic_set *bset)
-{
-	if (sol->empty)
-		sol_map_add_empty(sol, bset);
-	else
-		isl_basic_set_free(bset);
-}
-
-/* Given a basic map "dom" that represents the context and an affine
- * matrix "M" that maps the dimensions of the context to the
- * output variables, construct a basic map with the same parameters
- * and divs as the context, the dimensions of the context as input
- * dimensions and a number of output dimensions that is equal to
- * the number of output dimensions in the input map.
- *
- * The constraints and divs of the context are simply copied
- * from "dom".  For each row
- *	x = c + e(y)
- * an equality
- *	c + e(y) - d x = 0
- * is added, with d the common denominator of M.
- */
-static void sol_map_add(struct isl_sol_map *sol,
-	struct isl_basic_set *dom, struct isl_mat *M)
-{
-	int i;
-	struct isl_basic_map *bmap = NULL;
-	unsigned n_eq;
-	unsigned n_ineq;
-	unsigned nparam;
-	unsigned total;
-	unsigned n_div;
-	unsigned n_out;
-
-	if (sol->sol.error || !dom || !M)
-		goto error;
-
-	n_out = sol->sol.n_out;
-	n_eq = dom->n_eq + n_out;
-	n_ineq = dom->n_ineq;
-	n_div = dom->n_div;
-	nparam = isl_basic_set_total_dim(dom) - n_div;
-	total = isl_map_dim(sol->map, isl_dim_all);
-	bmap = isl_basic_map_alloc_dim(isl_map_get_dim(sol->map),
-					n_div, n_eq, 2 * n_div + n_ineq);
-	if (!bmap)
-		goto error;
-	if (sol->sol.rational)
-		ISL_F_SET(bmap, ISL_BASIC_MAP_RATIONAL);
-	for (i = 0; i < dom->n_div; ++i) {
-		int k = isl_basic_map_alloc_div(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(bmap->div[k], dom->div[i], 1 + 1 + nparam);
-		isl_seq_clr(bmap->div[k] + 1 + 1 + nparam, total - nparam);
-		isl_seq_cpy(bmap->div[k] + 1 + 1 + total,
-			    dom->div[i] + 1 + 1 + nparam, i);
-	}
-	for (i = 0; i < dom->n_eq; ++i) {
-		int k = isl_basic_map_alloc_equality(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(bmap->eq[k], dom->eq[i], 1 + nparam);
-		isl_seq_clr(bmap->eq[k] + 1 + nparam, total - nparam);
-		isl_seq_cpy(bmap->eq[k] + 1 + total,
-			    dom->eq[i] + 1 + nparam, n_div);
-	}
-	for (i = 0; i < dom->n_ineq; ++i) {
-		int k = isl_basic_map_alloc_inequality(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(bmap->ineq[k], dom->ineq[i], 1 + nparam);
-		isl_seq_clr(bmap->ineq[k] + 1 + nparam, total - nparam);
-		isl_seq_cpy(bmap->ineq[k] + 1 + total,
-			dom->ineq[i] + 1 + nparam, n_div);
-	}
-	for (i = 0; i < M->n_row - 1; ++i) {
-		int k = isl_basic_map_alloc_equality(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(bmap->eq[k], M->row[1 + i], 1 + nparam);
-		isl_seq_clr(bmap->eq[k] + 1 + nparam, n_out);
-		isl_int_neg(bmap->eq[k][1 + nparam + i], M->row[0][0]);
-		isl_seq_cpy(bmap->eq[k] + 1 + nparam + n_out,
-			    M->row[1 + i] + 1 + nparam, n_div);
-	}
-	bmap = isl_basic_map_simplify(bmap);
-	bmap = isl_basic_map_finalize(bmap);
-	sol->map = isl_map_grow(sol->map, 1);
-	sol->map = isl_map_add_basic_map(sol->map, bmap);
-	if (!sol->map)
-		goto error;
-	isl_basic_set_free(dom);
-	isl_mat_free(M);
-	return;
-error:
-	isl_basic_set_free(dom);
-	isl_mat_free(M);
-	isl_basic_map_free(bmap);
-	sol->sol.error = 1;
-}
-
-static void sol_map_add_wrap(struct isl_sol *sol,
-	struct isl_basic_set *dom, struct isl_mat *M)
-{
-	sol_map_add((struct isl_sol_map *)sol, dom, M);
-}
-
-
-/* Store the "parametric constant" of row "row" of tableau "tab" in "line",
- * i.e., the constant term and the coefficients of all variables that
- * appear in the context tableau.
- * Note that the coefficient of the big parameter M is NOT copied.
- * The context tableau may not have a big parameter and even when it
- * does, it is a different big parameter.
- */
-static void get_row_parameter_line(struct isl_tab *tab, int row, isl_int *line)
-{
-	int i;
-	unsigned off = 2 + tab->M;
-
-	isl_int_set(line[0], tab->mat->row[row][1]);
-	for (i = 0; i < tab->n_param; ++i) {
-		if (tab->var[i].is_row)
-			isl_int_set_si(line[1 + i], 0);
-		else {
-			int col = tab->var[i].index;
-			isl_int_set(line[1 + i], tab->mat->row[row][off + col]);
-		}
-	}
-	for (i = 0; i < tab->n_div; ++i) {
-		if (tab->var[tab->n_var - tab->n_div + i].is_row)
-			isl_int_set_si(line[1 + tab->n_param + i], 0);
-		else {
-			int col = tab->var[tab->n_var - tab->n_div + i].index;
-			isl_int_set(line[1 + tab->n_param + i],
-				    tab->mat->row[row][off + col]);
-		}
-	}
-}
-
-/* Check if rows "row1" and "row2" have identical "parametric constants",
- * as explained above.
- * In this case, we also insist that the coefficients of the big parameter
- * be the same as the values of the constants will only be the same
- * if these coefficients are also the same.
- */
-static int identical_parameter_line(struct isl_tab *tab, int row1, int row2)
-{
-	int i;
-	unsigned off = 2 + tab->M;
-
-	if (isl_int_ne(tab->mat->row[row1][1], tab->mat->row[row2][1]))
-		return 0;
-
-	if (tab->M && isl_int_ne(tab->mat->row[row1][2],
-				 tab->mat->row[row2][2]))
-		return 0;
-
-	for (i = 0; i < tab->n_param + tab->n_div; ++i) {
-		int pos = i < tab->n_param ? i :
-			tab->n_var - tab->n_div + i - tab->n_param;
-		int col;
-
-		if (tab->var[pos].is_row)
-			continue;
-		col = tab->var[pos].index;
-		if (isl_int_ne(tab->mat->row[row1][off + col],
-			       tab->mat->row[row2][off + col]))
-			return 0;
-	}
-	return 1;
-}
-
-/* Return an inequality that expresses that the "parametric constant"
- * should be non-negative.
- * This function is only called when the coefficient of the big parameter
- * is equal to zero.
- */
-static struct isl_vec *get_row_parameter_ineq(struct isl_tab *tab, int row)
-{
-	struct isl_vec *ineq;
-
-	ineq = isl_vec_alloc(tab->mat->ctx, 1 + tab->n_param + tab->n_div);
-	if (!ineq)
-		return NULL;
-
-	get_row_parameter_line(tab, row, ineq->el);
-	if (ineq)
-		ineq = isl_vec_normalize(ineq);
-
-	return ineq;
-}
-
-/* Return a integer division for use in a parametric cut based on the given row.
- * In particular, let the parametric constant of the row be
- *
- *		\sum_i a_i y_i
- *
- * where y_0 = 1, but none of the y_i corresponds to the big parameter M.
- * The div returned is equal to
- *
- *		floor(\sum_i {-a_i} y_i) = floor((\sum_i (-a_i mod d) y_i)/d)
- */
-static struct isl_vec *get_row_parameter_div(struct isl_tab *tab, int row)
-{
-	struct isl_vec *div;
-
-	div = isl_vec_alloc(tab->mat->ctx, 1 + 1 + tab->n_param + tab->n_div);
-	if (!div)
-		return NULL;
-
-	isl_int_set(div->el[0], tab->mat->row[row][0]);
-	get_row_parameter_line(tab, row, div->el + 1);
-	div = isl_vec_normalize(div);
-	isl_seq_neg(div->el + 1, div->el + 1, div->size - 1);
-	isl_seq_fdiv_r(div->el + 1, div->el + 1, div->el[0], div->size - 1);
-
-	return div;
-}
-
-/* Return a integer division for use in transferring an integrality constraint
- * to the context.
- * In particular, let the parametric constant of the row be
- *
- *		\sum_i a_i y_i
- *
- * where y_0 = 1, but none of the y_i corresponds to the big parameter M.
- * The the returned div is equal to
- *
- *		floor(\sum_i {a_i} y_i) = floor((\sum_i (a_i mod d) y_i)/d)
- */
-static struct isl_vec *get_row_split_div(struct isl_tab *tab, int row)
-{
-	struct isl_vec *div;
-
-	div = isl_vec_alloc(tab->mat->ctx, 1 + 1 + tab->n_param + tab->n_div);
-	if (!div)
-		return NULL;
-
-	isl_int_set(div->el[0], tab->mat->row[row][0]);
-	get_row_parameter_line(tab, row, div->el + 1);
-	div = isl_vec_normalize(div);
-	isl_seq_fdiv_r(div->el + 1, div->el + 1, div->el[0], div->size - 1);
-
-	return div;
-}
-
-/* Construct and return an inequality that expresses an upper bound
- * on the given div.
- * In particular, if the div is given by
- *
- *	d = floor(e/m)
- *
- * then the inequality expresses
- *
- *	m d <= e
- */
-static struct isl_vec *ineq_for_div(struct isl_basic_set *bset, unsigned div)
-{
-	unsigned total;
-	unsigned div_pos;
-	struct isl_vec *ineq;
-
-	if (!bset)
-		return NULL;
-
-	total = isl_basic_set_total_dim(bset);
-	div_pos = 1 + total - bset->n_div + div;
-
-	ineq = isl_vec_alloc(bset->ctx, 1 + total);
-	if (!ineq)
-		return NULL;
-
-	isl_seq_cpy(ineq->el, bset->div[div] + 1, 1 + total);
-	isl_int_neg(ineq->el[div_pos], bset->div[div][0]);
-	return ineq;
-}
-
-/* Given a row in the tableau and a div that was created
- * using get_row_split_div and that been constrained to equality, i.e.,
- *
- *		d = floor(\sum_i {a_i} y_i) = \sum_i {a_i} y_i
- *
- * replace the expression "\sum_i {a_i} y_i" in the row by d,
- * i.e., we subtract "\sum_i {a_i} y_i" and add 1 d.
- * The coefficients of the non-parameters in the tableau have been
- * verified to be integral.  We can therefore simply replace coefficient b
- * by floor(b).  For the coefficients of the parameters we have
- * floor(a_i) = a_i - {a_i}, while for the other coefficients, we have
- * floor(b) = b.
- */
-static struct isl_tab *set_row_cst_to_div(struct isl_tab *tab, int row, int div)
-{
-	isl_seq_fdiv_q(tab->mat->row[row] + 1, tab->mat->row[row] + 1,
-			tab->mat->row[row][0], 1 + tab->M + tab->n_col);
-
-	isl_int_set_si(tab->mat->row[row][0], 1);
-
-	if (tab->var[tab->n_var - tab->n_div + div].is_row) {
-		int drow = tab->var[tab->n_var - tab->n_div + div].index;
-
-		isl_assert(tab->mat->ctx,
-			isl_int_is_one(tab->mat->row[drow][0]), goto error);
-		isl_seq_combine(tab->mat->row[row] + 1,
-			tab->mat->ctx->one, tab->mat->row[row] + 1,
-			tab->mat->ctx->one, tab->mat->row[drow] + 1,
-			1 + tab->M + tab->n_col);
-	} else {
-		int dcol = tab->var[tab->n_var - tab->n_div + div].index;
-
-		isl_int_set_si(tab->mat->row[row][2 + tab->M + dcol], 1);
-	}
-
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-/* Check if the (parametric) constant of the given row is obviously
- * negative, meaning that we don't need to consult the context tableau.
- * If there is a big parameter and its coefficient is non-zero,
- * then this coefficient determines the outcome.
- * Otherwise, we check whether the constant is negative and
- * all non-zero coefficients of parameters are negative and
- * belong to non-negative parameters.
- */
-static int is_obviously_neg(struct isl_tab *tab, int row)
-{
-	int i;
-	int col;
-	unsigned off = 2 + tab->M;
-
-	if (tab->M) {
-		if (isl_int_is_pos(tab->mat->row[row][2]))
-			return 0;
-		if (isl_int_is_neg(tab->mat->row[row][2]))
-			return 1;
-	}
-
-	if (isl_int_is_nonneg(tab->mat->row[row][1]))
-		return 0;
-	for (i = 0; i < tab->n_param; ++i) {
-		/* Eliminated parameter */
-		if (tab->var[i].is_row)
-			continue;
-		col = tab->var[i].index;
-		if (isl_int_is_zero(tab->mat->row[row][off + col]))
-			continue;
-		if (!tab->var[i].is_nonneg)
-			return 0;
-		if (isl_int_is_pos(tab->mat->row[row][off + col]))
-			return 0;
-	}
-	for (i = 0; i < tab->n_div; ++i) {
-		if (tab->var[tab->n_var - tab->n_div + i].is_row)
-			continue;
-		col = tab->var[tab->n_var - tab->n_div + i].index;
-		if (isl_int_is_zero(tab->mat->row[row][off + col]))
-			continue;
-		if (!tab->var[tab->n_var - tab->n_div + i].is_nonneg)
-			return 0;
-		if (isl_int_is_pos(tab->mat->row[row][off + col]))
-			return 0;
-	}
-	return 1;
-}
-
-/* Check if the (parametric) constant of the given row is obviously
- * non-negative, meaning that we don't need to consult the context tableau.
- * If there is a big parameter and its coefficient is non-zero,
- * then this coefficient determines the outcome.
- * Otherwise, we check whether the constant is non-negative and
- * all non-zero coefficients of parameters are positive and
- * belong to non-negative parameters.
- */
-static int is_obviously_nonneg(struct isl_tab *tab, int row)
-{
-	int i;
-	int col;
-	unsigned off = 2 + tab->M;
-
-	if (tab->M) {
-		if (isl_int_is_pos(tab->mat->row[row][2]))
-			return 1;
-		if (isl_int_is_neg(tab->mat->row[row][2]))
-			return 0;
-	}
-
-	if (isl_int_is_neg(tab->mat->row[row][1]))
-		return 0;
-	for (i = 0; i < tab->n_param; ++i) {
-		/* Eliminated parameter */
-		if (tab->var[i].is_row)
-			continue;
-		col = tab->var[i].index;
-		if (isl_int_is_zero(tab->mat->row[row][off + col]))
-			continue;
-		if (!tab->var[i].is_nonneg)
-			return 0;
-		if (isl_int_is_neg(tab->mat->row[row][off + col]))
-			return 0;
-	}
-	for (i = 0; i < tab->n_div; ++i) {
-		if (tab->var[tab->n_var - tab->n_div + i].is_row)
-			continue;
-		col = tab->var[tab->n_var - tab->n_div + i].index;
-		if (isl_int_is_zero(tab->mat->row[row][off + col]))
-			continue;
-		if (!tab->var[tab->n_var - tab->n_div + i].is_nonneg)
-			return 0;
-		if (isl_int_is_neg(tab->mat->row[row][off + col]))
-			return 0;
-	}
-	return 1;
-}
-
-/* Given a row r and two columns, return the column that would
- * lead to the lexicographically smallest increment in the sample
- * solution when leaving the basis in favor of the row.
- * Pivoting with column c will increment the sample value by a non-negative
- * constant times a_{V,c}/a_{r,c}, with a_{V,c} the elements of column c
- * corresponding to the non-parametric variables.
- * If variable v appears in a column c_v, the a_{v,c} = 1 iff c = c_v,
- * with all other entries in this virtual row equal to zero.
- * If variable v appears in a row, then a_{v,c} is the element in column c
- * of that row.
- *
- * Let v be the first variable with a_{v,c1}/a_{r,c1} != a_{v,c2}/a_{r,c2}.
- * Then if a_{v,c1}/a_{r,c1} < a_{v,c2}/a_{r,c2}, i.e.,
- * a_{v,c2} a_{r,c1} - a_{v,c1} a_{r,c2} > 0, c1 results in the minimal
- * increment.  Otherwise, it's c2.
- */
-static int lexmin_col_pair(struct isl_tab *tab,
-	int row, int col1, int col2, isl_int tmp)
-{
-	int i;
-	isl_int *tr;
-
-	tr = tab->mat->row[row] + 2 + tab->M;
-
-	for (i = tab->n_param; i < tab->n_var - tab->n_div; ++i) {
-		int s1, s2;
-		isl_int *r;
-
-		if (!tab->var[i].is_row) {
-			if (tab->var[i].index == col1)
-				return col2;
-			if (tab->var[i].index == col2)
-				return col1;
-			continue;
-		}
-
-		if (tab->var[i].index == row)
-			continue;
-
-		r = tab->mat->row[tab->var[i].index] + 2 + tab->M;
-		s1 = isl_int_sgn(r[col1]);
-		s2 = isl_int_sgn(r[col2]);
-		if (s1 == 0 && s2 == 0)
-			continue;
-		if (s1 < s2)
-			return col1;
-		if (s2 < s1)
-			return col2;
-
-		isl_int_mul(tmp, r[col2], tr[col1]);
-		isl_int_submul(tmp, r[col1], tr[col2]);
-		if (isl_int_is_pos(tmp))
-			return col1;
-		if (isl_int_is_neg(tmp))
-			return col2;
-	}
-	return -1;
-}
-
-/* Given a row in the tableau, find and return the column that would
- * result in the lexicographically smallest, but positive, increment
- * in the sample point.
- * If there is no such column, then return tab->n_col.
- * If anything goes wrong, return -1.
- */
-static int lexmin_pivot_col(struct isl_tab *tab, int row)
-{
-	int j;
-	int col = tab->n_col;
-	isl_int *tr;
-	isl_int tmp;
-
-	tr = tab->mat->row[row] + 2 + tab->M;
-
-	isl_int_init(tmp);
-
-	for (j = tab->n_dead; j < tab->n_col; ++j) {
-		if (tab->col_var[j] >= 0 &&
-		    (tab->col_var[j] < tab->n_param  ||
-		    tab->col_var[j] >= tab->n_var - tab->n_div))
-			continue;
-
-		if (!isl_int_is_pos(tr[j]))
-			continue;
-
-		if (col == tab->n_col)
-			col = j;
-		else
-			col = lexmin_col_pair(tab, row, col, j, tmp);
-		isl_assert(tab->mat->ctx, col >= 0, goto error);
-	}
-
-	isl_int_clear(tmp);
-	return col;
-error:
-	isl_int_clear(tmp);
-	return -1;
-}
-
-/* Return the first known violated constraint, i.e., a non-negative
- * constraint that currently has an either obviously negative value
- * or a previously determined to be negative value.
- *
- * If any constraint has a negative coefficient for the big parameter,
- * if any, then we return one of these first.
- */
-static int first_neg(struct isl_tab *tab)
-{
-	int row;
-
-	if (tab->M)
-		for (row = tab->n_redundant; row < tab->n_row; ++row) {
-			if (!isl_tab_var_from_row(tab, row)->is_nonneg)
-				continue;
-			if (!isl_int_is_neg(tab->mat->row[row][2]))
-				continue;
-			if (tab->row_sign)
-				tab->row_sign[row] = isl_tab_row_neg;
-			return row;
-		}
-	for (row = tab->n_redundant; row < tab->n_row; ++row) {
-		if (!isl_tab_var_from_row(tab, row)->is_nonneg)
-			continue;
-		if (tab->row_sign) {
-			if (tab->row_sign[row] == 0 &&
-			    is_obviously_neg(tab, row))
-				tab->row_sign[row] = isl_tab_row_neg;
-			if (tab->row_sign[row] != isl_tab_row_neg)
-				continue;
-		} else if (!is_obviously_neg(tab, row))
-			continue;
-		return row;
-	}
-	return -1;
-}
-
-/* Check whether the invariant that all columns are lexico-positive
- * is satisfied.  This function is not called from the current code
- * but is useful during debugging.
- */
-static void check_lexpos(struct isl_tab *tab) __attribute__ ((unused));
-static void check_lexpos(struct isl_tab *tab)
-{
-	unsigned off = 2 + tab->M;
-	int col;
-	int var;
-	int row;
-
-	for (col = tab->n_dead; col < tab->n_col; ++col) {
-		if (tab->col_var[col] >= 0 &&
-		    (tab->col_var[col] < tab->n_param ||
-		     tab->col_var[col] >= tab->n_var - tab->n_div))
-			continue;
-		for (var = tab->n_param; var < tab->n_var - tab->n_div; ++var) {
-			if (!tab->var[var].is_row) {
-				if (tab->var[var].index == col)
-					break;
-				else
-					continue;
-			}
-			row = tab->var[var].index;
-			if (isl_int_is_zero(tab->mat->row[row][off + col]))
-				continue;
-			if (isl_int_is_pos(tab->mat->row[row][off + col]))
-				break;
-			fprintf(stderr, "lexneg column %d (row %d)\n",
-				col, row);
-		}
-		if (var >= tab->n_var - tab->n_div)
-			fprintf(stderr, "zero column %d\n", col);
-	}
-}
-
-/* Report to the caller that the given constraint is part of an encountered
- * conflict.
- */
-static int report_conflicting_constraint(struct isl_tab *tab, int con)
-{
-	return tab->conflict(con, tab->conflict_user);
-}
-
-/* Given a conflicting row in the tableau, report all constraints
- * involved in the row to the caller.  That is, the row itself
- * (if represents a constraint) and all constraint columns with
- * non-zero (and therefore negative) coefficient.
- */
-static int report_conflict(struct isl_tab *tab, int row)
-{
-	int j;
-	isl_int *tr;
-
-	if (!tab->conflict)
-		return 0;
-
-	if (tab->row_var[row] < 0 &&
-	    report_conflicting_constraint(tab, ~tab->row_var[row]) < 0)
-		return -1;
-
-	tr = tab->mat->row[row] + 2 + tab->M;
-
-	for (j = tab->n_dead; j < tab->n_col; ++j) {
-		if (tab->col_var[j] >= 0 &&
-		    (tab->col_var[j] < tab->n_param  ||
-		    tab->col_var[j] >= tab->n_var - tab->n_div))
-			continue;
-
-		if (!isl_int_is_neg(tr[j]))
-			continue;
-
-		if (tab->col_var[j] < 0 &&
-		    report_conflicting_constraint(tab, ~tab->col_var[j]) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-/* Resolve all known or obviously violated constraints through pivoting.
- * In particular, as long as we can find any violated constraint, we
- * look for a pivoting column that would result in the lexicographically
- * smallest increment in the sample point.  If there is no such column
- * then the tableau is infeasible.
- */
-static int restore_lexmin(struct isl_tab *tab) WARN_UNUSED;
-static int restore_lexmin(struct isl_tab *tab)
-{
-	int row, col;
-
-	if (!tab)
-		return -1;
-	if (tab->empty)
-		return 0;
-	while ((row = first_neg(tab)) != -1) {
-		col = lexmin_pivot_col(tab, row);
-		if (col >= tab->n_col) {
-			if (report_conflict(tab, row) < 0)
-				return -1;
-			if (isl_tab_mark_empty(tab) < 0)
-				return -1;
-			return 0;
-		}
-		if (col < 0)
-			return -1;
-		if (isl_tab_pivot(tab, row, col) < 0)
-			return -1;
-	}
-	return 0;
-}
-
-/* Given a row that represents an equality, look for an appropriate
- * pivoting column.
- * In particular, if there are any non-zero coefficients among
- * the non-parameter variables, then we take the last of these
- * variables.  Eliminating this variable in terms of the other
- * variables and/or parameters does not influence the property
- * that all column in the initial tableau are lexicographically
- * positive.  The row corresponding to the eliminated variable
- * will only have non-zero entries below the diagonal of the
- * initial tableau.  That is, we transform
- *
- *		I				I
- *		  1		into		a
- *		    I				  I
- *
- * If there is no such non-parameter variable, then we are dealing with
- * pure parameter equality and we pick any parameter with coefficient 1 or -1
- * for elimination.  This will ensure that the eliminated parameter
- * always has an integer value whenever all the other parameters are integral.
- * If there is no such parameter then we return -1.
- */
-static int last_var_col_or_int_par_col(struct isl_tab *tab, int row)
-{
-	unsigned off = 2 + tab->M;
-	int i;
-
-	for (i = tab->n_var - tab->n_div - 1; i >= 0 && i >= tab->n_param; --i) {
-		int col;
-		if (tab->var[i].is_row)
-			continue;
-		col = tab->var[i].index;
-		if (col <= tab->n_dead)
-			continue;
-		if (!isl_int_is_zero(tab->mat->row[row][off + col]))
-			return col;
-	}
-	for (i = tab->n_dead; i < tab->n_col; ++i) {
-		if (isl_int_is_one(tab->mat->row[row][off + i]))
-			return i;
-		if (isl_int_is_negone(tab->mat->row[row][off + i]))
-			return i;
-	}
-	return -1;
-}
-
-/* Add an equality that is known to be valid to the tableau.
- * We first check if we can eliminate a variable or a parameter.
- * If not, we add the equality as two inequalities.
- * In this case, the equality was a pure parameter equality and there
- * is no need to resolve any constraint violations.
- */
-static struct isl_tab *add_lexmin_valid_eq(struct isl_tab *tab, isl_int *eq)
-{
-	int i;
-	int r;
-
-	if (!tab)
-		return NULL;
-	r = isl_tab_add_row(tab, eq);
-	if (r < 0)
-		goto error;
-
-	r = tab->con[r].index;
-	i = last_var_col_or_int_par_col(tab, r);
-	if (i < 0) {
-		tab->con[r].is_nonneg = 1;
-		if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r]) < 0)
-			goto error;
-		isl_seq_neg(eq, eq, 1 + tab->n_var);
-		r = isl_tab_add_row(tab, eq);
-		if (r < 0)
-			goto error;
-		tab->con[r].is_nonneg = 1;
-		if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r]) < 0)
-			goto error;
-	} else {
-		if (isl_tab_pivot(tab, r, i) < 0)
-			goto error;
-		if (isl_tab_kill_col(tab, i) < 0)
-			goto error;
-		tab->n_eq++;
-	}
-
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-/* Check if the given row is a pure constant.
- */
-static int is_constant(struct isl_tab *tab, int row)
-{
-	unsigned off = 2 + tab->M;
-
-	return isl_seq_first_non_zero(tab->mat->row[row] + off + tab->n_dead,
-					tab->n_col - tab->n_dead) == -1;
-}
-
-/* Add an equality that may or may not be valid to the tableau.
- * If the resulting row is a pure constant, then it must be zero.
- * Otherwise, the resulting tableau is empty.
- *
- * If the row is not a pure constant, then we add two inequalities,
- * each time checking that they can be satisfied.
- * In the end we try to use one of the two constraints to eliminate
- * a column.
- */
-static int add_lexmin_eq(struct isl_tab *tab, isl_int *eq) WARN_UNUSED;
-static int add_lexmin_eq(struct isl_tab *tab, isl_int *eq)
-{
-	int r1, r2;
-	int row;
-	struct isl_tab_undo *snap;
-
-	if (!tab)
-		return -1;
-	snap = isl_tab_snap(tab);
-	r1 = isl_tab_add_row(tab, eq);
-	if (r1 < 0)
-		return -1;
-	tab->con[r1].is_nonneg = 1;
-	if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r1]) < 0)
-		return -1;
-
-	row = tab->con[r1].index;
-	if (is_constant(tab, row)) {
-		if (!isl_int_is_zero(tab->mat->row[row][1]) ||
-		    (tab->M && !isl_int_is_zero(tab->mat->row[row][2]))) {
-			if (isl_tab_mark_empty(tab) < 0)
-				return -1;
-			return 0;
-		}
-		if (isl_tab_rollback(tab, snap) < 0)
-			return -1;
-		return 0;
-	}
-
-	if (restore_lexmin(tab) < 0)
-		return -1;
-	if (tab->empty)
-		return 0;
-
-	isl_seq_neg(eq, eq, 1 + tab->n_var);
-
-	r2 = isl_tab_add_row(tab, eq);
-	if (r2 < 0)
-		return -1;
-	tab->con[r2].is_nonneg = 1;
-	if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r2]) < 0)
-		return -1;
-
-	if (restore_lexmin(tab) < 0)
-		return -1;
-	if (tab->empty)
-		return 0;
-
-	if (!tab->con[r1].is_row) {
-		if (isl_tab_kill_col(tab, tab->con[r1].index) < 0)
-			return -1;
-	} else if (!tab->con[r2].is_row) {
-		if (isl_tab_kill_col(tab, tab->con[r2].index) < 0)
-			return -1;
-	}
-
-	if (tab->bmap) {
-		tab->bmap = isl_basic_map_add_ineq(tab->bmap, eq);
-		if (isl_tab_push(tab, isl_tab_undo_bmap_ineq) < 0)
-			return -1;
-		isl_seq_neg(eq, eq, 1 + tab->n_var);
-		tab->bmap = isl_basic_map_add_ineq(tab->bmap, eq);
-		isl_seq_neg(eq, eq, 1 + tab->n_var);
-		if (isl_tab_push(tab, isl_tab_undo_bmap_ineq) < 0)
-			return -1;
-		if (!tab->bmap)
-			return -1;
-	}
-
-	return 0;
-}
-
-/* Add an inequality to the tableau, resolving violations using
- * restore_lexmin.
- */
-static struct isl_tab *add_lexmin_ineq(struct isl_tab *tab, isl_int *ineq)
-{
-	int r;
-
-	if (!tab)
-		return NULL;
-	if (tab->bmap) {
-		tab->bmap = isl_basic_map_add_ineq(tab->bmap, ineq);
-		if (isl_tab_push(tab, isl_tab_undo_bmap_ineq) < 0)
-			goto error;
-		if (!tab->bmap)
-			goto error;
-	}
-	r = isl_tab_add_row(tab, ineq);
-	if (r < 0)
-		goto error;
-	tab->con[r].is_nonneg = 1;
-	if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r]) < 0)
-		goto error;
-	if (isl_tab_row_is_redundant(tab, tab->con[r].index)) {
-		if (isl_tab_mark_redundant(tab, tab->con[r].index) < 0)
-			goto error;
-		return tab;
-	}
-
-	if (restore_lexmin(tab) < 0)
-		goto error;
-	if (!tab->empty && tab->con[r].is_row &&
-		 isl_tab_row_is_redundant(tab, tab->con[r].index))
-		if (isl_tab_mark_redundant(tab, tab->con[r].index) < 0)
-			goto error;
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-/* Check if the coefficients of the parameters are all integral.
- */
-static int integer_parameter(struct isl_tab *tab, int row)
-{
-	int i;
-	int col;
-	unsigned off = 2 + tab->M;
-
-	for (i = 0; i < tab->n_param; ++i) {
-		/* Eliminated parameter */
-		if (tab->var[i].is_row)
-			continue;
-		col = tab->var[i].index;
-		if (!isl_int_is_divisible_by(tab->mat->row[row][off + col],
-						tab->mat->row[row][0]))
-			return 0;
-	}
-	for (i = 0; i < tab->n_div; ++i) {
-		if (tab->var[tab->n_var - tab->n_div + i].is_row)
-			continue;
-		col = tab->var[tab->n_var - tab->n_div + i].index;
-		if (!isl_int_is_divisible_by(tab->mat->row[row][off + col],
-						tab->mat->row[row][0]))
-			return 0;
-	}
-	return 1;
-}
-
-/* Check if the coefficients of the non-parameter variables are all integral.
- */
-static int integer_variable(struct isl_tab *tab, int row)
-{
-	int i;
-	unsigned off = 2 + tab->M;
-
-	for (i = tab->n_dead; i < tab->n_col; ++i) {
-		if (tab->col_var[i] >= 0 &&
-		    (tab->col_var[i] < tab->n_param ||
-		     tab->col_var[i] >= tab->n_var - tab->n_div))
-			continue;
-		if (!isl_int_is_divisible_by(tab->mat->row[row][off + i],
-						tab->mat->row[row][0]))
-			return 0;
-	}
-	return 1;
-}
-
-/* Check if the constant term is integral.
- */
-static int integer_constant(struct isl_tab *tab, int row)
-{
-	return isl_int_is_divisible_by(tab->mat->row[row][1],
-					tab->mat->row[row][0]);
-}
-
-#define I_CST	1 << 0
-#define I_PAR	1 << 1
-#define I_VAR	1 << 2
-
-/* Check for next (non-parameter) variable after "var" (first if var == -1)
- * that is non-integer and therefore requires a cut and return
- * the index of the variable.
- * For parametric tableaus, there are three parts in a row,
- * the constant, the coefficients of the parameters and the rest.
- * For each part, we check whether the coefficients in that part
- * are all integral and if so, set the corresponding flag in *f.
- * If the constant and the parameter part are integral, then the
- * current sample value is integral and no cut is required
- * (irrespective of whether the variable part is integral).
- */
-static int next_non_integer_var(struct isl_tab *tab, int var, int *f)
-{
-	var = var < 0 ? tab->n_param : var + 1;
-
-	for (; var < tab->n_var - tab->n_div; ++var) {
-		int flags = 0;
-		int row;
-		if (!tab->var[var].is_row)
-			continue;
-		row = tab->var[var].index;
-		if (integer_constant(tab, row))
-			ISL_FL_SET(flags, I_CST);
-		if (integer_parameter(tab, row))
-			ISL_FL_SET(flags, I_PAR);
-		if (ISL_FL_ISSET(flags, I_CST) && ISL_FL_ISSET(flags, I_PAR))
-			continue;
-		if (integer_variable(tab, row))
-			ISL_FL_SET(flags, I_VAR);
-		*f = flags;
-		return var;
-	}
-	return -1;
-}
-
-/* Check for first (non-parameter) variable that is non-integer and
- * therefore requires a cut and return the corresponding row.
- * For parametric tableaus, there are three parts in a row,
- * the constant, the coefficients of the parameters and the rest.
- * For each part, we check whether the coefficients in that part
- * are all integral and if so, set the corresponding flag in *f.
- * If the constant and the parameter part are integral, then the
- * current sample value is integral and no cut is required
- * (irrespective of whether the variable part is integral).
- */
-static int first_non_integer_row(struct isl_tab *tab, int *f)
-{
-	int var = next_non_integer_var(tab, -1, f);
-
-	return var < 0 ? -1 : tab->var[var].index;
-}
-
-/* Add a (non-parametric) cut to cut away the non-integral sample
- * value of the given row.
- *
- * If the row is given by
- *
- *	m r = f + \sum_i a_i y_i
- *
- * then the cut is
- *
- *	c = - {-f/m} + \sum_i {a_i/m} y_i >= 0
- *
- * The big parameter, if any, is ignored, since it is assumed to be big
- * enough to be divisible by any integer.
- * If the tableau is actually a parametric tableau, then this function
- * is only called when all coefficients of the parameters are integral.
- * The cut therefore has zero coefficients for the parameters.
- *
- * The current value is known to be negative, so row_sign, if it
- * exists, is set accordingly.
- *
- * Return the row of the cut or -1.
- */
-static int add_cut(struct isl_tab *tab, int row)
-{
-	int i;
-	int r;
-	isl_int *r_row;
-	unsigned off = 2 + tab->M;
-
-	if (isl_tab_extend_cons(tab, 1) < 0)
-		return -1;
-	r = isl_tab_allocate_con(tab);
-	if (r < 0)
-		return -1;
-
-	r_row = tab->mat->row[tab->con[r].index];
-	isl_int_set(r_row[0], tab->mat->row[row][0]);
-	isl_int_neg(r_row[1], tab->mat->row[row][1]);
-	isl_int_fdiv_r(r_row[1], r_row[1], tab->mat->row[row][0]);
-	isl_int_neg(r_row[1], r_row[1]);
-	if (tab->M)
-		isl_int_set_si(r_row[2], 0);
-	for (i = 0; i < tab->n_col; ++i)
-		isl_int_fdiv_r(r_row[off + i],
-			tab->mat->row[row][off + i], tab->mat->row[row][0]);
-
-	tab->con[r].is_nonneg = 1;
-	if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r]) < 0)
-		return -1;
-	if (tab->row_sign)
-		tab->row_sign[tab->con[r].index] = isl_tab_row_neg;
-
-	return tab->con[r].index;
-}
-
-/* Given a non-parametric tableau, add cuts until an integer
- * sample point is obtained or until the tableau is determined
- * to be integer infeasible.
- * As long as there is any non-integer value in the sample point,
- * we add appropriate cuts, if possible, for each of these
- * non-integer values and then resolve the violated
- * cut constraints using restore_lexmin.
- * If one of the corresponding rows is equal to an integral
- * combination of variables/constraints plus a non-integral constant,
- * then there is no way to obtain an integer point and we return
- * a tableau that is marked empty.
- */
-static struct isl_tab *cut_to_integer_lexmin(struct isl_tab *tab)
-{
-	int var;
-	int row;
-	int flags;
-
-	if (!tab)
-		return NULL;
-	if (tab->empty)
-		return tab;
-
-	while ((var = next_non_integer_var(tab, -1, &flags)) != -1) {
-		do {
-			if (ISL_FL_ISSET(flags, I_VAR)) {
-				if (isl_tab_mark_empty(tab) < 0)
-					goto error;
-				return tab;
-			}
-			row = tab->var[var].index;
-			row = add_cut(tab, row);
-			if (row < 0)
-				goto error;
-		} while ((var = next_non_integer_var(tab, var, &flags)) != -1);
-		if (restore_lexmin(tab) < 0)
-			goto error;
-		if (tab->empty)
-			break;
-	}
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-/* Check whether all the currently active samples also satisfy the inequality
- * "ineq" (treated as an equality if eq is set).
- * Remove those samples that do not.
- */
-static struct isl_tab *check_samples(struct isl_tab *tab, isl_int *ineq, int eq)
-{
-	int i;
-	isl_int v;
-
-	if (!tab)
-		return NULL;
-
-	isl_assert(tab->mat->ctx, tab->bmap, goto error);
-	isl_assert(tab->mat->ctx, tab->samples, goto error);
-	isl_assert(tab->mat->ctx, tab->samples->n_col == 1 + tab->n_var, goto error);
-
-	isl_int_init(v);
-	for (i = tab->n_outside; i < tab->n_sample; ++i) {
-		int sgn;
-		isl_seq_inner_product(ineq, tab->samples->row[i],
-					1 + tab->n_var, &v);
-		sgn = isl_int_sgn(v);
-		if (eq ? (sgn == 0) : (sgn >= 0))
-			continue;
-		tab = isl_tab_drop_sample(tab, i);
-		if (!tab)
-			break;
-	}
-	isl_int_clear(v);
-
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-/* Check whether the sample value of the tableau is finite,
- * i.e., either the tableau does not use a big parameter, or
- * all values of the variables are equal to the big parameter plus
- * some constant.  This constant is the actual sample value.
- */
-static int sample_is_finite(struct isl_tab *tab)
-{
-	int i;
-
-	if (!tab->M)
-		return 1;
-
-	for (i = 0; i < tab->n_var; ++i) {
-		int row;
-		if (!tab->var[i].is_row)
-			return 0;
-		row = tab->var[i].index;
-		if (isl_int_ne(tab->mat->row[row][0], tab->mat->row[row][2]))
-			return 0;
-	}
-	return 1;
-}
-
-/* Check if the context tableau of sol has any integer points.
- * Leave tab in empty state if no integer point can be found.
- * If an integer point can be found and if moreover it is finite,
- * then it is added to the list of sample values.
- *
- * This function is only called when none of the currently active sample
- * values satisfies the most recently added constraint.
- */
-static struct isl_tab *check_integer_feasible(struct isl_tab *tab)
-{
-	struct isl_tab_undo *snap;
-
-	if (!tab)
-		return NULL;
-
-	snap = isl_tab_snap(tab);
-	if (isl_tab_push_basis(tab) < 0)
-		goto error;
-
-	tab = cut_to_integer_lexmin(tab);
-	if (!tab)
-		goto error;
-
-	if (!tab->empty && sample_is_finite(tab)) {
-		struct isl_vec *sample;
-
-		sample = isl_tab_get_sample_value(tab);
-
-		tab = isl_tab_add_sample(tab, sample);
-	}
-
-	if (!tab->empty && isl_tab_rollback(tab, snap) < 0)
-		goto error;
-
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-/* Check if any of the currently active sample values satisfies
- * the inequality "ineq" (an equality if eq is set).
- */
-static int tab_has_valid_sample(struct isl_tab *tab, isl_int *ineq, int eq)
-{
-	int i;
-	isl_int v;
-
-	if (!tab)
-		return -1;
-
-	isl_assert(tab->mat->ctx, tab->bmap, return -1);
-	isl_assert(tab->mat->ctx, tab->samples, return -1);
-	isl_assert(tab->mat->ctx, tab->samples->n_col == 1 + tab->n_var, return -1);
-
-	isl_int_init(v);
-	for (i = tab->n_outside; i < tab->n_sample; ++i) {
-		int sgn;
-		isl_seq_inner_product(ineq, tab->samples->row[i],
-					1 + tab->n_var, &v);
-		sgn = isl_int_sgn(v);
-		if (eq ? (sgn == 0) : (sgn >= 0))
-			break;
-	}
-	isl_int_clear(v);
-
-	return i < tab->n_sample;
-}
-
-/* Add a div specified by "div" to the tableau "tab" and return
- * 1 if the div is obviously non-negative.
- */
-static int context_tab_add_div(struct isl_tab *tab, struct isl_vec *div,
-	int (*add_ineq)(void *user, isl_int *), void *user)
-{
-	int i;
-	int r;
-	struct isl_mat *samples;
-	int nonneg;
-
-	r = isl_tab_add_div(tab, div, add_ineq, user);
-	if (r < 0)
-		return -1;
-	nonneg = tab->var[r].is_nonneg;
-	tab->var[r].frozen = 1;
-
-	samples = isl_mat_extend(tab->samples,
-			tab->n_sample, 1 + tab->n_var);
-	tab->samples = samples;
-	if (!samples)
-		return -1;
-	for (i = tab->n_outside; i < samples->n_row; ++i) {
-		isl_seq_inner_product(div->el + 1, samples->row[i],
-			div->size - 1, &samples->row[i][samples->n_col - 1]);
-		isl_int_fdiv_q(samples->row[i][samples->n_col - 1],
-			       samples->row[i][samples->n_col - 1], div->el[0]);
-	}
-
-	return nonneg;
-}
-
-/* Add a div specified by "div" to both the main tableau and
- * the context tableau.  In case of the main tableau, we only
- * need to add an extra div.  In the context tableau, we also
- * need to express the meaning of the div.
- * Return the index of the div or -1 if anything went wrong.
- */
-static int add_div(struct isl_tab *tab, struct isl_context *context,
-	struct isl_vec *div)
-{
-	int r;
-	int nonneg;
-
-	if ((nonneg = context->op->add_div(context, div)) < 0)
-		goto error;
-
-	if (!context->op->is_ok(context))
-		goto error;
-
-	if (isl_tab_extend_vars(tab, 1) < 0)
-		goto error;
-	r = isl_tab_allocate_var(tab);
-	if (r < 0)
-		goto error;
-	if (nonneg)
-		tab->var[r].is_nonneg = 1;
-	tab->var[r].frozen = 1;
-	tab->n_div++;
-
-	return tab->n_div - 1;
-error:
-	context->op->invalidate(context);
-	return -1;
-}
-
-static int find_div(struct isl_tab *tab, isl_int *div, isl_int denom)
-{
-	int i;
-	unsigned total = isl_basic_map_total_dim(tab->bmap);
-
-	for (i = 0; i < tab->bmap->n_div; ++i) {
-		if (isl_int_ne(tab->bmap->div[i][0], denom))
-			continue;
-		if (!isl_seq_eq(tab->bmap->div[i] + 1, div, 1 + total))
-			continue;
-		return i;
-	}
-	return -1;
-}
-
-/* Return the index of a div that corresponds to "div".
- * We first check if we already have such a div and if not, we create one.
- */
-static int get_div(struct isl_tab *tab, struct isl_context *context,
-	struct isl_vec *div)
-{
-	int d;
-	struct isl_tab *context_tab = context->op->peek_tab(context);
-
-	if (!context_tab)
-		return -1;
-
-	d = find_div(context_tab, div->el + 1, div->el[0]);
-	if (d != -1)
-		return d;
-
-	return add_div(tab, context, div);
-}
-
-/* Add a parametric cut to cut away the non-integral sample value
- * of the give row.
- * Let a_i be the coefficients of the constant term and the parameters
- * and let b_i be the coefficients of the variables or constraints
- * in basis of the tableau.
- * Let q be the div q = floor(\sum_i {-a_i} y_i).
- *
- * The cut is expressed as
- *
- *	c = \sum_i -{-a_i} y_i + \sum_i {b_i} x_i + q >= 0
- *
- * If q did not already exist in the context tableau, then it is added first.
- * If q is in a column of the main tableau then the "+ q" can be accomplished
- * by setting the corresponding entry to the denominator of the constraint.
- * If q happens to be in a row of the main tableau, then the corresponding
- * row needs to be added instead (taking care of the denominators).
- * Note that this is very unlikely, but perhaps not entirely impossible.
- *
- * The current value of the cut is known to be negative (or at least
- * non-positive), so row_sign is set accordingly.
- *
- * Return the row of the cut or -1.
- */
-static int add_parametric_cut(struct isl_tab *tab, int row,
-	struct isl_context *context)
-{
-	struct isl_vec *div;
-	int d;
-	int i;
-	int r;
-	isl_int *r_row;
-	int col;
-	int n;
-	unsigned off = 2 + tab->M;
-
-	if (!context)
-		return -1;
-
-	div = get_row_parameter_div(tab, row);
-	if (!div)
-		return -1;
-
-	n = tab->n_div;
-	d = context->op->get_div(context, tab, div);
-	if (d < 0)
-		return -1;
-
-	if (isl_tab_extend_cons(tab, 1) < 0)
-		return -1;
-	r = isl_tab_allocate_con(tab);
-	if (r < 0)
-		return -1;
-
-	r_row = tab->mat->row[tab->con[r].index];
-	isl_int_set(r_row[0], tab->mat->row[row][0]);
-	isl_int_neg(r_row[1], tab->mat->row[row][1]);
-	isl_int_fdiv_r(r_row[1], r_row[1], tab->mat->row[row][0]);
-	isl_int_neg(r_row[1], r_row[1]);
-	if (tab->M)
-		isl_int_set_si(r_row[2], 0);
-	for (i = 0; i < tab->n_param; ++i) {
-		if (tab->var[i].is_row)
-			continue;
-		col = tab->var[i].index;
-		isl_int_neg(r_row[off + col], tab->mat->row[row][off + col]);
-		isl_int_fdiv_r(r_row[off + col], r_row[off + col],
-				tab->mat->row[row][0]);
-		isl_int_neg(r_row[off + col], r_row[off + col]);
-	}
-	for (i = 0; i < tab->n_div; ++i) {
-		if (tab->var[tab->n_var - tab->n_div + i].is_row)
-			continue;
-		col = tab->var[tab->n_var - tab->n_div + i].index;
-		isl_int_neg(r_row[off + col], tab->mat->row[row][off + col]);
-		isl_int_fdiv_r(r_row[off + col], r_row[off + col],
-				tab->mat->row[row][0]);
-		isl_int_neg(r_row[off + col], r_row[off + col]);
-	}
-	for (i = 0; i < tab->n_col; ++i) {
-		if (tab->col_var[i] >= 0 &&
-		    (tab->col_var[i] < tab->n_param ||
-		     tab->col_var[i] >= tab->n_var - tab->n_div))
-			continue;
-		isl_int_fdiv_r(r_row[off + i],
-			tab->mat->row[row][off + i], tab->mat->row[row][0]);
-	}
-	if (tab->var[tab->n_var - tab->n_div + d].is_row) {
-		isl_int gcd;
-		int d_row = tab->var[tab->n_var - tab->n_div + d].index;
-		isl_int_init(gcd);
-		isl_int_gcd(gcd, tab->mat->row[d_row][0], r_row[0]);
-		isl_int_divexact(r_row[0], r_row[0], gcd);
-		isl_int_divexact(gcd, tab->mat->row[d_row][0], gcd);
-		isl_seq_combine(r_row + 1, gcd, r_row + 1,
-				r_row[0], tab->mat->row[d_row] + 1,
-				off - 1 + tab->n_col);
-		isl_int_mul(r_row[0], r_row[0], tab->mat->row[d_row][0]);
-		isl_int_clear(gcd);
-	} else {
-		col = tab->var[tab->n_var - tab->n_div + d].index;
-		isl_int_set(r_row[off + col], tab->mat->row[row][0]);
-	}
-
-	tab->con[r].is_nonneg = 1;
-	if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r]) < 0)
-		return -1;
-	if (tab->row_sign)
-		tab->row_sign[tab->con[r].index] = isl_tab_row_neg;
-
-	isl_vec_free(div);
-
-	row = tab->con[r].index;
-
-	if (d >= n && context->op->detect_equalities(context, tab) < 0)
-		return -1;
-
-	return row;
-}
-
-/* Construct a tableau for bmap that can be used for computing
- * the lexicographic minimum (or maximum) of bmap.
- * If not NULL, then dom is the domain where the minimum
- * should be computed.  In this case, we set up a parametric
- * tableau with row signs (initialized to "unknown").
- * If M is set, then the tableau will use a big parameter.
- * If max is set, then a maximum should be computed instead of a minimum.
- * This means that for each variable x, the tableau will contain the variable
- * x' = M - x, rather than x' = M + x.  This in turn means that the coefficient
- * of the variables in all constraints are negated prior to adding them
- * to the tableau.
- */
-static struct isl_tab *tab_for_lexmin(struct isl_basic_map *bmap,
-	struct isl_basic_set *dom, unsigned M, int max)
-{
-	int i;
-	struct isl_tab *tab;
-
-	tab = isl_tab_alloc(bmap->ctx, 2 * bmap->n_eq + bmap->n_ineq + 1,
-			    isl_basic_map_total_dim(bmap), M);
-	if (!tab)
-		return NULL;
-
-	tab->rational = ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL);
-	if (dom) {
-		tab->n_param = isl_basic_set_total_dim(dom) - dom->n_div;
-		tab->n_div = dom->n_div;
-		tab->row_sign = isl_calloc_array(bmap->ctx,
-					enum isl_tab_row_sign, tab->mat->n_row);
-		if (!tab->row_sign)
-			goto error;
-	}
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY)) {
-		if (isl_tab_mark_empty(tab) < 0)
-			goto error;
-		return tab;
-	}
-
-	for (i = tab->n_param; i < tab->n_var - tab->n_div; ++i) {
-		tab->var[i].is_nonneg = 1;
-		tab->var[i].frozen = 1;
-	}
-	for (i = 0; i < bmap->n_eq; ++i) {
-		if (max)
-			isl_seq_neg(bmap->eq[i] + 1 + tab->n_param,
-				    bmap->eq[i] + 1 + tab->n_param,
-				    tab->n_var - tab->n_param - tab->n_div);
-		tab = add_lexmin_valid_eq(tab, bmap->eq[i]);
-		if (max)
-			isl_seq_neg(bmap->eq[i] + 1 + tab->n_param,
-				    bmap->eq[i] + 1 + tab->n_param,
-				    tab->n_var - tab->n_param - tab->n_div);
-		if (!tab || tab->empty)
-			return tab;
-	}
-	if (bmap->n_eq && restore_lexmin(tab) < 0)
-		goto error;
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		if (max)
-			isl_seq_neg(bmap->ineq[i] + 1 + tab->n_param,
-				    bmap->ineq[i] + 1 + tab->n_param,
-				    tab->n_var - tab->n_param - tab->n_div);
-		tab = add_lexmin_ineq(tab, bmap->ineq[i]);
-		if (max)
-			isl_seq_neg(bmap->ineq[i] + 1 + tab->n_param,
-				    bmap->ineq[i] + 1 + tab->n_param,
-				    tab->n_var - tab->n_param - tab->n_div);
-		if (!tab || tab->empty)
-			return tab;
-	}
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-/* Given a main tableau where more than one row requires a split,
- * determine and return the "best" row to split on.
- *
- * Given two rows in the main tableau, if the inequality corresponding
- * to the first row is redundant with respect to that of the second row
- * in the current tableau, then it is better to split on the second row,
- * since in the positive part, both row will be positive.
- * (In the negative part a pivot will have to be performed and just about
- * anything can happen to the sign of the other row.)
- *
- * As a simple heuristic, we therefore select the row that makes the most
- * of the other rows redundant.
- *
- * Perhaps it would also be useful to look at the number of constraints
- * that conflict with any given constraint.
- */
-static int best_split(struct isl_tab *tab, struct isl_tab *context_tab)
-{
-	struct isl_tab_undo *snap;
-	int split;
-	int row;
-	int best = -1;
-	int best_r;
-
-	if (isl_tab_extend_cons(context_tab, 2) < 0)
-		return -1;
-
-	snap = isl_tab_snap(context_tab);
-
-	for (split = tab->n_redundant; split < tab->n_row; ++split) {
-		struct isl_tab_undo *snap2;
-		struct isl_vec *ineq = NULL;
-		int r = 0;
-		int ok;
-
-		if (!isl_tab_var_from_row(tab, split)->is_nonneg)
-			continue;
-		if (tab->row_sign[split] != isl_tab_row_any)
-			continue;
-
-		ineq = get_row_parameter_ineq(tab, split);
-		if (!ineq)
-			return -1;
-		ok = isl_tab_add_ineq(context_tab, ineq->el) >= 0;
-		isl_vec_free(ineq);
-		if (!ok)
-			return -1;
-
-		snap2 = isl_tab_snap(context_tab);
-
-		for (row = tab->n_redundant; row < tab->n_row; ++row) {
-			struct isl_tab_var *var;
-
-			if (row == split)
-				continue;
-			if (!isl_tab_var_from_row(tab, row)->is_nonneg)
-				continue;
-			if (tab->row_sign[row] != isl_tab_row_any)
-				continue;
-
-			ineq = get_row_parameter_ineq(tab, row);
-			if (!ineq)
-				return -1;
-			ok = isl_tab_add_ineq(context_tab, ineq->el) >= 0;
-			isl_vec_free(ineq);
-			if (!ok)
-				return -1;
-			var = &context_tab->con[context_tab->n_con - 1];
-			if (!context_tab->empty &&
-			    !isl_tab_min_at_most_neg_one(context_tab, var))
-				r++;
-			if (isl_tab_rollback(context_tab, snap2) < 0)
-				return -1;
-		}
-		if (best == -1 || r > best_r) {
-			best = split;
-			best_r = r;
-		}
-		if (isl_tab_rollback(context_tab, snap) < 0)
-			return -1;
-	}
-
-	return best;
-}
-
-static struct isl_basic_set *context_lex_peek_basic_set(
-	struct isl_context *context)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	if (!clex->tab)
-		return NULL;
-	return isl_tab_peek_bset(clex->tab);
-}
-
-static struct isl_tab *context_lex_peek_tab(struct isl_context *context)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	return clex->tab;
-}
-
-static void context_lex_add_eq(struct isl_context *context, isl_int *eq,
-		int check, int update)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	if (isl_tab_extend_cons(clex->tab, 2) < 0)
-		goto error;
-	if (add_lexmin_eq(clex->tab, eq) < 0)
-		goto error;
-	if (check) {
-		int v = tab_has_valid_sample(clex->tab, eq, 1);
-		if (v < 0)
-			goto error;
-		if (!v)
-			clex->tab = check_integer_feasible(clex->tab);
-	}
-	if (update)
-		clex->tab = check_samples(clex->tab, eq, 1);
-	return;
-error:
-	isl_tab_free(clex->tab);
-	clex->tab = NULL;
-}
-
-static void context_lex_add_ineq(struct isl_context *context, isl_int *ineq,
-		int check, int update)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	if (isl_tab_extend_cons(clex->tab, 1) < 0)
-		goto error;
-	clex->tab = add_lexmin_ineq(clex->tab, ineq);
-	if (check) {
-		int v = tab_has_valid_sample(clex->tab, ineq, 0);
-		if (v < 0)
-			goto error;
-		if (!v)
-			clex->tab = check_integer_feasible(clex->tab);
-	}
-	if (update)
-		clex->tab = check_samples(clex->tab, ineq, 0);
-	return;
-error:
-	isl_tab_free(clex->tab);
-	clex->tab = NULL;
-}
-
-static int context_lex_add_ineq_wrap(void *user, isl_int *ineq)
-{
-	struct isl_context *context = (struct isl_context *)user;
-	context_lex_add_ineq(context, ineq, 0, 0);
-	return context->op->is_ok(context) ? 0 : -1;
-}
-
-/* Check which signs can be obtained by "ineq" on all the currently
- * active sample values.  See row_sign for more information.
- */
-static enum isl_tab_row_sign tab_ineq_sign(struct isl_tab *tab, isl_int *ineq,
-	int strict)
-{
-	int i;
-	int sgn;
-	isl_int tmp;
-	enum isl_tab_row_sign res = isl_tab_row_unknown;
-
-	isl_assert(tab->mat->ctx, tab->samples, return isl_tab_row_unknown);
-	isl_assert(tab->mat->ctx, tab->samples->n_col == 1 + tab->n_var,
-			return isl_tab_row_unknown);
-
-	isl_int_init(tmp);
-	for (i = tab->n_outside; i < tab->n_sample; ++i) {
-		isl_seq_inner_product(tab->samples->row[i], ineq,
-					1 + tab->n_var, &tmp);
-		sgn = isl_int_sgn(tmp);
-		if (sgn > 0 || (sgn == 0 && strict)) {
-			if (res == isl_tab_row_unknown)
-				res = isl_tab_row_pos;
-			if (res == isl_tab_row_neg)
-				res = isl_tab_row_any;
-		}
-		if (sgn < 0) {
-			if (res == isl_tab_row_unknown)
-				res = isl_tab_row_neg;
-			if (res == isl_tab_row_pos)
-				res = isl_tab_row_any;
-		}
-		if (res == isl_tab_row_any)
-			break;
-	}
-	isl_int_clear(tmp);
-
-	return res;
-}
-
-static enum isl_tab_row_sign context_lex_ineq_sign(struct isl_context *context,
-			isl_int *ineq, int strict)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	return tab_ineq_sign(clex->tab, ineq, strict);
-}
-
-/* Check whether "ineq" can be added to the tableau without rendering
- * it infeasible.
- */
-static int context_lex_test_ineq(struct isl_context *context, isl_int *ineq)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	struct isl_tab_undo *snap;
-	int feasible;
-
-	if (!clex->tab)
-		return -1;
-
-	if (isl_tab_extend_cons(clex->tab, 1) < 0)
-		return -1;
-
-	snap = isl_tab_snap(clex->tab);
-	if (isl_tab_push_basis(clex->tab) < 0)
-		return -1;
-	clex->tab = add_lexmin_ineq(clex->tab, ineq);
-	clex->tab = check_integer_feasible(clex->tab);
-	if (!clex->tab)
-		return -1;
-	feasible = !clex->tab->empty;
-	if (isl_tab_rollback(clex->tab, snap) < 0)
-		return -1;
-
-	return feasible;
-}
-
-static int context_lex_get_div(struct isl_context *context, struct isl_tab *tab,
-		struct isl_vec *div)
-{
-	return get_div(tab, context, div);
-}
-
-/* Add a div specified by "div" to the context tableau and return
- * 1 if the div is obviously non-negative.
- * context_tab_add_div will always return 1, because all variables
- * in a isl_context_lex tableau are non-negative.
- * However, if we are using a big parameter in the context, then this only
- * reflects the non-negativity of the variable used to _encode_ the
- * div, i.e., div' = M + div, so we can't draw any conclusions.
- */
-static int context_lex_add_div(struct isl_context *context, struct isl_vec *div)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	int nonneg;
-	nonneg = context_tab_add_div(clex->tab, div,
-					context_lex_add_ineq_wrap, context);
-	if (nonneg < 0)
-		return -1;
-	if (clex->tab->M)
-		return 0;
-	return nonneg;
-}
-
-static int context_lex_detect_equalities(struct isl_context *context,
-		struct isl_tab *tab)
-{
-	return 0;
-}
-
-static int context_lex_best_split(struct isl_context *context,
-		struct isl_tab *tab)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	struct isl_tab_undo *snap;
-	int r;
-
-	snap = isl_tab_snap(clex->tab);
-	if (isl_tab_push_basis(clex->tab) < 0)
-		return -1;
-	r = best_split(tab, clex->tab);
-
-	if (r >= 0 && isl_tab_rollback(clex->tab, snap) < 0)
-		return -1;
-
-	return r;
-}
-
-static int context_lex_is_empty(struct isl_context *context)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	if (!clex->tab)
-		return -1;
-	return clex->tab->empty;
-}
-
-static void *context_lex_save(struct isl_context *context)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	struct isl_tab_undo *snap;
-
-	snap = isl_tab_snap(clex->tab);
-	if (isl_tab_push_basis(clex->tab) < 0)
-		return NULL;
-	if (isl_tab_save_samples(clex->tab) < 0)
-		return NULL;
-
-	return snap;
-}
-
-static void context_lex_restore(struct isl_context *context, void *save)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	if (isl_tab_rollback(clex->tab, (struct isl_tab_undo *)save) < 0) {
-		isl_tab_free(clex->tab);
-		clex->tab = NULL;
-	}
-}
-
-static int context_lex_is_ok(struct isl_context *context)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	return !!clex->tab;
-}
-
-/* For each variable in the context tableau, check if the variable can
- * only attain non-negative values.  If so, mark the parameter as non-negative
- * in the main tableau.  This allows for a more direct identification of some
- * cases of violated constraints.
- */
-static struct isl_tab *tab_detect_nonnegative_parameters(struct isl_tab *tab,
-	struct isl_tab *context_tab)
-{
-	int i;
-	struct isl_tab_undo *snap;
-	struct isl_vec *ineq = NULL;
-	struct isl_tab_var *var;
-	int n;
-
-	if (context_tab->n_var == 0)
-		return tab;
-
-	ineq = isl_vec_alloc(tab->mat->ctx, 1 + context_tab->n_var);
-	if (!ineq)
-		goto error;
-
-	if (isl_tab_extend_cons(context_tab, 1) < 0)
-		goto error;
-
-	snap = isl_tab_snap(context_tab);
-
-	n = 0;
-	isl_seq_clr(ineq->el, ineq->size);
-	for (i = 0; i < context_tab->n_var; ++i) {
-		isl_int_set_si(ineq->el[1 + i], 1);
-		if (isl_tab_add_ineq(context_tab, ineq->el) < 0)
-			goto error;
-		var = &context_tab->con[context_tab->n_con - 1];
-		if (!context_tab->empty &&
-		    !isl_tab_min_at_most_neg_one(context_tab, var)) {
-			int j = i;
-			if (i >= tab->n_param)
-				j = i - tab->n_param + tab->n_var - tab->n_div;
-			tab->var[j].is_nonneg = 1;
-			n++;
-		}
-		isl_int_set_si(ineq->el[1 + i], 0);
-		if (isl_tab_rollback(context_tab, snap) < 0)
-			goto error;
-	}
-
-	if (context_tab->M && n == context_tab->n_var) {
-		context_tab->mat = isl_mat_drop_cols(context_tab->mat, 2, 1);
-		context_tab->M = 0;
-	}
-
-	isl_vec_free(ineq);
-	return tab;
-error:
-	isl_vec_free(ineq);
-	isl_tab_free(tab);
-	return NULL;
-}
-
-static struct isl_tab *context_lex_detect_nonnegative_parameters(
-	struct isl_context *context, struct isl_tab *tab)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	struct isl_tab_undo *snap;
-
-	if (!tab)
-		return NULL;
-
-	snap = isl_tab_snap(clex->tab);
-	if (isl_tab_push_basis(clex->tab) < 0)
-		goto error;
-
-	tab = tab_detect_nonnegative_parameters(tab, clex->tab);
-
-	if (isl_tab_rollback(clex->tab, snap) < 0)
-		goto error;
-
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-static void context_lex_invalidate(struct isl_context *context)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	isl_tab_free(clex->tab);
-	clex->tab = NULL;
-}
-
-static void context_lex_free(struct isl_context *context)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	isl_tab_free(clex->tab);
-	free(clex);
-}
-
-struct isl_context_op isl_context_lex_op = {
-	context_lex_detect_nonnegative_parameters,
-	context_lex_peek_basic_set,
-	context_lex_peek_tab,
-	context_lex_add_eq,
-	context_lex_add_ineq,
-	context_lex_ineq_sign,
-	context_lex_test_ineq,
-	context_lex_get_div,
-	context_lex_add_div,
-	context_lex_detect_equalities,
-	context_lex_best_split,
-	context_lex_is_empty,
-	context_lex_is_ok,
-	context_lex_save,
-	context_lex_restore,
-	context_lex_invalidate,
-	context_lex_free,
-};
-
-static struct isl_tab *context_tab_for_lexmin(struct isl_basic_set *bset)
-{
-	struct isl_tab *tab;
-
-	bset = isl_basic_set_cow(bset);
-	if (!bset)
-		return NULL;
-	tab = tab_for_lexmin((struct isl_basic_map *)bset, NULL, 1, 0);
-	if (!tab)
-		goto error;
-	if (isl_tab_track_bset(tab, bset) < 0)
-		goto error;
-	tab = isl_tab_init_samples(tab);
-	return tab;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-static struct isl_context *isl_context_lex_alloc(struct isl_basic_set *dom)
-{
-	struct isl_context_lex *clex;
-
-	if (!dom)
-		return NULL;
-
-	clex = isl_alloc_type(dom->ctx, struct isl_context_lex);
-	if (!clex)
-		return NULL;
-
-	clex->context.op = &isl_context_lex_op;
-
-	clex->tab = context_tab_for_lexmin(isl_basic_set_copy(dom));
-	if (restore_lexmin(clex->tab) < 0)
-		goto error;
-	clex->tab = check_integer_feasible(clex->tab);
-	if (!clex->tab)
-		goto error;
-
-	return &clex->context;
-error:
-	clex->context.op->free(&clex->context);
-	return NULL;
-}
-
-struct isl_context_gbr {
-	struct isl_context context;
-	struct isl_tab *tab;
-	struct isl_tab *shifted;
-	struct isl_tab *cone;
-};
-
-static struct isl_tab *context_gbr_detect_nonnegative_parameters(
-	struct isl_context *context, struct isl_tab *tab)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	if (!tab)
-		return NULL;
-	return tab_detect_nonnegative_parameters(tab, cgbr->tab);
-}
-
-static struct isl_basic_set *context_gbr_peek_basic_set(
-	struct isl_context *context)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	if (!cgbr->tab)
-		return NULL;
-	return isl_tab_peek_bset(cgbr->tab);
-}
-
-static struct isl_tab *context_gbr_peek_tab(struct isl_context *context)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	return cgbr->tab;
-}
-
-/* Initialize the "shifted" tableau of the context, which
- * contains the constraints of the original tableau shifted
- * by the sum of all negative coefficients.  This ensures
- * that any rational point in the shifted tableau can
- * be rounded up to yield an integer point in the original tableau.
- */
-static void gbr_init_shifted(struct isl_context_gbr *cgbr)
-{
-	int i, j;
-	struct isl_vec *cst;
-	struct isl_basic_set *bset = isl_tab_peek_bset(cgbr->tab);
-	unsigned dim = isl_basic_set_total_dim(bset);
-
-	cst = isl_vec_alloc(cgbr->tab->mat->ctx, bset->n_ineq);
-	if (!cst)
-		return;
-
-	for (i = 0; i < bset->n_ineq; ++i) {
-		isl_int_set(cst->el[i], bset->ineq[i][0]);
-		for (j = 0; j < dim; ++j) {
-			if (!isl_int_is_neg(bset->ineq[i][1 + j]))
-				continue;
-			isl_int_add(bset->ineq[i][0], bset->ineq[i][0],
-				    bset->ineq[i][1 + j]);
-		}
-	}
-
-	cgbr->shifted = isl_tab_from_basic_set(bset);
-
-	for (i = 0; i < bset->n_ineq; ++i)
-		isl_int_set(bset->ineq[i][0], cst->el[i]);
-
-	isl_vec_free(cst);
-}
-
-/* Check if the shifted tableau is non-empty, and if so
- * use the sample point to construct an integer point
- * of the context tableau.
- */
-static struct isl_vec *gbr_get_shifted_sample(struct isl_context_gbr *cgbr)
-{
-	struct isl_vec *sample;
-
-	if (!cgbr->shifted)
-		gbr_init_shifted(cgbr);
-	if (!cgbr->shifted)
-		return NULL;
-	if (cgbr->shifted->empty)
-		return isl_vec_alloc(cgbr->tab->mat->ctx, 0);
-
-	sample = isl_tab_get_sample_value(cgbr->shifted);
-	sample = isl_vec_ceil(sample);
-
-	return sample;
-}
-
-static struct isl_basic_set *drop_constant_terms(struct isl_basic_set *bset)
-{
-	int i;
-
-	if (!bset)
-		return NULL;
-
-	for (i = 0; i < bset->n_eq; ++i)
-		isl_int_set_si(bset->eq[i][0], 0);
-
-	for (i = 0; i < bset->n_ineq; ++i)
-		isl_int_set_si(bset->ineq[i][0], 0);
-
-	return bset;
-}
-
-static int use_shifted(struct isl_context_gbr *cgbr)
-{
-	return cgbr->tab->bmap->n_eq == 0 && cgbr->tab->bmap->n_div == 0;
-}
-
-static struct isl_vec *gbr_get_sample(struct isl_context_gbr *cgbr)
-{
-	struct isl_basic_set *bset;
-	struct isl_basic_set *cone;
-
-	if (isl_tab_sample_is_integer(cgbr->tab))
-		return isl_tab_get_sample_value(cgbr->tab);
-
-	if (use_shifted(cgbr)) {
-		struct isl_vec *sample;
-
-		sample = gbr_get_shifted_sample(cgbr);
-		if (!sample || sample->size > 0)
-			return sample;
-
-		isl_vec_free(sample);
-	}
-
-	if (!cgbr->cone) {
-		bset = isl_tab_peek_bset(cgbr->tab);
-		cgbr->cone = isl_tab_from_recession_cone(bset, 0);
-		if (!cgbr->cone)
-			return NULL;
-		if (isl_tab_track_bset(cgbr->cone, isl_basic_set_dup(bset)) < 0)
-			return NULL;
-	}
-	if (isl_tab_detect_implicit_equalities(cgbr->cone) < 0)
-		return NULL;
-
-	if (cgbr->cone->n_dead == cgbr->cone->n_col) {
-		struct isl_vec *sample;
-		struct isl_tab_undo *snap;
-
-		if (cgbr->tab->basis) {
-			if (cgbr->tab->basis->n_col != 1 + cgbr->tab->n_var) {
-				isl_mat_free(cgbr->tab->basis);
-				cgbr->tab->basis = NULL;
-			}
-			cgbr->tab->n_zero = 0;
-			cgbr->tab->n_unbounded = 0;
-		}
-
-		snap = isl_tab_snap(cgbr->tab);
-
-		sample = isl_tab_sample(cgbr->tab);
-
-		if (isl_tab_rollback(cgbr->tab, snap) < 0) {
-			isl_vec_free(sample);
-			return NULL;
-		}
-
-		return sample;
-	}
-
-	cone = isl_basic_set_dup(isl_tab_peek_bset(cgbr->cone));
-	cone = drop_constant_terms(cone);
-	cone = isl_basic_set_update_from_tab(cone, cgbr->cone);
-	cone = isl_basic_set_underlying_set(cone);
-	cone = isl_basic_set_gauss(cone, NULL);
-
-	bset = isl_basic_set_dup(isl_tab_peek_bset(cgbr->tab));
-	bset = isl_basic_set_update_from_tab(bset, cgbr->tab);
-	bset = isl_basic_set_underlying_set(bset);
-	bset = isl_basic_set_gauss(bset, NULL);
-
-	return isl_basic_set_sample_with_cone(bset, cone);
-}
-
-static void check_gbr_integer_feasible(struct isl_context_gbr *cgbr)
-{
-	struct isl_vec *sample;
-
-	if (!cgbr->tab)
-		return;
-
-	if (cgbr->tab->empty)
-		return;
-
-	sample = gbr_get_sample(cgbr);
-	if (!sample)
-		goto error;
-
-	if (sample->size == 0) {
-		isl_vec_free(sample);
-		if (isl_tab_mark_empty(cgbr->tab) < 0)
-			goto error;
-		return;
-	}
-
-	cgbr->tab = isl_tab_add_sample(cgbr->tab, sample);
-
-	return;
-error:
-	isl_tab_free(cgbr->tab);
-	cgbr->tab = NULL;
-}
-
-static struct isl_tab *add_gbr_eq(struct isl_tab *tab, isl_int *eq)
-{
-	if (!tab)
-		return NULL;
-
-	if (isl_tab_extend_cons(tab, 2) < 0)
-		goto error;
-
-	if (isl_tab_add_eq(tab, eq) < 0)
-		goto error;
-
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-static void context_gbr_add_eq(struct isl_context *context, isl_int *eq,
-		int check, int update)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-
-	cgbr->tab = add_gbr_eq(cgbr->tab, eq);
-
-	if (cgbr->cone && cgbr->cone->n_col != cgbr->cone->n_dead) {
-		if (isl_tab_extend_cons(cgbr->cone, 2) < 0)
-			goto error;
-		if (isl_tab_add_eq(cgbr->cone, eq) < 0)
-			goto error;
-	}
-
-	if (check) {
-		int v = tab_has_valid_sample(cgbr->tab, eq, 1);
-		if (v < 0)
-			goto error;
-		if (!v)
-			check_gbr_integer_feasible(cgbr);
-	}
-	if (update)
-		cgbr->tab = check_samples(cgbr->tab, eq, 1);
-	return;
-error:
-	isl_tab_free(cgbr->tab);
-	cgbr->tab = NULL;
-}
-
-static void add_gbr_ineq(struct isl_context_gbr *cgbr, isl_int *ineq)
-{
-	if (!cgbr->tab)
-		return;
-
-	if (isl_tab_extend_cons(cgbr->tab, 1) < 0)
-		goto error;
-
-	if (isl_tab_add_ineq(cgbr->tab, ineq) < 0)
-		goto error;
-
-	if (cgbr->shifted && !cgbr->shifted->empty && use_shifted(cgbr)) {
-		int i;
-		unsigned dim;
-		dim = isl_basic_map_total_dim(cgbr->tab->bmap);
-
-		if (isl_tab_extend_cons(cgbr->shifted, 1) < 0)
-			goto error;
-
-		for (i = 0; i < dim; ++i) {
-			if (!isl_int_is_neg(ineq[1 + i]))
-				continue;
-			isl_int_add(ineq[0], ineq[0], ineq[1 + i]);
-		}
-
-		if (isl_tab_add_ineq(cgbr->shifted, ineq) < 0)
-			goto error;
-
-		for (i = 0; i < dim; ++i) {
-			if (!isl_int_is_neg(ineq[1 + i]))
-				continue;
-			isl_int_sub(ineq[0], ineq[0], ineq[1 + i]);
-		}
-	}
-
-	if (cgbr->cone && cgbr->cone->n_col != cgbr->cone->n_dead) {
-		if (isl_tab_extend_cons(cgbr->cone, 1) < 0)
-			goto error;
-		if (isl_tab_add_ineq(cgbr->cone, ineq) < 0)
-			goto error;
-	}
-
-	return;
-error:
-	isl_tab_free(cgbr->tab);
-	cgbr->tab = NULL;
-}
-
-static void context_gbr_add_ineq(struct isl_context *context, isl_int *ineq,
-		int check, int update)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-
-	add_gbr_ineq(cgbr, ineq);
-	if (!cgbr->tab)
-		return;
-
-	if (check) {
-		int v = tab_has_valid_sample(cgbr->tab, ineq, 0);
-		if (v < 0)
-			goto error;
-		if (!v)
-			check_gbr_integer_feasible(cgbr);
-	}
-	if (update)
-		cgbr->tab = check_samples(cgbr->tab, ineq, 0);
-	return;
-error:
-	isl_tab_free(cgbr->tab);
-	cgbr->tab = NULL;
-}
-
-static int context_gbr_add_ineq_wrap(void *user, isl_int *ineq)
-{
-	struct isl_context *context = (struct isl_context *)user;
-	context_gbr_add_ineq(context, ineq, 0, 0);
-	return context->op->is_ok(context) ? 0 : -1;
-}
-
-static enum isl_tab_row_sign context_gbr_ineq_sign(struct isl_context *context,
-			isl_int *ineq, int strict)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	return tab_ineq_sign(cgbr->tab, ineq, strict);
-}
-
-/* Check whether "ineq" can be added to the tableau without rendering
- * it infeasible.
- */
-static int context_gbr_test_ineq(struct isl_context *context, isl_int *ineq)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	struct isl_tab_undo *snap;
-	struct isl_tab_undo *shifted_snap = NULL;
-	struct isl_tab_undo *cone_snap = NULL;
-	int feasible;
-
-	if (!cgbr->tab)
-		return -1;
-
-	if (isl_tab_extend_cons(cgbr->tab, 1) < 0)
-		return -1;
-
-	snap = isl_tab_snap(cgbr->tab);
-	if (cgbr->shifted)
-		shifted_snap = isl_tab_snap(cgbr->shifted);
-	if (cgbr->cone)
-		cone_snap = isl_tab_snap(cgbr->cone);
-	add_gbr_ineq(cgbr, ineq);
-	check_gbr_integer_feasible(cgbr);
-	if (!cgbr->tab)
-		return -1;
-	feasible = !cgbr->tab->empty;
-	if (isl_tab_rollback(cgbr->tab, snap) < 0)
-		return -1;
-	if (shifted_snap) {
-		if (isl_tab_rollback(cgbr->shifted, shifted_snap))
-			return -1;
-	} else if (cgbr->shifted) {
-		isl_tab_free(cgbr->shifted);
-		cgbr->shifted = NULL;
-	}
-	if (cone_snap) {
-		if (isl_tab_rollback(cgbr->cone, cone_snap))
-			return -1;
-	} else if (cgbr->cone) {
-		isl_tab_free(cgbr->cone);
-		cgbr->cone = NULL;
-	}
-
-	return feasible;
-}
-
-/* Return the column of the last of the variables associated to
- * a column that has a non-zero coefficient.
- * This function is called in a context where only coefficients
- * of parameters or divs can be non-zero.
- */
-static int last_non_zero_var_col(struct isl_tab *tab, isl_int *p)
-{
-	int i;
-	int col;
-
-	if (tab->n_var == 0)
-		return -1;
-
-	for (i = tab->n_var - 1; i >= 0; --i) {
-		if (i >= tab->n_param && i < tab->n_var - tab->n_div)
-			continue;
-		if (tab->var[i].is_row)
-			continue;
-		col = tab->var[i].index;
-		if (!isl_int_is_zero(p[col]))
-			return col;
-	}
-
-	return -1;
-}
-
-/* Look through all the recently added equalities in the context
- * to see if we can propagate any of them to the main tableau.
- *
- * The newly added equalities in the context are encoded as pairs
- * of inequalities starting at inequality "first".
- *
- * We tentatively add each of these equalities to the main tableau
- * and if this happens to result in a row with a final coefficient
- * that is one or negative one, we use it to kill a column
- * in the main tableau.  Otherwise, we discard the tentatively
- * added row.
- */
-static void propagate_equalities(struct isl_context_gbr *cgbr,
-	struct isl_tab *tab, unsigned first)
-{
-	int i;
-	struct isl_vec *eq = NULL;
-
-	eq = isl_vec_alloc(tab->mat->ctx, 1 + tab->n_var);
-	if (!eq)
-		goto error;
-
-	if (isl_tab_extend_cons(tab, (cgbr->tab->bmap->n_ineq - first)/2) < 0)
-		goto error;
-
-	isl_seq_clr(eq->el + 1 + tab->n_param,
-		    tab->n_var - tab->n_param - tab->n_div);
-	for (i = first; i < cgbr->tab->bmap->n_ineq; i += 2) {
-		int j;
-		int r;
-		struct isl_tab_undo *snap;
-		snap = isl_tab_snap(tab);
-
-		isl_seq_cpy(eq->el, cgbr->tab->bmap->ineq[i], 1 + tab->n_param);
-		isl_seq_cpy(eq->el + 1 + tab->n_var - tab->n_div,
-			    cgbr->tab->bmap->ineq[i] + 1 + tab->n_param,
-			    tab->n_div);
-
-		r = isl_tab_add_row(tab, eq->el);
-		if (r < 0)
-			goto error;
-		r = tab->con[r].index;
-		j = last_non_zero_var_col(tab, tab->mat->row[r] + 2 + tab->M);
-		if (j < 0 || j < tab->n_dead ||
-		    !isl_int_is_one(tab->mat->row[r][0]) ||
-		    (!isl_int_is_one(tab->mat->row[r][2 + tab->M + j]) &&
-		     !isl_int_is_negone(tab->mat->row[r][2 + tab->M + j]))) {
-			if (isl_tab_rollback(tab, snap) < 0)
-				goto error;
-			continue;
-		}
-		if (isl_tab_pivot(tab, r, j) < 0)
-			goto error;
-		if (isl_tab_kill_col(tab, j) < 0)
-			goto error;
-
-		if (restore_lexmin(tab) < 0)
-			goto error;
-	}
-
-	isl_vec_free(eq);
-
-	return;
-error:
-	isl_vec_free(eq);
-	isl_tab_free(cgbr->tab);
-	cgbr->tab = NULL;
-}
-
-static int context_gbr_detect_equalities(struct isl_context *context,
-	struct isl_tab *tab)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	struct isl_ctx *ctx;
-	unsigned n_ineq;
-
-	ctx = cgbr->tab->mat->ctx;
-
-	if (!cgbr->cone) {
-		struct isl_basic_set *bset = isl_tab_peek_bset(cgbr->tab);
-		cgbr->cone = isl_tab_from_recession_cone(bset, 0);
-		if (!cgbr->cone)
-			goto error;
-		if (isl_tab_track_bset(cgbr->cone, isl_basic_set_dup(bset)) < 0)
-			goto error;
-	}
-	if (isl_tab_detect_implicit_equalities(cgbr->cone) < 0)
-		goto error;
-
-	n_ineq = cgbr->tab->bmap->n_ineq;
-	cgbr->tab = isl_tab_detect_equalities(cgbr->tab, cgbr->cone);
-	if (cgbr->tab && cgbr->tab->bmap->n_ineq > n_ineq)
-		propagate_equalities(cgbr, tab, n_ineq);
-
-	return 0;
-error:
-	isl_tab_free(cgbr->tab);
-	cgbr->tab = NULL;
-	return -1;
-}
-
-static int context_gbr_get_div(struct isl_context *context, struct isl_tab *tab,
-		struct isl_vec *div)
-{
-	return get_div(tab, context, div);
-}
-
-static int context_gbr_add_div(struct isl_context *context, struct isl_vec *div)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	if (cgbr->cone) {
-		int k;
-
-		if (isl_tab_extend_cons(cgbr->cone, 3) < 0)
-			return -1;
-		if (isl_tab_extend_vars(cgbr->cone, 1) < 0)
-			return -1;
-		if (isl_tab_allocate_var(cgbr->cone) <0)
-			return -1;
-
-		cgbr->cone->bmap = isl_basic_map_extend_dim(cgbr->cone->bmap,
-			isl_basic_map_get_dim(cgbr->cone->bmap), 1, 0, 2);
-		k = isl_basic_map_alloc_div(cgbr->cone->bmap);
-		if (k < 0)
-			return -1;
-		isl_seq_cpy(cgbr->cone->bmap->div[k], div->el, div->size);
-		if (isl_tab_push(cgbr->cone, isl_tab_undo_bmap_div) < 0)
-			return -1;
-	}
-	return context_tab_add_div(cgbr->tab, div,
-					context_gbr_add_ineq_wrap, context);
-}
-
-static int context_gbr_best_split(struct isl_context *context,
-		struct isl_tab *tab)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	struct isl_tab_undo *snap;
-	int r;
-
-	snap = isl_tab_snap(cgbr->tab);
-	r = best_split(tab, cgbr->tab);
-
-	if (r >= 0 && isl_tab_rollback(cgbr->tab, snap) < 0)
-		return -1;
-
-	return r;
-}
-
-static int context_gbr_is_empty(struct isl_context *context)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	if (!cgbr->tab)
-		return -1;
-	return cgbr->tab->empty;
-}
-
-struct isl_gbr_tab_undo {
-	struct isl_tab_undo *tab_snap;
-	struct isl_tab_undo *shifted_snap;
-	struct isl_tab_undo *cone_snap;
-};
-
-static void *context_gbr_save(struct isl_context *context)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	struct isl_gbr_tab_undo *snap;
-
-	snap = isl_alloc_type(cgbr->tab->mat->ctx, struct isl_gbr_tab_undo);
-	if (!snap)
-		return NULL;
-
-	snap->tab_snap = isl_tab_snap(cgbr->tab);
-	if (isl_tab_save_samples(cgbr->tab) < 0)
-		goto error;
-
-	if (cgbr->shifted)
-		snap->shifted_snap = isl_tab_snap(cgbr->shifted);
-	else
-		snap->shifted_snap = NULL;
-
-	if (cgbr->cone)
-		snap->cone_snap = isl_tab_snap(cgbr->cone);
-	else
-		snap->cone_snap = NULL;
-
-	return snap;
-error:
-	free(snap);
-	return NULL;
-}
-
-static void context_gbr_restore(struct isl_context *context, void *save)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	struct isl_gbr_tab_undo *snap = (struct isl_gbr_tab_undo *)save;
-	if (!snap)
-		goto error;
-	if (isl_tab_rollback(cgbr->tab, snap->tab_snap) < 0) {
-		isl_tab_free(cgbr->tab);
-		cgbr->tab = NULL;
-	}
-
-	if (snap->shifted_snap) {
-		if (isl_tab_rollback(cgbr->shifted, snap->shifted_snap) < 0)
-			goto error;
-	} else if (cgbr->shifted) {
-		isl_tab_free(cgbr->shifted);
-		cgbr->shifted = NULL;
-	}
-
-	if (snap->cone_snap) {
-		if (isl_tab_rollback(cgbr->cone, snap->cone_snap) < 0)
-			goto error;
-	} else if (cgbr->cone) {
-		isl_tab_free(cgbr->cone);
-		cgbr->cone = NULL;
-	}
-
-	free(snap);
-
-	return;
-error:
-	free(snap);
-	isl_tab_free(cgbr->tab);
-	cgbr->tab = NULL;
-}
-
-static int context_gbr_is_ok(struct isl_context *context)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	return !!cgbr->tab;
-}
-
-static void context_gbr_invalidate(struct isl_context *context)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	isl_tab_free(cgbr->tab);
-	cgbr->tab = NULL;
-}
-
-static void context_gbr_free(struct isl_context *context)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	isl_tab_free(cgbr->tab);
-	isl_tab_free(cgbr->shifted);
-	isl_tab_free(cgbr->cone);
-	free(cgbr);
-}
-
-struct isl_context_op isl_context_gbr_op = {
-	context_gbr_detect_nonnegative_parameters,
-	context_gbr_peek_basic_set,
-	context_gbr_peek_tab,
-	context_gbr_add_eq,
-	context_gbr_add_ineq,
-	context_gbr_ineq_sign,
-	context_gbr_test_ineq,
-	context_gbr_get_div,
-	context_gbr_add_div,
-	context_gbr_detect_equalities,
-	context_gbr_best_split,
-	context_gbr_is_empty,
-	context_gbr_is_ok,
-	context_gbr_save,
-	context_gbr_restore,
-	context_gbr_invalidate,
-	context_gbr_free,
-};
-
-static struct isl_context *isl_context_gbr_alloc(struct isl_basic_set *dom)
-{
-	struct isl_context_gbr *cgbr;
-
-	if (!dom)
-		return NULL;
-
-	cgbr = isl_calloc_type(dom->ctx, struct isl_context_gbr);
-	if (!cgbr)
-		return NULL;
-
-	cgbr->context.op = &isl_context_gbr_op;
-
-	cgbr->shifted = NULL;
-	cgbr->cone = NULL;
-	cgbr->tab = isl_tab_from_basic_set(dom);
-	cgbr->tab = isl_tab_init_samples(cgbr->tab);
-	if (!cgbr->tab)
-		goto error;
-	if (isl_tab_track_bset(cgbr->tab,
-				isl_basic_set_cow(isl_basic_set_copy(dom))) < 0)
-		goto error;
-	check_gbr_integer_feasible(cgbr);
-
-	return &cgbr->context;
-error:
-	cgbr->context.op->free(&cgbr->context);
-	return NULL;
-}
-
-static struct isl_context *isl_context_alloc(struct isl_basic_set *dom)
-{
-	if (!dom)
-		return NULL;
-
-	if (dom->ctx->opt->context == ISL_CONTEXT_LEXMIN)
-		return isl_context_lex_alloc(dom);
-	else
-		return isl_context_gbr_alloc(dom);
-}
-
-/* Construct an isl_sol_map structure for accumulating the solution.
- * If track_empty is set, then we also keep track of the parts
- * of the context where there is no solution.
- * If max is set, then we are solving a maximization, rather than
- * a minimization problem, which means that the variables in the
- * tableau have value "M - x" rather than "M + x".
- */
-static struct isl_sol_map *sol_map_init(struct isl_basic_map *bmap,
-	struct isl_basic_set *dom, int track_empty, int max)
-{
-	struct isl_sol_map *sol_map = NULL;
-
-	if (!bmap)
-		goto error;
-
-	sol_map = isl_calloc_type(bmap->ctx, struct isl_sol_map);
-	if (!sol_map)
-		goto error;
-
-	sol_map->sol.rational = ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL);
-	sol_map->sol.dec_level.callback.run = &sol_dec_level_wrap;
-	sol_map->sol.dec_level.sol = &sol_map->sol;
-	sol_map->sol.max = max;
-	sol_map->sol.n_out = isl_basic_map_dim(bmap, isl_dim_out);
-	sol_map->sol.add = &sol_map_add_wrap;
-	sol_map->sol.add_empty = track_empty ? &sol_map_add_empty_wrap : NULL;
-	sol_map->sol.free = &sol_map_free_wrap;
-	sol_map->map = isl_map_alloc_dim(isl_basic_map_get_dim(bmap), 1,
-					    ISL_MAP_DISJOINT);
-	if (!sol_map->map)
-		goto error;
-
-	sol_map->sol.context = isl_context_alloc(dom);
-	if (!sol_map->sol.context)
-		goto error;
-
-	if (track_empty) {
-		sol_map->empty = isl_set_alloc_dim(isl_basic_set_get_dim(dom),
-							1, ISL_SET_DISJOINT);
-		if (!sol_map->empty)
-			goto error;
-	}
-
-	isl_basic_set_free(dom);
-	return sol_map;
-error:
-	isl_basic_set_free(dom);
-	sol_map_free(sol_map);
-	return NULL;
-}
-
-/* Check whether all coefficients of (non-parameter) variables
- * are non-positive, meaning that no pivots can be performed on the row.
- */
-static int is_critical(struct isl_tab *tab, int row)
-{
-	int j;
-	unsigned off = 2 + tab->M;
-
-	for (j = tab->n_dead; j < tab->n_col; ++j) {
-		if (tab->col_var[j] >= 0 &&
-		    (tab->col_var[j] < tab->n_param  ||
-		    tab->col_var[j] >= tab->n_var - tab->n_div))
-			continue;
-
-		if (isl_int_is_pos(tab->mat->row[row][off + j]))
-			return 0;
-	}
-
-	return 1;
-}
-
-/* Check whether the inequality represented by vec is strict over the integers,
- * i.e., there are no integer values satisfying the constraint with
- * equality.  This happens if the gcd of the coefficients is not a divisor
- * of the constant term.  If so, scale the constraint down by the gcd
- * of the coefficients.
- */
-static int is_strict(struct isl_vec *vec)
-{
-	isl_int gcd;
-	int strict = 0;
-
-	isl_int_init(gcd);
-	isl_seq_gcd(vec->el + 1, vec->size - 1, &gcd);
-	if (!isl_int_is_one(gcd)) {
-		strict = !isl_int_is_divisible_by(vec->el[0], gcd);
-		isl_int_fdiv_q(vec->el[0], vec->el[0], gcd);
-		isl_seq_scale_down(vec->el + 1, vec->el + 1, gcd, vec->size-1);
-	}
-	isl_int_clear(gcd);
-
-	return strict;
-}
-
-/* Determine the sign of the given row of the main tableau.
- * The result is one of
- *	isl_tab_row_pos: always non-negative; no pivot needed
- *	isl_tab_row_neg: always non-positive; pivot
- *	isl_tab_row_any: can be both positive and negative; split
- *
- * We first handle some simple cases
- *	- the row sign may be known already
- *	- the row may be obviously non-negative
- *	- the parametric constant may be equal to that of another row
- *	  for which we know the sign.  This sign will be either "pos" or
- *	  "any".  If it had been "neg" then we would have pivoted before.
- *
- * If none of these cases hold, we check the value of the row for each
- * of the currently active samples.  Based on the signs of these values
- * we make an initial determination of the sign of the row.
- *
- *	all zero			->	unk(nown)
- *	all non-negative		->	pos
- *	all non-positive		->	neg
- *	both negative and positive	->	all
- *
- * If we end up with "all", we are done.
- * Otherwise, we perform a check for positive and/or negative
- * values as follows.
- *
- *	samples	       neg	       unk	       pos
- *	<0 ?			    Y        N	    Y        N
- *					    pos    any      pos
- *	>0 ?	     Y      N	 Y     N
- *		    any    neg  any   neg
- *
- * There is no special sign for "zero", because we can usually treat zero
- * as either non-negative or non-positive, whatever works out best.
- * However, if the row is "critical", meaning that pivoting is impossible
- * then we don't want to limp zero with the non-positive case, because
- * then we we would lose the solution for those values of the parameters
- * where the value of the row is zero.  Instead, we treat 0 as non-negative
- * ensuring a split if the row can attain both zero and negative values.
- * The same happens when the original constraint was one that could not
- * be satisfied with equality by any integer values of the parameters.
- * In this case, we normalize the constraint, but then a value of zero
- * for the normalized constraint is actually a positive value for the
- * original constraint, so again we need to treat zero as non-negative.
- * In both these cases, we have the following decision tree instead:
- *
- *	all non-negative		->	pos
- *	all negative			->	neg
- *	both negative and non-negative	->	all
- *
- *	samples	       neg	          	       pos
- *	<0 ?			             	    Y        N
- *					           any      pos
- *	>=0 ?	     Y      N
- *		    any    neg
- */
-static enum isl_tab_row_sign row_sign(struct isl_tab *tab,
-	struct isl_sol *sol, int row)
-{
-	struct isl_vec *ineq = NULL;
-	enum isl_tab_row_sign res = isl_tab_row_unknown;
-	int critical;
-	int strict;
-	int row2;
-
-	if (tab->row_sign[row] != isl_tab_row_unknown)
-		return tab->row_sign[row];
-	if (is_obviously_nonneg(tab, row))
-		return isl_tab_row_pos;
-	for (row2 = tab->n_redundant; row2 < tab->n_row; ++row2) {
-		if (tab->row_sign[row2] == isl_tab_row_unknown)
-			continue;
-		if (identical_parameter_line(tab, row, row2))
-			return tab->row_sign[row2];
-	}
-
-	critical = is_critical(tab, row);
-
-	ineq = get_row_parameter_ineq(tab, row);
-	if (!ineq)
-		goto error;
-
-	strict = is_strict(ineq);
-
-	res = sol->context->op->ineq_sign(sol->context, ineq->el,
-					  critical || strict);
-
-	if (res == isl_tab_row_unknown || res == isl_tab_row_pos) {
-		/* test for negative values */
-		int feasible;
-		isl_seq_neg(ineq->el, ineq->el, ineq->size);
-		isl_int_sub_ui(ineq->el[0], ineq->el[0], 1);
-
-		feasible = sol->context->op->test_ineq(sol->context, ineq->el);
-		if (feasible < 0)
-			goto error;
-		if (!feasible)
-			res = isl_tab_row_pos;
-		else
-			res = (res == isl_tab_row_unknown) ? isl_tab_row_neg
-							   : isl_tab_row_any;
-		if (res == isl_tab_row_neg) {
-			isl_seq_neg(ineq->el, ineq->el, ineq->size);
-			isl_int_sub_ui(ineq->el[0], ineq->el[0], 1);
-		}
-	}
-
-	if (res == isl_tab_row_neg) {
-		/* test for positive values */
-		int feasible;
-		if (!critical && !strict)
-			isl_int_sub_ui(ineq->el[0], ineq->el[0], 1);
-
-		feasible = sol->context->op->test_ineq(sol->context, ineq->el);
-		if (feasible < 0)
-			goto error;
-		if (feasible)
-			res = isl_tab_row_any;
-	}
-
-	isl_vec_free(ineq);
-	return res;
-error:
-	isl_vec_free(ineq);
-	return isl_tab_row_unknown;
-}
-
-static void find_solutions(struct isl_sol *sol, struct isl_tab *tab);
-
-/* Find solutions for values of the parameters that satisfy the given
- * inequality.
- *
- * We currently take a snapshot of the context tableau that is reset
- * when we return from this function, while we make a copy of the main
- * tableau, leaving the original main tableau untouched.
- * These are fairly arbitrary choices.  Making a copy also of the context
- * tableau would obviate the need to undo any changes made to it later,
- * while taking a snapshot of the main tableau could reduce memory usage.
- * If we were to switch to taking a snapshot of the main tableau,
- * we would have to keep in mind that we need to save the row signs
- * and that we need to do this before saving the current basis
- * such that the basis has been restore before we restore the row signs.
- */
-static void find_in_pos(struct isl_sol *sol, struct isl_tab *tab, isl_int *ineq)
-{
-	void *saved;
-
-	if (!sol->context)
-		goto error;
-	saved = sol->context->op->save(sol->context);
-
-	tab = isl_tab_dup(tab);
-	if (!tab)
-		goto error;
-
-	sol->context->op->add_ineq(sol->context, ineq, 0, 1);
-
-	find_solutions(sol, tab);
-
-	if (!sol->error)
-		sol->context->op->restore(sol->context, saved);
-	return;
-error:
-	sol->error = 1;
-}
-
-/* Record the absence of solutions for those values of the parameters
- * that do not satisfy the given inequality with equality.
- */
-static void no_sol_in_strict(struct isl_sol *sol,
-	struct isl_tab *tab, struct isl_vec *ineq)
-{
-	int empty;
-	void *saved;
-
-	if (!sol->context || sol->error)
-		goto error;
-	saved = sol->context->op->save(sol->context);
-
-	isl_int_sub_ui(ineq->el[0], ineq->el[0], 1);
-
-	sol->context->op->add_ineq(sol->context, ineq->el, 1, 0);
-	if (!sol->context)
-		goto error;
-
-	empty = tab->empty;
-	tab->empty = 1;
-	sol_add(sol, tab);
-	tab->empty = empty;
-
-	isl_int_add_ui(ineq->el[0], ineq->el[0], 1);
-
-	sol->context->op->restore(sol->context, saved);
-	return;
-error:
-	sol->error = 1;
-}
-
-/* Compute the lexicographic minimum of the set represented by the main
- * tableau "tab" within the context "sol->context_tab".
- * On entry the sample value of the main tableau is lexicographically
- * less than or equal to this lexicographic minimum.
- * Pivots are performed until a feasible point is found, which is then
- * necessarily equal to the minimum, or until the tableau is found to
- * be infeasible.  Some pivots may need to be performed for only some
- * feasible values of the context tableau.  If so, the context tableau
- * is split into a part where the pivot is needed and a part where it is not.
- *
- * Whenever we enter the main loop, the main tableau is such that no
- * "obvious" pivots need to be performed on it, where "obvious" means
- * that the given row can be seen to be negative without looking at
- * the context tableau.  In particular, for non-parametric problems,
- * no pivots need to be performed on the main tableau.
- * The caller of find_solutions is responsible for making this property
- * hold prior to the first iteration of the loop, while restore_lexmin
- * is called before every other iteration.
- *
- * Inside the main loop, we first examine the signs of the rows of
- * the main tableau within the context of the context tableau.
- * If we find a row that is always non-positive for all values of
- * the parameters satisfying the context tableau and negative for at
- * least one value of the parameters, we perform the appropriate pivot
- * and start over.  An exception is the case where no pivot can be
- * performed on the row.  In this case, we require that the sign of
- * the row is negative for all values of the parameters (rather than just
- * non-positive).  This special case is handled inside row_sign, which
- * will say that the row can have any sign if it determines that it can
- * attain both negative and zero values.
- *
- * If we can't find a row that always requires a pivot, but we can find
- * one or more rows that require a pivot for some values of the parameters
- * (i.e., the row can attain both positive and negative signs), then we split
- * the context tableau into two parts, one where we force the sign to be
- * non-negative and one where we force is to be negative.
- * The non-negative part is handled by a recursive call (through find_in_pos).
- * Upon returning from this call, we continue with the negative part and
- * perform the required pivot.
- *
- * If no such rows can be found, all rows are non-negative and we have
- * found a (rational) feasible point.  If we only wanted a rational point
- * then we are done.
- * Otherwise, we check if all values of the sample point of the tableau
- * are integral for the variables.  If so, we have found the minimal
- * integral point and we are done.
- * If the sample point is not integral, then we need to make a distinction
- * based on whether the constant term is non-integral or the coefficients
- * of the parameters.  Furthermore, in order to decide how to handle
- * the non-integrality, we also need to know whether the coefficients
- * of the other columns in the tableau are integral.  This leads
- * to the following table.  The first two rows do not correspond
- * to a non-integral sample point and are only mentioned for completeness.
- *
- *	constant	parameters	other
- *
- *	int		int		int	|
- *	int		int		rat	| -> no problem
- *
- *	rat		int		int	  -> fail
- *
- *	rat		int		rat	  -> cut
- *
- *	int		rat		rat	|
- *	rat		rat		rat	| -> parametric cut
- *
- *	int		rat		int	|
- *	rat		rat		int	| -> split context
- *
- * If the parametric constant is completely integral, then there is nothing
- * to be done.  If the constant term is non-integral, but all the other
- * coefficient are integral, then there is nothing that can be done
- * and the tableau has no integral solution.
- * If, on the other hand, one or more of the other columns have rational
- * coefficients, but the parameter coefficients are all integral, then
- * we can perform a regular (non-parametric) cut.
- * Finally, if there is any parameter coefficient that is non-integral,
- * then we need to involve the context tableau.  There are two cases here.
- * If at least one other column has a rational coefficient, then we
- * can perform a parametric cut in the main tableau by adding a new
- * integer division in the context tableau.
- * If all other columns have integral coefficients, then we need to
- * enforce that the rational combination of parameters (c + \sum a_i y_i)/m
- * is always integral.  We do this by introducing an integer division
- * q = floor((c + \sum a_i y_i)/m) and stipulating that its argument should
- * always be integral in the context tableau, i.e., m q = c + \sum a_i y_i.
- * Since q is expressed in the tableau as
- *	c + \sum a_i y_i - m q >= 0
- *	-c - \sum a_i y_i + m q + m - 1 >= 0
- * it is sufficient to add the inequality
- *	-c - \sum a_i y_i + m q >= 0
- * In the part of the context where this inequality does not hold, the
- * main tableau is marked as being empty.
- */
-static void find_solutions(struct isl_sol *sol, struct isl_tab *tab)
-{
-	struct isl_context *context;
-	int r;
-
-	if (!tab || sol->error)
-		goto error;
-
-	context = sol->context;
-
-	if (tab->empty)
-		goto done;
-	if (context->op->is_empty(context))
-		goto done;
-
-	for (r = 0; r >= 0 && tab && !tab->empty; r = restore_lexmin(tab)) {
-		int flags;
-		int row;
-		enum isl_tab_row_sign sgn;
-		int split = -1;
-		int n_split = 0;
-
-		for (row = tab->n_redundant; row < tab->n_row; ++row) {
-			if (!isl_tab_var_from_row(tab, row)->is_nonneg)
-				continue;
-			sgn = row_sign(tab, sol, row);
-			if (!sgn)
-				goto error;
-			tab->row_sign[row] = sgn;
-			if (sgn == isl_tab_row_any)
-				n_split++;
-			if (sgn == isl_tab_row_any && split == -1)
-				split = row;
-			if (sgn == isl_tab_row_neg)
-				break;
-		}
-		if (row < tab->n_row)
-			continue;
-		if (split != -1) {
-			struct isl_vec *ineq;
-			if (n_split != 1)
-				split = context->op->best_split(context, tab);
-			if (split < 0)
-				goto error;
-			ineq = get_row_parameter_ineq(tab, split);
-			if (!ineq)
-				goto error;
-			is_strict(ineq);
-			for (row = tab->n_redundant; row < tab->n_row; ++row) {
-				if (!isl_tab_var_from_row(tab, row)->is_nonneg)
-					continue;
-				if (tab->row_sign[row] == isl_tab_row_any)
-					tab->row_sign[row] = isl_tab_row_unknown;
-			}
-			tab->row_sign[split] = isl_tab_row_pos;
-			sol_inc_level(sol);
-			find_in_pos(sol, tab, ineq->el);
-			tab->row_sign[split] = isl_tab_row_neg;
-			row = split;
-			isl_seq_neg(ineq->el, ineq->el, ineq->size);
-			isl_int_sub_ui(ineq->el[0], ineq->el[0], 1);
-			if (!sol->error)
-				context->op->add_ineq(context, ineq->el, 0, 1);
-			isl_vec_free(ineq);
-			if (sol->error)
-				goto error;
-			continue;
-		}
-		if (tab->rational)
-			break;
-		row = first_non_integer_row(tab, &flags);
-		if (row < 0)
-			break;
-		if (ISL_FL_ISSET(flags, I_PAR)) {
-			if (ISL_FL_ISSET(flags, I_VAR)) {
-				if (isl_tab_mark_empty(tab) < 0)
-					goto error;
-				break;
-			}
-			row = add_cut(tab, row);
-		} else if (ISL_FL_ISSET(flags, I_VAR)) {
-			struct isl_vec *div;
-			struct isl_vec *ineq;
-			int d;
-			div = get_row_split_div(tab, row);
-			if (!div)
-				goto error;
-			d = context->op->get_div(context, tab, div);
-			isl_vec_free(div);
-			if (d < 0)
-				goto error;
-			ineq = ineq_for_div(context->op->peek_basic_set(context), d);
-			if (!ineq)
-				goto error;
-			sol_inc_level(sol);
-			no_sol_in_strict(sol, tab, ineq);
-			isl_seq_neg(ineq->el, ineq->el, ineq->size);
-			context->op->add_ineq(context, ineq->el, 1, 1);
-			isl_vec_free(ineq);
-			if (sol->error || !context->op->is_ok(context))
-				goto error;
-			tab = set_row_cst_to_div(tab, row, d);
-			if (context->op->is_empty(context))
-				break;
-		} else
-			row = add_parametric_cut(tab, row, context);
-		if (row < 0)
-			goto error;
-	}
-	if (r < 0)
-		goto error;
-done:
-	sol_add(sol, tab);
-	isl_tab_free(tab);
-	return;
-error:
-	isl_tab_free(tab);
-	sol->error = 1;
-}
-
-/* Compute the lexicographic minimum of the set represented by the main
- * tableau "tab" within the context "sol->context_tab".
- *
- * As a preprocessing step, we first transfer all the purely parametric
- * equalities from the main tableau to the context tableau, i.e.,
- * parameters that have been pivoted to a row.
- * These equalities are ignored by the main algorithm, because the
- * corresponding rows may not be marked as being non-negative.
- * In parts of the context where the added equality does not hold,
- * the main tableau is marked as being empty.
- */
-static void find_solutions_main(struct isl_sol *sol, struct isl_tab *tab)
-{
-	int row;
-
-	if (!tab)
-		goto error;
-
-	sol->level = 0;
-
-	for (row = tab->n_redundant; row < tab->n_row; ++row) {
-		int p;
-		struct isl_vec *eq;
-
-		if (tab->row_var[row] < 0)
-			continue;
-		if (tab->row_var[row] >= tab->n_param &&
-		    tab->row_var[row] < tab->n_var - tab->n_div)
-			continue;
-		if (tab->row_var[row] < tab->n_param)
-			p = tab->row_var[row];
-		else
-			p = tab->row_var[row]
-				+ tab->n_param - (tab->n_var - tab->n_div);
-
-		eq = isl_vec_alloc(tab->mat->ctx, 1+tab->n_param+tab->n_div);
-		if (!eq)
-			goto error;
-		get_row_parameter_line(tab, row, eq->el);
-		isl_int_neg(eq->el[1 + p], tab->mat->row[row][0]);
-		eq = isl_vec_normalize(eq);
-
-		sol_inc_level(sol);
-		no_sol_in_strict(sol, tab, eq);
-
-		isl_seq_neg(eq->el, eq->el, eq->size);
-		sol_inc_level(sol);
-		no_sol_in_strict(sol, tab, eq);
-		isl_seq_neg(eq->el, eq->el, eq->size);
-
-		sol->context->op->add_eq(sol->context, eq->el, 1, 1);
-
-		isl_vec_free(eq);
-
-		if (isl_tab_mark_redundant(tab, row) < 0)
-			goto error;
-
-		if (sol->context->op->is_empty(sol->context))
-			break;
-
-		row = tab->n_redundant - 1;
-	}
-
-	find_solutions(sol, tab);
-
-	sol->level = 0;
-	sol_pop(sol);
-
-	return;
-error:
-	isl_tab_free(tab);
-	sol->error = 1;
-}
-
-static void sol_map_find_solutions(struct isl_sol_map *sol_map,
-	struct isl_tab *tab)
-{
-	find_solutions_main(&sol_map->sol, tab);
-}
-
-/* Check if integer division "div" of "dom" also occurs in "bmap".
- * If so, return its position within the divs.
- * If not, return -1.
- */
-static int find_context_div(struct isl_basic_map *bmap,
-	struct isl_basic_set *dom, unsigned div)
-{
-	int i;
-	unsigned b_dim = isl_dim_total(bmap->dim);
-	unsigned d_dim = isl_dim_total(dom->dim);
-
-	if (isl_int_is_zero(dom->div[div][0]))
-		return -1;
-	if (isl_seq_first_non_zero(dom->div[div] + 2 + d_dim, dom->n_div) != -1)
-		return -1;
-
-	for (i = 0; i < bmap->n_div; ++i) {
-		if (isl_int_is_zero(bmap->div[i][0]))
-			continue;
-		if (isl_seq_first_non_zero(bmap->div[i] + 2 + d_dim,
-					   (b_dim - d_dim) + bmap->n_div) != -1)
-			continue;
-		if (isl_seq_eq(bmap->div[i], dom->div[div], 2 + d_dim))
-			return i;
-	}
-	return -1;
-}
-
-/* The correspondence between the variables in the main tableau,
- * the context tableau, and the input map and domain is as follows.
- * The first n_param and the last n_div variables of the main tableau
- * form the variables of the context tableau.
- * In the basic map, these n_param variables correspond to the
- * parameters and the input dimensions.  In the domain, they correspond
- * to the parameters and the set dimensions.
- * The n_div variables correspond to the integer divisions in the domain.
- * To ensure that everything lines up, we may need to copy some of the
- * integer divisions of the domain to the map.  These have to be placed
- * in the same order as those in the context and they have to be placed
- * after any other integer divisions that the map may have.
- * This function performs the required reordering.
- */
-static struct isl_basic_map *align_context_divs(struct isl_basic_map *bmap,
-	struct isl_basic_set *dom)
-{
-	int i;
-	int common = 0;
-	int other;
-
-	for (i = 0; i < dom->n_div; ++i)
-		if (find_context_div(bmap, dom, i) != -1)
-			common++;
-	other = bmap->n_div - common;
-	if (dom->n_div - common > 0) {
-		bmap = isl_basic_map_extend_dim(bmap, isl_dim_copy(bmap->dim),
-				dom->n_div - common, 0, 0);
-		if (!bmap)
-			return NULL;
-	}
-	for (i = 0; i < dom->n_div; ++i) {
-		int pos = find_context_div(bmap, dom, i);
-		if (pos < 0) {
-			pos = isl_basic_map_alloc_div(bmap);
-			if (pos < 0)
-				goto error;
-			isl_int_set_si(bmap->div[pos][0], 0);
-		}
-		if (pos != other + i)
-			isl_basic_map_swap_div(bmap, pos, other + i);
-	}
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Base case of isl_tab_basic_map_partial_lexopt, after removing
- * some obvious symmetries.
- *
- * We make sure the divs in the domain are properly ordered,
- * because they will be added one by one in the given order
- * during the construction of the solution map.
- */
-static __isl_give isl_map *basic_map_partial_lexopt_base(
-	__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty, int max)
-{
-	isl_map *result = NULL;
-	struct isl_tab *tab;
-	struct isl_sol_map *sol_map = NULL;
-	struct isl_context *context;
-
-	if (dom->n_div) {
-		dom = isl_basic_set_order_divs(dom);
-		bmap = align_context_divs(bmap, dom);
-	}
-	sol_map = sol_map_init(bmap, dom, !!empty, max);
-	if (!sol_map)
-		goto error;
-
-	context = sol_map->sol.context;
-	if (isl_basic_set_plain_is_empty(context->op->peek_basic_set(context)))
-		/* nothing */;
-	else if (isl_basic_map_plain_is_empty(bmap))
-		sol_map_add_empty_if_needed(sol_map,
-		    isl_basic_set_copy(context->op->peek_basic_set(context)));
-	else {
-		tab = tab_for_lexmin(bmap,
-				    context->op->peek_basic_set(context), 1, max);
-		tab = context->op->detect_nonnegative_parameters(context, tab);
-		sol_map_find_solutions(sol_map, tab);
-	}
-	if (sol_map->sol.error)
-		goto error;
-
-	result = isl_map_copy(sol_map->map);
-	if (empty)
-		*empty = isl_set_copy(sol_map->empty);
-	sol_free(&sol_map->sol);
-	isl_basic_map_free(bmap);
-	return result;
-error:
-	sol_free(&sol_map->sol);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Structure used during detection of parallel constraints.
- * n_in: number of "input" variables: isl_dim_param + isl_dim_in
- * n_out: number of "output" variables: isl_dim_out + isl_dim_div
- * val: the coefficients of the output variables
- */
-struct isl_constraint_equal_info {
-	isl_basic_map *bmap;
-	unsigned n_in;
-	unsigned n_out;
-	isl_int *val;
-};
-
-/* Check whether the coefficients of the output variables
- * of the constraint in "entry" are equal to info->val.
- */
-static int constraint_equal(const void *entry, const void *val)
-{
-	isl_int **row = (isl_int **)entry;
-	const struct isl_constraint_equal_info *info = val;
-
-	return isl_seq_eq((*row) + 1 + info->n_in, info->val, info->n_out);
-}
-
-/* Check whether "bmap" has a pair of constraints that have
- * the same coefficients for the output variables.
- * Note that the coefficients of the existentially quantified
- * variables need to be zero since the existentially quantified
- * of the result are usually not the same as those of the input.
- * the isl_dim_out and isl_dim_div dimensions.
- * If so, return 1 and return the row indices of the two constraints
- * in *first and *second.
- */
-static int parallel_constraints(__isl_keep isl_basic_map *bmap,
-	int *first, int *second)
-{
-	int i;
-	isl_ctx *ctx = isl_basic_map_get_ctx(bmap);
-	struct isl_hash_table *table = NULL;
-	struct isl_hash_table_entry *entry;
-	struct isl_constraint_equal_info info;
-	unsigned n_out;
-	unsigned n_div;
-
-	ctx = isl_basic_map_get_ctx(bmap);
-	table = isl_hash_table_alloc(ctx, bmap->n_ineq);
-	if (!table)
-		goto error;
-
-	info.n_in = isl_basic_map_dim(bmap, isl_dim_param) +
-		    isl_basic_map_dim(bmap, isl_dim_in);
-	info.bmap = bmap;
-	n_out = isl_basic_map_dim(bmap, isl_dim_out);
-	n_div = isl_basic_map_dim(bmap, isl_dim_div);
-	info.n_out = n_out + n_div;
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		uint32_t hash;
-
-		info.val = bmap->ineq[i] + 1 + info.n_in;
-		if (isl_seq_first_non_zero(info.val, n_out) < 0)
-			continue;
-		if (isl_seq_first_non_zero(info.val + n_out, n_div) >= 0)
-			continue;
-		hash = isl_seq_get_hash(info.val, info.n_out);
-		entry = isl_hash_table_find(ctx, table, hash,
-					    constraint_equal, &info, 1);
-		if (!entry)
-			goto error;
-		if (entry->data)
-			break;
-		entry->data = &bmap->ineq[i];
-	}
-
-	if (i < bmap->n_ineq) {
-		*first = ((isl_int **)entry->data) - bmap->ineq; 
-		*second = i;
-	}
-
-	isl_hash_table_free(ctx, table);
-
-	return i < bmap->n_ineq;
-error:
-	isl_hash_table_free(ctx, table);
-	return -1;
-}
-
-/* Given a set of upper bounds on the last "input" variable m,
- * construct a set that assigns the minimal upper bound to m, i.e.,
- * construct a set that divides the space into cells where one
- * of the upper bounds is smaller than all the others and assign
- * this upper bound to m.
- *
- * In particular, if there are n bounds b_i, then the result
- * consists of n basic sets, each one of the form
- *
- *	m = b_i
- *	b_i <= b_j	for j > i
- *	b_i <  b_j	for j < i
- */
-static __isl_give isl_set *set_minimum(__isl_take isl_dim *dim,
-	__isl_take isl_mat *var)
-{
-	int i, j, k;
-	isl_basic_set *bset = NULL;
-	isl_ctx *ctx;
-	isl_set *set = NULL;
-
-	if (!dim || !var)
-		goto error;
-
-	ctx = isl_dim_get_ctx(dim);
-	set = isl_set_alloc_dim(isl_dim_copy(dim),
-				var->n_row, ISL_SET_DISJOINT);
-
-	for (i = 0; i < var->n_row; ++i) {
-		bset = isl_basic_set_alloc_dim(isl_dim_copy(dim), 0,
-					       1, var->n_row - 1);
-		k = isl_basic_set_alloc_equality(bset);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(bset->eq[k], var->row[i], var->n_col);
-		isl_int_set_si(bset->eq[k][var->n_col], -1);
-		for (j = 0; j < var->n_row; ++j) {
-			if (j == i)
-				continue;
-			k = isl_basic_set_alloc_inequality(bset);
-			if (k < 0)
-				goto error;
-			isl_seq_combine(bset->ineq[k], ctx->one, var->row[j],
-					ctx->negone, var->row[i],
-					var->n_col);
-			isl_int_set_si(bset->ineq[k][var->n_col], 0);
-			if (j < i)
-				isl_int_sub_ui(bset->ineq[k][0],
-					       bset->ineq[k][0], 1);
-		}
-		bset = isl_basic_set_finalize(bset);
-		set = isl_set_add_basic_set(set, bset);
-	}
-
-	isl_dim_free(dim);
-	isl_mat_free(var);
-	return set;
-error:
-	isl_basic_set_free(bset);
-	isl_set_free(set);
-	isl_dim_free(dim);
-	isl_mat_free(var);
-	return NULL;
-}
-
-/* Given that the last input variable of "bmap" represents the minimum
- * of the bounds in "cst", check whether we need to split the domain
- * based on which bound attains the minimum.
- *
- * A split is needed when the minimum appears in an integer division
- * or in an equality.  Otherwise, it is only needed if it appears in
- * an upper bound that is different from the upper bounds on which it
- * is defined.
- */
-static int need_split_map(__isl_keep isl_basic_map *bmap,
-	__isl_keep isl_mat *cst)
-{
-	int i, j;
-	unsigned total;
-	unsigned pos;
-
-	pos = cst->n_col - 1;
-	total = isl_basic_map_dim(bmap, isl_dim_all);
-
-	for (i = 0; i < bmap->n_div; ++i)
-		if (!isl_int_is_zero(bmap->div[i][2 + pos]))
-			return 1;
-
-	for (i = 0; i < bmap->n_eq; ++i)
-		if (!isl_int_is_zero(bmap->eq[i][1 + pos]))
-			return 1;
-
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		if (isl_int_is_nonneg(bmap->ineq[i][1 + pos]))
-			continue;
-		if (!isl_int_is_negone(bmap->ineq[i][1 + pos]))
-			return 1;
-		if (isl_seq_first_non_zero(bmap->ineq[i] + 1 + pos + 1,
-					   total - pos - 1) >= 0)
-			return 1;
-
-		for (j = 0; j < cst->n_row; ++j)
-			if (isl_seq_eq(bmap->ineq[i], cst->row[j], cst->n_col))
-				break;
-		if (j >= cst->n_row)
-			return 1;
-	}
-
-	return 0;
-}
-
-static int need_split_set(__isl_keep isl_basic_set *bset,
-	__isl_keep isl_mat *cst)
-{
-	return need_split_map((isl_basic_map *)bset, cst);
-}
-
-/* Given a set of which the last set variable is the minimum
- * of the bounds in "cst", split each basic set in the set
- * in pieces where one of the bounds is (strictly) smaller than the others.
- * This subdivision is given in "min_expr".
- * The variable is subsequently projected out.
- *
- * We only do the split when it is needed.
- * For example if the last input variable m = min(a,b) and the only
- * constraints in the given basic set are lower bounds on m,
- * i.e., l <= m = min(a,b), then we can simply project out m
- * to obtain l <= a and l <= b, without having to split on whether
- * m is equal to a or b.
- */
-static __isl_give isl_set *split(__isl_take isl_set *empty,
-	__isl_take isl_set *min_expr, __isl_take isl_mat *cst)
-{
-	int n_in;
-	int i;
-	isl_dim *dim;
-	isl_set *res;
-
-	if (!empty || !min_expr || !cst)
-		goto error;
-
-	n_in = isl_set_dim(empty, isl_dim_set);
-	dim = isl_set_get_dim(empty);
-	dim = isl_dim_drop(dim, isl_dim_set, n_in - 1, 1);
-	res = isl_set_empty(dim);
-
-	for (i = 0; i < empty->n; ++i) {
-		isl_set *set;
-
-		set = isl_set_from_basic_set(isl_basic_set_copy(empty->p[i]));
-		if (need_split_set(empty->p[i], cst))
-			set = isl_set_intersect(set, isl_set_copy(min_expr));
-		set = isl_set_remove_dims(set, isl_dim_set, n_in - 1, 1);
-
-		res = isl_set_union_disjoint(res, set);
-	}
-
-	isl_set_free(empty);
-	isl_set_free(min_expr);
-	isl_mat_free(cst);
-	return res;
-error:
-	isl_set_free(empty);
-	isl_set_free(min_expr);
-	isl_mat_free(cst);
-	return NULL;
-}
-
-/* Given a map of which the last input variable is the minimum
- * of the bounds in "cst", split each basic set in the set
- * in pieces where one of the bounds is (strictly) smaller than the others.
- * This subdivision is given in "min_expr".
- * The variable is subsequently projected out.
- *
- * The implementation is essentially the same as that of "split".
- */
-static __isl_give isl_map *split_domain(__isl_take isl_map *opt,
-	__isl_take isl_set *min_expr, __isl_take isl_mat *cst)
-{
-	int n_in;
-	int i;
-	isl_dim *dim;
-	isl_map *res;
-
-	if (!opt || !min_expr || !cst)
-		goto error;
-
-	n_in = isl_map_dim(opt, isl_dim_in);
-	dim = isl_map_get_dim(opt);
-	dim = isl_dim_drop(dim, isl_dim_in, n_in - 1, 1);
-	res = isl_map_empty(dim);
-
-	for (i = 0; i < opt->n; ++i) {
-		isl_map *map;
-
-		map = isl_map_from_basic_map(isl_basic_map_copy(opt->p[i]));
-		if (need_split_map(opt->p[i], cst))
-			map = isl_map_intersect_domain(map,
-						       isl_set_copy(min_expr));
-		map = isl_map_remove_dims(map, isl_dim_in, n_in - 1, 1);
-
-		res = isl_map_union_disjoint(res, map);
-	}
-
-	isl_map_free(opt);
-	isl_set_free(min_expr);
-	isl_mat_free(cst);
-	return res;
-error:
-	isl_map_free(opt);
-	isl_set_free(min_expr);
-	isl_mat_free(cst);
-	return NULL;
-}
-
-static __isl_give isl_map *basic_map_partial_lexopt(
-	__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty, int max);
-
-/* Given a basic map with at least two parallel constraints (as found
- * by the function parallel_constraints), first look for more constraints
- * parallel to the two constraint and replace the found list of parallel
- * constraints by a single constraint with as "input" part the minimum
- * of the input parts of the list of constraints.  Then, recursively call
- * basic_map_partial_lexopt (possibly finding more parallel constraints)
- * and plug in the definition of the minimum in the result.
- *
- * More specifically, given a set of constraints
- *
- *	a x + b_i(p) >= 0
- *
- * Replace this set by a single constraint
- *
- *	a x + u >= 0
- *
- * with u a new parameter with constraints
- *
- *	u <= b_i(p)
- *
- * Any solution to the new system is also a solution for the original system
- * since
- *
- *	a x >= -u >= -b_i(p)
- *
- * Moreover, m = min_i(b_i(p)) satisfies the constraints on u and can
- * therefore be plugged into the solution.
- */
-static __isl_give isl_map *basic_map_partial_lexopt_symm(
-	__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty, int max, int first, int second)
-{
-	int i, n, k;
-	int *list = NULL;
-	unsigned n_in, n_out, n_div;
-	isl_ctx *ctx;
-	isl_vec *var = NULL;
-	isl_mat *cst = NULL;
-	isl_map *opt;
-	isl_set *min_expr;
-	isl_dim *map_dim, *set_dim;
-
-	map_dim = isl_basic_map_get_dim(bmap);
-	set_dim = empty ? isl_basic_set_get_dim(dom) : NULL;
-
-	n_in = isl_basic_map_dim(bmap, isl_dim_param) +
-	       isl_basic_map_dim(bmap, isl_dim_in);
-	n_out = isl_basic_map_dim(bmap, isl_dim_all) - n_in;
-
-	ctx = isl_basic_map_get_ctx(bmap);
-	list = isl_alloc_array(ctx, int, bmap->n_ineq);
-	var = isl_vec_alloc(ctx, n_out);
-	if (!list || !var)
-		goto error;
-
-	list[0] = first;
-	list[1] = second;
-	isl_seq_cpy(var->el, bmap->ineq[first] + 1 + n_in, n_out);
-	for (i = second + 1, n = 2; i < bmap->n_ineq; ++i) {
-		if (isl_seq_eq(var->el, bmap->ineq[i] + 1 + n_in, n_out))
-			list[n++] = i;
-	}
-
-	cst = isl_mat_alloc(ctx, n, 1 + n_in);
-	if (!cst)
-		goto error;
-
-	for (i = 0; i < n; ++i)
-		isl_seq_cpy(cst->row[i], bmap->ineq[list[i]], 1 + n_in);
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		goto error;
-	for (i = n - 1; i >= 0; --i)
-		if (isl_basic_map_drop_inequality(bmap, list[i]) < 0)
-			goto error;
-
-	bmap = isl_basic_map_add(bmap, isl_dim_in, 1);
-	bmap = isl_basic_map_extend_constraints(bmap, 0, 1);
-	k = isl_basic_map_alloc_inequality(bmap);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(bmap->ineq[k], 1 + n_in);
-	isl_int_set_si(bmap->ineq[k][1 + n_in], 1);
-	isl_seq_cpy(bmap->ineq[k] + 1 + n_in + 1, var->el, n_out);
-	bmap = isl_basic_map_finalize(bmap);
-
-	n_div = isl_basic_set_dim(dom, isl_dim_div);
-	dom = isl_basic_set_add(dom, isl_dim_set, 1);
-	dom = isl_basic_set_extend_constraints(dom, 0, n);
-	for (i = 0; i < n; ++i) {
-		k = isl_basic_set_alloc_inequality(dom);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(dom->ineq[k], cst->row[i], 1 + n_in);
-		isl_int_set_si(dom->ineq[k][1 + n_in], -1);
-		isl_seq_clr(dom->ineq[k] + 1 + n_in + 1, n_div);
-	}
-
-	min_expr = set_minimum(isl_basic_set_get_dim(dom), isl_mat_copy(cst));
-
-	isl_vec_free(var);
-	free(list);
-
-	opt = basic_map_partial_lexopt(bmap, dom, empty, max);
-
-	if (empty) {
-		*empty = split(*empty,
-			       isl_set_copy(min_expr), isl_mat_copy(cst));
-		*empty = isl_set_reset_dim(*empty, set_dim);
-	}
-
-	opt = split_domain(opt, min_expr, cst);
-	opt = isl_map_reset_dim(opt, map_dim);
-
-	return opt;
-error:
-	isl_dim_free(map_dim);
-	isl_dim_free(set_dim);
-	isl_mat_free(cst);
-	isl_vec_free(var);
-	free(list);
-	isl_basic_set_free(dom);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Recursive part of isl_tab_basic_map_partial_lexopt, after detecting
- * equalities and removing redundant constraints.
- *
- * We first check if there are any parallel constraints (left).
- * If not, we are in the base case.
- * If there are parallel constraints, we replace them by a single
- * constraint in basic_map_partial_lexopt_symm and then call
- * this function recursively to look for more parallel constraints.
- */
-static __isl_give isl_map *basic_map_partial_lexopt(
-	__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty, int max)
-{
-	int par = 0;
-	int first, second;
-
-	if (!bmap)
-		goto error;
-
-	if (bmap->ctx->opt->pip_symmetry)
-		par = parallel_constraints(bmap, &first, &second);
-	if (par < 0)
-		goto error;
-	if (!par)
-		return basic_map_partial_lexopt_base(bmap, dom, empty, max);
-	
-	return basic_map_partial_lexopt_symm(bmap, dom, empty, max,
-					     first, second);
-error:
-	isl_basic_set_free(dom);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Compute the lexicographic minimum (or maximum if "max" is set)
- * of "bmap" over the domain "dom" and return the result as a map.
- * If "empty" is not NULL, then *empty is assigned a set that
- * contains those parts of the domain where there is no solution.
- * If "bmap" is marked as rational (ISL_BASIC_MAP_RATIONAL),
- * then we compute the rational optimum.  Otherwise, we compute
- * the integral optimum.
- *
- * We perform some preprocessing.  As the PILP solver does not
- * handle implicit equalities very well, we first make sure all
- * the equalities are explicitly available.
- *
- * We also add context constraints to the basic map and remove
- * redundant constraints.  This is only needed because of the
- * way we handle simple symmetries.  In particular, we currently look
- * for symmetries on the constraints, before we set up the main tableau.
- * It is then no good to look for symmetries on possibly redundant constraints.
- */
-struct isl_map *isl_tab_basic_map_partial_lexopt(
-		struct isl_basic_map *bmap, struct isl_basic_set *dom,
-		struct isl_set **empty, int max)
-{
-	if (empty)
-		*empty = NULL;
-	if (!bmap || !dom)
-		goto error;
-
-	isl_assert(bmap->ctx,
-	    isl_basic_map_compatible_domain(bmap, dom), goto error);
-
-	if (isl_basic_set_dim(dom, isl_dim_all) == 0)
-		return basic_map_partial_lexopt(bmap, dom, empty, max);
-
-	bmap = isl_basic_map_intersect_domain(bmap, isl_basic_set_copy(dom));
-	bmap = isl_basic_map_detect_equalities(bmap);
-	bmap = isl_basic_map_remove_redundancies(bmap);
-
-	return basic_map_partial_lexopt(bmap, dom, empty, max);
-error:
-	isl_basic_set_free(dom);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_sol_for {
-	struct isl_sol	sol;
-	int		(*fn)(__isl_take isl_basic_set *dom,
-				__isl_take isl_aff_list *list, void *user);
-	void		*user;
-};
-
-static void sol_for_free(struct isl_sol_for *sol_for)
-{
-	if (sol_for->sol.context)
-		sol_for->sol.context->op->free(sol_for->sol.context);
-	free(sol_for);
-}
-
-static void sol_for_free_wrap(struct isl_sol *sol)
-{
-	sol_for_free((struct isl_sol_for *)sol);
-}
-
-/* Add the solution identified by the tableau and the context tableau.
- *
- * See documentation of sol_add for more details.
- *
- * Instead of constructing a basic map, this function calls a user
- * defined function with the current context as a basic set and
- * a list of affine expressions representing the relation between
- * the input and output.  The space over which the affine expressions
- * are defined is the same as that of the domain.  The number of
- * affine expressions in the list is equal to the number of output variables.
- */
-static void sol_for_add(struct isl_sol_for *sol,
-	struct isl_basic_set *dom, struct isl_mat *M)
-{
-	int i;
-	isl_ctx *ctx;
-	isl_local_space *ls;
-	isl_aff *aff;
-	isl_aff_list *list;
-
-	if (sol->sol.error || !dom || !M)
-		goto error;
-
-	ctx = isl_basic_set_get_ctx(dom);
-	ls = isl_basic_set_get_local_space(dom);
-	list = isl_aff_list_alloc(ctx, M->n_row - 1);
-	for (i = 1; i < M->n_row; ++i) {
-		aff = isl_aff_alloc(isl_local_space_copy(ls));
-		if (aff) {
-			isl_int_set_si(aff->v->el[0], 1);
-			isl_seq_cpy(aff->v->el + 1, M->row[i], M->n_col);
-		}
-		list = isl_aff_list_add(list, aff);
-	}
-	isl_local_space_free(ls);
-
-	dom = isl_basic_set_finalize(dom);
-
-	if (sol->fn(isl_basic_set_copy(dom), list, sol->user) < 0)
-		goto error;
-
-	isl_basic_set_free(dom);
-	isl_mat_free(M);
-	return;
-error:
-	isl_basic_set_free(dom);
-	isl_mat_free(M);
-	sol->sol.error = 1;
-}
-
-static void sol_for_add_wrap(struct isl_sol *sol,
-	struct isl_basic_set *dom, struct isl_mat *M)
-{
-	sol_for_add((struct isl_sol_for *)sol, dom, M);
-}
-
-static struct isl_sol_for *sol_for_init(struct isl_basic_map *bmap, int max,
-	int (*fn)(__isl_take isl_basic_set *dom, __isl_take isl_aff_list *list,
-		  void *user),
-	void *user)
-{
-	struct isl_sol_for *sol_for = NULL;
-	struct isl_dim *dom_dim;
-	struct isl_basic_set *dom = NULL;
-
-	sol_for = isl_calloc_type(bmap->ctx, struct isl_sol_for);
-	if (!sol_for)
-		goto error;
-
-	dom_dim = isl_dim_domain(isl_dim_copy(bmap->dim));
-	dom = isl_basic_set_universe(dom_dim);
-
-	sol_for->sol.rational = ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL);
-	sol_for->sol.dec_level.callback.run = &sol_dec_level_wrap;
-	sol_for->sol.dec_level.sol = &sol_for->sol;
-	sol_for->fn = fn;
-	sol_for->user = user;
-	sol_for->sol.max = max;
-	sol_for->sol.n_out = isl_basic_map_dim(bmap, isl_dim_out);
-	sol_for->sol.add = &sol_for_add_wrap;
-	sol_for->sol.add_empty = NULL;
-	sol_for->sol.free = &sol_for_free_wrap;
-
-	sol_for->sol.context = isl_context_alloc(dom);
-	if (!sol_for->sol.context)
-		goto error;
-
-	isl_basic_set_free(dom);
-	return sol_for;
-error:
-	isl_basic_set_free(dom);
-	sol_for_free(sol_for);
-	return NULL;
-}
-
-static void sol_for_find_solutions(struct isl_sol_for *sol_for,
-	struct isl_tab *tab)
-{
-	find_solutions_main(&sol_for->sol, tab);
-}
-
-int isl_basic_map_foreach_lexopt(__isl_keep isl_basic_map *bmap, int max,
-	int (*fn)(__isl_take isl_basic_set *dom, __isl_take isl_aff_list *list,
-		  void *user),
-	void *user)
-{
-	struct isl_sol_for *sol_for = NULL;
-
-	bmap = isl_basic_map_copy(bmap);
-	if (!bmap)
-		return -1;
-
-	bmap = isl_basic_map_detect_equalities(bmap);
-	sol_for = sol_for_init(bmap, max, fn, user);
-
-	if (isl_basic_map_plain_is_empty(bmap))
-		/* nothing */;
-	else {
-		struct isl_tab *tab;
-		struct isl_context *context = sol_for->sol.context;
-		tab = tab_for_lexmin(bmap,
-				context->op->peek_basic_set(context), 1, max);
-		tab = context->op->detect_nonnegative_parameters(context, tab);
-		sol_for_find_solutions(sol_for, tab);
-		if (sol_for->sol.error)
-			goto error;
-	}
-
-	sol_free(&sol_for->sol);
-	isl_basic_map_free(bmap);
-	return 0;
-error:
-	sol_free(&sol_for->sol);
-	isl_basic_map_free(bmap);
-	return -1;
-}
-
-int isl_basic_map_foreach_lexmin(__isl_keep isl_basic_map *bmap,
-	int (*fn)(__isl_take isl_basic_set *dom, __isl_take isl_aff_list *list,
-		  void *user),
-	void *user)
-{
-	return isl_basic_map_foreach_lexopt(bmap, 0, fn, user);
-}
-
-int isl_basic_map_foreach_lexmax(__isl_keep isl_basic_map *bmap,
-	int (*fn)(__isl_take isl_basic_set *dom, __isl_take isl_aff_list *list,
-		  void *user),
-	void *user)
-{
-	return isl_basic_map_foreach_lexopt(bmap, 1, fn, user);
-}
-
-int isl_basic_set_foreach_lexmax(__isl_keep isl_basic_set *bset,
-	int (*fn)(__isl_take isl_basic_set *dom, __isl_take isl_aff_list *list,
-		  void *user),
-	void *user)
-{
-	return isl_basic_map_foreach_lexmax(bset, fn, user);
-}
-
-/* Check if the given sequence of len variables starting at pos
- * represents a trivial (i.e., zero) solution.
- * The variables are assumed to be non-negative and to come in pairs,
- * with each pair representing a variable of unrestricted sign.
- * The solution is trivial if each such pair in the sequence consists
- * of two identical values, meaning that the variable being represented
- * has value zero.
- */
-static int region_is_trivial(struct isl_tab *tab, int pos, int len)
-{
-	int i;
-
-	if (len == 0)
-		return 0;
-
-	for (i = 0; i < len; i +=  2) {
-		int neg_row;
-		int pos_row;
-
-		neg_row = tab->var[pos + i].is_row ?
-				tab->var[pos + i].index : -1;
-		pos_row = tab->var[pos + i + 1].is_row ?
-				tab->var[pos + i + 1].index : -1;
-
-		if ((neg_row < 0 ||
-		     isl_int_is_zero(tab->mat->row[neg_row][1])) &&
-		    (pos_row < 0 ||
-		     isl_int_is_zero(tab->mat->row[pos_row][1])))
-			continue;
-
-		if (neg_row < 0 || pos_row < 0)
-			return 0;
-		if (isl_int_ne(tab->mat->row[neg_row][1],
-			       tab->mat->row[pos_row][1]))
-			return 0;
-	}
-
-	return 1;
-}
-
-/* Return the index of the first trivial region or -1 if all regions
- * are non-trivial.
- */
-static int first_trivial_region(struct isl_tab *tab,
-	int n_region, struct isl_region *region)
-{
-	int i;
-
-	for (i = 0; i < n_region; ++i) {
-		if (region_is_trivial(tab, region[i].pos, region[i].len))
-			return i;
-	}
-
-	return -1;
-}
-
-/* Check if the solution is optimal, i.e., whether the first
- * n_op entries are zero.
- */
-static int is_optimal(__isl_keep isl_vec *sol, int n_op)
-{
-	int i;
-
-	for (i = 0; i < n_op; ++i)
-		if (!isl_int_is_zero(sol->el[1 + i]))
-			return 0;
-	return 1;
-}
-
-/* Add constraints to "tab" that ensure that any solution is significantly
- * better that that represented by "sol".  That is, find the first
- * relevant (within first n_op) non-zero coefficient and force it (along
- * with all previous coefficients) to be zero.
- * If the solution is already optimal (all relevant coefficients are zero),
- * then just mark the table as empty.
- */
-static int force_better_solution(struct isl_tab *tab,
-	__isl_keep isl_vec *sol, int n_op)
-{
-	int i;
-	isl_ctx *ctx;
-	isl_vec *v = NULL;
-
-	if (!sol)
-		return -1;
-
-	for (i = 0; i < n_op; ++i)
-		if (!isl_int_is_zero(sol->el[1 + i]))
-			break;
-
-	if (i == n_op) {
-		if (isl_tab_mark_empty(tab) < 0)
-			return -1;
-		return 0;
-	}
-
-	ctx = isl_vec_get_ctx(sol);
-	v = isl_vec_alloc(ctx, 1 + tab->n_var);
-	if (!v)
-		return -1;
-
-	for (; i >= 0; --i) {
-		v = isl_vec_clr(v);
-		isl_int_set_si(v->el[1 + i], -1);
-		if (add_lexmin_eq(tab, v->el) < 0)
-			goto error;
-	}
-
-	isl_vec_free(v);
-	return 0;
-error:
-	isl_vec_free(v);
-	return -1;
-}
-
-struct isl_trivial {
-	int update;
-	int region;
-	int side;
-	struct isl_tab_undo *snap;
-};
-
-/* Return the lexicographically smallest non-trivial solution of the
- * given ILP problem.
- *
- * All variables are assumed to be non-negative.
- *
- * n_op is the number of initial coordinates to optimize.
- * That is, once a solution has been found, we will only continue looking
- * for solution that result in significantly better values for those
- * initial coordinates.  That is, we only continue looking for solutions
- * that increase the number of initial zeros in this sequence.
- *
- * A solution is non-trivial, if it is non-trivial on each of the
- * specified regions.  Each region represents a sequence of pairs
- * of variables.  A solution is non-trivial on such a region if
- * at least one of these pairs consists of different values, i.e.,
- * such that the non-negative variable represented by the pair is non-zero.
- *
- * Whenever a conflict is encountered, all constraints involved are
- * reported to the caller through a call to "conflict".
- *
- * We perform a simple branch-and-bound backtracking search.
- * Each level in the search represents initially trivial region that is forced
- * to be non-trivial.
- * At each level we consider n cases, where n is the length of the region.
- * In terms of the n/2 variables of unrestricted signs being encoded by
- * the region, we consider the cases
- *	x_0 >= 1
- *	x_0 <= -1
- *	x_0 = 0 and x_1 >= 1
- *	x_0 = 0 and x_1 <= -1
- *	x_0 = 0 and x_1 = 0 and x_2 >= 1
- *	x_0 = 0 and x_1 = 0 and x_2 <= -1
- *	...
- * The cases are considered in this order, assuming that each pair
- * x_i_a x_i_b represents the value x_i_b - x_i_a.
- * That is, x_0 >= 1 is enforced by adding the constraint
- *	x_0_b - x_0_a >= 1
- */
-__isl_give isl_vec *isl_tab_basic_set_non_trivial_lexmin(
-	__isl_take isl_basic_set *bset, int n_op, int n_region,
-	struct isl_region *region,
-	int (*conflict)(int con, void *user), void *user)
-{
-	int i, j;
-	int r;
-	isl_ctx *ctx = isl_basic_set_get_ctx(bset);
-	isl_vec *v = NULL;
-	isl_vec *sol = isl_vec_alloc(ctx, 0);
-	struct isl_tab *tab;
-	struct isl_trivial *triv = NULL;
-	int level, init;
-
-	tab = tab_for_lexmin(isl_basic_map_from_range(bset), NULL, 0, 0);
-	if (!tab)
-		goto error;
-	tab->conflict = conflict;
-	tab->conflict_user = user;
-
-	v = isl_vec_alloc(ctx, 1 + tab->n_var);
-	triv = isl_calloc_array(ctx, struct isl_trivial, n_region);
-	if (!v || !triv)
-		goto error;
-
-	level = 0;
-	init = 1;
-
-	while (level >= 0) {
-		int side, base;
-
-		if (init) {
-			tab = cut_to_integer_lexmin(tab);
-			if (!tab)
-				goto error;
-			if (tab->empty)
-				goto backtrack;
-			r = first_trivial_region(tab, n_region, region);
-			if (r < 0) {
-				for (i = 0; i < level; ++i)
-					triv[i].update = 1;
-				isl_vec_free(sol);
-				sol = isl_tab_get_sample_value(tab);
-				if (!sol)
-					goto error;
-				if (is_optimal(sol, n_op))
-					break;
-				goto backtrack;
-			}
-			if (level >= n_region)
-				isl_die(ctx, isl_error_internal,
-					"nesting level too deep", goto error);
-			if (isl_tab_extend_cons(tab,
-					    2 * region[r].len + 2 * n_op) < 0)
-				goto error;
-			triv[level].region = r;
-			triv[level].side = 0;
-		}
-
-		r = triv[level].region;
-		side = triv[level].side;
-		base = 2 * (side/2);
-
-		if (side >= region[r].len) {
-backtrack:
-			level--;
-			init = 0;
-			if (level >= 0)
-				if (isl_tab_rollback(tab, triv[level].snap) < 0)
-					goto error;
-			continue;
-		}
-
-		if (triv[level].update) {
-			if (force_better_solution(tab, sol, n_op) < 0)
-				goto error;
-			triv[level].update = 0;
-		}
-
-		if (side == base && base >= 2) {
-			for (j = base - 2; j < base; ++j) {
-				v = isl_vec_clr(v);
-				isl_int_set_si(v->el[1 + region[r].pos + j], 1);
-				if (add_lexmin_eq(tab, v->el) < 0)
-					goto error;
-			}
-		}
-
-		triv[level].snap = isl_tab_snap(tab);
-		if (isl_tab_push_basis(tab) < 0)
-			goto error;
-
-		v = isl_vec_clr(v);
-		isl_int_set_si(v->el[0], -1);
-		isl_int_set_si(v->el[1 + region[r].pos + side], -1);
-		isl_int_set_si(v->el[1 + region[r].pos + (side ^ 1)], 1);
-		tab = add_lexmin_ineq(tab, v->el);
-
-		triv[level].side++;
-		level++;
-		init = 1;
-	}
-
-	free(triv);
-	isl_vec_free(v);
-	isl_tab_free(tab);
-	isl_basic_set_free(bset);
-
-	return sol;
-error:
-	free(triv);
-	isl_vec_free(v);
-	isl_tab_free(tab);
-	isl_basic_set_free(bset);
-	isl_vec_free(sol);
-	return NULL;
-}
-
-/* Return the lexicographically smallest rational point in "bset",
- * assuming that all variables are non-negative.
- * If "bset" is empty, then return a zero-length vector.
- */
- __isl_give isl_vec *isl_tab_basic_set_non_neg_lexmin(
-	__isl_take isl_basic_set *bset)
-{
-	struct isl_tab *tab;
-	isl_ctx *ctx = isl_basic_set_get_ctx(bset);
-	isl_vec *sol;
-
-	tab = tab_for_lexmin(isl_basic_map_from_range(bset), NULL, 0, 0);
-	if (!tab)
-		goto error;
-	if (tab->empty)
-		sol = isl_vec_alloc(ctx, 0);
-	else
-		sol = isl_tab_get_sample_value(tab);
-	isl_tab_free(tab);
-	isl_basic_set_free(bset);
-	return sol;
-error:
-	isl_tab_free(tab);
-	isl_basic_set_free(bset);
-	return NULL;
-}
diff --git a/cloog-0.16.3/isl/isl_test.c b/cloog-0.16.3/isl/isl_test.c
deleted file mode 100644
index d8248a3..0000000
--- a/cloog-0.16.3/isl/isl_test.c
+++ /dev/null
@@ -1,2386 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <assert.h>
-#include <stdio.h>
-#include <limits.h>
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl/aff.h>
-#include <isl/set.h>
-#include <isl/flow.h>
-#include <isl/constraint.h>
-#include <isl/polynomial.h>
-#include <isl/union_map.h>
-#include <isl_factorization.h>
-#include <isl/schedule.h>
-
-static char *srcdir;
-
-static char *get_filename(isl_ctx *ctx, const char *name, const char *suffix) {
-	char *filename;
-	int length;
-	char *pattern = "%s/test_inputs/%s.%s";
-
-	length = strlen(pattern) - 6 + strlen(srcdir) + strlen(name)
-		+ strlen(suffix) + 1;
-	filename = isl_alloc_array(ctx, char, length);
-
-	if (!filename)
-		return NULL;
-
-	sprintf(filename, pattern, srcdir, name, suffix);
-
-	return filename;
-}
-
-void test_parse_map(isl_ctx *ctx, const char *str)
-{
-	isl_map *map;
-
-	map = isl_map_read_from_str(ctx, str, -1);
-	assert(map);
-	isl_map_free(map);
-}
-
-void test_parse_map_equal(isl_ctx *ctx, const char *str, const char *str2)
-{
-	isl_map *map, *map2;
-
-	map = isl_map_read_from_str(ctx, str, -1);
-	map2 = isl_map_read_from_str(ctx, str2, -1);
-	assert(map && map2 && isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-}
-
-void test_parse_pwqp(isl_ctx *ctx, const char *str)
-{
-	isl_pw_qpolynomial *pwqp;
-
-	pwqp = isl_pw_qpolynomial_read_from_str(ctx, str);
-	assert(pwqp);
-	isl_pw_qpolynomial_free(pwqp);
-}
-
-void test_parse(struct isl_ctx *ctx)
-{
-	isl_map *map, *map2;
-	const char *str, *str2;
-
-	str = "{ [i] -> [-i] }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	assert(map);
-	isl_map_free(map);
-
-	str = "{ A[i] -> L[([i/3])] }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	assert(map);
-	isl_map_free(map);
-
-	test_parse_map(ctx, "{[[s] -> A[i]] -> [[s+1] -> A[i]]}");
-	test_parse_map(ctx, "{ [p1, y1, y2] -> [2, y1, y2] : "
-				"p1 = 1 && (y1 <= y2 || y2 = 0) }");
-
-	str = "{ [x,y]  : [([x/2]+y)/3] >= 1 }";
-	str2 = "{ [x, y] : 2y >= 6 - x }";
-	test_parse_map_equal(ctx, str, str2);
-
-	test_parse_map_equal(ctx, "{ [x,y] : x <= min(y, 2*y+3) }",
-				  "{ [x,y] : x <= y, 2*y + 3 }");
-	str = "{ [x, y] : (y <= x and y >= -3) or (2y <= -3 + x and y <= -4) }";
-	test_parse_map_equal(ctx, "{ [x,y] : x >= min(y, 2*y+3) }", str);
-
-	str = "{[new,old] -> [new+1-2*[(new+1)/2],old+1-2*[(old+1)/2]]}";
-	map = isl_map_read_from_str(ctx, str, -1);
-	str = "{ [new, old] -> [o0, o1] : "
-	       "exists (e0 = [(-1 - new + o0)/2], e1 = [(-1 - old + o1)/2]: "
-	       "2e0 = -1 - new + o0 and 2e1 = -1 - old + o1 and o0 >= 0 and "
-	       "o0 <= 1 and o1 >= 0 and o1 <= 1) }";
-	map2 = isl_map_read_from_str(ctx, str, -1);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "{[new,old] -> [new+1-2*[(new+1)/2],old+1-2*[(old+1)/2]]}";
-	map = isl_map_read_from_str(ctx, str, -1);
-	str = "{[new,old] -> [(new+1)%2,(old+1)%2]}";
-	map2 = isl_map_read_from_str(ctx, str, -1);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "[n] -> { [c1] : c1>=0 and c1<=floord(n-4,3) }";
-	str2 = "[n] -> { [c1] : c1 >= 0 and 3c1 <= -4 + n }";
-	test_parse_map_equal(ctx, str, str2);
-
-	test_parse_pwqp(ctx, "{ [i] -> i + [ (i + [i/3])/2 ] }");
-	test_parse_map(ctx, "{ S1[i] -> [([i/10]),i%10] : 0 <= i <= 45 }");
-}
-
-void test_read(struct isl_ctx *ctx)
-{
-	char *filename;
-	FILE *input;
-	struct isl_basic_set *bset1, *bset2;
-	const char *str = "{[y]: Exists ( alpha : 2alpha = y)}";
-
-	filename = get_filename(ctx, "set", "omega");
-	assert(filename);
-	input = fopen(filename, "r");
-	assert(input);
-
-	bset1 = isl_basic_set_read_from_file(ctx, input, 0);
-	bset2 = isl_basic_set_read_from_str(ctx, str, 0);
-
-	assert(isl_basic_set_is_equal(bset1, bset2) == 1);
-
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	free(filename);
-
-	fclose(input);
-}
-
-void test_bounded(struct isl_ctx *ctx)
-{
-	isl_set *set;
-	int bounded;
-
-	set = isl_set_read_from_str(ctx, "[n] -> {[i] : 0 <= i <= n }", -1);
-	bounded = isl_set_is_bounded(set);
-	assert(bounded);
-	isl_set_free(set);
-
-	set = isl_set_read_from_str(ctx, "{[n, i] : 0 <= i <= n }", -1);
-	bounded = isl_set_is_bounded(set);
-	assert(!bounded);
-	isl_set_free(set);
-
-	set = isl_set_read_from_str(ctx, "[n] -> {[i] : i <= n }", -1);
-	bounded = isl_set_is_bounded(set);
-	assert(!bounded);
-	isl_set_free(set);
-}
-
-/* Construct the basic set { [i] : 5 <= i <= N } */
-void test_construction(struct isl_ctx *ctx)
-{
-	isl_int v;
-	struct isl_dim *dim;
-	struct isl_basic_set *bset;
-	struct isl_constraint *c;
-
-	isl_int_init(v);
-
-	dim = isl_dim_set_alloc(ctx, 1, 1);
-	bset = isl_basic_set_universe(dim);
-
-	c = isl_inequality_alloc(isl_basic_set_get_dim(bset));
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_param, 0, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	c = isl_inequality_alloc(isl_basic_set_get_dim(bset));
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, -5);
-	isl_constraint_set_constant(c, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	isl_basic_set_free(bset);
-
-	isl_int_clear(v);
-}
-
-void test_dim(struct isl_ctx *ctx)
-{
-	const char *str;
-	isl_map *map1, *map2;
-
-	map1 = isl_map_read_from_str(ctx,
-	    "[n] -> { [i] -> [j] : exists (a = [i/10] : i - 10a <= n ) }", -1);
-	map1 = isl_map_add_dims(map1, isl_dim_in, 1);
-	map2 = isl_map_read_from_str(ctx,
-	    "[n] -> { [i,k] -> [j] : exists (a = [i/10] : i - 10a <= n ) }", -1);
-	assert(isl_map_is_equal(map1, map2));
-	isl_map_free(map2);
-
-	map1 = isl_map_project_out(map1, isl_dim_in, 0, 1);
-	map2 = isl_map_read_from_str(ctx, "[n] -> { [i] -> [j] : n >= 0 }", -1);
-	assert(isl_map_is_equal(map1, map2));
-
-	isl_map_free(map1);
-	isl_map_free(map2);
-
-	str = "[n] -> { [i] -> [] : exists a : 0 <= i <= n and i = 2 a }";
-	map1 = isl_map_read_from_str(ctx, str, -1);
-	str = "{ [i] -> [j] : exists a : 0 <= i <= j and i = 2 a }";
-	map2 = isl_map_read_from_str(ctx, str, -1);
-	map1 = isl_map_move_dims(map1, isl_dim_out, 0, isl_dim_param, 0, 1);
-	assert(isl_map_is_equal(map1, map2));
-
-	isl_map_free(map1);
-	isl_map_free(map2);
-}
-
-void test_div(struct isl_ctx *ctx)
-{
-	isl_int v;
-	struct isl_dim *dim;
-	struct isl_basic_set *bset;
-	struct isl_constraint *c;
-
-	isl_int_init(v);
-
-	/* test 1 */
-	dim = isl_dim_set_alloc(ctx, 0, 3);
-	bset = isl_basic_set_universe(dim);
-
-	c = isl_equality_alloc(isl_basic_set_get_dim(bset));
-	isl_int_set_si(v, -1);
-	isl_constraint_set_constant(c, v);
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	c = isl_equality_alloc(isl_basic_set_get_dim(bset));
-	isl_int_set_si(v, 1);
-	isl_constraint_set_constant(c, v);
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 2, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 1, 2);
-
-	assert(bset && bset->n_div == 1);
-	isl_basic_set_free(bset);
-
-	/* test 2 */
-	dim = isl_dim_set_alloc(ctx, 0, 3);
-	bset = isl_basic_set_universe(dim);
-
-	c = isl_equality_alloc(isl_basic_set_get_dim(bset));
-	isl_int_set_si(v, 1);
-	isl_constraint_set_constant(c, v);
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	c = isl_equality_alloc(isl_basic_set_get_dim(bset));
-	isl_int_set_si(v, -1);
-	isl_constraint_set_constant(c, v);
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 2, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 1, 2);
-
-	assert(bset && bset->n_div == 1);
-	isl_basic_set_free(bset);
-
-	/* test 3 */
-	dim = isl_dim_set_alloc(ctx, 0, 3);
-	bset = isl_basic_set_universe(dim);
-
-	c = isl_equality_alloc(isl_basic_set_get_dim(bset));
-	isl_int_set_si(v, 1);
-	isl_constraint_set_constant(c, v);
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	c = isl_equality_alloc(isl_basic_set_get_dim(bset));
-	isl_int_set_si(v, -3);
-	isl_constraint_set_constant(c, v);
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 4);
-	isl_constraint_set_coefficient(c, isl_dim_set, 2, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 1, 2);
-
-	assert(bset && bset->n_div == 1);
-	isl_basic_set_free(bset);
-
-	/* test 4 */
-	dim = isl_dim_set_alloc(ctx, 0, 3);
-	bset = isl_basic_set_universe(dim);
-
-	c = isl_equality_alloc(isl_basic_set_get_dim(bset));
-	isl_int_set_si(v, 2);
-	isl_constraint_set_constant(c, v);
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	c = isl_equality_alloc(isl_basic_set_get_dim(bset));
-	isl_int_set_si(v, -1);
-	isl_constraint_set_constant(c, v);
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 6);
-	isl_constraint_set_coefficient(c, isl_dim_set, 2, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 1, 2);
-
-	assert(isl_basic_set_is_empty(bset));
-	isl_basic_set_free(bset);
-
-	/* test 5 */
-	dim = isl_dim_set_alloc(ctx, 0, 3);
-	bset = isl_basic_set_universe(dim);
-
-	c = isl_equality_alloc(isl_basic_set_get_dim(bset));
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 2, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	c = isl_equality_alloc(isl_basic_set_get_dim(bset));
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, -3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 2, 1);
-
-	assert(bset && bset->n_div == 0);
-	isl_basic_set_free(bset);
-
-	/* test 6 */
-	dim = isl_dim_set_alloc(ctx, 0, 3);
-	bset = isl_basic_set_universe(dim);
-
-	c = isl_equality_alloc(isl_basic_set_get_dim(bset));
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 6);
-	isl_constraint_set_coefficient(c, isl_dim_set, 2, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	c = isl_equality_alloc(isl_basic_set_get_dim(bset));
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, -3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 2, 1);
-
-	assert(bset && bset->n_div == 1);
-	isl_basic_set_free(bset);
-
-	/* test 7 */
-	/* This test is a bit tricky.  We set up an equality
-	 *		a + 3b + 3c = 6 e0
-	 * Normalization of divs creates _two_ divs
-	 *		a = 3 e0
-	 *		c - b - e0 = 2 e1
-	 * Afterwards e0 is removed again because it has coefficient -1
-	 * and we end up with the original equality and div again.
-	 * Perhaps we can avoid the introduction of this temporary div.
-	 */
-	dim = isl_dim_set_alloc(ctx, 0, 4);
-	bset = isl_basic_set_universe(dim);
-
-	c = isl_equality_alloc(isl_basic_set_get_dim(bset));
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, -3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
-	isl_int_set_si(v, -3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 2, v);
-	isl_int_set_si(v, 6);
-	isl_constraint_set_coefficient(c, isl_dim_set, 3, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 3, 1);
-
-	/* Test disabled for now */
-	/*
-	assert(bset && bset->n_div == 1);
-	*/
-	isl_basic_set_free(bset);
-
-	/* test 8 */
-	dim = isl_dim_set_alloc(ctx, 0, 5);
-	bset = isl_basic_set_universe(dim);
-
-	c = isl_equality_alloc(isl_basic_set_get_dim(bset));
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, -3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
-	isl_int_set_si(v, -3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 3, v);
-	isl_int_set_si(v, 6);
-	isl_constraint_set_coefficient(c, isl_dim_set, 4, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	c = isl_equality_alloc(isl_basic_set_get_dim(bset));
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 2, v);
-	isl_int_set_si(v, 1);
-	isl_constraint_set_constant(c, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 4, 1);
-
-	/* Test disabled for now */
-	/*
-	assert(bset && bset->n_div == 1);
-	*/
-	isl_basic_set_free(bset);
-
-	/* test 9 */
-	dim = isl_dim_set_alloc(ctx, 0, 4);
-	bset = isl_basic_set_universe(dim);
-
-	c = isl_equality_alloc(isl_basic_set_get_dim(bset));
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
-	isl_int_set_si(v, -2);
-	isl_constraint_set_coefficient(c, isl_dim_set, 2, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	c = isl_equality_alloc(isl_basic_set_get_dim(bset));
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 3, v);
-	isl_int_set_si(v, 2);
-	isl_constraint_set_constant(c, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 2, 2);
-
-	bset = isl_basic_set_fix_si(bset, isl_dim_set, 0, 2);
-
-	assert(!isl_basic_set_is_empty(bset));
-
-	isl_basic_set_free(bset);
-
-	/* test 10 */
-	dim = isl_dim_set_alloc(ctx, 0, 3);
-	bset = isl_basic_set_universe(dim);
-
-	c = isl_equality_alloc(isl_basic_set_get_dim(bset));
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, -2);
-	isl_constraint_set_coefficient(c, isl_dim_set, 2, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 2, 1);
-
-	bset = isl_basic_set_fix_si(bset, isl_dim_set, 0, 2);
-
-	isl_basic_set_free(bset);
-
-	isl_int_clear(v);
-}
-
-void test_application_case(struct isl_ctx *ctx, const char *name)
-{
-	char *filename;
-	FILE *input;
-	struct isl_basic_set *bset1, *bset2;
-	struct isl_basic_map *bmap;
-
-	filename = get_filename(ctx, name, "omega");
-	assert(filename);
-	input = fopen(filename, "r");
-	assert(input);
-
-	bset1 = isl_basic_set_read_from_file(ctx, input, 0);
-	bmap = isl_basic_map_read_from_file(ctx, input, 0);
-
-	bset1 = isl_basic_set_apply(bset1, bmap);
-
-	bset2 = isl_basic_set_read_from_file(ctx, input, 0);
-
-	assert(isl_basic_set_is_equal(bset1, bset2) == 1);
-
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	free(filename);
-
-	fclose(input);
-}
-
-void test_application(struct isl_ctx *ctx)
-{
-	test_application_case(ctx, "application");
-	test_application_case(ctx, "application2");
-}
-
-void test_affine_hull_case(struct isl_ctx *ctx, const char *name)
-{
-	char *filename;
-	FILE *input;
-	struct isl_basic_set *bset1, *bset2;
-
-	filename = get_filename(ctx, name, "polylib");
-	assert(filename);
-	input = fopen(filename, "r");
-	assert(input);
-
-	bset1 = isl_basic_set_read_from_file(ctx, input, 0);
-	bset2 = isl_basic_set_read_from_file(ctx, input, 0);
-
-	bset1 = isl_basic_set_affine_hull(bset1);
-
-	assert(isl_basic_set_is_equal(bset1, bset2) == 1);
-
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	free(filename);
-
-	fclose(input);
-}
-
-void test_affine_hull(struct isl_ctx *ctx)
-{
-	test_affine_hull_case(ctx, "affine2");
-	test_affine_hull_case(ctx, "affine");
-	test_affine_hull_case(ctx, "affine3");
-}
-
-void test_convex_hull_case(struct isl_ctx *ctx, const char *name)
-{
-	char *filename;
-	FILE *input;
-	struct isl_basic_set *bset1, *bset2;
-	struct isl_set *set;
-
-	filename = get_filename(ctx, name, "polylib");
-	assert(filename);
-	input = fopen(filename, "r");
-	assert(input);
-
-	bset1 = isl_basic_set_read_from_file(ctx, input, 0);
-	bset2 = isl_basic_set_read_from_file(ctx, input, 0);
-
-	set = isl_basic_set_union(bset1, bset2);
-	bset1 = isl_set_convex_hull(set);
-
-	bset2 = isl_basic_set_read_from_file(ctx, input, 0);
-
-	assert(isl_basic_set_is_equal(bset1, bset2) == 1);
-
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	free(filename);
-
-	fclose(input);
-}
-
-void test_convex_hull_algo(struct isl_ctx *ctx, int convex)
-{
-	const char *str1, *str2;
-	isl_set *set1, *set2;
-	int orig_convex = ctx->opt->convex;
-	ctx->opt->convex = convex;
-
-	test_convex_hull_case(ctx, "convex0");
-	test_convex_hull_case(ctx, "convex1");
-	test_convex_hull_case(ctx, "convex2");
-	test_convex_hull_case(ctx, "convex3");
-	test_convex_hull_case(ctx, "convex4");
-	test_convex_hull_case(ctx, "convex5");
-	test_convex_hull_case(ctx, "convex6");
-	test_convex_hull_case(ctx, "convex7");
-	test_convex_hull_case(ctx, "convex8");
-	test_convex_hull_case(ctx, "convex9");
-	test_convex_hull_case(ctx, "convex10");
-	test_convex_hull_case(ctx, "convex11");
-	test_convex_hull_case(ctx, "convex12");
-	test_convex_hull_case(ctx, "convex13");
-	test_convex_hull_case(ctx, "convex14");
-	test_convex_hull_case(ctx, "convex15");
-
-	str1 = "{ [i0, i1, i2] : (i2 = 1 and i0 = 0 and i1 >= 0) or "
-	       "(i0 = 1 and i1 = 0 and i2 = 1) or "
-	       "(i0 = 0 and i1 = 0 and i2 = 0) }";
-	str2 = "{ [i0, i1, i2] : i0 >= 0 and i2 >= i0 and i2 <= 1 and i1 >= 0 }";
-	set1 = isl_set_read_from_str(ctx, str1, -1);
-	set2 = isl_set_read_from_str(ctx, str2, -1);
-	set1 = isl_set_from_basic_set(isl_set_convex_hull(set1));
-	assert(isl_set_is_equal(set1, set2));
-	isl_set_free(set1);
-	isl_set_free(set2);
-
-	ctx->opt->convex = orig_convex;
-}
-
-void test_convex_hull(struct isl_ctx *ctx)
-{
-	test_convex_hull_algo(ctx, ISL_CONVEX_HULL_FM);
-	test_convex_hull_algo(ctx, ISL_CONVEX_HULL_WRAP);
-}
-
-void test_gist_case(struct isl_ctx *ctx, const char *name)
-{
-	char *filename;
-	FILE *input;
-	struct isl_basic_set *bset1, *bset2;
-
-	filename = get_filename(ctx, name, "polylib");
-	assert(filename);
-	input = fopen(filename, "r");
-	assert(input);
-
-	bset1 = isl_basic_set_read_from_file(ctx, input, 0);
-	bset2 = isl_basic_set_read_from_file(ctx, input, 0);
-
-	bset1 = isl_basic_set_gist(bset1, bset2);
-
-	bset2 = isl_basic_set_read_from_file(ctx, input, 0);
-
-	assert(isl_basic_set_is_equal(bset1, bset2) == 1);
-
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	free(filename);
-
-	fclose(input);
-}
-
-void test_gist(struct isl_ctx *ctx)
-{
-	const char *str;
-	isl_basic_set *bset1, *bset2;
-
-	test_gist_case(ctx, "gist1");
-
-	str = "[p0, p2, p3, p5, p6, p10] -> { [] : "
-	    "exists (e0 = [(15 + p0 + 15p6 + 15p10)/16], e1 = [(p5)/8], "
-	    "e2 = [(p6)/128], e3 = [(8p2 - p5)/128], "
-	    "e4 = [(128p3 - p6)/4096]: 8e1 = p5 and 128e2 = p6 and "
-	    "128e3 = 8p2 - p5 and 4096e4 = 128p3 - p6 and p2 >= 0 and "
-	    "16e0 >= 16 + 16p6 + 15p10 and  p2 <= 15 and p3 >= 0 and "
-	    "p3 <= 31 and  p6 >= 128p3 and p5 >= 8p2 and p10 >= 0 and "
-	    "16e0 <= 15 + p0 + 15p6 + 15p10 and 16e0 >= p0 + 15p6 + 15p10 and "
-	    "p10 <= 15 and p10 <= -1 + p0 - p6) }";
-	bset1 = isl_basic_set_read_from_str(ctx, str, -1);
-	str = "[p0, p2, p3, p5, p6, p10] -> { [] : exists (e0 = [(p5)/8], "
-	    "e1 = [(p6)/128], e2 = [(8p2 - p5)/128], "
-	    "e3 = [(128p3 - p6)/4096]: 8e0 = p5 and 128e1 = p6 and "
-	    "128e2 = 8p2 - p5 and 4096e3 = 128p3 - p6 and p5 >= -7 and "
-	    "p2 >= 0 and 8p2 <= -1 + p0 and p2 <= 15 and p3 >= 0 and "
-	    "p3 <= 31 and 128p3 <= -1 + p0 and p6 >= -127 and "
-	    "p5 <= -1 + p0 and p6 <= -1 + p0 and p6 >= 128p3 and "
-	    "p0 >= 1 and p5 >= 8p2 and p10 >= 0 and p10 <= 15 ) }";
-	bset2 = isl_basic_set_read_from_str(ctx, str, -1);
-	bset1 = isl_basic_set_gist(bset1, bset2);
-	assert(bset1 && bset1->n_div == 0);
-	isl_basic_set_free(bset1);
-}
-
-void test_coalesce_set(isl_ctx *ctx, const char *str, int check_one)
-{
-	isl_set *set, *set2;
-
-	set = isl_set_read_from_str(ctx, str, -1);
-	set = isl_set_coalesce(set);
-	set2 = isl_set_read_from_str(ctx, str, -1);
-	assert(isl_set_is_equal(set, set2));
-	if (check_one)
-		assert(set && set->n == 1);
-	isl_set_free(set);
-	isl_set_free(set2);
-}
-
-void test_coalesce(struct isl_ctx *ctx)
-{
-	const char *str;
-	struct isl_set *set, *set2;
-	struct isl_map *map, *map2;
-
-	set = isl_set_read_from_str(ctx,
-		"{[x,y]: x >= 0 & x <= 10 & y >= 0 & y <= 10 or "
-		       "y >= x & x >= 2 & 5 >= y }", -1);
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 1);
-	isl_set_free(set);
-
-	set = isl_set_read_from_str(ctx,
-		"{[x,y]: y >= 0 & 2x + y <= 30 & y <= 10 & x >= 0 or "
-		       "x + y >= 10 & y <= x & x + y <= 20 & y >= 0}", -1);
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 1);
-	isl_set_free(set);
-
-	set = isl_set_read_from_str(ctx,
-		"{[x,y]: y >= 0 & 2x + y <= 30 & y <= 10 & x >= 0 or "
-		       "x + y >= 10 & y <= x & x + y <= 19 & y >= 0}", -1);
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 2);
-	isl_set_free(set);
-
-	set = isl_set_read_from_str(ctx,
-		"{[x,y]: y >= 0 & x <= 5 & y <= x or "
-		       "y >= 0 & x >= 6 & x <= 10 & y <= x}", -1);
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 1);
-	isl_set_free(set);
-
-	set = isl_set_read_from_str(ctx,
-		"{[x,y]: y >= 0 & x <= 5 & y <= x or "
-		       "y >= 0 & x >= 7 & x <= 10 & y <= x}", -1);
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 2);
-	isl_set_free(set);
-
-	set = isl_set_read_from_str(ctx,
-		"{[x,y]: y >= 0 & x <= 5 & y <= x or "
-		       "y >= 0 & x >= 6 & x <= 10 & y + 1 <= x}", -1);
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 2);
-	isl_set_free(set);
-
-	set = isl_set_read_from_str(ctx,
-		"{[x,y]: y >= 0 & x <= 5 & y <= x or "
-		       "y >= 0 & x = 6 & y <= 6}", -1);
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 1);
-	isl_set_free(set);
-
-	set = isl_set_read_from_str(ctx,
-		"{[x,y]: y >= 0 & x <= 5 & y <= x or "
-		       "y >= 0 & x = 7 & y <= 6}", -1);
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 2);
-	isl_set_free(set);
-
-	set = isl_set_read_from_str(ctx,
-		"{[x,y]: y >= 0 & x <= 5 & y <= x or "
-		       "y >= 0 & x = 6 & y <= 5}", -1);
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 1);
-	set2 = isl_set_read_from_str(ctx,
-		"{[x,y]: y >= 0 & x <= 5 & y <= x or "
-		       "y >= 0 & x = 6 & y <= 5}", -1);
-	assert(isl_set_is_equal(set, set2));
-	isl_set_free(set);
-	isl_set_free(set2);
-
-	set = isl_set_read_from_str(ctx,
-		"{[x,y]: y >= 0 & x <= 5 & y <= x or "
-		       "y >= 0 & x = 6 & y <= 7}", -1);
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 2);
-	isl_set_free(set);
-
-	set = isl_set_read_from_str(ctx,
-		"[n] -> { [i] : i = 1 and n >= 2 or 2 <= i and i <= n }", -1);
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 1);
-	set2 = isl_set_read_from_str(ctx,
-		"[n] -> { [i] : i = 1 and n >= 2 or 2 <= i and i <= n }", -1);
-	assert(isl_set_is_equal(set, set2));
-	isl_set_free(set);
-	isl_set_free(set2);
-
-	set = isl_set_read_from_str(ctx,
-		"{[x,y] : x >= 0 and y >= 0 or 0 <= y and y <= 5 and x = -1}", -1);
-	set = isl_set_coalesce(set);
-	set2 = isl_set_read_from_str(ctx,
-		"{[x,y] : x >= 0 and y >= 0 or 0 <= y and y <= 5 and x = -1}", -1);
-	assert(isl_set_is_equal(set, set2));
-	isl_set_free(set);
-	isl_set_free(set2);
-
-	set = isl_set_read_from_str(ctx,
-		"[n] -> { [i] : 1 <= i and i <= n - 1 or "
-				"2 <= i and i <= n }", -1);
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 1);
-	set2 = isl_set_read_from_str(ctx,
-		"[n] -> { [i] : 1 <= i and i <= n - 1 or "
-				"2 <= i and i <= n }", -1);
-	assert(isl_set_is_equal(set, set2));
-	isl_set_free(set);
-	isl_set_free(set2);
-
-	map = isl_map_read_from_str(ctx,
-		"[n] -> { [i0] -> [o0] : exists (e0 = [(i0)/4], e1 = [(o0)/4], "
-		"e2 = [(n)/2], e3 = [(-2 + i0)/4], e4 = [(-2 + o0)/4], "
-		"e5 = [(-2n + i0)/4]: 2e2 = n and 4e3 = -2 + i0 and "
-		"4e4 = -2 + o0 and i0 >= 8 + 2n and o0 >= 2 + i0 and "
-		"o0 <= 56 + 2n and o0 <= -12 + 4n and i0 <= 57 + 2n and "
-		"i0 <= -11 + 4n and o0 >= 6 + 2n and 4e0 <= i0 and "
-		"4e0 >= -3 + i0 and 4e1 <= o0 and 4e1 >= -3 + o0 and "
-		"4e5 <= -2n + i0 and 4e5 >= -3 - 2n + i0);"
-		"[i0] -> [o0] : exists (e0 = [(i0)/4], e1 = [(o0)/4], "
-		"e2 = [(n)/2], e3 = [(-2 + i0)/4], e4 = [(-2 + o0)/4], "
-		"e5 = [(-2n + i0)/4]: 2e2 = n and 4e3 = -2 + i0 and "
-		"4e4 = -2 + o0 and 2e0 >= 3 + n and e0 <= -4 + n and "
-		"2e0 <= 27 + n and e1 <= -4 + n and 2e1 <= 27 + n and "
-		"2e1 >= 2 + n and e1 >= 1 + e0 and i0 >= 7 + 2n and "
-		"i0 <= -11 + 4n and i0 <= 57 + 2n and 4e0 <= -2 + i0 and "
-		"4e0 >= -3 + i0 and o0 >= 6 + 2n and o0 <= -11 + 4n and "
-		"o0 <= 57 + 2n and 4e1 <= -2 + o0 and 4e1 >= -3 + o0 and "
-		"4e5 <= -2n + i0 and 4e5 >= -3 - 2n + i0 ) }", -1);
-	map = isl_map_coalesce(map);
-	map2 = isl_map_read_from_str(ctx,
-		"[n] -> { [i0] -> [o0] : exists (e0 = [(i0)/4], e1 = [(o0)/4], "
-		"e2 = [(n)/2], e3 = [(-2 + i0)/4], e4 = [(-2 + o0)/4], "
-		"e5 = [(-2n + i0)/4]: 2e2 = n and 4e3 = -2 + i0 and "
-		"4e4 = -2 + o0 and i0 >= 8 + 2n and o0 >= 2 + i0 and "
-		"o0 <= 56 + 2n and o0 <= -12 + 4n and i0 <= 57 + 2n and "
-		"i0 <= -11 + 4n and o0 >= 6 + 2n and 4e0 <= i0 and "
-		"4e0 >= -3 + i0 and 4e1 <= o0 and 4e1 >= -3 + o0 and "
-		"4e5 <= -2n + i0 and 4e5 >= -3 - 2n + i0);"
-		"[i0] -> [o0] : exists (e0 = [(i0)/4], e1 = [(o0)/4], "
-		"e2 = [(n)/2], e3 = [(-2 + i0)/4], e4 = [(-2 + o0)/4], "
-		"e5 = [(-2n + i0)/4]: 2e2 = n and 4e3 = -2 + i0 and "
-		"4e4 = -2 + o0 and 2e0 >= 3 + n and e0 <= -4 + n and "
-		"2e0 <= 27 + n and e1 <= -4 + n and 2e1 <= 27 + n and "
-		"2e1 >= 2 + n and e1 >= 1 + e0 and i0 >= 7 + 2n and "
-		"i0 <= -11 + 4n and i0 <= 57 + 2n and 4e0 <= -2 + i0 and "
-		"4e0 >= -3 + i0 and o0 >= 6 + 2n and o0 <= -11 + 4n and "
-		"o0 <= 57 + 2n and 4e1 <= -2 + o0 and 4e1 >= -3 + o0 and "
-		"4e5 <= -2n + i0 and 4e5 >= -3 - 2n + i0 ) }", -1);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "[n, m] -> { [] -> [o0, o2, o3] : (o3 = 1 and o0 >= 1 + m and "
-	      "o0 <= n + m and o2 <= m and o0 >= 2 + n and o2 >= 3) or "
-	      "(o0 >= 2 + n and o0 >= 1 + m and o0 <= n + m and n >= 1 and "
-	      "o3 <= -1 + o2 and o3 >= 1 - m + o2 and o3 >= 2 and o3 <= n) }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	map = isl_map_coalesce(map);
-	map2 = isl_map_read_from_str(ctx, str, -1);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "[M, N] -> { [i0, i1, i2, i3, i4, i5, i6] -> "
-	  "[o0, o1, o2, o3, o4, o5, o6] : "
-	  "(o6 <= -4 + 2M - 2N + i0 + i1 - i2 + i6 - o0 - o1 + o2 and "
-	  "o3 <= -2 + i3 and o6 >= 2 + i0 + i3 + i6 - o0 - o3 and "
-	  "o6 >= 2 - M + N + i3 + i4 + i6 - o3 - o4 and o0 <= -1 + i0 and "
-	  "o4 >= 4 - 3M + 3N - i0 - i1 + i2 + 2i3 + i4 + o0 + o1 - o2 - 2o3 "
-	  "and o6 <= -3 + 2M - 2N + i3 + i4 - i5 + i6 - o3 - o4 + o5 and "
-	  "2o6 <= -5 + 5M - 5N + 2i0 + i1 - i2 - i5 + 2i6 - 2o0 - o1 + o2 + o5 "
-	  "and o6 >= 2i0 + i1 + i6 - 2o0 - o1 and "
-	  "3o6 <= -5 + 4M - 4N + 2i0 + i1 - i2 + 2i3 + i4 - i5 + 3i6 "
-	  "- 2o0 - o1 + o2 - 2o3 - o4 + o5) or "
-	  "(N >= 2 and o3 <= -1 + i3 and o0 <= -1 + i0 and "
-	  "o6 >= i3 + i6 - o3 and M >= 0 and "
-	  "2o6 >= 1 + i0 + i3 + 2i6 - o0 - o3 and "
-	  "o6 >= 1 - M + i0 + i6 - o0 and N >= 2M and o6 >= i0 + i6 - o0) }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	map = isl_map_coalesce(map);
-	map2 = isl_map_read_from_str(ctx, str, -1);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "[M, N] -> { [] -> [o0] : (o0 = 0 and M >= 1 and N >= 2) or "
-		"(o0 = 0 and M >= 1 and N >= 2M and N >= 2 + M) or "
-		"(o0 = 0 and M >= 2 and N >= 3) or "
-		"(M = 0 and o0 = 0 and N >= 3) }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	map = isl_map_coalesce(map);
-	map2 = isl_map_read_from_str(ctx, str, -1);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "{ [i0, i1, i2, i3] : (i1 = 10i0 and i0 >= 1 and 10i0 <= 100 and "
-		"i3 <= 9 + 10 i2 and i3 >= 1 + 10i2 and i3 >= 0) or "
-		"(i1 <= 9 + 10i0 and i1 >= 1 + 10i0 and i2 >= 0 and "
-		"i0 >= 0 and i1 <= 100 and i3 <= 9 + 10i2 and i3 >= 1 + 10i2) }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	map = isl_map_coalesce(map);
-	map2 = isl_map_read_from_str(ctx, str, -1);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	test_coalesce_set(ctx,
-		"[M] -> { [i1] : (i1 >= 2 and i1 <= M) or "
-				"(i1 = M and M >= 1) }", 0);
-	test_coalesce_set(ctx,
-		"{[x,y] : x,y >= 0; [x,y] : 10 <= x <= 20 and y >= -1 }", 0);
-	test_coalesce_set(ctx,
-		"{ [x, y] : (x >= 1 and y >= 1 and x <= 2 and y <= 2) or "
-		"(y = 3 and x = 1) }", 1);
-	test_coalesce_set(ctx,
-		"[M] -> { [i0, i1, i2, i3, i4] : (i1 >= 3 and i4 >= 2 + i2 and "
-		"i2 >= 2 and i0 >= 2 and i3 >= 1 + i2 and i0 <= M and "
-		"i1 <= M and i3 <= M and i4 <= M) or "
-		"(i1 >= 2 and i4 >= 1 + i2 and i2 >= 2 and i0 >= 2 and "
-		"i3 >= 1 + i2 and i0 <= M and i1 <= -1 + M and i3 <= M and "
-		"i4 <= -1 + M) }", 1);
-	test_coalesce_set(ctx,
-		"{ [x, y] : (x >= 0 and y >= 0 and x <= 10 and y <= 10) or "
-		"(x >= 1 and y >= 1 and x <= 11 and y <= 11) }", 1);
-	test_coalesce_set(ctx,
-		"{[x,y,z] : y + 2 >= 0 and x - y + 1 >= 0 and "
-			"-x - y + 1 >= 0 and -3 <= z <= 3;"
-		"[x,y,z] : -x+z + 20 >= 0 and -x-z + 20 >= 0 and "
-			"x-z + 20 >= 0 and x+z + 20 >= 0 and -10 <= y <= 0}", 1);
-	test_coalesce_set(ctx,
-		"{[x,y] : 0 <= x,y <= 10; [5,y]: 4 <=y <= 11}", 1);
-	test_coalesce_set(ctx, "{[x,0] : x >= 0; [x,1] : x <= 20}", 0);
-	test_coalesce_set(ctx,
-		"{[x,0,0] : -5 <= x <= 5; [0,y,1] : -5 <= y <= 5 }", 1);
-	test_coalesce_set(ctx, "{ [x, 1 - x] : 0 <= x <= 1; [0,0] }", 1);
-	test_coalesce_set(ctx, "{ [0,0]; [i,i] : 1 <= i <= 10 }", 1);
-	test_coalesce_set(ctx, "{ [0,0]; [i,j] : 1 <= i,j <= 10 }", 0);
-	test_coalesce_set(ctx, "{ [0,0]; [i,2i] : 1 <= i <= 10 }", 1);
-	test_coalesce_set(ctx, "{ [0,0]; [i,2i] : 2 <= i <= 10 }", 0);
-	test_coalesce_set(ctx, "{ [1,0]; [i,2i] : 1 <= i <= 10 }", 0);
-	test_coalesce_set(ctx, "{ [0,1]; [i,2i] : 1 <= i <= 10 }", 0);
-}
-
-void test_closure(struct isl_ctx *ctx)
-{
-	const char *str;
-	isl_set *dom;
-	isl_map *up, *right;
-	isl_map *map, *map2;
-	int exact;
-
-	/* COCOA example 1 */
-	map = isl_map_read_from_str(ctx,
-		"[n] -> { [i,j] -> [i2,j2] : i2 = i + 1 and j2 = j + 1 and "
-			"1 <= i and i < n and 1 <= j and j < n or "
-			"i2 = i + 1 and j2 = j - 1 and "
-			"1 <= i and i < n and 2 <= j and j <= n }", -1);
-	map = isl_map_power(map, &exact);
-	assert(exact);
-	isl_map_free(map);
-
-	/* COCOA example 1 */
-	map = isl_map_read_from_str(ctx,
-		"[n] -> { [i,j] -> [i2,j2] : i2 = i + 1 and j2 = j + 1 and "
-			"1 <= i and i < n and 1 <= j and j < n or "
-			"i2 = i + 1 and j2 = j - 1 and "
-			"1 <= i and i < n and 2 <= j and j <= n }", -1);
-	map = isl_map_transitive_closure(map, &exact);
-	assert(exact);
-	map2 = isl_map_read_from_str(ctx,
-		"[n] -> { [i,j] -> [i2,j2] : exists (k1,k2,k : "
-			"1 <= i and i < n and 1 <= j and j <= n and "
-			"2 <= i2 and i2 <= n and 1 <= j2 and j2 <= n and "
-			"i2 = i + k1 + k2 and j2 = j + k1 - k2 and "
-			"k1 >= 0 and k2 >= 0 and k1 + k2 = k and k >= 1 )}", -1);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map2);
-	isl_map_free(map);
-
-	map = isl_map_read_from_str(ctx,
-		"[n] -> { [x] -> [y] : y = x + 1 and 0 <= x and x <= n and "
-				     " 0 <= y and y <= n }", -1);
-	map = isl_map_transitive_closure(map, &exact);
-	map2 = isl_map_read_from_str(ctx,
-		"[n] -> { [x] -> [y] : y > x and 0 <= x and x <= n and "
-				     " 0 <= y and y <= n }", -1);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map2);
-	isl_map_free(map);
-
-	/* COCOA example 2 */
-	map = isl_map_read_from_str(ctx,
-		"[n] -> { [i,j] -> [i2,j2] : i2 = i + 2 and j2 = j + 2 and "
-			"1 <= i and i < n - 1 and 1 <= j and j < n - 1 or "
-			"i2 = i + 2 and j2 = j - 2 and "
-			"1 <= i and i < n - 1 and 3 <= j and j <= n }", -1);
-	map = isl_map_transitive_closure(map, &exact);
-	assert(exact);
-	map2 = isl_map_read_from_str(ctx,
-		"[n] -> { [i,j] -> [i2,j2] : exists (k1,k2,k : "
-			"1 <= i and i < n - 1 and 1 <= j and j <= n and "
-			"3 <= i2 and i2 <= n and 1 <= j2 and j2 <= n and "
-			"i2 = i + 2 k1 + 2 k2 and j2 = j + 2 k1 - 2 k2 and "
-			"k1 >= 0 and k2 >= 0 and k1 + k2 = k and k >= 1) }", -1);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	/* COCOA Fig.2 left */
-	map = isl_map_read_from_str(ctx,
-		"[n] -> { [i,j] -> [i2,j2] : i2 = i + 2 and j2 = j and "
-			"i <= 2 j - 3 and i <= n - 2 and j <= 2 i - 1 and "
-			"j <= n or "
-			"i2 = i and j2 = j + 2 and i <= 2 j - 1 and i <= n and "
-			"j <= 2 i - 3 and j <= n - 2 or "
-			"i2 = i + 1 and j2 = j + 1 and i <= 2 j - 1 and "
-			"i <= n - 1 and j <= 2 i - 1 and j <= n - 1 }", -1);
-	map = isl_map_transitive_closure(map, &exact);
-	assert(exact);
-	isl_map_free(map);
-
-	/* COCOA Fig.2 right */
-	map = isl_map_read_from_str(ctx,
-		"[n] -> { [i,j] -> [i2,j2] : i2 = i + 3 and j2 = j and "
-			"i <= 2 j - 4 and i <= n - 3 and j <= 2 i - 1 and "
-			"j <= n or "
-			"i2 = i and j2 = j + 3 and i <= 2 j - 1 and i <= n and "
-			"j <= 2 i - 4 and j <= n - 3 or "
-			"i2 = i + 1 and j2 = j + 1 and i <= 2 j - 1 and "
-			"i <= n - 1 and j <= 2 i - 1 and j <= n - 1 }", -1);
-	map = isl_map_power(map, &exact);
-	assert(exact);
-	isl_map_free(map);
-
-	/* COCOA Fig.2 right */
-	map = isl_map_read_from_str(ctx,
-		"[n] -> { [i,j] -> [i2,j2] : i2 = i + 3 and j2 = j and "
-			"i <= 2 j - 4 and i <= n - 3 and j <= 2 i - 1 and "
-			"j <= n or "
-			"i2 = i and j2 = j + 3 and i <= 2 j - 1 and i <= n and "
-			"j <= 2 i - 4 and j <= n - 3 or "
-			"i2 = i + 1 and j2 = j + 1 and i <= 2 j - 1 and "
-			"i <= n - 1 and j <= 2 i - 1 and j <= n - 1 }", -1);
-	map = isl_map_transitive_closure(map, &exact);
-	assert(exact);
-	map2 = isl_map_read_from_str(ctx,
-		"[n] -> { [i,j] -> [i2,j2] : exists (k1,k2,k3,k : "
-			"i <= 2 j - 1 and i <= n and j <= 2 i - 1 and "
-			"j <= n and 3 + i + 2 j <= 3 n and "
-			"3 + 2 i + j <= 3n and i2 <= 2 j2 -1 and i2 <= n and "
-			"i2 <= 3 j2 - 4 and j2 <= 2 i2 -1 and j2 <= n and "
-			"13 + 4 j2 <= 11 i2 and i2 = i + 3 k1 + k3 and "
-			"j2 = j + 3 k2 + k3 and k1 >= 0 and k2 >= 0 and "
-			"k3 >= 0 and k1 + k2 + k3 = k and k > 0) }", -1);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map2);
-	isl_map_free(map);
-
-	/* COCOA Fig.1 right */
-	dom = isl_set_read_from_str(ctx,
-		"{ [x,y] : x >= 0 and -2 x + 3 y >= 0 and x <= 3 and "
-			"2 x - 3 y + 3 >= 0 }", -1);
-	right = isl_map_read_from_str(ctx,
-		"{ [x,y] -> [x2,y2] : x2 = x + 1 and y2 = y }", -1);
-	up = isl_map_read_from_str(ctx,
-		"{ [x,y] -> [x2,y2] : x2 = x and y2 = y + 1 }", -1);
-	right = isl_map_intersect_domain(right, isl_set_copy(dom));
-	right = isl_map_intersect_range(right, isl_set_copy(dom));
-	up = isl_map_intersect_domain(up, isl_set_copy(dom));
-	up = isl_map_intersect_range(up, dom);
-	map = isl_map_union(up, right);
-	map = isl_map_transitive_closure(map, &exact);
-	assert(exact);
-	map2 = isl_map_read_from_str(ctx,
-		"{ [0,0] -> [0,1]; [0,0] -> [1,1]; [0,1] -> [1,1]; "
-		"  [2,2] -> [3,2]; [2,2] -> [3,3]; [3,2] -> [3,3] }", -1);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map2);
-	isl_map_free(map);
-
-	/* COCOA Theorem 1 counter example */
-	map = isl_map_read_from_str(ctx,
-		"{ [i,j] -> [i2,j2] : i = 0 and 0 <= j and j <= 1 and "
-			"i2 = 1 and j2 = j or "
-			"i = 0 and j = 0 and i2 = 0 and j2 = 1 }", -1);
-	map = isl_map_transitive_closure(map, &exact);
-	assert(exact);
-	isl_map_free(map);
-
-	map = isl_map_read_from_str(ctx,
-		"[m,n] -> { [i,j] -> [i2,j2] : i2 = i and j2 = j + 2 and "
-			"1 <= i,i2 <= n and 1 <= j,j2 <= m or "
-			"i2 = i + 1 and 3 <= j2 - j <= 4 and "
-			"1 <= i,i2 <= n and 1 <= j,j2 <= m }", -1);
-	map = isl_map_transitive_closure(map, &exact);
-	assert(exact);
-	isl_map_free(map);
-
-	/* Kelly et al 1996, fig 12 */
-	map = isl_map_read_from_str(ctx,
-		"[n] -> { [i,j] -> [i2,j2] : i2 = i and j2 = j + 1 and "
-			"1 <= i,j,j+1 <= n or "
-			"j = n and j2 = 1 and i2 = i + 1 and "
-			"1 <= i,i+1 <= n }", -1);
-	map = isl_map_transitive_closure(map, &exact);
-	assert(exact);
-	map2 = isl_map_read_from_str(ctx,
-		"[n] -> { [i,j] -> [i2,j2] : 1 <= j < j2 <= n and "
-			"1 <= i <= n and i = i2 or "
-			"1 <= i < i2 <= n and 1 <= j <= n and "
-			"1 <= j2 <= n }", -1);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map2);
-	isl_map_free(map);
-
-	/* Omega's closure4 */
-	map = isl_map_read_from_str(ctx,
-		"[m,n] -> { [x,y] -> [x2,y2] : x2 = x and y2 = y + 1 and "
-			"1 <= x,y <= 10 or "
-			"x2 = x + 1 and y2 = y and "
-			"1 <= x <= 20 && 5 <= y <= 15 }", -1);
-	map = isl_map_transitive_closure(map, &exact);
-	assert(exact);
-	isl_map_free(map);
-
-	map = isl_map_read_from_str(ctx,
-		"[n] -> { [x] -> [y]: 1 <= n <= y - x <= 10 }", -1);
-	map = isl_map_transitive_closure(map, &exact);
-	assert(!exact);
-	map2 = isl_map_read_from_str(ctx,
-		"[n] -> { [x] -> [y] : 1 <= n <= 10 and y >= n + x }", -1);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "[n, m] -> { [i0, i1, i2, i3] -> [o0, o1, o2, o3] : "
-	    "i3 = 1 and o0 = i0 and o1 = -1 + i1 and o2 = -1 + i2 and "
-	    "o3 = -2 + i2 and i1 <= -1 + i0 and i1 >= 1 - m + i0 and "
-	    "i1 >= 2 and i1 <= n and i2 >= 3 and i2 <= 1 + n and i2 <= m }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	map = isl_map_transitive_closure(map, &exact);
-	assert(exact);
-	map2 = isl_map_read_from_str(ctx, str, -1);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "{[0] -> [1]; [2] -> [3]}";
-	map = isl_map_read_from_str(ctx, str, -1);
-	map = isl_map_transitive_closure(map, &exact);
-	assert(exact);
-	map2 = isl_map_read_from_str(ctx, str, -1);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "[n] -> { [[i0, i1, 1, 0, i0] -> [i5, 1]] -> "
-	    "[[i0, -1 + i1, 2, 0, i0] -> [-1 + i5, 2]] : "
-	    "exists (e0 = [(3 - n)/3]: i5 >= 2 and i1 >= 2 and "
-	    "3i0 <= -1 + n and i1 <= -1 + n and i5 <= -1 + n and "
-	    "3e0 >= 1 - n and 3e0 <= 2 - n and 3i0 >= -2 + n); "
-	    "[[i0, i1, 2, 0, i0] -> [i5, 1]] -> "
-	    "[[i0, i1, 1, 0, i0] -> [-1 + i5, 2]] : "
-	    "exists (e0 = [(3 - n)/3]: i5 >= 2 and i1 >= 1 and "
-	    "3i0 <= -1 + n and i1 <= -1 + n and i5 <= -1 + n and "
-	    "3e0 >= 1 - n and 3e0 <= 2 - n and 3i0 >= -2 + n); "
-	    "[[i0, i1, 1, 0, i0] -> [i5, 2]] -> "
-	    "[[i0, -1 + i1, 2, 0, i0] -> [i5, 1]] : "
-	    "exists (e0 = [(3 - n)/3]: i1 >= 2 and i5 >= 1 and "
-	    "3i0 <= -1 + n and i1 <= -1 + n and i5 <= -1 + n and "
-	    "3e0 >= 1 - n and 3e0 <= 2 - n and 3i0 >= -2 + n); "
-	    "[[i0, i1, 2, 0, i0] -> [i5, 2]] -> "
-	    "[[i0, i1, 1, 0, i0] -> [i5, 1]] : "
-	    "exists (e0 = [(3 - n)/3]: i5 >= 1 and i1 >= 1 and "
-	    "3i0 <= -1 + n and i1 <= -1 + n and i5 <= -1 + n and "
-	    "3e0 >= 1 - n and 3e0 <= 2 - n and 3i0 >= -2 + n) }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	map = isl_map_transitive_closure(map, NULL);
-	assert(map);
-	isl_map_free(map);
-}
-
-void test_lex(struct isl_ctx *ctx)
-{
-	isl_dim *dim;
-	isl_map *map;
-
-	dim = isl_dim_alloc(ctx, 0, 0, 0);
-	map = isl_map_lex_le(dim);
-	assert(!isl_map_is_empty(map));
-	isl_map_free(map);
-}
-
-static int consume_lexmin(__isl_take isl_basic_set *dom,
-	__isl_take isl_aff_list *list, void *user)
-{
-	isl_dim *dim;
-	isl_basic_map *bmap;
-	isl_map **map = user;
-
-	dim = isl_basic_set_get_dim(dom);
-	bmap = isl_basic_map_from_aff_list(dim, list);
-	bmap = isl_basic_map_intersect_domain(bmap, dom);
-
-	*map = isl_map_union(*map, isl_map_from_basic_map(bmap));
-
-	return 0;
-}
-
-void test_lexmin(struct isl_ctx *ctx)
-{
-	const char *str;
-	isl_basic_map *bmap;
-	isl_map *map, *map2;
-	isl_set *set;
-	isl_set *set2;
-
-	str = "[p0, p1] -> { [] -> [] : "
-	    "exists (e0 = [(2p1)/3], e1, e2, e3 = [(3 - p1 + 3e0)/3], "
-	    "e4 = [(p1)/3], e5 = [(p1 + 3e4)/3]: "
-	    "3e0 >= -2 + 2p1 and 3e0 >= p1 and 3e3 >= 1 - p1 + 3e0 and "
-	    "3e0 <= 2p1 and 3e3 >= -2 + p1 and 3e3 <= -1 + p1 and p1 >= 3 and "
-	    "3e5 >= -2 + 2p1 and 3e5 >= p1 and 3e5 <= -1 + p1 + 3e4 and "
-	    "3e4 <= p1 and 3e4 >= -2 + p1 and e3 <= -1 + e0 and "
-	    "3e4 >= 6 - p1 + 3e1 and 3e1 >= p1 and 3e5 >= -2 + p1 + 3e4 and "
-	    "2e4 >= 3 - p1 + 2e1 and e4 <= e1 and 3e3 <= 2 - p1 + 3e0 and "
-	    "e5 >= 1 + e1 and 3e4 >= 6 - 2p1 + 3e1 and "
-	    "p0 >= 2 and p1 >= p0 and 3e2 >= p1 and 3e4 >= 6 - p1 + 3e2 and "
-	    "e2 <= e1 and e3 >= 1 and e4 <= e2) }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	map = isl_map_lexmin(map);
-	isl_map_free(map);
-
-	str = "[C] -> { [obj,a,b,c] : obj <= 38 a + 7 b + 10 c and "
-	    "a + b <= 1 and c <= 10 b and c <= C and a,b,c,C >= 0 }";
-	set = isl_set_read_from_str(ctx, str, -1);
-	set = isl_set_lexmax(set);
-	str = "[C] -> { [obj,a,b,c] : C = 8 }";
-	set2 = isl_set_read_from_str(ctx, str, -1);
-	set = isl_set_intersect(set, set2);
-	assert(!isl_set_is_empty(set));
-	isl_set_free(set);
-
-	str = "{ [x] -> [y] : x <= y <= 10; [x] -> [5] : -8 <= x <= 8 }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	map = isl_map_lexmin(map);
-	str = "{ [x] -> [5] : 6 <= x <= 8; "
-		"[x] -> [x] : x <= 5 or (9 <= x <= 10) }";
-	map2 = isl_map_read_from_str(ctx, str, -1);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "{ [x] -> [y] : 4y = x or 4y = -1 + x or 4y = -2 + x }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	map2 = isl_map_copy(map);
-	map = isl_map_lexmin(map);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "{ [x] -> [y] : x = 4y; [x] -> [y] : x = 2y }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	map = isl_map_lexmin(map);
-	str = "{ [x] -> [y] : (4y = x and x >= 0) or "
-		"(exists (e0 = [(x)/4], e1 = [(-2 + x)/4]: 2y = x and "
-		"4e1 = -2 + x and 4e0 <= -1 + x and 4e0 >= -3 + x)) or "
-		"(exists (e0 = [(x)/4]: 2y = x and 4e0 = x and x <= -4)) }";
-	map2 = isl_map_read_from_str(ctx, str, -1);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "{ [i] -> [i', j] : j = i - 8i' and i' >= 0 and i' <= 7 and "
-				" 8i' <= i and 8i' >= -7 + i }";
-	bmap = isl_basic_map_read_from_str(ctx, str, -1);
-	map2 = isl_map_empty(isl_basic_map_get_dim(bmap));
-	isl_basic_map_foreach_lexmin(bmap, &consume_lexmin, &map2);
-	map = isl_map_from_basic_map(bmap);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-}
-
-struct must_may {
-	isl_map *must;
-	isl_map *may;
-};
-
-static int collect_must_may(__isl_take isl_map *dep, int must,
-	void *dep_user, void *user)
-{
-	struct must_may *mm = (struct must_may *)user;
-
-	if (must)
-		mm->must = isl_map_union(mm->must, dep);
-	else
-		mm->may = isl_map_union(mm->may, dep);
-
-	return 0;
-}
-
-static int common_space(void *first, void *second)
-{
-	int depth = *(int *)first;
-	return 2 * depth;
-}
-
-static int map_is_equal(__isl_keep isl_map *map, const char *str)
-{
-	isl_map *map2;
-	int equal;
-
-	if (!map)
-		return -1;
-
-	map2 = isl_map_read_from_str(map->ctx, str, -1);
-	equal = isl_map_is_equal(map, map2);
-	isl_map_free(map2);
-
-	return equal;
-}
-
-void test_dep(struct isl_ctx *ctx)
-{
-	const char *str;
-	isl_dim *dim;
-	isl_map *map;
-	isl_access_info *ai;
-	isl_flow *flow;
-	int depth;
-	struct must_may mm;
-
-	depth = 3;
-
-	str = "{ [2,i,0] -> [i] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	ai = isl_access_info_alloc(map, &depth, &common_space, 2);
-
-	str = "{ [0,i,0] -> [i] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	ai = isl_access_info_add_source(ai, map, 1, &depth);
-
-	str = "{ [1,i,0] -> [5] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	ai = isl_access_info_add_source(ai, map, 1, &depth);
-
-	flow = isl_access_info_compute_flow(ai);
-	dim = isl_dim_alloc(ctx, 0, 3, 3);
-	mm.must = isl_map_empty(isl_dim_copy(dim));
-	mm.may = isl_map_empty(dim);
-
-	isl_flow_foreach(flow, collect_must_may, &mm);
-
-	str = "{ [0,i,0] -> [2,i,0] : (0 <= i <= 4) or (6 <= i <= 10); "
-	      "  [1,10,0] -> [2,5,0] }";
-	assert(map_is_equal(mm.must, str));
-	str = "{ [i,j,k] -> [l,m,n] : 1 = 0 }";
-	assert(map_is_equal(mm.may, str));
-
-	isl_map_free(mm.must);
-	isl_map_free(mm.may);
-	isl_flow_free(flow);
-
-
-	str = "{ [2,i,0] -> [i] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	ai = isl_access_info_alloc(map, &depth, &common_space, 2);
-
-	str = "{ [0,i,0] -> [i] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	ai = isl_access_info_add_source(ai, map, 1, &depth);
-
-	str = "{ [1,i,0] -> [5] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	ai = isl_access_info_add_source(ai, map, 0, &depth);
-
-	flow = isl_access_info_compute_flow(ai);
-	dim = isl_dim_alloc(ctx, 0, 3, 3);
-	mm.must = isl_map_empty(isl_dim_copy(dim));
-	mm.may = isl_map_empty(dim);
-
-	isl_flow_foreach(flow, collect_must_may, &mm);
-
-	str = "{ [0,i,0] -> [2,i,0] : (0 <= i <= 4) or (6 <= i <= 10) }";
-	assert(map_is_equal(mm.must, str));
-	str = "{ [0,5,0] -> [2,5,0]; [1,i,0] -> [2,5,0] : 0 <= i <= 10 }";
-	assert(map_is_equal(mm.may, str));
-
-	isl_map_free(mm.must);
-	isl_map_free(mm.may);
-	isl_flow_free(flow);
-
-
-	str = "{ [2,i,0] -> [i] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	ai = isl_access_info_alloc(map, &depth, &common_space, 2);
-
-	str = "{ [0,i,0] -> [i] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	ai = isl_access_info_add_source(ai, map, 0, &depth);
-
-	str = "{ [1,i,0] -> [5] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	ai = isl_access_info_add_source(ai, map, 0, &depth);
-
-	flow = isl_access_info_compute_flow(ai);
-	dim = isl_dim_alloc(ctx, 0, 3, 3);
-	mm.must = isl_map_empty(isl_dim_copy(dim));
-	mm.may = isl_map_empty(dim);
-
-	isl_flow_foreach(flow, collect_must_may, &mm);
-
-	str = "{ [0,i,0] -> [2,i,0] : 0 <= i <= 10; "
-	      "  [1,i,0] -> [2,5,0] : 0 <= i <= 10 }";
-	assert(map_is_equal(mm.may, str));
-	str = "{ [i,j,k] -> [l,m,n] : 1 = 0 }";
-	assert(map_is_equal(mm.must, str));
-
-	isl_map_free(mm.must);
-	isl_map_free(mm.may);
-	isl_flow_free(flow);
-
-
-	str = "{ [0,i,2] -> [i] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	ai = isl_access_info_alloc(map, &depth, &common_space, 2);
-
-	str = "{ [0,i,0] -> [i] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	ai = isl_access_info_add_source(ai, map, 0, &depth);
-
-	str = "{ [0,i,1] -> [5] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	ai = isl_access_info_add_source(ai, map, 0, &depth);
-
-	flow = isl_access_info_compute_flow(ai);
-	dim = isl_dim_alloc(ctx, 0, 3, 3);
-	mm.must = isl_map_empty(isl_dim_copy(dim));
-	mm.may = isl_map_empty(dim);
-
-	isl_flow_foreach(flow, collect_must_may, &mm);
-
-	str = "{ [0,i,0] -> [0,i,2] : 0 <= i <= 10; "
-	      "  [0,i,1] -> [0,5,2] : 0 <= i <= 5 }";
-	assert(map_is_equal(mm.may, str));
-	str = "{ [i,j,k] -> [l,m,n] : 1 = 0 }";
-	assert(map_is_equal(mm.must, str));
-
-	isl_map_free(mm.must);
-	isl_map_free(mm.may);
-	isl_flow_free(flow);
-
-
-	str = "{ [0,i,1] -> [i] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	ai = isl_access_info_alloc(map, &depth, &common_space, 2);
-
-	str = "{ [0,i,0] -> [i] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	ai = isl_access_info_add_source(ai, map, 0, &depth);
-
-	str = "{ [0,i,2] -> [5] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	ai = isl_access_info_add_source(ai, map, 0, &depth);
-
-	flow = isl_access_info_compute_flow(ai);
-	dim = isl_dim_alloc(ctx, 0, 3, 3);
-	mm.must = isl_map_empty(isl_dim_copy(dim));
-	mm.may = isl_map_empty(dim);
-
-	isl_flow_foreach(flow, collect_must_may, &mm);
-
-	str = "{ [0,i,0] -> [0,i,1] : 0 <= i <= 10; "
-	      "  [0,i,2] -> [0,5,1] : 0 <= i <= 4 }";
-	assert(map_is_equal(mm.may, str));
-	str = "{ [i,j,k] -> [l,m,n] : 1 = 0 }";
-	assert(map_is_equal(mm.must, str));
-
-	isl_map_free(mm.must);
-	isl_map_free(mm.may);
-	isl_flow_free(flow);
-
-
-	depth = 5;
-
-	str = "{ [1,i,0,0,0] -> [i,j] : 0 <= i <= 10 and 0 <= j <= 10 }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	ai = isl_access_info_alloc(map, &depth, &common_space, 1);
-
-	str = "{ [0,i,0,j,0] -> [i,j] : 0 <= i <= 10 and 0 <= j <= 10 }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	ai = isl_access_info_add_source(ai, map, 1, &depth);
-
-	flow = isl_access_info_compute_flow(ai);
-	dim = isl_dim_alloc(ctx, 0, 5, 5);
-	mm.must = isl_map_empty(isl_dim_copy(dim));
-	mm.may = isl_map_empty(dim);
-
-	isl_flow_foreach(flow, collect_must_may, &mm);
-
-	str = "{ [0,i,0,j,0] -> [1,i,0,0,0] : 0 <= i,j <= 10 }";
-	assert(map_is_equal(mm.must, str));
-	str = "{ [0,0,0,0,0] -> [0,0,0,0,0] : 1 = 0 }";
-	assert(map_is_equal(mm.may, str));
-
-	isl_map_free(mm.must);
-	isl_map_free(mm.may);
-	isl_flow_free(flow);
-}
-
-int test_sv(isl_ctx *ctx)
-{
-	const char *str;
-	isl_map *map;
-	isl_union_map *umap;
-	int sv;
-
-	str = "[N] -> { [i] -> [f] : 0 <= i <= N and 0 <= i - 10 f <= 9 }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	sv = isl_map_is_single_valued(map);
-	isl_map_free(map);
-	if (sv < 0)
-		return -1;
-	if (!sv)
-		isl_die(ctx, isl_error_internal,
-			"map not detected as single valued", return -1);
-
-	str = "[N] -> { [i] -> [f] : 0 <= i <= N and 0 <= i - 10 f <= 10 }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	sv = isl_map_is_single_valued(map);
-	isl_map_free(map);
-	if (sv < 0)
-		return -1;
-	if (sv)
-		isl_die(ctx, isl_error_internal,
-			"map detected as single valued", return -1);
-
-	str = "{ S1[i] -> [i] : 0 <= i <= 9; S2[i] -> [i] : 0 <= i <= 9 }";
-	umap = isl_union_map_read_from_str(ctx, str);
-	sv = isl_union_map_is_single_valued(umap);
-	isl_union_map_free(umap);
-	if (sv < 0)
-		return -1;
-	if (!sv)
-		isl_die(ctx, isl_error_internal,
-			"map not detected as single valued", return -1);
-
-	str = "{ [i] -> S1[i] : 0 <= i <= 9; [i] -> S2[i] : 0 <= i <= 9 }";
-	umap = isl_union_map_read_from_str(ctx, str);
-	sv = isl_union_map_is_single_valued(umap);
-	isl_union_map_free(umap);
-	if (sv < 0)
-		return -1;
-	if (sv)
-		isl_die(ctx, isl_error_internal,
-			"map detected as single valued", return -1);
-
-	return 0;
-}
-
-void test_bijective_case(struct isl_ctx *ctx, const char *str, int bijective)
-{
-	isl_map *map;
-
-	map = isl_map_read_from_str(ctx, str, -1);
-	if (bijective)
-		assert(isl_map_is_bijective(map));
-	else
-		assert(!isl_map_is_bijective(map));
-	isl_map_free(map);
-}
-
-void test_bijective(struct isl_ctx *ctx)
-{
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [i]}", 0);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [i] : j=i}", 1);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [i] : j=0}", 1);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [i] : j=N}", 1);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [j,i]}", 1);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [i+j]}", 0);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> []}", 0);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [i,j,N]}", 1);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [2i]}", 0);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [i,i]}", 0);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [2i,i]}", 0);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [2i,j]}", 1);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [x,y] : 2x=i & y =j}", 1);
-}
-
-void test_pwqp(struct isl_ctx *ctx)
-{
-	const char *str;
-	isl_set *set;
-	isl_pw_qpolynomial *pwqp1, *pwqp2;
-
-	str = "{ [i,j,k] -> 1 + 9 * [i/5] + 7 * [j/11] + 4 * [k/13] }";
-	pwqp1 = isl_pw_qpolynomial_read_from_str(ctx, str);
-
-	pwqp1 = isl_pw_qpolynomial_move_dims(pwqp1, isl_dim_param, 0,
-						isl_dim_set, 1, 1);
-
-	str = "[j] -> { [i,k] -> 1 + 9 * [i/5] + 7 * [j/11] + 4 * [k/13] }";
-	pwqp2 = isl_pw_qpolynomial_read_from_str(ctx, str);
-
-	pwqp1 = isl_pw_qpolynomial_sub(pwqp1, pwqp2);
-
-	assert(isl_pw_qpolynomial_is_zero(pwqp1));
-
-	isl_pw_qpolynomial_free(pwqp1);
-
-	str = "{ [i] -> i }";
-	pwqp1 = isl_pw_qpolynomial_read_from_str(ctx, str);
-	str = "{ [k] : exists a : k = 2a }";
-	set = isl_set_read_from_str(ctx, str, 0);
-	pwqp1 = isl_pw_qpolynomial_gist(pwqp1, set);
-	str = "{ [i] -> i }";
-	pwqp2 = isl_pw_qpolynomial_read_from_str(ctx, str);
-
-	pwqp1 = isl_pw_qpolynomial_sub(pwqp1, pwqp2);
-
-	assert(isl_pw_qpolynomial_is_zero(pwqp1));
-
-	isl_pw_qpolynomial_free(pwqp1);
-
-	str = "{ [i] -> i + [ (i + [i/3])/2 ] }";
-	pwqp1 = isl_pw_qpolynomial_read_from_str(ctx, str);
-	str = "{ [10] }";
-	set = isl_set_read_from_str(ctx, str, 0);
-	pwqp1 = isl_pw_qpolynomial_gist(pwqp1, set);
-	str = "{ [i] -> 16 }";
-	pwqp2 = isl_pw_qpolynomial_read_from_str(ctx, str);
-
-	pwqp1 = isl_pw_qpolynomial_sub(pwqp1, pwqp2);
-
-	assert(isl_pw_qpolynomial_is_zero(pwqp1));
-
-	isl_pw_qpolynomial_free(pwqp1);
-
-	str = "{ [i] -> ([(i)/2]) }";
-	pwqp1 = isl_pw_qpolynomial_read_from_str(ctx, str);
-	str = "{ [k] : exists a : k = 2a+1 }";
-	set = isl_set_read_from_str(ctx, str, 0);
-	pwqp1 = isl_pw_qpolynomial_gist(pwqp1, set);
-	str = "{ [i] -> -1/2 + 1/2 * i }";
-	pwqp2 = isl_pw_qpolynomial_read_from_str(ctx, str);
-
-	pwqp1 = isl_pw_qpolynomial_sub(pwqp1, pwqp2);
-
-	assert(isl_pw_qpolynomial_is_zero(pwqp1));
-
-	isl_pw_qpolynomial_free(pwqp1);
-
-	str = "{ [i] -> ([([i/2] + [i/2])/5]) }";
-	pwqp1 = isl_pw_qpolynomial_read_from_str(ctx, str);
-	str = "{ [i] -> ([(2 * [i/2])/5]) }";
-	pwqp2 = isl_pw_qpolynomial_read_from_str(ctx, str);
-
-	pwqp1 = isl_pw_qpolynomial_sub(pwqp1, pwqp2);
-
-	assert(isl_pw_qpolynomial_is_zero(pwqp1));
-
-	isl_pw_qpolynomial_free(pwqp1);
-
-	str = "{ [x] -> ([x/2] + [(x+1)/2]) }";
-	pwqp1 = isl_pw_qpolynomial_read_from_str(ctx, str);
-	str = "{ [x] -> x }";
-	pwqp2 = isl_pw_qpolynomial_read_from_str(ctx, str);
-
-	pwqp1 = isl_pw_qpolynomial_sub(pwqp1, pwqp2);
-
-	assert(isl_pw_qpolynomial_is_zero(pwqp1));
-
-	isl_pw_qpolynomial_free(pwqp1);
-
-	str = "{ [i] -> ([i/2]) : i >= 0; [i] -> ([i/3]) : i < 0 }";
-	pwqp1 = isl_pw_qpolynomial_read_from_str(ctx, str);
-	pwqp2 = isl_pw_qpolynomial_read_from_str(ctx, str);
-	pwqp1 = isl_pw_qpolynomial_coalesce(pwqp1);
-	pwqp1 = isl_pw_qpolynomial_sub(pwqp1, pwqp2);
-	assert(isl_pw_qpolynomial_is_zero(pwqp1));
-	isl_pw_qpolynomial_free(pwqp1);
-}
-
-void test_split_periods(isl_ctx *ctx)
-{
-	const char *str;
-	isl_pw_qpolynomial *pwqp;
-
-	str = "{ [U,V] -> 1/3 * U + 2/3 * V - [(U + 2V)/3] + [U/2] : "
-		"U + 2V + 3 >= 0 and - U -2V  >= 0 and - U + 10 >= 0 and "
-		"U  >= 0; [U,V] -> U^2 : U >= 100 }";
-	pwqp = isl_pw_qpolynomial_read_from_str(ctx, str);
-
-	pwqp = isl_pw_qpolynomial_split_periods(pwqp, 2);
-	assert(pwqp);
-
-	isl_pw_qpolynomial_free(pwqp);
-}
-
-void test_union(isl_ctx *ctx)
-{
-	const char *str;
-	isl_union_set *uset1, *uset2;
-	isl_union_map *umap1, *umap2;
-
-	str = "{ [i] : 0 <= i <= 1 }";
-	uset1 = isl_union_set_read_from_str(ctx, str);
-	str = "{ [1] -> [0] }";
-	umap1 = isl_union_map_read_from_str(ctx, str);
-
-	umap2 = isl_union_set_lex_gt_union_set(isl_union_set_copy(uset1), uset1);
-	assert(isl_union_map_is_equal(umap1, umap2));
-
-	isl_union_map_free(umap1);
-	isl_union_map_free(umap2);
-
-	str = "{ A[i] -> B[i]; B[i] -> C[i]; A[0] -> C[1] }";
-	umap1 = isl_union_map_read_from_str(ctx, str);
-	str = "{ A[i]; B[i] }";
-	uset1 = isl_union_set_read_from_str(ctx, str);
-
-	uset2 = isl_union_map_domain(umap1);
-
-	assert(isl_union_set_is_equal(uset1, uset2));
-
-	isl_union_set_free(uset1);
-	isl_union_set_free(uset2);
-}
-
-void test_bound(isl_ctx *ctx)
-{
-	const char *str;
-	isl_pw_qpolynomial *pwqp;
-	isl_pw_qpolynomial_fold *pwf;
-
-	str = "{ [[a, b, c, d] -> [e]] -> 0 }";
-	pwqp = isl_pw_qpolynomial_read_from_str(ctx, str);
-	pwf = isl_pw_qpolynomial_bound(pwqp, isl_fold_max, NULL);
-	assert(isl_pw_qpolynomial_fold_dim(pwf, isl_dim_set) == 4);
-	isl_pw_qpolynomial_fold_free(pwf);
-
-	str = "{ [[x]->[x]] -> 1 : exists a : x = 2 a }";
-	pwqp = isl_pw_qpolynomial_read_from_str(ctx, str);
-	pwf = isl_pw_qpolynomial_bound(pwqp, isl_fold_max, NULL);
-	assert(isl_pw_qpolynomial_fold_dim(pwf, isl_dim_set) == 1);
-	isl_pw_qpolynomial_fold_free(pwf);
-}
-
-void test_lift(isl_ctx *ctx)
-{
-	const char *str;
-	isl_basic_map *bmap;
-	isl_basic_set *bset;
-
-	str = "{ [i0] : exists e0 : i0 = 4e0 }";
-	bset = isl_basic_set_read_from_str(ctx, str, 0);
-	bset = isl_basic_set_lift(bset);
-	bmap = isl_basic_map_from_range(bset);
-	bset = isl_basic_map_domain(bmap);
-	isl_basic_set_free(bset);
-}
-
-void test_subset(isl_ctx *ctx)
-{
-	const char *str;
-	isl_set *set1, *set2;
-
-	str = "{ [112, 0] }";
-	set1 = isl_set_read_from_str(ctx, str, 0);
-	str = "{ [i0, i1] : exists (e0 = [(i0 - i1)/16], e1: "
-		"16e0 <= i0 - i1 and 16e0 >= -15 + i0 - i1 and "
-		"16e1 <= i1 and 16e0 >= -i1 and 16e1 >= -i0 + i1) }";
-	set2 = isl_set_read_from_str(ctx, str, 0);
-	assert(isl_set_is_subset(set1, set2));
-	isl_set_free(set1);
-	isl_set_free(set2);
-}
-
-void test_factorize(isl_ctx *ctx)
-{
-	const char *str;
-	isl_basic_set *bset;
-	isl_factorizer *f;
-
-	str = "{ [i0, i1, i2, i3, i4, i5, i6, i7] : 3i5 <= 2 - 2i0 and "
-	    "i0 >= -2 and i6 >= 1 + i3 and i7 >= 0 and 3i5 >= -2i0 and "
-	    "2i4 <= i2 and i6 >= 1 + 2i0 + 3i1 and i4 <= -1 and "
-	    "i6 >= 1 + 2i0 + 3i5 and i6 <= 2 + 2i0 + 3i5 and "
-	    "3i5 <= 2 - 2i0 - i2 + 3i4 and i6 <= 2 + 2i0 + 3i1 and "
-	    "i0 <= -1 and i7 <= i2 + i3 - 3i4 - i6 and "
-	    "3i5 >= -2i0 - i2 + 3i4 }";
-	bset = isl_basic_set_read_from_str(ctx, str, 0);
-	f = isl_basic_set_factorizer(bset);
-	assert(f);
-	isl_basic_set_free(bset);
-	isl_factorizer_free(f);
-
-	str = "{ [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12] : "
-	    "i12 <= 2 + i0 - i11 and 2i8 >= -i4 and i11 >= i1 and "
-	    "3i5 <= -i2 and 2i11 >= -i4 - 2i7 and i11 <= 3 + i0 + 3i9 and "
-	    "i11 <= -i4 - 2i7 and i12 >= -i10 and i2 >= -2 and "
-	    "i11 >= i1 + 3i10 and i11 >= 1 + i0 + 3i9 and "
-	    "i11 <= 1 - i4 - 2i8 and 6i6 <= 6 - i2 and 3i6 >= 1 - i2 and "
-	    "i11 <= 2 + i1 and i12 <= i4 + i11 and i12 >= i0 - i11 and "
-	    "3i5 >= -2 - i2 and i12 >= -1 + i4 + i11 and 3i3 <= 3 - i2 and "
-	    "9i6 <= 11 - i2 + 6i5 and 3i3 >= 1 - i2 and "
-	    "9i6 <= 5 - i2 + 6i3 and i12 <= -1 and i2 <= 0 }";
-	bset = isl_basic_set_read_from_str(ctx, str, 0);
-	f = isl_basic_set_factorizer(bset);
-	assert(f);
-	isl_basic_set_free(bset);
-	isl_factorizer_free(f);
-}
-
-static int check_injective(__isl_take isl_map *map, void *user)
-{
-	int *injective = user;
-
-	*injective = isl_map_is_injective(map);
-	isl_map_free(map);
-
-	if (*injective < 0 || !*injective)
-		return -1;
-
-	return 0;
-}
-
-int test_one_schedule(isl_ctx *ctx, const char *d, const char *w,
-	const char *r, const char *s, int tilable, int parallel)
-{
-	int i;
-	isl_union_set *D;
-	isl_union_map *W, *R, *S;
-	isl_union_map *empty;
-	isl_union_map *dep_raw, *dep_war, *dep_waw, *dep;
-	isl_union_map *validity, *proximity;
-	isl_union_map *schedule;
-	isl_union_map *test;
-	isl_union_set *delta;
-	isl_union_set *domain;
-	isl_set *delta_set;
-	isl_set *slice;
-	isl_set *origin;
-	isl_schedule *sched;
-	int is_nonneg, is_parallel, is_tilable, is_injection, is_complete;
-
-	D = isl_union_set_read_from_str(ctx, d);
-	W = isl_union_map_read_from_str(ctx, w);
-	R = isl_union_map_read_from_str(ctx, r);
-	S = isl_union_map_read_from_str(ctx, s);
-
-	W = isl_union_map_intersect_domain(W, isl_union_set_copy(D));
-	R = isl_union_map_intersect_domain(R, isl_union_set_copy(D));
-
-	empty = isl_union_map_empty(isl_union_map_get_dim(S));
-        isl_union_map_compute_flow(isl_union_map_copy(R),
-				   isl_union_map_copy(W), empty,
-				   isl_union_map_copy(S),
-				   &dep_raw, NULL, NULL, NULL);
-        isl_union_map_compute_flow(isl_union_map_copy(W),
-				   isl_union_map_copy(W),
-				   isl_union_map_copy(R),
-				   isl_union_map_copy(S),
-				   &dep_waw, &dep_war, NULL, NULL);
-
-	dep = isl_union_map_union(dep_waw, dep_war);
-	dep = isl_union_map_union(dep, dep_raw);
-	validity = isl_union_map_copy(dep);
-	proximity = isl_union_map_copy(dep);
-
-	sched = isl_union_set_compute_schedule(isl_union_set_copy(D),
-					       validity, proximity);
-	schedule = isl_schedule_get_map(sched);
-	isl_schedule_free(sched);
-	isl_union_map_free(W);
-	isl_union_map_free(R);
-	isl_union_map_free(S);
-
-	is_injection = 1;
-	isl_union_map_foreach_map(schedule, &check_injective, &is_injection);
-
-	domain = isl_union_map_domain(isl_union_map_copy(schedule));
-	is_complete = isl_union_set_is_subset(D, domain);
-	isl_union_set_free(D);
-	isl_union_set_free(domain);
-
-	test = isl_union_map_reverse(isl_union_map_copy(schedule));
-	test = isl_union_map_apply_range(test, dep);
-	test = isl_union_map_apply_range(test, schedule);
-
-	delta = isl_union_map_deltas(test);
-	if (isl_union_set_n_set(delta) == 0) {
-		is_tilable = 1;
-		is_parallel = 1;
-		is_nonneg = 1;
-		isl_union_set_free(delta);
-	} else {
-		delta_set = isl_set_from_union_set(delta);
-
-		slice = isl_set_universe(isl_set_get_dim(delta_set));
-		for (i = 0; i < tilable; ++i)
-			slice = isl_set_lower_bound_si(slice, isl_dim_set, i, 0);
-		is_tilable = isl_set_is_subset(delta_set, slice);
-		isl_set_free(slice);
-
-		slice = isl_set_universe(isl_set_get_dim(delta_set));
-		for (i = 0; i < parallel; ++i)
-			slice = isl_set_fix_si(slice, isl_dim_set, i, 0);
-		is_parallel = isl_set_is_subset(delta_set, slice);
-		isl_set_free(slice);
-
-		origin = isl_set_universe(isl_set_get_dim(delta_set));
-		for (i = 0; i < isl_set_dim(origin, isl_dim_set); ++i)
-			origin = isl_set_fix_si(origin, isl_dim_set, i, 0);
-
-		delta_set = isl_set_union(delta_set, isl_set_copy(origin));
-		delta_set = isl_set_lexmin(delta_set);
-
-		is_nonneg = isl_set_is_equal(delta_set, origin);
-
-		isl_set_free(origin);
-		isl_set_free(delta_set);
-	}
-
-	if (is_nonneg < 0 || is_parallel < 0 || is_tilable < 0 ||
-	    is_injection < 0 || is_complete < 0)
-		return -1;
-	if (!is_complete)
-		isl_die(ctx, isl_error_unknown,
-			"generated schedule incomplete", return -1);
-	if (!is_injection)
-		isl_die(ctx, isl_error_unknown,
-			"generated schedule not injective on each statement",
-			return -1);
-	if (!is_nonneg)
-		isl_die(ctx, isl_error_unknown,
-			"negative dependences in generated schedule",
-			return -1);
-	if (!is_tilable)
-		isl_die(ctx, isl_error_unknown,
-			"generated schedule not as tilable as expected",
-			return -1);
-	if (!is_parallel)
-		isl_die(ctx, isl_error_unknown,
-			"generated schedule not as parallel as expected",
-			return -1);
-
-	return 0;
-}
-
-int test_special_schedule(isl_ctx *ctx)
-{
-	const char *str;
-	isl_union_set *dom;
-	isl_union_map *empty;
-	isl_union_map *dep;
-	isl_union_map *sched1, *sched2;
-	isl_schedule *schedule;
-	int equal;
-
-	str = "{ S[i,j] : 0 <= i <= 10 }";
-	dom = isl_union_set_read_from_str(ctx, str);
-	str = "{ S[i,j] -> S[i+1,j] : 0 <= i,j <= 10 }";
-	dep = isl_union_map_read_from_str(ctx, str);
-	empty = isl_union_map_read_from_str(ctx, "{}");
-	schedule = isl_union_set_compute_schedule(dom, empty, dep);
-	sched1 = isl_schedule_get_map(schedule);
-	isl_schedule_free(schedule);
-
-	str = "{ S[i, j] -> [j, i] }";
-	sched2 = isl_union_map_read_from_str(ctx, str);
-
-	equal = isl_union_map_is_equal(sched1, sched2);
-	isl_union_map_free(sched1);
-	isl_union_map_free(sched2);
-
-	if (equal < 0)
-		return -1;
-	if (!equal)
-		isl_die(ctx, isl_error_unknown, "unexpected schedule",
-			return -1);
-
-	return 0;
-}
-
-int test_schedule(isl_ctx *ctx)
-{
-	const char *D, *W, *R, *S;
-
-	/* Jacobi */
-	D = "[T,N] -> { S1[t,i] : 1 <= t <= T and 2 <= i <= N - 1 }";
-	W = "{ S1[t,i] -> a[t,i] }";
-	R = "{ S1[t,i] -> a[t-1,i]; S1[t,i] -> a[t-1,i-1]; "
-	    	"S1[t,i] -> a[t-1,i+1] }";
-	S = "{ S1[t,i] -> [t,i] }";
-	if (test_one_schedule(ctx, D, W, R, S, 2, 0) < 0)
-		return -1;
-
-	/* Fig. 5 of CC2008 */
-	D = "[N] -> { S_0[i, j] : i >= 0 and i <= -1 + N and j >= 2 and "
-				"j <= -1 + N }";
-	W = "[N] -> { S_0[i, j] -> a[i, j] : i >= 0 and i <= -1 + N and "
-				"j >= 2 and j <= -1 + N }";
-	R = "[N] -> { S_0[i, j] -> a[j, i] : i >= 0 and i <= -1 + N and "
-				"j >= 2 and j <= -1 + N; "
-		    "S_0[i, j] -> a[i, -1 + j] : i >= 0 and i <= -1 + N and "
-				"j >= 2 and j <= -1 + N }";
-	S = "[N] -> { S_0[i, j] -> [0, i, 0, j, 0] }";
-	if (test_one_schedule(ctx, D, W, R, S, 2, 0) < 0)
-		return -1;
-
-	D = "{ S1[i] : 0 <= i <= 10; S2[i] : 0 <= i <= 9 }";
-	W = "{ S1[i] -> a[i] }";
-	R = "{ S2[i] -> a[i+1] }";
-	S = "{ S1[i] -> [0,i]; S2[i] -> [1,i] }";
-	if (test_one_schedule(ctx, D, W, R, S, 1, 1) < 0)
-		return -1;
-
-	D = "{ S1[i] : 0 <= i < 10; S2[i] : 0 <= i < 10 }";
-	W = "{ S1[i] -> a[i] }";
-	R = "{ S2[i] -> a[9-i] }";
-	S = "{ S1[i] -> [0,i]; S2[i] -> [1,i] }";
-	if (test_one_schedule(ctx, D, W, R, S, 1, 1) < 0)
-		return -1;
-
-	D = "[N] -> { S1[i] : 0 <= i < N; S2[i] : 0 <= i < N }";
-	W = "{ S1[i] -> a[i] }";
-	R = "[N] -> { S2[i] -> a[N-1-i] }";
-	S = "{ S1[i] -> [0,i]; S2[i] -> [1,i] }";
-	if (test_one_schedule(ctx, D, W, R, S, 1, 1) < 0)
-		return -1;
-	
-	D = "{ S1[i] : 0 < i < 10; S2[i] : 0 <= i < 10 }";
-	W = "{ S1[i] -> a[i]; S2[i] -> b[i] }";
-	R = "{ S2[i] -> a[i]; S1[i] -> b[i-1] }";
-	S = "{ S1[i] -> [i,0]; S2[i] -> [i,1] }";
-	if (test_one_schedule(ctx, D, W, R, S, 0, 0) < 0)
-		return -1;
-
-	D = "[N] -> { S1[i] : 1 <= i <= N; S2[i,j] : 1 <= i,j <= N }";
-	W = "{ S1[i] -> a[0,i]; S2[i,j] -> a[i,j] }";
-	R = "{ S2[i,j] -> a[i-1,j] }";
-	S = "{ S1[i] -> [0,i,0]; S2[i,j] -> [1,i,j] }";
-	if (test_one_schedule(ctx, D, W, R, S, 2, 1) < 0)
-		return -1;
-
-	D = "[N] -> { S1[i] : 1 <= i <= N; S2[i,j] : 1 <= i,j <= N }";
-	W = "{ S1[i] -> a[i,0]; S2[i,j] -> a[i,j] }";
-	R = "{ S2[i,j] -> a[i,j-1] }";
-	S = "{ S1[i] -> [0,i,0]; S2[i,j] -> [1,i,j] }";
-	if (test_one_schedule(ctx, D, W, R, S, 2, 1) < 0)
-		return -1;
-
-	D = "[N] -> { S_0[]; S_1[i] : i >= 0 and i <= -1 + N; S_2[] }";
-	W = "[N] -> { S_0[] -> a[0]; S_2[] -> b[0]; "
-		    "S_1[i] -> a[1 + i] : i >= 0 and i <= -1 + N }";
-	R = "[N] -> { S_2[] -> a[N]; S_1[i] -> a[i] : i >= 0 and i <= -1 + N }";
-	S = "[N] -> { S_1[i] -> [1, i, 0]; S_2[] -> [2, 0, 1]; "
-		    "S_0[] -> [0, 0, 0] }";
-	if (test_one_schedule(ctx, D, W, R, S, 1, 0) < 0)
-		return -1;
-	ctx->opt->schedule_parametric = 0;
-	if (test_one_schedule(ctx, D, W, R, S, 0, 0) < 0)
-		return -1;
-	ctx->opt->schedule_parametric = 1;
-
-	D = "[N] -> { S1[i] : 1 <= i <= N; S2[i] : 1 <= i <= N; "
-		    "S3[i,j] : 1 <= i,j <= N; S4[i] : 1 <= i <= N }";
-	W = "{ S1[i] -> a[i,0]; S2[i] -> a[0,i]; S3[i,j] -> a[i,j] }";
-	R = "[N] -> { S3[i,j] -> a[i-1,j]; S3[i,j] -> a[i,j-1]; "
-		    "S4[i] -> a[i,N] }";
-	S = "{ S1[i] -> [0,i,0]; S2[i] -> [1,i,0]; S3[i,j] -> [2,i,j]; "
-		"S4[i] -> [4,i,0] }";
-	if (test_one_schedule(ctx, D, W, R, S, 2, 0) < 0)
-		return -1;
-
-	D = "[N] -> { S_0[i, j] : i >= 1 and i <= N and j >= 1 and j <= N }";
-	W = "[N] -> { S_0[i, j] -> s[0] : i >= 1 and i <= N and j >= 1 and "
-					"j <= N }";
-	R = "[N] -> { S_0[i, j] -> s[0] : i >= 1 and i <= N and j >= 1 and "
-					"j <= N; "
-		    "S_0[i, j] -> a[i, j] : i >= 1 and i <= N and j >= 1 and "
-					"j <= N }";
-	S = "[N] -> { S_0[i, j] -> [0, i, 0, j, 0] }";
-	if (test_one_schedule(ctx, D, W, R, S, 0, 0) < 0)
-		return -1;
-
-	D = "[N] -> { S_0[t] : t >= 0 and t <= -1 + N; "
-		    " S_2[t] : t >= 0 and t <= -1 + N; "
-		    " S_1[t, i] : t >= 0 and t <= -1 + N and i >= 0 and "
-				"i <= -1 + N }";
-	W = "[N] -> { S_0[t] -> a[t, 0] : t >= 0 and t <= -1 + N; "
-		    " S_2[t] -> b[t] : t >= 0 and t <= -1 + N; "
-		    " S_1[t, i] -> a[t, 1 + i] : t >= 0 and t <= -1 + N and "
-						"i >= 0 and i <= -1 + N }";
-	R = "[N] -> { S_1[t, i] -> a[t, i] : t >= 0 and t <= -1 + N and "
-					    "i >= 0 and i <= -1 + N; "
-		    " S_2[t] -> a[t, N] : t >= 0 and t <= -1 + N }";
-	S = "[N] -> { S_2[t] -> [0, t, 2]; S_1[t, i] -> [0, t, 1, i, 0]; "
-		    " S_0[t] -> [0, t, 0] }";
-
-	if (test_one_schedule(ctx, D, W, R, S, 2, 1) < 0)
-		return -1;
-	ctx->opt->schedule_parametric = 0;
-	if (test_one_schedule(ctx, D, W, R, S, 0, 0) < 0)
-		return -1;
-	ctx->opt->schedule_parametric = 1;
-
-	D = "[N] -> { S1[i,j] : 0 <= i,j < N; S2[i,j] : 0 <= i,j < N }";
-	S = "{ S1[i,j] -> [0,i,j]; S2[i,j] -> [1,i,j] }";
-	if (test_one_schedule(ctx, D, "{}", "{}", S, 2, 2) < 0)
-		return -1;
-
-	D = "[M, N] -> { S_1[i] : i >= 0 and i <= -1 + M; "
-	    "S_0[i, j] : i >= 0 and i <= -1 + M and j >= 0 and j <= -1 + N }";
-	W = "[M, N] -> { S_0[i, j] -> a[j] : i >= 0 and i <= -1 + M and "
-					    "j >= 0 and j <= -1 + N; "
-			"S_1[i] -> b[0] : i >= 0 and i <= -1 + M }";
-	R = "[M, N] -> { S_0[i, j] -> a[0] : i >= 0 and i <= -1 + M and "
-					    "j >= 0 and j <= -1 + N; "
-			"S_1[i] -> b[0] : i >= 0 and i <= -1 + M }";
-	S = "[M, N] -> { S_1[i] -> [1, i, 0]; S_0[i, j] -> [0, i, 0, j, 0] }";
-	if (test_one_schedule(ctx, D, W, R, S, 0, 0) < 0)
-		return -1;
-
-	D = "{ S_0[i] : i >= 0 }";
-	W = "{ S_0[i] -> a[i] : i >= 0 }";
-	R = "{ S_0[i] -> a[0] : i >= 0 }";
-	S = "{ S_0[i] -> [0, i, 0] }";
-	if (test_one_schedule(ctx, D, W, R, S, 0, 0) < 0)
-		return -1;
-
-	D = "{ S_0[i] : i >= 0; S_1[i] : i >= 0 }";
-	W = "{ S_0[i] -> a[i] : i >= 0; S_1[i] -> b[i] : i >= 0 }";
-	R = "{ S_0[i] -> b[0] : i >= 0; S_1[i] -> a[i] : i >= 0 }";
-	S = "{ S_1[i] -> [0, i, 1]; S_0[i] -> [0, i, 0] }";
-	if (test_one_schedule(ctx, D, W, R, S, 0, 0) < 0)
-		return -1;
-
-	return test_special_schedule(ctx);
-}
-
-int test_plain_injective(isl_ctx *ctx, const char *str, int injective)
-{
-	isl_union_map *umap;
-	int test;
-
-	umap = isl_union_map_read_from_str(ctx, str);
-	test = isl_union_map_plain_is_injective(umap);
-	isl_union_map_free(umap);
-	if (test < 0)
-		return -1;
-	if (test == injective)
-		return 0;
-	if (injective)
-		isl_die(ctx, isl_error_unknown,
-			"map not detected as injective", return -1);
-	else
-		isl_die(ctx, isl_error_unknown,
-			"map detected as injective", return -1);
-}
-
-int test_injective(isl_ctx *ctx)
-{
-	const char *str;
-
-	if (test_plain_injective(ctx, "{S[i,j] -> A[0]; T[i,j] -> B[1]}", 0))
-		return -1;
-	if (test_plain_injective(ctx, "{S[] -> A[0]; T[] -> B[0]}", 1))
-		return -1;
-	if (test_plain_injective(ctx, "{S[] -> A[0]; T[] -> A[1]}", 1))
-		return -1;
-	if (test_plain_injective(ctx, "{S[] -> A[0]; T[] -> A[0]}", 0))
-		return -1;
-	if (test_plain_injective(ctx, "{S[i] -> A[i,0]; T[i] -> A[i,1]}", 1))
-		return -1;
-	if (test_plain_injective(ctx, "{S[i] -> A[i]; T[i] -> A[i]}", 0))
-		return -1;
-	if (test_plain_injective(ctx, "{S[] -> A[0,0]; T[] -> A[0,1]}", 1))
-		return -1;
-	if (test_plain_injective(ctx, "{S[] -> A[0,0]; T[] -> A[1,0]}", 1))
-		return -1;
-
-	str = "{S[] -> A[0,0]; T[] -> A[0,1]; U[] -> A[1,0]}";
-	if (test_plain_injective(ctx, str, 1))
-		return -1;
-	str = "{S[] -> A[0,0]; T[] -> A[0,1]; U[] -> A[0,0]}";
-	if (test_plain_injective(ctx, str, 0))
-		return -1;
-
-	return 0;
-}
-
-int test_aff(isl_ctx *ctx)
-{
-	const char *str;
-	isl_set *set;
-	isl_dim *dim;
-	isl_local_space *ls;
-	isl_aff *aff;
-	int zero;
-
-	dim = isl_dim_set_alloc(ctx, 0, 1);
-	ls = isl_local_space_from_dim(dim);
-	aff = isl_aff_zero(ls);
-
-	aff = isl_aff_add_coefficient_si(aff, isl_dim_set, 0, 1);
-	aff = isl_aff_scale_down_ui(aff, 3);
-	aff = isl_aff_floor(aff);
-	aff = isl_aff_add_coefficient_si(aff, isl_dim_set, 0, 1);
-	aff = isl_aff_scale_down_ui(aff, 2);
-	aff = isl_aff_floor(aff);
-	aff = isl_aff_add_coefficient_si(aff, isl_dim_set, 0, 1);
-
-	str = "{ [10] }";
-	set = isl_set_read_from_str(ctx, str, 0);
-	aff = isl_aff_gist(aff, set);
-
-	aff = isl_aff_add_constant_si(aff, -16);
-	zero = isl_aff_plain_is_zero(aff);
-	isl_aff_free(aff);
-
-	if (zero < 0)
-		return -1;
-	if (!zero)
-		isl_die(ctx, isl_error_unknown, "unexpected result", return -1);
-
-	return 0;
-}
-
-int test_dim_max(isl_ctx *ctx)
-{
-	int equal;
-	const char *str;
-	isl_map *map, *map2;
-	isl_set *set;
-	isl_pw_aff *pwaff;
-
-	str = "[N] -> { [i] : 0 <= i <= min(N,10) }";
-	set = isl_set_read_from_str(ctx, str, -1);
-	pwaff = isl_set_dim_max(set, 0);
-	map = isl_map_from_pw_aff(pwaff);
-	str = "[N] -> { [] -> [10] : N >= 10; [] -> [N] : N <= 9 and N >= 0 }";
-	map2 = isl_map_read_from_str(ctx, str, -1);
-	equal = isl_map_is_equal(map, map2);
-	isl_map_free(map);
-	isl_map_free(map2);
-	if (equal < 0)
-		return -1;
-	if (!equal)
-		isl_die(ctx, isl_error_unknown, "unexpected result", return -1);
-
-	str = "[N] -> { [i] : 0 <= i <= max(2N,N+6) }";
-	set = isl_set_read_from_str(ctx, str, -1);
-	pwaff = isl_set_dim_max(set, 0);
-	map = isl_map_from_pw_aff(pwaff);
-	str = "[N] -> { [] -> [6 + N] : -6 <= N <= 5; [] -> [2N] : N >= 6 }";
-	map2 = isl_map_read_from_str(ctx, str, -1);
-	equal = isl_map_is_equal(map, map2);
-	isl_map_free(map);
-	isl_map_free(map2);
-	if (equal < 0)
-		return -1;
-	if (!equal)
-		isl_die(ctx, isl_error_unknown, "unexpected result", return -1);
-
-	str = "[N] -> { [i] : 0 <= i <= 2N or 0 <= i <= N+6 }";
-	set = isl_set_read_from_str(ctx, str, -1);
-	pwaff = isl_set_dim_max(set, 0);
-	map = isl_map_from_pw_aff(pwaff);
-	str = "[N] -> { [] -> [6 + N] : -6 <= N <= 5; [] -> [2N] : N >= 6 }";
-	map2 = isl_map_read_from_str(ctx, str, -1);
-	equal = isl_map_is_equal(map, map2);
-	isl_map_free(map);
-	isl_map_free(map2);
-	if (equal < 0)
-		return -1;
-	if (!equal)
-		isl_die(ctx, isl_error_unknown, "unexpected result", return -1);
-
-	str = "[N,M] -> { [i,j] -> [([i/16]), i%16, ([j/16]), j%16] : "
-			"0 <= i < N and 0 <= j < M }";
-	map = isl_map_read_from_str(ctx, str, -1);
-	set = isl_map_range(map);
-
-	pwaff = isl_set_dim_max(isl_set_copy(set), 0);
-	map = isl_map_from_pw_aff(pwaff);
-	str = "[N,M] -> { [] -> [([(N-1)/16])] : M,N > 0 }";
-	map2 = isl_map_read_from_str(ctx, str, -1);
-	equal = isl_map_is_equal(map, map2);
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	pwaff = isl_set_dim_max(isl_set_copy(set), 3);
-	map = isl_map_from_pw_aff(pwaff);
-	str = "[N,M] -> { [] -> [t] : t = min(M-1,15) and M,N > 0 }";
-	map2 = isl_map_read_from_str(ctx, str, -1);
-	if (equal >= 0 && equal)
-		equal = isl_map_is_equal(map, map2);
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	isl_set_free(set);
-
-	if (equal < 0)
-		return -1;
-	if (!equal)
-		isl_die(ctx, isl_error_unknown, "unexpected result", return -1);
-
-	return 0;
-}
-
-int main()
-{
-	struct isl_ctx *ctx;
-
-	srcdir = getenv("srcdir");
-	assert(srcdir);
-
-	ctx = isl_ctx_alloc();
-	if (test_dim_max(ctx) < 0)
-		goto error;
-	if (test_aff(ctx) < 0)
-		goto error;
-	if (test_injective(ctx) < 0)
-		goto error;
-	if (test_schedule(ctx) < 0)
-		goto error;
-	test_factorize(ctx);
-	test_subset(ctx);
-	test_lift(ctx);
-	test_bound(ctx);
-	test_union(ctx);
-	test_split_periods(ctx);
-	test_parse(ctx);
-	test_pwqp(ctx);
-	test_lex(ctx);
-	if (test_sv(ctx) < 0)
-		goto error;
-	test_bijective(ctx);
-	test_dep(ctx);
-	test_read(ctx);
-	test_bounded(ctx);
-	test_construction(ctx);
-	test_dim(ctx);
-	test_div(ctx);
-	test_application(ctx);
-	test_affine_hull(ctx);
-	test_convex_hull(ctx);
-	test_gist(ctx);
-	test_coalesce(ctx);
-	test_closure(ctx);
-	test_lexmin(ctx);
-	isl_ctx_free(ctx);
-	return 0;
-error:
-	isl_ctx_free(ctx);
-	return -1;
-}
diff --git a/cloog-0.16.3/isl/isl_transitive_closure.c b/cloog-0.16.3/isl/isl_transitive_closure.c
deleted file mode 100644
index 53f5d14..0000000
--- a/cloog-0.16.3/isl/isl_transitive_closure.c
+++ /dev/null
@@ -1,3103 +0,0 @@
-/*
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France 
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl/map.h>
-#include <isl/seq.h>
-#include <isl_dim_private.h>
-#include <isl/lp.h>
-#include <isl/union_map.h>
-#include <isl_mat_private.h>
-
-int isl_map_is_transitively_closed(__isl_keep isl_map *map)
-{
-	isl_map *map2;
-	int closed;
-
-	map2 = isl_map_apply_range(isl_map_copy(map), isl_map_copy(map));
-	closed = isl_map_is_subset(map2, map);
-	isl_map_free(map2);
-
-	return closed;
-}
-
-int isl_union_map_is_transitively_closed(__isl_keep isl_union_map *umap)
-{
-	isl_union_map *umap2;
-	int closed;
-
-	umap2 = isl_union_map_apply_range(isl_union_map_copy(umap),
-					  isl_union_map_copy(umap));
-	closed = isl_union_map_is_subset(umap2, umap);
-	isl_union_map_free(umap2);
-
-	return closed;
-}
- 
-/* Given a map that represents a path with the length of the path
- * encoded as the difference between the last output coordindate
- * and the last input coordinate, set this length to either
- * exactly "length" (if "exactly" is set) or at least "length"
- * (if "exactly" is not set).
- */
-static __isl_give isl_map *set_path_length(__isl_take isl_map *map,
-	int exactly, int length)
-{
-	struct isl_dim *dim;
-	struct isl_basic_map *bmap;
-	unsigned d;
-	unsigned nparam;
-	int k;
-	isl_int *c;
-
-	if (!map)
-		return NULL;
-
-	dim = isl_map_get_dim(map);
-	d = isl_dim_size(dim, isl_dim_in);
-	nparam = isl_dim_size(dim, isl_dim_param);
-	bmap = isl_basic_map_alloc_dim(dim, 0, 1, 1);
-	if (exactly) {
-		k = isl_basic_map_alloc_equality(bmap);
-		c = bmap->eq[k];
-	} else {
-		k = isl_basic_map_alloc_inequality(bmap);
-		c = bmap->ineq[k];
-	}
-	if (k < 0)
-		goto error;
-	isl_seq_clr(c, 1 + isl_basic_map_total_dim(bmap));
-	isl_int_set_si(c[0], -length);
-	isl_int_set_si(c[1 + nparam + d - 1], -1);
-	isl_int_set_si(c[1 + nparam + d + d - 1], 1);
-
-	bmap = isl_basic_map_finalize(bmap);
-	map = isl_map_intersect(map, isl_map_from_basic_map(bmap));
-
-	return map;
-error:
-	isl_basic_map_free(bmap);
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Check whether the overapproximation of the power of "map" is exactly
- * the power of "map".  Let R be "map" and A_k the overapproximation.
- * The approximation is exact if
- *
- *	A_1 = R
- *	A_k = A_{k-1} \circ R			k >= 2
- *
- * Since A_k is known to be an overapproximation, we only need to check
- *
- *	A_1 \subset R
- *	A_k \subset A_{k-1} \circ R		k >= 2
- *
- * In practice, "app" has an extra input and output coordinate
- * to encode the length of the path.  So, we first need to add
- * this coordinate to "map" and set the length of the path to
- * one.
- */
-static int check_power_exactness(__isl_take isl_map *map,
-	__isl_take isl_map *app)
-{
-	int exact;
-	isl_map *app_1;
-	isl_map *app_2;
-
-	map = isl_map_add_dims(map, isl_dim_in, 1);
-	map = isl_map_add_dims(map, isl_dim_out, 1);
-	map = set_path_length(map, 1, 1);
-
-	app_1 = set_path_length(isl_map_copy(app), 1, 1);
-
-	exact = isl_map_is_subset(app_1, map);
-	isl_map_free(app_1);
-
-	if (!exact || exact < 0) {
-		isl_map_free(app);
-		isl_map_free(map);
-		return exact;
-	}
-
-	app_1 = set_path_length(isl_map_copy(app), 0, 1);
-	app_2 = set_path_length(app, 0, 2);
-	app_1 = isl_map_apply_range(map, app_1);
-
-	exact = isl_map_is_subset(app_2, app_1);
-
-	isl_map_free(app_1);
-	isl_map_free(app_2);
-
-	return exact;
-}
-
-/* Check whether the overapproximation of the power of "map" is exactly
- * the power of "map", possibly after projecting out the power (if "project"
- * is set).
- *
- * If "project" is set and if "steps" can only result in acyclic paths,
- * then we check
- *
- *	A = R \cup (A \circ R)
- *
- * where A is the overapproximation with the power projected out, i.e.,
- * an overapproximation of the transitive closure.
- * More specifically, since A is known to be an overapproximation, we check
- *
- *	A \subset R \cup (A \circ R)
- *
- * Otherwise, we check if the power is exact.
- *
- * Note that "app" has an extra input and output coordinate to encode
- * the length of the part.  If we are only interested in the transitive
- * closure, then we can simply project out these coordinates first.
- */
-static int check_exactness(__isl_take isl_map *map, __isl_take isl_map *app,
-	int project)
-{
-	isl_map *test;
-	int exact;
-	unsigned d;
-
-	if (!project)
-		return check_power_exactness(map, app);
-
-	d = isl_map_dim(map, isl_dim_in);
-	app = set_path_length(app, 0, 1);
-	app = isl_map_project_out(app, isl_dim_in, d, 1);
-	app = isl_map_project_out(app, isl_dim_out, d, 1);
-
-	app = isl_map_reset_dim(app, isl_map_get_dim(map));
-
-	test = isl_map_apply_range(isl_map_copy(map), isl_map_copy(app));
-	test = isl_map_union(test, isl_map_copy(map));
-
-	exact = isl_map_is_subset(app, test);
-
-	isl_map_free(app);
-	isl_map_free(test);
-
-	isl_map_free(map);
-
-	return exact;
-}
-
-/*
- * The transitive closure implementation is based on the paper
- * "Computing the Transitive Closure of a Union of Affine Integer
- * Tuple Relations" by Anna Beletska, Denis Barthou, Wlodzimierz Bielecki and
- * Albert Cohen.
- */
-
-/* Given a set of n offsets v_i (the rows of "steps"), construct a relation
- * of the given dimension specification (Z^{n+1} -> Z^{n+1})
- * that maps an element x to any element that can be reached
- * by taking a non-negative number of steps along any of
- * the extended offsets v'_i = [v_i 1].
- * That is, construct
- *
- * { [x] -> [y] : exists k_i >= 0, y = x + \sum_i k_i v'_i }
- *
- * For any element in this relation, the number of steps taken
- * is equal to the difference in the final coordinates.
- */
-static __isl_give isl_map *path_along_steps(__isl_take isl_dim *dim,
-	__isl_keep isl_mat *steps)
-{
-	int i, j, k;
-	struct isl_basic_map *path = NULL;
-	unsigned d;
-	unsigned n;
-	unsigned nparam;
-
-	if (!dim || !steps)
-		goto error;
-
-	d = isl_dim_size(dim, isl_dim_in);
-	n = steps->n_row;
-	nparam = isl_dim_size(dim, isl_dim_param);
-
-	path = isl_basic_map_alloc_dim(isl_dim_copy(dim), n, d, n);
-
-	for (i = 0; i < n; ++i) {
-		k = isl_basic_map_alloc_div(path);
-		if (k < 0)
-			goto error;
-		isl_assert(steps->ctx, i == k, goto error);
-		isl_int_set_si(path->div[k][0], 0);
-	}
-
-	for (i = 0; i < d; ++i) {
-		k = isl_basic_map_alloc_equality(path);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(path->eq[k], 1 + isl_basic_map_total_dim(path));
-		isl_int_set_si(path->eq[k][1 + nparam + i], 1);
-		isl_int_set_si(path->eq[k][1 + nparam + d + i], -1);
-		if (i == d - 1)
-			for (j = 0; j < n; ++j)
-				isl_int_set_si(path->eq[k][1 + nparam + 2 * d + j], 1);
-		else
-			for (j = 0; j < n; ++j)
-				isl_int_set(path->eq[k][1 + nparam + 2 * d + j],
-					    steps->row[j][i]);
-	}
-
-	for (i = 0; i < n; ++i) {
-		k = isl_basic_map_alloc_inequality(path);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(path->ineq[k], 1 + isl_basic_map_total_dim(path));
-		isl_int_set_si(path->ineq[k][1 + nparam + 2 * d + i], 1);
-	}
-
-	isl_dim_free(dim);
-
-	path = isl_basic_map_simplify(path);
-	path = isl_basic_map_finalize(path);
-	return isl_map_from_basic_map(path);
-error:
-	isl_dim_free(dim);
-	isl_basic_map_free(path);
-	return NULL;
-}
-
-#define IMPURE		0
-#define PURE_PARAM	1
-#define PURE_VAR	2
-#define MIXED		3
-
-/* Check whether the parametric constant term of constraint c is never
- * positive in "bset".
- */
-static int parametric_constant_never_positive(__isl_keep isl_basic_set *bset,
-	isl_int *c, int *div_purity)
-{
-	unsigned d;
-	unsigned n_div;
-	unsigned nparam;
-	int i;
-	int k;
-	int empty;
-
-	n_div = isl_basic_set_dim(bset, isl_dim_div);
-	d = isl_basic_set_dim(bset, isl_dim_set);
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-
-	bset = isl_basic_set_copy(bset);
-	bset = isl_basic_set_cow(bset);
-	bset = isl_basic_set_extend_constraints(bset, 0, 1);
-	k = isl_basic_set_alloc_inequality(bset);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(bset->ineq[k], 1 + isl_basic_set_total_dim(bset));
-	isl_seq_cpy(bset->ineq[k], c, 1 + nparam);
-	for (i = 0; i < n_div; ++i) {
-		if (div_purity[i] != PURE_PARAM)
-			continue;
-		isl_int_set(bset->ineq[k][1 + nparam + d + i],
-			    c[1 + nparam + d + i]);
-	}
-	isl_int_sub_ui(bset->ineq[k][0], bset->ineq[k][0], 1);
-	empty = isl_basic_set_is_empty(bset);
-	isl_basic_set_free(bset);
-
-	return empty;
-error:
-	isl_basic_set_free(bset);
-	return -1;
-}
-
-/* Return PURE_PARAM if only the coefficients of the parameters are non-zero.
- * Return PURE_VAR if only the coefficients of the set variables are non-zero.
- * Return MIXED if only the coefficients of the parameters and the set
- * 	variables are non-zero and if moreover the parametric constant
- * 	can never attain positive values.
- * Return IMPURE otherwise.
- *
- * If div_purity is NULL then we are dealing with a non-parametric set
- * and so the constraint is obviously PURE_VAR.
- */
-static int purity(__isl_keep isl_basic_set *bset, isl_int *c, int *div_purity,
-	int eq)
-{
-	unsigned d;
-	unsigned n_div;
-	unsigned nparam;
-	int empty;
-	int i;
-	int p = 0, v = 0;
-
-	if (!div_purity)
-		return PURE_VAR;
-
-	n_div = isl_basic_set_dim(bset, isl_dim_div);
-	d = isl_basic_set_dim(bset, isl_dim_set);
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-
-	for (i = 0; i < n_div; ++i) {
-		if (isl_int_is_zero(c[1 + nparam + d + i]))
-			continue;
-		switch (div_purity[i]) {
-		case PURE_PARAM: p = 1; break;
-		case PURE_VAR: v = 1; break;
-		default: return IMPURE;
-		}
-	}
-	if (!p && isl_seq_first_non_zero(c + 1, nparam) == -1)
-		return PURE_VAR;
-	if (!v && isl_seq_first_non_zero(c + 1 + nparam, d) == -1)
-		return PURE_PARAM;
-
-	empty = parametric_constant_never_positive(bset, c, div_purity);
-	if (eq && empty >= 0 && !empty) {
-		isl_seq_neg(c, c, 1 + nparam + d + n_div);
-		empty = parametric_constant_never_positive(bset, c, div_purity);
-	}
-
-	return empty < 0 ? -1 : empty ? MIXED : IMPURE;
-}
-
-/* Return an array of integers indicating the type of each div in bset.
- * If the div is (recursively) defined in terms of only the parameters,
- * then the type is PURE_PARAM.
- * If the div is (recursively) defined in terms of only the set variables,
- * then the type is PURE_VAR.
- * Otherwise, the type is IMPURE.
- */
-static __isl_give int *get_div_purity(__isl_keep isl_basic_set *bset)
-{
-	int i, j;
-	int *div_purity;
-	unsigned d;
-	unsigned n_div;
-	unsigned nparam;
-
-	if (!bset)
-		return NULL;
-
-	n_div = isl_basic_set_dim(bset, isl_dim_div);
-	d = isl_basic_set_dim(bset, isl_dim_set);
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-
-	div_purity = isl_alloc_array(bset->ctx, int, n_div);
-	if (!div_purity)
-		return NULL;
-
-	for (i = 0; i < bset->n_div; ++i) {
-		int p = 0, v = 0;
-		if (isl_int_is_zero(bset->div[i][0])) {
-			div_purity[i] = IMPURE;
-			continue;
-		}
-		if (isl_seq_first_non_zero(bset->div[i] + 2, nparam) != -1)
-			p = 1;
-		if (isl_seq_first_non_zero(bset->div[i] + 2 + nparam, d) != -1)
-			v = 1;
-		for (j = 0; j < i; ++j) {
-			if (isl_int_is_zero(bset->div[i][2 + nparam + d + j]))
-				continue;
-			switch (div_purity[j]) {
-			case PURE_PARAM: p = 1; break;
-			case PURE_VAR: v = 1; break;
-			default: p = v = 1; break;
-			}
-		}
-		div_purity[i] = v ? p ? IMPURE : PURE_VAR : PURE_PARAM;
-	}
-
-	return div_purity;
-}
-
-/* Given a path with the as yet unconstrained length at position "pos",
- * check if setting the length to zero results in only the identity
- * mapping.
- */
-static int empty_path_is_identity(__isl_keep isl_basic_map *path, unsigned pos)
-{
-	isl_basic_map *test = NULL;
-	isl_basic_map *id = NULL;
-	int k;
-	int is_id;
-
-	test = isl_basic_map_copy(path);
-	test = isl_basic_map_extend_constraints(test, 1, 0);
-	k = isl_basic_map_alloc_equality(test);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(test->eq[k], 1 + isl_basic_map_total_dim(test));
-	isl_int_set_si(test->eq[k][pos], 1);
-	id = isl_basic_map_identity(isl_basic_map_get_dim(path));
-	is_id = isl_basic_map_is_equal(test, id);
-	isl_basic_map_free(test);
-	isl_basic_map_free(id);
-	return is_id;
-error:
-	isl_basic_map_free(test);
-	return -1;
-}
-
-/* If any of the constraints is found to be impure then this function
- * sets *impurity to 1.
- */
-static __isl_give isl_basic_map *add_delta_constraints(
-	__isl_take isl_basic_map *path,
-	__isl_keep isl_basic_set *delta, unsigned off, unsigned nparam,
-	unsigned d, int *div_purity, int eq, int *impurity)
-{
-	int i, k;
-	int n = eq ? delta->n_eq : delta->n_ineq;
-	isl_int **delta_c = eq ? delta->eq : delta->ineq;
-	unsigned n_div;
-
-	n_div = isl_basic_set_dim(delta, isl_dim_div);
-
-	for (i = 0; i < n; ++i) {
-		isl_int *path_c;
-		int p = purity(delta, delta_c[i], div_purity, eq);
-		if (p < 0)
-			goto error;
-		if (p != PURE_VAR && p != PURE_PARAM && !*impurity)
-			*impurity = 1;
-		if (p == IMPURE)
-			continue;
-		if (eq && p != MIXED) {
-			k = isl_basic_map_alloc_equality(path);
-			path_c = path->eq[k];
-		} else {
-			k = isl_basic_map_alloc_inequality(path);
-			path_c = path->ineq[k];
-		}
-		if (k < 0)
-			goto error;
-		isl_seq_clr(path_c, 1 + isl_basic_map_total_dim(path));
-		if (p == PURE_VAR) {
-			isl_seq_cpy(path_c + off,
-				    delta_c[i] + 1 + nparam, d);
-			isl_int_set(path_c[off + d], delta_c[i][0]);
-		} else if (p == PURE_PARAM) {
-			isl_seq_cpy(path_c, delta_c[i], 1 + nparam);
-		} else {
-			isl_seq_cpy(path_c + off,
-				    delta_c[i] + 1 + nparam, d);
-			isl_seq_cpy(path_c, delta_c[i], 1 + nparam);
-		}
-		isl_seq_cpy(path_c + off - n_div,
-			    delta_c[i] + 1 + nparam + d, n_div);
-	}
-
-	return path;
-error:
-	isl_basic_map_free(path);
-	return NULL;
-}
-
-/* Given a set of offsets "delta", construct a relation of the
- * given dimension specification (Z^{n+1} -> Z^{n+1}) that
- * is an overapproximation of the relations that
- * maps an element x to any element that can be reached
- * by taking a non-negative number of steps along any of
- * the elements in "delta".
- * That is, construct an approximation of
- *
- *	{ [x] -> [y] : exists f \in \delta, k \in Z :
- *					y = x + k [f, 1] and k >= 0 }
- *
- * For any element in this relation, the number of steps taken
- * is equal to the difference in the final coordinates.
- *
- * In particular, let delta be defined as
- *
- *	\delta = [p] -> { [x] : A x + a >= 0 and B p + b >= 0 and
- *				C x + C'p + c >= 0 and
- *				D x + D'p + d >= 0 }
- *
- * where the constraints C x + C'p + c >= 0 are such that the parametric
- * constant term of each constraint j, "C_j x + C'_j p + c_j",
- * can never attain positive values, then the relation is constructed as
- *
- *	{ [x] -> [y] : exists [f, k] \in Z^{n+1} : y = x + f and
- *			A f + k a >= 0 and B p + b >= 0 and
- *			C f + C'p + c >= 0 and k >= 1 }
- *	union { [x] -> [x] }
- *
- * If the zero-length paths happen to correspond exactly to the identity
- * mapping, then we return
- *
- *	{ [x] -> [y] : exists [f, k] \in Z^{n+1} : y = x + f and
- *			A f + k a >= 0 and B p + b >= 0 and
- *			C f + C'p + c >= 0 and k >= 0 }
- *
- * instead.
- *
- * Existentially quantified variables in \delta are handled by
- * classifying them as independent of the parameters, purely
- * parameter dependent and others.  Constraints containing
- * any of the other existentially quantified variables are removed.
- * This is safe, but leads to an additional overapproximation.
- *
- * If there are any impure constraints, then we also eliminate
- * the parameters from \delta, resulting in a set
- *
- *	\delta' = { [x] : E x + e >= 0 }
- *
- * and add the constraints
- *
- *			E f + k e >= 0
- *
- * to the constructed relation.
- */
-static __isl_give isl_map *path_along_delta(__isl_take isl_dim *dim,
-	__isl_take isl_basic_set *delta)
-{
-	isl_basic_map *path = NULL;
-	unsigned d;
-	unsigned n_div;
-	unsigned nparam;
-	unsigned off;
-	int i, k;
-	int is_id;
-	int *div_purity = NULL;
-	int impurity = 0;
-
-	if (!delta)
-		goto error;
-	n_div = isl_basic_set_dim(delta, isl_dim_div);
-	d = isl_basic_set_dim(delta, isl_dim_set);
-	nparam = isl_basic_set_dim(delta, isl_dim_param);
-	path = isl_basic_map_alloc_dim(isl_dim_copy(dim), n_div + d + 1,
-			d + 1 + delta->n_eq, delta->n_eq + delta->n_ineq + 1);
-	off = 1 + nparam + 2 * (d + 1) + n_div;
-
-	for (i = 0; i < n_div + d + 1; ++i) {
-		k = isl_basic_map_alloc_div(path);
-		if (k < 0)
-			goto error;
-		isl_int_set_si(path->div[k][0], 0);
-	}
-
-	for (i = 0; i < d + 1; ++i) {
-		k = isl_basic_map_alloc_equality(path);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(path->eq[k], 1 + isl_basic_map_total_dim(path));
-		isl_int_set_si(path->eq[k][1 + nparam + i], 1);
-		isl_int_set_si(path->eq[k][1 + nparam + d + 1 + i], -1);
-		isl_int_set_si(path->eq[k][off + i], 1);
-	}
-
-	div_purity = get_div_purity(delta);
-	if (!div_purity)
-		goto error;
-
-	path = add_delta_constraints(path, delta, off, nparam, d,
-				     div_purity, 1, &impurity);
-	path = add_delta_constraints(path, delta, off, nparam, d,
-				     div_purity, 0, &impurity);
-	if (impurity) {
-		isl_dim *dim = isl_basic_set_get_dim(delta);
-		delta = isl_basic_set_project_out(delta,
-						  isl_dim_param, 0, nparam);
-		delta = isl_basic_set_add(delta, isl_dim_param, nparam);
-		delta = isl_basic_set_reset_dim(delta, dim);
-		if (!delta)
-			goto error;
-		path = isl_basic_map_extend_constraints(path, delta->n_eq,
-							delta->n_ineq + 1);
-		path = add_delta_constraints(path, delta, off, nparam, d,
-					     NULL, 1, &impurity);
-		path = add_delta_constraints(path, delta, off, nparam, d,
-					     NULL, 0, &impurity);
-		path = isl_basic_map_gauss(path, NULL);
-	}
-
-	is_id = empty_path_is_identity(path, off + d);
-	if (is_id < 0)
-		goto error;
-
-	k = isl_basic_map_alloc_inequality(path);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(path->ineq[k], 1 + isl_basic_map_total_dim(path));
-	if (!is_id)
-		isl_int_set_si(path->ineq[k][0], -1);
-	isl_int_set_si(path->ineq[k][off + d], 1);
-			
-	free(div_purity);
-	isl_basic_set_free(delta);
-	path = isl_basic_map_finalize(path);
-	if (is_id) {
-		isl_dim_free(dim);
-		return isl_map_from_basic_map(path);
-	}
-	return isl_basic_map_union(path, isl_basic_map_identity(dim));
-error:
-	free(div_purity);
-	isl_dim_free(dim);
-	isl_basic_set_free(delta);
-	isl_basic_map_free(path);
-	return NULL;
-}
-
-/* Given a dimension specification Z^{n+1} -> Z^{n+1} and a parameter "param",
- * construct a map that equates the parameter to the difference
- * in the final coordinates and imposes that this difference is positive.
- * That is, construct
- *
- *	{ [x,x_s] -> [y,y_s] : k = y_s - x_s > 0 }
- */
-static __isl_give isl_map *equate_parameter_to_length(__isl_take isl_dim *dim,
-	unsigned param)
-{
-	struct isl_basic_map *bmap;
-	unsigned d;
-	unsigned nparam;
-	int k;
-
-	d = isl_dim_size(dim, isl_dim_in);
-	nparam = isl_dim_size(dim, isl_dim_param);
-	bmap = isl_basic_map_alloc_dim(dim, 0, 1, 1);
-	k = isl_basic_map_alloc_equality(bmap);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(bmap->eq[k], 1 + isl_basic_map_total_dim(bmap));
-	isl_int_set_si(bmap->eq[k][1 + param], -1);
-	isl_int_set_si(bmap->eq[k][1 + nparam + d - 1], -1);
-	isl_int_set_si(bmap->eq[k][1 + nparam + d + d - 1], 1);
-
-	k = isl_basic_map_alloc_inequality(bmap);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(bmap->ineq[k], 1 + isl_basic_map_total_dim(bmap));
-	isl_int_set_si(bmap->ineq[k][1 + param], 1);
-	isl_int_set_si(bmap->ineq[k][0], -1);
-
-	bmap = isl_basic_map_finalize(bmap);
-	return isl_map_from_basic_map(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Check whether "path" is acyclic, where the last coordinates of domain
- * and range of path encode the number of steps taken.
- * That is, check whether
- *
- *	{ d | d = y - x and (x,y) in path }
- *
- * does not contain any element with positive last coordinate (positive length)
- * and zero remaining coordinates (cycle).
- */
-static int is_acyclic(__isl_take isl_map *path)
-{
-	int i;
-	int acyclic;
-	unsigned dim;
-	struct isl_set *delta;
-
-	delta = isl_map_deltas(path);
-	dim = isl_set_dim(delta, isl_dim_set);
-	for (i = 0; i < dim; ++i) {
-		if (i == dim -1)
-			delta = isl_set_lower_bound_si(delta, isl_dim_set, i, 1);
-		else
-			delta = isl_set_fix_si(delta, isl_dim_set, i, 0);
-	}
-
-	acyclic = isl_set_is_empty(delta);
-	isl_set_free(delta);
-
-	return acyclic;
-}
-
-/* Given a union of basic maps R = \cup_i R_i \subseteq D \times D
- * and a dimension specification (Z^{n+1} -> Z^{n+1}),
- * construct a map that is an overapproximation of the map
- * that takes an element from the space D \times Z to another
- * element from the same space, such that the first n coordinates of the
- * difference between them is a sum of differences between images
- * and pre-images in one of the R_i and such that the last coordinate
- * is equal to the number of steps taken.
- * That is, let
- *
- *	\Delta_i = { y - x | (x, y) in R_i }
- *
- * then the constructed map is an overapproximation of
- *
- *	{ (x) -> (x + d) | \exists k_i >= 0, \delta_i \in \Delta_i :
- *				d = (\sum_i k_i \delta_i, \sum_i k_i) }
- *
- * The elements of the singleton \Delta_i's are collected as the
- * rows of the steps matrix.  For all these \Delta_i's together,
- * a single path is constructed.
- * For each of the other \Delta_i's, we compute an overapproximation
- * of the paths along elements of \Delta_i.
- * Since each of these paths performs an addition, composition is
- * symmetric and we can simply compose all resulting paths in any order.
- */
-static __isl_give isl_map *construct_extended_path(__isl_take isl_dim *dim,
-	__isl_keep isl_map *map, int *project)
-{
-	struct isl_mat *steps = NULL;
-	struct isl_map *path = NULL;
-	unsigned d;
-	int i, j, n;
-
-	d = isl_map_dim(map, isl_dim_in);
-
-	path = isl_map_identity(isl_dim_copy(dim));
-
-	steps = isl_mat_alloc(map->ctx, map->n, d);
-	if (!steps)
-		goto error;
-
-	n = 0;
-	for (i = 0; i < map->n; ++i) {
-		struct isl_basic_set *delta;
-
-		delta = isl_basic_map_deltas(isl_basic_map_copy(map->p[i]));
-
-		for (j = 0; j < d; ++j) {
-			int fixed;
-
-			fixed = isl_basic_set_plain_dim_is_fixed(delta, j,
-							    &steps->row[n][j]);
-			if (fixed < 0) {
-				isl_basic_set_free(delta);
-				goto error;
-			}
-			if (!fixed)
-				break;
-		}
-
-
-		if (j < d) {
-			path = isl_map_apply_range(path,
-				path_along_delta(isl_dim_copy(dim), delta));
-			path = isl_map_coalesce(path);
-		} else {
-			isl_basic_set_free(delta);
-			++n;
-		}
-	}
-
-	if (n > 0) {
-		steps->n_row = n;
-		path = isl_map_apply_range(path,
-				path_along_steps(isl_dim_copy(dim), steps));
-	}
-
-	if (project && *project) {
-		*project = is_acyclic(isl_map_copy(path));
-		if (*project < 0)
-			goto error;
-	}
-
-	isl_dim_free(dim);
-	isl_mat_free(steps);
-	return path;
-error:
-	isl_dim_free(dim);
-	isl_mat_free(steps);
-	isl_map_free(path);
-	return NULL;
-}
-
-static int isl_set_overlaps(__isl_keep isl_set *set1, __isl_keep isl_set *set2)
-{
-	isl_set *i;
-	int no_overlap;
-
-	if (!isl_dim_tuple_match(set1->dim, isl_dim_set, set2->dim, isl_dim_set))
-		return 0;
-
-	i = isl_set_intersect(isl_set_copy(set1), isl_set_copy(set2));
-	no_overlap = isl_set_is_empty(i);
-	isl_set_free(i);
-
-	return no_overlap < 0 ? -1 : !no_overlap;
-}
-
-/* Given a union of basic maps R = \cup_i R_i \subseteq D \times D
- * and a dimension specification (Z^{n+1} -> Z^{n+1}),
- * construct a map that is an overapproximation of the map
- * that takes an element from the dom R \times Z to an
- * element from ran R \times Z, such that the first n coordinates of the
- * difference between them is a sum of differences between images
- * and pre-images in one of the R_i and such that the last coordinate
- * is equal to the number of steps taken.
- * That is, let
- *
- *	\Delta_i = { y - x | (x, y) in R_i }
- *
- * then the constructed map is an overapproximation of
- *
- *	{ (x) -> (x + d) | \exists k_i >= 0, \delta_i \in \Delta_i :
- *				d = (\sum_i k_i \delta_i, \sum_i k_i) and
- *				x in dom R and x + d in ran R and
- *				\sum_i k_i >= 1 }
- */
-static __isl_give isl_map *construct_component(__isl_take isl_dim *dim,
-	__isl_keep isl_map *map, int *exact, int project)
-{
-	struct isl_set *domain = NULL;
-	struct isl_set *range = NULL;
-	struct isl_map *app = NULL;
-	struct isl_map *path = NULL;
-
-	domain = isl_map_domain(isl_map_copy(map));
-	domain = isl_set_coalesce(domain);
-	range = isl_map_range(isl_map_copy(map));
-	range = isl_set_coalesce(range);
-	if (!isl_set_overlaps(domain, range)) {
-		isl_set_free(domain);
-		isl_set_free(range);
-		isl_dim_free(dim);
-
-		map = isl_map_copy(map);
-		map = isl_map_add_dims(map, isl_dim_in, 1);
-		map = isl_map_add_dims(map, isl_dim_out, 1);
-		map = set_path_length(map, 1, 1);
-		return map;
-	}
-	app = isl_map_from_domain_and_range(domain, range);
-	app = isl_map_add_dims(app, isl_dim_in, 1);
-	app = isl_map_add_dims(app, isl_dim_out, 1);
-
-	path = construct_extended_path(isl_dim_copy(dim), map,
-					exact && *exact ? &project : NULL);
-	app = isl_map_intersect(app, path);
-
-	if (exact && *exact &&
-	    (*exact = check_exactness(isl_map_copy(map), isl_map_copy(app),
-				      project)) < 0)
-		goto error;
-
-	isl_dim_free(dim);
-	app = set_path_length(app, 0, 1);
-	return app;
-error:
-	isl_dim_free(dim);
-	isl_map_free(app);
-	return NULL;
-}
-
-/* Call construct_component and, if "project" is set, project out
- * the final coordinates.
- */
-static __isl_give isl_map *construct_projected_component(
-	__isl_take isl_dim *dim,
-	__isl_keep isl_map *map, int *exact, int project)
-{
-	isl_map *app;
-	unsigned d;
-
-	if (!dim)
-		return NULL;
-	d = isl_dim_size(dim, isl_dim_in);
-
-	app = construct_component(dim, map, exact, project);
-	if (project) {
-		app = isl_map_project_out(app, isl_dim_in, d - 1, 1);
-		app = isl_map_project_out(app, isl_dim_out, d - 1, 1);
-	}
-	return app;
-}
-
-/* Compute an extended version, i.e., with path lengths, of
- * an overapproximation of the transitive closure of "bmap"
- * with path lengths greater than or equal to zero and with
- * domain and range equal to "dom".
- */
-static __isl_give isl_map *q_closure(__isl_take isl_dim *dim,
-	__isl_take isl_set *dom, __isl_keep isl_basic_map *bmap, int *exact)
-{
-	int project = 1;
-	isl_map *path;
-	isl_map *map;
-	isl_map *app;
-
-	dom = isl_set_add_dims(dom, isl_dim_set, 1);
-	app = isl_map_from_domain_and_range(dom, isl_set_copy(dom));
-	map = isl_map_from_basic_map(isl_basic_map_copy(bmap));
-	path = construct_extended_path(dim, map, &project);
-	app = isl_map_intersect(app, path);
-
-	if ((*exact = check_exactness(map, isl_map_copy(app), project)) < 0)
-		goto error;
-
-	return app;
-error:
-	isl_map_free(app);
-	return NULL;
-}
-
-/* Check whether qc has any elements of length at least one
- * with domain and/or range outside of dom and ran.
- */
-static int has_spurious_elements(__isl_keep isl_map *qc,
-	__isl_keep isl_set *dom, __isl_keep isl_set *ran)
-{
-	isl_set *s;
-	int subset;
-	unsigned d;
-
-	if (!qc || !dom || !ran)
-		return -1;
-
-	d = isl_map_dim(qc, isl_dim_in);
-
-	qc = isl_map_copy(qc);
-	qc = set_path_length(qc, 0, 1);
-	qc = isl_map_project_out(qc, isl_dim_in, d - 1, 1);
-	qc = isl_map_project_out(qc, isl_dim_out, d - 1, 1);
-
-	s = isl_map_domain(isl_map_copy(qc));
-	subset = isl_set_is_subset(s, dom);
-	isl_set_free(s);
-	if (subset < 0)
-		goto error;
-	if (!subset) {
-		isl_map_free(qc);
-		return 1;
-	}
-
-	s = isl_map_range(qc);
-	subset = isl_set_is_subset(s, ran);
-	isl_set_free(s);
-
-	return subset < 0 ? -1 : !subset;
-error:
-	isl_map_free(qc);
-	return -1;
-}
-
-#define LEFT	2
-#define RIGHT	1
-
-/* For each basic map in "map", except i, check whether it combines
- * with the transitive closure that is reflexive on C combines
- * to the left and to the right.
- *
- * In particular, if
- *
- *	dom map_j \subseteq C
- *
- * then right[j] is set to 1.  Otherwise, if
- *
- *	ran map_i \cap dom map_j = \emptyset
- *
- * then right[j] is set to 0.  Otherwise, composing to the right
- * is impossible.
- *
- * Similar, for composing to the left, we have if
- *
- *	ran map_j \subseteq C
- *
- * then left[j] is set to 1.  Otherwise, if
- *
- *	dom map_i \cap ran map_j = \emptyset
- *
- * then left[j] is set to 0.  Otherwise, composing to the left
- * is impossible.
- *
- * The return value is or'd with LEFT if composing to the left
- * is possible and with RIGHT if composing to the right is possible.
- */
-static int composability(__isl_keep isl_set *C, int i,
-	isl_set **dom, isl_set **ran, int *left, int *right,
-	__isl_keep isl_map *map)
-{
-	int j;
-	int ok;
-
-	ok = LEFT | RIGHT;
-	for (j = 0; j < map->n && ok; ++j) {
-		int overlaps, subset;
-		if (j == i)
-			continue;
-
-		if (ok & RIGHT) {
-			if (!dom[j])
-				dom[j] = isl_set_from_basic_set(
-					isl_basic_map_domain(
-						isl_basic_map_copy(map->p[j])));
-			if (!dom[j])
-				return -1;
-			overlaps = isl_set_overlaps(ran[i], dom[j]);
-			if (overlaps < 0)
-				return -1;
-			if (!overlaps)
-				right[j] = 0;
-			else {
-				subset = isl_set_is_subset(dom[j], C);
-				if (subset < 0)
-					return -1;
-				if (subset)
-					right[j] = 1;
-				else
-					ok &= ~RIGHT;
-			}
-		}
-
-		if (ok & LEFT) {
-			if (!ran[j])
-				ran[j] = isl_set_from_basic_set(
-					isl_basic_map_range(
-						isl_basic_map_copy(map->p[j])));
-			if (!ran[j])
-				return -1;
-			overlaps = isl_set_overlaps(dom[i], ran[j]);
-			if (overlaps < 0)
-				return -1;
-			if (!overlaps)
-				left[j] = 0;
-			else {
-				subset = isl_set_is_subset(ran[j], C);
-				if (subset < 0)
-					return -1;
-				if (subset)
-					left[j] = 1;
-				else
-					ok &= ~LEFT;
-			}
-		}
-	}
-
-	return ok;
-}
-
-static __isl_give isl_map *anonymize(__isl_take isl_map *map)
-{
-	map = isl_map_reset(map, isl_dim_in);
-	map = isl_map_reset(map, isl_dim_out);
-	return map;
-}
-
-/* Return a map that is a union of the basic maps in "map", except i,
- * composed to left and right with qc based on the entries of "left"
- * and "right".
- */
-static __isl_give isl_map *compose(__isl_keep isl_map *map, int i,
-	__isl_take isl_map *qc, int *left, int *right)
-{
-	int j;
-	isl_map *comp;
-
-	comp = isl_map_empty(isl_map_get_dim(map));
-	for (j = 0; j < map->n; ++j) {
-		isl_map *map_j;
-
-		if (j == i)
-			continue;
-
-		map_j = isl_map_from_basic_map(isl_basic_map_copy(map->p[j]));
-		map_j = anonymize(map_j);
-		if (left && left[j])
-			map_j = isl_map_apply_range(map_j, isl_map_copy(qc));
-		if (right && right[j])
-			map_j = isl_map_apply_range(isl_map_copy(qc), map_j);
-		comp = isl_map_union(comp, map_j);
-	}
-
-	comp = isl_map_compute_divs(comp);
-	comp = isl_map_coalesce(comp);
-
-	isl_map_free(qc);
-
-	return comp;
-}
-
-/* Compute the transitive closure of "map" incrementally by
- * computing
- *
- *	map_i^+ \cup qc^+
- *
- * or
- *
- *	map_i^+ \cup ((id \cup map_i^) \circ qc^+)
- *
- * or
- *
- *	map_i^+ \cup (qc^+ \circ (id \cup map_i^))
- *
- * depending on whether left or right are NULL.
- */
-static __isl_give isl_map *compute_incremental(
-	__isl_take isl_dim *dim, __isl_keep isl_map *map,
-	int i, __isl_take isl_map *qc, int *left, int *right, int *exact)
-{
-	isl_map *map_i;
-	isl_map *tc;
-	isl_map *rtc = NULL;
-
-	if (!map)
-		goto error;
-	isl_assert(map->ctx, left || right, goto error);
-
-	map_i = isl_map_from_basic_map(isl_basic_map_copy(map->p[i]));
-	tc = construct_projected_component(isl_dim_copy(dim), map_i,
-						exact, 1);
-	isl_map_free(map_i);
-
-	if (*exact)
-		qc = isl_map_transitive_closure(qc, exact);
-
-	if (!*exact) {
-		isl_dim_free(dim);
-		isl_map_free(tc);
-		isl_map_free(qc);
-		return isl_map_universe(isl_map_get_dim(map));
-	}
-
-	if (!left || !right)
-		rtc = isl_map_union(isl_map_copy(tc),
-				    isl_map_identity(isl_map_get_dim(tc)));
-	if (!right)
-		qc = isl_map_apply_range(rtc, qc);
-	if (!left)
-		qc = isl_map_apply_range(qc, rtc);
-	qc = isl_map_union(tc, qc);
-
-	isl_dim_free(dim);
-
-	return qc;
-error:
-	isl_dim_free(dim);
-	isl_map_free(qc);
-	return NULL;
-}
-
-/* Given a map "map", try to find a basic map such that
- * map^+ can be computed as
- *
- * map^+ = map_i^+ \cup
- *    \bigcup_j ((map_i^+ \cup Id_C)^+ \circ map_j \circ (map_i^+ \cup Id_C))^+
- *
- * with C the simple hull of the domain and range of the input map.
- * map_i^ \cup Id_C is computed by allowing the path lengths to be zero
- * and by intersecting domain and range with C.
- * Of course, we need to check that this is actually equal to map_i^ \cup Id_C.
- * Also, we only use the incremental computation if all the transitive
- * closures are exact and if the number of basic maps in the union,
- * after computing the integer divisions, is smaller than the number
- * of basic maps in the input map.
- */
-static int incemental_on_entire_domain(__isl_keep isl_dim *dim,
-	__isl_keep isl_map *map,
-	isl_set **dom, isl_set **ran, int *left, int *right,
-	__isl_give isl_map **res)
-{
-	int i;
-	isl_set *C;
-	unsigned d;
-
-	*res = NULL;
-
-	C = isl_set_union(isl_map_domain(isl_map_copy(map)),
-			  isl_map_range(isl_map_copy(map)));
-	C = isl_set_from_basic_set(isl_set_simple_hull(C));
-	if (!C)
-		return -1;
-	if (C->n != 1) {
-		isl_set_free(C);
-		return 0;
-	}
-
-	d = isl_map_dim(map, isl_dim_in);
-
-	for (i = 0; i < map->n; ++i) {
-		isl_map *qc;
-		int exact_i, spurious;
-		int j;
-		dom[i] = isl_set_from_basic_set(isl_basic_map_domain(
-					isl_basic_map_copy(map->p[i])));
-		ran[i] = isl_set_from_basic_set(isl_basic_map_range(
-					isl_basic_map_copy(map->p[i])));
-		qc = q_closure(isl_dim_copy(dim), isl_set_copy(C),
-				map->p[i], &exact_i);
-		if (!qc)
-			goto error;
-		if (!exact_i) {
-			isl_map_free(qc);
-			continue;
-		}
-		spurious = has_spurious_elements(qc, dom[i], ran[i]);
-		if (spurious) {
-			isl_map_free(qc);
-			if (spurious < 0)
-				goto error;
-			continue;
-		}
-		qc = isl_map_project_out(qc, isl_dim_in, d, 1);
-		qc = isl_map_project_out(qc, isl_dim_out, d, 1);
-		qc = isl_map_compute_divs(qc);
-		for (j = 0; j < map->n; ++j)
-			left[j] = right[j] = 1;
-		qc = compose(map, i, qc, left, right);
-		if (!qc)
-			goto error;
-		if (qc->n >= map->n) {
-			isl_map_free(qc);
-			continue;
-		}
-		*res = compute_incremental(isl_dim_copy(dim), map, i, qc,
-				left, right, &exact_i);
-		if (!*res)
-			goto error;
-		if (exact_i)
-			break;
-		isl_map_free(*res);
-		*res = NULL;
-	}
-
-	isl_set_free(C);
-
-	return *res != NULL;
-error:
-	isl_set_free(C);
-	return -1;
-}
-
-/* Try and compute the transitive closure of "map" as
- *
- * map^+ = map_i^+ \cup
- *    \bigcup_j ((map_i^+ \cup Id_C)^+ \circ map_j \circ (map_i^+ \cup Id_C))^+
- *
- * with C either the simple hull of the domain and range of the entire
- * map or the simple hull of domain and range of map_i.
- */
-static __isl_give isl_map *incremental_closure(__isl_take isl_dim *dim,
-	__isl_keep isl_map *map, int *exact, int project)
-{
-	int i;
-	isl_set **dom = NULL;
-	isl_set **ran = NULL;
-	int *left = NULL;
-	int *right = NULL;
-	isl_set *C;
-	unsigned d;
-	isl_map *res = NULL;
-
-	if (!project)
-		return construct_projected_component(dim, map, exact, project);
-
-	if (!map)
-		goto error;
-	if (map->n <= 1)
-		return construct_projected_component(dim, map, exact, project);
-
-	d = isl_map_dim(map, isl_dim_in);
-
-	dom = isl_calloc_array(map->ctx, isl_set *, map->n);
-	ran = isl_calloc_array(map->ctx, isl_set *, map->n);
-	left = isl_calloc_array(map->ctx, int, map->n);
-	right = isl_calloc_array(map->ctx, int, map->n);
-	if (!ran || !dom || !left || !right)
-		goto error;
-
-	if (incemental_on_entire_domain(dim, map, dom, ran, left, right, &res) < 0)
-		goto error;
-
-	for (i = 0; !res && i < map->n; ++i) {
-		isl_map *qc;
-		int exact_i, spurious, comp;
-		if (!dom[i])
-			dom[i] = isl_set_from_basic_set(
-					isl_basic_map_domain(
-						isl_basic_map_copy(map->p[i])));
-		if (!dom[i])
-			goto error;
-		if (!ran[i])
-			ran[i] = isl_set_from_basic_set(
-					isl_basic_map_range(
-						isl_basic_map_copy(map->p[i])));
-		if (!ran[i])
-			goto error;
-		C = isl_set_union(isl_set_copy(dom[i]),
-				      isl_set_copy(ran[i]));
-		C = isl_set_from_basic_set(isl_set_simple_hull(C));
-		if (!C)
-			goto error;
-		if (C->n != 1) {
-			isl_set_free(C);
-			continue;
-		}
-		comp = composability(C, i, dom, ran, left, right, map);
-		if (!comp || comp < 0) {
-			isl_set_free(C);
-			if (comp < 0)
-				goto error;
-			continue;
-		}
-		qc = q_closure(isl_dim_copy(dim), C, map->p[i], &exact_i);
-		if (!qc)
-			goto error;
-		if (!exact_i) {
-			isl_map_free(qc);
-			continue;
-		}
-		spurious = has_spurious_elements(qc, dom[i], ran[i]);
-		if (spurious) {
-			isl_map_free(qc);
-			if (spurious < 0)
-				goto error;
-			continue;
-		}
-		qc = isl_map_project_out(qc, isl_dim_in, d, 1);
-		qc = isl_map_project_out(qc, isl_dim_out, d, 1);
-		qc = isl_map_compute_divs(qc);
-		qc = compose(map, i, qc, (comp & LEFT) ? left : NULL,
-				(comp & RIGHT) ? right : NULL);
-		if (!qc)
-			goto error;
-		if (qc->n >= map->n) {
-			isl_map_free(qc);
-			continue;
-		}
-		res = compute_incremental(isl_dim_copy(dim), map, i, qc,
-				(comp & LEFT) ? left : NULL,
-				(comp & RIGHT) ? right : NULL, &exact_i);
-		if (!res)
-			goto error;
-		if (exact_i)
-			break;
-		isl_map_free(res);
-		res = NULL;
-	}
-
-	for (i = 0; i < map->n; ++i) {
-		isl_set_free(dom[i]);
-		isl_set_free(ran[i]);
-	}
-	free(dom);
-	free(ran);
-	free(left);
-	free(right);
-
-	if (res) {
-		isl_dim_free(dim);
-		return res;
-	}
-
-	return construct_projected_component(dim, map, exact, project);
-error:
-	if (dom)
-		for (i = 0; i < map->n; ++i)
-			isl_set_free(dom[i]);
-	free(dom);
-	if (ran)
-		for (i = 0; i < map->n; ++i)
-			isl_set_free(ran[i]);
-	free(ran);
-	free(left);
-	free(right);
-	isl_dim_free(dim);
-	return NULL;
-}
-
-/* Given an array of sets "set", add "dom" at position "pos"
- * and search for elements at earlier positions that overlap with "dom".
- * If any can be found, then merge all of them, together with "dom", into
- * a single set and assign the union to the first in the array,
- * which becomes the new group leader for all groups involved in the merge.
- * During the search, we only consider group leaders, i.e., those with
- * group[i] = i, as the other sets have already been combined
- * with one of the group leaders.
- */
-static int merge(isl_set **set, int *group, __isl_take isl_set *dom, int pos)
-{
-	int i;
-
-	group[pos] = pos;
-	set[pos] = isl_set_copy(dom);
-
-	for (i = pos - 1; i >= 0; --i) {
-		int o;
-
-		if (group[i] != i)
-			continue;
-
-		o = isl_set_overlaps(set[i], dom);
-		if (o < 0)
-			goto error;
-		if (!o)
-			continue;
-
-		set[i] = isl_set_union(set[i], set[group[pos]]);
-		set[group[pos]] = NULL;
-		if (!set[i])
-			goto error;
-		group[group[pos]] = i;
-		group[pos] = i;
-	}
-
-	isl_set_free(dom);
-	return 0;
-error:
-	isl_set_free(dom);
-	return -1;
-}
-
-/* Replace each entry in the n by n grid of maps by the cross product
- * with the relation { [i] -> [i + 1] }.
- */
-static int add_length(__isl_keep isl_map *map, isl_map ***grid, int n)
-{
-	int i, j, k;
-	isl_dim *dim;
-	isl_basic_map *bstep;
-	isl_map *step;
-	unsigned nparam;
-
-	if (!map)
-		return -1;
-
-	dim = isl_map_get_dim(map);
-	nparam = isl_dim_size(dim, isl_dim_param);
-	dim = isl_dim_drop(dim, isl_dim_in, 0, isl_dim_size(dim, isl_dim_in));
-	dim = isl_dim_drop(dim, isl_dim_out, 0, isl_dim_size(dim, isl_dim_out));
-	dim = isl_dim_add(dim, isl_dim_in, 1);
-	dim = isl_dim_add(dim, isl_dim_out, 1);
-	bstep = isl_basic_map_alloc_dim(dim, 0, 1, 0);
-	k = isl_basic_map_alloc_equality(bstep);
-	if (k < 0) {
-		isl_basic_map_free(bstep);
-		return -1;
-	}
-	isl_seq_clr(bstep->eq[k], 1 + isl_basic_map_total_dim(bstep));
-	isl_int_set_si(bstep->eq[k][0], 1);
-	isl_int_set_si(bstep->eq[k][1 + nparam], 1);
-	isl_int_set_si(bstep->eq[k][1 + nparam + 1], -1);
-	bstep = isl_basic_map_finalize(bstep);
-	step = isl_map_from_basic_map(bstep);
-
-	for (i = 0; i < n; ++i)
-		for (j = 0; j < n; ++j)
-			grid[i][j] = isl_map_product(grid[i][j],
-						     isl_map_copy(step));
-
-	isl_map_free(step);
-
-	return 0;
-}
-
-/* The core of the Floyd-Warshall algorithm.
- * Updates the given n x x matrix of relations in place.
- *
- * The algorithm iterates over all vertices.  In each step, the whole
- * matrix is updated to include all paths that go to the current vertex,
- * possibly stay there a while (including passing through earlier vertices)
- * and then come back.  At the start of each iteration, the diagonal
- * element corresponding to the current vertex is replaced by its
- * transitive closure to account for all indirect paths that stay
- * in the current vertex.
- */
-static void floyd_warshall_iterate(isl_map ***grid, int n, int *exact)
-{
-	int r, p, q;
-
-	for (r = 0; r < n; ++r) {
-		int r_exact;
-		grid[r][r] = isl_map_transitive_closure(grid[r][r],
-				(exact && *exact) ? &r_exact : NULL);
-		if (exact && *exact && !r_exact)
-			*exact = 0;
-
-		for (p = 0; p < n; ++p)
-			for (q = 0; q < n; ++q) {
-				isl_map *loop;
-				if (p == r && q == r)
-					continue;
-				loop = isl_map_apply_range(
-						isl_map_copy(grid[p][r]),
-						isl_map_copy(grid[r][q]));
-				grid[p][q] = isl_map_union(grid[p][q], loop);
-				loop = isl_map_apply_range(
-						isl_map_copy(grid[p][r]),
-					isl_map_apply_range(
-						isl_map_copy(grid[r][r]),
-						isl_map_copy(grid[r][q])));
-				grid[p][q] = isl_map_union(grid[p][q], loop);
-				grid[p][q] = isl_map_coalesce(grid[p][q]);
-			}
-	}
-}
-
-/* Given a partition of the domains and ranges of the basic maps in "map",
- * apply the Floyd-Warshall algorithm with the elements in the partition
- * as vertices.
- *
- * In particular, there are "n" elements in the partition and "group" is
- * an array of length 2 * map->n with entries in [0,n-1].
- *
- * We first construct a matrix of relations based on the partition information,
- * apply Floyd-Warshall on this matrix of relations and then take the
- * union of all entries in the matrix as the final result.
- *
- * If we are actually computing the power instead of the transitive closure,
- * i.e., when "project" is not set, then the result should have the
- * path lengths encoded as the difference between an extra pair of
- * coordinates.  We therefore apply the nested transitive closures
- * to relations that include these lengths.  In particular, we replace
- * the input relation by the cross product with the unit length relation
- * { [i] -> [i + 1] }.
- */
-static __isl_give isl_map *floyd_warshall_with_groups(__isl_take isl_dim *dim,
-	__isl_keep isl_map *map, int *exact, int project, int *group, int n)
-{
-	int i, j, k;
-	isl_map ***grid = NULL;
-	isl_map *app;
-
-	if (!map)
-		goto error;
-
-	if (n == 1) {
-		free(group);
-		return incremental_closure(dim, map, exact, project);
-	}
-
-	grid = isl_calloc_array(map->ctx, isl_map **, n);
-	if (!grid)
-		goto error;
-	for (i = 0; i < n; ++i) {
-		grid[i] = isl_calloc_array(map->ctx, isl_map *, n);
-		if (!grid[i])
-			goto error;
-		for (j = 0; j < n; ++j)
-			grid[i][j] = isl_map_empty(isl_map_get_dim(map));
-	}
-
-	for (k = 0; k < map->n; ++k) {
-		i = group[2 * k];
-		j = group[2 * k + 1];
-		grid[i][j] = isl_map_union(grid[i][j],
-				isl_map_from_basic_map(
-					isl_basic_map_copy(map->p[k])));
-	}
-
-	if (!project && add_length(map, grid, n) < 0)
-		goto error;
-
-	floyd_warshall_iterate(grid, n, exact);
-
-	app = isl_map_empty(isl_map_get_dim(map));
-
-	for (i = 0; i < n; ++i) {
-		for (j = 0; j < n; ++j)
-			app = isl_map_union(app, grid[i][j]);
-		free(grid[i]);
-	}
-	free(grid);
-
-	free(group);
-	isl_dim_free(dim);
-
-	return app;
-error:
-	if (grid)
-		for (i = 0; i < n; ++i) {
-			if (!grid[i])
-				continue;
-			for (j = 0; j < n; ++j)
-				isl_map_free(grid[i][j]);
-			free(grid[i]);
-		}
-	free(grid);
-	free(group);
-	isl_dim_free(dim);
-	return NULL;
-}
-
-/* Partition the domains and ranges of the n basic relations in list
- * into disjoint cells.
- *
- * To find the partition, we simply consider all of the domains
- * and ranges in turn and combine those that overlap.
- * "set" contains the partition elements and "group" indicates
- * to which partition element a given domain or range belongs.
- * The domain of basic map i corresponds to element 2 * i in these arrays,
- * while the domain corresponds to element 2 * i + 1.
- * During the construction group[k] is either equal to k,
- * in which case set[k] contains the union of all the domains and
- * ranges in the corresponding group, or is equal to some l < k,
- * with l another domain or range in the same group.
- */
-static int *setup_groups(isl_ctx *ctx, __isl_keep isl_basic_map **list, int n,
-	isl_set ***set, int *n_group)
-{
-	int i;
-	int *group = NULL;
-	int g;
-
-	*set = isl_calloc_array(ctx, isl_set *, 2 * n);
-	group = isl_alloc_array(ctx, int, 2 * n);
-
-	if (!*set || !group)
-		goto error;
-
-	for (i = 0; i < n; ++i) {
-		isl_set *dom;
-		dom = isl_set_from_basic_set(isl_basic_map_domain(
-				isl_basic_map_copy(list[i])));
-		if (merge(*set, group, dom, 2 * i) < 0)
-			goto error;
-		dom = isl_set_from_basic_set(isl_basic_map_range(
-				isl_basic_map_copy(list[i])));
-		if (merge(*set, group, dom, 2 * i + 1) < 0)
-			goto error;
-	}
-
-	g = 0;
-	for (i = 0; i < 2 * n; ++i)
-		if (group[i] == i) {
-			if (g != i) {
-				(*set)[g] = (*set)[i];
-				(*set)[i] = NULL;
-			}
-			group[i] = g++;
-		} else
-			group[i] = group[group[i]];
-
-	*n_group = g;
-
-	return group;
-error:
-	if (*set) {
-		for (i = 0; i < 2 * n; ++i)
-			isl_set_free((*set)[i]);
-		free(*set);
-		*set = NULL;
-	}
-	free(group);
-	return NULL;
-}
-
-/* Check if the domains and ranges of the basic maps in "map" can
- * be partitioned, and if so, apply Floyd-Warshall on the elements
- * of the partition.  Note that we also apply this algorithm
- * if we want to compute the power, i.e., when "project" is not set.
- * However, the results are unlikely to be exact since the recursive
- * calls inside the Floyd-Warshall algorithm typically result in
- * non-linear path lengths quite quickly.
- */
-static __isl_give isl_map *floyd_warshall(__isl_take isl_dim *dim,
-	__isl_keep isl_map *map, int *exact, int project)
-{
-	int i;
-	isl_set **set = NULL;
-	int *group = NULL;
-	int n;
-
-	if (!map)
-		goto error;
-	if (map->n <= 1)
-		return incremental_closure(dim, map, exact, project);
-
-	group = setup_groups(map->ctx, map->p, map->n, &set, &n);
-	if (!group)
-		goto error;
-
-	for (i = 0; i < 2 * map->n; ++i)
-		isl_set_free(set[i]);
-
-	free(set);
-
-	return floyd_warshall_with_groups(dim, map, exact, project, group, n);
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-/* Structure for representing the nodes in the graph being traversed
- * using Tarjan's algorithm.
- * index represents the order in which nodes are visited.
- * min_index is the index of the root of a (sub)component.
- * on_stack indicates whether the node is currently on the stack.
- */
-struct basic_map_sort_node {
-	int index;
-	int min_index;
-	int on_stack;
-};
-/* Structure for representing the graph being traversed
- * using Tarjan's algorithm.
- * len is the number of nodes
- * node is an array of nodes
- * stack contains the nodes on the path from the root to the current node
- * sp is the stack pointer
- * index is the index of the last node visited
- * order contains the elements of the components separated by -1
- * op represents the current position in order
- *
- * check_closed is set if we may have used the fact that
- * a pair of basic maps can be interchanged
- */
-struct basic_map_sort {
-	int len;
-	struct basic_map_sort_node *node;
-	int *stack;
-	int sp;
-	int index;
-	int *order;
-	int op;
-	int check_closed;
-};
-
-static void basic_map_sort_free(struct basic_map_sort *s)
-{
-	if (!s)
-		return;
-	free(s->node);
-	free(s->stack);
-	free(s->order);
-	free(s);
-}
-
-static struct basic_map_sort *basic_map_sort_alloc(struct isl_ctx *ctx, int len)
-{
-	struct basic_map_sort *s;
-	int i;
-
-	s = isl_calloc_type(ctx, struct basic_map_sort);
-	if (!s)
-		return NULL;
-	s->len = len;
-	s->node = isl_alloc_array(ctx, struct basic_map_sort_node, len);
-	if (!s->node)
-		goto error;
-	for (i = 0; i < len; ++i)
-		s->node[i].index = -1;
-	s->stack = isl_alloc_array(ctx, int, len);
-	if (!s->stack)
-		goto error;
-	s->order = isl_alloc_array(ctx, int, 2 * len);
-	if (!s->order)
-		goto error;
-
-	s->sp = 0;
-	s->index = 0;
-	s->op = 0;
-
-	s->check_closed = 0;
-
-	return s;
-error:
-	basic_map_sort_free(s);
-	return NULL;
-}
-
-/* Check whether in the computation of the transitive closure
- * "bmap1" (R_1) should follow (or be part of the same component as)
- * "bmap2" (R_2).
- *
- * That is check whether
- *
- *	R_1 \circ R_2
- *
- * is a subset of
- *
- *	R_2 \circ R_1
- *
- * If so, then there is no reason for R_1 to immediately follow R_2
- * in any path.
- *
- * *check_closed is set if the subset relation holds while
- * R_1 \circ R_2 is not empty.
- */
-static int basic_map_follows(__isl_keep isl_basic_map *bmap1,
-	__isl_keep isl_basic_map *bmap2, int *check_closed)
-{
-	struct isl_map *map12 = NULL;
-	struct isl_map *map21 = NULL;
-	int subset;
-
-	if (!isl_dim_tuple_match(bmap1->dim, isl_dim_in, bmap2->dim, isl_dim_out))
-		return 0;
-
-	map21 = isl_map_from_basic_map(
-			isl_basic_map_apply_range(
-				isl_basic_map_copy(bmap2),
-				isl_basic_map_copy(bmap1)));
-	subset = isl_map_is_empty(map21);
-	if (subset < 0)
-		goto error;
-	if (subset) {
-		isl_map_free(map21);
-		return 0;
-	}
-
-	if (!isl_dim_tuple_match(bmap1->dim, isl_dim_in, bmap1->dim, isl_dim_out) ||
-	    !isl_dim_tuple_match(bmap2->dim, isl_dim_in, bmap2->dim, isl_dim_out)) {
-		isl_map_free(map21);
-		return 1;
-	}
-
-	map12 = isl_map_from_basic_map(
-			isl_basic_map_apply_range(
-				isl_basic_map_copy(bmap1),
-				isl_basic_map_copy(bmap2)));
-
-	subset = isl_map_is_subset(map21, map12);
-
-	isl_map_free(map12);
-	isl_map_free(map21);
-
-	if (subset)
-		*check_closed = 1;
-
-	return subset < 0 ? -1 : !subset;
-error:
-	isl_map_free(map21);
-	return -1;
-}
-
-/* Perform Tarjan's algorithm for computing the strongly connected components
- * in the graph with the disjuncts of "map" as vertices and with an
- * edge between any pair of disjuncts such that the first has
- * to be applied after the second.
- */
-static int power_components_tarjan(struct basic_map_sort *s,
-	__isl_keep isl_basic_map **list, int i)
-{
-	int j;
-
-	s->node[i].index = s->index;
-	s->node[i].min_index = s->index;
-	s->node[i].on_stack = 1;
-	s->index++;
-	s->stack[s->sp++] = i;
-
-	for (j = s->len - 1; j >= 0; --j) {
-		int f;
-
-		if (j == i)
-			continue;
-		if (s->node[j].index >= 0 &&
-			(!s->node[j].on_stack ||
-			 s->node[j].index > s->node[i].min_index))
-			continue;
-
-		f = basic_map_follows(list[i], list[j], &s->check_closed);
-		if (f < 0)
-			return -1;
-		if (!f)
-			continue;
-
-		if (s->node[j].index < 0) {
-			power_components_tarjan(s, list, j);
-			if (s->node[j].min_index < s->node[i].min_index)
-				s->node[i].min_index = s->node[j].min_index;
-		} else if (s->node[j].index < s->node[i].min_index)
-			s->node[i].min_index = s->node[j].index;
-	}
-
-	if (s->node[i].index != s->node[i].min_index)
-		return 0;
-
-	do {
-		j = s->stack[--s->sp];
-		s->node[j].on_stack = 0;
-		s->order[s->op++] = j;
-	} while (j != i);
-	s->order[s->op++] = -1;
-
-	return 0;
-}
-
-/* Decompose the "len" basic relations in "list" into strongly connected
- * components.
- */
-static struct basic_map_sort *basic_map_sort_init(isl_ctx *ctx, int len,
-	__isl_keep isl_basic_map **list)
-{
-	int i;
-	struct basic_map_sort *s = NULL;
-
-	s = basic_map_sort_alloc(ctx, len);
-	if (!s)
-		return NULL;
-	for (i = len - 1; i >= 0; --i) {
-		if (s->node[i].index >= 0)
-			continue;
-		if (power_components_tarjan(s, list, i) < 0)
-			goto error;
-	}
-
-	return s;
-error:
-	basic_map_sort_free(s);
-	return NULL;
-}
-
-/* Given a union of basic maps R = \cup_i R_i \subseteq D \times D
- * and a dimension specification (Z^{n+1} -> Z^{n+1}),
- * construct a map that is an overapproximation of the map
- * that takes an element from the dom R \times Z to an
- * element from ran R \times Z, such that the first n coordinates of the
- * difference between them is a sum of differences between images
- * and pre-images in one of the R_i and such that the last coordinate
- * is equal to the number of steps taken.
- * If "project" is set, then these final coordinates are not included,
- * i.e., a relation of type Z^n -> Z^n is returned.
- * That is, let
- *
- *	\Delta_i = { y - x | (x, y) in R_i }
- *
- * then the constructed map is an overapproximation of
- *
- *	{ (x) -> (x + d) | \exists k_i >= 0, \delta_i \in \Delta_i :
- *				d = (\sum_i k_i \delta_i, \sum_i k_i) and
- *				x in dom R and x + d in ran R }
- *
- * or
- *
- *	{ (x) -> (x + d) | \exists k_i >= 0, \delta_i \in \Delta_i :
- *				d = (\sum_i k_i \delta_i) and
- *				x in dom R and x + d in ran R }
- *
- * if "project" is set.
- *
- * We first split the map into strongly connected components, perform
- * the above on each component and then join the results in the correct
- * order, at each join also taking in the union of both arguments
- * to allow for paths that do not go through one of the two arguments.
- */
-static __isl_give isl_map *construct_power_components(__isl_take isl_dim *dim,
-	__isl_keep isl_map *map, int *exact, int project)
-{
-	int i, n, c;
-	struct isl_map *path = NULL;
-	struct basic_map_sort *s = NULL;
-	int *orig_exact;
-	int local_exact;
-
-	if (!map)
-		goto error;
-	if (map->n <= 1)
-		return floyd_warshall(dim, map, exact, project);
-
-	s = basic_map_sort_init(map->ctx, map->n, map->p);
-	if (!s)
-		goto error;
-
-	orig_exact = exact;
-	if (s->check_closed && !exact)
-		exact = &local_exact;
-
-	c = 0;
-	i = 0;
-	n = map->n;
-	if (project)
-		path = isl_map_empty(isl_map_get_dim(map));
-	else
-		path = isl_map_empty(isl_dim_copy(dim));
-	path = anonymize(path);
-	while (n) {
-		struct isl_map *comp;
-		isl_map *path_comp, *path_comb;
-		comp = isl_map_alloc_dim(isl_map_get_dim(map), n, 0);
-		while (s->order[i] != -1) {
-			comp = isl_map_add_basic_map(comp,
-				    isl_basic_map_copy(map->p[s->order[i]]));
-			--n;
-			++i;
-		}
-		path_comp = floyd_warshall(isl_dim_copy(dim),
-						comp, exact, project);
-		path_comp = anonymize(path_comp);
-		path_comb = isl_map_apply_range(isl_map_copy(path),
-						isl_map_copy(path_comp));
-		path = isl_map_union(path, path_comp);
-		path = isl_map_union(path, path_comb);
-		isl_map_free(comp);
-		++i;
-		++c;
-	}
-
-	if (c > 1 && s->check_closed && !*exact) {
-		int closed;
-
-		closed = isl_map_is_transitively_closed(path);
-		if (closed < 0)
-			goto error;
-		if (!closed) {
-			basic_map_sort_free(s);
-			isl_map_free(path);
-			return floyd_warshall(dim, map, orig_exact, project);
-		}
-	}
-
-	basic_map_sort_free(s);
-	isl_dim_free(dim);
-
-	return path;
-error:
-	basic_map_sort_free(s);
-	isl_dim_free(dim);
-	isl_map_free(path);
-	return NULL;
-}
-
-/* Given a union of basic maps R = \cup_i R_i \subseteq D \times D,
- * construct a map that is an overapproximation of the map
- * that takes an element from the space D to another
- * element from the same space, such that the difference between
- * them is a strictly positive sum of differences between images
- * and pre-images in one of the R_i.
- * The number of differences in the sum is equated to parameter "param".
- * That is, let
- *
- *	\Delta_i = { y - x | (x, y) in R_i }
- *
- * then the constructed map is an overapproximation of
- *
- *	{ (x) -> (x + d) | \exists k_i >= 0, \delta_i \in \Delta_i :
- *				d = \sum_i k_i \delta_i and k = \sum_i k_i > 0 }
- * or
- *
- *	{ (x) -> (x + d) | \exists k_i >= 0, \delta_i \in \Delta_i :
- *				d = \sum_i k_i \delta_i and \sum_i k_i > 0 }
- *
- * if "project" is set.
- *
- * If "project" is not set, then
- * we construct an extended mapping with an extra coordinate
- * that indicates the number of steps taken.  In particular,
- * the difference in the last coordinate is equal to the number
- * of steps taken to move from a domain element to the corresponding
- * image element(s).
- */
-static __isl_give isl_map *construct_power(__isl_keep isl_map *map,
-	int *exact, int project)
-{
-	struct isl_map *app = NULL;
-	struct isl_dim *dim = NULL;
-	unsigned d;
-
-	if (!map)
-		return NULL;
-
-	dim = isl_map_get_dim(map);
-
-	d = isl_dim_size(dim, isl_dim_in);
-	dim = isl_dim_add(dim, isl_dim_in, 1);
-	dim = isl_dim_add(dim, isl_dim_out, 1);
-
-	app = construct_power_components(isl_dim_copy(dim), map,
-					exact, project);
-
-	isl_dim_free(dim);
-
-	return app;
-}
-
-/* Compute the positive powers of "map", or an overapproximation.
- * If the result is exact, then *exact is set to 1.
- *
- * If project is set, then we are actually interested in the transitive
- * closure, so we can use a more relaxed exactness check.
- * The lengths of the paths are also projected out instead of being
- * encoded as the difference between an extra pair of final coordinates.
- */
-static __isl_give isl_map *map_power(__isl_take isl_map *map,
-	int *exact, int project)
-{
-	struct isl_map *app = NULL;
-
-	if (exact)
-		*exact = 1;
-
-	if (!map)
-		return NULL;
-
-	isl_assert(map->ctx,
-		isl_map_dim(map, isl_dim_in) == isl_map_dim(map, isl_dim_out),
-		goto error);
-
-	app = construct_power(map, exact, project);
-
-	isl_map_free(map);
-	return app;
-error:
-	isl_map_free(map);
-	isl_map_free(app);
-	return NULL;
-}
-
-/* Compute the positive powers of "map", or an overapproximation.
- * The result maps the exponent to a nested copy of the corresponding power.
- * If the result is exact, then *exact is set to 1.
- * map_power constructs an extended relation with the path lengths
- * encoded as the difference between the final coordinates.
- * In the final step, this difference is equated to an extra parameter
- * and made positive.  The extra coordinates are subsequently projected out
- * and the parameter is turned into the domain of the result.
- */
-__isl_give isl_map *isl_map_power(__isl_take isl_map *map, int *exact)
-{
-	isl_dim *target_dim;
-	isl_dim *dim;
-	isl_map *diff;
-	unsigned d;
-	unsigned param;
-
-	if (!map)
-		return NULL;
-
-	d = isl_map_dim(map, isl_dim_in);
-	param = isl_map_dim(map, isl_dim_param);
-
-	map = isl_map_compute_divs(map);
-	map = isl_map_coalesce(map);
-
-	if (isl_map_plain_is_empty(map)) {
-		map = isl_map_from_range(isl_map_wrap(map));
-		map = isl_map_add_dims(map, isl_dim_in, 1);
-		map = isl_map_set_dim_name(map, isl_dim_in, 0, "k");
-		return map;
-	}
-
-	target_dim = isl_map_get_dim(map);
-	target_dim = isl_dim_from_range(isl_dim_wrap(target_dim));
-	target_dim = isl_dim_add(target_dim, isl_dim_in, 1);
-	target_dim = isl_dim_set_name(target_dim, isl_dim_in, 0, "k");
-
-	map = map_power(map, exact, 0);
-
-	map = isl_map_add_dims(map, isl_dim_param, 1);
-	dim = isl_map_get_dim(map);
-	diff = equate_parameter_to_length(dim, param);
-	map = isl_map_intersect(map, diff);
-	map = isl_map_project_out(map, isl_dim_in, d, 1);
-	map = isl_map_project_out(map, isl_dim_out, d, 1);
-	map = isl_map_from_range(isl_map_wrap(map));
-	map = isl_map_move_dims(map, isl_dim_in, 0, isl_dim_param, param, 1);
-
-	map = isl_map_reset_dim(map, target_dim);
-
-	return map;
-}
-
-/* Compute a relation that maps each element in the range of the input
- * relation to the lengths of all paths composed of edges in the input
- * relation that end up in the given range element.
- * The result may be an overapproximation, in which case *exact is set to 0.
- * The resulting relation is very similar to the power relation.
- * The difference are that the domain has been projected out, the
- * range has become the domain and the exponent is the range instead
- * of a parameter.
- */
-__isl_give isl_map *isl_map_reaching_path_lengths(__isl_take isl_map *map,
-	int *exact)
-{
-	isl_dim *dim;
-	isl_map *diff;
-	unsigned d;
-	unsigned param;
-
-	if (!map)
-		return NULL;
-
-	d = isl_map_dim(map, isl_dim_in);
-	param = isl_map_dim(map, isl_dim_param);
-
-	map = isl_map_compute_divs(map);
-	map = isl_map_coalesce(map);
-
-	if (isl_map_plain_is_empty(map)) {
-		if (exact)
-			*exact = 1;
-		map = isl_map_project_out(map, isl_dim_out, 0, d);
-		map = isl_map_add_dims(map, isl_dim_out, 1);
-		return map;
-	}
-
-	map = map_power(map, exact, 0);
-
-	map = isl_map_add_dims(map, isl_dim_param, 1);
-	dim = isl_map_get_dim(map);
-	diff = equate_parameter_to_length(dim, param);
-	map = isl_map_intersect(map, diff);
-	map = isl_map_project_out(map, isl_dim_in, 0, d + 1);
-	map = isl_map_project_out(map, isl_dim_out, d, 1);
-	map = isl_map_reverse(map);
-	map = isl_map_move_dims(map, isl_dim_out, 0, isl_dim_param, param, 1);
-
-	return map;
-}
-
-/* Check whether equality i of bset is a pure stride constraint
- * on a single dimensions, i.e., of the form
- *
- *	v = k e
- *
- * with k a constant and e an existentially quantified variable.
- */
-static int is_eq_stride(__isl_keep isl_basic_set *bset, int i)
-{
-	unsigned nparam;
-	unsigned d;
-	unsigned n_div;
-	int pos1;
-	int pos2;
-
-	if (!bset)
-		return -1;
-
-	if (!isl_int_is_zero(bset->eq[i][0]))
-		return 0;
-
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-	d = isl_basic_set_dim(bset, isl_dim_set);
-	n_div = isl_basic_set_dim(bset, isl_dim_div);
-
-	if (isl_seq_first_non_zero(bset->eq[i] + 1, nparam) != -1)
-		return 0;
-	pos1 = isl_seq_first_non_zero(bset->eq[i] + 1 + nparam, d);
-	if (pos1 == -1)
-		return 0;
-	if (isl_seq_first_non_zero(bset->eq[i] + 1 + nparam + pos1 + 1, 
-					d - pos1 - 1) != -1)
-		return 0;
-
-	pos2 = isl_seq_first_non_zero(bset->eq[i] + 1 + nparam + d, n_div);
-	if (pos2 == -1)
-		return 0;
-	if (isl_seq_first_non_zero(bset->eq[i] + 1 + nparam + d  + pos2 + 1,
-				   n_div - pos2 - 1) != -1)
-		return 0;
-	if (!isl_int_is_one(bset->eq[i][1 + nparam + pos1]) &&
-	    !isl_int_is_negone(bset->eq[i][1 + nparam + pos1]))
-		return 0;
-
-	return 1;
-}
-
-/* Given a map, compute the smallest superset of this map that is of the form
- *
- *	{ i -> j : L <= j - i <= U and exists a_p: j_p - i_p = M_p a_p }
- *
- * (where p ranges over the (non-parametric) dimensions),
- * compute the transitive closure of this map, i.e.,
- *
- *	{ i -> j : exists k > 0:
- *		k L <= j - i <= k U and exists a: j_p - i_p = M_p a_p }
- *
- * and intersect domain and range of this transitive closure with
- * the given domain and range.
- *
- * If with_id is set, then try to include as much of the identity mapping
- * as possible, by computing
- *
- *	{ i -> j : exists k >= 0:
- *		k L <= j - i <= k U and exists a: j_p - i_p = M_p a_p }
- *
- * instead (i.e., allow k = 0).
- *
- * In practice, we compute the difference set
- *
- *	delta  = { j - i | i -> j in map },
- *
- * look for stride constraint on the individual dimensions and compute
- * (constant) lower and upper bounds for each individual dimension,
- * adding a constraint for each bound not equal to infinity.
- */
-static __isl_give isl_map *box_closure_on_domain(__isl_take isl_map *map,
-	__isl_take isl_set *dom, __isl_take isl_set *ran, int with_id)
-{
-	int i;
-	int k;
-	unsigned d;
-	unsigned nparam;
-	unsigned total;
-	isl_dim *dim;
-	isl_set *delta;
-	isl_map *app = NULL;
-	isl_basic_set *aff = NULL;
-	isl_basic_map *bmap = NULL;
-	isl_vec *obj = NULL;
-	isl_int opt;
-
-	isl_int_init(opt);
-
-	delta = isl_map_deltas(isl_map_copy(map));
-
-	aff = isl_set_affine_hull(isl_set_copy(delta));
-	if (!aff)
-		goto error;
-	dim = isl_map_get_dim(map);
-	d = isl_dim_size(dim, isl_dim_in);
-	nparam = isl_dim_size(dim, isl_dim_param);
-	total = isl_dim_total(dim);
-	bmap = isl_basic_map_alloc_dim(dim,
-					aff->n_div + 1, aff->n_div, 2 * d + 1);
-	for (i = 0; i < aff->n_div + 1; ++i) {
-		k = isl_basic_map_alloc_div(bmap);
-		if (k < 0)
-			goto error;
-		isl_int_set_si(bmap->div[k][0], 0);
-	}
-	for (i = 0; i < aff->n_eq; ++i) {
-		if (!is_eq_stride(aff, i))
-			continue;
-		k = isl_basic_map_alloc_equality(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(bmap->eq[k], 1 + nparam);
-		isl_seq_cpy(bmap->eq[k] + 1 + nparam + d,
-				aff->eq[i] + 1 + nparam, d);
-		isl_seq_neg(bmap->eq[k] + 1 + nparam,
-				aff->eq[i] + 1 + nparam, d);
-		isl_seq_cpy(bmap->eq[k] + 1 + nparam + 2 * d,
-				aff->eq[i] + 1 + nparam + d, aff->n_div);
-		isl_int_set_si(bmap->eq[k][1 + total + aff->n_div], 0);
-	}
-	obj = isl_vec_alloc(map->ctx, 1 + nparam + d);
-	if (!obj)
-		goto error;
-	isl_seq_clr(obj->el, 1 + nparam + d);
-	for (i = 0; i < d; ++ i) {
-		enum isl_lp_result res;
-
-		isl_int_set_si(obj->el[1 + nparam + i], 1);
-
-		res = isl_set_solve_lp(delta, 0, obj->el, map->ctx->one, &opt,
-					NULL, NULL);
-		if (res == isl_lp_error)
-			goto error;
-		if (res == isl_lp_ok) {
-			k = isl_basic_map_alloc_inequality(bmap);
-			if (k < 0)
-				goto error;
-			isl_seq_clr(bmap->ineq[k],
-					1 + nparam + 2 * d + bmap->n_div);
-			isl_int_set_si(bmap->ineq[k][1 + nparam + i], -1);
-			isl_int_set_si(bmap->ineq[k][1 + nparam + d + i], 1);
-			isl_int_neg(bmap->ineq[k][1 + nparam + 2 * d + aff->n_div], opt);
-		}
-
-		res = isl_set_solve_lp(delta, 1, obj->el, map->ctx->one, &opt,
-					NULL, NULL);
-		if (res == isl_lp_error)
-			goto error;
-		if (res == isl_lp_ok) {
-			k = isl_basic_map_alloc_inequality(bmap);
-			if (k < 0)
-				goto error;
-			isl_seq_clr(bmap->ineq[k],
-					1 + nparam + 2 * d + bmap->n_div);
-			isl_int_set_si(bmap->ineq[k][1 + nparam + i], 1);
-			isl_int_set_si(bmap->ineq[k][1 + nparam + d + i], -1);
-			isl_int_set(bmap->ineq[k][1 + nparam + 2 * d + aff->n_div], opt);
-		}
-
-		isl_int_set_si(obj->el[1 + nparam + i], 0);
-	}
-	k = isl_basic_map_alloc_inequality(bmap);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(bmap->ineq[k],
-			1 + nparam + 2 * d + bmap->n_div);
-	if (!with_id)
-		isl_int_set_si(bmap->ineq[k][0], -1);
-	isl_int_set_si(bmap->ineq[k][1 + nparam + 2 * d + aff->n_div], 1);
-
-	app = isl_map_from_domain_and_range(dom, ran);
-
-	isl_vec_free(obj);
-	isl_basic_set_free(aff);
-	isl_map_free(map);
-	bmap = isl_basic_map_finalize(bmap);
-	isl_set_free(delta);
-	isl_int_clear(opt);
-
-	map = isl_map_from_basic_map(bmap);
-	map = isl_map_intersect(map, app);
-
-	return map;
-error:
-	isl_vec_free(obj);
-	isl_basic_map_free(bmap);
-	isl_basic_set_free(aff);
-	isl_set_free(dom);
-	isl_set_free(ran);
-	isl_map_free(map);
-	isl_set_free(delta);
-	isl_int_clear(opt);
-	return NULL;
-}
-
-/* Given a map, compute the smallest superset of this map that is of the form
- *
- *	{ i -> j : L <= j - i <= U and exists a_p: j_p - i_p = M_p a_p }
- *
- * (where p ranges over the (non-parametric) dimensions),
- * compute the transitive closure of this map, i.e.,
- *
- *	{ i -> j : exists k > 0:
- *		k L <= j - i <= k U and exists a: j_p - i_p = M_p a_p }
- *
- * and intersect domain and range of this transitive closure with
- * domain and range of the original map.
- */
-static __isl_give isl_map *box_closure(__isl_take isl_map *map)
-{
-	isl_set *domain;
-	isl_set *range;
-
-	domain = isl_map_domain(isl_map_copy(map));
-	domain = isl_set_coalesce(domain);
-	range = isl_map_range(isl_map_copy(map));
-	range = isl_set_coalesce(range);
-
-	return box_closure_on_domain(map, domain, range, 0);
-}
-
-/* Given a map, compute the smallest superset of this map that is of the form
- *
- *	{ i -> j : L <= j - i <= U and exists a_p: j_p - i_p = M_p a_p }
- *
- * (where p ranges over the (non-parametric) dimensions),
- * compute the transitive and partially reflexive closure of this map, i.e.,
- *
- *	{ i -> j : exists k >= 0:
- *		k L <= j - i <= k U and exists a: j_p - i_p = M_p a_p }
- *
- * and intersect domain and range of this transitive closure with
- * the given domain.
- */
-static __isl_give isl_map *box_closure_with_identity(__isl_take isl_map *map,
-	__isl_take isl_set *dom)
-{
-	return box_closure_on_domain(map, dom, isl_set_copy(dom), 1);
-}
-
-/* Check whether app is the transitive closure of map.
- * In particular, check that app is acyclic and, if so,
- * check that
- *
- *	app \subset (map \cup (map \circ app))
- */
-static int check_exactness_omega(__isl_keep isl_map *map,
-	__isl_keep isl_map *app)
-{
-	isl_set *delta;
-	int i;
-	int is_empty, is_exact;
-	unsigned d;
-	isl_map *test;
-
-	delta = isl_map_deltas(isl_map_copy(app));
-	d = isl_set_dim(delta, isl_dim_set);
-	for (i = 0; i < d; ++i)
-		delta = isl_set_fix_si(delta, isl_dim_set, i, 0);
-	is_empty = isl_set_is_empty(delta);
-	isl_set_free(delta);
-	if (is_empty < 0)
-		return -1;
-	if (!is_empty)
-		return 0;
-
-	test = isl_map_apply_range(isl_map_copy(app), isl_map_copy(map));
-	test = isl_map_union(test, isl_map_copy(map));
-	is_exact = isl_map_is_subset(app, test);
-	isl_map_free(test);
-
-	return is_exact;
-}
-
-/* Check if basic map M_i can be combined with all the other
- * basic maps such that
- *
- *	(\cup_j M_j)^+
- *
- * can be computed as
- *
- *	M_i \cup (\cup_{j \ne i} M_i^* \circ M_j \circ M_i^*)^+
- *
- * In particular, check if we can compute a compact representation
- * of
- *
- *		M_i^* \circ M_j \circ M_i^*
- *
- * for each j != i.
- * Let M_i^? be an extension of M_i^+ that allows paths
- * of length zero, i.e., the result of box_closure(., 1).
- * The criterion, as proposed by Kelly et al., is that
- * id = M_i^? - M_i^+ can be represented as a basic map
- * and that
- *
- *	id \circ M_j \circ id = M_j
- *
- * for each j != i.
- *
- * If this function returns 1, then tc and qc are set to
- * M_i^+ and M_i^?, respectively.
- */
-static int can_be_split_off(__isl_keep isl_map *map, int i,
-	__isl_give isl_map **tc, __isl_give isl_map **qc)
-{
-	isl_map *map_i, *id = NULL;
-	int j = -1;
-	isl_set *C;
-
-	*tc = NULL;
-	*qc = NULL;
-
-	C = isl_set_union(isl_map_domain(isl_map_copy(map)),
-			  isl_map_range(isl_map_copy(map)));
-	C = isl_set_from_basic_set(isl_set_simple_hull(C));
-	if (!C)
-		goto error;
-
-	map_i = isl_map_from_basic_map(isl_basic_map_copy(map->p[i]));
-	*tc = box_closure(isl_map_copy(map_i));
-	*qc = box_closure_with_identity(map_i, C);
-	id = isl_map_subtract(isl_map_copy(*qc), isl_map_copy(*tc));
-
-	if (!id || !*qc)
-		goto error;
-	if (id->n != 1 || (*qc)->n != 1)
-		goto done;
-
-	for (j = 0; j < map->n; ++j) {
-		isl_map *map_j, *test;
-		int is_ok;
-
-		if (i == j)
-			continue;
-		map_j = isl_map_from_basic_map(
-					isl_basic_map_copy(map->p[j]));
-		test = isl_map_apply_range(isl_map_copy(id),
-						isl_map_copy(map_j));
-		test = isl_map_apply_range(test, isl_map_copy(id));
-		is_ok = isl_map_is_equal(test, map_j);
-		isl_map_free(map_j);
-		isl_map_free(test);
-		if (is_ok < 0)
-			goto error;
-		if (!is_ok)
-			break;
-	}
-
-done:
-	isl_map_free(id);
-	if (j == map->n)
-		return 1;
-
-	isl_map_free(*qc);
-	isl_map_free(*tc);
-	*qc = NULL;
-	*tc = NULL;
-
-	return 0;
-error:
-	isl_map_free(id);
-	isl_map_free(*qc);
-	isl_map_free(*tc);
-	*qc = NULL;
-	*tc = NULL;
-	return -1;
-}
-
-static __isl_give isl_map *box_closure_with_check(__isl_take isl_map *map,
-	int *exact)
-{
-	isl_map *app;
-
-	app = box_closure(isl_map_copy(map));
-	if (exact)
-		*exact = check_exactness_omega(map, app);
-
-	isl_map_free(map);
-	return app;
-}
-
-/* Compute an overapproximation of the transitive closure of "map"
- * using a variation of the algorithm from
- * "Transitive Closure of Infinite Graphs and its Applications"
- * by Kelly et al.
- *
- * We first check whether we can can split of any basic map M_i and
- * compute
- *
- *	(\cup_j M_j)^+
- *
- * as
- *
- *	M_i \cup (\cup_{j \ne i} M_i^* \circ M_j \circ M_i^*)^+
- *
- * using a recursive call on the remaining map.
- *
- * If not, we simply call box_closure on the whole map.
- */
-static __isl_give isl_map *transitive_closure_omega(__isl_take isl_map *map,
-	int *exact)
-{
-	int i, j;
-	int exact_i;
-	isl_map *app;
-
-	if (!map)
-		return NULL;
-	if (map->n == 1)
-		return box_closure_with_check(map, exact);
-
-	for (i = 0; i < map->n; ++i) {
-		int ok;
-		isl_map *qc, *tc;
-		ok = can_be_split_off(map, i, &tc, &qc);
-		if (ok < 0)
-			goto error;
-		if (!ok)
-			continue;
-
-		app = isl_map_alloc_dim(isl_map_get_dim(map), map->n - 1, 0);
-
-		for (j = 0; j < map->n; ++j) {
-			if (j == i)
-				continue;
-			app = isl_map_add_basic_map(app,
-						isl_basic_map_copy(map->p[j]));
-		}
-
-		app = isl_map_apply_range(isl_map_copy(qc), app);
-		app = isl_map_apply_range(app, qc);
-
-		app = isl_map_union(tc, transitive_closure_omega(app, NULL));
-		exact_i = check_exactness_omega(map, app);
-		if (exact_i == 1) {
-			if (exact)
-				*exact = exact_i;
-			isl_map_free(map);
-			return app;
-		}
-		isl_map_free(app);
-		if (exact_i < 0)
-			goto error;
-	}
-
-	return box_closure_with_check(map, exact);
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Compute the transitive closure  of "map", or an overapproximation.
- * If the result is exact, then *exact is set to 1.
- * Simply use map_power to compute the powers of map, but tell
- * it to project out the lengths of the paths instead of equating
- * the length to a parameter.
- */
-__isl_give isl_map *isl_map_transitive_closure(__isl_take isl_map *map,
-	int *exact)
-{
-	isl_dim *target_dim;
-	int closed;
-
-	if (!map)
-		goto error;
-
-	if (map->ctx->opt->closure == ISL_CLOSURE_BOX)
-		return transitive_closure_omega(map, exact);
-
-	map = isl_map_compute_divs(map);
-	map = isl_map_coalesce(map);
-	closed = isl_map_is_transitively_closed(map);
-	if (closed < 0)
-		goto error;
-	if (closed) {
-		if (exact)
-			*exact = 1;
-		return map;
-	}
-
-	target_dim = isl_map_get_dim(map);
-	map = map_power(map, exact, 1);
-	map = isl_map_reset_dim(map, target_dim);
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-static int inc_count(__isl_take isl_map *map, void *user)
-{
-	int *n = user;
-
-	*n += map->n;
-
-	isl_map_free(map);
-
-	return 0;
-}
-
-static int collect_basic_map(__isl_take isl_map *map, void *user)
-{
-	int i;
-	isl_basic_map ***next = user;
-
-	for (i = 0; i < map->n; ++i) {
-		**next = isl_basic_map_copy(map->p[i]);
-		if (!**next)
-			goto error;
-		(*next)++;
-	}
-
-	isl_map_free(map);
-	return 0;
-error:
-	isl_map_free(map);
-	return -1;
-}
-
-/* Perform Floyd-Warshall on the given list of basic relations.
- * The basic relations may live in different dimensions,
- * but basic relations that get assigned to the diagonal of the
- * grid have domains and ranges of the same dimension and so
- * the standard algorithm can be used because the nested transitive
- * closures are only applied to diagonal elements and because all
- * compositions are peformed on relations with compatible domains and ranges.
- */
-static __isl_give isl_union_map *union_floyd_warshall_on_list(isl_ctx *ctx,
-	__isl_keep isl_basic_map **list, int n, int *exact)
-{
-	int i, j, k;
-	int n_group;
-	int *group = NULL;
-	isl_set **set = NULL;
-	isl_map ***grid = NULL;
-	isl_union_map *app;
-
-	group = setup_groups(ctx, list, n, &set, &n_group);
-	if (!group)
-		goto error;
-
-	grid = isl_calloc_array(ctx, isl_map **, n_group);
-	if (!grid)
-		goto error;
-	for (i = 0; i < n_group; ++i) {
-		grid[i] = isl_calloc_array(ctx, isl_map *, n_group);
-		if (!grid[i])
-			goto error;
-		for (j = 0; j < n_group; ++j) {
-			isl_dim *dim1, *dim2, *dim;
-			dim1 = isl_dim_reverse(isl_set_get_dim(set[i]));
-			dim2 = isl_set_get_dim(set[j]);
-			dim = isl_dim_join(dim1, dim2);
-			grid[i][j] = isl_map_empty(dim);
-		}
-	}
-
-	for (k = 0; k < n; ++k) {
-		i = group[2 * k];
-		j = group[2 * k + 1];
-		grid[i][j] = isl_map_union(grid[i][j],
-				isl_map_from_basic_map(
-					isl_basic_map_copy(list[k])));
-	}
-	
-	floyd_warshall_iterate(grid, n_group, exact);
-
-	app = isl_union_map_empty(isl_map_get_dim(grid[0][0]));
-
-	for (i = 0; i < n_group; ++i) {
-		for (j = 0; j < n_group; ++j)
-			app = isl_union_map_add_map(app, grid[i][j]);
-		free(grid[i]);
-	}
-	free(grid);
-
-	for (i = 0; i < 2 * n; ++i)
-		isl_set_free(set[i]);
-	free(set);
-
-	free(group);
-	return app;
-error:
-	if (grid)
-		for (i = 0; i < n_group; ++i) {
-			if (!grid[i])
-				continue;
-			for (j = 0; j < n_group; ++j)
-				isl_map_free(grid[i][j]);
-			free(grid[i]);
-		}
-	free(grid);
-	if (set) {
-		for (i = 0; i < 2 * n; ++i)
-			isl_set_free(set[i]);
-		free(set);
-	}
-	free(group);
-	return NULL;
-}
-
-/* Perform Floyd-Warshall on the given union relation.
- * The implementation is very similar to that for non-unions.
- * The main difference is that it is applied unconditionally.
- * We first extract a list of basic maps from the union map
- * and then perform the algorithm on this list.
- */
-static __isl_give isl_union_map *union_floyd_warshall(
-	__isl_take isl_union_map *umap, int *exact)
-{
-	int i, n;
-	isl_ctx *ctx;
-	isl_basic_map **list = NULL;
-	isl_basic_map **next;
-	isl_union_map *res;
-
-	n = 0;
-	if (isl_union_map_foreach_map(umap, inc_count, &n) < 0)
-		goto error;
-
-	ctx = isl_union_map_get_ctx(umap);
-	list = isl_calloc_array(ctx, isl_basic_map *, n);
-	if (!list)
-		goto error;
-
-	next = list;
-	if (isl_union_map_foreach_map(umap, collect_basic_map, &next) < 0)
-		goto error;
-
-	res = union_floyd_warshall_on_list(ctx, list, n, exact);
-
-	if (list) {
-		for (i = 0; i < n; ++i)
-			isl_basic_map_free(list[i]);
-		free(list);
-	}
-
-	isl_union_map_free(umap);
-	return res;
-error:
-	if (list) {
-		for (i = 0; i < n; ++i)
-			isl_basic_map_free(list[i]);
-		free(list);
-	}
-	isl_union_map_free(umap);
-	return NULL;
-}
-
-/* Decompose the give union relation into strongly connected components.
- * The implementation is essentially the same as that of
- * construct_power_components with the major difference that all
- * operations are performed on union maps.
- */
-static __isl_give isl_union_map *union_components(
-	__isl_take isl_union_map *umap, int *exact)
-{
-	int i;
-	int n;
-	isl_ctx *ctx;
-	isl_basic_map **list;
-	isl_basic_map **next;
-	isl_union_map *path = NULL;
-	struct basic_map_sort *s = NULL;
-	int c, l;
-	int recheck = 0;
-
-	n = 0;
-	if (isl_union_map_foreach_map(umap, inc_count, &n) < 0)
-		goto error;
-
-	if (n <= 1)
-		return union_floyd_warshall(umap, exact);
-
-	ctx = isl_union_map_get_ctx(umap);
-	list = isl_calloc_array(ctx, isl_basic_map *, n);
-	if (!list)
-		goto error;
-
-	next = list;
-	if (isl_union_map_foreach_map(umap, collect_basic_map, &next) < 0)
-		goto error;
-
-	s = basic_map_sort_init(ctx, n, list);
-	if (!s)
-		goto error;
-
-	c = 0;
-	i = 0;
-	l = n;
-	path = isl_union_map_empty(isl_union_map_get_dim(umap));
-	while (l) {
-		isl_union_map *comp;
-		isl_union_map *path_comp, *path_comb;
-		comp = isl_union_map_empty(isl_union_map_get_dim(umap));
-		while (s->order[i] != -1) {
-			comp = isl_union_map_add_map(comp,
-				    isl_map_from_basic_map(
-					isl_basic_map_copy(list[s->order[i]])));
-			--l;
-			++i;
-		}
-		path_comp = union_floyd_warshall(comp, exact);
-		path_comb = isl_union_map_apply_range(isl_union_map_copy(path),
-						isl_union_map_copy(path_comp));
-		path = isl_union_map_union(path, path_comp);
-		path = isl_union_map_union(path, path_comb);
-		++i;
-		++c;
-	}
-
-	if (c > 1 && s->check_closed && !*exact) {
-		int closed;
-
-		closed = isl_union_map_is_transitively_closed(path);
-		if (closed < 0)
-			goto error;
-		recheck = !closed;
-	}
-
-	basic_map_sort_free(s);
-
-	for (i = 0; i < n; ++i)
-		isl_basic_map_free(list[i]);
-	free(list);
-
-	if (recheck) {
-		isl_union_map_free(path);
-		return union_floyd_warshall(umap, exact);
-	}
-
-	isl_union_map_free(umap);
-
-	return path;
-error:
-	basic_map_sort_free(s);
-	if (list) {
-		for (i = 0; i < n; ++i)
-			isl_basic_map_free(list[i]);
-		free(list);
-	}
-	isl_union_map_free(umap);
-	isl_union_map_free(path);
-	return NULL;
-}
-
-/* Compute the transitive closure  of "umap", or an overapproximation.
- * If the result is exact, then *exact is set to 1.
- */
-__isl_give isl_union_map *isl_union_map_transitive_closure(
-	__isl_take isl_union_map *umap, int *exact)
-{
-	int closed;
-
-	if (!umap)
-		return NULL;
-
-	if (exact)
-		*exact = 1;
-
-	umap = isl_union_map_compute_divs(umap);
-	umap = isl_union_map_coalesce(umap);
-	closed = isl_union_map_is_transitively_closed(umap);
-	if (closed < 0)
-		goto error;
-	if (closed)
-		return umap;
-	umap = union_components(umap, exact);
-	return umap;
-error:
-	isl_union_map_free(umap);
-	return NULL;
-}
-
-struct isl_union_power {
-	isl_union_map *pow;
-	int *exact;
-};
-
-static int power(__isl_take isl_map *map, void *user)
-{
-	struct isl_union_power *up = user;
-
-	map = isl_map_power(map, up->exact);
-	up->pow = isl_union_map_from_map(map);
-
-	return -1;
-}
-
-/* Construct a map [x] -> [x+1], with parameters prescribed by "dim".
- */
-static __isl_give isl_union_map *increment(__isl_take isl_dim *dim)
-{
-	int k;
-	isl_basic_map *bmap;
-
-	dim = isl_dim_add(dim, isl_dim_in, 1);
-	dim = isl_dim_add(dim, isl_dim_out, 1);
-	bmap = isl_basic_map_alloc_dim(dim, 0, 1, 0);
-	k = isl_basic_map_alloc_equality(bmap);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(bmap->eq[k], isl_basic_map_total_dim(bmap));
-	isl_int_set_si(bmap->eq[k][0], 1);
-	isl_int_set_si(bmap->eq[k][isl_basic_map_offset(bmap, isl_dim_in)], 1);
-	isl_int_set_si(bmap->eq[k][isl_basic_map_offset(bmap, isl_dim_out)], -1);
-	return isl_union_map_from_map(isl_map_from_basic_map(bmap));
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Construct a map [[x]->[y]] -> [y-x], with parameters prescribed by "dim".
- */
-static __isl_give isl_union_map *deltas_map(__isl_take isl_dim *dim)
-{
-	isl_basic_map *bmap;
-
-	dim = isl_dim_add(dim, isl_dim_in, 1);
-	dim = isl_dim_add(dim, isl_dim_out, 1);
-	bmap = isl_basic_map_universe(dim);
-	bmap = isl_basic_map_deltas_map(bmap);
-
-	return isl_union_map_from_map(isl_map_from_basic_map(bmap));
-}
-
-/* Compute the positive powers of "map", or an overapproximation.
- * The result maps the exponent to a nested copy of the corresponding power.
- * If the result is exact, then *exact is set to 1.
- */
-__isl_give isl_union_map *isl_union_map_power(__isl_take isl_union_map *umap,
-	int *exact)
-{
-	int n;
-	isl_union_map *inc;
-	isl_union_map *dm;
-
-	if (!umap)
-		return NULL;
-	n = isl_union_map_n_map(umap);
-	if (n == 0)
-		return umap;
-	if (n == 1) {
-		struct isl_union_power up = { NULL, exact };
-		isl_union_map_foreach_map(umap, &power, &up);
-		isl_union_map_free(umap);
-		return up.pow;
-	}
-	inc = increment(isl_union_map_get_dim(umap));
-	umap = isl_union_map_product(inc, umap);
-	umap = isl_union_map_transitive_closure(umap, exact);
-	umap = isl_union_map_zip(umap);
-	dm = deltas_map(isl_union_map_get_dim(umap));
-	umap = isl_union_map_apply_domain(umap, dm);
-	
-	return umap;
-}
diff --git a/cloog-0.16.3/isl/isl_union_map.c b/cloog-0.16.3/isl/isl_union_map.c
deleted file mode 100644
index a5910fb..0000000
--- a/cloog-0.16.3/isl/isl_union_map.c
+++ /dev/null
@@ -1,2042 +0,0 @@
-/*
- * Copyright 2010-2011 INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France 
- */
-
-#include <isl_map_private.h>
-#include <isl/ctx.h>
-#include <isl/hash.h>
-#include <isl/map.h>
-#include <isl/set.h>
-#include <isl_dim_private.h>
-#include <isl_union_map_private.h>
-#include <isl/union_set.h>
-
-static __isl_give isl_union_map *isl_union_map_alloc(__isl_take isl_dim *dim,
-	int size)
-{
-	isl_union_map *umap;
-
-	if (!dim)
-		return NULL;
-
-	umap = isl_calloc_type(dim->ctx, isl_union_map);
-	if (!umap)
-		return NULL;
-
-	umap->ref = 1;
-	umap->dim = dim;
-	if (isl_hash_table_init(dim->ctx, &umap->table, size) < 0)
-		goto error;
-
-	return umap;
-error:
-	isl_dim_free(dim);
-	isl_union_map_free(umap);
-	return NULL;
-}
-
-__isl_give isl_union_map *isl_union_map_empty(__isl_take isl_dim *dim)
-{
-	return isl_union_map_alloc(dim, 16);
-}
-
-__isl_give isl_union_set *isl_union_set_empty(__isl_take isl_dim *dim)
-{
-	return isl_union_map_empty(dim);
-}
-
-isl_ctx *isl_union_map_get_ctx(__isl_keep isl_union_map *umap)
-{
-	return umap ? umap->dim->ctx : NULL;
-}
-
-isl_ctx *isl_union_set_get_ctx(__isl_keep isl_union_set *uset)
-{
-	return uset ? uset->dim->ctx : NULL;
-}
-
-__isl_give isl_dim *isl_union_map_get_dim(__isl_keep isl_union_map *umap)
-{
-	if (!umap)
-		return NULL;
-	return isl_dim_copy(umap->dim);
-}
-
-__isl_give isl_dim *isl_union_set_get_dim(__isl_keep isl_union_set *uset)
-{
-	return isl_union_map_get_dim(uset);
-}
-
-static int free_umap_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_map_free(map);
-	return 0;
-}
-
-static int add_map(__isl_take isl_map *map, void *user)
-{
-	isl_union_map **umap = (isl_union_map **)user;
-
-	*umap = isl_union_map_add_map(*umap, map);
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_dup(__isl_keep isl_union_map *umap)
-{
-	isl_union_map *dup;
-
-	if (!umap)
-		return NULL;
-
-	dup = isl_union_map_empty(isl_dim_copy(umap->dim));
-	if (isl_union_map_foreach_map(umap, &add_map, &dup) < 0)
-		goto error;
-	return dup;
-error:
-	isl_union_map_free(dup);
-	return NULL;
-}
-
-__isl_give isl_union_map *isl_union_map_cow(__isl_take isl_union_map *umap)
-{
-	if (!umap)
-		return NULL;
-
-	if (umap->ref == 1)
-		return umap;
-	umap->ref--;
-	return isl_union_map_dup(umap);
-}
-
-struct isl_union_align {
-	isl_reordering *exp;
-	isl_union_map *res;
-};
-
-static int align_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_reordering *exp;
-	struct isl_union_align *data = user;
-
-	exp = isl_reordering_extend_dim(isl_reordering_copy(data->exp),
-				    isl_map_get_dim(map));
-
-	data->res = isl_union_map_add_map(data->res,
-					isl_map_realign(isl_map_copy(map), exp));
-
-	return 0;
-}
-
-/* Align the parameters of umap along those of model.
- * The result has the parameters of model first, in the same order
- * as they appear in model, followed by any remaining parameters of
- * umap that do not appear in model.
- */
-__isl_give isl_union_map *isl_union_map_align_params(
-	__isl_take isl_union_map *umap, __isl_take isl_dim *model)
-{
-	struct isl_union_align data = { NULL, NULL };
-
-	if (!umap || !model)
-		goto error;
-
-	if (isl_dim_match(umap->dim, isl_dim_param, model, isl_dim_param)) {
-		isl_dim_free(model);
-		return umap;
-	}
-
-	data.exp = isl_parameter_alignment_reordering(umap->dim, model);
-	if (!data.exp)
-		goto error;
-
-	data.res = isl_union_map_alloc(isl_dim_copy(data.exp->dim),
-					umap->table.n);
-	if (isl_hash_table_foreach(umap->dim->ctx, &umap->table,
-					&align_entry, &data) < 0)
-		goto error;
-
-	isl_reordering_free(data.exp);
-	isl_union_map_free(umap);
-	isl_dim_free(model);
-	return data.res;
-error:
-	isl_reordering_free(data.exp);
-	isl_union_map_free(umap);
-	isl_union_map_free(data.res);
-	isl_dim_free(model);
-	return NULL;
-}
-
-__isl_give isl_union_set *isl_union_set_align_params(
-	__isl_take isl_union_set *uset, __isl_take isl_dim *model)
-{
-	return isl_union_map_align_params(uset, model);
-}
-
-__isl_give isl_union_map *isl_union_map_union(__isl_take isl_union_map *umap1,
-	__isl_take isl_union_map *umap2)
-{
-	umap1 = isl_union_map_align_params(umap1, isl_union_map_get_dim(umap2));
-	umap2 = isl_union_map_align_params(umap2, isl_union_map_get_dim(umap1));
-
-	umap1 = isl_union_map_cow(umap1);
-
-	if (!umap1 || !umap2)
-		goto error;
-
-	if (isl_union_map_foreach_map(umap2, &add_map, &umap1) < 0)
-		goto error;
-
-	isl_union_map_free(umap2);
-
-	return umap1;
-error:
-	isl_union_map_free(umap1);
-	isl_union_map_free(umap2);
-	return NULL;
-}
-
-__isl_give isl_union_set *isl_union_set_union(__isl_take isl_union_set *uset1,
-	__isl_take isl_union_set *uset2)
-{
-	return isl_union_map_union(uset1, uset2);
-}
-
-__isl_give isl_union_map *isl_union_map_copy(__isl_keep isl_union_map *umap)
-{
-	if (!umap)
-		return NULL;
-
-	umap->ref++;
-	return umap;
-}
-
-__isl_give isl_union_set *isl_union_set_copy(__isl_keep isl_union_set *uset)
-{
-	return isl_union_map_copy(uset);
-}
-
-void *isl_union_map_free(__isl_take isl_union_map *umap)
-{
-	if (!umap)
-		return NULL;
-
-	if (--umap->ref > 0)
-		return NULL;
-
-	isl_hash_table_foreach(umap->dim->ctx, &umap->table,
-			       &free_umap_entry, NULL);
-	isl_hash_table_clear(&umap->table);
-	isl_dim_free(umap->dim);
-	free(umap);
-	return NULL;
-}
-
-void *isl_union_set_free(__isl_take isl_union_set *uset)
-{
-	return isl_union_map_free(uset);
-}
-
-static int has_dim(const void *entry, const void *val)
-{
-	isl_map *map = (isl_map *)entry;
-	isl_dim *dim = (isl_dim *)val;
-
-	return isl_dim_equal(map->dim, dim);
-}
-
-__isl_give isl_union_map *isl_union_map_add_map(__isl_take isl_union_map *umap,
-	__isl_take isl_map *map)
-{
-	uint32_t hash;
-	struct isl_hash_table_entry *entry;
-
-	if (isl_map_plain_is_empty(map)) {
-		isl_map_free(map);
-		return umap;
-	}
-
-	umap = isl_union_map_cow(umap);
-
-	if (!map || !umap)
-		goto error;
-
-	isl_assert(map->ctx, isl_dim_match(map->dim, isl_dim_param, umap->dim,
-					   isl_dim_param), goto error);
-
-	hash = isl_dim_get_hash(map->dim);
-	entry = isl_hash_table_find(umap->dim->ctx, &umap->table, hash,
-				    &has_dim, map->dim, 1);
-	if (!entry)
-		goto error;
-
-	if (!entry->data)
-		entry->data = map;
-	else {
-		entry->data = isl_map_union(entry->data, isl_map_copy(map));
-		if (!entry->data)
-			goto error;
-		isl_map_free(map);
-	}
-
-	return umap;
-error:
-	isl_map_free(map);
-	isl_union_map_free(umap);
-	return NULL;
-}
-
-__isl_give isl_union_set *isl_union_set_add_set(__isl_take isl_union_set *uset,
-	__isl_take isl_set *set)
-{
-	return isl_union_map_add_map(uset, (isl_map *)set);
-}
-
-__isl_give isl_union_map *isl_union_map_from_map(__isl_take isl_map *map)
-{
-	isl_dim *dim;
-	isl_union_map *umap;
-
-	if (!map)
-		return NULL;
-
-	dim = isl_map_get_dim(map);
-	dim = isl_dim_drop(dim, isl_dim_in, 0, isl_dim_size(dim, isl_dim_in));
-	dim = isl_dim_drop(dim, isl_dim_out, 0, isl_dim_size(dim, isl_dim_out));
-	umap = isl_union_map_empty(dim);
-	umap = isl_union_map_add_map(umap, map);
-
-	return umap;
-}
-
-__isl_give isl_union_set *isl_union_set_from_set(__isl_take isl_set *set)
-{
-	return isl_union_map_from_map((isl_map *)set);
-}
-
-struct isl_union_map_foreach_data
-{
-	int (*fn)(__isl_take isl_map *map, void *user);
-	void *user;
-};
-
-static int call_on_copy(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	struct isl_union_map_foreach_data *data;
-	data = (struct isl_union_map_foreach_data *)user;
-
-	return data->fn(isl_map_copy(map), data->user);
-}
-
-int isl_union_map_n_map(__isl_keep isl_union_map *umap)
-{
-	return umap ? umap->table.n : 0;
-}
-
-int isl_union_set_n_set(__isl_keep isl_union_set *uset)
-{
-	return uset ? uset->table.n : 0;
-}
-
-int isl_union_map_foreach_map(__isl_keep isl_union_map *umap,
-	int (*fn)(__isl_take isl_map *map, void *user), void *user)
-{
-	struct isl_union_map_foreach_data data = { fn, user };
-
-	if (!umap)
-		return -1;
-
-	return isl_hash_table_foreach(umap->dim->ctx, &umap->table,
-				      &call_on_copy, &data);
-}
-
-static int copy_map(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_map **map_p = user;
-
-	*map_p = isl_map_copy(map);
-
-	return -1;
-}
-
-__isl_give isl_map *isl_map_from_union_map(__isl_take isl_union_map *umap)
-{
-	isl_ctx *ctx;
-	isl_map *map = NULL;
-
-	if (!umap)
-		return NULL;
-	ctx = isl_union_map_get_ctx(umap);
-	if (umap->table.n != 1)
-		isl_die(ctx, isl_error_invalid,
-			"union map needs to contain elements in exactly "
-			"one space", return isl_union_map_free(umap));
-
-	isl_hash_table_foreach(ctx, &umap->table, &copy_map, &map);
-
-	isl_union_map_free(umap);
-
-	return map;
-}
-
-__isl_give isl_set *isl_set_from_union_set(__isl_take isl_union_set *uset)
-{
-	return isl_map_from_union_map(uset);
-}
-
-__isl_give isl_map *isl_union_map_extract_map(__isl_keep isl_union_map *umap,
-	__isl_take isl_dim *dim)
-{
-	uint32_t hash;
-	struct isl_hash_table_entry *entry;
-
-	if (!umap || !dim)
-		goto error;
-
-	hash = isl_dim_get_hash(dim);
-	entry = isl_hash_table_find(umap->dim->ctx, &umap->table, hash,
-				    &has_dim, dim, 0);
-	if (!entry)
-		return isl_map_empty(dim);
-	isl_dim_free(dim);
-	return isl_map_copy(entry->data);
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-__isl_give isl_set *isl_union_set_extract_set(__isl_keep isl_union_set *uset,
-	__isl_take isl_dim *dim)
-{
-	return (isl_set *)isl_union_map_extract_map(uset, dim);
-}
-
-/* Check if umap contains a map in the given space.
- */
-__isl_give int isl_union_map_contains(__isl_keep isl_union_map *umap,
-	__isl_keep isl_dim *dim)
-{
-	uint32_t hash;
-	struct isl_hash_table_entry *entry;
-
-	if (!umap || !dim)
-		return -1;
-
-	hash = isl_dim_get_hash(dim);
-	entry = isl_hash_table_find(umap->dim->ctx, &umap->table, hash,
-				    &has_dim, dim, 0);
-	return !!entry;
-}
-
-__isl_give int isl_union_set_contains(__isl_keep isl_union_set *uset,
-	__isl_keep isl_dim *dim)
-{
-	return isl_union_map_contains(uset, dim);
-}
-
-int isl_union_set_foreach_set(__isl_keep isl_union_set *uset,
-	int (*fn)(__isl_take isl_set *set, void *user), void *user)
-{
-	return isl_union_map_foreach_map(uset,
-		(int(*)(__isl_take isl_map *, void*))fn, user);
-}
-
-struct isl_union_set_foreach_point_data {
-	int (*fn)(__isl_take isl_point *pnt, void *user);
-	void *user;
-};
-
-static int foreach_point(__isl_take isl_set *set, void *user)
-{
-	struct isl_union_set_foreach_point_data *data = user;
-	int r;
-
-	r = isl_set_foreach_point(set, data->fn, data->user);
-	isl_set_free(set);
-
-	return r;
-}
-
-int isl_union_set_foreach_point(__isl_keep isl_union_set *uset,
-	int (*fn)(__isl_take isl_point *pnt, void *user), void *user)
-{
-	struct isl_union_set_foreach_point_data data = { fn, user };
-	return isl_union_set_foreach_set(uset, &foreach_point, &data);
-}
-
-struct isl_union_map_gen_bin_data {
-	isl_union_map *umap2;
-	isl_union_map *res;
-};
-
-static int subtract_entry(void **entry, void *user)
-{
-	struct isl_union_map_gen_bin_data *data = user;
-	uint32_t hash;
-	struct isl_hash_table_entry *entry2;
-	isl_map *map = *entry;
-
-	hash = isl_dim_get_hash(map->dim);
-	entry2 = isl_hash_table_find(data->umap2->dim->ctx, &data->umap2->table,
-				     hash, &has_dim, map->dim, 0);
-	map = isl_map_copy(map);
-	if (entry2) {
-		int empty;
-		map = isl_map_subtract(map, isl_map_copy(entry2->data));
-
-		empty = isl_map_is_empty(map);
-		if (empty < 0) {
-			isl_map_free(map);
-			return -1;
-		}
-		if (empty) {
-			isl_map_free(map);
-			return 0;
-		}
-	}
-	data->res = isl_union_map_add_map(data->res, map);
-
-	return 0;
-}
-
-static __isl_give isl_union_map *gen_bin_op(__isl_take isl_union_map *umap1,
-	__isl_take isl_union_map *umap2, int (*fn)(void **, void *))
-{
-	struct isl_union_map_gen_bin_data data = { NULL, NULL };
-
-	umap1 = isl_union_map_align_params(umap1, isl_union_map_get_dim(umap2));
-	umap2 = isl_union_map_align_params(umap2, isl_union_map_get_dim(umap1));
-
-	if (!umap1 || !umap2)
-		goto error;
-
-	data.umap2 = umap2;
-	data.res = isl_union_map_alloc(isl_dim_copy(umap1->dim),
-				       umap1->table.n);
-	if (isl_hash_table_foreach(umap1->dim->ctx, &umap1->table,
-				   fn, &data) < 0)
-		goto error;
-
-	isl_union_map_free(umap1);
-	isl_union_map_free(umap2);
-	return data.res;
-error:
-	isl_union_map_free(umap1);
-	isl_union_map_free(umap2);
-	isl_union_map_free(data.res);
-	return NULL;
-}
-
-__isl_give isl_union_map *isl_union_map_subtract(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
-{
-	return gen_bin_op(umap1, umap2, &subtract_entry);
-}
-
-__isl_give isl_union_set *isl_union_set_subtract(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2)
-{
-	return isl_union_map_subtract(uset1, uset2);
-}
-
-struct isl_union_map_match_bin_data {
-	isl_union_map *umap2;
-	isl_union_map *res;
-	__isl_give isl_map *(*fn)(__isl_take isl_map*, __isl_take isl_map*);
-};
-
-static int match_bin_entry(void **entry, void *user)
-{
-	struct isl_union_map_match_bin_data *data = user;
-	uint32_t hash;
-	struct isl_hash_table_entry *entry2;
-	isl_map *map = *entry;
-	int empty;
-
-	hash = isl_dim_get_hash(map->dim);
-	entry2 = isl_hash_table_find(data->umap2->dim->ctx, &data->umap2->table,
-				     hash, &has_dim, map->dim, 0);
-	if (!entry2)
-		return 0;
-
-	map = isl_map_copy(map);
-	map = data->fn(map, isl_map_copy(entry2->data));
-
-	empty = isl_map_is_empty(map);
-	if (empty < 0) {
-		isl_map_free(map);
-		return -1;
-	}
-	if (empty) {
-		isl_map_free(map);
-		return 0;
-	}
-
-	data->res = isl_union_map_add_map(data->res, map);
-
-	return 0;
-}
-
-static __isl_give isl_union_map *match_bin_op(__isl_take isl_union_map *umap1,
-	__isl_take isl_union_map *umap2,
-	__isl_give isl_map *(*fn)(__isl_take isl_map*, __isl_take isl_map*))
-{
-	struct isl_union_map_match_bin_data data = { NULL, NULL, fn };
-
-	umap1 = isl_union_map_align_params(umap1, isl_union_map_get_dim(umap2));
-	umap2 = isl_union_map_align_params(umap2, isl_union_map_get_dim(umap1));
-
-	if (!umap1 || !umap2)
-		goto error;
-
-	data.umap2 = umap2;
-	data.res = isl_union_map_alloc(isl_dim_copy(umap1->dim),
-				       umap1->table.n);
-	if (isl_hash_table_foreach(umap1->dim->ctx, &umap1->table,
-				   &match_bin_entry, &data) < 0)
-		goto error;
-
-	isl_union_map_free(umap1);
-	isl_union_map_free(umap2);
-	return data.res;
-error:
-	isl_union_map_free(umap1);
-	isl_union_map_free(umap2);
-	isl_union_map_free(data.res);
-	return NULL;
-}
-
-__isl_give isl_union_map *isl_union_map_intersect(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
-{
-	return match_bin_op(umap1, umap2, &isl_map_intersect);
-}
-
-__isl_give isl_union_set *isl_union_set_intersect(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2)
-{
-	return isl_union_map_intersect(uset1, uset2);
-}
-
-__isl_give isl_union_map *isl_union_map_gist(__isl_take isl_union_map *umap,
-	__isl_take isl_union_map *context)
-{
-	return match_bin_op(umap, context, &isl_map_gist);
-}
-
-__isl_give isl_union_set *isl_union_set_gist(__isl_take isl_union_set *uset,
-	__isl_take isl_union_set *context)
-{
-	return isl_union_map_gist(uset, context);
-}
-
-static __isl_give isl_map *lex_le_set(__isl_take isl_map *set1,
-	__isl_take isl_map *set2)
-{
-	return isl_set_lex_le_set((isl_set *)set1, (isl_set *)set2);
-}
-
-static __isl_give isl_map *lex_lt_set(__isl_take isl_map *set1,
-	__isl_take isl_map *set2)
-{
-	return isl_set_lex_lt_set((isl_set *)set1, (isl_set *)set2);
-}
-
-__isl_give isl_union_map *isl_union_set_lex_lt_union_set(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2)
-{
-	return match_bin_op(uset1, uset2, &lex_lt_set);
-}
-
-__isl_give isl_union_map *isl_union_set_lex_le_union_set(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2)
-{
-	return match_bin_op(uset1, uset2, &lex_le_set);
-}
-
-__isl_give isl_union_map *isl_union_set_lex_gt_union_set(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2)
-{
-	return isl_union_map_reverse(isl_union_set_lex_lt_union_set(uset2, uset1));
-}
-
-__isl_give isl_union_map *isl_union_set_lex_ge_union_set(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2)
-{
-	return isl_union_map_reverse(isl_union_set_lex_le_union_set(uset2, uset1));
-}
-
-__isl_give isl_union_map *isl_union_map_lex_gt_union_map(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
-{
-	return isl_union_map_reverse(isl_union_map_lex_lt_union_map(umap2, umap1));
-}
-
-__isl_give isl_union_map *isl_union_map_lex_ge_union_map(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
-{
-	return isl_union_map_reverse(isl_union_map_lex_le_union_map(umap2, umap1));
-}
-
-static int intersect_domain_entry(void **entry, void *user)
-{
-	struct isl_union_map_gen_bin_data *data = user;
-	uint32_t hash;
-	struct isl_hash_table_entry *entry2;
-	isl_dim *dim;
-	isl_map *map = *entry;
-	int empty;
-
-	dim = isl_map_get_dim(map);
-	dim = isl_dim_domain(dim);
-	hash = isl_dim_get_hash(dim);
-	entry2 = isl_hash_table_find(data->umap2->dim->ctx, &data->umap2->table,
-				     hash, &has_dim, dim, 0);
-	isl_dim_free(dim);
-	if (!entry2)
-		return 0;
-
-	map = isl_map_copy(map);
-	map = isl_map_intersect_domain(map, isl_set_copy(entry2->data));
-
-	empty = isl_map_is_empty(map);
-	if (empty < 0) {
-		isl_map_free(map);
-		return -1;
-	}
-	if (empty) {
-		isl_map_free(map);
-		return 0;
-	}
-
-	data->res = isl_union_map_add_map(data->res, map);
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_intersect_domain(
-	__isl_take isl_union_map *umap, __isl_take isl_union_set *uset)
-{
-	return gen_bin_op(umap, uset, &intersect_domain_entry);
-}
-
-static int intersect_range_entry(void **entry, void *user)
-{
-	struct isl_union_map_gen_bin_data *data = user;
-	uint32_t hash;
-	struct isl_hash_table_entry *entry2;
-	isl_dim *dim;
-	isl_map *map = *entry;
-	int empty;
-
-	dim = isl_map_get_dim(map);
-	dim = isl_dim_range(dim);
-	hash = isl_dim_get_hash(dim);
-	entry2 = isl_hash_table_find(data->umap2->dim->ctx, &data->umap2->table,
-				     hash, &has_dim, dim, 0);
-	isl_dim_free(dim);
-	if (!entry2)
-		return 0;
-
-	map = isl_map_copy(map);
-	map = isl_map_intersect_range(map, isl_set_copy(entry2->data));
-
-	empty = isl_map_is_empty(map);
-	if (empty < 0) {
-		isl_map_free(map);
-		return -1;
-	}
-	if (empty) {
-		isl_map_free(map);
-		return 0;
-	}
-
-	data->res = isl_union_map_add_map(data->res, map);
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_intersect_range(
-	__isl_take isl_union_map *umap, __isl_take isl_union_set *uset)
-{
-	return gen_bin_op(umap, uset, &intersect_range_entry);
-}
-
-struct isl_union_map_bin_data {
-	isl_union_map *umap2;
-	isl_union_map *res;
-	isl_map *map;
-	int (*fn)(void **entry, void *user);
-};
-
-static int apply_range_entry(void **entry, void *user)
-{
-	struct isl_union_map_bin_data *data = user;
-	isl_map *map2 = *entry;
-	int empty;
-
-	if (!isl_dim_tuple_match(data->map->dim, isl_dim_out,
-				 map2->dim, isl_dim_in))
-		return 0;
-
-	map2 = isl_map_apply_range(isl_map_copy(data->map), isl_map_copy(map2));
-
-	empty = isl_map_is_empty(map2);
-	if (empty < 0) {
-		isl_map_free(map2);
-		return -1;
-	}
-	if (empty) {
-		isl_map_free(map2);
-		return 0;
-	}
-
-	data->res = isl_union_map_add_map(data->res, map2);
-
-	return 0;
-}
-
-static int bin_entry(void **entry, void *user)
-{
-	struct isl_union_map_bin_data *data = user;
-	isl_map *map = *entry;
-
-	data->map = map;
-	if (isl_hash_table_foreach(data->umap2->dim->ctx, &data->umap2->table,
-				   data->fn, data) < 0)
-		return -1;
-
-	return 0;
-}
-
-static __isl_give isl_union_map *bin_op(__isl_take isl_union_map *umap1,
-	__isl_take isl_union_map *umap2, int (*fn)(void **entry, void *user))
-{
-	struct isl_union_map_bin_data data = { NULL, NULL, NULL, fn };
-
-	umap1 = isl_union_map_align_params(umap1, isl_union_map_get_dim(umap2));
-	umap2 = isl_union_map_align_params(umap2, isl_union_map_get_dim(umap1));
-
-	if (!umap1 || !umap2)
-		goto error;
-
-	data.umap2 = umap2;
-	data.res = isl_union_map_alloc(isl_dim_copy(umap1->dim),
-				       umap1->table.n);
-	if (isl_hash_table_foreach(umap1->dim->ctx, &umap1->table,
-				   &bin_entry, &data) < 0)
-		goto error;
-
-	isl_union_map_free(umap1);
-	isl_union_map_free(umap2);
-	return data.res;
-error:
-	isl_union_map_free(umap1);
-	isl_union_map_free(umap2);
-	isl_union_map_free(data.res);
-	return NULL;
-}
-
-__isl_give isl_union_map *isl_union_map_apply_range(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
-{
-	return bin_op(umap1, umap2, &apply_range_entry);
-}
-
-__isl_give isl_union_map *isl_union_map_apply_domain(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
-{
-	umap1 = isl_union_map_reverse(umap1);
-	umap1 = isl_union_map_apply_range(umap1, umap2);
-	return isl_union_map_reverse(umap1);
-}
-
-__isl_give isl_union_set *isl_union_set_apply(
-	__isl_take isl_union_set *uset, __isl_take isl_union_map *umap)
-{
-	return isl_union_map_apply_range(uset, umap);
-}
-
-static int map_lex_lt_entry(void **entry, void *user)
-{
-	struct isl_union_map_bin_data *data = user;
-	isl_map *map2 = *entry;
-
-	if (!isl_dim_tuple_match(data->map->dim, isl_dim_out,
-				 map2->dim, isl_dim_out))
-		return 0;
-
-	map2 = isl_map_lex_lt_map(isl_map_copy(data->map), isl_map_copy(map2));
-
-	data->res = isl_union_map_add_map(data->res, map2);
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_lex_lt_union_map(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
-{
-	return bin_op(umap1, umap2, &map_lex_lt_entry);
-}
-
-static int map_lex_le_entry(void **entry, void *user)
-{
-	struct isl_union_map_bin_data *data = user;
-	isl_map *map2 = *entry;
-
-	if (!isl_dim_tuple_match(data->map->dim, isl_dim_out,
-				 map2->dim, isl_dim_out))
-		return 0;
-
-	map2 = isl_map_lex_le_map(isl_map_copy(data->map), isl_map_copy(map2));
-
-	data->res = isl_union_map_add_map(data->res, map2);
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_lex_le_union_map(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
-{
-	return bin_op(umap1, umap2, &map_lex_le_entry);
-}
-
-static int product_entry(void **entry, void *user)
-{
-	struct isl_union_map_bin_data *data = user;
-	isl_map *map2 = *entry;
-
-	map2 = isl_map_product(isl_map_copy(data->map), isl_map_copy(map2));
-
-	data->res = isl_union_map_add_map(data->res, map2);
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_product(__isl_take isl_union_map *umap1,
-	__isl_take isl_union_map *umap2)
-{
-	return bin_op(umap1, umap2, &product_entry);
-}
-
-__isl_give isl_union_set *isl_union_set_product(__isl_take isl_union_set *uset1,
-	__isl_take isl_union_set *uset2)
-{
-	return isl_union_map_product(uset1, uset2);
-}
-
-static int range_product_entry(void **entry, void *user)
-{
-	struct isl_union_map_bin_data *data = user;
-	isl_map *map2 = *entry;
-
-	if (!isl_dim_tuple_match(data->map->dim, isl_dim_in,
-				 map2->dim, isl_dim_in))
-		return 0;
-
-	map2 = isl_map_range_product(isl_map_copy(data->map),
-				     isl_map_copy(map2));
-
-	data->res = isl_union_map_add_map(data->res, map2);
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_range_product(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
-{
-	return bin_op(umap1, umap2, &range_product_entry);
-}
-
-static int flat_range_product_entry(void **entry, void *user)
-{
-	struct isl_union_map_bin_data *data = user;
-	isl_map *map2 = *entry;
-
-	if (!isl_dim_tuple_match(data->map->dim, isl_dim_in,
-				 map2->dim, isl_dim_in))
-		return 0;
-
-	map2 = isl_map_flat_range_product(isl_map_copy(data->map),
-					  isl_map_copy(map2));
-
-	data->res = isl_union_map_add_map(data->res, map2);
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_flat_range_product(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
-{
-	return bin_op(umap1, umap2, &flat_range_product_entry);
-}
-
-__isl_give isl_union_map *isl_union_map_from_range(
-	__isl_take isl_union_set *uset)
-{
-	return uset;
-}
-
-__isl_give isl_union_map *isl_union_map_from_domain(
-	__isl_take isl_union_set *uset)
-{
-	return isl_union_map_reverse(isl_union_map_from_range(uset));
-}
-
-__isl_give isl_union_map *isl_union_map_from_domain_and_range(
-	__isl_take isl_union_set *domain, __isl_take isl_union_set *range)
-{
-	return isl_union_map_apply_range(isl_union_map_from_domain(domain),
-				         isl_union_map_from_range(range));
-}
-
-static __isl_give isl_union_map *un_op(__isl_take isl_union_map *umap,
-	int (*fn)(void **, void *))
-{
-	umap = isl_union_map_cow(umap);
-	if (!umap)
-		return NULL;
-
-	if (isl_hash_table_foreach(umap->dim->ctx, &umap->table, fn, NULL) < 0)
-		goto error;
-
-	return umap;
-error:
-	isl_union_map_free(umap);
-	return NULL;
-}
-
-static int affine_entry(void **entry, void *user)
-{
-	isl_map **map = (isl_map **)entry;
-
-	*map = isl_map_from_basic_map(isl_map_affine_hull(*map));
-
-	return *map ? 0 : -1;
-}
-
-__isl_give isl_union_map *isl_union_map_affine_hull(
-	__isl_take isl_union_map *umap)
-{
-	return un_op(umap, &affine_entry);
-}
-
-__isl_give isl_union_set *isl_union_set_affine_hull(
-	__isl_take isl_union_set *uset)
-{
-	return isl_union_map_affine_hull(uset);
-}
-
-static int polyhedral_entry(void **entry, void *user)
-{
-	isl_map **map = (isl_map **)entry;
-
-	*map = isl_map_from_basic_map(isl_map_polyhedral_hull(*map));
-
-	return *map ? 0 : -1;
-}
-
-__isl_give isl_union_map *isl_union_map_polyhedral_hull(
-	__isl_take isl_union_map *umap)
-{
-	return un_op(umap, &polyhedral_entry);
-}
-
-__isl_give isl_union_set *isl_union_set_polyhedral_hull(
-	__isl_take isl_union_set *uset)
-{
-	return isl_union_map_polyhedral_hull(uset);
-}
-
-static int simple_entry(void **entry, void *user)
-{
-	isl_map **map = (isl_map **)entry;
-
-	*map = isl_map_from_basic_map(isl_map_simple_hull(*map));
-
-	return *map ? 0 : -1;
-}
-
-__isl_give isl_union_map *isl_union_map_simple_hull(
-	__isl_take isl_union_map *umap)
-{
-	return un_op(umap, &simple_entry);
-}
-
-__isl_give isl_union_set *isl_union_set_simple_hull(
-	__isl_take isl_union_set *uset)
-{
-	return isl_union_map_simple_hull(uset);
-}
-
-static int inplace_entry(void **entry, void *user)
-{
-	__isl_give isl_map *(*fn)(__isl_take isl_map *);
-	isl_map **map = (isl_map **)entry;
-	isl_map *copy;
-
-	fn = *(__isl_give isl_map *(**)(__isl_take isl_map *)) user;
-	copy = fn(isl_map_copy(*map));
-	if (!copy)
-		return -1;
-
-	isl_map_free(*map);
-	*map = copy;
-
-	return 0;
-}
-
-static __isl_give isl_union_map *inplace(__isl_take isl_union_map *umap,
-	__isl_give isl_map *(*fn)(__isl_take isl_map *))
-{
-	if (!umap)
-		return NULL;
-
-	if (isl_hash_table_foreach(umap->dim->ctx, &umap->table,
-				    &inplace_entry, &fn) < 0)
-		goto error;
-
-	return umap;
-error:
-	isl_union_map_free(umap);
-	return NULL;
-}
-
-__isl_give isl_union_map *isl_union_map_coalesce(
-	__isl_take isl_union_map *umap)
-{
-	return inplace(umap, &isl_map_coalesce);
-}
-
-__isl_give isl_union_set *isl_union_set_coalesce(
-	__isl_take isl_union_set *uset)
-{
-	return isl_union_map_coalesce(uset);
-}
-
-__isl_give isl_union_map *isl_union_map_detect_equalities(
-	__isl_take isl_union_map *umap)
-{
-	return inplace(umap, &isl_map_detect_equalities);
-}
-
-__isl_give isl_union_set *isl_union_set_detect_equalities(
-	__isl_take isl_union_set *uset)
-{
-	return isl_union_map_detect_equalities(uset);
-}
-
-__isl_give isl_union_map *isl_union_map_compute_divs(
-	__isl_take isl_union_map *umap)
-{
-	return inplace(umap, &isl_map_compute_divs);
-}
-
-__isl_give isl_union_set *isl_union_set_compute_divs(
-	__isl_take isl_union_set *uset)
-{
-	return isl_union_map_compute_divs(uset);
-}
-
-static int lexmin_entry(void **entry, void *user)
-{
-	isl_map **map = (isl_map **)entry;
-
-	*map = isl_map_lexmin(*map);
-
-	return *map ? 0 : -1;
-}
-
-__isl_give isl_union_map *isl_union_map_lexmin(
-	__isl_take isl_union_map *umap)
-{
-	return un_op(umap, &lexmin_entry);
-}
-
-__isl_give isl_union_set *isl_union_set_lexmin(
-	__isl_take isl_union_set *uset)
-{
-	return isl_union_map_lexmin(uset);
-}
-
-static int lexmax_entry(void **entry, void *user)
-{
-	isl_map **map = (isl_map **)entry;
-
-	*map = isl_map_lexmax(*map);
-
-	return *map ? 0 : -1;
-}
-
-__isl_give isl_union_map *isl_union_map_lexmax(
-	__isl_take isl_union_map *umap)
-{
-	return un_op(umap, &lexmax_entry);
-}
-
-__isl_give isl_union_set *isl_union_set_lexmax(
-	__isl_take isl_union_set *uset)
-{
-	return isl_union_map_lexmax(uset);
-}
-
-static __isl_give isl_union_set *cond_un_op(__isl_take isl_union_map *umap,
-	int (*fn)(void **, void *))
-{
-	isl_union_set *res;
-
-	if (!umap)
-		return NULL;
-
-	res = isl_union_map_alloc(isl_dim_copy(umap->dim), umap->table.n);
-	if (isl_hash_table_foreach(umap->dim->ctx, &umap->table, fn, &res) < 0)
-		goto error;
-
-	isl_union_map_free(umap);
-	return res;
-error:
-	isl_union_map_free(umap);
-	isl_union_set_free(res);
-	return NULL;
-}
-
-static int universe_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_union_map **res = user;
-
-	map = isl_map_universe(isl_map_get_dim(map));
-	*res = isl_union_map_add_map(*res, map);
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_universe(__isl_take isl_union_map *umap)
-{
-	return cond_un_op(umap, &universe_entry);
-}
-
-__isl_give isl_union_set *isl_union_set_universe(__isl_take isl_union_set *uset)
-{
-	return isl_union_map_universe(uset);
-}
-
-static int reverse_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_union_map **res = user;
-
-	*res = isl_union_map_add_map(*res, isl_map_reverse(isl_map_copy(map)));
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_reverse(__isl_take isl_union_map *umap)
-{
-	return cond_un_op(umap, &reverse_entry);
-}
-
-static int domain_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_union_set **res = user;
-
-	*res = isl_union_set_add_set(*res, isl_map_domain(isl_map_copy(map)));
-
-	return 0;
-}
-
-__isl_give isl_union_set *isl_union_map_domain(__isl_take isl_union_map *umap)
-{
-	return cond_un_op(umap, &domain_entry);
-}
-
-static int range_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_union_set **res = user;
-
-	*res = isl_union_set_add_set(*res, isl_map_range(isl_map_copy(map)));
-
-	return 0;
-}
-
-__isl_give isl_union_set *isl_union_map_range(__isl_take isl_union_map *umap)
-{
-	return cond_un_op(umap, &range_entry);
-}
-
-static int domain_map_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_union_set **res = user;
-
-	*res = isl_union_map_add_map(*res,
-					isl_map_domain_map(isl_map_copy(map)));
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_domain_map(
-	__isl_take isl_union_map *umap)
-{
-	return cond_un_op(umap, &domain_map_entry);
-}
-
-static int range_map_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_union_set **res = user;
-
-	*res = isl_union_map_add_map(*res,
-					isl_map_range_map(isl_map_copy(map)));
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_range_map(
-	__isl_take isl_union_map *umap)
-{
-	return cond_un_op(umap, &range_map_entry);
-}
-
-static int deltas_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_union_set **res = user;
-
-	if (!isl_dim_tuple_match(map->dim, isl_dim_in, map->dim, isl_dim_out))
-		return 0;
-
-	*res = isl_union_set_add_set(*res, isl_map_deltas(isl_map_copy(map)));
-
-	return 0;
-}
-
-__isl_give isl_union_set *isl_union_map_deltas(__isl_take isl_union_map *umap)
-{
-	return cond_un_op(umap, &deltas_entry);
-}
-
-static int deltas_map_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_union_map **res = user;
-
-	if (!isl_dim_tuple_match(map->dim, isl_dim_in, map->dim, isl_dim_out))
-		return 0;
-
-	*res = isl_union_map_add_map(*res,
-				     isl_map_deltas_map(isl_map_copy(map)));
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_deltas_map(
-	__isl_take isl_union_map *umap)
-{
-	return cond_un_op(umap, &deltas_map_entry);
-}
-
-static int identity_entry(void **entry, void *user)
-{
-	isl_set *set = *entry;
-	isl_union_map **res = user;
-
-	*res = isl_union_map_add_map(*res, isl_set_identity(isl_set_copy(set)));
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_set_identity(__isl_take isl_union_set *uset)
-{
-	return cond_un_op(uset, &identity_entry);
-}
-
-static int unwrap_entry(void **entry, void *user)
-{
-	isl_set *set = *entry;
-	isl_union_set **res = user;
-
-	if (!isl_set_is_wrapping(set))
-		return 0;
-
-	*res = isl_union_map_add_map(*res, isl_set_unwrap(isl_set_copy(set)));
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_set_unwrap(__isl_take isl_union_set *uset)
-{
-	return cond_un_op(uset, &unwrap_entry);
-}
-
-static int wrap_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_union_set **res = user;
-
-	*res = isl_union_set_add_set(*res, isl_map_wrap(isl_map_copy(map)));
-
-	return 0;
-}
-
-__isl_give isl_union_set *isl_union_map_wrap(__isl_take isl_union_map *umap)
-{
-	return cond_un_op(umap, &wrap_entry);
-}
-
-struct isl_union_map_is_subset_data {
-	isl_union_map *umap2;
-	int is_subset;
-};
-
-static int is_subset_entry(void **entry, void *user)
-{
-	struct isl_union_map_is_subset_data *data = user;
-	uint32_t hash;
-	struct isl_hash_table_entry *entry2;
-	isl_map *map = *entry;
-
-	hash = isl_dim_get_hash(map->dim);
-	entry2 = isl_hash_table_find(data->umap2->dim->ctx, &data->umap2->table,
-				     hash, &has_dim, map->dim, 0);
-	if (!entry2) {
-		data->is_subset = 0;
-		return -1;
-	}
-
-	data->is_subset = isl_map_is_subset(map, entry2->data);
-	if (data->is_subset < 0 || !data->is_subset)
-		return -1;
-
-	return 0;
-}
-
-int isl_union_map_is_subset(__isl_keep isl_union_map *umap1,
-	__isl_keep isl_union_map *umap2)
-{
-	struct isl_union_map_is_subset_data data = { NULL, 1 };
-
-	umap1 = isl_union_map_copy(umap1);
-	umap2 = isl_union_map_copy(umap2);
-	umap1 = isl_union_map_align_params(umap1, isl_union_map_get_dim(umap2));
-	umap2 = isl_union_map_align_params(umap2, isl_union_map_get_dim(umap1));
-
-	if (!umap1 || !umap2)
-		goto error;
-
-	data.umap2 = umap2;
-	if (isl_hash_table_foreach(umap1->dim->ctx, &umap1->table,
-				   &is_subset_entry, &data) < 0 &&
-	    data.is_subset)
-		goto error;
-
-	isl_union_map_free(umap1);
-	isl_union_map_free(umap2);
-
-	return data.is_subset;
-error:
-	isl_union_map_free(umap1);
-	isl_union_map_free(umap2);
-	return -1;
-}
-
-int isl_union_set_is_subset(__isl_keep isl_union_set *uset1,
-	__isl_keep isl_union_set *uset2)
-{
-	return isl_union_map_is_subset(uset1, uset2);
-}
-
-int isl_union_map_is_equal(__isl_keep isl_union_map *umap1,
-	__isl_keep isl_union_map *umap2)
-{
-	int is_subset;
-
-	if (!umap1 || !umap2)
-		return -1;
-	is_subset = isl_union_map_is_subset(umap1, umap2);
-	if (is_subset != 1)
-		return is_subset;
-	is_subset = isl_union_map_is_subset(umap2, umap1);
-	return is_subset;
-}
-
-int isl_union_set_is_equal(__isl_keep isl_union_set *uset1,
-	__isl_keep isl_union_set *uset2)
-{
-	return isl_union_map_is_equal(uset1, uset2);
-}
-
-int isl_union_map_is_strict_subset(__isl_keep isl_union_map *umap1,
-	__isl_keep isl_union_map *umap2)
-{
-	int is_subset;
-
-	if (!umap1 || !umap2)
-		return -1;
-	is_subset = isl_union_map_is_subset(umap1, umap2);
-	if (is_subset != 1)
-		return is_subset;
-	is_subset = isl_union_map_is_subset(umap2, umap1);
-	if (is_subset == -1)
-		return is_subset;
-	return !is_subset;
-}
-
-int isl_union_set_is_strict_subset(__isl_keep isl_union_set *uset1,
-	__isl_keep isl_union_set *uset2)
-{
-	return isl_union_map_is_strict_subset(uset1, uset2);
-}
-
-static int sample_entry(void **entry, void *user)
-{
-	isl_basic_map **sample = (isl_basic_map **)user;
-	isl_map *map = *entry;
-
-	*sample = isl_map_sample(isl_map_copy(map));
-	if (!*sample)
-		return -1;
-	if (!isl_basic_map_plain_is_empty(*sample))
-		return -1;
-	return 0;
-}
-
-__isl_give isl_basic_map *isl_union_map_sample(__isl_take isl_union_map *umap)
-{
-	isl_basic_map *sample = NULL;
-
-	if (!umap)
-		return NULL;
-
-	if (isl_hash_table_foreach(umap->dim->ctx, &umap->table,
-				   &sample_entry, &sample) < 0 &&
-	    !sample)
-		goto error;
-
-	if (!sample)
-		sample = isl_basic_map_empty(isl_union_map_get_dim(umap));
-
-	isl_union_map_free(umap);
-
-	return sample;
-error:
-	isl_union_map_free(umap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_union_set_sample(__isl_take isl_union_set *uset)
-{
-	return (isl_basic_set *)isl_union_map_sample(uset);
-}
-
-struct isl_forall_data {
-	int res;
-	int (*fn)(__isl_keep isl_map *map);
-};
-
-static int forall_entry(void **entry, void *user)
-{
-	struct isl_forall_data *data = user;
-	isl_map *map = *entry;
-
-	data->res = data->fn(map);
-	if (data->res < 0)
-		return -1;
-
-	if (!data->res)
-		return -1;
-
-	return 0;
-}
-
-static int union_map_forall(__isl_keep isl_union_map *umap,
-	int (*fn)(__isl_keep isl_map *map))
-{
-	struct isl_forall_data data = { 1, fn };
-
-	if (!umap)
-		return -1;
-
-	if (isl_hash_table_foreach(umap->dim->ctx, &umap->table,
-				   &forall_entry, &data) < 0 && data.res)
-		return -1;
-
-	return data.res;
-}
-
-struct isl_forall_user_data {
-	int res;
-	int (*fn)(__isl_keep isl_map *map, void *user);
-	void *user;
-};
-
-static int forall_user_entry(void **entry, void *user)
-{
-	struct isl_forall_user_data *data = user;
-	isl_map *map = *entry;
-
-	data->res = data->fn(map, data->user);
-	if (data->res < 0)
-		return -1;
-
-	if (!data->res)
-		return -1;
-
-	return 0;
-}
-
-/* Check if fn(map, user) returns true for all maps "map" in umap.
- */
-static int union_map_forall_user(__isl_keep isl_union_map *umap,
-	int (*fn)(__isl_keep isl_map *map, void *user), void *user)
-{
-	struct isl_forall_user_data data = { 1, fn, user };
-
-	if (!umap)
-		return -1;
-
-	if (isl_hash_table_foreach(umap->dim->ctx, &umap->table,
-				   &forall_user_entry, &data) < 0 && data.res)
-		return -1;
-
-	return data.res;
-}
-
-int isl_union_map_is_empty(__isl_keep isl_union_map *umap)
-{
-	return union_map_forall(umap, &isl_map_is_empty);
-}
-
-int isl_union_set_is_empty(__isl_keep isl_union_set *uset)
-{
-	return isl_union_map_is_empty(uset);
-}
-
-static int is_subset_of_identity(__isl_keep isl_map *map)
-{
-	int is_subset;
-	isl_dim *dim;
-	isl_map *id;
-
-	if (!map)
-		return -1;
-
-	if (!isl_dim_tuple_match(map->dim, isl_dim_in, map->dim, isl_dim_out))
-		return 0;
-
-	dim = isl_map_get_dim(map);
-	id = isl_map_identity(dim);
-
-	is_subset = isl_map_is_subset(map, id);
-
-	isl_map_free(id);
-
-	return is_subset;
-}
-
-/* Check if the given map is single-valued.
- * We simply compute
- *
- *	M \circ M^-1
- *
- * and check if the result is a subset of the identity mapping.
- */
-int isl_union_map_is_single_valued(__isl_keep isl_union_map *umap)
-{
-	isl_union_map *test;
-	int sv;
-
-	if (isl_union_map_n_map(umap) == 1) {
-		isl_map *map;
-		umap = isl_union_map_copy(umap);
-		map = isl_map_from_union_map(umap);
-		sv = isl_map_is_single_valued(map);
-		isl_map_free(map);
-		return sv;
-	}
-
-	test = isl_union_map_reverse(isl_union_map_copy(umap));
-	test = isl_union_map_apply_range(test, isl_union_map_copy(umap));
-
-	sv = union_map_forall(test, &is_subset_of_identity);
-
-	isl_union_map_free(test);
-
-	return sv;
-}
-
-int isl_union_map_is_injective(__isl_keep isl_union_map *umap)
-{
-	int in;
-
-	umap = isl_union_map_copy(umap);
-	umap = isl_union_map_reverse(umap);
-	in = isl_union_map_is_single_valued(umap);
-	isl_union_map_free(umap);
-
-	return in;
-}
-
-/* Represents a map that has a fixed value (v) for one of its
- * range dimensions.
- * The map in this structure is not reference counted, so it
- * is only valid while the isl_union_map from which it was
- * obtained is still alive.
- */
-struct isl_fixed_map {
-	isl_int v;
-	isl_map *map;
-};
-
-static struct isl_fixed_map *alloc_isl_fixed_map_array(isl_ctx *ctx,
-	int n)
-{
-	int i;
-	struct isl_fixed_map *v;
-
-	v = isl_calloc_array(ctx, struct isl_fixed_map, n);
-	if (!v)
-		return NULL;
-	for (i = 0; i < n; ++i)
-		isl_int_init(v[i].v);
-	return v;
-}
-
-static void free_isl_fixed_map_array(struct isl_fixed_map *v, int n)
-{
-	int i;
-
-	if (!v)
-		return;
-	for (i = 0; i < n; ++i)
-		isl_int_clear(v[i].v);
-	free(v);
-}
-
-/* Compare the "v" field of two isl_fixed_map structs.
- */
-static int qsort_fixed_map_cmp(const void *p1, const void *p2)
-{
-	const struct isl_fixed_map *e1 = (const struct isl_fixed_map *) p1;
-	const struct isl_fixed_map *e2 = (const struct isl_fixed_map *) p2;
-
-	return isl_int_cmp(e1->v, e2->v);
-}
-
-/* Internal data structure used while checking whether all maps
- * in a union_map have a fixed value for a given output dimension.
- * v is the list of maps, with the fixed value for the dimension
- * n is the number of maps considered so far
- * pos is the output dimension under investigation
- */
-struct isl_fixed_dim_data {
-	struct isl_fixed_map *v;
-	int n;
-	int pos;
-};
-
-static int fixed_at_pos(__isl_keep isl_map *map, void *user)
-{
-	struct isl_fixed_dim_data *data = user;
-
-	data->v[data->n].map = map;
-	return isl_map_plain_is_fixed(map, isl_dim_out, data->pos,
-				      &data->v[data->n++].v);
-}
-
-static int plain_injective_on_range(__isl_take isl_union_map *umap,
-	int first, int n_range);
-
-/* Given a list of the maps, with their fixed values at output dimension "pos",
- * check whether the ranges of the maps form an obvious partition.
- *
- * We first sort the maps according to their fixed values.
- * If all maps have a different value, then we know the ranges form
- * a partition.
- * Otherwise, we collect the maps with the same fixed value and
- * check whether each such collection is obviously injective
- * based on later dimensions.
- */
-static int separates(struct isl_fixed_map *v, int n,
-	__isl_take isl_dim *dim, int pos, int n_range)
-{
-	int i;
-
-	if (!v)
-		goto error;
-
-	qsort(v, n, sizeof(*v), &qsort_fixed_map_cmp);
-
-	for (i = 0; i + 1 < n; ++i) {
-		int j, k;
-		isl_union_map *part;
-		int injective;
-
-		for (j = i + 1; j < n; ++j)
-			if (isl_int_ne(v[i].v, v[j].v))
-				break;
-
-		if (j == i + 1)
-			continue;
-
-		part = isl_union_map_alloc(isl_dim_copy(dim), j - i);
-		for (k = i; k < j; ++k)
-			part = isl_union_map_add_map(part,
-						     isl_map_copy(v[k].map));
-
-		injective = plain_injective_on_range(part, pos + 1, n_range);
-		if (injective < 0)
-			goto error;
-		if (!injective)
-			break;
-
-		i = j - 1;
-	}
-
-	isl_dim_free(dim);
-	free_isl_fixed_map_array(v, n);
-	return i + 1 >= n;
-error:
-	isl_dim_free(dim);
-	free_isl_fixed_map_array(v, n);
-	return -1;
-}
-
-/* Check whether the maps in umap have obviously distinct ranges.
- * In particular, check for an output dimension in the range
- * [first,n_range) for which all maps have a fixed value
- * and then check if these values, possibly along with fixed values
- * at later dimensions, entail distinct ranges.
- */
-static int plain_injective_on_range(__isl_take isl_union_map *umap,
-	int first, int n_range)
-{
-	isl_ctx *ctx;
-	int n;
-	struct isl_fixed_dim_data data = { NULL };
-
-	ctx = isl_union_map_get_ctx(umap);
-
-	if (!umap)
-		goto error;
-
-	n = isl_union_map_n_map(umap);
-	if (n <= 1) {
-		isl_union_map_free(umap);
-		return 1;
-	}
-
-	if (first >= n_range) {
-		isl_union_map_free(umap);
-		return 0;
-	}
-
-	data.v = alloc_isl_fixed_map_array(ctx, n);
-	if (!data.v)
-		goto error;
-
-	for (data.pos = first; data.pos < n_range; ++data.pos) {
-		int fixed;
-		int injective;
-		isl_dim *dim;
-
-		data.n = 0;
-		fixed = union_map_forall_user(umap, &fixed_at_pos, &data);
-		if (fixed < 0)
-			goto error;
-		if (!fixed)
-			continue;
-		dim = isl_union_map_get_dim(umap);
-		injective = separates(data.v, n, dim, data.pos, n_range);
-		isl_union_map_free(umap);
-		return injective;
-	}
-
-	free_isl_fixed_map_array(data.v, n);
-	isl_union_map_free(umap);
-
-	return 0;
-error:
-	free_isl_fixed_map_array(data.v, n);
-	isl_union_map_free(umap);
-	return -1;
-}
-
-/* Check whether the maps in umap that map to subsets of "ran"
- * have obviously distinct ranges.
- */
-static int plain_injective_on_range_wrap(__isl_keep isl_set *ran, void *user)
-{
-	isl_union_map *umap = user;
-
-	umap = isl_union_map_copy(umap);
-	umap = isl_union_map_intersect_range(umap,
-			isl_union_set_from_set(isl_set_copy(ran)));
-	return plain_injective_on_range(umap, 0, isl_set_dim(ran, isl_dim_set));
-}
-
-/* Check if the given union_map is obviously injective.
- *
- * In particular, we first check if all individual maps are obviously
- * injective and then check if all the ranges of these maps are
- * obviously disjoint.
- */
-int isl_union_map_plain_is_injective(__isl_keep isl_union_map *umap)
-{
-	int in;
-	isl_union_map *univ;
-	isl_union_set *ran;
-
-	in = union_map_forall(umap, &isl_map_plain_is_injective);
-	if (in < 0)
-		return -1;
-	if (!in)
-		return 0;
-
-	univ = isl_union_map_universe(isl_union_map_copy(umap));
-	ran = isl_union_map_range(univ);
-
-	in = union_map_forall_user(ran, &plain_injective_on_range_wrap, umap);
-
-	isl_union_set_free(ran);
-
-	return in;
-}
-
-int isl_union_map_is_bijective(__isl_keep isl_union_map *umap)
-{
-	int sv;
-
-	sv = isl_union_map_is_single_valued(umap);
-	if (sv < 0 || !sv)
-		return sv;
-
-	return isl_union_map_is_injective(umap);
-}
-
-static int zip_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_union_map **res = user;
-
-	if (!isl_map_can_zip(map))
-		return 0;
-
-	*res = isl_union_map_add_map(*res, isl_map_zip(isl_map_copy(map)));
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_zip(__isl_take isl_union_map *umap)
-{
-	return cond_un_op(umap, &zip_entry);
-}
-
-static int lift_entry(void **entry, void *user)
-{
-	isl_set *set = *entry;
-	isl_union_set **res = user;
-
-	*res = isl_union_set_add_set(*res, isl_set_lift(isl_set_copy(set)));
-
-	return 0;
-}
-
-__isl_give isl_union_set *isl_union_set_lift(__isl_take isl_union_set *uset)
-{
-	return cond_un_op(uset, &lift_entry);
-}
-
-static int coefficients_entry(void **entry, void *user)
-{
-	isl_set *set = *entry;
-	isl_union_set **res = user;
-
-	set = isl_set_copy(set);
-	set = isl_set_from_basic_set(isl_set_coefficients(set));
-	*res = isl_union_set_add_set(*res, set);
-
-	return 0;
-}
-
-__isl_give isl_union_set *isl_union_set_coefficients(
-	__isl_take isl_union_set *uset)
-{
-	isl_ctx *ctx;
-	isl_dim *dim;
-	isl_union_set *res;
-
-	if (!uset)
-		return NULL;
-
-	ctx = isl_union_set_get_ctx(uset);
-	dim = isl_dim_set_alloc(ctx, 0, 0);
-	res = isl_union_map_alloc(dim, uset->table.n);
-	if (isl_hash_table_foreach(uset->dim->ctx, &uset->table,
-				   &coefficients_entry, &res) < 0)
-		goto error;
-
-	isl_union_set_free(uset);
-	return res;
-error:
-	isl_union_set_free(uset);
-	isl_union_set_free(res);
-	return NULL;
-}
-
-static int solutions_entry(void **entry, void *user)
-{
-	isl_set *set = *entry;
-	isl_union_set **res = user;
-
-	set = isl_set_copy(set);
-	set = isl_set_from_basic_set(isl_set_solutions(set));
-	if (!*res)
-		*res = isl_union_set_from_set(set);
-	else
-		*res = isl_union_set_add_set(*res, set);
-
-	if (!*res)
-		return -1;
-
-	return 0;
-}
-
-__isl_give isl_union_set *isl_union_set_solutions(
-	__isl_take isl_union_set *uset)
-{
-	isl_union_set *res = NULL;
-
-	if (!uset)
-		return NULL;
-
-	if (uset->table.n == 0) {
-		res = isl_union_set_empty(isl_union_set_get_dim(uset));
-		isl_union_set_free(uset);
-		return res;
-	}
-
-	if (isl_hash_table_foreach(uset->dim->ctx, &uset->table,
-				   &solutions_entry, &res) < 0)
-		goto error;
-
-	isl_union_set_free(uset);
-	return res;
-error:
-	isl_union_set_free(uset);
-	isl_union_set_free(res);
-	return NULL;
-}
diff --git a/cloog-0.16.3/isl/isl_union_map_private.h b/cloog-0.16.3/isl/isl_union_map_private.h
deleted file mode 100644
index 2abd4ff..0000000
--- a/cloog-0.16.3/isl/isl_union_map_private.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#define isl_union_set	isl_union_map
-#include <isl/union_map.h>
-
-struct isl_union_map {
-	int ref;
-	isl_dim *dim;
-
-	struct isl_hash_table	table;
-};
diff --git a/cloog-0.16.3/isl/isl_union_templ.c b/cloog-0.16.3/isl/isl_union_templ.c
deleted file mode 100644
index c06069d..0000000
--- a/cloog-0.16.3/isl/isl_union_templ.c
+++ /dev/null
@@ -1,614 +0,0 @@
-/*
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France 
- */
-
-#define xFN(TYPE,NAME) TYPE ## _ ## NAME
-#define FN(TYPE,NAME) xFN(TYPE,NAME)
-#define xS(TYPE,NAME) struct TYPE ## _ ## NAME
-#define S(TYPE,NAME) xS(TYPE,NAME)
-
-struct UNION {
-	int ref;
-#ifdef HAS_TYPE
-	enum isl_fold type;
-#endif
-	isl_dim *dim;
-
-	struct isl_hash_table	table;
-};
-
-__isl_give UNION *FN(UNION,cow)(__isl_take UNION *u);
-
-isl_ctx *FN(UNION,get_ctx)(__isl_keep UNION *u)
-{
-	return u ? u->dim->ctx : NULL;
-}
-
-__isl_give isl_dim *FN(UNION,get_dim)(__isl_keep UNION *u)
-{
-	if (!u)
-		return NULL;
-	return isl_dim_copy(u->dim);
-}
-
-#ifdef HAS_TYPE
-static __isl_give UNION *FN(UNION,alloc)(__isl_take isl_dim *dim,
-	enum isl_fold type, int size)
-#else
-static __isl_give UNION *FN(UNION,alloc)(__isl_take isl_dim *dim, int size)
-#endif
-{
-	UNION *u;
-
-	if (!dim)
-		return NULL;
-
-	u = isl_calloc_type(dim->ctx, UNION);
-	if (!u)
-		return NULL;
-
-	u->ref = 1;
-#ifdef HAS_TYPE
-	u->type = type;
-#endif
-	u->dim = dim;
-	if (isl_hash_table_init(dim->ctx, &u->table, size) < 0)
-		goto error;
-
-	return u;
-error:
-	isl_dim_free(dim);
-	FN(UNION,free)(u);
-	return NULL;
-}
-
-#ifdef HAS_TYPE
-__isl_give UNION *FN(UNION,zero)(__isl_take isl_dim *dim, enum isl_fold type)
-{
-	return FN(UNION,alloc)(dim, type, 16);
-}
-#else
-__isl_give UNION *FN(UNION,zero)(__isl_take isl_dim *dim)
-{
-	return FN(UNION,alloc)(dim, 16);
-}
-#endif
-
-__isl_give UNION *FN(UNION,copy)(__isl_keep UNION *u)
-{
-	if (!u)
-		return NULL;
-
-	u->ref++;
-	return u;
-}
-
-S(UNION,foreach_data)
-{
-	int (*fn)(__isl_take PART *part, void *user);
-	void *user;
-};
-
-static int call_on_copy(void **entry, void *user)
-{
-	PART *part = *entry;
-	S(UNION,foreach_data) *data = (S(UNION,foreach_data) *)user;
-
-	return data->fn(FN(PART,copy)(part), data->user);
-}
-
-int FN(FN(UNION,foreach),PARTS)(__isl_keep UNION *u,
-	int (*fn)(__isl_take PART *part, void *user), void *user)
-{
-	S(UNION,foreach_data) data = { fn, user };
-
-	if (!u)
-		return -1;
-
-	return isl_hash_table_foreach(u->dim->ctx, &u->table,
-				      &call_on_copy, &data);
-}
-
-static int has_dim(const void *entry, const void *val)
-{
-	PART *part = (PART *)entry;
-	isl_dim *dim = (isl_dim *)val;
-
-	return isl_dim_equal(part->dim, dim);
-}
-
-__isl_give PART *FN(FN(UNION,extract),PARTS)(__isl_keep UNION *u,
-	__isl_take isl_dim *dim)
-{
-	uint32_t hash;
-	struct isl_hash_table_entry *entry;
-
-	if (!u || !dim)
-		goto error;
-
-	hash = isl_dim_get_hash(dim);
-	entry = isl_hash_table_find(u->dim->ctx, &u->table, hash,
-				    &has_dim, dim, 0);
-	if (!entry)
-#ifdef HAS_TYPE
-		return FN(PART,zero)(dim, u->type);
-#else
-		return FN(PART,zero)(dim);
-#endif
-	isl_dim_free(dim);
-	return FN(PART,copy)(entry->data);
-error:
-	isl_dim_free(dim);
-	return NULL;
-}
-
-__isl_give UNION *FN(FN(UNION,add),PARTS)(__isl_take UNION *u,
-	__isl_take PART *part)
-{
-	uint32_t hash;
-	struct isl_hash_table_entry *entry;
-
-	if (!part)
-		goto error;
-
-	if (FN(PART,is_zero)(part)) {
-		FN(PART,free)(part);
-		return u;
-	}
-
-	u = FN(UNION,cow)(u);
-
-	if (!u)
-		goto error;
-
-	isl_assert(u->dim->ctx, isl_dim_match(part->dim, isl_dim_param, u->dim,
-					      isl_dim_param), goto error);
-
-	hash = isl_dim_get_hash(part->dim);
-	entry = isl_hash_table_find(u->dim->ctx, &u->table, hash,
-				    &has_dim, part->dim, 1);
-	if (!entry)
-		goto error;
-
-	if (!entry->data)
-		entry->data = part;
-	else {
-		entry->data = FN(PART,add)(entry->data, FN(PART,copy)(part));
-		if (!entry->data)
-			goto error;
-		FN(PART,free)(part);
-		if (FN(PART,is_zero)(entry->data)) {
-			FN(PART,free)(entry->data);
-			isl_hash_table_remove(u->dim->ctx, &u->table, entry);
-		}
-	}
-
-	return u;
-error:
-	FN(PART,free)(part);
-	FN(UNION,free)(u);
-	return NULL;
-}
-
-static int add_part(__isl_take PART *part, void *user)
-{
-	UNION **u = (UNION **)user;
-
-	*u = FN(FN(UNION,add),PARTS)(*u, part);
-
-	return 0;
-}
-
-__isl_give UNION *FN(UNION,dup)(__isl_keep UNION *u)
-{
-	UNION *dup;
-
-	if (!u)
-		return NULL;
-
-#ifdef HAS_TYPE
-	dup = FN(UNION,zero)(isl_dim_copy(u->dim), u->type);
-#else
-	dup = FN(UNION,zero)(isl_dim_copy(u->dim));
-#endif
-	if (FN(FN(UNION,foreach),PARTS)(u, &add_part, &dup) < 0)
-		goto error;
-	return dup;
-error:
-	FN(UNION,free)(dup);
-	return NULL;
-}
-
-__isl_give UNION *FN(UNION,cow)(__isl_take UNION *u)
-{
-	if (!u)
-		return NULL;
-
-	if (u->ref == 1)
-		return u;
-	u->ref--;
-	return FN(UNION,dup)(u);
-}
-
-static int free_u_entry(void **entry, void *user)
-{
-	PART *part = *entry;
-	FN(PART,free)(part);
-	return 0;
-}
-
-void FN(UNION,free)(__isl_take UNION *u)
-{
-	if (!u)
-		return;
-
-	if (--u->ref > 0)
-		return;
-
-	isl_hash_table_foreach(u->dim->ctx, &u->table, &free_u_entry, NULL);
-	isl_hash_table_clear(&u->table);
-	isl_dim_free(u->dim);
-	free(u);
-}
-
-S(UNION,align) {
-	isl_reordering *exp;
-	UNION *res;
-};
-
-static int align_entry(__isl_take PART *part, void *user)
-{
-	isl_reordering *exp;
-	S(UNION,align) *data = user;
-
-	exp = isl_reordering_extend_dim(isl_reordering_copy(data->exp),
-				    FN(PART,get_dim)(part));
-
-	data->res = FN(FN(UNION,add),PARTS)(data->res,
-					    FN(PART,realign)(part, exp));
-
-	return 0;
-}
-
-__isl_give UNION *FN(UNION,align_params)(__isl_take UNION *u,
-	__isl_take isl_dim *model)
-{
-	S(UNION,align) data = { NULL, NULL };
-
-	if (!u || !model)
-		goto error;
-
-	if (isl_dim_match(u->dim, isl_dim_param, model, isl_dim_param)) {
-		isl_dim_free(model);
-		return u;
-	}
-
-	data.exp = isl_parameter_alignment_reordering(u->dim, model);
-	if (!data.exp)
-		goto error;
-
-#ifdef HAS_TYPE
-	data.res = FN(UNION,alloc)(isl_dim_copy(data.exp->dim),
-						u->type, u->table.n);
-#else
-	data.res = FN(UNION,alloc)(isl_dim_copy(data.exp->dim), u->table.n);
-#endif
-	if (FN(FN(UNION,foreach),PARTS)(u, &align_entry, &data) < 0)
-		goto error;
-
-	isl_reordering_free(data.exp);
-	FN(UNION,free)(u);
-	isl_dim_free(model);
-	return data.res;
-error:
-	isl_reordering_free(data.exp);
-	FN(UNION,free)(u);
-	FN(UNION,free)(data.res);
-	isl_dim_free(model);
-	return NULL;
-}
-
-__isl_give UNION *FN(UNION,add)(__isl_take UNION *u1, __isl_take UNION *u2)
-{
-	u1 = FN(UNION,align_params)(u1, FN(UNION,get_dim)(u2));
-	u2 = FN(UNION,align_params)(u2, FN(UNION,get_dim)(u1));
-
-	u1 = FN(UNION,cow)(u1);
-
-	if (!u1 || !u2)
-		goto error;
-
-	if (FN(FN(UNION,foreach),PARTS)(u2, &add_part, &u1) < 0)
-		goto error;
-
-	FN(UNION,free)(u2);
-
-	return u1;
-error:
-	FN(UNION,free)(u1);
-	FN(UNION,free)(u2);
-	return NULL;
-}
-
-__isl_give UNION *FN(FN(UNION,from),PARTS)(__isl_take PART *part)
-{
-	isl_dim *dim;
-	UNION *u;
-
-	if (!part)
-		return NULL;
-
-	dim = FN(PART,get_dim)(part);
-	dim = isl_dim_drop(dim, isl_dim_in, 0, isl_dim_size(dim, isl_dim_in));
-	dim = isl_dim_drop(dim, isl_dim_out, 0, isl_dim_size(dim, isl_dim_out));
-#ifdef HAS_TYPE
-	u = FN(UNION,zero)(dim, part->type);
-#else
-	u = FN(UNION,zero)(dim);
-#endif
-	u = FN(FN(UNION,add),PARTS)(u, part);
-
-	return u;
-}
-
-S(UNION,match_bin_data) {
-	UNION *u2;
-	UNION *res;
-};
-
-/* This function is currently only used from isl_polynomial.c
- * and not from isl_fold.c.
- */
-static __isl_give UNION *match_bin_op(__isl_take UNION *u1,
-	__isl_take UNION *u2,
-	int (*fn)(void **, void *)) __attribute__ ((unused));
-static __isl_give UNION *match_bin_op(__isl_take UNION *u1,
-	__isl_take UNION *u2, int (*fn)(void **, void *))
-{
-	S(UNION,match_bin_data) data = { NULL, NULL };
-
-	u1 = FN(UNION,align_params)(u1, FN(UNION,get_dim)(u2));
-	u2 = FN(UNION,align_params)(u2, FN(UNION,get_dim)(u1));
-
-	if (!u1 || !u2)
-		goto error;
-
-	data.u2 = u2;
-#ifdef HAS_TYPE
-	data.res = FN(UNION,alloc)(isl_dim_copy(u1->dim), u1->type, u1->table.n);
-#else
-	data.res = FN(UNION,alloc)(isl_dim_copy(u1->dim), u1->table.n);
-#endif
-	if (isl_hash_table_foreach(u1->dim->ctx, &u1->table, fn, &data) < 0)
-		goto error;
-
-	FN(UNION,free)(u1);
-	FN(UNION,free)(u2);
-	return data.res;
-error:
-	FN(UNION,free)(u1);
-	FN(UNION,free)(u2);
-	FN(UNION,free)(data.res);
-	return NULL;
-}
-
-S(UNION,match_set_data) {
-	isl_union_set *uset;
-	UNION *res;
-	__isl_give PW *(*fn)(__isl_take PW*, __isl_take isl_set*);
-};
-
-static int set_has_dim(const void *entry, const void *val)
-{
-	isl_set *set = (isl_set *)entry;
-	isl_dim *dim = (isl_dim *)val;
-
-	return isl_dim_equal(set->dim, dim);
-}
-
-static int match_set_entry(void **entry, void *user)
-{
-	S(UNION,match_set_data) *data = user;
-	uint32_t hash;
-	struct isl_hash_table_entry *entry2;
-	PW *pw = *entry;
-	int empty;
-
-	hash = isl_dim_get_hash(pw->dim);
-	entry2 = isl_hash_table_find(data->uset->dim->ctx, &data->uset->table,
-				     hash, &set_has_dim, pw->dim, 0);
-	if (!entry2)
-		return 0;
-
-	pw = FN(PW,copy)(pw);
-	pw = data->fn(pw, isl_set_copy(entry2->data));
-
-	empty = FN(PW,is_zero)(pw);
-	if (empty < 0) {
-		FN(PW,free)(pw);
-		return -1;
-	}
-	if (empty) {
-		FN(PW,free)(pw);
-		return 0;
-	}
-
-	data->res = FN(FN(UNION,add),PARTS)(data->res, pw);
-
-	return 0;
-}
-
-static __isl_give UNION *match_set_op(__isl_take UNION *u,
-	__isl_take isl_union_set *uset,
-	__isl_give PW *(*fn)(__isl_take PW*, __isl_take isl_set*))
-{
-	S(UNION,match_set_data) data = { NULL, NULL, fn };
-
-	u = FN(UNION,align_params)(u, isl_union_set_get_dim(uset));
-	uset = isl_union_set_align_params(uset, FN(UNION,get_dim)(u));
-
-	if (!u || !uset)
-		goto error;
-
-	data.uset = uset;
-#ifdef HAS_TYPE
-	data.res = FN(UNION,alloc)(isl_dim_copy(u->dim), u->type, u->table.n);
-#else
-	data.res = FN(UNION,alloc)(isl_dim_copy(u->dim), u->table.n);
-#endif
-	if (isl_hash_table_foreach(u->dim->ctx, &u->table,
-				   &match_set_entry, &data) < 0)
-		goto error;
-
-	FN(UNION,free)(u);
-	isl_union_set_free(uset);
-	return data.res;
-error:
-	FN(UNION,free)(u);
-	isl_union_set_free(uset);
-	FN(UNION,free)(data.res);
-	return NULL;
-}
-
-__isl_give UNION *FN(UNION,intersect_domain)(__isl_take UNION *u,
-	__isl_take isl_union_set *uset)
-{
-	return match_set_op(u, uset, &FN(PW,intersect_domain));
-}
-
-__isl_give UNION *FN(UNION,gist)(__isl_take UNION *u,
-	__isl_take isl_union_set *uset)
-{
-	return match_set_op(u, uset, &FN(PW,gist));
-}
-
-__isl_give isl_qpolynomial *FN(UNION,eval)(__isl_take UNION *u,
-	__isl_take isl_point *pnt)
-{
-	uint32_t hash;
-	struct isl_hash_table_entry *entry;
-	isl_qpolynomial *qp;
-
-	if (!u || !pnt)
-		goto error;
-
-	hash = isl_dim_get_hash(pnt->dim);
-	entry = isl_hash_table_find(u->dim->ctx, &u->table,
-				    hash, &has_dim, pnt->dim, 0);
-	if (!entry) {
-		qp = isl_qpolynomial_zero(isl_dim_copy(pnt->dim));
-		isl_point_free(pnt);
-	} else {
-		qp = FN(PART,eval)(FN(PART,copy)(entry->data), pnt);
-	}
-	FN(UNION,free)(u);
-	return qp;
-error:
-	FN(UNION,free)(u);
-	isl_point_free(pnt);
-	return NULL;
-}
-
-static int coalesce_entry(void **entry, void *user)
-{
-	PW **pw = (PW **)entry;
-
-	*pw = FN(PW,coalesce)(*pw);
-	if (!*pw)
-		return -1;
-
-	return 0;
-}
-
-__isl_give UNION *FN(UNION,coalesce)(__isl_take UNION *u)
-{
-	if (!u)
-		return NULL;
-
-	if (isl_hash_table_foreach(u->dim->ctx, &u->table,
-				   &coalesce_entry, NULL) < 0)
-		goto error;
-
-	return u;
-error:
-	FN(UNION,free)(u);
-	return NULL;
-}
-
-static int domain(__isl_take PART *part, void *user)
-{
-	isl_union_set **uset = (isl_union_set **)user;
-
-	*uset = isl_union_set_add_set(*uset, FN(PART,domain)(part));
-
-	return 0;
-}
-
-__isl_give isl_union_set *FN(UNION,domain)(__isl_take UNION *u)
-{
-	isl_union_set *uset;
-
-	uset = isl_union_set_empty(FN(UNION,get_dim)(u));
-	if (FN(FN(UNION,foreach),PARTS)(u, &domain, &uset) < 0)
-		goto error;
-
-	FN(UNION,free)(u);
-	
-	return uset;
-error:
-	isl_union_set_free(uset);
-	FN(UNION,free)(u);
-	return NULL;
-}
-
-static int mul_isl_int(void **entry, void *user)
-{
-	PW **pw = (PW **)entry;
-	isl_int *v = user;
-
-	*pw = FN(PW,mul_isl_int)(*pw, *v);
-	if (!*pw)
-		return -1;
-
-	return 0;
-}
-
-__isl_give UNION *FN(UNION,mul_isl_int)(__isl_take UNION *u, isl_int v)
-{
-	if (isl_int_is_one(v))
-		return u;
-
-	if (u && isl_int_is_zero(v)) {
-		UNION *zero;
-		isl_dim *dim = FN(UNION,get_dim)(u);
-#ifdef HAS_TYPE
-		zero = FN(UNION,zero)(dim, u->type);
-#else
-		zero = FN(UNION,zero)(dim);
-#endif
-		FN(UNION,free)(u);
-		return zero;
-	}
-
-	u = FN(UNION,cow)(u);
-	if (!u)
-		return NULL;
-
-#ifdef HAS_TYPE
-	if (isl_int_is_neg(v))
-		u->type = isl_fold_type_negate(u->type);
-#endif
-	if (isl_hash_table_foreach(u->dim->ctx, &u->table, &mul_isl_int, v) < 0)
-		goto error;
-
-	return u;
-error:
-	FN(UNION,free)(u);
-	return NULL;
-}
diff --git a/cloog-0.16.3/isl/isl_vec.c b/cloog-0.16.3/isl/isl_vec.c
deleted file mode 100644
index b0bd1a3..0000000
--- a/cloog-0.16.3/isl/isl_vec.c
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl/seq.h>
-#include <isl/vec.h>
-
-isl_ctx *isl_vec_get_ctx(__isl_keep isl_vec *vec)
-{
-	return vec ? vec->ctx : NULL;
-}
-
-struct isl_vec *isl_vec_alloc(struct isl_ctx *ctx, unsigned size)
-{
-	struct isl_vec *vec;
-
-	vec = isl_alloc_type(ctx, struct isl_vec);
-	if (!vec)
-		return NULL;
-
-	vec->block = isl_blk_alloc(ctx, size);
-	if (isl_blk_is_error(vec->block))
-		goto error;
-
-	vec->ctx = ctx;
-	isl_ctx_ref(ctx);
-	vec->ref = 1;
-	vec->size = size;
-	vec->el = vec->block.data;
-
-	return vec;
-error:
-	isl_blk_free(ctx, vec->block);
-	return NULL;
-}
-
-__isl_give isl_vec *isl_vec_extend(__isl_take isl_vec *vec, unsigned size)
-{
-	if (!vec)
-		return NULL;
-	if (size <= vec->size)
-		return vec;
-
-	vec = isl_vec_cow(vec);
-	if (!vec)
-		return NULL;
-
-	vec->block = isl_blk_extend(vec->ctx, vec->block, size);
-	if (!vec->block.data)
-		goto error;
-
-	vec->size = size;
-	vec->el = vec->block.data;
-
-	return vec;
-error:
-	isl_vec_free(vec);
-	return NULL;
-}
-
-__isl_give isl_vec *isl_vec_zero_extend(__isl_take isl_vec *vec, unsigned size)
-{
-	int extra;
-
-	if (!vec)
-		return NULL;
-	if (size <= vec->size)
-		return vec;
-
-	vec = isl_vec_cow(vec);
-	if (!vec)
-		return NULL;
-
-	extra = size - vec->size;
-	vec = isl_vec_extend(vec, size);
-	if (!vec)
-		return NULL;
-
-	isl_seq_clr(vec->el + size - extra, extra);
-
-	return vec;
-}
-
-struct isl_vec *isl_vec_copy(struct isl_vec *vec)
-{
-	if (!vec)
-		return NULL;
-
-	vec->ref++;
-	return vec;
-}
-
-struct isl_vec *isl_vec_dup(struct isl_vec *vec)
-{
-	struct isl_vec *vec2;
-
-	if (!vec)
-		return NULL;
-	vec2 = isl_vec_alloc(vec->ctx, vec->size);
-	isl_seq_cpy(vec2->el, vec->el, vec->size);
-	return vec2;
-}
-
-struct isl_vec *isl_vec_cow(struct isl_vec *vec)
-{
-	struct isl_vec *vec2;
-	if (!vec)
-		return NULL;
-
-	if (vec->ref == 1)
-		return vec;
-
-	vec2 = isl_vec_dup(vec);
-	isl_vec_free(vec);
-	return vec2;
-}
-
-void isl_vec_free(struct isl_vec *vec)
-{
-	if (!vec)
-		return;
-
-	if (--vec->ref > 0)
-		return;
-
-	isl_ctx_deref(vec->ctx);
-	isl_blk_free(vec->ctx, vec->block);
-	free(vec);
-}
-
-int isl_vec_is_equal(__isl_keep isl_vec *vec1, __isl_keep isl_vec *vec2)
-{
-	if (!vec1 || !vec2)
-		return -1;
-
-	if (vec1->size != vec2->size)
-		return 0;
-
-	return isl_seq_eq(vec1->el, vec2->el, vec1->size);
-}
-
-__isl_give isl_printer *isl_printer_print_vec(__isl_take isl_printer *printer,
-	__isl_keep isl_vec *vec)
-{
-	int i;
-
-	if (!printer || !vec)
-		goto error;
-
-	printer = isl_printer_print_str(printer, "[");
-	for (i = 0; i < vec->size; ++i) {
-		if (i)
-			printer = isl_printer_print_str(printer, ",");
-		printer = isl_printer_print_isl_int(printer, vec->el[i]);
-	}
-	printer = isl_printer_print_str(printer, "]");
-
-	return printer;
-error:
-	isl_printer_free(printer);
-	return NULL;
-}
-
-void isl_vec_dump(struct isl_vec *vec)
-{
-	isl_printer *printer;
-
-	if (!vec)
-		return;
-
-	printer = isl_printer_to_file(vec->ctx, stderr);
-	printer = isl_printer_print_vec(printer, vec);
-	printer = isl_printer_end_line(printer);
-
-	isl_printer_free(printer);
-}
-
-__isl_give isl_vec *isl_vec_clr(__isl_take isl_vec *vec)
-{
-	vec = isl_vec_cow(vec);
-	if (!vec)
-		return NULL;
-	isl_seq_clr(vec->el, vec->size);
-	return vec;
-}
-
-void isl_vec_lcm(struct isl_vec *vec, isl_int *lcm)
-{
-	isl_seq_lcm(vec->block.data, vec->size, lcm);
-}
-
-/* Given a rational vector, with the denominator in the first element
- * of the vector, round up all coordinates.
- */
-struct isl_vec *isl_vec_ceil(struct isl_vec *vec)
-{
-	vec = isl_vec_cow(vec);
-	if (!vec)
-		return NULL;
-
-	isl_seq_cdiv_q(vec->el + 1, vec->el + 1, vec->el[0], vec->size - 1);
-
-	isl_int_set_si(vec->el[0], 1);
-
-	return vec;
-}
-
-struct isl_vec *isl_vec_normalize(struct isl_vec *vec)
-{
-	if (!vec)
-		return NULL;
-	isl_seq_normalize(vec->ctx, vec->el, vec->size);
-	return vec;
-}
-
-__isl_give isl_vec *isl_vec_scale(__isl_take isl_vec *vec, isl_int m)
-{
-	if (isl_int_is_one(m))
-		return vec;
-	vec = isl_vec_cow(vec);
-	if (!vec)
-		return NULL;
-	isl_seq_scale(vec->el, vec->el, m, vec->size);
-	return vec;
-}
-
-__isl_give isl_vec *isl_vec_add(__isl_take isl_vec *vec1,
-	__isl_take isl_vec *vec2)
-{
-	vec1 = isl_vec_cow(vec1);
-	if (!vec1 || !vec2)
-		goto error;
-
-	isl_assert(vec1->ctx, vec1->size == vec2->size, goto error);
-
-	isl_seq_combine(vec1->el, vec1->ctx->one, vec1->el,
-			vec1->ctx->one, vec2->el, vec1->size);
-	
-	isl_vec_free(vec2);
-	return vec1;
-error:
-	isl_vec_free(vec1);
-	isl_vec_free(vec2);
-	return NULL;
-}
-
-static int qsort_int_cmp(const void *p1, const void *p2)
-{
-	const isl_int *i1 = (const isl_int *) p1;
-	const isl_int *i2 = (const isl_int *) p2;
-
-	return isl_int_cmp(*i1, *i2);
-}
-
-__isl_give isl_vec *isl_vec_sort(__isl_take isl_vec *vec)
-{
-	if (!vec)
-		return NULL;
-	
-	qsort(vec->el, vec->size, sizeof(*vec->el), &qsort_int_cmp);
-
-	return vec;
-}
-
-__isl_give isl_vec *isl_vec_drop_els(__isl_take isl_vec *vec,
-	unsigned pos, unsigned n)
-{
-	if (n == 0)
-		return vec;
-	vec = isl_vec_cow(vec);
-	if (!vec)
-		return NULL;
-
-	if (pos + n > vec->size)
-		isl_die(vec->ctx, isl_error_invalid,
-			"range out of bounds", goto error);
-
-	if (pos + n != vec->size)
-		isl_seq_cpy(vec->el + pos, vec->el + pos + n,
-			    vec->size - pos - n);
-
-	vec->size -= n;
-	
-	return vec;
-error:
-	isl_vec_free(vec);
-	return NULL;
-}
-
-__isl_give isl_vec *isl_vec_insert_els(__isl_take isl_vec *vec,
-	unsigned pos, unsigned n)
-{
-	isl_vec *ext = NULL;
-
-	if (n == 0)
-		return vec;
-	if (!vec)
-		return NULL;
-
-	if (pos > vec->size)
-		isl_die(vec->ctx, isl_error_invalid,
-			"position out of bounds", goto error);
-
-	ext =  isl_vec_alloc(vec->ctx, vec->size + n);
-	if (!ext)
-		goto error;
-
-	isl_seq_cpy(ext->el, vec->el, pos);
-	isl_seq_cpy(ext->el + pos + n, vec->el + pos, vec->size - pos);
-
-	isl_vec_free(vec);
-	return ext;
-error:
-	isl_vec_free(vec);
-	isl_vec_free(ext);
-	return NULL;
-}
-
-__isl_give isl_vec *isl_vec_insert_zero_els(__isl_take isl_vec *vec,
-	unsigned pos, unsigned n)
-{
-	vec = isl_vec_insert_els(vec, pos, n);
-	if (!vec)
-		return NULL;
-
-	isl_seq_clr(vec->el + pos, n);
-
-	return vec;
-}
diff --git a/cloog-0.16.3/isl/isl_version.c b/cloog-0.16.3/isl/isl_version.c
deleted file mode 100644
index 1a59f55..0000000
--- a/cloog-0.16.3/isl/isl_version.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include "gitversion.h"
-
-const char *isl_version(void)
-{
-	return GIT_HEAD_ID"\n";
-}
diff --git a/cloog-0.16.3/isl/isl_vertices.c b/cloog-0.16.3/isl/isl_vertices.c
deleted file mode 100644
index 9611d6b..0000000
--- a/cloog-0.16.3/isl/isl_vertices.c
+++ /dev/null
@@ -1,1571 +0,0 @@
-/*
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France 
- */
-
-#include <isl_map_private.h>
-#include <isl/set.h>
-#include <isl/seq.h>
-#include <isl_tab.h>
-#include <isl_dim_private.h>
-#include <isl_morph.h>
-#include <isl_vertices_private.h>
-#include <isl_mat_private.h>
-
-#define SELECTED	1
-#define DESELECTED	-1
-#define UNSELECTED	0
-
-static __isl_give isl_vertices *compute_chambers(__isl_take isl_basic_set *bset,
-	__isl_take isl_vertices *vertices);
-
-__isl_give isl_vertices *isl_vertices_copy(__isl_keep isl_vertices *vertices)
-{
-	if (!vertices)
-		return NULL;
-
-	vertices->ref++;
-	return vertices;
-}
-
-void isl_vertices_free(__isl_take isl_vertices *vertices)
-{
-	int i;
-
-	if (!vertices)
-		return;
-
-	if (--vertices->ref > 0)
-		return;
-
-	for (i = 0; i < vertices->n_vertices; ++i) {
-		isl_basic_set_free(vertices->v[i].vertex);
-		isl_basic_set_free(vertices->v[i].dom);
-	}
-	free(vertices->v);
-
-	for (i = 0; i < vertices->n_chambers; ++i) {
-		free(vertices->c[i].vertices);
-		isl_basic_set_free(vertices->c[i].dom);
-	}
-	free(vertices->c);
-
-	isl_basic_set_free(vertices->bset);
-	free(vertices);
-}
-
-struct isl_vertex_list {
-	struct isl_vertex v;
-	struct isl_vertex_list *next;
-};
-
-static void free_vertex_list(struct isl_vertex_list *list)
-{
-	struct isl_vertex_list *next;
-
-	for (; list; list = next) {
-		next = list->next;
-		isl_basic_set_free(list->v.vertex);
-		isl_basic_set_free(list->v.dom);
-		free(list);
-	}
-}
-
-static __isl_give isl_vertices *vertices_from_list(__isl_keep isl_basic_set *bset,
-	int n_vertices, struct isl_vertex_list *list)
-{
-	int i;
-	struct isl_vertex_list *next;
-	isl_vertices *vertices;
-
-	vertices = isl_calloc_type(bset->ctx, isl_vertices);
-	if (!vertices)
-		goto error;
-	vertices->ref = 1;
-	vertices->bset = isl_basic_set_copy(bset);
-	vertices->v = isl_alloc_array(bset->ctx, struct isl_vertex, n_vertices);
-	if (!vertices->v)
-		goto error;
-	vertices->n_vertices = n_vertices;
-
-	for (i = 0; list; list = next, i++) {
-		next = list->next;
-		vertices->v[i] = list->v;
-		free(list);
-	}
-
-	return vertices;
-error:
-	free(vertices);
-	free_vertex_list(list);
-	return NULL;
-}
-
-/* Prepend a vertex to the linked list "list" based on the equalities in "tab".
- */
-static int add_vertex(struct isl_vertex_list **list,
-	__isl_keep isl_basic_set *bset, struct isl_tab *tab)
-{
-	unsigned nvar;
-	unsigned nparam;
-	struct isl_vertex_list *v = NULL;
-
-	if (isl_tab_detect_implicit_equalities(tab) < 0)
-		return -1;
-
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-
-	v = isl_calloc_type(tab->mat->ctx, struct isl_vertex_list);
-	if (!v)
-		goto error;
-
-	v->v.vertex = isl_basic_set_copy(bset);
-	v->v.vertex = isl_basic_set_cow(v->v.vertex);
-	v->v.vertex = isl_basic_set_update_from_tab(v->v.vertex, tab);
-	v->v.vertex = isl_basic_set_simplify(v->v.vertex);
-	v->v.vertex = isl_basic_set_finalize(v->v.vertex);
-	if (!v->v.vertex)
-		goto error;
-	isl_assert(bset->ctx, v->v.vertex->n_eq >= nvar, goto error);
-	v->v.dom = isl_basic_set_copy(v->v.vertex);
-	v->v.dom = isl_basic_set_project_out(v->v.dom, isl_dim_set, 0, nvar);
-	if (!v->v.dom)
-		goto error;
-
-	v->next = *list;
-	*list = v;
-
-	return 0;
-error:
-	free_vertex_list(v);
-	return -1;
-}
-
-/* Compute the parametric vertices and the chamber decomposition
- * of an empty parametric polytope.
- */
-static __isl_give isl_vertices *vertices_empty(__isl_keep isl_basic_set *bset)
-{
-	isl_vertices *vertices;
-	unsigned nparam;
-
-	if (!bset)
-		return NULL;
-
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-
-	vertices = isl_calloc_type(bset->ctx, isl_vertices);
-	if (!vertices)
-		return NULL;
-	vertices->bset = isl_basic_set_copy(bset);
-	vertices->ref = 1;
-
-	vertices->n_vertices = 0;
-	vertices->n_chambers = 0;
-
-	return vertices;
-}
-
-/* Compute the parametric vertices and the chamber decomposition
- * of the parametric polytope defined using the same constraints
- * as "bset" in the 0D case.
- * There is exactly one 0D vertex and a single chamber containing
- * the vertex.
- */
-static __isl_give isl_vertices *vertices_0D(__isl_keep isl_basic_set *bset)
-{
-	isl_vertices *vertices;
-	unsigned nparam;
-
-	if (!bset)
-		return NULL;
-
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-
-	vertices = isl_calloc_type(bset->ctx, isl_vertices);
-	if (!vertices)
-		return NULL;
-	vertices->ref = 1;
-	vertices->bset = isl_basic_set_copy(bset);
-
-	vertices->v = isl_calloc_array(bset->ctx, struct isl_vertex, 1);
-	if (!vertices->v)
-		goto error;
-	vertices->n_vertices = 1;
-	vertices->v[0].vertex = isl_basic_set_copy(bset);
-	if (!vertices->v[0].vertex)
-		goto error;
-
-	vertices->c = isl_calloc_array(bset->ctx, struct isl_chamber, 1);
-	if (!vertices->c)
-		goto error;
-	vertices->n_chambers = 1;
-	vertices->c[0].n_vertices = 1;
-	vertices->c[0].vertices = isl_calloc_array(bset->ctx, int, 1);
-	if (!vertices->c[0].vertices)
-		goto error;
-	vertices->c[0].dom = isl_basic_set_copy(bset);
-	if (!vertices->c[0].dom)
-		goto error;
-
-	return vertices;
-error:
-	isl_vertices_free(vertices);
-	return NULL;
-}
-
-static int isl_mat_rank(__isl_keep isl_mat *mat)
-{
-	int row, col;
-	isl_mat *H;
-
-	H = isl_mat_left_hermite(isl_mat_copy(mat), 0, NULL, NULL);
-	if (!H)
-		return -1;
-
-	for (col = 0; col < H->n_col; ++col) {
-		for (row = 0; row < H->n_row; ++row)
-			if (!isl_int_is_zero(H->row[row][col]))
-				break;
-		if (row == H->n_row)
-			break;
-	}
-
-	isl_mat_free(H);
-
-	return col;
-}
-
-/* Is the row pointed to by "f" linearly independent of the "n" first
- * rows in "facets"?
- */
-static int is_independent(__isl_keep isl_mat *facets, int n, isl_int *f)
-{
-	int rank;
-
-	if (isl_seq_first_non_zero(f, facets->n_col) < 0)
-		return 0;
-
-	isl_seq_cpy(facets->row[n], f, facets->n_col);
-	facets->n_row = n + 1;
-	rank = isl_mat_rank(facets);
-	if (rank < 0)
-		return -1;
-
-	return rank == n + 1;
-}
-
-/* Check whether we can select constraint "level", given the current selection
- * reflected by facets in "tab", the rows of "facets" and the earlier
- * "selected" elements of "selection".
- *
- * If the constraint is (strictly) redundant in the tableau, selecting it would
- * result in an empty tableau, so it can't be selected.
- * If the set variable part of the constraint is not linearly indepedent
- * of the set variable parts of the already selected constraints,
- * the constraint cannot be selected.
- * If selecting the constraint results in an empty tableau, the constraint
- * cannot be selected.
- * Finally, if selecting the constraint results in some explicitly
- * deselected constraints turning into equalities, then the corresponding
- * vertices have already been generated, so the constraint cannot be selected.
- */
-static int can_select(__isl_keep isl_basic_set *bset, int level,
-	struct isl_tab *tab, __isl_keep isl_mat *facets, int selected,
-	int *selection)
-{
-	int i;
-	int indep;
-	unsigned ovar;
-	struct isl_tab_undo *snap;
-
-	if (isl_tab_is_redundant(tab, level))
-		return 0;
-
-	ovar = isl_dim_offset(bset->dim, isl_dim_set);
-
-	indep = is_independent(facets, selected, bset->ineq[level] + 1 + ovar);
-	if (indep < 0)
-		return -1;
-	if (!indep)
-		return 0;
-
-	snap = isl_tab_snap(tab);
-	if (isl_tab_select_facet(tab, level) < 0)
-		return -1;
-
-	if (tab->empty) {
-		if (isl_tab_rollback(tab, snap) < 0)
-			return -1;
-		return 0;
-	}
-
-	for (i = 0; i < level; ++i) {
-		int sgn;
-
-		if (selection[i] != DESELECTED)
-			continue;
-
-		if (isl_tab_is_equality(tab, i))
-			sgn = 0;
-		else if (isl_tab_is_redundant(tab, i))
-			sgn = 1;
-		else
-			sgn = isl_tab_sign_of_max(tab, i);
-		if (sgn < -1)
-			return -1;
-		if (sgn <= 0) {
-			if (isl_tab_rollback(tab, snap) < 0)
-				return -1;
-			return 0;
-		}
-	}
-
-	return 1;
-}
-
-/* Compute the parametric vertices and the chamber decomposition
- * of a parametric polytope that is not full-dimensional.
- *
- * Simply map the parametric polytope to a lower dimensional space
- * and map the resulting vertices back.
- */
-static __isl_give isl_vertices *lower_dim_vertices(
-	__isl_keep isl_basic_set *bset)
-{
-	isl_morph *morph;
-	isl_vertices *vertices;
-
-	bset = isl_basic_set_copy(bset);
-	morph = isl_basic_set_full_compression(bset);
-	bset = isl_morph_basic_set(isl_morph_copy(morph), bset);
-
-	vertices = isl_basic_set_compute_vertices(bset);
-	isl_basic_set_free(bset);
-
-	morph = isl_morph_inverse(morph);
-
-	vertices = isl_morph_vertices(morph, vertices);
-
-	return vertices;
-}
-
-/* Compute the parametric vertices and the chamber decomposition
- * of the parametric polytope defined using the same constraints
- * as "bset".  "bset" is assumed to have no existentially quantified
- * variables.
- *
- * The vertices themselves are computed in a fairly simplistic way.
- * We simply run through all combinations of d constraints,
- * with d the number of set variables, and check if those d constraints
- * define a vertex.  To avoid the generation of duplicate vertices,
- * which we may happen if a vertex is defined by more that d constraints,
- * we make sure we only generate the vertex for the d constraints with
- * smallest index.
- *
- * We set up a tableau and keep track of which facets have been
- * selected.  The tableau is marked strict_redundant so that we can be
- * sure that any constraint that is marked redundant (and that is not
- * also marked zero) is not an equality.
- * If a constraint is marked DESELECTED, it means the constraint was
- * SELECTED before (in combination with the same selection of earlier
- * constraints).  If such a deselected constraint turns out to be an
- * equality, then any vertex that may still be found with the current
- * selection has already been generated when the constraint was selected.
- * A constraint is marked UNSELECTED when there is no way selecting
- * the constraint could lead to a vertex (in combination with the current
- * selection of earlier constraints).
- *
- * The set variable coefficients of the selected constraints are stored
- * in the facets matrix.
- */
-__isl_give isl_vertices *isl_basic_set_compute_vertices(
-	__isl_keep isl_basic_set *bset)
-{
-	struct isl_tab *tab;
-	int level;
-	int init;
-	unsigned nvar;
-	int *selection = NULL;
-	int selected;
-	struct isl_tab_undo **snap = NULL;
-	isl_mat *facets = NULL;
-	struct isl_vertex_list *list = NULL;
-	int n_vertices = 0;
-	isl_vertices *vertices;
-
-	if (!bset)
-		return NULL;
-
-	if (isl_basic_set_plain_is_empty(bset))
-		return vertices_empty(bset);
-
-	if (bset->n_eq != 0)
-		return lower_dim_vertices(bset);
-
-	isl_assert(bset->ctx, isl_basic_set_dim(bset, isl_dim_div) == 0,
-		return NULL);
-
-	if (isl_basic_set_dim(bset, isl_dim_set) == 0)
-		return vertices_0D(bset);
-
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-
-	bset = isl_basic_set_copy(bset);
-	bset = isl_basic_set_set_rational(bset);
-	if (!bset)
-		return NULL;
-
-	tab = isl_tab_from_basic_set(bset);
-	if (!tab)
-		goto error;
-	tab->strict_redundant = 1;
-
-	if (tab->empty)	{
-		vertices = vertices_empty(bset);
-		isl_basic_set_free(bset);
-		isl_tab_free(tab);
-		return vertices;
-	}
-
-	selection = isl_alloc_array(bset->ctx, int, bset->n_ineq);
-	snap = isl_alloc_array(bset->ctx, struct isl_tab_undo *, bset->n_ineq);
-	facets = isl_mat_alloc(bset->ctx, nvar, nvar);
-	if (!selection || !snap || !facets)
-		goto error;
-
-	level = 0;
-	init = 1;
-	selected = 0;
-
-	while (level >= 0) {
-		if (level >= bset->n_ineq ||
-		    (!init && selection[level] != SELECTED)) {
-			--level;
-			init = 0;
-			continue;
-		}
-		if (init) {
-			int ok;
-			snap[level] = isl_tab_snap(tab);
-			ok = can_select(bset, level, tab, facets, selected,
-					selection);
-			if (ok < 0)
-				goto error;
-			if (ok) {
-				selection[level] = SELECTED;
-				selected++;
-			} else
-				selection[level] = UNSELECTED;
-		} else {
-			selection[level] = DESELECTED;
-			selected--;
-			if (isl_tab_rollback(tab, snap[level]) < 0)
-				goto error;
-		}
-		if (selected == nvar) {
-			if (tab->n_dead == nvar) {
-				if (add_vertex(&list, bset, tab) < 0)
-					goto error;
-				n_vertices++;
-			}
-			init = 0;
-			continue;
-		}
-		++level;
-		init = 1;
-	}
-
-	isl_mat_free(facets);
-	free(selection);
-	free(snap);
-
-	isl_tab_free(tab);
-
-	vertices = vertices_from_list(bset, n_vertices, list);
-
-	vertices = compute_chambers(bset, vertices);
-
-	return vertices;
-error:
-	isl_mat_free(facets);
-	free(selection);
-	free(snap);
-	isl_tab_free(tab);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-struct isl_chamber_list {
-	struct isl_chamber c;
-	struct isl_chamber_list *next;
-};
-
-static void free_chamber_list(struct isl_chamber_list *list)
-{
-	struct isl_chamber_list *next;
-
-	for (; list; list = next) {
-		next = list->next;
-		isl_basic_set_free(list->c.dom);
-		free(list->c.vertices);
-		free(list);
-	}
-}
-
-/* Check whether the basic set "bset" is a superset of the basic set described
- * by "tab", i.e., check whether all constraints of "bset" are redundant.
- */
-static int bset_covers_tab(__isl_keep isl_basic_set *bset, struct isl_tab *tab)
-{
-	int i;
-
-	if (!bset || !tab)
-		return -1;
-
-	for (i = 0; i < bset->n_ineq; ++i) {
-		enum isl_ineq_type type = isl_tab_ineq_type(tab, bset->ineq[i]);
-		switch (type) {
-		case isl_ineq_error:		return -1;
-		case isl_ineq_redundant:	continue;
-		default:			return 0;
-		}
-	}
-
-	return 1;
-}
-
-static __isl_give isl_vertices *vertices_add_chambers(
-	__isl_take isl_vertices *vertices, int n_chambers,
-	struct isl_chamber_list *list)
-{
-	int i;
-	isl_ctx *ctx;
-	struct isl_chamber_list *next;
-
-	ctx = isl_vertices_get_ctx(vertices);
-	vertices->c = isl_alloc_array(ctx, struct isl_chamber, n_chambers);
-	if (!vertices->c)
-		goto error;
-	vertices->n_chambers = n_chambers;
-
-	for (i = 0; list; list = next, i++) {
-		next = list->next;
-		vertices->c[i] = list->c;
-		free(list);
-	}
-
-	return vertices;
-error:
-	isl_vertices_free(vertices);
-	free_chamber_list(list);
-	return NULL;
-}
-
-/* Can "tab" be intersected with "bset" without resulting in
- * a lower-dimensional set.
- */
-static int can_intersect(struct isl_tab *tab, __isl_keep isl_basic_set *bset)
-{
-	int i;
-	struct isl_tab_undo *snap;
-
-	if (isl_tab_extend_cons(tab, bset->n_ineq) < 0)
-		return -1;
-
-	snap = isl_tab_snap(tab);
-
-	for (i = 0; i < bset->n_ineq; ++i) {
-		if (isl_tab_ineq_type(tab, bset->ineq[i]) == isl_ineq_redundant)
-			continue;
-		if (isl_tab_add_ineq(tab, bset->ineq[i]) < 0)
-			return -1;
-	}
-
-	if (isl_tab_detect_implicit_equalities(tab) < 0)
-		return -1;
-	if (tab->n_dead) {
-		if (isl_tab_rollback(tab, snap) < 0)
-			return -1;
-		return 0;
-	}
-
-	return 1;
-}
-
-static int add_chamber(struct isl_chamber_list **list,
-	__isl_keep isl_vertices *vertices, struct isl_tab *tab, int *selection)
-{
-	int n_frozen;
-	int i, j;
-	int n_vertices = 0;
-	struct isl_tab_undo *snap;
-	struct isl_chamber_list *c = NULL;
-
-	for (i = 0; i < vertices->n_vertices; ++i)
-		if (selection[i])
-			n_vertices++;
-
-	snap = isl_tab_snap(tab);
-
-	for (i = 0; i < tab->n_con && tab->con[i].frozen; ++i)
-		tab->con[i].frozen = 0;
-	n_frozen = i;
-
-	if (isl_tab_detect_redundant(tab) < 0)
-		return -1;
-
-	c = isl_calloc_type(tab->mat->ctx, struct isl_chamber_list);
-	if (!c)
-		goto error;
-	c->c.vertices = isl_alloc_array(tab->mat->ctx, int, n_vertices);
-	if (!c->c.vertices)
-		goto error;
-	c->c.dom = isl_basic_set_from_basic_map(isl_basic_map_copy(tab->bmap));
-	c->c.dom = isl_basic_set_set_rational(c->c.dom);
-	c->c.dom = isl_basic_set_cow(c->c.dom);
-	c->c.dom = isl_basic_set_update_from_tab(c->c.dom, tab);
-	c->c.dom = isl_basic_set_simplify(c->c.dom);
-	c->c.dom = isl_basic_set_finalize(c->c.dom);
-	if (!c->c.dom)
-		goto error;
-
-	c->c.n_vertices = n_vertices;
-
-	for (i = 0, j = 0; i < vertices->n_vertices; ++i)
-		if (selection[i]) {
-			c->c.vertices[j] = i;
-			j++;
-		}
-
-	c->next = *list;
-	*list = c;
-
-	for (i = 0; i < n_frozen; ++i)
-		tab->con[i].frozen = 1;
-
-	if (isl_tab_rollback(tab, snap) < 0)
-		return -1;
-
-	return 0;
-error:
-	free_chamber_list(c);
-	return -1;
-}
-
-struct isl_facet_todo {
-	struct isl_tab *tab;	/* A tableau representation of the facet */
-	isl_basic_set *bset;    /* A normalized basic set representation */
-	isl_vec *constraint;	/* Constraint pointing to the other side */
-	struct isl_facet_todo *next;
-};
-
-static void free_todo(struct isl_facet_todo *todo)
-{
-	while (todo) {
-		struct isl_facet_todo *next = todo->next;
-
-		isl_tab_free(todo->tab);
-		isl_basic_set_free(todo->bset);
-		isl_vec_free(todo->constraint);
-		free(todo);
-
-		todo = next;
-	}
-}
-
-static struct isl_facet_todo *create_todo(struct isl_tab *tab, int con)
-{
-	int i;
-	int n_frozen;
-	struct isl_tab_undo *snap;
-	struct isl_facet_todo *todo;
-
-	snap = isl_tab_snap(tab);
-
-	for (i = 0; i < tab->n_con && tab->con[i].frozen; ++i)
-		tab->con[i].frozen = 0;
-	n_frozen = i;
-
-	if (isl_tab_detect_redundant(tab) < 0)
-		return NULL;
-
-	todo = isl_calloc_type(tab->mat->ctx, struct isl_facet_todo);
-	if (!todo)
-		return NULL;
-
-	todo->constraint = isl_vec_alloc(tab->mat->ctx, 1 + tab->n_var);
-	if (!todo->constraint)
-		goto error;
-	isl_seq_neg(todo->constraint->el, tab->bmap->ineq[con], 1 + tab->n_var);
-	todo->bset = isl_basic_set_from_basic_map(isl_basic_map_copy(tab->bmap));
-	todo->bset = isl_basic_set_set_rational(todo->bset);
-	todo->bset = isl_basic_set_cow(todo->bset);
-	todo->bset = isl_basic_set_update_from_tab(todo->bset, tab);
-	todo->bset = isl_basic_set_simplify(todo->bset);
-	todo->bset = isl_basic_set_sort_constraints(todo->bset);
-	if (!todo->bset)
-		goto error;
-	ISL_F_SET(todo->bset, ISL_BASIC_SET_NORMALIZED);
-	todo->tab = isl_tab_dup(tab);
-	if (!todo->tab)
-		goto error;
-
-	for (i = 0; i < n_frozen; ++i)
-		tab->con[i].frozen = 1;
-
-	if (isl_tab_rollback(tab, snap) < 0)
-		goto error;
-
-	return todo;
-error:
-	free_todo(todo);
-	return NULL;
-}
-
-/* Create todo items for all interior facets of the chamber represented
- * by "tab" and collect them in "next".
- */
-static int init_todo(struct isl_facet_todo **next, struct isl_tab *tab)
-{
-	int i;
-	struct isl_tab_undo *snap;
-	struct isl_facet_todo *todo;
-
-	snap = isl_tab_snap(tab);
-
-	for (i = 0; i < tab->n_con; ++i) {
-		if (tab->con[i].frozen)
-			continue;
-		if (tab->con[i].is_redundant)
-			continue;
-
-		if (isl_tab_select_facet(tab, i) < 0)
-			return -1;
-
-		todo = create_todo(tab, i);
-		if (!todo)
-			return -1;
-
-		todo->next = *next;
-		*next = todo;
-
-		if (isl_tab_rollback(tab, snap) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-/* Does the linked list contain a todo item that is the opposite of "todo".
- * If so, return 1 and remove the opposite todo item.
- */
-static int has_opposite(struct isl_facet_todo *todo,
-	struct isl_facet_todo **list)
-{
-	for (; *list; list = &(*list)->next) {
-		int eq;
-		eq = isl_basic_set_plain_is_equal(todo->bset, (*list)->bset);
-		if (eq < 0)
-			return -1;
-		if (!eq)
-			continue;
-		todo = *list;
-		*list = todo->next;
-		todo->next = NULL;
-		free_todo(todo);
-		return 1;
-	}
-
-	return 0;
-}
-
-/* Create todo items for all interior facets of the chamber represented
- * by "tab" and collect them in first->next, taking care to cancel
- * opposite todo items.
- */
-static int update_todo(struct isl_facet_todo *first, struct isl_tab *tab)
-{
-	int i;
-	struct isl_tab_undo *snap;
-	struct isl_facet_todo *todo;
-
-	snap = isl_tab_snap(tab);
-
-	for (i = 0; i < tab->n_con; ++i) {
-		int drop;
-
-		if (tab->con[i].frozen)
-			continue;
-		if (tab->con[i].is_redundant)
-			continue;
-
-		if (isl_tab_select_facet(tab, i) < 0)
-			return -1;
-
-		todo = create_todo(tab, i);
-		if (!todo)
-			return -1;
-
-		drop = has_opposite(todo, &first->next);
-		if (drop < 0)
-			return -1;
-
-		if (drop)
-			free_todo(todo);
-		else {
-			todo->next = first->next;
-			first->next = todo;
-		}
-
-		if (isl_tab_rollback(tab, snap) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-/* Compute the chamber decomposition of the parametric polytope respresented
- * by "bset" given the parametric vertices and their activity domains.
- *
- * We are only interested in full-dimensional chambers.
- * Each of these chambers is the intersection of the activity domains of
- * one or more vertices and the union of all chambers is equal to the
- * projection of the entire parametric polytope onto the parameter space.
- *
- * We first create an initial chamber by intersecting as many activity
- * domains as possible without ending up with an empty or lower-dimensional
- * set.  As a minor optimization, we only consider those activity domains
- * that contain some arbitrary point.
- *
- * For each of interior facets of the chamber, we construct a todo item,
- * containing the facet and a constraint containing the other side of the facet,
- * for constructing the chamber on the other side.
- * While their are any todo items left, we pick a todo item and
- * create the required chamber by intersecting all activity domains
- * that contain the facet and have a full-dimensional intersection with
- * the other side of the facet.  For each of the interior facets, we
- * again create todo items, taking care to cancel opposite todo items.
- */
-static __isl_give isl_vertices *compute_chambers(__isl_take isl_basic_set *bset,
-	__isl_take isl_vertices *vertices)
-{
-	int i;
-	isl_ctx *ctx;
-	isl_vec *sample = NULL;
-	struct isl_tab *tab = NULL;
-	struct isl_tab_undo *snap;
-	unsigned nvar;
-	int *selection = NULL;
-	int n_chambers = 0;
-	struct isl_chamber_list *list = NULL;
-	struct isl_facet_todo *todo = NULL;
-
-	if (!bset || !vertices)
-		goto error;
-
-	ctx = isl_vertices_get_ctx(vertices);
-	selection = isl_alloc_array(ctx, int, vertices->n_vertices);
-	if (!selection)
-		goto error;
-
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 0, nvar);
-
-	tab = isl_tab_from_basic_set(bset);
-	for (i = 0; i < bset->n_ineq; ++i)
-		if (isl_tab_freeze_constraint(tab, i) < 0)
-			goto error;
-	if (isl_tab_track_bset(tab, bset) < 0)
-		goto error;
-
-	snap = isl_tab_snap(tab);
-
-	sample = isl_tab_get_sample_value(tab);
-
-	for (i = 0; i < vertices->n_vertices; ++i) {
-		selection[i] = isl_basic_set_contains(vertices->v[i].dom, sample);
-		if (selection[i] < 0)
-			goto error;
-		if (!selection[i])
-			continue;
-		selection[i] = can_intersect(tab, vertices->v[i].dom);
-		if (selection[i] < 0)
-			goto error;
-	}
-
-	if (isl_tab_detect_redundant(tab) < 0)
-		goto error;
-
-	if (add_chamber(&list, vertices, tab, selection) < 0)
-		goto error;
-	n_chambers++;
-
-	if (init_todo(&todo, tab) < 0)
-		goto error;
-
-	while (todo) {
-		struct isl_facet_todo *next;
-
-		if (isl_tab_rollback(tab, snap) < 0)
-			goto error;
-
-		if (isl_tab_add_ineq(tab, todo->constraint->el) < 0)
-			goto error;
-		if (isl_tab_freeze_constraint(tab, tab->n_con - 1) < 0)
-			goto error;
-
-		for (i = 0; i < vertices->n_vertices; ++i) {
-			selection[i] = bset_covers_tab(vertices->v[i].dom,
-							todo->tab);
-			if (selection[i] < 0)
-				goto error;
-			if (!selection[i])
-				continue;
-			selection[i] = can_intersect(tab, vertices->v[i].dom);
-			if (selection[i] < 0)
-				goto error;
-		}
-
-		if (isl_tab_detect_redundant(tab) < 0)
-			goto error;
-
-		if (add_chamber(&list, vertices, tab, selection) < 0)
-			goto error;
-		n_chambers++;
-
-		if (update_todo(todo, tab) < 0)
-			goto error;
-
-		next = todo->next;
-		todo->next = NULL;
-		free_todo(todo);
-		todo = next;
-	}
-
-	isl_vec_free(sample);
-
-	isl_tab_free(tab);
-	free(selection);
-
-	vertices = vertices_add_chambers(vertices, n_chambers, list);
-
-	for (i = 0; vertices && i < vertices->n_vertices; ++i) {
-		isl_basic_set_free(vertices->v[i].dom);
-		vertices->v[i].dom = NULL;
-	}
-
-	return vertices;
-error:
-	free_chamber_list(list);
-	free_todo(todo);
-	isl_vec_free(sample);
-	isl_tab_free(tab);
-	free(selection);
-	if (!tab)
-		isl_basic_set_free(bset);
-	isl_vertices_free(vertices);
-	return NULL;
-}
-
-isl_ctx *isl_vertex_get_ctx(__isl_keep isl_vertex *vertex)
-{
-	return vertex ? isl_vertices_get_ctx(vertex->vertices) : NULL;
-}
-
-int isl_vertex_get_id(__isl_keep isl_vertex *vertex)
-{
-	return vertex ? vertex->id : -1;
-}
-
-__isl_give isl_basic_set *isl_vertex_get_domain(__isl_keep isl_vertex *vertex)
-{
-	struct isl_vertex *v;
-
-	if (!vertex)
-		return NULL;
-
-	v = &vertex->vertices->v[vertex->id];
-	if (!v->dom) {
-		unsigned nvar;
-		nvar = isl_basic_set_dim(v->vertex, isl_dim_set);
-		v->dom = isl_basic_set_copy(v->vertex);
-		v->dom = isl_basic_set_project_out(v->dom, isl_dim_set, 0, nvar);
-	}
-
-	return isl_basic_set_copy(v->dom);
-}
-
-__isl_give isl_basic_set *isl_vertex_get_expr(__isl_keep isl_vertex *vertex)
-{
-	struct isl_vertex *v;
-
-	if (!vertex)
-		return NULL;
-
-	v = &vertex->vertices->v[vertex->id];
-
-	return isl_basic_set_copy(v->vertex);
-}
-
-static __isl_give isl_vertex *isl_vertex_alloc(__isl_take isl_vertices *vertices,
-	int id)
-{
-	isl_ctx *ctx;
-	isl_vertex *vertex;
-
-	if (!vertices)
-		return NULL;
-
-	ctx = isl_vertices_get_ctx(vertices);
-	vertex = isl_alloc_type(ctx, isl_vertex);
-	if (!vertex)
-		goto error;
-
-	vertex->vertices = vertices;
-	vertex->id = id;
-
-	return vertex;
-error:
-	isl_vertices_free(vertices);
-	return NULL;
-}
-
-void isl_vertex_free(__isl_take isl_vertex *vertex)
-{
-	if (!vertex)
-		return;
-	isl_vertices_free(vertex->vertices);
-	free(vertex);
-}
-
-__isl_give isl_basic_set *isl_basic_set_set_integral(__isl_take isl_basic_set *bset)
-{
-	if (!bset)
-		return NULL;
-
-	if (!ISL_F_ISSET(bset, ISL_BASIC_MAP_RATIONAL))
-		return bset;
-
-	bset = isl_basic_set_cow(bset);
-	if (!bset)
-		return NULL;
-
-	ISL_F_CLR(bset, ISL_BASIC_MAP_RATIONAL);
-
-	return isl_basic_set_finalize(bset);
-}
-
-isl_ctx *isl_cell_get_ctx(__isl_keep isl_cell *cell)
-{
-	return cell ? cell->dom->ctx : NULL;
-}
-
-__isl_give isl_basic_set *isl_cell_get_domain(__isl_keep isl_cell *cell)
-{
-	return cell ? isl_basic_set_copy(cell->dom) : NULL;
-}
-
-static __isl_give isl_cell *isl_cell_alloc(__isl_take isl_vertices *vertices,
-	__isl_take isl_basic_set *dom, int id)
-{
-	int i;
-	isl_cell *cell = NULL;
-
-	if (!vertices || !dom)
-		goto error;
-
-	cell = isl_calloc_type(dom->ctx, isl_cell);
-	if (!cell)
-		goto error;
-
-	cell->n_vertices = vertices->c[id].n_vertices;
-	cell->ids = isl_alloc_array(dom->ctx, int, cell->n_vertices);
-	if (!cell->ids)
-		goto error;
-	for (i = 0; i < cell->n_vertices; ++i)
-		cell->ids[i] = vertices->c[id].vertices[i];
-	cell->vertices = vertices;
-	cell->dom = dom;
-
-	return cell;
-error:
-	isl_cell_free(cell);
-	isl_vertices_free(vertices);
-	isl_basic_set_free(dom);
-	return NULL;
-}
-
-void isl_cell_free(__isl_take isl_cell *cell)
-{
-	if (!cell)
-		return;
-
-	isl_vertices_free(cell->vertices);
-	free(cell->ids);
-	isl_basic_set_free(cell->dom);
-	free(cell);
-}
-
-/* Create a tableau of the cone obtained by first homogenizing the given
- * polytope and then making all inequalities strict by setting the
- * constant term to -1.
- */
-static struct isl_tab *tab_for_shifted_cone(__isl_keep isl_basic_set *bset)
-{
-	int i;
-	isl_vec *c = NULL;
-	struct isl_tab *tab;
-
-	if (!bset)
-		return NULL;
-	tab = isl_tab_alloc(bset->ctx, bset->n_ineq + 1,
-			    1 + isl_basic_set_total_dim(bset), 0);
-	if (!tab)
-		return NULL;
-	tab->rational = ISL_F_ISSET(bset, ISL_BASIC_SET_RATIONAL);
-	if (ISL_F_ISSET(bset, ISL_BASIC_MAP_EMPTY)) {
-		if (isl_tab_mark_empty(tab) < 0)
-			goto error;
-		return tab;
-	}
-
-	c = isl_vec_alloc(bset->ctx, 1 + 1 + isl_basic_set_total_dim(bset));
-	if (!c)
-		goto error;
-
-	isl_int_set_si(c->el[0], 0);
-	for (i = 0; i < bset->n_eq; ++i) {
-		isl_seq_cpy(c->el + 1, bset->eq[i], c->size - 1);
-		if (isl_tab_add_eq(tab, c->el) < 0)
-			goto error;
-	}
-
-	isl_int_set_si(c->el[0], -1);
-	for (i = 0; i < bset->n_ineq; ++i) {
-		isl_seq_cpy(c->el + 1, bset->ineq[i], c->size - 1);
-		if (isl_tab_add_ineq(tab, c->el) < 0)
-			goto error;
-		if (tab->empty) {
-			isl_vec_free(c);
-			return tab;
-		}
-	}
-
-	isl_seq_clr(c->el + 1, c->size - 1);
-	isl_int_set_si(c->el[1], 1);
-	if (isl_tab_add_ineq(tab, c->el) < 0)
-		goto error;
-
-	isl_vec_free(c);
-	return tab;
-error:
-	isl_vec_free(c);
-	isl_tab_free(tab);
-	return NULL;
-}
-
-/* Compute an interior point of "bset" by selecting an interior
- * point in homogeneous space and projecting the point back down.
- */
-static __isl_give isl_vec *isl_basic_set_interior_point(
-	__isl_keep isl_basic_set *bset)
-{
-	isl_vec *vec;
-	struct isl_tab *tab;
-
-	tab = tab_for_shifted_cone(bset);
-	vec = isl_tab_get_sample_value(tab);
-	isl_tab_free(tab);
-	if (!vec)
-		return NULL;
-
-	isl_seq_cpy(vec->el, vec->el + 1, vec->size - 1);
-	vec->size--;
-
-	return vec;
-}
-
-/* Call "fn" on all chambers of the parametric polytope with the shared
- * facets of neighboring chambers only appearing in one of the chambers.
- *
- * We pick an interior point from one of the chambers and then make
- * all constraints that do not satisfy this point strict.
- */
-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;
-	isl_vec *vec;
-	isl_int v;
-	isl_cell *cell;
-
-	if (!vertices)
-		return -1;
-
-	if (vertices->n_chambers == 0)
-		return 0;
-
-	if (vertices->n_chambers == 1) {
-		isl_basic_set *dom = isl_basic_set_copy(vertices->c[0].dom);
-		dom = isl_basic_set_set_integral(dom);
-		cell = isl_cell_alloc(isl_vertices_copy(vertices), dom, 0);
-		if (!cell)
-			return -1;
-		return fn(cell, user);
-	}
-
-	vec = isl_basic_set_interior_point(vertices->c[0].dom);
-	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);
-		}
-		dom = isl_basic_set_set_integral(dom);
-		cell = isl_cell_alloc(isl_vertices_copy(vertices), dom, i);
-		if (!cell)
-			goto error;
-		r = fn(cell, user);
-		if (r < 0)
-			goto error;
-	}
-
-	isl_int_clear(v);
-	isl_vec_free(vec);
-
-	return 0;
-error:
-	isl_int_clear(v);
-	isl_vec_free(vec);
-	return -1;
-}
-
-int isl_vertices_foreach_cell(__isl_keep isl_vertices *vertices,
-	int (*fn)(__isl_take isl_cell *cell, void *user), void *user)
-{
-	int i;
-	isl_cell *cell;
-
-	if (!vertices)
-		return -1;
-
-	if (vertices->n_chambers == 0)
-		return 0;
-
-	for (i = 0; i < vertices->n_chambers; ++i) {
-		int r;
-		isl_basic_set *dom = isl_basic_set_copy(vertices->c[i].dom);
-
-		cell = isl_cell_alloc(isl_vertices_copy(vertices), dom, i);
-		if (!cell)
-			return -1;
-
-		r = fn(cell, user);
-		if (r < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-int isl_vertices_foreach_vertex(__isl_keep isl_vertices *vertices,
-	int (*fn)(__isl_take isl_vertex *vertex, void *user), void *user)
-{
-	int i;
-	isl_vertex *vertex;
-
-	if (!vertices)
-		return -1;
-
-	if (vertices->n_vertices == 0)
-		return 0;
-
-	for (i = 0; i < vertices->n_vertices; ++i) {
-		int r;
-
-		vertex = isl_vertex_alloc(isl_vertices_copy(vertices), i);
-		if (!vertex)
-			return -1;
-
-		r = fn(vertex, user);
-		if (r < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-int isl_cell_foreach_vertex(__isl_keep isl_cell *cell,
-	int (*fn)(__isl_take isl_vertex *vertex, void *user), void *user)
-{
-	int i;
-	isl_vertex *vertex;
-
-	if (!cell)
-		return -1;
-
-	if (cell->n_vertices == 0)
-		return 0;
-
-	for (i = 0; i < cell->n_vertices; ++i) {
-		int r;
-
-		vertex = isl_vertex_alloc(isl_vertices_copy(cell->vertices),
-					  cell->ids[i]);
-		if (!vertex)
-			return -1;
-
-		r = fn(vertex, user);
-		if (r < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-isl_ctx *isl_vertices_get_ctx(__isl_keep isl_vertices *vertices)
-{
-	return vertices ? vertices->bset->ctx : NULL;
-}
-
-int isl_vertices_get_n_vertices(__isl_keep isl_vertices *vertices)
-{
-	return vertices ? vertices->n_vertices : -1;
-}
-
-__isl_give isl_vertices *isl_morph_vertices(__isl_take isl_morph *morph,
-	__isl_take isl_vertices *vertices)
-{
-	int i;
-	isl_morph *param_morph = NULL;
-
-	if (!morph || !vertices)
-		goto error;
-
-	isl_assert(vertices->bset->ctx, vertices->ref == 1, goto error);
-
-	param_morph = isl_morph_copy(morph);
-	param_morph = isl_morph_remove_dom_dims(param_morph, isl_dim_set,
-				    0, isl_morph_dom_dim(morph, isl_dim_set));
-	param_morph = isl_morph_remove_ran_dims(param_morph, isl_dim_set,
-				    0, isl_morph_ran_dim(morph, isl_dim_set));
-
-	for (i = 0; i < vertices->n_vertices; ++i) {
-		vertices->v[i].dom = isl_morph_basic_set(
-			isl_morph_copy(param_morph), vertices->v[i].dom);
-		vertices->v[i].vertex = isl_morph_basic_set(
-			isl_morph_copy(morph), vertices->v[i].vertex);
-		if (!vertices->v[i].vertex)
-			goto error;
-	}
-
-	for (i = 0; i < vertices->n_chambers; ++i) {
-		vertices->c[i].dom = isl_morph_basic_set(
-			isl_morph_copy(param_morph), vertices->c[i].dom);
-		if (!vertices->c[i].dom)
-			goto error;
-	}
-
-	isl_morph_free(param_morph);
-	isl_morph_free(morph);
-	return vertices;
-error:
-	isl_morph_free(param_morph);
-	isl_morph_free(morph);
-	isl_vertices_free(vertices);
-	return NULL;
-}
-
-/* Construct a simplex isl_cell spanned by the vertices with indices in
- * "simplex_ids" and "other_ids" and call "fn" on this isl_cell.
- */
-static int call_on_simplex(__isl_keep isl_cell *cell,
-	int *simplex_ids, int n_simplex, int *other_ids, int n_other,
-	int (*fn)(__isl_take isl_cell *simplex, void *user), void *user)
-{
-	int i;
-	isl_ctx *ctx;
-	struct isl_cell *simplex;
-
-	ctx = isl_cell_get_ctx(cell);
-
-	simplex = isl_calloc_type(ctx, struct isl_cell);
-	if (!simplex)
-		return -1;
-	simplex->vertices = isl_vertices_copy(cell->vertices);
-	if (!simplex->vertices)
-		goto error;
-	simplex->dom = isl_basic_set_copy(cell->dom);
-	if (!simplex->dom)
-		goto error;
-	simplex->n_vertices = n_simplex + n_other;
-	simplex->ids = isl_alloc_array(ctx, int, simplex->n_vertices);
-	if (!simplex->ids)
-		goto error;
-
-	for (i = 0; i < n_simplex; ++i)
-		simplex->ids[i] = simplex_ids[i];
-	for (i = 0; i < n_other; ++i)
-		simplex->ids[n_simplex + i] = other_ids[i];
-
-	return fn(simplex, user);
-error:
-	isl_cell_free(simplex);
-	return -1;
-}
-
-/* Check whether the parametric vertex described by "vertex"
- * lies on the facet corresponding to constraint "facet" of "bset".
- * The isl_vec "v" is a temporary vector than can be used by this function.
- *
- * We eliminate the variables from the facet constraint using the
- * equalities defining the vertex and check if the result is identical
- * to zero.
- *
- * It would probably be better to keep track of the constraints defining
- * a vertex during the vertex construction so that we could simply look
- * it up here.
- */
-static int vertex_on_facet(__isl_keep isl_basic_set *vertex,
-	__isl_keep isl_basic_set *bset, int facet, __isl_keep isl_vec *v)
-{
-	int i;
-	isl_int m;
-
-	isl_seq_cpy(v->el, bset->ineq[facet], v->size);
-
-	isl_int_init(m);
-	for (i = 0; i < vertex->n_eq; ++i) {
-		int k = isl_seq_last_non_zero(vertex->eq[i], v->size);
-		isl_seq_elim(v->el, vertex->eq[i], k, v->size, &m);
-	}
-	isl_int_clear(m);
-
-	return isl_seq_first_non_zero(v->el, v->size) == -1;
-}
-
-/* Triangulate the polytope spanned by the vertices with ids
- * in "simplex_ids" and "other_ids" and call "fn" on each of
- * the resulting simplices.
- * If the input polytope is already a simplex, we simply call "fn".
- * Otherwise, we pick a point from "other_ids" and add it to "simplex_ids".
- * Then we consider each facet of "bset" that does not contain the point
- * we just picked, but does contain some of the other points in "other_ids"
- * and call ourselves recursively on the polytope spanned by the new
- * "simplex_ids" and those points in "other_ids" that lie on the facet.
- */
-static int triangulate(__isl_keep isl_cell *cell, __isl_keep isl_vec *v,
-	int *simplex_ids, int n_simplex, int *other_ids, int n_other,
-	int (*fn)(__isl_take isl_cell *simplex, void *user), void *user)
-{
-	int i, j, k;
-	int d, nparam;
-	int *ids;
-	isl_ctx *ctx;
-	isl_basic_set *vertex;
-	isl_basic_set *bset;
-
-	ctx = isl_cell_get_ctx(cell);
-	d = isl_basic_set_dim(cell->vertices->bset, isl_dim_set);
-	nparam = isl_basic_set_dim(cell->vertices->bset, isl_dim_param);
-
-	if (n_simplex + n_other == d + 1)
-		return call_on_simplex(cell, simplex_ids, n_simplex,
-				       other_ids, n_other, fn, user);
-
-	simplex_ids[n_simplex] = other_ids[0];
-	vertex = cell->vertices->v[other_ids[0]].vertex;
-	bset = cell->vertices->bset;
-
-	ids = isl_alloc_array(ctx, int, n_other - 1);
-	for (i = 0; i < bset->n_ineq; ++i) {
-		if (isl_seq_first_non_zero(bset->ineq[i] + 1 + nparam, d) == -1)
-			continue;
-		if (vertex_on_facet(vertex, bset, i, v))
-			continue;
-
-		for (j = 1, k = 0; j < n_other; ++j) {
-			isl_basic_set *ov;
-			ov = cell->vertices->v[other_ids[j]].vertex;
-			if (vertex_on_facet(ov, bset, i, v))
-				ids[k++] = other_ids[j];
-		}
-		if (k == 0)
-			continue;
-
-		if (triangulate(cell, v, simplex_ids, n_simplex + 1,
-				ids, k, fn, user) < 0)
-			goto error;
-	}
-	free(ids);
-
-	return 0;
-error:
-	free(ids);
-	return -1;
-}
-
-/* Triangulate the given cell and call "fn" on each of the resulting
- * simplices.
- */
-int isl_cell_foreach_simplex(__isl_take isl_cell *cell,
-	int (*fn)(__isl_take isl_cell *simplex, void *user), void *user)
-{
-	int d, total;
-	int r;
-	isl_ctx *ctx;
-	isl_vec *v = NULL;
-	int *simplex_ids = NULL;
-
-	if (!cell)
-		return -1;
-
-	d = isl_basic_set_dim(cell->vertices->bset, isl_dim_set);
-	total = isl_basic_set_total_dim(cell->vertices->bset);
-
-	if (cell->n_vertices == d + 1)
-		return fn(cell, user);
-
-	ctx = isl_cell_get_ctx(cell);
-	simplex_ids = isl_alloc_array(ctx, int, d + 1);
-	if (!simplex_ids)
-		goto error;
-
-	v = isl_vec_alloc(ctx, 1 + total);
-	if (!v)
-		goto error;
-
-	r = triangulate(cell, v, simplex_ids, 0,
-			cell->ids, cell->n_vertices, fn, user);
-
-	isl_vec_free(v);
-	free(simplex_ids);
-
-	isl_cell_free(cell);
-
-	return r;
-error:
-	free(simplex_ids);
-	isl_vec_free(v);
-	isl_cell_free(cell);
-	return -1;
-}
diff --git a/cloog-0.16.3/isl/isl_vertices_private.h b/cloog-0.16.3/isl/isl_vertices_private.h
deleted file mode 100644
index 7c707fd..0000000
--- a/cloog-0.16.3/isl/isl_vertices_private.h
+++ /dev/null
@@ -1,64 +0,0 @@
-#include <isl/set.h>
-#include <isl/vertices.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_morph;
-
-/* A parametric vertex.  "vertex" contains the actual description
- * of the vertex as a singleton parametric set.  "dom" is the projection
- * of "vertex" onto the parameter space, i.e., the activity domain
- * of the vertex.
- */
-struct isl_vertex {
-	isl_basic_set *dom;
-	isl_basic_set *vertex;
-};
-
-/* A chamber in the chamber decomposition.  The indices of the "n_vertices"
- * active vertices are stored in "vertices".
- */
-struct isl_chamber {
-	int n_vertices;
-	int *vertices;
-	isl_basic_set *dom;
-};
-
-struct isl_vertices {
-	int ref;
-
-	/* The rational basic set spanned by the vertices. */
-	isl_basic_set *bset;
-
-	int n_vertices;
-	struct isl_vertex *v;
-
-	int n_chambers;
-	struct isl_chamber *c;
-};
-
-struct isl_cell {
-	int n_vertices;
-	int *ids;
-	isl_vertices *vertices;
-	isl_basic_set *dom;
-};
-
-struct isl_external_vertex {
-	isl_vertices *vertices;
-	int id;
-};
-
-int isl_vertices_foreach_disjoint_cell(__isl_keep isl_vertices *vertices,
-	int (*fn)(__isl_take isl_cell *cell, void *user), void *user);
-int isl_cell_foreach_simplex(__isl_take isl_cell *cell,
-	int (*fn)(__isl_take isl_cell *simplex, void *user), void *user);
-
-__isl_give isl_vertices *isl_morph_vertices(__isl_take struct isl_morph *morph,
-	__isl_take isl_vertices *vertices);
-
-#if defined(__cplusplus)
-}
-#endif
diff --git a/cloog-0.16.3/isl/ltmain.sh b/cloog-0.16.3/isl/ltmain.sh
deleted file mode 100755
index be43f41..0000000
--- a/cloog-0.16.3/isl/ltmain.sh
+++ /dev/null
@@ -1,8750 +0,0 @@
-# Generated from ltmain.m4sh.
-
-# libtool (GNU libtool) 2.2.8
-# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
-# 2007, 2008, 2009, 2010 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.
-
-# GNU Libtool is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html,
-# or obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-# Usage: $progname [OPTION]... [MODE-ARG]...
-#
-# Provide generalized library-building support services.
-#
-#       --config             show all configuration variables
-#       --debug              enable verbose shell tracing
-#   -n, --dry-run            display commands without modifying any files
-#       --features           display basic configuration information and exit
-#       --mode=MODE          use operation mode MODE
-#       --preserve-dup-deps  don't remove duplicate dependency libraries
-#       --quiet, --silent    don't print informational messages
-#       --no-quiet, --no-silent
-#                            print informational messages (default)
-#       --tag=TAG            use configuration variables from tag TAG
-#   -v, --verbose            print more informational messages than default
-#       --no-verbose         don't print the extra informational messages
-#       --version            print version information
-#   -h, --help, --help-all   print short, long, or detailed help message
-#
-# MODE must be one of the following:
-#
-#         clean              remove files from the build directory
-#         compile            compile a source file into a libtool object
-#         execute            automatically set library path, then run a program
-#         finish             complete the installation of libtool libraries
-#         install            install libraries or executables
-#         link               create a library or an executable
-#         uninstall          remove libraries from an installed directory
-#
-# MODE-ARGS vary depending on the MODE.  When passed as first option,
-# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
-# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
-#
-# When reporting a bug, please describe a test case to reproduce it and
-# include the following information:
-#
-#         host-triplet:	$host
-#         shell:		$SHELL
-#         compiler:		$LTCC
-#         compiler flags:		$LTCFLAGS
-#         linker:		$LD (gnu? $with_gnu_ld)
-#         $progname:	(GNU libtool) 2.2.8
-#         automake:	$automake_version
-#         autoconf:	$autoconf_version
-#
-# Report bugs to <bug-libtool@gnu.org>.
-
-PROGRAM=libtool
-PACKAGE=libtool
-VERSION=2.2.8
-TIMESTAMP=""
-package_revision=1.3169
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
-}
-
-# NLS nuisances: We save the old values to restore during execute mode.
-lt_user_locale=
-lt_safe_locale=
-for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-do
-  eval "if test \"\${$lt_var+set}\" = set; then
-          save_$lt_var=\$$lt_var
-          $lt_var=C
-	  export $lt_var
-	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
-	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
-	fi"
-done
-LC_ALL=C
-LANGUAGE=C
-export LANGUAGE LC_ALL
-
-$lt_unset CDPATH
-
-
-
-
-
-
-# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
-# is ksh but when the shell is invoked as "sh" and the current value of
-# the _XPG environment variable is not equal to 1 (one), the special
-# positional parameter $0, within a function call, is the name of the
-# function.
-progpath="$0"
-
-
-
-: ${CP="cp -f"}
-test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
-: ${EGREP="grep -E"}
-: ${FGREP="grep -F"}
-: ${GREP="grep"}
-: ${LN_S="ln -s"}
-: ${MAKE="make"}
-: ${MKDIR="mkdir"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-: ${SED="sed"}
-: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
-: ${Xsed="$SED -e 1s/^X//"}
-
-# Global variables:
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
-EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
-
-exit_status=$EXIT_SUCCESS
-
-# Make sure IFS has a sensible default
-lt_nl='
-'
-IFS=" 	$lt_nl"
-
-dirname="s,/[^/]*$,,"
-basename="s,^.*/,,"
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-  func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
-}
-
-# Generated shell functions inserted here.
-
-# These SED scripts presuppose an absolute path with a trailing slash.
-pathcar='s,^/\([^/]*\).*$,\1,'
-pathcdr='s,^/[^/]*,,'
-removedotparts=':dotsl
-		s@/\./@/@g
-		t dotsl
-		s,/\.$,/,'
-collapseslashes='s@/\{1,\}@/@g'
-finalslash='s,/*$,/,'
-
-# func_normal_abspath PATH
-# Remove doubled-up and trailing slashes, "." path components,
-# and cancel out any ".." path components in PATH after making
-# it an absolute path.
-#             value returned in "$func_normal_abspath_result"
-func_normal_abspath ()
-{
-  # Start from root dir and reassemble the path.
-  func_normal_abspath_result=
-  func_normal_abspath_tpath=$1
-  func_normal_abspath_altnamespace=
-  case $func_normal_abspath_tpath in
-    "")
-      # Empty path, that just means $cwd.
-      func_stripname '' '/' "`pwd`"
-      func_normal_abspath_result=$func_stripname_result
-      return
-    ;;
-    # The next three entries are used to spot a run of precisely
-    # two leading slashes without using negated character classes;
-    # we take advantage of case's first-match behaviour.
-    ///*)
-      # Unusual form of absolute path, do nothing.
-    ;;
-    //*)
-      # Not necessarily an ordinary path; POSIX reserves leading '//'
-      # and for example Cygwin uses it to access remote file shares
-      # over CIFS/SMB, so we conserve a leading double slash if found.
-      func_normal_abspath_altnamespace=/
-    ;;
-    /*)
-      # Absolute path, do nothing.
-    ;;
-    *)
-      # Relative path, prepend $cwd.
-      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
-    ;;
-  esac
-  # Cancel out all the simple stuff to save iterations.  We also want
-  # the path to end with a slash for ease of parsing, so make sure
-  # there is one (and only one) here.
-  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
-  while :; do
-    # Processed it all yet?
-    if test "$func_normal_abspath_tpath" = / ; then
-      # If we ascended to the root using ".." the result may be empty now.
-      if test -z "$func_normal_abspath_result" ; then
-        func_normal_abspath_result=/
-      fi
-      break
-    fi
-    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$pathcar"`
-    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$pathcdr"`
-    # Figure out what to do with it
-    case $func_normal_abspath_tcomponent in
-      "")
-        # Trailing empty path component, ignore it.
-      ;;
-      ..)
-        # Parent dir; strip last assembled component from result.
-        func_dirname "$func_normal_abspath_result"
-        func_normal_abspath_result=$func_dirname_result
-      ;;
-      *)
-        # Actual path component, append it.
-        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
-      ;;
-    esac
-  done
-  # Restore leading double-slash if one was found on entry.
-  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
-}
-
-# func_relative_path SRCDIR DSTDIR
-# generates a relative path from SRCDIR to DSTDIR, with a trailing
-# slash if non-empty, suitable for immediately appending a filename
-# without needing to append a separator.
-#             value returned in "$func_relative_path_result"
-func_relative_path ()
-{
-  func_relative_path_result=
-  func_normal_abspath "$1"
-  func_relative_path_tlibdir=$func_normal_abspath_result
-  func_normal_abspath "$2"
-  func_relative_path_tbindir=$func_normal_abspath_result
-
-  # Ascend the tree starting from libdir
-  while :; do
-    # check if we have found a prefix of bindir
-    case $func_relative_path_tbindir in
-      $func_relative_path_tlibdir)
-        # found an exact match
-        func_relative_path_tcancelled=
-        break
-        ;;
-      $func_relative_path_tlibdir*)
-        # found a matching prefix
-        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
-        func_relative_path_tcancelled=$func_stripname_result
-        if test -z "$func_relative_path_result"; then
-          func_relative_path_result=.
-        fi
-        break
-        ;;
-      *)
-        func_dirname $func_relative_path_tlibdir
-        func_relative_path_tlibdir=${func_dirname_result}
-        if test "x$func_relative_path_tlibdir" = x ; then
-          # Have to descend all the way to the root!
-          func_relative_path_result=../$func_relative_path_result
-          func_relative_path_tcancelled=$func_relative_path_tbindir
-          break
-        fi
-        func_relative_path_result=../$func_relative_path_result
-        ;;
-    esac
-  done
-
-  # Now calculate path; take care to avoid doubling-up slashes.
-  func_stripname '' '/' "$func_relative_path_result"
-  func_relative_path_result=$func_stripname_result
-  func_stripname '/' '/' "$func_relative_path_tcancelled"
-  if test "x$func_stripname_result" != x ; then
-    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
-  fi
-
-  # Normalisation. If bindir is libdir, return empty string,
-  # else relative path ending with a slash; either way, target
-  # file name can be directly appended.
-  if test ! -z "$func_relative_path_result"; then
-    func_stripname './' '' "$func_relative_path_result/"
-    func_relative_path_result=$func_stripname_result
-  fi
-}
-
-# The name of this program:
-func_dirname_and_basename "$progpath"
-progname=$func_basename_result
-
-# Make sure we have an absolute path for reexecution:
-case $progpath in
-  [\\/]*|[A-Za-z]:\\*) ;;
-  *[\\/]*)
-     progdir=$func_dirname_result
-     progdir=`cd "$progdir" && pwd`
-     progpath="$progdir/$progname"
-     ;;
-  *)
-     save_IFS="$IFS"
-     IFS=:
-     for progdir in $PATH; do
-       IFS="$save_IFS"
-       test -x "$progdir/$progname" && break
-     done
-     IFS="$save_IFS"
-     test -n "$progdir" || progdir=`pwd`
-     progpath="$progdir/$progname"
-     ;;
-esac
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed="${SED}"' -e 1s/^X//'
-sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Re-`\' parameter expansions in output of double_quote_subst that were
-# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
-# in input to double_quote_subst, that '$' was protected from expansion.
-# Since each input `\' is now two `\'s, look for any number of runs of
-# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
-bs='\\'
-bs2='\\\\'
-bs4='\\\\\\\\'
-dollar='\$'
-sed_double_backslash="\
-  s/$bs4/&\\
-/g
-  s/^$bs2$dollar/$bs&/
-  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
-  s/\n//g"
-
-# Standard options:
-opt_dry_run=false
-opt_help=false
-opt_quiet=false
-opt_verbose=false
-opt_warning=:
-
-# func_echo arg...
-# Echo program name prefixed message, along with the current mode
-# name if it has been set yet.
-func_echo ()
-{
-    $ECHO "$progname${mode+: }$mode: $*"
-}
-
-# func_verbose arg...
-# Echo program name prefixed message in verbose mode only.
-func_verbose ()
-{
-    $opt_verbose && func_echo ${1+"$@"}
-
-    # A bug in bash halts the script if the last line of a function
-    # fails when set -e is in force, so we need another command to
-    # work around that:
-    :
-}
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO "$*"
-}
-
-# func_error arg...
-# Echo program name prefixed message to standard error.
-func_error ()
-{
-    $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2
-}
-
-# func_warning arg...
-# Echo program name prefixed warning message to standard error.
-func_warning ()
-{
-    $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2
-
-    # bash bug again:
-    :
-}
-
-# func_fatal_error arg...
-# Echo program name prefixed message to standard error, and exit.
-func_fatal_error ()
-{
-    func_error ${1+"$@"}
-    exit $EXIT_FAILURE
-}
-
-# func_fatal_help arg...
-# Echo program name prefixed message to standard error, followed by
-# a help hint, and exit.
-func_fatal_help ()
-{
-    func_error ${1+"$@"}
-    func_fatal_error "$help"
-}
-help="Try \`$progname --help' for more information."  ## default
-
-
-# func_grep expression filename
-# Check whether EXPRESSION matches any line of FILENAME, without output.
-func_grep ()
-{
-    $GREP "$1" "$2" >/dev/null 2>&1
-}
-
-
-# func_mkdir_p directory-path
-# Make sure the entire path to DIRECTORY-PATH is available.
-func_mkdir_p ()
-{
-    my_directory_path="$1"
-    my_dir_list=
-
-    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
-
-      # Protect directory names starting with `-'
-      case $my_directory_path in
-        -*) my_directory_path="./$my_directory_path" ;;
-      esac
-
-      # While some portion of DIR does not yet exist...
-      while test ! -d "$my_directory_path"; do
-        # ...make a list in topmost first order.  Use a colon delimited
-	# list incase some portion of path contains whitespace.
-        my_dir_list="$my_directory_path:$my_dir_list"
-
-        # If the last portion added has no slash in it, the list is done
-        case $my_directory_path in */*) ;; *) break ;; esac
-
-        # ...otherwise throw away the child directory and loop
-        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
-      done
-      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
-
-      save_mkdir_p_IFS="$IFS"; IFS=':'
-      for my_dir in $my_dir_list; do
-	IFS="$save_mkdir_p_IFS"
-        # mkdir can fail with a `File exist' error if two processes
-        # try to create one of the directories concurrently.  Don't
-        # stop in that case!
-        $MKDIR "$my_dir" 2>/dev/null || :
-      done
-      IFS="$save_mkdir_p_IFS"
-
-      # Bail out if we (or some other process) failed to create a directory.
-      test -d "$my_directory_path" || \
-        func_fatal_error "Failed to create \`$1'"
-    fi
-}
-
-
-# func_mktempdir [string]
-# Make a temporary directory that won't clash with other running
-# libtool processes, and avoids race conditions if possible.  If
-# given, STRING is the basename for that directory.
-func_mktempdir ()
-{
-    my_template="${TMPDIR-/tmp}/${1-$progname}"
-
-    if test "$opt_dry_run" = ":"; then
-      # Return a directory name, but don't create it in dry-run mode
-      my_tmpdir="${my_template}-$$"
-    else
-
-      # If mktemp works, use that first and foremost
-      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
-
-      if test ! -d "$my_tmpdir"; then
-        # Failing that, at least try and use $RANDOM to avoid a race
-        my_tmpdir="${my_template}-${RANDOM-0}$$"
-
-        save_mktempdir_umask=`umask`
-        umask 0077
-        $MKDIR "$my_tmpdir"
-        umask $save_mktempdir_umask
-      fi
-
-      # If we're not in dry-run mode, bomb out on failure
-      test -d "$my_tmpdir" || \
-        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
-    fi
-
-    $ECHO "$my_tmpdir"
-}
-
-
-# func_quote_for_eval arg
-# Aesthetically quote ARG to be evaled later.
-# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
-# is double-quoted, suitable for a subsequent eval, whereas
-# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
-# which are still active within double quotes backslashified.
-func_quote_for_eval ()
-{
-    case $1 in
-      *[\\\`\"\$]*)
-	func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
-      *)
-        func_quote_for_eval_unquoted_result="$1" ;;
-    esac
-
-    case $func_quote_for_eval_unquoted_result in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting, command substitution and and variable
-      # expansion for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
-        ;;
-      *)
-        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
-    esac
-}
-
-
-# func_quote_for_expand arg
-# Aesthetically quote ARG to be evaled later; same as above,
-# but do not quote variable references.
-func_quote_for_expand ()
-{
-    case $1 in
-      *[\\\`\"]*)
-	my_arg=`$ECHO "$1" | $SED \
-	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
-      *)
-        my_arg="$1" ;;
-    esac
-
-    case $my_arg in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting and command substitution for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        my_arg="\"$my_arg\""
-        ;;
-    esac
-
-    func_quote_for_expand_result="$my_arg"
-}
-
-
-# func_show_eval cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.
-func_show_eval ()
-{
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
-
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
-
-    if ${opt_dry_run-false}; then :; else
-      eval "$my_cmd"
-      my_status=$?
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
-}
-
-
-# func_show_eval_locale cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.  Use the saved locale for evaluation.
-func_show_eval_locale ()
-{
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
-
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
-
-    if ${opt_dry_run-false}; then :; else
-      eval "$lt_user_locale
-	    $my_cmd"
-      my_status=$?
-      eval "$lt_safe_locale"
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
-}
-
-
-
-# func_version
-# Echo version message to standard output and exit.
-func_version ()
-{
-    $SED -n '/(C)/!b go
-	:more
-	/\./!{
-	  N
-	  s/\n# //
-	  b more
-	}
-	:go
-	/^# '$PROGRAM' (GNU /,/# warranty; / {
-        s/^# //
-	s/^# *$//
-        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
-        p
-     }' < "$progpath"
-     exit $?
-}
-
-# func_usage
-# Echo short help message to standard output and exit.
-func_usage ()
-{
-    $SED -n '/^# Usage:/,/^#  *.*--help/ {
-        s/^# //
-	s/^# *$//
-	s/\$progname/'$progname'/
-	p
-    }' < "$progpath"
-    echo
-    $ECHO "run \`$progname --help | more' for full usage"
-    exit $?
-}
-
-# func_help [NOEXIT]
-# Echo long help message to standard output and exit,
-# unless 'noexit' is passed as argument.
-func_help ()
-{
-    $SED -n '/^# Usage:/,/# Report bugs to/ {
-        s/^# //
-	s/^# *$//
-	s*\$progname*'$progname'*
-	s*\$host*'"$host"'*
-	s*\$SHELL*'"$SHELL"'*
-	s*\$LTCC*'"$LTCC"'*
-	s*\$LTCFLAGS*'"$LTCFLAGS"'*
-	s*\$LD*'"$LD"'*
-	s/\$with_gnu_ld/'"$with_gnu_ld"'/
-	s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/
-	s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/
-	p
-     }' < "$progpath"
-    ret=$?
-    if test -z "$1"; then
-      exit $ret
-    fi
-}
-
-# func_missing_arg argname
-# Echo program name prefixed message to standard error and set global
-# exit_cmd.
-func_missing_arg ()
-{
-    func_error "missing argument for $1."
-    exit_cmd=exit
-}
-
-exit_cmd=:
-
-
-
-
-
-
-magic="%%%MAGIC variable%%%"
-magic_exe="%%%MAGIC EXE variable%%%"
-
-# Global variables.
-# $mode is unset
-nonopt=
-execute_dlfiles=
-preserve_args=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
-extracted_archives=
-extracted_serial=0
-
-opt_dry_run=false
-opt_duplicate_deps=false
-opt_silent=false
-opt_debug=:
-
-# If this variable is set in any of the actions, the command in it
-# will be execed at the end.  This prevents here-documents from being
-# left over by shells.
-exec_cmd=
-
-# func_fatal_configuration arg...
-# Echo program name prefixed message to standard error, followed by
-# a configuration failure hint, and exit.
-func_fatal_configuration ()
-{
-    func_error ${1+"$@"}
-    func_error "See the $PACKAGE documentation for more information."
-    func_fatal_error "Fatal configuration error."
-}
-
-
-# func_config
-# Display the configuration for all the tags in this script.
-func_config ()
-{
-    re_begincf='^# ### BEGIN LIBTOOL'
-    re_endcf='^# ### END LIBTOOL'
-
-    # Default configuration.
-    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
-
-    # Now print the configurations for the tags.
-    for tagname in $taglist; do
-      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
-    done
-
-    exit $?
-}
-
-# func_features
-# Display the features supported by this script.
-func_features ()
-{
-    echo "host: $host"
-    if test "$build_libtool_libs" = yes; then
-      echo "enable shared libraries"
-    else
-      echo "disable shared libraries"
-    fi
-    if test "$build_old_libs" = yes; then
-      echo "enable static libraries"
-    else
-      echo "disable static libraries"
-    fi
-
-    exit $?
-}
-
-# func_enable_tag tagname
-# Verify that TAGNAME is valid, and either flag an error and exit, or
-# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
-# variable here.
-func_enable_tag ()
-{
-  # Global variable:
-  tagname="$1"
-
-  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
-  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
-  sed_extractcf="/$re_begincf/,/$re_endcf/p"
-
-  # Validate tagname.
-  case $tagname in
-    *[!-_A-Za-z0-9,/]*)
-      func_fatal_error "invalid tag name: $tagname"
-      ;;
-  esac
-
-  # Don't test for the "default" C tag, as we know it's
-  # there but not specially marked.
-  case $tagname in
-    CC) ;;
-    *)
-      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
-	taglist="$taglist $tagname"
-
-	# Evaluate the configuration.  Be careful to quote the path
-	# and the sed script, to avoid splitting on whitespace, but
-	# also don't use non-portable quotes within backquotes within
-	# quotes we have to do it in 2 steps:
-	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
-	eval "$extractedcf"
-      else
-	func_error "ignoring unknown tag $tagname"
-      fi
-      ;;
-  esac
-}
-
-# Parse options once, thoroughly.  This comes as soon as possible in
-# the script to make things like `libtool --version' happen quickly.
-{
-
-  # Shorthand for --mode=foo, only valid as the first argument
-  case $1 in
-  clean|clea|cle|cl)
-    shift; set dummy --mode clean ${1+"$@"}; shift
-    ;;
-  compile|compil|compi|comp|com|co|c)
-    shift; set dummy --mode compile ${1+"$@"}; shift
-    ;;
-  execute|execut|execu|exec|exe|ex|e)
-    shift; set dummy --mode execute ${1+"$@"}; shift
-    ;;
-  finish|finis|fini|fin|fi|f)
-    shift; set dummy --mode finish ${1+"$@"}; shift
-    ;;
-  install|instal|insta|inst|ins|in|i)
-    shift; set dummy --mode install ${1+"$@"}; shift
-    ;;
-  link|lin|li|l)
-    shift; set dummy --mode link ${1+"$@"}; shift
-    ;;
-  uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
-    shift; set dummy --mode uninstall ${1+"$@"}; shift
-    ;;
-  esac
-
-  # Parse non-mode specific arguments:
-  while test "$#" -gt 0; do
-    opt="$1"
-    shift
-
-    case $opt in
-      --config)		func_config					;;
-
-      --debug)		preserve_args="$preserve_args $opt"
-			func_echo "enabling shell trace mode"
-			opt_debug='set -x'
-			$opt_debug
-			;;
-
-      -dlopen)		test "$#" -eq 0 && func_missing_arg "$opt" && break
-			execute_dlfiles="$execute_dlfiles $1"
-			shift
-			;;
-
-      --dry-run | -n)	opt_dry_run=:					;;
-      --features)       func_features					;;
-      --finish)		mode="finish"					;;
-
-      --mode)		test "$#" -eq 0 && func_missing_arg "$opt" && break
-			case $1 in
-			  # Valid mode arguments:
-			  clean)	;;
-			  compile)	;;
-			  execute)	;;
-			  finish)	;;
-			  install)	;;
-			  link)		;;
-			  relink)	;;
-			  uninstall)	;;
-
-			  # Catch anything else as an error
-			  *) func_error "invalid argument for $opt"
-			     exit_cmd=exit
-			     break
-			     ;;
-		        esac
-
-			mode="$1"
-			shift
-			;;
-
-      --preserve-dup-deps)
-			opt_duplicate_deps=:				;;
-
-      --quiet|--silent)	preserve_args="$preserve_args $opt"
-			opt_silent=:
-			opt_verbose=false
-			;;
-
-      --no-quiet|--no-silent)
-			preserve_args="$preserve_args $opt"
-			opt_silent=false
-			;;
-
-      --verbose| -v)	preserve_args="$preserve_args $opt"
-			opt_silent=false
-			opt_verbose=:
-			;;
-
-      --no-verbose)	preserve_args="$preserve_args $opt"
-			opt_verbose=false
-			;;
-
-      --tag)		test "$#" -eq 0 && func_missing_arg "$opt" && break
-			preserve_args="$preserve_args $opt $1"
-			func_enable_tag "$1"	# tagname is set here
-			shift
-			;;
-
-      # Separate optargs to long options:
-      -dlopen=*|--mode=*|--tag=*)
-			func_opt_split "$opt"
-			set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"}
-			shift
-			;;
-
-      -\?|-h)		func_usage					;;
-      --help)		opt_help=:					;;
-      --help-all)	opt_help=': help-all'				;;
-      --version)	func_version					;;
-
-      -*)		func_fatal_help "unrecognized option \`$opt'"	;;
-
-      *)		nonopt="$opt"
-			break
-			;;
-    esac
-  done
-
-
-  case $host in
-    *cygwin* | *mingw* | *pw32* | *cegcc*)
-      # don't eliminate duplications in $postdeps and $predeps
-      opt_duplicate_compiler_generated_deps=:
-      ;;
-    *)
-      opt_duplicate_compiler_generated_deps=$opt_duplicate_deps
-      ;;
-  esac
-
-  # Having warned about all mis-specified options, bail out if
-  # anything was wrong.
-  $exit_cmd $EXIT_FAILURE
-}
-
-# func_check_version_match
-# Ensure that we are using m4 macros, and libtool script from the same
-# release of libtool.
-func_check_version_match ()
-{
-  if test "$package_revision" != "$macro_revision"; then
-    if test "$VERSION" != "$macro_version"; then
-      if test -z "$macro_version"; then
-        cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from an older release.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
-      else
-        cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
-      fi
-    else
-      cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
-$progname: but the definition of this LT_INIT comes from revision $macro_revision.
-$progname: You should recreate aclocal.m4 with macros from revision $package_revision
-$progname: of $PACKAGE $VERSION and run autoconf again.
-_LT_EOF
-    fi
-
-    exit $EXIT_MISMATCH
-  fi
-}
-
-
-## ----------- ##
-##    Main.    ##
-## ----------- ##
-
-$opt_help || {
-  # Sanity checks first:
-  func_check_version_match
-
-  if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
-    func_fatal_configuration "not configured to build any kind of library"
-  fi
-
-  test -z "$mode" && func_fatal_error "error: you must specify a MODE."
-
-
-  # Darwin sucks
-  eval std_shrext=\"$shrext_cmds\"
-
-
-  # Only execute mode is allowed to have -dlopen flags.
-  if test -n "$execute_dlfiles" && test "$mode" != execute; then
-    func_error "unrecognized option \`-dlopen'"
-    $ECHO "$help" 1>&2
-    exit $EXIT_FAILURE
-  fi
-
-  # Change the help message to a mode-specific one.
-  generic_help="$help"
-  help="Try \`$progname --help --mode=$mode' for more information."
-}
-
-
-# func_lalib_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_lalib_p ()
-{
-    test -f "$1" &&
-      $SED -e 4q "$1" 2>/dev/null \
-        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
-}
-
-# func_lalib_unsafe_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
-# This function implements the same check as func_lalib_p without
-# resorting to external programs.  To this end, it redirects stdin and
-# closes it afterwards, without saving the original file descriptor.
-# As a safety measure, use it only where a negative result would be
-# fatal anyway.  Works if `file' does not exist.
-func_lalib_unsafe_p ()
-{
-    lalib_p=no
-    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
-	for lalib_p_l in 1 2 3 4
-	do
-	    read lalib_p_line
-	    case "$lalib_p_line" in
-		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
-	    esac
-	done
-	exec 0<&5 5<&-
-    fi
-    test "$lalib_p" = yes
-}
-
-# func_ltwrapper_script_p file
-# True iff FILE is a libtool wrapper script
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_script_p ()
-{
-    func_lalib_p "$1"
-}
-
-# func_ltwrapper_executable_p file
-# True iff FILE is a libtool wrapper executable
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_executable_p ()
-{
-    func_ltwrapper_exec_suffix=
-    case $1 in
-    *.exe) ;;
-    *) func_ltwrapper_exec_suffix=.exe ;;
-    esac
-    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
-}
-
-# func_ltwrapper_scriptname file
-# Assumes file is an ltwrapper_executable
-# uses $file to determine the appropriate filename for a
-# temporary ltwrapper_script.
-func_ltwrapper_scriptname ()
-{
-    func_ltwrapper_scriptname_result=""
-    if func_ltwrapper_executable_p "$1"; then
-	func_dirname_and_basename "$1" "" "."
-	func_stripname '' '.exe' "$func_basename_result"
-	func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
-    fi
-}
-
-# func_ltwrapper_p file
-# True iff FILE is a libtool wrapper script or wrapper executable
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_p ()
-{
-    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
-}
-
-
-# func_execute_cmds commands fail_cmd
-# Execute tilde-delimited COMMANDS.
-# If FAIL_CMD is given, eval that upon failure.
-# FAIL_CMD may read-access the current command in variable CMD!
-func_execute_cmds ()
-{
-    $opt_debug
-    save_ifs=$IFS; IFS='~'
-    for cmd in $1; do
-      IFS=$save_ifs
-      eval cmd=\"$cmd\"
-      func_show_eval "$cmd" "${2-:}"
-    done
-    IFS=$save_ifs
-}
-
-
-# func_source file
-# Source FILE, adding directory component if necessary.
-# Note that it is not necessary on cygwin/mingw to append a dot to
-# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
-# behavior happens only for exec(3), not for open(2)!  Also, sourcing
-# `FILE.' does not work on cygwin managed mounts.
-func_source ()
-{
-    $opt_debug
-    case $1 in
-    */* | *\\*)	. "$1" ;;
-    *)		. "./$1" ;;
-    esac
-}
-
-
-# func_infer_tag arg
-# Infer tagged configuration to use if any are available and
-# if one wasn't chosen via the "--tag" command line option.
-# Only attempt this if the compiler in the base compile
-# command doesn't match the default compiler.
-# arg is usually of the form 'gcc ...'
-func_infer_tag ()
-{
-    $opt_debug
-    if test -n "$available_tags" && test -z "$tagname"; then
-      CC_quoted=
-      for arg in $CC; do
-        func_quote_for_eval "$arg"
-	CC_quoted="$CC_quoted $func_quote_for_eval_result"
-      done
-      CC_expanded=`func_echo_all $CC`
-      CC_quoted_expanded=`func_echo_all $CC_quoted`
-      case $@ in
-      # Blanks in the command may have been stripped by the calling shell,
-      # but not from the CC environment variable when configure was run.
-      " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
-      " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
-      # Blanks at the start of $base_compile will cause this to fail
-      # if we don't check for them as well.
-      *)
-	for z in $available_tags; do
-	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
-	    # Evaluate the configuration.
-	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
-	    CC_quoted=
-	    for arg in $CC; do
-	      # Double-quote args containing other shell metacharacters.
-	      func_quote_for_eval "$arg"
-	      CC_quoted="$CC_quoted $func_quote_for_eval_result"
-	    done
-	    CC_expanded=`func_echo_all $CC`
-	    CC_quoted_expanded=`func_echo_all $CC_quoted`
-	    case "$@ " in
-	    " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
-	    " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
-	      # The compiler in the base compile command matches
-	      # the one in the tagged configuration.
-	      # Assume this is the tagged configuration we want.
-	      tagname=$z
-	      break
-	      ;;
-	    esac
-	  fi
-	done
-	# If $tagname still isn't set, then no tagged configuration
-	# was found and let the user know that the "--tag" command
-	# line option must be used.
-	if test -z "$tagname"; then
-	  func_echo "unable to infer tagged configuration"
-	  func_fatal_error "specify a tag with \`--tag'"
-#	else
-#	  func_verbose "using $tagname tagged configuration"
-	fi
-	;;
-      esac
-    fi
-}
-
-
-
-# func_write_libtool_object output_name pic_name nonpic_name
-# Create a libtool object file (analogous to a ".la" file),
-# but don't create it if we're doing a dry run.
-func_write_libtool_object ()
-{
-    write_libobj=${1}
-    if test "$build_libtool_libs" = yes; then
-      write_lobj=\'${2}\'
-    else
-      write_lobj=none
-    fi
-
-    if test "$build_old_libs" = yes; then
-      write_oldobj=\'${3}\'
-    else
-      write_oldobj=none
-    fi
-
-    $opt_dry_run || {
-      cat >${write_libobj}T <<EOF
-# $write_libobj - a libtool object file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# Name of the PIC object.
-pic_object=$write_lobj
-
-# Name of the non-PIC object
-non_pic_object=$write_oldobj
-
-EOF
-      $MV "${write_libobj}T" "${write_libobj}"
-    }
-}
-
-# func_mode_compile arg...
-func_mode_compile ()
-{
-    $opt_debug
-    # Get the compilation command and the source file.
-    base_compile=
-    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
-    suppress_opt=yes
-    suppress_output=
-    arg_mode=normal
-    libobj=
-    later=
-    pie_flag=
-
-    for arg
-    do
-      case $arg_mode in
-      arg  )
-	# do not "continue".  Instead, add this to base_compile
-	lastarg="$arg"
-	arg_mode=normal
-	;;
-
-      target )
-	libobj="$arg"
-	arg_mode=normal
-	continue
-	;;
-
-      normal )
-	# Accept any command-line options.
-	case $arg in
-	-o)
-	  test -n "$libobj" && \
-	    func_fatal_error "you cannot specify \`-o' more than once"
-	  arg_mode=target
-	  continue
-	  ;;
-
-	-pie | -fpie | -fPIE)
-          pie_flag="$pie_flag $arg"
-	  continue
-	  ;;
-
-	-shared | -static | -prefer-pic | -prefer-non-pic)
-	  later="$later $arg"
-	  continue
-	  ;;
-
-	-no-suppress)
-	  suppress_opt=no
-	  continue
-	  ;;
-
-	-Xcompiler)
-	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
-	  continue      #  The current "srcfile" will either be retained or
-	  ;;            #  replaced later.  I would guess that would be a bug.
-
-	-Wc,*)
-	  func_stripname '-Wc,' '' "$arg"
-	  args=$func_stripname_result
-	  lastarg=
-	  save_ifs="$IFS"; IFS=','
-	  for arg in $args; do
-	    IFS="$save_ifs"
-	    func_quote_for_eval "$arg"
-	    lastarg="$lastarg $func_quote_for_eval_result"
-	  done
-	  IFS="$save_ifs"
-	  func_stripname ' ' '' "$lastarg"
-	  lastarg=$func_stripname_result
-
-	  # Add the arguments to base_compile.
-	  base_compile="$base_compile $lastarg"
-	  continue
-	  ;;
-
-	*)
-	  # Accept the current argument as the source file.
-	  # The previous "srcfile" becomes the current argument.
-	  #
-	  lastarg="$srcfile"
-	  srcfile="$arg"
-	  ;;
-	esac  #  case $arg
-	;;
-      esac    #  case $arg_mode
-
-      # Aesthetically quote the previous argument.
-      func_quote_for_eval "$lastarg"
-      base_compile="$base_compile $func_quote_for_eval_result"
-    done # for arg
-
-    case $arg_mode in
-    arg)
-      func_fatal_error "you must specify an argument for -Xcompile"
-      ;;
-    target)
-      func_fatal_error "you must specify a target with \`-o'"
-      ;;
-    *)
-      # Get the name of the library object.
-      test -z "$libobj" && {
-	func_basename "$srcfile"
-	libobj="$func_basename_result"
-      }
-      ;;
-    esac
-
-    # Recognize several different file suffixes.
-    # If the user specifies -o file.o, it is replaced with file.lo
-    case $libobj in
-    *.[cCFSifmso] | \
-    *.ada | *.adb | *.ads | *.asm | \
-    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
-    *.[fF][09]? | *.for | *.java | *.obj | *.sx | *.cu | *.cup)
-      func_xform "$libobj"
-      libobj=$func_xform_result
-      ;;
-    esac
-
-    case $libobj in
-    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
-    *)
-      func_fatal_error "cannot determine name of library object from \`$libobj'"
-      ;;
-    esac
-
-    func_infer_tag $base_compile
-
-    for arg in $later; do
-      case $arg in
-      -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
-	build_old_libs=no
-	continue
-	;;
-
-      -static)
-	build_libtool_libs=no
-	build_old_libs=yes
-	continue
-	;;
-
-      -prefer-pic)
-	pic_mode=yes
-	continue
-	;;
-
-      -prefer-non-pic)
-	pic_mode=no
-	continue
-	;;
-      esac
-    done
-
-    func_quote_for_eval "$libobj"
-    test "X$libobj" != "X$func_quote_for_eval_result" \
-      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
-      && func_warning "libobj name \`$libobj' may not contain shell special characters."
-    func_dirname_and_basename "$obj" "/" ""
-    objname="$func_basename_result"
-    xdir="$func_dirname_result"
-    lobj=${xdir}$objdir/$objname
-
-    test -z "$base_compile" && \
-      func_fatal_help "you must specify a compilation command"
-
-    # Delete any leftover library objects.
-    if test "$build_old_libs" = yes; then
-      removelist="$obj $lobj $libobj ${libobj}T"
-    else
-      removelist="$lobj $libobj ${libobj}T"
-    fi
-
-    # On Cygwin there's no "real" PIC flag so we must build both object types
-    case $host_os in
-    cygwin* | mingw* | pw32* | os2* | cegcc*)
-      pic_mode=default
-      ;;
-    esac
-    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
-      # non-PIC code in shared libraries is not supported
-      pic_mode=default
-    fi
-
-    # Calculate the filename of the output object if compiler does
-    # not support -o with -c
-    if test "$compiler_c_o" = no; then
-      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
-      lockfile="$output_obj.lock"
-    else
-      output_obj=
-      need_locks=no
-      lockfile=
-    fi
-
-    # Lock this critical section if it is needed
-    # We use this script file to make the link, it avoids creating a new file
-    if test "$need_locks" = yes; then
-      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
-	func_echo "Waiting for $lockfile to be removed"
-	sleep 2
-      done
-    elif test "$need_locks" = warn; then
-      if test -f "$lockfile"; then
-	$ECHO "\
-*** ERROR, $lockfile exists and contains:
-`cat $lockfile 2>/dev/null`
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-      removelist="$removelist $output_obj"
-      $ECHO "$srcfile" > "$lockfile"
-    fi
-
-    $opt_dry_run || $RM $removelist
-    removelist="$removelist $lockfile"
-    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
-
-    if test -n "$fix_srcfile_path"; then
-      eval srcfile=\"$fix_srcfile_path\"
-    fi
-    func_quote_for_eval "$srcfile"
-    qsrcfile=$func_quote_for_eval_result
-
-    # Only build a PIC object if we are building libtool libraries.
-    if test "$build_libtool_libs" = yes; then
-      # Without this assignment, base_compile gets emptied.
-      fbsd_hideous_sh_bug=$base_compile
-
-      if test "$pic_mode" != no; then
-	command="$base_compile $qsrcfile $pic_flag"
-      else
-	# Don't build PIC code
-	command="$base_compile $qsrcfile"
-      fi
-
-      func_mkdir_p "$xdir$objdir"
-
-      if test -z "$output_obj"; then
-	# Place PIC objects in $objdir
-	command="$command -o $lobj"
-      fi
-
-      func_show_eval_locale "$command"	\
-          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
-
-      if test "$need_locks" = warn &&
-	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$ECHO "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-
-      # Just move the object if needed, then go on to compile the next one
-      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
-	func_show_eval '$MV "$output_obj" "$lobj"' \
-	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
-      fi
-
-      # Allow error messages only from the first compilation.
-      if test "$suppress_opt" = yes; then
-	suppress_output=' >/dev/null 2>&1'
-      fi
-    fi
-
-    # Only build a position-dependent object if we build old libraries.
-    if test "$build_old_libs" = yes; then
-      if test "$pic_mode" != yes; then
-	# Don't build PIC code
-	command="$base_compile $qsrcfile$pie_flag"
-      else
-	command="$base_compile $qsrcfile $pic_flag"
-      fi
-      if test "$compiler_c_o" = yes; then
-	command="$command -o $obj"
-      fi
-
-      # Suppress compiler output if we already did a PIC compilation.
-      command="$command$suppress_output"
-      func_show_eval_locale "$command" \
-        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
-
-      if test "$need_locks" = warn &&
-	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$ECHO "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-
-      # Just move the object if needed
-      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
-	func_show_eval '$MV "$output_obj" "$obj"' \
-	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
-      fi
-    fi
-
-    $opt_dry_run || {
-      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
-
-      # Unlock the critical section if it was locked
-      if test "$need_locks" != no; then
-	removelist=$lockfile
-        $RM "$lockfile"
-      fi
-    }
-
-    exit $EXIT_SUCCESS
-}
-
-$opt_help || {
-  test "$mode" = compile && func_mode_compile ${1+"$@"}
-}
-
-func_mode_help ()
-{
-    # We need to display help for each of the modes.
-    case $mode in
-      "")
-        # Generic help is extracted from the usage comments
-        # at the start of this file.
-        func_help
-        ;;
-
-      clean)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
-
-Remove files from the build directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, object or program, all the files associated
-with it are deleted. Otherwise, only FILE itself is deleted using RM."
-        ;;
-
-      compile)
-      $ECHO \
-"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
-
-Compile a source file into a libtool library object.
-
-This mode accepts the following additional options:
-
-  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
-  -no-suppress      do not suppress compiler output for multiple passes
-  -prefer-pic       try to build PIC objects only
-  -prefer-non-pic   try to build non-PIC objects only
-  -shared           do not build a \`.o' file suitable for static linking
-  -static           only build a \`.o' file suitable for static linking
-  -Wc,FLAG          pass FLAG directly to the compiler
-
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
-from the given SOURCEFILE.
-
-The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
-        ;;
-
-      execute)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
-
-Automatically set library path, then run a program.
-
-This mode accepts the following additional options:
-
-  -dlopen FILE      add the directory containing FILE to the library path
-
-This mode sets the library path environment variable according to \`-dlopen'
-flags.
-
-If any of the ARGS are libtool executable wrappers, then they are translated
-into their corresponding uninstalled binary, and any of their required library
-directories are added to the library path.
-
-Then, COMMAND is executed, with ARGS as arguments."
-        ;;
-
-      finish)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
-
-Complete the installation of libtool libraries.
-
-Each LIBDIR is a directory that contains libtool libraries.
-
-The commands that this mode executes may require superuser privileges.  Use
-the \`--dry-run' option if you just want to see what would be executed."
-        ;;
-
-      install)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
-
-Install executables or libraries.
-
-INSTALL-COMMAND is the installation command.  The first component should be
-either the \`install' or \`cp' program.
-
-The following components of INSTALL-COMMAND are treated specially:
-
-  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
-
-The rest of the components are interpreted as arguments to that command (only
-BSD-compatible install options are recognized)."
-        ;;
-
-      link)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
-
-Link object files or libraries together to form another library, or to
-create an executable program.
-
-LINK-COMMAND is a command using the C compiler that you would use to create
-a program from several object files.
-
-The following components of LINK-COMMAND are treated specially:
-
-  -all-static       do not do any dynamic linking at all
-  -avoid-version    do not add a version suffix if possible
-  -bindir BINDIR    specify path to binaries directory (for systems where
-                    libraries must be found in the PATH setting at runtime)
-  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
-  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
-  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
-  -export-symbols SYMFILE
-                    try to export only the symbols listed in SYMFILE
-  -export-symbols-regex REGEX
-                    try to export only the symbols matching REGEX
-  -LLIBDIR          search LIBDIR for required installed libraries
-  -lNAME            OUTPUT-FILE requires the installed library libNAME
-  -module           build a library that can dlopened
-  -no-fast-install  disable the fast-install mode
-  -no-install       link a not-installable executable
-  -no-undefined     declare that a library does not refer to external symbols
-  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
-  -objectlist FILE  Use a list of object files found in FILE to specify objects
-  -precious-files-regex REGEX
-                    don't remove output files matching REGEX
-  -release RELEASE  specify package release information
-  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
-  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
-  -shared           only do dynamic linking of libtool libraries
-  -shrext SUFFIX    override the standard shared library file extension
-  -static           do not do any dynamic linking of uninstalled libtool libraries
-  -static-libtool-libs
-                    do not do any dynamic linking of libtool libraries
-  -version-info CURRENT[:REVISION[:AGE]]
-                    specify library version info [each variable defaults to 0]
-  -weak LIBNAME     declare that the target provides the LIBNAME interface
-  -Wc,FLAG
-  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
-  -Wl,FLAG
-  -Xlinker FLAG     pass linker-specific FLAG directly to the linker
-  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
-
-All other options (arguments beginning with \`-') are ignored.
-
-Every other argument is treated as a filename.  Files ending in \`.la' are
-treated as uninstalled libtool libraries, other files are standard or library
-object files.
-
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
-required, except when creating a convenience library.
-
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
-
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
-is created, otherwise an executable program is created."
-        ;;
-
-      uninstall)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
-
-Remove libraries from an installation directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, all the files associated with it are deleted.
-Otherwise, only FILE itself is deleted using RM."
-        ;;
-
-      *)
-        func_fatal_help "invalid operation mode \`$mode'"
-        ;;
-    esac
-
-    echo
-    $ECHO "Try \`$progname --help' for more information about other modes."
-}
-
-# Now that we've collected a possible --mode arg, show help if necessary
-if $opt_help; then
-  if test "$opt_help" = :; then
-    func_mode_help
-  else
-    {
-      func_help noexit
-      for mode in compile link execute install finish uninstall clean; do
-	func_mode_help
-      done
-    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
-    {
-      func_help noexit
-      for mode in compile link execute install finish uninstall clean; do
-	echo
-	func_mode_help
-      done
-    } |
-    sed '1d
-      /^When reporting/,/^Report/{
-	H
-	d
-      }
-      $x
-      /information about other modes/d
-      /more detailed .*MODE/d
-      s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
-  fi
-  exit $?
-fi
-
-
-# func_mode_execute arg...
-func_mode_execute ()
-{
-    $opt_debug
-    # The first argument is the command name.
-    cmd="$nonopt"
-    test -z "$cmd" && \
-      func_fatal_help "you must specify a COMMAND"
-
-    # Handle -dlopen flags immediately.
-    for file in $execute_dlfiles; do
-      test -f "$file" \
-	|| func_fatal_help "\`$file' is not a file"
-
-      dir=
-      case $file in
-      *.la)
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$lib' is not a valid libtool archive"
-
-	# Read the libtool library.
-	dlname=
-	library_names=
-	func_source "$file"
-
-	# Skip this library if it cannot be dlopened.
-	if test -z "$dlname"; then
-	  # Warn if it was a shared library.
-	  test -n "$library_names" && \
-	    func_warning "\`$file' was not linked with \`-export-dynamic'"
-	  continue
-	fi
-
-	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
-
-	if test -f "$dir/$objdir/$dlname"; then
-	  dir="$dir/$objdir"
-	else
-	  if test ! -f "$dir/$dlname"; then
-	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
-	  fi
-	fi
-	;;
-
-      *.lo)
-	# Just add the directory containing the .lo file.
-	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
-	;;
-
-      *)
-	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
-	continue
-	;;
-      esac
-
-      # Get the absolute pathname.
-      absdir=`cd "$dir" && pwd`
-      test -n "$absdir" && dir="$absdir"
-
-      # Now add the directory to shlibpath_var.
-      if eval "test -z \"\$$shlibpath_var\""; then
-	eval "$shlibpath_var=\"\$dir\""
-      else
-	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
-      fi
-    done
-
-    # This variable tells wrapper scripts just to set shlibpath_var
-    # rather than running their programs.
-    libtool_execute_magic="$magic"
-
-    # Check if any of the arguments is a wrapper script.
-    args=
-    for file
-    do
-      case $file in
-      -* | *.la | *.lo ) ;;
-      *)
-	# Do a test to see if this is really a libtool program.
-	if func_ltwrapper_script_p "$file"; then
-	  func_source "$file"
-	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
-	elif func_ltwrapper_executable_p "$file"; then
-	  func_ltwrapper_scriptname "$file"
-	  func_source "$func_ltwrapper_scriptname_result"
-	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
-	fi
-	;;
-      esac
-      # Quote arguments (to preserve shell metacharacters).
-      func_quote_for_eval "$file"
-      args="$args $func_quote_for_eval_result"
-    done
-
-    if test "X$opt_dry_run" = Xfalse; then
-      if test -n "$shlibpath_var"; then
-	# Export the shlibpath_var.
-	eval "export $shlibpath_var"
-      fi
-
-      # Restore saved environment variables
-      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-      do
-	eval "if test \"\${save_$lt_var+set}\" = set; then
-                $lt_var=\$save_$lt_var; export $lt_var
-	      else
-		$lt_unset $lt_var
-	      fi"
-      done
-
-      # Now prepare to actually exec the command.
-      exec_cmd="\$cmd$args"
-    else
-      # Display what would be done.
-      if test -n "$shlibpath_var"; then
-	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
-	echo "export $shlibpath_var"
-      fi
-      $ECHO "$cmd$args"
-      exit $EXIT_SUCCESS
-    fi
-}
-
-test "$mode" = execute && func_mode_execute ${1+"$@"}
-
-
-# func_mode_finish arg...
-func_mode_finish ()
-{
-    $opt_debug
-    libdirs="$nonopt"
-    admincmds=
-
-    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
-      for dir
-      do
-	libdirs="$libdirs $dir"
-      done
-
-      for libdir in $libdirs; do
-	if test -n "$finish_cmds"; then
-	  # Do each command in the finish commands.
-	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
-'"$cmd"'"'
-	fi
-	if test -n "$finish_eval"; then
-	  # Do the single finish_eval.
-	  eval cmds=\"$finish_eval\"
-	  $opt_dry_run || eval "$cmds" || admincmds="$admincmds
-       $cmds"
-	fi
-      done
-    fi
-
-    # Exit here if they wanted silent mode.
-    $opt_silent && exit $EXIT_SUCCESS
-
-    echo "----------------------------------------------------------------------"
-    echo "Libraries have been installed in:"
-    for libdir in $libdirs; do
-      $ECHO "   $libdir"
-    done
-    echo
-    echo "If you ever happen to want to link against installed libraries"
-    echo "in a given directory, LIBDIR, you must either use libtool, and"
-    echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
-    echo "flag during linking and do at least one of the following:"
-    if test -n "$shlibpath_var"; then
-      echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
-      echo "     during execution"
-    fi
-    if test -n "$runpath_var"; then
-      echo "   - add LIBDIR to the \`$runpath_var' environment variable"
-      echo "     during linking"
-    fi
-    if test -n "$hardcode_libdir_flag_spec"; then
-      libdir=LIBDIR
-      eval flag=\"$hardcode_libdir_flag_spec\"
-
-      $ECHO "   - use the \`$flag' linker flag"
-    fi
-    if test -n "$admincmds"; then
-      $ECHO "   - have your system administrator run these commands:$admincmds"
-    fi
-    if test -f /etc/ld.so.conf; then
-      echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
-    fi
-    echo
-
-    echo "See any operating system documentation about shared libraries for"
-    case $host in
-      solaris2.[6789]|solaris2.1[0-9])
-        echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
-	echo "pages."
-	;;
-      *)
-        echo "more information, such as the ld(1) and ld.so(8) manual pages."
-        ;;
-    esac
-    echo "----------------------------------------------------------------------"
-    exit $EXIT_SUCCESS
-}
-
-test "$mode" = finish && func_mode_finish ${1+"$@"}
-
-
-# func_mode_install arg...
-func_mode_install ()
-{
-    $opt_debug
-    # There may be an optional sh(1) argument at the beginning of
-    # install_prog (especially on Windows NT).
-    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
-       # Allow the use of GNU shtool's install command.
-       case $nonopt in *shtool*) :;; *) false;; esac; then
-      # Aesthetically quote it.
-      func_quote_for_eval "$nonopt"
-      install_prog="$func_quote_for_eval_result "
-      arg=$1
-      shift
-    else
-      install_prog=
-      arg=$nonopt
-    fi
-
-    # The real first argument should be the name of the installation program.
-    # Aesthetically quote it.
-    func_quote_for_eval "$arg"
-    install_prog="$install_prog$func_quote_for_eval_result"
-    install_shared_prog=$install_prog
-    case " $install_prog " in
-      *[\\\ /]cp\ *) install_cp=: ;;
-      *) install_cp=false ;;
-    esac
-
-    # We need to accept at least all the BSD install flags.
-    dest=
-    files=
-    opts=
-    prev=
-    install_type=
-    isdir=no
-    stripme=
-    no_mode=:
-    for arg
-    do
-      arg2=
-      if test -n "$dest"; then
-	files="$files $dest"
-	dest=$arg
-	continue
-      fi
-
-      case $arg in
-      -d) isdir=yes ;;
-      -f)
-	if $install_cp; then :; else
-	  prev=$arg
-	fi
-	;;
-      -g | -m | -o)
-	prev=$arg
-	;;
-      -s)
-	stripme=" -s"
-	continue
-	;;
-      -*)
-	;;
-      *)
-	# If the previous option needed an argument, then skip it.
-	if test -n "$prev"; then
-	  if test "x$prev" = x-m && test -n "$install_override_mode"; then
-	    arg2=$install_override_mode
-	    no_mode=false
-	  fi
-	  prev=
-	else
-	  dest=$arg
-	  continue
-	fi
-	;;
-      esac
-
-      # Aesthetically quote the argument.
-      func_quote_for_eval "$arg"
-      install_prog="$install_prog $func_quote_for_eval_result"
-      if test -n "$arg2"; then
-	func_quote_for_eval "$arg2"
-      fi
-      install_shared_prog="$install_shared_prog $func_quote_for_eval_result"
-    done
-
-    test -z "$install_prog" && \
-      func_fatal_help "you must specify an install program"
-
-    test -n "$prev" && \
-      func_fatal_help "the \`$prev' option requires an argument"
-
-    if test -n "$install_override_mode" && $no_mode; then
-      if $install_cp; then :; else
-	func_quote_for_eval "$install_override_mode"
-	install_shared_prog="$install_shared_prog -m $func_quote_for_eval_result"
-      fi
-    fi
-
-    if test -z "$files"; then
-      if test -z "$dest"; then
-	func_fatal_help "no file or destination specified"
-      else
-	func_fatal_help "you must specify a destination"
-      fi
-    fi
-
-    # Strip any trailing slash from the destination.
-    func_stripname '' '/' "$dest"
-    dest=$func_stripname_result
-
-    # Check to see that the destination is a directory.
-    test -d "$dest" && isdir=yes
-    if test "$isdir" = yes; then
-      destdir="$dest"
-      destname=
-    else
-      func_dirname_and_basename "$dest" "" "."
-      destdir="$func_dirname_result"
-      destname="$func_basename_result"
-
-      # Not a directory, so check to see that there is only one file specified.
-      set dummy $files; shift
-      test "$#" -gt 1 && \
-	func_fatal_help "\`$dest' is not a directory"
-    fi
-    case $destdir in
-    [\\/]* | [A-Za-z]:[\\/]*) ;;
-    *)
-      for file in $files; do
-	case $file in
-	*.lo) ;;
-	*)
-	  func_fatal_help "\`$destdir' must be an absolute directory name"
-	  ;;
-	esac
-      done
-      ;;
-    esac
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    staticlibs=
-    future_libdirs=
-    current_libdirs=
-    for file in $files; do
-
-      # Do each installation.
-      case $file in
-      *.$libext)
-	# Do the static libraries later.
-	staticlibs="$staticlibs $file"
-	;;
-
-      *.la)
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$file' is not a valid libtool archive"
-
-	library_names=
-	old_library=
-	relink_command=
-	func_source "$file"
-
-	# Add the libdir to current_libdirs if it is the destination.
-	if test "X$destdir" = "X$libdir"; then
-	  case "$current_libdirs " in
-	  *" $libdir "*) ;;
-	  *) current_libdirs="$current_libdirs $libdir" ;;
-	  esac
-	else
-	  # Note the libdir as a future libdir.
-	  case "$future_libdirs " in
-	  *" $libdir "*) ;;
-	  *) future_libdirs="$future_libdirs $libdir" ;;
-	  esac
-	fi
-
-	func_dirname "$file" "/" ""
-	dir="$func_dirname_result"
-	dir="$dir$objdir"
-
-	if test -n "$relink_command"; then
-	  # Determine the prefix the user has applied to our future dir.
-	  inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
-
-	  # Don't allow the user to place us outside of our expected
-	  # location b/c this prevents finding dependent libraries that
-	  # are installed to the same prefix.
-	  # At present, this check doesn't affect windows .dll's that
-	  # are installed into $libdir/../bin (currently, that works fine)
-	  # but it's something to keep an eye on.
-	  test "$inst_prefix_dir" = "$destdir" && \
-	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
-
-	  if test -n "$inst_prefix_dir"; then
-	    # Stick the inst_prefix_dir data into the link command.
-	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
-	  else
-	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
-	  fi
-
-	  func_warning "relinking \`$file'"
-	  func_show_eval "$relink_command" \
-	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
-	fi
-
-	# See the names of the shared library.
-	set dummy $library_names; shift
-	if test -n "$1"; then
-	  realname="$1"
-	  shift
-
-	  srcname="$realname"
-	  test -n "$relink_command" && srcname="$realname"T
-
-	  # Install the shared library and build the symlinks.
-	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
-	      'exit $?'
-	  tstripme="$stripme"
-	  case $host_os in
-	  cygwin* | mingw* | pw32* | cegcc*)
-	    case $realname in
-	    *.dll.a)
-	      tstripme=""
-	      ;;
-	    esac
-	    ;;
-	  esac
-	  if test -n "$tstripme" && test -n "$striplib"; then
-	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
-	  fi
-
-	  if test "$#" -gt 0; then
-	    # Delete the old symlinks, and create new ones.
-	    # Try `ln -sf' first, because the `ln' binary might depend on
-	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
-	    # so we also need to try rm && ln -s.
-	    for linkname
-	    do
-	      test "$linkname" != "$realname" \
-		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
-	    done
-	  fi
-
-	  # Do each command in the postinstall commands.
-	  lib="$destdir/$realname"
-	  func_execute_cmds "$postinstall_cmds" 'exit $?'
-	fi
-
-	# Install the pseudo-library for information purposes.
-	func_basename "$file"
-	name="$func_basename_result"
-	instname="$dir/$name"i
-	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
-
-	# Maybe install the static library, too.
-	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
-	;;
-
-      *.lo)
-	# Install (i.e. copy) a libtool object.
-
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
-	else
-	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
-	fi
-
-	# Deduce the name of the destination old-style object file.
-	case $destfile in
-	*.lo)
-	  func_lo2o "$destfile"
-	  staticdest=$func_lo2o_result
-	  ;;
-	*.$objext)
-	  staticdest="$destfile"
-	  destfile=
-	  ;;
-	*)
-	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
-	  ;;
-	esac
-
-	# Install the libtool object if requested.
-	test -n "$destfile" && \
-	  func_show_eval "$install_prog $file $destfile" 'exit $?'
-
-	# Install the old object if enabled.
-	if test "$build_old_libs" = yes; then
-	  # Deduce the name of the old-style object file.
-	  func_lo2o "$file"
-	  staticobj=$func_lo2o_result
-	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
-	fi
-	exit $EXIT_SUCCESS
-	;;
-
-      *)
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
-	else
-	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
-	fi
-
-	# If the file is missing, and there is a .exe on the end, strip it
-	# because it is most likely a libtool script we actually want to
-	# install
-	stripped_ext=""
-	case $file in
-	  *.exe)
-	    if test ! -f "$file"; then
-	      func_stripname '' '.exe' "$file"
-	      file=$func_stripname_result
-	      stripped_ext=".exe"
-	    fi
-	    ;;
-	esac
-
-	# Do a test to see if this is really a libtool program.
-	case $host in
-	*cygwin* | *mingw*)
-	    if func_ltwrapper_executable_p "$file"; then
-	      func_ltwrapper_scriptname "$file"
-	      wrapper=$func_ltwrapper_scriptname_result
-	    else
-	      func_stripname '' '.exe' "$file"
-	      wrapper=$func_stripname_result
-	    fi
-	    ;;
-	*)
-	    wrapper=$file
-	    ;;
-	esac
-	if func_ltwrapper_script_p "$wrapper"; then
-	  notinst_deplibs=
-	  relink_command=
-
-	  func_source "$wrapper"
-
-	  # Check the variables that should have been set.
-	  test -z "$generated_by_libtool_version" && \
-	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
-
-	  finalize=yes
-	  for lib in $notinst_deplibs; do
-	    # Check to see that each library is installed.
-	    libdir=
-	    if test -f "$lib"; then
-	      func_source "$lib"
-	    fi
-	    libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
-	    if test -n "$libdir" && test ! -f "$libfile"; then
-	      func_warning "\`$lib' has not been installed in \`$libdir'"
-	      finalize=no
-	    fi
-	  done
-
-	  relink_command=
-	  func_source "$wrapper"
-
-	  outputname=
-	  if test "$fast_install" = no && test -n "$relink_command"; then
-	    $opt_dry_run || {
-	      if test "$finalize" = yes; then
-	        tmpdir=`func_mktempdir`
-		func_basename "$file$stripped_ext"
-		file="$func_basename_result"
-	        outputname="$tmpdir/$file"
-	        # Replace the output file specification.
-	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
-
-	        $opt_silent || {
-	          func_quote_for_expand "$relink_command"
-		  eval "func_echo $func_quote_for_expand_result"
-	        }
-	        if eval "$relink_command"; then :
-	          else
-		  func_error "error: relink \`$file' with the above command before installing it"
-		  $opt_dry_run || ${RM}r "$tmpdir"
-		  continue
-	        fi
-	        file="$outputname"
-	      else
-	        func_warning "cannot relink \`$file'"
-	      fi
-	    }
-	  else
-	    # Install the binary that we compiled earlier.
-	    file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
-	  fi
-	fi
-
-	# remove .exe since cygwin /usr/bin/install will append another
-	# one anyway
-	case $install_prog,$host in
-	*/usr/bin/install*,*cygwin*)
-	  case $file:$destfile in
-	  *.exe:*.exe)
-	    # this is ok
-	    ;;
-	  *.exe:*)
-	    destfile=$destfile.exe
-	    ;;
-	  *:*.exe)
-	    func_stripname '' '.exe' "$destfile"
-	    destfile=$func_stripname_result
-	    ;;
-	  esac
-	  ;;
-	esac
-	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
-	$opt_dry_run || if test -n "$outputname"; then
-	  ${RM}r "$tmpdir"
-	fi
-	;;
-      esac
-    done
-
-    for file in $staticlibs; do
-      func_basename "$file"
-      name="$func_basename_result"
-
-      # Set up the ranlib parameters.
-      oldlib="$destdir/$name"
-
-      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
-
-      if test -n "$stripme" && test -n "$old_striplib"; then
-	func_show_eval "$old_striplib $oldlib" 'exit $?'
-      fi
-
-      # Do each command in the postinstall commands.
-      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
-    done
-
-    test -n "$future_libdirs" && \
-      func_warning "remember to run \`$progname --finish$future_libdirs'"
-
-    if test -n "$current_libdirs"; then
-      # Maybe just do a dry run.
-      $opt_dry_run && current_libdirs=" -n$current_libdirs"
-      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
-    else
-      exit $EXIT_SUCCESS
-    fi
-}
-
-test "$mode" = install && func_mode_install ${1+"$@"}
-
-
-# func_generate_dlsyms outputname originator pic_p
-# Extract symbols from dlprefiles and create ${outputname}S.o with
-# a dlpreopen symbol table.
-func_generate_dlsyms ()
-{
-    $opt_debug
-    my_outputname="$1"
-    my_originator="$2"
-    my_pic_p="${3-no}"
-    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
-    my_dlsyms=
-
-    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-      if test -n "$NM" && test -n "$global_symbol_pipe"; then
-	my_dlsyms="${my_outputname}S.c"
-      else
-	func_error "not configured to extract global symbols from dlpreopened files"
-      fi
-    fi
-
-    if test -n "$my_dlsyms"; then
-      case $my_dlsyms in
-      "") ;;
-      *.c)
-	# Discover the nlist of each of the dlfiles.
-	nlist="$output_objdir/${my_outputname}.nm"
-
-	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
-
-	# Parse the name list into a source file.
-	func_verbose "creating $output_objdir/$my_dlsyms"
-
-	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
-/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
-/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
-
-#ifdef __cplusplus
-extern \"C\" {
-#endif
-
-#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
-#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
-#endif
-
-/* External symbol declarations for the compiler. */\
-"
-
-	if test "$dlself" = yes; then
-	  func_verbose "generating symbol list for \`$output'"
-
-	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
-
-	  # Add our own program objects to the symbol list.
-	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
-	  for progfile in $progfiles; do
-	    func_verbose "extracting global C symbols from \`$progfile'"
-	    $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'"
-	  done
-
-	  if test -n "$exclude_expsyms"; then
-	    $opt_dry_run || {
-	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
-	      eval '$MV "$nlist"T "$nlist"'
-	    }
-	  fi
-
-	  if test -n "$export_symbols_regex"; then
-	    $opt_dry_run || {
-	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
-	      eval '$MV "$nlist"T "$nlist"'
-	    }
-	  fi
-
-	  # Prepare the list of exported symbols
-	  if test -z "$export_symbols"; then
-	    export_symbols="$output_objdir/$outputname.exp"
-	    $opt_dry_run || {
-	      $RM $export_symbols
-	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
-	      case $host in
-	      *cygwin* | *mingw* | *cegcc* )
-                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
-                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
-	        ;;
-	      esac
-	    }
-	  else
-	    $opt_dry_run || {
-	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
-	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
-	      eval '$MV "$nlist"T "$nlist"'
-	      case $host in
-	        *cygwin* | *mingw* | *cegcc* )
-	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
-	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
-	          ;;
-	      esac
-	    }
-	  fi
-	fi
-
-	for dlprefile in $dlprefiles; do
-	  func_verbose "extracting global C symbols from \`$dlprefile'"
-	  func_basename "$dlprefile"
-	  name="$func_basename_result"
-	  $opt_dry_run || {
-	    eval '$ECHO ": $name " >> "$nlist"'
-	    eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'"
-	  }
-	done
-
-	$opt_dry_run || {
-	  # Make sure we have at least an empty file.
-	  test -f "$nlist" || : > "$nlist"
-
-	  if test -n "$exclude_expsyms"; then
-	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
-	    $MV "$nlist"T "$nlist"
-	  fi
-
-	  # Try sorting and uniquifying the output.
-	  if $GREP -v "^: " < "$nlist" |
-	      if sort -k 3 </dev/null >/dev/null 2>&1; then
-		sort -k 3
-	      else
-		sort +2
-	      fi |
-	      uniq > "$nlist"S; then
-	    :
-	  else
-	    $GREP -v "^: " < "$nlist" > "$nlist"S
-	  fi
-
-	  if test -f "$nlist"S; then
-	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
-	  else
-	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
-	  fi
-
-	  echo >> "$output_objdir/$my_dlsyms" "\
-
-/* The mapping between symbol names and symbols.  */
-typedef struct {
-  const char *name;
-  void *address;
-} lt_dlsymlist;
-"
-	  case $host in
-	  *cygwin* | *mingw* | *cegcc* )
-	    echo >> "$output_objdir/$my_dlsyms" "\
-/* DATA imports from DLLs on WIN32 con't be const, because
-   runtime relocations are performed -- see ld's documentation
-   on pseudo-relocs.  */"
-	    lt_dlsym_const= ;;
-	  *osf5*)
-	    echo >> "$output_objdir/$my_dlsyms" "\
-/* This system does not cope well with relocations in const data */"
-	    lt_dlsym_const= ;;
-	  *)
-	    lt_dlsym_const=const ;;
-	  esac
-
-	  echo >> "$output_objdir/$my_dlsyms" "\
-extern $lt_dlsym_const lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[];
-$lt_dlsym_const lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[] =
-{\
-  { \"$my_originator\", (void *) 0 },"
-
-	  case $need_lib_prefix in
-	  no)
-	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
-	    ;;
-	  *)
-	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
-	    ;;
-	  esac
-	  echo >> "$output_objdir/$my_dlsyms" "\
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt_${my_prefix}_LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif\
-"
-	} # !$opt_dry_run
-
-	pic_flag_for_symtable=
-	case "$compile_command " in
-	*" -static "*) ;;
-	*)
-	  case $host in
-	  # compiling the symbol table file with pic_flag works around
-	  # a FreeBSD bug that causes programs to crash when -lm is
-	  # linked before any other PIC object.  But we must not use
-	  # pic_flag when linking with -static.  The problem exists in
-	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
-	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
-	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
-	  *-*-hpux*)
-	    pic_flag_for_symtable=" $pic_flag"  ;;
-	  *)
-	    if test "X$my_pic_p" != Xno; then
-	      pic_flag_for_symtable=" $pic_flag"
-	    fi
-	    ;;
-	  esac
-	  ;;
-	esac
-	symtab_cflags=
-	for arg in $LTCFLAGS; do
-	  case $arg in
-	  -pie | -fpie | -fPIE) ;;
-	  *) symtab_cflags="$symtab_cflags $arg" ;;
-	  esac
-	done
-
-	# Now compile the dynamic symbol file.
-	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
-
-	# Clean up the generated files.
-	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
-
-	# Transform the symbol file into the correct name.
-	symfileobj="$output_objdir/${my_outputname}S.$objext"
-	case $host in
-	*cygwin* | *mingw* | *cegcc* )
-	  if test -f "$output_objdir/$my_outputname.def"; then
-	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
-	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
-	  else
-	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	  fi
-	  ;;
-	*)
-	  compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	  finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
-	  ;;
-	esac
-	;;
-      *)
-	func_fatal_error "unknown suffix for \`$my_dlsyms'"
-	;;
-      esac
-    else
-      # We keep going just in case the user didn't refer to
-      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
-      # really was required.
-
-      # Nullify the symbol file.
-      compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
-      finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
-    fi
-}
-
-# func_win32_libid arg
-# return the library type of file 'arg'
-#
-# Need a lot of goo to handle *both* DLLs and import libs
-# Has to be a shell function in order to 'eat' the argument
-# that is supplied when $file_magic_command is called.
-# Despite the name, also deal with 64 bit binaries.
-func_win32_libid ()
-{
-  $opt_debug
-  win32_libid_type="unknown"
-  win32_fileres=`file -L $1 2>/dev/null`
-  case $win32_fileres in
-  *ar\ archive\ import\ library*) # definitely import
-    win32_libid_type="x86 archive import"
-    ;;
-  *ar\ archive*) # could be an import, or static
-    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
-    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
-       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
-      win32_nmres=`eval $NM -f posix -A $1 |
-	$SED -n -e '
-	    1,100{
-		/ I /{
-		    s,.*,import,
-		    p
-		    q
-		}
-	    }'`
-      case $win32_nmres in
-      import*)  win32_libid_type="x86 archive import";;
-      *)        win32_libid_type="x86 archive static";;
-      esac
-    fi
-    ;;
-  *DLL*)
-    win32_libid_type="x86 DLL"
-    ;;
-  *executable*) # but shell scripts are "executable" too...
-    case $win32_fileres in
-    *MS\ Windows\ PE\ Intel*)
-      win32_libid_type="x86 DLL"
-      ;;
-    esac
-    ;;
-  esac
-  $ECHO "$win32_libid_type"
-}
-
-
-
-# func_extract_an_archive dir oldlib
-func_extract_an_archive ()
-{
-    $opt_debug
-    f_ex_an_ar_dir="$1"; shift
-    f_ex_an_ar_oldlib="$1"
-    if test "$lock_old_archive_extraction" = yes; then
-      lockfile=$f_ex_an_ar_oldlib.lock
-      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
-	func_echo "Waiting for $lockfile to be removed"
-	sleep 2
-      done
-    fi
-    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
-		   'stat=$?; rm -f "$lockfile"; exit $stat'
-    if test "$lock_old_archive_extraction" = yes; then
-      $opt_dry_run || rm -f "$lockfile"
-    fi
-    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
-     :
-    else
-      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
-    fi
-}
-
-
-# func_extract_archives gentop oldlib ...
-func_extract_archives ()
-{
-    $opt_debug
-    my_gentop="$1"; shift
-    my_oldlibs=${1+"$@"}
-    my_oldobjs=""
-    my_xlib=""
-    my_xabs=""
-    my_xdir=""
-
-    for my_xlib in $my_oldlibs; do
-      # Extract the objects.
-      case $my_xlib in
-	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
-	*) my_xabs=`pwd`"/$my_xlib" ;;
-      esac
-      func_basename "$my_xlib"
-      my_xlib="$func_basename_result"
-      my_xlib_u=$my_xlib
-      while :; do
-        case " $extracted_archives " in
-	*" $my_xlib_u "*)
-	  func_arith $extracted_serial + 1
-	  extracted_serial=$func_arith_result
-	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
-	*) break ;;
-	esac
-      done
-      extracted_archives="$extracted_archives $my_xlib_u"
-      my_xdir="$my_gentop/$my_xlib_u"
-
-      func_mkdir_p "$my_xdir"
-
-      case $host in
-      *-darwin*)
-	func_verbose "Extracting $my_xabs"
-	# Do not bother doing anything if just a dry run
-	$opt_dry_run || {
-	  darwin_orig_dir=`pwd`
-	  cd $my_xdir || exit $?
-	  darwin_archive=$my_xabs
-	  darwin_curdir=`pwd`
-	  darwin_base_archive=`basename "$darwin_archive"`
-	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
-	  if test -n "$darwin_arches"; then
-	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
-	    darwin_arch=
-	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
-	    for darwin_arch in  $darwin_arches ; do
-	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
-	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
-	      cd "$darwin_curdir"
-	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
-	    done # $darwin_arches
-            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
-	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
-	    darwin_file=
-	    darwin_files=
-	    for darwin_file in $darwin_filelist; do
-	      darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
-	      $LIPO -create -output "$darwin_file" $darwin_files
-	    done # $darwin_filelist
-	    $RM -rf unfat-$$
-	    cd "$darwin_orig_dir"
-	  else
-	    cd $darwin_orig_dir
-	    func_extract_an_archive "$my_xdir" "$my_xabs"
-	  fi # $darwin_arches
-	} # !$opt_dry_run
-	;;
-      *)
-        func_extract_an_archive "$my_xdir" "$my_xabs"
-	;;
-      esac
-      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
-    done
-
-    func_extract_archives_result="$my_oldobjs"
-}
-
-
-# func_emit_wrapper [arg=no]
-#
-# Emit a libtool wrapper script on stdout.
-# Don't directly open a file because we may want to
-# incorporate the script contents within a cygwin/mingw
-# wrapper executable.  Must ONLY be called from within
-# func_mode_link because it depends on a number of variables
-# set therein.
-#
-# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
-# variable will take.  If 'yes', then the emitted script
-# will assume that the directory in which it is stored is
-# the $objdir directory.  This is a cygwin/mingw-specific
-# behavior.
-func_emit_wrapper ()
-{
-	func_emit_wrapper_arg1=${1-no}
-
-	$ECHO "\
-#! $SHELL
-
-# $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# The $output program cannot be directly executed until all the libtool
-# libraries that it depends on are installed.
-#
-# This wrapper script should never be moved out of the build directory.
-# If it is, it will not operate correctly.
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-sed_quote_subst='$sed_quote_subst'
-
-# Be Bourne compatible
-if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '\${1+\"\$@\"}'='\"\$@\"'
-  setopt NO_GLOB_SUBST
-else
-  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-relink_command=\"$relink_command\"
-
-# This environment variable determines our operation mode.
-if test \"\$libtool_install_magic\" = \"$magic\"; then
-  # install mode needs the following variables:
-  generated_by_libtool_version='$macro_version'
-  notinst_deplibs='$notinst_deplibs'
-else
-  # When we are sourced in execute mode, \$file and \$ECHO are already set.
-  if test \"\$libtool_execute_magic\" != \"$magic\"; then
-    file=\"\$0\""
-
-    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
-    $ECHO "\
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-\$1
-_LTECHO_EOF'
-}
-    ECHO=\"$qECHO\"
-  fi
-
-# Very basic option parsing. These options are (a) specific to
-# the libtool wrapper, (b) are identical between the wrapper
-# /script/ and the wrapper /executable/ which is used only on
-# windows platforms, and (c) all begin with the string "--lt-"
-# (application programs are unlikely to have options which match
-# this pattern).
-#
-# There are only two supported options: --lt-debug and
-# --lt-dump-script. There is, deliberately, no --lt-help.
-#
-# The first argument to this parsing function should be the
-# script's $0 value, followed by "$@".
-lt_option_debug=
-func_parse_lt_options ()
-{
-  lt_script_arg0=\$0
-  shift
-  for lt_opt
-  do
-    case \"\$lt_opt\" in
-    --lt-debug) lt_option_debug=1 ;;
-    --lt-dump-script)
-        lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
-        test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
-        lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
-        cat \"\$lt_dump_D/\$lt_dump_F\"
-        exit 0
-      ;;
-    --lt-*)
-        \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
-        exit 1
-      ;;
-    esac
-  done
-
-  # Print the debug banner immediately:
-  if test -n \"\$lt_option_debug\"; then
-    echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
-  fi
-}
-
-# Used when --lt-debug. Prints its arguments to stdout
-# (redirection is the responsibility of the caller)
-func_lt_dump_args ()
-{
-  lt_dump_args_N=1;
-  for lt_arg
-  do
-    \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
-    lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
-  done
-}
-
-# Core function for launching the target application
-func_exec_program_core ()
-{
-"
-  case $host in
-  # Backslashes separate directories on plain windows
-  *-*-mingw | *-*-os2* | *-cegcc*)
-    $ECHO "\
-      if test -n \"\$lt_option_debug\"; then
-        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
-        func_lt_dump_args \${1+\"\$@\"} 1>&2
-      fi
-      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
-"
-    ;;
-
-  *)
-    $ECHO "\
-      if test -n \"\$lt_option_debug\"; then
-        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
-        func_lt_dump_args \${1+\"\$@\"} 1>&2
-      fi
-      exec \"\$progdir/\$program\" \${1+\"\$@\"}
-"
-    ;;
-  esac
-  $ECHO "\
-      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
-      exit 1
-}
-
-# A function to encapsulate launching the target application
-# Strips options in the --lt-* namespace from \$@ and
-# launches target application with the remaining arguments.
-func_exec_program ()
-{
-  for lt_wr_arg
-  do
-    case \$lt_wr_arg in
-    --lt-*) ;;
-    *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
-    esac
-    shift
-  done
-  func_exec_program_core \${1+\"\$@\"}
-}
-
-  # Parse options
-  func_parse_lt_options \"\$0\" \${1+\"\$@\"}
-
-  # Find the directory that this script lives in.
-  thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
-  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
-
-  # Follow symbolic links until we get to the real thisdir.
-  file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
-  while test -n \"\$file\"; do
-    destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
-
-    # If there was a directory component, then change thisdir.
-    if test \"x\$destdir\" != \"x\$file\"; then
-      case \"\$destdir\" in
-      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
-      *) thisdir=\"\$thisdir/\$destdir\" ;;
-      esac
-    fi
-
-    file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
-    file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
-  done
-
-  # Usually 'no', except on cygwin/mingw when embedded into
-  # the cwrapper.
-  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
-  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
-    # special case for '.'
-    if test \"\$thisdir\" = \".\"; then
-      thisdir=\`pwd\`
-    fi
-    # remove .libs from thisdir
-    case \"\$thisdir\" in
-    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
-    $objdir )   thisdir=. ;;
-    esac
-  fi
-
-  # Try to get the absolute directory name.
-  absdir=\`cd \"\$thisdir\" && pwd\`
-  test -n \"\$absdir\" && thisdir=\"\$absdir\"
-"
-
-	if test "$fast_install" = yes; then
-	  $ECHO "\
-  program=lt-'$outputname'$exeext
-  progdir=\"\$thisdir/$objdir\"
-
-  if test ! -f \"\$progdir/\$program\" ||
-     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
-       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
-
-    file=\"\$\$-\$program\"
-
-    if test ! -d \"\$progdir\"; then
-      $MKDIR \"\$progdir\"
-    else
-      $RM \"\$progdir/\$file\"
-    fi"
-
-	  $ECHO "\
-
-    # relink executable if necessary
-    if test -n \"\$relink_command\"; then
-      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
-      else
-	$ECHO \"\$relink_command_output\" >&2
-	$RM \"\$progdir/\$file\"
-	exit 1
-      fi
-    fi
-
-    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
-    { $RM \"\$progdir/\$program\";
-      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
-    $RM \"\$progdir/\$file\"
-  fi"
-	else
-	  $ECHO "\
-  program='$outputname'
-  progdir=\"\$thisdir/$objdir\"
-"
-	fi
-
-	$ECHO "\
-
-  if test -f \"\$progdir/\$program\"; then"
-
-	# Export our shlibpath_var if we have one.
-	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-	  $ECHO "\
-    # Add our own library path to $shlibpath_var
-    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
-
-    # Some systems cannot cope with colon-terminated $shlibpath_var
-    # The second colon is a workaround for a bug in BeOS R4 sed
-    $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
-
-    export $shlibpath_var
-"
-	fi
-
-	# fixup the dll searchpath if we need to.
-	if test -n "$dllsearchpath"; then
-	  $ECHO "\
-    # Add the dll search path components to the executable PATH
-    PATH=$dllsearchpath:\$PATH
-"
-	fi
-
-	$ECHO "\
-    if test \"\$libtool_execute_magic\" != \"$magic\"; then
-      # Run the actual program with our arguments.
-      func_exec_program \${1+\"\$@\"}
-    fi
-  else
-    # The program doesn't exist.
-    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
-    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
-    \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
-    exit 1
-  fi
-fi\
-"
-}
-
-
-# func_to_host_path arg
-#
-# Convert paths to host format when used with build tools.
-# Intended for use with "native" mingw (where libtool itself
-# is running under the msys shell), or in the following cross-
-# build environments:
-#    $build          $host
-#    mingw (msys)    mingw  [e.g. native]
-#    cygwin          mingw
-#    *nix + wine     mingw
-# where wine is equipped with the `winepath' executable.
-# In the native mingw case, the (msys) shell automatically
-# converts paths for any non-msys applications it launches,
-# but that facility isn't available from inside the cwrapper.
-# Similar accommodations are necessary for $host mingw and
-# $build cygwin.  Calling this function does no harm for other
-# $host/$build combinations not listed above.
-#
-# ARG is the path (on $build) that should be converted to
-# the proper representation for $host. The result is stored
-# in $func_to_host_path_result.
-func_to_host_path ()
-{
-  func_to_host_path_result="$1"
-  if test -n "$1"; then
-    case $host in
-      *mingw* )
-        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-        case $build in
-          *mingw* ) # actually, msys
-            # awkward: cmd appends spaces to result
-            func_to_host_path_result=`( cmd //c echo "$1" ) 2>/dev/null |
-              $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
-            ;;
-          *cygwin* )
-            func_to_host_path_result=`cygpath -w "$1" |
-	      $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          * )
-            # Unfortunately, winepath does not exit with a non-zero
-            # error code, so we are forced to check the contents of
-            # stdout. On the other hand, if the command is not
-            # found, the shell will set an exit code of 127 and print
-            # *an error message* to stdout. So we must check for both
-            # error code of zero AND non-empty stdout, which explains
-            # the odd construction:
-            func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null`
-            if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then
-              func_to_host_path_result=`$ECHO "$func_to_host_path_tmp1" |
-                $SED -e "$lt_sed_naive_backslashify"`
-            else
-              # Allow warning below.
-              func_to_host_path_result=
-            fi
-            ;;
-        esac
-        if test -z "$func_to_host_path_result" ; then
-          func_error "Could not determine host path corresponding to"
-          func_error "  \`$1'"
-          func_error "Continuing, but uninstalled executables may not work."
-          # Fallback:
-          func_to_host_path_result="$1"
-        fi
-        ;;
-    esac
-  fi
-}
-# end: func_to_host_path
-
-# func_to_host_pathlist arg
-#
-# Convert pathlists to host format when used with build tools.
-# See func_to_host_path(), above. This function supports the
-# following $build/$host combinations (but does no harm for
-# combinations not listed here):
-#    $build          $host
-#    mingw (msys)    mingw  [e.g. native]
-#    cygwin          mingw
-#    *nix + wine     mingw
-#
-# Path separators are also converted from $build format to
-# $host format. If ARG begins or ends with a path separator
-# character, it is preserved (but converted to $host format)
-# on output.
-#
-# ARG is a pathlist (on $build) that should be converted to
-# the proper representation on $host. The result is stored
-# in $func_to_host_pathlist_result.
-func_to_host_pathlist ()
-{
-  func_to_host_pathlist_result="$1"
-  if test -n "$1"; then
-    case $host in
-      *mingw* )
-        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-        # Remove leading and trailing path separator characters from
-        # ARG. msys behavior is inconsistent here, cygpath turns them
-        # into '.;' and ';.', and winepath ignores them completely.
-	func_stripname : : "$1"
-        func_to_host_pathlist_tmp1=$func_stripname_result
-        case $build in
-          *mingw* ) # Actually, msys.
-            # Awkward: cmd appends spaces to result.
-            func_to_host_pathlist_result=`
-	      ( cmd //c echo "$func_to_host_pathlist_tmp1" ) 2>/dev/null |
-	      $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
-            ;;
-          *cygwin* )
-            func_to_host_pathlist_result=`cygpath -w -p "$func_to_host_pathlist_tmp1" |
-              $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          * )
-            # unfortunately, winepath doesn't convert pathlists
-            func_to_host_pathlist_result=""
-            func_to_host_pathlist_oldIFS=$IFS
-            IFS=:
-            for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do
-              IFS=$func_to_host_pathlist_oldIFS
-              if test -n "$func_to_host_pathlist_f" ; then
-                func_to_host_path "$func_to_host_pathlist_f"
-                if test -n "$func_to_host_path_result" ; then
-                  if test -z "$func_to_host_pathlist_result" ; then
-                    func_to_host_pathlist_result="$func_to_host_path_result"
-                  else
-                    func_append func_to_host_pathlist_result ";$func_to_host_path_result"
-                  fi
-                fi
-              fi
-            done
-            IFS=$func_to_host_pathlist_oldIFS
-            ;;
-        esac
-        if test -z "$func_to_host_pathlist_result"; then
-          func_error "Could not determine the host path(s) corresponding to"
-          func_error "  \`$1'"
-          func_error "Continuing, but uninstalled executables may not work."
-          # Fallback. This may break if $1 contains DOS-style drive
-          # specifications. The fix is not to complicate the expression
-          # below, but for the user to provide a working wine installation
-          # with winepath so that path translation in the cross-to-mingw
-          # case works properly.
-          lt_replace_pathsep_nix_to_dos="s|:|;|g"
-          func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\
-            $SED -e "$lt_replace_pathsep_nix_to_dos"`
-        fi
-        # Now, add the leading and trailing path separators back
-        case "$1" in
-          :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result"
-            ;;
-        esac
-        case "$1" in
-          *: ) func_append func_to_host_pathlist_result ";"
-            ;;
-        esac
-        ;;
-    esac
-  fi
-}
-# end: func_to_host_pathlist
-
-# func_emit_cwrapperexe_src
-# emit the source code for a wrapper executable on stdout
-# Must ONLY be called from within func_mode_link because
-# it depends on a number of variable set therein.
-func_emit_cwrapperexe_src ()
-{
-	cat <<EOF
-
-/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
-   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-
-   The $output program cannot be directly executed until all the libtool
-   libraries that it depends on are installed.
-
-   This wrapper executable should never be moved out of the build directory.
-   If it is, it will not operate correctly.
-*/
-EOF
-	    cat <<"EOF"
-#ifdef _MSC_VER
-# define _CRT_SECURE_NO_DEPRECATE 1
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#ifdef _MSC_VER
-# include <direct.h>
-# include <process.h>
-# include <io.h>
-#else
-# include <unistd.h>
-# include <stdint.h>
-# ifdef __CYGWIN__
-#  include <io.h>
-# endif
-#endif
-#include <malloc.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-
-/* declarations of non-ANSI functions */
-#if defined(__MINGW32__)
-# ifdef __STRICT_ANSI__
-int _putenv (const char *);
-# endif
-#elif defined(__CYGWIN__)
-# ifdef __STRICT_ANSI__
-char *realpath (const char *, char *);
-int putenv (char *);
-int setenv (const char *, const char *, int);
-# endif
-/* #elif defined (other platforms) ... */
-#endif
-
-/* portability defines, excluding path handling macros */
-#if defined(_MSC_VER)
-# define setmode _setmode
-# define stat    _stat
-# define chmod   _chmod
-# define getcwd  _getcwd
-# define putenv  _putenv
-# define S_IXUSR _S_IEXEC
-# ifndef _INTPTR_T_DEFINED
-#  define _INTPTR_T_DEFINED
-#  define intptr_t int
-# endif
-#elif defined(__MINGW32__)
-# define setmode _setmode
-# define stat    _stat
-# define chmod   _chmod
-# define getcwd  _getcwd
-# define putenv  _putenv
-#elif defined(__CYGWIN__)
-# define HAVE_SETENV
-# define FOPEN_WB "wb"
-/* #elif defined (other platforms) ... */
-#endif
-
-#if defined(PATH_MAX)
-# define LT_PATHMAX PATH_MAX
-#elif defined(MAXPATHLEN)
-# define LT_PATHMAX MAXPATHLEN
-#else
-# define LT_PATHMAX 1024
-#endif
-
-#ifndef S_IXOTH
-# define S_IXOTH 0
-#endif
-#ifndef S_IXGRP
-# define S_IXGRP 0
-#endif
-
-/* path handling portability macros */
-#ifndef DIR_SEPARATOR
-# define DIR_SEPARATOR '/'
-# define PATH_SEPARATOR ':'
-#endif
-
-#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
-  defined (__OS2__)
-# define HAVE_DOS_BASED_FILE_SYSTEM
-# define FOPEN_WB "wb"
-# ifndef DIR_SEPARATOR_2
-#  define DIR_SEPARATOR_2 '\\'
-# endif
-# ifndef PATH_SEPARATOR_2
-#  define PATH_SEPARATOR_2 ';'
-# endif
-#endif
-
-#ifndef DIR_SEPARATOR_2
-# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
-#else /* DIR_SEPARATOR_2 */
-# define IS_DIR_SEPARATOR(ch) \
-	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
-#endif /* DIR_SEPARATOR_2 */
-
-#ifndef PATH_SEPARATOR_2
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
-#else /* PATH_SEPARATOR_2 */
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
-#endif /* PATH_SEPARATOR_2 */
-
-#ifndef FOPEN_WB
-# define FOPEN_WB "w"
-#endif
-#ifndef _O_BINARY
-# define _O_BINARY 0
-#endif
-
-#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
-#define XFREE(stale) do { \
-  if (stale) { free ((void *) stale); stale = 0; } \
-} while (0)
-
-#if defined(LT_DEBUGWRAPPER)
-static int lt_debug = 1;
-#else
-static int lt_debug = 0;
-#endif
-
-const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
-
-void *xmalloc (size_t num);
-char *xstrdup (const char *string);
-const char *base_name (const char *name);
-char *find_executable (const char *wrapper);
-char *chase_symlinks (const char *pathspec);
-int make_executable (const char *path);
-int check_executable (const char *path);
-char *strendzap (char *str, const char *pat);
-void lt_debugprintf (const char *file, int line, const char *fmt, ...);
-void lt_fatal (const char *file, int line, const char *message, ...);
-static const char *nonnull (const char *s);
-static const char *nonempty (const char *s);
-void lt_setenv (const char *name, const char *value);
-char *lt_extend_str (const char *orig_value, const char *add, int to_end);
-void lt_update_exe_path (const char *name, const char *value);
-void lt_update_lib_path (const char *name, const char *value);
-char **prepare_spawn (char **argv);
-void lt_dump_script (FILE *f);
-EOF
-
-	    cat <<EOF
-const char * MAGIC_EXE = "$magic_exe";
-const char * LIB_PATH_VARNAME = "$shlibpath_var";
-EOF
-
-	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-              func_to_host_pathlist "$temp_rpath"
-	      cat <<EOF
-const char * LIB_PATH_VALUE   = "$func_to_host_pathlist_result";
-EOF
-	    else
-	      cat <<"EOF"
-const char * LIB_PATH_VALUE   = "";
-EOF
-	    fi
-
-	    if test -n "$dllsearchpath"; then
-              func_to_host_pathlist "$dllsearchpath:"
-	      cat <<EOF
-const char * EXE_PATH_VARNAME = "PATH";
-const char * EXE_PATH_VALUE   = "$func_to_host_pathlist_result";
-EOF
-	    else
-	      cat <<"EOF"
-const char * EXE_PATH_VARNAME = "";
-const char * EXE_PATH_VALUE   = "";
-EOF
-	    fi
-
-	    if test "$fast_install" = yes; then
-	      cat <<EOF
-const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
-EOF
-	    else
-	      cat <<EOF
-const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
-EOF
-	    fi
-
-
-	    cat <<"EOF"
-
-#define LTWRAPPER_OPTION_PREFIX         "--lt-"
-
-static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
-static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
-static const char *debug_opt            = LTWRAPPER_OPTION_PREFIX "debug";
-
-int
-main (int argc, char *argv[])
-{
-  char **newargz;
-  int  newargc;
-  char *tmp_pathspec;
-  char *actual_cwrapper_path;
-  char *actual_cwrapper_name;
-  char *target_name;
-  char *lt_argv_zero;
-  intptr_t rval = 127;
-
-  int i;
-
-  program_name = (char *) xstrdup (base_name (argv[0]));
-  newargz = XMALLOC (char *, argc + 1);
-
-  /* very simple arg parsing; don't want to rely on getopt
-   * also, copy all non cwrapper options to newargz, except
-   * argz[0], which is handled differently
-   */
-  newargc=0;
-  for (i = 1; i < argc; i++)
-    {
-      if (strcmp (argv[i], dumpscript_opt) == 0)
-	{
-EOF
-	    case "$host" in
-	      *mingw* | *cygwin* )
-		# make stdout use "unix" line endings
-		echo "          setmode(1,_O_BINARY);"
-		;;
-	      esac
-
-	    cat <<"EOF"
-	  lt_dump_script (stdout);
-	  return 0;
-	}
-      if (strcmp (argv[i], debug_opt) == 0)
-	{
-          lt_debug = 1;
-          continue;
-	}
-      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
-        {
-          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
-             namespace, but it is not one of the ones we know about and
-             have already dealt with, above (inluding dump-script), then
-             report an error. Otherwise, targets might begin to believe
-             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
-             namespace. The first time any user complains about this, we'll
-             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
-             or a configure.ac-settable value.
-           */
-          lt_fatal (__FILE__, __LINE__,
-		    "unrecognized %s option: '%s'",
-                    ltwrapper_option_prefix, argv[i]);
-        }
-      /* otherwise ... */
-      newargz[++newargc] = xstrdup (argv[i]);
-    }
-  newargz[++newargc] = NULL;
-
-EOF
-	    cat <<EOF
-  /* The GNU banner must be the first non-error debug message */
-  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
-EOF
-	    cat <<"EOF"
-  lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
-  lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
-
-  tmp_pathspec = find_executable (argv[0]);
-  if (tmp_pathspec == NULL)
-    lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
-  lt_debugprintf (__FILE__, __LINE__,
-                  "(main) found exe (before symlink chase) at: %s\n",
-		  tmp_pathspec);
-
-  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
-  lt_debugprintf (__FILE__, __LINE__,
-                  "(main) found exe (after symlink chase) at: %s\n",
-		  actual_cwrapper_path);
-  XFREE (tmp_pathspec);
-
-  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
-  strendzap (actual_cwrapper_path, actual_cwrapper_name);
-
-  /* wrapper name transforms */
-  strendzap (actual_cwrapper_name, ".exe");
-  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
-  XFREE (actual_cwrapper_name);
-  actual_cwrapper_name = tmp_pathspec;
-  tmp_pathspec = 0;
-
-  /* target_name transforms -- use actual target program name; might have lt- prefix */
-  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
-  strendzap (target_name, ".exe");
-  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
-  XFREE (target_name);
-  target_name = tmp_pathspec;
-  tmp_pathspec = 0;
-
-  lt_debugprintf (__FILE__, __LINE__,
-		  "(main) libtool target name: %s\n",
-		  target_name);
-EOF
-
-	    cat <<EOF
-  newargz[0] =
-    XMALLOC (char, (strlen (actual_cwrapper_path) +
-		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
-  strcpy (newargz[0], actual_cwrapper_path);
-  strcat (newargz[0], "$objdir");
-  strcat (newargz[0], "/");
-EOF
-
-	    cat <<"EOF"
-  /* stop here, and copy so we don't have to do this twice */
-  tmp_pathspec = xstrdup (newargz[0]);
-
-  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
-  strcat (newargz[0], actual_cwrapper_name);
-
-  /* DO want the lt- prefix here if it exists, so use target_name */
-  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
-  XFREE (tmp_pathspec);
-  tmp_pathspec = NULL;
-EOF
-
-	    case $host_os in
-	      mingw*)
-	    cat <<"EOF"
-  {
-    char* p;
-    while ((p = strchr (newargz[0], '\\')) != NULL)
-      {
-	*p = '/';
-      }
-    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
-      {
-	*p = '/';
-      }
-  }
-EOF
-	    ;;
-	    esac
-
-	    cat <<"EOF"
-  XFREE (target_name);
-  XFREE (actual_cwrapper_path);
-  XFREE (actual_cwrapper_name);
-
-  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
-  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
-  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
-  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
-
-  lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
-		  nonnull (lt_argv_zero));
-  for (i = 0; i < newargc; i++)
-    {
-      lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
-		      i, nonnull (newargz[i]));
-    }
-
-EOF
-
-	    case $host_os in
-	      mingw*)
-		cat <<"EOF"
-  /* execv doesn't actually work on mingw as expected on unix */
-  newargz = prepare_spawn (newargz);
-  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
-  if (rval == -1)
-    {
-      /* failed to start process */
-      lt_debugprintf (__FILE__, __LINE__,
-		      "(main) failed to launch target \"%s\": %s\n",
-		      lt_argv_zero, nonnull (strerror (errno)));
-      return 127;
-    }
-  return rval;
-EOF
-		;;
-	      *)
-		cat <<"EOF"
-  execv (lt_argv_zero, newargz);
-  return rval; /* =127, but avoids unused variable warning */
-EOF
-		;;
-	    esac
-
-	    cat <<"EOF"
-}
-
-void *
-xmalloc (size_t num)
-{
-  void *p = (void *) malloc (num);
-  if (!p)
-    lt_fatal (__FILE__, __LINE__, "memory exhausted");
-
-  return p;
-}
-
-char *
-xstrdup (const char *string)
-{
-  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
-			  string) : NULL;
-}
-
-const char *
-base_name (const char *name)
-{
-  const char *base;
-
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  /* Skip over the disk name in MSDOS pathnames. */
-  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
-    name += 2;
-#endif
-
-  for (base = name; *name; name++)
-    if (IS_DIR_SEPARATOR (*name))
-      base = name + 1;
-  return base;
-}
-
-int
-check_executable (const char *path)
-{
-  struct stat st;
-
-  lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
-                  nonempty (path));
-  if ((!path) || (!*path))
-    return 0;
-
-  if ((stat (path, &st) >= 0)
-      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
-    return 1;
-  else
-    return 0;
-}
-
-int
-make_executable (const char *path)
-{
-  int rval = 0;
-  struct stat st;
-
-  lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
-                  nonempty (path));
-  if ((!path) || (!*path))
-    return 0;
-
-  if (stat (path, &st) >= 0)
-    {
-      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
-    }
-  return rval;
-}
-
-/* Searches for the full path of the wrapper.  Returns
-   newly allocated full path name if found, NULL otherwise
-   Does not chase symlinks, even on platforms that support them.
-*/
-char *
-find_executable (const char *wrapper)
-{
-  int has_slash = 0;
-  const char *p;
-  const char *p_next;
-  /* static buffer for getcwd */
-  char tmp[LT_PATHMAX + 1];
-  int tmp_len;
-  char *concat_name;
-
-  lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
-                  nonempty (wrapper));
-
-  if ((wrapper == NULL) || (*wrapper == '\0'))
-    return NULL;
-
-  /* Absolute path? */
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
-    {
-      concat_name = xstrdup (wrapper);
-      if (check_executable (concat_name))
-	return concat_name;
-      XFREE (concat_name);
-    }
-  else
-    {
-#endif
-      if (IS_DIR_SEPARATOR (wrapper[0]))
-	{
-	  concat_name = xstrdup (wrapper);
-	  if (check_executable (concat_name))
-	    return concat_name;
-	  XFREE (concat_name);
-	}
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-    }
-#endif
-
-  for (p = wrapper; *p; p++)
-    if (*p == '/')
-      {
-	has_slash = 1;
-	break;
-      }
-  if (!has_slash)
-    {
-      /* no slashes; search PATH */
-      const char *path = getenv ("PATH");
-      if (path != NULL)
-	{
-	  for (p = path; *p; p = p_next)
-	    {
-	      const char *q;
-	      size_t p_len;
-	      for (q = p; *q; q++)
-		if (IS_PATH_SEPARATOR (*q))
-		  break;
-	      p_len = q - p;
-	      p_next = (*q == '\0' ? q : q + 1);
-	      if (p_len == 0)
-		{
-		  /* empty path: current directory */
-		  if (getcwd (tmp, LT_PATHMAX) == NULL)
-		    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
-                              nonnull (strerror (errno)));
-		  tmp_len = strlen (tmp);
-		  concat_name =
-		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
-		  memcpy (concat_name, tmp, tmp_len);
-		  concat_name[tmp_len] = '/';
-		  strcpy (concat_name + tmp_len + 1, wrapper);
-		}
-	      else
-		{
-		  concat_name =
-		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
-		  memcpy (concat_name, p, p_len);
-		  concat_name[p_len] = '/';
-		  strcpy (concat_name + p_len + 1, wrapper);
-		}
-	      if (check_executable (concat_name))
-		return concat_name;
-	      XFREE (concat_name);
-	    }
-	}
-      /* not found in PATH; assume curdir */
-    }
-  /* Relative path | not found in path: prepend cwd */
-  if (getcwd (tmp, LT_PATHMAX) == NULL)
-    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
-              nonnull (strerror (errno)));
-  tmp_len = strlen (tmp);
-  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
-  memcpy (concat_name, tmp, tmp_len);
-  concat_name[tmp_len] = '/';
-  strcpy (concat_name + tmp_len + 1, wrapper);
-
-  if (check_executable (concat_name))
-    return concat_name;
-  XFREE (concat_name);
-  return NULL;
-}
-
-char *
-chase_symlinks (const char *pathspec)
-{
-#ifndef S_ISLNK
-  return xstrdup (pathspec);
-#else
-  char buf[LT_PATHMAX];
-  struct stat s;
-  char *tmp_pathspec = xstrdup (pathspec);
-  char *p;
-  int has_symlinks = 0;
-  while (strlen (tmp_pathspec) && !has_symlinks)
-    {
-      lt_debugprintf (__FILE__, __LINE__,
-		      "checking path component for symlinks: %s\n",
-		      tmp_pathspec);
-      if (lstat (tmp_pathspec, &s) == 0)
-	{
-	  if (S_ISLNK (s.st_mode) != 0)
-	    {
-	      has_symlinks = 1;
-	      break;
-	    }
-
-	  /* search backwards for last DIR_SEPARATOR */
-	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
-	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
-	    p--;
-	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
-	    {
-	      /* no more DIR_SEPARATORS left */
-	      break;
-	    }
-	  *p = '\0';
-	}
-      else
-	{
-	  lt_fatal (__FILE__, __LINE__,
-		    "error accessing file \"%s\": %s",
-		    tmp_pathspec, nonnull (strerror (errno)));
-	}
-    }
-  XFREE (tmp_pathspec);
-
-  if (!has_symlinks)
-    {
-      return xstrdup (pathspec);
-    }
-
-  tmp_pathspec = realpath (pathspec, buf);
-  if (tmp_pathspec == 0)
-    {
-      lt_fatal (__FILE__, __LINE__,
-		"could not follow symlinks for %s", pathspec);
-    }
-  return xstrdup (tmp_pathspec);
-#endif
-}
-
-char *
-strendzap (char *str, const char *pat)
-{
-  size_t len, patlen;
-
-  assert (str != NULL);
-  assert (pat != NULL);
-
-  len = strlen (str);
-  patlen = strlen (pat);
-
-  if (patlen <= len)
-    {
-      str += len - patlen;
-      if (strcmp (str, pat) == 0)
-	*str = '\0';
-    }
-  return str;
-}
-
-void
-lt_debugprintf (const char *file, int line, const char *fmt, ...)
-{
-  va_list args;
-  if (lt_debug)
-    {
-      (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
-      va_start (args, fmt);
-      (void) vfprintf (stderr, fmt, args);
-      va_end (args);
-    }
-}
-
-static void
-lt_error_core (int exit_status, const char *file,
-	       int line, const char *mode,
-	       const char *message, va_list ap)
-{
-  fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
-  vfprintf (stderr, message, ap);
-  fprintf (stderr, ".\n");
-
-  if (exit_status >= 0)
-    exit (exit_status);
-}
-
-void
-lt_fatal (const char *file, int line, const char *message, ...)
-{
-  va_list ap;
-  va_start (ap, message);
-  lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
-  va_end (ap);
-}
-
-static const char *
-nonnull (const char *s)
-{
-  return s ? s : "(null)";
-}
-
-static const char *
-nonempty (const char *s)
-{
-  return (s && !*s) ? "(empty)" : nonnull (s);
-}
-
-void
-lt_setenv (const char *name, const char *value)
-{
-  lt_debugprintf (__FILE__, __LINE__,
-		  "(lt_setenv) setting '%s' to '%s'\n",
-                  nonnull (name), nonnull (value));
-  {
-#ifdef HAVE_SETENV
-    /* always make a copy, for consistency with !HAVE_SETENV */
-    char *str = xstrdup (value);
-    setenv (name, str, 1);
-#else
-    int len = strlen (name) + 1 + strlen (value) + 1;
-    char *str = XMALLOC (char, len);
-    sprintf (str, "%s=%s", name, value);
-    if (putenv (str) != EXIT_SUCCESS)
-      {
-        XFREE (str);
-      }
-#endif
-  }
-}
-
-char *
-lt_extend_str (const char *orig_value, const char *add, int to_end)
-{
-  char *new_value;
-  if (orig_value && *orig_value)
-    {
-      int orig_value_len = strlen (orig_value);
-      int add_len = strlen (add);
-      new_value = XMALLOC (char, add_len + orig_value_len + 1);
-      if (to_end)
-        {
-          strcpy (new_value, orig_value);
-          strcpy (new_value + orig_value_len, add);
-        }
-      else
-        {
-          strcpy (new_value, add);
-          strcpy (new_value + add_len, orig_value);
-        }
-    }
-  else
-    {
-      new_value = xstrdup (add);
-    }
-  return new_value;
-}
-
-void
-lt_update_exe_path (const char *name, const char *value)
-{
-  lt_debugprintf (__FILE__, __LINE__,
-		  "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
-                  nonnull (name), nonnull (value));
-
-  if (name && *name && value && *value)
-    {
-      char *new_value = lt_extend_str (getenv (name), value, 0);
-      /* some systems can't cope with a ':'-terminated path #' */
-      int len = strlen (new_value);
-      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
-        {
-          new_value[len-1] = '\0';
-        }
-      lt_setenv (name, new_value);
-      XFREE (new_value);
-    }
-}
-
-void
-lt_update_lib_path (const char *name, const char *value)
-{
-  lt_debugprintf (__FILE__, __LINE__,
-		  "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
-                  nonnull (name), nonnull (value));
-
-  if (name && *name && value && *value)
-    {
-      char *new_value = lt_extend_str (getenv (name), value, 0);
-      lt_setenv (name, new_value);
-      XFREE (new_value);
-    }
-}
-
-EOF
-	    case $host_os in
-	      mingw*)
-		cat <<"EOF"
-
-/* Prepares an argument vector before calling spawn().
-   Note that spawn() does not by itself call the command interpreter
-     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
-      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-         GetVersionEx(&v);
-         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
-      }) ? "cmd.exe" : "command.com").
-   Instead it simply concatenates the arguments, separated by ' ', and calls
-   CreateProcess().  We must quote the arguments since Win32 CreateProcess()
-   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
-   special way:
-   - Space and tab are interpreted as delimiters. They are not treated as
-     delimiters if they are surrounded by double quotes: "...".
-   - Unescaped double quotes are removed from the input. Their only effect is
-     that within double quotes, space and tab are treated like normal
-     characters.
-   - Backslashes not followed by double quotes are not special.
-   - But 2*n+1 backslashes followed by a double quote become
-     n backslashes followed by a double quote (n >= 0):
-       \" -> "
-       \\\" -> \"
-       \\\\\" -> \\"
- */
-#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
-#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
-char **
-prepare_spawn (char **argv)
-{
-  size_t argc;
-  char **new_argv;
-  size_t i;
-
-  /* Count number of arguments.  */
-  for (argc = 0; argv[argc] != NULL; argc++)
-    ;
-
-  /* Allocate new argument vector.  */
-  new_argv = XMALLOC (char *, argc + 1);
-
-  /* Put quoted arguments into the new argument vector.  */
-  for (i = 0; i < argc; i++)
-    {
-      const char *string = argv[i];
-
-      if (string[0] == '\0')
-	new_argv[i] = xstrdup ("\"\"");
-      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
-	{
-	  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
-	  size_t length;
-	  unsigned int backslashes;
-	  const char *s;
-	  char *quoted_string;
-	  char *p;
-
-	  length = 0;
-	  backslashes = 0;
-	  if (quote_around)
-	    length++;
-	  for (s = string; *s != '\0'; s++)
-	    {
-	      char c = *s;
-	      if (c == '"')
-		length += backslashes + 1;
-	      length++;
-	      if (c == '\\')
-		backslashes++;
-	      else
-		backslashes = 0;
-	    }
-	  if (quote_around)
-	    length += backslashes + 1;
-
-	  quoted_string = XMALLOC (char, length + 1);
-
-	  p = quoted_string;
-	  backslashes = 0;
-	  if (quote_around)
-	    *p++ = '"';
-	  for (s = string; *s != '\0'; s++)
-	    {
-	      char c = *s;
-	      if (c == '"')
-		{
-		  unsigned int j;
-		  for (j = backslashes + 1; j > 0; j--)
-		    *p++ = '\\';
-		}
-	      *p++ = c;
-	      if (c == '\\')
-		backslashes++;
-	      else
-		backslashes = 0;
-	    }
-	  if (quote_around)
-	    {
-	      unsigned int j;
-	      for (j = backslashes; j > 0; j--)
-		*p++ = '\\';
-	      *p++ = '"';
-	    }
-	  *p = '\0';
-
-	  new_argv[i] = quoted_string;
-	}
-      else
-	new_argv[i] = (char *) string;
-    }
-  new_argv[argc] = NULL;
-
-  return new_argv;
-}
-EOF
-		;;
-	    esac
-
-            cat <<"EOF"
-void lt_dump_script (FILE* f)
-{
-EOF
-	    func_emit_wrapper yes |
-              $SED -e 's/\([\\"]\)/\\\1/g' \
-	           -e 's/^/  fputs ("/' -e 's/$/\\n", f);/'
-
-            cat <<"EOF"
-}
-EOF
-}
-# end: func_emit_cwrapperexe_src
-
-# func_win32_import_lib_p ARG
-# True if ARG is an import lib, as indicated by $file_magic_cmd
-func_win32_import_lib_p ()
-{
-    $opt_debug
-    case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
-    *import*) : ;;
-    *) false ;;
-    esac
-}
-
-# func_mode_link arg...
-func_mode_link ()
-{
-    $opt_debug
-    case $host in
-    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-      # It is impossible to link a dll without this setting, and
-      # we shouldn't force the makefile maintainer to figure out
-      # which system we are compiling for in order to pass an extra
-      # flag for every libtool invocation.
-      # allow_undefined=no
-
-      # FIXME: Unfortunately, there are problems with the above when trying
-      # to make a dll which has undefined symbols, in which case not
-      # even a static library is built.  For now, we need to specify
-      # -no-undefined on the libtool link line when we can be certain
-      # that all symbols are satisfied, otherwise we get a static library.
-      allow_undefined=yes
-      ;;
-    *)
-      allow_undefined=yes
-      ;;
-    esac
-    libtool_args=$nonopt
-    base_compile="$nonopt $@"
-    compile_command=$nonopt
-    finalize_command=$nonopt
-
-    compile_rpath=
-    finalize_rpath=
-    compile_shlibpath=
-    finalize_shlibpath=
-    convenience=
-    old_convenience=
-    deplibs=
-    old_deplibs=
-    compiler_flags=
-    linker_flags=
-    dllsearchpath=
-    lib_search_path=`pwd`
-    inst_prefix_dir=
-    new_inherited_linker_flags=
-
-    avoid_version=no
-    bindir=
-    dlfiles=
-    dlprefiles=
-    dlself=no
-    export_dynamic=no
-    export_symbols=
-    export_symbols_regex=
-    generated=
-    libobjs=
-    ltlibs=
-    module=no
-    no_install=no
-    objs=
-    non_pic_objects=
-    precious_files_regex=
-    prefer_static_libs=no
-    preload=no
-    prev=
-    prevarg=
-    release=
-    rpath=
-    xrpath=
-    perm_rpath=
-    temp_rpath=
-    thread_safe=no
-    vinfo=
-    vinfo_number=no
-    weak_libs=
-    single_module="${wl}-single_module"
-    func_infer_tag $base_compile
-
-    # We need to know -static, to get the right output filenames.
-    for arg
-    do
-      case $arg in
-      -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
-	build_old_libs=no
-	break
-	;;
-      -all-static | -static | -static-libtool-libs)
-	case $arg in
-	-all-static)
-	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
-	    func_warning "complete static linking is impossible in this configuration"
-	  fi
-	  if test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=yes
-	  ;;
-	-static)
-	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=built
-	  ;;
-	-static-libtool-libs)
-	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=yes
-	  ;;
-	esac
-	build_libtool_libs=no
-	build_old_libs=yes
-	break
-	;;
-      esac
-    done
-
-    # See if our shared archives depend on static archives.
-    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
-
-    # Go through the arguments, transforming them on the way.
-    while test "$#" -gt 0; do
-      arg="$1"
-      shift
-      func_quote_for_eval "$arg"
-      qarg=$func_quote_for_eval_unquoted_result
-      func_append libtool_args " $func_quote_for_eval_result"
-
-      # If the previous option needs an argument, assign it.
-      if test -n "$prev"; then
-	case $prev in
-	output)
-	  func_append compile_command " @OUTPUT@"
-	  func_append finalize_command " @OUTPUT@"
-	  ;;
-	esac
-
-	case $prev in
-	bindir)
-	  bindir="$arg"
-	  prev=
-	  continue
-	  ;;
-	dlfiles|dlprefiles)
-	  if test "$preload" = no; then
-	    # Add the symbol object into the linking commands.
-	    func_append compile_command " @SYMFILE@"
-	    func_append finalize_command " @SYMFILE@"
-	    preload=yes
-	  fi
-	  case $arg in
-	  *.la | *.lo) ;;  # We handle these cases below.
-	  force)
-	    if test "$dlself" = no; then
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  self)
-	    if test "$prev" = dlprefiles; then
-	      dlself=yes
-	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
-	      dlself=yes
-	    else
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  *)
-	    if test "$prev" = dlfiles; then
-	      dlfiles="$dlfiles $arg"
-	    else
-	      dlprefiles="$dlprefiles $arg"
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  esac
-	  ;;
-	expsyms)
-	  export_symbols="$arg"
-	  test -f "$arg" \
-	    || func_fatal_error "symbol file \`$arg' does not exist"
-	  prev=
-	  continue
-	  ;;
-	expsyms_regex)
-	  export_symbols_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	framework)
-	  case $host in
-	    *-*-darwin*)
-	      case "$deplibs " in
-		*" $qarg.ltframework "*) ;;
-		*) deplibs="$deplibs $qarg.ltframework" # this is fixed later
-		   ;;
-	      esac
-	      ;;
-	  esac
-	  prev=
-	  continue
-	  ;;
-	inst_prefix)
-	  inst_prefix_dir="$arg"
-	  prev=
-	  continue
-	  ;;
-	objectlist)
-	  if test -f "$arg"; then
-	    save_arg=$arg
-	    moreargs=
-	    for fil in `cat "$save_arg"`
-	    do
-#	      moreargs="$moreargs $fil"
-	      arg=$fil
-	      # A libtool-controlled object.
-
-	      # Check to see that this really is a libtool object.
-	      if func_lalib_unsafe_p "$arg"; then
-		pic_object=
-		non_pic_object=
-
-		# Read the .lo file
-		func_source "$arg"
-
-		if test -z "$pic_object" ||
-		   test -z "$non_pic_object" ||
-		   test "$pic_object" = none &&
-		   test "$non_pic_object" = none; then
-		  func_fatal_error "cannot find name of object for \`$arg'"
-		fi
-
-		# Extract subdirectory from the argument.
-		func_dirname "$arg" "/" ""
-		xdir="$func_dirname_result"
-
-		if test "$pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  pic_object="$xdir$pic_object"
-
-		  if test "$prev" = dlfiles; then
-		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		      dlfiles="$dlfiles $pic_object"
-		      prev=
-		      continue
-		    else
-		      # If libtool objects are unsupported, then we need to preload.
-		      prev=dlprefiles
-		    fi
-		  fi
-
-		  # CHECK ME:  I think I busted this.  -Ossama
-		  if test "$prev" = dlprefiles; then
-		    # Preload the old-style object.
-		    dlprefiles="$dlprefiles $pic_object"
-		    prev=
-		  fi
-
-		  # A PIC object.
-		  func_append libobjs " $pic_object"
-		  arg="$pic_object"
-		fi
-
-		# Non-PIC object.
-		if test "$non_pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  non_pic_object="$xdir$non_pic_object"
-
-		  # A standard non-PIC object
-		  func_append non_pic_objects " $non_pic_object"
-		  if test -z "$pic_object" || test "$pic_object" = none ; then
-		    arg="$non_pic_object"
-		  fi
-		else
-		  # If the PIC object exists, use it instead.
-		  # $xdir was prepended to $pic_object above.
-		  non_pic_object="$pic_object"
-		  func_append non_pic_objects " $non_pic_object"
-		fi
-	      else
-		# Only an error if not doing a dry-run.
-		if $opt_dry_run; then
-		  # Extract subdirectory from the argument.
-		  func_dirname "$arg" "/" ""
-		  xdir="$func_dirname_result"
-
-		  func_lo2o "$arg"
-		  pic_object=$xdir$objdir/$func_lo2o_result
-		  non_pic_object=$xdir$func_lo2o_result
-		  func_append libobjs " $pic_object"
-		  func_append non_pic_objects " $non_pic_object"
-	        else
-		  func_fatal_error "\`$arg' is not a valid libtool object"
-		fi
-	      fi
-	    done
-	  else
-	    func_fatal_error "link input file \`$arg' does not exist"
-	  fi
-	  arg=$save_arg
-	  prev=
-	  continue
-	  ;;
-	precious_regex)
-	  precious_files_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	release)
-	  release="-$arg"
-	  prev=
-	  continue
-	  ;;
-	rpath | xrpath)
-	  # We need an absolute path.
-	  case $arg in
-	  [\\/]* | [A-Za-z]:[\\/]*) ;;
-	  *)
-	    func_fatal_error "only absolute run-paths are allowed"
-	    ;;
-	  esac
-	  if test "$prev" = rpath; then
-	    case "$rpath " in
-	    *" $arg "*) ;;
-	    *) rpath="$rpath $arg" ;;
-	    esac
-	  else
-	    case "$xrpath " in
-	    *" $arg "*) ;;
-	    *) xrpath="$xrpath $arg" ;;
-	    esac
-	  fi
-	  prev=
-	  continue
-	  ;;
-	shrext)
-	  shrext_cmds="$arg"
-	  prev=
-	  continue
-	  ;;
-	weak)
-	  weak_libs="$weak_libs $arg"
-	  prev=
-	  continue
-	  ;;
-	xcclinker)
-	  linker_flags="$linker_flags $qarg"
-	  compiler_flags="$compiler_flags $qarg"
-	  prev=
-	  func_append compile_command " $qarg"
-	  func_append finalize_command " $qarg"
-	  continue
-	  ;;
-	xcompiler)
-	  compiler_flags="$compiler_flags $qarg"
-	  prev=
-	  func_append compile_command " $qarg"
-	  func_append finalize_command " $qarg"
-	  continue
-	  ;;
-	xlinker)
-	  linker_flags="$linker_flags $qarg"
-	  compiler_flags="$compiler_flags $wl$qarg"
-	  prev=
-	  func_append compile_command " $wl$qarg"
-	  func_append finalize_command " $wl$qarg"
-	  continue
-	  ;;
-	*)
-	  eval "$prev=\"\$arg\""
-	  prev=
-	  continue
-	  ;;
-	esac
-      fi # test -n "$prev"
-
-      prevarg="$arg"
-
-      case $arg in
-      -all-static)
-	if test -n "$link_static_flag"; then
-	  # See comment for -static flag below, for more details.
-	  func_append compile_command " $link_static_flag"
-	  func_append finalize_command " $link_static_flag"
-	fi
-	continue
-	;;
-
-      -allow-undefined)
-	# FIXME: remove this flag sometime in the future.
-	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
-	;;
-
-      -avoid-version)
-	avoid_version=yes
-	continue
-	;;
-
-      -bindir)
-	prev=bindir
-	continue
-	;;
-
-      -dlopen)
-	prev=dlfiles
-	continue
-	;;
-
-      -dlpreopen)
-	prev=dlprefiles
-	continue
-	;;
-
-      -export-dynamic)
-	export_dynamic=yes
-	continue
-	;;
-
-      -export-symbols | -export-symbols-regex)
-	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
-	  func_fatal_error "more than one -exported-symbols argument is not allowed"
-	fi
-	if test "X$arg" = "X-export-symbols"; then
-	  prev=expsyms
-	else
-	  prev=expsyms_regex
-	fi
-	continue
-	;;
-
-      -framework)
-	prev=framework
-	continue
-	;;
-
-      -inst-prefix-dir)
-	prev=inst_prefix
-	continue
-	;;
-
-      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
-      # so, if we see these flags be careful not to treat them like -L
-      -L[A-Z][A-Z]*:*)
-	case $with_gcc/$host in
-	no/*-*-irix* | /*-*-irix*)
-	  func_append compile_command " $arg"
-	  func_append finalize_command " $arg"
-	  ;;
-	esac
-	continue
-	;;
-
-      -L*)
-	func_stripname '-L' '' "$arg"
-	dir=$func_stripname_result
-	if test -z "$dir"; then
-	  if test "$#" -gt 0; then
-	    func_fatal_error "require no space between \`-L' and \`$1'"
-	  else
-	    func_fatal_error "need path for \`-L' option"
-	  fi
-	fi
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	*)
-	  absdir=`cd "$dir" && pwd`
-	  test -z "$absdir" && \
-	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
-	  dir="$absdir"
-	  ;;
-	esac
-	case "$deplibs " in
-	*" -L$dir "*) ;;
-	*)
-	  deplibs="$deplibs -L$dir"
-	  lib_search_path="$lib_search_path $dir"
-	  ;;
-	esac
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-	  testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$dir:"*) ;;
-	  ::) dllsearchpath=$dir;;
-	  *) dllsearchpath="$dllsearchpath:$dir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  ::) dllsearchpath=$testbindir;;
-	  *) dllsearchpath="$dllsearchpath:$testbindir";;
-	  esac
-	  ;;
-	esac
-	continue
-	;;
-
-      -l*)
-	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
-	    # These systems don't actually have a C or math library (as such)
-	    continue
-	    ;;
-	  *-*-os2*)
-	    # These systems don't actually have a C library (as such)
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C and math libraries are in the System framework
-	    deplibs="$deplibs System.ltframework"
-	    continue
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  esac
-	elif test "X$arg" = "X-lc_r"; then
-	 case $host in
-	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	   # Do not include libc_r directly, use -pthread flag.
-	   continue
-	   ;;
-	 esac
-	fi
-	deplibs="$deplibs $arg"
-	continue
-	;;
-
-      -module)
-	module=yes
-	continue
-	;;
-
-      # Tru64 UNIX uses -model [arg] to determine the layout of C++
-      # classes, name mangling, and exception handling.
-      # Darwin uses the -arch flag to determine output architecture.
-      -model|-arch|-isysroot)
-	compiler_flags="$compiler_flags $arg"
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-	prev=xcompiler
-	continue
-	;;
-
-      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
-	compiler_flags="$compiler_flags $arg"
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-	case "$new_inherited_linker_flags " in
-	    *" $arg "*) ;;
-	    * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;;
-	esac
-	continue
-	;;
-
-      -multi_module)
-	single_module="${wl}-multi_module"
-	continue
-	;;
-
-      -no-fast-install)
-	fast_install=no
-	continue
-	;;
-
-      -no-install)
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
-	  # The PATH hackery in wrapper scripts is required on Windows
-	  # and Darwin in order for the loader to find any dlls it needs.
-	  func_warning "\`-no-install' is ignored for $host"
-	  func_warning "assuming \`-no-fast-install' instead"
-	  fast_install=no
-	  ;;
-	*) no_install=yes ;;
-	esac
-	continue
-	;;
-
-      -no-undefined)
-	allow_undefined=no
-	continue
-	;;
-
-      -objectlist)
-	prev=objectlist
-	continue
-	;;
-
-      -o) prev=output ;;
-
-      -precious-files-regex)
-	prev=precious_regex
-	continue
-	;;
-
-      -release)
-	prev=release
-	continue
-	;;
-
-      -rpath)
-	prev=rpath
-	continue
-	;;
-
-      -R)
-	prev=xrpath
-	continue
-	;;
-
-      -R*)
-	func_stripname '-R' '' "$arg"
-	dir=$func_stripname_result
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	*)
-	  func_fatal_error "only absolute run-paths are allowed"
-	  ;;
-	esac
-	case "$xrpath " in
-	*" $dir "*) ;;
-	*) xrpath="$xrpath $dir" ;;
-	esac
-	continue
-	;;
-
-      -shared)
-	# The effects of -shared are defined in a previous loop.
-	continue
-	;;
-
-      -shrext)
-	prev=shrext
-	continue
-	;;
-
-      -static | -static-libtool-libs)
-	# The effects of -static are defined in a previous loop.
-	# We used to do the same as -all-static on platforms that
-	# didn't have a PIC flag, but the assumption that the effects
-	# would be equivalent was wrong.  It would break on at least
-	# Digital Unix and AIX.
-	continue
-	;;
-
-      -thread-safe)
-	thread_safe=yes
-	continue
-	;;
-
-      -version-info)
-	prev=vinfo
-	continue
-	;;
-
-      -version-number)
-	prev=vinfo
-	vinfo_number=yes
-	continue
-	;;
-
-      -weak)
-        prev=weak
-	continue
-	;;
-
-      -Wc,*)
-	func_stripname '-Wc,' '' "$arg"
-	args=$func_stripname_result
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-          func_quote_for_eval "$flag"
-	  arg="$arg $func_quote_for_eval_result"
-	  compiler_flags="$compiler_flags $func_quote_for_eval_result"
-	done
-	IFS="$save_ifs"
-	func_stripname ' ' '' "$arg"
-	arg=$func_stripname_result
-	;;
-
-      -Wl,*)
-	func_stripname '-Wl,' '' "$arg"
-	args=$func_stripname_result
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-          func_quote_for_eval "$flag"
-	  arg="$arg $wl$func_quote_for_eval_result"
-	  compiler_flags="$compiler_flags $wl$func_quote_for_eval_result"
-	  linker_flags="$linker_flags $func_quote_for_eval_result"
-	done
-	IFS="$save_ifs"
-	func_stripname ' ' '' "$arg"
-	arg=$func_stripname_result
-	;;
-
-      -Xcompiler)
-	prev=xcompiler
-	continue
-	;;
-
-      -Xlinker)
-	prev=xlinker
-	continue
-	;;
-
-      -XCClinker)
-	prev=xcclinker
-	continue
-	;;
-
-      # -msg_* for osf cc
-      -msg_*)
-	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-
-      # Flags to be passed through unchanged, with rationale:
-      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler
-      # -r[0-9][0-9]*        specify processor for the SGI compiler
-      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
-      # +DA*, +DD*           enable 64-bit mode for the HP compiler
-      # -q*                  compiler args for the IBM compiler
-      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
-      # -F/path              path to uninstalled frameworks, gcc on darwin
-      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
-      # @file                GCC response files
-      # -tp=*                Portland pgcc target processor selection
-      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*)
-        func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-        func_append compile_command " $arg"
-        func_append finalize_command " $arg"
-        compiler_flags="$compiler_flags $arg"
-        continue
-        ;;
-
-      # Some other compiler flag.
-      -* | +*)
-        func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-
-      *.$objext)
-	# A standard object.
-	objs="$objs $arg"
-	;;
-
-      *.lo)
-	# A libtool-controlled object.
-
-	# Check to see that this really is a libtool object.
-	if func_lalib_unsafe_p "$arg"; then
-	  pic_object=
-	  non_pic_object=
-
-	  # Read the .lo file
-	  func_source "$arg"
-
-	  if test -z "$pic_object" ||
-	     test -z "$non_pic_object" ||
-	     test "$pic_object" = none &&
-	     test "$non_pic_object" = none; then
-	    func_fatal_error "cannot find name of object for \`$arg'"
-	  fi
-
-	  # Extract subdirectory from the argument.
-	  func_dirname "$arg" "/" ""
-	  xdir="$func_dirname_result"
-
-	  if test "$pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    pic_object="$xdir$pic_object"
-
-	    if test "$prev" = dlfiles; then
-	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		dlfiles="$dlfiles $pic_object"
-		prev=
-		continue
-	      else
-		# If libtool objects are unsupported, then we need to preload.
-		prev=dlprefiles
-	      fi
-	    fi
-
-	    # CHECK ME:  I think I busted this.  -Ossama
-	    if test "$prev" = dlprefiles; then
-	      # Preload the old-style object.
-	      dlprefiles="$dlprefiles $pic_object"
-	      prev=
-	    fi
-
-	    # A PIC object.
-	    func_append libobjs " $pic_object"
-	    arg="$pic_object"
-	  fi
-
-	  # Non-PIC object.
-	  if test "$non_pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    non_pic_object="$xdir$non_pic_object"
-
-	    # A standard non-PIC object
-	    func_append non_pic_objects " $non_pic_object"
-	    if test -z "$pic_object" || test "$pic_object" = none ; then
-	      arg="$non_pic_object"
-	    fi
-	  else
-	    # If the PIC object exists, use it instead.
-	    # $xdir was prepended to $pic_object above.
-	    non_pic_object="$pic_object"
-	    func_append non_pic_objects " $non_pic_object"
-	  fi
-	else
-	  # Only an error if not doing a dry-run.
-	  if $opt_dry_run; then
-	    # Extract subdirectory from the argument.
-	    func_dirname "$arg" "/" ""
-	    xdir="$func_dirname_result"
-
-	    func_lo2o "$arg"
-	    pic_object=$xdir$objdir/$func_lo2o_result
-	    non_pic_object=$xdir$func_lo2o_result
-	    func_append libobjs " $pic_object"
-	    func_append non_pic_objects " $non_pic_object"
-	  else
-	    func_fatal_error "\`$arg' is not a valid libtool object"
-	  fi
-	fi
-	;;
-
-      *.$libext)
-	# An archive.
-	deplibs="$deplibs $arg"
-	old_deplibs="$old_deplibs $arg"
-	continue
-	;;
-
-      *.la)
-	# A libtool-controlled library.
-
-	if test "$prev" = dlfiles; then
-	  # This library was specified with -dlopen.
-	  dlfiles="$dlfiles $arg"
-	  prev=
-	elif test "$prev" = dlprefiles; then
-	  # The library was specified with -dlpreopen.
-	  dlprefiles="$dlprefiles $arg"
-	  prev=
-	else
-	  deplibs="$deplibs $arg"
-	fi
-	continue
-	;;
-
-      # Some other compiler argument.
-      *)
-	# Unknown arguments in both finalize_command and compile_command need
-	# to be aesthetically quoted because they are evaled later.
-	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-      esac # arg
-
-      # Now actually substitute the argument into the commands.
-      if test -n "$arg"; then
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-      fi
-    done # argument parsing loop
-
-    test -n "$prev" && \
-      func_fatal_help "the \`$prevarg' option requires an argument"
-
-    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
-      eval arg=\"$export_dynamic_flag_spec\"
-      func_append compile_command " $arg"
-      func_append finalize_command " $arg"
-    fi
-
-    oldlibs=
-    # calculate the name of the file, without its directory
-    func_basename "$output"
-    outputname="$func_basename_result"
-    libobjs_save="$libobjs"
-
-    if test -n "$shlibpath_var"; then
-      # get the directories listed in $shlibpath_var
-      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
-    else
-      shlib_search_path=
-    fi
-    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
-    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
-
-    func_dirname "$output" "/" ""
-    output_objdir="$func_dirname_result$objdir"
-    # Create the object directory.
-    func_mkdir_p "$output_objdir"
-
-    # Determine the type of output
-    case $output in
-    "")
-      func_fatal_help "you must specify an output file"
-      ;;
-    *.$libext) linkmode=oldlib ;;
-    *.lo | *.$objext) linkmode=obj ;;
-    *.la) linkmode=lib ;;
-    *) linkmode=prog ;; # Anything else should be a program.
-    esac
-
-    specialdeplibs=
-
-    libs=
-    # Find all interdependent deplibs by searching for libraries
-    # that are linked more than once (e.g. -la -lb -la)
-    for deplib in $deplibs; do
-      if $opt_duplicate_deps ; then
-	case "$libs " in
-	*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	esac
-      fi
-      libs="$libs $deplib"
-    done
-
-    if test "$linkmode" = lib; then
-      libs="$predeps $libs $compiler_lib_search_path $postdeps"
-
-      # Compute libraries that are listed more than once in $predeps
-      # $postdeps and mark them as special (i.e., whose duplicates are
-      # not to be eliminated).
-      pre_post_deps=
-      if $opt_duplicate_compiler_generated_deps; then
-	for pre_post_dep in $predeps $postdeps; do
-	  case "$pre_post_deps " in
-	  *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
-	  esac
-	  pre_post_deps="$pre_post_deps $pre_post_dep"
-	done
-      fi
-      pre_post_deps=
-    fi
-
-    deplibs=
-    newdependency_libs=
-    newlib_search_path=
-    need_relink=no # whether we're linking any uninstalled libtool libraries
-    notinst_deplibs= # not-installed libtool libraries
-    notinst_path= # paths that contain not-installed libtool libraries
-
-    case $linkmode in
-    lib)
-	passes="conv dlpreopen link"
-	for file in $dlfiles $dlprefiles; do
-	  case $file in
-	  *.la) ;;
-	  *)
-	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
-	    ;;
-	  esac
-	done
-	;;
-    prog)
-	compile_deplibs=
-	finalize_deplibs=
-	alldeplibs=no
-	newdlfiles=
-	newdlprefiles=
-	passes="conv scan dlopen dlpreopen link"
-	;;
-    *)  passes="conv"
-	;;
-    esac
-
-    for pass in $passes; do
-      # The preopen pass in lib mode reverses $deplibs; put it back here
-      # so that -L comes before libs that need it for instance...
-      if test "$linkmode,$pass" = "lib,link"; then
-	## FIXME: Find the place where the list is rebuilt in the wrong
-	##        order, and fix it there properly
-        tmp_deplibs=
-	for deplib in $deplibs; do
-	  tmp_deplibs="$deplib $tmp_deplibs"
-	done
-	deplibs="$tmp_deplibs"
-      fi
-
-      if test "$linkmode,$pass" = "lib,link" ||
-	 test "$linkmode,$pass" = "prog,scan"; then
-	libs="$deplibs"
-	deplibs=
-      fi
-      if test "$linkmode" = prog; then
-	case $pass in
-	dlopen) libs="$dlfiles" ;;
-	dlpreopen) libs="$dlprefiles" ;;
-	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
-	esac
-      fi
-      if test "$linkmode,$pass" = "lib,dlpreopen"; then
-	# Collect and forward deplibs of preopened libtool libs
-	for lib in $dlprefiles; do
-	  # Ignore non-libtool-libs
-	  dependency_libs=
-	  case $lib in
-	  *.la)	func_source "$lib" ;;
-	  esac
-
-	  # Collect preopened libtool deplibs, except any this library
-	  # has declared as weak libs
-	  for deplib in $dependency_libs; do
-	    func_basename "$deplib"
-            deplib_base=$func_basename_result
-	    case " $weak_libs " in
-	    *" $deplib_base "*) ;;
-	    *) deplibs="$deplibs $deplib" ;;
-	    esac
-	  done
-	done
-	libs="$dlprefiles"
-      fi
-      if test "$pass" = dlopen; then
-	# Collect dlpreopened libraries
-	save_deplibs="$deplibs"
-	deplibs=
-      fi
-
-      for deplib in $libs; do
-	lib=
-	found=no
-	case $deplib in
-	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
-	  if test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$deplib $compile_deplibs"
-	    finalize_deplibs="$deplib $finalize_deplibs"
-	  else
-	    compiler_flags="$compiler_flags $deplib"
-	    if test "$linkmode" = lib ; then
-		case "$new_inherited_linker_flags " in
-		    *" $deplib "*) ;;
-		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
-		esac
-	    fi
-	  fi
-	  continue
-	  ;;
-	-l*)
-	  if test "$linkmode" != lib && test "$linkmode" != prog; then
-	    func_warning "\`-l' is ignored for archives/objects"
-	    continue
-	  fi
-	  func_stripname '-l' '' "$deplib"
-	  name=$func_stripname_result
-	  if test "$linkmode" = lib; then
-	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
-	  else
-	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
-	  fi
-	  for searchdir in $searchdirs; do
-	    for search_ext in .la $std_shrext .so .a; do
-	      # Search the libtool library
-	      lib="$searchdir/lib${name}${search_ext}"
-	      if test -f "$lib"; then
-		if test "$search_ext" = ".la"; then
-		  found=yes
-		else
-		  found=no
-		fi
-		break 2
-	      fi
-	    done
-	  done
-	  if test "$found" != yes; then
-	    # deplib doesn't seem to be a libtool library
-	    if test "$linkmode,$pass" = "prog,link"; then
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      deplibs="$deplib $deplibs"
-	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    continue
-	  else # deplib is a libtool library
-	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
-	    # We need to do some special things here, and not later.
-	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	      case " $predeps $postdeps " in
-	      *" $deplib "*)
-		if func_lalib_p "$lib"; then
-		  library_names=
-		  old_library=
-		  func_source "$lib"
-		  for l in $old_library $library_names; do
-		    ll="$l"
-		  done
-		  if test "X$ll" = "X$old_library" ; then # only static version available
-		    found=no
-		    func_dirname "$lib" "" "."
-		    ladir="$func_dirname_result"
-		    lib=$ladir/$old_library
-		    if test "$linkmode,$pass" = "prog,link"; then
-		      compile_deplibs="$deplib $compile_deplibs"
-		      finalize_deplibs="$deplib $finalize_deplibs"
-		    else
-		      deplibs="$deplib $deplibs"
-		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-		    fi
-		    continue
-		  fi
-		fi
-		;;
-	      *) ;;
-	      esac
-	    fi
-	  fi
-	  ;; # -l
-	*.ltframework)
-	  if test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$deplib $compile_deplibs"
-	    finalize_deplibs="$deplib $finalize_deplibs"
-	  else
-	    deplibs="$deplib $deplibs"
-	    if test "$linkmode" = lib ; then
-		case "$new_inherited_linker_flags " in
-		    *" $deplib "*) ;;
-		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
-		esac
-	    fi
-	  fi
-	  continue
-	  ;;
-	-L*)
-	  case $linkmode in
-	  lib)
-	    deplibs="$deplib $deplibs"
-	    test "$pass" = conv && continue
-	    newdependency_libs="$deplib $newdependency_libs"
-	    func_stripname '-L' '' "$deplib"
-	    newlib_search_path="$newlib_search_path $func_stripname_result"
-	    ;;
-	  prog)
-	    if test "$pass" = conv; then
-	      deplibs="$deplib $deplibs"
-	      continue
-	    fi
-	    if test "$pass" = scan; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    func_stripname '-L' '' "$deplib"
-	    newlib_search_path="$newlib_search_path $func_stripname_result"
-	    ;;
-	  *)
-	    func_warning "\`-L' is ignored for archives/objects"
-	    ;;
-	  esac # linkmode
-	  continue
-	  ;; # -L
-	-R*)
-	  if test "$pass" = link; then
-	    func_stripname '-R' '' "$deplib"
-	    dir=$func_stripname_result
-	    # Make sure the xrpath contains only unique directories.
-	    case "$xrpath " in
-	    *" $dir "*) ;;
-	    *) xrpath="$xrpath $dir" ;;
-	    esac
-	  fi
-	  deplibs="$deplib $deplibs"
-	  continue
-	  ;;
-	*.la) lib="$deplib" ;;
-	*.$libext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	    continue
-	  fi
-	  case $linkmode in
-	  lib)
-	    # Linking convenience modules into shared libraries is allowed,
-	    # but linking other static libraries is non-portable.
-	    case " $dlpreconveniencelibs " in
-	    *" $deplib "*) ;;
-	    *)
-	      valid_a_lib=no
-	      case $deplibs_check_method in
-		match_pattern*)
-		  set dummy $deplibs_check_method; shift
-		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
-		    | $EGREP "$match_pattern_regex" > /dev/null; then
-		    valid_a_lib=yes
-		  fi
-		;;
-		pass_all)
-		  valid_a_lib=yes
-		;;
-	      esac
-	      if test "$valid_a_lib" != yes; then
-		echo
-		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
-		echo "*** I have the capability to make that library automatically link in when"
-		echo "*** you link to this library.  But I can only do this if you have a"
-		echo "*** shared version of the library, which you do not appear to have"
-		echo "*** because the file extensions .$libext of this argument makes me believe"
-		echo "*** that it is just a static archive that I should not use here."
-	      else
-		echo
-		$ECHO "*** Warning: Linking the shared library $output against the"
-		$ECHO "*** static library $deplib is not portable!"
-		deplibs="$deplib $deplibs"
-	      fi
-	      ;;
-	    esac
-	    continue
-	    ;;
-	  prog)
-	    if test "$pass" != link; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    continue
-	    ;;
-	  esac # linkmode
-	  ;; # *.$libext
-	*.lo | *.$objext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	  elif test "$linkmode" = prog; then
-	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
-	      # If there is no dlopen support or we're linking statically,
-	      # we need to preload.
-	      newdlprefiles="$newdlprefiles $deplib"
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      newdlfiles="$newdlfiles $deplib"
-	    fi
-	  fi
-	  continue
-	  ;;
-	%DEPLIBS%)
-	  alldeplibs=yes
-	  continue
-	  ;;
-	esac # case $deplib
-
-	if test "$found" = yes || test -f "$lib"; then :
-	else
-	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
-	fi
-
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$lib" \
-	  || func_fatal_error "\`$lib' is not a valid libtool archive"
-
-	func_dirname "$lib" "" "."
-	ladir="$func_dirname_result"
-
-	dlname=
-	dlopen=
-	dlpreopen=
-	libdir=
-	library_names=
-	old_library=
-	inherited_linker_flags=
-	# If the library was installed with an old release of libtool,
-	# it will not redefine variables installed, or shouldnotlink
-	installed=yes
-	shouldnotlink=no
-	avoidtemprpath=
-
-
-	# Read the .la file
-	func_source "$lib"
-
-	# Convert "-framework foo" to "foo.ltframework"
-	if test -n "$inherited_linker_flags"; then
-	  tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
-	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
-	    case " $new_inherited_linker_flags " in
-	      *" $tmp_inherited_linker_flag "*) ;;
-	      *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";;
-	    esac
-	  done
-	fi
-	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	if test "$linkmode,$pass" = "lib,link" ||
-	   test "$linkmode,$pass" = "prog,scan" ||
-	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
-	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
-	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
-	fi
-
-	if test "$pass" = conv; then
-	  # Only check for convenience libraries
-	  deplibs="$lib $deplibs"
-	  if test -z "$libdir"; then
-	    if test -z "$old_library"; then
-	      func_fatal_error "cannot find name of link library for \`$lib'"
-	    fi
-	    # It is a libtool convenience library, so add in its objects.
-	    convenience="$convenience $ladir/$objdir/$old_library"
-	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
-	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
-	    func_fatal_error "\`$lib' is not a convenience library"
-	  fi
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    deplibs="$deplib $deplibs"
-	    if $opt_duplicate_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
-	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done
-	  continue
-	fi # $pass = conv
-
-
-	# Get the name of the library we link against.
-	linklib=
-	for l in $old_library $library_names; do
-	  linklib="$l"
-	done
-	if test -z "$linklib"; then
-	  func_fatal_error "cannot find name of link library for \`$lib'"
-	fi
-
-	# This library was specified with -dlopen.
-	if test "$pass" = dlopen; then
-	  if test -z "$libdir"; then
-	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
-	  fi
-	  if test -z "$dlname" ||
-	     test "$dlopen_support" != yes ||
-	     test "$build_libtool_libs" = no; then
-	    # If there is no dlname, no dlopen support or we're linking
-	    # statically, we need to preload.  We also need to preload any
-	    # dependent libraries so libltdl's deplib preloader doesn't
-	    # bomb out in the load deplibs phase.
-	    dlprefiles="$dlprefiles $lib $dependency_libs"
-	  else
-	    newdlfiles="$newdlfiles $lib"
-	  fi
-	  continue
-	fi # $pass = dlopen
-
-	# We need an absolute path.
-	case $ladir in
-	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
-	*)
-	  abs_ladir=`cd "$ladir" && pwd`
-	  if test -z "$abs_ladir"; then
-	    func_warning "cannot determine absolute directory name of \`$ladir'"
-	    func_warning "passing it literally to the linker, although it might fail"
-	    abs_ladir="$ladir"
-	  fi
-	  ;;
-	esac
-	func_basename "$lib"
-	laname="$func_basename_result"
-
-	# Find the relevant object directory and library name.
-	if test "X$installed" = Xyes; then
-	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    func_warning "library \`$lib' was moved."
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    libdir="$abs_ladir"
-	  else
-	    dir="$libdir"
-	    absdir="$libdir"
-	  fi
-	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
-	else
-	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    # Remove this search path later
-	    notinst_path="$notinst_path $abs_ladir"
-	  else
-	    dir="$ladir/$objdir"
-	    absdir="$abs_ladir/$objdir"
-	    # Remove this search path later
-	    notinst_path="$notinst_path $abs_ladir"
-	  fi
-	fi # $installed = yes
-	func_stripname 'lib' '.la' "$laname"
-	name=$func_stripname_result
-
-	# This library was specified with -dlpreopen.
-	if test "$pass" = dlpreopen; then
-	  if test -z "$libdir" && test "$linkmode" = prog; then
-	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
-	  fi
-	  # Prefer using a static library (so that no silly _DYNAMIC symbols
-	  # are required to link).
-	  if test -n "$old_library"; then
-	    newdlprefiles="$newdlprefiles $dir/$old_library"
-	    # Keep a list of preopened convenience libraries to check
-	    # that they are being used correctly in the link pass.
-	    test -z "$libdir" && \
-		dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library"
-	  # Otherwise, use the dlname, so that lt_dlopen finds it.
-	  elif test -n "$dlname"; then
-	    newdlprefiles="$newdlprefiles $dir/$dlname"
-	  else
-	    newdlprefiles="$newdlprefiles $dir/$linklib"
-	  fi
-	fi # $pass = dlpreopen
-
-	if test -z "$libdir"; then
-	  # Link the convenience library
-	  if test "$linkmode" = lib; then
-	    deplibs="$dir/$old_library $deplibs"
-	  elif test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$dir/$old_library $compile_deplibs"
-	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
-	  else
-	    deplibs="$lib $deplibs" # used for prog,scan pass
-	  fi
-	  continue
-	fi
-
-
-	if test "$linkmode" = prog && test "$pass" != link; then
-	  newlib_search_path="$newlib_search_path $ladir"
-	  deplibs="$lib $deplibs"
-
-	  linkalldeplibs=no
-	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
-	     test "$build_libtool_libs" = no; then
-	    linkalldeplibs=yes
-	  fi
-
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    case $deplib in
-	    -L*) func_stripname '-L' '' "$deplib"
-	         newlib_search_path="$newlib_search_path $func_stripname_result"
-		 ;;
-	    esac
-	    # Need to link against all dependency_libs?
-	    if test "$linkalldeplibs" = yes; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      # Need to hardcode shared library paths
-	      # or/and link against static libraries
-	      newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    if $opt_duplicate_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
-	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done # for deplib
-	  continue
-	fi # $linkmode = prog...
-
-	if test "$linkmode,$pass" = "prog,link"; then
-	  if test -n "$library_names" &&
-	     { { test "$prefer_static_libs" = no ||
-	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
-	       test -z "$old_library"; }; then
-	    # We need to hardcode the library path
-	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
-	      # Make sure the rpath contains only unique directories.
-	      case "$temp_rpath:" in
-	      *"$absdir:"*) ;;
-	      *) temp_rpath="$temp_rpath$absdir:" ;;
-	      esac
-	    fi
-
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) compile_rpath="$compile_rpath $absdir"
-	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) finalize_rpath="$finalize_rpath $libdir"
-	      esac
-	      ;;
-	    esac
-	  fi # $linkmode,$pass = prog,link...
-
-	  if test "$alldeplibs" = yes &&
-	     { test "$deplibs_check_method" = pass_all ||
-	       { test "$build_libtool_libs" = yes &&
-		 test -n "$library_names"; }; }; then
-	    # We only need to search for static libraries
-	    continue
-	  fi
-	fi
-
-	link_static=no # Whether the deplib will be linked statically
-	use_static_libs=$prefer_static_libs
-	if test "$use_static_libs" = built && test "$installed" = yes; then
-	  use_static_libs=no
-	fi
-	if test -n "$library_names" &&
-	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
-	  case $host in
-	  *cygwin* | *mingw* | *cegcc*)
-	      # No point in relinking DLLs because paths are not encoded
-	      notinst_deplibs="$notinst_deplibs $lib"
-	      need_relink=no
-	    ;;
-	  *)
-	    if test "$installed" = no; then
-	      notinst_deplibs="$notinst_deplibs $lib"
-	      need_relink=yes
-	    fi
-	    ;;
-	  esac
-	  # This is a shared library
-
-	  # Warn about portability, can't link against -module's on some
-	  # systems (darwin).  Don't bleat about dlopened modules though!
-	  dlopenmodule=""
-	  for dlpremoduletest in $dlprefiles; do
-	    if test "X$dlpremoduletest" = "X$lib"; then
-	      dlopenmodule="$dlpremoduletest"
-	      break
-	    fi
-	  done
-	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
-	    echo
-	    if test "$linkmode" = prog; then
-	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
-	    else
-	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
-	    fi
-	    $ECHO "*** $linklib is not portable!"
-	  fi
-	  if test "$linkmode" = lib &&
-	     test "$hardcode_into_libs" = yes; then
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) compile_rpath="$compile_rpath $absdir"
-	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) finalize_rpath="$finalize_rpath $libdir"
-	      esac
-	      ;;
-	    esac
-	  fi
-
-	  if test -n "$old_archive_from_expsyms_cmds"; then
-	    # figure out the soname
-	    set dummy $library_names
-	    shift
-	    realname="$1"
-	    shift
-	    libname=`eval "\\$ECHO \"$libname_spec\""`
-	    # use dlname if we got it. it's perfectly good, no?
-	    if test -n "$dlname"; then
-	      soname="$dlname"
-	    elif test -n "$soname_spec"; then
-	      # bleh windows
-	      case $host in
-	      *cygwin* | mingw* | *cegcc*)
-	        func_arith $current - $age
-		major=$func_arith_result
-		versuffix="-$major"
-		;;
-	      esac
-	      eval soname=\"$soname_spec\"
-	    else
-	      soname="$realname"
-	    fi
-
-	    # Make a new name for the extract_expsyms_cmds to use
-	    soroot="$soname"
-	    func_basename "$soroot"
-	    soname="$func_basename_result"
-	    func_stripname 'lib' '.dll' "$soname"
-	    newlib=libimp-$func_stripname_result.a
-
-	    # If the library has no export list, then create one now
-	    if test -f "$output_objdir/$soname-def"; then :
-	    else
-	      func_verbose "extracting exported symbol list from \`$soname'"
-	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
-	    fi
-
-	    # Create $newlib
-	    if test -f "$output_objdir/$newlib"; then :; else
-	      func_verbose "generating import library for \`$soname'"
-	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
-	    fi
-	    # make sure the library variables are pointing to the new library
-	    dir=$output_objdir
-	    linklib=$newlib
-	  fi # test -n "$old_archive_from_expsyms_cmds"
-
-	  if test "$linkmode" = prog || test "$mode" != relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    lib_linked=yes
-	    case $hardcode_action in
-	    immediate | unsupported)
-	      if test "$hardcode_direct" = no; then
-		add="$dir/$linklib"
-		case $host in
-		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
-		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
-		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
-		    *-*-unixware7*) add_dir="-L$dir" ;;
-		  *-*-darwin* )
-		    # if the lib is a (non-dlopened) module then we can not
-		    # link against it, someone is ignoring the earlier warnings
-		    if /usr/bin/file -L $add 2> /dev/null |
-			 $GREP ": [^:]* bundle" >/dev/null ; then
-		      if test "X$dlopenmodule" != "X$lib"; then
-			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
-			if test -z "$old_library" ; then
-			  echo
-			  echo "*** And there doesn't seem to be a static archive available"
-			  echo "*** The link will probably fail, sorry"
-			else
-			  add="$dir/$old_library"
-			fi
-		      elif test -n "$old_library"; then
-			add="$dir/$old_library"
-		      fi
-		    fi
-		esac
-	      elif test "$hardcode_minus_L" = no; then
-		case $host in
-		*-*-sunos*) add_shlibpath="$dir" ;;
-		esac
-		add_dir="-L$dir"
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = no; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    relink)
-	      if test "$hardcode_direct" = yes &&
-	         test "$hardcode_direct_absolute" = no; then
-		add="$dir/$linklib"
-	      elif test "$hardcode_minus_L" = yes; then
-		add_dir="-L$dir"
-		# Try looking first in the location we're being installed to.
-		if test -n "$inst_prefix_dir"; then
-		  case $libdir in
-		    [\\/]*)
-		      add_dir="$add_dir -L$inst_prefix_dir$libdir"
-		      ;;
-		  esac
-		fi
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = yes; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    *) lib_linked=no ;;
-	    esac
-
-	    if test "$lib_linked" != yes; then
-	      func_fatal_configuration "unsupported hardcode properties"
-	    fi
-
-	    if test -n "$add_shlibpath"; then
-	      case :$compile_shlibpath: in
-	      *":$add_shlibpath:"*) ;;
-	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
-	      esac
-	    fi
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
-	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	      if test "$hardcode_direct" != yes &&
-		 test "$hardcode_minus_L" != yes &&
-		 test "$hardcode_shlibpath_var" = yes; then
-		case :$finalize_shlibpath: in
-		*":$libdir:"*) ;;
-		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
-		esac
-	      fi
-	    fi
-	  fi
-
-	  if test "$linkmode" = prog || test "$mode" = relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    # Finalize command for both is simple: just hardcode it.
-	    if test "$hardcode_direct" = yes &&
-	       test "$hardcode_direct_absolute" = no; then
-	      add="$libdir/$linklib"
-	    elif test "$hardcode_minus_L" = yes; then
-	      add_dir="-L$libdir"
-	      add="-l$name"
-	    elif test "$hardcode_shlibpath_var" = yes; then
-	      case :$finalize_shlibpath: in
-	      *":$libdir:"*) ;;
-	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
-	      esac
-	      add="-l$name"
-	    elif test "$hardcode_automatic" = yes; then
-	      if test -n "$inst_prefix_dir" &&
-		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
-		add="$inst_prefix_dir$libdir/$linklib"
-	      else
-		add="$libdir/$linklib"
-	      fi
-	    else
-	      # We cannot seem to hardcode it, guess we'll fake it.
-	      add_dir="-L$libdir"
-	      # Try looking first in the location we're being installed to.
-	      if test -n "$inst_prefix_dir"; then
-		case $libdir in
-		  [\\/]*)
-		    add_dir="$add_dir -L$inst_prefix_dir$libdir"
-		    ;;
-		esac
-	      fi
-	      add="-l$name"
-	    fi
-
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
-	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	    fi
-	  fi
-	elif test "$linkmode" = prog; then
-	  # Here we assume that one of hardcode_direct or hardcode_minus_L
-	  # is not unsupported.  This is valid on all known static and
-	  # shared platforms.
-	  if test "$hardcode_direct" != unsupported; then
-	    test -n "$old_library" && linklib="$old_library"
-	    compile_deplibs="$dir/$linklib $compile_deplibs"
-	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
-	  else
-	    compile_deplibs="-l$name -L$dir $compile_deplibs"
-	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
-	  fi
-	elif test "$build_libtool_libs" = yes; then
-	  # Not a shared library
-	  if test "$deplibs_check_method" != pass_all; then
-	    # We're trying link a shared library against a static one
-	    # but the system doesn't support it.
-
-	    # Just print a warning and add the library to dependency_libs so
-	    # that the program can be linked against the static library.
-	    echo
-	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
-	    echo "*** I have the capability to make that library automatically link in when"
-	    echo "*** you link to this library.  But I can only do this if you have a"
-	    echo "*** shared version of the library, which you do not appear to have."
-	    if test "$module" = yes; then
-	      echo "*** But as you try to build a module library, libtool will still create "
-	      echo "*** a static module, that should work as long as the dlopening application"
-	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
-	      if test -z "$global_symbol_pipe"; then
-		echo
-		echo "*** However, this would only work if libtool was able to extract symbol"
-		echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
-		echo "*** not find such a program.  So, this module is probably useless."
-		echo "*** \`nm' from GNU binutils and a full rebuild may help."
-	      fi
-	      if test "$build_old_libs" = no; then
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
-	  else
-	    deplibs="$dir/$old_library $deplibs"
-	    link_static=yes
-	  fi
-	fi # link shared/static library?
-
-	if test "$linkmode" = lib; then
-	  if test -n "$dependency_libs" &&
-	     { test "$hardcode_into_libs" != yes ||
-	       test "$build_old_libs" = yes ||
-	       test "$link_static" = yes; }; then
-	    # Extract -R from dependency_libs
-	    temp_deplibs=
-	    for libdir in $dependency_libs; do
-	      case $libdir in
-	      -R*) func_stripname '-R' '' "$libdir"
-	           temp_xrpath=$func_stripname_result
-		   case " $xrpath " in
-		   *" $temp_xrpath "*) ;;
-		   *) xrpath="$xrpath $temp_xrpath";;
-		   esac;;
-	      *) temp_deplibs="$temp_deplibs $libdir";;
-	      esac
-	    done
-	    dependency_libs="$temp_deplibs"
-	  fi
-
-	  newlib_search_path="$newlib_search_path $absdir"
-	  # Link against this library
-	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
-	  # ... and its dependency_libs
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    newdependency_libs="$deplib $newdependency_libs"
-	    if $opt_duplicate_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
-	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done
-
-	  if test "$link_all_deplibs" != no; then
-	    # Add the search paths of all dependency libraries
-	    for deplib in $dependency_libs; do
-	      path=
-	      case $deplib in
-	      -L*) path="$deplib" ;;
-	      *.la)
-	        func_dirname "$deplib" "" "."
-		dir="$func_dirname_result"
-		# We need an absolute path.
-		case $dir in
-		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
-		*)
-		  absdir=`cd "$dir" && pwd`
-		  if test -z "$absdir"; then
-		    func_warning "cannot determine absolute directory name of \`$dir'"
-		    absdir="$dir"
-		  fi
-		  ;;
-		esac
-		if $GREP "^installed=no" $deplib > /dev/null; then
-		case $host in
-		*-*-darwin*)
-		  depdepl=
-		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
-		  if test -n "$deplibrary_names" ; then
-		    for tmp in $deplibrary_names ; do
-		      depdepl=$tmp
-		    done
-		    if test -f "$absdir/$objdir/$depdepl" ; then
-		      depdepl="$absdir/$objdir/$depdepl"
-		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
-                      if test -z "$darwin_install_name"; then
-                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
-                      fi
-		      compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
-		      linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}"
-		      path=
-		    fi
-		  fi
-		  ;;
-		*)
-		  path="-L$absdir/$objdir"
-		  ;;
-		esac
-		else
-		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		  test -z "$libdir" && \
-		    func_fatal_error "\`$deplib' is not a valid libtool archive"
-		  test "$absdir" != "$libdir" && \
-		    func_warning "\`$deplib' seems to be moved"
-
-		  path="-L$absdir"
-		fi
-		;;
-	      esac
-	      case " $deplibs " in
-	      *" $path "*) ;;
-	      *) deplibs="$path $deplibs" ;;
-	      esac
-	    done
-	  fi # link_all_deplibs != no
-	fi # linkmode = lib
-      done # for deplib in $libs
-      if test "$pass" = link; then
-	if test "$linkmode" = "prog"; then
-	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
-	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
-	else
-	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	fi
-      fi
-      dependency_libs="$newdependency_libs"
-      if test "$pass" = dlpreopen; then
-	# Link the dlpreopened libraries before other libraries
-	for deplib in $save_deplibs; do
-	  deplibs="$deplib $deplibs"
-	done
-      fi
-      if test "$pass" != dlopen; then
-	if test "$pass" != conv; then
-	  # Make sure lib_search_path contains only unique directories.
-	  lib_search_path=
-	  for dir in $newlib_search_path; do
-	    case "$lib_search_path " in
-	    *" $dir "*) ;;
-	    *) lib_search_path="$lib_search_path $dir" ;;
-	    esac
-	  done
-	  newlib_search_path=
-	fi
-
-	if test "$linkmode,$pass" != "prog,link"; then
-	  vars="deplibs"
-	else
-	  vars="compile_deplibs finalize_deplibs"
-	fi
-	for var in $vars dependency_libs; do
-	  # Add libraries to $var in reverse order
-	  eval tmp_libs=\"\$$var\"
-	  new_libs=
-	  for deplib in $tmp_libs; do
-	    # FIXME: Pedantically, this is the right thing to do, so
-	    #        that some nasty dependency loop isn't accidentally
-	    #        broken:
-	    #new_libs="$deplib $new_libs"
-	    # Pragmatically, this seems to cause very few problems in
-	    # practice:
-	    case $deplib in
-	    -L*) new_libs="$deplib $new_libs" ;;
-	    -R*) ;;
-	    *)
-	      # And here is the reason: when a library appears more
-	      # than once as an explicit dependence of a library, or
-	      # is implicitly linked in more than once by the
-	      # compiler, it is considered special, and multiple
-	      # occurrences thereof are not removed.  Compare this
-	      # with having the same library being listed as a
-	      # dependency of multiple other libraries: in this case,
-	      # we know (pedantically, we assume) the library does not
-	      # need to be listed more than once, so we keep only the
-	      # last copy.  This is not always right, but it is rare
-	      # enough that we require users that really mean to play
-	      # such unportable linking tricks to link the library
-	      # using -Wl,-lname, so that libtool does not consider it
-	      # for duplicate removal.
-	      case " $specialdeplibs " in
-	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
-	      *)
-		case " $new_libs " in
-		*" $deplib "*) ;;
-		*) new_libs="$deplib $new_libs" ;;
-		esac
-		;;
-	      esac
-	      ;;
-	    esac
-	  done
-	  tmp_libs=
-	  for deplib in $new_libs; do
-	    case $deplib in
-	    -L*)
-	      case " $tmp_libs " in
-	      *" $deplib "*) ;;
-	      *) tmp_libs="$tmp_libs $deplib" ;;
-	      esac
-	      ;;
-	    *) tmp_libs="$tmp_libs $deplib" ;;
-	    esac
-	  done
-	  eval $var=\"$tmp_libs\"
-	done # for var
-      fi
-      # Last step: remove runtime libs from dependency_libs
-      # (they stay in deplibs)
-      tmp_libs=
-      for i in $dependency_libs ; do
-	case " $predeps $postdeps $compiler_lib_search_path " in
-	*" $i "*)
-	  i=""
-	  ;;
-	esac
-	if test -n "$i" ; then
-	  tmp_libs="$tmp_libs $i"
-	fi
-      done
-      dependency_libs=$tmp_libs
-    done # for pass
-    if test "$linkmode" = prog; then
-      dlfiles="$newdlfiles"
-    fi
-    if test "$linkmode" = prog || test "$linkmode" = lib; then
-      dlprefiles="$newdlprefiles"
-    fi
-
-    case $linkmode in
-    oldlib)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for archives"
-      fi
-
-      case " $deplibs" in
-      *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for archives" ;;
-      esac
-
-      test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for archives"
-
-      test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for archives"
-
-      test -n "$vinfo" && \
-	func_warning "\`-version-info/-version-number' is ignored for archives"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for archives"
-
-      test -n "$export_symbols$export_symbols_regex" && \
-	func_warning "\`-export-symbols' is ignored for archives"
-
-      # Now set the variables for building old libraries.
-      build_libtool_libs=no
-      oldlibs="$output"
-      objs="$objs$old_deplibs"
-      ;;
-
-    lib)
-      # Make sure we only generate libraries of the form `libNAME.la'.
-      case $outputname in
-      lib*)
-	func_stripname 'lib' '.la' "$outputname"
-	name=$func_stripname_result
-	eval shared_ext=\"$shrext_cmds\"
-	eval libname=\"$libname_spec\"
-	;;
-      *)
-	test "$module" = no && \
-	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
-
-	if test "$need_lib_prefix" != no; then
-	  # Add the "lib" prefix for modules if required
-	  func_stripname '' '.la' "$outputname"
-	  name=$func_stripname_result
-	  eval shared_ext=\"$shrext_cmds\"
-	  eval libname=\"$libname_spec\"
-	else
-	  func_stripname '' '.la' "$outputname"
-	  libname=$func_stripname_result
-	fi
-	;;
-      esac
-
-      if test -n "$objs"; then
-	if test "$deplibs_check_method" != pass_all; then
-	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
-	else
-	  echo
-	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
-	  $ECHO "*** objects $objs is not portable!"
-	  libobjs="$libobjs $objs"
-	fi
-      fi
-
-      test "$dlself" != no && \
-	func_warning "\`-dlopen self' is ignored for libtool libraries"
-
-      set dummy $rpath
-      shift
-      test "$#" -gt 1 && \
-	func_warning "ignoring multiple \`-rpath's for a libtool library"
-
-      install_libdir="$1"
-
-      oldlibs=
-      if test -z "$rpath"; then
-	if test "$build_libtool_libs" = yes; then
-	  # Building a libtool convenience library.
-	  # Some compilers have problems with a `.al' extension so
-	  # convenience libraries should have the same extension an
-	  # archive normally would.
-	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
-	  build_libtool_libs=convenience
-	  build_old_libs=yes
-	fi
-
-	test -n "$vinfo" && \
-	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
-
-	test -n "$release" && \
-	  func_warning "\`-release' is ignored for convenience libraries"
-      else
-
-	# Parse the version information argument.
-	save_ifs="$IFS"; IFS=':'
-	set dummy $vinfo 0 0 0
-	shift
-	IFS="$save_ifs"
-
-	test -n "$7" && \
-	  func_fatal_help "too many parameters to \`-version-info'"
-
-	# convert absolute version numbers to libtool ages
-	# this retains compatibility with .la files and attempts
-	# to make the code below a bit more comprehensible
-
-	case $vinfo_number in
-	yes)
-	  number_major="$1"
-	  number_minor="$2"
-	  number_revision="$3"
-	  #
-	  # There are really only two kinds -- those that
-	  # use the current revision as the major version
-	  # and those that subtract age and use age as
-	  # a minor version.  But, then there is irix
-	  # which has an extra 1 added just for fun
-	  #
-	  case $version_type in
-	  darwin|linux|osf|windows|none)
-	    func_arith $number_major + $number_minor
-	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_revision"
-	    ;;
-	  freebsd-aout|freebsd-elf|qnx|sunos)
-	    current="$number_major"
-	    revision="$number_minor"
-	    age="0"
-	    ;;
-	  irix|nonstopux)
-	    func_arith $number_major + $number_minor
-	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_minor"
-	    lt_irix_increment=no
-	    ;;
-	  esac
-	  ;;
-	no)
-	  current="$1"
-	  revision="$2"
-	  age="$3"
-	  ;;
-	esac
-
-	# Check that each of the things are valid numbers.
-	case $current in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "CURRENT \`$current' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	case $revision in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "REVISION \`$revision' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	case $age in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "AGE \`$age' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	if test "$age" -gt "$current"; then
-	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	fi
-
-	# Calculate the version variables.
-	major=
-	versuffix=
-	verstring=
-	case $version_type in
-	none) ;;
-
-	darwin)
-	  # Like Linux, but with the current version available in
-	  # verstring for coding it into the library header
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
-	  # Darwin ld doesn't like 0 for these options...
-	  func_arith $current + 1
-	  minor_current=$func_arith_result
-	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
-	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
-	  ;;
-
-	freebsd-aout)
-	  major=".$current"
-	  versuffix=".$current.$revision";
-	  ;;
-
-	freebsd-elf)
-	  major=".$current"
-	  versuffix=".$current"
-	  ;;
-
-	irix | nonstopux)
-	  if test "X$lt_irix_increment" = "Xno"; then
-	    func_arith $current - $age
-	  else
-	    func_arith $current - $age + 1
-	  fi
-	  major=$func_arith_result
-
-	  case $version_type in
-	    nonstopux) verstring_prefix=nonstopux ;;
-	    *)         verstring_prefix=sgi ;;
-	  esac
-	  verstring="$verstring_prefix$major.$revision"
-
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$revision
-	  while test "$loop" -ne 0; do
-	    func_arith $revision - $loop
-	    iface=$func_arith_result
-	    func_arith $loop - 1
-	    loop=$func_arith_result
-	    verstring="$verstring_prefix$major.$iface:$verstring"
-	  done
-
-	  # Before this point, $major must not contain `.'.
-	  major=.$major
-	  versuffix="$major.$revision"
-	  ;;
-
-	linux)
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
-	  ;;
-
-	osf)
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix=".$current.$age.$revision"
-	  verstring="$current.$age.$revision"
-
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$age
-	  while test "$loop" -ne 0; do
-	    func_arith $current - $loop
-	    iface=$func_arith_result
-	    func_arith $loop - 1
-	    loop=$func_arith_result
-	    verstring="$verstring:${iface}.0"
-	  done
-
-	  # Make executables depend on our current version.
-	  verstring="$verstring:${current}.0"
-	  ;;
-
-	qnx)
-	  major=".$current"
-	  versuffix=".$current"
-	  ;;
-
-	sunos)
-	  major=".$current"
-	  versuffix=".$current.$revision"
-	  ;;
-
-	windows)
-	  # Use '-' rather than '.', since we only want one
-	  # extension on DOS 8.3 filesystems.
-	  func_arith $current - $age
-	  major=$func_arith_result
-	  versuffix="-$major"
-	  ;;
-
-	*)
-	  func_fatal_configuration "unknown library version type \`$version_type'"
-	  ;;
-	esac
-
-	# Clear the version info if we defaulted, and they specified a release.
-	if test -z "$vinfo" && test -n "$release"; then
-	  major=
-	  case $version_type in
-	  darwin)
-	    # we can't check for "0.0" in archive_cmds due to quoting
-	    # problems, so we reset it completely
-	    verstring=
-	    ;;
-	  *)
-	    verstring="0.0"
-	    ;;
-	  esac
-	  if test "$need_version" = no; then
-	    versuffix=
-	  else
-	    versuffix=".0.0"
-	  fi
-	fi
-
-	# Remove version info from name if versioning should be avoided
-	if test "$avoid_version" = yes && test "$need_version" = no; then
-	  major=
-	  versuffix=
-	  verstring=""
-	fi
-
-	# Check to see if the archive will have undefined symbols.
-	if test "$allow_undefined" = yes; then
-	  if test "$allow_undefined_flag" = unsupported; then
-	    func_warning "undefined symbols not allowed in $host shared libraries"
-	    build_libtool_libs=no
-	    build_old_libs=yes
-	  fi
-	else
-	  # Don't allow undefined symbols.
-	  allow_undefined_flag="$no_undefined_flag"
-	fi
-
-      fi
-
-      func_generate_dlsyms "$libname" "$libname" "yes"
-      libobjs="$libobjs $symfileobj"
-      test "X$libobjs" = "X " && libobjs=
-
-      if test "$mode" != relink; then
-	# Remove our outputs, but don't remove object files since they
-	# may have been created when compiling PIC objects.
-	removelist=
-	tempremovelist=`$ECHO "$output_objdir/*"`
-	for p in $tempremovelist; do
-	  case $p in
-	    *.$objext | *.gcno)
-	       ;;
-	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
-	       if test "X$precious_files_regex" != "X"; then
-		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
-		 then
-		   continue
-		 fi
-	       fi
-	       removelist="$removelist $p"
-	       ;;
-	    *) ;;
-	  esac
-	done
-	test -n "$removelist" && \
-	  func_show_eval "${RM}r \$removelist"
-      fi
-
-      # Now set the variables for building old libraries.
-      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
-	oldlibs="$oldlibs $output_objdir/$libname.$libext"
-
-	# Transform .lo files to .o files.
-	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
-      fi
-
-      # Eliminate all temporary directories.
-      #for path in $notinst_path; do
-      #	lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
-      #	deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
-      #	dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
-      #done
-
-      if test -n "$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	temp_xrpath=
-	for libdir in $xrpath; do
-	  temp_xrpath="$temp_xrpath -R$libdir"
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_rpath="$finalize_rpath $libdir" ;;
-	  esac
-	done
-	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
-	  dependency_libs="$temp_xrpath $dependency_libs"
-	fi
-      fi
-
-      # Make sure dlfiles contains only unique files that won't be dlpreopened
-      old_dlfiles="$dlfiles"
-      dlfiles=
-      for lib in $old_dlfiles; do
-	case " $dlprefiles $dlfiles " in
-	*" $lib "*) ;;
-	*) dlfiles="$dlfiles $lib" ;;
-	esac
-      done
-
-      # Make sure dlprefiles contains only unique files
-      old_dlprefiles="$dlprefiles"
-      dlprefiles=
-      for lib in $old_dlprefiles; do
-	case "$dlprefiles " in
-	*" $lib "*) ;;
-	*) dlprefiles="$dlprefiles $lib" ;;
-	esac
-      done
-
-      if test "$build_libtool_libs" = yes; then
-	if test -n "$rpath"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
-	    # these systems don't actually have a c library (as such)!
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C library is in the System framework
-	    deplibs="$deplibs System.ltframework"
-	    ;;
-	  *-*-netbsd*)
-	    # Don't link with libc until the a.out ld.so is fixed.
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    ;;
-	  *)
-	    # Add libc to deplibs on all other systems if necessary.
-	    if test "$build_libtool_need_lc" = "yes"; then
-	      deplibs="$deplibs -lc"
-	    fi
-	    ;;
-	  esac
-	fi
-
-	# Transform deplibs into only deplibs that can be linked in shared.
-	name_save=$name
-	libname_save=$libname
-	release_save=$release
-	versuffix_save=$versuffix
-	major_save=$major
-	# I'm not sure if I'm treating the release correctly.  I think
-	# release should show up in the -l (ie -lgmp5) so we don't want to
-	# add it in twice.  Is that correct?
-	release=""
-	versuffix=""
-	major=""
-	newdeplibs=
-	droppeddeps=no
-	case $deplibs_check_method in
-	pass_all)
-	  # Don't check for shared/static.  Everything works.
-	  # This might be a little naive.  We might want to check
-	  # whether the library exists or not.  But this is on
-	  # osf3 & osf4 and I'm not really sure... Just
-	  # implementing what was already the behavior.
-	  newdeplibs=$deplibs
-	  ;;
-	test_compile)
-	  # This code stresses the "libraries are programs" paradigm to its
-	  # limits. Maybe even breaks it.  We compile a program, linking it
-	  # against the deplibs as a proxy for the library.  Then we can check
-	  # whether they linked in statically or dynamically with ldd.
-	  $opt_dry_run || $RM conftest.c
-	  cat > conftest.c <<EOF
-	  int main() { return 0; }
-EOF
-	  $opt_dry_run || $RM conftest
-	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
-	    ldd_output=`ldd conftest`
-	    for i in $deplibs; do
-	      case $i in
-	      -l*)
-		func_stripname -l '' "$i"
-		name=$func_stripname_result
-		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		  case " $predeps $postdeps " in
-		  *" $i "*)
-		    newdeplibs="$newdeplibs $i"
-		    i=""
-		    ;;
-		  esac
-		fi
-		if test -n "$i" ; then
-		  libname=`eval "\\$ECHO \"$libname_spec\""`
-		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
-		  set dummy $deplib_matches; shift
-		  deplib_match=$1
-		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		    newdeplibs="$newdeplibs $i"
-		  else
-		    droppeddeps=yes
-		    echo
-		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
-		    echo "*** I have the capability to make that library automatically link in when"
-		    echo "*** you link to this library.  But I can only do this if you have a"
-		    echo "*** shared version of the library, which I believe you do not have"
-		    echo "*** because a test_compile did reveal that the linker did not use it for"
-		    echo "*** its dynamic dependency list that programs get resolved with at runtime."
-		  fi
-		fi
-		;;
-	      *)
-		newdeplibs="$newdeplibs $i"
-		;;
-	      esac
-	    done
-	  else
-	    # Error occurred in the first compile.  Let's try to salvage
-	    # the situation: Compile a separate program for each library.
-	    for i in $deplibs; do
-	      case $i in
-	      -l*)
-		func_stripname -l '' "$i"
-		name=$func_stripname_result
-		$opt_dry_run || $RM conftest
-		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
-		  ldd_output=`ldd conftest`
-		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		    case " $predeps $postdeps " in
-		    *" $i "*)
-		      newdeplibs="$newdeplibs $i"
-		      i=""
-		      ;;
-		    esac
-		  fi
-		  if test -n "$i" ; then
-		    libname=`eval "\\$ECHO \"$libname_spec\""`
-		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
-		    set dummy $deplib_matches; shift
-		    deplib_match=$1
-		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		      newdeplibs="$newdeplibs $i"
-		    else
-		      droppeddeps=yes
-		      echo
-		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
-		      echo "*** I have the capability to make that library automatically link in when"
-		      echo "*** you link to this library.  But I can only do this if you have a"
-		      echo "*** shared version of the library, which you do not appear to have"
-		      echo "*** because a test_compile did reveal that the linker did not use this one"
-		      echo "*** as a dynamic dependency that programs can get resolved with at runtime."
-		    fi
-		  fi
-		else
-		  droppeddeps=yes
-		  echo
-		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
-		  echo "*** make it link in!  You will probably need to install it or some"
-		  echo "*** library that it depends on before this library will be fully"
-		  echo "*** functional.  Installing it before continuing would be even better."
-		fi
-		;;
-	      *)
-		newdeplibs="$newdeplibs $i"
-		;;
-	      esac
-	    done
-	  fi
-	  ;;
-	file_magic*)
-	  set dummy $deplibs_check_method; shift
-	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    case $a_deplib in
-	    -l*)
-	      func_stripname -l '' "$a_deplib"
-	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  newdeplibs="$newdeplibs $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		libname=`eval "\\$ECHO \"$libname_spec\""`
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-		  for potent_lib in $potential_libs; do
-		      # Follow soft links.
-		      if ls -lLd "$potent_lib" 2>/dev/null |
-			 $GREP " -> " >/dev/null; then
-			continue
-		      fi
-		      # The statement above tries to avoid entering an
-		      # endless loop below, in case of cyclic links.
-		      # We might still enter an endless loop, since a link
-		      # loop can be closed while we follow links,
-		      # but so what?
-		      potlib="$potent_lib"
-		      while test -h "$potlib" 2>/dev/null; do
-			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
-			case $potliblink in
-			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
-			*) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
-			esac
-		      done
-		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
-			 $SED -e 10q |
-			 $EGREP "$file_magic_regex" > /dev/null; then
-			newdeplibs="$newdeplibs $a_deplib"
-			a_deplib=""
-			break 2
-		      fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		echo
-		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
-		echo "*** I have the capability to make that library automatically link in when"
-		echo "*** you link to this library.  But I can only do this if you have a"
-		echo "*** shared version of the library, which you do not appear to have"
-		echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
-		else
-		  $ECHO "*** with $libname and none of the candidates passed a file format test"
-		  $ECHO "*** using a file magic. Last file checked: $potlib"
-		fi
-	      fi
-	      ;;
-	    *)
-	      # Add a -L argument.
-	      newdeplibs="$newdeplibs $a_deplib"
-	      ;;
-	    esac
-	  done # Gone through all deplibs.
-	  ;;
-	match_pattern*)
-	  set dummy $deplibs_check_method; shift
-	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    case $a_deplib in
-	    -l*)
-	      func_stripname -l '' "$a_deplib"
-	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  newdeplibs="$newdeplibs $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		libname=`eval "\\$ECHO \"$libname_spec\""`
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-		  for potent_lib in $potential_libs; do
-		    potlib="$potent_lib" # see symlink-check above in file_magic test
-		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
-		       $EGREP "$match_pattern_regex" > /dev/null; then
-		      newdeplibs="$newdeplibs $a_deplib"
-		      a_deplib=""
-		      break 2
-		    fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		echo
-		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
-		echo "*** I have the capability to make that library automatically link in when"
-		echo "*** you link to this library.  But I can only do this if you have a"
-		echo "*** shared version of the library, which you do not appear to have"
-		echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
-		else
-		  $ECHO "*** with $libname and none of the candidates passed a file format test"
-		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
-		fi
-	      fi
-	      ;;
-	    *)
-	      # Add a -L argument.
-	      newdeplibs="$newdeplibs $a_deplib"
-	      ;;
-	    esac
-	  done # Gone through all deplibs.
-	  ;;
-	none | unknown | *)
-	  newdeplibs=""
-	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
-	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	    for i in $predeps $postdeps ; do
-	      # can't use Xsed below, because $i might contain '/'
-	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
-	    done
-	  fi
-	  case $tmp_deplibs in
-	  *[!\	\ ]*)
-	    echo
-	    if test "X$deplibs_check_method" = "Xnone"; then
-	      echo "*** Warning: inter-library dependencies are not supported in this platform."
-	    else
-	      echo "*** Warning: inter-library dependencies are not known to be supported."
-	    fi
-	    echo "*** All declared inter-library dependencies are being dropped."
-	    droppeddeps=yes
-	    ;;
-	  esac
-	  ;;
-	esac
-	versuffix=$versuffix_save
-	major=$major_save
-	release=$release_save
-	libname=$libname_save
-	name=$name_save
-
-	case $host in
-	*-*-rhapsody* | *-*-darwin1.[012])
-	  # On Rhapsody replace the C library with the System framework
-	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
-	  ;;
-	esac
-
-	if test "$droppeddeps" = yes; then
-	  if test "$module" = yes; then
-	    echo
-	    echo "*** Warning: libtool could not satisfy all declared inter-library"
-	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
-	    echo "*** a static module, that should work as long as the dlopening"
-	    echo "*** application is linked with the -dlopen flag."
-	    if test -z "$global_symbol_pipe"; then
-	      echo
-	      echo "*** However, this would only work if libtool was able to extract symbol"
-	      echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
-	      echo "*** not find such a program.  So, this module is probably useless."
-	      echo "*** \`nm' from GNU binutils and a full rebuild may help."
-	    fi
-	    if test "$build_old_libs" = no; then
-	      oldlibs="$output_objdir/$libname.$libext"
-	      build_libtool_libs=module
-	      build_old_libs=yes
-	    else
-	      build_libtool_libs=no
-	    fi
-	  else
-	    echo "*** The inter-library dependencies that have been dropped here will be"
-	    echo "*** automatically added whenever a program is linked with this library"
-	    echo "*** or is declared to -dlopen it."
-
-	    if test "$allow_undefined" = no; then
-	      echo
-	      echo "*** Since this library must not contain undefined symbols,"
-	      echo "*** because either the platform does not support them or"
-	      echo "*** it was explicitly requested with -no-undefined,"
-	      echo "*** libtool will only create a static version of it."
-	      if test "$build_old_libs" = no; then
-		oldlibs="$output_objdir/$libname.$libext"
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
-	  fi
-	fi
-	# Done checking deplibs!
-	deplibs=$newdeplibs
-      fi
-      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
-      case $host in
-	*-*-darwin*)
-	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  ;;
-      esac
-
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $deplibs " in
-	  *" -L$path/$objdir "*)
-	    new_libs="$new_libs -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) new_libs="$new_libs $deplib" ;;
-	  esac
-	  ;;
-	*) new_libs="$new_libs $deplib" ;;
-	esac
-      done
-      deplibs="$new_libs"
-
-      # All the library-specific variables (install_libdir is set above).
-      library_names=
-      old_library=
-      dlname=
-
-      # Test again, we may have decided not to build it any more
-      if test "$build_libtool_libs" = yes; then
-	if test "$hardcode_into_libs" = yes; then
-	  # Hardcode the library paths
-	  hardcode_libdirs=
-	  dep_rpath=
-	  rpath="$finalize_rpath"
-	  test "$mode" != relink && rpath="$compile_rpath$rpath"
-	  for libdir in $rpath; do
-	    if test -n "$hardcode_libdir_flag_spec"; then
-	      if test -n "$hardcode_libdir_separator"; then
-		if test -z "$hardcode_libdirs"; then
-		  hardcode_libdirs="$libdir"
-		else
-		  # Just accumulate the unique libdirs.
-		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		    ;;
-		  *)
-		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		    ;;
-		  esac
-		fi
-	      else
-		eval flag=\"$hardcode_libdir_flag_spec\"
-		dep_rpath="$dep_rpath $flag"
-	      fi
-	    elif test -n "$runpath_var"; then
-	      case "$perm_rpath " in
-	      *" $libdir "*) ;;
-	      *) perm_rpath="$perm_rpath $libdir" ;;
-	      esac
-	    fi
-	  done
-	  # Substitute the hardcoded libdirs into the rpath.
-	  if test -n "$hardcode_libdir_separator" &&
-	     test -n "$hardcode_libdirs"; then
-	    libdir="$hardcode_libdirs"
-	    if test -n "$hardcode_libdir_flag_spec_ld"; then
-	      eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
-	    else
-	      eval dep_rpath=\"$hardcode_libdir_flag_spec\"
-	    fi
-	  fi
-	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
-	    # We should set the runpath_var.
-	    rpath=
-	    for dir in $perm_rpath; do
-	      rpath="$rpath$dir:"
-	    done
-	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
-	  fi
-	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
-	fi
-
-	shlibpath="$finalize_shlibpath"
-	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
-	if test -n "$shlibpath"; then
-	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
-	fi
-
-	# Get the real and link names of the library.
-	eval shared_ext=\"$shrext_cmds\"
-	eval library_names=\"$library_names_spec\"
-	set dummy $library_names
-	shift
-	realname="$1"
-	shift
-
-	if test -n "$soname_spec"; then
-	  eval soname=\"$soname_spec\"
-	else
-	  soname="$realname"
-	fi
-	if test -z "$dlname"; then
-	  dlname=$soname
-	fi
-
-	lib="$output_objdir/$realname"
-	linknames=
-	for link
-	do
-	  linknames="$linknames $link"
-	done
-
-	# Use standard objects if they are pic
-	test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
-	test "X$libobjs" = "X " && libobjs=
-
-	delfiles=
-	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
-	  export_symbols="$output_objdir/$libname.uexp"
-	  delfiles="$delfiles $export_symbols"
-	fi
-
-	orig_export_symbols=
-	case $host_os in
-	cygwin* | mingw* | cegcc*)
-	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
-	    # exporting using user supplied symfile
-	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
-	      # and it's NOT already a .def file. Must figure out
-	      # which of the given symbols are data symbols and tag
-	      # them as such. So, trigger use of export_symbols_cmds.
-	      # export_symbols gets reassigned inside the "prepare
-	      # the list of exported symbols" if statement, so the
-	      # include_expsyms logic still works.
-	      orig_export_symbols="$export_symbols"
-	      export_symbols=
-	      always_export_symbols=yes
-	    fi
-	  fi
-	  ;;
-	esac
-
-	# Prepare the list of exported symbols
-	if test -z "$export_symbols"; then
-	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
-	    func_verbose "generating symbol list for \`$libname.la'"
-	    export_symbols="$output_objdir/$libname.exp"
-	    $opt_dry_run || $RM $export_symbols
-	    cmds=$export_symbols_cmds
-	    save_ifs="$IFS"; IFS='~'
-	    for cmd in $cmds; do
-	      IFS="$save_ifs"
-	      eval cmd=\"$cmd\"
-	      func_len " $cmd"
-	      len=$func_len_result
-	      if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-		func_show_eval "$cmd" 'exit $?'
-		skipped_export=false
-	      else
-		# The command line is too long to execute in one step.
-		func_verbose "using reloadable object file for export list..."
-		skipped_export=:
-		# Break out early, otherwise skipped_export may be
-		# set to false by a later but shorter cmd.
-		break
-	      fi
-	    done
-	    IFS="$save_ifs"
-	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
-	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
-	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
-	    fi
-	  fi
-	fi
-
-	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  tmp_export_symbols="$export_symbols"
-	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
-	  $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
-	fi
-
-	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
-	  # The given exports_symbols file has to be filtered, so filter it.
-	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
-	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	  # 's' commands which not all seds can handle. GNU sed should be fine
-	  # though. Also, the filter scales superlinearly with the number of
-	  # global variables. join(1) would be nice here, but unfortunately
-	  # isn't a blessed tool.
-	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
-	  delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
-	  export_symbols=$output_objdir/$libname.def
-	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
-	fi
-
-	tmp_deplibs=
-	for test_deplib in $deplibs; do
-	  case " $convenience " in
-	  *" $test_deplib "*) ;;
-	  *)
-	    tmp_deplibs="$tmp_deplibs $test_deplib"
-	    ;;
-	  esac
-	done
-	deplibs="$tmp_deplibs"
-
-	if test -n "$convenience"; then
-	  if test -n "$whole_archive_flag_spec" &&
-	    test "$compiler_needs_object" = yes &&
-	    test -z "$libobjs"; then
-	    # extract the archives, so we have objects to list.
-	    # TODO: could optimize this to just extract one archive.
-	    whole_archive_flag_spec=
-	  fi
-	  if test -n "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
-	    test "X$libobjs" = "X " && libobjs=
-	  else
-	    gentop="$output_objdir/${outputname}x"
-	    generated="$generated $gentop"
-
-	    func_extract_archives $gentop $convenience
-	    libobjs="$libobjs $func_extract_archives_result"
-	    test "X$libobjs" = "X " && libobjs=
-	  fi
-	fi
-
-	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
-	  eval flag=\"$thread_safe_flag_spec\"
-	  linker_flags="$linker_flags $flag"
-	fi
-
-	# Make a backup of the uninstalled library when relinking
-	if test "$mode" = relink; then
-	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
-	fi
-
-	# Do each of the archive commands.
-	if test "$module" = yes && test -n "$module_cmds" ; then
-	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	    eval test_cmds=\"$module_expsym_cmds\"
-	    cmds=$module_expsym_cmds
-	  else
-	    eval test_cmds=\"$module_cmds\"
-	    cmds=$module_cmds
-	  fi
-	else
-	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	    eval test_cmds=\"$archive_expsym_cmds\"
-	    cmds=$archive_expsym_cmds
-	  else
-	    eval test_cmds=\"$archive_cmds\"
-	    cmds=$archive_cmds
-	  fi
-	fi
-
-	if test "X$skipped_export" != "X:" &&
-	   func_len " $test_cmds" &&
-	   len=$func_len_result &&
-	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  :
-	else
-	  # The command line is too long to link in one step, link piecewise
-	  # or, if using GNU ld and skipped_export is not :, use a linker
-	  # script.
-
-	  # Save the value of $output and $libobjs because we want to
-	  # use them later.  If we have whole_archive_flag_spec, we
-	  # want to use save_libobjs as it was before
-	  # whole_archive_flag_spec was expanded, because we can't
-	  # assume the linker understands whole_archive_flag_spec.
-	  # This may have to be revisited, in case too many
-	  # convenience libraries get linked in and end up exceeding
-	  # the spec.
-	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	  fi
-	  save_output=$output
-	  func_basename "$output"
-	  output_la=$func_basename_result
-
-	  # Clear the reloadable object creation command queue and
-	  # initialize k to one.
-	  test_cmds=
-	  concat_cmds=
-	  objlist=
-	  last_robj=
-	  k=1
-
-	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
-	    output=${output_objdir}/${output_la}.lnkscript
-	    func_verbose "creating GNU ld script: $output"
-	    echo 'INPUT (' > $output
-	    for obj in $save_libobjs
-	    do
-	      $ECHO "$obj" >> $output
-	    done
-	    echo ')' >> $output
-	    delfiles="$delfiles $output"
-	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
-	    output=${output_objdir}/${output_la}.lnk
-	    func_verbose "creating linker input file list: $output"
-	    : > $output
-	    set x $save_libobjs
-	    shift
-	    firstobj=
-	    if test "$compiler_needs_object" = yes; then
-	      firstobj="$1 "
-	      shift
-	    fi
-	    for obj
-	    do
-	      $ECHO "$obj" >> $output
-	    done
-	    delfiles="$delfiles $output"
-	    output=$firstobj\"$file_list_spec$output\"
-	  else
-	    if test -n "$save_libobjs"; then
-	      func_verbose "creating reloadable object files..."
-	      output=$output_objdir/$output_la-${k}.$objext
-	      eval test_cmds=\"$reload_cmds\"
-	      func_len " $test_cmds"
-	      len0=$func_len_result
-	      len=$len0
-
-	      # Loop over the list of objects to be linked.
-	      for obj in $save_libobjs
-	      do
-		func_len " $obj"
-		func_arith $len + $func_len_result
-		len=$func_arith_result
-		if test "X$objlist" = X ||
-		   test "$len" -lt "$max_cmd_len"; then
-		  func_append objlist " $obj"
-		else
-		  # The command $test_cmds is almost too long, add a
-		  # command to the queue.
-		  if test "$k" -eq 1 ; then
-		    # The first file doesn't have a previous command to add.
-		    reload_objs=$objlist
-		    eval concat_cmds=\"$reload_cmds\"
-		  else
-		    # All subsequent reloadable object files will link in
-		    # the last one created.
-		    reload_objs="$objlist $last_robj"
-		    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
-		  fi
-		  last_robj=$output_objdir/$output_la-${k}.$objext
-		  func_arith $k + 1
-		  k=$func_arith_result
-		  output=$output_objdir/$output_la-${k}.$objext
-		  objlist=" $obj"
-		  func_len " $last_robj"
-		  func_arith $len0 + $func_len_result
-		  len=$func_arith_result
-		fi
-	      done
-	      # Handle the remaining objects by creating one last
-	      # reloadable object file.  All subsequent reloadable object
-	      # files will link in the last one created.
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      reload_objs="$objlist $last_robj"
-	      eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
-	      if test -n "$last_robj"; then
-	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
-	      fi
-	      delfiles="$delfiles $output"
-
-	    else
-	      output=
-	    fi
-
-	    if ${skipped_export-false}; then
-	      func_verbose "generating symbol list for \`$libname.la'"
-	      export_symbols="$output_objdir/$libname.exp"
-	      $opt_dry_run || $RM $export_symbols
-	      libobjs=$output
-	      # Append the command to create the export file.
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
-	      if test -n "$last_robj"; then
-		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
-	      fi
-	    fi
-
-	    test -n "$save_libobjs" &&
-	      func_verbose "creating a temporary reloadable object file: $output"
-
-	    # Loop through the commands generated above and execute them.
-	    save_ifs="$IFS"; IFS='~'
-	    for cmd in $concat_cmds; do
-	      IFS="$save_ifs"
-	      $opt_silent || {
-		  func_quote_for_expand "$cmd"
-		  eval "func_echo $func_quote_for_expand_result"
-	      }
-	      $opt_dry_run || eval "$cmd" || {
-		lt_exit=$?
-
-		# Restore the uninstalled library and exit
-		if test "$mode" = relink; then
-		  ( cd "$output_objdir" && \
-		    $RM "${realname}T" && \
-		    $MV "${realname}U" "$realname" )
-		fi
-
-		exit $lt_exit
-	      }
-	    done
-	    IFS="$save_ifs"
-
-	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
-	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
-	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
-	    fi
-	  fi
-
-          if ${skipped_export-false}; then
-	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	      tmp_export_symbols="$export_symbols"
-	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
-	      $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
-	    fi
-
-	    if test -n "$orig_export_symbols"; then
-	      # The given exports_symbols file has to be filtered, so filter it.
-	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
-	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	      # 's' commands which not all seds can handle. GNU sed should be fine
-	      # though. Also, the filter scales superlinearly with the number of
-	      # global variables. join(1) would be nice here, but unfortunately
-	      # isn't a blessed tool.
-	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
-	      delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
-	      export_symbols=$output_objdir/$libname.def
-	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
-	    fi
-	  fi
-
-	  libobjs=$output
-	  # Restore the value of output.
-	  output=$save_output
-
-	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
-	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
-	    test "X$libobjs" = "X " && libobjs=
-	  fi
-	  # Expand the library linking commands again to reset the
-	  # value of $libobjs for piecewise linking.
-
-	  # Do each of the archive commands.
-	  if test "$module" = yes && test -n "$module_cmds" ; then
-	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	      cmds=$module_expsym_cmds
-	    else
-	      cmds=$module_cmds
-	    fi
-	  else
-	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	      cmds=$archive_expsym_cmds
-	    else
-	      cmds=$archive_cmds
-	    fi
-	  fi
-	fi
-
-	if test -n "$delfiles"; then
-	  # Append the command to remove temporary files to $cmds.
-	  eval cmds=\"\$cmds~\$RM $delfiles\"
-	fi
-
-	# Add any objects from preloaded convenience libraries
-	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
-	  generated="$generated $gentop"
-
-	  func_extract_archives $gentop $dlprefiles
-	  libobjs="$libobjs $func_extract_archives_result"
-	  test "X$libobjs" = "X " && libobjs=
-	fi
-
-	save_ifs="$IFS"; IFS='~'
-	for cmd in $cmds; do
-	  IFS="$save_ifs"
-	  eval cmd=\"$cmd\"
-	  $opt_silent || {
-	    func_quote_for_expand "$cmd"
-	    eval "func_echo $func_quote_for_expand_result"
-	  }
-	  $opt_dry_run || eval "$cmd" || {
-	    lt_exit=$?
-
-	    # Restore the uninstalled library and exit
-	    if test "$mode" = relink; then
-	      ( cd "$output_objdir" && \
-	        $RM "${realname}T" && \
-		$MV "${realname}U" "$realname" )
-	    fi
-
-	    exit $lt_exit
-	  }
-	done
-	IFS="$save_ifs"
-
-	# Restore the uninstalled library and exit
-	if test "$mode" = relink; then
-	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
-
-	  if test -n "$convenience"; then
-	    if test -z "$whole_archive_flag_spec"; then
-	      func_show_eval '${RM}r "$gentop"'
-	    fi
-	  fi
-
-	  exit $EXIT_SUCCESS
-	fi
-
-	# Create links to the real library.
-	for linkname in $linknames; do
-	  if test "$realname" != "$linkname"; then
-	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
-	  fi
-	done
-
-	# If -module or -export-dynamic was specified, set the dlname.
-	if test "$module" = yes || test "$export_dynamic" = yes; then
-	  # On all known operating systems, these are identical.
-	  dlname="$soname"
-	fi
-      fi
-      ;;
-
-    obj)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for objects"
-      fi
-
-      case " $deplibs" in
-      *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for objects" ;;
-      esac
-
-      test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for objects"
-
-      test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for objects"
-
-      test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for objects"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for objects"
-
-      case $output in
-      *.lo)
-	test -n "$objs$old_deplibs" && \
-	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
-
-	libobj=$output
-	func_lo2o "$libobj"
-	obj=$func_lo2o_result
-	;;
-      *)
-	libobj=
-	obj="$output"
-	;;
-      esac
-
-      # Delete the old objects.
-      $opt_dry_run || $RM $obj $libobj
-
-      # Objects from convenience libraries.  This assumes
-      # single-version convenience libraries.  Whenever we create
-      # different ones for PIC/non-PIC, this we'll have to duplicate
-      # the extraction.
-      reload_conv_objs=
-      gentop=
-      # reload_cmds runs $LD directly, so let us get rid of
-      # -Wl from whole_archive_flag_spec and hope we can get by with
-      # turning comma into space..
-      wl=
-
-      if test -n "$convenience"; then
-	if test -n "$whole_archive_flag_spec"; then
-	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
-	  reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
-	else
-	  gentop="$output_objdir/${obj}x"
-	  generated="$generated $gentop"
-
-	  func_extract_archives $gentop $convenience
-	  reload_conv_objs="$reload_objs $func_extract_archives_result"
-	fi
-      fi
-
-      # Create the old-style object.
-      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
-
-      output="$obj"
-      func_execute_cmds "$reload_cmds" 'exit $?'
-
-      # Exit if we aren't doing a library object file.
-      if test -z "$libobj"; then
-	if test -n "$gentop"; then
-	  func_show_eval '${RM}r "$gentop"'
-	fi
-
-	exit $EXIT_SUCCESS
-      fi
-
-      if test "$build_libtool_libs" != yes; then
-	if test -n "$gentop"; then
-	  func_show_eval '${RM}r "$gentop"'
-	fi
-
-	# Create an invalid libtool object if no PIC, so that we don't
-	# accidentally link it into a program.
-	# $show "echo timestamp > $libobj"
-	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
-	exit $EXIT_SUCCESS
-      fi
-
-      if test -n "$pic_flag" || test "$pic_mode" != default; then
-	# Only do commands if we really have different PIC objects.
-	reload_objs="$libobjs $reload_conv_objs"
-	output="$libobj"
-	func_execute_cmds "$reload_cmds" 'exit $?'
-      fi
-
-      if test -n "$gentop"; then
-	func_show_eval '${RM}r "$gentop"'
-      fi
-
-      exit $EXIT_SUCCESS
-      ;;
-
-    prog)
-      case $host in
-	*cygwin*) func_stripname '' '.exe' "$output"
-	          output=$func_stripname_result.exe;;
-      esac
-      test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for programs"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for programs"
-
-      test "$preload" = yes \
-        && test "$dlopen_support" = unknown \
-	&& test "$dlopen_self" = unknown \
-	&& test "$dlopen_self_static" = unknown && \
-	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
-
-      case $host in
-      *-*-rhapsody* | *-*-darwin1.[012])
-	# On Rhapsody replace the C library is the System framework
-	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
-	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
-	;;
-      esac
-
-      case $host in
-      *-*-darwin*)
-	# Don't allow lazy linking, it breaks C++ global constructors
-	# But is supposedly fixed on 10.4 or later (yay!).
-	if test "$tagname" = CXX ; then
-	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
-	    10.[0123])
-	      compile_command="$compile_command ${wl}-bind_at_load"
-	      finalize_command="$finalize_command ${wl}-bind_at_load"
-	    ;;
-	  esac
-	fi
-	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
-	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	;;
-      esac
-
-
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $compile_deplibs " in
-	  *" -L$path/$objdir "*)
-	    new_libs="$new_libs -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $compile_deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) new_libs="$new_libs $deplib" ;;
-	  esac
-	  ;;
-	*) new_libs="$new_libs $deplib" ;;
-	esac
-      done
-      compile_deplibs="$new_libs"
-
-
-      compile_command="$compile_command $compile_deplibs"
-      finalize_command="$finalize_command $finalize_deplibs"
-
-      if test -n "$rpath$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	for libdir in $rpath $xrpath; do
-	  # This is the magic to use -rpath.
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_rpath="$finalize_rpath $libdir" ;;
-	  esac
-	done
-      fi
-
-      # Now hardcode the library paths
-      rpath=
-      hardcode_libdirs=
-      for libdir in $compile_rpath $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval flag=\"$hardcode_libdir_flag_spec\"
-	    rpath="$rpath $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) perm_rpath="$perm_rpath $libdir" ;;
-	  esac
-	fi
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$libdir:"*) ;;
-	  ::) dllsearchpath=$libdir;;
-	  *) dllsearchpath="$dllsearchpath:$libdir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  ::) dllsearchpath=$testbindir;;
-	  *) dllsearchpath="$dllsearchpath:$testbindir";;
-	  esac
-	  ;;
-	esac
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval rpath=\" $hardcode_libdir_flag_spec\"
-      fi
-      compile_rpath="$rpath"
-
-      rpath=
-      hardcode_libdirs=
-      for libdir in $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval flag=\"$hardcode_libdir_flag_spec\"
-	    rpath="$rpath $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$finalize_perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
-	  esac
-	fi
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval rpath=\" $hardcode_libdir_flag_spec\"
-      fi
-      finalize_rpath="$rpath"
-
-      if test -n "$libobjs" && test "$build_old_libs" = yes; then
-	# Transform all the library objects into standard objects.
-	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
-	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
-      fi
-
-      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
-
-      # template prelinking step
-      if test -n "$prelink_cmds"; then
-	func_execute_cmds "$prelink_cmds" 'exit $?'
-      fi
-
-      wrappers_required=yes
-      case $host in
-      *cegcc* | *mingw32ce*)
-        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
-        wrappers_required=no
-        ;;
-      *cygwin* | *mingw* )
-        if test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
-        ;;
-      *)
-        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
-        ;;
-      esac
-      if test "$wrappers_required" = no; then
-	# Replace the output file specification.
-	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
-	link_command="$compile_command$compile_rpath"
-
-	# We have no uninstalled library dependencies, so finalize right now.
-	exit_status=0
-	func_show_eval "$link_command" 'exit_status=$?'
-
-	# Delete the generated files.
-	if test -f "$output_objdir/${outputname}S.${objext}"; then
-	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
-	fi
-
-	exit $exit_status
-      fi
-
-      if test -n "$compile_shlibpath$finalize_shlibpath"; then
-	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
-      fi
-      if test -n "$finalize_shlibpath"; then
-	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
-      fi
-
-      compile_var=
-      finalize_var=
-      if test -n "$runpath_var"; then
-	if test -n "$perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $perm_rpath; do
-	    rpath="$rpath$dir:"
-	  done
-	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-	if test -n "$finalize_perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $finalize_perm_rpath; do
-	    rpath="$rpath$dir:"
-	  done
-	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-      fi
-
-      if test "$no_install" = yes; then
-	# We don't need to create a wrapper script.
-	link_command="$compile_var$compile_command$compile_rpath"
-	# Replace the output file specification.
-	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
-	# Delete the old output file.
-	$opt_dry_run || $RM $output
-	# Link the executable and exit
-	func_show_eval "$link_command" 'exit $?'
-	exit $EXIT_SUCCESS
-      fi
-
-      if test "$hardcode_action" = relink; then
-	# Fast installation is not supported
-	link_command="$compile_var$compile_command$compile_rpath"
-	relink_command="$finalize_var$finalize_command$finalize_rpath"
-
-	func_warning "this platform does not like uninstalled shared libraries"
-	func_warning "\`$output' will be relinked during installation"
-      else
-	if test "$fast_install" != no; then
-	  link_command="$finalize_var$compile_command$finalize_rpath"
-	  if test "$fast_install" = yes; then
-	    relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
-	  else
-	    # fast_install is set to needless
-	    relink_command=
-	  fi
-	else
-	  link_command="$compile_var$compile_command$compile_rpath"
-	  relink_command="$finalize_var$finalize_command$finalize_rpath"
-	fi
-      fi
-
-      # Replace the output file specification.
-      link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
-
-      # Delete the old output files.
-      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
-
-      func_show_eval "$link_command" 'exit $?'
-
-      # Now create the wrapper script.
-      func_verbose "creating $output"
-
-      # Quote the relink command for shipping.
-      if test -n "$relink_command"; then
-	# Preserve any variables that may affect compiler behavior
-	for var in $variables_saved_for_relink; do
-	  if eval test -z \"\${$var+set}\"; then
-	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
-	  elif eval var_value=\$$var; test -z "$var_value"; then
-	    relink_command="$var=; export $var; $relink_command"
-	  else
-	    func_quote_for_eval "$var_value"
-	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
-	  fi
-	done
-	relink_command="(cd `pwd`; $relink_command)"
-	relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
-      fi
-
-      # Only actually do things if not in dry run mode.
-      $opt_dry_run || {
-	# win32 will think the script is a binary if it has
-	# a .exe suffix, so we strip it off here.
-	case $output in
-	  *.exe) func_stripname '' '.exe' "$output"
-	         output=$func_stripname_result ;;
-	esac
-	# test for cygwin because mv fails w/o .exe extensions
-	case $host in
-	  *cygwin*)
-	    exeext=.exe
-	    func_stripname '' '.exe' "$outputname"
-	    outputname=$func_stripname_result ;;
-	  *) exeext= ;;
-	esac
-	case $host in
-	  *cygwin* | *mingw* )
-	    func_dirname_and_basename "$output" "" "."
-	    output_name=$func_basename_result
-	    output_path=$func_dirname_result
-	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
-	    cwrapper="$output_path/$output_name.exe"
-	    $RM $cwrappersource $cwrapper
-	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
-
-	    func_emit_cwrapperexe_src > $cwrappersource
-
-	    # The wrapper executable is built using the $host compiler,
-	    # because it contains $host paths and files. If cross-
-	    # compiling, it, like the target executable, must be
-	    # executed on the $host or under an emulation environment.
-	    $opt_dry_run || {
-	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
-	      $STRIP $cwrapper
-	    }
-
-	    # Now, create the wrapper script for func_source use:
-	    func_ltwrapper_scriptname $cwrapper
-	    $RM $func_ltwrapper_scriptname_result
-	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
-	    $opt_dry_run || {
-	      # note: this script will not be executed, so do not chmod.
-	      if test "x$build" = "x$host" ; then
-		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
-	      else
-		func_emit_wrapper no > $func_ltwrapper_scriptname_result
-	      fi
-	    }
-	  ;;
-	  * )
-	    $RM $output
-	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
-
-	    func_emit_wrapper no > $output
-	    chmod +x $output
-	  ;;
-	esac
-      }
-      exit $EXIT_SUCCESS
-      ;;
-    esac
-
-    # See if we need to build an old-fashioned archive.
-    for oldlib in $oldlibs; do
-
-      if test "$build_libtool_libs" = convenience; then
-	oldobjs="$libobjs_save $symfileobj"
-	addlibs="$convenience"
-	build_libtool_libs=no
-      else
-	if test "$build_libtool_libs" = module; then
-	  oldobjs="$libobjs_save"
-	  build_libtool_libs=no
-	else
-	  oldobjs="$old_deplibs $non_pic_objects"
-	  if test "$preload" = yes && test -f "$symfileobj"; then
-	    oldobjs="$oldobjs $symfileobj"
-	  fi
-	fi
-	addlibs="$old_convenience"
-      fi
-
-      if test -n "$addlibs"; then
-	gentop="$output_objdir/${outputname}x"
-	generated="$generated $gentop"
-
-	func_extract_archives $gentop $addlibs
-	oldobjs="$oldobjs $func_extract_archives_result"
-      fi
-
-      # Do each command in the archive commands.
-      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
-	cmds=$old_archive_from_new_cmds
-      else
-
-	# Add any objects from preloaded convenience libraries
-	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
-	  generated="$generated $gentop"
-
-	  func_extract_archives $gentop $dlprefiles
-	  oldobjs="$oldobjs $func_extract_archives_result"
-	fi
-
-	# POSIX demands no paths to be encoded in archives.  We have
-	# to avoid creating archives with duplicate basenames if we
-	# might have to extract them afterwards, e.g., when creating a
-	# static archive out of a convenience library, or when linking
-	# the entirety of a libtool archive into another (currently
-	# not supported by libtool).
-	if (for obj in $oldobjs
-	    do
-	      func_basename "$obj"
-	      $ECHO "$func_basename_result"
-	    done | sort | sort -uc >/dev/null 2>&1); then
-	  :
-	else
-	  echo "copying selected object files to avoid basename conflicts..."
-	  gentop="$output_objdir/${outputname}x"
-	  generated="$generated $gentop"
-	  func_mkdir_p "$gentop"
-	  save_oldobjs=$oldobjs
-	  oldobjs=
-	  counter=1
-	  for obj in $save_oldobjs
-	  do
-	    func_basename "$obj"
-	    objbase="$func_basename_result"
-	    case " $oldobjs " in
-	    " ") oldobjs=$obj ;;
-	    *[\ /]"$objbase "*)
-	      while :; do
-		# Make sure we don't pick an alternate name that also
-		# overlaps.
-		newobj=lt$counter-$objbase
-		func_arith $counter + 1
-		counter=$func_arith_result
-		case " $oldobjs " in
-		*[\ /]"$newobj "*) ;;
-		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
-		esac
-	      done
-	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
-	      oldobjs="$oldobjs $gentop/$newobj"
-	      ;;
-	    *) oldobjs="$oldobjs $obj" ;;
-	    esac
-	  done
-	fi
-	eval cmds=\"$old_archive_cmds\"
-
-	func_len " $cmds"
-	len=$func_len_result
-	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  cmds=$old_archive_cmds
-	else
-	  # the command line is too long to link in one step, link in parts
-	  func_verbose "using piecewise archive linking..."
-	  save_RANLIB=$RANLIB
-	  RANLIB=:
-	  objlist=
-	  concat_cmds=
-	  save_oldobjs=$oldobjs
-	  oldobjs=
-	  # Is there a better way of finding the last object in the list?
-	  for obj in $save_oldobjs
-	  do
-	    last_oldobj=$obj
-	  done
-	  eval test_cmds=\"$old_archive_cmds\"
-	  func_len " $test_cmds"
-	  len0=$func_len_result
-	  len=$len0
-	  for obj in $save_oldobjs
-	  do
-	    func_len " $obj"
-	    func_arith $len + $func_len_result
-	    len=$func_arith_result
-	    func_append objlist " $obj"
-	    if test "$len" -lt "$max_cmd_len"; then
-	      :
-	    else
-	      # the above command should be used before it gets too long
-	      oldobjs=$objlist
-	      if test "$obj" = "$last_oldobj" ; then
-		RANLIB=$save_RANLIB
-	      fi
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
-	      objlist=
-	      len=$len0
-	    fi
-	  done
-	  RANLIB=$save_RANLIB
-	  oldobjs=$objlist
-	  if test "X$oldobjs" = "X" ; then
-	    eval cmds=\"\$concat_cmds\"
-	  else
-	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
-	  fi
-	fi
-      fi
-      func_execute_cmds "$cmds" 'exit $?'
-    done
-
-    test -n "$generated" && \
-      func_show_eval "${RM}r$generated"
-
-    # Now create the libtool archive.
-    case $output in
-    *.la)
-      old_library=
-      test "$build_old_libs" = yes && old_library="$libname.$libext"
-      func_verbose "creating $output"
-
-      # Preserve any variables that may affect compiler behavior
-      for var in $variables_saved_for_relink; do
-	if eval test -z \"\${$var+set}\"; then
-	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
-	elif eval var_value=\$$var; test -z "$var_value"; then
-	  relink_command="$var=; export $var; $relink_command"
-	else
-	  func_quote_for_eval "$var_value"
-	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
-	fi
-      done
-      # Quote the link command for shipping.
-      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
-      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
-      if test "$hardcode_automatic" = yes ; then
-	relink_command=
-      fi
-
-      # Only create the output if not a dry run.
-      $opt_dry_run || {
-	for installed in no yes; do
-	  if test "$installed" = yes; then
-	    if test -z "$install_libdir"; then
-	      break
-	    fi
-	    output="$output_objdir/$outputname"i
-	    # Replace all uninstalled libtool libraries with the installed ones
-	    newdependency_libs=
-	    for deplib in $dependency_libs; do
-	      case $deplib in
-	      *.la)
-		func_basename "$deplib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$deplib' is not a valid libtool archive"
-		newdependency_libs="$newdependency_libs $libdir/$name"
-		;;
-	      *) newdependency_libs="$newdependency_libs $deplib" ;;
-	      esac
-	    done
-	    dependency_libs="$newdependency_libs"
-	    newdlfiles=
-
-	    for lib in $dlfiles; do
-	      case $lib in
-	      *.la)
-	        func_basename "$lib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
-		newdlfiles="$newdlfiles $libdir/$name"
-		;;
-	      *) newdlfiles="$newdlfiles $lib" ;;
-	      esac
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      case $lib in
-	      *.la)
-		# Only pass preopened files to the pseudo-archive (for
-		# eventual linking with the app. that links it) if we
-		# didn't already link the preopened objects directly into
-		# the library:
-		func_basename "$lib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
-		newdlprefiles="$newdlprefiles $libdir/$name"
-		;;
-	      esac
-	    done
-	    dlprefiles="$newdlprefiles"
-	  else
-	    newdlfiles=
-	    for lib in $dlfiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      newdlfiles="$newdlfiles $abs"
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      newdlprefiles="$newdlprefiles $abs"
-	    done
-	    dlprefiles="$newdlprefiles"
-	  fi
-	  $RM $output
-	  # place dlname in correct position for cygwin
-	  # In fact, it would be nice if we could use this code for all target
-	  # systems that can't hard-code library paths into their executables
-	  # and that have no shared library path variable independent of PATH,
-	  # but it turns out we can't easily determine that from inspecting
-	  # libtool variables, so we have to hard-code the OSs to which it
-	  # applies here; at the moment, that means platforms that use the PE
-	  # object format with DLL files.  See the long comment at the top of
-	  # tests/bindir.at for full details.
-	  tdlname=$dlname
-	  case $host,$output,$installed,$module,$dlname in
-	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
-	      # If a -bindir argument was supplied, place the dll there.
-	      if test "x$bindir" != x ;
-	      then
-		func_relative_path "$install_libdir" "$bindir"
-		tdlname=$func_relative_path_result$dlname
-	      else
-		# Otherwise fall back on heuristic.
-		tdlname=../bin/$dlname
-	      fi
-	      ;;
-	  esac
-	  $ECHO > $output "\
-# $outputname - a libtool library file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# The name that we can dlopen(3).
-dlname='$tdlname'
-
-# Names of this library.
-library_names='$library_names'
-
-# The name of the static archive.
-old_library='$old_library'
-
-# Linker flags that can not go in dependency_libs.
-inherited_linker_flags='$new_inherited_linker_flags'
-
-# Libraries that this one depends upon.
-dependency_libs='$dependency_libs'
-
-# Names of additional weak libraries provided by this library
-weak_library_names='$weak_libs'
-
-# Version information for $libname.
-current=$current
-age=$age
-revision=$revision
-
-# Is this an already installed library?
-installed=$installed
-
-# Should we warn about portability when linking against -modules?
-shouldnotlink=$module
-
-# Files to dlopen/dlpreopen
-dlopen='$dlfiles'
-dlpreopen='$dlprefiles'
-
-# Directory that this library needs to be installed in:
-libdir='$install_libdir'"
-	  if test "$installed" = no && test "$need_relink" = yes; then
-	    $ECHO >> $output "\
-relink_command=\"$relink_command\""
-	  fi
-	done
-      }
-
-      # Do a symbolic link so that the libtool archive can be found in
-      # LD_LIBRARY_PATH before the program is installed.
-      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
-      ;;
-    esac
-    exit $EXIT_SUCCESS
-}
-
-{ test "$mode" = link || test "$mode" = relink; } &&
-    func_mode_link ${1+"$@"}
-
-
-# func_mode_uninstall arg...
-func_mode_uninstall ()
-{
-    $opt_debug
-    RM="$nonopt"
-    files=
-    rmforce=
-    exit_status=0
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    for arg
-    do
-      case $arg in
-      -f) RM="$RM $arg"; rmforce=yes ;;
-      -*) RM="$RM $arg" ;;
-      *) files="$files $arg" ;;
-      esac
-    done
-
-    test -z "$RM" && \
-      func_fatal_help "you must specify an RM program"
-
-    rmdirs=
-
-    origobjdir="$objdir"
-    for file in $files; do
-      func_dirname "$file" "" "."
-      dir="$func_dirname_result"
-      if test "X$dir" = X.; then
-	objdir="$origobjdir"
-      else
-	objdir="$dir/$origobjdir"
-      fi
-      func_basename "$file"
-      name="$func_basename_result"
-      test "$mode" = uninstall && objdir="$dir"
-
-      # Remember objdir for removal later, being careful to avoid duplicates
-      if test "$mode" = clean; then
-	case " $rmdirs " in
-	  *" $objdir "*) ;;
-	  *) rmdirs="$rmdirs $objdir" ;;
-	esac
-      fi
-
-      # Don't error if the file doesn't exist and rm -f was used.
-      if { test -L "$file"; } >/dev/null 2>&1 ||
-	 { test -h "$file"; } >/dev/null 2>&1 ||
-	 test -f "$file"; then
-	:
-      elif test -d "$file"; then
-	exit_status=1
-	continue
-      elif test "$rmforce" = yes; then
-	continue
-      fi
-
-      rmfiles="$file"
-
-      case $name in
-      *.la)
-	# Possibly a libtool archive, so verify it.
-	if func_lalib_p "$file"; then
-	  func_source $dir/$name
-
-	  # Delete the libtool libraries and symlinks.
-	  for n in $library_names; do
-	    rmfiles="$rmfiles $objdir/$n"
-	  done
-	  test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
-
-	  case "$mode" in
-	  clean)
-	    case "  $library_names " in
-	    # "  " in the beginning catches empty $dlname
-	    *" $dlname "*) ;;
-	    *) rmfiles="$rmfiles $objdir/$dlname" ;;
-	    esac
-	    test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
-	    ;;
-	  uninstall)
-	    if test -n "$library_names"; then
-	      # Do each command in the postuninstall commands.
-	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
-	    fi
-
-	    if test -n "$old_library"; then
-	      # Do each command in the old_postuninstall commands.
-	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
-	    fi
-	    # FIXME: should reinstall the best remaining shared library.
-	    ;;
-	  esac
-	fi
-	;;
-
-      *.lo)
-	# Possibly a libtool object, so verify it.
-	if func_lalib_p "$file"; then
-
-	  # Read the .lo file
-	  func_source $dir/$name
-
-	  # Add PIC object to the list of files to remove.
-	  if test -n "$pic_object" &&
-	     test "$pic_object" != none; then
-	    rmfiles="$rmfiles $dir/$pic_object"
-	  fi
-
-	  # Add non-PIC object to the list of files to remove.
-	  if test -n "$non_pic_object" &&
-	     test "$non_pic_object" != none; then
-	    rmfiles="$rmfiles $dir/$non_pic_object"
-	  fi
-	fi
-	;;
-
-      *)
-	if test "$mode" = clean ; then
-	  noexename=$name
-	  case $file in
-	  *.exe)
-	    func_stripname '' '.exe' "$file"
-	    file=$func_stripname_result
-	    func_stripname '' '.exe' "$name"
-	    noexename=$func_stripname_result
-	    # $file with .exe has already been added to rmfiles,
-	    # add $file without .exe
-	    rmfiles="$rmfiles $file"
-	    ;;
-	  esac
-	  # Do a test to see if this is a libtool program.
-	  if func_ltwrapper_p "$file"; then
-	    if func_ltwrapper_executable_p "$file"; then
-	      func_ltwrapper_scriptname "$file"
-	      relink_command=
-	      func_source $func_ltwrapper_scriptname_result
-	      rmfiles="$rmfiles $func_ltwrapper_scriptname_result"
-	    else
-	      relink_command=
-	      func_source $dir/$noexename
-	    fi
-
-	    # note $name still contains .exe if it was in $file originally
-	    # as does the version of $file that was added into $rmfiles
-	    rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
-	    if test "$fast_install" = yes && test -n "$relink_command"; then
-	      rmfiles="$rmfiles $objdir/lt-$name"
-	    fi
-	    if test "X$noexename" != "X$name" ; then
-	      rmfiles="$rmfiles $objdir/lt-${noexename}.c"
-	    fi
-	  fi
-	fi
-	;;
-      esac
-      func_show_eval "$RM $rmfiles" 'exit_status=1'
-    done
-    objdir="$origobjdir"
-
-    # Try to remove the ${objdir}s in the directories where we deleted files
-    for dir in $rmdirs; do
-      if test -d "$dir"; then
-	func_show_eval "rmdir $dir >/dev/null 2>&1"
-      fi
-    done
-
-    exit $exit_status
-}
-
-{ test "$mode" = uninstall || test "$mode" = clean; } &&
-    func_mode_uninstall ${1+"$@"}
-
-test -z "$mode" && {
-  help="$generic_help"
-  func_fatal_help "you must specify a MODE"
-}
-
-test -z "$exec_cmd" && \
-  func_fatal_help "invalid operation mode \`$mode'"
-
-if test -n "$exec_cmd"; then
-  eval exec "$exec_cmd"
-  exit $EXIT_FAILURE
-fi
-
-exit $exit_status
-
-
-# The TAGs below are defined such that we never get into a situation
-# in which we disable both kinds of libraries.  Given conflicting
-# choices, we go for a static library, that is the most portable,
-# since we can't tell whether shared libraries were disabled because
-# the user asked for that or because the platform doesn't support
-# them.  This is particularly important on AIX, because we don't
-# support having both static and shared libraries enabled at the same
-# time on that platform, so we default to a shared-only configuration.
-# If a disable-shared tag is given, we'll fallback to a static-only
-# configuration.  But we'll never go from static-only to shared-only.
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
-build_libtool_libs=no
-build_old_libs=yes
-# ### END LIBTOOL TAG CONFIG: disable-shared
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-static
-build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
-# ### END LIBTOOL TAG CONFIG: disable-static
-
-# Local Variables:
-# mode:shell-script
-# sh-indentation:2
-# End:
-# vi:sw=2
-
diff --git a/cloog-0.16.3/isl/m4/ax_c___attribute__.m4 b/cloog-0.16.3/isl/m4/ax_c___attribute__.m4
deleted file mode 100644
index cf3d62b..0000000
--- a/cloog-0.16.3/isl/m4/ax_c___attribute__.m4
+++ /dev/null
@@ -1,66 +0,0 @@
-# ===========================================================================
-#    http://www.gnu.org/software/autoconf-archive/ax_c___attribute__.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_C___ATTRIBUTE__
-#
-# DESCRIPTION
-#
-#   Provides a test for the compiler support of __attribute__ extensions.
-#   Defines HAVE___ATTRIBUTE__ if it is found.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Stepan Kasal <skasal@redhat.com>
-#   Copyright (c) 2008 Christian Haggstrom
-#   Copyright (c) 2008 Ryan McCabe <ryan@numb.org>
-#
-#   This program is free software; you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation; either version 2 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-#serial 8
-
-AC_DEFUN([AX_C___ATTRIBUTE__], [
-  AC_CACHE_CHECK([for __attribute__], [ax_cv___attribute__],
-    [AC_COMPILE_IFELSE(
-      [AC_LANG_PROGRAM(
-	[[#include <stdlib.h>
-	  static void foo(void) __attribute__ ((unused));
-	  static void
-	  foo(void) {
-	      exit(1);
-	  }
-        ]], [])],
-      [ax_cv___attribute__=yes],
-      [ax_cv___attribute__=no]
-    )
-  ])
-  if test "$ax_cv___attribute__" = "yes"; then
-    AC_DEFINE([HAVE___ATTRIBUTE__], 1, [define if your compiler has __attribute__])
-  fi
-])
diff --git a/cloog-0.16.3/isl/m4/ax_cc_maxopt.m4 b/cloog-0.16.3/isl/m4/ax_cc_maxopt.m4
deleted file mode 100644
index 92d522d..0000000
--- a/cloog-0.16.3/isl/m4/ax_cc_maxopt.m4
+++ /dev/null
@@ -1,188 +0,0 @@
-# ===========================================================================
-#          http://www.nongnu.org/autoconf-archive/ax_cc_maxopt.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_CC_MAXOPT
-#
-# DESCRIPTION
-#
-#   Try to turn on "good" C optimization flags for various compilers and
-#   architectures, for some definition of "good". (In our case, good for
-#   FFTW and hopefully for other scientific codes. Modify as needed.)
-#
-#   The user can override the flags by setting the CFLAGS environment
-#   variable. The user can also specify --enable-portable-binary in order to
-#   disable any optimization flags that might result in a binary that only
-#   runs on the host architecture.
-#
-#   Note also that the flags assume that ANSI C aliasing rules are followed
-#   by the code (e.g. for gcc's -fstrict-aliasing), and that floating-point
-#   computations can be re-ordered as needed.
-#
-#   Requires macros: AX_CHECK_COMPILER_FLAGS, AX_COMPILER_VENDOR,
-#   AX_GCC_ARCHFLAG, AX_GCC_X86_CPUID.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
-#   Copyright (c) 2008 Matteo Frigo
-#
-#   This program is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation, either version 3 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_CC_MAXOPT],
-[
-AC_REQUIRE([AC_PROG_CC])
-AC_REQUIRE([AX_COMPILER_VENDOR])
-AC_REQUIRE([AC_CANONICAL_HOST])
-
-AC_ARG_ENABLE(portable-binary, [AC_HELP_STRING([--enable-portable-binary], [disable compiler optimizations that would produce unportable binaries])],
-	acx_maxopt_portable=$withval, acx_maxopt_portable=no)
-
-# Try to determine "good" native compiler flags if none specified via CFLAGS
-if test "$ac_test_CFLAGS" != "set"; then
-  CFLAGS=""
-  case $ax_cv_c_compiler_vendor in
-    dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host"
-	 if test "x$acx_maxopt_portable" = xno; then
-           CFLAGS="$CFLAGS -arch host"
-         fi;;
-
-    sun) CFLAGS="-native -fast -xO5 -dalign"
-	 if test "x$acx_maxopt_portable" = xyes; then
-	   CFLAGS="$CFLAGS -xarch=generic"
-         fi;;
-
-    hp)  CFLAGS="+Oall +Optrs_ansi +DSnative"
-	 if test "x$acx_maxopt_portable" = xyes; then
-	   CFLAGS="$CFLAGS +DAportable"
-	 fi;;
-
-    ibm) if test "x$acx_maxopt_portable" = xno; then
-           xlc_opt="-qarch=auto -qtune=auto"
-	 else
-           xlc_opt="-qtune=auto"
-	 fi
-         AX_CHECK_COMPILER_FLAGS($xlc_opt,
-         	CFLAGS="-O3 -qansialias -w $xlc_opt",
-               [CFLAGS="-O3 -qansialias -w"
-                echo "******************************************************"
-                echo "*  You seem to have the IBM  C compiler.  It is      *"
-                echo "*  recommended for best performance that you use:    *"
-                echo "*                                                    *"
-                echo "*    CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *"
-                echo "*                      ^^^        ^^^                *"
-                echo "*  where xxx is pwr2, pwr3, 604, or whatever kind of *"
-                echo "*  CPU you have.  (Set the CFLAGS environment var.   *"
-                echo "*  and re-run configure.)  For more info, man cc.    *"
-                echo "******************************************************"])
-         ;;
-
-    intel) CFLAGS="-O3 -ansi_alias"
-	if test "x$acx_maxopt_portable" = xno; then
-	  icc_archflag=unknown
-	  icc_flags=""
-	  case $host_cpu in
-	    i686*|x86_64*)
-              # icc accepts gcc assembly syntax, so these should work:
-	      AX_GCC_X86_CPUID(0)
-              AX_GCC_X86_CPUID(1)
-	      case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG
-                *:756e6547:*:*) # Intel
-                  case $ax_cv_gcc_x86_cpuid_1 in
-                    *6a?:*[[234]]:*:*|*6[[789b]]?:*:*:*) icc_flags="-xK";;
-                    *f3[[347]]:*:*:*|*f4[1347]:*:*:*) icc_flags="-xP -xN -xW -xK";;
-                    *f??:*:*:*) icc_flags="-xN -xW -xK";;
-                  esac ;;
-              esac ;;
-          esac
-          if test "x$icc_flags" != x; then
-            for flag in $icc_flags; do
-              AX_CHECK_COMPILER_FLAGS($flag, [icc_archflag=$flag; break])
-            done
-          fi
-          AC_MSG_CHECKING([for icc architecture flag])
-	  AC_MSG_RESULT($icc_archflag)
-          if test "x$icc_archflag" != xunknown; then
-            CFLAGS="$CFLAGS $icc_archflag"
-          fi
-        fi
-	;;
-
-    gnu)
-     # default optimization flags for gcc on all systems
-     CFLAGS="-O3 -fomit-frame-pointer"
-
-     # -malign-double for x86 systems
-     AX_CHECK_COMPILER_FLAGS(-malign-double, CFLAGS="$CFLAGS -malign-double")
-
-     #  -fstrict-aliasing for gcc-2.95+
-     AX_CHECK_COMPILER_FLAGS(-fstrict-aliasing,
-	CFLAGS="$CFLAGS -fstrict-aliasing")
-
-     # note that we enable "unsafe" fp optimization with other compilers, too
-     AX_CHECK_COMPILER_FLAGS(-ffast-math, CFLAGS="$CFLAGS -ffast-math")
-
-     AX_GCC_ARCHFLAG($acx_maxopt_portable)
-
-     # drop to -O1 for gcc 4.2
-     $CC --version |
-	sed -e 's/.* \(@<:@0-9@:>@@<:@0-9@:>@*\)\.\(@<:@0-9@:>@@<:@0-9@:>@*\).*/\1 \2/' |
-	(read major minor
-	    if test $major -eq 4 -a $minor -eq 2; then
-				exit 0
-	    fi
-	    exit 1
-	) && CFLAGS="-O1"
-     ;;
-  esac
-
-  if test -z "$CFLAGS"; then
-	echo ""
-	echo "********************************************************"
-        echo "* WARNING: Don't know the best CFLAGS for this system  *"
-        echo "* Use ./configure CFLAGS=... to specify your own flags *"
-	echo "* (otherwise, a default of CFLAGS=-O3 will be used)    *"
-	echo "********************************************************"
-	echo ""
-        CFLAGS="-O3"
-  fi
-
-  AX_CHECK_COMPILER_FLAGS($CFLAGS, [], [
-	echo ""
-        echo "********************************************************"
-        echo "* WARNING: The guessed CFLAGS don't seem to work with  *"
-        echo "* your compiler.                                       *"
-        echo "* Use ./configure CFLAGS=... to specify your own flags *"
-        echo "********************************************************"
-        echo ""
-        CFLAGS=""
-  ])
-
-fi
-])
diff --git a/cloog-0.16.3/isl/m4/ax_check_compiler_flags.m4 b/cloog-0.16.3/isl/m4/ax_check_compiler_flags.m4
deleted file mode 100644
index 7da8324..0000000
--- a/cloog-0.16.3/isl/m4/ax_check_compiler_flags.m4
+++ /dev/null
@@ -1,74 +0,0 @@
-# ===========================================================================
-#     http://www.nongnu.org/autoconf-archive/ax_check_compiler_flags.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_CHECK_COMPILER_FLAGS(FLAGS, [ACTION-SUCCESS], [ACTION-FAILURE])
-#
-# DESCRIPTION
-#
-#   Check whether the given compiler FLAGS work with the current language's
-#   compiler, or whether they give an error. (Warnings, however, are
-#   ignored.)
-#
-#   ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
-#   success/failure.
-#
-# LICENSE
-#
-#   Copyright (c) 2009 Steven G. Johnson <stevenj@alum.mit.edu>
-#   Copyright (c) 2009 Matteo Frigo
-#
-#   This program is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation, either version 3 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_CHECK_COMPILER_FLAGS],
-[AC_PREREQ(2.59) dnl for _AC_LANG_PREFIX
-AC_MSG_CHECKING([whether _AC_LANG compiler accepts $1])
-dnl Some hackery here since AC_CACHE_VAL can't handle a non-literal varname:
-AS_LITERAL_IF([$1],
-  [AC_CACHE_VAL(AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1]), [
-      ax_save_FLAGS=$[]_AC_LANG_PREFIX[]FLAGS
-      _AC_LANG_PREFIX[]FLAGS="$1"
-      AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
-        AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=yes,
-        AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=no)
-      _AC_LANG_PREFIX[]FLAGS=$ax_save_FLAGS])],
-  [ax_save_FLAGS=$[]_AC_LANG_PREFIX[]FLAGS
-   _AC_LANG_PREFIX[]FLAGS="$1"
-   AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
-     eval AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=yes,
-     eval AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=no)
-   _AC_LANG_PREFIX[]FLAGS=$ax_save_FLAGS])
-eval ax_check_compiler_flags=$AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])
-AC_MSG_RESULT($ax_check_compiler_flags)
-if test "x$ax_check_compiler_flags" = xyes; then
-	m4_default([$2], :)
-else
-	m4_default([$3], :)
-fi
-])dnl AX_CHECK_COMPILER_FLAGS
diff --git a/cloog-0.16.3/isl/m4/ax_compiler_vendor.m4 b/cloog-0.16.3/isl/m4/ax_compiler_vendor.m4
deleted file mode 100644
index 3214706..0000000
--- a/cloog-0.16.3/isl/m4/ax_compiler_vendor.m4
+++ /dev/null
@@ -1,63 +0,0 @@
-# ===========================================================================
-#    http://www.gnu.org/software/autoconf-archive/ax_compiler_vendor.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_COMPILER_VENDOR
-#
-# DESCRIPTION
-#
-#   Determine the vendor of the C/C++ compiler, e.g., gnu, intel, ibm, sun,
-#   hp, borland, comeau, dec, cray, kai, lcc, metrowerks, sgi, microsoft,
-#   watcom, etc. The vendor is returned in the cache variable
-#   $ax_cv_c_compiler_vendor for C and $ax_cv_cxx_compiler_vendor for C++.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
-#   Copyright (c) 2008 Matteo Frigo
-#
-#   This program is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation, either version 3 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-#serial 9
-
-AC_DEFUN([AX_COMPILER_VENDOR],
-[
-AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor,
- [ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=unknown
-  # note: don't check for gcc first since some other compilers define __GNUC__
-  for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale:__PATHCC__,__PATHSCALE__ clang:__clang__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do
-    vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")"
-    AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[
-#if !($vencpp)
-      thisisanerror;
-#endif
-])], [ax_cv_]_AC_LANG_ABBREV[_compiler_vendor=`echo $ventest | cut -d: -f1`; break])
-  done
- ])
-])
diff --git a/cloog-0.16.3/isl/m4/ax_create_pkgconfig_info.m4 b/cloog-0.16.3/isl/m4/ax_create_pkgconfig_info.m4
deleted file mode 100644
index 60ac548..0000000
--- a/cloog-0.16.3/isl/m4/ax_create_pkgconfig_info.m4
+++ /dev/null
@@ -1,349 +0,0 @@
-# ===========================================================================
-#    http://www.nongnu.org/autoconf-archive/ax_create_pkgconfig_info.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_CREATE_PKGCONFIG_INFO [(outputfile, [requires [,libs [,summary [,cflags [, ldflags]]]]])]
-#
-# DESCRIPTION
-#
-#   Defaults:
-#
-#     $1 = $PACKAGE_NAME.pc
-#     $2 = (empty)
-#     $3 = $PACKAGE_LIBS $LIBS (as set at that point in configure.ac)
-#     $4 = $PACKAGE_SUMMARY (or $1 Library)
-#     $5 = $CPPFLAGS $PACKAGE_CFLAGS (as set at the point in configure.ac)
-#     $6 = $LDFLAGS $PACKAGE_LDFLAGS (as set at the point in configure.ac)
-#
-#     PACKAGE_NAME defaults to $PACKAGE if not set.
-#     PACKAGE_LIBS defaults to -l$PACKAGE_NAME if not set.
-#
-#   The resulting file is called $PACKAGE.pc.in / $PACKAGE.pc
-#
-#   You will find this macro most useful in conjunction with
-#   ax_spec_defaults that can read good initializers from the .spec file. In
-#   consequencd, most of the generatable installable stuff can be made from
-#   information being updated in a single place for the whole project.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
-#   Copyright (c) 2008 Sven Verdoolaege <skimo@kotnet.org>
-#
-#   This program is free software; you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation; either version 2 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_CREATE_PKGCONFIG_INFO],[dnl
-AS_VAR_PUSHDEF([PKGCONFIG_suffix],[ax_create_pkgconfig_suffix])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_libdir],[ax_create_pkgconfig_libdir])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_libfile],[ax_create_pkgconfig_libfile])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_libname],[ax_create_pkgconfig_libname])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_version],[ax_create_pkgconfig_version])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_description],[ax_create_pkgconfig_description])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_requires],[ax_create_pkgconfig_requires])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_pkglibs],[ax_create_pkgconfig_pkglibs])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_libs],[ax_create_pkgconfig_libs])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_ldflags],[ax_create_pkgconfig_ldflags])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_cppflags],[ax_create_pkgconfig_cppflags])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_generate],[ax_create_pkgconfig_generate])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_src_libdir],[ax_create_pkgconfig_src_libdir])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_src_headers],[ax_create_pkgconfig_src_headers])dnl
-
-# we need the expanded forms...
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-AC_MSG_CHECKING(our pkgconfig libname)
-test ".$PKGCONFIG_libname" != "." || \
-PKGCONFIG_libname="ifelse($1,,${PACKAGE_NAME},`basename $1 .pc`)"
-test ".$PKGCONFIG_libname" != "." || \
-PKGCONFIG_libname="$PACKAGE"
-PKGCONFIG_libname=`eval echo "$PKGCONFIG_libname"`
-PKGCONFIG_libname=`eval echo "$PKGCONFIG_libname"`
-AC_MSG_RESULT($PKGCONFIG_libname)
-
-AC_MSG_CHECKING(our pkgconfig version)
-test ".$PKGCONFIG_version" != "." || \
-PKGCONFIG_version="${PACKAGE_VERSION}"
-test ".$PKGCONFIG_version" != "." || \
-PKGCONFIG_version="$VERSION"
-PKGCONFIG_version=`eval echo "$PKGCONFIG_version"`
-PKGCONFIG_version=`eval echo "$PKGCONFIG_version"`
-AC_MSG_RESULT($PKGCONFIG_version)
-
-AC_MSG_CHECKING(our pkgconfig_libdir)
-test ".$pkgconfig_libdir" = "." && \
-pkgconfig_libdir='${libdir}/pkgconfig'
-PKGCONFIG_libdir=`eval echo "$pkgconfig_libdir"`
-PKGCONFIG_libdir=`eval echo "$PKGCONFIG_libdir"`
-PKGCONFIG_libdir=`eval echo "$PKGCONFIG_libdir"`
-AC_MSG_RESULT($pkgconfig_libdir)
-test "$pkgconfig_libdir" != "$PKGCONFIG_libdir" && (
-AC_MSG_RESULT(expanded our pkgconfig_libdir... $PKGCONFIG_libdir))
-AC_SUBST([pkgconfig_libdir])
-
-AC_MSG_CHECKING(our pkgconfig_libfile)
-test ".$pkgconfig_libfile" != "." || \
-pkgconfig_libfile="ifelse($1,,$PKGCONFIG_libname.pc,`basename $1`)"
-PKGCONFIG_libfile=`eval echo "$pkgconfig_libfile"`
-PKGCONFIG_libfile=`eval echo "$PKGCONFIG_libfile"`
-AC_MSG_RESULT($pkgconfig_libfile)
-test "$pkgconfig_libfile" != "$PKGCONFIG_libfile" && (
-AC_MSG_RESULT(expanded our pkgconfig_libfile... $PKGCONFIG_libfile))
-AC_SUBST([pkgconfig_libfile])
-
-AC_MSG_CHECKING(our package / suffix)
-PKGCONFIG_suffix="$program_suffix"
-test ".$PKGCONFIG_suffix" != .NONE || PKGCONFIG_suffix=""
-AC_MSG_RESULT(${PACKAGE_NAME} / ${PKGCONFIG_suffix})
-
-AC_MSG_CHECKING(our pkgconfig description)
-PKGCONFIG_description="ifelse($4,,$PACKAGE_SUMMARY,$4)"
-test ".$PKGCONFIG_description" != "." || \
-PKGCONFIG_description="$PKGCONFIG_libname Library"
-PKGCONFIG_description=`eval echo "$PKGCONFIG_description"`
-PKGCONFIG_description=`eval echo "$PKGCONFIG_description"`
-AC_MSG_RESULT($PKGCONFIG_description)
-
-AC_MSG_CHECKING(our pkgconfig requires)
-PKGCONFIG_requires="ifelse($2,,$PACKAGE_REQUIRES,$2)"
-PKGCONFIG_requires=`eval echo "$PKGCONFIG_requires"`
-PKGCONFIG_requires=`eval echo "$PKGCONFIG_requires"`
-AC_MSG_RESULT($PKGCONFIG_requires)
-
-AC_MSG_CHECKING(our pkgconfig ext libs)
-PKGCONFIG_pkglibs="$PACKAGE_LIBS"
-test ".$PKGCONFIG_pkglibs" != "." || PKGCONFIG_pkglibs="-l$PKGCONFIG_libname"
-PKGCONFIG_libs="ifelse($3,,$PKGCONFIG_pkglibs $LIBS,$3)"
-PKGCONFIG_libs=`eval echo "$PKGCONFIG_libs"`
-PKGCONFIG_libs=`eval echo "$PKGCONFIG_libs"`
-AC_MSG_RESULT($PKGCONFIG_libs)
-
-AC_MSG_CHECKING(our pkgconfig cppflags)
-PKGCONFIG_cppflags="ifelse($5,,$CPPFLAGS $PACKAGE_CFLAGS,$5)"
-PKGCONFIG_cppflags=`eval echo "$PKGCONFIG_cppflags"`
-PKGCONFIG_cppflags=`eval echo "$PKGCONFIG_cppflags"`
-AC_MSG_RESULT($PKGCONFIG_cppflags)
-
-AC_MSG_CHECKING(our pkgconfig ldflags)
-PKGCONFIG_ldflags="ifelse($6,,$LDFLAGS $PACKAGE_LDFLAGS,$5)"
-PKGCONFIG_ldflags=`eval echo "$PKGCONFIG_ldflags"`
-PKGCONFIG_ldflags=`eval echo "$PKGCONFIG_ldflags"`
-AC_MSG_RESULT($PKGCONFIG_ldflags)
-
-test ".$PKGCONFIG_generate" != "." || \
-PKGCONFIG_generate="ifelse($1,,$PKGCONFIG_libname.pc,$1)"
-PKGCONFIG_generate=`eval echo "$PKGCONFIG_generate"`
-PKGCONFIG_generate=`eval echo "$PKGCONFIG_generate"`
-test "$pkgconfig_libfile" != "$PKGCONFIG_generate" && (
-AC_MSG_RESULT(generate the pkgconfig later... $PKGCONFIG_generate))
-
-if test ".$PKGCONFIG_src_libdir" = "." ; then
-PKGCONFIG_src_libdir=`pwd`
-PKGCONFIG_src_libdir=`AS_DIRNAME("$PKGCONFIG_src_libdir/$PKGCONFIG_generate")`
-test ! -d $PKGCONFIG_src_libdir/src || \
-PKGCONFIG_src_libdir="$PKGCONFIG_src_libdir/src"
-case ".$objdir" in
-*libs) PKGCONFIG_src_libdir="$PKGCONFIG_src_libdir/$objdir" ;; esac
-AC_MSG_RESULT(noninstalled pkgconfig -L $PKGCONFIG_src_libdir)
-fi
-
-if test ".$PKGCONFIG_src_headers" = "." ; then
-PKGCONFIG_src_headers=`pwd`
-v="$ac_top_srcdir" ;
-test ".$v" != "." || v="$ax_spec_dir"
-test ".$v" != "." || v="$srcdir"
-case "$v" in /*) PKGCONFIG_src_headers="" ;; esac
-PKGCONFIG_src_headers=`AS_DIRNAME("$PKGCONFIG_src_headers/$v/x")`
-test ! -d $PKGCONFIG_src_headers/incl[]ude || \
-PKGCONFIG_src_headers="$PKGCONFIG_src_headers/incl[]ude"
-AC_MSG_RESULT(noninstalled pkgconfig -I $PKGCONFIG_src_headers)
-fi
-
-
-dnl AC_CONFIG_COMMANDS crap disallows to use $PKGCONFIG_libfile here...
-AC_CONFIG_COMMANDS([$ax_create_pkgconfig_generate],[
-pkgconfig_generate="$ax_create_pkgconfig_generate"
-if test ! -f "$pkgconfig_generate.in"
-then generate="true"
-elif grep ' generated by configure ' $pkgconfig_generate.in >/dev/null
-then generate="true"
-else generate="false";
-fi
-if $generate ; then
-AC_MSG_NOTICE(creating $pkgconfig_generate.in)
-cat > $pkgconfig_generate.in <<AXEOF
-# generated by configure / remove this line to disable regeneration
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-bindir=@bindir@
-libdir=@libdir@
-datarootdir=@datarootdir@
-datadir=@datadir@
-sysconfdir=@sysconfdir@
-includedir=@includedir@
-package=@PACKAGE@
-suffix=@suffix@
-
-Name: @PACKAGE_NAME@
-Description: @PACKAGE_DESCRIPTION@
-Version: @PACKAGE_VERSION@
-Requires: @PACKAGE_REQUIRES@
-Libs: -L\${libdir} @LDFLAGS@ @LIBS@
-Cflags: -I\${includedir} @CPPFLAGS@
-AXEOF
-fi # DONE generate $pkgconfig_generate.in
-AC_MSG_NOTICE(creating $pkgconfig_generate)
-cat >conftest.sed <<AXEOF
-s|@prefix@|${pkgconfig_prefix}|
-s|@exec_prefix@|${pkgconfig_execprefix}|
-s|@bindir@|${pkgconfig_bindir}|
-s|@libdir@|${pkgconfig_libdir}|
-s|@datarootdir@|${pkgconfig_datarootdir}|
-s|@datadir@|${pkgconfig_datadir}|
-s|@sysconfdir@|${pkgconfig_sysconfdir}|
-s|@includedir@|${pkgconfig_includedir}|
-s|@suffix@|${pkgconfig_suffix}|
-s|@PACKAGE@|${pkgconfig_package}|
-s|@PACKAGE_NAME@|${pkgconfig_libname}|
-s|@PACKAGE_DESCRIPTION@|${pkgconfig_description}|
-s|@PACKAGE_VERSION@|${pkgconfig_version}|
-s|@PACKAGE_REQUIRES@|${pkgconfig_requires}|
-s|@LIBS@|${pkgconfig_libs}|
-s|@LDFLAGS@|${pkgconfig_ldflags}|
-s|@CPPFLAGS@|${pkgconfig_cppflags}|
-AXEOF
-sed -f conftest.sed  $pkgconfig_generate.in > $pkgconfig_generate
-if test ! -s $pkgconfig_generate ; then
-    AC_MSG_ERROR([$pkgconfig_generate is empty])
-fi ; rm conftest.sed # DONE generate $pkgconfig_generate
-pkgconfig_uninstalled=`echo $pkgconfig_generate |sed 's/.pc$/-uninstalled.pc/'`
-AC_MSG_NOTICE(creating $pkgconfig_uninstalled)
-cat >conftest.sed <<AXEOF
-s|@prefix@|${pkgconfig_prefix}|
-s|@exec_prefix@|${pkgconfig_execprefix}|
-s|@bindir@|${pkgconfig_bindir}|
-s|@libdir@|${pkgconfig_src_libdir}|
-s|@datarootdir@|${pkgconfig_datarootdir}|
-s|@datadir@|${pkgconfig_datadir}|
-s|@sysconfdir@|${pkgconfig_sysconfdir}|
-s|@includedir@|${pkgconfig_src_headers}|
-s|@suffix@|${pkgconfig_suffix}|
-s|@PACKAGE@|${pkgconfig_package}|
-s|@PACKAGE_NAME@|${pkgconfig_libname}|
-s|@PACKAGE_DESCRIPTION@|${pkgconfig_description}|
-s|@PACKAGE_VERSION@|${pkgconfig_version}|
-s|@PACKAGE_REQUIRES@|${pkgconfig_requires}|
-s|@LIBS@|${pkgconfig_libs}|
-s|@LDFLAGS@|${pkgconfig_ldflags}|
-s|@CPPFLAGS@|${pkgconfig_cppflags}|
-AXEOF
-sed -f conftest.sed $pkgconfig_generate.in > $pkgconfig_uninstalled
-if test ! -s $pkgconfig_uninstalled ; then
-    AC_MSG_ERROR([$pkgconfig_uninstalled is empty])
-fi ; rm conftest.sed # DONE generate $pkgconfig_uninstalled
-           pkgconfig_requires_add=`echo ${pkgconfig_requires}`
-if test ".$pkgconfig_requires_add" != "." ; then
-           pkgconfig_requires_add="pkg-config $pkgconfig_requires_add"
-    else   pkgconfig_requires_add=":" ; fi
-pkgconfig_uninstalled=`echo $pkgconfig_generate |sed 's/.pc$/-uninstalled.sh/'`
-AC_MSG_NOTICE(creating $pkgconfig_uninstalled)
-cat >conftest.sed <<AXEOF
-s|@prefix@|\"${pkgconfig_prefix}\"|
-s|@exec_prefix@|\"${pkgconfig_execprefix}\"|
-s|@bindir@|\"${pkgconfig_bindir}\"|
-s|@libdir@|\"${pkgconfig_src_libdir}\"|
-s|@datarootdir@|\"${pkgconfig_datarootdir}\"|
-s|@datadir@|\"${pkgconfig_datadir}\"|
-s|@sysconfdir@|\"${pkgconfig_sysconfdir}\"|
-s|@includedir@|\"${pkgconfig_src_headers}\"|
-s|@suffix@|\"${pkgconfig_suffix}\"|
-s|@PACKAGE@|\"${pkgconfig_package}\"|
-s|@PACKAGE_NAME@|\"${pkgconfig_libname}\"|
-s|@PACKAGE_DESCRIPTION@|\"${pkgconfig_description}\"|
-s|@PACKAGE_VERSION@|\"${pkgconfig_version}\"|
-s|@PACKAGE_REQUIRES@|\"${pkgconfig_requires}\"|
-s|@LIBS@|\"${pkgconfig_libs}\"|
-s|@LDFLAGS@|\"${pkgconfig_ldflags}\"|
-s|@CPPFLAGS@|\"${pkgconfig_cppflags}\"|
-s>Name:>for option\\; do case \"\$option\" in --list-all|--name) echo >
-s>Description: *>\\;\\; --help) pkg-config --help \\; echo Buildscript Of >
-s>Version: *>\\;\\; --modversion|--version) echo >
-s>Requires:>\\;\\; --requires) echo $pkgconfig_requires_add>
-s>Libs: *>\\;\\; --libs) echo >
-s>Cflags: *>\\;\\; --cflags) echo >
-/--libs)/a\\
-       $pkgconfig_requires_add
-/--cflags)/a\\
-       $pkgconfig_requires_add\\
-;; --variable=*) eval echo '\$'\`echo \$option | sed -e 's/.*=//'\`\\
-;; --uninstalled) exit 0 \\
-;; *) ;; esac done
-AXEOF
-sed -f conftest.sed  $pkgconfig_generate.in > $pkgconfig_uninstalled
-if test ! -s $pkgconfig_uninstalled ; then
-    AC_MSG_ERROR([$pkgconfig_uninstalled is empty])
-fi ; rm conftest.sed # DONE generate $pkgconfig_uninstalled
-],[
-dnl AC_CONFIG_COMMANDS crap, the AS_PUSHVAR defines are invalid here...
-ax_create_pkgconfig_generate="$ax_create_pkgconfig_generate"
-pkgconfig_prefix='$prefix'
-pkgconfig_execprefix='$exec_prefix'
-pkgconfig_bindir='$bindir'
-pkgconfig_libdir='$libdir'
-pkgconfig_includedir='$includedir'
-pkgconfig_datarootdir='$datarootdir'
-pkgconfig_datadir='$datadir'
-pkgconfig_sysconfdir='$sysconfdir'
-pkgconfig_suffix='$ax_create_pkgconfig_suffix'
-pkgconfig_package='$PACKAGE_NAME'
-pkgconfig_libname='$ax_create_pkgconfig_libname'
-pkgconfig_description='$ax_create_pkgconfig_description'
-pkgconfig_version='$ax_create_pkgconfig_version'
-pkgconfig_requires='$ax_create_pkgconfig_requires'
-pkgconfig_libs='$ax_create_pkgconfig_libs'
-pkgconfig_ldflags='$ax_create_pkgconfig_ldflags'
-pkgconfig_cppflags='$ax_create_pkgconfig_cppflags'
-pkgconfig_src_libdir='$ax_create_pkgconfig_src_libdir'
-pkgconfig_src_headers='$ax_create_pkgconfig_src_headers'
-])dnl
-AS_VAR_POPDEF([PKGCONFIG_suffix])dnl
-AS_VAR_POPDEF([PKGCONFIG_libdir])dnl
-AS_VAR_POPDEF([PKGCONFIG_libfile])dnl
-AS_VAR_POPDEF([PKGCONFIG_libname])dnl
-AS_VAR_POPDEF([PKGCONFIG_version])dnl
-AS_VAR_POPDEF([PKGCONFIG_description])dnl
-AS_VAR_POPDEF([PKGCONFIG_requires])dnl
-AS_VAR_POPDEF([PKGCONFIG_pkglibs])dnl
-AS_VAR_POPDEF([PKGCONFIG_libs])dnl
-AS_VAR_POPDEF([PKGCONFIG_ldflags])dnl
-AS_VAR_POPDEF([PKGCONFIG_cppflags])dnl
-AS_VAR_POPDEF([PKGCONFIG_generate])dnl
-AS_VAR_POPDEF([PKGCONFIG_src_libdir])dnl
-AS_VAR_POPDEF([PKGCONFIG_src_headers])dnl
-])
diff --git a/cloog-0.16.3/isl/m4/ax_create_stdint_h.m4 b/cloog-0.16.3/isl/m4/ax_create_stdint_h.m4
deleted file mode 100644
index 7b82165..0000000
--- a/cloog-0.16.3/isl/m4/ax_create_stdint_h.m4
+++ /dev/null
@@ -1,739 +0,0 @@
-# ===========================================================================
-#           http://autoconf-archive.cryp.to/ax_create_stdint_h.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_CREATE_STDINT_H [( HEADER-TO-GENERATE [, HEDERS-TO-CHECK])]
-#
-# DESCRIPTION
-#
-#   the "ISO C9X: 7.18 Integer types <stdint.h>" section requires the
-#   existence of an include file <stdint.h> that defines a set of typedefs,
-#   especially uint8_t,int32_t,uintptr_t. Many older installations will not
-#   provide this file, but some will have the very same definitions in
-#   <inttypes.h>. In other enviroments we can use the inet-types in
-#   <sys/types.h> which would define the typedefs int8_t and u_int8_t
-#   respectivly.
-#
-#   This macros will create a local "_stdint.h" or the headerfile given as
-#   an argument. In many cases that file will just "#include <stdint.h>" or
-#   "#include <inttypes.h>", while in other environments it will provide the
-#   set of basic 'stdint's definitions/typedefs:
-#
-#     int8_t,uint8_t,int16_t,uint16_t,int32_t,uint32_t,intptr_t,uintptr_t
-#     int_least32_t.. int_fast32_t.. intmax_t
-#
-#   which may or may not rely on the definitions of other files, or using
-#   the AC_CHECK_SIZEOF macro to determine the actual sizeof each type.
-#
-#   if your header files require the stdint-types you will want to create an
-#   installable file mylib-int.h that all your other installable header may
-#   include. So if you have a library package named "mylib", just use
-#
-#        AX_CREATE_STDINT_H(mylib-int.h)
-#
-#   in configure.ac and go to install that very header file in Makefile.am
-#   along with the other headers (mylib.h) - and the mylib-specific headers
-#   can simply use "#include <mylib-int.h>" to obtain the stdint-types.
-#
-#   Remember, if the system already had a valid <stdint.h>, the generated
-#   file will include it directly. No need for fuzzy HAVE_STDINT_H things...
-#   (oops, GCC 4.2.x has deliberatly disabled its stdint.h for non-c99
-#   compilation and the c99-mode is not the default. Therefore this macro
-#   will not use the compiler's stdint.h - please complain to the GCC
-#   developers).
-#
-# LAST MODIFICATION
-#
-#   2008-04-12
-#
-# COPYLEFT
-#
-#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
-#
-#   This program is free software; you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation; either version 2 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Macro Archive. When you make and
-#   distribute a modified version of the Autoconf Macro, you may extend this
-#   special exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_CHECK_DATA_MODEL],[
-   AC_CHECK_SIZEOF(char)
-   AC_CHECK_SIZEOF(short)
-   AC_CHECK_SIZEOF(int)
-   AC_CHECK_SIZEOF(long)
-   AC_CHECK_SIZEOF(void*)
-   ac_cv_char_data_model=""
-   ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_char"
-   ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_short"
-   ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_int"
-   ac_cv_long_data_model=""
-   ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_int"
-   ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_long"
-   ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_voidp"
-   AC_MSG_CHECKING([data model])
-   case "$ac_cv_char_data_model/$ac_cv_long_data_model" in
-    122/242)     ac_cv_data_model="IP16"  ; n="standard 16bit machine" ;;
-    122/244)     ac_cv_data_model="LP32"  ; n="standard 32bit machine" ;;
-    122/*)       ac_cv_data_model="i16"   ; n="unusual int16 model" ;;
-    124/444)     ac_cv_data_model="ILP32" ; n="standard 32bit unixish" ;;
-    124/488)     ac_cv_data_model="LP64"  ; n="standard 64bit unixish" ;;
-    124/448)     ac_cv_data_model="LLP64" ; n="unusual 64bit unixish" ;;
-    124/*)       ac_cv_data_model="i32"   ; n="unusual int32 model" ;;
-    128/888)     ac_cv_data_model="ILP64" ; n="unusual 64bit numeric" ;;
-    128/*)       ac_cv_data_model="i64"   ; n="unusual int64 model" ;;
-    222/*2)      ac_cv_data_model="DSP16" ; n="strict 16bit dsptype" ;;
-    333/*3)      ac_cv_data_model="DSP24" ; n="strict 24bit dsptype" ;;
-    444/*4)      ac_cv_data_model="DSP32" ; n="strict 32bit dsptype" ;;
-    666/*6)      ac_cv_data_model="DSP48" ; n="strict 48bit dsptype" ;;
-    888/*8)      ac_cv_data_model="DSP64" ; n="strict 64bit dsptype" ;;
-    222/*|333/*|444/*|666/*|888/*) :
-                 ac_cv_data_model="iDSP"  ; n="unusual dsptype" ;;
-     *)          ac_cv_data_model="none"  ; n="very unusual model" ;;
-   esac
-   AC_MSG_RESULT([$ac_cv_data_model ($ac_cv_long_data_model, $n)])
-])
-
-dnl AX_CHECK_HEADER_STDINT_X([HEADERLIST][,ACTION-IF])
-AC_DEFUN([AX_CHECK_HEADER_STDINT_X],[
-AC_CACHE_CHECK([for stdint uintptr_t], [ac_cv_header_stdint_x],[
- ac_cv_header_stdint_x="" # the 1997 typedefs (inttypes.h)
-  AC_MSG_RESULT([(..)])
-  for i in m4_ifval([$1],[$1],[stdint.h inttypes.h sys/inttypes.h sys/types.h])
-  do
-   unset ac_cv_type_uintptr_t
-   unset ac_cv_type_uint64_t
-   AC_CHECK_TYPE(uintptr_t,[ac_cv_header_stdint_x=$i],continue,[#include <$i>])
-   AC_CHECK_TYPE(uint64_t,[and64="/uint64_t"],[and64=""],[#include<$i>])
-   m4_ifvaln([$2],[$2]) break
-  done
-  AC_MSG_CHECKING([for stdint uintptr_t])
- ])
-])
-
-AC_DEFUN([AX_CHECK_HEADER_STDINT_O],[
-AC_CACHE_CHECK([for stdint uint32_t], [ac_cv_header_stdint_o],[
- ac_cv_header_stdint_o="" # the 1995 typedefs (sys/inttypes.h)
-  AC_MSG_RESULT([(..)])
-  for i in m4_ifval([$1],[$1],[inttypes.h sys/inttypes.h sys/types.h stdint.h])
-  do
-   unset ac_cv_type_uint32_t
-   unset ac_cv_type_uint64_t
-   AC_CHECK_TYPE(uint32_t,[ac_cv_header_stdint_o=$i],continue,[#include <$i>])
-   AC_CHECK_TYPE(uint64_t,[and64="/uint64_t"],[and64=""],[#include<$i>])
-   m4_ifvaln([$2],[$2]) break
-   break;
-  done
-  AC_MSG_CHECKING([for stdint uint32_t])
- ])
-])
-
-AC_DEFUN([AX_CHECK_HEADER_STDINT_U],[
-AC_CACHE_CHECK([for stdint u_int32_t], [ac_cv_header_stdint_u],[
- ac_cv_header_stdint_u="" # the BSD typedefs (sys/types.h)
-  AC_MSG_RESULT([(..)])
-  for i in m4_ifval([$1],[$1],[sys/types.h inttypes.h sys/inttypes.h]) ; do
-   unset ac_cv_type_u_int32_t
-   unset ac_cv_type_u_int64_t
-   AC_CHECK_TYPE(u_int32_t,[ac_cv_header_stdint_u=$i],continue,[#include <$i>])
-   AC_CHECK_TYPE(u_int64_t,[and64="/u_int64_t"],[and64=""],[#include<$i>])
-   m4_ifvaln([$2],[$2]) break
-   break;
-  done
-  AC_MSG_CHECKING([for stdint u_int32_t])
- ])
-])
-
-AC_DEFUN([AX_CREATE_STDINT_H],
-[# ------ AX CREATE STDINT H -------------------------------------
-AC_MSG_CHECKING([for stdint types])
-ac_stdint_h=`echo ifelse($1, , _stdint.h, $1)`
-# try to shortcircuit - if the default include path of the compiler
-# can find a "stdint.h" header then we assume that all compilers can.
-AC_CACHE_VAL([ac_cv_header_stdint_t],[
-old_CXXFLAGS="$CXXFLAGS" ; CXXFLAGS=""
-old_CPPFLAGS="$CPPFLAGS" ; CPPFLAGS=""
-old_CFLAGS="$CFLAGS"     ; CFLAGS=""
-AC_TRY_COMPILE([#include <stdint.h>],[int_least32_t v = 0;],
-[ac_cv_stdint_result="(assuming C99 compatible system)"
- ac_cv_header_stdint_t="stdint.h"; ],
-[ac_cv_header_stdint_t=""])
-if test "$GCC" = "yes" && test ".$ac_cv_header_stdint_t" = "."; then
-CFLAGS="-std=c99"
-AC_TRY_COMPILE([#include <stdint.h>],[int_least32_t v = 0;],
-[AC_MSG_WARN(your GCC compiler has a defunct stdint.h for its default-mode)])
-fi
-CXXFLAGS="$old_CXXFLAGS"
-CPPFLAGS="$old_CPPFLAGS"
-CFLAGS="$old_CFLAGS" ])
-
-v="... $ac_cv_header_stdint_h"
-if test "$ac_stdint_h" = "stdint.h" ; then
- AC_MSG_RESULT([(are you sure you want them in ./stdint.h?)])
-elif test "$ac_stdint_h" = "inttypes.h" ; then
- AC_MSG_RESULT([(are you sure you want them in ./inttypes.h?)])
-elif test "_$ac_cv_header_stdint_t" = "_" ; then
- AC_MSG_RESULT([(putting them into $ac_stdint_h)$v])
-else
- ac_cv_header_stdint="$ac_cv_header_stdint_t"
- AC_MSG_RESULT([$ac_cv_header_stdint (shortcircuit)])
-fi
-
-if test "_$ac_cv_header_stdint_t" = "_" ; then # can not shortcircuit..
-
-dnl .....intro message done, now do a few system checks.....
-dnl btw, all old CHECK_TYPE macros do automatically "DEFINE" a type,
-dnl therefore we use the autoconf implementation detail CHECK_TYPE_NEW
-dnl instead that is triggered with 3 or more arguments (see types.m4)
-
-inttype_headers=`echo $2 | sed -e 's/,/ /g'`
-
-ac_cv_stdint_result="(no helpful system typedefs seen)"
-AX_CHECK_HEADER_STDINT_X(dnl
-   stdint.h inttypes.h sys/inttypes.h $inttype_headers,
-   ac_cv_stdint_result="(seen uintptr_t$and64 in $i)")
-
-if test "_$ac_cv_header_stdint_x" = "_" ; then
-AX_CHECK_HEADER_STDINT_O(dnl,
-   inttypes.h sys/inttypes.h stdint.h $inttype_headers,
-   ac_cv_stdint_result="(seen uint32_t$and64 in $i)")
-fi
-
-if test "_$ac_cv_header_stdint_x" = "_" ; then
-if test "_$ac_cv_header_stdint_o" = "_" ; then
-AX_CHECK_HEADER_STDINT_U(dnl,
-   sys/types.h inttypes.h sys/inttypes.h $inttype_headers,
-   ac_cv_stdint_result="(seen u_int32_t$and64 in $i)")
-fi fi
-
-dnl if there was no good C99 header file, do some typedef checks...
-if test "_$ac_cv_header_stdint_x" = "_" ; then
-   AC_MSG_CHECKING([for stdint datatype model])
-   AC_MSG_RESULT([(..)])
-   AX_CHECK_DATA_MODEL
-fi
-
-if test "_$ac_cv_header_stdint_x" != "_" ; then
-   ac_cv_header_stdint="$ac_cv_header_stdint_x"
-elif  test "_$ac_cv_header_stdint_o" != "_" ; then
-   ac_cv_header_stdint="$ac_cv_header_stdint_o"
-elif  test "_$ac_cv_header_stdint_u" != "_" ; then
-   ac_cv_header_stdint="$ac_cv_header_stdint_u"
-else
-   ac_cv_header_stdint="stddef.h"
-fi
-
-AC_MSG_CHECKING([for extra inttypes in chosen header])
-AC_MSG_RESULT([($ac_cv_header_stdint)])
-dnl see if int_least and int_fast types are present in _this_ header.
-unset ac_cv_type_int_least32_t
-unset ac_cv_type_int_fast32_t
-AC_CHECK_TYPE(int_least32_t,,,[#include <$ac_cv_header_stdint>])
-AC_CHECK_TYPE(int_fast32_t,,,[#include<$ac_cv_header_stdint>])
-AC_CHECK_TYPE(intmax_t,,,[#include <$ac_cv_header_stdint>])
-
-fi # shortcircut to system "stdint.h"
-# ------------------ PREPARE VARIABLES ------------------------------
-if test "$GCC" = "yes" ; then
-ac_cv_stdint_message="using gnu compiler "`$CC --version | head -1`
-else
-ac_cv_stdint_message="using $CC"
-fi
-
-AC_MSG_RESULT([make use of $ac_cv_header_stdint in $ac_stdint_h dnl
-$ac_cv_stdint_result])
-
-dnl -----------------------------------------------------------------
-# ----------------- DONE inttypes.h checks START header -------------
-AC_CONFIG_COMMANDS([$ac_stdint_h],[
-AC_MSG_NOTICE(creating $ac_stdint_h : $_ac_stdint_h)
-ac_stdint=$tmp/_stdint.h
-
-echo "#ifndef" $_ac_stdint_h >$ac_stdint
-echo "#define" $_ac_stdint_h "1" >>$ac_stdint
-echo "#ifndef" _GENERATED_STDINT_H >>$ac_stdint
-echo "#define" _GENERATED_STDINT_H '"'$PACKAGE $VERSION'"' >>$ac_stdint
-echo "/* generated $ac_cv_stdint_message */" >>$ac_stdint
-if test "_$ac_cv_header_stdint_t" != "_" ; then
-echo "#define _STDINT_HAVE_STDINT_H" "1" >>$ac_stdint
-echo "#include <stdint.h>" >>$ac_stdint
-echo "#endif" >>$ac_stdint
-echo "#endif" >>$ac_stdint
-else
-
-cat >>$ac_stdint <<STDINT_EOF
-
-/* ................... shortcircuit part ........................... */
-
-#if defined HAVE_STDINT_H || defined _STDINT_HAVE_STDINT_H
-#include <stdint.h>
-#else
-#include <stddef.h>
-
-/* .................... configured part ............................ */
-
-STDINT_EOF
-
-echo "/* whether we have a C99 compatible stdint header file */" >>$ac_stdint
-if test "_$ac_cv_header_stdint_x" != "_" ; then
-  ac_header="$ac_cv_header_stdint_x"
-  echo "#define _STDINT_HEADER_INTPTR" '"'"$ac_header"'"' >>$ac_stdint
-else
-  echo "/* #undef _STDINT_HEADER_INTPTR */" >>$ac_stdint
-fi
-
-echo "/* whether we have a C96 compatible inttypes header file */" >>$ac_stdint
-if  test "_$ac_cv_header_stdint_o" != "_" ; then
-  ac_header="$ac_cv_header_stdint_o"
-  echo "#define _STDINT_HEADER_UINT32" '"'"$ac_header"'"' >>$ac_stdint
-else
-  echo "/* #undef _STDINT_HEADER_UINT32 */" >>$ac_stdint
-fi
-
-echo "/* whether we have a BSD compatible inet types header */" >>$ac_stdint
-if  test "_$ac_cv_header_stdint_u" != "_" ; then
-  ac_header="$ac_cv_header_stdint_u"
-  echo "#define _STDINT_HEADER_U_INT32" '"'"$ac_header"'"' >>$ac_stdint
-else
-  echo "/* #undef _STDINT_HEADER_U_INT32 */" >>$ac_stdint
-fi
-
-echo "" >>$ac_stdint
-
-if test "_$ac_header" != "_" ; then if test "$ac_header" != "stddef.h" ; then
-  echo "#include <$ac_header>" >>$ac_stdint
-  echo "" >>$ac_stdint
-fi fi
-
-echo "/* which 64bit typedef has been found */" >>$ac_stdint
-if test "$ac_cv_type_uint64_t" = "yes" ; then
-echo "#define   _STDINT_HAVE_UINT64_T" "1"  >>$ac_stdint
-else
-echo "/* #undef _STDINT_HAVE_UINT64_T */" >>$ac_stdint
-fi
-if test "$ac_cv_type_u_int64_t" = "yes" ; then
-echo "#define   _STDINT_HAVE_U_INT64_T" "1"  >>$ac_stdint
-else
-echo "/* #undef _STDINT_HAVE_U_INT64_T */" >>$ac_stdint
-fi
-echo "" >>$ac_stdint
-
-echo "/* which type model has been detected */" >>$ac_stdint
-if test "_$ac_cv_char_data_model" != "_" ; then
-echo "#define   _STDINT_CHAR_MODEL" "$ac_cv_char_data_model" >>$ac_stdint
-echo "#define   _STDINT_LONG_MODEL" "$ac_cv_long_data_model" >>$ac_stdint
-else
-echo "/* #undef _STDINT_CHAR_MODEL // skipped */" >>$ac_stdint
-echo "/* #undef _STDINT_LONG_MODEL // skipped */" >>$ac_stdint
-fi
-echo "" >>$ac_stdint
-
-echo "/* whether int_least types were detected */" >>$ac_stdint
-if test "$ac_cv_type_int_least32_t" = "yes"; then
-echo "#define   _STDINT_HAVE_INT_LEAST32_T" "1"  >>$ac_stdint
-else
-echo "/* #undef _STDINT_HAVE_INT_LEAST32_T */" >>$ac_stdint
-fi
-echo "/* whether int_fast types were detected */" >>$ac_stdint
-if test "$ac_cv_type_int_fast32_t" = "yes"; then
-echo "#define   _STDINT_HAVE_INT_FAST32_T" "1" >>$ac_stdint
-else
-echo "/* #undef _STDINT_HAVE_INT_FAST32_T */" >>$ac_stdint
-fi
-echo "/* whether intmax_t type was detected */" >>$ac_stdint
-if test "$ac_cv_type_intmax_t" = "yes"; then
-echo "#define   _STDINT_HAVE_INTMAX_T" "1" >>$ac_stdint
-else
-echo "/* #undef _STDINT_HAVE_INTMAX_T */" >>$ac_stdint
-fi
-echo "" >>$ac_stdint
-
-  cat >>$ac_stdint <<STDINT_EOF
-/* .................... detections part ............................ */
-
-/* whether we need to define bitspecific types from compiler base types */
-#ifndef _STDINT_HEADER_INTPTR
-#ifndef _STDINT_HEADER_UINT32
-#ifndef _STDINT_HEADER_U_INT32
-#define _STDINT_NEED_INT_MODEL_T
-#else
-#define _STDINT_HAVE_U_INT_TYPES
-#endif
-#endif
-#endif
-
-#ifdef _STDINT_HAVE_U_INT_TYPES
-#undef _STDINT_NEED_INT_MODEL_T
-#endif
-
-#ifdef  _STDINT_CHAR_MODEL
-#if     _STDINT_CHAR_MODEL+0 == 122 || _STDINT_CHAR_MODEL+0 == 124
-#ifndef _STDINT_BYTE_MODEL
-#define _STDINT_BYTE_MODEL 12
-#endif
-#endif
-#endif
-
-#ifndef _STDINT_HAVE_INT_LEAST32_T
-#define _STDINT_NEED_INT_LEAST_T
-#endif
-
-#ifndef _STDINT_HAVE_INT_FAST32_T
-#define _STDINT_NEED_INT_FAST_T
-#endif
-
-#ifndef _STDINT_HEADER_INTPTR
-#define _STDINT_NEED_INTPTR_T
-#ifndef _STDINT_HAVE_INTMAX_T
-#define _STDINT_NEED_INTMAX_T
-#endif
-#endif
-
-
-/* .................... definition part ............................ */
-
-/* some system headers have good uint64_t */
-#ifndef _HAVE_UINT64_T
-#if     defined _STDINT_HAVE_UINT64_T  || defined HAVE_UINT64_T
-#define _HAVE_UINT64_T
-#elif   defined _STDINT_HAVE_U_INT64_T || defined HAVE_U_INT64_T
-#define _HAVE_UINT64_T
-typedef u_int64_t uint64_t;
-#endif
-#endif
-
-#ifndef _HAVE_UINT64_T
-/* .. here are some common heuristics using compiler runtime specifics */
-#if defined __STDC_VERSION__ && defined __STDC_VERSION__ >= 199901L
-#define _HAVE_UINT64_T
-#define _HAVE_LONGLONG_UINT64_T
-typedef long long int64_t;
-typedef unsigned long long uint64_t;
-
-#elif !defined __STRICT_ANSI__
-#if defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__
-#define _HAVE_UINT64_T
-typedef __int64 int64_t;
-typedef unsigned __int64 uint64_t;
-
-#elif defined __GNUC__ || defined __MWERKS__ || defined __ELF__
-/* note: all ELF-systems seem to have loff-support which needs 64-bit */
-#if !defined _NO_LONGLONG
-#define _HAVE_UINT64_T
-#define _HAVE_LONGLONG_UINT64_T
-typedef long long int64_t;
-typedef unsigned long long uint64_t;
-#endif
-
-#elif defined __alpha || (defined __mips && defined _ABIN32)
-#if !defined _NO_LONGLONG
-typedef long int64_t;
-typedef unsigned long uint64_t;
-#endif
-  /* compiler/cpu type to define int64_t */
-#endif
-#endif
-#endif
-
-#if defined _STDINT_HAVE_U_INT_TYPES
-/* int8_t int16_t int32_t defined by inet code, redeclare the u_intXX types */
-typedef u_int8_t uint8_t;
-typedef u_int16_t uint16_t;
-typedef u_int32_t uint32_t;
-
-/* glibc compatibility */
-#ifndef __int8_t_defined
-#define __int8_t_defined
-#endif
-#endif
-
-#ifdef _STDINT_NEED_INT_MODEL_T
-/* we must guess all the basic types. Apart from byte-adressable system, */
-/* there a few 32-bit-only dsp-systems that we guard with BYTE_MODEL 8-} */
-/* (btw, those nibble-addressable systems are way off, or so we assume) */
-
-dnl   /* have a look at "64bit and data size neutrality" at */
-dnl   /* http://unix.org/version2/whatsnew/login_64bit.html */
-dnl   /* (the shorthand "ILP" types always have a "P" part) */
-
-#if defined _STDINT_BYTE_MODEL
-#if _STDINT_LONG_MODEL+0 == 242
-/* 2:4:2 =  IP16 = a normal 16-bit system                */
-typedef unsigned char   uint8_t;
-typedef unsigned short  uint16_t;
-typedef unsigned long   uint32_t;
-#ifndef __int8_t_defined
-#define __int8_t_defined
-typedef          char    int8_t;
-typedef          short   int16_t;
-typedef          long    int32_t;
-#endif
-#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL == 444
-/* 2:4:4 =  LP32 = a 32-bit system derived from a 16-bit */
-/* 4:4:4 = ILP32 = a normal 32-bit system                */
-typedef unsigned char   uint8_t;
-typedef unsigned short  uint16_t;
-typedef unsigned int    uint32_t;
-#ifndef __int8_t_defined
-#define __int8_t_defined
-typedef          char    int8_t;
-typedef          short   int16_t;
-typedef          int     int32_t;
-#endif
-#elif _STDINT_LONG_MODEL+0 == 484 || _STDINT_LONG_MODEL+0 == 488
-/* 4:8:4 =  IP32 = a 32-bit system prepared for 64-bit    */
-/* 4:8:8 =  LP64 = a normal 64-bit system                 */
-typedef unsigned char   uint8_t;
-typedef unsigned short  uint16_t;
-typedef unsigned int    uint32_t;
-#ifndef __int8_t_defined
-#define __int8_t_defined
-typedef          char    int8_t;
-typedef          short   int16_t;
-typedef          int     int32_t;
-#endif
-/* this system has a "long" of 64bit */
-#ifndef _HAVE_UINT64_T
-#define _HAVE_UINT64_T
-typedef unsigned long   uint64_t;
-typedef          long    int64_t;
-#endif
-#elif _STDINT_LONG_MODEL+0 == 448
-/*      LLP64   a 64-bit system derived from a 32-bit system */
-typedef unsigned char   uint8_t;
-typedef unsigned short  uint16_t;
-typedef unsigned int    uint32_t;
-#ifndef __int8_t_defined
-#define __int8_t_defined
-typedef          char    int8_t;
-typedef          short   int16_t;
-typedef          int     int32_t;
-#endif
-/* assuming the system has a "long long" */
-#ifndef _HAVE_UINT64_T
-#define _HAVE_UINT64_T
-#define _HAVE_LONGLONG_UINT64_T
-typedef unsigned long long uint64_t;
-typedef          long long  int64_t;
-#endif
-#else
-#define _STDINT_NO_INT32_T
-#endif
-#else
-#define _STDINT_NO_INT8_T
-#define _STDINT_NO_INT32_T
-#endif
-#endif
-
-/*
- * quote from SunOS-5.8 sys/inttypes.h:
- * Use at your own risk.  As of February 1996, the committee is squarely
- * behind the fixed sized types; the "least" and "fast" types are still being
- * discussed.  The probability that the "fast" types may be removed before
- * the standard is finalized is high enough that they are not currently
- * implemented.
- */
-
-#if defined _STDINT_NEED_INT_LEAST_T
-typedef  int8_t    int_least8_t;
-typedef  int16_t   int_least16_t;
-typedef  int32_t   int_least32_t;
-#ifdef _HAVE_UINT64_T
-typedef  int64_t   int_least64_t;
-#endif
-
-typedef uint8_t   uint_least8_t;
-typedef uint16_t  uint_least16_t;
-typedef uint32_t  uint_least32_t;
-#ifdef _HAVE_UINT64_T
-typedef uint64_t  uint_least64_t;
-#endif
-  /* least types */
-#endif
-
-#if defined _STDINT_NEED_INT_FAST_T
-typedef  int8_t    int_fast8_t;
-typedef  int       int_fast16_t;
-typedef  int32_t   int_fast32_t;
-#ifdef _HAVE_UINT64_T
-typedef  int64_t   int_fast64_t;
-#endif
-
-typedef uint8_t   uint_fast8_t;
-typedef unsigned  uint_fast16_t;
-typedef uint32_t  uint_fast32_t;
-#ifdef _HAVE_UINT64_T
-typedef uint64_t  uint_fast64_t;
-#endif
-  /* fast types */
-#endif
-
-#ifdef _STDINT_NEED_INTMAX_T
-#ifdef _HAVE_UINT64_T
-typedef  int64_t       intmax_t;
-typedef uint64_t      uintmax_t;
-#else
-typedef          long  intmax_t;
-typedef unsigned long uintmax_t;
-#endif
-#endif
-
-#ifdef _STDINT_NEED_INTPTR_T
-#ifndef __intptr_t_defined
-#define __intptr_t_defined
-/* we encourage using "long" to store pointer values, never use "int" ! */
-#if   _STDINT_LONG_MODEL+0 == 242 || _STDINT_LONG_MODEL+0 == 484
-typedef  unsigned int   uintptr_t;
-typedef           int    intptr_t;
-#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL+0 == 444
-typedef  unsigned long  uintptr_t;
-typedef           long   intptr_t;
-#elif _STDINT_LONG_MODEL+0 == 448 && defined _HAVE_UINT64_T
-typedef        uint64_t uintptr_t;
-typedef         int64_t  intptr_t;
-#else /* matches typical system types ILP32 and LP64 - but not IP16 or LLP64 */
-typedef  unsigned long  uintptr_t;
-typedef           long   intptr_t;
-#endif
-#endif
-#endif
-
-/* The ISO C99 standard specifies that in C++ implementations these
-   should only be defined if explicitly requested.  */
-#if !defined __cplusplus || defined __STDC_CONSTANT_MACROS
-#ifndef UINT32_C
-
-/* Signed.  */
-# define INT8_C(c)      c
-# define INT16_C(c)     c
-# define INT32_C(c)     c
-# ifdef _HAVE_LONGLONG_UINT64_T
-#  define INT64_C(c)    c ## L
-# else
-#  define INT64_C(c)    c ## LL
-# endif
-
-/* Unsigned.  */
-# define UINT8_C(c)     c ## U
-# define UINT16_C(c)    c ## U
-# define UINT32_C(c)    c ## U
-# ifdef _HAVE_LONGLONG_UINT64_T
-#  define UINT64_C(c)   c ## UL
-# else
-#  define UINT64_C(c)   c ## ULL
-# endif
-
-/* Maximal type.  */
-# ifdef _HAVE_LONGLONG_UINT64_T
-#  define INTMAX_C(c)   c ## L
-#  define UINTMAX_C(c)  c ## UL
-# else
-#  define INTMAX_C(c)   c ## LL
-#  define UINTMAX_C(c)  c ## ULL
-# endif
-
-  /* literalnumbers */
-#endif
-#endif
-
-/* These limits are merily those of a two complement byte-oriented system */
-
-/* Minimum of signed integral types.  */
-# define INT8_MIN               (-128)
-# define INT16_MIN              (-32767-1)
-# define INT32_MIN              (-2147483647-1)
-#ifndef INT64_MIN
-# define INT64_MIN              (-__INT64_C(9223372036854775807)-1)
-#endif
-/* Maximum of signed integral types.  */
-# define INT8_MAX               (127)
-# define INT16_MAX              (32767)
-# define INT32_MAX              (2147483647)
-#ifndef INT64_MAX
-# define INT64_MAX              (__INT64_C(9223372036854775807))
-#endif
-
-/* Maximum of unsigned integral types.  */
-#ifndef UINT8_MAX
-# define UINT8_MAX              (255)
-#endif
-#ifndef UINT16_MAX
-# define UINT16_MAX             (65535)
-#endif
-# define UINT32_MAX             (4294967295U)
-#ifndef UINT64_MAX
-# define UINT64_MAX             (__UINT64_C(18446744073709551615))
-#endif
-
-/* Minimum of signed integral types having a minimum size.  */
-# define INT_LEAST8_MIN         INT8_MIN
-# define INT_LEAST16_MIN        INT16_MIN
-# define INT_LEAST32_MIN        INT32_MIN
-# define INT_LEAST64_MIN        INT64_MIN
-/* Maximum of signed integral types having a minimum size.  */
-# define INT_LEAST8_MAX         INT8_MAX
-# define INT_LEAST16_MAX        INT16_MAX
-# define INT_LEAST32_MAX        INT32_MAX
-# define INT_LEAST64_MAX        INT64_MAX
-
-/* Maximum of unsigned integral types having a minimum size.  */
-# define UINT_LEAST8_MAX        UINT8_MAX
-# define UINT_LEAST16_MAX       UINT16_MAX
-# define UINT_LEAST32_MAX       UINT32_MAX
-# define UINT_LEAST64_MAX       UINT64_MAX
-
-  /* shortcircuit*/
-#endif
-  /* once */
-#endif
-#endif
-STDINT_EOF
-fi
-    if cmp -s $ac_stdint_h $ac_stdint 2>/dev/null; then
-      AC_MSG_NOTICE([$ac_stdint_h is unchanged])
-    else
-      ac_dir=`AS_DIRNAME(["$ac_stdint_h"])`
-      AS_MKDIR_P(["$ac_dir"])
-      rm -f $ac_stdint_h
-      mv $ac_stdint $ac_stdint_h
-    fi
-],[# variables for create stdint.h replacement
-PACKAGE="$PACKAGE"
-VERSION="$VERSION"
-ac_stdint_h="$ac_stdint_h"
-_ac_stdint_h=AS_TR_CPP(_$PACKAGE-$ac_stdint_h)
-ac_cv_stdint_message="$ac_cv_stdint_message"
-ac_cv_header_stdint_t="$ac_cv_header_stdint_t"
-ac_cv_header_stdint_x="$ac_cv_header_stdint_x"
-ac_cv_header_stdint_o="$ac_cv_header_stdint_o"
-ac_cv_header_stdint_u="$ac_cv_header_stdint_u"
-ac_cv_type_uint64_t="$ac_cv_type_uint64_t"
-ac_cv_type_u_int64_t="$ac_cv_type_u_int64_t"
-ac_cv_char_data_model="$ac_cv_char_data_model"
-ac_cv_long_data_model="$ac_cv_long_data_model"
-ac_cv_type_int_least32_t="$ac_cv_type_int_least32_t"
-ac_cv_type_int_fast32_t="$ac_cv_type_int_fast32_t"
-ac_cv_type_intmax_t="$ac_cv_type_intmax_t"
-])
-])
diff --git a/cloog-0.16.3/isl/m4/ax_detect_git_head.m4 b/cloog-0.16.3/isl/m4/ax_detect_git_head.m4
deleted file mode 100644
index d585983..0000000
--- a/cloog-0.16.3/isl/m4/ax_detect_git_head.m4
+++ /dev/null
@@ -1,27 +0,0 @@
-AC_DEFUN([AX_DETECT_GIT_HEAD], [
-	AC_SUBST(GIT_HEAD_ID)
-	AC_SUBST(GIT_HEAD)
-	AC_SUBST(GIT_HEAD_VERSION)
-	if test -f $srcdir/.git/HEAD; then
-		GIT_HEAD="$srcdir/.git/index"
-		GIT_REPO="$srcdir/.git"
-		GIT_HEAD_ID=`GIT_DIR=$GIT_REPO git describe`
-	elif test -f $srcdir/GIT_HEAD_ID; then
-		GIT_HEAD_ID=`cat $srcdir/GIT_HEAD_ID`
-	else
-		mysrcdir=`(cd $srcdir; pwd)`
-		head=`basename $mysrcdir | sed -e 's/.*-//'`
-		head2=`echo $head | sed -e 's/[^0-9a-f]//'`
-		head3=`echo $head2 | sed -e 's/........................................//'`
-		if test "x$head3" = "x" -a "x$head" = "x$head2"; then
-			GIT_HEAD_ID="$head"
-		else
-			GIT_HEAD_ID="UNKNOWN"
-		fi
-	fi
-	if test -z "$GIT_REPO" ; then
-		GIT_HEAD_VERSION="$GIT_HEAD_ID"
-	else
-	    GIT_HEAD_VERSION="\`GIT_DIR=$GIT_REPO git describe\`"
-	fi
-])
diff --git a/cloog-0.16.3/isl/m4/ax_gcc_archflag.m4 b/cloog-0.16.3/isl/m4/ax_gcc_archflag.m4
deleted file mode 100644
index dedeef4..0000000
--- a/cloog-0.16.3/isl/m4/ax_gcc_archflag.m4
+++ /dev/null
@@ -1,213 +0,0 @@
-# ===========================================================================
-#         http://www.nongnu.org/autoconf-archive/ax_gcc_archflag.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_GCC_ARCHFLAG([PORTABLE?], [ACTION-SUCCESS], [ACTION-FAILURE])
-#
-# DESCRIPTION
-#
-#   This macro tries to guess the "native" arch corresponding to the target
-#   architecture for use with gcc's -march=arch or -mtune=arch flags. If
-#   found, the cache variable $ax_cv_gcc_archflag is set to this flag and
-#   ACTION-SUCCESS is executed; otherwise $ax_cv_gcc_archflag is is set to
-#   "unknown" and ACTION-FAILURE is executed. The default ACTION-SUCCESS is
-#   to add $ax_cv_gcc_archflag to the end of $CFLAGS.
-#
-#   PORTABLE? should be either [yes] (default) or [no]. In the former case,
-#   the flag is set to -mtune (or equivalent) so that the architecture is
-#   only used for tuning, but the instruction set used is still portable. In
-#   the latter case, the flag is set to -march (or equivalent) so that
-#   architecture-specific instructions are enabled.
-#
-#   The user can specify --with-gcc-arch=<arch> in order to override the
-#   macro's choice of architecture, or --without-gcc-arch to disable this.
-#
-#   When cross-compiling, or if $CC is not gcc, then ACTION-FAILURE is
-#   called unless the user specified --with-gcc-arch manually.
-#
-#   Requires macros: AX_CHECK_COMPILER_FLAGS, AX_GCC_X86_CPUID
-#
-#   (The main emphasis here is on recent CPUs, on the principle that doing
-#   high-performance computing on old hardware is uncommon.)
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
-#   Copyright (c) 2008 Matteo Frigo
-#
-#   This program is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation, either version 3 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_GCC_ARCHFLAG],
-[AC_REQUIRE([AC_PROG_CC])
-AC_REQUIRE([AC_CANONICAL_HOST])
-
-AC_ARG_WITH(gcc-arch, [AC_HELP_STRING([--with-gcc-arch=<arch>], [use architecture <arch> for gcc -march/-mtune, instead of guessing])],
-	ax_gcc_arch=$withval, ax_gcc_arch=yes)
-
-AC_MSG_CHECKING([for gcc architecture flag])
-AC_MSG_RESULT([])
-AC_CACHE_VAL(ax_cv_gcc_archflag,
-[
-ax_cv_gcc_archflag="unknown"
-
-if test "$GCC" = yes; then
-
-if test "x$ax_gcc_arch" = xyes; then
-ax_gcc_arch=""
-if test "$cross_compiling" = no; then
-case $host_cpu in
-  i[[3456]]86*|x86_64*) # use cpuid codes, in part from x86info-1.7 by D. Jones
-     AX_GCC_X86_CPUID(0)
-     AX_GCC_X86_CPUID(1)
-     case $ax_cv_gcc_x86_cpuid_0 in
-       *:756e6547:*:*) # Intel
-          case $ax_cv_gcc_x86_cpuid_1 in
-	    *5[[48]]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;;
-	    *5??:*:*:*) ax_gcc_arch=pentium ;;
-	    *6[[3456]]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
-	    *6a?:*[[01]]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
-	    *6a?:*[[234]]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
-	    *6[[9d]]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;;
-	    *6[[78b]]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
-	    *6??:*:*:*) ax_gcc_arch=pentiumpro ;;
-            *f3[[347]]:*:*:*|*f4[1347]:*:*:*)
-		case $host_cpu in
-                  x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;;
-                  *) ax_gcc_arch="prescott pentium4 pentiumpro" ;;
-                esac ;;
-            *f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";;
-          esac ;;
-       *:68747541:*:*) # AMD
-          case $ax_cv_gcc_x86_cpuid_1 in
-	    *5[[67]]?:*:*:*) ax_gcc_arch=k6 ;;
-	    *5[[8d]]?:*:*:*) ax_gcc_arch="k6-2 k6" ;;
-	    *5[[9]]?:*:*:*) ax_gcc_arch="k6-3 k6" ;;
-	    *60?:*:*:*) ax_gcc_arch=k7 ;;
-	    *6[[12]]?:*:*:*) ax_gcc_arch="athlon k7" ;;
-	    *6[[34]]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;;
-	    *67?:*:*:*) ax_gcc_arch="athlon-4 athlon k7" ;;
-	    *6[[68a]]?:*:*:*)
-	       AX_GCC_X86_CPUID(0x80000006) # L2 cache size
-	       case $ax_cv_gcc_x86_cpuid_0x80000006 in
-                 *:*:*[[1-9a-f]]??????:*) # (L2 = ecx >> 16) >= 256
-			ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;;
-                 *) ax_gcc_arch="athlon-4 athlon k7" ;;
-	       esac ;;
-	    *f[[4cef8b]]?:*:*:*) ax_gcc_arch="athlon64 k8" ;;
-	    *f5?:*:*:*) ax_gcc_arch="opteron k8" ;;
-	    *f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;;
-	    *f??:*:*:*) ax_gcc_arch="k8" ;;
-          esac ;;
-	*:746e6543:*:*) # IDT
-	   case $ax_cv_gcc_x86_cpuid_1 in
-	     *54?:*:*:*) ax_gcc_arch=winchip-c6 ;;
-	     *58?:*:*:*) ax_gcc_arch=winchip2 ;;
-	     *6[[78]]?:*:*:*) ax_gcc_arch=c3 ;;
-	     *69?:*:*:*) ax_gcc_arch="c3-2 c3" ;;
-	   esac ;;
-     esac
-     if test x"$ax_gcc_arch" = x; then # fallback
-	case $host_cpu in
-	  i586*) ax_gcc_arch=pentium ;;
-	  i686*) ax_gcc_arch=pentiumpro ;;
-        esac
-     fi
-     ;;
-
-  sparc*)
-     AC_PATH_PROG([PRTDIAG], [prtdiag], [prtdiag], [$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/])
-     cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null`
-     cputype=`echo "$cputype" | tr -d ' -' |tr $as_cr_LETTERS $as_cr_letters`
-     case $cputype in
-         *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;;
-         *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;;
-         *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;;
-         *supersparc*|*tms390z5[[05]]*) ax_gcc_arch="supersparc v8" ;;
-         *hypersparc*|*rt62[[056]]*) ax_gcc_arch="hypersparc v8" ;;
-         *cypress*) ax_gcc_arch=cypress ;;
-     esac ;;
-
-  alphaev5) ax_gcc_arch=ev5 ;;
-  alphaev56) ax_gcc_arch=ev56 ;;
-  alphapca56) ax_gcc_arch="pca56 ev56" ;;
-  alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;;
-  alphaev6) ax_gcc_arch=ev6 ;;
-  alphaev67) ax_gcc_arch=ev67 ;;
-  alphaev68) ax_gcc_arch="ev68 ev67" ;;
-  alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;;
-  alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;;
-  alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;;
-
-  powerpc*)
-     cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null`
-     cputype=`echo $cputype | sed -e 's/ppc//g;s/ *//g'`
-     case $cputype in
-       *750*) ax_gcc_arch="750 G3" ;;
-       *740[[0-9]]*) ax_gcc_arch="$cputype 7400 G4" ;;
-       *74[[4-5]][[0-9]]*) ax_gcc_arch="$cputype 7450 G4" ;;
-       *74[[0-9]][[0-9]]*) ax_gcc_arch="$cputype G4" ;;
-       *970*) ax_gcc_arch="970 G5 power4";;
-       *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";;
-       *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";;
-       603ev|8240) ax_gcc_arch="$cputype 603e 603";;
-       *) ax_gcc_arch=$cputype ;;
-     esac
-     ax_gcc_arch="$ax_gcc_arch powerpc"
-     ;;
-esac
-fi # not cross-compiling
-fi # guess arch
-
-if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then
-for arch in $ax_gcc_arch; do
-  if test "x[]m4_default([$1],yes)" = xyes; then # if we require portable code
-    flags="-mtune=$arch"
-    # -mcpu=$arch and m$arch generate nonportable code on every arch except
-    # x86.  And some other arches (e.g. Alpha) don't accept -mtune.  Grrr.
-    case $host_cpu in i*86|x86_64*) flags="$flags -mcpu=$arch -m$arch";; esac
-  else
-    flags="-march=$arch -mcpu=$arch -m$arch"
-  fi
-  for flag in $flags; do
-    AX_CHECK_COMPILER_FLAGS($flag, [ax_cv_gcc_archflag=$flag; break])
-  done
-  test "x$ax_cv_gcc_archflag" = xunknown || break
-done
-fi
-
-fi # $GCC=yes
-])
-AC_MSG_CHECKING([for gcc architecture flag])
-AC_MSG_RESULT($ax_cv_gcc_archflag)
-if test "x$ax_cv_gcc_archflag" = xunknown; then
-  m4_default([$3],:)
-else
-  m4_default([$2], [CFLAGS="$CFLAGS $ax_cv_gcc_archflag"])
-fi
-])
diff --git a/cloog-0.16.3/isl/m4/ax_gcc_warn_unused_result.m4 b/cloog-0.16.3/isl/m4/ax_gcc_warn_unused_result.m4
deleted file mode 100644
index a957f8f..0000000
--- a/cloog-0.16.3/isl/m4/ax_gcc_warn_unused_result.m4
+++ /dev/null
@@ -1,56 +0,0 @@
-# ===========================================================================
-#    http://www.nongnu.org/autoconf-archive/ax_gcc_warn_unused_result.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_GCC_WARN_UNUSED_RESULT
-#
-# DESCRIPTION
-#
-#   The macro will compile a test program to see whether the compiler does
-#   understand the per-function postfix pragma.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
-#
-#   This program is free software; you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation; either version 2 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_GCC_WARN_UNUSED_RESULT],[dnl
-AC_CACHE_CHECK(
- [whether the compiler supports function __attribute__((__warn_unused_result__))],
- ax_cv_gcc_warn_unused_result,[
- AC_TRY_COMPILE([__attribute__((__warn_unused_result__))
- int f(int i) { return i; }],
- [],
- ax_cv_gcc_warn_unused_result=yes, ax_cv_gcc_warn_unused_result=no)])
- if test "$ax_cv_gcc_warn_unused_result" = yes; then
-   AC_DEFINE([GCC_WARN_UNUSED_RESULT],[__attribute__((__warn_unused_result__))],
-    [most gcc compilers know a function __attribute__((__warn_unused_result__))])
- fi
-])
diff --git a/cloog-0.16.3/isl/m4/ax_gcc_x86_cpuid.m4 b/cloog-0.16.3/isl/m4/ax_gcc_x86_cpuid.m4
deleted file mode 100644
index 5420b09..0000000
--- a/cloog-0.16.3/isl/m4/ax_gcc_x86_cpuid.m4
+++ /dev/null
@@ -1,77 +0,0 @@
-# ===========================================================================
-#        http://www.nongnu.org/autoconf-archive/ax_gcc_x86_cpuid.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_GCC_X86_CPUID(OP)
-#
-# DESCRIPTION
-#
-#   On Pentium and later x86 processors, with gcc or a compiler that has a
-#   compatible syntax for inline assembly instructions, run a small program
-#   that executes the cpuid instruction with input OP. This can be used to
-#   detect the CPU type.
-#
-#   On output, the values of the eax, ebx, ecx, and edx registers are stored
-#   as hexadecimal strings as "eax:ebx:ecx:edx" in the cache variable
-#   ax_cv_gcc_x86_cpuid_OP.
-#
-#   If the cpuid instruction fails (because you are running a
-#   cross-compiler, or because you are not using gcc, or because you are on
-#   a processor that doesn't have this instruction), ax_cv_gcc_x86_cpuid_OP
-#   is set to the string "unknown".
-#
-#   This macro mainly exists to be used in AX_GCC_ARCHFLAG.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
-#   Copyright (c) 2008 Matteo Frigo
-#
-#   This program is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation, either version 3 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_GCC_X86_CPUID],
-[AC_REQUIRE([AC_PROG_CC])
-AC_LANG_PUSH([C])
-AC_CACHE_CHECK(for x86 cpuid $1 output, ax_cv_gcc_x86_cpuid_$1,
- [AC_RUN_IFELSE([AC_LANG_PROGRAM([#include <stdio.h>], [
-     int op = $1, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-])],
-     [ax_cv_gcc_x86_cpuid_$1=`cat conftest_cpuid`; rm -f conftest_cpuid],
-     [ax_cv_gcc_x86_cpuid_$1=unknown; rm -f conftest_cpuid],
-     [ax_cv_gcc_x86_cpuid_$1=unknown])])
-AC_LANG_POP([C])
-])
diff --git a/cloog-0.16.3/isl/m4/ax_set_warning_flags.m4 b/cloog-0.16.3/isl/m4/ax_set_warning_flags.m4
deleted file mode 100644
index c64ad7d..0000000
--- a/cloog-0.16.3/isl/m4/ax_set_warning_flags.m4
+++ /dev/null
@@ -1,17 +0,0 @@
-dnl Add a set of flags to WARNING_FLAGS, that enable compiler warnings for
-dnl isl. The warnings that are enabled vary with the compiler and only include
-dnl warnings that did not trigger at the time of adding these flags.
-AC_DEFUN([AX_SET_WARNING_FLAGS],[dnl
-	AX_COMPILER_VENDOR
-
-	WARNING_FLAGS=""
-
-	if test "${ax_cv_c_compiler_vendor}" = "clang"; then
-		dnl isl is at the moment clean of -Wall warnings.  If clang adds
-		dnl new warnings to -Wall which cause false positives, the
-		dnl specific warning types will be disabled explicitally (by
-		dnl adding for example -Wno-return-type). To temporarily disable
-		dnl all warnings run configure with CFLAGS=-Wno-all.
-		WARNING_FLAGS="-Wall"
-	fi
-])
diff --git a/cloog-0.16.3/isl/m4/ax_submodule.m4 b/cloog-0.16.3/isl/m4/ax_submodule.m4
deleted file mode 100644
index 7cf8995..0000000
--- a/cloog-0.16.3/isl/m4/ax_submodule.m4
+++ /dev/null
@@ -1,71 +0,0 @@
-AC_DEFUN([AX_SUBMODULE],
-[
-
-m4_if(m4_bregexp($2,|,choice),choice,
-	[AC_ARG_WITH($1,
-		[AS_HELP_STRING([--with-$1=$2],
-				[Which $1 to use [default=$3]])])])
-case "system" in
-$2)
-	AC_ARG_WITH($1_prefix,
-		    [AS_HELP_STRING([--with-$1-prefix=DIR],
-				    [Prefix of $1 installation])])
-	AC_ARG_WITH($1_exec_prefix,
-		    [AS_HELP_STRING([--with-$1-exec-prefix=DIR],
-				    [Exec prefix of $1 installation])])
-esac
-m4_if(m4_bregexp($2,build,build),build,
-	[AC_ARG_WITH($1_builddir,
-		[AS_HELP_STRING([--with-$1-builddir=DIR],
-				[Location of $1 builddir])])])
-if test "x$with_$1_prefix" != "x" -a "x$with_$1_exec_prefix" = "x"; then
-	with_$1_exec_prefix=$with_$1_prefix
-fi
-if test "x$with_$1_prefix" != "x" -o "x$with_$1_exec_prefix" != "x"; then
-	if test "x$with_$1" != "x" -a "x$with_$1" != "xyes" -a "x$with_$1" != "xsystem"; then
-		AC_MSG_ERROR([Setting $with_$1_prefix implies use of system $1])
-	fi
-	with_$1="system"
-fi
-if test "x$with_$1_builddir" != "x"; then
-	if test "x$with_$1" != "x" -a "x$with_$1" != "xyes" -a "x$with_$1" != "xbuild"; then
-		AC_MSG_ERROR([Setting $with_$1_builddir implies use of build $1])
-	fi
-	with_$1="build"
-	$1_srcdir=`echo @abs_srcdir@ | $with_$1_builddir/config.status --file=-`
-	AC_MSG_NOTICE($1 sources in $$1_srcdir)
-fi
-if test "x$with_$1_exec_prefix" != "x"; then
-	export PKG_CONFIG_PATH="$with_$1_exec_prefix/lib/pkgconfig${PKG_CONFIG_PATH+:$PKG_CONFIG_PATH}"
-fi
-case "$with_$1" in
-$2)
-	;;
-*)
-	case "$3" in
-	bundled)
-		if test -d $srcdir/.git -a \
-			-d $srcdir/$1 -a \
-			! -d $srcdir/$1/.git; then
-			AC_MSG_WARN([git repo detected, but submodule $1 not initialized])
-			AC_MSG_WARN([You may want to run])
-			AC_MSG_WARN([	git submodule init])
-			AC_MSG_WARN([	git submodule update])
-			AC_MSG_WARN([	sh autogen.sh])
-		fi
-		if test -f $srcdir/$1/configure; then
-			with_$1="bundled"
-		else
-			with_$1="no"
-		fi
-		;;
-	*)
-		with_$1="$3"
-		;;
-	esac
-	;;
-esac
-AC_MSG_CHECKING([which $1 to use])
-AC_MSG_RESULT($with_$1)
-
-])
diff --git a/cloog-0.16.3/isl/m4/libtool.m4 b/cloog-0.16.3/isl/m4/libtool.m4
deleted file mode 100644
index 22924a8..0000000
--- a/cloog-0.16.3/isl/m4/libtool.m4
+++ /dev/null
@@ -1,7437 +0,0 @@
-# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
-#
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010 Free Software Foundation,
-#                 Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-m4_define([_LT_COPYING], [dnl
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010 Free Software Foundation,
-#                 Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-])
-
-# serial 57 LT_INIT
-
-
-# LT_PREREQ(VERSION)
-# ------------------
-# Complain and exit if this libtool version is less that VERSION.
-m4_defun([LT_PREREQ],
-[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
-       [m4_default([$3],
-		   [m4_fatal([Libtool version $1 or higher is required],
-		             63)])],
-       [$2])])
-
-
-# _LT_CHECK_BUILDDIR
-# ------------------
-# Complain if the absolute build directory name contains unusual characters
-m4_defun([_LT_CHECK_BUILDDIR],
-[case `pwd` in
-  *\ * | *\	*)
-    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
-esac
-])
-
-
-# LT_INIT([OPTIONS])
-# ------------------
-AC_DEFUN([LT_INIT],
-[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
-AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
-AC_BEFORE([$0], [LT_LANG])dnl
-AC_BEFORE([$0], [LT_OUTPUT])dnl
-AC_BEFORE([$0], [LTDL_INIT])dnl
-m4_require([_LT_CHECK_BUILDDIR])dnl
-
-dnl Autoconf doesn't catch unexpanded LT_ macros by default:
-m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
-m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
-dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
-dnl unless we require an AC_DEFUNed macro:
-AC_REQUIRE([LTOPTIONS_VERSION])dnl
-AC_REQUIRE([LTSUGAR_VERSION])dnl
-AC_REQUIRE([LTVERSION_VERSION])dnl
-AC_REQUIRE([LTOBSOLETE_VERSION])dnl
-m4_require([_LT_PROG_LTMAIN])dnl
-
-_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
-
-dnl Parse OPTIONS
-_LT_SET_OPTIONS([$0], [$1])
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-AC_SUBST(LIBTOOL)dnl
-
-_LT_SETUP
-
-# Only expand once:
-m4_define([LT_INIT])
-])# LT_INIT
-
-# Old names:
-AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
-AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
-dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
-
-
-# _LT_CC_BASENAME(CC)
-# -------------------
-# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
-m4_defun([_LT_CC_BASENAME],
-[for cc_temp in $1""; do
-  case $cc_temp in
-    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
-    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-])
-
-
-# _LT_FILEUTILS_DEFAULTS
-# ----------------------
-# It is okay to use these file commands and assume they have been set
-# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
-m4_defun([_LT_FILEUTILS_DEFAULTS],
-[: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-])# _LT_FILEUTILS_DEFAULTS
-
-
-# _LT_SETUP
-# ---------
-m4_defun([_LT_SETUP],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
-AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
-
-_LT_DECL([], [host_alias], [0], [The host system])dnl
-_LT_DECL([], [host], [0])dnl
-_LT_DECL([], [host_os], [0])dnl
-dnl
-_LT_DECL([], [build_alias], [0], [The build system])dnl
-_LT_DECL([], [build], [0])dnl
-_LT_DECL([], [build_os], [0])dnl
-dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([LT_PATH_LD])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-dnl
-AC_REQUIRE([AC_PROG_LN_S])dnl
-test -z "$LN_S" && LN_S="ln -s"
-_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
-dnl
-AC_REQUIRE([LT_CMD_MAX_LEN])dnl
-_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
-_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
-dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_CHECK_SHELL_FEATURES])dnl
-m4_require([_LT_CMD_RELOAD])dnl
-m4_require([_LT_CHECK_MAGIC_METHOD])dnl
-m4_require([_LT_CMD_OLD_ARCHIVE])dnl
-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-
-_LT_CONFIG_LIBTOOL_INIT([
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-])
-if test -n "${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-_LT_CHECK_OBJDIR
-
-m4_require([_LT_TAG_COMPILER])dnl
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-_LT_CC_BASENAME([$compiler])
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    _LT_PATH_MAGIC
-  fi
-  ;;
-esac
-
-# Use C for the default configuration in the libtool script
-LT_SUPPORTED_TAG([CC])
-_LT_LANG_C_CONFIG
-_LT_LANG_DEFAULT_CONFIG
-_LT_CONFIG_COMMANDS
-])# _LT_SETUP
-
-
-# _LT_PREPARE_SED_QUOTE_VARS
-# --------------------------
-# Define a few sed substitution that help us do robust quoting.
-m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
-[# Backslashify metacharacters that are still active within
-# double-quoted strings.
-sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\([["`\\]]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-])
-
-# _LT_PROG_LTMAIN
-# ---------------
-# Note that this code is called both from `configure', and `config.status'
-# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
-# `config.status' has no value for ac_aux_dir unless we are using Automake,
-# so we pass a copy along to make sure it has a sensible value anyway.
-m4_defun([_LT_PROG_LTMAIN],
-[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
-_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
-ltmain="$ac_aux_dir/ltmain.sh"
-])# _LT_PROG_LTMAIN
-
-
-## ------------------------------------- ##
-## Accumulate code for creating libtool. ##
-## ------------------------------------- ##
-
-# So that we can recreate a full libtool script including additional
-# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
-# in macros and then make a single call at the end using the `libtool'
-# label.
-
-
-# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
-# ----------------------------------------
-# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-m4_define([_LT_CONFIG_LIBTOOL_INIT],
-[m4_ifval([$1],
-          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
-                     [$1
-])])])
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_INIT])
-
-
-# _LT_CONFIG_LIBTOOL([COMMANDS])
-# ------------------------------
-# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-m4_define([_LT_CONFIG_LIBTOOL],
-[m4_ifval([$1],
-          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
-                     [$1
-])])])
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
-
-
-# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
-# -----------------------------------------------------
-m4_defun([_LT_CONFIG_SAVE_COMMANDS],
-[_LT_CONFIG_LIBTOOL([$1])
-_LT_CONFIG_LIBTOOL_INIT([$2])
-])
-
-
-# _LT_FORMAT_COMMENT([COMMENT])
-# -----------------------------
-# Add leading comment marks to the start of each line, and a trailing
-# full-stop to the whole comment if one is not present already.
-m4_define([_LT_FORMAT_COMMENT],
-[m4_ifval([$1], [
-m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
-              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
-)])
-
-
-
-## ------------------------ ##
-## FIXME: Eliminate VARNAME ##
-## ------------------------ ##
-
-
-# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
-# -------------------------------------------------------------------
-# CONFIGNAME is the name given to the value in the libtool script.
-# VARNAME is the (base) name used in the configure script.
-# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
-# VARNAME.  Any other value will be used directly.
-m4_define([_LT_DECL],
-[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
-    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
-	[m4_ifval([$1], [$1], [$2])])
-    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
-    m4_ifval([$4],
-	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
-    lt_dict_add_subkey([lt_decl_dict], [$2],
-	[tagged?], [m4_ifval([$5], [yes], [no])])])
-])
-
-
-# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
-# --------------------------------------------------------
-m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
-
-
-# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
-# ------------------------------------------------
-m4_define([lt_decl_tag_varnames],
-[_lt_decl_filter([tagged?], [yes], $@)])
-
-
-# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
-# ---------------------------------------------------------
-m4_define([_lt_decl_filter],
-[m4_case([$#],
-  [0], [m4_fatal([$0: too few arguments: $#])],
-  [1], [m4_fatal([$0: too few arguments: $#: $1])],
-  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
-  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
-  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
-])
-
-
-# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
-# --------------------------------------------------
-m4_define([lt_decl_quote_varnames],
-[_lt_decl_filter([value], [1], $@)])
-
-
-# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
-# ---------------------------------------------------
-m4_define([lt_decl_dquote_varnames],
-[_lt_decl_filter([value], [2], $@)])
-
-
-# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
-# ---------------------------------------------------
-m4_define([lt_decl_varnames_tagged],
-[m4_assert([$# <= 2])dnl
-_$0(m4_quote(m4_default([$1], [[, ]])),
-    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
-    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
-m4_define([_lt_decl_varnames_tagged],
-[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
-
-
-# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
-# ------------------------------------------------
-m4_define([lt_decl_all_varnames],
-[_$0(m4_quote(m4_default([$1], [[, ]])),
-     m4_if([$2], [],
-	   m4_quote(lt_decl_varnames),
-	m4_quote(m4_shift($@))))[]dnl
-])
-m4_define([_lt_decl_all_varnames],
-[lt_join($@, lt_decl_varnames_tagged([$1],
-			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
-])
-
-
-# _LT_CONFIG_STATUS_DECLARE([VARNAME])
-# ------------------------------------
-# Quote a variable value, and forward it to `config.status' so that its
-# declaration there will have the same value as in `configure'.  VARNAME
-# must have a single quote delimited value for this to work.
-m4_define([_LT_CONFIG_STATUS_DECLARE],
-[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
-
-
-# _LT_CONFIG_STATUS_DECLARATIONS
-# ------------------------------
-# We delimit libtool config variables with single quotes, so when
-# we write them to config.status, we have to be sure to quote all
-# embedded single quotes properly.  In configure, this macro expands
-# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
-#
-#    <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
-m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
-[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
-    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
-
-
-# _LT_LIBTOOL_TAGS
-# ----------------
-# Output comment and list of tags supported by the script
-m4_defun([_LT_LIBTOOL_TAGS],
-[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
-available_tags="_LT_TAGS"dnl
-])
-
-
-# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
-# -----------------------------------
-# Extract the dictionary values for VARNAME (optionally with TAG) and
-# expand to a commented shell variable setting:
-#
-#    # Some comment about what VAR is for.
-#    visible_name=$lt_internal_name
-m4_define([_LT_LIBTOOL_DECLARE],
-[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
-					   [description])))[]dnl
-m4_pushdef([_libtool_name],
-    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
-m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
-    [0], [_libtool_name=[$]$1],
-    [1], [_libtool_name=$lt_[]$1],
-    [2], [_libtool_name=$lt_[]$1],
-    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
-m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
-])
-
-
-# _LT_LIBTOOL_CONFIG_VARS
-# -----------------------
-# Produce commented declarations of non-tagged libtool config variables
-# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
-# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
-# section) are produced by _LT_LIBTOOL_TAG_VARS.
-m4_defun([_LT_LIBTOOL_CONFIG_VARS],
-[m4_foreach([_lt_var],
-    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
-    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
-
-
-# _LT_LIBTOOL_TAG_VARS(TAG)
-# -------------------------
-m4_define([_LT_LIBTOOL_TAG_VARS],
-[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
-    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
-
-
-# _LT_TAGVAR(VARNAME, [TAGNAME])
-# ------------------------------
-m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
-
-
-# _LT_CONFIG_COMMANDS
-# -------------------
-# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
-# variables for single and double quote escaping we saved from calls
-# to _LT_DECL, we can put quote escaped variables declarations
-# into `config.status', and then the shell code to quote escape them in
-# for loops in `config.status'.  Finally, any additional code accumulated
-# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
-m4_defun([_LT_CONFIG_COMMANDS],
-[AC_PROVIDE_IFELSE([LT_OUTPUT],
-	dnl If the libtool generation code has been placed in $CONFIG_LT,
-	dnl instead of duplicating it all over again into config.status,
-	dnl then we will have config.status run $CONFIG_LT later, so it
-	dnl needs to know what name is stored there:
-        [AC_CONFIG_COMMANDS([libtool],
-            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
-    dnl If the libtool generation code is destined for config.status,
-    dnl expand the accumulated commands and init code now:
-    [AC_CONFIG_COMMANDS([libtool],
-        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
-])#_LT_CONFIG_COMMANDS
-
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
-[
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-_LT_CONFIG_STATUS_DECLARATIONS
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-\$[]1
-_LTECHO_EOF'
-}
-
-# Quote evaled strings.
-for var in lt_decl_all_varnames([[ \
-]], lt_decl_quote_varnames); do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Double-quote double-evaled strings.
-for var in lt_decl_all_varnames([[ \
-]], lt_decl_dquote_varnames); do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-_LT_OUTPUT_LIBTOOL_INIT
-])
-
-# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
-# ------------------------------------
-# Generate a child script FILE with all initialization necessary to
-# reuse the environment learned by the parent script, and make the
-# file executable.  If COMMENT is supplied, it is inserted after the
-# `#!' sequence but before initialization text begins.  After this
-# macro, additional text can be appended to FILE to form the body of
-# the child script.  The macro ends with non-zero status if the
-# file could not be fully written (such as if the disk is full).
-m4_ifdef([AS_INIT_GENERATED],
-[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
-[m4_defun([_LT_GENERATED_FILE_INIT],
-[m4_require([AS_PREPARE])]dnl
-[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
-[lt_write_fail=0
-cat >$1 <<_ASEOF || lt_write_fail=1
-#! $SHELL
-# Generated by $as_me.
-$2
-SHELL=\${CONFIG_SHELL-$SHELL}
-export SHELL
-_ASEOF
-cat >>$1 <<\_ASEOF || lt_write_fail=1
-AS_SHELL_SANITIZE
-_AS_PREPARE
-exec AS_MESSAGE_FD>&1
-_ASEOF
-test $lt_write_fail = 0 && chmod +x $1[]dnl
-m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
-
-# LT_OUTPUT
-# ---------
-# This macro allows early generation of the libtool script (before
-# AC_OUTPUT is called), incase it is used in configure for compilation
-# tests.
-AC_DEFUN([LT_OUTPUT],
-[: ${CONFIG_LT=./config.lt}
-AC_MSG_NOTICE([creating $CONFIG_LT])
-_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
-[# Run this file to recreate a libtool stub with the current configuration.])
-
-cat >>"$CONFIG_LT" <<\_LTEOF
-lt_cl_silent=false
-exec AS_MESSAGE_LOG_FD>>config.log
-{
-  echo
-  AS_BOX([Running $as_me.])
-} >&AS_MESSAGE_LOG_FD
-
-lt_cl_help="\
-\`$as_me' creates a local libtool stub from the current configuration,
-for use in further configure time tests before the real libtool is
-generated.
-
-Usage: $[0] [[OPTIONS]]
-
-  -h, --help      print this help, then exit
-  -V, --version   print version number, then exit
-  -q, --quiet     do not print progress messages
-  -d, --debug     don't remove temporary files
-
-Report bugs to <bug-libtool@gnu.org>."
-
-lt_cl_version="\
-m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
-m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
-configured by $[0], generated by m4_PACKAGE_STRING.
-
-Copyright (C) 2010 Free Software Foundation, Inc.
-This config.lt script is free software; the Free Software Foundation
-gives unlimited permision to copy, distribute and modify it."
-
-while test $[#] != 0
-do
-  case $[1] in
-    --version | --v* | -V )
-      echo "$lt_cl_version"; exit 0 ;;
-    --help | --h* | -h )
-      echo "$lt_cl_help"; exit 0 ;;
-    --debug | --d* | -d )
-      debug=: ;;
-    --quiet | --q* | --silent | --s* | -q )
-      lt_cl_silent=: ;;
-
-    -*) AC_MSG_ERROR([unrecognized option: $[1]
-Try \`$[0] --help' for more information.]) ;;
-
-    *) AC_MSG_ERROR([unrecognized argument: $[1]
-Try \`$[0] --help' for more information.]) ;;
-  esac
-  shift
-done
-
-if $lt_cl_silent; then
-  exec AS_MESSAGE_FD>/dev/null
-fi
-_LTEOF
-
-cat >>"$CONFIG_LT" <<_LTEOF
-_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
-_LTEOF
-
-cat >>"$CONFIG_LT" <<\_LTEOF
-AC_MSG_NOTICE([creating $ofile])
-_LT_OUTPUT_LIBTOOL_COMMANDS
-AS_EXIT(0)
-_LTEOF
-chmod +x "$CONFIG_LT"
-
-# configure is writing to config.log, but config.lt does its own redirection,
-# appending to config.log, which fails on DOS, as config.log is still kept
-# open by configure.  Here we exec the FD to /dev/null, effectively closing
-# config.log, so it can be properly (re)opened and appended to by config.lt.
-lt_cl_success=:
-test "$silent" = yes &&
-  lt_config_lt_args="$lt_config_lt_args --quiet"
-exec AS_MESSAGE_LOG_FD>/dev/null
-$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
-exec AS_MESSAGE_LOG_FD>>config.log
-$lt_cl_success || AS_EXIT(1)
-])# LT_OUTPUT
-
-
-# _LT_CONFIG(TAG)
-# ---------------
-# If TAG is the built-in tag, create an initial libtool script with a
-# default configuration from the untagged config vars.  Otherwise add code
-# to config.status for appending the configuration named by TAG from the
-# matching tagged config vars.
-m4_defun([_LT_CONFIG],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-_LT_CONFIG_SAVE_COMMANDS([
-  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
-  m4_if(_LT_TAG, [C], [
-    # See if we are running on zsh, and set the options which allow our
-    # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
-      setopt NO_GLOB_SUBST
-    fi
-
-    cfgfile="${ofile}T"
-    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
-    $RM "$cfgfile"
-
-    cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $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.
-#
-_LT_COPYING
-_LT_LIBTOOL_TAGS
-
-# ### BEGIN LIBTOOL CONFIG
-_LT_LIBTOOL_CONFIG_VARS
-_LT_LIBTOOL_TAG_VARS
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
-  case $host_os in
-  aix3*)
-    cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-_LT_EOF
-    ;;
-  esac
-
-  _LT_PROG_LTMAIN
-
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  _LT_PROG_XSI_SHELLFNS
-
-  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  mv -f "$cfgfile" "$ofile" ||
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
-],
-[cat <<_LT_EOF >> "$ofile"
-
-dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
-dnl in a comment (ie after a #).
-# ### BEGIN LIBTOOL TAG CONFIG: $1
-_LT_LIBTOOL_TAG_VARS(_LT_TAG)
-# ### END LIBTOOL TAG CONFIG: $1
-_LT_EOF
-])dnl /m4_if
-],
-[m4_if([$1], [], [
-    PACKAGE='$PACKAGE'
-    VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
-    RM='$RM'
-    ofile='$ofile'], [])
-])dnl /_LT_CONFIG_SAVE_COMMANDS
-])# _LT_CONFIG
-
-
-# LT_SUPPORTED_TAG(TAG)
-# ---------------------
-# Trace this macro to discover what tags are supported by the libtool
-# --tag option, using:
-#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
-AC_DEFUN([LT_SUPPORTED_TAG], [])
-
-
-# C support is built-in for now
-m4_define([_LT_LANG_C_enabled], [])
-m4_define([_LT_TAGS], [])
-
-
-# LT_LANG(LANG)
-# -------------
-# Enable libtool support for the given language if not already enabled.
-AC_DEFUN([LT_LANG],
-[AC_BEFORE([$0], [LT_OUTPUT])dnl
-m4_case([$1],
-  [C],			[_LT_LANG(C)],
-  [C++],		[_LT_LANG(CXX)],
-  [Java],		[_LT_LANG(GCJ)],
-  [Fortran 77],		[_LT_LANG(F77)],
-  [Fortran],		[_LT_LANG(FC)],
-  [Windows Resource],	[_LT_LANG(RC)],
-  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
-    [_LT_LANG($1)],
-    [m4_fatal([$0: unsupported language: "$1"])])])dnl
-])# LT_LANG
-
-
-# _LT_LANG(LANGNAME)
-# ------------------
-m4_defun([_LT_LANG],
-[m4_ifdef([_LT_LANG_]$1[_enabled], [],
-  [LT_SUPPORTED_TAG([$1])dnl
-  m4_append([_LT_TAGS], [$1 ])dnl
-  m4_define([_LT_LANG_]$1[_enabled], [])dnl
-  _LT_LANG_$1_CONFIG($1)])dnl
-])# _LT_LANG
-
-
-# _LT_LANG_DEFAULT_CONFIG
-# -----------------------
-m4_defun([_LT_LANG_DEFAULT_CONFIG],
-[AC_PROVIDE_IFELSE([AC_PROG_CXX],
-  [LT_LANG(CXX)],
-  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
-
-AC_PROVIDE_IFELSE([AC_PROG_F77],
-  [LT_LANG(F77)],
-  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
-
-AC_PROVIDE_IFELSE([AC_PROG_FC],
-  [LT_LANG(FC)],
-  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
-
-dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
-dnl pulling things in needlessly.
-AC_PROVIDE_IFELSE([AC_PROG_GCJ],
-  [LT_LANG(GCJ)],
-  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
-    [LT_LANG(GCJ)],
-    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
-      [LT_LANG(GCJ)],
-      [m4_ifdef([AC_PROG_GCJ],
-	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
-       m4_ifdef([A][M_PROG_GCJ],
-	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
-       m4_ifdef([LT_PROG_GCJ],
-	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
-
-AC_PROVIDE_IFELSE([LT_PROG_RC],
-  [LT_LANG(RC)],
-  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
-])# _LT_LANG_DEFAULT_CONFIG
-
-# Obsolete macros:
-AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
-AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
-AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
-AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
-AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
-dnl AC_DEFUN([AC_LIBTOOL_F77], [])
-dnl AC_DEFUN([AC_LIBTOOL_FC], [])
-dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
-dnl AC_DEFUN([AC_LIBTOOL_RC], [])
-
-
-# _LT_TAG_COMPILER
-# ----------------
-m4_defun([_LT_TAG_COMPILER],
-[AC_REQUIRE([AC_PROG_CC])dnl
-
-_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
-_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
-_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
-_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-])# _LT_TAG_COMPILER
-
-
-# _LT_COMPILER_BOILERPLATE
-# ------------------------
-# Check for compiler boilerplate output or warnings with
-# the simple compiler test code.
-m4_defun([_LT_COMPILER_BOILERPLATE],
-[m4_require([_LT_DECL_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-])# _LT_COMPILER_BOILERPLATE
-
-
-# _LT_LINKER_BOILERPLATE
-# ----------------------
-# Check for linker boilerplate output or warnings with
-# the simple link test code.
-m4_defun([_LT_LINKER_BOILERPLATE],
-[m4_require([_LT_DECL_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-])# _LT_LINKER_BOILERPLATE
-
-# _LT_REQUIRED_DARWIN_CHECKS
-# -------------------------
-m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
-  case $host_os in
-    rhapsody* | darwin*)
-    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
-    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
-    AC_CHECK_TOOL([LIPO], [lipo], [:])
-    AC_CHECK_TOOL([OTOOL], [otool], [:])
-    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
-    _LT_DECL([], [DSYMUTIL], [1],
-      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
-    _LT_DECL([], [NMEDIT], [1],
-      [Tool to change global to local symbols on Mac OS X])
-    _LT_DECL([], [LIPO], [1],
-      [Tool to manipulate fat objects and archives on Mac OS X])
-    _LT_DECL([], [OTOOL], [1],
-      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
-    _LT_DECL([], [OTOOL64], [1],
-      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
-
-    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
-      [lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
-	# By default we will add the -single_module flag. You can override
-	# by either setting the environment variable LT_MULTI_MODULE
-	# non-empty at configure time, or by adding -multi_module to the
-	# link flags.
-	rm -rf libconftest.dylib*
-	echo "int foo(void){return 1;}" > conftest.c
-	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
-	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
-        _lt_result=$?
-	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
-	  lt_cv_apple_cc_single_mod=yes
-	else
-	  cat conftest.err >&AS_MESSAGE_LOG_FD
-	fi
-	rm -rf libconftest.dylib*
-	rm -f conftest.*
-      fi])
-    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
-      [lt_cv_ld_exported_symbols_list],
-      [lt_cv_ld_exported_symbols_list=no
-      save_LDFLAGS=$LDFLAGS
-      echo "_main" > conftest.sym
-      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
-	[lt_cv_ld_exported_symbols_list=yes],
-	[lt_cv_ld_exported_symbols_list=no])
-	LDFLAGS="$save_LDFLAGS"
-    ])
-    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
-      [lt_cv_ld_force_load=no
-      cat > conftest.c << _LT_EOF
-int forced_loaded() { return 2;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
-      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
-      echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
-      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
-      echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
-      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
-      cat > conftest.c << _LT_EOF
-int main() { return 0;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
-      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
-      _lt_result=$?
-      if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then
-	lt_cv_ld_force_load=yes
-      else
-	cat conftest.err >&AS_MESSAGE_LOG_FD
-      fi
-        rm -f conftest.err libconftest.a conftest conftest.c
-        rm -rf conftest.dSYM
-    ])
-    case $host_os in
-    rhapsody* | darwin1.[[012]])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-    darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-    darwin*) # darwin 5.x on
-      # if running on 10.5 or later, the deployment target defaults
-      # to the OS version, if on x86, and 10.4, the deployment
-      # target defaults to 10.4. Don't you love it?
-      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[[012]]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-      esac
-    ;;
-  esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-      _lt_dar_single_mod='$single_module'
-    fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-    else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
-      _lt_dsymutil='~$DSYMUTIL $lib || :'
-    else
-      _lt_dsymutil=
-    fi
-    ;;
-  esac
-])
-
-
-# _LT_DARWIN_LINKER_FEATURES
-# --------------------------
-# Checks for linker and compiler features on darwin
-m4_defun([_LT_DARWIN_LINKER_FEATURES],
-[
-  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
-  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-  _LT_TAGVAR(hardcode_direct, $1)=no
-  _LT_TAGVAR(hardcode_automatic, $1)=yes
-  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-  else
-    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
-  fi
-  _LT_TAGVAR(link_all_deplibs, $1)=yes
-  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=func_echo_all
-    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-    m4_if([$1], [CXX],
-[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
-    fi
-],[])
-  else
-  _LT_TAGVAR(ld_shlibs, $1)=no
-  fi
-])
-
-# _LT_SYS_MODULE_PATH_AIX
-# -----------------------
-# Links a minimal program and checks the executable
-# for the system default hardcoded library path. In most cases,
-# this is /usr/lib:/lib, but when the MPI compilers are used
-# the location of the communication and MPI libs are included too.
-# If we don't find anything, use the default library path according
-# to the aix ld manual.
-m4_defun([_LT_SYS_MODULE_PATH_AIX],
-[m4_require([_LT_DECL_SED])dnl
-AC_LINK_IFELSE(AC_LANG_PROGRAM,[
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi],[])
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-])# _LT_SYS_MODULE_PATH_AIX
-
-
-# _LT_SHELL_INIT(ARG)
-# -------------------
-m4_define([_LT_SHELL_INIT],
-[m4_divert_text([M4SH-INIT], [$1
-])])# _LT_SHELL_INIT
-
-
-
-# _LT_PROG_ECHO_BACKSLASH
-# -----------------------
-# Find how we can fake an echo command that does not interpret backslash.
-# In particular, with Autoconf 2.60 or later we add some code to the start
-# of the generated configure script which will find a shell with a builtin
-# printf (which we can use as an echo command).
-m4_defun([_LT_PROG_ECHO_BACKSLASH],
-[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-
-AC_MSG_CHECKING([how to print strings])
-# Test print first, because it will be a builtin if present.
-if test "X`print -r -- -n 2>/dev/null`" = X-n && \
-   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='print -r --'
-elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='printf %s\n'
-else
-  # Use this function as a fallback that always works.
-  func_fallback_echo ()
-  {
-    eval 'cat <<_LTECHO_EOF
-$[]1
-_LTECHO_EOF'
-  }
-  ECHO='func_fallback_echo'
-fi
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO "$*" 
-}
-
-case "$ECHO" in
-  printf*) AC_MSG_RESULT([printf]) ;;
-  print*) AC_MSG_RESULT([print -r]) ;;
-  *) AC_MSG_RESULT([cat]) ;;
-esac
-
-m4_ifdef([_AS_DETECT_SUGGESTED],
-[_AS_DETECT_SUGGESTED([
-  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
-    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-    PATH=/empty FPATH=/empty; export PATH FPATH
-    test "X`printf %s $ECHO`" = "X$ECHO" \
-      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
-
-_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
-_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
-])# _LT_PROG_ECHO_BACKSLASH
-
-
-# _LT_ENABLE_LOCK
-# ---------------
-m4_defun([_LT_ENABLE_LOCK],
-[AC_ARG_ENABLE([libtool-lock],
-  [AS_HELP_STRING([--disable-libtool-lock],
-    [avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.$ac_objext` in
-      *ELF-32*)
-	HPUX_IA64_MODE="32"
-	;;
-      *ELF-64*)
-	HPUX_IA64_MODE="64"
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -melf32bsmip"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -melf32bmipn32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -melf64bmip"
-	;;
-      esac
-    else
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -32"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -n32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -64"
-	  ;;
-      esac
-    fi
-  fi
-  rm -rf conftest*
-  ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-      *32-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_i386_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_i386"
-	    ;;
-	  ppc64-*linux*|powerpc64-*linux*)
-	    LD="${LD-ld} -m elf32ppclinux"
-	    ;;
-	  s390x-*linux*)
-	    LD="${LD-ld} -m elf_s390"
-	    ;;
-	  sparc64-*linux*)
-	    LD="${LD-ld} -m elf32_sparc"
-	    ;;
-	esac
-	;;
-      *64-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_x86_64_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_x86_64"
-	    ;;
-	  ppc*-*linux*|powerpc*-*linux*)
-	    LD="${LD-ld} -m elf64ppc"
-	    ;;
-	  s390*-*linux*|s390*-*tpf*)
-	    LD="${LD-ld} -m elf64_s390"
-	    ;;
-	  sparc*-*linux*)
-	    LD="${LD-ld} -m elf64_sparc"
-	    ;;
-	esac
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
-    [AC_LANG_PUSH(C)
-     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
-     AC_LANG_POP])
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-sparc*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
-      *)
-	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
-	  LD="${LD-ld} -64"
-	fi
-	;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-esac
-
-need_locks="$enable_libtool_lock"
-])# _LT_ENABLE_LOCK
-
-
-# _LT_CMD_OLD_ARCHIVE
-# -------------------
-m4_defun([_LT_CMD_OLD_ARCHIVE],
-[AC_CHECK_TOOL(AR, ar, false)
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-_LT_DECL([], [AR], [1], [The archiver])
-_LT_DECL([], [AR_FLAGS], [1])
-
-AC_CHECK_TOOL(STRIP, strip, :)
-test -z "$STRIP" && STRIP=:
-_LT_DECL([], [STRIP], [1], [A symbol stripping program])
-
-AC_CHECK_TOOL(RANLIB, ranlib, :)
-test -z "$RANLIB" && RANLIB=:
-_LT_DECL([], [RANLIB], [1],
-    [Commands used to install an old-style archive])
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
-fi
-
-case $host_os in
-  darwin*)
-    lock_old_archive_extraction=yes ;;
-  *)
-    lock_old_archive_extraction=no ;;
-esac
-_LT_DECL([], [old_postinstall_cmds], [2])
-_LT_DECL([], [old_postuninstall_cmds], [2])
-_LT_TAGDECL([], [old_archive_cmds], [2],
-    [Commands used to build an old-style archive])
-_LT_DECL([], [lock_old_archive_extraction], [0],
-    [Whether to use a lock for old archive extraction])
-])# _LT_CMD_OLD_ARCHIVE
-
-
-# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------------------
-# Check whether the given compiler option works
-AC_DEFUN([_LT_COMPILER_OPTION],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$3"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       $2=yes
-     fi
-   fi
-   $RM conftest*
-])
-
-if test x"[$]$2" = xyes; then
-    m4_if([$5], , :, [$5])
-else
-    m4_if([$6], , :, [$6])
-fi
-])# _LT_COMPILER_OPTION
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
-
-
-# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#                  [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------
-# Check whether the given linker option works
-AC_DEFUN([_LT_LINKER_OPTION],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $3"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&AS_MESSAGE_LOG_FD
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         $2=yes
-       fi
-     else
-       $2=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-])
-
-if test x"[$]$2" = xyes; then
-    m4_if([$4], , :, [$4])
-else
-    m4_if([$5], , :, [$5])
-fi
-])# _LT_LINKER_OPTION
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
-
-
-# LT_CMD_MAX_LEN
-#---------------
-AC_DEFUN([LT_CMD_MAX_LEN],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-# find the maximum length of command line arguments
-AC_MSG_CHECKING([the maximum length of command line arguments])
-AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
-  i=0
-  teststring="ABCD"
-
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
-
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
-
-  cygwin* | mingw* | cegcc*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  mint*)
-    # On MiNT this can take a long time and run out of memory.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
-
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
-
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    else
-      # Make teststring a little bigger before we do anything with it.
-      # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
-        teststring=$teststring$teststring
-      done
-      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-      # If test is not a shell built-in, we'll probably end up computing a
-      # maximum length that is only half of the actual maximum length, but
-      # we can't tell.
-      while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \
-	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
-      do
-        i=`expr $i + 1`
-        teststring=$teststring$teststring
-      done
-      # Only check the string length outside the loop.
-      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
-      teststring=
-      # Add a significant safety factor because C++ compilers can tack on
-      # massive amounts of additional arguments before passing them to the
-      # linker.  It appears as though 1/2 is a usable value.
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    fi
-    ;;
-  esac
-])
-if test -n $lt_cv_sys_max_cmd_len ; then
-  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
-else
-  AC_MSG_RESULT(none)
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-_LT_DECL([], [max_cmd_len], [0],
-    [What is the maximum length of a command?])
-])# LT_CMD_MAX_LEN
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
-
-
-# _LT_HEADER_DLFCN
-# ----------------
-m4_defun([_LT_HEADER_DLFCN],
-[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
-])# _LT_HEADER_DLFCN
-
-
-# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
-#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
-# ----------------------------------------------------------------
-m4_defun([_LT_TRY_DLOPEN_SELF],
-[m4_require([_LT_HEADER_DLFCN])dnl
-if test "$cross_compiling" = yes; then :
-  [$4]
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-[#line $LINENO "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
-   correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-void fnord () __attribute__((visibility("default")));
-#endif
-
-void fnord () { int i=42; }
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else
-        {
-	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
-          else puts (dlerror ());
-	}
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}]
-_LT_EOF
-  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) $1 ;;
-      x$lt_dlneed_uscore) $2 ;;
-      x$lt_dlunknown|x*) $3 ;;
-    esac
-  else :
-    # compilation failed
-    $3
-  fi
-fi
-rm -fr conftest*
-])# _LT_TRY_DLOPEN_SELF
-
-
-# LT_SYS_DLOPEN_SELF
-# ------------------
-AC_DEFUN([LT_SYS_DLOPEN_SELF],
-[m4_require([_LT_HEADER_DLFCN])dnl
-if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-    ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-    ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ])
-    ;;
-
-  *)
-    AC_CHECK_FUNC([shl_load],
-	  [lt_cv_dlopen="shl_load"],
-      [AC_CHECK_LIB([dld], [shl_load],
-	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
-	[AC_CHECK_FUNC([dlopen],
-	      [lt_cv_dlopen="dlopen"],
-	  [AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
-	    [AC_CHECK_LIB([svld], [dlopen],
-		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
-	      [AC_CHECK_LIB([dld], [dld_link],
-		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
-	      ])
-	    ])
-	  ])
-	])
-      ])
-    ;;
-  esac
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    AC_CACHE_CHECK([whether a program can dlopen itself],
-	  lt_cv_dlopen_self, [dnl
-	  _LT_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
-	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
-    ])
-
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
-	  lt_cv_dlopen_self_static, [dnl
-	  _LT_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
-	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
-      ])
-    fi
-
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
-
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-_LT_DECL([dlopen_support], [enable_dlopen], [0],
-	 [Whether dlopen is supported])
-_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
-	 [Whether dlopen of programs is supported])
-_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
-	 [Whether dlopen of statically linked programs is supported])
-])# LT_SYS_DLOPEN_SELF
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
-
-
-# _LT_COMPILER_C_O([TAGNAME])
-# ---------------------------
-# Check to see if options -c and -o are simultaneously supported by compiler.
-# This macro does not hard code the compiler like AC_PROG_CC_C_O.
-m4_defun([_LT_COMPILER_C_O],
-[m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
-  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
-  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-     fi
-   fi
-   chmod u+w . 2>&AS_MESSAGE_LOG_FD
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-])
-_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
-	[Does compiler simultaneously support -c and -o options?])
-])# _LT_COMPILER_C_O
-
-
-# _LT_COMPILER_FILE_LOCKS([TAGNAME])
-# ----------------------------------
-# Check to see if we can do hard links to lock some files if needed
-m4_defun([_LT_COMPILER_FILE_LOCKS],
-[m4_require([_LT_ENABLE_LOCK])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-_LT_COMPILER_C_O([$1])
-
-hard_links="nottested"
-if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  AC_MSG_CHECKING([if we can lock with hard links])
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  AC_MSG_RESULT([$hard_links])
-  if test "$hard_links" = no; then
-    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
-])# _LT_COMPILER_FILE_LOCKS
-
-
-# _LT_CHECK_OBJDIR
-# ----------------
-m4_defun([_LT_CHECK_OBJDIR],
-[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
-[rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null])
-objdir=$lt_cv_objdir
-_LT_DECL([], [objdir], [0],
-         [The name of the directory that contains temporary libtool files])dnl
-m4_pattern_allow([LT_OBJDIR])dnl
-AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
-  [Define to the sub-directory in which libtool stores uninstalled libraries.])
-])# _LT_CHECK_OBJDIR
-
-
-# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
-# --------------------------------------
-# Check hardcoding attributes.
-m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
-[AC_MSG_CHECKING([how to hardcode library paths into programs])
-_LT_TAGVAR(hardcode_action, $1)=
-if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
-   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
-   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
-     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
-    # Linking always hardcodes the temporary library directory.
-    _LT_TAGVAR(hardcode_action, $1)=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    _LT_TAGVAR(hardcode_action, $1)=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  _LT_TAGVAR(hardcode_action, $1)=unsupported
-fi
-AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
-
-if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
-   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-_LT_TAGDECL([], [hardcode_action], [0],
-    [How to hardcode a shared library path into an executable])
-])# _LT_LINKER_HARDCODE_LIBPATH
-
-
-# _LT_CMD_STRIPLIB
-# ----------------
-m4_defun([_LT_CMD_STRIPLIB],
-[m4_require([_LT_DECL_EGREP])
-striplib=
-old_striplib=
-AC_MSG_CHECKING([whether stripping libraries is possible])
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  AC_MSG_RESULT([yes])
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-  darwin*)
-    if test -n "$STRIP" ; then
-      striplib="$STRIP -x"
-      old_striplib="$STRIP -S"
-      AC_MSG_RESULT([yes])
-    else
-      AC_MSG_RESULT([no])
-    fi
-    ;;
-  *)
-    AC_MSG_RESULT([no])
-    ;;
-  esac
-fi
-_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
-_LT_DECL([], [striplib], [1])
-])# _LT_CMD_STRIPLIB
-
-
-# _LT_SYS_DYNAMIC_LINKER([TAG])
-# -----------------------------
-# PORTME Fill in your ld.so characteristics
-m4_defun([_LT_SYS_DYNAMIC_LINKER],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_OBJDUMP])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_CHECK_SHELL_FEATURES])dnl
-AC_MSG_CHECKING([dynamic linker characteristics])
-m4_if([$1],
-	[], [
-if test "$GCC" = yes; then
-  case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
-  esac
-  case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
-  esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
-  case $lt_search_path_spec in
-  *\;*)
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
-    ;;
-  *)
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
-    ;;
-  esac
-  # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
-  lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
-  for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
-      test -d "$lt_sys_path" && \
-	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
-    fi
-  done
-  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
-  for (lt_i = NF; lt_i > 0; lt_i--) {
-    if ($lt_i != "" && $lt_i != ".") {
-      if ($lt_i == "..") {
-        lt_count++;
-      } else {
-        if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
-        } else {
-          lt_count--;
-        }
-      }
-    }
-  }
-  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
-  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
-}'`
-  # AWK program above erroneously prepends '/' to C:/dos/paths
-  # for these hosts.
-  case $host_os in
-    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
-  esac
-  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi])
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[[4-9]]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[[01]] | aix4.[[01]].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[[45]]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-m4_if([$1], [],[
-      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
-
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-m4_if([$1], [],[
-  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd1*)
-  dynamic_linker=no
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[[123]]*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
-  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
-
-haiku*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
-  postinstall_cmds='chmod 555 $lib'
-  # or fails outright, so override atomically:
-  install_override_mode=555
-  ;;
-
-interix[[3-9]]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-
-  # Some binutils ld are patched to set DT_RUNPATH
-  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
-    [lt_cv_shlibpath_overrides_runpath=no
-    save_LDFLAGS=$LDFLAGS
-    save_libdir=$libdir
-    eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
-	 LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
-    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
-      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
-	 [lt_cv_shlibpath_overrides_runpath=yes])])
-    LDFLAGS=$save_LDFLAGS
-    libdir=$save_libdir
-    ])
-  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[[89]] | openbsd2.[[89]].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-AC_MSG_RESULT([$dynamic_linker])
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-_LT_DECL([], [variables_saved_for_relink], [1],
-    [Variables whose values should be saved in libtool wrapper scripts and
-    restored at link time])
-_LT_DECL([], [need_lib_prefix], [0],
-    [Do we need the "lib" prefix for modules?])
-_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
-_LT_DECL([], [version_type], [0], [Library versioning type])
-_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
-_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
-_LT_DECL([], [shlibpath_overrides_runpath], [0],
-    [Is shlibpath searched before the hard-coded library search path?])
-_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
-_LT_DECL([], [library_names_spec], [1],
-    [[List of archive names.  First name is the real one, the rest are links.
-    The last name is the one that the linker finds with -lNAME]])
-_LT_DECL([], [soname_spec], [1],
-    [[The coded name of the library, if different from the real name]])
-_LT_DECL([], [install_override_mode], [1],
-    [Permission mode override for installation of shared libraries])
-_LT_DECL([], [postinstall_cmds], [2],
-    [Command to use after installation of a shared archive])
-_LT_DECL([], [postuninstall_cmds], [2],
-    [Command to use after uninstallation of a shared archive])
-_LT_DECL([], [finish_cmds], [2],
-    [Commands used to finish a libtool library installation in a directory])
-_LT_DECL([], [finish_eval], [1],
-    [[As "finish_cmds", except a single script fragment to be evaled but
-    not shown]])
-_LT_DECL([], [hardcode_into_libs], [0],
-    [Whether we should hardcode library paths into libraries])
-_LT_DECL([], [sys_lib_search_path_spec], [2],
-    [Compile-time system search path for libraries])
-_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
-    [Run-time system search path for libraries])
-])# _LT_SYS_DYNAMIC_LINKER
-
-
-# _LT_PATH_TOOL_PREFIX(TOOL)
-# --------------------------
-# find a file program which can recognize shared library
-AC_DEFUN([_LT_PATH_TOOL_PREFIX],
-[m4_require([_LT_DECL_EGREP])dnl
-AC_MSG_CHECKING([for $1])
-AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
-[case $MAGIC_CMD in
-[[\\/*] |  ?:[\\/]*])
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-dnl $ac_dummy forces splitting on constant user-supplied paths.
-dnl POSIX.2 word splitting is done only on the output of word expansions,
-dnl not every word.  This closes a longstanding sh security hole.
-  ac_dummy="m4_if([$2], , $PATH, [$2])"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$1; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac])
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  AC_MSG_RESULT($MAGIC_CMD)
-else
-  AC_MSG_RESULT(no)
-fi
-_LT_DECL([], [MAGIC_CMD], [0],
-	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
-])# _LT_PATH_TOOL_PREFIX
-
-# Old name:
-AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
-
-
-# _LT_PATH_MAGIC
-# --------------
-# find a file program which can recognize a shared library
-m4_defun([_LT_PATH_MAGIC],
-[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
-  else
-    MAGIC_CMD=:
-  fi
-fi
-])# _LT_PATH_MAGIC
-
-
-# LT_PATH_LD
-# ----------
-# find the pathname to the GNU or non-GNU linker
-AC_DEFUN([LT_PATH_LD],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
-
-AC_ARG_WITH([gnu-ld],
-    [AS_HELP_STRING([--with-gnu-ld],
-	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
-    [test "$withval" = no || with_gnu_ld=yes],
-    [with_gnu_ld=no])dnl
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  AC_MSG_CHECKING([for ld used by $CC])
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [[\\/]]* | ?:[[\\/]]*)
-      re_direlt='/[[^/]][[^/]]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  AC_MSG_CHECKING([for GNU ld])
-else
-  AC_MSG_CHECKING([for non-GNU ld])
-fi
-AC_CACHE_VAL(lt_cv_path_LD,
-[if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi])
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  AC_MSG_RESULT($LD)
-else
-  AC_MSG_RESULT(no)
-fi
-test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
-_LT_PATH_LD_GNU
-AC_SUBST([LD])
-
-_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
-])# LT_PATH_LD
-
-# Old names:
-AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
-AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_PROG_LD], [])
-dnl AC_DEFUN([AC_PROG_LD], [])
-
-
-# _LT_PATH_LD_GNU
-#- --------------
-m4_defun([_LT_PATH_LD_GNU],
-[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
-[# I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac])
-with_gnu_ld=$lt_cv_prog_gnu_ld
-])# _LT_PATH_LD_GNU
-
-
-# _LT_CMD_RELOAD
-# --------------
-# find reload flag for linker
-#   -- PORTME Some linkers may need a different reload flag.
-m4_defun([_LT_CMD_RELOAD],
-[AC_CACHE_CHECK([for $LD option to reload object files],
-  lt_cv_ld_reload_flag,
-  [lt_cv_ld_reload_flag='-r'])
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
-_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
-_LT_TAGDECL([], [reload_cmds], [2])dnl
-])# _LT_CMD_RELOAD
-
-
-# _LT_CHECK_MAGIC_METHOD
-# ----------------------
-# how to check for library dependencies
-#  -- PORTME fill in with the dynamic library characteristics
-m4_defun([_LT_CHECK_MAGIC_METHOD],
-[m4_require([_LT_DECL_EGREP])
-m4_require([_LT_DECL_OBJDUMP])
-AC_CACHE_CHECK([how to recognize dependent libraries],
-lt_cv_deplibs_check_method,
-[lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[[4-9]]*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[[45]]*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump',
-  # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
-    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-    lt_cv_file_magic_cmd='func_win32_libid'
-  else
-    # Keep this pattern in sync with the one in func_win32_libid.
-    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
-    lt_cv_file_magic_cmd='$OBJDUMP -f'
-  fi
-  ;;
-
-cegcc*)
-  # use the weaker test based on 'objdump'. See mingw*.
-  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
-
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-freebsd* | dragonfly*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
-
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-haiku*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
-
-interix[[3-9]]*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
-  fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-*nto* | *qnx*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-rdos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-tpf*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-])
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-_LT_DECL([], [deplibs_check_method], [1],
-    [Method to check whether dependent libraries are shared objects])
-_LT_DECL([], [file_magic_cmd], [1],
-    [Command to use when deplibs_check_method == "file_magic"])
-])# _LT_CHECK_MAGIC_METHOD
-
-
-# LT_PATH_NM
-# ----------
-# find the pathname to a BSD- or MS-compatible name lister
-AC_DEFUN([LT_PATH_NM],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
-[if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  : ${lt_cv_path_NM=no}
-fi])
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
-else
-  # Didn't find any BSD compatible name lister, look for dumpbin.
-  if test -n "$DUMPBIN"; then :
-    # Let the user override the test.
-  else
-    AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
-    *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
-      ;;
-    *)
-      DUMPBIN=:
-      ;;
-    esac
-  fi
-  AC_SUBST([DUMPBIN])
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
-  fi
-fi
-test -z "$NM" && NM=nm
-AC_SUBST([NM])
-_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
-
-AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
-  [lt_cv_nm_interface="BSD nm"
-  echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
-  (eval "$ac_compile" 2>conftest.err)
-  cat conftest.err >&AS_MESSAGE_LOG_FD
-  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
-  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
-  cat conftest.err >&AS_MESSAGE_LOG_FD
-  (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
-  cat conftest.out >&AS_MESSAGE_LOG_FD
-  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
-    lt_cv_nm_interface="MS dumpbin"
-  fi
-  rm -f conftest*])
-])# LT_PATH_NM
-
-# Old names:
-AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
-AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_PROG_NM], [])
-dnl AC_DEFUN([AC_PROG_NM], [])
-
-
-# LT_LIB_M
-# --------
-# check for math library
-AC_DEFUN([LT_LIB_M],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-LIBM=
-case $host in
-*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
-  # These system don't have libm, or don't need it
-  ;;
-*-ncr-sysv4.3*)
-  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
-  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
-  ;;
-*)
-  AC_CHECK_LIB(m, cos, LIBM="-lm")
-  ;;
-esac
-AC_SUBST([LIBM])
-])# LT_LIB_M
-
-# Old name:
-AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_CHECK_LIBM], [])
-
-
-# _LT_COMPILER_NO_RTTI([TAGNAME])
-# -------------------------------
-m4_defun([_LT_COMPILER_NO_RTTI],
-[m4_require([_LT_TAG_COMPILER])dnl
-
-_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-
-if test "$GCC" = yes; then
-  case $cc_basename in
-  nvcc*)
-    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
-  *)
-    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
-  esac
-
-  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
-    lt_cv_prog_compiler_rtti_exceptions,
-    [-fno-rtti -fno-exceptions], [],
-    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
-fi
-_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
-	[Compiler flag to turn off builtin functions])
-])# _LT_COMPILER_NO_RTTI
-
-
-# _LT_CMD_GLOBAL_SYMBOLS
-# ----------------------
-m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-AC_REQUIRE([LT_PATH_LD])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-AC_MSG_CHECKING([command to parse $NM output from $compiler object])
-AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
-[
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[[BCDEGRST]]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[[BCDT]]'
-  ;;
-cygwin* | mingw* | pw32* | cegcc*)
-  symcode='[[ABCDGISTW]]'
-  ;;
-hpux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[[ABCDEGRST]]'
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[[BCDEGRST]]'
-  ;;
-osf*)
-  symcode='[[BCDEGQRST]]'
-  ;;
-solaris*)
-  symcode='[[BDRT]]'
-  ;;
-sco3.2v5*)
-  symcode='[[DT]]'
-  ;;
-sysv4.2uw2*)
-  symcode='[[DT]]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[[ABDT]]'
-  ;;
-sysv4)
-  symcode='[[DFNSTU]]'
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[[ABCDGIRSTW]]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
-    # Also find C++ and __fastcall symbols from MSVC++,
-    # which start with @ or ?.
-    lt_cv_sys_global_symbol_pipe="$AWK ['"\
-"     {last_section=section; section=\$ 3};"\
-"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-"     \$ 0!~/External *\|/{next};"\
-"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-"     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-"     ' prfx=^$ac_symprfx]"
-  else
-    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-  fi
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
-  if AC_TRY_EVAL(ac_compile); then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
-	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<_LT_EOF > conftest.$ac_ext
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
-	  cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols.  */
-const struct {
-  const char *name;
-  void       *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[[]] =
-{
-  { "@PROGRAM@", (void *) 0 },
-_LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
-	  cat <<\_LT_EOF >> conftest.$ac_ext
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_save_LIBS="$LIBS"
-	  lt_save_CFLAGS="$CFLAGS"
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
-	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS="$lt_save_LIBS"
-	  CFLAGS="$lt_save_CFLAGS"
-	else
-	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
-    fi
-  else
-    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
-    cat conftest.$ac_ext >&5
-  fi
-  rm -rf conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-])
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  AC_MSG_RESULT(failed)
-else
-  AC_MSG_RESULT(ok)
-fi
-
-_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
-    [Take the output of nm and produce a listing of raw symbols and C names])
-_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
-    [Transform the output of nm in a proper C declaration])
-_LT_DECL([global_symbol_to_c_name_address],
-    [lt_cv_sys_global_symbol_to_c_name_address], [1],
-    [Transform the output of nm in a C name address pair])
-_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
-    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
-    [Transform the output of nm in a C name address pair when lib prefix is needed])
-]) # _LT_CMD_GLOBAL_SYMBOLS
-
-
-# _LT_COMPILER_PIC([TAGNAME])
-# ---------------------------
-m4_defun([_LT_COMPILER_PIC],
-[m4_require([_LT_TAG_COMPILER])dnl
-_LT_TAGVAR(lt_prog_compiler_wl, $1)=
-_LT_TAGVAR(lt_prog_compiler_pic, $1)=
-_LT_TAGVAR(lt_prog_compiler_static, $1)=
-
-AC_MSG_CHECKING([for $compiler option to produce PIC])
-m4_if([$1], [CXX], [
-  # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
-    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-    aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-    mingw* | cygwin* | os2* | pw32* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-    *djgpp*)
-      # DJGPP does not support shared libraries at all
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-      ;;
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)=
-      ;;
-    interix[[3-9]]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-    *qnx* | *nto*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-    *)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-  else
-    case $host_os in
-      aix[[4-9]]*)
-	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
-	  # AIX 5 now supports IA64 processor
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	else
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-	fi
-	;;
-      chorus*)
-	case $cc_basename in
-	cxch68*)
-	  # Green Hills C++ Compiler
-	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
-	  ;;
-	esac
-	;;
-      dgux*)
-	case $cc_basename in
-	  ec++*)
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  ghcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      freebsd* | dragonfly*)
-	# FreeBSD uses GNU C++
-	;;
-      hpux9* | hpux10* | hpux11*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	    fi
-	    ;;
-	  aCC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    case $host_cpu in
-	    hppa*64*|ia64*)
-	      # +Z the default
-	      ;;
-	    *)
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	      ;;
-	    esac
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      interix*)
-	# This is c89, which is MS Visual C++ (no shared libs)
-	# Anyone wants to do a port?
-	;;
-      irix5* | irix6* | nonstopux*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    # CC pic flag -KPIC is the default.
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-	case $cc_basename in
-	  KCC*)
-	    # KAI C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	    ;;
-	  ecpc* )
-	    # old Intel C++ for x86_64 which still supported -KPIC.
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	    ;;
-	  icpc* )
-	    # Intel C++, used to be incompatible with GCC.
-	    # ICC 10 doesn't accept -KPIC any more.
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	    ;;
-	  pgCC* | pgcpp*)
-	    # Portland Group C++ compiler
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  cxx*)
-	    # Compaq C++
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
-	    # IBM XL 8.0, 9.0 on PPC and BlueGene
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-      lynxos*)
-	;;
-      m88k*)
-	;;
-      mvs*)
-	case $cc_basename in
-	  cxx*)
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      netbsd*)
-	;;
-      *qnx* | *nto*)
-        # QNX uses GNU C++, but need to define -shared option too, otherwise
-        # it will coredump.
-        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-        ;;
-      osf3* | osf4* | osf5*)
-	case $cc_basename in
-	  KCC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    ;;
-	  RCC*)
-	    # Rational C++ 2.4.1
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  cxx*)
-	    # Digital/Compaq C++
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      psos*)
-	;;
-      solaris*)
-	case $cc_basename in
-	  CC* | sunCC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	    ;;
-	  gcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sunos4*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.x
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  lcc*)
-	    # Lucid
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	esac
-	;;
-      tandem*)
-	case $cc_basename in
-	  NCC*)
-	    # NonStop-UX NCC 3.20
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      vxworks*)
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-	;;
-    esac
-  fi
-],
-[
-  if test "$GCC" = yes; then
-    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)=
-      ;;
-
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	# +Z the default
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-
-    interix[[3-9]]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      enable_shared=no
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-
-    *)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-
-    case $cc_basename in
-    nvcc*) # Cuda Compiler Driver 2.2
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Xcompiler -fPIC'
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      else
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC (with -KPIC) is the default.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
-      case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
-      ecc*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-        ;;
-      # icc used to be incompatible with GCC.
-      # ICC 10 doesn't accept -KPIC any more.
-      icc* | ifort*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-        ;;
-      # Lahey Fortran 8.1.
-      lf95*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
-	;;
-      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-        ;;
-      ccc*)
-        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-        # All Alpha code is PIC.
-        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-        ;;
-      xl* | bgxl* | bgf* | mpixl*)
-	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
-	;;
-      *)
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ F* | *Sun*Fortran*)
-	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
-	  ;;
-	*Sun\ C*)
-	  # Sun C 5.9
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	  ;;
-	esac
-	;;
-      esac
-      ;;
-
-    newsos6)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-
-    osf3* | osf4* | osf5*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # All OSF/1 code is PIC.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    rdos*)
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    solaris*)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    unicos*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-
-    uts4*)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    *)
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-    esac
-  fi
-])
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-    ;;
-  *)
-    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
-    ;;
-esac
-AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
-_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
-	[How to pass a linker flag through the compiler])
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
-  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
-    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
-    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
-    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
-     "" | " "*) ;;
-     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
-     esac],
-    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
-     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
-fi
-_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
-	[Additional compiler flags for building library objects])
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
-_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
-  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
-  $lt_tmp_static_flag,
-  [],
-  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
-_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
-	[Compiler flag to prevent dynamic linking])
-])# _LT_COMPILER_PIC
-
-
-# _LT_LINKER_SHLIBS([TAGNAME])
-# ----------------------------
-# See if the linker supports building shared libraries.
-m4_defun([_LT_LINKER_SHLIBS],
-[AC_REQUIRE([LT_PATH_LD])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-m4_if([$1], [CXX], [
-  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  case $host_os in
-  aix[[4-9]]*)
-    # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    # Also, AIX nm treats weak defined symbols like other global defined
-    # symbols, whereas GNU nm marks them as "W".
-    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    else
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    fi
-    ;;
-  pw32*)
-    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
-  ;;
-  cygwin* | mingw* | cegcc*)
-    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  *)
-    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  esac
-  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
-], [
-  runpath_var=
-  _LT_TAGVAR(allow_undefined_flag, $1)=
-  _LT_TAGVAR(always_export_symbols, $1)=no
-  _LT_TAGVAR(archive_cmds, $1)=
-  _LT_TAGVAR(archive_expsym_cmds, $1)=
-  _LT_TAGVAR(compiler_needs_object, $1)=no
-  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
-  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  _LT_TAGVAR(hardcode_automatic, $1)=no
-  _LT_TAGVAR(hardcode_direct, $1)=no
-  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
-  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-  _LT_TAGVAR(hardcode_libdir_separator, $1)=
-  _LT_TAGVAR(hardcode_minus_L, $1)=no
-  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  _LT_TAGVAR(inherit_rpath, $1)=no
-  _LT_TAGVAR(link_all_deplibs, $1)=unknown
-  _LT_TAGVAR(module_cmds, $1)=
-  _LT_TAGVAR(module_expsym_cmds, $1)=
-  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
-  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
-  _LT_TAGVAR(thread_safe_flag_spec, $1)=
-  _LT_TAGVAR(whole_archive_flag_spec, $1)=
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  _LT_TAGVAR(include_expsyms, $1)=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  # Exclude shared library initialization/finalization symbols.
-dnl Note also adjust exclude_expsyms for C++ above.
-  extract_expsyms_cmds=
-
-  case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  esac
-
-  _LT_TAGVAR(ld_shlibs, $1)=yes
-
-  # On some targets, GNU ld is compatible enough with the native linker
-  # that we're better off using the native interface for both.
-  lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
-    case $host_os in
-      aix*)
-	# The AIX port of GNU ld has always aspired to compatibility
-	# with the native linker.  However, as the warning in the GNU ld
-	# block says, versions before 2.19.5* couldn't really create working
-	# shared libraries, regardless of the interface used.
-	case `$LD -v 2>&1` in
-	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
-	  *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
-	  *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
-	  *)
-	    lt_use_gnu_ld_interface=yes
-	    ;;
-	esac
-	;;
-      *)
-	lt_use_gnu_ld_interface=yes
-	;;
-    esac
-  fi
-
-  if test "$lt_use_gnu_ld_interface" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      _LT_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>&1` in
-      *GNU\ gold*) supports_anon_versioning=yes ;;
-      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[[3-9]]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.19, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to install binutils
-*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
-*** You will then need to restart the configuration process.
-
-_LT_EOF
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            _LT_TAGVAR(archive_expsym_cmds, $1)=''
-        ;;
-      m68k)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes
-        ;;
-      esac
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-      # as there is no search path for DLLs.
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(always_export_symbols, $1)=no
-      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
-
-      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    haiku*)
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    interix[[3-9]]*)
-      _LT_TAGVAR(hardcode_direct, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
-	case $cc_basename in
-	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
-	esac
-      fi
-      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
-      then
-	tmp_addflag=
-	tmp_sharedflag='-shared'
-	case $cc_basename,$host_cpu in
-        pgcc*)				# Portland Group C compiler
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95* | pgfortran*)
-					# Portland Group f77 and f90 compilers
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	lf95*)				# Lahey Fortran 8.1
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
-	  tmp_sharedflag='--shared' ;;
-	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
-	  tmp_sharedflag='-qmkshrobj'
-	  tmp_addflag= ;;
-	nvcc*)	# Cuda Compiler Driver 2.2
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  _LT_TAGVAR(compiler_needs_object, $1)=yes
-	  ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  _LT_TAGVAR(compiler_needs_object, $1)=yes
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	esac
-	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-        if test "x$supports_anon_versioning" = xyes; then
-          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-        fi
-
-	case $cc_basename in
-	xlf* | bgf* | bgxlf* | mpixlf*)
-	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-	  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
-	  fi
-	  ;;
-	esac
-      else
-        _LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  # For security reasons, it is highly recommended that you always
-	  # use absolute paths for naming shared libraries, and exclude the
-	  # DT_RUNPATH tag from executables and libraries.  But doing so
-	  # requires that you compile everything twice, which is a pain.
-	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  else
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-    esac
-
-    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
-      runpath_var=
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
-      _LT_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(always_export_symbols, $1)=yes
-      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	_LT_TAGVAR(hardcode_direct, $1)=unsupported
-      fi
-      ;;
-
-    aix[[4-9]]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
-	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	else
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
-	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-	    aix_use_runtimelinking=yes
-	    break
-	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      _LT_TAGVAR(archive_cmds, $1)=''
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[[012]]|aix4.[[012]].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	  # We have reworked collect2
-	  :
-	  else
-	  # We have old collect2
-	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      _LT_TAGVAR(always_export_symbols, $1)=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
-        # Determine the default libpath from the value encoded in an
-        # empty executable.
-        _LT_SYS_MODULE_PATH_AIX
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-      else
-	if test "$host_cpu" = ia64; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an
-	 # empty executable.
-	 _LT_SYS_MODULE_PATH_AIX
-	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
-	    # We only use this code for GNU lds that support --whole-archive.
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	  else
-	    # Exported symbols can be pulled into shared objects from archives
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	  fi
-	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            _LT_TAGVAR(archive_expsym_cmds, $1)=''
-        ;;
-      m68k)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes
-        ;;
-      esac
-      ;;
-
-    bsdi[[45]]*)
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
-      # FIXME: Should let the user specify the lib program.
-      _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
-      _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
-      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      ;;
-
-    darwin* | rhapsody*)
-      _LT_DARWIN_LINKER_FEATURES($1)
-      ;;
-
-    dgux*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    freebsd1*)
-      _LT_TAGVAR(ld_shlibs, $1)=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
-	_LT_TAGVAR(hardcode_direct, $1)=yes
-	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	_LT_TAGVAR(hardcode_minus_L, $1)=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	m4_if($1, [], [
-	  # Older versions of the 11.00 compiler do not understand -b yet
-	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
-	  _LT_LINKER_OPTION([if $CC understands -b],
-	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
-	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
-	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
-	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  _LT_TAGVAR(hardcode_direct, $1)=no
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	  ;;
-	*)
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	# Try to use the -exported_symbol ld option, if it does not
-	# work, assume that -exports_file does not work either and
-	# implicitly export all symbols.
-        save_LDFLAGS="$LDFLAGS"
-        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-        AC_LINK_IFELSE(int foo(void) {},
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-        )
-        LDFLAGS="$save_LDFLAGS"
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(inherit_rpath, $1)=yes
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    newsos6)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *nto* | *qnx*)
-      ;;
-
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	_LT_TAGVAR(hardcode_direct, $1)=yes
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	else
-	  case $host_os in
-	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
-	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	     ;;
-	   *)
-	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-	fi
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    os2*)
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      else
-	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    solaris*)
-      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-      else
-	case `$CC -V 2>&1` in
-	*"Compilers 5.0"*)
-	  wlarc=''
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
-	  ;;
-	*)
-	  wlarc='${wl}'
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-	  ;;
-	esac
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      case $host_os in
-      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
-	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
-	  _LT_TAGVAR(hardcode_direct, $1)=no
-        ;;
-	motorola)
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4.3*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	_LT_TAGVAR(ld_shlibs, $1)=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      _LT_TAGVAR(ld_shlibs, $1)=no
-      ;;
-    esac
-
-    if test x$host_vendor = xsni; then
-      case $host in
-      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
-	;;
-      esac
-    fi
-  fi
-])
-AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
-
-_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
-_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
-_LT_DECL([], [extract_expsyms_cmds], [2],
-    [The commands to extract the exported symbol list from a shared archive])
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
-x|xyes)
-  # Assume -lc should be added
-  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $_LT_TAGVAR(archive_cmds, $1) in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      AC_CACHE_CHECK([whether -lc should be explicitly linked in],
-	[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
-	[$RM conftest*
-	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-	if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
-	  soname=conftest
-	  lib=conftest
-	  libobjs=conftest.$ac_objext
-	  deplibs=
-	  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
-	  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
-	  compiler_flags=-v
-	  linker_flags=-v
-	  verstring=
-	  output_objdir=.
-	  libname=conftest
-	  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
-	  _LT_TAGVAR(allow_undefined_flag, $1)=
-	  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
-	  then
-	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	  else
-	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	  fi
-	  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
-	else
-	  cat conftest.err 1>&5
-	fi
-	$RM conftest*
-	])
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
-    [Whether or not to add -lc for building shared libraries])
-_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
-    [enable_shared_with_static_runtimes], [0],
-    [Whether or not to disallow shared libs when runtime libs are static])
-_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
-    [Compiler flag to allow reflexive dlopens])
-_LT_TAGDECL([], [whole_archive_flag_spec], [1],
-    [Compiler flag to generate shared objects directly from archives])
-_LT_TAGDECL([], [compiler_needs_object], [1],
-    [Whether the compiler copes with passing no objects directly])
-_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
-    [Create an old-style archive from a shared archive])
-_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
-    [Create a temporary old-style archive to link instead of a shared archive])
-_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
-_LT_TAGDECL([], [archive_expsym_cmds], [2])
-_LT_TAGDECL([], [module_cmds], [2],
-    [Commands used to build a loadable module if different from building
-    a shared archive.])
-_LT_TAGDECL([], [module_expsym_cmds], [2])
-_LT_TAGDECL([], [with_gnu_ld], [1],
-    [Whether we are building with GNU ld or not])
-_LT_TAGDECL([], [allow_undefined_flag], [1],
-    [Flag that allows shared libraries with undefined symbols to be built])
-_LT_TAGDECL([], [no_undefined_flag], [1],
-    [Flag that enforces no undefined symbols])
-_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
-    [Flag to hardcode $libdir into a binary during linking.
-    This must work even if $libdir does not exist])
-_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1],
-    [[If ld is used when linking, flag to hardcode $libdir into a binary
-    during linking.  This must work even if $libdir does not exist]])
-_LT_TAGDECL([], [hardcode_libdir_separator], [1],
-    [Whether we need a single "-rpath" flag with a separated argument])
-_LT_TAGDECL([], [hardcode_direct], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
-    DIR into the resulting binary])
-_LT_TAGDECL([], [hardcode_direct_absolute], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
-    DIR into the resulting binary and the resulting library dependency is
-    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
-    library is relocated])
-_LT_TAGDECL([], [hardcode_minus_L], [0],
-    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-    into the resulting binary])
-_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
-    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-    into the resulting binary])
-_LT_TAGDECL([], [hardcode_automatic], [0],
-    [Set to "yes" if building a shared library automatically hardcodes DIR
-    into the library and all subsequent libraries and executables linked
-    against it])
-_LT_TAGDECL([], [inherit_rpath], [0],
-    [Set to yes if linker adds runtime paths of dependent libraries
-    to runtime path list])
-_LT_TAGDECL([], [link_all_deplibs], [0],
-    [Whether libtool must link a program against all its dependency libraries])
-_LT_TAGDECL([], [fix_srcfile_path], [1],
-    [Fix the shell variable $srcfile for the compiler])
-_LT_TAGDECL([], [always_export_symbols], [0],
-    [Set to "yes" if exported symbols are required])
-_LT_TAGDECL([], [export_symbols_cmds], [2],
-    [The commands to list exported symbols])
-_LT_TAGDECL([], [exclude_expsyms], [1],
-    [Symbols that should not be listed in the preloaded symbols])
-_LT_TAGDECL([], [include_expsyms], [1],
-    [Symbols that must always be exported])
-_LT_TAGDECL([], [prelink_cmds], [2],
-    [Commands necessary for linking programs (against libraries) with templates])
-_LT_TAGDECL([], [file_list_spec], [1],
-    [Specify filename containing input files])
-dnl FIXME: Not yet implemented
-dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
-dnl    [Compiler flag to generate thread safe objects])
-])# _LT_LINKER_SHLIBS
-
-
-# _LT_LANG_C_CONFIG([TAG])
-# ------------------------
-# Ensure that the configuration variables for a C compiler are suitably
-# defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_C_CONFIG],
-[m4_require([_LT_DECL_EGREP])dnl
-lt_save_CC="$CC"
-AC_LANG_PUSH(C)
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-_LT_TAG_COMPILER
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-  _LT_COMPILER_NO_RTTI($1)
-  _LT_COMPILER_PIC($1)
-  _LT_COMPILER_C_O($1)
-  _LT_COMPILER_FILE_LOCKS($1)
-  _LT_LINKER_SHLIBS($1)
-  _LT_SYS_DYNAMIC_LINKER($1)
-  _LT_LINKER_HARDCODE_LIBPATH($1)
-  LT_SYS_DLOPEN_SELF
-  _LT_CMD_STRIPLIB
-
-  # Report which library types will actually be built
-  AC_MSG_CHECKING([if libtool supports shared libraries])
-  AC_MSG_RESULT([$can_build_shared])
-
-  AC_MSG_CHECKING([whether to build shared libraries])
-  test "$can_build_shared" = "no" && enable_shared=no
-
-  # On AIX, shared libraries and static libraries use the same namespace, and
-  # are all built from PIC.
-  case $host_os in
-  aix3*)
-    test "$enable_shared" = yes && enable_static=no
-    if test -n "$RANLIB"; then
-      archive_cmds="$archive_cmds~\$RANLIB \$lib"
-      postinstall_cmds='$RANLIB $lib'
-    fi
-    ;;
-
-  aix[[4-9]]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
-    fi
-    ;;
-  esac
-  AC_MSG_RESULT([$enable_shared])
-
-  AC_MSG_CHECKING([whether to build static libraries])
-  # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
-  AC_MSG_RESULT([$enable_static])
-
-  _LT_CONFIG($1)
-fi
-AC_LANG_POP
-CC="$lt_save_CC"
-])# _LT_LANG_C_CONFIG
-
-
-# _LT_LANG_CXX_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for a C++ compiler are suitably
-# defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_CXX_CONFIG],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_EGREP])dnl
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
-  AC_PROG_CXXCPP
-else
-  _lt_caught_CXX_error=yes
-fi
-
-AC_LANG_PUSH(C++)
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(compiler_needs_object, $1)=no
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for C++ test sources.
-ac_ext=cpp
-
-# Object file extension for compiled C++ test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the CXX compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="int some_variable = 0;"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC=$CC
-  lt_save_LD=$LD
-  lt_save_GCC=$GCC
-  GCC=$GXX
-  lt_save_with_gnu_ld=$with_gnu_ld
-  lt_save_path_LD=$lt_cv_path_LD
-  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
-    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
-  else
-    $as_unset lt_cv_prog_gnu_ld
-  fi
-  if test -n "${lt_cv_path_LDCXX+set}"; then
-    lt_cv_path_LD=$lt_cv_path_LDCXX
-  else
-    $as_unset lt_cv_path_LD
-  fi
-  test -z "${LDCXX+set}" || LD=$LDCXX
-  CC=${CXX-"c++"}
-  compiler=$CC
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-
-  if test -n "$compiler"; then
-    # We don't want -fno-exception when compiling C++ code, so set the
-    # no_builtin_flag separately
-    if test "$GXX" = yes; then
-      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
-    else
-      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-    fi
-
-    if test "$GXX" = yes; then
-      # Set up default GNU C++ configuration
-
-      LT_PATH_LD
-
-      # Check if GNU C++ uses GNU ld as the underlying linker, since the
-      # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-        # If archive_cmds runs LD, not CC, wlarc should be empty
-        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
-        #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
-
-        # ancient GNU ld didn't support --whole-archive et. al.
-        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
-	  $GREP 'no-whole-archive' > /dev/null; then
-          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-        else
-          _LT_TAGVAR(whole_archive_flag_spec, $1)=
-        fi
-      else
-        with_gnu_ld=no
-        wlarc=
-
-        # A generic and very simple default shared library creation
-        # command for GNU C++ for the case where it uses the native
-        # linker, instead of GNU ld.  If possible, this setting should
-        # overridden to take advantage of the native linker features on
-        # the platform it is being used on.
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-      fi
-
-      # Commands to make compiler produce verbose output that lists
-      # what "hidden" libraries, object files and flags are used when
-      # linking a shared library.
-      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
-    else
-      GXX=no
-      with_gnu_ld=no
-      wlarc=
-    fi
-
-    # PORTME: fill in a description of your system's C++ link characteristics
-    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-    _LT_TAGVAR(ld_shlibs, $1)=yes
-    case $host_os in
-      aix3*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-      aix[[4-9]]*)
-        if test "$host_cpu" = ia64; then
-          # On IA64, the linker does run time linking by default, so we don't
-          # have to do anything special.
-          aix_use_runtimelinking=no
-          exp_sym_flag='-Bexport'
-          no_entry_flag=""
-        else
-          aix_use_runtimelinking=no
-
-          # Test if we are trying to use run time linking or normal
-          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
-          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
-	    for ld_flag in $LDFLAGS; do
-	      case $ld_flag in
-	      *-brtl*)
-	        aix_use_runtimelinking=yes
-	        break
-	        ;;
-	      esac
-	    done
-	    ;;
-          esac
-
-          exp_sym_flag='-bexport'
-          no_entry_flag='-bnoentry'
-        fi
-
-        # When large executables or shared objects are built, AIX ld can
-        # have problems creating the table of contents.  If linking a library
-        # or program results in "error TOC overflow" add -mminimal-toc to
-        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-        _LT_TAGVAR(archive_cmds, $1)=''
-        _LT_TAGVAR(hardcode_direct, $1)=yes
-        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-        _LT_TAGVAR(link_all_deplibs, $1)=yes
-        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
-
-        if test "$GXX" = yes; then
-          case $host_os in aix4.[[012]]|aix4.[[012]].*)
-          # We only want to do this on AIX 4.2 and lower, the check
-          # below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	    # We have reworked collect2
-	    :
-	  else
-	    # We have old collect2
-	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
-	    # It fails to find uninstalled libraries when the uninstalled
-	    # path is not listed in the libpath.  Setting hardcode_minus_L
-	    # to unsupported forces relinking
-	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
-	  fi
-          esac
-          shared_flag='-shared'
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag="$shared_flag "'${wl}-G'
-	  fi
-        else
-          # not using gcc
-          if test "$host_cpu" = ia64; then
-	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	  # chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-          else
-	    if test "$aix_use_runtimelinking" = yes; then
-	      shared_flag='${wl}-G'
-	    else
-	      shared_flag='${wl}-bM:SRE'
-	    fi
-          fi
-        fi
-
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
-        # It seems that -bexpall does not export symbols beginning with
-        # underscore (_), so it is better to generate a list of symbols to
-	# export.
-        _LT_TAGVAR(always_export_symbols, $1)=yes
-        if test "$aix_use_runtimelinking" = yes; then
-          # Warning - without using the other runtime loading flags (-brtl),
-          # -berok will link without error, but may produce a broken library.
-          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
-          # Determine the default libpath from the value encoded in an empty
-          # executable.
-          _LT_SYS_MODULE_PATH_AIX
-          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-        else
-          if test "$host_cpu" = ia64; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-          else
-	    # Determine the default libpath from the value encoded in an
-	    # empty executable.
-	    _LT_SYS_MODULE_PATH_AIX
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	    # Warning - without using the other run time loading flags,
-	    # -berok will link without error, but may produce a broken library.
-	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	    if test "$with_gnu_ld" = yes; then
-	      # We only use this code for GNU lds that support --whole-archive.
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    else
-	      # Exported symbols can be pulled into shared objects from archives
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	    fi
-	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	    # This is similar to how AIX traditionally builds its shared
-	    # libraries.
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-          fi
-        fi
-        ;;
-
-      beos*)
-	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	  # support --undefined.  This deserves some investigation.  FIXME
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	else
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-
-      chorus*)
-        case $cc_basename in
-          *)
-	  # FIXME: insert proper C++ library support
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	  ;;
-        esac
-        ;;
-
-      cygwin* | mingw* | pw32* | cegcc*)
-        # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-        # as there is no search path for DLLs.
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
-        _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-        _LT_TAGVAR(always_export_symbols, $1)=no
-        _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-
-        if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-          # If the export-symbols file already is a .def file (1st line
-          # is EXPORTS), use it as is; otherwise, prepend...
-          _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    cp $export_symbols $output_objdir/$soname.def;
-          else
-	    echo EXPORTS > $output_objdir/$soname.def;
-	    cat $export_symbols >> $output_objdir/$soname.def;
-          fi~
-          $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-        else
-          _LT_TAGVAR(ld_shlibs, $1)=no
-        fi
-        ;;
-      darwin* | rhapsody*)
-        _LT_DARWIN_LINKER_FEATURES($1)
-	;;
-
-      dgux*)
-        case $cc_basename in
-          ec++*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          ghcx*)
-	    # Green Hills C++ Compiler
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      freebsd[[12]]*)
-        # C++ shared libraries reported to be fairly broken before
-	# switch to ELF
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      freebsd-elf*)
-        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-        ;;
-
-      freebsd* | dragonfly*)
-        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
-        # conventions
-        _LT_TAGVAR(ld_shlibs, $1)=yes
-        ;;
-
-      gnu*)
-        ;;
-
-      haiku*)
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        _LT_TAGVAR(link_all_deplibs, $1)=yes
-        ;;
-
-      hpux9*)
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-        _LT_TAGVAR(hardcode_direct, $1)=yes
-        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-				             # but as the default
-				             # location of the library.
-
-        case $cc_basename in
-          CC*)
-            # FIXME: insert proper C++ library support
-            _LT_TAGVAR(ld_shlibs, $1)=no
-            ;;
-          aCC*)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            # Commands to make compiler produce verbose output that lists
-            # what "hidden" libraries, object files and flags are used when
-            # linking a shared library.
-            #
-            # There doesn't appear to be a way to prevent this compiler from
-            # explicitly linking system object files so we need to strip them
-            # from the output so that they don't get included in the library
-            # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-            ;;
-          *)
-            if test "$GXX" = yes; then
-              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            else
-              # FIXME: insert proper C++ library support
-              _LT_TAGVAR(ld_shlibs, $1)=no
-            fi
-            ;;
-        esac
-        ;;
-
-      hpux10*|hpux11*)
-        if test $with_gnu_ld = no; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-          case $host_cpu in
-            hppa*64*|ia64*)
-              ;;
-            *)
-	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-              ;;
-          esac
-        fi
-        case $host_cpu in
-          hppa*64*|ia64*)
-            _LT_TAGVAR(hardcode_direct, $1)=no
-            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-            ;;
-          *)
-            _LT_TAGVAR(hardcode_direct, $1)=yes
-            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-					         # but as the default
-					         # location of the library.
-            ;;
-        esac
-
-        case $cc_basename in
-          CC*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          aCC*)
-	    case $host_cpu in
-	      hppa*64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      ia64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      *)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	    esac
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test $with_gnu_ld = no; then
-	        case $host_cpu in
-	          hppa*64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          ia64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          *)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	        esac
-	      fi
-	    else
-	      # FIXME: insert proper C++ library support
-	      _LT_TAGVAR(ld_shlibs, $1)=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      interix[[3-9]]*)
-	_LT_TAGVAR(hardcode_direct, $1)=no
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-	# Instead, shared libraries are loaded at an image base (0x10000000 by
-	# default) and relocated if they conflict, which is a slow very memory
-	# consuming and fragmenting process.  To avoid this, we pick a random,
-	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	;;
-      irix5* | irix6*)
-        case $cc_basename in
-          CC*)
-	    # SGI C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test "$with_gnu_ld" = no; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	      else
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
-	      fi
-	    fi
-	    _LT_TAGVAR(link_all_deplibs, $1)=yes
-	    ;;
-        esac
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(inherit_rpath, $1)=yes
-        ;;
-
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
-	    ;;
-	  icpc* | ecpc* )
-	    # Intel C++
-	    with_gnu_ld=yes
-	    # version 8.0 and above of icpc choke on multiply defined symbols
-	    # if we add $predep_objects and $postdep_objects, however 7.1 and
-	    # earlier do not add the objects themselves.
-	    case `$CC -V 2>&1` in
-	      *"Version 7."*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	      *)  # Version 8.0 or newer
-	        tmp_idyn=
-	        case $host_cpu in
-		  ia64*) tmp_idyn=' -i_dynamic';;
-		esac
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	    esac
-	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    ;;
-          pgCC* | pgcpp*)
-            # Portland Group C++ compiler
-	    case `$CC -V` in
-	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
-	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
-	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
-		$RANLIB $oldlib'
-	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    *) # Version 6 and above use weak symbols
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    esac
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-            ;;
-	  cxx*)
-	    # Compaq C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
-
-	    runpath_var=LD_RUN_PATH
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
-	    ;;
-	  xl* | mpixl* | bgxl*)
-	    # IBM XL 8.0 on PPC, with GNU ld
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    if test "x$supports_anon_versioning" = xyes; then
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-		echo "local: *; };" >> $output_objdir/$libname.ver~
-		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-	    fi
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	      _LT_TAGVAR(compiler_needs_object, $1)=yes
-
-	      # Not sure whether something based on
-	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
-	      # would be better.
-	      output_verbose_link_cmd='func_echo_all'
-
-	      # Archives containing C++ object files must be created using
-	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	      # necessary to make sure instantiated templates are included
-	      # in the archive.
-	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-
-      lynxos*)
-        # FIXME: insert proper C++ library support
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      m88k*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      mvs*)
-        case $cc_basename in
-          cxx*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-	  *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-	esac
-	;;
-
-      netbsd*)
-        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
-	  wlarc=
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	fi
-	# Workaround some broken pre-1.5 toolchains
-	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
-	;;
-
-      *nto* | *qnx*)
-        _LT_TAGVAR(ld_shlibs, $1)=yes
-	;;
-
-      openbsd2*)
-        # C++ shared libraries are fairly broken
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      openbsd*)
-	if test -f /usr/libexec/ld.so; then
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-	  fi
-	  output_verbose_link_cmd=func_echo_all
-	else
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-
-      osf3* | osf4* | osf5*)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Archives containing C++ object files must be created using
-	    # the KAI C++ compiler.
-	    case $host in
-	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
-	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
-	    esac
-	    ;;
-          RCC*)
-	    # Rational C++ 2.4.1
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          cxx*)
-	    case $host in
-	      osf3*)
-	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-		;;
-	      *)
-	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	          echo "-hidden">> $lib.exp~
-	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
-	          $RM $lib.exp'
-	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-		;;
-	    esac
-
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-	    ;;
-	  *)
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	      case $host in
-	        osf3*)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	        *)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	      esac
-
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	      # Commands to make compiler produce verbose output that lists
-	      # what "hidden" libraries, object files and flags are used when
-	      # linking a shared library.
-	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
-	    else
-	      # FIXME: insert proper C++ library support
-	      _LT_TAGVAR(ld_shlibs, $1)=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      psos*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      sunos4*)
-        case $cc_basename in
-          CC*)
-	    # Sun C++ 4.x
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          lcc*)
-	    # Lucid
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      solaris*)
-        case $cc_basename in
-          CC* | sunCC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
-	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	    case $host_os in
-	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-	      *)
-		# The compiler driver will combine and reorder linker options,
-		# but understands `-z linker_flag'.
-	        # Supported since Solaris 2.6 (maybe 2.5.1?)
-		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
-	        ;;
-	    esac
-	    _LT_TAGVAR(link_all_deplibs, $1)=yes
-
-	    output_verbose_link_cmd='func_echo_all'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
-	    ;;
-          gcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-
-	    # The C++ compiler must be used to create the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    # GNU C++ compiler with Solaris linker
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
-	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-	      else
-	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
-	        # platform.
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-	      fi
-
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
-	      case $host_os in
-		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-		*)
-		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-		  ;;
-	      esac
-	    fi
-	    ;;
-        esac
-        ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      runpath_var='LD_RUN_PATH'
-
-      case $cc_basename in
-        CC*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-      esac
-      ;;
-
-      sysv5* | sco3.2v5* | sco5v6*)
-	# Note: We can NOT use -z defs as we might desire, because we do not
-	# link with -lc, and that would cause any symbols used from libc to
-	# always be unresolved, which means just about no library would
-	# ever link correctly.  If we're not using GNU ld we use -z text
-	# though, which does catch some bad symbols but isn't as heavy-handed
-	# as -z defs.
-	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-	_LT_TAGVAR(link_all_deplibs, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-	runpath_var='LD_RUN_PATH'
-
-	case $cc_basename in
-          CC*)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
-	      '"$_LT_TAGVAR(old_archive_cmds, $1)"
-	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
-	      '"$_LT_TAGVAR(reload_cmds, $1)"
-	    ;;
-	  *)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    ;;
-	esac
-      ;;
-
-      tandem*)
-        case $cc_basename in
-          NCC*)
-	    # NonStop-UX NCC 3.20
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      vxworks*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      *)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-    esac
-
-    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-    _LT_TAGVAR(GCC, $1)="$GXX"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_SYS_HIDDEN_LIBDEPS($1)
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  CC=$lt_save_CC
-  LDCXX=$LD
-  LD=$lt_save_LD
-  GCC=$lt_save_GCC
-  with_gnu_ld=$lt_save_with_gnu_ld
-  lt_cv_path_LDCXX=$lt_cv_path_LD
-  lt_cv_path_LD=$lt_save_path_LD
-  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
-  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
-
-AC_LANG_POP
-])# _LT_LANG_CXX_CONFIG
-
-
-# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
-# ---------------------------------
-# Figure out "hidden" library dependencies from verbose
-# compiler output when linking a shared library.
-# Parse the compiler output and extract the necessary
-# objects, libraries and library flags.
-m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-# Dependencies to place before and after the object being linked:
-_LT_TAGVAR(predep_objects, $1)=
-_LT_TAGVAR(postdep_objects, $1)=
-_LT_TAGVAR(predeps, $1)=
-_LT_TAGVAR(postdeps, $1)=
-_LT_TAGVAR(compiler_lib_search_path, $1)=
-
-dnl we can't use the lt_simple_compile_test_code here,
-dnl because it contains code intended for an executable,
-dnl not a library.  It's possible we should let each
-dnl tag define a new lt_????_link_test_code variable,
-dnl but it's only used here...
-m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
-int a;
-void foo (void) { a = 0; }
-_LT_EOF
-], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
-class Foo
-{
-public:
-  Foo (void) { a = 0; }
-private:
-  int a;
-};
-_LT_EOF
-], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
-      subroutine foo
-      implicit none
-      integer*4 a
-      a=0
-      return
-      end
-_LT_EOF
-], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
-      subroutine foo
-      implicit none
-      integer a
-      a=0
-      return
-      end
-_LT_EOF
-], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
-public class foo {
-  private int a;
-  public void bar (void) {
-    a = 0;
-  }
-};
-_LT_EOF
-])
-dnl Parse the compiler output and extract the necessary
-dnl objects, libraries and library flags.
-if AC_TRY_EVAL(ac_compile); then
-  # Parse the compiler output and extract the necessary
-  # objects, libraries and library flags.
-
-  # Sentinel used to keep track of whether or not we are before
-  # the conftest object file.
-  pre_test_object_deps_done=no
-
-  for p in `eval "$output_verbose_link_cmd"`; do
-    case $p in
-
-    -L* | -R* | -l*)
-       # Some compilers place space between "-{L,R}" and the path.
-       # Remove the space.
-       if test $p = "-L" ||
-          test $p = "-R"; then
-	 prev=$p
-	 continue
-       else
-	 prev=
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 case $p in
-	 -L* | -R*)
-	   # Internal compiler library paths should come after those
-	   # provided the user.  The postdeps already come after the
-	   # user supplied libs so there is no need to process them.
-	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
-	   else
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
-	   fi
-	   ;;
-	 # The "-l" case would never come before the object being
-	 # linked, so don't bother handling this case.
-	 esac
-       else
-	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
-	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
-	 else
-	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
-	 fi
-       fi
-       ;;
-
-    *.$objext)
-       # This assumes that the test object file only shows up
-       # once in the compiler output.
-       if test "$p" = "conftest.$objext"; then
-	 pre_test_object_deps_done=yes
-	 continue
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
-	   _LT_TAGVAR(predep_objects, $1)="$p"
-	 else
-	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
-	 fi
-       else
-	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
-	   _LT_TAGVAR(postdep_objects, $1)="$p"
-	 else
-	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
-	 fi
-       fi
-       ;;
-
-    *) ;; # Ignore the rest.
-
-    esac
-  done
-
-  # Clean up.
-  rm -f a.out a.exe
-else
-  echo "libtool.m4: error: problem compiling $1 test program"
-fi
-
-$RM -f confest.$objext
-
-# PORTME: override above test on systems where it is broken
-m4_if([$1], [CXX],
-[case $host_os in
-interix[[3-9]]*)
-  # Interix 3.5 installs completely hosed .la files for C++, so rather than
-  # hack all around it, let's just trust "g++" to DTRT.
-  _LT_TAGVAR(predep_objects,$1)=
-  _LT_TAGVAR(postdep_objects,$1)=
-  _LT_TAGVAR(postdeps,$1)=
-  ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC* | sunCC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-esac
-])
-
-case " $_LT_TAGVAR(postdeps, $1) " in
-*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
-esac
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=
-if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
-fi
-_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
-    [The directories searched by this compiler when creating a shared library])
-_LT_TAGDECL([], [predep_objects], [1],
-    [Dependencies to place before and after the objects being linked to
-    create a shared library])
-_LT_TAGDECL([], [postdep_objects], [1])
-_LT_TAGDECL([], [predeps], [1])
-_LT_TAGDECL([], [postdeps], [1])
-_LT_TAGDECL([], [compiler_lib_search_path], [1],
-    [The library search path used internally by the compiler when linking
-    a shared library])
-])# _LT_SYS_HIDDEN_LIBDEPS
-
-
-# _LT_LANG_F77_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for a Fortran 77 compiler are
-# suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_F77_CONFIG],
-[AC_LANG_PUSH(Fortran 77)
-if test -z "$F77" || test "X$F77" = "Xno"; then
-  _lt_disable_F77=yes
-fi
-
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for f77 test sources.
-ac_ext=f
-
-# Object file extension for compiled f77 test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the F77 compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_F77" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="\
-      subroutine t
-      return
-      end
-"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code="\
-      program t
-      end
-"
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
-  lt_save_GCC=$GCC
-  CC=${F77-"f77"}
-  compiler=$CC
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-  GCC=$G77
-  if test -n "$compiler"; then
-    AC_MSG_CHECKING([if libtool supports shared libraries])
-    AC_MSG_RESULT([$can_build_shared])
-
-    AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
-
-    # On AIX, shared libraries and static libraries use the same namespace, and
-    # are all built from PIC.
-    case $host_os in
-      aix3*)
-        test "$enable_shared" = yes && enable_static=no
-        if test -n "$RANLIB"; then
-          archive_cmds="$archive_cmds~\$RANLIB \$lib"
-          postinstall_cmds='$RANLIB $lib'
-        fi
-        ;;
-      aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
-	fi
-        ;;
-    esac
-    AC_MSG_RESULT([$enable_shared])
-
-    AC_MSG_CHECKING([whether to build static libraries])
-    # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
-    AC_MSG_RESULT([$enable_static])
-
-    _LT_TAGVAR(GCC, $1)="$G77"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  GCC=$lt_save_GCC
-  CC="$lt_save_CC"
-fi # test "$_lt_disable_F77" != yes
-
-AC_LANG_POP
-])# _LT_LANG_F77_CONFIG
-
-
-# _LT_LANG_FC_CONFIG([TAG])
-# -------------------------
-# Ensure that the configuration variables for a Fortran compiler are
-# suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_FC_CONFIG],
-[AC_LANG_PUSH(Fortran)
-
-if test -z "$FC" || test "X$FC" = "Xno"; then
-  _lt_disable_FC=yes
-fi
-
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for fc test sources.
-ac_ext=${ac_fc_srcext-f}
-
-# Object file extension for compiled fc test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the FC compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_FC" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="\
-      subroutine t
-      return
-      end
-"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code="\
-      program t
-      end
-"
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
-  lt_save_GCC=$GCC
-  CC=${FC-"f95"}
-  compiler=$CC
-  GCC=$ac_cv_fc_compiler_gnu
-
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-
-  if test -n "$compiler"; then
-    AC_MSG_CHECKING([if libtool supports shared libraries])
-    AC_MSG_RESULT([$can_build_shared])
-
-    AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
-
-    # On AIX, shared libraries and static libraries use the same namespace, and
-    # are all built from PIC.
-    case $host_os in
-      aix3*)
-        test "$enable_shared" = yes && enable_static=no
-        if test -n "$RANLIB"; then
-          archive_cmds="$archive_cmds~\$RANLIB \$lib"
-          postinstall_cmds='$RANLIB $lib'
-        fi
-        ;;
-      aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
-	fi
-        ;;
-    esac
-    AC_MSG_RESULT([$enable_shared])
-
-    AC_MSG_CHECKING([whether to build static libraries])
-    # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
-    AC_MSG_RESULT([$enable_static])
-
-    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_SYS_HIDDEN_LIBDEPS($1)
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  GCC=$lt_save_GCC
-  CC="$lt_save_CC"
-fi # test "$_lt_disable_FC" != yes
-
-AC_LANG_POP
-])# _LT_LANG_FC_CONFIG
-
-
-# _LT_LANG_GCJ_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for the GNU Java Compiler compiler
-# are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_GCJ_CONFIG],
-[AC_REQUIRE([LT_PROG_GCJ])dnl
-AC_LANG_SAVE
-
-# Source file extension for Java test sources.
-ac_ext=java
-
-# Object file extension for compiled Java test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="class foo {}"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-lt_save_GCC=$GCC
-GCC=yes
-CC=${GCJ-"gcj"}
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
-_LT_CC_BASENAME([$compiler])
-
-# GCJ did not exist at the time GCC didn't implicitly link libc in.
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-  _LT_COMPILER_NO_RTTI($1)
-  _LT_COMPILER_PIC($1)
-  _LT_COMPILER_C_O($1)
-  _LT_COMPILER_FILE_LOCKS($1)
-  _LT_LINKER_SHLIBS($1)
-  _LT_LINKER_HARDCODE_LIBPATH($1)
-
-  _LT_CONFIG($1)
-fi
-
-AC_LANG_RESTORE
-
-GCC=$lt_save_GCC
-CC="$lt_save_CC"
-])# _LT_LANG_GCJ_CONFIG
-
-
-# _LT_LANG_RC_CONFIG([TAG])
-# -------------------------
-# Ensure that the configuration variables for the Windows resource compiler
-# are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_RC_CONFIG],
-[AC_REQUIRE([LT_PROG_RC])dnl
-AC_LANG_SAVE
-
-# Source file extension for RC test sources.
-ac_ext=rc
-
-# Object file extension for compiled RC test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
-
-# Code to be used in simple link tests
-lt_simple_link_test_code="$lt_simple_compile_test_code"
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-lt_save_GCC=$GCC
-GCC=
-CC=${RC-"windres"}
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-
-if test -n "$compiler"; then
-  :
-  _LT_CONFIG($1)
-fi
-
-GCC=$lt_save_GCC
-AC_LANG_RESTORE
-CC="$lt_save_CC"
-])# _LT_LANG_RC_CONFIG
-
-
-# LT_PROG_GCJ
-# -----------
-AC_DEFUN([LT_PROG_GCJ],
-[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
-  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
-    [AC_CHECK_TOOL(GCJ, gcj,)
-      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
-      AC_SUBST(GCJFLAGS)])])[]dnl
-])
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
-
-
-# LT_PROG_RC
-# ----------
-AC_DEFUN([LT_PROG_RC],
-[AC_CHECK_TOOL(RC, windres,)
-])
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_RC], [])
-
-
-# _LT_DECL_EGREP
-# --------------
-# If we don't have a new enough Autoconf to choose the best grep
-# available, choose the one first in the user's PATH.
-m4_defun([_LT_DECL_EGREP],
-[AC_REQUIRE([AC_PROG_EGREP])dnl
-AC_REQUIRE([AC_PROG_FGREP])dnl
-test -z "$GREP" && GREP=grep
-_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
-_LT_DECL([], [EGREP], [1], [An ERE matcher])
-_LT_DECL([], [FGREP], [1], [A literal string matcher])
-dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
-AC_SUBST([GREP])
-])
-
-
-# _LT_DECL_OBJDUMP
-# --------------
-# If we don't have a new enough Autoconf to choose the best objdump
-# available, choose the one first in the user's PATH.
-m4_defun([_LT_DECL_OBJDUMP],
-[AC_CHECK_TOOL(OBJDUMP, objdump, false)
-test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
-AC_SUBST([OBJDUMP])
-])
-
-
-# _LT_DECL_SED
-# ------------
-# Check for a fully-functional sed program, that truncates
-# as few characters as possible.  Prefer GNU sed if found.
-m4_defun([_LT_DECL_SED],
-[AC_PROG_SED
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
-_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
-    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
-])# _LT_DECL_SED
-
-m4_ifndef([AC_PROG_SED], [
-############################################################
-# NOTE: This macro has been submitted for inclusion into   #
-#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
-#  a released version of Autoconf we should remove this    #
-#  macro and use it instead.                               #
-############################################################
-
-m4_defun([AC_PROG_SED],
-[AC_MSG_CHECKING([for a sed that does not truncate output])
-AC_CACHE_VAL(lt_cv_path_SED,
-[# Loop through the user's path and test for sed and gsed.
-# Then use that list of sed's as ones to test for truncation.
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for lt_ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
-        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
-      fi
-    done
-  done
-done
-IFS=$as_save_IFS
-lt_ac_max=0
-lt_ac_count=0
-# Add /usr/xpg4/bin/sed as it is typically found on Solaris
-# along with /bin/sed that truncates output.
-for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
-  test ! -f $lt_ac_sed && continue
-  cat /dev/null > conftest.in
-  lt_ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
-  # Check for GNU sed and select it if it is found.
-  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
-    lt_cv_path_SED=$lt_ac_sed
-    break
-  fi
-  while true; do
-    cat conftest.in conftest.in >conftest.tmp
-    mv conftest.tmp conftest.in
-    cp conftest.in conftest.nl
-    echo >>conftest.nl
-    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
-    cmp -s conftest.out conftest.nl || break
-    # 10000 chars as input seems more than enough
-    test $lt_ac_count -gt 10 && break
-    lt_ac_count=`expr $lt_ac_count + 1`
-    if test $lt_ac_count -gt $lt_ac_max; then
-      lt_ac_max=$lt_ac_count
-      lt_cv_path_SED=$lt_ac_sed
-    fi
-  done
-done
-])
-SED=$lt_cv_path_SED
-AC_SUBST([SED])
-AC_MSG_RESULT([$SED])
-])#AC_PROG_SED
-])#m4_ifndef
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_SED], [])
-
-
-# _LT_CHECK_SHELL_FEATURES
-# ------------------------
-# Find out whether the shell is Bourne or XSI compatible,
-# or has some other useful features.
-m4_defun([_LT_CHECK_SHELL_FEATURES],
-[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-AC_MSG_RESULT([$xsi_shell])
-_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
-
-AC_MSG_CHECKING([whether the shell understands "+="])
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-AC_MSG_RESULT([$lt_shell_append])
-_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  lt_unset=unset
-else
-  lt_unset=false
-fi
-_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  lt_SP2NL='tr \040 \012'
-  lt_NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  lt_SP2NL='tr \100 \n'
-  lt_NL2SP='tr \r\n \100\100'
-  ;;
-esac
-_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
-_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
-])# _LT_CHECK_SHELL_FEATURES
-
-
-# _LT_PROG_XSI_SHELLFNS
-# ---------------------
-# Bourne and XSI compatible variants of some useful shell functions.
-m4_defun([_LT_PROG_XSI_SHELLFNS],
-[case $xsi_shell in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result="${1##*/}"
-}
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-  func_basename_result="${1##*/}"
-}
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-func_stripname ()
-{
-  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-  # positional parameters, so assign one to ordinary parameter first.
-  func_stripname_result=${3}
-  func_stripname_result=${func_stripname_result#"${1}"}
-  func_stripname_result=${func_stripname_result%"${2}"}
-}
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=${1%%=*}
-  func_opt_split_arg=${1#*=}
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  case ${1} in
-    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-    *)    func_lo2o_result=${1} ;;
-  esac
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=${1%.*}.lo
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=$(( $[*] ))
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=${#1}
-}
-
-_LT_EOF
-    ;;
-  *) # Bourne compatible functions.
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result=`$ECHO "${1}" | $SED "$basename"`
-}
-
-dnl func_dirname_and_basename
-dnl A portable version of this function is already defined in general.m4sh
-dnl so there is no need for it here.
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-  case ${2} in
-    .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-    *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
-  esac
-}
-
-# sed scripts:
-my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q'
-my_sed_long_arg='1s/^-[[^=]]*=//'
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=`$ECHO "${1}" | $SED "$my_sed_long_opt"`
-  func_opt_split_arg=`$ECHO "${1}" | $SED "$my_sed_long_arg"`
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=`$ECHO "${1}" | $SED 's/\.[[^.]]*$/.lo/'`
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=`expr "$[@]"`
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len`
-}
-
-_LT_EOF
-esac
-
-case $lt_shell_append in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$[1]+=\$[2]"
-}
-_LT_EOF
-    ;;
-  *)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$[1]=\$$[1]\$[2]"
-}
-
-_LT_EOF
-    ;;
-  esac
-])
diff --git a/cloog-0.16.3/isl/m4/ltoptions.m4 b/cloog-0.16.3/isl/m4/ltoptions.m4
deleted file mode 100644
index 17cfd51..0000000
--- a/cloog-0.16.3/isl/m4/ltoptions.m4
+++ /dev/null
@@ -1,369 +0,0 @@
-# Helper functions for option handling.                    -*- Autoconf -*-
-#
-#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
-#   Inc.
-#   Written by Gary V. Vaughan, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 7 ltoptions.m4
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
-
-
-# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
-# ------------------------------------------
-m4_define([_LT_MANGLE_OPTION],
-[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
-
-
-# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
-# ---------------------------------------
-# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
-# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
-# saved as a flag.
-m4_define([_LT_SET_OPTION],
-[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
-m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
-        _LT_MANGLE_DEFUN([$1], [$2]),
-    [m4_warning([Unknown $1 option `$2'])])[]dnl
-])
-
-
-# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
-# ------------------------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-m4_define([_LT_IF_OPTION],
-[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
-
-
-# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
-# -------------------------------------------------------
-# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
-# are set.
-m4_define([_LT_UNLESS_OPTIONS],
-[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
-	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
-		      [m4_define([$0_found])])])[]dnl
-m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
-])[]dnl
-])
-
-
-# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
-# ----------------------------------------
-# OPTION-LIST is a space-separated list of Libtool options associated
-# with MACRO-NAME.  If any OPTION has a matching handler declared with
-# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
-# the unknown option and exit.
-m4_defun([_LT_SET_OPTIONS],
-[# Set options
-m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
-    [_LT_SET_OPTION([$1], _LT_Option)])
-
-m4_if([$1],[LT_INIT],[
-  dnl
-  dnl Simply set some default values (i.e off) if boolean options were not
-  dnl specified:
-  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
-  ])
-  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
-  ])
-  dnl
-  dnl If no reference was made to various pairs of opposing options, then
-  dnl we run the default mode handler for the pair.  For example, if neither
-  dnl `shared' nor `disable-shared' was passed, we enable building of shared
-  dnl archives by default:
-  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
-  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
-  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
-  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
-  		   [_LT_ENABLE_FAST_INSTALL])
-  ])
-])# _LT_SET_OPTIONS
-
-
-## --------------------------------- ##
-## Macros to handle LT_INIT options. ##
-## --------------------------------- ##
-
-# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
-# -----------------------------------------
-m4_define([_LT_MANGLE_DEFUN],
-[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
-
-
-# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
-# -----------------------------------------------
-m4_define([LT_OPTION_DEFINE],
-[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
-])# LT_OPTION_DEFINE
-
-
-# dlopen
-# ------
-LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
-])
-
-AU_DEFUN([AC_LIBTOOL_DLOPEN],
-[_LT_SET_OPTION([LT_INIT], [dlopen])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `dlopen' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
-
-
-# win32-dll
-# ---------
-# Declare package support for building win32 dll's.
-LT_OPTION_DEFINE([LT_INIT], [win32-dll],
-[enable_win32_dll=yes
-
-case $host in
-*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
-  AC_CHECK_TOOL(AS, as, false)
-  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
-  AC_CHECK_TOOL(OBJDUMP, objdump, false)
-  ;;
-esac
-
-test -z "$AS" && AS=as
-_LT_DECL([], [AS],      [1], [Assembler program])dnl
-
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
-])# win32-dll
-
-AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-_LT_SET_OPTION([LT_INIT], [win32-dll])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `win32-dll' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
-
-
-# _LT_ENABLE_SHARED([DEFAULT])
-# ----------------------------
-# implement the --enable-shared flag, and supports the `shared' and
-# `disable-shared' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_SHARED],
-[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([shared],
-    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
-	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
-
-    _LT_DECL([build_libtool_libs], [enable_shared], [0],
-	[Whether or not to build shared libraries])
-])# _LT_ENABLE_SHARED
-
-LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
-
-# Old names:
-AC_DEFUN([AC_ENABLE_SHARED],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
-])
-
-AC_DEFUN([AC_DISABLE_SHARED],
-[_LT_SET_OPTION([LT_INIT], [disable-shared])
-])
-
-AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
-AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_ENABLE_SHARED], [])
-dnl AC_DEFUN([AM_DISABLE_SHARED], [])
-
-
-
-# _LT_ENABLE_STATIC([DEFAULT])
-# ----------------------------
-# implement the --enable-static flag, and support the `static' and
-# `disable-static' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_STATIC],
-[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([static],
-    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
-	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
-
-    _LT_DECL([build_old_libs], [enable_static], [0],
-	[Whether or not to build static libraries])
-])# _LT_ENABLE_STATIC
-
-LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
-
-# Old names:
-AC_DEFUN([AC_ENABLE_STATIC],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
-])
-
-AC_DEFUN([AC_DISABLE_STATIC],
-[_LT_SET_OPTION([LT_INIT], [disable-static])
-])
-
-AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
-AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_ENABLE_STATIC], [])
-dnl AC_DEFUN([AM_DISABLE_STATIC], [])
-
-
-
-# _LT_ENABLE_FAST_INSTALL([DEFAULT])
-# ----------------------------------
-# implement the --enable-fast-install flag, and support the `fast-install'
-# and `disable-fast-install' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_FAST_INSTALL],
-[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([fast-install],
-    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
-    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
-
-_LT_DECL([fast_install], [enable_fast_install], [0],
-	 [Whether or not to optimize for fast installation])dnl
-])# _LT_ENABLE_FAST_INSTALL
-
-LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
-
-# Old names:
-AU_DEFUN([AC_ENABLE_FAST_INSTALL],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `fast-install' option into LT_INIT's first parameter.])
-])
-
-AU_DEFUN([AC_DISABLE_FAST_INSTALL],
-[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `disable-fast-install' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
-dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
-
-
-# _LT_WITH_PIC([MODE])
-# --------------------
-# implement the --with-pic flag, and support the `pic-only' and `no-pic'
-# LT_INIT options.
-# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
-m4_define([_LT_WITH_PIC],
-[AC_ARG_WITH([pic],
-    [AS_HELP_STRING([--with-pic],
-	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
-    [pic_mode="$withval"],
-    [pic_mode=default])
-
-test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
-
-_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
-])# _LT_WITH_PIC
-
-LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
-LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
-
-# Old name:
-AU_DEFUN([AC_LIBTOOL_PICMODE],
-[_LT_SET_OPTION([LT_INIT], [pic-only])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `pic-only' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
-
-## ----------------- ##
-## LTDL_INIT Options ##
-## ----------------- ##
-
-m4_define([_LTDL_MODE], [])
-LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
-		 [m4_define([_LTDL_MODE], [nonrecursive])])
-LT_OPTION_DEFINE([LTDL_INIT], [recursive],
-		 [m4_define([_LTDL_MODE], [recursive])])
-LT_OPTION_DEFINE([LTDL_INIT], [subproject],
-		 [m4_define([_LTDL_MODE], [subproject])])
-
-m4_define([_LTDL_TYPE], [])
-LT_OPTION_DEFINE([LTDL_INIT], [installable],
-		 [m4_define([_LTDL_TYPE], [installable])])
-LT_OPTION_DEFINE([LTDL_INIT], [convenience],
-		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/cloog-0.16.3/isl/m4/ltsugar.m4 b/cloog-0.16.3/isl/m4/ltsugar.m4
deleted file mode 100644
index 9000a05..0000000
--- a/cloog-0.16.3/isl/m4/ltsugar.m4
+++ /dev/null
@@ -1,123 +0,0 @@
-# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
-#
-# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
-# Written by Gary V. Vaughan, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 6 ltsugar.m4
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
-
-
-# lt_join(SEP, ARG1, [ARG2...])
-# -----------------------------
-# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
-# associated separator.
-# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
-# versions in m4sugar had bugs.
-m4_define([lt_join],
-[m4_if([$#], [1], [],
-       [$#], [2], [[$2]],
-       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
-m4_define([_lt_join],
-[m4_if([$#$2], [2], [],
-       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
-
-
-# lt_car(LIST)
-# lt_cdr(LIST)
-# ------------
-# Manipulate m4 lists.
-# These macros are necessary as long as will still need to support
-# Autoconf-2.59 which quotes differently.
-m4_define([lt_car], [[$1]])
-m4_define([lt_cdr],
-[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
-       [$#], 1, [],
-       [m4_dquote(m4_shift($@))])])
-m4_define([lt_unquote], $1)
-
-
-# lt_append(MACRO-NAME, STRING, [SEPARATOR])
-# ------------------------------------------
-# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
-# Note that neither SEPARATOR nor STRING are expanded; they are appended
-# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
-# No SEPARATOR is output if MACRO-NAME was previously undefined (different
-# than defined and empty).
-#
-# This macro is needed until we can rely on Autoconf 2.62, since earlier
-# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
-m4_define([lt_append],
-[m4_define([$1],
-	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
-
-
-
-# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
-# ----------------------------------------------------------
-# Produce a SEP delimited list of all paired combinations of elements of
-# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
-# has the form PREFIXmINFIXSUFFIXn.
-# Needed until we can rely on m4_combine added in Autoconf 2.62.
-m4_define([lt_combine],
-[m4_if(m4_eval([$# > 3]), [1],
-       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
-[[m4_foreach([_Lt_prefix], [$2],
-	     [m4_foreach([_Lt_suffix],
-		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
-	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
-
-
-# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
-# -----------------------------------------------------------------------
-# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
-# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
-m4_define([lt_if_append_uniq],
-[m4_ifdef([$1],
-	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
-		 [lt_append([$1], [$2], [$3])$4],
-		 [$5])],
-	  [lt_append([$1], [$2], [$3])$4])])
-
-
-# lt_dict_add(DICT, KEY, VALUE)
-# -----------------------------
-m4_define([lt_dict_add],
-[m4_define([$1($2)], [$3])])
-
-
-# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
-# --------------------------------------------
-m4_define([lt_dict_add_subkey],
-[m4_define([$1($2:$3)], [$4])])
-
-
-# lt_dict_fetch(DICT, KEY, [SUBKEY])
-# ----------------------------------
-m4_define([lt_dict_fetch],
-[m4_ifval([$3],
-	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
-    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
-
-
-# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
-# -----------------------------------------------------------------
-m4_define([lt_if_dict_fetch],
-[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
-	[$5],
-    [$6])])
-
-
-# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
-# --------------------------------------------------------------
-m4_define([lt_dict_filter],
-[m4_if([$5], [], [],
-  [lt_join(m4_quote(m4_default([$4], [[, ]])),
-           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
-		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
-])
diff --git a/cloog-0.16.3/isl/m4/ltversion.m4 b/cloog-0.16.3/isl/m4/ltversion.m4
deleted file mode 100644
index 2e8f929..0000000
--- a/cloog-0.16.3/isl/m4/ltversion.m4
+++ /dev/null
@@ -1,23 +0,0 @@
-# ltversion.m4 -- version numbers			-*- Autoconf -*-
-#
-#   Copyright (C) 2004 Free Software Foundation, Inc.
-#   Written by Scott James Remnant, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# Generated from ltversion.in.
-
-# serial 3169 ltversion.m4
-# This file is part of GNU Libtool
-
-m4_define([LT_PACKAGE_VERSION], [2.2.8])
-m4_define([LT_PACKAGE_REVISION], [1.3169])
-
-AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.2.8'
-macro_revision='1.3169'
-_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
-_LT_DECL(, macro_revision, 0)
-])
diff --git a/cloog-0.16.3/isl/m4/lt~obsolete.m4 b/cloog-0.16.3/isl/m4/lt~obsolete.m4
deleted file mode 100644
index c573da9..0000000
--- a/cloog-0.16.3/isl/m4/lt~obsolete.m4
+++ /dev/null
@@ -1,98 +0,0 @@
-# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
-#
-#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
-#   Written by Scott James Remnant, 2004.
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 5 lt~obsolete.m4
-
-# These exist entirely to fool aclocal when bootstrapping libtool.
-#
-# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
-# which have later been changed to m4_define as they aren't part of the
-# exported API, or moved to Autoconf or Automake where they belong.
-#
-# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
-# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
-# using a macro with the same name in our local m4/libtool.m4 it'll
-# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
-# and doesn't know about Autoconf macros at all.)
-#
-# So we provide this file, which has a silly filename so it's always
-# included after everything else.  This provides aclocal with the
-# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
-# because those macros already exist, or will be overwritten later.
-# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
-#
-# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
-# Yes, that means every name once taken will need to remain here until
-# we give up compatibility with versions before 1.7, at which point
-# we need to keep only those names which we still refer to.
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
-
-m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
-m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
-m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
-m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
-m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
-m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
-m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
-m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
-m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
-m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
-m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
-m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
-m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
-m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
-m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
-m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
-m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
-m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
-m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
-m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
-m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
-m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
-m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
-m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
-m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
-m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
-m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
-m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
-m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
-m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
-m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
-m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
-m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
-m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
-m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
-m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
-m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
-m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
-m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
-m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
-m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
-m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
-m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
-m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
-m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
-m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
-m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
-m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
-m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],	[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
-m4_ifndef([_LT_AC_PROG_CXXCPP],		[AC_DEFUN([_LT_AC_PROG_CXXCPP])])
-m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],	[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
-m4_ifndef([_LT_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
-m4_ifndef([_LT_PROG_F77],		[AC_DEFUN([_LT_PROG_F77])])
-m4_ifndef([_LT_PROG_FC],		[AC_DEFUN([_LT_PROG_FC])])
-m4_ifndef([_LT_PROG_CXX],		[AC_DEFUN([_LT_PROG_CXX])])
diff --git a/cloog-0.16.3/isl/missing b/cloog-0.16.3/isl/missing
deleted file mode 100755
index 1c8ff70..0000000
--- a/cloog-0.16.3/isl/missing
+++ /dev/null
@@ -1,367 +0,0 @@
-#! /bin/sh
-# Common stub for a few missing GNU programs while installing.
-
-scriptversion=2006-05-10.23
-
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006
-#   Free Software Foundation, Inc.
-# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301, USA.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-if test $# -eq 0; then
-  echo 1>&2 "Try \`$0 --help' for more information"
-  exit 1
-fi
-
-run=:
-sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
-sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
-
-# In the cases where this matters, `missing' is being run in the
-# srcdir already.
-if test -f configure.ac; then
-  configure_ac=configure.ac
-else
-  configure_ac=configure.in
-fi
-
-msg="missing on your system"
-
-case $1 in
---run)
-  # Try to run requested program, and just exit if it succeeds.
-  run=
-  shift
-  "$@" && exit 0
-  # Exit code 63 means version mismatch.  This often happens
-  # when the user try to use an ancient version of a tool on
-  # a file that requires a minimum version.  In this case we
-  # we should proceed has if the program had been absent, or
-  # if --run hadn't been passed.
-  if test $? = 63; then
-    run=:
-    msg="probably too old"
-  fi
-  ;;
-
-  -h|--h|--he|--hel|--help)
-    echo "\
-$0 [OPTION]... PROGRAM [ARGUMENT]...
-
-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
-error status if there is no known handling for PROGRAM.
-
-Options:
-  -h, --help      display this help and exit
-  -v, --version   output version information and exit
-  --run           try to run the given command, and emulate it if it fails
-
-Supported PROGRAM values:
-  aclocal      touch file \`aclocal.m4'
-  autoconf     touch file \`configure'
-  autoheader   touch file \`config.h.in'
-  autom4te     touch the output file, or create a stub one
-  automake     touch all \`Makefile.in' files
-  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
-  flex         create \`lex.yy.c', if possible, from existing .c
-  help2man     touch the output file
-  lex          create \`lex.yy.c', if possible, from existing .c
-  makeinfo     touch the output file
-  tar          try tar, gnutar, gtar, then tar without non-portable flags
-  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
-
-Send bug reports to <bug-automake@gnu.org>."
-    exit $?
-    ;;
-
-  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
-    echo "missing $scriptversion (GNU Automake)"
-    exit $?
-    ;;
-
-  -*)
-    echo 1>&2 "$0: Unknown \`$1' option"
-    echo 1>&2 "Try \`$0 --help' for more information"
-    exit 1
-    ;;
-
-esac
-
-# Now exit if we have it, but it failed.  Also exit now if we
-# don't have it and --version was passed (most likely to detect
-# the program).
-case $1 in
-  lex|yacc)
-    # Not GNU programs, they don't have --version.
-    ;;
-
-  tar)
-    if test -n "$run"; then
-       echo 1>&2 "ERROR: \`tar' requires --run"
-       exit 1
-    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
-       exit 1
-    fi
-    ;;
-
-  *)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
-       # Could not run --version or --help.  This is probably someone
-       # running `$TOOL --version' or `$TOOL --help' to check whether
-       # $TOOL exists and not knowing $TOOL uses missing.
-       exit 1
-    fi
-    ;;
-esac
-
-# If it does not exist, or fails to run (possibly an outdated version),
-# try to emulate it.
-case $1 in
-  aclocal*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
-         to install the \`Automake' and \`Perl' packages.  Grab them from
-         any GNU archive site."
-    touch aclocal.m4
-    ;;
-
-  autoconf)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`${configure_ac}'.  You might want to install the
-         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
-         archive site."
-    touch configure
-    ;;
-
-  autoheader)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
-         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
-         from any GNU archive site."
-    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
-    test -z "$files" && files="config.h"
-    touch_files=
-    for f in $files; do
-      case $f in
-      *:*) touch_files="$touch_files "`echo "$f" |
-				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
-      *) touch_files="$touch_files $f.in";;
-      esac
-    done
-    touch $touch_files
-    ;;
-
-  automake*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
-         You might want to install the \`Automake' and \`Perl' packages.
-         Grab them from any GNU archive site."
-    find . -type f -name Makefile.am -print |
-	   sed 's/\.am$/.in/' |
-	   while read f; do touch "$f"; done
-    ;;
-
-  autom4te)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, but is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.
-         You can get \`$1' as part of \`Autoconf' from any GNU
-         archive site."
-
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -f "$file"; then
-	touch $file
-    else
-	test -z "$file" || exec >$file
-	echo "#! /bin/sh"
-	echo "# Created by GNU Automake missing as a replacement of"
-	echo "#  $ $@"
-	echo "exit 0"
-	chmod +x $file
-	exit 1
-    fi
-    ;;
-
-  bison|yacc)
-    echo 1>&2 "\
-WARNING: \`$1' $msg.  You should only need it if
-         you modified a \`.y' file.  You may need the \`Bison' package
-         in order for those modifications to take effect.  You can get
-         \`Bison' from any GNU archive site."
-    rm -f y.tab.c y.tab.h
-    if test $# -ne 1; then
-        eval LASTARG="\${$#}"
-	case $LASTARG in
-	*.y)
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" y.tab.c
-	    fi
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" y.tab.h
-	    fi
-	  ;;
-	esac
-    fi
-    if test ! -f y.tab.h; then
-	echo >y.tab.h
-    fi
-    if test ! -f y.tab.c; then
-	echo 'main() { return 0; }' >y.tab.c
-    fi
-    ;;
-
-  lex|flex)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.l' file.  You may need the \`Flex' package
-         in order for those modifications to take effect.  You can get
-         \`Flex' from any GNU archive site."
-    rm -f lex.yy.c
-    if test $# -ne 1; then
-        eval LASTARG="\${$#}"
-	case $LASTARG in
-	*.l)
-	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" lex.yy.c
-	    fi
-	  ;;
-	esac
-    fi
-    if test ! -f lex.yy.c; then
-	echo 'main() { return 0; }' >lex.yy.c
-    fi
-    ;;
-
-  help2man)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-	 you modified a dependency of a manual page.  You may need the
-	 \`Help2man' package in order for those modifications to take
-	 effect.  You can get \`Help2man' from any GNU archive site."
-
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -f "$file"; then
-	touch $file
-    else
-	test -z "$file" || exec >$file
-	echo ".ab help2man is required to generate this page"
-	exit 1
-    fi
-    ;;
-
-  makeinfo)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.texi' or \`.texinfo' file, or any other file
-         indirectly affecting the aspect of the manual.  The spurious
-         call might also be the consequence of using a buggy \`make' (AIX,
-         DU, IRIX).  You might want to install the \`Texinfo' package or
-         the \`GNU make' package.  Grab either from any GNU archive site."
-    # The file to touch is that specified with -o ...
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -z "$file"; then
-      # ... or it is the one specified with @setfilename ...
-      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
-      file=`sed -n '
-	/^@setfilename/{
-	  s/.* \([^ ]*\) *$/\1/
-	  p
-	  q
-	}' $infile`
-      # ... or it is derived from the source name (dir/f.texi becomes f.info)
-      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
-    fi
-    # If the file does not exist, the user really needs makeinfo;
-    # let's fail without touching anything.
-    test -f $file || exit 1
-    touch $file
-    ;;
-
-  tar)
-    shift
-
-    # We have already tried tar in the generic part.
-    # Look for gnutar/gtar before invocation to avoid ugly error
-    # messages.
-    if (gnutar --version > /dev/null 2>&1); then
-       gnutar "$@" && exit 0
-    fi
-    if (gtar --version > /dev/null 2>&1); then
-       gtar "$@" && exit 0
-    fi
-    firstarg="$1"
-    if shift; then
-	case $firstarg in
-	*o*)
-	    firstarg=`echo "$firstarg" | sed s/o//`
-	    tar "$firstarg" "$@" && exit 0
-	    ;;
-	esac
-	case $firstarg in
-	*h*)
-	    firstarg=`echo "$firstarg" | sed s/h//`
-	    tar "$firstarg" "$@" && exit 0
-	    ;;
-	esac
-    fi
-
-    echo 1>&2 "\
-WARNING: I can't seem to be able to run \`tar' with the given arguments.
-         You may want to install GNU tar or Free paxutils, or check the
-         command line arguments."
-    exit 1
-    ;;
-
-  *)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, and is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.  Check the \`README' file,
-         it often tells you about the needed prerequisites for installing
-         this package.  You may also peek at any GNU archive site, in case
-         some other package would contain this missing \`$1' program."
-    exit 1
-    ;;
-esac
-
-exit 0
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
-# End:
diff --git a/cloog-0.16.3/isl/mp_get_memory_functions.c b/cloog-0.16.3/isl/mp_get_memory_functions.c
deleted file mode 100644
index e14e336..0000000
--- a/cloog-0.16.3/isl/mp_get_memory_functions.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <gmp.h>
-
-void mp_get_memory_functions(
-		void *(**alloc_func_ptr) (size_t),
-		void *(**realloc_func_ptr) (void *, size_t, size_t),
-		void (**free_func_ptr) (void *, size_t))
-{
-	if (alloc_func_ptr)
-		*alloc_func_ptr = __gmp_allocate_func;
-	if (realloc_func_ptr)
-		*realloc_func_ptr = __gmp_reallocate_func;
-	if (free_func_ptr)
-		*free_func_ptr = __gmp_free_func;
-}
diff --git a/cloog-0.16.3/isl/pip.c b/cloog-0.16.3/isl/pip.c
deleted file mode 100644
index 0d85f3a..0000000
--- a/cloog-0.16.3/isl/pip.c
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <assert.h>
-#include <string.h>
-#include <strings.h>
-#include <isl_map_private.h>
-#include <isl/set.h>
-#include "isl_tab.h"
-#include "isl_sample.h"
-#include "isl_scan.h"
-#include <isl/seq.h>
-#include <isl/ilp.h>
-#include <isl_point_private.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"
- * should always be -1.
- *
- * Context constraints in PolyLib format
- * -1
- * Problem constraints in PolyLib format
- * Optional list of options
- *
- * The options are
- *	Maximize	compute maximum instead of minimum
- *	Rational	compute rational optimum instead of integer optimum
- *	Urs_parms	don't assume parameters are non-negative
- *	Urs_unknowns	don't assume unknowns are non-negative
- */
-
-struct options {
-	struct isl_options	*isl;
-	unsigned		 verify;
-};
-
-struct isl_arg options_arg[] = {
-ISL_ARG_CHILD(struct options, isl, "isl", isl_options_arg, "isl options")
-ISL_ARG_BOOL(struct options, verify, 'T', "verify", 0, NULL)
-ISL_ARG_END
-};
-
-ISL_ARG_DEF(options, struct options, options_arg)
-
-static __isl_give isl_basic_set *set_bounds(__isl_take isl_basic_set *bset)
-{
-	unsigned nparam;
-	int i, r;
-	isl_point *pt, *pt2;
-	isl_basic_set *box;
-
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-	r = nparam >= 8 ? 4 : nparam >= 5 ? 6 : 30;
-
-	pt = isl_basic_set_sample_point(isl_basic_set_copy(bset));
-	pt2 = isl_point_copy(pt);
-
-	for (i = 0; i < nparam; ++i) {
-		pt = isl_point_add_ui(pt, isl_dim_param, i, r);
-		pt2 = isl_point_sub_ui(pt2, isl_dim_param, i, r);
-	}
-
-	box = isl_basic_set_box_from_points(pt, pt2);
-
-	return isl_basic_set_intersect(bset, box);
-}
-
-static struct isl_basic_set *to_parameter_domain(struct isl_basic_set *context)
-{
-	return isl_basic_set_move_dims(context, isl_dim_param, 0, isl_dim_set, 0,
-				       isl_basic_set_dim(context, isl_dim_set));
-}
-
-isl_basic_set *plug_in_parameters(isl_basic_set *bset, struct isl_vec *params)
-{
-	int i;
-
-	for (i = 0; i < params->size - 1; ++i)
-		bset = isl_basic_set_fix(bset,
-					 isl_dim_param, i, params->el[1 + i]);
-
-	bset = isl_basic_set_remove_dims(bset,
-					 isl_dim_param, 0, params->size - 1);
-
-	isl_vec_free(params);
-
-	return bset;
-}
-
-isl_set *set_plug_in_parameters(isl_set *set, struct isl_vec *params)
-{
-	int i;
-
-	for (i = 0; i < params->size - 1; ++i)
-		set = isl_set_fix(set, isl_dim_param, i, params->el[1 + i]);
-
-	set = isl_set_remove_dims(set, isl_dim_param, 0, params->size - 1);
-
-	isl_vec_free(params);
-
-	return set;
-}
-
-/* Compute the lexicographically minimal (or maximal if max is set)
- * element of bset for the given values of the parameters, by
- * successively solving an ilp problem in each direction.
- */
-struct isl_vec *opt_at(struct isl_basic_set *bset,
-	struct isl_vec *params, int max)
-{
-	unsigned dim;
-	struct isl_vec *opt;
-	struct isl_vec *obj;
-	int i;
-
-	dim = isl_basic_set_dim(bset, isl_dim_set);
-
-	bset = plug_in_parameters(bset, params);
-
-	if (isl_basic_set_plain_is_empty(bset)) {
-		opt = isl_vec_alloc(bset->ctx, 0);
-		isl_basic_set_free(bset);
-		return opt;
-	}
-
-	opt = isl_vec_alloc(bset->ctx, 1 + dim);
-	assert(opt);
-
-	obj = isl_vec_alloc(bset->ctx, 1 + dim);
-	assert(obj);
-
-	isl_int_set_si(opt->el[0], 1);
-	isl_int_set_si(obj->el[0], 0);
-
-	for (i = 0; i < dim; ++i) {
-		enum isl_lp_result res;
-
-		isl_seq_clr(obj->el + 1, dim);
-		isl_int_set_si(obj->el[1 + i], 1);
-		res = isl_basic_set_solve_ilp(bset, max, obj->el,
-						&opt->el[1 + i], NULL);
-		if (res == isl_lp_empty)
-			goto empty;
-		assert(res == isl_lp_ok);
-		bset = isl_basic_set_fix(bset, isl_dim_set, i, opt->el[1 + i]);
-	}
-
-	isl_basic_set_free(bset);
-	isl_vec_free(obj);
-
-	return opt;
-empty:
-	isl_vec_free(opt);
-	opt = isl_vec_alloc(bset->ctx, 0);
-	isl_basic_set_free(bset);
-	isl_vec_free(obj);
-
-	return opt;
-}
-
-struct isl_scan_pip {
-	struct isl_scan_callback callback;
-	isl_basic_set *bset;
-	isl_set *sol;
-	isl_set *empty;
-	int stride;
-	int n;
-	int max;
-};
-
-/* Check if the "manually" computed optimum of bset at the "sample"
- * values of the parameters agrees with the solution of pilp problem
- * represented by the pair (sol, empty).
- * In particular, if there is no solution for this value of the parameters,
- * then it should be an element of the parameter domain "empty".
- * Otherwise, the optimal solution, should be equal to the result of
- * plugging in the value of the parameters in "sol".
- */
-static int scan_one(struct isl_scan_callback *callback,
-	__isl_take isl_vec *sample)
-{
-	struct isl_scan_pip *sp = (struct isl_scan_pip *)callback;
-	struct isl_vec *opt;
-
-	sp->n--;
-
-	opt = opt_at(isl_basic_set_copy(sp->bset), isl_vec_copy(sample), sp->max);
-	assert(opt);
-
-	if (opt->size == 0) {
-		isl_point *sample_pnt;
-		sample_pnt = isl_point_alloc(isl_set_get_dim(sp->empty), sample);
-		assert(isl_set_contains_point(sp->empty, sample_pnt));
-		isl_point_free(sample_pnt);
-		isl_vec_free(opt);
-	} else {
-		isl_set *sol;
-		isl_set *opt_set;
-		opt_set = isl_set_from_basic_set(isl_basic_set_from_vec(opt));
-		sol = set_plug_in_parameters(isl_set_copy(sp->sol), sample);
-		assert(isl_set_is_equal(opt_set, sol));
-		isl_set_free(sol);
-		isl_set_free(opt_set);
-	}
-
-	if (!(sp->n % sp->stride)) {
-		printf("o");
-		fflush(stdout);
-	}
-
-	return sp->n >= 1 ? 0 : -1;
-}
-
-static void check_solution(isl_basic_set *bset, isl_basic_set *context,
-	isl_set *sol, isl_set *empty, int max)
-{
-	struct isl_scan_pip sp;
-	isl_int count, count_max;
-	int i, n;
-	int r;
-
-	context = set_bounds(context);
-	context = isl_basic_set_underlying_set(context);
-
-	isl_int_init(count);
-	isl_int_init(count_max);
-
-	isl_int_set_si(count_max, 2000);
-	r = isl_basic_set_count_upto(context, count_max, &count);
-	assert(r >= 0);
-	n = isl_int_get_si(count);
-
-	isl_int_clear(count_max);
-	isl_int_clear(count);
-
-	sp.callback.add = scan_one;
-	sp.bset = bset;
-	sp.sol = sol;
-	sp.empty = empty;
-	sp.n = n;
-	sp.stride = n > 70 ? 1 + (n + 1)/70 : 1;
-	sp.max = max;
-
-	for (i = 0; i < n; i += sp.stride)
-		printf(".");
-	printf("\r");
-	fflush(stdout);
-
-	isl_basic_set_scan(context, &sp.callback);
-
-	printf("\n");
-
-	isl_basic_set_free(bset);
-}
-
-int main(int argc, char **argv)
-{
-	struct isl_ctx *ctx;
-	struct isl_basic_set *context, *bset, *copy, *context_copy;
-	struct isl_set *set;
-	struct isl_set *empty;
-	int neg_one;
-	char s[1024];
-	int urs_parms = 0;
-	int urs_unknowns = 0;
-	int max = 0;
-	int rational = 0;
-	int n;
-	struct options *options;
-
-	options = options_new_with_defaults();
-	assert(options);
-	argc = options_parse(options, argc, argv, ISL_ARG_ALL);
-
-	ctx = isl_ctx_alloc_with_options(options_arg, options);
-
-	context = isl_basic_set_read_from_file(ctx, stdin, 0);
-	assert(context);
-	n = fscanf(stdin, "%d", &neg_one);
-	assert(n == 1);
-	assert(neg_one == -1);
-	bset = isl_basic_set_read_from_file(ctx, stdin,
-		isl_basic_set_dim(context, isl_dim_set));
-
-	while (fgets(s, sizeof(s), stdin)) {
-		if (strncasecmp(s, "Maximize", 8) == 0)
-			max = 1;
-		if (strncasecmp(s, "Rational", 8) == 0) {
-			rational = 1;
-			bset = isl_basic_set_set_rational(bset);
-		}
-		if (strncasecmp(s, "Urs_parms", 9) == 0)
-			urs_parms = 1;
-		if (strncasecmp(s, "Urs_unknowns", 12) == 0)
-			urs_unknowns = 1;
-	}
-	if (!urs_parms)
-		context = isl_basic_set_intersect(context,
-		isl_basic_set_positive_orthant(isl_basic_set_get_dim(context)));
-	context = to_parameter_domain(context);
-	if (!urs_unknowns)
-		bset = isl_basic_set_intersect(bset,
-		isl_basic_set_positive_orthant(isl_basic_set_get_dim(bset)));
-
-	if (options->verify) {
-		copy = isl_basic_set_copy(bset);
-		context_copy = isl_basic_set_copy(context);
-	}
-
-	if (max)
-		set = isl_basic_set_partial_lexmax(bset, context, &empty);
-	else
-		set = isl_basic_set_partial_lexmin(bset, context, &empty);
-
-	if (options->verify) {
-		assert(!rational);
-		check_solution(copy, context_copy, set, empty, max);
-	} else {
-		isl_set_print(set, stdout, 0, ISL_FORMAT_ISL);
-		fprintf(stdout, "\n");
-		fprintf(stdout, "no solution: ");
-		isl_set_print(empty, stdout, 0, ISL_FORMAT_ISL);
-		fprintf(stdout, "\n");
-	}
-
-	isl_set_free(set);
-	isl_set_free(empty);
-	isl_ctx_free(ctx);
-
-	return 0;
-}
diff --git a/cloog-0.16.3/isl/pip_test.sh.in b/cloog-0.16.3/isl/pip_test.sh.in
deleted file mode 100755
index cdc5fb9..0000000
--- a/cloog-0.16.3/isl/pip_test.sh.in
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/sh
-
-EXEEXT=@EXEEXT@
-
-PIP_TESTS="\
-	boulet.pip \
-	brisebarre.pip \
-	cg1.pip \
-	esced.pip \
-	ex2.pip \
-	ex.pip \
-	fimmel.pip \
-	max.pip \
-	negative.pip \
-	seghir-vd.pip \
-	small.pip \
-	sor1d.pip \
-	square.pip \
-	sven.pip \
-	tobi.pip"
-
-for i in $PIP_TESTS; do
-	echo $i;
-	./isl_pip$EXEEXT --context=gbr -T < $srcdir/test_inputs/$i || exit
-	./isl_pip$EXEEXT --context=lexmin -T < $srcdir/test_inputs/$i || exit
-done
diff --git a/cloog-0.16.3/isl/polyhedron_detect_equalities.c b/cloog-0.16.3/isl/polyhedron_detect_equalities.c
deleted file mode 100644
index 9acea32..0000000
--- a/cloog-0.16.3/isl/polyhedron_detect_equalities.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl/set.h>
-
-int main(int argc, char **argv)
-{
-	struct isl_ctx *ctx = isl_ctx_alloc();
-	struct isl_basic_set *bset;
-
-	bset = isl_basic_set_read_from_file(ctx, stdin, 0);
-	bset = isl_basic_set_detect_equalities(bset);
-	isl_basic_set_print(bset, stdout, 0, "", "", ISL_FORMAT_POLYLIB);
-	isl_basic_set_free(bset);
-	isl_ctx_free(ctx);
-
-	return 0;
-}
diff --git a/cloog-0.16.3/isl/polyhedron_minimize.c b/cloog-0.16.3/isl/polyhedron_minimize.c
deleted file mode 100644
index f6c2dc9..0000000
--- a/cloog-0.16.3/isl/polyhedron_minimize.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <assert.h>
-#include <isl/set.h>
-#include <isl/vec.h>
-#include <isl/ilp.h>
-#include <isl/seq.h>
-
-/* The input of this program is the same as that of the "polytope_minimize"
- * program from the barvinok distribution.
- *
- * Constraints of set is PolyLib format.
- * Linear or affine objective function in PolyLib format.
- */
-
-static struct isl_vec *isl_vec_lin_to_aff(struct isl_vec *vec)
-{
-	struct isl_vec *aff;
-
-	if (!vec)
-		return NULL;
-	aff = isl_vec_alloc(vec->ctx, 1 + vec->size);
-	if (!aff)
-		goto error;
-	isl_int_set_si(aff->el[0], 0);
-	isl_seq_cpy(aff->el + 1, vec->el, vec->size);
-	isl_vec_free(vec);
-	return aff;
-error:
-	isl_vec_free(vec);
-	return NULL;
-}
-
-/* Rotate elements of vector right.
- * In particular, move the constant term from the end of the
- * vector to the start of the vector.
- */
-static struct isl_vec *vec_ror(struct isl_vec *vec)
-{
-	int i;
-
-	if (!vec)
-		return NULL;
-	for (i = vec->size - 2; i >= 0; --i)
-		isl_int_swap(vec->el[i], vec->el[i + 1]);
-	return vec;
-}
-
-int main(int argc, char **argv)
-{
-	struct isl_ctx *ctx = isl_ctx_alloc();
-	struct isl_basic_set *bset;
-	struct isl_vec *obj;
-	struct isl_vec *sol;
-	isl_int opt;
-	unsigned dim;
-	enum isl_lp_result res;
-	isl_printer *p;
-
-	isl_int_init(opt);
-	bset = isl_basic_set_read_from_file(ctx, stdin, 0);
-	assert(bset);
-	obj = isl_vec_read_from_file(ctx, stdin);
-	assert(obj);
-	dim = isl_basic_set_total_dim(bset);
-	assert(obj->size >= dim && obj->size <= dim + 1);
-	if (obj->size != dim + 1)
-		obj = isl_vec_lin_to_aff(obj);
-	else
-		obj = vec_ror(obj);
-	res = isl_basic_set_solve_ilp(bset, 0, obj->el, &opt, &sol);
-	switch (res) {
-	case isl_lp_error:
-		fprintf(stderr, "error\n");
-		return -1;
-	case isl_lp_empty:
-		fprintf(stdout, "empty\n");
-		break;
-	case isl_lp_unbounded:
-		fprintf(stdout, "unbounded\n");
-		break;
-	case isl_lp_ok:
-		p = isl_printer_to_file(ctx, stdout);
-		p = isl_printer_print_vec(p, sol);
-		p = isl_printer_end_line(p);
-		p = isl_printer_print_isl_int(p, opt);
-		p = isl_printer_end_line(p);
-		isl_printer_free(p);
-	}
-	isl_basic_set_free(bset);
-	isl_vec_free(obj);
-	isl_vec_free(sol);
-	isl_ctx_free(ctx);
-	isl_int_clear(opt);
-
-	return 0;
-}
diff --git a/cloog-0.16.3/isl/polyhedron_sample.c b/cloog-0.16.3/isl/polyhedron_sample.c
deleted file mode 100644
index 05b343b..0000000
--- a/cloog-0.16.3/isl/polyhedron_sample.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <assert.h>
-#include <isl_map_private.h>
-#include "isl_sample.h"
-#include <isl/vec.h>
-
-int main(int argc, char **argv)
-{
-	struct isl_ctx *ctx = isl_ctx_alloc();
-	struct isl_basic_set *bset;
-	struct isl_vec *sample;
-	isl_printer *p;
-
-	bset = isl_basic_set_read_from_file(ctx, stdin, 0);
-	sample = isl_basic_set_sample_vec(isl_basic_set_copy(bset));
-	p = isl_printer_to_file(ctx, stdout);
-	p = isl_printer_print_vec(p, sample);
-	p = isl_printer_end_line(p);
-	isl_printer_free(p);
-	assert(sample);
-	if (sample->size > 0)
-		assert(isl_basic_set_contains(bset, sample));
-	isl_basic_set_free(bset);
-	isl_vec_free(sample);
-	isl_ctx_free(ctx);
-
-	return 0;
-}
diff --git a/cloog-0.16.3/isl/polytope_scan.c b/cloog-0.16.3/isl/polytope_scan.c
deleted file mode 100644
index 60ac3e5..0000000
--- a/cloog-0.16.3/isl/polytope_scan.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <assert.h>
-#include <isl_map_private.h>
-#include "isl_equalities.h"
-#include <isl/seq.h>
-#include "isl_scan.h"
-#include <isl_mat_private.h>
-
-/* The input of this program is the same as that of the "polytope_scan"
- * program from the barvinok distribution.
- *
- * Constraints of set is PolyLib format.
- *
- * The input set is assumed to be bounded.
- */
-
-struct scan_samples {
-	struct isl_scan_callback callback;
-	struct isl_mat *samples;
-};
-
-static int scan_samples_add_sample(struct isl_scan_callback *cb,
-	__isl_take isl_vec *sample)
-{
-	struct scan_samples *ss = (struct scan_samples *)cb;
-
-	ss->samples = isl_mat_extend(ss->samples, ss->samples->n_row + 1,
-						  ss->samples->n_col);
-	if (!ss->samples)
-		goto error;
-
-	isl_seq_cpy(ss->samples->row[ss->samples->n_row - 1],
-		    sample->el, sample->size);
-
-	isl_vec_free(sample);
-	return 0;
-error:
-	isl_vec_free(sample);
-	return -1;
-}
-
-static struct isl_mat *isl_basic_set_scan_samples(struct isl_basic_set *bset)
-{
-	isl_ctx *ctx;
-	unsigned dim;
-	struct scan_samples ss;
-
-	ctx = isl_basic_set_get_ctx(bset);
-	dim = isl_basic_set_total_dim(bset);
-	ss.callback.add = scan_samples_add_sample;
-	ss.samples = isl_mat_alloc(ctx, 0, 1 + dim);
-	if (!ss.samples)
-		goto error;
-
-	if (isl_basic_set_scan(bset, &ss.callback) < 0) {
-		isl_mat_free(ss.samples);
-		return NULL;
-	}
-
-	return ss.samples;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-static struct isl_mat *isl_basic_set_samples(struct isl_basic_set *bset)
-{
-	struct isl_mat *T;
-	struct isl_mat *samples;
-
-	if (!bset)
-		return NULL;
-
-	if (bset->n_eq == 0)
-		return isl_basic_set_scan_samples(bset);
-
-	bset = isl_basic_set_remove_equalities(bset, &T, NULL);
-	samples = isl_basic_set_scan_samples(bset);
-	return isl_mat_product(samples, isl_mat_transpose(T));
-}
-
-int main(int argc, char **argv)
-{
-	struct isl_ctx *ctx = isl_ctx_alloc();
-	struct isl_basic_set *bset;
-	struct isl_mat *samples;
-
-	bset = isl_basic_set_read_from_file(ctx, stdin, 0);
-	samples = isl_basic_set_samples(bset);
-	isl_mat_print_internal(samples, stdout, 0);
-	isl_mat_free(samples);
-	isl_ctx_free(ctx);
-
-	return 0;
-}
diff --git a/cloog-0.16.3/isl/test_inputs/affine.polylib b/cloog-0.16.3/isl/test_inputs/affine.polylib
deleted file mode 100644
index f14720c..0000000
--- a/cloog-0.16.3/isl/test_inputs/affine.polylib
+++ /dev/null
@@ -1,9 +0,0 @@
-# the affine hull of {[a,b] : a=b && 1 <= a <= 163} ...
-3 4
-0 1 -1 0
-1 1  0 -1
-1 -1 0 163
-
-# ... is {[a,b] : a=b} (and not {[In_1,In_2]}, as Omega 1.2 claims)
-1 4
-0 1 -1 0
diff --git a/cloog-0.16.3/isl/test_inputs/affine2.polylib b/cloog-0.16.3/isl/test_inputs/affine2.polylib
deleted file mode 100644
index c67db77..0000000
--- a/cloog-0.16.3/isl/test_inputs/affine2.polylib
+++ /dev/null
@@ -1,9 +0,0 @@
-5 5
-1 -2 0 1 0
-1 2 0 -1 1
-1 0 -2 1 0
-1 0 2 -1 1
-1 0 0 1 -1
-
-1 5
-0 1 -1 0 0
diff --git a/cloog-0.16.3/isl/test_inputs/affine3.polylib b/cloog-0.16.3/isl/test_inputs/affine3.polylib
deleted file mode 100644
index f2bc9a2..0000000
--- a/cloog-0.16.3/isl/test_inputs/affine3.polylib
+++ /dev/null
@@ -1,7 +0,0 @@
-3 4
-1 1 0 0
-1 -7 4 2
-1 5 -4 2
-
-1 4
-0 3 -2 0
diff --git a/cloog-0.16.3/isl/test_inputs/application.omega b/cloog-0.16.3/isl/test_inputs/application.omega
deleted file mode 100644
index 8f4fd1d..0000000
--- a/cloog-0.16.3/isl/test_inputs/application.omega
+++ /dev/null
@@ -1,3 +0,0 @@
-{[x]}
-{[x] -> [y] : y = 2x}
-{[y]: Exists ( alpha : 2alpha = y)}
diff --git a/cloog-0.16.3/isl/test_inputs/application2.omega b/cloog-0.16.3/isl/test_inputs/application2.omega
deleted file mode 100644
index f2af1e8..0000000
--- a/cloog-0.16.3/isl/test_inputs/application2.omega
+++ /dev/null
@@ -1,3 +0,0 @@
-{[x] : x >= 0 && x <= 20 }
-{[x] -> [y] : y = 2x}
-{[y]: Exists ( alpha : 2alpha = y && 0 <= y && y <= 40)}
diff --git a/cloog-0.16.3/isl/test_inputs/basicLinear.pwqp b/cloog-0.16.3/isl/test_inputs/basicLinear.pwqp
deleted file mode 100644
index 0af7fab..0000000
--- a/cloog-0.16.3/isl/test_inputs/basicLinear.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[P, Q] -> { [n, m] -> n : n >= 1 and m >= n and m <= P and m <= Q }
diff --git a/cloog-0.16.3/isl/test_inputs/basicLinear2.pwqp b/cloog-0.16.3/isl/test_inputs/basicLinear2.pwqp
deleted file mode 100644
index d411a36..0000000
--- a/cloog-0.16.3/isl/test_inputs/basicLinear2.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[P, Q] -> { [n, m] -> n : n >= 1 and m >= n and m <= P and n >= -1 + Q }
diff --git a/cloog-0.16.3/isl/test_inputs/basicTest.pwqp b/cloog-0.16.3/isl/test_inputs/basicTest.pwqp
deleted file mode 100644
index 52e7fc8..0000000
--- a/cloog-0.16.3/isl/test_inputs/basicTest.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[p] -> { [n, m] -> (n + n^2) : n >= 1 and m >= n and m <= p }
diff --git a/cloog-0.16.3/isl/test_inputs/basicTestParameterPosNeg.pwqp b/cloog-0.16.3/isl/test_inputs/basicTestParameterPosNeg.pwqp
deleted file mode 100644
index 6cb4490..0000000
--- a/cloog-0.16.3/isl/test_inputs/basicTestParameterPosNeg.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[p] -> { [n, m] -> (n + n^3) : n >= -1 and m >= n and m <= p }
diff --git a/cloog-0.16.3/isl/test_inputs/boulet.pip b/cloog-0.16.3/isl/test_inputs/boulet.pip
deleted file mode 100644
index 78e90dd..0000000
--- a/cloog-0.16.3/isl/test_inputs/boulet.pip
+++ /dev/null
@@ -1,13 +0,0 @@
-0 3
-
--1
-
-5 6
-1 1 -1  2 0 0
-1 0  1  1 4 20
-1 0 -1 -1 0 0
-1 0  1 -1 2 10
-1 0 -1  1 2 10
-
-Urs_parms
-Urs_unknowns
diff --git a/cloog-0.16.3/isl/test_inputs/brisebarre.pip b/cloog-0.16.3/isl/test_inputs/brisebarre.pip
deleted file mode 100644
index 5d25dae..0000000
--- a/cloog-0.16.3/isl/test_inputs/brisebarre.pip
+++ /dev/null
@@ -1,34 +0,0 @@
-# ---------------------- CONTEXT ----------------------
-1 2
-1    0
-
--1
-
-# ----------------------- DOMAIN ----------------------
-26 6
-1    3    0    0     0    -98300
-1   -3    0    0     0     98308
-1  432   36    6     1 -14757611
-1 -432  -36   -6    -1  14758510
-1   54    9    3     1  -1923190
-1  -54   -9   -3    -1   1923303
-1   48   12    6     3  -1782238
-1  -48  -12   -6    -3   1782339
-1   27    9    6     4  -1045164
-1  -27   -9   -6    -4   1045221
-1  432  180  150   125 -17434139
-1 -432 -180 -150  -125  17435038
-1    6    3    3     3   -252443
-1   -6   -3   -3    -3    252456
-1  432  252  294   343 -18949275
-1 -432 -252 -294  -343  18950174
-1   27   18   24    32  -1234720
-1  -27  -18  -24   -32   1234777
-1   48   36   54    81  -2288453
-1  -48  -36  -54   -81   2288554
-1   54   45   75   125  -2684050
-1  -54  -45  -75  -125   2684163
-1  432  396  726  1331 -22386005
-1 -432 -396 -726 -1331  22386904
-1    3    3    6    12   -162072
-1   -3   -3   -6   -12    162080
diff --git a/cloog-0.16.3/isl/test_inputs/cg1.pip b/cloog-0.16.3/isl/test_inputs/cg1.pip
deleted file mode 100644
index 78e31f1..0000000
--- a/cloog-0.16.3/isl/test_inputs/cg1.pip
+++ /dev/null
@@ -1,15 +0,0 @@
-2 4
-  1  1  0 -1
-  1 -1  1  0
-
--1
-
-8 7
-  1  0  1  0 -1  0  0
-  1  0 -1  0  1  0  0
-  1  1  0  0  0 -1  0
-  1 -1  0  0  0  1  0
-  1  0  1  0  0  0 -1
-  1  0 -1  0  0  1  0
-  1  0 -1  1  0  0 -1
-  1  0  0 -1  0  1  0
diff --git a/cloog-0.16.3/isl/test_inputs/convex0.polylib b/cloog-0.16.3/isl/test_inputs/convex0.polylib
deleted file mode 100644
index cbc4d3b..0000000
--- a/cloog-0.16.3/isl/test_inputs/convex0.polylib
+++ /dev/null
@@ -1,11 +0,0 @@
-2 3
-1 1 0
-1 -1 1
-
-2 3
-1 1 -1
-1 -1 2
-
-2 3
-1 1 0
-1 -1 2
diff --git a/cloog-0.16.3/isl/test_inputs/convex1.polylib b/cloog-0.16.3/isl/test_inputs/convex1.polylib
deleted file mode 100644
index b563d8d..0000000
--- a/cloog-0.16.3/isl/test_inputs/convex1.polylib
+++ /dev/null
@@ -1,17 +0,0 @@
-# {j,N | 0<=j<=N-1; 2<=N}
-4 4
-1   1  0   0
-1  -1  1  -1
-1   0  1  -2
-1   0  0   1
-# {j, N | 1<=j<=N; 1<=N}
-4 4
-1  1  0  -1
-1 -1  1   0
-1  0  1  -1
-1  0  0   1
-# {j,N | 0<=j<=N; 2<=j+N}
-3 4
-   1    1    1   -2
-   1    1    0    0
-   1   -1    1    0
diff --git a/cloog-0.16.3/isl/test_inputs/convex10.polylib b/cloog-0.16.3/isl/test_inputs/convex10.polylib
deleted file mode 100644
index 3d58cbf..0000000
--- a/cloog-0.16.3/isl/test_inputs/convex10.polylib
+++ /dev/null
@@ -1,17 +0,0 @@
-3 4
-1 54 1 -4
-1 2 -1 58
-1 0 -1 6
-
-4 4
-1 54 1 -4
-1 2 -1 58
-1 0 1 -7
-1 -4 1 0
-
-4 4
-1  54    1   -4
-1   2   -1   58
-1   0   -1  116
-1   0    0    1
-
diff --git a/cloog-0.16.3/isl/test_inputs/convex11.polylib b/cloog-0.16.3/isl/test_inputs/convex11.polylib
deleted file mode 100644
index f664114..0000000
--- a/cloog-0.16.3/isl/test_inputs/convex11.polylib
+++ /dev/null
@@ -1,14 +0,0 @@
-3 4
-1 0 -1 6
-1 -1 1 1
-1 1 1 -10
-
-3 4
-1 1 0 -4
-1 -1 -1 8
-1 -1 1 1
-
-3 4
-1 0 -1 6
-1 1 0 -4
-1 -1 1 1
diff --git a/cloog-0.16.3/isl/test_inputs/convex12.polylib b/cloog-0.16.3/isl/test_inputs/convex12.polylib
deleted file mode 100644
index e476630..0000000
--- a/cloog-0.16.3/isl/test_inputs/convex12.polylib
+++ /dev/null
@@ -1,12 +0,0 @@
-3 5
-1   0    0    1    1
-1   0    1    0    1
-1  -1   -1    0   -2
-
-3 5
-1   0    0    1    2
-1   1   -1    0    0
-1   1    0    0   -1
-
-1 5
-1   0    0    1    2
diff --git a/cloog-0.16.3/isl/test_inputs/convex13.polylib b/cloog-0.16.3/isl/test_inputs/convex13.polylib
deleted file mode 100644
index 1b35912..0000000
--- a/cloog-0.16.3/isl/test_inputs/convex13.polylib
+++ /dev/null
@@ -1,17 +0,0 @@
-3 5
-1   0    0   -1    3
-1   0   -1    0    2
-1   1    1    1   -4
-
-3 5
-1   0    0    1    0
-1   1    0    0   -1
-1   1    2    0    1
-
-6 5
-1   3    2    0   -1
-1   3    0    2   -3
-1   1    0    1   -1
-1   1    1    1    0
-1   1    1    0    0
-1   1    0    0    1
diff --git a/cloog-0.16.3/isl/test_inputs/convex14.polylib b/cloog-0.16.3/isl/test_inputs/convex14.polylib
deleted file mode 100644
index caaa8f5..0000000
--- a/cloog-0.16.3/isl/test_inputs/convex14.polylib
+++ /dev/null
@@ -1,14 +0,0 @@
-3 4
-0 1 0 2
-1 0 1 0
-1 0 -1 2
-
-3 4
-1 1 0 0
-1 0 1 0
-1 0 -1 2
-
-3 4
-1 1 0 2
-1 0 1 0
-1 0 -1 2
diff --git a/cloog-0.16.3/isl/test_inputs/convex15.polylib b/cloog-0.16.3/isl/test_inputs/convex15.polylib
deleted file mode 100644
index 0118fa8..0000000
--- a/cloog-0.16.3/isl/test_inputs/convex15.polylib
+++ /dev/null
@@ -1,66 +0,0 @@
-17 8
-1    -1    -8     0    16     0     0    37
-1     1     0   -48     0     2     0    -3
-1     0   -16   -32    16     1     0    14
-1    -1    24     0     0     1     0    18
-1    -1     8    16     0     0     1    21
-1     0     0   -16     0     1     1    -2
-1     1    32    16   -32     0     0    -1
-1    -1    16    16     0     0     0    28
-1     1    -8   -32     0     1     0    -1
-1     0     0     0     0     1     0    -1
-1     0    16    16   -16     0     1    -1
-1     1     8     0   -16     0     0     0
-1     0     3     2    -2     0     0     0
-1     0     1     2    -1     0     0     0
-1     0    -1    -1     1     0     0     0
-1    -1     8     0     0     1     2     4
-1    -1   -24   -32    32     1     0    36
-
-13 8
-1    -1     0     0     0     1     3    -4
-1     1     0   -48     0     2     0    -2
-1     0     0     0     0     1     0    -1
-1     0    -8     0     0     0     1    -1
-1     0     3     2    -2     0     0     0
-1     1   -16   -16     0     0     0     0
-1     1   -24     0     0     0     0     0
-1     0     1     0     0     0     0     0
-1     0    -3    -2     2     0     0     1
-1    -1     0    16     0     0     2    13
-1    -1    24     0     0     1     0    20
-1    -1    16    16     0     0     0    29
-1    -1     0    48     0     0     0    45
-
-31 8
-   1    0    1    0    0    0    0    0 
-   1    0    0  -16    0    1    1   -2 
-   1    0    0    0    0    1    0   -1 
-   1   -1    8    0    0    1    2    4 
-   1    0    3    2   -2    0    0    0 
-   1   -1   24    0    0    1    0   20 
-   1    1    0  -48    0    2    0   -2 
-   1   -1  -24  -32   32    1    0   36 
-   1    0    0    0    0    0    1   -1 
-   1   -1   24   64  -16    0    0   45 
-   1  -15  120  112    0   15   38   52 
-   1    1   24   32  -32    0    0    0 
-   1    0   -2   -2    2    0    0    1 
-   1   -1    8   16    0    0    1   21 
-   1  -15  120  352    0    0   23  307 
-   1    1   -8  -32    0    1    0   -1 
-   1    1   -8    0    0    0    0    0 
-   1    1   -8  -16    0    0    0    0 
-   1    0   16   16  -16    0    1   -1 
-   1   -1   16   16    0    0    0   29 
-   1   -1   -8    0   16    0    0   37 
-   1   -1    8   32    0    0    0   37 
-   1    1    8    0  -16    0    0    0 
-   1  -15  360  592 -240    0   23  307 
-   1   -1   -6    2   14    0    2   20 
-   1  -15  360  352 -240   15   38   52 
-   1   -1    8   48    0    0    0   45 
-   1    0  -16  -32   16    1    0   14 
-   1   -1   -6  -14   14    1    3    3 
-   1    1  -38  -78   30    2    0   13 
-   1    1   -3  -50    2    2    0   -1 
diff --git a/cloog-0.16.3/isl/test_inputs/convex2.polylib b/cloog-0.16.3/isl/test_inputs/convex2.polylib
deleted file mode 100644
index 0bfd737..0000000
--- a/cloog-0.16.3/isl/test_inputs/convex2.polylib
+++ /dev/null
@@ -1,24 +0,0 @@
-# {i,j,N | 1<=i<=N; 0<=j<=N-1; 2<=N}
-6 5
-1  1  0  0 -1
-1 -1  0  1  0
-1  0  1  0  0
-1  0 -1  1 -1 
-1  0  0  1 -2
-1  0  0  0  1
-# {i,j,N | 1<=i<=N; 1<=j<=N; 2<=N}
-6 5
-1  1  0  0 -1
-1 -1  0  1  0
-1  0  1  0 -1
-1  0 -1  1  0
-1  0  0  1 -2
-1  0  0  0  1
-# {i,j,N | 1<=i<=N; 0<=j<=N; 2<=N}
-6 5
-   1    0    0    1   -2
-   1   -1    0    1    0
-   1    0   -1    1    0
-   1    1    0    0   -1
-   1    0    1    0    0
-   1    0    0    0    1
diff --git a/cloog-0.16.3/isl/test_inputs/convex3.polylib b/cloog-0.16.3/isl/test_inputs/convex3.polylib
deleted file mode 100644
index ea612c6..0000000
--- a/cloog-0.16.3/isl/test_inputs/convex3.polylib
+++ /dev/null
@@ -1,10 +0,0 @@
-1 4
-1 1 1 -6
-
-3 4
-1 1 1 -3
-1 1 0 -5
-1 -1 0 10
-
-1 4
-1 1 1 -3
diff --git a/cloog-0.16.3/isl/test_inputs/convex4.polylib b/cloog-0.16.3/isl/test_inputs/convex4.polylib
deleted file mode 100644
index 0c08653..0000000
--- a/cloog-0.16.3/isl/test_inputs/convex4.polylib
+++ /dev/null
@@ -1,9 +0,0 @@
-1 4
-1 1 1 -6
-
-2 4
-0 1 0 -1
-0 0 1 -4
-
-1 4
-1 1 1 -5
diff --git a/cloog-0.16.3/isl/test_inputs/convex5.polylib b/cloog-0.16.3/isl/test_inputs/convex5.polylib
deleted file mode 100644
index 3aae7c2..0000000
--- a/cloog-0.16.3/isl/test_inputs/convex5.polylib
+++ /dev/null
@@ -1,12 +0,0 @@
-2 4
-0 1 0 -2
-0 0 1 -6
-
-2 4
-0 1 0 -1
-0 0 1 -4
-
-3 4
-0 -2 1 -2
-1  1 0 -1
-1 -1 0  2
diff --git a/cloog-0.16.3/isl/test_inputs/convex6.polylib b/cloog-0.16.3/isl/test_inputs/convex6.polylib
deleted file mode 100644
index 1bdb4e1..0000000
--- a/cloog-0.16.3/isl/test_inputs/convex6.polylib
+++ /dev/null
@@ -1,17 +0,0 @@
-3 4
-1   1    1   -2
-1  -1    1    2
-1   0   -1    2
-
-3 4
-1   0    1   -1
-1   1   -1    1
-1  -1   -1    5
-
-6 4
-1  -1    0    4
-1   1    0    0
-1   1    2   -2
-1  -1    2    2
-1   1   -2    4
-1  -1   -2    8
diff --git a/cloog-0.16.3/isl/test_inputs/convex7.polylib b/cloog-0.16.3/isl/test_inputs/convex7.polylib
deleted file mode 100644
index 70eb483..0000000
--- a/cloog-0.16.3/isl/test_inputs/convex7.polylib
+++ /dev/null
@@ -1,9 +0,0 @@
-1 4
-0 0 1 0
-
-2 4
-1 1 -1 1
-1 -1 -1 1
-
-1 4
-1 0 -1 1
diff --git a/cloog-0.16.3/isl/test_inputs/convex8.polylib b/cloog-0.16.3/isl/test_inputs/convex8.polylib
deleted file mode 100644
index ea1b757..0000000
--- a/cloog-0.16.3/isl/test_inputs/convex8.polylib
+++ /dev/null
@@ -1,24 +0,0 @@
-4 5
-1   1    1    1    0
-1   0   -1    0    0
-1  -1    0    0    2
-1   1    1   -1    0
-
-4 5
-1  -1    1    0    2
-1   1   -2   -2   -1
-1  -1    0    2    3
-1   1    0    0   -1
-
-10 5
-1   1    0    1    0
-1   1    1    0    0
-1   0    1    1    2
-1  -3    1   -1    8
-1  -3    1    1    8
-1   0    1   -1    2
-1   1    0   -1    0
-1   1   -2   -1    0
-1  -1   -3    2    6
-1   1   -5   -2    2
-
diff --git a/cloog-0.16.3/isl/test_inputs/convex9.polylib b/cloog-0.16.3/isl/test_inputs/convex9.polylib
deleted file mode 100644
index f68fca0..0000000
--- a/cloog-0.16.3/isl/test_inputs/convex9.polylib
+++ /dev/null
@@ -1,14 +0,0 @@
-4 4
-1 1 0 0
-1 -1 0 1
-1 0 1 0
-1 0 -1 10
-
-2 4
-1 1 0 -10
-0 0 -1 5
-
-3 4
-1 1 0 0
-1 0 1 0
-1 0 -1 10
diff --git a/cloog-0.16.3/isl/test_inputs/devos.pwqp b/cloog-0.16.3/isl/test_inputs/devos.pwqp
deleted file mode 100644
index b452544..0000000
--- a/cloog-0.16.3/isl/test_inputs/devos.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[U] -> { [i0] -> ((1/3 * U + 2/3 * i0) - [(U + 2i0)/3]) : 2i0 >= -3 - U and 2i0 <= -U and U >= 0 and U <= 10 }
diff --git a/cloog-0.16.3/isl/test_inputs/equality1.pwqp b/cloog-0.16.3/isl/test_inputs/equality1.pwqp
deleted file mode 100644
index eb16a4b..0000000
--- a/cloog-0.16.3/isl/test_inputs/equality1.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[n] -> { [x] -> 1 + [(x+1)/3] : exists a : x = 3a +1 && 0 <= x <= n }
diff --git a/cloog-0.16.3/isl/test_inputs/equality2.pwqp b/cloog-0.16.3/isl/test_inputs/equality2.pwqp
deleted file mode 100644
index 1629a65..0000000
--- a/cloog-0.16.3/isl/test_inputs/equality2.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[n] -> { [x,y] -> x^2 * y : n = 2x + 4y and 0 <= x,y <= 10 }
diff --git a/cloog-0.16.3/isl/test_inputs/equality3.pwqp b/cloog-0.16.3/isl/test_inputs/equality3.pwqp
deleted file mode 100644
index c6f8c3a..0000000
--- a/cloog-0.16.3/isl/test_inputs/equality3.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[m,n] -> { [x,y] -> x^2 * y : n = 2x + 4y and 0 <= x,y <= 10 and 3 n = 5 m }
diff --git a/cloog-0.16.3/isl/test_inputs/equality4.pwqp b/cloog-0.16.3/isl/test_inputs/equality4.pwqp
deleted file mode 100644
index 49da2e7..0000000
--- a/cloog-0.16.3/isl/test_inputs/equality4.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[m,n] -> { [x,y] -> x^2 * y + m + 13 * n: n = 2x + 4y and 0 <= x,y <= 10 and 3 n = 5 m }
diff --git a/cloog-0.16.3/isl/test_inputs/equality5.pwqp b/cloog-0.16.3/isl/test_inputs/equality5.pwqp
deleted file mode 100644
index 09cb752..0000000
--- a/cloog-0.16.3/isl/test_inputs/equality5.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[m,n] -> { [x,y,z] -> x^2 * y + z + m + 13 * n: n = 2x + 4y and 0 <= x,y <= 10 and 3 n = 5 m and z = x + y }
diff --git a/cloog-0.16.3/isl/test_inputs/esced.pip b/cloog-0.16.3/isl/test_inputs/esced.pip
deleted file mode 100644
index dbf56ff..0000000
--- a/cloog-0.16.3/isl/test_inputs/esced.pip
+++ /dev/null
@@ -1,27 +0,0 @@
-0 2
-
--1
-
-16 18
-1 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 0 0 0
-1 0 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 0 0
-1 0 0 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 0
-1 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0
-1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
-1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
-
-
-0 0 0 0 -1 0 0 0 0 1 -1 0 0 0 0 0 0 0
-0 0 0 0 0 -1 0 0 0 0 0 1 0 0 0 0 0 0
-
-0 -1 0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 0
-
-0 0 0 0 0 0 -1 0 0 0 0 0 1 -1 0 -1 0 0
-0 0 0 0 0 0 0 -1 0 0 0 0 0 0 1 0 0 0
-0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 1 0
-
-0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0
-0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0
-
-1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1
-1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 -1
diff --git a/cloog-0.16.3/isl/test_inputs/ex.pip b/cloog-0.16.3/isl/test_inputs/ex.pip
deleted file mode 100644
index a405450..0000000
--- a/cloog-0.16.3/isl/test_inputs/ex.pip
+++ /dev/null
@@ -1,9 +0,0 @@
-1 5
-1 -1  1  1  0 
-
--1
-
-3 7
-1  0 -1  0  1  0  0 
-1 -1  0  0  0  1  0 
-1  1  1 -1  0  0  0 
diff --git a/cloog-0.16.3/isl/test_inputs/ex2.pip b/cloog-0.16.3/isl/test_inputs/ex2.pip
deleted file mode 100644
index bb59848..0000000
--- a/cloog-0.16.3/isl/test_inputs/ex2.pip
+++ /dev/null
@@ -1,9 +0,0 @@
-1 5
-1 -1 1 1 0
-
--1
-
-3 7
-1 0 -1 0 1 0 0
-1 -1 0 0 0 1 0
-1 1 1 -1 0 0 0
diff --git a/cloog-0.16.3/isl/test_inputs/faddeev.pwqp b/cloog-0.16.3/isl/test_inputs/faddeev.pwqp
deleted file mode 100644
index e7db61d..0000000
--- a/cloog-0.16.3/isl/test_inputs/faddeev.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[N] -> { [i, j, k] -> (((4 + 6 * N + 2 * N^2) + (-2 - 2 * N) * j) + ((-2 - N) + j) * k) : j = 1 + i and k = 1 + i and i >= 3 and N <= 100 and i <= N and N >= 10 }
diff --git a/cloog-0.16.3/isl/test_inputs/fimmel.pip b/cloog-0.16.3/isl/test_inputs/fimmel.pip
deleted file mode 100644
index a6dee41..0000000
--- a/cloog-0.16.3/isl/test_inputs/fimmel.pip
+++ /dev/null
@@ -1,12 +0,0 @@
-0 4
-
--1
-
-7 6
-1 2  6 0 0 -9
-1 5 -3 0 0 0
-1 2 -10 0 0 15
-1 -2 6 0 0 -3
-1 -2 -6 0 0 17
-1 0 1 -1 0 0
-1 1 0 0 -1 0
diff --git a/cloog-0.16.3/isl/test_inputs/gist1.polylib b/cloog-0.16.3/isl/test_inputs/gist1.polylib
deleted file mode 100644
index 802a4eb..0000000
--- a/cloog-0.16.3/isl/test_inputs/gist1.polylib
+++ /dev/null
@@ -1,14 +0,0 @@
-4 5
-0 1 0 0 -1
-0 0 1 0 1
-0 0 0 1 -3
-1 0 0 0 1
-
-4 5
-0 1 0 0 -1
-0 0 1 1 -2
-1 0 0 1 0
-1 0 0 -1 3
-
-1 5
-0 0 1 0 1
diff --git a/cloog-0.16.3/isl/test_inputs/linearExample.pwqp b/cloog-0.16.3/isl/test_inputs/linearExample.pwqp
deleted file mode 100644
index 24c5394..0000000
--- a/cloog-0.16.3/isl/test_inputs/linearExample.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[N, M, L] -> { [i, j, k] -> ((1/2 * i + 5 * j) + 1/7 * k) : i >= 0 and k >= -N + i and k >= -M - j and j <= L + i and L >= 0 and L >= -M }
diff --git a/cloog-0.16.3/isl/test_inputs/max.pip b/cloog-0.16.3/isl/test_inputs/max.pip
deleted file mode 100644
index e8af57b..0000000
--- a/cloog-0.16.3/isl/test_inputs/max.pip
+++ /dev/null
@@ -1,9 +0,0 @@
-0 3
-
--1
-
-4 5
-1 -1  0  1  0
-1  0 -1  1  0
-1 -1  3 -2 12
-1  2 -1 -1  3
diff --git a/cloog-0.16.3/isl/test_inputs/neg.pwqp b/cloog-0.16.3/isl/test_inputs/neg.pwqp
deleted file mode 100644
index 596a7d7..0000000
--- a/cloog-0.16.3/isl/test_inputs/neg.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[n] -> { [i0] -> i0^2 : i0 >= -20 - n and i0 <= n and i0 <= -1 and n >= 0 }
diff --git a/cloog-0.16.3/isl/test_inputs/negative.pip b/cloog-0.16.3/isl/test_inputs/negative.pip
deleted file mode 100644
index 45090a5..0000000
--- a/cloog-0.16.3/isl/test_inputs/negative.pip
+++ /dev/null
@@ -1,9 +0,0 @@
-1 3
-#  n  1
-1  1 -1 # n >= 1
--1
-
-2 4
-#  i  n  1
-1  1  0  1 # i >= -1
-1 -1  1  0 # i <= n
diff --git a/cloog-0.16.3/isl/test_inputs/philippe.pwqp b/cloog-0.16.3/isl/test_inputs/philippe.pwqp
deleted file mode 100644
index 1c56e7a..0000000
--- a/cloog-0.16.3/isl/test_inputs/philippe.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[N] -> { [i, j] -> ((1/2 * i + 1/2 * i^2) + j) : i <= N and j >= 0 and j <= i }
diff --git a/cloog-0.16.3/isl/test_inputs/philippe3vars.pwqp b/cloog-0.16.3/isl/test_inputs/philippe3vars.pwqp
deleted file mode 100644
index 8d07496..0000000
--- a/cloog-0.16.3/isl/test_inputs/philippe3vars.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[N] -> { [i, j, k] -> (((1/2 * i + 1/2 * i^2) + j) + k^3) : i >= 0 and k >= -N + i and k >= -j and j <= i }
diff --git a/cloog-0.16.3/isl/test_inputs/philippe3vars3pars.pwqp b/cloog-0.16.3/isl/test_inputs/philippe3vars3pars.pwqp
deleted file mode 100644
index f81b8cc..0000000
--- a/cloog-0.16.3/isl/test_inputs/philippe3vars3pars.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[N, M, L] -> { [i, j, k] -> (((1/2 * i + 1/2 * i^2) + j) + k^3) : i >= 0 and k >= -N + i and k >= -M - j and j <= L + i and L >= 0 and L >= -M }
diff --git a/cloog-0.16.3/isl/test_inputs/philippeNeg.pwqp b/cloog-0.16.3/isl/test_inputs/philippeNeg.pwqp
deleted file mode 100644
index 24dc805..0000000
--- a/cloog-0.16.3/isl/test_inputs/philippeNeg.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[N] -> { [i, j] -> ((1/2 * i + 1/2 * i^2) + j) : i <= N and j >= -1 and j <= i }
diff --git a/cloog-0.16.3/isl/test_inputs/philippePolynomialCoeff.pwqp b/cloog-0.16.3/isl/test_inputs/philippePolynomialCoeff.pwqp
deleted file mode 100644
index e6327c7..0000000
--- a/cloog-0.16.3/isl/test_inputs/philippePolynomialCoeff.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[N, M] -> { [i, j] -> ((N * i + (1/5 * N + N^2) * i^2) + 5 * j) : i <= N and j >= 0 and j <= i and M >= 0 }
diff --git a/cloog-0.16.3/isl/test_inputs/philippePolynomialCoeff1P.pwqp b/cloog-0.16.3/isl/test_inputs/philippePolynomialCoeff1P.pwqp
deleted file mode 100644
index ae01d2f..0000000
--- a/cloog-0.16.3/isl/test_inputs/philippePolynomialCoeff1P.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[N] -> { [i, j] -> ((N * i + (1/5 * N + N^2) * i^2) + 5 * j) : i <= N and j >= 0 and j <= i }
diff --git a/cloog-0.16.3/isl/test_inputs/product.pwqp b/cloog-0.16.3/isl/test_inputs/product.pwqp
deleted file mode 100644
index ee48b85..0000000
--- a/cloog-0.16.3/isl/test_inputs/product.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[N] -> { [i0, i1, i2] -> (i0^3 * i1^2 + N * i1 * i2) : i0 >= 0 and i0 <= N and i1 >= 0 and i1 <= N and i2 >= 0 and i2 <= N }
diff --git a/cloog-0.16.3/isl/test_inputs/seghir-vd.pip b/cloog-0.16.3/isl/test_inputs/seghir-vd.pip
deleted file mode 100644
index b5395fb..0000000
--- a/cloog-0.16.3/isl/test_inputs/seghir-vd.pip
+++ /dev/null
@@ -1,17 +0,0 @@
-0 6
-
--1
-
-9 8
- 0 0 0 1 1 0 0 2
- 1 2 1 0 0 1 0 0
- 1 0 1 0 -1 0 0 -1
- 1 -2 -1 0 0 0 0 -1
- 1 7 3 0 0 0 0 -1
- 1 -6 -4 0 1 0 3 1
- 1 -7 -3 0 0 1 6 4
- 1 0 0 0 0 0 1 0
- 1 0 0 0 0 0 0 1
-
-Urs_parms
-Urs_unknowns
diff --git a/cloog-0.16.3/isl/test_inputs/set.omega b/cloog-0.16.3/isl/test_inputs/set.omega
deleted file mode 100644
index ac8485f..0000000
--- a/cloog-0.16.3/isl/test_inputs/set.omega
+++ /dev/null
@@ -1 +0,0 @@
-{[y]: Exists ( alpha : 2alpha = y)}
diff --git a/cloog-0.16.3/isl/test_inputs/small.pip b/cloog-0.16.3/isl/test_inputs/small.pip
deleted file mode 100644
index 59557d2..0000000
--- a/cloog-0.16.3/isl/test_inputs/small.pip
+++ /dev/null
@@ -1,9 +0,0 @@
-0 2
-
--1
-
-4 4
-1  1  0  0
-1  0  1  0
-1  1 -3 12
-1 -2  1  3
diff --git a/cloog-0.16.3/isl/test_inputs/sor1d.pip b/cloog-0.16.3/isl/test_inputs/sor1d.pip
deleted file mode 100644
index 1bef89e..0000000
--- a/cloog-0.16.3/isl/test_inputs/sor1d.pip
+++ /dev/null
@@ -1,28 +0,0 @@
-2 4
- 1	1	0	0
- 1	0	1	0
-
--1
-
-20 8
- 
- 0	-1	0	0	0	0	0	2
- 0	0	-1	0	0	0	0	1
- 0	0	0	-1	0	0	0	2
- 0	0	0	0	-1	0	0	4
- 1	0	0	0	1	0	0	-2
- 1	-2	0	2	1	0	0	-4
- 1	0	0	0	-1	0	1	-1
- 1	2	0	-2	-1	0	0	5
- 1	0	0	1	0	0	0	-1
- 1	0	-2	1	0	0	0	0
- 1	-2	0	2	0	0	1	-5
- 1	0	0	-1	0	1	0	0
- 1	0	2	-1	0	0	0	1
- 1	2	0	-2	0	0	0	3
- 1	0	1	0	0	0	0	0
- 1	-2	4	0	0	0	1	-3
- 1	0	-2	0	0	1	0	0
- 1	2	-4	0	0	0	0	3
- 1	2	0	0	0	0	0	1
- 1	-2	0	0	0	2	1	-5
diff --git a/cloog-0.16.3/isl/test_inputs/split.pwqp b/cloog-0.16.3/isl/test_inputs/split.pwqp
deleted file mode 100644
index 1804563..0000000
--- a/cloog-0.16.3/isl/test_inputs/split.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[n] -> { [x] -> -1 + [(x+5)/7] : -n - 20 <= x <= n }
diff --git a/cloog-0.16.3/isl/test_inputs/square.pip b/cloog-0.16.3/isl/test_inputs/square.pip
deleted file mode 100644
index 7bb3f0c..0000000
--- a/cloog-0.16.3/isl/test_inputs/square.pip
+++ /dev/null
@@ -1,9 +0,0 @@
-0 3
-
--1
-
-4 5
-1  1  0  0  0
-1 -1  0  1  0
-1  0  1  0  0
-1  0 -1  1  0
diff --git a/cloog-0.16.3/isl/test_inputs/sven.pip b/cloog-0.16.3/isl/test_inputs/sven.pip
deleted file mode 100644
index 8602769..0000000
--- a/cloog-0.16.3/isl/test_inputs/sven.pip
+++ /dev/null
@@ -1,7 +0,0 @@
-0 3
-
--1
-
-2 3
-1  1 -4
-1 -1 10
diff --git a/cloog-0.16.3/isl/test_inputs/test3Deg3Var.pwqp b/cloog-0.16.3/isl/test_inputs/test3Deg3Var.pwqp
deleted file mode 100644
index d9a9ea9..0000000
--- a/cloog-0.16.3/isl/test_inputs/test3Deg3Var.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[p] -> { [n, m] -> (n + n^3) : n >= 1 and m >= n and m <= p }
diff --git a/cloog-0.16.3/isl/test_inputs/tobi.pip b/cloog-0.16.3/isl/test_inputs/tobi.pip
deleted file mode 100644
index c31beae..0000000
--- a/cloog-0.16.3/isl/test_inputs/tobi.pip
+++ /dev/null
@@ -1,15 +0,0 @@
-2 3
-1 1 -281
-1 -1 14000
-
--1
-
-6 6
-0  -392     0     8    -1     0
-0   392     8     0     1     0
-1    -1     0     0     0     0
-1     1     0     0     0    35
-1   392     0     0     1     0
-1  -392     0     0    -1   280
-
-Urs_unknowns
diff --git a/cloog-0.16.3/isl/test_inputs/toplas.pwqp b/cloog-0.16.3/isl/test_inputs/toplas.pwqp
deleted file mode 100644
index 9c09995..0000000
--- a/cloog-0.16.3/isl/test_inputs/toplas.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[n] -> { [i0, i1] -> (((4 * n - n^2) + (-3/2 + 2 * n) * i0 - 1/2 * i0^2) - i1) : i1 >= -1 + 3n - i0 and i1 >= -1 + 2n - i0 and i0 >= 0 and i1 <= -2 + 4n - i0 and i0 <= -2 + 4n and i0 <= -1 + 3n and i1 >= 0 and i1 <= -1 + n }
diff --git a/cloog-0.16.3/isl/test_inputs/unexpanded.pwqp b/cloog-0.16.3/isl/test_inputs/unexpanded.pwqp
deleted file mode 100644
index 5626d3b..0000000
--- a/cloog-0.16.3/isl/test_inputs/unexpanded.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-{ [x, y] -> ((x - x^2) * y + (-x + x^2) * y^2) : x >= 0 and x <= 2 and y >= 0 and y <= 2 }
diff --git a/cloog-0.16.3/m4/ax_cc_maxopt.m4 b/cloog-0.16.3/m4/ax_cc_maxopt.m4
deleted file mode 100644
index da415be..0000000
--- a/cloog-0.16.3/m4/ax_cc_maxopt.m4
+++ /dev/null
@@ -1,178 +0,0 @@
-# ===========================================================================
-#          http://www.nongnu.org/autoconf-archive/ax_cc_maxopt.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_CC_MAXOPT
-#
-# DESCRIPTION
-#
-#   Try to turn on "good" C optimization flags for various compilers and
-#   architectures, for some definition of "good". (In our case, good for
-#   FFTW and hopefully for other scientific codes. Modify as needed.)
-#
-#   The user can override the flags by setting the CFLAGS environment
-#   variable. The user can also specify --enable-portable-binary in order to
-#   disable any optimization flags that might result in a binary that only
-#   runs on the host architecture.
-#
-#   Note also that the flags assume that ANSI C aliasing rules are followed
-#   by the code (e.g. for gcc's -fstrict-aliasing), and that floating-point
-#   computations can be re-ordered as needed.
-#
-#   Requires macros: AX_CHECK_COMPILER_FLAGS, AX_COMPILER_VENDOR,
-#   AX_GCC_ARCHFLAG, AX_GCC_X86_CPUID.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
-#   Copyright (c) 2008 Matteo Frigo
-#
-#   This program is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation, either version 3 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_CC_MAXOPT],
-[
-AC_REQUIRE([AC_PROG_CC])
-AC_REQUIRE([AX_COMPILER_VENDOR])
-AC_REQUIRE([AC_CANONICAL_HOST])
-
-AC_ARG_ENABLE(portable-binary, [AC_HELP_STRING([--enable-portable-binary], [disable compiler optimizations that would produce unportable binaries])],
-	acx_maxopt_portable=$withval, acx_maxopt_portable=no)
-
-# Try to determine "good" native compiler flags if none specified via CFLAGS
-if test "$ac_test_CFLAGS" != "set"; then
-  CFLAGS=""
-  case $ax_cv_c_compiler_vendor in
-    dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host"
-	 if test "x$acx_maxopt_portable" = xno; then
-           CFLAGS="$CFLAGS -arch host"
-         fi;;
-
-    sun) CFLAGS="-native -fast -xO5 -dalign"
-	 if test "x$acx_maxopt_portable" = xyes; then
-	   CFLAGS="$CFLAGS -xarch=generic"
-         fi;;
-
-    hp)  CFLAGS="+Oall +Optrs_ansi +DSnative"
-	 if test "x$acx_maxopt_portable" = xyes; then
-	   CFLAGS="$CFLAGS +DAportable"
-	 fi;;
-
-    ibm) if test "x$acx_maxopt_portable" = xno; then
-           xlc_opt="-qarch=auto -qtune=auto"
-	 else
-           xlc_opt="-qtune=auto"
-	 fi
-         AX_CHECK_COMPILER_FLAGS($xlc_opt,
-         	CFLAGS="-O3 -qansialias -w $xlc_opt",
-               [CFLAGS="-O3 -qansialias -w"
-                echo "******************************************************"
-                echo "*  You seem to have the IBM  C compiler.  It is      *"
-                echo "*  recommended for best performance that you use:    *"
-                echo "*                                                    *"
-                echo "*    CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *"
-                echo "*                      ^^^        ^^^                *"
-                echo "*  where xxx is pwr2, pwr3, 604, or whatever kind of *"
-                echo "*  CPU you have.  (Set the CFLAGS environment var.   *"
-                echo "*  and re-run configure.)  For more info, man cc.    *"
-                echo "******************************************************"])
-         ;;
-
-    intel) CFLAGS="-O3 -ansi_alias"
-	if test "x$acx_maxopt_portable" = xno; then
-	  icc_archflag=unknown
-	  icc_flags=""
-	  case $host_cpu in
-	    i686*|x86_64*)
-              # icc accepts gcc assembly syntax, so these should work:
-	      AX_GCC_X86_CPUID(0)
-              AX_GCC_X86_CPUID(1)
-	      case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG
-                *:756e6547:*:*) # Intel
-                  case $ax_cv_gcc_x86_cpuid_1 in
-                    *6a?:*[[234]]:*:*|*6[[789b]]?:*:*:*) icc_flags="-xK";;
-                    *f3[[347]]:*:*:*|*f4[1347]:*:*:*) icc_flags="-xP -xN -xW -xK";;
-                    *f??:*:*:*) icc_flags="-xN -xW -xK";;
-                  esac ;;
-              esac ;;
-          esac
-          if test "x$icc_flags" != x; then
-            for flag in $icc_flags; do
-              AX_CHECK_COMPILER_FLAGS($flag, [icc_archflag=$flag; break])
-            done
-          fi
-          AC_MSG_CHECKING([for icc architecture flag])
-	  AC_MSG_RESULT($icc_archflag)
-          if test "x$icc_archflag" != xunknown; then
-            CFLAGS="$CFLAGS $icc_archflag"
-          fi
-        fi
-	;;
-
-    gnu)
-     # default optimization flags for gcc on all systems
-     CFLAGS="-O3 -fomit-frame-pointer"
-
-     # -malign-double for x86 systems
-     AX_CHECK_COMPILER_FLAGS(-malign-double, CFLAGS="$CFLAGS -malign-double")
-
-     #  -fstrict-aliasing for gcc-2.95+
-     AX_CHECK_COMPILER_FLAGS(-fstrict-aliasing,
-	CFLAGS="$CFLAGS -fstrict-aliasing")
-
-     # note that we enable "unsafe" fp optimization with other compilers, too
-     AX_CHECK_COMPILER_FLAGS(-ffast-math, CFLAGS="$CFLAGS -ffast-math")
-
-     AX_GCC_ARCHFLAG($acx_maxopt_portable)
-     ;;
-  esac
-
-  if test -z "$CFLAGS"; then
-	echo ""
-	echo "********************************************************"
-        echo "* WARNING: Don't know the best CFLAGS for this system  *"
-        echo "* Use ./configure CFLAGS=... to specify your own flags *"
-	echo "* (otherwise, a default of CFLAGS=-O3 will be used)    *"
-	echo "********************************************************"
-	echo ""
-        CFLAGS="-O3"
-  fi
-
-  AX_CHECK_COMPILER_FLAGS($CFLAGS, [], [
-	echo ""
-        echo "********************************************************"
-        echo "* WARNING: The guessed CFLAGS don't seem to work with  *"
-        echo "* your compiler.                                       *"
-        echo "* Use ./configure CFLAGS=... to specify your own flags *"
-        echo "********************************************************"
-        echo ""
-        CFLAGS=""
-  ])
-
-fi
-])
diff --git a/cloog-0.16.3/m4/ax_cflags_warn_all.m4 b/cloog-0.16.3/m4/ax_cflags_warn_all.m4
deleted file mode 100644
index 026c6e9..0000000
--- a/cloog-0.16.3/m4/ax_cflags_warn_all.m4
+++ /dev/null
@@ -1,149 +0,0 @@
-# ===========================================================================
-#       http://www.nongnu.org/autoconf-archive/ax_cflags_warn_all.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])]
-#
-# DESCRIPTION
-#
-#   Try to find a compiler option that enables most reasonable warnings.
-#
-#   For the GNU CC compiler it will be -Wall (and -ansi -pedantic) The
-#   result is added to the shellvar being CFLAGS by default.
-#
-#   Currently this macro knows about GCC, Solaris C compiler, Digital Unix C
-#   compiler, C for AIX Compiler, HP-UX C compiler, IRIX C compiler, NEC
-#   SX-5 (Super-UX 10) C compiler, and Cray J90 (Unicos 10.0.0.8) C
-#   compiler.
-#
-#    - $1 shell-variable-to-add-to : CFLAGS
-#    - $2 add-value-if-not-found : nothing
-#    - $3 action-if-found : add value to shellvariable
-#    - $4 action-if-not-found : nothing
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
-#
-#   This program is free software; you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation; either version 2 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl
-AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl
-AS_VAR_PUSHDEF([VAR],[ac_cv_cflags_warn_all])dnl
-AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings],
-VAR,[VAR="no, unknown"
- AC_LANG_SAVE
- AC_LANG_C
- ac_save_[]FLAGS="$[]FLAGS"
-for ac_arg dnl
-in "-pedantic  % -Wall"       dnl   GCC
-   "-xstrconst % -v"          dnl Solaris C
-   "-std1      % -verbose -w0 -warnprotos" dnl Digital Unix
-   "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX
-   "-ansi -ansiE % -fullwarn" dnl IRIX
-   "+ESlit     % +w1"         dnl HP-UX C
-   "-Xc        % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10)
-   "-h conform % -h msglevel 2" dnl Cray C (Unicos)
-   #
-do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
-   AC_TRY_COMPILE([],[return 0;],
-   [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
-done
- FLAGS="$ac_save_[]FLAGS"
- AC_LANG_RESTORE
-])
-case ".$VAR" in
-     .ok|.ok,*) m4_ifvaln($3,$3) ;;
-   .|.no|.no,*) m4_ifvaln($4,$4,[m4_ifval($2,[
-        AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])
-                      m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])]) ;;
-   *) m4_ifvaln($3,$3,[
-   if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
-   then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR])
-   else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"])
-                      m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"
-   fi ]) ;;
-esac
-AS_VAR_POPDEF([VAR])dnl
-AS_VAR_POPDEF([FLAGS])dnl
-])
-
-dnl the only difference - the LANG selection... and the default FLAGS
-
-AC_DEFUN([AX_CXXFLAGS_WARN_ALL],[dnl
-AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl
-AS_VAR_PUSHDEF([VAR],[ax_cv_cxxflags_warn_all])dnl
-AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings],
-VAR,[VAR="no, unknown"
- AC_LANG_SAVE
- AC_LANG_CPLUSPLUS
- ac_save_[]FLAGS="$[]FLAGS"
-for ac_arg dnl
-in "-pedantic  % -Wall"       dnl   GCC
-   "-xstrconst % -v"          dnl Solaris C
-   "-std1      % -verbose -w0 -warnprotos" dnl Digital Unix
-   "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX
-   "-ansi -ansiE % -fullwarn" dnl IRIX
-   "+ESlit     % +w1"         dnl HP-UX C
-   "-Xc        % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10)
-   "-h conform % -h msglevel 2" dnl Cray C (Unicos)
-   #
-do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
-   AC_TRY_COMPILE([],[return 0;],
-   [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
-done
- FLAGS="$ac_save_[]FLAGS"
- AC_LANG_RESTORE
-])
-case ".$VAR" in
-     .ok|.ok,*) m4_ifvaln($3,$3) ;;
-   .|.no|.no,*) m4_ifvaln($4,$4,[m4_ifval($2,[
-        AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])
-                      m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])]) ;;
-   *) m4_ifvaln($3,$3,[
-   if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
-   then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR])
-   else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"])
-                      m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"
-   fi ]) ;;
-esac
-AS_VAR_POPDEF([VAR])dnl
-AS_VAR_POPDEF([FLAGS])dnl
-])
-
-dnl  implementation tactics:
-dnl   the for-argument contains a list of options. The first part of
-dnl   these does only exist to detect the compiler - usually it is
-dnl   a global option to enable -ansi or -extrawarnings. All other
-dnl   compilers will fail about it. That was needed since a lot of
-dnl   compilers will give false positives for some option-syntax
-dnl   like -Woption or -Xoption as they think of it is a pass-through
-dnl   to later compile stages or something. The "%" is used as a
-dnl   delimimiter. A non-option comment can be given after "%%" marks
-dnl   which will be shown but not added to the respective C/CXXFLAGS.
diff --git a/cloog-0.16.3/m4/ax_check_compiler_flags.m4 b/cloog-0.16.3/m4/ax_check_compiler_flags.m4
deleted file mode 100644
index 7da8324..0000000
--- a/cloog-0.16.3/m4/ax_check_compiler_flags.m4
+++ /dev/null
@@ -1,74 +0,0 @@
-# ===========================================================================
-#     http://www.nongnu.org/autoconf-archive/ax_check_compiler_flags.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_CHECK_COMPILER_FLAGS(FLAGS, [ACTION-SUCCESS], [ACTION-FAILURE])
-#
-# DESCRIPTION
-#
-#   Check whether the given compiler FLAGS work with the current language's
-#   compiler, or whether they give an error. (Warnings, however, are
-#   ignored.)
-#
-#   ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
-#   success/failure.
-#
-# LICENSE
-#
-#   Copyright (c) 2009 Steven G. Johnson <stevenj@alum.mit.edu>
-#   Copyright (c) 2009 Matteo Frigo
-#
-#   This program is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation, either version 3 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_CHECK_COMPILER_FLAGS],
-[AC_PREREQ(2.59) dnl for _AC_LANG_PREFIX
-AC_MSG_CHECKING([whether _AC_LANG compiler accepts $1])
-dnl Some hackery here since AC_CACHE_VAL can't handle a non-literal varname:
-AS_LITERAL_IF([$1],
-  [AC_CACHE_VAL(AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1]), [
-      ax_save_FLAGS=$[]_AC_LANG_PREFIX[]FLAGS
-      _AC_LANG_PREFIX[]FLAGS="$1"
-      AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
-        AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=yes,
-        AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=no)
-      _AC_LANG_PREFIX[]FLAGS=$ax_save_FLAGS])],
-  [ax_save_FLAGS=$[]_AC_LANG_PREFIX[]FLAGS
-   _AC_LANG_PREFIX[]FLAGS="$1"
-   AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
-     eval AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=yes,
-     eval AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=no)
-   _AC_LANG_PREFIX[]FLAGS=$ax_save_FLAGS])
-eval ax_check_compiler_flags=$AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])
-AC_MSG_RESULT($ax_check_compiler_flags)
-if test "x$ax_check_compiler_flags" = xyes; then
-	m4_default([$2], :)
-else
-	m4_default([$3], :)
-fi
-])dnl AX_CHECK_COMPILER_FLAGS
diff --git a/cloog-0.16.3/m4/ax_compiler_vendor.m4 b/cloog-0.16.3/m4/ax_compiler_vendor.m4
deleted file mode 100644
index b074260..0000000
--- a/cloog-0.16.3/m4/ax_compiler_vendor.m4
+++ /dev/null
@@ -1,61 +0,0 @@
-# ===========================================================================
-#       http://www.nongnu.org/autoconf-archive/ax_compiler_vendor.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_COMPILER_VENDOR
-#
-# DESCRIPTION
-#
-#   Determine the vendor of the C/C++ compiler, e.g., gnu, intel, ibm, sun,
-#   hp, borland, comeau, dec, cray, kai, lcc, metrowerks, sgi, microsoft,
-#   watcom, etc. The vendor is returned in the cache variable
-#   $ax_cv_c_compiler_vendor for C and $ax_cv_cxx_compiler_vendor for C++.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
-#   Copyright (c) 2008 Matteo Frigo
-#
-#   This program is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation, either version 3 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_COMPILER_VENDOR],
-[
-AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor,
- [ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=unknown
-  # note: don't check for gcc first since some other compilers define __GNUC__
-  for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale:__PATHCC__,__PATHSCALE__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do
-    vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")"
-    AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[
-#if !($vencpp)
-      thisisanerror;
-#endif
-])], [ax_cv_]_AC_LANG_ABBREV[_compiler_vendor=`echo $ventest | cut -d: -f1`; break])
-  done
- ])
-])
diff --git a/cloog-0.16.3/m4/ax_create_pkgconfig_info.m4 b/cloog-0.16.3/m4/ax_create_pkgconfig_info.m4
deleted file mode 100644
index 60ac548..0000000
--- a/cloog-0.16.3/m4/ax_create_pkgconfig_info.m4
+++ /dev/null
@@ -1,349 +0,0 @@
-# ===========================================================================
-#    http://www.nongnu.org/autoconf-archive/ax_create_pkgconfig_info.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_CREATE_PKGCONFIG_INFO [(outputfile, [requires [,libs [,summary [,cflags [, ldflags]]]]])]
-#
-# DESCRIPTION
-#
-#   Defaults:
-#
-#     $1 = $PACKAGE_NAME.pc
-#     $2 = (empty)
-#     $3 = $PACKAGE_LIBS $LIBS (as set at that point in configure.ac)
-#     $4 = $PACKAGE_SUMMARY (or $1 Library)
-#     $5 = $CPPFLAGS $PACKAGE_CFLAGS (as set at the point in configure.ac)
-#     $6 = $LDFLAGS $PACKAGE_LDFLAGS (as set at the point in configure.ac)
-#
-#     PACKAGE_NAME defaults to $PACKAGE if not set.
-#     PACKAGE_LIBS defaults to -l$PACKAGE_NAME if not set.
-#
-#   The resulting file is called $PACKAGE.pc.in / $PACKAGE.pc
-#
-#   You will find this macro most useful in conjunction with
-#   ax_spec_defaults that can read good initializers from the .spec file. In
-#   consequencd, most of the generatable installable stuff can be made from
-#   information being updated in a single place for the whole project.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
-#   Copyright (c) 2008 Sven Verdoolaege <skimo@kotnet.org>
-#
-#   This program is free software; you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation; either version 2 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_CREATE_PKGCONFIG_INFO],[dnl
-AS_VAR_PUSHDEF([PKGCONFIG_suffix],[ax_create_pkgconfig_suffix])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_libdir],[ax_create_pkgconfig_libdir])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_libfile],[ax_create_pkgconfig_libfile])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_libname],[ax_create_pkgconfig_libname])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_version],[ax_create_pkgconfig_version])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_description],[ax_create_pkgconfig_description])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_requires],[ax_create_pkgconfig_requires])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_pkglibs],[ax_create_pkgconfig_pkglibs])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_libs],[ax_create_pkgconfig_libs])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_ldflags],[ax_create_pkgconfig_ldflags])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_cppflags],[ax_create_pkgconfig_cppflags])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_generate],[ax_create_pkgconfig_generate])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_src_libdir],[ax_create_pkgconfig_src_libdir])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_src_headers],[ax_create_pkgconfig_src_headers])dnl
-
-# we need the expanded forms...
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-AC_MSG_CHECKING(our pkgconfig libname)
-test ".$PKGCONFIG_libname" != "." || \
-PKGCONFIG_libname="ifelse($1,,${PACKAGE_NAME},`basename $1 .pc`)"
-test ".$PKGCONFIG_libname" != "." || \
-PKGCONFIG_libname="$PACKAGE"
-PKGCONFIG_libname=`eval echo "$PKGCONFIG_libname"`
-PKGCONFIG_libname=`eval echo "$PKGCONFIG_libname"`
-AC_MSG_RESULT($PKGCONFIG_libname)
-
-AC_MSG_CHECKING(our pkgconfig version)
-test ".$PKGCONFIG_version" != "." || \
-PKGCONFIG_version="${PACKAGE_VERSION}"
-test ".$PKGCONFIG_version" != "." || \
-PKGCONFIG_version="$VERSION"
-PKGCONFIG_version=`eval echo "$PKGCONFIG_version"`
-PKGCONFIG_version=`eval echo "$PKGCONFIG_version"`
-AC_MSG_RESULT($PKGCONFIG_version)
-
-AC_MSG_CHECKING(our pkgconfig_libdir)
-test ".$pkgconfig_libdir" = "." && \
-pkgconfig_libdir='${libdir}/pkgconfig'
-PKGCONFIG_libdir=`eval echo "$pkgconfig_libdir"`
-PKGCONFIG_libdir=`eval echo "$PKGCONFIG_libdir"`
-PKGCONFIG_libdir=`eval echo "$PKGCONFIG_libdir"`
-AC_MSG_RESULT($pkgconfig_libdir)
-test "$pkgconfig_libdir" != "$PKGCONFIG_libdir" && (
-AC_MSG_RESULT(expanded our pkgconfig_libdir... $PKGCONFIG_libdir))
-AC_SUBST([pkgconfig_libdir])
-
-AC_MSG_CHECKING(our pkgconfig_libfile)
-test ".$pkgconfig_libfile" != "." || \
-pkgconfig_libfile="ifelse($1,,$PKGCONFIG_libname.pc,`basename $1`)"
-PKGCONFIG_libfile=`eval echo "$pkgconfig_libfile"`
-PKGCONFIG_libfile=`eval echo "$PKGCONFIG_libfile"`
-AC_MSG_RESULT($pkgconfig_libfile)
-test "$pkgconfig_libfile" != "$PKGCONFIG_libfile" && (
-AC_MSG_RESULT(expanded our pkgconfig_libfile... $PKGCONFIG_libfile))
-AC_SUBST([pkgconfig_libfile])
-
-AC_MSG_CHECKING(our package / suffix)
-PKGCONFIG_suffix="$program_suffix"
-test ".$PKGCONFIG_suffix" != .NONE || PKGCONFIG_suffix=""
-AC_MSG_RESULT(${PACKAGE_NAME} / ${PKGCONFIG_suffix})
-
-AC_MSG_CHECKING(our pkgconfig description)
-PKGCONFIG_description="ifelse($4,,$PACKAGE_SUMMARY,$4)"
-test ".$PKGCONFIG_description" != "." || \
-PKGCONFIG_description="$PKGCONFIG_libname Library"
-PKGCONFIG_description=`eval echo "$PKGCONFIG_description"`
-PKGCONFIG_description=`eval echo "$PKGCONFIG_description"`
-AC_MSG_RESULT($PKGCONFIG_description)
-
-AC_MSG_CHECKING(our pkgconfig requires)
-PKGCONFIG_requires="ifelse($2,,$PACKAGE_REQUIRES,$2)"
-PKGCONFIG_requires=`eval echo "$PKGCONFIG_requires"`
-PKGCONFIG_requires=`eval echo "$PKGCONFIG_requires"`
-AC_MSG_RESULT($PKGCONFIG_requires)
-
-AC_MSG_CHECKING(our pkgconfig ext libs)
-PKGCONFIG_pkglibs="$PACKAGE_LIBS"
-test ".$PKGCONFIG_pkglibs" != "." || PKGCONFIG_pkglibs="-l$PKGCONFIG_libname"
-PKGCONFIG_libs="ifelse($3,,$PKGCONFIG_pkglibs $LIBS,$3)"
-PKGCONFIG_libs=`eval echo "$PKGCONFIG_libs"`
-PKGCONFIG_libs=`eval echo "$PKGCONFIG_libs"`
-AC_MSG_RESULT($PKGCONFIG_libs)
-
-AC_MSG_CHECKING(our pkgconfig cppflags)
-PKGCONFIG_cppflags="ifelse($5,,$CPPFLAGS $PACKAGE_CFLAGS,$5)"
-PKGCONFIG_cppflags=`eval echo "$PKGCONFIG_cppflags"`
-PKGCONFIG_cppflags=`eval echo "$PKGCONFIG_cppflags"`
-AC_MSG_RESULT($PKGCONFIG_cppflags)
-
-AC_MSG_CHECKING(our pkgconfig ldflags)
-PKGCONFIG_ldflags="ifelse($6,,$LDFLAGS $PACKAGE_LDFLAGS,$5)"
-PKGCONFIG_ldflags=`eval echo "$PKGCONFIG_ldflags"`
-PKGCONFIG_ldflags=`eval echo "$PKGCONFIG_ldflags"`
-AC_MSG_RESULT($PKGCONFIG_ldflags)
-
-test ".$PKGCONFIG_generate" != "." || \
-PKGCONFIG_generate="ifelse($1,,$PKGCONFIG_libname.pc,$1)"
-PKGCONFIG_generate=`eval echo "$PKGCONFIG_generate"`
-PKGCONFIG_generate=`eval echo "$PKGCONFIG_generate"`
-test "$pkgconfig_libfile" != "$PKGCONFIG_generate" && (
-AC_MSG_RESULT(generate the pkgconfig later... $PKGCONFIG_generate))
-
-if test ".$PKGCONFIG_src_libdir" = "." ; then
-PKGCONFIG_src_libdir=`pwd`
-PKGCONFIG_src_libdir=`AS_DIRNAME("$PKGCONFIG_src_libdir/$PKGCONFIG_generate")`
-test ! -d $PKGCONFIG_src_libdir/src || \
-PKGCONFIG_src_libdir="$PKGCONFIG_src_libdir/src"
-case ".$objdir" in
-*libs) PKGCONFIG_src_libdir="$PKGCONFIG_src_libdir/$objdir" ;; esac
-AC_MSG_RESULT(noninstalled pkgconfig -L $PKGCONFIG_src_libdir)
-fi
-
-if test ".$PKGCONFIG_src_headers" = "." ; then
-PKGCONFIG_src_headers=`pwd`
-v="$ac_top_srcdir" ;
-test ".$v" != "." || v="$ax_spec_dir"
-test ".$v" != "." || v="$srcdir"
-case "$v" in /*) PKGCONFIG_src_headers="" ;; esac
-PKGCONFIG_src_headers=`AS_DIRNAME("$PKGCONFIG_src_headers/$v/x")`
-test ! -d $PKGCONFIG_src_headers/incl[]ude || \
-PKGCONFIG_src_headers="$PKGCONFIG_src_headers/incl[]ude"
-AC_MSG_RESULT(noninstalled pkgconfig -I $PKGCONFIG_src_headers)
-fi
-
-
-dnl AC_CONFIG_COMMANDS crap disallows to use $PKGCONFIG_libfile here...
-AC_CONFIG_COMMANDS([$ax_create_pkgconfig_generate],[
-pkgconfig_generate="$ax_create_pkgconfig_generate"
-if test ! -f "$pkgconfig_generate.in"
-then generate="true"
-elif grep ' generated by configure ' $pkgconfig_generate.in >/dev/null
-then generate="true"
-else generate="false";
-fi
-if $generate ; then
-AC_MSG_NOTICE(creating $pkgconfig_generate.in)
-cat > $pkgconfig_generate.in <<AXEOF
-# generated by configure / remove this line to disable regeneration
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-bindir=@bindir@
-libdir=@libdir@
-datarootdir=@datarootdir@
-datadir=@datadir@
-sysconfdir=@sysconfdir@
-includedir=@includedir@
-package=@PACKAGE@
-suffix=@suffix@
-
-Name: @PACKAGE_NAME@
-Description: @PACKAGE_DESCRIPTION@
-Version: @PACKAGE_VERSION@
-Requires: @PACKAGE_REQUIRES@
-Libs: -L\${libdir} @LDFLAGS@ @LIBS@
-Cflags: -I\${includedir} @CPPFLAGS@
-AXEOF
-fi # DONE generate $pkgconfig_generate.in
-AC_MSG_NOTICE(creating $pkgconfig_generate)
-cat >conftest.sed <<AXEOF
-s|@prefix@|${pkgconfig_prefix}|
-s|@exec_prefix@|${pkgconfig_execprefix}|
-s|@bindir@|${pkgconfig_bindir}|
-s|@libdir@|${pkgconfig_libdir}|
-s|@datarootdir@|${pkgconfig_datarootdir}|
-s|@datadir@|${pkgconfig_datadir}|
-s|@sysconfdir@|${pkgconfig_sysconfdir}|
-s|@includedir@|${pkgconfig_includedir}|
-s|@suffix@|${pkgconfig_suffix}|
-s|@PACKAGE@|${pkgconfig_package}|
-s|@PACKAGE_NAME@|${pkgconfig_libname}|
-s|@PACKAGE_DESCRIPTION@|${pkgconfig_description}|
-s|@PACKAGE_VERSION@|${pkgconfig_version}|
-s|@PACKAGE_REQUIRES@|${pkgconfig_requires}|
-s|@LIBS@|${pkgconfig_libs}|
-s|@LDFLAGS@|${pkgconfig_ldflags}|
-s|@CPPFLAGS@|${pkgconfig_cppflags}|
-AXEOF
-sed -f conftest.sed  $pkgconfig_generate.in > $pkgconfig_generate
-if test ! -s $pkgconfig_generate ; then
-    AC_MSG_ERROR([$pkgconfig_generate is empty])
-fi ; rm conftest.sed # DONE generate $pkgconfig_generate
-pkgconfig_uninstalled=`echo $pkgconfig_generate |sed 's/.pc$/-uninstalled.pc/'`
-AC_MSG_NOTICE(creating $pkgconfig_uninstalled)
-cat >conftest.sed <<AXEOF
-s|@prefix@|${pkgconfig_prefix}|
-s|@exec_prefix@|${pkgconfig_execprefix}|
-s|@bindir@|${pkgconfig_bindir}|
-s|@libdir@|${pkgconfig_src_libdir}|
-s|@datarootdir@|${pkgconfig_datarootdir}|
-s|@datadir@|${pkgconfig_datadir}|
-s|@sysconfdir@|${pkgconfig_sysconfdir}|
-s|@includedir@|${pkgconfig_src_headers}|
-s|@suffix@|${pkgconfig_suffix}|
-s|@PACKAGE@|${pkgconfig_package}|
-s|@PACKAGE_NAME@|${pkgconfig_libname}|
-s|@PACKAGE_DESCRIPTION@|${pkgconfig_description}|
-s|@PACKAGE_VERSION@|${pkgconfig_version}|
-s|@PACKAGE_REQUIRES@|${pkgconfig_requires}|
-s|@LIBS@|${pkgconfig_libs}|
-s|@LDFLAGS@|${pkgconfig_ldflags}|
-s|@CPPFLAGS@|${pkgconfig_cppflags}|
-AXEOF
-sed -f conftest.sed $pkgconfig_generate.in > $pkgconfig_uninstalled
-if test ! -s $pkgconfig_uninstalled ; then
-    AC_MSG_ERROR([$pkgconfig_uninstalled is empty])
-fi ; rm conftest.sed # DONE generate $pkgconfig_uninstalled
-           pkgconfig_requires_add=`echo ${pkgconfig_requires}`
-if test ".$pkgconfig_requires_add" != "." ; then
-           pkgconfig_requires_add="pkg-config $pkgconfig_requires_add"
-    else   pkgconfig_requires_add=":" ; fi
-pkgconfig_uninstalled=`echo $pkgconfig_generate |sed 's/.pc$/-uninstalled.sh/'`
-AC_MSG_NOTICE(creating $pkgconfig_uninstalled)
-cat >conftest.sed <<AXEOF
-s|@prefix@|\"${pkgconfig_prefix}\"|
-s|@exec_prefix@|\"${pkgconfig_execprefix}\"|
-s|@bindir@|\"${pkgconfig_bindir}\"|
-s|@libdir@|\"${pkgconfig_src_libdir}\"|
-s|@datarootdir@|\"${pkgconfig_datarootdir}\"|
-s|@datadir@|\"${pkgconfig_datadir}\"|
-s|@sysconfdir@|\"${pkgconfig_sysconfdir}\"|
-s|@includedir@|\"${pkgconfig_src_headers}\"|
-s|@suffix@|\"${pkgconfig_suffix}\"|
-s|@PACKAGE@|\"${pkgconfig_package}\"|
-s|@PACKAGE_NAME@|\"${pkgconfig_libname}\"|
-s|@PACKAGE_DESCRIPTION@|\"${pkgconfig_description}\"|
-s|@PACKAGE_VERSION@|\"${pkgconfig_version}\"|
-s|@PACKAGE_REQUIRES@|\"${pkgconfig_requires}\"|
-s|@LIBS@|\"${pkgconfig_libs}\"|
-s|@LDFLAGS@|\"${pkgconfig_ldflags}\"|
-s|@CPPFLAGS@|\"${pkgconfig_cppflags}\"|
-s>Name:>for option\\; do case \"\$option\" in --list-all|--name) echo >
-s>Description: *>\\;\\; --help) pkg-config --help \\; echo Buildscript Of >
-s>Version: *>\\;\\; --modversion|--version) echo >
-s>Requires:>\\;\\; --requires) echo $pkgconfig_requires_add>
-s>Libs: *>\\;\\; --libs) echo >
-s>Cflags: *>\\;\\; --cflags) echo >
-/--libs)/a\\
-       $pkgconfig_requires_add
-/--cflags)/a\\
-       $pkgconfig_requires_add\\
-;; --variable=*) eval echo '\$'\`echo \$option | sed -e 's/.*=//'\`\\
-;; --uninstalled) exit 0 \\
-;; *) ;; esac done
-AXEOF
-sed -f conftest.sed  $pkgconfig_generate.in > $pkgconfig_uninstalled
-if test ! -s $pkgconfig_uninstalled ; then
-    AC_MSG_ERROR([$pkgconfig_uninstalled is empty])
-fi ; rm conftest.sed # DONE generate $pkgconfig_uninstalled
-],[
-dnl AC_CONFIG_COMMANDS crap, the AS_PUSHVAR defines are invalid here...
-ax_create_pkgconfig_generate="$ax_create_pkgconfig_generate"
-pkgconfig_prefix='$prefix'
-pkgconfig_execprefix='$exec_prefix'
-pkgconfig_bindir='$bindir'
-pkgconfig_libdir='$libdir'
-pkgconfig_includedir='$includedir'
-pkgconfig_datarootdir='$datarootdir'
-pkgconfig_datadir='$datadir'
-pkgconfig_sysconfdir='$sysconfdir'
-pkgconfig_suffix='$ax_create_pkgconfig_suffix'
-pkgconfig_package='$PACKAGE_NAME'
-pkgconfig_libname='$ax_create_pkgconfig_libname'
-pkgconfig_description='$ax_create_pkgconfig_description'
-pkgconfig_version='$ax_create_pkgconfig_version'
-pkgconfig_requires='$ax_create_pkgconfig_requires'
-pkgconfig_libs='$ax_create_pkgconfig_libs'
-pkgconfig_ldflags='$ax_create_pkgconfig_ldflags'
-pkgconfig_cppflags='$ax_create_pkgconfig_cppflags'
-pkgconfig_src_libdir='$ax_create_pkgconfig_src_libdir'
-pkgconfig_src_headers='$ax_create_pkgconfig_src_headers'
-])dnl
-AS_VAR_POPDEF([PKGCONFIG_suffix])dnl
-AS_VAR_POPDEF([PKGCONFIG_libdir])dnl
-AS_VAR_POPDEF([PKGCONFIG_libfile])dnl
-AS_VAR_POPDEF([PKGCONFIG_libname])dnl
-AS_VAR_POPDEF([PKGCONFIG_version])dnl
-AS_VAR_POPDEF([PKGCONFIG_description])dnl
-AS_VAR_POPDEF([PKGCONFIG_requires])dnl
-AS_VAR_POPDEF([PKGCONFIG_pkglibs])dnl
-AS_VAR_POPDEF([PKGCONFIG_libs])dnl
-AS_VAR_POPDEF([PKGCONFIG_ldflags])dnl
-AS_VAR_POPDEF([PKGCONFIG_cppflags])dnl
-AS_VAR_POPDEF([PKGCONFIG_generate])dnl
-AS_VAR_POPDEF([PKGCONFIG_src_libdir])dnl
-AS_VAR_POPDEF([PKGCONFIG_src_headers])dnl
-])
diff --git a/cloog-0.16.3/m4/ax_gcc_archflag.m4 b/cloog-0.16.3/m4/ax_gcc_archflag.m4
deleted file mode 100644
index dedeef4..0000000
--- a/cloog-0.16.3/m4/ax_gcc_archflag.m4
+++ /dev/null
@@ -1,213 +0,0 @@
-# ===========================================================================
-#         http://www.nongnu.org/autoconf-archive/ax_gcc_archflag.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_GCC_ARCHFLAG([PORTABLE?], [ACTION-SUCCESS], [ACTION-FAILURE])
-#
-# DESCRIPTION
-#
-#   This macro tries to guess the "native" arch corresponding to the target
-#   architecture for use with gcc's -march=arch or -mtune=arch flags. If
-#   found, the cache variable $ax_cv_gcc_archflag is set to this flag and
-#   ACTION-SUCCESS is executed; otherwise $ax_cv_gcc_archflag is is set to
-#   "unknown" and ACTION-FAILURE is executed. The default ACTION-SUCCESS is
-#   to add $ax_cv_gcc_archflag to the end of $CFLAGS.
-#
-#   PORTABLE? should be either [yes] (default) or [no]. In the former case,
-#   the flag is set to -mtune (or equivalent) so that the architecture is
-#   only used for tuning, but the instruction set used is still portable. In
-#   the latter case, the flag is set to -march (or equivalent) so that
-#   architecture-specific instructions are enabled.
-#
-#   The user can specify --with-gcc-arch=<arch> in order to override the
-#   macro's choice of architecture, or --without-gcc-arch to disable this.
-#
-#   When cross-compiling, or if $CC is not gcc, then ACTION-FAILURE is
-#   called unless the user specified --with-gcc-arch manually.
-#
-#   Requires macros: AX_CHECK_COMPILER_FLAGS, AX_GCC_X86_CPUID
-#
-#   (The main emphasis here is on recent CPUs, on the principle that doing
-#   high-performance computing on old hardware is uncommon.)
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
-#   Copyright (c) 2008 Matteo Frigo
-#
-#   This program is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation, either version 3 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_GCC_ARCHFLAG],
-[AC_REQUIRE([AC_PROG_CC])
-AC_REQUIRE([AC_CANONICAL_HOST])
-
-AC_ARG_WITH(gcc-arch, [AC_HELP_STRING([--with-gcc-arch=<arch>], [use architecture <arch> for gcc -march/-mtune, instead of guessing])],
-	ax_gcc_arch=$withval, ax_gcc_arch=yes)
-
-AC_MSG_CHECKING([for gcc architecture flag])
-AC_MSG_RESULT([])
-AC_CACHE_VAL(ax_cv_gcc_archflag,
-[
-ax_cv_gcc_archflag="unknown"
-
-if test "$GCC" = yes; then
-
-if test "x$ax_gcc_arch" = xyes; then
-ax_gcc_arch=""
-if test "$cross_compiling" = no; then
-case $host_cpu in
-  i[[3456]]86*|x86_64*) # use cpuid codes, in part from x86info-1.7 by D. Jones
-     AX_GCC_X86_CPUID(0)
-     AX_GCC_X86_CPUID(1)
-     case $ax_cv_gcc_x86_cpuid_0 in
-       *:756e6547:*:*) # Intel
-          case $ax_cv_gcc_x86_cpuid_1 in
-	    *5[[48]]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;;
-	    *5??:*:*:*) ax_gcc_arch=pentium ;;
-	    *6[[3456]]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
-	    *6a?:*[[01]]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
-	    *6a?:*[[234]]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
-	    *6[[9d]]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;;
-	    *6[[78b]]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
-	    *6??:*:*:*) ax_gcc_arch=pentiumpro ;;
-            *f3[[347]]:*:*:*|*f4[1347]:*:*:*)
-		case $host_cpu in
-                  x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;;
-                  *) ax_gcc_arch="prescott pentium4 pentiumpro" ;;
-                esac ;;
-            *f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";;
-          esac ;;
-       *:68747541:*:*) # AMD
-          case $ax_cv_gcc_x86_cpuid_1 in
-	    *5[[67]]?:*:*:*) ax_gcc_arch=k6 ;;
-	    *5[[8d]]?:*:*:*) ax_gcc_arch="k6-2 k6" ;;
-	    *5[[9]]?:*:*:*) ax_gcc_arch="k6-3 k6" ;;
-	    *60?:*:*:*) ax_gcc_arch=k7 ;;
-	    *6[[12]]?:*:*:*) ax_gcc_arch="athlon k7" ;;
-	    *6[[34]]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;;
-	    *67?:*:*:*) ax_gcc_arch="athlon-4 athlon k7" ;;
-	    *6[[68a]]?:*:*:*)
-	       AX_GCC_X86_CPUID(0x80000006) # L2 cache size
-	       case $ax_cv_gcc_x86_cpuid_0x80000006 in
-                 *:*:*[[1-9a-f]]??????:*) # (L2 = ecx >> 16) >= 256
-			ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;;
-                 *) ax_gcc_arch="athlon-4 athlon k7" ;;
-	       esac ;;
-	    *f[[4cef8b]]?:*:*:*) ax_gcc_arch="athlon64 k8" ;;
-	    *f5?:*:*:*) ax_gcc_arch="opteron k8" ;;
-	    *f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;;
-	    *f??:*:*:*) ax_gcc_arch="k8" ;;
-          esac ;;
-	*:746e6543:*:*) # IDT
-	   case $ax_cv_gcc_x86_cpuid_1 in
-	     *54?:*:*:*) ax_gcc_arch=winchip-c6 ;;
-	     *58?:*:*:*) ax_gcc_arch=winchip2 ;;
-	     *6[[78]]?:*:*:*) ax_gcc_arch=c3 ;;
-	     *69?:*:*:*) ax_gcc_arch="c3-2 c3" ;;
-	   esac ;;
-     esac
-     if test x"$ax_gcc_arch" = x; then # fallback
-	case $host_cpu in
-	  i586*) ax_gcc_arch=pentium ;;
-	  i686*) ax_gcc_arch=pentiumpro ;;
-        esac
-     fi
-     ;;
-
-  sparc*)
-     AC_PATH_PROG([PRTDIAG], [prtdiag], [prtdiag], [$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/])
-     cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null`
-     cputype=`echo "$cputype" | tr -d ' -' |tr $as_cr_LETTERS $as_cr_letters`
-     case $cputype in
-         *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;;
-         *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;;
-         *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;;
-         *supersparc*|*tms390z5[[05]]*) ax_gcc_arch="supersparc v8" ;;
-         *hypersparc*|*rt62[[056]]*) ax_gcc_arch="hypersparc v8" ;;
-         *cypress*) ax_gcc_arch=cypress ;;
-     esac ;;
-
-  alphaev5) ax_gcc_arch=ev5 ;;
-  alphaev56) ax_gcc_arch=ev56 ;;
-  alphapca56) ax_gcc_arch="pca56 ev56" ;;
-  alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;;
-  alphaev6) ax_gcc_arch=ev6 ;;
-  alphaev67) ax_gcc_arch=ev67 ;;
-  alphaev68) ax_gcc_arch="ev68 ev67" ;;
-  alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;;
-  alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;;
-  alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;;
-
-  powerpc*)
-     cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null`
-     cputype=`echo $cputype | sed -e 's/ppc//g;s/ *//g'`
-     case $cputype in
-       *750*) ax_gcc_arch="750 G3" ;;
-       *740[[0-9]]*) ax_gcc_arch="$cputype 7400 G4" ;;
-       *74[[4-5]][[0-9]]*) ax_gcc_arch="$cputype 7450 G4" ;;
-       *74[[0-9]][[0-9]]*) ax_gcc_arch="$cputype G4" ;;
-       *970*) ax_gcc_arch="970 G5 power4";;
-       *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";;
-       *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";;
-       603ev|8240) ax_gcc_arch="$cputype 603e 603";;
-       *) ax_gcc_arch=$cputype ;;
-     esac
-     ax_gcc_arch="$ax_gcc_arch powerpc"
-     ;;
-esac
-fi # not cross-compiling
-fi # guess arch
-
-if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then
-for arch in $ax_gcc_arch; do
-  if test "x[]m4_default([$1],yes)" = xyes; then # if we require portable code
-    flags="-mtune=$arch"
-    # -mcpu=$arch and m$arch generate nonportable code on every arch except
-    # x86.  And some other arches (e.g. Alpha) don't accept -mtune.  Grrr.
-    case $host_cpu in i*86|x86_64*) flags="$flags -mcpu=$arch -m$arch";; esac
-  else
-    flags="-march=$arch -mcpu=$arch -m$arch"
-  fi
-  for flag in $flags; do
-    AX_CHECK_COMPILER_FLAGS($flag, [ax_cv_gcc_archflag=$flag; break])
-  done
-  test "x$ax_cv_gcc_archflag" = xunknown || break
-done
-fi
-
-fi # $GCC=yes
-])
-AC_MSG_CHECKING([for gcc architecture flag])
-AC_MSG_RESULT($ax_cv_gcc_archflag)
-if test "x$ax_cv_gcc_archflag" = xunknown; then
-  m4_default([$3],:)
-else
-  m4_default([$2], [CFLAGS="$CFLAGS $ax_cv_gcc_archflag"])
-fi
-])
diff --git a/cloog-0.16.3/m4/ax_gcc_x86_cpuid.m4 b/cloog-0.16.3/m4/ax_gcc_x86_cpuid.m4
deleted file mode 100644
index 5420b09..0000000
--- a/cloog-0.16.3/m4/ax_gcc_x86_cpuid.m4
+++ /dev/null
@@ -1,77 +0,0 @@
-# ===========================================================================
-#        http://www.nongnu.org/autoconf-archive/ax_gcc_x86_cpuid.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_GCC_X86_CPUID(OP)
-#
-# DESCRIPTION
-#
-#   On Pentium and later x86 processors, with gcc or a compiler that has a
-#   compatible syntax for inline assembly instructions, run a small program
-#   that executes the cpuid instruction with input OP. This can be used to
-#   detect the CPU type.
-#
-#   On output, the values of the eax, ebx, ecx, and edx registers are stored
-#   as hexadecimal strings as "eax:ebx:ecx:edx" in the cache variable
-#   ax_cv_gcc_x86_cpuid_OP.
-#
-#   If the cpuid instruction fails (because you are running a
-#   cross-compiler, or because you are not using gcc, or because you are on
-#   a processor that doesn't have this instruction), ax_cv_gcc_x86_cpuid_OP
-#   is set to the string "unknown".
-#
-#   This macro mainly exists to be used in AX_GCC_ARCHFLAG.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
-#   Copyright (c) 2008 Matteo Frigo
-#
-#   This program is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation, either version 3 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_GCC_X86_CPUID],
-[AC_REQUIRE([AC_PROG_CC])
-AC_LANG_PUSH([C])
-AC_CACHE_CHECK(for x86 cpuid $1 output, ax_cv_gcc_x86_cpuid_$1,
- [AC_RUN_IFELSE([AC_LANG_PROGRAM([#include <stdio.h>], [
-     int op = $1, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-])],
-     [ax_cv_gcc_x86_cpuid_$1=`cat conftest_cpuid`; rm -f conftest_cpuid],
-     [ax_cv_gcc_x86_cpuid_$1=unknown; rm -f conftest_cpuid],
-     [ax_cv_gcc_x86_cpuid_$1=unknown])])
-AC_LANG_POP([C])
-])
diff --git a/cloog-0.16.3/m4/ax_submodule.m4 b/cloog-0.16.3/m4/ax_submodule.m4
deleted file mode 100644
index 57e3a56..0000000
--- a/cloog-0.16.3/m4/ax_submodule.m4
+++ /dev/null
@@ -1,63 +0,0 @@
-AC_DEFUN([AX_SUBMODULE],
-[
-
-AC_ARG_WITH($1,
-	[AS_HELP_STRING([--with-$1=$2],
-			[Which $1 to use])])
-case "system" in
-$2)
-	AC_ARG_WITH($1_prefix,
-		    [AS_HELP_STRING([--with-$1-prefix=DIR],
-				    [Prefix of $1 installation])])
-	AC_ARG_WITH($1_exec_prefix,
-		    [AS_HELP_STRING([--with-$1-exec-prefix=DIR],
-				    [Exec prefix of $1 installation])])
-esac
-case "build" in
-$2)
-	AC_ARG_WITH($1_builddir,
-		    [AS_HELP_STRING([--with-$1-builddir=DIR],
-				    [Location of $1 builddir])])
-esac
-if test "x$with_$1_prefix" != "x" -a "x$with_$1_exec_prefix" = "x"; then
-	with_$1_exec_prefix=$with_$1_prefix
-fi
-if test "x$with_$1_prefix" != "x" -o "x$with_$1_exec_prefix" != "x"; then
-	if test "x$with_$1" != "x" -a "x$with_$1" != "xsystem"; then
-		AC_MSG_ERROR([Setting $with_$1_prefix implies use of system $1])
-	fi
-	with_$1="system"
-fi
-if test "x$with_$1_builddir" != "x"; then
-	if test "x$with_$1" != "x" -a "x$with_$1" != "xbuild"; then
-		AC_MSG_ERROR([Setting $with_$1_builddir implies use of build $1])
-	fi
-	with_$1="build"
-	$1_srcdir=`echo @abs_srcdir@ | $with_$1_builddir/config.status --file=-`
-	AC_MSG_NOTICE($1 sources in $$1_srcdir)
-fi
-case "$with_$1" in
-$2)
-	;;
-*)
-	if test -d $srcdir/.git -a \
-		-d $srcdir/$1 -a \
-		! -d $srcdir/$1/.git; then
-		AC_MSG_WARN(
-[git repo detected, but submodule $1 not initialized])
-		AC_MSG_WARN([You may want to run])
-		AC_MSG_WARN([	git submodule init])
-		AC_MSG_WARN([	git submodule update])
-		AC_MSG_WARN([	sh autogen.sh])
-	fi
-	if test -f $srcdir/$1/configure -a "$3" != "no"; then
-		with_$1="bundled"
-	else
-		with_$1="$3"
-	fi
-	;;
-esac
-AC_MSG_CHECKING([which $1 to use])
-AC_MSG_RESULT($with_$1)
-
-])
diff --git a/cloog-0.16.3/m4/libtool.m4 b/cloog-0.16.3/m4/libtool.m4
deleted file mode 100644
index 22924a8..0000000
--- a/cloog-0.16.3/m4/libtool.m4
+++ /dev/null
@@ -1,7437 +0,0 @@
-# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
-#
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010 Free Software Foundation,
-#                 Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-m4_define([_LT_COPYING], [dnl
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010 Free Software Foundation,
-#                 Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-])
-
-# serial 57 LT_INIT
-
-
-# LT_PREREQ(VERSION)
-# ------------------
-# Complain and exit if this libtool version is less that VERSION.
-m4_defun([LT_PREREQ],
-[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
-       [m4_default([$3],
-		   [m4_fatal([Libtool version $1 or higher is required],
-		             63)])],
-       [$2])])
-
-
-# _LT_CHECK_BUILDDIR
-# ------------------
-# Complain if the absolute build directory name contains unusual characters
-m4_defun([_LT_CHECK_BUILDDIR],
-[case `pwd` in
-  *\ * | *\	*)
-    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
-esac
-])
-
-
-# LT_INIT([OPTIONS])
-# ------------------
-AC_DEFUN([LT_INIT],
-[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
-AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
-AC_BEFORE([$0], [LT_LANG])dnl
-AC_BEFORE([$0], [LT_OUTPUT])dnl
-AC_BEFORE([$0], [LTDL_INIT])dnl
-m4_require([_LT_CHECK_BUILDDIR])dnl
-
-dnl Autoconf doesn't catch unexpanded LT_ macros by default:
-m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
-m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
-dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
-dnl unless we require an AC_DEFUNed macro:
-AC_REQUIRE([LTOPTIONS_VERSION])dnl
-AC_REQUIRE([LTSUGAR_VERSION])dnl
-AC_REQUIRE([LTVERSION_VERSION])dnl
-AC_REQUIRE([LTOBSOLETE_VERSION])dnl
-m4_require([_LT_PROG_LTMAIN])dnl
-
-_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
-
-dnl Parse OPTIONS
-_LT_SET_OPTIONS([$0], [$1])
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-AC_SUBST(LIBTOOL)dnl
-
-_LT_SETUP
-
-# Only expand once:
-m4_define([LT_INIT])
-])# LT_INIT
-
-# Old names:
-AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
-AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
-dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
-
-
-# _LT_CC_BASENAME(CC)
-# -------------------
-# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
-m4_defun([_LT_CC_BASENAME],
-[for cc_temp in $1""; do
-  case $cc_temp in
-    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
-    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-])
-
-
-# _LT_FILEUTILS_DEFAULTS
-# ----------------------
-# It is okay to use these file commands and assume they have been set
-# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
-m4_defun([_LT_FILEUTILS_DEFAULTS],
-[: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-])# _LT_FILEUTILS_DEFAULTS
-
-
-# _LT_SETUP
-# ---------
-m4_defun([_LT_SETUP],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
-AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
-
-_LT_DECL([], [host_alias], [0], [The host system])dnl
-_LT_DECL([], [host], [0])dnl
-_LT_DECL([], [host_os], [0])dnl
-dnl
-_LT_DECL([], [build_alias], [0], [The build system])dnl
-_LT_DECL([], [build], [0])dnl
-_LT_DECL([], [build_os], [0])dnl
-dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([LT_PATH_LD])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-dnl
-AC_REQUIRE([AC_PROG_LN_S])dnl
-test -z "$LN_S" && LN_S="ln -s"
-_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
-dnl
-AC_REQUIRE([LT_CMD_MAX_LEN])dnl
-_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
-_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
-dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_CHECK_SHELL_FEATURES])dnl
-m4_require([_LT_CMD_RELOAD])dnl
-m4_require([_LT_CHECK_MAGIC_METHOD])dnl
-m4_require([_LT_CMD_OLD_ARCHIVE])dnl
-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-
-_LT_CONFIG_LIBTOOL_INIT([
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-])
-if test -n "${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-_LT_CHECK_OBJDIR
-
-m4_require([_LT_TAG_COMPILER])dnl
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-_LT_CC_BASENAME([$compiler])
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    _LT_PATH_MAGIC
-  fi
-  ;;
-esac
-
-# Use C for the default configuration in the libtool script
-LT_SUPPORTED_TAG([CC])
-_LT_LANG_C_CONFIG
-_LT_LANG_DEFAULT_CONFIG
-_LT_CONFIG_COMMANDS
-])# _LT_SETUP
-
-
-# _LT_PREPARE_SED_QUOTE_VARS
-# --------------------------
-# Define a few sed substitution that help us do robust quoting.
-m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
-[# Backslashify metacharacters that are still active within
-# double-quoted strings.
-sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\([["`\\]]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-])
-
-# _LT_PROG_LTMAIN
-# ---------------
-# Note that this code is called both from `configure', and `config.status'
-# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
-# `config.status' has no value for ac_aux_dir unless we are using Automake,
-# so we pass a copy along to make sure it has a sensible value anyway.
-m4_defun([_LT_PROG_LTMAIN],
-[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
-_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
-ltmain="$ac_aux_dir/ltmain.sh"
-])# _LT_PROG_LTMAIN
-
-
-## ------------------------------------- ##
-## Accumulate code for creating libtool. ##
-## ------------------------------------- ##
-
-# So that we can recreate a full libtool script including additional
-# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
-# in macros and then make a single call at the end using the `libtool'
-# label.
-
-
-# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
-# ----------------------------------------
-# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-m4_define([_LT_CONFIG_LIBTOOL_INIT],
-[m4_ifval([$1],
-          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
-                     [$1
-])])])
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_INIT])
-
-
-# _LT_CONFIG_LIBTOOL([COMMANDS])
-# ------------------------------
-# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-m4_define([_LT_CONFIG_LIBTOOL],
-[m4_ifval([$1],
-          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
-                     [$1
-])])])
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
-
-
-# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
-# -----------------------------------------------------
-m4_defun([_LT_CONFIG_SAVE_COMMANDS],
-[_LT_CONFIG_LIBTOOL([$1])
-_LT_CONFIG_LIBTOOL_INIT([$2])
-])
-
-
-# _LT_FORMAT_COMMENT([COMMENT])
-# -----------------------------
-# Add leading comment marks to the start of each line, and a trailing
-# full-stop to the whole comment if one is not present already.
-m4_define([_LT_FORMAT_COMMENT],
-[m4_ifval([$1], [
-m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
-              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
-)])
-
-
-
-## ------------------------ ##
-## FIXME: Eliminate VARNAME ##
-## ------------------------ ##
-
-
-# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
-# -------------------------------------------------------------------
-# CONFIGNAME is the name given to the value in the libtool script.
-# VARNAME is the (base) name used in the configure script.
-# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
-# VARNAME.  Any other value will be used directly.
-m4_define([_LT_DECL],
-[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
-    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
-	[m4_ifval([$1], [$1], [$2])])
-    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
-    m4_ifval([$4],
-	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
-    lt_dict_add_subkey([lt_decl_dict], [$2],
-	[tagged?], [m4_ifval([$5], [yes], [no])])])
-])
-
-
-# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
-# --------------------------------------------------------
-m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
-
-
-# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
-# ------------------------------------------------
-m4_define([lt_decl_tag_varnames],
-[_lt_decl_filter([tagged?], [yes], $@)])
-
-
-# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
-# ---------------------------------------------------------
-m4_define([_lt_decl_filter],
-[m4_case([$#],
-  [0], [m4_fatal([$0: too few arguments: $#])],
-  [1], [m4_fatal([$0: too few arguments: $#: $1])],
-  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
-  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
-  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
-])
-
-
-# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
-# --------------------------------------------------
-m4_define([lt_decl_quote_varnames],
-[_lt_decl_filter([value], [1], $@)])
-
-
-# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
-# ---------------------------------------------------
-m4_define([lt_decl_dquote_varnames],
-[_lt_decl_filter([value], [2], $@)])
-
-
-# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
-# ---------------------------------------------------
-m4_define([lt_decl_varnames_tagged],
-[m4_assert([$# <= 2])dnl
-_$0(m4_quote(m4_default([$1], [[, ]])),
-    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
-    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
-m4_define([_lt_decl_varnames_tagged],
-[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
-
-
-# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
-# ------------------------------------------------
-m4_define([lt_decl_all_varnames],
-[_$0(m4_quote(m4_default([$1], [[, ]])),
-     m4_if([$2], [],
-	   m4_quote(lt_decl_varnames),
-	m4_quote(m4_shift($@))))[]dnl
-])
-m4_define([_lt_decl_all_varnames],
-[lt_join($@, lt_decl_varnames_tagged([$1],
-			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
-])
-
-
-# _LT_CONFIG_STATUS_DECLARE([VARNAME])
-# ------------------------------------
-# Quote a variable value, and forward it to `config.status' so that its
-# declaration there will have the same value as in `configure'.  VARNAME
-# must have a single quote delimited value for this to work.
-m4_define([_LT_CONFIG_STATUS_DECLARE],
-[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
-
-
-# _LT_CONFIG_STATUS_DECLARATIONS
-# ------------------------------
-# We delimit libtool config variables with single quotes, so when
-# we write them to config.status, we have to be sure to quote all
-# embedded single quotes properly.  In configure, this macro expands
-# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
-#
-#    <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
-m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
-[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
-    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
-
-
-# _LT_LIBTOOL_TAGS
-# ----------------
-# Output comment and list of tags supported by the script
-m4_defun([_LT_LIBTOOL_TAGS],
-[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
-available_tags="_LT_TAGS"dnl
-])
-
-
-# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
-# -----------------------------------
-# Extract the dictionary values for VARNAME (optionally with TAG) and
-# expand to a commented shell variable setting:
-#
-#    # Some comment about what VAR is for.
-#    visible_name=$lt_internal_name
-m4_define([_LT_LIBTOOL_DECLARE],
-[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
-					   [description])))[]dnl
-m4_pushdef([_libtool_name],
-    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
-m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
-    [0], [_libtool_name=[$]$1],
-    [1], [_libtool_name=$lt_[]$1],
-    [2], [_libtool_name=$lt_[]$1],
-    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
-m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
-])
-
-
-# _LT_LIBTOOL_CONFIG_VARS
-# -----------------------
-# Produce commented declarations of non-tagged libtool config variables
-# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
-# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
-# section) are produced by _LT_LIBTOOL_TAG_VARS.
-m4_defun([_LT_LIBTOOL_CONFIG_VARS],
-[m4_foreach([_lt_var],
-    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
-    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
-
-
-# _LT_LIBTOOL_TAG_VARS(TAG)
-# -------------------------
-m4_define([_LT_LIBTOOL_TAG_VARS],
-[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
-    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
-
-
-# _LT_TAGVAR(VARNAME, [TAGNAME])
-# ------------------------------
-m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
-
-
-# _LT_CONFIG_COMMANDS
-# -------------------
-# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
-# variables for single and double quote escaping we saved from calls
-# to _LT_DECL, we can put quote escaped variables declarations
-# into `config.status', and then the shell code to quote escape them in
-# for loops in `config.status'.  Finally, any additional code accumulated
-# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
-m4_defun([_LT_CONFIG_COMMANDS],
-[AC_PROVIDE_IFELSE([LT_OUTPUT],
-	dnl If the libtool generation code has been placed in $CONFIG_LT,
-	dnl instead of duplicating it all over again into config.status,
-	dnl then we will have config.status run $CONFIG_LT later, so it
-	dnl needs to know what name is stored there:
-        [AC_CONFIG_COMMANDS([libtool],
-            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
-    dnl If the libtool generation code is destined for config.status,
-    dnl expand the accumulated commands and init code now:
-    [AC_CONFIG_COMMANDS([libtool],
-        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
-])#_LT_CONFIG_COMMANDS
-
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
-[
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-_LT_CONFIG_STATUS_DECLARATIONS
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-\$[]1
-_LTECHO_EOF'
-}
-
-# Quote evaled strings.
-for var in lt_decl_all_varnames([[ \
-]], lt_decl_quote_varnames); do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Double-quote double-evaled strings.
-for var in lt_decl_all_varnames([[ \
-]], lt_decl_dquote_varnames); do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-_LT_OUTPUT_LIBTOOL_INIT
-])
-
-# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
-# ------------------------------------
-# Generate a child script FILE with all initialization necessary to
-# reuse the environment learned by the parent script, and make the
-# file executable.  If COMMENT is supplied, it is inserted after the
-# `#!' sequence but before initialization text begins.  After this
-# macro, additional text can be appended to FILE to form the body of
-# the child script.  The macro ends with non-zero status if the
-# file could not be fully written (such as if the disk is full).
-m4_ifdef([AS_INIT_GENERATED],
-[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
-[m4_defun([_LT_GENERATED_FILE_INIT],
-[m4_require([AS_PREPARE])]dnl
-[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
-[lt_write_fail=0
-cat >$1 <<_ASEOF || lt_write_fail=1
-#! $SHELL
-# Generated by $as_me.
-$2
-SHELL=\${CONFIG_SHELL-$SHELL}
-export SHELL
-_ASEOF
-cat >>$1 <<\_ASEOF || lt_write_fail=1
-AS_SHELL_SANITIZE
-_AS_PREPARE
-exec AS_MESSAGE_FD>&1
-_ASEOF
-test $lt_write_fail = 0 && chmod +x $1[]dnl
-m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
-
-# LT_OUTPUT
-# ---------
-# This macro allows early generation of the libtool script (before
-# AC_OUTPUT is called), incase it is used in configure for compilation
-# tests.
-AC_DEFUN([LT_OUTPUT],
-[: ${CONFIG_LT=./config.lt}
-AC_MSG_NOTICE([creating $CONFIG_LT])
-_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
-[# Run this file to recreate a libtool stub with the current configuration.])
-
-cat >>"$CONFIG_LT" <<\_LTEOF
-lt_cl_silent=false
-exec AS_MESSAGE_LOG_FD>>config.log
-{
-  echo
-  AS_BOX([Running $as_me.])
-} >&AS_MESSAGE_LOG_FD
-
-lt_cl_help="\
-\`$as_me' creates a local libtool stub from the current configuration,
-for use in further configure time tests before the real libtool is
-generated.
-
-Usage: $[0] [[OPTIONS]]
-
-  -h, --help      print this help, then exit
-  -V, --version   print version number, then exit
-  -q, --quiet     do not print progress messages
-  -d, --debug     don't remove temporary files
-
-Report bugs to <bug-libtool@gnu.org>."
-
-lt_cl_version="\
-m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
-m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
-configured by $[0], generated by m4_PACKAGE_STRING.
-
-Copyright (C) 2010 Free Software Foundation, Inc.
-This config.lt script is free software; the Free Software Foundation
-gives unlimited permision to copy, distribute and modify it."
-
-while test $[#] != 0
-do
-  case $[1] in
-    --version | --v* | -V )
-      echo "$lt_cl_version"; exit 0 ;;
-    --help | --h* | -h )
-      echo "$lt_cl_help"; exit 0 ;;
-    --debug | --d* | -d )
-      debug=: ;;
-    --quiet | --q* | --silent | --s* | -q )
-      lt_cl_silent=: ;;
-
-    -*) AC_MSG_ERROR([unrecognized option: $[1]
-Try \`$[0] --help' for more information.]) ;;
-
-    *) AC_MSG_ERROR([unrecognized argument: $[1]
-Try \`$[0] --help' for more information.]) ;;
-  esac
-  shift
-done
-
-if $lt_cl_silent; then
-  exec AS_MESSAGE_FD>/dev/null
-fi
-_LTEOF
-
-cat >>"$CONFIG_LT" <<_LTEOF
-_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
-_LTEOF
-
-cat >>"$CONFIG_LT" <<\_LTEOF
-AC_MSG_NOTICE([creating $ofile])
-_LT_OUTPUT_LIBTOOL_COMMANDS
-AS_EXIT(0)
-_LTEOF
-chmod +x "$CONFIG_LT"
-
-# configure is writing to config.log, but config.lt does its own redirection,
-# appending to config.log, which fails on DOS, as config.log is still kept
-# open by configure.  Here we exec the FD to /dev/null, effectively closing
-# config.log, so it can be properly (re)opened and appended to by config.lt.
-lt_cl_success=:
-test "$silent" = yes &&
-  lt_config_lt_args="$lt_config_lt_args --quiet"
-exec AS_MESSAGE_LOG_FD>/dev/null
-$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
-exec AS_MESSAGE_LOG_FD>>config.log
-$lt_cl_success || AS_EXIT(1)
-])# LT_OUTPUT
-
-
-# _LT_CONFIG(TAG)
-# ---------------
-# If TAG is the built-in tag, create an initial libtool script with a
-# default configuration from the untagged config vars.  Otherwise add code
-# to config.status for appending the configuration named by TAG from the
-# matching tagged config vars.
-m4_defun([_LT_CONFIG],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-_LT_CONFIG_SAVE_COMMANDS([
-  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
-  m4_if(_LT_TAG, [C], [
-    # See if we are running on zsh, and set the options which allow our
-    # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
-      setopt NO_GLOB_SUBST
-    fi
-
-    cfgfile="${ofile}T"
-    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
-    $RM "$cfgfile"
-
-    cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $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.
-#
-_LT_COPYING
-_LT_LIBTOOL_TAGS
-
-# ### BEGIN LIBTOOL CONFIG
-_LT_LIBTOOL_CONFIG_VARS
-_LT_LIBTOOL_TAG_VARS
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
-  case $host_os in
-  aix3*)
-    cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-_LT_EOF
-    ;;
-  esac
-
-  _LT_PROG_LTMAIN
-
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  _LT_PROG_XSI_SHELLFNS
-
-  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  mv -f "$cfgfile" "$ofile" ||
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
-],
-[cat <<_LT_EOF >> "$ofile"
-
-dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
-dnl in a comment (ie after a #).
-# ### BEGIN LIBTOOL TAG CONFIG: $1
-_LT_LIBTOOL_TAG_VARS(_LT_TAG)
-# ### END LIBTOOL TAG CONFIG: $1
-_LT_EOF
-])dnl /m4_if
-],
-[m4_if([$1], [], [
-    PACKAGE='$PACKAGE'
-    VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
-    RM='$RM'
-    ofile='$ofile'], [])
-])dnl /_LT_CONFIG_SAVE_COMMANDS
-])# _LT_CONFIG
-
-
-# LT_SUPPORTED_TAG(TAG)
-# ---------------------
-# Trace this macro to discover what tags are supported by the libtool
-# --tag option, using:
-#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
-AC_DEFUN([LT_SUPPORTED_TAG], [])
-
-
-# C support is built-in for now
-m4_define([_LT_LANG_C_enabled], [])
-m4_define([_LT_TAGS], [])
-
-
-# LT_LANG(LANG)
-# -------------
-# Enable libtool support for the given language if not already enabled.
-AC_DEFUN([LT_LANG],
-[AC_BEFORE([$0], [LT_OUTPUT])dnl
-m4_case([$1],
-  [C],			[_LT_LANG(C)],
-  [C++],		[_LT_LANG(CXX)],
-  [Java],		[_LT_LANG(GCJ)],
-  [Fortran 77],		[_LT_LANG(F77)],
-  [Fortran],		[_LT_LANG(FC)],
-  [Windows Resource],	[_LT_LANG(RC)],
-  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
-    [_LT_LANG($1)],
-    [m4_fatal([$0: unsupported language: "$1"])])])dnl
-])# LT_LANG
-
-
-# _LT_LANG(LANGNAME)
-# ------------------
-m4_defun([_LT_LANG],
-[m4_ifdef([_LT_LANG_]$1[_enabled], [],
-  [LT_SUPPORTED_TAG([$1])dnl
-  m4_append([_LT_TAGS], [$1 ])dnl
-  m4_define([_LT_LANG_]$1[_enabled], [])dnl
-  _LT_LANG_$1_CONFIG($1)])dnl
-])# _LT_LANG
-
-
-# _LT_LANG_DEFAULT_CONFIG
-# -----------------------
-m4_defun([_LT_LANG_DEFAULT_CONFIG],
-[AC_PROVIDE_IFELSE([AC_PROG_CXX],
-  [LT_LANG(CXX)],
-  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
-
-AC_PROVIDE_IFELSE([AC_PROG_F77],
-  [LT_LANG(F77)],
-  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
-
-AC_PROVIDE_IFELSE([AC_PROG_FC],
-  [LT_LANG(FC)],
-  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
-
-dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
-dnl pulling things in needlessly.
-AC_PROVIDE_IFELSE([AC_PROG_GCJ],
-  [LT_LANG(GCJ)],
-  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
-    [LT_LANG(GCJ)],
-    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
-      [LT_LANG(GCJ)],
-      [m4_ifdef([AC_PROG_GCJ],
-	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
-       m4_ifdef([A][M_PROG_GCJ],
-	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
-       m4_ifdef([LT_PROG_GCJ],
-	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
-
-AC_PROVIDE_IFELSE([LT_PROG_RC],
-  [LT_LANG(RC)],
-  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
-])# _LT_LANG_DEFAULT_CONFIG
-
-# Obsolete macros:
-AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
-AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
-AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
-AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
-AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
-dnl AC_DEFUN([AC_LIBTOOL_F77], [])
-dnl AC_DEFUN([AC_LIBTOOL_FC], [])
-dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
-dnl AC_DEFUN([AC_LIBTOOL_RC], [])
-
-
-# _LT_TAG_COMPILER
-# ----------------
-m4_defun([_LT_TAG_COMPILER],
-[AC_REQUIRE([AC_PROG_CC])dnl
-
-_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
-_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
-_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
-_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-])# _LT_TAG_COMPILER
-
-
-# _LT_COMPILER_BOILERPLATE
-# ------------------------
-# Check for compiler boilerplate output or warnings with
-# the simple compiler test code.
-m4_defun([_LT_COMPILER_BOILERPLATE],
-[m4_require([_LT_DECL_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-])# _LT_COMPILER_BOILERPLATE
-
-
-# _LT_LINKER_BOILERPLATE
-# ----------------------
-# Check for linker boilerplate output or warnings with
-# the simple link test code.
-m4_defun([_LT_LINKER_BOILERPLATE],
-[m4_require([_LT_DECL_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-])# _LT_LINKER_BOILERPLATE
-
-# _LT_REQUIRED_DARWIN_CHECKS
-# -------------------------
-m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
-  case $host_os in
-    rhapsody* | darwin*)
-    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
-    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
-    AC_CHECK_TOOL([LIPO], [lipo], [:])
-    AC_CHECK_TOOL([OTOOL], [otool], [:])
-    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
-    _LT_DECL([], [DSYMUTIL], [1],
-      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
-    _LT_DECL([], [NMEDIT], [1],
-      [Tool to change global to local symbols on Mac OS X])
-    _LT_DECL([], [LIPO], [1],
-      [Tool to manipulate fat objects and archives on Mac OS X])
-    _LT_DECL([], [OTOOL], [1],
-      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
-    _LT_DECL([], [OTOOL64], [1],
-      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
-
-    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
-      [lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
-	# By default we will add the -single_module flag. You can override
-	# by either setting the environment variable LT_MULTI_MODULE
-	# non-empty at configure time, or by adding -multi_module to the
-	# link flags.
-	rm -rf libconftest.dylib*
-	echo "int foo(void){return 1;}" > conftest.c
-	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
-	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
-        _lt_result=$?
-	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
-	  lt_cv_apple_cc_single_mod=yes
-	else
-	  cat conftest.err >&AS_MESSAGE_LOG_FD
-	fi
-	rm -rf libconftest.dylib*
-	rm -f conftest.*
-      fi])
-    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
-      [lt_cv_ld_exported_symbols_list],
-      [lt_cv_ld_exported_symbols_list=no
-      save_LDFLAGS=$LDFLAGS
-      echo "_main" > conftest.sym
-      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
-	[lt_cv_ld_exported_symbols_list=yes],
-	[lt_cv_ld_exported_symbols_list=no])
-	LDFLAGS="$save_LDFLAGS"
-    ])
-    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
-      [lt_cv_ld_force_load=no
-      cat > conftest.c << _LT_EOF
-int forced_loaded() { return 2;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
-      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
-      echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
-      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
-      echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
-      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
-      cat > conftest.c << _LT_EOF
-int main() { return 0;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
-      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
-      _lt_result=$?
-      if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then
-	lt_cv_ld_force_load=yes
-      else
-	cat conftest.err >&AS_MESSAGE_LOG_FD
-      fi
-        rm -f conftest.err libconftest.a conftest conftest.c
-        rm -rf conftest.dSYM
-    ])
-    case $host_os in
-    rhapsody* | darwin1.[[012]])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-    darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-    darwin*) # darwin 5.x on
-      # if running on 10.5 or later, the deployment target defaults
-      # to the OS version, if on x86, and 10.4, the deployment
-      # target defaults to 10.4. Don't you love it?
-      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[[012]]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-      esac
-    ;;
-  esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-      _lt_dar_single_mod='$single_module'
-    fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-    else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
-      _lt_dsymutil='~$DSYMUTIL $lib || :'
-    else
-      _lt_dsymutil=
-    fi
-    ;;
-  esac
-])
-
-
-# _LT_DARWIN_LINKER_FEATURES
-# --------------------------
-# Checks for linker and compiler features on darwin
-m4_defun([_LT_DARWIN_LINKER_FEATURES],
-[
-  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
-  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-  _LT_TAGVAR(hardcode_direct, $1)=no
-  _LT_TAGVAR(hardcode_automatic, $1)=yes
-  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-  else
-    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
-  fi
-  _LT_TAGVAR(link_all_deplibs, $1)=yes
-  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=func_echo_all
-    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-    m4_if([$1], [CXX],
-[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
-    fi
-],[])
-  else
-  _LT_TAGVAR(ld_shlibs, $1)=no
-  fi
-])
-
-# _LT_SYS_MODULE_PATH_AIX
-# -----------------------
-# Links a minimal program and checks the executable
-# for the system default hardcoded library path. In most cases,
-# this is /usr/lib:/lib, but when the MPI compilers are used
-# the location of the communication and MPI libs are included too.
-# If we don't find anything, use the default library path according
-# to the aix ld manual.
-m4_defun([_LT_SYS_MODULE_PATH_AIX],
-[m4_require([_LT_DECL_SED])dnl
-AC_LINK_IFELSE(AC_LANG_PROGRAM,[
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi],[])
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-])# _LT_SYS_MODULE_PATH_AIX
-
-
-# _LT_SHELL_INIT(ARG)
-# -------------------
-m4_define([_LT_SHELL_INIT],
-[m4_divert_text([M4SH-INIT], [$1
-])])# _LT_SHELL_INIT
-
-
-
-# _LT_PROG_ECHO_BACKSLASH
-# -----------------------
-# Find how we can fake an echo command that does not interpret backslash.
-# In particular, with Autoconf 2.60 or later we add some code to the start
-# of the generated configure script which will find a shell with a builtin
-# printf (which we can use as an echo command).
-m4_defun([_LT_PROG_ECHO_BACKSLASH],
-[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-
-AC_MSG_CHECKING([how to print strings])
-# Test print first, because it will be a builtin if present.
-if test "X`print -r -- -n 2>/dev/null`" = X-n && \
-   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='print -r --'
-elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='printf %s\n'
-else
-  # Use this function as a fallback that always works.
-  func_fallback_echo ()
-  {
-    eval 'cat <<_LTECHO_EOF
-$[]1
-_LTECHO_EOF'
-  }
-  ECHO='func_fallback_echo'
-fi
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO "$*" 
-}
-
-case "$ECHO" in
-  printf*) AC_MSG_RESULT([printf]) ;;
-  print*) AC_MSG_RESULT([print -r]) ;;
-  *) AC_MSG_RESULT([cat]) ;;
-esac
-
-m4_ifdef([_AS_DETECT_SUGGESTED],
-[_AS_DETECT_SUGGESTED([
-  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
-    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-    PATH=/empty FPATH=/empty; export PATH FPATH
-    test "X`printf %s $ECHO`" = "X$ECHO" \
-      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
-
-_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
-_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
-])# _LT_PROG_ECHO_BACKSLASH
-
-
-# _LT_ENABLE_LOCK
-# ---------------
-m4_defun([_LT_ENABLE_LOCK],
-[AC_ARG_ENABLE([libtool-lock],
-  [AS_HELP_STRING([--disable-libtool-lock],
-    [avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.$ac_objext` in
-      *ELF-32*)
-	HPUX_IA64_MODE="32"
-	;;
-      *ELF-64*)
-	HPUX_IA64_MODE="64"
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -melf32bsmip"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -melf32bmipn32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -melf64bmip"
-	;;
-      esac
-    else
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -32"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -n32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -64"
-	  ;;
-      esac
-    fi
-  fi
-  rm -rf conftest*
-  ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-      *32-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_i386_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_i386"
-	    ;;
-	  ppc64-*linux*|powerpc64-*linux*)
-	    LD="${LD-ld} -m elf32ppclinux"
-	    ;;
-	  s390x-*linux*)
-	    LD="${LD-ld} -m elf_s390"
-	    ;;
-	  sparc64-*linux*)
-	    LD="${LD-ld} -m elf32_sparc"
-	    ;;
-	esac
-	;;
-      *64-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_x86_64_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_x86_64"
-	    ;;
-	  ppc*-*linux*|powerpc*-*linux*)
-	    LD="${LD-ld} -m elf64ppc"
-	    ;;
-	  s390*-*linux*|s390*-*tpf*)
-	    LD="${LD-ld} -m elf64_s390"
-	    ;;
-	  sparc*-*linux*)
-	    LD="${LD-ld} -m elf64_sparc"
-	    ;;
-	esac
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
-    [AC_LANG_PUSH(C)
-     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
-     AC_LANG_POP])
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-sparc*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
-      *)
-	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
-	  LD="${LD-ld} -64"
-	fi
-	;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-esac
-
-need_locks="$enable_libtool_lock"
-])# _LT_ENABLE_LOCK
-
-
-# _LT_CMD_OLD_ARCHIVE
-# -------------------
-m4_defun([_LT_CMD_OLD_ARCHIVE],
-[AC_CHECK_TOOL(AR, ar, false)
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-_LT_DECL([], [AR], [1], [The archiver])
-_LT_DECL([], [AR_FLAGS], [1])
-
-AC_CHECK_TOOL(STRIP, strip, :)
-test -z "$STRIP" && STRIP=:
-_LT_DECL([], [STRIP], [1], [A symbol stripping program])
-
-AC_CHECK_TOOL(RANLIB, ranlib, :)
-test -z "$RANLIB" && RANLIB=:
-_LT_DECL([], [RANLIB], [1],
-    [Commands used to install an old-style archive])
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
-fi
-
-case $host_os in
-  darwin*)
-    lock_old_archive_extraction=yes ;;
-  *)
-    lock_old_archive_extraction=no ;;
-esac
-_LT_DECL([], [old_postinstall_cmds], [2])
-_LT_DECL([], [old_postuninstall_cmds], [2])
-_LT_TAGDECL([], [old_archive_cmds], [2],
-    [Commands used to build an old-style archive])
-_LT_DECL([], [lock_old_archive_extraction], [0],
-    [Whether to use a lock for old archive extraction])
-])# _LT_CMD_OLD_ARCHIVE
-
-
-# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------------------
-# Check whether the given compiler option works
-AC_DEFUN([_LT_COMPILER_OPTION],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$3"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       $2=yes
-     fi
-   fi
-   $RM conftest*
-])
-
-if test x"[$]$2" = xyes; then
-    m4_if([$5], , :, [$5])
-else
-    m4_if([$6], , :, [$6])
-fi
-])# _LT_COMPILER_OPTION
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
-
-
-# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#                  [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------
-# Check whether the given linker option works
-AC_DEFUN([_LT_LINKER_OPTION],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $3"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&AS_MESSAGE_LOG_FD
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         $2=yes
-       fi
-     else
-       $2=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-])
-
-if test x"[$]$2" = xyes; then
-    m4_if([$4], , :, [$4])
-else
-    m4_if([$5], , :, [$5])
-fi
-])# _LT_LINKER_OPTION
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
-
-
-# LT_CMD_MAX_LEN
-#---------------
-AC_DEFUN([LT_CMD_MAX_LEN],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-# find the maximum length of command line arguments
-AC_MSG_CHECKING([the maximum length of command line arguments])
-AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
-  i=0
-  teststring="ABCD"
-
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
-
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
-
-  cygwin* | mingw* | cegcc*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  mint*)
-    # On MiNT this can take a long time and run out of memory.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
-
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
-
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    else
-      # Make teststring a little bigger before we do anything with it.
-      # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
-        teststring=$teststring$teststring
-      done
-      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-      # If test is not a shell built-in, we'll probably end up computing a
-      # maximum length that is only half of the actual maximum length, but
-      # we can't tell.
-      while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \
-	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
-      do
-        i=`expr $i + 1`
-        teststring=$teststring$teststring
-      done
-      # Only check the string length outside the loop.
-      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
-      teststring=
-      # Add a significant safety factor because C++ compilers can tack on
-      # massive amounts of additional arguments before passing them to the
-      # linker.  It appears as though 1/2 is a usable value.
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    fi
-    ;;
-  esac
-])
-if test -n $lt_cv_sys_max_cmd_len ; then
-  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
-else
-  AC_MSG_RESULT(none)
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-_LT_DECL([], [max_cmd_len], [0],
-    [What is the maximum length of a command?])
-])# LT_CMD_MAX_LEN
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
-
-
-# _LT_HEADER_DLFCN
-# ----------------
-m4_defun([_LT_HEADER_DLFCN],
-[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
-])# _LT_HEADER_DLFCN
-
-
-# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
-#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
-# ----------------------------------------------------------------
-m4_defun([_LT_TRY_DLOPEN_SELF],
-[m4_require([_LT_HEADER_DLFCN])dnl
-if test "$cross_compiling" = yes; then :
-  [$4]
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-[#line $LINENO "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
-   correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-void fnord () __attribute__((visibility("default")));
-#endif
-
-void fnord () { int i=42; }
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else
-        {
-	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
-          else puts (dlerror ());
-	}
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}]
-_LT_EOF
-  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) $1 ;;
-      x$lt_dlneed_uscore) $2 ;;
-      x$lt_dlunknown|x*) $3 ;;
-    esac
-  else :
-    # compilation failed
-    $3
-  fi
-fi
-rm -fr conftest*
-])# _LT_TRY_DLOPEN_SELF
-
-
-# LT_SYS_DLOPEN_SELF
-# ------------------
-AC_DEFUN([LT_SYS_DLOPEN_SELF],
-[m4_require([_LT_HEADER_DLFCN])dnl
-if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-    ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-    ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ])
-    ;;
-
-  *)
-    AC_CHECK_FUNC([shl_load],
-	  [lt_cv_dlopen="shl_load"],
-      [AC_CHECK_LIB([dld], [shl_load],
-	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
-	[AC_CHECK_FUNC([dlopen],
-	      [lt_cv_dlopen="dlopen"],
-	  [AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
-	    [AC_CHECK_LIB([svld], [dlopen],
-		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
-	      [AC_CHECK_LIB([dld], [dld_link],
-		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
-	      ])
-	    ])
-	  ])
-	])
-      ])
-    ;;
-  esac
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    AC_CACHE_CHECK([whether a program can dlopen itself],
-	  lt_cv_dlopen_self, [dnl
-	  _LT_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
-	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
-    ])
-
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
-	  lt_cv_dlopen_self_static, [dnl
-	  _LT_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
-	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
-      ])
-    fi
-
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
-
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-_LT_DECL([dlopen_support], [enable_dlopen], [0],
-	 [Whether dlopen is supported])
-_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
-	 [Whether dlopen of programs is supported])
-_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
-	 [Whether dlopen of statically linked programs is supported])
-])# LT_SYS_DLOPEN_SELF
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
-
-
-# _LT_COMPILER_C_O([TAGNAME])
-# ---------------------------
-# Check to see if options -c and -o are simultaneously supported by compiler.
-# This macro does not hard code the compiler like AC_PROG_CC_C_O.
-m4_defun([_LT_COMPILER_C_O],
-[m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
-  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
-  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-     fi
-   fi
-   chmod u+w . 2>&AS_MESSAGE_LOG_FD
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-])
-_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
-	[Does compiler simultaneously support -c and -o options?])
-])# _LT_COMPILER_C_O
-
-
-# _LT_COMPILER_FILE_LOCKS([TAGNAME])
-# ----------------------------------
-# Check to see if we can do hard links to lock some files if needed
-m4_defun([_LT_COMPILER_FILE_LOCKS],
-[m4_require([_LT_ENABLE_LOCK])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-_LT_COMPILER_C_O([$1])
-
-hard_links="nottested"
-if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  AC_MSG_CHECKING([if we can lock with hard links])
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  AC_MSG_RESULT([$hard_links])
-  if test "$hard_links" = no; then
-    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
-])# _LT_COMPILER_FILE_LOCKS
-
-
-# _LT_CHECK_OBJDIR
-# ----------------
-m4_defun([_LT_CHECK_OBJDIR],
-[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
-[rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null])
-objdir=$lt_cv_objdir
-_LT_DECL([], [objdir], [0],
-         [The name of the directory that contains temporary libtool files])dnl
-m4_pattern_allow([LT_OBJDIR])dnl
-AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
-  [Define to the sub-directory in which libtool stores uninstalled libraries.])
-])# _LT_CHECK_OBJDIR
-
-
-# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
-# --------------------------------------
-# Check hardcoding attributes.
-m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
-[AC_MSG_CHECKING([how to hardcode library paths into programs])
-_LT_TAGVAR(hardcode_action, $1)=
-if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
-   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
-   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
-     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
-    # Linking always hardcodes the temporary library directory.
-    _LT_TAGVAR(hardcode_action, $1)=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    _LT_TAGVAR(hardcode_action, $1)=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  _LT_TAGVAR(hardcode_action, $1)=unsupported
-fi
-AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
-
-if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
-   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-_LT_TAGDECL([], [hardcode_action], [0],
-    [How to hardcode a shared library path into an executable])
-])# _LT_LINKER_HARDCODE_LIBPATH
-
-
-# _LT_CMD_STRIPLIB
-# ----------------
-m4_defun([_LT_CMD_STRIPLIB],
-[m4_require([_LT_DECL_EGREP])
-striplib=
-old_striplib=
-AC_MSG_CHECKING([whether stripping libraries is possible])
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  AC_MSG_RESULT([yes])
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-  darwin*)
-    if test -n "$STRIP" ; then
-      striplib="$STRIP -x"
-      old_striplib="$STRIP -S"
-      AC_MSG_RESULT([yes])
-    else
-      AC_MSG_RESULT([no])
-    fi
-    ;;
-  *)
-    AC_MSG_RESULT([no])
-    ;;
-  esac
-fi
-_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
-_LT_DECL([], [striplib], [1])
-])# _LT_CMD_STRIPLIB
-
-
-# _LT_SYS_DYNAMIC_LINKER([TAG])
-# -----------------------------
-# PORTME Fill in your ld.so characteristics
-m4_defun([_LT_SYS_DYNAMIC_LINKER],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_OBJDUMP])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_CHECK_SHELL_FEATURES])dnl
-AC_MSG_CHECKING([dynamic linker characteristics])
-m4_if([$1],
-	[], [
-if test "$GCC" = yes; then
-  case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
-  esac
-  case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
-  esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
-  case $lt_search_path_spec in
-  *\;*)
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
-    ;;
-  *)
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
-    ;;
-  esac
-  # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
-  lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
-  for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
-      test -d "$lt_sys_path" && \
-	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
-    fi
-  done
-  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
-  for (lt_i = NF; lt_i > 0; lt_i--) {
-    if ($lt_i != "" && $lt_i != ".") {
-      if ($lt_i == "..") {
-        lt_count++;
-      } else {
-        if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
-        } else {
-          lt_count--;
-        }
-      }
-    }
-  }
-  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
-  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
-}'`
-  # AWK program above erroneously prepends '/' to C:/dos/paths
-  # for these hosts.
-  case $host_os in
-    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
-  esac
-  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi])
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[[4-9]]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[[01]] | aix4.[[01]].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[[45]]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-m4_if([$1], [],[
-      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
-
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-m4_if([$1], [],[
-  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd1*)
-  dynamic_linker=no
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[[123]]*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
-  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
-
-haiku*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
-  postinstall_cmds='chmod 555 $lib'
-  # or fails outright, so override atomically:
-  install_override_mode=555
-  ;;
-
-interix[[3-9]]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-
-  # Some binutils ld are patched to set DT_RUNPATH
-  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
-    [lt_cv_shlibpath_overrides_runpath=no
-    save_LDFLAGS=$LDFLAGS
-    save_libdir=$libdir
-    eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
-	 LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
-    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
-      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
-	 [lt_cv_shlibpath_overrides_runpath=yes])])
-    LDFLAGS=$save_LDFLAGS
-    libdir=$save_libdir
-    ])
-  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[[89]] | openbsd2.[[89]].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-AC_MSG_RESULT([$dynamic_linker])
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-_LT_DECL([], [variables_saved_for_relink], [1],
-    [Variables whose values should be saved in libtool wrapper scripts and
-    restored at link time])
-_LT_DECL([], [need_lib_prefix], [0],
-    [Do we need the "lib" prefix for modules?])
-_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
-_LT_DECL([], [version_type], [0], [Library versioning type])
-_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
-_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
-_LT_DECL([], [shlibpath_overrides_runpath], [0],
-    [Is shlibpath searched before the hard-coded library search path?])
-_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
-_LT_DECL([], [library_names_spec], [1],
-    [[List of archive names.  First name is the real one, the rest are links.
-    The last name is the one that the linker finds with -lNAME]])
-_LT_DECL([], [soname_spec], [1],
-    [[The coded name of the library, if different from the real name]])
-_LT_DECL([], [install_override_mode], [1],
-    [Permission mode override for installation of shared libraries])
-_LT_DECL([], [postinstall_cmds], [2],
-    [Command to use after installation of a shared archive])
-_LT_DECL([], [postuninstall_cmds], [2],
-    [Command to use after uninstallation of a shared archive])
-_LT_DECL([], [finish_cmds], [2],
-    [Commands used to finish a libtool library installation in a directory])
-_LT_DECL([], [finish_eval], [1],
-    [[As "finish_cmds", except a single script fragment to be evaled but
-    not shown]])
-_LT_DECL([], [hardcode_into_libs], [0],
-    [Whether we should hardcode library paths into libraries])
-_LT_DECL([], [sys_lib_search_path_spec], [2],
-    [Compile-time system search path for libraries])
-_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
-    [Run-time system search path for libraries])
-])# _LT_SYS_DYNAMIC_LINKER
-
-
-# _LT_PATH_TOOL_PREFIX(TOOL)
-# --------------------------
-# find a file program which can recognize shared library
-AC_DEFUN([_LT_PATH_TOOL_PREFIX],
-[m4_require([_LT_DECL_EGREP])dnl
-AC_MSG_CHECKING([for $1])
-AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
-[case $MAGIC_CMD in
-[[\\/*] |  ?:[\\/]*])
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-dnl $ac_dummy forces splitting on constant user-supplied paths.
-dnl POSIX.2 word splitting is done only on the output of word expansions,
-dnl not every word.  This closes a longstanding sh security hole.
-  ac_dummy="m4_if([$2], , $PATH, [$2])"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$1; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac])
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  AC_MSG_RESULT($MAGIC_CMD)
-else
-  AC_MSG_RESULT(no)
-fi
-_LT_DECL([], [MAGIC_CMD], [0],
-	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
-])# _LT_PATH_TOOL_PREFIX
-
-# Old name:
-AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
-
-
-# _LT_PATH_MAGIC
-# --------------
-# find a file program which can recognize a shared library
-m4_defun([_LT_PATH_MAGIC],
-[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
-  else
-    MAGIC_CMD=:
-  fi
-fi
-])# _LT_PATH_MAGIC
-
-
-# LT_PATH_LD
-# ----------
-# find the pathname to the GNU or non-GNU linker
-AC_DEFUN([LT_PATH_LD],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
-
-AC_ARG_WITH([gnu-ld],
-    [AS_HELP_STRING([--with-gnu-ld],
-	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
-    [test "$withval" = no || with_gnu_ld=yes],
-    [with_gnu_ld=no])dnl
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  AC_MSG_CHECKING([for ld used by $CC])
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [[\\/]]* | ?:[[\\/]]*)
-      re_direlt='/[[^/]][[^/]]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  AC_MSG_CHECKING([for GNU ld])
-else
-  AC_MSG_CHECKING([for non-GNU ld])
-fi
-AC_CACHE_VAL(lt_cv_path_LD,
-[if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi])
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  AC_MSG_RESULT($LD)
-else
-  AC_MSG_RESULT(no)
-fi
-test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
-_LT_PATH_LD_GNU
-AC_SUBST([LD])
-
-_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
-])# LT_PATH_LD
-
-# Old names:
-AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
-AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_PROG_LD], [])
-dnl AC_DEFUN([AC_PROG_LD], [])
-
-
-# _LT_PATH_LD_GNU
-#- --------------
-m4_defun([_LT_PATH_LD_GNU],
-[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
-[# I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac])
-with_gnu_ld=$lt_cv_prog_gnu_ld
-])# _LT_PATH_LD_GNU
-
-
-# _LT_CMD_RELOAD
-# --------------
-# find reload flag for linker
-#   -- PORTME Some linkers may need a different reload flag.
-m4_defun([_LT_CMD_RELOAD],
-[AC_CACHE_CHECK([for $LD option to reload object files],
-  lt_cv_ld_reload_flag,
-  [lt_cv_ld_reload_flag='-r'])
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
-_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
-_LT_TAGDECL([], [reload_cmds], [2])dnl
-])# _LT_CMD_RELOAD
-
-
-# _LT_CHECK_MAGIC_METHOD
-# ----------------------
-# how to check for library dependencies
-#  -- PORTME fill in with the dynamic library characteristics
-m4_defun([_LT_CHECK_MAGIC_METHOD],
-[m4_require([_LT_DECL_EGREP])
-m4_require([_LT_DECL_OBJDUMP])
-AC_CACHE_CHECK([how to recognize dependent libraries],
-lt_cv_deplibs_check_method,
-[lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[[4-9]]*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[[45]]*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump',
-  # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
-    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-    lt_cv_file_magic_cmd='func_win32_libid'
-  else
-    # Keep this pattern in sync with the one in func_win32_libid.
-    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
-    lt_cv_file_magic_cmd='$OBJDUMP -f'
-  fi
-  ;;
-
-cegcc*)
-  # use the weaker test based on 'objdump'. See mingw*.
-  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
-
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-freebsd* | dragonfly*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
-
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-haiku*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
-
-interix[[3-9]]*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
-  fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-*nto* | *qnx*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-rdos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-tpf*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-])
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-_LT_DECL([], [deplibs_check_method], [1],
-    [Method to check whether dependent libraries are shared objects])
-_LT_DECL([], [file_magic_cmd], [1],
-    [Command to use when deplibs_check_method == "file_magic"])
-])# _LT_CHECK_MAGIC_METHOD
-
-
-# LT_PATH_NM
-# ----------
-# find the pathname to a BSD- or MS-compatible name lister
-AC_DEFUN([LT_PATH_NM],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
-[if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  : ${lt_cv_path_NM=no}
-fi])
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
-else
-  # Didn't find any BSD compatible name lister, look for dumpbin.
-  if test -n "$DUMPBIN"; then :
-    # Let the user override the test.
-  else
-    AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
-    *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
-      ;;
-    *)
-      DUMPBIN=:
-      ;;
-    esac
-  fi
-  AC_SUBST([DUMPBIN])
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
-  fi
-fi
-test -z "$NM" && NM=nm
-AC_SUBST([NM])
-_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
-
-AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
-  [lt_cv_nm_interface="BSD nm"
-  echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
-  (eval "$ac_compile" 2>conftest.err)
-  cat conftest.err >&AS_MESSAGE_LOG_FD
-  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
-  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
-  cat conftest.err >&AS_MESSAGE_LOG_FD
-  (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
-  cat conftest.out >&AS_MESSAGE_LOG_FD
-  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
-    lt_cv_nm_interface="MS dumpbin"
-  fi
-  rm -f conftest*])
-])# LT_PATH_NM
-
-# Old names:
-AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
-AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_PROG_NM], [])
-dnl AC_DEFUN([AC_PROG_NM], [])
-
-
-# LT_LIB_M
-# --------
-# check for math library
-AC_DEFUN([LT_LIB_M],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-LIBM=
-case $host in
-*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
-  # These system don't have libm, or don't need it
-  ;;
-*-ncr-sysv4.3*)
-  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
-  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
-  ;;
-*)
-  AC_CHECK_LIB(m, cos, LIBM="-lm")
-  ;;
-esac
-AC_SUBST([LIBM])
-])# LT_LIB_M
-
-# Old name:
-AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_CHECK_LIBM], [])
-
-
-# _LT_COMPILER_NO_RTTI([TAGNAME])
-# -------------------------------
-m4_defun([_LT_COMPILER_NO_RTTI],
-[m4_require([_LT_TAG_COMPILER])dnl
-
-_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-
-if test "$GCC" = yes; then
-  case $cc_basename in
-  nvcc*)
-    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
-  *)
-    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
-  esac
-
-  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
-    lt_cv_prog_compiler_rtti_exceptions,
-    [-fno-rtti -fno-exceptions], [],
-    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
-fi
-_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
-	[Compiler flag to turn off builtin functions])
-])# _LT_COMPILER_NO_RTTI
-
-
-# _LT_CMD_GLOBAL_SYMBOLS
-# ----------------------
-m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-AC_REQUIRE([LT_PATH_LD])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-AC_MSG_CHECKING([command to parse $NM output from $compiler object])
-AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
-[
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[[BCDEGRST]]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[[BCDT]]'
-  ;;
-cygwin* | mingw* | pw32* | cegcc*)
-  symcode='[[ABCDGISTW]]'
-  ;;
-hpux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[[ABCDEGRST]]'
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[[BCDEGRST]]'
-  ;;
-osf*)
-  symcode='[[BCDEGQRST]]'
-  ;;
-solaris*)
-  symcode='[[BDRT]]'
-  ;;
-sco3.2v5*)
-  symcode='[[DT]]'
-  ;;
-sysv4.2uw2*)
-  symcode='[[DT]]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[[ABDT]]'
-  ;;
-sysv4)
-  symcode='[[DFNSTU]]'
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[[ABCDGIRSTW]]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
-    # Also find C++ and __fastcall symbols from MSVC++,
-    # which start with @ or ?.
-    lt_cv_sys_global_symbol_pipe="$AWK ['"\
-"     {last_section=section; section=\$ 3};"\
-"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-"     \$ 0!~/External *\|/{next};"\
-"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-"     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-"     ' prfx=^$ac_symprfx]"
-  else
-    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-  fi
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
-  if AC_TRY_EVAL(ac_compile); then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
-	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<_LT_EOF > conftest.$ac_ext
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
-	  cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols.  */
-const struct {
-  const char *name;
-  void       *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[[]] =
-{
-  { "@PROGRAM@", (void *) 0 },
-_LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
-	  cat <<\_LT_EOF >> conftest.$ac_ext
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_save_LIBS="$LIBS"
-	  lt_save_CFLAGS="$CFLAGS"
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
-	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS="$lt_save_LIBS"
-	  CFLAGS="$lt_save_CFLAGS"
-	else
-	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
-    fi
-  else
-    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
-    cat conftest.$ac_ext >&5
-  fi
-  rm -rf conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-])
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  AC_MSG_RESULT(failed)
-else
-  AC_MSG_RESULT(ok)
-fi
-
-_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
-    [Take the output of nm and produce a listing of raw symbols and C names])
-_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
-    [Transform the output of nm in a proper C declaration])
-_LT_DECL([global_symbol_to_c_name_address],
-    [lt_cv_sys_global_symbol_to_c_name_address], [1],
-    [Transform the output of nm in a C name address pair])
-_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
-    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
-    [Transform the output of nm in a C name address pair when lib prefix is needed])
-]) # _LT_CMD_GLOBAL_SYMBOLS
-
-
-# _LT_COMPILER_PIC([TAGNAME])
-# ---------------------------
-m4_defun([_LT_COMPILER_PIC],
-[m4_require([_LT_TAG_COMPILER])dnl
-_LT_TAGVAR(lt_prog_compiler_wl, $1)=
-_LT_TAGVAR(lt_prog_compiler_pic, $1)=
-_LT_TAGVAR(lt_prog_compiler_static, $1)=
-
-AC_MSG_CHECKING([for $compiler option to produce PIC])
-m4_if([$1], [CXX], [
-  # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
-    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-    aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-    mingw* | cygwin* | os2* | pw32* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-    *djgpp*)
-      # DJGPP does not support shared libraries at all
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-      ;;
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)=
-      ;;
-    interix[[3-9]]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-    *qnx* | *nto*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-    *)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-  else
-    case $host_os in
-      aix[[4-9]]*)
-	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
-	  # AIX 5 now supports IA64 processor
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	else
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-	fi
-	;;
-      chorus*)
-	case $cc_basename in
-	cxch68*)
-	  # Green Hills C++ Compiler
-	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
-	  ;;
-	esac
-	;;
-      dgux*)
-	case $cc_basename in
-	  ec++*)
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  ghcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      freebsd* | dragonfly*)
-	# FreeBSD uses GNU C++
-	;;
-      hpux9* | hpux10* | hpux11*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	    fi
-	    ;;
-	  aCC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    case $host_cpu in
-	    hppa*64*|ia64*)
-	      # +Z the default
-	      ;;
-	    *)
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	      ;;
-	    esac
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      interix*)
-	# This is c89, which is MS Visual C++ (no shared libs)
-	# Anyone wants to do a port?
-	;;
-      irix5* | irix6* | nonstopux*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    # CC pic flag -KPIC is the default.
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-	case $cc_basename in
-	  KCC*)
-	    # KAI C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	    ;;
-	  ecpc* )
-	    # old Intel C++ for x86_64 which still supported -KPIC.
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	    ;;
-	  icpc* )
-	    # Intel C++, used to be incompatible with GCC.
-	    # ICC 10 doesn't accept -KPIC any more.
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	    ;;
-	  pgCC* | pgcpp*)
-	    # Portland Group C++ compiler
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  cxx*)
-	    # Compaq C++
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
-	    # IBM XL 8.0, 9.0 on PPC and BlueGene
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-      lynxos*)
-	;;
-      m88k*)
-	;;
-      mvs*)
-	case $cc_basename in
-	  cxx*)
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      netbsd*)
-	;;
-      *qnx* | *nto*)
-        # QNX uses GNU C++, but need to define -shared option too, otherwise
-        # it will coredump.
-        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-        ;;
-      osf3* | osf4* | osf5*)
-	case $cc_basename in
-	  KCC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    ;;
-	  RCC*)
-	    # Rational C++ 2.4.1
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  cxx*)
-	    # Digital/Compaq C++
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      psos*)
-	;;
-      solaris*)
-	case $cc_basename in
-	  CC* | sunCC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	    ;;
-	  gcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sunos4*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.x
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  lcc*)
-	    # Lucid
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	esac
-	;;
-      tandem*)
-	case $cc_basename in
-	  NCC*)
-	    # NonStop-UX NCC 3.20
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      vxworks*)
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-	;;
-    esac
-  fi
-],
-[
-  if test "$GCC" = yes; then
-    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)=
-      ;;
-
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	# +Z the default
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-
-    interix[[3-9]]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      enable_shared=no
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-
-    *)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-
-    case $cc_basename in
-    nvcc*) # Cuda Compiler Driver 2.2
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Xcompiler -fPIC'
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      else
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC (with -KPIC) is the default.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
-      case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
-      ecc*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-        ;;
-      # icc used to be incompatible with GCC.
-      # ICC 10 doesn't accept -KPIC any more.
-      icc* | ifort*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-        ;;
-      # Lahey Fortran 8.1.
-      lf95*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
-	;;
-      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-        ;;
-      ccc*)
-        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-        # All Alpha code is PIC.
-        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-        ;;
-      xl* | bgxl* | bgf* | mpixl*)
-	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
-	;;
-      *)
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ F* | *Sun*Fortran*)
-	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
-	  ;;
-	*Sun\ C*)
-	  # Sun C 5.9
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	  ;;
-	esac
-	;;
-      esac
-      ;;
-
-    newsos6)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-
-    osf3* | osf4* | osf5*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # All OSF/1 code is PIC.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    rdos*)
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    solaris*)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    unicos*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-
-    uts4*)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    *)
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-    esac
-  fi
-])
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-    ;;
-  *)
-    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
-    ;;
-esac
-AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
-_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
-	[How to pass a linker flag through the compiler])
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
-  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
-    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
-    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
-    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
-     "" | " "*) ;;
-     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
-     esac],
-    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
-     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
-fi
-_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
-	[Additional compiler flags for building library objects])
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
-_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
-  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
-  $lt_tmp_static_flag,
-  [],
-  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
-_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
-	[Compiler flag to prevent dynamic linking])
-])# _LT_COMPILER_PIC
-
-
-# _LT_LINKER_SHLIBS([TAGNAME])
-# ----------------------------
-# See if the linker supports building shared libraries.
-m4_defun([_LT_LINKER_SHLIBS],
-[AC_REQUIRE([LT_PATH_LD])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-m4_if([$1], [CXX], [
-  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  case $host_os in
-  aix[[4-9]]*)
-    # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    # Also, AIX nm treats weak defined symbols like other global defined
-    # symbols, whereas GNU nm marks them as "W".
-    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    else
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    fi
-    ;;
-  pw32*)
-    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
-  ;;
-  cygwin* | mingw* | cegcc*)
-    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  *)
-    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  esac
-  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
-], [
-  runpath_var=
-  _LT_TAGVAR(allow_undefined_flag, $1)=
-  _LT_TAGVAR(always_export_symbols, $1)=no
-  _LT_TAGVAR(archive_cmds, $1)=
-  _LT_TAGVAR(archive_expsym_cmds, $1)=
-  _LT_TAGVAR(compiler_needs_object, $1)=no
-  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
-  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  _LT_TAGVAR(hardcode_automatic, $1)=no
-  _LT_TAGVAR(hardcode_direct, $1)=no
-  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
-  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-  _LT_TAGVAR(hardcode_libdir_separator, $1)=
-  _LT_TAGVAR(hardcode_minus_L, $1)=no
-  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  _LT_TAGVAR(inherit_rpath, $1)=no
-  _LT_TAGVAR(link_all_deplibs, $1)=unknown
-  _LT_TAGVAR(module_cmds, $1)=
-  _LT_TAGVAR(module_expsym_cmds, $1)=
-  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
-  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
-  _LT_TAGVAR(thread_safe_flag_spec, $1)=
-  _LT_TAGVAR(whole_archive_flag_spec, $1)=
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  _LT_TAGVAR(include_expsyms, $1)=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  # Exclude shared library initialization/finalization symbols.
-dnl Note also adjust exclude_expsyms for C++ above.
-  extract_expsyms_cmds=
-
-  case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  esac
-
-  _LT_TAGVAR(ld_shlibs, $1)=yes
-
-  # On some targets, GNU ld is compatible enough with the native linker
-  # that we're better off using the native interface for both.
-  lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
-    case $host_os in
-      aix*)
-	# The AIX port of GNU ld has always aspired to compatibility
-	# with the native linker.  However, as the warning in the GNU ld
-	# block says, versions before 2.19.5* couldn't really create working
-	# shared libraries, regardless of the interface used.
-	case `$LD -v 2>&1` in
-	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
-	  *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
-	  *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
-	  *)
-	    lt_use_gnu_ld_interface=yes
-	    ;;
-	esac
-	;;
-      *)
-	lt_use_gnu_ld_interface=yes
-	;;
-    esac
-  fi
-
-  if test "$lt_use_gnu_ld_interface" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      _LT_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>&1` in
-      *GNU\ gold*) supports_anon_versioning=yes ;;
-      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[[3-9]]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.19, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to install binutils
-*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
-*** You will then need to restart the configuration process.
-
-_LT_EOF
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            _LT_TAGVAR(archive_expsym_cmds, $1)=''
-        ;;
-      m68k)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes
-        ;;
-      esac
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-      # as there is no search path for DLLs.
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(always_export_symbols, $1)=no
-      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
-
-      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    haiku*)
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    interix[[3-9]]*)
-      _LT_TAGVAR(hardcode_direct, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
-	case $cc_basename in
-	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
-	esac
-      fi
-      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
-      then
-	tmp_addflag=
-	tmp_sharedflag='-shared'
-	case $cc_basename,$host_cpu in
-        pgcc*)				# Portland Group C compiler
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95* | pgfortran*)
-					# Portland Group f77 and f90 compilers
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	lf95*)				# Lahey Fortran 8.1
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
-	  tmp_sharedflag='--shared' ;;
-	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
-	  tmp_sharedflag='-qmkshrobj'
-	  tmp_addflag= ;;
-	nvcc*)	# Cuda Compiler Driver 2.2
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  _LT_TAGVAR(compiler_needs_object, $1)=yes
-	  ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  _LT_TAGVAR(compiler_needs_object, $1)=yes
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	esac
-	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-        if test "x$supports_anon_versioning" = xyes; then
-          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-        fi
-
-	case $cc_basename in
-	xlf* | bgf* | bgxlf* | mpixlf*)
-	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-	  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
-	  fi
-	  ;;
-	esac
-      else
-        _LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  # For security reasons, it is highly recommended that you always
-	  # use absolute paths for naming shared libraries, and exclude the
-	  # DT_RUNPATH tag from executables and libraries.  But doing so
-	  # requires that you compile everything twice, which is a pain.
-	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  else
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-    esac
-
-    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
-      runpath_var=
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
-      _LT_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(always_export_symbols, $1)=yes
-      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	_LT_TAGVAR(hardcode_direct, $1)=unsupported
-      fi
-      ;;
-
-    aix[[4-9]]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
-	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	else
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
-	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-	    aix_use_runtimelinking=yes
-	    break
-	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      _LT_TAGVAR(archive_cmds, $1)=''
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[[012]]|aix4.[[012]].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	  # We have reworked collect2
-	  :
-	  else
-	  # We have old collect2
-	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      _LT_TAGVAR(always_export_symbols, $1)=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
-        # Determine the default libpath from the value encoded in an
-        # empty executable.
-        _LT_SYS_MODULE_PATH_AIX
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-      else
-	if test "$host_cpu" = ia64; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an
-	 # empty executable.
-	 _LT_SYS_MODULE_PATH_AIX
-	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
-	    # We only use this code for GNU lds that support --whole-archive.
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	  else
-	    # Exported symbols can be pulled into shared objects from archives
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	  fi
-	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            _LT_TAGVAR(archive_expsym_cmds, $1)=''
-        ;;
-      m68k)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes
-        ;;
-      esac
-      ;;
-
-    bsdi[[45]]*)
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
-      # FIXME: Should let the user specify the lib program.
-      _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
-      _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
-      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      ;;
-
-    darwin* | rhapsody*)
-      _LT_DARWIN_LINKER_FEATURES($1)
-      ;;
-
-    dgux*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    freebsd1*)
-      _LT_TAGVAR(ld_shlibs, $1)=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
-	_LT_TAGVAR(hardcode_direct, $1)=yes
-	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	_LT_TAGVAR(hardcode_minus_L, $1)=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	m4_if($1, [], [
-	  # Older versions of the 11.00 compiler do not understand -b yet
-	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
-	  _LT_LINKER_OPTION([if $CC understands -b],
-	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
-	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
-	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
-	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  _LT_TAGVAR(hardcode_direct, $1)=no
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	  ;;
-	*)
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	# Try to use the -exported_symbol ld option, if it does not
-	# work, assume that -exports_file does not work either and
-	# implicitly export all symbols.
-        save_LDFLAGS="$LDFLAGS"
-        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-        AC_LINK_IFELSE(int foo(void) {},
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-        )
-        LDFLAGS="$save_LDFLAGS"
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(inherit_rpath, $1)=yes
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    newsos6)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *nto* | *qnx*)
-      ;;
-
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	_LT_TAGVAR(hardcode_direct, $1)=yes
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	else
-	  case $host_os in
-	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
-	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	     ;;
-	   *)
-	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-	fi
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    os2*)
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      else
-	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    solaris*)
-      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-      else
-	case `$CC -V 2>&1` in
-	*"Compilers 5.0"*)
-	  wlarc=''
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
-	  ;;
-	*)
-	  wlarc='${wl}'
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-	  ;;
-	esac
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      case $host_os in
-      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
-	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
-	  _LT_TAGVAR(hardcode_direct, $1)=no
-        ;;
-	motorola)
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4.3*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	_LT_TAGVAR(ld_shlibs, $1)=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      _LT_TAGVAR(ld_shlibs, $1)=no
-      ;;
-    esac
-
-    if test x$host_vendor = xsni; then
-      case $host in
-      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
-	;;
-      esac
-    fi
-  fi
-])
-AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
-
-_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
-_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
-_LT_DECL([], [extract_expsyms_cmds], [2],
-    [The commands to extract the exported symbol list from a shared archive])
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
-x|xyes)
-  # Assume -lc should be added
-  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $_LT_TAGVAR(archive_cmds, $1) in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      AC_CACHE_CHECK([whether -lc should be explicitly linked in],
-	[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
-	[$RM conftest*
-	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-	if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
-	  soname=conftest
-	  lib=conftest
-	  libobjs=conftest.$ac_objext
-	  deplibs=
-	  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
-	  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
-	  compiler_flags=-v
-	  linker_flags=-v
-	  verstring=
-	  output_objdir=.
-	  libname=conftest
-	  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
-	  _LT_TAGVAR(allow_undefined_flag, $1)=
-	  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
-	  then
-	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	  else
-	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	  fi
-	  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
-	else
-	  cat conftest.err 1>&5
-	fi
-	$RM conftest*
-	])
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
-    [Whether or not to add -lc for building shared libraries])
-_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
-    [enable_shared_with_static_runtimes], [0],
-    [Whether or not to disallow shared libs when runtime libs are static])
-_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
-    [Compiler flag to allow reflexive dlopens])
-_LT_TAGDECL([], [whole_archive_flag_spec], [1],
-    [Compiler flag to generate shared objects directly from archives])
-_LT_TAGDECL([], [compiler_needs_object], [1],
-    [Whether the compiler copes with passing no objects directly])
-_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
-    [Create an old-style archive from a shared archive])
-_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
-    [Create a temporary old-style archive to link instead of a shared archive])
-_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
-_LT_TAGDECL([], [archive_expsym_cmds], [2])
-_LT_TAGDECL([], [module_cmds], [2],
-    [Commands used to build a loadable module if different from building
-    a shared archive.])
-_LT_TAGDECL([], [module_expsym_cmds], [2])
-_LT_TAGDECL([], [with_gnu_ld], [1],
-    [Whether we are building with GNU ld or not])
-_LT_TAGDECL([], [allow_undefined_flag], [1],
-    [Flag that allows shared libraries with undefined symbols to be built])
-_LT_TAGDECL([], [no_undefined_flag], [1],
-    [Flag that enforces no undefined symbols])
-_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
-    [Flag to hardcode $libdir into a binary during linking.
-    This must work even if $libdir does not exist])
-_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1],
-    [[If ld is used when linking, flag to hardcode $libdir into a binary
-    during linking.  This must work even if $libdir does not exist]])
-_LT_TAGDECL([], [hardcode_libdir_separator], [1],
-    [Whether we need a single "-rpath" flag with a separated argument])
-_LT_TAGDECL([], [hardcode_direct], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
-    DIR into the resulting binary])
-_LT_TAGDECL([], [hardcode_direct_absolute], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
-    DIR into the resulting binary and the resulting library dependency is
-    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
-    library is relocated])
-_LT_TAGDECL([], [hardcode_minus_L], [0],
-    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-    into the resulting binary])
-_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
-    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-    into the resulting binary])
-_LT_TAGDECL([], [hardcode_automatic], [0],
-    [Set to "yes" if building a shared library automatically hardcodes DIR
-    into the library and all subsequent libraries and executables linked
-    against it])
-_LT_TAGDECL([], [inherit_rpath], [0],
-    [Set to yes if linker adds runtime paths of dependent libraries
-    to runtime path list])
-_LT_TAGDECL([], [link_all_deplibs], [0],
-    [Whether libtool must link a program against all its dependency libraries])
-_LT_TAGDECL([], [fix_srcfile_path], [1],
-    [Fix the shell variable $srcfile for the compiler])
-_LT_TAGDECL([], [always_export_symbols], [0],
-    [Set to "yes" if exported symbols are required])
-_LT_TAGDECL([], [export_symbols_cmds], [2],
-    [The commands to list exported symbols])
-_LT_TAGDECL([], [exclude_expsyms], [1],
-    [Symbols that should not be listed in the preloaded symbols])
-_LT_TAGDECL([], [include_expsyms], [1],
-    [Symbols that must always be exported])
-_LT_TAGDECL([], [prelink_cmds], [2],
-    [Commands necessary for linking programs (against libraries) with templates])
-_LT_TAGDECL([], [file_list_spec], [1],
-    [Specify filename containing input files])
-dnl FIXME: Not yet implemented
-dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
-dnl    [Compiler flag to generate thread safe objects])
-])# _LT_LINKER_SHLIBS
-
-
-# _LT_LANG_C_CONFIG([TAG])
-# ------------------------
-# Ensure that the configuration variables for a C compiler are suitably
-# defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_C_CONFIG],
-[m4_require([_LT_DECL_EGREP])dnl
-lt_save_CC="$CC"
-AC_LANG_PUSH(C)
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-_LT_TAG_COMPILER
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-  _LT_COMPILER_NO_RTTI($1)
-  _LT_COMPILER_PIC($1)
-  _LT_COMPILER_C_O($1)
-  _LT_COMPILER_FILE_LOCKS($1)
-  _LT_LINKER_SHLIBS($1)
-  _LT_SYS_DYNAMIC_LINKER($1)
-  _LT_LINKER_HARDCODE_LIBPATH($1)
-  LT_SYS_DLOPEN_SELF
-  _LT_CMD_STRIPLIB
-
-  # Report which library types will actually be built
-  AC_MSG_CHECKING([if libtool supports shared libraries])
-  AC_MSG_RESULT([$can_build_shared])
-
-  AC_MSG_CHECKING([whether to build shared libraries])
-  test "$can_build_shared" = "no" && enable_shared=no
-
-  # On AIX, shared libraries and static libraries use the same namespace, and
-  # are all built from PIC.
-  case $host_os in
-  aix3*)
-    test "$enable_shared" = yes && enable_static=no
-    if test -n "$RANLIB"; then
-      archive_cmds="$archive_cmds~\$RANLIB \$lib"
-      postinstall_cmds='$RANLIB $lib'
-    fi
-    ;;
-
-  aix[[4-9]]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
-    fi
-    ;;
-  esac
-  AC_MSG_RESULT([$enable_shared])
-
-  AC_MSG_CHECKING([whether to build static libraries])
-  # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
-  AC_MSG_RESULT([$enable_static])
-
-  _LT_CONFIG($1)
-fi
-AC_LANG_POP
-CC="$lt_save_CC"
-])# _LT_LANG_C_CONFIG
-
-
-# _LT_LANG_CXX_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for a C++ compiler are suitably
-# defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_CXX_CONFIG],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_EGREP])dnl
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
-  AC_PROG_CXXCPP
-else
-  _lt_caught_CXX_error=yes
-fi
-
-AC_LANG_PUSH(C++)
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(compiler_needs_object, $1)=no
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for C++ test sources.
-ac_ext=cpp
-
-# Object file extension for compiled C++ test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the CXX compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="int some_variable = 0;"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC=$CC
-  lt_save_LD=$LD
-  lt_save_GCC=$GCC
-  GCC=$GXX
-  lt_save_with_gnu_ld=$with_gnu_ld
-  lt_save_path_LD=$lt_cv_path_LD
-  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
-    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
-  else
-    $as_unset lt_cv_prog_gnu_ld
-  fi
-  if test -n "${lt_cv_path_LDCXX+set}"; then
-    lt_cv_path_LD=$lt_cv_path_LDCXX
-  else
-    $as_unset lt_cv_path_LD
-  fi
-  test -z "${LDCXX+set}" || LD=$LDCXX
-  CC=${CXX-"c++"}
-  compiler=$CC
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-
-  if test -n "$compiler"; then
-    # We don't want -fno-exception when compiling C++ code, so set the
-    # no_builtin_flag separately
-    if test "$GXX" = yes; then
-      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
-    else
-      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-    fi
-
-    if test "$GXX" = yes; then
-      # Set up default GNU C++ configuration
-
-      LT_PATH_LD
-
-      # Check if GNU C++ uses GNU ld as the underlying linker, since the
-      # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-        # If archive_cmds runs LD, not CC, wlarc should be empty
-        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
-        #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
-
-        # ancient GNU ld didn't support --whole-archive et. al.
-        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
-	  $GREP 'no-whole-archive' > /dev/null; then
-          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-        else
-          _LT_TAGVAR(whole_archive_flag_spec, $1)=
-        fi
-      else
-        with_gnu_ld=no
-        wlarc=
-
-        # A generic and very simple default shared library creation
-        # command for GNU C++ for the case where it uses the native
-        # linker, instead of GNU ld.  If possible, this setting should
-        # overridden to take advantage of the native linker features on
-        # the platform it is being used on.
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-      fi
-
-      # Commands to make compiler produce verbose output that lists
-      # what "hidden" libraries, object files and flags are used when
-      # linking a shared library.
-      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
-    else
-      GXX=no
-      with_gnu_ld=no
-      wlarc=
-    fi
-
-    # PORTME: fill in a description of your system's C++ link characteristics
-    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-    _LT_TAGVAR(ld_shlibs, $1)=yes
-    case $host_os in
-      aix3*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-      aix[[4-9]]*)
-        if test "$host_cpu" = ia64; then
-          # On IA64, the linker does run time linking by default, so we don't
-          # have to do anything special.
-          aix_use_runtimelinking=no
-          exp_sym_flag='-Bexport'
-          no_entry_flag=""
-        else
-          aix_use_runtimelinking=no
-
-          # Test if we are trying to use run time linking or normal
-          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
-          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
-	    for ld_flag in $LDFLAGS; do
-	      case $ld_flag in
-	      *-brtl*)
-	        aix_use_runtimelinking=yes
-	        break
-	        ;;
-	      esac
-	    done
-	    ;;
-          esac
-
-          exp_sym_flag='-bexport'
-          no_entry_flag='-bnoentry'
-        fi
-
-        # When large executables or shared objects are built, AIX ld can
-        # have problems creating the table of contents.  If linking a library
-        # or program results in "error TOC overflow" add -mminimal-toc to
-        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-        _LT_TAGVAR(archive_cmds, $1)=''
-        _LT_TAGVAR(hardcode_direct, $1)=yes
-        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-        _LT_TAGVAR(link_all_deplibs, $1)=yes
-        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
-
-        if test "$GXX" = yes; then
-          case $host_os in aix4.[[012]]|aix4.[[012]].*)
-          # We only want to do this on AIX 4.2 and lower, the check
-          # below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	    # We have reworked collect2
-	    :
-	  else
-	    # We have old collect2
-	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
-	    # It fails to find uninstalled libraries when the uninstalled
-	    # path is not listed in the libpath.  Setting hardcode_minus_L
-	    # to unsupported forces relinking
-	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
-	  fi
-          esac
-          shared_flag='-shared'
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag="$shared_flag "'${wl}-G'
-	  fi
-        else
-          # not using gcc
-          if test "$host_cpu" = ia64; then
-	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	  # chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-          else
-	    if test "$aix_use_runtimelinking" = yes; then
-	      shared_flag='${wl}-G'
-	    else
-	      shared_flag='${wl}-bM:SRE'
-	    fi
-          fi
-        fi
-
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
-        # It seems that -bexpall does not export symbols beginning with
-        # underscore (_), so it is better to generate a list of symbols to
-	# export.
-        _LT_TAGVAR(always_export_symbols, $1)=yes
-        if test "$aix_use_runtimelinking" = yes; then
-          # Warning - without using the other runtime loading flags (-brtl),
-          # -berok will link without error, but may produce a broken library.
-          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
-          # Determine the default libpath from the value encoded in an empty
-          # executable.
-          _LT_SYS_MODULE_PATH_AIX
-          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-        else
-          if test "$host_cpu" = ia64; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-          else
-	    # Determine the default libpath from the value encoded in an
-	    # empty executable.
-	    _LT_SYS_MODULE_PATH_AIX
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	    # Warning - without using the other run time loading flags,
-	    # -berok will link without error, but may produce a broken library.
-	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	    if test "$with_gnu_ld" = yes; then
-	      # We only use this code for GNU lds that support --whole-archive.
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    else
-	      # Exported symbols can be pulled into shared objects from archives
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	    fi
-	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	    # This is similar to how AIX traditionally builds its shared
-	    # libraries.
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-          fi
-        fi
-        ;;
-
-      beos*)
-	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	  # support --undefined.  This deserves some investigation.  FIXME
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	else
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-
-      chorus*)
-        case $cc_basename in
-          *)
-	  # FIXME: insert proper C++ library support
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	  ;;
-        esac
-        ;;
-
-      cygwin* | mingw* | pw32* | cegcc*)
-        # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-        # as there is no search path for DLLs.
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
-        _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-        _LT_TAGVAR(always_export_symbols, $1)=no
-        _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-
-        if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-          # If the export-symbols file already is a .def file (1st line
-          # is EXPORTS), use it as is; otherwise, prepend...
-          _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    cp $export_symbols $output_objdir/$soname.def;
-          else
-	    echo EXPORTS > $output_objdir/$soname.def;
-	    cat $export_symbols >> $output_objdir/$soname.def;
-          fi~
-          $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-        else
-          _LT_TAGVAR(ld_shlibs, $1)=no
-        fi
-        ;;
-      darwin* | rhapsody*)
-        _LT_DARWIN_LINKER_FEATURES($1)
-	;;
-
-      dgux*)
-        case $cc_basename in
-          ec++*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          ghcx*)
-	    # Green Hills C++ Compiler
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      freebsd[[12]]*)
-        # C++ shared libraries reported to be fairly broken before
-	# switch to ELF
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      freebsd-elf*)
-        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-        ;;
-
-      freebsd* | dragonfly*)
-        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
-        # conventions
-        _LT_TAGVAR(ld_shlibs, $1)=yes
-        ;;
-
-      gnu*)
-        ;;
-
-      haiku*)
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        _LT_TAGVAR(link_all_deplibs, $1)=yes
-        ;;
-
-      hpux9*)
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-        _LT_TAGVAR(hardcode_direct, $1)=yes
-        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-				             # but as the default
-				             # location of the library.
-
-        case $cc_basename in
-          CC*)
-            # FIXME: insert proper C++ library support
-            _LT_TAGVAR(ld_shlibs, $1)=no
-            ;;
-          aCC*)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            # Commands to make compiler produce verbose output that lists
-            # what "hidden" libraries, object files and flags are used when
-            # linking a shared library.
-            #
-            # There doesn't appear to be a way to prevent this compiler from
-            # explicitly linking system object files so we need to strip them
-            # from the output so that they don't get included in the library
-            # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-            ;;
-          *)
-            if test "$GXX" = yes; then
-              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            else
-              # FIXME: insert proper C++ library support
-              _LT_TAGVAR(ld_shlibs, $1)=no
-            fi
-            ;;
-        esac
-        ;;
-
-      hpux10*|hpux11*)
-        if test $with_gnu_ld = no; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-          case $host_cpu in
-            hppa*64*|ia64*)
-              ;;
-            *)
-	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-              ;;
-          esac
-        fi
-        case $host_cpu in
-          hppa*64*|ia64*)
-            _LT_TAGVAR(hardcode_direct, $1)=no
-            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-            ;;
-          *)
-            _LT_TAGVAR(hardcode_direct, $1)=yes
-            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-					         # but as the default
-					         # location of the library.
-            ;;
-        esac
-
-        case $cc_basename in
-          CC*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          aCC*)
-	    case $host_cpu in
-	      hppa*64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      ia64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      *)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	    esac
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test $with_gnu_ld = no; then
-	        case $host_cpu in
-	          hppa*64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          ia64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          *)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	        esac
-	      fi
-	    else
-	      # FIXME: insert proper C++ library support
-	      _LT_TAGVAR(ld_shlibs, $1)=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      interix[[3-9]]*)
-	_LT_TAGVAR(hardcode_direct, $1)=no
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-	# Instead, shared libraries are loaded at an image base (0x10000000 by
-	# default) and relocated if they conflict, which is a slow very memory
-	# consuming and fragmenting process.  To avoid this, we pick a random,
-	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	;;
-      irix5* | irix6*)
-        case $cc_basename in
-          CC*)
-	    # SGI C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test "$with_gnu_ld" = no; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	      else
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
-	      fi
-	    fi
-	    _LT_TAGVAR(link_all_deplibs, $1)=yes
-	    ;;
-        esac
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(inherit_rpath, $1)=yes
-        ;;
-
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
-	    ;;
-	  icpc* | ecpc* )
-	    # Intel C++
-	    with_gnu_ld=yes
-	    # version 8.0 and above of icpc choke on multiply defined symbols
-	    # if we add $predep_objects and $postdep_objects, however 7.1 and
-	    # earlier do not add the objects themselves.
-	    case `$CC -V 2>&1` in
-	      *"Version 7."*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	      *)  # Version 8.0 or newer
-	        tmp_idyn=
-	        case $host_cpu in
-		  ia64*) tmp_idyn=' -i_dynamic';;
-		esac
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	    esac
-	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    ;;
-          pgCC* | pgcpp*)
-            # Portland Group C++ compiler
-	    case `$CC -V` in
-	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
-	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
-	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
-		$RANLIB $oldlib'
-	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    *) # Version 6 and above use weak symbols
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    esac
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-            ;;
-	  cxx*)
-	    # Compaq C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
-
-	    runpath_var=LD_RUN_PATH
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
-	    ;;
-	  xl* | mpixl* | bgxl*)
-	    # IBM XL 8.0 on PPC, with GNU ld
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    if test "x$supports_anon_versioning" = xyes; then
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-		echo "local: *; };" >> $output_objdir/$libname.ver~
-		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-	    fi
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	      _LT_TAGVAR(compiler_needs_object, $1)=yes
-
-	      # Not sure whether something based on
-	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
-	      # would be better.
-	      output_verbose_link_cmd='func_echo_all'
-
-	      # Archives containing C++ object files must be created using
-	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	      # necessary to make sure instantiated templates are included
-	      # in the archive.
-	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-
-      lynxos*)
-        # FIXME: insert proper C++ library support
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      m88k*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      mvs*)
-        case $cc_basename in
-          cxx*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-	  *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-	esac
-	;;
-
-      netbsd*)
-        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
-	  wlarc=
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	fi
-	# Workaround some broken pre-1.5 toolchains
-	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
-	;;
-
-      *nto* | *qnx*)
-        _LT_TAGVAR(ld_shlibs, $1)=yes
-	;;
-
-      openbsd2*)
-        # C++ shared libraries are fairly broken
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      openbsd*)
-	if test -f /usr/libexec/ld.so; then
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-	  fi
-	  output_verbose_link_cmd=func_echo_all
-	else
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-
-      osf3* | osf4* | osf5*)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Archives containing C++ object files must be created using
-	    # the KAI C++ compiler.
-	    case $host in
-	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
-	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
-	    esac
-	    ;;
-          RCC*)
-	    # Rational C++ 2.4.1
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          cxx*)
-	    case $host in
-	      osf3*)
-	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-		;;
-	      *)
-	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	          echo "-hidden">> $lib.exp~
-	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
-	          $RM $lib.exp'
-	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-		;;
-	    esac
-
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-	    ;;
-	  *)
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	      case $host in
-	        osf3*)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	        *)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	      esac
-
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	      # Commands to make compiler produce verbose output that lists
-	      # what "hidden" libraries, object files and flags are used when
-	      # linking a shared library.
-	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
-	    else
-	      # FIXME: insert proper C++ library support
-	      _LT_TAGVAR(ld_shlibs, $1)=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      psos*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      sunos4*)
-        case $cc_basename in
-          CC*)
-	    # Sun C++ 4.x
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          lcc*)
-	    # Lucid
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      solaris*)
-        case $cc_basename in
-          CC* | sunCC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
-	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	    case $host_os in
-	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-	      *)
-		# The compiler driver will combine and reorder linker options,
-		# but understands `-z linker_flag'.
-	        # Supported since Solaris 2.6 (maybe 2.5.1?)
-		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
-	        ;;
-	    esac
-	    _LT_TAGVAR(link_all_deplibs, $1)=yes
-
-	    output_verbose_link_cmd='func_echo_all'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
-	    ;;
-          gcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-
-	    # The C++ compiler must be used to create the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    # GNU C++ compiler with Solaris linker
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
-	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-	      else
-	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
-	        # platform.
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-	      fi
-
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
-	      case $host_os in
-		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-		*)
-		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-		  ;;
-	      esac
-	    fi
-	    ;;
-        esac
-        ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      runpath_var='LD_RUN_PATH'
-
-      case $cc_basename in
-        CC*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-      esac
-      ;;
-
-      sysv5* | sco3.2v5* | sco5v6*)
-	# Note: We can NOT use -z defs as we might desire, because we do not
-	# link with -lc, and that would cause any symbols used from libc to
-	# always be unresolved, which means just about no library would
-	# ever link correctly.  If we're not using GNU ld we use -z text
-	# though, which does catch some bad symbols but isn't as heavy-handed
-	# as -z defs.
-	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-	_LT_TAGVAR(link_all_deplibs, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-	runpath_var='LD_RUN_PATH'
-
-	case $cc_basename in
-          CC*)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
-	      '"$_LT_TAGVAR(old_archive_cmds, $1)"
-	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
-	      '"$_LT_TAGVAR(reload_cmds, $1)"
-	    ;;
-	  *)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    ;;
-	esac
-      ;;
-
-      tandem*)
-        case $cc_basename in
-          NCC*)
-	    # NonStop-UX NCC 3.20
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      vxworks*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      *)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-    esac
-
-    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-    _LT_TAGVAR(GCC, $1)="$GXX"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_SYS_HIDDEN_LIBDEPS($1)
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  CC=$lt_save_CC
-  LDCXX=$LD
-  LD=$lt_save_LD
-  GCC=$lt_save_GCC
-  with_gnu_ld=$lt_save_with_gnu_ld
-  lt_cv_path_LDCXX=$lt_cv_path_LD
-  lt_cv_path_LD=$lt_save_path_LD
-  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
-  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
-
-AC_LANG_POP
-])# _LT_LANG_CXX_CONFIG
-
-
-# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
-# ---------------------------------
-# Figure out "hidden" library dependencies from verbose
-# compiler output when linking a shared library.
-# Parse the compiler output and extract the necessary
-# objects, libraries and library flags.
-m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-# Dependencies to place before and after the object being linked:
-_LT_TAGVAR(predep_objects, $1)=
-_LT_TAGVAR(postdep_objects, $1)=
-_LT_TAGVAR(predeps, $1)=
-_LT_TAGVAR(postdeps, $1)=
-_LT_TAGVAR(compiler_lib_search_path, $1)=
-
-dnl we can't use the lt_simple_compile_test_code here,
-dnl because it contains code intended for an executable,
-dnl not a library.  It's possible we should let each
-dnl tag define a new lt_????_link_test_code variable,
-dnl but it's only used here...
-m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
-int a;
-void foo (void) { a = 0; }
-_LT_EOF
-], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
-class Foo
-{
-public:
-  Foo (void) { a = 0; }
-private:
-  int a;
-};
-_LT_EOF
-], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
-      subroutine foo
-      implicit none
-      integer*4 a
-      a=0
-      return
-      end
-_LT_EOF
-], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
-      subroutine foo
-      implicit none
-      integer a
-      a=0
-      return
-      end
-_LT_EOF
-], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
-public class foo {
-  private int a;
-  public void bar (void) {
-    a = 0;
-  }
-};
-_LT_EOF
-])
-dnl Parse the compiler output and extract the necessary
-dnl objects, libraries and library flags.
-if AC_TRY_EVAL(ac_compile); then
-  # Parse the compiler output and extract the necessary
-  # objects, libraries and library flags.
-
-  # Sentinel used to keep track of whether or not we are before
-  # the conftest object file.
-  pre_test_object_deps_done=no
-
-  for p in `eval "$output_verbose_link_cmd"`; do
-    case $p in
-
-    -L* | -R* | -l*)
-       # Some compilers place space between "-{L,R}" and the path.
-       # Remove the space.
-       if test $p = "-L" ||
-          test $p = "-R"; then
-	 prev=$p
-	 continue
-       else
-	 prev=
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 case $p in
-	 -L* | -R*)
-	   # Internal compiler library paths should come after those
-	   # provided the user.  The postdeps already come after the
-	   # user supplied libs so there is no need to process them.
-	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
-	   else
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
-	   fi
-	   ;;
-	 # The "-l" case would never come before the object being
-	 # linked, so don't bother handling this case.
-	 esac
-       else
-	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
-	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
-	 else
-	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
-	 fi
-       fi
-       ;;
-
-    *.$objext)
-       # This assumes that the test object file only shows up
-       # once in the compiler output.
-       if test "$p" = "conftest.$objext"; then
-	 pre_test_object_deps_done=yes
-	 continue
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
-	   _LT_TAGVAR(predep_objects, $1)="$p"
-	 else
-	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
-	 fi
-       else
-	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
-	   _LT_TAGVAR(postdep_objects, $1)="$p"
-	 else
-	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
-	 fi
-       fi
-       ;;
-
-    *) ;; # Ignore the rest.
-
-    esac
-  done
-
-  # Clean up.
-  rm -f a.out a.exe
-else
-  echo "libtool.m4: error: problem compiling $1 test program"
-fi
-
-$RM -f confest.$objext
-
-# PORTME: override above test on systems where it is broken
-m4_if([$1], [CXX],
-[case $host_os in
-interix[[3-9]]*)
-  # Interix 3.5 installs completely hosed .la files for C++, so rather than
-  # hack all around it, let's just trust "g++" to DTRT.
-  _LT_TAGVAR(predep_objects,$1)=
-  _LT_TAGVAR(postdep_objects,$1)=
-  _LT_TAGVAR(postdeps,$1)=
-  ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC* | sunCC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-esac
-])
-
-case " $_LT_TAGVAR(postdeps, $1) " in
-*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
-esac
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=
-if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
-fi
-_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
-    [The directories searched by this compiler when creating a shared library])
-_LT_TAGDECL([], [predep_objects], [1],
-    [Dependencies to place before and after the objects being linked to
-    create a shared library])
-_LT_TAGDECL([], [postdep_objects], [1])
-_LT_TAGDECL([], [predeps], [1])
-_LT_TAGDECL([], [postdeps], [1])
-_LT_TAGDECL([], [compiler_lib_search_path], [1],
-    [The library search path used internally by the compiler when linking
-    a shared library])
-])# _LT_SYS_HIDDEN_LIBDEPS
-
-
-# _LT_LANG_F77_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for a Fortran 77 compiler are
-# suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_F77_CONFIG],
-[AC_LANG_PUSH(Fortran 77)
-if test -z "$F77" || test "X$F77" = "Xno"; then
-  _lt_disable_F77=yes
-fi
-
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for f77 test sources.
-ac_ext=f
-
-# Object file extension for compiled f77 test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the F77 compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_F77" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="\
-      subroutine t
-      return
-      end
-"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code="\
-      program t
-      end
-"
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
-  lt_save_GCC=$GCC
-  CC=${F77-"f77"}
-  compiler=$CC
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-  GCC=$G77
-  if test -n "$compiler"; then
-    AC_MSG_CHECKING([if libtool supports shared libraries])
-    AC_MSG_RESULT([$can_build_shared])
-
-    AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
-
-    # On AIX, shared libraries and static libraries use the same namespace, and
-    # are all built from PIC.
-    case $host_os in
-      aix3*)
-        test "$enable_shared" = yes && enable_static=no
-        if test -n "$RANLIB"; then
-          archive_cmds="$archive_cmds~\$RANLIB \$lib"
-          postinstall_cmds='$RANLIB $lib'
-        fi
-        ;;
-      aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
-	fi
-        ;;
-    esac
-    AC_MSG_RESULT([$enable_shared])
-
-    AC_MSG_CHECKING([whether to build static libraries])
-    # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
-    AC_MSG_RESULT([$enable_static])
-
-    _LT_TAGVAR(GCC, $1)="$G77"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  GCC=$lt_save_GCC
-  CC="$lt_save_CC"
-fi # test "$_lt_disable_F77" != yes
-
-AC_LANG_POP
-])# _LT_LANG_F77_CONFIG
-
-
-# _LT_LANG_FC_CONFIG([TAG])
-# -------------------------
-# Ensure that the configuration variables for a Fortran compiler are
-# suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_FC_CONFIG],
-[AC_LANG_PUSH(Fortran)
-
-if test -z "$FC" || test "X$FC" = "Xno"; then
-  _lt_disable_FC=yes
-fi
-
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for fc test sources.
-ac_ext=${ac_fc_srcext-f}
-
-# Object file extension for compiled fc test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the FC compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_FC" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="\
-      subroutine t
-      return
-      end
-"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code="\
-      program t
-      end
-"
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
-  lt_save_GCC=$GCC
-  CC=${FC-"f95"}
-  compiler=$CC
-  GCC=$ac_cv_fc_compiler_gnu
-
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-
-  if test -n "$compiler"; then
-    AC_MSG_CHECKING([if libtool supports shared libraries])
-    AC_MSG_RESULT([$can_build_shared])
-
-    AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
-
-    # On AIX, shared libraries and static libraries use the same namespace, and
-    # are all built from PIC.
-    case $host_os in
-      aix3*)
-        test "$enable_shared" = yes && enable_static=no
-        if test -n "$RANLIB"; then
-          archive_cmds="$archive_cmds~\$RANLIB \$lib"
-          postinstall_cmds='$RANLIB $lib'
-        fi
-        ;;
-      aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
-	fi
-        ;;
-    esac
-    AC_MSG_RESULT([$enable_shared])
-
-    AC_MSG_CHECKING([whether to build static libraries])
-    # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
-    AC_MSG_RESULT([$enable_static])
-
-    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_SYS_HIDDEN_LIBDEPS($1)
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  GCC=$lt_save_GCC
-  CC="$lt_save_CC"
-fi # test "$_lt_disable_FC" != yes
-
-AC_LANG_POP
-])# _LT_LANG_FC_CONFIG
-
-
-# _LT_LANG_GCJ_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for the GNU Java Compiler compiler
-# are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_GCJ_CONFIG],
-[AC_REQUIRE([LT_PROG_GCJ])dnl
-AC_LANG_SAVE
-
-# Source file extension for Java test sources.
-ac_ext=java
-
-# Object file extension for compiled Java test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="class foo {}"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-lt_save_GCC=$GCC
-GCC=yes
-CC=${GCJ-"gcj"}
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
-_LT_CC_BASENAME([$compiler])
-
-# GCJ did not exist at the time GCC didn't implicitly link libc in.
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-  _LT_COMPILER_NO_RTTI($1)
-  _LT_COMPILER_PIC($1)
-  _LT_COMPILER_C_O($1)
-  _LT_COMPILER_FILE_LOCKS($1)
-  _LT_LINKER_SHLIBS($1)
-  _LT_LINKER_HARDCODE_LIBPATH($1)
-
-  _LT_CONFIG($1)
-fi
-
-AC_LANG_RESTORE
-
-GCC=$lt_save_GCC
-CC="$lt_save_CC"
-])# _LT_LANG_GCJ_CONFIG
-
-
-# _LT_LANG_RC_CONFIG([TAG])
-# -------------------------
-# Ensure that the configuration variables for the Windows resource compiler
-# are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_RC_CONFIG],
-[AC_REQUIRE([LT_PROG_RC])dnl
-AC_LANG_SAVE
-
-# Source file extension for RC test sources.
-ac_ext=rc
-
-# Object file extension for compiled RC test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
-
-# Code to be used in simple link tests
-lt_simple_link_test_code="$lt_simple_compile_test_code"
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-lt_save_GCC=$GCC
-GCC=
-CC=${RC-"windres"}
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-
-if test -n "$compiler"; then
-  :
-  _LT_CONFIG($1)
-fi
-
-GCC=$lt_save_GCC
-AC_LANG_RESTORE
-CC="$lt_save_CC"
-])# _LT_LANG_RC_CONFIG
-
-
-# LT_PROG_GCJ
-# -----------
-AC_DEFUN([LT_PROG_GCJ],
-[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
-  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
-    [AC_CHECK_TOOL(GCJ, gcj,)
-      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
-      AC_SUBST(GCJFLAGS)])])[]dnl
-])
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
-
-
-# LT_PROG_RC
-# ----------
-AC_DEFUN([LT_PROG_RC],
-[AC_CHECK_TOOL(RC, windres,)
-])
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_RC], [])
-
-
-# _LT_DECL_EGREP
-# --------------
-# If we don't have a new enough Autoconf to choose the best grep
-# available, choose the one first in the user's PATH.
-m4_defun([_LT_DECL_EGREP],
-[AC_REQUIRE([AC_PROG_EGREP])dnl
-AC_REQUIRE([AC_PROG_FGREP])dnl
-test -z "$GREP" && GREP=grep
-_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
-_LT_DECL([], [EGREP], [1], [An ERE matcher])
-_LT_DECL([], [FGREP], [1], [A literal string matcher])
-dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
-AC_SUBST([GREP])
-])
-
-
-# _LT_DECL_OBJDUMP
-# --------------
-# If we don't have a new enough Autoconf to choose the best objdump
-# available, choose the one first in the user's PATH.
-m4_defun([_LT_DECL_OBJDUMP],
-[AC_CHECK_TOOL(OBJDUMP, objdump, false)
-test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
-AC_SUBST([OBJDUMP])
-])
-
-
-# _LT_DECL_SED
-# ------------
-# Check for a fully-functional sed program, that truncates
-# as few characters as possible.  Prefer GNU sed if found.
-m4_defun([_LT_DECL_SED],
-[AC_PROG_SED
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
-_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
-    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
-])# _LT_DECL_SED
-
-m4_ifndef([AC_PROG_SED], [
-############################################################
-# NOTE: This macro has been submitted for inclusion into   #
-#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
-#  a released version of Autoconf we should remove this    #
-#  macro and use it instead.                               #
-############################################################
-
-m4_defun([AC_PROG_SED],
-[AC_MSG_CHECKING([for a sed that does not truncate output])
-AC_CACHE_VAL(lt_cv_path_SED,
-[# Loop through the user's path and test for sed and gsed.
-# Then use that list of sed's as ones to test for truncation.
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for lt_ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
-        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
-      fi
-    done
-  done
-done
-IFS=$as_save_IFS
-lt_ac_max=0
-lt_ac_count=0
-# Add /usr/xpg4/bin/sed as it is typically found on Solaris
-# along with /bin/sed that truncates output.
-for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
-  test ! -f $lt_ac_sed && continue
-  cat /dev/null > conftest.in
-  lt_ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
-  # Check for GNU sed and select it if it is found.
-  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
-    lt_cv_path_SED=$lt_ac_sed
-    break
-  fi
-  while true; do
-    cat conftest.in conftest.in >conftest.tmp
-    mv conftest.tmp conftest.in
-    cp conftest.in conftest.nl
-    echo >>conftest.nl
-    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
-    cmp -s conftest.out conftest.nl || break
-    # 10000 chars as input seems more than enough
-    test $lt_ac_count -gt 10 && break
-    lt_ac_count=`expr $lt_ac_count + 1`
-    if test $lt_ac_count -gt $lt_ac_max; then
-      lt_ac_max=$lt_ac_count
-      lt_cv_path_SED=$lt_ac_sed
-    fi
-  done
-done
-])
-SED=$lt_cv_path_SED
-AC_SUBST([SED])
-AC_MSG_RESULT([$SED])
-])#AC_PROG_SED
-])#m4_ifndef
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_SED], [])
-
-
-# _LT_CHECK_SHELL_FEATURES
-# ------------------------
-# Find out whether the shell is Bourne or XSI compatible,
-# or has some other useful features.
-m4_defun([_LT_CHECK_SHELL_FEATURES],
-[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-AC_MSG_RESULT([$xsi_shell])
-_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
-
-AC_MSG_CHECKING([whether the shell understands "+="])
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-AC_MSG_RESULT([$lt_shell_append])
-_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  lt_unset=unset
-else
-  lt_unset=false
-fi
-_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  lt_SP2NL='tr \040 \012'
-  lt_NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  lt_SP2NL='tr \100 \n'
-  lt_NL2SP='tr \r\n \100\100'
-  ;;
-esac
-_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
-_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
-])# _LT_CHECK_SHELL_FEATURES
-
-
-# _LT_PROG_XSI_SHELLFNS
-# ---------------------
-# Bourne and XSI compatible variants of some useful shell functions.
-m4_defun([_LT_PROG_XSI_SHELLFNS],
-[case $xsi_shell in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result="${1##*/}"
-}
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-  func_basename_result="${1##*/}"
-}
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-func_stripname ()
-{
-  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-  # positional parameters, so assign one to ordinary parameter first.
-  func_stripname_result=${3}
-  func_stripname_result=${func_stripname_result#"${1}"}
-  func_stripname_result=${func_stripname_result%"${2}"}
-}
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=${1%%=*}
-  func_opt_split_arg=${1#*=}
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  case ${1} in
-    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-    *)    func_lo2o_result=${1} ;;
-  esac
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=${1%.*}.lo
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=$(( $[*] ))
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=${#1}
-}
-
-_LT_EOF
-    ;;
-  *) # Bourne compatible functions.
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result=`$ECHO "${1}" | $SED "$basename"`
-}
-
-dnl func_dirname_and_basename
-dnl A portable version of this function is already defined in general.m4sh
-dnl so there is no need for it here.
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-  case ${2} in
-    .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-    *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
-  esac
-}
-
-# sed scripts:
-my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q'
-my_sed_long_arg='1s/^-[[^=]]*=//'
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=`$ECHO "${1}" | $SED "$my_sed_long_opt"`
-  func_opt_split_arg=`$ECHO "${1}" | $SED "$my_sed_long_arg"`
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=`$ECHO "${1}" | $SED 's/\.[[^.]]*$/.lo/'`
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=`expr "$[@]"`
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len`
-}
-
-_LT_EOF
-esac
-
-case $lt_shell_append in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$[1]+=\$[2]"
-}
-_LT_EOF
-    ;;
-  *)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$[1]=\$$[1]\$[2]"
-}
-
-_LT_EOF
-    ;;
-  esac
-])
diff --git a/cloog-0.16.3/m4/ltoptions.m4 b/cloog-0.16.3/m4/ltoptions.m4
deleted file mode 100644
index 17cfd51..0000000
--- a/cloog-0.16.3/m4/ltoptions.m4
+++ /dev/null
@@ -1,369 +0,0 @@
-# Helper functions for option handling.                    -*- Autoconf -*-
-#
-#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
-#   Inc.
-#   Written by Gary V. Vaughan, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 7 ltoptions.m4
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
-
-
-# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
-# ------------------------------------------
-m4_define([_LT_MANGLE_OPTION],
-[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
-
-
-# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
-# ---------------------------------------
-# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
-# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
-# saved as a flag.
-m4_define([_LT_SET_OPTION],
-[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
-m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
-        _LT_MANGLE_DEFUN([$1], [$2]),
-    [m4_warning([Unknown $1 option `$2'])])[]dnl
-])
-
-
-# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
-# ------------------------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-m4_define([_LT_IF_OPTION],
-[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
-
-
-# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
-# -------------------------------------------------------
-# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
-# are set.
-m4_define([_LT_UNLESS_OPTIONS],
-[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
-	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
-		      [m4_define([$0_found])])])[]dnl
-m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
-])[]dnl
-])
-
-
-# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
-# ----------------------------------------
-# OPTION-LIST is a space-separated list of Libtool options associated
-# with MACRO-NAME.  If any OPTION has a matching handler declared with
-# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
-# the unknown option and exit.
-m4_defun([_LT_SET_OPTIONS],
-[# Set options
-m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
-    [_LT_SET_OPTION([$1], _LT_Option)])
-
-m4_if([$1],[LT_INIT],[
-  dnl
-  dnl Simply set some default values (i.e off) if boolean options were not
-  dnl specified:
-  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
-  ])
-  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
-  ])
-  dnl
-  dnl If no reference was made to various pairs of opposing options, then
-  dnl we run the default mode handler for the pair.  For example, if neither
-  dnl `shared' nor `disable-shared' was passed, we enable building of shared
-  dnl archives by default:
-  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
-  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
-  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
-  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
-  		   [_LT_ENABLE_FAST_INSTALL])
-  ])
-])# _LT_SET_OPTIONS
-
-
-## --------------------------------- ##
-## Macros to handle LT_INIT options. ##
-## --------------------------------- ##
-
-# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
-# -----------------------------------------
-m4_define([_LT_MANGLE_DEFUN],
-[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
-
-
-# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
-# -----------------------------------------------
-m4_define([LT_OPTION_DEFINE],
-[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
-])# LT_OPTION_DEFINE
-
-
-# dlopen
-# ------
-LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
-])
-
-AU_DEFUN([AC_LIBTOOL_DLOPEN],
-[_LT_SET_OPTION([LT_INIT], [dlopen])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `dlopen' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
-
-
-# win32-dll
-# ---------
-# Declare package support for building win32 dll's.
-LT_OPTION_DEFINE([LT_INIT], [win32-dll],
-[enable_win32_dll=yes
-
-case $host in
-*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
-  AC_CHECK_TOOL(AS, as, false)
-  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
-  AC_CHECK_TOOL(OBJDUMP, objdump, false)
-  ;;
-esac
-
-test -z "$AS" && AS=as
-_LT_DECL([], [AS],      [1], [Assembler program])dnl
-
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
-])# win32-dll
-
-AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-_LT_SET_OPTION([LT_INIT], [win32-dll])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `win32-dll' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
-
-
-# _LT_ENABLE_SHARED([DEFAULT])
-# ----------------------------
-# implement the --enable-shared flag, and supports the `shared' and
-# `disable-shared' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_SHARED],
-[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([shared],
-    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
-	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
-
-    _LT_DECL([build_libtool_libs], [enable_shared], [0],
-	[Whether or not to build shared libraries])
-])# _LT_ENABLE_SHARED
-
-LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
-
-# Old names:
-AC_DEFUN([AC_ENABLE_SHARED],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
-])
-
-AC_DEFUN([AC_DISABLE_SHARED],
-[_LT_SET_OPTION([LT_INIT], [disable-shared])
-])
-
-AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
-AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_ENABLE_SHARED], [])
-dnl AC_DEFUN([AM_DISABLE_SHARED], [])
-
-
-
-# _LT_ENABLE_STATIC([DEFAULT])
-# ----------------------------
-# implement the --enable-static flag, and support the `static' and
-# `disable-static' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_STATIC],
-[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([static],
-    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
-	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
-
-    _LT_DECL([build_old_libs], [enable_static], [0],
-	[Whether or not to build static libraries])
-])# _LT_ENABLE_STATIC
-
-LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
-
-# Old names:
-AC_DEFUN([AC_ENABLE_STATIC],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
-])
-
-AC_DEFUN([AC_DISABLE_STATIC],
-[_LT_SET_OPTION([LT_INIT], [disable-static])
-])
-
-AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
-AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_ENABLE_STATIC], [])
-dnl AC_DEFUN([AM_DISABLE_STATIC], [])
-
-
-
-# _LT_ENABLE_FAST_INSTALL([DEFAULT])
-# ----------------------------------
-# implement the --enable-fast-install flag, and support the `fast-install'
-# and `disable-fast-install' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_FAST_INSTALL],
-[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([fast-install],
-    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
-    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
-
-_LT_DECL([fast_install], [enable_fast_install], [0],
-	 [Whether or not to optimize for fast installation])dnl
-])# _LT_ENABLE_FAST_INSTALL
-
-LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
-
-# Old names:
-AU_DEFUN([AC_ENABLE_FAST_INSTALL],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `fast-install' option into LT_INIT's first parameter.])
-])
-
-AU_DEFUN([AC_DISABLE_FAST_INSTALL],
-[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `disable-fast-install' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
-dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
-
-
-# _LT_WITH_PIC([MODE])
-# --------------------
-# implement the --with-pic flag, and support the `pic-only' and `no-pic'
-# LT_INIT options.
-# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
-m4_define([_LT_WITH_PIC],
-[AC_ARG_WITH([pic],
-    [AS_HELP_STRING([--with-pic],
-	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
-    [pic_mode="$withval"],
-    [pic_mode=default])
-
-test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
-
-_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
-])# _LT_WITH_PIC
-
-LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
-LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
-
-# Old name:
-AU_DEFUN([AC_LIBTOOL_PICMODE],
-[_LT_SET_OPTION([LT_INIT], [pic-only])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `pic-only' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
-
-## ----------------- ##
-## LTDL_INIT Options ##
-## ----------------- ##
-
-m4_define([_LTDL_MODE], [])
-LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
-		 [m4_define([_LTDL_MODE], [nonrecursive])])
-LT_OPTION_DEFINE([LTDL_INIT], [recursive],
-		 [m4_define([_LTDL_MODE], [recursive])])
-LT_OPTION_DEFINE([LTDL_INIT], [subproject],
-		 [m4_define([_LTDL_MODE], [subproject])])
-
-m4_define([_LTDL_TYPE], [])
-LT_OPTION_DEFINE([LTDL_INIT], [installable],
-		 [m4_define([_LTDL_TYPE], [installable])])
-LT_OPTION_DEFINE([LTDL_INIT], [convenience],
-		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/cloog-0.16.3/m4/ltsugar.m4 b/cloog-0.16.3/m4/ltsugar.m4
deleted file mode 100644
index 9000a05..0000000
--- a/cloog-0.16.3/m4/ltsugar.m4
+++ /dev/null
@@ -1,123 +0,0 @@
-# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
-#
-# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
-# Written by Gary V. Vaughan, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 6 ltsugar.m4
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
-
-
-# lt_join(SEP, ARG1, [ARG2...])
-# -----------------------------
-# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
-# associated separator.
-# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
-# versions in m4sugar had bugs.
-m4_define([lt_join],
-[m4_if([$#], [1], [],
-       [$#], [2], [[$2]],
-       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
-m4_define([_lt_join],
-[m4_if([$#$2], [2], [],
-       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
-
-
-# lt_car(LIST)
-# lt_cdr(LIST)
-# ------------
-# Manipulate m4 lists.
-# These macros are necessary as long as will still need to support
-# Autoconf-2.59 which quotes differently.
-m4_define([lt_car], [[$1]])
-m4_define([lt_cdr],
-[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
-       [$#], 1, [],
-       [m4_dquote(m4_shift($@))])])
-m4_define([lt_unquote], $1)
-
-
-# lt_append(MACRO-NAME, STRING, [SEPARATOR])
-# ------------------------------------------
-# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
-# Note that neither SEPARATOR nor STRING are expanded; they are appended
-# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
-# No SEPARATOR is output if MACRO-NAME was previously undefined (different
-# than defined and empty).
-#
-# This macro is needed until we can rely on Autoconf 2.62, since earlier
-# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
-m4_define([lt_append],
-[m4_define([$1],
-	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
-
-
-
-# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
-# ----------------------------------------------------------
-# Produce a SEP delimited list of all paired combinations of elements of
-# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
-# has the form PREFIXmINFIXSUFFIXn.
-# Needed until we can rely on m4_combine added in Autoconf 2.62.
-m4_define([lt_combine],
-[m4_if(m4_eval([$# > 3]), [1],
-       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
-[[m4_foreach([_Lt_prefix], [$2],
-	     [m4_foreach([_Lt_suffix],
-		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
-	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
-
-
-# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
-# -----------------------------------------------------------------------
-# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
-# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
-m4_define([lt_if_append_uniq],
-[m4_ifdef([$1],
-	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
-		 [lt_append([$1], [$2], [$3])$4],
-		 [$5])],
-	  [lt_append([$1], [$2], [$3])$4])])
-
-
-# lt_dict_add(DICT, KEY, VALUE)
-# -----------------------------
-m4_define([lt_dict_add],
-[m4_define([$1($2)], [$3])])
-
-
-# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
-# --------------------------------------------
-m4_define([lt_dict_add_subkey],
-[m4_define([$1($2:$3)], [$4])])
-
-
-# lt_dict_fetch(DICT, KEY, [SUBKEY])
-# ----------------------------------
-m4_define([lt_dict_fetch],
-[m4_ifval([$3],
-	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
-    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
-
-
-# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
-# -----------------------------------------------------------------
-m4_define([lt_if_dict_fetch],
-[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
-	[$5],
-    [$6])])
-
-
-# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
-# --------------------------------------------------------------
-m4_define([lt_dict_filter],
-[m4_if([$5], [], [],
-  [lt_join(m4_quote(m4_default([$4], [[, ]])),
-           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
-		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
-])
diff --git a/cloog-0.16.3/m4/ltversion.m4 b/cloog-0.16.3/m4/ltversion.m4
deleted file mode 100644
index 2e8f929..0000000
--- a/cloog-0.16.3/m4/ltversion.m4
+++ /dev/null
@@ -1,23 +0,0 @@
-# ltversion.m4 -- version numbers			-*- Autoconf -*-
-#
-#   Copyright (C) 2004 Free Software Foundation, Inc.
-#   Written by Scott James Remnant, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# Generated from ltversion.in.
-
-# serial 3169 ltversion.m4
-# This file is part of GNU Libtool
-
-m4_define([LT_PACKAGE_VERSION], [2.2.8])
-m4_define([LT_PACKAGE_REVISION], [1.3169])
-
-AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.2.8'
-macro_revision='1.3169'
-_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
-_LT_DECL(, macro_revision, 0)
-])
diff --git a/cloog-0.16.3/m4/lt~obsolete.m4 b/cloog-0.16.3/m4/lt~obsolete.m4
deleted file mode 100644
index c573da9..0000000
--- a/cloog-0.16.3/m4/lt~obsolete.m4
+++ /dev/null
@@ -1,98 +0,0 @@
-# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
-#
-#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
-#   Written by Scott James Remnant, 2004.
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 5 lt~obsolete.m4
-
-# These exist entirely to fool aclocal when bootstrapping libtool.
-#
-# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
-# which have later been changed to m4_define as they aren't part of the
-# exported API, or moved to Autoconf or Automake where they belong.
-#
-# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
-# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
-# using a macro with the same name in our local m4/libtool.m4 it'll
-# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
-# and doesn't know about Autoconf macros at all.)
-#
-# So we provide this file, which has a silly filename so it's always
-# included after everything else.  This provides aclocal with the
-# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
-# because those macros already exist, or will be overwritten later.
-# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
-#
-# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
-# Yes, that means every name once taken will need to remain here until
-# we give up compatibility with versions before 1.7, at which point
-# we need to keep only those names which we still refer to.
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
-
-m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
-m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
-m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
-m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
-m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
-m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
-m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
-m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
-m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
-m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
-m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
-m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
-m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
-m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
-m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
-m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
-m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
-m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
-m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
-m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
-m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
-m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
-m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
-m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
-m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
-m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
-m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
-m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
-m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
-m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
-m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
-m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
-m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
-m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
-m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
-m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
-m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
-m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
-m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
-m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
-m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
-m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
-m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
-m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
-m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
-m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
-m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
-m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
-m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],	[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
-m4_ifndef([_LT_AC_PROG_CXXCPP],		[AC_DEFUN([_LT_AC_PROG_CXXCPP])])
-m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],	[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
-m4_ifndef([_LT_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
-m4_ifndef([_LT_PROG_F77],		[AC_DEFUN([_LT_PROG_F77])])
-m4_ifndef([_LT_PROG_FC],		[AC_DEFUN([_LT_PROG_FC])])
-m4_ifndef([_LT_PROG_CXX],		[AC_DEFUN([_LT_PROG_CXX])])
diff --git a/cloog-0.16.3/source/block.c b/cloog-0.16.3/source/block.c
deleted file mode 100644
index 08fe807..0000000
--- a/cloog-0.16.3/source/block.c
+++ /dev/null
@@ -1,404 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                             block.c                               **
-    **-------------------------------------------------------------------**
-    **                   First version: june 11th 2005                   **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-/* CAUTION: the english used for comments is probably the worst you ever read,
- *          please feel free to correct and improve it !
- */
-
-# include <stdlib.h>
-# include <stdio.h>
-# include "../include/cloog/cloog.h"
-
-
-/******************************************************************************
- *                             Memory leaks hunting                           *
- ******************************************************************************/
-
-
-/**
- * These functions and global variables are devoted to memory leaks hunting: we
- * want to know at each moment how many CloogBlock structures had been allocated
- * (cloog_block_allocated) and how many had been freed (cloog_block_freed).
- * Each time a CloogBlock structure is allocated, a call to the function
- * cloog_block_leak_up() must be carried out, and respectively
- * cloog_block_leak_down() when a CloogBlock structure is freed. The special
- * variable cloog_block_max gives the maximal number of CloogBlock structures
- * simultaneously alive (i.e. allocated and non-freed) in memory.
- * - June 11th 2005: first version.
- */
-
-
-static void cloog_block_leak_up(CloogState *state)
-{ 
-  state->block_allocated++;
-  if ((state->block_allocated - state->block_freed) > state->block_max)
-    state->block_max = state->block_allocated - state->block_freed;
-}
-
-
-static void cloog_block_leak_down(CloogState *state)
-{
-  state->block_freed++;
-}
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-
-
-/**
- * cloog_domain_print_structure :
- * this function is a human-friendly way to display the CloogDomain data
- * structure, it includes an indentation level (level) in order to work with
- * others print_structure functions.
- * - June  16th 2005: first version.
- */
-void cloog_block_print_structure(FILE * file, CloogBlock * block, int level)
-{ int i ;
-  
-  /* Go to the right level. */
-  for (i=0; i<level; i++)
-  fprintf(file,"|\t") ;
-    
-  if (block != NULL)
-  { fprintf(file,"+-- CloogBlock\n") ;
-   
-    /* A blank line. */
-    for (i=0; i<level+2; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"\n") ;    
-
-    /* Print statement list. */
-    cloog_statement_print_structure(file,block->statement,level+1) ;
-    
-    /* A blank line. */
-    for (i=0; i<level+2; i++)
-    fprintf(file,"|\t") ;    
-    fprintf(file,"\n") ;    
-
-    /* Print scattering function. */
-    for(i=0; i<level+1; i++)
-    fprintf(file,"|\t") ;
-  
-    fprintf(file,"+-- Null scattering function\n") ;
-
-    /* A blank line. */
-    for (i=0; i<level+2; i++)
-    fprintf(file,"|\t") ;    
-    fprintf(file,"\n") ;    
-
-    /* Print scalar dimensions. */
-    for (i=0; i<level+1; i++)
-    fprintf(file,"|\t") ;
-    
-    if (block->nb_scaldims == 0)
-    fprintf(file,"No scalar dimensions\n") ;
-    else
-    { fprintf(file,"Scalar dimensions (%d):",block->nb_scaldims) ;
-      for (i = 0; i < block->nb_scaldims; i++) {
-	fprintf(file, " ");
-	cloog_int_print(file, block->scaldims[i]);
-      }
-      fprintf(file,"\n") ;
-    }
-    
-    /* A blank line. */
-    for (i=0; i<level+2; i++)
-    fprintf(file,"|\t") ;    
-    fprintf(file,"\n") ;    
-
-    /* Print depth. */
-    for (i=0; i<level+1; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"Depth: %d\n",block->depth) ;
-    
-    /* A blank line. */
-    for (i=0; i<level+1; i++)
-    fprintf(file,"|\t") ;   
-    fprintf(file,"\n") ;    
-  }
-  else
-  fprintf(file,"+-- Null CloogBlock\n") ;
-}
-
-
-/**
- * cloog_block_print function:
- * This function prints the content of a CloogBlock structure (block) into a
- * file (file, possibly stdout).
- * - June 11th 2005: first version.
- * - June  16th 2005: now just a call to cloog_block_print_structure.
- */
-void cloog_block_print(FILE * file, CloogBlock * block)
-{ cloog_block_print_structure(file,block,0) ;  
-}
-
-
-/**
- * cloog_block_list_print function:
- * This function prints the content of a CloogBlock structure (block) into a
- * file (file, possibly stdout).
- * - June 16th 2005: first version.
- */
-void cloog_block_list_print(FILE * file, CloogBlockList * blocklist)
-{ int i=0 ;
-  
-  while (blocklist != NULL)
-  { fprintf(file,"+-- CloogBlockList node %d\n",i) ;
-    cloog_block_print_structure(file,blocklist->block,1) ;
-    blocklist = blocklist->next ;
-    i++ ;
-  }
-}
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-
-
-/**
- * cloog_block_free function:
- * This function frees the allocated memory for a CloogStatement structure.
- * - June 11th 2005: first version.
- * - June 30th 2005: scaldims field management.
- */
-void cloog_block_free(CloogBlock * block)
-{ int i ;
-
-  if (block != NULL)
-  { block->references -- ;
-    
-    if (block->references == 0) {
-      cloog_block_leak_down(block->state);
-      if (block->scaldims != NULL)
-      { for (i=0;i<block->nb_scaldims;i++)
-	  cloog_int_clear(block->scaldims[i]);
-      
-        free(block->scaldims) ;
-      }
-      if (block->statement)
-	cloog_statement_free(block->statement);
-      free(block) ;
-    }
-  }
-}
-
-
-/**
- * cloog_block_list_free function:
- * This function frees the allocated memory for a CloogBlockList structure.
- * - June 11th 2005: first version.
- */
-void cloog_block_list_free(CloogBlockList * blocklist)
-{ CloogBlockList * temp ;
-  
-  while (blocklist != NULL)
-  { temp = blocklist->next ;
-    cloog_block_free(blocklist->block) ;
-    free(blocklist) ;
-    blocklist = temp ;
-  }
-}
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-
-/**
- * cloog_block_malloc function:
- * This function allocates the memory space for a CloogBlock structure and
- * sets its fields with default values. Then it returns a pointer to the
- * allocated space.
- * - November 21th 2005: first version.
- */
-CloogBlock *cloog_block_malloc(CloogState *state)
-{ CloogBlock * block ;
-  
-  /* Memory allocation for the CloogBlock structure. */
-  block = (CloogBlock *)malloc(sizeof(CloogBlock)) ;
-  if (block == NULL) 
-    cloog_die("memory overflow.\n");
-  cloog_block_leak_up(state);
-  
-  /* We set the various fields with default values. */
-  block->state = state;
-  block->statement = NULL ;
-  block->nb_scaldims = 0 ;
-  block->scaldims = NULL ;
-  block->depth = 0 ;
-  block->references = 1 ;
-  block->usr = NULL;
-  
-  return block ;
-}  
-
-
-/**
- * cloog_block_alloc function:
- * This function allocates the memory space for a CloogBlock structure and
- * sets its fields with those given as input. Then it returns a pointer to the
- * allocated space. The two parameters nb_scaldims and scaldims are for internal
- * service, put to respectively 0 and NULL if you don't know what they are
- * useful for !
- * - statement is the statement list of the block,
- * - scattering is the scattering function for the block (NULL if unsure !),
- * - nb_scaldims is the number of scalar dimensions (0 if unsure !),
- * - scaldims is the array with the scalar dimensions values (NULL if unsure !),
- * - depth is the original block depth (the number of outer loops).
- **
- * - June     11th 2005: first version.
- * - June     30th 2005: addition of the nb_scaldims and scaldims parameters.
- * - November 21th 2005: use of cloog_block_malloc.
- */
-CloogBlock *cloog_block_alloc(CloogStatement *statement, int nb_scaldims,
-				cloog_int_t *scaldims, int depth)
-{ CloogBlock * block ;
-    
-  /* Block allocation. */
-  block = cloog_block_malloc(statement->state);
-
-  block->statement = statement ;
-  block->nb_scaldims = nb_scaldims ;
-  block->scaldims = scaldims ;
-  block->depth = depth ;
-  block->references = 1 ;
-  
-  return block ;
-}
-
-
-/**
- * cloog_block_list_malloc function:
- * This function allocates the memory space for a CloogBlockList structure and
- * sets its fields with default values. Then it returns a pointer to the
- * allocated space.
- * - November 21th 2005: first version.
- */
-CloogBlockList * cloog_block_list_malloc()
-{ CloogBlockList * blocklist ;
-  
-  /* Memory allocation for the CloogBlock structure. */
-  blocklist = (CloogBlockList *)malloc(sizeof(CloogBlockList)) ;
-  if (blocklist == NULL) 
-    cloog_die("memory overflow.\n");
-  
-  /* We set the various fields with default values. */
-  blocklist->block = NULL ;
-  blocklist->next  = NULL ;
-  
-  return blocklist ;
-}  
-
-
-/**
- * cloog_block_list_alloc function:
- * This function allocates the memory space for a CloogBlockList structure and
- * sets its fields with those given as input. Then it returns a pointer to the
- * allocated space.
- * - block is the block element of the list node,
- **
- * - June     11th 2005: first version.
- * - November 21th 2005: use of cloog_block_list_malloc.
- */
-CloogBlockList * cloog_block_list_alloc(CloogBlock * block)
-{ CloogBlockList * blocklist ;
-  
-  /* Block list node allocation. */
-  blocklist = cloog_block_list_malloc() ;
-
-  blocklist->block = block ;
-  blocklist->block->references ++ ; /* The block has a new reference to it. */
-  blocklist->next = NULL ;
-  
-  return blocklist ;
-}
-
-
-/**
- * cloog_block_copy function:
- * This function returns a copy of a CloogBlock structure 'block'. To save
- * memory this is not a memory copy but we increment a counter of active
- * references inside the structure, then return a pointer to that structure.
- */ 
-CloogBlock * cloog_block_copy(CloogBlock * block)
-{ if (block == NULL)
-  return NULL ;
-
-  block->references ++ ;
-  return block ;
-}
-
-
-/**
- * cloog_block_merge function:
- * this function adds at the end of the statement list of the block 'block',
- * the statement list of the block 'merged'. Then the  CloogBlock structure
- * of 'merged' is freed (obviously not its statement list that is now
- * included in 'block').
- * - June 11th 2005: first version.
- */
-void cloog_block_merge(CloogBlock * block, CloogBlock * merged)
-{ CloogStatement * statement ;
-
-  if ((block == NULL) || (merged == NULL))
-  return ;
-  
-  if (block->statement != NULL)
-  { statement = block->statement ;
-    
-    while (statement->next != NULL)
-    statement = statement->next ;
-    
-    statement->next = merged->statement ;
-  }
-  else
-  block->statement = merged->statement ;
-
-  merged->statement = NULL;
-  cloog_block_free(merged);
-}
-
-
-
-
-
-
-
-
-
-
diff --git a/cloog-0.16.3/source/clast.c b/cloog-0.16.3/source/clast.c
deleted file mode 100644
index 011c046..0000000
--- a/cloog-0.16.3/source/clast.c
+++ /dev/null
@@ -1,1895 +0,0 @@
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-#include "../include/cloog/cloog.h"
-
-#define ALLOC(type) (type*)malloc(sizeof(type))
-#define ALLOCN(type,n) (type*)malloc((n)*sizeof(type))
-
-/**
- * CloogInfos structure:
- * this structure contains all the informations necessary for pretty printing,
- * they come from the original CloogProgram structure (language, names), from
- * genereral options (options) or are built only for pretty printing (stride).
- * This structure is mainly there to reduce the number of function parameters,
- * since most pprint.c functions need most of its field.
- */
-struct clooginfos {
-  CloogState *state;         /**< State. */
-  CloogStride **stride;
-  int stride_level;          /**< Number of valid entries in stride array. */
-  int  nb_scattdims ;        /**< Scattering dimension number. */
-  int * scaldims ;           /**< Boolean array saying whether a given
-                              *   scattering dimension is scalar or not.
-                              */
-  CloogNames * names ;       /**< Names of iterators and parameters. */
-  CloogOptions * options ;   /**< Options on CLooG's behaviour. */
-  CloogEqualities *equal;    /**< Matrix of equalities. */
-} ;
-
-typedef struct clooginfos CloogInfos ;
-
-static int clast_expr_cmp(struct clast_expr *e1, struct clast_expr *e2);
-static int clast_term_cmp(struct clast_term *t1, struct clast_term *t2);
-static int clast_binary_cmp(struct clast_binary *b1, struct clast_binary *b2);
-static int clast_reduction_cmp(struct clast_reduction *r1, 
-				 struct clast_reduction *r2);
-
-static struct clast_expr *clast_expr_copy(struct clast_expr *e);
-
-static int clast_equal_add(CloogEqualities *equal,
-				CloogConstraintSet *constraints,
-				int level, CloogConstraint *constraint,
-				CloogInfos *infos);
-
-static struct clast_stmt *clast_equal(int level, CloogInfos *infos);
-static struct clast_expr *clast_minmax(CloogConstraintSet *constraints,
-					int level, int max, int guard, 
-					int lower_bound, int no_earlier,
-					CloogInfos *infos);
-static void insert_guard(CloogConstraintSet *constraints, int level,
-			  struct clast_stmt ***next, CloogInfos *infos);
-static int insert_modulo_guard(CloogConstraint *upper,
-				CloogConstraint *lower, int level,
-			        struct clast_stmt ***next, CloogInfos *infos);
-static int insert_equation(CloogDomain *domain, CloogConstraint *upper,
-                           CloogConstraint *lower, int level,
-                           struct clast_stmt ***next, CloogInfos *infos);
-static int insert_for(CloogDomain *domain, CloogConstraintSet *constraints,
-                      int level, int otl, struct clast_stmt ***next,
-                      CloogInfos *infos);
-static void insert_block(CloogDomain *domain, CloogBlock *block, int level,
-			 struct clast_stmt ***next, CloogInfos *infos);
-static void insert_loop(CloogLoop * loop, int level,
-			struct clast_stmt ***next, CloogInfos *infos);
-
-
-struct clast_name *new_clast_name(const char *name)
-{
-    struct clast_name *n = malloc(sizeof(struct clast_name));
-    n->expr.type = clast_expr_name;
-    n->name = name;
-    return n;
-}
-
-struct clast_term *new_clast_term(cloog_int_t c, struct clast_expr *v)
-{
-    struct clast_term *t = malloc(sizeof(struct clast_term));
-    t->expr.type = clast_expr_term;
-    cloog_int_init(t->val);
-    cloog_int_set(t->val, c);
-    t->var = v;
-    return t;
-}
-
-struct clast_binary *new_clast_binary(enum clast_bin_type t, 
-				      struct clast_expr *lhs, cloog_int_t rhs)
-{
-    struct clast_binary *b = malloc(sizeof(struct clast_binary));
-    b->expr.type = clast_expr_bin;
-    b->type = t;
-    b->LHS = lhs;
-    cloog_int_init(b->RHS);
-    cloog_int_set(b->RHS, rhs);
-    return b;
-}
-
-struct clast_reduction *new_clast_reduction(enum clast_red_type t, int n)
-{
-    int i;
-    struct clast_reduction *r;
-    r = malloc(sizeof(struct clast_reduction)+(n-1)*sizeof(struct clast_expr *));
-    r->expr.type = clast_expr_red;
-    r->type = t;
-    r->n = n;
-    for (i = 0; i < n; ++i)
-	r->elts[i] = NULL;
-    return r;
-}
-
-static void free_clast_root(struct clast_stmt *s);
-
-const struct clast_stmt_op stmt_root = { free_clast_root };
-
-static void free_clast_root(struct clast_stmt *s)
-{
-    struct clast_root *r = (struct clast_root *)s;
-    assert(CLAST_STMT_IS_A(s, stmt_root));
-    cloog_names_free(r->names);
-    free(r);
-}
-
-struct clast_root *new_clast_root(CloogNames *names)
-{
-    struct clast_root *r = malloc(sizeof(struct clast_root));
-    r->stmt.op = &stmt_root;
-    r->stmt.next = NULL;
-    r->names = cloog_names_copy(names);
-    return r;
-}
-
-static void free_clast_assignment(struct clast_stmt *s);
-
-const struct clast_stmt_op stmt_ass = { free_clast_assignment };
-
-static void free_clast_assignment(struct clast_stmt *s)
-{
-    struct clast_assignment *a = (struct clast_assignment *)s;
-    assert(CLAST_STMT_IS_A(s, stmt_ass));
-    free_clast_expr(a->RHS);
-    free(a);
-}
-
-struct clast_assignment *new_clast_assignment(const char *lhs,
-					      struct clast_expr *rhs)
-{
-    struct clast_assignment *a = malloc(sizeof(struct clast_assignment));
-    a->stmt.op = &stmt_ass;
-    a->stmt.next = NULL;
-    a->LHS = lhs;
-    a->RHS = rhs;
-    return a;
-}
-
-static void free_clast_user_stmt(struct clast_stmt *s);
-
-const struct clast_stmt_op stmt_user = { free_clast_user_stmt };
-
-static void free_clast_user_stmt(struct clast_stmt *s)
-{
-    struct clast_user_stmt *u = (struct clast_user_stmt *)s;
-    assert(CLAST_STMT_IS_A(s, stmt_user));
-    cloog_domain_free(u->domain);
-    cloog_statement_free(u->statement);
-    cloog_clast_free(u->substitutions);
-    free(u);
-}
-
-struct clast_user_stmt *new_clast_user_stmt(CloogDomain *domain,
-    CloogStatement *stmt, struct clast_stmt *subs)
-{
-    struct clast_user_stmt *u = malloc(sizeof(struct clast_user_stmt));
-    u->stmt.op = &stmt_user;
-    u->stmt.next = NULL;
-    u->domain = cloog_domain_copy(domain);
-    u->statement = cloog_statement_copy(stmt);
-    u->substitutions = subs;
-    return u;
-}
-
-static void free_clast_block(struct clast_stmt *b);
-
-const struct clast_stmt_op stmt_block = { free_clast_block };
-
-static void free_clast_block(struct clast_stmt *s)
-{
-    struct clast_block *b = (struct clast_block *)s;
-    assert(CLAST_STMT_IS_A(s, stmt_block));
-    cloog_clast_free(b->body);
-    free(b);
-}
-
-struct clast_block *new_clast_block()
-{
-    struct clast_block *b = malloc(sizeof(struct clast_block));
-    b->stmt.op = &stmt_block;
-    b->stmt.next = NULL;
-    b->body = NULL;
-    return b;
-}
-
-static void free_clast_for(struct clast_stmt *s);
-
-const struct clast_stmt_op stmt_for = { free_clast_for };
-
-static void free_clast_for(struct clast_stmt *s)
-{
-    struct clast_for *f = (struct clast_for *)s;
-    assert(CLAST_STMT_IS_A(s, stmt_for));
-    cloog_domain_free(f->domain);
-    free_clast_expr(f->LB);
-    free_clast_expr(f->UB);
-    cloog_int_clear(f->stride);
-    cloog_clast_free(f->body);
-    free(f);
-}
-
-struct clast_for *new_clast_for(CloogDomain *domain, const char *it,
-                                struct clast_expr *LB, struct clast_expr *UB,
-                                CloogStride *stride)
-{
-    struct clast_for *f = malloc(sizeof(struct clast_for));
-    f->stmt.op = &stmt_for;
-    f->stmt.next = NULL;
-    f->domain = cloog_domain_copy(domain);
-    f->iterator = it;
-    f->LB = LB;
-    f->UB = UB;
-    f->body = NULL;
-    cloog_int_init(f->stride);
-    if (stride)
-	cloog_int_set(f->stride, stride->stride);
-    else
-	cloog_int_set_si(f->stride, 1);
-    return f;
-}
-
-static void free_clast_guard(struct clast_stmt *s);
-
-const struct clast_stmt_op stmt_guard = { free_clast_guard };
-
-static void free_clast_guard(struct clast_stmt *s)
-{
-    int i;
-    struct clast_guard *g = (struct clast_guard *)s;
-    assert(CLAST_STMT_IS_A(s, stmt_guard));
-    cloog_clast_free(g->then);
-    for (i = 0; i < g->n; ++i) {
-	free_clast_expr(g->eq[i].LHS);
-	free_clast_expr(g->eq[i].RHS);
-    }
-    free(g);
-}
-
-struct clast_guard *new_clast_guard(int n)
-{
-    int i;
-    struct clast_guard *g = malloc(sizeof(struct clast_guard) + 
-				   (n-1) * sizeof(struct clast_equation));
-    g->stmt.op = &stmt_guard;
-    g->stmt.next = NULL;
-    g->then = NULL;
-    g->n = n;
-    for (i = 0; i < n; ++i) {
-	g->eq[i].LHS = NULL;
-	g->eq[i].RHS = NULL;
-    }
-    return g;
-}
-
-void free_clast_name(struct clast_name *n)
-{
-    free(n);
-}
-
-void free_clast_term(struct clast_term *t)
-{
-    cloog_int_clear(t->val);
-    free_clast_expr(t->var);
-    free(t);
-}
-
-void free_clast_binary(struct clast_binary *b)
-{
-    cloog_int_clear(b->RHS);
-    free_clast_expr(b->LHS);
-    free(b);
-}
-
-void free_clast_reduction(struct clast_reduction *r)
-{
-    int i;
-    for (i = 0; i < r->n; ++i)
-	free_clast_expr(r->elts[i]);
-    free(r);
-}
-
-void free_clast_expr(struct clast_expr *e)
-{
-    if (!e)
-	return;
-    switch (e->type) {
-    case clast_expr_name:
-	free_clast_name((struct clast_name*) e);
-	break;
-    case clast_expr_term:
-	free_clast_term((struct clast_term*) e);
-	break;
-    case clast_expr_red:
-	free_clast_reduction((struct clast_reduction*) e);
-	break;
-    case clast_expr_bin:
-	free_clast_binary((struct clast_binary*) e);
-	break;
-    default:
-	assert(0);
-    }
-}
-
-void free_clast_stmt(struct clast_stmt *s)
-{
-    assert(s->op);
-    assert(s->op->free);
-    s->op->free(s);
-}
-
-void cloog_clast_free(struct clast_stmt *s)
-{
-    struct clast_stmt *next;
-    while (s) {
-	next = s->next;
-	free_clast_stmt(s);
-	s = next;
-    }
-}
-
-static int clast_name_cmp(struct clast_name *n1, struct clast_name *n2)
-{
-    return n1->name == n2->name ? 0 : strcmp(n1->name, n2->name);
-}
-
-static int clast_term_cmp(struct clast_term *t1, struct clast_term *t2)
-{
-    int c;
-    if (!t1->var && t2->var)
-	return -1;
-    if (t1->var && !t2->var)
-	return 1;
-    c = clast_expr_cmp(t1->var, t2->var);
-    if (c)
-	return c;
-    return cloog_int_cmp(t1->val, t2->val);
-}
-
-static int clast_binary_cmp(struct clast_binary *b1, struct clast_binary *b2)
-{
-    int c;
-
-    if (b1->type != b2->type)
-	return b1->type - b2->type;
-    if ((c = cloog_int_cmp(b1->RHS, b2->RHS)))
-	return c;
-    return clast_expr_cmp(b1->LHS, b2->LHS);
-}
-
-static int clast_reduction_cmp(struct clast_reduction *r1, struct clast_reduction *r2)
-{
-    int i;
-    int c;
-
-    if (r1->n == 1 && r2->n == 1)
-	return clast_expr_cmp(r1->elts[0], r2->elts[0]);
-    if (r1->type != r2->type)
-	return r1->type - r2->type;
-    if (r1->n != r2->n)
-	return r1->n - r2->n;
-    for (i = 0; i < r1->n; ++i)
-	if ((c = clast_expr_cmp(r1->elts[i], r2->elts[i])))
-	    return c;
-    return 0;
-}
-
-static int clast_expr_cmp(struct clast_expr *e1, struct clast_expr *e2)
-{
-    if (!e1 && !e2)
-	return 0;
-    if (!e1)
-	return -1;
-    if (!e2)
-	return 1;
-    if (e1->type != e2->type)
-	return e1->type - e2->type;
-    switch (e1->type) {
-    case clast_expr_name:
-	return clast_name_cmp((struct clast_name*) e1, 
-				(struct clast_name*) e2);
-    case clast_expr_term:
-	return clast_term_cmp((struct clast_term*) e1, 
-				(struct clast_term*) e2);
-    case clast_expr_bin:
-	return clast_binary_cmp((struct clast_binary*) e1, 
-				(struct clast_binary*) e2);
-    case clast_expr_red:
-	return clast_reduction_cmp((struct clast_reduction*) e1, 
-				   (struct clast_reduction*) e2);
-    default:
-	assert(0);
-    }
-}
-
-int clast_expr_equal(struct clast_expr *e1, struct clast_expr *e2)
-{
-    return clast_expr_cmp(e1, e2) == 0;
-}
-
-/**
- * Return 1 is both expressions are constant terms and e1 is bigger than e2.
- */
-int clast_expr_is_bigger_constant(struct clast_expr *e1, struct clast_expr *e2)
-{
-    struct clast_term *t1, *t2;
-    struct clast_reduction *r;
-
-    if (!e1 || !e2)
-	return 0;
-    if (e1->type == clast_expr_red) {
-	r = (struct clast_reduction *)e1;
-	return r->n == 1 && clast_expr_is_bigger_constant(r->elts[0], e2);
-    }
-    if (e2->type == clast_expr_red) {
-	r = (struct clast_reduction *)e2;
-	return r->n == 1 && clast_expr_is_bigger_constant(e1, r->elts[0]);
-    }
-    if (e1->type != clast_expr_term || e2->type != clast_expr_term)
-	return 0;
-    t1 = (struct clast_term *)e1;
-    t2 = (struct clast_term *)e2;
-    if (t1->var || t2->var)
-	return 0;
-    return cloog_int_gt(t1->val, t2->val);
-}
-
-static int qsort_expr_cmp(const void *p1, const void *p2)
-{
-    return clast_expr_cmp(*(struct clast_expr **)p1, *(struct clast_expr **)p2);
-}
-
-static void clast_reduction_sort(struct clast_reduction *r)
-{
-    qsort(&r->elts[0], r->n, sizeof(struct clast_expr *), qsort_expr_cmp);
-}
-
-static int qsort_eq_cmp(const void *p1, const void *p2)
-{
-    struct clast_equation *eq1 = (struct clast_equation *)p1;
-    struct clast_equation *eq2 = (struct clast_equation *)p2;
-    int cmp;
-
-    cmp = clast_expr_cmp(eq1->LHS, eq2->LHS);
-    if (cmp)
-	return cmp;
-
-    cmp = clast_expr_cmp(eq1->RHS, eq2->RHS);
-    if (cmp)
-	return cmp;
-
-    return eq1->sign - eq2->sign;
-}
-
-/**
- * Sort equations in a clast_guard.
- */
-static void clast_guard_sort(struct clast_guard *g)
-{
-    qsort(&g->eq[0], g->n, sizeof(struct clast_equation), qsort_eq_cmp);
-}
-
-
-/**
- * Construct a (deep) copy of an expression clast.
- */
-static struct clast_expr *clast_expr_copy(struct clast_expr *e)
-{
-    if (!e)
-	return NULL;
-    switch (e->type) {
-    case clast_expr_name: {
-	struct clast_name* n = (struct clast_name*) e;
-	return &new_clast_name(n->name)->expr;
-    }
-    case clast_expr_term: {
-	struct clast_term* t = (struct clast_term*) e;
-	return &new_clast_term(t->val, clast_expr_copy(t->var))->expr;
-    }
-    case clast_expr_red: {
-	int i;
-	struct clast_reduction *r = (struct clast_reduction*) e;
-	struct clast_reduction *r2 = new_clast_reduction(r->type, r->n);
-	for (i = 0; i < r->n; ++i)
-	    r2->elts[i] = clast_expr_copy(r->elts[i]);
-	return &r2->expr;
-    }
-    case clast_expr_bin: {
-	struct clast_binary *b = (struct clast_binary*) e;
-	return &new_clast_binary(b->type, clast_expr_copy(b->LHS), b->RHS)->expr;
-    }
-    default:
-	assert(0);
-    }
-}
-
-
-/******************************************************************************
- *                        Equalities spreading functions                      *
- ******************************************************************************/
-
-
-/**
- * clast_equal_allow function:
- * This function checks whether the options allow us to spread the equality or
- * not. It returns 1 if so, 0 otherwise.
- * - equal is the matrix of equalities,
- * - level is the column number in equal of the element which is 'equal to',
- * - line is the line number in equal of the constraint we want to study,
- * - the infos structure gives the user all options on code printing and more.
- **
- * - October 27th 2005: first version (extracted from old pprint_equal_add).
- */
-static int clast_equal_allow(CloogEqualities *equal, int level, int line,
-				CloogInfos *infos)
-{ 
-  if (level < infos->options->fsp)
-  return 0 ;
-  
-  if ((cloog_equal_type(equal, level) == EQTYPE_EXAFFINE) &&
-      !infos->options->esp)
-  return 0 ;
-
-  return 1 ;
-}
-
-
-/**
- * clast_equal_add function:
- * This function updates the row (level-1) of the equality matrix (equal) with
- * the row that corresponds to the row (line) of the matrix (matrix). It returns
- * 1 if the row can be updated, 0 otherwise.
- * - equal is the matrix of equalities,
- * - matrix is the matrix of constraints,
- * - level is the column number in matrix of the element which is 'equal to',
- * - line is the line number in matrix of the constraint we want to study,
- * - the infos structure gives the user all options on code printing and more.
- */
-static int clast_equal_add(CloogEqualities *equal,
-				CloogConstraintSet *constraints,
-				int level, CloogConstraint *constraint,
-				CloogInfos *infos)
-{
-    cloog_equal_add(equal, constraints, level, constraint,
-		    infos->names->nb_parameters);
-  
-    return clast_equal_allow(equal, level, level-1, infos);
-}
-
-
-
-/**
- * clast_equal function:
- * This function prints the substitution data of a statement into a clast_stmt.
- * Using this function instead of pprint_equal is useful for generating
- * a compilable pseudo-code by using preprocessor macro for each statement.
- * By opposition to pprint_equal, the result is less human-readable. For
- * instance this function will print (i,i+3,k,3) where pprint_equal would
- * return (j=i+3,l=3).
- * - level is the number of loops enclosing the statement,
- * - the infos structure gives the user all options on code printing and more.
- **
- * - March    12th 2004: first version. 
- * - November 21th 2005: (debug) now works well with GMP version. 
- */
-static struct clast_stmt *clast_equal(int level, CloogInfos *infos)
-{ 
-  int i ;
-  struct clast_expr *e;
-  struct clast_stmt *a = NULL;
-  struct clast_stmt **next = &a;
-  CloogEqualities *equal = infos->equal;
-  CloogConstraint *equal_constraint;
-
-  for (i=infos->names->nb_scattering;i<level-1;i++)
-  { if (cloog_equal_type(equal, i+1)) {
-      equal_constraint = cloog_equal_constraint(equal, i);
-      e = clast_bound_from_constraint(equal_constraint, i+1, infos->names);
-      cloog_constraint_release(equal_constraint);
-    } else {
-      e = &new_clast_term(infos->state->one, &new_clast_name(
-		 cloog_names_name_at_level(infos->names, i+1))->expr)->expr;
-    }
-    *next = &new_clast_assignment(NULL, e)->stmt;
-    next = &(*next)->next;
-  }
-
-  return a;
-}
-
- 
-/**
- * clast_bound_from_constraint function:
- * This function returns a clast_expr containing the printing of the
- * 'right part' of a constraint according to an element.
- * For instance, for the constraint -3*i + 2*j - M >=0 and the element j,
- * we have j >= (3*i + M)/2. As we are looking for integral solutions, this
- * function should return 'ceild(3*i+M,2)'.
- * - matrix is the polyhedron containing all the constraints,
- * - line_num is the line number in domain of the constraint we want to print,
- * - level is the column number in domain of the element we want to use,
- * - names structure gives the user some options about code printing,
- *   the number of parameters in domain (nb_par), and the arrays of iterator
- *   names and parameters (iters and params). 
- **
- * - November 2nd 2001: first version. 
- * - June    27th 2003: 64 bits version ready.
- */
-struct clast_expr *clast_bound_from_constraint(CloogConstraint *constraint,
-					       int level, CloogNames *names)
-{ 
-  int i, sign, nb_elts=0, len;
-  cloog_int_t *line, numerator, denominator, temp, division;
-  struct clast_expr *e = NULL;
-  struct cloog_vec *line_vector;
-
-  len = cloog_constraint_total_dimension(constraint) + 2;
-  line_vector = cloog_vec_alloc(len);
-  line = line_vector->p;
-  cloog_constraint_copy_coefficients(constraint, line+1);
-  cloog_int_init(temp);
-  cloog_int_init(numerator);
-  cloog_int_init(denominator);
-
-  if (!cloog_int_is_zero(line[level])) {
-    struct clast_reduction *r;
-    /* Maybe we need to invert signs in such a way that the element sign is>0.*/
-    sign = -cloog_int_sgn(line[level]);
-
-    for (i = 1, nb_elts = 0; i <= len - 1; ++i)
-	if (i != level && !cloog_int_is_zero(line[i]))
-	    nb_elts++;
-    r = new_clast_reduction(clast_red_sum, nb_elts);
-    nb_elts = 0;
-
-    /* First, we have to print the iterators and the parameters. */
-    for (i = 1; i <= len - 2; i++) {
-      struct clast_expr *v;
-
-      if (i == level || cloog_int_is_zero(line[i]))
-	continue;
-
-      v = cloog_constraint_variable_expr(constraint, i, names);
-      
-      if (sign == -1)
-	cloog_int_neg(temp,line[i]);
-      else
-	cloog_int_set(temp,line[i]);
-      
-      r->elts[nb_elts++] = &new_clast_term(temp, v)->expr;
-    }    
-
-    if (sign == -1) {
-      cloog_int_neg(numerator, line[len - 1]);
-      cloog_int_set(denominator, line[level]);
-    }
-    else {
-      cloog_int_set(numerator, line[len - 1]);
-      cloog_int_neg(denominator, line[level]);
-    }
-        
-    /* Finally, the constant, and the final printing. */
-    if (nb_elts) {
-      if (!cloog_int_is_zero(numerator))
-	  r->elts[nb_elts++] = &new_clast_term(numerator, NULL)->expr;
-    
-      if (!cloog_int_is_one(line[level]) && !cloog_int_is_neg_one(line[level]))
-      { if (!cloog_constraint_is_equality(constraint))
-        { if (cloog_int_is_pos(line[level]))
-	    e = &new_clast_binary(clast_bin_cdiv, &r->expr, denominator)->expr;
-          else
-	    e = &new_clast_binary(clast_bin_fdiv, &r->expr, denominator)->expr;
-        } else
-	    e = &new_clast_binary(clast_bin_div, &r->expr, denominator)->expr;
-      }
-      else
-	e = &r->expr;
-    } else { 
-      free_clast_reduction(r);
-      if (cloog_int_is_zero(numerator))
-	e = &new_clast_term(numerator, NULL)->expr;
-      else
-      { if (!cloog_int_is_one(denominator))
-        { if (!cloog_constraint_is_equality(constraint)) { /* useful? */
-            if (cloog_int_is_divisible_by(numerator, denominator)) {
-              cloog_int_divexact(temp, numerator, denominator);
-	      e = &new_clast_term(temp, NULL)->expr;
-            }
-            else {
-              cloog_int_init(division);
-	      cloog_int_tdiv_q(division, numerator, denominator);
-	      if (cloog_int_is_neg(numerator)) {
-                if (cloog_int_is_pos(line[level])) {
-		    /* nb<0 need max */
-		    e = &new_clast_term(division, NULL)->expr;
-		} else {
-                  /* nb<0 need min */
-                  cloog_int_sub_ui(temp, division, 1);
-		  e = &new_clast_term(temp, NULL)->expr;
-                }
-	      }
-              else
-              { if (cloog_int_is_pos(line[level]))
-	        { /* nb>0 need max */
-                  cloog_int_add_ui(temp, division, 1);
-		  e = &new_clast_term(temp, NULL)->expr;
-                }
-		else
-		    /* nb>0 need min */
-		    e = &new_clast_term(division, NULL)->expr;
-              }
-	      cloog_int_clear(division);
-            }
-          }
-          else
-	    e = &new_clast_binary(clast_bin_div, 
-				  &new_clast_term(numerator, NULL)->expr,
-				  denominator)->expr;
-        }
-        else
-	    e = &new_clast_term(numerator, NULL)->expr;
-      }
-    }
-  }
-
-  cloog_vec_free(line_vector);
-
-  cloog_int_clear(temp);
-  cloog_int_clear(numerator);
-  cloog_int_clear(denominator);
-    
-  return e;
-}
-
-
-/* Temporary structure for communication between clast_minmax and
- * its cloog_constraint_set_foreach_constraint callback functions.
- */
-struct clast_minmax_data {
-    int level;
-    int max;
-    int guard;
-    int lower_bound;
-    int no_earlier;
-    CloogInfos *infos;
-    int n;
-    struct clast_reduction *r;
-};
-
-
-/* Should constraint "c" be considered by clast_minmax?
- *
- * If d->no_earlier is set, then the constraint may not involve
- * any earlier variables.
- */
-static int valid_bound(CloogConstraint *c, struct clast_minmax_data *d)
-{
-    int i;
-
-    if (d->max && !cloog_constraint_is_lower_bound(c, d->level - 1))
-	return 0;
-    if (!d->max && !cloog_constraint_is_upper_bound(c, d->level - 1))
-	return 0;
-    if (cloog_constraint_is_equality(c))
-	return 0;
-    if (d->guard && cloog_constraint_involves(c, d->guard - 1))
-	return 0;
-
-    if (d->no_earlier)
-	for (i = 0; i < d->level - 1; ++i)
-	    if (cloog_constraint_involves(c, i))
-		return 0;
-
-    return 1;
-}
-
-
-/* Increment n for each bound that should be considered by clast_minmax.
- */
-static int count_bounds(CloogConstraint *c, void *user)
-{
-    struct clast_minmax_data *d = (struct clast_minmax_data *) user;
-
-    if (!valid_bound(c, d))
-	return 0;
-
-    d->n++;
-
-    return 0;
-}
-
-
-/* Update the given lower bound based on stride information,
- * for those cases where the stride offset is represented by
- * a constraint.
- * Note that cloog_loop_stride may have already performed a
- * similar update of the lower bounds, but the updated lower
- * bounds may have been eliminated because they are redundant
- * by definition.  On the other hand, performing the update
- * on an already updated constraint is an identity operation
- * and is therefore harmless.
- */
-static CloogConstraint *update_lower_bound_c(CloogConstraint *c, int level,
-	CloogStride *stride)
-{
-    if (!stride->constraint)
-	return c;
-    return cloog_constraint_stride_lower_bound(c, level, stride);
-}
-
-
-/* Update the given lower bound based on stride information.
- * If the stride offset is represented by a constraint,
- * then we have already performed the update in update_lower_bound_c.
- * Otherwise, the original lower bound is known to be a constant.
- * If the bound has already been updated and it just happens
- * to be a constant, then this function performs an identity
- * operation on the constant.
- */
-static void update_lower_bound(struct clast_expr *expr, int level,
-	CloogStride *stride)
-{
-    struct clast_term *t;
-    if (stride->constraint)
-	return;
-    if (expr->type != clast_expr_term)
-	return;
-    t = (struct clast_term *)expr;
-    if (t->var)
-	return;
-    cloog_int_sub(t->val, t->val, stride->offset);
-    cloog_int_cdiv_q(t->val, t->val, stride->stride);
-    cloog_int_mul(t->val, t->val, stride->stride);
-    cloog_int_add(t->val, t->val, stride->offset);
-}
-
-
-/* Add all relevant bounds to r->elts and update lower bounds
- * based on stride information.
- */
-static int collect_bounds(CloogConstraint *c, void *user)
-{
-    struct clast_minmax_data *d = (struct clast_minmax_data *) user;
-
-    if (!valid_bound(c, d))
-	return 0;
-
-    c = cloog_constraint_copy(c);
-
-    if (d->lower_bound && d->infos->stride[d->level - 1])
-	c = update_lower_bound_c(c, d->level, d->infos->stride[d->level - 1]);
-
-    d->r->elts[d->n] = clast_bound_from_constraint(c, d->level,
-							    d->infos->names);
-    if (d->lower_bound && d->infos->stride[d->level - 1]) {
-	update_lower_bound(d->r->elts[d->n], d->level,
-			   d->infos->stride[d->level - 1]);
-    }
-
-    cloog_constraint_release(c);
-
-    d->n++;
-
-    return 0;
-}
-
-
-/**
- * clast_minmax function:
- * This function returns a clast_expr containing the printing of a minimum or a
- * maximum of the 'right parts' of all constraints according to an element.
- * For instance consider the constraints:
- * -3*i  +2*j   -M >= 0
- *  2*i    +j      >= 0
- *   -i    -j +2*M >= 0
- * if we are looking for the minimum for the element j, the function should
- * return 'max(ceild(3*i+M,2),-2*i)'.
- * - constraints is the constraints,
- * - level is the column number in domain of the element we want to use,
- * - max is a boolean set to 1 if we are looking for a maximum, 0 for a minimum,
- * - guard is set to 0 if there is no guard, and set to the level of the element
- *   with a guard otherwise (then the function gives the max or the min only
- *   for the constraint where the guarded coefficient is 0), 
- * - lower is set to 1 if the maximum is to be used a lower bound on a loop
- * - no_earlier is set if no constraints should be used that involve
- *   earlier dimensions,
- * - the infos structure gives the user some options about code printing,
- *   the number of parameters in domain (nb_par), and the arrays of iterator
- *   names and parameters (iters and params). 
- **
- * - November 2nd 2001: first version. 
- */
-static struct clast_expr *clast_minmax(CloogConstraintSet *constraints,
-				       int level, int max, int guard,
-				       int lower_bound, int no_earlier,
-				       CloogInfos *infos)
-{
-    struct clast_minmax_data data = { level, max, guard, lower_bound,
-				      no_earlier, infos };
-  
-    data.n = 0;
-
-    cloog_constraint_set_foreach_constraint(constraints, count_bounds, &data);
-
-    if (!data.n)
-	return NULL;
-    data.r = new_clast_reduction(max ? clast_red_max : clast_red_min, data.n);
-
-    data.n = 0;
-    cloog_constraint_set_foreach_constraint(constraints, collect_bounds, &data);
-
-    clast_reduction_sort(data.r);
-    return &data.r->expr;
-}
-
-
-/**
- * Insert modulo guards defined by existentially quantified dimensions,
- * not involving the given level.
- *
- * This function is called from within insert_guard.
- * Any constraint used in constructing a modulo guard is removed
- * from the constraint set to avoid insert_guard
- * adding a duplicate (pair of) constraint(s).
- *
- * Return the updated CloogConstraintSet.
- */
-static CloogConstraintSet *insert_extra_modulo_guards(
-	CloogConstraintSet *constraints, int level,
-	struct clast_stmt ***next, CloogInfos *infos)
-{
-    int i;
-    int nb_iter;
-    int total_dim;
-    CloogConstraint *upper, *lower;
-
-    total_dim = cloog_constraint_set_total_dimension(constraints);
-    nb_iter = cloog_constraint_set_n_iterators(constraints,
-						infos->names->nb_parameters);
-
-    for (i = total_dim - infos->names->nb_parameters; i >= nb_iter + 1; i--) {
-	if (cloog_constraint_is_valid(upper =
-		cloog_constraint_set_defining_equality(constraints, i))) {
-	    if (!level || (nb_iter < level) ||
-		    !cloog_constraint_involves(upper, level-1)) {
-		insert_modulo_guard(upper,
-				cloog_constraint_invalid(), i, next, infos);
-		constraints = cloog_constraint_set_drop_constraint(constraints,
-									upper);
-	    }
-	    cloog_constraint_release(upper);
-	} else if (cloog_constraint_is_valid(upper =
-		    cloog_constraint_set_defining_inequalities(constraints,
-			      i, &lower, infos->names->nb_parameters))) {
-	    if (!level || (nb_iter < level) ||
-		    !cloog_constraint_involves(upper, level-1)) {
-		insert_modulo_guard(upper, lower, i, next, infos);
-		constraints = cloog_constraint_set_drop_constraint(constraints,
-									upper);
-		constraints = cloog_constraint_set_drop_constraint(constraints,
-									lower);
-	    }
-	    cloog_constraint_release(upper);
-	    cloog_constraint_release(lower);
-	}
-    }
-
-    return constraints;
-}
-
-
-/* Temporary structure for communication between insert_guard and
- * its cloog_constraint_set_foreach_constraint callback function.
- */
-struct clast_guard_data {
-    int level;
-    CloogInfos *infos;
-    int n;
-    int i;
-    int nb_iter;
-    CloogConstraintSet *copy;
-    struct clast_guard *g;
-
-    int min;
-    int max;
-};
-
-
-static int guard_count_bounds(CloogConstraint *c, void *user)
-{
-    struct clast_guard_data *d = (struct clast_guard_data *) user;
-
-    d->n++;
-
-    return 0;
-}
-
-
-/* Insert a guard, if necesessary, for constraint j.
- *
- * If the constraint involves any earlier dimensions, then we have
- * already considered it during a previous iteration over the constraints.
- *
- * If we have already generated a min [max] for the current level d->i
- * and if the current constraint is an upper [lower] bound, then we
- * can skip the constraint as it will already have been used
- * in that previously generated min [max].
- */
-static int insert_guard_constraint(CloogConstraint *j, void *user)
-{
-    int i;
-    struct clast_guard_data *d = (struct clast_guard_data *) user;
-    int minmax = -1;
-    int individual_constraint;
-    struct clast_expr *v;
-    struct clast_term *t;
-
-    if (!cloog_constraint_involves(j, d->i - 1))
-	return 0;
-
-    for (i = 0; i < d->i - 1; ++i)
-	if (cloog_constraint_involves(j, i))
-	    return 0;
-
-    if (d->level && d->nb_iter >= d->level &&
-	    cloog_constraint_involves(j, d->level - 1))
-	return 0;
-
-    individual_constraint = !d->level || cloog_constraint_is_equality(j);
-    if (!individual_constraint) {
-	if (d->max && cloog_constraint_is_lower_bound(j, d->i - 1))
-	    return 0;
-	if (d->min && cloog_constraint_is_upper_bound(j, d->i - 1))
-	    return 0;
-    }
-
-    v = cloog_constraint_variable_expr(j, d->i, d->infos->names);
-    d->g->eq[d->n].LHS = &(t = new_clast_term(d->infos->state->one, v))->expr;
-    if (individual_constraint) {
-	/* put the "denominator" in the LHS */
-	cloog_constraint_coefficient_get(j, d->i - 1, &t->val);
-	cloog_constraint_coefficient_set(j, d->i - 1, d->infos->state->one);
-	if (cloog_int_is_neg(t->val)) {
-	    cloog_int_neg(t->val, t->val);
-	    cloog_constraint_coefficient_set(j, d->i - 1, d->infos->state->negone);
-	}
-	if (d->level || cloog_constraint_is_equality(j))
-	    d->g->eq[d->n].sign = 0;
-	else if (cloog_constraint_is_lower_bound(j, d->i - 1))
-	    d->g->eq[d->n].sign = 1;
-	else
-	    d->g->eq[d->n].sign = -1;
-	d->g->eq[d->n].RHS = clast_bound_from_constraint(j, d->i, d->infos->names);
-    } else {
-	int guarded;
-
-	if (cloog_constraint_is_lower_bound(j, d->i - 1)) {
-	    minmax = 1;
-	    d->max = 1;
-	    d->g->eq[d->n].sign = 1;
-	} else {
-	    minmax = 0;
-	    d->min = 1;
-	    d->g->eq[d->n].sign = -1;
-	}
-	  
-	guarded = (d->nb_iter >= d->level) ? d->level : 0 ;
-	d->g->eq[d->n].RHS = clast_minmax(d->copy,  d->i, minmax, guarded, 0, 1,
-					  d->infos);
-    }
-    d->n++;
-	
-    return 0;
-}
-
-
-/**
- * insert_guard function:
- * This function inserts a guard in the clast.
- * A guard on an element (level) is :
- * -> the conjunction of all the existing constraints where the coefficient of
- *    this element is 0 if the element is an iterator,
- * -> the conjunction of all the existing constraints if the element isn't an
- *    iterator.
- * For instance, considering these constraints and the element j:
- * -3*i +2*j -M >= 0
- *  2*i      +M >= 0
- * this function should return 'if (2*i+M>=0) {'.
- * - matrix is the polyhedron containing all the constraints,
- * - level is the column number of the element in matrix we want to use,
- * - the infos structure gives the user some options about code printing,
- *   the number of parameters in matrix (nb_par), and the arrays of iterator
- *   names and parameters (iters and params). 
- **
- * - November  3rd 2001: first version. 
- * - November 14th 2001: a lot of 'purifications'. 
- * - July     31th 2002: (debug) some guard parts are no more redundants. 
- * - August   12th 2002: polyhedra union ('or' conditions) are now supported.
- * - October  27th 2005: polyhedra union ('or' conditions) are no more supported
- *                       (the need came from loop_simplify that may result in
- *                       domain unions, now it should be fixed directly in
- *                       cloog_loop_simplify).
- */
-static void insert_guard(CloogConstraintSet *constraints, int level,
-			 struct clast_stmt ***next, CloogInfos *infos)
-{ 
-    int total_dim;
-    struct clast_guard_data data = { level, infos, 0 };
-
-    if (!constraints)
-	return;
-
-    data.copy = cloog_constraint_set_copy(constraints);
-
-    data.copy = insert_extra_modulo_guards(data.copy, level, next, infos);
-
-    cloog_constraint_set_foreach_constraint(constraints,
-						guard_count_bounds, &data);
-  
-    data.g = new_clast_guard(data.n);
-    data.n = 0;
-
-    /* Well, it looks complicated because I wanted to have a particular, more
-     * readable, ordering, obviously this function may be far much simpler !
-     */
-    data.nb_iter = cloog_constraint_set_n_iterators(constraints,
-						infos->names->nb_parameters);
- 
-    /* We search for guard parts. */
-    total_dim = cloog_constraint_set_total_dimension(constraints);
-    for (data.i = 1; data.i <= total_dim; data.i++) {
-	data.min = 0;
-	data.max = 0;
-	cloog_constraint_set_foreach_constraint(data.copy,
-						insert_guard_constraint, &data);
-    }
-
-    cloog_constraint_set_free(data.copy);
-
-    data.g->n = data.n;
-    if (data.n) {
-	clast_guard_sort(data.g);
-	**next = &data.g->stmt;
-	*next = &data.g->then;
-    } else
-	free_clast_stmt(&data.g->stmt);
-}
-
-/**
- * Check if the constant "cst" satisfies the modulo guard that
- * would be introduced by insert_computed_modulo_guard.
- * The constant is assumed to have been reduced prior to calling
- * this function.
- */
-static int constant_modulo_guard_is_satisfied(CloogConstraint *lower,
-	cloog_int_t bound, cloog_int_t cst)
-{
-    if (cloog_constraint_is_valid(lower))
-	return cloog_int_le(cst, bound);
-    else
-	return cloog_int_is_zero(cst);
-}
-
-/**
- * Insert a modulo guard "r % mod == 0" or "r % mod <= bound",
- * depending on whether lower represents a valid constraint.
- */
-static void insert_computed_modulo_guard(struct clast_reduction *r,
-	CloogConstraint *lower, cloog_int_t mod, cloog_int_t bound,
-	struct clast_stmt ***next)
-{
-    struct clast_expr *e;
-    struct clast_guard *g;
-
-    e = &new_clast_binary(clast_bin_mod, &r->expr, mod)->expr;
-    g = new_clast_guard(1);
-    if (!cloog_constraint_is_valid(lower)) {
-	g->eq[0].LHS = e;
-	cloog_int_set_si(bound, 0);
-	g->eq[0].RHS = &new_clast_term(bound, NULL)->expr;
-	g->eq[0].sign = 0;
-    } else {
-	g->eq[0].LHS = e;
-	g->eq[0].RHS = &new_clast_term(bound, NULL)->expr;
-	g->eq[0].sign = -1;
-    }
-
-    **next = &g->stmt;
-    *next = &g->then;
-}
-
-
-/* Try and eliminate coefficients from a modulo constraint based on
- * stride information of an earlier level.
- * The modulo of the constraint being constructed is "m".
- * The stride information at level "level" is given by "stride"
- * and indicated that the iterator i at level "level" is equal to
- * some expression modulo stride->stride.
- * If stride->stride is a multiple of "m' then i is also equal to
- * the expression modulo m and so we can eliminate the coefficient of i.
- *
- * If stride->constraint is NULL, then i has a constant value modulo m, stored
- * stride->offset.  We simply multiply this constant with the coefficient
- * of i and add the result to the constant term, reducing it modulo m.
- *
- * If stride->constraint is not NULL, then it is a constraint of the form
- *
- *	e + k i = s a
- *
- * with s equal to stride->stride, e an expression in terms of the
- * parameters and earlier iterators and a some arbitrary expression
- * in terms of existentially quantified variables.
- * stride->factor is a value f such that f * k = -1 mod s.
- * Adding stride->constraint f * c times to the current modulo constraint,
- * with c the coefficient of i eliminates i in favor of parameters and
- * earlier variables.
- */
-static void eliminate_using_stride_constraint(cloog_int_t *line, int len,
-	int nb_iter, CloogStride *stride, int level, cloog_int_t m)
-{
-	if (!stride)
-		return;
-	if (!cloog_int_is_divisible_by(stride->stride, m))
-		return;
-
-	if (stride->constraint) {
-		int i, s_len;
-		cloog_int_t t, v;
-
-		cloog_int_init(t);
-		cloog_int_init(v);
-		cloog_int_mul(t, line[level], stride->factor);
-		for (i = 1; i < level; ++i) {
-			cloog_constraint_coefficient_get(stride->constraint,
-							i - 1, &v);
-			cloog_int_addmul(line[i], t, v);
-			cloog_int_fdiv_r(line[i], line[i], m);
-		}
-		s_len = cloog_constraint_total_dimension(stride->constraint)+2;
-		for (i = nb_iter + 1; i <= len - 2; ++i) {
-			cloog_constraint_coefficient_get(stride->constraint,
-						i - (len - s_len) - 1, &v);
-			cloog_int_addmul(line[i], t, v);
-			cloog_int_fdiv_r(line[i], line[i], m);
-		}
-		cloog_constraint_constant_get(stride->constraint, &v);
-		cloog_int_addmul(line[len - 1], t, v);
-		cloog_int_fdiv_r(line[len - 1], line[len - 1], m);
-		cloog_int_clear(v);
-		cloog_int_clear(t);
-	} else {
-		cloog_int_addmul(line[len - 1], line[level], stride->offset);
-		cloog_int_fdiv_r(line[len - 1], line[len - 1], m);
-	}
-
-	cloog_int_set_si(line[level], 0);
-}
-
-
-/* Temporary structure for communication between insert_modulo_guard and
- * its cloog_constraint_set_foreach_constraint callback function.
- */
-struct clast_modulo_guard_data {
-    CloogConstraint *lower;
-    int level;
-    struct clast_stmt ***next;
-    CloogInfos *infos;
-    int empty;
-    cloog_int_t val, bound;
-};
-
-
-/* Insert a modulo guard for constraint c.
- * The constraint may be either an equality or an inequality.
- * Since this function returns -1, it is only called on a single constraint.
- * In case of an inequality, the constraint is usually an upper bound
- * on d->level.  However, if this variable is an existentially
- * quantified variable, the upper bound constraint may get removed
- * as trivially holding and then this function is called with
- * a lower bound instead.  In this case, we need to adjust the constraint
- * based on the sum of the constant terms of the lower and upper bound
- * stored in d->bound.
- */
-static int insert_modulo_guard_constraint(CloogConstraint *c, void *user)
-{
-    struct clast_modulo_guard_data *d = (struct clast_modulo_guard_data *) user;
-    int level = d->level;
-    CloogInfos *infos = d->infos;
-    int i, nb_elts = 0, len, len2, nb_iter, nb_par;
-    int constant;
-    struct cloog_vec *line_vector;
-    cloog_int_t *line;
-
-    len = cloog_constraint_total_dimension(c) + 2;
-    len2 = cloog_equal_total_dimension(infos->equal) + 2;
-    nb_par = infos->names->nb_parameters;
-    nb_iter = len - 2 - nb_par;
-
-    line_vector = cloog_vec_alloc(len);
-    line = line_vector->p;
-    cloog_constraint_copy_coefficients(c, line + 1);
-
-    if (cloog_int_is_pos(line[level])) {
-	cloog_seq_neg(line + 1, line + 1, len - 1);
-	if (!cloog_constraint_is_equality(c))
-	    cloog_int_add(line[len - 1], line[len - 1], d->bound);
-    }
-    cloog_int_neg(line[level], line[level]);
-    assert(cloog_int_is_pos(line[level]));
-
-    nb_elts = 0;
-    for (i = 1; i <= len-1; ++i) {
-	if (i == level)
-	    continue;
-	cloog_int_fdiv_r(line[i], line[i], line[level]);
-	if (cloog_int_is_zero(line[i]))
-	    continue;
-	if (i == len-1)
-	    continue;
-
-	nb_elts++;
-    }
-
-    if (nb_elts || !cloog_int_is_zero(line[len-1])) {
-	struct clast_reduction *r;
-	const char *name;
-
-	r = new_clast_reduction(clast_red_sum, nb_elts + 1);
-	nb_elts = 0;
-
-	/* First, the modulo guard : the iterators... */
-	i = level - 1;
-	if (i > infos->stride_level)
-		i = infos->stride_level;
-	for (; i >= 1; --i)
-	    eliminate_using_stride_constraint(line, len, nb_iter,
-					infos->stride[i - 1], i, line[level]);
-	for (i=1;i<=nb_iter;i++) {
-	  if (i == level || cloog_int_is_zero(line[i]))
-	    continue;
-
-	  name = cloog_names_name_at_level(infos->names, i);
-
-	  r->elts[nb_elts++] = &new_clast_term(line[i],
-				    &new_clast_name(name)->expr)->expr;
-	}
-
-	/* ...the parameters... */
-	for (i=nb_iter+1;i<=len-2;i++) {
-	  if (cloog_int_is_zero(line[i]))
-	    continue;
-
-	  name = infos->names->parameters[i-nb_iter-1] ;
-	  r->elts[nb_elts++] = &new_clast_term(line[i],
-				    &new_clast_name(name)->expr)->expr;
-	}
-
-	constant = nb_elts == 0;
-	/* ...the constant. */
-	if (!cloog_int_is_zero(line[len-1]))
-	  r->elts[nb_elts++] = &new_clast_term(line[len-1], NULL)->expr;
-
-	/* our initial computation may have been an overestimate */
-	r->n = nb_elts;
-
-	if (constant) {
-	  d->empty = !constant_modulo_guard_is_satisfied(d->lower, d->bound,
-							 line[len - 1]);
-	  free_clast_reduction(r);
-	} else
-	  insert_computed_modulo_guard(r, d->lower, line[level], d->bound,
-					d->next);
-    }
-
-    cloog_vec_free(line_vector);
-
-    return -1;
-}
-
-
-/**
- * insert_modulo_guard:
- * This function inserts a modulo guard corresponding to an equality
- * or a pair of inequalities.
- * Returns 0 if the modulo guard is discovered to be unsatisfiable.
- *
- * See insert_equation.
- * - matrix is the polyhedron containing all the constraints,
- * - upper and lower are the line numbers of the constraint in matrix
- *   we want to print; in particular, if we want to print an equality,
- *   then lower == -1 and upper is the row of the equality; if we want
- *   to print an inequality, then upper is the row of the upper bound
- *   and lower in the row of the lower bound
- * - level is the column number of the element in matrix we want to use,
- * - the infos structure gives the user some options about code printing,
- *   the number of parameters in matrix (nb_par), and the arrays of iterator
- *   names and parameters (iters and params). 
- */
-static int insert_modulo_guard(CloogConstraint *upper,
-				CloogConstraint *lower, int level,
-				struct clast_stmt ***next, CloogInfos *infos)
-{
-  int nb_par;
-  CloogConstraintSet *set;
-  struct clast_modulo_guard_data data = { lower, level, next, infos, 0 };
-
-  cloog_int_init(data.val);
-  cloog_constraint_coefficient_get(upper, level-1, &data.val);
-  if (cloog_int_is_one(data.val) || cloog_int_is_neg_one(data.val)) {
-    cloog_int_clear(data.val);
-    return 1;
-  }
-
-  nb_par = infos->names->nb_parameters;
-
-  cloog_int_init(data.bound);
-  /* Check if would be emitting the redundant constraint mod(e,m) <= m-1 */
-  if (cloog_constraint_is_valid(lower)) {
-    cloog_constraint_constant_get(upper, &data.val);
-    cloog_constraint_constant_get(lower, &data.bound);
-    cloog_int_add(data.bound, data.val, data.bound);
-    cloog_constraint_coefficient_get(lower, level-1, &data.val);
-    cloog_int_sub_ui(data.val, data.val, 1);
-    if (cloog_int_eq(data.val, data.bound)) {
-      cloog_int_clear(data.val);
-      cloog_int_clear(data.bound);
-      return 1;
-    }
-  }
-
-  if (cloog_constraint_needs_reduction(upper, level)) {
-    set = cloog_constraint_set_for_reduction(upper, lower);
-    set = cloog_constraint_set_reduce(set, level, infos->equal,
-					nb_par, &data.bound);
-    cloog_constraint_set_foreach_constraint(set,
-					insert_modulo_guard_constraint, &data);
-    cloog_constraint_set_free(set);
-  } else
-    insert_modulo_guard_constraint(upper, &data);
-
-  cloog_int_clear(data.val);
-  cloog_int_clear(data.bound);
-
-  return !data.empty;
-}
-
-
-/**
- * We found an equality or a pair of inequalities identifying
- * a loop with a single iteration, but the user wants us to generate
- * a loop anyway, so we do it here.
- */
-static int insert_equation_as_loop(CloogDomain *domain, CloogConstraint *upper,
-		CloogConstraint *lower, int level, struct clast_stmt ***next,
-		CloogInfos *infos)
-{
-    const char *iterator = cloog_names_name_at_level(infos->names, level);
-    struct clast_expr *e1, *e2;
-    struct clast_for *f;
-
-    e2 = clast_bound_from_constraint(upper, level, infos->names);
-    if (!cloog_constraint_is_valid(lower))
-	e1 = clast_expr_copy(e2);
-    else
-	e1 = clast_bound_from_constraint(lower, level, infos->names);
-
-    f = new_clast_for(domain, iterator, e1, e2, infos->stride[level-1]);
-    **next = &f->stmt;
-    *next = &f->body;
-
-    cloog_constraint_release(lower);
-    cloog_constraint_release(upper);
-    return 1;
-}
-
-
-/**
- * insert_equation function:
- * This function inserts an equality 
- * constraint according to an element in the clast.
- * Returns 1 if the calling function should recurse into inner loops.
- *
- * An equality can be preceded by a 'modulo guard'.
- * For instance, consider the constraint i -2*j = 0 and the
- * element j: pprint_equality should return 'if(i%2==0) { j = i/2 ;'.
- * - matrix is the polyhedron containing all the constraints,
- * - num is the line number of the constraint in matrix we want to print,
- * - level is the column number of the element in matrix we want to use,
- * - the infos structure gives the user some options about code printing,
- *   the number of parameters in matrix (nb_par), and the arrays of iterator
- *   names and parameters (iters and params). 
- **
- * - November 13th 2001: first version.
- * - June 26th 2003: simplification of the modulo guards (remove parts such as
- *                   modulo is 0, compare vivien or vivien2 with a previous
- *                   version for an idea).
- * - June 29th 2003: non-unit strides support.
- * - July 14th 2003: (debug) no more print the constant in the modulo guard when
- *                   it was previously included in a stride calculation.
- */
-static int insert_equation(CloogDomain *domain, CloogConstraint *upper,
-                           CloogConstraint *lower, int level, struct clast_stmt
-                           ***next, CloogInfos *infos)
-{
-  struct clast_expr *e;
-  struct clast_assignment *ass;
-
-  if (!infos->options->otl)
-    return insert_equation_as_loop(domain, upper, lower, level, next, infos);
-
-  if (!insert_modulo_guard(upper, lower, level, next, infos)) {
-    cloog_constraint_release(lower);
-    cloog_constraint_release(upper);
-
-    return 0;
-  }
-
-  if (cloog_constraint_is_valid(lower) ||
-      !clast_equal_add(infos->equal, NULL, level, upper, infos))
-  { /* Finally, the equality. */
-		
-    /* If we have to make a block by dimension, we start the block. Function
-     * pprint knows if there is an equality, if this is the case, it checks
-     * for the same following condition to close the brace.
-     */
-    if (infos->options->block) {
-      struct clast_block *b = new_clast_block();
-      **next = &b->stmt;
-      *next = &b->body;
-    }
-		
-    e = clast_bound_from_constraint(upper, level, infos->names);
-    ass = new_clast_assignment(cloog_names_name_at_level(infos->names, level), e);
-
-    **next = &ass->stmt;
-    *next = &(**next)->next;
-  }
-
-  cloog_constraint_release(lower);
-  cloog_constraint_release(upper);
-
-  return 1;
-}
-
-
-/**
- * Insert a loop that is executed exactly once as an assignment.
- * In particular, the loop
- *
- *	for (i = e; i <= e; ++i) {
- *		S;
- *	}
- *
- * is generated as
- *
- *	i = e;
- *	S;
- *
- */
-static void insert_otl_for(CloogConstraintSet *constraints, int level,
-	struct clast_expr *e, struct clast_stmt ***next, CloogInfos *infos)
-{
-    const char *iterator;
-
-    iterator = cloog_names_name_at_level(infos->names, level);
-
-    if (!clast_equal_add(infos->equal, constraints, level,
-				cloog_constraint_invalid(), infos)) {
-	struct clast_assignment *ass;
-	if (infos->options->block) {
-	    struct clast_block *b = new_clast_block();
-	    **next = &b->stmt;
-	    *next = &b->body;
-	}
-	ass = new_clast_assignment(iterator, e);
-	**next = &ass->stmt;
-	*next = &(**next)->next;
-    } else {
-	free_clast_expr(e);
-    }
-}
-
-
-/**
- * Insert a loop that is executed at most once as an assignment followed
- * by a guard.  In particular, the loop
- *
- *	for (i = e1; i <= e2; ++i) {
- *		S;
- *	}
- *
- * is generated as
- *
- *	i = e1;
- *	if (i <= e2) {
- *		S;
- *	}
- *
- */
-static void insert_guarded_otl_for(CloogConstraintSet *constraints, int level,
-	struct clast_expr *e1, struct clast_expr *e2,
-	struct clast_stmt ***next, CloogInfos *infos)
-{
-    const char *iterator;
-    struct clast_assignment *ass;
-    struct clast_guard *guard;
-
-    iterator = cloog_names_name_at_level(infos->names, level);
-
-    if (infos->options->block) {
-	struct clast_block *b = new_clast_block();
-	**next = &b->stmt;
-	*next = &b->body;
-    }
-    ass = new_clast_assignment(iterator, e1);
-    **next = &ass->stmt;
-    *next = &(**next)->next;
-
-    guard = new_clast_guard(1);
-    guard->eq[0].sign = -1;
-    guard->eq[0].LHS = &new_clast_term(infos->state->one,
-				       &new_clast_name(iterator)->expr)->expr;
-    guard->eq[0].RHS = e2;
-
-    **next = &guard->stmt;
-    *next = &guard->then;
-}
-
-
-/**
- * insert_for function:
- * This function inserts a for loop in the clast.
- * Returns 1 if the calling function should recurse into inner loops.
- *
- * A loop header according to an element is the conjunction of a minimum and a
- * maximum on a given element (they give the loop bounds).
- * For instance, considering these constraints and the element j:
- * i + j -9*M >= 0
- *    -j +5*M >= 0
- *     j -4*M >= 0
- * this function should return 'for (j=max(-i+9*M,4*M),j<=5*M;j++) {'.
- * - constraints contains all constraints,
- * - level is the column number of the element in matrix we want to use,
- * - otl is set if the loop is executed at most once,
- * - the infos structure gives the user some options about code printing,
- *   the number of parameters in matrix (nb_par), and the arrays of iterator
- *   names and parameters (iters and params). 
- */
-static int insert_for(CloogDomain *domain, CloogConstraintSet *constraints,
-                      int level, int otl, struct clast_stmt ***next,
-                      CloogInfos *infos)
-{
-  const char *iterator;
-  struct clast_expr *e1;
-  struct clast_expr *e2;
-  
-  e1 = clast_minmax(constraints, level, 1, 0, 1, 0, infos);
-  e2 = clast_minmax(constraints, level, 0, 0, 0, 0, infos);
-
-  if (clast_expr_is_bigger_constant(e1, e2)) {
-    free_clast_expr(e1);
-    free_clast_expr(e2);
-    return 0;
-  }
-
-  /* If min and max are not equal there is a 'for' else, there is a '='.
-   * In the special case e1 = e2 = NULL, this is an infinite loop
-   * so this is not a '='.
-   */
-  if (e1 && e2 && infos->options->otl && clast_expr_equal(e1, e2)) {
-    free_clast_expr(e2);
-    insert_otl_for(constraints, level, e1, next, infos);
-  } else if (otl) {
-    insert_guarded_otl_for(constraints, level, e1, e2, next, infos);
-  } else {
-    struct clast_for *f;
-    iterator = cloog_names_name_at_level(infos->names, level);
-
-    f = new_clast_for(domain, iterator, e1, e2, infos->stride[level-1]);
-    **next = &f->stmt;
-    *next = &f->body;
-  }
-
-  return 1;    
-}
-
-
-/**
- * insert_block function:
- * This function inserts a statement block.
- * - block is the statement block,
- * - level is the number of loops enclosing the statement,
- * - the infos structure gives the user some options about code printing,
- *   the number of parameters in domain (nb_par), and the arrays of iterator
- *   names and parameters (iters and params). 
- **
- * - September 21th 2003: first version (pick from pprint function). 
- */
-static void insert_block(CloogDomain *domain, CloogBlock *block, int level,
-			 struct clast_stmt ***next, CloogInfos *infos)
-{
-    CloogStatement * statement ;
-    struct clast_stmt *subs;
-   
-    if (!block)
-	return;
-
-    for (statement = block->statement; statement; statement = statement->next) {
-	CloogStatement *s_next = statement->next;
-
-	subs = clast_equal(level,infos);
-
-	statement->next = NULL;
-	**next = &new_clast_user_stmt(domain, statement, subs)->stmt;
-	statement->next = s_next;
-	*next = &(**next)->next;
-    }
-}
-
-
-/**
- * insert_loop function:
- * This function converts the content of a CloogLoop structure (loop) into a
- * clast_stmt (inserted at **next).
- * The iterator (level) of
- * the current loop is given by 'level': this is the column number of the
- * domain corresponding to the current loop iterator. The data of a loop are
- * written in this order:
- * 1. The guard of the loop, i.e. each constraint in the domain that does not
- *    depend on the iterator (when the entry in the column 'level' is 0).
- * 2. The iteration domain of the iterator, given by the constraints in the
- *    domain depending on the iterator, i.e.:
- *    * an equality if the iterator has only one value (possibly preceded by
- *      a guard verifying if this value is integral), *OR*
- *    * a loop from the minimum possible value of the iterator to the maximum
- *      possible value.
- * 3. The included statement block.
- * 4. The inner loops (recursive call).
- * 5. The following loops (recursive call).
- * - level is the recursion level or the iteration level that we are printing,
- * - the infos structure gives the user some options about code printing,
- *   the number of parameters in domain (nb_par), and the arrays of iterator
- *   names and parameters (iters and params). 
- **
- * - November   2nd 2001: first version. 
- * - March      6th 2003: infinite domain support. 
- * - April     19th 2003: (debug) NULL loop support. 
- * - June      29th 2003: non-unit strides support.
- * - April     28th 2005: (debug) level is level+equality when print statement!
- * - June      16th 2005: (debug) the N. Vasilache normalization step has been
- *                        added to avoid iteration duplication (see DaeGon Kim
- *                        bug in cloog_program_generate). Try vasilache.cloog
- *                        with and without the call to cloog_polylib_matrix_normalize,
- *                        using -f 8 -l 9 options for an idea.
- * - September 15th 2005: (debug) don't close equality braces when unnecessary.
- * - October   16th 2005: (debug) scalar value is saved for next loops.
- */
-static void insert_loop(CloogLoop * loop, int level,
-			struct clast_stmt ***next, CloogInfos *infos)
-{
-    int equality = 0;
-    CloogConstraintSet *constraints, *temp;
-    struct clast_stmt **top = *next;
-    CloogConstraint *i, *j;
-    int empty_loop = 0;
-
-    /* It can happen that loop be NULL when an input polyhedron is empty. */
-    if (loop == NULL)
-	return;
-
-    /* The constraints do not always have a shape that allows us to generate code from it,
-    * thus we normalize it, we also simplify it with the equalities.
-    */ 
-    temp = cloog_domain_constraints(loop->domain);
-    cloog_constraint_set_normalize(temp,level);
-    constraints = cloog_constraint_set_simplify(temp,infos->equal,level,
-				   infos->names->nb_parameters);
-    cloog_constraint_set_free(temp);
-    if (level) {
-	infos->stride[level - 1] = loop->stride;
-	infos->stride_level++;
-    }
-
-    /* First of all we have to print the guard. */
-    insert_guard(constraints,level, next, infos);
-
-    if (level && cloog_constraint_set_contains_level(constraints, level,
-					infos->names->nb_parameters)) {
-	/* We scan all the constraints to know in which case we are :
-	 * [[if] equation] or [for].
-	 */
-	if (cloog_constraint_is_valid(i =
-		cloog_constraint_set_defining_equality(constraints, level))) {
-          empty_loop = !insert_equation(loop->unsimplified, i,
-                                        cloog_constraint_invalid(), level, next,
-                                        infos);
-	  equality = 1 ;   
-	} else if (cloog_constraint_is_valid(i =
-		    cloog_constraint_set_defining_inequalities(constraints,
-			      level, &j, infos->names->nb_parameters))) {
-            empty_loop = !insert_equation(loop->unsimplified, i, j, level, next,
-                                          infos);
-	} else
-	    empty_loop = !insert_for(loop->unsimplified, constraints, level,
-                                     loop->otl, next, infos);
-    }
-
-    if (!empty_loop) {
-	/* Finally, if there is an included statement block, print it. */
-	insert_block(loop->unsimplified, loop->block, level+equality, next, infos);
-
-	/* Go to the next level. */
-	if (loop->inner != NULL)
-	    insert_loop(loop->inner, level+1, next, infos);
-    }
-
-    if (level) {
-      cloog_equal_del(infos->equal,level);
-      infos->stride_level--;
-    }
-    cloog_constraint_set_free(constraints);
-
-    /* Go to the next loop on the same level. */
-    while (*top)
-	top = &(*top)->next;
-    if (loop->next != NULL)
-	insert_loop(loop->next, level, &top,infos);
-}
-
-
-struct clast_stmt *cloog_clast_create(CloogProgram *program,
-				      CloogOptions *options)
-{
-    CloogInfos *infos = ALLOC(CloogInfos);
-    int nb_levels;
-    struct clast_stmt *root = &new_clast_root(program->names)->stmt;
-    struct clast_stmt **next = &root->next;
-
-    infos->state      = options->state;
-    infos->names    = program->names;
-    infos->options  = options;
-    infos->scaldims = program->scaldims;
-    infos->nb_scattdims = program->nb_scattdims;
-
-    /* Allocation for the array of strides, there is a +1 since the statement can
-    * be included inside an external loop without iteration domain.
-    */ 
-    nb_levels = program->names->nb_scattering+program->names->nb_iterators+1;
-    infos->stride = ALLOCN(CloogStride *, nb_levels);
-    infos->stride_level = 0;
-
-    infos->equal = cloog_equal_alloc(nb_levels,
-			       nb_levels, program->names->nb_parameters);
-	
-    insert_loop(program->loop, 0, &next, infos);
-
-    cloog_equal_free(infos->equal);
-
-    free(infos->stride);
-    free(infos);
-
-    return root;
-}
-
-
-struct clast_stmt *cloog_clast_create_from_input(CloogInput *input,
-						 CloogOptions *options)
-{
-    CloogProgram *program;
-    struct clast_stmt *root;
-
-    program = cloog_program_alloc(input->context, input->ud, options);
-    free(input);
-
-    program = cloog_program_generate(program, options);
-
-    root = cloog_clast_create(program, options);
-    cloog_program_free(program);
-
-    return root;
-}
diff --git a/cloog-0.16.3/source/cloog.c b/cloog-0.16.3/source/cloog.c
deleted file mode 100644
index 0a42a67..0000000
--- a/cloog-0.16.3/source/cloog.c
+++ /dev/null
@@ -1,98 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                             cloog.c                               **
-    **-------------------------------------------------------------------**
-    **       First version: october 25th 2001, CLooG's birth date !      **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-# include <stdlib.h>
-# include <stdio.h>
-# include "../include/cloog/cloog.h"
-
-
-int main(int argv, char * argc[])
-{ CloogProgram * program ;
-  CloogOptions * options ;
-  CloogState *state;
-  FILE * input, * output ;
-   
-  state = cloog_state_malloc();
-
-  /* Options and input/output file setting. */
-  cloog_options_read(state, argv, argc, &input, &output, &options);
-
-  /* Reading the program informations. */
-  program = cloog_program_read(input,options) ;
-  fclose(input) ;
-  
-  /* Generating and printing the code. */
-  program = cloog_program_generate(program,options) ;
-  if (options->structure)
-  cloog_program_print(stdout,program) ;
-  cloog_program_pprint(output,program,options) ;
-  cloog_program_free(program) ;
-
-  /* Printing the allocation statistics if asked. */
-  if (options->leaks) {
-    fprintf(output,"/* Domains    : allocated=%5d, freed=%5d, max=%5d. */\n",
-           state->domain_allocated, state->domain_freed, state->domain_max);
-    fprintf(output,"/* Loops      : allocated=%5d, freed=%5d, max=%5d. */\n",
-           state->loop_allocated, state->loop_freed, state->loop_max);
-    fprintf(output,"/* Statements : allocated=%5d, freed=%5d, max=%5d. */\n",
-           state->statement_allocated, state->statement_freed, state->statement_max);
-    fprintf(output,"/* Blocks     : allocated=%5d, freed=%5d, max=%5d. */\n",
-           state->block_allocated, state->block_freed, state->block_max);
-  }
-
-  /* Inform the user in case of a problem with the allocation statistics. */
-  if ((state->domain_allocated    != state->domain_freed)    ||
-      (state->loop_allocated      != state->loop_freed)      ||
-      (state->statement_allocated != state->statement_freed) ||
-      (state->block_allocated     != state->block_freed))
-  {
-    cloog_msg(options, CLOOG_INFO,
-            "an internal problem has been detected (it should have"
-	    " no\n             consequence on the correctness of the output)."
-	    " Please send (if\n	     you can) your input file, the first line "
-	    "given by typing 'cloog -v'\n	     and your full command "
-            "line call to CLooG including options to\n	     <cedric.bastoul"
-	    "@inria.fr>. Thank you for your participation to get\n"
-	    "	     CLooG better and safer.\n") ;
-  }
-
-  cloog_options_free(options) ;
-  cloog_state_free(state);
-  fclose(output) ;
-  return 0;
-}
-
diff --git a/cloog-0.16.3/source/input.c b/cloog-0.16.3/source/input.c
deleted file mode 100644
index 1b83a97..0000000
--- a/cloog-0.16.3/source/input.c
+++ /dev/null
@@ -1,177 +0,0 @@
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include "../include/cloog/cloog.h"
-
-#define ALLOC(type) (type*)malloc(sizeof(type))
-
-static char *next_line(FILE *input, char *line, unsigned len)
-{
-	char *p;
-
-	do {
-		if (!(p = fgets(line, len, input)))
-			return NULL;
-		while (isspace(*p) && *p != '\n')
-			++p;
-	} while (*p == '#' || *p == '\n');
-
-	return p;
-}
-
-/**
- * Read input from a .cloog file, putting most of the information
- * in the returned CloogInput.  The chosen language is put in
- * options->language.
- */
-CloogInput *cloog_input_read(FILE *file, CloogOptions *options)
-{
-	char line[MAX_STRING];
-	char language;
-	CloogDomain *context;
-	CloogUnionDomain *ud;
-	int nb_par;
-
-	/* First of all, we read the language to use. */
-	if (!next_line(file, line, sizeof(line)))
-		cloog_die("Input error.\n");
-	if (sscanf(line, "%c", &language) != 1)
-		cloog_die("Input error.\n");
-   
-	if (language == 'f')
-		options->language = LANGUAGE_FORTRAN;
-	else
-		options->language = LANGUAGE_C;
-
-	/* We then read the context data. */
-	context = cloog_domain_read_context(options->state, file);
-	nb_par = cloog_domain_parameter_dimension(context);
-
-	ud = cloog_union_domain_read(file, nb_par, options);
-
-	return cloog_input_alloc(context, ud);
-}
-
-/**
- * Create a CloogInput from a CloogDomain context and a CloogUnionDomain.
- */
-CloogInput *cloog_input_alloc(CloogDomain *context, CloogUnionDomain *ud)
-{
-	CloogInput *input;
-
-	input = ALLOC(CloogInput);
-	if (!input)
-		cloog_die("memory overflow.\n");
-
-	input->context = context;
-	input->ud = ud;
-
-	return input;
-}
-
-void cloog_input_free(CloogInput *input)
-{
-	cloog_domain_free(input->context);
-	cloog_union_domain_free(input->ud);
-	free(input);
-}
-
-static void print_names(FILE *file, CloogUnionDomain *ud,
-	enum cloog_dim_type type, const char *name)
-{
-	int i;
-
-	fprintf(file, "\n%d # %s name(s)\n", ud->name[type] ? 1 : 0, name);
-	if (!ud->name[type])
-		return;
-
-	for (i = 0; i < ud->n_name[type]; i++)
-		fprintf(file, "%s ", ud->name[type][i]);
-
-	fprintf(file, "\n");
-}
-
-/**
- * Dump the .cloog description of a CloogInput and a CloogOptions data structure
- * into a file. The generated .cloog file will contain the same information as
- * the data structures. The file can be used to run the cloog program on the
- * example.
- */
-void cloog_input_dump_cloog(FILE *file, CloogInput *input, CloogOptions *opt)
-{
-        int i, num_statements;
-        CloogUnionDomain *ud = input->ud;
-        CloogNamedDomainList *ndl = ud->domain;
-
-        fprintf(file,
-                "# CLooG -> CLooG\n"
-                "# This is an automatic dump of a CLooG input file from a "
-                "CloogInput data\n"
-                "# structure.\n\n");
-
-        /* Language. */
-        if (opt->language == LANGUAGE_FORTRAN) {
-                fprintf(file, "# Language: FORTRAN\n");
-                fprintf(file, "f\n\n");
-        } else {
-                fprintf(file, "# Language: C\n");
-                fprintf(file, "c\n\n");
-        }
-
-        /* Context. */
-        fprintf(file, "# Context:\n");
-        cloog_domain_print_constraints(file, input->context, 1);
-
-	print_names(file, ud, CLOOG_PARAM, "Parameter");
-
-        /* Statement number. */
-        i = 0;
-        while (ndl != NULL) {
-        	i++;
-        	ndl = ndl->next;
-        }
-        num_statements = i;
-        fprintf(file, "\n# Statement number:\n%d\n\n", num_statements);
-
-        /* Iteration domains. */
-        i = 1;
-        ndl = ud->domain;
-        while (ndl != NULL) {
-                fprintf(file, "# Iteration domain of statement %d (%s).\n", i,
-                        ndl->name);
-
-                cloog_domain_print_constraints(file, ndl->domain, 1);
-                fprintf(file,"\n0 0 0 # For future options.\n\n");
-
-                i++;
-                ndl = ndl->next;
-        }
-
-	print_names(file, ud, CLOOG_ITER, "Iterator");
-
-        /* Exit, if no scattering is supplied. */
-        if (!ud->domain || !ud->domain->scattering) {
-                fprintf(file, "# No scattering functions.\n0\n\n");
-                return;
-        }
-
-        /* Scattering relations. */
-        fprintf(file,
-                "# --------------------- SCATTERING --------------------\n");
-
-        fprintf(file, "%d # Scattering functions\n", num_statements);
-
-        i = 1;
-        ndl = ud->domain;
-        while (ndl != NULL) {
-                fprintf(file, "\n# Scattering of statement %d (%s).\n", i,
-                        ndl->name);
-
-                cloog_scattering_print_constraints(file, ndl->scattering);
-
-                i++;
-                ndl = ndl->next;
-        }
-
-	print_names(file, ud, CLOOG_SCAT, "Scattering dimension");
-}
diff --git a/cloog-0.16.3/source/int.c b/cloog-0.16.3/source/int.c
deleted file mode 100644
index 67f62df..0000000
--- a/cloog-0.16.3/source/int.c
+++ /dev/null
@@ -1,177 +0,0 @@
-#include <stdlib.h>
-#include "../include/cloog/cloog.h"
-
-#define ALLOC(type) (type*)malloc(sizeof(type))
-#define ALLOCN(type,n) (type*)malloc((n)*sizeof(type))
-
-#if defined(CLOOG_INT_INT) || \
-    defined(CLOOG_INT_LONG) || \
-    defined(CLOOG_INT_LONG_LONG)
-
-cloog_int_t cloog_gcd(cloog_int_t a, cloog_int_t b)
-{
-	while (a) {
-		cloog_int_t t = b % a;
-		b = a;
-		a = t;
-	}
-	if (b < 0)
-		b = -b;
-	return b;
-}
-
-#endif
-
-struct cloog_vec *cloog_vec_alloc(unsigned size)
-{
-	int i;
-	struct cloog_vec *vec;
-
-	vec = ALLOC(struct cloog_vec);
-	if (!vec)
-		return NULL;
-
-	vec->p = ALLOCN(cloog_int_t, size);
-	if (!vec->p)
-		goto error;
-	vec->size = size;
-
-	for (i = 0; i < size; ++i)
-		cloog_int_init(vec->p[i]);
-
-	return vec;
-error:
-	free(vec);
-	return NULL;
-}
-
-void cloog_vec_free(struct cloog_vec *vec)
-{
-	int i;
-
-	if (!vec)
-		return;
-
-	for (i = 0; i < vec->size; ++i)
-		cloog_int_clear(vec->p[i]);
-	free(vec->p);
-	free(vec);
-}
-
-void cloog_vec_dump(struct cloog_vec *vec)
-{
-	int i;
-
-	for (i = 0; i < vec->size; ++i) {
-		cloog_int_print(stderr, vec->p[i]);
-		fprintf(stderr, " ");
-	}
-	fprintf(stderr, "\n");
-}
-
-int cloog_seq_first_non_zero(cloog_int_t *p, unsigned len)
-{
-	int i;
-
-	for (i = 0; i < len; ++i)
-		if (!cloog_int_is_zero(p[i]))
-			return i;
-	return -1;
-}
-
-void cloog_seq_neg(cloog_int_t *dst, cloog_int_t *src, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		cloog_int_neg(dst[i], src[i]);
-}
-
-void cloog_seq_cpy(cloog_int_t *dst, cloog_int_t *src, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		cloog_int_set(dst[i], src[i]);
-}
-
-static void cloog_seq_scale_down(cloog_int_t *dst, cloog_int_t *src, cloog_int_t m, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		cloog_int_divexact(dst[i], src[i], m);
-}
-
-void cloog_seq_combine(cloog_int_t *dst, cloog_int_t m1, cloog_int_t *src1,
-			cloog_int_t m2, cloog_int_t *src2, unsigned len)
-{
-	int i;
-	cloog_int_t tmp;
-
-	cloog_int_init(tmp);
-	for (i = 0; i < len; ++i) {
-		cloog_int_mul(tmp, m1, src1[i]);
-		cloog_int_addmul(tmp, m2, src2[i]);
-		cloog_int_set(dst[i], tmp);
-	}
-	cloog_int_clear(tmp);
-}
-
-static int cloog_seq_abs_min_non_zero(cloog_int_t *p, unsigned len)
-{
-	int i, min = cloog_seq_first_non_zero(p, len);
-	if (min < 0)
-		return -1;
-	for (i = min + 1; i < len; ++i) {
-		if (cloog_int_is_zero(p[i]))
-			continue;
-		if (cloog_int_abs_lt(p[i], p[min]))
-			min = i;
-	}
-	return min;
-}
-
-void cloog_seq_gcd(cloog_int_t *p, unsigned len, cloog_int_t *gcd)
-{
-	int i, min = cloog_seq_abs_min_non_zero(p, len);
-
-	if (min < 0) {
-		cloog_int_set_si(*gcd, 0);
-		return;
-	}
-	cloog_int_abs(*gcd, p[min]);
-	for (i = 0; cloog_int_cmp_si(*gcd, 1) > 0 && i < len; ++i) {
-		if (i == min)
-			continue;
-		if (cloog_int_is_zero(p[i]))
-			continue;
-		cloog_int_gcd(*gcd, *gcd, p[i]);
-	}
-}
-
-int cloog_seq_is_neg(cloog_int_t *p1, cloog_int_t *p2, unsigned len)
-{
-	int i;
-
-	for (i = 0; i < len; ++i) {
-		if (cloog_int_abs_ne(p1[i], p2[i]))
-			return 0;
-		if (cloog_int_is_zero(p1[i]))
-			continue;
-		if (cloog_int_eq(p1[i], p2[i]))
-			return 0;
-	}
-	return 1;
-}
-
-void cloog_seq_normalize(cloog_int_t *p, unsigned len)
-{
-	cloog_int_t gcd;
-
-	if (len == 0)
-		return;
-
-	cloog_int_init(gcd);
-	cloog_seq_gcd(p, len, &gcd);
-	if (!cloog_int_is_zero(gcd) && !cloog_int_is_one(gcd))
-		cloog_seq_scale_down(p, p, gcd, len);
-	cloog_int_clear(gcd);
-}
diff --git a/cloog-0.16.3/source/isl/backend.c b/cloog-0.16.3/source/isl/backend.c
deleted file mode 100644
index 6ddb9f9..0000000
--- a/cloog-0.16.3/source/isl/backend.c
+++ /dev/null
@@ -1,37 +0,0 @@
-#include <cloog/isl/cloog.h>
-
-/**
- * Allocate and initialize full state.
- */
-CloogState *cloog_state_malloc(void)
-{
-	return cloog_isl_state_malloc(NULL);
-}
-
-/**
- * Allocate and initialize full state for isl backend.
- */
-CloogState *cloog_isl_state_malloc(struct isl_ctx *ctx)
-{
-	CloogState *state;
-	int allocated = !ctx;
-
-	state = cloog_core_state_malloc();
-	if (!ctx)
-		ctx = isl_ctx_alloc();
-	state->backend = isl_alloc_type(ctx, CloogBackend);
-	state->backend->ctx = ctx;
-	state->backend->ctx_allocated = allocated;
-	return state;
-}
-
-/**
- * Free state and backend independent parts.
- */
-void cloog_state_free(CloogState *state)
-{
-	if (state->backend->ctx_allocated)
-		isl_ctx_free(state->backend->ctx);
-	free(state->backend);
-	cloog_core_state_free(state);
-}
diff --git a/cloog-0.16.3/source/isl/constraints.c b/cloog-0.16.3/source/isl/constraints.c
deleted file mode 100644
index 873a0b9..0000000
--- a/cloog-0.16.3/source/isl/constraints.c
+++ /dev/null
@@ -1,967 +0,0 @@
-#include <stdlib.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <cloog/isl/cloog.h>
-#include <cloog/isl/backend.h>
-#include <isl/aff.h>
-#include <isl/set.h>
-
-
-#define ALLOC(type) (type*)malloc(sizeof(type))
-#define ALLOCN(type,n) (type*)malloc((n)*sizeof(type))
-
-CloogConstraintSet *cloog_constraint_set_from_isl_basic_set(struct isl_basic_set *bset)
-{
-	return (CloogConstraintSet *)bset;
-}
-
-CloogConstraint *cloog_constraint_from_isl_constraint(struct isl_constraint *constraint)
-{
-	return (CloogConstraint *)constraint;
-}
-
-isl_constraint *cloog_constraint_to_isl(CloogConstraint *constraint)
-{
-	return (isl_constraint *)constraint;
-}
-
-isl_basic_set *cloog_constraints_set_to_isl(CloogConstraintSet *constraints)
-{
-	return (isl_basic_set *)constraints;
-}
-
-
-/******************************************************************************
- *                             Memory leaks hunting                           *
- ******************************************************************************/
-
-
-
-void cloog_constraint_set_free(CloogConstraintSet *constraints)
-{
-	isl_basic_set_free(cloog_constraints_set_to_isl(constraints));
-}
-
-
-int cloog_constraint_set_contains_level(CloogConstraintSet *constraints,
-			int level, int nb_parameters)
-{
-	isl_basic_set *bset;
-	bset = cloog_constraints_set_to_isl(constraints);
-	return isl_basic_set_dim(bset, isl_dim_set) >= level;
-}
-
-struct cloog_isl_dim {
-	enum isl_dim_type type;
-	int		  pos;
-};
-
-static struct cloog_isl_dim basic_set_cloog_dim_to_isl_dim(
-	__isl_keep isl_basic_set *bset, int pos)
-{
-	enum isl_dim_type types[] = { isl_dim_set, isl_dim_div, isl_dim_param };
-	int i;
-	struct cloog_isl_dim ci_dim;
-
-	for (i = 0; i < 3; ++i) {
-		unsigned dim = isl_basic_set_dim(bset, types[i]);
-		if (pos < dim) {
-			ci_dim.type = types[i];
-			ci_dim.pos = pos;
-			return ci_dim;
-		}
-		pos -= dim;
-	}
-	assert(0);
-}
-
-static struct cloog_isl_dim set_cloog_dim_to_isl_dim(
-	CloogConstraintSet *constraints, int pos)
-{
-	isl_basic_set *bset;
-
-	bset = cloog_constraints_set_to_isl(constraints);
-	return basic_set_cloog_dim_to_isl_dim(bset, pos);
-}
-
-/* Check if the variable at position level is defined by an
- * equality.  If so, return the row number.  Otherwise, return -1.
- */
-CloogConstraint *cloog_constraint_set_defining_equality(
-	CloogConstraintSet *constraints, int level)
-{
-	struct isl_constraint *c;
-	struct cloog_isl_dim dim;
-	isl_basic_set *bset;
-
-	bset = cloog_constraints_set_to_isl(constraints);
-	dim = set_cloog_dim_to_isl_dim(constraints, level - 1);
-	if (isl_basic_set_has_defining_equality(bset, dim.type, dim.pos, &c))
-		return cloog_constraint_from_isl_constraint(c);
-	else
-		return NULL;
-}
-
-
-struct cloog_isl_other {
-	int level;
-	int found;
-	isl_constraint *u;
-	isl_constraint *l;
-};
-
-
-/* Set other->found to 1 if the given constraint involves other->level
- * and is different from other->u and other->l.
- */
-static int check_other_constraint(__isl_take isl_constraint *c, void *user)
-{
-	struct cloog_isl_other *other = user;
-	CloogConstraint *cc;
-
-	if (!isl_constraint_is_equal(c, other->l) &&
-	    !isl_constraint_is_equal(c, other->u)) {
-		cc = cloog_constraint_from_isl_constraint(c);
-		if (cloog_constraint_involves(cc, other->level - 1))
-			other->found = 1;
-	}
-
-	isl_constraint_free(c);
-
-	return other->found ? -1 : 0;
-}
-
-
-/* Check if the variable (e) at position level is defined by a
- * pair of inequalities
- *		 <a, i> + -m e +  <b, p> + k1 >= 0
- *		<-a, i> +  m e + <-b, p> + k2 >= 0
- * with 0 <= k1 + k2 < m
- * If so return the row number of the upper bound and set *lower
- * to the row number of the lower bound.  If not, return -1.
- *
- * If the variable at position level occurs in any other constraint,
- * then we currently return -1.  The modulo guard that we would generate
- * would still be correct, but we would also need to generate
- * guards corresponding to the other constraints, and this has not
- * been implemented yet.
- */
-CloogConstraint *cloog_constraint_set_defining_inequalities(
-	CloogConstraintSet *constraints,
-	int level, CloogConstraint **lower, int nb_par)
-{
-	struct isl_constraint *u;
-	struct isl_constraint *l;
-	struct cloog_isl_dim dim;
-	struct isl_basic_set *bset;
-	struct cloog_isl_other other;
-
-	bset = cloog_constraints_set_to_isl(constraints);
-	dim = set_cloog_dim_to_isl_dim(constraints, level - 1);
-	if (!isl_basic_set_has_defining_inequalities(bset, dim.type, dim.pos,
-								&l, &u))
-		return cloog_constraint_invalid();
-
-	other.l = l;
-	other.u = u;
-	other.found = 0;
-	other.level = level;
-	isl_basic_set_foreach_constraint(bset, &check_other_constraint, &other);
-	if (other.found) {
-		isl_constraint_free(l);
-		isl_constraint_free(u);
-		*lower = NULL;
-		return NULL;
-	}
-	*lower = cloog_constraint_from_isl_constraint(l);
-	return cloog_constraint_from_isl_constraint(u);
-}
-
-int cloog_constraint_set_total_dimension(CloogConstraintSet *constraints)
-{
-	isl_basic_set *bset;
-	bset = cloog_constraints_set_to_isl(constraints);
-	return isl_basic_set_total_dim(bset);
-}
-
-int cloog_constraint_set_n_iterators(CloogConstraintSet *constraints, int n_par)
-{
-	isl_basic_set *bset;
-	bset = cloog_constraints_set_to_isl(constraints);
-	return isl_basic_set_dim(bset, isl_dim_set);
-}
-
-
-/******************************************************************************
- *                        Equalities spreading functions                      *
- ******************************************************************************/
-
-
-/* Equalities are stored inside a Matrix data structure called "equal".
- * This matrix has (nb_scattering + nb_iterators + 1) rows (i.e. total
- * dimensions + 1, the "+ 1" is because a statement can be included inside an
- * external loop without iteration domain), and (nb_scattering + nb_iterators +
- * nb_parameters + 2) columns (all unknowns plus the scalar plus the equality
- * type). The ith row corresponds to the equality "= 0" for the ith dimension
- * iterator. The first column gives the equality type (0: no equality, then
- * EQTYPE_* -see pprint.h-). At each recursion of pprint, if an equality for
- * the current level is found, the corresponding row is updated. Then the
- * equality if it exists is used to simplify expressions (e.g. if we have 
- * "i+1" while we know that "i=2", we simplify it in "3"). At the end of
- * the pprint call, the corresponding row is reset to zero.
- */
-
-CloogEqualities *cloog_equal_alloc(int n, int nb_levels, int nb_parameters)
-{
-	int i;
-	CloogEqualities *equal = ALLOC(CloogEqualities);
-
-	equal->total_dim = nb_levels - 1 + nb_parameters;
-	equal->n = n;
-	equal->constraints = ALLOCN(isl_constraint *, n);
-	equal->types = ALLOCN(int, n);
-	for (i = 0; i < n; ++i) {
-		equal->constraints[i] = NULL;
-		equal->types[i] = EQTYPE_NONE;
-	}
-	return equal;
-}
-
-int cloog_equal_total_dimension(CloogEqualities *equal)
-{
-	return equal->total_dim;
-}
-
-void cloog_equal_free(CloogEqualities *equal)
-{
-	int i;
-
-	for (i = 0; i < equal->n; ++i)
-		isl_constraint_free(equal->constraints[i]);
-	free(equal->constraints);
-	free(equal->types);
-	free(equal);
-}
-
-int cloog_equal_count(CloogEqualities *equal)
-{
-	return equal->n;
-}
-
-
-/**
- * cloog_constraint_equal_type function :
- * This function returns the type of the equality in the constraint (line) of
- * (constraints) for the element (level). An equality is 'constant' iff all
- * other factors are null except the constant one. It is a 'pure item' iff
- * it is equal or opposite to a single variable or parameter.
- * Otherwise it is an 'affine expression'.
- * For instance:
- *   i = -13 is constant, i = j, j = -M are pure items,
- *   j = 2*M, i = j+1, 2*j = M are affine expressions.
- *
- * - constraints is the matrix of constraints,
- * - level is the column number in equal of the element which is 'equal to',
- */
-static int cloog_constraint_equal_type(CloogConstraint *cc, int level)
-{ 
-	int i;
-	isl_int c;
-	int type = EQTYPE_NONE;
-	struct isl_constraint *constraint = cloog_constraint_to_isl(cc);
-    
-	isl_int_init(c);
-	isl_constraint_get_constant(constraint, &c);
-	if (!isl_int_is_zero(c))
-		type = EQTYPE_CONSTANT;
-	isl_constraint_get_coefficient(constraint, isl_dim_set, level - 1, &c);
-	if (!isl_int_is_one(c) && !isl_int_is_negone(c))
-		type = EQTYPE_EXAFFINE;
-	for (i = 0; i < isl_constraint_dim(constraint, isl_dim_param); ++i) {
-		isl_constraint_get_coefficient(constraint, isl_dim_param, i, &c);
-		if (isl_int_is_zero(c))
-			continue;
-		if ((!isl_int_is_one(c) && !isl_int_is_negone(c)) ||
-		    type != EQTYPE_NONE) {
-			type = EQTYPE_EXAFFINE;
-			break;
-		}
-		type = EQTYPE_PUREITEM;
-	}
-	for (i = 0; i < isl_constraint_dim(constraint, isl_dim_set); ++i) {
-		if (i == level - 1)
-			continue;
-		isl_constraint_get_coefficient(constraint, isl_dim_set, i, &c);
-		if (isl_int_is_zero(c))
-			continue;
-		if ((!isl_int_is_one(c) && !isl_int_is_negone(c)) ||
-		    type != EQTYPE_NONE) {
-			type = EQTYPE_EXAFFINE;
-			break;
-		}
-		type = EQTYPE_PUREITEM;
-	}
-	for (i = 0; i < isl_constraint_dim(constraint, isl_dim_div); ++i) {
-		isl_constraint_get_coefficient(constraint, isl_dim_div, i, &c);
-		if (isl_int_is_zero(c))
-			continue;
-		if ((!isl_int_is_one(c) && !isl_int_is_negone(c)) ||
-		    type != EQTYPE_NONE) {
-			type = EQTYPE_EXAFFINE;
-			break;
-		}
-		type = EQTYPE_PUREITEM;
-	}
-	isl_int_clear(c);
-
-	if (type == EQTYPE_NONE)
-		type = EQTYPE_CONSTANT;
-
-	return type;
-}
-
-
-int cloog_equal_type(CloogEqualities *equal, int level)
-{
-	return equal->types[level-1];
-}
-
-
-/**
- * cloog_equal_add function:
- * This function updates the row (level-1) of the equality matrix (equal) with
- * the row that corresponds to the row (line) of the matrix (matrix).
- * - equal is the matrix of equalities,
- * - matrix is the matrix of constraints,
- * - level is the column number in matrix of the element which is 'equal to',
- * - line is the line number in matrix of the constraint we want to study,
- * - the infos structure gives the user all options on code printing and more.
- **
- * line is set to an invalid constraint for equalities that CLooG itself has
- * discovered because the lower and upper bound of a loop happened to be equal.
- * This situation shouldn't happen in the isl port since isl should
- * have found the equality itself.
- */
-void cloog_equal_add(CloogEqualities *equal, CloogConstraintSet *matrix,
-			int level, CloogConstraint *line, int nb_par)
-{ 
-	isl_constraint *c;
-	assert(cloog_constraint_is_valid(line));
-  
-	equal->types[level-1] = cloog_constraint_equal_type(line, level);
-	c = cloog_constraint_to_isl(line);
-	equal->constraints[level - 1] = isl_constraint_copy(c);
-}
-
-
-/**
- * cloog_equal_del function :
- * This function reset the equality corresponding to the iterator (level)
- * in the equality matrix (equal).
- * - July 2nd 2002: first version. 
- */
-void cloog_equal_del(CloogEqualities *equal, int level)
-{ 
-	equal->types[level-1] = EQTYPE_NONE;
-	isl_constraint_free(equal->constraints[level - 1]);
-	equal->constraints[level-1] = NULL;
-}
-
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-
-/**
- * Function cloog_constraint_set_normalize:
- * This function will modify the constraint system in such a way that when
- * there is an equality depending on the element at level 'level', there are
- * no more (in)equalities depending on this element.
- *
- * The simplified form of isl automatically satisfies this condition.
- */
-void cloog_constraint_set_normalize(CloogConstraintSet *matrix, int level)
-{
-}
-
-
-
-/**
- * cloog_constraint_set_copy function:
- * this functions builds and returns a "hard copy" (not a pointer copy) of a
- * CloogConstraintSet data structure.
- */
-CloogConstraintSet *cloog_constraint_set_copy(CloogConstraintSet *constraints)
-{
-	isl_basic_set *bset;
-	bset = cloog_constraints_set_to_isl(constraints);
-	return cloog_constraint_set_from_isl_basic_set(isl_basic_set_dup(bset));
-}
-
-
-/**
- * cloog_constraint_set_simplify function:
- * this function simplify all constraints inside the matrix "matrix" thanks to
- * an equality matrix "equal" that gives for some elements of the affine
- * constraint an equality with other elements, preferably constants.
- * For instance, if a row of the matrix contains i+j+3>=0 and the equality
- * matrix gives i=n and j=2, the constraint is simplified to n+3>=0. The
- * simplified constraints are returned back inside a new simplified matrix.
- * - matrix is the set of constraints to simplify,
- * - equal is the matrix of equalities,
- * - level is a level we don't want to simplify (-1 if none),
- * - nb_par is the number of parameters of the program.
- **
- * isl should have performed these simplifications already in isl_set_gist.
- */
-CloogConstraintSet *cloog_constraint_set_simplify(CloogConstraintSet *matrix,
-	CloogEqualities *equal, int level, int nb_par)
-{
-	return cloog_constraint_set_copy(matrix);
-}
-
-
-static struct cloog_isl_dim constraint_cloog_dim_to_isl_dim(
-					CloogConstraint *constraint, int pos)
-{
-	enum isl_dim_type types[] = { isl_dim_set, isl_dim_div, isl_dim_param };
-	int i;
-	struct cloog_isl_dim ci_dim;
-
-	for (i = 0; i < 3; ++i) {
-		isl_constraint *c = cloog_constraint_to_isl(constraint);
-		unsigned dim = isl_constraint_dim(c, types[i]);
-		if (pos < dim) {
-			ci_dim.type = types[i];
-			ci_dim.pos = pos;
-			return ci_dim;
-		}
-		pos -= dim;
-	}
-	assert(0);
-}
-
-static struct clast_expr *div_expr(CloogConstraint *constraint, int pos,
-					CloogNames *names)
-{
-	int i, nb_elts;
-	unsigned dim = cloog_constraint_total_dimension(constraint);
-	cloog_int_t c;
-	struct clast_reduction *r;
-	struct clast_expr *e = NULL;
-	struct isl_div *div;
-
-	div = isl_constraint_div(cloog_constraint_to_isl(constraint), pos);
-
-	cloog_int_init(c);
-	for (i = 0, nb_elts = 0; i < dim; ++i) {
-		struct cloog_isl_dim dim;
-
-		dim = constraint_cloog_dim_to_isl_dim(constraint, i);
-		isl_div_get_coefficient(div, dim.type, dim.pos, &c);
-		if (!cloog_int_is_zero(c))
-			++nb_elts;
-	}
-	isl_div_get_constant(div, &c);
-	if (!cloog_int_is_zero(c))
-		++nb_elts;
-
-	r = new_clast_reduction(clast_red_sum, nb_elts);
-	for (i = 0, nb_elts = 0; i < dim; ++i) {
-		struct clast_expr *v;
-		struct cloog_isl_dim dim;
-
-		dim = constraint_cloog_dim_to_isl_dim(constraint, i);
-		isl_div_get_coefficient(div, dim.type, dim.pos, &c);
-		if (cloog_int_is_zero(c))
-			continue;
-
-		v = cloog_constraint_variable_expr(constraint, 1 + i, names);
-
-		r->elts[nb_elts++] = &new_clast_term(c, v)->expr;
-	}
-	isl_div_get_constant(div, &c);
-	if (!cloog_int_is_zero(c))
-		r->elts[nb_elts++] = &new_clast_term(c, NULL)->expr;
-
-	isl_div_get_denominator(div, &c);
-	e = &new_clast_binary(clast_bin_fdiv, &r->expr, c)->expr;
-
-	cloog_int_clear(c);
-
-	isl_div_free(div);
-
-	return e;
-}
-
-/**
- * Return clast_expr corresponding to the variable "level" (1 based) in
- * the given constraint.
- */
-struct clast_expr *cloog_constraint_variable_expr(CloogConstraint *constraint,
-	int level, CloogNames *names)
-{
-	struct cloog_isl_dim dim;
-	const char *name;
-
-	assert(constraint);
-
-	dim = constraint_cloog_dim_to_isl_dim(constraint, level - 1);
-	if (dim.type == isl_dim_div)
-		return div_expr(constraint, dim.pos, names);
-
-	if (dim.type == isl_dim_set)
-		name = cloog_names_name_at_level(names, level);
-	else
-		name = names->parameters[dim.pos];
-
-	return &new_clast_name(name)->expr;
-}
-
-
-/**
- * Return true if constraint c involves variable v (zero-based).
- */
-int cloog_constraint_involves(CloogConstraint *constraint, int v)
-{
-	isl_int c;
-	int res;
-
-	isl_int_init(c);
-	cloog_constraint_coefficient_get(constraint, v, &c);
-	res = !isl_int_is_zero(c);
-	isl_int_clear(c);
-	return res;
-}
-
-int cloog_constraint_is_lower_bound(CloogConstraint *constraint, int v)
-{
-	isl_int c;
-	int res;
-
-	isl_int_init(c);
-	cloog_constraint_coefficient_get(constraint, v, &c);
-	res = isl_int_is_pos(c);
-	isl_int_clear(c);
-	return res;
-}
-
-int cloog_constraint_is_upper_bound(CloogConstraint *constraint, int v)
-{
-	isl_int c;
-	int res;
-
-	isl_int_init(c);
-	cloog_constraint_coefficient_get(constraint, v, &c);
-	res = isl_int_is_neg(c);
-	isl_int_clear(c);
-	return res;
-}
-
-int cloog_constraint_is_equality(CloogConstraint *constraint)
-{
-	return isl_constraint_is_equality(cloog_constraint_to_isl(constraint));
-}
-
-CloogConstraintSet *cloog_constraint_set_drop_constraint(
-	CloogConstraintSet *constraints, CloogConstraint *constraint)
-{
-	isl_basic_set *bset;
-	isl_constraint *c;
-
-	bset = cloog_constraints_set_to_isl(constraints);
-	c = cloog_constraint_to_isl(cloog_constraint_copy(constraint));
-	bset = isl_basic_set_drop_constraint(bset, c);
-	return cloog_constraint_set_from_isl_basic_set(bset);
-}
-
-void cloog_constraint_coefficient_get(CloogConstraint *constraint,
-			int var, cloog_int_t *val)
-{
-	struct cloog_isl_dim dim;
-	isl_constraint *c;
-
-	if (!constraint)
-		return;
-
-	dim = constraint_cloog_dim_to_isl_dim(constraint, var);
-	c = cloog_constraint_to_isl(constraint);
-	isl_constraint_get_coefficient(c, dim.type, dim.pos, val);
-}
-
-void cloog_constraint_coefficient_set(CloogConstraint *constraint,
-			int var, cloog_int_t val)
-{
-	struct cloog_isl_dim dim;
-	isl_constraint *c;
-
-	assert(constraint);
-
-	dim = constraint_cloog_dim_to_isl_dim(constraint, var);
-	c = cloog_constraint_to_isl(constraint);
-	isl_constraint_set_coefficient(c, dim.type, dim.pos, val);
-}
-
-void cloog_constraint_constant_get(CloogConstraint *constraint, cloog_int_t *val)
-{
-	isl_constraint_get_constant(cloog_constraint_to_isl(constraint), val);
-}
-
-/**
- * Copy the coefficient of constraint c into dst in PolyLib order,
- * i.e., first the coefficients of the variables, then the coefficients
- * of the parameters and finally the constant.
- */
-void cloog_constraint_copy_coefficients(CloogConstraint *constraint,
-					cloog_int_t *dst)
-{
-	int i;
-	unsigned dim;
-
-	dim = cloog_constraint_total_dimension(constraint);
-
-	for (i = 0; i < dim; ++i)
-		cloog_constraint_coefficient_get(constraint, i, dst+i);
-	cloog_constraint_constant_get(constraint, dst+dim);
-}
-
-CloogConstraint *cloog_constraint_invalid(void)
-{
-	return NULL;
-}
-
-int cloog_constraint_is_valid(CloogConstraint *constraint)
-{
-	return constraint != NULL;
-}
-
-int cloog_constraint_total_dimension(CloogConstraint *constraint)
-{
-	isl_constraint *c;
-	c = cloog_constraint_to_isl(constraint);
-	return isl_constraint_dim(c, isl_dim_all);
-}
-
-
-/**
- * Check whether there is any need for the constraint "upper" on
- * "level" to get reduced.
- * In case of the isl backend, there should be no need to do so
- * if the level corresponds to an existentially quantified variable.
- * Moreover, the way reduction is performed does not work for such
- * variables since its position might chance during the construction
- * of a set for reduction.
- */
-int cloog_constraint_needs_reduction(CloogConstraint *upper, int level)
-{
-	isl_basic_set *bset;
-	isl_constraint *c;
-	struct cloog_isl_dim dim;
-
-	c = cloog_constraint_to_isl(upper);
-	bset = isl_basic_set_from_constraint(isl_constraint_copy(c));
-	dim = basic_set_cloog_dim_to_isl_dim(bset, level - 1);
-	isl_basic_set_free(bset);
-
-	return dim.type == isl_dim_set;
-}
-
-
-/**
- * Create a CloogConstraintSet containing enough information to perform
- * a reduction on the upper equality (in this case lower is an invalid
- * CloogConstraint) or the pair of inequalities upper and lower
- * from within insert_modulo_guard.
- * In the isl backend, we return a CloogConstraintSet containing both
- * bounds, as the stride may change during the reduction and we may
- * need to recompute the bound on the modulo expression.
- */
-CloogConstraintSet *cloog_constraint_set_for_reduction(CloogConstraint *upper,
-	CloogConstraint *lower)
-{
-	struct isl_basic_set *bset;
-	isl_constraint *c;
-
-	c = cloog_constraint_to_isl(upper);
-	bset = isl_basic_set_from_constraint(isl_constraint_copy(c));
-	if (cloog_constraint_is_valid(lower)) {
-		c = cloog_constraint_to_isl(lower);
-		bset = isl_basic_set_add_constraint(bset,
-						    isl_constraint_copy(c));
-	}
-	return cloog_constraint_set_from_isl_basic_set(bset);
-}
-
-
-static int add_constant_term(CloogConstraint *c, void *user)
-{
-	isl_int *bound = (isl_int *)user;
-	isl_int v;
-
-	isl_int_init(v);
-
-	cloog_constraint_constant_get(c, &v);
-	isl_int_add(*bound, *bound, v);
-
-	isl_int_clear(v);
-
-	return 0;
-}
-
-
-/* Return an isl_basic_set representation of the equality stored
- * at position i in the given CloogEqualities.
- */
-static __isl_give isl_basic_set *equality_to_basic_set(CloogEqualities *equal,
-	int i)
-{
-	isl_constraint *c;
-	isl_basic_set *bset;
-	unsigned nparam;
-	unsigned nvar;
-
-	c = isl_constraint_copy(equal->constraints[i]);
-	bset = isl_basic_set_from_constraint(c);
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-	bset = isl_basic_set_add(bset, isl_dim_set,
-				 equal->total_dim - (nparam + nvar));
-	return bset;
-}
-
-/**
- * Reduce the modulo guard expressed by "constraints" using equalities
- * found in outer nesting levels (stored in "equal").
- * The modulo guard may be an equality or a pair of inequalities.
- * In case of a pair of inequalities, *bound contains the bound on the
- * corresponding modulo expression.  If any reduction is performed
- * then this bound is recomputed.
- *
- * "level" may not correspond to an existentially quantified variable.
- *
- * We first check if there are any equalities we can use.  If not,
- * there is again nothing to reduce.
- * For the actual reduction, we use isl_basic_set_gist, but this
- * function will only perform the reduction we want here if the
- * the variable that imposes the modulo constraint has been projected
- * out (i.e., turned into an existentially quantified variable).
- * After the call to isl_basic_set_gist, we need to move the
- * existential variable back into the position where the calling
- * function expects it (assuming there are any constraints left).
- * We do this by adding an equality between the given dimension and
- * the existentially quantified variable.
- *
- * If there are no existentially quantified variables left, then
- * we don't need to add this equality.
- * If, on the other hand, the resulting basic set involves more
- * than one existentially quantified variable, then the caller
- * will not be able to handle the result, so we just return the
- * original input instead.
- */
-CloogConstraintSet *cloog_constraint_set_reduce(CloogConstraintSet *constraints,
-	int level, CloogEqualities *equal, int nb_par, cloog_int_t *bound)
-{
-	int j;
-	isl_ctx *ctx;
-	isl_dim *idim;
-	struct isl_basic_set *eq;
-	struct isl_basic_map *id;
-	struct cloog_isl_dim dim;
-	struct isl_constraint *c;
-	struct isl_div *div;
-	unsigned constraints_dim;
-	unsigned n_div;
-	isl_basic_set *bset, *orig;
-	isl_aff *aff;
-
-	bset = cloog_constraints_set_to_isl(constraints);
-	orig = isl_basic_set_copy(bset);
-	ctx = isl_basic_set_get_ctx(bset);
-	dim = set_cloog_dim_to_isl_dim(constraints, level - 1);
-	assert(dim.type == isl_dim_set);
-
-	eq = NULL;
-	for (j = 0; j < level - 1; ++j) {
-		isl_basic_set *bset_j;
-		if (equal->types[j] != EQTYPE_EXAFFINE)
-			continue;
-		bset_j = equality_to_basic_set(equal, j);
-		if (!eq)
-			eq = bset_j;
-		else
-			eq = isl_basic_set_intersect(eq, bset_j);
-	}
-	if (!eq) {
-		isl_basic_set_free(orig);
-		return cloog_constraint_set_from_isl_basic_set(bset);
-	}
-
-	idim = isl_dim_map_from_set(isl_basic_set_get_dim(bset));
-	id = isl_basic_map_identity(idim);
-	id = isl_basic_map_remove_dims(id, isl_dim_out, dim.pos, 1);
-	bset = isl_basic_set_apply(bset, isl_basic_map_copy(id));
-	bset = isl_basic_set_apply(bset, isl_basic_map_reverse(id));
-
-	constraints_dim = isl_basic_set_dim(bset, isl_dim_set);
-	eq = isl_basic_set_remove_dims(eq, isl_dim_set, constraints_dim,
-			isl_basic_set_dim(eq, isl_dim_set) - constraints_dim);
-	bset = isl_basic_set_gist(bset, eq);
-	n_div = isl_basic_set_dim(bset, isl_dim_div);
-	if (n_div > 1) {
-		isl_basic_set_free(bset);
-		return cloog_constraint_set_from_isl_basic_set(orig);
-	}
-	if (n_div < 1) {
-		isl_basic_set_free(orig);
-		return cloog_constraint_set_from_isl_basic_set(bset);
-	}
-
-	div = isl_basic_set_div(isl_basic_set_copy(bset), 0);
-	aff = isl_aff_from_div(div);
-	aff = isl_aff_add_coefficient_si(aff, isl_dim_set, dim.pos, -1);
-	c = isl_equality_from_aff(aff);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	isl_int_set_si(*bound, 0);
-	constraints = cloog_constraint_set_from_isl_basic_set(bset);
-	cloog_constraint_set_foreach_constraint(constraints,
-						add_constant_term, bound);
-
-	isl_basic_set_free(orig);
-	return cloog_constraint_set_from_isl_basic_set(bset);
-}
-
-CloogConstraint *cloog_constraint_copy(CloogConstraint *constraint)
-{
-	return cloog_constraint_from_isl_constraint(
-		isl_constraint_copy(cloog_constraint_to_isl(constraint)));
-}
-
-void cloog_constraint_release(CloogConstraint *constraint)
-{
-	isl_constraint_free(cloog_constraint_to_isl(constraint));
-}
-
-struct cloog_isl_foreach {
-	int (*fn)(CloogConstraint *constraint, void *user);
-	void *user;
-};
-
-static int cloog_isl_foreach_cb(__isl_take isl_constraint *c, void *user)
-{
-	struct cloog_isl_foreach *data = (struct cloog_isl_foreach *)user;
-	int ret;
-
-	if (isl_constraint_is_div_constraint(c)) {
-		isl_constraint_free(c);
-		return 0;
-	}
-
-	ret = data->fn(cloog_constraint_from_isl_constraint(c), data->user);
-
-	isl_constraint_free(c);
-
-	return ret;
-}
-
-int cloog_constraint_set_foreach_constraint(CloogConstraintSet *constraints,
-	int (*fn)(CloogConstraint *constraint, void *user), void *user)
-{
-	struct cloog_isl_foreach data = { fn, user };
-	isl_basic_set *bset;
-
-	bset = cloog_constraints_set_to_isl(constraints);
-	return isl_basic_set_foreach_constraint(bset,
-						cloog_isl_foreach_cb, &data);
-}
-
-CloogConstraint *cloog_equal_constraint(CloogEqualities *equal, int j)
-{
-	isl_constraint *c;
-
-	c = isl_constraint_copy(equal->constraints[j]);
-	return cloog_constraint_from_isl_constraint(c);
-}
-
-/* Given a stride constraint on iterator i (specified by level) of the form
- *
- *	i = f(outer iterators) + stride * f(existentials)
- *
- * extract f as an isl_aff.
- */
-static isl_aff *extract_stride_offset(__isl_keep isl_constraint *c,
-	int level, CloogStride *stride)
-{
-	int i;
-	isl_dim *dim = isl_constraint_get_dim(c);
-	isl_local_space *ls = isl_local_space_from_dim(dim);
-	isl_aff *offset = isl_aff_zero(ls);
-	isl_int u;
-	unsigned nparam, nvar;
-
-	isl_int_init(u);
-
-	nparam = isl_constraint_dim(c, isl_dim_param);
-	nvar = isl_constraint_dim(c, isl_dim_set);
-
-	for (i = 0; i < nparam; ++i) {
-		isl_constraint_get_coefficient(c, isl_dim_param, i, &u);
-		isl_int_mul(u, u, stride->factor);
-		offset = isl_aff_set_coefficient(offset, isl_dim_param, i, u);
-	}
-	for (i = 0; i < nvar; ++i) {
-		if (i == level - 1)
-			continue;
-		isl_constraint_get_coefficient(c, isl_dim_set, i, &u);
-		isl_int_mul(u, u, stride->factor);
-		offset = isl_aff_set_coefficient(offset, isl_dim_set, i, u);
-	}
-	isl_constraint_get_constant(c, &u);
-	isl_int_mul(u, u, stride->factor);
-	offset = isl_aff_set_constant(offset, u);
-
-	isl_int_clear(u);
-
-	return offset;
-}
-
-/* Update the given lower bound on level such that it satisfies the stride
- * constraint.  The computation performed here is essentially the same
- * as that performed in constraint_stride_lower_c.
- *
- * We update the constraint
- *
- *	a i + f >= 0
- *
- * to
- *
- *	i >= s * ceil((-f/a - d)/s) + d
- *
- * with s the stride and d the offset encoded in the stride constraint.
- */
-CloogConstraint *cloog_constraint_stride_lower_bound(CloogConstraint *c,
-	int level, CloogStride *stride)
-{
-	isl_constraint *stride_c = cloog_constraint_to_isl(stride->constraint);
-	isl_constraint *bound = cloog_constraint_to_isl(c);
-	isl_aff *offset;
-	isl_aff *lower;
-
-	lower = isl_constraint_get_bound(bound, isl_dim_set, level - 1);
-	isl_constraint_free(bound);
-
-	offset = extract_stride_offset(stride_c, level, stride);
-
-	lower = isl_aff_sub(lower, isl_aff_copy(offset));
-	lower = isl_aff_scale_down(lower, stride->stride);
-	lower = isl_aff_ceil(lower);
-	lower = isl_aff_scale(lower, stride->stride);
-	lower = isl_aff_add(lower, offset);
-	lower = isl_aff_neg(lower);
-	lower = isl_aff_add_coefficient_si(lower, isl_dim_set, level - 1, 1);
-
-	bound = isl_inequality_from_aff(lower);
-
-	return cloog_constraint_from_isl_constraint(bound);
-}
diff --git a/cloog-0.16.3/source/isl/domain.c b/cloog-0.16.3/source/isl/domain.c
deleted file mode 100644
index f2807c9..0000000
--- a/cloog-0.16.3/source/isl/domain.c
+++ /dev/null
@@ -1,1836 +0,0 @@
-#include <assert.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include <cloog/isl/cloog.h>
-#include <isl/list.h>
-#include <isl/constraint.h>
-#include <isl/div.h>
-#include <isl/ilp.h>
-#include <isl/aff.h>
-
-CloogDomain *cloog_domain_from_isl_set(struct isl_set *set)
-{
-	set = isl_set_detect_equalities(set);
-	set = isl_set_compute_divs(set);
-	return (CloogDomain *)set;
-}
-
-__isl_give isl_set *isl_set_from_cloog_domain(CloogDomain *domain)
-{
-	return (isl_set *)domain;
-}
-
-CloogScattering *cloog_scattering_from_isl_map(struct isl_map *map)
-{
-	return (CloogScattering *)map;
-}
-
-__isl_give isl_map *isl_map_from_cloog_scattering(CloogScattering *scattering)
-{
-	return (isl_map *)scattering;
-}
-
-
-/**
- * Returns true if each scattering dimension is defined in terms
- * of the original iterators.
- */
-int cloog_scattering_fully_specified(CloogScattering *scattering,
-				      CloogDomain *domain)
-{
-	isl_map *map = isl_map_from_cloog_scattering(scattering);
-	return isl_map_is_single_valued(map);
-}
-
-
-CloogConstraintSet *cloog_domain_constraints(CloogDomain *domain)
-{
-	isl_basic_set *bset;
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	assert(isl_set_n_basic_set(set) == 1);
-	bset = isl_set_copy_basic_set(set);
-	return cloog_constraint_set_from_isl_basic_set(bset);
-}
-
-
-void cloog_domain_print_constraints(FILE *foo, CloogDomain *domain,
-					int print_number)
-{
-	isl_basic_set *bset;
-	isl_set *set = isl_set_from_cloog_domain(domain);
-
-	if (print_number)
-		isl_set_print(set, foo, 0, ISL_FORMAT_EXT_POLYLIB);
-	else {
-		assert(isl_set_n_basic_set(set) == 1);
-		bset = isl_set_copy_basic_set(set);
-		isl_basic_set_print(bset, foo,
-					0, NULL, NULL, ISL_FORMAT_POLYLIB);
-		isl_basic_set_free(bset);
-	}
-}
-
-
-void cloog_scattering_print_constraints(FILE *foo, CloogScattering *scattering)
-{
-	isl_map *map = isl_map_from_cloog_scattering(scattering);
-	isl_map_print(map, foo, 0, ISL_FORMAT_EXT_POLYLIB);
-}
-
-
-void cloog_domain_free(CloogDomain * domain)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	isl_set_free(set);
-}
-
-
-void cloog_scattering_free(CloogScattering *scatt)
-{
-	isl_map *map = isl_map_from_cloog_scattering(scatt);
-	isl_map_free(map);
-}
-
-
-CloogDomain * cloog_domain_copy(CloogDomain * domain)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	return cloog_domain_from_isl_set(isl_set_copy(set));
-}
-
-
-/**
- * cloog_domain_convex function:
- * Computes the convex hull of domain.
- */ 
-CloogDomain *cloog_domain_convex(CloogDomain *domain)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	set = isl_set_from_basic_set(isl_set_convex_hull(isl_set_copy(set)));
-	return cloog_domain_from_isl_set(set);
-}
-
-
-/**
- * cloog_domain_simple_convex:
- * Given a list (union) of polyhedra, this function returns a "simple"
- * convex hull of this union.  In particular, the constraints of the
- * the returned polyhedron consist of (parametric) lower and upper
- * bounds on individual variables and constraints that appear in the
- * original polyhedra.
- */
-CloogDomain *cloog_domain_simple_convex(CloogDomain *domain)
-{
-	struct isl_basic_set *hull;
-	isl_set *set = isl_set_from_cloog_domain(domain);
-
-	if (cloog_domain_isconvex(domain))
-		return cloog_domain_copy(domain);
-
-	hull = isl_set_bounded_simple_hull(isl_set_copy(set));
-	return cloog_domain_from_isl_set(isl_set_from_basic_set(hull));
-}
-
-
-/**
- * cloog_domain_simplify function:
- * Given two polyhedral domains (dom1) and (dom2),
- * this function finds the largest domain set (or the smallest list
- * of non-redundant constraints), that when intersected with polyhedral
- * domain (dom2) equals (dom1)intersect(dom2). The output is a new CloogDomain
- * structure with a polyhedral domain with the "redundant" constraints removed.
- * NB: the second domain is required not to be a union.
- */ 
-CloogDomain *cloog_domain_simplify(CloogDomain *dom1, CloogDomain *dom2)
-{
-	isl_set *set1 = isl_set_from_cloog_domain(dom1);
-	isl_set *set2 = isl_set_from_cloog_domain(dom2);
-	set1 = isl_set_gist(isl_set_copy(set1), isl_set_copy(set2));
-	return cloog_domain_from_isl_set(set1);
-}
-
-
-/**
- * cloog_domain_union function:
- * This function returns a new polyhedral domain which is the union of
- * two polyhedral domains (dom1) U (dom2).
- * Frees dom1 and dom2;
- */
-CloogDomain *cloog_domain_union(CloogDomain *dom1, CloogDomain *dom2)
-{
-	isl_set *set1 = isl_set_from_cloog_domain(dom1);
-	isl_set *set2 = isl_set_from_cloog_domain(dom2);
-	set1 = isl_set_union(set1, set2);
-	return cloog_domain_from_isl_set(set1);
-}
-
-
-
-/**
- * cloog_domain_intersection function:
- * This function returns a new polyhedral domain which is the intersection of
- * two polyhedral domains (dom1) \cap (dom2).
- */ 
-CloogDomain *cloog_domain_intersection(CloogDomain *dom1, CloogDomain *dom2)
-{
-	isl_set *set1 = isl_set_from_cloog_domain(dom1);
-	isl_set *set2 = isl_set_from_cloog_domain(dom2);
-	set1 = isl_set_intersect(isl_set_copy(set1), isl_set_copy(set2));
-	return cloog_domain_from_isl_set(set1);
-}
-
-
-/**
- * cloog_domain_difference function:
- * Returns the set difference domain \ minus.
- */ 
-CloogDomain *cloog_domain_difference(CloogDomain *domain, CloogDomain *minus)
-{
-	isl_set *set1 = isl_set_from_cloog_domain(domain);
-	isl_set *set2 = isl_set_from_cloog_domain(minus);
-	set1 = isl_set_subtract(isl_set_copy(set1), isl_set_copy(set2));
-	return cloog_domain_from_isl_set(set1);
-}
-
-
-/**
- * cloog_domain_sort function:
- * This function topologically sorts (nb_doms) domains. Here (doms) is an
- * array of pointers to CloogDomains, (nb_doms) is the number of domains,
- * (level) is the level to consider for partial ordering (nb_par) is the
- * parameter space dimension, (permut) if not NULL, is an array of (nb_doms)
- * integers that contains a permutation specification after call in order to
- * apply the topological sorting. 
- */
-void cloog_domain_sort(CloogDomain **doms, unsigned nb_doms, unsigned level,
-			int *permut)
-{
-	int i, j, k, cmp;
-	struct isl_ctx *ctx;
-	unsigned char **follows;
-	isl_set *set_i, *set_j;
-	isl_basic_set *bset_i, *bset_j;
-
-	if (!nb_doms)
-		return;
-	set_i = isl_set_from_cloog_domain(doms[0]);
-	ctx = isl_set_get_ctx(set_i);
-	for (i = 0; i < nb_doms; i++) {
-		set_i = isl_set_from_cloog_domain(doms[i]);
-		assert(isl_set_n_basic_set(set_i) == 1);
-	}
-
-	follows = isl_alloc_array(ctx, unsigned char *, nb_doms);
-	assert(follows);
-	for (i = 0; i < nb_doms; ++i) {
-		follows[i] = isl_alloc_array(ctx, unsigned char, nb_doms);
-		assert(follows[i]);
-		for (j = 0; j < nb_doms; ++j)
-			follows[i][j] = 0;
-	}
-
-	for (i = 1; i < nb_doms; ++i) {
-		for (j = 0; j < i; ++j) {
-			if (follows[i][j] || follows[j][i])
-				continue;
-			set_i = isl_set_from_cloog_domain(doms[i]);
-			set_j = isl_set_from_cloog_domain(doms[j]);
-			bset_i = isl_set_copy_basic_set(set_i);
-			bset_j = isl_set_copy_basic_set(set_j);
-			cmp = isl_basic_set_compare_at(bset_i, bset_j, level-1);
-			isl_basic_set_free(bset_i);
-			isl_basic_set_free(bset_j);
-			if (!cmp)
-				continue;
-			if (cmp > 0) {
-				follows[i][j] = 1;
-				for (k = 0; k < i; ++k)
-					follows[i][k] |= follows[j][k];
-			} else {
-				follows[j][i] = 1;
-				for (k = 0; k < i; ++k)
-					follows[k][i] |= follows[k][j];
-			}
-		}
-	}
-
-	for (i = 0, j = 0; i < nb_doms; j = (j + 1) % nb_doms) {
-		for (k = 0; k < nb_doms; ++k)
-			if (follows[j][k])
-				break;
-		if (k < nb_doms)
-			continue;
-		for (k = 0; k < nb_doms; ++k)
-			follows[k][j] = 0;
-		follows[j][j] = 1;
-		permut[i] = 1 + j;
-		++i;
-	}
-
-	for (i = 0; i < nb_doms; ++i)
-		free(follows[i]);
-	free(follows);
-}
-
-
-/**
- * Check whether there is or may be any value of dom1 at the given level
- * that is greater than or equal to a value of dom2 at the same level.
- *
- * Return
- *	 1 is there is or may be a greater-than pair.
- *	 0 if there is no greater-than pair, but there may be an equal-to pair
- *	-1 if there is definitely no such pair
- */
-int cloog_domain_follows(CloogDomain *dom1, CloogDomain *dom2, unsigned level)
-{
-	isl_set *set1 = isl_set_from_cloog_domain(dom1);
-	isl_set *set2 = isl_set_from_cloog_domain(dom2);
-	int follows;
-
-	follows = isl_set_follows_at(set1, set2, level - 1);
-	assert(follows >= -1);
-
-	return follows;
-}
-
-
-/**
- * cloog_domain_empty function:
- * Returns an empty domain of the same dimensions as template.
- */
-CloogDomain *cloog_domain_empty(CloogDomain *template)
-{
-	isl_set *set = isl_set_from_cloog_domain(template);
-	return cloog_domain_from_isl_set(isl_set_empty_like(set));
-}
-
-
-/**
- * Return 1 if the specified dimension has both an upper and a lower bound.
- */
-int cloog_domain_is_bounded(CloogDomain *dom, unsigned level)
-{
-	isl_set *set = isl_set_from_cloog_domain(dom);
-	return isl_set_dim_is_bounded(set, isl_dim_set, level - 1);
-}
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-
-
-/**
- * cloog_domain_print_structure :
- * this function is a more human-friendly way to display the CloogDomain data
- * structure, it only shows the constraint system and includes an indentation
- * level (level) in order to work with others print_structure functions.
- */
-void cloog_domain_print_structure(FILE *file, CloogDomain *domain, int level,
-				  const char *name)
-{
-	int i ;
-	isl_set *set = isl_set_from_cloog_domain(domain);
-
-	/* Go to the right level. */
-	for (i = 0; i < level; i++)
-		fprintf(file, "|\t");
-  
-	if (!set) {
-		fprintf(file, "+-- Null CloogDomain\n");
-		return;
-	}
-	fprintf(file, "+-- %s\n", name);
-	for (i = 0; i < level+1; ++i)
-		fprintf(file, "|\t");
-
-	isl_set_print(set, file, 0, ISL_FORMAT_ISL);
-
-	fprintf(file, "\n");
-}
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-
-
-void cloog_domain_list_free(CloogDomainList *list)
-{
-	CloogDomainList *next;
-
-	for ( ; list; list = next) {
-		next = list->next;
-		cloog_domain_free(list->domain);
-		free(list);
-	}
-}
-
-
-/**
- * cloog_scattering_list_free function:
- * This function frees the allocated memory for a CloogScatteringList structure.
- */
-void cloog_scattering_list_free(CloogScatteringList *list)
-{
-	while (list != NULL) {
-		CloogScatteringList *temp = list->next;
-		isl_map *map = isl_map_from_cloog_scattering(list->scatt);
-		isl_map_free(map);
-		free(list);
-		list = temp;
-	}
-}
-
-
-/******************************************************************************
- *                               Reading function                             *
- ******************************************************************************/
-
-
-/**
- * cloog_domain_read_context function:
- * Read parameter domain.
- */
-CloogDomain *cloog_domain_read_context(CloogState *state, FILE *input)
-{
-	struct isl_ctx *ctx = state->backend->ctx;
-	isl_set *set;
-
-	set = isl_set_read_from_file(ctx, input, 0);
-	set = isl_set_move_dims(set, isl_dim_param, 0,
-				isl_dim_set, 0, isl_set_dim(set, isl_dim_set));
-
-	return cloog_domain_from_isl_set(set);
-}
-
-
-/**
- * cloog_domain_from_context
- * Reinterpret context by turning parameters into variables.
- */
-CloogDomain *cloog_domain_from_context(CloogDomain *context)
-{
-	isl_set *set = isl_set_from_cloog_domain(context);
-
-	set = isl_set_move_dims(set, isl_dim_set, 0,
-			    isl_dim_param, 0, isl_set_dim(set, isl_dim_param));
-
-	return cloog_domain_from_isl_set(set);
-}
-
-
-/**
- * cloog_domain_union_read function:
- * This function reads a union of polyhedra into a file (input) and
- * returns a pointer to a CloogDomain containing the read information. 
- */
-CloogDomain *cloog_domain_union_read(CloogState *state,
-					FILE *input, int nb_parameters)
-{
-	struct isl_ctx *ctx = state->backend->ctx;
-	struct isl_set *set;
-
-	set = isl_set_read_from_file(ctx, input, nb_parameters);
-	return cloog_domain_from_isl_set(set);
-}
-
-
-/**
- * cloog_domain_read_scattering function:
- * This function reads in a scattering function from the file input.
- *
- * We try to read the scattering relation as a map, but if it is
- * specified in the original PolyLib format, then isl_map_read_from_file
- * will treat the input as a set return a map with zero input dimensions.
- * In this case, we need to decompose the set into a map from
- * scattering dimensions to domain dimensions and then invert the
- * resulting map.
- */
-CloogScattering *cloog_domain_read_scattering(CloogDomain *domain, FILE *input)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	isl_ctx *ctx = isl_set_get_ctx(set);
-	struct isl_map *scat;
-	unsigned nparam;
-	unsigned dim;
-	unsigned n_scat;
-
-	dim = isl_set_dim(set, isl_dim_set);
-	nparam = isl_set_dim(set, isl_dim_param);
-	scat = isl_map_read_from_file(ctx, input, nparam);
-	if (isl_map_dim(scat, isl_dim_in) != dim) {
-		n_scat = isl_map_dim(scat, isl_dim_out) - dim;
-		scat = isl_map_move_dims(scat, isl_dim_in, 0,
-					isl_dim_out, n_scat, dim);
-	}
-	return cloog_scattering_from_isl_map(scat);
-}
-
-/******************************************************************************
- *                      CloogMatrix Reading function                          *
- ******************************************************************************/
-
-/**
- * isl_constraint_read_from_matrix:
- * Convert a single line of a matrix to a isl_constraint.
- * Returns a pointer to the constraint if successful; NULL otherwise.
- */
-static struct isl_constraint *isl_constraint_read_from_matrix(
-	struct isl_dim *dim, cloog_int_t *row)
-{
-	struct isl_constraint *constraint;
-	int j;
-	int nvariables = isl_dim_size(dim, isl_dim_set);
-	int nparam = isl_dim_size(dim, isl_dim_param);
-
-	if (cloog_int_is_zero(row[0]))
-		constraint = isl_equality_alloc(dim);
-	else
-		constraint = isl_inequality_alloc(dim);
-
-	for (j = 0; j < nvariables; ++j)
-		isl_constraint_set_coefficient(constraint, isl_dim_out, j,
-					       row[1 + j]);
-
-	for (j = 0; j < nparam; ++j)
-		isl_constraint_set_coefficient(constraint, isl_dim_param, j,
-					       row[1 + nvariables + j]);
-
-	isl_constraint_set_constant(constraint, row[1 + nvariables + nparam]);
-
-	return constraint;
-}
-
-/**
- * isl_basic_set_read_from_matrix:
- * Convert matrix to basic_set. The matrix contains nparam parameter columns.
- * Returns a pointer to the basic_set if successful; NULL otherwise.
- */
-static struct isl_basic_set *isl_basic_set_read_from_matrix(struct isl_ctx *ctx,
-	CloogMatrix* matrix, int nparam)
-{
-	struct isl_dim *dim;
-	struct isl_basic_set *bset;
-	int i;
-	unsigned nrows, ncolumns;
-
-	nrows = matrix->NbRows;
-	ncolumns = matrix->NbColumns;
-	int nvariables = ncolumns - 2 - nparam;
-
-	dim = isl_dim_set_alloc(ctx, nparam, nvariables);
-
-	bset = isl_basic_set_universe(isl_dim_copy(dim));
-
-	for (i = 0; i < nrows; ++i) {
-		cloog_int_t *row = matrix->p[i];
-		struct isl_constraint *constraint =
-			isl_constraint_read_from_matrix(isl_dim_copy(dim), row);
-		bset = isl_basic_set_add_constraint(bset, constraint);
-	}
-
-	isl_dim_free(dim);
-
-	return bset;
-}
-
-/**
- * cloog_domain_from_cloog_matrix:
- * Create a CloogDomain containing the constraints described in matrix.
- * nparam is the number of parameters contained in the domain.
- * Returns a pointer to the CloogDomain if successful; NULL otherwise.
- */
-CloogDomain *cloog_domain_from_cloog_matrix(CloogState *state,
-	CloogMatrix *matrix, int nparam)
-{
-	struct isl_ctx *ctx = state->backend->ctx;
-	struct isl_basic_set *bset;
-
-	bset = isl_basic_set_read_from_matrix(ctx, matrix, nparam);
-
-	return cloog_domain_from_isl_set(isl_set_from_basic_set(bset));
-}
-
-/**
- * cloog_scattering_from_cloog_matrix:
- * Create a CloogScattering containing the constraints described in matrix.
- * nparam is the number of parameters contained in the domain.
- * Returns a pointer to the CloogScattering if successful; NULL otherwise.
- */
-CloogScattering *cloog_scattering_from_cloog_matrix(CloogState *state,
-	CloogMatrix *matrix, int nb_scat, int nb_par)
-{
-	struct isl_ctx *ctx = state->backend->ctx;
-	struct isl_basic_set *bset;
-	struct isl_basic_map *scat;
-	struct isl_dim *dims;
-	unsigned dim;
-
-	bset = isl_basic_set_read_from_matrix(ctx, matrix, nb_par);
-	dim = isl_basic_set_n_dim(bset) - nb_scat;
-	dims = isl_dim_alloc(ctx, nb_par, nb_scat, dim);
-
-	scat = isl_basic_map_from_basic_set(bset, dims);
-	scat = isl_basic_map_reverse(scat);
-	return cloog_scattering_from_isl_map(isl_map_from_basic_map(scat));
-}
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-
-
-
-/**
- * cloog_domain_isempty function:
- */ 
-int cloog_domain_isempty(CloogDomain *domain)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	return isl_set_is_empty(set);
-}
-
-
-/**
- * cloog_domain_universe function:
- * This function returns the complete dim-dimensional space.
- */
-CloogDomain *cloog_domain_universe(CloogState *state, unsigned dim)
-{
-	struct isl_dim *dims;
-	struct isl_basic_set *bset;
-
-	dims = isl_dim_set_alloc(state->backend->ctx, 0, dim);
-	bset = isl_basic_set_universe(dims);
-	return cloog_domain_from_isl_set(isl_set_from_basic_set(bset));
-}
-
-
-/**
- * cloog_domain_project function:
- * This function returns the projection of
- * (domain) on the (level) first dimensions (i.e. outer loops).
- */ 
-CloogDomain *cloog_domain_project(CloogDomain *domain, int level)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	set = isl_set_remove_dims(isl_set_copy(set), isl_dim_set,
-					level, isl_set_n_dim(set) - level);
-	set = isl_set_compute_divs(set);
-	if (level > 0)
-		set = isl_set_remove_divs_involving_dims(set,
-						isl_dim_set, level - 1, 1);
-	return cloog_domain_from_isl_set(set);
-}
-
-
-/**
- * cloog_domain_extend function:
- * This function returns the (domain) given as input with (dim)
- * dimensions and (nb_par) parameters.
- * This function does not free (domain), and returns a new CloogDomain.
- */ 
-CloogDomain *cloog_domain_extend(CloogDomain *domain, int dim)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	set = isl_set_extend(isl_set_copy(set), isl_set_n_param(set), dim);
-	return cloog_domain_from_isl_set(set);
-}
-
-
-/**
- * cloog_domain_never_integral function:
- * For us, an equality like 3*i -4 = 0 is always false since 4%3 != 0.
- * There is no need to check for such constraints explicitly for the isl
- * backend.
- */
-int cloog_domain_never_integral(CloogDomain * domain)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	return isl_set_is_empty(set);
-}
-
-
-/**
- * Check whether the loop at "level" is executed at most once.
- * We construct a map that maps all remaining variables to this iterator
- * and check whether this map is single valued.
- *
- * Alternatively, we could have mapped the domain through a mapping
- * [p] -> { [..., i] -> [..., i'] : i' > i }
- * and then taken the intersection of the original domain and the transformed
- * domain.  If this intersection is empty, then the corresponding
- * loop is executed at most once.
- */
-int cloog_domain_is_otl(CloogDomain *domain, int level)
-{
-	int otl;
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	isl_map *map;
-
-	map = isl_map_from_domain(isl_set_copy(set));
-	map = isl_map_move_dims(map, isl_dim_out, 0, isl_dim_in, level - 1, 1);
-	otl = isl_map_is_single_valued(map);
-	isl_map_free(map);
-
-	return otl;
-}
-
-
-/**
- * cloog_domain_stride function:
- * This function finds the stride imposed to unknown with the column number
- * 'strided_level' in order to be integral. For instance, if we have a
- * constraint like -i - 2j + 2k = 0, and we consider k, then k can be integral
- * only if (i + 2j)%2 = 0. Then only if i%2 = 0. Then k imposes a stride 2 to
- * the unknown i. The function returns the imposed stride in a parameter field.
- * - domain is the set of constraint we have to consider,
- * - strided_level is the column number of the unknown for which a stride have
- *   to be found,
- * - looking_level is the column number of the unknown that impose a stride to
- *   the first unknown.
- * - stride is the stride that is returned back as a function parameter. 
- * - offset is the value of the constant c if the condition is of the shape
- *   (i + c)%s = 0, s being the stride.
- */
-void cloog_domain_stride(CloogDomain *domain, int strided_level,
-	cloog_int_t *stride, cloog_int_t *offset)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	isl_set_dim_residue_class(set, strided_level - 1, stride, offset);
-	if (!isl_int_is_zero(*offset))
-		isl_int_sub(*offset, *stride, *offset);
-	return;
-}
-
-
-struct cloog_can_stride {
-	int level;
-	int can_stride;
-};
-
-static int constraint_can_stride(__isl_take isl_constraint *c, void *user)
-{
-	struct cloog_can_stride *ccs = (struct cloog_can_stride *)user;
-	int i;
-	isl_int v;
-	unsigned n_div;
-
-	if (isl_constraint_is_equality(c)) {
-		isl_constraint_free(c);
-		return 0;
-	}
-
-	isl_int_init(v);
-	isl_constraint_get_coefficient(c, isl_dim_set, ccs->level - 1, &v);
-	if (isl_int_is_pos(v)) {
-		n_div = isl_constraint_dim(c, isl_dim_div);
-		for (i = 0; i < n_div; ++i) {
-			isl_constraint_get_coefficient(c, isl_dim_div, i, &v);
-			if (!isl_int_is_zero(v))
-				break;
-		}
-		if (i < n_div)
-			ccs->can_stride = 0;
-	}
-	isl_int_clear(v);
-	isl_constraint_free(c);
-
-	return 0;
-}
-
-static int basic_set_can_stride(__isl_take isl_basic_set *bset, void *user)
-{
-	struct cloog_can_stride *ccs = (struct cloog_can_stride *)user;
-	int r;
-
-	r = isl_basic_set_foreach_constraint(bset, constraint_can_stride, ccs);
-	isl_basic_set_free(bset);
-	return r;
-}
-
-
-/**
- * Return 1 if CLooG is allowed to perform stride detection on level "level"
- * and 0 otherwise.
- * Currently, stride detection is only allowed when none of the lower
- * bound constraints involve any existentially quantified variables.
- * The reason is that the current isl interface does not make it
- * easy to construct an integer division that depends on other integer
- * divisions.
- * By not allowing existentially quantified variables in the constraints,
- * we can ignore them in cloog_domain_stride_lower_bound.
- */
-int cloog_domain_can_stride(CloogDomain *domain, int level)
-{
-	struct cloog_can_stride ccs = { level, 1 };
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	int r;
-	r = isl_set_foreach_basic_set(set, basic_set_can_stride, &ccs);
-	assert(r == 0);
-	return ccs.can_stride;
-}
-
-
-struct cloog_stride_lower {
-	int level;
-	CloogStride *stride;
-	isl_set *set;
-	isl_basic_set *bounds;
-};
-
-/* If the given constraint is a lower bound on csl->level, then add
- * a lower bound to csl->bounds that makes sure that the remainder
- * of the smallest value on division by csl->stride is equal to csl->offset.
- *
- * In particular, the given lower bound is of the form
- *
- *	a i + f >= 0
- *
- * where f may depend on the parameters and other iterators.
- * The stride is s and the offset is d.
- * The lower bound -f/a may not satisfy the above condition.  In fact,
- * it may not even be integral.  We want to round this value of i up
- * to the nearest value that satisfies the condition and add the corresponding
- * lower bound constraint.  This nearest value is obtained by rounding
- * i - d up to the nearest multiple of s.
- * That is, we first subtract d
- *
- *	i' = -f/a - d
- *
- * then we round up to the nearest multiple of s
- *
- *	i'' = s * ceil(i'/s)
- *
- * and finally, we add d again
- *
- *	i''' = i'' + d
- *
- * and impose the constraint i >= i'''.
- *
- * We find
- *
- *	i'' = s * ceil((-f - a * d)/(a * s)) = - s * floor((f + a * d)/(a * s))
- *
- *	i >= - s * floor((f + a * d)/(a * s)) + d
- *
- * or
- *	i + s * floor((f + a * d)/(a * s)) - d >= 0
- */
-static int constraint_stride_lower(__isl_take isl_constraint *c, void *user)
-{
-	struct cloog_stride_lower *csl = (struct cloog_stride_lower *)user;
-	isl_int v;
-	isl_constraint *bound;
-	isl_aff *b;
-
-	if (isl_constraint_is_equality(c)) {
-		isl_constraint_free(c);
-		return 0;
-	}
-
-	isl_int_init(v);
-	isl_constraint_get_coefficient(c, isl_dim_set, csl->level - 1, &v);
-	if (!isl_int_is_pos(v)) {
-		isl_int_clear(v);
-		isl_constraint_free(c);
-
-		return 0;
-	}
-
-	b = isl_constraint_get_bound(c, isl_dim_set, csl->level - 1);
-
-	b = isl_aff_neg(b);
-	b = isl_aff_add_constant(b, csl->stride->offset);
-	b = isl_aff_scale_down(b, csl->stride->stride);
-	b = isl_aff_floor(b);
-	b = isl_aff_scale(b, csl->stride->stride);
-	isl_int_neg(v, csl->stride->offset);
-	b = isl_aff_add_constant(b, v);
-	b = isl_aff_add_coefficient_si(b, isl_dim_set, csl->level - 1, 1);
-
-	bound = isl_inequality_from_aff(b);
-
-	csl->bounds = isl_basic_set_add_constraint(csl->bounds, bound);
-
-	isl_int_clear(v);
-	isl_constraint_free(c);
-
-	return 0;
-}
-
-/* This functions performs essentially the same operation as
- * constraint_stride_lower, the only difference being that the offset d
- * is not a constant, but an affine expression in terms of the parameters
- * and earlier variables.  In particular the affine expression is equal
- * to the coefficients of stride->constraint multiplied by stride->factor.
- * As in constraint_stride_lower, we add an extra bound
- *
- *	i + s * floor((f + a * d)/(a * s)) - d >= 0
- *
- * for each lower bound
- *
- *	a i + f >= 0
- *
- * where d is not the aforementioned affine expression.
- */
-static int constraint_stride_lower_c(__isl_take isl_constraint *c, void *user)
-{
-	struct cloog_stride_lower *csl = (struct cloog_stride_lower *)user;
-	isl_int v;
-	isl_constraint *bound;
-	isl_constraint *csl_c;
-	isl_aff *d, *b;
-
-	if (isl_constraint_is_equality(c)) {
-		isl_constraint_free(c);
-		return 0;
-	}
-
-	isl_int_init(v);
-	isl_constraint_get_coefficient(c, isl_dim_set, csl->level - 1, &v);
-	if (!isl_int_is_pos(v)) {
-		isl_int_clear(v);
-		isl_constraint_free(c);
-
-		return 0;
-	}
-
-	csl_c = cloog_constraint_to_isl(csl->stride->constraint);
-
-	d = isl_constraint_get_aff(csl_c);
-	d = isl_aff_drop_dims(d, isl_dim_div, 0, isl_aff_dim(d, isl_dim_div));
-	d = isl_aff_set_coefficient_si(d, isl_dim_set, csl->level - 1, 0);
-	d = isl_aff_scale(d, csl->stride->factor);
-
-	b = isl_constraint_get_bound(c, isl_dim_set, csl->level - 1);
-
-	b = isl_aff_neg(b);
-	b = isl_aff_add(b, isl_aff_copy(d));
-	b = isl_aff_scale_down(b, csl->stride->stride);
-	b = isl_aff_floor(b);
-	b = isl_aff_scale(b, csl->stride->stride);
-	b = isl_aff_sub(b, d);
-	b = isl_aff_add_coefficient_si(b, isl_dim_set, csl->level - 1, 1);
-
-	bound = isl_inequality_from_aff(b);
-
-	csl->bounds = isl_basic_set_add_constraint(csl->bounds, bound);
-
-	isl_int_clear(v);
-	isl_constraint_free(c);
-
-	return 0;
-}
-
-static int basic_set_stride_lower(__isl_take isl_basic_set *bset, void *user)
-{
-	struct cloog_stride_lower *csl = (struct cloog_stride_lower *)user;
-	int r;
-
-	csl->bounds = isl_basic_set_universe_like(bset);
-	if (csl->stride->constraint)
-		r = isl_basic_set_foreach_constraint(bset,
-					&constraint_stride_lower_c, csl);
-	else
-		r = isl_basic_set_foreach_constraint(bset,
-					&constraint_stride_lower, csl);
-	bset = isl_basic_set_intersect(bset, csl->bounds);
-	csl->set = isl_set_union(csl->set, isl_set_from_basic_set(bset));
-
-	return r;
-}
-
-/**
- * Update the lower bounds at level "level" to the given stride information.
- * That is, make sure that the remainder on division by "stride"
- * is equal to "offset".
- */
-CloogDomain *cloog_domain_stride_lower_bound(CloogDomain *domain, int level,
-	CloogStride *stride)
-{
-	struct cloog_stride_lower csl;
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	int r;
-
-	csl.stride = stride;
-	csl.level = level;
-	csl.set = isl_set_empty_like(set);
-
-	r = isl_set_foreach_basic_set(set, basic_set_stride_lower, &csl);
-	assert(r == 0);
-
-	cloog_domain_free(domain);
-	return cloog_domain_from_isl_set(csl.set);
-}
-
-
-/* Add stride constraint, if any, to domain.
- */
-CloogDomain *cloog_domain_add_stride_constraint(CloogDomain *domain,
-	CloogStride *stride)
-{
-	isl_constraint *c;
-	isl_set *set;
-
-	if (!stride || !stride->constraint)
-		return domain;
-
-	set = isl_set_from_cloog_domain(domain);
-	c = isl_constraint_copy(cloog_constraint_to_isl(stride->constraint));
-
-	set = isl_set_add_constraint(set, c);
-
-	return cloog_domain_from_isl_set(set);
-}
-
-
-/**
- * cloog_domain_lazy_equal function:
- * This function returns 1 if the domains given as input are the same, 0 if it
- * is unable to decide.
- */
-int cloog_domain_lazy_equal(CloogDomain *d1, CloogDomain *d2)
-{
-	isl_set *set1 = isl_set_from_cloog_domain(d1);
-	isl_set *set2 = isl_set_from_cloog_domain(d2);
-	return isl_set_fast_is_equal(set1, set2);
-}
-
-struct cloog_bound_split {
-	isl_set *set;
-	int level;
-	int lower;
-	int upper;
-};
-
-static int constraint_bound_split(__isl_take isl_constraint *c, void *user)
-{
-	struct cloog_bound_split *cbs = (struct cloog_bound_split *)user;
-	isl_int v;
-	int i;
-	int handle = 0;
-
-	isl_int_init(v);
-	isl_constraint_get_coefficient(c, isl_dim_set, cbs->level - 1, &v);
-	if (!cbs->lower && isl_int_is_pos(v))
-		cbs->lower = handle = 1;
-	else if (!cbs->upper && isl_int_is_neg(v))
-		cbs->upper = handle = 1;
-	if (handle) {
-		for (i = 0; i < isl_set_dim(cbs->set, isl_dim_param); ++i) {
-			isl_constraint_get_coefficient(c, isl_dim_param, i, &v);
-			if (isl_int_is_zero(v))
-				continue;
-			cbs->set = isl_set_split_dims(cbs->set,
-							isl_dim_param, i, 1);
-		}
-	}
-	isl_int_clear(v);
-	isl_constraint_free(c);
-
-	return (cbs->lower && cbs->upper) ? -1 : 0;
-}
-
-static int basic_set_bound_split(__isl_take isl_basic_set *bset, void *user)
-{
-	struct cloog_bound_split *cbs = (struct cloog_bound_split *)user;
-	int r;
-
-	cbs->lower = 0;
-	cbs->upper = 0;
-	r = isl_basic_set_foreach_constraint(bset, constraint_bound_split, cbs);
-	isl_basic_set_free(bset);
-	return ((!cbs->lower || !cbs->upper) && r < 0) ? -1 : 0;
-}
-
-/**
- * Return a union of sets S_i such that the convex hull of "dom",
- * when intersected with one the sets S_i, will have an upper and
- * lower bound for the dimension at "level" (provided "dom" itself
- * has such bounds for the dimensions).
- *
- * We currently take a very simple approach.  For each of the basic
- * sets in "dom" we pick a lower and an upper bound and split the
- * range of any parameter involved in these two bounds in a
- * nonnegative and a negative part.  This ensures that the symbolic
- * constant in these two constraints are themselves bounded and
- * so there will be at least one upper and one lower bound
- * in the convex hull.
- */
-CloogDomain *cloog_domain_bound_splitter(CloogDomain *dom, int level)
-{
-	struct cloog_bound_split cbs;
-	isl_set *set = isl_set_from_cloog_domain(dom);
-	int r;
-	cbs.level = level;
-	cbs.set = isl_set_universe_like(set);
-	r = isl_set_foreach_basic_set(set, basic_set_bound_split, &cbs);
-	assert(r == 0);
-	return cloog_domain_from_isl_set(cbs.set);
-}
-
-
-/* Check whether the union of scattering functions over all domains
- * is obviously injective.
- */
-static int injective_scattering(CloogScatteringList *list)
-{
-	isl_map *map;
-	isl_union_map *umap;
-	int injective;
-	int i = 0;
-	char name[30];
-
-	if (!list)
-		return 1;
-	
-	map = isl_map_copy(isl_map_from_cloog_scattering(list->scatt));
-	snprintf(name, sizeof(name), "S%d", i);
-	map = isl_map_set_tuple_name(map, isl_dim_in, name);
-	umap = isl_union_map_from_map(map);
-
-	for (list = list->next, ++i; list; list = list->next, ++i) {
-		map = isl_map_copy(isl_map_from_cloog_scattering(list->scatt));
-		snprintf(name, sizeof(name), "S%d", i);
-		map = isl_map_set_tuple_name(map, isl_dim_in, name);
-		umap = isl_union_map_add_map(umap, map);
-	}
-
-	injective = isl_union_map_plain_is_injective(umap);
-
-	isl_union_map_free(umap);
-
-	return injective;
-}
-
-
-/**
- * cloog_scattering_lazy_block function:
- * This function returns 1 if the two scattering functions s1 and s2 given
- * as input are the same (except possibly for the final dimension, where we
- * allow a difference of 1), assuming that the domains on which this
- * scatterings are applied are the same.
- * In fact this function answers the question "can I
- * safely consider the two domains as only one with two statements (a block) ?".
- * A difference of 1 in the final dimension is only allowed if the
- * entire scattering function is injective.
- * - s1 and s2 are the two domains to check for blocking,
- * - scattering is the linked list of all domains,
- * - scattdims is the total number of scattering dimentions.
- */
-int cloog_scattering_lazy_block(CloogScattering *s1, CloogScattering *s2,
-			    CloogScatteringList *scattering, int scattdims)
-{
-	int i;
-	struct isl_dim *dim;
-	struct isl_map *rel;
-	struct isl_set *delta;
-	isl_map *map1 = isl_map_from_cloog_scattering(s1);
-	isl_map *map2 = isl_map_from_cloog_scattering(s2);
-	int fixed, block;
-	isl_int cst;
-	unsigned n_scat;
-
-	n_scat = isl_map_dim(map1, isl_dim_out);
-	if (n_scat != isl_map_dim(map2, isl_dim_out))
-		return 0;
-
-	dim = isl_map_get_dim(map1);
-	dim = isl_dim_map_from_set(isl_dim_domain(dim));
-	rel = isl_map_identity(dim);
-	rel = isl_map_apply_domain(rel, isl_map_copy(map1));
-	rel = isl_map_apply_range(rel, isl_map_copy(map2));
-	delta = isl_map_deltas(rel);
-	isl_int_init(cst);
-	for (i = 0; i < n_scat; ++i) {
-		fixed = isl_set_fast_dim_is_fixed(delta, i, &cst);
-		if (fixed != 1)
-			break;
-		if (isl_int_is_zero(cst))
-			continue;
-		if (i + 1 < n_scat)
-			break;
-		if (!isl_int_is_one(cst))
-			break;
-		if (!injective_scattering(scattering))
-			break;
-	}
-	block = i >= n_scat;
-	isl_int_clear(cst);
-	isl_set_free(delta);
-	return block;
-}
-
-
-/**
- * cloog_domain_lazy_disjoint function:
- * This function returns 1 if the domains given as input are disjoint, 0 if it
- * is unable to decide.
- */
-int cloog_domain_lazy_disjoint(CloogDomain *d1, CloogDomain *d2)
-{
-	isl_set *set1 = isl_set_from_cloog_domain(d1);
-	isl_set *set2 = isl_set_from_cloog_domain(d2);
-	return isl_set_fast_is_disjoint(set1, set2);
-} 
- 
- 
-/**
- * cloog_scattering_list_lazy_same function:
- * This function returns 1 if two domains in the list are the same, 0 if it
- * is unable to decide.
- */
-int cloog_scattering_list_lazy_same(CloogScatteringList *list)
-{
-	CloogScatteringList *one, *other;
-	isl_map *one_map, *other_map;
-
-	for (one = list; one; one = one->next) {
-		one_map = isl_map_from_cloog_scattering(one->scatt);
-		for (other = one->next; other; other = other->next) {
-			other_map = isl_map_from_cloog_scattering(other->scatt);
-			if (isl_map_fast_is_equal(one_map, other_map))
-				return 1;
-		}
-	}
-	return 0;
-}
-
-int cloog_domain_dimension(CloogDomain * domain)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	return isl_set_dim(set, isl_dim_set);
-}
-
-int cloog_domain_parameter_dimension(CloogDomain *domain)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	return isl_set_dim(set, isl_dim_param);
-}
-
-int cloog_scattering_dimension(CloogScattering *scatt, CloogDomain *domain)
-{
-	isl_map *map = isl_map_from_cloog_scattering(scatt);
-	return isl_map_dim(map, isl_dim_out);
-}
-
-int cloog_domain_isconvex(CloogDomain * domain)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	return isl_set_n_basic_set(set) <= 1;
-}
-
-
-/**
- * cloog_domain_cut_first function:
- * This function splits off and returns the first convex set in the
- * union "domain".  The remainder of the union is returned in rest.
- * The original "domain" itself is destroyed and may not be used
- * after a call to this function.
- */
-CloogDomain *cloog_domain_cut_first(CloogDomain *domain, CloogDomain **rest)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	struct isl_basic_set *first;
-
-	first = isl_set_copy_basic_set(set);
-	set = isl_set_drop_basic_set(set, first);
-	*rest = cloog_domain_from_isl_set(set);
-
-	return cloog_domain_from_isl_set(isl_set_from_basic_set(first));
-}
-
-
-/**
- * Given a union domain, try to find a simpler representation
- * using fewer sets in the union.
- * The original "domain" itself is destroyed and may not be used
- * after a call to this function.
- */
-CloogDomain *cloog_domain_simplify_union(CloogDomain *domain)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	return cloog_domain_from_isl_set(isl_set_coalesce(set));
-}
-
-
-/**
- * cloog_scattering_lazy_isscalar function:
- * this function returns 1 if the scattering dimension 'dimension' in the
- * scattering 'scatt' is constant.
- * If value is not NULL, then it is set to the constant value of dimension.
- */
-int cloog_scattering_lazy_isscalar(CloogScattering *scatt, int dimension,
-					cloog_int_t *value)
-{
-	isl_map *map = isl_map_from_cloog_scattering(scatt);
-	return isl_map_fast_is_fixed(map, isl_dim_out, dimension, value);
-}
-
-
-/**
- * cloog_domain_lazy_isconstant function:
- * this function returns 1 if the dimension 'dimension' in the
- * domain 'domain' is constant.
- * If value is not NULL, then it is set to the constant value of dimension.
- */
-int cloog_domain_lazy_isconstant(CloogDomain *domain, int dimension,
-	cloog_int_t *value)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	return isl_set_fast_dim_is_fixed(set, dimension, value);
-}
-
-
-/**
- * cloog_scattering_erase_dimension function:
- * this function returns a CloogDomain structure builds from 'domain' where
- * we removed the dimension 'dimension' and every constraint involving this
- * dimension.
- */
-CloogScattering *cloog_scattering_erase_dimension(CloogScattering *scattering,
-						int dimension)
-{
-	isl_map *map = isl_map_from_cloog_scattering(scattering);
-	map = isl_map_remove_dims(isl_map_copy(map), isl_dim_out, dimension, 1);
-	return cloog_scattering_from_isl_map(map);
-}
-
-/**
- * cloog_domain_cube:
- * Construct and return a dim-dimensional cube, with values ranging
- * between min and max in each dimension.
- */
-CloogDomain *cloog_domain_cube(CloogState *state,
-				int dim, cloog_int_t min, cloog_int_t max)
-{
-	int i;
-	struct isl_basic_set *cube;
-	struct isl_basic_set *interval;
-	struct isl_basic_set_list *list;
-
-	if (dim == 0)
-		return cloog_domain_universe(state, dim);
-
-	interval = isl_basic_set_interval(state->backend->ctx, min, max);
-	list = isl_basic_set_list_alloc(state->backend->ctx, dim);
-	for (i = 0; i < dim; ++i)
-		list = isl_basic_set_list_add(list, isl_basic_set_copy(interval));
-	isl_basic_set_free(interval);
-	cube = isl_basic_set_list_product(list);
-	return cloog_domain_from_isl_set(isl_set_from_basic_set(cube));
-}
-
-
-/**
- * cloog_domain_scatter function:
- * This function add the scattering (scheduling) informations to a domain.
- */
-CloogDomain *cloog_domain_scatter(CloogDomain *domain, CloogScattering *scatt)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	isl_map *map = isl_map_from_cloog_scattering(scatt);
-
-	map = isl_map_reverse(isl_map_copy(map));
-	map = isl_map_intersect_range(map, set);
-	set = isl_set_flatten(isl_map_wrap(map));
-	return cloog_domain_from_isl_set(set);
-}
-
-static int add_domain_from_map(__isl_take isl_map *map, void *user)
-{
-	isl_dim *dim;
-	const char *name;
-	CloogDomain *domain;
-	CloogScattering *scat;
-	CloogUnionDomain **ud = (CloogUnionDomain **)user;
-
-	dim = isl_map_get_dim(map);
-	name = isl_dim_get_tuple_name(dim, isl_dim_in);
-	domain = cloog_domain_from_isl_set(isl_map_domain(isl_map_copy(map)));
-	scat = cloog_scattering_from_isl_map(map);
-	*ud = cloog_union_domain_add_domain(*ud, name, domain, scat, NULL);
-	isl_dim_free(dim);
-
-	return 0;
-}
-
-/**
- * Construct a CloogUnionDomain from an isl_union_map representing
- * a global scattering function.  The input is a mapping from different
- * spaces (different tuple names and possibly different dimensions)
- * to a common space.  The iteration domains are set to the domains
- * in each space.  The statement names are set to the names of the
- * spaces.  The parameter names of the result are set to those of
- * the input, but the iterator and scattering dimension names are
- * left unspecified.
- */
-CloogUnionDomain *cloog_union_domain_from_isl_union_map(
-	__isl_take isl_union_map *umap)
-{
-	int i;
-	int nparam;
-	isl_dim *dim;
-	CloogUnionDomain *ud;
-
-	dim = isl_union_map_get_dim(umap);
-	nparam = isl_dim_size(dim, isl_dim_param);
-
-	ud = cloog_union_domain_alloc(nparam);
-
-	for (i = 0; i < nparam; ++i) {
-		const char *s = isl_dim_get_name(dim, isl_dim_param, i);
-		ud = cloog_union_domain_set_name(ud, CLOOG_PARAM, i, s);
-	}
-	isl_dim_free(dim);
-
-	if (isl_union_map_foreach_map(umap, &add_domain_from_map, &ud) < 0) {
-		isl_union_map_free(umap);
-		cloog_union_domain_free(ud);
-		assert(0);
-	}
-
-	isl_union_map_free(umap);
-
-	return ud;
-}
-
-static int count_same_name(__isl_keep isl_dim *dim,
-	enum isl_dim_type type, unsigned pos, const char *name)
-{
-	enum isl_dim_type t;
-	unsigned p, s;
-	int count = 0;
-	int len = strlen(name);
-
-	for (t = isl_dim_param; t <= type && t <= isl_dim_out; ++t) {
-		s = t == type ? pos : isl_dim_size(dim, t);
-		for (p = 0; p < s; ++p) {
-			const char *n = isl_dim_get_name(dim, t, p);
-			if (n && !strncmp(n, name, len))
-				count++;
-		}
-	}
-	return count;
-}
-
-static int add_domain(__isl_take isl_set *set, void *user)
-{
-	int i, nvar;
-	isl_ctx *ctx;
-	isl_dim *dim;
-	char buffer[20];
-	const char *name;
-	CloogDomain *domain;
-	CloogUnionDomain **ud = (CloogUnionDomain **)user;
-
-	ctx = isl_set_get_ctx(set);
-	dim = isl_set_get_dim(set);
-	name = isl_dim_get_tuple_name(dim, isl_dim_set);
-	set = isl_set_flatten(set);
-	set = isl_set_set_tuple_name(set, NULL);
-	domain = cloog_domain_from_isl_set(set);
-	*ud = cloog_union_domain_add_domain(*ud, name, domain, NULL, NULL);
-
-	nvar = isl_dim_size(dim, isl_dim_set);
-	for (i = 0; i < nvar; ++i) {
-		char *long_name = NULL;
-		int n;
-
-		name = isl_dim_get_name(dim, isl_dim_set, i);
-		if (!name) {
-			snprintf(buffer, sizeof(buffer), "i%d", i);
-			name = buffer;
-		}
-		n = count_same_name(dim, isl_dim_set, i, name);
-		if (n) {
-			int size = strlen(name) + 10;
-			long_name = isl_alloc_array(ctx, char, size);
-			if (!long_name)
-				cloog_die("memory overflow.\n");
-			snprintf(long_name, size, "%s_%d", name, n);
-			name = long_name;
-		}
-		*ud = cloog_union_domain_set_name(*ud, CLOOG_ITER, i, name);
-		free(long_name);
-	}
-	isl_dim_free(dim);
-
-	return 0;
-}
-
-/**
- * Construct a CloogUnionDomain from an isl_union_set.
- * The statement names are set to the names of the
- * spaces.  The parameter and iterator names of the result are set to those of
- * the input, but the scattering dimension names are left unspecified.
- */
-CloogUnionDomain *cloog_union_domain_from_isl_union_set(
-	__isl_take isl_union_set *uset)
-{
-	int i;
-	int nparam;
-	isl_dim *dim;
-	CloogUnionDomain *ud;
-
-	dim = isl_union_set_get_dim(uset);
-	nparam = isl_dim_size(dim, isl_dim_param);
-
-	ud = cloog_union_domain_alloc(nparam);
-
-	for (i = 0; i < nparam; ++i) {
-		const char *s = isl_dim_get_name(dim, isl_dim_param, i);
-		ud = cloog_union_domain_set_name(ud, CLOOG_PARAM, i, s);
-	}
-	isl_dim_free(dim);
-
-	if (isl_union_set_foreach_set(uset, &add_domain, &ud) < 0) {
-		isl_union_set_free(uset);
-		cloog_union_domain_free(ud);
-		assert(0);
-	}
-
-	isl_union_set_free(uset);
-
-	return ud;
-}
-
-/* Computes x, y and g such that g = gcd(a,b) and a*x+b*y = g */
-static void Euclid(cloog_int_t a, cloog_int_t b,
-			cloog_int_t *x, cloog_int_t *y, cloog_int_t *g)
-{
-	cloog_int_t c, d, e, f, tmp;
-
-	cloog_int_init(c);
-	cloog_int_init(d);
-	cloog_int_init(e);
-	cloog_int_init(f);
-	cloog_int_init(tmp);
-	cloog_int_abs(c, a);
-	cloog_int_abs(d, b);
-	cloog_int_set_si(e, 1);
-	cloog_int_set_si(f, 0);
-	while (cloog_int_is_pos(d)) {
-		cloog_int_tdiv_q(tmp, c, d);
-		cloog_int_mul(tmp, tmp, f);
-		cloog_int_sub(e, e, tmp);
-		cloog_int_tdiv_q(tmp, c, d);
-		cloog_int_mul(tmp, tmp, d);
-		cloog_int_sub(c, c, tmp);
-		cloog_int_swap(c, d);
-	    cloog_int_swap(e, f);
-	}
-	cloog_int_set(*g, c);
-	if (cloog_int_is_zero(a))
-		cloog_int_set_si(*x, 0);
-	else if (cloog_int_is_pos(a))
-		cloog_int_set(*x, e);
-	else cloog_int_neg(*x, e);
-	if (cloog_int_is_zero(b))
-		cloog_int_set_si(*y, 0);
-	else {
-		cloog_int_mul(tmp, a, *x);
-		cloog_int_sub(tmp, c, tmp);
-		cloog_int_divexact(*y, tmp, b);
-	}
-	cloog_int_clear(c);
-	cloog_int_clear(d);
-	cloog_int_clear(e);
-	cloog_int_clear(f);
-	cloog_int_clear(tmp);
-}
-
-/* Construct a CloogStride from the given constraint for the given level,
- * if possible.
- * We first compute the gcd of the coefficients of the existentially
- * quantified variables and then remove any common factors it has
- * with the coefficient at the given level.
- * The result is the value of the stride and if it is not one,
- * then it is possible to construct a CloogStride.
- * The constraint leading to the stride is stored in the CloogStride
- * as well a value (factor) such that the product of this value
- * and the coefficient at the given level is equal to -1 modulo the stride.
- */
-static CloogStride *construct_stride(isl_constraint *c, int level)
-{
-	int i, n, sign;
-	isl_int v, m, gcd, stride, factor;
-	CloogStride *s;
-
-	if (!c)
-		return NULL;
-
-	isl_int_init(v);
-	isl_int_init(m);
-	isl_int_init(gcd);
-	isl_int_init(factor);
-	isl_int_init(stride);
-
-	isl_constraint_get_coefficient(c, isl_dim_set, level - 1, &v);
-	sign = isl_int_sgn(v);
-	isl_int_abs(m, v);
-
-	isl_int_set_si(gcd, 0);
-	n = isl_constraint_dim(c, isl_dim_div);
-	for (i = 0; i < n; ++i) {
-		isl_constraint_get_coefficient(c, isl_dim_div, i, &v);
-		isl_int_gcd(gcd, gcd, v);
-	}
-
-	isl_int_gcd(v, m, gcd);
-	isl_int_divexact(stride, gcd, v);
-
-	if (isl_int_is_zero(stride) || isl_int_is_one(stride))
-		s = NULL;
-	else {
-		Euclid(m, stride, &factor, &v, &gcd);
-		if (sign > 0)
-			isl_int_neg(factor, factor);
-
-		c = isl_constraint_copy(c);
-		s = cloog_stride_alloc_from_constraint(stride,
-			    cloog_constraint_from_isl_constraint(c), factor);
-	}
-
-	isl_int_clear(stride);
-	isl_int_clear(factor);
-	isl_int_clear(gcd);
-	isl_int_clear(m);
-	isl_int_clear(v);
-
-	return s;
-}
-
-struct cloog_isl_find_stride_data {
-	int level;
-	CloogStride *stride;
-};
-
-/* Check if the given constraint can be used to derive
- * a stride on the iterator identified by data->level.
- * We first check that there are some existentially quantified variables
- * and that the coefficient at data->level is non-zero.
- * Then we call construct_stride for further checks and the actual
- * construction of the CloogStride.
- */
-static int find_stride(__isl_take isl_constraint *c, void *user)
-{
-	struct cloog_isl_find_stride_data *data;
-	int n;
-	isl_int v;
-
-	data = (struct cloog_isl_find_stride_data *)user;
-
-	if (data->stride) {
-		isl_constraint_free(c);
-		return 0;
-	}
-
-	n = isl_constraint_dim(c, isl_dim_div);
-	if (n == 0) {
-		isl_constraint_free(c);
-		return 0;
-	}
-
-	isl_int_init(v);
-
-	isl_constraint_get_coefficient(c, isl_dim_set, data->level - 1, &v);
-	if (!isl_int_is_zero(v))
-		data->stride = construct_stride(c, data->level);
-
-	isl_int_clear(v);
-
-	isl_constraint_free(c);
-
-	return 0;
-}
-
-/* Check if the given list of domains has a common stride on the given level.
- * If so, return a pointer to a CloogStride object.  If not, return NULL.
- *
- * We project out all later variables, take the union and compute
- * the affine hull of the union.  Then we check the (equality)
- * constraints in this affine hull for imposing a stride.
- */
-CloogStride *cloog_domain_list_stride(CloogDomainList *list, int level)
-{
-	struct cloog_isl_find_stride_data data = { level, NULL };
-	isl_set *set;
-	isl_basic_set *aff;
-	int first = level;
-	int n;
-	int r;
-
-	set = isl_set_from_cloog_domain(list->domain);
-	n = isl_set_dim(set, isl_dim_set) - first;
-	set = isl_set_project_out(isl_set_copy(set), isl_dim_set, first, n);
-
-	for (list = list->next; list; list = list->next) {
-		isl_set *set_i = isl_set_from_cloog_domain(list->domain);
-		n = isl_set_dim(set_i, isl_dim_set) - first;
-		set_i = isl_set_project_out(isl_set_copy(set_i),
-						isl_dim_set, first, n);
-		set = isl_set_union(set, set_i);
-	}
-	aff = isl_set_affine_hull(set);
-
-	r = isl_basic_set_foreach_constraint(aff, &find_stride, &data);
-	assert(r == 0);
-
-	isl_basic_set_free(aff);
-
-	return data.stride;
-}
-
-struct cloog_can_unroll {
-	int can_unroll;
-	int level;
-	isl_constraint *c;
-	isl_set *set;
-	isl_int *n;
-};
-
-
-/*
- * Check if the given lower bound can be used for unrolling.
- * If the lower bound involves any existentially quantified
- * variables, we currently punt.
- * Otherwise we compute the maximal value of (i - ceil(l) + 1),
- * with l the given lower bound and i the iterator identified by level.
- */
-static int is_valid_unrolling_lower_bound(struct cloog_can_unroll *ccu,
-	__isl_keep isl_constraint *c)
-{
-	unsigned n_div;
-	isl_aff *aff;
-	enum isl_lp_result res;
-
-	n_div = isl_constraint_dim(c, isl_dim_div);
-	if (isl_constraint_involves_dims(c, isl_dim_div, 0, n_div))
-		return 0;
-
-	aff = isl_constraint_get_bound(c, isl_dim_set, ccu->level - 1);
-	aff = isl_aff_ceil(aff);
-	aff = isl_aff_neg(aff);
-	aff = isl_aff_add_coefficient_si(aff, isl_dim_set, ccu->level - 1, 1);
-	res = isl_set_max(ccu->set, aff, ccu->n);
-	isl_aff_free(aff);
-
-	if (res == isl_lp_unbounded)
-		return 0;
-
-	assert(res == isl_lp_ok);
-
-	cloog_int_add_ui(*ccu->n, *ccu->n, 1);
-
-	return 1;
-}
-
-
-/* Check if we can unroll based on the given constraint.
- * Only lower bounds can be used.
- * Record it if it turns out to be usable and if we haven't recorded
- * any other constraint already.
- */
-static int constraint_can_unroll(__isl_take isl_constraint *c, void *user)
-{
-	struct cloog_can_unroll *ccu = (struct cloog_can_unroll *)user;
-	isl_int v;
-
-	isl_int_init(v);
-	isl_constraint_get_coefficient(c, isl_dim_set, ccu->level - 1, &v);
-	if (isl_int_is_pos(v)) {
-		if (!ccu->c && is_valid_unrolling_lower_bound(ccu, c))
-			ccu->c = isl_constraint_copy(c);
-	}
-	isl_int_clear(v);
-	isl_constraint_free(c);
-
-	return 0;
-}
-
-
-/* Check if we can unroll the domain at the current level.
- * If the domain is a union, we cannot.  Otherwise, we check the
- * constraints.
- */
-static int basic_set_can_unroll(__isl_take isl_basic_set *bset, void *user)
-{
-	struct cloog_can_unroll *ccu = (struct cloog_can_unroll *)user;
-	int r = 0;
-
-	if (ccu->c || !ccu->can_unroll)
-		ccu->can_unroll = 0;
-	else {
-		bset = isl_basic_set_remove_redundancies(bset);
-		r = isl_basic_set_foreach_constraint(bset,
-						&constraint_can_unroll, ccu);
-	}
-	isl_basic_set_free(bset);
-	return r;
-}
-
-
-/* Check if we can unroll the given domain at the given level, and
- * if so, return the single lower bound in *lb and an upper bound
- * on the number of iterations in *n.
- * If we cannot unroll, return 0 and set *lb to NULL.
- *
- * We can unroll, if we can identify a lower bound on level
- * such that the number of iterations is bounded by a constant.
- */
-int cloog_domain_can_unroll(CloogDomain *domain, int level, cloog_int_t *n,
-	CloogConstraint **lb)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	struct cloog_can_unroll ccu = { 1, level, NULL, set, n };
-	int r;
-
-	*lb = NULL;
-	r = isl_set_foreach_basic_set(set, &basic_set_can_unroll, &ccu);
-	assert(r == 0);
-	if (!ccu.c)
-		ccu.can_unroll = 0;
-	if (!ccu.can_unroll) {
-		isl_constraint_free(ccu.c);
-		return 0;
-	}
-
-	*lb = cloog_constraint_from_isl_constraint(ccu.c);
-
-	return ccu.can_unroll;
-}
-
-
-/* Fix the iterator i at the given level to l + o,
- * where l is prescribed by the constraint lb and o is equal to offset.
- * In particular, if lb is the constraint
- *
- *	a i >= f(j)
- *
- * then l = ceil(f(j)/a).
- */
-CloogDomain *cloog_domain_fixed_offset(CloogDomain *domain,
-	int level, CloogConstraint *lb, cloog_int_t offset)
-{
-	isl_aff *aff;
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	isl_constraint *c;
-	isl_constraint *eq;
-
-	c = cloog_constraint_to_isl(lb);
-	aff = isl_constraint_get_bound(c, isl_dim_set, level - 1);
-	aff = isl_aff_ceil(aff);
-	aff = isl_aff_add_coefficient_si(aff, isl_dim_set, level - 1, -1);
-	aff = isl_aff_add_constant(aff, offset);
-	eq = isl_equality_from_aff(aff);
-	set = isl_set_add_constraint(set, eq);
-
-	return cloog_domain_from_isl_set(set);
-}
diff --git a/cloog-0.16.3/source/loop.c b/cloog-0.16.3/source/loop.c
deleted file mode 100644
index f3d0ef9..0000000
--- a/cloog-0.16.3/source/loop.c
+++ /dev/null
@@ -1,2665 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                             loop.c                                **
-    **-------------------------------------------------------------------**
-    **                  First version: october 26th 2001                 **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-/* CAUTION: the english used for comments is probably the worst you ever read,
- *          please feel free to correct and improve it !
- */
-
-# include <stdlib.h>
-# include <stdio.h>
-# include "../include/cloog/cloog.h"
-
-#define ALLOC(type) (type*)malloc(sizeof(type))
-
-
-/******************************************************************************
- *                             Memory leaks hunting                           *
- ******************************************************************************/
-
-
-/**
- * These functions and global variables are devoted to memory leaks hunting: we
- * want to know at each moment how many CloogLoop structures had been allocated
- * (cloog_loop_allocated) and how many had been freed (cloog_loop_freed).
- * Each time a CloogLoog structure is allocated, a call to the function
- * cloog_loop_leak_up() must be carried out, and respectively
- * cloog_loop_leak_down() when a CloogLoop structure is freed. The special
- * variable cloog_loop_max gives the maximal number of CloogLoop structures
- * simultaneously alive (i.e. allocated and non-freed) in memory.
- * - July 3rd->11th 2003: first version (memory leaks hunt and correction).
- */
- 
-
-static void cloog_loop_leak_up(CloogState *state)
-{
-  state->loop_allocated++;
-  if ((state->loop_allocated - state->loop_freed) > state->loop_max)
-    state->loop_max = state->loop_allocated - state->loop_freed;
-}
-
-
-static void cloog_loop_leak_down(CloogState *state)
-{
-  state->loop_freed++;
-}
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-
-
-/**
- * cloog_loop_print_structure function:
- * Displays a loop structure in a way that trends to be understandable without
- * falling in a deep depression or, for the lucky ones, getting a headache... 
- * Written by Olivier Chorier, Luc Marchaud, Pierre Martin and Romain Tartiere.
- * - April 24th 2005: Initial version.
- * - May   21rd 2005: - New parameter `F' for destination file (ie stdout),
- *                    - Minor tweaks.
- * - May   26th 2005: Memory leak hunt.
- * - June   2nd 2005: (Ced) Integration and minor fixes.
- * -June  22nd 2005: (Ced) Adaptation for GMP.
- */
-void cloog_loop_print_structure(FILE * file, CloogLoop * loop, int level)
-{ int i, j, first=1 ;
-
-  if (loop)
-  { /* Go to the right level. */
-    for (i=0; i<level; i++)
-    fprintf(file,"|\t") ;
-    
-    fprintf(file,"+-- CloogLoop\n") ;
-  }
-  
-  /* For each loop. */
-  while (loop)
-  { if (!first)
-    { /* Go to the right level. */
-      for (i=0; i<level; i++)
-      fprintf(file,"|\t") ;
-    
-      fprintf(file,"|   CloogLoop\n") ;
-    }
-    else
-    first = 0 ;
-    
-    /* A blank line. */
-    for(j=0; j<=level+1; j++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"\n") ;
-
-    /* Print the domain. */
-    cloog_domain_print_structure(file, loop->domain, level+1, "CloogDomain");
-    
-    /* Print the stride. */
-    for(j=0; j<=level; j++)
-    fprintf(file,"|\t") ;
-    if (loop->stride) {
-	fprintf(file, "Stride: ");
-	cloog_int_print(file, loop->stride->stride);
-	fprintf(file, "\n");
-	fprintf(file, "Offset: ");
-	cloog_int_print(file, loop->stride->offset);
-	fprintf(file, "\n");
-    }
-        
-    /* A blank line. */
-    for(j=0; j<=level+1; j++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"\n") ;
-    
-    /* Print the block. */
-    cloog_block_print_structure(file,loop->block,level+1) ;
-    
-    /* A blank line. */
-    for (i=0; i<=level+1; i++)
-    fprintf(file,"|\t") ;  
-    fprintf(file,"\n") ;
-    
-    /* Print inner if any. */
-    if (loop->inner)
-    cloog_loop_print_structure(file,loop->inner,level+1) ;
-    
-    /* And let's go for the next one. */
-    loop = loop->next ;
-
-    /* One more time something that is here only for a better look. */
-    if (!loop)
-    { /* Two blank lines if this is the end of the linked list. */
-      for (j=0; j<2; j++)
-      { for (i=0; i<=level; i++)
-        fprintf(file,"|\t") ;
-      
-        fprintf(file,"\n") ;
-      }
-    }
-    else
-    { /* A special blank line if the is a next loop. */
-      for (i=0; i<=level; i++)
-      fprintf(file,"|\t") ;  
-      fprintf(file,"V\n") ;
-    }
-  }
-}
-
-
-/**
- * cloog_loop_print function:
- * This function prints the content of a CloogLoop structure (start) into a
- * file (file, possibly stdout).
- * - June 2nd 2005: Now this very old function (probably as old as CLooG) is
- *                  only a frontend to cloog_loop_print_structure, with a quite
- *                  better human-readable representation.
- */
-void cloog_loop_print(FILE * file, CloogLoop * loop)
-{ cloog_loop_print_structure(file,loop,0) ;
-}
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-
-
-/**
- * cloog_loop_free function:
- * This function frees the allocated memory for a CloogLoop structure (loop),
- * and frees its inner loops and its next loops.
- * - June 22nd 2005: Adaptation for GMP.
- */
-void cloog_loop_free(CloogLoop * loop)
-{ CloogLoop * next ;
-  
-  while (loop != NULL) {
-    cloog_loop_leak_down(loop->state);
-    
-    next = loop->next ;
-    cloog_domain_free(loop->domain) ;
-    cloog_domain_free(loop->unsimplified);
-    cloog_block_free(loop->block) ;
-    if (loop->inner != NULL)
-    cloog_loop_free(loop->inner) ;
-    
-    cloog_stride_free(loop->stride);
-    free(loop) ;
-    loop = next ;
-  }
-}
-
-
-/**
- * cloog_loop_free_parts function:
- * This function frees the allocated memory for some parts of a CloogLoop
- * structure (loop), each other argument is a boolean having to be set to 1 if
- * we want to free the corresponding part, 0 otherwise. This function applies
- * the same freeing policy to its inner ans next loops recursively.
- * - July  3rd 2003: first version.
- * - June 22nd 2005: Adaptation for GMP.
- */
-void cloog_loop_free_parts(loop, domain, block, inner, next)
-CloogLoop * loop ;
-int domain, block, inner, next ;
-{ CloogLoop * follow ;
-
-  while (loop != NULL) {
-    cloog_loop_leak_down(loop->state);
-    follow = loop->next ;
-    
-    if (domain)
-    cloog_domain_free(loop->domain) ;
-       
-    if (block)
-    cloog_block_free(loop->block) ;
-     
-    if ((inner) && (loop->inner != NULL))
-    cloog_loop_free_parts(loop->inner,domain,block,inner,1) ;
-    
-    cloog_domain_free(loop->unsimplified);
-    cloog_stride_free(loop->stride);
-    free(loop) ;
-    if (next)
-    loop = follow ;
-    else
-    loop = NULL ;
-  }
-}
-
-
-/******************************************************************************
- *                              Reading functions                             *
- ******************************************************************************/
-
-
-/**
- * Construct a CloogLoop structure from a given iteration domain
- * and statement number.
- */
-CloogLoop *cloog_loop_from_domain(CloogState *state, CloogDomain *domain,
-	int number)
-{
-  int nb_iterators;
-  CloogLoop * loop ;
-  CloogStatement * statement ;
-  
-  /* Memory allocation and information reading for the first domain: */
-  loop = cloog_loop_malloc(state);
-  /* domain. */
-  loop->domain = domain;
-  if (loop->domain != NULL)
-    nb_iterators = cloog_domain_dimension(loop->domain);
-  else
-  nb_iterators = 0 ;
-  /* included statement block. */
-  statement = cloog_statement_alloc(state, number + 1);
-  loop->block = cloog_block_alloc(statement, 0, NULL, nb_iterators);
-
-  return loop ;
-}
-
-
-/**
- * cloog_loop_read function:
- * This function reads loop data from a file (foo, possibly stdin) and
- * returns a pointer to a CloogLoop structure containing the read information.
- * This function can be used only for input file reading, when one loop is
- * associated with one statement.
- * - number is the statement block number carried by the loop (-1 if none).
- * - nb_parameters is the number of parameters.
- **
- * - September 9th 2002: first version.
- * - April    16th 2005: adaptation to new CloogStatement struct (with number).
- * - June     11th 2005: adaptation to new CloogBlock structure. 
- * - June     22nd 2005: Adaptation for GMP.
- */
-CloogLoop *cloog_loop_read(CloogState *state,
-			    FILE *foo, int number, int nb_parameters)
-{
-  int op1, op2, op3;
-  char s[MAX_STRING];
-  CloogDomain *domain;
-
-  domain = cloog_domain_union_read(state, foo, nb_parameters);
-    
-  /* To read that stupid "0 0 0" line. */
-  while (fgets(s,MAX_STRING,foo) == 0) ;
-  while ((*s=='#' || *s=='\n') || (sscanf(s," %d %d %d",&op1,&op2,&op3)<3))
-  fgets(s,MAX_STRING,foo) ;
-
-  return cloog_loop_from_domain(state, domain, number);
-}
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-
-
-/**
- * cloog_loop_malloc function:
- * This function allocates the memory space for a CloogLoop structure and
- * sets its fields with default values. Then it returns a pointer to the
- * allocated space.
- * - November 21th 2005: first version.
- */
-CloogLoop *cloog_loop_malloc(CloogState *state)
-{ CloogLoop * loop ;
-  
-  /* Memory allocation for the CloogLoop structure. */
-  loop = (CloogLoop *)malloc(sizeof(CloogLoop)) ;
-  if (loop == NULL) 
-    cloog_die("memory overflow.\n");
-  cloog_loop_leak_up(state);
- 
-  
-  /* We set the various fields with default values. */
-  loop->state    = state;
-  loop->domain = NULL ;
-  loop->unsimplified = NULL;
-  loop->block  = NULL ;
-  loop->usr    = NULL;
-  loop->inner  = NULL ;
-  loop->next   = NULL ;
-  loop->otl = 0;
-  loop->stride = NULL;
-  
-  return loop ;
-}  
-
-
-/**
- * cloog_loop_alloc function:
- * This function allocates the memory space for a CloogLoop structure and
- * sets its fields with those given as input. Then it returns a pointer to the
- * allocated space.
- * - October  27th 2001: first version. 
- * - June     22nd 2005: Adaptation for GMP.
- * - November 21th 2005: use of cloog_loop_malloc.
- */ 
-CloogLoop *cloog_loop_alloc(CloogState *state,
-	CloogDomain *domain, int otl, CloogStride *stride,
-	CloogBlock *block, CloogLoop *inner, CloogLoop *next)
-{ CloogLoop * loop ;
-    
-  loop = cloog_loop_malloc(state);
-  
-  loop->domain = domain ;
-  loop->block  = block ;
-  loop->inner  = inner ;
-  loop->next   = next ;
-  loop->otl = otl;
-  loop->stride = cloog_stride_copy(stride);
-  
-  return(loop) ;
-}
-
-
-/**
- * cloog_loop_add function:
- * This function adds a CloogLoop structure (loop) at a given place (now) of a
- * NULL terminated list of CloogLoop structures. The beginning of this list
- * is (start). This function updates (now) to (loop), and updates (start) if the
- * added element is the first one -that is when (start) is NULL-.
- * - October 28th 2001: first version. 
- */ 
-void cloog_loop_add(CloogLoop ** start, CloogLoop ** now, CloogLoop * loop)
-{ if (*start == NULL)
-  { *start = loop ;
-    *now = *start ;
-  }
-  else
-  { (*now)->next = loop ;
-    *now = (*now)->next ;
-  }
-}
-
-
-/**
- * cloog_loop_add function:
- * This function adds a CloogLoop structure (loop) at a given place (now) of a
- * NULL terminated list of CloogLoop structures. The beginning of this list
- * is (start). This function updates (now) to the end of the loop list (loop),
- * and updates (start) if the added element is the first one -that is when
- * (start) is NULL-.
- * - September 9th 2005: first version.
- */ 
-void cloog_loop_add_list(CloogLoop ** start, CloogLoop ** now, CloogLoop * loop)
-{ if (*start == NULL)
-  { *start = loop ;
-    *now = *start ;
-  }
-  else
-  { (*now)->next = loop ;
-    *now = (*now)->next ;
-  }
-  
-  while ((*now)->next != NULL)
-  *now = (*now)->next ;
-}
-
-
-/**
- * cloog_loop_copy function:
- * This function returns a copy of the CloogLoop structure given as input. In
- * fact, there is just new allocations for the CloogLoop structures, but their
- * contents are the same.
- * - October 28th 2001: first version. 
- * - July 3rd->11th 2003: memory leaks hunt and correction.
- */ 
-CloogLoop * cloog_loop_copy(CloogLoop * source)
-{ CloogLoop * loop ;
-  CloogBlock * block ;
-  CloogDomain * domain ;
-
-  loop = NULL ;
-  if (source != NULL)
-  { domain = cloog_domain_copy(source->domain) ;
-    block  = cloog_block_copy(source->block) ;
-    loop   = cloog_loop_alloc(source->state, domain, source->otl,
-		source->stride, block, NULL,  NULL);
-    loop->usr = source->usr;
-    loop->inner = cloog_loop_copy(source->inner) ;
-    loop->next = cloog_loop_copy(source->next) ;
-  }
-  return(loop) ;
-}
-
-
-/**
- * cloog_loop_add_disjoint function:
- * This function adds some CloogLoop structures at a given place (now) of a
- * NULL terminated list of CloogLoop structures. The beginning of this list
- * is (start). (loop) can be an union of polyhedra, this function separates the
- * union into a list of *disjoint* polyhedra then adds the list. This function
- * updates (now) to the end of the list and updates (start) if first added
- * element is the first of the principal list -that is when (start) is NULL-.
- * (loop) can be freed by this function, basically when its domain is actually
- * a union of polyhedra, but don't worry, all the useful data are now stored
- * inside the list (start). We do not use PolyLib's Domain_Disjoint function,
- * since the number of union components is often higher (thus code size too).
- * - October   28th 2001: first version. 
- * - November  14th 2001: bug correction (this one was hard to find !).
- * - July 3rd->11th 2003: memory leaks hunt and correction.
- * - June      22nd 2005: Adaptation for GMP.
- * - October   27th 2005: (debug) included blocks were not copied for new loops.
- */ 
-void cloog_loop_add_disjoint(start, now, loop)
-CloogLoop ** start, ** now, * loop ;
-{
-  CloogLoop * sep, * inner ;
-  CloogDomain *domain, *seen, *temp, *rest;
-  CloogBlock * block ;
-  
-  if (cloog_domain_isconvex(loop->domain))
-  cloog_loop_add(start,now,loop) ;
-  else {
-    domain = cloog_domain_simplify_union(loop->domain);
-    loop->domain = NULL ;
-    
-    /* We separate the first element of the rest of the union. */
-    domain = cloog_domain_cut_first(domain, &rest);
-            
-    /* This first element is the first of the list of disjoint polyhedra. */
-    sep = cloog_loop_alloc(loop->state, domain, 0, NULL,
-			   loop->block, loop->inner, NULL);
-    cloog_loop_add(start,now,sep) ;
-  
-    seen = cloog_domain_copy(domain);
-    while (!cloog_domain_isempty(domain = rest)) {
-      temp = cloog_domain_cut_first(domain, &rest);
-      domain = cloog_domain_difference(temp, seen);
-      cloog_domain_free(temp);
-
-      if (cloog_domain_isempty(domain)) {
-	cloog_domain_free(domain);
-	continue;
-      }
-      
-      /* Each new loop will have its own life, for instance we can free its
-       * inner loop and included block. Then each one must have its own copy
-       * of both 'inner' and 'block'.
-       */
-      inner = cloog_loop_copy(loop->inner) ;
-      block = cloog_block_copy(loop->block) ;
-      
-      sep = cloog_loop_alloc(loop->state, cloog_domain_copy(domain),
-			     0, NULL, block, inner, NULL);
-      /* domain can be an union too. If so: recursion. */
-      if (cloog_domain_isconvex(domain))
-	cloog_loop_add(start,now,sep) ;
-      else
-	cloog_loop_add_disjoint(start,now,sep) ;
-
-      if (cloog_domain_isempty(rest)) {
-	cloog_domain_free(domain);
-	break;
-      }
-       
-      seen = cloog_domain_union(seen, domain);
-    }
-    cloog_domain_free(rest);
-    cloog_domain_free(seen);
-    cloog_loop_free_parts(loop,0,0,0,0) ;  
-  }
-}
-
-
-/**
- * cloog_loop_disjoint function:
- * This function returns a list of loops such that each loop with non-convex
- * domain in the input list (loop) is separated into several loops where the
- * domains are the components of the union of *disjoint* polyhedra equivalent
- * to the original non-convex domain. See cloog_loop_add_disjoint comments
- * for more details.
- * - September 16th 2005: first version.
- */
-CloogLoop * cloog_loop_disjoint(CloogLoop * loop)
-{ CloogLoop *res=NULL, * now=NULL, * next ;
-  
-  /* Because this is often the case, don't waste time ! */
-  if (loop && !loop->next && cloog_domain_isconvex(loop->domain))
-  return loop ;
-
-  while (loop != NULL)
-  { next = loop->next ;
-    loop->next = NULL ;
-    cloog_loop_add_disjoint(&res,&now,loop) ;
-    loop = next ;
-  }
-  
-  return res ;
-}
-
-
-/**
- * cloog_loop_restrict function:
- * This function returns the (loop) in the context of (context): it makes the
- * intersection between the (loop) domain and the (context), then it returns
- * a pointer to a new loop, with this intersection as domain.
- **
- * - October 27th 2001: first version. 
- * - June    15th 2005: a memory leak fixed (domain was not freed when empty).
- * - June    22nd 2005: Adaptation for GMP.
- */ 
-CloogLoop *cloog_loop_restrict(CloogLoop *loop, CloogDomain *context)
-{ int new_dimension ;
-  CloogDomain * domain, * extended_context, * new_domain ;
-  CloogLoop * new_loop ;
-      
-  domain = loop->domain ;
-  if (cloog_domain_dimension(domain) > cloog_domain_dimension(context))
-  {
-    new_dimension = cloog_domain_dimension(domain);
-    extended_context = cloog_domain_extend(context, new_dimension);
-    new_domain = cloog_domain_intersection(extended_context,loop->domain) ;
-    cloog_domain_free(extended_context) ;
-  }
-  else
-  new_domain = cloog_domain_intersection(context,loop->domain) ;
-  
-  if (cloog_domain_isempty(new_domain))
-  { cloog_domain_free(new_domain) ;
-    return(NULL) ;
-  }
-  else {
-    new_loop = cloog_loop_alloc(loop->state, new_domain,
-				0, NULL, loop->block, loop->inner, NULL);
-    return(new_loop) ;
-  }
-}
-
-
-/**
- * Call cloog_loop_restrict on each loop in the list "loop" and return
- * the concatenated result.
- */
-CloogLoop *cloog_loop_restrict_all(CloogLoop *loop, CloogDomain *context)
-{
-    CloogLoop *next;
-    CloogLoop *res = NULL;
-    CloogLoop **res_next = &res;
-
-    for (; loop; loop = next) {
-	next = loop->next;
-
-	*res_next = cloog_loop_restrict(loop, context);
-	if (*res_next) {
-	    res_next = &(*res_next)->next;
-	    cloog_loop_free_parts(loop, 1, 0, 0, 0);
-	} else {
-	    loop->next = NULL;
-	    cloog_loop_free(loop);
-	}
-    }
-
-    return res;
-}
-
-
-/**
- * Restrict the domains of the inner loops of each loop l in the given
- * list of loops to the domain of the loop l.  If the domains of all
- * inner loops of a given loop l turn out to be empty, then remove l
- * from the list.
- */
-CloogLoop *cloog_loop_restrict_inner(CloogLoop *loop)
-{
-    CloogLoop *next;
-    CloogLoop *res;
-    CloogLoop **res_next = &res;
-
-    for (; loop; loop = next) {
-	next = loop->next;
-
-	loop->inner = cloog_loop_restrict_all(loop->inner, loop->domain);
-	if (loop->inner) {
-	    *res_next = loop;
-	    res_next = &(*res_next)->next;
-	} else {
-	    loop->next = NULL;
-	    cloog_loop_free(loop);
-	}
-    }
-
-    *res_next = NULL;
-
-    return res;
-}
-
-/**
- * cloog_loop_project function:
- * This function returns the projection of (loop) on the (level) first
- * dimensions (outer loops). It makes the projection of the (loop) domain,
- * then it returns a pointer to a new loop, with this projection as domain.
- **
- * - October   27th 2001: first version. 
- * - July 3rd->11th 2003: memory leaks hunt and correction.
- * - June      22nd 2005: Adaptation for GMP.
- */ 
-CloogLoop * cloog_loop_project(CloogLoop * loop, int level)
-{
-  CloogDomain * new_domain ;
-  CloogLoop * new_loop, * copy ;
-
-  copy = cloog_loop_alloc(loop->state, loop->domain, loop->otl, loop->stride,
-			  loop->block, loop->inner, NULL);
-
-  if (cloog_domain_dimension(loop->domain) == level)
-  new_domain = cloog_domain_copy(loop->domain) ;  
-  else
-    new_domain = cloog_domain_project(loop->domain, level);
-
-  new_loop = cloog_loop_alloc(loop->state, new_domain, 0, NULL,
-			      NULL, copy, NULL);
-  
-  return(new_loop) ;
-}
-
-
-/**
- * Call cloog_loop_project on each loop in the list "loop" and return
- * the concatenated result.
- */
-CloogLoop *cloog_loop_project_all(CloogLoop *loop, int level)
-{
-    CloogLoop *next;
-    CloogLoop *res = NULL;
-    CloogLoop **res_next = &res;
-
-    for (; loop; loop = next) {
-	next = loop->next;
-
-	*res_next = cloog_loop_project(loop, level);
-	res_next = &(*res_next)->next;
-	cloog_loop_free_parts(loop, 0, 0, 0, 0);
-    }
-
-    return res;
-}
-
-
-/**
- * cloog_loop_concat function:
- * This function returns a pointer to the concatenation of the
- * CloogLoop lists given as input.
- * - October 28th 2001: first version. 
- */
-CloogLoop * cloog_loop_concat(CloogLoop * a, CloogLoop * b)
-{ CloogLoop * loop, * temp ;
-
-  loop = a  ;
-  temp = loop ;
-  if (loop != NULL)
-  { while (temp->next != NULL)
-    temp = temp->next ;
-    temp->next = b ;
-  }
-  else
-  loop = b ;
-  
-  return(loop) ;
-} 
-
-
-/**
- * cloog_loop_combine:
- * Combine consecutive loops with identical domains into
- * a single loop with the concatenation of their inner loops
- * as inner loop.
- */
-CloogLoop *cloog_loop_combine(CloogLoop *loop)
-{
-    CloogLoop *first, *second;
-
-    for (first = loop; first; first = first->next) {
-	while (first->next) {
-	    if (!cloog_domain_lazy_equal(first->domain, first->next->domain))
-		break;
-	    second = first->next;
-	    first->inner = cloog_loop_concat(first->inner, second->inner);
-	    first->next = second->next;
-	    cloog_loop_free_parts(second, 1, 0, 0, 0);
-	}
-    }
-
-    return loop;
-}
-
-/**
- * Remove loops from list that have an empty domain.
- */
-CloogLoop *cloog_loop_remove_empty_domain_loops(CloogLoop *loop)
-{
-    CloogLoop *l, *res, *next, **res_next;
-
-    res = NULL;
-    res_next = &res;
-    for (l = loop; l; l = next) {
-	next = l->next;
-	if (cloog_domain_isempty(l->domain))
-	    cloog_loop_free_parts(l, 1, 1, 1, 0);
-	else {
-	    *res_next = l;
-	    res_next = &(*res_next)->next;
-	}
-    }
-    *res_next = NULL;
-
-    return res;
-}
-
-CloogLoop *cloog_loop_decompose_inner(CloogLoop *loop,
-	int level, int scalar, int *scaldims, int nb_scattdims);
-
-/* For each loop with only one inner loop, replace the domain
- * of the loop with the projection of the domain of the inner
- * loop.  To increase the number of loops with a single inner
- * we first decompose the inner loops into strongly connected
- * components.
- */
-CloogLoop *cloog_loop_specialize(CloogLoop *loop,
-	int level, int scalar, int *scaldims, int nb_scattdims)
-{
-    int dim;
-    CloogDomain *domain;
-    CloogLoop *l;
-
-    loop = cloog_loop_decompose_inner(loop, level, scalar,
-					scaldims, nb_scattdims);
-
-    for (l = loop; l; l = l->next) {
-	if (l->inner->next)
-	    continue;
-	if (!cloog_domain_isconvex(l->inner->domain))
-	    continue;
-
-	dim = cloog_domain_dimension(l->domain);
-	domain = cloog_domain_project(l->inner->domain, dim);
-	if (cloog_domain_isconvex(domain)) {
-	    cloog_domain_free(l->domain);
-	    l->domain = domain;
-	} else {
-	    cloog_domain_free(domain);
-	}
-    }
-
-    return cloog_loop_remove_empty_domain_loops(loop);
-}
-
-/* For each loop with only one inner loop, propagate the bounds from
- * the inner loop domain to the outer loop domain.  This is especially
- * useful if the inner loop domain has a non-trivial stride which
- * results in an update of the lower bound.
- */
-CloogLoop *cloog_loop_propagate_lower_bound(CloogLoop *loop, int level)
-{
-    int dim;
-    CloogDomain *domain, *t;
-    CloogLoop *l;
-
-    for (l = loop; l; l = l->next) {
-	if (l->inner->next)
-	    continue;
-	if (!cloog_domain_isconvex(l->inner->domain))
-	    continue;
-
-	dim = cloog_domain_dimension(l->domain);
-	domain = cloog_domain_project(l->inner->domain, dim);
-	if (cloog_domain_isconvex(domain)) {
-	    t = cloog_domain_intersection(domain, l->domain);
-	    cloog_domain_free(l->domain);
-	    l->domain = t;
-	}
-	cloog_domain_free(domain);
-    }
-
-    return loop;
-}
-
-/**
- * cloog_loop_separate function:
- * This function implements the Quillere algorithm for separation of multiple
- * loops: for a given set of polyhedra (loop), it computes a set of disjoint
- * polyhedra such that the unions of these sets are equal, and returns this set.
- * - October   28th 2001: first version. 
- * - November  14th 2001: elimination of some unused blocks.
- * - August    13th 2002: (debug) in the case of union of polyhedra for one
- *                        loop, redundant constraints are fired.
- * - July 3rd->11th 2003: memory leaks hunt and correction.
- * - June      22nd 2005: Adaptation for GMP.
- * - October   16th 2005: Removal of the non-shared constraint elimination when
- *                        there is only one loop in the list (seems to work
- *                        without now, DomainSimplify may have been improved).
- *                        The problem was visible with test/iftest2.cloog.
- */ 
-CloogLoop * cloog_loop_separate(CloogLoop * loop)
-{ int lazy_equal=0, disjoint = 0;
-  CloogLoop * new_loop, * new_inner, * res, * now, * temp, * Q, 
-            * inner, * old /*, * previous, * next*/  ;
-  CloogDomain *UQ, *domain;
-  
-  if (loop == NULL)
-  return NULL ;
-
-  loop = cloog_loop_combine(loop);
-  
-  if (loop->next == NULL)
-  return cloog_loop_disjoint(loop) ;
-     
-  UQ     = cloog_domain_copy(loop->domain) ;
-  domain = cloog_domain_copy(loop->domain) ;
-  res    = cloog_loop_alloc(loop->state, domain, 0, NULL,
-			    loop->block, loop->inner, NULL);
-  	  
-  old = loop ;
-  while((loop = loop->next) != NULL)
-  { temp = NULL ;
-    
-    /* For all Q, add Q-loop associated with the blocks of Q alone,
-     * and Q inter loop associated with the blocks of Q and loop.
-     */
-    for (Q = res; Q; Q = Q->next) {
-        /* Add (Q inter loop). */
-        if ((disjoint = cloog_domain_lazy_disjoint(Q->domain,loop->domain)))
-	domain = NULL ;
-	else
-	{ if ((lazy_equal = cloog_domain_lazy_equal(Q->domain,loop->domain)))
-	  domain = cloog_domain_copy(Q->domain) ;
-          else
-	  domain = cloog_domain_intersection(Q->domain,loop->domain) ;
-          
-	  if (!cloog_domain_isempty(domain))
-          { new_inner = cloog_loop_concat(cloog_loop_copy(Q->inner),
-                                          cloog_loop_copy(loop->inner)) ;
-	    new_loop = cloog_loop_alloc(loop->state, domain, 0, NULL,
-					NULL, new_inner, NULL);
-            cloog_loop_add_disjoint(&temp,&now,new_loop) ;
-          }
-          else {
-	    disjoint = 1;
-	    cloog_domain_free(domain);
-	  }
-        }
-        
-	/* Add (Q - loop). */
-        if (disjoint)
-	domain = cloog_domain_copy(Q->domain) ;
-	else
-	{ if (lazy_equal)
-	  domain = cloog_domain_empty(Q->domain);
-	  else
-	  domain = cloog_domain_difference(Q->domain,loop->domain) ;
-	}
-	
-	if (!cloog_domain_isempty(domain)) {
-          new_loop = cloog_loop_alloc(loop->state, domain, 0, NULL,
-				      NULL, Q->inner, NULL);
-          cloog_loop_add_disjoint(&temp,&now,new_loop) ;
-        }
-        else
-        { cloog_domain_free(domain) ;
-	  /* If Q->inner is no more useful, we can free it. */
-          inner = Q->inner ;
-          Q->inner = NULL ;
-          cloog_loop_free(inner) ;
-        }
-    }
-
-    /* Add loop-UQ associated with the blocks of loop alone.*/
-    if (cloog_domain_lazy_disjoint(loop->domain,UQ))
-    domain = cloog_domain_copy(loop->domain) ;
-    else
-    { if (cloog_domain_lazy_equal(loop->domain,UQ))
-      domain = cloog_domain_empty(UQ);
-      else
-      domain = cloog_domain_difference(loop->domain,UQ) ;
-    }
-    
-    if (!cloog_domain_isempty(domain)) {
-      new_loop = cloog_loop_alloc(loop->state, domain, 0, NULL,
-				  NULL, loop->inner, NULL);
-      cloog_loop_add_disjoint(&temp,&now,new_loop) ;
-    }
-    else
-    { cloog_domain_free(domain) ;
-      /* If loop->inner is no more useful, we can free it. */
-      cloog_loop_free(loop->inner) ;
-    }
-    
-    loop->inner = NULL ;
-
-    if (loop->next != NULL)
-      UQ = cloog_domain_union(UQ, cloog_domain_copy(loop->domain));
-    else
-      cloog_domain_free(UQ);
-
-    cloog_loop_free_parts(res,1,0,0,1) ;
-
-    res = temp ;
-  }  
-  cloog_loop_free_parts(old,1,0,0,1) ;
-
-  return(res) ;
-}
-
-
-static CloogDomain *bounding_domain(CloogDomain *dom, CloogOptions *options)
-{
-    if (options->sh)
-	return cloog_domain_simple_convex(dom);
-    else
-	return cloog_domain_convex(dom);
-}
-
-
-/**
- * cloog_loop_merge function:
- * This function is the 'soft' version of loop_separate if we are looking for
- * a code much simpler (and less efficicient).  This function returns the new
- * CloogLoop list.
- * - October 29th 2001: first version. 
- * - July 3rd->11th 2003: memory leaks hunt and correction.
- * - June      22nd 2005: Adaptation for GMP.
- */ 
-CloogLoop *cloog_loop_merge(CloogLoop *loop, int level, CloogOptions *options)
-{
-    CloogLoop *res, *new_inner, *old;
-    CloogDomain *new_domain, *temp;
-
-    if (loop == NULL)
-	return loop;
-
-    if (loop->next == NULL && cloog_domain_isconvex(loop->domain))
-	return loop;
-
-    old = loop;
-    temp = loop->domain;
-    loop->domain = NULL;
-    new_inner = loop->inner;
-
-    for (loop = loop->next; loop; loop = loop->next) {
-	temp = cloog_domain_union(temp, loop->domain);
-	loop->domain = NULL;
-	new_inner = cloog_loop_concat(new_inner, loop->inner);
-    }
-
-    new_domain = bounding_domain(temp, options);
-
-    if (level > 0 && !cloog_domain_is_bounded(new_domain, level) &&
-	    	     cloog_domain_is_bounded(temp, level)) {
-	CloogDomain *splitter, *t2;
-
-	cloog_domain_free(new_domain);
-	splitter = cloog_domain_bound_splitter(temp, level);
-
-	res = NULL;
-	while (!cloog_domain_isconvex(splitter)) {
-	    CloogDomain *first, *rest;
-	    first = cloog_domain_cut_first(splitter, &rest);
-	    splitter = rest;
-	    t2 = cloog_domain_intersection(first, temp);
-	    cloog_domain_free(first);
-
-	    new_domain = bounding_domain(t2, options);
-	    cloog_domain_free(t2);
-
-	    if (cloog_domain_isempty(new_domain)) {
-		cloog_domain_free(new_domain);
-		continue;
-	    }
-	    res = cloog_loop_alloc(old->state, new_domain, 0, NULL,
-				   NULL, cloog_loop_copy(new_inner), res);
-	}
-
-	t2 = cloog_domain_intersection(splitter, temp);
-	cloog_domain_free(splitter);
-
-	new_domain = bounding_domain(t2, options);
-	cloog_domain_free(t2);
-
-	if (cloog_domain_isempty(new_domain)) {
-	    cloog_domain_free(new_domain);
-	    cloog_loop_free(new_inner);
-	} else
-	    res = cloog_loop_alloc(old->state, new_domain, 0, NULL,
-				   NULL, new_inner, res);
-    } else {
-	res = cloog_loop_alloc(old->state, new_domain, 0, NULL,
-			       NULL, new_inner, NULL);
-    }
-    cloog_domain_free(temp);
-
-    cloog_loop_free_parts(old, 0, 0, 0, 1);
-
-    return res;
-}
-
-
-static int cloog_loop_count(CloogLoop *loop)
-{
-    int nb_loops;
-
-    for (nb_loops = 0; loop; loop = loop->next)
-	nb_loops++;
-
-    return  nb_loops;
-}
-
-
-/**
- * cloog_loop_sort function:
- * Adaptation from LoopGen 0.4 by F. Quillere. This function sorts a list of
- * parameterized disjoint polyhedra, in order to not have lexicographic order
- * violation (see Quillere paper).
- * - September 16th 2005: inclusion of cloog_loop_number (October 29th 2001).
- */ 
-CloogLoop *cloog_loop_sort(CloogLoop *loop, int level)
-{
-  CloogLoop *res, *now, **loop_array;
-  CloogDomain **doms;
-  int i, nb_loops=0, * permut ;
-
-  /* There is no need to sort the parameter domains. */
-  if (!level)
-    return loop;
-  
-  /* We will need to know how many loops are in the list. */
-  nb_loops = cloog_loop_count(loop);
-
-  /* If there is only one loop, it's the end. */
-  if (nb_loops == 1)
-  return(loop) ;
-
-  /* We have to allocate memory for some useful components:
-   * - loop_array: the loop array,
-   * - doms: the array of domains to sort,
-   * - permut: will give us a possible sort (maybe not the only one).
-   */
-  loop_array = (CloogLoop **)malloc(nb_loops*sizeof(CloogLoop *)) ;
-  doms = (CloogDomain **)malloc(nb_loops*sizeof(CloogDomain *));
-  permut = (int *)malloc(nb_loops*sizeof(int)) ;
-
-  /* We fill up the loop and domain arrays. */
-  for (i=0;i<nb_loops;i++,loop=loop->next)
-  { loop_array[i] = loop ;
-    doms[i] = loop_array[i]->domain;
-  }
-  
-  /* cloog_domain_sort will fill up permut. */
-  cloog_domain_sort(doms, nb_loops, level, permut);
-  
-  /* With permut and loop_array we build the sorted list. */
-  res = NULL ;
-  for (i=0;i<nb_loops;i++)
-  { /* To avoid pointer looping... loop_add will rebuild the list. */
-    loop_array[permut[i]-1]->next = NULL ;
-    cloog_loop_add(&res,&now,loop_array[permut[i]-1]) ;
-  }
-  
-  free(permut) ;
-  free(doms);
-  free(loop_array) ;
-
-  return res;
-}
-
-
-/**
- * cloog_loop_nest function:
- * This function changes the loop list in such a way that we have no more than
- * one dimension added by level. It returns an equivalent loop list with
- * this property.
- * - October 29th 2001: first version.
- * - July 3rd->11th 2003: memory leaks hunt and correction.
- * - June      22nd 2005: Adaptation for GMP.
- * - November  21th 2005: (debug) now OK when cloog_loop_restrict returns NULL.
- */ 
-CloogLoop *cloog_loop_nest(CloogLoop *loop, CloogDomain *context, int level)
-{ int l ;
-  CloogLoop * p, * temp, * res, * now, * next ;
-  CloogDomain * new_domain ;
-
-  loop = cloog_loop_disjoint(loop);
-
-  res = NULL ;
-  /* Each domain is changed by its intersection with the context. */
-  while (loop != NULL)
-  { p = cloog_loop_restrict(loop, context);
-    next = loop->next ;
-    
-    if (p != NULL)
-    { cloog_loop_free_parts(loop,1,0,0,0) ;
-    
-      temp = cloog_loop_alloc(p->state, p->domain, 0, NULL,
-			      p->block, p->inner, NULL);
-    
-      /* If the intersection dimension is too big, we make projections smaller
-       * and smaller, and each projection includes the preceding projection
-       * (thus, in the target list, dimensions are added one by one).
-       */
-      if (cloog_domain_dimension(p->domain) >= level)
-	for (l = cloog_domain_dimension(p->domain); l >= level; l--) {
-	  new_domain = cloog_domain_project(p->domain, l);
-	  temp = cloog_loop_alloc(p->state, new_domain, 0, NULL,
-				  NULL, temp, NULL);
-	}
-
-       /* p is no more useful (but its content yes !). */ 
-      cloog_loop_free_parts(p,0,0,0,0) ;
-    
-      cloog_loop_add(&res,&now,temp) ;
-    }
-    else
-    cloog_loop_free_parts(loop,1,1,1,0) ;
-    
-    loop = next ;
-  }
-  
-  return(res) ;
-}
-
-
-/* Check if the domains of the inner loops impose a stride constraint
- * on the given level.
- * The core of the search is implemented in cloog_domain_list_stride.
- * Here, we simply construct a list of domains to pass to this function
- * and if a stride is found, we adjust the lower bounds by calling
- * cloog_domain_stride_lower_bound.
- */
-static int cloog_loop_variable_offset_stride(CloogLoop *loop, int level)
-{
-    CloogDomainList *list = NULL;
-    CloogLoop *inner;
-    CloogStride *stride;
-
-    for (inner = loop->inner; inner; inner = inner->next) {
-	CloogDomainList *entry = ALLOC(CloogDomainList);
-	entry->domain = cloog_domain_copy(inner->domain);
-	entry->next = list;
-	list = entry;
-    }
-
-    stride = cloog_domain_list_stride(list, level);
-
-    cloog_domain_list_free(list);
-
-    if (!stride)
-	return 0;
-
-    loop->stride = stride;
-    loop->domain = cloog_domain_stride_lower_bound(loop->domain, level, stride);
-
-    return 1;
-}
-
-
-/**
- * cloog_loop_stride function:
- * This function will find the stride of a loop for the iterator at the column
- * number 'level' in the constraint matrix. It will update the lower bound of
- * the iterator accordingly. Basically, the function will try to find in the
- * inner loops a common condition on this iterator for the inner loop iterators
- * to be integral. For instance, let us consider a loop with the iterator i,
- * the iteration domain -4<=i<=n, and its two inner loops with the iterator j.
- * The first inner loop has the constraint 3j=i, and the second one has the
- * constraint 6j=i. Then the common constraint on i for j to be integral is
- * i%3=0, the stride for i is 3. Lastly, we have to find the new lower bound
- * for i: the first value satisfying the common constraint: -3. At the end, the
- * iteration domain for i is -3<=i<=n and the stride for i is 3.
- *
- * The algorithm implemented in this function only allows for strides
- * on loops with a lower bound that has a constant remainder on division
- * by the stride.  Before initiating this procedure, we first check
- * if we can find a stride with a lower bound with a variable offset in
- * cloog_loop_variable_offset_stride.
- *
- * - loop is the loop including the iteration domain of the considered iterator,
- * - level is the column number of the iterator in the matrix of contraints.
- **
- * - June 29th 2003: first version (work in progress since June 26th 2003).
- * - July 14th 2003: simpler version.
- * - June 22nd 2005: Adaptation for GMP (from S. Verdoolaege's 0.12.1 version).
- */
-void cloog_loop_stride(CloogLoop * loop, int level)
-{ int first_search ;
-  cloog_int_t stride, ref_offset, offset, potential;
-  CloogLoop * inner ;
-
-  if (!cloog_domain_can_stride(loop->domain, level))
-    return;
-
-  if (cloog_loop_variable_offset_stride(loop, level))
-    return;
-
-  cloog_int_init(stride);
-  cloog_int_init(ref_offset);
-  cloog_int_init(offset);
-  cloog_int_init(potential);
-
-  cloog_int_set_si(ref_offset, 0);
-  cloog_int_set_si(offset, 0);
-
-  /* Default stride. */
-  cloog_int_set_si(stride, 1);
-  first_search = 1 ;
-  inner = loop->inner ;
-    
-  while (inner != NULL)
-  { /* If the minimun stride has not been found yet, find the stride. */
-    if ((first_search) || (!cloog_int_is_one(stride)))
-    {
-      cloog_domain_stride(inner->domain, level, &potential, &offset);
-      if (!cloog_int_is_one(potential) && (!first_search))
-      { /* Offsets must be the same for common stride. */
-	cloog_int_gcd(stride, potential, stride);
-	if (!cloog_int_is_zero(stride)) {
-	    cloog_int_fdiv_r(offset, offset, stride);
-	    cloog_int_fdiv_r(ref_offset, ref_offset, stride);
-	}
-        if (cloog_int_ne(offset,ref_offset))
-	    cloog_int_set_si(stride, 1);
-      }
-      else {
-        cloog_int_set(stride, potential);
-        cloog_int_set(ref_offset, offset);
-      }
-	
-      first_search = 0 ;
-    }
-      
-    inner = inner->next ;
-  }
-
-  if (cloog_int_is_zero(stride))
-    cloog_int_set_si(stride, 1);
-    
-  /* Update the values if necessary. */
-  if (!cloog_int_is_one(stride))
-  { /* Update the stride value. */
-    if (!cloog_int_is_zero(offset))
-      cloog_int_sub(offset, stride, offset);
-    loop->stride = cloog_stride_alloc(stride, offset);
-    loop->domain = cloog_domain_stride_lower_bound(loop->domain, level,
-						    loop->stride);
-  }
-  
-  cloog_int_clear(stride);
-  cloog_int_clear(ref_offset);
-  cloog_int_clear(offset);
-  cloog_int_clear(potential);
-}
-
-
-void cloog_loop_otl(CloogLoop *loop, int level)
-{
-    if (cloog_domain_is_otl(loop->domain, level))
-	loop->otl = 1;
-}
-
-
-/**
- * cloog_loop_stop function:
- * This function implements the 'stop' option : each domain of each loop
- * in the list 'loop' is replaced by 'context'. 'context' should be the
- * domain of the outer loop. By using this method, there are no more dimensions
- * to scan and the simplification step will automaticaly remove the domains
- * since they are the same as the corresponding contexts. The effect of this
- * function is to stop the code generation at the level this function is called,
- * the resulting code do not consider the next dimensions.
- * - January 11th 2005: first version.
- */
-CloogLoop * cloog_loop_stop(CloogLoop * loop, CloogDomain * context)
-{ if (loop == NULL)
-  return NULL ;
-  else
-  { cloog_domain_free(loop->domain) ;
-    loop->domain = cloog_domain_copy(context) ;
-    loop->next = cloog_loop_stop(loop->next, context) ;
-  }
-  
-  return loop ;
-}
-
-
-static int level_is_constant(int level, int scalar, int *scaldims, int nb_scattdims)
-{
-  return level && (level+scalar <= nb_scattdims) && (scaldims[level+scalar-1]);
-}
-
-
-/**
- * Compare the constant dimensions of loops 'l1' and 'l2' starting at 'scalar'
- * and return -1 if the vector of constant dimensions of 'l1' is smaller
- * than that of 'l2', 0 if they are the same and +1 if that of 'l1' is
- * greater than that of 'l2'.
- * This function should be called on the innermost loop (the loop
- * containing a block).
- * \param l1 Loop to be compared with l2.
- * \param l2 Loop to be compared with l1.
- * \param level Current non-scalar dimension.
- * \param scaldims Boolean array saying whether a dimension is scalar or not.
- * \param nb_scattdims Size of the scaldims array.
- * \param scalar Current scalar dimension.
- * \return -1 if (l1 < l2), 0 if (l1 == l2) and +1 if (l1 > l2)
- */
-int cloog_loop_constant_cmp(CloogLoop *l1, CloogLoop *l2, int level,
-	int *scaldims, int nb_scattdims, int scalar)
-{
-  CloogBlock *b1, *b2;
-  b1 = l1->block;
-  b2 = l2->block;
-  while (level_is_constant(level, scalar, scaldims, nb_scattdims)) {
-    int cmp = cloog_int_cmp(b1->scaldims[scalar], b2->scaldims[scalar]);
-    if (cmp)
-	return cmp;
-    scalar++;
-  }
-  return 0;
-}
-
-
-/**
- * cloog_loop_scalar_gt function:
- * This function returns 1 if loop 'l1' is greater than loop 'l2' for the
- * scalar dimension vector that begins at dimension 'scalar', 0 otherwise. What
- * we want to know is whether a loop is scheduled before another one or not.
- * This function solves the problem when the considered dimension for scheduling
- * is a scalar dimension. Since there may be a succession of scalar dimensions,
- * this function will reason about the vector of scalar dimension that begins
- * at dimension 'level+scalar' and finish to the first non-scalar dimension.
- * \param l1 Loop to be compared with l2.
- * \param l2 Loop to be compared with l1.
- * \param level Current non-scalar dimension.
- * \param scaldims Boolean array saying whether a dimension is scalar or not.
- * \param nb_scattdims Size of the scaldims array.
- * \param scalar Current scalar dimension.
- * \return 1 if (l1 > l2), 0 otherwise.
- **
- * - September 9th 2005: first version.
- * - October  15nd 2007: now "greater than" instead of "greater or equal".
- */
-int cloog_loop_scalar_gt(l1, l2, level, scaldims, nb_scattdims, scalar)
-CloogLoop * l1, * l2 ;
-int level, * scaldims, nb_scattdims, scalar ;
-{
-  return cloog_loop_constant_cmp(l1, l2, level, scaldims, nb_scattdims, scalar) > 0;
-}
-
-
-/**
- * cloog_loop_scalar_eq function:
- * This function returns 1 if loop 'l1' is equal to loop 'l2' for the scalar
- * dimension vector that begins at dimension 'scalar', 0 otherwise. What we want
- * to know is whether two loops are scheduled for the same time or not.
- * This function solves the problem when the considered dimension for scheduling
- * is a scalar dimension. Since there may be a succession of scalar dimensions,
- * this function will reason about the vector of scalar dimension that begins
- * at dimension 'level+scalar' and finish to the first non-scalar dimension.
- * - l1 and l2 are the loops to compare,
- * - level is the current non-scalar dimension,
- * - scaldims is the boolean array saying whether a dimension is scalar or not,
- * - nb_scattdims is the size of the scaldims array,
- * - scalar is the current scalar dimension.
- **
- * - September 9th 2005 : first version.
- */
-int cloog_loop_scalar_eq(l1, l2, level, scaldims, nb_scattdims, scalar)
-CloogLoop * l1, * l2 ;
-int level, * scaldims, nb_scattdims, scalar ;
-{
-  return cloog_loop_constant_cmp(l1, l2, level, scaldims, nb_scattdims, scalar) == 0;
-}
-
-
-/**
- * cloog_loop_scalar_sort function:
- * This function sorts a linked list of loops (loop) with respect to the
- * scalar dimension vector that begins at dimension 'scalar'. Since there may
- * be a succession of scalar dimensions, this function will reason about the
- * vector of scalar dimension that begins at dimension 'level+scalar' and
- * finish to the first non-scalar dimension.
- * \param loop Loop list to sort.
- * \param level Current non-scalar dimension.
- * \param scaldims Boolean array saying whether a dimension is scalar or not.
- * \param nb_scattdims Size of the scaldims array.
- * \param scalar Current scalar dimension.
- * \return A pointer to the sorted list.
- **
- * - July      2nd 2005: first developments.
- * - September 2nd 2005: first version.
- * - October  15nd 2007: complete rewrite to remove bugs, now a bubble sort.
- */
-CloogLoop * cloog_loop_scalar_sort(loop, level, scaldims, nb_scattdims, scalar)
-CloogLoop * loop ;
-int level, * scaldims, nb_scattdims, scalar ;
-{ int ok ;
-  CloogLoop **current;
-  
-  do {
-    ok = 1;
-    for (current = &loop; (*current)->next; current = &(*current)->next) {
-      CloogLoop *next = (*current)->next;
-      if (cloog_loop_scalar_gt(*current,next,level,scaldims,nb_scattdims,scalar)) {
-        ok = 0;
-	(*current)->next = next->next;
-	next->next = *current;
-	*current = next;
-      }
-    }
-  } while (!ok);
-
-  return loop ;
-}
-
-
-/**
- * cloog_loop_generate_backtrack function:
- * adaptation from LoopGen 0.4 by F. Quillere. This function implements the
- * backtrack of the Quillere et al. algorithm (see the Quillere paper).
- * It eliminates unused iterations of the current level for the new one. See the
- * example called linearity-1-1 example with and without this part for an idea.
- * - October 26th 2001: first version in cloog_loop_generate_general.
- * - July    31th 2002: (debug) no more parasite loops (REALLY hard !). 
- * - October 30th 2005: extraction from cloog_loop_generate_general.
- */
-CloogLoop *cloog_loop_generate_backtrack(CloogLoop *loop,
-	int level, CloogOptions *options)
-{
-  CloogDomain * domain ;
-  CloogLoop * now, * now2, * next, * next2, * end, * temp, * l, * inner,
-            * new_loop ;
-  
-  temp = loop ;
-  loop = NULL ;
-
-  while (temp != NULL)
-  { l = NULL ;
-    inner = temp->inner ;
-      
-    while (inner != NULL)
-    { next = inner->next ;
-      /* This 'if' and its first part is the debug of july 31th 2002. */
-      if (inner->block != NULL) {
-        end = cloog_loop_alloc(temp->state, inner->domain, 0, NULL,
-			       inner->block, NULL, NULL);
-        domain = cloog_domain_copy(temp->domain) ;
-        new_loop = cloog_loop_alloc(temp->state, domain, 0, NULL,
-				    NULL, end, NULL);
-      }
-      else
-      new_loop = cloog_loop_project(inner, level);
-
-      cloog_loop_free_parts(inner,0,0,0,0) ;
-      cloog_loop_add(&l,&now2,new_loop) ;
-      inner = next ;
-    }
-      
-    temp->inner = NULL ;
-      
-    if (l != NULL)
-    { l = cloog_loop_separate(l) ;
-      l = cloog_loop_sort(l, level);
-      while (l != NULL) {
-	l->stride = cloog_stride_copy(l->stride);
-        cloog_loop_add(&loop,&now,l) ;
-        l = l->next ;
-      }
-    }
-    next2 = temp->next ;
-    cloog_loop_free_parts(temp,1,0,0,0) ;
-    temp = next2 ;
-  }
-
-  return loop ;
-}
-
-
-/**
- * Return 1 if we need to continue recursing to the specified level.
- */
-int cloog_loop_more(CloogLoop *loop, int level, int scalar, int nb_scattdims)
-{
-  return level + scalar <= nb_scattdims ||
-	 cloog_domain_dimension(loop->domain) >= level;
-}
-
-/**
- * Return 1 if the domains of all loops in the given linked list
- * have a fixed value at the given level.
- * In principle, there would be no need to check that the fixed value is
- * the same for each of these loops because this function is only
- * called on a component.  However, not all backends perform a proper
- * decomposition into components.
- */
-int cloog_loop_is_constant(CloogLoop *loop, int level)
-{
-    cloog_int_t c1, c2;
-    int r = 1;
-
-    cloog_int_init(c1);
-    cloog_int_init(c2);
-
-    if (!cloog_domain_lazy_isconstant(loop->domain, level - 1, &c1))
-	r = 0;
-
-    for (loop = loop->next; r && loop; loop = loop->next) {
-	if (!cloog_domain_lazy_isconstant(loop->domain, level - 1, &c2))
-	    r = 0;
-	else if (cloog_int_ne(c1, c2))
-	    r = 0;
-    }
-
-    cloog_int_clear(c1);
-    cloog_int_clear(c2);
-
-    return r;
-}
-
-/**
- * Assuming all domains in the given linked list of loop
- * have a fixed values at level, return a single loop with
- * a domain corresponding to this fixed value and with as
- * list of inner loops the concatenation of all inner loops
- * in the original list.
- */
-CloogLoop *cloog_loop_constant(CloogLoop *loop, int level)
-{
-    CloogLoop *res, *inner, *tmp;
-    CloogDomain *domain, *t;
-
-    if (!loop)
-	return loop;
-
-    inner = loop->inner;
-    domain = loop->domain;
-    for (tmp = loop->next; tmp; tmp = tmp->next) {
-	inner = cloog_loop_concat(inner, tmp->inner);
-	domain = cloog_domain_union(domain, tmp->domain);
-    }
-
-    domain = cloog_domain_simple_convex(t = domain);
-    cloog_domain_free(t);
-
-    res = cloog_loop_alloc(loop->state, domain, 0, NULL, NULL, inner, NULL);
-
-    cloog_loop_free_parts(loop, 0, 0, 0, 1);
-
-    return res;
-}
-
-
-/* Unroll the given loop at the given level, provided it is allowed
- * by cloog_domain_can_unroll.
- * If so, we return a list of loops, one for each iteration of the original
- * loop.  Otherwise, we simply return the original loop.
- */
-static CloogLoop *loop_unroll(CloogLoop *loop, int level)
-{
-    int can_unroll;
-    cloog_int_t i;
-    cloog_int_t n;
-    CloogConstraint *lb;
-    CloogLoop *res = NULL;
-    CloogLoop **next_res = &res;
-    CloogDomain *domain;
-    CloogLoop *inner;
-
-    cloog_int_init(n);
-    can_unroll = cloog_domain_can_unroll(loop->domain, level, &n, &lb);
-    if (!can_unroll) {
-	cloog_int_clear(n);
-	return loop;
-    }
-
-    cloog_int_init(i);
-
-    for (cloog_int_set_si(i, 0); cloog_int_lt(i, n); cloog_int_add_ui(i, i, 1)) {
-	domain = cloog_domain_copy(loop->domain);
-	domain = cloog_domain_fixed_offset(domain, level, lb, i);
-	inner = cloog_loop_copy(loop->inner);
-	inner = cloog_loop_restrict_all(inner, domain);
-	if (!inner) {
-	    cloog_domain_free(domain);
-	    continue;
-	}
-	*next_res = cloog_loop_alloc(loop->state, domain, 1, NULL, NULL,
-					inner, NULL);
-	next_res = &(*next_res)->next;
-    }
-
-    cloog_int_clear(i);
-    cloog_int_clear(n);
-    cloog_constraint_release(lb);
-
-    cloog_loop_free(loop);
-
-    return res;
-}
-
-
-/* Unroll all loops in the given list at the given level, provided
- * they can be unrolled.
- */
-CloogLoop *cloog_loop_unroll(CloogLoop *loop, int level)
-{
-    CloogLoop *now, *next;
-    CloogLoop *res = NULL;
-    CloogLoop **next_res = &res;
-
-    for (now = loop; now; now = next) {
-	next = now->next;
-	now->next = NULL;
-
-	*next_res = loop_unroll(now, level);
-
-	while (*next_res)
-	    next_res = &(*next_res)->next;
-    }
-
-    return res;
-}
- 
-CloogLoop *cloog_loop_generate_restricted_or_stop(CloogLoop *loop,
-	CloogDomain *context,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	CloogOptions *options);
-
-CloogLoop *cloog_loop_recurse(CloogLoop *loop,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	int constant, CloogOptions *options);
-
-
-/**
- * Recurse on the inner loops of the given single loop.
- *
- * - loop is the loop for which we have to generate scanning code,
- * - level is the current non-scalar dimension,
- * - scalar is the current scalar dimension,
- * - scaldims is the boolean array saying whether a dimension is scalar or not,
- * - nb_scattdims is the size of the scaldims array,
- * - constant is true if the loop is known to be executed at most once
- * - options are the general code generation options.
- */
-static CloogLoop *loop_recurse(CloogLoop *loop,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	int constant, CloogOptions *options)
-{
-    CloogLoop *inner, *into, *end, *next, *l, *now;
-    CloogDomain *domain;
-
-    if (level && options->strides && !constant)
-      cloog_loop_stride(loop, level);
-
-    if (!constant &&
-	options->first_unroll >= 0 && level + scalar >= options->first_unroll) {
-	loop = cloog_loop_unroll(loop, level);
-	if (loop->next)
-	    return cloog_loop_recurse(loop, level, scalar, scaldims,
-					nb_scattdims, 1, options);
-    }
-
-    if (level && options->otl)
-      cloog_loop_otl(loop, level);
-    inner = loop->inner;
-    domain = cloog_domain_copy(loop->domain);
-    domain = cloog_domain_add_stride_constraint(domain, loop->stride);
-    into = NULL ;
-    while (inner != NULL)
-    { /* 4b. -ced- recurse for each sub-list of non terminal loops. */
-      if (cloog_loop_more(inner, level + 1, scalar, nb_scattdims)) {
-	end = inner;
-        while ((end->next != NULL) &&
-               cloog_loop_more(end->next, level + 1, scalar, nb_scattdims))
-        end = end->next ;
-        
-	next = end->next ;
-        end->next = NULL ;
-
-        l = cloog_loop_generate_restricted_or_stop(inner, domain,
-			level + 1, scalar, scaldims, nb_scattdims, options);
-        
-	if (l != NULL)
-        cloog_loop_add_list(&into,&now,l) ;
-        
-        inner = next ;
-      }
-      else
-      { cloog_loop_add(&into,&now,inner) ;
-        inner = inner->next ;
-      }
-    }
-
-    cloog_domain_free(domain);
-    loop->inner = into;
-    return loop;
-}
-
-
-/**
- * Recurse on the inner loops of each of the loops in the loop list.
- *
- * - loop is the loop list for which we have to generate scanning code,
- * - level is the current non-scalar dimension,
- * - scalar is the current scalar dimension,
- * - scaldims is the boolean array saying whether a dimension is scalar or not,
- * - nb_scattdims is the size of the scaldims array,
- * - constant is true if the loop is known to be executed at most once
- * - options are the general code generation options.
- */
-CloogLoop *cloog_loop_recurse(CloogLoop *loop,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	int constant, CloogOptions *options)
-{
-    CloogLoop *now, *next;
-    CloogLoop *res = NULL;
-    CloogLoop **next_res = &res;
-
-    for (now = loop; now; now = next) {
-	next = now->next;
-	now->next = NULL;
-
-	*next_res = loop_recurse(now, level, scalar, scaldims, nb_scattdims,
-				 constant, options);
-
-	while (*next_res)
-	    next_res = &(*next_res)->next;
-    }
-
-    return res;
-}
-
-/**
- * cloog_loop_generate_general function:
- * Adaptation from LoopGen 0.4 by F. Quillere. This function implements the
- * Quillere algorithm for polyhedron scanning from step 3 to 5.
- * (see the Quillere paper).
- * - loop is the loop for which we have to generate a scanning code,
- * - level is the current non-scalar dimension,
- * - scalar is the current scalar dimension,
- * - scaldims is the boolean array saying whether a dimension is scalar or not,
- * - nb_scattdims is the size of the scaldims array,
- * - options are the general code generation options.
- **
- * - October 26th 2001: first version.
- * - July 3rd->11th 2003: memory leaks hunt and correction.
- * - June      22nd 2005: Adaptation for GMP.
- * - September  2nd 2005: The function have been cutted out in two pieces:
- *                        cloog_loop_generate and this one, in order to handle
- *                        the scalar dimension case more efficiently with
- *                        cloog_loop_generate_scalar.
- * - November  15th 2005: (debug) the result of the cloog_loop_generate call may
- *                        be a list of polyhedra (especially if stop option is
- *                        used): cloog_loop_add_list instead of cloog_loop_add.
- */ 
-CloogLoop *cloog_loop_generate_general(CloogLoop *loop,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	CloogOptions *options)
-{
-  CloogLoop *res, *now, *temp, *l, *new_loop, *next;
-  int separate = 0;
-  int constant = 0;
-
-  /* 3. Separate all projections into disjoint polyhedra. */
-  if (level > 0 && cloog_loop_is_constant(loop, level)) {
-    res = cloog_loop_constant(loop, level);
-    constant = 1;
-  } else if ((options->f > level+scalar) || (options->f < 0))
-    res = cloog_loop_merge(loop, level, options);
-  else {
-    res = cloog_loop_separate(loop);
-    separate = 1;
-  }
-    
-  /* 3b. -correction- sort the loops to determine their textual order. */
-  res = cloog_loop_sort(res, level);
-
-  res = cloog_loop_restrict_inner(res);
-
-  if (separate)
-    res = cloog_loop_specialize(res, level, scalar, scaldims, nb_scattdims);
-  
-  /* 4. Recurse for each loop with the current domain as context. */
-  temp = res ;
-  res = NULL ;
-  if (!level || (level+scalar < options->l) || (options->l < 0))
-    res = cloog_loop_recurse(temp, level, scalar, scaldims, nb_scattdims,
-			     constant, options);
-  else
-  while (temp != NULL)
-  { next = temp->next ;
-    l = cloog_loop_nest(temp->inner, temp->domain, level+1);
-    new_loop = cloog_loop_alloc(temp->state, temp->domain, 0, NULL,
-				NULL, l, NULL);
-    temp->inner = NULL ;
-    temp->next = NULL ;
-    cloog_loop_free_parts(temp,0,0,0,0) ;
-    cloog_loop_add(&res,&now,new_loop) ;
-    temp = next ;
-  }
-
-  if (options->strides)
-    res = cloog_loop_propagate_lower_bound(res, level);
-  
-  /* 5. eliminate unused iterations of the current level for the new one. See
-   *    the example called linearity-1-1 example with and without this part
-   *    for an idea.
-   */
-  if (options->backtrack && level &&
-      ((level+scalar < options->l) || (options->l < 0)) &&
-      ((options->f <= level+scalar) && !(options->f < 0)))
-  res = cloog_loop_generate_backtrack(res, level, options);
-  
-  /* Pray for my new paper to be accepted somewhere since the following stuff
-   * is really amazing :-) !
-   * Far long later: The paper has been accepted to PACT 2004 :-))). But there
-   * are still some bugs and I have no time to fix them. Thus now you have to 
-   * pray for me to get an academic position for that really amazing stuff :-) !
-   * Later again: OK, I get my academic position, but still I have not enough
-   * time to fix and clean this part... Pray again :-) !!!
-   */
-  /* res = cloog_loop_unisolate(res,level) ;*/
-
-  return(res) ;
-}
-
-
-CloogLoop *cloog_loop_generate_restricted(CloogLoop *loop,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	CloogOptions *options);
-
-
-/**
- * cloog_loop_generate_scalar function:
- * This function applies the simplified code generation scheme in the trivial
- * case of scalar dimensions. When dealing with scalar dimensions, there is 
- * no need of costly polyhedral operations for separation or sorting: sorting
- * is a question of comparing scalar vectors and separation amounts to consider
- * only loops with the same scalar vector for the next step of the code
- * generation process. This function achieves the separation/sorting process
- * for the vector of scalar dimension that begins at dimension 'level+scalar'
- * and finish to the first non-scalar dimension.
- * - loop is the loop for which we have to generate a scanning code,
- * - level is the current non-scalar dimension,
- * - scalar is the current scalar dimension,
- * - scaldims is the boolean array saying whether a dimension is scalar or not,
- * - nb_scattdims is the size of the scaldims array,
- * - options are the general code generation options.
- **
- * - September  2nd 2005: First version.
- */ 
-CloogLoop *cloog_loop_generate_scalar(CloogLoop *loop,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	CloogOptions *options)
-{ CloogLoop * res, * now, * temp, * l, * end, * next, * ref ;
-  int scalar_new;
-
-  /* We sort the loop list with respect to the current scalar vector. */
-  res = cloog_loop_scalar_sort(loop,level,scaldims,nb_scattdims,scalar) ;
-
-  scalar_new = scalar + scaldims[level + scalar - 1];
-  
-  temp = res ;
-  res = NULL ;
-  while (temp != NULL)
-  { /* Then we will appy the general code generation process to each sub-list
-     * of loops with the same scalar vector.
-     */
-    end = temp ;
-    ref = temp ;
-    
-    while((end->next != NULL) &&
-	 cloog_loop_more(end->next, level, scalar_new, nb_scattdims) &&
-         cloog_loop_scalar_eq(ref,end->next,level,scaldims,nb_scattdims,scalar))
-    end = end->next ;
-
-    next = end->next ;
-    end->next = NULL ;
-
-    /* For the next dimension, scalar value is updated by adding the scalar
-     * vector size, which is stored at scaldims[level+scalar-1].
-     */
-    if (cloog_loop_more(temp, level, scalar_new, nb_scattdims)) {
-      l = cloog_loop_generate_restricted(temp, level, scalar_new,
-				      scaldims, nb_scattdims, options);
-
-      if (l != NULL)
-	cloog_loop_add_list(&res, &now, l);
-    } else
-      cloog_loop_add(&res, &now, temp);
-      
-    temp = next ;
-  }
-  
-  return res ;
-}
-
-
-/* Compare loop with the next loop based on their constant dimensions.
- * The result is < 0, == 0 or > 0 depending on whether the constant
- * dimensions of loop are lexicographically smaller, equal or greater
- * than those of loop->next.
- * If loop is the last in the list, then it is assumed to be smaller
- * than the "next" one.
- */
-static int cloog_loop_next_scal_cmp(CloogLoop *loop)
-{
-    int i;
-    int nb_scaldims;
-
-    if (!loop->next)
-	return -1;
-
-    nb_scaldims = loop->block->nb_scaldims;
-    if (loop->next->block->nb_scaldims < nb_scaldims)
-	nb_scaldims = loop->next->block->nb_scaldims;
-
-    for (i = 0; i < nb_scaldims; ++i) {
-	int cmp = cloog_int_cmp(loop->block->scaldims[i],
-				loop->next->block->scaldims[i]);
-	if (cmp)
-	    return cmp;
-    }
-    return loop->block->nb_scaldims - loop->next->block->nb_scaldims;
-}
-
-
-/* Check whether the globally constant dimensions of a and b
- * have the same value for all globally constant dimensions
- * that are situated before any (locally) non-constant dimension.
- */
-static int cloog_loop_equal_prefix(CloogLoop *a, CloogLoop *b,
-				    int *scaldims, int nb_scattdims)
-{
-    int i;
-    int cst = 0;
-    int dim = 0;
-
-    for (i = 0; i < nb_scattdims; ++i) {
-	if (!scaldims[i]) {
-	    dim++;
-	    continue;
-	}
-	if (!cloog_int_eq(a->block->scaldims[cst], b->block->scaldims[cst]))
-	    break;
-	cst++;
-    }
-    for (i = i + 1; i < nb_scattdims; ++i) {
-	if (scaldims[i])
-	    continue;
-	if (!cloog_domain_lazy_isconstant(a->domain, dim, NULL))
-	    return 0;
-	/* No need to check that dim is also constant in b and that the
-	 * constant values are equal.  That will happen during the check
-	 * whether the two domains are equal.
-	 */
-	dim++;
-    }
-    return 1;
-}
-
-
-/* Try to block adjacent loops in the loop list "loop".
- * We only attempt blocking if the constant dimensions of the loops
- * in the least are (not necessarily strictly) increasing.
- * Then we look for a sublist such that the first (begin) has constant
- * dimensions strictly larger than the previous loop in the complete
- * list and such that the loop (end) after the last loop in the sublist
- * has constant dimensions strictly larger than the last loop in the sublist.
- * Furthermore, all loops in the sublist should have the same domain
- * (with globally constant dimensions removed) and the difference
- * (if any) in constant dimensions may only occur after all the
- * (locally) constant dimensions.
- * If we find such a sublist, then the blocks of all but the first
- * are merged into the block of the first.
- *
- * Note that this function can only be called before the global
- * blocklist has been created because it may otherwise modify and destroy
- * elements on that list.
- */
-CloogLoop *cloog_loop_block(CloogLoop *loop, int *scaldims, int nb_scattdims)
-{
-    CloogLoop *begin, *end, *l;
-    int begin_after_previous;
-    int end_after_previous;
-
-    if (!loop->next)
-	return loop;
-    for (begin = loop; begin; begin = begin->next) {
-	if (!begin->block || !begin->block->scaldims)
-	    return loop;
-	if (cloog_loop_next_scal_cmp(begin) > 0)
-	    return loop;
-    }
-
-    begin_after_previous = 1;
-    for (begin = loop; begin; begin = begin->next) {
-	if (!begin_after_previous) {
-	    begin_after_previous = cloog_loop_next_scal_cmp(begin) < 0;
-	    continue;
-	}
-
-	end_after_previous = cloog_loop_next_scal_cmp(begin) < 0;
-	for (end = begin->next; end; end = end->next) {
-	    if (!cloog_loop_equal_prefix(begin, end, scaldims, nb_scattdims))
-		break;
-	    if (!cloog_domain_lazy_equal(begin->domain, end->domain))
-		break;
-	    end_after_previous = cloog_loop_next_scal_cmp(end) < 0;
-	}
-	if (end != begin->next && end_after_previous) {
-	    for (l = begin->next; l != end; l = begin->next) {
-		cloog_block_merge(begin->block, l->block);
-		begin->next = l->next;
-		cloog_loop_free_parts(l, 1, 0, 1, 0);
-	    }
-	}
-
-	begin_after_previous = cloog_loop_next_scal_cmp(begin) < 0;
-    }
-
-    return loop;
-}
-
-
-/**
- * Check whether for any fixed iteration of the outer loops,
- * there is an iteration of loop1 that is lexicographically greater
- * than an iteration of loop2.
- * Return 1 if there exists (or may exist) such a pair.
- * Return 0 if all iterations of loop1 are lexicographically smaller
- * than the iterations of loop2.
- * If no iteration is lexicographically greater, but if there are
- * iterations that are equal to iterations of loop2, then return "def".
- * This is useful for ensuring that such statements are not reordered.
- * Some users, including the test_run target in test, expect
- * the statements at a given point to be run in the original order.
- * Passing the value "0" for "def" would allow such statements to be reordered
- * and would allow for the detection of more components.
- */
-int cloog_loop_follows(CloogLoop *loop1, CloogLoop *loop2,
-	int level, int scalar, int *scaldims, int nb_scattdims, int def)
-{
-    int dim1, dim2;
-
-    dim1 = cloog_domain_dimension(loop1->domain);
-    dim2 = cloog_domain_dimension(loop2->domain);
-    while ((level <= dim1 && level <= dim2) ||
-	   level_is_constant(level, scalar, scaldims, nb_scattdims)) {
-	if (level_is_constant(level, scalar, scaldims, nb_scattdims)) {
-	    int cmp = cloog_loop_constant_cmp(loop1, loop2, level, scaldims,
-					    nb_scattdims, scalar);
-	    if (cmp > 0)
-		return 1;
-	    if (cmp < 0)
-		return 0;
-	    scalar += scaldims[level + scalar - 1];
-	} else {
-	    int follows = cloog_domain_follows(loop1->domain, loop2->domain,
-						level);
-	    if (follows > 0)
-		return 1;
-	    if (follows < 0)
-		return 0;
-	    level++;
-	}
-    }
-
-    return def;
-}
-
-
-/* Structure for representing the nodes in the graph being traversed
- * using Tarjan's algorithm.
- * index represents the order in which nodes are visited.
- * min_index is the index of the root of a (sub)component.
- * on_stack indicates whether the node is currently on the stack.
- */
-struct cloog_loop_sort_node {
-    int index;
-    int min_index;
-    int on_stack;
-};
-/* Structure for representing the graph being traversed
- * using Tarjan's algorithm.
- * len is the number of nodes
- * node is an array of nodes
- * stack contains the nodes on the path from the root to the current node
- * sp is the stack pointer
- * index is the index of the last node visited
- * order contains the elements of the components separated by -1
- * op represents the current position in order
- */
-struct cloog_loop_sort {
-    int len;
-    struct cloog_loop_sort_node *node;
-    int *stack;
-    int sp;
-    int index;
-    int *order;
-    int op;
-};
-
-/* Allocate and initialize cloog_loop_sort structure.
- */
-static struct cloog_loop_sort *cloog_loop_sort_alloc(int len)
-{
-    struct cloog_loop_sort *s;
-    int i;
-
-    s = (struct cloog_loop_sort *)malloc(sizeof(struct cloog_loop_sort));
-    assert(s);
-    s->len = len;
-    s->node = (struct cloog_loop_sort_node *)
-			malloc(len * sizeof(struct cloog_loop_sort_node));
-    assert(s->node);
-    for (i = 0; i < len; ++i)
-	s->node[i].index = -1;
-    s->stack = (int *)malloc(len * sizeof(int));
-    assert(s->stack);
-    s->order = (int *)malloc(2 * len * sizeof(int));
-    assert(s->order);
-
-    s->sp = 0;
-    s->index = 0;
-    s->op = 0;
-
-    return s;
-}
-
-/* Free cloog_loop_sort structure.
- */
-static void cloog_loop_sort_free(struct cloog_loop_sort *s)
-{
-    free(s->node);
-    free(s->stack);
-    free(s->order);
-    free(s);
-}
-
-
-/* Check whether for any fixed iteration of the outer loops,
- * there is an iteration of loop1 that is lexicographically greater
- * than an iteration of loop2, where the iteration domains are
- * available in the inner loops of the arguments.
- *
- * By using this functions to detect components, we ensure that
- * two CloogLoops appear in the same component if some iterations of
- * each loop should be executed before some iterations of the other loop.
- * Since we also want two CloogLoops that have exactly the same
- * iteration domain at the current level to be placed in the same component,
- * we first check if these domains are indeed the same.
- */
-static int inner_loop_follows(CloogLoop *loop1, CloogLoop *loop2,
-	int level, int scalar, int *scaldims, int nb_scattdims, int def)
-{
-    int f;
-
-    f = cloog_domain_lazy_equal(loop1->domain, loop2->domain);
-    if (!f)
-	f = cloog_loop_follows(loop1->inner, loop2->inner,
-				level, scalar, scaldims, nb_scattdims, def);
-
-    return f;
-}
-
-
-/* Perform Tarjan's algorithm for computing the strongly connected components
- * in the graph with the individual CloogLoops as vertices.
- * Two CloopLoops appear in the same component if they both (indirectly)
- * "follow" each other, where the following relation is determined
- * by the follows function.
- */
-static void cloog_loop_components_tarjan(struct cloog_loop_sort *s,
-	CloogLoop **loop_array, int i, int level, int scalar, int *scaldims,
-	int nb_scattdims,
-	int (*follows)(CloogLoop *loop1, CloogLoop *loop2,
-	    int level, int scalar, int *scaldims, int nb_scattdims, int def))
-{
-    int j;
-
-    s->node[i].index = s->index;
-    s->node[i].min_index = s->index;
-    s->node[i].on_stack = 1;
-    s->index++;
-    s->stack[s->sp++] = i;
-
-    for (j = s->len - 1; j >= 0; --j) {
-	int f;
-
-	if (j == i)
-	    continue;
-	if (s->node[j].index >= 0 &&
-		(!s->node[j].on_stack ||
-		 s->node[j].index > s->node[i].min_index))
-	    continue;
-
-	f = follows(loop_array[i], loop_array[j],
-				level, scalar, scaldims, nb_scattdims, i > j);
-	if (!f)
-	    continue;
-
-	if (s->node[j].index < 0) {
-	    cloog_loop_components_tarjan(s, loop_array, j, level, scalar,
-					 scaldims, nb_scattdims, follows);
-	    if (s->node[j].min_index < s->node[i].min_index)
-		s->node[i].min_index = s->node[j].min_index;
-	} else if (s->node[j].index < s->node[i].min_index)
-		s->node[i].min_index = s->node[j].index;
-    }
-
-    if (s->node[i].index != s->node[i].min_index)
-	return;
-
-    do {
-	j = s->stack[--s->sp];
-	s->node[j].on_stack = 0;
-	s->order[s->op++] = j;
-    } while (j != i);
-    s->order[s->op++] = -1;
-}
-
-
-static int qsort_index_cmp(const void *p1, const void *p2)
-{
-    return *(int *)p1 - *(int *)p2;
-}
-
-/* Sort the elements of the component starting at list.
- * The list is terminated by a -1.
- */
-static void sort_component(int *list)
-{
-    int len;
-
-    for (len = 0; list[len] != -1; ++len)
-	;
-
-    qsort(list, len, sizeof(int), qsort_index_cmp);
-}
-
-/* Given an array of indices "list" into the "loop_array" array,
- * terminated by -1, construct a linked list of the corresponding
- * entries and put the result in *res.
- * The value returned is the number of CloogLoops in the (linked) list
- */
-static int extract_component(CloogLoop **loop_array, int *list, CloogLoop **res)
-{
-    int i = 0;
-
-    sort_component(list);
-    while (list[i] != -1) {
-	*res = loop_array[list[i]];
-	res = &(*res)->next;
-	++i;
-    }
-    *res = NULL;
-
-    return i;
-}
-
-
-/**
- * Call cloog_loop_generate_scalar or cloog_loop_generate_general
- * on each of the strongly connected components in the list of CloogLoops
- * pointed to by "loop".
- *
- * We use Tarjan's algorithm to find the strongly connected components.
- * Note that this algorithm also topologically sorts the components.
- *
- * The components are treated separately to avoid spurious separations.
- * The concatentation of the results may contain successive loops
- * with the same bounds, so we try to combine such loops.
- */
-CloogLoop *cloog_loop_generate_components(CloogLoop *loop,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	CloogOptions *options)
-{
-    int i, nb_loops;
-    CloogLoop *tmp;
-    CloogLoop *res, **res_next;
-    CloogLoop **loop_array;
-    struct cloog_loop_sort *s;
-
-    if (level == 0 || !loop->next)
-	return cloog_loop_generate_general(loop, level, scalar,
-					     scaldims, nb_scattdims, options);
-
-    nb_loops = cloog_loop_count(loop);
-
-    loop_array = (CloogLoop **)malloc(nb_loops * sizeof(CloogLoop *));
-    assert(loop_array);
-
-    for (i = 0, tmp = loop; i < nb_loops; i++, tmp = tmp->next)
-	loop_array[i] = tmp;
-
-    s = cloog_loop_sort_alloc(nb_loops);
-    for (i = nb_loops - 1; i >= 0; --i) {
-	if (s->node[i].index >= 0)
-	    continue;
-	cloog_loop_components_tarjan(s, loop_array, i, level, scalar, scaldims,
-					nb_scattdims, &inner_loop_follows);
-    }
-
-    i = 0;
-    res = NULL;
-    res_next = &res;
-    while (nb_loops) {
-	int n = extract_component(loop_array, &s->order[i], &tmp);
-	i += n + 1;
-	nb_loops -= n;
-	*res_next = cloog_loop_generate_general(tmp, level, scalar,
-					     scaldims, nb_scattdims, options);
-    	while (*res_next)
-	    res_next = &(*res_next)->next;
-    }
-
-    cloog_loop_sort_free(s);
-
-    free(loop_array);
-
-    res = cloog_loop_combine(res);
-
-    return res;
-}
-
-
-/* For each loop in the list "loop", decompose the list of
- * inner loops into strongly connected components and put
- * the components into separate loops at the top level.
- */
-CloogLoop *cloog_loop_decompose_inner(CloogLoop *loop,
-	int level, int scalar, int *scaldims, int nb_scattdims)
-{
-    CloogLoop *l, *tmp;
-    CloogLoop **loop_array;
-    int i, n_loops, max_loops = 0;
-    struct cloog_loop_sort *s;
-
-    for (l = loop; l; l = l->next) {
-	n_loops = cloog_loop_count(l->inner);
-	if (max_loops < n_loops)
-	    max_loops = n_loops;
-    }
-
-    if (max_loops <= 1)
-	return loop;
-
-    loop_array = (CloogLoop **)malloc(max_loops * sizeof(CloogLoop *));
-    assert(loop_array);
-
-    for (l = loop; l; l = l->next) {
-	int n;
-
-	for (i = 0, tmp = l->inner; tmp; i++, tmp = tmp->next)
-	    loop_array[i] = tmp;
-	n_loops = i;
-	if (n_loops <= 1)
-	    continue;
-
-	s = cloog_loop_sort_alloc(n_loops);
-	for (i = n_loops - 1; i >= 0; --i) {
-	    if (s->node[i].index >= 0)
-		continue;
-	    cloog_loop_components_tarjan(s, loop_array, i, level, scalar,
-				scaldims, nb_scattdims, &cloog_loop_follows);
-	}
-
-	n = extract_component(loop_array, s->order, &l->inner);
-	n_loops -= n;
-	i = n + 1;
-	while (n_loops) {
-	    CloogLoop *inner;
-
-	    n = extract_component(loop_array, &s->order[i], &inner);
-	    n_loops -= n;
-	    i += n + 1;
-	    tmp = cloog_loop_alloc(l->state, cloog_domain_copy(l->domain),
-			l->otl, l->stride, l->block, inner, l->next);
-	    l->next = tmp;
-	    l = tmp;
-	}
-
-	cloog_loop_sort_free(s);
-    }
-
-    free(loop_array);
-
-    return loop;
-}
-
-
-CloogLoop *cloog_loop_generate_restricted(CloogLoop *loop,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	CloogOptions *options)
-{
-  /* To save both time and memory, we switch here depending on whether the
-   * current dimension is scalar (simplified processing) or not (general
-   * processing).
-   */
-  if (level_is_constant(level, scalar, scaldims, nb_scattdims))
-    return cloog_loop_generate_scalar(loop, level, scalar,
-                                   scaldims, nb_scattdims, options);
-  /*
-   * 2. Compute the projection of each polyhedron onto the outermost
-   *    loop variable and the parameters.
-   */
-  loop = cloog_loop_project_all(loop, level);
-
-  return cloog_loop_generate_components(loop, level, scalar, scaldims,
-					nb_scattdims, options);
-}
-
-
-CloogLoop *cloog_loop_generate_restricted_or_stop(CloogLoop *loop,
-	CloogDomain *context,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	CloogOptions *options)
-{
-  /* If the user asked to stop code generation at this level, let's stop. */
-  if ((options->stop >= 0) && (level+scalar >= options->stop+1))
-    return cloog_loop_stop(loop,context) ;
-  
-  return cloog_loop_generate_restricted(loop, level, scalar, scaldims,
-  				nb_scattdims, options);
-}
-
-
-/**
- * cloog_loop_generate function:
- * Adaptation from LoopGen 0.4 by F. Quillere. This function implements the
- * Quillere algorithm for polyhedron scanning from step 1 to 2.
- * (see the Quillere paper).
- * - loop is the loop for which we have to generate a scanning code,
- * - context is the context of the current loop (constraints on parameter and/or
- *   on outer loop counters),
- * - level is the current non-scalar dimension,
- * - scalar is the current scalar dimension,
- * - scaldims is the boolean array saying whether a dimension is scalar or not,
- * - nb_scattdims is the size of the scaldims array,
- * - options are the general code generation options.
- **
- * - October 26th 2001: first version.
- * - July 3rd->11th 2003: memory leaks hunt and correction.
- * - June      15th 2005: a memory leak fixed (loop was not entirely freed when
- *                        the result of cloog_loop_restrict was NULL).
- * - June      22nd 2005: Adaptation for GMP.
- * - September  2nd 2005: The function have been cutted out in two pieces:
- *                        cloog_loop_generate and this one, in order to handle
- *                        the scalar dimension case more efficiently with
- *                        cloog_loop_generate_scalar.
- * - November  15th 2005: (debug) Condition for stop option no more take care of
- *                        further scalar dimensions.
- */ 
-CloogLoop *cloog_loop_generate(CloogLoop *loop, CloogDomain *context,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	CloogOptions *options)
-{
-  /* 1. Replace each polyhedron by its intersection with the context.
-   */
-  loop = cloog_loop_restrict_all(loop, context);
-  if (!loop)
-    return NULL;
-
-  return cloog_loop_generate_restricted_or_stop(loop, context,
-			      level, scalar, scaldims, nb_scattdims, options);
-}
-
-
-/*
- * Internal function for simplifying a single loop in a list of loops.
- * See cloog_loop_simplify.
- */
-static CloogLoop *loop_simplify(CloogLoop *loop, CloogDomain *context,
-	int level, int nb_scattdims, CloogOptions *options)
-{
-  int domain_dim;
-  CloogBlock * new_block ;
-  CloogLoop *simplified, *inner;
-  CloogDomain * domain, * simp, * inter, * extended_context ;
-
-  domain = loop->domain ;
-  
-  domain_dim = cloog_domain_dimension(domain);
-  extended_context = cloog_domain_extend(context, domain_dim);
-  inter = cloog_domain_intersection(domain,extended_context) ;
-  simp = cloog_domain_simplify(domain, extended_context);
-  cloog_domain_free(extended_context) ;
-
-  /* If the constraint system is never true, go to the next one. */
-  if (cloog_domain_never_integral(simp)) {
-    cloog_loop_free(loop->inner);
-    cloog_domain_free(inter);
-    cloog_domain_free(simp);
-    return NULL;
-  }
-
-  inner = cloog_loop_simplify(loop->inner, inter, level+1, nb_scattdims,
-                              options);
-  
-  if ((inner == NULL) && (loop->block == NULL)) {
-    cloog_domain_free(inter);
-    cloog_domain_free(simp);
-    return NULL;
-  }
-
-  new_block = cloog_block_copy(loop->block) ;
-  
-  simplified = cloog_loop_alloc(loop->state, simp, loop->otl, loop->stride,
-				new_block, inner, NULL);
-
-  /* Only save the domains, if it involves only scattering dimensions.  */
-  if (options->save_domains) {
-    if (domain_dim > nb_scattdims) {
-      CloogDomain *t;
-      inter = cloog_domain_project(t = inter, nb_scattdims);
-      cloog_domain_free(t);
-    }
-    inter = cloog_domain_add_stride_constraint(inter, loop->stride);
-    simplified->unsimplified = inter;
-  } else
-    cloog_domain_free(inter);
-
-  return(simplified) ; 
-}
-
-
-/**
- * cloog_loop_simplify function:
- * This function implements the part 6. of the Quillere algorithm, it
- * recursively simplifies each loop in the context of the preceding loop domain.
- * It returns a pointer to the simplified loop list.
- * The cloog_domain_simplify (DomainSimplify) behaviour is really bad with
- * polyhedra union and some really awful sidesteppings were written, I plan
- * to solve that...
- * - October   31th 2001: first version. 
- * - July 3rd->11th 2003: memory leaks hunt and correction.
- * - April     16th 2005: a memory leak fixed (extended_context was not freed).
- * - June      15th 2005: a memory leak fixed (loop was not conveniently freed
- *                        when the constraint system is never true).
- * - October   27th 2005: - this function called before cloog_loop_fast_simplify
- *                          is now the official cloog_loop_simplify function in
- *                          replacement of a slower and more complex one (after 
- *                          deep changes in the pretty printer).
- *                        - we use cloog_loop_disjoint to fix the problem when
- *                          simplifying gives a union of polyhedra (before, it
- *                          was under the responsibility of the pretty printer).
- */ 
-CloogLoop *cloog_loop_simplify(CloogLoop *loop, CloogDomain *context, int level,
-	                       int nb_scattdims, CloogOptions *options)
-{
-  CloogLoop *now;
-  CloogLoop *res = NULL;
-  CloogLoop **next = &res;
-  int need_split = 0;
-
-  for (now = loop; now; now = now->next)
-    if (!cloog_domain_isconvex(now->domain)) {
-      now->domain = cloog_domain_simplify_union(now->domain);
-      if (!cloog_domain_isconvex(now->domain))
-	need_split = 1;
-    }
-  
-  /* If the input of CLooG contains any union domains, then they
-   * may not have been split yet at this point.  Do so now as the
-   * clast construction assumes there are no union domains.
-   */
-  if (need_split)
-    loop = cloog_loop_disjoint(loop);
-
-  for (now = loop; now; now = now->next) {
-    *next = loop_simplify(now, context, level, nb_scattdims, options);
-
-    now->inner = NULL; /* For loop integrity. */
-    cloog_domain_free(now->domain);
-    now->domain = NULL;
-
-    if (*next)
-      next = &(*next)->next;
-  }
-  cloog_loop_free(loop);
-
-  return res;
-}
-
-
-/**
- * cloog_loop_scatter function:
- * This function add the scattering (scheduling) informations in a loop.
- */
-void cloog_loop_scatter(CloogLoop * loop, CloogScattering *scatt)
-{
-  loop->domain = cloog_domain_scatter(loop->domain, scatt);
-}
-
diff --git a/cloog-0.16.3/source/matrix.c b/cloog-0.16.3/source/matrix.c
deleted file mode 100644
index 43c2380..0000000
--- a/cloog-0.16.3/source/matrix.c
+++ /dev/null
@@ -1,213 +0,0 @@
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                           cloogmatrix.c                           **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include "../include/cloog/cloog.h"
-
-/**
- * cloog_matrix_alloc:
- * Allocate a CloogMatrix data structure with NbRows rows and NbColumns columns.
- * All values are initialized to 0.
- * This method returns a pointer to the data structure if successful or a NULL
- * pointer otherwise.
- */
-CloogMatrix *cloog_matrix_alloc(unsigned NbRows, unsigned NbColumns)
-{
-  CloogMatrix *matrix;
-  cloog_int_t **p, *q;
-  int i, j;
-
-  matrix = (CloogMatrix *)malloc(sizeof(CloogMatrix));
-
-  if (!matrix)
-    return NULL;
-
-  matrix->NbRows = NbRows;
-  matrix->NbColumns = NbColumns;
-
-  if (!NbRows || !NbColumns) {
-    matrix->p = NULL;
-    matrix->p_Init = NULL;
-    return matrix;
-  }
-
-  p = (cloog_int_t **)malloc(NbRows * sizeof(cloog_int_t *));
-
-  if (p == NULL) {
-    free (matrix);
-    return NULL;
-  }
-
-  q = (cloog_int_t *)malloc(NbRows * NbColumns * sizeof(cloog_int_t));
-
-  if (q == NULL) {
-    free (matrix);
-    free (p);
-    return NULL;
-  }
-
-  matrix->p = p;
-  matrix->p_Init = q;
-
-  for (i = 0; i < NbRows; i++) {
-    *p++ = q;
-    for (j = 0; j < NbColumns; j++) {
-      cloog_int_init(*(q+j));
-      cloog_int_set_si(*(q+j), 0);
-    }
-    q += NbColumns;
-  }
-
-  return matrix;
-}
-
-/**
- * cloog_matrix_free:
- * Free matrix.
- */
-void cloog_matrix_free(CloogMatrix * matrix)
-{
-  int i;
-  cloog_int_t *p;
-  int size = matrix->NbRows * matrix->NbColumns;
-
-  p = matrix->p_Init;
-
-  for (i = 0; i < size; i++)
-    cloog_int_clear(*p++);
-
-  if (matrix) {
-    free(matrix->p_Init);
-    free(matrix->p);
-    free(matrix);
-  }
-}
-
-
-/**
- * Print the elements of CloogMatrix M to file, with each row prefixed
- * by prefix and suffixed by suffix.
- */
-void cloog_matrix_print_structure(FILE *file, CloogMatrix *M,
-		const char *prefix, const char *suffix)
-{
-    int i, j;
-
-    for (i = 0; i < M->NbRows; ++i) {
-	fprintf(file, "%s", prefix);
-	for (j = 0; j < M->NbColumns; ++j) {
-	    cloog_int_print(file, M->p[i][j]);
-	    fprintf(file, " ");
-	}
-	fprintf(file, "%s\n", suffix);
-    }
-}
-
-/**
- * cloog_matrix_print function:
- * This function prints the content of a CloogMatrix structure (matrix) into a
- * file (foo, possibly stdout).
- */
-void cloog_matrix_print(FILE* foo, CloogMatrix* m)
-{
-  if (!m)
-    fprintf(foo, "(null)\n");
-
-  fprintf(foo, "%d %d\n", m->NbRows, m->NbColumns);
-  cloog_matrix_print_structure(foo, m, "", "");
-  fflush(foo);
-}
-
-
-static char *next_line(FILE *input, char *line, unsigned len)
-{
-	char *p;
-
-	do {
-		if (!(p = fgets(line, len, input)))
-			return NULL;
-		while (isspace(*p) && *p != '\n')
-			++p;
-	} while (*p == '#' || *p == '\n');
-
-	return p;
-}
-
-CloogMatrix *cloog_matrix_read(FILE *input)
-{
-	unsigned n_row, n_col;
-	char line[1024];
-
-	if (!next_line(input, line, sizeof(line)))
-		cloog_die("Input error.\n");
-	if (sscanf(line, "%u %u", &n_row, &n_col) != 2)
-		cloog_die("Input error.\n");
-	
-	return cloog_matrix_read_of_size(input, n_row, n_col);
-}
-
-/**
- * Read a matrix in PolyLib format from input.
- */
-CloogMatrix *cloog_matrix_read_of_size(FILE *input,
-	unsigned n_row, unsigned n_col)
-{
-	CloogMatrix *M;
-	int i, j;
-	char line[1024];
-	char val[1024];
-	char *p;
-
-	M = cloog_matrix_alloc(n_row, n_col);
-	if (!M)
-		cloog_die("memory overflow.\n");
-	for (i = 0; i < n_row; ++i) {
-		int offset;
-		int n;
-
-		p = next_line(input, line, sizeof(line));
-		if (!p)
-			cloog_die("Input error.\n");
-		for (j = 0; j < n_col; ++j) {
-			n = sscanf(p, "%s%n", val, &offset);
-			if (!n)
-				cloog_die("Input error.\n");
-			cloog_int_read(M->p[i][j], val);
-			p += offset;
-		}
-	}
-
-	return M;
-}
diff --git a/cloog-0.16.3/source/matrix/constraintset.c b/cloog-0.16.3/source/matrix/constraintset.c
deleted file mode 100644
index 78025f8..0000000
--- a/cloog-0.16.3/source/matrix/constraintset.c
+++ /dev/null
@@ -1,1056 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                               CLooG                               **
-    **-------------------------------------------------------------------**
-    **                          constraintset.c                          **
-    **-------------------------------------------------------------------**
-    **                    First version: april 17th 2005                 **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2005 Cedric Bastoul                                          *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-/* CAUTION: the english used for comments is probably the worst you ever read,
- *          please feel free to correct and improve it !
- */
-
-
-# include <stdlib.h>
-# include <stdio.h>
-# include <ctype.h>
-#include <cloog/cloog.h>
-#include <cloog/matrix/constraintset.h>
-
-
-#define ALLOC(type) (type*)malloc(sizeof(type))
-#define ALLOCN(type,n) (type*)malloc((n)*sizeof(type))
-
-
-CloogConstraint *cloog_constraint_first(CloogConstraintSet *constraints);
-CloogConstraint *cloog_constraint_next(CloogConstraint *constraint);
-
-
-CloogConstraintSet *cloog_constraint_set_from_cloog_matrix(CloogMatrix *M)
-{
-	return (CloogConstraintSet *)M;
-}
-
-
-void cloog_constraint_set_free(CloogConstraintSet *constraints)
-{
-	cloog_matrix_free(&constraints->M);
-}
-
-int cloog_constraint_set_contains_level(CloogConstraintSet *constraints,
-			int level, int nb_parameters)
-{
-	return constraints->M.NbColumns - 2 - nb_parameters >= level;
-}
-
-/* Check if the variable at position level is defined by an
- * equality.  If so, return the row number.  Otherwise, return -1.
- *
- * If there is an equality, we can print it directly -no ambiguity-.
- * PolyLib can give more than one equality, we use just the first one
- * (this is a PolyLib problem, but all equalities are equivalent).
- */
-CloogConstraint *cloog_constraint_set_defining_equality(CloogConstraintSet *constraints, int level)
-{
-	CloogConstraint *constraint = ALLOC(CloogConstraint);
-	int i;
-
-	constraint->set = constraints;
-	for (i = 0; i < constraints->M.NbRows; i++)
-		if (cloog_int_is_zero(constraints->M.p[i][0]) &&
-		    !cloog_int_is_zero(constraints->M.p[i][level])) {
-			constraint->line = &constraints->M.p[i];
-			return constraint;
-		    }
-	free(constraint);
-	return cloog_constraint_invalid();
-}
-
-/* Check if the variable (e) at position level is defined by a
- * pair of inequalities
- *		 <a, i> + -m e +  <b, p> + k1 >= 0
- *		<-a, i> +  m e + <-b, p> + k2 >= 0
- * with 0 <= k1 + k2 < m
- * If so return the row number of the upper bound and set *lower
- * to the row number of the lower bound.  If not, return -1.
- *
- * If the variable at position level occurs in any other constraint,
- * then we currently return -1.  The modulo guard that we would generate
- * would still be correct, but we would also need to generate
- * guards corresponding to the other constraints, and this has not
- * been implemented yet.
- */
-CloogConstraint *cloog_constraint_set_defining_inequalities(CloogConstraintSet *constraints,
-	int level, CloogConstraint **lower, int nb_par)
-{
-	int i, j, k;
-	cloog_int_t m;
-	CloogMatrix *matrix = &constraints->M;
-	unsigned len = matrix->NbColumns - 2;
-	unsigned nb_iter = len - nb_par;
-	CloogConstraint *constraint;
-
-	for (i = 0; i < matrix->NbRows; i++) {
-		if (cloog_int_is_zero(matrix->p[i][level]))
-			continue;
-		if (cloog_int_is_zero(matrix->p[i][0]))
-			return cloog_constraint_invalid();
-		if (cloog_int_is_one(matrix->p[i][level]))
-			return cloog_constraint_invalid();
-		if (cloog_int_is_neg_one(matrix->p[i][level]))
-			return cloog_constraint_invalid();
-		if (cloog_seq_first_non_zero(matrix->p[i]+level+1,
-				    (1+nb_iter)-(level+1)) != -1)
-			return cloog_constraint_invalid();
-		for (j = i+1; j < matrix->NbRows; ++j) {
-			if (cloog_int_is_zero(matrix->p[j][level]))
-				continue;
-			if (cloog_int_is_zero(matrix->p[j][0]))
-				return cloog_constraint_invalid();
-			if (cloog_int_is_one(matrix->p[j][level]))
-				return cloog_constraint_invalid();
-			if (cloog_int_is_neg_one(matrix->p[j][level]))
-				return cloog_constraint_invalid();
-			if (cloog_seq_first_non_zero(matrix->p[j]+level+1,
-					    (1+nb_iter)-(level+1)) != -1)
-				return cloog_constraint_invalid();
-
-			cloog_int_init(m);
-			cloog_int_add(m, matrix->p[i][1+len], matrix->p[j][1+len]);
-			if (cloog_int_is_neg(m) ||
-			    cloog_int_abs_ge(m, matrix->p[i][level])) {
-				cloog_int_clear(m);
-				return cloog_constraint_invalid();
-			}
-			cloog_int_clear(m);
-
-			if (!cloog_seq_is_neg(matrix->p[i]+1, matrix->p[j]+1,
-						len))
-				return cloog_constraint_invalid();
-			for (k = j+1; k < matrix->NbRows; ++k)
-				if (!cloog_int_is_zero(matrix->p[k][level]))
-					return cloog_constraint_invalid();
-			*lower = ALLOC(CloogConstraint);
-			constraint = ALLOC(CloogConstraint);
-			(*lower)->set = constraints;
-			constraint->set = constraints;
-			if (cloog_int_is_pos(matrix->p[i][level])) {
-				(*lower)->line = &matrix->p[i];
-				constraint->line = &matrix->p[j];
-			} else {
-				(*lower)->line = &matrix->p[j];
-				constraint->line = &matrix->p[i];
-			}
-			return constraint;
-		}
-	}
-	return cloog_constraint_invalid();
-}
-
-int cloog_constraint_set_total_dimension(CloogConstraintSet *constraints)
-{
-	return constraints->M.NbColumns - 2;
-}
-
-int cloog_constraint_set_n_iterators(CloogConstraintSet *constraint, int nb_par)
-{
-	return cloog_constraint_set_total_dimension(constraint) - nb_par;
-}
-
-int cloog_equal_total_dimension(CloogEqualities *equal)
-{
-	return cloog_constraint_set_total_dimension(equal->constraints);
-}
-
-int cloog_constraint_total_dimension(CloogConstraint *constraint)
-{
-	return cloog_constraint_set_total_dimension(constraint->set);
-}
-
-
-
-/******************************************************************************
- *                        Equalities spreading functions                      *
- ******************************************************************************/
-
-
-/* Equalities are stored inside a CloogMatrix data structure called "equal".
- * This matrix has (nb_scattering + nb_iterators + 1) rows (i.e. total
- * dimensions + 1, the "+ 1" is because a statement can be included inside an
- * external loop without iteration domain), and (nb_scattering + nb_iterators +
- * nb_parameters + 2) columns (all unknowns plus the scalar plus the equality
- * type). The ith row corresponds to the equality "= 0" for the ith dimension
- * iterator. The first column gives the equality type (0: no equality, then
- * EQTYPE_* -see pprint.h-). At each recursion of pprint, if an equality for
- * the current level is found, the corresponding row is updated. Then the
- * equality if it exists is used to simplify expressions (e.g. if we have 
- * "i+1" while we know that "i=2", we simplify it in "3"). At the end of
- * the pprint call, the corresponding row is reset to zero.
- */
-
-CloogEqualities *cloog_equal_alloc(int n, int nb_levels,
-			int nb_parameters)
-{
-    int i;
-    CloogEqualities *equal = ALLOC(CloogEqualities);
-
-    equal->constraints = cloog_constraint_set_from_cloog_matrix(
-		cloog_matrix_alloc(n, nb_levels + nb_parameters + 1));
-    equal->types = ALLOCN(int, n);
-    for (i = 0; i < n; ++i)
-	equal->types[i] = EQTYPE_NONE;
-    return equal;
-}
-
-void cloog_equal_free(CloogEqualities *equal)
-{
-    cloog_matrix_free(&equal->constraints->M);
-    free(equal->types);
-    free(equal);
-}
-
-int cloog_equal_count(CloogEqualities *equal)
-{
-    return equal->constraints->M.NbRows;
-}
-
-CloogConstraintSet *cloog_equal_constraints(CloogEqualities *equal)
-{
-    return equal->constraints;
-}
-
-
-/**
- * cloog_constraint_equal_type function :
- * This function returns the type of the equality in the constraint (line) of
- * (constraints) for the element (level). An equality is 'constant' iff all
- * other factors are null except the constant one. It is a 'pure item' iff
- * it is equal or opposite to a single variable or parameter.
- * Otherwise it is an 'affine expression'.
- * For instance:
- *   i = -13 is constant, i = j, j = -M are pure items,
- *   j = 2*M, i = j+1, 2*j = M are affine expressions.
- *
- * - constraints is the matrix of constraints,
- * - level is the column number in equal of the element which is 'equal to',
- **
- * - July     3rd 2002: first version, called pprint_equal_isconstant. 
- * - July     6th 2002: adaptation for the 3 types. 
- * - June    15th 2005: (debug) expr = domain->Constraint[line] was evaluated
- *                      before checking if line != ONE_TIME_LOOP. Since
- *                      ONE_TIME_LOOP is -1, an invalid read was possible.
- * - October 19th 2005: Removal of the once-time-loop specific processing.
- */
-static int cloog_constraint_equal_type(CloogConstraint *constraint, int level)
-{ 
-  int i, one=0 ;
-  cloog_int_t *expr;
-    
-  expr = *constraint->line;
-  
-  if (!cloog_int_is_one(expr[level]) && !cloog_int_is_neg_one(expr[level]))
-    return EQTYPE_EXAFFINE;
-
-  /* There is only one non null factor, and it must be +1 or -1 for
-   * iterators or parameters.
-   */ 
-  for (i = 1;i <= constraint->set->M.NbColumns-2; i++)
-  if (!cloog_int_is_zero(expr[i]) && (i != level)) {
-    if ((!cloog_int_is_one(expr[i]) && !cloog_int_is_neg_one(expr[i])) || (one != 0))
-    return EQTYPE_EXAFFINE ;
-    else
-    one = 1 ;
-  }
-  /* if the constant factor is non null, it must be alone. */
-  if (one != 0) {
-    if (!cloog_int_is_zero(expr[constraint->set->M.NbColumns-1]))
-    return EQTYPE_EXAFFINE ;
-  }
-  else
-  return EQTYPE_CONSTANT ;
-  
-  return EQTYPE_PUREITEM ;
-}
-
-
-int cloog_equal_type(CloogEqualities *equal, int level)
-{
-	return equal->types[level-1];
-}
-
-
-/**
- * cloog_equal_update function:
- * this function updates a matrix of equalities where each row corresponds to
- * the equality "=0" of an affine expression such that the entry at column
- * "row" (="level") is not zero. This matrix is upper-triangular, except the
- * row number "level-1" which has to be updated for the matrix to be triangular.
- * This function achieves the processing.
- * - equal is the matrix to be updated,
- * - level gives the row that has to be updated (it is actually row "level-1"),
- * - nb_par is the number of parameters of the program.
- **
- * - September 20th 2005: first version.
- */
-static void cloog_equal_update(CloogEqualities *equal, int level, int nb_par)
-{ int i, j ;
-  cloog_int_t gcd, factor_level, factor_outer, temp_level, temp_outer;
-  
-  cloog_int_init(gcd);
-  cloog_int_init(temp_level);
-  cloog_int_init(temp_outer);
-  cloog_int_init(factor_level);
-  cloog_int_init(factor_outer);
-  
-  /* For each previous level, */
-  for (i=level-2;i>=0;i--)
-  { /* if the corresponding iterator is inside the current equality and is equal
-     * to something,
-     */
-    if (!cloog_int_is_zero(equal->constraints->M.p[level-1][i+1]) && equal->types[i])
-    { /* Compute the Greatest Common Divisor. */ 
-      cloog_int_gcd(gcd, equal->constraints->M.p[level-1][i+1],
-			 equal->constraints->M.p[i][i+1]);
-      
-      /* Compute the factors to apply to each row vector element. */
-      cloog_int_divexact(factor_level, equal->constraints->M.p[i][i+1], gcd);
-      cloog_int_divexact(factor_outer, equal->constraints->M.p[level-1][i+1], gcd);
-            
-      /* Now update the row 'level'. */
-      /* - the iterators, up to level, */
-      for (j = 1; j <= level; j++) {
-        cloog_int_mul(temp_level, factor_level,
-			equal->constraints->M.p[level-1][j]);
-        cloog_int_mul(temp_outer, factor_outer, equal->constraints->M.p[i][j]);
-        cloog_int_sub(equal->constraints->M.p[level-1][j], temp_level, temp_outer);
-      }
-      /* - between last useful iterator (level) and the first parameter, the
-       *   matrix is sparse (full of zeroes), we just do nothing there. 
-       * - the parameters and the scalar.
-       */
-      for (j = 0; j < nb_par + 1; j++) {
-        cloog_int_mul(temp_level,factor_level,
-                       equal->constraints->M.p[level-1]
-					[equal->constraints->M.NbColumns-j-1]);
-        cloog_int_mul(temp_outer,factor_outer,
-                       equal->constraints->M.p[i][equal->constraints->M.NbColumns-j-1]);
-        cloog_int_sub(equal->constraints->M.p[level-1]
-					 [equal->constraints->M.NbColumns-j-1],
-	               temp_level,temp_outer) ;
-      }
-    }
-  }
-  
-  /* Normalize (divide by GCD of all elements) the updated equality. */
-  cloog_seq_normalize(&(equal->constraints->M.p[level-1][1]),
-			equal->constraints->M.NbColumns-1);
-
-  cloog_int_clear(gcd);
-  cloog_int_clear(temp_level);
-  cloog_int_clear(temp_outer);
-  cloog_int_clear(factor_level);
-  cloog_int_clear(factor_outer);
-}
-
-
-/**
- * cloog_equal_add function:
- * This function updates the row (level-1) of the equality matrix (equal) with
- * the row that corresponds to the row (line) of the matrix (matrix).
- * - equal is the matrix of equalities,
- * - matrix is the matrix of constraints,
- * - level is the column number in matrix of the element which is 'equal to',
- * - line is the line number in matrix of the constraint we want to study,
- * - the infos structure gives the user all options on code printing and more.
- **
- * - July     2nd 2002: first version. 
- * - October 19th 2005: Addition of the once-time-loop specific processing.
- */
-void cloog_equal_add(CloogEqualities *equal, CloogConstraintSet *constraints,
-			int level, CloogConstraint *line, int nb_par)
-{ 
-  int j;
-  CloogConstraint *i = cloog_constraint_invalid();
-  CloogMatrix *matrix = &constraints->M;
-
-  /* If we are in the case of a loop running once, this means that the equality
-   * comes from an inequality. Here we find this inequality.
-   */
-  if (!cloog_constraint_is_valid(line))
-  { for (i = cloog_constraint_first(constraints);
-	 cloog_constraint_is_valid(i); i = cloog_constraint_next(i))
-    if ((!cloog_int_is_zero(i->line[0][0]))&& (!cloog_int_is_zero(i->line[0][level])))
-    { line = i ;
-      
-      /* Since in once-time-loops, equalities derive from inequalities, we
-       * may have to offset the values. For instance if we have 2i>=3, the
-       * equality is in fact i=2. This may happen when the level coefficient is
-       * not 1 or -1 and the scalar value is not zero. In any other case (e.g.,
-       * if the inequality is an expression including outer loop counters or
-       * parameters) the once time loop would not have been detected
-       * because of floord and ceild functions.
-       */
-      if (cloog_int_ne_si(i->line[0][level],1) &&
-          cloog_int_ne_si(i->line[0][level],-1) &&
-	  !cloog_int_is_zero(i->line[0][matrix->NbColumns-1])) {
-	cloog_int_t denominator;
-        
-	cloog_int_init(denominator);
-	cloog_int_abs(denominator, i->line[0][level]);
-	cloog_int_fdiv_q(i->line[0][matrix->NbColumns-1],
-			 i->line[0][matrix->NbColumns-1], denominator);
-	cloog_int_set_si(i->line[0][level], cloog_int_sgn(i->line[0][level]));
-	cloog_int_clear(denominator);
-      }
-            
-      break ;
-    }
-  }
-  assert(cloog_constraint_is_valid(line));
-  
-  /* We update the line of equal corresponding to level:
-   * - the first element gives the equality type,
-   */
-  equal->types[level-1] = cloog_constraint_equal_type(line, level);
-  /* - the other elements corresponding to the equality itself
-   *   (the iterators up to level, then the parameters and the scalar).
-   */
-  for (j=1;j<=level;j++)
-      cloog_int_set(equal->constraints->M.p[level-1][j], line->line[0][j]);
-  for (j = 0; j < nb_par + 1; j++)
-      cloog_int_set(equal->constraints->M.p[level-1][equal->constraints->M.NbColumns-j-1],
-		   line->line[0][line->set->M.NbColumns-j-1]);
-  
-  if (cloog_constraint_is_valid(i))
-    cloog_constraint_release(line);
-  cloog_equal_update(equal, level, nb_par);
-}
-
-
-/**
- * cloog_equal_del function :
- * This function reset the equality corresponding to the iterator (level)
- * in the equality matrix (equal).
- * - July 2nd 2002: first version. 
- */
-void cloog_equal_del(CloogEqualities *equal, int level)
-{ 
-    equal->types[level-1] = EQTYPE_NONE;
-}
-
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-
-/**
- * Function cloog_constraint_set_normalize:
- * This function will modify the constraint system in such a way that when
- * there is an equality depending on the element at level 'level', there are
- * no more (in)equalities depending on this element. For instance, try
- * test/valilache.cloog with options -f 8 -l 9, with and without the call
- * to this function. At a given moment, for the level L we will have
- * 32*P=L && L>=1 (P is a lower level), this constraint system cannot be
- * translated directly into a source code. Thus, we normalize the domain to
- * remove L from the inequalities. In our example, this leads to
- * 32*P=L && 32*P>=1, that can be transated to the code
- * if (P>=1) { L=32*P ; ... }. This function solves the DaeGon Kim bug.
- * WARNING: Remember that if there is another call to Polylib after a call to
- * this function, we have to recall this function.
- *  -June    16th 2005: first version (adaptation from URGent June-7th-2005 by
- *                      N. Vasilache).
- * - June    21rd 2005: Adaptation for GMP.
- * - November 4th 2005: Complete rewriting, simpler and faster. It is no more an
- *                      adaptation from URGent. 
- */
-void cloog_constraint_set_normalize(CloogConstraintSet *constraints, int level)
-{ int ref, i, j ;
-  cloog_int_t factor_i, factor_ref, temp_i, temp_ref, gcd;
-  CloogMatrix *matrix = &constraints->M;
-    
-  if (matrix == NULL)
-  return ;
-
-  /* Don't "normalize" the constant term. */
-  if (level == matrix->NbColumns-1)
-    return;
-
-  /* Let us find an equality for the current level that can be propagated. */
-  for (ref=0;ref<matrix->NbRows;ref++)
-  if (cloog_int_is_zero(matrix->p[ref][0]) && !cloog_int_is_zero(matrix->p[ref][level])) {
-    cloog_int_init(gcd);
-    cloog_int_init(temp_i);
-    cloog_int_init(temp_ref);
-    cloog_int_init(factor_i);
-    cloog_int_init(factor_ref);
-  
-    /* Row "ref" is the reference equality, now let us find a row to simplify.*/
-    for (i=ref+1;i<matrix->NbRows;i++)
-    if (!cloog_int_is_zero(matrix->p[i][level])) {
-      /* Now let us set to 0 the "level" coefficient of row "j" using "ref".
-       * First we compute the factors to apply to each row vector element.
-       */
-      cloog_int_gcd(gcd, matrix->p[ref][level], matrix->p[i][level]);
-      cloog_int_divexact(factor_i, matrix->p[ref][level], gcd);
-      cloog_int_divexact(factor_ref, matrix->p[i][level], gcd);
-      
-      /* Maybe we are simplifying an inequality: factor_i must not be <0. */
-      if (cloog_int_is_neg(factor_i)) {
-        cloog_int_abs(factor_i, factor_i);
-        cloog_int_neg(factor_ref, factor_ref);
-      }
-      
-      /* Now update the vector. */
-      for (j=1;j<matrix->NbColumns;j++) {
-        cloog_int_mul(temp_i, factor_i, matrix->p[i][j]);
-        cloog_int_mul(temp_ref, factor_ref, matrix->p[ref][j]);
-        cloog_int_sub(matrix->p[i][j], temp_i, temp_ref);
-      }
-    
-      /* Normalize (divide by GCD of all elements) the updated vector. */
-      cloog_seq_normalize(&(matrix->p[i][1]), matrix->NbColumns-1);
-    }
-    
-    cloog_int_clear(gcd);
-    cloog_int_clear(temp_i);
-    cloog_int_clear(temp_ref);
-    cloog_int_clear(factor_i);
-    cloog_int_clear(factor_ref);
-    break ;
-  }
-}
-
-
-
-/**
- * cloog_constraint_set_copy function:
- * this functions builds and returns a "hard copy" (not a pointer copy) of a
- * CloogMatrix data structure.
- * - October 26th 2005: first version.
- */
-CloogConstraintSet *cloog_constraint_set_copy(CloogConstraintSet *constraints)
-{ int i, j ;
-  CloogMatrix *copy;
-  CloogMatrix *matrix = &constraints->M;
-
-  copy = cloog_matrix_alloc(matrix->NbRows, matrix->NbColumns);
-  
-  for (i=0;i<matrix->NbRows;i++)
-  for (j=0;j<matrix->NbColumns;j++)
-      cloog_int_set(copy->p[i][j], matrix->p[i][j]);
-  
-  return cloog_constraint_set_from_cloog_matrix(copy);
-}
-
-
-/**
- * cloog_equal_vector_simplify function:
- * this function simplify an affine expression with its coefficients in
- * "vector" of length "length" thanks to an equality matrix "equal" that gives
- * for some elements of the affine expression an equality with other elements,
- * preferably constants. For instance, if the vector contains i+j+3 and the
- * equality matrix gives i=n and j=2, the vector is simplified to n+3 and is
- * returned in a new vector.
- * - vector is the array of affine expression coefficients
- * - equal is the matrix of equalities,
- * - length is the vector length,
- * - level is a level we don't want to simplify (-1 if none),
- * - nb_par is the number of parameters of the program.
- **
- * - September 20th 2005: first version.
- * - November   2nd 2005: (debug) we are simplifying inequalities, thus we are
- *                        not allowed to multiply the vector by a negative
- *                        constant.Problem found after a report of Michael
- *                        Classen.
- */
-struct cloog_vec *cloog_equal_vector_simplify(CloogEqualities *equal, cloog_int_t *vector,
-				    int length, int level, int nb_par)
-{ int i, j ;
-  cloog_int_t gcd, factor_vector, factor_equal, temp_vector, temp_equal;
-	struct cloog_vec *simplified;
-  
-	simplified = cloog_vec_alloc(length);
-	cloog_seq_cpy(simplified->p, vector, length);
-  
-  cloog_int_init(gcd);
-  cloog_int_init(temp_vector);
-  cloog_int_init(temp_equal);
-  cloog_int_init(factor_vector);
-  cloog_int_init(factor_equal);
-    
-  /* For each non-null coefficient in the vector, */
-  for (i=length-nb_par-2;i>0;i--)
-  if (i != level)
-  { /* if the coefficient in not null, and there exists a useful equality */
-    if ((!cloog_int_is_zero(simplified->p[i])) && equal->types[i-1])
-    { /* Compute the Greatest Common Divisor. */ 
-      cloog_int_gcd(gcd, simplified->p[i], equal->constraints->M.p[i-1][i]);
-      
-      /* Compute the factors to apply to each row vector element. */
-      cloog_int_divexact(factor_vector, equal->constraints->M.p[i-1][i], gcd);
-      cloog_int_divexact(factor_equal, simplified->p[i], gcd);
-      
-      /* We are simplifying an inequality: factor_vector must not be <0. */
-      if (cloog_int_is_neg(factor_vector)) {
-        cloog_int_abs(factor_vector, factor_vector);
-        cloog_int_neg(factor_equal, factor_equal);
-      }
-      
-      /* Now update the vector. */
-      /* - the iterators, up to the current level, */
-      for (j=1;j<=length-nb_par-2;j++) {
-        cloog_int_mul(temp_vector, factor_vector, simplified->p[j]);
-        cloog_int_mul(temp_equal, factor_equal, equal->constraints->M.p[i-1][j]);
-        cloog_int_sub(simplified->p[j], temp_vector, temp_equal);
-      }
-      /* - between last useful iterator (i) and the first parameter, the equal
-       *   matrix is sparse (full of zeroes), we just do nothing there. 
-       * - the parameters and the scalar.
-       */
-      for (j = 0; j < nb_par + 1; j++) {
-        cloog_int_mul(temp_vector, factor_vector, simplified->p[length-1-j]);
-        cloog_int_mul(temp_equal,factor_equal,
-	     equal->constraints->M.p[i-1][equal->constraints->M.NbColumns-j-1]);
-        cloog_int_sub(simplified->p[length-1-j],temp_vector,temp_equal) ;
-      }
-    }
-  }
-  
-  /* Normalize (divide by GCD of all elements) the updated vector. */
-  cloog_seq_normalize(&simplified->p[1], length - 1);
-
-  cloog_int_clear(gcd);
-  cloog_int_clear(temp_vector);
-  cloog_int_clear(temp_equal);
-  cloog_int_clear(factor_vector);
-  cloog_int_clear(factor_equal);
-  
-  return simplified ;
-}
-
-
-/**
- * cloog_constraint_set_simplify function:
- * this function simplify all constraints inside the matrix "matrix" thanks to
- * an equality matrix "equal" that gives for some elements of the affine
- * constraint an equality with other elements, preferably constants.
- * For instance, if a row of the matrix contains i+j+3>=0 and the equality
- * matrix gives i=n and j=2, the constraint is simplified to n+3>=0. The
- * simplified constraints are returned back inside a new simplified matrix.
- * - matrix is the set of constraints to simplify,
- * - equal is the matrix of equalities,
- * - level is a level we don't want to simplify (-1 if none),
- * - nb_par is the number of parameters of the program.
- **
- * - November 4th 2005: first version.
- */
-CloogConstraintSet *cloog_constraint_set_simplify(CloogConstraintSet *constraints,
-	CloogEqualities *equal, int level, int nb_par)
-{ int i, j, k ;
-	struct cloog_vec *vector;
-  CloogMatrix *simplified;
-  CloogMatrix *matrix = &constraints->M;
-  
-  if (matrix == NULL)
-  return NULL ;
-  
-  /* The simplified matrix is such that each row has been simplified thanks
-   * tho the "equal" matrix. We allocate the memory for the simplified matrix,
-   * then for each row of the original matrix, we compute the simplified
-   * vector and we copy its content into the according simplified row.
-   */
-  simplified = cloog_matrix_alloc(matrix->NbRows, matrix->NbColumns);
-  for (i=0;i<matrix->NbRows;i++)
-  { vector = cloog_equal_vector_simplify(equal, matrix->p[i],
-					  matrix->NbColumns, level, nb_par);
-    for (j=0;j<matrix->NbColumns;j++)
-    cloog_int_set(simplified->p[i][j], vector->p[j]);
-    
-    cloog_vec_free(vector);
-  }
-  
-  /* After simplification, it may happen that few constraints are the same,
-   * we remove them here by replacing them with 0=0 constraints.
-   */
-  for (i=0;i<simplified->NbRows;i++)
-  for (j=i+1;j<simplified->NbRows;j++)
-  { for (k=0;k<simplified->NbColumns;k++)
-    if (cloog_int_ne(simplified->p[i][k],simplified->p[j][k]))
-    break ;
-    
-    if (k == matrix->NbColumns)
-    { for (k=0;k<matrix->NbColumns;k++)
-        cloog_int_set_si(simplified->p[j][k],0);
-    }
-  }
-  
-  return cloog_constraint_set_from_cloog_matrix(simplified);
-}
-
-
-/**
- * Return clast_expr corresponding to the variable "level" (1 based) in
- * the given constraint.
- */
-struct clast_expr *cloog_constraint_variable_expr(CloogConstraint *constraint,
-	int level, CloogNames *names)
-{
-	int total_dim, nb_iter;
-	const char *name;
-
-	total_dim = cloog_constraint_total_dimension(constraint);
-	nb_iter = total_dim - names->nb_parameters;
-
-	if (level <= nb_iter)
-		name = cloog_names_name_at_level(names, level);
-	else
-		name = names->parameters[level - (nb_iter+1)] ;
-
-	return &new_clast_name(name)->expr;
-}
-
-
-/**
- * Return true if constraint c involves variable v (zero-based).
- */
-int cloog_constraint_involves(CloogConstraint *constraint, int v)
-{
-	return !cloog_int_is_zero(constraint->line[0][1+v]);
-}
-
-int cloog_constraint_is_lower_bound(CloogConstraint *constraint, int v)
-{
-	return cloog_int_is_pos(constraint->line[0][1+v]);
-}
-
-int cloog_constraint_is_upper_bound(CloogConstraint *constraint, int v)
-{
-	return cloog_int_is_neg(constraint->line[0][1+v]);
-}
-
-int cloog_constraint_is_equality(CloogConstraint *constraint)
-{
-	return cloog_int_is_zero(constraint->line[0][0]);
-}
-
-void cloog_constraint_clear(CloogConstraint *constraint)
-{
-	int k;
-
-	for (k = 1; k <= constraint->set->M.NbColumns - 2; k++)
-		cloog_int_set_si(constraint->line[0][k], 0);
-}
-
-CloogConstraintSet *cloog_constraint_set_drop_constraint(
-	CloogConstraintSet *constraints, CloogConstraint *constraint)
-{
-	cloog_constraint_clear(constraint);
-	return constraints;
-}
-
-void cloog_constraint_coefficient_get(CloogConstraint *constraint,
-			int var, cloog_int_t *val)
-{
-	cloog_int_set(*val, constraint->line[0][1+var]);
-}
-
-void cloog_constraint_coefficient_set(CloogConstraint *constraint,
-			int var, cloog_int_t val)
-{
-	cloog_int_set(constraint->line[0][1+var], val);
-}
-
-void cloog_constraint_constant_get(CloogConstraint *constraint, cloog_int_t *val)
-{
-	cloog_int_set(*val, constraint->line[0][constraint->set->M.NbColumns-1]);
-}
-
-/**
- * Copy the coefficient of constraint c into dst in PolyLib order,
- * i.e., first the coefficients of the variables, then the coefficients
- * of the parameters and finally the constant.
- */
-void cloog_constraint_copy_coefficients(CloogConstraint *constraint,
-					cloog_int_t *dst)
-{
-	cloog_seq_cpy(dst, constraint->line[0]+1, constraint->set->M.NbColumns-1);
-}
-
-CloogConstraint *cloog_constraint_invalid(void)
-{
-	return NULL;
-}
-
-int cloog_constraint_is_valid(CloogConstraint *constraint)
-{
-	return constraint != NULL;
-}
-
-
-/**
- * Check whether there is any need for the constraint "upper" on
- * "level" to get reduced.
- * Yes.
- */
-int cloog_constraint_needs_reduction(CloogConstraint *upper, int level)
-{
-	return 1;
-}
-
-
-/**
- * Create a CloogConstraintSet containing enough information to perform
- * a reduction on the upper equality (in this case lower is an invalid
- * CloogConstraint) or the pair of inequalities upper and lower
- * from within insert_modulo_guard.
- * In the PolyLib backend, we return a CloogConstraintSet containting only
- * the upper bound.  The reduction will not change the stride so there
- * will be no need to recompute the bound on the modulo expression.
- */
-CloogConstraintSet *cloog_constraint_set_for_reduction(CloogConstraint *upper,
-	 CloogConstraint *lower)
-{
-	CloogConstraintSet *set;
-
-	set = cloog_constraint_set_from_cloog_matrix(
-		cloog_matrix_alloc(1, upper->set->M.NbColumns));
-	cloog_seq_cpy(set->M.p[0], upper->line[0], set->M.NbColumns);
-	return set;
-}
-
-
-/* Computes x, y and g such that g = gcd(a,b) and a*x+b*y = g */
-static void Euclid(cloog_int_t a, cloog_int_t b,
-			cloog_int_t *x, cloog_int_t *y, cloog_int_t *g)
-{
-    cloog_int_t c, d, e, f, tmp;
-
-    cloog_int_init(c);
-    cloog_int_init(d);
-    cloog_int_init(e);
-    cloog_int_init(f);
-    cloog_int_init(tmp);
-    cloog_int_abs(c, a);
-    cloog_int_abs(d, b);
-    cloog_int_set_si(e, 1);
-    cloog_int_set_si(f, 0);
-    while (cloog_int_is_pos(d)) {
-	cloog_int_tdiv_q(tmp, c, d);
-	cloog_int_mul(tmp, tmp, f);
-	cloog_int_sub(e, e, tmp);
-	cloog_int_tdiv_q(tmp, c, d);
-	cloog_int_mul(tmp, tmp, d);
-	cloog_int_sub(c, c, tmp);
-	cloog_int_swap(c, d);
-	cloog_int_swap(e, f);
-    }
-    cloog_int_set(*g, c);
-    if (cloog_int_is_zero(a))
-	cloog_int_set_si(*x, 0);
-    else if (cloog_int_is_pos(a))
-	cloog_int_set(*x, e);
-    else cloog_int_neg(*x, e);
-    if (cloog_int_is_zero(b))
-	cloog_int_set_si(*y, 0);
-    else {
-	cloog_int_mul(tmp, a, *x);
-	cloog_int_sub(tmp, c, tmp);
-	cloog_int_divexact(*y, tmp, b);
-    }
-    cloog_int_clear(c);
-    cloog_int_clear(d);
-    cloog_int_clear(e);
-    cloog_int_clear(f);
-    cloog_int_clear(tmp);
-}
-
-/**
- * Reduce the modulo guard expressed by "contraints" using equalities
- * found in outer nesting levels (stored in "equal").
- * The modulo guard may be an equality or a pair of inequalities.
- * In case of a pair of inequalities, "constraints" only contains the
- * upper bound and *bound contains the bound on the
- * corresponding modulo expression.  The bound is left untouched by
- * this function.
- */
-CloogConstraintSet *cloog_constraint_set_reduce(CloogConstraintSet *constraints,
-	int level, CloogEqualities *equal, int nb_par, cloog_int_t *bound)
-{
-  int i, j, k, len, len2, nb_iter;
-  struct cloog_vec *line_vector2;
-  cloog_int_t *line, *line2, val, x, y, g;
-
-  len = constraints->M.NbColumns;
-  len2 = cloog_equal_total_dimension(equal) + 2;
-  nb_iter = len - 2 - nb_par;
-
-  cloog_int_init(val);
-  cloog_int_init(x);
-  cloog_int_init(y);
-  cloog_int_init(g);
-
-  line_vector2 = cloog_vec_alloc(len2);
-  line2 = line_vector2->p;
-
-  line = constraints->M.p[0];
-  if (cloog_int_is_pos(line[level]))
-    cloog_seq_neg(line+1, line+1, len-1);
-  cloog_int_neg(line[level], line[level]);
-  assert(cloog_int_is_pos(line[level]));
-
-  for (i = nb_iter; i >= 1; --i) {
-    if (i == level)
-      continue;
-    cloog_int_fdiv_r(line[i], line[i], line[level]);
-    if (cloog_int_is_zero(line[i]))
-      continue;
-
-    /* Look for an earlier variable that is also a multiple of line[level]
-     * and check whether we can use the corresponding affine expression
-     * to "reduce" the modulo guard, where reduction means that we eliminate
-     * a variable, possibly at the expense of introducing other variables
-     * with smaller index.
-     */
-    for (j = level-1; j >= 0; --j) {
-      CloogConstraint *equal_constraint;
-      if (cloog_equal_type(equal, j+1) != EQTYPE_EXAFFINE)
-	continue;
-      equal_constraint = cloog_equal_constraint(equal, j);
-      cloog_constraint_coefficient_get(equal_constraint, j, &val);
-      if (!cloog_int_is_divisible_by(val, line[level])) {
-	cloog_constraint_release(equal_constraint);
-	continue;
-      }
-      cloog_constraint_coefficient_get(equal_constraint, i-1, &val);
-      if (cloog_int_is_divisible_by(val, line[level])) {
-	cloog_constraint_release(equal_constraint);
-	continue;
-      }
-      for (k = j; k > i; --k) {
-	cloog_constraint_coefficient_get(equal_constraint, k-1, &val);
-	if (cloog_int_is_zero(val))
-	  continue;
-	if (!cloog_int_is_divisible_by(val, line[level]))
-	  break;
-      }
-      if (k > i) {
-	 cloog_constraint_release(equal_constraint);
-	 continue;
-      }
-      cloog_constraint_coefficient_get(equal_constraint, i-1, &val);
-      Euclid(val, line[level], &x, &y, &g);
-      if (!cloog_int_is_divisible_by(val, line[i])) {
-	cloog_constraint_release(equal_constraint);
-	continue;
-      }
-      cloog_int_divexact(val, line[i], g);
-      cloog_int_neg(val, val);
-      cloog_int_mul(val, val, x);
-      cloog_int_set_si(y, 1);
-      /* Add (equal->p[j][i])^{-1} * line[i] times the equality */
-      cloog_constraint_copy_coefficients(equal_constraint, line2+1);
-      cloog_seq_combine(line+1, y, line+1, val, line2+1, i);
-      cloog_seq_combine(line+len-nb_par-1, y, line+len-nb_par-1,
-					   val, line2+len2-nb_par-1, nb_par+1);
-      cloog_constraint_release(equal_constraint);
-      break;
-    }
-  }
-
-  cloog_vec_free(line_vector2);
-
-  cloog_int_clear(val);
-  cloog_int_clear(x);
-  cloog_int_clear(y);
-  cloog_int_clear(g);
-
-  /* Make sure the line is not inverted again in the calling function. */
-  cloog_int_neg(line[level], line[level]);
-
-  return constraints;
-}
-
-CloogConstraint *cloog_constraint_first(CloogConstraintSet *constraints)
-{
-	CloogConstraint *c;
-	if (constraints->M.NbRows == 0)
-		return cloog_constraint_invalid();
-	c = ALLOC(CloogConstraint);
-	c->set = constraints;
-	c->line = &constraints->M.p[0];
-	return c;
-}
-
-CloogConstraint *cloog_constraint_next(CloogConstraint *constraint)
-{
-	constraint->line++;
-	if (constraint->line == constraint->set->M.p + constraint->set->M.NbRows) {
-		cloog_constraint_release(constraint);
-		return NULL;
-	}
-	return constraint;
-}
-
-CloogConstraint *cloog_constraint_copy(CloogConstraint *constraint)
-{
-	CloogConstraint *c = ALLOC(CloogConstraint);
-	c->set = constraint->set;
-	c->line = constraint->line;
-	return c;
-}
-
-void cloog_constraint_release(CloogConstraint *constraint)
-{
-	free(constraint);
-}
-
-int cloog_constraint_set_foreach_constraint(CloogConstraintSet *constraints,
-	int (*fn)(CloogConstraint *constraint, void *user), void *user)
-{
-	CloogConstraint *c;
-
-	for (c = cloog_constraint_first(constraints);
-	     cloog_constraint_is_valid(c); c = cloog_constraint_next(c))
-		if (fn(c, user) < 0) {
-			cloog_constraint_release(c);
-			return -1;
-		}
-
-	return 0;
-}
-
-CloogConstraint *cloog_equal_constraint(CloogEqualities *equal, int j)
-{
-	CloogConstraint *c = ALLOC(CloogConstraint);
-	c->set = equal->constraints;
-	c->line = &equal->constraints->M.p[j];
-	return c;
-}
diff --git a/cloog-0.16.3/source/mp_get_memory_functions.c b/cloog-0.16.3/source/mp_get_memory_functions.c
deleted file mode 100644
index e14e336..0000000
--- a/cloog-0.16.3/source/mp_get_memory_functions.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <gmp.h>
-
-void mp_get_memory_functions(
-		void *(**alloc_func_ptr) (size_t),
-		void *(**realloc_func_ptr) (void *, size_t, size_t),
-		void (**free_func_ptr) (void *, size_t))
-{
-	if (alloc_func_ptr)
-		*alloc_func_ptr = __gmp_allocate_func;
-	if (realloc_func_ptr)
-		*realloc_func_ptr = __gmp_reallocate_func;
-	if (free_func_ptr)
-		*free_func_ptr = __gmp_free_func;
-}
diff --git a/cloog-0.16.3/source/names.c b/cloog-0.16.3/source/names.c
deleted file mode 100644
index 53e39b2..0000000
--- a/cloog-0.16.3/source/names.c
+++ /dev/null
@@ -1,528 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                             names.c                               **
-    **-------------------------------------------------------------------**
-    **                  First version: august 1st 2002                   **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2002-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-/* CAUTION: the english used for comments is probably the worst you ever read,
- *          please feel free to correct and improve it !
- */
-
-
-# include <stdlib.h>
-# include <stdio.h>
-# include <ctype.h>
-# include "../include/cloog/cloog.h"
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-
-
-/**
- * cloog_names_print function:
- * this function is a human-friendly way to display the CloogNames data
- * structure, it shows all the different fields and includes an indentation
- * level (level) in order to work with others print_structure functions.
- * - July 1st 2005: first version based on the old cloog_names_print function,
- *                  it was the first modification in this file since two years !
- */
-void cloog_names_print_structure(FILE * file, CloogNames * names, int level)
-{ int i ;
-  
-  /* Go to the right level. */
-  for (i=0; i<level; i++)
-  fprintf(file,"|\t") ;
-  
-  if (names != NULL)
-  { fprintf(file,"+-- CloogNames\n") ;
-    
-    /* A blank line. */
-    for (i=0; i<=level+1; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"\n") ;
-
-    /* Print the scalar dimension number. */
-    for (i=0; i<=level; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"Scalar dimension number ---: %d\n",names->nb_scalars) ;
-
-    /* A blank line. */
-    for (i=0; i<=level+1; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"\n") ;
-
-    /* Print the scalar iterators. */
-    for (i=0; i<=level; i++)
-    fprintf(file,"|\t") ;
-    if (names->nb_scalars > 0)
-    { fprintf(file,"+-- Scalar iterator strings:") ;
-      for (i=0;i<names->nb_scalars;i++)
-      fprintf(file," %s",names->scalars[i]) ;
-      fprintf(file,"\n") ;
-    }
-    else
-    fprintf(file,"+-- No scalar string\n") ;
-
-    /* A blank line. */
-    for (i=0; i<=level+1; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"\n") ;
-
-    /* Print the scattering dimension number. */
-    for (i=0; i<=level; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"Scattering dimension number: %d\n",names->nb_scattering) ;
-
-    /* A blank line. */
-    for (i=0; i<=level+1; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"\n") ;
-
-    /* Print the scattering iterators. */
-    for (i=0; i<=level; i++)
-    fprintf(file,"|\t") ;
-    if (names->nb_scattering > 0)
-    { fprintf(file,"+-- Scattering strings ----:") ;
-      for (i=0;i<names->nb_scattering;i++)
-      fprintf(file," %s",names->scattering[i]) ;
-      fprintf(file,"\n") ;
-    }
-    else
-    fprintf(file,"+-- No scattering string\n") ;
-
-    /* A blank line. */
-    for (i=0; i<=level+1; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"\n") ;
-    
-    /* Print the iterator number. */
-    for (i=0; i<=level; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"Iterator number -----------: %d\n",names->nb_iterators) ;
-
-    /* A blank line. */
-    for (i=0; i<=level+1; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"\n") ;
-
-    /* Print the iterators. */
-    for (i=0; i<=level; i++)
-    fprintf(file,"|\t") ;
-    if (names->nb_iterators > 0)
-    { fprintf(file,"+-- Iterator strings ------:") ;
-      for (i=0;i<names->nb_iterators;i++)
-      fprintf(file," %s",names->iterators[i]) ;
-      fprintf(file,"\n") ;
-    }
-    else
-    fprintf(file,"+-- No iterators\n") ;
-
-    /* A blank line. */
-    for (i=0; i<=level+1; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"\n") ;
-    
-    /* Print the parameter number. */
-    for (i=0; i<=level; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"Parameter number ----------: %d\n",names->nb_parameters) ;
-
-    /* A blank line. */
-    for (i=0; i<=level+1; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"\n") ;
-
-    /* Print the parameters. */
-    for (i=0; i<=level; i++)
-    fprintf(file,"|\t") ;
-    if (names->nb_parameters > 0)
-    { fprintf(file,"+-- Parameter strings -----:") ;
-      for (i=0;i<names->nb_parameters;i++)
-      fprintf(file," %s",names->parameters[i]) ;
-      fprintf(file,"\n") ;
-    }
-    else
-    fprintf(file,"No parameters\n") ;
-    
-  }
-  else
-  fprintf(file,"+-- No CloogNames\n") ;
-  fprintf(file, "Number of active references: %d\n", names->references);
-}
-
-
-/**
- * cloog_names_print function:
- * This function prints the content of a CloogNames structure (names) into a
- * file (file, possibly stdout).
- * - July 1st 2005: Now this function is only a frontend to
- *                  cloog_program_print_structure, with a quite better
- *                  human-readable representation.
- */
-void cloog_names_print(FILE * file, CloogNames * names)
-{ cloog_names_print_structure(file,names,0) ;
-}
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-
-
-/**
- * cloog_names_free function:
- * This function decrements the number of active references to 
- * a CloogNames structure and frees the allocated memory for this structure
- * if the count drops to zero.
- */
-void cloog_names_free(CloogNames * names)
-{ int i ;
-
-  if (--names->references)
-    return;
-
-  if (names->scalars != NULL)
-  { for (i=0;i<names->nb_scalars;i++)
-    free(names->scalars[i]) ;
-    free(names->scalars) ;
-  }
-   
-  if (names->scattering != NULL)
-  { for (i=0;i<names->nb_scattering;i++)
-    free(names->scattering[i]) ;
-    free(names->scattering) ;
-  }
-   
-  if (names->iterators != NULL)
-  { for (i=0;i<names->nb_iterators;i++)
-    free(names->iterators[i]) ;
-    free(names->iterators) ;
-  }
-   
-  if (names->parameters != NULL)
-  { for (i=0;i<names->nb_parameters;i++)
-    free(names->parameters[i]) ;
-    free(names->parameters) ;
-  }
-  free(names) ;
-}
-
-
-/**
- * cloog_names_copy function:
- * As usual in CLooG, "copy" means incrementing the reference count.
- */ 
-CloogNames *cloog_names_copy(CloogNames *names)
-{
-  names->references++;
-  return names;
-}
-
-
-/******************************************************************************
- *                              Reading functions                             *
- ******************************************************************************/
-
-
-/**
- * cloog_names_read_strings function:
- * This function reads names data from a file (file, possibly stdin). It first
- * reads the naming option to know if whether it can read the names from the
- * file.  If not, NULL is returned.  Otherwise, the names are stored
- * into an array of strings, and a pointer to this array is returned.
- * - nb_items is the number of names the function will have to read if the
- *   naming option is set to read.
- */
-char ** cloog_names_read_strings(FILE *file, int nb_items)
-{ int i, option, n ;
-  char s[MAX_STRING], str[MAX_STRING], * c, **names = NULL;
-
-  /* We first read name option. */
-  while (fgets(s,MAX_STRING,file) == 0) ;
-  while ((*s=='#' || *s=='\n') || (sscanf(s," %d",&option)<1))
-  fgets(s,MAX_STRING,file) ;
-  
-  /* If there is no item to read, then return NULL. */
-  if (nb_items == 0)
-  return NULL ;
-  
-  /* If option is to read them in the file, then we do it and put them into
-   * the array.
-   */
-  if (option)
-  { /* Memory allocation. */
-    names = (char **)malloc(nb_items*sizeof(char *)) ;
-    if (names == NULL) 
-      cloog_die("memory overflow.\n");
-    for (i=0;i<nb_items;i++)
-    { names[i] = (char *)malloc(MAX_NAME*sizeof(char)) ;
-      if (names[i] == NULL) 
-	cloog_die("memory overflow.\n");
-    }
-    
-    do  /* Skip the comments, spaces and empty lines... */
-    { c = fgets(s,MAX_STRING,file) ;
-      while ((c != NULL) && isspace(*c) && (*c != '\n'))
-      c++ ;
-    }
-    while (c != NULL && (*c == '#' || *c == '\n'));
-    
-    if (c == NULL) 
-      cloog_die("no names in input file.\n");
-    for (i=0;i<nb_items;i++) 
-    { /* All names must be on the same line. */
-      while (isspace(*c))
-      c++ ;
-      if (!*c || *c == '#' || *c == '\n')
-        cloog_die("not enough names in input file.\n");
-      /* n is strlen(str). */
-      if (sscanf(c,"%s%n",str,&n) == 0) 
-        cloog_die("no names in input file.\n");
-      sscanf(str,"%s",names[i]) ;
-      c += n ;
-    }
-  }
-
-  return names ;
-}
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-
-
-/**
- * cloog_names_malloc function:
- * This function allocates the memory space for a CloogNames structure and
- * sets its fields with default values. Then it returns a pointer to the
- * allocated space.
- * - November 21th 2005: first version.
- */
-CloogNames * cloog_names_malloc()
-{ CloogNames * names ;
-  
-  /* Memory allocation for the CloogNames structure. */
-  names = (CloogNames *)malloc(sizeof(CloogNames)) ;
-  if (names == NULL) 
-    cloog_die("memory overflow.\n");
-  
-  /* We set the various fields with default values. */
-  names->nb_scalars    = 0 ;
-  names->nb_scattering = 0 ;
-  names->nb_iterators  = 0 ;
-  names->nb_parameters = 0 ;
-  names->scalars       = NULL ;
-  names->scattering    = NULL ;
-  names->iterators     = NULL ;
-  names->parameters    = NULL ;
-  names->references    = 1;
-  
-  return names ;
-}  
-
-
-/**
- * cloog_names_alloc function:
- * This function allocates the memory space for a CloogNames structure and
- * sets its fields with those given as input. Then it returns a pointer to the
- * allocated space.
- * - July       7th 2005: first version.
- * - September 11th 2005: addition of both scalar and scattering informations.
- * - November  21th 2005: use of cloog_names_malloc.
- */
-CloogNames * cloog_names_alloc()
-{ CloogNames * names ;
-
-  /* Memory allocation for the CloogNames structure. */
-  names = cloog_names_malloc() ;
-  
-  names->nb_scalars    = 0;
-  names->nb_scattering = 0;
-  names->nb_iterators  = 0;
-  names->nb_parameters = 0;
-  names->scalars       = NULL;
-  names->scattering    = NULL;
-  names->iterators     = NULL;
-  names->parameters    = NULL;
-  
-  return names ;
-}
-
-
-/**
- * cloog_names_generate_items function:
- * This function returns a pointer to an array of strings with entries set
- * based on the function's parameters.
- * - nb_items will be the number of entries in the string array.
- * - prefix is the name prefix of each item or NULL.
- *   If not NULL, then the remainder of the name will be an integer
- *   in the range [0, nb_items-1].
- * - first_item is the name of the first item (if prefix == NULL),
- *   the nb_items-1 following items will be the nb_items-1
- *   following letters in ASCII code.
- **
- * - September 9th 2002 : first version, extracted from cloog_names_generate.
- */
-char ** cloog_names_generate_items(int nb_items, char * prefix, char first_item)
-{ int i ;
-  char ** names ;
-  
-  if (nb_items == 0)
-  return NULL ;
-    
-  names = (char **)malloc(nb_items*sizeof(char *)) ;
-  if (names == NULL) 
-    cloog_die("memory overflow.\n");
-  for (i=0;i<nb_items;i++)
-  { names[i] = (char *)malloc(MAX_NAME*sizeof(char)) ;
-    if (names[i] == NULL) 
-      cloog_die("memory overflow.\n");
-    if (prefix == NULL)
-    sprintf(names[i],"%c",first_item+i) ;
-    else
-      sprintf(names[i], "%s%d", prefix, 1+i);
-  }
-  
-  return names ;
-}
-
-
-/**
- * cloog_names_generate function:
- * This function returns a pointer to a CloogNames structure with fields set
- * thanks to the function's parameters.
- * - nb_scalars will be the number of scalar dimensions in the structure.
- * - nb_scattering will be the number of scattering dimensions in the structure.
- * - nb_iterators will be the number of iterators in the CloogNames structure.
- * - nb_parameters will be the number of parameters in the CloogNames structure.
- * - first_s is the name of the first scalar iterator, the nb_scalars-1
- *   following iterators will be the nb_scalars-1 following letters in ASCII.
- * - first_t is the name of the first scattering iterator, the nb_scattering-1
- *   following iterators will be the nb_scattering-1 following letters in ASCII.
- * - first_i is the name of the first iterator, the nb_iterators-1 following
- *   iterators will be the nb_iterators-1 following letters in ASCII code.
- * - first_i is the name of the first iterator, the nb_iterators-1 following
- *   iterators will be the nb_iterators-1 following letters in ASCII code.
- * - first_p is the name of the first parameter, the nb_parameters-1 following
- *   parameters will be the nb_parameters-1 following letters in ASCII code.
- **
- * - July       1st 2002 : first version.
- * - September  9th 2002 : use of cloog_names_generate_items.
- * - September 11th 2005 : addition of both scalar and scattering informations.
- */
-CloogNames * cloog_names_generate(
-     nb_scalars, nb_scattering, nb_iterators, nb_parameters,
-     first_s,    first_t,       first_i,      first_p)
-int  nb_scalars, nb_scattering, nb_iterators, nb_parameters ;
-char first_s,    first_t,       first_i,      first_p ;
-{ CloogNames * names ;
-
-  names = (CloogNames *)malloc(sizeof(CloogNames)) ;
-  if (names == NULL) 
-    cloog_die("memory overflow.\n");
-  
-  names->nb_scalars    = nb_scalars ;
-  names->nb_scattering = nb_scattering ;
-  names->nb_parameters = nb_parameters ;
-  names->nb_iterators  = nb_iterators ;
-  names->scalars       = cloog_names_generate_items(nb_scalars,   NULL,first_s);
-  names->scattering    = cloog_names_generate_items(nb_scattering,NULL,first_t);
-  names->parameters    = cloog_names_generate_items(nb_parameters,NULL,first_p);
-  names->iterators     = cloog_names_generate_items(nb_iterators, NULL,first_i);
-
-  return names ;
-}
-
-
-/* Lastly we update the CLoogNames structure: the iterators corresponding to
- * scalar dimensions have to be removed since these dimensions have been
- * erased and do not need to be print. We copy all the iterator names except
- * the scalar ones in a new string array.
- * - September 12th 2005: first version. 
- */
-void cloog_names_scalarize(CloogNames * names, int nb_scattdims, int * scaldims)
-{ int  nb_scalars, nb_scattering, i, current_scalar, current_scattering ;
-  char ** scalars, ** scattering ;
-
-  if (!nb_scattdims || (scaldims == NULL))
-  return ;
-  
-  nb_scalars = 0 ;
-  for (i=0;i<nb_scattdims;i++)
-  if (scaldims[i])
-  nb_scalars  ++ ;
-
-  if (!nb_scalars)
-  return ;
-  
-  nb_scattering = names->nb_scattering - nb_scalars ;
-  scattering = (char **)malloc(nb_scattering * sizeof(char *)) ;
-  if (scattering == NULL) 
-    cloog_die("memory overflow.\n");
-  scalars = (char **)malloc(nb_scalars * sizeof(char *)) ;
-  if (scalars == NULL) 
-    cloog_die("memory overflow.\n");
-  
-  current_scalar = 0 ;
-  current_scattering  = 0 ;
-  for (i=0;i<nb_scattdims;i++)
-  { if (!scaldims[i])
-    { scattering[current_scattering] = names->scattering[i] ;
-      current_scattering ++ ;
-    }
-    else
-    { scalars[current_scalar] = names->scattering[i] ;
-      current_scalar ++ ;
-    }
-  }
-  
-  free(names->scattering) ;
-  names->scattering    = scattering ;
-  names->scalars       = scalars ;
-  names->nb_scattering = nb_scattering ;
-  names->nb_scalars    = nb_scalars ;
-}
-
-/**
- * Return the name at a given level (starting at one).
- * May be a scattering dimension or an iterator of the original domain.
- */
-const char *cloog_names_name_at_level(CloogNames *names, int level)
-{
-  if (level <= names->nb_scattering)
-    return names->scattering[level - 1];
-  else
-    return names->iterators[level - names->nb_scattering - 1];
-}
diff --git a/cloog-0.16.3/source/options.c b/cloog-0.16.3/source/options.c
deleted file mode 100644
index 561b4f6..0000000
--- a/cloog-0.16.3/source/options.c
+++ /dev/null
@@ -1,464 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                            options.c                              **
-    **-------------------------------------------------------------------**
-    **                  First version: april 19th 2003                   **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-#include <stdarg.h>
-# include <stdlib.h>
-# include <stdio.h>
-# include <string.h>
-# include "../include/cloog/cloog.h"
-
-
-/******************************************************************************
- *                          Error reporting functions                         *
- ******************************************************************************/
-
-void cloog_vmsg(CloogOptions *options, enum cloog_msg_type type,
-		const char *msg, va_list ap)
-{
-  const char *type_msg;
-
-  if (options && options->quiet &&
-      (type == CLOOG_WARNING || type == CLOOG_INFO))
-    return;
-
-  switch(type) {
-  case CLOOG_WARNING:
-	type_msg = "WARNING";
-	break;
-  case CLOOG_INFO:
-	type_msg = "INFO";
-	break;
-  case CLOOG_ERROR:
-  default:
-	type_msg = "ERROR";
-	break;
-  }
-  fprintf(stderr, "[CLooG] %s: ", type_msg);
-  vfprintf(stderr, msg, ap);
-}
-
-/**
- * Print message to stderr.
- * @param msg printf format string
- */
-void cloog_msg(CloogOptions *options, enum cloog_msg_type type,
-		const char *msg, ...)
-{
-  va_list args;
-
-  va_start(args, msg);
-  cloog_vmsg(options, type, msg, args);
-  va_end(args);
-}
-
-/**
- * Print error message to stderr and exit.
- * @param msg printf format string
- */
-void cloog_die(const char *msg, ...)
-{
-  va_list args;
-
-  va_start(args, msg);
-  cloog_vmsg(NULL, CLOOG_ERROR, msg, args);
-  va_end(args);
-  exit(1);
-}
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-
-
-/**
- * cloog_option_print function:
- * This function prints the content of a CloogOptions structure (program) into
- * a file (foo, possibly stdout).
- * - April 19th 2003: first version.
- */
-void cloog_options_print(FILE * foo, CloogOptions * options)
-{ fprintf(foo,"Options:\n") ;
-  fprintf(foo,"OPTIONS FOR LOOP GENERATION\n") ;
-  fprintf(foo,"l           = %3d,\n",options->l) ;
-  fprintf(foo,"f           = %3d,\n",options->f) ;
-  fprintf(foo,"stop        = %3d,\n",options->stop) ;
-  fprintf(foo,"strides     = %3d,\n",options->strides) ;
-  fprintf(foo,"sh          = %3d,\n",options->sh);
-  fprintf(foo,"OPTIONS FOR PRETTY PRINTING\n") ;
-  fprintf(foo,"esp         = %3d,\n",options->esp) ;
-  fprintf(foo,"fsp         = %3d,\n",options->fsp) ;
-  fprintf(foo,"otl         = %3d.\n",options->otl) ;
-  fprintf(foo,"block       = %3d.\n",options->block) ;
-  fprintf(foo,"compilable  = %3d.\n",options->compilable) ;
-  fprintf(foo,"callable    = %3d.\n",options->callable) ;
-  fprintf(foo,"UNDOCUMENTED OPTIONS FOR THE AUTHOR ONLY\n") ;
-  fprintf(foo,"leaks       = %3d.\n",options->leaks) ;
-  fprintf(foo,"backtrack   = %3d.\n",options->backtrack);
-  fprintf(foo,"override    = %3d.\n",options->override) ;
-  fprintf(foo,"structure   = %3d.\n",options->structure) ;
-  fprintf(foo,"noscalars   = %3d.\n",options->noscalars) ;
-  fprintf(foo,"noblocks    = %3d.\n",options->noblocks) ;
-  fprintf(foo,"nosimplify  = %3d.\n",options->nosimplify) ;
-}
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-
-
-/**
- * cloog_options_free function:
- * This function frees the allocated memory for a CloogOptions structure.
- * - April 19th 2003: first version.
- */
-void cloog_options_free(CloogOptions *options)
-{
-  free(options);
-}
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-
-
-/**
- * cloog_options_help function:
- * This function displays the quick help when the user set the option -help
- * while calling cloog. Prints are cutted to respect the 509 characters
- * limitation of the ISO C 89 compilers.
- * - August 5th 2002: first version.
- */
-void cloog_options_help()
-{ printf(
-  "Usage: cloog [ options | file ] ...\n"
-  "Options for code generation:\n"
-  "  -l <depth>            Last loop depth to optimize (-1: infinity)\n"
-  "                        (default setting: -1).\n"
-  "  -f <depth>            First loop depth to start loop separation (-1: "
-  "infinity)\n                        (default setting:  1).\n") ;
-  printf(
-  "  -stop <depth>         Loop depth to stop code generation (-1: infinity)"
-  "\n                        (default setting: -1).\n"
-  "  -strides <boolean>    Handle non-unit strides (1) or not (0)\n"
-  "                        (default setting:  0).\n") ;
-  printf(
-  "\nOptions for pretty printing:\n"
-  "  -otl <boolean>        Simplify loops running one time (1) or not (0)\n"
-  "                        (default setting:  1).\n") ;
-  printf(
-  "  -esp <boolean>        Allow complex equalities spreading (1) or not (0)\n"
-  "                        (default setting:  0).\n");
-  printf(
-  "  -fsp <level>          First level to begin the spreading\n"
-  "                        (default setting:  1).\n"
-  "  -block <boolean>      Make a new statement block per iterator in C\n"
-  "                        programs (1) or not (0) (default setting: 0).\n") ;
-  printf(
-  "  -compilable <number>  Compilable code by using preprocessor (not 0) or" 
-  "\n                        not (0), number being the value of the parameters"
-  "\n                        (default setting:  0).\n"
-  "  -callable <boolean>   Testable code by using preprocessor (not 0) or" 
-  "\n                        not (0) (default setting:  0).\n");
-  printf(
-  "\nGeneral options:\n"
-  "  -o <output>           Name of the output file; 'stdout' is a special\n"
-  "                        value: when used, output is standard output\n"
-  "                        (default setting: stdout).\n"
-  "  -v, --version         Display the version information (and more).\n"
-  "  -q, --quiet           Don't print any informational messages.\n"
-  "  -h, --help            Display this information.\n\n") ;
-  printf(
-  "The special value 'stdin' for 'file' makes CLooG to read data on\n"
-  "standard input.\n\n"
-  "For bug reporting or any suggestions, please send an email to the author\n"
-  "<cedric.bastoul@inria.fr>.\n") ;
-}
-
-
-/**
- * cloog_options_version function:
- * This function displays some version informations when the user set the
- * option -version while calling cloog. Prints are cutted to respect the 509
- * characters limitation of the ISO C 89 compilers.
- * - August 5th 2002: first version.
- */
-void cloog_options_version()
-{ printf("%s       The Chunky Loop Generator\n", cloog_version());
-  printf(
-  "-----\n"
-  "This is a loop generator for scanning Z-polyhedra. It is based on the "
-  "work of\nF. Quillere and C. Bastoul on high level code generation and of "
-  "the PolyLib Team\non polyhedral computation. This program is distributed "
-  "under the terms of the\nGNU Lesser General Public License "
-  "(details at http://www.gnu.org/licenses/lgpl-2.1.html).\n"
-  "-----\n") ;
-  printf(
-  "It would be fair to refer the following paper in any publication "
-  "resulting from\nthe use of this software or its library:\n"
-  "@InProceedings{Bas04,\n"
-  "author    =  {Cedric Bastoul},\n"
-  "title     =  {Code Generation in the Polyhedral Model Is Easier Than You "
-  "Think},\n"
-  "booktitle =  {PACT'13 IEEE International Conference on Parallel "
-  "Architecture\n             and Compilation Techniques},\n"
-  "pages     =  {7--16},\n"
-  "month     =  {september},\n"
-  "year      =  2004,\n"
-  "address   =  {Juan-les-Pins}\n"
-  "}\n"
-  "-----\n"
-  "For any information, please ask the author at "
-  "<cedric.bastoul@inria.fr>.\n") ;
-} 
-
-
-/**
- * cloog_options_set function:
- * This function sets the value of an option thanks to the user's calling line.
- * - option is the value to set,
- * - argc are the elements of the user's calling line,
- * - number is the number of the element corresponding to the considered option,
- *   this function adds 1 to number to pass away the option value.
- **
- * - August 5th 2002: first version.
- * - June 29th 2003: (debug) lack of argument now detected.
- */
-void cloog_options_set(int * option, int argv, char ** argc, int * number)
-{ char ** endptr ;
-  
-  if (*number+1 >= argv)
-    cloog_die("an option lacks of argument.\n");
-
-  endptr = NULL ;
-  *option = strtol(argc[*number+1],endptr,10) ;
-  if (endptr != NULL)
-    cloog_die("value '%s' for option '%s' is not valid.\n",
-	      argc[*number+1], argc[*number]);
-  *number = *number + 1 ;
-}
-
-
-/**
- * cloog_options_malloc function:
- * This functions allocate the memory space for a CLoogOptions structure and
- * fill its fields with the defaults values. It returns a pointer to the
- * allocated CloogOptions structure.
- * - April    19th 2003: first version.
- * - November 21th 2005: name changed (before it was cloog_options_init).
- */
-CloogOptions *cloog_options_malloc(CloogState *state)
-{ CloogOptions * options ;
-
-  /* Memory allocation for the CloogOptions structure. */
-  options = (CloogOptions *)malloc(sizeof(CloogOptions)) ;
-  if (options == NULL) 
-    cloog_die("memory overflow.\n");
-  
-  options->state = state;
-
-  /* We set the various fields with default values. */
-  /* OPTIONS FOR LOOP GENERATION */
-  options->l           = -1 ;  /* Last level to optimize: infinity. */
-  options->f           =  1 ;  /* First level to optimize: the first. */
-  options->stop        = -1 ;  /* Generate all the code. */
-  options->strides     =  0 ;  /* Generate a code with unit strides. */
-  options->sh	       =  0;   /* Compute actual convex hull. */
-  options->first_unroll = -1;  /* First level to unroll: none. */
-  options->name	       = "";
-  /* OPTIONS FOR PRETTY PRINTING */
-  options->esp         =  1 ;  /* We want Equality SPreading.*/
-  options->fsp         =  1 ;  /* The First level to SPread is the first. */
-  options->otl         =  1 ;  /* We want to fire One Time Loops. */
-  options->block       =  0 ;  /* We don't want to force statement blocks. */
-  options->compilable  =  0 ;  /* No compilable code. */
-  options->callable    =  0 ;  /* No callable code. */
-  options->quiet       =  0;   /* Do print informational messages. */
-  options->language     = LANGUAGE_C; /* The default output language is C. */
-  options->save_domains = 0;   /* Don't save domains. */
-  /* UNDOCUMENTED OPTIONS FOR THE AUTHOR ONLY */
-  options->leaks       =  0 ;  /* I don't want to print allocation statistics.*/
-  options->backtrack   =  0;   /* Perform backtrack in Quillere's algorithm.*/
-  options->override    =  0 ;  /* I don't want to override CLooG decisions.*/
-  options->structure   =  0 ;  /* I don't want to print internal structure.*/
-  options->noblocks    =  0 ;  /* I do want to make statement blocks.*/
-  options->noscalars   =  0 ;  /* I do want to use scalar dimensions.*/
-  options->nosimplify  =  0 ;  /* I do want to simplify polyhedra.*/
-  
-  return options ;
-}
-
-
-
-/**
- * cloog_options_read function:
- * This functions reads all the options and the input/output files thanks
- * the the user's calling line elements (in argc). It fills a CloogOptions
- * structure and the FILE structure corresponding to input and output files.
- * - August 5th 2002: first version.
- * - April 19th 2003: now in options.c and support of the CloogOptions structure.
- */
-void cloog_options_read(CloogState *state, int argc, char **argv,
-			FILE **input, FILE **output, CloogOptions **options)
-{ int i, infos=0, input_is_set=0 ;
-  
-  /* CloogOptions structure allocation and initialization. */
-  *options = cloog_options_malloc(state);
-  
-  /* The default output is the standard output. */
-  *output = stdout ;
-
-  for (i=1;i<argc;i++)
-  if (argv[i][0] == '-')
-  { if (strcmp(argv[i],"-l")   == 0)
-    cloog_options_set(&(*options)->l,argc,argv,&i) ;
-    else
-    if (strcmp(argv[i],"-f")   == 0)
-    cloog_options_set(&(*options)->f,argc,argv,&i) ;
-    else
-    if (strcmp(argv[i],"-stop")   == 0)
-    cloog_options_set(&(*options)->stop,argc,argv,&i) ;
-    else
-    if (strcmp(argv[i],"-strides")   == 0)
-    cloog_options_set(&(*options)->strides,argc,argv,&i) ;
-    else if (strcmp(argv[i],"-sh")   == 0)
-      cloog_options_set(&(*options)->sh,argc,argv,&i) ;
-    else if (!strcmp(argv[i], "-first-unroll"))
-      cloog_options_set(&(*options)->first_unroll, argc, argv, &i);
-    else
-    if (strcmp(argv[i],"-otl") == 0)
-    cloog_options_set(&(*options)->otl,argc,argv,&i) ;
-    else
-    if (strcmp(argv[i],"-esp") == 0)
-    cloog_options_set(&(*options)->esp,argc,argv,&i) ;
-    else
-    if (strcmp(argv[i],"-fsp") == 0)
-    cloog_options_set(&(*options)->fsp,argc,argv,&i) ;
-    else
-    if (strcmp(argv[i],"-block") == 0)
-    cloog_options_set(&(*options)->block,argc,argv,&i) ;
-    else
-    if (strcmp(argv[i],"-compilable") == 0)
-      cloog_options_set(&(*options)->compilable, argc, argv, &i);
-    else if (strcmp(argv[i], "-callable") == 0)
-      cloog_options_set(&(*options)->callable, argc, argv, &i);
-    else
-    if (strcmp(argv[i],"-loopo") == 0) /* Special option for the LooPo team ! */
-    { (*options)->esp   = 0 ;
-      (*options)->block = 1 ;
-    }
-    else
-    if (strcmp(argv[i],"-bipbip") == 0)/* Special option for the author only !*/
-      (*options)->backtrack = 0;
-    else
-    if (strcmp(argv[i],"-leaks") == 0)
-    (*options)->leaks = 1 ;
-    else
-    if (strcmp(argv[i],"-nobacktrack") == 0)
-      (*options)->backtrack = 0;
-    else if (strcmp(argv[i], "-backtrack") == 0)
-      (*options)->backtrack = 1;
-    else
-    if (strcmp(argv[i],"-override") == 0)
-    (*options)->override = 1 ;
-    else
-    if (strcmp(argv[i],"-noblocks") == 0)
-    (*options)->noblocks = 1 ;
-    else
-    if (strcmp(argv[i],"-noscalars") == 0)
-    (*options)->noscalars = 1 ;
-    else
-    if (strcmp(argv[i],"-nosimplify") == 0)
-    (*options)->nosimplify = 1 ;
-    else
-    if ((strcmp(argv[i],"-struct") == 0) || (strcmp(argv[i],"-structure") == 0))
-    (*options)->structure = 1 ;
-    else
-    if ((strcmp(argv[i],"--help") == 0) || (strcmp(argv[i],"-h") == 0))
-    { cloog_options_help() ;
-      infos = 1 ;
-    }
-    else
-    if ((strcmp(argv[i],"--version") == 0) || (strcmp(argv[i],"-v") == 0))
-    { cloog_options_version() ;
-      infos = 1 ;
-    } else if ((strcmp(argv[i],"--quiet") == 0) || (strcmp(argv[i],"-q") == 0))
-      (*options)->quiet = 1;
-    else
-    if (strcmp(argv[i],"-o") == 0)
-    { if (i+1 >= argc)
-        cloog_die("no output name for -o option.\n");
-
-      /* stdout is a special value, when used, we set output to standard
-       * output.
-       */
-      if (strcmp(argv[i+1],"stdout") == 0)
-      *output = stdout ;
-      else
-      { *output = fopen(argv[i+1],"w") ;
-        if (*output == NULL)
-          cloog_die("can't create output file %s.\n", argv[i+1]);
-      }
-      i ++ ;    
-    }
-    else
-      cloog_msg(*options, CLOOG_WARNING, "unknown %s option.\n", argv[i]);
-  }
-  else
-  { if (!input_is_set)
-    { input_is_set = 1 ;
-      (*options)->name = argv[i] ;
-      /* stdin is a special value, when used, we set input to standard input. */
-      if (strcmp(argv[i],"stdin") == 0)
-      *input = stdin ;
-      else
-      { *input = fopen(argv[i],"r") ;
-        if (*input == NULL)
-          cloog_die("%s file does not exist.\n", argv[i]);
-      }
-    } 
-    else
-      cloog_die("multiple input files.\n");
-  }
-  if (!input_is_set)
-  { if (!infos)
-      cloog_die("no input file (-h for help).\n");
-    exit(1) ;
-  }
-}
-
diff --git a/cloog-0.16.3/source/pprint.c b/cloog-0.16.3/source/pprint.c
deleted file mode 100644
index 3dacec2..0000000
--- a/cloog-0.16.3/source/pprint.c
+++ /dev/null
@@ -1,423 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                             pprint.c                              **
-    **-------------------------------------------------------------------**
-    **                  First version: october 26th 2001                 **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-/* CAUTION: the english used for comments is probably the worst you ever read,
- *          please feel free to correct and improve it !
- */
-
-/* June    22nd 2005: General adaptation for GMP.
- * October 26th 2005: General adaptation from CloogDomain to Matrix data
- *                    structure for all constraint systems.
- * October 27th 2005: General adaptation from CloogEqual to Matrix data
- *                    structure for equality spreading.
- */
-
-# include <stdlib.h>
-# include <stdio.h>
-# include <string.h>
-#include <assert.h>
-# include "../include/cloog/cloog.h"
-
-
-static void pprint_name(FILE *dst, struct clast_name *n);
-static void pprint_term(struct cloogoptions *i, FILE *dst, struct clast_term *t);
-static void pprint_sum(struct cloogoptions *opt,
-			FILE *dst, struct clast_reduction *r);
-static void pprint_binary(struct cloogoptions *i,
-			FILE *dst, struct clast_binary *b);
-static void pprint_minmax_f(struct cloogoptions *info,
-			FILE *dst, struct clast_reduction *r);
-static void pprint_minmax_c(struct cloogoptions *info,
-			FILE *dst, struct clast_reduction *r);
-static void pprint_reduction(struct cloogoptions *i,
-			FILE *dst, struct clast_reduction *r);
-static void pprint_expr(struct cloogoptions *i, FILE *dst, struct clast_expr *e);
-static void pprint_equation(struct cloogoptions *i,
-			FILE *dst, struct clast_equation *eq);
-static void pprint_assignment(struct cloogoptions *i, FILE *dst, 
-			struct clast_assignment *a);
-static void pprint_user_stmt(struct cloogoptions *options, FILE *dst,
-		       struct clast_user_stmt *u);
-static void pprint_guard(struct cloogoptions *options, FILE *dst, int indent,
-		   struct clast_guard *g);
-static void pprint_for(struct cloogoptions *options, FILE *dst, int indent,
-		 struct clast_for *f);
-static void pprint_stmt_list(struct cloogoptions *options, FILE *dst, int indent,
-		       struct clast_stmt *s);
-
-
-void pprint_name(FILE *dst, struct clast_name *n)
-{
-    fprintf(dst, "%s", n->name);
-}
-
-/**
- * This function returns a string containing the printing of a value (possibly
- * an iterator or a parameter with its coefficient or a constant).
- * - val is the coefficient or constant value,
- * - name is a string containing the name of the iterator or of the parameter,
- */
-void pprint_term(struct cloogoptions *i, FILE *dst, struct clast_term *t)
-{
-    if (t->var) {
-	int group = t->var->type == clast_expr_red &&
-		    ((struct clast_reduction*) t->var)->n > 1;
-	if (cloog_int_is_one(t->val))
-	    ;
-	else if (cloog_int_is_neg_one(t->val))
-	    fprintf(dst, "-");
-        else {
-	    cloog_int_print(dst, t->val);
-	    fprintf(dst, "*");
-	}
-	if (group)
-	    fprintf(dst, "(");
-	pprint_expr(i, dst, t->var);
-	if (group)
-	    fprintf(dst, ")");
-    } else
-	cloog_int_print(dst, t->val);
-}
-
-void pprint_sum(struct cloogoptions *opt, FILE *dst, struct clast_reduction *r)
-{
-    int i;
-    struct clast_term *t;
-
-    assert(r->n >= 1);
-    assert(r->elts[0]->type == clast_expr_term);
-    t = (struct clast_term *) r->elts[0];
-    pprint_term(opt, dst, t);
-
-    for (i = 1; i < r->n; ++i) {
-	assert(r->elts[i]->type == clast_expr_term);
-	t = (struct clast_term *) r->elts[i];
-	if (cloog_int_is_pos(t->val))
-	    fprintf(dst, "+");
-	pprint_term(opt, dst, t);
-    }
-}
-
-void pprint_binary(struct cloogoptions *i, FILE *dst, struct clast_binary *b)
-{
-    const char *s1 = NULL, *s2 = NULL, *s3 = NULL;
-    int group = b->LHS->type == clast_expr_red &&
-		((struct clast_reduction*) b->LHS)->n > 1;
-    if (i->language == LANGUAGE_FORTRAN) {
-	switch (b->type) {
-	case clast_bin_fdiv:
-	    s1 = "FLOOR(REAL(", s2 = ")/REAL(", s3 = "))";
-	    break;
-	case clast_bin_cdiv:
-	    s1 = "CEILING(REAL(", s2 = ")/REAL(", s3 = "))";
-	    break;
-	case clast_bin_div:
-	    if (group)
-		s1 = "(", s2 = ")/", s3 = "";
-	    else
-		s1 = "", s2 = "/", s3 = "";
-	    break;
-	case clast_bin_mod:
-	    s1 = "MOD(", s2 = ", ", s3 = ")";
-	    break;
-	}
-    } else {
-	switch (b->type) {
-	case clast_bin_fdiv:
-	    s1 = "floord(", s2 = ",", s3 = ")";
-	    break;
-	case clast_bin_cdiv:
-	    s1 = "ceild(", s2 = ",", s3 = ")";
-	    break;
-	case clast_bin_div:
-	    if (group)
-		s1 = "(", s2 = ")/", s3 = "";
-	    else
-		s1 = "", s2 = "/", s3 = "";
-	    break;
-	case clast_bin_mod:
-	    if (group)
-		s1 = "(", s2 = ")%", s3 = "";
-	    else
-		s1 = "", s2 = "%", s3 = "";
-	    break;
-	}
-    }
-    fprintf(dst, "%s", s1);
-    pprint_expr(i, dst, b->LHS);
-    fprintf(dst, "%s", s2);
-    cloog_int_print(dst, b->RHS);
-    fprintf(dst, "%s", s3);
-}
-
-void pprint_minmax_f(struct cloogoptions *info, FILE *dst, struct clast_reduction *r)
-{
-    int i;
-    if (r->n == 0)
-	return;
-    fprintf(dst, r->type == clast_red_max ? "MAX(" : "MIN(");
-    pprint_expr(info, dst, r->elts[0]);
-    for (i = 1; i < r->n; ++i) {
-	fprintf(dst, ",");
-	pprint_expr(info, dst, r->elts[i]);
-    }
-    fprintf(dst, ")");
-}
-
-void pprint_minmax_c(struct cloogoptions *info, FILE *dst, struct clast_reduction *r)
-{
-    int i;
-    for (i = 1; i < r->n; ++i)
-	fprintf(dst, r->type == clast_red_max ? "max(" : "min(");
-    if (r->n > 0)
-	pprint_expr(info, dst, r->elts[0]);
-    for (i = 1; i < r->n; ++i) {
-	fprintf(dst, ",");
-	pprint_expr(info, dst, r->elts[i]);
-	fprintf(dst, ")");
-    }
-}
-
-void pprint_reduction(struct cloogoptions *i, FILE *dst, struct clast_reduction *r)
-{
-    switch (r->type) {
-    case clast_red_sum:
-	pprint_sum(i, dst, r);
-	break;
-    case clast_red_min:
-    case clast_red_max:
-	if (r->n == 1) {
-	    pprint_expr(i, dst, r->elts[0]);
-	    break;
-	}
-	if (i->language == LANGUAGE_FORTRAN)
-	    pprint_minmax_f(i, dst, r);
-	else
-	    pprint_minmax_c(i, dst, r);
-	break;
-    default:
-	assert(0);
-    }
-}
-
-void pprint_expr(struct cloogoptions *i, FILE *dst, struct clast_expr *e)
-{
-    if (!e)
-	return;
-    switch (e->type) {
-    case clast_expr_name:
-	pprint_name(dst, (struct clast_name*) e);
-	break;
-    case clast_expr_term:
-	pprint_term(i, dst, (struct clast_term*) e);
-	break;
-    case clast_expr_red:
-	pprint_reduction(i, dst, (struct clast_reduction*) e);
-	break;
-    case clast_expr_bin:
-	pprint_binary(i, dst, (struct clast_binary*) e);
-	break;
-    default:
-	assert(0);
-    }
-}
-
-void pprint_equation(struct cloogoptions *i, FILE *dst, struct clast_equation *eq)
-{
-    pprint_expr(i, dst, eq->LHS);
-    if (eq->sign == 0)
-	fprintf(dst, " == ");
-    else if (eq->sign > 0)
-	fprintf(dst, " >= ");
-    else
-	fprintf(dst, " <= ");
-    pprint_expr(i, dst, eq->RHS);
-}
-
-void pprint_assignment(struct cloogoptions *i, FILE *dst, 
-			struct clast_assignment *a)
-{
-    if (a->LHS)
-	fprintf(dst, "%s = ", a->LHS);
-    pprint_expr(i, dst, a->RHS);
-}
-
-void pprint_user_stmt(struct cloogoptions *options, FILE *dst,
-		       struct clast_user_stmt *u)
-{
-    struct clast_stmt *t;
-    if (u->statement->name)
-	fprintf(dst, "%s", u->statement->name);
-    else
-	fprintf(dst, "S%d", u->statement->number);
-    fprintf(dst, "(");
-    for (t = u->substitutions; t; t = t->next) {
-	assert(CLAST_STMT_IS_A(t, stmt_ass));
-	pprint_assignment(options, dst, (struct clast_assignment *)t);
-	if (t->next)
-	    fprintf(dst, ",");
-    }
-    fprintf(dst, ")");
-    if (options->language != LANGUAGE_FORTRAN)
-	fprintf(dst, ";");
-    fprintf(dst, "\n");
-}
-
-void pprint_guard(struct cloogoptions *options, FILE *dst, int indent,
-		   struct clast_guard *g)
-{
-    int k;
-    if (options->language == LANGUAGE_FORTRAN)
-	fprintf(dst,"IF ");
-    else
-	fprintf(dst,"if ");
-    if (g->n > 1)
-	fprintf(dst,"(");
-    for (k = 0; k < g->n; ++k) {
-	if (k > 0) {
-	    if (options->language == LANGUAGE_FORTRAN)
-		fprintf(dst," .AND. ");
-	    else
-		fprintf(dst," && ");
-	}
-	fprintf(dst,"(");
-        pprint_equation(options, dst, &g->eq[k]);
-	fprintf(dst,")");
-    }
-    if (g->n > 1)
-	fprintf(dst,")");
-    if (options->language == LANGUAGE_FORTRAN)
-	fprintf(dst," THEN\n");
-    else
-	fprintf(dst," {\n");
-
-    pprint_stmt_list(options, dst, indent + INDENT_STEP, g->then);
-
-    fprintf(dst, "%*s", indent, "");
-    if (options->language == LANGUAGE_FORTRAN)
-	fprintf(dst,"END IF\n"); 
-    else
-	fprintf(dst,"}\n"); 
-}
-
-void pprint_for(struct cloogoptions *options, FILE *dst, int indent,
-		 struct clast_for *f)
-{
-    if (options->language == LANGUAGE_FORTRAN)
-	fprintf(dst, "DO ");
-    else
-	fprintf(dst, "for (");
-
-    if (f->LB) {
-	fprintf(dst, "%s=", f->iterator);
-	pprint_expr(options, dst, f->LB);
-    } else if (options->language == LANGUAGE_FORTRAN)
-	cloog_die("unbounded loops not allowed in FORTRAN.\n");
-
-    if (options->language == LANGUAGE_FORTRAN)
-	fprintf(dst,", ");
-    else
-	fprintf(dst,";");
-
-    if (f->UB) { 
-	if (options->language != LANGUAGE_FORTRAN)
-	    fprintf(dst,"%s<=", f->iterator);
-	pprint_expr(options, dst, f->UB);
-    } else if (options->language == LANGUAGE_FORTRAN)
-	cloog_die("unbounded loops not allowed in FORTRAN.\n");
-
-    if (options->language == LANGUAGE_FORTRAN) {
-	if (cloog_int_gt_si(f->stride, 1))
-	    cloog_int_print(dst, f->stride);
-	fprintf(dst,"\n");
-    }
-    else {
-	if (cloog_int_gt_si(f->stride, 1)) {
-	    fprintf(dst,";%s+=", f->iterator);
-	    cloog_int_print(dst, f->stride);
-	    fprintf(dst, ") {\n");
-      } else
-	fprintf(dst, ";%s++) {\n", f->iterator);
-    }
-
-    pprint_stmt_list(options, dst, indent + INDENT_STEP, f->body);
-
-    fprintf(dst, "%*s", indent, "");
-    if (options->language == LANGUAGE_FORTRAN)
-	fprintf(dst,"END DO\n") ; 
-    else
-	fprintf(dst,"}\n") ; 
-}
-
-void pprint_stmt_list(struct cloogoptions *options, FILE *dst, int indent,
-		       struct clast_stmt *s)
-{
-    for ( ; s; s = s->next) {
-	if (CLAST_STMT_IS_A(s, stmt_root))
-	    continue;
-	fprintf(dst, "%*s", indent, "");
-	if (CLAST_STMT_IS_A(s, stmt_ass)) {
-	    pprint_assignment(options, dst, (struct clast_assignment *) s);
-	    if (options->language != LANGUAGE_FORTRAN)
-		fprintf(dst, ";");
-	    fprintf(dst, "\n");
-	} else if (CLAST_STMT_IS_A(s, stmt_user)) {
-	    pprint_user_stmt(options, dst, (struct clast_user_stmt *) s);
-	} else if (CLAST_STMT_IS_A(s, stmt_for)) {
-	    pprint_for(options, dst, indent, (struct clast_for *) s);
-	} else if (CLAST_STMT_IS_A(s, stmt_guard)) {
-	    pprint_guard(options, dst, indent, (struct clast_guard *) s);
-	} else if (CLAST_STMT_IS_A(s, stmt_block)) {
-	    fprintf(dst, "{\n");
-	    pprint_stmt_list(options, dst, indent + INDENT_STEP, 
-				((struct clast_block *)s)->body);
-	    fprintf(dst, "%*s", indent, "");
-	    fprintf(dst, "}\n");
-	} else {
-	    assert(0);
-	}
-    }
-}
-
-
-/******************************************************************************
- *                       Pretty Printing (dirty) functions                    *
- ******************************************************************************/
-
-void clast_pprint(FILE *foo, struct clast_stmt *root,
-		  int indent, CloogOptions *options)
-{
-    pprint_stmt_list(options, foo, indent, root);
-}
diff --git a/cloog-0.16.3/source/program.c b/cloog-0.16.3/source/program.c
deleted file mode 100644
index e5aa4fc..0000000
--- a/cloog-0.16.3/source/program.c
+++ /dev/null
@@ -1,1077 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                            program.c                              **
-    **-------------------------------------------------------------------**
-    **                 First version: october 25th 2001                  **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-/* CAUTION: the english used for comments is probably the worst you ever read,
- *          please feel free to correct and improve it !
- */
-
-
-# include <sys/types.h>
-# include <sys/time.h>
-#include <stdarg.h>
-# include <stdlib.h>
-# include <stdio.h>
-# include <string.h>
-# include <ctype.h>
-# include <unistd.h>
-# include "../include/cloog/cloog.h"
-#ifdef CLOOG_RUSAGE
-# include <sys/resource.h>
-#endif
-
-#define ALLOC(type) (type*)malloc(sizeof(type))
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-
-
-/**
- * cloog_program_print function:
- * this function is a human-friendly way to display the CloogProgram data
- * structure, it shows all the different fields and includes an indentation
- * level (level) in order to work with others print_structure functions.
- * - July 1st 2005: first version based on the old cloog_program_print function.
- */
-void cloog_program_print_structure(file, program, level)
-FILE * file ; 
-CloogProgram * program ;
-int level ;
-{ int i, j ;
-
-  /* Go to the right level. */
-  for (i=0; i<level; i++)
-  fprintf(file,"|\t") ;
-  
-  fprintf(file,"+-- CloogProgram\n") ;
-  
-  /* A blank line. */
-  for (i=0; i<=level+1; i++)
-  fprintf(file,"|\t") ;
-  fprintf(file,"\n") ;
-  
-  /* Print the language. */
-  for (i=0; i<=level; i++)
-  fprintf(file,"|\t") ;
-  fprintf(file, "Language: %c\n",program->language) ;
-  
-  /* A blank line. */
-  for (i=0; i<=level+1; i++)
-  fprintf(file,"|\t") ;
-  fprintf(file,"\n") ;
-
-  /* Print the scattering dimension number. */
-  for (i=0; i<=level; i++)
-  fprintf(file,"|\t") ;
-  fprintf(file,"Scattering dimension number: %d\n",program->nb_scattdims) ;
-  
-  /* A blank line. */
-  for (i=0; i<=level+1; i++)
-  fprintf(file,"|\t") ;
-  fprintf(file,"\n") ;
-  
-  /* Print the scalar scattering dimension informations. */
-  for (i=0; i<=level; i++)
-  fprintf(file,"|\t") ;
-  if (program->scaldims != NULL)
-  { fprintf(file,"Scalar dimensions:") ;
-    for (i=0;i<program->nb_scattdims;i++)
-    fprintf(file," %d:%d ",i,program->scaldims[i]) ;
-    fprintf(file,"\n") ;
-  }
-  else
-  fprintf(file,"No scalar scattering dimensions\n") ;
-  
-  /* A blank line. */
-  for (i=0; i<=level+1; i++)
-  fprintf(file,"|\t") ;
-  fprintf(file,"\n") ;
-
-  /* Print the parameter and the iterator names. */
-  cloog_names_print_structure(file,program->names,level+1) ;
- 
-  /* A blank line. */
-  for (i=0; i<=level+1; i++)
-  fprintf(file,"|\t") ;
-  fprintf(file,"\n") ;
-  
-  /* Print the context. */
-  cloog_domain_print_structure(file, program->context, level+1, "Context");
-    
-  /* Print the loop. */
-  cloog_loop_print_structure(file,program->loop,level+1) ;
-
-  /* One more time something that is here only for a better look. */
-  for (j=0; j<2; j++)
-  { for (i=0; i<=level; i++)
-    fprintf(file,"|\t") ;
-      
-    fprintf(file,"\n") ;
-  }
-}
-
-
-/**
- * cloog_program_dump_cloog function:
- * This function dumps a CloogProgram structure supposed to be completely
- * filled in a CLooG input file (foo possibly stdout) such as CLooG can
- * rebuild almost exactly the data structure from the input file.
- *
- * If the scattering is already applied, the scattering parameter is supposed to
- * be NULL. In this case the number of scattering functions is lost, since they
- * are included inside the iteration domains. This can only lead to a less
- * beautiful pretty printing.
- *
- * In case the scattering is not yet applied it can be passed to this function
- * and will be included in the CLooG input file dump.
- */
-void cloog_program_dump_cloog(FILE * foo, CloogProgram * program,
-                              CloogScatteringList *scattering)
-{
-  int i;
-  CloogLoop * loop ;
-  CloogScatteringList *tmp_scatt;
-
-  fprintf(foo,
-  "# CLooG -> CLooG\n"
-  "# This is an automatic dump of a CLooG input file from a CloogProgram data\n"
-  "# structure. WARNING: it is highly dangerous and MAY be correct ONLY if\n"
-  "# - it has been dumped before loop generation.\n"
-  "# - option -noscalars is used (it removes scalar dimensions otherwise)\n"
-  "# - option -l is at least the original scattering dimension number\n"
-  "# ASK THE AUTHOR IF YOU *NEED* SOMETHING MORE ROBUST\n") ;
-
-  /* Language. */
-  if (program->language == 'c')
-  fprintf(foo,"# Language: C\n") ;
-  else
-  fprintf(foo,"# Language: FORTRAN\n") ;
-  fprintf(foo,"%c\n\n",program->language) ;
-
-  /* Context. */
-  fprintf(foo, "# Context (%d parameter(s)):\n", program->names->nb_parameters);
-  cloog_domain_print_constraints(foo, program->context, 0);
-  fprintf(foo,"1 # Parameter name(s)\n") ;
-  for (i=0;i<program->names->nb_parameters;i++)
-  fprintf(foo,"%s ",program->names->parameters[i]) ;
-
-  /* Statement number. */
-  i = 0 ;
-  loop = program->loop ;
-  while (loop != NULL)
-  { i++ ;
-    loop = loop->next ;
-  }
-  fprintf(foo,"\n\n# Statement number:\n%d\n\n",i) ;
-
-  /* Iteration domains. */
-  i = 1 ;
-  loop = program->loop ;
-  while (loop != NULL)
-  { /* Name of the domain. */
-    fprintf(foo,"# Iteration domain of statement %d.\n",i) ;
-
-    cloog_domain_print_constraints(foo, loop->domain, 1);
-    fprintf(foo,"0 0 0 # For future options.\n\n") ;
-    
-    i++ ;
-    loop = loop->next ;
-  }
-  fprintf(foo,"\n1 # Iterator name(s)\n") ;
-
-  /* Scattering already applied? In this case print the scattering names as
-   * additional iterator names. */
-  if (!scattering)
-    for (i = 0; i < program->names->nb_scattering; i++)
-      fprintf(foo, "%s ", program->names->scattering[i]);
-  for (i=0;i<program->names->nb_iterators;i++)
-    fprintf(foo,"%s ",program->names->iterators[i]);
-  fprintf(foo,"\n\n") ;
-
-  /* Exit, if scattering is already applied. */
-  if (!scattering) {
-    fprintf(foo, "# No scattering functions.\n0\n\n");
-    return;
-  }
-
-  /* Scattering relations. */
-  fprintf(foo, "# --------------------- SCATTERING --------------------\n");
-
-  i = 0;
-  for (tmp_scatt = scattering; tmp_scatt; tmp_scatt = tmp_scatt->next)
-    i++;
-
-  fprintf(foo, "%d # Scattering functions", i);
-
-  for (tmp_scatt = scattering; tmp_scatt; tmp_scatt = tmp_scatt->next)
-    cloog_scattering_print_constraints(foo, tmp_scatt->scatt);
-
-  fprintf(foo, "\n1 # Scattering dimension name(s)\n");
-
-  for (i = 0; i < program->names->nb_scattering; i++)
-    fprintf(foo, "%s ", program->names->scattering[i]);
-}
-
-
-/**
- * cloog_program_print function:
- * This function prints the content of a CloogProgram structure (program) into a
- * file (file, possibly stdout).
- * - July 1st 2005: Now this very old function (probably as old as CLooG) is
- *                  only a frontend to cloog_program_print_structure, with a
- *                  quite better human-readable representation.
- */
-void cloog_program_print(FILE * file, CloogProgram * program)
-{ cloog_program_print_structure(file,program,0) ;
-}
-
-
-static void print_comment(FILE *file, CloogOptions *options,
-			  const char *fmt, ...)
-{
-  va_list args;
-
-  va_start(args, fmt);
-  if (options->language == LANGUAGE_FORTRAN) {
-    fprintf(file, "! ");
-    vfprintf(file, fmt, args);
-    fprintf(file, "\n");
-  } else {
-    fprintf(file, "/* ");
-    vfprintf(file, fmt, args);
-    fprintf(file, " */\n");
-  }
-}
-
-static void print_macros(FILE *file)
-{
-    fprintf(file, "/* Useful macros. */\n") ;
-    fprintf(file,
-	"#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))\n");
-    fprintf(file,
-	"#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))\n");
-    fprintf(file, "#define max(x,y)    ((x) > (y) ? (x) : (y))\n") ; 
-    fprintf(file, "#define min(x,y)    ((x) < (y) ? (x) : (y))\n\n") ; 
-}
-
-static void print_declarations(FILE *file, int n, char **names)
-{
-    int i;
-
-    fprintf(file, "  int %s", names[0]); 
-    for (i = 1; i < n; i++)
-	fprintf(file, ", %s", names[i]); 
-
-    fprintf(file, ";\n");
-}
-
-static void print_iterator_declarations(FILE *file, CloogProgram *program,
-	CloogOptions *options)
-{
-    CloogNames *names = program->names;
-
-    if (names->nb_scattering) {
-	fprintf(file, "  /* Scattering iterators. */\n");
-	print_declarations(file, names->nb_scattering, names->scattering);
-    }
-    if (names->nb_iterators) {
-	fprintf(file, "  /* Original iterators. */\n");
-	print_declarations(file, names->nb_iterators, names->iterators);
-    }
-}
-
-static void print_callable_preamble(FILE *file, CloogProgram *program,
-	CloogOptions *options)
-{
-    int j;
-    CloogBlockList *blocklist;
-    CloogBlock *block;
-    CloogStatement *statement;
-
-    fprintf(file, "extern void hash(int);\n\n");
-
-    print_macros(file);
-
-    for (blocklist = program->blocklist; blocklist; blocklist = blocklist->next) {
-	block = blocklist->block;
-	for (statement = block->statement; statement; statement = statement->next) {
-	    fprintf(file, "#define S%d(", statement->number);
-	    if (block->depth > 0) {
-		fprintf(file, "%s", program->names->iterators[0]);
-		for(j = 1; j < block->depth; j++)
-		    fprintf(file, ",%s", program->names->iterators[j]);
-	    }
-	    fprintf(file,") { hash(%d);", statement->number);
-	    for(j = 0; j < block->depth; j++)
-		fprintf(file, " hash(%s);", program->names->iterators[j]);
-	    fprintf(file, " }\n");
-	}
-    }
-    fprintf(file, "\nvoid test("); 
-    if (program->names->nb_parameters > 0) {
-	fprintf(file, "int %s", program->names->parameters[0]);
-	for(j = 1; j < program->names->nb_parameters; j++)
-	    fprintf(file, ", int %s", program->names->parameters[j]);
-    }
-    fprintf(file, ")\n{\n"); 
-    print_iterator_declarations(file, program, options);
-}
-
-static void print_callable_postamble(FILE *file, CloogProgram *program)
-{
-    fprintf(file, "}\n"); 
-}
-
-/**
- * cloog_program_pprint function:
- * This function prints the content of a CloogProgram structure (program) into a
- * file (file, possibly stdout), in a C-like language.
- * - June 22nd 2005: Adaptation for GMP.
- */
-void cloog_program_pprint(file, program, options)
-FILE * file ;
-CloogProgram * program ;
-CloogOptions * options ;
-{ int i, j, nb_scattering, indentation=0 ;
-  CloogStatement * statement ;
-  CloogBlockList * blocklist ;
-  CloogBlock * block ;
-  struct clast_stmt *root;
-   
-  if (program->language == 'f')
-    options->language = LANGUAGE_FORTRAN ;
-  else
-    options->language = LANGUAGE_C ;
- 
-#ifdef CLOOG_RUSAGE
-  print_comment(file, options, "Generated from %s by %s in %.2fs.",
-		options->name, cloog_version(), options->time);
-#else
-  print_comment(file, options, "Generated from %s by %s.",
-		options->name, cloog_version());
-#endif
-#ifdef CLOOG_MEMORY
-  print_comment(file, options, "CLooG asked for %d KBytes.", options->memory);
-  cloog_msg(CLOOG_INFO, "%.2fs and %dKB used for code generation.\n",
-	  options->time,options->memory);
-#endif
-  
-  /* If the option "compilable" is set, we provide the whole stuff to generate
-   * a compilable code. This code just do nothing, but now the user can edit
-   * the source and set the statement macros and parameters values.
-   */
-  nb_scattering = program->nb_scattdims ;
-  if (options->compilable && (program->language == 'c'))
-  { /* The headers. */
-    fprintf(file,"/* DON'T FORGET TO USE -lm OPTION TO COMPILE. */\n\n") ;
-    fprintf(file,"/* Useful headers. */\n") ;
-    fprintf(file,"#include <stdio.h>\n") ;
-    fprintf(file,"#include <stdlib.h>\n") ;
-    fprintf(file,"#include <math.h>\n\n") ;
-
-    /* The value of parameters. */
-    fprintf(file,"/* Parameter value. */\n") ;
-    for (i = 1; i <= program->names->nb_parameters; i++)
-      fprintf(file, "#define PARVAL%d %d\n", i, options->compilable);
-    
-    /* The macros. */
-    print_macros(file);
-
-    /* The statement macros. */
-    fprintf(file,"/* Statement macros (please set). */\n") ;
-    blocklist = program->blocklist ;
-    while (blocklist != NULL)
-    { block = blocklist->block ;
-      statement = block->statement ;
-      while (statement != NULL)
-      { fprintf(file,"#define S%d(",statement->number) ;
-        if (block->depth > 0)
-        { fprintf(file,"%s",program->names->iterators[0]) ;
-          for(j=1;j<block->depth;j++)
-          fprintf(file,",%s",program->names->iterators[j]) ;
-        }
-        fprintf(file,") {total++;") ;
-	if (block->depth > 0) {
-          fprintf(file, " printf(\"S%d %%d", statement->number);
-          for(j=1;j<block->depth;j++)
-            fprintf(file, " %%d");
-          
-          fprintf(file,"\\n\",%s",program->names->iterators[0]) ;
-	  for(j=1;j<block->depth;j++)
-          fprintf(file,",%s",program->names->iterators[j]) ;
-          fprintf(file,");") ;
-        }
-        fprintf(file,"}\n") ;
-        
-	statement = statement->next ;
-      }
-      blocklist = blocklist->next ;
-    }
-    
-    /* The iterator and parameter declaration. */
-    fprintf(file,"\nint main() {\n") ; 
-    print_iterator_declarations(file, program, options);
-    if (program->names->nb_parameters > 0)
-    { fprintf(file,"  /* Parameters. */\n") ;
-      fprintf(file, "  int %s=PARVAL1",program->names->parameters[0]);
-      for(i=2;i<=program->names->nb_parameters;i++)
-        fprintf(file, ", %s=PARVAL%d", program->names->parameters[i-1], i);
-      
-      fprintf(file,";\n");
-    }
-    fprintf(file,"  int total=0;\n");
-    fprintf(file,"\n") ;
-    
-    /* And we adapt the identation. */
-    indentation += 2 ;
-  } else if (options->callable && program->language == 'c') {
-    print_callable_preamble(file, program, options);
-    indentation += 2;
-  }
-  
-  root = cloog_clast_create(program, options);
-  clast_pprint(file, root, indentation, options);
-  cloog_clast_free(root);
-  
-  /* The end of the compilable code in case of 'compilable' option. */
-  if (options->compilable && (program->language == 'c'))
-  {
-    fprintf(file, "\n  printf(\"Number of integral points: %%d.\\n\",total);");
-    fprintf(file, "\n  return 0;\n}\n");
-  } else if (options->callable && program->language == 'c')
-    print_callable_postamble(file, program);
-}
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-
-
-/**
- * cloog_program_free function:
- * This function frees the allocated memory for a CloogProgram structure.
- */
-void cloog_program_free(CloogProgram * program)
-{ cloog_names_free(program->names) ;
-  cloog_loop_free(program->loop) ;
-  cloog_domain_free(program->context) ;
-  cloog_block_list_free(program->blocklist) ;
-  if (program->scaldims != NULL)
-  free(program->scaldims) ;
-  
-  free(program) ;
-}
-
-
-/******************************************************************************
- *                               Reading function                             *
- ******************************************************************************/
-
-
-static void cloog_program_construct_block_list(CloogProgram *p)
-{
-    CloogLoop *loop;
-    CloogBlockList **next = &p->blocklist;
-
-    for (loop = p->loop; loop; loop = loop->next) {
-	*next = cloog_block_list_alloc(loop->block);
-	next = &(*next)->next;
-    }
-}
-
-
-/**
- * Construct a CloogProgram structure from a given context and
- * union domain representing the iteration domains and scattering functions.
- */
-CloogProgram *cloog_program_alloc(CloogDomain *context, CloogUnionDomain *ud,
-	CloogOptions *options)
-{
-  int i;
-  char prefix[] = "c";
-  CloogScatteringList * scatteringl;
-  CloogNames *n;
-  CloogProgram * p ;
-      
-  /* Memory allocation for the CloogProgram structure. */
-  p = cloog_program_malloc() ;
-  
-  if (options->language == LANGUAGE_FORTRAN)
-    p->language = 'f';
-  else
-    p->language = 'c';
-    
-  p->names = n = cloog_names_alloc();
-
-  /* We then read the context data. */
-  p->context = context;
-  n->nb_parameters = ud->n_name[CLOOG_PARAM];
-  
-  /* First part of the CloogNames structure: the parameter names. */
-  if (ud->name[CLOOG_PARAM]) {
-    n->parameters = ud->name[CLOOG_PARAM];
-    ud->name[CLOOG_PARAM] = NULL;
-  } else
-    n->parameters = cloog_names_generate_items(n->nb_parameters, NULL,
-					       FIRST_PARAMETER);
-
-  n->nb_iterators = ud->n_name[CLOOG_ITER];
-  if (ud->name[CLOOG_ITER]) {
-    n->iterators = ud->name[CLOOG_ITER];
-    ud->name[CLOOG_ITER] = NULL;
-  } else
-    n->iterators = cloog_names_generate_items(n->nb_iterators, NULL,
-					      FIRST_ITERATOR);
-
-  if (ud->domain) {
-    CloogNamedDomainList *l;
-    CloogLoop **next = &p->loop;
-    CloogScatteringList **next_scat = &scatteringl;
-
-    scatteringl = NULL;
-    for (i = 0, l = ud->domain; l; ++i, l = l->next) {
-      *next = cloog_loop_from_domain(options->state, l->domain, i);
-      l->domain = NULL;
-      (*next)->block->statement->name = l->name;
-      (*next)->block->statement->usr = l->usr;
-      l->name = NULL;
-
-      if (l->scattering) {
-	*next_scat = ALLOC(CloogScatteringList);
-	(*next_scat)->scatt = l->scattering;
-	l->scattering = NULL;
-	(*next_scat)->next = NULL;
-
-	next_scat = &(*next_scat)->next;
-      }
-
-      next = &(*next)->next;
-    }
-
-    if (scatteringl != NULL) {
-      p->nb_scattdims = cloog_scattering_dimension(scatteringl->scatt,
-							    p->loop->domain);
-      n->nb_scattering = p->nb_scattdims;
-      if (ud->name[CLOOG_SCAT]) {
-	n->scattering = ud->name[CLOOG_SCAT];
-	ud->name[CLOOG_SCAT] = NULL;
-      } else
-	n->scattering = cloog_names_generate_items(n->nb_scattering, prefix, -1);
-    
-      /* The boolean array for scalar dimensions is created and set to 0. */
-      p->scaldims = (int *)malloc(p->nb_scattdims*(sizeof(int))) ;
-      if (p->scaldims == NULL) 
-	cloog_die("memory overflow.\n");
-      for (i=0;i<p->nb_scattdims;i++)
-      p->scaldims[i] = 0 ;
-      
-      /* We try to find blocks in the input problem to reduce complexity. */
-      if (!options->noblocks)
-	cloog_program_block(p, scatteringl, options);
-      if (!options->noscalars)
-	cloog_program_extract_scalars(p, scatteringl, options);
-      
-      cloog_program_scatter(p, scatteringl, options);
-      cloog_scattering_list_free(scatteringl);
-
-      if (!options->noblocks)
-	p->loop = cloog_loop_block(p->loop, p->scaldims, p->nb_scattdims);
-    }
-    else
-    { p->nb_scattdims = 0 ;
-      p->scaldims  = NULL ;
-    }
-  
-    cloog_names_scalarize(p->names,p->nb_scattdims,p->scaldims) ;
-
-    cloog_program_construct_block_list(p);
-  }
-  else
-  { p->loop      = NULL ;
-    p->blocklist = NULL ;
-    p->scaldims  = NULL ;
-  }
-
-  cloog_union_domain_free(ud);
-   
-  return(p) ;
-}
-
-
-/**
- * cloog_program_read function:
- * This function read the informations to put in a CloogProgram structure from
- * a file (file, possibly stdin). It returns a pointer to a CloogProgram
- * structure containing the read informations.
- * - October 25th 2001: first version.
- * - September 9th 2002: - the big reading function is now split in several
- *                         functions (one per read data structure).
- *                       - adaptation to the new file format with naming.
- */
-CloogProgram *cloog_program_read(FILE *file, CloogOptions *options)
-{
-  CloogInput *input;
-  CloogProgram *p;
-
-  input = cloog_input_read(file, options);
-  p = cloog_program_alloc(input->context, input->ud, options);
-  free(input);
-
-  return p;
-}
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
- 
- 
-/**
- * cloog_program_malloc function:
- * This function allocates the memory space for a CloogProgram structure and
- * sets its fields with default values. Then it returns a pointer to the
- * allocated space.
- * - November 21th 2005: first version.
- */
-CloogProgram * cloog_program_malloc()
-{ CloogProgram * program ;
-  
-  /* Memory allocation for the CloogProgram structure. */
-  program = (CloogProgram *)malloc(sizeof(CloogProgram)) ;
-  if (program == NULL) 
-    cloog_die("memory overflow.\n");
-  
-  /* We set the various fields with default values. */
-  program->language     = 'c' ;
-  program->nb_scattdims = 0 ;
-  program->context      = NULL ;
-  program->loop         = NULL ;
-  program->names        = NULL ;
-  program->blocklist    = NULL ;
-  program->scaldims     = NULL ;
-  program->usr          = NULL;
-  
-  return program ;
-}  
-
-
-/**
- * cloog_program_generate function:
- * This function calls the Quillere algorithm for loop scanning. (see the
- * Quillere paper) and calls the loop simplification function.
- * - depth is the loop depth we want to optimize (guard free as possible),
- *   the first loop depth is 1 and anegative value is the infinity depth.
- * - sep_level is the level number where we want to start loop separation.
- **
- * - October 26th 2001: first version. 
- * - April   19th 2005: some basic fixes and memory usage feature.
- * - April   29th 2005: (bug fix, bug found by DaeGon Kim) see case 2 below.
- */ 
-CloogProgram * cloog_program_generate(program, options)
-CloogProgram * program ;
-CloogOptions * options ;
-{
-#ifdef CLOOG_RUSAGE
-  float time;
-  struct rusage start, end ;
-#endif
-  CloogLoop * loop ;
-#ifdef CLOOG_MEMORY
-  char status_path[MAX_STRING_VAL] ;
-  FILE * status ;
- 
-  /* We initialize the memory need to 0. */
-  options->memory = 0 ;
-#endif
-
-  if (options->override)
-  {
-    cloog_msg(options, CLOOG_WARNING,
-    "you are using -override option, be aware that the "
-    "generated\n                code may be incorrect.\n") ;
-  }
-  else
-  { /* Playing with options may be dangerous, here are two possible issues :
-     * 1. Using -l option less than scattering dimension number may lead to
-     *    an illegal target code (since the scattering is not respected), if
-     *    it is the case, we set -l depth to the first acceptable value.
-     */
-    if ((program->nb_scattdims > options->l) && (options->l >= 0))
-    {
-      cloog_msg(options, CLOOG_WARNING,
-      "-l depth is less than the scattering dimension number "
-      "(the \n                generated code may be incorrect), it has been "
-      "automaticaly set\n                to this value (use option -override "
-      "to override).\n") ;
-      options->l = program->nb_scattdims ;
-    }
-      
-    /* 2. Using -f option greater than one while -l depth is greater than the
-     *    scattering dimension number may lead to iteration duplication (try
-     *    test/daegon_lu_osp.cloog with '-f 3' to test) because of the step 4b
-     *    of the cloog_loop_generate function, if it is the case, we set -l to
-     *    the first acceptable value.
-     */
-    if (((options->f > 1) || (options->f < 0)) &&
-        ((options->l > program->nb_scattdims) || (options->l < 0)))
-    {
-      cloog_msg(options, CLOOG_WARNING,
-      "-f depth is more than one, -l depth has been "
-      "automaticaly set\n                to the scattering dimension number "
-      "(target code may have\n                duplicated iterations), -l depth "
-      "has been automaticaly set to\n                this value (use option "
-      "-override to override).\n") ;
-      options->l = program->nb_scattdims ;
-    }
-  }
-  
-#ifdef CLOOG_RUSAGE
-  getrusage(RUSAGE_SELF, &start) ;
-#endif
-  if (program->loop != NULL)
-  { loop = program->loop ;
-    
-    /* Here we go ! */
-    loop = cloog_loop_generate(loop, program->context, 0, 0,
-                               program->scaldims,
-			       program->nb_scattdims,
-			       options);
-			          
-#ifdef CLOOG_MEMORY
-    /* We read into the status file of the process how many memory it uses. */
-    sprintf(status_path,"/proc/%d/status",getpid()) ;
-    status = fopen(status_path, "r") ;
-    while (fscanf(status,"%s",status_path) && strcmp(status_path,"VmData:")!=0);
-    fscanf(status,"%d",&(options->memory)) ;
-    fclose(status) ;
-#endif
-    
-    if ((!options->nosimplify) && (program->loop != NULL))
-      loop = cloog_loop_simplify(loop, program->context, 0,
-                                 program->nb_scattdims, options);
-   
-    program->loop = loop ;
-  }
-    
-#ifdef CLOOG_RUSAGE
-  getrusage(RUSAGE_SELF, &end) ;
-  /* We calculate the time spent in code generation. */
-  time =  (end.ru_utime.tv_usec -  start.ru_utime.tv_usec)/(float)(MEGA) ;
-  time += (float)(end.ru_utime.tv_sec - start.ru_utime.tv_sec) ;
-  options->time = time ;
-#endif
-  
-  return program ;
-}
-
-
-/**
- * cloog_program_block function:
- * this function gives a last chance to the lazy user to consider statement
- * blocks instead of some statement lists where the whole list may be
- * considered as a single statement from a code generation point of view.
- * For instance two statements with the same iteration domain and the same
- * scattering functions may be considered as a block. This function is lazy
- * and can only find very simple forms of trivial blocks (see
- * cloog_domain_lazy_block function for more details). The useless loops and
- * scattering functions are removed and freed while the statement list of
- * according blocks are filled.
- * - program is the whole program structure (befaore applying scattering),
- * - scattering is the list of scattering functions.
- **
- * - April   30th 2005: first attempt.
- * - June 10-11th 2005: first working version.
- */
-void cloog_program_block(CloogProgram *program,
-	CloogScatteringList *scattering, CloogOptions *options)
-{ int blocked_reference=0, blocked=0, nb_blocked=0 ;
-  CloogLoop * reference, * start, * loop ;
-  CloogScatteringList * scatt_reference, * scatt_loop, * scatt_start;
-  
-  if ((program->loop == NULL) || (program->loop->next == NULL))
-  return ;
-  
-  /* The process will use three variables for the linked list :
-   * - 'start' is the starting point of a new block,
-   * - 'reference' is the node of the block used for the block checking,
-   * - 'loop' is the candidate to be inserted inside the block.
-   * At the beginning of the process, the linked lists are as follow:
-   *         O------>O------>O------>O------>NULL
-   *         |       |
-   *       start    loop
-   *     reference
-   */
-
-  reference       = program->loop ;
-  start           = program->loop ;
-  loop            = reference->next ;
-  scatt_reference = scattering ;
-  scatt_start     = scattering ;
-  scatt_loop      = scattering->next ;
-   
-  while (loop != NULL)
-  { if (cloog_domain_lazy_equal(reference->domain,loop->domain) &&
-        cloog_scattering_lazy_block(scatt_reference->scatt, scatt_loop->scatt,
-	                        scattering,program->nb_scattdims))
-    { /* If we find a block we update the links:
-       *     +---------------+
-       *     |               v
-       *     O       O------>O------>O------>NULL
-       *     |       |
-       *   start    loop
-       * reference
-       */
-      blocked = 1 ;
-      nb_blocked ++ ;
-      cloog_block_merge(start->block,loop->block); /* merge frees loop->block */
-      loop->block = NULL ;
-      start->next = loop->next ;
-      scatt_start->next = scatt_loop->next ;
-    }
-    else
-    { /* If we didn't find a block, the next start of a block is updated:
-       *     O------>O------>O------>O------>NULL
-       *     |       |
-       * reference start
-       *           loop
-       */
-      blocked= 0 ;
-      start = loop ;
-      scatt_start = scatt_loop ;
-    }
-
-    /* If the reference node has been included into a block, we can free it. */
-    if (blocked_reference)
-    { reference->next = NULL ;
-      cloog_loop_free(reference) ;
-      cloog_scattering_free(scatt_reference->scatt);
-      free(scatt_reference) ;
-    }
-    
-    /* The reference and the loop are now updated for the next try, the
-     * starting position depends on the previous step.
-     *       O   ?   O------>O------>O------>NULL
-     *               |       |
-     *           reference loop
-     */
-    reference       = loop ;
-    loop            = loop->next ;
-    scatt_reference = scatt_loop ;
-    scatt_loop      = scatt_loop->next ;
-    
-    /* We mark the new reference as being blocked or not, if will be freed
-     * during the next while loop execution.
-     */
-    if (blocked)
-    blocked_reference = 1 ;
-    else
-    blocked_reference = 0 ;
-  }
-  
-  /* We free the last blocked reference if any (since in the while loop it was
-   * freed during the next loop execution, it was not possible to free the
-   * last one inside).
-   */
-  if (blocked_reference)
-  { reference->next = NULL ;
-    cloog_loop_free(reference) ;
-    cloog_scattering_free(scatt_reference->scatt);
-    free(scatt_reference) ;
-  }
-  
-  if (nb_blocked != 0)
-    cloog_msg(options, CLOOG_INFO, "%d domains have been blocked.\n", nb_blocked);
-}
-
-
-/**
- * cloog_program_extract_scalars function:
- * this functions finds and removes the dimensions of the scattering functions
- * when they are scalar (i.e. of the shape "dim + scalar = 0") for all
- * scattering functions. The reason is that the processing of such dimensions
- * is trivial and do not need neither a row and a column in the matrix
- * representation of the domain (this will save memory) neither the full
- * Quillere processing (this will save time). The scalar dimensions data are
- * dispatched in the CloogProgram structure (the boolean vector scaldims will
- * say which original dimensions are scalar or not) and to the CloogBlock
- * structures (each one has a scaldims vector that contains the scalar values).
- * - June 14th 2005: first developments.
- * - June 30th 2005: first version.
- */ 
-void cloog_program_extract_scalars(CloogProgram *program,
-	CloogScatteringList *scattering, CloogOptions *options)
-{ int i, j, scalar, current, nb_scaldims=0 ;
-  CloogScatteringList *start;
-  CloogScattering *old;
-  CloogLoop *loop;
-  CloogBlock * block ;
-
-  start = scattering ;
-    
-  for (i=0;i<program->nb_scattdims;i++)
-  { scalar = 1 ;
-    scattering = start ;
-    while (scattering != NULL)
-    { if (!cloog_scattering_lazy_isscalar(scattering->scatt, i, NULL))
-      { scalar = 0 ;
-        break ;
-      }
-      scattering = scattering->next ;
-    }
-    
-    if (scalar)
-    { nb_scaldims ++ ;
-      program->scaldims[i] = 1 ;
-    }
-  }
-  
-  /* If there are no scalar dimensions, we can continue directly. */
-  if (!nb_scaldims)
-  return ;
-
-  /* Otherwise, in each block, we have to put the number of scalar dimensions,
-   * and to allocate the memory for the scalar values.
-   */
-  for (loop = program->loop; loop; loop = loop->next) {
-    block = loop->block;
-    block->nb_scaldims = nb_scaldims ;
-    block->scaldims = (cloog_int_t *)malloc(nb_scaldims*sizeof(cloog_int_t));
-    for (i=0;i<nb_scaldims;i++)
-    cloog_int_init(block->scaldims[i]);
-  }
-  
-  /* Then we have to fill these scalar values, so we can erase those dimensions
-   * from the scattering functions. It's easier to begin with the last one,
-   * since there would be an offset otherwise (if we remove the i^th dimension,
-   * then the next one is not the (i+1)^th but still the i^th...).
-   */
-  current = nb_scaldims - 1 ;
-  for (i=program->nb_scattdims-1;i>=0;i--)
-  if (program->scaldims[i])
-  {
-    scattering = start ;
-    for (loop = program->loop; loop; loop = loop->next) {
-      block = loop->block;
-      if (!cloog_scattering_lazy_isscalar(scattering->scatt, i,
-						&block->scaldims[current])) {
-	/* We should have found a scalar value: if not, there is an error. */
-	cloog_die("dimension %d is not scalar as expected.\n", i);
-      }
-      scattering = scattering->next ;
-    } 
-  
-    scattering = start ;
-    while (scattering != NULL) {
-      old = scattering->scatt;
-      scattering->scatt = cloog_scattering_erase_dimension(old, i);
-      cloog_scattering_free(old);
-      scattering = scattering->next ;
-    }
-    current-- ;
-  }
-  
-  /* We postprocess the scaldims array in such a way that each entry is how
-   * many scalar dimensions follows + 1 (the current one). This will make 
-   * some other processing easier (e.g. knowledge of some offsets).
-   */
-  for (i=0;i<program->nb_scattdims-1;i++)
-  { if (program->scaldims[i])
-    { j = i + 1 ;
-      while ((j < program->nb_scattdims) && program->scaldims[j])
-      { program->scaldims[i] ++ ;
-        j ++ ;
-      }
-    }
-  }
-  
-  if (nb_scaldims != 0)
-    cloog_msg(options, CLOOG_INFO, "%d dimensions (over %d) are scalar.\n",
-          nb_scaldims,program->nb_scattdims) ;
-}
-
-
-/**
- * cloog_program_scatter function:
- * This function adds the scattering (scheduling) informations in a program.
- * If names is NULL, this function create names itself such that the i^th
- * name is ci.
- * - November 6th 2001: first version. 
- */
-void cloog_program_scatter(CloogProgram *program,
-			CloogScatteringList *scattering, CloogOptions *options)
-{ int scattering_dim, scattering_dim2, not_enough_constraints=0 ;
-  CloogLoop * loop ;
-  
-  if ((program != NULL) && (scattering != NULL))
-  { loop = program->loop ;
-    
-    /* We compute the scattering dimension and check it is >=0. */
-    scattering_dim = cloog_scattering_dimension(scattering->scatt, loop->domain);
-    if (scattering_dim < 0)
-      cloog_die("scattering has not enough dimensions.\n");
-    if (!cloog_scattering_fully_specified(scattering->scatt, loop->domain))
-    not_enough_constraints ++ ;
-         
-    /* The scattering dimension may have been modified by scalar extraction. */
-    scattering_dim = cloog_scattering_dimension(scattering->scatt, loop->domain);
-
-    /* Finally we scatter all loops. */
-    cloog_loop_scatter(loop, scattering->scatt);
-    loop = loop->next ;
-    scattering = scattering->next ;    
-    
-    while ((loop != NULL) && (scattering != NULL))
-    { scattering_dim2 = cloog_scattering_dimension(scattering->scatt,
-								loop->domain);
-      if (scattering_dim2 != scattering_dim)
-        cloog_die("scattering dimensions are not the same.\n") ;
-      if (!cloog_scattering_fully_specified(scattering->scatt, loop->domain))
-      not_enough_constraints ++ ;
-      
-      cloog_loop_scatter(loop, scattering->scatt);
-      loop = loop->next ;
-      scattering = scattering->next ;
-    }
-    if ((loop != NULL) || (scattering != NULL))
-      cloog_msg(options, CLOOG_WARNING,
-                    "there is not a scattering for each statement.\n");
-    
-    if (not_enough_constraints)
-      cloog_msg(options, CLOOG_WARNING, "not enough constraints for "
-                    "%d scattering function(s).\n",not_enough_constraints) ;
-  }
-}
diff --git a/cloog-0.16.3/source/state.c b/cloog-0.16.3/source/state.c
deleted file mode 100644
index 7f3fff8..0000000
--- a/cloog-0.16.3/source/state.c
+++ /dev/null
@@ -1,52 +0,0 @@
-#include <stdlib.h>
-#include "../include/cloog/cloog.h"
-
-/**
- * Allocate state and initialize backend independent part.
- */
-CloogState *cloog_core_state_malloc(void)
-{
-  CloogState *state;
-
-  state = (CloogState *)malloc(sizeof(CloogState));
-  if (!state) 
-    cloog_die("memory overflow.\n");
-
-  state->backend = NULL;
-
-  cloog_int_init(state->zero);
-  cloog_int_set_si(state->zero, 0);
-  cloog_int_init(state->one);
-  cloog_int_set_si(state->one, 1);
-  cloog_int_init(state->negone);
-  cloog_int_set_si(state->negone, -1);
-
-  state->block_allocated = 0;
-  state->block_freed = 0;
-  state->block_max = 0;
-
-  state->domain_allocated = 0;
-  state->domain_freed = 0;
-  state->domain_max = 0;
-
-  state->loop_allocated = 0;
-  state->loop_freed = 0;
-  state->loop_max = 0;
-
-  state->statement_allocated = 0;
-  state->statement_freed = 0;
-  state->statement_max = 0;
-
-  return state;
-}
-
-/**
- * Free state.
- */
-void cloog_core_state_free(CloogState *state)
-{
-  cloog_int_clear(state->zero);
-  cloog_int_clear(state->one);
-  cloog_int_clear(state->negone);
-  free(state);
-}
diff --git a/cloog-0.16.3/source/statement.c b/cloog-0.16.3/source/statement.c
deleted file mode 100644
index 1c6af4e..0000000
--- a/cloog-0.16.3/source/statement.c
+++ /dev/null
@@ -1,280 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                           statement.c                             **
-    **-------------------------------------------------------------------**
-    **                 First version: november 4th 2001                  **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-/* CAUTION: the english used for comments is probably the worst you ever read,
- *          please feel free to correct and improve it !
- */
-
-# include <stdlib.h>
-# include <stdio.h>
-# include <string.h>
-# include "../include/cloog/cloog.h"
-
-
-/******************************************************************************
- *                             Memory leaks hunting                           *
- ******************************************************************************/
-
-
-/**
- * These functions and global variables are devoted to memory leaks hunting: we
- * want to know at each moment how many CloogStatement structures had been
- * allocated (cloog_statement_allocated) and how many had been freed
- * (cloog_statement_freed). Each time a CloogStatement structure is allocated,
- * a call to the function cloog_statement_leak_up() must be carried out, and
- * respectively cloog_statement_leak_down() when a CloogStatement structure is
- * freed. The special variable cloog_statement_max gives the maximal number of
- * CloogStatement structures simultaneously alive (i.e. allocated and
- * non-freed) in memory.
- * - July 3rd->11th 2003: first version (memory leaks hunt and correction).
- */
-
-
-static void cloog_statement_leak_up(CloogState *state)
-{
-  state->statement_allocated++;
-  if ((state->statement_allocated - state->statement_freed) > state->statement_max)
-  state->statement_max = state->statement_allocated - state->statement_freed ;
-}
-
-
-static void cloog_statement_leak_down(CloogState *state)
-{ 
-  state->statement_freed++;
-}
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-
-
-/**
- * cloog_domain_print_structure :
- * this function is a human-friendly way to display the CloogDomain data
- * structure, it includes an indentation level (level) in order to work with
- * others print_structure functions.
- * - June  16th 2005: first version.
- */
-void cloog_statement_print_structure(file, statement, level)
-FILE * file ;
-CloogStatement * statement ;
-int level ;
-{ int i ;
-      
-  if (statement != NULL)
-  { /* Go to the right level. */
-    for (i=0; i<level; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"+-- CloogStatement %d \n",statement->number) ;
-    
-    statement = statement->next ;
- 
-    while (statement != NULL)
-    { for (i=0; i<level; i++)
-      fprintf(file,"|\t") ;
-      fprintf(file,"|          |\n");
-      for (i=0; i<level; i++)
-      fprintf(file,"|\t") ;
-      fprintf(file,"|          V\n");
-      
-      for (i=0; i<level; i++)
-      fprintf(file,"|\t") ;
-      fprintf(file,"|   CloogStatement %d \n",statement->number) ;
-      statement = statement->next ;
-    }
-  }
-  else
-  { for (i=0; i<level; i++)
-    fprintf(file,"|\t") ;
-    
-    fprintf(file,"+-- No CloogStatement\n") ;
-  }  
-}
-
-
-/**
- * cloog_statement_print function:
- * This function prints the content of a CloogStatement structure (statement)
- * into a file (file, possibly stdout).
- */
-void cloog_statement_print(FILE * file, CloogStatement * statement)
-{ cloog_statement_print_structure(file,statement,0) ;
-}
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-
-
-/**
- * cloog_statement_free function:
- * This function frees the allocated memory for a CloogStatement structure.
- */
-void cloog_statement_free(CloogStatement * statement)
-{ CloogStatement * next ;
-
-  while (statement != NULL) {
-    cloog_statement_leak_down(statement->state);
-    
-    next = statement->next ;
-    /* free(statement->usr) ; Actually, this is user's job ! */
-    free(statement->name);
-    free(statement) ;
-    statement = next ;
-  }
-}
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-
-
-/**
- * cloog_statement_malloc function:
- * This function allocates the memory space for a CloogStatement structure and
- * sets its fields with default values. Then it returns a pointer to the
- * allocated space.
- * - November 21th 2005: first version.
- */
-CloogStatement *cloog_statement_malloc(CloogState *state)
-{ CloogStatement * statement ;
-  
-  /* Memory allocation for the CloogStatement structure. */
-  statement = (CloogStatement *)malloc(sizeof(CloogStatement)) ;
-  if (statement == NULL) 
-    cloog_die("memory overflow.\n");
-  cloog_statement_leak_up(state);
-  
-  /* We set the various fields with default values. */
-  statement->state = state;
-  statement->number = 0;
-  statement->name = NULL;
-  statement->usr  = NULL ; /* To fill it is actually user's job ! */
-  statement->next = NULL ;
-  
-  return statement ;
-}  
-
-
-/**
- * cloog_statement_alloc function:
- * This function allocates the memory space for a CloogStatement structure and
- * sets its fields with those given as input. Then it returns a pointer to the
- * allocated space.
- * - number is the statement number.
- **
- * - September 9th 2002: first version.
- * - March    17th 2003: fix for the usr field in CloogStatement structure.
- * - April    16th 2005: adaptation to new CloogStatement structure (with
- *                       number), cloog_statement_read becomes
- *                       cloog_statement_alloc sincethere is nothing more to
- *                       read on a file.
- * - November 21th 2005: use of cloog_statement_malloc.
- */
-CloogStatement *cloog_statement_alloc(CloogState *state, int number)
-{ CloogStatement * statement ;
-    
-  /* Memory allocation and initialization of the structure. */
-  statement = cloog_statement_malloc(state);
-
-  statement->number = number ;
-  
-  return statement ;
-}
-
-
-/**
- * cloog_statement_copy function:
- * This function returns a copy of the CloogStatement structure given as input.
- * - October 28th 2001: first version (in loop.c). 
- * - March   17th 2003: fix for the usr field in CloogStatement structure.
- * - April   16th 2005: adaptation to new CloogStatement struct (with number). 
- */ 
-CloogStatement * cloog_statement_copy(CloogStatement * source)
-{ CloogStatement * statement, * temp, * now = NULL ;
-  
-  statement = NULL ;
-
-  while (source != NULL) {
-    cloog_statement_leak_up(source->state);
-
-    temp = (CloogStatement *)malloc(sizeof(CloogStatement)) ;
-    if (temp == NULL)
-      cloog_die("memory overflow.\n");
-    
-    temp->state  = source->state;
-    temp->number = source->number ;
-    temp->name = source->name ? strdup(source->name) : NULL;
-    temp->usr    = source->usr ;
-    temp->next   = NULL ;
-    
-    if (statement == NULL)
-    { statement = temp ;
-      now = statement ;
-    }
-    else
-    { now->next = temp ;
-      now = now->next ;
-    }
-    source = source->next ;
-  }
-  return(statement) ;
-}
-
-
-/** 
- * cloog_statement_add function:
- * This function adds a CloogStatement structure (statement) at a given place
- * (now) of a NULL terminated list of CloogStatement structures. The beginning
- * of this list is (start). This function updates (now) to (loop), and
- * updates (start) if the added element is the first one -that is when (start)
- * is NULL-.
- * - March 27th 2004: first version. 
- */ 
-void cloog_statement_add(start, now, statement)
-CloogStatement ** start, ** now, * statement ;
-{ if (*start == NULL)
-  { *start = statement ;
-    *now = *start ;
-  }
-  else
-  { (*now)->next = statement ;
-    *now = (*now)->next ;
-  }
-}
-
diff --git a/cloog-0.16.3/source/stride.c b/cloog-0.16.3/source/stride.c
deleted file mode 100644
index d7358a0..0000000
--- a/cloog-0.16.3/source/stride.c
+++ /dev/null
@@ -1,70 +0,0 @@
-#include <stdlib.h>
-#include <cloog/cloog.h>
-
-#define ALLOC(type) (type*)malloc(sizeof(type))
-
-CloogStride *cloog_stride_malloc()
-{
-	CloogStride *s;
-
-	s = ALLOC(CloogStride);
-	if (!s)
-		cloog_die("memory overflow.\n");
-
-	s->references = 1;
-	cloog_int_init(s->stride);
-	cloog_int_init(s->offset);
-	cloog_int_init(s->factor);
-	s->constraint = cloog_constraint_invalid();
-
-	return s;
-}
-
-CloogStride *cloog_stride_alloc(cloog_int_t stride, cloog_int_t offset)
-{
-	CloogStride *s = cloog_stride_malloc();
-
-	cloog_int_set(s->stride, stride);
-	cloog_int_set(s->offset, offset);
-	cloog_int_set_si(s->factor, 0);
-
-	return s;
-}
-
-CloogStride *cloog_stride_alloc_from_constraint(cloog_int_t stride,
-	CloogConstraint *constraint, cloog_int_t factor)
-{
-	CloogStride *s = cloog_stride_malloc();
-
-	cloog_int_set(s->stride, stride);
-	cloog_int_set(s->factor, factor);
-	cloog_int_set_si(s->offset, -1);
-	s->constraint = constraint;
-
-	return s;
-}
-
-CloogStride *cloog_stride_copy(CloogStride *stride)
-{
-	if (!stride)
-		return stride;
-
-	stride->references++;
-	return stride;
-}
-
-void cloog_stride_free(CloogStride *stride)
-{
-	if (!stride)
-		return;
-
-	stride->references--;
-	if (stride->references > 0)
-		return;
-
-	cloog_int_clear(stride->stride);
-	cloog_int_clear(stride->offset);
-	cloog_int_clear(stride->factor);
-	cloog_constraint_release(stride->constraint);
-	free(stride);
-}
diff --git a/cloog-0.16.3/source/union_domain.c b/cloog-0.16.3/source/union_domain.c
deleted file mode 100644
index 32b0087..0000000
--- a/cloog-0.16.3/source/union_domain.c
+++ /dev/null
@@ -1,298 +0,0 @@
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include "../include/cloog/cloog.h"
-
-#define ALLOC(type) (type*)malloc(sizeof(type))
-#define ALLOCN(type,n) (type*)malloc((n)*sizeof(type))
-
-void cloog_named_domain_list_free(CloogNamedDomainList *list)
-{
-	while (list != NULL) {
-		CloogNamedDomainList *temp = list->next;
-		cloog_domain_free(list->domain);
-		cloog_scattering_free(list->scattering);
-		free(list->name);
-		free(list);
-		list = temp;
-	}
-}
-
-CloogUnionDomain *cloog_union_domain_alloc(int nb_par)
-{
-	CloogUnionDomain *ud;
-
-	ud = ALLOC(CloogUnionDomain);
-	if (!ud)
-		cloog_die("memory overflow.\n");
-
-	ud->domain = NULL;
-	ud->next_domain = &ud->domain;
-	
-	ud->n_name[CLOOG_PARAM] = nb_par;
-	ud->n_name[CLOOG_ITER] = 0;
-	ud->n_name[CLOOG_SCAT] = 0;
-
-	ud->name[CLOOG_PARAM] = NULL;
-	ud->name[CLOOG_ITER] = NULL;
-	ud->name[CLOOG_SCAT] = NULL;
-
-	return ud;
-}
-
-void cloog_union_domain_free(CloogUnionDomain *ud)
-{
-	int i;
-	int j;
-
-	if (!ud)
-		return;
-
-	for (i = 0; i < 3; ++i) {
-		if (!ud->name[i])
-			continue;
-		for (j = 0; j < ud->n_name[i]; ++i)
-			free(ud->name[i][j]);
-		free(ud->name[i]);
-	}
-
-	cloog_named_domain_list_free(ud->domain);
-
-	free(ud);
-}
-
-/**
- * Add a domain with scattering function to the union of domains.
- * name may be NULL and is duplicated if it is not.
- * domain and scattering are taken over by the CloogUnionDomain.
- * scattering may be NULL.
- */
-CloogUnionDomain *cloog_union_domain_add_domain(CloogUnionDomain *ud,
-	const char *name, CloogDomain *domain, CloogScattering *scattering,
-	void *usr)
-{
-	CloogNamedDomainList *named;
-	int n;
-
-	if (!ud)
-		return NULL;
-
-	named = ALLOC(CloogNamedDomainList);
-	if (!named)
-		cloog_die("memory overflow.\n");
-
-	if (ud->name[CLOOG_ITER])
-		cloog_die("iterator names must be set after adding domains.\n");
-	if (ud->name[CLOOG_SCAT])
-		cloog_die("scattering names must be set after adding domains.\n");
-
-	n = cloog_domain_dimension(domain);
-	if (n > ud->n_name[CLOOG_ITER])
-		ud->n_name[CLOOG_ITER] = n;
-
-	if (scattering) {
-		n = cloog_scattering_dimension(scattering, domain);
-		if (n > ud->n_name[CLOOG_SCAT])
-			ud->n_name[CLOOG_SCAT] = n;
-	}
-
-	named->domain = domain;
-	named->scattering = scattering;
-	named->name = name ? strdup(name) : NULL;
-	named->usr = usr;
-	named->next = NULL;
-
-	*ud->next_domain = named;
-	ud->next_domain = &named->next;
-
-	return ud;
-}
-
-/**
- * Set the name of parameter, iterator or scattering dimension
- * at the specified position.  The name is duplicated.
- */
-CloogUnionDomain *cloog_union_domain_set_name(CloogUnionDomain *ud,
-	enum cloog_dim_type type, int index, const char *name)
-{
-	int i;
-
-	if (!ud)
-		return ud;
-
-	if (type != CLOOG_PARAM &&
-	    type != CLOOG_ITER &&
-	    type != CLOOG_SCAT)
-		cloog_die("invalid dim type\n");
-
-	if (index < 0 || index >= ud->n_name[type])
-		cloog_die("index out of range\n");
-
-	if (!ud->name[type]) {
-		ud->name[type] = ALLOCN(char *, ud->n_name[type]);
-		if (!ud->name[type])
-			cloog_die("memory overflow.\n");
-		for (i = 0; i < ud->n_name[type]; ++i)
-			ud->name[type][i] = NULL;
-	}
-
-	free(ud->name[type][index]);
-	ud->name[type][index] = strdup(name);
-	if (!ud->name[type][index])
-		cloog_die("memory overflow.\n");
-
-	return ud;
-}
-
-static char *next_line(FILE *input, char *line, unsigned len)
-{
-	char *p;
-
-	do {
-		if (!(p = fgets(line, len, input)))
-			return NULL;
-		while (isspace(*p) && *p != '\n')
-			++p;
-	} while (*p == '#' || *p == '\n');
-
-	return p;
-}
-
-/**
- * cloog_scattering_list_read
- * Read in a list of scattering functions for the nb_statements
- * domains in loop.
- */
-static CloogScatteringList *cloog_scattering_list_read(FILE * foo,
-	CloogDomain **domain, int nb_statements, int nb_parameters)
-{
-    int nb_scat = 0;
-    char s[MAX_STRING];
-    CloogScatteringList *list = NULL, **next = &list;
-
-    /* We read first the number of scattering functions in the list. */
-    do {
-	if (!fgets(s, MAX_STRING, foo))
-	    break;
-    } while ((*s=='#' || *s=='\n') || (sscanf(s, " %d", &nb_scat) < 1));
-
-    if (nb_scat == 0)
-	return NULL;
-
-    if (nb_scat != nb_statements)
-	cloog_die("wrong number of scattering functions.\n");
-
-    while (nb_scat--) {
-	*next = (CloogScatteringList *)malloc(sizeof(CloogScatteringList));
-	(*next)->scatt = cloog_domain_read_scattering(*domain, foo);
-	(*next)->next = NULL;
-
-	next = &(*next)->next;
-	domain++;
-    }
-    return list;
-}
-
-static CloogUnionDomain *set_names_from_list(CloogUnionDomain *ud,
-	enum cloog_dim_type type, int n, char **names)
-{
-	int i;
-
-	if (!names)
-		return ud;
-
-	for (i = 0; i < n; ++i) {
-		ud = cloog_union_domain_set_name(ud, type, i, names[i]);
-		free(names[i]);
-	}
-	free(names);
-
-	return ud;
-}
-
-/**
- * Fill up a CloogUnionDomain from information in a CLooG input file.
- * The language and the context are assumed to have been read from
- * the input file already.
- */
-CloogUnionDomain *cloog_union_domain_read(FILE *file, int nb_par,
-	CloogOptions *options)
-{
-	int op1, op2, op3;
-	char line[MAX_STRING];
-	CloogDomain **domain;
-	CloogUnionDomain *ud;
-	CloogScatteringList *scatteringl;
-	int i;
-	int n_iter = -1;
-	int n_dom;
-	char **names;
-
-	ud = cloog_union_domain_alloc(nb_par);
-
-	names = cloog_names_read_strings(file, nb_par);
-	ud = set_names_from_list(ud, CLOOG_PARAM, nb_par, names);
-
-	/* We read the number of statements. */
-	if (!next_line(file, line, sizeof(line)))
-		cloog_die("Input error.\n");
-	if (sscanf(line, "%d", &n_dom) != 1)
-		cloog_die("Input error.\n");
-
-	domain = ALLOCN(CloogDomain *, n_dom);
-	if (!domain)
-		cloog_die("memory overflow.\n");
-
-	for (i = 0; i < n_dom; ++i) {
-		int dim;
-
-		domain[i] = cloog_domain_union_read(options->state, file,
-						    nb_par);
-		dim = cloog_domain_dimension(domain[i]);
-		if (dim > n_iter)
-			n_iter = dim;
-
-		/* To read that stupid "0 0 0" line. */
-		if (!next_line(file, line, sizeof(line)))
-			cloog_die("Input error.\n");
-		if (sscanf(line, " %d %d %d", &op1, &op2, &op3) != 3)
-			cloog_die("Input error.\n");
-	}
-        
-	/* Reading of the iterator names. */
-	names = cloog_names_read_strings(file, n_iter);
-
-	/* Reading and putting the scattering data in program structure. */
-	scatteringl = cloog_scattering_list_read(file, domain, n_dom, nb_par);
-
-	if (scatteringl) {
-		CloogScatteringList *is, *next;
-
-		if (cloog_scattering_list_lazy_same(scatteringl))
-			cloog_msg(options, CLOOG_WARNING,
-				  "some scattering functions are similar.\n");
-		
-		for (i = 0, is = scatteringl; i < n_dom; ++i, is = next) {
-			next = is->next;
-			ud = cloog_union_domain_add_domain(ud, NULL, domain[i],
-							      is->scatt, NULL);
-			free(is);
-		}
-	} else {
-		for (i = 0; i < n_dom; ++i)
-			ud = cloog_union_domain_add_domain(ud, NULL, domain[i],
-								NULL, NULL);
-	}
-
-	ud = set_names_from_list(ud, CLOOG_ITER, n_iter, names);
-
-	if (scatteringl) {
-		int n_scat = ud->n_name[CLOOG_SCAT];
-		names = cloog_names_read_strings(file, n_scat);
-		ud = set_names_from_list(ud, CLOOG_SCAT, n_scat, names);
-	}
-
-	free(domain);
-
-	return ud;
-}
diff --git a/cloog-0.16.3/source/version.c b/cloog-0.16.3/source/version.c
deleted file mode 100644
index f1b86e2..0000000
--- a/cloog-0.16.3/source/version.c
+++ /dev/null
@@ -1,24 +0,0 @@
-#include "version.h"
-#include "cloog/version.h"
-
-#define CLOOG_BITS "gmp"
-
-const char *cloog_version(void)
-{
-  return "CLooG "CLOOG_HEAD" "CLOOG_BITS" bits";
-}
-
-int cloog_version_major(void)
-{
-  return CLOOG_VERSION_MAJOR;
-}
-
-int cloog_version_minor(void)
-{
-  return CLOOG_VERSION_MINOR;
-}
-
-int cloog_version_revision(void)
-{
-  return CLOOG_VERSION_REVISION;
-}
diff --git a/cloog-0.16.3/source/version.c.in b/cloog-0.16.3/source/version.c.in
deleted file mode 100644
index f5d026e..0000000
--- a/cloog-0.16.3/source/version.c.in
+++ /dev/null
@@ -1,24 +0,0 @@
-#include "version.h"
-#include "cloog/version.h"
-
-#define CLOOG_BITS "@BITS@"
-
-const char *cloog_version(void)
-{
-  return "CLooG "CLOOG_HEAD" "CLOOG_BITS" bits";
-}
-
-int cloog_version_major(void)
-{
-  return CLOOG_VERSION_MAJOR;
-}
-
-int cloog_version_minor(void)
-{
-  return CLOOG_VERSION_MINOR;
-}
-
-int cloog_version_revision(void)
-{
-  return CLOOG_VERSION_REVISION;
-}
diff --git a/cloog-0.16.3/test/0D-1.c b/cloog-0.16.3/test/0D-1.c
deleted file mode 100644
index 7f24623..0000000
--- a/cloog-0.16.3/test/0D-1.c
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Generated from ../../../git/cloog/test/0D-1.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-S1() ;
diff --git a/cloog-0.16.3/test/0D-1.cloog b/cloog-0.16.3/test/0D-1.cloog
deleted file mode 100644
index 226e7cb..0000000
--- a/cloog-0.16.3/test/0D-1.cloog
+++ /dev/null
@@ -1,13 +0,0 @@
-c
-
-0 2
-0
-
-1
-
-1
-0 2
-0 0 0
-0
-
-0
diff --git a/cloog-0.16.3/test/0D-1.good.c b/cloog-0.16.3/test/0D-1.good.c
deleted file mode 100644
index 0a37a56..0000000
--- a/cloog-0.16.3/test/0D-1.good.c
+++ /dev/null
@@ -1,15 +0,0 @@
-/* Generated from ../../../git/cloog/test/0D-1.cloog by CLooG 0.14.0-117-g5444fca gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1() { hash(1); }
-
-void test()
-{
-  S1() ;
-}
diff --git a/cloog-0.16.3/test/0D-2.c b/cloog-0.16.3/test/0D-2.c
deleted file mode 100644
index 4aa9c17..0000000
--- a/cloog-0.16.3/test/0D-2.c
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Generated from ../../../git/cloog/test/0D-2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-if (M >= 0) {
-  S1() ;
-}
diff --git a/cloog-0.16.3/test/0D-2.cloog b/cloog-0.16.3/test/0D-2.cloog
deleted file mode 100644
index 69f2015..0000000
--- a/cloog-0.16.3/test/0D-2.cloog
+++ /dev/null
@@ -1,14 +0,0 @@
-c
-
-0 3
-0
-
-1
-
-1
-1 3
-1 1 0
-0 0 0
-0
-
-0
diff --git a/cloog-0.16.3/test/0D-2.good.c b/cloog-0.16.3/test/0D-2.good.c
deleted file mode 100644
index 65a12c6..0000000
--- a/cloog-0.16.3/test/0D-2.good.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Generated from ../../../git/cloog/test/0D-2.cloog by CLooG 0.14.0-117-g5444fca gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1() { hash(1); }
-
-void test(int M)
-{
-  if (M >= 0) {
-    S1() ;
-  }
-}
diff --git a/cloog-0.16.3/test/0D-3.c b/cloog-0.16.3/test/0D-3.c
deleted file mode 100644
index 62b4269..0000000
--- a/cloog-0.16.3/test/0D-3.c
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Generated from ../../../git/cloog/test/0D-3.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-S1() ;
diff --git a/cloog-0.16.3/test/0D-3.cloog b/cloog-0.16.3/test/0D-3.cloog
deleted file mode 100644
index ab4d59c..0000000
--- a/cloog-0.16.3/test/0D-3.cloog
+++ /dev/null
@@ -1,15 +0,0 @@
-c
-
-1 3
-1 1 0
-0
-
-1
-
-1
-1 3
-1 1 0
-0 0 0
-0
-
-0
diff --git a/cloog-0.16.3/test/0D-3.good.c b/cloog-0.16.3/test/0D-3.good.c
deleted file mode 100644
index 10150eb..0000000
--- a/cloog-0.16.3/test/0D-3.good.c
+++ /dev/null
@@ -1,15 +0,0 @@
-/* Generated from ../../../git/cloog/test/0D-3.cloog by CLooG 0.14.0-117-g5444fca gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1() { hash(1); }
-
-void test(int M)
-{
-  S1() ;
-}
diff --git a/cloog-0.16.3/test/1point-1.c b/cloog-0.16.3/test/1point-1.c
deleted file mode 100644
index 7c0106b..0000000
--- a/cloog-0.16.3/test/1point-1.c
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Generated from ../../../git/cloog/test/1point-1.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-S1(2*M,M) ;
diff --git a/cloog-0.16.3/test/1point-1.cloog b/cloog-0.16.3/test/1point-1.cloog
deleted file mode 100644
index 318d89b..0000000
--- a/cloog-0.16.3/test/1point-1.cloog
+++ /dev/null
@@ -1,23 +0,0 @@
-# language: C
-c
-
-# Context
-#{M | }
-1 3
-# M 1
-1 0 1
-0
-
-1 # Number of statements
-
-1
-#{i, j | i=2N; i=2j}
-3 5
-#  i  j  M  1
-0  1  0 -2  0
-0  1 -2  0  0
-1  0  0  0  1
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/1point-1.good.c b/cloog-0.16.3/test/1point-1.good.c
deleted file mode 100644
index 196f8a9..0000000
--- a/cloog-0.16.3/test/1point-1.good.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Generated from ../../../git/cloog/test/1point-1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j;
-  i = 2*M ;
-  S1(2*M,M) ;
-}
diff --git a/cloog-0.16.3/test/1point-2.c b/cloog-0.16.3/test/1point-2.c
deleted file mode 100644
index 48f6ad4..0000000
--- a/cloog-0.16.3/test/1point-2.c
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Generated from ../../../git/cloog/test/1point-2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-S1(2*M,N+2) ;
diff --git a/cloog-0.16.3/test/1point-2.cloog b/cloog-0.16.3/test/1point-2.cloog
deleted file mode 100644
index 66eec58..0000000
--- a/cloog-0.16.3/test/1point-2.cloog
+++ /dev/null
@@ -1,23 +0,0 @@
-# language: C
-c
-
-# Context
-#{M,N | }
-1 4
-# M N 1
-1 0 0 1
-0
-
-1 # Number of statements
-
-1
-#
-3 6
-#  i  j  M  N  1
-0  1  0 -2  0  0
-0  2 -2 -4  2  4
-1  0  0  0  0  1
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/1point-2.good.c b/cloog-0.16.3/test/1point-2.good.c
deleted file mode 100644
index 9880504..0000000
--- a/cloog-0.16.3/test/1point-2.good.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated from ../../../git/cloog/test/1point-2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i, j;
-  i = 2*M ;
-  j = N+2 ;
-  S1(2*M,N+2) ;
-}
diff --git a/cloog-0.16.3/test/4-param.c b/cloog-0.16.3/test/4-param.c
deleted file mode 100644
index b542796..0000000
--- a/cloog-0.16.3/test/4-param.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Generated from ../../../git/cloog/test/4-param.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.18s. */
-for (i=m;i<=min(n,p-1);i++) {
-  S1(i) ;
-}
-for (i=p;i<=min(q,m-1);i++) {
-  S2(i) ;
-}
-for (i=max(m,p);i<=min(n,q);i++) {
-  S1(i) ;
-  S2(i) ;
-}
-for (i=max(max(m,p),q+1);i<=n;i++) {
-  S1(i) ;
-}
-for (i=max(max(m,p),n+1);i<=q;i++) {
-  S2(i) ;
-}
diff --git a/cloog-0.16.3/test/4-param.cloog b/cloog-0.16.3/test/4-param.cloog
deleted file mode 100644
index a19ba08..0000000
--- a/cloog-0.16.3/test/4-param.cloog
+++ /dev/null
@@ -1,33 +0,0 @@
-# language: C
-c
-
-# Context
-# parameters m n p q
-1 6
-# m n p q 1
-1 0 0 0 0 1
-1
-m n p q
-
-2 # Number of statements
-
-1
-# S1 i,...
-3 7
-#  i  m  n  p  q  1
-1  1 -1  0  0  0  0
-1 -1  0  1  0  0  0
-1  0  0  0  0  0  1
-0  0  0
-
-1
-#
-3 7
-#  i  m  n  p  q  1
-1  1  0  0 -1  0  0
-1 -1  0  0  0  1  0
-1  0  0  0  0  0  1
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/4-param.good.c b/cloog-0.16.3/test/4-param.good.c
deleted file mode 100644
index 563b90b..0000000
--- a/cloog-0.16.3/test/4-param.good.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Generated from ../../../git/cloog/test/4-param.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i) { hash(2); hash(i); }
-
-void test(int m, int n, int p, int q)
-{
-  /* Original iterators. */
-  int i;
-  for (i=m;i<=min(min(n,p-1),q);i++) {
-    S1(i) ;
-  }
-  for (i=p;i<=min(min(q,m-1),n);i++) {
-    S2(i) ;
-  }
-  for (i=max(m,p);i<=min(n,q);i++) {
-    S1(i) ;
-    S2(i) ;
-  }
-  for (i=max(m,q+1);i<=n;i++) {
-    S1(i) ;
-  }
-  for (i=max(p,n+1);i<=q;i++) {
-    S2(i) ;
-  }
-}
diff --git a/cloog-0.16.3/test/Makefile.am b/cloog-0.16.3/test/Makefile.am
deleted file mode 100644
index be6995d..0000000
--- a/cloog-0.16.3/test/Makefile.am
+++ /dev/null
@@ -1,424 +0,0 @@
-#
-#   /**-------------------------------------------------------------------**
-#    **                              CLooG                                **
-#    **-------------------------------------------------------------------**
-#    **                            makefile                               **
-#    **-------------------------------------------------------------------**
-#    **                   First version: march 6th 2003                   **
-#    **-------------------------------------------------------------------**/
-#
-# makefile for checking.
-
-#/*****************************************************************************
-# *               CLooG : the Chunky Loop Generator (experimental)            *
-# *****************************************************************************
-# *                                                                           *
-# * Copyright (C) 2003 Cedric Bastoul                                         *
-# *                                                                           *
-# * This library is free software; you can redistribute it and/or             *
-# * modify it under the terms of the GNU Lesser General Public                *
-# * License as published by the Free Software Foundation; either              *
-# * version 2.1 of the License, or (at your option) any later version.        *
-# *                                                                           *
-# * This library is distributed in the hope that it will be useful,           *
-# * but WITHOUT ANY WARRANTY; without even the implied warranty of            *
-# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
-# * Lesser General Public License for more details.                           *
-# *                                                                           *
-# * You should have received a copy of the GNU Lesser General Public          *
-# * License along with this library; if not, write to the Free Software       *
-# * Foundation, Inc., 51 Franklin Street, Fifth Floor,                        *
-# * Boston, MA  02110-1301  USA                                               *
-# *                                                                           *
-# * CLooG, the Chunky Loop Generator                                          *
-# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                        *
-# * This file has been written with the help of the Bart Kienhuis's checking  *
-# * makefile for PipLib.                                                      *
-# *                                                                           *
-# *****************************************************************************/
-
-if NO_ISL
-GENERATE_TEST =
-else
-GENERATE_TEST = generate_test
-endif
-noinst_PROGRAMS = $(GENERATE_TEST)
-INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include
-LDADD = ../libcloog-isl.la
-generate_test_SOURCES = generate_test.c
-
-FORCE:
-../libcloog-isl.la: FORCE
-	cd ..; $(MAKE) $(AM_MAKEFLAGS) libcloog-isl.la
-
-ROOT = ..
-
-FINITE_CLOOGTEST_C =                   \
-	0D-1                           \
-	0D-2                           \
-	0D-3                           \
-	1point-1                       \
-	1point-2                       \
-	4-param                        \
-	basic-bounds-1                 \
-	basic-bounds-2                 \
-	basic-bounds-3                 \
-	basic-bounds-4                 \
-	basic-bounds-5                 \
-	basic-bounds-6                 \
-	block                          \
-	block2                         \
-	block3                         \
-	byu98-1-2-3                    \
-	cholesky                       \
-	cholesky2                      \
-	christian                      \
-	classen                        \
-	classen2                       \
-	constant                       \
-	constbound                     \
-	darte                          \
-	dealII                         \
-	donotsimp                      \
-	dot                            \
-	dot2                           \
-	double                         \
-	durbin_e_s                     \
-	emploi                         \
-	esced                          \
-	ex1                            \
-	forwardsub-1-1-2               \
-	forwardsub-2-1-2-3             \
-	forwardsub-3-1-2               \
-	gauss                          \
-	gesced                         \
-	gesced2                        \
-	gesced3                        \
-	guide                          \
-	iftest                         \
-	iftest2                        \
-	largeur                        \
-	levenshtein-1-2-3              \
-	lex                            \
-	lineality-1-2                  \
-	lineality-2-1-2                \
-	logo                           \
-	logopar                        \
-	lu                             \
-	lu2                            \
-	lub                            \
-	lux                            \
-	min-1-1                        \
-	min-2-1                        \
-	min-3-1                        \
-	min-4-1                        \
-	mode                           \
-	multi-mm-1                     \
-	no_lindep                      \
-	orc                            \
-	rectangle                      \
-	singleton                      \
-	square+triangle-1-1-2-3        \
-	swim                           \
-	test                           \
-	thomasset                      \
-	tiling                         \
-	uday_scalars		       \
-	union			       \
-	vivien                         \
-	vivien2                        \
-	walters                        \
-	walters2                       \
-	walters3                       \
-	wavefront                      \
-	yosr                           \
-	yosr2                          \
-	./non_optimal/nul_complex1     \
-	./non_optimal/usvd_e_t         \
-	./non_optimal/youcef           \
-	./reservoir/cholesky2          \
-	./reservoir/fusion1            \
-	./reservoir/fusion2            \
-	./reservoir/jacobi2            \
-	./reservoir/jacobi3            \
-	./reservoir/lim-lam1           \
-	./reservoir/lim-lam2           \
-	./reservoir/lim-lam3           \
-	./reservoir/lim-lam4           \
-	./reservoir/lim-lam5           \
-	./reservoir/lim-lam6           \
-	./reservoir/liu-zhuge1         \
-	./reservoir/loechner3          \
-	./reservoir/loechner4          \
-	./reservoir/loechner5          \
-	./reservoir/mg-interp2         \
-	./reservoir/mg-interp          \
-	./reservoir/mg-psinv           \
-	./reservoir/mg-resid           \
-	./reservoir/mg-rprj3           \
-	./reservoir/pingali1           \
-	./reservoir/pingali2           \
-	./reservoir/pingali3           \
-	./reservoir/pingali4           \
-	./reservoir/pingali5           \
-	./reservoir/pingali6           \
-	./reservoir/QR                 \
-	./reservoir/tang-xue1          \
-	./reservoir/two   
-
-CLOOG_ISL_TEST_C =			\
-	isl/mod				\
-	isl/mod2			\
-	isl/mod3			\
-	isl/mod4
-
-CLOOGTEST_C =                          \
-	infinite                       \
-	infinite2                      \
-	infinite3                      \
-	infinite4                      \
-	$(FINITE_CLOOGTEST_C)          \
-	$(CLOOG_ISL_TEST_C)
-
-#	./reservoir/long               \
-#	faber
-
-CLOOGTEST_FORTRAN =                    \
-	dartef                         \
-	iftestf                        \
-	levenshtein-1-2-3f             \
-	yosrf
-
-CLOOG_ISL_TEST_STRIDED =		\
-	isl/mxm-shared
-
-CLOOGTEST_STRIDED =                    \
-	basic-bounds-2                 \
-	mod4                           \
-	nul_basic1                     \
-	nul_basic2                     \
-	nul_lcpc		       \
-	multi-stride		       \
-	multi-stride2		       \
-	stride3                        \
-	stride4                        \
-	reservoir/bastoul3	       \
-	reservoir/stride	       \
-	reservoir/stride2              \
-	$(CLOOG_ISL_TEST_STRIDED)
-
-SPECIAL_TESTS = \
-	isl/jacobi-shared \
-	backtrack \
-	vasilache \
-	merge \
-	equality \
-	equality2 \
-	otl \
-	param-split \
-	pouchet \
-	stride \
-	stride2 \
-	sor1d
-SPECIAL_OPTIONS = \
-	'isl/jacobi-shared -f 4 -l -1 -override -strides 1 -sh 1' \
-	'backtrack -f 1 -backtrack' \
-	'vasilache -f 8 -l 9' \
-	'merge -f -1' \
-	'equality -f -1 -l 2 -override' \
-	'equality2 -f -1 -l 4 -esp 1 -override' \
-	'otl -block 1 -esp 0 -otl 0' \
-	'param-split -f -1' \
-	'pouchet -f 3 -l 7' \
-	'stride -f -1 -strides 1' \
-	'stride2 -f -1 -strides 1' \
-	'sor1d -f -1'
-
-EXTRA_DIST = \
-	$(CLOOGTEST_C:%=%.cloog) \
-	$(CLOOGTEST_C:%=%.c) \
-	$(FINITE_CLOOGTEST_C:%=%.good.c) \
-	$(CLOOGTEST_FORTRAN:%=%.cloog) \
-	$(CLOOGTEST_FORTRAN:%=%.f) \
-	$(CLOOGTEST_STRIDED:%=%.cloog) \
-	$(CLOOGTEST_STRIDED:%=%.c) \
-	$(SPECIAL_TESTS:%=%.cloog) \
-	$(SPECIAL_TESTS:%=%.c) \
-	$(SPECIAL_TESTS:%=%.good.c)
-
-generate:
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *                 Generate files                *"
-	@echo "              *-----------------------------------------------*/"
-	@for x in $(CLOOGTEST_C) ; do \
-		echo "Generate $$x.c" ; \
-		$(top_builddir)/cloog $(srcdir)/$$x.cloog -o $(srcdir)/$$x.c ; \
-	done ; \
-	for x in $(CLOOGTEST_FORTRAN) ; do \
-		echo "Generate $$x.f" ; \
-		$(top_builddir)/cloog $(srcdir)/$$x.cloog -o $(srcdir)/$$x.f ; \
-	done ; \
-	for x in $(CLOOGTEST_STRIDED) ; do \
-		echo "Generate $$x.c" ; \
-		$(top_builddir)/cloog $(srcdir)/$$x.cloog \
-			-strides 1 -o $(srcdir)/$$x.c ; \
-	done ; \
-	for line in $(SPECIAL_OPTIONS); do echo $$line | while read x options; do \
-		echo "Generate file $$x ($$options)" ; \
-		$(top_builddir)/cloog$(EXEEXT) $(srcdir)/$$x.cloog \
-		    $$options > $(srcdir)/$$x.c ; \
-	done; done
-
-generate_good:
-	@for x in $(FINITE_CLOOGTEST_C) ; do \
-		echo "Generate $$x.good.c" ; \
-		$(top_builddir)/cloog$(EXEEXT) -callable 1 $(srcdir)/$$x.cloog -o $(srcdir)/$$x.good.c ; \
-	done; \
-	for line in $(SPECIAL_OPTIONS); do echo $$line | while read x options; do \
-		echo "Generate $$x.good.c ($$options)" ; \
-		$(top_builddir)/cloog$(EXEEXT) -callable 1 $$options $(srcdir)/$$x.cloog -o $(srcdir)/$$x.good.c ; \
-	done; done
-
-valgrind:
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *            Checking files by Valgrind         *"
-	@echo "              *-----------------------------------------------*/"
-	for x in $(CLOOGTEST_C) ; do \
-		echo "Valgrinding $$x.c" ; \
-		valgrind $(top_builddir)/cloog$(EXEEXT) $(srcdir)/$$x.cloog ; \
-	done ; \
-	for x in $(CLOOGTEST_FORTRAN) ; do \
-		echo "Valgrinding $$x.f" ; \
-		valgrind $(top_builddir)/cloog$(EXEEXT) $(srcdir)/$$x.cloog ; \
-	done
-
-test_run: generate_test$(EXEEXT)
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *                 Testing CLooG                 *"
-	@echo "              *-----------------------------------------------*/"
-	@failedtest=0 ; \
-	echo "--- Testing C files... (correct output)" ; \
-	for x in $(FINITE_CLOOGTEST_C) ; do \
-		echo -n "Verify file $$x... " ; \
-		echo -n "generating... " ; \
-		$(top_builddir)/cloog$(EXEEXT) -q -callable 1 $(srcdir)/$$x.cloog > test_test.c ; \
-		./generate_test$(EXEEXT) < $(srcdir)/$$x.cloog > test_main.c; \
-		echo -n "compiling... " ; \
-		$(COMPILE) -c test_test.c; \
-		$(COMPILE) -Dtest=good -c $(srcdir)/$$x.good.c -o test_good.o; \
-		$(LINK) test_main.c test_test.o test_good.o > /dev/null; \
-		echo -n "comparing... " ; \
-		./test_run$(EXEEXT); \
-		result=$$?; \
-		if test "$$result" -ne "0" ; then \
-			failedtest=`expr $$failedtest + 1` ; \
-		fi; \
-		$(RM) $@; \
-		echo; \
-	done; \
-	for line in $(SPECIAL_OPTIONS); do echo $$line | while read x options; do \
-		echo -n "Verify file $$x ($$options)... " ; \
-		echo -n "generating... " ; \
-		$(top_builddir)/cloog$(EXEEXT) -q -callable 1 $$options $(srcdir)/$$x.cloog > test_test.c ; \
-		./generate_test$(EXEEXT) < $(srcdir)/$$x.cloog > test_main.c; \
-		echo -n "compiling... " ; \
-		$(COMPILE) -c test_test.c; \
-		$(COMPILE) -Dtest=good -c $(srcdir)/$$x.good.c -o test_good.o; \
-		$(LINK) test_main.c test_test.o test_good.o > /dev/null; \
-		echo -n "comparing... " ; \
-		./test_run$(EXEEXT); \
-		result=$$?; \
-		if test "$$result" -ne "0" ; then \
-			failedtest=`expr $$failedtest + 1` ; \
-		fi; \
-		$(RM) $@; \
-		echo; \
-	done; done; \
-	for line in $(SPECIAL_OPTIONS); do echo $$line | while read x options; do \
-		echo -n "Verify file $$x ($$options -sh 1)... " ; \
-		echo -n "generating... " ; \
-		$(top_builddir)/cloog$(EXEEXT) -q -callable 1 $$options -sh 1 $(srcdir)/$$x.cloog > test_test.c ; \
-		./generate_test$(EXEEXT) < $(srcdir)/$$x.cloog > test_main.c; \
-		echo -n "compiling... " ; \
-		$(COMPILE) -c test_test.c; \
-		$(COMPILE) -Dtest=good -c $(srcdir)/$$x.good.c -o test_good.o; \
-		$(LINK) test_main.c test_test.o test_good.o > /dev/null; \
-		echo -n "comparing... " ; \
-		./test_run$(EXEEXT); \
-		result=$$?; \
-		if test "$$result" -ne "0" ; then \
-			failedtest=`expr $$failedtest + 1` ; \
-		fi; \
-		$(RM) $@; \
-		echo; \
-	done; done; \
-	if [ $$failedtest != 0 ] ; then \
-		echo "$$failedtest tests failed" ; \
-	else \
-	        echo "CLooG works correctly :-) !" ; \
-        fi
-test:
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *                 Testing CLooG                 *"
-	@echo "              *-----------------------------------------------*/"
-	@failedtest=0 ; \
-	echo "--- Testing C files... (expected output)" ; \
-	for x in $(CLOOGTEST_C) ; do \
-		echo "Verify file $$x" ; \
-		$(top_builddir)/cloog$(EXEEXT) $(srcdir)/$$x.cloog > ttemp ; \
-		diff -u -w --ignore-matching-lines='CLooG' ttemp $(srcdir)/$$x.c ; \
-		result=$$?; \
-		if [ "$$result" -ne "0" ] ; then \
-			echo "!!! Error: $$x is not the same" ; \
-			failedtest=`expr $$failedtest + 1` ; \
-		else \
-			echo "$$x passed" ; \
-	        fi ; \
-	done ; \
-	echo "--- Testing FORTRAN files..." ; \
-	for x in $(CLOOGTEST_FORTRAN) ; do \
-		echo "Verify file $$x" ; \
-		$(top_builddir)/cloog$(EXEEXT) $(srcdir)/$$x.cloog > ttemp ; \
-		diff -u -w --ignore-matching-lines='CLooG' ttemp $(srcdir)/$$x.f ; \
-		result=$$?; \
-		if [ "$$result" -ne "0" ] ; then \
-			echo "!!! Error: $$x is not the same" ; \
-			failedtest=`expr $$failedtest + 1` ; \
-		else \
-			echo "$$x passed" ; \
-	        fi ; \
-	done ; \
-	echo "--- Testing STRIDED files..." ; \
-	for x in $(CLOOGTEST_STRIDED) ; do \
-		echo "Verify file $$x" ; \
-		$(top_builddir)/cloog$(EXEEXT) $(srcdir)/$$x.cloog \
-		-strides 1 > ttemp ; \
-		diff -u -w --ignore-matching-lines='CLooG' ttemp $(srcdir)/$$x.c ; \
-		result=$$?; \
-		if [ "$$result" -ne "0" ] ; then \
-			echo "!!! Error: $$x is not the same" ; \
-			failedtest=`expr $$failedtest + 1` ; \
-		else \
-			echo "$$x passed" ; \
-	        fi ; \
-	done ; \
-	echo "--- Testing SPECIAL OPTIONS files..." ; \
-	for line in $(SPECIAL_OPTIONS); do echo $$line | while read x options; do \
-	        echo "Verify file $$x ($$options)" ; \
-		$(top_builddir)/cloog$(EXEEXT) $(srcdir)/$$x.cloog \
-			$$options > ttemp ; \
-		diff -u -w --ignore-matching-lines='CLooG' ttemp $(srcdir)/$$x.c ; \
-		result=$$?; \
-		if [ "$$result" -ne "0" ] ; then \
-			echo "!!! Error: $$x is not the same" ; \
-			failedtest=`expr $$failedtest + 1` ; \
-		else \
-			echo "$$x passed" ; \
-	        fi ; \
-	done; done; \
-	rm ttemp ; \
-	if [ $$failedtest != 0 ] ; then \
-		echo "$$failedtest tests failed" ; \
-	else \
-	        echo "CLooG works correctly :-) !" ; \
-        fi
diff --git a/cloog-0.16.3/test/Makefile.in b/cloog-0.16.3/test/Makefile.in
deleted file mode 100644
index e0ec242..0000000
--- a/cloog-0.16.3/test/Makefile.in
+++ /dev/null
@@ -1,929 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-#
-#   /**-------------------------------------------------------------------**
-#    **                              CLooG                                **
-#    **-------------------------------------------------------------------**
-#    **                            makefile                               **
-#    **-------------------------------------------------------------------**
-#    **                   First version: march 6th 2003                   **
-#    **-------------------------------------------------------------------**/
-#
-# makefile for checking.
-
-#/*****************************************************************************
-# *               CLooG : the Chunky Loop Generator (experimental)            *
-# *****************************************************************************
-# *                                                                           *
-# * Copyright (C) 2003 Cedric Bastoul                                         *
-# *                                                                           *
-# * This library is free software; you can redistribute it and/or             *
-# * modify it under the terms of the GNU Lesser General Public                *
-# * License as published by the Free Software Foundation; either              *
-# * version 2.1 of the License, or (at your option) any later version.        *
-# *                                                                           *
-# * This library is distributed in the hope that it will be useful,           *
-# * but WITHOUT ANY WARRANTY; without even the implied warranty of            *
-# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
-# * Lesser General Public License for more details.                           *
-# *                                                                           *
-# * You should have received a copy of the GNU Lesser General Public          *
-# * License along with this library; if not, write to the Free Software       *
-# * Foundation, Inc., 51 Franklin Street, Fifth Floor,                        *
-# * Boston, MA  02110-1301  USA                                               *
-# *                                                                           *
-# * CLooG, the Chunky Loop Generator                                          *
-# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                        *
-# * This file has been written with the help of the Bart Kienhuis's checking  *
-# * makefile for PipLib.                                                      *
-# *                                                                           *
-# *****************************************************************************/
-
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-noinst_PROGRAMS = $(am__EXEEXT_1)
-subdir = test
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cc_maxopt.m4 \
-	$(top_srcdir)/m4/ax_cflags_warn_all.m4 \
-	$(top_srcdir)/m4/ax_check_compiler_flags.m4 \
-	$(top_srcdir)/m4/ax_compiler_vendor.m4 \
-	$(top_srcdir)/m4/ax_create_pkgconfig_info.m4 \
-	$(top_srcdir)/m4/ax_gcc_archflag.m4 \
-	$(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \
-	$(top_srcdir)/m4/ax_submodule.m4 $(top_srcdir)/m4/libtool.m4 \
-	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-@NO_ISL_FALSE@am__EXEEXT_1 = generate_test$(EXEEXT)
-PROGRAMS = $(noinst_PROGRAMS)
-am_generate_test_OBJECTS = generate_test.$(OBJEXT)
-generate_test_OBJECTS = $(am_generate_test_OBJECTS)
-generate_test_LDADD = $(LDADD)
-generate_test_DEPENDENCIES = ../libcloog-isl.la
-AM_V_lt = $(am__v_lt_$(V))
-am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
-am__v_lt_0 = --silent
-DEFAULT_INCLUDES = -I.@am__isrc@
-depcomp = $(SHELL) $(top_srcdir)/autoconf/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_$(V))
-am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
-am__v_CC_0 = @echo "  CC    " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
-CCLD = $(CC)
-LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_$(V))
-am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
-am__v_CCLD_0 = @echo "  CCLD  " $@;
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
-SOURCES = $(generate_test_SOURCES)
-DIST_SOURCES = $(generate_test_SOURCES)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BITS = @BITS@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CD = @CD@
-CFLAGS = @CFLAGS@
-CFLAGS_WARN = @CFLAGS_WARN@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GIT_INDEX = @GIT_INDEX@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-ISL_CPPFLAGS = @ISL_CPPFLAGS@
-ISL_LDFLAGS = @ISL_LDFLAGS@
-ISL_LIBS = @ISL_LIBS@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PRTDIAG = @PRTDIAG@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TEXI2DVI = @TEXI2DVI@
-VERSION = @VERSION@
-VERSION_MAJOR = @VERSION_MAJOR@
-VERSION_MINOR = @VERSION_MINOR@
-VERSION_REVISION = @VERSION_REVISION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-pkgconfig_libdir = @pkgconfig_libdir@
-pkgconfig_libfile = @pkgconfig_libfile@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-subdirs = @subdirs@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-versioninfo = @versioninfo@
-@NO_ISL_FALSE@GENERATE_TEST = generate_test
-@NO_ISL_TRUE@GENERATE_TEST = 
-INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include
-LDADD = ../libcloog-isl.la
-generate_test_SOURCES = generate_test.c
-ROOT = ..
-FINITE_CLOOGTEST_C = \
-	0D-1                           \
-	0D-2                           \
-	0D-3                           \
-	1point-1                       \
-	1point-2                       \
-	4-param                        \
-	basic-bounds-1                 \
-	basic-bounds-2                 \
-	basic-bounds-3                 \
-	basic-bounds-4                 \
-	basic-bounds-5                 \
-	basic-bounds-6                 \
-	block                          \
-	block2                         \
-	block3                         \
-	byu98-1-2-3                    \
-	cholesky                       \
-	cholesky2                      \
-	christian                      \
-	classen                        \
-	classen2                       \
-	constant                       \
-	constbound                     \
-	darte                          \
-	dealII                         \
-	donotsimp                      \
-	dot                            \
-	dot2                           \
-	double                         \
-	durbin_e_s                     \
-	emploi                         \
-	esced                          \
-	ex1                            \
-	forwardsub-1-1-2               \
-	forwardsub-2-1-2-3             \
-	forwardsub-3-1-2               \
-	gauss                          \
-	gesced                         \
-	gesced2                        \
-	gesced3                        \
-	guide                          \
-	iftest                         \
-	iftest2                        \
-	largeur                        \
-	levenshtein-1-2-3              \
-	lex                            \
-	lineality-1-2                  \
-	lineality-2-1-2                \
-	logo                           \
-	logopar                        \
-	lu                             \
-	lu2                            \
-	lub                            \
-	lux                            \
-	min-1-1                        \
-	min-2-1                        \
-	min-3-1                        \
-	min-4-1                        \
-	mode                           \
-	multi-mm-1                     \
-	no_lindep                      \
-	orc                            \
-	rectangle                      \
-	singleton                      \
-	square+triangle-1-1-2-3        \
-	swim                           \
-	test                           \
-	thomasset                      \
-	tiling                         \
-	uday_scalars		       \
-	union			       \
-	vivien                         \
-	vivien2                        \
-	walters                        \
-	walters2                       \
-	walters3                       \
-	wavefront                      \
-	yosr                           \
-	yosr2                          \
-	./non_optimal/nul_complex1     \
-	./non_optimal/usvd_e_t         \
-	./non_optimal/youcef           \
-	./reservoir/cholesky2          \
-	./reservoir/fusion1            \
-	./reservoir/fusion2            \
-	./reservoir/jacobi2            \
-	./reservoir/jacobi3            \
-	./reservoir/lim-lam1           \
-	./reservoir/lim-lam2           \
-	./reservoir/lim-lam3           \
-	./reservoir/lim-lam4           \
-	./reservoir/lim-lam5           \
-	./reservoir/lim-lam6           \
-	./reservoir/liu-zhuge1         \
-	./reservoir/loechner3          \
-	./reservoir/loechner4          \
-	./reservoir/loechner5          \
-	./reservoir/mg-interp2         \
-	./reservoir/mg-interp          \
-	./reservoir/mg-psinv           \
-	./reservoir/mg-resid           \
-	./reservoir/mg-rprj3           \
-	./reservoir/pingali1           \
-	./reservoir/pingali2           \
-	./reservoir/pingali3           \
-	./reservoir/pingali4           \
-	./reservoir/pingali5           \
-	./reservoir/pingali6           \
-	./reservoir/QR                 \
-	./reservoir/tang-xue1          \
-	./reservoir/two   
-
-CLOOG_ISL_TEST_C = \
-	isl/mod				\
-	isl/mod2			\
-	isl/mod3			\
-	isl/mod4
-
-CLOOGTEST_C = \
-	infinite                       \
-	infinite2                      \
-	infinite3                      \
-	infinite4                      \
-	$(FINITE_CLOOGTEST_C)          \
-	$(CLOOG_ISL_TEST_C)
-
-
-#	./reservoir/long               \
-#	faber
-CLOOGTEST_FORTRAN = \
-	dartef                         \
-	iftestf                        \
-	levenshtein-1-2-3f             \
-	yosrf
-
-CLOOG_ISL_TEST_STRIDED = \
-	isl/mxm-shared
-
-CLOOGTEST_STRIDED = \
-	basic-bounds-2                 \
-	mod4                           \
-	nul_basic1                     \
-	nul_basic2                     \
-	nul_lcpc		       \
-	multi-stride		       \
-	multi-stride2		       \
-	stride3                        \
-	stride4                        \
-	reservoir/bastoul3	       \
-	reservoir/stride	       \
-	reservoir/stride2              \
-	$(CLOOG_ISL_TEST_STRIDED)
-
-SPECIAL_TESTS = \
-	isl/jacobi-shared \
-	backtrack \
-	vasilache \
-	merge \
-	equality \
-	equality2 \
-	otl \
-	param-split \
-	pouchet \
-	stride \
-	stride2 \
-	sor1d
-
-SPECIAL_OPTIONS = \
-	'isl/jacobi-shared -f 4 -l -1 -override -strides 1 -sh 1' \
-	'backtrack -f 1 -backtrack' \
-	'vasilache -f 8 -l 9' \
-	'merge -f -1' \
-	'equality -f -1 -l 2 -override' \
-	'equality2 -f -1 -l 4 -esp 1 -override' \
-	'otl -block 1 -esp 0 -otl 0' \
-	'param-split -f -1' \
-	'pouchet -f 3 -l 7' \
-	'stride -f -1 -strides 1' \
-	'stride2 -f -1 -strides 1' \
-	'sor1d -f -1'
-
-EXTRA_DIST = \
-	$(CLOOGTEST_C:%=%.cloog) \
-	$(CLOOGTEST_C:%=%.c) \
-	$(FINITE_CLOOGTEST_C:%=%.good.c) \
-	$(CLOOGTEST_FORTRAN:%=%.cloog) \
-	$(CLOOGTEST_FORTRAN:%=%.f) \
-	$(CLOOGTEST_STRIDED:%=%.cloog) \
-	$(CLOOGTEST_STRIDED:%=%.c) \
-	$(SPECIAL_TESTS:%=%.cloog) \
-	$(SPECIAL_TESTS:%=%.c) \
-	$(SPECIAL_TESTS:%=%.good.c)
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign test/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-clean-noinstPROGRAMS:
-	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
-	echo " rm -f" $$list; \
-	rm -f $$list || exit $$?; \
-	test -n "$(EXEEXT)" || exit 0; \
-	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
-	echo " rm -f" $$list; \
-	rm -f $$list
-generate_test$(EXEEXT): $(generate_test_OBJECTS) $(generate_test_DEPENDENCIES) 
-	@rm -f generate_test$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(generate_test_OBJECTS) $(generate_test_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generate_test.Po@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c $<
-
-.c.obj:
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.c.lo:
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(PROGRAMS)
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
-	mostlyclean-am
-
-distclean: distclean-am
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool clean-noinstPROGRAMS ctags distclean \
-	distclean-compile distclean-generic distclean-libtool \
-	distclean-tags distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-	pdf pdf-am ps ps-am tags uninstall uninstall-am
-
-
-FORCE:
-../libcloog-isl.la: FORCE
-	cd ..; $(MAKE) $(AM_MAKEFLAGS) libcloog-isl.la
-
-generate:
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *                 Generate files                *"
-	@echo "              *-----------------------------------------------*/"
-	@for x in $(CLOOGTEST_C) ; do \
-		echo "Generate $$x.c" ; \
-		$(top_builddir)/cloog $(srcdir)/$$x.cloog -o $(srcdir)/$$x.c ; \
-	done ; \
-	for x in $(CLOOGTEST_FORTRAN) ; do \
-		echo "Generate $$x.f" ; \
-		$(top_builddir)/cloog $(srcdir)/$$x.cloog -o $(srcdir)/$$x.f ; \
-	done ; \
-	for x in $(CLOOGTEST_STRIDED) ; do \
-		echo "Generate $$x.c" ; \
-		$(top_builddir)/cloog $(srcdir)/$$x.cloog \
-			-strides 1 -o $(srcdir)/$$x.c ; \
-	done ; \
-	for line in $(SPECIAL_OPTIONS); do echo $$line | while read x options; do \
-		echo "Generate file $$x ($$options)" ; \
-		$(top_builddir)/cloog$(EXEEXT) $(srcdir)/$$x.cloog \
-		    $$options > $(srcdir)/$$x.c ; \
-	done; done
-
-generate_good:
-	@for x in $(FINITE_CLOOGTEST_C) ; do \
-		echo "Generate $$x.good.c" ; \
-		$(top_builddir)/cloog$(EXEEXT) -callable 1 $(srcdir)/$$x.cloog -o $(srcdir)/$$x.good.c ; \
-	done; \
-	for line in $(SPECIAL_OPTIONS); do echo $$line | while read x options; do \
-		echo "Generate $$x.good.c ($$options)" ; \
-		$(top_builddir)/cloog$(EXEEXT) -callable 1 $$options $(srcdir)/$$x.cloog -o $(srcdir)/$$x.good.c ; \
-	done; done
-
-valgrind:
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *            Checking files by Valgrind         *"
-	@echo "              *-----------------------------------------------*/"
-	for x in $(CLOOGTEST_C) ; do \
-		echo "Valgrinding $$x.c" ; \
-		valgrind $(top_builddir)/cloog$(EXEEXT) $(srcdir)/$$x.cloog ; \
-	done ; \
-	for x in $(CLOOGTEST_FORTRAN) ; do \
-		echo "Valgrinding $$x.f" ; \
-		valgrind $(top_builddir)/cloog$(EXEEXT) $(srcdir)/$$x.cloog ; \
-	done
-
-test_run: generate_test$(EXEEXT)
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *                 Testing CLooG                 *"
-	@echo "              *-----------------------------------------------*/"
-	@failedtest=0 ; \
-	echo "--- Testing C files... (correct output)" ; \
-	for x in $(FINITE_CLOOGTEST_C) ; do \
-		echo -n "Verify file $$x... " ; \
-		echo -n "generating... " ; \
-		$(top_builddir)/cloog$(EXEEXT) -q -callable 1 $(srcdir)/$$x.cloog > test_test.c ; \
-		./generate_test$(EXEEXT) < $(srcdir)/$$x.cloog > test_main.c; \
-		echo -n "compiling... " ; \
-		$(COMPILE) -c test_test.c; \
-		$(COMPILE) -Dtest=good -c $(srcdir)/$$x.good.c -o test_good.o; \
-		$(LINK) test_main.c test_test.o test_good.o > /dev/null; \
-		echo -n "comparing... " ; \
-		./test_run$(EXEEXT); \
-		result=$$?; \
-		if test "$$result" -ne "0" ; then \
-			failedtest=`expr $$failedtest + 1` ; \
-		fi; \
-		$(RM) $@; \
-		echo; \
-	done; \
-	for line in $(SPECIAL_OPTIONS); do echo $$line | while read x options; do \
-		echo -n "Verify file $$x ($$options)... " ; \
-		echo -n "generating... " ; \
-		$(top_builddir)/cloog$(EXEEXT) -q -callable 1 $$options $(srcdir)/$$x.cloog > test_test.c ; \
-		./generate_test$(EXEEXT) < $(srcdir)/$$x.cloog > test_main.c; \
-		echo -n "compiling... " ; \
-		$(COMPILE) -c test_test.c; \
-		$(COMPILE) -Dtest=good -c $(srcdir)/$$x.good.c -o test_good.o; \
-		$(LINK) test_main.c test_test.o test_good.o > /dev/null; \
-		echo -n "comparing... " ; \
-		./test_run$(EXEEXT); \
-		result=$$?; \
-		if test "$$result" -ne "0" ; then \
-			failedtest=`expr $$failedtest + 1` ; \
-		fi; \
-		$(RM) $@; \
-		echo; \
-	done; done; \
-	for line in $(SPECIAL_OPTIONS); do echo $$line | while read x options; do \
-		echo -n "Verify file $$x ($$options -sh 1)... " ; \
-		echo -n "generating... " ; \
-		$(top_builddir)/cloog$(EXEEXT) -q -callable 1 $$options -sh 1 $(srcdir)/$$x.cloog > test_test.c ; \
-		./generate_test$(EXEEXT) < $(srcdir)/$$x.cloog > test_main.c; \
-		echo -n "compiling... " ; \
-		$(COMPILE) -c test_test.c; \
-		$(COMPILE) -Dtest=good -c $(srcdir)/$$x.good.c -o test_good.o; \
-		$(LINK) test_main.c test_test.o test_good.o > /dev/null; \
-		echo -n "comparing... " ; \
-		./test_run$(EXEEXT); \
-		result=$$?; \
-		if test "$$result" -ne "0" ; then \
-			failedtest=`expr $$failedtest + 1` ; \
-		fi; \
-		$(RM) $@; \
-		echo; \
-	done; done; \
-	if [ $$failedtest != 0 ] ; then \
-		echo "$$failedtest tests failed" ; \
-	else \
-	        echo "CLooG works correctly :-) !" ; \
-        fi
-test:
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *                 Testing CLooG                 *"
-	@echo "              *-----------------------------------------------*/"
-	@failedtest=0 ; \
-	echo "--- Testing C files... (expected output)" ; \
-	for x in $(CLOOGTEST_C) ; do \
-		echo "Verify file $$x" ; \
-		$(top_builddir)/cloog$(EXEEXT) $(srcdir)/$$x.cloog > ttemp ; \
-		diff -u -w --ignore-matching-lines='CLooG' ttemp $(srcdir)/$$x.c ; \
-		result=$$?; \
-		if [ "$$result" -ne "0" ] ; then \
-			echo "!!! Error: $$x is not the same" ; \
-			failedtest=`expr $$failedtest + 1` ; \
-		else \
-			echo "$$x passed" ; \
-	        fi ; \
-	done ; \
-	echo "--- Testing FORTRAN files..." ; \
-	for x in $(CLOOGTEST_FORTRAN) ; do \
-		echo "Verify file $$x" ; \
-		$(top_builddir)/cloog$(EXEEXT) $(srcdir)/$$x.cloog > ttemp ; \
-		diff -u -w --ignore-matching-lines='CLooG' ttemp $(srcdir)/$$x.f ; \
-		result=$$?; \
-		if [ "$$result" -ne "0" ] ; then \
-			echo "!!! Error: $$x is not the same" ; \
-			failedtest=`expr $$failedtest + 1` ; \
-		else \
-			echo "$$x passed" ; \
-	        fi ; \
-	done ; \
-	echo "--- Testing STRIDED files..." ; \
-	for x in $(CLOOGTEST_STRIDED) ; do \
-		echo "Verify file $$x" ; \
-		$(top_builddir)/cloog$(EXEEXT) $(srcdir)/$$x.cloog \
-		-strides 1 > ttemp ; \
-		diff -u -w --ignore-matching-lines='CLooG' ttemp $(srcdir)/$$x.c ; \
-		result=$$?; \
-		if [ "$$result" -ne "0" ] ; then \
-			echo "!!! Error: $$x is not the same" ; \
-			failedtest=`expr $$failedtest + 1` ; \
-		else \
-			echo "$$x passed" ; \
-	        fi ; \
-	done ; \
-	echo "--- Testing SPECIAL OPTIONS files..." ; \
-	for line in $(SPECIAL_OPTIONS); do echo $$line | while read x options; do \
-	        echo "Verify file $$x ($$options)" ; \
-		$(top_builddir)/cloog$(EXEEXT) $(srcdir)/$$x.cloog \
-			$$options > ttemp ; \
-		diff -u -w --ignore-matching-lines='CLooG' ttemp $(srcdir)/$$x.c ; \
-		result=$$?; \
-		if [ "$$result" -ne "0" ] ; then \
-			echo "!!! Error: $$x is not the same" ; \
-			failedtest=`expr $$failedtest + 1` ; \
-		else \
-			echo "$$x passed" ; \
-	        fi ; \
-	done; done; \
-	rm ttemp ; \
-	if [ $$failedtest != 0 ] ; then \
-		echo "$$failedtest tests failed" ; \
-	else \
-	        echo "CLooG works correctly :-) !" ; \
-        fi
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/cloog-0.16.3/test/backtrack.c b/cloog-0.16.3/test/backtrack.c
deleted file mode 100644
index 9895d83..0000000
--- a/cloog-0.16.3/test/backtrack.c
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Generated from ../../../git/cloog/test/backtrack.cloog by CLooG 0.14.0-367-gf043665 gmp bits in 0.00s. */
-S1(0);
diff --git a/cloog-0.16.3/test/backtrack.cloog b/cloog-0.16.3/test/backtrack.cloog
deleted file mode 100644
index f8d978e..0000000
--- a/cloog-0.16.3/test/backtrack.cloog
+++ /dev/null
@@ -1,24 +0,0 @@
-c
-
-0 2
-
-0
-
-# Number of statements
-1
-
-1 # of domains
-1 3
-0 1 0
-0 0 0
-
-0
-
-# of scattering functions
-1
-
-2 5
-0 1 0 -1 0 
-0 0 1  0 0 
-
-0
diff --git a/cloog-0.16.3/test/backtrack.good.c b/cloog-0.16.3/test/backtrack.good.c
deleted file mode 100644
index 5cb04a3..0000000
--- a/cloog-0.16.3/test/backtrack.good.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated from ../../../git/cloog/test/backtrack.cloog by CLooG 0.14.0-367-gf043665 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int c1;
-  /* Original iterators. */
-  int i;
-  S1(0);
-}
diff --git a/cloog-0.16.3/test/basic-bounds-1.c b/cloog-0.16.3/test/basic-bounds-1.c
deleted file mode 100644
index 1ddede1..0000000
--- a/cloog-0.16.3/test/basic-bounds-1.c
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-1.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (i=0;i<=2;i++) {
-  S1(i) ;
-}
diff --git a/cloog-0.16.3/test/basic-bounds-1.cloog b/cloog-0.16.3/test/basic-bounds-1.cloog
deleted file mode 100644
index 1c3ac40..0000000
--- a/cloog-0.16.3/test/basic-bounds-1.cloog
+++ /dev/null
@@ -1,21 +0,0 @@
-# language: C
-c
-
-# Context
-1 2
-1 1
-0
-
-1 # Number of statements
-
-1
-#
-3 3
-#  i  1
-1  1  0
-1 -1  2
-1  0  1 
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/basic-bounds-1.good.c b/cloog-0.16.3/test/basic-bounds-1.good.c
deleted file mode 100644
index ab53e94..0000000
--- a/cloog-0.16.3/test/basic-bounds-1.good.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-
-void test()
-{
-  /* Original iterators. */
-  int i;
-  for (i=0;i<=2;i++) {
-    S1(i) ;
-  }
-}
diff --git a/cloog-0.16.3/test/basic-bounds-2.c b/cloog-0.16.3/test/basic-bounds-2.c
deleted file mode 100644
index 38780ff..0000000
--- a/cloog-0.16.3/test/basic-bounds-2.c
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-S1(0) ;
diff --git a/cloog-0.16.3/test/basic-bounds-2.cloog b/cloog-0.16.3/test/basic-bounds-2.cloog
deleted file mode 100644
index 45a51ba..0000000
--- a/cloog-0.16.3/test/basic-bounds-2.cloog
+++ /dev/null
@@ -1,21 +0,0 @@
-# language: C
-c
-
-# Context
-1 2
-1 1
-0
-
-1 # Number of statements
-
-1
-#
-3 3
-#  i  1
-1  3  0
-1 -3  2
-1  0  1 
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/basic-bounds-2.good.c b/cloog-0.16.3/test/basic-bounds-2.good.c
deleted file mode 100644
index 48544ff..0000000
--- a/cloog-0.16.3/test/basic-bounds-2.good.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-
-void test()
-{
-  /* Original iterators. */
-  int i;
-  S1(0) ;
-}
diff --git a/cloog-0.16.3/test/basic-bounds-3.c b/cloog-0.16.3/test/basic-bounds-3.c
deleted file mode 100644
index f5fdaf8..0000000
--- a/cloog-0.16.3/test/basic-bounds-3.c
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-3.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (i=0;i<=M;i++) {
-  S1(i) ;
-}
diff --git a/cloog-0.16.3/test/basic-bounds-3.cloog b/cloog-0.16.3/test/basic-bounds-3.cloog
deleted file mode 100644
index f3ad8bc..0000000
--- a/cloog-0.16.3/test/basic-bounds-3.cloog
+++ /dev/null
@@ -1,23 +0,0 @@
-# language: C
-c
-
-# Context
-2 3
-# M 1
-1 1 0
-1 0 1
-0
-
-1 # Number of statements
-
-1
-#
-3 4
-#  i  M  1
-1  1  0  0
-1 -1  1  0
-1  0  0  1  
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/basic-bounds-3.good.c b/cloog-0.16.3/test/basic-bounds-3.good.c
deleted file mode 100644
index c5c0f7c..0000000
--- a/cloog-0.16.3/test/basic-bounds-3.good.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-3.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i;
-  for (i=0;i<=M;i++) {
-    S1(i) ;
-  }
-}
diff --git a/cloog-0.16.3/test/basic-bounds-4.c b/cloog-0.16.3/test/basic-bounds-4.c
deleted file mode 100644
index 1f15c42..0000000
--- a/cloog-0.16.3/test/basic-bounds-4.c
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-4.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (i=0;i<=M+1;i++) {
-  S1(i) ;
-}
diff --git a/cloog-0.16.3/test/basic-bounds-4.cloog b/cloog-0.16.3/test/basic-bounds-4.cloog
deleted file mode 100644
index 5e76687..0000000
--- a/cloog-0.16.3/test/basic-bounds-4.cloog
+++ /dev/null
@@ -1,23 +0,0 @@
-# language: C
-c
-
-# Context
-2 3
-# M 1
-1 1 0
-1 0 1
-0
-
-1 # Number of statements
-
-1
-#
-3 4
-#  i  M  1
-1  1  0  0
-1 -1  1  1
-1  0  0  1  
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/basic-bounds-4.good.c b/cloog-0.16.3/test/basic-bounds-4.good.c
deleted file mode 100644
index 310c948..0000000
--- a/cloog-0.16.3/test/basic-bounds-4.good.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-4.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i;
-  for (i=0;i<=M+1;i++) {
-    S1(i) ;
-  }
-}
diff --git a/cloog-0.16.3/test/basic-bounds-5.c b/cloog-0.16.3/test/basic-bounds-5.c
deleted file mode 100644
index 1761b56..0000000
--- a/cloog-0.16.3/test/basic-bounds-5.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-5.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-j = floord(M+1,2) ;
-S1(1,j) ;
diff --git a/cloog-0.16.3/test/basic-bounds-5.cloog b/cloog-0.16.3/test/basic-bounds-5.cloog
deleted file mode 100644
index 855a9bb..0000000
--- a/cloog-0.16.3/test/basic-bounds-5.cloog
+++ /dev/null
@@ -1,22 +0,0 @@
-# language: C
-c
-
-# Context
-1 3
-# M 1
-1 0 1
-0
-
-1 # Number of statements
-
-1
-# {i,j,N | i=1; 2j-1<=N<=2j}
-3 5
-#  i  j  M  1
-0  1  0  0 -1
-1  0  2 -1  0
-1  0 -2  1  1
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/basic-bounds-5.good.c b/cloog-0.16.3/test/basic-bounds-5.good.c
deleted file mode 100644
index 3e669c0..0000000
--- a/cloog-0.16.3/test/basic-bounds-5.good.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-5.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j;
-  j = floord(M+1,2) ;
-  S1(1,j) ;
-}
diff --git a/cloog-0.16.3/test/basic-bounds-6.c b/cloog-0.16.3/test/basic-bounds-6.c
deleted file mode 100644
index 449ad37..0000000
--- a/cloog-0.16.3/test/basic-bounds-6.c
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-6.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-S1(-1) ;
diff --git a/cloog-0.16.3/test/basic-bounds-6.cloog b/cloog-0.16.3/test/basic-bounds-6.cloog
deleted file mode 100644
index 2acc2ab..0000000
--- a/cloog-0.16.3/test/basic-bounds-6.cloog
+++ /dev/null
@@ -1,20 +0,0 @@
-# language: C
-c
-
-# Context
-1 2
-1 1
-0
-
-1 # Number of statements
-
-1
-3 3
-#  i  1
-1  2  3
-1 -2 -1
-1  0  1 
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/basic-bounds-6.good.c b/cloog-0.16.3/test/basic-bounds-6.good.c
deleted file mode 100644
index a993e2f..0000000
--- a/cloog-0.16.3/test/basic-bounds-6.good.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-6.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-
-void test()
-{
-  /* Original iterators. */
-  int i;
-  S1(-1) ;
-}
diff --git a/cloog-0.16.3/test/block.c b/cloog-0.16.3/test/block.c
deleted file mode 100644
index 2ba5668..0000000
--- a/cloog-0.16.3/test/block.c
+++ /dev/null
@@ -1,5 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/block.cloog by CLooG 0.14.0-170-g72daac3 gmp bits in 0.00s. */
-S1();
-S3(0);
-S2();
-S3(1);
diff --git a/cloog-0.16.3/test/block.cloog b/cloog-0.16.3/test/block.cloog
deleted file mode 100644
index 9913b74..0000000
--- a/cloog-0.16.3/test/block.cloog
+++ /dev/null
@@ -1,42 +0,0 @@
-c
-
-0 2
-
-0
-
-3
-
-1
-0 2
-
-0 0 0
-
-1
-0 2
-
-0 0 0
-
-1
-2 3
-1 1 0
-1 -1 1
-
-0 0 0
-
-0
-
-3
-
-2 4
-0 -1 0 0		# c1 = 0
-0 0 -1 0		# c2 = 0
-
-2 4
-0 -1 0 1		# c1 = 1
-0 0 -1 0		# c2 = 0
-
-2 5
-0 -1 0 1 0		# c1 = i
-0 0 -1 0 1		# c2 = 1
-
-0
diff --git a/cloog-0.16.3/test/block.good.c b/cloog-0.16.3/test/block.good.c
deleted file mode 100644
index b2f280f..0000000
--- a/cloog-0.16.3/test/block.good.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/block.cloog by CLooG 0.14.0-170-g72daac3 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1() { hash(1); }
-#define S2() { hash(2); }
-#define S3(i) { hash(3); hash(i); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int c1;
-  /* Original iterators. */
-  int i;
-  S1();
-  S3(0);
-  S2();
-  S3(1);
-}
diff --git a/cloog-0.16.3/test/block2.c b/cloog-0.16.3/test/block2.c
deleted file mode 100644
index 7209a10..0000000
--- a/cloog-0.16.3/test/block2.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/block2.cloog by CLooG 0.14.0-302-g309b32c gmp bits in 0.01s. */
-for (c0=0;c0<=9;c0++) {
-  S1(c0,1);
-  S3(c0,1);
-  S2(c0,1);
-}
diff --git a/cloog-0.16.3/test/block2.cloog b/cloog-0.16.3/test/block2.cloog
deleted file mode 100644
index 866c634..0000000
--- a/cloog-0.16.3/test/block2.cloog
+++ /dev/null
@@ -1,77 +0,0 @@
-# CLooG -> CLooG
-# This is an automatic dump of a CLooG input file from a CloogInput data
-# structure.
-
-# Language: C
-c
-
-# Context:
-0 2
-
-0 # Parameter name(s)
-
-# Statement number:
-3
-
-# Iteration domain of statement 5 (ND_1IP_ED_0_0_V_0).
-1
-
-3 4
-0     0     1    -1
-1     1     0     0
-1    -1     0     9
-
-0 0 0 # For future options.
-
-# Iteration domain of statement 6 (ND_1OP_ED_3_0_V_1).
-1
-
-3 4
-0     0     1    -1
-1     1     0     0
-1    -1     0     9
-
-0 0 0 # For future options.
-
-# Iteration domain of statement 7 (ND_1).
-1
-
-3 4
-0     0     1    -1
-1     1     0     0
-1    -1     0     9
-
-0 0 0 # For future options.
-
-
-0 # Iterator name(s)
-
-# --------------------- SCATTERING --------------------
-3 # Scattering functions
-
-# Scattering of statement 5 (ND_1IP_ED_0_0_V_0).
-1
-
-3 7
-0     0     0     1     0     0    -6
-0     0     1     0     0    -1     0
-0     1     0     0    -1     0     0
-
-# Scattering of statement 6 (ND_1OP_ED_3_0_V_1).
-1
-
-3 7
-0     0     0     1     0     0   -11
-0     0     1     0     0    -1     0
-0     1     0     0    -1     0     0
-
-# Scattering of statement 7 (ND_1).
-1
-
-3 7
-0     0     0     1     0     0    -8
-0     0     1     0     0    -1     0
-0     1     0     0    -1     0     0
-
-1 # Scattering dimension name(s)
-c0 c1 c2 
diff --git a/cloog-0.16.3/test/block2.good.c b/cloog-0.16.3/test/block2.good.c
deleted file mode 100644
index 23a4942..0000000
--- a/cloog-0.16.3/test/block2.good.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/block2.cloog by CLooG 0.14.0-302-g309b32c gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int c0, c1;
-  /* Original iterators. */
-  int i, j;
-  for (c0=0;c0<=9;c0++) {
-    S1(c0,1);
-    S3(c0,1);
-    S2(c0,1);
-  }
-}
diff --git a/cloog-0.16.3/test/block3.c b/cloog-0.16.3/test/block3.c
deleted file mode 100644
index 2c701e9..0000000
--- a/cloog-0.16.3/test/block3.c
+++ /dev/null
@@ -1,5 +0,0 @@
-/* Generated from ../../../git/cloog/test/block3.cloog by CLooG 0.16.2-4-gba4e834 gmp bits in 0.00s. */
-S1();
-S3(0);
-S2();
-S3(1);
diff --git a/cloog-0.16.3/test/block3.cloog b/cloog-0.16.3/test/block3.cloog
deleted file mode 100644
index fd9997d..0000000
--- a/cloog-0.16.3/test/block3.cloog
+++ /dev/null
@@ -1,36 +0,0 @@
-C
-
-0 2
-
-0
-
-3
-
-1
-0 2
-0 0 0
-
-1
-0 2
-0 0 0
-
-1
-2 3
-1 1 0
-1 -1 1
-0 0 0
-
-0
-
-3
-
-1 3
-0 -1 0
-
-1 3
-0 -1 1
-
-1 4
-0 -1 1 0
-
-0
diff --git a/cloog-0.16.3/test/block3.good.c b/cloog-0.16.3/test/block3.good.c
deleted file mode 100644
index b4bdf6d..0000000
--- a/cloog-0.16.3/test/block3.good.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Generated from ../../../git/cloog/test/block3.cloog by CLooG 0.16.2-4-gba4e834 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1() { hash(1); }
-#define S2() { hash(2); }
-#define S3(i) { hash(3); hash(i); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int c1;
-  /* Original iterators. */
-  int i;
-  S1();
-  S3(0);
-  S2();
-  S3(1);
-}
diff --git a/cloog-0.16.3/test/byu98-1-2-3.c b/cloog-0.16.3/test/byu98-1-2-3.c
deleted file mode 100644
index 2a1e151..0000000
--- a/cloog-0.16.3/test/byu98-1-2-3.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/byu98-1-2-3.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.01s. */
-for (i=2;i<=3;i++) {
-  for (j=-i+6;j<=6;j++) {
-    S1(i,j);
-  }
-}
-for (i=4;i<=7;i++) {
-  if (i == 4) {
-    for (j=3;j<=4;j++) {
-      S1(i,j);
-    }
-  }
-  if (i >= 6) {
-    S2(i,-i+9);
-  }
-  if (i <= 5) {
-    S1(i,-i+9);
-    S2(i,-i+9);
-  }
-  for (j=max(-i+10,i-1);j<=6;j++) {
-    S1(i,j);
-  }
-}
-S2(8,1);
diff --git a/cloog-0.16.3/test/byu98-1-2-3.cloog b/cloog-0.16.3/test/byu98-1-2-3.cloog
deleted file mode 100644
index 76d16ab..0000000
--- a/cloog-0.16.3/test/byu98-1-2-3.cloog
+++ /dev/null
@@ -1,65 +0,0 @@
-# Here is the result given by an old CLooG (the same was given up to 0.12.2),
-# the difference with the new constant spreading technique of 0.14.0 is
-# one of the most beautiful.
-#
-# /* Generated by CLooG v0.10.7 */
-# for (i=2;i<=3;i++) {
-#   for (j=-i+6;j<=6;j++) {
-#     S1 ;
-#   }
-# }
-# for (j=4-1;j<=-(4)+8;j++) {
-#   S1(i = 4) ;
-# }
-# j = -(4)+9 ;
-# S1(i = 4) ;
-# S2(i = 4) ;
-# for (j=-(4)+10;j<=6;j++) {
-#   S1(i = 4) ;
-# }
-# S1(i = 5,j = 4) ;
-# S2(i = 5,j = 4) ;
-# for (j=5;j<=6;j++) {
-#   S1(i = 5) ;
-# }
-# for (i=6;i<=7;i++) {
-#   j = -i+9 ;
-#   S2 ;
-#   for (j=i-1;j<=6;j++) {
-#     S1 ;
-#   }
-# }
-# S2(i = 8,j = 1) ;
-
-# language: C
-c
-
-# Context
-#{ | 1>=0}
-1   2
-1   1
-0
-
-2 # Number of statements
-
-1
-# {i,j | (-j+6,2)<=i<=j+1; 3<=j<=6}
-5 4
-#  i  j  1
-1  1  1 -6
-1  1  0 -2
-1  0  1 -3
-1  0 -1  6
-1 -1  1  1
-0  0  0
-
-1
-# {i,j | i=-j+9; 1<=j<=5}
-3 4
-0  1  1 -9
-1  0  1 -1
-1  0 -1  5
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/byu98-1-2-3.good.c b/cloog-0.16.3/test/byu98-1-2-3.good.c
deleted file mode 100644
index d1ad156..0000000
--- a/cloog-0.16.3/test/byu98-1-2-3.good.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Generated from ../../../git/cloog/test/byu98-1-2-3.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test()
-{
-  /* Original iterators. */
-  int i, j;
-  for (i=2;i<=3;i++) {
-    for (j=-i+6;j<=6;j++) {
-      S1(i,j) ;
-    }
-  }
-  for (j=3;j<=4;j++) {
-    S1(4,j) ;
-  }
-  S1(4,5) ;
-  S2(4,5) ;
-  S1(4,6) ;
-  S1(5,4) ;
-  S2(5,4) ;
-  for (j=5;j<=6;j++) {
-    S1(5,j) ;
-  }
-  for (i=6;i<=7;i++) {
-    j = -i+9 ;
-    S2(i,-i+9) ;
-    for (j=i-1;j<=6;j++) {
-      S1(i,j) ;
-    }
-  }
-  S2(8,1) ;
-}
diff --git a/cloog-0.16.3/test/cholesky.c b/cloog-0.16.3/test/cholesky.c
deleted file mode 100644
index a0d08fc..0000000
--- a/cloog-0.16.3/test/cholesky.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Generated from ../../../git/cloog/test/cholesky.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.04s. */
-if (n >= 1) {
-  if (n >= 2) {
-    S1(1) ;
-    S3(1) ;
-    for (c3=2;c3<=n;c3++) {
-      S4(1,c3) ;
-      S6(1,c3) ;
-    }
-  }
-  if (n == 1) {
-    S1(1) ;
-    S3(1) ;
-  }
-  for (c1=2;c1<=n-1;c1++) {
-    S1(c1) ;
-    for (c3=1;c3<=c1-1;c3++) {
-      S2(c1,c3) ;
-    }
-    S3(c1) ;
-    for (c3=c1+1;c3<=n;c3++) {
-      S4(c1,c3) ;
-      for (c5=1;c5<=c1-1;c5++) {
-        S5(c1,c3,c5) ;
-      }
-      S6(c1,c3) ;
-    }
-  }
-  if (n >= 2) {
-    S1(n) ;
-    for (c3=1;c3<=n-1;c3++) {
-      S2(n,c3) ;
-    }
-    S3(n) ;
-  }
-}
diff --git a/cloog-0.16.3/test/cholesky.cloog b/cloog-0.16.3/test/cholesky.cloog
deleted file mode 100644
index a3eadea..0000000
--- a/cloog-0.16.3/test/cholesky.cloog
+++ /dev/null
@@ -1,129 +0,0 @@
-# language: C
-c
-
-# parameter n
-1 3
-#  n  1
-1  0  1
-1
-n
-
-6 # Number of statements
-
-1
-# S1 {i | 1<=i<=n}
-2 4
-#  i  n  1
-1  1  0 -1
-1 -1  1  0
-0 0 0
-
-1
-# S2 {i, j | 1<=i<=n; 1<=j<=i-1}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1  0  1  0 -1
-1  1 -1  0 -1
-0 0 0
-
-1
-# S3 {i | 1<=i<=n}
-2 4
-#  i  n  1
-1  1  0 -1
-1 -1  1  0
-0 0 0
-
-1
-# S4 {i, j | 1<=i<=n; i+1<=j<=n}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1 -1  1  0 -1
-1  0 -1  1  0
-0 0 0
-
-1
-# S5 {i, j, k | 1<=i<=n; i+1<=j<=n 1<=k<=i-1}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1 -1  1  0  0 -1
-1  0 -1  0  1  0
-1  0  0  1  0 -1
-1  1  0 -1  0 -1
-0 0 0
-
-1
-# S6 {i, j | 1<=i<=n; i+1<=j<=n}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1 -1  1  0 -1
-1  0 -1  1  0
-0 0 0
-0
-
-6 # Scattering functions
-# Et les instructions de chunking (prog init)...
-6 10
-# c1 c2 c3 c4 c5 c6  i  n  1
-0  1  0  0  0  0  0 -1  0  0
-0  0  1  0  0  0  0  0  0 -1
-0  0  0  1  0  0  0  0  0  0
-0  0  0  0  1  0  0  0  0  0
-0  0  0  0  0  1  0  0  0  0
-0  0  0  0  0  0  1  0  0  0
-
-6 11
-# c1 c2 c3 c4 c5 c6  i  j  n  1
-0  1  0  0  0  0  0 -1  0  0  0
-0  0  1  0  0  0  0  0  0  0 -2
-0  0  0  1  0  0  0  0 -1  0  0
-0  0  0  0  1  0  0  0  0  0 -1
-0  0  0  0  0  1  0  0  0  0  0
-0  0  0  0  0  0  1  0  0  0  0
-
-6 10
-# c1 c2 c3 c4 c5 c6  i  n  1
-0  1  0  0  0  0  0 -1  0  0
-0  0  1  0  0  0  0  0  0 -3
-0  0  0  1  0  0  0  0  0  0
-0  0  0  0  1  0  0  0  0  0
-0  0  0  0  0  1  0  0  0  0
-0  0  0  0  0  0  1  0  0  0
-
-6 11
-# c1 c2 c3 c4 c5 c6  i  j  n  1
-0  1  0  0  0  0  0 -1  0  0  0
-0  0  1  0  0  0  0  0  0  0 -4
-0  0  0  1  0  0  0  0 -1  0  0
-0  0  0  0  1  0  0  0  0  0 -1
-0  0  0  0  0  1  0  0  0  0  0
-0  0  0  0  0  0  1  0  0  0  0
-
-6 12
-# c1 c2 c3 c4 c5 c6  i  j  k  n  1
-0  1  0  0  0  0  0 -1  0  0  0  0
-0  0  1  0  0  0  0  0  0  0  0 -4
-0  0  0  1  0  0  0  0 -1  0  0  0
-0  0  0  0  1  0  0  0  0  0  0 -2
-0  0  0  0  0  1  0  0  0 -1  0  0
-0  0  0  0  0  0  1  0  0  0  0 -1
-
-6 11
-# c1 c2 c3 c4 c5 c6  i  j  n  1
-0  1  0  0  0  0  0 -1  0  0  0
-0  0  1  0  0  0  0  0  0  0 -4
-0  0  0  1  0  0  0  0 -1  0  0
-0  0  0  0  1  0  0  0  0  0 -3
-0  0  0  0  0  1  0  0  0  0  0
-0  0  0  0  0  0  1  0  0  0  0
-0
-
-
diff --git a/cloog-0.16.3/test/cholesky.good.c b/cloog-0.16.3/test/cholesky.good.c
deleted file mode 100644
index 7619b7e..0000000
--- a/cloog-0.16.3/test/cholesky.good.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Generated from ../../../git/cloog/test/cholesky.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.05s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i) { hash(3); hash(i); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-#define S5(i,j,k) { hash(5); hash(i); hash(j); hash(k); }
-#define S6(i,j) { hash(6); hash(i); hash(j); }
-
-void test(int n)
-{
-  /* Scattering iterators. */
-  int c1, c3, c5;
-  /* Original iterators. */
-  int i, j, k;
-  if (n >= 2) {
-    S1(1) ;
-    S3(1) ;
-    for (c3=2;c3<=n;c3++) {
-      S4(1,c3) ;
-      S6(1,c3) ;
-    }
-  }
-  if (n == 1) {
-    S1(1) ;
-    S3(1) ;
-  }
-  for (c1=2;c1<=n-1;c1++) {
-    S1(c1) ;
-    for (c3=1;c3<=c1-1;c3++) {
-      S2(c1,c3) ;
-    }
-    S3(c1) ;
-    for (c3=c1+1;c3<=n;c3++) {
-      S4(c1,c3) ;
-      for (c5=1;c5<=c1-1;c5++) {
-        S5(c1,c3,c5) ;
-      }
-      S6(c1,c3) ;
-    }
-  }
-  if (n >= 2) {
-    S1(n) ;
-    for (c3=1;c3<=n-1;c3++) {
-      S2(n,c3) ;
-    }
-    S3(n) ;
-  }
-}
diff --git a/cloog-0.16.3/test/cholesky2.c b/cloog-0.16.3/test/cholesky2.c
deleted file mode 100644
index 3141bdc..0000000
--- a/cloog-0.16.3/test/cholesky2.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/* Generated from ../../../git/cloog/test/cholesky2.cloog by CLooG 0.16.1-2-g33ac553 gmp bits in 0.02s. */
-if (M >= 1) {
-  for (c2=1;c2<=M-1;c2++) {
-    S1(c2);
-    for (c3=c2+1;c3<=M;c3++) {
-      S4(c2,c3);
-    }
-  }
-  S1(M);
-  S3(1);
-  if (M >= 3) {
-    S6(1,2);
-    for (c2=3;c2<=M;c2++) {
-      S6(1,c2);
-      for (i=2;i<=c2-1;i++) {
-        S5(i,c2,1);
-      }
-    }
-  }
-  if (M == 2) {
-    S6(1,2);
-  }
-  for (c1=3;c1<=3*M-7;c1++) {
-    if ((c1+2)%3 == 0) {
-      S3((c1+2)/3);
-    }
-    if (c1%3 == 0) {
-      S2((c1+3)/3,c1/3);
-    }
-    if ((c1+1)%3 == 0) {
-      S6((c1+1)/3,(c1+4)/3);
-    }
-    if (c1%3 == 0) {
-      S2((c1+6)/3,c1/3);
-    }
-    for (c2=ceild(c1+7,3);c2<=M;c2++) {
-      if ((c1+1)%3 == 0) {
-        S6((c1+1)/3,c2);
-      }
-      if (c1%3 == 0) {
-        S2(c2,c1/3);
-      }
-      if ((c1+1)%3 == 0) {
-        for (i=ceild(c1+4,3);i<=c2-1;i++) {
-          S5(i,c2,(c1+1)/3);
-        }
-      }
-    }
-  }
-  if (M >= 3) {
-    for (c2=M-1;c2<=M;c2++) {
-      S2(c2,M-2);
-    }
-  }
-  if (M >= 3) {
-    S3(M-1);
-  }
-  if (M >= 3) {
-    S6(M-1,M);
-  }
-  if (M >= 2) {
-    S2(M,M-1);
-  }
-  if (M >= 2) {
-    S3(M);
-  }
-}
diff --git a/cloog-0.16.3/test/cholesky2.cloog b/cloog-0.16.3/test/cholesky2.cloog
deleted file mode 100644
index 6c0a81a..0000000
--- a/cloog-0.16.3/test/cholesky2.cloog
+++ /dev/null
@@ -1,108 +0,0 @@
-# language: C
-c
-
-# parameter n
-1 3
-#  n  1
-1  0  1
-0
-
-6 # Number of statements
-
-1
-# S1 {i | 1<=i<=n}
-2 4
-#  i  n  1
-1  1  0 -1
-1 -1  1  0
-0  0  0
-
-1
-# S2 {i, j | 1<=i<=n; 1<=j<=i-1}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1  0  1  0 -1
-1  1 -1  0 -1
-0  0  0
-
-1
-# S3 {i | 1<=i<=n}
-2 4
-#  i  n  1
-1  1  0 -1
-1 -1  1  0
-0  0  0
-
-1
-# S4 {i, j | 1<=i<=n; i+1<=j<=n}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1 -1  1  0 -1
-1  0 -1  1  0
-0  0  0
-
-1
-# S5 {i, j, k | 1<=i<=n; i+1<=j<=n 1<=k<=i-1}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1 -1  1  0  0 -1
-1  0 -1  0  1  0
-1  0  0  1  0 -1
-1  1  0 -1  0 -1
-0  0  0
-
-1
-# S6 {i, j | 1<=i<=n; i+1<=j<=n}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1 -1  1  0 -1
-1  0 -1  1  0
-0  0  0
-0
-
-6 # Scattering functions
-# Et les instructions de chunking (parallele)...
-3 7
-# c1 c2 c3  i  n  1
-0  1  0  0  0  0  0
-0  0  1  0 -1  0  0
-0  0  0  1  0  0  0
-
-3 8
-# c1 c2 c3  i  j  n  1
-0  1  0  0  0 -3  0  0
-0  0  1  0 -1  0  0  0
-0  0  0  1  0  0  0  0
-
-3 7
-# c1 c2 c3  i  n  1
-0  1  0  0 -3  0  2
-0  0  1  0  0  0  0
-0  0  0  1  0  0  0
-
-3 8
-# c1 c2 c3  i  j  n  1
-0  1  0  0  0  0  0  0
-0  0  1  0 -1  0  0  0
-0  0  0  1  0 -1  0  0
-
-3 9
-# c1 c2 c3  i  j  k  n  1
-0  1  0  0  0  0 -3  0  1
-0  0  1  0  0 -1  0  0  0
-0  0  0  1  0  0 -1  0  0
-
-3 8
-# c1 c2 c3  i  j  n  1
-0  1  0  0 -3  0  0  1
-0  0  1  0  0 -1  0  0
-0  0  0  1  0  0  0  0
-0
diff --git a/cloog-0.16.3/test/cholesky2.good.c b/cloog-0.16.3/test/cholesky2.good.c
deleted file mode 100644
index ee4b344..0000000
--- a/cloog-0.16.3/test/cholesky2.good.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/* Generated from ../../../git/cloog/test/cholesky2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.11s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i) { hash(3); hash(i); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-#define S5(i,j,k) { hash(5); hash(i); hash(j); hash(k); }
-#define S6(i,j) { hash(6); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c1, c2, c3;
-  /* Original iterators. */
-  int i, j, k;
-  if (M >= 2) {
-    for (c2=1;c2<=M-1;c2++) {
-      S1(c2) ;
-      for (c3=c2+1;c3<=M;c3++) {
-        S4(c2,c3) ;
-      }
-    }
-    S1(M) ;
-  }
-  if (M == 1) {
-    S1(1) ;
-  }
-  if (M >= 2) {
-    S3(1) ;
-  }
-  if (M >= 3) {
-    S6(1,2) ;
-    for (c2=3;c2<=M;c2++) {
-      S6(1,c2) ;
-      for (i=2;i<=c2-1;i++) {
-        S5(i,c2,1) ;
-      }
-    }
-  }
-  if (M == 2) {
-    S6(1,2) ;
-  }
-  for (c1=3;c1<=3*M-7;c1++) {
-    if ((c1+2)%3 == 0) {
-      i = (c1+2)/3 ;
-      S3((c1+2)/3) ;
-    }
-    if (c1%3 == 0) {
-      c2 = (c1+3)/3 ;
-      i = (c1+3)/3 ;
-      S2((c1+3)/3,c1/3) ;
-    }
-    c2 = floord(c1+6,3) ;
-    if ((c1+1)%3 == 0) {
-      i = (c1+1)/3 ;
-      S6((c1+1)/3,c2) ;
-    }
-    if (c1%3 == 0) {
-      S2(c2,c1/3) ;
-    }
-    for (c2=ceild(c1+7,3);c2<=M;c2++) {
-      if ((c1+1)%3 == 0) {
-        i = (c1+1)/3 ;
-        S6((c1+1)/3,c2) ;
-      }
-      if (c1%3 == 0) {
-        S2(c2,c1/3) ;
-      }
-      if ((c1+1)%3 == 0) {
-        c3 = (c1+1)/3 ;
-        for (i=ceild(c1+4,3);i<=c2-1;i++) {
-          k = (c1+1)/3 ;
-          S5(i,c2,(c1+1)/3) ;
-        }
-      }
-    }
-  }
-  for (c1=max(3*M-6,3);c1<=3*M-4;c1++) {
-    if ((c1+2)%3 == 0) {
-      i = (c1+2)/3 ;
-      S3((c1+2)/3) ;
-    }
-    if (c1%3 == 0) {
-      c2 = (c1+3)/3 ;
-      i = (c1+3)/3 ;
-      S2((c1+3)/3,c1/3) ;
-    }
-    for (c2=ceild(c1+4,3);c2<=M;c2++) {
-      if ((c1+1)%3 == 0) {
-        i = (c1+1)/3 ;
-        S6((c1+1)/3,c2) ;
-      }
-      if (c1%3 == 0) {
-        S2(c2,c1/3) ;
-      }
-    }
-  }
-  if (M >= 2) {
-    c1 = 3*M-3 ;
-    j = M-1 ;
-    S2(M,M-1) ;
-  }
-  if (M >= 1) {
-    c1 = 3*M-2 ;
-    S3(M) ;
-  }
-}
diff --git a/cloog-0.16.3/test/christian.c b/cloog-0.16.3/test/christian.c
deleted file mode 100644
index cc3c5d3..0000000
--- a/cloog-0.16.3/test/christian.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Generated from ../../../git/cloog/test/christian.cloog by CLooG 0.16.2-5-g3b3bf96 gmp bits in 0.01s. */
-if (N >= 1) {
-  S1(0,N-1);
-  for (p=-N+2;p<=N-1;p++) {
-    if (p >= 1) {
-      S2(p-1,0);
-    }
-    for (i=max(0,p);i<=min(N-1,p+N-2);i++) {
-      S1(i,-p+i);
-      S2(i,-p+i+1);
-    }
-    if (p <= 0) {
-      S1(p+N-1,N-1);
-    }
-  }
-  S2(N-1,0);
-}
diff --git a/cloog-0.16.3/test/christian.cloog b/cloog-0.16.3/test/christian.cloog
deleted file mode 100644
index 088977e..0000000
--- a/cloog-0.16.3/test/christian.cloog
+++ /dev/null
@@ -1,57 +0,0 @@
-# =============================================== Global
-# Language
-C
-
-# Context
-0 3
-
-# Parameter names are provided
-1
-# Parameter names
-N 
-
-# Number of statements
-2
-
-# =============================================== Statement 1
-# ----------------------------------------------  1.1 Domain
-# Iteration domain
-1
-4 5
-   1    1    0    0    0    ## i >= 0
-   1   -1    0    1   -1    ## -i+N-1 >= 0
-   1    0    1    0    0    ## j >= 0
-   1    0   -1    1   -1    ## -j+N-1 >= 0
-0 0 0
-
-# =============================================== Statement 2
-# ----------------------------------------------  2.1 Domain
-# Iteration domain
-1
-4 5
-   1    1    0    0    0    ## i >= 0
-   1   -1    0    1   -1    ## -i+N-1 >= 0
-   1    0    1    0    0    ## j >= 0
-   1    0   -1    1   -1    ## -j+N-1 >= 0
-0 0 0
-
-#naming for domains
-0
-
-# ---------------------------------------------- Scatterings
-# of Scattering functions
-2
-
-# Scattering function
-1 6
-   0   1   -1    1    0    0    ## p = i-j
-
-# Scattering function
-1 6
-   0   1   -1    1    0   -1    ## p = i-j+1
-
-
-# we will set the scattering dimension names
-1
-p
-
diff --git a/cloog-0.16.3/test/christian.good.c b/cloog-0.16.3/test/christian.good.c
deleted file mode 100644
index 28f578c..0000000
--- a/cloog-0.16.3/test/christian.good.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Generated from ../../../git/cloog/test/christian.cloog by CLooG 0.16.2-5-g3b3bf96 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int N)
-{
-  /* Scattering iterators. */
-  int p;
-  /* Original iterators. */
-  int i, j;
-  if (N >= 1) {
-    S1(0,N-1);
-    for (p=-N+2;p<=N-1;p++) {
-      if (p >= 1) {
-        S2(p-1,0);
-      }
-      for (i=max(0,p);i<=min(N-1,p+N-2);i++) {
-        S1(i,-p+i);
-        S2(i,-p+i+1);
-      }
-      if (p <= 0) {
-        S1(p+N-1,N-1);
-      }
-    }
-    S2(N-1,0);
-  }
-}
diff --git a/cloog-0.16.3/test/classen.c b/cloog-0.16.3/test/classen.c
deleted file mode 100644
index 3b5b05e..0000000
--- a/cloog-0.16.3/test/classen.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/classen.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.45s. */
-if (m >= 1) {
-  if (m >= 2) {
-    S1(0,1,1,1);
-    S2(0,1,1,1,1,1,2,1);
-    S3(0,1,1,2,1,1,1,2);
-    S4(0,1,2,2,1,1,2,2);
-    S8(0,1);
-  }
-  if (m == 1) {
-    S1(0,1,1,1);
-    S8(0,1);
-  }
-  for (glT1=1;glT1<=2*m-4;glT1++) {
-    if (glT1 <= m-2) {
-      S5(glT1-1,1,glT1,1,glT1,1,glT1+1,1);
-      S1(glT1,1,glT1+1,1);
-      S2(glT1,1,glT1+1,1,glT1+1,1,glT1+2,1);
-      S3(glT1,1,glT1+1,2,glT1+1,1,glT1+1,2);
-      S4(glT1,1,glT1+2,2,glT1+1,1,glT1+2,2);
-    }
-    if (glT1 >= m) {
-      S5(glT1-1,glT1-m+2,glT1,glT1-m+2,m-1,glT1-m+2,m,glT1-m+2);
-      S6(glT1-1,glT1-m+1,glT1,glT1-m+2,m,glT1-m+1,m,glT1-m+2);
-      S1(glT1,glT1-m+2,m,glT1-m+2);
-      S3(glT1,glT1-m+2,glT1+1,glT1-m+3,m,glT1-m+2,m,glT1-m+3);
-    }
-    if (glT1 == m-1) {
-      S5(m-2,1,m-1,1,m-1,1,m,1);
-      S1(m-1,1,m,1);
-      S3(m-1,1,m,2,m,1,m,2);
-    }
-    for (rp1=max(2,glT1-m+3);rp1<=min(glT1,m-1);rp1++) {
-      S5(glT1-1,rp1,glT1,rp1,glT1-rp1+1,rp1,glT1-rp1+2,rp1);
-      S6(glT1-1,rp1-1,glT1,rp1,glT1-rp1+2,rp1-1,glT1-rp1+2,rp1);
-      S7(glT1-1,rp1-1,glT1+1,rp1,glT1-rp1+2,rp1-1,glT1-rp1+3,rp1);
-      S1(glT1,rp1,glT1-rp1+2,rp1);
-      S2(glT1,rp1,glT1+1,rp1,glT1-rp1+2,rp1,glT1-rp1+3,rp1);
-      S3(glT1,rp1,glT1+1,rp1+1,glT1-rp1+2,rp1,glT1-rp1+2,rp1+1);
-      S4(glT1,rp1,glT1+2,rp1+1,glT1-rp1+2,rp1,glT1-rp1+3,rp1+1);
-    }
-    if (glT1 <= m-2) {
-      S6(glT1-1,glT1,glT1,glT1+1,1,glT1,1,glT1+1);
-      S7(glT1-1,glT1,glT1+1,glT1+1,1,glT1,2,glT1+1);
-      S1(glT1,glT1+1,1,glT1+1);
-      S2(glT1,glT1+1,glT1+1,glT1+1,1,glT1+1,2,glT1+1);
-      S3(glT1,glT1+1,glT1+1,glT1+2,1,glT1+1,1,glT1+2);
-      S4(glT1,glT1+1,glT1+2,glT1+2,1,glT1+1,2,glT1+2);
-    }
-    if (glT1 >= m) {
-      S5(glT1-1,m,glT1,m,glT1-m+1,m,glT1-m+2,m);
-      S6(glT1-1,m-1,glT1,m,glT1-m+2,m-1,glT1-m+2,m);
-      S7(glT1-1,m-1,glT1+1,m,glT1-m+2,m-1,glT1-m+3,m);
-      S1(glT1,m,glT1-m+2,m);
-      S2(glT1,m,glT1+1,m,glT1-m+2,m,glT1-m+3,m);
-    }
-    if (glT1 == m-1) {
-      S6(m-2,m-1,m-1,m,1,m-1,1,m);
-      S7(m-2,m-1,m,m,1,m-1,2,m);
-      S1(m-1,m,1,m);
-      S2(m-1,m,m,m,1,m,2,m);
-    }
-    for (coordP1=max(1,glT1-m+2);coordP1<=min(m,glT1+1);coordP1++) {
-      S8(glT1,coordP1);
-    }
-  }
-  if (m >= 2) {
-    if (m >= 3) {
-      S5(2*m-4,m-1,2*m-3,m-1,m-1,m-1,m,m-1);
-      S6(2*m-4,m-2,2*m-3,m-1,m,m-2,m,m-1);
-      S1(2*m-3,m-1,m,m-1);
-      S3(2*m-3,m-1,2*m-2,m,m,m-1,m,m);
-    }
-    if (m == 2) {
-      S5(0,1,1,1,1,1,2,1);
-      S1(1,1,2,1);
-      S3(1,1,2,2,2,1,2,2);
-    }
-    if (m >= 3) {
-      S5(2*m-4,m,2*m-3,m,m-2,m,m-1,m);
-      S6(2*m-4,m-1,2*m-3,m,m-1,m-1,m-1,m);
-      S7(2*m-4,m-1,2*m-2,m,m-1,m-1,m,m);
-      S1(2*m-3,m,m-1,m);
-    }
-    if (m == 2) {
-      S6(0,1,1,2,1,1,1,2);
-      S7(0,1,2,2,1,1,2,2);
-      S1(1,2,1,2);
-    }
-    S2(2*m-3,m,2*m-2,m,m-1,m,m,m);
-    for (coordP1=m-1;coordP1<=m;coordP1++) {
-      S8(2*m-3,coordP1);
-    }
-  }
-  if (m >= 2) {
-    S5(2*m-3,m,2*m-2,m,m-1,m,m,m);
-    S6(2*m-3,m-1,2*m-2,m,m,m-1,m,m);
-    S1(2*m-2,m,m,m);
-    S8(2*m-2,m);
-  }
-}
diff --git a/cloog-0.16.3/test/classen.cloog b/cloog-0.16.3/test/classen.cloog
deleted file mode 100644
index 06fe3b0..0000000
--- a/cloog-0.16.3/test/classen.cloog
+++ /dev/null
@@ -1,233 +0,0 @@
-# created: Fri Mar  4 11:37:56 CET 2005
-# ---------------------- CONTEXT ----------------------
-c # language is C
-
-# Context
-1 3
- 1 1 0
-
-
-1 # set parameter names
-m
-
-# --------------------- STATEMENTS --------------------
-8
-
-# 1 computation stmts:
-1 # one domain per statement
-7 7
- 1 0 0 0 0 1 -1
- 1 0 0 -1 0 1 0
- 1 0 0 1 0 0 -1
- 1 0 0 0 -1 1 0
- 1 0 0 0 1 0 -1
- 0 0 -1 0 1 0 0
- 0 -1 0 1 1 0 -2
-0 0 0 # for future options...
-
-
-# 3 prepare-send stmts:
-1 # one domain per statement
-13 11
- 1 0 0 0 0 0 0 0 0 1 -1
- 1 -1 0 0 0 0 0 0 0 2 -3
- 1 1 0 0 0 0 0 0 0 0 0
- 1 1 -1 0 0 0 0 0 0 0 1
- 1 0 -1 0 0 0 0 0 0 1 0
- 1 -1 1 0 0 0 0 0 0 1 -3
- 1 0 1 0 0 0 0 0 0 0 -1
- 0 0 0 0 -1 0 0 0 1 0 0
- 0 0 0 -1 0 0 0 1 1 0 -2
- 0 0 -1 0 0 0 1 0 0 0 0
- 0 -1 0 0 0 1 1 0 0 0 -2
- 0 -1 0 1 0 0 0 0 0 0 -1
- 0 0 -1 0 1 0 0 0 0 0 0
-0 0 0 # for future options...
-
-
-1 # one domain per statement
-13 11
- 1 0 0 0 0 0 0 0 0 1 -1
- 1 -1 0 0 0 0 0 0 0 2 -3
- 1 1 0 0 0 0 0 0 0 0 0
- 1 1 -1 0 0 0 0 0 0 0 1
- 1 0 -1 0 0 0 0 0 0 1 -1
- 1 -1 1 0 0 0 0 0 0 1 -2
- 1 0 1 0 0 0 0 0 0 0 -1
- 0 0 0 0 -1 0 0 0 1 0 0
- 0 0 0 -1 0 0 0 1 1 0 -2
- 0 0 -1 0 0 0 1 0 0 0 0
- 0 -1 0 0 0 1 1 0 0 0 -2
- 0 -1 0 1 0 0 0 0 0 0 -1
- 0 0 -1 0 1 0 0 0 0 0 -1
-0 0 0 # for future options...
-
-
-1 # one domain per statement
-13 11
- 1 0 0 0 0 0 0 0 0 1 -1
- 1 -1 0 0 0 0 0 0 0 2 -4
- 1 1 0 0 0 0 0 0 0 0 0
- 1 1 -1 0 0 0 0 0 0 0 1
- 1 0 -1 0 0 0 0 0 0 1 -1
- 1 -1 1 0 0 0 0 0 0 1 -3
- 1 0 1 0 0 0 0 0 0 0 -1
- 0 0 0 0 -1 0 0 0 1 0 0
- 0 0 0 -1 0 0 0 1 1 0 -2
- 0 0 -1 0 0 0 1 0 0 0 0
- 0 -1 0 0 0 1 1 0 0 0 -2
- 0 -1 0 1 0 0 0 0 0 0 -2
- 0 0 -1 0 1 0 0 0 0 0 -1
-0 0 0 # for future options...
-
-
-# 3 prepare-receive stmts:
-1 # one domain per statement
-13 11
- 1 0 0 0 0 0 0 0 0 1 -1
- 1 -1 0 0 0 0 0 0 0 2 -3
- 1 1 0 0 0 0 0 0 0 0 0
- 1 1 -1 0 0 0 0 0 0 0 1
- 1 0 -1 0 0 0 0 0 0 1 0
- 1 -1 1 0 0 0 0 0 0 1 -3
- 1 0 1 0 0 0 0 0 0 0 -1
- 0 0 0 0 -1 0 0 0 1 0 0
- 0 0 0 -1 0 0 0 1 1 0 -2
- 0 0 -1 0 0 0 1 0 0 0 0
- 0 -1 0 0 0 1 1 0 0 0 -2
- 0 -1 0 1 0 0 0 0 0 0 -1
- 0 0 -1 0 1 0 0 0 0 0 0
-0 0 0 # for future options...
-
-
-1 # one domain per statement
-13 11
- 1 0 0 0 0 0 0 0 0 1 -1
- 1 -1 0 0 0 0 0 0 0 2 -3
- 1 1 0 0 0 0 0 0 0 0 0
- 1 1 -1 0 0 0 0 0 0 0 1
- 1 0 -1 0 0 0 0 0 0 1 -1
- 1 -1 1 0 0 0 0 0 0 1 -2
- 1 0 1 0 0 0 0 0 0 0 -1
- 0 0 0 0 -1 0 0 0 1 0 0
- 0 0 0 -1 0 0 0 1 1 0 -2
- 0 0 -1 0 0 0 1 0 0 0 0
- 0 -1 0 0 0 1 1 0 0 0 -2
- 0 -1 0 1 0 0 0 0 0 0 -1
- 0 0 -1 0 1 0 0 0 0 0 -1
-0 0 0 # for future options...
-
-
-1 # one domain per statement
-13 11
- 1 0 0 0 0 0 0 0 0 1 -1
- 1 -1 0 0 0 0 0 0 0 2 -4
- 1 1 0 0 0 0 0 0 0 0 0
- 1 1 -1 0 0 0 0 0 0 0 1
- 1 0 -1 0 0 0 0 0 0 1 -1
- 1 -1 1 0 0 0 0 0 0 1 -3
- 1 0 1 0 0 0 0 0 0 0 -1
- 0 0 0 0 -1 0 0 0 1 0 0
- 0 0 0 -1 0 0 0 1 1 0 -2
- 0 0 -1 0 0 0 1 0 0 0 0
- 0 -1 0 0 0 1 1 0 0 0 -2
- 0 -1 0 1 0 0 0 0 0 0 -2
- 0 0 -1 0 1 0 0 0 0 0 -1
-0 0 0 # for future options...
-
-
-# communication statement:
-1 # number of domains for communication statement
-6 5
- 1 -1 0 2 -2
- 1 1 0 0 0
- 1 1 -1 0 1
- 1 0 -1 1 0
- 1 -1 1 1 -2
- 1 0 1 0 -1
-
-
-0 0 0 # for future options...
-
-
-1 # set the iterator names
-coordT1 coordP1 other1 other2 other3 other4 other5 other6
-
-# --------------------- SCATTERING --------------------
-8 # Scattering functions
-7 14
- 0 1 0 0 0 0 0 0 -1 0 0 0 0 0
- 0 0 1 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 -1 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0 0 -1
- 0 0 0 0 0 1 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 1 0 0 0 0 0 0
-
-7 18
- 0 1 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0
- 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 -1 0 0 0 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -2
- 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0
- 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 -1
-
-7 18
- 0 1 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0
- 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 -1 0 0 0 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -2
- 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0
- 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 -1
-
-7 18
- 0 1 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0
- 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 -1 0 0 0 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -2
- 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0
- 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 -1
-
-7 18
- 0 1 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 -1
- 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 0 0 -1 0 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0
- 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 -1
-
-7 18
- 0 1 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 -1
- 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 0 0 -1 0 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0
- 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 -1
-
-7 18
- 0 1 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 -1
- 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 0 0 -1 0 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0
- 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 -1
-
-7 12
- 0 1 0 0 0 0 0 0 -1 0 0 0
- 0 0 1 0 0 0 0 0 0 0 0 -1
- 0 0 0 1 0 0 0 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0
- 0 0 0 0 0 1 0 0 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0
- 0 0 0 0 0 0 0 1 0 0 0 0
-
-
-1 # we set the scattering dimension names
-glT1 bl rp1 stmtType local1 local2 local3
-
diff --git a/cloog-0.16.3/test/classen.good.c b/cloog-0.16.3/test/classen.good.c
deleted file mode 100644
index 5c97c50..0000000
--- a/cloog-0.16.3/test/classen.good.c
+++ /dev/null
@@ -1,396 +0,0 @@
-/* Generated from ../../../git/cloog/test/classen.cloog by CLooG 0.14.0-76-gfd78716 gmp bits in 1.73s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(coordT1,coordP1,other1,other2) { hash(1); hash(coordT1); hash(coordP1); hash(other1); hash(other2); }
-#define S2(coordT1,coordP1,other1,other2,other3,other4,other5,other6) { hash(2); hash(coordT1); hash(coordP1); hash(other1); hash(other2); hash(other3); hash(other4); hash(other5); hash(other6); }
-#define S3(coordT1,coordP1,other1,other2,other3,other4,other5,other6) { hash(3); hash(coordT1); hash(coordP1); hash(other1); hash(other2); hash(other3); hash(other4); hash(other5); hash(other6); }
-#define S4(coordT1,coordP1,other1,other2,other3,other4,other5,other6) { hash(4); hash(coordT1); hash(coordP1); hash(other1); hash(other2); hash(other3); hash(other4); hash(other5); hash(other6); }
-#define S5(coordT1,coordP1,other1,other2,other3,other4,other5,other6) { hash(5); hash(coordT1); hash(coordP1); hash(other1); hash(other2); hash(other3); hash(other4); hash(other5); hash(other6); }
-#define S6(coordT1,coordP1,other1,other2,other3,other4,other5,other6) { hash(6); hash(coordT1); hash(coordP1); hash(other1); hash(other2); hash(other3); hash(other4); hash(other5); hash(other6); }
-#define S7(coordT1,coordP1,other1,other2,other3,other4,other5,other6) { hash(7); hash(coordT1); hash(coordP1); hash(other1); hash(other2); hash(other3); hash(other4); hash(other5); hash(other6); }
-#define S8(coordT1,coordP1) { hash(8); hash(coordT1); hash(coordP1); }
-
-void test(int m)
-{
-  /* Scattering iterators. */
-  int glT1, rp1, local1, local2;
-  /* Original iterators. */
-  int coordT1, coordP1, other1, other2, other3, other4, other5, other6;
-  if (m >= 2) {
-    S1(0,1,1,1) ;
-    S2(0,1,1,1,1,1,2,1) ;
-    S3(0,1,1,2,1,1,1,2) ;
-    S4(0,1,2,2,1,1,2,2) ;
-    S8(0,1) ;
-  }
-  if (m == 1) {
-    S1(0,1,1,1) ;
-    S8(0,1) ;
-  }
-  if (m >= 3) {
-    S5(0,1,1,1,1,1,2,1) ;
-    S1(1,1,2,1) ;
-    S2(1,1,2,1,2,1,3,1) ;
-    S3(1,1,2,2,2,1,2,2) ;
-    S4(1,1,3,2,2,1,3,2) ;
-    S6(0,1,1,2,1,1,1,2) ;
-    S7(0,1,2,2,1,1,2,2) ;
-    S1(1,2,1,2) ;
-    S2(1,2,2,2,1,2,2,2) ;
-    S3(1,2,2,3,1,2,1,3) ;
-    S4(1,2,3,3,1,2,2,3) ;
-    for (coordP1=1;coordP1<=2;coordP1++) {
-      S8(1,coordP1) ;
-    }
-  }
-  for (glT1=2;glT1<=m-2;glT1++) {
-    coordT1 = glT1-1 ;
-    other5 = glT1+1 ;
-    S5(glT1-1,1,glT1,1,glT1,1,glT1+1,1) ;
-    other1 = glT1+1 ;
-    S1(glT1,1,glT1+1,1) ;
-    local1 = glT1+1 ;
-    other1 = glT1+1 ;
-    other3 = glT1+1 ;
-    other5 = glT1+2 ;
-    S2(glT1,1,glT1+1,1,glT1+1,1,glT1+2,1) ;
-    other3 = glT1+1 ;
-    other5 = glT1+1 ;
-    S3(glT1,1,glT1+1,2,glT1+1,1,glT1+1,2) ;
-    other1 = glT1+2 ;
-    other3 = glT1+1 ;
-    other5 = glT1+2 ;
-    S4(glT1,1,glT1+2,2,glT1+1,1,glT1+2,2) ;
-    for (rp1=2;rp1<=glT1;rp1++) {
-      local1 = glT1-rp1+1 ;
-      coordT1 = glT1-1 ;
-      other3 = glT1-rp1+1 ;
-      other5 = glT1-rp1+2 ;
-      S5(glT1-1,rp1,glT1,rp1,glT1-rp1+1,rp1,glT1-rp1+2,rp1) ;
-      local1 = glT1-rp1+2 ;
-      local2 = rp1-1 ;
-      coordT1 = glT1-1 ;
-      coordP1 = rp1-1 ;
-      other3 = glT1-rp1+2 ;
-      other4 = rp1-1 ;
-      other5 = glT1-rp1+2 ;
-      S6(glT1-1,rp1-1,glT1,rp1,glT1-rp1+2,rp1-1,glT1-rp1+2,rp1) ;
-      other1 = glT1+1 ;
-      other3 = glT1-rp1+2 ;
-      other4 = rp1-1 ;
-      other5 = glT1-rp1+3 ;
-      S7(glT1-1,rp1-1,glT1+1,rp1,glT1-rp1+2,rp1-1,glT1-rp1+3,rp1) ;
-      other1 = glT1-rp1+2 ;
-      S1(glT1,rp1,glT1-rp1+2,rp1) ;
-      local1 = glT1-rp1+2 ;
-      other1 = glT1+1 ;
-      other3 = glT1-rp1+2 ;
-      other5 = glT1-rp1+3 ;
-      S2(glT1,rp1,glT1+1,rp1,glT1-rp1+2,rp1,glT1-rp1+3,rp1) ;
-      other2 = rp1+1 ;
-      other3 = glT1-rp1+2 ;
-      other5 = glT1-rp1+2 ;
-      other6 = rp1+1 ;
-      S3(glT1,rp1,glT1+1,rp1+1,glT1-rp1+2,rp1,glT1-rp1+2,rp1+1) ;
-      other1 = glT1+2 ;
-      other2 = rp1+1 ;
-      other3 = glT1-rp1+2 ;
-      other5 = glT1-rp1+3 ;
-      other6 = rp1+1 ;
-      S4(glT1,rp1,glT1+2,rp1+1,glT1-rp1+2,rp1,glT1-rp1+3,rp1+1) ;
-    }
-    rp1 = glT1+1 ;
-    coordT1 = glT1-1 ;
-    other2 = glT1+1 ;
-    other6 = glT1+1 ;
-    S6(glT1-1,glT1,glT1,glT1+1,1,glT1,1,glT1+1) ;
-    other1 = glT1+1 ;
-    other2 = glT1+1 ;
-    other6 = glT1+1 ;
-    S7(glT1-1,glT1,glT1+1,glT1+1,1,glT1,2,glT1+1) ;
-    coordP1 = glT1+1 ;
-    other2 = glT1+1 ;
-    S1(glT1,glT1+1,1,glT1+1) ;
-    local2 = glT1+1 ;
-    coordP1 = glT1+1 ;
-    other1 = glT1+1 ;
-    other2 = glT1+1 ;
-    other4 = glT1+1 ;
-    other6 = glT1+1 ;
-    S2(glT1,glT1+1,glT1+1,glT1+1,1,glT1+1,2,glT1+1) ;
-    other2 = glT1+2 ;
-    other4 = glT1+1 ;
-    other6 = glT1+2 ;
-    S3(glT1,glT1+1,glT1+1,glT1+2,1,glT1+1,1,glT1+2) ;
-    other1 = glT1+2 ;
-    other2 = glT1+2 ;
-    other4 = glT1+1 ;
-    other6 = glT1+2 ;
-    S4(glT1,glT1+1,glT1+2,glT1+2,1,glT1+1,2,glT1+2) ;
-    for (coordP1=1;coordP1<=glT1+1;coordP1++) {
-      S8(glT1,coordP1) ;
-    }
-  }
-  if (m >= 3) {
-    glT1 = m-1 ;
-    local1 = m-1 ;
-    coordT1 = m-2 ;
-    other1 = m-1 ;
-    other3 = m-1 ;
-    S5(m-2,1,m-1,1,m-1,1,m,1) ;
-    coordT1 = m-1 ;
-    S1(m-1,1,m,1) ;
-    coordT1 = m-1 ;
-    S3(m-1,1,m,2,m,1,m,2) ;
-    for (rp1=2;rp1<=m-1;rp1++) {
-      local1 = -rp1+m ;
-      coordT1 = m-2 ;
-      other1 = m-1 ;
-      other3 = -rp1+m ;
-      other5 = -rp1+m+1 ;
-      S5(m-2,rp1,m-1,rp1,-rp1+m,rp1,-rp1+m+1,rp1) ;
-      local1 = -rp1+m+1 ;
-      local2 = rp1-1 ;
-      coordT1 = m-2 ;
-      coordP1 = rp1-1 ;
-      other1 = m-1 ;
-      other3 = -rp1+m+1 ;
-      other4 = rp1-1 ;
-      other5 = -rp1+m+1 ;
-      S6(m-2,rp1-1,m-1,rp1,-rp1+m+1,rp1-1,-rp1+m+1,rp1) ;
-      other3 = -rp1+m+1 ;
-      other4 = rp1-1 ;
-      other5 = -rp1+m+2 ;
-      S7(m-2,rp1-1,m,rp1,-rp1+m+1,rp1-1,-rp1+m+2,rp1) ;
-      coordT1 = m-1 ;
-      other1 = -rp1+m+1 ;
-      S1(m-1,rp1,-rp1+m+1,rp1) ;
-      local1 = -rp1+m+1 ;
-      coordT1 = m-1 ;
-      other3 = -rp1+m+1 ;
-      other5 = -rp1+m+2 ;
-      S2(m-1,rp1,m,rp1,-rp1+m+1,rp1,-rp1+m+2,rp1) ;
-      other2 = rp1+1 ;
-      other3 = -rp1+m+1 ;
-      other5 = -rp1+m+1 ;
-      other6 = rp1+1 ;
-      S3(m-1,rp1,m,rp1+1,-rp1+m+1,rp1,-rp1+m+1,rp1+1) ;
-      other1 = m+1 ;
-      other2 = rp1+1 ;
-      other3 = -rp1+m+1 ;
-      other5 = -rp1+m+2 ;
-      other6 = rp1+1 ;
-      S4(m-1,rp1,m+1,rp1+1,-rp1+m+1,rp1,-rp1+m+2,rp1+1) ;
-    }
-    local2 = m-1 ;
-    coordT1 = m-2 ;
-    coordP1 = m-1 ;
-    other1 = m-1 ;
-    other4 = m-1 ;
-    S6(m-2,m-1,m-1,m,1,m-1,1,m) ;
-    other4 = m-1 ;
-    S7(m-2,m-1,m,m,1,m-1,2,m) ;
-    coordT1 = m-1 ;
-    S1(m-1,m,1,m) ;
-    coordT1 = m-1 ;
-    S2(m-1,m,m,m,1,m,2,m) ;
-    coordT1 = m-1 ;
-    for (coordP1=1;coordP1<=m;coordP1++) {
-      S8(m-1,coordP1) ;
-    }
-  }
-  for (glT1=m;glT1<=2*m-4;glT1++) {
-    rp1 = glT1-m+2 ;
-    local1 = m-1 ;
-    local2 = glT1-m+2 ;
-    coordT1 = glT1-1 ;
-    coordP1 = glT1-m+2 ;
-    other2 = glT1-m+2 ;
-    other3 = m-1 ;
-    other4 = glT1-m+2 ;
-    other6 = glT1-m+2 ;
-    S5(glT1-1,glT1-m+2,glT1,glT1-m+2,m-1,glT1-m+2,m,glT1-m+2) ;
-    local2 = glT1-m+1 ;
-    coordT1 = glT1-1 ;
-    coordP1 = glT1-m+1 ;
-    other2 = glT1-m+2 ;
-    other4 = glT1-m+1 ;
-    other6 = glT1-m+2 ;
-    S6(glT1-1,glT1-m+1,glT1,glT1-m+2,m,glT1-m+1,m,glT1-m+2) ;
-    coordP1 = glT1-m+2 ;
-    other2 = glT1-m+2 ;
-    S1(glT1,glT1-m+2,m,glT1-m+2) ;
-    local2 = glT1-m+2 ;
-    coordP1 = glT1-m+2 ;
-    other1 = glT1+1 ;
-    other2 = glT1-m+3 ;
-    other4 = glT1-m+2 ;
-    other6 = glT1-m+3 ;
-    S3(glT1,glT1-m+2,glT1+1,glT1-m+3,m,glT1-m+2,m,glT1-m+3) ;
-    for (rp1=glT1-m+3;rp1<=m-1;rp1++) {
-      local1 = glT1-rp1+1 ;
-      coordT1 = glT1-1 ;
-      other3 = glT1-rp1+1 ;
-      other5 = glT1-rp1+2 ;
-      S5(glT1-1,rp1,glT1,rp1,glT1-rp1+1,rp1,glT1-rp1+2,rp1) ;
-      local1 = glT1-rp1+2 ;
-      local2 = rp1-1 ;
-      coordT1 = glT1-1 ;
-      coordP1 = rp1-1 ;
-      other3 = glT1-rp1+2 ;
-      other4 = rp1-1 ;
-      other5 = glT1-rp1+2 ;
-      S6(glT1-1,rp1-1,glT1,rp1,glT1-rp1+2,rp1-1,glT1-rp1+2,rp1) ;
-      other1 = glT1+1 ;
-      other3 = glT1-rp1+2 ;
-      other4 = rp1-1 ;
-      other5 = glT1-rp1+3 ;
-      S7(glT1-1,rp1-1,glT1+1,rp1,glT1-rp1+2,rp1-1,glT1-rp1+3,rp1) ;
-      other1 = glT1-rp1+2 ;
-      S1(glT1,rp1,glT1-rp1+2,rp1) ;
-      local1 = glT1-rp1+2 ;
-      other1 = glT1+1 ;
-      other3 = glT1-rp1+2 ;
-      other5 = glT1-rp1+3 ;
-      S2(glT1,rp1,glT1+1,rp1,glT1-rp1+2,rp1,glT1-rp1+3,rp1) ;
-      other2 = rp1+1 ;
-      other3 = glT1-rp1+2 ;
-      other5 = glT1-rp1+2 ;
-      other6 = rp1+1 ;
-      S3(glT1,rp1,glT1+1,rp1+1,glT1-rp1+2,rp1,glT1-rp1+2,rp1+1) ;
-      other1 = glT1+2 ;
-      other2 = rp1+1 ;
-      other3 = glT1-rp1+2 ;
-      other5 = glT1-rp1+3 ;
-      other6 = rp1+1 ;
-      S4(glT1,rp1,glT1+2,rp1+1,glT1-rp1+2,rp1,glT1-rp1+3,rp1+1) ;
-    }
-    local1 = glT1-m+1 ;
-    coordT1 = glT1-1 ;
-    other3 = glT1-m+1 ;
-    other5 = glT1-m+2 ;
-    S5(glT1-1,m,glT1,m,glT1-m+1,m,glT1-m+2,m) ;
-    local1 = glT1-m+2 ;
-    local2 = m-1 ;
-    coordT1 = glT1-1 ;
-    coordP1 = m-1 ;
-    other3 = glT1-m+2 ;
-    other4 = m-1 ;
-    other5 = glT1-m+2 ;
-    S6(glT1-1,m-1,glT1,m,glT1-m+2,m-1,glT1-m+2,m) ;
-    other1 = glT1+1 ;
-    other3 = glT1-m+2 ;
-    other4 = m-1 ;
-    other5 = glT1-m+3 ;
-    S7(glT1-1,m-1,glT1+1,m,glT1-m+2,m-1,glT1-m+3,m) ;
-    other1 = glT1-m+2 ;
-    S1(glT1,m,glT1-m+2,m) ;
-    local1 = glT1-m+2 ;
-    other1 = glT1+1 ;
-    other3 = glT1-m+2 ;
-    other5 = glT1-m+3 ;
-    S2(glT1,m,glT1+1,m,glT1-m+2,m,glT1-m+3,m) ;
-    for (coordP1=glT1-m+2;coordP1<=m;coordP1++) {
-      S8(glT1,coordP1) ;
-    }
-  }
-  if (m >= 3) {
-    glT1 = 2*m-3 ;
-    rp1 = m-1 ;
-    local1 = m-1 ;
-    local2 = m-1 ;
-    coordT1 = 2*m-4 ;
-    coordP1 = m-1 ;
-    other1 = 2*m-3 ;
-    other2 = m-1 ;
-    other3 = m-1 ;
-    other4 = m-1 ;
-    other6 = m-1 ;
-    S5(2*m-4,m-1,2*m-3,m-1,m-1,m-1,m,m-1) ;
-    local2 = m-2 ;
-    coordT1 = 2*m-4 ;
-    coordP1 = m-2 ;
-    other1 = 2*m-3 ;
-    other2 = m-1 ;
-    other4 = m-2 ;
-    other6 = m-1 ;
-    S6(2*m-4,m-2,2*m-3,m-1,m,m-2,m,m-1) ;
-    coordT1 = 2*m-3 ;
-    coordP1 = m-1 ;
-    other2 = m-1 ;
-    S1(2*m-3,m-1,m,m-1) ;
-    local2 = m-1 ;
-    coordT1 = 2*m-3 ;
-    coordP1 = m-1 ;
-    other1 = 2*m-2 ;
-    other4 = m-1 ;
-    S3(2*m-3,m-1,2*m-2,m,m,m-1,m,m) ;
-    local1 = m-2 ;
-    coordT1 = 2*m-4 ;
-    other1 = 2*m-3 ;
-    other3 = m-2 ;
-    other5 = m-1 ;
-    S5(2*m-4,m,2*m-3,m,m-2,m,m-1,m) ;
-    local1 = m-1 ;
-    local2 = m-1 ;
-    coordT1 = 2*m-4 ;
-    coordP1 = m-1 ;
-    other1 = 2*m-3 ;
-    other3 = m-1 ;
-    other4 = m-1 ;
-    other5 = m-1 ;
-    S6(2*m-4,m-1,2*m-3,m,m-1,m-1,m-1,m) ;
-    other1 = 2*m-2 ;
-    other3 = m-1 ;
-    other4 = m-1 ;
-    S7(2*m-4,m-1,2*m-2,m,m-1,m-1,m,m) ;
-    coordT1 = 2*m-3 ;
-    other1 = m-1 ;
-    S1(2*m-3,m,m-1,m) ;
-    local1 = m-1 ;
-    coordT1 = 2*m-3 ;
-    other1 = 2*m-2 ;
-    other3 = m-1 ;
-    S2(2*m-3,m,2*m-2,m,m-1,m,m,m) ;
-    coordT1 = 2*m-3 ;
-    for (coordP1=m-1;coordP1<=m;coordP1++) {
-      S8(2*m-3,coordP1) ;
-    }
-  }
-  if (m == 2) {
-    S5(0,1,1,1,1,1,2,1) ;
-    S1(1,1,2,1) ;
-    S3(1,1,2,2,2,1,2,2) ;
-    S6(0,1,1,2,1,1,1,2) ;
-    S7(0,1,2,2,1,1,2,2) ;
-    S1(1,2,1,2) ;
-    S2(1,2,2,2,1,2,2,2) ;
-    for (coordP1=1;coordP1<=2;coordP1++) {
-      S8(1,coordP1) ;
-    }
-  }
-  if (m >= 2) {
-    glT1 = 2*m-2 ;
-    local1 = m-1 ;
-    coordT1 = 2*m-3 ;
-    other1 = 2*m-2 ;
-    other3 = m-1 ;
-    S5(2*m-3,m,2*m-2,m,m-1,m,m,m) ;
-    local2 = m-1 ;
-    coordT1 = 2*m-3 ;
-    coordP1 = m-1 ;
-    other1 = 2*m-2 ;
-    other4 = m-1 ;
-    S6(2*m-3,m-1,2*m-2,m,m,m-1,m,m) ;
-    coordT1 = 2*m-2 ;
-    S1(2*m-2,m,m,m) ;
-    coordT1 = 2*m-2 ;
-    S8(2*m-2,m) ;
-  }
-}
diff --git a/cloog-0.16.3/test/classen2.c b/cloog-0.16.3/test/classen2.c
deleted file mode 100644
index 2afd378..0000000
--- a/cloog-0.16.3/test/classen2.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Generated from ../../../git/cloog/test/classen2.cloog by CLooG 0.14.0-271-gaa1e292 gmp bits in 0.14s. */
-if ((M >= 2) && (N >= 3) && (outerProcTileScatter1 >= outerProcTileScatter2) && (5*outerProcTileScatter1 <= M+2*N-4) && (5*outerProcTileScatter1 <= 5*outerProcTileScatter2+N+2) && (outerProcTileScatter2 >= 0) && (5*outerProcTileScatter2 <= M+N-2) && (outerTimeTileScatter >= outerProcTileScatter1) && (outerTimeTileScatter <= 2*outerProcTileScatter1) && (outerTimeTileScatter <= outerProcTileScatter1+outerProcTileScatter2+1) && (5*outerTimeTileScatter <= 2*M+2*N-6) && (5*outerTimeTileScatter <= 5*outerProcTileScatter1+M+2) && (5*outerTimeTileScatter >= 10*outerProcTileScatter1-2*N-2) && (5*outerTimeTileScatter <= 5*outerProcTileScatter2+M+N) && (5*outerTimeTileScatter >= 10*outerProcTileScatter2-N-3) && (5*outerTimeTileScatter <= 10*outerProcTileScatter2+N+3) && (5*outerTimeTileScatter >= 5*outerProcTileScatter1+5*outerProcTileScatter2-N-4)) {
-  for (compScatter1=max(max(max(max(max(4,5*outerTimeTileScatter),5*outerProcTileScatter2+1),5*outerProcTileScatter1+5*outerProcTileScatter2-N),10*outerProcTileScatter1-2*N+2),10*outerProcTileScatter2-N+1);compScatter1<=min(min(min(min(min(5*outerTimeTileScatter+4,2*M+2*N-6),5*outerProcTileScatter1+M+2),5*outerProcTileScatter1+5*outerProcTileScatter2+5),5*outerProcTileScatter2+M+N),10*outerProcTileScatter2+N+3);compScatter1++) {
-    for (compScatter2=max(max(max(max(ceild(compScatter1+4,2),5*outerProcTileScatter1),5*outerProcTileScatter2+1),compScatter1-M+2),compScatter1-5*outerProcTileScatter2-1);compScatter2<=min(min(min(min(floord(compScatter1+2*N-2,2),compScatter1),5*outerProcTileScatter1+4),compScatter1-5*outerProcTileScatter2+N),5*outerProcTileScatter2+N+2);compScatter2++) {
-      for (compScatter3=max(max(5*outerProcTileScatter2,compScatter1-compScatter2+3),compScatter2-N+2);compScatter3<=min(min(compScatter2-1,5*outerProcTileScatter2+4),compScatter1-compScatter2+N);compScatter3++) {
-        S1(compScatter1-compScatter2+1,-compScatter1+compScatter2+compScatter3-2,compScatter2-compScatter3,compScatter1,compScatter2,compScatter3);
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/classen2.cloog b/cloog-0.16.3/test/classen2.cloog
deleted file mode 100644
index dc12884..0000000
--- a/cloog-0.16.3/test/classen2.cloog
+++ /dev/null
@@ -1,57 +0,0 @@
-# created: Wed Mar 17 17:37:13 CET 2010
-# ---------------------- CONTEXT ----------------------
-c # language is C
-
-# Context (no parameter, so always true)
-1 7
- 1 0 0 0 0 0 0
-
-
-1 # set parameter names
-outerTimeTileScatter outerProcTileScatter1 outerProcTileScatter2 M N
-
-# --------------------- STATEMENTS --------------------
-1
-
-1 # domains per statement
-20 13
- 1 2 1 1 -1 0 0 0 0 0 0 0 0
- 1 1 1 1 0 -1 0 0 0 0 0 0 1
- 1 1 1 0 0 0 -1 0 0 0 0 0 1
- 1 -2 -1 -1 1 0 0 0 0 0 0 0 0
- 1 -1 -1 -1 0 1 0 0 0 0 0 0 -1
- 1 -1 -1 0 0 0 1 0 0 0 0 0 -1
- 1 0 0 1 0 0 0 0 0 0 0 0 -1
- 1 0 0 -1 0 0 0 0 0 0 0 1 -2
- 1 0 1 0 0 0 0 0 0 0 0 0 -1
- 1 0 -1 0 0 0 0 0 0 0 0 1 -2
- 1 1 0 0 0 0 0 0 0 0 0 0 -1
- 1 -1 0 0 0 0 0 0 0 0 1 0 -1
- 1 0 0 0 1 0 0 -5 0 0 0 0 0
- 1 0 0 0 0 1 0 0 -5 0 0 0 0
- 1 0 0 0 0 0 1 0 0 -5 0 0 0
- 1 0 0 0 0 0 -1 0 0 5 0 0 4
- 1 0 0 0 0 -1 0 0 5 0 0 0 4
- 1 0 0 0 -1 0 0 5 0 0 0 0 4
- 1 0 0 0 0 0 0 0 0 0 0 1 -3
- 1 0 0 0 0 0 0 0 0 0 1 0 -2
-
-
-0 0 0 # for future options...
-
-
-
-1 # set the iterator names
-compIter1 compIter2 compIter3 compIter4 compIter5 compIter6
-
-# --------------------- SCATTERING --------------------
-1 # Scattering functions
-3 16
- 0 1 0 0 0 0 0 -1 0 0 0 0 0 0 0 0
- 0 0 1 0 0 0 0 0 -1 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 -1 0 0 0 0 0 0
-
-
-1 # we set the scattering dimension names
-compScatter1 compScatter2 compScatter3
-
diff --git a/cloog-0.16.3/test/classen2.good.c b/cloog-0.16.3/test/classen2.good.c
deleted file mode 100644
index 6aa11e4..0000000
--- a/cloog-0.16.3/test/classen2.good.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Generated from ../../../git/cloog/test/classen2.cloog by CLooG 0.14.0-271-gaa1e292 gmp bits in 0.13s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(compIter1,compIter2,compIter3,compIter4,compIter5,compIter6) { hash(1); hash(compIter1); hash(compIter2); hash(compIter3); hash(compIter4); hash(compIter5); hash(compIter6); }
-
-void test(int outerTimeTileScatter, int outerProcTileScatter1, int outerProcTileScatter2, int M, int N)
-{
-  /* Scattering iterators. */
-  int compScatter1, compScatter2, compScatter3;
-  /* Original iterators. */
-  int compIter1, compIter2, compIter3, compIter4, compIter5, compIter6;
-  if ((M >= 2) && (N >= 3) && (outerProcTileScatter1 >= outerProcTileScatter2) && (5*outerProcTileScatter1 <= M+2*N-4) && (5*outerProcTileScatter1 <= 5*outerProcTileScatter2+N+2) && (outerProcTileScatter2 >= 0) && (5*outerProcTileScatter2 <= M+N-2) && (outerTimeTileScatter >= outerProcTileScatter1) && (outerTimeTileScatter <= 2*outerProcTileScatter1) && (outerTimeTileScatter <= outerProcTileScatter1+outerProcTileScatter2+1) && (5*outerTimeTileScatter <= 2*M+2*N-6) && (5*outerTimeTileScatter <= 5*outerProcTileScatter1+M+2) && (5*outerTimeTileScatter >= 10*outerProcTileScatter1-2*N-2) && (5*outerTimeTileScatter <= 5*outerProcTileScatter2+M+N) && (5*outerTimeTileScatter >= 10*outerProcTileScatter2-N-3) && (5*outerTimeTileScatter <= 10*outerProcTileScatter2+N+3) && (5*outerTimeTileScatter >= 5*outerProcTileScatter1+5*outerProcTileScatter2-N-4)) {
-    for (compScatter1=max(max(max(max(max(4,5*outerTimeTileScatter),5*outerProcTileScatter2+1),5*outerProcTileScatter1+5*outerProcTileScatter2-N),10*outerProcTileScatter1-2*N+2),10*outerProcTileScatter2-N+1);compScatter1<=min(min(min(min(min(5*outerTimeTileScatter+4,2*M+2*N-6),5*outerProcTileScatter1+M+2),5*outerProcTileScatter1+5*outerProcTileScatter2+5),5*outerProcTileScatter2+M+N),10*outerProcTileScatter2+N+3);compScatter1++) {
-      for (compScatter2=max(max(max(max(ceild(compScatter1+4,2),5*outerProcTileScatter1),5*outerProcTileScatter2+1),compScatter1-M+2),compScatter1-5*outerProcTileScatter2-1);compScatter2<=min(min(min(min(floord(compScatter1+2*N-2,2),compScatter1),5*outerProcTileScatter1+4),compScatter1-5*outerProcTileScatter2+N),5*outerProcTileScatter2+N+2);compScatter2++) {
-        for (compScatter3=max(max(5*outerProcTileScatter2,compScatter1-compScatter2+3),compScatter2-N+2);compScatter3<=min(min(compScatter2-1,5*outerProcTileScatter2+4),compScatter1-compScatter2+N);compScatter3++) {
-          S1(compScatter1-compScatter2+1,-compScatter1+compScatter2+compScatter3-2,compScatter2-compScatter3,compScatter1,compScatter2,compScatter3);
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/constant.c b/cloog-0.16.3/test/constant.c
deleted file mode 100644
index 3a6378e..0000000
--- a/cloog-0.16.3/test/constant.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Generated from ../../../git/cloog/test/constant.cloog by CLooG 0.14.0-333-g4442dac gmp bits in 0.01s. */
-for (c2=0;c2<=min(1023,M+1024);c2++) {
-  S1(c2);
-  S3(c2);
-}
-for (c2=max(0,M+1025);c2<=1023;c2++) {
-  S2(c2);
-  S3(c2);
-}
-for (c1=0;c1<=min(1023,M+1024);c1++) {
-  S4(c1);
-  S6(c1);
-}
-for (c1=max(0,M+1025);c1<=1023;c1++) {
-  S5(c1);
-  S6(c1);
-}
diff --git a/cloog-0.16.3/test/constant.cloog b/cloog-0.16.3/test/constant.cloog
deleted file mode 100644
index d251b1b..0000000
--- a/cloog-0.16.3/test/constant.cloog
+++ /dev/null
@@ -1,128 +0,0 @@
-# CLooG -> CLooG
-# This is an automatic dump of a CLooG input file from a CloogInput data
-# structure.
-
-# Language: C
-c
-
-# Context:
-0 3
-
-0 # Parameter name(s)
-
-# Statement number:
-6
-
-# Iteration domain of statement 1 (Stmt_if.then).
-1
-
-3 4 1 0 0 1
-1     1     0     0
-1    -1     0  1023
-1    -1     1  1024
-
-0 0 0 # For future options.
-
-# Iteration domain of statement 2 (Stmt_if.else).
-1
-
-3 4 1 0 0 1
-1     1     0     0
-1    -1     0  1023
-1     1    -1 -1025
-
-0 0 0 # For future options.
-
-# Iteration domain of statement 3 (Stmt_if.end).
-1
-
-2 4 1 0 0 1
-1     1     0     0
-1    -1     0  1023
-
-0 0 0 # For future options.
-
-# Iteration domain of statement 1 (Stmt_if.then).
-1
-
-3 4 1 0 0 1
-1     1     0     0
-1    -1     0  1023
-1    -1     1  1024
-
-0 0 0 # For future options.
-
-# Iteration domain of statement 2 (Stmt_if.else).
-1
-
-3 4 1 0 0 1
-1     1     0     0
-1    -1     0  1023
-1     1    -1 -1025
-
-0 0 0 # For future options.
-
-# Iteration domain of statement 3 (Stmt_if.end).
-1
-
-2 4 1 0 0 1
-1     1     0     0
-1    -1     0  1023
-
-0 0 0 # For future options.
-
-
-0 # Iterator name(s)
-
-# --------------------- SCATTERING --------------------
-6 # Scattering functions
-
-# Scattering of statement 1 (Stmt_if.then).
-1
-
-3 7 3 1 0 1
-0     0     0     1     0     0     0
-0     0     1     0    -1     0     0
-0     1     0     0     0     0     1
-
-# Scattering of statement 2 (Stmt_if.else).
-1
-
-3 7 3 1 0 1
-0     0     0     1     0     0    -1
-0     0     1     0    -1     0     0
-0     1     0     0     0     0     1
-
-# Scattering of statement 3 (Stmt_if.end).
-1
-
-3 7 3 1 0 1
-0     0     0     1     0     0    -2
-0     0     1     0    -1     0     0
-0     1     0     0     0     0     1
-
-# Scattering of statement 1 (Stmt_if.then).
-1
-
-3 7 3 1 0 1
-0     0     0     1     0     0     0
-0     1     0     0    -1     0     0
-0     0     1     0     0     0     0
-
-# Scattering of statement 2 (Stmt_if.else).
-1
-
-3 7 3 1 0 1
-0     0     0     1     0     0    -1
-0     1     0     0    -1     0     0
-0     0     1     0     0     0     0
-
-# Scattering of statement 3 (Stmt_if.end).
-1
-
-3 7 3 1 0 1
-0     0     0     1     0     0    -2
-0     1     0     0    -1     0     0
-0     0     1     0     0     0     0
-
-0 # Scattering dimension name(s)
diff --git a/cloog-0.16.3/test/constant.good.c b/cloog-0.16.3/test/constant.good.c
deleted file mode 100644
index c94fc44..0000000
--- a/cloog-0.16.3/test/constant.good.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Generated from ../../../git/cloog/test/constant.cloog by CLooG 0.14.0-333-g4442dac gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i) { hash(2); hash(i); }
-#define S3(i) { hash(3); hash(i); }
-#define S4(i) { hash(4); hash(i); }
-#define S5(i) { hash(5); hash(i); }
-#define S6(i) { hash(6); hash(i); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c1, c2;
-  /* Original iterators. */
-  int i;
-  for (c2=0;c2<=min(1023,M+1024);c2++) {
-    S1(c2);
-    S3(c2);
-  }
-  for (c2=max(0,M+1025);c2<=1023;c2++) {
-    S2(c2);
-    S3(c2);
-  }
-  for (c1=0;c1<=min(1023,M+1024);c1++) {
-    S4(c1);
-    S6(c1);
-  }
-  for (c1=max(0,M+1025);c1<=1023;c1++) {
-    S5(c1);
-    S6(c1);
-  }
-}
diff --git a/cloog-0.16.3/test/constbound.c b/cloog-0.16.3/test/constbound.c
deleted file mode 100644
index c68b1c9..0000000
--- a/cloog-0.16.3/test/constbound.c
+++ /dev/null
@@ -1,13 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/constbound.cloog by CLooG 0.14.0-170-g72daac3 gmp bits in 0.01s. */
-for (t0=0;t0<=199;t0++) {
-  for (t2=50*t0;t2<=50*t0+24;t2++) {
-    for (t3=0;t3<=t2;t3++) {
-      S1(t0,t2,t3);
-    }
-  }
-  for (t2=50*t0+25;t2<=50*t0+49;t2++) {
-    for (t3=0;t3<=t2;t3++) {
-      S2(t0,t2,t3);
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/constbound.cloog b/cloog-0.16.3/test/constbound.cloog
deleted file mode 100644
index 78ac963..0000000
--- a/cloog-0.16.3/test/constbound.cloog
+++ /dev/null
@@ -1,53 +0,0 @@
-# CLooG script generated automatically by PLUTO
-# language: C
-c
-
-# Context
-0 2
-
-1
-
-
-# Number of statements
-2
-
-1 # of domains
-6 5
-1 0 1 0 0 
-1 0 -1 0 9999 
-1 0 0 1 0 
-1 0 1 -1 0 
-1 -50 1 0 0 
-1 50 -1 0 24 
-0 0 0
-
-1
-6 5
-1 0 1 0 0 
-1 0 -1 0 9999 
-1 0 0 1 0 
-1 0 1 -1 0 
-1 -50 1 0 -25 
-1 50 -1 0 49 
-0 0 0
-
-0
-
-# of scattering functions
-2
-
-4 9
-0 1 0 0 0 -1 0 0 0
-0 0 1 0 0 0 0 0 0
-0 0 0 1 0 0 -1 0 0
-0 0 0 0 1 0 0 -1 0
-
-4 9
-0 1 0 0 0 -1 0 0 0
-0 0 1 0 0 0 0 0 -1
-0 0 0 1 0 0 -1 0 0
-0 0 0 0 1 0 0 -1 0
-
-# we will set the scattering dimension names
-4
-t0 t1 t2 t3
diff --git a/cloog-0.16.3/test/constbound.good.c b/cloog-0.16.3/test/constbound.good.c
deleted file mode 100644
index 30704dd..0000000
--- a/cloog-0.16.3/test/constbound.good.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/constbound.cloog by CLooG 0.14.0-170-g72daac3 64 bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int t0, t2, t3;
-  /* Original iterators. */
-  int i, j, k;
-  for (t0=0;t0<=199;t0++) {
-    for (t2=max(0,50*t0);t2<=50*t0+24;t2++) {
-      for (t3=0;t3<=t2;t3++) {
-        S1(t0,t2,t3);
-      }
-    }
-    for (t2=50*t0+25;t2<=min(9999,50*t0+49);t2++) {
-      for (t3=0;t3<=t2;t3++) {
-        S2(t0,t2,t3);
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/darte.c b/cloog-0.16.3/test/darte.c
deleted file mode 100644
index e185b7a..0000000
--- a/cloog-0.16.3/test/darte.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/darte.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.05s. */
-if (n >= 1) {
-  for (t3=n+3;t3<=3*n+1;t3++) {
-    if ((t3+n+1)%2 == 0) {
-      S1(1,n,(t3-n-1)/2);
-    }
-  }
-  for (t1=-n+2;t1<=n-1;t1++) {
-    if (t1 >= 2) {
-      for (t3=t1+4;t3<=t1+2*n+2;t3++) {
-        if ((t1+t3)%2 == 0) {
-          S1(t1+1,1,(-t1+t3-2)/2);
-        }
-      }
-    }
-    for (t2=max(-t1+2,t1+2);t2<=-t1+4;t2++) {
-      for (t3=t2+2;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          if ((t1+t3)%2 == 0) {
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2);
-          }
-        }
-      }
-    }
-    for (t2=max(-t1+5,t1+3);t2<=min(-t1+2*n,t1+2*n);t2++) {
-      for (t3=1;t3<=min(n,t2+1);t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3);
-        }
-      }
-      for (t3=t2+2;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3);
-        }
-        if ((t1+t2)%2 == 0) {
-          if ((t1+t3)%2 == 0) {
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2);
-          }
-        }
-      }
-      for (t3=max(n+1,t2+2);t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          if ((t1+t3)%2 == 0) {
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2);
-          }
-        }
-      }
-    }
-    if (t1 <= -1) {
-      for (t3=1;t3<=n;t3++) {
-        S2(t1+n-1,n,t3);
-      }
-    }
-    for (t2=-t1+2*n+1;t2<=min(-t1+2*n+3,t1+2*n+1);t2++) {
-      for (t3=1;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3);
-        }
-      }
-    }
-  }
-  for (t3=1;t3<=n;t3++) {
-    S2(n,1,t3);
-  }
-}
diff --git a/cloog-0.16.3/test/darte.cloog b/cloog-0.16.3/test/darte.cloog
deleted file mode 100644
index a853691..0000000
--- a/cloog-0.16.3/test/darte.cloog
+++ /dev/null
@@ -1,52 +0,0 @@
-# language: C
-c
-
-# parameters n m
-1 3
-#  n  1
-1  0  0
-1
-n
-
-2 # Number of statements
-
-1
-# S1 {i, j, k | 1<=i<=n; 1<=j<=n,  1<=k<=n}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  0  1  0
-1  0  0  1  0 -1
-1  0  0 -1  1  0
-0  0  0
-
-1
-# S2 {i, j, k | 1<=i<=n; 1<=j<=n,  1<=k<=n}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  0  1  0
-1  0  0  1  0 -1
-1  0  0 -1  1  0
-0  0  0
-0
-
-2
-# Scattering functions
-3 9
-# c1 c2 c3  i  j  k  n  1
-0  1  0  0 -1  1  0  0  0
-0  0  1  0 -1 -1  0  0  0
-0  0  0  1 -1 -1 -2  0  0
-
-3 9
-# c1 c2 c3  i  j  k  n  1
-0  1  0  0 -1  1  0  0 -1
-0  0  1  0 -1 -1  0  0 -2
-0  0  0  1  0  0 -1  0  0
-1
-t1 t2 t3
diff --git a/cloog-0.16.3/test/darte.good.c b/cloog-0.16.3/test/darte.good.c
deleted file mode 100644
index 298c24f..0000000
--- a/cloog-0.16.3/test/darte.good.c
+++ /dev/null
@@ -1,449 +0,0 @@
-/* Generated from ../../../git/cloog/test/darte.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.27s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-
-void test(int n)
-{
-  /* Scattering iterators. */
-  int t1, t2, t3;
-  /* Original iterators. */
-  int i, j, k;
-  if (n >= 1) {
-    t1 = -n+1 ;
-    t2 = n+1 ;
-    for (t3=n+3;t3<=3*n+1;t3++) {
-      if ((t3+n+1)%2 == 0) {
-        k = (t3-n-1)/2 ;
-        S1(1,n,(t3-n-1)/2) ;
-      }
-    }
-  }
-  if ((n >= 2) && (n <= 2)) {
-    t1 = -n+2 ;
-    for (t2=-n+4;t2<=3*n-2;t2++) {
-      for (t3=t2+2;t3<=t2+2*n;t3++) {
-        if ((t2+n)%2 == 0) {
-          i = (t2-n+2)/2 ;
-          j = (t2+n-2)/2 ;
-          if ((t3+n)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t2-n+2)/2,(t2+n-2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    t2 = n+3 ;
-    for (t3=1;t3<=n;t3++) {
-      S2(1,n,t3) ;
-    }
-  }
-  if (n >= 3) {
-    t1 = -n+2 ;
-    for (t2=n;t2<=n+2;t2++) {
-      for (t3=t2+2;t3<=t2+2*n;t3++) {
-        if ((t2+n)%2 == 0) {
-          i = (t2-n+2)/2 ;
-          j = (t2+n-2)/2 ;
-          if ((t3+n)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t2-n+2)/2,(t2+n-2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    t2 = n+3 ;
-    for (t3=1;t3<=n;t3++) {
-      S2(1,n,t3) ;
-    }
-  }
-  for (t1=ceild(-2*n+5,2);t1<=min(-n+6,-1);t1++) {
-    for (t2=-t1+2;t2<=-t1+4;t2++) {
-      for (t3=t2+2;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    for (t2=-t1+5;t2<=t1+2*n;t2++) {
-      for (t3=1;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-      }
-      for (t3=t2+2;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    t2 = t1+2*n+1 ;
-    for (t3=1;t3<=n;t3++) {
-      i = t1+n-1 ;
-      S2(t1+n-1,n,t3) ;
-    }
-  }
-  if (n == 2) {
-    for (t3=5;t3<=7;t3++) {
-      if ((t3+1)%2 == 0) {
-        k = (t3-3)/2 ;
-        S1(2,1,(t3-3)/2) ;
-      }
-    }
-    for (t2=4;t2<=6;t2++) {
-      for (t3=1;t3<=2;t3++) {
-        if (t2%2 == 0) {
-          i = (t2-2)/2 ;
-          j = (t2-2)/2 ;
-          S2((t2-2)/2,(t2-2)/2,t3) ;
-        }
-      }
-    }
-  }
-  for (t1=-n+7;t1<=-1;t1++) {
-    for (t2=-t1+2;t2<=-t1+4;t2++) {
-      for (t3=t2+2;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    for (t2=-t1+5;t2<=n-2;t2++) {
-      for (t3=1;t3<=t2+1;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-      }
-      for (t3=t2+2;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-      for (t3=n+1;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    for (t2=n-1;t2<=t1+2*n;t2++) {
-      for (t3=1;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-      }
-      for (t3=t2+2;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    t2 = t1+2*n+1 ;
-    for (t3=1;t3<=n;t3++) {
-      i = t1+n-1 ;
-      S2(t1+n-1,n,t3) ;
-    }
-  }
-  if (n >= 3) {
-    for (t1=0;t1<=min(1,-n+6);t1++) {
-      for (t2=t1+2;t2<=-t1+4;t2++) {
-        for (t3=t2+2;t3<=t2+2*n;t3++) {
-          if ((t1+t2)%2 == 0) {
-            i = (t1+t2)/2 ;
-            j = (-t1+t2)/2 ;
-            if ((t1+t3)%2 == 0) {
-              k = (-t2+t3)/2 ;
-              S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-            }
-          }
-        }
-      }
-      for (t2=-t1+5;t2<=-t1+2*n;t2++) {
-        for (t3=1;t3<=n;t3++) {
-          if ((t1+t2+1)%2 == 0) {
-            i = (t1+t2-3)/2 ;
-            j = (-t1+t2-1)/2 ;
-            S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-          }
-        }
-        for (t3=t2+2;t3<=t2+2*n;t3++) {
-          if ((t1+t2)%2 == 0) {
-            i = (t1+t2)/2 ;
-            j = (-t1+t2)/2 ;
-            if ((t1+t3)%2 == 0) {
-              k = (-t2+t3)/2 ;
-              S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-            }
-          }
-        }
-      }
-      for (t2=-t1+2*n+1;t2<=t1+2*n+1;t2++) {
-        for (t3=1;t3<=n;t3++) {
-          if ((t1+t2+1)%2 == 0) {
-            i = (t1+t2-3)/2 ;
-            j = (-t1+t2-1)/2 ;
-            S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-          }
-        }
-      }
-    }
-  }
-  for (t1=max(-n+7,0);t1<=1;t1++) {
-    for (t2=t1+2;t2<=-t1+4;t2++) {
-      for (t3=t2+2;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    for (t2=-t1+5;t2<=n-2;t2++) {
-      for (t3=1;t3<=t2+1;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-      }
-      for (t3=t2+2;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-      for (t3=n+1;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    for (t2=n-1;t2<=-t1+2*n;t2++) {
-      for (t3=1;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-      }
-      for (t3=t2+2;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    for (t2=-t1+2*n+1;t2<=t1+2*n+1;t2++) {
-      for (t3=1;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-      }
-    }
-  }
-  for (t1=2;t1<=n-5;t1++) {
-    t2 = t1+2 ;
-    for (t3=t1+4;t3<=t1+2*n+2;t3++) {
-      i = t1+1 ;
-      if ((t1+t3)%2 == 0) {
-        k = (-t1+t3-2)/2 ;
-        S1(t1+1,1,(-t1+t3-2)/2) ;
-      }
-    }
-    for (t2=t1+3;t2<=n-2;t2++) {
-      for (t3=1;t3<=t2+1;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-      }
-      for (t3=t2+2;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-      for (t3=n+1;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    for (t2=n-1;t2<=-t1+2*n;t2++) {
-      for (t3=1;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-      }
-      for (t3=t2+2;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    for (t2=-t1+2*n+1;t2<=-t1+2*n+3;t2++) {
-      for (t3=1;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-      }
-    }
-  }
-  for (t1=max(2,n-4);t1<=floord(2*n-3,2);t1++) {
-    t2 = t1+2 ;
-    for (t3=t1+4;t3<=t1+2*n+2;t3++) {
-      i = t1+1 ;
-      if ((t1+t3)%2 == 0) {
-        k = (-t1+t3-2)/2 ;
-        S1(t1+1,1,(-t1+t3-2)/2) ;
-      }
-    }
-    for (t2=t1+3;t2<=-t1+2*n;t2++) {
-      for (t3=1;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-      }
-      for (t3=t2+2;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    for (t2=-t1+2*n+1;t2<=-t1+2*n+3;t2++) {
-      for (t3=1;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-      }
-    }
-  }
-  if (n >= 3) {
-    t1 = n-1 ;
-    t2 = n+1 ;
-    for (t3=n+3;t3<=3*n+1;t3++) {
-      if ((t3+n+1)%2 == 0) {
-        k = (t3-n-1)/2 ;
-        S1(n,1,(t3-n-1)/2) ;
-      }
-    }
-    for (t2=n+2;t2<=n+4;t2++) {
-      for (t3=1;t3<=n;t3++) {
-        if ((t2+n)%2 == 0) {
-          i = (t2+n-4)/2 ;
-          j = (t2-n)/2 ;
-          S2((t2+n-4)/2,(t2-n)/2,t3) ;
-        }
-      }
-    }
-  }
-  if (n >= 1) {
-    t2 = n+3 ;
-    for (t3=1;t3<=n;t3++) {
-      S2(n,1,t3) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/dartef.cloog b/cloog-0.16.3/test/dartef.cloog
deleted file mode 100644
index 14454e2..0000000
--- a/cloog-0.16.3/test/dartef.cloog
+++ /dev/null
@@ -1,52 +0,0 @@
-# language: FORTRAN
-f
-
-# parameters n m
-1 3
-#  n  1
-1  0  0
-1
-n
-
-2 # Number of statements
-
-1
-# S1 {i, j, k | 1<=i<=n; 1<=j<=n,  1<=k<=n}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  0  1  0
-1  0  0  1  0 -1
-1  0  0 -1  1  0
-0  0  0
-
-1
-# S2 {i, j, k | 1<=i<=n; 1<=j<=n,  1<=k<=n}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  0  1  0
-1  0  0  1  0 -1
-1  0  0 -1  1  0
-0  0  0
-0
-
-2
-# Scattering functions
-3 9
-# c1 c2 c3  i  j  k  n  1
-0  1  0  0 -1  1  0  0  0
-0  0  1  0 -1 -1  0  0  0
-0  0  0  1 -1 -1 -2  0  0
-
-3 9
-# c1 c2 c3  i  j  k  n  1
-0  1  0  0 -1  1  0  0 -1
-0  0  1  0 -1 -1  0  0 -2
-0  0  0  1  0  0 -1  0  0
-1
-t1 t2 t3
diff --git a/cloog-0.16.3/test/dartef.f b/cloog-0.16.3/test/dartef.f
deleted file mode 100644
index 50e1073..0000000
--- a/cloog-0.16.3/test/dartef.f
+++ /dev/null
@@ -1,65 +0,0 @@
-! Generated from /home/skimo/git/cloog/test/dartef.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.08s.
-IF (n >= 1) THEN
-  DO t3=n+3, 3*n+1
-    IF (MOD(t3+n+1, 2) == 0) THEN
-      S1(1,n,(t3-n-1)/2)
-    END IF
-  END DO
-  DO t1=-n+2, n-1
-    IF (t1 >= 2) THEN
-      DO t3=t1+4, t1+2*n+2
-        IF (MOD(t1+t3, 2) == 0) THEN
-          S1(t1+1,1,(-t1+t3-2)/2)
-        END IF
-      END DO
-    END IF
-    DO t2=MAX(-t1+2,t1+2), -t1+4
-      DO t3=t2+2, t2+2*n
-        IF (MOD(t1+t2, 2) == 0) THEN
-          IF (MOD(t1+t3, 2) == 0) THEN
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2)
-          END IF
-        END IF
-      END DO
-    END DO
-    DO t2=MAX(-t1+5,t1+3), MIN(-t1+2*n,t1+2*n)
-      DO t3=1, MIN(n,t2+1)
-        IF (MOD(t1+t2+1, 2) == 0) THEN
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3)
-        END IF
-      END DO
-      DO t3=t2+2, n
-        IF (MOD(t1+t2+1, 2) == 0) THEN
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3)
-        END IF
-        IF (MOD(t1+t2, 2) == 0) THEN
-          IF (MOD(t1+t3, 2) == 0) THEN
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2)
-          END IF
-        END IF
-      END DO
-      DO t3=MAX(n+1,t2+2), t2+2*n
-        IF (MOD(t1+t2, 2) == 0) THEN
-          IF (MOD(t1+t3, 2) == 0) THEN
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2)
-          END IF
-        END IF
-      END DO
-    END DO
-    IF (t1 <= -1) THEN
-      DO t3=1, n
-        S2(t1+n-1,n,t3)
-      END DO
-    END IF
-    DO t2=-t1+2*n+1, MIN(-t1+2*n+3,t1+2*n+1)
-      DO t3=1, n
-        IF (MOD(t1+t2+1, 2) == 0) THEN
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3)
-        END IF
-      END DO
-    END DO
-  END DO
-  DO t3=1, n
-    S2(n,1,t3)
-  END DO
-END IF
diff --git a/cloog-0.16.3/test/dealII.c b/cloog-0.16.3/test/dealII.c
deleted file mode 100644
index 200b257..0000000
--- a/cloog-0.16.3/test/dealII.c
+++ /dev/null
@@ -1,14 +0,0 @@
-/* Generated from ../../../git/cloog/test/dealII.cloog by CLooG 0.14.0-270-g7ee1261 gmp bits in 0.01s. */
-for (scat_0=0;scat_0<=min(T_66,T_2-1);scat_0++) {
-  S1(scat_0);
-  S2(scat_0);
-}
-if ((T_2 == 0) && (T_67 == 0)) {
-  S1(0);
-}
-for (scat_0=max(0,T_66+1);scat_0<=T_2-1;scat_0++) {
-  S1(scat_0);
-}
-for (scat_0=T_2;scat_0<=min(T_66,T_67-1);scat_0++) {
-  S2(scat_0);
-}
diff --git a/cloog-0.16.3/test/dealII.cloog b/cloog-0.16.3/test/dealII.cloog
deleted file mode 100644
index 1c648f4..0000000
--- a/cloog-0.16.3/test/dealII.cloog
+++ /dev/null
@@ -1,54 +0,0 @@
-# CLooG -> CLooG
-# This is an automatic dump of a CLooG input file from a CloogProgram data
-# structure. WARNING: it is highly dangerous and MAY be correct ONLY if
-# - it has been dumped before loop generation.
-# - option -noscalars is used (it removes scalar dimensions otherwise)
-# - option -l is at least the original scattering dimension number
-# ASK THE AUTHOR IF YOU *NEED* SOMETHING MORE ROBUST
-# Language: C
-c
-
-# Context (3 parameter(s)):
-4 5
-1    -1     0     0 	4
-1     1     0     0     0
-1     0    -1     0 	4
-1     0     1     0     0
-1 # Parameter name(s)
-T_2 T_67 T_66 
-
-# Statement number:
-2
-
-# Iteration domain of statement 1.
-2
-
-2 6
-1    -1     1     0     0    -1 
-1     1     0     0     0     0
-
-2 6
-1    -1     0    -1     0     0
-1     1     0     0     0     0
-0 0 0 # For future options.
-
-# Iteration domain of statement 2.
-2
-
-3 6
-1    -1     1     0     0    -1
-1     1     0     0     0     0 
-1    -1     0     0     1     0 
-
-3 6
-1    -1     0     1     0    -1
-1     1     0     0     0     0
-1    -1     0     0     1     0 
-0 0 0 # For future options.
-
-1 # Iterator name(s)
-scat_0 scat_1 scat_2 git_0 
-
-# No scattering functions.
-0
-
diff --git a/cloog-0.16.3/test/dealII.good.c b/cloog-0.16.3/test/dealII.good.c
deleted file mode 100644
index 9a220ff..0000000
--- a/cloog-0.16.3/test/dealII.good.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Generated from ../../../git/cloog/test/dealII.cloog by CLooG 0.14.0-270-g7ee1261 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(scat_0) { hash(1); hash(scat_0); }
-#define S2(scat_0) { hash(2); hash(scat_0); }
-
-void test(int T_2, int T_67, int T_66)
-{
-  /* Original iterators. */
-  int scat_0;
-  for (scat_0=0;scat_0<=min(T_66,T_2-1);scat_0++) {
-    S1(scat_0);
-    S2(scat_0);
-  }
-  if ((T_2 == 0) && (T_67 == 0)) {
-    S1(0);
-  }
-  for (scat_0=max(0,T_66+1);scat_0<=T_2-1;scat_0++) {
-    S1(scat_0);
-  }
-  for (scat_0=T_2;scat_0<=min(T_66,T_67-1);scat_0++) {
-    S2(scat_0);
-  }
-}
diff --git a/cloog-0.16.3/test/donotsimp.c b/cloog-0.16.3/test/donotsimp.c
deleted file mode 100644
index bccb8b4..0000000
--- a/cloog-0.16.3/test/donotsimp.c
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Generated from ../../../git/cloog/test/donotsimp.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-for (c2=1;c2<=10;c2++) {
-  for (c4=1;c4<=c2;c4++) {
-    S1(c2,c4) ;
-  }
-  for (c4=11;c4<=M;c4++) {
-    S2(c2,c4) ;
-  }
-}
diff --git a/cloog-0.16.3/test/donotsimp.cloog b/cloog-0.16.3/test/donotsimp.cloog
deleted file mode 100644
index 6450917..0000000
--- a/cloog-0.16.3/test/donotsimp.cloog
+++ /dev/null
@@ -1,54 +0,0 @@
-# Language
-c
-
-# Context
-
-# {n>=20}
-    1 3
-    1    1  -20
-0
-
-# Number of statments
-2
-
-1
-# {i,j | 0<=i<=10 1<=j<=i}
-
-    4 5
-    1    1    0    0    -1
-    1   -1    0    0    10
-    1    0    1    0    -1
-    1    1   -1    0     0
-0 0 0
-
-1
-# {i,j | 0<=i<=10 11<=j<=n}
-
-    4 5
-    1    1    0    0    -1
-    1   -1    0    0    10
-    1    0    1    0   -11
-    1    0   -1    1     0
-0 0 0
-
-0
-# Scattering functions
-2
-
-    5 10
-    0    1    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0
-
-    5 10
-    0    1    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0
-
-
-0
-
diff --git a/cloog-0.16.3/test/donotsimp.good.c b/cloog-0.16.3/test/donotsimp.good.c
deleted file mode 100644
index 8e45ab8..0000000
--- a/cloog-0.16.3/test/donotsimp.good.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Generated from ../../../git/cloog/test/donotsimp.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4;
-  /* Original iterators. */
-  int i, j;
-  for (c2=1;c2<=10;c2++) {
-    for (c4=1;c4<=c2;c4++) {
-      S1(c2,c4) ;
-    }
-    for (c4=11;c4<=M;c4++) {
-      S2(c2,c4) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/dot.c b/cloog-0.16.3/test/dot.c
deleted file mode 100644
index 5114ef1..0000000
--- a/cloog-0.16.3/test/dot.c
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Generated from ../../../git/cloog/test/dot.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (j=1;j<=M;j++) {
-  S1(0,j) ;
-}
-for (i=1;i<=N;i++) {
-  for (j=1;j<=M;j++) {
-    S2(i,j) ;
-  }
-}
diff --git a/cloog-0.16.3/test/dot.cloog b/cloog-0.16.3/test/dot.cloog
deleted file mode 100644
index 112816e..0000000
--- a/cloog-0.16.3/test/dot.cloog
+++ /dev/null
@@ -1,33 +0,0 @@
-# language: C
-c
-
-# parameters {M, N | M>=1 N >=1}
-2 4
-1  1  0 -1
-1  0  1 -1
-0
-
-2 # Number of statements
-
-1
-# {i, j | i=0 0<=i<=N 1<=j<=M}
-5 6
-0  1  0  0  0  0
-1  1  0  0  0  0
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-0  0  0
-
-1
-# {i, j | i>=1 0<=i<=N 1<=j<=M}
-5 6
-1  1  0  0  0 -1
-1  1  0  0  0  0
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-0  0  0
-0
- 
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/dot.good.c b/cloog-0.16.3/test/dot.good.c
deleted file mode 100644
index 9cb7b96..0000000
--- a/cloog-0.16.3/test/dot.good.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Generated from ../../../git/cloog/test/dot.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i, j;
-  for (j=1;j<=M;j++) {
-    S1(0,j) ;
-  }
-  for (i=1;i<=N;i++) {
-    for (j=1;j<=M;j++) {
-      S2(i,j) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/dot2.c b/cloog-0.16.3/test/dot2.c
deleted file mode 100644
index 3b6eb5d..0000000
--- a/cloog-0.16.3/test/dot2.c
+++ /dev/null
@@ -1,15 +0,0 @@
-/* Generated from ../../../git/cloog/test/dot2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-for (i=1;i<=min(M,N);i++) {
-  S1(i) ;
-  for (j=1;j<=M;j++) {
-    S2(i,j) ;
-  }
-}
-for (i=N+1;i<=M;i++) {
-  S1(i) ;
-}
-for (i=M+1;i<=N;i++) {
-  for (j=1;j<=M;j++) {
-    S2(i,j) ;
-  }
-}
diff --git a/cloog-0.16.3/test/dot2.cloog b/cloog-0.16.3/test/dot2.cloog
deleted file mode 100644
index 71f471a..0000000
--- a/cloog-0.16.3/test/dot2.cloog
+++ /dev/null
@@ -1,29 +0,0 @@
-# language: C
-c
-
-# parameters {M, N | M>=1 N >=1}
-2 4
-1  1  0 -1
-1  0  1 -1
-0
-
-2 # Number of statements
-
-1
-# {i | 1<=i<=M}
-2 5
-1  1  0  0 -1
-1 -1  1  0  0
-0  0  0
-
-1
-# {i, j | 1<=i<=N 1<=j<=M}
-4 6
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-0  0  0
-0
- 
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/dot2.good.c b/cloog-0.16.3/test/dot2.good.c
deleted file mode 100644
index 9b7805c..0000000
--- a/cloog-0.16.3/test/dot2.good.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Generated from ../../../git/cloog/test/dot2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i, j;
-  for (i=1;i<=min(M,N);i++) {
-    S1(i) ;
-    for (j=1;j<=M;j++) {
-      S2(i,j) ;
-    }
-  }
-  for (i=N+1;i<=M;i++) {
-    S1(i) ;
-  }
-  for (i=M+1;i<=N;i++) {
-    for (j=1;j<=M;j++) {
-      S2(i,j) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/double.c b/cloog-0.16.3/test/double.c
deleted file mode 100644
index b8e5e59..0000000
--- a/cloog-0.16.3/test/double.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Generated from ../../../git/cloog/test/double.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if (M >= 0) {
-  for (i=0;i<=M;i++) {
-    S1(i) ;
-    for (j=0;j<=N;j++) {
-      S2(i,j) ;
-      S3(i,j) ;
-    }
-    S4(i) ;
-  }
-}
diff --git a/cloog-0.16.3/test/double.cloog b/cloog-0.16.3/test/double.cloog
deleted file mode 100644
index a9db60d..0000000
--- a/cloog-0.16.3/test/double.cloog
+++ /dev/null
@@ -1,69 +0,0 @@
-# language: C
-c
-
-# parameters n m
-1 4
-#  n  m  1
-1  0  1  0
-0
-
-4 # Number of statements
-
-1
-# S1 {i | 0<=i<=n}
-2 5
-#  i  n  m  1
-1  1  0  0  0
-1 -1  1  0  0
-0  0  0
-
-1
-# S2 {i, j | 0<=i<=n; 0<=j<=m}
-4 6
-#  i  j  n  m  1
-1  1  0  0  0  0
-1 -1  0  1  0  0
-1  0  1  0  0  0
-1  0 -1  0  1  0
-0  0  0
-
-1
-# S3 {i, j | 0<=i<=n; 0<=j<=m}
-4 6
-#  i  j  n  m  1
-1  1  0  0  0  0
-1 -1  0  1  0  0
-1  0  1  0  0  0
-1  0 -1  0  1  0
-0  0  0
-
-1
-# S4 {i | 0<=i<=n}
-2 5
-#  i  n  m  1
-1  1  0  0  0
-1 -1  1  0  0
-0  0  0
-0
-
-0 # Scattering functions
-2 7
-# c1 C2  i  n  m  1
-0  1  0 -1  0  0  0
-0  0  1  0  0  0 -1
-
-2 8
-# c1 C2  i  j  n  m  1
-0  1  0 -1  0  0  0  0
-0  0  1  0  0  0  0 -2
-
-2 8
-# c1 C2  i  j  n  m  1
-0  1  0 -1  0  0  0  0
-0  0  1  0  0  0  0 -3
-
-2 7
-# c1 C2  i  n  m  1
-0  1  0 -1  0  0  0
-0  0  1  0  0  0 -4
-0
diff --git a/cloog-0.16.3/test/double.good.c b/cloog-0.16.3/test/double.good.c
deleted file mode 100644
index 7aa0eb3..0000000
--- a/cloog-0.16.3/test/double.good.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Generated from ../../../git/cloog/test/double.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-#define S4(i) { hash(4); hash(i); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i, j;
-  for (i=0;i<=M;i++) {
-    S1(i) ;
-    for (j=0;j<=N;j++) {
-      S2(i,j) ;
-      S3(i,j) ;
-    }
-    S4(i) ;
-  }
-}
diff --git a/cloog-0.16.3/test/durbin_e_s.c b/cloog-0.16.3/test/durbin_e_s.c
deleted file mode 100644
index d0301c8..0000000
--- a/cloog-0.16.3/test/durbin_e_s.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Generated from ../../../git/cloog/test/durbin_e_s.cloog by CLooG 0.14.0-238-gb1cb779 gmp bits in 0.01s. */
-S4(1,0,0);
-S7(1,0,0);
-S8(1,0,3);
-for (i=2;i<=9;i++) {
-  S2(i,-7,0);
-  for (j=-7;j<=i-9;j++) {
-    S3(i,j,1);
-  }
-  S6(i,i-9,2);
-  S8(i,0,3);
-  for (j=1;j<=i-1;j++) {
-    S5(i,j,3);
-  }
-}
-S2(10,-7,0);
-for (j=-7;j<=1;j++) {
-  S3(10,j,1);
-}
-S6(10,1,2);
-for (j=1;j<=9;j++) {
-  S5(10,j,3);
-  S1(10,j,4);
-}
-S1(10,10,4);
diff --git a/cloog-0.16.3/test/durbin_e_s.cloog b/cloog-0.16.3/test/durbin_e_s.cloog
deleted file mode 100644
index 55c0859..0000000
--- a/cloog-0.16.3/test/durbin_e_s.cloog
+++ /dev/null
@@ -1,71 +0,0 @@
-# language: C
-c
-
-# Context
-0 2
-
-0 # parameter names
-
-
-8 # Number of statements
-
-1
-4 5
-    0      1      0      0    -10  
-    0      0      0      1     -4  
-    1      0      1      0     -1  
-    1      0     -1      0     10  
-0 0 0
-1
-4 5
-    0      0      1      0      7  
-    0      0      0      1      0  
-    1      1      0      0     -2  
-    1     -1      0      0     10  
-0 0 0
-1
-4 5
-    0      0      0      1     -1  
-    1      0      1      0      7  
-    1     -1      0      0     10  
-    1      1     -1      0     -9  
-0 0 0
-1
-4 5
-    0      1      0      0     -1  
-    0      0      1      0      0  
-    0      0      0      1      0  
-    1      0      0      0      1  
-0 0 0
-1
-4 5
-    0      0      0      1     -3  
-    1      1     -1      0     -1  
-    1     -1      0      0     10  
-    1      0      1      0     -1  
-0 0 0
-1
-4 5
-    0      1     -1      0     -9  
-    0      0      0      1     -2  
-    1      0      1      0      7  
-    1      0     -1      0      1  
-0 0 0
-1
-4 5
-    0      1      0      0     -1  
-    0      0      1      0      0  
-    0      0      0      1      0  
-    1      0      0      0      1  
-0 0 0
-1
-4 5
-    0      0      1      0      0  
-    0      0      0      1     -3  
-    1      1      0      0     -1  
-    1     -1      0      0      9  
-0 0 0
-0 # iterator names
-0 # scattering functions
-0 # scattering dimension names
-
diff --git a/cloog-0.16.3/test/durbin_e_s.good.c b/cloog-0.16.3/test/durbin_e_s.good.c
deleted file mode 100644
index f96d006..0000000
--- a/cloog-0.16.3/test/durbin_e_s.good.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/* Generated from ../../../git/cloog/test/durbin_e_s.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.05s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-#define S3(i,j,k) { hash(3); hash(i); hash(j); hash(k); }
-#define S4(i,j,k) { hash(4); hash(i); hash(j); hash(k); }
-#define S5(i,j,k) { hash(5); hash(i); hash(j); hash(k); }
-#define S6(i,j,k) { hash(6); hash(i); hash(j); hash(k); }
-#define S7(i,j,k) { hash(7); hash(i); hash(j); hash(k); }
-#define S8(i,j,k) { hash(8); hash(i); hash(j); hash(k); }
-
-void test()
-{
-  /* Original iterators. */
-  int i, j, k;
-  S4(1,0,0) ;
-  S7(1,0,0) ;
-  S8(1,0,3) ;
-  S2(2,-7,0) ;
-  S3(2,-7,1) ;
-  S6(2,-7,2) ;
-  S8(2,0,3) ;
-  S5(2,1,3) ;
-  S2(3,-7,0) ;
-  S3(3,-7,1) ;
-  S3(3,-6,1) ;
-  S6(3,-6,2) ;
-  S8(3,0,3) ;
-  for (j=1;j<=2;j++) {
-    S5(3,j,3) ;
-  }
-  for (i=4;i<=8;i++) {
-    S2(i,-7,0) ;
-    S3(i,-7,1) ;
-    for (j=-6;j<=i-10;j++) {
-      S3(i,j,1) ;
-    }
-    j = i-9 ;
-    S3(i,i-9,1) ;
-    S6(i,i-9,2) ;
-    S8(i,0,3) ;
-    for (j=1;j<=i-1;j++) {
-      S5(i,j,3) ;
-    }
-  }
-  S2(9,-7,0) ;
-  S3(9,-7,1) ;
-  for (j=-6;j<=-1;j++) {
-    S3(9,j,1) ;
-  }
-  S3(9,0,1) ;
-  S6(9,0,2) ;
-  S8(9,0,3) ;
-  for (j=1;j<=8;j++) {
-    S5(9,j,3) ;
-  }
-  S2(10,-7,0) ;
-  S3(10,-7,1) ;
-  for (j=-6;j<=0;j++) {
-    S3(10,j,1) ;
-  }
-  S3(10,1,1) ;
-  S6(10,1,2) ;
-  S5(10,1,3) ;
-  S1(10,1,4) ;
-  for (j=2;j<=9;j++) {
-    S5(10,j,3) ;
-    S1(10,j,4) ;
-  }
-  S1(10,10,4) ;
-}
diff --git a/cloog-0.16.3/test/emploi.c b/cloog-0.16.3/test/emploi.c
deleted file mode 100644
index 1716721..0000000
--- a/cloog-0.16.3/test/emploi.c
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Generated from ../../../git/cloog/test/emploi.cloog by CLooG 0.14.0-245-gd8c1718 gmp bits in 0.01s. */
-if (n >= 1) {
-  if (m >= 1) {
-    for (i=1;i<=n;i++) {
-      S1(i);
-      for (j=1;j<=m;j++) {
-        S2(i,j);
-      }
-    }
-  }
-  if (m <= 0) {
-    for (i=1;i<=n;i++) {
-      S1(i);
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/emploi.cloog b/cloog-0.16.3/test/emploi.cloog
deleted file mode 100644
index 0dd7a26..0000000
--- a/cloog-0.16.3/test/emploi.cloog
+++ /dev/null
@@ -1,49 +0,0 @@
-# language: C
-c
-
-# The context (no constraints on parameters)
-1 4             # 1 lines and 4 columns
-#  m  n  1
-1  0  0  0      # 0 >= 0, always true
-1 # We want to set the parameter names
-m n
-
-2 # The number of statements
-
-2 # First statement
-# The first domain
-3 5              # 3 lines and 5 columns
-#  i  m  n  1 
-1  1  0  0 -1    #  i >= 1
-1 -1  0  1  0    #  i <= n
-1 -1  2  0  0    #  i <= 2*m
-# The second domain
-3 5              # 3 lines and 5 columns
-#  i  m  n  1 
-1  1  0  0 -1    #  i >= 1
-1 -1  0  1  0    #  i <= n
-1  1 -1  0  0    #  i >= m
-0 0 0
-
-1 # Second statement
-4 6              # 4 lines and 6 columns
-#  i  j  m  n  1 
-1  1  0  0  0 -1 #  i >= 1
-1 -1  0  0  1  0 #  i <= n
-1  0  1  0  0 -1 #  j >= 1
-1  0 -1  1  0  0 #  j <= m
-0 0 0
-0
-
-0 # Scattering functions
-# The first function
-2 7                    # 2 lines and 7 columns
-# c1 c2  i  m  n  1 
-0  1  0 -1  0  0  0    #  c1 = i
-0  0  1  0  0  0  0    #  c2 = 0
-# The second function
-2 8                    # 2 lines and 8 columns
-# c1 c2  i  j  m  n  1 
-0  1  0  0  0  0 -1  0 #  c1 = n
-0  0  1 -1 -1  0  0  0 #  c2 = i+j
-0
diff --git a/cloog-0.16.3/test/emploi.good.c b/cloog-0.16.3/test/emploi.good.c
deleted file mode 100644
index ad812d8..0000000
--- a/cloog-0.16.3/test/emploi.good.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Generated from ../../../git/cloog/test/emploi.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int m, int n)
-{
-  /* Original iterators. */
-  int i, j;
-  if (m >= 1) {
-    for (i=1;i<=n;i++) {
-      if (i >= m) {
-        S1(i) ;
-      }
-      if (i <= min(2*m,m-1)) {
-        S1(i) ;
-      }
-      for (j=1;j<=m;j++) {
-        S2(i,j) ;
-      }
-    }
-  }
-  if (m <= 0) {
-    for (i=1;i<=n;i++) {
-      S1(i) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/equality.c b/cloog-0.16.3/test/equality.c
deleted file mode 100644
index 86b024d..0000000
--- a/cloog-0.16.3/test/equality.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Generated from ../../../git/cloog/test/equality.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-for (i0=0;i0<=5;i0++) {
-  for (i1=ceild(4*i0,5);i1<=floord(6*i0+20,5);i1++) {
-    if (2*i0 == i1) {
-      S1(i0,i1) ;
-    }
-    if (i1 == 4) {
-      S2(i0,i1) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/equality.cloog b/cloog-0.16.3/test/equality.cloog
deleted file mode 100644
index da83671..0000000
--- a/cloog-0.16.3/test/equality.cloog
+++ /dev/null
@@ -1,33 +0,0 @@
-# Language: C
-c
-
-# Context (0 parameter(s)):
-1 2
-   1    1 
-1 # Parameter name(s)
-
-
-# Statement number:
-2
-
-# Iteration domain of statement 1.
-1
-3 4
-0 2 -1 0
-1 1 0 0
-1 -1 0 5
-0 0 0 # For future options.
-
-# Iteration domain of statement 2.
-1
-3 4
-0 0 -1 4
-1 1 0 0
-1 -1 0 5
-0 0 0 # For future options.
-
-1 # Iterator name(s)
-i0 i1
-
-# No scattering functions.
-0
diff --git a/cloog-0.16.3/test/equality.good.c b/cloog-0.16.3/test/equality.good.c
deleted file mode 100644
index 371f48b..0000000
--- a/cloog-0.16.3/test/equality.good.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Generated from ../../../git/cloog/test/equality.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i0,i1) { hash(1); hash(i0); hash(i1); }
-#define S2(i0,i1) { hash(2); hash(i0); hash(i1); }
-
-void test()
-{
-  /* Original iterators. */
-  int i0, i1;
-  for (i0=0;i0<=5;i0++) {
-    for (i1=ceild(4*i0,5);i1<=floord(6*i0+20,5);i1++) {
-      if (2*i0 == i1) {
-        S1(i0,i1) ;
-      }
-      if (i1 == 4) {
-        S2(i0,i1) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/equality2.c b/cloog-0.16.3/test/equality2.c
deleted file mode 100644
index ea28ab2..0000000
--- a/cloog-0.16.3/test/equality2.c
+++ /dev/null
@@ -1,15 +0,0 @@
-/* Generated from ../../../git/cloog/test/equality2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.07s. */
-for (i0=1;i0<=10000;i0++) {
-  for (i1=1000;i1<=1016;i1++) {
-    for (i2=1;i2<=min(-2*i1+2033,2*i1-1999);i2++) {
-      if (2*i1 == i2+1999) {
-        S2(i0,i1,i2,1,i0,2*i1-1000,1,2,i0,i1-499,2*i1-1999,i0,2*i1-1999,i1-999,i1-999) ;
-      }
-      if (i2 == 1) {
-        if (i1%2 == 0) {
-          S1(i0,i1,i2,2,i0,(i1+2)/2,i1-999,i0,i1-999,(i1-998)/2,(i1-998)/2) ;
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/equality2.cloog b/cloog-0.16.3/test/equality2.cloog
deleted file mode 100644
index c62469c..0000000
--- a/cloog-0.16.3/test/equality2.cloog
+++ /dev/null
@@ -1,57 +0,0 @@
-c
-
-# Context (0 parameter(s)):
-1 2
-   1    1 
-1 # Parameter name(s)
-
-
-# Statement number:
-2
-
-# Iteration domain of statement 2.
-1
-13 13
-   0    1    0    0    0    0    0    0   -1    0    0    0    0 
-   0    0    1    0    0    0    0    0    0    0    0   -2 -998 
-   0    0    0    1    0    0    0    0    0    0    0    0   -1 
-   0    0    0    0    1    0    0    0    0    0    0    0   -2 
-   0    0    0    0    0    1    0    0   -1    0    0    0    0 
-   0    0    0    0    0    0    1    0    0    0    0   -1 -500 
-   0    0    0    0    0    0    0    1    0    0    0   -2    1 
-   0    0    0    0    0    0    0    0    0    1    0   -2    1 
-   0    0    0    0    0    0    0    0    0    0    1   -1    0 
-   1    0    0    0    0    0    0    0    1    0    0    0   -1 
-   1    0    0    0    0    0    0    0   -1    0    0    0 10000 
-   1    0    0    0    0    0    0    0    0    0    0    1   -1 
-   1    0    0    0    0    0    0    0    0    0    0   -1    9 
-0 0 0 # For future options.
-
-# Iteration domain of statement 3.
-1
-17 17
-   0    1    0    0    0    0    0    0    0    0    0    0   -1    0    0    0    0 
-   0    0    1    0    0    0    0    0    0    0    0    0    0    0    0   -1 -999 
-   0    0    0    1    0    0    0    0    0    0    0    0    0    0    0   -2    1 
-   0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0   -1 
-   0    0    0    0    0    1    0    0    0    0    0    0   -1    0    0    0    0 
-   0    0    0    0    0    0    1    0    0    0    0    0    0    0    0   -2 -998 
-   0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0   -1 
-   0    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0   -2 
-   0    0    0    0    0    0    0    0    0    1    0    0   -1    0    0    0    0 
-   0    0    0    0    0    0    0    0    0    0    1    0    0    0    0   -1 -500 
-   0    0    0    0    0    0    0    0    0    0    0    1    0    0    0   -2    1 
-   0    0    0    0    0    0    0    0    0    0    0    0    0    1    0   -2    1 
-   0    0    0    0    0    0    0    0    0    0    0    0    0    0    1   -1    0 
-   1    0    0    0    0    0    0    0    0    0    0    0    1    0    0    0   -1 
-   1    0    0    0    0    0    0    0    0    0    0    0   -1    0    0    0 10000 
-   1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1   -1 
-   1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1    9 
-0 0 0 # For future options.
-
-
-1 # Iterator name(s)
-i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i10 i11 i12 i13 i14 
-
-# No scattering functions.
-0
diff --git a/cloog-0.16.3/test/equality2.good.c b/cloog-0.16.3/test/equality2.good.c
deleted file mode 100644
index 74bf88b..0000000
--- a/cloog-0.16.3/test/equality2.good.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Generated from ../../../git/cloog/test/equality2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.05s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i0,i1,i2,i3,i4,i5,i6,i7,i8,i9,i10) { hash(1); hash(i0); hash(i1); hash(i2); hash(i3); hash(i4); hash(i5); hash(i6); hash(i7); hash(i8); hash(i9); hash(i10); }
-#define S2(i0,i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14) { hash(2); hash(i0); hash(i1); hash(i2); hash(i3); hash(i4); hash(i5); hash(i6); hash(i7); hash(i8); hash(i9); hash(i10); hash(i11); hash(i12); hash(i13); hash(i14); }
-
-void test()
-{
-  /* Original iterators. */
-  int i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14;
-  for (i0=1;i0<=10000;i0++) {
-    for (i1=1000;i1<=1016;i1++) {
-      for (i2=1;i2<=min(-2*i1+2033,2*i1-1999);i2++) {
-        if (2*i1 == i2+1999) {
-          S2(i0,i1,i2,1,i0,2*i1-1000,1,2,i0,i1-499,2*i1-1999,i0,2*i1-1999,i1-999,i1-999) ;
-        }
-        if (i2 == 1) {
-          if (i1%2 == 0) {
-            S1(i0,i1,i2,2,i0,(i1+2)/2,i1-999,i0,i1-999,(i1-998)/2,(i1-998)/2) ;
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/esced.c b/cloog-0.16.3/test/esced.c
deleted file mode 100644
index d26d395..0000000
--- a/cloog-0.16.3/test/esced.c
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Generated from ../../../git/cloog/test/esced.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if (m >= 1) {
-  if (n >= 1) {
-    for (i=1;i<=m;i++) {
-      S1(i) ;
-      for (j=1;j<=n;j++) {
-        S2(i,j) ;
-      }
-    }
-  }
-  if (n <= 0) {
-    for (i=1;i<=m;i++) {
-      S1(i) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/esced.cloog b/cloog-0.16.3/test/esced.cloog
deleted file mode 100644
index 9caba01..0000000
--- a/cloog-0.16.3/test/esced.cloog
+++ /dev/null
@@ -1,30 +0,0 @@
-# language: C
-c
-
-# parameters {n, m | n<=m}
-1 4
-#1  1 -1  0
-1  0  0  1
-1
-n m
-
-2 # Number of statements
-
-1
-# {i | 1<=i<=n}
-2 5
-1  1  0  0 -1
-1 -1  0  1  0
-0 0 0
- 
-1
-# {i, j | 1<=i<=n 1<=j<=m}
-4 6
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-0 0 0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/esced.good.c b/cloog-0.16.3/test/esced.good.c
deleted file mode 100644
index cab5f34..0000000
--- a/cloog-0.16.3/test/esced.good.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Generated from ../../../git/cloog/test/esced.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int n, int m)
-{
-  /* Original iterators. */
-  int i, j;
-  if (n >= 1) {
-    for (i=1;i<=m;i++) {
-      S1(i) ;
-      for (j=1;j<=n;j++) {
-        S2(i,j) ;
-      }
-    }
-  }
-  if (n <= 0) {
-    for (i=1;i<=m;i++) {
-      S1(i) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/ex1.c b/cloog-0.16.3/test/ex1.c
deleted file mode 100644
index b5584c0..0000000
--- a/cloog-0.16.3/test/ex1.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Generated from ../../../git/cloog/test/ex1.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-for (i=0;i<=14;i++) {
-  for (j=0;j<=n-15;j++) {
-    S1(i,j) ;
-  }
-}
-for (i=15;i<=n;i++) {
-  for (j=0;j<=9;j++) {
-    S1(i,j) ;
-  }
-  for (j=10;j<=n-15;j++) {
-    S1(i,j) ;
-    S2(i,j) ;
-  }
-  for (j=n-14;j<=n;j++) {
-    S2(i,j) ;
-  }
-}
diff --git a/cloog-0.16.3/test/ex1.cloog b/cloog-0.16.3/test/ex1.cloog
deleted file mode 100644
index 6a85398..0000000
--- a/cloog-0.16.3/test/ex1.cloog
+++ /dev/null
@@ -1,34 +0,0 @@
-# language: C
-c
-
-# parameters {n}
-1 3
-#  n  1
-1  1 -25
-1
-n
-
-2 # Number of statements
-
-1
-# {i | 0<=i<=n, 0<=j<=n-15}
-4 5
-#  i  j  n  1
-1  1  0  0  0
-1 -1  0  1  0
-1  0  1  0  0
-1  0 -1  1 -15
-0  0  0
- 
-1
-# {i | 15<=i<=n, 10<=j<=n}
-4 5
-#  i  j  n  1
-1  1  0  0 -15
-1 -1  0  1  0
-1  0  1  0 -10
-1  0 -1  1  0
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/ex1.good.c b/cloog-0.16.3/test/ex1.good.c
deleted file mode 100644
index b73fd94..0000000
--- a/cloog-0.16.3/test/ex1.good.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Generated from ../../../git/cloog/test/ex1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int n)
-{
-  /* Original iterators. */
-  int i, j;
-  for (i=0;i<=14;i++) {
-    for (j=0;j<=n-15;j++) {
-      S1(i,j) ;
-    }
-  }
-  for (i=15;i<=n;i++) {
-    for (j=0;j<=9;j++) {
-      S1(i,j) ;
-    }
-    for (j=10;j<=n-15;j++) {
-      S1(i,j) ;
-      S2(i,j) ;
-    }
-    for (j=n-14;j<=n;j++) {
-      S2(i,j) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/forwardsub-1-1-2.c b/cloog-0.16.3/test/forwardsub-1-1-2.c
deleted file mode 100644
index 58ce5c8..0000000
--- a/cloog-0.16.3/test/forwardsub-1-1-2.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Generated from ../../../git/cloog/test/forwardsub-1-1-2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-S3(1,1) ;
-S1(2,1) ;
-S4(2,2) ;
-for (i=3;i<=M;i++) {
-  S1(i,1) ;
-  for (j=2;j<=i-1;j++) {
-    S2(i,j) ;
-  }
-  S4(i,i) ;
-}
diff --git a/cloog-0.16.3/test/forwardsub-1-1-2.cloog b/cloog-0.16.3/test/forwardsub-1-1-2.cloog
deleted file mode 100644
index 38986f9..0000000
--- a/cloog-0.16.3/test/forwardsub-1-1-2.cloog
+++ /dev/null
@@ -1,56 +0,0 @@
-# language: C
-c
-
-# Context
-#{N | 3<=N}
-2 3
-#   M   1
-1   1  -3
-1   0   1
-0
-
-4 # Number of statements
-
-1
-#{t1,t2 | 2<=t1<=N; t2=1; 3<=N}
-5 5
-#   i    j   M   1
-0   0    1   0  -1
-1   0    0   1  -3
-1  -1    0   1   0
-1   1    0   0  -2
-1   0    0   0   1
-0 0 0
-
-1
-#{t1,t2 | t2+1<=t1<=N; 2<=t2}
-4 5
-#   i    j    M   1
-1   1   -1    0  -1
-1   0    1    0  -2
-1  -1    0    1   0
-1   0    0    0   1
-0 0 0
-
-1
-#{t1,t2 | t1=1; t2=1; 3<=N}
-4 5
-#   i   j   M    1
-0   1   0   0   -1
-0   0   1   0   -1
-1   0   0   1   -3
-1   0   0   0    1
-0 0 0
-
-1
-#{t1,t2 | t1=t2; 2<=t2<=N; 3<=N}
-4 5
-#   i   j    M   1
-0   1   -1   0   0
-1   0   0    1   -3
-1   0   -1   1   0
-1   0   1    0   -2
-0 0 0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/forwardsub-1-1-2.good.c b/cloog-0.16.3/test/forwardsub-1-1-2.good.c
deleted file mode 100644
index cebe239..0000000
--- a/cloog-0.16.3/test/forwardsub-1-1-2.good.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Generated from ../../../git/cloog/test/forwardsub-1-1-2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j;
-  S3(1,1) ;
-  S1(2,1) ;
-  S4(2,2) ;
-  for (i=3;i<=M;i++) {
-    S1(i,1) ;
-    for (j=2;j<=i-1;j++) {
-      S2(i,j) ;
-    }
-    S4(i,i) ;
-  }
-}
diff --git a/cloog-0.16.3/test/forwardsub-2-1-2-3.c b/cloog-0.16.3/test/forwardsub-2-1-2-3.c
deleted file mode 100644
index 7c4bc22..0000000
--- a/cloog-0.16.3/test/forwardsub-2-1-2-3.c
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Generated from ../../../git/cloog/test/forwardsub-2-1-2-3.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-S3(1,0) ;
-for (k=2;k<=M;k++) {
-  S1(1,1,k) ;
-}
-for (i=2;i<=M-1;i++) {
-  S4(i,0) ;
-  for (k=i+1;k<=M;k++) {
-    S2(i,1,k) ;
-  }
-}
-S4(M,0) ;
diff --git a/cloog-0.16.3/test/forwardsub-2-1-2-3.cloog b/cloog-0.16.3/test/forwardsub-2-1-2-3.cloog
deleted file mode 100644
index 33d29f3..0000000
--- a/cloog-0.16.3/test/forwardsub-2-1-2-3.cloog
+++ /dev/null
@@ -1,58 +0,0 @@
-# language: C
-c
-
-# Context
-#{M | 3<=M}
-2 3
-#   M   1
-1   1  -3
-1   0   1
-0
-
-4 # Number of statements
-
-1
-#{i,j,k | i=1; j=1; 2<=k<=M; 3<=M}
-6 6
-#   i   j   k    M    1
-0   1   0   0    0   -1
-0   0   1   0    0   -1
-1   0   0   0    1   -3
-1   0   0   -1   1   0
-1   0   0   1    0   -2
-1   0   0   0    0   1
-0 0 0
-
-1
-#{i,j,k | 2<=i<=k-1; j=1; k<=M}
-5 6
-#   i    j   k    M    1
-0   0    1   0    0   -1
-1   -1   0   1    0   -1
-1   1    0   0    0   -2
-1   0    0   -1   1   0
-1   0    0   0    0   1
-0 0 0
-
-1
-#{i,j | i=1; j=0; 3<=M}
-4 5
-#   i   j   M    1
-0   1   0   0   -1
-0   0   1   0   0
-1   0   0   1   -3
-1   0   0   0   1
-0 0 0
-
-1
-#{i,j | 2<=i<=M; j=0; 3<=M}
-4 5
-#   i    j   M    1
-0   0    1   0   0
-1   1    0   0   -2
-1   0    0   1   -3
-1   -1   0   1   0
-0 0 0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/forwardsub-2-1-2-3.good.c b/cloog-0.16.3/test/forwardsub-2-1-2-3.good.c
deleted file mode 100644
index 69ff99c..0000000
--- a/cloog-0.16.3/test/forwardsub-2-1-2-3.good.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Generated from ../../../git/cloog/test/forwardsub-2-1-2-3.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j, k;
-  S3(1,0) ;
-  for (k=2;k<=M;k++) {
-    S1(1,1,k) ;
-  }
-  for (i=2;i<=M-1;i++) {
-    S4(i,0) ;
-    for (k=i+1;k<=M;k++) {
-      S2(i,1,k) ;
-    }
-  }
-  S4(M,0) ;
-}
diff --git a/cloog-0.16.3/test/forwardsub-3-1-2.c b/cloog-0.16.3/test/forwardsub-3-1-2.c
deleted file mode 100644
index 0f398ed..0000000
--- a/cloog-0.16.3/test/forwardsub-3-1-2.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Generated from ../../../git/cloog/test/forwardsub-3-1-2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.02s. */
-S3(2,1) ;
-S1(3,1) ;
-S1(4,1) ;
-S4(4,2) ;
-for (i=5;i<=M+1;i++) {
-  S1(i,1) ;
-  for (j=2;j<=floord(i-1,2);j++) {
-    S2(i,j) ;
-  }
-  if (i%2 == 0) {
-    S4(i,i/2) ;
-  }
-}
-for (i=M+2;i<=2*M-1;i++) {
-  for (j=i-M;j<=floord(i-1,2);j++) {
-    S2(i,j) ;
-  }
-  if (i%2 == 0) {
-    S4(i,i/2) ;
-  }
-}
-S4(2*M,M) ;
diff --git a/cloog-0.16.3/test/forwardsub-3-1-2.cloog b/cloog-0.16.3/test/forwardsub-3-1-2.cloog
deleted file mode 100644
index 6e41e75..0000000
--- a/cloog-0.16.3/test/forwardsub-3-1-2.cloog
+++ /dev/null
@@ -1,57 +0,0 @@
-# language: C
-c
-
-# Context
-#{N | 3<=N}
-2 3
-#   M  1
-1   1   -3
-1   0   1
-0
-
-4 # Number of statements
-
-1
-#{t1,i | 3<=t1<=N+1; i=1; 3<=N}
-5 5
-#   i    j   M   1
-0   0    1   0   -1
-1   0    0   1   -3
-1   -1   0   1   1
-1   1    0   0   -3
-1   0    0   0   1
-0 0 0
-
-1
-#{t1,i | 2i+1<=t1<=i+N; 2<=i}
-4 5
-#   i    j    M   1
-1   1    -2   0   -1
-1   0    1    0   -2
-1   -1   1    1   0
-1   0    0    0   1
-0 0 0
-
-1
-#{t1,i | t1=2; i=1; 3<=N}
-4 5
-#   i   j   M   1
-0   1   0   0   -2
-0   0   1   0   -1
-1   0   0   1   -3
-1   0   0   0   1
-0 0 0
-
-1
-#{t1,i | t1=2i; 2<=i<=N; 3<=N}
-5 5
-#   i    j   M   1
-0   1   -2   0   0
-1   0   0    1   -3
-1   0   -1   1   0
-1   0   1    0   -2
-1   0   0    0   1
-0 0 0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/forwardsub-3-1-2.good.c b/cloog-0.16.3/test/forwardsub-3-1-2.good.c
deleted file mode 100644
index 2969ae8..0000000
--- a/cloog-0.16.3/test/forwardsub-3-1-2.good.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Generated from ../../../git/cloog/test/forwardsub-3-1-2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j;
-  S3(2,1) ;
-  S1(3,1) ;
-  S1(4,1) ;
-  S4(4,2) ;
-  for (i=5;i<=M+1;i++) {
-    S1(i,1) ;
-    for (j=2;j<=floord(i-1,2);j++) {
-      S2(i,j) ;
-    }
-    if (i%2 == 0) {
-      S4(i,i/2) ;
-    }
-  }
-  for (i=M+2;i<=2*M-1;i++) {
-    for (j=i-M;j<=floord(i-1,2);j++) {
-      S2(i,j) ;
-    }
-    if (i%2 == 0) {
-      S4(i,i/2) ;
-    }
-  }
-  i = 2*M ;
-  S4(2*M,M) ;
-}
diff --git a/cloog-0.16.3/test/gauss.c b/cloog-0.16.3/test/gauss.c
deleted file mode 100644
index 341c2aa..0000000
--- a/cloog-0.16.3/test/gauss.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Generated from ../../../git/cloog/test/gauss.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.03s. */
-if (M >= 2) {
-  for (c2=2;c2<=M;c2++) {
-    for (j=2;j<=M;j++) {
-      S2(1,j,c2) ;
-    }
-  }
-  for (c1=2;c1<=M-1;c1++) {
-    for (c2=c1+1;c2<=M;c2++) {
-      for (j=1;j<=c1-1;j++) {
-        S1(c1,j,c2) ;
-      }
-      for (j=c1+1;j<=M;j++) {
-        S2(c1,j,c2) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/gauss.cloog b/cloog-0.16.3/test/gauss.cloog
deleted file mode 100644
index 0a84b01..0000000
--- a/cloog-0.16.3/test/gauss.cloog
+++ /dev/null
@@ -1,72 +0,0 @@
-# language: C
-c
-
-# parameter n
-1 3
-#  n  1
-1  0  1
-0
-
-2 # Number of statements
-
-1
-# {i, j, k | 1<=i<=n; 1<=j<=i-1 i+1<=k<=n}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  1 -1  0  0 -1
-1 -1  0  1  0 -1
-1  0  0 -1  1  0
-0  0  0
-
-1
-# {i, j, k | 1<=i<=n; i+1<=j<=n i+1<=k<=n}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1 -1  1  0  0 -1
-1  0 -1  0  1  0
-1 -1  0  1  0 -1
-1  0  0 -1  1  0
-0  0  0
-0
-
-2 # Scattering functions
-# Et les instructions de chunking...
-2 8
-# c1 c2  i  j  k  n  1
-0  1  0 -1  0  0  0  0
-0  0  1  0  0 -1  0  0
-
-2 8
-# c1 c2  i  j  k  n  1
-0  1  0 -1  0  0  0  0
-0  0  1  0  0 -1  0  0
-0
-
-2
-# Et les instructions de chunking...
-1 7
-# c1  i  j  k  n  1
-0  1  0  0  0 -1  2
-
-1 7
-# c1  i  j  k  n  1
-0  1 -1  0  0  0  1
-0
-
-2
-# Et les instructions de chunking...
-2 8
-# c1 c2  i  j  k  n  1
-0  1  0 -1  0  0  0  0
-0  0  1  0  0 -1  0  0
-
-2 8
-# c1 c2  i  j  k  n  1
-0  1  0 -1  0  0  0  0
-0  0  1  0  0 -1  0  0
-0
diff --git a/cloog-0.16.3/test/gauss.good.c b/cloog-0.16.3/test/gauss.good.c
deleted file mode 100644
index fb1939d..0000000
--- a/cloog-0.16.3/test/gauss.good.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Generated from ../../../git/cloog/test/gauss.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c1, c2;
-  /* Original iterators. */
-  int i, j, k;
-  if (M >= 2) {
-    for (c2=2;c2<=M;c2++) {
-      for (j=2;j<=M;j++) {
-        S2(1,j,c2) ;
-      }
-    }
-  }
-  for (c1=2;c1<=M-1;c1++) {
-    for (c2=c1+1;c2<=M;c2++) {
-      for (j=1;j<=c1-1;j++) {
-        S1(c1,j,c2) ;
-      }
-      for (j=c1+1;j<=M;j++) {
-        S2(c1,j,c2) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/generate_test.c b/cloog-0.16.3/test/generate_test.c
deleted file mode 100644
index 40a8dbd..0000000
--- a/cloog-0.16.3/test/generate_test.c
+++ /dev/null
@@ -1,153 +0,0 @@
-#include <stdio.h>
-#include <cloog/cloog.h>
-
-/* Generate code that scans part of the parameter domain of
- * a given cloog problem, running both a function called "good"
- * and a function called "test" for each value of the parameters.
- * These functions are assumed to call the "hash" function,
- * which is also generated by this program.
- * If for any given value of the parameters, the final hash
- * value computed by test is different from that computed by
- * good, then an error is reported.
- */
-
-CloogDomain *get_param_domain(CloogOptions *options)
-{
-	CloogDomain *domain;
-	CloogProgram *program;
-  
-	program = cloog_program_read(stdin, options);
-
-	domain = cloog_domain_copy(program->context);
-
-	cloog_program_free(program);
-
-	return cloog_domain_from_context(domain);
-}
-
-static const char preamble[] =
-"#include <assert.h>\n"
-"#include <stdio.h>\n"
-"\n"
-"static unsigned h;\n"
-"\n"
-"void hash(int v)\n"
-"{\n"
-"	int i;\n"
-"	union u {\n"
-"		int v;\n"
-"		unsigned char c[1];\n"
-"	} u;\n"
-"	u.v = v;\n"
-"	for (i = 0; i < sizeof(int); ++i) {\n"
-" 		h *= 16777619;\n"
-"		h ^= u.c[i];\n"
-"	}\n"
-"}\n"
-"\n"
-"int main()\n"
-"{\n"
-"	unsigned h_good, h_test;\n";
-;
-
-static const char postamble[] =
-"	return 0;\n"
-"}\n"
-;
-
-static const char *call[] = {"good", "test"};
-
-static void print_macros(FILE *file)
-{
-	fprintf(file, "/* Useful macros. */\n") ;
-	fprintf(file,
-	    "#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))\n");
-	fprintf(file,
-	    "#define ceild(n,d) (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))\n");
-	fprintf(file, "#define max(x,y)    ((x) > (y) ? (x) : (y))\n") ; 
-	fprintf(file, "#define min(x,y)    ((x) < (y) ? (x) : (y))\n\n") ; 
-}
-
-int main()
-{
-	int dim;
-	int range;
-	int i, j;
-	CloogState *state = cloog_state_malloc();
-	CloogOptions *options = cloog_options_malloc(state);
-	CloogDomain *domain;
-	CloogDomain *cube, *tmp;
-	CloogProgram *p;
-	CloogStatement *statement;
-	cloog_int_t m, M;
-
-	options->quiet = 1;
-	domain = get_param_domain(options);
-	dim = cloog_domain_dimension(domain);
-
-	if (dim >= 8)
-		range = 4;
-	else if (dim >= 5)
-		range = 6;
-	else
-		range = 30;
-
-	cloog_int_init(m);
-	cloog_int_init(M);
-	cloog_int_set_si(m, 0);
-	cloog_int_set_si(M, range);
-	cube = cloog_domain_cube(state, dim, m, M);
-	domain = cloog_domain_intersection(tmp = domain, cube);
-	cloog_domain_free(tmp);
-	cloog_domain_free(cube);
-
-	p = cloog_program_malloc();
-	assert(p);
-	p->names = cloog_names_malloc();
-	assert(p->names);
-	p->names->nb_iterators = dim;
-	p->names->iterators = cloog_names_generate_items(dim, "p", 0);
-	p->language = 'c';
-	p->context = cloog_domain_universe(state, 0);
-	statement = cloog_statement_alloc(state, 1);
-	p->loop = cloog_loop_malloc(state);
-	p->loop->domain = domain;
-	p->loop->block = cloog_block_alloc(statement, 0, NULL, dim);
-	p->blocklist = cloog_block_list_alloc(p->loop->block);
-	p = cloog_program_generate(p, options);
-
-	printf("%s", preamble);
-	for (i = 0; i < dim; ++i)
-		printf("\tint %s;\n", p->names->iterators[i]);
-	printf("#define S1(");
-	for (i = 0; i < dim; ++i) {
-		if (i)
-			printf(",");
-		printf("p%d", i);
-	}
-	printf(") do {");
-	for (j = 0; j < 2; ++j) {
-		printf(" h = 2166136261u;");
-		printf(" %s(", call[j]);
-		for (i = 0; i < dim; ++i) {
-			if (i)
-				printf(", ");
-			printf("p%d", i);
-		}
-		printf(");");
-		printf(" h_%s = h;", call[j]);
-	}
-	printf(" assert(h_good == h_test);");
-	printf(" } while (0)\n");
-	print_macros(stdout);
-	cloog_program_pprint(stdout, p, options);
-	printf("%s", postamble);
-
-	cloog_int_clear(m);
-	cloog_int_clear(M);
-	cloog_program_free(p);
-	cloog_options_free(options);
-	cloog_state_free(state);
-
-	return 0;
-}
diff --git a/cloog-0.16.3/test/gesced.c b/cloog-0.16.3/test/gesced.c
deleted file mode 100644
index 6b69507..0000000
--- a/cloog-0.16.3/test/gesced.c
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Generated from ../../../git/cloog/test/gesced.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.05s. */
-for (c1=1;c1<=N;c1++) {
-  S1(c1) ;
-}
-for (c1=N+1;c1<=2*N;c1++) {
-  for (i=1;i<=N;i++) {
-    S2(i,c1-N) ;
-  }
-}
-for (c1=2*N+1;c1<=M+N;c1++) {
-  for (i=1;i<=N;i++) {
-    S3(i,c1-2*N) ;
-    S2(i,c1-N) ;
-  }
-}
-for (c1=M+N+1;c1<=M+2*N;c1++) {
-  for (i=1;i<=N;i++) {
-    S3(i,c1-2*N) ;
-  }
-}
diff --git a/cloog-0.16.3/test/gesced.cloog b/cloog-0.16.3/test/gesced.cloog
deleted file mode 100644
index 5f37046..0000000
--- a/cloog-0.16.3/test/gesced.cloog
+++ /dev/null
@@ -1,56 +0,0 @@
-# language: C
-c
-
-# parameters {n, m | n<=m n>=2 m>=2}
-3 4
-#  m  n  1
-1  1 -1  0
-1  1  0 -2
-1  0  1 -2
-0
-
-3 # Number of statements
-
-1
-# {i | 1<=i<=n}
-2 5
-#  i  m  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-0  0  0
- 
-1
-# {i, j | 1<=i<=n 1<=j<=m}
-4 6
-#  i  j  m  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-0  0  0
-
-1
-# {i, j | 1<=i<=n 1<=j<=m}
-4 6
-#  i  j  m  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-0  0  0
-0
-
-3 # Scattering functions
-# Et les instructions de chunking (prog init)...
-1 6
-# c1  i  m  n  1
-0  1 -1  0  0  0
-
-1 7
-# c1  i  j  m  n  1
-0  1  0 -1  0 -1  0
-
-1 7
-# c1  i  j  m  n  1
-0  1  0 -1  0 -2  0
-0
diff --git a/cloog-0.16.3/test/gesced.good.c b/cloog-0.16.3/test/gesced.good.c
deleted file mode 100644
index bae55dd..0000000
--- a/cloog-0.16.3/test/gesced.good.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Generated from ../../../git/cloog/test/gesced.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int c1;
-  /* Original iterators. */
-  int i, j;
-  for (c1=1;c1<=N;c1++) {
-    S1(c1) ;
-  }
-  for (c1=N+1;c1<=2*N;c1++) {
-    for (i=1;i<=N;i++) {
-      j = c1-N ;
-      S2(i,c1-N) ;
-    }
-  }
-  for (c1=2*N+1;c1<=M+N;c1++) {
-    for (i=1;i<=N;i++) {
-      j = c1-2*N ;
-      S3(i,c1-2*N) ;
-      j = c1-N ;
-      S2(i,c1-N) ;
-    }
-  }
-  for (c1=M+N+1;c1<=M+2*N;c1++) {
-    for (i=1;i<=N;i++) {
-      j = c1-2*N ;
-      S3(i,c1-2*N) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/gesced2.c b/cloog-0.16.3/test/gesced2.c
deleted file mode 100644
index 5cebdb5..0000000
--- a/cloog-0.16.3/test/gesced2.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/gesced2.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.03s. */
-for (c1=1;c1<=4;c1++) {
-  for (c2=5;c2<=M-10;c2++) {
-    S1(c1,c2);
-  }
-}
-for (c1=5;c1<=M-10;c1++) {
-  for (c2=-c1+1;c2<=4;c2++) {
-    S2(c1+c2,c1);
-  }
-  for (c2=5;c2<=min(M-10,-c1+M);c2++) {
-    S1(c1,c2);
-    S2(c1+c2,c1);
-  }
-  for (c2=-c1+M+1;c2<=M-10;c2++) {
-    S1(c1,c2);
-  }
-  for (c2=M-9;c2<=-c1+M;c2++) {
-    S2(c1+c2,c1);
-  }
-}
-for (c1=M-9;c1<=M;c1++) {
-  for (c2=5;c2<=M-10;c2++) {
-    S1(c1,c2);
-  }
-}
diff --git a/cloog-0.16.3/test/gesced2.cloog b/cloog-0.16.3/test/gesced2.cloog
deleted file mode 100644
index 982368b..0000000
--- a/cloog-0.16.3/test/gesced2.cloog
+++ /dev/null
@@ -1,82 +0,0 @@
-# language: C
-c
-
-# parameters {n | n>=16}
-1 3
-#  n  1
-1  1 -16
-0
-
-2 # Number of statements
-
-1
-# {i, j | 1<=i<=n 5<=j<=n-10}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1  0  1  0 -5
-1  0 -1  1 -10
-0  0  0
-
-1
-# {i, j | 1<=i<=n 5<=j<=n-10}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1  0  1  0 -5
-1  0 -1  1 -10
-0  0  0
-0
-
-2 # Scattering functions
-# Et les instructions de chunking (sol triviale)...
-2 7
-# c1 c2  i  j  n  1
-0  1  0 -1  0  0  0
-0  0  1  0 -1  0  0
-
-2 7
-# c1 c2  i  j  n  1
-0  1  0  0 -1  0  0
-0  0  1 -1  1  0  0
-0
-
-# Et les instructions de chunking (sol aux inverse)...
-2 7
-# c1 c2  i    j  n  1
-0  1  0 -10  -3  0 -5
-0  0  1 -4   -1  0  5
-
-2 7
-# c1 c2  i    j  n  1
-0  1  0 -9   -4  0 -15
-0  0  1 -5    0  0  0
-0
-
-2
-# Et les instructions de chunking (sol aux egalites)...
-2 7
-# c1 c2  i    j  n  1
-0  1  0  1   -2  0  -30
-0  0  1 -1    1  0  30
-
-2 7
-# c1 c2  i    j  n  1
-0  1  0 -1    1  0  15
-0  0  1  1   -2  0 -30
-0
-
-# Et les instructions de chunking (sol triviale)...
-2 7
-# c1 c2  i  j  n  1
-0  1  0 -1  0  0  0
-0  0  1  0 -1  0  5
-
-2 7
-# c1 c2  i  j  n  1
-0  1  0  0 -1  0 -10
-0  0  1 -1  0  0  0
-0
-
diff --git a/cloog-0.16.3/test/gesced2.good.c b/cloog-0.16.3/test/gesced2.good.c
deleted file mode 100644
index 669093a..0000000
--- a/cloog-0.16.3/test/gesced2.good.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/* Generated from ../../../git/cloog/test/gesced2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.04s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c1, c2;
-  /* Original iterators. */
-  int i, j;
-  for (c1=1;c1<=4;c1++) {
-    for (c2=5;c2<=M-10;c2++) {
-      S1(c1,c2) ;
-    }
-  }
-  for (c1=5;c1<=min(M-10,9);c1++) {
-    for (c2=-c1+1;c2<=4;c2++) {
-      i = c1+c2 ;
-      S2(c1+c2,c1) ;
-    }
-    for (c2=5;c2<=M-10;c2++) {
-      S1(c1,c2) ;
-      i = c1+c2 ;
-      S2(c1+c2,c1) ;
-    }
-    for (c2=M-9;c2<=-c1+M;c2++) {
-      i = c1+c2 ;
-      S2(c1+c2,c1) ;
-    }
-  }
-  if (M >= 20) {
-    for (c2=-9;c2<=4;c2++) {
-      i = c2+10 ;
-      S2(c2+10,10) ;
-    }
-    for (c2=5;c2<=M-10;c2++) {
-      S1(10,c2) ;
-      i = c2+10 ;
-      S2(c2+10,10) ;
-    }
-  }
-  for (c1=11;c1<=M-10;c1++) {
-    for (c2=-c1+1;c2<=4;c2++) {
-      i = c1+c2 ;
-      S2(c1+c2,c1) ;
-    }
-    for (c2=5;c2<=-c1+M;c2++) {
-      S1(c1,c2) ;
-      i = c1+c2 ;
-      S2(c1+c2,c1) ;
-    }
-    for (c2=-c1+M+1;c2<=M-10;c2++) {
-      S1(c1,c2) ;
-    }
-  }
-  for (c1=M-9;c1<=M;c1++) {
-    for (c2=5;c2<=M-10;c2++) {
-      S1(c1,c2) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/gesced3.c b/cloog-0.16.3/test/gesced3.c
deleted file mode 100644
index 8d2119d..0000000
--- a/cloog-0.16.3/test/gesced3.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Generated from ../../../git/cloog/test/gesced3.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.02s. */
-for (c1=M+1;c1<=2*M;c1++) {
-  S1(c1-M) ;
-}
-for (c1=2*M+1;c1<=M+N;c1++) {
-  S2(c1-2*M) ;
-  S1(c1-M) ;
-}
-for (c1=M+N+1;c1<=2*M+N;c1++) {
-  S2(c1-2*M) ;
-}
diff --git a/cloog-0.16.3/test/gesced3.cloog b/cloog-0.16.3/test/gesced3.cloog
deleted file mode 100644
index 758924c..0000000
--- a/cloog-0.16.3/test/gesced3.cloog
+++ /dev/null
@@ -1,39 +0,0 @@
-# language: C
-c
-
-# parametres {n | n>=m m>=2}
-2 4
-#  m  n  1
-1 -1  1  0
-1  1  0 -2
-0
-
-2 # Number of statements
-
-1
-# {i | 1<=i<=n}
-2 5
-#  i  m  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-0  0  0
-
-1
-# {i | 1<=i<=n}
-2 5
-#  i  m  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-0  0  0
-0
-
-2
-# Et les instructions de chunking (sol triviale)...
-1 6
-# c1  i  m  n  1
-0  1 -1 -1  0  0
-
-1 6
-# c1  i  m  n  1
-0  1 -1 -2  0  0
-0
diff --git a/cloog-0.16.3/test/gesced3.good.c b/cloog-0.16.3/test/gesced3.good.c
deleted file mode 100644
index 43708fc..0000000
--- a/cloog-0.16.3/test/gesced3.good.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Generated from ../../../git/cloog/test/gesced3.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i) { hash(2); hash(i); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int c1;
-  /* Original iterators. */
-  int i;
-  for (c1=M+1;c1<=2*M;c1++) {
-    i = c1-M ;
-    S1(c1-M) ;
-  }
-  for (c1=2*M+1;c1<=M+N;c1++) {
-    i = c1-2*M ;
-    S2(c1-2*M) ;
-    i = c1-M ;
-    S1(c1-M) ;
-  }
-  for (c1=M+N+1;c1<=2*M+N;c1++) {
-    i = c1-2*M ;
-    S2(c1-2*M) ;
-  }
-}
diff --git a/cloog-0.16.3/test/guide.c b/cloog-0.16.3/test/guide.c
deleted file mode 100644
index 31e9db1..0000000
--- a/cloog-0.16.3/test/guide.c
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Generated from ../../../git/cloog/test/guide.cloog by CLooG 0.14.0-245-gd8c1718 gmp bits in 0.00s. */
-if (N >= 1) {
-  for (i=1;i<=N;i++) {
-    S1(i);
-  }
-  for (i=N+1;i<=2*N;i++) {
-    S2(i);
-  }
-}
diff --git a/cloog-0.16.3/test/guide.cloog b/cloog-0.16.3/test/guide.cloog
deleted file mode 100644
index 5a35582..0000000
--- a/cloog-0.16.3/test/guide.cloog
+++ /dev/null
@@ -1,35 +0,0 @@
-# Language is C
-c
-
-# The context (no constraints on parameters)
-1 4             # 1 lines and 4 columns
-#  m  n  1
-1  0  0  0      # 0 >= 0, always true
-0 # CLooG will set parameters names automatically
-
-2 # The number of statements
-
-2 # First statement
-# The first domain
-3 5              # 3 lines and 5 columns
-#  i  m  n  1 
-1  1  0  0 -1    #  i >= 1
-1 -1  0  1  0    #  i <= n
-1 -1  2  0  0    #  i <= 2*m
-# The second domain
-3 5              # 3 lines and 5 columns
-#  i  m  n  1 
-1  1  0  0 -1    #  i >= 1
-1 -1  0  1  0    #  i <= n
-1  1 -1  0  0    #  i >= m
-0 0 0
-
-1 # Second statement
-2 5              # 4 lines and 6 columns
-#  i  m  n  1 
-1  1  0 -1 -1 #  i >= 1
-1 -1  0  2  0 #  i <= n
-0 0 0
-0 # CLooG will set iterators names automatically
-
-0
diff --git a/cloog-0.16.3/test/guide.good.c b/cloog-0.16.3/test/guide.good.c
deleted file mode 100644
index 31e0346..0000000
--- a/cloog-0.16.3/test/guide.good.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Generated from ../../../git/cloog/test/guide.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i) { hash(2); hash(i); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i;
-  for (i=1;i<=N;i++) {
-    if (i >= M) {
-      S1(i) ;
-    }
-    if (i <= min(2*M,M-1)) {
-      S1(i) ;
-    }
-  }
-  for (i=N+1;i<=2*N;i++) {
-    S2(i) ;
-  }
-}
diff --git a/cloog-0.16.3/test/iftest.c b/cloog-0.16.3/test/iftest.c
deleted file mode 100644
index 8f95ef8..0000000
--- a/cloog-0.16.3/test/iftest.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/iftest.cloog by CLooG 0.14.0-245-gd8c1718 gmp bits in 0.00s. */
-if (n >= 1) {
-  for (i=1;i<=n;i++) {
-    S1(i);
-  }
-}
diff --git a/cloog-0.16.3/test/iftest.cloog b/cloog-0.16.3/test/iftest.cloog
deleted file mode 100644
index 0adbc8d..0000000
--- a/cloog-0.16.3/test/iftest.cloog
+++ /dev/null
@@ -1,28 +0,0 @@
-# language: C
-c
-# The context (no constraints on parameters)
-1 4             # 1 lines and 4 columns
-#  m  n  1
-1  0  0  0
-1
-m n
-
-1 # The number of statements
-
-2 # First statement
-# The first domain
-3 5              # 3 lines and 5 columns
-#  i  m  n  1 
-1  1  0  0 -1    #  i >= 1
-1 -1  0  1  0    #  i <= n
-1  1 -1  0  0    #  i >= m
-# The second domain
-3 5              # 3 lines and 5 columns
-#  i  m  n  1 
-1  1  0  0 -1    #  i >= 1
-1 -1  0  1  0    #  i <= n
-1 -1  2  0  0    #  i <= 2*m
-0 0 0
-0
-
-0
diff --git a/cloog-0.16.3/test/iftest.good.c b/cloog-0.16.3/test/iftest.good.c
deleted file mode 100644
index 4ce26e4..0000000
--- a/cloog-0.16.3/test/iftest.good.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Generated from ../../../git/cloog/test/iftest.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-
-void test(int m, int n)
-{
-  /* Original iterators. */
-  int i;
-  for (i=1;i<=n;i++) {
-    if (i <= 2*m) {
-      S1(i) ;
-    }
-    if (i >= max(m,2*m+1)) {
-      S1(i) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/iftest2.c b/cloog-0.16.3/test/iftest2.c
deleted file mode 100644
index 355aa74..0000000
--- a/cloog-0.16.3/test/iftest2.c
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Generated from ../../../git/cloog/test/iftest2.cloog by CLooG 0.14.0-245-gd8c1718 gmp bits in 0.00s. */
-if ((M >= 1) && (N >= 1)) {
-  for (i=1;i<=N;i++) {
-    for (j=1;j<=M;j++) {
-      S1(i,j);
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/iftest2.cloog b/cloog-0.16.3/test/iftest2.cloog
deleted file mode 100644
index 2bd7336..0000000
--- a/cloog-0.16.3/test/iftest2.cloog
+++ /dev/null
@@ -1,31 +0,0 @@
-# language: C
-c
-# The context (no constraints on parameters)
-1 4             # 1 lines and 4 columns
-#  m  n  1
-1  0  0  0
-0
-
-1 # The number of statements
-
-2 # First statement
-# The first domain
-5 6              # 3 lines and 5 columns
-#  i  j  m  n  1 
-1  1  0  0  0 -1    #  i >= 1
-1 -1  0  0  1  0    #  i <= n
-1  1  0 -1  0  0    #  i >= m
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-# The second domain
-5 6              # 3 lines and 5 columns
-#  i  j  m  n  1 
-1  1  0  0  0 -1    #  i >= 1
-1 -1  0  0  1  0    #  i <= n
-1 -1  0  2  0  0    #  i <= 2*m
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-0 0 0
-0
-
-0
diff --git a/cloog-0.16.3/test/iftest2.good.c b/cloog-0.16.3/test/iftest2.good.c
deleted file mode 100644
index 9e7f514..0000000
--- a/cloog-0.16.3/test/iftest2.good.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Generated from ../../../git/cloog/test/iftest2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i, j;
-  if (M >= 1) {
-    for (i=1;i<=N;i++) {
-      for (j=1;j<=M;j++) {
-        if (i <= 2*M) {
-          S1(i,j) ;
-        }
-        if (i >= max(M,2*M+1)) {
-          S1(i,j) ;
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/iftestf.cloog b/cloog-0.16.3/test/iftestf.cloog
deleted file mode 100644
index 1f0d6a9..0000000
--- a/cloog-0.16.3/test/iftestf.cloog
+++ /dev/null
@@ -1,29 +0,0 @@
-# language: FORTRAN
-f
-
-# The context (no constraints on parameters)
-1 4             # 1 lines and 4 columns
-#  m  n  1
-1  0  0  0
-1
-m n
-
-1 # The number of statements
-
-2 # First statement
-# The first domain
-3 5              # 3 lines and 5 columns
-#  i  m  n  1 
-1  1  0  0 -1    #  i >= 1
-1 -1  0  1  0    #  i <= n
-1  1 -1  0  0    #  i >= m
-# The second domain
-3 5              # 3 lines and 5 columns
-#  i  m  n  1 
-1  1  0  0 -1    #  i >= 1
-1 -1  0  1  0    #  i <= n
-1 -1  2  0  0    #  i <= 2*m
-0 0 0
-0
-
-0
diff --git a/cloog-0.16.3/test/iftestf.f b/cloog-0.16.3/test/iftestf.f
deleted file mode 100644
index 65685b9..0000000
--- a/cloog-0.16.3/test/iftestf.f
+++ /dev/null
@@ -1,6 +0,0 @@
-! Generated from ../../../git/cloog/test/iftestf.cloog by CLooG 0.14.0-245-gd8c1718 gmp bits in 0.00s.
-IF (n >= 1) THEN
-  DO i=1, n
-    S1(i)
-  END DO
-END IF
diff --git a/cloog-0.16.3/test/infinite.c b/cloog-0.16.3/test/infinite.c
deleted file mode 100644
index 10f35f2..0000000
--- a/cloog-0.16.3/test/infinite.c
+++ /dev/null
@@ -1,13 +0,0 @@
-/* Generated from ../../../git/cloog/test/infinite.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.02s. */
-for (;i<=0;i++) {
-  S1(i) ;
-}
-for (i=1;i<=N;i++) {
-  S1(i) ;
-  for (j=1;j<=M;j++) {
-    S2(i,j) ;
-  }
-}
-for (i=N+1;;i++) {
-  S1(i) ;
-}
diff --git a/cloog-0.16.3/test/infinite.cloog b/cloog-0.16.3/test/infinite.cloog
deleted file mode 100644
index dacc187..0000000
--- a/cloog-0.16.3/test/infinite.cloog
+++ /dev/null
@@ -1,32 +0,0 @@
-# langage
-c
-
-# parametres {M, N | M>=1 N >=1}
-2 4
-#  M  N  1
-1  1  0 -1
-1  0  1 -1
-0
-
-2 # Number of statements
-
-1
-# {i | 1<=i<=M}
-0 5
-#  i  M  N  1
-#1  1  0  0 -1
-#1 -1  1  0  0
-0 0 0
-
-1
-# {i, j | 1<=i<=N 1<=j<=M}
-4 6
-#  i  j  M  N  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-0 0 0
-0
- 
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/infinite2.c b/cloog-0.16.3/test/infinite2.c
deleted file mode 100644
index 80a0b35..0000000
--- a/cloog-0.16.3/test/infinite2.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Generated from ../../../git/cloog/test/infinite2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (i=1;i<=N;i++) {
-  S1(i) ;
-  for (j=1;j<=M;j++) {
-    S2(i,j) ;
-  }
-}
-for (i=N+1;;i++) {
-  S1(i) ;
-}
diff --git a/cloog-0.16.3/test/infinite2.cloog b/cloog-0.16.3/test/infinite2.cloog
deleted file mode 100644
index 2d7cf97..0000000
--- a/cloog-0.16.3/test/infinite2.cloog
+++ /dev/null
@@ -1,32 +0,0 @@
-# langage
-c
-
-# parametres {M, N | M>=1 N >=1}
-2 4
-#  M  N  1
-1  1  0 -1
-1  0  1 -1
-0
-
-2 # Number of statements
-
-1
-# {i | 1<=i<=M}
-1 5
-#  i  M  N  1
-1  1  0  0 -1
-#1 -1  1  0  0
-0 0 0
-
-1
-# {i, j | 1<=i<=N 1<=j<=M}
-4 6
-#  i  j  M  N  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-0 0 0
-0
- 
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/infinite3.c b/cloog-0.16.3/test/infinite3.c
deleted file mode 100644
index 9e4292c..0000000
--- a/cloog-0.16.3/test/infinite3.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Generated from ../../../git/cloog/test/infinite3.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.03s. */
-for (;i<=0;i++) {
-  S1(i) ;
-}
-for (i=1;i<=min(M,N);i++) {
-  S1(i) ;
-  for (j=1;j<=M;j++) {
-    S2(i,j) ;
-  }
-}
-for (i=N+1;i<=M;i++) {
-  S1(i) ;
-}
-for (i=M+1;i<=N;i++) {
-  for (j=1;j<=M;j++) {
-    S2(i,j) ;
-  }
-}
diff --git a/cloog-0.16.3/test/infinite3.cloog b/cloog-0.16.3/test/infinite3.cloog
deleted file mode 100644
index 9154a0e..0000000
--- a/cloog-0.16.3/test/infinite3.cloog
+++ /dev/null
@@ -1,32 +0,0 @@
-# langage
-c
-
-# parametres {M, N | M>=1 N >=1}
-2 4
-#  M  N  1
-1  1  0 -1
-1  0  1 -1
-0
-
-2 # Number of statements
-
-1
-# {i | 1<=i<=M}
-1 5
-#  i  M  N  1
-#1  1  0  0 -1
-1 -1  1  0  0
-0 0 0
-
-1
-# {i, j | 1<=i<=N 1<=j<=M}
-4 6
-#  i  j  M  N  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-0 0 0
-0
- 
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/infinite4.c b/cloog-0.16.3/test/infinite4.c
deleted file mode 100644
index fff00ed..0000000
--- a/cloog-0.16.3/test/infinite4.c
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Generated from ../../../git/cloog/test/infinite4.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (;;i++) {
-  S1(i) ;
-}
diff --git a/cloog-0.16.3/test/infinite4.cloog b/cloog-0.16.3/test/infinite4.cloog
deleted file mode 100644
index 5502453..0000000
--- a/cloog-0.16.3/test/infinite4.cloog
+++ /dev/null
@@ -1,16 +0,0 @@
-# langage
-c
-
-# Context
-0 2
-0
-
-1 # Number of statements
-
-1
-# {i | 1<=i<=M}
-0 3
-0 0 0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/isl/jacobi-shared.c b/cloog-0.16.3/test/isl/jacobi-shared.c
deleted file mode 100644
index 3246227..0000000
--- a/cloog-0.16.3/test/isl/jacobi-shared.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Generated from ../../../git/cloog/test/isl/jacobi-shared.cloog by CLooG 0.16.2-19-gfcd8fdc gmp bits in 1.65s. */
-if ((h0+1)%2 == 0) {
-  if ((16*floord(g1+t0-3,16) >= -N+g1+t0+1) && (16*floord(N+15*g1+15*t0+15,16) >= 16*g1+15*t0+17) && (floord(t1-1,32) <= floord(g2+t1-3,32)) && (32*floord(t1-1,32) >= -N+g2+t1+1)) {
-    for (c0=max(-16*floord(t0-1,16)+t0,-16*floord(g1+t0-3,16)+t0);c0<=min(32,N-g1-1);c0+=16) {
-      c1 = -32*floord(t1-1,32)+t1;
-      if (c1 <= 32) {
-        S1(c0+g1-1,c1+g2-1);
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/isl/jacobi-shared.cloog b/cloog-0.16.3/test/isl/jacobi-shared.cloog
deleted file mode 100644
index 25e4903..0000000
--- a/cloog-0.16.3/test/isl/jacobi-shared.cloog
+++ /dev/null
@@ -1,129 +0,0 @@
-# CLooG -> CLooG
-# This is an automatic dump of a CLooG input file from a CloogInput data
-# structure.
-
-# Language: C
-c
-
-# Context:
-1
-
-22 16 0 0 2 12
-0     0  1024     0     0     0     0    32     0     0    -1     0     0     0     0     0
-0  2048     0     0     0     0    32     0     0    -1     0     0     0     0     0     0
-0     0     0     0     0    -1     0     0     1     0     0     0     0     0     0     0
-1     0     0     0     1     0     0     0     0     0    -1     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     0     1     0     0     0     0    29
-1     0     0     0     1     0     0     0     0    -1     0     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     1     0     0     0     0     0    29
-1     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0
-1     0     0     0     0     0     0    -1     0     0     0     0     0     0     0    31
-1     0     0     0     0     0    -1     0     0     0     0     0     0     0     0    63
-1     0     0     0     1     0     0   -32     0     0     0     0     0     0     0    -2
-1     0     0     0     1     0   -32     0     0     0     0     0     0     0     0    -2
-1     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0
-1     0     0     0     1     0     0     0     0     0     0     0     0     0     0    -4
-1     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0
-1     0     0     2     0    -1     0     0     0     0     0     0     0     0     0    -1
-1     0     0     0     0     0     0   -32     0     0     1     0     0     0     0     0
-1     0     0     0     0     0   -32     0     0     1     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0    -1     0    15
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0    -1    31
-
-1 # Parameter name(s)
-T N h0 b0 b1 g0 g1 g2 g3 g4 t0 t1 
-
-# Statement number:
-1
-
-# Iteration domain of statement 1 (write_shared_A).
-1
-
-33 21 2 0 5 12
-0     0     1     0     0     0     0    32     0     0     0     0     0     0     0     0     0     0     0    -1     1
-0     1     0     0     0     0    16     0     0     0     0     0     0     0     0     0     0     0    -1     0     1
-0     0     0     0     0  1024     0     0     0     0     0     0   992     0     0     1     0     0     0     0     0
-0     0     0     0  2048     0     0     0     0     0     0  2016     0     0     1     0     0     0     0     0     0
-0     0     0     2     0     0     0     0     0     0    -1     0     0     0     0     0     0     0     0     0     1
-0     0     0     0     0     0     0     0     0     0    -1     0     0     1     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0    -1
-1     0     0     0     0     0     0     0     2     0    -1     0     0     0     0     0     0     0     0     0    -1
-1     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -2
-1    -1     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0    -2
-1     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -2
-1     0    -1     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0    31
-1     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0     0    63
-1     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0
-1     0    -1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0    31
-1     0     1     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0    -4
-1     1     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0
-1    -1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0    31
-1     0     0     0     0     0     0     0     0     1     0     0     0     0     0    -1     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0    29
-1     0     0     0     0     0     0     0     0     1     0     0     0     0    -1     0     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0    29
-1     0     0     0     0     0     0     0     0     0     0   -32     0     0     1     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0   -32     0     0     1     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     1     0   -32     0     0     0     0     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     1     0     0   -32     0     0     0     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0    15
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1    31
-
-0 0 0 # For future options.
-
-
-0 # Iterator name(s)
-# --------------------- SCATTERING --------------------
-1 # Scattering functions
-
-# Scattering of statement 1 (write_shared_A).
-1
-
-37 25 4 2 5 12
-0     0     0     0     0     0     1     0     0     0     0    32     0     0     0     0     0     0     0     0     0     0     0    -1     1
-0     0     0     0     0     1     0     0     0     0    16     0     0     0     0     0     0     0     0     0     0     0    -1     0     1
-0     0     0     0     0     0     0     0     0  1024     0     0     0     0     0     0   992     0     0     1     0     0     0     0     0
-0     0     0     0     0     0     0     0  2048     0     0     0     0     0     0  2016     0     0     1     0     0     0     0     0     0
-0     0     0     0     0     0     0     2     0     0     0     0     0     0    -1     0     0     0     0     0     0     0     0     0     1
-0     0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0
-0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0
-0     0     1     0     0     0    -1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0    -1
-0     1     0     0     0    -1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0    -1
-0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     1     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0    -1
-1     0     0     0     0     0     0     0     0     0     0     0     2     0    -1     0     0     0     0     0     0     0     0     0    -1
-1     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -2
-1     0     0     0     0    -1     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0    -2
-1     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -2
-1     0     0     0     0     0    -1     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0    31
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0     0    63
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0
-1     0     0     0     0     0    -1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0    31
-1     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0    -4
-1     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0
-1     0     0     0     0    -1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0    31
-1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0    -1     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0    29
-1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0    -1     0     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0    29
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0   -32     0     0     1     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0   -32     0     0     1     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     1     0   -32     0     0     0     0     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0   -32     0     0     0     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0    15
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1    31
-
-1 # Scattering dimension name(s)
-c0 c1 c2 c3 
diff --git a/cloog-0.16.3/test/isl/jacobi-shared.good.c b/cloog-0.16.3/test/isl/jacobi-shared.good.c
deleted file mode 100644
index fcd67dc..0000000
--- a/cloog-0.16.3/test/isl/jacobi-shared.good.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Generated from ../../../git/cloog/test/isl/jacobi-shared.cloog by CLooG 0.16.2-19-gfcd8fdc gmp bits in 1.65s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int T, int N, int h0, int b0, int b1, int g0, int g1, int g2, int g3, int g4, int t0, int t1)
-{
-  /* Scattering iterators. */
-  int c0, c1, c2, c3;
-  /* Original iterators. */
-  int i, j;
-  if ((h0+1)%2 == 0) {
-    if ((16*floord(g1+t0-3,16) >= -N+g1+t0+1) && (16*floord(N+15*g1+15*t0+15,16) >= 16*g1+15*t0+17) && (floord(t1-1,32) <= floord(g2+t1-3,32)) && (32*floord(t1-1,32) >= -N+g2+t1+1)) {
-      for (c0=max(-16*floord(t0-1,16)+t0,-16*floord(g1+t0-3,16)+t0);c0<=min(32,N-g1-1);c0+=16) {
-        c1 = -32*floord(t1-1,32)+t1;
-        if (c1 <= 32) {
-          S1(c0+g1-1,c1+g2-1);
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/isl/mod.c b/cloog-0.16.3/test/isl/mod.c
deleted file mode 100644
index 4f6a15e..0000000
--- a/cloog-0.16.3/test/isl/mod.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/isl/mod.cloog by CLooG 0.14.0-325-g71fa959 gmp bits in 0.00s. */
-for (i=0;i<=3;i++) {
-  if (i%3 <= 1) {
-    S1(i);
-  }
-}
diff --git a/cloog-0.16.3/test/isl/mod.cloog b/cloog-0.16.3/test/isl/mod.cloog
deleted file mode 100644
index e12de40..0000000
--- a/cloog-0.16.3/test/isl/mod.cloog
+++ /dev/null
@@ -1,23 +0,0 @@
-c
-
-# Context:
-0 2
-
-0 # Parameter name(s)
-# Statement number:
-1
-
-# Iteration domain of statement 1
-4 4 1 0 1 0
-1     1     0     0
-1    -1     0     3
-1     1    -3     0
-1    -1     3     1
-
-0 0 0 # For future options.
-
-
-0 # Iterator name(s)
-
-# No scattering functions.
-0
diff --git a/cloog-0.16.3/test/isl/mod2.c b/cloog-0.16.3/test/isl/mod2.c
deleted file mode 100644
index 4f6a15e..0000000
--- a/cloog-0.16.3/test/isl/mod2.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/isl/mod.cloog by CLooG 0.14.0-325-g71fa959 gmp bits in 0.00s. */
-for (i=0;i<=3;i++) {
-  if (i%3 <= 1) {
-    S1(i);
-  }
-}
diff --git a/cloog-0.16.3/test/isl/mod2.cloog b/cloog-0.16.3/test/isl/mod2.cloog
deleted file mode 100644
index 1b09d5f..0000000
--- a/cloog-0.16.3/test/isl/mod2.cloog
+++ /dev/null
@@ -1,20 +0,0 @@
-# Language: C
-c
-
-# Context:
-0 2
-
-0 # Parameter name(s)
-# Statement number:
-1
-
-# Iteration domain of statement 1
-{ [i] : 0 <= i <= 3 and 0 <= i - 3*[i/3] <= 1 }
-
-0 0 0 # For future options.
-
-
-0 # Iterator name(s)
-
-# No scattering functions.
-0
diff --git a/cloog-0.16.3/test/isl/mod3.c b/cloog-0.16.3/test/isl/mod3.c
deleted file mode 100644
index 3fa291b..0000000
--- a/cloog-0.16.3/test/isl/mod3.c
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Generated from ../../../git/cloog/test/isl/mod3.cloog by CLooG 0.14.0-325-g62da9f7 gmp bits in 0.02s. */
-for (i=max(0,32*h0-1991);i<=min(999,32*h0+31);i++) {
-  if ((63*i+32*h0+31)%64 <= 62) {
-    for (j=0;j<=999;j++) {
-      S1(i,j);
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/isl/mod3.cloog b/cloog-0.16.3/test/isl/mod3.cloog
deleted file mode 100644
index 1637080..0000000
--- a/cloog-0.16.3/test/isl/mod3.cloog
+++ /dev/null
@@ -1,34 +0,0 @@
-# Language: C
-c
-
-# Context:
-2 3
-1    -1    93
-1     1     0
-
-1 # Parameter name(s)
-h0 
-# Statement number:
-1
-
-# Iteration domain of statement 1
-1
-
-9 6 2 0 1 1
-1     1     0     0     0     0
-1    -1     0     0     0   999
-1     0     0    -1     0    31
-1     1     0    32   -32   999
-1     0     1     0     0     0
-1     0    -1     0     0   999
-1     1     0    64   -32    31
-1    -1     0   -64    32    31
-1     0     0     1     0     0
-
-0 0 0 # For future options.
-
-
-0 # Iterator name(s)
-
-# No scattering functions.
-0
diff --git a/cloog-0.16.3/test/isl/mod4.c b/cloog-0.16.3/test/isl/mod4.c
deleted file mode 100644
index 9a30f3c..0000000
--- a/cloog-0.16.3/test/isl/mod4.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Generated from ../../../git/cloog/test/isl/mod4.cloog by CLooG 0.16.0-9-g188dbd4 gmp bits in 0.00s. */
-if (M%11 <= 6) {
-  if (N%5 <= 2) {
-    if (M >= -N) {
-      for (i=0;i<=M+N;i++) {
-        S1(i);
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/isl/mod4.cloog b/cloog-0.16.3/test/isl/mod4.cloog
deleted file mode 100644
index d5837ae..0000000
--- a/cloog-0.16.3/test/isl/mod4.cloog
+++ /dev/null
@@ -1,23 +0,0 @@
-c
-
-1
-
-0 4
-
-0
-
-1
-
-6 7 1 0 2 2
-1     0    -5     0     0     1     0
-1     0     5     0     0    -1     2
-1     0     0   -11     1     0     0
-1     0     0    11    -1     0     6
-1     1     0     0     0     0     0
-1    -1     0     0     1     1     0
-
-0 0 0
-
-0
-
-0
diff --git a/cloog-0.16.3/test/isl/mxm-shared.c b/cloog-0.16.3/test/isl/mxm-shared.c
deleted file mode 100644
index e5f4c66..0000000
--- a/cloog-0.16.3/test/isl/mxm-shared.c
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Generated from ../../../git/cloog/test/isl/mxm-shared.cloog by CLooG 0.16.1-5-gcba2a9f gmp bits in 0.34s. */
-if (g4%4 == 0) {
-  if ((N >= g0+t1+1) && (N >= g1+t0+1) && (t1 <= 7)) {
-    for (c0=t0;c0<=min(127,N-g1-1);c0+=16) {
-      S1(g0+t1,c0+g1);
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/isl/mxm-shared.cloog b/cloog-0.16.3/test/isl/mxm-shared.cloog
deleted file mode 100644
index f82b2dd..0000000
--- a/cloog-0.16.3/test/isl/mxm-shared.cloog
+++ /dev/null
@@ -1,162 +0,0 @@
-# CLooG -> CLooG
-# This is an automatic dump of a CLooG input file from a CloogInput data
-# structure.
-
-# Language: C
-c
-
-# Context:
-1
-
-19 15 0 0 3 10
-0     0     0   128     0    -8     0     1     0     0     0     0     0     0     0
-0     0  4096     0     0     0   128     0    -1     0     0     0     0     0     0
-0     8     0     0     0     0     0    -1     0     0     0     0     0     0     0
-0     0     0     0     0     0  -128     0     0     0     1     0     0     0     0
-0     0     0     0     0    -8     0     0     0     1     0     0     0     0     0
-1     0     0     0     0     1     0     0     0     0     0     0     0     0     0
-1     0     0     0     1     0     0     0     0     0     0    -1     0     0    -1
-1     0     0     0     0    -1     0     0     0     0     0     0     0     0    15
-1     0     0     0     1     0     0     0    -1     0     0     0     0     0    -1
-1     0     0     0     0     0     0     0     0     0     0     1     0     0     0
-1     0     0     0     0     0    -1     0     0     0     0     0     0     0    31
-1     0     0     0     1     0     0    -1     0     0     0     0     0     0    -1
-1     0     0     0     0     0  -128     0     1     0     0     0     0     0     0
-1     0     0     0     0     0     1     0     0     0     0     0     0     0     0
-1     0     0     0     0    -8     0     1     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     1     0     0
-1     0     0     0     0     0     0     0     0     0     0     0    -1     0    15
-1     0     0     0     0     0     0     0     0     0     0     0     0     1     0
-1     0     0     0     0     0     0     0     0     0     0     0     0    -1    15
-
-1 # Parameter name(s)
-N b0 b1 g0 g1 g2 g3 g4 t0 t1 
-
-# Statement number:
-1
-
-# Iteration domain of statement 1 (write_shared_C).
-2
-
-22 18 2 0 4 10
-0     0    -1     0     0     0    16     0     0     0     0     0     0     0     0     1     0     0
-0     0     0     0     0   128     0     0     8     0    -1     0     0     0     0     0     0     0
-0     0     0     0  4096     0     0     0     0  -128     0     1     0     0     0     0     0     0
-0     0     0   128     0     0     0     0     0     0     0    -1     0     0     0     0     0     0
-0     1     0     0     0     0     0     0     0     0    -1     0     0     0     0     0    -1     0
-0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0
-0     0     0     0     0     0     0     0     0  -128     0     0     0     1     0     0     0     0
-0     0     0     0     0     0     0     0    -8     0     0     0     1     0     0     0     0     0
-1     0     0     0     0     0     0     0     0  -128     0     1     0     0     0     0     0     0
-1     0     0     0     0     0     0     1     0     0    -1     0     0     0     0     0    -1    -1
-1     0     0     0     0     0     0     0    -8     0     1     0     0     0     0     0     0     0
-1     0    -1     0     0     0     0     1     0     0     0     0     0     0     0     0     0    -1
-1     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0     0    15
-1     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0    31
-1     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0
-1     0    -1     0     0     0     0     0     0     0     0     1     0     0     0     0     0   127
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     7
-1     0     1     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0    15
-
-24 19 2 0 5 10
-0     0    -1     0     0     0     0    16     0     0     0     0     0     0     0     0     1     0     0
-0     0     0     0     0     0   128     0     0     8     0    -1     0     0     0     0     0     0     0
-0     0     0     0     0     4     0     0     0     0     0     0     0     0     0    -1     0     0     0
-0     0     0     0  4096     0     0     0     0     0  -128     0     1     0     0     0     0     0     0
-0     0     0   128     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0
-0     1     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0    -1     0
-0     0     0     0     0     0     0     0     0     0  -128     0     0     0     1     0     0     0     0
-0     0     0     0     0     0     0     0     0    -8     0     0     0     1     0     0     0     0     0
-1     0     0     0     0     0     0     0     0    -8     0     1     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     1     0     0    -1     0     0     0     0     0    -1    -1
-1     0     0     0     0     0     0     0     0     0  -128     0     1     0     0     0     0     0     0
-1     0    -1     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0    -1
-1     0     0     0     0     0     0     0     1     0     0     0     0     0     0    -1     0     0    -1
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     7
-1     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0    31
-1     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0     0    15
-1     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0
-1     0    -1     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0   127
-1     0     1     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0    15
-
-0 0 0 # For future options.
-
-
-0 # Iterator name(s)
-# --------------------- SCATTERING --------------------
-1 # Scattering functions
-
-# Scattering of statement 1 (write_shared_C).
-2
-
-27 22 4 2 4 10
-0     0     0     0     0     1     0     0     0     0    16     0     8     0     0     0     0     0     0     0    -1     0
-0     0     0     0     0     0     1     0     0    16     0     0     0     0     0     0     0     0     0    -1     0     0
-0     0     0     0     0     0     0     0   128     0     0     0   120     0     1     0     0     0     0     0     0     0
-0     0     0     0     0     0     0  4096     0     0     0     0     0  3968     0     1     0     0     0     0     0     0
-0     0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0
-0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0
-0     0     1     0     0    -1     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0
-0     1     0     0     0     0    -1     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0
-0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0
-0     0     0     0     0     0     0     0     0     0     0     0     0  -128     0     0     0     1     0     0     0     0
-0     0     0     0     0     0     0     0     0     0     0     0    -8     0     0     0     1     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0  -128     0     1     0     0     0     0     0     0
-1     0     0     0     0    -1     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0    -1
-1     0     0     0     0     0     0     0     0     0     0     0    -8     0     1     0     0     0     0     0     0     0
-1     0     0     0     0     0    -1     0     0     0     0     1     0     0     0     0     0     0     0     0     0    -1
-1     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0     0    15
-1     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0    31
-1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0
-1     0     0     0     0     0    -1     0     0     0     0     0     0     0     0     1     0     0     0     0     0   127
-1     0     0     0     0     1     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0
-1     0     0     0     0    -1     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     7
-1     0     0     0     0     0     1     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0    15
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1    15
-
-29 23 4 2 5 10
-0     0     0     0     0     1     0     0     0     0     0    16     0     8     0     0     0     0     0     0     0    -1     0
-0     0     0     0     0     0     1     0     0     0    16     0     0     0     0     0     0     0     0     0    -1     0     0
-0     0     0     0     0     0     0     0     0   128     0     0     0   120     0     1     0     0     0     0     0     0     0
-0     0     0     0     0     0     0     0  4096     0     0     0     0     0  3968     0     1     0     0     0     0     0     0
-0     0     0     0     0     0     0     4     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0
-0     0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0
-0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0
-0     0     1     0     0    -1     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0
-0     1     0     0     0     0    -1     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0
-0     0     0     0     0     0     0     0     0     0     0     0     0     0  -128     0     0     0     1     0     0     0     0
-0     0     0     0     0     0     0     0     0     0     0     0     0    -8     0     0     0     1     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0    -8     0     1     0     0     0     0     0     0     0
-1     0     0     0     0    -1     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0    -1
-1     0     0     0     0     0     0     0     0     0     0     0     0     0  -128     0     1     0     0     0     0     0     0
-1     0     0     0     0     0    -1     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0    -1
-1     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0    -1     0     0    -1
-1     0     0     0     0    -1     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     7
-1     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0    31
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0     0    15
-1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0
-1     0     0     0     0     0    -1     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0   127
-1     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0
-1     0     0     0     0     1     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0    15
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1    15
-
-1 # Scattering dimension name(s)
-c0 c1 c2 c3 
diff --git a/cloog-0.16.3/test/largeur.c b/cloog-0.16.3/test/largeur.c
deleted file mode 100644
index ff49b94..0000000
--- a/cloog-0.16.3/test/largeur.c
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Generated from ../../../git/cloog/test/largeur.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-if (M >= 1) {
-  for (c1=1;c1<=M;c1++) {
-    for (c2=1;c2<=c1;c2++) {
-      S1(c2,c1) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/largeur.cloog b/cloog-0.16.3/test/largeur.cloog
deleted file mode 100644
index fe372da..0000000
--- a/cloog-0.16.3/test/largeur.cloog
+++ /dev/null
@@ -1,26 +0,0 @@
-# language: C
-c
-
-# parameters {n | n>= 0}
-1 3
-1  1  0
-0
-
-1 # Number of statements
-
-1
-# {i, j | 1<=i<=n i<=j<=n}
-4 5
-1  1  0  0  -1
-1 -1  0  1   0
-1 -1  1  0   0
-1  0 -1  1   0
-0 0 0
-0
-
-1 # Scattering functions
-# Et les instructions de chunking...
-2 7
-0 1 0  0 -1 0 0
-0 0 1 -1  0 0 0
-0
diff --git a/cloog-0.16.3/test/largeur.good.c b/cloog-0.16.3/test/largeur.good.c
deleted file mode 100644
index 10f63ed..0000000
--- a/cloog-0.16.3/test/largeur.good.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Generated from ../../../git/cloog/test/largeur.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c1, c2;
-  /* Original iterators. */
-  int i, j;
-  for (c1=1;c1<=M;c1++) {
-    for (c2=1;c2<=c1;c2++) {
-      S1(c2,c1) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/levenshtein-1-2-3.c b/cloog-0.16.3/test/levenshtein-1-2-3.c
deleted file mode 100644
index 224bd29..0000000
--- a/cloog-0.16.3/test/levenshtein-1-2-3.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Generated from ../../../git/cloog/test/levenshtein-1-2-3.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.12s. */
-S1(0,0) ;
-S2(1,0) ;
-S3(1,1) ;
-for (i=2;i<=N;i++) {
-  S2(i,0) ;
-  for (j=1;j<=i-1;j++) {
-    S6(i,j) ;
-  }
-  S3(i,i) ;
-}
-S7(N+1,0) ;
-for (j=1;j<=N;j++) {
-  S6(N+1,j) ;
-  S8(N+1,j) ;
-}
-for (i=N+2;i<=2*M-N-2;i++) {
-  j = floord(i-N-1,2) ;
-  S7(i,j) ;
-  if ((i+N)%2 == 0) {
-    S5(i,(i-N)/2) ;
-    S8(i,(i-N)/2) ;
-  }
-  for (j=ceild(i-N+1,2);j<=floord(i+N-1,2);j++) {
-    S6(i,j) ;
-    S8(i,j) ;
-  }
-  if ((i+N)%2 == 0) {
-    S4(i,(i+N)/2) ;
-    S8(i,(i+N)/2) ;
-  }
-}
-for (i=2*M-N-1;i<=2*M-2;i++) {
-  for (j=i-M+1;j<=M-1;j++) {
-    S6(i,j) ;
-  }
-}
diff --git a/cloog-0.16.3/test/levenshtein-1-2-3.cloog b/cloog-0.16.3/test/levenshtein-1-2-3.cloog
deleted file mode 100644
index acc6522..0000000
--- a/cloog-0.16.3/test/levenshtein-1-2-3.cloog
+++ /dev/null
@@ -1,110 +0,0 @@
-# language: C
-c
-
-# Context
-# {length,width | width+2<=length; 1<=width}
-3   4
-#  M  N   1
-1  1  -1 -2
-1  0  1  -1
-1  0  0  1
-0
-
-8 # Number of statements
-
-1
-# {t1,t2,length,width | t1=0; t2=0; width+2<=length; 1<=width}
-5   6
-#  i  j  M  N  1
-0  1  0  0  0  0
-0  0  1  0  0  0
-1  0  0  1  -1 -2
-1  0  0  0  1  -1
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | 1<=t1<=width; t2=0; width+2<=length}
-5   6
-#  i  j  M  N  1
-0  0  1  0  0  0
-1  1  0  0  0  -1
-1  -1 0  0  1  0
-1  0  0  1  -1 -2
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | t1=t2; 1<=t2<=width; width+2<=length}
-5   6
-#  i  j  M  N  1
-0  1  -1 0  0  0
-1  0  1  0  0  -1
-1  0  -1 0  1  0
-1  0  0  1  -1 -2
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | t1=2t2-width; width+1<=t2<=length-1; 1<=width}
-5   6
-#  i  j  M  N  1
-0  1  -2 0  1  0
-1  0  1  0  -1 -1
-1  0  -1 1  0  -1
-1  0  0  0  1  -1
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | t1=2t2+width; 1<=t2<=length-width-1; 1<=width}
-5   6
-#  i  j  M  N  1
-0  1  -2 0  -1 0
-1  0  1  0  0  -1
-1  0  -1 1  -1 -1
-1  0  0  0  1  -1
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | (2t2-width+1,t2+1)<=t1<=(t2+length-1,2t2+width-1); 1<=t2<=length-1; width+2<=length}
-8   6
-#  i  j  M  N  1
-1  1  -2 0  1  -1
-1  1  -1 0  0  -1
-1  -1 1  1  0  -1
-1  -1 2  0  1  -1
-1  0  1  0  0  -1
-1  0  -1 1  0  -1
-1  0  0  1  -1 -2
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | (width+1,2t2+width+1)<=t1<=(2length-width-2,2t2+width+2); width+2<=length; 1<=width}
-6   6
-#  i  j  M  N  1
-1  1  0  0  -1 -1
-1  1  -2 0  -1 -1
-1  -1 0  2  -1 -2
-1  -1 2  0  1  2
-1  0  0  1  -1 -2
-1  0  0  0  1  -1
-0 0 0
-
-1
-# {t1,t2,length,width | (width+1,2t2-width)<=t1<=(2t2+width,2length-width-2); width+2<=length; 1<=width}
-7   6
-#  i  j  M  N  1
-1  1  0  0  -1 -1
-1  1  -2 0  1  0
-1  -1 2  0  1  0
-1  -1 0  2  -1 -2
-1  0  0  1  -1 -2
-1  0  0  0  1  -1
-1  0  0  0  0  1
-0 0 0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/levenshtein-1-2-3.good.c b/cloog-0.16.3/test/levenshtein-1-2-3.good.c
deleted file mode 100644
index 76548ea..0000000
--- a/cloog-0.16.3/test/levenshtein-1-2-3.good.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Generated from ../../../git/cloog/test/levenshtein-1-2-3.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.03s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-#define S5(i,j) { hash(5); hash(i); hash(j); }
-#define S6(i,j) { hash(6); hash(i); hash(j); }
-#define S7(i,j) { hash(7); hash(i); hash(j); }
-#define S8(i,j) { hash(8); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i, j;
-  S1(0,0) ;
-  S2(1,0) ;
-  S3(1,1) ;
-  for (i=2;i<=N;i++) {
-    S2(i,0) ;
-    for (j=1;j<=i-1;j++) {
-      S6(i,j) ;
-    }
-    S3(i,i) ;
-  }
-  i = N+1 ;
-  S7(N+1,0) ;
-  for (j=1;j<=N;j++) {
-    S6(N+1,j) ;
-    S8(N+1,j) ;
-  }
-  for (i=N+2;i<=2*M-N-2;i++) {
-    j = floord(i-N-1,2) ;
-    S7(i,j) ;
-    if ((i+N)%2 == 0) {
-      j = (i-N)/2 ;
-      S5(i,(i-N)/2) ;
-      S8(i,(i-N)/2) ;
-    }
-    for (j=ceild(i-N+1,2);j<=floord(i+N-1,2);j++) {
-      S6(i,j) ;
-      S8(i,j) ;
-    }
-    if ((i+N)%2 == 0) {
-      j = (i+N)/2 ;
-      S4(i,(i+N)/2) ;
-      S8(i,(i+N)/2) ;
-    }
-  }
-  for (i=2*M-N-1;i<=2*M-2;i++) {
-    for (j=i-M+1;j<=M-1;j++) {
-      S6(i,j) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/levenshtein-1-2-3f.cloog b/cloog-0.16.3/test/levenshtein-1-2-3f.cloog
deleted file mode 100644
index c78bc19..0000000
--- a/cloog-0.16.3/test/levenshtein-1-2-3f.cloog
+++ /dev/null
@@ -1,110 +0,0 @@
-# language: FORTRAN
-f
-
-# Context
-# {length,width | width+2<=length; 1<=width}
-3   4
-#  M  N   1
-1  1  -1 -2
-1  0  1  -1
-1  0  0  1
-0
-
-8 # Number of statements
-
-1
-# {t1,t2,length,width | t1=0; t2=0; width+2<=length; 1<=width}
-5   6
-#  i  j  M  N  1
-0  1  0  0  0  0
-0  0  1  0  0  0
-1  0  0  1  -1 -2
-1  0  0  0  1  -1
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | 1<=t1<=width; t2=0; width+2<=length}
-5   6
-#  i  j  M  N  1
-0  0  1  0  0  0
-1  1  0  0  0  -1
-1  -1 0  0  1  0
-1  0  0  1  -1 -2
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | t1=t2; 1<=t2<=width; width+2<=length}
-5   6
-#  i  j  M  N  1
-0  1  -1 0  0  0
-1  0  1  0  0  -1
-1  0  -1 0  1  0
-1  0  0  1  -1 -2
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | t1=2t2-width; width+1<=t2<=length-1; 1<=width}
-5   6
-#  i  j  M  N  1
-0  1  -2 0  1  0
-1  0  1  0  -1 -1
-1  0  -1 1  0  -1
-1  0  0  0  1  -1
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | t1=2t2+width; 1<=t2<=length-width-1; 1<=width}
-5   6
-#  i  j  M  N  1
-0  1  -2 0  -1 0
-1  0  1  0  0  -1
-1  0  -1 1  -1 -1
-1  0  0  0  1  -1
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | (2t2-width+1,t2+1)<=t1<=(t2+length-1,2t2+width-1); 1<=t2<=length-1; width+2<=length}
-8   6
-#  i  j  M  N  1
-1  1  -2 0  1  -1
-1  1  -1 0  0  -1
-1  -1 1  1  0  -1
-1  -1 2  0  1  -1
-1  0  1  0  0  -1
-1  0  -1 1  0  -1
-1  0  0  1  -1 -2
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | (width+1,2t2+width+1)<=t1<=(2length-width-2,2t2+width+2); width+2<=length; 1<=width}
-6   6
-#  i  j  M  N  1
-1  1  0  0  -1 -1
-1  1  -2 0  -1 -1
-1  -1 0  2  -1 -2
-1  -1 2  0  1  2
-1  0  0  1  -1 -2
-1  0  0  0  1  -1
-0 0 0
-
-1
-# {t1,t2,length,width | (width+1,2t2-width)<=t1<=(2t2+width,2length-width-2); width+2<=length; 1<=width}
-7   6
-#  i  j  M  N  1
-1  1  0  0  -1 -1
-1  1  -2 0  1  0
-1  -1 2  0  1  0
-1  -1 0  2  -1 -2
-1  0  0  1  -1 -2
-1  0  0  0  1  -1
-1  0  0  0  0  1
-0 0 0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/levenshtein-1-2-3f.f b/cloog-0.16.3/test/levenshtein-1-2-3f.f
deleted file mode 100644
index 5a57950..0000000
--- a/cloog-0.16.3/test/levenshtein-1-2-3f.f
+++ /dev/null
@@ -1,37 +0,0 @@
-! Generated from ../../../git/cloog/test/levenshtein-1-2-3f.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.11s.
-S1(0,0)
-S2(1,0)
-S3(1,1)
-DO i=2, N
-  S2(i,0)
-  DO j=1, i-1
-    S6(i,j)
-  END DO
-  S3(i,i)
-END DO
-S7(N+1,0)
-DO j=1, N
-  S6(N+1,j)
-  S8(N+1,j)
-END DO
-DO i=N+2, 2*M-N-2
-  j = FLOOR(REAL(i-N-1)/REAL(2))
-  S7(i,j)
-  IF (MOD(i+N, 2) == 0) THEN
-    S5(i,(i-N)/2)
-    S8(i,(i-N)/2)
-  END IF
-  DO j=CEILING(REAL(i-N+1)/REAL(2)), FLOOR(REAL(i+N-1)/REAL(2))
-    S6(i,j)
-    S8(i,j)
-  END DO
-  IF (MOD(i+N, 2) == 0) THEN
-    S4(i,(i+N)/2)
-    S8(i,(i+N)/2)
-  END IF
-END DO
-DO i=2*M-N-1, 2*M-2
-  DO j=i-M+1, M-1
-    S6(i,j)
-  END DO
-END DO
diff --git a/cloog-0.16.3/test/lex.c b/cloog-0.16.3/test/lex.c
deleted file mode 100644
index 52df96d..0000000
--- a/cloog-0.16.3/test/lex.c
+++ /dev/null
@@ -1,5 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/lex.cloog by CLooG 0.14.0-234-g330f397 gmp bits in 0.00s. */
-for (c1=0;c1<=10;c1++) {
-  S2(c1);
-  S1(c1);
-}
diff --git a/cloog-0.16.3/test/lex.cloog b/cloog-0.16.3/test/lex.cloog
deleted file mode 100644
index a7e2b88..0000000
--- a/cloog-0.16.3/test/lex.cloog
+++ /dev/null
@@ -1,35 +0,0 @@
-c
-
-0 2
-
-0
-
-2
-
-1
-2 3
-1 1 0
-1 -1 10
-0 0 0
-
-1
-2 3
-1 1 0
-1 -1 10
-0 0 0
-
-0
-
-2
-
-3 6
-0 -1 0 0 1 0
-0 0 -1 0 0 0
-0 0 0 -1 0 0
-
-3 6
-0 -1 0 0 1 0
-0 0 -1 0 0 -1
-0 0 0 -1 0 0
-
-0
diff --git a/cloog-0.16.3/test/lex.good.c b/cloog-0.16.3/test/lex.good.c
deleted file mode 100644
index 4769fb1..0000000
--- a/cloog-0.16.3/test/lex.good.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/lex.cloog by CLooG 0.14.0-234-g330f397 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i) { hash(2); hash(i); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int c1;
-  /* Original iterators. */
-  int i;
-  for (c1=0;c1<=10;c1++) {
-    S2(c1);
-    S1(c1);
-  }
-}
diff --git a/cloog-0.16.3/test/lineality-1-2.c b/cloog-0.16.3/test/lineality-1-2.c
deleted file mode 100644
index 9bd902e..0000000
--- a/cloog-0.16.3/test/lineality-1-2.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/lineality-1-2.cloog by CLooG 0.14.0-284-g5c046c9 gmp bits in 0.00s. */
-for (i=1;i<=M;i++) {
-  for (j=1;j<=i-1;j++) {
-    S1(i,j);
-  }
-  S1(i,i);
-  S2(i,i);
-  for (j=i+1;j<=M;j++) {
-    S1(i,j);
-  }
-}
diff --git a/cloog-0.16.3/test/lineality-1-2.cloog b/cloog-0.16.3/test/lineality-1-2.cloog
deleted file mode 100644
index 7629fd8..0000000
--- a/cloog-0.16.3/test/lineality-1-2.cloog
+++ /dev/null
@@ -1,36 +0,0 @@
-# language: C
-c
-
-# Context
-# {M | 2<=M}
-2   3
-#  M  1
-1  1 -2
-1  0  1
-0
-
-2 # Number of statements
-
-1
-# {i,j,M | 1<=i<=M; 1<=j<=M}
-5   5
-#   i   j   M   1
-1   1   0   0  -1
-1   0   1   0  -1
-1  -1   0   1   0
-1   0  -1   1   0
-1   0   0   0   1
-0   0   0
-
-1
-# {i,j,M | i=j; 1<=j<=M}
-4   5
-#   i   j   M   1
-0   1  -1   0   0
-1   0   1   0  -1
-1   0  -1   1   0
-1   0   0   0   1
-0   0   0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/lineality-1-2.good.c b/cloog-0.16.3/test/lineality-1-2.good.c
deleted file mode 100644
index d28268f..0000000
--- a/cloog-0.16.3/test/lineality-1-2.good.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Generated from ../../../git/cloog/test/lineality-1-2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j;
-  S1(1,1) ;
-  S2(1,1) ;
-  for (j=2;j<=M;j++) {
-    S1(1,j) ;
-  }
-  for (i=2;i<=M-1;i++) {
-    for (j=1;j<=i-1;j++) {
-      S1(i,j) ;
-    }
-    S1(i,i) ;
-    S2(i,i) ;
-    for (j=i+1;j<=M;j++) {
-      S1(i,j) ;
-    }
-  }
-  for (j=1;j<=M-1;j++) {
-    S1(M,j) ;
-  }
-  S1(M,M) ;
-  S2(M,M) ;
-}
diff --git a/cloog-0.16.3/test/lineality-2-1-2.c b/cloog-0.16.3/test/lineality-2-1-2.c
deleted file mode 100644
index 37a7e2a..0000000
--- a/cloog-0.16.3/test/lineality-2-1-2.c
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/lineality-2-1-2.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.00s. */
-for (i=1;i<=M;i++) {
-  for (j=1;j<=min(M,i+1);j++) {
-    S1(i,j);
-  }
-  if (i >= M-1) {
-    S2(i,i+2);
-  }
-  if (i <= M-2) {
-    S1(i,i+2);
-    S2(i,i+2);
-  }
-  for (j=i+3;j<=M;j++) {
-    S1(i,j);
-  }
-}
diff --git a/cloog-0.16.3/test/lineality-2-1-2.cloog b/cloog-0.16.3/test/lineality-2-1-2.cloog
deleted file mode 100644
index a6ae5e1..0000000
--- a/cloog-0.16.3/test/lineality-2-1-2.cloog
+++ /dev/null
@@ -1,36 +0,0 @@
-# language: C
-c
-
-# Context
-# {M | 2<=M}
-2   3
-# M 1
-1 1 -2
-1 0 1
-0
-
-2 # Number of statements
-
-1
-# {i,j,M | 1<=i<=M; 1<=j<=M}
-5   5
-#  i  j  M  1
-1  1  0  0  -1
-1  0  1  0  -1
-1  -1 0  1  0
-1  0  -1 1  0
-1  0  0  0  1
-0 0 0
-
-1
-# {i,j,M | i=j-2; 3<=j<=M+2}
-4   5
-#  i  j  M  1
-0  1  -1 0  2
-1  0  1  0  -3
-1  0  -1 1  2
-1  0  0  0  1
-0 0 0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/lineality-2-1-2.good.c b/cloog-0.16.3/test/lineality-2-1-2.good.c
deleted file mode 100644
index 78d8126..0000000
--- a/cloog-0.16.3/test/lineality-2-1-2.good.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Generated from ../../../git/cloog/test/lineality-2-1-2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j;
-  for (i=1;i<=M-3;i++) {
-    for (j=1;j<=i+1;j++) {
-      S1(i,j) ;
-    }
-    j = i+2 ;
-    S1(i,i+2) ;
-    S2(i,i+2) ;
-    for (j=i+3;j<=M;j++) {
-      S1(i,j) ;
-    }
-  }
-  if (M >= 3) {
-    i = M-2 ;
-    for (j=1;j<=M-1;j++) {
-      S1(M-2,j) ;
-    }
-    S1(M-2,M) ;
-    S2(M-2,M) ;
-  }
-  for (i=M-1;i<=M;i++) {
-    for (j=1;j<=M;j++) {
-      S1(i,j) ;
-    }
-    j = i+2 ;
-    S2(i,i+2) ;
-  }
-}
diff --git a/cloog-0.16.3/test/logo.c b/cloog-0.16.3/test/logo.c
deleted file mode 100644
index 54d229d..0000000
--- a/cloog-0.16.3/test/logo.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/logo.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.01s. */
-for (j=0;j<=7;j++) {
-  S1(1,j);
-}
-for (i=2;i<=6;i++) {
-  for (j=0;j<=i-2;j++) {
-    S2(i,j);
-  }
-  for (j=i-1;j<=4;j++) {
-    S1(i,j);
-    S2(i,j);
-  }
-  for (j=5;j<=7;j++) {
-    S1(i,j);
-  }
-}
-for (i=7;i<=8;i++) {
-  for (j=i-1;j<=7;j++) {
-    S1(i,j);
-  }
-}
diff --git a/cloog-0.16.3/test/logo.cloog b/cloog-0.16.3/test/logo.cloog
deleted file mode 100644
index 5583c29..0000000
--- a/cloog-0.16.3/test/logo.cloog
+++ /dev/null
@@ -1,30 +0,0 @@
-# language: C
-c
-
-# Context
-1 3
-#  n  1
-1  0  1
-0
-
-2 # Number of statements
-
-1
-3 5
-#  i  j  n  1
-1  1  0  0 -1 # i >= 1
-1  0 -1  0  7 # j <= 7
-1 -1  1  0  1 # j >= i-1
-0  0  0
-
-1
-4 5
-#  i  j  n  1
-1  1  0  0 -2 # i >= 2
-1 -1  0  0  6 # i <= 6
-1  0  1  0  0 # j >= 0
-1  0 -1  0  4 # j <= 4
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/logo.good.c b/cloog-0.16.3/test/logo.good.c
deleted file mode 100644
index 203e5ac..0000000
--- a/cloog-0.16.3/test/logo.good.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Generated from ../../../git/cloog/test/logo.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j;
-  for (j=0;j<=7;j++) {
-    S1(1,j) ;
-  }
-  for (i=2;i<=5;i++) {
-    for (j=0;j<=i-2;j++) {
-      S2(i,j) ;
-    }
-    for (j=i-1;j<=4;j++) {
-      S1(i,j) ;
-      S2(i,j) ;
-    }
-    for (j=5;j<=7;j++) {
-      S1(i,j) ;
-    }
-  }
-  for (j=0;j<=4;j++) {
-    S2(6,j) ;
-  }
-  for (j=5;j<=7;j++) {
-    S1(6,j) ;
-  }
-  for (i=7;i<=8;i++) {
-    for (j=i-1;j<=7;j++) {
-      S1(i,j) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/logopar.c b/cloog-0.16.3/test/logopar.c
deleted file mode 100644
index 0b2c8f9..0000000
--- a/cloog-0.16.3/test/logopar.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/logopar.cloog by CLooG 0.14.0-284-g5c046c9 gmp bits in 0.00s. */
-for (j=0;j<=m;j++) {
-  S1(1,j);
-}
-for (i=2;i<=n;i++) {
-  for (j=0;j<=i-2;j++) {
-    S2(i,j);
-  }
-  for (j=i-1;j<=n;j++) {
-    S1(i,j);
-    S2(i,j);
-  }
-  for (j=n+1;j<=m;j++) {
-    S1(i,j);
-  }
-}
-for (i=n+1;i<=m+1;i++) {
-  for (j=i-1;j<=m;j++) {
-    S1(i,j);
-  }
-}
diff --git a/cloog-0.16.3/test/logopar.cloog b/cloog-0.16.3/test/logopar.cloog
deleted file mode 100644
index 37114ae..0000000
--- a/cloog-0.16.3/test/logopar.cloog
+++ /dev/null
@@ -1,33 +0,0 @@
-# language: C
-c
-
-# Context
-3 4
-#  m  n  1
-1  1 -1  0  # m > n
-1  1  0  0  # m >= 0
-1  0  1 -2  # n >= 2
-1
-m n
-
-2 # Number of statements
-
-1
-3 6
-#  i  j  m  n  1
-1  1  0  0  0 -1 # i >= 1
-1  0 -1  1  0  0 # j <= m
-1 -1  1  0  0  1 # j >= i-1
-0  0  0
-
-1
-4 6
-#  i  j  m  n  1
-1  1  0  0  0 -2 # i >= 2
-1 -1  0  0  1  0 # i <= n
-1  0  1  0  0  0 # j >= 0
-1  0 -1  0  1  0 # j <= n
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/logopar.good.c b/cloog-0.16.3/test/logopar.good.c
deleted file mode 100644
index 2b03ca2..0000000
--- a/cloog-0.16.3/test/logopar.good.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Generated from ../../../git/cloog/test/logopar.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int m, int n)
-{
-  /* Original iterators. */
-  int i, j;
-  for (j=0;j<=m;j++) {
-    S1(1,j) ;
-  }
-  if (m >= n+1) {
-    for (i=2;i<=n;i++) {
-      for (j=0;j<=i-2;j++) {
-        S2(i,j) ;
-      }
-      for (j=i-1;j<=n;j++) {
-        S1(i,j) ;
-        S2(i,j) ;
-      }
-      for (j=n+1;j<=m;j++) {
-        S1(i,j) ;
-      }
-    }
-  }
-  if (m == n) {
-    for (i=2;i<=n;i++) {
-      for (j=0;j<=i-2;j++) {
-        S2(i,j) ;
-      }
-      for (j=i-1;j<=n;j++) {
-        S1(i,j) ;
-        S2(i,j) ;
-      }
-    }
-  }
-  for (i=n+1;i<=m+1;i++) {
-    for (j=i-1;j<=m;j++) {
-      S1(i,j) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/lu.c b/cloog-0.16.3/test/lu.c
deleted file mode 100644
index 74ec81f..0000000
--- a/cloog-0.16.3/test/lu.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from ../../../git/cloog/test/lu.cloog by CLooG 0.14.0-238-gb1cb779 gmp bits in 0.01s. */
-if (n >= 2) {
-  for (j=2;j<=n;j++) {
-    S1(1,j);
-  }
-  for (c1=2;c1<=n-1;c1++) {
-    for (c2=2;c2<=n;c2++) {
-      for (i=1;i<=min(c1-1,c2-1);i++) {
-        S2(i,c2,c1);
-      }
-    }
-    for (j=c1+1;j<=n;j++) {
-      S1(c1,j);
-    }
-  }
-  for (c2=2;c2<=n;c2++) {
-    for (i=1;i<=c2-1;i++) {
-      S2(i,c2,n);
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/lu.cloog b/cloog-0.16.3/test/lu.cloog
deleted file mode 100644
index 7753006..0000000
--- a/cloog-0.16.3/test/lu.cloog
+++ /dev/null
@@ -1,47 +0,0 @@
-# language: C
-c
-
-# parameter n
-1 3
-#  n  1
-1  0  1
-1
-n
-
-2 # Number of statements
-
-1
-# {i, j | 1<=i<=n; i+1<=j<=n}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1 -1  1  0 -1
-1  0 -1  1  0
-0  0  0
-
-1
-# {i, j, k | 1<=i<=n; i+1<=j<=n i+1<=k<=n}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1 -1  1  0  0 -1
-1  0 -1  0  1  0
-1 -1  0  1  0 -1
-1  0  0 -1  1  0
-0  0  0
-0
-
-2 # Scattering functions
-# Et les instructions de chunking...
-2 7
-# c1 c2  i  j  n  1
-0  1  0 -1  0  0  0
-0  0  1  0  0 -1  0
-
-2 8
-# c1 c2  i  j  k  n  1
-0  1  0  0  0 -1  0  0
-0  0  1  0 -1  0  0  0
-0
diff --git a/cloog-0.16.3/test/lu.good.c b/cloog-0.16.3/test/lu.good.c
deleted file mode 100644
index 5e9d3d2..0000000
--- a/cloog-0.16.3/test/lu.good.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Generated from ../../../git/cloog/test/lu.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-
-void test(int n)
-{
-  /* Scattering iterators. */
-  int c1, c2;
-  /* Original iterators. */
-  int i, j, k;
-  if (n >= 2) {
-    for (j=2;j<=n;j++) {
-      S1(1,j) ;
-    }
-  }
-  for (c1=2;c1<=n-1;c1++) {
-    for (c2=2;c2<=n-1;c2++) {
-      for (i=1;i<=min(c2-1,c1-1);i++) {
-        S2(i,c2,c1) ;
-      }
-    }
-    for (i=1;i<=c1-1;i++) {
-      S2(i,n,c1) ;
-    }
-    for (j=c1+1;j<=n;j++) {
-      S1(c1,j) ;
-    }
-  }
-  if (n >= 2) {
-    for (c2=2;c2<=n;c2++) {
-      for (i=1;i<=c2-1;i++) {
-        S2(i,c2,n) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/lu2.c b/cloog-0.16.3/test/lu2.c
deleted file mode 100644
index 2f3b34b..0000000
--- a/cloog-0.16.3/test/lu2.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from ../../../git/cloog/test/lu2.cloog by CLooG 0.14.0-238-gb1cb779 gmp bits in 0.01s. */
-if (n >= 2) {
-  for (l=2;l<=n;l++) {
-    S1(1,n,1,l);
-  }
-  for (i=2;i<=n-1;i++) {
-    for (j=2;j<=n;j++) {
-      for (k=1;k<=min(i-1,j-1);k++) {
-        S2(i,j,k,j,i);
-      }
-    }
-    for (l=i+1;l<=n;l++) {
-      S1(i,n,i,l);
-    }
-  }
-  for (j=2;j<=n;j++) {
-    for (k=1;k<=j-1;k++) {
-      S2(n,j,k,j,n);
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/lu2.cloog b/cloog-0.16.3/test/lu2.cloog
deleted file mode 100644
index 5775e49..0000000
--- a/cloog-0.16.3/test/lu2.cloog
+++ /dev/null
@@ -1,37 +0,0 @@
-# language: C
-c
-
-# parameter n
-1 3
-1 0 1
-1
-n
-
-2 # Number of statements
-
-1
-# {c1, c2, i, j | c1=i, c2=n, 1<=i<=n; i+1<=j<=n}
-6 7
-0  1  0 -1  0  0  0
-0  0  1  0  0 -1  0
-1  0  0  1  0  0 -1
-1  0  0 -1  0  1  0
-1  0  0 -1  1  0 -1
-1  0  0  0 -1  1  0
-0  0  0
-
-1
-# {c1, c2, i, j, k | c1=k, c2=j, 1<=i<=n; i+1<=j<=n i+1<=k<=n}
-8 8
-0  1  0  0  0 -1  0  0
-0  0  1  0 -1  0  0  0
-1  0  0  1  0  0  0 -1
-1  0  0 -1  0  0  1  0
-1  0  0 -1  1  0  0 -1
-1  0  0  0 -1  0  1  0
-1  0  0 -1  0  1  0 -1
-1  0  0  0  0 -1  1  0
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/lu2.good.c b/cloog-0.16.3/test/lu2.good.c
deleted file mode 100644
index 5641856..0000000
--- a/cloog-0.16.3/test/lu2.good.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Generated from ../../../git/cloog/test/lu2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k,l) { hash(1); hash(i); hash(j); hash(k); hash(l); }
-#define S2(i,j,k,l,m) { hash(2); hash(i); hash(j); hash(k); hash(l); hash(m); }
-
-void test(int n)
-{
-  /* Original iterators. */
-  int i, j, k, l, m;
-  if (n >= 2) {
-    for (l=2;l<=n;l++) {
-      S1(1,n,1,l) ;
-    }
-  }
-  for (i=2;i<=n-1;i++) {
-    for (j=2;j<=n-1;j++) {
-      for (k=1;k<=min(j-1,i-1);k++) {
-        S2(i,j,k,j,i) ;
-      }
-    }
-    for (k=1;k<=i-1;k++) {
-      S2(i,n,k,n,i) ;
-    }
-    for (l=i+1;l<=n;l++) {
-      S1(i,n,i,l) ;
-    }
-  }
-  if (n >= 2) {
-    for (j=2;j<=n;j++) {
-      for (k=1;k<=j-1;k++) {
-        S2(n,j,k,j,n) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/lub.c b/cloog-0.16.3/test/lub.c
deleted file mode 100644
index 43269a4..0000000
--- a/cloog-0.16.3/test/lub.c
+++ /dev/null
@@ -1,13 +0,0 @@
-/* Generated from ../../../git/cloog/test/lub.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.02s. */
-if (M >= 2) {
-  for (i=1;i<=M-1;i++) {
-    for (j=i+1;j<=M;j++) {
-      S1(i,j) ;
-      for (k=i+1;k<=M;k++) {
-        S2(i,j,k) ;
-        S3(i,j,k) ;
-      }
-      S4(i,j) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/lub.cloog b/cloog-0.16.3/test/lub.cloog
deleted file mode 100644
index fcab9b5..0000000
--- a/cloog-0.16.3/test/lub.cloog
+++ /dev/null
@@ -1,58 +0,0 @@
-# language: C
-c
-
-# parameter n
-1 3
-#  n  1
-1  0  1
-0
-
-4 # Number of statements
-
-1
-# {i, j | 1<=i<=n; i+1<=j<=n}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1 -1  1  0 -1
-1  0 -1  1  0
-0  0  0
- 
-1
-# {i, j, k | 1<=i<=n; i+1<=j<=n i+1<=k<=n}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1 -1  1  0  0 -1
-1  0 -1  0  1  0
-1 -1  0  1  0 -1
-1  0  0 -1  1  0
-0  0  0
-
-1
-# {i, j, k | 1<=i<=n; i+1<=j<=n i+1<=k<=n}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1 -1  1  0  0 -1
-1  0 -1  0  1  0
-1 -1  0  1  0 -1
-1  0  0 -1  1  0
-0  0  0
-
-1
-# {i, j | 1<=i<=n; i+1<=j<=n}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1 -1  1  0 -1
-1  0 -1  1  0
-0  0  0
-0
- 
-0 # Scattering functions
-
diff --git a/cloog-0.16.3/test/lub.good.c b/cloog-0.16.3/test/lub.good.c
deleted file mode 100644
index 3122a3c..0000000
--- a/cloog-0.16.3/test/lub.good.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Generated from ../../../git/cloog/test/lub.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-#define S3(i,j,k) { hash(3); hash(i); hash(j); hash(k); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j, k;
-  for (i=1;i<=M-1;i++) {
-    for (j=i+1;j<=M;j++) {
-      S1(i,j) ;
-      for (k=i+1;k<=M;k++) {
-        S2(i,j,k) ;
-        S3(i,j,k) ;
-      }
-      S4(i,j) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/lux.c b/cloog-0.16.3/test/lux.c
deleted file mode 100644
index d313e3a..0000000
--- a/cloog-0.16.3/test/lux.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from ../../../git/cloog/test/lux.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.02s. */
-if (M >= 2) {
-  for (l=2;l<=M;l++) {
-    S1(1,1,M,l) ;
-  }
-  for (i=2;i<=M-1;i++) {
-    for (j=1;j<=i-1;j++) {
-      for (k=j+1;k<=M;k++) {
-        S2(i,j,k,k,i) ;
-      }
-    }
-    for (l=i+1;l<=M;l++) {
-      S1(i,i,M,l) ;
-    }
-  }
-  for (j=1;j<=M-1;j++) {
-    for (k=j+1;k<=M;k++) {
-      S2(M,j,k,k,M) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/lux.cloog b/cloog-0.16.3/test/lux.cloog
deleted file mode 100644
index 1687e32..0000000
--- a/cloog-0.16.3/test/lux.cloog
+++ /dev/null
@@ -1,36 +0,0 @@
-# language: C
-c
-
-# parameter n
-1 3
-1 0 1
-0
-
-2 # Number of statements
-
-1
-# {c1, c2, i, j | c1=i, c2=n, 1<=i<=n; i+1<=j<=n}
-6 7
-0  1 -1  0  0  0  0
-0  0  0  1  0 -1  0
-1  0  1  0  0  0 -1
-1  0 -1  0  0  1  0
-1  0 -1  0  1  0 -1
-1  0  0  0 -1  1  0
-0  0  0
- 
-1
-# {c1, c2, i, j, k | c1=k, c2=j, 1<=i<=n; i+1<=j<=n i+1<=k<=n}
-8 8
-0  1  0  0  0 -1  0  0
-0  0  0 -1  1  0  0  0
-1  0  1  0  0  0  0 -1
-1  0 -1  0  0  0  1  0
-1  0 -1  1  0  0  0 -1
-1  0  0 -1  0  0  1  0
-1  0 -1  0  0  1  0 -1
-1  0  0  0  0 -1  1  0
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/lux.good.c b/cloog-0.16.3/test/lux.good.c
deleted file mode 100644
index e30289c..0000000
--- a/cloog-0.16.3/test/lux.good.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Generated from ../../../git/cloog/test/lux.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k,l) { hash(1); hash(i); hash(j); hash(k); hash(l); }
-#define S2(i,j,k,l,m) { hash(2); hash(i); hash(j); hash(k); hash(l); hash(m); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j, k, l, m;
-  if (M >= 2) {
-    for (l=2;l<=M;l++) {
-      S1(1,1,M,l) ;
-    }
-  }
-  for (i=2;i<=M-1;i++) {
-    for (j=1;j<=i-1;j++) {
-      for (k=j+1;k<=M;k++) {
-        S2(i,j,k,k,i) ;
-      }
-    }
-    for (l=i+1;l<=M;l++) {
-      S1(i,i,M,l) ;
-    }
-  }
-  if (M >= 2) {
-    for (j=1;j<=M-1;j++) {
-      for (k=j+1;k<=M;k++) {
-        S2(M,j,k,k,M) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/merge.c b/cloog-0.16.3/test/merge.c
deleted file mode 100644
index b85ca1c..0000000
--- a/cloog-0.16.3/test/merge.c
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Generated from ../../../git/cloog/test/merge.cloog by CLooG 0.14.0-238-gb1cb779 gmp bits in 0.00s. */
-S1(0);
-for (c1=0;c1<=10;c1++) {
-  if (c1 >= 2) {
-    S2(c1);
-  }
-  S3(c1);
-}
diff --git a/cloog-0.16.3/test/merge.cloog b/cloog-0.16.3/test/merge.cloog
deleted file mode 100644
index d98c1d0..0000000
--- a/cloog-0.16.3/test/merge.cloog
+++ /dev/null
@@ -1,42 +0,0 @@
-c
-
-0 2
-
-0
-
-3
-
-1
-1 3
-0 -1 0
-0 0 0
-
-1
-2 3
-1 1 -2
-1 -1 10
-0 0 0
-
-1
-2 3
-1 1 0
-1 -1 10
-0 0 0
-
-0
-
-3
-
-2 5
-0 1 0 -1 0
-0 0 1  0 0
-
-2 5
-0 1 0 -1 0
-0 0 1  0 -1
-
-2 5
-0 1 0 -1 0
-0 0 1  0 -2
-
-0
diff --git a/cloog-0.16.3/test/merge.good.c b/cloog-0.16.3/test/merge.good.c
deleted file mode 100644
index 283dc4b..0000000
--- a/cloog-0.16.3/test/merge.good.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Generated from ../../../git/cloog/test/merge.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i) { hash(2); hash(i); }
-#define S3(i) { hash(3); hash(i); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int c1;
-  /* Original iterators. */
-  int i;
-  for (c1=0;c1<=10;c1++) {
-    if (c1 == 0) {
-      S1(0) ;
-    }
-    if (c1 >= 2) {
-      S2(c1) ;
-    }
-    S3(c1) ;
-  }
-}
diff --git a/cloog-0.16.3/test/min-1-1.c b/cloog-0.16.3/test/min-1-1.c
deleted file mode 100644
index 896fea0..0000000
--- a/cloog-0.16.3/test/min-1-1.c
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Generated from ../../../git/cloog/test/min-1-1.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if ((M >= 0) && (N >= 1)) {
-  for (i=1;i<=N;i++) {
-    for (j=0;j<=min(min(M,i),-i+N);j++) {
-      S1(i,j) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/min-1-1.cloog b/cloog-0.16.3/test/min-1-1.cloog
deleted file mode 100644
index a15cdbd..0000000
--- a/cloog-0.16.3/test/min-1-1.cloog
+++ /dev/null
@@ -1,27 +0,0 @@
-# language: C
-c
-
-# Context
-# {M,N | 1>=0}
-1   4
-# M N 1
-1 0 0 1
-0
-
-1 # Number of statements
-
-1
-# {i,j |1<=i<=N; 0<=j<=M; j<=i; j+i<=N}, i.e.
-# {i,j | (1,j)<=i<=-j+N; 0<=j<=M}
-6   6
-#  i  j  M  N  1
-1  1  0  0  0  -1
-1  0  1  0  0  0
-1  0  -1 1  0  0
-1  1  -1 0  0  0
-1  -1 -1 0  1  0
-1  0  0  0  0  1
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/min-1-1.good.c b/cloog-0.16.3/test/min-1-1.good.c
deleted file mode 100644
index ff0d5fc..0000000
--- a/cloog-0.16.3/test/min-1-1.good.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Generated from ../../../git/cloog/test/min-1-1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i, j;
-  if (M >= 0) {
-    for (i=1;i<=N;i++) {
-      for (j=0;j<=min(min(i,-i+N),M);j++) {
-        S1(i,j) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/min-2-1.c b/cloog-0.16.3/test/min-2-1.c
deleted file mode 100644
index f7161bc..0000000
--- a/cloog-0.16.3/test/min-2-1.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Generated from ../../../git/cloog/test/min-2-1.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if ((M >= 0) && (N >= 1)) {
-  for (i=1;i<=N;i++) {
-    for (j=0;j<=min(min(M,i),-i+N);j++) {
-      for (k=0;k<=min(min(M,i),-i+N);k++) {
-        S1(i,j,k) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/min-2-1.cloog b/cloog-0.16.3/test/min-2-1.cloog
deleted file mode 100644
index 0c1ed37..0000000
--- a/cloog-0.16.3/test/min-2-1.cloog
+++ /dev/null
@@ -1,31 +0,0 @@
-# language: C
-c
-
-# Context
-# {M,N | 1>=0}
-1   4
-# M N 1
-1 0 0 1
-0
-
-1 # Number of statements
-
-1
-# {i,j |1<=i<=N; 0<=j<=M; j<=i; j+i<=N}, i.e.
-# {i,j | (1,j)<=i<=-j+N; 0<=j<=M}
-10   7
-#  i  j  k M  N  1
-1  1  0  0 0  0  -1
-1  0  1  0 0  0  0
-1  0  -1 0 1  0  0
-1  1  -1 0 0  0  0
-1  -1 -1 0 0  1  0
-1  0  0  1 0  0  0
-1  0  0 -1 1  0  0
-1  1  0 -1 0  0  0
-1  -1 0 -1 0  1  0
-1  0  0 0  0  0  1
-0 0 0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/min-2-1.good.c b/cloog-0.16.3/test/min-2-1.good.c
deleted file mode 100644
index e052a0c..0000000
--- a/cloog-0.16.3/test/min-2-1.good.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Generated from ../../../git/cloog/test/min-2-1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i, j, k;
-  if (M >= 0) {
-    for (i=1;i<=N;i++) {
-      for (j=0;j<=min(min(i,M),-i+N);j++) {
-        for (k=0;k<=min(min(M,i),-i+N);k++) {
-          S1(i,j,k) ;
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/min-3-1.c b/cloog-0.16.3/test/min-3-1.c
deleted file mode 100644
index 5736a3c..0000000
--- a/cloog-0.16.3/test/min-3-1.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/min-3-1.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (i=0;i<=min(10,M);i++) {
-  for (j=0;j<=min(10,M);j++) {
-    S1(i,j) ;
-  }
-}
diff --git a/cloog-0.16.3/test/min-3-1.cloog b/cloog-0.16.3/test/min-3-1.cloog
deleted file mode 100644
index f1a3c12..0000000
--- a/cloog-0.16.3/test/min-3-1.cloog
+++ /dev/null
@@ -1,27 +0,0 @@
-# language: C
-c
-
-# Context
-2 3
-#  M  1
-1  1  0
-1  0  1
-0 
-
-1 # Number of statements
-
-1
-#
-7 5
-#  i  j  M  1
-1  1  0  0  0
-1 -1  0  1  0
-1 -1  0  0 10
-1  0  1  0  0
-1  0 -1  1  0
-1  0 -1  0 10
-1  0  0  0  1
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/min-3-1.good.c b/cloog-0.16.3/test/min-3-1.good.c
deleted file mode 100644
index ec50b38..0000000
--- a/cloog-0.16.3/test/min-3-1.good.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from ../../../git/cloog/test/min-3-1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j;
-  for (i=0;i<=min(10,M);i++) {
-    for (j=0;j<=min(10,M);j++) {
-      S1(i,j) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/min-4-1.c b/cloog-0.16.3/test/min-4-1.c
deleted file mode 100644
index 91e5e65..0000000
--- a/cloog-0.16.3/test/min-4-1.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/min-4-1.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if ((M >= -N) && (M >= -O) && (N >= 0) && (N >= -O)) {
-  for (i=max(-M,-N);i<=min(N,O);i++) {
-    S1(i) ;
-  }
-}
diff --git a/cloog-0.16.3/test/min-4-1.cloog b/cloog-0.16.3/test/min-4-1.cloog
deleted file mode 100644
index 5cce62f..0000000
--- a/cloog-0.16.3/test/min-4-1.cloog
+++ /dev/null
@@ -1,25 +0,0 @@
-# language: C
-c
-
-# Context
-# {L,M,N|}
-1 5
-#  L  M  N  1
-1  0  0  0  1
-0
-
-1 # Number of statements
-
-1
-# {i|-L,-M <= i <= M, N} 
-5  6
-#  i  L  M  N  1
-1  1  1  0  0  0
-1  1  0  1  0  0
-1 -1  0  1  0  0
-1 -1  0  0  1  0
-1  0  0  0  0  1
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/min-4-1.good.c b/cloog-0.16.3/test/min-4-1.good.c
deleted file mode 100644
index a04831f..0000000
--- a/cloog-0.16.3/test/min-4-1.good.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated from ../../../git/cloog/test/min-4-1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-
-void test(int M, int N, int O)
-{
-  /* Original iterators. */
-  int i;
-  for (i=max(-M,-N);i<=min(O,N);i++) {
-    S1(i) ;
-  }
-}
diff --git a/cloog-0.16.3/test/mod4.c b/cloog-0.16.3/test/mod4.c
deleted file mode 100644
index 6a1ad6a..0000000
--- a/cloog-0.16.3/test/mod4.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/mod4.cloog by CLooG 0.14.0-225-g6e2d019 gmp bits in 0.00s. */
-for (j=2;j<=10;j+=3) {
-  S1(j,(j+1)/3,(j+1)/3,2,(j-2)/3);
-  S2(j,(j+1)/3,(j+1)/3,2,(j-2)/3);
-  S3(j,(j+1)/3,(j+1)/3,2,(j-2)/3);
-}
diff --git a/cloog-0.16.3/test/mod4.cloog b/cloog-0.16.3/test/mod4.cloog
deleted file mode 100644
index 6f3eecd..0000000
--- a/cloog-0.16.3/test/mod4.cloog
+++ /dev/null
@@ -1,72 +0,0 @@
-# language: C
-c
-
-# parameters
-1 2
-1 1
- 0
-
-
-3
-
-
-
-# S1: ND_4IP_3
-1
-11 7
-  1  1  0  0  0  0 -1
-  1 -1  0  0  0  0 10
-  0  0  0  0  1  0 -2
-  1 -1  0  0  0  3  2
-  1 -1  0  0  0  3  2
-  1  1  0  0  0 -3  0
-  0  1  0  0 -1 -3  0
-  1  1 -3  0  0  0  2
-  1 -1  3  0  0  0  0
-  1  1  0 -3  0  0  1
-  1 -1  0  3  0  0  1
- 0 0 0
-
-
-
-# S2:  W:ND_4OP_1
-1
-13 7
-  1  0  1  0  0 -1 -1
-  1  0  0  3  0 -3 -2
-  1  1  0  0  0  0 -1
-  1 -1  0  0  0  0 10
-  0  0  0  0  1  0 -2
-  1 -1  0  0  0  3  2
-  1 -1  0  0  0  3  2
-  1  1  0  0  0 -3  0
-  0  1  0  0 -1 -3  0
-  1  1 -3  0  0  0  2
-  1 -1  3  0  0  0  0
-  1  1  0 -3  0  0  1
-  1 -1  0  3  0  0  1
- 0 0 0
-
-
-
-# S3: ND_4
-1
-11 7
-  1  1  0  0  0  0 -1
-  1 -1  0  0  0  0 10
-  0  0  0  0  1  0 -2
-  1 -1  0  0  0  3  2
-  1 -1  0  0  0  3  2
-  1  1  0  0  0 -3  0
-  0  1  0  0 -1 -3  0
-  1  1 -3  0  0  0  2
-  1 -1  3  0  0  0  0
-  1  1  0 -3  0  0  1
-  1 -1  0  3  0  0  1
- 0 0 0
-
-
- 1
- j div41 div42 mod6 mod6_a
- 0
- 0
diff --git a/cloog-0.16.3/test/mode.c b/cloog-0.16.3/test/mode.c
deleted file mode 100644
index c527eed..0000000
--- a/cloog-0.16.3/test/mode.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/mode.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.00s. */
-if (M >= 0) {
-  if (N >= 0) {
-    for (i=0;i<=M;i++) {
-      for (j=0;j<=min(N,i);j++) {
-        S1(i,j);
-        S2(i,j);
-      }
-      for (j=N+1;j<=i;j++) {
-        S1(i,j);
-      }
-      for (j=i+1;j<=N;j++) {
-        S2(i,j);
-      }
-    }
-  }
-  if (N <= -1) {
-    for (i=0;i<=M;i++) {
-      for (j=0;j<=i;j++) {
-        S1(i,j);
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/mode.cloog b/cloog-0.16.3/test/mode.cloog
deleted file mode 100644
index caeecb8..0000000
--- a/cloog-0.16.3/test/mode.cloog
+++ /dev/null
@@ -1,33 +0,0 @@
-# language: C
-c
-
-# parameters n m
-1 4
-#  n  m  1
-1  0  0  1
-0
-
-2 # Number of statements
-
-1
-# S2 {i, j | 0<=i<=n; 0<=j<=i}
-4 6
-#  i  j  n  m  1
-1  1  0  0  0  0
-1 -1  0  1  0  0
-1  0  1  0  0  0
-1  1 -1  0  0  0
-0  0  0
-
-1
-# S2 {i, j | 0<=i<=n; 0<=j<=m}
-4 6
-#  i  j  n  m  1
-1  1  0  0  0  0
-1 -1  0  1  0  0
-1  0  1  0  0  0
-1  0 -1  0  1  0
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/mode.good.c b/cloog-0.16.3/test/mode.good.c
deleted file mode 100644
index 0714757..0000000
--- a/cloog-0.16.3/test/mode.good.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Generated from ../../../git/cloog/test/mode.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i, j;
-  for (i=0;i<=min(M,N-1);i++) {
-    for (j=0;j<=i;j++) {
-      S1(i,j) ;
-      S2(i,j) ;
-    }
-    for (j=i+1;j<=N;j++) {
-      S2(i,j) ;
-    }
-  }
-  if ((M >= N) && (N >= 0)) {
-    for (j=0;j<=N;j++) {
-      S1(N,j) ;
-      S2(N,j) ;
-    }
-  }
-  if (N >= 0) {
-    for (i=N+1;i<=M;i++) {
-      for (j=0;j<=N;j++) {
-        S1(i,j) ;
-        S2(i,j) ;
-      }
-      for (j=N+1;j<=i;j++) {
-        S1(i,j) ;
-      }
-    }
-  }
-  if (N <= -1) {
-    for (i=0;i<=M;i++) {
-      for (j=0;j<=i;j++) {
-        S1(i,j) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/multi-mm-1.c b/cloog-0.16.3/test/multi-mm-1.c
deleted file mode 100644
index 646395c..0000000
--- a/cloog-0.16.3/test/multi-mm-1.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/multi-mm-1.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.00s. */
-for (i=0;i<=M;i++) {
-  for (j=0;j<=min(N,i);j++) {
-    S1(i,j);
-    S2(i,j);
-  }
-  for (j=N+1;j<=i;j++) {
-    S1(i,j);
-  }
-}
diff --git a/cloog-0.16.3/test/multi-mm-1.cloog b/cloog-0.16.3/test/multi-mm-1.cloog
deleted file mode 100644
index 58f4ce8..0000000
--- a/cloog-0.16.3/test/multi-mm-1.cloog
+++ /dev/null
@@ -1,37 +0,0 @@
-# language: C
-c
-
-# Context
-#{M,N|M>N}
-3  4
-#  M  N  1
-1  1 -1  0
-1  0  1 -1
-1  0  0  1
-0
-
-2 # Number of statements
-
-1
-#
-4  6
-#  i  j  M  N  1
-1  0  1  0  0  0
-1  1 -1  0  0  0
-1 -1  0  1  0  0
-1  0  0  0  0  1
-0  0  0
-
-1
-#
-5  6
-#  i  j  M  N  1
-1  0  1  0  0  0
-1  1 -1  0  0  0
-1 -1  0  1  0  0
-1  0 -1  0  1  0
-1  0  0  0  0  1
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/multi-mm-1.good.c b/cloog-0.16.3/test/multi-mm-1.good.c
deleted file mode 100644
index 6bfcc3c..0000000
--- a/cloog-0.16.3/test/multi-mm-1.good.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Generated from ../../../git/cloog/test/multi-mm-1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i, j;
-  for (i=0;i<=N;i++) {
-    for (j=0;j<=i;j++) {
-      S1(i,j) ;
-      S2(i,j) ;
-    }
-  }
-  for (i=N+1;i<=M;i++) {
-    for (j=0;j<=N;j++) {
-      S1(i,j) ;
-      S2(i,j) ;
-    }
-    for (j=N+1;j<=i;j++) {
-      S1(i,j) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/multi-stride.c b/cloog-0.16.3/test/multi-stride.c
deleted file mode 100644
index 51b2061..0000000
--- a/cloog-0.16.3/test/multi-stride.c
+++ /dev/null
@@ -1 +0,0 @@
-/* Generated from ../../../git/cloog/test/multi-stride.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
diff --git a/cloog-0.16.3/test/multi-stride.cloog b/cloog-0.16.3/test/multi-stride.cloog
deleted file mode 100644
index 8f858da..0000000
--- a/cloog-0.16.3/test/multi-stride.cloog
+++ /dev/null
@@ -1,28 +0,0 @@
-# Language
-c
-
-# Context
-
-   1 2
-   1  1
-0
-
-# Number of statements
-1
-
-1
-
-#        i'   i    j    1
-   4 5
-   0    1   -2    0   -1
-   0    1    0   -6   -2
-   1    1    0    0    0
-   1   -1    0    0  100
-
-0 0 0
-
-0
-0
-
-
-
diff --git a/cloog-0.16.3/test/multi-stride2.c b/cloog-0.16.3/test/multi-stride2.c
deleted file mode 100644
index 443107b..0000000
--- a/cloog-0.16.3/test/multi-stride2.c
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Generated from ../../../git/cloog/test/multi-stride2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-for (i=5;i<=100;i+=6) {
-  S1(i,(i-1)/2,(i-2)/3) ;
-}
diff --git a/cloog-0.16.3/test/multi-stride2.cloog b/cloog-0.16.3/test/multi-stride2.cloog
deleted file mode 100644
index db1afd4..0000000
--- a/cloog-0.16.3/test/multi-stride2.cloog
+++ /dev/null
@@ -1,28 +0,0 @@
-# Language
-c
-
-# Context
-
-   1 2
-   1  1
-0
-
-# Number of statements
-1
-
-1
-
-#        i'   i    j    1
-   4 5
-   0    1   -2    0   -1
-   0    1    0   -3   -2
-   1    1    0    0    0
-   1   -1    0    0  100
-
-0 0 0
-
-0
-0
-
-
-
diff --git a/cloog-0.16.3/test/no_lindep.c b/cloog-0.16.3/test/no_lindep.c
deleted file mode 100644
index 3c7c574..0000000
--- a/cloog-0.16.3/test/no_lindep.c
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Generated from ../../../git/cloog/test/no_lindep.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-S1(N+2) ;
diff --git a/cloog-0.16.3/test/no_lindep.cloog b/cloog-0.16.3/test/no_lindep.cloog
deleted file mode 100644
index ab0cb7d..0000000
--- a/cloog-0.16.3/test/no_lindep.cloog
+++ /dev/null
@@ -1,34 +0,0 @@
-# language C
-c
-
-# 2 parameters
-1 4
-1 0 0 0 
-
-0
-
-# 1 statement
-1
-
-# 1 domain
-# i=n+2
-1
-1 5
-0 -1  0  1  2
-
-0 0 0 
-
-0
-
-# 1 scattering function
-# c1=M+1
-# c2=N
-1
-2  7
-0 -1  0  0  1  0  1
-0  0 -1  0  0  1  0
-
-0
-
-
-
diff --git a/cloog-0.16.3/test/no_lindep.good.c b/cloog-0.16.3/test/no_lindep.good.c
deleted file mode 100644
index 5db6759..0000000
--- a/cloog-0.16.3/test/no_lindep.good.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from ../../../git/cloog/test/no_lindep.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int c1, c2;
-  /* Original iterators. */
-  int i;
-  c1 = M+1 ;
-  i = N+2 ;
-  S1(N+2) ;
-}
diff --git a/cloog-0.16.3/test/non_optimal/nul_complex1.c b/cloog-0.16.3/test/non_optimal/nul_complex1.c
deleted file mode 100644
index ff78145..0000000
--- a/cloog-0.16.3/test/non_optimal/nul_complex1.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Generated from ../../../git/cloog/test/./non_optimal/nul_complex1.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-if (n >= 0) {
-  for (c1=0;c1<=5*n;c1++) {
-    for (c2=max(ceild(2*c1,3),c1-n);c2<=min(floord(2*c1+2*n,3),c1);c2++) {
-      if (c2%2 == 0) {
-        S1((-2*c1+3*c2)/2,c1-c2) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/non_optimal/nul_complex1.cloog b/cloog-0.16.3/test/non_optimal/nul_complex1.cloog
deleted file mode 100644
index 4b4d45a..0000000
--- a/cloog-0.16.3/test/non_optimal/nul_complex1.cloog
+++ /dev/null
@@ -1,37 +0,0 @@
-# Optimal code is in fact :
-#
-# for (i=0;i<=M;i+=2) {
-#   S1 ;
-# }
- 
-# language: C
-c
-
-# parameter n
-1 3
-#  n  1
-1  0  1
-1
-n
-
-1 # Number of statements
-
-1
-# {i | 0<=i<=n}
-4 5
-#  i  j  n  1
-1  1  0  0  0
-1 -1  0  1  0
-1  0  1  0  0
-1  0 -1  1  0
-0  0  0
-0
-
-1 # Scattering functions
-
-2 7
-# c1 c2  i  j  n  1
-0  1  0 -2 -3  0  0 
-0  0  1 -2 -2  0  0 
-
-0
diff --git a/cloog-0.16.3/test/non_optimal/nul_complex1.good.c b/cloog-0.16.3/test/non_optimal/nul_complex1.good.c
deleted file mode 100644
index 79694f1..0000000
--- a/cloog-0.16.3/test/non_optimal/nul_complex1.good.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Generated from ../../../git/cloog/test/./non_optimal/nul_complex1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int n)
-{
-  /* Scattering iterators. */
-  int c1, c2;
-  /* Original iterators. */
-  int i, j;
-  for (c1=0;c1<=5*n;c1++) {
-    for (c2=max(c1-n,ceild(2*c1,3));c2<=min(c1,floord(2*c1+2*n,3));c2++) {
-      if (c2%2 == 0) {
-        i = (-2*c1+3*c2)/2 ;
-        j = c1-c2 ;
-        S1((-2*c1+3*c2)/2,c1-c2) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/non_optimal/usvd_e_t.c b/cloog-0.16.3/test/non_optimal/usvd_e_t.c
deleted file mode 100644
index 6d253f6..0000000
--- a/cloog-0.16.3/test/non_optimal/usvd_e_t.c
+++ /dev/null
@@ -1,375 +0,0 @@
-/* Generated from ../../../git/cloog/test/non_optimal/usvd_e_t.cloog by CLooG 0.14.0-238-gb1cb779 gmp bits in 0.11s. */
-for (i=0;i<=2;i++) {
-  S1(i,0,0);
-  for (j=0;j<=4;j++) {
-    S2(i,j,0);
-  }
-}
-S1(3,0,0);
-for (j=0;j<=4;j++) {
-  S2(3,j,0);
-}
-for (j=7;j<=11;j++) {
-  S8(3,j,0);
-}
-S1(4,0,0);
-S2(4,0,0);
-S3(4,0,0);
-S5(4,0,0);
-for (j=1;j<=4;j++) {
-  S2(4,j,0);
-  S5(4,j,0);
-}
-for (j=7;j<=11;j++) {
-  S8(4,j,0);
-}
-for (i=5;i<=6;i++) {
-  for (j=-4;j<=i-9;j++) {
-    S6(i,j,0);
-  }
-  for (j=i-9;j<=-1;j++) {
-    S7(i,j,0);
-  }
-  S3(i,0,0);
-  S7(i,0,0);
-  for (j=1;j<=i-4;j++) {
-    S4(i,j,-1);
-  }
-  for (j=i-4;j<=4;j++) {
-    S5(i,j,0);
-  }
-  for (j=7;j<=11;j++) {
-    S8(i,j,0);
-  }
-}
-for (j=-4;j<=-2;j++) {
-  S6(7,j,0);
-}
-for (j=-2;j<=-1;j++) {
-  S7(7,j,0);
-}
-S3(7,0,0);
-S7(7,0,0);
-for (j=1;j<=3;j++) {
-  S4(7,j,-1);
-}
-for (j=3;j<=4;j++) {
-  S5(7,j,0);
-}
-S9(7,4,0);
-S10(7,4,0);
-S11(7,4,0);
-S21(7,4,0);
-S23(7,4,0);
-S11(7,4,1);
-S16(7,4,1);
-S17(7,4,1);
-for (k=2;k<=4;k++) {
-  S11(7,4,k);
-}
-S12(7,5,0);
-S21(7,5,0);
-S22(7,5,0);
-S23(7,5,0);
-S12(7,5,1);
-S16(7,5,1);
-S17(7,5,1);
-for (k=2;k<=4;k++) {
-  S12(7,5,k);
-}
-S21(7,6,0);
-S22(7,6,0);
-S23(7,6,0);
-for (j=7;j<=8;j++) {
-  S8(7,j,0);
-  S21(7,j,0);
-  S22(7,j,0);
-  S23(7,j,0);
-}
-S8(7,9,0);
-S22(7,9,0);
-for (j=10;j<=11;j++) {
-  S8(7,j,0);
-}
-for (j=-4;j<=-1;j++) {
-  S6(8,j,0);
-}
-S7(8,-1,0);
-S3(8,0,0);
-S7(8,0,0);
-S19(8,1,-2);
-S4(8,1,-1);
-S19(8,1,-1);
-S19(8,1,0);
-S15(8,1,4);
-S18(8,1,4);
-for (k=-4;k<=-3;k++) {
-  S14(8,2,k);
-  S20(8,2,k);
-}
-S14(8,2,-2);
-S19(8,2,-2);
-S20(8,2,-2);
-S4(8,2,-1);
-S14(8,2,-1);
-S19(8,2,-1);
-S20(8,2,-1);
-S14(8,2,0);
-S19(8,2,0);
-S20(8,2,0);
-S15(8,2,4);
-S18(8,2,4);
-for (k=-4;k<=-2;k++) {
-  S14(8,3,k);
-  S20(8,3,k);
-}
-S4(8,3,-1);
-S14(8,3,-1);
-S20(8,3,-1);
-S14(8,3,0);
-S20(8,3,0);
-S15(8,3,4);
-S18(8,3,4);
-for (k=-4;k<=-2;k++) {
-  S14(8,4,k);
-  S20(8,4,k);
-}
-S4(8,4,-1);
-S14(8,4,-1);
-S20(8,4,-1);
-S5(8,4,0);
-S9(8,4,0);
-S10(8,4,0);
-S14(8,4,0);
-S20(8,4,0);
-S23(8,4,0);
-S13(8,4,1);
-S21(8,4,1);
-S23(8,4,1);
-S24(8,4,1);
-S13(8,4,2);
-S16(8,4,2);
-S17(8,4,2);
-S24(8,4,2);
-S13(8,4,3);
-S24(8,4,3);
-S13(8,4,4);
-S15(8,4,4);
-S23(8,5,0);
-S11(8,5,1);
-S21(8,5,1);
-S22(8,5,1);
-S23(8,5,1);
-S24(8,5,1);
-S11(8,5,2);
-S16(8,5,2);
-S17(8,5,2);
-S24(8,5,2);
-S11(8,5,3);
-S24(8,5,3);
-S11(8,5,4);
-S15(8,5,4);
-S23(8,6,0);
-S12(8,6,1);
-S21(8,6,1);
-S22(8,6,1);
-S23(8,6,1);
-S24(8,6,1);
-S12(8,6,2);
-S16(8,6,2);
-S17(8,6,2);
-S24(8,6,2);
-S12(8,6,3);
-S24(8,6,3);
-S12(8,6,4);
-for (j=7;j<=8;j++) {
-  S23(8,j,0);
-  S21(8,j,1);
-  S22(8,j,1);
-  S23(8,j,1);
-  for (k=1;k<=3;k++) {
-    S24(8,j,k);
-  }
-}
-S22(8,9,1);
-S7(9,0,0);
-for (j=1;j<=2;j++) {
-  for (k=-1;k<=0;k++) {
-    S19(9,j,k);
-  }
-  for (k=4;k<=5;k++) {
-    S15(9,j,k);
-    S18(9,j,k);
-  }
-}
-S20(9,3,-4);
-for (k=-3;k<=-2;k++) {
-  S14(9,3,k);
-  S20(9,3,k);
-}
-for (k=-1;k<=0;k++) {
-  S14(9,3,k);
-  S19(9,3,k);
-  S20(9,3,k);
-}
-for (k=4;k<=5;k++) {
-  S15(9,3,k);
-  S18(9,3,k);
-}
-S20(9,4,-4);
-for (k=-3;k<=-1;k++) {
-  S14(9,4,k);
-  S20(9,4,k);
-}
-S9(9,4,0);
-S10(9,4,0);
-S14(9,4,0);
-S20(9,4,0);
-for (k=0;k<=1;k++) {
-  S23(9,4,k);
-}
-S13(9,4,2);
-S21(9,4,2);
-S23(9,4,2);
-S24(9,4,2);
-S13(9,4,3);
-S16(9,4,3);
-S17(9,4,3);
-S24(9,4,3);
-S13(9,4,4);
-for (k=4;k<=5;k++) {
-  S15(9,4,k);
-  S18(9,4,k);
-}
-for (k=0;k<=1;k++) {
-  S23(9,5,k);
-}
-S13(9,5,2);
-S21(9,5,2);
-S22(9,5,2);
-S23(9,5,2);
-S24(9,5,2);
-S13(9,5,3);
-S16(9,5,3);
-S17(9,5,3);
-S24(9,5,3);
-S13(9,5,4);
-for (k=4;k<=5;k++) {
-  S15(9,5,k);
-}
-for (k=0;k<=1;k++) {
-  S23(9,6,k);
-}
-S11(9,6,2);
-S21(9,6,2);
-S22(9,6,2);
-S23(9,6,2);
-S24(9,6,2);
-S11(9,6,3);
-S16(9,6,3);
-S17(9,6,3);
-S24(9,6,3);
-S11(9,6,4);
-for (k=0;k<=1;k++) {
-  S23(9,7,k);
-}
-S12(9,7,2);
-S21(9,7,2);
-S22(9,7,2);
-S23(9,7,2);
-S24(9,7,2);
-S12(9,7,3);
-S16(9,7,3);
-S17(9,7,3);
-S24(9,7,3);
-S12(9,7,4);
-for (k=0;k<=1;k++) {
-  S23(9,8,k);
-}
-S21(9,8,2);
-S22(9,8,2);
-S23(9,8,2);
-for (k=2;k<=3;k++) {
-  S24(9,8,k);
-}
-S22(9,9,2);
-for (j=1;j<=3;j++) {
-  S19(10,j,0);
-  S26(10,j,3);
-  S15(10,j,4);
-  S18(10,j,4);
-  S25(10,j,4);
-  for (k=5;k<=6;k++) {
-    S15(10,j,k);
-    S18(10,j,k);
-  }
-}
-for (k=-4;k<=-3;k++) {
-  S20(10,4,k);
-}
-for (k=-2;k<=-1;k++) {
-  S14(10,4,k);
-  S20(10,4,k);
-}
-S9(10,4,0);
-S10(10,4,0);
-S14(10,4,0);
-S19(10,4,0);
-S20(10,4,0);
-S13(10,4,3);
-S21(10,4,3);
-S24(10,4,3);
-S26(10,4,3);
-S13(10,4,4);
-S15(10,4,4);
-S16(10,4,4);
-S17(10,4,4);
-S18(10,4,4);
-S25(10,4,4);
-for (k=5;k<=6;k++) {
-  S15(10,4,k);
-  S18(10,4,k);
-}
-S13(10,5,3);
-S21(10,5,3);
-S22(10,5,3);
-S24(10,5,3);
-S26(10,5,3);
-S13(10,5,4);
-S15(10,5,4);
-S16(10,5,4);
-S17(10,5,4);
-S18(10,5,4);
-S25(10,5,4);
-for (k=5;k<=6;k++) {
-  S15(10,5,k);
-  S18(10,5,k);
-}
-S13(10,6,3);
-S21(10,6,3);
-S22(10,6,3);
-S24(10,6,3);
-S13(10,6,4);
-S16(10,6,4);
-S17(10,6,4);
-S11(10,7,3);
-S21(10,7,3);
-S22(10,7,3);
-S24(10,7,3);
-S11(10,7,4);
-S16(10,7,4);
-S17(10,7,4);
-S12(10,8,3);
-S21(10,8,3);
-S22(10,8,3);
-S24(10,8,3);
-S12(10,8,4);
-S16(10,8,4);
-S17(10,8,4);
-S22(10,9,3);
-for (i=11;i<=14;i++) {
-  for (j=1;j<=5;j++) {
-    S26(i,j,3);
-    S25(i,j,4);
-  }
-}
diff --git a/cloog-0.16.3/test/non_optimal/usvd_e_t.cloog b/cloog-0.16.3/test/non_optimal/usvd_e_t.cloog
deleted file mode 100644
index a8d8510..0000000
--- a/cloog-0.16.3/test/non_optimal/usvd_e_t.cloog
+++ /dev/null
@@ -1,240 +0,0 @@
-# language: C
-c
-
-# Context
-0 2
-
-0 # parameter names
-
-26 # Number of statements
-
-1
-4 5
-#          i      j      k      1
-    0      0      1      0      0  
-    0      0      0      1      0  
-    1      1      0      0      0  
-    1     -1      0      0      4  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    0      0      0      1      0  
-    1      1      0      0      0  
-    1     -1      0      0      4  
-    1      0      1      0      0  
-    1      0     -1      0      4  
-0 0 0
-1
-4 5
-#          i      j      k      1
-    0      0      1      0      0  
-    0      0      0      1      0  
-    1      1      0      0     -4  
-    1     -1      0      0      8  
-0 0 0
-1
-4 5
-#          i      j      k      1
-    0      0      0      1      1  
-    1     -1      0      0      8  
-    1      0      1      0     -1  
-    1      1     -1      0     -4  
-0 0 0
-1
-4 5
-#          i      j      k      1
-    0      0      0      1      0  
-    1      1      0      0     -4  
-    1      0     -1      0      4  
-    1     -1      1      0      4  
-0 0 0
-1
-4 5
-#          i      j      k      1
-    0      0      0      1      0  
-    1     -1      0      0      8  
-    1      0      1      0      4  
-    1      1     -1      0     -9  
-0 0 0
-1
-4 5
-#          i      j      k      1
-    0      0      0      1      0  
-    1      1      0      0     -5  
-    1      0     -1      0      0  
-    1     -1      1      0      9  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    0      0      0      1      0  
-    1      1      0      0     -3  
-    1     -1      0      0      7  
-    1      0      1      0     -7  
-    1      0     -1      0     11  
-0 0 0
-1
-4 5
-#          i      j      k      1
-    0      0      1      0     -4  
-    0      0      0      1      0  
-    1      1      0      0     -7  
-    1     -1      0      0     10  
-0 0 0
-1
-4 5
-#          i      j      k      1
-    0      0      1      0     -4  
-    0      0      0      1      0  
-    1      1      0      0     -7  
-    1     -1      0      0     10  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    0      1     -1      0     -3  
-    1      0     -1      0      7  
-    1      0      1      0     -4  
-    1      0      0     -1      4  
-    1      0     -1      1      4  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    0      1     -1      0     -2  
-    1      0      1      0     -5  
-    1      0     -1      0      8  
-    1      0      0     -1      4  
-    1      0     -1      1      5  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    1     -1      0      0     10  
-    1      0      1      0     -4  
-    1      0      0     -1      4  
-    1     -1      0      1      7  
-    1      1     -1      0     -4  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    1      1      0      0     -8  
-    1      0     -1      0      4  
-    1      0      0     -1      0  
-    1     -1      0      1     12  
-    1     -1      1      0      6  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    1     -1      0      0     10  
-    1      0      1      0     -1  
-    1      0     -1      0      5  
-    1      0      0      1     -4  
-    1      1      0     -1     -4  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    0      1      0     -1     -6  
-    1      0      0     -1      4  
-    1      0      1      0     -4  
-    1      0      0      1     -1  
-    1      0     -1      1      4  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    0      1      0     -1     -6  
-    1      0      0      1     -1  
-    1      0      1      0     -4  
-    1      0      0     -1      4  
-    1      0     -1      1      4  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    1     -1      0      0     10  
-    1      0      1      0     -1  
-    1      0      0      1     -4  
-    1      1      0     -1     -4  
-    1      1     -1      0     -5  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    1      1      0      0     -8  
-    1      0      1      0     -1  
-    1      0      0     -1      0  
-    1     -1      0      1     10  
-    1      1     -1      0     -6  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    1      1      0      0     -8  
-    1      0     -1      0      4  
-    1      0      0      1      4  
-    1      0      0     -1      0  
-    1     -1      1      0      6  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    0      1      0     -1     -7  
-    1      0      0     -1      3  
-    1      0      1      0     -4  
-    1      0     -1      0      8  
-    1      0      0      1      0  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    0      1      0     -1     -7  
-    1      0      0      1      0  
-    1      0      1      0     -5  
-    1      0     -1      0      9  
-    1      0      0     -1      3  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    1     -1      0      0      9  
-    1      0      1      0     -4  
-    1      0     -1      0      8  
-    1      0      0      1      0  
-    1      1      0     -1     -7  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    1      1      0      0     -8  
-    1      0      1      0     -4  
-    1      0     -1      0      8  
-    1      0      0     -1      3  
-    1     -1      0      1      7  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    0      0      0      1     -4  
-    1      1      0      0    -10  
-    1     -1      0      0     14  
-    1      0      1      0     -1  
-    1      0     -1      0      5  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    0      0      0      1     -3  
-    1      1      0      0    -10  
-    1     -1      0      0     14  
-    1      0      1      0     -1  
-    1      0     -1      0      5  
-0 0 0
-0 # iterator names
-0 # scattering functions
-0 # scattering dimension names
-
diff --git a/cloog-0.16.3/test/non_optimal/usvd_e_t.good.c b/cloog-0.16.3/test/non_optimal/usvd_e_t.good.c
deleted file mode 100644
index f54c11c..0000000
--- a/cloog-0.16.3/test/non_optimal/usvd_e_t.good.c
+++ /dev/null
@@ -1,429 +0,0 @@
-/* Generated from ../../../git/cloog/test/./non_optimal/usvd_e_t.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.36s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-#define S3(i,j,k) { hash(3); hash(i); hash(j); hash(k); }
-#define S4(i,j,k) { hash(4); hash(i); hash(j); hash(k); }
-#define S5(i,j,k) { hash(5); hash(i); hash(j); hash(k); }
-#define S6(i,j,k) { hash(6); hash(i); hash(j); hash(k); }
-#define S7(i,j,k) { hash(7); hash(i); hash(j); hash(k); }
-#define S8(i,j,k) { hash(8); hash(i); hash(j); hash(k); }
-#define S9(i,j,k) { hash(9); hash(i); hash(j); hash(k); }
-#define S10(i,j,k) { hash(10); hash(i); hash(j); hash(k); }
-#define S11(i,j,k) { hash(11); hash(i); hash(j); hash(k); }
-#define S12(i,j,k) { hash(12); hash(i); hash(j); hash(k); }
-#define S13(i,j,k) { hash(13); hash(i); hash(j); hash(k); }
-#define S14(i,j,k) { hash(14); hash(i); hash(j); hash(k); }
-#define S15(i,j,k) { hash(15); hash(i); hash(j); hash(k); }
-#define S16(i,j,k) { hash(16); hash(i); hash(j); hash(k); }
-#define S17(i,j,k) { hash(17); hash(i); hash(j); hash(k); }
-#define S18(i,j,k) { hash(18); hash(i); hash(j); hash(k); }
-#define S19(i,j,k) { hash(19); hash(i); hash(j); hash(k); }
-#define S20(i,j,k) { hash(20); hash(i); hash(j); hash(k); }
-#define S21(i,j,k) { hash(21); hash(i); hash(j); hash(k); }
-#define S22(i,j,k) { hash(22); hash(i); hash(j); hash(k); }
-#define S23(i,j,k) { hash(23); hash(i); hash(j); hash(k); }
-#define S24(i,j,k) { hash(24); hash(i); hash(j); hash(k); }
-#define S25(i,j,k) { hash(25); hash(i); hash(j); hash(k); }
-#define S26(i,j,k) { hash(26); hash(i); hash(j); hash(k); }
-
-void test()
-{
-  /* Original iterators. */
-  int i, j, k;
-  for (i=0;i<=2;i++) {
-    S1(i,0,0) ;
-    S2(i,0,0) ;
-    for (j=1;j<=4;j++) {
-      S2(i,j,0) ;
-    }
-  }
-  S1(3,0,0) ;
-  S2(3,0,0) ;
-  for (j=1;j<=4;j++) {
-    S2(3,j,0) ;
-  }
-  for (j=7;j<=11;j++) {
-    S8(3,j,0) ;
-  }
-  S1(4,0,0) ;
-  S2(4,0,0) ;
-  S3(4,0,0) ;
-  S5(4,0,0) ;
-  for (j=1;j<=4;j++) {
-    S2(4,j,0) ;
-    S5(4,j,0) ;
-  }
-  for (j=7;j<=11;j++) {
-    S8(4,j,0) ;
-  }
-  S6(5,-4,0) ;
-  S7(5,-4,0) ;
-  for (j=-3;j<=-1;j++) {
-    S7(5,j,0) ;
-  }
-  S3(5,0,0) ;
-  S7(5,0,0) ;
-  S4(5,1,-1) ;
-  S5(5,1,0) ;
-  for (j=2;j<=4;j++) {
-    S5(5,j,0) ;
-  }
-  for (j=7;j<=11;j++) {
-    S8(5,j,0) ;
-  }
-  S6(6,-4,0) ;
-  S6(6,-3,0) ;
-  S7(6,-3,0) ;
-  for (j=-2;j<=-1;j++) {
-    S7(6,j,0) ;
-  }
-  S3(6,0,0) ;
-  S7(6,0,0) ;
-  S4(6,1,-1) ;
-  S4(6,2,-1) ;
-  S5(6,2,0) ;
-  for (j=3;j<=4;j++) {
-    S5(6,j,0) ;
-  }
-  for (j=7;j<=11;j++) {
-    S8(6,j,0) ;
-  }
-  for (j=-4;j<=-3;j++) {
-    S6(7,j,0) ;
-  }
-  S6(7,-2,0) ;
-  S7(7,-2,0) ;
-  S7(7,-1,0) ;
-  S3(7,0,0) ;
-  S7(7,0,0) ;
-  for (j=1;j<=2;j++) {
-    S4(7,j,-1) ;
-  }
-  S4(7,3,-1) ;
-  S5(7,3,0) ;
-  S5(7,4,0) ;
-  S9(7,4,0) ;
-  S10(7,4,0) ;
-  S11(7,4,0) ;
-  S21(7,4,0) ;
-  S23(7,4,0) ;
-  S11(7,4,1) ;
-  S16(7,4,1) ;
-  S17(7,4,1) ;
-  for (k=2;k<=4;k++) {
-    S11(7,4,k) ;
-  }
-  S12(7,5,0) ;
-  S21(7,5,0) ;
-  S22(7,5,0) ;
-  S23(7,5,0) ;
-  S12(7,5,1) ;
-  S16(7,5,1) ;
-  S17(7,5,1) ;
-  for (k=2;k<=4;k++) {
-    S12(7,5,k) ;
-  }
-  S21(7,6,0) ;
-  S22(7,6,0) ;
-  S23(7,6,0) ;
-  for (j=7;j<=8;j++) {
-    S8(7,j,0) ;
-    S21(7,j,0) ;
-    S22(7,j,0) ;
-    S23(7,j,0) ;
-  }
-  S8(7,9,0) ;
-  S22(7,9,0) ;
-  for (j=10;j<=11;j++) {
-    S8(7,j,0) ;
-  }
-  for (j=-4;j<=-2;j++) {
-    S6(8,j,0) ;
-  }
-  S6(8,-1,0) ;
-  S7(8,-1,0) ;
-  S3(8,0,0) ;
-  S7(8,0,0) ;
-  S19(8,1,-2) ;
-  S4(8,1,-1) ;
-  S19(8,1,-1) ;
-  S19(8,1,0) ;
-  S15(8,1,4) ;
-  S18(8,1,4) ;
-  for (k=-4;k<=-3;k++) {
-    S14(8,2,k) ;
-    S20(8,2,k) ;
-  }
-  S14(8,2,-2) ;
-  S19(8,2,-2) ;
-  S20(8,2,-2) ;
-  S4(8,2,-1) ;
-  S14(8,2,-1) ;
-  S19(8,2,-1) ;
-  S20(8,2,-1) ;
-  S14(8,2,0) ;
-  S19(8,2,0) ;
-  S20(8,2,0) ;
-  S15(8,2,4) ;
-  S18(8,2,4) ;
-  for (k=-4;k<=-2;k++) {
-    S14(8,3,k) ;
-    S20(8,3,k) ;
-  }
-  S4(8,3,-1) ;
-  S14(8,3,-1) ;
-  S20(8,3,-1) ;
-  S14(8,3,0) ;
-  S20(8,3,0) ;
-  S15(8,3,4) ;
-  S18(8,3,4) ;
-  for (k=-4;k<=-2;k++) {
-    S14(8,4,k) ;
-    S20(8,4,k) ;
-  }
-  S4(8,4,-1) ;
-  S14(8,4,-1) ;
-  S20(8,4,-1) ;
-  S5(8,4,0) ;
-  S9(8,4,0) ;
-  S10(8,4,0) ;
-  S14(8,4,0) ;
-  S20(8,4,0) ;
-  S23(8,4,0) ;
-  S13(8,4,1) ;
-  S21(8,4,1) ;
-  S23(8,4,1) ;
-  S24(8,4,1) ;
-  S13(8,4,2) ;
-  S16(8,4,2) ;
-  S17(8,4,2) ;
-  S24(8,4,2) ;
-  S13(8,4,3) ;
-  S24(8,4,3) ;
-  S13(8,4,4) ;
-  S15(8,4,4) ;
-  S23(8,5,0) ;
-  S11(8,5,1) ;
-  S21(8,5,1) ;
-  S22(8,5,1) ;
-  S23(8,5,1) ;
-  S24(8,5,1) ;
-  S11(8,5,2) ;
-  S16(8,5,2) ;
-  S17(8,5,2) ;
-  S24(8,5,2) ;
-  S11(8,5,3) ;
-  S24(8,5,3) ;
-  S11(8,5,4) ;
-  S15(8,5,4) ;
-  S23(8,6,0) ;
-  S12(8,6,1) ;
-  S21(8,6,1) ;
-  S22(8,6,1) ;
-  S23(8,6,1) ;
-  S24(8,6,1) ;
-  S12(8,6,2) ;
-  S16(8,6,2) ;
-  S17(8,6,2) ;
-  S24(8,6,2) ;
-  S12(8,6,3) ;
-  S24(8,6,3) ;
-  S12(8,6,4) ;
-  for (j=7;j<=8;j++) {
-    S23(8,j,0) ;
-    S21(8,j,1) ;
-    S22(8,j,1) ;
-    S23(8,j,1) ;
-    S24(8,j,1) ;
-    for (k=2;k<=3;k++) {
-      S24(8,j,k) ;
-    }
-  }
-  S22(8,9,1) ;
-  S7(9,0,0) ;
-  for (j=1;j<=2;j++) {
-    for (k=-1;k<=0;k++) {
-      S19(9,j,k) ;
-    }
-    for (k=4;k<=5;k++) {
-      S15(9,j,k) ;
-      S18(9,j,k) ;
-    }
-  }
-  S20(9,3,-4) ;
-  for (k=-3;k<=-2;k++) {
-    S14(9,3,k) ;
-    S20(9,3,k) ;
-  }
-  for (k=-1;k<=0;k++) {
-    S14(9,3,k) ;
-    S19(9,3,k) ;
-    S20(9,3,k) ;
-  }
-  for (k=4;k<=5;k++) {
-    S15(9,3,k) ;
-    S18(9,3,k) ;
-  }
-  S20(9,4,-4) ;
-  for (k=-3;k<=-1;k++) {
-    S14(9,4,k) ;
-    S20(9,4,k) ;
-  }
-  S9(9,4,0) ;
-  S10(9,4,0) ;
-  S14(9,4,0) ;
-  S20(9,4,0) ;
-  S23(9,4,0) ;
-  S23(9,4,1) ;
-  S13(9,4,2) ;
-  S21(9,4,2) ;
-  S23(9,4,2) ;
-  S24(9,4,2) ;
-  S13(9,4,3) ;
-  S16(9,4,3) ;
-  S17(9,4,3) ;
-  S24(9,4,3) ;
-  S13(9,4,4) ;
-  S15(9,4,4) ;
-  S18(9,4,4) ;
-  S15(9,4,5) ;
-  S18(9,4,5) ;
-  for (k=0;k<=1;k++) {
-    S23(9,5,k) ;
-  }
-  S13(9,5,2) ;
-  S21(9,5,2) ;
-  S22(9,5,2) ;
-  S23(9,5,2) ;
-  S24(9,5,2) ;
-  S13(9,5,3) ;
-  S16(9,5,3) ;
-  S17(9,5,3) ;
-  S24(9,5,3) ;
-  S13(9,5,4) ;
-  S15(9,5,4) ;
-  S15(9,5,5) ;
-  for (k=0;k<=1;k++) {
-    S23(9,6,k) ;
-  }
-  S11(9,6,2) ;
-  S21(9,6,2) ;
-  S22(9,6,2) ;
-  S23(9,6,2) ;
-  S24(9,6,2) ;
-  S11(9,6,3) ;
-  S16(9,6,3) ;
-  S17(9,6,3) ;
-  S24(9,6,3) ;
-  S11(9,6,4) ;
-  for (k=0;k<=1;k++) {
-    S23(9,7,k) ;
-  }
-  S12(9,7,2) ;
-  S21(9,7,2) ;
-  S22(9,7,2) ;
-  S23(9,7,2) ;
-  S24(9,7,2) ;
-  S12(9,7,3) ;
-  S16(9,7,3) ;
-  S17(9,7,3) ;
-  S24(9,7,3) ;
-  S12(9,7,4) ;
-  for (k=0;k<=1;k++) {
-    S23(9,8,k) ;
-  }
-  S21(9,8,2) ;
-  S22(9,8,2) ;
-  S23(9,8,2) ;
-  S24(9,8,2) ;
-  S24(9,8,3) ;
-  S22(9,9,2) ;
-  for (j=1;j<=3;j++) {
-    S19(10,j,0) ;
-    S26(10,j,3) ;
-    S15(10,j,4) ;
-    S18(10,j,4) ;
-    S25(10,j,4) ;
-    for (k=5;k<=6;k++) {
-      S15(10,j,k) ;
-      S18(10,j,k) ;
-    }
-  }
-  for (k=-4;k<=-3;k++) {
-    S20(10,4,k) ;
-  }
-  for (k=-2;k<=-1;k++) {
-    S14(10,4,k) ;
-    S20(10,4,k) ;
-  }
-  S9(10,4,0) ;
-  S10(10,4,0) ;
-  S14(10,4,0) ;
-  S19(10,4,0) ;
-  S20(10,4,0) ;
-  S13(10,4,3) ;
-  S21(10,4,3) ;
-  S24(10,4,3) ;
-  S26(10,4,3) ;
-  S13(10,4,4) ;
-  S15(10,4,4) ;
-  S16(10,4,4) ;
-  S17(10,4,4) ;
-  S18(10,4,4) ;
-  S25(10,4,4) ;
-  for (k=5;k<=6;k++) {
-    S15(10,4,k) ;
-    S18(10,4,k) ;
-  }
-  S13(10,5,3) ;
-  S21(10,5,3) ;
-  S22(10,5,3) ;
-  S24(10,5,3) ;
-  S26(10,5,3) ;
-  S13(10,5,4) ;
-  S15(10,5,4) ;
-  S16(10,5,4) ;
-  S17(10,5,4) ;
-  S18(10,5,4) ;
-  S25(10,5,4) ;
-  for (k=5;k<=6;k++) {
-    S15(10,5,k) ;
-    S18(10,5,k) ;
-  }
-  S13(10,6,3) ;
-  S21(10,6,3) ;
-  S22(10,6,3) ;
-  S24(10,6,3) ;
-  S13(10,6,4) ;
-  S16(10,6,4) ;
-  S17(10,6,4) ;
-  S11(10,7,3) ;
-  S21(10,7,3) ;
-  S22(10,7,3) ;
-  S24(10,7,3) ;
-  S11(10,7,4) ;
-  S16(10,7,4) ;
-  S17(10,7,4) ;
-  S12(10,8,3) ;
-  S21(10,8,3) ;
-  S22(10,8,3) ;
-  S24(10,8,3) ;
-  S12(10,8,4) ;
-  S16(10,8,4) ;
-  S17(10,8,4) ;
-  S22(10,9,3) ;
-  for (i=11;i<=14;i++) {
-    for (j=1;j<=5;j++) {
-      S26(i,j,3) ;
-      S25(i,j,4) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/non_optimal/youcef.c b/cloog-0.16.3/test/non_optimal/youcef.c
deleted file mode 100644
index 386cea2..0000000
--- a/cloog-0.16.3/test/non_optimal/youcef.c
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Generated from ../../../git/cloog/test/non_optimal/youcef.cloog by CLooG 0.14.0-238-gb1cb779 gmp bits in 0.00s. */
-for (i=0;i<=5;i++) {
-  S1(i,i);
-  for (j=i;j<=5;j++) {
-    S2(i,j);
-  }
-  S3(i,5);
-}
diff --git a/cloog-0.16.3/test/non_optimal/youcef.cloog b/cloog-0.16.3/test/non_optimal/youcef.cloog
deleted file mode 100644
index 297bf79..0000000
--- a/cloog-0.16.3/test/non_optimal/youcef.cloog
+++ /dev/null
@@ -1,46 +0,0 @@
-# Optimal code is in fact :
-# 
-# for (i=0;i<=M;i++) {
-#   S1 ;
-#   for (j=0;j<=N;j++) {
-#     S2 ;
-#   }
-#   S3 ;
-# }
-
-# language: C
-c
-
-# parameters {M, N | M>=1 N >=1}
-0 2
-0
-
-3 # Number of statements
-
-1
-# {i | 0<=i<=5 i==j}
-3 4
-1  1  0  0
-1 -1  0  5
-0  1 -1  0
-0  0  0
-
-1
-# {i | 0<=i<=5 i<=j<=5}
-4 4
-1  1  0  0
-1 -1  0  5
-1 -1  1  0
-1  0 -1  5
-0  0  0
-
-1
-# {i | 0<=i<=5 j==5}
-3 4
-1  1  0  0
-1 -1  0  5
-0  0  1 -5
-0  0  0
-0
- 
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/non_optimal/youcef.good.c b/cloog-0.16.3/test/non_optimal/youcef.good.c
deleted file mode 100644
index 9fe1d31..0000000
--- a/cloog-0.16.3/test/non_optimal/youcef.good.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Generated from ../../../git/cloog/test/./non_optimal/youcef.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-
-void test()
-{
-  /* Original iterators. */
-  int i, j;
-  for (i=0;i<=3;i++) {
-    S1(i,i) ;
-    S2(i,i) ;
-    for (j=i+1;j<=4;j++) {
-      S2(i,j) ;
-    }
-    S2(i,5) ;
-    S3(i,5) ;
-  }
-  S1(4,4) ;
-  S2(4,4) ;
-  S2(4,5) ;
-  S3(4,5) ;
-  S1(5,5) ;
-  S2(5,5) ;
-  S3(5,5) ;
-}
diff --git a/cloog-0.16.3/test/nul_basic1.c b/cloog-0.16.3/test/nul_basic1.c
deleted file mode 100644
index d6b0cf0..0000000
--- a/cloog-0.16.3/test/nul_basic1.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/nul_basic1.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-if (M >= 0) {
-  for (i=0;i<=M;i+=2) {
-    S1(i,i/2) ;
-  }
-}
diff --git a/cloog-0.16.3/test/nul_basic1.cloog b/cloog-0.16.3/test/nul_basic1.cloog
deleted file mode 100644
index 878bd89..0000000
--- a/cloog-0.16.3/test/nul_basic1.cloog
+++ /dev/null
@@ -1,28 +0,0 @@
-# Optimal code is in fact :
-#
-# for (i=0;i<=M;i+=2) {
-#   S1 ;
-# }
- 
-# language: C
-c
-
-# parameter n
-1 3
-#  n  1
-1  0  1
-0
-
-1 # Number of statements
-
-1
-# {i, j | i=2*j; 0<=i<=n}
-3 5
-#  i  j  n  1
-0  1 -2  0  0
-1  1  0  0  0
-1 -1  0  1  0
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/nul_basic2.c b/cloog-0.16.3/test/nul_basic2.c
deleted file mode 100644
index 6231f0e..0000000
--- a/cloog-0.16.3/test/nul_basic2.c
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Generated from ../../../git/cloog/test/nul_basic2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (i=2;i<=n;i+=2) {
-  if (i%4 == 0) {
-    S2(i,i/4) ;
-  }
-  S1(i,i/2) ;
-}
diff --git a/cloog-0.16.3/test/nul_basic2.cloog b/cloog-0.16.3/test/nul_basic2.cloog
deleted file mode 100644
index bf3c78c..0000000
--- a/cloog-0.16.3/test/nul_basic2.cloog
+++ /dev/null
@@ -1,54 +0,0 @@
-# Optimal code is in fact :
-#
-# for (i=0;i<=M;i+=2) {
-#   S1 ;
-# }
- 
-# language: C
-c
-
-# parameter n
-1 3
-#  n  1
-1  1 -2
-1
-n
-
-2 # Number of statements
-
-1
-# {i, j | i=2*j; 1<=i<=n}
-3 5
-#  i  j  n  1
-0  1 -2  0  0
-1  1  0  0 -1
-1 -1  0  1  0
-0  0  0
-
-1
-# {i, j | i=4*j; 1<=i<=n}
-3 5
-#  i  j  n  1
-0  1 -4  0  0
-1  1  0  0 -1
-1 -1  0  1  0
-0  0  0
-0
-
-0 # Scattering functions
-5 10
-# t1 t2 t3 t4 t5  i  j  n  1
-0  1  0  0  0  0  0  0  0  0
-0  0  1  0  0  0 -1  0  0  0
-0  0  0  1  0  0  0  0  0  0
-0  0  0  0  1  0  0 -1  0  0
-0  0  0  0  0  1  0  0  0  0
-
-5 10
-# t1 t2 t3 t4 t5  i  j  n  1
-0  1  0  0  0  0  0  0  0  0
-0  0  1  0  0  0 -1  0  0  0
-0  0  0  1  0  0  0  0  0  0
-0  0  0  0  1  0  0 -1  0  0
-0  0  0  0  0  1  0  0  0  0
-0
diff --git a/cloog-0.16.3/test/nul_lcpc.c b/cloog-0.16.3/test/nul_lcpc.c
deleted file mode 100644
index b9592f5..0000000
--- a/cloog-0.16.3/test/nul_lcpc.c
+++ /dev/null
@@ -1,15 +0,0 @@
-/* Generated from ../../../git/cloog/test/nul_lcpc.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.03s. */
-for (i=1;i<=6;i+=2) {
-  for (j=1;j<=i;j++) {
-    S1(i,(i-1)/2,j) ;
-    S2(i,(i-1)/2,j) ;
-  }
-  for (j=i+1;j<=p;j++) {
-    S1(i,(i-1)/2,j) ;
-  }
-}
-for (i=7;i<=m;i+=2) {
-  for (j=1;j<=p;j++) {
-    S1(i,(i-1)/2,j) ;
-  }
-}
diff --git a/cloog-0.16.3/test/nul_lcpc.cloog b/cloog-0.16.3/test/nul_lcpc.cloog
deleted file mode 100644
index 263e1ea..0000000
--- a/cloog-0.16.3/test/nul_lcpc.cloog
+++ /dev/null
@@ -1,39 +0,0 @@
-# language: C
-c
-
-# parameter n
-3 5
-#  m  n  p  1
-1  1 -1  0 -1
-1  0 -1  1 -1
-0  0  1  0 -6
-1
-m n p
-
-2 # Number of statements
-
-1
-# {i, j, k | i=2*k+1; 1<=i<=m;  1<=j<=p}
-5 8
-#  i  k  j  m  n  p  1
-0  1 -2  0  0  0  0 -1 # i=2*k+1
-1  1  0  0  0  0  0 -1 # 1<=i
-1 -1  0  0  1  0  0  0 # i<=m
-1  0  0  1  0  0  0 -1 # 1<=j
-1  0  0 -1  0  0  1  0 # j<=p
-0  0  0
-
-1
-# {i, j, k | i=2*k+1; 1<=i<=n;  1<=j<=i}
-5 8
-#  i  k  j  m  n  p  1
-0  1 -2  0  0  0  0 -1 # i=2*k+1
-1  1  0  0  0  0  0 -1 # 1<=i
-1 -1  0  0  0  1  0  0 # i<=n
-1  0  0  1  0  0  0 -1 # 1<=j
-1  1  0 -1  0  0  0  0 # j<=i
-0  0  0
-1
-i k j
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/orc.c b/cloog-0.16.3/test/orc.c
deleted file mode 100644
index 7ed1547..0000000
--- a/cloog-0.16.3/test/orc.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Generated from ../../../git/cloog/test/orc.cloog by CLooG 0.16.2-5-g590827b gmp bits in 0.03s. */
-S1(0);
-S2(0,0);
-for (p2=1;p2<=22;p2++) {
-  if ((p2+1)%2 == 0) {
-    S3(0,(p2-1)/2);
-  }
-  if (p2%2 == 0) {
-    S2(0,p2/2);
-  }
-}
-S3(0,11);
-for (p1=2;p1<=6;p1++) {
-  if ((p1+1)%3 == 0) {
-    S4((p1-2)/3);
-  }
-  if (p1%3 == 0) {
-    S1(p1/3);
-  }
-  if (p1 == 4) {
-    S2(1,0);
-  }
-  if (p1 == 4) {
-    for (p2=1;p2<=20;p2++) {
-      if ((p2+1)%2 == 0) {
-        S3(1,(p2-1)/2);
-      }
-      if (p2%2 == 0) {
-        S2(1,p2/2);
-      }
-    }
-  }
-  if (p1 == 4) {
-    S3(1,10);
-  }
-}
-S2(2,0);
-for (p2=1;p2<=18;p2++) {
-  if ((p2+1)%2 == 0) {
-    S3(2,(p2-1)/2);
-  }
-  if (p2%2 == 0) {
-    S2(2,p2/2);
-  }
-}
-S3(2,9);
-S4(2);
-S5(0);
-for (p2=0;p2<=9;p2++) {
-  S6(0,p2);
-}
-for (p1=2;p1<=42;p1++) {
-  if ((p1+1)%3 == 0) {
-    S7((p1-2)/3);
-  }
-  if (p1%3 == 0) {
-    S5(p1/3);
-  }
-  for (p2=0;p2<=9;p2++) {
-    if ((p1+2)%3 == 0) {
-      S6((p1-1)/3,p2);
-    }
-  }
-}
-for (p2=0;p2<=9;p2++) {
-  S6(14,p2);
-}
-S7(14);
diff --git a/cloog-0.16.3/test/orc.cloog b/cloog-0.16.3/test/orc.cloog
deleted file mode 100644
index 18c7cf2..0000000
--- a/cloog-0.16.3/test/orc.cloog
+++ /dev/null
@@ -1,133 +0,0 @@
-
-
-#-------------------CONTEXT------------------------
-   c # language is c
-   # Context (no constarints on parameters)
-   1 2		# 1 lines and 2 coloumns
-   #   1
-   1   0
-
-   1 # We want to set manually the parameter names
-
-#---------------------STATEMENTS--------------------
-   7 #Number of Statements
-
-   1 #STMT 1 at line no. 12 has 1 domain
-
-   # Domain 1
-   2 3
-   #   i   1
-   1   1   0
-   1  -1   2
-0 0 0
-   1 #STMT 2 at line no. 15 has 1 domain
-
-   # Domain 1
-   4 4
-   #   i   j   1
-   1   1   0   0
-   1  -1   0   2
-   1   0   1   0
-   1  -1  -1  11
-0  0 0
-   1 #STMT 3 at line no. 16 has 1 domain
-
-   # Domain 1
-   4 4
-   #   i   j   1
-   1   1   0   0
-   1  -1   0   2
-   1   0   1   0
-   1  -1  -1  11
-0 0 0
-   1 #STMT 4 at line no. 20 has 1 domain
-
-   # Domain 1
-   2 3
-   #   i   1
-   1   1   0
-   1  -1   2
-0 0 0
-   1 #STMT 1 at line no. 32 has 1 domain
-
-   # Domain 1
-   2 3
-   #   l   1
-   1   1   0
-   1  -1  14
-0 0 0
-   1 #STMT 2 at line no. 37 has 1 domain
-
-   # Domain 1
-   4 4
-   #   l   m   1
-   1   1   0   0
-   1  -1   0  14
-   1   0   1   0
-   1   0  -1   9
-0 0 0
-   1 #STMT 3 at line no. 41 has 1 domain
-
-   # Domain 1
-   2 3
-   #   l   1
-   1   1   0
-   1  -1  14
-0 0 0
-   1 # Set Iterator Names
-   i   j	#Iterator Names
-
-#---------------------SCATTERING FUNCTIONS--------------------
-   7 #Scattering functions
-
-# Scattering Matrix for stmt at line no.12
-   3 6
-   #  p0  p1  p2   i   1
-   0   1   0   0   0   0
-   0   0   1   0  -3   0
-   0   0   0   1   0   0
-
-# Scattering Matrix for stmt at line no.15
-   3 7
-   #  p0  p1  p2   i   j   1
-   0   1   0   0   0   0   0
-   0   0   1   0  -3   0  -1
-   0   0   0   1   0  -2   0
-
-# Scattering Matrix for stmt at line no.16
-   3 7
-   #  p0  p1  p2   i   j   1
-   0   1   0   0   0   0   0
-   0   0   1   0  -3   0  -1
-   0   0   0   1   0  -2  -1
-
-# Scattering Matrix for stmt at line no.20
-   3 6
-   #  p0  p1  p2   i   1
-   0   1   0   0   0   0
-   0   0   1   0  -3  -2
-   0   0   0   1   0   0
-
-# Scattering Matrix for stmt at line no.32
-   3 6
-   #  p0  p1  p2   l   1
-   0   1   0   0   0  -2
-   0   0   1   0  -3   0
-   0   0   0   1   0   0
-
-# Scattering Matrix for stmt at line no.37
-   3 7
-   #  p0  p1  p2   l   m   1
-   0   1   0   0   0   0  -2
-   0   0   1   0  -3   0  -1
-   0   0   0   1   0  -1   0
-
-# Scattering Matrix for stmt at line no.41
-   3 6
-   #  p0  p1  p2   l   1
-   0   1   0   0   0  -2
-   0   0   1   0  -3  -2
-   0   0   0   1   0   0
-
-   1 # Set manually the scattering dimension names
-  p0  p1  p2	#Scattering dimension names
diff --git a/cloog-0.16.3/test/orc.good.c b/cloog-0.16.3/test/orc.good.c
deleted file mode 100644
index 2b2b7e7..0000000
--- a/cloog-0.16.3/test/orc.good.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/* Generated from ../../../git/cloog/test/orc.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.06s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-#define S4(i) { hash(4); hash(i); }
-#define S5(i) { hash(5); hash(i); }
-#define S6(i,j) { hash(6); hash(i); hash(j); }
-#define S7(i) { hash(7); hash(i); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int p1, p2;
-  /* Original iterators. */
-  int i, j;
-  S1(0) ;
-  S2(0,0) ;
-  for (p2=1;p2<=22;p2++) {
-    if ((p2+1)%2 == 0) {
-      j = (p2-1)/2 ;
-      S3(0,(p2-1)/2) ;
-    }
-    if (p2%2 == 0) {
-      S2(0,p2/2) ;
-    }
-  }
-  S3(0,11) ;
-  for (p1=2;p1<=6;p1++) {
-    if ((p1+1)%3 == 0) {
-      i = (p1-2)/3 ;
-      S4((p1-2)/3) ;
-    }
-    if ((p1+2)%3 == 0) {
-      i = (p1-1)/3 ;
-      S2((p1-1)/3,0) ;
-    }
-    if (p1%3 == 0) {
-      S1(p1/3) ;
-    }
-    for (p2=1;p2<=floord(-2*p1+68,3);p2++) {
-      if ((p1+2)%3 == 0) {
-        i = (p1-1)/3 ;
-        if ((p2+1)%2 == 0) {
-          j = (p2-1)/2 ;
-          S3((p1-1)/3,(p2-1)/2) ;
-        }
-        if (p2%2 == 0) {
-          S2((p1-1)/3,p2/2) ;
-        }
-      }
-    }
-    p2 = floord(-2*p1+71,3) ;
-    if ((p1+2)%3 == 0) {
-      i = (p1-1)/3 ;
-      if ((p2+1)%2 == 0) {
-        j = (p2-1)/2 ;
-        S3((p1-1)/3,(p2-1)/2) ;
-      }
-    }
-  }
-  S2(2,0) ;
-  for (p2=1;p2<=18;p2++) {
-    if ((p2+1)%2 == 0) {
-      j = (p2-1)/2 ;
-      S3(2,(p2-1)/2) ;
-    }
-    if (p2%2 == 0) {
-      S2(2,p2/2) ;
-    }
-  }
-  S3(2,9) ;
-  S4(2) ;
-  S5(0) ;
-  S6(0,0) ;
-  for (p2=1;p2<=9;p2++) {
-    S6(0,p2) ;
-  }
-  for (p1=2;p1<=42;p1++) {
-    if ((p1+1)%3 == 0) {
-      i = (p1-2)/3 ;
-      S7((p1-2)/3) ;
-    }
-    if ((p1+2)%3 == 0) {
-      i = (p1-1)/3 ;
-      S6((p1-1)/3,0) ;
-    }
-    if (p1%3 == 0) {
-      S5(p1/3) ;
-    }
-    for (p2=1;p2<=9;p2++) {
-      if ((p1+2)%3 == 0) {
-        i = (p1-1)/3 ;
-        S6((p1-1)/3,p2) ;
-      }
-    }
-  }
-  S6(14,0) ;
-  for (p2=1;p2<=9;p2++) {
-    S6(14,p2) ;
-  }
-  S7(14) ;
-}
diff --git a/cloog-0.16.3/test/otl.c b/cloog-0.16.3/test/otl.c
deleted file mode 100644
index 93bd830..0000000
--- a/cloog-0.16.3/test/otl.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Generated from ../../../git/cloog/test/otl.cloog by CLooG 0.14.0-278-gcf1f323 gmp bits in 0.26s. */
-if ((M >= 3) && (N >= 4)) {
-  for (outerTimeTileScatter=1;outerTimeTileScatter<=floord(2*M+2*N-7,5);outerTimeTileScatter++) {
-    for (outerProcTileScatter1=max(ceild(outerTimeTileScatter,2),ceild(5*outerTimeTileScatter-M-2,5));outerProcTileScatter1<=min(min(floord(M+2*N-5,5),floord(5*outerTimeTileScatter+2*N+1,10)),outerTimeTileScatter);outerProcTileScatter1++) {
-      for (outerProcTileScatter2=max(max(max(max(ceild(outerTimeTileScatter-outerProcTileScatter1-1,2),ceild(5*outerProcTileScatter1-N-1,5)),ceild(5*outerTimeTileScatter-M-N+1,5)),ceild(5*outerTimeTileScatter-N-2,10)),outerTimeTileScatter-outerProcTileScatter1-1);outerProcTileScatter2<=min(min(min(floord(M+N-2,5),floord(5*outerTimeTileScatter-5*outerProcTileScatter1+N+4,5)),floord(5*outerTimeTileScatter+N+3,10)),outerProcTileScatter1);outerProcTileScatter2++) {
-        for (innerTimeTileScatter=max(max(max(ceild(10*outerProcTileScatter1-2*N,5),ceild(10*outerProcTileScatter2-N-2,5)),ceild(5*outerProcTileScatter1+5*outerProcTileScatter2-N-3,5)),outerTimeTileScatter);innerTimeTileScatter<=min(min(min(min(min(floord(2*M+2*N-6,5),floord(5*outerProcTileScatter1+M+3,5)),floord(5*outerProcTileScatter2+M+N,5)),floord(10*outerProcTileScatter2+N+3,5)),outerTimeTileScatter+1),outerProcTileScatter1+outerProcTileScatter2+1);innerTimeTileScatter++) {
-          for (innerProcTileScatter1=max(max(max(max(ceild(innerTimeTileScatter,2),ceild(5*innerTimeTileScatter-M-2,5)),ceild(5*outerTimeTileScatter-M-1,5)),outerProcTileScatter1),outerTimeTileScatter-outerProcTileScatter2);innerProcTileScatter1<=min(min(min(min(min(min(min(floord(M+2*N-4,5),floord(5*outerProcTileScatter2+N+2,5)),floord(-5*outerProcTileScatter2+5*innerTimeTileScatter+N+4,5)),floord(5*outerTimeTileScatter-5*outerProcTileScatter2+N+5,5)),floord(5*innerTimeTileScatter+2*N+2,10)),floord(5*outerTimeTileScatter+2*N+3,10)),outerTimeTileScatter),outerProcTileScatter1+1);innerProcTileScatter1++) {
-            for (innerProcTileScatter2=outerProcTileScatter2;innerProcTileScatter2<=outerProcTileScatter2;innerProcTileScatter2++) {
-              for (outerTimeTileIter=outerTimeTileScatter;outerTimeTileIter<=outerTimeTileScatter;outerTimeTileIter++) {
-                for (outerProcTileIter1=outerProcTileScatter1;outerProcTileIter1<=outerProcTileScatter1;outerProcTileIter1++) {
-                  for (outerProcTileIter2=outerProcTileScatter2;outerProcTileIter2<=outerProcTileScatter2;outerProcTileIter2++) {
-                    for (innerTimeTileIter=innerTimeTileScatter;innerTimeTileIter<=innerTimeTileScatter;innerTimeTileIter++) {
-                      for (innerProcTileIter1=innerProcTileScatter1;innerProcTileIter1<=innerProcTileScatter1;innerProcTileIter1++) {
-                        for (innerProcTileIter2=outerProcTileScatter2;innerProcTileIter2<=outerProcTileScatter2;innerProcTileIter2++) {
-                          S1(outerTimeTileIter,outerProcTileIter1,outerProcTileIter2,innerTimeTileIter,innerProcTileIter1,innerProcTileIter2);
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/otl.cloog b/cloog-0.16.3/test/otl.cloog
deleted file mode 100644
index 5f9b783..0000000
--- a/cloog-0.16.3/test/otl.cloog
+++ /dev/null
@@ -1,117 +0,0 @@
-# created: Tue Mar 23 01:51:15 CET 2010
-# ---------------------- CONTEXT ----------------------
-c # language is C
-
-# Context
-2 4
- 1 1 0 -1
- 1 0 1 -1
-
-
-1 # set parameter names
-M N
-
-# --------------------- STATEMENTS --------------------
-1
-
-1 # domains per statement
-76 10
- 1 -5 0 0 0 0 0 2 2 -7
- 1 -20 0 0 0 20 20 0 0 16
- 1 -40 0 0 0 0 80 0 8 16
- 1 -4 4 0 0 0 4 0 0 4
- 1 -20 0 0 0 40 0 0 0 8
- 1 -20 0 20 0 20 0 0 0 16
- 1 -20 0 40 0 0 0 0 4 8
- 1 -20 40 0 0 0 0 0 0 16
- 1 -4 4 4 0 0 0 0 0 4
- 1 -20 0 0 0 0 20 4 4 -4
- 1 -10 0 0 0 10 0 2 0 2
- 1 -5 0 0 5 0 0 0 0 3
- 1 -5 5 0 0 0 0 1 0 2
- 1 -10 0 10 0 0 0 2 2 -2
- 1 0 -10 -10 10 0 0 0 2 6
- 1 20 -20 -20 0 0 0 0 4 16
- 1 0 -10 0 10 0 -10 0 2 6
- 1 40 -40 0 0 0 -40 0 8 32
- 1 0 -20 0 10 0 0 0 4 0
- 1 0 -10 0 0 0 0 2 4 -10
- 1 40 -80 0 0 0 0 0 16 8
- 1 0 -10 0 0 0 10 0 2 2
- 1 0 -5 0 0 5 0 0 0 3
- 1 0 -10 0 10 0 0 0 0 4
- 1 0 -5 5 0 0 0 0 1 1
- 1 20 -20 0 0 0 0 0 0 12
- 1 0 0 -10 10 -10 0 0 2 8
- 1 40 0 -40 0 -40 0 0 8 40
- 1 0 0 -20 10 0 0 0 2 4
- 1 0 0 -5 0 0 0 1 1 -2
- 1 40 0 -80 0 0 0 0 8 24
- 1 0 0 -5 0 0 5 0 0 4
- 1 0 0 -10 0 10 0 0 0 4
- 1 0 0 -10 10 0 0 0 0 2
- 1 0 5 -5 0 0 0 0 0 3
- 1 40 0 -40 0 0 0 0 0 16
- 1 0 0 0 -5 0 0 2 2 -6
- 1 0 0 0 -20 20 20 0 0 20
- 1 0 0 0 -40 0 80 0 8 24
- 1 0 20 0 -20 0 20 0 0 24
- 1 0 0 20 -20 20 0 0 0 20
- 1 0 0 0 -20 40 0 0 0 12
- 1 0 0 40 -20 0 0 0 4 12
- 1 0 40 0 -20 0 0 0 0 20
- 1 0 20 20 -20 0 0 0 0 24
- 1 0 0 0 -40 0 40 8 8 0
- 1 0 0 0 -20 20 0 4 0 8
- 1 0 0 20 -20 0 0 4 4 0
- 1 2 0 0 -2 0 0 0 0 2
- 1 0 10 0 -10 0 0 2 0 6
- 1 0 0 0 10 -10 -10 0 2 8
- 1 80 0 0 0 -80 -80 0 16 80
- 1 0 0 0 10 -20 0 0 4 4
- 1 0 0 0 0 -10 0 2 4 -8
- 1 120 0 0 0 -240 0 0 48 72
- 1 0 0 0 0 -20 20 0 4 8
- 1 0 0 0 10 -10 0 0 0 6
- 1 0 0 10 0 -10 0 0 2 4
- 1 0 1 0 0 -1 0 0 0 1
- 1 40 0 0 0 -40 0 0 0 32
- 1 0 0 0 10 0 -20 0 2 4
- 1 0 0 0 0 0 -5 1 1 -2
- 1 80 0 0 0 0 -160 0 16 48
- 1 0 0 0 0 10 -10 0 0 4
- 1 0 0 0 10 0 -10 0 0 2
- 1 0 0 5 0 0 -5 0 0 4
- 1 0 10 0 0 0 -10 0 0 6
- 1 40 0 0 0 0 -40 0 0 16
- 1 0 0 0 0 0 4 0 0 0
- 1 0 0 0 0 20 0 0 0 -8
- 1 0 0 0 20 0 0 0 0 -12
- 1 0 0 4 0 0 0 0 0 0
- 1 0 20 0 0 0 0 0 0 -4
- 1 80 0 0 0 0 0 0 0 -32
- 1 0 0 0 0 0 0 0 1 -4
- 1 0 0 0 0 0 0 1 0 -3
-
-
-0 0 0 # for future options...
-
-
-
-1 # set the iterator names
-outerTimeTileIter outerProcTileIter1 outerProcTileIter2 innerTimeTileIter innerProcTileIter1 innerProcTileIter2
-
-# --------------------- SCATTERING --------------------
-1 # Scattering functions
-6 16
- 0 1 0 0 0 0 0 -1 0 0 0 0 0 0 0 0
- 0 0 1 0 0 0 0 0 -1 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 -1 0 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 -1 0 0 0 0 0
- 0 0 0 0 0 1 0 0 0 0 0 -1 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 -1 0 0 0
-
-
-1 # we set the scattering dimension names
-outerTimeTileScatter outerProcTileScatter1 outerProcTileScatter2 innerTimeTileScatter innerProcTileScatter1 innerProcTileScatter2
-
diff --git a/cloog-0.16.3/test/otl.good.c b/cloog-0.16.3/test/otl.good.c
deleted file mode 100644
index 3004d8e..0000000
--- a/cloog-0.16.3/test/otl.good.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Generated from ../../../git/cloog/test/otl.cloog by CLooG 0.14.0-273-gfe7416f gmp bits in 0.24s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(outerTimeTileIter,outerProcTileIter1,outerProcTileIter2,innerTimeTileIter,innerProcTileIter1,innerProcTileIter2) { hash(1); hash(outerTimeTileIter); hash(outerProcTileIter1); hash(outerProcTileIter2); hash(innerTimeTileIter); hash(innerProcTileIter1); hash(innerProcTileIter2); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int outerTimeTileScatter, outerProcTileScatter1, outerProcTileScatter2, innerTimeTileScatter, innerProcTileScatter1, innerProcTileScatter2;
-  /* Original iterators. */
-  int outerTimeTileIter, outerProcTileIter1, outerProcTileIter2, innerTimeTileIter, innerProcTileIter1, innerProcTileIter2;
-  if ((M >= 3) && (N >= 4)) {
-    for (outerTimeTileScatter=1;outerTimeTileScatter<=floord(2*M+2*N-7,5);outerTimeTileScatter++) {
-      for (outerProcTileScatter1=max(ceild(outerTimeTileScatter,2),ceild(5*outerTimeTileScatter-M-2,5));outerProcTileScatter1<=min(min(floord(M+2*N-5,5),floord(5*outerTimeTileScatter+2*N+1,10)),outerTimeTileScatter);outerProcTileScatter1++) {
-        for (outerProcTileScatter2=max(max(max(max(max(ceild(outerTimeTileScatter-outerProcTileScatter1-1,2),ceild(5*outerProcTileScatter1-N-1,5)),ceild(5*outerTimeTileScatter-M-N+1,5)),ceild(5*outerTimeTileScatter-N-2,10)),ceild(5*outerTimeTileScatter-N-3,15)),outerTimeTileScatter-outerProcTileScatter1-1);outerProcTileScatter2<=min(min(min(floord(M+N-2,5),floord(5*outerTimeTileScatter-5*outerProcTileScatter1+N+4,5)),floord(5*outerTimeTileScatter+N+3,10)),outerProcTileScatter1);outerProcTileScatter2++) {
-          for (innerTimeTileScatter=max(max(max(ceild(10*outerProcTileScatter1-2*N,5),ceild(10*outerProcTileScatter2-N-2,5)),ceild(5*outerProcTileScatter1+5*outerProcTileScatter2-N-3,5)),outerTimeTileScatter);innerTimeTileScatter<=min(min(min(min(min(floord(2*M+2*N-6,5),floord(5*outerProcTileScatter1+M+3,5)),floord(5*outerProcTileScatter2+M+N,5)),floord(10*outerProcTileScatter2+N+3,5)),outerTimeTileScatter+1),outerProcTileScatter1+outerProcTileScatter2+1);innerTimeTileScatter++) {
-            for (innerProcTileScatter1=max(max(max(max(ceild(innerTimeTileScatter,2),ceild(5*innerTimeTileScatter-M-2,5)),ceild(5*outerTimeTileScatter-M-1,5)),outerProcTileScatter1),outerTimeTileScatter-outerProcTileScatter2);innerProcTileScatter1<=min(min(min(min(min(min(min(floord(M+2*N-4,5),floord(5*outerProcTileScatter2+N+2,5)),floord(-5*outerProcTileScatter2+5*innerTimeTileScatter+N+4,5)),floord(5*outerTimeTileScatter-5*outerProcTileScatter2+N+5,5)),floord(5*innerTimeTileScatter+2*N+2,10)),floord(5*outerTimeTileScatter+2*N+3,10)),outerTimeTileScatter),outerProcTileScatter1+1);innerProcTileScatter1++) {
-              for (innerProcTileScatter2=outerProcTileScatter2;innerProcTileScatter2<=outerProcTileScatter2;innerProcTileScatter2++) {
-                for (outerTimeTileIter=outerTimeTileScatter;outerTimeTileIter<=outerTimeTileScatter;outerTimeTileIter++) {
-                  for (outerProcTileIter1=outerProcTileScatter1;outerProcTileIter1<=outerProcTileScatter1;outerProcTileIter1++) {
-                    for (outerProcTileIter2=outerProcTileScatter2;outerProcTileIter2<=outerProcTileScatter2;outerProcTileIter2++) {
-                      for (innerTimeTileIter=innerTimeTileScatter;innerTimeTileIter<=innerTimeTileScatter;innerTimeTileIter++) {
-                        for (innerProcTileIter1=innerProcTileScatter1;innerProcTileIter1<=innerProcTileScatter1;innerProcTileIter1++) {
-                          for (innerProcTileIter2=outerProcTileScatter2;innerProcTileIter2<=outerProcTileScatter2;innerProcTileIter2++) {
-                            S1(outerTimeTileIter,outerProcTileIter1,outerProcTileIter2,innerTimeTileIter,innerProcTileIter1,innerProcTileIter2);
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/param-split.c b/cloog-0.16.3/test/param-split.c
deleted file mode 100644
index 97c75b1..0000000
--- a/cloog-0.16.3/test/param-split.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Generated from ../../../git/cloog/test/param-split.cloog by CLooG 0.14.0-277-gce2ba57 gmp bits in 0.00s. */
-for (i=0;i<=M;i++) {
-  S1(i);
-  if (i == 0) {
-    S2(i);
-  }
-}
-if (M <= -1) {
-  S2(0);
-}
diff --git a/cloog-0.16.3/test/param-split.cloog b/cloog-0.16.3/test/param-split.cloog
deleted file mode 100644
index 6f9e58f..0000000
--- a/cloog-0.16.3/test/param-split.cloog
+++ /dev/null
@@ -1,24 +0,0 @@
-c
-
-0 3
-
-0
-
-2
-
-1
-2 4
-1 1 0 0
-1 -1 1 0
-
-0 0 0
-
-1
-1 4
-0 1 0 0
-
-0 0 0
-
-0
-
-0
diff --git a/cloog-0.16.3/test/param-split.good.c b/cloog-0.16.3/test/param-split.good.c
deleted file mode 100644
index 25b3bc6..0000000
--- a/cloog-0.16.3/test/param-split.good.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Generated from ../../../git/cloog/test/param-split.cloog by CLooG 0.14.0-277-gce2ba57 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i) { hash(2); hash(i); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i;
-  if (M >= 0) {
-    S1(0);
-    S2(0);
-  }
-  for (i=1;i<=M;i++) {
-    S1(i);
-  }
-  if (M <= -1) {
-    S2(0);
-  }
-}
diff --git a/cloog-0.16.3/test/pouchet.c b/cloog-0.16.3/test/pouchet.c
deleted file mode 100644
index 3eb887f..0000000
--- a/cloog-0.16.3/test/pouchet.c
+++ /dev/null
@@ -1,22 +0,0 @@
-/* Generated from ../../../git/cloog/test/pouchet.cloog by CLooG 0.16.2-3-gc1aebd7 gmp bits in 0.03s. */
-if (Ny >= 2) {
-  for (c0=1;c0<=floord(Ny+4,2);c0++) {
-    for (c1=max(ceild(c0+1,2),c0-1);c1<=min(floord(2*c0+Ny,4),c0);c1++) {
-      if (c0 >= ceild(4*c1-Ny+1,2)) {
-        for (c2=1;c2<=2;c2++) {
-          S1(c0-c1,c1,2*c0-2*c1,-2*c0+4*c1,c2);
-          S2(c0-c1,c1,2*c0-2*c1,-2*c0+4*c1-1,c2);
-        }
-      }
-      if (2*c0 == 4*c1-Ny) {
-        for (c2=1;c2<=2;c2++) {
-          if (Ny%2 == 0) {
-            if ((2*c0+3*Ny)%4 == 0) {
-              S2((2*c0-Ny)/4,(2*c0+Ny)/4,(2*c0-Ny)/2,Ny-1,c2);
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/pouchet.cloog b/cloog-0.16.3/test/pouchet.cloog
deleted file mode 100644
index bef7293..0000000
--- a/cloog-0.16.3/test/pouchet.cloog
+++ /dev/null
@@ -1,76 +0,0 @@
-# CLooG -> CLooG
-# This is an automatic dump of a CLooG input file from a CloogInput data
-# structure.
-
-# Language: C
-c
-
-# Context:
-1
-
-0 3 0 0 0 1
-
-1 # Parameter name(s)
-Ny
-
-# Statement number:
-2
-
-# Iteration domain of statement 2 ((null)).
-1
-
-8 8 5 0 0 1
-1     0     0     1     0     0     0     0
-1     0     0    -1     0     0     0     2
-1     0     0     0     1     0     0    -1
-1     0     0     0    -1     0     1    -1
-1     0     0     0     0     1     0    -1
-1     0     0     0     0    -1     0     2
-0    -2     0     1     0     0     0     0
-0     0    -2     1     1     0     0     0
-
-0 0 0 # For future options.
-
-# Iteration domain of statement 4 ((null)).
-1
-
-8 8 5 0 0 1
-1     0     0     1     0     0     0     0
-1     0     0    -1     0     0     0     2
-1     0     0     0     1     0     0    -1
-1     0     0     0    -1     0     1    -1
-1     0     0     0     0     1     0    -1
-1     0     0     0     0    -1     0     2
-0    -2     0     1     0     0     0     0
-0     0    -2     1     1     0     0     1
-
-0 0 0 # For future options.
-
-0 # Iterator name(s)
-# --------------------- SCATTERING --------------------
-2 # Scattering functions
-
-# Scattering of statement 2 ((null)).
-1
-
-6 14 6 5 0 1
-0     0     0     0     0     0     1      0     0     0     0    -1     0     0
-0     0     0     0     0     1     0      0     0     0    -1     0     0     0
-0     0     0     0     1     0     0      0     0    -1     0     0     0     0
-0     0     0     1     0     0     0      0     0     0     0    -1     0     0
-0     0     1     0     0     0     0      0    -1     0     0     0     0     0
-0     1     0     0     0     0     0     -1    -1     0     0     0     0     0
-
-# Scattering of statement 4 ((null)).
-1
-
-6 14 6 5 0 1
-0     0     0     0     0     0     1      0     0     0     0    -1     0    -1
-0     0     0     0     0     1     0      0     0     0    -1     0     0    -1
-0     0     0     0     1     0     0      0     0    -1     0     0     0     0
-0     0     0     1     0     0     0      0     0     0     0    -1     0     0
-0     0     1     0     0     0     0      0    -1     0     0     0     0     0
-0     1     0     0     0     0     0     -1    -1     0     0     0     0     0
-
-1 # Scattering dimension name(s)
-c0 c1 c2 c3 c4 c5
diff --git a/cloog-0.16.3/test/pouchet.good.c b/cloog-0.16.3/test/pouchet.good.c
deleted file mode 100644
index 43009f5..0000000
--- a/cloog-0.16.3/test/pouchet.good.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Generated from ../../../git/cloog/test/pouchet.cloog by CLooG 0.16.2-3-gc1aebd7 gmp bits in 0.04s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k,l,m) { hash(1); hash(i); hash(j); hash(k); hash(l); hash(m); }
-#define S2(i,j,k,l,m) { hash(2); hash(i); hash(j); hash(k); hash(l); hash(m); }
-
-void test(int Ny)
-{
-  /* Scattering iterators. */
-  int c0, c1, c2, c3, c4, c5;
-  /* Original iterators. */
-  int i, j, k, l, m;
-  if (Ny >= 2) {
-    for (c0=1;c0<=floord(Ny+4,2);c0++) {
-      for (c1=max(ceild(c0+1,2),c0-1);c1<=min(floord(2*c0+Ny,4),c0);c1++) {
-        if (c0 >= ceild(4*c1-Ny+1,2)) {
-          for (c2=1;c2<=2;c2++) {
-            S1(c0-c1,c1,2*c0-2*c1,-2*c0+4*c1,c2);
-            S2(c0-c1,c1,2*c0-2*c1,-2*c0+4*c1-1,c2);
-          }
-        }
-        if (2*c0 == 4*c1-Ny) {
-          for (c2=1;c2<=2;c2++) {
-            if (Ny%2 == 0) {
-              if ((2*c0+3*Ny)%4 == 0) {
-                S2((2*c0-Ny)/4,(2*c0+Ny)/4,(2*c0-Ny)/2,Ny-1,c2);
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/rectangle.c b/cloog-0.16.3/test/rectangle.c
deleted file mode 100644
index dba226a..0000000
--- a/cloog-0.16.3/test/rectangle.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/rectangle.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (c1=0;c1<=2*n;c1++) {
-  for (i=max(0,c1-n);i<=min(c1,n);i++) {
-    S1(i,c1-i) ;
-  }
-}
diff --git a/cloog-0.16.3/test/rectangle.cloog b/cloog-0.16.3/test/rectangle.cloog
deleted file mode 100644
index 9f639ab..0000000
--- a/cloog-0.16.3/test/rectangle.cloog
+++ /dev/null
@@ -1,29 +0,0 @@
-# language: C
-c
-
-# parameter {n | n>= 0}
-1 3
-#  n  1
-1  1  0
-1
-n
-
-1 # Number of statements:
-
-1
-# {ii, i | 0<=i<=n 0<=j<=n}
-4 5
-#   i   j   n   1
-1   1   0   0   0
-1  -1   0   1   0
-1   0   1   0   0
-1   0  -1   1   0
-0   0   0
-0
-
-1 # Scattering functions
-
-1 6
-# c1   j   i   n   1
-0  1  -1  -1   0   0
-0
diff --git a/cloog-0.16.3/test/rectangle.good.c b/cloog-0.16.3/test/rectangle.good.c
deleted file mode 100644
index b977e28..0000000
--- a/cloog-0.16.3/test/rectangle.good.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Generated from ../../../git/cloog/test/rectangle.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int n)
-{
-  /* Scattering iterators. */
-  int c1;
-  /* Original iterators. */
-  int i, j;
-  for (c1=0;c1<=2*n;c1++) {
-    for (i=max(c1-n,0);i<=min(c1,n);i++) {
-      j = c1-i ;
-      S1(i,c1-i) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/QR.c b/cloog-0.16.3/test/reservoir/QR.c
deleted file mode 100644
index 5a8c26f..0000000
--- a/cloog-0.16.3/test/reservoir/QR.c
+++ /dev/null
@@ -1,117 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/QR.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.21s. */
-if (N >= 1) {
-  S1(0) ;
-  if ((M >= 1) && (N == 1)) {
-    for (c4=0;c4<=M-1;c4++) {
-      S2(0,c4) ;
-    }
-    S3(0) ;
-    for (c4=0;c4<=M-1;c4++) {
-      S4(0,c4) ;
-    }
-    S10(0) ;
-    S5(0) ;
-  }
-  if ((M <= 0) && (N == 1)) {
-    S3(0) ;
-    S10(0) ;
-    S5(0) ;
-  }
-  if ((M >= 1) && (N >= 2)) {
-    for (c4=0;c4<=M-1;c4++) {
-      S2(0,c4) ;
-    }
-    S3(0) ;
-    for (c4=0;c4<=M-1;c4++) {
-      S4(0,c4) ;
-    }
-    S10(0) ;
-    S1(1) ;
-    S5(0) ;
-  }
-  if ((M <= 0) && (N >= 2)) {
-    S3(0) ;
-    S10(0) ;
-    S1(1) ;
-    S5(0) ;
-  }
-  for (c2=2;c2<=min(M,N-1);c2++) {
-    for (c4=c2-1;c4<=N-1;c4++) {
-      S6(c2-2,c4) ;
-      for (c6=c2-2;c6<=M-1;c6++) {
-        S7(c2-2,c4,c6) ;
-      }
-      S8(c2-2,c4) ;
-      for (c6=c2-2;c6<=M-1;c6++) {
-        S9(c2-2,c4,c6) ;
-      }
-    }
-    for (c4=c2-1;c4<=M-1;c4++) {
-      S2(c2-1,c4) ;
-    }
-    S3(c2-1) ;
-    for (c4=c2-1;c4<=M-1;c4++) {
-      S4(c2-1,c4) ;
-    }
-    S10(c2-1) ;
-    S1(c2) ;
-    S5(c2-1) ;
-  }
-  if ((M >= 1) && (M <= N-2)) {
-    for (c4=M;c4<=N-1;c4++) {
-      S6(M-1,c4) ;
-      S7(M-1,c4,M-1) ;
-      S8(M-1,c4) ;
-      S9(M-1,c4,M-1) ;
-    }
-    S3(M) ;
-    S10(M) ;
-    S1(M+1) ;
-    S5(M) ;
-  }
-  for (c2=max(2,M+2);c2<=N-1;c2++) {
-    for (c4=c2-1;c4<=N-1;c4++) {
-      S6(c2-2,c4) ;
-      S8(c2-2,c4) ;
-    }
-    S3(c2-1) ;
-    S10(c2-1) ;
-    S1(c2) ;
-    S5(c2-1) ;
-  }
-  if ((M >= N) && (N >= 2)) {
-    S6(N-2,N-1) ;
-    for (c6=N-2;c6<=M-1;c6++) {
-      S7(N-2,N-1,c6) ;
-    }
-    S8(N-2,N-1) ;
-    for (c6=N-2;c6<=M-1;c6++) {
-      S9(N-2,N-1,c6) ;
-    }
-    for (c4=N-1;c4<=M-1;c4++) {
-      S2(N-1,c4) ;
-    }
-    S3(N-1) ;
-    for (c4=N-1;c4<=M-1;c4++) {
-      S4(N-1,c4) ;
-    }
-    S10(N-1) ;
-    S5(N-1) ;
-  }
-  if ((M == N-1) && (M >= 1)) {
-    S6(M-1,M) ;
-    S7(M-1,M,M-1) ;
-    S8(M-1,M) ;
-    S9(M-1,M,M-1) ;
-    S3(M) ;
-    S10(M) ;
-    S5(M) ;
-  }
-  if ((M <= N-2) && (N >= 2)) {
-    S6(N-2,N-1) ;
-    S8(N-2,N-1) ;
-    S3(N-1) ;
-    S10(N-1) ;
-    S5(N-1) ;
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/QR.cloog b/cloog-0.16.3/test/reservoir/QR.cloog
deleted file mode 100755
index 8baed20..0000000
--- a/cloog-0.16.3/test/reservoir/QR.cloog
+++ /dev/null
@@ -1,228 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 4
-    1    0    0    1
-0
-
-# Number of statments
-10
-
-1
-# { (i,j,k) | i >= 0, -i+k-1 >= 0, 1 >= 0 }
-
-    3 5
-    1    1    0    0    0
-    1   -1    0    1   -1
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i >= 0, -i+l-1 >= 0, -i+j >= 0, -j+k-1 >= 0, 1 >= 0 }
-
-    5 6
-    1    1    0    0    0    0
-    1   -1    0    0    1   -1
-    1   -1    1    0    0    0
-    1    0   -1    1    0   -1
-    1    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | i >= 0, -i+k-1 >= 0, 1 >= 0 }
-
-    3 5
-    1    1    0    0    0
-    1   -1    0    1   -1
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i >= 0, -i+l-1 >= 0, -i+j >= 0, -j+k-1 >= 0, 1 >= 0 }
-
-    5 6
-    1    1    0    0    0    0
-    1   -1    0    0    1   -1
-    1   -1    1    0    0    0
-    1    0   -1    1    0   -1
-    1    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | i >= 0, -i+k-1 >= 0, 1 >= 0 }
-
-    3 5
-    1    1    0    0    0
-    1   -1    0    1   -1
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i >= 0, -i+j-1 >= 0, -j+l-1 >= 0, 1 >= 0 }
-
-    4 6
-    1    1    0    0    0    0
-    1   -1    1    0    0   -1
-    1    0   -1    0    1   -1
-    1    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m) | i >= 0, -i+j-1 >= 0, -j+m-1 >= 0, -i+k >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    6 7
-    1    1    0    0    0    0    0
-    1   -1    1    0    0    0   -1
-    1    0   -1    0    0    1   -1
-    1   -1    0    1    0    0    0
-    1    0    0   -1    1    0   -1
-    1    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i >= 0, -i+j-1 >= 0, -j+l-1 >= 0, 1 >= 0 }
-
-    4 6
-    1    1    0    0    0    0
-    1   -1    1    0    0   -1
-    1    0   -1    0    1   -1
-    1    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m) | i >= 0, -i+j-1 >= 0, -j+m-1 >= 0, -i+k >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    6 7
-    1    1    0    0    0    0    0
-    1   -1    1    0    0    0   -1
-    1    0   -1    0    0    1   -1
-    1   -1    0    1    0    0    0
-    1    0    0   -1    1    0   -1
-    1    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | i >= 0, -i+k-1 >= 0, 1 >= 0 }
-
-    3 5
-    1    1    0    0    0
-    1   -1    0    1   -1
-    1    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-10
-
-    8 12
-    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0   -5
-    0    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0   -1
-    0    0    0    1    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 12
-    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0   -1
-    0    0    0    1    0    0    0    0    0    0    0   -2
-    0    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0   -1
-    0    0    0    1    0    0    0    0    0    0    0    0   -3
-    0    0    0    0    1    0    0    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 12
-    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0   -1
-    0    0    0    1    0    0    0    0    0    0    0   -6
-    0    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0   -2
-    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 14
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0   -2
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0   -2
-    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0   -2
-    0    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 14
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0   -2
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0   -3
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 12
-    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0   -1
-    0    0    0    1    0    0    0    0    0    0    0   -4
-    0    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/QR.good.c b/cloog-0.16.3/test/reservoir/QR.good.c
deleted file mode 100644
index facd214..0000000
--- a/cloog-0.16.3/test/reservoir/QR.good.c
+++ /dev/null
@@ -1,208 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/QR.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.27s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i) { hash(3); hash(i); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-#define S5(i) { hash(5); hash(i); }
-#define S6(i,j) { hash(6); hash(i); hash(j); }
-#define S7(i,j,k) { hash(7); hash(i); hash(j); hash(k); }
-#define S8(i,j) { hash(8); hash(i); hash(j); }
-#define S9(i,j,k) { hash(9); hash(i); hash(j); hash(k); }
-#define S10(i) { hash(10); hash(i); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  if ((M <= -1) && (N >= 1)) {
-    S1(0) ;
-  }
-  if ((M >= 0) && (N >= 1)) {
-    S1(0) ;
-  }
-  if ((M >= 1) && (N >= 2)) {
-    for (c4=0;c4<=M-1;c4++) {
-      S2(0,c4) ;
-    }
-    S3(0) ;
-    for (c4=0;c4<=M-1;c4++) {
-      S4(0,c4) ;
-    }
-    S10(0) ;
-    S1(1) ;
-    S5(0) ;
-  }
-  if ((M <= 0) && (N >= 2)) {
-    S3(0) ;
-    S10(0) ;
-    S1(1) ;
-    S5(0) ;
-  }
-  if ((M >= 1) && (N == 1)) {
-    for (c4=0;c4<=M-1;c4++) {
-      S2(0,c4) ;
-    }
-    S3(0) ;
-    for (c4=0;c4<=M-1;c4++) {
-      S4(0,c4) ;
-    }
-    S10(0) ;
-    S5(0) ;
-  }
-  if ((M <= 0) && (N == 1)) {
-    S3(0) ;
-    S10(0) ;
-    S5(0) ;
-  }
-  for (c2=2;c2<=min(N-1,M);c2++) {
-    for (c4=c2-1;c4<=N-1;c4++) {
-      i = c2-2 ;
-      S6(c2-2,c4) ;
-      for (c6=c2-2;c6<=M-1;c6++) {
-        i = c2-2 ;
-        S7(c2-2,c4,c6) ;
-      }
-      i = c2-2 ;
-      S8(c2-2,c4) ;
-      for (c6=c2-2;c6<=M-1;c6++) {
-        i = c2-2 ;
-        S9(c2-2,c4,c6) ;
-      }
-    }
-    for (c4=c2-1;c4<=M-1;c4++) {
-      i = c2-1 ;
-      S2(c2-1,c4) ;
-    }
-    i = c2-1 ;
-    S3(c2-1) ;
-    for (c4=c2-1;c4<=M-1;c4++) {
-      i = c2-1 ;
-      S4(c2-1,c4) ;
-    }
-    i = c2-1 ;
-    S10(c2-1) ;
-    S1(c2) ;
-    i = c2-1 ;
-    S5(c2-1) ;
-  }
-  if ((M >= 1) && (M <= N-2)) {
-    c2 = M+1 ;
-    for (c4=M;c4<=N-1;c4++) {
-      i = M-1 ;
-      S6(M-1,c4) ;
-      c6 = M-1 ;
-      i = M-1 ;
-      k = M-1 ;
-      S7(M-1,c4,M-1) ;
-      i = M-1 ;
-      S8(M-1,c4) ;
-      c6 = M-1 ;
-      i = M-1 ;
-      k = M-1 ;
-      S9(M-1,c4,M-1) ;
-    }
-    S3(M) ;
-    S10(M) ;
-    i = M+1 ;
-    S1(M+1) ;
-    S5(M) ;
-  }
-  if ((M >= N) && (N >= 2)) {
-    c4 = N-1 ;
-    i = N-2 ;
-    j = N-1 ;
-    S6(N-2,N-1) ;
-    for (c6=N-2;c6<=M-1;c6++) {
-      i = N-2 ;
-      j = N-1 ;
-      S7(N-2,N-1,c6) ;
-    }
-    i = N-2 ;
-    j = N-1 ;
-    S8(N-2,N-1) ;
-    for (c6=N-2;c6<=M-1;c6++) {
-      i = N-2 ;
-      j = N-1 ;
-      S9(N-2,N-1,c6) ;
-    }
-    for (c4=N-1;c4<=M-1;c4++) {
-      i = N-1 ;
-      S2(N-1,c4) ;
-    }
-    i = N-1 ;
-    S3(N-1) ;
-    for (c4=N-1;c4<=M-1;c4++) {
-      i = N-1 ;
-      S4(N-1,c4) ;
-    }
-    i = N-1 ;
-    S10(N-1) ;
-    i = N-1 ;
-    S5(N-1) ;
-  }
-  if ((M == N-1) && (N >= 2)) {
-    c4 = N-1 ;
-    i = N-2 ;
-    j = N-1 ;
-    S6(N-2,N-1) ;
-    c6 = N-2 ;
-    i = N-2 ;
-    j = N-1 ;
-    k = N-2 ;
-    S7(N-2,N-1,N-2) ;
-    i = N-2 ;
-    j = N-1 ;
-    S8(N-2,N-1) ;
-    c6 = N-2 ;
-    i = N-2 ;
-    j = N-1 ;
-    k = N-2 ;
-    S9(N-2,N-1,N-2) ;
-    i = N-1 ;
-    S3(N-1) ;
-    i = N-1 ;
-    S10(N-1) ;
-    i = N-1 ;
-    S5(N-1) ;
-  }
-  for (c2=max(M+2,2);c2<=N-1;c2++) {
-    for (c4=c2-1;c4<=N-1;c4++) {
-      i = c2-2 ;
-      S6(c2-2,c4) ;
-      i = c2-2 ;
-      S8(c2-2,c4) ;
-    }
-    i = c2-1 ;
-    S3(c2-1) ;
-    i = c2-1 ;
-    S10(c2-1) ;
-    S1(c2) ;
-    i = c2-1 ;
-    S5(c2-1) ;
-  }
-  if ((M <= N-2) && (N >= 2)) {
-    c4 = N-1 ;
-    i = N-2 ;
-    j = N-1 ;
-    S6(N-2,N-1) ;
-    i = N-2 ;
-    j = N-1 ;
-    S8(N-2,N-1) ;
-    i = N-1 ;
-    S3(N-1) ;
-    i = N-1 ;
-    S10(N-1) ;
-    i = N-1 ;
-    S5(N-1) ;
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/bastoul3.c b/cloog-0.16.3/test/reservoir/bastoul3.c
deleted file mode 100644
index a89d28e..0000000
--- a/cloog-0.16.3/test/reservoir/bastoul3.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/reservoir/bastoul3.cloog by CLooG 0.14.0-308-g2713b64 gmp bits in 0.01s. */
-for (i=3;i<=9;i++) {
-  for (j=max(i-6,i-2*floord(i-1,2));j<=min(3,i-2);j+=2) {
-    S1(i,j,(i-j)/2);
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/bastoul3.cloog b/cloog-0.16.3/test/reservoir/bastoul3.cloog
deleted file mode 100644
index 8437226..0000000
--- a/cloog-0.16.3/test/reservoir/bastoul3.cloog
+++ /dev/null
@@ -1,33 +0,0 @@
-# Figure 4 from "Efficient code generation for automatic parallelization
-# and optimization".
-#
-# Language
-c
-
-# Context
-
-   1 2
-   1  1
-0
-
-# Number of statements
-1
-
-1
-
-#        i'   i    j    1
-   6 5
-   0    1   -1   -2    0
-   1    0    1    0   -1
-   1    0   -1    0    3
-   1    0    0    1   -1
-   1    0    0   -1    3
-   1    0    0    0    1
-
-0 0 0
-
-0
-0
-
-
-
diff --git a/cloog-0.16.3/test/reservoir/cholesky2.c b/cloog-0.16.3/test/reservoir/cholesky2.c
deleted file mode 100644
index ee3c52e..0000000
--- a/cloog-0.16.3/test/reservoir/cholesky2.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Generated from ../../../git/cloog/test/reservoir/cholesky2.cloog by CLooG 0.14.0-283-g7c18f7a gmp bits in 0.04s. */
-if (M >= 1) {
-  if (M >= 2) {
-    S1(1);
-  }
-  for (c2=2;c2<=min(3,M);c2++) {
-    S2(1,c2);
-  }
-  if (M == 1) {
-    S1(1);
-  }
-  for (c2=4;c2<=3*M-4;c2++) {
-    if ((c2+1)%3 == 0) {
-      S1((c2+1)/3);
-    }
-    for (c4=ceild(c2+2,3);c4<=min(M,c2-2);c4++) {
-      for (c6=ceild(c2-c4+2,2);c6<=min(c4,c2-c4);c6++) {
-        S3(c2-c4-c6+1,c4,c6);
-      }
-    }
-    for (c4=ceild(c2+4,3);c4<=min(M,c2);c4++) {
-      if ((c2+c4)%2 == 0) {
-        S2((c2-c4+2)/2,c4);
-      }
-    }
-  }
-  for (c2=max(2*M,3*M-3);c2<=3*M-2;c2++) {
-    S3(c2-2*M+1,M,M);
-  }
-  if (M >= 2) {
-    S1(M);
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/cholesky2.cloog b/cloog-0.16.3/test/reservoir/cholesky2.cloog
deleted file mode 100755
index 7317c6a..0000000
--- a/cloog-0.16.3/test/reservoir/cholesky2.cloog
+++ /dev/null
@@ -1,79 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statments
-3
-
-1
-# { (i,j) | i-1 >= 0, -i+j >= 0, 1 >= 0 }
-
-    3 4
-    1    1    0   -1
-    1   -1    1    0
-    1    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | i-1 >= 0, -i+j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    4 5
-    1    1    0    0   -1
-    1   -1    1    0   -1
-    1    0   -1    1    0
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i-1 >= 0, -j+l >= 0, -i+k-1 >= 0, j-k >= 0, 1 >= 0 }
-
-    5 6
-    1    1    0    0    0   -1
-    1    0   -1    0    1    0
-    1   -1    0    1    0   -1
-    1    0    1   -1    0    0
-    1    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-3
-
-    8 11
-    0    1    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -3    0    1
-    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0
-    1    0    0    0    0    0    0    0    0    0    1
-
-
-    8 12
-    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -2   -1    0    2
-    0    0    0    1    0    0    0    0    0    0    0   -2
-    0    0    0    0    1    0    0    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1   -1   -1    0    1
-    0    0    0    1    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/cholesky2.good.c b/cloog-0.16.3/test/reservoir/cholesky2.good.c
deleted file mode 100644
index 36efcde..0000000
--- a/cloog-0.16.3/test/reservoir/cholesky2.good.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/cholesky2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.05s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j,k) { hash(3); hash(i); hash(j); hash(k); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  for (c2=2;c2<=min(3,3*M-4);c2++) {
-    if ((c2+1)%3 == 0) {
-      i = (c2+1)/3 ;
-      S1((c2+1)/3) ;
-    }
-    for (c4=ceild(c2+4,3);c4<=min(c2,M);c4++) {
-      if ((c2+c4)%2 == 0) {
-        i = (c2-c4+2)/2 ;
-        S2((c2-c4+2)/2,c4) ;
-      }
-    }
-  }
-  for (c2=4;c2<=3*M-4;c2++) {
-    if ((c2+1)%3 == 0) {
-      i = (c2+1)/3 ;
-      S1((c2+1)/3) ;
-    }
-    for (c4=ceild(c2+2,3);c4<=min(c2-2,M);c4++) {
-      for (c6=ceild(c2-c4+2,2);c6<=min(c2-c4,c4);c6++) {
-        i = c2-c4-c6+1 ;
-        S3(c2-c4-c6+1,c4,c6) ;
-      }
-    }
-    for (c4=ceild(c2+4,3);c4<=min(M,c2);c4++) {
-      if ((c2+c4)%2 == 0) {
-        i = (c2-c4+2)/2 ;
-        S2((c2-c4+2)/2,c4) ;
-      }
-    }
-  }
-  for (c2=max(2,3*M-3);c2<=min(3,3*M-2);c2++) {
-    if ((c2+1)%3 == 0) {
-      i = (c2+1)/3 ;
-      S1((c2+1)/3) ;
-    }
-  }
-  for (c2=max(3*M-3,4);c2<=3*M-2;c2++) {
-    if ((c2+1)%3 == 0) {
-      i = (c2+1)/3 ;
-      S1((c2+1)/3) ;
-    }
-    for (c4=ceild(c2+2,3);c4<=min(M,c2-2);c4++) {
-      for (c6=ceild(c2-c4+2,2);c6<=min(c2-c4,c4);c6++) {
-        i = c2-c4-c6+1 ;
-        S3(c2-c4-c6+1,c4,c6) ;
-      }
-    }
-  }
-  if (M >= 1) {
-    c2 = 3*M-1 ;
-    S1(M) ;
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/fusion1.c b/cloog-0.16.3/test/reservoir/fusion1.c
deleted file mode 100644
index c2c0adf..0000000
--- a/cloog-0.16.3/test/reservoir/fusion1.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/fusion1.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (c2=0;c2<=M;c2++) {
-  S1(c2) ;
-}
-for (c2=1;c2<=M;c2++) {
-  S2(c2) ;
-}
-for (c2=0;c2<=M;c2++) {
-  S3(c2) ;
-}
diff --git a/cloog-0.16.3/test/reservoir/fusion1.cloog b/cloog-0.16.3/test/reservoir/fusion1.cloog
deleted file mode 100755
index 3aea334..0000000
--- a/cloog-0.16.3/test/reservoir/fusion1.cloog
+++ /dev/null
@@ -1,65 +0,0 @@
-# Language
-c
-
-# Context
-
-    2 3
-    1    1   -1
-    1    0    1
-0
-
-# Number of statments
-3
-
-1
-# { (i,j) | i >= 0, -i+j >= 0, 1 >= 0 }
-
-    3 4
-    1    1    0    0
-    1   -1    1    0
-    1    0    0    1
-
-0 0 0
-1
-# { (i,j) | i-1 >= 0, -i+j >= 0, 1 >= 0 }
-
-    3 4
-    1    1    0   -1
-    1   -1    1    0
-    1    0    0    1
-
-0 0 0
-1
-# { (i,j) | i >= 0, -i+j >= 0, 1 >= 0 }
-
-    3 4
-    1    1    0    0
-    1   -1    1    0
-    1    0    0    1
-
-0 0 0
-0
-# Scattering functions
-3
-
-    4 7
-    0    1    0    0    0    0    0
-    0    0    1    0   -1    0    0
-    0    0    0    1    0    0    0
-    1    0    0    0    0    0    1
-
-
-    4 7
-    0    1    0    0    0    0   -1
-    0    0    1    0   -1    0    0
-    0    0    0    1    0    0    0
-    1    0    0    0    0    0    1
-
-
-    4 7
-    0    1    0    0    0    0   -2
-    0    0    1    0   -1    0    0
-    0    0    0    1    0    0    0
-    1    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/fusion1.good.c b/cloog-0.16.3/test/reservoir/fusion1.good.c
deleted file mode 100644
index ba28eba..0000000
--- a/cloog-0.16.3/test/reservoir/fusion1.good.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/fusion1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i) { hash(2); hash(i); }
-#define S3(i) { hash(3); hash(i); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2;
-  /* Original iterators. */
-  int i;
-  for (c2=0;c2<=M;c2++) {
-    S1(c2) ;
-  }
-  for (c2=1;c2<=M;c2++) {
-    S2(c2) ;
-  }
-  for (c2=0;c2<=M;c2++) {
-    S3(c2) ;
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/fusion2.c b/cloog-0.16.3/test/reservoir/fusion2.c
deleted file mode 100644
index d9d02d6..0000000
--- a/cloog-0.16.3/test/reservoir/fusion2.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/fusion2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.02s. */
-if ((M >= 1) && (N >= 1)) {
-  for (c4=1;c4<=M;c4++) {
-    S1(1,c4) ;
-  }
-  for (c2=2;c2<=N;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S2(c2-1,c4) ;
-    }
-    for (c4=1;c4<=M;c4++) {
-      S1(c2,c4) ;
-    }
-  }
-  for (c4=1;c4<=M;c4++) {
-    S2(N,c4) ;
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/fusion2.cloog b/cloog-0.16.3/test/reservoir/fusion2.cloog
deleted file mode 100755
index dad8353..0000000
--- a/cloog-0.16.3/test/reservoir/fusion2.cloog
+++ /dev/null
@@ -1,56 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 4
-    1    0    0    1
-0
-
-# Number of statments
-2
-
-1
-# { (i,j,k,l) | i-1 >= 0, -i+l >= 0, j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 6
-    1    1    0    0    0   -1
-    1   -1    0    0    1    0
-    1    0    1    0    0   -1
-    1    0   -1    1    0    0
-    1    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i-1 >= 0, -i+l >= 0, j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 6
-    1    1    0    0    0   -1
-    1   -1    0    0    1    0
-    1    0    1    0    0   -1
-    1    0   -1    1    0    0
-    1    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-2
-
-    6 11
-    0    1    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    1
-
-
-    6 11
-    0    1    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0   -1
-    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/fusion2.good.c b/cloog-0.16.3/test/reservoir/fusion2.good.c
deleted file mode 100644
index b4b8f1c..0000000
--- a/cloog-0.16.3/test/reservoir/fusion2.good.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/fusion2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int c2, c4;
-  /* Original iterators. */
-  int i, j;
-  if ((M >= 1) && (N >= 1)) {
-    for (c4=1;c4<=M;c4++) {
-      S1(1,c4) ;
-    }
-  }
-  if (M >= 1) {
-    for (c2=2;c2<=N;c2++) {
-      for (c4=1;c4<=M;c4++) {
-        i = c2-1 ;
-        S2(c2-1,c4) ;
-      }
-      for (c4=1;c4<=M;c4++) {
-        S1(c2,c4) ;
-      }
-    }
-  }
-  if ((M >= 1) && (N >= 1)) {
-    c2 = N+1 ;
-    for (c4=1;c4<=M;c4++) {
-      S2(N,c4) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/jacobi2.c b/cloog-0.16.3/test/reservoir/jacobi2.c
deleted file mode 100644
index 421e8a9..0000000
--- a/cloog-0.16.3/test/reservoir/jacobi2.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/jacobi2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (c2=0;c2<=M-1;c2++) {
-  for (c4=0;c4<=M-1;c4++) {
-    S1(c2,c4) ;
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/jacobi2.cloog b/cloog-0.16.3/test/reservoir/jacobi2.cloog
deleted file mode 100755
index 7352362..0000000
--- a/cloog-0.16.3/test/reservoir/jacobi2.cloog
+++ /dev/null
@@ -1,37 +0,0 @@
-# Language
-c
-
-# Context
-
-    2 3
-    1    1   -1
-    1    0    1
-0
-
-# Number of statments
-1
-
-1
-# { (i,j,k) | i >= 0, -i+k-1 >= 0, j >= 0, -j+k-1 >= 0, 1 >= 0 }
-
-    5 5
-    1    1    0    0    0
-    1   -1    0    1   -1
-    1    0    1    0    0
-    1    0   -1    1   -1
-    1    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-1
-
-    6 10
-    0    1    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/jacobi2.good.c b/cloog-0.16.3/test/reservoir/jacobi2.good.c
deleted file mode 100644
index 8c6ea0e..0000000
--- a/cloog-0.16.3/test/reservoir/jacobi2.good.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/jacobi2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4;
-  /* Original iterators. */
-  int i, j;
-  for (c2=0;c2<=M-1;c2++) {
-    for (c4=0;c4<=M-1;c4++) {
-      S1(c2,c4) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/jacobi3.c b/cloog-0.16.3/test/reservoir/jacobi3.c
deleted file mode 100644
index 0182c15..0000000
--- a/cloog-0.16.3/test/reservoir/jacobi3.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/jacobi3.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.02s. */
-if ((M >= 1) && (N >= 3)) {
-  for (c4=2;c4<=N-1;c4++) {
-    for (c6=2;c6<=N-1;c6++) {
-      S1(1,c4,c6) ;
-    }
-  }
-  for (c2=3;c2<=2*M;c2++) {
-    for (c4=2;c4<=N-1;c4++) {
-      for (c6=2;c6<=N-1;c6++) {
-        if (c2%2 == 0) {
-          S1(c2/2,c4,c6) ;
-        }
-      }
-    }
-    for (c4=2;c4<=N-1;c4++) {
-      for (c6=2;c6<=N-1;c6++) {
-        if ((c2+1)%2 == 0) {
-          S2((c2-1)/2,c4,c6) ;
-        }
-      }
-    }
-  }
-  for (c4=2;c4<=N-1;c4++) {
-    for (c6=2;c6<=N-1;c6++) {
-      S2(M,c4,c6) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/jacobi3.cloog b/cloog-0.16.3/test/reservoir/jacobi3.cloog
deleted file mode 100755
index dff32ff..0000000
--- a/cloog-0.16.3/test/reservoir/jacobi3.cloog
+++ /dev/null
@@ -1,64 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 4
-    1    0    0    1
-0
-
-# Number of statments
-2
-
-1
-# { (i,j,k,l,m) | i-1 >= 0, -i+l >= 0, j-2 >= 0, -j+m-1 >= 0, k-2 >= 0, -k+m-1 >= 0, 1 >= 0 }
-
-    7 7
-    1    1    0    0    0    0   -1
-    1   -1    0    0    1    0    0
-    1    0    1    0    0    0   -2
-    1    0   -1    0    0    1   -1
-    1    0    0    1    0    0   -2
-    1    0    0   -1    0    1   -1
-    1    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m) | i-1 >= 0, -i+l >= 0, j-2 >= 0, -j+m-1 >= 0, k-2 >= 0, -k+m-1 >= 0, 1 >= 0 }
-
-    7 7
-    1    1    0    0    0    0   -1
-    1   -1    0    0    1    0    0
-    1    0    1    0    0    0   -2
-    1    0   -1    0    0    1   -1
-    1    0    0    1    0    0   -2
-    1    0    0   -1    0    1   -1
-    1    0    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-2
-
-    8 14
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -2    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 14
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -2    0    0    0    0   -1
-    0    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/jacobi3.good.c b/cloog-0.16.3/test/reservoir/jacobi3.good.c
deleted file mode 100644
index 39cfce3..0000000
--- a/cloog-0.16.3/test/reservoir/jacobi3.good.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/jacobi3.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.03s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  if ((M >= 1) && (N >= 3)) {
-    for (c4=2;c4<=N-1;c4++) {
-      for (c6=2;c6<=N-1;c6++) {
-        S1(1,c4,c6) ;
-      }
-    }
-  }
-  if (N >= 3) {
-    for (c2=3;c2<=2*M;c2++) {
-      for (c4=2;c4<=N-1;c4++) {
-        for (c6=2;c6<=N-1;c6++) {
-          if (c2%2 == 0) {
-            S1(c2/2,c4,c6) ;
-          }
-        }
-      }
-      for (c4=2;c4<=N-1;c4++) {
-        for (c6=2;c6<=N-1;c6++) {
-          if ((c2+1)%2 == 0) {
-            i = (c2-1)/2 ;
-            S2((c2-1)/2,c4,c6) ;
-          }
-        }
-      }
-    }
-  }
-  if ((M >= 1) && (N >= 3)) {
-    c2 = 2*M+1 ;
-    for (c4=2;c4<=N-1;c4++) {
-      for (c6=2;c6<=N-1;c6++) {
-        S2(M,c4,c6) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/lim-lam1.c b/cloog-0.16.3/test/reservoir/lim-lam1.c
deleted file mode 100644
index 469117c..0000000
--- a/cloog-0.16.3/test/reservoir/lim-lam1.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/./reservoir/lim-lam1.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.01s. */
-S1(1,100);
-for (c2=-98;c2<=99;c2++) {
-  if (c2 <= 0) {
-    S1(1,-c2+1);
-  }
-  if (c2 >= 1) {
-    S2(c2,1);
-  }
-  for (c4=max(2,-2*c2+3);c4<=min(199,-2*c2+200);c4++) {
-    if (c4%2 == 0) {
-      S1((2*c2+c4)/2,c4/2);
-    }
-    if ((c4+1)%2 == 0) {
-      S2((2*c2+c4-1)/2,(c4+1)/2);
-    }
-  }
-  if (c2 <= 0) {
-    S1(c2+100,100);
-  }
-  if (c2 >= 1) {
-    S2(100,-c2+101);
-  }
-}
-S2(100,1);
diff --git a/cloog-0.16.3/test/reservoir/lim-lam1.cloog b/cloog-0.16.3/test/reservoir/lim-lam1.cloog
deleted file mode 100644
index 7a7c684..0000000
--- a/cloog-0.16.3/test/reservoir/lim-lam1.cloog
+++ /dev/null
@@ -1,54 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 2
-    1    1
-0
-
-# Number of statments
-2
-
-1
-# { (i,j) | i-1 >= 0, -i+100 >= 0, j-1 >= 0, -j+100 >= 0 }
-
-    4 4
-    1    1    0   -1
-    1   -1    0  100
-    1    0    1   -1
-    1    0   -1  100
-
-0 0 0
-1
-# { (i,j) | i-1 >= 0, -i+100 >= 0, j-1 >= 0, -j+100 >= 0 }
-
-    4 4
-    1    1    0   -1
-    1   -1    0  100
-    1    0    1   -1
-    1    0   -1  100
-
-0 0 0
-0
-# Scattering functions
-2
-
-    6 9
-    0    1    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    1    0
-    0    0    0    1    0    0    0    0    0
-    0    0    0    0    1    0    0   -2    0
-    0    0    0    0    0    1    0    0    0
-    1    0    0    0    0    0    0    0    1
-
-
-    6 9
-    0    1    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    1   -1
-    0    0    0    1    0    0    0    0    0
-    0    0    0    0    1    0    0   -2    1
-    0    0    0    0    0    1    0    0   -1
-    1    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/lim-lam1.good.c b/cloog-0.16.3/test/reservoir/lim-lam1.good.c
deleted file mode 100644
index cd6faf7..0000000
--- a/cloog-0.16.3/test/reservoir/lim-lam1.good.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/lim-lam1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int c2, c4;
-  /* Original iterators. */
-  int i, j;
-  S1(1,100) ;
-  for (c2=-98;c2<=0;c2++) {
-    c4 = -2*c2+2 ;
-    j = -c2+1 ;
-    S1(1,-c2+1) ;
-    for (c4=-2*c2+3;c4<=199;c4++) {
-      if (c4%2 == 0) {
-        i = (2*c2+c4)/2 ;
-        S1((2*c2+c4)/2,c4/2) ;
-      }
-      if ((c4+1)%2 == 0) {
-        i = (2*c2+c4-1)/2 ;
-        j = (c4+1)/2 ;
-        S2((2*c2+c4-1)/2,(c4+1)/2) ;
-      }
-    }
-    i = c2+100 ;
-    S1(c2+100,100) ;
-  }
-  for (c2=1;c2<=99;c2++) {
-    S2(c2,1) ;
-    for (c4=2;c4<=-2*c2+200;c4++) {
-      if (c4%2 == 0) {
-        i = (2*c2+c4)/2 ;
-        S1((2*c2+c4)/2,c4/2) ;
-      }
-      if ((c4+1)%2 == 0) {
-        i = (2*c2+c4-1)/2 ;
-        j = (c4+1)/2 ;
-        S2((2*c2+c4-1)/2,(c4+1)/2) ;
-      }
-    }
-    c4 = -2*c2+201 ;
-    j = -c2+101 ;
-    S2(100,-c2+101) ;
-  }
-  S2(100,1) ;
-}
diff --git a/cloog-0.16.3/test/reservoir/lim-lam2.c b/cloog-0.16.3/test/reservoir/lim-lam2.c
deleted file mode 100644
index ab1a32f..0000000
--- a/cloog-0.16.3/test/reservoir/lim-lam2.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/lim-lam2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-for (c2=1;c2<=M;c2++) {
-  S1(c2) ;
-}
-if (N >= 2) {
-  for (c2=1;c2<=M;c2++) {
-    for (c4=2;c4<=N;c4++) {
-      S2(c2,c4) ;
-    }
-  }
-}
-if (N >= 2) {
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=N-1;c4++) {
-      S3(c2,c4) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/lim-lam2.cloog b/cloog-0.16.3/test/reservoir/lim-lam2.cloog
deleted file mode 100755
index db50b74..0000000
--- a/cloog-0.16.3/test/reservoir/lim-lam2.cloog
+++ /dev/null
@@ -1,76 +0,0 @@
-# Language
-c
-
-# Context
-
-    3 4
-    1    1    0   -1
-    1    0    1   -1
-    1    0    0    1
-0
-
-# Number of statments
-3
-
-1
-# { (i,j,k) | i-1 >= 0, -i+j >= 0, 1 >= 0 }
-
-    3 5
-    1    1    0    0   -1
-    1   -1    1    0    0
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i-1 >= 0, -i+k >= 0, j-2 >= 0, -j+l >= 0, 1 >= 0 }
-
-    5 6
-    1    1    0    0    0   -1
-    1   -1    0    1    0    0
-    1    0    1    0    0   -2
-    1    0   -1    0    1    0
-    1    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i-1 >= 0, -i+k >= 0, j-1 >= 0, -j+l-1 >= 0, 1 >= 0 }
-
-    5 6
-    1    1    0    0    0   -1
-    1   -1    0    1    0    0
-    1    0    1    0    0   -1
-    1    0   -1    0    1   -1
-    1    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-3
-
-    6 10
-    0    1    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-
-    6 11
-    0    1    0    0    0    0    0    0    0    0   -1
-    0    0    1    0    0    0   -1    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    1
-
-
-    6 11
-    0    1    0    0    0    0    0    0    0    0   -2
-    0    0    1    0    0    0   -1    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0   -2
-    0    0    0    0    1    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/lim-lam2.good.c b/cloog-0.16.3/test/reservoir/lim-lam2.good.c
deleted file mode 100644
index 0ea3332..0000000
--- a/cloog-0.16.3/test/reservoir/lim-lam2.good.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/lim-lam2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int c2, c4;
-  /* Original iterators. */
-  int i, j;
-  for (c2=1;c2<=M;c2++) {
-    S1(c2) ;
-  }
-  if (N >= 2) {
-    for (c2=1;c2<=M;c2++) {
-      for (c4=2;c4<=N;c4++) {
-        S2(c2,c4) ;
-      }
-    }
-  }
-  if (N >= 2) {
-    for (c2=1;c2<=M;c2++) {
-      for (c4=1;c4<=N-1;c4++) {
-        S3(c2,c4) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/lim-lam3.c b/cloog-0.16.3/test/reservoir/lim-lam3.c
deleted file mode 100644
index c68a629..0000000
--- a/cloog-0.16.3/test/reservoir/lim-lam3.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Generated from ../../../git/cloog/test/reservoir/lim-lam3.cloog by CLooG 0.16.2-8-g1421b58 gmp bits in 0.03s. */
-S4(1);
-for (c2=9;c2<=min(13,5*M-1);c2++) {
-  if (c2 <= M+7) {
-    S2(c2-7,1);
-  }
-  if (c2 == 10) {
-    S4(2);
-  }
-  if (c2 <= 3*M+3) {
-    if (c2%3 == 0) {
-      S3((c2-3)/3,1);
-    }
-  }
-}
-for (c2=14;c2<=5*M-1;c2++) {
-  for (c4=max(2,ceild(c2-M-3,4));c4<=min(floord(c2-8,3),M-1);c4++) {
-    for (c6=max(1,ceild(c2-2*c4-M-5,2));c6<=min(floord(c2-3*c4-6,2),c4-1);c6++) {
-      S1(c2-2*c4-2*c6-5,c4,c6);
-    }
-  }
-  for (c4=max(1,ceild(c2-M-3,4));c4<=floord(c2-4,5);c4++) {
-    S2(c2-4*c4-3,c4);
-  }
-  if (c2%5 == 0) {
-    S4(c2/5);
-  }
-  for (c4=max(1,ceild(c2-3*M-1,2));c4<=floord(c2-4,5);c4++) {
-    if ((c2+c4+2)%3 == 0) {
-      S3((c2-2*c4-1)/3,c4);
-    }
-  }
-}
-if (M >= 2) {
-  S4(M);
-}
diff --git a/cloog-0.16.3/test/reservoir/lim-lam3.cloog b/cloog-0.16.3/test/reservoir/lim-lam3.cloog
deleted file mode 100755
index 0d3d4a5..0000000
--- a/cloog-0.16.3/test/reservoir/lim-lam3.cloog
+++ /dev/null
@@ -1,101 +0,0 @@
-# Language
-c
-
-# Context
-
-    2 3
-    1    1   -1
-    1    0    1
-0
-
-# Number of statments
-4
-
-1
-# { (i,j,k,l) | -i+l >= 0, i-j-1 >= 0, k-1 >= 0, j-k-1 >= 0, 1 >= 0 }
-
-    5 6
-    1   -1    0    0    1    0
-    1    1   -1    0    0   -1
-    1    0    0    1    0   -1
-    1    0    1   -1    0   -1
-    1    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | -i+k >= 0, j-1 >= 0, i-j-1 >= 0, 1 >= 0 }
-
-    4 5
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    1   -1    0   -1
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | -i+k >= 0, j-1 >= 0, i-j-1 >= 0, 1 >= 0 }
-
-    4 5
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    1   -1    0   -1
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j) | i-1 >= 0, -i+j >= 0, 1 >= 0 }
-
-    3 4
-    1    1    0   -1
-    1   -1    1    0
-    1    0    0    1
-
-0 0 0
-0
-# Scattering functions
-4
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1   -2   -2    0   -5
-    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 12
-    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1   -4    0   -3
-    0    0    0    1    0    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 12
-    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -3   -2    0   -1
-    0    0    0    1    0    0    0    0    0    0    0   -2
-    0    0    0    0    1    0    0    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 11
-    0    1    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -5    0    0
-    0    0    0    1    0    0    0    0    0    0   -2
-    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0
-    1    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/lim-lam3.good.c b/cloog-0.16.3/test/reservoir/lim-lam3.good.c
deleted file mode 100644
index 0cddca9..0000000
--- a/cloog-0.16.3/test/reservoir/lim-lam3.good.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/lim-lam3.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.04s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-#define S4(i) { hash(4); hash(i); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  for (c2=5;c2<=min(5*M,8);c2++) {
-    if (c2%5 == 0) {
-      S4(c2/5) ;
-    }
-  }
-  for (c2=9;c2<=min(13,5*M-1);c2++) {
-    for (c4=max(1,ceild(c2-M-3,4));c4<=floord(c2-4,5);c4++) {
-      i = c2-4*c4-3 ;
-      S2(c2-4*c4-3,c4) ;
-    }
-    if (c2%5 == 0) {
-      S4(c2/5) ;
-    }
-    for (c4=max(1,ceild(c2-3*M-1,2));c4<=floord(c2-4,5);c4++) {
-      if ((c2+c4+2)%3 == 0) {
-        i = (c2-2*c4-1)/3 ;
-        S3((c2-2*c4-1)/3,c4) ;
-      }
-    }
-  }
-  for (c2=14;c2<=5*M-1;c2++) {
-    for (c4=max(2,ceild(c2-M-3,4));c4<=min(M-1,floord(c2-8,3));c4++) {
-      for (c6=max(1,ceild(c2-2*c4-M-5,2));c6<=min(c4-1,floord(c2-3*c4-6,2));c6++) {
-        i = c2-2*c4-2*c6-5 ;
-        S1(c2-2*c4-2*c6-5,c4,c6) ;
-      }
-    }
-    for (c4=max(ceild(c2-M-3,4),1);c4<=floord(c2-4,5);c4++) {
-      i = c2-4*c4-3 ;
-      S2(c2-4*c4-3,c4) ;
-    }
-    if (c2%5 == 0) {
-      S4(c2/5) ;
-    }
-    for (c4=max(ceild(c2-3*M-1,2),1);c4<=floord(c2-4,5);c4++) {
-      if ((c2+c4+2)%3 == 0) {
-        i = (c2-2*c4-1)/3 ;
-        S3((c2-2*c4-1)/3,c4) ;
-      }
-    }
-  }
-  if (M >= 2) {
-    c2 = 5*M ;
-    S4(M) ;
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/lim-lam4.c b/cloog-0.16.3/test/reservoir/lim-lam4.c
deleted file mode 100644
index b2c0845..0000000
--- a/cloog-0.16.3/test/reservoir/lim-lam4.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/lim-lam4.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.04s. */
-if (M >= 2) {
-  S1(1,0,0) ;
-  for (c2=2;c2<=2*M-2;c2++) {
-    for (c4=max(-M+1,-c2+1);c4<=-1;c4++) {
-      for (i=max(1,c2-M+1);i<=min(M-1,c2+c4);i++) {
-        S1(i,c2+c4-i,-c4) ;
-      }
-      for (c6=max(-c4,c2-M+1);c6<=min(M-1,c2-1);c6++) {
-        S2(c2-c6,c4+c6,c6) ;
-      }
-    }
-    for (i=max(1,c2-M+1);i<=min(c2,M-1);i++) {
-      S1(i,c2-i,0) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/lim-lam4.cloog b/cloog-0.16.3/test/reservoir/lim-lam4.cloog
deleted file mode 100755
index 0aa66e3..0000000
--- a/cloog-0.16.3/test/reservoir/lim-lam4.cloog
+++ /dev/null
@@ -1,62 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statments
-2
-
-1
-# { (i,j,k,l) | i-1 >= 0, -i+l-1 >= 0, j >= 0, k >= 0, -j-k+l-1 >= 0, 1 >= 0 }
-
-    6 6
-    1    1    0    0    0   -1
-    1   -1    0    0    1   -1
-    1    0    1    0    0    0
-    1    0    0    1    0    0
-    1    0   -1   -1    1   -1
-    1    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i-1 >= 0, -i+l-1 >= 0, j >= 0, -j+k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    6 6
-    1    1    0    0    0   -1
-    1   -1    0    0    1   -1
-    1    0    1    0    0    0
-    1    0   -1    1    0   -1
-    1    0    0   -1    1   -1
-    1    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-2
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1   -1   -1    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0    0    1    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0   -1    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    1    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/lim-lam4.good.c b/cloog-0.16.3/test/reservoir/lim-lam4.good.c
deleted file mode 100644
index afb05ec..0000000
--- a/cloog-0.16.3/test/reservoir/lim-lam4.good.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/lim-lam4.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  if (M >= 2) {
-    S1(1,0,0) ;
-  }
-  for (c2=2;c2<=2*M-2;c2++) {
-    for (c4=max(-M+1,-c2+1);c4<=-1;c4++) {
-      for (i=max(1,c2-M+1);i<=min(c2+c4,M-1);i++) {
-        j = c2+c4-i ;
-        S1(i,c2+c4-i,-c4) ;
-      }
-      for (c6=max(-c4,c2-M+1);c6<=min(c2-1,M-1);c6++) {
-        i = c2-c6 ;
-        j = c4+c6 ;
-        S2(c2-c6,c4+c6,c6) ;
-      }
-    }
-    for (i=max(1,c2-M+1);i<=min(M-1,c2);i++) {
-      j = c2-i ;
-      S1(i,c2-i,0) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/lim-lam5.c b/cloog-0.16.3/test/reservoir/lim-lam5.c
deleted file mode 100644
index e6b0a57..0000000
--- a/cloog-0.16.3/test/reservoir/lim-lam5.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/lim-lam5.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if (M >= 1) {
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S1(c2,c4) ;
-    }
-  }
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S2(c2,c4) ;
-    }
-  }
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S3(c2,c4) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/lim-lam5.cloog b/cloog-0.16.3/test/reservoir/lim-lam5.cloog
deleted file mode 100755
index c5d6ef9..0000000
--- a/cloog-0.16.3/test/reservoir/lim-lam5.cloog
+++ /dev/null
@@ -1,76 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statments
-3
-
-1
-# { (i,j,k) | i-1 >= 0, -i+k >= 0, j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 5
-    1    1    0    0   -1
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    0   -1    1    0
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | i-1 >= 0, -i+k >= 0, j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 5
-    1    1    0    0   -1
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    0   -1    1    0
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | i-1 >= 0, -i+k >= 0, j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 5
-    1    1    0    0   -1
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    0   -1    1    0
-    1    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-3
-
-    6 10
-    0    1    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-
-    6 10
-    0    1    0    0    0    0    0    0    0   -1
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-
-    6 10
-    0    1    0    0    0    0    0    0    0   -2
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/lim-lam5.good.c b/cloog-0.16.3/test/reservoir/lim-lam5.good.c
deleted file mode 100644
index 69d8805..0000000
--- a/cloog-0.16.3/test/reservoir/lim-lam5.good.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/lim-lam5.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4;
-  /* Original iterators. */
-  int i, j;
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S1(c2,c4) ;
-    }
-  }
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S2(c2,c4) ;
-    }
-  }
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S3(c2,c4) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/lim-lam6.c b/cloog-0.16.3/test/reservoir/lim-lam6.c
deleted file mode 100644
index 05baff1..0000000
--- a/cloog-0.16.3/test/reservoir/lim-lam6.c
+++ /dev/null
@@ -1,13 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/lim-lam6.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if (M >= 1) {
-  for (c2=0;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S1(c2,c4) ;
-    }
-  }
-  for (c2=0;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S2(c4,c2) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/lim-lam6.cloog b/cloog-0.16.3/test/reservoir/lim-lam6.cloog
deleted file mode 100755
index a1bf181..0000000
--- a/cloog-0.16.3/test/reservoir/lim-lam6.cloog
+++ /dev/null
@@ -1,56 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statments
-2
-
-1
-# { (i,j,k) | i >= 0, -i+k >= 0, j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 5
-    1    1    0    0    0
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    0   -1    1    0
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | i-1 >= 0, -i+k >= 0, j >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 5
-    1    1    0    0   -1
-    1   -1    0    1    0
-    1    0    1    0    0
-    1    0   -1    1    0
-    1    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-2
-
-    6 10
-    0    1    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-
-    6 10
-    0    1    0    0    0    0    0    0    0   -1
-    0    0    1    0    0    0    0   -1    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/lim-lam6.good.c b/cloog-0.16.3/test/reservoir/lim-lam6.good.c
deleted file mode 100644
index f49ab57..0000000
--- a/cloog-0.16.3/test/reservoir/lim-lam6.good.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/lim-lam6.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4;
-  /* Original iterators. */
-  int i, j;
-  if (M >= 1) {
-    for (c2=0;c2<=M;c2++) {
-      for (c4=1;c4<=M;c4++) {
-        S1(c2,c4) ;
-      }
-    }
-  }
-  if (M >= 1) {
-    for (c2=0;c2<=M;c2++) {
-      for (c4=1;c4<=M;c4++) {
-        S2(c4,c2) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/liu-zhuge1.c b/cloog-0.16.3/test/reservoir/liu-zhuge1.c
deleted file mode 100644
index b0f8602..0000000
--- a/cloog-0.16.3/test/reservoir/liu-zhuge1.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/./reservoir/liu-zhuge1.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.02s. */
-if ((M >= 0) && (N >= 0)) {
-  for (c2=-4;c2<=min(-1,3*M+N-4);c2++) {
-    for (c4=max(0,c2-3*M+4);c4<=min(N,c2+4);c4++) {
-      if ((c2+2*c4+1)%3 == 0) {
-        S1((c2-c4+4)/3,c4);
-      }
-    }
-  }
-  for (c2=0;c2<=3*M+N-4;c2++) {
-    for (c4=max(0,c2-3*M);c4<=min(c2,c2-3*M+3);c4++) {
-      if ((c2+2*c4)%3 == 0) {
-        S2((c2-c4)/3,c4);
-      }
-    }
-    for (c4=max(0,c2-3*M+4);c4<=min(N,c2);c4++) {
-      if ((c2+2*c4)%3 == 0) {
-        S2((c2-c4)/3,c4);
-      }
-      if ((c2+2*c4+1)%3 == 0) {
-        S1((c2-c4+4)/3,c4);
-      }
-    }
-    for (c4=max(c2+1,c2-3*M+4);c4<=min(N,c2+4);c4++) {
-      if ((c2+2*c4+1)%3 == 0) {
-        S1((c2-c4+4)/3,c4);
-      }
-    }
-    for (c4=max(0,c2-3*M);c4<=min(N,c2);c4++) {
-      if ((c2+2*c4)%3 == 0) {
-        S3((c2-c4)/3,c4);
-      }
-    }
-  }
-  for (c2=max(0,3*M+N-3);c2<=3*M+N;c2++) {
-    for (c4=max(0,c2-3*M);c4<=min(N,c2);c4++) {
-      if ((c2+2*c4)%3 == 0) {
-        S2((c2-c4)/3,c4);
-      }
-    }
-    for (c4=max(0,c2-3*M);c4<=min(N,c2);c4++) {
-      if ((c2+2*c4)%3 == 0) {
-        S3((c2-c4)/3,c4);
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/liu-zhuge1.cloog b/cloog-0.16.3/test/reservoir/liu-zhuge1.cloog
deleted file mode 100755
index e28cb4b..0000000
--- a/cloog-0.16.3/test/reservoir/liu-zhuge1.cloog
+++ /dev/null
@@ -1,76 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 4
-    1    0    0    1
-0
-
-# Number of statments
-3
-
-1
-# { (i,j,k,l) | i >= 0, -i+k >= 0, j >= 0, -j+l >= 0, 1 >= 0 }
-
-    5 6
-    1    1    0    0    0    0
-    1   -1    0    1    0    0
-    1    0    1    0    0    0
-    1    0   -1    0    1    0
-    1    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i >= 0, -i+k >= 0, j >= 0, -j+l >= 0, 1 >= 0 }
-
-    5 6
-    1    1    0    0    0    0
-    1   -1    0    1    0    0
-    1    0    1    0    0    0
-    1    0   -1    0    1    0
-    1    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i >= 0, -i+k >= 0, j >= 0, -j+l >= 0, 1 >= 0 }
-
-    5 6
-    1    1    0    0    0    0
-    1   -1    0    1    0    0
-    1    0    1    0    0    0
-    1    0   -1    0    1    0
-    1    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-3
-
-    6 11
-    0    1    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -3   -1    0    0    4
-    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    1
-
-
-    6 11
-    0    1    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -3   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    1
-
-
-    6 11
-    0    1    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -3   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/liu-zhuge1.good.c b/cloog-0.16.3/test/reservoir/liu-zhuge1.good.c
deleted file mode 100644
index 2b07ade..0000000
--- a/cloog-0.16.3/test/reservoir/liu-zhuge1.good.c
+++ /dev/null
@@ -1,168 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/liu-zhuge1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.05s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int c2, c4;
-  /* Original iterators. */
-  int i, j;
-  if ((M >= 0) && (N >= 0)) {
-    for (c2=-4;c2<=min(-1,3*M+N-4);c2++) {
-      for (c4=max(0,c2-3*M+4);c4<=min(c2+4,N);c4++) {
-        if ((c2+2*c4+1)%3 == 0) {
-          i = (c2-c4+4)/3 ;
-          S1((c2-c4+4)/3,c4) ;
-        }
-      }
-    }
-  }
-  if ((M <= 1) && (M >= 0)) {
-    for (c2=0;c2<=3*M+N-4;c2++) {
-      for (c4=max(c2-3*M,0);c4<=c2;c4++) {
-        if ((c2+2*c4)%3 == 0) {
-          i = (c2-c4)/3 ;
-          S2((c2-c4)/3,c4) ;
-        }
-      }
-      for (c4=c2-3*M+4;c4<=min(c2+4,N);c4++) {
-        if ((c2+2*c4+1)%3 == 0) {
-          i = (c2-c4+4)/3 ;
-          S1((c2-c4+4)/3,c4) ;
-        }
-      }
-      for (c4=max(0,c2-3*M);c4<=c2;c4++) {
-        if ((c2+2*c4)%3 == 0) {
-          i = (c2-c4)/3 ;
-          S3((c2-c4)/3,c4) ;
-        }
-      }
-    }
-  }
-  for (c2=0;c2<=min(3*M-4,N-1);c2++) {
-    for (c4=0;c4<=c2;c4++) {
-      if ((c2+2*c4)%3 == 0) {
-        i = (c2-c4)/3 ;
-        S2((c2-c4)/3,c4) ;
-      }
-      if ((c2+2*c4+1)%3 == 0) {
-        i = (c2-c4+4)/3 ;
-        S1((c2-c4+4)/3,c4) ;
-      }
-    }
-    for (c4=c2+1;c4<=min(c2+4,N);c4++) {
-      if ((c2+2*c4+1)%3 == 0) {
-        i = (c2-c4+4)/3 ;
-        S1((c2-c4+4)/3,c4) ;
-      }
-    }
-    for (c4=0;c4<=c2;c4++) {
-      if ((c2+2*c4)%3 == 0) {
-        i = (c2-c4)/3 ;
-        S3((c2-c4)/3,c4) ;
-      }
-    }
-  }
-  if (M >= 2) {
-    for (c2=3*M-3;c2<=N-1;c2++) {
-      for (c4=max(c2-3*M,0);c4<=c2-3*M+3;c4++) {
-        if ((c2+2*c4)%3 == 0) {
-          i = (c2-c4)/3 ;
-          S2((c2-c4)/3,c4) ;
-        }
-      }
-      for (c4=c2-3*M+4;c4<=c2;c4++) {
-        if ((c2+2*c4)%3 == 0) {
-          i = (c2-c4)/3 ;
-          S2((c2-c4)/3,c4) ;
-        }
-        if ((c2+2*c4+1)%3 == 0) {
-          i = (c2-c4+4)/3 ;
-          S1((c2-c4+4)/3,c4) ;
-        }
-      }
-      for (c4=c2+1;c4<=min(c2+4,N);c4++) {
-        if ((c2+2*c4+1)%3 == 0) {
-          i = (c2-c4+4)/3 ;
-          S1((c2-c4+4)/3,c4) ;
-        }
-      }
-      for (c4=max(0,c2-3*M);c4<=c2;c4++) {
-        if ((c2+2*c4)%3 == 0) {
-          i = (c2-c4)/3 ;
-          S3((c2-c4)/3,c4) ;
-        }
-      }
-    }
-  }
-  if (N >= 0) {
-    for (c2=N;c2<=3*M-4;c2++) {
-      for (c4=0;c4<=N;c4++) {
-        if ((c2+2*c4)%3 == 0) {
-          i = (c2-c4)/3 ;
-          S2((c2-c4)/3,c4) ;
-        }
-        if ((c2+2*c4+1)%3 == 0) {
-          i = (c2-c4+4)/3 ;
-          S1((c2-c4+4)/3,c4) ;
-        }
-      }
-      for (c4=0;c4<=N;c4++) {
-        if ((c2+2*c4)%3 == 0) {
-          i = (c2-c4)/3 ;
-          S3((c2-c4)/3,c4) ;
-        }
-      }
-    }
-  }
-  for (c2=max(3*M-3,N);c2<=3*M+N-4;c2++) {
-    for (c4=max(c2-3*M,0);c4<=c2-3*M+3;c4++) {
-      if ((c2+2*c4)%3 == 0) {
-        i = (c2-c4)/3 ;
-        S2((c2-c4)/3,c4) ;
-      }
-    }
-    for (c4=c2-3*M+4;c4<=N;c4++) {
-      if ((c2+2*c4)%3 == 0) {
-        i = (c2-c4)/3 ;
-        S2((c2-c4)/3,c4) ;
-      }
-      if ((c2+2*c4+1)%3 == 0) {
-        i = (c2-c4+4)/3 ;
-        S1((c2-c4+4)/3,c4) ;
-      }
-    }
-    for (c4=max(0,c2-3*M);c4<=N;c4++) {
-      if ((c2+2*c4)%3 == 0) {
-        i = (c2-c4)/3 ;
-        S3((c2-c4)/3,c4) ;
-      }
-    }
-  }
-  if ((M >= 0) && (N >= 0)) {
-    for (c2=max(3*M+N-3,0);c2<=3*M+N;c2++) {
-      for (c4=max(0,c2-3*M);c4<=min(c2,N);c4++) {
-        if ((c2+2*c4)%3 == 0) {
-          i = (c2-c4)/3 ;
-          S2((c2-c4)/3,c4) ;
-        }
-      }
-      for (c4=max(0,c2-3*M);c4<=min(c2,N);c4++) {
-        if ((c2+2*c4)%3 == 0) {
-          i = (c2-c4)/3 ;
-          S3((c2-c4)/3,c4) ;
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/loechner3.c b/cloog-0.16.3/test/reservoir/loechner3.c
deleted file mode 100644
index c3967b8..0000000
--- a/cloog-0.16.3/test/reservoir/loechner3.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/loechner3.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if (M >= 1) {
-  for (c2=1;c2<=M;c2++) {
-    for (c4=2;c4<=c2+M;c4++) {
-      for (c6=max(1,-c2+c4);c6<=min(M,c4-1);c6++) {
-        S1(c2,c6,c4-c6) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/loechner3.cloog b/cloog-0.16.3/test/reservoir/loechner3.cloog
deleted file mode 100755
index 04b34cb..0000000
--- a/cloog-0.16.3/test/reservoir/loechner3.cloog
+++ /dev/null
@@ -1,39 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statments
-1
-
-1
-# { (i,j,k,l) | -i+l >= 0, j-1 >= 0, -j+l >= 0, k-1 >= 0, i-k >= 0, 1 >= 0 }
-
-    6 6
-    1   -1    0    0    1    0
-    1    0    1    0    0   -1
-    1    0   -1    0    1    0
-    1    0    0    1    0   -1
-    1    1    0   -1    0    0
-    1    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-1
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1   -1    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0   -1    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/loechner3.good.c b/cloog-0.16.3/test/reservoir/loechner3.good.c
deleted file mode 100644
index 377fb46..0000000
--- a/cloog-0.16.3/test/reservoir/loechner3.good.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/loechner3.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  for (c2=1;c2<=M;c2++) {
-    for (c4=2;c4<=c2+M;c4++) {
-      for (c6=max(1,-c2+c4);c6<=min(M,c4-1);c6++) {
-        k = c4-c6 ;
-        S1(c2,c6,c4-c6) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/loechner4.c b/cloog-0.16.3/test/reservoir/loechner4.c
deleted file mode 100644
index 8c4b9c7..0000000
--- a/cloog-0.16.3/test/reservoir/loechner4.c
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/loechner4.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.02s. */
-if (M >= 1) {
-  for (c2=2;c2<=2*M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      for (c6=1;c6<=M;c6++) {
-        for (c8=max(1,c2-M);c8<=min(M,c2-1);c8++) {
-          S1(c6,c4,c8,c2-c8) ;
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/loechner4.cloog b/cloog-0.16.3/test/reservoir/loechner4.cloog
deleted file mode 100755
index 503f56a..0000000
--- a/cloog-0.16.3/test/reservoir/loechner4.cloog
+++ /dev/null
@@ -1,44 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statments
-1
-
-1
-# { (i,j,k,l,m) | i-1 >= 0, -i+m >= 0, j-1 >= 0, -j+m >= 0, k-1 >= 0, -k+m >= 0, l-1 >= 0, -l+m >= 0, 1 >= 0 }
-
-    9 7
-    1    1    0    0    0    0   -1
-    1   -1    0    0    0    1    0
-    1    0    1    0    0    0   -1
-    1    0   -1    0    0    1    0
-    1    0    0    1    0    0   -1
-    1    0    0   -1    0    1    0
-    1    0    0    0    1    0   -1
-    1    0    0    0   -1    1    0
-    1    0    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-1
-
-   10 16
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0    0    0    0    0   -1   -1    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    0    0    0    0    0    0    1    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/loechner4.good.c b/cloog-0.16.3/test/reservoir/loechner4.good.c
deleted file mode 100644
index ecd109e..0000000
--- a/cloog-0.16.3/test/reservoir/loechner4.good.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/loechner4.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k,l) { hash(1); hash(i); hash(j); hash(k); hash(l); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6, c8;
-  /* Original iterators. */
-  int i, j, k, l;
-  for (c2=2;c2<=2*M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      for (c6=1;c6<=M;c6++) {
-        for (c8=max(1,c2-M);c8<=min(c2-1,M);c8++) {
-          l = c2-c8 ;
-          S1(c6,c4,c8,c2-c8) ;
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/loechner5.c b/cloog-0.16.3/test/reservoir/loechner5.c
deleted file mode 100644
index 3ba1f5b..0000000
--- a/cloog-0.16.3/test/reservoir/loechner5.c
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/loechner5.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.02s. */
-if (M >= 1) {
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      for (c6=1;c6<=M;c6++) {
-        for (c8=1;c8<=M;c8++) {
-          S1(c4,c6,c2,c8) ;
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/loechner5.cloog b/cloog-0.16.3/test/reservoir/loechner5.cloog
deleted file mode 100755
index f208435..0000000
--- a/cloog-0.16.3/test/reservoir/loechner5.cloog
+++ /dev/null
@@ -1,44 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statments
-1
-
-1
-# { (i,j,k,l,m) | i-1 >= 0, -i+m >= 0, j-1 >= 0, -j+m >= 0, k-1 >= 0, -k+m >= 0, l-1 >= 0, -l+m >= 0, 1 >= 0 }
-
-    9 7
-    1    1    0    0    0    0   -1
-    1   -1    0    0    0    1    0
-    1    0    1    0    0    0   -1
-    1    0   -1    0    0    1    0
-    1    0    0    1    0    0   -1
-    1    0    0   -1    0    1    0
-    1    0    0    0    1    0   -1
-    1    0    0    0   -1    1    0
-    1    0    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-1
-
-   10 16
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0    0    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0    0   -1    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    0    1    0    0    0    0   -1    0    0
-    0    0    0    0    0    0    0    0    0    1    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/loechner5.good.c b/cloog-0.16.3/test/reservoir/loechner5.good.c
deleted file mode 100644
index 937c118..0000000
--- a/cloog-0.16.3/test/reservoir/loechner5.good.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/loechner5.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k,l) { hash(1); hash(i); hash(j); hash(k); hash(l); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6, c8;
-  /* Original iterators. */
-  int i, j, k, l;
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      for (c6=1;c6<=M;c6++) {
-        for (c8=1;c8<=M;c8++) {
-          S1(c4,c6,c2,c8) ;
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/mg-interp.c b/cloog-0.16.3/test/reservoir/mg-interp.c
deleted file mode 100644
index 3ed1fcf..0000000
--- a/cloog-0.16.3/test/reservoir/mg-interp.c
+++ /dev/null
@@ -1,219 +0,0 @@
-/* Generated from ../../../git/cloog/test/reservoir/mg-interp.cloog by CLooG 0.16.2-5-g590827b gmp bits in 0.29s. */
-if ((M >= 2) && (N >= 2)) {
-  for (c2=1;c2<=O-1;c2++) {
-    for (c6=1;c6<=M;c6++) {
-      S1(c2,1,c6);
-    }
-    if (N == 2) {
-      for (c6=1;c6<=M-1;c6++) {
-        S6(c2,1,c6);
-        S7(c2,1,c6);
-      }
-    }
-    if (N >= 3) {
-      for (c6=1;c6<=M-1;c6++) {
-        S6(c2,1,c6);
-        S7(c2,1,c6);
-      }
-    }
-    if (N == 2) {
-      for (c6=1;c6<=M;c6++) {
-        S3(c2,1,c6);
-      }
-    }
-    if (N == 2) {
-      for (c6=1;c6<=M-1;c6++) {
-        S11(c2,1,c6);
-      }
-    }
-    if (N >= 3) {
-      for (c6=1;c6<=M;c6++) {
-        S3(c2,1,c6);
-      }
-      for (c6=1;c6<=M;c6++) {
-        S1(c2,2,c6);
-      }
-    }
-    if (N == 3) {
-      for (c6=1;c6<=M-1;c6++) {
-        S6(c2,2,c6);
-        S7(c2,2,c6);
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S11(c2,1,c6);
-      }
-    }
-    if (N >= 4) {
-      for (c6=1;c6<=M-1;c6++) {
-        S6(c2,2,c6);
-        S7(c2,2,c6);
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S11(c2,1,c6);
-      }
-    }
-    for (c4=3;c4<=2*N-5;c4++) {
-      for (c6=1;c6<=M-1;c6++) {
-        if ((c4+1)%2 == 0) {
-          S10(c2,(c4-1)/2,c6);
-        }
-      }
-      for (c6=1;c6<=M;c6++) {
-        if ((c4+1)%2 == 0) {
-          S3(c2,(c4+1)/2,c6);
-        }
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        if (c4%2 == 0) {
-          S6(c2,(c4+2)/2,c6);
-        }
-        if ((c4+1)%2 == 0) {
-          S1(c2,(c4+3)/2,c6);
-        }
-        if (c4%2 == 0) {
-          S7(c2,(c4+2)/2,c6);
-        }
-      }
-      if ((c4+1)%2 == 0) {
-        S1(c2,(c4+3)/2,M);
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        if (c4%2 == 0) {
-          S11(c2,c4/2,c6);
-        }
-      }
-    }
-    if (N >= 4) {
-      for (c6=1;c6<=M-1;c6++) {
-        S6(c2,N-1,c6);
-        S7(c2,N-1,c6);
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S11(c2,N-2,c6);
-      }
-    }
-    if (N >= 3) {
-      for (c6=1;c6<=M-1;c6++) {
-        S10(c2,N-2,c6);
-      }
-      for (c6=1;c6<=M;c6++) {
-        S3(c2,N-1,c6);
-      }
-    }
-    if (N >= 3) {
-      for (c6=1;c6<=M-1;c6++) {
-        S11(c2,N-1,c6);
-      }
-    }
-    for (c6=1;c6<=M-1;c6++) {
-      S10(c2,N-1,c6);
-    }
-  }
-}
-if ((M == 1) && (N >= 2)) {
-  for (c2=1;c2<=O-1;c2++) {
-    S1(c2,1,1);
-    for (c4=1;c4<=2*N-5;c4++) {
-      if ((c4+1)%2 == 0) {
-        S3(c2,(c4+1)/2,1);
-      }
-      if ((c4+1)%2 == 0) {
-        S1(c2,(c4+3)/2,1);
-      }
-    }
-    S3(c2,N-1,1);
-  }
-}
-if ((M >= 2) && (N >= 2)) {
-  for (c2=1;c2<=O-1;c2++) {
-    for (c6=1;c6<=M;c6++) {
-      S2(c2,1,c6);
-    }
-    for (c6=1;c6<=M-1;c6++) {
-      S8(c2,1,c6);
-    }
-    for (c4=3;c4<=2*N-2;c4++) {
-      for (c6=1;c6<=M;c6++) {
-        if (c4%2 == 0) {
-          S2(c2,c4/2,c6);
-        }
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        if (c4%2 == 0) {
-          S8(c2,c4/2,c6);
-        }
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        if ((c4+1)%2 == 0) {
-          S9(c2,(c4-1)/2,c6);
-        }
-      }
-    }
-    for (c6=1;c6<=M-1;c6++) {
-      S9(c2,N-1,c6);
-    }
-  }
-}
-if ((M == 1) && (N >= 2)) {
-  for (c2=1;c2<=O-1;c2++) {
-    for (c4=2;c4<=2*N-2;c4++) {
-      if (c4%2 == 0) {
-        S2(c2,c4/2,1);
-      }
-    }
-  }
-}
-if ((M >= 2) && (N >= 2)) {
-  for (c2=1;c2<=O-1;c2++) {
-    for (c4=1;c4<=N-1;c4++) {
-      for (c6=1;c6<=M-1;c6++) {
-        S4(c2,c4,c6);
-      }
-    }
-  }
-}
-if ((M >= 2) && (N >= 2)) {
-  for (c2=1;c2<=O-1;c2++) {
-    for (c4=1;c4<=N-1;c4++) {
-      for (c6=1;c6<=M-1;c6++) {
-        S5(c2,c4,c6);
-      }
-    }
-  }
-}
-if ((M >= P+1) && (N >= Q+1)) {
-  for (c2=R;c2<=O-1;c2++) {
-    for (c4=Q;c4<=N-1;c4++) {
-      for (c6=P;c6<=M-1;c6++) {
-        S12(c2,c4,c6);
-      }
-    }
-  }
-}
-if ((M >= 2) && (N >= Q+1)) {
-  for (c2=R;c2<=O-1;c2++) {
-    for (c4=Q;c4<=N-1;c4++) {
-      for (c6=1;c6<=M-1;c6++) {
-        S13(c2,c4,c6);
-      }
-    }
-  }
-}
-if ((M >= P+1) && (N >= 2)) {
-  for (c2=R;c2<=O-1;c2++) {
-    for (c4=1;c4<=N-1;c4++) {
-      for (c6=P;c6<=M-1;c6++) {
-        S14(c2,c4,c6);
-      }
-    }
-  }
-}
-if ((M >= 2) && (N >= 2)) {
-  for (c2=R;c2<=O-1;c2++) {
-    for (c4=1;c4<=N-1;c4++) {
-      for (c6=1;c6<=M-1;c6++) {
-        S15(c2,c4,c6);
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/mg-interp.cloog b/cloog-0.16.3/test/reservoir/mg-interp.cloog
deleted file mode 100755
index 9d08463..0000000
--- a/cloog-0.16.3/test/reservoir/mg-interp.cloog
+++ /dev/null
@@ -1,376 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 11
-    1    0    0    0    0    0    0    0    0    0    1
-0
-
-# Number of statments
-15
-
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-q >= 0, -i+n-1 >= 0, j-p >= 0, -j+m-1 >= 0, k-o >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0   -1    0    0    0    0
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0   -1    0    0    0    0    0
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0   -1    0    0    0    0    0    0
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-q >= 0, -i+n-1 >= 0, j-p >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0   -1    0    0    0    0
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0   -1    0    0    0    0    0
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-q >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-o >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0   -1    0    0    0    0
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0   -1    0    0    0    0    0    0
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-q >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0   -1    0    0    0    0
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-15
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    0    0    0    0    0    0    3
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -2
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    0    0    0    0    0    0    1
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0   -2
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -2
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -3
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    0    0    0    0    0    0    2
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -2
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    0    0    0    0    0    0    2
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -2
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -3
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -4
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -4
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -5
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -6
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -7
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/mg-interp.good.c b/cloog-0.16.3/test/reservoir/mg-interp.good.c
deleted file mode 100644
index 7f919c8..0000000
--- a/cloog-0.16.3/test/reservoir/mg-interp.good.c
+++ /dev/null
@@ -1,318 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/mg-interp.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 1.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-#define S3(i,j,k) { hash(3); hash(i); hash(j); hash(k); }
-#define S4(i,j,k) { hash(4); hash(i); hash(j); hash(k); }
-#define S5(i,j,k) { hash(5); hash(i); hash(j); hash(k); }
-#define S6(i,j,k) { hash(6); hash(i); hash(j); hash(k); }
-#define S7(i,j,k) { hash(7); hash(i); hash(j); hash(k); }
-#define S8(i,j,k) { hash(8); hash(i); hash(j); hash(k); }
-#define S9(i,j,k) { hash(9); hash(i); hash(j); hash(k); }
-#define S10(i,j,k) { hash(10); hash(i); hash(j); hash(k); }
-#define S11(i,j,k) { hash(11); hash(i); hash(j); hash(k); }
-#define S12(i,j,k) { hash(12); hash(i); hash(j); hash(k); }
-#define S13(i,j,k) { hash(13); hash(i); hash(j); hash(k); }
-#define S14(i,j,k) { hash(14); hash(i); hash(j); hash(k); }
-#define S15(i,j,k) { hash(15); hash(i); hash(j); hash(k); }
-
-void test(int M, int N, int O, int P, int Q, int R, int S, int T, int U)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  if ((M >= 2) && (N >= 4)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c6=1;c6<=M;c6++) {
-        S1(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S6(c2,1,c6) ;
-        S7(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M;c6++) {
-        S3(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S1(c2,2,c6) ;
-      }
-      S1(c2,2,M) ;
-      for (c6=1;c6<=M-1;c6++) {
-        S6(c2,2,c6) ;
-        S7(c2,2,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S11(c2,1,c6) ;
-      }
-      for (c4=3;c4<=2*N-5;c4++) {
-        for (c6=1;c6<=M-1;c6++) {
-          if ((c4+1)%2 == 0) {
-            j = (c4-1)/2 ;
-            S10(c2,(c4-1)/2,c6) ;
-          }
-        }
-        for (c6=1;c6<=M;c6++) {
-          if ((c4+1)%2 == 0) {
-            j = (c4+1)/2 ;
-            S3(c2,(c4+1)/2,c6) ;
-          }
-        }
-        for (c6=1;c6<=M-1;c6++) {
-          if (c4%2 == 0) {
-            j = (c4+2)/2 ;
-            S6(c2,(c4+2)/2,c6) ;
-            S7(c2,(c4+2)/2,c6) ;
-          }
-          if ((c4+1)%2 == 0) {
-            j = (c4+3)/2 ;
-            S1(c2,(c4+3)/2,c6) ;
-          }
-        }
-        if ((c4+1)%2 == 0) {
-          j = (c4+3)/2 ;
-          S1(c2,(c4+3)/2,M) ;
-        }
-        for (c6=1;c6<=M-1;c6++) {
-          if (c4%2 == 0) {
-            S11(c2,c4/2,c6) ;
-          }
-        }
-      }
-      c4 = 2*N-4 ;
-      for (c6=1;c6<=M-1;c6++) {
-        j = N-1 ;
-        S6(c2,N-1,c6) ;
-        S7(c2,N-1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        j = N-2 ;
-        S11(c2,N-2,c6) ;
-      }
-      c4 = 2*N-3 ;
-      for (c6=1;c6<=M-1;c6++) {
-        j = N-2 ;
-        S10(c2,N-2,c6) ;
-      }
-      for (c6=1;c6<=M;c6++) {
-        j = N-1 ;
-        S3(c2,N-1,c6) ;
-      }
-      c4 = 2*N-2 ;
-      for (c6=1;c6<=M-1;c6++) {
-        j = N-1 ;
-        S11(c2,N-1,c6) ;
-      }
-      c4 = 2*N-1 ;
-      for (c6=1;c6<=M-1;c6++) {
-        j = N-1 ;
-        S10(c2,N-1,c6) ;
-      }
-    }
-  }
-  if ((M >= 2) && (N == 3)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c6=1;c6<=M;c6++) {
-        S1(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S6(c2,1,c6) ;
-        S7(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M;c6++) {
-        S3(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S1(c2,2,c6) ;
-      }
-      S1(c2,2,M) ;
-      for (c6=1;c6<=M-1;c6++) {
-        S6(c2,2,c6) ;
-        S7(c2,2,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S11(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S10(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M;c6++) {
-        S3(c2,2,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S11(c2,2,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S10(c2,2,c6) ;
-      }
-    }
-  }
-  if ((M >= 2) && (N == 2)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c6=1;c6<=M;c6++) {
-        S1(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S6(c2,1,c6) ;
-        S7(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M;c6++) {
-        S3(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S11(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S10(c2,1,c6) ;
-      }
-    }
-  }
-  if ((M == 1) && (N >= 3)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=-1;c4<=0;c4++) {
-        if ((c4+1)%2 == 0) {
-          j = (c4+3)/2 ;
-          S1(c2,(c4+3)/2,1) ;
-        }
-      }
-      for (c4=1;c4<=2*N-5;c4++) {
-        if ((c4+1)%2 == 0) {
-          j = (c4+1)/2 ;
-          S3(c2,(c4+1)/2,1) ;
-        }
-        if ((c4+1)%2 == 0) {
-          j = (c4+3)/2 ;
-          S1(c2,(c4+3)/2,1) ;
-        }
-      }
-      for (c4=2*N-4;c4<=2*N-3;c4++) {
-        if ((c4+1)%2 == 0) {
-          j = (c4+1)/2 ;
-          S3(c2,(c4+1)/2,1) ;
-        }
-      }
-    }
-  }
-  if ((M == 1) && (N == 2)) {
-    for (c2=1;c2<=O-1;c2++) {
-      S1(c2,1,1) ;
-      S3(c2,1,1) ;
-    }
-  }
-  if ((M >= 2) && (N >= 3)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c6=1;c6<=M;c6++) {
-        S2(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S8(c2,1,c6) ;
-      }
-      for (c4=3;c4<=2*N-2;c4++) {
-        for (c6=1;c6<=M;c6++) {
-          if (c4%2 == 0) {
-            S2(c2,c4/2,c6) ;
-          }
-        }
-        for (c6=1;c6<=M-1;c6++) {
-          if (c4%2 == 0) {
-            S8(c2,c4/2,c6) ;
-          }
-        }
-        for (c6=1;c6<=M-1;c6++) {
-          if ((c4+1)%2 == 0) {
-            j = (c4-1)/2 ;
-            S9(c2,(c4-1)/2,c6) ;
-          }
-        }
-      }
-      c4 = 2*N-1 ;
-      for (c6=1;c6<=M-1;c6++) {
-        j = N-1 ;
-        S9(c2,N-1,c6) ;
-      }
-    }
-  }
-  if ((M >= 2) && (N == 2)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c6=1;c6<=M;c6++) {
-        S2(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S8(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S9(c2,1,c6) ;
-      }
-    }
-  }
-  if ((M == 1) && (N >= 2)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=2;c4<=2*N-2;c4++) {
-        if (c4%2 == 0) {
-          S2(c2,c4/2,1) ;
-        }
-      }
-    }
-  }
-  if ((M >= 2) && (N >= 2)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=1;c4<=N-1;c4++) {
-        for (c6=1;c6<=M-1;c6++) {
-          S4(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-  if ((M >= 2) && (N >= 2)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=1;c4<=N-1;c4++) {
-        for (c6=1;c6<=M-1;c6++) {
-          S5(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-  if ((M >= P+1) && (N >= Q+1)) {
-    for (c2=R;c2<=O-1;c2++) {
-      for (c4=Q;c4<=N-1;c4++) {
-        for (c6=P;c6<=M-1;c6++) {
-          S12(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-  if ((M >= 2) && (N >= Q+1)) {
-    for (c2=R;c2<=O-1;c2++) {
-      for (c4=Q;c4<=N-1;c4++) {
-        for (c6=1;c6<=M-1;c6++) {
-          S13(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-  if ((M >= P+1) && (N >= 2)) {
-    for (c2=R;c2<=O-1;c2++) {
-      for (c4=1;c4<=N-1;c4++) {
-        for (c6=P;c6<=M-1;c6++) {
-          S14(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-  if ((M >= 2) && (N >= 2)) {
-    for (c2=R;c2<=O-1;c2++) {
-      for (c4=1;c4<=N-1;c4++) {
-        for (c6=1;c6<=M-1;c6++) {
-          S15(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/mg-interp2.c b/cloog-0.16.3/test/reservoir/mg-interp2.c
deleted file mode 100644
index 688cc91..0000000
--- a/cloog-0.16.3/test/reservoir/mg-interp2.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/mg-interp2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.11s. */
-if (O >= 2) {
-  if ((M >= P+1) && (N >= Q+1)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=Q;c4<=N-1;c4++) {
-        for (c6=P;c6<=M-1;c6++) {
-          S1(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-  if ((M >= 2) && (N >= Q+1)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=Q;c4<=N-1;c4++) {
-        for (c6=1;c6<=M-1;c6++) {
-          S2(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-  if ((M >= P+1) && (N >= 2)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=1;c4<=N-1;c4++) {
-        for (c6=P;c6<=M-1;c6++) {
-          S3(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-  if ((M >= 2) && (N >= 2)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=1;c4<=N-1;c4++) {
-        for (c6=1;c6<=M-1;c6++) {
-          S4(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/mg-interp2.cloog b/cloog-0.16.3/test/reservoir/mg-interp2.cloog
deleted file mode 100755
index d1218bc..0000000
--- a/cloog-0.16.3/test/reservoir/mg-interp2.cloog
+++ /dev/null
@@ -1,112 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 11
-    1    0    0    0    0    0    0    0    0    0    1
-0
-
-# Number of statments
-4
-
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-p >= 0, -j+m-1 >= 0, k-o >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0   -1    0    0    0    0    0
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0   -1    0    0    0    0    0    0
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-p >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0   -1    0    0    0    0    0
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-o >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0   -1    0    0    0    0    0    0
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-4
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -2
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -3
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/mg-interp2.good.c b/cloog-0.16.3/test/reservoir/mg-interp2.good.c
deleted file mode 100644
index 2e1f365..0000000
--- a/cloog-0.16.3/test/reservoir/mg-interp2.good.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/mg-interp2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.07s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-#define S3(i,j,k) { hash(3); hash(i); hash(j); hash(k); }
-#define S4(i,j,k) { hash(4); hash(i); hash(j); hash(k); }
-
-void test(int M, int N, int O, int P, int Q, int R, int S, int T, int U)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  if ((M >= P+1) && (N >= Q+1)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=Q;c4<=N-1;c4++) {
-        for (c6=P;c6<=M-1;c6++) {
-          S1(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-  if ((M >= 2) && (N >= Q+1)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=Q;c4<=N-1;c4++) {
-        for (c6=1;c6<=M-1;c6++) {
-          S2(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-  if ((M >= P+1) && (N >= 2)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=1;c4<=N-1;c4++) {
-        for (c6=P;c6<=M-1;c6++) {
-          S3(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-  if ((M >= 2) && (N >= 2)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=1;c4<=N-1;c4++) {
-        for (c6=1;c6<=M-1;c6++) {
-          S4(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/mg-psinv.c b/cloog-0.16.3/test/reservoir/mg-psinv.c
deleted file mode 100644
index a0447e1..0000000
--- a/cloog-0.16.3/test/reservoir/mg-psinv.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/./reservoir/mg-psinv.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.02s. */
-if ((M >= 1) && (N >= 3) && (O >= 3)) {
-  if (M >= 3) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c6=1;c6<=M;c6++) {
-        S1(c2,2,c6);
-        S2(c2,2,c6);
-      }
-      for (c4=4;c4<=2*N-3;c4++) {
-        for (c6=1;c6<=M;c6++) {
-          if ((c4+1)%2 == 0) {
-            S1(c2,(c4+1)/2,c6);
-            S2(c2,(c4+1)/2,c6);
-          }
-        }
-        for (c6=2;c6<=M-1;c6++) {
-          if (c4%2 == 0) {
-            S3(c2,c4/2,c6);
-          }
-        }
-      }
-      for (c6=2;c6<=M-1;c6++) {
-        S3(c2,N-1,c6);
-      }
-    }
-  }
-  if (M <= 2) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c4=3;c4<=2*N-3;c4++) {
-        for (c6=1;c6<=M;c6++) {
-          if ((c4+1)%2 == 0) {
-            S1(c2,(c4+1)/2,c6);
-            S2(c2,(c4+1)/2,c6);
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/mg-psinv.cloog b/cloog-0.16.3/test/reservoir/mg-psinv.cloog
deleted file mode 100755
index 7f0dd2c..0000000
--- a/cloog-0.16.3/test/reservoir/mg-psinv.cloog
+++ /dev/null
@@ -1,88 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 5
-    1    0    0    0    1
-0
-
-# Number of statments
-3
-
-1
-# { (i,j,k,l,m,n) | i-2 >= 0, -i+n-1 >= 0, j-2 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l >= 0, 1 >= 0 }
-
-    7 8
-    1    1    0    0    0    0    0   -2
-    1   -1    0    0    0    0    1   -1
-    1    0    1    0    0    0    0   -2
-    1    0   -1    0    0    1    0   -1
-    1    0    0    1    0    0    0   -1
-    1    0    0   -1    1    0    0    0
-    1    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n) | i-2 >= 0, -i+n-1 >= 0, j-2 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l >= 0, 1 >= 0 }
-
-    7 8
-    1    1    0    0    0    0    0   -2
-    1   -1    0    0    0    0    1   -1
-    1    0    1    0    0    0    0   -2
-    1    0   -1    0    0    1    0   -1
-    1    0    0    1    0    0    0   -1
-    1    0    0   -1    1    0    0    0
-    1    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n) | i-2 >= 0, -i+n-1 >= 0, j-2 >= 0, -j+m-1 >= 0, k-2 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 8
-    1    1    0    0    0    0    0   -2
-    1   -1    0    0    0    0    1   -1
-    1    0    1    0    0    0    0   -2
-    1    0   -1    0    0    1    0   -1
-    1    0    0    1    0    0    0   -2
-    1    0    0   -1    1    0    0   -1
-    1    0    0    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-3
-
-    8 15
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    1
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 15
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    1
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 15
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/mg-psinv.good.c b/cloog-0.16.3/test/reservoir/mg-psinv.good.c
deleted file mode 100644
index cb5b57c..0000000
--- a/cloog-0.16.3/test/reservoir/mg-psinv.good.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/mg-psinv.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.05s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-#define S3(i,j,k) { hash(3); hash(i); hash(j); hash(k); }
-
-void test(int M, int N, int O)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  if ((M >= 3) && (N >= 4)) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c6=1;c6<=M;c6++) {
-        S1(c2,2,c6) ;
-        S2(c2,2,c6) ;
-      }
-      for (c4=4;c4<=2*N-3;c4++) {
-        for (c6=1;c6<=M;c6++) {
-          if ((c4+1)%2 == 0) {
-            j = (c4+1)/2 ;
-            S1(c2,(c4+1)/2,c6) ;
-            S2(c2,(c4+1)/2,c6) ;
-          }
-        }
-        for (c6=2;c6<=M-1;c6++) {
-          if (c4%2 == 0) {
-            S3(c2,c4/2,c6) ;
-          }
-        }
-      }
-      c4 = 2*N-2 ;
-      for (c6=2;c6<=M-1;c6++) {
-        j = N-1 ;
-        S3(c2,N-1,c6) ;
-      }
-    }
-  }
-  if ((M >= 3) && (N == 3)) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c6=1;c6<=M;c6++) {
-        S1(c2,2,c6) ;
-        S2(c2,2,c6) ;
-      }
-      for (c6=2;c6<=M-1;c6++) {
-        S3(c2,2,c6) ;
-      }
-    }
-  }
-  if ((M >= 1) && (M <= 2) && (N >= 3)) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c4=3;c4<=2*N-3;c4++) {
-        for (c6=1;c6<=M;c6++) {
-          if ((c4+1)%2 == 0) {
-            j = (c4+1)/2 ;
-            S1(c2,(c4+1)/2,c6) ;
-            S2(c2,(c4+1)/2,c6) ;
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/mg-resid.c b/cloog-0.16.3/test/reservoir/mg-resid.c
deleted file mode 100644
index 89a3cda..0000000
--- a/cloog-0.16.3/test/reservoir/mg-resid.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/./reservoir/mg-resid.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.03s. */
-if ((M >= 1) && (N >= 3) && (O >= 3)) {
-  if (M >= 3) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c6=1;c6<=M;c6++) {
-        S1(c2,2,c6);
-        S2(c2,2,c6);
-      }
-      for (c4=4;c4<=2*N-3;c4++) {
-        for (c6=1;c6<=M;c6++) {
-          if ((c4+1)%2 == 0) {
-            S1(c2,(c4+1)/2,c6);
-            S2(c2,(c4+1)/2,c6);
-          }
-        }
-        for (c6=2;c6<=M-1;c6++) {
-          if (c4%2 == 0) {
-            S3(c2,c4/2,c6);
-          }
-        }
-      }
-      for (c6=2;c6<=M-1;c6++) {
-        S3(c2,N-1,c6);
-      }
-    }
-  }
-  if (M <= 2) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c4=3;c4<=2*N-3;c4++) {
-        for (c6=1;c6<=M;c6++) {
-          if ((c4+1)%2 == 0) {
-            S1(c2,(c4+1)/2,c6);
-            S2(c2,(c4+1)/2,c6);
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/mg-resid.cloog b/cloog-0.16.3/test/reservoir/mg-resid.cloog
deleted file mode 100755
index 7f0dd2c..0000000
--- a/cloog-0.16.3/test/reservoir/mg-resid.cloog
+++ /dev/null
@@ -1,88 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 5
-    1    0    0    0    1
-0
-
-# Number of statments
-3
-
-1
-# { (i,j,k,l,m,n) | i-2 >= 0, -i+n-1 >= 0, j-2 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l >= 0, 1 >= 0 }
-
-    7 8
-    1    1    0    0    0    0    0   -2
-    1   -1    0    0    0    0    1   -1
-    1    0    1    0    0    0    0   -2
-    1    0   -1    0    0    1    0   -1
-    1    0    0    1    0    0    0   -1
-    1    0    0   -1    1    0    0    0
-    1    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n) | i-2 >= 0, -i+n-1 >= 0, j-2 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l >= 0, 1 >= 0 }
-
-    7 8
-    1    1    0    0    0    0    0   -2
-    1   -1    0    0    0    0    1   -1
-    1    0    1    0    0    0    0   -2
-    1    0   -1    0    0    1    0   -1
-    1    0    0    1    0    0    0   -1
-    1    0    0   -1    1    0    0    0
-    1    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n) | i-2 >= 0, -i+n-1 >= 0, j-2 >= 0, -j+m-1 >= 0, k-2 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 8
-    1    1    0    0    0    0    0   -2
-    1   -1    0    0    0    0    1   -1
-    1    0    1    0    0    0    0   -2
-    1    0   -1    0    0    1    0   -1
-    1    0    0    1    0    0    0   -2
-    1    0    0   -1    1    0    0   -1
-    1    0    0    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-3
-
-    8 15
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    1
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 15
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    1
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 15
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/mg-resid.good.c b/cloog-0.16.3/test/reservoir/mg-resid.good.c
deleted file mode 100644
index 4056aab..0000000
--- a/cloog-0.16.3/test/reservoir/mg-resid.good.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/mg-resid.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.05s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-#define S3(i,j,k) { hash(3); hash(i); hash(j); hash(k); }
-
-void test(int M, int N, int O)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  if ((M >= 3) && (N >= 4)) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c6=1;c6<=M;c6++) {
-        S1(c2,2,c6) ;
-        S2(c2,2,c6) ;
-      }
-      for (c4=4;c4<=2*N-3;c4++) {
-        for (c6=1;c6<=M;c6++) {
-          if ((c4+1)%2 == 0) {
-            j = (c4+1)/2 ;
-            S1(c2,(c4+1)/2,c6) ;
-            S2(c2,(c4+1)/2,c6) ;
-          }
-        }
-        for (c6=2;c6<=M-1;c6++) {
-          if (c4%2 == 0) {
-            S3(c2,c4/2,c6) ;
-          }
-        }
-      }
-      c4 = 2*N-2 ;
-      for (c6=2;c6<=M-1;c6++) {
-        j = N-1 ;
-        S3(c2,N-1,c6) ;
-      }
-    }
-  }
-  if ((M >= 3) && (N == 3)) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c6=1;c6<=M;c6++) {
-        S1(c2,2,c6) ;
-        S2(c2,2,c6) ;
-      }
-      for (c6=2;c6<=M-1;c6++) {
-        S3(c2,2,c6) ;
-      }
-    }
-  }
-  if ((M >= 1) && (M <= 2) && (N >= 3)) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c4=3;c4<=2*N-3;c4++) {
-        for (c6=1;c6<=M;c6++) {
-          if ((c4+1)%2 == 0) {
-            j = (c4+1)/2 ;
-            S1(c2,(c4+1)/2,c6) ;
-            S2(c2,(c4+1)/2,c6) ;
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/mg-rprj3.c b/cloog-0.16.3/test/reservoir/mg-rprj3.c
deleted file mode 100644
index f7f7a4d..0000000
--- a/cloog-0.16.3/test/reservoir/mg-rprj3.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/./reservoir/mg-rprj3.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.10s. */
-if ((M >= 2) && (N >= 3) && (O >= 3)) {
-  if (M >= 3) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c6=2;c6<=M;c6++) {
-        S1(c2,2,c6);
-      }
-      for (c4=3;c4<=N-1;c4++) {
-        for (c6=2;c6<=M;c6++) {
-          S2(c2,c4-1,c6);
-        }
-        S4(c2,c4-1,2);
-        for (c6=2;c6<=M-2;c6++) {
-          S3(c2,c4-1,c6);
-          S5(c2,c4-1,c6);
-          S4(c2,c4-1,c6+1);
-        }
-        S3(c2,c4-1,M-1);
-        S5(c2,c4-1,M-1);
-        for (c6=2;c6<=M;c6++) {
-          S1(c2,c4,c6);
-        }
-      }
-      for (c6=2;c6<=M;c6++) {
-        S2(c2,N-1,c6);
-      }
-      S4(c2,N-1,2);
-      for (c6=2;c6<=M-2;c6++) {
-        S3(c2,N-1,c6);
-        S5(c2,N-1,c6);
-        S4(c2,N-1,c6+1);
-      }
-      S3(c2,N-1,M-1);
-      S5(c2,N-1,M-1);
-    }
-  }
-  if (M == 2) {
-    for (c2=2;c2<=O-1;c2++) {
-      S1(c2,2,2);
-      for (c4=3;c4<=N-1;c4++) {
-        S2(c2,c4-1,2);
-        S1(c2,c4,2);
-      }
-      S2(c2,N-1,2);
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/mg-rprj3.cloog b/cloog-0.16.3/test/reservoir/mg-rprj3.cloog
deleted file mode 100755
index adf72fd..0000000
--- a/cloog-0.16.3/test/reservoir/mg-rprj3.cloog
+++ /dev/null
@@ -1,136 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 8
-    1    0    0    0    0    0    0    1
-0
-
-# Number of statments
-5
-
-1
-# { (i,j,k,l,m,n,o,p,q) | i-2 >= 0, -i+n-1 >= 0, j-2 >= 0, -j+m-1 >= 0, k-2 >= 0, -k+l >= 0, 1 >= 0 }
-
-    7 11
-    1    1    0    0    0    0    0    0    0    0   -2
-    1   -1    0    0    0    0    1    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0   -2
-    1    0   -1    0    0    1    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0   -2
-    1    0    0   -1    1    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q) | i-2 >= 0, -i+n-1 >= 0, j-2 >= 0, -j+m-1 >= 0, k-2 >= 0, -k+l >= 0, 1 >= 0 }
-
-    7 11
-    1    1    0    0    0    0    0    0    0    0   -2
-    1   -1    0    0    0    0    1    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0   -2
-    1    0   -1    0    0    1    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0   -2
-    1    0    0   -1    1    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q) | i-2 >= 0, -i+n-1 >= 0, j-2 >= 0, -j+m-1 >= 0, k-2 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 11
-    1    1    0    0    0    0    0    0    0    0   -2
-    1   -1    0    0    0    0    1    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0   -2
-    1    0   -1    0    0    1    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0   -2
-    1    0    0   -1    1    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q) | i-2 >= 0, -i+n-1 >= 0, j-2 >= 0, -j+m-1 >= 0, k-2 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 11
-    1    1    0    0    0    0    0    0    0    0   -2
-    1   -1    0    0    0    0    1    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0   -2
-    1    0   -1    0    0    1    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0   -2
-    1    0    0   -1    1    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q) | i-2 >= 0, -i+n-1 >= 0, j-2 >= 0, -j+m-1 >= 0, k-2 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 11
-    1    1    0    0    0    0    0    0    0    0   -2
-    1   -1    0    0    0    0    1    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0   -2
-    1    0   -1    0    0    1    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0   -2
-    1    0    0   -1    1    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-5
-
-    8 18
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0   -2
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 18
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 18
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 18
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    1
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0   -2
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 18
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/mg-rprj3.good.c b/cloog-0.16.3/test/reservoir/mg-rprj3.good.c
deleted file mode 100644
index 38ac53e..0000000
--- a/cloog-0.16.3/test/reservoir/mg-rprj3.good.c
+++ /dev/null
@@ -1,163 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/mg-rprj3.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.39s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-#define S3(i,j,k) { hash(3); hash(i); hash(j); hash(k); }
-#define S4(i,j,k) { hash(4); hash(i); hash(j); hash(k); }
-#define S5(i,j,k) { hash(5); hash(i); hash(j); hash(k); }
-
-void test(int M, int N, int O, int P, int Q, int R)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  if ((M >= 4) && (N >= 4)) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c6=2;c6<=M;c6++) {
-        S1(c2,2,c6) ;
-      }
-      for (c4=3;c4<=N-1;c4++) {
-        for (c6=2;c6<=M;c6++) {
-          j = c4-1 ;
-          S2(c2,c4-1,c6) ;
-        }
-        j = c4-1 ;
-        S4(c2,c4-1,2) ;
-        for (c6=2;c6<=M-2;c6++) {
-          j = c4-1 ;
-          S3(c2,c4-1,c6) ;
-          j = c4-1 ;
-          S5(c2,c4-1,c6) ;
-          j = c4-1 ;
-          k = c6+1 ;
-          S4(c2,c4-1,c6+1) ;
-        }
-        c6 = M-1 ;
-        j = c4-1 ;
-        k = M-1 ;
-        S3(c2,c4-1,M-1) ;
-        j = c4-1 ;
-        k = M-1 ;
-        S5(c2,c4-1,M-1) ;
-        for (c6=2;c6<=M;c6++) {
-          S1(c2,c4,c6) ;
-        }
-      }
-      for (c6=2;c6<=M;c6++) {
-        j = N-1 ;
-        S2(c2,N-1,c6) ;
-      }
-      j = N-1 ;
-      S4(c2,N-1,2) ;
-      for (c6=2;c6<=M-2;c6++) {
-        j = N-1 ;
-        S3(c2,N-1,c6) ;
-        j = N-1 ;
-        S5(c2,N-1,c6) ;
-        j = N-1 ;
-        k = c6+1 ;
-        S4(c2,N-1,c6+1) ;
-      }
-      c6 = M-1 ;
-      j = N-1 ;
-      k = M-1 ;
-      S3(c2,N-1,M-1) ;
-      j = N-1 ;
-      k = M-1 ;
-      S5(c2,N-1,M-1) ;
-    }
-  }
-  if ((M >= 4) && (N == 3)) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c6=2;c6<=M;c6++) {
-        S1(c2,2,c6) ;
-      }
-      for (c6=2;c6<=M;c6++) {
-        S2(c2,2,c6) ;
-      }
-      S4(c2,2,2) ;
-      for (c6=2;c6<=M-2;c6++) {
-        S3(c2,2,c6) ;
-        S5(c2,2,c6) ;
-        k = c6+1 ;
-        S4(c2,2,c6+1) ;
-      }
-      c6 = M-1 ;
-      k = M-1 ;
-      S3(c2,2,M-1) ;
-      k = M-1 ;
-      S5(c2,2,M-1) ;
-    }
-  }
-  if ((M == 3) && (N == 3)) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c6=2;c6<=3;c6++) {
-        S1(c2,2,c6) ;
-      }
-      for (c6=2;c6<=3;c6++) {
-        S2(c2,2,c6) ;
-      }
-      S4(c2,2,2) ;
-      S3(c2,2,2) ;
-      S5(c2,2,2) ;
-    }
-  }
-  if ((M == 3) && (N >= 4)) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c6=2;c6<=3;c6++) {
-        S1(c2,2,c6) ;
-      }
-      for (c4=3;c4<=N-1;c4++) {
-        for (c6=2;c6<=3;c6++) {
-          j = c4-1 ;
-          S2(c2,c4-1,c6) ;
-        }
-        j = c4-1 ;
-        S4(c2,c4-1,2) ;
-        j = c4-1 ;
-        S3(c2,c4-1,2) ;
-        j = c4-1 ;
-        S5(c2,c4-1,2) ;
-        for (c6=2;c6<=3;c6++) {
-          S1(c2,c4,c6) ;
-        }
-      }
-      for (c6=2;c6<=3;c6++) {
-        j = N-1 ;
-        S2(c2,N-1,c6) ;
-      }
-      j = N-1 ;
-      S4(c2,N-1,2) ;
-      j = N-1 ;
-      S3(c2,N-1,2) ;
-      j = N-1 ;
-      S5(c2,N-1,2) ;
-    }
-  }
-  if ((M == 2) && (N >= 4)) {
-    for (c2=2;c2<=O-1;c2++) {
-      S1(c2,2,2) ;
-      for (c4=3;c4<=N-1;c4++) {
-        j = c4-1 ;
-        S2(c2,c4-1,2) ;
-        S1(c2,c4,2) ;
-      }
-      j = N-1 ;
-      S2(c2,N-1,2) ;
-    }
-  }
-  if ((M == 2) && (N == 3)) {
-    for (c2=2;c2<=O-1;c2++) {
-      S1(c2,2,2) ;
-      S2(c2,2,2) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/pingali1.c b/cloog-0.16.3/test/reservoir/pingali1.c
deleted file mode 100644
index 505df8d..0000000
--- a/cloog-0.16.3/test/reservoir/pingali1.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/./reservoir/pingali1.cloog by CLooG 0.14.0-225-g6e2d019 gmp bits in 0.01s. */
-if ((M >= 1) && (N >= 1)) {
-  if (N >= 2) {
-    for (c2=1;c2<=M;c2++) {
-      S2(c2,1);
-      for (c4=3;c4<=2*N-1;c4++) {
-        for (c6=max(1,c4-N);c6<=floord(c4-1,2);c6++) {
-          S1(c2,c4-c6,c6);
-        }
-        if ((c4+1)%2 == 0) {
-          S2(c2,(c4+1)/2);
-        }
-      }
-    }
-  }
-  if (N == 1) {
-    for (c2=1;c2<=M;c2++) {
-      S2(c2,1);
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/pingali1.cloog b/cloog-0.16.3/test/reservoir/pingali1.cloog
deleted file mode 100755
index 0be0a2a..0000000
--- a/cloog-0.16.3/test/reservoir/pingali1.cloog
+++ /dev/null
@@ -1,61 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 4
-    1    0    0    1
-0
-
-# Number of statments
-2
-
-1
-# { (i,j,k,l,m) | i-1 >= 0, -i+l >= 0, -j+m >= 0, k-1 >= 0, j-k-1 >= 0, 1 >= 0 }
-
-    6 7
-    1    1    0    0    0    0   -1
-    1   -1    0    0    1    0    0
-    1    0   -1    0    0    1    0
-    1    0    0    1    0    0   -1
-    1    0    1   -1    0    0   -1
-    1    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i-1 >= 0, -i+k >= 0, j-1 >= 0, -j+l >= 0, 1 >= 0 }
-
-    5 6
-    1    1    0    0    0   -1
-    1   -1    0    1    0    0
-    1    0    1    0    0   -1
-    1    0   -1    0    1    0
-    1    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-2
-
-    8 14
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    1
-    0    0    0    0    0    1    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/pingali1.good.c b/cloog-0.16.3/test/reservoir/pingali1.good.c
deleted file mode 100644
index b72eb17..0000000
--- a/cloog-0.16.3/test/reservoir/pingali1.good.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/pingali1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  if (N >= 2) {
-    for (c2=1;c2<=M;c2++) {
-      for (c4=1;c4<=2;c4++) {
-        if ((c4+1)%2 == 0) {
-          j = (c4+1)/2 ;
-          S2(c2,(c4+1)/2) ;
-        }
-      }
-      for (c4=3;c4<=2*N-1;c4++) {
-        for (c6=max(1,c4-N);c6<=floord(c4-1,2);c6++) {
-          j = c4-c6 ;
-          S1(c2,c4-c6,c6) ;
-        }
-        if ((c4+1)%2 == 0) {
-          j = (c4+1)/2 ;
-          S2(c2,(c4+1)/2) ;
-        }
-      }
-    }
-  }
-  if (N == 1) {
-    for (c2=1;c2<=M;c2++) {
-      S2(c2,1) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/pingali2.c b/cloog-0.16.3/test/reservoir/pingali2.c
deleted file mode 100644
index b09c4f9..0000000
--- a/cloog-0.16.3/test/reservoir/pingali2.c
+++ /dev/null
@@ -1,13 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/pingali2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-if (M >= 1) {
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S1(c2,c4) ;
-    }
-  }
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S2(c2,c4) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/pingali2.cloog b/cloog-0.16.3/test/reservoir/pingali2.cloog
deleted file mode 100755
index 0f89038..0000000
--- a/cloog-0.16.3/test/reservoir/pingali2.cloog
+++ /dev/null
@@ -1,56 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statments
-2
-
-1
-# { (i,j,k) | i-1 >= 0, -i+k >= 0, j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 5
-    1    1    0    0   -1
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    0   -1    1    0
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | i-1 >= 0, -i+k >= 0, j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 5
-    1    1    0    0   -1
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    0   -1    1    0
-    1    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-2
-
-    6 10
-    0    1    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-
-    6 10
-    0    1    0    0    0    0    0    0    0   -1
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0   -1
-    0    0    0    0    1    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/pingali2.good.c b/cloog-0.16.3/test/reservoir/pingali2.good.c
deleted file mode 100644
index 9341731..0000000
--- a/cloog-0.16.3/test/reservoir/pingali2.good.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/pingali2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4;
-  /* Original iterators. */
-  int i, j;
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S1(c2,c4) ;
-    }
-  }
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S2(c2,c4) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/pingali3.c b/cloog-0.16.3/test/reservoir/pingali3.c
deleted file mode 100644
index b53542a..0000000
--- a/cloog-0.16.3/test/reservoir/pingali3.c
+++ /dev/null
@@ -1,15 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/pingali3.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if (M >= 1) {
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S1(c2,c4) ;
-    }
-  }
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      for (c6=1;c6<=M;c6++) {
-        S2(c2,c4,c6) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/pingali3.cloog b/cloog-0.16.3/test/reservoir/pingali3.cloog
deleted file mode 100755
index 8f345c0..0000000
--- a/cloog-0.16.3/test/reservoir/pingali3.cloog
+++ /dev/null
@@ -1,62 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statments
-2
-
-1
-# { (i,j,k) | i-1 >= 0, -i+k >= 0, j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 5
-    1    1    0    0   -1
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    0   -1    1    0
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i-1 >= 0, -i+l >= 0, j-1 >= 0, -j+l >= 0, k-1 >= 0, -k+l >= 0, 1 >= 0 }
-
-    7 6
-    1    1    0    0    0   -1
-    1   -1    0    0    1    0
-    1    0    1    0    0   -1
-    1    0   -1    0    1    0
-    1    0    0    1    0   -1
-    1    0    0   -1    1    0
-    1    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-2
-
-    8 12
-    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    1    0    0    0    0    0   -1    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/pingali3.good.c b/cloog-0.16.3/test/reservoir/pingali3.good.c
deleted file mode 100644
index 5b5e4a9..0000000
--- a/cloog-0.16.3/test/reservoir/pingali3.good.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/pingali3.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S1(c2,c4) ;
-    }
-  }
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      for (c6=1;c6<=M;c6++) {
-        S2(c2,c4,c6) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/pingali4.c b/cloog-0.16.3/test/reservoir/pingali4.c
deleted file mode 100644
index 9905699..0000000
--- a/cloog-0.16.3/test/reservoir/pingali4.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/pingali4.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (c2=1;c2<=M;c2++) {
-  for (c4=1;c4<=M;c4++) {
-    S1(c2,c4) ;
-  }
-}
-for (c2=1;c2<=M;c2++) {
-  for (c4=1;c4<=M;c4++) {
-    S2(c2,c4) ;
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/pingali4.cloog b/cloog-0.16.3/test/reservoir/pingali4.cloog
deleted file mode 100755
index 46f4e07..0000000
--- a/cloog-0.16.3/test/reservoir/pingali4.cloog
+++ /dev/null
@@ -1,57 +0,0 @@
-# Language
-c
-
-# Context
-
-    2 3
-    1    1   -2
-    1    0    1
-0
-
-# Number of statments
-2
-
-1
-# { (i,j,k) | i-1 >= 0, -i+k >= 0, j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 5
-    1    1    0    0   -1
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    0   -1    1    0
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | i-1 >= 0, -i+k >= 0, j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 5
-    1    1    0    0   -1
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    0   -1    1    0
-    1    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-2
-
-    6 10
-    0    1    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-
-    6 10
-    0    1    0    0    0    0    0    0    0   -1
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/pingali4.good.c b/cloog-0.16.3/test/reservoir/pingali4.good.c
deleted file mode 100644
index 5b61707..0000000
--- a/cloog-0.16.3/test/reservoir/pingali4.good.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/pingali4.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4;
-  /* Original iterators. */
-  int i, j;
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S1(c2,c4) ;
-    }
-  }
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S2(c2,c4) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/pingali5.c b/cloog-0.16.3/test/reservoir/pingali5.c
deleted file mode 100644
index 1b2c415..0000000
--- a/cloog-0.16.3/test/reservoir/pingali5.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/./reservoir/pingali5.cloog by CLooG 0.14.0-225-g6e2d019 gmp bits in 0.02s. */
-if (M >= 2) {
-  for (c2=3;c2<=2*M-3;c2++) {
-    for (c4=ceild(c2+3,2);c4<=M;c4++) {
-      for (i=ceild(c2+1,2);i<=min(c2-1,c4-1);i++) {
-        S1(i,c2-i,c4);
-      }
-    }
-    for (c4=max(1,c2-M);c4<=floord(c2-1,2);c4++) {
-      S2(c2-c4,c4);
-    }
-    for (c4=ceild(c2+3,2);c4<=M;c4++) {
-      for (i=ceild(c2+1,2);i<=min(c2-1,c4-1);i++) {
-        S3(i,c2-i,c4);
-      }
-    }
-  }
-  for (c2=max(M+1,2*M-2);c2<=2*M-1;c2++) {
-    S2(M,c2-M);
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/pingali5.cloog b/cloog-0.16.3/test/reservoir/pingali5.cloog
deleted file mode 100755
index 2933d75..0000000
--- a/cloog-0.16.3/test/reservoir/pingali5.cloog
+++ /dev/null
@@ -1,81 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statments
-3
-
-1
-# { (i,j,k,l) | j-1 >= 0, i-j-1 >= 0, -i+k-1 >= 0, -k+l >= 0, 1 >= 0 }
-
-    5 6
-    1    0    1    0    0   -1
-    1    1   -1    0    0   -1
-    1   -1    0    1    0   -1
-    1    0    0   -1    1    0
-    1    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | -i+k >= 0, j-1 >= 0, i-j-1 >= 0, 1 >= 0 }
-
-    4 5
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    1   -1    0   -1
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | j-1 >= 0, i-j-1 >= 0, -i+k-1 >= 0, -k+l >= 0, 1 >= 0 }
-
-    5 6
-    1    0    1    0    0   -1
-    1    1   -1    0    0   -1
-    1   -1    0    1    0   -1
-    1    0    0   -1    1    0
-    1    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-3
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 12
-    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1   -1    0    0
-    0    0    0    1    0    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0   -2
-    0    0    0    0    1    0    0    0    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0   -2
-    0    0    0    0    0    0    1    0    0    0   -1    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/pingali5.good.c b/cloog-0.16.3/test/reservoir/pingali5.good.c
deleted file mode 100644
index 351e5d3..0000000
--- a/cloog-0.16.3/test/reservoir/pingali5.good.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/pingali5.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.03s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j,k) { hash(3); hash(i); hash(j); hash(k); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  for (c2=3;c2<=2*M-3;c2++) {
-    for (c4=ceild(c2+3,2);c4<=M;c4++) {
-      for (i=ceild(c2+1,2);i<=min(c4-1,c2-1);i++) {
-        j = c2-i ;
-        S1(i,c2-i,c4) ;
-      }
-    }
-    for (c4=max(1,c2-M);c4<=floord(c2-1,2);c4++) {
-      i = c2-c4 ;
-      S2(c2-c4,c4) ;
-    }
-    for (c4=ceild(c2+3,2);c4<=M;c4++) {
-      for (i=ceild(c2+1,2);i<=min(c4-1,c2-1);i++) {
-        j = c2-i ;
-        S3(i,c2-i,c4) ;
-      }
-    }
-  }
-  for (c2=max(2*M-2,3);c2<=2*M-1;c2++) {
-    for (c4=max(1,c2-M);c4<=floord(c2-1,2);c4++) {
-      i = c2-c4 ;
-      S2(c2-c4,c4) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/pingali6.c b/cloog-0.16.3/test/reservoir/pingali6.c
deleted file mode 100644
index 5ce4a85..0000000
--- a/cloog-0.16.3/test/reservoir/pingali6.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/pingali6.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.04s. */
-if (N >= 3) {
-  for (c4=2;c4<=N-1;c4++) {
-    for (c6=2;c6<=N-1;c6++) {
-      S1(1,c4,c6) ;
-    }
-  }
-  for (c2=3;c2<=2*M;c2++) {
-    for (c4=2;c4<=N-1;c4++) {
-      for (c6=2;c6<=N-1;c6++) {
-        if (c2%2 == 0) {
-          S1(c2/2,c4,c6) ;
-        }
-      }
-    }
-    for (c4=2;c4<=N-1;c4++) {
-      for (c6=2;c6<=N-1;c6++) {
-        if ((c2+1)%2 == 0) {
-          S2((c2-1)/2,c4,c6) ;
-        }
-      }
-    }
-  }
-  for (c4=2;c4<=N-1;c4++) {
-    for (c6=2;c6<=N-1;c6++) {
-      S2(M,c4,c6) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/pingali6.cloog b/cloog-0.16.3/test/reservoir/pingali6.cloog
deleted file mode 100755
index 93726ec..0000000
--- a/cloog-0.16.3/test/reservoir/pingali6.cloog
+++ /dev/null
@@ -1,66 +0,0 @@
-# Language
-c
-
-# Context
-
-    3 4
-    1    1    0   -1
-    1    0    1   -1
-    1    0    0    1
-0
-
-# Number of statments
-2
-
-1
-# { (i,j,k,l,m) | i-1 >= 0, -i+l >= 0, j-2 >= 0, -j+m-1 >= 0, k-2 >= 0, -k+m-1 >= 0, 1 >= 0 }
-
-    7 7
-    1    1    0    0    0    0   -1
-    1   -1    0    0    1    0    0
-    1    0    1    0    0    0   -2
-    1    0   -1    0    0    1   -1
-    1    0    0    1    0    0   -2
-    1    0    0   -1    0    1   -1
-    1    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m) | i-1 >= 0, -i+l >= 0, j-2 >= 0, -j+m-1 >= 0, k-2 >= 0, -k+m-1 >= 0, 1 >= 0 }
-
-    7 7
-    1    1    0    0    0    0   -1
-    1   -1    0    0    1    0    0
-    1    0    1    0    0    0   -2
-    1    0   -1    0    0    1   -1
-    1    0    0    1    0    0   -2
-    1    0    0   -1    0    1   -1
-    1    0    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-2
-
-    8 14
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -2    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 14
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -2    0    0    0    0   -1
-    0    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/pingali6.good.c b/cloog-0.16.3/test/reservoir/pingali6.good.c
deleted file mode 100644
index 26e9831..0000000
--- a/cloog-0.16.3/test/reservoir/pingali6.good.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/pingali6.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.03s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  if (N >= 3) {
-    for (c4=2;c4<=N-1;c4++) {
-      for (c6=2;c6<=N-1;c6++) {
-        S1(1,c4,c6) ;
-      }
-    }
-  }
-  if (N >= 3) {
-    for (c2=3;c2<=2*M;c2++) {
-      for (c4=2;c4<=N-1;c4++) {
-        for (c6=2;c6<=N-1;c6++) {
-          if (c2%2 == 0) {
-            S1(c2/2,c4,c6) ;
-          }
-        }
-      }
-      for (c4=2;c4<=N-1;c4++) {
-        for (c6=2;c6<=N-1;c6++) {
-          if ((c2+1)%2 == 0) {
-            i = (c2-1)/2 ;
-            S2((c2-1)/2,c4,c6) ;
-          }
-        }
-      }
-    }
-  }
-  if (N >= 3) {
-    c2 = 2*M+1 ;
-    for (c4=2;c4<=N-1;c4++) {
-      for (c6=2;c6<=N-1;c6++) {
-        S2(M,c4,c6) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/stride.c b/cloog-0.16.3/test/reservoir/stride.c
deleted file mode 100644
index e22c74b..0000000
--- a/cloog-0.16.3/test/reservoir/stride.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/reservoir/stride.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-if (M >= 2) {
-  for (c2=2;c2<=M;c2+=7) {
-    S1(c2,(c2-2)/7) ;
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/stride.cloog b/cloog-0.16.3/test/reservoir/stride.cloog
deleted file mode 100644
index 760a1a6..0000000
--- a/cloog-0.16.3/test/reservoir/stride.cloog
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# Stride-bug:
-#
-# for (i = 2; i <= N; i+=7) {
-#   S(i);
-# 
-# becomes:
-#
-# for (i = 5; i <= N; i+=7) {
-#   S(i);
-
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statements
-1
-
-1
-
-    4 5
-    0    1   -7    0   -2
-    1    1    0    0   -2
-    1   -1    0    1    0
-    1    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-1
-
-    6 10
-    0    1    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/stride2.c b/cloog-0.16.3/test/reservoir/stride2.c
deleted file mode 100644
index 8c2b7bf..0000000
--- a/cloog-0.16.3/test/reservoir/stride2.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/reservoir/stride2.cloog by CLooG 0.16.1-2-g0ae5c85 gmp bits in 0.00s. */
-if (M >= 2) {
-  for (c2=2;c2<=M;c2+=7) {
-    S1(c2,(c2-2)/7);
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/stride2.cloog b/cloog-0.16.3/test/reservoir/stride2.cloog
deleted file mode 100644
index 5fb9b14..0000000
--- a/cloog-0.16.3/test/reservoir/stride2.cloog
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# Stride-bug:
-#
-# for (i = 2; i <= N; i+=7) {
-#   S(i);
-# 
-# becomes:
-#
-# for (i = 5; i <= N; i+=7) {
-#   S(i);
-
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statements
-1
-
-1
-
-    4 5
-    0    1   -7    0   -2  # i - 7j = 2
-    1    1    0    0    0  # i >= 0
-    1   -1    0    1    0  # i <= n
-    1    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-1
-
-    6 10
-    0    1    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.16.3/test/reservoir/tang-xue1.c b/cloog-0.16.3/test/reservoir/tang-xue1.c
deleted file mode 100644
index 7dd0610..0000000
--- a/cloog-0.16.3/test/reservoir/tang-xue1.c
+++ /dev/null
@@ -1,14 +0,0 @@
-/* Generated from ../../../git/cloog/test/reservoir/tang-xue1.cloog by CLooG 0.14.0-165-g01eb246 gmp bits in 0.01s. */
-for (c2=0;c2<=9;c2++) {
-  for (c4=max(-1,c2-9);c4<=min(4,c2+3);c4++) {
-    for (c6=max(max(1,c2),c2-c4);c6<=min(min(9,c2+1),c2-c4+4);c6++) {
-      for (c8=max(1,-c2+c4+c6);c8<=min(4,-c2+c4+c6+1);c8++) {
-        if (c2%2 == 0) {
-          if (c4%2 == 0) {
-            S1(c2/2,(-c2+c4)/2,-c2+c6,-c4+c8);
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/tang-xue1.cloog b/cloog-0.16.3/test/reservoir/tang-xue1.cloog
deleted file mode 100644
index bf9b92b..0000000
--- a/cloog-0.16.3/test/reservoir/tang-xue1.cloog
+++ /dev/null
@@ -1,80 +0,0 @@
-#
-# Example 1 in "Generating Efficient Tiled Code for Distributed Memory
-# Machines", Peiyi Tang and Jingling Xue.
-#
-
-# for (int i = 1; i <= 9; i++) {
-#    for (int j = 1; j <= 4; j++) {
-#       A[i,2*j] = A[i,2*j-2] + A[i-1,2*j-2];
-#    }
-# }
-#
-# We tile it with a tiling matrix H = [1/2  0]
-#                                     [-1/2 1/2]
-#
-# We get:
-#
-# for (int i = 0; i <= 9; i += 2) {
-#   for (int j = max(-1, -9 + i); j <= min(4, 3 + i); j++) {
-#     for (int k = max(1, i, i-j); k <= min(4 + i -j, 1 + i, 9); k++) {
-#       for (int l = max(-i + j + k, 1); l <= min(4, 1 -i + j + k); l++) {
-#         if (i % 2 == 0) {
-#           if ((i + j) % 2 == 0) {
-#             A[k, 2 * l] = A[k, -2 + 2 * l] + A[-1 + k, -2 + 2 * l];
-#           }
-#         }
-#       }
-#     }
-#   }
-# }
-#
-
-# language: C 
-c
-
-# parameter (none)
-1 2
-# 1
-1 1
-0 
-
-1 # number of statements
-
-1 
-#    -2i-2j   -l +4 >= 0
-#          -k +l    >= 0
-#    -2i   -k    +9 >= 0
-#           k       >= 0
-#     2i   +k    -1 >= 0
-#           k -l +1 >= 0
-#          -k    +1 >= 0
-#     2i+2j   +l-1  >= 0
-8 6 
-#  i  j  k  l  1
-1 -2 -2  0 -1  4
-1  0  0 -1  1  0
-1 -2  0 -1  0  9
-1  0  0  1  0  0
-1  2  0  1  0 -1
-1  0  0  1 -1  1
-1  0  0 -1  0  1
-1  2  2  0  1 -1
-0  0  0
-0
-
-1 
-
-# Scattering functions
-9 15
-# alpha=[2i, 2i+2j, 2i+k, 2i+2j+l] gamma=[0, 0, 0, 0] beta=[0, 0, 0, 0, 0, 0]
-# c1 c2 c3 c4 c5 c6 c7 c8 c9 i j k l 1
-0 -1  0  0  0  0  0  0  0  0 0 0 0 0 0
-0  0 -1  0  0  0  0  0  0  0 2 0 0 0 0
-0  0  0 -1  0  0  0  0  0  0 0 0 0 0 0
-0  0  0  0 -1  0  0  0  0  0 2 2 0 0 0
-0  0  0  0  0 -1  0  0  0  0 0 0 0 0 0
-0  0  0  0  0  0 -1  0  0  0 2 0 1 0 0
-0  0  0  0  0  0  0 -1  0  0 0 0 0 0 0
-0  0  0  0  0  0  0  0 -1  0 2 2 0 1 0
-0  0  0  0  0  0  0  0  0 -1 0 0 0 0 0
-0
diff --git a/cloog-0.16.3/test/reservoir/tang-xue1.good.c b/cloog-0.16.3/test/reservoir/tang-xue1.good.c
deleted file mode 100644
index 1c4215c..0000000
--- a/cloog-0.16.3/test/reservoir/tang-xue1.good.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/tang-xue1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k,l) { hash(1); hash(i); hash(j); hash(k); hash(l); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int c2, c4, c6, c8;
-  /* Original iterators. */
-  int i, j, k, l;
-  for (c2=0;c2<=9;c2++) {
-    for (c4=max(-1,c2-9);c4<=min(4,c2+3);c4++) {
-      for (c6=max(max(c2,1),c2-c4);c6<=min(min(c2+1,9),c2-c4+4);c6++) {
-        for (c8=max(1,-c2+c4+c6);c8<=min(4,-c2+c4+c6+1);c8++) {
-          if (c2%2 == 0) {
-            if ((c2+c4)%2 == 0) {
-              j = (-c2+c4)/2 ;
-              k = -c2+c6 ;
-              l = -c4+c8 ;
-              S1(c2/2,(-c2+c4)/2,-c2+c6,-c4+c8) ;
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/reservoir/two.c b/cloog-0.16.3/test/reservoir/two.c
deleted file mode 100644
index 374e754..0000000
--- a/cloog-0.16.3/test/reservoir/two.c
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/./reservoir/two.cloog by CLooG 0.14.0-225-g6e2d019 gmp bits in 0.00s. */
-S1(1,1,5);
diff --git a/cloog-0.16.3/test/reservoir/two.cloog b/cloog-0.16.3/test/reservoir/two.cloog
deleted file mode 100644
index 60b259f..0000000
--- a/cloog-0.16.3/test/reservoir/two.cloog
+++ /dev/null
@@ -1,26 +0,0 @@
-# Scan
-#  D = { (i, j, k) | 0 <= i < 10, 1 <= j < 20, 2i + 3j = k, i + j + 3 = 3k }
-#
-# language: C
-c
-
-# parameter (none)
-1 2
-1 1
-0
-
-1 # Number of statements
-
-1
-6 5
-#  i  j  k  1
-1  1  0  0  0
-1 -1  0  0 10
-1  0  1  0 -1
-1  0 -1  0 20
-0  2  3 -1  0
-0  1  1 -1  3
-0  0  0
-0 
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/reservoir/two.good.c b/cloog-0.16.3/test/reservoir/two.good.c
deleted file mode 100644
index a80671f..0000000
--- a/cloog-0.16.3/test/reservoir/two.good.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/two.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-
-void test()
-{
-  /* Original iterators. */
-  int i, j, k;
-  for (i=0;i<=1;i++) {
-    if ((i+1)%2 == 0) {
-      j = (-i+3)/2 ;
-      k = (i+9)/2 ;
-      S1(i,(-i+3)/2,(i+9)/2) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/singleton.c b/cloog-0.16.3/test/singleton.c
deleted file mode 100644
index ad14ebe..0000000
--- a/cloog-0.16.3/test/singleton.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/singleton.cloog by CLooG 0.14.0-242-g720faff gmp bits in 0.00s. */
-S2();
-S1();
diff --git a/cloog-0.16.3/test/singleton.cloog b/cloog-0.16.3/test/singleton.cloog
deleted file mode 100644
index 8636efb..0000000
--- a/cloog-0.16.3/test/singleton.cloog
+++ /dev/null
@@ -1,27 +0,0 @@
-c
-
-0 2
-
-0
-
-2
-
-1
-0 2
-0 0 0
-
-1
-0 2
-0 0 0
-
-0
-
-2
-
-1 3
-0 -1 0
-
-1 3
-0 -1 -1
-
-0
diff --git a/cloog-0.16.3/test/singleton.good.c b/cloog-0.16.3/test/singleton.good.c
deleted file mode 100644
index 40106ed..0000000
--- a/cloog-0.16.3/test/singleton.good.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/singleton.cloog by CLooG 0.14.0-242-g720faff gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1() { hash(1); }
-#define S2() { hash(2); }
-
-void test()
-{
-  S2();
-  S1();
-}
diff --git a/cloog-0.16.3/test/sor1d.c b/cloog-0.16.3/test/sor1d.c
deleted file mode 100644
index da1b5ec..0000000
--- a/cloog-0.16.3/test/sor1d.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated from ../../../git/cloog/test/sor1d.cloog by CLooG 0.14.0-278-gcf1f323 gmp bits in 0.11s. */
-if ((M >= 1) && (N >= 3)) {
-  for (glT1=-1;glT1<=floord(3*M+N-5,100);glT1++) {
-    for (rp1=max(max(0,ceild(100*glT1-2*M-N+5,100)),ceild(100*glT1-N-193,300));rp1<=min(min(floord(glT1+1,3),floord(M,100)),glT1);rp1++) {
-      for (vT1=max(max(100*glT1-100*rp1,200*rp1-3),200*rp1-N+1);vT1<=min(min(min(2*M+N-5,100*glT1-100*rp1+99),200*rp1+N+193),100*glT1-100*rp1+N+95);vT1++) {
-        if (rp1 >= max(1,ceild(vT1-N+7,200))) {
-          S3(glT1-rp1,rp1-1,rp1,100*rp1-1,-200*rp1+vT1+6);
-        }
-        for (vP1=max(max(1,ceild(vT1-N+5,2)),100*rp1);vP1<=min(min(floord(vT1+2,2),M),100*rp1+99);vP1++) {
-          S1(glT1-rp1,rp1,vP1,vT1-2*vP1+4);
-        }
-        if (rp1 <= min(floord(M-100,100),floord(vT1-197,200))) {
-          S2(glT1-rp1,rp1,rp1+1,100*rp1+99,-200*rp1+vT1-194);
-        }
-      }
-    }
-    S4(glT1);
-  }
-}
diff --git a/cloog-0.16.3/test/sor1d.cloog b/cloog-0.16.3/test/sor1d.cloog
deleted file mode 100644
index ba1ca70..0000000
--- a/cloog-0.16.3/test/sor1d.cloog
+++ /dev/null
@@ -1,256 +0,0 @@
-# created: Thu Dec 17 16:41:33 CET 2009
-# ---------------------- CONTEXT ----------------------
-c # language is C
-
-# Context
-2 4
- 1 1 0 0
- 1 0 1 0
-
-
-1 # set parameter names
-M N
-
-# --------------------- STATEMENTS --------------------
-4
-
-# 1 computation stmts:
-1 # domains per statement
-19 8
- 1 -100 0 2 1 0 0 -4
- 1 0 0 0 1 0 0 -2
- 1 100 0 -2 -1 0 0 103
- 1 0 0 0 -1 0 1 -1
- 1 0 0 1 0 0 0 -1
- 1 0 -100 1 0 0 0 0
- 1 -100 0 2 0 0 1 -5
- 1 0 0 -1 0 1 0 0
- 1 0 100 -1 0 0 0 99
- 1 100 0 -2 0 0 0 101
- 1 0 50 0 0 0 0 49
- 1 -100 200 0 0 0 1 193
- 1 0 -100 0 0 1 0 0
- 1 100 -200 0 0 0 0 101
- 1 100 0 0 0 0 0 99
- 1 -100 0 0 0 2 1 -5
- 1 0 0 0 0 0 1 -3
- 1 0 0 0 0 2 1 94
- 1 0 0 0 0 1 0 -1
-
-
-0 0 0 # for future options...
-
-
-# 1 prepare-send stmts:
-1 # domains per statement
-57 9
- 1 0 -200 0 2 1 0 0 -3
- 1 0 0 0 2 1 0 0 -5
- 1 -100 0 0 2 1 0 0 -4
- 1 0 0 0 0 1 0 0 -3
- 1 0 200 0 -2 -1 0 1 197
- 1 0 0 0 -2 -1 2 1 -3
- 1 100 0 0 -2 -1 0 0 103
- 1 0 0 0 0 -1 0 1 -1
- 1 0 0 -100 1 0 0 0 1
- 1 0 -100 0 1 0 0 0 0
- 1 0 0 0 1 0 0 0 -1
- 1 0 -200 0 2 0 0 1 -4
- 1 0 0 0 2 0 0 1 -6
- 1 -100 0 0 2 0 0 1 -5
- 1 0 0 100 -1 0 0 0 98
- 1 0 100 0 -1 0 0 0 99
- 1 0 0 0 -1 0 1 0 -1
- 1 0 200 0 -2 0 0 1 194
- 1 0 0 0 -2 0 2 1 -6
- 1 50 0 0 -1 0 0 0 50
- 1 0 -1 1 0 0 0 0 -1
- 1 0 0 100 0 0 0 0 97
- 1 0 -200 200 0 0 0 1 192
- 1 0 0 200 0 0 0 1 190
- 1 -100 0 200 0 0 0 1 191
- 1 0 1 -1 0 0 0 0 1
- 1 0 0 -100 0 0 1 0 0
- 1 0 200 -200 0 0 0 1 196
- 1 0 0 -200 0 0 2 1 -4
- 1 50 0 -100 0 0 0 0 51
- 1 -100 200 0 0 0 0 2 189
- 1 -100 200 0 0 0 0 1 193
- 1 0 100 0 0 0 0 1 94
- 1 0 200 0 0 0 0 1 192
- 1 0 50 0 0 0 0 0 49
- 1 100 -200 0 0 0 0 1 96
- 1 0 -100 0 0 0 1 1 -5
- 1 0 -100 0 0 0 1 0 -100
- 1 0 -200 0 0 0 2 1 -204
- 1 50 -100 0 0 0 0 0 -49
- 1 50 0 0 0 0 0 0 49
- 1 100 0 0 0 0 0 1 94
- 1 100 0 0 0 0 0 3 284
- 1 50 0 0 0 0 0 1 45
- 1 -100 0 0 0 0 2 1 -7
- 1 -100 0 0 0 0 2 2 -11
- 1 -100 0 0 0 0 2 4 179
- 1 -100 0 0 0 0 2 3 -15
- 1 0 0 0 0 0 2 1 -8
- 1 0 0 0 0 0 2 3 -16
- 1 0 0 0 0 0 1 1 -6
- 1 0 0 0 0 0 0 1 -4
- 1 0 0 0 0 0 2 4 79
- 1 0 0 0 0 0 2 7 463
- 1 0 0 0 0 0 2 6 269
- 1 0 0 0 0 0 2 5 75
- 1 0 0 0 0 0 1 0 -2
-
-
-0 0 0 # for future options...
-
-
-# 1 prepare-receive stmts:
-1 # domains per statement
-57 9
- 1 0 -200 0 2 1 0 0 -3
- 1 0 0 0 2 1 0 0 -5
- 1 -100 0 0 2 1 0 0 -4
- 1 0 0 0 0 1 0 0 -3
- 1 0 200 0 -2 -1 0 1 197
- 1 0 0 0 -2 -1 2 1 -3
- 1 100 0 0 -2 -1 0 0 103
- 1 0 0 0 0 -1 0 1 -1
- 1 0 0 -100 1 0 0 0 1
- 1 0 -100 0 1 0 0 0 0
- 1 0 0 0 1 0 0 0 -1
- 1 0 -200 0 2 0 0 1 -4
- 1 0 0 0 2 0 0 1 -6
- 1 -100 0 0 2 0 0 1 -5
- 1 0 0 100 -1 0 0 0 98
- 1 0 100 0 -1 0 0 0 99
- 1 0 0 0 -1 0 1 0 -1
- 1 0 200 0 -2 0 0 1 194
- 1 0 0 0 -2 0 2 1 -6
- 1 50 0 0 -1 0 0 0 50
- 1 0 -1 1 0 0 0 0 -1
- 1 0 0 100 0 0 0 0 97
- 1 0 -200 200 0 0 0 1 192
- 1 0 0 200 0 0 0 1 190
- 1 -100 0 200 0 0 0 1 191
- 1 0 1 -1 0 0 0 0 1
- 1 0 0 -100 0 0 1 0 0
- 1 0 200 -200 0 0 0 1 196
- 1 0 0 -200 0 0 2 1 -4
- 1 50 0 -100 0 0 0 0 51
- 1 -100 200 0 0 0 0 2 189
- 1 -100 200 0 0 0 0 1 193
- 1 0 100 0 0 0 0 1 94
- 1 0 200 0 0 0 0 1 192
- 1 0 50 0 0 0 0 0 49
- 1 100 -200 0 0 0 0 1 96
- 1 0 -100 0 0 0 1 1 -5
- 1 0 -100 0 0 0 1 0 -100
- 1 0 -200 0 0 0 2 1 -204
- 1 50 -100 0 0 0 0 0 -49
- 1 50 0 0 0 0 0 0 49
- 1 100 0 0 0 0 0 1 94
- 1 100 0 0 0 0 0 3 284
- 1 50 0 0 0 0 0 1 45
- 1 -100 0 0 0 0 2 1 -7
- 1 -100 0 0 0 0 2 2 -11
- 1 -100 0 0 0 0 2 4 179
- 1 -100 0 0 0 0 2 3 -15
- 1 0 0 0 0 0 2 1 -8
- 1 0 0 0 0 0 2 3 -16
- 1 0 0 0 0 0 1 1 -6
- 1 0 0 0 0 0 0 1 -4
- 1 0 0 0 0 0 2 4 79
- 1 0 0 0 0 0 2 7 463
- 1 0 0 0 0 0 2 6 269
- 1 0 0 0 0 0 2 5 75
- 1 0 0 0 0 0 1 0 -2
-
-
-0 0 0 # for future options...
-
-
-# 1 communication stmts:
-1 # domains per statement
-21 5
- 1 200 0 3 781
- 1 200 0 1 391
- 1 200 0 4 1075
- 1 100 0 1 392
- 1 100 0 0 197
- 1 -200 6 5 377
- 1 -200 6 6 671
- 1 -100 3 2 190
- 1 -200 6 3 -13
- 1 -100 3 1 -5
- 1 0 2 3 484
- 1 0 1 1 95
- 1 0 3 1 192
- 1 0 3 5 873
- 1 0 3 2 189
- 1 0 6 7 1062
- 1 0 6 5 771
- 1 0 3 4 579
- 1 0 0 1 -3
- 1 0 2 1 -5
- 1 0 1 0 -1
-
-
-0 0 0 # for future options...
-
-
-
-1 # set the iterator names
-tileT1 tileP1 other1 other2 other3 other4 other5
-
-# --------------------- SCATTERING --------------------
-4 # Scattering functions
-9 17
- 0 1 0 -1 0 0 0 0 0 0 -1 0 0 0 0 0 0
- 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 0 0 -1 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0 -2 -1 0 0 4
- 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 -1
- 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
-
-9 18
- 0 1 0 -1 0 0 0 0 0 0 -1 0 0 0 0 0 0 0
- 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 0 0 -1 0 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0 0 -2 -1 0 0 4
- 0 0 0 0 0 1 0 0 0 0 0 0 0 -1 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 -2
- 0 0 0 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 0
- 0 0 0 0 0 0 0 0 1 0 0 0 0 0 -1 0 0 0
- 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 -1
-
-9 18
- 0 1 0 0 0 0 0 -1 0 0 -1 0 0 0 0 0 0 -1
- 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 0 0 0 -1 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0 0 -2 -1 0 0 4
- 0 0 0 0 0 1 0 0 0 0 0 0 0 -1 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 1 0 0 0 -1 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 1 0 0 0 0 0 -1 0 0 0
- 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 -1
-
-9 14
- 0 1 0 0 0 0 0 0 0 0 -1 0 0 0
- 0 0 1 0 0 0 0 0 0 0 0 0 0 -1
- 0 0 0 1 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 1 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 1 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 1 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 1 0 0 0 0
-
-
-1 # we set the scattering dimension names
-glT1 bl rp1 vT1 vP1 stmtType otherP1 arrAcc1 arrNr1
-
diff --git a/cloog-0.16.3/test/sor1d.good.c b/cloog-0.16.3/test/sor1d.good.c
deleted file mode 100644
index bb5d643..0000000
--- a/cloog-0.16.3/test/sor1d.good.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/sor1d.cloog by CLooG 0.14.0-226-g3fc65ac gmp bits in 0.04s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(tileT1,tileP1,other1,other2) { hash(1); hash(tileT1); hash(tileP1); hash(other1); hash(other2); }
-#define S2(tileT1,tileP1,other1,other2,other3) { hash(2); hash(tileT1); hash(tileP1); hash(other1); hash(other2); hash(other3); }
-#define S3(tileT1,tileP1,other1,other2,other3) { hash(3); hash(tileT1); hash(tileP1); hash(other1); hash(other2); hash(other3); }
-#define S4(tileT1) { hash(4); hash(tileT1); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int glT1, rp1, vT1, vP1, otherP1, arrAcc1;
-  /* Original iterators. */
-  int tileT1, tileP1, other1, other2, other3;
-  if ((M >= 1) && (N >= 3)) {
-    for (glT1=-1;glT1<=floord(3*M+N-5,100);glT1++) {
-      for (rp1=max(max(0,ceild(100*glT1-2*M-N+5,100)),ceild(100*glT1-N-193,300));rp1<=min(min(min(min(floord(glT1+1,2),floord(M,100)),floord(100*glT1+99,100)),floord(50*glT1+51,150)),floord(100*glT1+N+98,300));rp1++) {
-        for (vT1=max(max(max(max(0,100*glT1-100*rp1),100*rp1-1),200*rp1-3),200*rp1-N+1);vT1<=min(min(2*M+N-5,100*glT1-100*rp1+99),200*rp1+N+193);vT1++) {
-          if (rp1 >= max(1,ceild(vT1-N+7,200))) {
-            S3(glT1-rp1,rp1-1,rp1,100*rp1-1,-200*rp1+vT1+6);
-          }
-          for (vP1=max(max(1,ceild(vT1-N+5,2)),100*rp1);vP1<=min(min(floord(vT1+2,2),M),100*rp1+99);vP1++) {
-            S1(glT1-rp1,rp1,vP1,vT1-2*vP1+4);
-            if ((rp1 <= min(floord(M-100,100),floord(vT1-197,200))) && (100*rp1 == vP1-99)) {
-              S2(glT1-rp1,rp1,rp1+1,100*rp1+99,-200*rp1+vT1-194);
-            }
-          }
-        }
-      }
-      S4(glT1);
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/square+triangle-1-1-2-3.c b/cloog-0.16.3/test/square+triangle-1-1-2-3.c
deleted file mode 100644
index c30b4e2..0000000
--- a/cloog-0.16.3/test/square+triangle-1-1-2-3.c
+++ /dev/null
@@ -1,14 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/square+triangle-1-1-2-3.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.00s. */
-for (j=1;j<=M;j++) {
-  S1(1,j);
-}
-for (i=2;i<=M;i++) {
-  S1(i,1);
-  for (j=2;j<=i;j++) {
-    S1(i,j);
-    S2(i,j);
-  }
-  for (j=i+1;j<=M;j++) {
-    S1(i,j);
-  }
-}
diff --git a/cloog-0.16.3/test/square+triangle-1-1-2-3.cloog b/cloog-0.16.3/test/square+triangle-1-1-2-3.cloog
deleted file mode 100644
index ce8f547..0000000
--- a/cloog-0.16.3/test/square+triangle-1-1-2-3.cloog
+++ /dev/null
@@ -1,36 +0,0 @@
-# language: C
-c
-
-# Context
-# {M | M >= 1}
-2 3
-#  M  1
-1  1 -1
-1  0  1
-0
-
-2 # Number of statements
-
-1
-# {i, j | 1<=i<=M; 1<=j<=M}
-5 5
-#  i  j  M  1
-1  1  0  0 -1
-1 -1  0  1  0
-1  0  1  0 -1
-1  0 -1  1  0
-1  0  0  0  1
-0  0  0
-
-1
-# {i, j | 2<=j<=i<=M}
-4 5
-#  i  j  M  1
-1  0  1  0 -2
-1  1 -1  0  0
-1 -1  0  1  0
-1  0  0  0  1
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/square+triangle-1-1-2-3.good.c b/cloog-0.16.3/test/square+triangle-1-1-2-3.good.c
deleted file mode 100644
index ea68a7f..0000000
--- a/cloog-0.16.3/test/square+triangle-1-1-2-3.good.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Generated from ../../../git/cloog/test/square+triangle-1-1-2-3.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j;
-  for (j=1;j<=M;j++) {
-    S1(1,j) ;
-  }
-  for (i=2;i<=M-1;i++) {
-    S1(i,1) ;
-    for (j=2;j<=i;j++) {
-      S1(i,j) ;
-      S2(i,j) ;
-    }
-    for (j=i+1;j<=M;j++) {
-      S1(i,j) ;
-    }
-  }
-  if (M >= 2) {
-    S1(M,1) ;
-    for (j=2;j<=M;j++) {
-      S1(M,j) ;
-      S2(M,j) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/stride.c b/cloog-0.16.3/test/stride.c
deleted file mode 100644
index d2cf8fe..0000000
--- a/cloog-0.16.3/test/stride.c
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Generated from stride.cloog by CLooG 0.14.0-200-g26bdb56 gmp bits in 0.01s. */
-for (c1=3;c1<=100;c1++) {
-  if (c1 == 25) {
-    S1(25);
-  }
-  if (c1%3 == 0) {
-    S2(c1,c1/3);
-  }
-}
diff --git a/cloog-0.16.3/test/stride.cloog b/cloog-0.16.3/test/stride.cloog
deleted file mode 100644
index 1526377..0000000
--- a/cloog-0.16.3/test/stride.cloog
+++ /dev/null
@@ -1,32 +0,0 @@
-c
-
-0 2
-
-0
-
-2
-
-1
-1 3
-0 -1 25
--1 0 0
-
-1
-3 4
-1 1 0 -3
-1 -1 0 100
-0 1 -3 0
-0 0 0
-
-0
-
-2
-2 5
-0 -1 0 1 0
-0 0 -1 0 0
-
-2 6
-0 -1 0 1 0 0
-0 0 -1 0 1 0
-
-0
diff --git a/cloog-0.16.3/test/stride.good.c b/cloog-0.16.3/test/stride.good.c
deleted file mode 100644
index 7380723..0000000
--- a/cloog-0.16.3/test/stride.good.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Generated from stride.cloog by CLooG 0.14.0-200-g26bdb56 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int c1, c2;
-  /* Original iterators. */
-  int i, j;
-  for (c1=3;c1<=100;c1++) {
-    if (c1 == 25) {
-      S1(25);
-    }
-    if (c1%3 == 0) {
-      S2(c1,c1/3);
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/stride2.c b/cloog-0.16.3/test/stride2.c
deleted file mode 100644
index 320a2fb..0000000
--- a/cloog-0.16.3/test/stride2.c
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Generated from stride2.cloog by CLooG 0.14.0-200-g26bdb56 gmp bits in 0.00s. */
-for (c1=3;c1<=100;c1+=3) {
-  if (c1 == 27) {
-    S1(27);
-  }
-  S2(c1,c1/3);
-}
diff --git a/cloog-0.16.3/test/stride2.cloog b/cloog-0.16.3/test/stride2.cloog
deleted file mode 100644
index 72a597a..0000000
--- a/cloog-0.16.3/test/stride2.cloog
+++ /dev/null
@@ -1,32 +0,0 @@
-c
-
-0 2
-
-0
-
-2
-
-1
-1 3
-0 -1 27
--1 0 0
-
-1
-3 4
-1 1 0 -3
-1 -1 0 100
-0 1 -3 0
-0 0 0
-
-0
-
-2
-2 5
-0 -1 0 1 0
-0 0 -1 0 0
-
-2 6
-0 -1 0 1 0 0
-0 0 -1 0 1 0
-
-0
diff --git a/cloog-0.16.3/test/stride2.good.c b/cloog-0.16.3/test/stride2.good.c
deleted file mode 100644
index 4cf8b60..0000000
--- a/cloog-0.16.3/test/stride2.good.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Generated from stride2.cloog by CLooG 0.14.0-200-g26bdb56 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int c1, c2;
-  /* Original iterators. */
-  int i, j;
-  for (c1=3;c1<=100;c1+=3) {
-    if (c1 == 27) {
-      S1(27);
-    }
-    S2(c1,c1/3);
-  }
-}
diff --git a/cloog-0.16.3/test/stride3.c b/cloog-0.16.3/test/stride3.c
deleted file mode 100644
index c228cb6..0000000
--- a/cloog-0.16.3/test/stride3.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/stride3.cloog by CLooG 0.14.0-291-g5879c32 gmp bits in 0.00s. */
-if ((m <= n) && (n >= 1)) {
-  for (p1=max(50,50*m);p1<=50*n;p1+=50) {
-    S1(p1/50);
-  }
-}
diff --git a/cloog-0.16.3/test/stride3.cloog b/cloog-0.16.3/test/stride3.cloog
deleted file mode 100644
index bd5d6b0..0000000
--- a/cloog-0.16.3/test/stride3.cloog
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-# ---------------------- CONTEXT ----------------------
-c # language is C
-
-# Context (no constraints on two parameters)
-1 4                   # 1 lines and 4 columns
-# eq/in m  n  1
-1   0  0  0       # 0 >= 0, always true
-
-1 # We want to set manually the parameter names
-m n                   # parameter names
-
-# --------------------- STATEMENTS --------------------
-1 # Number of statements
-
-1 # First statement: two domains
-# First domain
-3 5                   # 3 lines and 5 columns
-# eq/in i  m  n  1
-1   1  0  0 -1    # i >= 1
-1  -1  0  1  0    # i <= n
-1   1 -1  0  0    # i >= m
-# Second domain
-0  0  0               # for future options
-
-
-1 # We want to set manually the iterator names
-i j                   # iterator names
-
-# --------------------- SCATTERING --------------------
-1 # Scattering functions
-# First function
-2 7                   # 2 lines and 7 columns
-# eq/in p1 p2  i  m  n  1 
-0    1  0 -50  0  0  0    # p1 = i
-0    0  1  0  0  0  0    # p2 = 0
-
-1 # We want to set manually the scattering dimension names
-p1 p2                 # scattering dimension names
-
diff --git a/cloog-0.16.3/test/stride4.c b/cloog-0.16.3/test/stride4.c
deleted file mode 100644
index 2e874be..0000000
--- a/cloog-0.16.3/test/stride4.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/stride4.cloog by CLooG 0.16.0-10-g13c6274 gmp bits in 0.00s. */
-if ((t >= 0) && (t <= 15)) {
-  for (i0=t;i0<=99;i0+=16) {
-    S1(i0,t);
-  }
-}
diff --git a/cloog-0.16.3/test/stride4.cloog b/cloog-0.16.3/test/stride4.cloog
deleted file mode 100644
index 0271d97..0000000
--- a/cloog-0.16.3/test/stride4.cloog
+++ /dev/null
@@ -1,33 +0,0 @@
-# Language: C
-c
-
-# Context:
-1
-
-0 3 0 0 0 1
-
-1 # Parameter name(s)
-t 
-# Statement number:
-1
-
-# Iteration domain of statement 1.
-1
-
-6 6 2 0 1 1
-0     1     0    16    -1     0
-0     0     1     0    -1     0
-1     1     0     0     0     0
-1    -1     0     0     0    99
-1     0     0     0     1     0
-1     0     0     0    -1    15
-
-0 0 0 # For future options.
-
-
-1 # Iterator name(s)
-
-i0 i1
-
-# No scattering functions.
-0
diff --git a/cloog-0.16.3/test/swim.c b/cloog-0.16.3/test/swim.c
deleted file mode 100644
index 0a0046a..0000000
--- a/cloog-0.16.3/test/swim.c
+++ /dev/null
@@ -1,672 +0,0 @@
-/* Generated from ../../../git/cloog/test/swim.cloog by CLooG 0.16.1-3-g277eafa gmp bits in 0.20s. */
-if (M == 1) {
-  S1();
-  S2();
-  S3();
-  S4();
-  S5();
-  S6();
-  S7();
-  S8();
-  S9();
-  S10();
-  S11();
-  S12();
-  S13();
-  S14();
-  S15();
-  S16();
-  S17();
-  S18();
-  S19();
-  S20();
-  S21();
-  S22();
-  S23();
-  S24();
-  S25();
-  S26();
-  S27();
-  for (p1=1;p1<=N;p1++) {
-    for (p3=1;p3<=N;p3++) {
-      S28(p1,p3);
-      S29(p1,p3);
-      S30(p1,p3);
-    }
-    S31(p1);
-  }
-  S32();
-  S33();
-  S34();
-  if (O <= 1) {
-    S35();
-  }
-  S36();
-  S37();
-  if ((N >= 1) && (Q >= 1) && (R >= 1)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1);
-      S39(p1);
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S40(p1,p3,p5);
-          S41(p1,p3,p5);
-          S42(p1,p3,p5);
-          S43(p1,p3,p5);
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S44(p1,p3);
-        S45(p1,p3);
-        S46(p1,p3);
-        S47(p1,p3);
-      }
-      for (p3=1;p3<=R;p3++) {
-        S48(p1,p3);
-        S49(p1,p3);
-        S50(p1,p3);
-        S51(p1,p3);
-      }
-      S52(p1);
-      S53(p1);
-      S54(p1);
-      S55(p1);
-      S56(p1);
-      S57(p1);
-      S58(p1);
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S59(p1,p3,p5);
-          S60(p1,p3,p5);
-          S61(p1,p3,p5);
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S62(p1,p3);
-        S63(p1,p3);
-        S64(p1,p3);
-      }
-      for (p3=1;p3<=R;p3++) {
-        S65(p1,p3);
-        S66(p1,p3);
-        S67(p1,p3);
-      }
-      S68(p1);
-      S69(p1);
-      S70(p1);
-      S71(p1);
-      S72(p1);
-      S73(p1);
-      S74(p1);
-      S75(p1);
-      S76(p1);
-      S77(p1);
-      S78(p1);
-      S79(p1);
-      S80(p1);
-      S81(p1);
-      S82(p1);
-      S83(p1);
-      S84(p1);
-      S85(p1);
-      S86(p1);
-      S87(p1);
-      S88(p1);
-      S89(p1);
-      S90(p1);
-      S91(p1);
-      S92(p1);
-      S93(p1);
-      S94(p1);
-      for (p3=1;p3<=N;p3++) {
-        for (p5=1;p5<=N;p5++) {
-          S95(p1,p3,p5);
-          S96(p1,p3,p5);
-          S97(p1,p3,p5);
-        }
-        S98(p1,p3);
-      }
-      S99(p1);
-      S100(p1);
-      S101(p1);
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S102(p1,p3,p5);
-          S103(p1,p3,p5);
-          S104(p1,p3,p5);
-          S105(p1,p3,p5);
-          S106(p1,p3,p5);
-          S107(p1,p3,p5);
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S108(p1,p3);
-        S109(p1,p3);
-        S110(p1,p3);
-        S111(p1,p3);
-        S112(p1,p3);
-        S113(p1,p3);
-      }
-      for (p3=1;p3<=R;p3++) {
-        S114(p1,p3);
-        S115(p1,p3);
-        S116(p1,p3);
-        S117(p1,p3);
-        S118(p1,p3);
-        S119(p1,p3);
-      }
-      S120(p1);
-      S121(p1);
-      S122(p1);
-      S123(p1);
-      S124(p1);
-      S125(p1);
-    }
-  }
-  if ((N <= 0) && (Q >= 1) && (R >= 1)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1);
-      S39(p1);
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S40(p1,p3,p5);
-          S41(p1,p3,p5);
-          S42(p1,p3,p5);
-          S43(p1,p3,p5);
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S44(p1,p3);
-        S45(p1,p3);
-        S46(p1,p3);
-        S47(p1,p3);
-      }
-      for (p3=1;p3<=R;p3++) {
-        S48(p1,p3);
-        S49(p1,p3);
-        S50(p1,p3);
-        S51(p1,p3);
-      }
-      S52(p1);
-      S53(p1);
-      S54(p1);
-      S55(p1);
-      S56(p1);
-      S57(p1);
-      S58(p1);
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S59(p1,p3,p5);
-          S60(p1,p3,p5);
-          S61(p1,p3,p5);
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S62(p1,p3);
-        S63(p1,p3);
-        S64(p1,p3);
-      }
-      for (p3=1;p3<=R;p3++) {
-        S65(p1,p3);
-        S66(p1,p3);
-        S67(p1,p3);
-      }
-      S68(p1);
-      S69(p1);
-      S70(p1);
-      S71(p1);
-      S72(p1);
-      S73(p1);
-      S74(p1);
-      S75(p1);
-      S76(p1);
-      S77(p1);
-      S78(p1);
-      S79(p1);
-      S80(p1);
-      S81(p1);
-      S82(p1);
-      S83(p1);
-      S84(p1);
-      S85(p1);
-      S86(p1);
-      S87(p1);
-      S88(p1);
-      S89(p1);
-      S90(p1);
-      S91(p1);
-      S92(p1);
-      S93(p1);
-      S94(p1);
-      S99(p1);
-      S100(p1);
-      S101(p1);
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S102(p1,p3,p5);
-          S103(p1,p3,p5);
-          S104(p1,p3,p5);
-          S105(p1,p3,p5);
-          S106(p1,p3,p5);
-          S107(p1,p3,p5);
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S108(p1,p3);
-        S109(p1,p3);
-        S110(p1,p3);
-        S111(p1,p3);
-        S112(p1,p3);
-        S113(p1,p3);
-      }
-      for (p3=1;p3<=R;p3++) {
-        S114(p1,p3);
-        S115(p1,p3);
-        S116(p1,p3);
-        S117(p1,p3);
-        S118(p1,p3);
-        S119(p1,p3);
-      }
-      S120(p1);
-      S121(p1);
-      S122(p1);
-      S123(p1);
-      S124(p1);
-      S125(p1);
-    }
-  }
-  if ((N >= 1) && (Q >= 1) && (R <= 0)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1);
-      S39(p1);
-      for (p3=1;p3<=Q;p3++) {
-        S44(p1,p3);
-        S45(p1,p3);
-        S46(p1,p3);
-        S47(p1,p3);
-      }
-      S52(p1);
-      S53(p1);
-      S54(p1);
-      S55(p1);
-      S56(p1);
-      S57(p1);
-      S58(p1);
-      for (p3=1;p3<=Q;p3++) {
-        S62(p1,p3);
-        S63(p1,p3);
-        S64(p1,p3);
-      }
-      S68(p1);
-      S69(p1);
-      S70(p1);
-      S71(p1);
-      S72(p1);
-      S73(p1);
-      S74(p1);
-      S75(p1);
-      S76(p1);
-      S77(p1);
-      S78(p1);
-      S79(p1);
-      S80(p1);
-      S81(p1);
-      S82(p1);
-      S83(p1);
-      S84(p1);
-      S85(p1);
-      S86(p1);
-      S87(p1);
-      S88(p1);
-      S89(p1);
-      S90(p1);
-      S91(p1);
-      S92(p1);
-      S93(p1);
-      S94(p1);
-      for (p3=1;p3<=N;p3++) {
-        for (p5=1;p5<=N;p5++) {
-          S95(p1,p3,p5);
-          S96(p1,p3,p5);
-          S97(p1,p3,p5);
-        }
-        S98(p1,p3);
-      }
-      S99(p1);
-      S100(p1);
-      S101(p1);
-      for (p3=1;p3<=Q;p3++) {
-        S108(p1,p3);
-        S109(p1,p3);
-        S110(p1,p3);
-        S111(p1,p3);
-        S112(p1,p3);
-        S113(p1,p3);
-      }
-      S120(p1);
-      S121(p1);
-      S122(p1);
-      S123(p1);
-      S124(p1);
-      S125(p1);
-    }
-  }
-  if ((N <= 0) && (Q >= 1) && (R <= 0)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1);
-      S39(p1);
-      for (p3=1;p3<=Q;p3++) {
-        S44(p1,p3);
-        S45(p1,p3);
-        S46(p1,p3);
-        S47(p1,p3);
-      }
-      S52(p1);
-      S53(p1);
-      S54(p1);
-      S55(p1);
-      S56(p1);
-      S57(p1);
-      S58(p1);
-      for (p3=1;p3<=Q;p3++) {
-        S62(p1,p3);
-        S63(p1,p3);
-        S64(p1,p3);
-      }
-      S68(p1);
-      S69(p1);
-      S70(p1);
-      S71(p1);
-      S72(p1);
-      S73(p1);
-      S74(p1);
-      S75(p1);
-      S76(p1);
-      S77(p1);
-      S78(p1);
-      S79(p1);
-      S80(p1);
-      S81(p1);
-      S82(p1);
-      S83(p1);
-      S84(p1);
-      S85(p1);
-      S86(p1);
-      S87(p1);
-      S88(p1);
-      S89(p1);
-      S90(p1);
-      S91(p1);
-      S92(p1);
-      S93(p1);
-      S94(p1);
-      S99(p1);
-      S100(p1);
-      S101(p1);
-      for (p3=1;p3<=Q;p3++) {
-        S108(p1,p3);
-        S109(p1,p3);
-        S110(p1,p3);
-        S111(p1,p3);
-        S112(p1,p3);
-        S113(p1,p3);
-      }
-      S120(p1);
-      S121(p1);
-      S122(p1);
-      S123(p1);
-      S124(p1);
-      S125(p1);
-    }
-  }
-  if ((N >= 1) && (Q <= 0) && (R >= 1)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1);
-      S39(p1);
-      for (p3=1;p3<=R;p3++) {
-        S48(p1,p3);
-        S49(p1,p3);
-        S50(p1,p3);
-        S51(p1,p3);
-      }
-      S52(p1);
-      S53(p1);
-      S54(p1);
-      S55(p1);
-      S56(p1);
-      S57(p1);
-      S58(p1);
-      for (p3=1;p3<=R;p3++) {
-        S65(p1,p3);
-        S66(p1,p3);
-        S67(p1,p3);
-      }
-      S68(p1);
-      S69(p1);
-      S70(p1);
-      S71(p1);
-      S72(p1);
-      S73(p1);
-      S74(p1);
-      S75(p1);
-      S76(p1);
-      S77(p1);
-      S78(p1);
-      S79(p1);
-      S80(p1);
-      S81(p1);
-      S82(p1);
-      S83(p1);
-      S84(p1);
-      S85(p1);
-      S86(p1);
-      S87(p1);
-      S88(p1);
-      S89(p1);
-      S90(p1);
-      S91(p1);
-      S92(p1);
-      S93(p1);
-      S94(p1);
-      for (p3=1;p3<=N;p3++) {
-        for (p5=1;p5<=N;p5++) {
-          S95(p1,p3,p5);
-          S96(p1,p3,p5);
-          S97(p1,p3,p5);
-        }
-        S98(p1,p3);
-      }
-      S99(p1);
-      S100(p1);
-      S101(p1);
-      for (p3=1;p3<=R;p3++) {
-        S114(p1,p3);
-        S115(p1,p3);
-        S116(p1,p3);
-        S117(p1,p3);
-        S118(p1,p3);
-        S119(p1,p3);
-      }
-      S120(p1);
-      S121(p1);
-      S122(p1);
-      S123(p1);
-      S124(p1);
-      S125(p1);
-    }
-  }
-  if ((N <= 0) && (Q <= 0) && (R >= 1)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1);
-      S39(p1);
-      for (p3=1;p3<=R;p3++) {
-        S48(p1,p3);
-        S49(p1,p3);
-        S50(p1,p3);
-        S51(p1,p3);
-      }
-      S52(p1);
-      S53(p1);
-      S54(p1);
-      S55(p1);
-      S56(p1);
-      S57(p1);
-      S58(p1);
-      for (p3=1;p3<=R;p3++) {
-        S65(p1,p3);
-        S66(p1,p3);
-        S67(p1,p3);
-      }
-      S68(p1);
-      S69(p1);
-      S70(p1);
-      S71(p1);
-      S72(p1);
-      S73(p1);
-      S74(p1);
-      S75(p1);
-      S76(p1);
-      S77(p1);
-      S78(p1);
-      S79(p1);
-      S80(p1);
-      S81(p1);
-      S82(p1);
-      S83(p1);
-      S84(p1);
-      S85(p1);
-      S86(p1);
-      S87(p1);
-      S88(p1);
-      S89(p1);
-      S90(p1);
-      S91(p1);
-      S92(p1);
-      S93(p1);
-      S94(p1);
-      S99(p1);
-      S100(p1);
-      S101(p1);
-      for (p3=1;p3<=R;p3++) {
-        S114(p1,p3);
-        S115(p1,p3);
-        S116(p1,p3);
-        S117(p1,p3);
-        S118(p1,p3);
-        S119(p1,p3);
-      }
-      S120(p1);
-      S121(p1);
-      S122(p1);
-      S123(p1);
-      S124(p1);
-      S125(p1);
-    }
-  }
-  if ((N >= 1) && (Q <= 0) && (R <= 0)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1);
-      S39(p1);
-      S52(p1);
-      S53(p1);
-      S54(p1);
-      S55(p1);
-      S56(p1);
-      S57(p1);
-      S58(p1);
-      S68(p1);
-      S69(p1);
-      S70(p1);
-      S71(p1);
-      S72(p1);
-      S73(p1);
-      S74(p1);
-      S75(p1);
-      S76(p1);
-      S77(p1);
-      S78(p1);
-      S79(p1);
-      S80(p1);
-      S81(p1);
-      S82(p1);
-      S83(p1);
-      S84(p1);
-      S85(p1);
-      S86(p1);
-      S87(p1);
-      S88(p1);
-      S89(p1);
-      S90(p1);
-      S91(p1);
-      S92(p1);
-      S93(p1);
-      S94(p1);
-      for (p3=1;p3<=N;p3++) {
-        for (p5=1;p5<=N;p5++) {
-          S95(p1,p3,p5);
-          S96(p1,p3,p5);
-          S97(p1,p3,p5);
-        }
-        S98(p1,p3);
-      }
-      S99(p1);
-      S100(p1);
-      S101(p1);
-      S120(p1);
-      S121(p1);
-      S122(p1);
-      S123(p1);
-      S124(p1);
-      S125(p1);
-    }
-  }
-  if ((N <= 0) && (Q <= 0) && (R <= 0)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1);
-      S39(p1);
-      S52(p1);
-      S53(p1);
-      S54(p1);
-      S55(p1);
-      S56(p1);
-      S57(p1);
-      S58(p1);
-      S68(p1);
-      S69(p1);
-      S70(p1);
-      S71(p1);
-      S72(p1);
-      S73(p1);
-      S74(p1);
-      S75(p1);
-      S76(p1);
-      S77(p1);
-      S78(p1);
-      S79(p1);
-      S80(p1);
-      S81(p1);
-      S82(p1);
-      S83(p1);
-      S84(p1);
-      S85(p1);
-      S86(p1);
-      S87(p1);
-      S88(p1);
-      S89(p1);
-      S90(p1);
-      S91(p1);
-      S92(p1);
-      S93(p1);
-      S94(p1);
-      S99(p1);
-      S100(p1);
-      S101(p1);
-      S120(p1);
-      S121(p1);
-      S122(p1);
-      S123(p1);
-      S124(p1);
-      S125(p1);
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/swim.cloog b/cloog-0.16.3/test/swim.cloog
deleted file mode 100644
index 9216e46..0000000
--- a/cloog-0.16.3/test/swim.cloog
+++ /dev/null
@@ -1,2453 +0,0 @@
-c # language is C
-# ---------- CONTEXT ----------
-# Context (no constraints on parameters)
-1    8     # 1 lines, 8 columns
-0    0    0    0    0    0    0    0    
-
-0 # Automatically find parameter names
-
-# ---------- STATEMENTS ----------
-125 # Number of statements
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -1   
-1    -1   0    0    1    0    0    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    1    0    0    0    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -1   
-1    -1   0    0    1    0    0    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    1    0    0    0    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -1   
-1    -1   0    0    1    0    0    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    1    0    0    0    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -1   
-1    -1   0    1    0    0    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-4    8    
-1    0    0    -1   0    0    0    1    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    1    0    0    0    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    1    0    0    0    0    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    1    0    0    0    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    1    0    0    0    0    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    1    0    0    0    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    1    0    0    0    0    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    1    0    0    0    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-0 # Automatically find iterator names.
-
-# ---------- SCATTERING FUNCTIONS ----------
-125 # Number of scattering functions
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    0     # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -1    # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -2    # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -3    # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -4    # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -5    # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -6    # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -7    # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -8    # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -9    # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -10   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -11   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -12   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -13   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -14   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -15   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -16   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -17   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -18   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -19   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -20   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -21   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -22   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -23   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -24   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -25   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -26   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -27   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -27   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -1    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -27   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -2    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -27   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -1    # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -28   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -29   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -30   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -31   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -32   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -33   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -1    # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -2    # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -2    # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -1    # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -2    # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -2    # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -2    # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -3    # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -3    # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -3    # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -1    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -3    # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -2    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -3    # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -3    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -4    # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -4    # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -1    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -4    # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -2    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -4    # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -3    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -5    # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -6    # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -7    # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -8    # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -9    # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -10   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -11   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -12   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -12   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -1    # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -12   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -2    # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -13   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -13   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -1    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -13   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -2    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -14   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -14   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -1    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -14   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -2    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -15   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -16   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -17   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -18   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -19   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -20   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -21   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -22   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -23   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -24   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -25   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -26   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -27   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -28   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -29   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -30   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -31   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -32   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -33   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -35   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -36   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -37   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -38   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -39   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -40   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -41   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -42   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -42   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -1    # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -42   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -2    # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -42   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -1    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -43   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -44   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -45   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -46   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -46   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -1    # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -46   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -2    # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -46   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -3    # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -46   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -4    # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -46   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -5    # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -47   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -47   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -1    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -47   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -2    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -47   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -3    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -47   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -4    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -47   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -5    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -48   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -48   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -1    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -48   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -2    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -48   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -3    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -48   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -4    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -48   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -5    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -49   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -50   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -51   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -52   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -53   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -54   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-1 # Set the scattering parameter names.
-p0 p1 p2 p3 p4 p5 p6 
-
diff --git a/cloog-0.16.3/test/swim.good.c b/cloog-0.16.3/test/swim.good.c
deleted file mode 100644
index 80f0de1..0000000
--- a/cloog-0.16.3/test/swim.good.c
+++ /dev/null
@@ -1,819 +0,0 @@
-/* Generated from ../../../git/cloog/test/swim.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.70s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1() { hash(1); }
-#define S2() { hash(2); }
-#define S3() { hash(3); }
-#define S4() { hash(4); }
-#define S5() { hash(5); }
-#define S6() { hash(6); }
-#define S7() { hash(7); }
-#define S8() { hash(8); }
-#define S9() { hash(9); }
-#define S10() { hash(10); }
-#define S11() { hash(11); }
-#define S12() { hash(12); }
-#define S13() { hash(13); }
-#define S14() { hash(14); }
-#define S15() { hash(15); }
-#define S16() { hash(16); }
-#define S17() { hash(17); }
-#define S18() { hash(18); }
-#define S19() { hash(19); }
-#define S20() { hash(20); }
-#define S21() { hash(21); }
-#define S22() { hash(22); }
-#define S23() { hash(23); }
-#define S24() { hash(24); }
-#define S25() { hash(25); }
-#define S26() { hash(26); }
-#define S27() { hash(27); }
-#define S28(i,j) { hash(28); hash(i); hash(j); }
-#define S29(i,j) { hash(29); hash(i); hash(j); }
-#define S30(i,j) { hash(30); hash(i); hash(j); }
-#define S31(i) { hash(31); hash(i); }
-#define S32() { hash(32); }
-#define S33() { hash(33); }
-#define S34() { hash(34); }
-#define S35() { hash(35); }
-#define S36() { hash(36); }
-#define S37() { hash(37); }
-#define S38(i) { hash(38); hash(i); }
-#define S39(i) { hash(39); hash(i); }
-#define S40(i,j,k) { hash(40); hash(i); hash(j); hash(k); }
-#define S41(i,j,k) { hash(41); hash(i); hash(j); hash(k); }
-#define S42(i,j,k) { hash(42); hash(i); hash(j); hash(k); }
-#define S43(i,j,k) { hash(43); hash(i); hash(j); hash(k); }
-#define S44(i,j) { hash(44); hash(i); hash(j); }
-#define S45(i,j) { hash(45); hash(i); hash(j); }
-#define S46(i,j) { hash(46); hash(i); hash(j); }
-#define S47(i,j) { hash(47); hash(i); hash(j); }
-#define S48(i,j) { hash(48); hash(i); hash(j); }
-#define S49(i,j) { hash(49); hash(i); hash(j); }
-#define S50(i,j) { hash(50); hash(i); hash(j); }
-#define S51(i,j) { hash(51); hash(i); hash(j); }
-#define S52(i) { hash(52); hash(i); }
-#define S53(i) { hash(53); hash(i); }
-#define S54(i) { hash(54); hash(i); }
-#define S55(i) { hash(55); hash(i); }
-#define S56(i) { hash(56); hash(i); }
-#define S57(i) { hash(57); hash(i); }
-#define S58(i) { hash(58); hash(i); }
-#define S59(i,j,k) { hash(59); hash(i); hash(j); hash(k); }
-#define S60(i,j,k) { hash(60); hash(i); hash(j); hash(k); }
-#define S61(i,j,k) { hash(61); hash(i); hash(j); hash(k); }
-#define S62(i,j) { hash(62); hash(i); hash(j); }
-#define S63(i,j) { hash(63); hash(i); hash(j); }
-#define S64(i,j) { hash(64); hash(i); hash(j); }
-#define S65(i,j) { hash(65); hash(i); hash(j); }
-#define S66(i,j) { hash(66); hash(i); hash(j); }
-#define S67(i,j) { hash(67); hash(i); hash(j); }
-#define S68(i) { hash(68); hash(i); }
-#define S69(i) { hash(69); hash(i); }
-#define S70(i) { hash(70); hash(i); }
-#define S71(i) { hash(71); hash(i); }
-#define S72(i) { hash(72); hash(i); }
-#define S73(i) { hash(73); hash(i); }
-#define S74(i) { hash(74); hash(i); }
-#define S75(i) { hash(75); hash(i); }
-#define S76(i) { hash(76); hash(i); }
-#define S77(i) { hash(77); hash(i); }
-#define S78(i) { hash(78); hash(i); }
-#define S79(i) { hash(79); hash(i); }
-#define S80(i) { hash(80); hash(i); }
-#define S81(i) { hash(81); hash(i); }
-#define S82(i) { hash(82); hash(i); }
-#define S83(i) { hash(83); hash(i); }
-#define S84(i) { hash(84); hash(i); }
-#define S85(i) { hash(85); hash(i); }
-#define S86(i) { hash(86); hash(i); }
-#define S87(i) { hash(87); hash(i); }
-#define S88(i) { hash(88); hash(i); }
-#define S89(i) { hash(89); hash(i); }
-#define S90(i) { hash(90); hash(i); }
-#define S91(i) { hash(91); hash(i); }
-#define S92(i) { hash(92); hash(i); }
-#define S93(i) { hash(93); hash(i); }
-#define S94(i) { hash(94); hash(i); }
-#define S95(i,j,k) { hash(95); hash(i); hash(j); hash(k); }
-#define S96(i,j,k) { hash(96); hash(i); hash(j); hash(k); }
-#define S97(i,j,k) { hash(97); hash(i); hash(j); hash(k); }
-#define S98(i,j) { hash(98); hash(i); hash(j); }
-#define S99(i) { hash(99); hash(i); }
-#define S100(i) { hash(100); hash(i); }
-#define S101(i) { hash(101); hash(i); }
-#define S102(i,j,k) { hash(102); hash(i); hash(j); hash(k); }
-#define S103(i,j,k) { hash(103); hash(i); hash(j); hash(k); }
-#define S104(i,j,k) { hash(104); hash(i); hash(j); hash(k); }
-#define S105(i,j,k) { hash(105); hash(i); hash(j); hash(k); }
-#define S106(i,j,k) { hash(106); hash(i); hash(j); hash(k); }
-#define S107(i,j,k) { hash(107); hash(i); hash(j); hash(k); }
-#define S108(i,j) { hash(108); hash(i); hash(j); }
-#define S109(i,j) { hash(109); hash(i); hash(j); }
-#define S110(i,j) { hash(110); hash(i); hash(j); }
-#define S111(i,j) { hash(111); hash(i); hash(j); }
-#define S112(i,j) { hash(112); hash(i); hash(j); }
-#define S113(i,j) { hash(113); hash(i); hash(j); }
-#define S114(i,j) { hash(114); hash(i); hash(j); }
-#define S115(i,j) { hash(115); hash(i); hash(j); }
-#define S116(i,j) { hash(116); hash(i); hash(j); }
-#define S117(i,j) { hash(117); hash(i); hash(j); }
-#define S118(i,j) { hash(118); hash(i); hash(j); }
-#define S119(i,j) { hash(119); hash(i); hash(j); }
-#define S120(i) { hash(120); hash(i); }
-#define S121(i) { hash(121); hash(i); }
-#define S122(i) { hash(122); hash(i); }
-#define S123(i) { hash(123); hash(i); }
-#define S124(i) { hash(124); hash(i); }
-#define S125(i) { hash(125); hash(i); }
-
-void test(int M, int N, int O, int P, int Q, int R)
-{
-  /* Scattering iterators. */
-  int p1, p3, p5;
-  /* Original iterators. */
-  int i, j, k;
-  if (M == 1) {
-    S1() ;
-    S2() ;
-    S3() ;
-    S4() ;
-    S5() ;
-    S6() ;
-    S7() ;
-    S8() ;
-    S9() ;
-    S10() ;
-    S11() ;
-    S12() ;
-    S13() ;
-    S14() ;
-    S15() ;
-    S16() ;
-    S17() ;
-    S18() ;
-    S19() ;
-    S20() ;
-    S21() ;
-    S22() ;
-    S23() ;
-    S24() ;
-    S25() ;
-    S26() ;
-    S27() ;
-  }
-  if (M == 1) {
-    for (p1=1;p1<=N;p1++) {
-      for (p3=1;p3<=N;p3++) {
-        S28(p1,p3) ;
-        S29(p1,p3) ;
-        S30(p1,p3) ;
-      }
-      S31(p1) ;
-    }
-  }
-  if (M == 1) {
-    S32() ;
-    S33() ;
-    S34() ;
-  }
-  if ((M == 1) && (O <= 1)) {
-    S35() ;
-  }
-  if (M == 1) {
-    S36() ;
-    S37() ;
-  }
-  if ((M == 1) && (N >= 1) && (Q >= 1) && (R >= 1)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1) ;
-      S39(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S40(p1,p3,p5) ;
-          S41(p1,p3,p5) ;
-          S42(p1,p3,p5) ;
-          S43(p1,p3,p5) ;
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S44(p1,p3) ;
-        S45(p1,p3) ;
-        S46(p1,p3) ;
-        S47(p1,p3) ;
-      }
-      for (p3=1;p3<=R;p3++) {
-        S48(p1,p3) ;
-        S49(p1,p3) ;
-        S50(p1,p3) ;
-        S51(p1,p3) ;
-      }
-      S52(p1) ;
-      S53(p1) ;
-      S54(p1) ;
-      S55(p1) ;
-      S56(p1) ;
-      S57(p1) ;
-      S58(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S59(p1,p3,p5) ;
-          S60(p1,p3,p5) ;
-          S61(p1,p3,p5) ;
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S62(p1,p3) ;
-        S63(p1,p3) ;
-        S64(p1,p3) ;
-      }
-      for (p3=1;p3<=R;p3++) {
-        S65(p1,p3) ;
-        S66(p1,p3) ;
-        S67(p1,p3) ;
-      }
-      S68(p1) ;
-      S69(p1) ;
-      S70(p1) ;
-      S71(p1) ;
-      S72(p1) ;
-      S73(p1) ;
-      S74(p1) ;
-      S75(p1) ;
-      S76(p1) ;
-      S77(p1) ;
-      S78(p1) ;
-      S79(p1) ;
-      S80(p1) ;
-      S81(p1) ;
-      S82(p1) ;
-      S83(p1) ;
-      S84(p1) ;
-      S85(p1) ;
-      S86(p1) ;
-      S87(p1) ;
-      S88(p1) ;
-      S89(p1) ;
-      S90(p1) ;
-      S91(p1) ;
-      S92(p1) ;
-      S93(p1) ;
-      S94(p1) ;
-      for (p3=1;p3<=N;p3++) {
-        for (p5=1;p5<=N;p5++) {
-          S95(p1,p3,p5) ;
-          S96(p1,p3,p5) ;
-          S97(p1,p3,p5) ;
-        }
-        S98(p1,p3) ;
-      }
-      S99(p1) ;
-      S100(p1) ;
-      S101(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S102(p1,p3,p5) ;
-          S103(p1,p3,p5) ;
-          S104(p1,p3,p5) ;
-          S105(p1,p3,p5) ;
-          S106(p1,p3,p5) ;
-          S107(p1,p3,p5) ;
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S108(p1,p3) ;
-        S109(p1,p3) ;
-        S110(p1,p3) ;
-        S111(p1,p3) ;
-        S112(p1,p3) ;
-        S113(p1,p3) ;
-      }
-      for (p3=1;p3<=R;p3++) {
-        S114(p1,p3) ;
-        S115(p1,p3) ;
-        S116(p1,p3) ;
-        S117(p1,p3) ;
-        S118(p1,p3) ;
-        S119(p1,p3) ;
-      }
-      S120(p1) ;
-      S121(p1) ;
-      S122(p1) ;
-      S123(p1) ;
-      S124(p1) ;
-      S125(p1) ;
-    }
-  }
-  if ((M == 1) && (N <= 0) && (Q >= 1) && (R >= 1)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1) ;
-      S39(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S40(p1,p3,p5) ;
-          S41(p1,p3,p5) ;
-          S42(p1,p3,p5) ;
-          S43(p1,p3,p5) ;
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S44(p1,p3) ;
-        S45(p1,p3) ;
-        S46(p1,p3) ;
-        S47(p1,p3) ;
-      }
-      for (p3=1;p3<=R;p3++) {
-        S48(p1,p3) ;
-        S49(p1,p3) ;
-        S50(p1,p3) ;
-        S51(p1,p3) ;
-      }
-      S52(p1) ;
-      S53(p1) ;
-      S54(p1) ;
-      S55(p1) ;
-      S56(p1) ;
-      S57(p1) ;
-      S58(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S59(p1,p3,p5) ;
-          S60(p1,p3,p5) ;
-          S61(p1,p3,p5) ;
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S62(p1,p3) ;
-        S63(p1,p3) ;
-        S64(p1,p3) ;
-      }
-      for (p3=1;p3<=R;p3++) {
-        S65(p1,p3) ;
-        S66(p1,p3) ;
-        S67(p1,p3) ;
-      }
-      S68(p1) ;
-      S69(p1) ;
-      S70(p1) ;
-      S71(p1) ;
-      S72(p1) ;
-      S73(p1) ;
-      S74(p1) ;
-      S75(p1) ;
-      S76(p1) ;
-      S77(p1) ;
-      S78(p1) ;
-      S79(p1) ;
-      S80(p1) ;
-      S81(p1) ;
-      S82(p1) ;
-      S83(p1) ;
-      S84(p1) ;
-      S85(p1) ;
-      S86(p1) ;
-      S87(p1) ;
-      S88(p1) ;
-      S89(p1) ;
-      S90(p1) ;
-      S91(p1) ;
-      S92(p1) ;
-      S93(p1) ;
-      S94(p1) ;
-      S99(p1) ;
-      S100(p1) ;
-      S101(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S102(p1,p3,p5) ;
-          S103(p1,p3,p5) ;
-          S104(p1,p3,p5) ;
-          S105(p1,p3,p5) ;
-          S106(p1,p3,p5) ;
-          S107(p1,p3,p5) ;
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S108(p1,p3) ;
-        S109(p1,p3) ;
-        S110(p1,p3) ;
-        S111(p1,p3) ;
-        S112(p1,p3) ;
-        S113(p1,p3) ;
-      }
-      for (p3=1;p3<=R;p3++) {
-        S114(p1,p3) ;
-        S115(p1,p3) ;
-        S116(p1,p3) ;
-        S117(p1,p3) ;
-        S118(p1,p3) ;
-        S119(p1,p3) ;
-      }
-      S120(p1) ;
-      S121(p1) ;
-      S122(p1) ;
-      S123(p1) ;
-      S124(p1) ;
-      S125(p1) ;
-    }
-  }
-  if ((M == 1) && (N >= 1) && (Q <= 0) && (R >= 1)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1) ;
-      S39(p1) ;
-      for (p3=1;p3<=R;p3++) {
-        S48(p1,p3) ;
-        S49(p1,p3) ;
-        S50(p1,p3) ;
-        S51(p1,p3) ;
-      }
-      S52(p1) ;
-      S53(p1) ;
-      S54(p1) ;
-      S55(p1) ;
-      S56(p1) ;
-      S57(p1) ;
-      S58(p1) ;
-      for (p3=1;p3<=R;p3++) {
-        S65(p1,p3) ;
-        S66(p1,p3) ;
-        S67(p1,p3) ;
-      }
-      S68(p1) ;
-      S69(p1) ;
-      S70(p1) ;
-      S71(p1) ;
-      S72(p1) ;
-      S73(p1) ;
-      S74(p1) ;
-      S75(p1) ;
-      S76(p1) ;
-      S77(p1) ;
-      S78(p1) ;
-      S79(p1) ;
-      S80(p1) ;
-      S81(p1) ;
-      S82(p1) ;
-      S83(p1) ;
-      S84(p1) ;
-      S85(p1) ;
-      S86(p1) ;
-      S87(p1) ;
-      S88(p1) ;
-      S89(p1) ;
-      S90(p1) ;
-      S91(p1) ;
-      S92(p1) ;
-      S93(p1) ;
-      S94(p1) ;
-      for (p3=1;p3<=N;p3++) {
-        for (p5=1;p5<=N;p5++) {
-          S95(p1,p3,p5) ;
-          S96(p1,p3,p5) ;
-          S97(p1,p3,p5) ;
-        }
-        S98(p1,p3) ;
-      }
-      S99(p1) ;
-      S100(p1) ;
-      S101(p1) ;
-      for (p3=1;p3<=R;p3++) {
-        S114(p1,p3) ;
-        S115(p1,p3) ;
-        S116(p1,p3) ;
-        S117(p1,p3) ;
-        S118(p1,p3) ;
-        S119(p1,p3) ;
-      }
-      S120(p1) ;
-      S121(p1) ;
-      S122(p1) ;
-      S123(p1) ;
-      S124(p1) ;
-      S125(p1) ;
-    }
-  }
-  if ((M == 1) && (N <= 0) && (Q <= 0) && (R >= 1)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1) ;
-      S39(p1) ;
-      for (p3=1;p3<=R;p3++) {
-        S48(p1,p3) ;
-        S49(p1,p3) ;
-        S50(p1,p3) ;
-        S51(p1,p3) ;
-      }
-      S52(p1) ;
-      S53(p1) ;
-      S54(p1) ;
-      S55(p1) ;
-      S56(p1) ;
-      S57(p1) ;
-      S58(p1) ;
-      for (p3=1;p3<=R;p3++) {
-        S65(p1,p3) ;
-        S66(p1,p3) ;
-        S67(p1,p3) ;
-      }
-      S68(p1) ;
-      S69(p1) ;
-      S70(p1) ;
-      S71(p1) ;
-      S72(p1) ;
-      S73(p1) ;
-      S74(p1) ;
-      S75(p1) ;
-      S76(p1) ;
-      S77(p1) ;
-      S78(p1) ;
-      S79(p1) ;
-      S80(p1) ;
-      S81(p1) ;
-      S82(p1) ;
-      S83(p1) ;
-      S84(p1) ;
-      S85(p1) ;
-      S86(p1) ;
-      S87(p1) ;
-      S88(p1) ;
-      S89(p1) ;
-      S90(p1) ;
-      S91(p1) ;
-      S92(p1) ;
-      S93(p1) ;
-      S94(p1) ;
-      S99(p1) ;
-      S100(p1) ;
-      S101(p1) ;
-      for (p3=1;p3<=R;p3++) {
-        S114(p1,p3) ;
-        S115(p1,p3) ;
-        S116(p1,p3) ;
-        S117(p1,p3) ;
-        S118(p1,p3) ;
-        S119(p1,p3) ;
-      }
-      S120(p1) ;
-      S121(p1) ;
-      S122(p1) ;
-      S123(p1) ;
-      S124(p1) ;
-      S125(p1) ;
-    }
-  }
-  if ((M == 1) && (N >= 1) && (Q <= 0) && (R <= 0)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1) ;
-      S39(p1) ;
-      S52(p1) ;
-      S53(p1) ;
-      S54(p1) ;
-      S55(p1) ;
-      S56(p1) ;
-      S57(p1) ;
-      S58(p1) ;
-      S68(p1) ;
-      S69(p1) ;
-      S70(p1) ;
-      S71(p1) ;
-      S72(p1) ;
-      S73(p1) ;
-      S74(p1) ;
-      S75(p1) ;
-      S76(p1) ;
-      S77(p1) ;
-      S78(p1) ;
-      S79(p1) ;
-      S80(p1) ;
-      S81(p1) ;
-      S82(p1) ;
-      S83(p1) ;
-      S84(p1) ;
-      S85(p1) ;
-      S86(p1) ;
-      S87(p1) ;
-      S88(p1) ;
-      S89(p1) ;
-      S90(p1) ;
-      S91(p1) ;
-      S92(p1) ;
-      S93(p1) ;
-      S94(p1) ;
-      for (p3=1;p3<=N;p3++) {
-        for (p5=1;p5<=N;p5++) {
-          S95(p1,p3,p5) ;
-          S96(p1,p3,p5) ;
-          S97(p1,p3,p5) ;
-        }
-        S98(p1,p3) ;
-      }
-      S99(p1) ;
-      S100(p1) ;
-      S101(p1) ;
-      S120(p1) ;
-      S121(p1) ;
-      S122(p1) ;
-      S123(p1) ;
-      S124(p1) ;
-      S125(p1) ;
-    }
-  }
-  if ((M == 1) && (N <= 0) && (Q <= 0) && (R <= 0)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1) ;
-      S39(p1) ;
-      S52(p1) ;
-      S53(p1) ;
-      S54(p1) ;
-      S55(p1) ;
-      S56(p1) ;
-      S57(p1) ;
-      S58(p1) ;
-      S68(p1) ;
-      S69(p1) ;
-      S70(p1) ;
-      S71(p1) ;
-      S72(p1) ;
-      S73(p1) ;
-      S74(p1) ;
-      S75(p1) ;
-      S76(p1) ;
-      S77(p1) ;
-      S78(p1) ;
-      S79(p1) ;
-      S80(p1) ;
-      S81(p1) ;
-      S82(p1) ;
-      S83(p1) ;
-      S84(p1) ;
-      S85(p1) ;
-      S86(p1) ;
-      S87(p1) ;
-      S88(p1) ;
-      S89(p1) ;
-      S90(p1) ;
-      S91(p1) ;
-      S92(p1) ;
-      S93(p1) ;
-      S94(p1) ;
-      S99(p1) ;
-      S100(p1) ;
-      S101(p1) ;
-      S120(p1) ;
-      S121(p1) ;
-      S122(p1) ;
-      S123(p1) ;
-      S124(p1) ;
-      S125(p1) ;
-    }
-  }
-  if ((M == 1) && (N >= 1) && (Q >= 1) && (R <= 0)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1) ;
-      S39(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        S44(p1,p3) ;
-        S45(p1,p3) ;
-        S46(p1,p3) ;
-        S47(p1,p3) ;
-      }
-      S52(p1) ;
-      S53(p1) ;
-      S54(p1) ;
-      S55(p1) ;
-      S56(p1) ;
-      S57(p1) ;
-      S58(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        S62(p1,p3) ;
-        S63(p1,p3) ;
-        S64(p1,p3) ;
-      }
-      S68(p1) ;
-      S69(p1) ;
-      S70(p1) ;
-      S71(p1) ;
-      S72(p1) ;
-      S73(p1) ;
-      S74(p1) ;
-      S75(p1) ;
-      S76(p1) ;
-      S77(p1) ;
-      S78(p1) ;
-      S79(p1) ;
-      S80(p1) ;
-      S81(p1) ;
-      S82(p1) ;
-      S83(p1) ;
-      S84(p1) ;
-      S85(p1) ;
-      S86(p1) ;
-      S87(p1) ;
-      S88(p1) ;
-      S89(p1) ;
-      S90(p1) ;
-      S91(p1) ;
-      S92(p1) ;
-      S93(p1) ;
-      S94(p1) ;
-      for (p3=1;p3<=N;p3++) {
-        for (p5=1;p5<=N;p5++) {
-          S95(p1,p3,p5) ;
-          S96(p1,p3,p5) ;
-          S97(p1,p3,p5) ;
-        }
-        S98(p1,p3) ;
-      }
-      S99(p1) ;
-      S100(p1) ;
-      S101(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        S108(p1,p3) ;
-        S109(p1,p3) ;
-        S110(p1,p3) ;
-        S111(p1,p3) ;
-        S112(p1,p3) ;
-        S113(p1,p3) ;
-      }
-      S120(p1) ;
-      S121(p1) ;
-      S122(p1) ;
-      S123(p1) ;
-      S124(p1) ;
-      S125(p1) ;
-    }
-  }
-  if ((M == 1) && (N <= 0) && (Q >= 1) && (R <= 0)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1) ;
-      S39(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        S44(p1,p3) ;
-        S45(p1,p3) ;
-        S46(p1,p3) ;
-        S47(p1,p3) ;
-      }
-      S52(p1) ;
-      S53(p1) ;
-      S54(p1) ;
-      S55(p1) ;
-      S56(p1) ;
-      S57(p1) ;
-      S58(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        S62(p1,p3) ;
-        S63(p1,p3) ;
-        S64(p1,p3) ;
-      }
-      S68(p1) ;
-      S69(p1) ;
-      S70(p1) ;
-      S71(p1) ;
-      S72(p1) ;
-      S73(p1) ;
-      S74(p1) ;
-      S75(p1) ;
-      S76(p1) ;
-      S77(p1) ;
-      S78(p1) ;
-      S79(p1) ;
-      S80(p1) ;
-      S81(p1) ;
-      S82(p1) ;
-      S83(p1) ;
-      S84(p1) ;
-      S85(p1) ;
-      S86(p1) ;
-      S87(p1) ;
-      S88(p1) ;
-      S89(p1) ;
-      S90(p1) ;
-      S91(p1) ;
-      S92(p1) ;
-      S93(p1) ;
-      S94(p1) ;
-      S99(p1) ;
-      S100(p1) ;
-      S101(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        S108(p1,p3) ;
-        S109(p1,p3) ;
-        S110(p1,p3) ;
-        S111(p1,p3) ;
-        S112(p1,p3) ;
-        S113(p1,p3) ;
-      }
-      S120(p1) ;
-      S121(p1) ;
-      S122(p1) ;
-      S123(p1) ;
-      S124(p1) ;
-      S125(p1) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/test.c b/cloog-0.16.3/test/test.c
deleted file mode 100644
index a3d0711..0000000
--- a/cloog-0.16.3/test/test.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/test.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.01s. */
-for (i=1;i<=2;i++) {
-  for (j=1;j<=M;j++) {
-    S1(i,j);
-  }
-}
-for (i=3;i<=N;i++) {
-  for (j=1;j<=min(M,i-1);j++) {
-    S1(i,j);
-  }
-  if (i >= M+1) {
-    S2(i,i);
-  }
-  if (i <= M) {
-    S1(i,i);
-    S2(i,i);
-  }
-  for (j=i+1;j<=M;j++) {
-    S1(i,j);
-  }
-}
diff --git a/cloog-0.16.3/test/test.cloog b/cloog-0.16.3/test/test.cloog
deleted file mode 100644
index 78bd336..0000000
--- a/cloog-0.16.3/test/test.cloog
+++ /dev/null
@@ -1,33 +0,0 @@
-# language: C
-c
-
-# parameters {m, n | 4<=m<=n}
-2 4
-#  m  n  1
-1 -1  1  0
-1  1  0 -4
-0
-
-2 # Number of statements
-
-1
-# {i, j | 1<=i<=n 1<=j<=m}
-4 6
-#  i  j  m  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-0  0  0
- 
-1
-# {i, j | i=j 3<=j<=N}
-3 6
-#  i  j  m  n  1
-0  1 -1  0  0  0
-1  0  1  0  0 -3
-1  0 -1  0  1  0
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.16.3/test/test.good.c b/cloog-0.16.3/test/test.good.c
deleted file mode 100644
index 3a786f8..0000000
--- a/cloog-0.16.3/test/test.good.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Generated from ../../../git/cloog/test/test.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i, j;
-  for (i=1;i<=2;i++) {
-    for (j=1;j<=M;j++) {
-      S1(i,j) ;
-    }
-  }
-  for (i=3;i<=M-1;i++) {
-    for (j=1;j<=i-1;j++) {
-      S1(i,j) ;
-    }
-    S1(i,i) ;
-    S2(i,i) ;
-    for (j=i+1;j<=M;j++) {
-      S1(i,j) ;
-    }
-  }
-  for (j=1;j<=M-1;j++) {
-    S1(M,j) ;
-  }
-  S1(M,M) ;
-  S2(M,M) ;
-  for (i=M+1;i<=N;i++) {
-    for (j=1;j<=M;j++) {
-      S1(i,j) ;
-    }
-    S2(i,i) ;
-  }
-}
diff --git a/cloog-0.16.3/test/thomasset.c b/cloog-0.16.3/test/thomasset.c
deleted file mode 100644
index f201f6f..0000000
--- a/cloog-0.16.3/test/thomasset.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/thomasset.cloog by CLooG 0.14.0-292-g2bfd6ac gmp bits in 0.04s. */
-if (n >= 1) {
-  for (c1=0;c1<=floord(n-4,3);c1++) {
-    for (i=3*c1+1;i<=3*c1+3;i++) {
-      S1(i,c1);
-    }
-  }
-  c1 = floord(n-1,3);
-  if (c1 >= ceild(n-2,3)) {
-    if (c1 == 0) {
-      S1(1,0);
-      for (j=1;j<=n;j++) {
-        S2(1,j,0,0,0);
-      }
-    }
-    if (c1 >= 1) {
-      for (j=1;j<=2;j++) {
-        S2(1,j,0,c1,0);
-      }
-    }
-    for (i=max(2,3*c1+1);i<=n;i++) {
-      S1(i,c1);
-    }
-  }
-  if (3*c1 == n-3) {
-    for (i=n-2;i<=n;i++) {
-      if (n%3 == 0) {
-        S1(i,(n-3)/3);
-      }
-    }
-  }
-  if (c1 >= ceild(n-2,3)) {
-    for (c2=1;c2<=n-1;c2++) {
-      for (j=1;j<=2;j++) {
-        S2(c2+1,j,0,c1,0);
-      }
-    }
-  }
-  for (c1=ceild(n,3);c1<=floord(2*n,3);c1++) {
-    for (c2=0;c2<=n-1;c2++) {
-      for (j=max(1,3*c1-n);j<=min(n,3*c1-n+4);j++) {
-        p = max(ceild(3*c1-j,3),ceild(n-2,3));
-        if (p <= min(floord(n,3),floord(3*c1-j+2,3))) {
-          S2(c2+1,j,0,p,c1-p);
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/thomasset.cloog b/cloog-0.16.3/test/thomasset.cloog
deleted file mode 100644
index 24c30eb..0000000
--- a/cloog-0.16.3/test/thomasset.cloog
+++ /dev/null
@@ -1,51 +0,0 @@
-# language: C
-c
-1 3
-1 0 0 	# 0 >= 0
-1
-n 
-
-# ------------- STATEMENTS -------------
-2	# Number of statements
-
-# ax:Z
-1	# The domain is made of one polyhedron
-4 5	# 4 lines and 5 columns
-#	i	j	n	
-1	-1	0	1	0	
-1	1	0	0	-1	
-1	1	-3	0	-1	
-1	-1	3	0	3	
-0 0 0	# future options
-
-# ax:P
-1	# The domain is made of one polyhedron
-10 8	# 10 lines and 8 columns
-#	i	j	k	p	q	n	
-1	-1	0	0	0	0	1	0	
-1	0	-1	0	0	0	1	0	
-1	0	1	0	0	0	0	-1	
-1	1	0	0	0	0	0	-1	
-1	0	1	0	0	-3	0	0	
-1	0	-1	0	0	3	0	2	
-1	0	0	0	-3	0	1	0	
-1	0	0	0	3	0	-1	2	
-1	0	0	-3	0	0	0	1	
-1	0	0	3	0	0	0	1	
-0 0 0	# future options
-1	# Iterator Names
-i j k p q
-
-# ------------- SCATTERING -------------
-2 # nb scattering functions
-# Scattering for ax:Z
-2 7	# 2 lines and 7 columns
-#	c1	c2	i	j	n	
-0	1	0	0	-1	0	0	
-0	0	1	0	0	0	0	
-# Scattering for ax:P
-2 10	# 2 lines and 10 columns
-#	c1	c2	i	j	k	p	q	n	
-0	1	0	0	0	-1	-1	-1	0	0
-0	0	1	-1	0	0	0	0	0	1	
-0	# Scattering Function Names
diff --git a/cloog-0.16.3/test/thomasset.good.c b/cloog-0.16.3/test/thomasset.good.c
deleted file mode 100644
index f9ca016..0000000
--- a/cloog-0.16.3/test/thomasset.good.c
+++ /dev/null
@@ -1,99 +0,0 @@
-/* Generated from ../../../git/cloog/test/thomasset.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.10s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j,k,p,q) { hash(2); hash(i); hash(j); hash(k); hash(p); hash(q); }
-
-void test(int n)
-{
-  /* Scattering iterators. */
-  int c1, c2;
-  /* Original iterators. */
-  int i, j, k, p, q;
-  for (c1=0;c1<=floord(n-5,3);c1++) {
-    for (i=max(3*c1+1,1);i<=3*c1+3;i++) {
-      S1(i,c1) ;
-    }
-  }
-  if (n == 1) {
-    S1(1,0) ;
-    for (k=0;k<=min(0,0);k++) {
-      for (p=max(0,ceild(-3*k-1,3));p<=min(floord(-3*k+1,3),0);p++) {
-        q = -k-p ;
-        S2(1,1,k,p,-k-p) ;
-      }
-    }
-  }
-  if (n >= 2) {
-    for (c1=max(0,ceild(n-4,3));c1<=0;c1++) {
-      S1(1,c1) ;
-      for (j=1;j<=min(n,3*c1-n+5);j++) {
-        for (k=0;k<=floord(3*c1-j-n+4,3);k++) {
-          for (p=ceild(n-2,3);p<=floord(3*c1-j-3*k+2,3);p++) {
-            q = c1-k-p ;
-            S2(1,j,k,p,c1-k-p) ;
-          }
-        }
-      }
-      for (i=2;i<=min(n,3*c1+3);i++) {
-        S1(i,c1) ;
-      }
-      for (c2=1;c2<=n-1;c2++) {
-        i = c2+1 ;
-        for (j=1;j<=min(3*c1-n+5,n);j++) {
-          for (k=0;k<=floord(3*c1-j-n+4,3);k++) {
-            for (p=ceild(n-2,3);p<=floord(3*c1-j-3*k+2,3);p++) {
-              q = c1-k-p ;
-              S2(c2+1,j,k,p,c1-k-p) ;
-            }
-          }
-        }
-      }
-    }
-  }
-  for (c1=max(1,ceild(n-4,3));c1<=floord(n-1,3);c1++) {
-    for (j=1;j<=3*c1-n+5;j++) {
-      for (k=0;k<=min(floord(3*c1-j-n+4,3),0);k++) {
-        for (p=max(ceild(n-2,3),ceild(3*c1-j-3*k,3));p<=min(floord(3*c1-j-3*k+2,3),floord(n,3));p++) {
-          q = c1-k-p ;
-          S2(1,j,k,p,c1-k-p) ;
-        }
-      }
-    }
-    for (i=3*c1+1;i<=min(n,3*c1+3);i++) {
-      S1(i,c1) ;
-    }
-    for (c2=1;c2<=n-1;c2++) {
-      i = c2+1 ;
-      for (j=1;j<=3*c1-n+5;j++) {
-        for (k=0;k<=min(floord(3*c1-j-n+4,3),0);k++) {
-          for (p=max(ceild(n-2,3),ceild(3*c1-j-3*k,3));p<=min(floord(3*c1-j-3*k+2,3),floord(n,3));p++) {
-            q = c1-k-p ;
-            S2(c2+1,j,k,p,c1-k-p) ;
-          }
-        }
-      }
-    }
-  }
-  if (n >= 1) {
-    for (c1=ceild(n,3);c1<=floord(2*n+1,3);c1++) {
-      for (c2=0;c2<=n-1;c2++) {
-        i = c2+1 ;
-        for (j=max(1,3*c1-n-1);j<=min(n,3*c1-n+5);j++) {
-          for (k=max(ceild(3*c1-j-n,3),0);k<=min(floord(3*c1-j-n+4,3),0);k++) {
-            for (p=max(ceild(n-2,3),ceild(3*c1-j-3*k,3));p<=min(floord(3*c1-j-3*k+2,3),floord(n,3));p++) {
-              q = c1-k-p ;
-              S2(c2+1,j,k,p,c1-k-p) ;
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/tiling.c b/cloog-0.16.3/test/tiling.c
deleted file mode 100644
index 86f2a2e..0000000
--- a/cloog-0.16.3/test/tiling.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/tiling.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (ii=0;ii<=floord(n,10);ii++) {
-  for (i=10*ii;i<=min(n,10*ii+9);i++) {
-    S1(ii,i) ;
-  }
-}
diff --git a/cloog-0.16.3/test/tiling.cloog b/cloog-0.16.3/test/tiling.cloog
deleted file mode 100644
index fa2b676..0000000
--- a/cloog-0.16.3/test/tiling.cloog
+++ /dev/null
@@ -1,30 +0,0 @@
-# language: C
-c
-
-# parameter {n | n>= 0}
-1 3
-#  n  1
-1  1  0
-1
-n
-
-1 # Number of statements:
-
-1
-# {ii, i | t*ii<=i<=t*ii+t-1  0<=i<=n}
-4 5
-#  ii   i   n   1
-1   0   1   0   0
-1   0  -1   1   0
-1  10  -1   0   9
-1 -10   1   0   0
-0   0   0
-1
-ii i
-
-0 # Scattering functions
-
-1 6
-# c1  ii   i   n   1
-0  1  -1  -2   0   0
-0
diff --git a/cloog-0.16.3/test/tiling.good.c b/cloog-0.16.3/test/tiling.good.c
deleted file mode 100644
index b736286..0000000
--- a/cloog-0.16.3/test/tiling.good.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from ../../../git/cloog/test/tiling.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(ii,i) { hash(1); hash(ii); hash(i); }
-
-void test(int n)
-{
-  /* Original iterators. */
-  int ii, i;
-  for (ii=0;ii<=floord(n,10);ii++) {
-    for (i=max(10*ii,0);i<=min(10*ii+9,n);i++) {
-      S1(ii,i) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/uday_scalars.c b/cloog-0.16.3/test/uday_scalars.c
deleted file mode 100644
index 6c8564c..0000000
--- a/cloog-0.16.3/test/uday_scalars.c
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Generated from ../../../git/cloog/test/uday_scalars.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if (n >= 0) {
-  for (p3=0;p3<=n;p3++) {
-    S1(p3,0,0) ;
-  }
-  for (p3=0;p3<=n;p3++) {
-    S2(0,p3,0) ;
-  }
-}
diff --git a/cloog-0.16.3/test/uday_scalars.cloog b/cloog-0.16.3/test/uday_scalars.cloog
deleted file mode 100644
index 8da09d4..0000000
--- a/cloog-0.16.3/test/uday_scalars.cloog
+++ /dev/null
@@ -1,58 +0,0 @@
-# Langage: C
-c
-
-# Context (1 parameter)
-# no constraints on parameters:
-1 3
-   1    0    1
-1 # Parameter name(s)
-n
-
-# Statement number:
-2
-
-# Iteration domain of statement 1.
-1 # 1 domain
-4 6 # 4 lines and 6 columns
-#       j    l    m    n    cst
-   1    1    0    0    0    0    # j >= 0
-   1   -1    0    0    1    0    # j <= N
-   0    0    1    0    0    0    # l = 0
-   0    0    0    1    0    0    # m = 0
-0 0 0 # For future options.
-
-# Iteration domain of statement 2.
-1 # 1 domain
-4 6 # 4 lines and 6 columns
-#       j    l    m    n    cst
-   1    0    1    0    0    0    # l >= 0
-   1    0   -1    0    1    0    # l <= N
-   0    1    0    0    0    0    # j = 0
-   0    0    0    1    0    0    # m = 0
-0 0 0 # For future options.
-
-
-1 # Iterator name(s)
-j l m 
-
-# 1 scattering functions.
-2
-# First function
-4 10
-#       p1   p2   p3  p4   j    l    m    n    cst
-   0    1    0    0   0    0    0    0    0    0    # p1 = 0
-   0    0    1    0   0    0    0    0    0   -1    # p2 = 1
-   0    0    0    1   0   -1    0    0    0    0    # p3 = j
-   0    0    0    0   1    0    0    0    0    0    # p4 = 0
-
-# Second function
-4 10
-#       p1   p2   p3  p4   j    l    m    n    cst
-   0    1    0    0   0    0    0    0    0   -1    # p1 = 1
-   0    0    1    0   0    0    0    0    0    0    # p2 = 0
-   0    0    0    1   0    0   -1    0    0    0    # p3 = l
-   0    0    0    0   1    0    0    0    0   -1    # p4 = 1
-
-1 # set scattering dimension names manually
-p1 p2 p3 p4
-
diff --git a/cloog-0.16.3/test/uday_scalars.good.c b/cloog-0.16.3/test/uday_scalars.good.c
deleted file mode 100644
index e4969da..0000000
--- a/cloog-0.16.3/test/uday_scalars.good.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Generated from ../../../git/cloog/test/uday_scalars.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(j,l,m) { hash(1); hash(j); hash(l); hash(m); }
-#define S2(j,l,m) { hash(2); hash(j); hash(l); hash(m); }
-
-void test(int n)
-{
-  /* Scattering iterators. */
-  int p3;
-  /* Original iterators. */
-  int j, l, m;
-  for (p3=0;p3<=n;p3++) {
-    S1(p3,0,0) ;
-  }
-  for (p3=0;p3<=n;p3++) {
-    S2(0,p3,0) ;
-  }
-}
diff --git a/cloog-0.16.3/test/union.c b/cloog-0.16.3/test/union.c
deleted file mode 100644
index f65b26f..0000000
--- a/cloog-0.16.3/test/union.c
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Generated from ../../../git/cloog/test/union.cloog by CLooG 0.16.0-3-g7eee03c gmp bits in 0.00s. */
-if (M <= -1) {
-  for (c1=0;c1<=100;c1++) {
-    S1(c1);
-  }
-}
-if (M >= 11) {
-  for (c1=-100;c1<=0;c1++) {
-    S1(-c1);
-  }
-}
-if ((M >= 1) && (M <= 10)) {
-  for (c1=0;c1<=100;c1++) {
-    S1(c1);
-  }
-}
diff --git a/cloog-0.16.3/test/union.cloog b/cloog-0.16.3/test/union.cloog
deleted file mode 100644
index 33e8425..0000000
--- a/cloog-0.16.3/test/union.cloog
+++ /dev/null
@@ -1,33 +0,0 @@
-c
-
-2
-1 3
-1 1 -1
-
-1 3
-1 -1 -1
-
-0
-
-1
-
-1
-2 4
-1 1 0 0
-1 -1 0 100
-
-0 0 0
-
-0
-
-1
-2
-2 5
-0 -1 1 0 0
-1 0 0 -1 10
-
-2 5
-0 -1 -1 0 0
-1 0 0 1 -11
-
-0
diff --git a/cloog-0.16.3/test/union.good.c b/cloog-0.16.3/test/union.good.c
deleted file mode 100644
index 70b4537..0000000
--- a/cloog-0.16.3/test/union.good.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Generated from ../../../git/cloog/test/union.cloog by CLooG 0.14.0-277-g62f7d82 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c1;
-  /* Original iterators. */
-  int i;
-  if (M <= -1) {
-    for (c1=0;c1<=100;c1++) {
-      S1(c1);
-    }
-  }
-  if (M >= 1) {
-    if (M >= 11) {
-      for (c1=-100;c1<=0;c1++) {
-        S1(-c1);
-      }
-    }
-    if (M <= 10) {
-      for (c1=0;c1<=100;c1++) {
-        S1(c1);
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/vasilache.c b/cloog-0.16.3/test/vasilache.c
deleted file mode 100644
index 5a00a33..0000000
--- a/cloog-0.16.3/test/vasilache.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Generated from ../../../git/cloog/test/vasilache.cloog by CLooG 0.14.0-162-g1e599e0 gmp bits in 0.03s. */
-S1();
-S2();
-for (p1=0;p1<=N-1;p1++) {
-  for (p3=0;p3<=N-1;p3++) {
-    S4(p1,p3);
-    S5(p1,p3);
-  }
-}
-for (p1=0;p1<=N-1;p1++) {
-  for (p3=0;p3<=N-1;p3++) {
-    for (p5=0;p5<=floord(N-1,32);p5++) {
-      S7(p1,p3,p5,32*p5);
-      for (p7=32*p5+1;p7<=min(N-1,32*p5+31);p7++) {
-        S6(p1,p3,p5,p7-1);
-        S7(p1,p3,p5,p7);
-      }
-      if (p5 <= floord(N-33,32)) {
-        S6(p1,p3,p5,32*p5+31);
-      }
-      if (p5 >= ceild(N-32,32)) {
-        S6(p1,p3,p5,N-1);
-      }
-    }
-  }
-}
-S8();
diff --git a/cloog-0.16.3/test/vasilache.cloog b/cloog-0.16.3/test/vasilache.cloog
deleted file mode 100644
index 29f9598..0000000
--- a/cloog-0.16.3/test/vasilache.cloog
+++ /dev/null
@@ -1,248 +0,0 @@
-#  A SCoP from matmul (matmul.B.main.scop1.cloog) to check normalization
-#
-#  Options:
-#  cloog -f 8 -l 9 vasilache.cloog
-#  
-#  Correct:
-#  S1;
-#  S2;
-#  for (p0=0;p0<=N-1;p0++) {
-#   for (p1=0;p1<=N-1;p1++) {
-#     S4(i = p0,j = p1);
-#     S5(i = p0,j = p1);
-#   }
-#  }
-#  for (p0=0;p0<=N-1;p0++) {
-#   for (p1=0;p1<=N-1;p1++) {
-#     for (p2=0;p2<=floord(N-1,32);p2++) {
-#       S7(i = p0,j = p1,k = p2,l = 32*p2);
-#       for (p3=32*p2+1;p3<=min(N-1,32*p2+31);p3++) {
-#         S6(i = p0,j = p1,k = p2,l = p3-1);
-#         S7(i = p0,j = p1,k = p2,l = p3);
-#       }
-#       if (p2 >= ceild(N-32,32)) {
-#         S6(i = p0,j = p1,k = p2,l = N-1);
-#       }
-#       if (p2 <= floord(N-33,32)) {
-#         S6(i = p0,j = p1,k = p2,l = 32*p2+31);
-#       }
-#     }
-#   }
-#  }
-#  S8;
-#  
-#  
-#  NOT correct:
-#  S1 ;
-#  S2 ;
-#  for (p1=0;p1<=N-1;p1++) {
-#   for (p3=0;p3<=N-1;p3++) {
-#     S4(i = p1,j = p3) ;
-#     S5(i = p1,j = p3) ;
-#   }
-#  }
-#  for (p1=0;p1<=N-1;p1++) {
-#   for (p3=0;p3<=N-1;p3++) {
-#     for (p5=0;p5<=floord(N-1,32);p5++) {
-#       if (p5 <= 0) {
-#         S7(i = p1,j = p3,k = p5,l = 0) ;
-#       }
-#       p7 = 32*p5 ;
-#       l = 32*p5 ;
-#       S7(i = p1,j = p3,k = p5) ;
-#       for (p7=max(32*p5+1,1);p7<=min(32*p5+31,N-1);p7++) {
-#         l = p7-1 ;
-#         S6(i = p1,j = p3,k = p5) ;
-#         S7(i = p1,j = p3,k = p5,l = p7) ;
-#       }
-#       if (p5 >= ceild(N-32,32)) {
-#         l = N-1 ;
-#         S6(i = p1,j = p3,k = p5) ;
-#       }
-#       p7 = 32*p5+32 ;
-#       l = 32*p5+31 ;
-#       S6(i = p1,j = p3,k = p5) ;
-#     }
-#   }
-#  }
-#    S8 ;
-
-
-
-c # language is C
-# ---------- CONTEXT ----------
-# Context (constraints on parameters)
-2    4     # 1 lines, 4 columns
-1    -1   0    3    
-1    0    1    -100 
-
-
-0 # Automatically find parameter names
-
-# ---------- STATEMENTS ----------
-8 # Number of statements
-
-1 # Statement has a non resticted domain
-1    4    
-1    0    0    0    
-0    0    0    
-
-1 # Statement has a non resticted domain
-1    4    
-1    0    0    0    
-0    0    0    
-
-1 # Statement has 1 domain
-1    4    
-1    1    0    -79  
-0    0    0    
-
-1 # Statement has 1 domain
-4    6    
-1    1    0    0    0    0    
-1    -1   0    0    1    -1   
-1    0    1    0    0    0    
-1    0    -1   0    1    -1   
-0    0    0    
-
-1 # Statement has 1 domain
-4    6    
-1    1    0    0    0    0    
-1    -1   0    0    1    -1   
-1    0    1    0    0    0    
-1    0    -1   0    1    -1   
-0    0    0    
-
-1 # Statement has 1 domain
-8    8    
-1    1    0    0    0    0    0    0    
-1    -1   0    0    0    0    1    -1   
-1    0    1    0    0    0    0    0    
-1    0    -1   0    0    0    1    -1   
-1    0    0    0    1    0    0    0    
-1    0    0    0    -1   0    1    -1   
-1    0    0    -32  1    0    0    0    
-1    0    0    32   -1   0    0    31   
-0    0    0    
-
-1 # Statement has 1 domain
-8    8    
-1    1    0    0    0    0    0    0    
-1    -1   0    0    0    0    1    -1   
-1    0    1    0    0    0    0    0    
-1    0    -1   0    0    0    1    -1   
-1    0    0    0    1    0    0    0    
-1    0    0    0    -1   0    1    -1   
-1    0    0    -32  1    0    0    0    
-1    0    0    32   -1   0    0    31   
-0    0    0    
-
-1 # Statement has a non resticted domain
-1    4    
-1    0    0    0    
-0    0    0    
-
-0 # Automatically find iterator names.
-
-# ---------- SCATTERING FUNCTIONS ----------
-8 # Number of scattering functions
-
-9    13   
-#    p0   p1   p2   p3   p4   p5   p6   p7   p8   
-0    1    0    0    0    0    0    0    0    0                   0    0    0     # Beta 0
-0    0    1    0    0    0    0    0    0    0                   0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0    0    0                   0    0    0     # Beta 1
-0    0    0    0    1    0    0    0    0    0                   0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0    0    0                   0    0    0     # Beta 2
-0    0    0    0    0    0    1    0    0    0                   0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1    0    0                   0    0    0     # Beta 3
-0    0    0    0    0    0    0    0    1    0                   0    0    0     # Alpha & Gamma 4
-0    0    0    0    0    0    0    0    0    1                   0    0    0     # Beta 4
-
-9    13   
-#    p0   p1   p2   p3   p4   p5   p6   p7   p8   
-0    1    0    0    0    0    0    0    0    0                   0    0    -1    # Beta 0
-0    0    1    0    0    0    0    0    0    0                   0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0    0    0                   0    0    0     # Beta 1
-0    0    0    0    1    0    0    0    0    0                   0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0    0    0                   0    0    0     # Beta 2
-0    0    0    0    0    0    1    0    0    0                   0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1    0    0                   0    0    0     # Beta 3
-0    0    0    0    0    0    0    0    1    0                   0    0    0     # Alpha & Gamma 4
-0    0    0    0    0    0    0    0    0    1                   0    0    0     # Beta 4
-
-9    13   
-#    p0   p1   p2   p3   p4   p5   p6   p7   p8   
-0    1    0    0    0    0    0    0    0    0                   0    0    -2    # Beta 0
-0    0    1    0    0    0    0    0    0    0                   0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0    0    0                   0    0    0     # Beta 1
-0    0    0    0    1    0    0    0    0    0                   0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0    0    0                   0    0    0     # Beta 2
-0    0    0    0    0    0    1    0    0    0                   0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1    0    0                   0    0    0     # Beta 3
-0    0    0    0    0    0    0    0    1    0                   0    0    0     # Alpha & Gamma 4
-0    0    0    0    0    0    0    0    0    1                   0    0    0     # Beta 4
-
-9    15   
-#    p0   p1   p2   p3   p4   p5   p6   p7   p8   
-0    1    0    0    0    0    0    0    0    0         0    0              0    0    -3    # Beta 0
-0    0    1    0    0    0    0    0    0    0         -1   0              0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0    0    0         0    0              0    0    0     # Beta 1
-0    0    0    0    1    0    0    0    0    0         0    -1             0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0    0    0         0    0              0    0    0     # Beta 2
-0    0    0    0    0    0    1    0    0    0         0    0              0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1    0    0         0    0              0    0    0     # Beta 3
-0    0    0    0    0    0    0    0    1    0         0    0              0    0    0     # Alpha & Gamma 4
-0    0    0    0    0    0    0    0    0    1         0    0              0    0    0     # Beta 4
-
-9    15   
-#    p0   p1   p2   p3   p4   p5   p6   p7   p8   
-0    1    0    0    0    0    0    0    0    0         0    0              0    0    -3    # Beta 0
-0    0    1    0    0    0    0    0    0    0         -1   0              0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0    0    0         0    0              0    0    0     # Beta 1
-0    0    0    0    1    0    0    0    0    0         0    -1             0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0    0    0         0    0              0    0    -1    # Beta 2
-0    0    0    0    0    0    1    0    0    0         0    0              0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1    0    0         0    0              0    0    0     # Beta 3
-0    0    0    0    0    0    0    0    1    0         0    0              0    0    0     # Alpha & Gamma 4
-0    0    0    0    0    0    0    0    0    1         0    0              0    0    0     # Beta 4
-
-9    17   
-#    p0   p1   p2   p3   p4   p5   p6   p7   p8   
-0    1    0    0    0    0    0    0    0    0         0    0    0    0              0    0    -4    # Beta 0
-0    0    1    0    0    0    0    0    0    0         -1   0    0    0              0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0    0    0         0    0    0    0              0    0    0     # Beta 1
-0    0    0    0    1    0    0    0    0    0         0    -1   0    0              0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0    0    0         0    0    0    0              0    0    0     # Beta 2
-0    0    0    0    0    0    1    0    0    0         0    0    -1   0              0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1    0    0         0    0    0    0              0    0    0     # Beta 3
-0    0    0    0    0    0    0    0    1    0         0    0    0    -1             0    0    -1    # Alpha & Gamma 4
-0    0    0    0    0    0    0    0    0    1         0    0    0    0              0    0    0     # Beta 4
-
-9    17   
-#    p0   p1   p2   p3   p4   p5   p6   p7   p8   
-0    1    0    0    0    0    0    0    0    0         0    0    0    0              0    0    -4    # Beta 0
-0    0    1    0    0    0    0    0    0    0         -1   0    0    0              0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0    0    0         0    0    0    0              0    0    0     # Beta 1
-0    0    0    0    1    0    0    0    0    0         0    -1   0    0              0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0    0    0         0    0    0    0              0    0    0     # Beta 2
-0    0    0    0    0    0    1    0    0    0         0    0    -1   0              0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1    0    0         0    0    0    0              0    0    0     # Beta 3
-0    0    0    0    0    0    0    0    1    0         0    0    0    -1             0    0    0     # Alpha & Gamma 4
-0    0    0    0    0    0    0    0    0    1         0    0    0    0              0    0    -1    # Beta 4
-
-9    13   
-#    p0   p1   p2   p3   p4   p5   p6   p7   p8   
-0    1    0    0    0    0    0    0    0    0                   0    0    -5    # Beta 0
-0    0    1    0    0    0    0    0    0    0                   0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0    0    0                   0    0    0     # Beta 1
-0    0    0    0    1    0    0    0    0    0                   0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0    0    0                   0    0    0     # Beta 2
-0    0    0    0    0    0    1    0    0    0                   0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1    0    0                   0    0    0     # Beta 3
-0    0    0    0    0    0    0    0    1    0                   0    0    0     # Alpha & Gamma 4
-0    0    0    0    0    0    0    0    0    1                   0    0    0     # Beta 4
-
-1 # Set the scattering parameter names.
-p0 p1 p2 p3 p4 p5 p6 p7 p8 
-
diff --git a/cloog-0.16.3/test/vasilache.good.c b/cloog-0.16.3/test/vasilache.good.c
deleted file mode 100644
index f12f3fa..0000000
--- a/cloog-0.16.3/test/vasilache.good.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Generated from ../../../git/cloog/test/vasilache.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.15s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1() { hash(1); }
-#define S2() { hash(2); }
-#define S3() { hash(3); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-#define S5(i,j) { hash(5); hash(i); hash(j); }
-#define S6(i,j,k,l) { hash(6); hash(i); hash(j); hash(k); hash(l); }
-#define S7(i,j,k,l) { hash(7); hash(i); hash(j); hash(k); hash(l); }
-#define S8() { hash(8); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int p1, p3, p5, p7;
-  /* Original iterators. */
-  int i, j, k, l;
-  S1() ;
-  S2() ;
-  for (p1=0;p1<=N-1;p1++) {
-    for (p3=0;p3<=N-1;p3++) {
-      S4(p1,p3) ;
-      S5(p1,p3) ;
-    }
-  }
-  for (p1=0;p1<=N-1;p1++) {
-    for (p3=0;p3<=N-1;p3++) {
-      for (p5=0;p5<=floord(N-1,32);p5++) {
-        if (p5 >= 0) {
-          p7 = 32*p5 ;
-          l = 32*p5 ;
-          S7(p1,p3,p5,32*p5) ;
-        }
-        if (p5 <= -1) {
-          S7(p1,p3,p5,0) ;
-        }
-        for (p7=max(32*p5+1,1);p7<=min(N-1,32*p5+31);p7++) {
-          l = p7-1 ;
-          S6(p1,p3,p5,p7-1) ;
-          S7(p1,p3,p5,p7) ;
-        }
-        if (p5 >= ceild(N-32,32)) {
-          l = N-1 ;
-          S6(p1,p3,p5,N-1) ;
-        }
-        if (p5 <= floord(N-33,32)) {
-          p7 = 32*p5+32 ;
-          l = 32*p5+31 ;
-          S6(p1,p3,p5,32*p5+31) ;
-        }
-      }
-    }
-  }
-  S8() ;
-}
diff --git a/cloog-0.16.3/test/vivien.c b/cloog-0.16.3/test/vivien.c
deleted file mode 100644
index d364046..0000000
--- a/cloog-0.16.3/test/vivien.c
+++ /dev/null
@@ -1,195 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/vivien.cloog by CLooG 0.14.0-292-g2bfd6ac gmp bits in 0.12s. */
-if (n >= 0) {
-  for (p1=-54*n+4;p1<=4;p1++) {
-    if (p1%2 == 0) {
-      S1((p1-2)/2);
-    }
-  }
-  if (n >= 1) {
-    S3(1);
-  }
-  if (n <= 1) {
-    S1(2);
-  }
-  if (n >= 2) {
-    S4(1,2);
-    S1(2);
-    S6(1,2);
-  }
-  for (p1=7;p1<=min(9,4*n-2);p1++) {
-    if (p1 == 8) {
-      S4(1,3);
-    }
-    if (p1 == 8) {
-      S1(3);
-    }
-    if (p1 == 8) {
-      S6(1,3);
-    }
-    if (p1 == 9) {
-      S3(2);
-    }
-    if ((p1+1)%2 == 0) {
-      S2((p1-3)/2,1);
-    }
-  }
-  for (p1=10;p1<=min(2*n+58,4*n-2);p1++) {
-    p2 = ceild(-p1+2,4);
-    if (p2 <= min(floord(-p1+2*n,2),floord(-p1+5,4))) {
-      if (p1%2 == 0) {
-        S4(-p2,(p1+2*p2)/2);
-      }
-    }
-    if (p1 >= 4*n-4) {
-      if (p1%2 == 0) {
-        for (p3=1;p3<=floord(p1-2*n-2,2);p3++) {
-          S5((p1-2*n)/2,n,p3);
-        }
-      }
-    }
-    p2 = ceild(-p1+6,4);
-    if (p2 <= min(floord(-p1+2*n,2),floord(-p1+9,4))) {
-      if (p1%2 == 0) {
-        S4(-p2,(p1+2*p2)/2);
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        if (p1%2 == 0) {
-          S5(-p2+1,(p1+2*p2-2)/2,p3);
-        }
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=min(-1,floord(-p1+2*n,2));p2++) {
-      if (p1%2 == 0) {
-        S4(-p2,(p1+2*p2)/2);
-      }
-      if (p1%2 == 0) {
-        S6(-p2+2,(p1+2*p2-4)/2);
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        if (p1%2 == 0) {
-          S5(-p2+1,(p1+2*p2-2)/2,p3);
-        }
-      }
-    }
-    if ((p1 >= 2*n+4) && (p1 <= 4*n-6)) {
-      if (p1%2 == 0) {
-        S6((p1-2*n+2)/2,n-1);
-        for (p3=1;p3<=floord(p1-2*n-2,2);p3++) {
-          S5((p1-2*n)/2,n,p3);
-        }
-      }
-    }
-    if (p1 >= 2*n+6) {
-      if (p1%2 == 0) {
-        S6((p1-2*n)/2,n);
-      }
-    }
-    if (p1 <= 2*n+4) {
-      if (p1%2 == 0) {
-        S6(2,(p1-4)/2);
-      }
-      if ((p1+3)%4 == 0) {
-        S3((p1-1)/4);
-      }
-      if (p1%2 == 0) {
-        S1((p1-2)/2);
-      }
-    }
-    if (p1 >= 2*n+5) {
-      if ((p1+3)%4 == 0) {
-        S3((p1-1)/4);
-      }
-      if (p1%2 == 0) {
-        S1((p1-2)/2);
-      }
-    }
-    if (p1 <= 2*n+2) {
-      if (p1%2 == 0) {
-        S6(1,(p1-2)/2);
-      }
-    }
-    for (p2=max(1,ceild(p1-2*n-1,2));p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        S2((p1-2*p2-1)/2,p2);
-      }
-    }
-  }
-  if ((n >= 2) && (n <= 29)) {
-    S2(n,n-1);
-  }
-  if ((n >= 2) && (n <= 29)) {
-    S1(2*n-1);
-  }
-  if ((n >= 2) && (n <= 28)) {
-    S3(n);
-  }
-  for (p1=max(7,4*n+2);p1<=2*n+58;p1++) {
-    if (p1%2 == 0) {
-      S1((p1-2)/2);
-    }
-  }
-  for (p1=2*n+59;p1<=4*n-2;p1++) {
-    p2 = ceild(-p1+2,4);
-    if (p2 <= min(floord(-p1+2*n,2),floord(-p1+5,4))) {
-      if (p1%2 == 0) {
-        S4(-p2,(p1+2*p2)/2);
-      }
-    }
-    if (p1 >= 4*n-4) {
-      if (p1%2 == 0) {
-        for (p3=1;p3<=floord(p1-2*n-2,2);p3++) {
-          S5((p1-2*n)/2,n,p3);
-        }
-      }
-    }
-    p2 = ceild(-p1+6,4);
-    if (p2 <= min(floord(-p1+2*n,2),floord(-p1+9,4))) {
-      if (p1%2 == 0) {
-        S4(-p2,(p1+2*p2)/2);
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        if (p1%2 == 0) {
-          S5(-p2+1,(p1+2*p2-2)/2,p3);
-        }
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        S4(-p2,(p1+2*p2)/2);
-      }
-      if (p1%2 == 0) {
-        S6(-p2+2,(p1+2*p2-4)/2);
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        if (p1%2 == 0) {
-          S5(-p2+1,(p1+2*p2-2)/2,p3);
-        }
-      }
-    }
-    if (p1 <= 4*n-6) {
-      if (p1%2 == 0) {
-        S6((p1-2*n+2)/2,n-1);
-        for (p3=1;p3<=floord(p1-2*n-2,2);p3++) {
-          S5((p1-2*n)/2,n,p3);
-        }
-      }
-    }
-    if (p1%2 == 0) {
-      S6((p1-2*n)/2,n);
-    }
-    if ((p1+3)%4 == 0) {
-      S3((p1-1)/4);
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        S2((p1-2*p2-1)/2,p2);
-      }
-    }
-  }
-  if (n >= 30) {
-    S2(n,n-1);
-  }
-  if (n >= 29) {
-    S3(n);
-  }
-}
diff --git a/cloog-0.16.3/test/vivien.cloog b/cloog-0.16.3/test/vivien.cloog
deleted file mode 100644
index 3db4103..0000000
--- a/cloog-0.16.3/test/vivien.cloog
+++ /dev/null
@@ -1,156 +0,0 @@
-#    Context
-c # output in language C
-
-# no constraints on parameters
-1 3 # 1 line and 3 columns
-
-# n 1
-1 0 0  # 0 >= 0 always true
-
-1 	# Setting manually the parameter' sname
-n  	# The name
-
-
-
-# --------------------  Statements  ------------------
-6 # Number of statements
-
-
-1 # First statement: 1 domain 
-
-# First domain
-
-2 4  			# 2 lines and 4 columns
-#   i   n    1
-1   1   27   -1		# i >= 1
-1  -1   1    28		# n >= i
-0 0 0
-
-1 # Second statement: 1 domain 
-
-# First domain
-
-4 5  			# 4 lines and 5 columns
-#   i   k   n    1
-1   1   29   0   -1		# i >= 1
-1  -1   0   1    0		# n >= i
-1   0   1   0   -1		# k >= 1
-1   1  -1   0   -1		# k <= i-1
-0 0 0
-
-
-1 # Third statement: 1 domain 
-
-# First domain
-
-2 4  			# 2 lines and 4 columns
-#   i   n    1
-1   1   0   -1		# i >= 1
-1  -1   1    0		# n >= i
-0 0 0
-
-
-1 # Fourth statement: 1 domain 
-
-# First domain
-
-4 5  			# 4 lines and 5 columns
-#   i   j   n    1
-1   1   0   0   -1		# i >= 1
-1  -1   0   1    0		# n >= i
-1  -1   1   0   -1		# j >= i+1
-1   0  -1   1    0		# j <= n
-0 0 0
-
-1 # Fifth statement: 1 domain 
-
-# First domain
-
-6 6  			# 6 lines and 6 columns
-#   i   j   k   n    1
-1   1   0   0   0   -1		# i >= 1
-1  -1   0   0   1    0		# n >= i
-1  -1   1   0   0   -1		# j >= i+1
-1   0  -1   0   1    0		# j <= n
-1   0   0   1   0   -1		# k >= 1
-1   1   0  -1   0   -1		# k <= i-1
-0 0 0
-
-1 # Sixth statement: 1 domain 
-
-# First domain
-
-4 5  			# 4 lines and 5 columns
-#   i   j   n    1
-1   1   0   0   -1		# i >= 1
-1  -1   0   1    0		# n >= i
-1  -1   1   0   -1		# j >= i+1
-1   0  -1   1    0		# j <= n
-0 0 0
-
-
-1 # We manually set the iterator names
-i j k
-
-
-# ------------------------ Scattering -------------------
-
-6 # Number of scattering functions
-
-
-# First function
-3 7					# 3 lines and 7 columns
-#   p1  p2  p3   i   n   1
-0    1   0   0  -2   0  -2	 	# p1 = 2i+2
-0    0   1   0   0   0   0 		# p2 = 0
-0    0   0   1   0   0   0	 	# p3 = 0
-
-# Second function
-3 8					# 3 lines and 8 columns
-#   p1  p2  p3   i   j   n   1
-0    1   0   0  -2  -2   0  -1 		# p1 = 2i+2j+1
-0    0   1   0   0  -1   0   0 		# p2 = j
-0    0   0   1   0   0   0   0 		# p3 = 0
-
-# Third function
-3 7					# 3 lines and 7 columns
-#   p1  p2  p3   i   n   1	
-0    1   0   0  -4   0  -1	 	# p1 = 4i+1
-0    0   1   0   0   0   0 		# p2 = 0
-0    0   0   1   0   0   0 		# p3 = 0
-
-# Fourth function
-3 8					# 3 lines and 8 columns
-#   p1  p2  p3   i   j   n   1
-0    1   0   0  -2  -2   0   0 		# p1 = 2i+2j
-0    0   1   0   1   0   0   0 		# p2 = -i
-0    0   0   1   0   0   0   0 		# p3 = 0
-
-
-# Fifth function
-3 9					# 3 lines and 9 columns
-#   p1  p2  p3   i   j   k   n   1
-0    1   0   0  -2  -2   0   0   0	# p1 = 2i+2j
-0    0   1   0   1   0   0   0  -1	# p2 = -i+1
-0    0   0   1   0   0  -1   0   0	# p3 = k
-
-# Sixth function
-3 8					# 3 lines and 8 columns
-#   p1  p2  p3   i   j   n   1
-0    1   0   0  -2  -2   0   0 		# p1 = 2i+2j
-0    0   1   0   1   0   0  -2 		# p2 = -i+2
-0    0   0   1   0   0   0   0 		# p3 = 0
-
-1 # Manually set the scattering dimensions
-p1 p2 p3
-
-
-
-
-
-
-
-
-
-
-
diff --git a/cloog-0.16.3/test/vivien.good.c b/cloog-0.16.3/test/vivien.good.c
deleted file mode 100644
index 8d2c9d3..0000000
--- a/cloog-0.16.3/test/vivien.good.c
+++ /dev/null
@@ -1,831 +0,0 @@
-/* Generated from ../../../git/cloog/test/vivien.cloog by CLooG 0.14.0-76-gef19709 gmp bits in 0.78s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i) { hash(3); hash(i); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-#define S5(i,j,k) { hash(5); hash(i); hash(j); hash(k); }
-#define S6(i,j) { hash(6); hash(i); hash(j); }
-
-void test(int n)
-{
-  /* Scattering iterators. */
-  int p1, p2, p3;
-  /* Original iterators. */
-  int i, j, k;
-  for (p1=-54*n+4;p1<=min(4,4*n+1);p1++) {
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-  }
-  if (n >= 1) {
-    S3(1) ;
-  }
-  if (n >= 2) {
-    S4(1,2) ;
-    S1(2) ;
-    S6(1,2) ;
-  }
-  for (p1=max(-54*n+4,4*n+2);p1<=6;p1++) {
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-  }
-  for (p1=7;p1<=min(min(2*n+2,9),floord(4*n+12,3));p1++) {
-    for (p2=ceild(-p1+2,4);p2<=-1;p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    if (p1%2 == 0) {
-      j = (p1-2)/2 ;
-      S6(1,(p1-2)/2) ;
-    }
-    if ((p1+1)%2 == 0) {
-      i = (p1-3)/2 ;
-      S2((p1-3)/2,1) ;
-    }
-  }
-  for (p1=2*n+3;p1<=min(9,4*n-2);p1++) {
-    for (p2=ceild(-p1+2,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  if (n >= 4) {
-    S4(2,3) ;
-    S4(1,4) ;
-    S5(2,3,1) ;
-    S6(2,3) ;
-    S1(4) ;
-    S6(1,4) ;
-  }
-  if (n == 3) {
-    S4(2,3) ;
-    S5(2,3,1) ;
-    S6(2,3) ;
-    S1(4) ;
-  }
-  for (p1=11;p1<=min(12,2*n+2);p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p2=ceild(-p1+6,4);p2<=-1;p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    if (p1%2 == 0) {
-      j = (p1-4)/2 ;
-      S6(2,(p1-4)/2) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    if (p1%2 == 0) {
-      j = (p1-2)/2 ;
-      S6(1,(p1-2)/2) ;
-    }
-    if ((p1+1)%2 == 0) {
-      i = (p1-3)/2 ;
-      S2((p1-3)/2,1) ;
-    }
-    for (p2=2;p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  if (n == 4) {
-    S2(4,1) ;
-    S2(3,2) ;
-  }
-  if (n == 5) {
-    S3(3) ;
-    S2(5,1) ;
-    S2(4,2) ;
-  }
-  if (n >= 6) {
-    S3(3) ;
-    S2(5,1) ;
-    S2(4,2) ;
-  }
-  if ((n <= 4) && (n >= 4)) {
-    p1 = 2*n+4 ;
-    for (p2=ceild(-n-1,2);p2<=-2;p2++) {
-      j = p2+n+2 ;
-      S4(-p2,p2+n+2) ;
-    }
-    for (p2=ceild(-n+1,2);p2<=-1;p2++) {
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        j = p2+n+1 ;
-        S5(-p2+1,p2+n+1,p3) ;
-      }
-    }
-    S6(2,n) ;
-    i = n+1 ;
-    S1(n+1) ;
-  }
-  for (p1=14;p1<=2*n+2;p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    p2 = floord(-p1+9,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=-1;p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    if (p1%2 == 0) {
-      j = (p1-4)/2 ;
-      S6(2,(p1-4)/2) ;
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    if (p1%2 == 0) {
-      j = (p1-2)/2 ;
-      S6(1,(p1-2)/2) ;
-    }
-    if ((p1+1)%2 == 0) {
-      i = (p1-3)/2 ;
-      S2((p1-3)/2,1) ;
-    }
-    for (p2=2;p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  if ((n <= 4) && (n >= 4)) {
-    S3(3) ;
-    for (p2=-n+6;p2<=2;p2++) {
-      i = -p2+6 ;
-      S2(-p2+6,p2) ;
-    }
-  }
-  if (n >= 7) {
-    p1 = 2*n+3 ;
-    if ((n+1)%2 == 0) {
-      i = (n+1)/2 ;
-      S3((n+1)/2) ;
-    }
-    S2(n,1) ;
-    for (p2=2;p2<=floord(n,2);p2++) {
-      i = -p2+n+1 ;
-      S2(-p2+n+1,p2) ;
-    }
-  }
-  if ((n <= 6) && (n >= 6)) {
-    p1 = 2*n+3 ;
-    if ((n+1)%2 == 0) {
-      i = (n+1)/2 ;
-      S3((n+1)/2) ;
-    }
-    S2(n,1) ;
-    for (p2=2;p2<=floord(n,2);p2++) {
-      i = -p2+n+1 ;
-      S2(-p2+n+1,p2) ;
-    }
-  }
-  if (n >= 7) {
-    p1 = 2*n+4 ;
-    for (p2=ceild(-n-1,2);p2<=floord(-2*n+1,4);p2++) {
-      j = p2+n+2 ;
-      S4(-p2,p2+n+2) ;
-    }
-    for (p2=ceild(-n+1,2);p2<=floord(-2*n+5,4);p2++) {
-      j = p2+n+2 ;
-      S4(-p2,p2+n+2) ;
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        j = p2+n+1 ;
-        S5(-p2+1,p2+n+1,p3) ;
-      }
-    }
-    for (p2=ceild(-n+3,2);p2<=-2;p2++) {
-      j = p2+n+2 ;
-      S4(-p2,p2+n+2) ;
-      i = -p2+2 ;
-      j = p2+n ;
-      S6(-p2+2,p2+n) ;
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        j = p2+n+1 ;
-        S5(-p2+1,p2+n+1,p3) ;
-      }
-    }
-    j = n-1 ;
-    S6(3,n-1) ;
-    S5(2,n,1) ;
-    S6(2,n) ;
-    i = n+1 ;
-    S1(n+1) ;
-  }
-  if ((n <= 5) && (n >= 5)) {
-    p1 = 2*n+4 ;
-    for (p2=ceild(-n-1,2);p2<=floord(-2*n+1,4);p2++) {
-      j = p2+n+2 ;
-      S4(-p2,p2+n+2) ;
-    }
-    for (p2=ceild(-n+1,2);p2<=-2;p2++) {
-      j = p2+n+2 ;
-      S4(-p2,p2+n+2) ;
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        j = p2+n+1 ;
-        S5(-p2+1,p2+n+1,p3) ;
-      }
-    }
-    for (p2=-1;p2<=floord(-2*n+5,4);p2++) {
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        j = p2+n+1 ;
-        S5(-p2+1,p2+n+1,p3) ;
-      }
-    }
-    for (p2=ceild(-n+3,2);p2<=-1;p2++) {
-      i = -p2+2 ;
-      j = p2+n ;
-      S6(-p2+2,p2+n) ;
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        j = p2+n+1 ;
-        S5(-p2+1,p2+n+1,p3) ;
-      }
-    }
-    S6(2,n) ;
-    i = n+1 ;
-    S1(n+1) ;
-  }
-  if ((n <= 6) && (n >= 6)) {
-    p1 = 2*n+4 ;
-    for (p2=ceild(-n-1,2);p2<=floord(-2*n+1,4);p2++) {
-      j = p2+n+2 ;
-      S4(-p2,p2+n+2) ;
-    }
-    for (p2=ceild(-n+1,2);p2<=-2;p2++) {
-      j = p2+n+2 ;
-      S4(-p2,p2+n+2) ;
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        j = p2+n+1 ;
-        S5(-p2+1,p2+n+1,p3) ;
-      }
-    }
-    j = n-1 ;
-    S6(3,n-1) ;
-    S5(2,n,1) ;
-    S6(2,n) ;
-    i = n+1 ;
-    S1(n+1) ;
-  }
-  for (p1=2*n+5;p1<=min(4*n-10,2*n+58);p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    p2 = floord(-p1+9,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    p2 = floord(-p1+2*n+2,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    for (p2=ceild(-p1+2*n+3,2);p2<=min(floord(-p1+2*n+4,2),-1);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=max(4*n-9,2*n+5);p1<=min(4*n-8,2*n+58);p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p2=ceild(-p1+6,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    p2 = floord(-p1+2*n+2,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    for (p2=ceild(-p1+2*n+3,2);p2<=min(floord(-p1+2*n+4,2),-1);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=max(4*n-7,2*n+5);p1<=min(4*n-6,2*n+58);p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p2=ceild(-p1+6,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=ceild(-p1+2*n+1,2);p2<=floord(-p1+9,4);p2++) {
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=floord(-p1+2*n+2,2);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=ceild(-p1+2*n+3,2);p2<=min(floord(-p1+2*n+4,2),-1);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=max(max(4*n-5,14),2*n+5);p1<=min(4*n-2,2*n+58);p1++) {
-    for (p2=ceild(-p1+2,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-    }
-    for (p2=max(ceild(-p1+2*n+1,2),ceild(-p1+6,4));p2<=floord(-p1+2*n+2,2);p2++) {
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=max(ceild(-p1+10,4),ceild(-p1+2*n+3,2));p2<=min(floord(-p1+2*n+4,2),-1);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  if ((n >= 2) && (n <= 29)) {
-    p1 = 4*n-1 ;
-    p2 = n-1 ;
-    j = n-1 ;
-    S2(n,n-1) ;
-  }
-  for (p1=2*n+59;p1<=4*n-10;p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    p2 = floord(-p1+9,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    p2 = floord(-p1+2*n+2,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    p2 = floord(-p1+2*n+4,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=max(4*n-9,2*n+59);p1<=4*n-8;p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p2=ceild(-p1+6,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    p2 = floord(-p1+2*n+2,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    p2 = floord(-p1+2*n+4,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=max(4*n-7,2*n+59);p1<=4*n-6;p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p2=ceild(-p1+6,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=ceild(-p1+2*n+1,2);p2<=floord(-p1+9,4);p2++) {
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=floord(-p1+2*n+2,2);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    p2 = floord(-p1+2*n+4,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=max(4*n-5,2*n+59);p1<=4*n-2;p1++) {
-    for (p2=ceild(-p1+2,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-    }
-    for (p2=max(ceild(-p1+2*n+1,2),ceild(-p1+6,4));p2<=floord(-p1+2*n+2,2);p2++) {
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=max(ceild(-p1+10,4),ceild(-p1+2*n+3,2));p2<=floord(-p1+2*n+4,2);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=max(4*n,7);p1<=min(4*n+1,2*n+58);p1++) {
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-  }
-  if (n >= 30) {
-    p1 = 4*n-1 ;
-    p2 = n-1 ;
-    j = n-1 ;
-    S2(n,n-1) ;
-  }
-  for (p1=max(max(-54*n+4,4*n+2),7);p1<=2*n+58;p1++) {
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-  }
-  for (p1=max(4*n,2*n+59);p1<=4*n+1;p1++) {
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/vivien2.c b/cloog-0.16.3/test/vivien2.c
deleted file mode 100644
index d4f1f04..0000000
--- a/cloog-0.16.3/test/vivien2.c
+++ /dev/null
@@ -1,168 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/vivien2.cloog by CLooG 0.14.0-292-g2bfd6ac gmp bits in 0.10s. */
-for (p1=-54*n+4;p1<=4;p1++) {
-  if (p1%2 == 0) {
-    S1((p1-2)/2);
-  }
-}
-S3(1);
-S4(1,2);
-S1(2);
-S6(1,2);
-for (p1=7;p1<=9;p1++) {
-  if (p1 == 8) {
-    S4(1,3);
-  }
-  if (p1 == 8) {
-    S1(3);
-  }
-  if (p1 == 8) {
-    S6(1,3);
-  }
-  if (p1 == 9) {
-    S3(2);
-  }
-  if ((p1+1)%2 == 0) {
-    S2((p1-3)/2,1);
-  }
-}
-for (p1=10;p1<=2*n+58;p1++) {
-  p2 = ceild(-p1+2,4);
-  if (p2 <= min(floord(-p1+2*n,2),floord(-p1+5,4))) {
-    if (p1%2 == 0) {
-      S4(-p2,(p1+2*p2)/2);
-    }
-  }
-  if (p1 >= 4*n-4) {
-    if (p1%2 == 0) {
-      for (p3=1;p3<=floord(p1-2*n-2,2);p3++) {
-        S5((p1-2*n)/2,n,p3);
-      }
-    }
-  }
-  p2 = ceild(-p1+6,4);
-  if (p2 <= min(floord(-p1+2*n,2),floord(-p1+9,4))) {
-    if (p1%2 == 0) {
-      S4(-p2,(p1+2*p2)/2);
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      if (p1%2 == 0) {
-        S5(-p2+1,(p1+2*p2-2)/2,p3);
-      }
-    }
-  }
-  for (p2=ceild(-p1+10,4);p2<=min(-1,floord(-p1+2*n,2));p2++) {
-    if (p1%2 == 0) {
-      S4(-p2,(p1+2*p2)/2);
-    }
-    if (p1%2 == 0) {
-      S6(-p2+2,(p1+2*p2-4)/2);
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      if (p1%2 == 0) {
-        S5(-p2+1,(p1+2*p2-2)/2,p3);
-      }
-    }
-  }
-  if ((p1 >= 2*n+4) && (p1 <= 4*n-6)) {
-    if (p1%2 == 0) {
-      S6((p1-2*n+2)/2,n-1);
-      for (p3=1;p3<=floord(p1-2*n-2,2);p3++) {
-        S5((p1-2*n)/2,n,p3);
-      }
-    }
-  }
-  if (p1 >= 2*n+6) {
-    if (p1%2 == 0) {
-      S6((p1-2*n)/2,n);
-    }
-  }
-  if (p1 <= 2*n+4) {
-    if (p1%2 == 0) {
-      S6(2,(p1-4)/2);
-    }
-    if ((p1+3)%4 == 0) {
-      S3((p1-1)/4);
-    }
-    if (p1%2 == 0) {
-      S1((p1-2)/2);
-    }
-  }
-  if (p1 >= 2*n+5) {
-    if ((p1+3)%4 == 0) {
-      S3((p1-1)/4);
-    }
-    if (p1%2 == 0) {
-      S1((p1-2)/2);
-    }
-  }
-  if (p1 <= 2*n+2) {
-    if (p1%2 == 0) {
-      S6(1,(p1-2)/2);
-    }
-  }
-  for (p2=max(1,ceild(p1-2*n-1,2));p2<=floord(p1-3,4);p2++) {
-    if ((p1+1)%2 == 0) {
-      S2((p1-2*p2-1)/2,p2);
-    }
-  }
-}
-for (p1=2*n+59;p1<=4*n-2;p1++) {
-  p2 = ceild(-p1+2,4);
-  if (p2 <= min(floord(-p1+2*n,2),floord(-p1+5,4))) {
-    if (p1%2 == 0) {
-      S4(-p2,(p1+2*p2)/2);
-    }
-  }
-  if (p1 >= 4*n-4) {
-    if (p1%2 == 0) {
-      for (p3=1;p3<=floord(p1-2*n-2,2);p3++) {
-        S5((p1-2*n)/2,n,p3);
-      }
-    }
-  }
-  p2 = ceild(-p1+6,4);
-  if (p2 <= min(floord(-p1+2*n,2),floord(-p1+9,4))) {
-    if (p1%2 == 0) {
-      S4(-p2,(p1+2*p2)/2);
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      if (p1%2 == 0) {
-        S5(-p2+1,(p1+2*p2-2)/2,p3);
-      }
-    }
-  }
-  for (p2=ceild(-p1+10,4);p2<=floord(-p1+2*n,2);p2++) {
-    if (p1%2 == 0) {
-      S4(-p2,(p1+2*p2)/2);
-    }
-    if (p1%2 == 0) {
-      S6(-p2+2,(p1+2*p2-4)/2);
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      if (p1%2 == 0) {
-        S5(-p2+1,(p1+2*p2-2)/2,p3);
-      }
-    }
-  }
-  if (p1 <= 4*n-6) {
-    if (p1%2 == 0) {
-      S6((p1-2*n+2)/2,n-1);
-      for (p3=1;p3<=floord(p1-2*n-2,2);p3++) {
-        S5((p1-2*n)/2,n,p3);
-      }
-    }
-  }
-  if (p1%2 == 0) {
-    S6((p1-2*n)/2,n);
-  }
-  if ((p1+3)%4 == 0) {
-    S3((p1-1)/4);
-  }
-  for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-    if ((p1+1)%2 == 0) {
-      S2((p1-2*p2-1)/2,p2);
-    }
-  }
-}
-S2(n,n-1);
-S3(n);
diff --git a/cloog-0.16.3/test/vivien2.cloog b/cloog-0.16.3/test/vivien2.cloog
deleted file mode 100644
index 42e7fb7..0000000
--- a/cloog-0.16.3/test/vivien2.cloog
+++ /dev/null
@@ -1,156 +0,0 @@
-#    Context
-c # output in language C
-
-# no constraints on parameters
-1 3 # 1 line and 3 columns
-
-# n 1
-1 1 -30  # 0 >= 0 always true
-
-1 	# Setting manually the parameter' sname
-n  	# The name
-
-
-
-# --------------------  Statements  ------------------
-6 # Number of statements
-
-
-1 # First statement: 1 domain 
-
-# First domain
-
-2 4  			# 2 lines and 4 columns
-#   i   n    1
-1   1   27   -1		# i >= 1
-1  -1   1    28		# n >= i
-0 0 0
-
-1 # Second statement: 1 domain 
-
-# First domain
-
-4 5  			# 4 lines and 5 columns
-#   i   k   n    1
-1   1   29   0   -1		# i >= 1
-1  -1   0   1    0		# n >= i
-1   0   1   0   -1		# k >= 1
-1   1  -1   0   -1		# k <= i-1
-0 0 0
-
-
-1 # Third statement: 1 domain 
-
-# First domain
-
-2 4  			# 2 lines and 4 columns
-#   i   n    1
-1   1   0   -1		# i >= 1
-1  -1   1    0		# n >= i
-0 0 0
-
-
-1 # Fourth statement: 1 domain 
-
-# First domain
-
-4 5  			# 4 lines and 5 columns
-#   i   j   n    1
-1   1   0   0   -1		# i >= 1
-1  -1   0   1    0		# n >= i
-1  -1   1   0   -1		# j >= i+1
-1   0  -1   1    0		# j <= n
-0 0 0
-
-1 # Fifth statement: 1 domain 
-
-# First domain
-
-6 6  			# 6 lines and 6 columns
-#   i   j   k   n    1
-1   1   0   0   0   -1		# i >= 1
-1  -1   0   0   1    0		# n >= i
-1  -1   1   0   0   -1		# j >= i+1
-1   0  -1   0   1    0		# j <= n
-1   0   0   1   0   -1		# k >= 1
-1   1   0  -1   0   -1		# k <= i-1
-0 0 0
-
-1 # Sixth statement: 1 domain 
-
-# First domain
-
-4 5  			# 4 lines and 5 columns
-#   i   j   n    1
-1   1   0   0   -1		# i >= 1
-1  -1   0   1    0		# n >= i
-1  -1   1   0   -1		# j >= i+1
-1   0  -1   1    0		# j <= n
-0 0 0
-
-
-1 # We manually set the iterator names
-i j k
-
-
-# ------------------------ Scattering -------------------
-
-6 # Number of scattering functions
-
-
-# First function
-3 7					# 3 lines and 7 columns
-#   p1  p2  p3   i   n   1
-0    1   0   0  -2   0  -2	 	# p1 = 2i+2
-0    0   1   0   0   0   0 		# p2 = 0
-0    0   0   1   0   0   0	 	# p3 = 0
-
-# Second function
-3 8					# 3 lines and 8 columns
-#   p1  p2  p3   i   j   n   1
-0    1   0   0  -2  -2   0  -1 		# p1 = 2i+2j+1
-0    0   1   0   0  -1   0   0 		# p2 = j
-0    0   0   1   0   0   0   0 		# p3 = 0
-
-# Third function
-3 7					# 3 lines and 7 columns
-#   p1  p2  p3   i   n   1	
-0    1   0   0  -4   0  -1	 	# p1 = 4i+1
-0    0   1   0   0   0   0 		# p2 = 0
-0    0   0   1   0   0   0 		# p3 = 0
-
-# Fourth function
-3 8					# 3 lines and 8 columns
-#   p1  p2  p3   i   j   n   1
-0    1   0   0  -2  -2   0   0 		# p1 = 2i+2j
-0    0   1   0   1   0   0   0 		# p2 = -i
-0    0   0   1   0   0   0   0 		# p3 = 0
-
-
-# Fifth function
-3 9					# 3 lines and 9 columns
-#   p1  p2  p3   i   j   k   n   1
-0    1   0   0  -2  -2   0   0   0	# p1 = 2i+2j
-0    0   1   0   1   0   0   0  -1	# p2 = -i+1
-0    0   0   1   0   0  -1   0   0	# p3 = k
-
-# Sixth function
-3 8					# 3 lines and 8 columns
-#   p1  p2  p3   i   j   n   1
-0    1   0   0  -2  -2   0   0 		# p1 = 2i+2j
-0    0   1   0   1   0   0  -2 		# p2 = -i+2
-0    0   0   1   0   0   0   0 		# p3 = 0
-
-1 # Manually set the scattering dimensions
-p1 p2 p3
-
-
-
-
-
-
-
-
-
-
-
diff --git a/cloog-0.16.3/test/vivien2.good.c b/cloog-0.16.3/test/vivien2.good.c
deleted file mode 100644
index 32f1fff..0000000
--- a/cloog-0.16.3/test/vivien2.good.c
+++ /dev/null
@@ -1,656 +0,0 @@
-/* Generated from ../../../git/cloog/test/vivien2.cloog by CLooG 0.14.0-76-gef19709 gmp bits in 0.58s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i) { hash(3); hash(i); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-#define S5(i,j,k) { hash(5); hash(i); hash(j); hash(k); }
-#define S6(i,j) { hash(6); hash(i); hash(j); }
-
-void test(int n)
-{
-  /* Scattering iterators. */
-  int p1, p2, p3;
-  /* Original iterators. */
-  int i, j, k;
-  for (p1=-54*n+4;p1<=4;p1++) {
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-  }
-  S3(1) ;
-  S4(1,2) ;
-  S1(2) ;
-  S6(1,2) ;
-  for (p1=7;p1<=9;p1++) {
-    for (p2=ceild(-p1+2,4);p2<=-1;p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    if (p1%2 == 0) {
-      j = (p1-2)/2 ;
-      S6(1,(p1-2)/2) ;
-    }
-    if ((p1+1)%2 == 0) {
-      i = (p1-3)/2 ;
-      S2((p1-3)/2,1) ;
-    }
-  }
-  S4(2,3) ;
-  S4(1,4) ;
-  S5(2,3,1) ;
-  S6(2,3) ;
-  S1(4) ;
-  S6(1,4) ;
-  for (p1=11;p1<=12;p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p2=ceild(-p1+6,4);p2<=-1;p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    if (p1%2 == 0) {
-      j = (p1-4)/2 ;
-      S6(2,(p1-4)/2) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    if (p1%2 == 0) {
-      j = (p1-2)/2 ;
-      S6(1,(p1-2)/2) ;
-    }
-    if ((p1+1)%2 == 0) {
-      i = (p1-3)/2 ;
-      S2((p1-3)/2,1) ;
-    }
-    for (p2=2;p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  S3(3) ;
-  S2(5,1) ;
-  S2(4,2) ;
-  for (p1=14;p1<=2*n+2;p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    p2 = floord(-p1+9,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=-1;p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    if (p1%2 == 0) {
-      j = (p1-4)/2 ;
-      S6(2,(p1-4)/2) ;
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    if (p1%2 == 0) {
-      j = (p1-2)/2 ;
-      S6(1,(p1-2)/2) ;
-    }
-    if ((p1+1)%2 == 0) {
-      i = (p1-3)/2 ;
-      S2((p1-3)/2,1) ;
-    }
-    for (p2=2;p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  p1 = 2*n+3 ;
-  if ((n+1)%2 == 0) {
-    i = (n+1)/2 ;
-    S3((n+1)/2) ;
-  }
-  S2(n,1) ;
-  for (p2=2;p2<=floord(n,2);p2++) {
-    i = -p2+n+1 ;
-    S2(-p2+n+1,p2) ;
-  }
-  p1 = 2*n+4 ;
-  for (p2=ceild(-n-1,2);p2<=floord(-2*n+1,4);p2++) {
-    j = p2+n+2 ;
-    S4(-p2,p2+n+2) ;
-  }
-  for (p2=ceild(-n+1,2);p2<=floord(-2*n+5,4);p2++) {
-    j = p2+n+2 ;
-    S4(-p2,p2+n+2) ;
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      j = p2+n+1 ;
-      S5(-p2+1,p2+n+1,p3) ;
-    }
-  }
-  for (p2=ceild(-n+3,2);p2<=-2;p2++) {
-    j = p2+n+2 ;
-    S4(-p2,p2+n+2) ;
-    i = -p2+2 ;
-    j = p2+n ;
-    S6(-p2+2,p2+n) ;
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      j = p2+n+1 ;
-      S5(-p2+1,p2+n+1,p3) ;
-    }
-  }
-  j = n-1 ;
-  S6(3,n-1) ;
-  S5(2,n,1) ;
-  S6(2,n) ;
-  i = n+1 ;
-  S1(n+1) ;
-  for (p1=2*n+5;p1<=min(4*n-10,2*n+58);p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    p2 = floord(-p1+9,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    p2 = floord(-p1+2*n+2,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    for (p2=ceild(-p1+2*n+3,2);p2<=min(floord(-p1+2*n+4,2),-1);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=4*n-9;p1<=min(4*n-8,2*n+58);p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p2=ceild(-p1+6,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    p2 = floord(-p1+2*n+2,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    p2 = floord(-p1+2*n+4,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=4*n-7;p1<=min(4*n-6,2*n+58);p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p2=ceild(-p1+6,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=ceild(-p1+2*n+1,2);p2<=floord(-p1+9,4);p2++) {
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=floord(-p1+2*n+2,2);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    p2 = floord(-p1+2*n+4,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=4*n-5;p1<=2*n+58;p1++) {
-    for (p2=ceild(-p1+2,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-    }
-    for (p2=max(ceild(-p1+2*n+1,2),ceild(-p1+6,4));p2<=floord(-p1+2*n+2,2);p2++) {
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=max(ceild(-p1+2*n+3,2),ceild(-p1+10,4));p2<=floord(-p1+2*n+4,2);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=2*n+59;p1<=4*n-10;p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    p2 = floord(-p1+9,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    p2 = floord(-p1+2*n+2,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    p2 = floord(-p1+2*n+4,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=max(4*n-9,2*n+59);p1<=4*n-8;p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p2=ceild(-p1+6,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    p2 = floord(-p1+2*n+2,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    p2 = floord(-p1+2*n+4,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=max(4*n-7,2*n+59);p1<=4*n-6;p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p2=ceild(-p1+6,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=ceild(-p1+2*n+1,2);p2<=floord(-p1+9,4);p2++) {
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=floord(-p1+2*n+2,2);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    p2 = floord(-p1+2*n+4,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=max(4*n-5,2*n+59);p1<=4*n-2;p1++) {
-    for (p2=ceild(-p1+2,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-    }
-    for (p2=max(ceild(-p1+2*n+1,2),ceild(-p1+6,4));p2<=floord(-p1+2*n+2,2);p2++) {
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=max(ceild(-p1+10,4),ceild(-p1+2*n+3,2));p2<=floord(-p1+2*n+4,2);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  p1 = 4*n-1 ;
-  p2 = n-1 ;
-  j = n-1 ;
-  S2(n,n-1) ;
-  for (p1=4*n;p1<=4*n+1;p1++) {
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/walters.c b/cloog-0.16.3/test/walters.c
deleted file mode 100644
index fdb2183..0000000
--- a/cloog-0.16.3/test/walters.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from ../../../git/cloog/test/walters.cloog by CLooG 0.16.1-3-g354eed5 gmp bits in 0.01s. */
-S2(1,0,1,0);
-S4(1,0,1,0);
-S3(2,0,1,1);
-S4(2,0,1,1);
-for (i=3;i<=10;i++) {
-  if ((i+1)%3 == 0) {
-    S3(i,(i-2)/3,(i+1)/3,(i+1)/3);
-  }
-  if ((i+2)%3 == 0) {
-    S2(i,(i-1)/3,(i+2)/3,(i-1)/3);
-  }
-  if (i%3 == 0) {
-    S1(i,i/3,i/3,i/3);
-  }
-  div36 = floord(i,3);
-  div37 = ceild(2*i-3*div36-1,3);
-  if (div37 <= floord(i+2,3)) {
-    S4(i,div36,div37,i-div36-div37);
-  }
-}
diff --git a/cloog-0.16.3/test/walters.cloog b/cloog-0.16.3/test/walters.cloog
deleted file mode 100644
index 9a3ba81..0000000
--- a/cloog-0.16.3/test/walters.cloog
+++ /dev/null
@@ -1,189 +0,0 @@
-# language: C
-
-c
-
- 
-
-# parameters
-
-1 2
-
-1 1
-
- 1
-
- 
-
-4
-
- 
-
-# S1:  sub1
-
-1
-
-18 6
-
-  1  1  0  0  0 -1
-
-  1 -1  0  0  0 10
-
-  1 -1  3  0  0  2
-
-  1  1 -3  0  0  0
-
-  1  0  1  0  0 -1
-
-  1 -1  3  0  0  0
-
-  1  1  0 -3  0  2
-
-  1 -1  0  3  0  0
-
-  1  1  0  0 -3  1
-
-  1 -1  0  0  3  1
-
-  1  1  0  0  0 -1
-
-  1 -1  0  0  0 10
-
-  1  1 -3  0  0  0
-
-  1 -1  3  0  0  2
-
-  1  1  0 -3  0  2
-
-  1 -1  0  3  0  0
-
-  1  1  0  0 -3  1
-
-  1 -1  0  0  3  1
-
- 0 0 0
-
- 
-
-# S2:  sub2
-
-1
-
-17 6
-
-  1  1  0  0  0 -1
-
-  1 -1  0  0  0 10
-
-  1 -1  0  3  0  0
-
-  1  1  0 -3  0  2
-
-  1 -1  0  3  0 -2
-
-  1  1 -3  0  0  0
-
-  1 -1  3  0  0  2
-
-  1  1  0  0 -3  1
-
-  1 -1  0  0  3  1
-
-  1  1  0  0  0 -1
-
-  1 -1  0  0  0 10
-
-  1  1 -3  0  0  0
-
-  1 -1  3  0  0  2
-
-  1  1  0 -3  0  2
-
-  1 -1  0  3  0  0
-
-  1  1  0  0 -3  1
-
-  1 -1  0  0  3  1
-
- 0 0 0
-
- 
-
-# S3:  sub3
-
-1
-
-18 6
-
-  1 -1  0  0  0 10
-
-  1  1  0  0  0 -1
-
-  1 -1  0  0  3  1
-
-  1  1  0  0 -3  1
-
-  1  0  0  0  1 -1
-
-  1 -1  0  0  3 -1
-
-  1  1 -3  0  0  0
-
-  1 -1  3  0  0  2
-
-  1  1  0 -3  0  2
-
-  1 -1  0  3  0  0
-
-  1  1  0  0  0 -1
-
-  1 -1  0  0  0 10
-
-  1  1 -3  0  0  0
-
-  1 -1  3  0  0  2
-
-  1  1  0 -3  0  2
-
-  1 -1  0  3  0  0
-
-  1  1  0  0 -3  1
-
-  1 -1  0  0  3  1
-
- 0 0 0
-
- 
-
-# S4: enclosing
-
-1
-
-8 6
-
-  1  1  0  0  0 -1
-
-  1 -1  0  0  0 10
-
-  1  1 -3  0  0  0
-
-  1 -1  3  0  0  2
-
-  1  1  0 -3  0  2
-
-  1 -1  0  3  0  0
-
-  1  1  0  0 -3  1
-
-  1 -1  0  0  3  1
-
- 0 0 0
-
- 
-
- 1
-
- i div36 div37 div38
-
- 0
-
- 0
diff --git a/cloog-0.16.3/test/walters.good.c b/cloog-0.16.3/test/walters.good.c
deleted file mode 100644
index 0e1c2b7..0000000
--- a/cloog-0.16.3/test/walters.good.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/walters.cloog by CLooG 0.14.0-223-gad1f0a0 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,div36,div37,div38) { hash(1); hash(i); hash(div36); hash(div37); hash(div38); }
-#define S2(i,div36,div37,div38) { hash(2); hash(i); hash(div36); hash(div37); hash(div38); }
-#define S3(i,div36,div37,div38) { hash(3); hash(i); hash(div36); hash(div37); hash(div38); }
-#define S4(i,div36,div37,div38) { hash(4); hash(i); hash(div36); hash(div37); hash(div38); }
-
-void test()
-{
-  /* Original iterators. */
-  int i, div36, div37, div38;
-  S2(1,0,1,0);
-  S4(1,0,1,0);
-  S3(2,0,1,1);
-  S4(2,0,1,1);
-  for (i=3;i<=10;i++) {
-    if ((i+2)%3 <= 1) {
-      div36 = floord(i-1,3);
-      if ((i+1)%3 <= 1) {
-        div37 = floord(i+1,3);
-        if ((i+1)%3 == 0) {
-          S3(i,div36,div37,(i+1)/3);
-          S4(i,div36,div37,(i+1)/3);
-        }
-      }
-      if ((i+2)%3 == 0) {
-        div38 = floord(i+1,3);
-        S2(i,div36,(i+2)/3,div38);
-        S4(i,div36,(i+2)/3,div38);
-      }
-    }
-    if (i%3 == 0) {
-      div37 = floord(i+2,3);
-      div38 = floord(i+1,3);
-      S1(i,i/3,div37,div38);
-      S4(i,i/3,div37,div38);
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/walters2.c b/cloog-0.16.3/test/walters2.c
deleted file mode 100644
index bc31d9e..0000000
--- a/cloog-0.16.3/test/walters2.c
+++ /dev/null
@@ -1,14 +0,0 @@
-/* Generated from ../../../git/cloog/test/walters2.cloog by CLooG 0.14.0-245-gd8c1718 gmp bits in 0.01s. */
-for (i=0;i<=51;i++) {
-  S2(0,i);
-}
-for (j=1;j<=24;j++) {
-  S2(j,0);
-  for (i=1;i<=50;i++) {
-    S1(j,i);
-  }
-  S2(j,51);
-}
-for (i=0;i<=51;i++) {
-  S2(25,i);
-}
diff --git a/cloog-0.16.3/test/walters2.cloog b/cloog-0.16.3/test/walters2.cloog
deleted file mode 100644
index efdf2f6..0000000
--- a/cloog-0.16.3/test/walters2.cloog
+++ /dev/null
@@ -1,90 +0,0 @@
-# language: C
-c
-
-# parameters
-1 2
-1 1
- 1
-
-2
-
-
-# S1
-1
-12 4
-  1  1  0  0
-  1 -1  0 25
-  1  0  1  0
-  1  0 -1 51
-  1  1  0 -1
-  1  0  1 -1
-  1 -1  0 24
-  1  0 -1 50
-  1  1  0  0
-  1 -1  0 25
-  1  0  1  0
-  1  0 -1 51
- 0 0 0
-
-
-
-
-
-
-# S2
-4
-11 4
-  1  1  0   0
-  1 -1  0  25
-  1  0  1   0
-  1  0 -1  51
-  1  1  0  -1
-  1  0  1  -1
-  1  1  0 -25
-  1  1  0   0
-  1 -1  0  25
-  1  0  1   0
-  1  0 -1  51
-12 4
-  1  1  0   0
-  1 -1  0  25
-  1  0  1   0
-  1  0 -1  51
-  1  1  0  -1
-  1  0  1  -1
-  1 -1  0  24
-  1  0  1 -51
-  1  1  0   0
-  1 -1  0  25
-  1  0  1   0
-  1  0 -1  51
-10 4
-  1  1  0  0
-  1 -1  0 25
-  1  0  1  0
-  1  0 -1 51
-  1  1  0 -1
-  1  0 -1  0
-  1  1  0  0
-  1 -1  0 25
-  1  0  1  0
-  1  0 -1 51
-9 4
-  1  1  0  0
-  1 -1  0 25
-  1  0  1  0
-  1  0 -1 51
-  1 -1  0  0
-  1  1  0  0
-  1 -1  0 25
-  1  0  1  0
-  1  0 -1 51
- 0 0 0
-
-
-
- 1
- j i
- 0
- 0
-
diff --git a/cloog-0.16.3/test/walters2.good.c b/cloog-0.16.3/test/walters2.good.c
deleted file mode 100644
index 2b8990f..0000000
--- a/cloog-0.16.3/test/walters2.good.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/walters2.cloog by CLooG 0.14.0-227-g08f253a gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(j,i) { hash(1); hash(j); hash(i); }
-#define S2(j,i) { hash(2); hash(j); hash(i); }
-
-void test()
-{
-  /* Original iterators. */
-  int j, i;
-  for (i=0;i<=51;i++) {
-    S2(0,i);
-  }
-  for (j=1;j<=24;j++) {
-    S2(j,0);
-    for (i=1;i<=50;i++) {
-      S1(j,i);
-    }
-    S2(j,51);
-  }
-  for (i=0;i<=51;i++) {
-    if (i >= 0) {
-      S2(25,i);
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/walters3.c b/cloog-0.16.3/test/walters3.c
deleted file mode 100644
index fc922d6..0000000
--- a/cloog-0.16.3/test/walters3.c
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Generated from ../../../git/cloog/test/walters3.cloog by CLooG 0.14.0-338-g99c7504 gmp bits in 0.00s. */
-for (j=2;j<=8;j++) {
-  if (j%2 == 0) {
-    S1(j,j/2,j/2);
-    S2(j,j/2,j/2);
-  }
-}
-S2(10,5,5);
diff --git a/cloog-0.16.3/test/walters3.cloog b/cloog-0.16.3/test/walters3.cloog
deleted file mode 100644
index fb45ab0..0000000
--- a/cloog-0.16.3/test/walters3.cloog
+++ /dev/null
@@ -1,49 +0,0 @@
-# language: C
-c
-
-# parameters
-1 2
-1 1
- 1
-
-
-2
-
-1
-15 5
-  1 -1  0  0 10  
-  1 -1  0  0  8
-  1 -1  0  2  1
-  1  1  0 -2  0
-  1 -1  0  2  0
-  1  0  0  1 -1
-  1  1 -2  0  0
-  1 -1  2  0  1
-  1  1  0  0 -1
-  1 -1  0  0 10
-  0  1 -2  0  0
-  1  1 -2  0  0
-  1 -1  2  0  1
-  1  1  0 -2  0
-  1 -1  0  2  1
- 0 0 0
-
-
-
-1
-7 5
-  1  1  0  0 -1
-  1 -1  0  0 10
-  0  1 -2  0  0
-  1  1 -2  0  0
-  1 -1  2  0  1
-  1  1  0 -2  0
-  1 -1  0  2  1
- 0 0 0
-
-
- 1
- j a b
- #-------- SCATTERING -------------
- 0 # no scattering function
-
diff --git a/cloog-0.16.3/test/walters3.good.c b/cloog-0.16.3/test/walters3.good.c
deleted file mode 100644
index 45a1b33..0000000
--- a/cloog-0.16.3/test/walters3.good.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Generated from ../../../git/cloog/test/walters3.cloog by CLooG 0.14.0-338-g99c7504 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(j,a,b) { hash(1); hash(j); hash(a); hash(b); }
-#define S2(j,a,b) { hash(2); hash(j); hash(a); hash(b); }
-
-void test()
-{
-  /* Original iterators. */
-  int j, a, b;
-  for (j=2;j<=8;j++) {
-    if (j%2 == 0) {
-      S1(j,j/2,j/2);
-      S2(j,j/2,j/2);
-    }
-  }
-  S2(10,5,5);
-}
diff --git a/cloog-0.16.3/test/wavefront.c b/cloog-0.16.3/test/wavefront.c
deleted file mode 100644
index c6d2868..0000000
--- a/cloog-0.16.3/test/wavefront.c
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Generated from ../../../git/cloog/test/wavefront.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if ((m >= 1) && (n >= 1)) {
-  for (c1=2;c1<=n+m;c1++) {
-    for (c2=max(1,c1-m);c2<=min(n,c1-1);c2++) {
-      S1(c2,c1-c2) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/wavefront.cloog b/cloog-0.16.3/test/wavefront.cloog
deleted file mode 100644
index 845b368..0000000
--- a/cloog-0.16.3/test/wavefront.cloog
+++ /dev/null
@@ -1,27 +0,0 @@
-c 
-
-1 4
-# n   m   1
-1 0   0   1
-1
-n m 
-
-1 
-
-1
-4 6
-#   i   j   n   m   1
-1   1   0   0   0  -1
-1  -1   0   1   0   0
-1   0   1   0   0  -1
-1   0  -1   0   1   0
-0   0   0
-
-0
-
-1
-2 8
-#  c1  c2   i   j   n   m   1
-0   1   0  -1  -1   0   0   0
-0   0   1  -1   0   0   0   0
-0
diff --git a/cloog-0.16.3/test/wavefront.good.c b/cloog-0.16.3/test/wavefront.good.c
deleted file mode 100644
index c6e721f..0000000
--- a/cloog-0.16.3/test/wavefront.good.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Generated from ../../../git/cloog/test/wavefront.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int n, int m)
-{
-  /* Scattering iterators. */
-  int c1, c2;
-  /* Original iterators. */
-  int i, j;
-  if ((n >= 1) && (m >= 1)) {
-    for (c1=2;c1<=n+m;c1++) {
-      for (c2=max(1,c1-m);c2<=min(n,c1-1);c2++) {
-        j = c1-c2 ;
-        S1(c2,c1-c2) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/yosr.c b/cloog-0.16.3/test/yosr.c
deleted file mode 100644
index 341c787..0000000
--- a/cloog-0.16.3/test/yosr.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from ../../../git/cloog/test/yosr.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if (n >= 2) {
-  for (j=2;j<=n;j++) {
-    S1(1,j) ;
-  }
-  for (proc=2;proc<=n-1;proc++) {
-    for (i=1;i<=proc-1;i++) {
-      for (j=i+1;j<=n;j++) {
-        S2(i,j,proc) ;
-      }
-    }
-    for (j=proc+1;j<=n;j++) {
-      S1(proc,j) ;
-    }
-  }
-  for (i=1;i<=n-1;i++) {
-    for (j=i+1;j<=n;j++) {
-      S2(i,j,n) ;
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/yosr.cloog b/cloog-0.16.3/test/yosr.cloog
deleted file mode 100644
index cefa035..0000000
--- a/cloog-0.16.3/test/yosr.cloog
+++ /dev/null
@@ -1,65 +0,0 @@
-# language: C
-c
-
-# One parameter : n
-1 3
-#  n  1
-1  0  1
-# We want to set the parameter names...
-1
-# and 'n' is the name of the unique parameter
-n
-
-2 # Number of statements: 2.
-
-1
-# {i, j | 1<=i<=n-1; i+1<=j<=n}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1 -1
-1 -1  1  0 -1
-1  0 -1  1  0
-0  0  0
-
-1
-# {i, j, k | 1<=i<=n-1; i+1<=j<=n i+1<=k<=n}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1 -1
-1 -1  1  0  0 -1
-1  0 -1  0  1  0
-1 -1  0  1  0 -1
-1  0  0 -1  1  0
-0  0  0
-# We want to let CLooG set the iterator names.
-0
-
-2
-# Scattering functions
-1 6
-# c1  i  j  n  1
-0  1 -1  0  0  0
-
-1 7
-# c1  i  j  k  n  1
-0  1  0  0 -1  0  0
-1
-proc
-
-2
-# Scattering functions
-3 8
-# c1 c2 c3  i  j  n  1
-0  1  0  0 -1  0  0  0
-0  0  1  0  0  0  0  0
-0  0  0  1  0  0  0  0
-
-3 9
-# c1 c2 c3  i  j  k  n  1
-0  1  0  0  0  0 -1  0  0
-0  0  1  0  0  0  0  0 -1
-0  0  0  1  0  0 -1  0  0
-0
-
diff --git a/cloog-0.16.3/test/yosr.good.c b/cloog-0.16.3/test/yosr.good.c
deleted file mode 100644
index 8845a2c..0000000
--- a/cloog-0.16.3/test/yosr.good.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Generated from ../../../git/cloog/test/yosr.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-
-void test(int n)
-{
-  /* Scattering iterators. */
-  int proc;
-  /* Original iterators. */
-  int i, j, k;
-  if (n >= 2) {
-    for (j=2;j<=n;j++) {
-      S1(1,j) ;
-    }
-  }
-  for (proc=2;proc<=n-1;proc++) {
-    for (i=1;i<=proc-1;i++) {
-      for (j=i+1;j<=n;j++) {
-        S2(i,j,proc) ;
-      }
-    }
-    for (j=proc+1;j<=n;j++) {
-      S1(proc,j) ;
-    }
-  }
-  if (n >= 2) {
-    for (i=1;i<=n-1;i++) {
-      for (j=i+1;j<=n;j++) {
-        S2(i,j,n) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.16.3/test/yosr2.c b/cloog-0.16.3/test/yosr2.c
deleted file mode 100644
index 999eb41..0000000
--- a/cloog-0.16.3/test/yosr2.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Generated from ../../../git/cloog/test/yosr2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.02s. */
-for (i=1;i<=M;i++) {
-  S2(i) ;
-}
-for (proc=2;proc<=M-1;proc++) {
-  for (i=1;i<=proc-1;i++) {
-    S4(i,proc) ;
-  }
-  for (j=1;j<=proc-1;j++) {
-    S1(proc,j) ;
-  }
-  for (j=proc+1;j<=M;j++) {
-    for (k=1;k<=proc-1;k++) {
-      S3(proc,j,k) ;
-    }
-  }
-}
-for (i=1;i<=M-1;i++) {
-  S4(i,M) ;
-}
-for (j=1;j<=M-1;j++) {
-  S1(M,j) ;
-}
diff --git a/cloog-0.16.3/test/yosr2.cloog b/cloog-0.16.3/test/yosr2.cloog
deleted file mode 100644
index e9dea4a..0000000
--- a/cloog-0.16.3/test/yosr2.cloog
+++ /dev/null
@@ -1,71 +0,0 @@
-# language: C
-c
-
-# parameter n
-1 3
-#  n  1
-1  1 -2
-0
-
-4 # Number of statements
-
-1
-# S2 {k, l | 1<=k<=n; 1<=l<=k-1}
-4 5
-#  k  l  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1  0  1  0 -1
-1  1 -1  0 -1
-0  0  0
-
-1
-# S3 {k | 1<=k<=n}
-2 4
-#  k  n  1
-1  1  0 -1
-1 -1  1  0
-0  0  0
-
-1
-# S5 {k, i, m | 1<=k<=n; k+1<=i<=n 1<=m<=k-1}
-6 6
-#  k  i  m  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1 -1  1  0  0 -1
-1  0 -1  0  1  0
-1  0  0  1  0 -1
-1  1  0 -1  0 -1
-0  0  0
-
-1
-# S4 {k, i | 1<=k<=n; k+1<=i<=n}
-4 5
-#  k  i  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1 -1  1  0 -1
-1  0 -1  1  0
-0  0  0
-0
-
-
-4 # Scattering functions
-1 6
-# c1  k  l  n  1
-0  1 -1  0  0  0
-
-1 5
-# c1  k  n  1
-0  1  0  0  0
-
-1 7
-# c1  k  i  m  n  1
-0  1 -1  0  0  0  0
-
-1 6
-# c1  k  i  n  1
-0  1  0 -1  0  0
-1
-proc
diff --git a/cloog-0.16.3/test/yosr2.good.c b/cloog-0.16.3/test/yosr2.good.c
deleted file mode 100644
index 7608db8..0000000
--- a/cloog-0.16.3/test/yosr2.good.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Generated from ../../../git/cloog/test/yosr2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i) { hash(2); hash(i); }
-#define S3(i,j,k) { hash(3); hash(i); hash(j); hash(k); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int proc;
-  /* Original iterators. */
-  int i, j, k;
-  for (i=1;i<=M;i++) {
-    S2(i) ;
-  }
-  for (proc=2;proc<=M-1;proc++) {
-    for (i=1;i<=proc-1;i++) {
-      S4(i,proc) ;
-    }
-    for (j=1;j<=proc-1;j++) {
-      S1(proc,j) ;
-    }
-    for (j=proc+1;j<=M;j++) {
-      for (k=1;k<=proc-1;k++) {
-        S3(proc,j,k) ;
-      }
-    }
-  }
-  for (i=1;i<=M-1;i++) {
-    S4(i,M) ;
-  }
-  for (j=1;j<=M-1;j++) {
-    S1(M,j) ;
-  }
-}
diff --git a/cloog-0.16.3/test/yosrf.cloog b/cloog-0.16.3/test/yosrf.cloog
deleted file mode 100644
index 1661ef7..0000000
--- a/cloog-0.16.3/test/yosrf.cloog
+++ /dev/null
@@ -1,65 +0,0 @@
-# language: FORTRAN
-f
-
-# One parameter : n
-1 3
-#  n  1
-1  0  1
-# We want to set the parameter names...
-1
-# and 'n' is the name of the unique parameter
-n
-
-2 # Number of statements: 2.
-
-1
-# {i, j | 1<=i<=n-1; i+1<=j<=n}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1 -1
-1 -1  1  0 -1
-1  0 -1  1  0
-0 0 0
-
-1
-# {i, j, k | 1<=i<=n-1; i+1<=j<=n i+1<=k<=n}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1 -1
-1 -1  1  0  0 -1
-1  0 -1  0  1  0
-1 -1  0  1  0 -1
-1  0  0 -1  1  0
-0 0 0
-# We want to let CLooG set the iterator names.
-0
-
-2
-# Scattering functions
-1 6
-# c1  i  j  n  1
-0  1 -1  0  0  0
-
-1 7
-# c1  i  j  k  n  1
-0  1  0  0 -1  0  0
-1
-proc
-
-2
-# Scattering functions
-3 8
-# c1 c2 c3  i  j  n  1
-0  1  0  0 -1  0  0  0
-0  0  1  0  0  0  0  0
-0  0  0  1  0  0  0  0
-
-3 9
-# c1 c2 c3  i  j  k  n  1
-0  1  0  0  0  0 -1  0  0
-0  0  1  0  0  0  0  0 -1
-0  0  0  1  0  0 -1  0  0
-0
-
diff --git a/cloog-0.16.3/test/yosrf.f b/cloog-0.16.3/test/yosrf.f
deleted file mode 100644
index 2d8efad..0000000
--- a/cloog-0.16.3/test/yosrf.f
+++ /dev/null
@@ -1,21 +0,0 @@
-! Generated from ../../../git/cloog/test/yosrf.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s.
-IF (n >= 2) THEN
-  DO j=2, n
-    S1(1,j)
-  END DO
-  DO proc=2, n-1
-    DO i=1, proc-1
-      DO j=i+1, n
-        S2(i,j,proc)
-      END DO
-    END DO
-    DO j=proc+1, n
-      S1(proc,j)
-    END DO
-  END DO
-  DO i=1, n-1
-    DO j=i+1, n
-      S2(i,j,n)
-    END DO
-  END DO
-END IF
diff --git a/cloog-0.17.0/CLOOG_HEAD b/cloog-0.17.0/CLOOG_HEAD
deleted file mode 100644
index c5523bd..0000000
--- a/cloog-0.17.0/CLOOG_HEAD
+++ /dev/null
@@ -1 +0,0 @@
-0.17.0
diff --git a/cloog-0.17.0/ChangeLog b/cloog-0.17.0/ChangeLog
deleted file mode 100644
index 9767b37..0000000
--- a/cloog-0.17.0/ChangeLog
+++ /dev/null
@@ -1,22 +0,0 @@
-version: 0.17.0
-date: Mon Dec 12 00:51:44 CET 2011
-changes:
-	- Support openscop as input format
-	- update isl backend to changes in isl 0.08
-	- Add CLOOG_ prefix to LANGUAGE defines in public header files
-	- Replace cloog_union_domain_from_isl_union_set() with
-	  cloog_union_domain_from_isl_set()
-	- Allow to build CLooG from gmp build directory
-	- Smaller improvements
-
-version: 0.16.3
-date: Wed Jul 13 18:18:19 CEST 2011
-changes:
-	- update isl backend to recent changes in isl
-	- add support for unrolling
----
-version: 0.16.2
-date: Sun Mar 20 15:51:13 CET 2011
-changes:
-	- update isl backend to recent changes in isl
-	- improved output in case of stride detection
diff --git a/cloog-0.17.0/Makefile.am b/cloog-0.17.0/Makefile.am
deleted file mode 100644
index 80bfc43..0000000
--- a/cloog-0.17.0/Makefile.am
+++ /dev/null
@@ -1,179 +0,0 @@
-#
-#   /**-------------------------------------------------------------------**
-#    **                              CLooG                                **
-#    **-------------------------------------------------------------------**
-#    **                           makefile.in                             **
-#    **-------------------------------------------------------------------**
-#    **                   First version: october 25th 2001                **
-#    **-------------------------------------------------------------------**/
-#
-# makefile.in (or makefile if generated) of CLooG, the Chunky LOOp Generator.
-# makefile.in is not a makefile, you must run the 'configure' shellscript to
-# generate the makefile thanks to this file.
-
-#/*****************************************************************************
-# *               CLooG : the Chunky Loop Generator (experimental)            *
-# *****************************************************************************
-# *                                                                           *
-# * Copyright (C) 2001 Cedric Bastoul                                         *
-# *                                                                           *
-# * This library is free software; you can redistribute it and/or             *
-# * modify it under the terms of the GNU Lesser General Public                *
-# * License as published by the Free Software Foundation; either              *
-# * version 2.1 of the License, or (at your option) any later version.        *
-# *                                                                           *
-# * This library is distributed in the hope that it will be useful,           *
-# * but WITHOUT ANY WARRANTY; without even the implied warranty of            *
-# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
-# * Lesser General Public License for more details.                           *
-# *                                                                           *
-# * You should have received a copy of the GNU Lesser General Public          *
-# * License along with this library; if not, write to the Free Software       *
-# * Foundation, Inc., 51 Franklin Street, Fifth Floor,                        *
-# * Boston, MA  02110-1301  USA                                               *
-# *                                                                           *
-# * CLooG, the Chunky Loop Generator                                          *
-# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                        *
-# *                                                                           *
-# *****************************************************************************/
-if BUNDLED_ISL
-    MAYBE_ISL = isl
-    ISL_LA = $(top_builddir)/isl/libisl.la
-endif
-
-if BUNDLED_OSL
-    MAYBE_OSL = osl
-    OSL_LA = $(top_builddir)/osl/source/libosl.la
-endif
-
-SUBDIRS = $(MAYBE_ISL) $(MAYBE_OSL) . doc test
-DIST_SUBDIRS = $(MAYBE_ISL) $(MAYBE_OSL) . doc test
-
-ACLOCAL_AMFLAGS = -I m4
-
-FORCE:
-isl/libisl.la: FORCE
-	cd isl; $(MAKE) $(AM_MAKEFLAGS) libisl.la
-
-if NO_ISL
-CLOOG =
-LIBCLOOG =
-else
-CLOOG = cloog
-LIBCLOOG = libcloog-isl.la
-endif
-bin_PROGRAMS = $(CLOOG)
-lib_LTLIBRARIES = $(LIBCLOOG)
-
-if NEED_GET_MEMORY_FUNCTIONS
-GET_MEMORY_FUNCTIONS=source/mp_get_memory_functions.c
-endif
-
-SOURCES_CORE = \
-	$(GET_MEMORY_FUNCTIONS) \
-	source/block.c \
-	source/clast.c \
-	source/matrix.c \
-	source/state.c \
-	source/input.c \
-	source/int.c \
-	source/loop.c \
-	source/names.c \
-	source/options.c \
-	source/pprint.c \
-	source/program.c \
-	source/statement.c \
-	source/stride.c \
-	source/union_domain.c \
-	source/version.c
-
-DEFAULT_INCLUDES = -I.
-INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include
-AM_CFLAGS = $(CFLAGS_WARN)
-libcloog_isl_la_CPPFLAGS = @ISL_CPPFLAGS@ @OSL_CPPFLAGS@
-libcloog_isl_la_LDFLAGS = -version-info @versioninfo@ \
-	-rpath $(libdir) @ISL_LDFLAGS@ @OSL_LDFLAGS@
-libcloog_isl_la_LIBADD = @ISL_LIBS@ @OSL_LIBS@ $(ISL_LA) $(OSL_LA)
-libcloog_isl_la_SOURCES = \
-	$(SOURCES_CORE) \
-	source/isl/domain.c \
-	source/isl/constraints.c \
-	source/isl/backend.c
-LDADD = libcloog-isl.la
-cloog_DEPENDENCIES = libcloog-isl.la
-cloog_SOURCES = source/cloog.c
-
-pkginclude_HEADERS = \
-	include/cloog/block.h \
-	include/cloog/clast.h \
-	include/cloog/cloog.h \
-	include/cloog/input.h \
-	include/cloog/int.h \
-	include/cloog/matrix.h \
-	include/cloog/state.h \
-	include/cloog/domain.h \
-	include/cloog/loop.h \
-	include/cloog/constraints.h \
-	include/cloog/names.h \
-	include/cloog/options.h \
-	include/cloog/pprint.h \
-	include/cloog/program.h \
-	include/cloog/statement.h \
-	include/cloog/stride.h \
-	include/cloog/union_domain.h \
-	include/cloog/version.h
-
-pkgmatrixincludedir = $(pkgincludedir)/matrix
-pkgmatrixinclude_HEADERS = \
-	include/cloog/matrix/constraintset.h
-
-pkgislincludedir = $(pkgincludedir)/isl
-pkgislinclude_HEADERS = \
-	include/cloog/isl/backend.h \
-	include/cloog/isl/cloog.h \
-	include/cloog/isl/domain.h \
-	include/cloog/isl/constraintset.h
-
-version.h: @GIT_INDEX@
-	echo '#define CLOOG_HEAD "'`$(top_builddir)/genversion.sh`'"' > $@
-
-EXTRA_DIST = \
-	autoconf/Doxyfile.in \
-	source/matrix/constraintset.c \
-	doc/cloog.texi \
-	doc/images \
-	examples
-
-install-data-local:
-	@test -z "$(pkgconfig_libdir)" || $(mkdir_p) "$(DESTDIR)$(pkgconfig_libdir)"
-	$(INSTALL_DATA) $(pkgconfig_libfile) "$(DESTDIR)$(pkgconfig_libdir)/$(pkgconfig_libfile)"
-
-uninstall-local:
-	rm -f "$(DESTDIR)$(pkgconfig_libdir)/$(pkgconfig_libfile)"
-
-dist-hook:
-	rm -f $(distdir)/test/Makefile
-	$(top_builddir)/genversion.sh > $(distdir)/CLOOG_HEAD
-	(cd doc; make cloog.pdf) && cp doc/cloog.pdf $(distdir)/doc/
-
-#/*****************************************************************************
-# *                                   Rules                                   *
-# *****************************************************************************/
-
-valcheck:
-	$(MAKE) valgrind -C test
-
-total:
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *                     CLooG                     *"
-	@echo "              *-----------------------------------------------*/"
-	$(MAKE) uninstall
-	$(MAKE) clean
-	$(MAKE)
-	$(MAKE) install
-
-doc:
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *        Generating CLooG's documentation       *"
-	@echo "              *-----------------------------------------------*/"
-	doxygen ./autoconf/Doxyfile
diff --git a/cloog-0.17.0/Makefile.in b/cloog-0.17.0/Makefile.in
deleted file mode 100644
index 162b97d..0000000
--- a/cloog-0.17.0/Makefile.in
+++ /dev/null
@@ -1,1375 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-#
-#   /**-------------------------------------------------------------------**
-#    **                              CLooG                                **
-#    **-------------------------------------------------------------------**
-#    **                           makefile.in                             **
-#    **-------------------------------------------------------------------**
-#    **                   First version: october 25th 2001                **
-#    **-------------------------------------------------------------------**/
-#
-# makefile.in (or makefile if generated) of CLooG, the Chunky LOOp Generator.
-# makefile.in is not a makefile, you must run the 'configure' shellscript to
-# generate the makefile thanks to this file.
-
-
-
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-bin_PROGRAMS = $(am__EXEEXT_1)
-subdir = .
-DIST_COMMON = README $(am__configure_deps) $(pkginclude_HEADERS) \
-	$(pkgislinclude_HEADERS) $(pkgmatrixinclude_HEADERS) \
-	$(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-	$(srcdir)/genversion.sh.in $(top_srcdir)/autoconf/Doxyfile.in \
-	$(top_srcdir)/configure \
-	$(top_srcdir)/include/cloog/version.h.in \
-	$(top_srcdir)/source/version.c.in ChangeLog \
-	autoconf/config.guess autoconf/config.sub autoconf/depcomp \
-	autoconf/install-sh autoconf/ltmain.sh autoconf/missing
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cc_maxopt.m4 \
-	$(top_srcdir)/m4/ax_cflags_warn_all.m4 \
-	$(top_srcdir)/m4/ax_check_compiler_flags.m4 \
-	$(top_srcdir)/m4/ax_compiler_vendor.m4 \
-	$(top_srcdir)/m4/ax_create_pkgconfig_info.m4 \
-	$(top_srcdir)/m4/ax_gcc_archflag.m4 \
-	$(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \
-	$(top_srcdir)/m4/ax_submodule.m4 $(top_srcdir)/m4/libtool.m4 \
-	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno config.status.lineno
-mkinstalldirs = $(install_sh) -d
-CONFIG_CLEAN_FILES = autoconf/Doxyfile source/version.c \
-	include/cloog/version.h genversion.sh
-CONFIG_CLEAN_VPATH_FILES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
-	"$(DESTDIR)$(pkgincludedir)" "$(DESTDIR)$(pkgislincludedir)" \
-	"$(DESTDIR)$(pkgmatrixincludedir)"
-LTLIBRARIES = $(lib_LTLIBRARIES)
-libcloog_isl_la_DEPENDENCIES = $(ISL_LA) $(OSL_LA)
-am__libcloog_isl_la_SOURCES_DIST = source/mp_get_memory_functions.c \
-	source/block.c source/clast.c source/matrix.c source/state.c \
-	source/input.c source/int.c source/loop.c source/names.c \
-	source/options.c source/pprint.c source/program.c \
-	source/statement.c source/stride.c source/union_domain.c \
-	source/version.c source/isl/domain.c source/isl/constraints.c \
-	source/isl/backend.c
-@NEED_GET_MEMORY_FUNCTIONS_TRUE@am__objects_1 = libcloog_isl_la-mp_get_memory_functions.lo
-am__objects_2 = $(am__objects_1) libcloog_isl_la-block.lo \
-	libcloog_isl_la-clast.lo libcloog_isl_la-matrix.lo \
-	libcloog_isl_la-state.lo libcloog_isl_la-input.lo \
-	libcloog_isl_la-int.lo libcloog_isl_la-loop.lo \
-	libcloog_isl_la-names.lo libcloog_isl_la-options.lo \
-	libcloog_isl_la-pprint.lo libcloog_isl_la-program.lo \
-	libcloog_isl_la-statement.lo libcloog_isl_la-stride.lo \
-	libcloog_isl_la-union_domain.lo libcloog_isl_la-version.lo
-am_libcloog_isl_la_OBJECTS = $(am__objects_2) \
-	libcloog_isl_la-domain.lo libcloog_isl_la-constraints.lo \
-	libcloog_isl_la-backend.lo
-libcloog_isl_la_OBJECTS = $(am_libcloog_isl_la_OBJECTS)
-AM_V_lt = $(am__v_lt_$(V))
-am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
-am__v_lt_0 = --silent
-libcloog_isl_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
-	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
-	$(AM_CFLAGS) $(CFLAGS) $(libcloog_isl_la_LDFLAGS) $(LDFLAGS) \
-	-o $@
-@NO_ISL_FALSE@am_libcloog_isl_la_rpath = -rpath $(libdir)
-@NO_ISL_FALSE@am__EXEEXT_1 = cloog$(EXEEXT)
-PROGRAMS = $(bin_PROGRAMS)
-am_cloog_OBJECTS = cloog.$(OBJEXT)
-cloog_OBJECTS = $(am_cloog_OBJECTS)
-cloog_LDADD = $(LDADD)
-depcomp = $(SHELL) $(top_srcdir)/autoconf/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_$(V))
-am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
-am__v_CC_0 = @echo "  CC    " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
-CCLD = $(CC)
-LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_$(V))
-am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
-am__v_CCLD_0 = @echo "  CCLD  " $@;
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
-SOURCES = $(libcloog_isl_la_SOURCES) $(cloog_SOURCES)
-DIST_SOURCES = $(am__libcloog_isl_la_SOURCES_DIST) $(cloog_SOURCES)
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-dvi-recursive install-exec-recursive \
-	install-html-recursive install-info-recursive \
-	install-pdf-recursive install-ps-recursive install-recursive \
-	installcheck-recursive installdirs-recursive pdf-recursive \
-	ps-recursive uninstall-recursive
-HEADERS = $(pkginclude_HEADERS) $(pkgislinclude_HEADERS) \
-	$(pkgmatrixinclude_HEADERS)
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
-  distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
-	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
-	distdir dist dist-all distcheck
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-distdir = $(PACKAGE)-$(VERSION)
-top_distdir = $(distdir)
-am__remove_distdir = \
-  { test ! -d "$(distdir)" \
-    || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
-         && rm -fr "$(distdir)"; }; }
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-DIST_ARCHIVES = $(distdir).tar.gz
-GZIP_ENV = --best
-distuninstallcheck_listfiles = find . -type f -print
-distcleancheck_listfiles = find . -type f -print
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BITS = @BITS@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CD = @CD@
-CFLAGS = @CFLAGS@
-CFLAGS_WARN = @CFLAGS_WARN@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GIT_INDEX = @GIT_INDEX@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-ISL_CPPFLAGS = @ISL_CPPFLAGS@
-ISL_LDFLAGS = @ISL_LDFLAGS@
-ISL_LIBS = @ISL_LIBS@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OSL_CPPFLAGS = @OSL_CPPFLAGS@
-OSL_LDFLAGS = @OSL_LDFLAGS@
-OSL_LIBS = @OSL_LIBS@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PRTDIAG = @PRTDIAG@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TEXI2DVI = @TEXI2DVI@
-VERSION = @VERSION@
-VERSION_MAJOR = @VERSION_MAJOR@
-VERSION_MINOR = @VERSION_MINOR@
-VERSION_REVISION = @VERSION_REVISION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-pkgconfig_libdir = @pkgconfig_libdir@
-pkgconfig_libfile = @pkgconfig_libfile@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-subdirs = @subdirs@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-versioninfo = @versioninfo@
-
-#/*****************************************************************************
-# *               CLooG : the Chunky Loop Generator (experimental)            *
-# *****************************************************************************
-# *                                                                           *
-# * Copyright (C) 2001 Cedric Bastoul                                         *
-# *                                                                           *
-# * This library is free software; you can redistribute it and/or             *
-# * modify it under the terms of the GNU Lesser General Public                *
-# * License as published by the Free Software Foundation; either              *
-# * version 2.1 of the License, or (at your option) any later version.        *
-# *                                                                           *
-# * This library is distributed in the hope that it will be useful,           *
-# * but WITHOUT ANY WARRANTY; without even the implied warranty of            *
-# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
-# * Lesser General Public License for more details.                           *
-# *                                                                           *
-# * You should have received a copy of the GNU Lesser General Public          *
-# * License along with this library; if not, write to the Free Software       *
-# * Foundation, Inc., 51 Franklin Street, Fifth Floor,                        *
-# * Boston, MA  02110-1301  USA                                               *
-# *                                                                           *
-# * CLooG, the Chunky Loop Generator                                          *
-# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                        *
-# *                                                                           *
-# *****************************************************************************/
-@BUNDLED_ISL_TRUE@MAYBE_ISL = isl
-@BUNDLED_ISL_TRUE@ISL_LA = $(top_builddir)/isl/libisl.la
-@BUNDLED_OSL_TRUE@MAYBE_OSL = osl
-@BUNDLED_OSL_TRUE@OSL_LA = $(top_builddir)/osl/source/libosl.la
-SUBDIRS = $(MAYBE_ISL) $(MAYBE_OSL) . doc test
-DIST_SUBDIRS = $(MAYBE_ISL) $(MAYBE_OSL) . doc test
-ACLOCAL_AMFLAGS = -I m4
-@NO_ISL_FALSE@CLOOG = cloog
-@NO_ISL_TRUE@CLOOG = 
-@NO_ISL_FALSE@LIBCLOOG = libcloog-isl.la
-@NO_ISL_TRUE@LIBCLOOG = 
-lib_LTLIBRARIES = $(LIBCLOOG)
-@NEED_GET_MEMORY_FUNCTIONS_TRUE@GET_MEMORY_FUNCTIONS = source/mp_get_memory_functions.c
-SOURCES_CORE = \
-	$(GET_MEMORY_FUNCTIONS) \
-	source/block.c \
-	source/clast.c \
-	source/matrix.c \
-	source/state.c \
-	source/input.c \
-	source/int.c \
-	source/loop.c \
-	source/names.c \
-	source/options.c \
-	source/pprint.c \
-	source/program.c \
-	source/statement.c \
-	source/stride.c \
-	source/union_domain.c \
-	source/version.c
-
-DEFAULT_INCLUDES = -I.
-INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include
-AM_CFLAGS = $(CFLAGS_WARN)
-libcloog_isl_la_CPPFLAGS = @ISL_CPPFLAGS@ @OSL_CPPFLAGS@
-libcloog_isl_la_LDFLAGS = -version-info @versioninfo@ \
-	-rpath $(libdir) @ISL_LDFLAGS@ @OSL_LDFLAGS@
-
-libcloog_isl_la_LIBADD = @ISL_LIBS@ @OSL_LIBS@ $(ISL_LA) $(OSL_LA)
-libcloog_isl_la_SOURCES = \
-	$(SOURCES_CORE) \
-	source/isl/domain.c \
-	source/isl/constraints.c \
-	source/isl/backend.c
-
-LDADD = libcloog-isl.la
-cloog_DEPENDENCIES = libcloog-isl.la
-cloog_SOURCES = source/cloog.c
-pkginclude_HEADERS = \
-	include/cloog/block.h \
-	include/cloog/clast.h \
-	include/cloog/cloog.h \
-	include/cloog/input.h \
-	include/cloog/int.h \
-	include/cloog/matrix.h \
-	include/cloog/state.h \
-	include/cloog/domain.h \
-	include/cloog/loop.h \
-	include/cloog/constraints.h \
-	include/cloog/names.h \
-	include/cloog/options.h \
-	include/cloog/pprint.h \
-	include/cloog/program.h \
-	include/cloog/statement.h \
-	include/cloog/stride.h \
-	include/cloog/union_domain.h \
-	include/cloog/version.h
-
-pkgmatrixincludedir = $(pkgincludedir)/matrix
-pkgmatrixinclude_HEADERS = \
-	include/cloog/matrix/constraintset.h
-
-pkgislincludedir = $(pkgincludedir)/isl
-pkgislinclude_HEADERS = \
-	include/cloog/isl/backend.h \
-	include/cloog/isl/cloog.h \
-	include/cloog/isl/domain.h \
-	include/cloog/isl/constraintset.h
-
-EXTRA_DIST = \
-	autoconf/Doxyfile.in \
-	source/matrix/constraintset.c \
-	doc/cloog.texi \
-	doc/images \
-	examples
-
-all: all-recursive
-
-.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
-am--refresh:
-	@:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
-	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    echo ' $(SHELL) ./config.status'; \
-	    $(SHELL) ./config.status;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	$(SHELL) ./config.status --recheck
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	$(am__cd) $(srcdir) && $(AUTOCONF)
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
-$(am__aclocal_m4_deps):
-autoconf/Doxyfile: $(top_builddir)/config.status $(top_srcdir)/autoconf/Doxyfile.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-source/version.c: $(top_builddir)/config.status $(top_srcdir)/source/version.c.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-include/cloog/version.h: $(top_builddir)/config.status $(top_srcdir)/include/cloog/version.h.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-genversion.sh: $(top_builddir)/config.status $(srcdir)/genversion.sh.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
-	}
-
-uninstall-libLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
-	done
-
-clean-libLTLIBRARIES:
-	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
-	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" != "$$p" || dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-libcloog-isl.la: $(libcloog_isl_la_OBJECTS) $(libcloog_isl_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(libcloog_isl_la_LINK) $(am_libcloog_isl_la_rpath) $(libcloog_isl_la_OBJECTS) $(libcloog_isl_la_LIBADD) $(LIBS)
-install-binPROGRAMS: $(bin_PROGRAMS)
-	@$(NORMAL_INSTALL)
-	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
-	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
-	for p in $$list; do echo "$$p $$p"; done | \
-	sed 's/$(EXEEXT)$$//' | \
-	while read p p1; do if test -f $$p || test -f $$p1; \
-	  then echo "$$p"; echo "$$p"; else :; fi; \
-	done | \
-	sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
-	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
-	sed 'N;N;N;s,\n, ,g' | \
-	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
-	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
-	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
-	    else { print "f", $$3 "/" $$4, $$1; } } \
-	  END { for (d in files) print "f", d, files[d] }' | \
-	while read type dir files; do \
-	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
-	    test -z "$$files" || { \
-	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
-	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
-	    } \
-	; done
-
-uninstall-binPROGRAMS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
-	files=`for p in $$list; do echo "$$p"; done | \
-	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
-	      -e 's/$$/$(EXEEXT)/' `; \
-	test -n "$$list" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(bindir)" && rm -f $$files
-
-clean-binPROGRAMS:
-	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
-	echo " rm -f" $$list; \
-	rm -f $$list || exit $$?; \
-	test -n "$(EXEEXT)" || exit 0; \
-	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
-	echo " rm -f" $$list; \
-	rm -f $$list
-cloog$(EXEEXT): $(cloog_OBJECTS) $(cloog_DEPENDENCIES) 
-	@rm -f cloog$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(cloog_OBJECTS) $(cloog_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cloog.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-backend.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-block.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-clast.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-constraints.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-domain.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-input.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-int.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-loop.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-matrix.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-mp_get_memory_functions.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-names.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-options.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-pprint.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-program.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-state.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-statement.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-stride.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-union_domain.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcloog_isl_la-version.Plo@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c $<
-
-.c.obj:
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.c.lo:
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
-
-libcloog_isl_la-mp_get_memory_functions.lo: source/mp_get_memory_functions.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-mp_get_memory_functions.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-mp_get_memory_functions.Tpo -c -o libcloog_isl_la-mp_get_memory_functions.lo `test -f 'source/mp_get_memory_functions.c' || echo '$(srcdir)/'`source/mp_get_memory_functions.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-mp_get_memory_functions.Tpo $(DEPDIR)/libcloog_isl_la-mp_get_memory_functions.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/mp_get_memory_functions.c' object='libcloog_isl_la-mp_get_memory_functions.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-mp_get_memory_functions.lo `test -f 'source/mp_get_memory_functions.c' || echo '$(srcdir)/'`source/mp_get_memory_functions.c
-
-libcloog_isl_la-block.lo: source/block.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-block.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-block.Tpo -c -o libcloog_isl_la-block.lo `test -f 'source/block.c' || echo '$(srcdir)/'`source/block.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-block.Tpo $(DEPDIR)/libcloog_isl_la-block.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/block.c' object='libcloog_isl_la-block.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-block.lo `test -f 'source/block.c' || echo '$(srcdir)/'`source/block.c
-
-libcloog_isl_la-clast.lo: source/clast.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-clast.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-clast.Tpo -c -o libcloog_isl_la-clast.lo `test -f 'source/clast.c' || echo '$(srcdir)/'`source/clast.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-clast.Tpo $(DEPDIR)/libcloog_isl_la-clast.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/clast.c' object='libcloog_isl_la-clast.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-clast.lo `test -f 'source/clast.c' || echo '$(srcdir)/'`source/clast.c
-
-libcloog_isl_la-matrix.lo: source/matrix.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-matrix.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-matrix.Tpo -c -o libcloog_isl_la-matrix.lo `test -f 'source/matrix.c' || echo '$(srcdir)/'`source/matrix.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-matrix.Tpo $(DEPDIR)/libcloog_isl_la-matrix.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/matrix.c' object='libcloog_isl_la-matrix.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-matrix.lo `test -f 'source/matrix.c' || echo '$(srcdir)/'`source/matrix.c
-
-libcloog_isl_la-state.lo: source/state.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-state.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-state.Tpo -c -o libcloog_isl_la-state.lo `test -f 'source/state.c' || echo '$(srcdir)/'`source/state.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-state.Tpo $(DEPDIR)/libcloog_isl_la-state.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/state.c' object='libcloog_isl_la-state.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-state.lo `test -f 'source/state.c' || echo '$(srcdir)/'`source/state.c
-
-libcloog_isl_la-input.lo: source/input.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-input.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-input.Tpo -c -o libcloog_isl_la-input.lo `test -f 'source/input.c' || echo '$(srcdir)/'`source/input.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-input.Tpo $(DEPDIR)/libcloog_isl_la-input.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/input.c' object='libcloog_isl_la-input.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-input.lo `test -f 'source/input.c' || echo '$(srcdir)/'`source/input.c
-
-libcloog_isl_la-int.lo: source/int.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-int.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-int.Tpo -c -o libcloog_isl_la-int.lo `test -f 'source/int.c' || echo '$(srcdir)/'`source/int.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-int.Tpo $(DEPDIR)/libcloog_isl_la-int.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/int.c' object='libcloog_isl_la-int.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-int.lo `test -f 'source/int.c' || echo '$(srcdir)/'`source/int.c
-
-libcloog_isl_la-loop.lo: source/loop.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-loop.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-loop.Tpo -c -o libcloog_isl_la-loop.lo `test -f 'source/loop.c' || echo '$(srcdir)/'`source/loop.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-loop.Tpo $(DEPDIR)/libcloog_isl_la-loop.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/loop.c' object='libcloog_isl_la-loop.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-loop.lo `test -f 'source/loop.c' || echo '$(srcdir)/'`source/loop.c
-
-libcloog_isl_la-names.lo: source/names.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-names.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-names.Tpo -c -o libcloog_isl_la-names.lo `test -f 'source/names.c' || echo '$(srcdir)/'`source/names.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-names.Tpo $(DEPDIR)/libcloog_isl_la-names.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/names.c' object='libcloog_isl_la-names.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-names.lo `test -f 'source/names.c' || echo '$(srcdir)/'`source/names.c
-
-libcloog_isl_la-options.lo: source/options.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-options.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-options.Tpo -c -o libcloog_isl_la-options.lo `test -f 'source/options.c' || echo '$(srcdir)/'`source/options.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-options.Tpo $(DEPDIR)/libcloog_isl_la-options.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/options.c' object='libcloog_isl_la-options.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-options.lo `test -f 'source/options.c' || echo '$(srcdir)/'`source/options.c
-
-libcloog_isl_la-pprint.lo: source/pprint.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-pprint.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-pprint.Tpo -c -o libcloog_isl_la-pprint.lo `test -f 'source/pprint.c' || echo '$(srcdir)/'`source/pprint.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-pprint.Tpo $(DEPDIR)/libcloog_isl_la-pprint.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/pprint.c' object='libcloog_isl_la-pprint.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-pprint.lo `test -f 'source/pprint.c' || echo '$(srcdir)/'`source/pprint.c
-
-libcloog_isl_la-program.lo: source/program.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-program.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-program.Tpo -c -o libcloog_isl_la-program.lo `test -f 'source/program.c' || echo '$(srcdir)/'`source/program.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-program.Tpo $(DEPDIR)/libcloog_isl_la-program.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/program.c' object='libcloog_isl_la-program.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-program.lo `test -f 'source/program.c' || echo '$(srcdir)/'`source/program.c
-
-libcloog_isl_la-statement.lo: source/statement.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-statement.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-statement.Tpo -c -o libcloog_isl_la-statement.lo `test -f 'source/statement.c' || echo '$(srcdir)/'`source/statement.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-statement.Tpo $(DEPDIR)/libcloog_isl_la-statement.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/statement.c' object='libcloog_isl_la-statement.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-statement.lo `test -f 'source/statement.c' || echo '$(srcdir)/'`source/statement.c
-
-libcloog_isl_la-stride.lo: source/stride.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-stride.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-stride.Tpo -c -o libcloog_isl_la-stride.lo `test -f 'source/stride.c' || echo '$(srcdir)/'`source/stride.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-stride.Tpo $(DEPDIR)/libcloog_isl_la-stride.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/stride.c' object='libcloog_isl_la-stride.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-stride.lo `test -f 'source/stride.c' || echo '$(srcdir)/'`source/stride.c
-
-libcloog_isl_la-union_domain.lo: source/union_domain.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-union_domain.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-union_domain.Tpo -c -o libcloog_isl_la-union_domain.lo `test -f 'source/union_domain.c' || echo '$(srcdir)/'`source/union_domain.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-union_domain.Tpo $(DEPDIR)/libcloog_isl_la-union_domain.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/union_domain.c' object='libcloog_isl_la-union_domain.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-union_domain.lo `test -f 'source/union_domain.c' || echo '$(srcdir)/'`source/union_domain.c
-
-libcloog_isl_la-version.lo: source/version.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-version.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-version.Tpo -c -o libcloog_isl_la-version.lo `test -f 'source/version.c' || echo '$(srcdir)/'`source/version.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-version.Tpo $(DEPDIR)/libcloog_isl_la-version.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/version.c' object='libcloog_isl_la-version.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-version.lo `test -f 'source/version.c' || echo '$(srcdir)/'`source/version.c
-
-libcloog_isl_la-domain.lo: source/isl/domain.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-domain.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-domain.Tpo -c -o libcloog_isl_la-domain.lo `test -f 'source/isl/domain.c' || echo '$(srcdir)/'`source/isl/domain.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-domain.Tpo $(DEPDIR)/libcloog_isl_la-domain.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/isl/domain.c' object='libcloog_isl_la-domain.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-domain.lo `test -f 'source/isl/domain.c' || echo '$(srcdir)/'`source/isl/domain.c
-
-libcloog_isl_la-constraints.lo: source/isl/constraints.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-constraints.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-constraints.Tpo -c -o libcloog_isl_la-constraints.lo `test -f 'source/isl/constraints.c' || echo '$(srcdir)/'`source/isl/constraints.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-constraints.Tpo $(DEPDIR)/libcloog_isl_la-constraints.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/isl/constraints.c' object='libcloog_isl_la-constraints.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-constraints.lo `test -f 'source/isl/constraints.c' || echo '$(srcdir)/'`source/isl/constraints.c
-
-libcloog_isl_la-backend.lo: source/isl/backend.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcloog_isl_la-backend.lo -MD -MP -MF $(DEPDIR)/libcloog_isl_la-backend.Tpo -c -o libcloog_isl_la-backend.lo `test -f 'source/isl/backend.c' || echo '$(srcdir)/'`source/isl/backend.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcloog_isl_la-backend.Tpo $(DEPDIR)/libcloog_isl_la-backend.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/isl/backend.c' object='libcloog_isl_la-backend.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcloog_isl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcloog_isl_la-backend.lo `test -f 'source/isl/backend.c' || echo '$(srcdir)/'`source/isl/backend.c
-
-cloog.o: source/cloog.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cloog.o -MD -MP -MF $(DEPDIR)/cloog.Tpo -c -o cloog.o `test -f 'source/cloog.c' || echo '$(srcdir)/'`source/cloog.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/cloog.Tpo $(DEPDIR)/cloog.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/cloog.c' object='cloog.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cloog.o `test -f 'source/cloog.c' || echo '$(srcdir)/'`source/cloog.c
-
-cloog.obj: source/cloog.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cloog.obj -MD -MP -MF $(DEPDIR)/cloog.Tpo -c -o cloog.obj `if test -f 'source/cloog.c'; then $(CYGPATH_W) 'source/cloog.c'; else $(CYGPATH_W) '$(srcdir)/source/cloog.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/cloog.Tpo $(DEPDIR)/cloog.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='source/cloog.c' object='cloog.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cloog.obj `if test -f 'source/cloog.c'; then $(CYGPATH_W) 'source/cloog.c'; else $(CYGPATH_W) '$(srcdir)/source/cloog.c'; fi`
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool config.lt
-install-pkgincludeHEADERS: $(pkginclude_HEADERS)
-	@$(NORMAL_INSTALL)
-	test -z "$(pkgincludedir)" || $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)"
-	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
-	done
-
-uninstall-pkgincludeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(pkgincludedir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(pkgincludedir)" && rm -f $$files
-install-pkgislincludeHEADERS: $(pkgislinclude_HEADERS)
-	@$(NORMAL_INSTALL)
-	test -z "$(pkgislincludedir)" || $(MKDIR_P) "$(DESTDIR)$(pkgislincludedir)"
-	@list='$(pkgislinclude_HEADERS)'; test -n "$(pkgislincludedir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgislincludedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgislincludedir)" || exit $$?; \
-	done
-
-uninstall-pkgislincludeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgislinclude_HEADERS)'; test -n "$(pkgislincludedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(pkgislincludedir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(pkgislincludedir)" && rm -f $$files
-install-pkgmatrixincludeHEADERS: $(pkgmatrixinclude_HEADERS)
-	@$(NORMAL_INSTALL)
-	test -z "$(pkgmatrixincludedir)" || $(MKDIR_P) "$(DESTDIR)$(pkgmatrixincludedir)"
-	@list='$(pkgmatrixinclude_HEADERS)'; test -n "$(pkgmatrixincludedir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgmatrixincludedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgmatrixincludedir)" || exit $$?; \
-	done
-
-uninstall-pkgmatrixincludeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgmatrixinclude_HEADERS)'; test -n "$(pkgmatrixincludedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(pkgmatrixincludedir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(pkgmatrixincludedir)" && rm -f $$files
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	$(am__remove_distdir)
-	test -d "$(distdir)" || mkdir "$(distdir)"
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test -d "$(distdir)/$$subdir" \
-	    || $(MKDIR_P) "$(distdir)/$$subdir" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-	    $(am__relativize); \
-	    new_distdir=$$reldir; \
-	    dir1=$$subdir; dir2="$(top_distdir)"; \
-	    $(am__relativize); \
-	    new_top_distdir=$$reldir; \
-	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-	    ($(am__cd) $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$new_top_distdir" \
-	        distdir="$$new_distdir" \
-		am__remove_distdir=: \
-		am__skip_length_check=: \
-		am__skip_mode_fix=: \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-	$(MAKE) $(AM_MAKEFLAGS) \
-	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
-	  dist-hook
-	-test -n "$(am__skip_mode_fix)" \
-	|| find "$(distdir)" -type d ! -perm -755 \
-		-exec chmod u+rwx,go+rx {} \; -o \
-	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
-	|| chmod -R a+r "$(distdir)"
-dist-gzip: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__remove_distdir)
-
-dist-bzip2: distdir
-	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
-	$(am__remove_distdir)
-
-dist-lzma: distdir
-	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
-	$(am__remove_distdir)
-
-dist-xz: distdir
-	tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
-	$(am__remove_distdir)
-
-dist-tarZ: distdir
-	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
-	$(am__remove_distdir)
-
-dist-shar: distdir
-	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
-	$(am__remove_distdir)
-
-dist-zip: distdir
-	-rm -f $(distdir).zip
-	zip -rq $(distdir).zip $(distdir)
-	$(am__remove_distdir)
-
-dist dist-all: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__remove_distdir)
-
-# This target untars the dist file and tries a VPATH configuration.  Then
-# it guarantees that the distribution is self-contained by making another
-# tarfile.
-distcheck: dist
-	case '$(DIST_ARCHIVES)' in \
-	*.tar.gz*) \
-	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
-	*.tar.bz2*) \
-	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
-	*.tar.lzma*) \
-	  lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
-	*.tar.xz*) \
-	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
-	*.tar.Z*) \
-	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
-	*.shar.gz*) \
-	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
-	*.zip*) \
-	  unzip $(distdir).zip ;;\
-	esac
-	chmod -R a-w $(distdir); chmod a+w $(distdir)
-	mkdir $(distdir)/_build
-	mkdir $(distdir)/_inst
-	chmod a-w $(distdir)
-	test -d $(distdir)/_build || exit 0; \
-	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
-	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
-	  && am__cwd=`pwd` \
-	  && $(am__cd) $(distdir)/_build \
-	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
-	    $(DISTCHECK_CONFIGURE_FLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
-	  && $(MAKE) $(AM_MAKEFLAGS) check \
-	  && $(MAKE) $(AM_MAKEFLAGS) install \
-	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
-	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
-	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
-	        distuninstallcheck \
-	  && chmod -R a-w "$$dc_install_base" \
-	  && ({ \
-	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
-	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
-	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
-	  && rm -rf "$$dc_destdir" \
-	  && $(MAKE) $(AM_MAKEFLAGS) dist \
-	  && rm -rf $(DIST_ARCHIVES) \
-	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
-	  && cd "$$am__cwd" \
-	  || exit 1
-	$(am__remove_distdir)
-	@(echo "$(distdir) archives ready for distribution: "; \
-	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
-	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
-distuninstallcheck:
-	@$(am__cd) '$(distuninstallcheck_dir)' \
-	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
-	   || { echo "ERROR: files left after uninstall:" ; \
-	        if test -n "$(DESTDIR)"; then \
-	          echo "  (check DESTDIR support)"; \
-	        fi ; \
-	        $(distuninstallcheck_listfiles) ; \
-	        exit 1; } >&2
-distcleancheck: distclean
-	@if test '$(srcdir)' = . ; then \
-	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
-	  exit 1 ; \
-	fi
-	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
-	  || { echo "ERROR: files left in build directory after distclean:" ; \
-	       $(distcleancheck_listfiles) ; \
-	       exit 1; } >&2
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS)
-install-binPROGRAMS: install-libLTLIBRARIES
-
-installdirs: installdirs-recursive
-installdirs-am:
-	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgincludedir)" "$(DESTDIR)$(pkgislincludedir)" "$(DESTDIR)$(pkgmatrixincludedir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
-	clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-libtool distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am: install-data-local install-pkgincludeHEADERS \
-	install-pkgislincludeHEADERS install-pkgmatrixincludeHEADERS
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am: install-binPROGRAMS install-libLTLIBRARIES
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf $(top_srcdir)/autom4te.cache
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES \
-	uninstall-local uninstall-pkgincludeHEADERS \
-	uninstall-pkgislincludeHEADERS \
-	uninstall-pkgmatrixincludeHEADERS
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
-	install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-	all all-am am--refresh check check-am clean clean-binPROGRAMS \
-	clean-generic clean-libLTLIBRARIES clean-libtool ctags \
-	ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-hook \
-	dist-lzma dist-shar dist-tarZ dist-xz dist-zip distcheck \
-	distclean distclean-compile distclean-generic \
-	distclean-libtool distclean-tags distcleancheck distdir \
-	distuninstallcheck dvi dvi-am html html-am info info-am \
-	install install-am install-binPROGRAMS install-data \
-	install-data-am install-data-local install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-libLTLIBRARIES \
-	install-man install-pdf install-pdf-am \
-	install-pkgincludeHEADERS install-pkgislincludeHEADERS \
-	install-pkgmatrixincludeHEADERS install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	installdirs-am maintainer-clean maintainer-clean-generic \
-	mostlyclean mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
-	uninstall uninstall-am uninstall-binPROGRAMS \
-	uninstall-libLTLIBRARIES uninstall-local \
-	uninstall-pkgincludeHEADERS uninstall-pkgislincludeHEADERS \
-	uninstall-pkgmatrixincludeHEADERS
-
-
-FORCE:
-isl/libisl.la: FORCE
-	cd isl; $(MAKE) $(AM_MAKEFLAGS) libisl.la
-
-version.h: @GIT_INDEX@
-	echo '#define CLOOG_HEAD "'`$(top_builddir)/genversion.sh`'"' > $@
-
-install-data-local:
-	@test -z "$(pkgconfig_libdir)" || $(mkdir_p) "$(DESTDIR)$(pkgconfig_libdir)"
-	$(INSTALL_DATA) $(pkgconfig_libfile) "$(DESTDIR)$(pkgconfig_libdir)/$(pkgconfig_libfile)"
-
-uninstall-local:
-	rm -f "$(DESTDIR)$(pkgconfig_libdir)/$(pkgconfig_libfile)"
-
-dist-hook:
-	rm -f $(distdir)/test/Makefile
-	$(top_builddir)/genversion.sh > $(distdir)/CLOOG_HEAD
-	(cd doc; make cloog.pdf) && cp doc/cloog.pdf $(distdir)/doc/
-
-#/*****************************************************************************
-# *                                   Rules                                   *
-# *****************************************************************************/
-
-valcheck:
-	$(MAKE) valgrind -C test
-
-total:
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *                     CLooG                     *"
-	@echo "              *-----------------------------------------------*/"
-	$(MAKE) uninstall
-	$(MAKE) clean
-	$(MAKE)
-	$(MAKE) install
-
-doc:
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *        Generating CLooG's documentation       *"
-	@echo "              *-----------------------------------------------*/"
-	doxygen ./autoconf/Doxyfile
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/cloog-0.17.0/README b/cloog-0.17.0/README
deleted file mode 100644
index 7003a2b..0000000
--- a/cloog-0.17.0/README
+++ /dev/null
@@ -1,203 +0,0 @@
-#
-#  /**-------------------------------------------------------------------**
-#   **                              CLooG                                **
-#   **-------------------------------------------------------------------**
-#   **                     The Chunky Loop Generator                     **
-#   **-------------------------------------------------------------------**
-#   **           First version of this file: january 22th 2002           **
-#   **-------------------------------------------------------------------**/
-#
-
-For complete informations about this software, how to build and use it,
-please see the postscript file in the ./doc subdirectory (a pdf version
-is available in the web site).
-
-Overview :
-I.   Description 
-II.  Building CLooG
-III. Options
-IV.  Running CLooG
-V.   General Questions
-
-#   **-------------------------------------------------------------------**
-#   **                        I. Description                             **
-#   **-------------------------------------------------------------------**/
-
-CLooG is a software which generates loops for scanning Z-polyhedra. That is,
-CLooG finds the code or pseudo-code where each integral point of one or more
-parametrized polyhedron or parametrized polyhedra union is reached. CLooG is
-designed to avoid control overhead and to produce a very efficient code.
-
-Its input is some data on the polyhedra to scan, basically the system of
-affine inequalities that define them, and a context that defines some
-properties known on the parameters if any. The output is the pseudo scanning
-code. Many facilities are provided to generate a near-to-be-compileable code,
-and every useful functions to generate the code may be called from the CLooG
-library.
-
-            INPUT                   |                 OUTPUT
-(fortunately not exactly the input, |   (the real one, with default options)
- check test/readme.cloog for the    |
- real input for that problem !)	    |
-	                            |
-	j^ i>=2                     |
-         | | j<=n+2-i               |
-         | |\     | i<=n            |
-         | | \    |                 |
-       m-+-****---+-j<=m            |    for (i=2;i<=n;i++) {
-         | *****  |                 |      for (j=2;j<=min(m,-i+n+2);j++) {    
-         | ****** |                ==>       S1 ;
-         | *******|                 |      }
-       2-+-********-j>=2            |    }
-         | |      |\                |
-       0-+-+------+--->i            |
-         | |      |                 |
-         0 2      n                 |
-                                    |
-       Context : n>=2               |
-                 m>=2               |
-       System  : 2<=i<=n            |
-                 2<=j<=m            |
-		 j<=n+2-i           |
-
-#   **-------------------------------------------------------------------**
-#   **                      II. Building CLooG                           **
-#   **-------------------------------------------------------------------**/
-
-If you obtained CLooG from the git repository, then you first
-need to obtain the submodules and create a configure script.
-
-  ./get_submodules.sh
-  ./autogen.sh
-
-The first step is only needed if you plan on using the isl backend.
-
-The configure shell script attempts to guess correct values for various
-system-dependent variables used during compilation. It uses those values to
-create a Makefile. The file configure.ac is used to create configure by a
-program called autoconf.  You only need configure.ac if you want to change
-it or regenerate configure using a newer version of autoconf.
-
-The simplest way to compile this package is:
-cd to the directory containing the package's source code and type 
-
-  ./configure
-
-to configure the package for your system (while running, configure prints
-some messages telling which features it is checking for). To compile the
-package, type
-
-  make
-  
-
-to install the program and/or the library, type
-
-  make install
-
-you can remove the program binaries and object files from the source code
-directory by typing
-  
-  make clean
-  
-To also remove the files that configure created (so you can compile the
-package for a different kind of computer) type
-  
-  make distclean
-
-#   **-------------------------------------------------------------------**
-#   **                           III. Options                            **
-#   **-------------------------------------------------------------------**/
-
-By default,  make will install the package's files in /usr/local/bin,
-/usr/local/lib, etc. You can specify an installation prefix other than 
-/usr/local by giving onfigure the option --prefix=PATH.
-
-By default, configure will use the isl that comes bundled with CLooG.
-Using the --with-isl option of configure the user can specify that "no" isl,
-a previously installed ("system") isl or a "build" isl should be used.
-In the latter case, the user should also specify the build location
-using --with-isl-builddir=PATH.  In case of an installed isl,
-the installation location can be specified using the
---with-isl-prefix=PATH and --with-isl-exec-prefix=PATH options of configure.
-
-By default, configure will seek the PolyLib in standard locations.
-If necessary, you can specify the PolyLib's path by giving configure the
-option --with-polylib-prefix=PATH and/or --with-polylib-exec-prefix=PATH.
-
-By default, configure will seek the GMP library in standard locations.
-If necessary, you can specify the GMP's path by giving configure the
-option --with-gmp-prefix=PATH and/or --with-gmp-exec-prefix=PATH.
-
-By default, when using the PolyLib backend,
-CLooG and its library are built using 64 bits integer
-representation. You can choose to specify explicitly others integer
-representations by using:
---with-bits=32  for 32 bits integers,
---with-bits=64  for 64 bits integers (default),
---with-bits=gmp for multiple precision integers.
-
-#   **-------------------------------------------------------------------**
-#   **                         IV. Running CLooG                         **
-#   **-------------------------------------------------------------------**/
-
-To run CLooG, simply type 'cloog', optionally followed by the name of an
-input file. You can type 'cloog -h' or 'cloog --help' for some help.
-For more informations, please check the ./doc subdirectory.
-
-#   **-------------------------------------------------------------------**
-#   **                        V. General Questions                       **
-#   **-------------------------------------------------------------------**/
-
-1. What does CLooG means ?
-
-CLooG is the Chunky LOOp Generator, Chunky is an automatic loop optimizer for
-data locality. CLooG is a completely independent part of the Chunky project.
-Pronounce 'CLooG' as 'klug', which means 'sly' in german :-).
-
-2. CLooG do not compile, what should I do ?
-
-CLooG should compile everywhere (assuming that PolyLib is still there), thus
-there is a problem or the documentation is not clear, in both case it is
-necessary to ask the author(s) !
-
-3. I need a feature that CLooG do not implement, what should I do ?
-
-There are two ways. First, CLooG is a LGPL software and library. So you
-are welcome to improve it yourself ;-) ! Many project have been successful, it
-is -maybe- a sign that this is not too hard to put your hands inside the
-source. Second, just ask the author(s) :-) ! Maybe a lot of people would be
-interessed by such feature, maybe many people asked for it before, maybe it's
-trivial to implement (and even)... Please just never hesitate to ask the
-author(s) !
-
-4. I implemented a cool feature, can I submit it ?
-
-Obviously you are welcome to send the author(s) any improvement. But obviously
-we are quite careful with readability, correctness and stability, and the
-author(s) will read, check and check again any contribution before including it.
-Thus, it can take time... There are few basic rules to write contributions:
-- (1) Do never change the indentation of any part of the code that is not yours.
-- (2) Do never send codes that use more than 80 columns.
-- (3) Do never send codes without a lot of comments in (bad or good) english.
-- (4) Do never send codes with obscure and/or non-english variable names.
-- (5) Use C89, just C, only C (note: "//" comments are not C89,
-  variable declaration elsewhere than at the beginning of a block, is not C89).
-- (6) Read doc/SubmittingPatches
-Please understand that in order to live for a long time, and to be used in many
-projects the very first priority for CLooG is to be readable and documented.
-
-5. Is CLooG bug free ?
-
-No, who can ? ClooG is a complex program, and we do not pretend it to be bug
-free. Nevertheless because it has been tested and tested, we are fairly sure
-that CLooG results with default options have good chances to be satisfactory.
-If you find a result that looks strange, inadequate or incorrect, please send:
-- (1) The input file to the author(s).
-- (2) The output.
-- (3) The first line given by typing 'cloog -v'.
-- (4) All your command line options to achieve the result.
-We will try to explain the result or to fix the problem as soon as possible.
-
-6. How can I contact the author(s) ?
-
-Just send a mail to cloog-development@googlegroups.com
diff --git a/cloog-0.17.0/aclocal.m4 b/cloog-0.17.0/aclocal.m4
deleted file mode 100644
index 884385e..0000000
--- a/cloog-0.17.0/aclocal.m4
+++ /dev/null
@@ -1,991 +0,0 @@
-# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-m4_ifndef([AC_AUTOCONF_VERSION],
-  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.67],,
-[m4_warning([this file was generated for autoconf 2.67.
-You have another version of autoconf.  It may work, but is not guaranteed to.
-If you have problems, you may need to regenerate the build system entirely.
-To do so, use the procedure documented by the package, typically `autoreconf'.])])
-
-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_AUTOMAKE_VERSION(VERSION)
-# ----------------------------
-# Automake X.Y traces this macro to ensure aclocal.m4 has been
-# generated from the m4 files accompanying Automake X.Y.
-# (This private macro should not be called outside this file.)
-AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.11'
-dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
-dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.11.1], [],
-      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
-])
-
-# _AM_AUTOCONF_VERSION(VERSION)
-# -----------------------------
-# aclocal traces this macro to find the Autoconf version.
-# This is a private macro too.  Using m4_define simplifies
-# the logic in aclocal, which can simply ignore this definition.
-m4_define([_AM_AUTOCONF_VERSION], [])
-
-# AM_SET_CURRENT_AUTOMAKE_VERSION
-# -------------------------------
-# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
-# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
-AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.1])dnl
-m4_ifndef([AC_AUTOCONF_VERSION],
-  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
-
-# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
-# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
-#
-# Of course, Automake must honor this variable whenever it calls a
-# tool from the auxiliary directory.  The problem is that $srcdir (and
-# therefore $ac_aux_dir as well) can be either absolute or relative,
-# depending on how configure is run.  This is pretty annoying, since
-# it makes $ac_aux_dir quite unusable in subdirectories: in the top
-# source directory, any form will work fine, but in subdirectories a
-# relative path needs to be adjusted first.
-#
-# $ac_aux_dir/missing
-#    fails when called from a subdirectory if $ac_aux_dir is relative
-# $top_srcdir/$ac_aux_dir/missing
-#    fails if $ac_aux_dir is absolute,
-#    fails when called from a subdirectory in a VPATH build with
-#          a relative $ac_aux_dir
-#
-# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
-# are both prefixed by $srcdir.  In an in-source build this is usually
-# harmless because $srcdir is `.', but things will broke when you
-# start a VPATH build or use an absolute $srcdir.
-#
-# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
-# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
-#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
-# and then we would define $MISSING as
-#   MISSING="\${SHELL} $am_aux_dir/missing"
-# This will work as long as MISSING is not called from configure, because
-# unfortunately $(top_srcdir) has no meaning in configure.
-# However there are other variables, like CC, which are often used in
-# configure, and could therefore not use this "fixed" $ac_aux_dir.
-#
-# Another solution, used here, is to always expand $ac_aux_dir to an
-# absolute PATH.  The drawback is that using absolute paths prevent a
-# configured tree to be moved without reconfiguration.
-
-AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-])
-
-# AM_CONDITIONAL                                            -*- Autoconf -*-
-
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 9
-
-# AM_CONDITIONAL(NAME, SHELL-CONDITION)
-# -------------------------------------
-# Define a conditional.
-AC_DEFUN([AM_CONDITIONAL],
-[AC_PREREQ(2.52)dnl
- ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
-	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
-AC_SUBST([$1_TRUE])dnl
-AC_SUBST([$1_FALSE])dnl
-_AM_SUBST_NOTMAKE([$1_TRUE])dnl
-_AM_SUBST_NOTMAKE([$1_FALSE])dnl
-m4_define([_AM_COND_VALUE_$1], [$2])dnl
-if $2; then
-  $1_TRUE=
-  $1_FALSE='#'
-else
-  $1_TRUE='#'
-  $1_FALSE=
-fi
-AC_CONFIG_COMMANDS_PRE(
-[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
-  AC_MSG_ERROR([[conditional "$1" was never defined.
-Usually this means the macro was only invoked conditionally.]])
-fi])])
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 10
-
-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
-# written in clear, in which case automake, when reading aclocal.m4,
-# will think it sees a *use*, and therefore will trigger all it's
-# C support machinery.  Also note that it means that autoscan, seeing
-# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
-
-
-# _AM_DEPENDENCIES(NAME)
-# ----------------------
-# See how the compiler implements dependency checking.
-# NAME is "CC", "CXX", "GCJ", or "OBJC".
-# We try a few techniques and use that to set a single cache variable.
-#
-# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
-# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
-# dependency, and given that the user is not expected to run this macro,
-# just rely on AC_PROG_CC.
-AC_DEFUN([_AM_DEPENDENCIES],
-[AC_REQUIRE([AM_SET_DEPDIR])dnl
-AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
-AC_REQUIRE([AM_MAKE_INCLUDE])dnl
-AC_REQUIRE([AM_DEP_TRACK])dnl
-
-ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
-       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
-       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
-       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
-       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
-                   [depcc="$$1"   am_compiler_list=])
-
-AC_CACHE_CHECK([dependency style of $depcc],
-               [am_cv_$1_dependencies_compiler_type],
-[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_$1_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
-  fi
-  am__universal=false
-  m4_case([$1], [CC],
-    [case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac],
-    [CXX],
-    [case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac])
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_$1_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_$1_dependencies_compiler_type=none
-fi
-])
-AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
-AM_CONDITIONAL([am__fastdep$1], [
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
-])
-
-
-# AM_SET_DEPDIR
-# -------------
-# Choose a directory name for dependency files.
-# This macro is AC_REQUIREd in _AM_DEPENDENCIES
-AC_DEFUN([AM_SET_DEPDIR],
-[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
-])
-
-
-# AM_DEP_TRACK
-# ------------
-AC_DEFUN([AM_DEP_TRACK],
-[AC_ARG_ENABLE(dependency-tracking,
-[  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors])
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-fi
-AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
-AC_SUBST([AMDEPBACKSLASH])dnl
-_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
-])
-
-# Generate code to set up dependency tracking.              -*- Autoconf -*-
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-#serial 5
-
-# _AM_OUTPUT_DEPENDENCY_COMMANDS
-# ------------------------------
-AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
-[{
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
-  # are listed without --file.  Let's play safe and only enable the eval
-  # if we detect the quoting.
-  case $CONFIG_FILES in
-  *\'*) eval set x "$CONFIG_FILES" ;;
-  *)   set x $CONFIG_FILES ;;
-  esac
-  shift
-  for mf
-  do
-    # Strip MF so we end up with the name of the file.
-    mf=`echo "$mf" | sed -e 's/:.*$//'`
-    # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
-    # some people rename them; so instead we look at the file content.
-    # Grep'ing the first line is not enough: some people post-process
-    # each Makefile.in and add a new line on top of each file to say so.
-    # Grep'ing the whole file is not good either: AIX grep has a line
-    # limit of 2048, but all sed's we know have understand at least 4000.
-    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-      dirpart=`AS_DIRNAME("$mf")`
-    else
-      continue
-    fi
-    # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
-    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-    test -z "$DEPDIR" && continue
-    am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
-    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
-    # Find all dependency output files, they are included files with
-    # $(DEPDIR) in their names.  We invoke sed twice because it is the
-    # simplest approach to changing $(DEPDIR) to its actual value in the
-    # expansion.
-    for file in `sed -n "
-      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-      # Make sure the directory exists.
-      test -f "$dirpart/$file" && continue
-      fdir=`AS_DIRNAME(["$file"])`
-      AS_MKDIR_P([$dirpart/$fdir])
-      # echo "creating $dirpart/$file"
-      echo '# dummy' > "$dirpart/$file"
-    done
-  done
-}
-])# _AM_OUTPUT_DEPENDENCY_COMMANDS
-
-
-# AM_OUTPUT_DEPENDENCY_COMMANDS
-# -----------------------------
-# This macro should only be invoked once -- use via AC_REQUIRE.
-#
-# This code is only required when automatic dependency tracking
-# is enabled.  FIXME.  This creates each `.P' file that we will
-# need in order to bootstrap the dependency handling code.
-AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
-[AC_CONFIG_COMMANDS([depfiles],
-     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
-     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
-])
-
-# Do all the work for Automake.                             -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 16
-
-# This macro actually does too much.  Some checks are only needed if
-# your package does certain things.  But this isn't really a big deal.
-
-# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
-# AM_INIT_AUTOMAKE([OPTIONS])
-# -----------------------------------------------
-# The call with PACKAGE and VERSION arguments is the old style
-# call (pre autoconf-2.50), which is being phased out.  PACKAGE
-# and VERSION should now be passed to AC_INIT and removed from
-# the call to AM_INIT_AUTOMAKE.
-# We support both call styles for the transition.  After
-# the next Automake release, Autoconf can make the AC_INIT
-# arguments mandatory, and then we can depend on a new Autoconf
-# release and drop the old call support.
-AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.62])dnl
-dnl Autoconf wants to disallow AM_ names.  We explicitly allow
-dnl the ones we care about.
-m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
-AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
-AC_REQUIRE([AC_PROG_INSTALL])dnl
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-AC_SUBST([CYGPATH_W])
-
-# Define the identity of the package.
-dnl Distinguish between old-style and new-style calls.
-m4_ifval([$2],
-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
- AC_SUBST([PACKAGE], [$1])dnl
- AC_SUBST([VERSION], [$2])],
-[_AM_SET_OPTIONS([$1])dnl
-dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
-m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
-  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
-
-_AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
-
-# Some tools Automake needs.
-AC_REQUIRE([AM_SANITY_CHECK])dnl
-AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
-AM_MISSING_PROG(AUTOCONF, autoconf)
-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
-AM_MISSING_PROG(AUTOHEADER, autoheader)
-AM_MISSING_PROG(MAKEINFO, makeinfo)
-AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
-AC_REQUIRE([AM_PROG_MKDIR_P])dnl
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([AC_PROG_MAKE_SET])dnl
-AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
-	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
-			     [_AM_PROG_TAR([v7])])])
-_AM_IF_OPTION([no-dependencies],,
-[AC_PROVIDE_IFELSE([AC_PROG_CC],
-		  [_AM_DEPENDENCIES(CC)],
-		  [define([AC_PROG_CC],
-			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_CXX],
-		  [_AM_DEPENDENCIES(CXX)],
-		  [define([AC_PROG_CXX],
-			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_OBJC],
-		  [_AM_DEPENDENCIES(OBJC)],
-		  [define([AC_PROG_OBJC],
-			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
-])
-_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
-dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
-dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
-dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
-AC_CONFIG_COMMANDS_PRE(dnl
-[m4_provide_if([_AM_COMPILER_EXEEXT],
-  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
-])
-
-dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
-dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
-dnl mangled by Autoconf and run in a shell conditional statement.
-m4_define([_AC_COMPILER_EXEEXT],
-m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
-
-
-# When config.status generates a header, we must update the stamp-h file.
-# This file resides in the same directory as the config header
-# that is generated.  The stamp files are numbered to have different names.
-
-# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
-# loop where config.status creates the headers, so we can generate
-# our stamp files there.
-AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
-[# Compute $1's index in $config_headers.
-_am_arg=$1
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $_am_arg | $_am_arg:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
-
-# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_INSTALL_SH
-# ------------------
-# Define $install_sh.
-AC_DEFUN([AM_PROG_INSTALL_SH],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-if test x"${install_sh}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
-  *)
-    install_sh="\${SHELL} $am_aux_dir/install-sh"
-  esac
-fi
-AC_SUBST(install_sh)])
-
-# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# Check whether the underlying file-system supports filenames
-# with a leading dot.  For instance MS-DOS doesn't.
-AC_DEFUN([AM_SET_LEADING_DOT],
-[rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
-else
-  am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-AC_SUBST([am__leading_dot])])
-
-# Check to see how 'make' treats includes.	            -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 4
-
-# AM_MAKE_INCLUDE()
-# -----------------
-# Check to see how make treats includes.
-AC_DEFUN([AM_MAKE_INCLUDE],
-[am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-	@echo this is the am__doit target
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-AC_MSG_CHECKING([for style of include used by $am_make])
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
-  am__include=include
-  am__quote=
-  _am_result=GNU
-  ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   case `$am_make -s -f confmf 2> /dev/null` in #(
-   *the\ am__doit\ target*)
-     am__include=.include
-     am__quote="\""
-     _am_result=BSD
-     ;;
-   esac
-fi
-AC_SUBST([am__include])
-AC_SUBST([am__quote])
-AC_MSG_RESULT([$_am_result])
-rm -f confinc confmf
-])
-
-# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
-
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 6
-
-# AM_MISSING_PROG(NAME, PROGRAM)
-# ------------------------------
-AC_DEFUN([AM_MISSING_PROG],
-[AC_REQUIRE([AM_MISSING_HAS_RUN])
-$1=${$1-"${am_missing_run}$2"}
-AC_SUBST($1)])
-
-
-# AM_MISSING_HAS_RUN
-# ------------------
-# Define MISSING if not defined so far and test if it supports --run.
-# If it does, set am_missing_run to use it, otherwise, to nothing.
-AC_DEFUN([AM_MISSING_HAS_RUN],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([missing])dnl
-if test x"${MISSING+set}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
-  *)
-    MISSING="\${SHELL} $am_aux_dir/missing" ;;
-  esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  AC_MSG_WARN([`missing' script is too old or missing])
-fi
-])
-
-# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_MKDIR_P
-# ---------------
-# Check for `mkdir -p'.
-AC_DEFUN([AM_PROG_MKDIR_P],
-[AC_PREREQ([2.60])dnl
-AC_REQUIRE([AC_PROG_MKDIR_P])dnl
-dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
-dnl while keeping a definition of mkdir_p for backward compatibility.
-dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
-dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
-dnl Makefile.ins that do not define MKDIR_P, so we do our own
-dnl adjustment using top_builddir (which is defined more often than
-dnl MKDIR_P).
-AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
-case $mkdir_p in
-  [[\\/$]]* | ?:[[\\/]]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-])
-
-# Helper functions for option handling.                     -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 4
-
-# _AM_MANGLE_OPTION(NAME)
-# -----------------------
-AC_DEFUN([_AM_MANGLE_OPTION],
-[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
-
-# _AM_SET_OPTION(NAME)
-# ------------------------------
-# Set option NAME.  Presently that only means defining a flag for this option.
-AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
-
-# _AM_SET_OPTIONS(OPTIONS)
-# ----------------------------------
-# OPTIONS is a space-separated list of Automake options.
-AC_DEFUN([_AM_SET_OPTIONS],
-[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
-
-# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
-# -------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-AC_DEFUN([_AM_IF_OPTION],
-[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-
-# Check to make sure that the build environment is sane.    -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# AM_SANITY_CHECK
-# ---------------
-AC_DEFUN([AM_SANITY_CHECK],
-[AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name.  Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
-  *[[\\\"\#\$\&\'\`$am_lf]]*)
-    AC_MSG_ERROR([unsafe absolute working directory name]);;
-esac
-case $srcdir in
-  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
-    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$[*]" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$[*]" != "X $srcdir/configure conftest.file" \
-      && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
-alias in your environment])
-   fi
-
-   test "$[2]" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   AC_MSG_ERROR([newly created file is older than distributed files!
-Check your system clock])
-fi
-AC_MSG_RESULT(yes)])
-
-# Copyright (C) 2009  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_SILENT_RULES([DEFAULT])
-# --------------------------
-# Enable less verbose build rules; with the default set to DEFAULT
-# (`yes' being less verbose, `no' or empty being verbose).
-AC_DEFUN([AM_SILENT_RULES],
-[AC_ARG_ENABLE([silent-rules],
-[  --enable-silent-rules          less verbose build output (undo: `make V=1')
-  --disable-silent-rules         verbose build output (undo: `make V=0')])
-case $enable_silent_rules in
-yes) AM_DEFAULT_VERBOSITY=0;;
-no)  AM_DEFAULT_VERBOSITY=1;;
-*)   AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
-esac
-AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
-AM_BACKSLASH='\'
-AC_SUBST([AM_BACKSLASH])dnl
-_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
-])
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_INSTALL_STRIP
-# ---------------------
-# One issue with vendor `install' (even GNU) is that you can't
-# specify the program used to strip binaries.  This is especially
-# annoying in cross-compiling environments, where the build's strip
-# is unlikely to handle the host's binaries.
-# Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in `make install-strip', and initialize
-# STRIPPROG with the value of the STRIP variable (set by the user).
-AC_DEFUN([AM_PROG_INSTALL_STRIP],
-[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
-if test "$cross_compiling" != no; then
-  AC_CHECK_TOOL([STRIP], [strip], :)
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-AC_SUBST([INSTALL_STRIP_PROGRAM])])
-
-# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# _AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
-# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
-# This macro is traced by Automake.
-AC_DEFUN([_AM_SUBST_NOTMAKE])
-
-# AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
-# Public sister of _AM_SUBST_NOTMAKE.
-AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
-
-# Check how to create a tarball.                            -*- Autoconf -*-
-
-# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# _AM_PROG_TAR(FORMAT)
-# --------------------
-# Check how to create a tarball in format FORMAT.
-# FORMAT should be one of `v7', `ustar', or `pax'.
-#
-# Substitute a variable $(am__tar) that is a command
-# writing to stdout a FORMAT-tarball containing the directory
-# $tardir.
-#     tardir=directory && $(am__tar) > result.tar
-#
-# Substitute a variable $(am__untar) that extract such
-# a tarball read from stdin.
-#     $(am__untar) < result.tar
-AC_DEFUN([_AM_PROG_TAR],
-[# Always define AMTAR for backward compatibility.
-AM_MISSING_PROG([AMTAR], [tar])
-m4_if([$1], [v7],
-     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
-     [m4_case([$1], [ustar],, [pax],,
-              [m4_fatal([Unknown tar format])])
-AC_MSG_CHECKING([how to create a $1 tar archive])
-# Loop over all known methods to create a tar archive until one works.
-_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
-_am_tools=${am_cv_prog_tar_$1-$_am_tools}
-# Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of `-'.
-for _am_tool in $_am_tools
-do
-  case $_am_tool in
-  gnutar)
-    for _am_tar in tar gnutar gtar;
-    do
-      AM_RUN_LOG([$_am_tar --version]) && break
-    done
-    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
-    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
-    am__untar="$_am_tar -xf -"
-    ;;
-  plaintar)
-    # Must skip GNU tar: if it does not support --format= it doesn't create
-    # ustar tarball either.
-    (tar --version) >/dev/null 2>&1 && continue
-    am__tar='tar chf - "$$tardir"'
-    am__tar_='tar chf - "$tardir"'
-    am__untar='tar xf -'
-    ;;
-  pax)
-    am__tar='pax -L -x $1 -w "$$tardir"'
-    am__tar_='pax -L -x $1 -w "$tardir"'
-    am__untar='pax -r'
-    ;;
-  cpio)
-    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
-    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
-    am__untar='cpio -i -H $1 -d'
-    ;;
-  none)
-    am__tar=false
-    am__tar_=false
-    am__untar=false
-    ;;
-  esac
-
-  # If the value was cached, stop now.  We just wanted to have am__tar
-  # and am__untar set.
-  test -n "${am_cv_prog_tar_$1}" && break
-
-  # tar/untar a dummy directory, and stop if the command works
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  echo GrepMe > conftest.dir/file
-  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
-  rm -rf conftest.dir
-  if test -s conftest.tar; then
-    AM_RUN_LOG([$am__untar <conftest.tar])
-    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
-  fi
-done
-rm -rf conftest.dir
-
-AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
-AC_MSG_RESULT([$am_cv_prog_tar_$1])])
-AC_SUBST([am__tar])
-AC_SUBST([am__untar])
-]) # _AM_PROG_TAR
-
-m4_include([m4/ax_cc_maxopt.m4])
-m4_include([m4/ax_cflags_warn_all.m4])
-m4_include([m4/ax_check_compiler_flags.m4])
-m4_include([m4/ax_compiler_vendor.m4])
-m4_include([m4/ax_create_pkgconfig_info.m4])
-m4_include([m4/ax_gcc_archflag.m4])
-m4_include([m4/ax_gcc_x86_cpuid.m4])
-m4_include([m4/ax_submodule.m4])
-m4_include([m4/libtool.m4])
-m4_include([m4/ltoptions.m4])
-m4_include([m4/ltsugar.m4])
-m4_include([m4/ltversion.m4])
-m4_include([m4/lt~obsolete.m4])
diff --git a/cloog-0.17.0/autoconf/Doxyfile.in b/cloog-0.17.0/autoconf/Doxyfile.in
deleted file mode 100644
index fa02ac7..0000000
--- a/cloog-0.17.0/autoconf/Doxyfile.in
+++ /dev/null
@@ -1,1101 +0,0 @@
-# Doxyfile 1.3.5
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
-#
-# All text after a hash (#) is considered a comment and will be ignored
-# The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
-# by quotes) that should identify the project.
-
-PROJECT_NAME           = CLooG
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
-# This could be handy for archiving the generated documentation or 
-# if some version control system is used.
-
-PROJECT_NUMBER         = @RELEASE@
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
-# base path where the generated documentation will be put. 
-# If a relative path is entered, it will be relative to the location 
-# where doxygen was started. If left blank the current directory will be used.
-
-OUTPUT_DIRECTORY       = doc/source
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
-# documentation generated by doxygen is written. Doxygen will use this 
-# information to generate all constant output in the proper language. 
-# The default language is English, other supported languages are: 
-# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, 
-# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en 
-# (Japanese with English messages), Korean, Norwegian, Polish, Portuguese, 
-# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
-
-OUTPUT_LANGUAGE        = English
-
-# This tag can be used to specify the encoding used in the generated output. 
-# The encoding is not always determined by the language that is chosen, 
-# but also whether or not the output is meant for Windows or non-Windows users. 
-# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES 
-# forces the Windows encoding (this is the default for the Windows binary), 
-# whereas setting the tag to NO uses a Unix-style encoding (the default for 
-# all platforms other than Windows).
-
-USE_WINDOWS_ENCODING   = NO
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
-# include brief member descriptions after the members that are listed in 
-# the file and class documentation (similar to JavaDoc). 
-# Set to NO to disable this.
-
-BRIEF_MEMBER_DESC      = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
-# the brief description of a member or function before the detailed description. 
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
-# brief descriptions will be completely suppressed.
-
-REPEAT_BRIEF           = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator 
-# that is used to form the text in various listings. Each string 
-# in this list, if found as the leading text of the brief description, will be 
-# stripped from the text and the result after processing the whole list, is used 
-# as the annotated text. Otherwise, the brief description is used as-is. If left 
-# blank, the following values are used ("$name" is automatically replaced with the 
-# name of the entity): "The $name class" "The $name widget" "The $name file" 
-# "is" "provides" "specifies" "contains" "represents" "a" "an" "the"
-
-ABBREVIATE_BRIEF       = 
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
-# Doxygen will generate a detailed section even if there is only a brief 
-# description.
-
-ALWAYS_DETAILED_SEC    = YES
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited 
-# members of a class in the documentation of that class as if those members were 
-# ordinary class members. Constructors, destructors and assignment operators of 
-# the base classes will not be shown.
-
-INLINE_INHERITED_MEMB  = YES
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
-# path before files name in the file list and in the header files. If set 
-# to NO the shortest path that makes the file name unique will be used.
-
-FULL_PATH_NAMES        = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
-# can be used to strip a user-defined part of the path. Stripping is 
-# only done if one of the specified strings matches the left-hand part of 
-# the path. It is allowed to use relative paths in the argument list.
-
-STRIP_FROM_PATH        = 
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
-# (but less readable) file names. This can be useful is your file systems 
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
-SHORT_NAMES            = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
-# will interpret the first line (until the first dot) of a JavaDoc-style 
-# comment as the brief description. If set to NO, the JavaDoc 
-# comments will behave just like the Qt-style comments (thus requiring an 
-# explicit @brief command for a brief description.
-
-JAVADOC_AUTOBRIEF      = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
-# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
-# comments) as a brief description. This used to be the default behaviour. 
-# The new default is to treat a multi-line C++ comment block as a detailed 
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
-MULTILINE_CPP_IS_BRIEF = NO
-
-# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
-# will output the detailed description near the top, like JavaDoc.
-# If set to NO, the detailed description appears after the member 
-# documentation.
-
-DETAILS_AT_TOP         = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
-# member inherits the documentation from any documented member that it 
-# re-implements.
-
-INHERIT_DOCS           = YES
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
-# tag is set to YES, then doxygen will reuse the documentation of the first 
-# member in the group (if any) for the other members of the group. By default 
-# all members of a group must be documented explicitly.
-
-DISTRIBUTE_GROUP_DOC   = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
-TAB_SIZE               = 8
-
-# This tag can be used to specify a number of aliases that acts 
-# as commands in the documentation. An alias has the form "name=value". 
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
-# put the command \sideeffect (or @sideeffect) in the documentation, which 
-# will result in a user-defined paragraph with heading "Side Effects:". 
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES                = 
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources 
-# only. Doxygen will then generate output that is more tailored for C. 
-# For instance, some of the names that are used will be different. The list 
-# of all members will be omitted, etc.
-
-OPTIMIZE_OUTPUT_FOR_C  = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources 
-# only. Doxygen will then generate output that is more tailored for Java. 
-# For instance, namespaces will be presented as packages, qualified scopes 
-# will look different, etc.
-
-OPTIMIZE_OUTPUT_JAVA   = NO
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
-# the same type (for instance a group of public functions) to be put as a 
-# subgroup of that type (e.g. under the Public Functions section). Set it to 
-# NO to prevent subgrouping. Alternatively, this can be done per class using 
-# the \nosubgrouping command.
-
-SUBGROUPING            = YES
-
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
-# documentation are documented, even if no documentation was available. 
-# Private class members and static file members will be hidden unless 
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
-EXTRACT_ALL            = YES
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
-# will be included in the documentation.
-
-EXTRACT_PRIVATE        = YES
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file 
-# will be included in the documentation.
-
-EXTRACT_STATIC         = YES
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
-# defined locally in source files will be included in the documentation. 
-# If set to NO only classes defined in header files are included.
-
-EXTRACT_LOCAL_CLASSES  = YES
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
-# undocumented members of documented classes, files or namespaces. 
-# If set to NO (the default) these members will be included in the 
-# various overviews, but no documentation section is generated. 
-# This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_MEMBERS     = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
-# undocumented classes that are normally visible in the class hierarchy. 
-# If set to NO (the default) these classes will be included in the various 
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_CLASSES     = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
-# friend (class|struct|union) declarations. 
-# If set to NO (the default) these declarations will be included in the 
-# documentation.
-
-HIDE_FRIEND_COMPOUNDS  = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
-# documentation blocks found inside the body of a function. 
-# If set to NO (the default) these blocks will be appended to the 
-# function's detailed documentation block.
-
-HIDE_IN_BODY_DOCS      = NO
-
-# The INTERNAL_DOCS tag determines if documentation 
-# that is typed after a \internal command is included. If the tag is set 
-# to NO (the default) then the documentation will be excluded. 
-# Set it to YES to include the internal documentation.
-
-INTERNAL_DOCS          = NO
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
-# file names in lower-case letters. If set to YES upper-case letters are also 
-# allowed. This is useful if you have classes or files whose names only differ 
-# in case and if your file system supports case sensitive file names. Windows 
-# users are advised to set this option to NO.
-
-CASE_SENSE_NAMES       = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
-# will show members with their full class and namespace scopes in the 
-# documentation. If set to YES the scope will be hidden.
-
-HIDE_SCOPE_NAMES       = NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
-# will put a list of the files that are included by a file in the documentation 
-# of that file.
-
-SHOW_INCLUDE_FILES     = YES
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
-# is inserted in the documentation for inline members.
-
-INLINE_INFO            = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
-# will sort the (detailed) documentation of file and class members 
-# alphabetically by member name. If set to NO the members will appear in 
-# declaration order.
-
-SORT_MEMBER_DOCS       = YES
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or 
-# disable (NO) the todo list. This list is created by putting \todo 
-# commands in the documentation.
-
-GENERATE_TODOLIST      = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or 
-# disable (NO) the test list. This list is created by putting \test 
-# commands in the documentation.
-
-GENERATE_TESTLIST      = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or 
-# disable (NO) the bug list. This list is created by putting \bug 
-# commands in the documentation.
-
-GENERATE_BUGLIST       = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
-# disable (NO) the deprecated list. This list is created by putting 
-# \deprecated commands in the documentation.
-
-GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional 
-# documentation sections, marked by \if sectionname ... \endif.
-
-ENABLED_SECTIONS       = 
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
-# the initial value of a variable or define consists of for it to appear in 
-# the documentation. If the initializer consists of more lines than specified 
-# here it will be hidden. Use a value of 0 to hide initializers completely. 
-# The appearance of the initializer of individual variables and defines in the 
-# documentation can be controlled using \showinitializer or \hideinitializer 
-# command in the documentation regardless of this setting.
-
-MAX_INITIALIZER_LINES  = 30
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
-# at the bottom of the documentation of classes and structs. If set to YES the 
-# list will mention the files that were used to generate the documentation.
-
-SHOW_USED_FILES        = YES
-
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated 
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
-QUIET                  = YES
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are 
-# generated by doxygen. Possible values are YES and NO. If left blank 
-# NO is used.
-
-WARNINGS               = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
-# automatically be disabled.
-
-WARN_IF_UNDOCUMENTED   = YES
-
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
-# potential errors in the documentation, such as not documenting some 
-# parameters in a documented function, or documenting parameters that 
-# don't exist or using markup commands wrongly.
-
-WARN_IF_DOC_ERROR      = YES
-
-# The WARN_FORMAT tag determines the format of the warning messages that 
-# doxygen can produce. The string should contain the $file, $line, and $text 
-# tags, which will be replaced by the file and line number from which the 
-# warning originated and the warning text.
-
-WARN_FORMAT            = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning 
-# and error messages should be written. If left blank the output is written 
-# to stderr.
-
-WARN_LOGFILE           =
-#WARN_LOGFILE           = doc/doxygen.log
-
-
-#---------------------------------------------------------------------------
-# configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain 
-# documented source files. You may enter file names like "myfile.cpp" or 
-# directories like "/usr/src/myproject". Separate the files or directories 
-# with spaces.
-
-INPUT                  = source \
-                         include/cloog
-
-# If the value of the INPUT tag contains directories, you can use the 
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank the following patterns are tested: 
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp 
-# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc
-
-FILE_PATTERNS          = 
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
-# should be searched for input files as well. Possible values are YES and NO. 
-# If left blank NO is used.
-
-RECURSIVE              = NO
-
-# The EXCLUDE tag can be used to specify files and/or directories that should 
-# excluded from the INPUT source files. This way you can easily exclude a 
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-
-EXCLUDE                = 
-
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories 
-# that are symbolic links (a Unix filesystem feature) are excluded from the input.
-
-EXCLUDE_SYMLINKS       = NO
-
-# If the value of the INPUT tag contains directories, you can use the 
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
-# certain files from those directories.
-
-EXCLUDE_PATTERNS       = 
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or 
-# directories that contain example code fragments that are included (see 
-# the \include command).
-
-EXAMPLE_PATH           = 
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank all files are included.
-
-EXAMPLE_PATTERNS       = 
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
-# searched for input files to be used with the \include or \dontinclude 
-# commands irrespective of the value of the RECURSIVE tag. 
-# Possible values are YES and NO. If left blank NO is used.
-
-EXAMPLE_RECURSIVE      = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or 
-# directories that contain image that are included in the documentation (see 
-# the \image command).
-
-IMAGE_PATH             = 
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should 
-# invoke to filter for each input file. Doxygen will invoke the filter program 
-# by executing (via popen()) the command <filter> <input-file>, where <filter> 
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
-# input file. Doxygen will then use the output that the filter program writes 
-# to standard output.
-
-INPUT_FILTER           = 
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
-# INPUT_FILTER) will be used to filter the input files when producing source 
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-
-FILTER_SOURCE_FILES    = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to source browsing
-#---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
-# be generated. Documented entities will be cross-referenced with these sources. 
-# Note: To get rid of all source code in the generated output, make sure also 
-# VERBATIM_HEADERS is set to NO.
-
-SOURCE_BROWSER         = NO
-
-# Setting the INLINE_SOURCES tag to YES will include the body 
-# of functions and classes directly in the documentation.
-
-INLINE_SOURCES         = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
-# doxygen to hide any special comment blocks from generated source code 
-# fragments. Normal C and C++ comments will always remain visible.
-
-STRIP_CODE_COMMENTS    = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES (the default) 
-# then for each documented function all documented 
-# functions referencing it will be listed.
-
-REFERENCED_BY_RELATION = YES
-
-# If the REFERENCES_RELATION tag is set to YES (the default) 
-# then for each documented function all documented entities 
-# called/used by that function will be listed.
-
-REFERENCES_RELATION    = YES
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
-# will generate a verbatim copy of the header file for each class for 
-# which an include is specified. Set to NO to disable this.
-
-VERBATIM_HEADERS       = YES
-
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
-# of all compounds will be generated. Enable this if the project 
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX     = NO
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
-# in which this list will be split (can be a number in the range [1..20])
-
-COLS_IN_ALPHA_INDEX    = 5
-
-# In case all classes in a project start with a common prefix, all 
-# classes will be put under the same header in the alphabetical index. 
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
-# should be ignored while generating the index headers.
-
-IGNORE_PREFIX          = 
-
-#---------------------------------------------------------------------------
-# configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
-# generate HTML output.
-
-GENERATE_HTML          = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT            = html
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
-# doxygen will generate files with .html extension.
-
-HTML_FILE_EXTENSION    = .html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard header.
-
-HTML_HEADER            = 
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard footer.
-
-HTML_FOOTER            = 
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
-# style sheet that is used by each HTML page. It can be used to 
-# fine-tune the look of the HTML output. If the tag is left blank doxygen 
-# will generate a default style sheet. Note that doxygen will try to copy 
-# the style sheet file to the HTML output directory, so don't put your own 
-# stylesheet in the HTML output directory as well, or it will be erased!
-
-HTML_STYLESHEET        = 
-
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
-# files or namespaces will be aligned in HTML using tables. If set to 
-# NO a bullet list will be used.
-
-HTML_ALIGN_MEMBERS     = YES
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
-# will be generated that can be used as input for tools like the 
-# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) 
-# of the generated HTML documentation.
-
-GENERATE_HTMLHELP      = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
-# be used to specify the file name of the resulting .chm file. You 
-# can add a path in front of the file if the result should not be 
-# written to the html output directory.
-
-CHM_FILE               = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
-# be used to specify the location (absolute path including file name) of 
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
-# the HTML help compiler on the generated index.hhp.
-
-HHC_LOCATION           = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
-# controls if a separate .chi index file is generated (YES) or that 
-# it should be included in the master .chm file (NO).
-
-GENERATE_CHI           = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
-# controls whether a binary table of contents is generated (YES) or a 
-# normal table of contents (NO) in the .chm file.
-
-BINARY_TOC             = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members 
-# to the contents of the HTML help documentation and to the tree view.
-
-TOC_EXPAND             = NO
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
-# top of each HTML page. The value NO (the default) enables the index and 
-# the value YES disables it.
-
-DISABLE_INDEX          = NO
-
-# This tag can be used to set the number of enum values (range [1..20]) 
-# that doxygen will group on one line in the generated HTML documentation.
-
-ENUM_VALUES_PER_LINE   = 4
-
-# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
-# generated containing a tree-like index structure (just like the one that 
-# is generated for HTML Help). For this to work a browser that supports 
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
-# probably better off using the HTML help feature.
-
-GENERATE_TREEVIEW      = NO
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
-# used to set the initial width (in pixels) of the frame in which the tree 
-# is shown.
-
-TREEVIEW_WIDTH         = 250
-
-#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
-# generate Latex output.
-
-GENERATE_LATEX         = YES
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `latex' will be used as the default path.
-
-LATEX_OUTPUT           = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
-# invoked. If left blank `latex' will be used as the default command name.
-
-LATEX_CMD_NAME         = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
-# generate index for LaTeX. If left blank `makeindex' will be used as the 
-# default command name.
-
-MAKEINDEX_CMD_NAME     = makeindex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
-# LaTeX documents. This may be useful for small projects and may help to 
-# save some trees in general.
-
-COMPACT_LATEX          = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used 
-# by the printer. Possible values are: a4, a4wide, letter, legal and 
-# executive. If left blank a4wide will be used.
-
-PAPER_TYPE             = a4wide
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
-# packages that should be included in the LaTeX output.
-
-EXTRA_PACKAGES         = 
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
-# the generated latex document. The header should contain everything until 
-# the first chapter. If it is left blank doxygen will generate a 
-# standard header. Notice: only use this tag if you know what you are doing!
-
-LATEX_HEADER           = 
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
-# contain links (just like the HTML output) instead of page references 
-# This makes the output suitable for online browsing using a pdf viewer.
-
-PDF_HYPERLINKS         = NO
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
-# plain latex in the generated Makefile. Set this option to YES to get a 
-# higher quality PDF documentation.
-
-USE_PDFLATEX           = NO
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
-# command to the generated LaTeX files. This will instruct LaTeX to keep 
-# running if errors occur, instead of asking the user for help. 
-# This option is also used when generating formulas in HTML.
-
-LATEX_BATCHMODE        = NO
-
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
-# include the index chapters (such as File Index, Compound Index, etc.) 
-# in the output.
-
-LATEX_HIDE_INDICES     = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the RTF output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
-# The RTF output is optimized for Word 97 and may not look very pretty with 
-# other RTF readers or editors.
-
-GENERATE_RTF           = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `rtf' will be used as the default path.
-
-RTF_OUTPUT             = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
-# RTF documents. This may be useful for small projects and may help to 
-# save some trees in general.
-
-COMPACT_RTF            = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
-# will contain hyperlink fields. The RTF file will 
-# contain links (just like the HTML output) instead of page references. 
-# This makes the output suitable for online browsing using WORD or other 
-# programs which support those fields. 
-# Note: wordpad (write) and others do not support links.
-
-RTF_HYPERLINKS         = NO
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's 
-# config file, i.e. a series of assignments. You only have to provide 
-# replacements, missing definitions are set to their default value.
-
-RTF_STYLESHEET_FILE    = 
-
-# Set optional variables used in the generation of an rtf document. 
-# Syntax is similar to doxygen's config file.
-
-RTF_EXTENSIONS_FILE    = 
-
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
-# generate man pages
-
-GENERATE_MAN           = YES
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `man' will be used as the default path.
-
-MAN_OUTPUT             = man
-
-# The MAN_EXTENSION tag determines the extension that is added to 
-# the generated man pages (default is the subroutine's section .3)
-
-MAN_EXTENSION          = .3
-
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
-# then it will generate one additional man file for each entity 
-# documented in the real man page(s). These additional files 
-# only source the real man page, but without them the man command 
-# would be unable to find the correct page. The default is NO.
-
-MAN_LINKS              = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will 
-# generate an XML file that captures the structure of 
-# the code including all documentation.
-
-GENERATE_XML           = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `xml' will be used as the default path.
-
-XML_OUTPUT             = xml
-
-# The XML_SCHEMA tag can be used to specify an XML schema, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
-
-XML_SCHEMA             = 
-
-# The XML_DTD tag can be used to specify an XML DTD, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
-
-XML_DTD                = 
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
-# dump the program listings (including syntax highlighting 
-# and cross-referencing information) to the XML output. Note that 
-# enabling this will significantly increase the size of the XML output.
-
-XML_PROGRAMLISTING     = YES
-
-#---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
-# generate an AutoGen Definitions (see autogen.sf.net) file 
-# that captures the structure of the code including all 
-# documentation. Note that this feature is still experimental 
-# and incomplete at the moment.
-
-GENERATE_AUTOGEN_DEF   = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the Perl module output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
-# generate a Perl module file that captures the structure of 
-# the code including all documentation. Note that this 
-# feature is still experimental and incomplete at the 
-# moment.
-
-GENERATE_PERLMOD       = NO
-
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
-# to generate PDF and DVI output from the Perl module output.
-
-PERLMOD_LATEX          = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
-# nicely formatted so it can be parsed by a human reader.  This is useful 
-# if you want to understand what is going on.  On the other hand, if this 
-# tag is set to NO the size of the Perl module output will be much smaller 
-# and Perl will parse it just the same.
-
-PERLMOD_PRETTY         = YES
-
-# The names of the make variables in the generated doxyrules.make file 
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
-# This is useful so different doxyrules.make files included by the same 
-# Makefile don't overwrite each other's variables.
-
-PERLMOD_MAKEVAR_PREFIX = 
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor   
-#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
-# evaluate all C-preprocessor directives found in the sources and include 
-# files.
-
-ENABLE_PREPROCESSING   = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
-# names in the source code. If set to NO (the default) only conditional 
-# compilation will be performed. Macro expansion can be done in a controlled 
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
-MACRO_EXPANSION        = NO
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
-# then the macro expansion is limited to the macros specified with the 
-# PREDEFINED and EXPAND_AS_PREDEFINED tags.
-
-EXPAND_ONLY_PREDEF     = NO
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
-
-SEARCH_INCLUDES        = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that 
-# contain include files that are not input files but should be processed by 
-# the preprocessor.
-
-INCLUDE_PATH           = 
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
-# patterns (like *.h and *.hpp) to filter out the header-files in the 
-# directories. If left blank, the patterns specified with FILE_PATTERNS will 
-# be used.
-
-INCLUDE_FILE_PATTERNS  = 
-
-# The PREDEFINED tag can be used to specify one or more macro names that 
-# are defined before the preprocessor is started (similar to the -D option of 
-# gcc). The argument of the tag is a list of macros of the form: name 
-# or name=definition (no spaces). If the definition and the = are 
-# omitted =1 is assumed.
-
-PREDEFINED             = 
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
-# this tag can be used to specify a list of macro names that should be expanded. 
-# The macro definition that is found in the sources will be used. 
-# Use the PREDEFINED tag if you want to use a different macro definition.
-
-EXPAND_AS_DEFINED      = 
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
-# doxygen's preprocessor will remove all function-like macros that are alone 
-# on a line, have an all uppercase name, and do not end with a semicolon. Such 
-# function macros are typically used for boiler-plate code, and will confuse the 
-# parser if not removed.
-
-SKIP_FUNCTION_MACROS   = YES
-
-#---------------------------------------------------------------------------
-# Configuration::addtions related to external references   
-#---------------------------------------------------------------------------
-
-# The TAGFILES option can be used to specify one or more tagfiles. 
-# Optionally an initial location of the external documentation 
-# can be added for each tagfile. The format of a tag file without 
-# this location is as follows: 
-#   TAGFILES = file1 file2 ... 
-# Adding location for the tag files is done as follows: 
-#   TAGFILES = file1=loc1 "file2 = loc2" ... 
-# where "loc1" and "loc2" can be relative or absolute paths or 
-# URLs. If a location is present for each tag, the installdox tool 
-# does not have to be run to correct the links.
-# Note that each tag file must have a unique name
-# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen 
-# is run, you must also specify the path to the tagfile here.
-
-TAGFILES               = 
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE       = 
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
-# in the class index. If set to NO only the inherited external classes 
-# will be listed.
-
-ALLEXTERNALS           = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
-# in the modules index. If set to NO, only the current project's groups will 
-# be listed.
-
-EXTERNAL_GROUPS        = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script 
-# interpreter (i.e. the result of `which perl').
-
-PERL_PATH              = /usr/bin/perl
-
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool   
-#---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or 
-# super classes. Setting the tag to NO turns the diagrams off. Note that this 
-# option is superseded by the HAVE_DOT option below. This is only a fallback. It is 
-# recommended to install and use dot, since it yields more powerful graphs.
-
-CLASS_DIAGRAMS         = YES
-
-# If set to YES, the inheritance and collaboration graphs will hide 
-# inheritance and usage relations if the target is undocumented 
-# or is not a class.
-
-HIDE_UNDOC_RELATIONS   = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
-# available from the path. This tool is part of Graphviz, a graph visualization 
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
-# have no effect if this option is set to NO (the default)
-
-HAVE_DOT               = YES
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect inheritance relations. Setting this tag to YES will force the 
-# the CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH            = YES
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect implementation dependencies (inheritance, containment, and 
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH    = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
-# collaboration diagrams in a style similar to the OMG's Unified Modeling 
-# Language.
-
-UML_LOOK               = NO
-
-# If set to YES, the inheritance and collaboration graphs will show the 
-# relations between templates and their instances.
-
-TEMPLATE_RELATIONS     = NO
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
-# tags are set to YES then doxygen will generate a graph for each documented 
-# file showing the direct and indirect include dependencies of the file with 
-# other documented files.
-
-INCLUDE_GRAPH          = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
-# documented header file showing the documented files that directly or 
-# indirectly include this file.
-
-INCLUDED_BY_GRAPH      = YES
-
-# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will 
-# generate a call dependency graph for every global function or class method. 
-# Note that enabling this option will significantly increase the time of a run. 
-# So in most cases it will be better to enable call graphs for selected 
-# functions only using the \callgraph command.
-
-CALL_GRAPH             = NO
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
-# will graphical hierarchy of all classes instead of a textual one.
-
-GRAPHICAL_HIERARCHY    = YES
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
-# generated by dot. Possible values are png, jpg, or gif
-# If left blank png will be used.
-
-DOT_IMAGE_FORMAT       = png
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be 
-# found. If left blank, it is assumed the dot tool can be found on the path.
-
-DOT_PATH               = /usr/bin/
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that 
-# contain dot files that are included in the documentation (see the 
-# \dotfile command).
-
-# DOTFILE_DIRS           = src
-
-# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width 
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
-# this value, doxygen will try to truncate the graph, so that it fits within 
-# the specified constraint. Beware that most browsers cannot cope with very 
-# large images.
-
-MAX_DOT_GRAPH_WIDTH    = 1024
-
-# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height 
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
-# this value, doxygen will try to truncate the graph, so that it fits within 
-# the specified constraint. Beware that most browsers cannot cope with very 
-# large images.
-
-MAX_DOT_GRAPH_HEIGHT   = 1024
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
-# graphs generated by dot. A depth value of 3 means that only nodes reachable 
-# from the root by following a path via at most 3 edges will be shown. Nodes that 
-# lay further from the root node will be omitted. Note that setting this option to 
-# 1 or 2 may greatly reduce the computation time needed for large code bases. Also 
-# note that a graph may be further truncated if the graph's image dimensions are 
-# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). 
-# If 0 is used for the depth value (the default), the graph is not depth-constrained.
-
-MAX_DOT_GRAPH_DEPTH    = 0
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
-# generate a legend page explaining the meaning of the various boxes and 
-# arrows in the dot generated graphs.
-
-GENERATE_LEGEND        = YES
-
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
-# remove the intermediate dot files that are used to generate 
-# the various graphs.
-
-DOT_CLEANUP            = YES
-
-#---------------------------------------------------------------------------
-# Configuration::addtions related to the search engine   
-#---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be 
-# used. If set to NO the values of all tags below this one will be ignored.
-
-SEARCHENGINE           = NO
diff --git a/cloog-0.17.0/autoconf/config.guess b/cloog-0.17.0/autoconf/config.guess
deleted file mode 100755
index c2246a4..0000000
--- a/cloog-0.17.0/autoconf/config.guess
+++ /dev/null
@@ -1,1502 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-#   Free Software Foundation, Inc.
-
-timestamp='2009-12-30'
-
-# 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
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner.  Please send patches (context
-# diff format) to <config-patches@gnu.org> and include a ChangeLog
-# entry.
-#
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
-#
-# 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
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help" >&2
-       exit 1 ;;
-    * )
-       break ;;
-  esac
-done
-
-if test $# != 0; then
-  echo "$me: too many arguments$help" >&2
-  exit 1
-fi
-
-trap 'exit 1' 1 2 15
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
-
-set_cc_for_build='
-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
-: ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
-dummy=$tmp/dummy ;
-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
-case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,)    echo "int x;" > $dummy.c ;
-	for c in cc gcc c89 c99 ; do
-	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
-	     CC_FOR_BUILD="$c"; break ;
-	  fi ;
-	done ;
-	if test x"$CC_FOR_BUILD" = x ; then
-	  CC_FOR_BUILD=no_compiler_found ;
-	fi
-	;;
- ,,*)   CC_FOR_BUILD=$CC ;;
- ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
-esac ; set_cc_for_build= ;'
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
-	PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
-    *:NetBSD:*:*)
-	# NetBSD (nbsd) targets should (where applicable) match one or
-	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
-	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
-	# switched to ELF, *-*-netbsd* would select the old
-	# object file format.  This provides both forward
-	# compatibility and a consistent mechanism for selecting the
-	# object file format.
-	#
-	# Note: NetBSD doesn't particularly care about the vendor
-	# portion of the name.  We always set it to "unknown".
-	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
-	case "${UNAME_MACHINE_ARCH}" in
-	    armeb) machine=armeb-unknown ;;
-	    arm*) machine=arm-unknown ;;
-	    sh3el) machine=shl-unknown ;;
-	    sh3eb) machine=sh-unknown ;;
-	    sh5el) machine=sh5le-unknown ;;
-	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
-	esac
-	# The Operating System including object format, if it has switched
-	# to ELF recently, or will in the future.
-	case "${UNAME_MACHINE_ARCH}" in
-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
-		eval $set_cc_for_build
-		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
-			| grep -q __ELF__
-		then
-		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
-		    # Return netbsd for either.  FIX?
-		    os=netbsd
-		else
-		    os=netbsdelf
-		fi
-		;;
-	    *)
-	        os=netbsd
-		;;
-	esac
-	# The OS release
-	# Debian GNU/NetBSD machines have a different userland, and
-	# thus, need a distinct triplet. However, they do not need
-	# kernel version information, so it can be replaced with a
-	# suitable tag, in the style of linux-gnu.
-	case "${UNAME_VERSION}" in
-	    Debian*)
-		release='-gnu'
-		;;
-	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
-		;;
-	esac
-	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
-	# contains redundant information, the shorter form:
-	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
-	exit ;;
-    *:OpenBSD:*:*)
-	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
-	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
-	exit ;;
-    *:ekkoBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
-	exit ;;
-    *:SolidBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
-	exit ;;
-    macppc:MirBSD:*:*)
-	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    *:MirBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    alpha:OSF1:*:*)
-	case $UNAME_RELEASE in
-	*4.0)
-		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
-		;;
-	*5.*)
-	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
-		;;
-	esac
-	# According to Compaq, /usr/sbin/psrinfo has been available on
-	# OSF/1 and Tru64 systems produced since 1995.  I hope that
-	# covers most systems running today.  This code pipes the CPU
-	# types through head -n 1, so we only detect the type of CPU 0.
-	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" ;;
-	    "EV4.5 (21064)")
-		UNAME_MACHINE="alpha" ;;
-	    "LCA4 (21066/21068)")
-		UNAME_MACHINE="alpha" ;;
-	    "EV5 (21164)")
-		UNAME_MACHINE="alphaev5" ;;
-	    "EV5.6 (21164A)")
-		UNAME_MACHINE="alphaev56" ;;
-	    "EV5.6 (21164PC)")
-		UNAME_MACHINE="alphapca56" ;;
-	    "EV5.7 (21164PC)")
-		UNAME_MACHINE="alphapca57" ;;
-	    "EV6 (21264)")
-		UNAME_MACHINE="alphaev6" ;;
-	    "EV6.7 (21264A)")
-		UNAME_MACHINE="alphaev67" ;;
-	    "EV6.8CB (21264C)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8AL (21264B)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8CX (21264D)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.9A (21264/EV69A)")
-		UNAME_MACHINE="alphaev69" ;;
-	    "EV7 (21364)")
-		UNAME_MACHINE="alphaev7" ;;
-	    "EV7.9 (21364A)")
-		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'`
-	exit ;;
-    Alpha\ *:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# Should we change UNAME_MACHINE based on the output of uname instead
-	# of the specific Alpha model?
-	echo alpha-pc-interix
-	exit ;;
-    21064:Windows_NT:50:3)
-	echo alpha-dec-winnt3.5
-	exit ;;
-    Amiga*:UNIX_System_V:4.0:*)
-	echo m68k-unknown-sysv4
-	exit ;;
-    *:[Aa]miga[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-amigaos
-	exit ;;
-    *:[Mm]orph[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-morphos
-	exit ;;
-    *:OS/390:*:*)
-	echo i370-ibm-openedition
-	exit ;;
-    *:z/VM:*:*)
-	echo s390-ibm-zvmoe
-	exit ;;
-    *:OS400:*:*)
-        echo powerpc-ibm-os400
-	exit ;;
-    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
-	echo arm-acorn-riscix${UNAME_RELEASE}
-	exit ;;
-    arm:riscos:*:*|arm:RISCOS:*:*)
-	echo arm-unknown-riscos
-	exit ;;
-    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
-	echo hppa1.1-hitachi-hiuxmpp
-	exit ;;
-    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
-	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
-	if test "`(/bin/universe) 2>/dev/null`" = att ; then
-		echo pyramid-pyramid-sysv3
-	else
-		echo pyramid-pyramid-bsd
-	fi
-	exit ;;
-    NILE*:*:*:dcosx)
-	echo pyramid-pyramid-svr4
-	exit ;;
-    DRS?6000:unix:4.0:6*)
-	echo sparc-icl-nx6
-	exit ;;
-    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
-	case `/usr/bin/uname -p` in
-	    sparc) echo sparc-icl-nx7; exit ;;
-	esac ;;
-    s390x:SunOS:*:*)
-	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4H:SunOS:5.*:*)
-	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
-	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
-	echo i386-pc-auroraux${UNAME_RELEASE}
-	exit ;;
-    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
-	eval $set_cc_for_build
-	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 (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
-		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		grep IS_64BIT_ARCH >/dev/null
-	    then
-		SUN_ARCH="x86_64"
-	    fi
-	fi
-	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:6*:*)
-	# According to config.sub, this is the proper way to canonicalize
-	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
-	# it's likely to be more like Solaris than SunOS4.
-	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:*:*)
-	case "`/usr/bin/arch -k`" in
-	    Series*|S4*)
-		UNAME_RELEASE=`uname -v`
-		;;
-	esac
-	# Japanese Language versions have a version number like `4.1.3-JL'.
-	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
-	exit ;;
-    sun3*:SunOS:*:*)
-	echo m68k-sun-sunos${UNAME_RELEASE}
-	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
-	case "`/bin/arch`" in
-	    sun3)
-		echo m68k-sun-sunos${UNAME_RELEASE}
-		;;
-	    sun4)
-		echo sparc-sun-sunos${UNAME_RELEASE}
-		;;
-	esac
-	exit ;;
-    aushp:SunOS:*:*)
-	echo sparc-auspex-sunos${UNAME_RELEASE}
-	exit ;;
-    # The situation for MiNT is a little confusing.  The machine name
-    # can be virtually everything (everything which is not
-    # "atarist" or "atariste" at least should have a processor
-    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
-    # to the lowercase version "mint" (or "freemint").  Finally
-    # the system name "TOS" denotes a system which is actually not
-    # MiNT.  But MiNT is downward compatible to TOS, so this should
-    # be no problem.
-    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
-	echo m68k-atari-mint${UNAME_RELEASE}
-        exit ;;
-    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-        echo m68k-milan-mint${UNAME_RELEASE}
-        exit ;;
-    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-        echo m68k-hades-mint${UNAME_RELEASE}
-        exit ;;
-    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-        echo m68k-unknown-mint${UNAME_RELEASE}
-        exit ;;
-    m68k:machten:*:*)
-	echo m68k-apple-machten${UNAME_RELEASE}
-	exit ;;
-    powerpc:machten:*:*)
-	echo powerpc-apple-machten${UNAME_RELEASE}
-	exit ;;
-    RISC*:Mach:*:*)
-	echo mips-dec-mach_bsd4.3
-	exit ;;
-    RISC*:ULTRIX:*:*)
-	echo mips-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    VAX*:ULTRIX*:*:*)
-	echo vax-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    2020:CLIX:*:* | 2430:CLIX:*:*)
-	echo clipper-intergraph-clix${UNAME_RELEASE}
-	exit ;;
-    mips:*:*:UMIPS | mips:*:*:RISCos)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-#ifdef __cplusplus
-#include <stdio.h>  /* for printf() prototype */
-	int main (int argc, char *argv[]) {
-#else
-	int main (argc, argv) int argc; char *argv[]; {
-#endif
-	#if defined (host_mips) && defined (MIPSEB)
-	#if defined (SYSTYPE_SYSV)
-	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_SVR4)
-	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
-	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
-	#endif
-	#endif
-	  exit (-1);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c &&
-	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
-	  SYSTEM_NAME=`$dummy $dummyarg` &&
-	    { echo "$SYSTEM_NAME"; exit; }
-	echo mips-mips-riscos${UNAME_RELEASE}
-	exit ;;
-    Motorola:PowerMAX_OS:*:*)
-	echo powerpc-motorola-powermax
-	exit ;;
-    Motorola:*:4.3:PL8-*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:Power_UNIX:*:*)
-	echo powerpc-harris-powerunix
-	exit ;;
-    m88k:CX/UX:7*:*)
-	echo m88k-harris-cxux7
-	exit ;;
-    m88k:*:4*:R4*)
-	echo m88k-motorola-sysv4
-	exit ;;
-    m88k:*:3*:R3*)
-	echo m88k-motorola-sysv3
-	exit ;;
-    AViiON:dgux:*:*)
-        # DG/UX returns AViiON for all architectures
-        UNAME_PROCESSOR=`/usr/bin/uname -p`
-	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
-	then
-	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
-	       [ ${TARGET_BINARY_INTERFACE}x = x ]
-	    then
-		echo m88k-dg-dgux${UNAME_RELEASE}
-	    else
-		echo m88k-dg-dguxbcs${UNAME_RELEASE}
-	    fi
-	else
-	    echo i586-dg-dgux${UNAME_RELEASE}
-	fi
- 	exit ;;
-    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
-	echo m88k-dolphin-sysv3
-	exit ;;
-    M88*:*:R3*:*)
-	# Delta 88k system running SVR3
-	echo m88k-motorola-sysv3
-	exit ;;
-    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
-	echo m88k-tektronix-sysv3
-	exit ;;
-    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
-	echo m68k-tektronix-bsd
-	exit ;;
-    *:IRIX*:*:*)
-	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
-	exit ;;
-    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
-	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
-    i*86:AIX:*:*)
-	echo i386-ibm-aix
-	exit ;;
-    ia64:AIX:*:*)
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:2:3)
-	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
-		eval $set_cc_for_build
-		sed 's/^		//' << EOF >$dummy.c
-		#include <sys/systemcfg.h>
-
-		main()
-			{
-			if (!__power_pc())
-				exit(1);
-			puts("powerpc-ibm-aix3.2.5");
-			exit(0);
-			}
-EOF
-		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
-		then
-			echo "$SYSTEM_NAME"
-		else
-			echo rs6000-ibm-aix3.2.5
-		fi
-	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
-		echo rs6000-ibm-aix3.2.4
-	else
-		echo rs6000-ibm-aix3.2
-	fi
-	exit ;;
-    *:AIX:*:[456])
-	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
-	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
-		IBM_ARCH=rs6000
-	else
-		IBM_ARCH=powerpc
-	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:*:*)
-	echo rs6000-ibm-aix
-	exit ;;
-    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
-	echo romp-ibm-bsd4.4
-	exit ;;
-    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
-	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
-	exit ;;                             # report: romp-ibm BSD 4.3
-    *:BOSX:*:*)
-	echo rs6000-bull-bosx
-	exit ;;
-    DPX/2?00:B.O.S.:*:*)
-	echo m68k-bull-sysv3
-	exit ;;
-    9000/[34]??:4.3bsd:1.*:*)
-	echo m68k-hp-bsd
-	exit ;;
-    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
-	echo m68k-hp-bsd4.4
-	exit ;;
-    9000/[34678]??:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	case "${UNAME_MACHINE}" in
-	    9000/31? )            HP_ARCH=m68000 ;;
-	    9000/[34]?? )         HP_ARCH=m68k ;;
-	    9000/[678][0-9][0-9])
-		if [ -x /usr/bin/getconf ]; then
-		    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
-                      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
-                        esac ;;
-                    esac
-		fi
-		if [ "${HP_ARCH}" = "" ]; then
-		    eval $set_cc_for_build
-		    sed 's/^              //' << EOF >$dummy.c
-
-              #define _HPUX_SOURCE
-              #include <stdlib.h>
-              #include <unistd.h>
-
-              int main ()
-              {
-              #if defined(_SC_KERNEL_BITS)
-                  long bits = sysconf(_SC_KERNEL_BITS);
-              #endif
-                  long cpu  = sysconf (_SC_CPU_VERSION);
-
-                  switch (cpu)
-              	{
-              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-              	case CPU_PA_RISC2_0:
-              #if defined(_SC_KERNEL_BITS)
-              	    switch (bits)
-              		{
-              		case 64: puts ("hppa2.0w"); break;
-              		case 32: puts ("hppa2.0n"); break;
-              		default: puts ("hppa2.0"); break;
-              		} break;
-              #else  /* !defined(_SC_KERNEL_BITS) */
-              	    puts ("hppa2.0"); break;
-              #endif
-              	default: puts ("hppa1.0"); break;
-              	}
-                  exit (0);
-              }
-EOF
-		    (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" ]
-	then
-	    eval $set_cc_for_build
-
-	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
-	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
-	    # generating 64-bit code.  GNU and HP use different nomenclature:
-	    #
-	    # $ CC_FOR_BUILD=cc ./config.guess
-	    # => hppa2.0w-hp-hpux11.23
-	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
-	    # => hppa64-hp-hpux11.23
-
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
-		grep -q __LP64__
-	    then
-		HP_ARCH="hppa2.0w"
-	    else
-		HP_ARCH="hppa64"
-	    fi
-	fi
-	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
-	exit ;;
-    ia64:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	echo ia64-hp-hpux${HPUX_REV}
-	exit ;;
-    3050*:HI-UX:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <unistd.h>
-	int
-	main ()
-	{
-	  long cpu = sysconf (_SC_CPU_VERSION);
-	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
-	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
-	     results, however.  */
-	  if (CPU_IS_PA_RISC (cpu))
-	    {
-	      switch (cpu)
-		{
-		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
-		  default: puts ("hppa-hitachi-hiuxwe2"); break;
-		}
-	    }
-	  else if (CPU_IS_HP_MC68K (cpu))
-	    puts ("m68k-hitachi-hiuxwe2");
-	  else puts ("unknown-hitachi-hiuxwe2");
-	  exit (0);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
-		{ echo "$SYSTEM_NAME"; exit; }
-	echo unknown-hitachi-hiuxwe2
-	exit ;;
-    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
-	echo hppa1.1-hp-bsd
-	exit ;;
-    9000/8??:4.3bsd:*:*)
-	echo hppa1.0-hp-bsd
-	exit ;;
-    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
-	echo hppa1.0-hp-mpeix
-	exit ;;
-    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
-	echo hppa1.1-hp-osf
-	exit ;;
-    hp8??:OSF1:*:*)
-	echo hppa1.0-hp-osf
-	exit ;;
-    i*86:OSF1:*:*)
-	if [ -x /usr/sbin/sysversion ] ; then
-	    echo ${UNAME_MACHINE}-unknown-osf1mk
-	else
-	    echo ${UNAME_MACHINE}-unknown-osf1
-	fi
-	exit ;;
-    parisc*:Lites*:*:*)
-	echo hppa1.1-hp-lites
-	exit ;;
-    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
-	echo c1-convex-bsd
-        exit ;;
-    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-        exit ;;
-    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
-	echo c34-convex-bsd
-        exit ;;
-    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
-	echo c38-convex-bsd
-        exit ;;
-    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
-	echo c4-convex-bsd
-        exit ;;
-    CRAY*Y-MP:*:*:*)
-	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*[A-Z]90:*:*:*)
-	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
-	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
-	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
-	      -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*TS:*:*:*)
-	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*T3E:*:*:*)
-	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*SV1:*:*:*)
-	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    *:UNICOS/mp:*:*)
-	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_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/ /_/'`
-        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-	exit ;;
-    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
-	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
-	exit ;;
-    sparc*:BSD/OS:*:*)
-	echo sparc-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:BSD/OS:*:*)
-	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:FreeBSD:*:*)
-	case ${UNAME_MACHINE} in
-	    pc98)
-		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    amd64)
-		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    *)
-		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	esac
-	exit ;;
-    i*:CYGWIN*:*)
-	echo ${UNAME_MACHINE}-pc-cygwin
-	exit ;;
-    *:MINGW*:*)
-	echo ${UNAME_MACHINE}-pc-mingw32
-	exit ;;
-    i*:windows32*:*)
-    	# uname -m includes "-pc" on this system.
-    	echo ${UNAME_MACHINE}-mingw32
-	exit ;;
-    i*:PW*:*)
-	echo ${UNAME_MACHINE}-pc-pw32
-	exit ;;
-    *:Interix*:*)
-    	case ${UNAME_MACHINE} in
-	    x86)
-		echo i586-pc-interix${UNAME_RELEASE}
-		exit ;;
-	    authenticamd | genuineintel | EM64T)
-		echo x86_64-unknown-interix${UNAME_RELEASE}
-		exit ;;
-	    IA64)
-		echo ia64-unknown-interix${UNAME_RELEASE}
-		exit ;;
-	esac ;;
-    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
-	echo i${UNAME_MACHINE}-pc-mks
-	exit ;;
-    8664:Windows_NT:*)
-	echo x86_64-pc-mks
-	exit ;;
-    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
-	# UNAME_MACHINE based on the output of uname instead of i386?
-	echo i586-pc-interix
-	exit ;;
-    i*:UWIN*:*)
-	echo ${UNAME_MACHINE}-pc-uwin
-	exit ;;
-    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
-	echo x86_64-unknown-cygwin
-	exit ;;
-    p*:CYGWIN*:*)
-	echo powerpcle-unknown-cygwin
-	exit ;;
-    prep*:SunOS:5.*:*)
-	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    *:GNU:*:*)
-	# the GNU system
-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-	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/[-(].*//'`-gnu
-	exit ;;
-    i*86:Minix:*:*)
-	echo ${UNAME_MACHINE}-pc-minix
-	exit ;;
-    alpha:Linux:*:*)
-	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
-	  EV5)   UNAME_MACHINE=alphaev5 ;;
-	  EV56)  UNAME_MACHINE=alphaev56 ;;
-	  PCA56) UNAME_MACHINE=alphapca56 ;;
-	  PCA57) UNAME_MACHINE=alphapca56 ;;
-	  EV6)   UNAME_MACHINE=alphaev6 ;;
-	  EV67)  UNAME_MACHINE=alphaev67 ;;
-	  EV68*) UNAME_MACHINE=alphaev68 ;;
-        esac
-	objdump --private-headers /bin/sh | grep -q ld.so.1
-	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
-	exit ;;
-    arm*:Linux:*:*)
-	eval $set_cc_for_build
-	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
-	    | grep -q __ARM_EABI__
-	then
-	    echo ${UNAME_MACHINE}-unknown-linux-gnu
-	else
-	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
-	fi
-	exit ;;
-    avr32*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    cris:Linux:*:*)
-	echo cris-axis-linux-gnu
-	exit ;;
-    crisv32:Linux:*:*)
-	echo crisv32-axis-linux-gnu
-	exit ;;
-    frv:Linux:*:*)
-    	echo frv-unknown-linux-gnu
-	exit ;;
-    i*86:Linux:*:*)
-	LIBC=gnu
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#ifdef __dietlibc__
-	LIBC=dietlibc
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
-	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
-	exit ;;
-    ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m32r*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    mips:Linux:*:* | mips64:Linux:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#undef CPU
-	#undef ${UNAME_MACHINE}
-	#undef ${UNAME_MACHINE}el
-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=${UNAME_MACHINE}el
-	#else
-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=${UNAME_MACHINE}
-	#else
-	CPU=
-	#endif
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
-	;;
-    or32:Linux:*:*)
-	echo or32-unknown-linux-gnu
-	exit ;;
-    padre:Linux:*:*)
-	echo sparc-unknown-linux-gnu
-	exit ;;
-    parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-gnu
-	exit ;;
-    parisc:Linux:*:* | hppa:Linux:*:*)
-	# Look for CPU level
-	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
-	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
-	  *)    echo hppa-unknown-linux-gnu ;;
-	esac
-	exit ;;
-    ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-gnu
-	exit ;;
-    ppc:Linux:*:*)
-	echo powerpc-unknown-linux-gnu
-	exit ;;
-    s390:Linux:*:* | s390x:Linux:*:*)
-	echo ${UNAME_MACHINE}-ibm-linux
-	exit ;;
-    sh64*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sh*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    vax:Linux:*:*)
-	echo ${UNAME_MACHINE}-dec-linux-gnu
-	exit ;;
-    x86_64:Linux:*:*)
-	echo x86_64-unknown-linux-gnu
-	exit ;;
-    xtensa*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    i*86:DYNIX/ptx:4*:*)
-	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
-	# earlier versions are messed up and put the nodename in both
-	# sysname and nodename.
-	echo i386-sequent-sysv4
-	exit ;;
-    i*86:UNIX_SV:4.2MP:2.*)
-        # Unixware is an offshoot of SVR4, but it has its own version
-        # number series starting with 2...
-        # I am not positive that other SVR4 systems won't match this,
-	# I just have to hope.  -- rms.
-        # Use sysv4.2uw... so that sysv4* matches it.
-	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
-	exit ;;
-    i*86:OS/2:*:*)
-	# If we were able to find `uname', then EMX Unix compatibility
-	# is probably installed.
-	echo ${UNAME_MACHINE}-pc-os2-emx
-	exit ;;
-    i*86:XTS-300:*:STOP)
-	echo ${UNAME_MACHINE}-unknown-stop
-	exit ;;
-    i*86:atheos:*:*)
-	echo ${UNAME_MACHINE}-unknown-atheos
-	exit ;;
-    i*86:syllable:*:*)
-	echo ${UNAME_MACHINE}-pc-syllable
-	exit ;;
-    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
-	echo i386-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    i*86:*DOS:*:*)
-	echo ${UNAME_MACHINE}-pc-msdosdjgpp
-	exit ;;
-    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
-	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
-	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
-		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
-	else
-		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
-	fi
-	exit ;;
-    i*86:*:5:[678]*)
-    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
-	case `/bin/uname -X | grep "^Machine"` in
-	    *486*)	     UNAME_MACHINE=i486 ;;
-	    *Pentium)	     UNAME_MACHINE=i586 ;;
-	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
-	esac
-	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
-	exit ;;
-    i*86:*:3.2:*)
-	if test -f /usr/options/cb.name; then
-		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
-		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
-	elif /bin/uname -X 2>/dev/null >/dev/null ; then
-		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
-		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
-		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
-			&& UNAME_MACHINE=i586
-		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
-	else
-		echo ${UNAME_MACHINE}-pc-sysv32
-	fi
-	exit ;;
-    pc:*:*:*)
-	# Left here for compatibility:
-        # 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
-	# this is a cross-build.
-	echo i586-pc-msdosdjgpp
-        exit ;;
-    Intel:Mach:3*:*)
-	echo i386-pc-mach3
-	exit ;;
-    paragon:*:*:*)
-	echo i860-intel-osf1
-	exit ;;
-    i860:*:4.*:*) # i860-SVR4
-	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
-	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
-	else # Add other i860-SVR4 vendors below as they are discovered.
-	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
-	fi
-	exit ;;
-    mini*:CTIX:SYS*5:*)
-	# "miniframe"
-	echo m68010-convergent-sysv
-	exit ;;
-    mc68k:UNIX:SYSTEM5:3.51m)
-	echo m68k-convergent-sysv
-	exit ;;
-    M680?0:D-NIX:5.3:*)
-	echo m68k-diab-dnix
-	exit ;;
-    M68*:*:R3V[5678]*:*)
-	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
-    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
-	OS_REL=''
-	test -r /etc/.relid \
-	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-          && { echo i486-ncr-sysv4; exit; } ;;
-    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
-	OS_REL='.3'
-	test -r /etc/.relid \
-	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
-	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
-	echo m68k-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    mc68030:UNIX_System_V:4.*:*)
-	echo m68k-atari-sysv4
-	exit ;;
-    TSUNAMI:LynxOS:2.*:*)
-	echo sparc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    rs6000:LynxOS:2.*:*)
-	echo rs6000-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
-	echo powerpc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    SM[BE]S:UNIX_SV:*:*)
-	echo mips-dde-sysv${UNAME_RELEASE}
-	exit ;;
-    RM*:ReliantUNIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    RM*:SINIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    *:SINIX-*:*:*)
-	if uname -p 2>/dev/null >/dev/null ; then
-		UNAME_MACHINE=`(uname -p) 2>/dev/null`
-		echo ${UNAME_MACHINE}-sni-sysv4
-	else
-		echo ns32k-sni-sysv
-	fi
-	exit ;;
-    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-                      # says <Richard.M.Bartel@ccMail.Census.GOV>
-        echo i586-unisys-sysv4
-        exit ;;
-    *:UNIX_System_V:4*:FTX*)
-	# From Gerald Hewes <hewes@openmarket.com>.
-	# How about differentiating between stratus architectures? -djm
-	echo hppa1.1-stratus-sysv4
-	exit ;;
-    *:*:*:FTX*)
-	# From seanf@swdc.stratus.com.
-	echo i860-stratus-sysv4
-	exit ;;
-    i*86:VOS:*:*)
-	# From Paul.Green@stratus.com.
-	echo ${UNAME_MACHINE}-stratus-vos
-	exit ;;
-    *:VOS:*:*)
-	# From Paul.Green@stratus.com.
-	echo hppa1.1-stratus-vos
-	exit ;;
-    mc68*:A/UX:*:*)
-	echo m68k-apple-aux${UNAME_RELEASE}
-	exit ;;
-    news*:NEWS-OS:6*:*)
-	echo mips-sony-newsos6
-	exit ;;
-    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
-	if [ -d /usr/nec ]; then
-	        echo mips-nec-sysv${UNAME_RELEASE}
-	else
-	        echo mips-unknown-sysv${UNAME_RELEASE}
-	fi
-        exit ;;
-    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
-	echo powerpc-be-beos
-	exit ;;
-    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
-	echo powerpc-apple-beos
-	exit ;;
-    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
-	echo i586-pc-beos
-	exit ;;
-    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
-	echo i586-pc-haiku
-	exit ;;
-    SX-4:SUPER-UX:*:*)
-	echo sx4-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-5:SUPER-UX:*:*)
-	echo sx5-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-6:SUPER-UX:*:*)
-	echo sx6-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-7:SUPER-UX:*:*)
-	echo sx7-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-8:SUPER-UX:*:*)
-	echo sx8-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-8R:SUPER-UX:*:*)
-	echo sx8r-nec-superux${UNAME_RELEASE}
-	exit ;;
-    Power*:Rhapsody:*:*)
-	echo powerpc-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Rhapsody:*:*)
-	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Darwin:*:*)
-	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-	case $UNAME_PROCESSOR in
-	    i386)
-		eval $set_cc_for_build
-		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) | \
-		      grep IS_64BIT_ARCH >/dev/null
-		  then
-		      UNAME_PROCESSOR="x86_64"
-		  fi
-		fi ;;
-	    unknown) UNAME_PROCESSOR=powerpc ;;
-	esac
-	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
-	exit ;;
-    *:procnto*:*:* | *:QNX:[0123456789]*:*)
-	UNAME_PROCESSOR=`uname -p`
-	if test "$UNAME_PROCESSOR" = "x86"; then
-		UNAME_PROCESSOR=i386
-		UNAME_MACHINE=pc
-	fi
-	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
-	exit ;;
-    *:QNX:*:4*)
-	echo i386-pc-qnx
-	exit ;;
-    NSE-?:NONSTOP_KERNEL:*:*)
-	echo nse-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    NSR-?:NONSTOP_KERNEL:*:*)
-	echo nsr-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    *:NonStop-UX:*:*)
-	echo mips-compaq-nonstopux
-	exit ;;
-    BS2000:POSIX*:*:*)
-	echo bs2000-siemens-sysv
-	exit ;;
-    DS/*:UNIX_System_V:*:*)
-	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
-	exit ;;
-    *:Plan9:*:*)
-	# "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
-	    UNAME_MACHINE=i386
-	else
-	    UNAME_MACHINE="$cputype"
-	fi
-	echo ${UNAME_MACHINE}-unknown-plan9
-	exit ;;
-    *:TOPS-10:*:*)
-	echo pdp10-unknown-tops10
-	exit ;;
-    *:TENEX:*:*)
-	echo pdp10-unknown-tenex
-	exit ;;
-    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
-	echo pdp10-dec-tops20
-	exit ;;
-    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
-	echo pdp10-xkl-tops20
-	exit ;;
-    *:TOPS-20:*:*)
-	echo pdp10-unknown-tops20
-	exit ;;
-    *:ITS:*:*)
-	echo pdp10-unknown-its
-	exit ;;
-    SEI:*:*:SEIUX)
-        echo mips-sei-seiux${UNAME_RELEASE}
-	exit ;;
-    *:DragonFly:*:*)
-	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
-	exit ;;
-    *:*VMS:*:*)
-    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
-	case "${UNAME_MACHINE}" in
-	    A*) echo alpha-dec-vms ; exit ;;
-	    I*) echo ia64-dec-vms ; exit ;;
-	    V*) echo vax-dec-vms ; exit ;;
-	esac ;;
-    *:XENIX:*:SysV)
-	echo i386-pc-xenix
-	exit ;;
-    i*86:skyos:*:*)
-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
-	exit ;;
-    i*86:rdos:*:*)
-	echo ${UNAME_MACHINE}-pc-rdos
-	exit ;;
-    i*86:AROS:*:*)
-	echo ${UNAME_MACHINE}-pc-aros
-	exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-          "4"
-#else
-	  ""
-#endif
-         ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
-	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    c34*)
-	echo c34-convex-bsd
-	exit ;;
-    c38*)
-	echo c38-convex-bsd
-	exit ;;
-    c4*)
-	echo c4-convex-bsd
-	exit ;;
-    esac
-fi
-
-cat >&2 <<EOF
-$0: unable to guess system type
-
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
-
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
-and
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches@gnu.org> in order to provide the needed
-information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
-
-hostinfo               = `(hostinfo) 2>/dev/null`
-/bin/universe          = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch              = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
-
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM  = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
-EOF
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/cloog-0.17.0/autoconf/config.sub b/cloog-0.17.0/autoconf/config.sub
deleted file mode 100755
index c2d1257..0000000
--- a/cloog-0.17.0/autoconf/config.sub
+++ /dev/null
@@ -1,1714 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-#   Free Software Foundation, Inc.
-
-timestamp='2010-01-22'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# 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
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted GNU ChangeLog entry.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support.  The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help"
-       exit 1 ;;
-
-    *local*)
-       # First pass through any local machine types.
-       echo $1
-       exit ;;
-
-    * )
-       break ;;
-  esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
-    exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
-    exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
-  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
-  kopensolaris*-gnu* | \
-  storm-chaos* | os2-emx* | rtmk-nova*)
-    os=-$maybe_os
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
-    ;;
-  *)
-    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
-    if [ $basic_machine != $1 ]
-    then os=`echo $1 | sed 's/.*-/-/'`
-    else os=; fi
-    ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work.  We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
-	-sun*os*)
-		# Prevent following clause from handling this invalid input.
-		;;
-	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis | -knuth | -cray | -microblaze)
-		os=
-		basic_machine=$1
-		;;
-        -bluegene*)
-	        os=-cnk
-		;;
-	-sim | -cisco | -oki | -wec | -winbond)
-		os=
-		basic_machine=$1
-		;;
-	-scout)
-		;;
-	-wrs)
-		os=-vxworks
-		basic_machine=$1
-		;;
-	-chorusos*)
-		os=-chorusos
-		basic_machine=$1
-		;;
- 	-chorusrdb)
- 		os=-chorusrdb
-		basic_machine=$1
- 		;;
-	-hiux*)
-		os=-hiuxwe2
-		;;
-	-sco6)
-		os=-sco5v6
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5)
-		os=-sco3.2v5
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco4)
-		os=-sco3.2v4
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2.[4-9]*)
-		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2v[4-9]*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5v6*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco*)
-		os=-sco3.2v2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-udk*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-isc)
-		os=-isc2.2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-clix*)
-		basic_machine=clipper-intergraph
-		;;
-	-isc*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-lynx*)
-		os=-lynxos
-		;;
-	-ptx*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
-		;;
-	-windowsnt*)
-		os=`echo $os | sed -e 's/windowsnt/winnt/'`
-		;;
-	-psos*)
-		os=-psos
-		;;
-	-mint | -mint[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
-	# Recognize the basic CPU types without company name.
-	# Some are omitted here because they have special meanings below.
-	1750a | 580 \
-	| a29k \
-	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
-	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
-	| am33_2.0 \
-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
-	| bfin \
-	| c4x | clipper \
-	| d10v | d30v | dlx | dsp16xx \
-	| fido | fr30 | frv \
-	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
-	| i370 | i860 | i960 | ia64 \
-	| ip2k | iq2000 \
-	| lm32 \
-	| m32c | m32r | m32rle | m68000 | m68k | m88k \
-	| maxq | mb | microblaze | mcore | mep | metag \
-	| mips | mipsbe | mipseb | mipsel | mipsle \
-	| mips16 \
-	| mips64 | mips64el \
-	| mips64octeon | mips64octeonel \
-	| mips64orion | mips64orionel \
-	| mips64r5900 | mips64r5900el \
-	| mips64vr | mips64vrel \
-	| mips64vr4100 | mips64vr4100el \
-	| mips64vr4300 | mips64vr4300el \
-	| mips64vr5000 | mips64vr5000el \
-	| mips64vr5900 | mips64vr5900el \
-	| mipsisa32 | mipsisa32el \
-	| mipsisa32r2 | mipsisa32r2el \
-	| mipsisa64 | mipsisa64el \
-	| mipsisa64r2 | mipsisa64r2el \
-	| mipsisa64sb1 | mipsisa64sb1el \
-	| mipsisa64sr71k | mipsisa64sr71kel \
-	| mipstx39 | mipstx39el \
-	| mn10200 | mn10300 \
-	| moxie \
-	| mt \
-	| msp430 \
-	| nios | nios2 \
-	| ns16k | ns32k \
-	| or32 \
-	| pdp10 | pdp11 | pj | pjl \
-	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
-	| pyramid \
-	| rx \
-	| score \
-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
-	| sh64 | sh64le \
-	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
-	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-	| spu | strongarm \
-	| tahoe | thumb | tic4x | tic80 | tron \
-	| ubicom32 \
-	| v850 | v850e \
-	| we32k \
-	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
-	| z8k | z80)
-		basic_machine=$basic_machine-unknown
-		;;
-	m6811 | m68hc11 | m6812 | m68hc12 | picochip)
-		# Motorola 68HC11/12.
-		basic_machine=$basic_machine-unknown
-		os=-none
-		;;
-	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
-		;;
-	ms1)
-		basic_machine=mt-unknown
-		;;
-
-	# We use `pc' rather than `unknown'
-	# because (1) that's what they normally are, and
-	# (2) the word "unknown" tends to confuse beginning users.
-	i*86 | x86_64)
-	  basic_machine=$basic_machine-pc
-	  ;;
-	# Object if more than one company name word.
-	*-*-*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-	# Recognize the basic CPU types with company name.
-	580-* \
-	| a29k-* \
-	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
-	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
-	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
-	| avr-* | avr32-* \
-	| bfin-* | bs2000-* \
-	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
-	| clipper-* | craynv-* | cydra-* \
-	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
-	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
-	| h8300-* | h8500-* \
-	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
-	| i*86-* | i860-* | i960-* | ia64-* \
-	| ip2k-* | iq2000-* \
-	| lm32-* \
-	| m32c-* | m32r-* | m32rle-* \
-	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
-	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
-	| mips16-* \
-	| mips64-* | mips64el-* \
-	| mips64octeon-* | mips64octeonel-* \
-	| mips64orion-* | mips64orionel-* \
-	| mips64r5900-* | mips64r5900el-* \
-	| mips64vr-* | mips64vrel-* \
-	| mips64vr4100-* | mips64vr4100el-* \
-	| mips64vr4300-* | mips64vr4300el-* \
-	| mips64vr5000-* | mips64vr5000el-* \
-	| mips64vr5900-* | mips64vr5900el-* \
-	| mipsisa32-* | mipsisa32el-* \
-	| mipsisa32r2-* | mipsisa32r2el-* \
-	| mipsisa64-* | mipsisa64el-* \
-	| mipsisa64r2-* | mipsisa64r2el-* \
-	| mipsisa64sb1-* | mipsisa64sb1el-* \
-	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
-	| mipstx39-* | mipstx39el-* \
-	| mmix-* \
-	| mt-* \
-	| msp430-* \
-	| nios-* | nios2-* \
-	| none-* | np1-* | ns16k-* | ns32k-* \
-	| orion-* \
-	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
-	| pyramid-* \
-	| romp-* | rs6000-* | rx-* \
-	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
-	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
-	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
-	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
-	| tahoe-* | thumb-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
-	| tile-* | tilegx-* \
-	| tron-* \
-	| ubicom32-* \
-	| v850-* | v850e-* | vax-* \
-	| we32k-* \
-	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
-	| xstormy16-* | xtensa*-* \
-	| ymp-* \
-	| z8k-* | z80-*)
-		;;
-	# Recognize the basic CPU types without company name, with glob match.
-	xtensa*)
-		basic_machine=$basic_machine-unknown
-		;;
-	# Recognize the various machine names and aliases which stand
-	# for a CPU type and a company and sometimes even an OS.
-	386bsd)
-		basic_machine=i386-unknown
-		os=-bsd
-		;;
-	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
-		basic_machine=m68000-att
-		;;
-	3b*)
-		basic_machine=we32k-att
-		;;
-	a29khif)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-    	abacus)
-		basic_machine=abacus-unknown
-		;;
-	adobe68k)
-		basic_machine=m68010-adobe
-		os=-scout
-		;;
-	alliant | fx80)
-		basic_machine=fx80-alliant
-		;;
-	altos | altos3068)
-		basic_machine=m68k-altos
-		;;
-	am29k)
-		basic_machine=a29k-none
-		os=-bsd
-		;;
-	amd64)
-		basic_machine=x86_64-pc
-		;;
-	amd64-*)
-		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	amdahl)
-		basic_machine=580-amdahl
-		os=-sysv
-		;;
-	amiga | amiga-*)
-		basic_machine=m68k-unknown
-		;;
-	amigaos | amigados)
-		basic_machine=m68k-unknown
-		os=-amigaos
-		;;
-	amigaunix | amix)
-		basic_machine=m68k-unknown
-		os=-sysv4
-		;;
-	apollo68)
-		basic_machine=m68k-apollo
-		os=-sysv
-		;;
-	apollo68bsd)
-		basic_machine=m68k-apollo
-		os=-bsd
-		;;
-	aros)
-		basic_machine=i386-pc
-		os=-aros
-		;;
-	aux)
-		basic_machine=m68k-apple
-		os=-aux
-		;;
-	balance)
-		basic_machine=ns32k-sequent
-		os=-dynix
-		;;
-	blackfin)
-		basic_machine=bfin-unknown
-		os=-linux
-		;;
-	blackfin-*)
-		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	bluegene*)
-		basic_machine=powerpc-ibm
-		os=-cnk
-		;;
-	c90)
-		basic_machine=c90-cray
-		os=-unicos
-		;;
-        cegcc)
-		basic_machine=arm-unknown
-		os=-cegcc
-		;;
-	convex-c1)
-		basic_machine=c1-convex
-		os=-bsd
-		;;
-	convex-c2)
-		basic_machine=c2-convex
-		os=-bsd
-		;;
-	convex-c32)
-		basic_machine=c32-convex
-		os=-bsd
-		;;
-	convex-c34)
-		basic_machine=c34-convex
-		os=-bsd
-		;;
-	convex-c38)
-		basic_machine=c38-convex
-		os=-bsd
-		;;
-	cray | j90)
-		basic_machine=j90-cray
-		os=-unicos
-		;;
-	craynv)
-		basic_machine=craynv-cray
-		os=-unicosmp
-		;;
-	cr16)
-		basic_machine=cr16-unknown
-		os=-elf
-		;;
-	crds | unos)
-		basic_machine=m68k-crds
-		;;
-	crisv32 | crisv32-* | etraxfs*)
-		basic_machine=crisv32-axis
-		;;
-	cris | cris-* | etrax*)
-		basic_machine=cris-axis
-		;;
-	crx)
-		basic_machine=crx-unknown
-		os=-elf
-		;;
-	da30 | da30-*)
-		basic_machine=m68k-da30
-		;;
-	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
-		basic_machine=mips-dec
-		;;
-	decsystem10* | dec10*)
-		basic_machine=pdp10-dec
-		os=-tops10
-		;;
-	decsystem20* | dec20*)
-		basic_machine=pdp10-dec
-		os=-tops20
-		;;
-	delta | 3300 | motorola-3300 | motorola-delta \
-	      | 3300-motorola | delta-motorola)
-		basic_machine=m68k-motorola
-		;;
-	delta88)
-		basic_machine=m88k-motorola
-		os=-sysv3
-		;;
-	dicos)
-		basic_machine=i686-pc
-		os=-dicos
-		;;
-	djgpp)
-		basic_machine=i586-pc
-		os=-msdosdjgpp
-		;;
-	dpx20 | dpx20-*)
-		basic_machine=rs6000-bull
-		os=-bosx
-		;;
-	dpx2* | dpx2*-bull)
-		basic_machine=m68k-bull
-		os=-sysv3
-		;;
-	ebmon29k)
-		basic_machine=a29k-amd
-		os=-ebmon
-		;;
-	elxsi)
-		basic_machine=elxsi-elxsi
-		os=-bsd
-		;;
-	encore | umax | mmax)
-		basic_machine=ns32k-encore
-		;;
-	es1800 | OSE68k | ose68k | ose | OSE)
-		basic_machine=m68k-ericsson
-		os=-ose
-		;;
-	fx2800)
-		basic_machine=i860-alliant
-		;;
-	genix)
-		basic_machine=ns32k-ns
-		;;
-	gmicro)
-		basic_machine=tron-gmicro
-		os=-sysv
-		;;
-	go32)
-		basic_machine=i386-pc
-		os=-go32
-		;;
-	h3050r* | hiux*)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	h8300hms)
-		basic_machine=h8300-hitachi
-		os=-hms
-		;;
-	h8300xray)
-		basic_machine=h8300-hitachi
-		os=-xray
-		;;
-	h8500hms)
-		basic_machine=h8500-hitachi
-		os=-hms
-		;;
-	harris)
-		basic_machine=m88k-harris
-		os=-sysv3
-		;;
-	hp300-*)
-		basic_machine=m68k-hp
-		;;
-	hp300bsd)
-		basic_machine=m68k-hp
-		os=-bsd
-		;;
-	hp300hpux)
-		basic_machine=m68k-hp
-		os=-hpux
-		;;
-	hp3k9[0-9][0-9] | hp9[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k2[0-9][0-9] | hp9k31[0-9])
-		basic_machine=m68000-hp
-		;;
-	hp9k3[2-9][0-9])
-		basic_machine=m68k-hp
-		;;
-	hp9k6[0-9][0-9] | hp6[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k7[0-79][0-9] | hp7[0-79][0-9])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k78[0-9] | hp78[0-9])
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][13679] | hp8[0-9][13679])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][0-9] | hp8[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hppa-next)
-		os=-nextstep3
-		;;
-	hppaosf)
-		basic_machine=hppa1.1-hp
-		os=-osf
-		;;
-	hppro)
-		basic_machine=hppa1.1-hp
-		os=-proelf
-		;;
-	i370-ibm* | ibm*)
-		basic_machine=i370-ibm
-		;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
-	i*86v32)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv32
-		;;
-	i*86v4*)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv4
-		;;
-	i*86v)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv
-		;;
-	i*86sol2)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-solaris2
-		;;
-	i386mach)
-		basic_machine=i386-mach
-		os=-mach
-		;;
-	i386-vsta | vsta)
-		basic_machine=i386-unknown
-		os=-vsta
-		;;
-	iris | iris4d)
-		basic_machine=mips-sgi
-		case $os in
-		    -irix*)
-			;;
-		    *)
-			os=-irix4
-			;;
-		esac
-		;;
-	isi68 | isi)
-		basic_machine=m68k-isi
-		os=-sysv
-		;;
-	m68knommu)
-		basic_machine=m68k-unknown
-		os=-linux
-		;;
-	m68knommu-*)
-		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	m88k-omron*)
-		basic_machine=m88k-omron
-		;;
-	magnum | m3230)
-		basic_machine=mips-mips
-		os=-sysv
-		;;
-	merlin)
-		basic_machine=ns32k-utek
-		os=-sysv
-		;;
-        microblaze)
-		basic_machine=microblaze-xilinx
-		;;
-	mingw32)
-		basic_machine=i386-pc
-		os=-mingw32
-		;;
-	mingw32ce)
-		basic_machine=arm-unknown
-		os=-mingw32ce
-		;;
-	miniframe)
-		basic_machine=m68000-convergent
-		;;
-	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-	mips3*-*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
-		;;
-	mips3*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
-		;;
-	monitor)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	morphos)
-		basic_machine=powerpc-unknown
-		os=-morphos
-		;;
-	msdos)
-		basic_machine=i386-pc
-		os=-msdos
-		;;
-	ms1-*)
-		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
-		;;
-	mvs)
-		basic_machine=i370-ibm
-		os=-mvs
-		;;
-	ncr3000)
-		basic_machine=i486-ncr
-		os=-sysv4
-		;;
-	netbsd386)
-		basic_machine=i386-unknown
-		os=-netbsd
-		;;
-	netwinder)
-		basic_machine=armv4l-rebel
-		os=-linux
-		;;
-	news | news700 | news800 | news900)
-		basic_machine=m68k-sony
-		os=-newsos
-		;;
-	news1000)
-		basic_machine=m68030-sony
-		os=-newsos
-		;;
-	news-3600 | risc-news)
-		basic_machine=mips-sony
-		os=-newsos
-		;;
-	necv70)
-		basic_machine=v70-nec
-		os=-sysv
-		;;
-	next | m*-next )
-		basic_machine=m68k-next
-		case $os in
-		    -nextstep* )
-			;;
-		    -ns2*)
-		      os=-nextstep2
-			;;
-		    *)
-		      os=-nextstep3
-			;;
-		esac
-		;;
-	nh3000)
-		basic_machine=m68k-harris
-		os=-cxux
-		;;
-	nh[45]000)
-		basic_machine=m88k-harris
-		os=-cxux
-		;;
-	nindy960)
-		basic_machine=i960-intel
-		os=-nindy
-		;;
-	mon960)
-		basic_machine=i960-intel
-		os=-mon960
-		;;
-	nonstopux)
-		basic_machine=mips-compaq
-		os=-nonstopux
-		;;
-	np1)
-		basic_machine=np1-gould
-		;;
-	nsr-tandem)
-		basic_machine=nsr-tandem
-		;;
-	op50n-* | op60c-*)
-		basic_machine=hppa1.1-oki
-		os=-proelf
-		;;
-	openrisc | openrisc-*)
-		basic_machine=or32-unknown
-		;;
-	os400)
-		basic_machine=powerpc-ibm
-		os=-os400
-		;;
-	OSE68000 | ose68000)
-		basic_machine=m68000-ericsson
-		os=-ose
-		;;
-	os68k)
-		basic_machine=m68k-none
-		os=-os68k
-		;;
-	pa-hitachi)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	paragon)
-		basic_machine=i860-intel
-		os=-osf
-		;;
-	parisc)
-		basic_machine=hppa-unknown
-		os=-linux
-		;;
-	parisc-*)
-		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	pbd)
-		basic_machine=sparc-tti
-		;;
-	pbb)
-		basic_machine=m68k-tti
-		;;
-	pc532 | pc532-*)
-		basic_machine=ns32k-pc532
-		;;
-	pc98)
-		basic_machine=i386-pc
-		;;
-	pc98-*)
-		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium | p5 | k5 | k6 | nexgen | viac3)
-		basic_machine=i586-pc
-		;;
-	pentiumpro | p6 | 6x86 | athlon | athlon_*)
-		basic_machine=i686-pc
-		;;
-	pentiumii | pentium2 | pentiumiii | pentium3)
-		basic_machine=i686-pc
-		;;
-	pentium4)
-		basic_machine=i786-pc
-		;;
-	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
-		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumpro-* | p6-* | 6x86-* | athlon-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium4-*)
-		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pn)
-		basic_machine=pn-gould
-		;;
-	power)	basic_machine=power-ibm
-		;;
-	ppc)	basic_machine=powerpc-unknown
-		;;
-	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppcle | powerpclittle | ppc-le | powerpc-little)
-		basic_machine=powerpcle-unknown
-		;;
-	ppcle-* | powerpclittle-*)
-		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64)	basic_machine=powerpc64-unknown
-		;;
-	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
-		basic_machine=powerpc64le-unknown
-		;;
-	ppc64le-* | powerpc64little-*)
-		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ps2)
-		basic_machine=i386-ibm
-		;;
-	pw32)
-		basic_machine=i586-unknown
-		os=-pw32
-		;;
-	rdos)
-		basic_machine=i386-pc
-		os=-rdos
-		;;
-	rom68k)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	rm[46]00)
-		basic_machine=mips-siemens
-		;;
-	rtpc | rtpc-*)
-		basic_machine=romp-ibm
-		;;
-	s390 | s390-*)
-		basic_machine=s390-ibm
-		;;
-	s390x | s390x-*)
-		basic_machine=s390x-ibm
-		;;
-	sa29200)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	sb1)
-		basic_machine=mipsisa64sb1-unknown
-		;;
-	sb1el)
-		basic_machine=mipsisa64sb1el-unknown
-		;;
-	sde)
-		basic_machine=mipsisa32-sde
-		os=-elf
-		;;
-	sei)
-		basic_machine=mips-sei
-		os=-seiux
-		;;
-	sequent)
-		basic_machine=i386-sequent
-		;;
-	sh)
-		basic_machine=sh-hitachi
-		os=-hms
-		;;
-	sh5el)
-		basic_machine=sh5le-unknown
-		;;
-	sh64)
-		basic_machine=sh64-unknown
-		;;
-	sparclite-wrs | simso-wrs)
-		basic_machine=sparclite-wrs
-		os=-vxworks
-		;;
-	sps7)
-		basic_machine=m68k-bull
-		os=-sysv2
-		;;
-	spur)
-		basic_machine=spur-unknown
-		;;
-	st2000)
-		basic_machine=m68k-tandem
-		;;
-	stratus)
-		basic_machine=i860-stratus
-		os=-sysv4
-		;;
-	sun2)
-		basic_machine=m68000-sun
-		;;
-	sun2os3)
-		basic_machine=m68000-sun
-		os=-sunos3
-		;;
-	sun2os4)
-		basic_machine=m68000-sun
-		os=-sunos4
-		;;
-	sun3os3)
-		basic_machine=m68k-sun
-		os=-sunos3
-		;;
-	sun3os4)
-		basic_machine=m68k-sun
-		os=-sunos4
-		;;
-	sun4os3)
-		basic_machine=sparc-sun
-		os=-sunos3
-		;;
-	sun4os4)
-		basic_machine=sparc-sun
-		os=-sunos4
-		;;
-	sun4sol2)
-		basic_machine=sparc-sun
-		os=-solaris2
-		;;
-	sun3 | sun3-*)
-		basic_machine=m68k-sun
-		;;
-	sun4)
-		basic_machine=sparc-sun
-		;;
-	sun386 | sun386i | roadrunner)
-		basic_machine=i386-sun
-		;;
-	sv1)
-		basic_machine=sv1-cray
-		os=-unicos
-		;;
-	symmetry)
-		basic_machine=i386-sequent
-		os=-dynix
-		;;
-	t3e)
-		basic_machine=alphaev5-cray
-		os=-unicos
-		;;
-	t90)
-		basic_machine=t90-cray
-		os=-unicos
-		;;
-	tic54x | c54x*)
-		basic_machine=tic54x-unknown
-		os=-coff
-		;;
-	tic55x | c55x*)
-		basic_machine=tic55x-unknown
-		os=-coff
-		;;
-	tic6x | c6x*)
-		basic_machine=tic6x-unknown
-		os=-coff
-		;;
-        # This must be matched before tile*.
-        tilegx*)
-		basic_machine=tilegx-unknown
-		os=-linux-gnu
-		;;
-	tile*)
-		basic_machine=tile-unknown
-		os=-linux-gnu
-		;;
-	tx39)
-		basic_machine=mipstx39-unknown
-		;;
-	tx39el)
-		basic_machine=mipstx39el-unknown
-		;;
-	toad1)
-		basic_machine=pdp10-xkl
-		os=-tops20
-		;;
-	tower | tower-32)
-		basic_machine=m68k-ncr
-		;;
-	tpf)
-		basic_machine=s390x-ibm
-		os=-tpf
-		;;
-	udi29k)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	ultra3)
-		basic_machine=a29k-nyu
-		os=-sym1
-		;;
-	v810 | necv810)
-		basic_machine=v810-nec
-		os=-none
-		;;
-	vaxv)
-		basic_machine=vax-dec
-		os=-sysv
-		;;
-	vms)
-		basic_machine=vax-dec
-		os=-vms
-		;;
-	vpp*|vx|vx-*)
-		basic_machine=f301-fujitsu
-		;;
-	vxworks960)
-		basic_machine=i960-wrs
-		os=-vxworks
-		;;
-	vxworks68)
-		basic_machine=m68k-wrs
-		os=-vxworks
-		;;
-	vxworks29k)
-		basic_machine=a29k-wrs
-		os=-vxworks
-		;;
-	w65*)
-		basic_machine=w65-wdc
-		os=-none
-		;;
-	w89k-*)
-		basic_machine=hppa1.1-winbond
-		os=-proelf
-		;;
-	xbox)
-		basic_machine=i686-pc
-		os=-mingw32
-		;;
-	xps | xps100)
-		basic_machine=xps100-honeywell
-		;;
-	ymp)
-		basic_machine=ymp-cray
-		os=-unicos
-		;;
-	z8k-*-coff)
-		basic_machine=z8k-unknown
-		os=-sim
-		;;
-	z80-*-coff)
-		basic_machine=z80-unknown
-		os=-sim
-		;;
-	none)
-		basic_machine=none-none
-		os=-none
-		;;
-
-# Here we handle the default manufacturer of certain CPU types.  It is in
-# some cases the only manufacturer, in others, it is the most popular.
-	w89k)
-		basic_machine=hppa1.1-winbond
-		;;
-	op50n)
-		basic_machine=hppa1.1-oki
-		;;
-	op60c)
-		basic_machine=hppa1.1-oki
-		;;
-	romp)
-		basic_machine=romp-ibm
-		;;
-	mmix)
-		basic_machine=mmix-knuth
-		;;
-	rs6000)
-		basic_machine=rs6000-ibm
-		;;
-	vax)
-		basic_machine=vax-dec
-		;;
-	pdp10)
-		# there are many clones, so DEC is not a safe bet
-		basic_machine=pdp10-unknown
-		;;
-	pdp11)
-		basic_machine=pdp11-dec
-		;;
-	we32k)
-		basic_machine=we32k-att
-		;;
-	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
-		basic_machine=sh-unknown
-		;;
-	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
-		basic_machine=sparc-sun
-		;;
-	cydra)
-		basic_machine=cydra-cydrome
-		;;
-	orion)
-		basic_machine=orion-highlevel
-		;;
-	orion105)
-		basic_machine=clipper-highlevel
-		;;
-	mac | mpw | mac-mpw)
-		basic_machine=m68k-apple
-		;;
-	pmac | pmac-mpw)
-		basic_machine=powerpc-apple
-		;;
-	*-unknown)
-		# Make sure to match an already-canonicalized machine name.
-		;;
-	*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
-	*-digital*)
-		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
-		;;
-	*-commodore*)
-		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
-		;;
-	*)
-		;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
-        # First match some system type aliases
-        # that might get confused with valid system types.
-	# -solaris* is a basic system type, with this one exception.
-        -auroraux)
-	        os=-auroraux
-		;;
-	-solaris1 | -solaris1.*)
-		os=`echo $os | sed -e 's|solaris1|sunos4|'`
-		;;
-	-solaris)
-		os=-solaris2
-		;;
-	-svr4*)
-		os=-sysv4
-		;;
-	-unixware*)
-		os=-sysv4.2uw
-		;;
-	-gnu/linux*)
-		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
-		;;
-	# First accept the basic system types.
-	# The portable systems comes first.
-	# Each alternative MUST END IN A *, to match a version number.
-	# -sysv* is not here because it comes later, after sysvr4.
-	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
-	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
-	      | -sym* | -kopensolaris* \
-	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* | -aros* \
-	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
-	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
-	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -openbsd* | -solidbsd* \
-	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
-	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
-	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
-	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-	      | -chorusos* | -chorusrdb* | -cegcc* \
-	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
-	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
-	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
-	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
-	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
-	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
-	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
-	# Remember, each alternative MUST END IN *, to match a version number.
-		;;
-	-qnx*)
-		case $basic_machine in
-		    x86-* | i*86-*)
-			;;
-		    *)
-			os=-nto$os
-			;;
-		esac
-		;;
-	-nto-qnx*)
-		;;
-	-nto*)
-		os=`echo $os | sed -e 's|nto|nto-qnx|'`
-		;;
-	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
-	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
-	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
-		;;
-	-mac*)
-		os=`echo $os | sed -e 's|mac|macos|'`
-		;;
-	-linux-dietlibc)
-		os=-linux-dietlibc
-		;;
-	-linux*)
-		os=`echo $os | sed -e 's|linux|linux-gnu|'`
-		;;
-	-sunos5*)
-		os=`echo $os | sed -e 's|sunos5|solaris2|'`
-		;;
-	-sunos6*)
-		os=`echo $os | sed -e 's|sunos6|solaris3|'`
-		;;
-	-opened*)
-		os=-openedition
-		;;
-        -os400*)
-		os=-os400
-		;;
-	-wince*)
-		os=-wince
-		;;
-	-osfrose*)
-		os=-osfrose
-		;;
-	-osf*)
-		os=-osf
-		;;
-	-utek*)
-		os=-bsd
-		;;
-	-dynix*)
-		os=-bsd
-		;;
-	-acis*)
-		os=-aos
-		;;
-	-atheos*)
-		os=-atheos
-		;;
-	-syllable*)
-		os=-syllable
-		;;
-	-386bsd)
-		os=-bsd
-		;;
-	-ctix* | -uts*)
-		os=-sysv
-		;;
-	-nova*)
-		os=-rtmk-nova
-		;;
-	-ns2 )
-		os=-nextstep2
-		;;
-	-nsk*)
-		os=-nsk
-		;;
-	# Preserve the version number of sinix5.
-	-sinix5.*)
-		os=`echo $os | sed -e 's|sinix|sysv|'`
-		;;
-	-sinix*)
-		os=-sysv4
-		;;
-        -tpf*)
-		os=-tpf
-		;;
-	-triton*)
-		os=-sysv3
-		;;
-	-oss*)
-		os=-sysv3
-		;;
-	-svr4)
-		os=-sysv4
-		;;
-	-svr3)
-		os=-sysv3
-		;;
-	-sysvr4)
-		os=-sysv4
-		;;
-	# This must come after -sysvr4.
-	-sysv*)
-		;;
-	-ose*)
-		os=-ose
-		;;
-	-es1800*)
-		os=-ose
-		;;
-	-xenix)
-		os=-xenix
-		;;
-	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-		os=-mint
-		;;
-	-aros*)
-		os=-aros
-		;;
-	-kaos*)
-		os=-kaos
-		;;
-	-zvmoe)
-		os=-zvmoe
-		;;
-	-dicos*)
-		os=-dicos
-		;;
-        -nacl*)
-	        ;;
-	-none)
-		;;
-	*)
-		# Get rid of the `-' at the beginning of $os.
-		os=`echo $os | sed 's/[^-]*-//'`
-		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
-		exit 1
-		;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system.  Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
-        score-*)
-		os=-elf
-		;;
-        spu-*)
-		os=-elf
-		;;
-	*-acorn)
-		os=-riscix1.2
-		;;
-	arm*-rebel)
-		os=-linux
-		;;
-	arm*-semi)
-		os=-aout
-		;;
-        c4x-* | tic4x-*)
-        	os=-coff
-		;;
-	# This must come before the *-dec entry.
-	pdp10-*)
-		os=-tops20
-		;;
-	pdp11-*)
-		os=-none
-		;;
-	*-dec | vax-*)
-		os=-ultrix4.2
-		;;
-	m68*-apollo)
-		os=-domain
-		;;
-	i386-sun)
-		os=-sunos4.0.2
-		;;
-	m68000-sun)
-		os=-sunos3
-		# This also exists in the configure program, but was not the
-		# default.
-		# os=-sunos4
-		;;
-	m68*-cisco)
-		os=-aout
-		;;
-        mep-*)
-		os=-elf
-		;;
-	mips*-cisco)
-		os=-elf
-		;;
-	mips*-*)
-		os=-elf
-		;;
-	or32-*)
-		os=-coff
-		;;
-	*-tti)	# must be before sparc entry or we get the wrong os.
-		os=-sysv3
-		;;
-	sparc-* | *-sun)
-		os=-sunos4.1.1
-		;;
-	*-be)
-		os=-beos
-		;;
-	*-haiku)
-		os=-haiku
-		;;
-	*-ibm)
-		os=-aix
-		;;
-    	*-knuth)
-		os=-mmixware
-		;;
-	*-wec)
-		os=-proelf
-		;;
-	*-winbond)
-		os=-proelf
-		;;
-	*-oki)
-		os=-proelf
-		;;
-	*-hp)
-		os=-hpux
-		;;
-	*-hitachi)
-		os=-hiux
-		;;
-	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
-		os=-sysv
-		;;
-	*-cbm)
-		os=-amigaos
-		;;
-	*-dg)
-		os=-dgux
-		;;
-	*-dolphin)
-		os=-sysv3
-		;;
-	m68k-ccur)
-		os=-rtu
-		;;
-	m88k-omron*)
-		os=-luna
-		;;
-	*-next )
-		os=-nextstep
-		;;
-	*-sequent)
-		os=-ptx
-		;;
-	*-crds)
-		os=-unos
-		;;
-	*-ns)
-		os=-genix
-		;;
-	i370-*)
-		os=-mvs
-		;;
-	*-next)
-		os=-nextstep3
-		;;
-	*-gould)
-		os=-sysv
-		;;
-	*-highlevel)
-		os=-bsd
-		;;
-	*-encore)
-		os=-bsd
-		;;
-	*-sgi)
-		os=-irix
-		;;
-	*-siemens)
-		os=-sysv4
-		;;
-	*-masscomp)
-		os=-rtu
-		;;
-	f30[01]-fujitsu | f700-fujitsu)
-		os=-uxpv
-		;;
-	*-rom68k)
-		os=-coff
-		;;
-	*-*bug)
-		os=-coff
-		;;
-	*-apple)
-		os=-macos
-		;;
-	*-atari*)
-		os=-mint
-		;;
-	*)
-		os=-none
-		;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer.  We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
-	*-unknown)
-		case $os in
-			-riscix*)
-				vendor=acorn
-				;;
-			-sunos*)
-				vendor=sun
-				;;
-			-cnk*|-aix*)
-				vendor=ibm
-				;;
-			-beos*)
-				vendor=be
-				;;
-			-hpux*)
-				vendor=hp
-				;;
-			-mpeix*)
-				vendor=hp
-				;;
-			-hiux*)
-				vendor=hitachi
-				;;
-			-unos*)
-				vendor=crds
-				;;
-			-dgux*)
-				vendor=dg
-				;;
-			-luna*)
-				vendor=omron
-				;;
-			-genix*)
-				vendor=ns
-				;;
-			-mvs* | -opened*)
-				vendor=ibm
-				;;
-			-os400*)
-				vendor=ibm
-				;;
-			-ptx*)
-				vendor=sequent
-				;;
-			-tpf*)
-				vendor=ibm
-				;;
-			-vxsim* | -vxworks* | -windiss*)
-				vendor=wrs
-				;;
-			-aux*)
-				vendor=apple
-				;;
-			-hms*)
-				vendor=hitachi
-				;;
-			-mpw* | -macos*)
-				vendor=apple
-				;;
-			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-				vendor=atari
-				;;
-			-vos*)
-				vendor=stratus
-				;;
-		esac
-		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
-		;;
-esac
-
-echo $basic_machine$os
-exit
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/cloog-0.17.0/autoconf/depcomp b/cloog-0.17.0/autoconf/depcomp
deleted file mode 100755
index df8eea7..0000000
--- a/cloog-0.17.0/autoconf/depcomp
+++ /dev/null
@@ -1,630 +0,0 @@
-#! /bin/sh
-# depcomp - compile a program generating dependencies as side-effects
-
-scriptversion=2009-04-28.21; # UTC
-
-# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
-# Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
-
-case $1 in
-  '')
-     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
-     exit 1;
-     ;;
-  -h | --h*)
-    cat <<\EOF
-Usage: depcomp [--help] [--version] PROGRAM [ARGS]
-
-Run PROGRAMS ARGS to compile a file, generating dependencies
-as side-effects.
-
-Environment variables:
-  depmode     Dependency tracking mode.
-  source      Source file read by `PROGRAMS ARGS'.
-  object      Object file output by `PROGRAMS ARGS'.
-  DEPDIR      directory where to store dependencies.
-  depfile     Dependency file to output.
-  tmpdepfile  Temporary file to use when outputing dependencies.
-  libtool     Whether libtool is used (yes/no).
-
-Report bugs to <bug-automake@gnu.org>.
-EOF
-    exit $?
-    ;;
-  -v | --v*)
-    echo "depcomp $scriptversion"
-    exit $?
-    ;;
-esac
-
-if test -z "$depmode" || test -z "$source" || test -z "$object"; then
-  echo "depcomp: Variables source, object and depmode must be set" 1>&2
-  exit 1
-fi
-
-# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
-depfile=${depfile-`echo "$object" |
-  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
-tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
-
-rm -f "$tmpdepfile"
-
-# Some modes work just like other modes, but use different flags.  We
-# parameterize here, but still list the modes in the big case below,
-# to make depend.m4 easier to write.  Note that we *cannot* use a case
-# here, because this file can only contain one case statement.
-if test "$depmode" = hp; then
-  # HP compiler uses -M and no extra arg.
-  gccflag=-M
-  depmode=gcc
-fi
-
-if test "$depmode" = dashXmstdout; then
-   # This is just like dashmstdout with a different argument.
-   dashmflag=-xM
-   depmode=dashmstdout
-fi
-
-cygpath_u="cygpath -u -f -"
-if test "$depmode" = msvcmsys; then
-   # This is just like msvisualcpp but w/o cygpath translation.
-   # Just convert the backslash-escaped backslashes to single forward
-   # slashes to satisfy depend.m4
-   cygpath_u="sed s,\\\\\\\\,/,g"
-   depmode=msvisualcpp
-fi
-
-case "$depmode" in
-gcc3)
-## gcc 3 implements dependency tracking that does exactly what
-## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
-## it if -MD -MP comes after the -MF stuff.  Hmm.
-## Unfortunately, FreeBSD c89 acceptance of flags depends upon
-## the command line argument order; so add the flags where they
-## appear in depend2.am.  Note that the slowdown incurred here
-## affects only configure: in makefiles, %FASTDEP% shortcuts this.
-  for arg
-  do
-    case $arg in
-    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
-    *)  set fnord "$@" "$arg" ;;
-    esac
-    shift # fnord
-    shift # $arg
-  done
-  "$@"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  mv "$tmpdepfile" "$depfile"
-  ;;
-
-gcc)
-## There are various ways to get dependency output from gcc.  Here's
-## why we pick this rather obscure method:
-## - Don't want to use -MD because we'd like the dependencies to end
-##   up in a subdir.  Having to rename by hand is ugly.
-##   (We might end up doing this anyway to support other compilers.)
-## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
-##   -MM, not -M (despite what the docs say).
-## - Using -M directly means running the compiler twice (even worse
-##   than renaming).
-  if test -z "$gccflag"; then
-    gccflag=-MD,
-  fi
-  "$@" -Wp,"$gccflag$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
-## The second -e expression handles DOS-style file names with drive letters.
-  sed -e 's/^[^:]*: / /' \
-      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the `deleted header file' problem.
-## The problem is that when a header file which appears in a .P file
-## is deleted, the dependency causes make to die (because there is
-## typically no way to rebuild the header).  We avoid this by adding
-## dummy dependencies for each header file.  Too bad gcc doesn't do
-## this for us directly.
-  tr ' ' '
-' < "$tmpdepfile" |
-## Some versions of gcc put a space before the `:'.  On the theory
-## that the space means something, we add a space to the output as
-## well.
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-hp)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-sgi)
-  if test "$libtool" = yes; then
-    "$@" "-Wp,-MDupdate,$tmpdepfile"
-  else
-    "$@" -MDupdate "$tmpdepfile"
-  fi
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-
-  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
-    echo "$object : \\" > "$depfile"
-
-    # Clip off the initial element (the dependent).  Don't try to be
-    # clever and replace this with sed code, as IRIX sed won't handle
-    # lines with more than a fixed number of characters (4096 in
-    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
-    # the IRIX cc adds comments like `#:fec' to the end of the
-    # dependency line.
-    tr ' ' '
-' < "$tmpdepfile" \
-    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
-    tr '
-' ' ' >> "$depfile"
-    echo >> "$depfile"
-
-    # The second pass generates a dummy entry for each header file.
-    tr ' ' '
-' < "$tmpdepfile" \
-   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
-   >> "$depfile"
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile"
-  ;;
-
-aix)
-  # The C for AIX Compiler uses -M and outputs the dependencies
-  # in a .u file.  In older versions, this file always lives in the
-  # current directory.  Also, the AIX compiler puts `$object:' at the
-  # start of each line; $object doesn't have directory information.
-  # Version 6 uses the directory in both cases.
-  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-  test "x$dir" = "x$object" && dir=
-  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-  if test "$libtool" = yes; then
-    tmpdepfile1=$dir$base.u
-    tmpdepfile2=$base.u
-    tmpdepfile3=$dir.libs/$base.u
-    "$@" -Wc,-M
-  else
-    tmpdepfile1=$dir$base.u
-    tmpdepfile2=$dir$base.u
-    tmpdepfile3=$dir$base.u
-    "$@" -M
-  fi
-  stat=$?
-
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
-    exit $stat
-  fi
-
-  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
-  do
-    test -f "$tmpdepfile" && break
-  done
-  if test -f "$tmpdepfile"; then
-    # Each line is of the form `foo.o: dependent.h'.
-    # Do two passes, one to just change these to
-    # `$object: dependent.h' and one to simply `dependent.h:'.
-    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-    # That's a tab and a space in the [].
-    sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile"
-  ;;
-
-icc)
-  # Intel's C compiler understands `-MD -MF file'.  However on
-  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
-  # ICC 7.0 will fill foo.d with something like
-  #    foo.o: sub/foo.c
-  #    foo.o: sub/foo.h
-  # which is wrong.  We want:
-  #    sub/foo.o: sub/foo.c
-  #    sub/foo.o: sub/foo.h
-  #    sub/foo.c:
-  #    sub/foo.h:
-  # ICC 7.1 will output
-  #    foo.o: sub/foo.c sub/foo.h
-  # and will wrap long lines using \ :
-  #    foo.o: sub/foo.c ... \
-  #     sub/foo.h ... \
-  #     ...
-
-  "$@" -MD -MF "$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  # Each line is of the form `foo.o: dependent.h',
-  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
-  # Do two passes, one to just change these to
-  # `$object: dependent.h' and one to simply `dependent.h:'.
-  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
-  # Some versions of the HPUX 10.20 sed can't process this invocation
-  # correctly.  Breaking it into two sed invocations is a workaround.
-  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
-    sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-hp2)
-  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
-  # compilers, which have integrated preprocessors.  The correct option
-  # to use with these is +Maked; it writes dependencies to a file named
-  # 'foo.d', which lands next to the object file, wherever that
-  # happens to be.
-  # Much of this is similar to the tru64 case; see comments there.
-  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-  test "x$dir" = "x$object" && dir=
-  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-  if test "$libtool" = yes; then
-    tmpdepfile1=$dir$base.d
-    tmpdepfile2=$dir.libs/$base.d
-    "$@" -Wc,+Maked
-  else
-    tmpdepfile1=$dir$base.d
-    tmpdepfile2=$dir$base.d
-    "$@" +Maked
-  fi
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-     rm -f "$tmpdepfile1" "$tmpdepfile2"
-     exit $stat
-  fi
-
-  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
-  do
-    test -f "$tmpdepfile" && break
-  done
-  if test -f "$tmpdepfile"; then
-    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
-    # Add `dependent.h:' lines.
-    sed -ne '2,${
-	       s/^ *//
-	       s/ \\*$//
-	       s/$/:/
-	       p
-	     }' "$tmpdepfile" >> "$depfile"
-  else
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile" "$tmpdepfile2"
-  ;;
-
-tru64)
-   # The Tru64 compiler uses -MD to generate dependencies as a side
-   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
-   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
-   # dependencies in `foo.d' instead, so we check for that too.
-   # Subdirectories are respected.
-   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-   test "x$dir" = "x$object" && dir=
-   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-
-   if test "$libtool" = yes; then
-      # With Tru64 cc, shared objects can also be used to make a
-      # static library.  This mechanism is used in libtool 1.4 series to
-      # handle both shared and static libraries in a single compilation.
-      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
-      #
-      # With libtool 1.5 this exception was removed, and libtool now
-      # generates 2 separate objects for the 2 libraries.  These two
-      # compilations output dependencies in $dir.libs/$base.o.d and
-      # in $dir$base.o.d.  We have to check for both files, because
-      # one of the two compilations can be disabled.  We should prefer
-      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
-      # automatically cleaned when .libs/ is deleted, while ignoring
-      # the former would cause a distcleancheck panic.
-      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
-      tmpdepfile2=$dir$base.o.d          # libtool 1.5
-      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
-      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
-      "$@" -Wc,-MD
-   else
-      tmpdepfile1=$dir$base.o.d
-      tmpdepfile2=$dir$base.d
-      tmpdepfile3=$dir$base.d
-      tmpdepfile4=$dir$base.d
-      "$@" -MD
-   fi
-
-   stat=$?
-   if test $stat -eq 0; then :
-   else
-      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-      exit $stat
-   fi
-
-   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-   do
-     test -f "$tmpdepfile" && break
-   done
-   if test -f "$tmpdepfile"; then
-      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-      # That's a tab and a space in the [].
-      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-   else
-      echo "#dummy" > "$depfile"
-   fi
-   rm -f "$tmpdepfile"
-   ;;
-
-#nosideeffect)
-  # This comment above is used by automake to tell side-effect
-  # dependency tracking mechanisms from slower ones.
-
-dashmstdout)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout, regardless of -o.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove `-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  test -z "$dashmflag" && dashmflag=-M
-  # Require at least two characters before searching for `:'
-  # in the target name.  This is to cope with DOS-style filenames:
-  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
-  "$@" $dashmflag |
-    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
-  rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  tr ' ' '
-' < "$tmpdepfile" | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-dashXmstdout)
-  # This case only exists to satisfy depend.m4.  It is never actually
-  # run, as this mode is specially recognized in the preamble.
-  exit 1
-  ;;
-
-makedepend)
-  "$@" || exit $?
-  # Remove any Libtool call
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-  # X makedepend
-  shift
-  cleared=no eat=no
-  for arg
-  do
-    case $cleared in
-    no)
-      set ""; shift
-      cleared=yes ;;
-    esac
-    if test $eat = yes; then
-      eat=no
-      continue
-    fi
-    case "$arg" in
-    -D*|-I*)
-      set fnord "$@" "$arg"; shift ;;
-    # Strip any option that makedepend may not understand.  Remove
-    # the object too, otherwise makedepend will parse it as a source file.
-    -arch)
-      eat=yes ;;
-    -*|$object)
-      ;;
-    *)
-      set fnord "$@" "$arg"; shift ;;
-    esac
-  done
-  obj_suffix=`echo "$object" | sed 's/^.*\././'`
-  touch "$tmpdepfile"
-  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
-  rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  sed '1,2d' "$tmpdepfile" | tr ' ' '
-' | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile" "$tmpdepfile".bak
-  ;;
-
-cpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove `-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  "$@" -E |
-    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
-       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
-    sed '$ s: \\$::' > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  cat < "$tmpdepfile" >> "$depfile"
-  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-msvisualcpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  IFS=" "
-  for arg
-  do
-    case "$arg" in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
-	set fnord "$@"
-	shift
-	shift
-	;;
-    *)
-	set fnord "$@" "$arg"
-	shift
-	shift
-	;;
-    esac
-  done
-  "$@" -E 2>/dev/null |
-  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
-  echo "	" >> "$depfile"
-  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-msvcmsys)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-none)
-  exec "$@"
-  ;;
-
-*)
-  echo "Unknown depmode $depmode" 1>&2
-  exit 1
-  ;;
-esac
-
-exit 0
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/cloog-0.17.0/autoconf/install-sh b/cloog-0.17.0/autoconf/install-sh
deleted file mode 100755
index 6781b98..0000000
--- a/cloog-0.17.0/autoconf/install-sh
+++ /dev/null
@@ -1,520 +0,0 @@
-#!/bin/sh
-# install - install a program, script, or datafile
-
-scriptversion=2009-04-28.21; # UTC
-
-# This originates from X11R5 (mit/util/scripts/install.sh), which was
-# later released in X11R6 (xc/config/util/install.sh) with the
-# following copyright and license.
-#
-# Copyright (C) 1994 X Consortium
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
-# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-# Except as contained in this notice, the name of the X Consortium shall not
-# be used in advertising or otherwise to promote the sale, use or other deal-
-# ings in this Software without prior written authorization from the X Consor-
-# tium.
-#
-#
-# FSF changes to this file are in the public domain.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.
-
-nl='
-'
-IFS=" ""	$nl"
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit=${DOITPROG-}
-if test -z "$doit"; then
-  doit_exec=exec
-else
-  doit_exec=$doit
-fi
-
-# Put in absolute file names if you don't have them in your path;
-# or use environment vars.
-
-chgrpprog=${CHGRPPROG-chgrp}
-chmodprog=${CHMODPROG-chmod}
-chownprog=${CHOWNPROG-chown}
-cmpprog=${CMPPROG-cmp}
-cpprog=${CPPROG-cp}
-mkdirprog=${MKDIRPROG-mkdir}
-mvprog=${MVPROG-mv}
-rmprog=${RMPROG-rm}
-stripprog=${STRIPPROG-strip}
-
-posix_glob='?'
-initialize_posix_glob='
-  test "$posix_glob" != "?" || {
-    if (set -f) 2>/dev/null; then
-      posix_glob=
-    else
-      posix_glob=:
-    fi
-  }
-'
-
-posix_mkdir=
-
-# Desired mode of installed file.
-mode=0755
-
-chgrpcmd=
-chmodcmd=$chmodprog
-chowncmd=
-mvcmd=$mvprog
-rmcmd="$rmprog -f"
-stripcmd=
-
-src=
-dst=
-dir_arg=
-dst_arg=
-
-copy_on_change=false
-no_target_directory=
-
-usage="\
-Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
-   or: $0 [OPTION]... SRCFILES... DIRECTORY
-   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
-   or: $0 [OPTION]... -d DIRECTORIES...
-
-In the 1st form, copy SRCFILE to DSTFILE.
-In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
-In the 4th, create DIRECTORIES.
-
-Options:
-     --help     display this help and exit.
-     --version  display version info and exit.
-
-  -c            (ignored)
-  -C            install only if different (preserve the last data modification time)
-  -d            create directories instead of installing files.
-  -g GROUP      $chgrpprog installed files to GROUP.
-  -m MODE       $chmodprog installed files to MODE.
-  -o USER       $chownprog installed files to USER.
-  -s            $stripprog installed files.
-  -t DIRECTORY  install into DIRECTORY.
-  -T            report an error if DSTFILE is a directory.
-
-Environment variables override the default commands:
-  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
-  RMPROG STRIPPROG
-"
-
-while test $# -ne 0; do
-  case $1 in
-    -c) ;;
-
-    -C) copy_on_change=true;;
-
-    -d) dir_arg=true;;
-
-    -g) chgrpcmd="$chgrpprog $2"
-	shift;;
-
-    --help) echo "$usage"; exit $?;;
-
-    -m) mode=$2
-	case $mode in
-	  *' '* | *'	'* | *'
-'*	  | *'*'* | *'?'* | *'['*)
-	    echo "$0: invalid mode: $mode" >&2
-	    exit 1;;
-	esac
-	shift;;
-
-    -o) chowncmd="$chownprog $2"
-	shift;;
-
-    -s) stripcmd=$stripprog;;
-
-    -t) dst_arg=$2
-	shift;;
-
-    -T) no_target_directory=true;;
-
-    --version) echo "$0 $scriptversion"; exit $?;;
-
-    --)	shift
-	break;;
-
-    -*)	echo "$0: invalid option: $1" >&2
-	exit 1;;
-
-    *)  break;;
-  esac
-  shift
-done
-
-if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
-  # When -d is used, all remaining arguments are directories to create.
-  # When -t is used, the destination is already specified.
-  # Otherwise, the last argument is the destination.  Remove it from $@.
-  for arg
-  do
-    if test -n "$dst_arg"; then
-      # $@ is not empty: it contains at least $arg.
-      set fnord "$@" "$dst_arg"
-      shift # fnord
-    fi
-    shift # arg
-    dst_arg=$arg
-  done
-fi
-
-if test $# -eq 0; then
-  if test -z "$dir_arg"; then
-    echo "$0: no input file specified." >&2
-    exit 1
-  fi
-  # It's OK to call `install-sh -d' without argument.
-  # This can happen when creating conditional directories.
-  exit 0
-fi
-
-if test -z "$dir_arg"; then
-  trap '(exit $?); exit' 1 2 13 15
-
-  # Set umask so as not to create temps with too-generous modes.
-  # However, 'strip' requires both read and write access to temps.
-  case $mode in
-    # Optimize common cases.
-    *644) cp_umask=133;;
-    *755) cp_umask=22;;
-
-    *[0-7])
-      if test -z "$stripcmd"; then
-	u_plus_rw=
-      else
-	u_plus_rw='% 200'
-      fi
-      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
-    *)
-      if test -z "$stripcmd"; then
-	u_plus_rw=
-      else
-	u_plus_rw=,u+rw
-      fi
-      cp_umask=$mode$u_plus_rw;;
-  esac
-fi
-
-for src
-do
-  # Protect names starting with `-'.
-  case $src in
-    -*) src=./$src;;
-  esac
-
-  if test -n "$dir_arg"; then
-    dst=$src
-    dstdir=$dst
-    test -d "$dstdir"
-    dstdir_status=$?
-  else
-
-    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
-    # might cause directories to be created, which would be especially bad
-    # if $src (and thus $dsttmp) contains '*'.
-    if test ! -f "$src" && test ! -d "$src"; then
-      echo "$0: $src does not exist." >&2
-      exit 1
-    fi
-
-    if test -z "$dst_arg"; then
-      echo "$0: no destination specified." >&2
-      exit 1
-    fi
-
-    dst=$dst_arg
-    # Protect names starting with `-'.
-    case $dst in
-      -*) dst=./$dst;;
-    esac
-
-    # If destination is a directory, append the input filename; won't work
-    # if double slashes aren't ignored.
-    if test -d "$dst"; then
-      if test -n "$no_target_directory"; then
-	echo "$0: $dst_arg: Is a directory" >&2
-	exit 1
-      fi
-      dstdir=$dst
-      dst=$dstdir/`basename "$src"`
-      dstdir_status=0
-    else
-      # Prefer dirname, but fall back on a substitute if dirname fails.
-      dstdir=`
-	(dirname "$dst") 2>/dev/null ||
-	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	     X"$dst" : 'X\(//\)[^/]' \| \
-	     X"$dst" : 'X\(//\)$' \| \
-	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
-	echo X"$dst" |
-	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)[^/].*/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\).*/{
-		   s//\1/
-		   q
-		 }
-		 s/.*/./; q'
-      `
-
-      test -d "$dstdir"
-      dstdir_status=$?
-    fi
-  fi
-
-  obsolete_mkdir_used=false
-
-  if test $dstdir_status != 0; then
-    case $posix_mkdir in
-      '')
-	# Create intermediate dirs using mode 755 as modified by the umask.
-	# This is like FreeBSD 'install' as of 1997-10-28.
-	umask=`umask`
-	case $stripcmd.$umask in
-	  # Optimize common cases.
-	  *[2367][2367]) mkdir_umask=$umask;;
-	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
-	  *[0-7])
-	    mkdir_umask=`expr $umask + 22 \
-	      - $umask % 100 % 40 + $umask % 20 \
-	      - $umask % 10 % 4 + $umask % 2
-	    `;;
-	  *) mkdir_umask=$umask,go-w;;
-	esac
-
-	# With -d, create the new directory with the user-specified mode.
-	# Otherwise, rely on $mkdir_umask.
-	if test -n "$dir_arg"; then
-	  mkdir_mode=-m$mode
-	else
-	  mkdir_mode=
-	fi
-
-	posix_mkdir=false
-	case $umask in
-	  *[123567][0-7][0-7])
-	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
-	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-	    ;;
-	  *)
-	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-	    if (umask $mkdir_umask &&
-		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
-	    then
-	      if test -z "$dir_arg" || {
-		   # Check for POSIX incompatibilities with -m.
-		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-		   # other-writeable bit of parent directory when it shouldn't.
-		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
-		   case $ls_ld_tmpdir in
-		     d????-?r-*) different_mode=700;;
-		     d????-?--*) different_mode=755;;
-		     *) false;;
-		   esac &&
-		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
-		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
-		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-		   }
-		 }
-	      then posix_mkdir=:
-	      fi
-	      rmdir "$tmpdir/d" "$tmpdir"
-	    else
-	      # Remove any dirs left behind by ancient mkdir implementations.
-	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
-	    fi
-	    trap '' 0;;
-	esac;;
-    esac
-
-    if
-      $posix_mkdir && (
-	umask $mkdir_umask &&
-	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
-      )
-    then :
-    else
-
-      # The umask is ridiculous, or mkdir does not conform to POSIX,
-      # or it failed possibly due to a race condition.  Create the
-      # directory the slow way, step by step, checking for races as we go.
-
-      case $dstdir in
-	/*) prefix='/';;
-	-*) prefix='./';;
-	*)  prefix='';;
-      esac
-
-      eval "$initialize_posix_glob"
-
-      oIFS=$IFS
-      IFS=/
-      $posix_glob set -f
-      set fnord $dstdir
-      shift
-      $posix_glob set +f
-      IFS=$oIFS
-
-      prefixes=
-
-      for d
-      do
-	test -z "$d" && continue
-
-	prefix=$prefix$d
-	if test -d "$prefix"; then
-	  prefixes=
-	else
-	  if $posix_mkdir; then
-	    (umask=$mkdir_umask &&
-	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-	    # Don't fail if two instances are running concurrently.
-	    test -d "$prefix" || exit 1
-	  else
-	    case $prefix in
-	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-	      *) qprefix=$prefix;;
-	    esac
-	    prefixes="$prefixes '$qprefix'"
-	  fi
-	fi
-	prefix=$prefix/
-      done
-
-      if test -n "$prefixes"; then
-	# Don't fail if two instances are running concurrently.
-	(umask $mkdir_umask &&
-	 eval "\$doit_exec \$mkdirprog $prefixes") ||
-	  test -d "$dstdir" || exit 1
-	obsolete_mkdir_used=true
-      fi
-    fi
-  fi
-
-  if test -n "$dir_arg"; then
-    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
-    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
-      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
-  else
-
-    # Make a couple of temp file names in the proper directory.
-    dsttmp=$dstdir/_inst.$$_
-    rmtmp=$dstdir/_rm.$$_
-
-    # Trap to clean up those temp files at exit.
-    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
-
-    # Copy the file name to the temp name.
-    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
-
-    # and set any options; do chmod last to preserve setuid bits.
-    #
-    # If any of these fail, we abort the whole thing.  If we want to
-    # ignore errors from any of these, just make sure not to ignore
-    # errors from the above "$doit $cpprog $src $dsttmp" command.
-    #
-    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
-    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
-    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
-
-    # If -C, don't bother to copy if it wouldn't change the file.
-    if $copy_on_change &&
-       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
-       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
-
-       eval "$initialize_posix_glob" &&
-       $posix_glob set -f &&
-       set X $old && old=:$2:$4:$5:$6 &&
-       set X $new && new=:$2:$4:$5:$6 &&
-       $posix_glob set +f &&
-
-       test "$old" = "$new" &&
-       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
-    then
-      rm -f "$dsttmp"
-    else
-      # Rename the file to the real destination.
-      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
-
-      # The rename failed, perhaps because mv can't rename something else
-      # to itself, or perhaps because mv is so ancient that it does not
-      # support -f.
-      {
-	# Now remove or move aside any old file at destination location.
-	# We try this two ways since rm can't unlink itself on some
-	# systems and the destination file might be busy for other
-	# reasons.  In this case, the final cleanup might fail but the new
-	# file should still install successfully.
-	{
-	  test ! -f "$dst" ||
-	  $doit $rmcmd -f "$dst" 2>/dev/null ||
-	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
-	  } ||
-	  { echo "$0: cannot unlink or rename $dst" >&2
-	    (exit 1); exit 1
-	  }
-	} &&
-
-	# Now rename the file to the real destination.
-	$doit $mvcmd "$dsttmp" "$dst"
-      }
-    fi || exit 1
-
-    trap '' 0
-  fi
-done
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/cloog-0.17.0/autoconf/ltmain.sh b/cloog-0.17.0/autoconf/ltmain.sh
deleted file mode 100755
index fa4b1e1..0000000
--- a/cloog-0.17.0/autoconf/ltmain.sh
+++ /dev/null
@@ -1,8413 +0,0 @@
-# Generated from ltmain.m4sh.
-
-# ltmain.sh (GNU libtool) 2.2.6b
-# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 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.
-
-# GNU Libtool is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html,
-# or obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-# Usage: $progname [OPTION]... [MODE-ARG]...
-#
-# Provide generalized library-building support services.
-#
-#     --config             show all configuration variables
-#     --debug              enable verbose shell tracing
-# -n, --dry-run            display commands without modifying any files
-#     --features           display basic configuration information and exit
-#     --mode=MODE          use operation mode MODE
-#     --preserve-dup-deps  don't remove duplicate dependency libraries
-#     --quiet, --silent    don't print informational messages
-#     --tag=TAG            use configuration variables from tag TAG
-# -v, --verbose            print informational messages (default)
-#     --version            print version information
-# -h, --help               print short or long help message
-#
-# MODE must be one of the following:
-#
-#       clean              remove files from the build directory
-#       compile            compile a source file into a libtool object
-#       execute            automatically set library path, then run a program
-#       finish             complete the installation of libtool libraries
-#       install            install libraries or executables
-#       link               create a library or an executable
-#       uninstall          remove libraries from an installed directory
-#
-# MODE-ARGS vary depending on the MODE.
-# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
-#
-# When reporting a bug, please describe a test case to reproduce it and
-# include the following information:
-#
-#       host-triplet:	$host
-#       shell:		$SHELL
-#       compiler:		$LTCC
-#       compiler flags:		$LTCFLAGS
-#       linker:		$LD (gnu? $with_gnu_ld)
-#       $progname:		(GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu3
-#       automake:		$automake_version
-#       autoconf:		$autoconf_version
-#
-# Report bugs to <bug-libtool@gnu.org>.
-
-PROGRAM=ltmain.sh
-PACKAGE=libtool
-VERSION="2.2.6b Debian-2.2.6b-2ubuntu3"
-TIMESTAMP=""
-package_revision=1.3017
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# NLS nuisances: We save the old values to restore during execute mode.
-# Only set LANG and LC_ALL to C if already set.
-# These must not be set unconditionally because not all systems understand
-# e.g. LANG=C (notably SCO).
-lt_user_locale=
-lt_safe_locale=
-for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-do
-  eval "if test \"\${$lt_var+set}\" = set; then
-          save_$lt_var=\$$lt_var
-          $lt_var=C
-	  export $lt_var
-	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
-	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
-	fi"
-done
-
-$lt_unset CDPATH
-
-
-
-
-
-: ${CP="cp -f"}
-: ${ECHO="echo"}
-: ${EGREP="/bin/grep -E"}
-: ${FGREP="/bin/grep -F"}
-: ${GREP="/bin/grep"}
-: ${LN_S="ln -s"}
-: ${MAKE="make"}
-: ${MKDIR="mkdir"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-: ${SED="/bin/sed"}
-: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
-: ${Xsed="$SED -e 1s/^X//"}
-
-# Global variables:
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
-EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
-
-exit_status=$EXIT_SUCCESS
-
-# Make sure IFS has a sensible default
-lt_nl='
-'
-IFS=" 	$lt_nl"
-
-dirname="s,/[^/]*$,,"
-basename="s,^.*/,,"
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
-}
-
-# Generated shell functions inserted here.
-
-# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
-# is ksh but when the shell is invoked as "sh" and the current value of
-# the _XPG environment variable is not equal to 1 (one), the special
-# positional parameter $0, within a function call, is the name of the
-# function.
-progpath="$0"
-
-# The name of this program:
-# In the unlikely event $progname began with a '-', it would play havoc with
-# func_echo (imagine progname=-n), so we prepend ./ in that case:
-func_dirname_and_basename "$progpath"
-progname=$func_basename_result
-case $progname in
-  -*) progname=./$progname ;;
-esac
-
-# Make sure we have an absolute path for reexecution:
-case $progpath in
-  [\\/]*|[A-Za-z]:\\*) ;;
-  *[\\/]*)
-     progdir=$func_dirname_result
-     progdir=`cd "$progdir" && pwd`
-     progpath="$progdir/$progname"
-     ;;
-  *)
-     save_IFS="$IFS"
-     IFS=:
-     for progdir in $PATH; do
-       IFS="$save_IFS"
-       test -x "$progdir/$progname" && break
-     done
-     IFS="$save_IFS"
-     test -n "$progdir" || progdir=`pwd`
-     progpath="$progdir/$progname"
-     ;;
-esac
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed="${SED}"' -e 1s/^X//'
-sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Re-`\' parameter expansions in output of double_quote_subst that were
-# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
-# in input to double_quote_subst, that '$' was protected from expansion.
-# Since each input `\' is now two `\'s, look for any number of runs of
-# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
-bs='\\'
-bs2='\\\\'
-bs4='\\\\\\\\'
-dollar='\$'
-sed_double_backslash="\
-  s/$bs4/&\\
-/g
-  s/^$bs2$dollar/$bs&/
-  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
-  s/\n//g"
-
-# Standard options:
-opt_dry_run=false
-opt_help=false
-opt_quiet=false
-opt_verbose=false
-opt_warning=:
-
-# func_echo arg...
-# Echo program name prefixed message, along with the current mode
-# name if it has been set yet.
-func_echo ()
-{
-    $ECHO "$progname${mode+: }$mode: $*"
-}
-
-# func_verbose arg...
-# Echo program name prefixed message in verbose mode only.
-func_verbose ()
-{
-    $opt_verbose && func_echo ${1+"$@"}
-
-    # A bug in bash halts the script if the last line of a function
-    # fails when set -e is in force, so we need another command to
-    # work around that:
-    :
-}
-
-# func_error arg...
-# Echo program name prefixed message to standard error.
-func_error ()
-{
-    $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2
-}
-
-# func_warning arg...
-# Echo program name prefixed warning message to standard error.
-func_warning ()
-{
-    $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2
-
-    # bash bug again:
-    :
-}
-
-# func_fatal_error arg...
-# Echo program name prefixed message to standard error, and exit.
-func_fatal_error ()
-{
-    func_error ${1+"$@"}
-    exit $EXIT_FAILURE
-}
-
-# func_fatal_help arg...
-# Echo program name prefixed message to standard error, followed by
-# a help hint, and exit.
-func_fatal_help ()
-{
-    func_error ${1+"$@"}
-    func_fatal_error "$help"
-}
-help="Try \`$progname --help' for more information."  ## default
-
-
-# func_grep expression filename
-# Check whether EXPRESSION matches any line of FILENAME, without output.
-func_grep ()
-{
-    $GREP "$1" "$2" >/dev/null 2>&1
-}
-
-
-# func_mkdir_p directory-path
-# Make sure the entire path to DIRECTORY-PATH is available.
-func_mkdir_p ()
-{
-    my_directory_path="$1"
-    my_dir_list=
-
-    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
-
-      # Protect directory names starting with `-'
-      case $my_directory_path in
-        -*) my_directory_path="./$my_directory_path" ;;
-      esac
-
-      # While some portion of DIR does not yet exist...
-      while test ! -d "$my_directory_path"; do
-        # ...make a list in topmost first order.  Use a colon delimited
-	# list incase some portion of path contains whitespace.
-        my_dir_list="$my_directory_path:$my_dir_list"
-
-        # If the last portion added has no slash in it, the list is done
-        case $my_directory_path in */*) ;; *) break ;; esac
-
-        # ...otherwise throw away the child directory and loop
-        my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"`
-      done
-      my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'`
-
-      save_mkdir_p_IFS="$IFS"; IFS=':'
-      for my_dir in $my_dir_list; do
-	IFS="$save_mkdir_p_IFS"
-        # mkdir can fail with a `File exist' error if two processes
-        # try to create one of the directories concurrently.  Don't
-        # stop in that case!
-        $MKDIR "$my_dir" 2>/dev/null || :
-      done
-      IFS="$save_mkdir_p_IFS"
-
-      # Bail out if we (or some other process) failed to create a directory.
-      test -d "$my_directory_path" || \
-        func_fatal_error "Failed to create \`$1'"
-    fi
-}
-
-
-# func_mktempdir [string]
-# Make a temporary directory that won't clash with other running
-# libtool processes, and avoids race conditions if possible.  If
-# given, STRING is the basename for that directory.
-func_mktempdir ()
-{
-    my_template="${TMPDIR-/tmp}/${1-$progname}"
-
-    if test "$opt_dry_run" = ":"; then
-      # Return a directory name, but don't create it in dry-run mode
-      my_tmpdir="${my_template}-$$"
-    else
-
-      # If mktemp works, use that first and foremost
-      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
-
-      if test ! -d "$my_tmpdir"; then
-        # Failing that, at least try and use $RANDOM to avoid a race
-        my_tmpdir="${my_template}-${RANDOM-0}$$"
-
-        save_mktempdir_umask=`umask`
-        umask 0077
-        $MKDIR "$my_tmpdir"
-        umask $save_mktempdir_umask
-      fi
-
-      # If we're not in dry-run mode, bomb out on failure
-      test -d "$my_tmpdir" || \
-        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
-    fi
-
-    $ECHO "X$my_tmpdir" | $Xsed
-}
-
-
-# func_quote_for_eval arg
-# Aesthetically quote ARG to be evaled later.
-# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
-# is double-quoted, suitable for a subsequent eval, whereas
-# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
-# which are still active within double quotes backslashified.
-func_quote_for_eval ()
-{
-    case $1 in
-      *[\\\`\"\$]*)
-	func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;;
-      *)
-        func_quote_for_eval_unquoted_result="$1" ;;
-    esac
-
-    case $func_quote_for_eval_unquoted_result in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting, command substitution and and variable
-      # expansion for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
-        ;;
-      *)
-        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
-    esac
-}
-
-
-# func_quote_for_expand arg
-# Aesthetically quote ARG to be evaled later; same as above,
-# but do not quote variable references.
-func_quote_for_expand ()
-{
-    case $1 in
-      *[\\\`\"]*)
-	my_arg=`$ECHO "X$1" | $Xsed \
-	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
-      *)
-        my_arg="$1" ;;
-    esac
-
-    case $my_arg in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting and command substitution for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        my_arg="\"$my_arg\""
-        ;;
-    esac
-
-    func_quote_for_expand_result="$my_arg"
-}
-
-
-# func_show_eval cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.
-func_show_eval ()
-{
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
-
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
-
-    if ${opt_dry_run-false}; then :; else
-      eval "$my_cmd"
-      my_status=$?
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
-}
-
-
-# func_show_eval_locale cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.  Use the saved locale for evaluation.
-func_show_eval_locale ()
-{
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
-
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
-
-    if ${opt_dry_run-false}; then :; else
-      eval "$lt_user_locale
-	    $my_cmd"
-      my_status=$?
-      eval "$lt_safe_locale"
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
-}
-
-
-
-
-
-# func_version
-# Echo version message to standard output and exit.
-func_version ()
-{
-    $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / {
-        s/^# //
-	s/^# *$//
-        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
-        p
-     }' < "$progpath"
-     exit $?
-}
-
-# func_usage
-# Echo short help message to standard output and exit.
-func_usage ()
-{
-    $SED -n '/^# Usage:/,/# -h/ {
-        s/^# //
-	s/^# *$//
-	s/\$progname/'$progname'/
-	p
-    }' < "$progpath"
-    $ECHO
-    $ECHO "run \`$progname --help | more' for full usage"
-    exit $?
-}
-
-# func_help
-# Echo long help message to standard output and exit.
-func_help ()
-{
-    $SED -n '/^# Usage:/,/# Report bugs to/ {
-        s/^# //
-	s/^# *$//
-	s*\$progname*'$progname'*
-	s*\$host*'"$host"'*
-	s*\$SHELL*'"$SHELL"'*
-	s*\$LTCC*'"$LTCC"'*
-	s*\$LTCFLAGS*'"$LTCFLAGS"'*
-	s*\$LD*'"$LD"'*
-	s/\$with_gnu_ld/'"$with_gnu_ld"'/
-	s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/
-	s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/
-	p
-     }' < "$progpath"
-    exit $?
-}
-
-# func_missing_arg argname
-# Echo program name prefixed message to standard error and set global
-# exit_cmd.
-func_missing_arg ()
-{
-    func_error "missing argument for $1"
-    exit_cmd=exit
-}
-
-exit_cmd=:
-
-
-
-
-
-# Check that we have a working $ECHO.
-if test "X$1" = X--no-reexec; then
-  # Discard the --no-reexec flag, and continue.
-  shift
-elif test "X$1" = X--fallback-echo; then
-  # Avoid inline document here, it may be left over
-  :
-elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then
-  # Yippee, $ECHO works!
-  :
-else
-  # Restart under the correct shell, and then maybe $ECHO will work.
-  exec $SHELL "$progpath" --no-reexec ${1+"$@"}
-fi
-
-if test "X$1" = X--fallback-echo; then
-  # used as fallback echo
-  shift
-  cat <<EOF
-$*
-EOF
-  exit $EXIT_SUCCESS
-fi
-
-magic="%%%MAGIC variable%%%"
-magic_exe="%%%MAGIC EXE variable%%%"
-
-# Global variables.
-# $mode is unset
-nonopt=
-execute_dlfiles=
-preserve_args=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
-extracted_archives=
-extracted_serial=0
-
-opt_dry_run=false
-opt_duplicate_deps=false
-opt_silent=false
-opt_debug=:
-
-# If this variable is set in any of the actions, the command in it
-# will be execed at the end.  This prevents here-documents from being
-# left over by shells.
-exec_cmd=
-
-# func_fatal_configuration arg...
-# Echo program name prefixed message to standard error, followed by
-# a configuration failure hint, and exit.
-func_fatal_configuration ()
-{
-    func_error ${1+"$@"}
-    func_error "See the $PACKAGE documentation for more information."
-    func_fatal_error "Fatal configuration error."
-}
-
-
-# func_config
-# Display the configuration for all the tags in this script.
-func_config ()
-{
-    re_begincf='^# ### BEGIN LIBTOOL'
-    re_endcf='^# ### END LIBTOOL'
-
-    # Default configuration.
-    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
-
-    # Now print the configurations for the tags.
-    for tagname in $taglist; do
-      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
-    done
-
-    exit $?
-}
-
-# func_features
-# Display the features supported by this script.
-func_features ()
-{
-    $ECHO "host: $host"
-    if test "$build_libtool_libs" = yes; then
-      $ECHO "enable shared libraries"
-    else
-      $ECHO "disable shared libraries"
-    fi
-    if test "$build_old_libs" = yes; then
-      $ECHO "enable static libraries"
-    else
-      $ECHO "disable static libraries"
-    fi
-
-    exit $?
-}
-
-# func_enable_tag tagname
-# Verify that TAGNAME is valid, and either flag an error and exit, or
-# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
-# variable here.
-func_enable_tag ()
-{
-  # Global variable:
-  tagname="$1"
-
-  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
-  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
-  sed_extractcf="/$re_begincf/,/$re_endcf/p"
-
-  # Validate tagname.
-  case $tagname in
-    *[!-_A-Za-z0-9,/]*)
-      func_fatal_error "invalid tag name: $tagname"
-      ;;
-  esac
-
-  # Don't test for the "default" C tag, as we know it's
-  # there but not specially marked.
-  case $tagname in
-    CC) ;;
-    *)
-      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
-	taglist="$taglist $tagname"
-
-	# Evaluate the configuration.  Be careful to quote the path
-	# and the sed script, to avoid splitting on whitespace, but
-	# also don't use non-portable quotes within backquotes within
-	# quotes we have to do it in 2 steps:
-	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
-	eval "$extractedcf"
-      else
-	func_error "ignoring unknown tag $tagname"
-      fi
-      ;;
-  esac
-}
-
-# Parse options once, thoroughly.  This comes as soon as possible in
-# the script to make things like `libtool --version' happen quickly.
-{
-
-  # Shorthand for --mode=foo, only valid as the first argument
-  case $1 in
-  clean|clea|cle|cl)
-    shift; set dummy --mode clean ${1+"$@"}; shift
-    ;;
-  compile|compil|compi|comp|com|co|c)
-    shift; set dummy --mode compile ${1+"$@"}; shift
-    ;;
-  execute|execut|execu|exec|exe|ex|e)
-    shift; set dummy --mode execute ${1+"$@"}; shift
-    ;;
-  finish|finis|fini|fin|fi|f)
-    shift; set dummy --mode finish ${1+"$@"}; shift
-    ;;
-  install|instal|insta|inst|ins|in|i)
-    shift; set dummy --mode install ${1+"$@"}; shift
-    ;;
-  link|lin|li|l)
-    shift; set dummy --mode link ${1+"$@"}; shift
-    ;;
-  uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
-    shift; set dummy --mode uninstall ${1+"$@"}; shift
-    ;;
-  esac
-
-  # Parse non-mode specific arguments:
-  while test "$#" -gt 0; do
-    opt="$1"
-    shift
-
-    case $opt in
-      --config)		func_config					;;
-
-      --debug)		preserve_args="$preserve_args $opt"
-			func_echo "enabling shell trace mode"
-			opt_debug='set -x'
-			$opt_debug
-			;;
-
-      -dlopen)		test "$#" -eq 0 && func_missing_arg "$opt" && break
-			execute_dlfiles="$execute_dlfiles $1"
-			shift
-			;;
-
-      --dry-run | -n)	opt_dry_run=:					;;
-      --features)       func_features					;;
-      --finish)		mode="finish"					;;
-
-      --mode)		test "$#" -eq 0 && func_missing_arg "$opt" && break
-			case $1 in
-			  # Valid mode arguments:
-			  clean)	;;
-			  compile)	;;
-			  execute)	;;
-			  finish)	;;
-			  install)	;;
-			  link)		;;
-			  relink)	;;
-			  uninstall)	;;
-
-			  # Catch anything else as an error
-			  *) func_error "invalid argument for $opt"
-			     exit_cmd=exit
-			     break
-			     ;;
-		        esac
-
-			mode="$1"
-			shift
-			;;
-
-      --preserve-dup-deps)
-			opt_duplicate_deps=:				;;
-
-      --quiet|--silent)	preserve_args="$preserve_args $opt"
-			opt_silent=:
-			;;
-
-      --verbose| -v)	preserve_args="$preserve_args $opt"
-			opt_silent=false
-			;;
-
-      --tag)		test "$#" -eq 0 && func_missing_arg "$opt" && break
-			preserve_args="$preserve_args $opt $1"
-			func_enable_tag "$1"	# tagname is set here
-			shift
-			;;
-
-      # Separate optargs to long options:
-      -dlopen=*|--mode=*|--tag=*)
-			func_opt_split "$opt"
-			set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"}
-			shift
-			;;
-
-      -\?|-h)		func_usage					;;
-      --help)		opt_help=:					;;
-      --version)	func_version					;;
-
-      -*)		func_fatal_help "unrecognized option \`$opt'"	;;
-
-      *)		nonopt="$opt"
-			break
-			;;
-    esac
-  done
-
-
-  case $host in
-    *cygwin* | *mingw* | *pw32* | *cegcc*)
-      # don't eliminate duplications in $postdeps and $predeps
-      opt_duplicate_compiler_generated_deps=:
-      ;;
-    *)
-      opt_duplicate_compiler_generated_deps=$opt_duplicate_deps
-      ;;
-  esac
-
-  # Having warned about all mis-specified options, bail out if
-  # anything was wrong.
-  $exit_cmd $EXIT_FAILURE
-}
-
-# func_check_version_match
-# Ensure that we are using m4 macros, and libtool script from the same
-# release of libtool.
-func_check_version_match ()
-{
-  if test "$package_revision" != "$macro_revision"; then
-    if test "$VERSION" != "$macro_version"; then
-      if test -z "$macro_version"; then
-        cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from an older release.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
-      else
-        cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
-      fi
-    else
-      cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
-$progname: but the definition of this LT_INIT comes from revision $macro_revision.
-$progname: You should recreate aclocal.m4 with macros from revision $package_revision
-$progname: of $PACKAGE $VERSION and run autoconf again.
-_LT_EOF
-    fi
-
-    exit $EXIT_MISMATCH
-  fi
-}
-
-
-## ----------- ##
-##    Main.    ##
-## ----------- ##
-
-$opt_help || {
-  # Sanity checks first:
-  func_check_version_match
-
-  if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
-    func_fatal_configuration "not configured to build any kind of library"
-  fi
-
-  test -z "$mode" && func_fatal_error "error: you must specify a MODE."
-
-
-  # Darwin sucks
-  eval std_shrext=\"$shrext_cmds\"
-
-
-  # Only execute mode is allowed to have -dlopen flags.
-  if test -n "$execute_dlfiles" && test "$mode" != execute; then
-    func_error "unrecognized option \`-dlopen'"
-    $ECHO "$help" 1>&2
-    exit $EXIT_FAILURE
-  fi
-
-  # Change the help message to a mode-specific one.
-  generic_help="$help"
-  help="Try \`$progname --help --mode=$mode' for more information."
-}
-
-
-# func_lalib_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_lalib_p ()
-{
-    test -f "$1" &&
-      $SED -e 4q "$1" 2>/dev/null \
-        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
-}
-
-# func_lalib_unsafe_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
-# This function implements the same check as func_lalib_p without
-# resorting to external programs.  To this end, it redirects stdin and
-# closes it afterwards, without saving the original file descriptor.
-# As a safety measure, use it only where a negative result would be
-# fatal anyway.  Works if `file' does not exist.
-func_lalib_unsafe_p ()
-{
-    lalib_p=no
-    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
-	for lalib_p_l in 1 2 3 4
-	do
-	    read lalib_p_line
-	    case "$lalib_p_line" in
-		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
-	    esac
-	done
-	exec 0<&5 5<&-
-    fi
-    test "$lalib_p" = yes
-}
-
-# func_ltwrapper_script_p file
-# True iff FILE is a libtool wrapper script
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_script_p ()
-{
-    func_lalib_p "$1"
-}
-
-# func_ltwrapper_executable_p file
-# True iff FILE is a libtool wrapper executable
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_executable_p ()
-{
-    func_ltwrapper_exec_suffix=
-    case $1 in
-    *.exe) ;;
-    *) func_ltwrapper_exec_suffix=.exe ;;
-    esac
-    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
-}
-
-# func_ltwrapper_scriptname file
-# Assumes file is an ltwrapper_executable
-# uses $file to determine the appropriate filename for a
-# temporary ltwrapper_script.
-func_ltwrapper_scriptname ()
-{
-    func_ltwrapper_scriptname_result=""
-    if func_ltwrapper_executable_p "$1"; then
-	func_dirname_and_basename "$1" "" "."
-	func_stripname '' '.exe' "$func_basename_result"
-	func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
-    fi
-}
-
-# func_ltwrapper_p file
-# True iff FILE is a libtool wrapper script or wrapper executable
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_p ()
-{
-    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
-}
-
-
-# func_execute_cmds commands fail_cmd
-# Execute tilde-delimited COMMANDS.
-# If FAIL_CMD is given, eval that upon failure.
-# FAIL_CMD may read-access the current command in variable CMD!
-func_execute_cmds ()
-{
-    $opt_debug
-    save_ifs=$IFS; IFS='~'
-    for cmd in $1; do
-      IFS=$save_ifs
-      eval cmd=\"$cmd\"
-      func_show_eval "$cmd" "${2-:}"
-    done
-    IFS=$save_ifs
-}
-
-
-# func_source file
-# Source FILE, adding directory component if necessary.
-# Note that it is not necessary on cygwin/mingw to append a dot to
-# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
-# behavior happens only for exec(3), not for open(2)!  Also, sourcing
-# `FILE.' does not work on cygwin managed mounts.
-func_source ()
-{
-    $opt_debug
-    case $1 in
-    */* | *\\*)	. "$1" ;;
-    *)		. "./$1" ;;
-    esac
-}
-
-
-# func_infer_tag arg
-# Infer tagged configuration to use if any are available and
-# if one wasn't chosen via the "--tag" command line option.
-# Only attempt this if the compiler in the base compile
-# command doesn't match the default compiler.
-# arg is usually of the form 'gcc ...'
-func_infer_tag ()
-{
-    $opt_debug
-    if test -n "$available_tags" && test -z "$tagname"; then
-      CC_quoted=
-      for arg in $CC; do
-        func_quote_for_eval "$arg"
-	CC_quoted="$CC_quoted $func_quote_for_eval_result"
-      done
-      case $@ in
-      # Blanks in the command may have been stripped by the calling shell,
-      # but not from the CC environment variable when configure was run.
-      " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;;
-      # Blanks at the start of $base_compile will cause this to fail
-      # if we don't check for them as well.
-      *)
-	for z in $available_tags; do
-	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
-	    # Evaluate the configuration.
-	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
-	    CC_quoted=
-	    for arg in $CC; do
-	      # Double-quote args containing other shell metacharacters.
-	      func_quote_for_eval "$arg"
-	      CC_quoted="$CC_quoted $func_quote_for_eval_result"
-	    done
-	    case "$@ " in
-	      " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*)
-	      # The compiler in the base compile command matches
-	      # the one in the tagged configuration.
-	      # Assume this is the tagged configuration we want.
-	      tagname=$z
-	      break
-	      ;;
-	    esac
-	  fi
-	done
-	# If $tagname still isn't set, then no tagged configuration
-	# was found and let the user know that the "--tag" command
-	# line option must be used.
-	if test -z "$tagname"; then
-	  func_echo "unable to infer tagged configuration"
-	  func_fatal_error "specify a tag with \`--tag'"
-#	else
-#	  func_verbose "using $tagname tagged configuration"
-	fi
-	;;
-      esac
-    fi
-}
-
-
-
-# func_write_libtool_object output_name pic_name nonpic_name
-# Create a libtool object file (analogous to a ".la" file),
-# but don't create it if we're doing a dry run.
-func_write_libtool_object ()
-{
-    write_libobj=${1}
-    if test "$build_libtool_libs" = yes; then
-      write_lobj=\'${2}\'
-    else
-      write_lobj=none
-    fi
-
-    if test "$build_old_libs" = yes; then
-      write_oldobj=\'${3}\'
-    else
-      write_oldobj=none
-    fi
-
-    $opt_dry_run || {
-      cat >${write_libobj}T <<EOF
-# $write_libobj - a libtool object file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# Name of the PIC object.
-pic_object=$write_lobj
-
-# Name of the non-PIC object
-non_pic_object=$write_oldobj
-
-EOF
-      $MV "${write_libobj}T" "${write_libobj}"
-    }
-}
-
-# func_mode_compile arg...
-func_mode_compile ()
-{
-    $opt_debug
-    # Get the compilation command and the source file.
-    base_compile=
-    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
-    suppress_opt=yes
-    suppress_output=
-    arg_mode=normal
-    libobj=
-    later=
-    pie_flag=
-
-    for arg
-    do
-      case $arg_mode in
-      arg  )
-	# do not "continue".  Instead, add this to base_compile
-	lastarg="$arg"
-	arg_mode=normal
-	;;
-
-      target )
-	libobj="$arg"
-	arg_mode=normal
-	continue
-	;;
-
-      normal )
-	# Accept any command-line options.
-	case $arg in
-	-o)
-	  test -n "$libobj" && \
-	    func_fatal_error "you cannot specify \`-o' more than once"
-	  arg_mode=target
-	  continue
-	  ;;
-
-	-pie | -fpie | -fPIE)
-          pie_flag="$pie_flag $arg"
-	  continue
-	  ;;
-
-	-shared | -static | -prefer-pic | -prefer-non-pic)
-	  later="$later $arg"
-	  continue
-	  ;;
-
-	-no-suppress)
-	  suppress_opt=no
-	  continue
-	  ;;
-
-	-Xcompiler)
-	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
-	  continue      #  The current "srcfile" will either be retained or
-	  ;;            #  replaced later.  I would guess that would be a bug.
-
-	-Wc,*)
-	  func_stripname '-Wc,' '' "$arg"
-	  args=$func_stripname_result
-	  lastarg=
-	  save_ifs="$IFS"; IFS=','
-	  for arg in $args; do
-	    IFS="$save_ifs"
-	    func_quote_for_eval "$arg"
-	    lastarg="$lastarg $func_quote_for_eval_result"
-	  done
-	  IFS="$save_ifs"
-	  func_stripname ' ' '' "$lastarg"
-	  lastarg=$func_stripname_result
-
-	  # Add the arguments to base_compile.
-	  base_compile="$base_compile $lastarg"
-	  continue
-	  ;;
-
-	*)
-	  # Accept the current argument as the source file.
-	  # The previous "srcfile" becomes the current argument.
-	  #
-	  lastarg="$srcfile"
-	  srcfile="$arg"
-	  ;;
-	esac  #  case $arg
-	;;
-      esac    #  case $arg_mode
-
-      # Aesthetically quote the previous argument.
-      func_quote_for_eval "$lastarg"
-      base_compile="$base_compile $func_quote_for_eval_result"
-    done # for arg
-
-    case $arg_mode in
-    arg)
-      func_fatal_error "you must specify an argument for -Xcompile"
-      ;;
-    target)
-      func_fatal_error "you must specify a target with \`-o'"
-      ;;
-    *)
-      # Get the name of the library object.
-      test -z "$libobj" && {
-	func_basename "$srcfile"
-	libobj="$func_basename_result"
-      }
-      ;;
-    esac
-
-    # Recognize several different file suffixes.
-    # If the user specifies -o file.o, it is replaced with file.lo
-    case $libobj in
-    *.[cCFSifmso] | \
-    *.ada | *.adb | *.ads | *.asm | \
-    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
-    *.[fF][09]? | *.for | *.java | *.obj | *.sx)
-      func_xform "$libobj"
-      libobj=$func_xform_result
-      ;;
-    esac
-
-    case $libobj in
-    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
-    *)
-      func_fatal_error "cannot determine name of library object from \`$libobj'"
-      ;;
-    esac
-
-    func_infer_tag $base_compile
-
-    for arg in $later; do
-      case $arg in
-      -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
-	build_old_libs=no
-	continue
-	;;
-
-      -static)
-	build_libtool_libs=no
-	build_old_libs=yes
-	continue
-	;;
-
-      -prefer-pic)
-	pic_mode=yes
-	continue
-	;;
-
-      -prefer-non-pic)
-	pic_mode=no
-	continue
-	;;
-      esac
-    done
-
-    func_quote_for_eval "$libobj"
-    test "X$libobj" != "X$func_quote_for_eval_result" \
-      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
-      && func_warning "libobj name \`$libobj' may not contain shell special characters."
-    func_dirname_and_basename "$obj" "/" ""
-    objname="$func_basename_result"
-    xdir="$func_dirname_result"
-    lobj=${xdir}$objdir/$objname
-
-    test -z "$base_compile" && \
-      func_fatal_help "you must specify a compilation command"
-
-    # Delete any leftover library objects.
-    if test "$build_old_libs" = yes; then
-      removelist="$obj $lobj $libobj ${libobj}T"
-    else
-      removelist="$lobj $libobj ${libobj}T"
-    fi
-
-    # On Cygwin there's no "real" PIC flag so we must build both object types
-    case $host_os in
-    cygwin* | mingw* | pw32* | os2* | cegcc*)
-      pic_mode=default
-      ;;
-    esac
-    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
-      # non-PIC code in shared libraries is not supported
-      pic_mode=default
-    fi
-
-    # Calculate the filename of the output object if compiler does
-    # not support -o with -c
-    if test "$compiler_c_o" = no; then
-      output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
-      lockfile="$output_obj.lock"
-    else
-      output_obj=
-      need_locks=no
-      lockfile=
-    fi
-
-    # Lock this critical section if it is needed
-    # We use this script file to make the link, it avoids creating a new file
-    if test "$need_locks" = yes; then
-      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
-	func_echo "Waiting for $lockfile to be removed"
-	sleep 2
-      done
-    elif test "$need_locks" = warn; then
-      if test -f "$lockfile"; then
-	$ECHO "\
-*** ERROR, $lockfile exists and contains:
-`cat $lockfile 2>/dev/null`
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-      removelist="$removelist $output_obj"
-      $ECHO "$srcfile" > "$lockfile"
-    fi
-
-    $opt_dry_run || $RM $removelist
-    removelist="$removelist $lockfile"
-    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
-
-    if test -n "$fix_srcfile_path"; then
-      eval srcfile=\"$fix_srcfile_path\"
-    fi
-    func_quote_for_eval "$srcfile"
-    qsrcfile=$func_quote_for_eval_result
-
-    # Only build a PIC object if we are building libtool libraries.
-    if test "$build_libtool_libs" = yes; then
-      # Without this assignment, base_compile gets emptied.
-      fbsd_hideous_sh_bug=$base_compile
-
-      if test "$pic_mode" != no; then
-	command="$base_compile $qsrcfile $pic_flag"
-      else
-	# Don't build PIC code
-	command="$base_compile $qsrcfile"
-      fi
-
-      func_mkdir_p "$xdir$objdir"
-
-      if test -z "$output_obj"; then
-	# Place PIC objects in $objdir
-	command="$command -o $lobj"
-      fi
-
-      func_show_eval_locale "$command"	\
-          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
-
-      if test "$need_locks" = warn &&
-	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$ECHO "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-
-      # Just move the object if needed, then go on to compile the next one
-      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
-	func_show_eval '$MV "$output_obj" "$lobj"' \
-	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
-      fi
-
-      # Allow error messages only from the first compilation.
-      if test "$suppress_opt" = yes; then
-	suppress_output=' >/dev/null 2>&1'
-      fi
-    fi
-
-    # Only build a position-dependent object if we build old libraries.
-    if test "$build_old_libs" = yes; then
-      if test "$pic_mode" != yes; then
-	# Don't build PIC code
-	command="$base_compile $qsrcfile$pie_flag"
-      else
-	command="$base_compile $qsrcfile $pic_flag"
-      fi
-      if test "$compiler_c_o" = yes; then
-	command="$command -o $obj"
-      fi
-
-      # Suppress compiler output if we already did a PIC compilation.
-      command="$command$suppress_output"
-      func_show_eval_locale "$command" \
-        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
-
-      if test "$need_locks" = warn &&
-	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$ECHO "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-
-      # Just move the object if needed
-      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
-	func_show_eval '$MV "$output_obj" "$obj"' \
-	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
-      fi
-    fi
-
-    $opt_dry_run || {
-      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
-
-      # Unlock the critical section if it was locked
-      if test "$need_locks" != no; then
-	removelist=$lockfile
-        $RM "$lockfile"
-      fi
-    }
-
-    exit $EXIT_SUCCESS
-}
-
-$opt_help || {
-test "$mode" = compile && func_mode_compile ${1+"$@"}
-}
-
-func_mode_help ()
-{
-    # We need to display help for each of the modes.
-    case $mode in
-      "")
-        # Generic help is extracted from the usage comments
-        # at the start of this file.
-        func_help
-        ;;
-
-      clean)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
-
-Remove files from the build directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, object or program, all the files associated
-with it are deleted. Otherwise, only FILE itself is deleted using RM."
-        ;;
-
-      compile)
-      $ECHO \
-"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
-
-Compile a source file into a libtool library object.
-
-This mode accepts the following additional options:
-
-  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
-  -no-suppress      do not suppress compiler output for multiple passes
-  -prefer-pic       try to building PIC objects only
-  -prefer-non-pic   try to building non-PIC objects only
-  -shared           do not build a \`.o' file suitable for static linking
-  -static           only build a \`.o' file suitable for static linking
-
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
-from the given SOURCEFILE.
-
-The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
-        ;;
-
-      execute)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
-
-Automatically set library path, then run a program.
-
-This mode accepts the following additional options:
-
-  -dlopen FILE      add the directory containing FILE to the library path
-
-This mode sets the library path environment variable according to \`-dlopen'
-flags.
-
-If any of the ARGS are libtool executable wrappers, then they are translated
-into their corresponding uninstalled binary, and any of their required library
-directories are added to the library path.
-
-Then, COMMAND is executed, with ARGS as arguments."
-        ;;
-
-      finish)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
-
-Complete the installation of libtool libraries.
-
-Each LIBDIR is a directory that contains libtool libraries.
-
-The commands that this mode executes may require superuser privileges.  Use
-the \`--dry-run' option if you just want to see what would be executed."
-        ;;
-
-      install)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
-
-Install executables or libraries.
-
-INSTALL-COMMAND is the installation command.  The first component should be
-either the \`install' or \`cp' program.
-
-The following components of INSTALL-COMMAND are treated specially:
-
-  -inst-prefix PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
-
-The rest of the components are interpreted as arguments to that command (only
-BSD-compatible install options are recognized)."
-        ;;
-
-      link)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
-
-Link object files or libraries together to form another library, or to
-create an executable program.
-
-LINK-COMMAND is a command using the C compiler that you would use to create
-a program from several object files.
-
-The following components of LINK-COMMAND are treated specially:
-
-  -all-static       do not do any dynamic linking at all
-  -avoid-version    do not add a version suffix if possible
-  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
-  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
-  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
-  -export-symbols SYMFILE
-                    try to export only the symbols listed in SYMFILE
-  -export-symbols-regex REGEX
-                    try to export only the symbols matching REGEX
-  -LLIBDIR          search LIBDIR for required installed libraries
-  -lNAME            OUTPUT-FILE requires the installed library libNAME
-  -module           build a library that can dlopened
-  -no-fast-install  disable the fast-install mode
-  -no-install       link a not-installable executable
-  -no-undefined     declare that a library does not refer to external symbols
-  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
-  -objectlist FILE  Use a list of object files found in FILE to specify objects
-  -precious-files-regex REGEX
-                    don't remove output files matching REGEX
-  -release RELEASE  specify package release information
-  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
-  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
-  -shared           only do dynamic linking of libtool libraries
-  -shrext SUFFIX    override the standard shared library file extension
-  -static           do not do any dynamic linking of uninstalled libtool libraries
-  -static-libtool-libs
-                    do not do any dynamic linking of libtool libraries
-  -version-info CURRENT[:REVISION[:AGE]]
-                    specify library version info [each variable defaults to 0]
-  -weak LIBNAME     declare that the target provides the LIBNAME interface
-
-All other options (arguments beginning with \`-') are ignored.
-
-Every other argument is treated as a filename.  Files ending in \`.la' are
-treated as uninstalled libtool libraries, other files are standard or library
-object files.
-
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
-required, except when creating a convenience library.
-
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
-
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
-is created, otherwise an executable program is created."
-        ;;
-
-      uninstall)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
-
-Remove libraries from an installation directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, all the files associated with it are deleted.
-Otherwise, only FILE itself is deleted using RM."
-        ;;
-
-      *)
-        func_fatal_help "invalid operation mode \`$mode'"
-        ;;
-    esac
-
-    $ECHO
-    $ECHO "Try \`$progname --help' for more information about other modes."
-
-    exit $?
-}
-
-  # Now that we've collected a possible --mode arg, show help if necessary
-  $opt_help && func_mode_help
-
-
-# func_mode_execute arg...
-func_mode_execute ()
-{
-    $opt_debug
-    # The first argument is the command name.
-    cmd="$nonopt"
-    test -z "$cmd" && \
-      func_fatal_help "you must specify a COMMAND"
-
-    # Handle -dlopen flags immediately.
-    for file in $execute_dlfiles; do
-      test -f "$file" \
-	|| func_fatal_help "\`$file' is not a file"
-
-      dir=
-      case $file in
-      *.la)
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$lib' is not a valid libtool archive"
-
-	# Read the libtool library.
-	dlname=
-	library_names=
-	func_source "$file"
-
-	# Skip this library if it cannot be dlopened.
-	if test -z "$dlname"; then
-	  # Warn if it was a shared library.
-	  test -n "$library_names" && \
-	    func_warning "\`$file' was not linked with \`-export-dynamic'"
-	  continue
-	fi
-
-	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
-
-	if test -f "$dir/$objdir/$dlname"; then
-	  dir="$dir/$objdir"
-	else
-	  if test ! -f "$dir/$dlname"; then
-	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
-	  fi
-	fi
-	;;
-
-      *.lo)
-	# Just add the directory containing the .lo file.
-	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
-	;;
-
-      *)
-	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
-	continue
-	;;
-      esac
-
-      # Get the absolute pathname.
-      absdir=`cd "$dir" && pwd`
-      test -n "$absdir" && dir="$absdir"
-
-      # Now add the directory to shlibpath_var.
-      if eval "test -z \"\$$shlibpath_var\""; then
-	eval "$shlibpath_var=\"\$dir\""
-      else
-	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
-      fi
-    done
-
-    # This variable tells wrapper scripts just to set shlibpath_var
-    # rather than running their programs.
-    libtool_execute_magic="$magic"
-
-    # Check if any of the arguments is a wrapper script.
-    args=
-    for file
-    do
-      case $file in
-      -*) ;;
-      *)
-	# Do a test to see if this is really a libtool program.
-	if func_ltwrapper_script_p "$file"; then
-	  func_source "$file"
-	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
-	elif func_ltwrapper_executable_p "$file"; then
-	  func_ltwrapper_scriptname "$file"
-	  func_source "$func_ltwrapper_scriptname_result"
-	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
-	fi
-	;;
-      esac
-      # Quote arguments (to preserve shell metacharacters).
-      func_quote_for_eval "$file"
-      args="$args $func_quote_for_eval_result"
-    done
-
-    if test "X$opt_dry_run" = Xfalse; then
-      if test -n "$shlibpath_var"; then
-	# Export the shlibpath_var.
-	eval "export $shlibpath_var"
-      fi
-
-      # Restore saved environment variables
-      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-      do
-	eval "if test \"\${save_$lt_var+set}\" = set; then
-                $lt_var=\$save_$lt_var; export $lt_var
-	      else
-		$lt_unset $lt_var
-	      fi"
-      done
-
-      # Now prepare to actually exec the command.
-      exec_cmd="\$cmd$args"
-    else
-      # Display what would be done.
-      if test -n "$shlibpath_var"; then
-	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
-	$ECHO "export $shlibpath_var"
-      fi
-      $ECHO "$cmd$args"
-      exit $EXIT_SUCCESS
-    fi
-}
-
-test "$mode" = execute && func_mode_execute ${1+"$@"}
-
-
-# func_mode_finish arg...
-func_mode_finish ()
-{
-    $opt_debug
-    libdirs="$nonopt"
-    admincmds=
-
-    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
-      for dir
-      do
-	libdirs="$libdirs $dir"
-      done
-
-      for libdir in $libdirs; do
-	if test -n "$finish_cmds"; then
-	  # Do each command in the finish commands.
-	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
-'"$cmd"'"'
-	fi
-	if test -n "$finish_eval"; then
-	  # Do the single finish_eval.
-	  eval cmds=\"$finish_eval\"
-	  $opt_dry_run || eval "$cmds" || admincmds="$admincmds
-       $cmds"
-	fi
-      done
-    fi
-
-    # Exit here if they wanted silent mode.
-    $opt_silent && exit $EXIT_SUCCESS
-
-    $ECHO "X----------------------------------------------------------------------" | $Xsed
-    $ECHO "Libraries have been installed in:"
-    for libdir in $libdirs; do
-      $ECHO "   $libdir"
-    done
-    $ECHO
-    $ECHO "If you ever happen to want to link against installed libraries"
-    $ECHO "in a given directory, LIBDIR, you must either use libtool, and"
-    $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'"
-    $ECHO "flag during linking and do at least one of the following:"
-    if test -n "$shlibpath_var"; then
-      $ECHO "   - add LIBDIR to the \`$shlibpath_var' environment variable"
-      $ECHO "     during execution"
-    fi
-    if test -n "$runpath_var"; then
-      $ECHO "   - add LIBDIR to the \`$runpath_var' environment variable"
-      $ECHO "     during linking"
-    fi
-    if test -n "$hardcode_libdir_flag_spec"; then
-      libdir=LIBDIR
-      eval flag=\"$hardcode_libdir_flag_spec\"
-
-      $ECHO "   - use the \`$flag' linker flag"
-    fi
-    if test -n "$admincmds"; then
-      $ECHO "   - have your system administrator run these commands:$admincmds"
-    fi
-    if test -f /etc/ld.so.conf; then
-      $ECHO "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
-    fi
-    $ECHO
-
-    $ECHO "See any operating system documentation about shared libraries for"
-    case $host in
-      solaris2.[6789]|solaris2.1[0-9])
-        $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual"
-	$ECHO "pages."
-	;;
-      *)
-        $ECHO "more information, such as the ld(1) and ld.so(8) manual pages."
-        ;;
-    esac
-    $ECHO "X----------------------------------------------------------------------" | $Xsed
-    exit $EXIT_SUCCESS
-}
-
-test "$mode" = finish && func_mode_finish ${1+"$@"}
-
-
-# func_mode_install arg...
-func_mode_install ()
-{
-    $opt_debug
-    # There may be an optional sh(1) argument at the beginning of
-    # install_prog (especially on Windows NT).
-    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
-       # Allow the use of GNU shtool's install command.
-       $ECHO "X$nonopt" | $GREP shtool >/dev/null; then
-      # Aesthetically quote it.
-      func_quote_for_eval "$nonopt"
-      install_prog="$func_quote_for_eval_result "
-      arg=$1
-      shift
-    else
-      install_prog=
-      arg=$nonopt
-    fi
-
-    # The real first argument should be the name of the installation program.
-    # Aesthetically quote it.
-    func_quote_for_eval "$arg"
-    install_prog="$install_prog$func_quote_for_eval_result"
-
-    # We need to accept at least all the BSD install flags.
-    dest=
-    files=
-    opts=
-    prev=
-    install_type=
-    isdir=no
-    stripme=
-    for arg
-    do
-      if test -n "$dest"; then
-	files="$files $dest"
-	dest=$arg
-	continue
-      fi
-
-      case $arg in
-      -d) isdir=yes ;;
-      -f)
-	case " $install_prog " in
-	*[\\\ /]cp\ *) ;;
-	*) prev=$arg ;;
-	esac
-	;;
-      -g | -m | -o)
-	prev=$arg
-	;;
-      -s)
-	stripme=" -s"
-	continue
-	;;
-      -*)
-	;;
-      *)
-	# If the previous option needed an argument, then skip it.
-	if test -n "$prev"; then
-	  prev=
-	else
-	  dest=$arg
-	  continue
-	fi
-	;;
-      esac
-
-      # Aesthetically quote the argument.
-      func_quote_for_eval "$arg"
-      install_prog="$install_prog $func_quote_for_eval_result"
-    done
-
-    test -z "$install_prog" && \
-      func_fatal_help "you must specify an install program"
-
-    test -n "$prev" && \
-      func_fatal_help "the \`$prev' option requires an argument"
-
-    if test -z "$files"; then
-      if test -z "$dest"; then
-	func_fatal_help "no file or destination specified"
-      else
-	func_fatal_help "you must specify a destination"
-      fi
-    fi
-
-    # Strip any trailing slash from the destination.
-    func_stripname '' '/' "$dest"
-    dest=$func_stripname_result
-
-    # Check to see that the destination is a directory.
-    test -d "$dest" && isdir=yes
-    if test "$isdir" = yes; then
-      destdir="$dest"
-      destname=
-    else
-      func_dirname_and_basename "$dest" "" "."
-      destdir="$func_dirname_result"
-      destname="$func_basename_result"
-
-      # Not a directory, so check to see that there is only one file specified.
-      set dummy $files; shift
-      test "$#" -gt 1 && \
-	func_fatal_help "\`$dest' is not a directory"
-    fi
-    case $destdir in
-    [\\/]* | [A-Za-z]:[\\/]*) ;;
-    *)
-      for file in $files; do
-	case $file in
-	*.lo) ;;
-	*)
-	  func_fatal_help "\`$destdir' must be an absolute directory name"
-	  ;;
-	esac
-      done
-      ;;
-    esac
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    staticlibs=
-    future_libdirs=
-    current_libdirs=
-    for file in $files; do
-
-      # Do each installation.
-      case $file in
-      *.$libext)
-	# Do the static libraries later.
-	staticlibs="$staticlibs $file"
-	;;
-
-      *.la)
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$file' is not a valid libtool archive"
-
-	library_names=
-	old_library=
-	relink_command=
-	func_source "$file"
-
-	# Add the libdir to current_libdirs if it is the destination.
-	if test "X$destdir" = "X$libdir"; then
-	  case "$current_libdirs " in
-	  *" $libdir "*) ;;
-	  *) current_libdirs="$current_libdirs $libdir" ;;
-	  esac
-	else
-	  # Note the libdir as a future libdir.
-	  case "$future_libdirs " in
-	  *" $libdir "*) ;;
-	  *) future_libdirs="$future_libdirs $libdir" ;;
-	  esac
-	fi
-
-	func_dirname "$file" "/" ""
-	dir="$func_dirname_result"
-	dir="$dir$objdir"
-
-	if test -n "$relink_command"; then
-	  # Determine the prefix the user has applied to our future dir.
-	  inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"`
-
-	  # Don't allow the user to place us outside of our expected
-	  # location b/c this prevents finding dependent libraries that
-	  # are installed to the same prefix.
-	  # At present, this check doesn't affect windows .dll's that
-	  # are installed into $libdir/../bin (currently, that works fine)
-	  # but it's something to keep an eye on.
-	  test "$inst_prefix_dir" = "$destdir" && \
-	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
-
-	  if test -n "$inst_prefix_dir"; then
-	    # Stick the inst_prefix_dir data into the link command.
-	    relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
-	  else
-	    relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"`
-	  fi
-
-	  func_warning "relinking \`$file'"
-	  func_show_eval "$relink_command" \
-	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
-	fi
-
-	# See the names of the shared library.
-	set dummy $library_names; shift
-	if test -n "$1"; then
-	  realname="$1"
-	  shift
-
-	  srcname="$realname"
-	  test -n "$relink_command" && srcname="$realname"T
-
-	  # Install the shared library and build the symlinks.
-	  func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \
-	      'exit $?'
-	  tstripme="$stripme"
-	  case $host_os in
-	  cygwin* | mingw* | pw32* | cegcc*)
-	    case $realname in
-	    *.dll.a)
-	      tstripme=""
-	      ;;
-	    esac
-	    ;;
-	  esac
-	  if test -n "$tstripme" && test -n "$striplib"; then
-	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
-	  fi
-
-	  if test "$#" -gt 0; then
-	    # Delete the old symlinks, and create new ones.
-	    # Try `ln -sf' first, because the `ln' binary might depend on
-	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
-	    # so we also need to try rm && ln -s.
-	    for linkname
-	    do
-	      test "$linkname" != "$realname" \
-		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
-	    done
-	  fi
-
-	  # Do each command in the postinstall commands.
-	  lib="$destdir/$realname"
-	  func_execute_cmds "$postinstall_cmds" 'exit $?'
-	fi
-
-	# Install the pseudo-library for information purposes.
-	func_basename "$file"
-	name="$func_basename_result"
-	instname="$dir/$name"i
-	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
-
-	# Maybe install the static library, too.
-	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
-	;;
-
-      *.lo)
-	# Install (i.e. copy) a libtool object.
-
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
-	else
-	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
-	fi
-
-	# Deduce the name of the destination old-style object file.
-	case $destfile in
-	*.lo)
-	  func_lo2o "$destfile"
-	  staticdest=$func_lo2o_result
-	  ;;
-	*.$objext)
-	  staticdest="$destfile"
-	  destfile=
-	  ;;
-	*)
-	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
-	  ;;
-	esac
-
-	# Install the libtool object if requested.
-	test -n "$destfile" && \
-	  func_show_eval "$install_prog $file $destfile" 'exit $?'
-
-	# Install the old object if enabled.
-	if test "$build_old_libs" = yes; then
-	  # Deduce the name of the old-style object file.
-	  func_lo2o "$file"
-	  staticobj=$func_lo2o_result
-	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
-	fi
-	exit $EXIT_SUCCESS
-	;;
-
-      *)
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
-	else
-	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
-	fi
-
-	# If the file is missing, and there is a .exe on the end, strip it
-	# because it is most likely a libtool script we actually want to
-	# install
-	stripped_ext=""
-	case $file in
-	  *.exe)
-	    if test ! -f "$file"; then
-	      func_stripname '' '.exe' "$file"
-	      file=$func_stripname_result
-	      stripped_ext=".exe"
-	    fi
-	    ;;
-	esac
-
-	# Do a test to see if this is really a libtool program.
-	case $host in
-	*cygwin* | *mingw*)
-	    if func_ltwrapper_executable_p "$file"; then
-	      func_ltwrapper_scriptname "$file"
-	      wrapper=$func_ltwrapper_scriptname_result
-	    else
-	      func_stripname '' '.exe' "$file"
-	      wrapper=$func_stripname_result
-	    fi
-	    ;;
-	*)
-	    wrapper=$file
-	    ;;
-	esac
-	if func_ltwrapper_script_p "$wrapper"; then
-	  notinst_deplibs=
-	  relink_command=
-
-	  func_source "$wrapper"
-
-	  # Check the variables that should have been set.
-	  test -z "$generated_by_libtool_version" && \
-	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
-
-	  finalize=yes
-	  for lib in $notinst_deplibs; do
-	    # Check to see that each library is installed.
-	    libdir=
-	    if test -f "$lib"; then
-	      func_source "$lib"
-	    fi
-	    libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
-	    if test -n "$libdir" && test ! -f "$libfile"; then
-	      func_warning "\`$lib' has not been installed in \`$libdir'"
-	      finalize=no
-	    fi
-	  done
-
-	  relink_command=
-	  func_source "$wrapper"
-
-	  outputname=
-	  if test "$fast_install" = no && test -n "$relink_command"; then
-	    $opt_dry_run || {
-	      if test "$finalize" = yes; then
-	        tmpdir=`func_mktempdir`
-		func_basename "$file$stripped_ext"
-		file="$func_basename_result"
-	        outputname="$tmpdir/$file"
-	        # Replace the output file specification.
-	        relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
-
-	        $opt_silent || {
-	          func_quote_for_expand "$relink_command"
-		  eval "func_echo $func_quote_for_expand_result"
-	        }
-	        if eval "$relink_command"; then :
-	          else
-		  func_error "error: relink \`$file' with the above command before installing it"
-		  $opt_dry_run || ${RM}r "$tmpdir"
-		  continue
-	        fi
-	        file="$outputname"
-	      else
-	        func_warning "cannot relink \`$file'"
-	      fi
-	    }
-	  else
-	    # Install the binary that we compiled earlier.
-	    file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
-	  fi
-	fi
-
-	# remove .exe since cygwin /usr/bin/install will append another
-	# one anyway
-	case $install_prog,$host in
-	*/usr/bin/install*,*cygwin*)
-	  case $file:$destfile in
-	  *.exe:*.exe)
-	    # this is ok
-	    ;;
-	  *.exe:*)
-	    destfile=$destfile.exe
-	    ;;
-	  *:*.exe)
-	    func_stripname '' '.exe' "$destfile"
-	    destfile=$func_stripname_result
-	    ;;
-	  esac
-	  ;;
-	esac
-	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
-	$opt_dry_run || if test -n "$outputname"; then
-	  ${RM}r "$tmpdir"
-	fi
-	;;
-      esac
-    done
-
-    for file in $staticlibs; do
-      func_basename "$file"
-      name="$func_basename_result"
-
-      # Set up the ranlib parameters.
-      oldlib="$destdir/$name"
-
-      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
-
-      if test -n "$stripme" && test -n "$old_striplib"; then
-	func_show_eval "$old_striplib $oldlib" 'exit $?'
-      fi
-
-      # Do each command in the postinstall commands.
-      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
-    done
-
-    test -n "$future_libdirs" && \
-      func_warning "remember to run \`$progname --finish$future_libdirs'"
-
-    if test -n "$current_libdirs"; then
-      # Maybe just do a dry run.
-      $opt_dry_run && current_libdirs=" -n$current_libdirs"
-      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
-    else
-      exit $EXIT_SUCCESS
-    fi
-}
-
-test "$mode" = install && func_mode_install ${1+"$@"}
-
-
-# func_generate_dlsyms outputname originator pic_p
-# Extract symbols from dlprefiles and create ${outputname}S.o with
-# a dlpreopen symbol table.
-func_generate_dlsyms ()
-{
-    $opt_debug
-    my_outputname="$1"
-    my_originator="$2"
-    my_pic_p="${3-no}"
-    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
-    my_dlsyms=
-
-    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-      if test -n "$NM" && test -n "$global_symbol_pipe"; then
-	my_dlsyms="${my_outputname}S.c"
-      else
-	func_error "not configured to extract global symbols from dlpreopened files"
-      fi
-    fi
-
-    if test -n "$my_dlsyms"; then
-      case $my_dlsyms in
-      "") ;;
-      *.c)
-	# Discover the nlist of each of the dlfiles.
-	nlist="$output_objdir/${my_outputname}.nm"
-
-	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
-
-	# Parse the name list into a source file.
-	func_verbose "creating $output_objdir/$my_dlsyms"
-
-	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
-/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
-/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
-
-#ifdef __cplusplus
-extern \"C\" {
-#endif
-
-/* External symbol declarations for the compiler. */\
-"
-
-	if test "$dlself" = yes; then
-	  func_verbose "generating symbol list for \`$output'"
-
-	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
-
-	  # Add our own program objects to the symbol list.
-	  progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-	  for progfile in $progfiles; do
-	    func_verbose "extracting global C symbols from \`$progfile'"
-	    $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'"
-	  done
-
-	  if test -n "$exclude_expsyms"; then
-	    $opt_dry_run || {
-	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
-	      eval '$MV "$nlist"T "$nlist"'
-	    }
-	  fi
-
-	  if test -n "$export_symbols_regex"; then
-	    $opt_dry_run || {
-	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
-	      eval '$MV "$nlist"T "$nlist"'
-	    }
-	  fi
-
-	  # Prepare the list of exported symbols
-	  if test -z "$export_symbols"; then
-	    export_symbols="$output_objdir/$outputname.exp"
-	    $opt_dry_run || {
-	      $RM $export_symbols
-	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
-	      case $host in
-	      *cygwin* | *mingw* | *cegcc* )
-                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
-                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
-	        ;;
-	      esac
-	    }
-	  else
-	    $opt_dry_run || {
-	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
-	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
-	      eval '$MV "$nlist"T "$nlist"'
-	      case $host in
-	        *cygwin | *mingw* | *cegcc* )
-	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
-	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
-	          ;;
-	      esac
-	    }
-	  fi
-	fi
-
-	for dlprefile in $dlprefiles; do
-	  func_verbose "extracting global C symbols from \`$dlprefile'"
-	  func_basename "$dlprefile"
-	  name="$func_basename_result"
-	  $opt_dry_run || {
-	    eval '$ECHO ": $name " >> "$nlist"'
-	    eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'"
-	  }
-	done
-
-	$opt_dry_run || {
-	  # Make sure we have at least an empty file.
-	  test -f "$nlist" || : > "$nlist"
-
-	  if test -n "$exclude_expsyms"; then
-	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
-	    $MV "$nlist"T "$nlist"
-	  fi
-
-	  # Try sorting and uniquifying the output.
-	  if $GREP -v "^: " < "$nlist" |
-	      if sort -k 3 </dev/null >/dev/null 2>&1; then
-		sort -k 3
-	      else
-		sort +2
-	      fi |
-	      uniq > "$nlist"S; then
-	    :
-	  else
-	    $GREP -v "^: " < "$nlist" > "$nlist"S
-	  fi
-
-	  if test -f "$nlist"S; then
-	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
-	  else
-	    $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms"
-	  fi
-
-	  $ECHO >> "$output_objdir/$my_dlsyms" "\
-
-/* The mapping between symbol names and symbols.  */
-typedef struct {
-  const char *name;
-  void *address;
-} lt_dlsymlist;
-"
-	  case $host in
-	  *cygwin* | *mingw* | *cegcc* )
-	    $ECHO >> "$output_objdir/$my_dlsyms" "\
-/* DATA imports from DLLs on WIN32 con't be const, because
-   runtime relocations are performed -- see ld's documentation
-   on pseudo-relocs.  */"
-	    lt_dlsym_const= ;;
-	  *osf5*)
-	    echo >> "$output_objdir/$my_dlsyms" "\
-/* This system does not cope well with relocations in const data */"
-	    lt_dlsym_const= ;;
-	  *)
-	    lt_dlsym_const=const ;;
-	  esac
-
-	  $ECHO >> "$output_objdir/$my_dlsyms" "\
-extern $lt_dlsym_const lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[];
-$lt_dlsym_const lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[] =
-{\
-  { \"$my_originator\", (void *) 0 },"
-
-	  case $need_lib_prefix in
-	  no)
-	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
-	    ;;
-	  *)
-	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
-	    ;;
-	  esac
-	  $ECHO >> "$output_objdir/$my_dlsyms" "\
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt_${my_prefix}_LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif\
-"
-	} # !$opt_dry_run
-
-	pic_flag_for_symtable=
-	case "$compile_command " in
-	*" -static "*) ;;
-	*)
-	  case $host in
-	  # compiling the symbol table file with pic_flag works around
-	  # a FreeBSD bug that causes programs to crash when -lm is
-	  # linked before any other PIC object.  But we must not use
-	  # pic_flag when linking with -static.  The problem exists in
-	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
-	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
-	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
-	  *-*-hpux*)
-	    pic_flag_for_symtable=" $pic_flag"  ;;
-	  *)
-	    if test "X$my_pic_p" != Xno; then
-	      pic_flag_for_symtable=" $pic_flag"
-	    fi
-	    ;;
-	  esac
-	  ;;
-	esac
-	symtab_cflags=
-	for arg in $LTCFLAGS; do
-	  case $arg in
-	  -pie | -fpie | -fPIE) ;;
-	  *) symtab_cflags="$symtab_cflags $arg" ;;
-	  esac
-	done
-
-	# Now compile the dynamic symbol file.
-	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
-
-	# Clean up the generated files.
-	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
-
-	# Transform the symbol file into the correct name.
-	symfileobj="$output_objdir/${my_outputname}S.$objext"
-	case $host in
-	*cygwin* | *mingw* | *cegcc* )
-	  if test -f "$output_objdir/$my_outputname.def"; then
-	    compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
-	    finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
-	  else
-	    compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
-	    finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
-	  fi
-	  ;;
-	*)
-	  compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
-	  finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
-	  ;;
-	esac
-	;;
-      *)
-	func_fatal_error "unknown suffix for \`$my_dlsyms'"
-	;;
-      esac
-    else
-      # We keep going just in case the user didn't refer to
-      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
-      # really was required.
-
-      # Nullify the symbol file.
-      compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
-      finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
-    fi
-}
-
-# func_win32_libid arg
-# return the library type of file 'arg'
-#
-# Need a lot of goo to handle *both* DLLs and import libs
-# Has to be a shell function in order to 'eat' the argument
-# that is supplied when $file_magic_command is called.
-func_win32_libid ()
-{
-  $opt_debug
-  win32_libid_type="unknown"
-  win32_fileres=`file -L $1 2>/dev/null`
-  case $win32_fileres in
-  *ar\ archive\ import\ library*) # definitely import
-    win32_libid_type="x86 archive import"
-    ;;
-  *ar\ archive*) # could be an import, or static
-    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
-       $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
-      win32_nmres=`eval $NM -f posix -A $1 |
-	$SED -n -e '
-	    1,100{
-		/ I /{
-		    s,.*,import,
-		    p
-		    q
-		}
-	    }'`
-      case $win32_nmres in
-      import*)  win32_libid_type="x86 archive import";;
-      *)        win32_libid_type="x86 archive static";;
-      esac
-    fi
-    ;;
-  *DLL*)
-    win32_libid_type="x86 DLL"
-    ;;
-  *executable*) # but shell scripts are "executable" too...
-    case $win32_fileres in
-    *MS\ Windows\ PE\ Intel*)
-      win32_libid_type="x86 DLL"
-      ;;
-    esac
-    ;;
-  esac
-  $ECHO "$win32_libid_type"
-}
-
-
-
-# func_extract_an_archive dir oldlib
-func_extract_an_archive ()
-{
-    $opt_debug
-    f_ex_an_ar_dir="$1"; shift
-    f_ex_an_ar_oldlib="$1"
-    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?'
-    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
-     :
-    else
-      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
-    fi
-}
-
-
-# func_extract_archives gentop oldlib ...
-func_extract_archives ()
-{
-    $opt_debug
-    my_gentop="$1"; shift
-    my_oldlibs=${1+"$@"}
-    my_oldobjs=""
-    my_xlib=""
-    my_xabs=""
-    my_xdir=""
-
-    for my_xlib in $my_oldlibs; do
-      # Extract the objects.
-      case $my_xlib in
-	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
-	*) my_xabs=`pwd`"/$my_xlib" ;;
-      esac
-      func_basename "$my_xlib"
-      my_xlib="$func_basename_result"
-      my_xlib_u=$my_xlib
-      while :; do
-        case " $extracted_archives " in
-	*" $my_xlib_u "*)
-	  func_arith $extracted_serial + 1
-	  extracted_serial=$func_arith_result
-	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
-	*) break ;;
-	esac
-      done
-      extracted_archives="$extracted_archives $my_xlib_u"
-      my_xdir="$my_gentop/$my_xlib_u"
-
-      func_mkdir_p "$my_xdir"
-
-      case $host in
-      *-darwin*)
-	func_verbose "Extracting $my_xabs"
-	# Do not bother doing anything if just a dry run
-	$opt_dry_run || {
-	  darwin_orig_dir=`pwd`
-	  cd $my_xdir || exit $?
-	  darwin_archive=$my_xabs
-	  darwin_curdir=`pwd`
-	  darwin_base_archive=`basename "$darwin_archive"`
-	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
-	  if test -n "$darwin_arches"; then
-	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
-	    darwin_arch=
-	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
-	    for darwin_arch in  $darwin_arches ; do
-	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
-	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
-	      cd "$darwin_curdir"
-	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
-	    done # $darwin_arches
-            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
-	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
-	    darwin_file=
-	    darwin_files=
-	    for darwin_file in $darwin_filelist; do
-	      darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
-	      $LIPO -create -output "$darwin_file" $darwin_files
-	    done # $darwin_filelist
-	    $RM -rf unfat-$$
-	    cd "$darwin_orig_dir"
-	  else
-	    cd $darwin_orig_dir
-	    func_extract_an_archive "$my_xdir" "$my_xabs"
-	  fi # $darwin_arches
-	} # !$opt_dry_run
-	;;
-      *)
-        func_extract_an_archive "$my_xdir" "$my_xabs"
-	;;
-      esac
-      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
-    done
-
-    func_extract_archives_result="$my_oldobjs"
-}
-
-
-
-# func_emit_wrapper_part1 [arg=no]
-#
-# Emit the first part of a libtool wrapper script on stdout.
-# For more information, see the description associated with
-# func_emit_wrapper(), below.
-func_emit_wrapper_part1 ()
-{
-	func_emit_wrapper_part1_arg1=no
-	if test -n "$1" ; then
-	  func_emit_wrapper_part1_arg1=$1
-	fi
-
-	$ECHO "\
-#! $SHELL
-
-# $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# The $output program cannot be directly executed until all the libtool
-# libraries that it depends on are installed.
-#
-# This wrapper script should never be moved out of the build directory.
-# If it is, it will not operate correctly.
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='${SED} -e 1s/^X//'
-sed_quote_subst='$sed_quote_subst'
-
-# Be Bourne compatible
-if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '\${1+\"\$@\"}'='\"\$@\"'
-  setopt NO_GLOB_SUBST
-else
-  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-relink_command=\"$relink_command\"
-
-# This environment variable determines our operation mode.
-if test \"\$libtool_install_magic\" = \"$magic\"; then
-  # install mode needs the following variables:
-  generated_by_libtool_version='$macro_version'
-  notinst_deplibs='$notinst_deplibs'
-else
-  # When we are sourced in execute mode, \$file and \$ECHO are already set.
-  if test \"\$libtool_execute_magic\" != \"$magic\"; then
-    ECHO=\"$qecho\"
-    file=\"\$0\"
-    # Make sure echo works.
-    if test \"X\$1\" = X--no-reexec; then
-      # Discard the --no-reexec flag, and continue.
-      shift
-    elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then
-      # Yippee, \$ECHO works!
-      :
-    else
-      # Restart under the correct shell, and then maybe \$ECHO will work.
-      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
-    fi
-  fi\
-"
-	$ECHO "\
-
-  # Find the directory that this script lives in.
-  thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
-  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
-
-  # Follow symbolic links until we get to the real thisdir.
-  file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
-  while test -n \"\$file\"; do
-    destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
-
-    # If there was a directory component, then change thisdir.
-    if test \"x\$destdir\" != \"x\$file\"; then
-      case \"\$destdir\" in
-      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
-      *) thisdir=\"\$thisdir/\$destdir\" ;;
-      esac
-    fi
-
-    file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
-    file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
-  done
-"
-}
-# end: func_emit_wrapper_part1
-
-# func_emit_wrapper_part2 [arg=no]
-#
-# Emit the second part of a libtool wrapper script on stdout.
-# For more information, see the description associated with
-# func_emit_wrapper(), below.
-func_emit_wrapper_part2 ()
-{
-	func_emit_wrapper_part2_arg1=no
-	if test -n "$1" ; then
-	  func_emit_wrapper_part2_arg1=$1
-	fi
-
-	$ECHO "\
-
-  # Usually 'no', except on cygwin/mingw when embedded into
-  # the cwrapper.
-  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1
-  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
-    # special case for '.'
-    if test \"\$thisdir\" = \".\"; then
-      thisdir=\`pwd\`
-    fi
-    # remove .libs from thisdir
-    case \"\$thisdir\" in
-    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;;
-    $objdir )   thisdir=. ;;
-    esac
-  fi
-
-  # Try to get the absolute directory name.
-  absdir=\`cd \"\$thisdir\" && pwd\`
-  test -n \"\$absdir\" && thisdir=\"\$absdir\"
-"
-
-	if test "$fast_install" = yes; then
-	  $ECHO "\
-  program=lt-'$outputname'$exeext
-  progdir=\"\$thisdir/$objdir\"
-
-  if test ! -f \"\$progdir/\$program\" ||
-     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
-       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
-
-    file=\"\$\$-\$program\"
-
-    if test ! -d \"\$progdir\"; then
-      $MKDIR \"\$progdir\"
-    else
-      $RM \"\$progdir/\$file\"
-    fi"
-
-	  $ECHO "\
-
-    # relink executable if necessary
-    if test -n \"\$relink_command\"; then
-      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
-      else
-	$ECHO \"\$relink_command_output\" >&2
-	$RM \"\$progdir/\$file\"
-	exit 1
-      fi
-    fi
-
-    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
-    { $RM \"\$progdir/\$program\";
-      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
-    $RM \"\$progdir/\$file\"
-  fi"
-	else
-	  $ECHO "\
-  program='$outputname'
-  progdir=\"\$thisdir/$objdir\"
-"
-	fi
-
-	$ECHO "\
-
-  if test -f \"\$progdir/\$program\"; then"
-
-	# Export our shlibpath_var if we have one.
-	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-	  $ECHO "\
-    # Add our own library path to $shlibpath_var
-    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
-
-    # Some systems cannot cope with colon-terminated $shlibpath_var
-    # The second colon is a workaround for a bug in BeOS R4 sed
-    $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
-
-    export $shlibpath_var
-"
-	fi
-
-	# fixup the dll searchpath if we need to.
-	if test -n "$dllsearchpath"; then
-	  $ECHO "\
-    # Add the dll search path components to the executable PATH
-    PATH=$dllsearchpath:\$PATH
-"
-	fi
-
-	$ECHO "\
-    if test \"\$libtool_execute_magic\" != \"$magic\"; then
-      # Run the actual program with our arguments.
-"
-	case $host in
-	# Backslashes separate directories on plain windows
-	*-*-mingw | *-*-os2* | *-cegcc*)
-	  $ECHO "\
-      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
-"
-	  ;;
-
-	*)
-	  $ECHO "\
-      exec \"\$progdir/\$program\" \${1+\"\$@\"}
-"
-	  ;;
-	esac
-	$ECHO "\
-      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
-      exit 1
-    fi
-  else
-    # The program doesn't exist.
-    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
-    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
-    $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
-    exit 1
-  fi
-fi\
-"
-}
-# end: func_emit_wrapper_part2
-
-
-# func_emit_wrapper [arg=no]
-#
-# Emit a libtool wrapper script on stdout.
-# Don't directly open a file because we may want to
-# incorporate the script contents within a cygwin/mingw
-# wrapper executable.  Must ONLY be called from within
-# func_mode_link because it depends on a number of variables
-# set therein.
-#
-# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
-# variable will take.  If 'yes', then the emitted script
-# will assume that the directory in which it is stored is
-# the $objdir directory.  This is a cygwin/mingw-specific
-# behavior.
-func_emit_wrapper ()
-{
-	func_emit_wrapper_arg1=no
-	if test -n "$1" ; then
-	  func_emit_wrapper_arg1=$1
-	fi
-
-	# split this up so that func_emit_cwrapperexe_src
-	# can call each part independently.
-	func_emit_wrapper_part1 "${func_emit_wrapper_arg1}"
-	func_emit_wrapper_part2 "${func_emit_wrapper_arg1}"
-}
-
-
-# func_to_host_path arg
-#
-# Convert paths to host format when used with build tools.
-# Intended for use with "native" mingw (where libtool itself
-# is running under the msys shell), or in the following cross-
-# build environments:
-#    $build          $host
-#    mingw (msys)    mingw  [e.g. native]
-#    cygwin          mingw
-#    *nix + wine     mingw
-# where wine is equipped with the `winepath' executable.
-# In the native mingw case, the (msys) shell automatically
-# converts paths for any non-msys applications it launches,
-# but that facility isn't available from inside the cwrapper.
-# Similar accommodations are necessary for $host mingw and
-# $build cygwin.  Calling this function does no harm for other
-# $host/$build combinations not listed above.
-#
-# ARG is the path (on $build) that should be converted to
-# the proper representation for $host. The result is stored
-# in $func_to_host_path_result.
-func_to_host_path ()
-{
-  func_to_host_path_result="$1"
-  if test -n "$1" ; then
-    case $host in
-      *mingw* )
-        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-        case $build in
-          *mingw* ) # actually, msys
-            # awkward: cmd appends spaces to result
-            lt_sed_strip_trailing_spaces="s/[ ]*\$//"
-            func_to_host_path_tmp1=`( cmd //c echo "$1" |\
-              $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
-            func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
-              $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          *cygwin* )
-            func_to_host_path_tmp1=`cygpath -w "$1"`
-            func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
-              $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          * )
-            # Unfortunately, winepath does not exit with a non-zero
-            # error code, so we are forced to check the contents of
-            # stdout. On the other hand, if the command is not
-            # found, the shell will set an exit code of 127 and print
-            # *an error message* to stdout. So we must check for both
-            # error code of zero AND non-empty stdout, which explains
-            # the odd construction:
-            func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null`
-            if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then
-              func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
-                $SED -e "$lt_sed_naive_backslashify"`
-            else
-              # Allow warning below.
-              func_to_host_path_result=""
-            fi
-            ;;
-        esac
-        if test -z "$func_to_host_path_result" ; then
-          func_error "Could not determine host path corresponding to"
-          func_error "  '$1'"
-          func_error "Continuing, but uninstalled executables may not work."
-          # Fallback:
-          func_to_host_path_result="$1"
-        fi
-        ;;
-    esac
-  fi
-}
-# end: func_to_host_path
-
-# func_to_host_pathlist arg
-#
-# Convert pathlists to host format when used with build tools.
-# See func_to_host_path(), above. This function supports the
-# following $build/$host combinations (but does no harm for
-# combinations not listed here):
-#    $build          $host
-#    mingw (msys)    mingw  [e.g. native]
-#    cygwin          mingw
-#    *nix + wine     mingw
-#
-# Path separators are also converted from $build format to
-# $host format. If ARG begins or ends with a path separator
-# character, it is preserved (but converted to $host format)
-# on output.
-#
-# ARG is a pathlist (on $build) that should be converted to
-# the proper representation on $host. The result is stored
-# in $func_to_host_pathlist_result.
-func_to_host_pathlist ()
-{
-  func_to_host_pathlist_result="$1"
-  if test -n "$1" ; then
-    case $host in
-      *mingw* )
-        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-        # Remove leading and trailing path separator characters from
-        # ARG. msys behavior is inconsistent here, cygpath turns them
-        # into '.;' and ';.', and winepath ignores them completely.
-        func_to_host_pathlist_tmp2="$1"
-        # Once set for this call, this variable should not be
-        # reassigned. It is used in tha fallback case.
-        func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\
-          $SED -e 's|^:*||' -e 's|:*$||'`
-        case $build in
-          *mingw* ) # Actually, msys.
-            # Awkward: cmd appends spaces to result.
-            lt_sed_strip_trailing_spaces="s/[ ]*\$//"
-            func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\
-              $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
-            func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
-              $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          *cygwin* )
-            func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"`
-            func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
-              $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          * )
-            # unfortunately, winepath doesn't convert pathlists
-            func_to_host_pathlist_result=""
-            func_to_host_pathlist_oldIFS=$IFS
-            IFS=:
-            for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do
-              IFS=$func_to_host_pathlist_oldIFS
-              if test -n "$func_to_host_pathlist_f" ; then
-                func_to_host_path "$func_to_host_pathlist_f"
-                if test -n "$func_to_host_path_result" ; then
-                  if test -z "$func_to_host_pathlist_result" ; then
-                    func_to_host_pathlist_result="$func_to_host_path_result"
-                  else
-                    func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result"
-                  fi
-                fi
-              fi
-              IFS=:
-            done
-            IFS=$func_to_host_pathlist_oldIFS
-            ;;
-        esac
-        if test -z "$func_to_host_pathlist_result" ; then
-          func_error "Could not determine the host path(s) corresponding to"
-          func_error "  '$1'"
-          func_error "Continuing, but uninstalled executables may not work."
-          # Fallback. This may break if $1 contains DOS-style drive
-          # specifications. The fix is not to complicate the expression
-          # below, but for the user to provide a working wine installation
-          # with winepath so that path translation in the cross-to-mingw
-          # case works properly.
-          lt_replace_pathsep_nix_to_dos="s|:|;|g"
-          func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\
-            $SED -e "$lt_replace_pathsep_nix_to_dos"`
-        fi
-        # Now, add the leading and trailing path separators back
-        case "$1" in
-          :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result"
-            ;;
-        esac
-        case "$1" in
-          *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;"
-            ;;
-        esac
-        ;;
-    esac
-  fi
-}
-# end: func_to_host_pathlist
-
-# func_emit_cwrapperexe_src
-# emit the source code for a wrapper executable on stdout
-# Must ONLY be called from within func_mode_link because
-# it depends on a number of variable set therein.
-func_emit_cwrapperexe_src ()
-{
-	cat <<EOF
-
-/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
-   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-
-   The $output program cannot be directly executed until all the libtool
-   libraries that it depends on are installed.
-
-   This wrapper executable should never be moved out of the build directory.
-   If it is, it will not operate correctly.
-
-   Currently, it simply execs the wrapper *script* "$SHELL $output",
-   but could eventually absorb all of the scripts functionality and
-   exec $objdir/$outputname directly.
-*/
-EOF
-	    cat <<"EOF"
-#include <stdio.h>
-#include <stdlib.h>
-#ifdef _MSC_VER
-# include <direct.h>
-# include <process.h>
-# include <io.h>
-# define setmode _setmode
-#else
-# include <unistd.h>
-# include <stdint.h>
-# ifdef __CYGWIN__
-#  include <io.h>
-#  define HAVE_SETENV
-#  ifdef __STRICT_ANSI__
-char *realpath (const char *, char *);
-int putenv (char *);
-int setenv (const char *, const char *, int);
-#  endif
-# endif
-#endif
-#include <malloc.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-
-#if defined(PATH_MAX)
-# define LT_PATHMAX PATH_MAX
-#elif defined(MAXPATHLEN)
-# define LT_PATHMAX MAXPATHLEN
-#else
-# define LT_PATHMAX 1024
-#endif
-
-#ifndef S_IXOTH
-# define S_IXOTH 0
-#endif
-#ifndef S_IXGRP
-# define S_IXGRP 0
-#endif
-
-#ifdef _MSC_VER
-# define S_IXUSR _S_IEXEC
-# define stat _stat
-# ifndef _INTPTR_T_DEFINED
-#  define intptr_t int
-# endif
-#endif
-
-#ifndef DIR_SEPARATOR
-# define DIR_SEPARATOR '/'
-# define PATH_SEPARATOR ':'
-#endif
-
-#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
-  defined (__OS2__)
-# define HAVE_DOS_BASED_FILE_SYSTEM
-# define FOPEN_WB "wb"
-# ifndef DIR_SEPARATOR_2
-#  define DIR_SEPARATOR_2 '\\'
-# endif
-# ifndef PATH_SEPARATOR_2
-#  define PATH_SEPARATOR_2 ';'
-# endif
-#endif
-
-#ifndef DIR_SEPARATOR_2
-# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
-#else /* DIR_SEPARATOR_2 */
-# define IS_DIR_SEPARATOR(ch) \
-	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
-#endif /* DIR_SEPARATOR_2 */
-
-#ifndef PATH_SEPARATOR_2
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
-#else /* PATH_SEPARATOR_2 */
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
-#endif /* PATH_SEPARATOR_2 */
-
-#ifdef __CYGWIN__
-# define FOPEN_WB "wb"
-#endif
-
-#ifndef FOPEN_WB
-# define FOPEN_WB "w"
-#endif
-#ifndef _O_BINARY
-# define _O_BINARY 0
-#endif
-
-#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
-#define XFREE(stale) do { \
-  if (stale) { free ((void *) stale); stale = 0; } \
-} while (0)
-
-#undef LTWRAPPER_DEBUGPRINTF
-#if defined DEBUGWRAPPER
-# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args
-static void
-ltwrapper_debugprintf (const char *fmt, ...)
-{
-    va_list args;
-    va_start (args, fmt);
-    (void) vfprintf (stderr, fmt, args);
-    va_end (args);
-}
-#else
-# define LTWRAPPER_DEBUGPRINTF(args)
-#endif
-
-const char *program_name = NULL;
-
-void *xmalloc (size_t num);
-char *xstrdup (const char *string);
-const char *base_name (const char *name);
-char *find_executable (const char *wrapper);
-char *chase_symlinks (const char *pathspec);
-int make_executable (const char *path);
-int check_executable (const char *path);
-char *strendzap (char *str, const char *pat);
-void lt_fatal (const char *message, ...);
-void lt_setenv (const char *name, const char *value);
-char *lt_extend_str (const char *orig_value, const char *add, int to_end);
-void lt_opt_process_env_set (const char *arg);
-void lt_opt_process_env_prepend (const char *arg);
-void lt_opt_process_env_append (const char *arg);
-int lt_split_name_value (const char *arg, char** name, char** value);
-void lt_update_exe_path (const char *name, const char *value);
-void lt_update_lib_path (const char *name, const char *value);
-
-static const char *script_text_part1 =
-EOF
-
-	    func_emit_wrapper_part1 yes |
-	        $SED -e 's/\([\\"]\)/\\\1/g' \
-	             -e 's/^/  "/' -e 's/$/\\n"/'
-	    echo ";"
-	    cat <<EOF
-
-static const char *script_text_part2 =
-EOF
-	    func_emit_wrapper_part2 yes |
-	        $SED -e 's/\([\\"]\)/\\\1/g' \
-	             -e 's/^/  "/' -e 's/$/\\n"/'
-	    echo ";"
-
-	    cat <<EOF
-const char * MAGIC_EXE = "$magic_exe";
-const char * LIB_PATH_VARNAME = "$shlibpath_var";
-EOF
-
-	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-              func_to_host_pathlist "$temp_rpath"
-	      cat <<EOF
-const char * LIB_PATH_VALUE   = "$func_to_host_pathlist_result";
-EOF
-	    else
-	      cat <<"EOF"
-const char * LIB_PATH_VALUE   = "";
-EOF
-	    fi
-
-	    if test -n "$dllsearchpath"; then
-              func_to_host_pathlist "$dllsearchpath:"
-	      cat <<EOF
-const char * EXE_PATH_VARNAME = "PATH";
-const char * EXE_PATH_VALUE   = "$func_to_host_pathlist_result";
-EOF
-	    else
-	      cat <<"EOF"
-const char * EXE_PATH_VARNAME = "";
-const char * EXE_PATH_VALUE   = "";
-EOF
-	    fi
-
-	    if test "$fast_install" = yes; then
-	      cat <<EOF
-const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
-EOF
-	    else
-	      cat <<EOF
-const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
-EOF
-	    fi
-
-
-	    cat <<"EOF"
-
-#define LTWRAPPER_OPTION_PREFIX         "--lt-"
-#define LTWRAPPER_OPTION_PREFIX_LENGTH  5
-
-static const size_t opt_prefix_len         = LTWRAPPER_OPTION_PREFIX_LENGTH;
-static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
-
-static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
-
-static const size_t env_set_opt_len     = LTWRAPPER_OPTION_PREFIX_LENGTH + 7;
-static const char *env_set_opt          = LTWRAPPER_OPTION_PREFIX "env-set";
-  /* argument is putenv-style "foo=bar", value of foo is set to bar */
-
-static const size_t env_prepend_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 11;
-static const char *env_prepend_opt      = LTWRAPPER_OPTION_PREFIX "env-prepend";
-  /* argument is putenv-style "foo=bar", new value of foo is bar${foo} */
-
-static const size_t env_append_opt_len  = LTWRAPPER_OPTION_PREFIX_LENGTH + 10;
-static const char *env_append_opt       = LTWRAPPER_OPTION_PREFIX "env-append";
-  /* argument is putenv-style "foo=bar", new value of foo is ${foo}bar */
-
-int
-main (int argc, char *argv[])
-{
-  char **newargz;
-  int  newargc;
-  char *tmp_pathspec;
-  char *actual_cwrapper_path;
-  char *actual_cwrapper_name;
-  char *target_name;
-  char *lt_argv_zero;
-  intptr_t rval = 127;
-
-  int i;
-
-  program_name = (char *) xstrdup (base_name (argv[0]));
-  LTWRAPPER_DEBUGPRINTF (("(main) argv[0]      : %s\n", argv[0]));
-  LTWRAPPER_DEBUGPRINTF (("(main) program_name : %s\n", program_name));
-
-  /* very simple arg parsing; don't want to rely on getopt */
-  for (i = 1; i < argc; i++)
-    {
-      if (strcmp (argv[i], dumpscript_opt) == 0)
-	{
-EOF
-	    case "$host" in
-	      *mingw* | *cygwin* )
-		# make stdout use "unix" line endings
-		echo "          setmode(1,_O_BINARY);"
-		;;
-	      esac
-
-	    cat <<"EOF"
-	  printf ("%s", script_text_part1);
-	  printf ("%s", script_text_part2);
-	  return 0;
-	}
-    }
-
-  newargz = XMALLOC (char *, argc + 1);
-  tmp_pathspec = find_executable (argv[0]);
-  if (tmp_pathspec == NULL)
-    lt_fatal ("Couldn't find %s", argv[0]);
-  LTWRAPPER_DEBUGPRINTF (("(main) found exe (before symlink chase) at : %s\n",
-			  tmp_pathspec));
-
-  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
-  LTWRAPPER_DEBUGPRINTF (("(main) found exe (after symlink chase) at : %s\n",
-			  actual_cwrapper_path));
-  XFREE (tmp_pathspec);
-
-  actual_cwrapper_name = xstrdup( base_name (actual_cwrapper_path));
-  strendzap (actual_cwrapper_path, actual_cwrapper_name);
-
-  /* wrapper name transforms */
-  strendzap (actual_cwrapper_name, ".exe");
-  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
-  XFREE (actual_cwrapper_name);
-  actual_cwrapper_name = tmp_pathspec;
-  tmp_pathspec = 0;
-
-  /* target_name transforms -- use actual target program name; might have lt- prefix */
-  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
-  strendzap (target_name, ".exe");
-  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
-  XFREE (target_name);
-  target_name = tmp_pathspec;
-  tmp_pathspec = 0;
-
-  LTWRAPPER_DEBUGPRINTF (("(main) libtool target name: %s\n",
-			  target_name));
-EOF
-
-	    cat <<EOF
-  newargz[0] =
-    XMALLOC (char, (strlen (actual_cwrapper_path) +
-		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
-  strcpy (newargz[0], actual_cwrapper_path);
-  strcat (newargz[0], "$objdir");
-  strcat (newargz[0], "/");
-EOF
-
-	    cat <<"EOF"
-  /* stop here, and copy so we don't have to do this twice */
-  tmp_pathspec = xstrdup (newargz[0]);
-
-  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
-  strcat (newargz[0], actual_cwrapper_name);
-
-  /* DO want the lt- prefix here if it exists, so use target_name */
-  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
-  XFREE (tmp_pathspec);
-  tmp_pathspec = NULL;
-EOF
-
-	    case $host_os in
-	      mingw*)
-	    cat <<"EOF"
-  {
-    char* p;
-    while ((p = strchr (newargz[0], '\\')) != NULL)
-      {
-	*p = '/';
-      }
-    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
-      {
-	*p = '/';
-      }
-  }
-EOF
-	    ;;
-	    esac
-
-	    cat <<"EOF"
-  XFREE (target_name);
-  XFREE (actual_cwrapper_path);
-  XFREE (actual_cwrapper_name);
-
-  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
-  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
-  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
-  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
-
-  newargc=0;
-  for (i = 1; i < argc; i++)
-    {
-      if (strncmp (argv[i], env_set_opt, env_set_opt_len) == 0)
-        {
-          if (argv[i][env_set_opt_len] == '=')
-            {
-              const char *p = argv[i] + env_set_opt_len + 1;
-              lt_opt_process_env_set (p);
-            }
-          else if (argv[i][env_set_opt_len] == '\0' && i + 1 < argc)
-            {
-              lt_opt_process_env_set (argv[++i]); /* don't copy */
-            }
-          else
-            lt_fatal ("%s missing required argument", env_set_opt);
-          continue;
-        }
-      if (strncmp (argv[i], env_prepend_opt, env_prepend_opt_len) == 0)
-        {
-          if (argv[i][env_prepend_opt_len] == '=')
-            {
-              const char *p = argv[i] + env_prepend_opt_len + 1;
-              lt_opt_process_env_prepend (p);
-            }
-          else if (argv[i][env_prepend_opt_len] == '\0' && i + 1 < argc)
-            {
-              lt_opt_process_env_prepend (argv[++i]); /* don't copy */
-            }
-          else
-            lt_fatal ("%s missing required argument", env_prepend_opt);
-          continue;
-        }
-      if (strncmp (argv[i], env_append_opt, env_append_opt_len) == 0)
-        {
-          if (argv[i][env_append_opt_len] == '=')
-            {
-              const char *p = argv[i] + env_append_opt_len + 1;
-              lt_opt_process_env_append (p);
-            }
-          else if (argv[i][env_append_opt_len] == '\0' && i + 1 < argc)
-            {
-              lt_opt_process_env_append (argv[++i]); /* don't copy */
-            }
-          else
-            lt_fatal ("%s missing required argument", env_append_opt);
-          continue;
-        }
-      if (strncmp (argv[i], ltwrapper_option_prefix, opt_prefix_len) == 0)
-        {
-          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
-             namespace, but it is not one of the ones we know about and
-             have already dealt with, above (inluding dump-script), then
-             report an error. Otherwise, targets might begin to believe
-             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
-             namespace. The first time any user complains about this, we'll
-             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
-             or a configure.ac-settable value.
-           */
-          lt_fatal ("Unrecognized option in %s namespace: '%s'",
-                    ltwrapper_option_prefix, argv[i]);
-        }
-      /* otherwise ... */
-      newargz[++newargc] = xstrdup (argv[i]);
-    }
-  newargz[++newargc] = NULL;
-
-  LTWRAPPER_DEBUGPRINTF     (("(main) lt_argv_zero : %s\n", (lt_argv_zero ? lt_argv_zero : "<NULL>")));
-  for (i = 0; i < newargc; i++)
-    {
-      LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d]   : %s\n", i, (newargz[i] ? newargz[i] : "<NULL>")));
-    }
-
-EOF
-
-	    case $host_os in
-	      mingw*)
-		cat <<"EOF"
-  /* execv doesn't actually work on mingw as expected on unix */
-  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
-  if (rval == -1)
-    {
-      /* failed to start process */
-      LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno));
-      return 127;
-    }
-  return rval;
-EOF
-		;;
-	      *)
-		cat <<"EOF"
-  execv (lt_argv_zero, newargz);
-  return rval; /* =127, but avoids unused variable warning */
-EOF
-		;;
-	    esac
-
-	    cat <<"EOF"
-}
-
-void *
-xmalloc (size_t num)
-{
-  void *p = (void *) malloc (num);
-  if (!p)
-    lt_fatal ("Memory exhausted");
-
-  return p;
-}
-
-char *
-xstrdup (const char *string)
-{
-  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
-			  string) : NULL;
-}
-
-const char *
-base_name (const char *name)
-{
-  const char *base;
-
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  /* Skip over the disk name in MSDOS pathnames. */
-  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
-    name += 2;
-#endif
-
-  for (base = name; *name; name++)
-    if (IS_DIR_SEPARATOR (*name))
-      base = name + 1;
-  return base;
-}
-
-int
-check_executable (const char *path)
-{
-  struct stat st;
-
-  LTWRAPPER_DEBUGPRINTF (("(check_executable)  : %s\n",
-			  path ? (*path ? path : "EMPTY!") : "NULL!"));
-  if ((!path) || (!*path))
-    return 0;
-
-  if ((stat (path, &st) >= 0)
-      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
-    return 1;
-  else
-    return 0;
-}
-
-int
-make_executable (const char *path)
-{
-  int rval = 0;
-  struct stat st;
-
-  LTWRAPPER_DEBUGPRINTF (("(make_executable)   : %s\n",
-			  path ? (*path ? path : "EMPTY!") : "NULL!"));
-  if ((!path) || (!*path))
-    return 0;
-
-  if (stat (path, &st) >= 0)
-    {
-      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
-    }
-  return rval;
-}
-
-/* Searches for the full path of the wrapper.  Returns
-   newly allocated full path name if found, NULL otherwise
-   Does not chase symlinks, even on platforms that support them.
-*/
-char *
-find_executable (const char *wrapper)
-{
-  int has_slash = 0;
-  const char *p;
-  const char *p_next;
-  /* static buffer for getcwd */
-  char tmp[LT_PATHMAX + 1];
-  int tmp_len;
-  char *concat_name;
-
-  LTWRAPPER_DEBUGPRINTF (("(find_executable)   : %s\n",
-			  wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"));
-
-  if ((wrapper == NULL) || (*wrapper == '\0'))
-    return NULL;
-
-  /* Absolute path? */
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
-    {
-      concat_name = xstrdup (wrapper);
-      if (check_executable (concat_name))
-	return concat_name;
-      XFREE (concat_name);
-    }
-  else
-    {
-#endif
-      if (IS_DIR_SEPARATOR (wrapper[0]))
-	{
-	  concat_name = xstrdup (wrapper);
-	  if (check_executable (concat_name))
-	    return concat_name;
-	  XFREE (concat_name);
-	}
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-    }
-#endif
-
-  for (p = wrapper; *p; p++)
-    if (*p == '/')
-      {
-	has_slash = 1;
-	break;
-      }
-  if (!has_slash)
-    {
-      /* no slashes; search PATH */
-      const char *path = getenv ("PATH");
-      if (path != NULL)
-	{
-	  for (p = path; *p; p = p_next)
-	    {
-	      const char *q;
-	      size_t p_len;
-	      for (q = p; *q; q++)
-		if (IS_PATH_SEPARATOR (*q))
-		  break;
-	      p_len = q - p;
-	      p_next = (*q == '\0' ? q : q + 1);
-	      if (p_len == 0)
-		{
-		  /* empty path: current directory */
-		  if (getcwd (tmp, LT_PATHMAX) == NULL)
-		    lt_fatal ("getcwd failed");
-		  tmp_len = strlen (tmp);
-		  concat_name =
-		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
-		  memcpy (concat_name, tmp, tmp_len);
-		  concat_name[tmp_len] = '/';
-		  strcpy (concat_name + tmp_len + 1, wrapper);
-		}
-	      else
-		{
-		  concat_name =
-		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
-		  memcpy (concat_name, p, p_len);
-		  concat_name[p_len] = '/';
-		  strcpy (concat_name + p_len + 1, wrapper);
-		}
-	      if (check_executable (concat_name))
-		return concat_name;
-	      XFREE (concat_name);
-	    }
-	}
-      /* not found in PATH; assume curdir */
-    }
-  /* Relative path | not found in path: prepend cwd */
-  if (getcwd (tmp, LT_PATHMAX) == NULL)
-    lt_fatal ("getcwd failed");
-  tmp_len = strlen (tmp);
-  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
-  memcpy (concat_name, tmp, tmp_len);
-  concat_name[tmp_len] = '/';
-  strcpy (concat_name + tmp_len + 1, wrapper);
-
-  if (check_executable (concat_name))
-    return concat_name;
-  XFREE (concat_name);
-  return NULL;
-}
-
-char *
-chase_symlinks (const char *pathspec)
-{
-#ifndef S_ISLNK
-  return xstrdup (pathspec);
-#else
-  char buf[LT_PATHMAX];
-  struct stat s;
-  char *tmp_pathspec = xstrdup (pathspec);
-  char *p;
-  int has_symlinks = 0;
-  while (strlen (tmp_pathspec) && !has_symlinks)
-    {
-      LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n",
-			      tmp_pathspec));
-      if (lstat (tmp_pathspec, &s) == 0)
-	{
-	  if (S_ISLNK (s.st_mode) != 0)
-	    {
-	      has_symlinks = 1;
-	      break;
-	    }
-
-	  /* search backwards for last DIR_SEPARATOR */
-	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
-	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
-	    p--;
-	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
-	    {
-	      /* no more DIR_SEPARATORS left */
-	      break;
-	    }
-	  *p = '\0';
-	}
-      else
-	{
-	  char *errstr = strerror (errno);
-	  lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr);
-	}
-    }
-  XFREE (tmp_pathspec);
-
-  if (!has_symlinks)
-    {
-      return xstrdup (pathspec);
-    }
-
-  tmp_pathspec = realpath (pathspec, buf);
-  if (tmp_pathspec == 0)
-    {
-      lt_fatal ("Could not follow symlinks for %s", pathspec);
-    }
-  return xstrdup (tmp_pathspec);
-#endif
-}
-
-char *
-strendzap (char *str, const char *pat)
-{
-  size_t len, patlen;
-
-  assert (str != NULL);
-  assert (pat != NULL);
-
-  len = strlen (str);
-  patlen = strlen (pat);
-
-  if (patlen <= len)
-    {
-      str += len - patlen;
-      if (strcmp (str, pat) == 0)
-	*str = '\0';
-    }
-  return str;
-}
-
-static void
-lt_error_core (int exit_status, const char *mode,
-	       const char *message, va_list ap)
-{
-  fprintf (stderr, "%s: %s: ", program_name, mode);
-  vfprintf (stderr, message, ap);
-  fprintf (stderr, ".\n");
-
-  if (exit_status >= 0)
-    exit (exit_status);
-}
-
-void
-lt_fatal (const char *message, ...)
-{
-  va_list ap;
-  va_start (ap, message);
-  lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
-  va_end (ap);
-}
-
-void
-lt_setenv (const char *name, const char *value)
-{
-  LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n",
-                          (name ? name : "<NULL>"),
-                          (value ? value : "<NULL>")));
-  {
-#ifdef HAVE_SETENV
-    /* always make a copy, for consistency with !HAVE_SETENV */
-    char *str = xstrdup (value);
-    setenv (name, str, 1);
-#else
-    int len = strlen (name) + 1 + strlen (value) + 1;
-    char *str = XMALLOC (char, len);
-    sprintf (str, "%s=%s", name, value);
-    if (putenv (str) != EXIT_SUCCESS)
-      {
-        XFREE (str);
-      }
-#endif
-  }
-}
-
-char *
-lt_extend_str (const char *orig_value, const char *add, int to_end)
-{
-  char *new_value;
-  if (orig_value && *orig_value)
-    {
-      int orig_value_len = strlen (orig_value);
-      int add_len = strlen (add);
-      new_value = XMALLOC (char, add_len + orig_value_len + 1);
-      if (to_end)
-        {
-          strcpy (new_value, orig_value);
-          strcpy (new_value + orig_value_len, add);
-        }
-      else
-        {
-          strcpy (new_value, add);
-          strcpy (new_value + add_len, orig_value);
-        }
-    }
-  else
-    {
-      new_value = xstrdup (add);
-    }
-  return new_value;
-}
-
-int
-lt_split_name_value (const char *arg, char** name, char** value)
-{
-  const char *p;
-  int len;
-  if (!arg || !*arg)
-    return 1;
-
-  p = strchr (arg, (int)'=');
-
-  if (!p)
-    return 1;
-
-  *value = xstrdup (++p);
-
-  len = strlen (arg) - strlen (*value);
-  *name = XMALLOC (char, len);
-  strncpy (*name, arg, len-1);
-  (*name)[len - 1] = '\0';
-
-  return 0;
-}
-
-void
-lt_opt_process_env_set (const char *arg)
-{
-  char *name = NULL;
-  char *value = NULL;
-
-  if (lt_split_name_value (arg, &name, &value) != 0)
-    {
-      XFREE (name);
-      XFREE (value);
-      lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg);
-    }
-
-  lt_setenv (name, value);
-  XFREE (name);
-  XFREE (value);
-}
-
-void
-lt_opt_process_env_prepend (const char *arg)
-{
-  char *name = NULL;
-  char *value = NULL;
-  char *new_value = NULL;
-
-  if (lt_split_name_value (arg, &name, &value) != 0)
-    {
-      XFREE (name);
-      XFREE (value);
-      lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg);
-    }
-
-  new_value = lt_extend_str (getenv (name), value, 0);
-  lt_setenv (name, new_value);
-  XFREE (new_value);
-  XFREE (name);
-  XFREE (value);
-}
-
-void
-lt_opt_process_env_append (const char *arg)
-{
-  char *name = NULL;
-  char *value = NULL;
-  char *new_value = NULL;
-
-  if (lt_split_name_value (arg, &name, &value) != 0)
-    {
-      XFREE (name);
-      XFREE (value);
-      lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg);
-    }
-
-  new_value = lt_extend_str (getenv (name), value, 1);
-  lt_setenv (name, new_value);
-  XFREE (new_value);
-  XFREE (name);
-  XFREE (value);
-}
-
-void
-lt_update_exe_path (const char *name, const char *value)
-{
-  LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
-                          (name ? name : "<NULL>"),
-                          (value ? value : "<NULL>")));
-
-  if (name && *name && value && *value)
-    {
-      char *new_value = lt_extend_str (getenv (name), value, 0);
-      /* some systems can't cope with a ':'-terminated path #' */
-      int len = strlen (new_value);
-      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
-        {
-          new_value[len-1] = '\0';
-        }
-      lt_setenv (name, new_value);
-      XFREE (new_value);
-    }
-}
-
-void
-lt_update_lib_path (const char *name, const char *value)
-{
-  LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
-                          (name ? name : "<NULL>"),
-                          (value ? value : "<NULL>")));
-
-  if (name && *name && value && *value)
-    {
-      char *new_value = lt_extend_str (getenv (name), value, 0);
-      lt_setenv (name, new_value);
-      XFREE (new_value);
-    }
-}
-
-
-EOF
-}
-# end: func_emit_cwrapperexe_src
-
-# func_mode_link arg...
-func_mode_link ()
-{
-    $opt_debug
-    case $host in
-    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-      # It is impossible to link a dll without this setting, and
-      # we shouldn't force the makefile maintainer to figure out
-      # which system we are compiling for in order to pass an extra
-      # flag for every libtool invocation.
-      # allow_undefined=no
-
-      # FIXME: Unfortunately, there are problems with the above when trying
-      # to make a dll which has undefined symbols, in which case not
-      # even a static library is built.  For now, we need to specify
-      # -no-undefined on the libtool link line when we can be certain
-      # that all symbols are satisfied, otherwise we get a static library.
-      allow_undefined=yes
-      ;;
-    *)
-      allow_undefined=yes
-      ;;
-    esac
-    libtool_args=$nonopt
-    base_compile="$nonopt $@"
-    compile_command=$nonopt
-    finalize_command=$nonopt
-
-    compile_rpath=
-    finalize_rpath=
-    compile_shlibpath=
-    finalize_shlibpath=
-    convenience=
-    old_convenience=
-    deplibs=
-    old_deplibs=
-    compiler_flags=
-    linker_flags=
-    dllsearchpath=
-    lib_search_path=`pwd`
-    inst_prefix_dir=
-    new_inherited_linker_flags=
-
-    avoid_version=no
-    dlfiles=
-    dlprefiles=
-    dlself=no
-    export_dynamic=no
-    export_symbols=
-    export_symbols_regex=
-    generated=
-    libobjs=
-    ltlibs=
-    module=no
-    no_install=no
-    objs=
-    non_pic_objects=
-    precious_files_regex=
-    prefer_static_libs=no
-    preload=no
-    prev=
-    prevarg=
-    release=
-    rpath=
-    xrpath=
-    perm_rpath=
-    temp_rpath=
-    thread_safe=no
-    vinfo=
-    vinfo_number=no
-    weak_libs=
-    single_module="${wl}-single_module"
-    func_infer_tag $base_compile
-
-    # We need to know -static, to get the right output filenames.
-    for arg
-    do
-      case $arg in
-      -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
-	build_old_libs=no
-	break
-	;;
-      -all-static | -static | -static-libtool-libs)
-	case $arg in
-	-all-static)
-	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
-	    func_warning "complete static linking is impossible in this configuration"
-	  fi
-	  if test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=yes
-	  ;;
-	-static)
-	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=built
-	  ;;
-	-static-libtool-libs)
-	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=yes
-	  ;;
-	esac
-	build_libtool_libs=no
-	build_old_libs=yes
-	break
-	;;
-      esac
-    done
-
-    # See if our shared archives depend on static archives.
-    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
-
-    # Go through the arguments, transforming them on the way.
-    while test "$#" -gt 0; do
-      arg="$1"
-      shift
-      func_quote_for_eval "$arg"
-      qarg=$func_quote_for_eval_unquoted_result
-      func_append libtool_args " $func_quote_for_eval_result"
-
-      # If the previous option needs an argument, assign it.
-      if test -n "$prev"; then
-	case $prev in
-	output)
-	  func_append compile_command " @OUTPUT@"
-	  func_append finalize_command " @OUTPUT@"
-	  ;;
-	esac
-
-	case $prev in
-	dlfiles|dlprefiles)
-	  if test "$preload" = no; then
-	    # Add the symbol object into the linking commands.
-	    func_append compile_command " @SYMFILE@"
-	    func_append finalize_command " @SYMFILE@"
-	    preload=yes
-	  fi
-	  case $arg in
-	  *.la | *.lo) ;;  # We handle these cases below.
-	  force)
-	    if test "$dlself" = no; then
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  self)
-	    if test "$prev" = dlprefiles; then
-	      dlself=yes
-	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
-	      dlself=yes
-	    else
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  *)
-	    if test "$prev" = dlfiles; then
-	      dlfiles="$dlfiles $arg"
-	    else
-	      dlprefiles="$dlprefiles $arg"
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  esac
-	  ;;
-	expsyms)
-	  export_symbols="$arg"
-	  test -f "$arg" \
-	    || func_fatal_error "symbol file \`$arg' does not exist"
-	  prev=
-	  continue
-	  ;;
-	expsyms_regex)
-	  export_symbols_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	framework)
-	  case $host in
-	    *-*-darwin*)
-	      case "$deplibs " in
-		*" $qarg.ltframework "*) ;;
-		*) deplibs="$deplibs $qarg.ltframework" # this is fixed later
-		   ;;
-	      esac
-	      ;;
-	  esac
-	  prev=
-	  continue
-	  ;;
-	inst_prefix)
-	  inst_prefix_dir="$arg"
-	  prev=
-	  continue
-	  ;;
-	objectlist)
-	  if test -f "$arg"; then
-	    save_arg=$arg
-	    moreargs=
-	    for fil in `cat "$save_arg"`
-	    do
-#	      moreargs="$moreargs $fil"
-	      arg=$fil
-	      # A libtool-controlled object.
-
-	      # Check to see that this really is a libtool object.
-	      if func_lalib_unsafe_p "$arg"; then
-		pic_object=
-		non_pic_object=
-
-		# Read the .lo file
-		func_source "$arg"
-
-		if test -z "$pic_object" ||
-		   test -z "$non_pic_object" ||
-		   test "$pic_object" = none &&
-		   test "$non_pic_object" = none; then
-		  func_fatal_error "cannot find name of object for \`$arg'"
-		fi
-
-		# Extract subdirectory from the argument.
-		func_dirname "$arg" "/" ""
-		xdir="$func_dirname_result"
-
-		if test "$pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  pic_object="$xdir$pic_object"
-
-		  if test "$prev" = dlfiles; then
-		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		      dlfiles="$dlfiles $pic_object"
-		      prev=
-		      continue
-		    else
-		      # If libtool objects are unsupported, then we need to preload.
-		      prev=dlprefiles
-		    fi
-		  fi
-
-		  # CHECK ME:  I think I busted this.  -Ossama
-		  if test "$prev" = dlprefiles; then
-		    # Preload the old-style object.
-		    dlprefiles="$dlprefiles $pic_object"
-		    prev=
-		  fi
-
-		  # A PIC object.
-		  func_append libobjs " $pic_object"
-		  arg="$pic_object"
-		fi
-
-		# Non-PIC object.
-		if test "$non_pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  non_pic_object="$xdir$non_pic_object"
-
-		  # A standard non-PIC object
-		  func_append non_pic_objects " $non_pic_object"
-		  if test -z "$pic_object" || test "$pic_object" = none ; then
-		    arg="$non_pic_object"
-		  fi
-		else
-		  # If the PIC object exists, use it instead.
-		  # $xdir was prepended to $pic_object above.
-		  non_pic_object="$pic_object"
-		  func_append non_pic_objects " $non_pic_object"
-		fi
-	      else
-		# Only an error if not doing a dry-run.
-		if $opt_dry_run; then
-		  # Extract subdirectory from the argument.
-		  func_dirname "$arg" "/" ""
-		  xdir="$func_dirname_result"
-
-		  func_lo2o "$arg"
-		  pic_object=$xdir$objdir/$func_lo2o_result
-		  non_pic_object=$xdir$func_lo2o_result
-		  func_append libobjs " $pic_object"
-		  func_append non_pic_objects " $non_pic_object"
-	        else
-		  func_fatal_error "\`$arg' is not a valid libtool object"
-		fi
-	      fi
-	    done
-	  else
-	    func_fatal_error "link input file \`$arg' does not exist"
-	  fi
-	  arg=$save_arg
-	  prev=
-	  continue
-	  ;;
-	precious_regex)
-	  precious_files_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	release)
-	  release="-$arg"
-	  prev=
-	  continue
-	  ;;
-	rpath | xrpath)
-	  # We need an absolute path.
-	  case $arg in
-	  [\\/]* | [A-Za-z]:[\\/]*) ;;
-	  *)
-	    func_fatal_error "only absolute run-paths are allowed"
-	    ;;
-	  esac
-	  if test "$prev" = rpath; then
-	    case "$rpath " in
-	    *" $arg "*) ;;
-	    *) rpath="$rpath $arg" ;;
-	    esac
-	  else
-	    case "$xrpath " in
-	    *" $arg "*) ;;
-	    *) xrpath="$xrpath $arg" ;;
-	    esac
-	  fi
-	  prev=
-	  continue
-	  ;;
-	shrext)
-	  shrext_cmds="$arg"
-	  prev=
-	  continue
-	  ;;
-	weak)
-	  weak_libs="$weak_libs $arg"
-	  prev=
-	  continue
-	  ;;
-	xcclinker)
-	  linker_flags="$linker_flags $qarg"
-	  compiler_flags="$compiler_flags $qarg"
-	  prev=
-	  func_append compile_command " $qarg"
-	  func_append finalize_command " $qarg"
-	  continue
-	  ;;
-	xcompiler)
-	  compiler_flags="$compiler_flags $qarg"
-	  prev=
-	  func_append compile_command " $qarg"
-	  func_append finalize_command " $qarg"
-	  continue
-	  ;;
-	xlinker)
-	  linker_flags="$linker_flags $qarg"
-	  compiler_flags="$compiler_flags $wl$qarg"
-	  prev=
-	  func_append compile_command " $wl$qarg"
-	  func_append finalize_command " $wl$qarg"
-	  continue
-	  ;;
-	*)
-	  eval "$prev=\"\$arg\""
-	  prev=
-	  continue
-	  ;;
-	esac
-      fi # test -n "$prev"
-
-      prevarg="$arg"
-
-      case $arg in
-      -all-static)
-	if test -n "$link_static_flag"; then
-	  # See comment for -static flag below, for more details.
-	  func_append compile_command " $link_static_flag"
-	  func_append finalize_command " $link_static_flag"
-	fi
-	continue
-	;;
-
-      -allow-undefined)
-	# FIXME: remove this flag sometime in the future.
-	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
-	;;
-
-      -avoid-version)
-	avoid_version=yes
-	continue
-	;;
-
-      -dlopen)
-	prev=dlfiles
-	continue
-	;;
-
-      -dlpreopen)
-	prev=dlprefiles
-	continue
-	;;
-
-      -export-dynamic)
-	export_dynamic=yes
-	continue
-	;;
-
-      -export-symbols | -export-symbols-regex)
-	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
-	  func_fatal_error "more than one -exported-symbols argument is not allowed"
-	fi
-	if test "X$arg" = "X-export-symbols"; then
-	  prev=expsyms
-	else
-	  prev=expsyms_regex
-	fi
-	continue
-	;;
-
-      -framework)
-	prev=framework
-	continue
-	;;
-
-      -inst-prefix-dir)
-	prev=inst_prefix
-	continue
-	;;
-
-      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
-      # so, if we see these flags be careful not to treat them like -L
-      -L[A-Z][A-Z]*:*)
-	case $with_gcc/$host in
-	no/*-*-irix* | /*-*-irix*)
-	  func_append compile_command " $arg"
-	  func_append finalize_command " $arg"
-	  ;;
-	esac
-	continue
-	;;
-
-      -L*)
-	func_stripname '-L' '' "$arg"
-	dir=$func_stripname_result
-	if test -z "$dir"; then
-	  if test "$#" -gt 0; then
-	    func_fatal_error "require no space between \`-L' and \`$1'"
-	  else
-	    func_fatal_error "need path for \`-L' option"
-	  fi
-	fi
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	*)
-	  absdir=`cd "$dir" && pwd`
-	  test -z "$absdir" && \
-	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
-	  dir="$absdir"
-	  ;;
-	esac
-	case "$deplibs " in
-	*" -L$dir "*) ;;
-	*)
-	  deplibs="$deplibs -L$dir"
-	  lib_search_path="$lib_search_path $dir"
-	  ;;
-	esac
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-	  testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$dir:"*) ;;
-	  ::) dllsearchpath=$dir;;
-	  *) dllsearchpath="$dllsearchpath:$dir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  ::) dllsearchpath=$testbindir;;
-	  *) dllsearchpath="$dllsearchpath:$testbindir";;
-	  esac
-	  ;;
-	esac
-	continue
-	;;
-
-      -l*)
-	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*)
-	    # These systems don't actually have a C or math library (as such)
-	    continue
-	    ;;
-	  *-*-os2*)
-	    # These systems don't actually have a C library (as such)
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C and math libraries are in the System framework
-	    deplibs="$deplibs System.ltframework"
-	    continue
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  esac
-	elif test "X$arg" = "X-lc_r"; then
-	 case $host in
-	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	   # Do not include libc_r directly, use -pthread flag.
-	   continue
-	   ;;
-	 esac
-	fi
-	deplibs="$deplibs $arg"
-	continue
-	;;
-
-      -module)
-	module=yes
-	continue
-	;;
-
-      # Tru64 UNIX uses -model [arg] to determine the layout of C++
-      # classes, name mangling, and exception handling.
-      # Darwin uses the -arch flag to determine output architecture.
-      -model|-arch|-isysroot)
-	compiler_flags="$compiler_flags $arg"
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-	prev=xcompiler
-	continue
-	;;
-
-      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
-	compiler_flags="$compiler_flags $arg"
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-	case "$new_inherited_linker_flags " in
-	    *" $arg "*) ;;
-	    * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;;
-	esac
-	continue
-	;;
-
-      -multi_module)
-	single_module="${wl}-multi_module"
-	continue
-	;;
-
-      -no-fast-install)
-	fast_install=no
-	continue
-	;;
-
-      -no-install)
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
-	  # The PATH hackery in wrapper scripts is required on Windows
-	  # and Darwin in order for the loader to find any dlls it needs.
-	  func_warning "\`-no-install' is ignored for $host"
-	  func_warning "assuming \`-no-fast-install' instead"
-	  fast_install=no
-	  ;;
-	*) no_install=yes ;;
-	esac
-	continue
-	;;
-
-      -no-undefined)
-	allow_undefined=no
-	continue
-	;;
-
-      -objectlist)
-	prev=objectlist
-	continue
-	;;
-
-      -o) prev=output ;;
-
-      -precious-files-regex)
-	prev=precious_regex
-	continue
-	;;
-
-      -release)
-	prev=release
-	continue
-	;;
-
-      -rpath)
-	prev=rpath
-	continue
-	;;
-
-      -R)
-	prev=xrpath
-	continue
-	;;
-
-      -R*)
-	func_stripname '-R' '' "$arg"
-	dir=$func_stripname_result
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	*)
-	  func_fatal_error "only absolute run-paths are allowed"
-	  ;;
-	esac
-	case "$xrpath " in
-	*" $dir "*) ;;
-	*) xrpath="$xrpath $dir" ;;
-	esac
-	continue
-	;;
-
-      -shared)
-	# The effects of -shared are defined in a previous loop.
-	continue
-	;;
-
-      -shrext)
-	prev=shrext
-	continue
-	;;
-
-      -static | -static-libtool-libs)
-	# The effects of -static are defined in a previous loop.
-	# We used to do the same as -all-static on platforms that
-	# didn't have a PIC flag, but the assumption that the effects
-	# would be equivalent was wrong.  It would break on at least
-	# Digital Unix and AIX.
-	continue
-	;;
-
-      -thread-safe)
-	thread_safe=yes
-	continue
-	;;
-
-      -version-info)
-	prev=vinfo
-	continue
-	;;
-
-      -version-number)
-	prev=vinfo
-	vinfo_number=yes
-	continue
-	;;
-
-      -weak)
-        prev=weak
-	continue
-	;;
-
-      -Wc,*)
-	func_stripname '-Wc,' '' "$arg"
-	args=$func_stripname_result
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-          func_quote_for_eval "$flag"
-	  arg="$arg $wl$func_quote_for_eval_result"
-	  compiler_flags="$compiler_flags $func_quote_for_eval_result"
-	done
-	IFS="$save_ifs"
-	func_stripname ' ' '' "$arg"
-	arg=$func_stripname_result
-	;;
-
-      -Wl,*)
-	func_stripname '-Wl,' '' "$arg"
-	args=$func_stripname_result
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-          func_quote_for_eval "$flag"
-	  arg="$arg $wl$func_quote_for_eval_result"
-	  compiler_flags="$compiler_flags $wl$func_quote_for_eval_result"
-	  linker_flags="$linker_flags $func_quote_for_eval_result"
-	done
-	IFS="$save_ifs"
-	func_stripname ' ' '' "$arg"
-	arg=$func_stripname_result
-	;;
-
-      -Xcompiler)
-	prev=xcompiler
-	continue
-	;;
-
-      -Xlinker)
-	prev=xlinker
-	continue
-	;;
-
-      -XCClinker)
-	prev=xcclinker
-	continue
-	;;
-
-      # -msg_* for osf cc
-      -msg_*)
-	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-
-      # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
-      # -r[0-9][0-9]* specifies the processor on the SGI compiler
-      # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
-      # +DA*, +DD* enable 64-bit mode on the HP compiler
-      # -q* pass through compiler args for the IBM compiler
-      # -m*, -t[45]*, -txscale* pass through architecture-specific
-      # compiler args for GCC
-      # -F/path gives path to uninstalled frameworks, gcc on darwin
-      # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC
-      # @file GCC response files
-      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*)
-        func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-        func_append compile_command " $arg"
-        func_append finalize_command " $arg"
-        compiler_flags="$compiler_flags $arg"
-        continue
-        ;;
-
-      # Some other compiler flag.
-      -* | +*)
-        func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-
-      *.$objext)
-	# A standard object.
-	objs="$objs $arg"
-	;;
-
-      *.lo)
-	# A libtool-controlled object.
-
-	# Check to see that this really is a libtool object.
-	if func_lalib_unsafe_p "$arg"; then
-	  pic_object=
-	  non_pic_object=
-
-	  # Read the .lo file
-	  func_source "$arg"
-
-	  if test -z "$pic_object" ||
-	     test -z "$non_pic_object" ||
-	     test "$pic_object" = none &&
-	     test "$non_pic_object" = none; then
-	    func_fatal_error "cannot find name of object for \`$arg'"
-	  fi
-
-	  # Extract subdirectory from the argument.
-	  func_dirname "$arg" "/" ""
-	  xdir="$func_dirname_result"
-
-	  if test "$pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    pic_object="$xdir$pic_object"
-
-	    if test "$prev" = dlfiles; then
-	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		dlfiles="$dlfiles $pic_object"
-		prev=
-		continue
-	      else
-		# If libtool objects are unsupported, then we need to preload.
-		prev=dlprefiles
-	      fi
-	    fi
-
-	    # CHECK ME:  I think I busted this.  -Ossama
-	    if test "$prev" = dlprefiles; then
-	      # Preload the old-style object.
-	      dlprefiles="$dlprefiles $pic_object"
-	      prev=
-	    fi
-
-	    # A PIC object.
-	    func_append libobjs " $pic_object"
-	    arg="$pic_object"
-	  fi
-
-	  # Non-PIC object.
-	  if test "$non_pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    non_pic_object="$xdir$non_pic_object"
-
-	    # A standard non-PIC object
-	    func_append non_pic_objects " $non_pic_object"
-	    if test -z "$pic_object" || test "$pic_object" = none ; then
-	      arg="$non_pic_object"
-	    fi
-	  else
-	    # If the PIC object exists, use it instead.
-	    # $xdir was prepended to $pic_object above.
-	    non_pic_object="$pic_object"
-	    func_append non_pic_objects " $non_pic_object"
-	  fi
-	else
-	  # Only an error if not doing a dry-run.
-	  if $opt_dry_run; then
-	    # Extract subdirectory from the argument.
-	    func_dirname "$arg" "/" ""
-	    xdir="$func_dirname_result"
-
-	    func_lo2o "$arg"
-	    pic_object=$xdir$objdir/$func_lo2o_result
-	    non_pic_object=$xdir$func_lo2o_result
-	    func_append libobjs " $pic_object"
-	    func_append non_pic_objects " $non_pic_object"
-	  else
-	    func_fatal_error "\`$arg' is not a valid libtool object"
-	  fi
-	fi
-	;;
-
-      *.$libext)
-	# An archive.
-	deplibs="$deplibs $arg"
-	old_deplibs="$old_deplibs $arg"
-	continue
-	;;
-
-      *.la)
-	# A libtool-controlled library.
-
-	if test "$prev" = dlfiles; then
-	  # This library was specified with -dlopen.
-	  dlfiles="$dlfiles $arg"
-	  prev=
-	elif test "$prev" = dlprefiles; then
-	  # The library was specified with -dlpreopen.
-	  dlprefiles="$dlprefiles $arg"
-	  prev=
-	else
-	  deplibs="$deplibs $arg"
-	fi
-	continue
-	;;
-
-      # Some other compiler argument.
-      *)
-	# Unknown arguments in both finalize_command and compile_command need
-	# to be aesthetically quoted because they are evaled later.
-	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-      esac # arg
-
-      # Now actually substitute the argument into the commands.
-      if test -n "$arg"; then
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-      fi
-    done # argument parsing loop
-
-    test -n "$prev" && \
-      func_fatal_help "the \`$prevarg' option requires an argument"
-
-    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
-      eval arg=\"$export_dynamic_flag_spec\"
-      func_append compile_command " $arg"
-      func_append finalize_command " $arg"
-    fi
-
-    oldlibs=
-    # calculate the name of the file, without its directory
-    func_basename "$output"
-    outputname="$func_basename_result"
-    libobjs_save="$libobjs"
-
-    if test -n "$shlibpath_var"; then
-      # get the directories listed in $shlibpath_var
-      eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
-    else
-      shlib_search_path=
-    fi
-    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
-    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
-
-    func_dirname "$output" "/" ""
-    output_objdir="$func_dirname_result$objdir"
-    # Create the object directory.
-    func_mkdir_p "$output_objdir"
-
-    # Determine the type of output
-    case $output in
-    "")
-      func_fatal_help "you must specify an output file"
-      ;;
-    *.$libext) linkmode=oldlib ;;
-    *.lo | *.$objext) linkmode=obj ;;
-    *.la) linkmode=lib ;;
-    *) linkmode=prog ;; # Anything else should be a program.
-    esac
-
-    specialdeplibs=
-
-    libs=
-    # Find all interdependent deplibs by searching for libraries
-    # that are linked more than once (e.g. -la -lb -la)
-    for deplib in $deplibs; do
-      if $opt_duplicate_deps ; then
-	case "$libs " in
-	*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	esac
-      fi
-      libs="$libs $deplib"
-    done
-
-    if test "$linkmode" = lib; then
-      libs="$predeps $libs $compiler_lib_search_path $postdeps"
-
-      # Compute libraries that are listed more than once in $predeps
-      # $postdeps and mark them as special (i.e., whose duplicates are
-      # not to be eliminated).
-      pre_post_deps=
-      if $opt_duplicate_compiler_generated_deps; then
-	for pre_post_dep in $predeps $postdeps; do
-	  case "$pre_post_deps " in
-	  *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
-	  esac
-	  pre_post_deps="$pre_post_deps $pre_post_dep"
-	done
-      fi
-      pre_post_deps=
-    fi
-
-    deplibs=
-    newdependency_libs=
-    newlib_search_path=
-    need_relink=no # whether we're linking any uninstalled libtool libraries
-    notinst_deplibs= # not-installed libtool libraries
-    notinst_path= # paths that contain not-installed libtool libraries
-
-    case $linkmode in
-    lib)
-	passes="conv dlpreopen link"
-	for file in $dlfiles $dlprefiles; do
-	  case $file in
-	  *.la) ;;
-	  *)
-	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
-	    ;;
-	  esac
-	done
-	;;
-    prog)
-	compile_deplibs=
-	finalize_deplibs=
-	alldeplibs=no
-	newdlfiles=
-	newdlprefiles=
-	passes="conv scan dlopen dlpreopen link"
-	;;
-    *)  passes="conv"
-	;;
-    esac
-
-    for pass in $passes; do
-      # The preopen pass in lib mode reverses $deplibs; put it back here
-      # so that -L comes before libs that need it for instance...
-      if test "$linkmode,$pass" = "lib,link"; then
-	## FIXME: Find the place where the list is rebuilt in the wrong
-	##        order, and fix it there properly
-        tmp_deplibs=
-	for deplib in $deplibs; do
-	  tmp_deplibs="$deplib $tmp_deplibs"
-	done
-	deplibs="$tmp_deplibs"
-      fi
-
-      if test "$linkmode,$pass" = "lib,link" ||
-	 test "$linkmode,$pass" = "prog,scan"; then
-	libs="$deplibs"
-	deplibs=
-      fi
-      if test "$linkmode" = prog; then
-	case $pass in
-	dlopen) libs="$dlfiles" ;;
-	dlpreopen) libs="$dlprefiles" ;;
-	link)
-	  libs="$deplibs %DEPLIBS%"
-	  test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
-	  ;;
-	esac
-      fi
-      if test "$linkmode,$pass" = "lib,dlpreopen"; then
-	# Collect and forward deplibs of preopened libtool libs
-	for lib in $dlprefiles; do
-	  # Ignore non-libtool-libs
-	  dependency_libs=
-	  case $lib in
-	  *.la)	func_source "$lib" ;;
-	  esac
-
-	  # Collect preopened libtool deplibs, except any this library
-	  # has declared as weak libs
-	  for deplib in $dependency_libs; do
-            deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"`
-	    case " $weak_libs " in
-	    *" $deplib_base "*) ;;
-	    *) deplibs="$deplibs $deplib" ;;
-	    esac
-	  done
-	done
-	libs="$dlprefiles"
-      fi
-      if test "$pass" = dlopen; then
-	# Collect dlpreopened libraries
-	save_deplibs="$deplibs"
-	deplibs=
-      fi
-
-      for deplib in $libs; do
-	lib=
-	found=no
-	case $deplib in
-	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
-	  if test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$deplib $compile_deplibs"
-	    finalize_deplibs="$deplib $finalize_deplibs"
-	  else
-	    compiler_flags="$compiler_flags $deplib"
-	    if test "$linkmode" = lib ; then
-		case "$new_inherited_linker_flags " in
-		    *" $deplib "*) ;;
-		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
-		esac
-	    fi
-	  fi
-	  continue
-	  ;;
-	-l*)
-	  if test "$linkmode" != lib && test "$linkmode" != prog; then
-	    func_warning "\`-l' is ignored for archives/objects"
-	    continue
-	  fi
-	  func_stripname '-l' '' "$deplib"
-	  name=$func_stripname_result
-	  if test "$linkmode" = lib; then
-	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
-	  else
-	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
-	  fi
-	  for searchdir in $searchdirs; do
-	    for search_ext in .la $std_shrext .so .a; do
-	      # Search the libtool library
-	      lib="$searchdir/lib${name}${search_ext}"
-	      if test -f "$lib"; then
-		if test "$search_ext" = ".la"; then
-		  found=yes
-		else
-		  found=no
-		fi
-		break 2
-	      fi
-	    done
-	  done
-	  if test "$found" != yes; then
-	    # deplib doesn't seem to be a libtool library
-	    if test "$linkmode,$pass" = "prog,link"; then
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      deplibs="$deplib $deplibs"
-	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    continue
-	  else # deplib is a libtool library
-	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
-	    # We need to do some special things here, and not later.
-	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	      case " $predeps $postdeps " in
-	      *" $deplib "*)
-		if func_lalib_p "$lib"; then
-		  library_names=
-		  old_library=
-		  func_source "$lib"
-		  for l in $old_library $library_names; do
-		    ll="$l"
-		  done
-		  if test "X$ll" = "X$old_library" ; then # only static version available
-		    found=no
-		    func_dirname "$lib" "" "."
-		    ladir="$func_dirname_result"
-		    lib=$ladir/$old_library
-		    if test "$linkmode,$pass" = "prog,link"; then
-		      compile_deplibs="$deplib $compile_deplibs"
-		      finalize_deplibs="$deplib $finalize_deplibs"
-		    else
-		      deplibs="$deplib $deplibs"
-		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-		    fi
-		    continue
-		  fi
-		fi
-		;;
-	      *) ;;
-	      esac
-	    fi
-	  fi
-	  ;; # -l
-	*.ltframework)
-	  if test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$deplib $compile_deplibs"
-	    finalize_deplibs="$deplib $finalize_deplibs"
-	  else
-	    deplibs="$deplib $deplibs"
-	    if test "$linkmode" = lib ; then
-		case "$new_inherited_linker_flags " in
-		    *" $deplib "*) ;;
-		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
-		esac
-	    fi
-	  fi
-	  continue
-	  ;;
-	-L*)
-	  case $linkmode in
-	  lib)
-	    deplibs="$deplib $deplibs"
-	    test "$pass" = conv && continue
-	    newdependency_libs="$deplib $newdependency_libs"
-	    func_stripname '-L' '' "$deplib"
-	    newlib_search_path="$newlib_search_path $func_stripname_result"
-	    ;;
-	  prog)
-	    if test "$pass" = conv; then
-	      deplibs="$deplib $deplibs"
-	      continue
-	    fi
-	    if test "$pass" = scan; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    func_stripname '-L' '' "$deplib"
-	    newlib_search_path="$newlib_search_path $func_stripname_result"
-	    ;;
-	  *)
-	    func_warning "\`-L' is ignored for archives/objects"
-	    ;;
-	  esac # linkmode
-	  continue
-	  ;; # -L
-	-R*)
-	  if test "$pass" = link; then
-	    func_stripname '-R' '' "$deplib"
-	    dir=$func_stripname_result
-	    # Make sure the xrpath contains only unique directories.
-	    case "$xrpath " in
-	    *" $dir "*) ;;
-	    *) xrpath="$xrpath $dir" ;;
-	    esac
-	  fi
-	  deplibs="$deplib $deplibs"
-	  continue
-	  ;;
-	*.la) lib="$deplib" ;;
-	*.$libext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	    continue
-	  fi
-	  case $linkmode in
-	  lib)
-	    # Linking convenience modules into shared libraries is allowed,
-	    # but linking other static libraries is non-portable.
-	    case " $dlpreconveniencelibs " in
-	    *" $deplib "*) ;;
-	    *)
-	      valid_a_lib=no
-	      case $deplibs_check_method in
-		match_pattern*)
-		  set dummy $deplibs_check_method; shift
-		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-		  if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \
-		    | $EGREP "$match_pattern_regex" > /dev/null; then
-		    valid_a_lib=yes
-		  fi
-		;;
-		pass_all)
-		  valid_a_lib=yes
-		;;
-	      esac
-	      if test "$valid_a_lib" != yes; then
-		$ECHO
-		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
-		$ECHO "*** I have the capability to make that library automatically link in when"
-		$ECHO "*** you link to this library.  But I can only do this if you have a"
-		$ECHO "*** shared version of the library, which you do not appear to have"
-		$ECHO "*** because the file extensions .$libext of this argument makes me believe"
-		$ECHO "*** that it is just a static archive that I should not use here."
-	      else
-		$ECHO
-		$ECHO "*** Warning: Linking the shared library $output against the"
-		$ECHO "*** static library $deplib is not portable!"
-		deplibs="$deplib $deplibs"
-	      fi
-	      ;;
-	    esac
-	    continue
-	    ;;
-	  prog)
-	    if test "$pass" != link; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    continue
-	    ;;
-	  esac # linkmode
-	  ;; # *.$libext
-	*.lo | *.$objext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	  elif test "$linkmode" = prog; then
-	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
-	      # If there is no dlopen support or we're linking statically,
-	      # we need to preload.
-	      newdlprefiles="$newdlprefiles $deplib"
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      newdlfiles="$newdlfiles $deplib"
-	    fi
-	  fi
-	  continue
-	  ;;
-	%DEPLIBS%)
-	  alldeplibs=yes
-	  continue
-	  ;;
-	esac # case $deplib
-
-	if test "$found" = yes || test -f "$lib"; then :
-	else
-	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
-	fi
-
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$lib" \
-	  || func_fatal_error "\`$lib' is not a valid libtool archive"
-
-	func_dirname "$lib" "" "."
-	ladir="$func_dirname_result"
-
-	dlname=
-	dlopen=
-	dlpreopen=
-	libdir=
-	library_names=
-	old_library=
-	inherited_linker_flags=
-	# If the library was installed with an old release of libtool,
-	# it will not redefine variables installed, or shouldnotlink
-	installed=yes
-	shouldnotlink=no
-	avoidtemprpath=
-
-
-	# Read the .la file
-	func_source "$lib"
-
-	# Convert "-framework foo" to "foo.ltframework"
-	if test -n "$inherited_linker_flags"; then
-	  tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'`
-	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
-	    case " $new_inherited_linker_flags " in
-	      *" $tmp_inherited_linker_flag "*) ;;
-	      *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";;
-	    esac
-	  done
-	fi
-	dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-	if test "$linkmode,$pass" = "lib,link" ||
-	   test "$linkmode,$pass" = "prog,scan" ||
-	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
-	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
-	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
-	fi
-
-	if test "$pass" = conv; then
-	  # Only check for convenience libraries
-	  deplibs="$lib $deplibs"
-	  if test -z "$libdir"; then
-	    if test -z "$old_library"; then
-	      func_fatal_error "cannot find name of link library for \`$lib'"
-	    fi
-	    # It is a libtool convenience library, so add in its objects.
-	    convenience="$convenience $ladir/$objdir/$old_library"
-	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
-	    tmp_libs=
-	    for deplib in $dependency_libs; do
-	      deplibs="$deplib $deplibs"
-	      if $opt_duplicate_deps ; then
-		case "$tmp_libs " in
-		*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-		esac
-	      fi
-	      tmp_libs="$tmp_libs $deplib"
-	    done
-	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
-	    func_fatal_error "\`$lib' is not a convenience library"
-	  fi
-	  continue
-	fi # $pass = conv
-
-
-	# Get the name of the library we link against.
-	linklib=
-	for l in $old_library $library_names; do
-	  linklib="$l"
-	done
-	if test -z "$linklib"; then
-	  func_fatal_error "cannot find name of link library for \`$lib'"
-	fi
-
-	# This library was specified with -dlopen.
-	if test "$pass" = dlopen; then
-	  if test -z "$libdir"; then
-	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
-	  fi
-	  if test -z "$dlname" ||
-	     test "$dlopen_support" != yes ||
-	     test "$build_libtool_libs" = no; then
-	    # If there is no dlname, no dlopen support or we're linking
-	    # statically, we need to preload.  We also need to preload any
-	    # dependent libraries so libltdl's deplib preloader doesn't
-	    # bomb out in the load deplibs phase.
-	    dlprefiles="$dlprefiles $lib $dependency_libs"
-	  else
-	    newdlfiles="$newdlfiles $lib"
-	  fi
-	  continue
-	fi # $pass = dlopen
-
-	# We need an absolute path.
-	case $ladir in
-	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
-	*)
-	  abs_ladir=`cd "$ladir" && pwd`
-	  if test -z "$abs_ladir"; then
-	    func_warning "cannot determine absolute directory name of \`$ladir'"
-	    func_warning "passing it literally to the linker, although it might fail"
-	    abs_ladir="$ladir"
-	  fi
-	  ;;
-	esac
-	func_basename "$lib"
-	laname="$func_basename_result"
-
-	# Find the relevant object directory and library name.
-	if test "X$installed" = Xyes; then
-	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    func_warning "library \`$lib' was moved."
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    libdir="$abs_ladir"
-	  else
-	    dir="$libdir"
-	    absdir="$libdir"
-	  fi
-	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
-	else
-	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    # Remove this search path later
-	    notinst_path="$notinst_path $abs_ladir"
-	  else
-	    dir="$ladir/$objdir"
-	    absdir="$abs_ladir/$objdir"
-	    # Remove this search path later
-	    notinst_path="$notinst_path $abs_ladir"
-	  fi
-	fi # $installed = yes
-	func_stripname 'lib' '.la' "$laname"
-	name=$func_stripname_result
-
-	# This library was specified with -dlpreopen.
-	if test "$pass" = dlpreopen; then
-	  if test -z "$libdir" && test "$linkmode" = prog; then
-	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
-	  fi
-	  # Prefer using a static library (so that no silly _DYNAMIC symbols
-	  # are required to link).
-	  if test -n "$old_library"; then
-	    newdlprefiles="$newdlprefiles $dir/$old_library"
-	    # Keep a list of preopened convenience libraries to check
-	    # that they are being used correctly in the link pass.
-	    test -z "$libdir" && \
-		dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library"
-	  # Otherwise, use the dlname, so that lt_dlopen finds it.
-	  elif test -n "$dlname"; then
-	    newdlprefiles="$newdlprefiles $dir/$dlname"
-	  else
-	    newdlprefiles="$newdlprefiles $dir/$linklib"
-	  fi
-	fi # $pass = dlpreopen
-
-	if test -z "$libdir"; then
-	  # Link the convenience library
-	  if test "$linkmode" = lib; then
-	    deplibs="$dir/$old_library $deplibs"
-	  elif test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$dir/$old_library $compile_deplibs"
-	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
-	  else
-	    deplibs="$lib $deplibs" # used for prog,scan pass
-	  fi
-	  continue
-	fi
-
-
-	if test "$linkmode" = prog && test "$pass" != link; then
-	  newlib_search_path="$newlib_search_path $ladir"
-	  deplibs="$lib $deplibs"
-
-	  linkalldeplibs=no
-	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
-	     test "$build_libtool_libs" = no; then
-	    linkalldeplibs=yes
-	  fi
-
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    case $deplib in
-	    -L*) func_stripname '-L' '' "$deplib"
-	         newlib_search_path="$newlib_search_path $func_stripname_result"
-		 ;;
-	    esac
-	    # Need to link against all dependency_libs?
-	    if test "$linkalldeplibs" = yes; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      # Need to hardcode shared library paths
-	      # or/and link against static libraries
-	      newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    if $opt_duplicate_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
-	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done # for deplib
-	  continue
-	fi # $linkmode = prog...
-
-	if test "$linkmode,$pass" = "prog,link"; then
-	  if test -n "$library_names" &&
-	     { { test "$prefer_static_libs" = no ||
-	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
-	       test -z "$old_library"; }; then
-	    # We need to hardcode the library path
-	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
-	      # Make sure the rpath contains only unique directories.
-	      case "$temp_rpath:" in
-	      *"$absdir:"*) ;;
-	      *) temp_rpath="$temp_rpath$absdir:" ;;
-	      esac
-	    fi
-
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) compile_rpath="$compile_rpath $absdir"
-	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) finalize_rpath="$finalize_rpath $libdir"
-	      esac
-	      ;;
-	    esac
-	  fi # $linkmode,$pass = prog,link...
-
-	  if test "$alldeplibs" = yes &&
-	     { test "$deplibs_check_method" = pass_all ||
-	       { test "$build_libtool_libs" = yes &&
-		 test -n "$library_names"; }; }; then
-	    # We only need to search for static libraries
-	    continue
-	  fi
-	fi
-
-	link_static=no # Whether the deplib will be linked statically
-	use_static_libs=$prefer_static_libs
-	if test "$use_static_libs" = built && test "$installed" = yes; then
-	  use_static_libs=no
-	fi
-	if test -n "$library_names" &&
-	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
-	  case $host in
-	  *cygwin* | *mingw* | *cegcc*)
-	      # No point in relinking DLLs because paths are not encoded
-	      notinst_deplibs="$notinst_deplibs $lib"
-	      need_relink=no
-	    ;;
-	  *)
-	    if test "$installed" = no; then
-	      notinst_deplibs="$notinst_deplibs $lib"
-	      need_relink=yes
-	    fi
-	    ;;
-	  esac
-	  # This is a shared library
-
-	  # Warn about portability, can't link against -module's on some
-	  # systems (darwin).  Don't bleat about dlopened modules though!
-	  dlopenmodule=""
-	  for dlpremoduletest in $dlprefiles; do
-	    if test "X$dlpremoduletest" = "X$lib"; then
-	      dlopenmodule="$dlpremoduletest"
-	      break
-	    fi
-	  done
-	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
-	    $ECHO
-	    if test "$linkmode" = prog; then
-	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
-	    else
-	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
-	    fi
-	    $ECHO "*** $linklib is not portable!"
-	  fi
-	  if test "$linkmode" = lib &&
-	     test "$hardcode_into_libs" = yes; then
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) compile_rpath="$compile_rpath $absdir"
-	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) finalize_rpath="$finalize_rpath $libdir"
-	      esac
-	      ;;
-	    esac
-	  fi
-
-	  if test -n "$old_archive_from_expsyms_cmds"; then
-	    # figure out the soname
-	    set dummy $library_names
-	    shift
-	    realname="$1"
-	    shift
-	    libname=`eval "\\$ECHO \"$libname_spec\""`
-	    # use dlname if we got it. it's perfectly good, no?
-	    if test -n "$dlname"; then
-	      soname="$dlname"
-	    elif test -n "$soname_spec"; then
-	      # bleh windows
-	      case $host in
-	      *cygwin* | mingw* | *cegcc*)
-	        func_arith $current - $age
-		major=$func_arith_result
-		versuffix="-$major"
-		;;
-	      esac
-	      eval soname=\"$soname_spec\"
-	    else
-	      soname="$realname"
-	    fi
-
-	    # Make a new name for the extract_expsyms_cmds to use
-	    soroot="$soname"
-	    func_basename "$soroot"
-	    soname="$func_basename_result"
-	    func_stripname 'lib' '.dll' "$soname"
-	    newlib=libimp-$func_stripname_result.a
-
-	    # If the library has no export list, then create one now
-	    if test -f "$output_objdir/$soname-def"; then :
-	    else
-	      func_verbose "extracting exported symbol list from \`$soname'"
-	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
-	    fi
-
-	    # Create $newlib
-	    if test -f "$output_objdir/$newlib"; then :; else
-	      func_verbose "generating import library for \`$soname'"
-	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
-	    fi
-	    # make sure the library variables are pointing to the new library
-	    dir=$output_objdir
-	    linklib=$newlib
-	  fi # test -n "$old_archive_from_expsyms_cmds"
-
-	  if test "$linkmode" = prog || test "$mode" != relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    lib_linked=yes
-	    case $hardcode_action in
-	    immediate | unsupported)
-	      if test "$hardcode_direct" = no; then
-		add="$dir/$linklib"
-		case $host in
-		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
-		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
-		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
-		    *-*-unixware7*) add_dir="-L$dir" ;;
-		  *-*-darwin* )
-		    # if the lib is a (non-dlopened) module then we can not
-		    # link against it, someone is ignoring the earlier warnings
-		    if /usr/bin/file -L $add 2> /dev/null |
-			 $GREP ": [^:]* bundle" >/dev/null ; then
-		      if test "X$dlopenmodule" != "X$lib"; then
-			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
-			if test -z "$old_library" ; then
-			  $ECHO
-			  $ECHO "*** And there doesn't seem to be a static archive available"
-			  $ECHO "*** The link will probably fail, sorry"
-			else
-			  add="$dir/$old_library"
-			fi
-		      elif test -n "$old_library"; then
-			add="$dir/$old_library"
-		      fi
-		    fi
-		esac
-	      elif test "$hardcode_minus_L" = no; then
-		case $host in
-		*-*-sunos*) add_shlibpath="$dir" ;;
-		esac
-		add_dir="-L$dir"
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = no; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    relink)
-	      if test "$hardcode_direct" = yes &&
-	         test "$hardcode_direct_absolute" = no; then
-		add="$dir/$linklib"
-	      elif test "$hardcode_minus_L" = yes; then
-		add_dir="-L$dir"
-		# Try looking first in the location we're being installed to.
-		if test -n "$inst_prefix_dir"; then
-		  case $libdir in
-		    [\\/]*)
-		      add_dir="$add_dir -L$inst_prefix_dir$libdir"
-		      ;;
-		  esac
-		fi
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = yes; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    *) lib_linked=no ;;
-	    esac
-
-	    if test "$lib_linked" != yes; then
-	      func_fatal_configuration "unsupported hardcode properties"
-	    fi
-
-	    if test -n "$add_shlibpath"; then
-	      case :$compile_shlibpath: in
-	      *":$add_shlibpath:"*) ;;
-	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
-	      esac
-	    fi
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
-	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	      if test "$hardcode_direct" != yes &&
-		 test "$hardcode_minus_L" != yes &&
-		 test "$hardcode_shlibpath_var" = yes; then
-		case :$finalize_shlibpath: in
-		*":$libdir:"*) ;;
-		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
-		esac
-	      fi
-	    fi
-	  fi
-
-	  if test "$linkmode" = prog || test "$mode" = relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    # Finalize command for both is simple: just hardcode it.
-	    if test "$hardcode_direct" = yes &&
-	       test "$hardcode_direct_absolute" = no; then
-	      add="$libdir/$linklib"
-	    elif test "$hardcode_minus_L" = yes; then
-	      add_dir="-L$libdir"
-	      add="-l$name"
-	    elif test "$hardcode_shlibpath_var" = yes; then
-	      case :$finalize_shlibpath: in
-	      *":$libdir:"*) ;;
-	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
-	      esac
-	      add="-l$name"
-	    elif test "$hardcode_automatic" = yes; then
-	      if test -n "$inst_prefix_dir" &&
-		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
-		add="$inst_prefix_dir$libdir/$linklib"
-	      else
-		add="$libdir/$linklib"
-	      fi
-	    else
-	      # We cannot seem to hardcode it, guess we'll fake it.
-	      add_dir="-L$libdir"
-	      # Try looking first in the location we're being installed to.
-	      if test -n "$inst_prefix_dir"; then
-		case $libdir in
-		  [\\/]*)
-		    add_dir="$add_dir -L$inst_prefix_dir$libdir"
-		    ;;
-		esac
-	      fi
-	      add="-l$name"
-	    fi
-
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
-	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	    fi
-	  fi
-	elif test "$linkmode" = prog; then
-	  # Here we assume that one of hardcode_direct or hardcode_minus_L
-	  # is not unsupported.  This is valid on all known static and
-	  # shared platforms.
-	  if test "$hardcode_direct" != unsupported; then
-	    test -n "$old_library" && linklib="$old_library"
-	    compile_deplibs="$dir/$linklib $compile_deplibs"
-	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
-	  else
-	    compile_deplibs="-l$name -L$dir $compile_deplibs"
-	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
-	  fi
-	elif test "$build_libtool_libs" = yes; then
-	  # Not a shared library
-	  if test "$deplibs_check_method" != pass_all; then
-	    # We're trying link a shared library against a static one
-	    # but the system doesn't support it.
-
-	    # Just print a warning and add the library to dependency_libs so
-	    # that the program can be linked against the static library.
-	    $ECHO
-	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
-	    $ECHO "*** I have the capability to make that library automatically link in when"
-	    $ECHO "*** you link to this library.  But I can only do this if you have a"
-	    $ECHO "*** shared version of the library, which you do not appear to have."
-	    if test "$module" = yes; then
-	      $ECHO "*** But as you try to build a module library, libtool will still create "
-	      $ECHO "*** a static module, that should work as long as the dlopening application"
-	      $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime."
-	      if test -z "$global_symbol_pipe"; then
-		$ECHO
-		$ECHO "*** However, this would only work if libtool was able to extract symbol"
-		$ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
-		$ECHO "*** not find such a program.  So, this module is probably useless."
-		$ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
-	      fi
-	      if test "$build_old_libs" = no; then
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
-	  else
-	    deplibs="$dir/$old_library $deplibs"
-	    link_static=yes
-	  fi
-	fi # link shared/static library?
-
-	if test "$linkmode" = lib; then
-	  if test -n "$dependency_libs" &&
-	     { test "$hardcode_into_libs" != yes ||
-	       test "$build_old_libs" = yes ||
-	       test "$link_static" = yes; }; then
-	    # Extract -R from dependency_libs
-	    temp_deplibs=
-	    for libdir in $dependency_libs; do
-	      case $libdir in
-	      -R*) func_stripname '-R' '' "$libdir"
-	           temp_xrpath=$func_stripname_result
-		   case " $xrpath " in
-		   *" $temp_xrpath "*) ;;
-		   *) xrpath="$xrpath $temp_xrpath";;
-		   esac;;
-	      *) temp_deplibs="$temp_deplibs $libdir";;
-	      esac
-	    done
-	    dependency_libs="$temp_deplibs"
-	  fi
-
-	  newlib_search_path="$newlib_search_path $absdir"
-	  # Link against this library
-	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
-	  # ... and its dependency_libs
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    newdependency_libs="$deplib $newdependency_libs"
-	    if $opt_duplicate_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
-	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done
-
-	  if test "$link_all_deplibs" != no; then
-	    # Add the search paths of all dependency libraries
-	    for deplib in $dependency_libs; do
-	      path=
-	      case $deplib in
-	      -L*) path="$deplib" ;;
-	      *.la)
-	        func_dirname "$deplib" "" "."
-		dir="$func_dirname_result"
-		# We need an absolute path.
-		case $dir in
-		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
-		*)
-		  absdir=`cd "$dir" && pwd`
-		  if test -z "$absdir"; then
-		    func_warning "cannot determine absolute directory name of \`$dir'"
-		    absdir="$dir"
-		  fi
-		  ;;
-		esac
-		if $GREP "^installed=no" $deplib > /dev/null; then
-		case $host in
-		*-*-darwin*)
-		  depdepl=
-		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
-		  if test -n "$deplibrary_names" ; then
-		    for tmp in $deplibrary_names ; do
-		      depdepl=$tmp
-		    done
-		    if test -f "$absdir/$objdir/$depdepl" ; then
-		      depdepl="$absdir/$objdir/$depdepl"
-		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
-                      if test -z "$darwin_install_name"; then
-                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
-                      fi
-		      compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
-		      linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}"
-		      path=
-		    fi
-		  fi
-		  ;;
-		*)
-		  path="-L$absdir/$objdir"
-		  ;;
-		esac
-		else
-		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		  test -z "$libdir" && \
-		    func_fatal_error "\`$deplib' is not a valid libtool archive"
-		  test "$absdir" != "$libdir" && \
-		    func_warning "\`$deplib' seems to be moved"
-
-		  path="-L$absdir"
-		fi
-		;;
-	      esac
-	      case " $deplibs " in
-	      *" $path "*) ;;
-	      *) deplibs="$path $deplibs" ;;
-	      esac
-	    done
-	  fi # link_all_deplibs != no
-	fi # linkmode = lib
-      done # for deplib in $libs
-      if test "$pass" = link; then
-	if test "$linkmode" = "prog"; then
-	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
-	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
-	else
-	  compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-	fi
-      fi
-      dependency_libs="$newdependency_libs"
-      if test "$pass" = dlpreopen; then
-	# Link the dlpreopened libraries before other libraries
-	for deplib in $save_deplibs; do
-	  deplibs="$deplib $deplibs"
-	done
-      fi
-      if test "$pass" != dlopen; then
-	if test "$pass" != conv; then
-	  # Make sure lib_search_path contains only unique directories.
-	  lib_search_path=
-	  for dir in $newlib_search_path; do
-	    case "$lib_search_path " in
-	    *" $dir "*) ;;
-	    *) lib_search_path="$lib_search_path $dir" ;;
-	    esac
-	  done
-	  newlib_search_path=
-	fi
-
-	if test "$linkmode,$pass" != "prog,link"; then
-	  vars="deplibs"
-	else
-	  vars="compile_deplibs finalize_deplibs"
-	fi
-	for var in $vars dependency_libs; do
-	  # Add libraries to $var in reverse order
-	  eval tmp_libs=\"\$$var\"
-	  new_libs=
-	  for deplib in $tmp_libs; do
-	    # FIXME: Pedantically, this is the right thing to do, so
-	    #        that some nasty dependency loop isn't accidentally
-	    #        broken:
-	    #new_libs="$deplib $new_libs"
-	    # Pragmatically, this seems to cause very few problems in
-	    # practice:
-	    case $deplib in
-	    -L*) new_libs="$deplib $new_libs" ;;
-	    -R*) ;;
-	    *)
-	      # And here is the reason: when a library appears more
-	      # than once as an explicit dependence of a library, or
-	      # is implicitly linked in more than once by the
-	      # compiler, it is considered special, and multiple
-	      # occurrences thereof are not removed.  Compare this
-	      # with having the same library being listed as a
-	      # dependency of multiple other libraries: in this case,
-	      # we know (pedantically, we assume) the library does not
-	      # need to be listed more than once, so we keep only the
-	      # last copy.  This is not always right, but it is rare
-	      # enough that we require users that really mean to play
-	      # such unportable linking tricks to link the library
-	      # using -Wl,-lname, so that libtool does not consider it
-	      # for duplicate removal.
-	      case " $specialdeplibs " in
-	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
-	      *)
-		case " $new_libs " in
-		*" $deplib "*) ;;
-		*) new_libs="$deplib $new_libs" ;;
-		esac
-		;;
-	      esac
-	      ;;
-	    esac
-	  done
-	  tmp_libs=
-	  for deplib in $new_libs; do
-	    case $deplib in
-	    -L*)
-	      case " $tmp_libs " in
-	      *" $deplib "*) ;;
-	      *) tmp_libs="$tmp_libs $deplib" ;;
-	      esac
-	      ;;
-	    *) tmp_libs="$tmp_libs $deplib" ;;
-	    esac
-	  done
-	  eval $var=\"$tmp_libs\"
-	done # for var
-      fi
-      # Last step: remove runtime libs from dependency_libs
-      # (they stay in deplibs)
-      tmp_libs=
-      for i in $dependency_libs ; do
-	case " $predeps $postdeps $compiler_lib_search_path " in
-	*" $i "*)
-	  i=""
-	  ;;
-	esac
-	if test -n "$i" ; then
-	  tmp_libs="$tmp_libs $i"
-	fi
-      done
-      dependency_libs=$tmp_libs
-    done # for pass
-    if test "$linkmode" = prog; then
-      dlfiles="$newdlfiles"
-    fi
-    if test "$linkmode" = prog || test "$linkmode" = lib; then
-      dlprefiles="$newdlprefiles"
-    fi
-
-    case $linkmode in
-    oldlib)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for archives"
-      fi
-
-      case " $deplibs" in
-      *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for archives" ;;
-      esac
-
-      test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for archives"
-
-      test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for archives"
-
-      test -n "$vinfo" && \
-	func_warning "\`-version-info/-version-number' is ignored for archives"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for archives"
-
-      test -n "$export_symbols$export_symbols_regex" && \
-	func_warning "\`-export-symbols' is ignored for archives"
-
-      # Now set the variables for building old libraries.
-      build_libtool_libs=no
-      oldlibs="$output"
-      objs="$objs$old_deplibs"
-      ;;
-
-    lib)
-      # Make sure we only generate libraries of the form `libNAME.la'.
-      case $outputname in
-      lib*)
-	func_stripname 'lib' '.la' "$outputname"
-	name=$func_stripname_result
-	eval shared_ext=\"$shrext_cmds\"
-	eval libname=\"$libname_spec\"
-	;;
-      *)
-	test "$module" = no && \
-	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
-
-	if test "$need_lib_prefix" != no; then
-	  # Add the "lib" prefix for modules if required
-	  func_stripname '' '.la' "$outputname"
-	  name=$func_stripname_result
-	  eval shared_ext=\"$shrext_cmds\"
-	  eval libname=\"$libname_spec\"
-	else
-	  func_stripname '' '.la' "$outputname"
-	  libname=$func_stripname_result
-	fi
-	;;
-      esac
-
-      if test -n "$objs"; then
-	if test "$deplibs_check_method" != pass_all; then
-	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
-	else
-	  $ECHO
-	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
-	  $ECHO "*** objects $objs is not portable!"
-	  libobjs="$libobjs $objs"
-	fi
-      fi
-
-      test "$dlself" != no && \
-	func_warning "\`-dlopen self' is ignored for libtool libraries"
-
-      set dummy $rpath
-      shift
-      test "$#" -gt 1 && \
-	func_warning "ignoring multiple \`-rpath's for a libtool library"
-
-      install_libdir="$1"
-
-      oldlibs=
-      if test -z "$rpath"; then
-	if test "$build_libtool_libs" = yes; then
-	  # Building a libtool convenience library.
-	  # Some compilers have problems with a `.al' extension so
-	  # convenience libraries should have the same extension an
-	  # archive normally would.
-	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
-	  build_libtool_libs=convenience
-	  build_old_libs=yes
-	fi
-
-	test -n "$vinfo" && \
-	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
-
-	test -n "$release" && \
-	  func_warning "\`-release' is ignored for convenience libraries"
-      else
-
-	# Parse the version information argument.
-	save_ifs="$IFS"; IFS=':'
-	set dummy $vinfo 0 0 0
-	shift
-	IFS="$save_ifs"
-
-	test -n "$7" && \
-	  func_fatal_help "too many parameters to \`-version-info'"
-
-	# convert absolute version numbers to libtool ages
-	# this retains compatibility with .la files and attempts
-	# to make the code below a bit more comprehensible
-
-	case $vinfo_number in
-	yes)
-	  number_major="$1"
-	  number_minor="$2"
-	  number_revision="$3"
-	  #
-	  # There are really only two kinds -- those that
-	  # use the current revision as the major version
-	  # and those that subtract age and use age as
-	  # a minor version.  But, then there is irix
-	  # which has an extra 1 added just for fun
-	  #
-	  case $version_type in
-	  darwin|linux|osf|windows|none)
-	    func_arith $number_major + $number_minor
-	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_revision"
-	    ;;
-	  freebsd-aout|freebsd-elf|sunos)
-	    current="$number_major"
-	    revision="$number_minor"
-	    age="0"
-	    ;;
-	  irix|nonstopux)
-	    func_arith $number_major + $number_minor
-	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_minor"
-	    lt_irix_increment=no
-	    ;;
-	  *)
-	    func_fatal_configuration "$modename: unknown library version type \`$version_type'"
-	    ;;
-	  esac
-	  ;;
-	no)
-	  current="$1"
-	  revision="$2"
-	  age="$3"
-	  ;;
-	esac
-
-	# Check that each of the things are valid numbers.
-	case $current in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "CURRENT \`$current' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	case $revision in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "REVISION \`$revision' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	case $age in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "AGE \`$age' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	if test "$age" -gt "$current"; then
-	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	fi
-
-	# Calculate the version variables.
-	major=
-	versuffix=
-	verstring=
-	case $version_type in
-	none) ;;
-
-	darwin)
-	  # Like Linux, but with the current version available in
-	  # verstring for coding it into the library header
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
-	  # Darwin ld doesn't like 0 for these options...
-	  func_arith $current + 1
-	  minor_current=$func_arith_result
-	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
-	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
-	  ;;
-
-	freebsd-aout)
-	  major=".$current"
-	  versuffix=".$current.$revision";
-	  ;;
-
-	freebsd-elf)
-	  major=".$current"
-	  versuffix=".$current"
-	  ;;
-
-	irix | nonstopux)
-	  if test "X$lt_irix_increment" = "Xno"; then
-	    func_arith $current - $age
-	  else
-	    func_arith $current - $age + 1
-	  fi
-	  major=$func_arith_result
-
-	  case $version_type in
-	    nonstopux) verstring_prefix=nonstopux ;;
-	    *)         verstring_prefix=sgi ;;
-	  esac
-	  verstring="$verstring_prefix$major.$revision"
-
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$revision
-	  while test "$loop" -ne 0; do
-	    func_arith $revision - $loop
-	    iface=$func_arith_result
-	    func_arith $loop - 1
-	    loop=$func_arith_result
-	    verstring="$verstring_prefix$major.$iface:$verstring"
-	  done
-
-	  # Before this point, $major must not contain `.'.
-	  major=.$major
-	  versuffix="$major.$revision"
-	  ;;
-
-	linux)
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
-	  ;;
-
-	osf)
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix=".$current.$age.$revision"
-	  verstring="$current.$age.$revision"
-
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$age
-	  while test "$loop" -ne 0; do
-	    func_arith $current - $loop
-	    iface=$func_arith_result
-	    func_arith $loop - 1
-	    loop=$func_arith_result
-	    verstring="$verstring:${iface}.0"
-	  done
-
-	  # Make executables depend on our current version.
-	  verstring="$verstring:${current}.0"
-	  ;;
-
-	qnx)
-	  major=".$current"
-	  versuffix=".$current"
-	  ;;
-
-	sunos)
-	  major=".$current"
-	  versuffix=".$current.$revision"
-	  ;;
-
-	windows)
-	  # Use '-' rather than '.', since we only want one
-	  # extension on DOS 8.3 filesystems.
-	  func_arith $current - $age
-	  major=$func_arith_result
-	  versuffix="-$major"
-	  ;;
-
-	*)
-	  func_fatal_configuration "unknown library version type \`$version_type'"
-	  ;;
-	esac
-
-	# Clear the version info if we defaulted, and they specified a release.
-	if test -z "$vinfo" && test -n "$release"; then
-	  major=
-	  case $version_type in
-	  darwin)
-	    # we can't check for "0.0" in archive_cmds due to quoting
-	    # problems, so we reset it completely
-	    verstring=
-	    ;;
-	  *)
-	    verstring="0.0"
-	    ;;
-	  esac
-	  if test "$need_version" = no; then
-	    versuffix=
-	  else
-	    versuffix=".0.0"
-	  fi
-	fi
-
-	# Remove version info from name if versioning should be avoided
-	if test "$avoid_version" = yes && test "$need_version" = no; then
-	  major=
-	  versuffix=
-	  verstring=""
-	fi
-
-	# Check to see if the archive will have undefined symbols.
-	if test "$allow_undefined" = yes; then
-	  if test "$allow_undefined_flag" = unsupported; then
-	    func_warning "undefined symbols not allowed in $host shared libraries"
-	    build_libtool_libs=no
-	    build_old_libs=yes
-	  fi
-	else
-	  # Don't allow undefined symbols.
-	  allow_undefined_flag="$no_undefined_flag"
-	fi
-
-      fi
-
-      func_generate_dlsyms "$libname" "$libname" "yes"
-      libobjs="$libobjs $symfileobj"
-      test "X$libobjs" = "X " && libobjs=
-
-      if test "$mode" != relink; then
-	# Remove our outputs, but don't remove object files since they
-	# may have been created when compiling PIC objects.
-	removelist=
-	tempremovelist=`$ECHO "$output_objdir/*"`
-	for p in $tempremovelist; do
-	  case $p in
-	    *.$objext | *.gcno)
-	       ;;
-	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
-	       if test "X$precious_files_regex" != "X"; then
-		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
-		 then
-		   continue
-		 fi
-	       fi
-	       removelist="$removelist $p"
-	       ;;
-	    *) ;;
-	  esac
-	done
-	test -n "$removelist" && \
-	  func_show_eval "${RM}r \$removelist"
-      fi
-
-      # Now set the variables for building old libraries.
-      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
-	oldlibs="$oldlibs $output_objdir/$libname.$libext"
-
-	# Transform .lo files to .o files.
-	oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
-      fi
-
-      # Eliminate all temporary directories.
-      #for path in $notinst_path; do
-      #	lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"`
-      #	deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"`
-      #	dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"`
-      #done
-
-      if test -n "$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	temp_xrpath=
-	for libdir in $xrpath; do
-	  temp_xrpath="$temp_xrpath -R$libdir"
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_rpath="$finalize_rpath $libdir" ;;
-	  esac
-	done
-	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
-	  dependency_libs="$temp_xrpath $dependency_libs"
-	fi
-      fi
-
-      # Make sure dlfiles contains only unique files that won't be dlpreopened
-      old_dlfiles="$dlfiles"
-      dlfiles=
-      for lib in $old_dlfiles; do
-	case " $dlprefiles $dlfiles " in
-	*" $lib "*) ;;
-	*) dlfiles="$dlfiles $lib" ;;
-	esac
-      done
-
-      # Make sure dlprefiles contains only unique files
-      old_dlprefiles="$dlprefiles"
-      dlprefiles=
-      for lib in $old_dlprefiles; do
-	case "$dlprefiles " in
-	*" $lib "*) ;;
-	*) dlprefiles="$dlprefiles $lib" ;;
-	esac
-      done
-
-      if test "$build_libtool_libs" = yes; then
-	if test -n "$rpath"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*)
-	    # these systems don't actually have a c library (as such)!
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C library is in the System framework
-	    deplibs="$deplibs System.ltframework"
-	    ;;
-	  *-*-netbsd*)
-	    # Don't link with libc until the a.out ld.so is fixed.
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    ;;
-	  *)
-	    # Add libc to deplibs on all other systems if necessary.
-	    if test "$build_libtool_need_lc" = "yes"; then
-	      deplibs="$deplibs -lc"
-	    fi
-	    ;;
-	  esac
-	fi
-
-	# Transform deplibs into only deplibs that can be linked in shared.
-	name_save=$name
-	libname_save=$libname
-	release_save=$release
-	versuffix_save=$versuffix
-	major_save=$major
-	# I'm not sure if I'm treating the release correctly.  I think
-	# release should show up in the -l (ie -lgmp5) so we don't want to
-	# add it in twice.  Is that correct?
-	release=""
-	versuffix=""
-	major=""
-	newdeplibs=
-	droppeddeps=no
-	case $deplibs_check_method in
-	pass_all)
-	  # Don't check for shared/static.  Everything works.
-	  # This might be a little naive.  We might want to check
-	  # whether the library exists or not.  But this is on
-	  # osf3 & osf4 and I'm not really sure... Just
-	  # implementing what was already the behavior.
-	  newdeplibs=$deplibs
-	  ;;
-	test_compile)
-	  # This code stresses the "libraries are programs" paradigm to its
-	  # limits. Maybe even breaks it.  We compile a program, linking it
-	  # against the deplibs as a proxy for the library.  Then we can check
-	  # whether they linked in statically or dynamically with ldd.
-	  $opt_dry_run || $RM conftest.c
-	  cat > conftest.c <<EOF
-	  int main() { return 0; }
-EOF
-	  $opt_dry_run || $RM conftest
-	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
-	    ldd_output=`ldd conftest`
-	    for i in $deplibs; do
-	      case $i in
-	      -l*)
-		func_stripname -l '' "$i"
-		name=$func_stripname_result
-		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		  case " $predeps $postdeps " in
-		  *" $i "*)
-		    newdeplibs="$newdeplibs $i"
-		    i=""
-		    ;;
-		  esac
-		fi
-		if test -n "$i" ; then
-		  libname=`eval "\\$ECHO \"$libname_spec\""`
-		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
-		  set dummy $deplib_matches; shift
-		  deplib_match=$1
-		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		    newdeplibs="$newdeplibs $i"
-		  else
-		    droppeddeps=yes
-		    $ECHO
-		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
-		    $ECHO "*** I have the capability to make that library automatically link in when"
-		    $ECHO "*** you link to this library.  But I can only do this if you have a"
-		    $ECHO "*** shared version of the library, which I believe you do not have"
-		    $ECHO "*** because a test_compile did reveal that the linker did not use it for"
-		    $ECHO "*** its dynamic dependency list that programs get resolved with at runtime."
-		  fi
-		fi
-		;;
-	      *)
-		newdeplibs="$newdeplibs $i"
-		;;
-	      esac
-	    done
-	  else
-	    # Error occurred in the first compile.  Let's try to salvage
-	    # the situation: Compile a separate program for each library.
-	    for i in $deplibs; do
-	      case $i in
-	      -l*)
-		func_stripname -l '' "$i"
-		name=$func_stripname_result
-		$opt_dry_run || $RM conftest
-		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
-		  ldd_output=`ldd conftest`
-		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		    case " $predeps $postdeps " in
-		    *" $i "*)
-		      newdeplibs="$newdeplibs $i"
-		      i=""
-		      ;;
-		    esac
-		  fi
-		  if test -n "$i" ; then
-		    libname=`eval "\\$ECHO \"$libname_spec\""`
-		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
-		    set dummy $deplib_matches; shift
-		    deplib_match=$1
-		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		      newdeplibs="$newdeplibs $i"
-		    else
-		      droppeddeps=yes
-		      $ECHO
-		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
-		      $ECHO "*** I have the capability to make that library automatically link in when"
-		      $ECHO "*** you link to this library.  But I can only do this if you have a"
-		      $ECHO "*** shared version of the library, which you do not appear to have"
-		      $ECHO "*** because a test_compile did reveal that the linker did not use this one"
-		      $ECHO "*** as a dynamic dependency that programs can get resolved with at runtime."
-		    fi
-		  fi
-		else
-		  droppeddeps=yes
-		  $ECHO
-		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
-		  $ECHO "*** make it link in!  You will probably need to install it or some"
-		  $ECHO "*** library that it depends on before this library will be fully"
-		  $ECHO "*** functional.  Installing it before continuing would be even better."
-		fi
-		;;
-	      *)
-		newdeplibs="$newdeplibs $i"
-		;;
-	      esac
-	    done
-	  fi
-	  ;;
-	file_magic*)
-	  set dummy $deplibs_check_method; shift
-	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    case $a_deplib in
-	    -l*)
-	      func_stripname -l '' "$a_deplib"
-	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  newdeplibs="$newdeplibs $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		libname=`eval "\\$ECHO \"$libname_spec\""`
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-		  for potent_lib in $potential_libs; do
-		      # Follow soft links.
-		      if ls -lLd "$potent_lib" 2>/dev/null |
-			 $GREP " -> " >/dev/null; then
-			continue
-		      fi
-		      # The statement above tries to avoid entering an
-		      # endless loop below, in case of cyclic links.
-		      # We might still enter an endless loop, since a link
-		      # loop can be closed while we follow links,
-		      # but so what?
-		      potlib="$potent_lib"
-		      while test -h "$potlib" 2>/dev/null; do
-			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
-			case $potliblink in
-			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
-			*) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
-			esac
-		      done
-		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
-			 $SED -e 10q |
-			 $EGREP "$file_magic_regex" > /dev/null; then
-			newdeplibs="$newdeplibs $a_deplib"
-			a_deplib=""
-			break 2
-		      fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		$ECHO
-		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
-		$ECHO "*** I have the capability to make that library automatically link in when"
-		$ECHO "*** you link to this library.  But I can only do this if you have a"
-		$ECHO "*** shared version of the library, which you do not appear to have"
-		$ECHO "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
-		else
-		  $ECHO "*** with $libname and none of the candidates passed a file format test"
-		  $ECHO "*** using a file magic. Last file checked: $potlib"
-		fi
-	      fi
-	      ;;
-	    *)
-	      # Add a -L argument.
-	      newdeplibs="$newdeplibs $a_deplib"
-	      ;;
-	    esac
-	  done # Gone through all deplibs.
-	  ;;
-	match_pattern*)
-	  set dummy $deplibs_check_method; shift
-	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    case $a_deplib in
-	    -l*)
-	      func_stripname -l '' "$a_deplib"
-	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  newdeplibs="$newdeplibs $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		libname=`eval "\\$ECHO \"$libname_spec\""`
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-		  for potent_lib in $potential_libs; do
-		    potlib="$potent_lib" # see symlink-check above in file_magic test
-		    if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \
-		       $EGREP "$match_pattern_regex" > /dev/null; then
-		      newdeplibs="$newdeplibs $a_deplib"
-		      a_deplib=""
-		      break 2
-		    fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		$ECHO
-		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
-		$ECHO "*** I have the capability to make that library automatically link in when"
-		$ECHO "*** you link to this library.  But I can only do this if you have a"
-		$ECHO "*** shared version of the library, which you do not appear to have"
-		$ECHO "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
-		else
-		  $ECHO "*** with $libname and none of the candidates passed a file format test"
-		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
-		fi
-	      fi
-	      ;;
-	    *)
-	      # Add a -L argument.
-	      newdeplibs="$newdeplibs $a_deplib"
-	      ;;
-	    esac
-	  done # Gone through all deplibs.
-	  ;;
-	none | unknown | *)
-	  newdeplibs=""
-	  tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \
-	      -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'`
-	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	    for i in $predeps $postdeps ; do
-	      # can't use Xsed below, because $i might contain '/'
-	      tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"`
-	    done
-	  fi
-	  if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[	 ]//g' |
-	     $GREP . >/dev/null; then
-	    $ECHO
-	    if test "X$deplibs_check_method" = "Xnone"; then
-	      $ECHO "*** Warning: inter-library dependencies are not supported in this platform."
-	    else
-	      $ECHO "*** Warning: inter-library dependencies are not known to be supported."
-	    fi
-	    $ECHO "*** All declared inter-library dependencies are being dropped."
-	    droppeddeps=yes
-	  fi
-	  ;;
-	esac
-	versuffix=$versuffix_save
-	major=$major_save
-	release=$release_save
-	libname=$libname_save
-	name=$name_save
-
-	case $host in
-	*-*-rhapsody* | *-*-darwin1.[012])
-	  # On Rhapsody replace the C library with the System framework
-	  newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
-	  ;;
-	esac
-
-	if test "$droppeddeps" = yes; then
-	  if test "$module" = yes; then
-	    $ECHO
-	    $ECHO "*** Warning: libtool could not satisfy all declared inter-library"
-	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
-	    $ECHO "*** a static module, that should work as long as the dlopening"
-	    $ECHO "*** application is linked with the -dlopen flag."
-	    if test -z "$global_symbol_pipe"; then
-	      $ECHO
-	      $ECHO "*** However, this would only work if libtool was able to extract symbol"
-	      $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
-	      $ECHO "*** not find such a program.  So, this module is probably useless."
-	      $ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
-	    fi
-	    if test "$build_old_libs" = no; then
-	      oldlibs="$output_objdir/$libname.$libext"
-	      build_libtool_libs=module
-	      build_old_libs=yes
-	    else
-	      build_libtool_libs=no
-	    fi
-	  else
-	    $ECHO "*** The inter-library dependencies that have been dropped here will be"
-	    $ECHO "*** automatically added whenever a program is linked with this library"
-	    $ECHO "*** or is declared to -dlopen it."
-
-	    if test "$allow_undefined" = no; then
-	      $ECHO
-	      $ECHO "*** Since this library must not contain undefined symbols,"
-	      $ECHO "*** because either the platform does not support them or"
-	      $ECHO "*** it was explicitly requested with -no-undefined,"
-	      $ECHO "*** libtool will only create a static version of it."
-	      if test "$build_old_libs" = no; then
-		oldlibs="$output_objdir/$libname.$libext"
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
-	  fi
-	fi
-	# Done checking deplibs!
-	deplibs=$newdeplibs
-      fi
-      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
-      case $host in
-	*-*-darwin*)
-	  newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  ;;
-      esac
-
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $deplibs " in
-	  *" -L$path/$objdir "*)
-	    new_libs="$new_libs -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) new_libs="$new_libs $deplib" ;;
-	  esac
-	  ;;
-	*) new_libs="$new_libs $deplib" ;;
-	esac
-      done
-      deplibs="$new_libs"
-
-      # All the library-specific variables (install_libdir is set above).
-      library_names=
-      old_library=
-      dlname=
-
-      # Test again, we may have decided not to build it any more
-      if test "$build_libtool_libs" = yes; then
-	if test "$hardcode_into_libs" = yes; then
-	  # Hardcode the library paths
-	  hardcode_libdirs=
-	  dep_rpath=
-	  rpath="$finalize_rpath"
-	  test "$mode" != relink && rpath="$compile_rpath$rpath"
-	  for libdir in $rpath; do
-	    if test -n "$hardcode_libdir_flag_spec"; then
-	      if test -n "$hardcode_libdir_separator"; then
-		if test -z "$hardcode_libdirs"; then
-		  hardcode_libdirs="$libdir"
-		else
-		  # Just accumulate the unique libdirs.
-		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		    ;;
-		  *)
-		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		    ;;
-		  esac
-		fi
-	      else
-		eval flag=\"$hardcode_libdir_flag_spec\"
-		dep_rpath="$dep_rpath $flag"
-	      fi
-	    elif test -n "$runpath_var"; then
-	      case "$perm_rpath " in
-	      *" $libdir "*) ;;
-	      *) perm_rpath="$perm_rpath $libdir" ;;
-	      esac
-	    fi
-	  done
-	  # Substitute the hardcoded libdirs into the rpath.
-	  if test -n "$hardcode_libdir_separator" &&
-	     test -n "$hardcode_libdirs"; then
-	    libdir="$hardcode_libdirs"
-	    if test -n "$hardcode_libdir_flag_spec_ld"; then
-	      eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
-	    else
-	      eval dep_rpath=\"$hardcode_libdir_flag_spec\"
-	    fi
-	  fi
-	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
-	    # We should set the runpath_var.
-	    rpath=
-	    for dir in $perm_rpath; do
-	      rpath="$rpath$dir:"
-	    done
-	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
-	  fi
-	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
-	fi
-
-	shlibpath="$finalize_shlibpath"
-	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
-	if test -n "$shlibpath"; then
-	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
-	fi
-
-	# Get the real and link names of the library.
-	eval shared_ext=\"$shrext_cmds\"
-	eval library_names=\"$library_names_spec\"
-	set dummy $library_names
-	shift
-	realname="$1"
-	shift
-
-	if test -n "$soname_spec"; then
-	  eval soname=\"$soname_spec\"
-	else
-	  soname="$realname"
-	fi
-	if test -z "$dlname"; then
-	  dlname=$soname
-	fi
-
-	lib="$output_objdir/$realname"
-	linknames=
-	for link
-	do
-	  linknames="$linknames $link"
-	done
-
-	# Use standard objects if they are pic
-	test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-	test "X$libobjs" = "X " && libobjs=
-
-	delfiles=
-	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
-	  export_symbols="$output_objdir/$libname.uexp"
-	  delfiles="$delfiles $export_symbols"
-	fi
-
-	orig_export_symbols=
-	case $host_os in
-	cygwin* | mingw* | cegcc*)
-	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
-	    # exporting using user supplied symfile
-	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
-	      # and it's NOT already a .def file. Must figure out
-	      # which of the given symbols are data symbols and tag
-	      # them as such. So, trigger use of export_symbols_cmds.
-	      # export_symbols gets reassigned inside the "prepare
-	      # the list of exported symbols" if statement, so the
-	      # include_expsyms logic still works.
-	      orig_export_symbols="$export_symbols"
-	      export_symbols=
-	      always_export_symbols=yes
-	    fi
-	  fi
-	  ;;
-	esac
-
-	# Prepare the list of exported symbols
-	if test -z "$export_symbols"; then
-	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
-	    func_verbose "generating symbol list for \`$libname.la'"
-	    export_symbols="$output_objdir/$libname.exp"
-	    $opt_dry_run || $RM $export_symbols
-	    cmds=$export_symbols_cmds
-	    save_ifs="$IFS"; IFS='~'
-	    for cmd in $cmds; do
-	      IFS="$save_ifs"
-	      eval cmd=\"$cmd\"
-	      func_len " $cmd"
-	      len=$func_len_result
-	      if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-		func_show_eval "$cmd" 'exit $?'
-		skipped_export=false
-	      else
-		# The command line is too long to execute in one step.
-		func_verbose "using reloadable object file for export list..."
-		skipped_export=:
-		# Break out early, otherwise skipped_export may be
-		# set to false by a later but shorter cmd.
-		break
-	      fi
-	    done
-	    IFS="$save_ifs"
-	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
-	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
-	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
-	    fi
-	  fi
-	fi
-
-	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  tmp_export_symbols="$export_symbols"
-	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
-	  $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
-	fi
-
-	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
-	  # The given exports_symbols file has to be filtered, so filter it.
-	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
-	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	  # 's' commands which not all seds can handle. GNU sed should be fine
-	  # though. Also, the filter scales superlinearly with the number of
-	  # global variables. join(1) would be nice here, but unfortunately
-	  # isn't a blessed tool.
-	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
-	  delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
-	  export_symbols=$output_objdir/$libname.def
-	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
-	fi
-
-	tmp_deplibs=
-	for test_deplib in $deplibs; do
-	  case " $convenience " in
-	  *" $test_deplib "*) ;;
-	  *)
-	    tmp_deplibs="$tmp_deplibs $test_deplib"
-	    ;;
-	  esac
-	done
-	deplibs="$tmp_deplibs"
-
-	if test -n "$convenience"; then
-	  if test -n "$whole_archive_flag_spec" &&
-	    test "$compiler_needs_object" = yes &&
-	    test -z "$libobjs"; then
-	    # extract the archives, so we have objects to list.
-	    # TODO: could optimize this to just extract one archive.
-	    whole_archive_flag_spec=
-	  fi
-	  if test -n "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
-	    test "X$libobjs" = "X " && libobjs=
-	  else
-	    gentop="$output_objdir/${outputname}x"
-	    generated="$generated $gentop"
-
-	    func_extract_archives $gentop $convenience
-	    libobjs="$libobjs $func_extract_archives_result"
-	    test "X$libobjs" = "X " && libobjs=
-	  fi
-	fi
-
-	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
-	  eval flag=\"$thread_safe_flag_spec\"
-	  linker_flags="$linker_flags $flag"
-	fi
-
-	# Make a backup of the uninstalled library when relinking
-	if test "$mode" = relink; then
-	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
-	fi
-
-	# Do each of the archive commands.
-	if test "$module" = yes && test -n "$module_cmds" ; then
-	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	    eval test_cmds=\"$module_expsym_cmds\"
-	    cmds=$module_expsym_cmds
-	  else
-	    eval test_cmds=\"$module_cmds\"
-	    cmds=$module_cmds
-	  fi
-	else
-	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	    eval test_cmds=\"$archive_expsym_cmds\"
-	    cmds=$archive_expsym_cmds
-	  else
-	    eval test_cmds=\"$archive_cmds\"
-	    cmds=$archive_cmds
-	  fi
-	fi
-
-	if test "X$skipped_export" != "X:" &&
-	   func_len " $test_cmds" &&
-	   len=$func_len_result &&
-	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  :
-	else
-	  # The command line is too long to link in one step, link piecewise
-	  # or, if using GNU ld and skipped_export is not :, use a linker
-	  # script.
-
-	  # Save the value of $output and $libobjs because we want to
-	  # use them later.  If we have whole_archive_flag_spec, we
-	  # want to use save_libobjs as it was before
-	  # whole_archive_flag_spec was expanded, because we can't
-	  # assume the linker understands whole_archive_flag_spec.
-	  # This may have to be revisited, in case too many
-	  # convenience libraries get linked in and end up exceeding
-	  # the spec.
-	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	  fi
-	  save_output=$output
-	  output_la=`$ECHO "X$output" | $Xsed -e "$basename"`
-
-	  # Clear the reloadable object creation command queue and
-	  # initialize k to one.
-	  test_cmds=
-	  concat_cmds=
-	  objlist=
-	  last_robj=
-	  k=1
-
-	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
-	    output=${output_objdir}/${output_la}.lnkscript
-	    func_verbose "creating GNU ld script: $output"
-	    $ECHO 'INPUT (' > $output
-	    for obj in $save_libobjs
-	    do
-	      $ECHO "$obj" >> $output
-	    done
-	    $ECHO ')' >> $output
-	    delfiles="$delfiles $output"
-	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
-	    output=${output_objdir}/${output_la}.lnk
-	    func_verbose "creating linker input file list: $output"
-	    : > $output
-	    set x $save_libobjs
-	    shift
-	    firstobj=
-	    if test "$compiler_needs_object" = yes; then
-	      firstobj="$1 "
-	      shift
-	    fi
-	    for obj
-	    do
-	      $ECHO "$obj" >> $output
-	    done
-	    delfiles="$delfiles $output"
-	    output=$firstobj\"$file_list_spec$output\"
-	  else
-	    if test -n "$save_libobjs"; then
-	      func_verbose "creating reloadable object files..."
-	      output=$output_objdir/$output_la-${k}.$objext
-	      eval test_cmds=\"$reload_cmds\"
-	      func_len " $test_cmds"
-	      len0=$func_len_result
-	      len=$len0
-
-	      # Loop over the list of objects to be linked.
-	      for obj in $save_libobjs
-	      do
-		func_len " $obj"
-		func_arith $len + $func_len_result
-		len=$func_arith_result
-		if test "X$objlist" = X ||
-		   test "$len" -lt "$max_cmd_len"; then
-		  func_append objlist " $obj"
-		else
-		  # The command $test_cmds is almost too long, add a
-		  # command to the queue.
-		  if test "$k" -eq 1 ; then
-		    # The first file doesn't have a previous command to add.
-		    eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
-		  else
-		    # All subsequent reloadable object files will link in
-		    # the last one created.
-		    eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\"
-		  fi
-		  last_robj=$output_objdir/$output_la-${k}.$objext
-		  func_arith $k + 1
-		  k=$func_arith_result
-		  output=$output_objdir/$output_la-${k}.$objext
-		  objlist=$obj
-		  func_len " $last_robj"
-		  func_arith $len0 + $func_len_result
-		  len=$func_arith_result
-		fi
-	      done
-	      # Handle the remaining objects by creating one last
-	      # reloadable object file.  All subsequent reloadable object
-	      # files will link in the last one created.
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
-	      if test -n "$last_robj"; then
-	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
-	      fi
-	      delfiles="$delfiles $output"
-
-	    else
-	      output=
-	    fi
-
-	    if ${skipped_export-false}; then
-	      func_verbose "generating symbol list for \`$libname.la'"
-	      export_symbols="$output_objdir/$libname.exp"
-	      $opt_dry_run || $RM $export_symbols
-	      libobjs=$output
-	      # Append the command to create the export file.
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
-	      if test -n "$last_robj"; then
-		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
-	      fi
-	    fi
-
-	    test -n "$save_libobjs" &&
-	      func_verbose "creating a temporary reloadable object file: $output"
-
-	    # Loop through the commands generated above and execute them.
-	    save_ifs="$IFS"; IFS='~'
-	    for cmd in $concat_cmds; do
-	      IFS="$save_ifs"
-	      $opt_silent || {
-		  func_quote_for_expand "$cmd"
-		  eval "func_echo $func_quote_for_expand_result"
-	      }
-	      $opt_dry_run || eval "$cmd" || {
-		lt_exit=$?
-
-		# Restore the uninstalled library and exit
-		if test "$mode" = relink; then
-		  ( cd "$output_objdir" && \
-		    $RM "${realname}T" && \
-		    $MV "${realname}U" "$realname" )
-		fi
-
-		exit $lt_exit
-	      }
-	    done
-	    IFS="$save_ifs"
-
-	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
-	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
-	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
-	    fi
-	  fi
-
-          if ${skipped_export-false}; then
-	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	      tmp_export_symbols="$export_symbols"
-	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
-	      $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
-	    fi
-
-	    if test -n "$orig_export_symbols"; then
-	      # The given exports_symbols file has to be filtered, so filter it.
-	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
-	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	      # 's' commands which not all seds can handle. GNU sed should be fine
-	      # though. Also, the filter scales superlinearly with the number of
-	      # global variables. join(1) would be nice here, but unfortunately
-	      # isn't a blessed tool.
-	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
-	      delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
-	      export_symbols=$output_objdir/$libname.def
-	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
-	    fi
-	  fi
-
-	  libobjs=$output
-	  # Restore the value of output.
-	  output=$save_output
-
-	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
-	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
-	    test "X$libobjs" = "X " && libobjs=
-	  fi
-	  # Expand the library linking commands again to reset the
-	  # value of $libobjs for piecewise linking.
-
-	  # Do each of the archive commands.
-	  if test "$module" = yes && test -n "$module_cmds" ; then
-	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	      cmds=$module_expsym_cmds
-	    else
-	      cmds=$module_cmds
-	    fi
-	  else
-	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	      cmds=$archive_expsym_cmds
-	    else
-	      cmds=$archive_cmds
-	    fi
-	  fi
-	fi
-
-	if test -n "$delfiles"; then
-	  # Append the command to remove temporary files to $cmds.
-	  eval cmds=\"\$cmds~\$RM $delfiles\"
-	fi
-
-	# Add any objects from preloaded convenience libraries
-	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
-	  generated="$generated $gentop"
-
-	  func_extract_archives $gentop $dlprefiles
-	  libobjs="$libobjs $func_extract_archives_result"
-	  test "X$libobjs" = "X " && libobjs=
-	fi
-
-	save_ifs="$IFS"; IFS='~'
-	for cmd in $cmds; do
-	  IFS="$save_ifs"
-	  eval cmd=\"$cmd\"
-	  $opt_silent || {
-	    func_quote_for_expand "$cmd"
-	    eval "func_echo $func_quote_for_expand_result"
-	  }
-	  $opt_dry_run || eval "$cmd" || {
-	    lt_exit=$?
-
-	    # Restore the uninstalled library and exit
-	    if test "$mode" = relink; then
-	      ( cd "$output_objdir" && \
-	        $RM "${realname}T" && \
-		$MV "${realname}U" "$realname" )
-	    fi
-
-	    exit $lt_exit
-	  }
-	done
-	IFS="$save_ifs"
-
-	# Restore the uninstalled library and exit
-	if test "$mode" = relink; then
-	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
-
-	  if test -n "$convenience"; then
-	    if test -z "$whole_archive_flag_spec"; then
-	      func_show_eval '${RM}r "$gentop"'
-	    fi
-	  fi
-
-	  exit $EXIT_SUCCESS
-	fi
-
-	# Create links to the real library.
-	for linkname in $linknames; do
-	  if test "$realname" != "$linkname"; then
-	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
-	  fi
-	done
-
-	# If -module or -export-dynamic was specified, set the dlname.
-	if test "$module" = yes || test "$export_dynamic" = yes; then
-	  # On all known operating systems, these are identical.
-	  dlname="$soname"
-	fi
-      fi
-      ;;
-
-    obj)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for objects"
-      fi
-
-      case " $deplibs" in
-      *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for objects" ;;
-      esac
-
-      test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for objects"
-
-      test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for objects"
-
-      test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for objects"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for objects"
-
-      case $output in
-      *.lo)
-	test -n "$objs$old_deplibs" && \
-	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
-
-	libobj=$output
-	func_lo2o "$libobj"
-	obj=$func_lo2o_result
-	;;
-      *)
-	libobj=
-	obj="$output"
-	;;
-      esac
-
-      # Delete the old objects.
-      $opt_dry_run || $RM $obj $libobj
-
-      # Objects from convenience libraries.  This assumes
-      # single-version convenience libraries.  Whenever we create
-      # different ones for PIC/non-PIC, this we'll have to duplicate
-      # the extraction.
-      reload_conv_objs=
-      gentop=
-      # reload_cmds runs $LD directly, so let us get rid of
-      # -Wl from whole_archive_flag_spec and hope we can get by with
-      # turning comma into space..
-      wl=
-
-      if test -n "$convenience"; then
-	if test -n "$whole_archive_flag_spec"; then
-	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
-	  reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'`
-	else
-	  gentop="$output_objdir/${obj}x"
-	  generated="$generated $gentop"
-
-	  func_extract_archives $gentop $convenience
-	  reload_conv_objs="$reload_objs $func_extract_archives_result"
-	fi
-      fi
-
-      # Create the old-style object.
-      reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
-
-      output="$obj"
-      func_execute_cmds "$reload_cmds" 'exit $?'
-
-      # Exit if we aren't doing a library object file.
-      if test -z "$libobj"; then
-	if test -n "$gentop"; then
-	  func_show_eval '${RM}r "$gentop"'
-	fi
-
-	exit $EXIT_SUCCESS
-      fi
-
-      if test "$build_libtool_libs" != yes; then
-	if test -n "$gentop"; then
-	  func_show_eval '${RM}r "$gentop"'
-	fi
-
-	# Create an invalid libtool object if no PIC, so that we don't
-	# accidentally link it into a program.
-	# $show "echo timestamp > $libobj"
-	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
-	exit $EXIT_SUCCESS
-      fi
-
-      if test -n "$pic_flag" || test "$pic_mode" != default; then
-	# Only do commands if we really have different PIC objects.
-	reload_objs="$libobjs $reload_conv_objs"
-	output="$libobj"
-	func_execute_cmds "$reload_cmds" 'exit $?'
-      fi
-
-      if test -n "$gentop"; then
-	func_show_eval '${RM}r "$gentop"'
-      fi
-
-      exit $EXIT_SUCCESS
-      ;;
-
-    prog)
-      case $host in
-	*cygwin*) func_stripname '' '.exe' "$output"
-	          output=$func_stripname_result.exe;;
-      esac
-      test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for programs"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for programs"
-
-      test "$preload" = yes \
-        && test "$dlopen_support" = unknown \
-	&& test "$dlopen_self" = unknown \
-	&& test "$dlopen_self_static" = unknown && \
-	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
-
-      case $host in
-      *-*-rhapsody* | *-*-darwin1.[012])
-	# On Rhapsody replace the C library is the System framework
-	compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
-	finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
-	;;
-      esac
-
-      case $host in
-      *-*-darwin*)
-	# Don't allow lazy linking, it breaks C++ global constructors
-	# But is supposedly fixed on 10.4 or later (yay!).
-	if test "$tagname" = CXX ; then
-	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
-	    10.[0123])
-	      compile_command="$compile_command ${wl}-bind_at_load"
-	      finalize_command="$finalize_command ${wl}-bind_at_load"
-	    ;;
-	  esac
-	fi
-	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
-	compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-	finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-	;;
-      esac
-
-
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $compile_deplibs " in
-	  *" -L$path/$objdir "*)
-	    new_libs="$new_libs -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $compile_deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) new_libs="$new_libs $deplib" ;;
-	  esac
-	  ;;
-	*) new_libs="$new_libs $deplib" ;;
-	esac
-      done
-      compile_deplibs="$new_libs"
-
-
-      compile_command="$compile_command $compile_deplibs"
-      finalize_command="$finalize_command $finalize_deplibs"
-
-      if test -n "$rpath$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	for libdir in $rpath $xrpath; do
-	  # This is the magic to use -rpath.
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_rpath="$finalize_rpath $libdir" ;;
-	  esac
-	done
-      fi
-
-      # Now hardcode the library paths
-      rpath=
-      hardcode_libdirs=
-      for libdir in $compile_rpath $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval flag=\"$hardcode_libdir_flag_spec\"
-	    rpath="$rpath $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) perm_rpath="$perm_rpath $libdir" ;;
-	  esac
-	fi
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$libdir:"*) ;;
-	  ::) dllsearchpath=$libdir;;
-	  *) dllsearchpath="$dllsearchpath:$libdir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  ::) dllsearchpath=$testbindir;;
-	  *) dllsearchpath="$dllsearchpath:$testbindir";;
-	  esac
-	  ;;
-	esac
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval rpath=\" $hardcode_libdir_flag_spec\"
-      fi
-      compile_rpath="$rpath"
-
-      rpath=
-      hardcode_libdirs=
-      for libdir in $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval flag=\"$hardcode_libdir_flag_spec\"
-	    rpath="$rpath $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$finalize_perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
-	  esac
-	fi
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval rpath=\" $hardcode_libdir_flag_spec\"
-      fi
-      finalize_rpath="$rpath"
-
-      if test -n "$libobjs" && test "$build_old_libs" = yes; then
-	# Transform all the library objects into standard objects.
-	compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-	finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-      fi
-
-      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
-
-      # template prelinking step
-      if test -n "$prelink_cmds"; then
-	func_execute_cmds "$prelink_cmds" 'exit $?'
-      fi
-
-      wrappers_required=yes
-      case $host in
-      *cygwin* | *mingw* )
-        if test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
-        ;;
-      *cegcc)
-        # Disable wrappers for cegcc, we are cross compiling anyway.
-        wrappers_required=no
-        ;;
-      *)
-        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
-        ;;
-      esac
-      if test "$wrappers_required" = no; then
-	# Replace the output file specification.
-	compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
-	link_command="$compile_command$compile_rpath"
-
-	# We have no uninstalled library dependencies, so finalize right now.
-	exit_status=0
-	func_show_eval "$link_command" 'exit_status=$?'
-
-	# Delete the generated files.
-	if test -f "$output_objdir/${outputname}S.${objext}"; then
-	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
-	fi
-
-	exit $exit_status
-      fi
-
-      if test -n "$compile_shlibpath$finalize_shlibpath"; then
-	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
-      fi
-      if test -n "$finalize_shlibpath"; then
-	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
-      fi
-
-      compile_var=
-      finalize_var=
-      if test -n "$runpath_var"; then
-	if test -n "$perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $perm_rpath; do
-	    rpath="$rpath$dir:"
-	  done
-	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-	if test -n "$finalize_perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $finalize_perm_rpath; do
-	    rpath="$rpath$dir:"
-	  done
-	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-      fi
-
-      if test "$no_install" = yes; then
-	# We don't need to create a wrapper script.
-	link_command="$compile_var$compile_command$compile_rpath"
-	# Replace the output file specification.
-	link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
-	# Delete the old output file.
-	$opt_dry_run || $RM $output
-	# Link the executable and exit
-	func_show_eval "$link_command" 'exit $?'
-	exit $EXIT_SUCCESS
-      fi
-
-      if test "$hardcode_action" = relink; then
-	# Fast installation is not supported
-	link_command="$compile_var$compile_command$compile_rpath"
-	relink_command="$finalize_var$finalize_command$finalize_rpath"
-
-	func_warning "this platform does not like uninstalled shared libraries"
-	func_warning "\`$output' will be relinked during installation"
-      else
-	if test "$fast_install" != no; then
-	  link_command="$finalize_var$compile_command$finalize_rpath"
-	  if test "$fast_install" = yes; then
-	    relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
-	  else
-	    # fast_install is set to needless
-	    relink_command=
-	  fi
-	else
-	  link_command="$compile_var$compile_command$compile_rpath"
-	  relink_command="$finalize_var$finalize_command$finalize_rpath"
-	fi
-      fi
-
-      # Replace the output file specification.
-      link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
-
-      # Delete the old output files.
-      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
-
-      func_show_eval "$link_command" 'exit $?'
-
-      # Now create the wrapper script.
-      func_verbose "creating $output"
-
-      # Quote the relink command for shipping.
-      if test -n "$relink_command"; then
-	# Preserve any variables that may affect compiler behavior
-	for var in $variables_saved_for_relink; do
-	  if eval test -z \"\${$var+set}\"; then
-	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
-	  elif eval var_value=\$$var; test -z "$var_value"; then
-	    relink_command="$var=; export $var; $relink_command"
-	  else
-	    func_quote_for_eval "$var_value"
-	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
-	  fi
-	done
-	relink_command="(cd `pwd`; $relink_command)"
-	relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
-      fi
-
-      # Quote $ECHO for shipping.
-      if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then
-	case $progpath in
-	[\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
-	*) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
-	esac
-	qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"`
-      else
-	qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"`
-      fi
-
-      # Only actually do things if not in dry run mode.
-      $opt_dry_run || {
-	# win32 will think the script is a binary if it has
-	# a .exe suffix, so we strip it off here.
-	case $output in
-	  *.exe) func_stripname '' '.exe' "$output"
-	         output=$func_stripname_result ;;
-	esac
-	# test for cygwin because mv fails w/o .exe extensions
-	case $host in
-	  *cygwin*)
-	    exeext=.exe
-	    func_stripname '' '.exe' "$outputname"
-	    outputname=$func_stripname_result ;;
-	  *) exeext= ;;
-	esac
-	case $host in
-	  *cygwin* | *mingw* )
-	    func_dirname_and_basename "$output" "" "."
-	    output_name=$func_basename_result
-	    output_path=$func_dirname_result
-	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
-	    cwrapper="$output_path/$output_name.exe"
-	    $RM $cwrappersource $cwrapper
-	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
-
-	    func_emit_cwrapperexe_src > $cwrappersource
-
-	    # The wrapper executable is built using the $host compiler,
-	    # because it contains $host paths and files. If cross-
-	    # compiling, it, like the target executable, must be
-	    # executed on the $host or under an emulation environment.
-	    $opt_dry_run || {
-	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
-	      $STRIP $cwrapper
-	    }
-
-	    # Now, create the wrapper script for func_source use:
-	    func_ltwrapper_scriptname $cwrapper
-	    $RM $func_ltwrapper_scriptname_result
-	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
-	    $opt_dry_run || {
-	      # note: this script will not be executed, so do not chmod.
-	      if test "x$build" = "x$host" ; then
-		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
-	      else
-		func_emit_wrapper no > $func_ltwrapper_scriptname_result
-	      fi
-	    }
-	  ;;
-	  * )
-	    $RM $output
-	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
-
-	    func_emit_wrapper no > $output
-	    chmod +x $output
-	  ;;
-	esac
-      }
-      exit $EXIT_SUCCESS
-      ;;
-    esac
-
-    # See if we need to build an old-fashioned archive.
-    for oldlib in $oldlibs; do
-
-      if test "$build_libtool_libs" = convenience; then
-	oldobjs="$libobjs_save $symfileobj"
-	addlibs="$convenience"
-	build_libtool_libs=no
-      else
-	if test "$build_libtool_libs" = module; then
-	  oldobjs="$libobjs_save"
-	  build_libtool_libs=no
-	else
-	  oldobjs="$old_deplibs $non_pic_objects"
-	  if test "$preload" = yes && test -f "$symfileobj"; then
-	    oldobjs="$oldobjs $symfileobj"
-	  fi
-	fi
-	addlibs="$old_convenience"
-      fi
-
-      if test -n "$addlibs"; then
-	gentop="$output_objdir/${outputname}x"
-	generated="$generated $gentop"
-
-	func_extract_archives $gentop $addlibs
-	oldobjs="$oldobjs $func_extract_archives_result"
-      fi
-
-      # Do each command in the archive commands.
-      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
-	cmds=$old_archive_from_new_cmds
-      else
-
-	# Add any objects from preloaded convenience libraries
-	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
-	  generated="$generated $gentop"
-
-	  func_extract_archives $gentop $dlprefiles
-	  oldobjs="$oldobjs $func_extract_archives_result"
-	fi
-
-	# POSIX demands no paths to be encoded in archives.  We have
-	# to avoid creating archives with duplicate basenames if we
-	# might have to extract them afterwards, e.g., when creating a
-	# static archive out of a convenience library, or when linking
-	# the entirety of a libtool archive into another (currently
-	# not supported by libtool).
-	if (for obj in $oldobjs
-	    do
-	      func_basename "$obj"
-	      $ECHO "$func_basename_result"
-	    done | sort | sort -uc >/dev/null 2>&1); then
-	  :
-	else
-	  $ECHO "copying selected object files to avoid basename conflicts..."
-	  gentop="$output_objdir/${outputname}x"
-	  generated="$generated $gentop"
-	  func_mkdir_p "$gentop"
-	  save_oldobjs=$oldobjs
-	  oldobjs=
-	  counter=1
-	  for obj in $save_oldobjs
-	  do
-	    func_basename "$obj"
-	    objbase="$func_basename_result"
-	    case " $oldobjs " in
-	    " ") oldobjs=$obj ;;
-	    *[\ /]"$objbase "*)
-	      while :; do
-		# Make sure we don't pick an alternate name that also
-		# overlaps.
-		newobj=lt$counter-$objbase
-		func_arith $counter + 1
-		counter=$func_arith_result
-		case " $oldobjs " in
-		*[\ /]"$newobj "*) ;;
-		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
-		esac
-	      done
-	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
-	      oldobjs="$oldobjs $gentop/$newobj"
-	      ;;
-	    *) oldobjs="$oldobjs $obj" ;;
-	    esac
-	  done
-	fi
-	eval cmds=\"$old_archive_cmds\"
-
-	func_len " $cmds"
-	len=$func_len_result
-	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  cmds=$old_archive_cmds
-	else
-	  # the command line is too long to link in one step, link in parts
-	  func_verbose "using piecewise archive linking..."
-	  save_RANLIB=$RANLIB
-	  RANLIB=:
-	  objlist=
-	  concat_cmds=
-	  save_oldobjs=$oldobjs
-	  oldobjs=
-	  # Is there a better way of finding the last object in the list?
-	  for obj in $save_oldobjs
-	  do
-	    last_oldobj=$obj
-	  done
-	  eval test_cmds=\"$old_archive_cmds\"
-	  func_len " $test_cmds"
-	  len0=$func_len_result
-	  len=$len0
-	  for obj in $save_oldobjs
-	  do
-	    func_len " $obj"
-	    func_arith $len + $func_len_result
-	    len=$func_arith_result
-	    func_append objlist " $obj"
-	    if test "$len" -lt "$max_cmd_len"; then
-	      :
-	    else
-	      # the above command should be used before it gets too long
-	      oldobjs=$objlist
-	      if test "$obj" = "$last_oldobj" ; then
-		RANLIB=$save_RANLIB
-	      fi
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
-	      objlist=
-	      len=$len0
-	    fi
-	  done
-	  RANLIB=$save_RANLIB
-	  oldobjs=$objlist
-	  if test "X$oldobjs" = "X" ; then
-	    eval cmds=\"\$concat_cmds\"
-	  else
-	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
-	  fi
-	fi
-      fi
-      func_execute_cmds "$cmds" 'exit $?'
-    done
-
-    test -n "$generated" && \
-      func_show_eval "${RM}r$generated"
-
-    # Now create the libtool archive.
-    case $output in
-    *.la)
-      old_library=
-      test "$build_old_libs" = yes && old_library="$libname.$libext"
-      func_verbose "creating $output"
-
-      # Preserve any variables that may affect compiler behavior
-      for var in $variables_saved_for_relink; do
-	if eval test -z \"\${$var+set}\"; then
-	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
-	elif eval var_value=\$$var; test -z "$var_value"; then
-	  relink_command="$var=; export $var; $relink_command"
-	else
-	  func_quote_for_eval "$var_value"
-	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
-	fi
-      done
-      # Quote the link command for shipping.
-      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
-      relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
-      if test "$hardcode_automatic" = yes ; then
-	relink_command=
-      fi
-
-      # Only create the output if not a dry run.
-      $opt_dry_run || {
-	for installed in no yes; do
-	  if test "$installed" = yes; then
-	    if test -z "$install_libdir"; then
-	      break
-	    fi
-	    output="$output_objdir/$outputname"i
-	    # Replace all uninstalled libtool libraries with the installed ones
-	    newdependency_libs=
-	    for deplib in $dependency_libs; do
-	      case $deplib in
-	      *.la)
-		func_basename "$deplib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$deplib' is not a valid libtool archive"
-		newdependency_libs="$newdependency_libs $libdir/$name"
-		;;
-	      *) newdependency_libs="$newdependency_libs $deplib" ;;
-	      esac
-	    done
-	    dependency_libs="$newdependency_libs"
-	    newdlfiles=
-
-	    for lib in $dlfiles; do
-	      case $lib in
-	      *.la)
-	        func_basename "$lib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
-		newdlfiles="$newdlfiles $libdir/$name"
-		;;
-	      *) newdlfiles="$newdlfiles $lib" ;;
-	      esac
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      case $lib in
-	      *.la)
-		# Only pass preopened files to the pseudo-archive (for
-		# eventual linking with the app. that links it) if we
-		# didn't already link the preopened objects directly into
-		# the library:
-		func_basename "$lib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
-		newdlprefiles="$newdlprefiles $libdir/$name"
-		;;
-	      esac
-	    done
-	    dlprefiles="$newdlprefiles"
-	  else
-	    newdlfiles=
-	    for lib in $dlfiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      newdlfiles="$newdlfiles $abs"
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      newdlprefiles="$newdlprefiles $abs"
-	    done
-	    dlprefiles="$newdlprefiles"
-	  fi
-	  $RM $output
-	  # place dlname in correct position for cygwin
-	  tdlname=$dlname
-	  case $host,$output,$installed,$module,$dlname in
-	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
-	  esac
-	  $ECHO > $output "\
-# $outputname - a libtool library file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# The name that we can dlopen(3).
-dlname='$tdlname'
-
-# Names of this library.
-library_names='$library_names'
-
-# The name of the static archive.
-old_library='$old_library'
-
-# Linker flags that can not go in dependency_libs.
-inherited_linker_flags='$new_inherited_linker_flags'
-
-# Libraries that this one depends upon.
-dependency_libs='$dependency_libs'
-
-# Names of additional weak libraries provided by this library
-weak_library_names='$weak_libs'
-
-# Version information for $libname.
-current=$current
-age=$age
-revision=$revision
-
-# Is this an already installed library?
-installed=$installed
-
-# Should we warn about portability when linking against -modules?
-shouldnotlink=$module
-
-# Files to dlopen/dlpreopen
-dlopen='$dlfiles'
-dlpreopen='$dlprefiles'
-
-# Directory that this library needs to be installed in:
-libdir='$install_libdir'"
-	  if test "$installed" = no && test "$need_relink" = yes; then
-	    $ECHO >> $output "\
-relink_command=\"$relink_command\""
-	  fi
-	done
-      }
-
-      # Do a symbolic link so that the libtool archive can be found in
-      # LD_LIBRARY_PATH before the program is installed.
-      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
-      ;;
-    esac
-    exit $EXIT_SUCCESS
-}
-
-{ test "$mode" = link || test "$mode" = relink; } &&
-    func_mode_link ${1+"$@"}
-
-
-# func_mode_uninstall arg...
-func_mode_uninstall ()
-{
-    $opt_debug
-    RM="$nonopt"
-    files=
-    rmforce=
-    exit_status=0
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    for arg
-    do
-      case $arg in
-      -f) RM="$RM $arg"; rmforce=yes ;;
-      -*) RM="$RM $arg" ;;
-      *) files="$files $arg" ;;
-      esac
-    done
-
-    test -z "$RM" && \
-      func_fatal_help "you must specify an RM program"
-
-    rmdirs=
-
-    origobjdir="$objdir"
-    for file in $files; do
-      func_dirname "$file" "" "."
-      dir="$func_dirname_result"
-      if test "X$dir" = X.; then
-	objdir="$origobjdir"
-      else
-	objdir="$dir/$origobjdir"
-      fi
-      func_basename "$file"
-      name="$func_basename_result"
-      test "$mode" = uninstall && objdir="$dir"
-
-      # Remember objdir for removal later, being careful to avoid duplicates
-      if test "$mode" = clean; then
-	case " $rmdirs " in
-	  *" $objdir "*) ;;
-	  *) rmdirs="$rmdirs $objdir" ;;
-	esac
-      fi
-
-      # Don't error if the file doesn't exist and rm -f was used.
-      if { test -L "$file"; } >/dev/null 2>&1 ||
-	 { test -h "$file"; } >/dev/null 2>&1 ||
-	 test -f "$file"; then
-	:
-      elif test -d "$file"; then
-	exit_status=1
-	continue
-      elif test "$rmforce" = yes; then
-	continue
-      fi
-
-      rmfiles="$file"
-
-      case $name in
-      *.la)
-	# Possibly a libtool archive, so verify it.
-	if func_lalib_p "$file"; then
-	  func_source $dir/$name
-
-	  # Delete the libtool libraries and symlinks.
-	  for n in $library_names; do
-	    rmfiles="$rmfiles $objdir/$n"
-	  done
-	  test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
-
-	  case "$mode" in
-	  clean)
-	    case "  $library_names " in
-	    # "  " in the beginning catches empty $dlname
-	    *" $dlname "*) ;;
-	    *) rmfiles="$rmfiles $objdir/$dlname" ;;
-	    esac
-	    test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
-	    ;;
-	  uninstall)
-	    if test -n "$library_names"; then
-	      # Do each command in the postuninstall commands.
-	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
-	    fi
-
-	    if test -n "$old_library"; then
-	      # Do each command in the old_postuninstall commands.
-	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
-	    fi
-	    # FIXME: should reinstall the best remaining shared library.
-	    ;;
-	  esac
-	fi
-	;;
-
-      *.lo)
-	# Possibly a libtool object, so verify it.
-	if func_lalib_p "$file"; then
-
-	  # Read the .lo file
-	  func_source $dir/$name
-
-	  # Add PIC object to the list of files to remove.
-	  if test -n "$pic_object" &&
-	     test "$pic_object" != none; then
-	    rmfiles="$rmfiles $dir/$pic_object"
-	  fi
-
-	  # Add non-PIC object to the list of files to remove.
-	  if test -n "$non_pic_object" &&
-	     test "$non_pic_object" != none; then
-	    rmfiles="$rmfiles $dir/$non_pic_object"
-	  fi
-	fi
-	;;
-
-      *)
-	if test "$mode" = clean ; then
-	  noexename=$name
-	  case $file in
-	  *.exe)
-	    func_stripname '' '.exe' "$file"
-	    file=$func_stripname_result
-	    func_stripname '' '.exe' "$name"
-	    noexename=$func_stripname_result
-	    # $file with .exe has already been added to rmfiles,
-	    # add $file without .exe
-	    rmfiles="$rmfiles $file"
-	    ;;
-	  esac
-	  # Do a test to see if this is a libtool program.
-	  if func_ltwrapper_p "$file"; then
-	    if func_ltwrapper_executable_p "$file"; then
-	      func_ltwrapper_scriptname "$file"
-	      relink_command=
-	      func_source $func_ltwrapper_scriptname_result
-	      rmfiles="$rmfiles $func_ltwrapper_scriptname_result"
-	    else
-	      relink_command=
-	      func_source $dir/$noexename
-	    fi
-
-	    # note $name still contains .exe if it was in $file originally
-	    # as does the version of $file that was added into $rmfiles
-	    rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
-	    if test "$fast_install" = yes && test -n "$relink_command"; then
-	      rmfiles="$rmfiles $objdir/lt-$name"
-	    fi
-	    if test "X$noexename" != "X$name" ; then
-	      rmfiles="$rmfiles $objdir/lt-${noexename}.c"
-	    fi
-	  fi
-	fi
-	;;
-      esac
-      func_show_eval "$RM $rmfiles" 'exit_status=1'
-    done
-    objdir="$origobjdir"
-
-    # Try to remove the ${objdir}s in the directories where we deleted files
-    for dir in $rmdirs; do
-      if test -d "$dir"; then
-	func_show_eval "rmdir $dir >/dev/null 2>&1"
-      fi
-    done
-
-    exit $exit_status
-}
-
-{ test "$mode" = uninstall || test "$mode" = clean; } &&
-    func_mode_uninstall ${1+"$@"}
-
-test -z "$mode" && {
-  help="$generic_help"
-  func_fatal_help "you must specify a MODE"
-}
-
-test -z "$exec_cmd" && \
-  func_fatal_help "invalid operation mode \`$mode'"
-
-if test -n "$exec_cmd"; then
-  eval exec "$exec_cmd"
-  exit $EXIT_FAILURE
-fi
-
-exit $exit_status
-
-
-# The TAGs below are defined such that we never get into a situation
-# in which we disable both kinds of libraries.  Given conflicting
-# choices, we go for a static library, that is the most portable,
-# since we can't tell whether shared libraries were disabled because
-# the user asked for that or because the platform doesn't support
-# them.  This is particularly important on AIX, because we don't
-# support having both static and shared libraries enabled at the same
-# time on that platform, so we default to a shared-only configuration.
-# If a disable-shared tag is given, we'll fallback to a static-only
-# configuration.  But we'll never go from static-only to shared-only.
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
-build_libtool_libs=no
-build_old_libs=yes
-# ### END LIBTOOL TAG CONFIG: disable-shared
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-static
-build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
-# ### END LIBTOOL TAG CONFIG: disable-static
-
-# Local Variables:
-# mode:shell-script
-# sh-indentation:2
-# End:
-# vi:sw=2
-
diff --git a/cloog-0.17.0/autoconf/missing b/cloog-0.17.0/autoconf/missing
deleted file mode 100755
index 28055d2..0000000
--- a/cloog-0.17.0/autoconf/missing
+++ /dev/null
@@ -1,376 +0,0 @@
-#! /bin/sh
-# Common stub for a few missing GNU programs while installing.
-
-scriptversion=2009-04-28.21; # UTC
-
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
-# 2008, 2009 Free Software Foundation, Inc.
-# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-if test $# -eq 0; then
-  echo 1>&2 "Try \`$0 --help' for more information"
-  exit 1
-fi
-
-run=:
-sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
-sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
-
-# In the cases where this matters, `missing' is being run in the
-# srcdir already.
-if test -f configure.ac; then
-  configure_ac=configure.ac
-else
-  configure_ac=configure.in
-fi
-
-msg="missing on your system"
-
-case $1 in
---run)
-  # Try to run requested program, and just exit if it succeeds.
-  run=
-  shift
-  "$@" && exit 0
-  # Exit code 63 means version mismatch.  This often happens
-  # when the user try to use an ancient version of a tool on
-  # a file that requires a minimum version.  In this case we
-  # we should proceed has if the program had been absent, or
-  # if --run hadn't been passed.
-  if test $? = 63; then
-    run=:
-    msg="probably too old"
-  fi
-  ;;
-
-  -h|--h|--he|--hel|--help)
-    echo "\
-$0 [OPTION]... PROGRAM [ARGUMENT]...
-
-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
-error status if there is no known handling for PROGRAM.
-
-Options:
-  -h, --help      display this help and exit
-  -v, --version   output version information and exit
-  --run           try to run the given command, and emulate it if it fails
-
-Supported PROGRAM values:
-  aclocal      touch file \`aclocal.m4'
-  autoconf     touch file \`configure'
-  autoheader   touch file \`config.h.in'
-  autom4te     touch the output file, or create a stub one
-  automake     touch all \`Makefile.in' files
-  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
-  flex         create \`lex.yy.c', if possible, from existing .c
-  help2man     touch the output file
-  lex          create \`lex.yy.c', if possible, from existing .c
-  makeinfo     touch the output file
-  tar          try tar, gnutar, gtar, then tar without non-portable flags
-  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
-
-Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
-\`g' are ignored when checking the name.
-
-Send bug reports to <bug-automake@gnu.org>."
-    exit $?
-    ;;
-
-  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
-    echo "missing $scriptversion (GNU Automake)"
-    exit $?
-    ;;
-
-  -*)
-    echo 1>&2 "$0: Unknown \`$1' option"
-    echo 1>&2 "Try \`$0 --help' for more information"
-    exit 1
-    ;;
-
-esac
-
-# normalize program name to check for.
-program=`echo "$1" | sed '
-  s/^gnu-//; t
-  s/^gnu//; t
-  s/^g//; t'`
-
-# Now exit if we have it, but it failed.  Also exit now if we
-# don't have it and --version was passed (most likely to detect
-# the program).  This is about non-GNU programs, so use $1 not
-# $program.
-case $1 in
-  lex*|yacc*)
-    # Not GNU programs, they don't have --version.
-    ;;
-
-  tar*)
-    if test -n "$run"; then
-       echo 1>&2 "ERROR: \`tar' requires --run"
-       exit 1
-    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
-       exit 1
-    fi
-    ;;
-
-  *)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
-       # Could not run --version or --help.  This is probably someone
-       # running `$TOOL --version' or `$TOOL --help' to check whether
-       # $TOOL exists and not knowing $TOOL uses missing.
-       exit 1
-    fi
-    ;;
-esac
-
-# If it does not exist, or fails to run (possibly an outdated version),
-# try to emulate it.
-case $program in
-  aclocal*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
-         to install the \`Automake' and \`Perl' packages.  Grab them from
-         any GNU archive site."
-    touch aclocal.m4
-    ;;
-
-  autoconf*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`${configure_ac}'.  You might want to install the
-         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
-         archive site."
-    touch configure
-    ;;
-
-  autoheader*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
-         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
-         from any GNU archive site."
-    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
-    test -z "$files" && files="config.h"
-    touch_files=
-    for f in $files; do
-      case $f in
-      *:*) touch_files="$touch_files "`echo "$f" |
-				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
-      *) touch_files="$touch_files $f.in";;
-      esac
-    done
-    touch $touch_files
-    ;;
-
-  automake*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
-         You might want to install the \`Automake' and \`Perl' packages.
-         Grab them from any GNU archive site."
-    find . -type f -name Makefile.am -print |
-	   sed 's/\.am$/.in/' |
-	   while read f; do touch "$f"; done
-    ;;
-
-  autom4te*)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, but is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.
-         You can get \`$1' as part of \`Autoconf' from any GNU
-         archive site."
-
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -f "$file"; then
-	touch $file
-    else
-	test -z "$file" || exec >$file
-	echo "#! /bin/sh"
-	echo "# Created by GNU Automake missing as a replacement of"
-	echo "#  $ $@"
-	echo "exit 0"
-	chmod +x $file
-	exit 1
-    fi
-    ;;
-
-  bison*|yacc*)
-    echo 1>&2 "\
-WARNING: \`$1' $msg.  You should only need it if
-         you modified a \`.y' file.  You may need the \`Bison' package
-         in order for those modifications to take effect.  You can get
-         \`Bison' from any GNU archive site."
-    rm -f y.tab.c y.tab.h
-    if test $# -ne 1; then
-        eval LASTARG="\${$#}"
-	case $LASTARG in
-	*.y)
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" y.tab.c
-	    fi
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" y.tab.h
-	    fi
-	  ;;
-	esac
-    fi
-    if test ! -f y.tab.h; then
-	echo >y.tab.h
-    fi
-    if test ! -f y.tab.c; then
-	echo 'main() { return 0; }' >y.tab.c
-    fi
-    ;;
-
-  lex*|flex*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.l' file.  You may need the \`Flex' package
-         in order for those modifications to take effect.  You can get
-         \`Flex' from any GNU archive site."
-    rm -f lex.yy.c
-    if test $# -ne 1; then
-        eval LASTARG="\${$#}"
-	case $LASTARG in
-	*.l)
-	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" lex.yy.c
-	    fi
-	  ;;
-	esac
-    fi
-    if test ! -f lex.yy.c; then
-	echo 'main() { return 0; }' >lex.yy.c
-    fi
-    ;;
-
-  help2man*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-	 you modified a dependency of a manual page.  You may need the
-	 \`Help2man' package in order for those modifications to take
-	 effect.  You can get \`Help2man' from any GNU archive site."
-
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -f "$file"; then
-	touch $file
-    else
-	test -z "$file" || exec >$file
-	echo ".ab help2man is required to generate this page"
-	exit $?
-    fi
-    ;;
-
-  makeinfo*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.texi' or \`.texinfo' file, or any other file
-         indirectly affecting the aspect of the manual.  The spurious
-         call might also be the consequence of using a buggy \`make' (AIX,
-         DU, IRIX).  You might want to install the \`Texinfo' package or
-         the \`GNU make' package.  Grab either from any GNU archive site."
-    # The file to touch is that specified with -o ...
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -z "$file"; then
-      # ... or it is the one specified with @setfilename ...
-      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
-      file=`sed -n '
-	/^@setfilename/{
-	  s/.* \([^ ]*\) *$/\1/
-	  p
-	  q
-	}' $infile`
-      # ... or it is derived from the source name (dir/f.texi becomes f.info)
-      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
-    fi
-    # If the file does not exist, the user really needs makeinfo;
-    # let's fail without touching anything.
-    test -f $file || exit 1
-    touch $file
-    ;;
-
-  tar*)
-    shift
-
-    # We have already tried tar in the generic part.
-    # Look for gnutar/gtar before invocation to avoid ugly error
-    # messages.
-    if (gnutar --version > /dev/null 2>&1); then
-       gnutar "$@" && exit 0
-    fi
-    if (gtar --version > /dev/null 2>&1); then
-       gtar "$@" && exit 0
-    fi
-    firstarg="$1"
-    if shift; then
-	case $firstarg in
-	*o*)
-	    firstarg=`echo "$firstarg" | sed s/o//`
-	    tar "$firstarg" "$@" && exit 0
-	    ;;
-	esac
-	case $firstarg in
-	*h*)
-	    firstarg=`echo "$firstarg" | sed s/h//`
-	    tar "$firstarg" "$@" && exit 0
-	    ;;
-	esac
-    fi
-
-    echo 1>&2 "\
-WARNING: I can't seem to be able to run \`tar' with the given arguments.
-         You may want to install GNU tar or Free paxutils, or check the
-         command line arguments."
-    exit 1
-    ;;
-
-  *)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, and is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.  Check the \`README' file,
-         it often tells you about the needed prerequisites for installing
-         this package.  You may also peek at any GNU archive site, in case
-         some other package would contain this missing \`$1' program."
-    exit 1
-    ;;
-esac
-
-exit 0
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/cloog-0.17.0/configure b/cloog-0.17.0/configure
deleted file mode 100755
index 9f2f7a5..0000000
--- a/cloog-0.17.0/configure
+++ /dev/null
@@ -1,15080 +0,0 @@
-#! /bin/sh
-# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.67 for cloog 0.17.0.
-#
-# Report bugs to <cloog-development@googlegroups.com>.
-#
-#
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
-# Foundation, Inc.
-#
-#
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
-      PATH_SEPARATOR=';'
-  }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-case $0 in #((
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-  done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test "x$CONFIG_SHELL" = x; then
-  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '\${1+\"\$@\"}'='\"\$@\"'
-  setopt NO_GLOB_SUBST
-else
-  case \`(set -o) 2>/dev/null\` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-"
-  as_required="as_fn_return () { (exit \$1); }
-as_fn_success () { as_fn_return 0; }
-as_fn_failure () { as_fn_return 1; }
-as_fn_ret_success () { return 0; }
-as_fn_ret_failure () { return 1; }
-
-exitcode=0
-as_fn_success || { exitcode=1; echo as_fn_success failed.; }
-as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
-as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
-as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
-
-else
-  exitcode=1; echo positional parameters were not saved.
-fi
-test x\$exitcode = x0 || exit 1"
-  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
-  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
-  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
-  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
-test \$(( 1 + 1 )) = 2 || exit 1"
-  if (eval "$as_required") 2>/dev/null; then :
-  as_have_required=yes
-else
-  as_have_required=no
-fi
-  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
-
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_found=false
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  as_found=:
-  case $as_dir in #(
-	 /*)
-	   for as_base in sh bash ksh sh5; do
-	     # Try only shells that exist, to save several forks.
-	     as_shell=$as_dir/$as_base
-	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
-		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
-  CONFIG_SHELL=$as_shell as_have_required=yes
-		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
-  break 2
-fi
-fi
-	   done;;
-       esac
-  as_found=false
-done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
-	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
-  CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
-IFS=$as_save_IFS
-
-
-      if test "x$CONFIG_SHELL" != x; then :
-  # We cannot yet assume a decent shell, so we have to provide a
-	# neutralization value for shells without unset; and this also
-	# works around shells that cannot unset nonexistent variables.
-	BASH_ENV=/dev/null
-	ENV=/dev/null
-	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-	export CONFIG_SHELL
-	exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
-fi
-
-    if test x$as_have_required = xno; then :
-  $as_echo "$0: This script requires a shell more modern than all"
-  $as_echo "$0: the shells that I found on your system."
-  if test x${ZSH_VERSION+set} = xset ; then
-    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
-    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
-  else
-    $as_echo "$0: Please tell bug-autoconf@gnu.org and
-$0: cloog-development@googlegroups.com about your system,
-$0: including any error possibly output before this
-$0: message. Then install a modern shell, or manually run
-$0: the script under such a shell if you do have one."
-  fi
-  exit 1
-fi
-fi
-fi
-SHELL=${CONFIG_SHELL-/bin/sh}
-export SHELL
-# Unset more variables known to interfere with behavior of common tools.
-CLICOLOR_FORCE= GREP_OPTIONS=
-unset CLICOLOR_FORCE GREP_OPTIONS
-
-## --------------------- ##
-## M4sh Shell Functions. ##
-## --------------------- ##
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
-  { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
-  return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
-  set +e
-  as_fn_set_status $1
-  exit $1
-} # as_fn_exit
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || eval $as_mkdir_p || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
-  eval 'as_fn_append ()
-  {
-    eval $1+=\$2
-  }'
-else
-  as_fn_append ()
-  {
-    eval $1=\$$1\$2
-  }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
-  eval 'as_fn_arith ()
-  {
-    as_val=$(( $* ))
-  }'
-else
-  as_fn_arith ()
-  {
-    as_val=`expr "$@" || test $? -eq 1`
-  }
-fi # as_fn_arith
-
-
-# as_fn_error STATUS ERROR [LINENO LOG_FD]
-# ----------------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with STATUS, using 1 if that was 0.
-as_fn_error ()
-{
-  as_status=$1; test $as_status -eq 0 && as_status=1
-  if test "$4"; then
-    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
-  fi
-  $as_echo "$as_me: error: $2" >&2
-  as_fn_exit $as_status
-} # as_fn_error
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-
-  as_lineno_1=$LINENO as_lineno_1a=$LINENO
-  as_lineno_2=$LINENO as_lineno_2a=$LINENO
-  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
-  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
-  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
-  sed -n '
-    p
-    /[$]LINENO/=
-  ' <$as_myself |
-    sed '
-      s/[$]LINENO.*/&-/
-      t lineno
-      b
-      :lineno
-      N
-      :loop
-      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
-      t loop
-      s/-\n.*//
-    ' >$as_me.lineno &&
-  chmod +x "$as_me.lineno" ||
-    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
-
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensitive to this).
-  . "./$as_me.lineno"
-  # Exit status is that of the last command.
-  exit
-}
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
-  case `echo 'xy\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  xy)  ECHO_C='\c';;
-  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
-       ECHO_T='	';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
-  if ln -s conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s='ln -s'
-    # ... but there are two gotchas:
-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
-  elif ln conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s=ln
-  else
-    as_ln_s='cp -p'
-  fi
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p='mkdir -p "$as_dir"'
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-	test -d "$1/.";
-      else
-	case $1 in #(
-	-*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-
-# Check that we are running under the correct shell.
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-case X$lt_ECHO in
-X*--fallback-echo)
-  # Remove one level of quotation (which was required for Make).
-  ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','`
-  ;;
-esac
-
-ECHO=${lt_ECHO-echo}
-if test "X$1" = X--no-reexec; then
-  # Discard the --no-reexec flag, and continue.
-  shift
-elif test "X$1" = X--fallback-echo; then
-  # Avoid inline document here, it may be left over
-  :
-elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
-  # Yippee, $ECHO works!
-  :
-else
-  # Restart under the correct shell.
-  exec $SHELL "$0" --no-reexec ${1+"$@"}
-fi
-
-if test "X$1" = X--fallback-echo; then
-  # used as fallback echo
-  shift
-  cat <<_LT_EOF
-$*
-_LT_EOF
-  exit 0
-fi
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test -z "$lt_ECHO"; then
-  if test "X${echo_test_string+set}" != Xset; then
-    # find a string as large as possible, as long as the shell can cope with it
-    for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
-      # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
-      if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
-	 { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
-      then
-        break
-      fi
-    done
-  fi
-
-  if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
-     echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
-     test "X$echo_testing_string" = "X$echo_test_string"; then
-    :
-  else
-    # The Solaris, AIX, and Digital Unix default echo programs unquote
-    # backslashes.  This makes it impossible to quote backslashes using
-    #   echo "$something" | sed 's/\\/\\\\/g'
-    #
-    # So, first we look for a working echo in the user's PATH.
-
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for dir in $PATH /usr/ucb; do
-      IFS="$lt_save_ifs"
-      if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
-         test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
-         echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
-         test "X$echo_testing_string" = "X$echo_test_string"; then
-        ECHO="$dir/echo"
-        break
-      fi
-    done
-    IFS="$lt_save_ifs"
-
-    if test "X$ECHO" = Xecho; then
-      # We didn't find a better echo, so look for alternatives.
-      if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
-         echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
-         test "X$echo_testing_string" = "X$echo_test_string"; then
-        # This shell has a builtin print -r that does the trick.
-        ECHO='print -r'
-      elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
-	   test "X$CONFIG_SHELL" != X/bin/ksh; then
-        # If we have ksh, try running configure again with it.
-        ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
-        export ORIGINAL_CONFIG_SHELL
-        CONFIG_SHELL=/bin/ksh
-        export CONFIG_SHELL
-        exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
-      else
-        # Try using printf.
-        ECHO='printf %s\n'
-        if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
-	   echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
-	   test "X$echo_testing_string" = "X$echo_test_string"; then
-	  # Cool, printf works
-	  :
-        elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
-	     test "X$echo_testing_string" = 'X\t' &&
-	     echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-	     test "X$echo_testing_string" = "X$echo_test_string"; then
-	  CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
-	  export CONFIG_SHELL
-	  SHELL="$CONFIG_SHELL"
-	  export SHELL
-	  ECHO="$CONFIG_SHELL $0 --fallback-echo"
-        elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
-	     test "X$echo_testing_string" = 'X\t' &&
-	     echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-	     test "X$echo_testing_string" = "X$echo_test_string"; then
-	  ECHO="$CONFIG_SHELL $0 --fallback-echo"
-        else
-	  # maybe with a smaller string...
-	  prev=:
-
-	  for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
-	    if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
-	    then
-	      break
-	    fi
-	    prev="$cmd"
-	  done
-
-	  if test "$prev" != 'sed 50q "$0"'; then
-	    echo_test_string=`eval $prev`
-	    export echo_test_string
-	    exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
-	  else
-	    # Oops.  We lost completely, so just stick with echo.
-	    ECHO=echo
-	  fi
-        fi
-      fi
-    fi
-  fi
-fi
-
-# Copy echo and quote the copy suitably for passing to libtool from
-# the Makefile, instead of quoting the original, which is used later.
-lt_ECHO=$ECHO
-if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
-   lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
-fi
-
-
-
-
-test -n "$DJDIR" || exec 7<&0 </dev/null
-exec 6>&1
-
-# Name of the host.
-# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
-# so uname gets run too.
-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
-#
-# Initializations.
-#
-ac_default_prefix=/usr/local
-ac_clean_files=
-ac_config_libobj_dir=.
-LIBOBJS=
-cross_compiling=no
-subdirs=
-MFLAGS=
-MAKEFLAGS=
-
-# Identity of this package.
-PACKAGE_NAME='cloog'
-PACKAGE_TARNAME='cloog'
-PACKAGE_VERSION='0.17.0'
-PACKAGE_STRING='cloog 0.17.0'
-PACKAGE_BUGREPORT='cloog-development@googlegroups.com'
-PACKAGE_URL=''
-
-ac_unique_file="source/cloog.c"
-# Factoring default headers for most tests.
-ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#ifdef STDC_HEADERS
-# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-#  include <stdlib.h>
-# endif
-#endif
-#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-#  include <memory.h>
-# endif
-# include <string.h>
-#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-#ifdef HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif"
-
-enable_option_checking=no
-ac_subst_vars='am__EXEEXT_FALSE
-am__EXEEXT_TRUE
-LTLIBOBJS
-LIBOBJS
-subdirs
-pkgconfig_libfile
-pkgconfig_libdir
-VERSION_REVISION
-VERSION_MINOR
-VERSION_MAJOR
-BITS
-INSTALL
-GIT_INDEX
-NO_OSL_FALSE
-NO_OSL_TRUE
-BUNDLED_OSL_FALSE
-BUNDLED_OSL_TRUE
-OSL_LIBS
-OSL_LDFLAGS
-OSL_CPPFLAGS
-NO_ISL_FALSE
-NO_ISL_TRUE
-BUNDLED_ISL_FALSE
-BUNDLED_ISL_TRUE
-ISL_LIBS
-ISL_LDFLAGS
-ISL_CPPFLAGS
-NEED_GET_MEMORY_FUNCTIONS_FALSE
-NEED_GET_MEMORY_FUNCTIONS_TRUE
-CFLAGS_WARN
-PRTDIAG
-HAVE_TEXI2DVI_FALSE
-HAVE_TEXI2DVI_TRUE
-TEXI2DVI
-CPP
-OTOOL64
-OTOOL
-LIPO
-NMEDIT
-DSYMUTIL
-lt_ECHO
-RANLIB
-AR
-OBJDUMP
-NM
-ac_ct_DUMPBIN
-DUMPBIN
-LD
-FGREP
-EGREP
-GREP
-SED
-host_os
-host_vendor
-host_cpu
-host
-build_os
-build_vendor
-build_cpu
-build
-LIBTOOL
-CD
-LN_S
-am__fastdepCC_FALSE
-am__fastdepCC_TRUE
-CCDEPMODE
-AMDEPBACKSLASH
-AMDEP_FALSE
-AMDEP_TRUE
-am__quote
-am__include
-DEPDIR
-OBJEXT
-EXEEXT
-ac_ct_CC
-CPPFLAGS
-LDFLAGS
-CFLAGS
-CC
-AM_BACKSLASH
-AM_DEFAULT_VERBOSITY
-am__untar
-am__tar
-AMTAR
-am__leading_dot
-SET_MAKE
-AWK
-mkdir_p
-MKDIR_P
-INSTALL_STRIP_PROGRAM
-STRIP
-install_sh
-MAKEINFO
-AUTOHEADER
-AUTOMAKE
-AUTOCONF
-ACLOCAL
-VERSION
-PACKAGE
-CYGPATH_W
-am__isrc
-INSTALL_DATA
-INSTALL_SCRIPT
-INSTALL_PROGRAM
-versioninfo
-target_alias
-host_alias
-build_alias
-LIBS
-ECHO_T
-ECHO_N
-ECHO_C
-DEFS
-mandir
-localedir
-libdir
-psdir
-pdfdir
-dvidir
-htmldir
-infodir
-docdir
-oldincludedir
-includedir
-localstatedir
-sharedstatedir
-sysconfdir
-datadir
-datarootdir
-libexecdir
-sbindir
-bindir
-program_transform_name
-prefix
-exec_prefix
-PACKAGE_URL
-PACKAGE_BUGREPORT
-PACKAGE_STRING
-PACKAGE_VERSION
-PACKAGE_TARNAME
-PACKAGE_NAME
-PATH_SEPARATOR
-SHELL'
-ac_subst_files=''
-ac_user_opts='
-enable_option_checking
-enable_silent_rules
-enable_dependency_tracking
-enable_shared
-enable_static
-with_pic
-enable_fast_install
-with_gnu_ld
-enable_libtool_lock
-enable_portable_binary
-with_gcc_arch
-with_isl
-with_isl_prefix
-with_isl_exec_prefix
-with_isl_builddir
-with_gmp
-with_gmp_prefix
-with_gmp_exec_prefix
-with_gmp_builddir
-with_osl
-with_osl_prefix
-with_osl_exec_prefix
-with_osl_builddir
-'
-      ac_precious_vars='build_alias
-host_alias
-target_alias
-CC
-CFLAGS
-LDFLAGS
-LIBS
-CPPFLAGS
-CPP'
-ac_subdirs_all='isl
-osl'
-
-# Initialize some variables set by options.
-ac_init_help=
-ac_init_version=false
-ac_unrecognized_opts=
-ac_unrecognized_sep=
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-cache_file=/dev/null
-exec_prefix=NONE
-no_create=
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-verbose=
-x_includes=NONE
-x_libraries=NONE
-
-# Installation directory options.
-# These are left unexpanded so users can "make install exec_prefix=/foo"
-# and all the variables that are supposed to be based on exec_prefix
-# by default will actually change.
-# Use braces instead of parens because sh, perl, etc. also accept them.
-# (The list follows the same order as the GNU Coding Standards.)
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datarootdir='${prefix}/share'
-datadir='${datarootdir}'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
-infodir='${datarootdir}/info'
-htmldir='${docdir}'
-dvidir='${docdir}'
-pdfdir='${docdir}'
-psdir='${docdir}'
-libdir='${exec_prefix}/lib'
-localedir='${datarootdir}/locale'
-mandir='${datarootdir}/man'
-
-ac_prev=
-ac_dashdash=
-for ac_option
-do
-  # If the previous option needs an argument, assign it.
-  if test -n "$ac_prev"; then
-    eval $ac_prev=\$ac_option
-    ac_prev=
-    continue
-  fi
-
-  case $ac_option in
-  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
-  *=)   ac_optarg= ;;
-  *)    ac_optarg=yes ;;
-  esac
-
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
-  case $ac_dashdash$ac_option in
-  --)
-    ac_dashdash=yes ;;
-
-  -bindir | --bindir | --bindi | --bind | --bin | --bi)
-    ac_prev=bindir ;;
-  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
-    bindir=$ac_optarg ;;
-
-  -build | --build | --buil | --bui | --bu)
-    ac_prev=build_alias ;;
-  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
-    build_alias=$ac_optarg ;;
-
-  -cache-file | --cache-file | --cache-fil | --cache-fi \
-  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-    ac_prev=cache_file ;;
-  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
-    cache_file=$ac_optarg ;;
-
-  --config-cache | -C)
-    cache_file=config.cache ;;
-
-  -datadir | --datadir | --datadi | --datad)
-    ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=*)
-    datadir=$ac_optarg ;;
-
-  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
-  | --dataroo | --dataro | --datar)
-    ac_prev=datarootdir ;;
-  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
-  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
-    datarootdir=$ac_optarg ;;
-
-  -disable-* | --disable-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid feature name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"enable_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval enable_$ac_useropt=no ;;
-
-  -docdir | --docdir | --docdi | --doc | --do)
-    ac_prev=docdir ;;
-  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
-    docdir=$ac_optarg ;;
-
-  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
-    ac_prev=dvidir ;;
-  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
-    dvidir=$ac_optarg ;;
-
-  -enable-* | --enable-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid feature name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"enable_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval enable_$ac_useropt=\$ac_optarg ;;
-
-  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
-  | --exec | --exe | --ex)
-    ac_prev=exec_prefix ;;
-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
-  | --exec=* | --exe=* | --ex=*)
-    exec_prefix=$ac_optarg ;;
-
-  -gas | --gas | --ga | --g)
-    # Obsolete; use --with-gas.
-    with_gas=yes ;;
-
-  -help | --help | --hel | --he | -h)
-    ac_init_help=long ;;
-  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
-    ac_init_help=recursive ;;
-  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
-    ac_init_help=short ;;
-
-  -host | --host | --hos | --ho)
-    ac_prev=host_alias ;;
-  -host=* | --host=* | --hos=* | --ho=*)
-    host_alias=$ac_optarg ;;
-
-  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
-    ac_prev=htmldir ;;
-  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
-  | --ht=*)
-    htmldir=$ac_optarg ;;
-
-  -includedir | --includedir | --includedi | --included | --include \
-  | --includ | --inclu | --incl | --inc)
-    ac_prev=includedir ;;
-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
-  | --includ=* | --inclu=* | --incl=* | --inc=*)
-    includedir=$ac_optarg ;;
-
-  -infodir | --infodir | --infodi | --infod | --info | --inf)
-    ac_prev=infodir ;;
-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
-    infodir=$ac_optarg ;;
-
-  -libdir | --libdir | --libdi | --libd)
-    ac_prev=libdir ;;
-  -libdir=* | --libdir=* | --libdi=* | --libd=*)
-    libdir=$ac_optarg ;;
-
-  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
-  | --libexe | --libex | --libe)
-    ac_prev=libexecdir ;;
-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
-  | --libexe=* | --libex=* | --libe=*)
-    libexecdir=$ac_optarg ;;
-
-  -localedir | --localedir | --localedi | --localed | --locale)
-    ac_prev=localedir ;;
-  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
-    localedir=$ac_optarg ;;
-
-  -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst | --locals)
-    ac_prev=localstatedir ;;
-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
-    localstatedir=$ac_optarg ;;
-
-  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
-    ac_prev=mandir ;;
-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
-    mandir=$ac_optarg ;;
-
-  -nfp | --nfp | --nf)
-    # Obsolete; use --without-fp.
-    with_fp=no ;;
-
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c | -n)
-    no_create=yes ;;
-
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
-    no_recursion=yes ;;
-
-  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
-  | --oldin | --oldi | --old | --ol | --o)
-    ac_prev=oldincludedir ;;
-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
-    oldincludedir=$ac_optarg ;;
-
-  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-    ac_prev=prefix ;;
-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-    prefix=$ac_optarg ;;
-
-  -program-prefix | --program-prefix | --program-prefi | --program-pref \
-  | --program-pre | --program-pr | --program-p)
-    ac_prev=program_prefix ;;
-  -program-prefix=* | --program-prefix=* | --program-prefi=* \
-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
-    program_prefix=$ac_optarg ;;
-
-  -program-suffix | --program-suffix | --program-suffi | --program-suff \
-  | --program-suf | --program-su | --program-s)
-    ac_prev=program_suffix ;;
-  -program-suffix=* | --program-suffix=* | --program-suffi=* \
-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
-    program_suffix=$ac_optarg ;;
-
-  -program-transform-name | --program-transform-name \
-  | --program-transform-nam | --program-transform-na \
-  | --program-transform-n | --program-transform- \
-  | --program-transform | --program-transfor \
-  | --program-transfo | --program-transf \
-  | --program-trans | --program-tran \
-  | --progr-tra | --program-tr | --program-t)
-    ac_prev=program_transform_name ;;
-  -program-transform-name=* | --program-transform-name=* \
-  | --program-transform-nam=* | --program-transform-na=* \
-  | --program-transform-n=* | --program-transform-=* \
-  | --program-transform=* | --program-transfor=* \
-  | --program-transfo=* | --program-transf=* \
-  | --program-trans=* | --program-tran=* \
-  | --progr-tra=* | --program-tr=* | --program-t=*)
-    program_transform_name=$ac_optarg ;;
-
-  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
-    ac_prev=pdfdir ;;
-  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
-    pdfdir=$ac_optarg ;;
-
-  -psdir | --psdir | --psdi | --psd | --ps)
-    ac_prev=psdir ;;
-  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
-    psdir=$ac_optarg ;;
-
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil)
-    silent=yes ;;
-
-  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
-    ac_prev=sbindir ;;
-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
-  | --sbi=* | --sb=*)
-    sbindir=$ac_optarg ;;
-
-  -sharedstatedir | --sharedstatedir | --sharedstatedi \
-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
-  | --sharedst | --shareds | --shared | --share | --shar \
-  | --sha | --sh)
-    ac_prev=sharedstatedir ;;
-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
-  | --sha=* | --sh=*)
-    sharedstatedir=$ac_optarg ;;
-
-  -site | --site | --sit)
-    ac_prev=site ;;
-  -site=* | --site=* | --sit=*)
-    site=$ac_optarg ;;
-
-  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-    ac_prev=srcdir ;;
-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-    srcdir=$ac_optarg ;;
-
-  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
-  | --syscon | --sysco | --sysc | --sys | --sy)
-    ac_prev=sysconfdir ;;
-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
-    sysconfdir=$ac_optarg ;;
-
-  -target | --target | --targe | --targ | --tar | --ta | --t)
-    ac_prev=target_alias ;;
-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
-    target_alias=$ac_optarg ;;
-
-  -v | -verbose | --verbose | --verbos | --verbo | --verb)
-    verbose=yes ;;
-
-  -version | --version | --versio | --versi | --vers | -V)
-    ac_init_version=: ;;
-
-  -with-* | --with-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid package name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"with_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval with_$ac_useropt=\$ac_optarg ;;
-
-  -without-* | --without-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid package name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"with_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval with_$ac_useropt=no ;;
-
-  --x)
-    # Obsolete; use --with-x.
-    with_x=yes ;;
-
-  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
-  | --x-incl | --x-inc | --x-in | --x-i)
-    ac_prev=x_includes ;;
-  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
-  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
-    x_includes=$ac_optarg ;;
-
-  -x-libraries | --x-libraries | --x-librarie | --x-librari \
-  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
-    ac_prev=x_libraries ;;
-  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
-  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
-    x_libraries=$ac_optarg ;;
-
-  -*) as_fn_error $? "unrecognized option: \`$ac_option'
-Try \`$0 --help' for more information"
-    ;;
-
-  *=*)
-    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
-    # Reject names that are not valid shell variable names.
-    case $ac_envvar in #(
-      '' | [0-9]* | *[!_$as_cr_alnum]* )
-      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
-    esac
-    eval $ac_envvar=\$ac_optarg
-    export $ac_envvar ;;
-
-  *)
-    # FIXME: should be removed in autoconf 3.0.
-    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
-    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
-    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
-    ;;
-
-  esac
-done
-
-if test -n "$ac_prev"; then
-  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
-  as_fn_error $? "missing argument to $ac_option"
-fi
-
-if test -n "$ac_unrecognized_opts"; then
-  case $enable_option_checking in
-    no) ;;
-    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
-    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
-  esac
-fi
-
-# Check all directory arguments for consistency.
-for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
-		datadir sysconfdir sharedstatedir localstatedir includedir \
-		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
-do
-  eval ac_val=\$$ac_var
-  # Remove trailing slashes.
-  case $ac_val in
-    */ )
-      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
-      eval $ac_var=\$ac_val;;
-  esac
-  # Be sure to have absolute directory names.
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* )  continue;;
-    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
-  esac
-  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
-done
-
-# There might be people who depend on the old broken behavior: `$host'
-# used to hold the argument of --host etc.
-# FIXME: To remove some day.
-build=$build_alias
-host=$host_alias
-target=$target_alias
-
-# FIXME: To remove some day.
-if test "x$host_alias" != x; then
-  if test "x$build_alias" = x; then
-    cross_compiling=maybe
-    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
-    If a cross compiler is detected then cross compile mode will be used" >&2
-  elif test "x$build_alias" != "x$host_alias"; then
-    cross_compiling=yes
-  fi
-fi
-
-ac_tool_prefix=
-test -n "$host_alias" && ac_tool_prefix=$host_alias-
-
-test "$silent" = yes && exec 6>/dev/null
-
-
-ac_pwd=`pwd` && test -n "$ac_pwd" &&
-ac_ls_di=`ls -di .` &&
-ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
-  as_fn_error $? "working directory cannot be determined"
-test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
-  as_fn_error $? "pwd does not report name of working directory"
-
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
-  ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then the parent directory.
-  ac_confdir=`$as_dirname -- "$as_myself" ||
-$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_myself" : 'X\(//\)[^/]' \| \
-	 X"$as_myself" : 'X\(//\)$' \| \
-	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  srcdir=$ac_confdir
-  if test ! -r "$srcdir/$ac_unique_file"; then
-    srcdir=..
-  fi
-else
-  ac_srcdir_defaulted=no
-fi
-if test ! -r "$srcdir/$ac_unique_file"; then
-  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
-  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
-fi
-ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
-ac_abs_confdir=`(
-	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
-	pwd)`
-# When building in place, set srcdir=.
-if test "$ac_abs_confdir" = "$ac_pwd"; then
-  srcdir=.
-fi
-# Remove unnecessary trailing slashes from srcdir.
-# Double slashes in file names in object file debugging info
-# mess up M-x gdb in Emacs.
-case $srcdir in
-*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
-esac
-for ac_var in $ac_precious_vars; do
-  eval ac_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_env_${ac_var}_value=\$${ac_var}
-  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_cv_env_${ac_var}_value=\$${ac_var}
-done
-
-#
-# Report the --help message.
-#
-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 cloog 0.17.0 to adapt to many kinds of systems.
-
-Usage: $0 [OPTION]... [VAR=VALUE]...
-
-To assign environment variables (e.g., CC, CFLAGS...), specify them as
-VAR=VALUE.  See below for descriptions of some of the useful variables.
-
-Defaults for the options are specified in brackets.
-
-Configuration:
-  -h, --help              display this help and exit
-      --help=short        display options specific to this package
-      --help=recursive    display the short help of all the included packages
-  -V, --version           display version information and exit
-  -q, --quiet, --silent   do not print \`checking ...' messages
-      --cache-file=FILE   cache test results in FILE [disabled]
-  -C, --config-cache      alias for \`--cache-file=config.cache'
-  -n, --no-create         do not create output files
-      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
-
-Installation directories:
-  --prefix=PREFIX         install architecture-independent files in PREFIX
-                          [$ac_default_prefix]
-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-                          [PREFIX]
-
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
-
-For better control, use the options below.
-
-Fine tuning of the installation directories:
-  --bindir=DIR            user executables [EPREFIX/bin]
-  --sbindir=DIR           system admin executables [EPREFIX/sbin]
-  --libexecdir=DIR        program executables [EPREFIX/libexec]
-  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
-  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
-  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
-  --libdir=DIR            object code libraries [EPREFIX/lib]
-  --includedir=DIR        C header files [PREFIX/include]
-  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
-  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
-  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
-  --infodir=DIR           info documentation [DATAROOTDIR/info]
-  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
-  --mandir=DIR            man documentation [DATAROOTDIR/man]
-  --docdir=DIR            documentation root [DATAROOTDIR/doc/cloog]
-  --htmldir=DIR           html documentation [DOCDIR]
-  --dvidir=DIR            dvi documentation [DOCDIR]
-  --pdfdir=DIR            pdf documentation [DOCDIR]
-  --psdir=DIR             ps documentation [DOCDIR]
-_ACEOF
-
-  cat <<\_ACEOF
-
-Program names:
-  --program-prefix=PREFIX            prepend PREFIX to installed program names
-  --program-suffix=SUFFIX            append SUFFIX to installed program names
-  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
-
-System types:
-  --build=BUILD     configure for building on BUILD [guessed]
-  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
-_ACEOF
-fi
-
-if test -n "$ac_init_help"; then
-  case $ac_init_help in
-     short | recursive ) echo "Configuration of cloog 0.17.0:";;
-   esac
-  cat <<\_ACEOF
-
-Optional Features:
-  --disable-option-checking  ignore unrecognized --enable/--with options
-  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
-  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --enable-silent-rules          less verbose build output (undo: `make V=1')
-  --disable-silent-rules         verbose build output (undo: `make V=0')
-  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors
-  --enable-shared[=PKGS]  build shared libraries [default=yes]
-  --enable-static[=PKGS]  build static libraries [default=yes]
-  --enable-fast-install[=PKGS]
-                          optimize for fast installation [default=yes]
-  --disable-libtool-lock  avoid locking (might break parallel builds)
-  --enable-portable-binary
-                          disable compiler optimizations that would produce
-                          unportable binaries
-
-Optional Packages:
-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --with-pic              try to use only PIC/non-PIC objects [default=use
-                          both]
-  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
-  --with-gcc-arch=<arch>  use architecture <arch> for gcc -march/-mtune,
-                          instead of guessing
-  --with-isl=no|system|build|bundled
-                          Which isl to use
-  --with-isl-prefix=DIR   Prefix of isl installation
-  --with-isl-exec-prefix=DIR
-                          Exec prefix of isl installation
-  --with-isl-builddir=DIR Location of isl builddir
-  --with-gmp=system|build Which gmp to use
-  --with-gmp-prefix=DIR   Prefix of gmp installation
-  --with-gmp-exec-prefix=DIR
-                          Exec prefix of gmp installation
-  --with-gmp-builddir=DIR Location of gmp builddir
-  --with-osl=no|system|build|bundled
-                          Which osl to use
-  --with-osl-prefix=DIR   Prefix of osl installation
-  --with-osl-exec-prefix=DIR
-                          Exec prefix of osl installation
-  --with-osl-builddir=DIR Location of osl builddir
-
-Some influential environment variables:
-  CC          C compiler command
-  CFLAGS      C compiler flags
-  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
-              nonstandard directory <lib dir>
-  LIBS        libraries to pass to the linker, e.g. -l<library>
-  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
-              you have headers in a nonstandard directory <include dir>
-  CPP         C preprocessor
-
-Use these variables to override the choices made by `configure' or to help
-it to find libraries and programs with nonstandard names/locations.
-
-Report bugs to <cloog-development@googlegroups.com>.
-_ACEOF
-ac_status=$?
-fi
-
-if test "$ac_init_help" = "recursive"; then
-  # If there are subdirs, report their specific --help.
-  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d "$ac_dir" ||
-      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
-      continue
-    ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-    cd "$ac_dir" || { ac_status=$?; continue; }
-    # Check for guested configure.
-    if test -f "$ac_srcdir/configure.gnu"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
-    elif test -f "$ac_srcdir/configure"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure" --help=recursive
-    else
-      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
-    fi || ac_status=$?
-    cd "$ac_pwd" || { ac_status=$?; break; }
-  done
-fi
-
-test -n "$ac_init_help" && exit $ac_status
-if $ac_init_version; then
-  cat <<\_ACEOF
-cloog configure 0.17.0
-generated by GNU Autoconf 2.67
-
-Copyright (C) 2010 Free Software Foundation, Inc.
-This configure script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it.
-_ACEOF
-  exit
-fi
-
-## ------------------------ ##
-## Autoconf initialization. ##
-## ------------------------ ##
-
-# ac_fn_c_try_compile LINENO
-# --------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext
-  if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_compile
-
-# ac_fn_c_try_link LINENO
-# -----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
-  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
-  # interfere with the next link command; also delete a directory that is
-  # left behind by Apple's compiler.  We do this before executing the actions.
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_link
-
-# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists and can be compiled using the include files in
-# INCLUDES, setting the cache variable VAR accordingly.
-ac_fn_c_check_header_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_header_compile
-
-# ac_fn_c_try_cpp LINENO
-# ----------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_cpp ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } > conftest.i && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-    ac_retval=1
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_cpp
-
-# ac_fn_c_try_run LINENO
-# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_c_try_run ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-       $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-       ac_retval=$ac_status
-fi
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_run
-
-# ac_fn_c_check_func LINENO FUNC VAR
-# ----------------------------------
-# Tests whether FUNC exists, setting the cache variable VAR accordingly
-ac_fn_c_check_func ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $2 innocuous_$2
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $2 (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $2
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $2 ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined __stub_$2 || defined __stub___$2
-choke me
-#endif
-
-int
-main ()
-{
-return $2 ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_func
-
-# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
-# -------------------------------------------
-# Tests whether TYPE exists after having included INCLUDES, setting cache
-# variable VAR accordingly.
-ac_fn_c_check_type ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=no"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof ($2))
-	 return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof (($2)))
-	    return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  eval "$3=yes"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_type
-
-# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_c_check_header_mongrel ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if eval "test \"\${$3+set}\"" = set; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
-  # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_header_compiler=yes
-else
-  ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <$2>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  ac_header_preproc=yes
-else
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
-  yes:no: )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-    ;;
-  no:yes:* )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( $as_echo "## ------------------------------------------------- ##
-## Report this to cloog-development@googlegroups.com ##
-## ------------------------------------------------- ##"
-     ) | sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_header_mongrel
-
-# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
-# ---------------------------------------------
-# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
-# accordingly.
-ac_fn_c_check_decl ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  as_decl_name=`echo $2|sed 's/ *(.*//'`
-  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
-$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-#ifndef $as_decl_name
-#ifdef __cplusplus
-  (void) $as_decl_use;
-#else
-  (void) $as_decl_name;
-#endif
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_decl
-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 cloog $as_me 0.17.0, which was
-generated by GNU Autoconf 2.67.  Invocation command line was
-
-  $ $0 $@
-
-_ACEOF
-exec 5>>config.log
-{
-cat <<_ASUNAME
-## --------- ##
-## Platform. ##
-## --------- ##
-
-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
-
-/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
-/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
-/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
-
-_ASUNAME
-
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    $as_echo "PATH: $as_dir"
-  done
-IFS=$as_save_IFS
-
-} >&5
-
-cat >&5 <<_ACEOF
-
-
-## ----------- ##
-## Core tests. ##
-## ----------- ##
-
-_ACEOF
-
-
-# Keep a trace of the command line.
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Strip out --silent because we don't want to record it for future runs.
-# Also quote any args containing shell meta-characters.
-# Make two passes to allow for proper duplicate-argument suppression.
-ac_configure_args=
-ac_configure_args0=
-ac_configure_args1=
-ac_must_keep_next=false
-for ac_pass in 1 2
-do
-  for ac_arg
-  do
-    case $ac_arg in
-    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
-    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-    | -silent | --silent | --silen | --sile | --sil)
-      continue ;;
-    *\'*)
-      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    case $ac_pass in
-    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
-    2)
-      as_fn_append ac_configure_args1 " '$ac_arg'"
-      if test $ac_must_keep_next = true; then
-	ac_must_keep_next=false # Got value, back to normal.
-      else
-	case $ac_arg in
-	  *=* | --config-cache | -C | -disable-* | --disable-* \
-	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
-	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
-	  | -with-* | --with-* | -without-* | --without-* | --x)
-	    case "$ac_configure_args0 " in
-	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
-	    esac
-	    ;;
-	  -* ) ac_must_keep_next=true ;;
-	esac
-      fi
-      as_fn_append ac_configure_args " '$ac_arg'"
-      ;;
-    esac
-  done
-done
-{ ac_configure_args0=; unset ac_configure_args0;}
-{ ac_configure_args1=; unset ac_configure_args1;}
-
-# When interrupted or exit'd, cleanup temporary files, and complete
-# config.log.  We remove comments because anyway the quotes in there
-# would cause problems or look ugly.
-# WARNING: Use '\'' to represent an apostrophe within the trap.
-# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
-trap 'exit_status=$?
-  # Save into config.log some information that might help in debugging.
-  {
-    echo
-
-    $as_echo "## ---------------- ##
-## Cache variables. ##
-## ---------------- ##"
-    echo
-    # The following way of writing the cache mishandles newlines in values,
-(
-  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) { eval $ac_var=; unset $ac_var;} ;;
-      esac ;;
-    esac
-  done
-  (set) 2>&1 |
-    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      sed -n \
-	"s/'\''/'\''\\\\'\'''\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
-      ;; #(
-    *)
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-)
-    echo
-
-    $as_echo "## ----------------- ##
-## Output variables. ##
-## ----------------- ##"
-    echo
-    for ac_var in $ac_subst_vars
-    do
-      eval ac_val=\$$ac_var
-      case $ac_val in
-      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-      esac
-      $as_echo "$ac_var='\''$ac_val'\''"
-    done | sort
-    echo
-
-    if test -n "$ac_subst_files"; then
-      $as_echo "## ------------------- ##
-## File substitutions. ##
-## ------------------- ##"
-      echo
-      for ac_var in $ac_subst_files
-      do
-	eval ac_val=\$$ac_var
-	case $ac_val in
-	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-	esac
-	$as_echo "$ac_var='\''$ac_val'\''"
-      done | sort
-      echo
-    fi
-
-    if test -s confdefs.h; then
-      $as_echo "## ----------- ##
-## confdefs.h. ##
-## ----------- ##"
-      echo
-      cat confdefs.h
-      echo
-    fi
-    test "$ac_signal" != 0 &&
-      $as_echo "$as_me: caught signal $ac_signal"
-    $as_echo "$as_me: exit $exit_status"
-  } >&5
-  rm -f core *.core core.conftest.* &&
-    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
-    exit $exit_status
-' 0
-for ac_signal in 1 2 13 15; do
-  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
-done
-ac_signal=0
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -f -r conftest* confdefs.h
-
-$as_echo "/* confdefs.h */" > confdefs.h
-
-# Predefined preprocessor variables.
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
-
-
-# Let the site file select an alternate cache file if it wants to.
-# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
-if test -n "$CONFIG_SITE"; then
-  # We do not want a PATH search for config.site.
-  case $CONFIG_SITE in #((
-    -*)  ac_site_file1=./$CONFIG_SITE;;
-    */*) ac_site_file1=$CONFIG_SITE;;
-    *)   ac_site_file1=./$CONFIG_SITE;;
-  esac
-elif test "x$prefix" != xNONE; then
-  ac_site_file1=$prefix/share/config.site
-  ac_site_file2=$prefix/etc/config.site
-else
-  ac_site_file1=$ac_default_prefix/share/config.site
-  ac_site_file2=$ac_default_prefix/etc/config.site
-fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
-do
-  test "x$ac_site_file" = xNONE && continue
-  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
-    sed 's/^/| /' "$ac_site_file" >&5
-    . "$ac_site_file" \
-      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "failed to load site script $ac_site_file
-See \`config.log' for more details" "$LINENO" 5 ; }
-  fi
-done
-
-if test -r "$cache_file"; then
-  # Some versions of bash will fail to source /dev/null (special files
-  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
-  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
-    case $cache_file in
-      [\\/]* | ?:[\\/]* ) . "$cache_file";;
-      *)                      . "./$cache_file";;
-    esac
-  fi
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
-  >$cache_file
-fi
-
-# Check that the precious variables saved in the cache have kept the same
-# value.
-ac_cache_corrupted=false
-for ac_var in $ac_precious_vars; do
-  eval ac_old_set=\$ac_cv_env_${ac_var}_set
-  eval ac_new_set=\$ac_env_${ac_var}_set
-  eval ac_old_val=\$ac_cv_env_${ac_var}_value
-  eval ac_new_val=\$ac_env_${ac_var}_value
-  case $ac_old_set,$ac_new_set in
-    set,)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,set)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,);;
-    *)
-      if test "x$ac_old_val" != "x$ac_new_val"; then
-	# differences in whitespace do not lead to failure.
-	ac_old_val_w=`echo x $ac_old_val`
-	ac_new_val_w=`echo x $ac_new_val`
-	if test "$ac_old_val_w" != "$ac_new_val_w"; then
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
-	  ac_cache_corrupted=:
-	else
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
-	  eval $ac_var=\$ac_old_val
-	fi
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
-$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
-$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
-      fi;;
-  esac
-  # Pass precious variables to config.status.
-  if test "$ac_new_set" = set; then
-    case $ac_new_val in
-    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
-    *) ac_arg=$ac_var=$ac_new_val ;;
-    esac
-    case " $ac_configure_args " in
-      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
-      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
-    esac
-  fi
-done
-if $ac_cache_corrupted; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
-fi
-## -------------------- ##
-## Main body of script. ##
-## -------------------- ##
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-ac_aux_dir=
-for ac_dir in autoconf "$srcdir"/autoconf; do
-  if test -f "$ac_dir/install-sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install-sh -c"
-    break
-  elif test -f "$ac_dir/install.sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install.sh -c"
-    break
-  elif test -f "$ac_dir/shtool"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/shtool install -c"
-    break
-  fi
-done
-if test -z "$ac_aux_dir"; then
-  as_fn_error $? "cannot find install-sh, install.sh, or shtool in autoconf \"$srcdir\"/autoconf" "$LINENO" 5
-fi
-
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
-
-
-
-
-VERSION_MAJOR=0
-VERSION_MINOR=17
-VERSION_REVISION=0
-
-versioninfo=3:0:0
-
-am__api_version='1.11'
-
-# Find a good install program.  We prefer a C program (faster),
-# so one script is as good as another.  But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AmigaOS /C/install, which installs bootblocks on floppy discs
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# OS/2's system install, which has a completely different semantic
-# ./install, which can be erroneously created by make from ./install.sh.
-# Reject install programs that cannot install multiple files.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
-$as_echo_n "checking for a BSD-compatible install... " >&6; }
-if test -z "$INSTALL"; then
-if test "${ac_cv_path_install+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in #((
-  ./ | .// | /[cC]/* | \
-  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
-  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
-  /usr/ucb/* ) ;;
-  *)
-    # OSF1 and SCO ODT 3.0 have their own names for install.
-    # Don't use installbsd from OSF since it installs stuff as root
-    # by default.
-    for ac_prog in ginstall scoinst install; do
-      for ac_exec_ext in '' $ac_executable_extensions; do
-	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
-	  if test $ac_prog = install &&
-	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # AIX install.  It has an incompatible calling convention.
-	    :
-	  elif test $ac_prog = install &&
-	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # program-specific install script used by HP pwplus--don't use.
-	    :
-	  else
-	    rm -rf conftest.one conftest.two conftest.dir
-	    echo one > conftest.one
-	    echo two > conftest.two
-	    mkdir conftest.dir
-	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
-	      test -s conftest.one && test -s conftest.two &&
-	      test -s conftest.dir/conftest.one &&
-	      test -s conftest.dir/conftest.two
-	    then
-	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
-	      break 3
-	    fi
-	  fi
-	fi
-      done
-    done
-    ;;
-esac
-
-  done
-IFS=$as_save_IFS
-
-rm -rf conftest.one conftest.two conftest.dir
-
-fi
-  if test "${ac_cv_path_install+set}" = set; then
-    INSTALL=$ac_cv_path_install
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for INSTALL within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    INSTALL=$ac_install_sh
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
-$as_echo "$INSTALL" >&6; }
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
-$as_echo_n "checking whether build environment is sane... " >&6; }
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name.  Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
-  *[\\\"\#\$\&\'\`$am_lf]*)
-    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5 ;;
-esac
-case $srcdir in
-  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
-    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5 ;;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$*" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$*" != "X $srcdir/configure conftest.file" \
-      && test "$*" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
-alias in your environment" "$LINENO" 5
-   fi
-
-   test "$2" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   as_fn_error $? "newly created file is older than distributed files!
-Check your system clock" "$LINENO" 5
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-test "$program_prefix" != NONE &&
-  program_transform_name="s&^&$program_prefix&;$program_transform_name"
-# Use a double $ so make ignores it.
-test "$program_suffix" != NONE &&
-  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
-# Double any \ or $.
-# By default was `s,x,x', remove it if useless.
-ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
-program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
-
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-
-if test x"${MISSING+set}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
-  *)
-    MISSING="\${SHELL} $am_aux_dir/missing" ;;
-  esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
-$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
-fi
-
-if test x"${install_sh}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
-  *)
-    install_sh="\${SHELL} $am_aux_dir/install-sh"
-  esac
-fi
-
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-if test "$cross_compiling" != no; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
-$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
-if test -z "$MKDIR_P"; then
-  if test "${ac_cv_path_mkdir+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in mkdir gmkdir; do
-	 for ac_exec_ext in '' $ac_executable_extensions; do
-	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
-	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
-	     'mkdir (GNU coreutils) '* | \
-	     'mkdir (coreutils) '* | \
-	     'mkdir (fileutils) '4.1*)
-	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
-	       break 3;;
-	   esac
-	 done
-       done
-  done
-IFS=$as_save_IFS
-
-fi
-
-  test -d ./--version && rmdir ./--version
-  if test "${ac_cv_path_mkdir+set}" = set; then
-    MKDIR_P="$ac_cv_path_mkdir -p"
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for MKDIR_P within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    MKDIR_P="$ac_install_sh -d"
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
-$as_echo "$MKDIR_P" >&6; }
-
-mkdir_p="$MKDIR_P"
-case $mkdir_p in
-  [\\/$]* | ?:[\\/]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-
-for ac_prog in gawk mawk nawk awk
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_AWK+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$AWK"; then
-  ac_cv_prog_AWK="$AWK" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_AWK="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-AWK=$ac_cv_prog_AWK
-if test -n "$AWK"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
-$as_echo "$AWK" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$AWK" && break
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
-set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.make <<\_ACEOF
-SHELL = /bin/sh
-all:
-	@echo '@@@%%%=$(MAKE)=@@@%%%'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
-case `${MAKE-make} -f conftest.make 2>/dev/null` in
-  *@@@%%%=?*=@@@%%%*)
-    eval ac_cv_prog_make_${ac_make}_set=yes;;
-  *)
-    eval ac_cv_prog_make_${ac_make}_set=no;;
-esac
-rm -f conftest.make
-fi
-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-  SET_MAKE=
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-  SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
-else
-  am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  am__isrc=' -I$(srcdir)'
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-
-
-# Define the identity of the package.
- PACKAGE='cloog'
- VERSION='0.17.0'
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE "$PACKAGE"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define VERSION "$VERSION"
-_ACEOF
-
-# Some tools Automake needs.
-
-ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
-
-
-AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
-
-
-AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
-
-
-AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
-
-
-MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
-
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-# Always define AMTAR for backward compatibility.
-
-AMTAR=${AMTAR-"${am_missing_run}tar"}
-
-am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
-
-
-
-
-
-# Check whether --enable-silent-rules was given.
-if test "${enable_silent_rules+set}" = set; then :
-  enableval=$enable_silent_rules;
-fi
-
-case $enable_silent_rules in
-yes) AM_DEFAULT_VERBOSITY=0;;
-no)  AM_DEFAULT_VERBOSITY=1;;
-*)   AM_DEFAULT_VERBOSITY=0;;
-esac
-AM_BACKSLASH='\'
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
-          if test -n "$ac_tool_prefix"; then
-    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  fi
-fi
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_CC="cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
-  fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl.exe
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$CC" && break
-  done
-fi
-if test -z "$CC"; then
-  ac_ct_CC=$CC
-  for ac_prog in cl.exe
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_CC" && break
-done
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-fi
-
-fi
-
-
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5 ; }
-
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
-  { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    sed '10a\
-... rest of stderr output deleted ...
-         10q' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-  fi
-  rm -f conftest.er1 conftest.err
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-done
-
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-
-# The possible output files:
-ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
-
-ac_rmfiles=
-for ac_file in $ac_files
-do
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
-  esac
-done
-rm -f $ac_rmfiles
-
-if { { ac_try="$ac_link_default"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link_default") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
-# in a Makefile.  We should not override ac_cv_exeext if it was cached,
-# so that the user can short-circuit this test for compilers unknown to
-# Autoconf.
-for ac_file in $ac_files ''
-do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
-	;;
-    [ab].out )
-	# We found the default executable, but exeext='' is most
-	# certainly right.
-	break;;
-    *.* )
-	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
-	then :; else
-	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	fi
-	# We set ac_cv_exeext here because the later test for it is not
-	# safe: cross compilers may not add the suffix if given an `-o'
-	# argument, so we may need to know it at that point already.
-	# Even if this section looks crufty: it has the advantage of
-	# actually working.
-	break;;
-    * )
-	break;;
-  esac
-done
-test "$ac_cv_exeext" = no && ac_cv_exeext=
-
-else
-  ac_file=''
-fi
-if test -z "$ac_file"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "C compiler cannot create executables
-See \`config.log' for more details" "$LINENO" 5 ; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
-ac_exeext=$ac_cv_exeext
-
-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
-if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	  break;;
-    * ) break;;
-  esac
-done
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details" "$LINENO" 5 ; }
-fi
-rm -f conftest conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-FILE *f = fopen ("conftest.out", "w");
- return ferror (f) || fclose (f) != 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files="$ac_clean_files conftest.out"
-# Check that the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
-if test "$cross_compiling" != yes; then
-  { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-  if { ac_try='./conftest$ac_cv_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then
-    cross_compiling=no
-  else
-    if test "$cross_compiling" = maybe; then
-	cross_compiling=yes
-    else
-	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details" "$LINENO" 5 ; }
-    fi
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
-
-rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if test "${ac_cv_objext+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  for ac_file in conftest.o conftest.obj conftest.*; do
-  test -f "$ac_file" || continue;
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
-    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
-       break;;
-  esac
-done
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details" "$LINENO" 5 ; }
-fi
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if test "${ac_cv_c_compiler_gnu+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_compiler_gnu=yes
-else
-  ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
-  GCC=yes
-else
-  GCC=
-fi
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if test "${ac_cv_prog_cc_g+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_save_c_werror_flag=$ac_c_werror_flag
-   ac_c_werror_flag=yes
-   ac_cv_prog_cc_g=no
-   CFLAGS="-g"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-else
-  CFLAGS=""
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  ac_c_werror_flag=$ac_save_c_werror_flag
-	 CFLAGS="-g"
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if test "${ac_cv_prog_cc_c89+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
-     char **p;
-     int i;
-{
-  return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
-  char *s;
-  va_list v;
-  va_start (v,p);
-  s = g (p, va_arg (v,int));
-  va_end (v);
-  return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
-   function prototypes and stuff, but not '\xHH' hex character constants.
-   These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std is added to get
-   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
-   array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std.  */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
-   inside strings and character constants.  */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
-  ;
-  return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
-	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_c89=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
-  test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
-  x)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
-  xno)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
-  *)
-    CC="$CC $ac_cv_prog_cc_c89"
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
-
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-DEPDIR="${am__leading_dot}deps"
-
-ac_config_commands="$ac_config_commands depfiles"
-
-
-am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-	@echo this is the am__doit target
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
-$as_echo_n "checking for style of include used by $am_make... " >&6; }
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
-  am__include=include
-  am__quote=
-  _am_result=GNU
-  ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   case `$am_make -s -f confmf 2> /dev/null` in #(
-   *the\ am__doit\ target*)
-     am__include=.include
-     am__quote="\""
-     _am_result=BSD
-     ;;
-   esac
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
-$as_echo "$_am_result" >&6; }
-rm -f confinc confmf
-
-# Check whether --enable-dependency-tracking was given.
-if test "${enable_dependency_tracking+set}" = set; then :
-  enableval=$enable_dependency_tracking;
-fi
-
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-fi
- if test "x$enable_dependency_tracking" != xno; then
-  AMDEP_TRUE=
-  AMDEP_FALSE='#'
-else
-  AMDEP_TRUE='#'
-  AMDEP_FALSE=
-fi
-
-
-
-depcc="$CC"   am_compiler_list=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_CC_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  am__universal=false
-  case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CC_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CC_dependencies_compiler_type=none
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
-CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
-
- if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
-  am__fastdepCC_TRUE=
-  am__fastdepCC_FALSE='#'
-else
-  am__fastdepCC_TRUE='#'
-  am__fastdepCC_FALSE=
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
-$as_echo_n "checking whether ln -s works... " >&6; }
-LN_S=$as_ln_s
-if test "$LN_S" = "ln -s"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
-$as_echo "no, using $LN_S" >&6; }
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
-set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.make <<\_ACEOF
-SHELL = /bin/sh
-all:
-	@echo '@@@%%%=$(MAKE)=@@@%%%'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
-case `${MAKE-make} -f conftest.make 2>/dev/null` in
-  *@@@%%%=?*=@@@%%%*)
-    eval ac_cv_prog_make_${ac_make}_set=yes;;
-  *)
-    eval ac_cv_prog_make_${ac_make}_set=no;;
-esac
-rm -f conftest.make
-fi
-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-  SET_MAKE=
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-  SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-# Extract the first word of "cd", so it can be a program name with args.
-set dummy cd; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CD"; then
-  ac_cv_prog_CD="$CD" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CD=""
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CD=$ac_cv_prog_CD
-if test -n "$CD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CD" >&5
-$as_echo "$CD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-
-case `pwd` in
-  *\ * | *\	*)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
-$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
-esac
-
-
-
-macro_version='2.2.6b'
-macro_revision='1.3017'
-
-
-
-
-
-
-
-
-
-
-
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if test "${ac_cv_build+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
-  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
-test "x$ac_build_alias" = x &&
-  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5 ;;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if test "${ac_cv_host+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "x$host_alias" = x; then
-  ac_cv_host=$ac_cv_build
-else
-  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
-    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
-case $ac_cv_host in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5 ;;
-esac
-host=$ac_cv_host
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_host
-shift
-host_cpu=$1
-host_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-host_os=$*
-IFS=$ac_save_IFS
-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
-$as_echo_n "checking for a sed that does not truncate output... " >&6; }
-if test "${ac_cv_path_SED+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
-     for ac_i in 1 2 3 4 5 6 7; do
-       ac_script="$ac_script$as_nl$ac_script"
-     done
-     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
-     { ac_script=; unset ac_script;}
-     if test -z "$SED"; then
-  ac_path_SED_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
-# Check for GNU ac_path_SED and select it if it is found.
-  # Check for GNU $ac_path_SED
-case `"$ac_path_SED" --version 2>&1` in
-*GNU*)
-  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo '' >> "conftest.nl"
-    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_SED_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_SED="$ac_path_SED"
-      ac_path_SED_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_SED_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_SED"; then
-    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
-  fi
-else
-  ac_cv_path_SED=$SED
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
-$as_echo "$ac_cv_path_SED" >&6; }
- SED="$ac_cv_path_SED"
-  rm -f conftest.sed
-
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if test "${ac_cv_path_GREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$GREP"; then
-  ac_path_GREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in grep ggrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
-# Check for GNU ac_path_GREP and select it if it is found.
-  # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'GREP' >> "conftest.nl"
-    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_GREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_GREP="$ac_path_GREP"
-      ac_path_GREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_GREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_GREP"; then
-    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if test "${ac_cv_path_EGREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
-   then ac_cv_path_EGREP="$GREP -E"
-   else
-     if test -z "$EGREP"; then
-  ac_path_EGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in egrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
-  # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'EGREP' >> "conftest.nl"
-    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_EGREP="$ac_path_EGREP"
-      ac_path_EGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_EGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_EGREP"; then
-    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_EGREP=$EGREP
-fi
-
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
-$as_echo_n "checking for fgrep... " >&6; }
-if test "${ac_cv_path_FGREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
-   then ac_cv_path_FGREP="$GREP -F"
-   else
-     if test -z "$FGREP"; then
-  ac_path_FGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in fgrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
-# Check for GNU ac_path_FGREP and select it if it is found.
-  # Check for GNU $ac_path_FGREP
-case `"$ac_path_FGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'FGREP' >> "conftest.nl"
-    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_FGREP="$ac_path_FGREP"
-      ac_path_FGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_FGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_FGREP"; then
-    as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_FGREP=$FGREP
-fi
-
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
-$as_echo "$ac_cv_path_FGREP" >&6; }
- FGREP="$ac_cv_path_FGREP"
-
-
-test -z "$GREP" && GREP=grep
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | ?:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if test "${lt_cv_path_LD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if test "${lt_cv_prog_gnu_ld+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
-$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
-if test "${lt_cv_path_NM+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  : ${lt_cv_path_NM=no}
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
-$as_echo "$lt_cv_path_NM" >&6; }
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
-else
-  # Didn't find any BSD compatible name lister, look for dumpbin.
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in "dumpbin -symbols" "link -dump -symbols"
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_DUMPBIN+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DUMPBIN"; then
-  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DUMPBIN=$ac_cv_prog_DUMPBIN
-if test -n "$DUMPBIN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
-$as_echo "$DUMPBIN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$DUMPBIN" && break
-  done
-fi
-if test -z "$DUMPBIN"; then
-  ac_ct_DUMPBIN=$DUMPBIN
-  for ac_prog in "dumpbin -symbols" "link -dump -symbols"
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DUMPBIN"; then
-  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
-if test -n "$ac_ct_DUMPBIN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
-$as_echo "$ac_ct_DUMPBIN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_DUMPBIN" && break
-done
-
-  if test "x$ac_ct_DUMPBIN" = x; then
-    DUMPBIN=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DUMPBIN=$ac_ct_DUMPBIN
-  fi
-fi
-
-
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
-  fi
-fi
-test -z "$NM" && NM=nm
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
-$as_echo_n "checking the name lister ($NM) interface... " >&6; }
-if test "${lt_cv_nm_interface+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_nm_interface="BSD nm"
-  echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:4747: $ac_compile\"" >&5)
-  (eval "$ac_compile" 2>conftest.err)
-  cat conftest.err >&5
-  (eval echo "\"\$as_me:4750: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
-  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
-  cat conftest.err >&5
-  (eval echo "\"\$as_me:4753: output\"" >&5)
-  cat conftest.out >&5
-  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
-    lt_cv_nm_interface="MS dumpbin"
-  fi
-  rm -f conftest*
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
-$as_echo "$lt_cv_nm_interface" >&6; }
-
-# find the maximum length of command line arguments
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
-$as_echo_n "checking the maximum length of command line arguments... " >&6; }
-if test "${lt_cv_sys_max_cmd_len+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-    i=0
-  teststring="ABCD"
-
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
-
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
-
-  cygwin* | mingw* | cegcc*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
-
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
-
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    else
-      # Make teststring a little bigger before we do anything with it.
-      # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
-        teststring=$teststring$teststring
-      done
-      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-      # If test is not a shell built-in, we'll probably end up computing a
-      # maximum length that is only half of the actual maximum length, but
-      # we can't tell.
-      while { test "X"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
-	         = "XX$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
-      do
-        i=`expr $i + 1`
-        teststring=$teststring$teststring
-      done
-      # Only check the string length outside the loop.
-      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
-      teststring=
-      # Add a significant safety factor because C++ compilers can tack on
-      # massive amounts of additional arguments before passing them to the
-      # linker.  It appears as though 1/2 is a usable value.
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    fi
-    ;;
-  esac
-
-fi
-
-if test -n $lt_cv_sys_max_cmd_len ; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
-$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
-$as_echo "none" >&6; }
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-
-
-
-
-
-
-: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
-$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
-$as_echo "$xsi_shell" >&6; }
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
-$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
-$as_echo "$lt_shell_append" >&6; }
-
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  lt_unset=unset
-else
-  lt_unset=false
-fi
-
-
-
-
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  lt_SP2NL='tr \040 \012'
-  lt_NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  lt_SP2NL='tr \100 \n'
-  lt_NL2SP='tr \r\n \100\100'
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
-$as_echo_n "checking for $LD option to reload object files... " >&6; }
-if test "${lt_cv_ld_reload_flag+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_reload_flag='-r'
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
-$as_echo "$lt_cv_ld_reload_flag" >&6; }
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
-set dummy ${ac_tool_prefix}objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OBJDUMP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OBJDUMP"; then
-  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OBJDUMP=$ac_cv_prog_OBJDUMP
-if test -n "$OBJDUMP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
-$as_echo "$OBJDUMP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OBJDUMP"; then
-  ac_ct_OBJDUMP=$OBJDUMP
-  # Extract the first word of "objdump", so it can be a program name with args.
-set dummy objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OBJDUMP"; then
-  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OBJDUMP="objdump"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
-if test -n "$ac_ct_OBJDUMP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
-$as_echo "$ac_ct_OBJDUMP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OBJDUMP" = x; then
-    OBJDUMP="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OBJDUMP=$ac_ct_OBJDUMP
-  fi
-else
-  OBJDUMP="$ac_cv_prog_OBJDUMP"
-fi
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
-$as_echo_n "checking how to recognize dependent libraries... " >&6; }
-if test "${lt_cv_deplibs_check_method+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[4-9]*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[45]*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump',
-  # unless we find 'file', for example because we are cross-compiling.
-  if ( file / ) >/dev/null 2>&1; then
-    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-    lt_cv_file_magic_cmd='func_win32_libid'
-  else
-    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
-    lt_cv_file_magic_cmd='$OBJDUMP -f'
-  fi
-  ;;
-
-cegcc)
-  # use the weaker test based on 'objdump'. See mingw*.
-  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
-
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-freebsd* | dragonfly*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
-
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
-
-interix[3-9]*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd* | netbsdelf*-gnu)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
-  fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-*nto* | *qnx*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-rdos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-tpf*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
-$as_echo "$lt_cv_deplibs_check_method" >&6; }
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_AR+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$AR"; then
-  ac_cv_prog_AR="$AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_AR="${ac_tool_prefix}ar"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-AR=$ac_cv_prog_AR
-if test -n "$AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
-$as_echo "$AR" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_AR"; then
-  ac_ct_AR=$AR
-  # Extract the first word of "ar", so it can be a program name with args.
-set dummy ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_AR+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_AR"; then
-  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_AR="ar"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_AR=$ac_cv_prog_ac_ct_AR
-if test -n "$ac_ct_AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
-$as_echo "$ac_ct_AR" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_AR" = x; then
-    AR="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    AR=$ac_ct_AR
-  fi
-else
-  AR="$ac_cv_prog_AR"
-fi
-
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-
-
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-test -z "$STRIP" && STRIP=:
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_RANLIB+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
-  ac_ct_RANLIB=$RANLIB
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_RANLIB"; then
-  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_RANLIB="ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_RANLIB" = x; then
-    RANLIB=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    RANLIB=$ac_ct_RANLIB
-  fi
-else
-  RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-test -z "$RANLIB" && RANLIB=:
-
-
-
-
-
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
-$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
-if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[BCDEGRST]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[BCDT]'
-  ;;
-cygwin* | mingw* | pw32* | cegcc*)
-  symcode='[ABCDGISTW]'
-  ;;
-hpux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[ABCDEGRST]'
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[BCDEGRST]'
-  ;;
-osf*)
-  symcode='[BCDEGQRST]'
-  ;;
-solaris*)
-  symcode='[BDRT]'
-  ;;
-sco3.2v5*)
-  symcode='[DT]'
-  ;;
-sysv4.2uw2*)
-  symcode='[DT]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[ABDT]'
-  ;;
-sysv4)
-  symcode='[DFNSTU]'
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[ABCDGIRSTW]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
-    # Also find C++ and __fastcall symbols from MSVC++,
-    # which start with @ or ?.
-    lt_cv_sys_global_symbol_pipe="$AWK '"\
-"     {last_section=section; section=\$ 3};"\
-"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-"     \$ 0!~/External *\|/{next};"\
-"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-"     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-"     ' prfx=^$ac_symprfx"
-  else
-    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-  fi
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\""; } >&5
-  (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
-	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<_LT_EOF > conftest.$ac_ext
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
-	  cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols.  */
-const struct {
-  const char *name;
-  void       *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[] =
-{
-  { "@PROGRAM@", (void *) 0 },
-_LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
-	  cat <<\_LT_EOF >> conftest.$ac_ext
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_save_LIBS="$LIBS"
-	  lt_save_CFLAGS="$CFLAGS"
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS="$lt_save_LIBS"
-	  CFLAGS="$lt_save_CFLAGS"
-	else
-	  echo "cannot find nm_test_func in $nlist" >&5
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&5
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
-    fi
-  else
-    echo "$progname: failed program was:" >&5
-    cat conftest.$ac_ext >&5
-  fi
-  rm -rf conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-
-fi
-
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
-$as_echo "failed" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
-$as_echo "ok" >&6; }
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Check whether --enable-libtool-lock was given.
-if test "${enable_libtool_lock+set}" = set; then :
-  enableval=$enable_libtool_lock;
-fi
-
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.$ac_objext` in
-      *ELF-32*)
-	HPUX_IA64_MODE="32"
-	;;
-      *ELF-64*)
-	HPUX_IA64_MODE="64"
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '#line 5948 "configure"' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -melf32bsmip"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -melf32bmipn32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -melf64bmip"
-	;;
-      esac
-    else
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -32"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -n32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -64"
-	  ;;
-      esac
-    fi
-  fi
-  rm -rf conftest*
-  ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.o` in
-      *32-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_i386_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_i386"
-	    ;;
-	  ppc64-*linux*|powerpc64-*linux*)
-	    LD="${LD-ld} -m elf32ppclinux"
-	    ;;
-	  s390x-*linux*)
-	    LD="${LD-ld} -m elf_s390"
-	    ;;
-	  sparc64-*linux*)
-	    LD="${LD-ld} -m elf32_sparc"
-	    ;;
-	esac
-	;;
-      *64-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_x86_64_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_x86_64"
-	    ;;
-	  ppc*-*linux*|powerpc*-*linux*)
-	    LD="${LD-ld} -m elf64ppc"
-	    ;;
-	  s390*-*linux*|s390*-*tpf*)
-	    LD="${LD-ld} -m elf64_s390"
-	    ;;
-	  sparc*-*linux*)
-	    LD="${LD-ld} -m elf64_sparc"
-	    ;;
-	esac
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
-$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
-if test "${lt_cv_cc_needs_belf+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_cc_needs_belf=yes
-else
-  lt_cv_cc_needs_belf=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-     ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
-$as_echo "$lt_cv_cc_needs_belf" >&6; }
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-sparc*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
-      *)
-	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
-	  LD="${LD-ld} -64"
-	fi
-	;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-esac
-
-need_locks="$enable_libtool_lock"
-
-
-  case $host_os in
-    rhapsody* | darwin*)
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
-set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_DSYMUTIL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DSYMUTIL"; then
-  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DSYMUTIL=$ac_cv_prog_DSYMUTIL
-if test -n "$DSYMUTIL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
-$as_echo "$DSYMUTIL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_DSYMUTIL"; then
-  ac_ct_DSYMUTIL=$DSYMUTIL
-  # Extract the first word of "dsymutil", so it can be a program name with args.
-set dummy dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DSYMUTIL"; then
-  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
-if test -n "$ac_ct_DSYMUTIL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
-$as_echo "$ac_ct_DSYMUTIL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_DSYMUTIL" = x; then
-    DSYMUTIL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DSYMUTIL=$ac_ct_DSYMUTIL
-  fi
-else
-  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
-set dummy ${ac_tool_prefix}nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_NMEDIT+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$NMEDIT"; then
-  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-NMEDIT=$ac_cv_prog_NMEDIT
-if test -n "$NMEDIT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
-$as_echo "$NMEDIT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_NMEDIT"; then
-  ac_ct_NMEDIT=$NMEDIT
-  # Extract the first word of "nmedit", so it can be a program name with args.
-set dummy nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_NMEDIT"; then
-  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_NMEDIT="nmedit"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
-if test -n "$ac_ct_NMEDIT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
-$as_echo "$ac_ct_NMEDIT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_NMEDIT" = x; then
-    NMEDIT=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    NMEDIT=$ac_ct_NMEDIT
-  fi
-else
-  NMEDIT="$ac_cv_prog_NMEDIT"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
-set dummy ${ac_tool_prefix}lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_LIPO+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$LIPO"; then
-  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-LIPO=$ac_cv_prog_LIPO
-if test -n "$LIPO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
-$as_echo "$LIPO" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_LIPO"; then
-  ac_ct_LIPO=$LIPO
-  # Extract the first word of "lipo", so it can be a program name with args.
-set dummy lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_LIPO"; then
-  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_LIPO="lipo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
-if test -n "$ac_ct_LIPO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
-$as_echo "$ac_ct_LIPO" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_LIPO" = x; then
-    LIPO=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    LIPO=$ac_ct_LIPO
-  fi
-else
-  LIPO="$ac_cv_prog_LIPO"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OTOOL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OTOOL"; then
-  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL=$ac_cv_prog_OTOOL
-if test -n "$OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
-$as_echo "$OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL"; then
-  ac_ct_OTOOL=$OTOOL
-  # Extract the first word of "otool", so it can be a program name with args.
-set dummy otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OTOOL"; then
-  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OTOOL="otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
-if test -n "$ac_ct_OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
-$as_echo "$ac_ct_OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OTOOL" = x; then
-    OTOOL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OTOOL=$ac_ct_OTOOL
-  fi
-else
-  OTOOL="$ac_cv_prog_OTOOL"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OTOOL64+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OTOOL64"; then
-  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL64=$ac_cv_prog_OTOOL64
-if test -n "$OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
-$as_echo "$OTOOL64" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL64"; then
-  ac_ct_OTOOL64=$OTOOL64
-  # Extract the first word of "otool64", so it can be a program name with args.
-set dummy otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OTOOL64"; then
-  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OTOOL64="otool64"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
-if test -n "$ac_ct_OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
-$as_echo "$ac_ct_OTOOL64" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OTOOL64" = x; then
-    OTOOL64=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OTOOL64=$ac_ct_OTOOL64
-  fi
-else
-  OTOOL64="$ac_cv_prog_OTOOL64"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
-$as_echo_n "checking for -single_module linker flag... " >&6; }
-if test "${lt_cv_apple_cc_single_mod+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
-	# By default we will add the -single_module flag. You can override
-	# by either setting the environment variable LT_MULTI_MODULE
-	# non-empty at configure time, or by adding -multi_module to the
-	# link flags.
-	rm -rf libconftest.dylib*
-	echo "int foo(void){return 1;}" > conftest.c
-	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&5
-	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
-        _lt_result=$?
-	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
-	  lt_cv_apple_cc_single_mod=yes
-	else
-	  cat conftest.err >&5
-	fi
-	rm -rf libconftest.dylib*
-	rm -f conftest.*
-      fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
-$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
-$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
-if test "${lt_cv_ld_exported_symbols_list+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_exported_symbols_list=no
-      save_LDFLAGS=$LDFLAGS
-      echo "_main" > conftest.sym
-      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_ld_exported_symbols_list=yes
-else
-  lt_cv_ld_exported_symbols_list=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-	LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
-$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
-    case $host_os in
-    rhapsody* | darwin1.[012])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-    darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-    darwin*) # darwin 5.x on
-      # if running on 10.5 or later, the deployment target defaults
-      # to the OS version, if on x86, and 10.4, the deployment
-      # target defaults to 10.4. Don't you love it?
-      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[012]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-      esac
-    ;;
-  esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-      _lt_dar_single_mod='$single_module'
-    fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-    else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    fi
-    if test "$DSYMUTIL" != ":"; then
-      _lt_dsymutil='~$DSYMUTIL $lib || :'
-    else
-      _lt_dsymutil=
-    fi
-    ;;
-  esac
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-  if test "${ac_cv_prog_CPP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-      # Double quotes because CPP needs to be expanded
-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-  break
-fi
-
-    done
-    ac_cv_prog_CPP=$CPP
-
-fi
-  CPP=$ac_cv_prog_CPP
-else
-  ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5 ; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if test "${ac_cv_header_stdc+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_stdc=yes
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      return 2;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
-		  inttypes.h stdint.h unistd.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in dlfcn.h
-do :
-  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
-"
-if test "x$ac_cv_header_dlfcn_h" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DLFCN_H 1
-_ACEOF
-
-fi
-
-done
-
-
-
-# Set options
-
-
-
-        enable_dlopen=no
-
-
-  enable_win32_dll=no
-
-
-            # Check whether --enable-shared was given.
-if test "${enable_shared+set}" = set; then :
-  enableval=$enable_shared; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_shared=yes
-fi
-
-
-
-
-
-
-
-
-
-  # Check whether --enable-static was given.
-if test "${enable_static+set}" = set; then :
-  enableval=$enable_static; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_static=yes
-fi
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-pic was given.
-if test "${with_pic+set}" = set; then :
-  withval=$with_pic; pic_mode="$withval"
-else
-  pic_mode=default
-fi
-
-
-test -z "$pic_mode" && pic_mode=default
-
-
-
-
-
-
-
-  # Check whether --enable-fast-install was given.
-if test "${enable_fast_install+set}" = set; then :
-  enableval=$enable_fast_install; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_fast_install=yes
-fi
-
-
-
-
-
-
-
-
-
-
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-test -z "$LN_S" && LN_S="ln -s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
-$as_echo_n "checking for objdir... " >&6; }
-if test "${lt_cv_objdir+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
-$as_echo "$lt_cv_objdir" >&6; }
-objdir=$lt_cv_objdir
-
-
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define LT_OBJDIR "$lt_cv_objdir/"
-_ACEOF
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
-
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
-$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/${ac_tool_prefix}file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-
-
-
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
-$as_echo_n "checking for file... " >&6; }
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  else
-    MAGIC_CMD=:
-  fi
-fi
-
-  fi
-  ;;
-esac
-
-# Use C for the default configuration in the libtool script
-
-lt_save_CC="$CC"
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-objext=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-
-lt_prog_compiler_no_builtin_flag=
-
-if test "$GCC" = yes; then
-  lt_prog_compiler_no_builtin_flag=' -fno-builtin'
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
-if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_rtti_exceptions=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="-fno-rtti -fno-exceptions"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:7477: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:7481: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_rtti_exceptions=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
-$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
-
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
-    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
-else
-    :
-fi
-
-fi
-
-
-
-
-
-
-  lt_prog_compiler_wl=
-lt_prog_compiler_pic=
-lt_prog_compiler_static=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-
-  if test "$GCC" = yes; then
-    lt_prog_compiler_wl='-Wl,'
-    lt_prog_compiler_static='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            lt_prog_compiler_pic='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic='-fno-common'
-      ;;
-
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='-fPIC'
-	;;
-      esac
-      ;;
-
-    interix[3-9]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      lt_prog_compiler_can_build_shared=no
-      enable_shared=no
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic='-fPIC -shared'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic=-Kconform_pic
-      fi
-      ;;
-
-    *)
-      lt_prog_compiler_pic='-fPIC'
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      lt_prog_compiler_wl='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      else
-	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC (with -KPIC) is the default.
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
-      case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
-      ecc*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-KPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      # icc used to be incompatible with GCC.
-      # ICC 10 doesn't accept -KPIC any more.
-      icc* | ifort*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      # Lahey Fortran 8.1.
-      lf95*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='--shared'
-	lt_prog_compiler_static='--static'
-	;;
-      pgcc* | pgf77* | pgf90* | pgf95*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fpic'
-	lt_prog_compiler_static='-Bstatic'
-        ;;
-      ccc*)
-        lt_prog_compiler_wl='-Wl,'
-        # All Alpha code is PIC.
-        lt_prog_compiler_static='-non_shared'
-        ;;
-      xl*)
-	# IBM XL C 8.0/Fortran 10.1 on PPC
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-qpic'
-	lt_prog_compiler_static='-qstaticlink'
-	;;
-      *)
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)
-	  # Sun C 5.9
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl='-Wl,'
-	  ;;
-	*Sun\ F*)
-	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl=''
-	  ;;
-	esac
-	;;
-      esac
-      ;;
-
-    newsos6)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic='-fPIC -shared'
-      ;;
-
-    osf3* | osf4* | osf5*)
-      lt_prog_compiler_wl='-Wl,'
-      # All OSF/1 code is PIC.
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    rdos*)
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    solaris*)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95*)
-	lt_prog_compiler_wl='-Qoption ld ';;
-      *)
-	lt_prog_compiler_wl='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      lt_prog_compiler_wl='-Qoption ld '
-      lt_prog_compiler_pic='-PIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	lt_prog_compiler_pic='-Kconform_pic'
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    unicos*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_can_build_shared=no
-      ;;
-
-    uts4*)
-      lt_prog_compiler_pic='-pic'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    *)
-      lt_prog_compiler_can_build_shared=no
-      ;;
-    esac
-  fi
-
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic=
-    ;;
-  *)
-    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
-    ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5
-$as_echo "$lt_prog_compiler_pic" >&6; }
-
-
-
-
-
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
-if test "${lt_cv_prog_compiler_pic_works+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_pic_works=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:7816: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:7820: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_pic_works=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
-    case $lt_prog_compiler_pic in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
-     esac
-else
-    lt_prog_compiler_pic=
-     lt_prog_compiler_can_build_shared=no
-fi
-
-fi
-
-
-
-
-
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if test "${lt_cv_prog_compiler_static_works+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_static_works=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler_static_works=yes
-       fi
-     else
-       lt_cv_prog_compiler_static_works=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
-$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_static_works" = xyes; then
-    :
-else
-    lt_prog_compiler_static=
-fi
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:7921: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:7925: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:7976: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:7980: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-
-  runpath_var=
-  allow_undefined_flag=
-  always_export_symbols=no
-  archive_cmds=
-  archive_expsym_cmds=
-  compiler_needs_object=no
-  enable_shared_with_static_runtimes=no
-  export_dynamic_flag_spec=
-  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  hardcode_automatic=no
-  hardcode_direct=no
-  hardcode_direct_absolute=no
-  hardcode_libdir_flag_spec=
-  hardcode_libdir_flag_spec_ld=
-  hardcode_libdir_separator=
-  hardcode_minus_L=no
-  hardcode_shlibpath_var=unsupported
-  inherit_rpath=no
-  link_all_deplibs=unknown
-  module_cmds=
-  module_expsym_cmds=
-  old_archive_from_new_cmds=
-  old_archive_from_expsyms_cmds=
-  thread_safe_flag_spec=
-  whole_archive_flag_spec=
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  include_expsyms=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  # Exclude shared library initialization/finalization symbols.
-  extract_expsyms_cmds=
-
-  case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  linux* | k*bsd*-gnu)
-    link_all_deplibs=no
-    ;;
-  esac
-
-  ld_shlibs=yes
-  if test "$with_gnu_ld" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-    export_dynamic_flag_spec='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      whole_archive_flag_spec=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>&1` in
-      *GNU\ gold*) supports_anon_versioning=yes ;;
-      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[3-9]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
-
-_LT_EOF
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds=''
-        ;;
-      m68k)
-            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_minus_L=yes
-        ;;
-      esac
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	allow_undefined_flag=unsupported
-	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
-      # as there is no search path for DLLs.
-      hardcode_libdir_flag_spec='-L$libdir'
-      allow_undefined_flag=unsupported
-      always_export_symbols=no
-      enable_shared_with_static_runtimes=yes
-      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
-
-      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    interix[3-9]*)
-      hardcode_direct=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
-	case $cc_basename in
-	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
-	esac
-      fi
-      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
-      then
-	tmp_addflag=
-	tmp_sharedflag='-shared'
-	case $cc_basename,$host_cpu in
-        pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	lf95*)				# Lahey Fortran 8.1
-	  whole_archive_flag_spec=
-	  tmp_sharedflag='--shared' ;;
-	xl[cC]*)			# IBM XL C 8.0 on PPC (deal with xlf below)
-	  tmp_sharedflag='-qmkshrobj'
-	  tmp_addflag= ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object=yes
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	esac
-	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-        if test "x$supports_anon_versioning" = xyes; then
-          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-        fi
-
-	case $cc_basename in
-	xlf*)
-	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
-	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
-	  hardcode_libdir_flag_spec=
-	  hardcode_libdir_flag_spec_ld='-rpath $libdir'
-	  archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
-	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
-	  fi
-	  ;;
-	esac
-      else
-        ld_shlibs=no
-      fi
-      ;;
-
-    netbsd* | netbsdelf*-gnu)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  # For security reasons, it is highly recommended that you always
-	  # use absolute paths for naming shared libraries, and exclude the
-	  # DT_RUNPATH tag from executables and libraries.  But doing so
-	  # requires that you compile everything twice, which is a pain.
-	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  else
-	    ld_shlibs=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-    esac
-
-    if test "$ld_shlibs" = no; then
-      runpath_var=
-      hardcode_libdir_flag_spec=
-      export_dynamic_flag_spec=
-      whole_archive_flag_spec=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      allow_undefined_flag=unsupported
-      always_export_symbols=yes
-      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      hardcode_minus_L=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	hardcode_direct=unsupported
-      fi
-      ;;
-
-    aix[4-9]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	else
-	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
-	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-	    aix_use_runtimelinking=yes
-	    break
-	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      archive_cmds=''
-      hardcode_direct=yes
-      hardcode_direct_absolute=yes
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      file_list_spec='${wl}-f,'
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[012]|aix4.[012].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	  # We have reworked collect2
-	  :
-	  else
-	  # We have old collect2
-	  hardcode_direct=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  hardcode_minus_L=yes
-	  hardcode_libdir_flag_spec='-L$libdir'
-	  hardcode_libdir_separator=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-	link_all_deplibs=no
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      export_dynamic_flag_spec='${wl}-bexpall'
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      always_export_symbols=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	allow_undefined_flag='-berok'
-        # Determine the default libpath from the value encoded in an
-        # empty executable.
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-      else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
-	  allow_undefined_flag="-z nodefs"
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an
-	 # empty executable.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag=' ${wl}-bernotok'
-	  allow_undefined_flag=' ${wl}-berok'
-	  # Exported symbols can be pulled into shared objects from archives
-	  whole_archive_flag_spec='$convenience'
-	  archive_cmds_need_lc=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds=''
-        ;;
-      m68k)
-            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_minus_L=yes
-        ;;
-      esac
-      ;;
-
-    bsdi[45]*)
-      export_dynamic_flag_spec=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      hardcode_libdir_flag_spec=' '
-      allow_undefined_flag=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      old_archive_from_new_cmds='true'
-      # FIXME: Should let the user specify the lib program.
-      old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
-      fix_srcfile_path='`cygpath -w "$srcfile"`'
-      enable_shared_with_static_runtimes=yes
-      ;;
-
-    darwin* | rhapsody*)
-
-
-  archive_cmds_need_lc=no
-  hardcode_direct=no
-  hardcode_automatic=yes
-  hardcode_shlibpath_var=unsupported
-  whole_archive_flag_spec=''
-  link_all_deplibs=yes
-  allow_undefined_flag="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=echo
-    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-
-  else
-  ld_shlibs=no
-  fi
-
-      ;;
-
-    dgux*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
-
-    freebsd1*)
-      ld_shlibs=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_direct=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      hardcode_minus_L=yes
-      export_dynamic_flag_spec='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_flag_spec_ld='+b $libdir'
-	hardcode_libdir_separator=:
-	hardcode_direct=yes
-	hardcode_direct_absolute=yes
-	export_dynamic_flag_spec='${wl}-E'
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	hardcode_minus_L=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  hardcode_direct=no
-	  hardcode_shlibpath_var=no
-	  ;;
-	*)
-	  hardcode_direct=yes
-	  hardcode_direct_absolute=yes
-	  export_dynamic_flag_spec='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  hardcode_minus_L=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	# Try to use the -exported_symbol ld option, if it does not
-	# work, assume that -exports_file does not work either and
-	# implicitly export all symbols.
-        save_LDFLAGS="$LDFLAGS"
-        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-int foo(void) {}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-        LDFLAGS="$save_LDFLAGS"
-      else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      inherit_rpath=yes
-      link_all_deplibs=yes
-      ;;
-
-    netbsd* | netbsdelf*-gnu)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    newsos6)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_shlibpath_var=no
-      ;;
-
-    *nto* | *qnx*)
-      ;;
-
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	hardcode_direct=yes
-	hardcode_shlibpath_var=no
-	hardcode_direct_absolute=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	  export_dynamic_flag_spec='${wl}-E'
-	else
-	  case $host_os in
-	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     hardcode_libdir_flag_spec='-R$libdir'
-	     ;;
-	   *)
-	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-	fi
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    os2*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_minus_L=yes
-      allow_undefined_flag=unsupported
-      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	hardcode_libdir_flag_spec='-rpath $libdir'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_separator=:
-      ;;
-
-    solaris*)
-      no_undefined_flag=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-      else
-	case `$CC -V 2>&1` in
-	*"Compilers 5.0"*)
-	  wlarc=''
-	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
-	  ;;
-	*)
-	  wlarc='${wl}'
-	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-	  ;;
-	esac
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_shlibpath_var=no
-      case $host_os in
-      solaris2.[0-5] | solaris2.[0-5].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
-	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      link_all_deplibs=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  reload_cmds='$CC -r -o $output$reload_objs'
-	  hardcode_direct=no
-        ;;
-	motorola)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      hardcode_shlibpath_var=no
-      ;;
-
-    sysv4.3*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_shlibpath_var=no
-      export_dynamic_flag_spec='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	hardcode_shlibpath_var=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	ld_shlibs=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag='${wl}-z,text'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      no_undefined_flag='${wl}-z,text'
-      allow_undefined_flag='${wl}-z,nodefs'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-R,$libdir'
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      export_dynamic_flag_spec='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
-
-    *)
-      ld_shlibs=no
-      ;;
-    esac
-
-    if test x$host_vendor = xsni; then
-      case $host in
-      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	export_dynamic_flag_spec='${wl}-Blargedynsym'
-	;;
-      esac
-    fi
-  fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
-$as_echo "$ld_shlibs" >&6; }
-test "$ld_shlibs" = no && can_build_shared=no
-
-with_gnu_ld=$with_gnu_ld
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-      $RM conftest*
-      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-      if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } 2>conftest.err; then
-        soname=conftest
-        lib=conftest
-        libobjs=conftest.$ac_objext
-        deplibs=
-        wl=$lt_prog_compiler_wl
-	pic_flag=$lt_prog_compiler_pic
-        compiler_flags=-v
-        linker_flags=-v
-        verstring=
-        output_objdir=.
-        libname=conftest
-        lt_save_allow_undefined_flag=$allow_undefined_flag
-        allow_undefined_flag=
-        if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
-  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-        then
-	  archive_cmds_need_lc=no
-        else
-	  archive_cmds_need_lc=yes
-        fi
-        allow_undefined_flag=$lt_save_allow_undefined_flag
-      else
-        cat conftest.err 1>&5
-      fi
-      $RM conftest*
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5
-$as_echo "$archive_cmds_need_lc" >&6; }
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
-
-if test "$GCC" = yes; then
-  case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
-  esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-  if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'`
-  else
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-  fi
-  # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
-  lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
-  for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
-      test -d "$lt_sys_path" && \
-	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
-    fi
-  done
-  lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
-  for (lt_i = NF; lt_i > 0; lt_i--) {
-    if ($lt_i != "" && $lt_i != ".") {
-      if ($lt_i == "..") {
-        lt_count++;
-      } else {
-        if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
-        } else {
-          lt_count--;
-        }
-      }
-    }
-  }
-  if (lt_foo != "") { lt_freq[lt_foo]++; }
-  if (lt_freq[lt_foo] == 1) { print lt_foo; }
-}'`
-  sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[4-9]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[45]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
-        # It is most probably a Windows format PATH printed by
-        # mingw gcc, but we are running on Cygwin. Gcc prints its search
-        # path with ; separators, and with drive letters. We can handle the
-        # drive letters (cygwin fileutils understands them), so leave them,
-        # especially as we might pass files found there to a mingw objdump,
-        # which wouldn't understand a cygwinified path. Ahh.
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
-
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-
-  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd1*)
-  dynamic_linker=no
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[123]*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555.
-  postinstall_cmds='chmod 555 $lib'
-  ;;
-
-interix[3-9]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  # Some binutils ld are patched to set DT_RUNPATH
-  save_LDFLAGS=$LDFLAGS
-  save_libdir=$libdir
-  eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
-       LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
-  shlibpath_overrides_runpath=yes
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  LDFLAGS=$save_LDFLAGS
-  libdir=$save_libdir
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsdelf*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='NetBSD ld.elf_so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
-hardcode_action=
-if test -n "$hardcode_libdir_flag_spec" ||
-   test -n "$runpath_var" ||
-   test "X$hardcode_automatic" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$hardcode_direct" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
-     test "$hardcode_minus_L" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action=unsupported
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
-$as_echo "$hardcode_action" >&6; }
-
-if test "$hardcode_action" = relink ||
-   test "$inherit_rpath" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-
-
-
-
-
-
-  if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-    ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-    ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-
-fi
-
-    ;;
-
-  *)
-    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
-if test "x$ac_cv_func_shl_load" = x""yes; then :
-  lt_cv_dlopen="shl_load"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
-$as_echo_n "checking for shl_load in -ldld... " >&6; }
-if test "${ac_cv_lib_dld_shl_load+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char shl_load ();
-int
-main ()
-{
-return shl_load ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dld_shl_load=yes
-else
-  ac_cv_lib_dld_shl_load=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
-$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
-if test "x$ac_cv_lib_dld_shl_load" = x""yes; then :
-  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
-else
-  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
-if test "x$ac_cv_func_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
-$as_echo_n "checking for dlopen in -lsvld... " >&6; }
-if test "${ac_cv_lib_svld_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsvld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_svld_dlopen=yes
-else
-  ac_cv_lib_svld_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
-$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
-if test "x$ac_cv_lib_svld_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
-$as_echo_n "checking for dld_link in -ldld... " >&6; }
-if test "${ac_cv_lib_dld_dld_link+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dld_link ();
-int
-main ()
-{
-return dld_link ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dld_dld_link=yes
-else
-  ac_cv_lib_dld_dld_link=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
-$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
-if test "x$ac_cv_lib_dld_dld_link" = x""yes; then :
-  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-    ;;
-  esac
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
-$as_echo_n "checking whether a program can dlopen itself... " >&6; }
-if test "${lt_cv_dlopen_self+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-#line 10360 "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-void fnord() { int i=42;}
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}
-_LT_EOF
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self=no
-  fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
-$as_echo "$lt_cv_dlopen_self" >&6; }
-
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
-$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
-if test "${lt_cv_dlopen_self_static+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self_static=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-#line 10456 "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-void fnord() { int i=42;}
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}
-_LT_EOF
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self_static=no
-  fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
-$as_echo "$lt_cv_dlopen_self_static" >&6; }
-    fi
-
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
-
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-striplib=
-old_striplib=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
-$as_echo_n "checking whether stripping libraries is possible... " >&6; }
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-  darwin*)
-    if test -n "$STRIP" ; then
-      striplib="$STRIP -x"
-      old_striplib="$STRIP -S"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-    else
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    fi
-    ;;
-  *)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    ;;
-  esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-  # Report which library types will actually be built
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
-$as_echo_n "checking if libtool supports shared libraries... " >&6; }
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
-$as_echo "$can_build_shared" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
-$as_echo_n "checking whether to build shared libraries... " >&6; }
-  test "$can_build_shared" = "no" && enable_shared=no
-
-  # On AIX, shared libraries and static libraries use the same namespace, and
-  # are all built from PIC.
-  case $host_os in
-  aix3*)
-    test "$enable_shared" = yes && enable_static=no
-    if test -n "$RANLIB"; then
-      archive_cmds="$archive_cmds~\$RANLIB \$lib"
-      postinstall_cmds='$RANLIB $lib'
-    fi
-    ;;
-
-  aix[4-9]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
-    fi
-    ;;
-  esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
-$as_echo "$enable_shared" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
-$as_echo_n "checking whether to build static libraries... " >&6; }
-  # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
-$as_echo "$enable_static" >&6; }
-
-
-
-
-fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-CC="$lt_save_CC"
-
-
-
-
-
-
-
-
-
-
-
-
-
-        ac_config_commands="$ac_config_commands libtool"
-
-
-
-
-# Only expand once:
-
-
-# Extract the first word of "texi2dvi", so it can be a program name with args.
-set dummy texi2dvi; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_TEXI2DVI+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$TEXI2DVI"; then
-  ac_cv_prog_TEXI2DVI="$TEXI2DVI" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_TEXI2DVI="texi2dvi"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-TEXI2DVI=$ac_cv_prog_TEXI2DVI
-if test -n "$TEXI2DVI"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEXI2DVI" >&5
-$as_echo "$TEXI2DVI" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- if test -n "$TEXI2DVI"; then
-  HAVE_TEXI2DVI_TRUE=
-  HAVE_TEXI2DVI_FALSE='#'
-else
-  HAVE_TEXI2DVI_TRUE='#'
-  HAVE_TEXI2DVI_FALSE=
-fi
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler vendor" >&5
-$as_echo_n "checking for C compiler vendor... " >&6; }
-if test "${ax_cv_c_compiler_vendor+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ax_cv_c_compiler_vendor=unknown
-  # note: don't check for gcc first since some other compilers define __GNUC__
-  for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale:__PATHCC__,__PATHSCALE__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do
-    vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")"
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-#if !($vencpp)
-      thisisanerror;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_c_compiler_vendor=`echo $ventest | cut -d: -f1`; break
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  done
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_vendor" >&5
-$as_echo "$ax_cv_c_compiler_vendor" >&6; }
-
-
-
-
-
-
-# Check whether --enable-portable-binary was given.
-if test "${enable_portable_binary+set}" = set; then :
-  enableval=$enable_portable_binary; acx_maxopt_portable=$withval
-else
-  acx_maxopt_portable=no
-fi
-
-
-# Try to determine "good" native compiler flags if none specified via CFLAGS
-if test "$ac_test_CFLAGS" != "set"; then
-  CFLAGS=""
-  case $ax_cv_c_compiler_vendor in
-    dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host"
-	 if test "x$acx_maxopt_portable" = xno; then
-           CFLAGS="$CFLAGS -arch host"
-         fi;;
-
-    sun) CFLAGS="-native -fast -xO5 -dalign"
-	 if test "x$acx_maxopt_portable" = xyes; then
-	   CFLAGS="$CFLAGS -xarch=generic"
-         fi;;
-
-    hp)  CFLAGS="+Oall +Optrs_ansi +DSnative"
-	 if test "x$acx_maxopt_portable" = xyes; then
-	   CFLAGS="$CFLAGS +DAportable"
-	 fi;;
-
-    ibm) if test "x$acx_maxopt_portable" = xno; then
-           xlc_opt="-qarch=auto -qtune=auto"
-	 else
-           xlc_opt="-qtune=auto"
-	 fi
-          { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $xlc_opt" >&5
-$as_echo_n "checking whether C compiler accepts $xlc_opt... " >&6; }
-ax_save_FLAGS=$CFLAGS
-   CFLAGS="$xlc_opt"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval `$as_echo "ax_cv_c_flags_$xlc_opt" | $as_tr_sh`=yes
-else
-  eval `$as_echo "ax_cv_c_flags_$xlc_opt" | $as_tr_sh`=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   CFLAGS=$ax_save_FLAGS
-eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$xlc_opt" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	CFLAGS="-O3 -qansialias -w $xlc_opt"
-else
-	CFLAGS="-O3 -qansialias -w"
-                echo "******************************************************"
-                echo "*  You seem to have the IBM  C compiler.  It is      *"
-                echo "*  recommended for best performance that you use:    *"
-                echo "*                                                    *"
-                echo "*    CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *"
-                echo "*                      ^^^        ^^^                *"
-                echo "*  where xxx is pwr2, pwr3, 604, or whatever kind of *"
-                echo "*  CPU you have.  (Set the CFLAGS environment var.   *"
-                echo "*  and re-run configure.)  For more info, man cc.    *"
-                echo "******************************************************"
-fi
-
-         ;;
-
-    intel) CFLAGS="-O3 -ansi_alias"
-	if test "x$acx_maxopt_portable" = xno; then
-	  icc_archflag=unknown
-	  icc_flags=""
-	  case $host_cpu in
-	    i686*|x86_64*)
-              # icc accepts gcc assembly syntax, so these should work:
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0 output" >&5
-$as_echo_n "checking for x86 cpuid 0 output... " >&6; }
-if test "${ax_cv_gcc_x86_cpuid_0+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ax_cv_gcc_x86_cpuid_0=unknown
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-
-     int op = 0, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ax_cv_gcc_x86_cpuid_0=`cat conftest_cpuid`; rm -f conftest_cpuid
-else
-  ax_cv_gcc_x86_cpuid_0=unknown; rm -f conftest_cpuid
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0" >&5
-$as_echo "$ax_cv_gcc_x86_cpuid_0" >&6; }
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 1 output" >&5
-$as_echo_n "checking for x86 cpuid 1 output... " >&6; }
-if test "${ax_cv_gcc_x86_cpuid_1+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ax_cv_gcc_x86_cpuid_1=unknown
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-
-     int op = 1, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ax_cv_gcc_x86_cpuid_1=`cat conftest_cpuid`; rm -f conftest_cpuid
-else
-  ax_cv_gcc_x86_cpuid_1=unknown; rm -f conftest_cpuid
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_1" >&5
-$as_echo "$ax_cv_gcc_x86_cpuid_1" >&6; }
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-	      case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG
-                *:756e6547:*:*) # Intel
-                  case $ax_cv_gcc_x86_cpuid_1 in
-                    *6a?:*[234]:*:*|*6[789b]?:*:*:*) icc_flags="-xK";;
-                    *f3[347]:*:*:*|*f41347:*:*:*) icc_flags="-xP -xN -xW -xK";;
-                    *f??:*:*:*) icc_flags="-xN -xW -xK";;
-                  esac ;;
-              esac ;;
-          esac
-          if test "x$icc_flags" != x; then
-            for flag in $icc_flags; do
-               { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
-$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
-ax_save_FLAGS=$CFLAGS
-   CFLAGS="$flag"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=yes
-else
-  eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   CFLAGS=$ax_save_FLAGS
-eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	icc_archflag=$flag; break
-else
-	:
-fi
-
-            done
-          fi
-          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for icc architecture flag" >&5
-$as_echo_n "checking for icc architecture flag... " >&6; }
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $icc_archflag" >&5
-$as_echo "$icc_archflag" >&6; }
-          if test "x$icc_archflag" != xunknown; then
-            CFLAGS="$CFLAGS $icc_archflag"
-          fi
-        fi
-	;;
-
-    gnu)
-     # default optimization flags for gcc on all systems
-     CFLAGS="-O3 -fomit-frame-pointer"
-
-     # -malign-double for x86 systems
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -malign-double" >&5
-$as_echo_n "checking whether C compiler accepts -malign-double... " >&6; }
-if test "${ax_cv_c_flags__malign_double+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      ax_save_FLAGS=$CFLAGS
-      CFLAGS="-malign-double"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_c_flags__malign_double=yes
-else
-  ax_cv_c_flags__malign_double=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-      CFLAGS=$ax_save_FLAGS
-fi
-
-eval ax_check_compiler_flags=$ax_cv_c_flags__malign_double
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	CFLAGS="$CFLAGS -malign-double"
-else
-	:
-fi
-
-
-     #  -fstrict-aliasing for gcc-2.95+
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fstrict-aliasing" >&5
-$as_echo_n "checking whether C compiler accepts -fstrict-aliasing... " >&6; }
-if test "${ax_cv_c_flags__fstrict_aliasing+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      ax_save_FLAGS=$CFLAGS
-      CFLAGS="-fstrict-aliasing"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_c_flags__fstrict_aliasing=yes
-else
-  ax_cv_c_flags__fstrict_aliasing=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-      CFLAGS=$ax_save_FLAGS
-fi
-
-eval ax_check_compiler_flags=$ax_cv_c_flags__fstrict_aliasing
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	CFLAGS="$CFLAGS -fstrict-aliasing"
-else
-	:
-fi
-
-
-     # note that we enable "unsafe" fp optimization with other compilers, too
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -ffast-math" >&5
-$as_echo_n "checking whether C compiler accepts -ffast-math... " >&6; }
-if test "${ax_cv_c_flags__ffast_math+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      ax_save_FLAGS=$CFLAGS
-      CFLAGS="-ffast-math"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_c_flags__ffast_math=yes
-else
-  ax_cv_c_flags__ffast_math=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-      CFLAGS=$ax_save_FLAGS
-fi
-
-eval ax_check_compiler_flags=$ax_cv_c_flags__ffast_math
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	CFLAGS="$CFLAGS -ffast-math"
-else
-	:
-fi
-
-
-
-
-
-
-# Check whether --with-gcc-arch was given.
-if test "${with_gcc_arch+set}" = set; then :
-  withval=$with_gcc_arch; ax_gcc_arch=$withval
-else
-  ax_gcc_arch=yes
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc architecture flag" >&5
-$as_echo_n "checking for gcc architecture flag... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
-$as_echo "" >&6; }
-if test "${ax_cv_gcc_archflag+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-ax_cv_gcc_archflag="unknown"
-
-if test "$GCC" = yes; then
-
-if test "x$ax_gcc_arch" = xyes; then
-ax_gcc_arch=""
-if test "$cross_compiling" = no; then
-case $host_cpu in
-  i[3456]86*|x86_64*) # use cpuid codes, in part from x86info-1.7 by D. Jones
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0 output" >&5
-$as_echo_n "checking for x86 cpuid 0 output... " >&6; }
-if test "${ax_cv_gcc_x86_cpuid_0+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ax_cv_gcc_x86_cpuid_0=unknown
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-
-     int op = 0, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ax_cv_gcc_x86_cpuid_0=`cat conftest_cpuid`; rm -f conftest_cpuid
-else
-  ax_cv_gcc_x86_cpuid_0=unknown; rm -f conftest_cpuid
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0" >&5
-$as_echo "$ax_cv_gcc_x86_cpuid_0" >&6; }
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 1 output" >&5
-$as_echo_n "checking for x86 cpuid 1 output... " >&6; }
-if test "${ax_cv_gcc_x86_cpuid_1+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ax_cv_gcc_x86_cpuid_1=unknown
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-
-     int op = 1, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ax_cv_gcc_x86_cpuid_1=`cat conftest_cpuid`; rm -f conftest_cpuid
-else
-  ax_cv_gcc_x86_cpuid_1=unknown; rm -f conftest_cpuid
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_1" >&5
-$as_echo "$ax_cv_gcc_x86_cpuid_1" >&6; }
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-     case $ax_cv_gcc_x86_cpuid_0 in
-       *:756e6547:*:*) # Intel
-          case $ax_cv_gcc_x86_cpuid_1 in
-	    *5[48]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;;
-	    *5??:*:*:*) ax_gcc_arch=pentium ;;
-	    *6[3456]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
-	    *6a?:*[01]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
-	    *6a?:*[234]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
-	    *6[9d]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;;
-	    *6[78b]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
-	    *6??:*:*:*) ax_gcc_arch=pentiumpro ;;
-            *f3[347]:*:*:*|*f41347:*:*:*)
-		case $host_cpu in
-                  x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;;
-                  *) ax_gcc_arch="prescott pentium4 pentiumpro" ;;
-                esac ;;
-            *f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";;
-          esac ;;
-       *:68747541:*:*) # AMD
-          case $ax_cv_gcc_x86_cpuid_1 in
-	    *5[67]?:*:*:*) ax_gcc_arch=k6 ;;
-	    *5[8d]?:*:*:*) ax_gcc_arch="k6-2 k6" ;;
-	    *5[9]?:*:*:*) ax_gcc_arch="k6-3 k6" ;;
-	    *60?:*:*:*) ax_gcc_arch=k7 ;;
-	    *6[12]?:*:*:*) ax_gcc_arch="athlon k7" ;;
-	    *6[34]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;;
-	    *67?:*:*:*) ax_gcc_arch="athlon-4 athlon k7" ;;
-	    *6[68a]?:*:*:*)
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0x80000006 output" >&5
-$as_echo_n "checking for x86 cpuid 0x80000006 output... " >&6; }
-if test "${ax_cv_gcc_x86_cpuid_0x80000006+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ax_cv_gcc_x86_cpuid_0x80000006=unknown
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-
-     int op = 0x80000006, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ax_cv_gcc_x86_cpuid_0x80000006=`cat conftest_cpuid`; rm -f conftest_cpuid
-else
-  ax_cv_gcc_x86_cpuid_0x80000006=unknown; rm -f conftest_cpuid
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0x80000006" >&5
-$as_echo "$ax_cv_gcc_x86_cpuid_0x80000006" >&6; }
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
- # L2 cache size
-	       case $ax_cv_gcc_x86_cpuid_0x80000006 in
-                 *:*:*[1-9a-f]??????:*) # (L2 = ecx >> 16) >= 256
-			ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;;
-                 *) ax_gcc_arch="athlon-4 athlon k7" ;;
-	       esac ;;
-	    *f[4cef8b]?:*:*:*) ax_gcc_arch="athlon64 k8" ;;
-	    *f5?:*:*:*) ax_gcc_arch="opteron k8" ;;
-	    *f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;;
-	    *f??:*:*:*) ax_gcc_arch="k8" ;;
-          esac ;;
-	*:746e6543:*:*) # IDT
-	   case $ax_cv_gcc_x86_cpuid_1 in
-	     *54?:*:*:*) ax_gcc_arch=winchip-c6 ;;
-	     *58?:*:*:*) ax_gcc_arch=winchip2 ;;
-	     *6[78]?:*:*:*) ax_gcc_arch=c3 ;;
-	     *69?:*:*:*) ax_gcc_arch="c3-2 c3" ;;
-	   esac ;;
-     esac
-     if test x"$ax_gcc_arch" = x; then # fallback
-	case $host_cpu in
-	  i586*) ax_gcc_arch=pentium ;;
-	  i686*) ax_gcc_arch=pentiumpro ;;
-        esac
-     fi
-     ;;
-
-  sparc*)
-     # Extract the first word of "prtdiag", so it can be a program name with args.
-set dummy prtdiag; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_PRTDIAG+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $PRTDIAG in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_PRTDIAG="$PRTDIAG" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_dummy="$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/"
-for as_dir in $as_dummy
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_path_PRTDIAG="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-  test -z "$ac_cv_path_PRTDIAG" && ac_cv_path_PRTDIAG="prtdiag"
-  ;;
-esac
-fi
-PRTDIAG=$ac_cv_path_PRTDIAG
-if test -n "$PRTDIAG"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PRTDIAG" >&5
-$as_echo "$PRTDIAG" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-     cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null`
-     cputype=`echo "$cputype" | tr -d ' -' |tr $as_cr_LETTERS $as_cr_letters`
-     case $cputype in
-         *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;;
-         *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;;
-         *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;;
-         *supersparc*|*tms390z5[05]*) ax_gcc_arch="supersparc v8" ;;
-         *hypersparc*|*rt62[056]*) ax_gcc_arch="hypersparc v8" ;;
-         *cypress*) ax_gcc_arch=cypress ;;
-     esac ;;
-
-  alphaev5) ax_gcc_arch=ev5 ;;
-  alphaev56) ax_gcc_arch=ev56 ;;
-  alphapca56) ax_gcc_arch="pca56 ev56" ;;
-  alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;;
-  alphaev6) ax_gcc_arch=ev6 ;;
-  alphaev67) ax_gcc_arch=ev67 ;;
-  alphaev68) ax_gcc_arch="ev68 ev67" ;;
-  alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;;
-  alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;;
-  alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;;
-
-  powerpc*)
-     cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null`
-     cputype=`echo $cputype | sed -e 's/ppc//g;s/ *//g'`
-     case $cputype in
-       *750*) ax_gcc_arch="750 G3" ;;
-       *740[0-9]*) ax_gcc_arch="$cputype 7400 G4" ;;
-       *74[4-5][0-9]*) ax_gcc_arch="$cputype 7450 G4" ;;
-       *74[0-9][0-9]*) ax_gcc_arch="$cputype G4" ;;
-       *970*) ax_gcc_arch="970 G5 power4";;
-       *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";;
-       *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";;
-       603ev|8240) ax_gcc_arch="$cputype 603e 603";;
-       *) ax_gcc_arch=$cputype ;;
-     esac
-     ax_gcc_arch="$ax_gcc_arch powerpc"
-     ;;
-esac
-fi # not cross-compiling
-fi # guess arch
-
-if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then
-for arch in $ax_gcc_arch; do
-  if test "x$acx_maxopt_portable" = xyes; then # if we require portable code
-    flags="-mtune=$arch"
-    # -mcpu=$arch and m$arch generate nonportable code on every arch except
-    # x86.  And some other arches (e.g. Alpha) don't accept -mtune.  Grrr.
-    case $host_cpu in i*86|x86_64*) flags="$flags -mcpu=$arch -m$arch";; esac
-  else
-    flags="-march=$arch -mcpu=$arch -m$arch"
-  fi
-  for flag in $flags; do
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
-$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
-ax_save_FLAGS=$CFLAGS
-   CFLAGS="$flag"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=yes
-else
-  eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   CFLAGS=$ax_save_FLAGS
-eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	ax_cv_gcc_archflag=$flag; break
-else
-	:
-fi
-
-  done
-  test "x$ax_cv_gcc_archflag" = xunknown || break
-done
-fi
-
-fi # $GCC=yes
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc architecture flag" >&5
-$as_echo_n "checking for gcc architecture flag... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_archflag" >&5
-$as_echo "$ax_cv_gcc_archflag" >&6; }
-if test "x$ax_cv_gcc_archflag" = xunknown; then
-  :
-else
-  CFLAGS="$CFLAGS $ax_cv_gcc_archflag"
-fi
-
-     ;;
-  esac
-
-  if test -z "$CFLAGS"; then
-	echo ""
-	echo "********************************************************"
-        echo "* WARNING: Don't know the best CFLAGS for this system  *"
-        echo "* Use ./configure CFLAGS=... to specify your own flags *"
-	echo "* (otherwise, a default of CFLAGS=-O3 will be used)    *"
-	echo "********************************************************"
-	echo ""
-        CFLAGS="-O3"
-  fi
-
-   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CFLAGS" >&5
-$as_echo_n "checking whether C compiler accepts $CFLAGS... " >&6; }
-ax_save_FLAGS=$CFLAGS
-   CFLAGS="$CFLAGS"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval `$as_echo "ax_cv_c_flags_$CFLAGS" | $as_tr_sh`=yes
-else
-  eval `$as_echo "ax_cv_c_flags_$CFLAGS" | $as_tr_sh`=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   CFLAGS=$ax_save_FLAGS
-eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$CFLAGS" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	:
-else
-
-	echo ""
-        echo "********************************************************"
-        echo "* WARNING: The guessed CFLAGS don't seem to work with  *"
-        echo "* your compiler.                                       *"
-        echo "* Use ./configure CFLAGS=... to specify your own flags *"
-        echo "********************************************************"
-        echo ""
-        CFLAGS=""
-
-fi
-
-
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS_WARN for maximum warnings" >&5
-$as_echo_n "checking CFLAGS_WARN for maximum warnings... " >&6; }
-if test "${ac_cv_cflags_warn_all+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_cflags_warn_all="no, unknown"
-
- ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
- ac_save_CFLAGS="$CFLAGS"
-for ac_arg in "-pedantic  % -Wall"          "-xstrconst % -v"             "-std1      % -verbose -w0 -warnprotos"    "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd"    "-ansi -ansiE % -fullwarn"    "+ESlit     % +w1"            "-Xc        % -pvctl,fullmsg"    "-h conform % -h msglevel 2"    #
-do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_cflags_warn_all=`echo $ac_arg | sed -e 's,.*% *,,'` ; break
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-done
- CFLAGS="$ac_save_CFLAGS"
- ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags_warn_all" >&5
-$as_echo "$ac_cv_cflags_warn_all" >&6; }
-case ".$ac_cv_cflags_warn_all" in
-     .ok|.ok,*)  ;;
-   .|.no|.no,*)
- ;;
-   *)
-   if echo " $CFLAGS_WARN " | grep " $ac_cv_cflags_warn_all " 2>&1 >/dev/null
-   then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS_WARN does contain \$ac_cv_cflags_warn_all"; } >&5
-  (: CFLAGS_WARN does contain $ac_cv_cflags_warn_all) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-   else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS_WARN=\"\$CFLAGS_WARN \$ac_cv_cflags_warn_all\""; } >&5
-  (: CFLAGS_WARN="$CFLAGS_WARN $ac_cv_cflags_warn_all") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-                      CFLAGS_WARN="$CFLAGS_WARN $ac_cv_cflags_warn_all"
-   fi
- ;;
-esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
-$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
-if test "${ac_cv_c_const+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-/* FIXME: Include the comments suggested by Paul. */
-#ifndef __cplusplus
-  /* Ultrix mips cc rejects this.  */
-  typedef int charset[2];
-  const charset cs;
-  /* SunOS 4.1.1 cc rejects this.  */
-  char const *const *pcpcc;
-  char **ppc;
-  /* NEC SVR4.0.2 mips cc rejects this.  */
-  struct point {int x, y;};
-  static struct point const zero = {0,0};
-  /* AIX XL C 1.02.0.0 rejects this.
-     It does not let you subtract one const X* pointer from another in
-     an arm of an if-expression whose if-part is not a constant
-     expression */
-  const char *g = "string";
-  pcpcc = &g + (g ? g-g : 0);
-  /* HPUX 7.0 cc rejects these. */
-  ++pcpcc;
-  ppc = (char**) pcpcc;
-  pcpcc = (char const *const *) ppc;
-  { /* SCO 3.2v4 cc rejects this.  */
-    char *t;
-    char const *s = 0 ? (char *) 0 : (char const *) 0;
-
-    *t++ = 0;
-    if (s) return 0;
-  }
-  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
-    int x[] = {25, 17};
-    const int *foo = &x[0];
-    ++foo;
-  }
-  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
-    typedef const int *iptr;
-    iptr p = 0;
-    ++p;
-  }
-  { /* AIX XL C 1.02.0.0 rejects this saying
-       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
-    struct s { int j; const int *ap[3]; };
-    struct s *b; b->j = 5;
-  }
-  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
-    const int foo = 10;
-    if (!foo) return 0;
-  }
-  return !cs[0] && !zero.x;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_c_const=yes
-else
-  ac_cv_c_const=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
-$as_echo "$ac_cv_c_const" >&6; }
-if test $ac_cv_c_const = no; then
-
-$as_echo "#define const /**/" >>confdefs.h
-
-fi
-
-ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
-if test "x$ac_cv_type_size_t" = x""yes; then :
-
-else
-
-cat >>confdefs.h <<_ACEOF
-#define size_t unsigned int
-_ACEOF
-
-fi
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if test "${ac_cv_header_stdc+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_stdc=yes
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      return 2;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-
-
-for ac_func in strtol
-do :
-  ac_fn_c_check_func "$LINENO" "strtol" "ac_cv_func_strtol"
-if test "x$ac_cv_func_strtol" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_STRTOL 1
-_ACEOF
-
-fi
-done
-
-
-
-
-for ac_func in getrusage
-do :
-  ac_fn_c_check_func "$LINENO" "getrusage" "ac_cv_func_getrusage"
-if test "x$ac_cv_func_getrusage" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_GETRUSAGE 1
-_ACEOF
-
-$as_echo "#define CLOOG_RUSAGE /**/" >>confdefs.h
-
-fi
-done
-
-
-
-
-
-# Check whether --with-isl was given.
-if test "${with_isl+set}" = set; then :
-  withval=$with_isl;
-fi
-
-case "system" in
-no|system|build|bundled)
-
-# Check whether --with-isl_prefix was given.
-if test "${with_isl_prefix+set}" = set; then :
-  withval=$with_isl_prefix;
-fi
-
-
-# Check whether --with-isl_exec_prefix was given.
-if test "${with_isl_exec_prefix+set}" = set; then :
-  withval=$with_isl_exec_prefix;
-fi
-
-esac
-case "build" in
-no|system|build|bundled)
-
-# Check whether --with-isl_builddir was given.
-if test "${with_isl_builddir+set}" = set; then :
-  withval=$with_isl_builddir;
-fi
-
-esac
-if test "x$with_isl_prefix" != "x" -a "x$with_isl_exec_prefix" = "x"; then
-	with_isl_exec_prefix=$with_isl_prefix
-fi
-if test "x$with_isl_prefix" != "x" -o "x$with_isl_exec_prefix" != "x"; then
-	if test "x$with_isl" != "x" -a "x$with_isl" != "xsystem"; then
-		as_fn_error $? "Setting $with_isl_prefix implies use of system isl" "$LINENO" 5
-	fi
-	with_isl="system"
-fi
-if test "x$with_isl_builddir" != "x"; then
-	if test "x$with_isl" != "x" -a "x$with_isl" != "xbuild"; then
-		as_fn_error $? "Setting $with_isl_builddir implies use of build isl" "$LINENO" 5
-	fi
-	with_isl="build"
-	isl_srcdir=`echo @abs_srcdir@ | $with_isl_builddir/config.status --file=-`
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: isl sources in $isl_srcdir" >&5
-$as_echo "$as_me: isl sources in $isl_srcdir" >&6;}
-fi
-case "$with_isl" in
-no|system|build|bundled)
-	;;
-*)
-	if test -d $srcdir/.git -a \
-		-d $srcdir/isl -a \
-		! -d $srcdir/isl/.git; then
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: git repo detected, but submodule isl not initialized" >&5
-$as_echo "$as_me: WARNING: git repo detected, but submodule isl not initialized" >&2;}
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You may want to run" >&5
-$as_echo "$as_me: WARNING: You may want to run" >&2;}
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	git submodule init" >&5
-$as_echo "$as_me: WARNING: 	git submodule init" >&2;}
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	git submodule update" >&5
-$as_echo "$as_me: WARNING: 	git submodule update" >&2;}
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	sh autogen.sh" >&5
-$as_echo "$as_me: WARNING: 	sh autogen.sh" >&2;}
-	fi
-	if test -f $srcdir/isl/configure -a "bundled" != "no"; then
-		with_isl="bundled"
-	else
-		with_isl="bundled"
-	fi
-	;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which isl to use" >&5
-$as_echo_n "checking which isl to use... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_isl" >&5
-$as_echo "$with_isl" >&6; }
-
-
-BITS="gmp"
-
-
-
-
-
-# Check whether --with-gmp was given.
-if test "${with_gmp+set}" = set; then :
-  withval=$with_gmp;
-fi
-
-case "system" in
-system|build)
-
-# Check whether --with-gmp_prefix was given.
-if test "${with_gmp_prefix+set}" = set; then :
-  withval=$with_gmp_prefix;
-fi
-
-
-# Check whether --with-gmp_exec_prefix was given.
-if test "${with_gmp_exec_prefix+set}" = set; then :
-  withval=$with_gmp_exec_prefix;
-fi
-
-esac
-case "build" in
-system|build)
-
-# Check whether --with-gmp_builddir was given.
-if test "${with_gmp_builddir+set}" = set; then :
-  withval=$with_gmp_builddir;
-fi
-
-esac
-if test "x$with_gmp_prefix" != "x" -a "x$with_gmp_exec_prefix" = "x"; then
-	with_gmp_exec_prefix=$with_gmp_prefix
-fi
-if test "x$with_gmp_prefix" != "x" -o "x$with_gmp_exec_prefix" != "x"; then
-	if test "x$with_gmp" != "x" -a "x$with_gmp" != "xsystem"; then
-		as_fn_error $? "Setting $with_gmp_prefix implies use of system gmp" "$LINENO" 5
-	fi
-	with_gmp="system"
-fi
-if test "x$with_gmp_builddir" != "x"; then
-	if test "x$with_gmp" != "x" -a "x$with_gmp" != "xbuild"; then
-		as_fn_error $? "Setting $with_gmp_builddir implies use of build gmp" "$LINENO" 5
-	fi
-	with_gmp="build"
-	gmp_srcdir=`echo @abs_srcdir@ | $with_gmp_builddir/config.status --file=-`
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: gmp sources in $gmp_srcdir" >&5
-$as_echo "$as_me: gmp sources in $gmp_srcdir" >&6;}
-fi
-case "$with_gmp" in
-system|build)
-	;;
-*)
-	if test -d $srcdir/.git -a \
-		-d $srcdir/gmp -a \
-		! -d $srcdir/gmp/.git; then
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: git repo detected, but submodule gmp not initialized" >&5
-$as_echo "$as_me: WARNING: git repo detected, but submodule gmp not initialized" >&2;}
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You may want to run" >&5
-$as_echo "$as_me: WARNING: You may want to run" >&2;}
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	git submodule init" >&5
-$as_echo "$as_me: WARNING: 	git submodule init" >&2;}
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	git submodule update" >&5
-$as_echo "$as_me: WARNING: 	git submodule update" >&2;}
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	sh autogen.sh" >&5
-$as_echo "$as_me: WARNING: 	sh autogen.sh" >&2;}
-	fi
-	if test -f $srcdir/gmp/configure -a "system" != "no"; then
-		with_gmp="bundled"
-	else
-		with_gmp="system"
-	fi
-	;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which gmp to use" >&5
-$as_echo_n "checking which gmp to use... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_gmp" >&5
-$as_echo "$with_gmp" >&6; }
-
-
-
-need_get_memory_functions=false
-case "$with_gmp" in
-build)
-    CPPFLAGS="-I$with_gmp_builddir $CPPFLAGS"
-    LDFLAGS="-L$with_gmp_builddir/$lt_cv_objdir $LDFLAGS"
-    ;;
-system)
-    if test "x$with_gmp_prefix" != "x"; then
-	CPPFLAGS="-I$with_gmp_prefix/include $CPPFLAGS"
-    fi
-
-    if test "$with_gmp_exec_prefix" != "yes" ; then
-	LDFLAGS="-L$with_gmp_exec_prefix/lib $LDFLAGS"
-    fi
-    ;;
-esac
-case "$with_gmp" in
-build|system)
-    ac_fn_c_check_header_mongrel "$LINENO" "gmp.h" "ac_cv_header_gmp_h" "$ac_includes_default"
-if test "x$ac_cv_header_gmp_h" = x""yes; then :
-
-else
-  as_fn_error $? "Can't find gmp headers." "$LINENO" 5
-fi
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gmpz_init in -lgmp" >&5
-$as_echo_n "checking for __gmpz_init in -lgmp... " >&6; }
-if test "${ac_cv_lib_gmp___gmpz_init+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lgmp  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char __gmpz_init ();
-int
-main ()
-{
-return __gmpz_init ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_gmp___gmpz_init=yes
-else
-  ac_cv_lib_gmp___gmpz_init=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gmp___gmpz_init" >&5
-$as_echo "$ac_cv_lib_gmp___gmpz_init" >&6; }
-if test "x$ac_cv_lib_gmp___gmpz_init" = x""yes; then :
-  LIBS="$LIBS -lgmp"
-else
-  as_fn_error $? "Can't find gmp library." "$LINENO" 5
-fi
-
-    ac_fn_c_check_decl "$LINENO" "mp_get_memory_functions" "ac_cv_have_decl_mp_get_memory_functions" "#include <gmp.h>
-"
-if test "x$ac_cv_have_decl_mp_get_memory_functions" = x""yes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_MP_GET_MEMORY_FUNCTIONS $ac_have_decl
-_ACEOF
-if test $ac_have_decl = 1; then :
-
-else
-
-	    need_get_memory_functions=true
-
-fi
-
-    ;;
-esac
- if test x$need_get_memory_functions = xtrue; then
-  NEED_GET_MEMORY_FUNCTIONS_TRUE=
-  NEED_GET_MEMORY_FUNCTIONS_FALSE='#'
-else
-  NEED_GET_MEMORY_FUNCTIONS_TRUE='#'
-  NEED_GET_MEMORY_FUNCTIONS_FALSE=
-fi
-
-
-
-
-
-
-case "$with_isl" in
-bundled)
-	ISL_CPPFLAGS="-I$srcdir/isl/include -Iisl/include"
-	;;
-build)
-	ISL_CPPFLAGS="-I$isl_srcdir/include -I$with_isl_builddir/include"
-	ISL_LIBS="$with_isl_builddir/libisl.la"
-	;;
-system)
-	if test "x$with_isl_prefix" != "x"; then
-		ISL_CPPFLAGS="-I$with_isl_prefix/include"
-	fi
-	if test "x$with_isl_exec_prefix" != "x"; then
-		ISL_LDFLAGS="-L$with_isl_exec_prefix/lib"
-	fi
-	ISL_LIBS="-lisl"
-esac
- if test $with_isl = bundled; then
-  BUNDLED_ISL_TRUE=
-  BUNDLED_ISL_FALSE='#'
-else
-  BUNDLED_ISL_TRUE='#'
-  BUNDLED_ISL_FALSE=
-fi
-
- if test $with_isl = no; then
-  NO_ISL_TRUE=
-  NO_ISL_FALSE='#'
-else
-  NO_ISL_TRUE='#'
-  NO_ISL_FALSE=
-fi
-
-
-
-
-
-
-
-# Check whether --with-osl was given.
-if test "${with_osl+set}" = set; then :
-  withval=$with_osl;
-fi
-
-case "system" in
-no|system|build|bundled)
-
-# Check whether --with-osl_prefix was given.
-if test "${with_osl_prefix+set}" = set; then :
-  withval=$with_osl_prefix;
-fi
-
-
-# Check whether --with-osl_exec_prefix was given.
-if test "${with_osl_exec_prefix+set}" = set; then :
-  withval=$with_osl_exec_prefix;
-fi
-
-esac
-case "build" in
-no|system|build|bundled)
-
-# Check whether --with-osl_builddir was given.
-if test "${with_osl_builddir+set}" = set; then :
-  withval=$with_osl_builddir;
-fi
-
-esac
-if test "x$with_osl_prefix" != "x" -a "x$with_osl_exec_prefix" = "x"; then
-	with_osl_exec_prefix=$with_osl_prefix
-fi
-if test "x$with_osl_prefix" != "x" -o "x$with_osl_exec_prefix" != "x"; then
-	if test "x$with_osl" != "x" -a "x$with_osl" != "xsystem"; then
-		as_fn_error $? "Setting $with_osl_prefix implies use of system osl" "$LINENO" 5
-	fi
-	with_osl="system"
-fi
-if test "x$with_osl_builddir" != "x"; then
-	if test "x$with_osl" != "x" -a "x$with_osl" != "xbuild"; then
-		as_fn_error $? "Setting $with_osl_builddir implies use of build osl" "$LINENO" 5
-	fi
-	with_osl="build"
-	osl_srcdir=`echo @abs_srcdir@ | $with_osl_builddir/config.status --file=-`
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: osl sources in $osl_srcdir" >&5
-$as_echo "$as_me: osl sources in $osl_srcdir" >&6;}
-fi
-case "$with_osl" in
-no|system|build|bundled)
-	;;
-*)
-	if test -d $srcdir/.git -a \
-		-d $srcdir/osl -a \
-		! -d $srcdir/osl/.git; then
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: git repo detected, but submodule osl not initialized" >&5
-$as_echo "$as_me: WARNING: git repo detected, but submodule osl not initialized" >&2;}
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You may want to run" >&5
-$as_echo "$as_me: WARNING: You may want to run" >&2;}
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	git submodule init" >&5
-$as_echo "$as_me: WARNING: 	git submodule init" >&2;}
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	git submodule update" >&5
-$as_echo "$as_me: WARNING: 	git submodule update" >&2;}
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	sh autogen.sh" >&5
-$as_echo "$as_me: WARNING: 	sh autogen.sh" >&2;}
-	fi
-	if test -f $srcdir/osl/configure -a "no" != "no"; then
-		with_osl="bundled"
-	else
-		with_osl="no"
-	fi
-	;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which osl to use" >&5
-$as_echo_n "checking which osl to use... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_osl" >&5
-$as_echo "$with_osl" >&6; }
-
-
-osl_flag="OSL_SUPPORT"
-
-
-
-
-case "$with_osl" in
-bundled)
-	OSL_CPPFLAGS="-D$osl_flag -I$srcdir/osl/include -Iosl/include"
-	;;
-build)
-	OSL_CPPFLAGS="-D$osl_flag -I$osl_srcdir/include -I$with_osl_builddir/include"
-	OSL_LIBS="$with_osl_builddir/libosl.la"
-	;;
-system)
-	if test "x$with_osl_prefix" != "x"; then
-		OSL_CPPFLAGS="-D$osl_flag -I$with_osl_prefix/include"
-	fi
-	if test "x$with_osl_exec_prefix" != "x"; then
-		OSL_LDFLAGS="-L$with_osl_exec_prefix/lib"
-	fi
-	OSL_LIBS="-losl"
-esac
- if test $with_osl = bundled; then
-  BUNDLED_OSL_TRUE=
-  BUNDLED_OSL_FALSE='#'
-else
-  BUNDLED_OSL_TRUE='#'
-  BUNDLED_OSL_FALSE=
-fi
-
- if test $with_osl = no; then
-  NO_OSL_TRUE=
-  NO_OSL_FALSE='#'
-else
-  NO_OSL_TRUE='#'
-  NO_OSL_FALSE=
-fi
-
-
-
-
-$as_echo "#define CLOOG_INT_GMP 1" >>confdefs.h
-
-
-
-if test -f $srcdir/.git/HEAD; then
-	GIT_INDEX="\$(top_srcdir)/.git/index"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-PACKAGE_NAME="cloog-isl"
-PACKAGE_CFLAGS="-DCLOOG_INT_GMP=1"
-
-# we need the expanded forms...
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig libname" >&5
-$as_echo_n "checking our pkgconfig libname... " >&6; }
-test ".$ax_create_pkgconfig_libname" != "." || \
-ax_create_pkgconfig_libname="${PACKAGE_NAME}"
-test ".$ax_create_pkgconfig_libname" != "." || \
-ax_create_pkgconfig_libname="$PACKAGE"
-ax_create_pkgconfig_libname=`eval echo "$ax_create_pkgconfig_libname"`
-ax_create_pkgconfig_libname=`eval echo "$ax_create_pkgconfig_libname"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_libname" >&5
-$as_echo "$ax_create_pkgconfig_libname" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig version" >&5
-$as_echo_n "checking our pkgconfig version... " >&6; }
-test ".$ax_create_pkgconfig_version" != "." || \
-ax_create_pkgconfig_version="${PACKAGE_VERSION}"
-test ".$ax_create_pkgconfig_version" != "." || \
-ax_create_pkgconfig_version="$VERSION"
-ax_create_pkgconfig_version=`eval echo "$ax_create_pkgconfig_version"`
-ax_create_pkgconfig_version=`eval echo "$ax_create_pkgconfig_version"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_version" >&5
-$as_echo "$ax_create_pkgconfig_version" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig_libdir" >&5
-$as_echo_n "checking our pkgconfig_libdir... " >&6; }
-test ".$pkgconfig_libdir" = "." && \
-pkgconfig_libdir='${libdir}/pkgconfig'
-ax_create_pkgconfig_libdir=`eval echo "$pkgconfig_libdir"`
-ax_create_pkgconfig_libdir=`eval echo "$ax_create_pkgconfig_libdir"`
-ax_create_pkgconfig_libdir=`eval echo "$ax_create_pkgconfig_libdir"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pkgconfig_libdir" >&5
-$as_echo "$pkgconfig_libdir" >&6; }
-test "$pkgconfig_libdir" != "$ax_create_pkgconfig_libdir" && (
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: expanded our pkgconfig_libdir... $ax_create_pkgconfig_libdir" >&5
-$as_echo "expanded our pkgconfig_libdir... $ax_create_pkgconfig_libdir" >&6; })
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig_libfile" >&5
-$as_echo_n "checking our pkgconfig_libfile... " >&6; }
-test ".$pkgconfig_libfile" != "." || \
-pkgconfig_libfile="$ax_create_pkgconfig_libname.pc"
-ax_create_pkgconfig_libfile=`eval echo "$pkgconfig_libfile"`
-ax_create_pkgconfig_libfile=`eval echo "$ax_create_pkgconfig_libfile"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pkgconfig_libfile" >&5
-$as_echo "$pkgconfig_libfile" >&6; }
-test "$pkgconfig_libfile" != "$ax_create_pkgconfig_libfile" && (
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: expanded our pkgconfig_libfile... $ax_create_pkgconfig_libfile" >&5
-$as_echo "expanded our pkgconfig_libfile... $ax_create_pkgconfig_libfile" >&6; })
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our package / suffix" >&5
-$as_echo_n "checking our package / suffix... " >&6; }
-ax_create_pkgconfig_suffix="$program_suffix"
-test ".$ax_create_pkgconfig_suffix" != .NONE || ax_create_pkgconfig_suffix=""
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${PACKAGE_NAME} / ${ax_create_pkgconfig_suffix}" >&5
-$as_echo "${PACKAGE_NAME} / ${ax_create_pkgconfig_suffix}" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig description" >&5
-$as_echo_n "checking our pkgconfig description... " >&6; }
-ax_create_pkgconfig_description="$PACKAGE_SUMMARY"
-test ".$ax_create_pkgconfig_description" != "." || \
-ax_create_pkgconfig_description="$ax_create_pkgconfig_libname Library"
-ax_create_pkgconfig_description=`eval echo "$ax_create_pkgconfig_description"`
-ax_create_pkgconfig_description=`eval echo "$ax_create_pkgconfig_description"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_description" >&5
-$as_echo "$ax_create_pkgconfig_description" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig requires" >&5
-$as_echo_n "checking our pkgconfig requires... " >&6; }
-ax_create_pkgconfig_requires="$PACKAGE_REQUIRES"
-ax_create_pkgconfig_requires=`eval echo "$ax_create_pkgconfig_requires"`
-ax_create_pkgconfig_requires=`eval echo "$ax_create_pkgconfig_requires"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_requires" >&5
-$as_echo "$ax_create_pkgconfig_requires" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig ext libs" >&5
-$as_echo_n "checking our pkgconfig ext libs... " >&6; }
-ax_create_pkgconfig_pkglibs="$PACKAGE_LIBS"
-test ".$ax_create_pkgconfig_pkglibs" != "." || ax_create_pkgconfig_pkglibs="-l$ax_create_pkgconfig_libname"
-ax_create_pkgconfig_libs="$ax_create_pkgconfig_pkglibs $LIBS"
-ax_create_pkgconfig_libs=`eval echo "$ax_create_pkgconfig_libs"`
-ax_create_pkgconfig_libs=`eval echo "$ax_create_pkgconfig_libs"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_libs" >&5
-$as_echo "$ax_create_pkgconfig_libs" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig cppflags" >&5
-$as_echo_n "checking our pkgconfig cppflags... " >&6; }
-ax_create_pkgconfig_cppflags="$CPPFLAGS $PACKAGE_CFLAGS"
-ax_create_pkgconfig_cppflags=`eval echo "$ax_create_pkgconfig_cppflags"`
-ax_create_pkgconfig_cppflags=`eval echo "$ax_create_pkgconfig_cppflags"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_cppflags" >&5
-$as_echo "$ax_create_pkgconfig_cppflags" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig ldflags" >&5
-$as_echo_n "checking our pkgconfig ldflags... " >&6; }
-ax_create_pkgconfig_ldflags="$LDFLAGS $PACKAGE_LDFLAGS"
-ax_create_pkgconfig_ldflags=`eval echo "$ax_create_pkgconfig_ldflags"`
-ax_create_pkgconfig_ldflags=`eval echo "$ax_create_pkgconfig_ldflags"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_ldflags" >&5
-$as_echo "$ax_create_pkgconfig_ldflags" >&6; }
-
-test ".$ax_create_pkgconfig_generate" != "." || \
-ax_create_pkgconfig_generate="$ax_create_pkgconfig_libname.pc"
-ax_create_pkgconfig_generate=`eval echo "$ax_create_pkgconfig_generate"`
-ax_create_pkgconfig_generate=`eval echo "$ax_create_pkgconfig_generate"`
-test "$pkgconfig_libfile" != "$ax_create_pkgconfig_generate" && (
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: generate the pkgconfig later... $ax_create_pkgconfig_generate" >&5
-$as_echo "generate the pkgconfig later... $ax_create_pkgconfig_generate" >&6; })
-
-if test ".$ax_create_pkgconfig_src_libdir" = "." ; then
-ax_create_pkgconfig_src_libdir=`pwd`
-ax_create_pkgconfig_src_libdir=`$as_dirname -- "$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" ||
-$as_expr X"$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" : 'X\(//\)[^/]' \| \
-	 X"$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" : 'X\(//\)$' \| \
-	 X"$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-test ! -d $ax_create_pkgconfig_src_libdir/src || \
-ax_create_pkgconfig_src_libdir="$ax_create_pkgconfig_src_libdir/src"
-case ".$objdir" in
-*libs) ax_create_pkgconfig_src_libdir="$ax_create_pkgconfig_src_libdir/$objdir" ;; esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: noninstalled pkgconfig -L $ax_create_pkgconfig_src_libdir" >&5
-$as_echo "noninstalled pkgconfig -L $ax_create_pkgconfig_src_libdir" >&6; }
-fi
-
-if test ".$ax_create_pkgconfig_src_headers" = "." ; then
-ax_create_pkgconfig_src_headers=`pwd`
-v="$ac_top_srcdir" ;
-test ".$v" != "." || v="$ax_spec_dir"
-test ".$v" != "." || v="$srcdir"
-case "$v" in /*) ax_create_pkgconfig_src_headers="" ;; esac
-ax_create_pkgconfig_src_headers=`$as_dirname -- "$ax_create_pkgconfig_src_headers/$v/x" ||
-$as_expr X"$ax_create_pkgconfig_src_headers/$v/x" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ax_create_pkgconfig_src_headers/$v/x" : 'X\(//\)[^/]' \| \
-	 X"$ax_create_pkgconfig_src_headers/$v/x" : 'X\(//\)$' \| \
-	 X"$ax_create_pkgconfig_src_headers/$v/x" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ax_create_pkgconfig_src_headers/$v/x" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-test ! -d $ax_create_pkgconfig_src_headers/include || \
-ax_create_pkgconfig_src_headers="$ax_create_pkgconfig_src_headers/include"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: noninstalled pkgconfig -I $ax_create_pkgconfig_src_headers" >&5
-$as_echo "noninstalled pkgconfig -I $ax_create_pkgconfig_src_headers" >&6; }
-fi
-
-
-ac_config_commands="$ac_config_commands $ax_create_pkgconfig_generate"
-
-
-ac_config_files="$ac_config_files Makefile test/Makefile"
-
-ac_config_files="$ac_config_files autoconf/Doxyfile"
-
-ac_config_files="$ac_config_files doc/Makefile"
-
-ac_config_files="$ac_config_files source/version.c"
-
-ac_config_files="$ac_config_files include/cloog/version.h"
-
-ac_config_files="$ac_config_files genversion.sh"
-
-ac_config_commands="$ac_config_commands version.h"
-
-ac_config_commands="$ac_config_commands doc/gitversion.texi"
-
-if test $with_isl = bundled; then
-
-
-subdirs="$subdirs isl"
-
-fi
-if test $with_osl = bundled; then
-	subdirs="$subdirs osl"
-
-fi
-
-cat >confcache <<\_ACEOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs, see configure's option --config-cache.
-# It is not useful on other systems.  If it contains results you don't
-# want to keep, you may remove or edit it.
-#
-# config.status only pays attention to the cache file if you give it
-# the --recheck option to rerun configure.
-#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
-# following values.
-
-_ACEOF
-
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, we kill variables containing newlines.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(
-  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) { eval $ac_var=; unset $ac_var;} ;;
-      esac ;;
-    esac
-  done
-
-  (set) 2>&1 |
-    case $as_nl`(ac_space=' '; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      # `set' does not quote correctly, so add quotes: double-quote
-      # substitution turns \\\\ into \\, and sed turns \\ into \.
-      sed -n \
-	"s/'/'\\\\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
-      ;; #(
-    *)
-      # `set' quotes correctly as required by POSIX, so do not add quotes.
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-) |
-  sed '
-     /^ac_cv_env_/b end
-     t clear
-     :clear
-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
-     t end
-     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
-     :end' >>confcache
-if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
-  if test -w "$cache_file"; then
-    test "x$cache_file" != "x/dev/null" &&
-      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
-    cat confcache >$cache_file
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
-  fi
-fi
-rm -f confcache
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-# Transform confdefs.h into DEFS.
-# Protect against shell expansion while executing Makefile rules.
-# Protect against Makefile macro expansion.
-#
-# If the first sed substitution is executed (which looks for macros that
-# take arguments), then branch to the quote section.  Otherwise,
-# look for a macro that doesn't take arguments.
-ac_script='
-:mline
-/\\$/{
- N
- s,\\\n,,
- b mline
-}
-t clear
-:clear
-s/^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*([^)]*)\)[	 ]*\(.*\)/-D\1=\2/g
-t quote
-s/^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)/-D\1=\2/g
-t quote
-b any
-:quote
-s/[	 `~#$^&*(){}\\|;'\''"<>?]/\\&/g
-s/\[/\\&/g
-s/\]/\\&/g
-s/\$/$$/g
-H
-:any
-${
-	g
-	s/^\n//
-	s/\n/ /g
-	p
-}
-'
-DEFS=`sed -n "$ac_script" confdefs.h`
-
-
-ac_libobjs=
-ac_ltlibobjs=
-U=
-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
-  # 1. Remove the extension, and $U if already installed.
-  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
-  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
-  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
-  #    will be set to the directory where LIBOBJS objects are built.
-  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
-  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
-done
-LIBOBJS=$ac_libobjs
-
-LTLIBOBJS=$ac_ltlibobjs
-
-
- if test -n "$EXEEXT"; then
-  am__EXEEXT_TRUE=
-  am__EXEEXT_FALSE='#'
-else
-  am__EXEEXT_TRUE='#'
-  am__EXEEXT_FALSE=
-fi
-
-if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
-  as_fn_error $? "conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
-  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${HAVE_TEXI2DVI_TRUE}" && test -z "${HAVE_TEXI2DVI_FALSE}"; then
-  as_fn_error $? "conditional \"HAVE_TEXI2DVI\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${NEED_GET_MEMORY_FUNCTIONS_TRUE}" && test -z "${NEED_GET_MEMORY_FUNCTIONS_FALSE}"; then
-  as_fn_error $? "conditional \"NEED_GET_MEMORY_FUNCTIONS\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${BUNDLED_ISL_TRUE}" && test -z "${BUNDLED_ISL_FALSE}"; then
-  as_fn_error $? "conditional \"BUNDLED_ISL\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${NO_ISL_TRUE}" && test -z "${NO_ISL_FALSE}"; then
-  as_fn_error $? "conditional \"NO_ISL\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${BUNDLED_OSL_TRUE}" && test -z "${BUNDLED_OSL_FALSE}"; then
-  as_fn_error $? "conditional \"BUNDLED_OSL\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${NO_OSL_TRUE}" && test -z "${NO_OSL_FALSE}"; then
-  as_fn_error $? "conditional \"NO_OSL\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-
-: ${CONFIG_STATUS=./config.status}
-ac_write_fail=0
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
-as_write_fail=0
-cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate the current configuration.
-# Compiler output produced by configure, useful for debugging
-# configure, is in config.log if it exists.
-
-debug=false
-ac_cs_recheck=false
-ac_cs_silent=false
-
-SHELL=\${CONFIG_SHELL-$SHELL}
-export SHELL
-_ASEOF
-cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
-      PATH_SEPARATOR=';'
-  }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-case $0 in #((
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-  done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-
-# as_fn_error STATUS ERROR [LINENO LOG_FD]
-# ----------------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with STATUS, using 1 if that was 0.
-as_fn_error ()
-{
-  as_status=$1; test $as_status -eq 0 && as_status=1
-  if test "$4"; then
-    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
-  fi
-  $as_echo "$as_me: error: $2" >&2
-  as_fn_exit $as_status
-} # as_fn_error
-
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
-  return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
-  set +e
-  as_fn_set_status $1
-  exit $1
-} # as_fn_exit
-
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
-  { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
-  eval 'as_fn_append ()
-  {
-    eval $1+=\$2
-  }'
-else
-  as_fn_append ()
-  {
-    eval $1=\$$1\$2
-  }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
-  eval 'as_fn_arith ()
-  {
-    as_val=$(( $* ))
-  }'
-else
-  as_fn_arith ()
-  {
-    as_val=`expr "$@" || test $? -eq 1`
-  }
-fi # as_fn_arith
-
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
-  case `echo 'xy\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  xy)  ECHO_C='\c';;
-  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
-       ECHO_T='	';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
-  if ln -s conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s='ln -s'
-    # ... but there are two gotchas:
-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
-  elif ln conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s=ln
-  else
-    as_ln_s='cp -p'
-  fi
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || eval $as_mkdir_p || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p='mkdir -p "$as_dir"'
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-	test -d "$1/.";
-      else
-	case $1 in #(
-	-*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-exec 6>&1
-## ----------------------------------- ##
-## Main body of $CONFIG_STATUS script. ##
-## ----------------------------------- ##
-_ASEOF
-test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# Save the log message, to keep $0 and so on meaningful, and to
-# report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.
-ac_log="
-This file was extended by cloog $as_me 0.17.0, which was
-generated by GNU Autoconf 2.67.  Invocation command line was
-
-  CONFIG_FILES    = $CONFIG_FILES
-  CONFIG_HEADERS  = $CONFIG_HEADERS
-  CONFIG_LINKS    = $CONFIG_LINKS
-  CONFIG_COMMANDS = $CONFIG_COMMANDS
-  $ $0 $@
-
-on `(hostname || uname -n) 2>/dev/null | sed 1q`
-"
-
-_ACEOF
-
-case $ac_config_files in *"
-"*) set x $ac_config_files; shift; ac_config_files=$*;;
-esac
-
-
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-# Files that config.status was made for.
-config_files="$ac_config_files"
-config_commands="$ac_config_commands"
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-ac_cs_usage="\
-\`$as_me' instantiates files and other configuration actions
-from templates according to the current configuration.  Unless the files
-and actions are specified as TAGs, all are instantiated by default.
-
-Usage: $0 [OPTION]... [TAG]...
-
-  -h, --help       print this help, then exit
-  -V, --version    print version number and configuration settings, then exit
-      --config     print configuration, then exit
-  -q, --quiet, --silent
-                   do not print progress messages
-  -d, --debug      don't remove temporary files
-      --recheck    update $as_me by reconfiguring in the same conditions
-      --file=FILE[:TEMPLATE]
-                   instantiate the configuration file FILE
-
-Configuration files:
-$config_files
-
-Configuration commands:
-$config_commands
-
-Report bugs to <cloog-development@googlegroups.com>."
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
-ac_cs_version="\\
-cloog config.status 0.17.0
-configured by $0, generated by GNU Autoconf 2.67,
-  with options \\"\$ac_cs_config\\"
-
-Copyright (C) 2010 Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-
-ac_pwd='$ac_pwd'
-srcdir='$srcdir'
-INSTALL='$INSTALL'
-MKDIR_P='$MKDIR_P'
-AWK='$AWK'
-test -n "\$AWK" || AWK=awk
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# The default lists apply if the user does not specify any file.
-ac_need_defaults=:
-while test $# != 0
-do
-  case $1 in
-  --*=?*)
-    ac_option=`expr "X$1" : 'X\([^=]*\)='`
-    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
-    ac_shift=:
-    ;;
-  --*=)
-    ac_option=`expr "X$1" : 'X\([^=]*\)='`
-    ac_optarg=
-    ac_shift=:
-    ;;
-  *)
-    ac_option=$1
-    ac_optarg=$2
-    ac_shift=shift
-    ;;
-  esac
-
-  case $ac_option in
-  # Handling of the options.
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    ac_cs_recheck=: ;;
-  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
-    $as_echo "$ac_cs_version"; exit ;;
-  --config | --confi | --conf | --con | --co | --c )
-    $as_echo "$ac_cs_config"; exit ;;
-  --debug | --debu | --deb | --de | --d | -d )
-    debug=: ;;
-  --file | --fil | --fi | --f )
-    $ac_shift
-    case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    '') as_fn_error $? "missing file argument" ;;
-    esac
-    as_fn_append CONFIG_FILES " '$ac_optarg'"
-    ac_need_defaults=false;;
-  --he | --h |  --help | --hel | -h )
-    $as_echo "$ac_cs_usage"; exit ;;
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil | --si | --s)
-    ac_cs_silent=: ;;
-
-  # This is an error.
-  -*) as_fn_error $? "unrecognized option: \`$1'
-Try \`$0 --help' for more information." ;;
-
-  *) as_fn_append ac_config_targets " $1"
-     ac_need_defaults=false ;;
-
-  esac
-  shift
-done
-
-ac_configure_extra_args=
-
-if $ac_cs_silent; then
-  exec 6>/dev/null
-  ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-if \$ac_cs_recheck; then
-  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
-  shift
-  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
-  CONFIG_SHELL='$SHELL'
-  export CONFIG_SHELL
-  exec "\$@"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-exec 5>>config.log
-{
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-  $as_echo "$ac_log"
-} >&5
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-#
-# INIT-COMMANDS
-#
-AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
-
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`'
-macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`'
-enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`'
-enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`'
-pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`'
-enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`'
-host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`'
-host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`'
-host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`'
-build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`'
-build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`'
-build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`'
-SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`'
-Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`'
-GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`'
-EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`'
-FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`'
-LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`'
-NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`'
-LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`'
-max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`'
-ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`'
-exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`'
-lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`'
-lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`'
-lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`'
-reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`'
-reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`'
-deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`'
-file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`'
-AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`'
-AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`'
-STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`'
-RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`'
-old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`'
-CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`'
-compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`'
-GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`'
-objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`'
-SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`'
-ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`'
-MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`'
-need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`'
-DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`'
-NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`'
-LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`'
-OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`'
-OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`'
-libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`'
-shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`'
-enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`'
-export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
-whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
-compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`'
-old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`'
-allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`'
-no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`'
-inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`'
-link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`'
-fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`'
-always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`'
-export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`'
-include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`'
-prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`'
-variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`'
-need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`'
-need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`'
-version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`'
-runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`'
-shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`'
-shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`'
-libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`'
-library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`'
-soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`'
-postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`'
-sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`'
-sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`'
-enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`'
-enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`'
-enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`'
-old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`'
-striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`'
-
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# Quote evaled strings.
-for var in SED \
-GREP \
-EGREP \
-FGREP \
-LD \
-NM \
-LN_S \
-lt_SP2NL \
-lt_NL2SP \
-reload_flag \
-OBJDUMP \
-deplibs_check_method \
-file_magic_cmd \
-AR \
-AR_FLAGS \
-STRIP \
-RANLIB \
-CC \
-CFLAGS \
-compiler \
-lt_cv_sys_global_symbol_pipe \
-lt_cv_sys_global_symbol_to_cdecl \
-lt_cv_sys_global_symbol_to_c_name_address \
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
-SHELL \
-ECHO \
-lt_prog_compiler_no_builtin_flag \
-lt_prog_compiler_wl \
-lt_prog_compiler_pic \
-lt_prog_compiler_static \
-lt_cv_prog_compiler_c_o \
-need_locks \
-DSYMUTIL \
-NMEDIT \
-LIPO \
-OTOOL \
-OTOOL64 \
-shrext_cmds \
-export_dynamic_flag_spec \
-whole_archive_flag_spec \
-compiler_needs_object \
-with_gnu_ld \
-allow_undefined_flag \
-no_undefined_flag \
-hardcode_libdir_flag_spec \
-hardcode_libdir_flag_spec_ld \
-hardcode_libdir_separator \
-fix_srcfile_path \
-exclude_expsyms \
-include_expsyms \
-file_list_spec \
-variables_saved_for_relink \
-libname_spec \
-library_names_spec \
-soname_spec \
-finish_eval \
-old_striplib \
-striplib; do
-    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
-    *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Double-quote double-evaled strings.
-for var in reload_cmds \
-old_postinstall_cmds \
-old_postuninstall_cmds \
-old_archive_cmds \
-extract_expsyms_cmds \
-old_archive_from_new_cmds \
-old_archive_from_expsyms_cmds \
-archive_cmds \
-archive_expsym_cmds \
-module_cmds \
-module_expsym_cmds \
-export_symbols_cmds \
-prelink_cmds \
-postinstall_cmds \
-postuninstall_cmds \
-finish_cmds \
-sys_lib_search_path_spec \
-sys_lib_dlsearch_path_spec; do
-    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
-    *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Fix-up fallback echo if it was mangled by the above quoting rules.
-case \$lt_ECHO in
-*'\\\$0 --fallback-echo"')  lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\`
-  ;;
-esac
-
-ac_aux_dir='$ac_aux_dir'
-xsi_shell='$xsi_shell'
-lt_shell_append='$lt_shell_append'
-
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-
-    PACKAGE='$PACKAGE'
-    VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
-    RM='$RM'
-    ofile='$ofile'
-
-
-
-
-ax_create_pkgconfig_generate="$ax_create_pkgconfig_generate"
-pkgconfig_prefix='$prefix'
-pkgconfig_execprefix='$exec_prefix'
-pkgconfig_bindir='$bindir'
-pkgconfig_libdir='$libdir'
-pkgconfig_includedir='$includedir'
-pkgconfig_datarootdir='$datarootdir'
-pkgconfig_datadir='$datadir'
-pkgconfig_sysconfdir='$sysconfdir'
-pkgconfig_suffix='$ax_create_pkgconfig_suffix'
-pkgconfig_package='$PACKAGE_NAME'
-pkgconfig_libname='$ax_create_pkgconfig_libname'
-pkgconfig_description='$ax_create_pkgconfig_description'
-pkgconfig_version='$ax_create_pkgconfig_version'
-pkgconfig_requires='$ax_create_pkgconfig_requires'
-pkgconfig_libs='$ax_create_pkgconfig_libs'
-pkgconfig_ldflags='$ax_create_pkgconfig_ldflags'
-pkgconfig_cppflags='$ax_create_pkgconfig_cppflags'
-pkgconfig_src_libdir='$ax_create_pkgconfig_src_libdir'
-pkgconfig_src_headers='$ax_create_pkgconfig_src_headers'
-
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-
-# Handling of arguments.
-for ac_config_target in $ac_config_targets
-do
-  case $ac_config_target in
-    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
-    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
-    "$ax_create_pkgconfig_generate") CONFIG_COMMANDS="$CONFIG_COMMANDS $ax_create_pkgconfig_generate" ;;
-    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-    "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;;
-    "autoconf/Doxyfile") CONFIG_FILES="$CONFIG_FILES autoconf/Doxyfile" ;;
-    "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
-    "source/version.c") CONFIG_FILES="$CONFIG_FILES source/version.c" ;;
-    "include/cloog/version.h") CONFIG_FILES="$CONFIG_FILES include/cloog/version.h" ;;
-    "genversion.sh") CONFIG_FILES="$CONFIG_FILES genversion.sh" ;;
-    "version.h") CONFIG_COMMANDS="$CONFIG_COMMANDS version.h" ;;
-    "doc/gitversion.texi") CONFIG_COMMANDS="$CONFIG_COMMANDS doc/gitversion.texi" ;;
-
-  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;;
-  esac
-done
-
-
-# If the user did not use the arguments to specify the items to instantiate,
-# then the envvar interface is used.  Set only those that are not.
-# We use the long form for the default assignment because of an extremely
-# bizarre bug on SunOS 4.1.3.
-if $ac_need_defaults; then
-  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
-  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
-fi
-
-# Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason against having it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Hook for its removal unless debugging.
-# Note that there is a small window in which the directory will not be cleaned:
-# after its creation but before its name has been assigned to `$tmp'.
-$debug ||
-{
-  tmp=
-  trap 'exit_status=$?
-  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
-' 0
-  trap 'as_fn_exit 1' 1 2 13 15
-}
-# Create a (secure) tmp directory for tmp files.
-
-{
-  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
-  test -n "$tmp" && test -d "$tmp"
-}  ||
-{
-  tmp=./conf$$-$RANDOM
-  (umask 077 && mkdir "$tmp")
-} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
-
-# Set up the scripts for CONFIG_FILES section.
-# No need to generate them if there are no CONFIG_FILES.
-# This happens for instance with `./config.status config.h'.
-if test -n "$CONFIG_FILES"; then
-
-
-ac_cr=`echo X | tr X '\015'`
-# On cygwin, bash can eat \r inside `` if the user requested igncr.
-# But we know of no other shell where ac_cr would be empty at this
-# point, so we can use a bashism as a fallback.
-if test "x$ac_cr" = x; then
-  eval ac_cr=\$\'\\r\'
-fi
-ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
-if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
-  ac_cs_awk_cr='\\r'
-else
-  ac_cs_awk_cr=$ac_cr
-fi
-
-echo 'BEGIN {' >"$tmp/subs1.awk" &&
-_ACEOF
-
-
-{
-  echo "cat >conf$$subs.awk <<_ACEOF" &&
-  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
-  echo "_ACEOF"
-} >conf$$subs.sh ||
-  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
-ac_delim='%!_!# '
-for ac_last_try in false false false false false :; do
-  . ./conf$$subs.sh ||
-    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-
-  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
-  if test $ac_delim_n = $ac_delim_num; then
-    break
-  elif $ac_last_try; then
-    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-  else
-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
-  fi
-done
-rm -f conf$$subs.sh
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
-_ACEOF
-sed -n '
-h
-s/^/S["/; s/!.*/"]=/
-p
-g
-s/^[^!]*!//
-:repl
-t repl
-s/'"$ac_delim"'$//
-t delim
-:nl
-h
-s/\(.\{148\}\)..*/\1/
-t more1
-s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
-p
-n
-b repl
-:more1
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t nl
-:delim
-h
-s/\(.\{148\}\)..*/\1/
-t more2
-s/["\\]/\\&/g; s/^/"/; s/$/"/
-p
-b
-:more2
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t delim
-' <conf$$subs.awk | sed '
-/^[^""]/{
-  N
-  s/\n//
-}
-' >>$CONFIG_STATUS || ac_write_fail=1
-rm -f conf$$subs.awk
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-_ACAWK
-cat >>"\$tmp/subs1.awk" <<_ACAWK &&
-  for (key in S) S_is_set[key] = 1
-  FS = ""
-
-}
-{
-  line = $ 0
-  nfields = split(line, field, "@")
-  substed = 0
-  len = length(field[1])
-  for (i = 2; i < nfields; i++) {
-    key = field[i]
-    keylen = length(key)
-    if (S_is_set[key]) {
-      value = S[key]
-      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
-      len += length(value) + length(field[++i])
-      substed = 1
-    } else
-      len += 1 + keylen
-  }
-
-  print line
-}
-
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
-  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
-else
-  cat
-fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
-  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
-_ACEOF
-
-# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
-# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
-h
-s///
-s/^/:/
-s/[	 ]*$/:/
-s/:\$(srcdir):/:/g
-s/:\${srcdir}:/:/g
-s/:@srcdir@:/:/g
-s/^:*//
-s/:*$//
-x
-s/\(=[	 ]*\).*/\1/
-G
-s/\n//
-s/^[^=]*=[	 ]*$//
-}'
-fi
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-fi # test -n "$CONFIG_FILES"
-
-
-eval set X "  :F $CONFIG_FILES      :C $CONFIG_COMMANDS"
-shift
-for ac_tag
-do
-  case $ac_tag in
-  :[FHLC]) ac_mode=$ac_tag; continue;;
-  esac
-  case $ac_mode$ac_tag in
-  :[FHL]*:*);;
-  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;;
-  :[FH]-) ac_tag=-:-;;
-  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
-  esac
-  ac_save_IFS=$IFS
-  IFS=:
-  set x $ac_tag
-  IFS=$ac_save_IFS
-  shift
-  ac_file=$1
-  shift
-
-  case $ac_mode in
-  :L) ac_source=$1;;
-  :[FH])
-    ac_file_inputs=
-    for ac_f
-    do
-      case $ac_f in
-      -) ac_f="$tmp/stdin";;
-      *) # Look for the file first in the build tree, then in the source tree
-	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
-	 # because $ac_f cannot contain `:'.
-	 test -f "$ac_f" ||
-	   case $ac_f in
-	   [\\/$]*) false;;
-	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
-	   esac ||
-	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;;
-      esac
-      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
-      as_fn_append ac_file_inputs " '$ac_f'"
-    done
-
-    # Let's still pretend it is `configure' which instantiates (i.e., don't
-    # use $as_me), people would be surprised to read:
-    #    /* config.h.  Generated by config.status.  */
-    configure_input='Generated from '`
-	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
-	`' by configure.'
-    if test x"$ac_file" != x-; then
-      configure_input="$ac_file.  $configure_input"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
-    fi
-    # Neutralize special characters interpreted by sed in replacement strings.
-    case $configure_input in #(
-    *\&* | *\|* | *\\* )
-       ac_sed_conf_input=`$as_echo "$configure_input" |
-       sed 's/[\\\\&|]/\\\\&/g'`;; #(
-    *) ac_sed_conf_input=$configure_input;;
-    esac
-
-    case $ac_tag in
-    *:-:* | *:-) cat >"$tmp/stdin" \
-      || as_fn_error $? "could not create $ac_file" "$LINENO" 5  ;;
-    esac
-    ;;
-  esac
-
-  ac_dir=`$as_dirname -- "$ac_file" ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  as_dir="$ac_dir"; as_fn_mkdir_p
-  ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-
-  case $ac_mode in
-  :F)
-  #
-  # CONFIG_FILE
-  #
-
-  case $INSTALL in
-  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
-  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
-  esac
-  ac_MKDIR_P=$MKDIR_P
-  case $MKDIR_P in
-  [\\/$]* | ?:[\\/]* ) ;;
-  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
-  esac
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# If the template does not know about datarootdir, expand it.
-# FIXME: This hack should be removed a few years after 2.60.
-ac_datarootdir_hack=; ac_datarootdir_seen=
-ac_sed_dataroot='
-/datarootdir/ {
-  p
-  q
-}
-/@datadir@/p
-/@docdir@/p
-/@infodir@/p
-/@localedir@/p
-/@mandir@/p'
-case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
-*datarootdir*) ac_datarootdir_seen=yes;;
-*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-  ac_datarootdir_hack='
-  s&@datadir@&$datadir&g
-  s&@docdir@&$docdir&g
-  s&@infodir@&$infodir&g
-  s&@localedir@&$localedir&g
-  s&@mandir@&$mandir&g
-  s&\\\${datarootdir}&$datarootdir&g' ;;
-esac
-_ACEOF
-
-# Neutralize VPATH when `$srcdir' = `.'.
-# Shell code in configure.ac might set extrasub.
-# FIXME: do we really want to maintain this feature?
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_sed_extra="$ac_vpsub
-$extrasub
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s|@configure_input@|$ac_sed_conf_input|;t t
-s&@top_builddir@&$ac_top_builddir_sub&;t t
-s&@top_build_prefix@&$ac_top_build_prefix&;t t
-s&@srcdir@&$ac_srcdir&;t t
-s&@abs_srcdir@&$ac_abs_srcdir&;t t
-s&@top_srcdir@&$ac_top_srcdir&;t t
-s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
-s&@builddir@&$ac_builddir&;t t
-s&@abs_builddir@&$ac_abs_builddir&;t t
-s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
-s&@INSTALL@&$ac_INSTALL&;t t
-s&@MKDIR_P@&$ac_MKDIR_P&;t t
-$ac_datarootdir_hack
-"
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
-  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
-
-test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
-  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
-  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined" >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined" >&2;}
-
-  rm -f "$tmp/stdin"
-  case $ac_file in
-  -) cat "$tmp/out" && rm -f "$tmp/out";;
-  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
-  esac \
-  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
- ;;
-
-
-  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
-$as_echo "$as_me: executing $ac_file commands" >&6;}
- ;;
-  esac
-
-
-  case $ac_file$ac_mode in
-    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
-  # are listed without --file.  Let's play safe and only enable the eval
-  # if we detect the quoting.
-  case $CONFIG_FILES in
-  *\'*) eval set x "$CONFIG_FILES" ;;
-  *)   set x $CONFIG_FILES ;;
-  esac
-  shift
-  for mf
-  do
-    # Strip MF so we end up with the name of the file.
-    mf=`echo "$mf" | sed -e 's/:.*$//'`
-    # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
-    # some people rename them; so instead we look at the file content.
-    # Grep'ing the first line is not enough: some people post-process
-    # each Makefile.in and add a new line on top of each file to say so.
-    # Grep'ing the whole file is not good either: AIX grep has a line
-    # limit of 2048, but all sed's we know have understand at least 4000.
-    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-      dirpart=`$as_dirname -- "$mf" ||
-$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$mf" : 'X\(//\)[^/]' \| \
-	 X"$mf" : 'X\(//\)$' \| \
-	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$mf" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-    else
-      continue
-    fi
-    # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
-    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-    test -z "$DEPDIR" && continue
-    am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
-    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
-    # Find all dependency output files, they are included files with
-    # $(DEPDIR) in their names.  We invoke sed twice because it is the
-    # simplest approach to changing $(DEPDIR) to its actual value in the
-    # expansion.
-    for file in `sed -n "
-      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-      # Make sure the directory exists.
-      test -f "$dirpart/$file" && continue
-      fdir=`$as_dirname -- "$file" ||
-$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$file" : 'X\(//\)[^/]' \| \
-	 X"$file" : 'X\(//\)$' \| \
-	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      as_dir=$dirpart/$fdir; as_fn_mkdir_p
-      # echo "creating $dirpart/$file"
-      echo '# dummy' > "$dirpart/$file"
-    done
-  done
-}
- ;;
-    "libtool":C)
-
-    # See if we are running on zsh, and set the options which allow our
-    # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
-      setopt NO_GLOB_SUBST
-    fi
-
-    cfgfile="${ofile}T"
-    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
-    $RM "$cfgfile"
-
-    cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $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.
-#
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008 Free Software Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-
-# The names of the tagged configurations supported by this script.
-available_tags=""
-
-# ### BEGIN LIBTOOL CONFIG
-
-# Which release of libtool.m4 was used?
-macro_version=$macro_version
-macro_revision=$macro_revision
-
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
-
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
-
-# What type of objects to build.
-pic_mode=$pic_mode
-
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
-
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
-
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
-
-# A sed program that does not truncate output.
-SED=$lt_SED
-
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="\$SED -e 1s/^X//"
-
-# A grep program that handles long lines.
-GREP=$lt_GREP
-
-# An ERE matcher.
-EGREP=$lt_EGREP
-
-# A literal string matcher.
-FGREP=$lt_FGREP
-
-# A BSD- or MS-compatible name lister.
-NM=$lt_NM
-
-# Whether we need soft or hard links.
-LN_S=$lt_LN_S
-
-# What is the maximum length of a command?
-max_cmd_len=$max_cmd_len
-
-# Object file suffix (normally "o").
-objext=$ac_objext
-
-# Executable file suffix (normally "").
-exeext=$exeext
-
-# whether the shell understands "unset".
-lt_unset=$lt_unset
-
-# turn spaces into newlines.
-SP2NL=$lt_lt_SP2NL
-
-# turn newlines into spaces.
-NL2SP=$lt_lt_NL2SP
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
-
-# An object symbol dumper.
-OBJDUMP=$lt_OBJDUMP
-
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
-
-# Command to use when deplibs_check_method == "file_magic".
-file_magic_cmd=$lt_file_magic_cmd
-
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
-
-# A symbol stripping program.
-STRIP=$lt_STRIP
-
-# Commands used to install an old-style archive.
-RANLIB=$lt_RANLIB
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
-
-# A C compiler.
-LTCC=$lt_CC
-
-# LTCC compiler flags.
-LTCFLAGS=$lt_CFLAGS
-
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
-
-# Transform the output of nm in a proper C declaration.
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
-
-# Transform the output of nm in a C name address pair.
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
-
-# Transform the output of nm in a C name address pair when lib prefix is needed.
-global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
-
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
-
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
-
-# An echo program that does not interpret backslashes.
-ECHO=$lt_ECHO
-
-# Used to examine libraries when file_magic_cmd begins with "file".
-MAGIC_CMD=$MAGIC_CMD
-
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
-
-# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
-DSYMUTIL=$lt_DSYMUTIL
-
-# Tool to change global to local symbols on Mac OS X.
-NMEDIT=$lt_NMEDIT
-
-# Tool to manipulate fat objects and archives on Mac OS X.
-LIPO=$lt_LIPO
-
-# ldd/readelf like tool for Mach-O binaries on Mac OS X.
-OTOOL=$lt_OTOOL
-
-# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
-OTOOL64=$lt_OTOOL64
-
-# Old archive suffix (normally "a").
-libext=$libext
-
-# Shared library suffix (normally ".so").
-shrext_cmds=$lt_shrext_cmds
-
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
-
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at link time.
-variables_saved_for_relink=$lt_variables_saved_for_relink
-
-# Do we need the "lib" prefix for modules?
-need_lib_prefix=$need_lib_prefix
-
-# Do we need a version for libraries?
-need_version=$need_version
-
-# Library versioning type.
-version_type=$version_type
-
-# Shared library runtime path variable.
-runpath_var=$runpath_var
-
-# Shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
-
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
-
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME
-library_names_spec=$lt_library_names_spec
-
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
-
-# Command to use after installation of a shared archive.
-postinstall_cmds=$lt_postinstall_cmds
-
-# Command to use after uninstallation of a shared archive.
-postuninstall_cmds=$lt_postuninstall_cmds
-
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
-
-# As "finish_cmds", except a single script fragment to be evaled but
-# not shown.
-finish_eval=$lt_finish_eval
-
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
-
-# Compile-time system search path for libraries.
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
-
-# Run-time system search path for libraries.
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
-
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
-
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
-
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
-
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
-
-
-# The linker used to build libraries.
-LD=$lt_LD
-
-# Commands used to build an old-style archive.
-old_archive_cmds=$lt_old_archive_cmds
-
-# A language specific compiler.
-CC=$lt_compiler
-
-# Is the compiler the GNU compiler?
-with_gcc=$GCC
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
-
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc
-
-# Whether or not to disallow shared libs when runtime libs are static.
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec
-
-# Whether the compiler copes with passing no objects directly.
-compiler_needs_object=$lt_compiler_needs_object
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
-
-# Commands used to build a shared archive.
-archive_cmds=$lt_archive_cmds
-archive_expsym_cmds=$lt_archive_expsym_cmds
-
-# Commands used to build a loadable module if different from building
-# a shared archive.
-module_cmds=$lt_module_cmds
-module_expsym_cmds=$lt_module_expsym_cmds
-
-# Whether we are building with GNU ld or not.
-with_gnu_ld=$lt_with_gnu_ld
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag
-
-# Flag that enforces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
-
-# If ld is used when linking, flag to hardcode \$libdir into a binary
-# during linking.  This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
-
-# Whether we need a single "-rpath" flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary.
-hardcode_direct=$hardcode_direct
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
-# library is relocated.
-hardcode_direct_absolute=$hardcode_direct_absolute
-
-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-# into the resulting binary.
-hardcode_minus_L=$hardcode_minus_L
-
-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-# into the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var
-
-# Set to "yes" if building a shared library automatically hardcodes DIR
-# into the library and all subsequent libraries and executables linked
-# against it.
-hardcode_automatic=$hardcode_automatic
-
-# Set to yes if linker adds runtime paths of dependent libraries
-# to runtime path list.
-inherit_rpath=$inherit_rpath
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs
-
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path=$lt_fix_srcfile_path
-
-# Set to "yes" if exported symbols are required.
-always_export_symbols=$always_export_symbols
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms
-
-# Commands necessary for linking programs (against libraries) with templates.
-prelink_cmds=$lt_prelink_cmds
-
-# Specify filename containing input files.
-file_list_spec=$lt_file_list_spec
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action
-
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
-  case $host_os in
-  aix3*)
-    cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-_LT_EOF
-    ;;
-  esac
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  case $xsi_shell in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result="${1##*/}"
-}
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-  func_basename_result="${1##*/}"
-}
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-func_stripname ()
-{
-  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-  # positional parameters, so assign one to ordinary parameter first.
-  func_stripname_result=${3}
-  func_stripname_result=${func_stripname_result#"${1}"}
-  func_stripname_result=${func_stripname_result%"${2}"}
-}
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=${1%%=*}
-  func_opt_split_arg=${1#*=}
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  case ${1} in
-    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-    *)    func_lo2o_result=${1} ;;
-  esac
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=${1%.*}.lo
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=$(( $* ))
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=${#1}
-}
-
-_LT_EOF
-    ;;
-  *) # Bourne compatible functions.
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
-}
-
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-  case ${2} in
-    .*) func_stripname_result=`$ECHO "X${3}" \
-           | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
-    *)  func_stripname_result=`$ECHO "X${3}" \
-           | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
-  esac
-}
-
-# sed scripts:
-my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q'
-my_sed_long_arg='1s/^-[^=]*=//'
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
-  func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'`
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=`expr "$@"`
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
-}
-
-_LT_EOF
-esac
-
-case $lt_shell_append in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$1+=\$2"
-}
-_LT_EOF
-    ;;
-  *)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$1=\$$1\$2"
-}
-
-_LT_EOF
-    ;;
-  esac
-
-
-  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  mv -f "$cfgfile" "$ofile" ||
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
-
- ;;
-    "$ax_create_pkgconfig_generate":C)
-pkgconfig_generate="$ax_create_pkgconfig_generate"
-if test ! -f "$pkgconfig_generate.in"
-then generate="true"
-elif grep ' generated by configure ' $pkgconfig_generate.in >/dev/null
-then generate="true"
-else generate="false";
-fi
-if $generate ; then
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $pkgconfig_generate.in" >&5
-$as_echo "$as_me: creating $pkgconfig_generate.in" >&6;}
-cat > $pkgconfig_generate.in <<AXEOF
-# generated by configure / remove this line to disable regeneration
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-bindir=@bindir@
-libdir=@libdir@
-datarootdir=@datarootdir@
-datadir=@datadir@
-sysconfdir=@sysconfdir@
-includedir=@includedir@
-package=@PACKAGE@
-suffix=@suffix@
-
-Name: @PACKAGE_NAME@
-Description: @PACKAGE_DESCRIPTION@
-Version: @PACKAGE_VERSION@
-Requires: @PACKAGE_REQUIRES@
-Libs: -L\${libdir} @LDFLAGS@ @LIBS@
-Cflags: -I\${includedir} @CPPFLAGS@
-AXEOF
-fi # DONE generate $pkgconfig_generate.in
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $pkgconfig_generate" >&5
-$as_echo "$as_me: creating $pkgconfig_generate" >&6;}
-cat >conftest.sed <<AXEOF
-s|@prefix@|${pkgconfig_prefix}|
-s|@exec_prefix@|${pkgconfig_execprefix}|
-s|@bindir@|${pkgconfig_bindir}|
-s|@libdir@|${pkgconfig_libdir}|
-s|@datarootdir@|${pkgconfig_datarootdir}|
-s|@datadir@|${pkgconfig_datadir}|
-s|@sysconfdir@|${pkgconfig_sysconfdir}|
-s|@includedir@|${pkgconfig_includedir}|
-s|@suffix@|${pkgconfig_suffix}|
-s|@PACKAGE@|${pkgconfig_package}|
-s|@PACKAGE_NAME@|${pkgconfig_libname}|
-s|@PACKAGE_DESCRIPTION@|${pkgconfig_description}|
-s|@PACKAGE_VERSION@|${pkgconfig_version}|
-s|@PACKAGE_REQUIRES@|${pkgconfig_requires}|
-s|@LIBS@|${pkgconfig_libs}|
-s|@LDFLAGS@|${pkgconfig_ldflags}|
-s|@CPPFLAGS@|${pkgconfig_cppflags}|
-AXEOF
-sed -f conftest.sed  $pkgconfig_generate.in > $pkgconfig_generate
-if test ! -s $pkgconfig_generate ; then
-    as_fn_error $? "$pkgconfig_generate is empty" "$LINENO" 5
-fi ; rm conftest.sed # DONE generate $pkgconfig_generate
-pkgconfig_uninstalled=`echo $pkgconfig_generate |sed 's/.pc$/-uninstalled.pc/'`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $pkgconfig_uninstalled" >&5
-$as_echo "$as_me: creating $pkgconfig_uninstalled" >&6;}
-cat >conftest.sed <<AXEOF
-s|@prefix@|${pkgconfig_prefix}|
-s|@exec_prefix@|${pkgconfig_execprefix}|
-s|@bindir@|${pkgconfig_bindir}|
-s|@libdir@|${pkgconfig_src_libdir}|
-s|@datarootdir@|${pkgconfig_datarootdir}|
-s|@datadir@|${pkgconfig_datadir}|
-s|@sysconfdir@|${pkgconfig_sysconfdir}|
-s|@includedir@|${pkgconfig_src_headers}|
-s|@suffix@|${pkgconfig_suffix}|
-s|@PACKAGE@|${pkgconfig_package}|
-s|@PACKAGE_NAME@|${pkgconfig_libname}|
-s|@PACKAGE_DESCRIPTION@|${pkgconfig_description}|
-s|@PACKAGE_VERSION@|${pkgconfig_version}|
-s|@PACKAGE_REQUIRES@|${pkgconfig_requires}|
-s|@LIBS@|${pkgconfig_libs}|
-s|@LDFLAGS@|${pkgconfig_ldflags}|
-s|@CPPFLAGS@|${pkgconfig_cppflags}|
-AXEOF
-sed -f conftest.sed $pkgconfig_generate.in > $pkgconfig_uninstalled
-if test ! -s $pkgconfig_uninstalled ; then
-    as_fn_error $? "$pkgconfig_uninstalled is empty" "$LINENO" 5
-fi ; rm conftest.sed # DONE generate $pkgconfig_uninstalled
-           pkgconfig_requires_add=`echo ${pkgconfig_requires}`
-if test ".$pkgconfig_requires_add" != "." ; then
-           pkgconfig_requires_add="pkg-config $pkgconfig_requires_add"
-    else   pkgconfig_requires_add=":" ; fi
-pkgconfig_uninstalled=`echo $pkgconfig_generate |sed 's/.pc$/-uninstalled.sh/'`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $pkgconfig_uninstalled" >&5
-$as_echo "$as_me: creating $pkgconfig_uninstalled" >&6;}
-cat >conftest.sed <<AXEOF
-s|@prefix@|\"${pkgconfig_prefix}\"|
-s|@exec_prefix@|\"${pkgconfig_execprefix}\"|
-s|@bindir@|\"${pkgconfig_bindir}\"|
-s|@libdir@|\"${pkgconfig_src_libdir}\"|
-s|@datarootdir@|\"${pkgconfig_datarootdir}\"|
-s|@datadir@|\"${pkgconfig_datadir}\"|
-s|@sysconfdir@|\"${pkgconfig_sysconfdir}\"|
-s|@includedir@|\"${pkgconfig_src_headers}\"|
-s|@suffix@|\"${pkgconfig_suffix}\"|
-s|@PACKAGE@|\"${pkgconfig_package}\"|
-s|@PACKAGE_NAME@|\"${pkgconfig_libname}\"|
-s|@PACKAGE_DESCRIPTION@|\"${pkgconfig_description}\"|
-s|@PACKAGE_VERSION@|\"${pkgconfig_version}\"|
-s|@PACKAGE_REQUIRES@|\"${pkgconfig_requires}\"|
-s|@LIBS@|\"${pkgconfig_libs}\"|
-s|@LDFLAGS@|\"${pkgconfig_ldflags}\"|
-s|@CPPFLAGS@|\"${pkgconfig_cppflags}\"|
-s>Name:>for option\\; do case \"\$option\" in --list-all|--name) echo >
-s>Description: *>\\;\\; --help) pkg-config --help \\; echo Buildscript Of >
-s>Version: *>\\;\\; --modversion|--version) echo >
-s>Requires:>\\;\\; --requires) echo $pkgconfig_requires_add>
-s>Libs: *>\\;\\; --libs) echo >
-s>Cflags: *>\\;\\; --cflags) echo >
-/--libs)/a\\
-       $pkgconfig_requires_add
-/--cflags)/a\\
-       $pkgconfig_requires_add\\
-;; --variable=*) eval echo '\$'\`echo \$option | sed -e 's/.*=//'\`\\
-;; --uninstalled) exit 0 \\
-;; *) ;; esac done
-AXEOF
-sed -f conftest.sed  $pkgconfig_generate.in > $pkgconfig_uninstalled
-if test ! -s $pkgconfig_uninstalled ; then
-    as_fn_error $? "$pkgconfig_uninstalled is empty" "$LINENO" 5
-fi ; rm conftest.sed # DONE generate $pkgconfig_uninstalled
- ;;
-    "genversion.sh":F) chmod +x genversion.sh ;;
-    "version.h":C) echo '#define CLOOG_HEAD "'`./genversion.sh`'"' > version.h ;;
-    "doc/gitversion.texi":C) echo '@set VERSION '`./genversion.sh`'' > doc/gitversion.texi ;;
-
-  esac
-done # for ac_tag
-
-
-as_fn_exit 0
-_ACEOF
-ac_clean_files=$ac_clean_files_save
-
-test $ac_write_fail = 0 ||
-  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
-
-
-	ac_configure_args="$ac_configure_args $cloog_configure_args"
-
-
-# configure is writing to config.log, and then calls config.status.
-# config.status does its own redirection, appending to config.log.
-# Unfortunately, on DOS this fails, as config.log is still kept open
-# by configure, so config.status won't be able to write to it; its
-# output is simply discarded.  So we exec the FD to /dev/null,
-# effectively closing config.log, so it can be properly (re)opened and
-# appended to by config.status.  When coming back to configure, we
-# need to make the FD available again.
-if test "$no_create" != yes; then
-  ac_cs_success=:
-  ac_config_status_args=
-  test "$silent" = yes &&
-    ac_config_status_args="$ac_config_status_args --quiet"
-  exec 5>/dev/null
-  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
-  exec 5>>config.log
-  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
-  # would make configure fail if this is the last instruction.
-  $ac_cs_success || as_fn_exit 1
-fi
-
-#
-# CONFIG_SUBDIRS section.
-#
-if test "$no_recursion" != yes; then
-
-  # Remove --cache-file, --srcdir, and --disable-option-checking arguments
-  # so they do not pile up.
-  ac_sub_configure_args=
-  ac_prev=
-  eval "set x $ac_configure_args"
-  shift
-  for ac_arg
-  do
-    if test -n "$ac_prev"; then
-      ac_prev=
-      continue
-    fi
-    case $ac_arg in
-    -cache-file | --cache-file | --cache-fil | --cache-fi \
-    | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-      ac_prev=cache_file ;;
-    -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-    | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \
-    | --c=*)
-      ;;
-    --config-cache | -C)
-      ;;
-    -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-      ac_prev=srcdir ;;
-    -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-      ;;
-    -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-      ac_prev=prefix ;;
-    -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-      ;;
-    --disable-option-checking)
-      ;;
-    *)
-      case $ac_arg in
-      *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
-      esac
-      as_fn_append ac_sub_configure_args " '$ac_arg'" ;;
-    esac
-  done
-
-  # Always prepend --prefix to ensure using the same prefix
-  # in subdir configurations.
-  ac_arg="--prefix=$prefix"
-  case $ac_arg in
-  *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
-  esac
-  ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args"
-
-  # Pass --silent
-  if test "$silent" = yes; then
-    ac_sub_configure_args="--silent $ac_sub_configure_args"
-  fi
-
-  # Always prepend --disable-option-checking to silence warnings, since
-  # different subdirs can have different --enable and --with options.
-  ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args"
-
-  ac_popdir=`pwd`
-  for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue
-
-    # Do not complain, so a configure script can configure whichever
-    # parts of a large source tree are present.
-    test -d "$srcdir/$ac_dir" || continue
-
-    ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)"
-    $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5
-    $as_echo "$ac_msg" >&6
-    as_dir="$ac_dir"; as_fn_mkdir_p
-    ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-
-    cd "$ac_dir"
-
-    # Check for guested configure; otherwise get Cygnus style configure.
-    if test -f "$ac_srcdir/configure.gnu"; then
-      ac_sub_configure=$ac_srcdir/configure.gnu
-    elif test -f "$ac_srcdir/configure"; then
-      ac_sub_configure=$ac_srcdir/configure
-    elif test -f "$ac_srcdir/configure.in"; then
-      # This should be Cygnus configure.
-      ac_sub_configure=$ac_aux_dir/configure
-    else
-      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5
-$as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;}
-      ac_sub_configure=
-    fi
-
-    # The recursion is here.
-    if test -n "$ac_sub_configure"; then
-      # Make the cache file name correct relative to the subdirectory.
-      case $cache_file in
-      [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;;
-      *) # Relative name.
-	ac_sub_cache_file=$ac_top_build_prefix$cache_file ;;
-      esac
-
-      { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5
-$as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;}
-      # The eval makes quoting arguments work.
-      eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \
-	   --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" ||
-	as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5
-    fi
-
-    cd "$ac_popdir"
-  done
-fi
-if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
-fi
-
-
-
-echo "             /*-----------------------------------------------*"
-echo "              *           CLooG configuration is OK           *"
-echo "              *-----------------------------------------------*/"
-echo "It appears that your system is OK to start CLooG compilation. You need"
-echo "now to type \"make\". After compilation, you should check CLooG by typing"
-echo "\"make check\". If no problem occur, you can type \"make uninstall\" if"
-echo "you are upgrading an old version. Lastly type \"make install\" to install"
-echo "CLooG on your system (log as root if necessary)."
diff --git a/cloog-0.17.0/configure.ac b/cloog-0.17.0/configure.ac
deleted file mode 100644
index e7001d3..0000000
--- a/cloog-0.17.0/configure.ac
+++ /dev/null
@@ -1,263 +0,0 @@
-
-dnl /**-------------------------------------------------------------------**
-dnl  **                              CLooG                                **
-dnl  **-------------------------------------------------------------------**
-dnl  **                           configure.ac                            **
-dnl  **-------------------------------------------------------------------**
-dnl  **                   First version: august 7th 2002                  **
-dnl  **-------------------------------------------------------------------**/
-dnl
-dnl Input file for autoconf to build a configuration shellscript.
-dnl To build the configure script from the CLooG's top-level directory, use
-dnl autoconf -l autoconf autoconf/configure.in > configure
-dnl if it doesn't work (invalid option -l) try -I instead
-dnl autoconf -I autoconf autoconf/configure.in > configure
-
-dnl /**************************************************************************
-dnl *               CLooG : the Chunky Loop Generator (experimental)          *
-dnl ***************************************************************************
-dnl *                                                                         *
-dnl * Copyright (C) 2001 Cedric Bastoul                                       *
-dnl *                                                                         *
-dnl * This library is free software; you can redistribute it and/or           *
-dnl * modify it under the terms of the GNU Lesser General Public              *
-dnl * License as published by the Free Software Foundation; either            *
-dnl * version 2.1 of the License, or (at your option) any later version.      *
-dnl *                                                                         *
-dnl * This library is distributed in the hope that it will be useful,         *
-dnl * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
-dnl * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU       *
-dnl * Lesser General Public License for more details.                         *
-dnl *                                                                         *
-dnl * You should have received a copy of the GNU Lesser General Public        *
-dnl * License along with this library; if not, write to the Free Software     *
-dnl * Foundation, Inc., 51 Franklin Street, Fifth Floor,                      *
-dnl * Boston, MA  02110-1301  USA                                             *
-dnl *                                                                         *
-dnl * CLooG, the Chunky Loop Generator                                        *
-dnl * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                      *
-dnl *                                                                         *
-dnl ***************************************************************************/
-
-m4_define([version_major], [0])
-m4_define([version_minor], [17])
-m4_define([version_revision], [0])
-
-AC_PREREQ(2.53)
-AC_INIT([cloog], [version_major.version_minor.version_revision],
-	[cloog-development@googlegroups.com])
-AC_CONFIG_SRCDIR(source/cloog.c)
-AC_CONFIG_AUX_DIR(autoconf)
-AC_CONFIG_MACRO_DIR([m4])
-
-VERSION_MAJOR=version_major
-VERSION_MINOR=version_minor
-VERSION_REVISION=version_revision
-AC_SUBST(versioninfo)
-versioninfo=3:0:0
-
-AM_INIT_AUTOMAKE([foreign])
-m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
-
-dnl /**************************************************************************
-dnl  *                              Checking                                  *
-dnl  **************************************************************************/
-
-dnl Checks for programs.
-AC_PROG_CC
-AC_PROG_LN_S
-AC_PROG_MAKE_SET
-AC_CHECK_PROG(CD, cd)
-dnl Configure needs an empty install.sh file with this, i HATE that...
-AC_PROG_INSTALL
-AC_PROG_LIBTOOL
-AC_CHECK_PROG(TEXI2DVI, texi2dvi, texi2dvi, [])
-AM_CONDITIONAL(HAVE_TEXI2DVI, test -n "$TEXI2DVI")
-
-AX_CC_MAXOPT
-AC_SUBST(CFLAGS_WARN)
-AX_CFLAGS_WARN_ALL(CFLAGS_WARN)
-
-dnl Checks for typedefs, structures, and compiler characteristics.
-AC_C_CONST
-AC_TYPE_SIZE_T
-
-
-
-dnl Checks for header files.
-AC_HEADER_STDC
-
-
-dnl Checks for library functions.
-AC_CHECK_FUNCS(strtol)
-
-
-dnl /**************************************************************************
-dnl  *                             Option setting                             *
-dnl  **************************************************************************/
-
-AC_CHECK_FUNCS([getrusage],
-	[AC_DEFINE([CLOOG_RUSAGE], [], [Print time required to generate code])])
-
-AX_SUBMODULE(isl,no|system|build|bundled,bundled)
-BITS="gmp"
-
-dnl /**************************************************************************
-dnl  *                            Where is GMP?                               *
-dnl  **************************************************************************/
-
-AX_SUBMODULE(gmp,system|build,system)
-
-need_get_memory_functions=false
-case "$with_gmp" in
-build)
-    CPPFLAGS="-I$with_gmp_builddir $CPPFLAGS"
-    LDFLAGS="-L$with_gmp_builddir/$lt_cv_objdir $LDFLAGS"
-    ;;
-system)
-    if test "x$with_gmp_prefix" != "x"; then
-	CPPFLAGS="-I$with_gmp_prefix/include $CPPFLAGS"
-    fi
-    
-    if test "$with_gmp_exec_prefix" != "yes" ; then
-	LDFLAGS="-L$with_gmp_exec_prefix/lib $LDFLAGS"
-    fi
-    ;;
-esac
-case "$with_gmp" in
-build|system)
-    AC_CHECK_HEADER(gmp.h,
-                    [],
-                    [AC_MSG_ERROR(Can't find gmp headers.)])
-    AC_CHECK_LIB(gmp,
-                 __gmpz_init,
-                 [LIBS="$LIBS -lgmp"],
-                 [AC_MSG_ERROR(Can't find gmp library.)])
-    AC_CHECK_DECLS(mp_get_memory_functions,[],[
-	    need_get_memory_functions=true
-    ],[#include <gmp.h>])
-    ;;
-esac
-AM_CONDITIONAL(NEED_GET_MEMORY_FUNCTIONS,
-		test x$need_get_memory_functions = xtrue)
-
-dnl /**************************************************************************
-dnl  *                          Where is isl?                                 *
-dnl  **************************************************************************/
-
-AC_SUBST(ISL_CPPFLAGS)
-AC_SUBST(ISL_LDFLAGS)
-AC_SUBST(ISL_LIBS)
-case "$with_isl" in
-bundled)
-	ISL_CPPFLAGS="-I$srcdir/isl/include -Iisl/include"
-	;;
-build)
-	ISL_CPPFLAGS="-I$isl_srcdir/include -I$with_isl_builddir/include"
-	ISL_LIBS="$with_isl_builddir/libisl.la"
-	;;
-system)
-	if test "x$with_isl_prefix" != "x"; then
-		ISL_CPPFLAGS="-I$with_isl_prefix/include"
-	fi
-	if test "x$with_isl_exec_prefix" != "x"; then
-		ISL_LDFLAGS="-L$with_isl_exec_prefix/lib"
-	fi
-	ISL_LIBS="-lisl"
-esac
-AM_CONDITIONAL(BUNDLED_ISL, test $with_isl = bundled)
-AM_CONDITIONAL(NO_ISL, test $with_isl = no)
-
-
-dnl /**************************************************************************
-dnl  *                   Where is the OpenScop Library?                       *
-dnl  **************************************************************************/
-
-AX_SUBMODULE(osl,no|system|build|bundled,no)
-osl_flag="OSL_SUPPORT"
-
-AC_SUBST(OSL_CPPFLAGS)
-AC_SUBST(OSL_LDFLAGS)
-AC_SUBST(OSL_LIBS)
-case "$with_osl" in
-bundled)
-	OSL_CPPFLAGS="-D$osl_flag -I$srcdir/osl/include -Iosl/include"
-	;;
-build)
-	OSL_CPPFLAGS="-D$osl_flag -I$osl_srcdir/include -I$with_osl_builddir/include"
-	OSL_LIBS="$with_osl_builddir/libosl.la"
-	;;
-system)
-	if test "x$with_osl_prefix" != "x"; then
-		OSL_CPPFLAGS="-D$osl_flag -I$with_osl_prefix/include"
-	fi
-	if test "x$with_osl_exec_prefix" != "x"; then
-		OSL_LDFLAGS="-L$with_osl_exec_prefix/lib"
-	fi
-	OSL_LIBS="-losl"
-esac
-AM_CONDITIONAL(BUNDLED_OSL, test $with_osl = bundled)
-AM_CONDITIONAL(NO_OSL, test $with_osl = no)
-
-
-AC_DEFINE([CLOOG_INT_GMP], 1, [Use arbitrary precision integers])
-
-AC_SUBST(GIT_INDEX)
-if test -f $srcdir/.git/HEAD; then
-	GIT_INDEX="\$(top_srcdir)/.git/index"
-fi
-
-
-dnl /**************************************************************************
-dnl  *                            Substitutions                               *
-dnl  **************************************************************************/
-
-
-dnl Substitutions to do in Makefile.in.
-AC_SUBST(CC)
-AC_SUBST(LN_S)
-
-AC_SUBST(prefix)
-AC_SUBST(exec_prefix)
-AC_SUBST(INSTALL)
-
-AC_SUBST(BITS)
-
-AC_SUBST(VERSION_MAJOR)
-AC_SUBST(VERSION_MINOR)
-AC_SUBST(VERSION_REVISION)
-
-PACKAGE_NAME="cloog-isl"
-PACKAGE_CFLAGS="-DCLOOG_INT_GMP=1"
-AX_CREATE_PKGCONFIG_INFO
-
-AC_CONFIG_FILES(Makefile test/Makefile)
-AC_CONFIG_FILES(autoconf/Doxyfile)
-AC_CONFIG_FILES(doc/Makefile)
-AC_CONFIG_FILES(source/version.c)
-AC_CONFIG_FILES(include/cloog/version.h)
-AC_CONFIG_FILES([genversion.sh], [chmod +x genversion.sh])
-AC_CONFIG_COMMANDS([version.h],
-	[echo '#define CLOOG_HEAD "'`./genversion.sh`'"' > version.h])
-AC_CONFIG_COMMANDS([doc/gitversion.texi],
-	[echo '@set VERSION '`./genversion.sh`'' > doc/gitversion.texi])
-if test $with_isl = bundled; then
-	AC_CONFIG_SUBDIRS(isl)
-fi
-if test $with_osl = bundled; then
-	AC_CONFIG_SUBDIRS(osl)
-fi
-AC_CONFIG_COMMANDS_POST([
-	ac_configure_args="$ac_configure_args $cloog_configure_args"
-])
-AC_OUTPUT
-
-
-echo "             /*-----------------------------------------------*"
-echo "              *           CLooG configuration is OK           *"
-echo "              *-----------------------------------------------*/"
-echo "It appears that your system is OK to start CLooG compilation. You need"
-echo "now to type \"make\". After compilation, you should check CLooG by typing"
-echo "\"make check\". If no problem occur, you can type \"make uninstall\" if"
-echo "you are upgrading an old version. Lastly type \"make install\" to install"
-echo "CLooG on your system (log as root if necessary)."
diff --git a/cloog-0.17.0/doc/Makefile.am b/cloog-0.17.0/doc/Makefile.am
deleted file mode 100644
index 160dfd1..0000000
--- a/cloog-0.17.0/doc/Makefile.am
+++ /dev/null
@@ -1,7 +0,0 @@
-if HAVE_TEXI2DVI
-cloog.pdf: cloog.texi gitversion.texi
-	$(TEXI2DVI) --pdf $<
-endif
-
-gitversion.texi: @GIT_INDEX@
-	echo '@set VERSION '`$(top_builddir)/genversion.sh`'' > $@
diff --git a/cloog-0.17.0/doc/Makefile.in b/cloog-0.17.0/doc/Makefile.in
deleted file mode 100644
index 7eae5d6..0000000
--- a/cloog-0.17.0/doc/Makefile.in
+++ /dev/null
@@ -1,387 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = doc
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in TODO
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cc_maxopt.m4 \
-	$(top_srcdir)/m4/ax_cflags_warn_all.m4 \
-	$(top_srcdir)/m4/ax_check_compiler_flags.m4 \
-	$(top_srcdir)/m4/ax_compiler_vendor.m4 \
-	$(top_srcdir)/m4/ax_create_pkgconfig_info.m4 \
-	$(top_srcdir)/m4/ax_gcc_archflag.m4 \
-	$(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \
-	$(top_srcdir)/m4/ax_submodule.m4 $(top_srcdir)/m4/libtool.m4 \
-	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
-SOURCES =
-DIST_SOURCES =
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BITS = @BITS@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CD = @CD@
-CFLAGS = @CFLAGS@
-CFLAGS_WARN = @CFLAGS_WARN@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GIT_INDEX = @GIT_INDEX@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-ISL_CPPFLAGS = @ISL_CPPFLAGS@
-ISL_LDFLAGS = @ISL_LDFLAGS@
-ISL_LIBS = @ISL_LIBS@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OSL_CPPFLAGS = @OSL_CPPFLAGS@
-OSL_LDFLAGS = @OSL_LDFLAGS@
-OSL_LIBS = @OSL_LIBS@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PRTDIAG = @PRTDIAG@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TEXI2DVI = @TEXI2DVI@
-VERSION = @VERSION@
-VERSION_MAJOR = @VERSION_MAJOR@
-VERSION_MINOR = @VERSION_MINOR@
-VERSION_REVISION = @VERSION_REVISION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-pkgconfig_libdir = @pkgconfig_libdir@
-pkgconfig_libfile = @pkgconfig_libfile@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-subdirs = @subdirs@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-versioninfo = @versioninfo@
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign doc/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-	distclean distclean-generic distclean-libtool distdir dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-man install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
-
-@HAVE_TEXI2DVI_TRUE@cloog.pdf: cloog.texi gitversion.texi
-@HAVE_TEXI2DVI_TRUE@	$(TEXI2DVI) --pdf $<
-
-gitversion.texi: @GIT_INDEX@
-	echo '@set VERSION '`$(top_builddir)/genversion.sh`'' > $@
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/cloog-0.17.0/doc/TODO b/cloog-0.17.0/doc/TODO
deleted file mode 100644
index 152c82d..0000000
--- a/cloog-0.17.0/doc/TODO
+++ /dev/null
@@ -1,58 +0,0 @@
-#
-#  /**-------------------------------------------------------------------**
-#   **                              CLooG                                **
-#   **-------------------------------------------------------------------**
-#   **                     The Chunky Loop Generator                     **
-#   **-------------------------------------------------------------------**
-#   **            First version of this file: april 29th 2005            **
-#   **-------------------------------------------------------------------**/
-#
-
-This file is mainly for the authors, in order to put ideas, requests, and
-work-in-progress notes.
-
-#   **-------------------------------------------------------------------**
-#   **                       I. Requested features                       **
-#   **-------------------------------------------------------------------**/
-
-1. GMP !!! (LooPo Team).
-DOOOOOOOOOOOOOOOOOOOOOOOOONE !!!!!!!!!!!!!!!!!
-
-2. Set the statement prefix (Michael Classen).
-
-3. Do not fuse the iterators/scattering dimension names lists (Hadda Cheroun).
-DOOOOOOOOOOOOOOOOOOOOOOOOONE !!!!!!!!!!!!!!!!!
-
-4. Exploit URUK transformation properties (WRAP-IT Team).
-DOOOOOOOOOOOOOOOOOOOOOOOOONE !!!!!!!!!!!!!!!!!
-
-
-#   **-------------------------------------------------------------------**
-#   **                         II. Known bugs                            **
-#   **-------------------------------------------------------------------**/
-
-1. Lead to segfault :
-cloog ./test/daegon_lu_osp.cloog -f 3 -l 6 -nobacktrack -override
-(while every other -l values do not !)
-DOOOOOOOOOOOOOOOOOOOOOOOOONE !!!!!!!!!!!!!!!!!
-
-2. -strides gives bad result for a dreamup or interpolation-duration file in
-test/non_optimal (I don't remember which one)
-
-3. Various configure problems (check Sylvain Girbal mails in the mailbox !).
-DOOOOOOOOOOOOOOOOOOOOOOOOONE !!!!!!!!!!!!!!!!!
-
-4. With GMP, try test/emploi.cloog (with valgrind): a memory leak...
-DOOOOOOOOOOOOOOOOOOOOOOOOONE !!!!!!!!!!!!!!!!!
-
-5. With GMP, option -cpp do not write all the statement internal stuff
-(e.g., S1(,,) ; instead of S1(i,j,k) ;).
-DOOOOOOOOOOOOOOOOOOOOOOOOONE !!!!!!!!!!!!!!!!!
-
-#   **-------------------------------------------------------------------**
-#   **                        III. Various notes                         **
-#   **-------------------------------------------------------------------**/
-
-Kill the cat.
-
-
diff --git a/cloog-0.17.0/doc/cloog.pdf b/cloog-0.17.0/doc/cloog.pdf
deleted file mode 100644
index af0750f..0000000
--- a/cloog-0.17.0/doc/cloog.pdf
+++ /dev/null
Binary files differ
diff --git a/cloog-0.17.0/doc/cloog.texi b/cloog-0.17.0/doc/cloog.texi
deleted file mode 100644
index 4dd2f7a..0000000
--- a/cloog-0.17.0/doc/cloog.texi
+++ /dev/null
@@ -1,2571 +0,0 @@
-\input texinfo
-@c %
-@c %  /**-----------------------------------------------------------------**
-@c %   **                              CLooG                              **
-@c %   **-----------------------------------------------------------------**
-@c %   **                            cloog.texi                           **
-@c %   **-----------------------------------------------------------------**
-@c %   **                   First version: july 6th 2002                  **
-@c %   **-----------------------------------------------------------------**/
-@c %
-@c % release 1.0: September 17th 2002
-@c % release 1.1: December   5th 2002
-@c % release 1.2: April     22th 2003
-@c % release 2.0: November  21th 2005 (and now in texinfo instead of LaTeX)
-@c % release 2.1: October   15th 2007
-@c %
-@c %/**************************************************************************
-@c % *               CLooG : the Chunky Loop Generator (experimental)         *
-@c % **************************************************************************/
-@c %/* CAUTION: the English used is probably the worst you ever read, please
-@c % *          feel free to correct and improve it !
-@c % */
-
-@c %\textit{"I found the ultimate transformation functions, optimization for
-@c %static control programs is now a closed problem, I have \textnormal{just}
-@c %to generate the target code !"} 
-
-
-
-@c % /*************************************************************************
-@c %  *                              PART I: HEADER                           *
-@c %  *************************************************************************/
-@c %**start of header
-@setfilename cloog.info
-@settitle CLooG - a loop generator for scanning polyhedra
-
-@set EDITION 2.1
-@include gitversion.texi
-@set UPDATED October 15th 2007
-@setchapternewpage odd
-
-@c %**end of header
-
-@c % /*************************************************************************
-@c %  *                 PART II: SUMMARY DESCRIPTION AND COPYRIGHT            *
-@c %  *************************************************************************/
-
-@copying
-This manual is for CLooG version @value{VERSION}, a software
-which generates loops for scanning Z-polyhedra. That is, CLooG produces a
-code visiting each integral point of a union of parametrized
-polyhedra. CLooG is designed to avoid control overhead and to produce a very
-efficient code.
-
-It would be quite kind to refer the following paper in any publication that
-results from the use of the CLooG software or its library:
-
-@example
-@@InProceedings@{Bas04,
-@ @ author =@ @ @ @ @{C. Bastoul@},
-@ @ title =@ @ @ @ @ @{Code Generation in the Polyhedral Model
-@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ Is Easier Than You Think@},
-@ @ booktitle = @{PACT'13 IEEE International Conference on
-@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ Parallel Architecture and Compilation Techniques@},
-@ @ year =@ @ @ @ @ @ 2004,
-@ @ pages =@ @ @ @ @ @{7--16@},
-@ @ month =@ @ @ @ @ @{september@},
-@ @ address =@ @ @ @{Juan-les-Pins@}
-@}
-@end example
-
-Copyright @copyright{} 2002-2005 C@'edric Bastoul.
-
-@c quotation
-Permission is granted to copy, distribute and/or modify this document under
-the terms of the GNU Free Documentation License, Version 1.2 
-published by the Free Software Foundation. To receive a copy of the
-GNU Free Documentation License, write to the Free Software Foundation, Inc.,
-59 Temple Place, Suite 330, Boston, MA  02111-1307 USA.
-@c end quotation
-@end copying
-
-@c % /*************************************************************************
-@c %  *                 PART III: TITLEPAGE, CONTENTS, COPYRIGHT              *
-@c %  *************************************************************************/
-@titlepage
-@title CLooG
-@subtitle A Loop Generator For Scanning Polyhedra
-@subtitle Edition @value{EDITION}, for CLooG @value{VERSION}
-@subtitle @value{UPDATED}
-@author C@'edric Bastoul
-     
-@c The following two commands start the copyright page.
-@page
-@noindent (September 2001)
-@table @code
-@item C@'edric Bastoul
-SCHEDULES GENERATE !!! I just need to apply them now, where can I find
-a good code generator ?!
-     
-@item Paul Feautrier
-Hmmm. I fear that if you want something powerful enough, you'll have to
-write it yourself !
-@end table
-
-@vskip 0pt plus 1filll
-@insertcopying
-@end titlepage
-     
-@c Output the table of contents at the beginning.
-@contents
-
-@c % /*************************************************************************
-@c %  *                     PART IV: TOP NODE AND MASTER MENU                 *
-@c %  *************************************************************************/
-@ifnottex
-@node Top
-@top CLooG
-     
-@insertcopying
-@end ifnottex
-
-@menu
-* Introduction::
-* CLooG Software::
-* CLooG Library::
-@c * Hacking::
-* Installing::
-* Documentation::
-* References::
-@end menu
- 
-
-
-@c % /*************************************************************************
-@c %  *                       PART V: BODY OF THE DOCUMENT                    *
-@c %  *************************************************************************/
-
-@c %  ****************************** INTRODUCTION ******************************
-@node Introduction
-@chapter Introduction
-CLooG is a free software and library generating loops for scanning Z-polyhedra.
-That is, it finds a code (e.g. in C, FORTRAN...) that reaches each integral
-point of one or more parameterized polyhedra. CLooG has been originally
-written to solve the code generation problem for optimizing compilers based on
-the polytope model. Nevertheless it is used now in various area, e.g., to build
-control automata for high-level synthesis or to find the best polynomial
-approximation of a function. CLooG may help in any situation where scanning
-polyhedra matters. It uses the best state-of-the-art code generation
-algorithm known as the Quiller@'e et al. algorithm (@pxref{Qui00})
-with our own improvements and extensions (@pxref{Bas04}).
-The user has full control on generated code quality.
-On one hand, generated code size has to be tuned for sake of
-readability or instruction cache use. On the other hand, we must ensure that
-a bad control management does not hamper performance of the generated code,
-for instance by producing redundant guards or complex loop bounds.
-CLooG is specially designed to avoid control overhead and to produce a very
-efficient code.
-
-CLooG stands for @emph{Chunky Loop Generator}: it is a part of the Chunky
-project, a research tool for data locality improvement (@pxref{Bas03a}).
-It is designed
-also to be the back-end of automatic parallelizers like LooPo (@pxref{Gri04}).
-Thus it is very
-compilable code oriented and provides powerful program transformation
-facilities. Mainly, it allows the user to specify very general schedules where, 
-e.g., unimodularity or invertibility of the transformation doesn't matter.
-
-The current version is still under
-evaluation, and there is no guarantee that the upward compatibility
-will be respected (but the previous API has been stable for two years,
-we hope this one will be as successful -and we believe it-).
-A lot of reports are necessary to freeze the library
-API and the input file shape. Most API changes from 0.12.x to 0.14.x
-have been requested by the users themselves.
-Thus you are very welcome and encouraged
-to post reports on bugs, wishes, critics, comments, suggestions or
-successful experiences in the forum of @code{http://www.CLooG.org}
-or to send them to cedric.bastoul@@inria.fr directly.
-
-@menu
-* Basics::
-* Scattering::
-@end menu
-
-@node Basics
-@section Basically, what's the point ?
-If you want to use CLooG, this is because you want to scan or to find
-something inside the integral points of a set of polyhedra. There are many
-reasons for that. Maybe you need the generated code itself because it
-actually implements a very smart program transformation you found.
-Maybe you want to use the generated code
-because you know that the solution of your problem belongs to the integral
-points of those damned polyhedra and you don't know which one. Maybe you just
-want to know if a polyhedron has integral points depending on some parameters,
-which is the lexicographic minimum, maximum, the third on the basis of the
-left etc. Probably you have your own reasons to use CLooG.
-
-Let us illustrate a basic use of CLooG. Suppose we have a set of affine
-constraints that describes a part of a whatever-dimensional space,
-called a @strong{domain}, and we
-want to scan it. Let us consider for instance the following set of constraints
-where @samp{i}
-and @samp{j} are the unknown (the two dimensions of the space) and
-@samp{m} and @samp{n} are the parameters (some symbolic constants):
-@example
-@group
-2<=i<=n
-2<=j<=m
-j<=n+2-i
-@end group
-@end example
-Let us also consider that we have a partial knowledge of the parameter values,
-called the @strong{context}, expressed as affine constraints as well,
-for instance:
-@example
-@group
-m>=2
-n>=2
-@end group
-@end example
-Note that using parameters is optional, if you are not comfortable with
-parameter manipulation, just replace them with any scalar value that fits
-@code{m>=2} and @code{n>=2}.
-A graphical representation of this part of the 2-dimensional space, where
-the integral points are represented using heavy dots would be for instance:
-
-@image{images/basic,6cm}
-
-The affine constraints of both the domain and the context are what we will
-provide to CLooG as input (in a particular shape that will be described later).
-The output of CLooG is a pseudo-code to scan the integral points of the
-input domain according to the context:
-@example
-@group
-for (i=2;i<=n;i++) @{
-  for (j=2;j<=min(m,-i+n+2);j++) @{    
-    S1(i,j) ;
-  @}
-@}
-@end group
-@end example
-If you felt such a basic example is yet interesting, there is a good chance
-that CLooG is appropriate for you. CLooG can do much more: scanning several
-polyhedra or unions of polyhedra at the same time, applying general affine
-transformations to the polyhedra, generate compilable code etc. Welcome
-to the CLooG's user's guide !
-
-@node Scattering
-@section Defining a Scanning Order: Scattering Functions
-In CLooG, domains only define the set of integral points to scan and their
-coordinates. In particular, CLooG is free to choose the scanning order for
-generating the most efficient code. This means, for optimizing/parallelizing
-compiler people, that CLooG doesn't make any speculation on dependences on and
-between statements (by the way, it's not its job !).
-For instance, if an user give to
-CLooG only two domains @code{S1:1<=i<=n}, @code{S2:1<=i<=n} and the context
-@code{n>=1}, the following pseudo-codes are considered to be equivalent:
-
-@example
-@group
-/* A convenient target pseudo-code. */
-for (i=1;i<=N;i++) @{
- S1(i) ;
-@}
-for (i=1;i<=N;i++) @{
- S2(i) ;
-@}
-@end group
-@end example
-
-@example
-@group
-/* Another convenient target pseudo-code. */
-for (i=1;i<=N;i++) @{
- S1(i) ;
- S2(i) ;
-@}
-@end group
-@end example
-
-The default behaviour
-of CLooG is to generate the second one, since it is optimized in control. 
-It is right if there are no data dependences
-between @code{S1} and @code{S2}, but wrong otherwise. 
-
-Thus it is often useful to force scanning to respect a given order. This can be
-done in CLooG by using @strong{scattering functions}. Scattering is a
-shortcut for scheduling, allocation, chunking functions and the like we can
-find in the restructuring compilation literature. There are a lot of reasons
-to scatter the integral points of the domains (i.e. the statement instances
-of a program, for compilation people), parallelization or optimization are good
-examples. For instance, if the user wants for any reason to set some
-precedence constraints between the statements of our example above
-in order to force the generation of the
-first code, he can do it easily by setting (for example) the following
-scheduling functions:
-
-@tex
-$$\theta _{S1}(i) =  (1)$$
-$$\theta _{S2}(j) =  (2)$$
-@end tex
-
-@ifnottex
-@example
-@group
-T_S1(i) = (1)
-T_S2(j) = (2)
-@end group
-@end example
-@end ifnottex
-
-This scattering means that each integral point of the domain @code{S1}
-is scanned at logical date @code{1} while each integral point of the domain
-@code{S2} is scanned at logical date @code{2}. As a result, the whole
-domain @code{S1} is scanned before domain @code{S2} and the first code in our
-example is generated.
-
-The user can set every kind of affine scanning order thanks to the
-scattering functions. Each domain has its own scattering function and
-each scattering function may be multi-dimensional. A multi-dimensional logical
-date may be seen as classical date (year,month,day,hour,minute,etc.) where
-the first dimensions are the most significant. Each scattering dimension
-may depend linearly on the original dimensions (e.g., @code{i}), the
-parameters (e.g., @code{n}) ans scalars (e.g., @code{2}).
-
-A very useful example of multi-dimensional scattering functions is, for
-compilation people, the scheduling of the original program.
-The basic data to use for code generation are statement iteration domains.
-As we saw, these data are not sufficient to rebuild the original
-program (what is the ordering between instances of different statements ?).
-The missing data can be put in the scattering functions as the original
-scheduling. The method to compute it is quite simple (@pxref{Fea92}). The idea is to
-build an abstract syntax tree of the program and to read the scheduling for
-each statement. For instance, let us consider the following implementation of
-a Cholesky factorization:
-
-@example
-@group
-/* A Cholesky factorization kernel. */
-for (i=1;i<=N;i++) @{
-  for (j=1;j<=i-1;j++) @{
-    a[i][i] -= a[i][j] ;           /* S1 */
-  @}
-  a[i][i] = sqrt(a[i][i]) ;        /* S2 */
-  for (j=i+1;j<=N;j++) @{
-    for (k=1;k<=i-1;k++) @{
-      a[j][i] -= a[j][k]*a[i][k] ; /* S3 */
-    @}
-    a[j][i] /= a[i][i] ;           /* S4 */
-    @}
-  @}
-@}
-@end group
-@end example
-
-The corresponding abstract syntax tree is given in the following figure.
-It directly gives the scattering functions (schedules) for all the
-statements of the program.
-
-@image{images/tree,6cm}
-
-@tex
-$$
-\hbox{$ \cases{ \theta _{S1}(i,j)^T    &$=  (0,i,0,j,0)^T$\cr
-                \theta _{S2}(i)        &$=  (0,i,1)^T$\cr
-                \theta _{S3}(i,j,k)^T  &$=  (0,i,2,j,0,k,0)^T$\cr
-                \theta _{S4}(i,j)^T    &$=  (0,i,2,j,1)^T$}$}
-$$
-@end tex
-
-@ifnottex
-@example
-@group
-T_S1(i,j)^T   = (0,i,0,j,0)^T
-T_S2(i)       = (0,i,1)^T
-T_S3(i,j,k)^T = (0,i,2,j,0,k,0)^T
-T_S4(i,j)^T   = (0,i,2,j,1)^T
-@end group
-@end example
-@end ifnottex
-
-These schedules depend on the iterators and give for each instance of each
-statement a unique execution date. Using such scattering functions allow
-CLooG to re-generate the input code. 
-
-
-
-
-
-@c %  ***********************Using the CLooG Software **************************
-@node CLooG Software
-@chapter Using the CLooG Software
-
-
-@menu
-* A First Example::
-* Writing The Input File::
-* Calling CLooG::
-* CLooG Options::
-* Full Example::
-@end menu
-
-@c %/*************************************************************************
-@c % *                              A FIRST EXAMPLE                          *
-@c % *************************************************************************/
-@node A First Example
-@section A First Example
-CLooG takes as input a file that must be written accordingly to a grammar
-described in depth in a further section (@pxref{Writing The Input File}). 
-Moreover it supports many options to tune the target code presentation or
-quality as discussed in a dedicated section (@pxref{Calling CLooG}).
-However, a basic use
-of CLooG is not very complex and we present in this section how to generate the
-code corresponding to a basic example discussed earlier (@pxref{Basics}).
-
-The problem is to find the code that scans a 2-dimensional polyhedron
-where @samp{i} and @samp{j} are the unknown (the two dimensions of the space)
-and @samp{m} and @samp{n} are the parameters (the symbolic constants),
-defined by the following set of constraints:
-@example
-@group
-2<=i<=n
-2<=j<=m
-j<=n+2-i
-@end group
-@end example
-@noindent We also consider a partial knowledge of the parameter values,
-expressed thanks to the following affine constraints:
-@example
-@group
-m>=2
-n>=2
-@end group
-@end example
-
-An input file that corresponds to this problem, and asks for a generated
-code in C, may be the following. Note that we do not describe here precisely
-the structure and the components of this file (@pxref{Writing The Input File}
- for such information, if you feel it necessary):
-
-@example
-# ---------------------- CONTEXT ----------------------
-c # language is C
-
-# Context (constraints on two parameters)
-2 4                   # 2 lines and 4 columns
-# eq/in m  n  1         eq/in: 1 for inequality >=0, 0 for equality =0
-    1   1  0 -2       # 1*m + 0*n -2*1 >= 0, i.e. m>=2
-    1   0  1 -2       # 0*m + 1*n -2*1 >= 0, i.e. n>=2
-
-1 # We want to set manually the parameter names
-m n                   # parameter names
-
-# --------------------- STATEMENTS --------------------
-1 # Number of statements
-
-1 # First statement: one domain
-# First domain
-5 6                   # 5 lines and 6 columns
-# eq/in i  j  m  n  1 
-    1   1  0  0  0 -2 # i >= 2
-    1  -1  0  0  1  0 # i <= n
-    1   0  1  0  0 -2 # j >= 2
-    1   0 -1  1  0  0 # j <= m
-    1  -1 -1  0  1  2 # n+2-i>=j
-0  0  0               # for future options
-
-1 # We want to set manually the iterator names
-i j                   # iterator names
-
-# --------------------- SCATTERING --------------------
-0 # No scattering functions
-@end example
-
-This file may be called @samp{basic.cloog}
-(this example is provided in the CLooG distribution as
-@code{test/manual_basic.cloog}) and we can ask CLooG to process it
-and to generate the code by a simple calling to CLooG with this file as input:
-@samp{cloog basic.cloog}. By default, CLooG will print the generated code in
-the standard output:
-
-@example
-@group
-/* Generated by CLooG v@value{VERSION} in 0.00s. */
-for (i=2;i<=n;i++) @{
-  for (j=2;j<=min(m,-i+n+2);j++) @{    
-    S1(i,j) ;
-  @}
-@}
-@end group
-@end example
-
-@c %/*************************************************************************
-@c % *                                Input file                             *
-@c % *************************************************************************/
-@node Writing The Input File
-@section Writing The Input File
-The input text file contains a problem description, i.e. the context,
-the domains and the scattering functions.
-Because CLooG is very 'compilable code generation oriented', we can associate
-some additional informations to each domain. We call this association a
-@emph{statement}. The set of all informations is 
-called a @emph{program}. The input file respects the grammar below
-(terminals are preceded by "_"):
-
-@example
-File             ::= Program
-Program          ::= Context Statements Scattering
-Context          ::= Language      Domain_union   Naming
-Statements       ::= Nb_statements Statement_list Naming
-Scatterings      ::= Nb_functions  Scattering_list Naming
-Naming           ::= Option Name_list
-Name_list        ::= _String   Name_list      | (void)
-Statement_list   ::= Statement Statement_list | (void)
-Domain_list      ::= _Domain   Domain_list    | (void)
-Scattering_list  ::= Domain_union Scattering_list | (void)
-Statement        ::= Iteration_domain 0 0 0
-Iteration_domain ::= Domain_union
-Domain_union     ::= Nb_domains Domain_list
-Option           ::= 0 | 1
-Language         ::= c | f
-Nb_statements    ::= _Integer
-Nb_domains       ::= _Integer
-Nb_functions     ::= _Integer
-@end example
-
-Note: if there is only one domain in a @samp{Domain_union},
-i.e., if @samp{Nb_domains} is 1, then this 1 may be omitted.
-
-@itemize @bullet
-@item  @samp{Context} represents the informations that are
-       shared by all the statements. It consists on
-       the language used (which can be @samp{c} for C or @samp{f} for FORTRAN 90)
-       and the global constraints on parameters.
-       These constraints are essential
-       since they give to CLooG the number of parameters. If there is no
-       parameter or no constraints on parameters, just give a constraint
-       always satisfied like @math{1 \geq 0}. @samp{Naming} sets the parameter
-       names.
-       If the naming option @samp{Option} is 1, parameter names will be read
-       on the next line. There must be exactly as many names as parameters.
-       If the naming option @samp{Option} is 0, parameter names are
-       automatically generated. The name of the first parameter will
-       be @samp{M}, and the name of the @math{(n+1)^{th}} parameter directly
-       follows the name of the @math{n^{th}} parameter in ASCII code.
-       It is the user responsibility to ensure that parameter names,
-       iterators and scattering dimension names are different. 
-@item  @samp{Statements} represents the informations on the statements.
-       @samp{Nb_statements} is the number of statements in the program, 
-       i.e. the number of @samp{Statement} items in the @samp{Statement_list}.
-       @samp{Statement} represents the informations on a given statement.
-       To each statement is associated a domain
-       (the statement iteration domain: @samp{Iteration_domain}) and three
-       zeroes that represents future options.
-       @samp{Naming} sets the iterator names. If the naming option
-       @samp{Option} is 1, the iterator names
-       will be read on the next line. There must be exactly as many names as
-       nesting level in the deepest iteration domain. If the naming option
-       @samp{Option} is 0, iterator names are automatically generated.
-       The iterator name of the outermost loop will be @samp{i}, and the
-       iterator name of the loop at level @math{n+1} directly follows the 
-       iterator name of the loop at level @math{n} in ASCII code. 
-@item  @samp{Scatterings} represents the informations on scattering functions.
-       @samp{Nb_functions} is the number of functions (it must be
-       equal to the number of statements or 0 if there is no scattering
-       function). The functions themselves are represented through
-       @samp{Scattering_list}.
-       @samp{Naming} sets the scattering dimension names. If the naming option
-       @samp{Option} is 1, the scattering dimension names will be read on the
-       next line.
-       There must be exactly as many names as scattering dimensions. If the
-       naming option @samp{Option} is 0, scattering dimension names are automatically
-       generated. The name of the @math{n^{th}} scattering dimension
-       will be @samp{cn}.
-@end itemize
-
-@menu
-* Domain Representation::
-* Scattering Representation::
-@end menu
-
-@node Domain Representation
-@subsection Domain Representation
-As shown by the grammar, the input file describes the various informations
-thanks to characters, integers and domains. Each domain is defined by a set of
-constraints in the PolyLib format (@pxref{Wil93}). They have the
-following syntax:
-@enumerate
-@item some optional comment lines beginning with @samp{#},
-@item the row and column numbers, possibly followed by comments,
-@item the constraint rows, each row corresponds to a constraint the
-      domain have to satisfy. Each row must be on a single line and is possibly
-      followed by comments. The constraint is an equality @math{p(x) = 0} if the
-      first element is 0, an inequality  @math{p(x) \geq 0} if the first element
-      is 1. The next elements are the unknown coefficients, followed by
-      the parameter coefficients. The last element is the constant factor.
-@end enumerate
-For instance, assuming that @samp{i}, @samp{j} and @samp{k} are iterators and
-@samp{m} and @samp{n} are parameters, the domain defined by the following
-constraints :
-
-@tex
-$$
-\hbox{$ \cases{ -i     + m &$\geq 0$\cr
-                    -j + n &$\geq 0$\cr
-                 i + j - k &$\geq 0$}$}
-$$
-@end tex
-
-@ifnottex
-@example
-@group
-   -i + m >= 0
-   -j + n >= 0
-i + j - k >= 0
-@end group
-@end example
-@end ifnottex
-
-@noindent can be written in the input file as follows :
-
-@example
-@group
-# This is the domain
-3 7                      # 3 lines and 7 columns
-# eq/in i  j  k  m  n  1 
-    1  -1  0  0  1  0  0 #    -i + m >= 0
-    1   0 -1  0  0  1  0 #    -j + n >= 0
-    1   1  1 -1  0  0  0 # i + j - k >= 0
-@end group
-@end example
-
-Each iteration domain @samp{Iteration_domain} of a given statement
-is a union of polyhedra
-@samp{Domain_union}. A union is defined by its number of elements
-@samp{Nb_domains} and the elements themselves @samp{Domain_list}.
-For instance, let us consider the following pseudo-code:
-
-@example
-@group
-for (i=1;i<=n;i++) @{
-  if ((i >= m) || (i <= 2*m))
-    S1 ;
-  for (j=i+1;j<=m;j++)
-    S2 ;
-@} 
-@end group
-@end example
-
-@noindent The iteration domain of @samp{S1} can be divided into two
-polyhedra and written in the input file as follows:
-
-@example
-@group
-2 # Number of polyhedra in the union
-# First domain
-3 5                # 3 lines and 5 columns
-# eq/in i  m  n  1 
-    1   1  0  0 -1 #  i >= 1
-    1  -1  0  1  0 #  i <= n
-    1   1 -1  0  0 #  i >= m
-# Second domain
-3 5                # 3 lines and 5 columns
-# eq/in i  m  n  1 
-    1   1  0  0 -1 #  i >= 1
-    1  -1  0  1  0 #  i <= n
-    1  -1  2  0  0 #  i <= 2*m
-@end group
-@end example
-
-@node Scattering Representation
-@subsection Scattering Function Representation
-Scattering functions are depicted in the input file thanks a representation
-very close to the domain one.
-An integer gives the number of functions @samp{Nb_functions} and each function
-is represented by a domain. Each line of the domain corresponds to an equality
-defining a dimension of the function. Note that at present
-(CLooG @value{VERSION})
-@strong{all functions must have the same scattering dimension number}. If a
-user wants to set scattering functions with different dimensionality, he has
-to complete the smaller one with zeroes to reach the maximum dimensionality.
-For instance, let us consider the following code and
-scheduling functions:
-
-@example
-@group
-for (i=1;i<=n;i++) @{
-  if ((i >= m) || (i <= 2*m))
-    S1 ;
-  for (j=i+1;j<=m;j++)
-    S2 ;
-@} 
-@end group
-@end example
-
-@tex
-$$
-\hbox{$ \cases{ \theta _{S1}(i)      &$=  (i,0)^T$\cr
-                \theta _{S2}(i,j)^T  &$=  (n,i+j)^T$}$}
-$$
-@end tex
-
-@ifnottex
-@example
-@group
-T_S1(i)     = (i,0)^T
-T_S2(i,j)^T = (n,i+j)^T
-@end group
-@end example
-@end ifnottex
-
-
-@noindent This scheduling can be written in the input file as follows:
-
-@example
-@group
-2 # Number of scattering functions
-# First function
-2 7                          # 2 lines and 7 columns
-# eq/in c1 c2  i  m  n  1 
-    0    1  0 -1  0  0  0    #  c1 = i
-    0    0  1  0  0  0  0    #  c2 = 0
-# Second function
-2 8                          # 2 lines and 8 columns
-# eq/in c1 c2  i  j  m  n  1 
-    0    1  0  0  0  0 -1  0 #  c1 = n
-    0    0  1 -1 -1  0  0  0 #  c2 = i+j
-@end group
-@end example
-The complete input file for the user who wants to generate the code for this
-example with the preceding scheduling would be
-(this file is provided in the CLooG distribution
-as @code{test/manual_scattering.cloog}:
-
-@example
-# ---------------------- CONTEXT ----------------------
-c # language is C
-
-# Context (no constraints on two parameters)
-1 4                   # 1 lines and 4 columns
-# eq/in m  n  1
-    1   0  0  0       # 0 >= 0, always true
-
-1 # We want to set manually the parameter names
-m n                   # parameter names
-
-# --------------------- STATEMENTS --------------------
-2 # Number of statements
-
-2 # First statement: two domains
-# First domain
-3 5                   # 3 lines and 5 columns
-# eq/in i  m  n  1
-    1   1  0  0 -1    # i >= 1
-    1  -1  0  1  0    # i <= n
-    1   1 -1  0  0    # i >= m
-# Second domain
-3 5                   # 3 lines and 5 columns
-# eq/in i  m  n  1 
-    1   1  0  0 -1    # i >= 1
-    1  -1  0  1  0    # i <= n
-    1  -1  2  0  0    # i <= 2*m
-0  0  0               # for future options
- 
-1 # Second statement: one domain
-4 6                   # 4 lines and 6 columns
-# eq/in i  j  m  n  1 
-    1   1  0  0  0 -1 # i >= 1
-    1  -1  0  0  1  0 # i <= n
-    1  -1  1  0  0 -1 # j >= i+1
-    1   0 -1  1  0  0 # j <= m
-0  0  0               # for future options
-
-1 # We want to set manually the iterator names
-i j                   # iterator names
-
-# --------------------- SCATTERING --------------------
-2 # Scattering functions
-# First function
-2 7                   # 2 lines and 7 columns
-# eq/in p1 p2  i  m  n  1 
-    0    1  0 -1  0  0  0    # p1 = i
-    0    0  1  0  0  0  0    # p2 = 0
-# Second function
-2 8                   # 2 lines and 8 columns
-# eq/in p1 p2  i  j  m  n  1 
-    0    1  0  0  0  0 -1  0 # p1 = n
-    0    0  1 -1 -1  0  0  0 # p2 = i+j
-
-1 # We want to set manually the scattering dimension names
-p1 p2                 # scattering dimension names
-@end example
-
-
-@c %/*************************************************************************
-@c % *                             Calling CLooG                             *
-@c % *************************************************************************/
-@node Calling CLooG
-@section Calling CLooG
-CLooG is called by the following command:
-@example
-       cloog [ options | file ]
-@end example
-The default behavior of CLooG is to read the input informations from a file and
-to print the generated code or pseudo-code on the standard output.
-CLooG's behavior and the output code shape is under the user control thanks
-to many options which are detailed a further section (@pxref{CLooG Options}).
-@code{file} is the input file. @code{stdin} is a special value: when used,
-input is standard input. For instance, we can call CLooG to treat the
-input file @code{basic.cloog} with default options by typing:
-@code{cloog basic.cloog} or @code{more basic.cloog | cloog stdin}.
-
-@c %/*************************************************************************
-@c % *                             CLooG Options                             *
-@c % *************************************************************************/
-@node CLooG Options
-@section CLooG Options
-
-@menu
-* Last Depth to Optimize Control::
-* First Depth to Optimize Control::
-* Simplify Convex Hull::
-* Once Time Loop Elimination::
-* Equality Spreading::
-* First Level for Spreading::
-* Statement Block::
-* Loop Strides::
-* Unrolling::
-* Compilable Code::
-* Output::
-* OpenScop::
-* Help::
-* Version ::
-* Quiet ::
-@end menu
-
-@node Last Depth to Optimize Control
-@subsection Last Depth to Optimize Control @code{-l <depth>}
-
-@code{-l <depth>}: this option sets the last loop depth to be optimized in
-control. The higher this depth, the less control overhead.
-For instance, with some input file, a user can generate
-different pseudo-codes with different @code{depth} values as shown below.
-@example
-@group
-/* Generated using a given input file and @strong{option -l 1} */
-for (i=0;i<=M;i++) @{
-  S1 ;
-  for (j=0;j<=N;j++) @{
-    S2 ;
-  @}
-  for (j=0;j<=N;j++) @{
-    S3 ;
-  @}
-  S4 ;
-@}
-@end group
-@end example
-@example
-@group
-/* Generated using the same input file but @strong{option -l 2} */
-for (i=0;i<=M;i++) @{
-  S1 ;
-  for (j=0;j<=N;j++) @{
-    S2 ;
-    S3 ;
-  @}
-  S4 ;
-@}
-@end group
-@end example
-     In this example we can see that this option can change the operation
-     execution order between statements. Let us remind that CLooG does not
-     make any speculation on dependences between statements
-     (@pxref{Scattering}). Thus if nothing (i.e. scattering functions)
-     forbids this, CLooG considers the above codes to be equivalent.
-     If there is no scattering functions, the minimum value for @code{depth}
-     is 1 (in the case of 0, the user doesn't really need a loop generator !),
-     and the number of scattering dimensions otherwise (CLooG will warn the
-     user if he doesn't respect such constraint).
-     The maximum value for depth is -1 (infinity).
-     Default value is infinity.
-
-@node First Depth to Optimize Control
-@subsection First Depth to Optimize Control @code{-f <depth>}
-
-     @code{-f <depth>}: this option sets the first loop depth to be optimized
-     in control. The lower this depth, the less control overhead (and the longer
-     the generated code). For instance, with some input file, a user
-     can generate different pseudo-codes with different @code{depth} values
-     as shown below.
-     The minimum value for @code{depth} is 1, and the
-     maximum value is -1 (infinity).
-     Default value is 1.
-@example
-@group
-/* Generated using a given input file and @strong{option -f 3} */
-for (i=1;i<=N;i++) @{
-  for (j=1;j<=M;j++) @{
-    S1 ;
-    if (j >= 10) @{
-      S2 ;
-    @}
-  @}
-@}
-@end group
-@end example
-@example
-@group
-/* Generated using the same input file but @strong{option -f 2} */
-for (i=1;i<=N;i++) @{
-  for (j=1;j<=9;j++) @{
-    S1 ;
-  @}
-  for (j=10;j<=M;j++) @{
-    S1 ;
-    S2 ;
-  @}
-@}
-@end group
-@end example
-
-@node Simple Convex Hull
-@subsection  Simple Convex Hull @code{-sh <boolean>}
-
-     @code{-sh <boolean>}: this option enables (@code{boolean=1})
-     or forbids (@code{boolean=0}) the use of an overapproximation
-     of the convex hull that may be easier to compute
-     (especially in the isl backend) and that may result in
-     simpler bounds.
-     This option works only for generated code without
-     code duplication (it means, you have to tune @code{-f} and
-     @code{-l} options first to generate only a loop nest with internal
-     guards). For instance, with the input file @code{test/union.cloog}, a user
-     can generate different pseudo-codes  as shown below.
-     Default value is 0.
-@example
-@group
-/* Generated using test/union.cloog and @strong{option -f -1 -l 2 -override} */
-for (i=0;i<=11;i++) @{
-  for (j=max(0,5*i-50);j<=min(15,5*i+10);j++) @{
-    if ((i <= 10) && (j <= 10)) @{
-      S1 ;
-    @}
-    if ((i >= 1) && (j >= 5)) @{
-      S2 ;
-    @}
-  @}
-@}
-@end group
-@end example
-@example
-@group
-/* Generated using the same input file but @strong{option -sh 1 -f -1 -l 2 -override} */
-for (i=0;i<=11;i++) @{
-  for (j=0;j<=15;j++) @{
-    if ((i <= 10) && (j <= 10)) @{
-      S1 ;
-    @}
-    if ((i >= 1) && (j >= 5)) @{
-      S2 ;
-    @}
-  @}
-@}
-@end group
-@end example
-
-@node Once Time Loop Elimination
-@subsection Once Time Loop Elimination @code{-otl <boolean>}
-
-     @code{-otl <boolean>}: this option allows (@code{boolean=1}) or
-     forbids (@code{boolean=0}) the simplification of loops running
-     once. Default value is 1.
-@example
-@group
-/* Generated using a given input file and @strong{option -otl 0} */
-for (j=i+1;j<=i+1;j++) @{
-  S1 ;
-@}
-@end group
-@end example
-@example
-@group
-/* Generated using the same input file but @strong{option -otl 1} */
-j = i+1 ;
-S1 ;
-@end group
-@end example
-
-
-@node Equality Spreading 
-@subsection Equality Spreading @code{-esp <boolean>}
-
-     @code{-esp <boolean>}: this option allows (@code{boolean=1}) or
-     forbids (@code{boolean=0}) values spreading when there
-     are equalities. Default value is 1.
-@example
-@group
-/* Generated using a given input file and @strong{option -esp 0} */
-i = M+2 ;
-j = N ;
-for (k=i;k<=j+M;k++) @{
-  S1 ;
-@}
-@end group
-@end example
-@example
-@group
-/* Generated using the same input file but @strong{option -esp 1} */
-for (k=M+2;k<=N+M;k++) @{
-  S1(i = M+2, j = N) ;
-@}
-@end group
-@end example
-
-
-@node First Level for Spreading 
-@subsection First Level for Spreading @code{-fsp <level>}
-
-     @code{-fsp <level>}: it can be useful to set a
-     first level to begin equality spreading. Particularly when using
-     scattering functions, the user may want to see the scattering dimension
-     values instead of spreading or hiding them. If user has set a
-     spreading, @code{level} is
-     the first level to start it. Default value is 1.
-@example
-@group
-/* Generated using a given input file and @strong{option -fsp 1} */
-for (j=0;j<=N+M;j++) @{
-  S1(i = N) ;
-@}
-for (j=0;j<=N+M;j++) @{
-  S1(i = M) ;
-@}
-@end group
-@end example
-@example
-@group
-/* Generated using the same input file but @strong{option -fsp 2} */
-c1 = N ;
-for (j=0;j<=c1+M;j++) @{
-  S1(i = c1) ;
-@}
-c1 = M ;
-for (j=0;j<=N+c1;j++) @{
-  S1(i = c1) ;
-@}
-@end group
-@end example
-
-
-@node Statement Block  
-@subsection Statement Block @code{-block <boolean>}
-
-     @code{-block <boolean>}: this option allows (@code{boolean=1}) to
-     create a statement block for each new iterator, even if there is only
-     an equality. This can be useful in order to parse the generated
-     pseudo-code. When @code{boolean} is set to 0 or when the generation
-     language is FORTRAN, this feature is disabled. Default value is 0.
-@example
-@group
-/* Generated using a given input file and @strong{option -block 0} */
-i = M+2 ;
-j = N ;
-S1 ;
-@end group
-@end example
-@example
-@group
-/* Generated using the same input file but @strong{option -block 1} */
-@{ i = M+2 ;
-  @{ j = N ;
-    S1 ;
-  @}
-@}
-@end group
-@end example
-
-
-@node Loop Strides 
-@subsection Loop Strides @code{-strides <boolean>}
-
-     @code{-strides <boolean>}: this options allows (@code{boolean=1}) to
-     handle non-unit strides for loop increments. This can remove a lot of
-     guards and make the generated code more efficient. Default value is 0.
-@example
-@group
-/* Generated using a given input file and @strong{option -strides 0} */
-for (i=1;i<=n;i++) @{
-  if (i%2 == 0) @{
-    S1(j = i/2) ;
-  @}
-  if (i%4 == 0) @{
-    S2(j = i/4) ;
-  @}
-@}
-@end group
-@end example
-@example
-@group
-/* Generated using the same input file but @strong{option -strides 1} */
-for (i=2;i<=n;i+=2) @{
-  S1(j = i/2) ;
-  if (i%4 == 0) @{
-    S2(j = i/4) ;
-  @}
-@}
-@end group
-@end example
-
-
-@node Unrolling
-@subsection First Depth to Unroll @code{-first-unroll <depth>}
-
-    @code{-first-unroll <depth>}: this option sets the first loop depth
-    to unroll.  Note that a loop is only unrolled when it is supported
-    by the backend.  In case of the isl backend, a loop is unrolled
-    if it has a lower bound that can only be incremented
-    a fixed (non-parametric) amount of times.
-
-
-@node Compilable Code
-@subsection Compilable Code @code{-compilable <value>}
-
-     @code{-compilable <value>}: this options allows (@code{value} is not 0)
-     to generate a compilable code where all parameters have the integral value
-     @code{value}. This option creates a macro for each statement. Since
-     CLooG do not know anything about the statement sources, it fills the
-     macros with a basic increment that computes the total number of
-     scanned integral points. The user may change easily the macros according
-     to his own needs. This option is possible only if the generated code is
-     in C. Default value is 0.
-@example
-@group
-/* Generated using a given input file and @strong{option -compilable 0} */
-for (i=0;i<=n;i++) @{
-  for (j=0;j<=n;j++) @{
-    S1 ;
-    S2 ;
-  @}
-  S3 ;
-@}
-@end group
-@end example
-@example
-/* Generated using the same input file but @strong{option -compilable 10} */
-/* DON'T FORGET TO USE -lm OPTION TO COMPILE. */
-
-/* Useful headers. */
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-
-/* Parameter value. */
-#define PARVAL 10
-
-/* Statement macros (please set). */
-#define S1(i,j) @{total++;@}
-#define S2(i,j) @{total++;@}
-#define S3(i)   @{total++;@}
-
-int main() @{
-  /* Original iterators. */
-  int i, j ;
-  /* Parameters. */
-  int n=PARVAL, total=0 ;
-
-  for (i=0;i<=n;i++) @{
-    for (j=0;j<=n;j++) @{
-      S1(i,j) ;
-      S2(i,j) ;
-    @}
-    S3(i) ;
-  @}
-
-  printf("Number of integral points: %d.\n",total) ;
-  return 0 ;
-@}
-@end example
-
-@node Callable Code
-@subsection Callable Code @code{-callable <boolean>}
-
-     @code{-callable <boolean>}: if @code{boolean=1}, then a @code{test}
-     function will be generated that has the parameters as arguments.
-     Similarly to the @code{-compilable} option,
-     a macro for each statement is generated.  The generated definitions of
-     these macros are as used during the correctness testing, but they
-     can easily be changed by the user to suit her own needs.
-     This option is only available if the target language is C.
-     The default value is 0.
-
-@example
-/* Generated from double.cloog with @strong{option -callable 0} */
-for (i=0;i<=M;i++) @{
-  S1 ;
-  for (j=0;j<=N;j++) @{
-    S2 ;
-    S3 ;
-  @}
-  S4 ;
-@}
-@end example
-@example
-/* Generated from double.cloog with @strong{option -callable 1} */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? ((n)-(d)+1)/(d) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? (n)/(d) : ((n)+(d)+1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) @{ hash(1); hash(i); @}
-#define S2(i,j) @{ hash(2); hash(i); hash(j); @}
-#define S3(i,j) @{ hash(3); hash(i); hash(j); @}
-#define S4(i) @{ hash(4); hash(i); @}
-
-void test(int M, int N)
-@{
-  /* Original iterators. */
-  int i, j;
-  for (i=0;i<=M;i++) @{
-    S1(i) ;
-    for (j=0;j<=N;j++) @{
-      S2(i,j) ;
-      S3(i,j) ;
-    @}
-    S4(i) ;
-  @}
-@}
-@end example
-
-@node Output
-@subsection Output @code{-o <output>}
-
-     @code{-o <output>}: this option sets the output file. @code{stdout} is a
-     special value: when used, output is standard output.
-     Default value is @code{stdout}.
-
-@node OpenScop
-@subsection OpenScop @code{-openscop}
-
-     @code{-openscop}: this option states that the input file complies to
-     the OpenScop specification instead of the native file format
-     (@pxref{Bas11}). This option is available only if the OpenScop
-     support has been enabled at compile time (@pxref{Optional Features}).
-
-@node Help
-@subsection Help @code{--help} or @code{-h}
-
-     @code{--help} or @code{-h}: this option ask CLooG to print a short help.
-
-@node Version
-@subsection Version @code{--version} or @code{-v}
-
-     @code{--version} or @code{-v}: this option ask CLooG to print some version
-     informations.
-
-@node Quiet
-@subsection Quiet @code{--quiet} or @code{-q}
-
-     @code{--quiet} or @code{-q}: this option tells CLooG not to print
-     any informational messages.
-
-
-@c %/*************************************************************************
-@c % *                           A Full Example                              *
-@c % *************************************************************************/
-@node Full Example
-@section A Full Example
-
-Let us consider the allocation problem of a Gaussian elimination, i.e. we want
-to distribute the various statement instances of the compute kernel onto
-different processors. The original code is the following:
-@example
-@group
-for (i=1;j<=N-1;i++) @{
-  for (j=i+1;j<=N;j++) @{
-    c[i][j] = a[j][i]/a[i][i] ;    /* S1 */
-    for (k=i+1;k<=N;k++) @{
-      a[j][k] -= c[i][j]*a[i][k] ; /* S2 */
-    @}
-  @}
-@}
-@end group
-@end example
-
-@noindent The best affine allocation functions can be found by any good automatic
-parallelizer like LooPo (@pxref{Gri04}):
-
-@tex
-$$
-\hbox{$ \cases{ \theta _{S1}(i,j)^T    &$=  (i)$\cr
-                \theta _{S2}(i,j,k)^T  &$=  (k)$}$}
-$$
-@end tex
-
-@ifnottex
-@example
-@group
-T_S1(i,j)^T   = (i)
-T_S2(i,j,k)^T = (k)
-@end group
-@end example
-@end ifnottex
-
-@noindent To ensure that on each processor, the set of statement instances is
-executed according to the original ordering, we add as minor scattering
-dimensions the original scheduling (@pxref{Scattering}):
-
-@tex
-$$
-\hbox{$ \cases{ \theta _{S1}(i,j)^T    &$=  (i,0,i,0,j,0)^T$\cr
-                \theta _{S2}(i,j,k)^T  &$=  (k,0,i,0,j,1,k,0)^T$}$}
-$$
-@end tex
-
-@ifnottex
-@example
-@group
-T_S1(i,j)^T   = (i,0,i,0,j,0)^T
-T_S2(i,j,k)^T = (k,0,i,0,j,1,k,0)^T
-@end group
-@end example
-@end ifnottex
-
-@noindent To ensure that the scattering functions have the same dimensionality, we
-complete the first function with zeroes
-(this is a CLooG @value{VERSION} and previous versions requirement,
-it should be removed in a future version, don't worry it's absolutely legal !):
-
-@tex
-$$
-\hbox{$ \cases{ \theta _{S1}(i,j)^T    &$=  (i,0,i,0,j,0,0,0)^T$\cr
-                \theta _{S2}(i,j,k)^T  &$=  (k,0,i,0,j,1,k,0)^T$}$}
-$$
-@end tex
-
-@ifnottex
-@example
-@group
-T_S1(i,j)^T   = (i,0,i,0,j,0,0,0)^T
-T_S2(i,j,k)^T = (k,0,i,0,j,1,k,0)^T
-@end group
-@end example
-@end ifnottex
-
-@noindent The input file corresponding to this code generation problem
-could be (this file is provided in the CLooG distribution
-as @code{test/manual_gauss.cloog}:
-
-@example
-# ---------------------- CONTEXT ----------------------
-c # language is C
-
-# Context (no constraints on one parameter)
-1 3                     # 1 line and 3 columns    
-# eq/in n  1
-    1   0  0            # 0 >= 0, always true
-
-1 # We want to set manually the parameter name
-n                       # parameter name
-
-# --------------------- STATEMENTS --------------------
-2 # Number of statements
-
-1 # First statement: one domain
-4 5                     # 4 lines and 3 columns
-# eq/in i  j  n  1
-    1   1  0  0 -1      # i >= 1
-    1  -1  0  1 -1      # i <= n-1
-    1  -1  1  0 -1      # j >= i+1
-    1   0 -1  1  0      # j <= n
-0  0  0                 # for future options
- 
-1
-# Second statement: one domain
-6 6                     # 6 lines and 3 columns
-# eq/in i  j  k  n  1
-    1   1  0  0  0 -1   # i >= 1
-    1  -1  0  0  1 -1   # i <= n-1
-    1  -1  1  0  0 -1   # j >= i+1
-    1   0 -1  0  1  0   # j <= n
-    1  -1  0  1  0 -1   # k >= i+1
-    1   0  0 -1  1  0   # k <= n
-0  0  0                 # for future options
-
-0 # We let CLooG set the iterator names
-
-# --------------------- SCATTERING --------------------
-2 # Scattering functions
-# First function
-8 13                    # 3 lines and 3 columns
-# eq/in p1 p2 p3 p4 p5 p6 p7 p8  i  j  n  1
-    0    1  0  0  0  0  0  0  0 -1  0  0  0     # p1 = i
-    0    0  1  0  0  0  0  0  0  0  0  0  0     # p2 = 0
-    0    0  0  1  0  0  0  0  0 -1  0  0  0     # p3 = i
-    0    0  0  0  1  0  0  0  0  0  0  0  0     # p4 = 0
-    0    0  0  0  0  1  0  0  0  0 -1  0  0     # p5 = j
-    0    0  0  0  0  0  1  0  0  0  0  0  0     # p6 = 0
-    0    0  0  0  0  0  0  1  0  0  0  0  0     # p7 = 0
-    0    0  0  0  0  0  0  0  1  0  0  0  0     # p8 = 0
-# Second function
-8 14                    # 3 lines and 3 columns
-# eq/in p1 p2 p3 p4 p5 p6 p7 p8  i  j  k  n  1
-    0    1  0  0  0  0  0  0  0  0  0 -1  0  0  # p1 = k
-    0    0  1  0  0  0  0  0  0  0  0  0  0  0  # p2 = 0
-    0    0  0  1  0  0  0  0  0 -1  0  0  0  0  # p3 = i
-    0    0  0  0  1  0  0  0  0  0  0  0  0  0  # p4 = 0
-    0    0  0  0  0  1  0  0  0  0 -1  0  0  0  # p5 = j
-    0    0  0  0  0  0  1  0  0  0  0  0  0 -1  # p6 = 1
-    0    0  0  0  0  0  0  1  0  0  0 -1  0  0  # p7 = k
-    0    0  0  0  0  0  0  0  1  0  0  0  0  0  # p8 = 0
-
-1 # We want to set manually the scattering dimension names
-p1 p2 p3 p4 p5 p6 p7 p8 # scattering dimension names
-@end example
-
-Calling CLooG, with for instance the command line
-@code{cloog -fsp 2 gauss.cloog} for a better view
-of the allocation (the processor number is given by @code{p1}),
-will result on the following target code that actually implements
-the transformation. A minor processing on the dimension @code{p1}
-to implement, e.g., MPI calls, which is not shown here may
-result in dramatic speedups !
-
-@example
-if (n >= 2) @{
-  p1 = 1 ;
-  for (p5=2;p5<=n;p5++) @{
-    S1(i = 1,j = p5) ;
-  @}
-@}
-for (p1=2;p1<=n-1;p1++) @{
-  for (p3=1;p3<=p1-1;p3++) @{
-    for (p5=p3+1;p5<=n;p5++) @{
-      S2(i = p3,j = p5,k = p1) ;
-    @}
-  @}
-  for (p5=p1+1;p5<=n;p5++) @{
-    S1(i = p1,j = p5) ;
-  @}
-@}
-if (n >= 2) @{
-  p1 = n ;
-  for (p3=1;p3<=n-1;p3++) @{
-    for (p5=p3+1;p5<=n;p5++) @{
-      S2(i = p3,j = p5,k = n) ;
-    @}
-  @}
-@}
-@end example
-
-
-@c %/*************************************************************************
-@c % *                           A Full Example                              *
-@c % *************************************************************************/
-@node CLooG Library
-@chapter Using the CLooG Library
-The CLooG Library was implemented to allow the user to call CLooG
-directly from his programs, without file accesses or system calls. The
-user only needs to link his programs with C libraries. The CLooG
-library mainly provides one function (@code{cloog_clast_create_from_input})
-which takes as input the problem
-description with some options, and returns the data structure corresponding
-to the generated code (a @code{struct clast_stmt} structure)
-which is more or less an abstract syntax tree.
-The user can work with this data structure and/or use
-our pretty printing function to write the final code in either C or FORTRAN.
-Some other functions are provided for convenience reasons.
-These functions as well as the data structures are described in this section.
-
-@menu
-* CLooG Data Structures::
-* CLooG Output::
-* Retrieving version information::
-* Example of Library Utilization::
-@end menu
-
-
-@node CLooG Data Structures
-@section CLooG Data Structures Description
-In this section, we describe the data structures used by the loop
-generator to represent and to process a code generation problem.
-
-@menu
-* CloogState::
-* CloogMatrix::
-* CloogDomain::
-* CloogScattering::
-* CloogUnionDomain::
-* CloogStatement::
-* CloogOptions::
-* CloogInput::
-@end menu
-
-
-@node CloogState
-@subsection CloogState
-@example
-@group
-CloogState *cloog_state_malloc(void);
-void cloog_state_free(CloogState *state);
-@end group
-@end example
-
-@noindent The @code{CloogState} structure is (implicitly) needed to perform
-any CLooG operation.  It should be created using @code{cloog_state_malloc}
-before any other CLooG objects are created and destroyed using
-@code{cloog_state_free} after all objects have been freed.
-It is allowed to use more than one @code{CloogState} structure at
-the same time, but an object created within the state of a one
-@code{CloogState} structure is not allowed to interact with an object
-created within the state of an other @code{CloogState} structure.
-
-
-@node CloogMatrix
-@subsection CloogMatrix
-
-@noindent The @code{CloogMatrix} structure is equivalent to the PolyLib
-@code{Matrix} data structure (@pxref{Wil93}). This structure is devoted to
-represent a set of constraints.
-
-@example
-@group
-struct cloogmatrix
-@{ unsigned NbRows ;    /* Number of rows. */
-  unsigned NbColumns ; /* Number of columns. */
-  cloog_int_t **p;     /* Array of pointers to the matrix rows. */
-  cloog_int_t *p_Init; /* Matrix rows contiguously in memory. */
-@};
-typedef struct cloogmatrix CloogMatrix;
-
-CloogMatrix *cloog_matrix_alloc(unsigned NbRows, unsigned NbColumns);
-void cloog_matrix_print(FILE *foo, CloogMatrix *m);
-void cloog_matrix_free(CloogMatrix *matrix);
-@end group
-@end example
-
-@noindent The whole matrix is stored in memory row after row at the
-@code{p_Init} address. @code{p} is an array of pointers where
-@code{p[i]} points to the first element of the @math{i^{th}} row.
-@code{NbRows} and @code{NbColumns} are respectively the number of
-rows and columns of the matrix. 
-Each row corresponds to a constraint. The first element of each row is an
-equality/inequality tag. The
-constraint is an equality @math{p(x) = 0} if the first element is 0, but it is
-an inequality @math{p(x) \geq 0} if the first element is 1.
-The next elements are the coefficients of the unknowns,
-followed by the coefficients of the parameters, and finally the constant term.
-For instance, the following three constraints:
-
-@tex
-$$
-\hbox{$ \cases{ -i + m       &$= 0$\cr
-                -j + n       &$\geq 0$\cr
-                 j + i - k   &$\geq 0$}$}
-$$
-@end tex
-
-@ifnottex
-@example
-@group
-    -i + m  = 0
-    -j + n >= 0
- i + j - k >= 0
-@end group
-@end example
-@end ifnottex
-
-@noindent would be represented by the following rows:
-
-@example
-@group
-# eq/in  i   j   k   m   n   cst
-    0    0  -1   0   1   0    0 
-    1   -1   0   0   0   1    0 
-    1    1   1  -1   0   0    0 
-@end group
-@end example
-
-@noindent To be able to provide different precision version (CLooG
-supports 32 bits, 64 bits and arbitrary precision through the GMP library),
-the @code{cloog_int_t} type depends on the configuration options (it may be
-@code{long int} for 32 bits version, @code{long long int} for 64 bits version,
-and @code{mpz_t} for multiple precision version).
-
-@node CloogDomain
-@subsection CloogDomain
-@example
-@group
-CloogDomain *cloog_domain_union_read(CloogState *state,
-                                     FILE *input, int nb_parameters);
-CloogDomain *cloog_domain_from_cloog_matrix(CloogState *state,
-                                    CloogMatrix *matrix, int nb_par);
-void cloog_domain_free(CloogDomain *domain);
-@end group
-@end example
-
-@noindent @code{CloogDomain} is an opaque type representing a polyhedral
-domain (a union of polyhedra).
-A @code{CloogDomain} can be read
-from a file using @code{cloog_domain_union_read} or
-converted from a @code{CloogMatrix}.
-The input format for @code{cloog_domain_union_read}
-is that of @ref{Domain Representation}.
-The function @code{cloog_domain_from_cloog_matrix} takes a @code{CloogState}, a
-@code{CloogMatrix} and @code{int} as input and returns a pointer to a
-@code{CloogDomain}. @code{matrix} describes the domain and @code{nb_par} is the
-number of parameters in this domain. The input data structures are neither
-modified nor freed.
-The @code{CloogDomain} can be freed using @code{cloog_domain_free}.
-There are also some backend dependent functions for creating
-@code{CloogDomain}s.
-
-@menu
-* CloogDomain/PolyLib::
-* CloogDomain/isl::
-@end menu
-
-@node CloogDomain/PolyLib
-@subsubsection PolyLib
-
-@example
-#include <cloog/polylib/cloog.h>
-CloogDomain *cloog_domain_from_polylib_polyhedron(CloogState *state,
-                                        Polyhedron *, int nb_par);
-@end example
-@noindent
-The function @code{cloog_domain_from_polylib_polyhedron} takes a PolyLib
-@code{Polyhedron} as input and returns a pointer to a @code{CloogDomain}.
-The @code{nb_par} parameter indicates the number of parameters
-in the domain.  The input data structure if neither modified nor freed.
-
-@node CloogDomain/isl
-@subsubsection isl
-
-@example
-#include <cloog/isl/cloog.h>
-CloogDomain *cloog_domain_from_isl_set(struct isl_set *set);
-__isl_give isl_set *isl_set_from_cloog_domain(CloogDomain *domain);
-@end example
-@noindent
-The function @code{cloog_domain_from_isl_set} takes a
-@code{struct isl_set} as input and returns a pointer to a @code{CloogDomain}.
-The function consumes a reference to the given @code{struct isl_set}.
-Similarly, @code{isl_set_from_cloog_domain} consumes a reference
-to a @code{CloogDomain} and returns an @code{isl_set}.
-
-
-@node CloogScattering
-@subsection CloogScattering
-@example
-@group
-CloogScattering *cloog_domain_read_scattering(CloogDomain *domain,
-                                              FILE *foo);
-CloogScattering *cloog_scattering_from_cloog_matrix(CloogState *state,
-                         CloogMatrix *matrix, int nb_scat, int nb_par);
-void cloog_scattering_free(CloogScattering *);
-@end group
-@end example
-
-@noindent
-The @code{CloogScattering} type represents a scattering function.
-A @code{CloogScattering} for a given @code{CloogDomain} can be read
-from a file using @code{cloog_scattering_read} or converted
-from a @code{CloogMatrix} using @code{cloog_scattering_from_cloog_matrix}.
-The function @code{cloog_scattering_from_cloog_matrix} takes a
-@code{CloogState}, a @code{CloogMatrix} and two @code{int}s as input and
-returns a
-pointer to a @code{CloogScattering}.
-@code{matrix} describes the scattering, while @code{nb_scat} and
-@code{nb_par} are the number of scattering dimensions and
-the number of parameters, respectively. The input data structures are
-neither modified nor freed.
-A @code{CloogScattering} can be freed using @code{cloog_scattering_free}.
-There are also some backend dependent functions for creating
-@code{CloogScattering}s.
-
-@menu
-* CloogScattering/PolyLib::
-* CloogScattering/isl::
-@end menu
-
-@node CloogScattering/PolyLib
-@subsubsection PolyLib
-
-@example
-#include <cloog/polylib/cloog.h>
-CloogScattering *cloog_scattering_from_polylib_polyhedron(
-        CloogState *state, Polyhedron *polyhedron, int nb_par);
-@end example
-@noindent
-The function @code{cloog_scattering_from_polylib_polyhedron} takes a PolyLib
-@code{Polyhedron} as input and returns a pointer to a @code{CloogScattering}.
-The @code{nb_par} parameter indicates the number of parameters
-in the domain.  The input data structure if neither modified nor freed.
-
-@node CloogScattering/isl
-@subsubsection isl
-
-@example
-#include <cloog/isl/cloog.h>
-CloogScattering *cloog_scattering_from_isl_map(struct isl_map *map);
-@end example
-@noindent
-The function @code{cloog_scattering_from_isl_map} takes a
-@code{struct isl_map} as input and returns a pointer to a @code{CloogScattering}.
-The output dimensions of the @code{struct isl_map} correspond to the
-scattering dimensions, while the input dimensions correspond to the
-domain dimensions.
-The function consumes a reference to the given @code{struct isl_map}.
-
-
-@node CloogUnionDomain
-@subsection CloogUnionDomain
-@example
-@group
-enum cloog_dim_type @{ CLOOG_PARAM, CLOOG_ITER, CLOOG_SCAT @};
-
-CloogUnionDomain *cloog_union_domain_alloc(int nb_par);
-CloogUnionDomain *cloog_union_domain_add_domain(CloogUnionDomain *ud,
-        const char *name, CloogDomain *domain,
-        CloogScattering *scattering, void *usr);
-CloogUnionDomain *cloog_union_domain_set_name(CloogUnionDomain *ud,
-        enum cloog_dim_type type, int index, const char *name);
-void cloog_union_domain_free(CloogUnionDomain *ud);
-@end group
-@end example
-
-@noindent A @code{CloogUnionDomain} structure represents a union
-of scattered named domains.  A @code{CloogUnionDomain} is
-initialized by a call to @code{cloog_union_domain_alloc},
-after which domains can be added using @code{cloog_union_domain_add_domain}.
-
-@code{cloog_union_domain_alloc} takes the number of parameters as input.
-@code{cloog_union_domain_add_domain} takes a previously created
-@code{CloogUnionDomain} as input along with an optional name,
-a domain, an optional scattering function and a user pointer.
-The name may be @code{NULL} and is duplicated if it is not.
-If no name is specified, then the statements will be named according
-to the order in which they were added.
-@code{domain} and @code{scattering} are taken over
-by the @code{CloogUnionDomain}.  @code{scattering} may be @code{NULL},
-but it must be consistently @code{NULL} or not over all calls
-to @code{cloog_union_domain_add_domain}.
-@code{cloog_union_domain_set_name} can be used to set the names
-of parameters, iterators and scattering dimensions.
-The names of iterators and scattering dimensions can only be set
-after all domains have been added.
-
-There is also a backend dependent function for creating
-@code{CloogUnionDomain}s.
-
-@menu
-* CloogUnionDomain/isl::
-@end menu
-
-@node CloogUnionDomain/isl
-@subsubsection isl
-
-@example
-#include <cloog/isl/cloog.h>
-CloogUnionDomain *cloog_union_domain_from_isl_union_map(
-        __isl_take isl_union_map *umap);
-CloogUnionDomain *cloog_union_domain_from_isl_set(
-	__isl_take isl_set *set);
-@end example
-@noindent
-The function @code{cloog_union_domain_from_isl_union_map} takes a
-@code{isl_union_map} as input and returns a pointer
-to a @code{CloogUnionDomain}.
-The input is a mapping from different
-spaces (different tuple names and possibly different dimensions)
-to a common space.  The iteration domains are set to the domains
-in each space.  The statement names are set to the names of the
-spaces.  The parameter names of the result are set to those of
-the input, but the iterator and scattering dimension names are
-left unspecified.
-The function consumes a reference to the given @code{isl_union_map}.  The
-function @code{cloog_union_domain_from_isl_set} is similar, but takes an
-unscattered domain as input. It is not defined for an union_set, because the
-order of iterations from two different isl_sets is undefined, if no scattering
-is provided.
-
-
-@node CloogStatement
-@subsection CloogStatement
-@example
-@group
-struct cloogstatement
-@{ int number ;                  /* The statement unique number. */
-  char *name;                   /* Name of the statement. */
-  void * usr ;                  /* Pointer for user's convenience. */
-  struct cloogstatement * next ;/* Next element of the linked list. */
-@} ;
-typedef struct cloogstatement CloogStatement ;
-
-CloogStatement *cloog_statement_malloc(CloogState *state);
-void cloog_statement_print(FILE *, CloogStatement *);
-void cloog_statement_free(CloogStatement *);
-@end group
-@end example
-
-@noindent The @code{CloogStatement} structure represents a @code{NULL}
-terminated linked
-list of statements. In CLooG, a statement is only defined by its unique
-number (@code{number}). The user can use the pointer @code{usr} for his
-own convenience to link his own statement representation to the
-corresponding @code{CloogStatement} structure. The whole management of the
-@code{usr} pointer is under the responsibility of the user, in particular,
-CLooG never tries to print, to allocate or to free a memory block pointed
-by @code{usr}. 
-
-
-
-@node CloogOptions
-@subsection CloogOptions
-@example
-@group
-struct cloogoptions
-@{ int l;                     /* -l option.                                 */
-  int f;                     /* -f option.                                 */
-  int strides;               /* -strides option.                           */
-  int sh;                    /* -sh option.                                */
-  int first_unroll;          /* -first-unroll option.                      */
-  int esp;                   /* -esp option.                               */
-  int fsp;                   /* -fsp option.                               */
-  int otl;                   /* -otl option.                               */
-  int block;                 /* -block option.                             */
-  int compilable;            /* -compilable option.                        */
-  int language;              /* CLOOG_LANGUAGE_C or CLOOG_LANGUAGE_FORTRAN */
-  int save_domains;          /* Save unsimplified copy of domain.          */
-@} ;
-typedef struct cloogoptions CloogOptions ;
-
-CloogOptions *cloog_options_malloc(CloogState *state);
-void cloog_options_print(FILE *foo, CloogOptions *options);
-void cloog_options_free(CloogOptions *options);
-@end group
-@end example
-
-@noindent The @code{CloogOptions} structure contains all the possible options to
-rule CLooG's behaviour (@pxref{Calling CLooG}).
-As a reminder, the default values are:
-@itemize @bullet
-@item @math{l = -1} (optimize control until the innermost loops),
-@item @math{f = 1} (optimize control from the outermost loops),
-@item @math{strides = 0} (use only unit strides),
-@item @math{sh = 0} (do not compute simple convex hulls),
-@item @math{first\_unroll = -1} (do not perform unrolling),
-@item @math{esp = 1} (spread complex equalities),
-@item @math{fsp = 1} (start to spread from the first iterators),
-@item @math{otl = 1} (simplify loops running only once).
-@item @math{block = 0} (do not make statement blocks when not necessary).
-@item @math{compilable = 0} (do not generate a compilable code).
-@end itemize 
-
-The @code{save_domains} option is only useful for users of the CLooG
-library.  This option defaults to 0, but when it is set, the @code{domain}
-field of each @code{clast_user_stmt} will be set to the set of values for the
-scattering dimensions for which this instance of the user statement is executed.
-The @code{domain} field of each @code{clast_for} contains the set of values for
-the scattering dimensions for which an instance of a user statement is executed
-inside the @code{clast_for}. It is only available if the @code{clast_for}
-enumerates a scattering dimension.
-
-@node CloogInput
-@subsection CloogInput
-@example
-@group
-CloogInput *cloog_input_read(FILE *file, CloogOptions *options);
-CloogInput *cloog_input_alloc(CloogDomain *context,
-                                CloogUnionDomain *ud);
-void cloog_input_free(CloogInput *input);
-
-void cloog_input_dump_cloog(FILE *, CloogInput *, CloogOptions *);
-@end group
-@end example
-
-@noindent A @code{CloogInput} structure represents the input to CLooG.
-It is essentially a @code{CloogUnionDomain} along with a context
-@code{CloogDomain}.  A @code{CloogInput} can be created from
-a @code{CloogDomain} and a @code{CloogUnionDomains} using
-@code{cloog_input_alloc}, or it can be read from a CLooG input
-file using @code{cloog_input_read}.  The latter also modifies
-the @code{language} field of the @code{CloogOptions} structure.
-The constructed @code{CloogInput} can be used as input
-to a @code{cloog_clast_create_from_input} call.
-
-A @code{CloogInput} data structure and a @code{CloogOptions} contain
-the same information as a .cloog file. This function dumps the .cloog
-description of the given data structures into a file.
-
-@node Dump CLooG Input File Function
-@subsection Dump CLooG Input File Function
-@example
-@end example
-
-@node CLooG Output
-@section CLooG Output
-
-@noindent
-Given a description of the input,
-an AST corresponding to the @code{CloogInput} can be constructed
-using @code{cloog_clast_create_from_input} and destroyed using
-@code{free_clast_stmt}.
-@example
-struct clast_stmt *cloog_clast_create_from_input(CloogInput *input,
-                                      CloogOptions *options);
-void free_clast_stmt(struct clast_stmt *s);
-@end example
-@noindent
-@code{clast_stmt} represents a linked list of ``statements''.
-@example
-struct clast_stmt @{
-    const struct clast_stmt_op    *op;
-    struct clast_stmt	*next;
-@};
-@end example
-@noindent
-The entries in the list are not of type @code{clast_stmt} itself,
-but of some larger type.  The following statement types are defined
-by CLooG.
-
-@example
-struct clast_root @{
-    struct clast_stmt   stmt;
-    CloogNames *        names;
-@};
-struct clast_root *new_clast_root(CloogNames *names);
-
-struct clast_assignment @{
-    struct clast_stmt   stmt;
-    const char *        LHS;
-    struct clast_expr * RHS;
-@};
-struct clast_assignment *new_clast_assignment(const char *lhs,
-                                              struct clast_expr *rhs);
-
-struct clast_block @{
-    struct clast_stmt   stmt;
-    struct clast_stmt * body;
-@};
-struct clast_block *new_clast_block(void);
-
-struct clast_user_stmt @{
-    struct clast_stmt   stmt;
-    CloogDomain *	domain;
-    CloogStatement *    statement;
-    struct clast_stmt * substitutions;
-@};
-struct clast_user_stmt *new_clast_user_stmt(CloogDomain *domain,
-    CloogStatement *stmt, struct clast_stmt *subs);
-
-struct clast_for @{
-    struct clast_stmt   stmt;
-    CloogDomain *       domain;
-    const char *        iterator;
-    struct clast_expr * LB;
-    struct clast_expr * UB;
-    cloog_int_t         stride;
-    struct clast_stmt * body;
-@};
-struct clast_for *new_clast_for(CloogDomain *domain, const char *it,
-                                struct clast_expr *LB, struct clast_expr *UB,
-                                cloog_int_t stride);
-
-struct clast_guard @{
-    struct clast_stmt   stmt;
-    struct clast_stmt * then;
-    int                 n;
-    struct clast_equation       eq[1];
-@};
-struct clast_guard *new_clast_guard(int n);
-@end example
-@noindent
-The @code{clast_stmt} returned by @code{cloog_clast_create}
-is a @code{clast_root}.
-It contains a placeholder for all the variable names that appear
-in the AST and a (list of) nested statement(s).
-
-@noindent
-A @code{clast_assignment} assigns the value given by
-the @code{clast_expr} @code{RHS} to a variable named @code{LHS}.
-
-@noindent
-A @code{clast_block} groups a list of statements into one statement.
-These statements are only generated if the @code{block} option is set,
-@pxref{Statement Block} and @ref{CloogOptions}.
-
-@noindent
-A @code{clast_user_stmt} represents a call to a statement specified
-by the user, @pxref{CloogStatement}.
-@code{substitutions} is a list of @code{clast_assignment} statements
-assigning an expression in terms of the scattering dimensions to
-each of the original iterators in the original order.
-The @code{LHS}s of these assignments are left blank (@code{NULL}).
-The @code{domain} is set to @code{NULL} if the @code{save_domains} option
-is not set.  Otherwise, it is set to the set
-of values for the scattering dimensions
-for which this instance of the user statement is executed.
-Note that unless the @code{noscalars} option has been set, the
-constant scattering dimensions may have been removed from this set.
-
-@noindent
-A @code{clast_for} represents a for loop, iterating @code{body} for each
-value of @code{iterator} between @code{LB} and @code{UB} in steps
-of size @code{stride}.
-The @code{domain} is set to @code{NULL} if the @code{save_domains} option is not
-set.  Otherwise, it is set to the set of values for the scattering dimensions
-for which a user statement is executed inside this @code{clast_for}.  Note that
-unless the @code{noscalars} option has been set, the constant scattering
-dimensions may have been removed from this set.
-
-@noindent
-A @code{clast_guard} represents the guarded execution of the @code{then}
-(list of) statement(s) by a conjunction of @code{n} (in)equalities.
-Each (in)equality is represented by a @code{clast_equation}.
-@example
-struct clast_equation @{
-    struct clast_expr *	LHS;
-    struct clast_expr *	RHS;
-    int			sign;
-@};
-@end example
-@noindent
-The condition expressed by a @code{clast_equation} is
-@code{LHS <= RHS}, @code{LHS == RHS} or @code{LHS >= RHS}
-depending on whether @code{sign} is less than zero, equal
-to zero, or greater than zero.
-
-The dynamic type of a @code{clast_stmt} can be determined
-using the macro @code{CLAST_STMT_IS_A(stmt,type)},
-where @code{stmt} is a pointer to a @code{clast_stmt}
-and @code{type} is one of @code{stmt_root}, @code{stmt_ass},
-@code{stmt_user}, @code{stmt_block}, @code{stmt_for} or
-@code{stmt_guard}.
-Users are allowed to define their own statement types by
-assigning the @code{op} field of the statements a pointer
-to a @code{clast_stmt_op} structure.
-@example
-struct clast_stmt_op @{
-    void (*free)(struct clast_stmt *);
-@};
-@end example
-@noindent
-The @code{free} field of this structure should point
-to a function that frees the user defined statement.
-
-@noindent
-A @code{clast_expr} can be an identifier, a term,
-a binary expression or a reduction.
-@example
-enum clast_expr_type @{
-    clast_expr_name,
-    clast_expr_term,
-    clast_expr_bin,
-    clast_expr_red
-@};
-struct clast_expr @{
-    enum clast_expr_type type;
-@};
-void free_clast_expr(struct clast_expr *e);
-@end example
-
-@noindent
-Identifiers are of subtype @code{clast_name}.
-@example
-struct clast_name @{
-    struct clast_expr	expr;
-    const char *	name;
-@};
-struct clast_name *new_clast_name(const char *name);
-void free_clast_name(struct clast_name *t);
-@end example
-@noindent
-The character string pointed to by @code{name} is
-assumed to be part of the @code{CloogNames} structure
-in the root of the clast as is therefore not copied.
-
-@noindent
-Terms are of type @code{clast_term}.
-@example
-struct clast_term @{
-    struct clast_expr   expr;
-    cloog_int_t         val;
-    struct clast_expr  *var;
-@};
-struct clast_term *new_clast_term(cloog_int_t c, struct clast_expr *v);
-void free_clast_term(struct clast_term *t);
-@end example
-@noindent
-If @code{var} is set to @code{NULL}, then the term represents
-the integer value @code{val}.  Otherwise, it represents
-the term @code{val * var}.
-@code{new_clast_term} simply copies the @code{v} pointer
-without copying the underlying @code{clast_expr}.
-@code{free_clast_term}, on the other hand, recursively frees
-@code{var}.
-
-@noindent
-Binary expressions are of type @code{clast_bin_type} and
-represent either the floor of a division (fdiv),
-the ceil of a division (cdiv), an exact division or
-the remainder of an fdiv.
-@example
-enum clast_bin_type @{ clast_bin_fdiv, clast_bin_cdiv, 
-                      clast_bin_div, clast_bin_mod @};
-struct clast_binary @{
-    struct clast_expr   expr;
-    enum clast_bin_type type;
-    struct clast_expr*  LHS;
-    cloog_int_t         RHS;
-@};
-struct clast_binary *new_clast_binary(enum clast_bin_type t, 
-                          struct clast_expr *lhs, cloog_int_t rhs);
-void free_clast_binary(struct clast_binary *b);
-@end example
-
-@noindent
-Reductions are of type @code{clast_reduction} and
-can represent either the sum, the minimum or the maximum
-of its elements.
-@example
-enum clast_red_type @{ clast_red_sum, clast_red_min, clast_red_max @};
-struct clast_reduction @{
-    struct clast_expr   expr;
-    enum clast_red_type type;
-    int                 n;
-    struct clast_expr*  elts[1];
-@};
-struct clast_reduction *new_clast_reduction(enum clast_red_type t,
-                                            int n);
-void free_clast_reduction(struct clast_reduction *r);
-@end example
-
-@node Retrieving version information
-@section Retrieving version information
-CLooG provides static and dynamic version checks to assist on
-including a compatible version of the library.
-A static version check at compile time can be achieved by
-querying the version constants defined in @code{version.h}:
-
-@itemize @bullet
-@item @code{CLOOG_VERSION_MAJOR}
-@item @code{CLOOG_VERSION_MINOR}
-@item @code{CLOOG_VERSION_REVISION}
-@end itemize
-
-This way it is possible to ensure the included headers are of the
-correct version. It is still possible that the installed CLooG
-library version differs from the installed headers.
-In order to avoid this, a dynamic version check is provided with
-the functions:
-
-@example
-@group
-int cloog_version_major(void);
-int cloog_version_minor(void);
-int cloog_version_revision(void);
-@end group
-@end example
-
-By using both the static and the dynamic version check, it is possible
-to match CLooG's header version with the library's version.
-
-@node Example of Library Utilization
-@section Example of Library Utilization
-Here is a basic example showing how it is possible to use the CLooG library,
-assuming that a standard installation has been done.
-The following C program reads a CLooG input file on the standard input,
-then prints the solution on the standard output.
-Options are preselected to the default values of the CLooG software.
-This example is provided in the @code{example} directory of the
-CLooG distribution.
-@example
-/* example.c */
-# include <stdio.h>
-# include <cloog/cloog.h>
-
-int main()
-@{
-  CloogState *state;
-  CloogInput *input;
-  CloogOptions * options ;
-  struct clast_stmt *root;
-  
-  /* Setting options and reading program informations. */
-  state = cloog_state_malloc();
-  options = cloog_options_malloc(state);
-  input = cloog_input_read(stdin, options);
-
-  /* Generating and printing the code. */
-  root = cloog_clast_create_from_input(input, options);
-  clast_pprint(stdout, root, 0, options);
-
-  cloog_clast_free(root);
-  cloog_options_free(options) ;
-  cloog_state_free(state);
-  return 0;
-@}
-@end example
-
-@noindent The compilation command could be:
-@example
-gcc example.c -lcloog -o example
-@end example
-@noindent A calling command with the input file test.cloog could be:
-@example
-more test.cloog | ./example
-@end example
-
-
-@c %  ******************************** HACKING *********************************
-@c @node Hacking
-@c @chapter Hacking CLooG
-
-@c @menu
-@c * Program organization::
-@c * Special Options::
-@c * CLooG Coding Standards::
-@c @end menu
-
-@c @node Program organization
-@c @section Program organization
-
-@c @node Special Options
-@c @section Special Options
-
-@c @node CLooG Coding Standards
-@c @section CLooG Coding Standards
-
-
-@c %  ****************************** INSTALLING ********************************
-@node Installing
-@chapter Installing CLooG
-
-@menu
-* License::
-* Requirements::
-* Basic Installation::
-* Optional Features::
-* Uninstallation::
-@end menu
-
-@node License
-@section License
-First of all, it would be very kind to refer the following paper in any
-publication that result from the use of the CLooG software or its library,
-@pxref{Bas04} (a bibtex entry is provided behind the title page of this
-manual, along with copyright notice, and in the CLooG home
-@code{http://www.CLooG.org}.
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Lesser General Public License for more details.
-@code{http://www.gnu.org/licenses/lgpl-2.1.html}
-
-Note, though, that if you link CLooG against a GPL library such
-as the PolyLib backend, then the combination becomes GPL too.
-In particular, a CLooG library based on the PolyLib backend
-is GPL version 2 only.
-Since the isl backend is LGPL, linking against it does not affect
-the license of CLooG.
-
-
-@node Requirements
-@section Requirements
-
-CLooG can be used with one of two possible backends,
-one using isl and one using PolyLib.
-The isl library is included in the CLooG distribution,
-while the PolyLib library needs to be obtained separately.
-On the other hand, isl requires GMP, while PolyLib can be
-compiled with or without the use of GMP.
-The user therefore needs to install at least one of
-PolyLib or GMP.
-
-@menu
-* PolyLib::
-* GMP Library::
-@end menu
-
-
-@node PolyLib
-@subsection PolyLib (optional)
-To successfully install CLooG with the PolyLib backend,
-the user first needs to install PolyLib
-version 5.22.1 or above (default 64 bits version is satisfying
-as well as 32 bits or GMP multiple precision version).
-Polylib can be downloaded freely
-at @code{http://icps.u-strasbg.fr/PolyLib/} or
-@code{http://www.irisa.fr/polylib/}. Once downloaded and unpacked
-(e.g. using the @samp{tar -zxvf polylib-5.22.3.tar.gz} command),
-the user can compile
-it by typing the following commands on the PolyLib's root directory:
-
-@itemize @bullet
-@item @code{./configure}
-@item @code{make}
-@item And as root: @code{make install}
-@end itemize
-
-Alternatively, the latest development version can be obtained from the
-git repository:
-@itemize @bullet
-@item @code{git clone git://repo.or.cz/polylib.git}
-@item @code{cd polylib}
-@item @code{./autogen.sh}
-@item @code{./configure}
-@item @code{make}
-@item And as root: @code{make install}
-@end itemize
-
-The PolyLib default installation is @code{/usr/local}. This directory may
-not be inside your library path. To fix the problem, the user should set
-@example
-export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
-@end example
-@noindent if your shell is, e.g., bash or
-@example
-setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH:/usr/local/lib
-@end example
-@noindent if your shell is, e.g., tcsh. Add the line to your .bashrc or .tcshrc (or
-whatever convenient file) to make this change permanent. Another solution
-is to ask PolyLib to install in the standard path by using the prefix
-option of the configure script:
-@samp{./configure --prefix=/usr}.
-
-CLooG makes intensive calls to polyhedral operations, and PolyLib
-functions do the job. Polylib is a free library written in C for the
-manipulation of polyhedra. The library is operating on objects like
-vectors, matrices, lattices, polyhedra, Z-polyhedra, unions of
-polyhedra and a lot of other intermediary structures. It provides
-functions for all the important operations on these structures. 
-
-@node GMP Library
-@subsection GMP Library (optional)
-
-To be able to deal with insanely large coefficient, the user will need to
-install the GNU Multiple Precision Library (GMP for short) version 4.1.4
-or above. It can be freely downloaded from @code{http://www.swox.com/gmp}.
-Note that the isl backend currently requires GMP.
-The user can compile GMP by typing the following commands on the GMP root
-directory:
-
-@itemize @bullet
-@item @code{./configure}
-@item @code{make}
-@item And as root: @code{make install}
-@end itemize
-
-The GMP default installation is @code{/usr/local}, the same method to
-fix a library path problem applies as with PolyLib (@pxref{PolyLib}).
-
-If you want to use the PolyLib backend, then
-PolyLib has to be built using the GMP library by specifying the option
-@samp{--with-libgmp=PATH_TO_GMP} to the PolyLib configure script
-(where @code{PATH_TO_GMP} is @code{/usr/local} if you did not change the GMP
-installation directory). Then you have to set the convenient CLooG configure
-script options to build the GMP version (@pxref{Optional Features}).
-
-
-@node Basic Installation
-@section CLooG Basic Installation
-
-Once downloaded and unpacked
-(e.g. using the @samp{tar -zxvf cloog-@value{VERSION}.tar.gz} command),
-you can compile CLooG by typing the following commands on the CLooG's root
-directory:
-
-@itemize @bullet
-@item @code{./configure}
-@item @code{make}
-@item And as root: @code{make install}
-@end itemize
-
-Alternatively, the latest development version can be obtained from the
-git repository:
-@itemize @bullet
-@item @code{git clone git://repo.or.cz/cloog.git}
-@item @code{cd cloog}
-@item @code{./get_submodules.sh}
-@item @code{./autogen.sh}
-@item @code{./configure}
-@item @code{make}
-@item And as root: @code{make install}
-@end itemize
-
-Depending on which backend you want to use and where they
-are located, you may need to pass some
-options to the configure script, @pxref{Optional Features}.
-
-The program binaries and object files can be removed from the
-source code directory by typing @code{make clean}. To also remove the
-files that the @code{configure} script created (so you can compile the
-package for a different kind of computer) type @code{make distclean}.
-
-Both the CLooG software and library have been successfully compiled
-on the following systems:
-@itemize @bullet
-@item PC's under Linux, with the @code{gcc} compiler,
-@item PC's under Windows (Cygwin), with the @code{gcc} compiler,
-@item Sparc and UltraSparc Stations, with the @code{gcc} compiler.
-@end itemize
-
-@node Optional Features 
-@section Optional Features  
-The @code{configure} shell script attempts to guess correct values for
-various system-dependent variables and user options used during compilation.
-It uses those values to create the @code{Makefile}. Various user options
-are provided by the CLooG's configure script. They are summarized in the
-following list and may be printed by typing @code{./configure --help} in the
-CLooG top-level directory.
-
-@itemize @bullet
-@item By default, the installation directory is @code{/usr/local}:
-@code{make install} will install the package's files in
-@code{/usr/local/bin}, @code{/usr/local/lib} and @code{/usr/local/include}.
-The user can specify an installation prefix other than @code{/usr/local} by
-giving @code{configure} the option @code{--prefix=PATH}.
-
-@item By default, the isl backend will use the version of isl
-that is @code{bundled} together with CLooG.
-Using the @code{--with-isl} option of @code{configure}
-the user can specify that @code{no} isl,
-a previously installed (@code{system}) isl or a @code{build} isl
-should be used.
-In the latter case, the user should also specify the build location
-using @code{--with-isl-builddir=PATH}.
-In case of an installed isl,
-the installation location can be specified using the
-@code{--with-isl-prefix=PATH} and
-@code{--with-isl-exec-prefix=PATH} options of @code{configure}.
-
-@item By default, the PolyLib backend will use an installed
-(@code{system}) PolyLib, if any.
-The installation location can be specified using the
-@code{--with-polylib-prefix=PATH} and
-@code{--with-polylib-exec-prefix=PATH} options of @code{configure}.
-Using the @code{--with-polylib} option of @code{configure}
-the user can specify that @code{no} PolyLib or a @code{build} PolyLib
-should be used.
-In the latter case, the user should also specify the build location
-using @code{--with-polylib-builddir=PATH}.
-
-@item By default, the PolyLib backend of CLooG is built
-in 64bits version if such version of the
-PolyLib is found by @code{configure}. If the only existing version of the
-PolyLib is the 32bits or if the user give to @code{configure} the option
-@code{--with-bits=32}, the 32bits version of CLooG will be compiled. In the
-same way, the option @code{--with-bits=gmp} have to be used to build
-the multiple precision version.
-
-@item By default, @code{configure} will look for the GMP library
-(necessary to build the multiple precision version) in standard
-locations. If necessary, the user can specify the GMP path by giving
-@code{configure} the option @code{--with-gmp-prefix=PATH} and/or
-@code{--with-gmp-exec-prefix=PATH}.
-
-@item By default, the OpenScop Library (osl) support is not enabled.
-@c @code{configure} will use the bundled OpenScop Library (osl).
-Using the @code{--with-osl} option of @code{configure}
-the user can specify that @code{no} osl,
-a previously installed (@code{system}) osl, a @code{bundled} osl, or a
-@code{build} osl should be used.
-In the latter case, the user should also specify the build location
-using @code{--with-osl-builddir=PATH}.
-In case of an installed osl,
-the installation location can be specified using the
-@code{--with-osl-prefix=PATH} and
-@code{--with-osl-exec-prefix=PATH} options of @code{configure}.
-@end itemize
-
-@node Uninstallation 
-@section Uninstallation  
-The user can easily remove the CLooG software and library from his system
-by typing (as root if necessary) from the CLooG top-level directory
-@code{make uninstall}.
-
-@c %  **************************** DOCUMENTATION ******************************
-@node Documentation
-@chapter Documentation
-The CLooG distribution provides several documentation sources. First, the
-source code itself is as documented as possible. The code comments use a
-Doxygen-compatible presentation (something similar to what JavaDoc does for
-JAVA). The user may install Doxygen
-(see @code{http://www.stack.nl/~dimitri/doxygen}) to automatically
-generate a technical documentation by typing @code{make doc} or
-@code{doxygen ./autoconf/Doxyfile} at the CLooG top-level directory after
-running the configure script (@pxref{Installing}). Doxygen will generate
-documentation sources (in HTML, LaTeX and man) in the @code{doc/source}
-directory of the CLooG distribution.
-
-The Texinfo sources of the present document are also provided in the @code{doc}
-directory. You can build it in either DVI format (by typing
-@code{texi2dvi cloog.texi}) or PDF format
-(by typing @code{texi2pdf cloog.texi}) or HTML format
-(by typing @code{makeinfo --html cloog.texi}, using @code{--no-split}
-option to generate a single HTML file) or info format
-(by typing @code{makeinfo cloog.texi}).
-
-@c %  ****************************** REFERENCES ********************************
-@node References
-@chapter References
-
-@itemize
-@item
-@anchor{Bas03a}[Bas03a] C. Bastoul, P. Feautrier. Improving data locality
-by chunking. CC'12 International Conference on Compiler Construction,
-LNCS 2622, pages 320-335, Warsaw, april 2003. 
-
-@item
-@anchor{Bas03b}[Bas03b] C. Bastoul. Efficient code generation for automatic
-parallelization and optimization. ISPDC'03 IEEE International Symposium on
-Parallel and Distributed Computing, pages 23-30, Ljubljana, october 2003. 
-
-@item
-@anchor{Bas04}[Bas04] C. Bastoul. Code Generation in the Polyhedral Model
-Is Easier Than You Think. PACT'13 IEEE International Conference on Parallel
-Architecture and Compilation Techniques, pages 7-16, Juan-les-Pins,
-september 2004.
-
-@item
-@anchor{Bas11}[Bas11] C. Bastoul. A Specification and a Library for Data 
-Exchange in Polyhedral Compilation Tools. Technical Report,
-Paris-Sud University, France, September 2011.
-
-@item
-@anchor{Fea92}[Fea92] P. Feautrier Some efficient solutions to the affine
-scheduling problem, part II: multidimensional time.
-International Journal of Parallel Programming, 21(6):389--420, December 1992.
-
-@item
-@anchor{Gri04}[Gri04] M. Griebl. Automatic parallelization of loop programs
-for distributed memory architectures. Habilitation Thesis. Facult@"at f@"ur
-Mathematik und Informatik, Universit@"at Passau, 2004.
-@emph{http://www.infosun.fmi.uni-passau.de/cl/loopo/}
-
-@item
-@anchor{Qui00}[Qui00] F. Quiller@'e, S. Rajopadhye, and D. Wilde.
-Generation of efficient nested loops from polyhedra.
-International Journal of Parallel Programming, 28(5):469-498,
-october 2000.
-
-@item
-@anchor{Wil93}[Wil93] Doran K. Wilde.
-A library for doing polyhedral operations.
-Technical Report 785, IRISA, Rennes, France, 1993.
-
-@end itemize
-
-
-
-
-@c % /*************************************************************************
-@c %  *                       PART VI: END OF THE DOCUMENT                    *
-@c %  *************************************************************************/
-@c @unnumbered Index
-     
-@c @printindex cp
-     
-@bye
diff --git a/cloog-0.17.0/doc/images/basic.eps b/cloog-0.17.0/doc/images/basic.eps
deleted file mode 100644
index 0cc0497..0000000
--- a/cloog-0.17.0/doc/images/basic.eps
+++ /dev/null
@@ -1,402 +0,0 @@
-%!PS-Adobe-2.0 EPSF-2.0
-%%Title: basic.fig
-%%Creator: fig2dev Version 3.2 Patchlevel 4
-%%CreationDate: Thu Nov 17 16:54:54 2005
-%%For: bastoul@ulysse.futurs.inria.fr (Cedric Bastoul)
-%%BoundingBox: 0 0 445 301
-%%Magnification: 1.0000
-%%EndComments
-/$F2psDict 200 dict def
-$F2psDict begin
-$F2psDict /mtrx matrix put
-/col-1 {0 setgray} bind def
-/col0 {0.000 0.000 0.000 srgb} bind def
-/col1 {0.000 0.000 1.000 srgb} bind def
-/col2 {0.000 1.000 0.000 srgb} bind def
-/col3 {0.000 1.000 1.000 srgb} bind def
-/col4 {1.000 0.000 0.000 srgb} bind def
-/col5 {1.000 0.000 1.000 srgb} bind def
-/col6 {1.000 1.000 0.000 srgb} bind def
-/col7 {1.000 1.000 1.000 srgb} bind def
-/col8 {0.000 0.000 0.560 srgb} bind def
-/col9 {0.000 0.000 0.690 srgb} bind def
-/col10 {0.000 0.000 0.820 srgb} bind def
-/col11 {0.530 0.810 1.000 srgb} bind def
-/col12 {0.000 0.560 0.000 srgb} bind def
-/col13 {0.000 0.690 0.000 srgb} bind def
-/col14 {0.000 0.820 0.000 srgb} bind def
-/col15 {0.000 0.560 0.560 srgb} bind def
-/col16 {0.000 0.690 0.690 srgb} bind def
-/col17 {0.000 0.820 0.820 srgb} bind def
-/col18 {0.560 0.000 0.000 srgb} bind def
-/col19 {0.690 0.000 0.000 srgb} bind def
-/col20 {0.820 0.000 0.000 srgb} bind def
-/col21 {0.560 0.000 0.560 srgb} bind def
-/col22 {0.690 0.000 0.690 srgb} bind def
-/col23 {0.820 0.000 0.820 srgb} bind def
-/col24 {0.500 0.190 0.000 srgb} bind def
-/col25 {0.630 0.250 0.000 srgb} bind def
-/col26 {0.750 0.380 0.000 srgb} bind def
-/col27 {1.000 0.500 0.500 srgb} bind def
-/col28 {1.000 0.630 0.630 srgb} bind def
-/col29 {1.000 0.750 0.750 srgb} bind def
-/col30 {1.000 0.880 0.880 srgb} bind def
-/col31 {1.000 0.840 0.000 srgb} bind def
-
-end
-save
-newpath 0 301 moveto 0 0 lineto 445 0 lineto 445 301 lineto closepath clip newpath
--153.0 333.0 translate
-1 -1 scale
-
-/cp {closepath} bind def
-/ef {eofill} bind def
-/gr {grestore} bind def
-/gs {gsave} bind def
-/sa {save} bind def
-/rs {restore} bind def
-/l {lineto} bind def
-/m {moveto} bind def
-/rm {rmoveto} bind def
-/n {newpath} bind def
-/s {stroke} bind def
-/sh {show} bind def
-/slc {setlinecap} bind def
-/slj {setlinejoin} bind def
-/slw {setlinewidth} bind def
-/srgb {setrgbcolor} bind def
-/rot {rotate} bind def
-/sc {scale} bind def
-/sd {setdash} bind def
-/ff {findfont} bind def
-/sf {setfont} bind def
-/scf {scalefont} bind def
-/sw {stringwidth} bind def
-/tr {translate} bind def
-/tnt {dup dup currentrgbcolor
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
-  bind def
-/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
-  4 -2 roll mul srgb} bind def
-/reencdict 12 dict def /ReEncode { reencdict begin
-/newcodesandnames exch def /newfontname exch def /basefontname exch def
-/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def
-basefontdict { exch dup /FID ne { dup /Encoding eq
-{ exch dup length array copy newfont 3 1 roll put }
-{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall
-newfont /FontName newfontname put newcodesandnames aload pop
-128 1 255 { newfont /Encoding get exch /.notdef put } for
-newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat
-newfontname newfont definefont pop end } def
-/isovec [
-8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde
-8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis
-8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron
-8#220 /dotlessi 8#230 /oe 8#231 /OE
-8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling
-8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis
-8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot
-8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus
-8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph
-8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine
-8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf
-8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute
-8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring
-8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute
-8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute
-8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve
-8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply
-8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex
-8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave
-8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring
-8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute
-8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute
-8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve
-8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide
-8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex
-8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def
-/Times-Bold /Times-Bold-iso isovec ReEncode
-/Times-Roman /Times-Roman-iso isovec ReEncode
- /DrawEllipse {
-	/endangle exch def
-	/startangle exch def
-	/yrad exch def
-	/xrad exch def
-	/y exch def
-	/x exch def
-	/savematrix mtrx currentmatrix def
-	x y tr xrad yrad sc 0 0 1 startangle endangle arc
-	closepath
-	savematrix setmatrix
-	} def
-
-/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
-/$F2psEnd {$F2psEnteredState restore end} def
-
-$F2psBegin
-10 setmiterlimit
-0 slj 0 slc
- 0.06000 0.06000 sc
-%
-% Fig objects follow
-%
-% 
-% here starts figure with depth 51
-% Polyline
-n 4200 1500 m 4200 3900 l 8400 3900 l 6000 1500 l
- cp gs col7 0.75 shd ef gr 
-% Ellipse
-7.500 slw
- [15 45] 45 sd
-1 slc
-n 5400 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6000 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6600 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 7200 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 7800 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 7200 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6600 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6000 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 5400 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 5400 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6000 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6600 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6000 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 5400 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 5400 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 7800 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 8400 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 7200 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6600 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6000 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Polyline
-0 slc
-gs  clippath
-9615 5160 m 9615 5040 l 9395 5040 l 9575 5100 l 9395 5160 l cp
-eoclip
-n 3000 5100 m
- 9600 5100 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 9395 5160 m 9575 5100 l 9395 5040 l 9395 5160 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-3060 885 m 2940 885 l 2940 1105 l 3000 925 l 3060 1105 l cp
-eoclip
-n 3000 5100 m
- 3000 900 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 3060 1105 m 3000 925 l 2940 1105 l 3060 1105 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-n 3000 4500 m
- 2925 4500 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 3900 m
- 2925 3900 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 3300 m
- 2925 3300 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3600 5100 m
- 3600 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 4200 5100 m
- 4200 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 5400 5100 m
- 5400 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 4800 5100 m
- 4800 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 6000 5100 m
- 6000 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 6600 5100 m
- 6600 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 2700 m
- 2925 2700 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 1500 m
- 2925 1500 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 2100 m
- 2925 2100 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
- [15 45] 45 sd
-n 3000 1500 m
- 9000 1500 l gs col0 s gr  [] 0 sd
-% Polyline
- [15 45] 45 sd
-n 8400 5100 m
- 8400 900 l gs col0 s gr  [] 0 sd
-% Polyline
-n 7200 5100 m
- 7200 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 7800 5100 m
- 7800 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 8400 5100 m
- 8400 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
- [15 45] 45 sd
-n 3000 3900 m
- 9000 3900 l gs col0 s gr  [] 0 sd
-% Polyline
- [15 45] 45 sd
-n 5400 900 m
- 9600 5100 l gs col0 s gr  [] 0 sd
-% Polyline
- [15 45] 45 sd
-n 4200 5100 m
- 4200 900 l gs col0 s gr  [] 0 sd
-/Times-Bold-iso ff 390.00 scf sf
-2625 4650 m
-gs 1 -1 sc (1) col0 sh gr
-/Times-Bold-iso ff 390.00 scf sf
-2625 4050 m
-gs 1 -1 sc (2) col0 sh gr
-/Times-Bold-iso ff 390.00 scf sf
-3525 5550 m
-gs 1 -1 sc (1) col0 sh gr
-/Times-Bold-iso ff 390.00 scf sf
-2700 1050 m
-gs 1 -1 sc (j) col0 sh gr
-/Times-Roman-iso ff 390.00 scf sf
-8025 825 m
-gs 1 -1 sc (i<=n) col0 sh gr
-/Times-Bold-iso ff 390.00 scf sf
-4125 5550 m
-gs 1 -1 sc (2) col0 sh gr
-/Times-Bold-iso ff 390.00 scf sf
-8325 5550 m
-gs 1 -1 sc (n) col0 sh gr
-/Times-Bold-iso ff 390.00 scf sf
-2550 1575 m
-gs 1 -1 sc (m) col0 sh gr
-/Times-Roman-iso ff 390.00 scf sf
-9075 3975 m
-gs 1 -1 sc (j>=2) col0 sh gr
-/Times-Roman-iso ff 390.00 scf sf
-9075 1575 m
-gs 1 -1 sc (j<=m) col0 sh gr
-/Times-Bold-iso ff 390.00 scf sf
-9450 5475 m
-gs 1 -1 sc (i) col0 sh gr
-/Times-Roman-iso ff 390.00 scf sf
-3825 825 m
-gs 1 -1 sc (i>=2) col0 sh gr
-/Times-Roman-iso ff 390.00 scf sf
-4875 825 m
-gs 1 -1 sc (j<=n+2-i) col0 sh gr
-% here ends figure;
-$F2psEnd
-rs
-showpage
diff --git a/cloog-0.17.0/doc/images/basic.fig b/cloog-0.17.0/doc/images/basic.fig
deleted file mode 100644
index 7fe0a97..0000000
--- a/cloog-0.17.0/doc/images/basic.fig
+++ /dev/null
@@ -1,100 +0,0 @@
-#FIG 3.2
-Landscape
-Center
-Inches
-Letter  
-100.00
-Single
--2
-1200 2
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 3900 75 75 5400 3900 5400 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 3900 75 75 4800 3900 4800 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 3300 75 75 4200 3300 4200 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 3300 75 75 4800 3300 4800 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 2700 75 75 4200 2700 4200 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 3900 75 75 4200 3900 4200 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 3900 75 75 6000 3900 6000 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 3900 75 75 6600 3900 6600 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 7200 3900 75 75 7200 3900 7200 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 7800 3900 75 75 7800 3900 7800 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 7200 3300 75 75 7200 3300 7200 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 3300 75 75 6600 3300 6600 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 3300 75 75 6000 3300 6000 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 3300 75 75 5400 3300 5400 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 2700 75 75 4800 2700 4800 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 2700 75 75 5400 2700 5400 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 2700 75 75 6000 2700 6000 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 2700 75 75 6600 2700 6600 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 2100 75 75 6000 2100 6000 2175
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 2100 75 75 5400 2100 5400 2175
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 2100 75 75 4800 2100 4800 2175
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 2100 75 75 4200 2100 4200 2175
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 1500 75 75 4200 1500 4200 1575
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 1500 75 75 4800 1500 4800 1575
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 1500 75 75 5400 1500 5400 1575
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 7800 3300 75 75 7800 3300 7800 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 8400 3900 75 75 8400 3900 8400 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 7200 2700 75 75 7200 2700 7200 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 2100 75 75 6600 2100 6600 2175
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 1500 75 75 6000 1500 6000 1575
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 120.00 180.00
-	 3000 5100 9600 5100
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 120.00 180.00
-	 3000 5100 3000 900
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 4500 2925 4500
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 3900 2925 3900
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 3300 2925 3300
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3600 5100 3600 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 4200 5100 4200 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 5400 5100 5400 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 4800 5100 4800 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 6000 5100 6000 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 6600 5100 6600 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 2700 2925 2700
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 1500 2925 1500
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 2100 2925 2100
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 3000 1500 9000 1500
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 8400 5100 8400 900
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 7200 5100 7200 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 7800 5100 7800 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 8400 5100 8400 5175
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 3000 3900 9000 3900
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 5400 900 9600 5100
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 4200 5100 4200 900
-2 3 0 0 0 7 51 -1 15 0.000 0 0 -1 0 0 5
-	 4200 1500 4200 3900 8400 3900 6000 1500 4200 1500
-4 0 0 50 -1 2 26 0.0000 0 270 195 2625 4650 1\001
-4 0 0 50 -1 2 26 0.0000 0 270 195 2625 4050 2\001
-4 0 0 50 -1 2 26 0.0000 0 270 195 3525 5550 1\001
-4 0 0 50 -1 2 26 0.0000 0 345 135 2700 1050 j\001
-4 0 0 50 -1 0 26 0.0000 0 270 750 8025 825 i<=n\001
-4 0 0 50 -1 2 26 0.0000 0 270 195 4125 5550 2\001
-4 0 0 50 -1 2 26 0.0000 0 180 225 8325 5550 n\001
-4 0 0 50 -1 2 26 0.0000 0 180 330 2550 1575 m\001
-4 0 0 50 -1 0 26 0.0000 0 360 750 9075 3975 j>=2\001
-4 0 0 50 -1 0 26 0.0000 0 360 855 9075 1575 j<=m\001
-4 0 0 50 -1 2 26 0.0000 0 270 105 9450 5475 i\001
-4 0 0 50 -1 0 26 0.0000 0 270 750 3825 825 i>=2\001
-4 0 0 50 -1 0 26 0.0000 0 360 1410 4875 825 j<=n+2-i\001
diff --git a/cloog-0.17.0/doc/images/basic.jpg b/cloog-0.17.0/doc/images/basic.jpg
deleted file mode 100644
index 995b1d8..0000000
--- a/cloog-0.17.0/doc/images/basic.jpg
+++ /dev/null
Binary files differ
diff --git a/cloog-0.17.0/doc/images/basic.pdf b/cloog-0.17.0/doc/images/basic.pdf
deleted file mode 100644
index d15d42b..0000000
--- a/cloog-0.17.0/doc/images/basic.pdf
+++ /dev/null
Binary files differ
diff --git a/cloog-0.17.0/doc/images/basic.txt b/cloog-0.17.0/doc/images/basic.txt
deleted file mode 100644
index e40913a..0000000
--- a/cloog-0.17.0/doc/images/basic.txt
+++ /dev/null
@@ -1,13 +0,0 @@
- j^ i>=2          
-  | | j<=n+2-i    
-  | |\     | i<=n
-  | | \    |     
-m-+-****---+-j<=m
-  | *****  |     
-  | ****** |     
-  | *******|     
-2-+-********-j>=2
-  | |      |\    
-0-+-+------+--->i
-  | |      |     
-  0 2      n     
diff --git a/cloog-0.17.0/doc/images/tree.eps b/cloog-0.17.0/doc/images/tree.eps
deleted file mode 100644
index d80f6e9..0000000
--- a/cloog-0.17.0/doc/images/tree.eps
+++ /dev/null
@@ -1,258 +0,0 @@
-%!PS-Adobe-2.0 EPSF-2.0
-%%Title: tree.eps
-%%Creator: fig2dev Version 3.2 Patchlevel 3c
-%%CreationDate: Fri Sep  6 10:09:40 2002
-%%For: bastoul@whisky (Cedric Bastoul)
-%%BoundingBox: 0 0 388 312
-%%Magnification: 1.0000
-%%EndComments
-/$F2psDict 200 dict def
-$F2psDict begin
-$F2psDict /mtrx matrix put
-/col-1 {0 setgray} bind def
-/col0 {0.000 0.000 0.000 srgb} bind def
-/col1 {0.000 0.000 1.000 srgb} bind def
-/col2 {0.000 1.000 0.000 srgb} bind def
-/col3 {0.000 1.000 1.000 srgb} bind def
-/col4 {1.000 0.000 0.000 srgb} bind def
-/col5 {1.000 0.000 1.000 srgb} bind def
-/col6 {1.000 1.000 0.000 srgb} bind def
-/col7 {1.000 1.000 1.000 srgb} bind def
-/col8 {0.000 0.000 0.560 srgb} bind def
-/col9 {0.000 0.000 0.690 srgb} bind def
-/col10 {0.000 0.000 0.820 srgb} bind def
-/col11 {0.530 0.810 1.000 srgb} bind def
-/col12 {0.000 0.560 0.000 srgb} bind def
-/col13 {0.000 0.690 0.000 srgb} bind def
-/col14 {0.000 0.820 0.000 srgb} bind def
-/col15 {0.000 0.560 0.560 srgb} bind def
-/col16 {0.000 0.690 0.690 srgb} bind def
-/col17 {0.000 0.820 0.820 srgb} bind def
-/col18 {0.560 0.000 0.000 srgb} bind def
-/col19 {0.690 0.000 0.000 srgb} bind def
-/col20 {0.820 0.000 0.000 srgb} bind def
-/col21 {0.560 0.000 0.560 srgb} bind def
-/col22 {0.690 0.000 0.690 srgb} bind def
-/col23 {0.820 0.000 0.820 srgb} bind def
-/col24 {0.500 0.190 0.000 srgb} bind def
-/col25 {0.630 0.250 0.000 srgb} bind def
-/col26 {0.750 0.380 0.000 srgb} bind def
-/col27 {1.000 0.500 0.500 srgb} bind def
-/col28 {1.000 0.630 0.630 srgb} bind def
-/col29 {1.000 0.750 0.750 srgb} bind def
-/col30 {1.000 0.880 0.880 srgb} bind def
-/col31 {1.000 0.840 0.000 srgb} bind def
-
-end
-save
-newpath 0 312 moveto 0 0 lineto 388 0 lineto 388 312 lineto closepath clip newpath
--165.0 369.0 translate
-1 -1 scale
-
-/cp {closepath} bind def
-/ef {eofill} bind def
-/gr {grestore} bind def
-/gs {gsave} bind def
-/sa {save} bind def
-/rs {restore} bind def
-/l {lineto} bind def
-/m {moveto} bind def
-/rm {rmoveto} bind def
-/n {newpath} bind def
-/s {stroke} bind def
-/sh {show} bind def
-/slc {setlinecap} bind def
-/slj {setlinejoin} bind def
-/slw {setlinewidth} bind def
-/srgb {setrgbcolor} bind def
-/rot {rotate} bind def
-/sc {scale} bind def
-/sd {setdash} bind def
-/ff {findfont} bind def
-/sf {setfont} bind def
-/scf {scalefont} bind def
-/sw {stringwidth} bind def
-/tr {translate} bind def
-/tnt {dup dup currentrgbcolor
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
-  bind def
-/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
-  4 -2 roll mul srgb} bind def
- /DrawEllipse {
-	/endangle exch def
-	/startangle exch def
-	/yrad exch def
-	/xrad exch def
-	/y exch def
-	/x exch def
-	/savematrix mtrx currentmatrix def
-	x y tr xrad yrad sc 0 0 1 startangle endangle arc
-	closepath
-	savematrix setmatrix
-	} def
-
-/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
-/$F2psEnd {$F2psEnteredState restore end} def
-
-$F2psBegin
-%%Page: 1 1
-10 setmiterlimit
- 0.06000 0.06000 sc
-%
-% Fig objects follow
-%
-7.500 slw
-% Ellipse
-n 5400 1200 237 237 0 360 DrawEllipse gs col0 s gr
-
-% Ellipse
-n 3000 3600 237 237 0 360 DrawEllipse gs col0 s gr
-
-% Ellipse
-n 7800 3600 237 237 0 360 DrawEllipse gs col0 s gr
-
-% Ellipse
-n 6600 4800 237 237 0 360 DrawEllipse gs col0 s gr
-
-% Ellipse
-n 5400 2325 237 237 0 360 DrawEllipse gs col0 s gr
-
-% Polyline
-gs  clippath
-5355 2115 m 5445 2115 l 5445 1888 l 5400 2068 l 5355 1888 l cp
-eoclip
-n 5400 1425 m
- 5400 2100 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 5355 1888 m 5400 2068 l 5445 1888 l 5355 1888 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-5355 3390 m 5445 3390 l 5445 3163 l 5400 3343 l 5355 3163 l cp
-eoclip
-n 5400 2550 m
- 5400 3375 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 5355 3163 m 5400 3343 l 5445 3163 l 5355 3163 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-2955 4590 m 3045 4590 l 3045 4363 l 3000 4543 l 2955 4363 l cp
-eoclip
-n 3000 3825 m
- 3000 4575 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 2955 4363 m 3000 4543 l 3045 4363 l 2955 4363 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-6563 4544 m 6611 4621 l 6803 4500 l 6627 4558 l 6755 4424 l cp
-eoclip
-n 7800 3825 m
- 6600 4575 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 6755 4424 m 6627 4558 l 6803 4500 l 6755 4424 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-8988 4621 m 9036 4544 l 8844 4424 l 8973 4558 l 8796 4500 l cp
-eoclip
-n 7800 3825 m
- 9000 4575 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 8796 4500 m 8973 4558 l 8844 4424 l 8796 4500 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-6555 5790 m 6645 5790 l 6645 5563 l 6600 5743 l 6555 5563 l cp
-eoclip
-n 6600 5025 m
- 6600 5775 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 6555 5563 m 6600 5743 l 6645 5563 l 6555 5563 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-7802 3411 m 7831 3326 l 7615 3253 l 7772 3354 l 7587 3338 l cp
-eoclip
-n 5400 2550 m
- 7803 3364 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 7587 3338 m 7772 3354 l 7615 3253 l 7587 3338 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-2971 3337 m 3000 3422 l 3215 3348 l 3031 3364 l 3186 3262 l cp
-eoclip
-n 5400 2550 m
- 3000 3375 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 3186 3262 m 3031 3364 l 3215 3348 l 3186 3262 l  cp gs 0.00 setgray ef gr  col0 s
-/Times-Roman ff 330.00 scf sf
-3075 4200 m
-gs 1 -1 sc (0) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-6675 5400 m
-gs 1 -1 sc (0) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-5475 3000 m
-gs 1 -1 sc (1) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-3825 3000 m
-gs 1 -1 sc (0) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-6900 3000 m
-gs 1 -1 sc (2) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-6975 4200 m
-gs 1 -1 sc (0) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-8475 4200 m
-gs 1 -1 sc (1) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-5475 1800 m
-gs 1 -1 sc (0) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-2850 4950 m
-gs 1 -1 sc (S1) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-5250 3750 m
-gs 1 -1 sc (S2) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-6450 6150 m
-gs 1 -1 sc (S3) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-8850 4950 m
-gs 1 -1 sc (S4) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-5355 2430 m
-gs 1 -1 sc (i) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-2963 3667 m
-gs 1 -1 sc (j) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-7763 3675 m
-gs 1 -1 sc (j) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-6533 4890 m
-gs 1 -1 sc (k) col0 sh gr
-$F2psEnd
-rs
diff --git a/cloog-0.17.0/doc/images/tree.fig b/cloog-0.17.0/doc/images/tree.fig
deleted file mode 100644
index 9c202bb..0000000
--- a/cloog-0.17.0/doc/images/tree.fig
+++ /dev/null
@@ -1,54 +0,0 @@
-#FIG 3.2
-Landscape
-Center
-Inches
-Letter  
-100.00
-Single
--2
-1200 2
-1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 5400 1200 237 237 5400 1200 5625 1275
-1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 3000 3600 237 237 3000 3600 3225 3675
-1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 7800 3600 237 237 7800 3600 8025 3675
-1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 6600 4800 237 237 6600 4800 6825 4875
-1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 5400 2325 237 237 5400 2325 5625 2400
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 5400 1425 5400 2100
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 5400 2550 5400 3375
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 3000 3825 3000 4575
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 7800 3825 6600 4575
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 7800 3825 9000 4575
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 6600 5025 6600 5775
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 5400 2550 7803 3364
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 5400 2550 3000 3375
-4 0 0 50 0 0 22 0.0000 0 225 150 3075 4200 0\001
-4 0 0 50 0 0 22 0.0000 0 225 150 6675 5400 0\001
-4 0 0 50 0 0 22 0.0000 0 225 150 5475 3000 1\001
-4 0 0 50 0 0 22 0.0000 0 225 150 3825 3000 0\001
-4 0 0 50 0 0 22 0.0000 0 225 150 6900 3000 2\001
-4 0 0 50 0 0 22 0.0000 0 225 150 6975 4200 0\001
-4 0 0 50 0 0 22 0.0000 0 225 150 8475 4200 1\001
-4 0 0 50 0 0 22 0.0000 0 225 150 5475 1800 0\001
-4 0 0 50 0 0 22 0.0000 0 225 345 2850 4950 S1\001
-4 0 0 50 0 0 22 0.0000 0 225 345 5250 3750 S2\001
-4 0 0 50 0 0 22 0.0000 0 225 345 6450 6150 S3\001
-4 0 0 50 0 0 22 0.0000 0 225 345 8850 4950 S4\001
-4 0 0 50 0 0 22 0.0000 0 225 90 5355 2430 i\001
-4 0 0 50 0 0 22 0.0000 0 300 90 2963 3667 j\001
-4 0 0 50 0 0 22 0.0000 0 300 90 7763 3675 j\001
-4 0 0 50 0 0 22 0.0000 0 225 150 6533 4890 k\001
diff --git a/cloog-0.17.0/doc/images/tree.jpg b/cloog-0.17.0/doc/images/tree.jpg
deleted file mode 100644
index 7329268..0000000
--- a/cloog-0.17.0/doc/images/tree.jpg
+++ /dev/null
Binary files differ
diff --git a/cloog-0.17.0/doc/images/tree.pdf b/cloog-0.17.0/doc/images/tree.pdf
deleted file mode 100644
index 7569ede..0000000
--- a/cloog-0.17.0/doc/images/tree.pdf
+++ /dev/null
Binary files differ
diff --git a/cloog-0.17.0/doc/images/tree.txt b/cloog-0.17.0/doc/images/tree.txt
deleted file mode 100644
index 7bcfef2..0000000
--- a/cloog-0.17.0/doc/images/tree.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-       *
-       |
-       |0
-       |
-       V
-       i
-       |
- +-----+-----+
- |     |     |      
- |0    |1    |2 
- |     |     |      
- V     V     V
- j     S2    j
- |           |
- |0       +--+--+
- |        |     |
- V        |0    |1
- S1       |     |
-          V     V
-          k     S4
-          |
-          |0
-          |
-          V
-          S3
diff --git a/cloog-0.17.0/examples/README b/cloog-0.17.0/examples/README
deleted file mode 100644
index 1a9881e..0000000
--- a/cloog-0.17.0/examples/README
+++ /dev/null
@@ -1,58 +0,0 @@
-#
-#  /**-------------------------------------------------------------------**
-#   **                              CLooG                                **
-#   **-------------------------------------------------------------------**
-#   **                       Library use examples                        **
-#   **-------------------------------------------------------------------**
-#   **             First version of this file: july 15th 2003            **
-#   **-------------------------------------------------------------------**/
-#
-
-
-In this directory are presented various examples of how to use the CLooG
-library. For each case, you will need to edit the makefile file according to
-your system, in particular you will have to set where your CLooG library has
-been installed, and where are the CLooG header files. Don't forget to update
-your LD_LIBRARY_PATH environment variable to reach the CLooG library. If you
-performed the default installation of CLooG, the library is in /usr/local/lib
-thus you need to set LD_LIBRARY_PATH thanks to one of the following command:
-'setenv LD_LIBRARY_PATH /usr/local/lib' for tcsh-like shells, or
-'export LD_LIBRARY_PATH=/usr/local/lib' for bash-like shells.
-
-For any problem: <cedric.bastoul@inria.fr>.
-
-
-#   **-------------------------------------------------------------------**
-#   **                          I. Example                               **
-#   **-------------------------------------------------------------------**/
-
-
-This example program creates a simple CLooG-like loop generation program in a
-few lines. The input problem has to be given on standard input. We can test it
-for instance by typing 'more FILE.cloog | ./example' (or example.exe under
-Cygwin).
-
-
-#   **-------------------------------------------------------------------**
-#   **                       II. cloog2loopgen                           **
-#   **-------------------------------------------------------------------**/
-
-NO MORE EXISTS !
-
-This example creates a program converting a CLooG input file to a LoopGen input
-file. This can be useful to compare the two tools (I do not support LoopGen,
-don't ask me if you find some bugs !). The usage of the created tool is:
-'cloog2loopgen input_file output_file'.
-
-
-#   **-------------------------------------------------------------------**
-#   **                       III. cloog2Omega                            **
-#   **-------------------------------------------------------------------**/
-
-
-NO MORE EXISTS !
-
-This example creates a program converting a CLooG input file to an Omega
-CodeGen input file. This can be useful to compare the two tools (I do not
-support CodeGen, don't ask me if you find some bugs !). The usage of the
-created tool is: 'cloog2omega input_file output_file'.
diff --git a/cloog-0.17.0/examples/example/Makefile b/cloog-0.17.0/examples/example/Makefile
deleted file mode 100644
index 9b6150b..0000000
--- a/cloog-0.17.0/examples/example/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
-# Please enter here the locations for CloogLib include and libraries if they
-# aren't the default values (/usr/lib and /usr/include).
-CLOOG_INC = $(HOME)/progs/linux/include
-CLOOG_LIB = $(HOME)/progs/linux/lib
-
-CC = gcc
-LDLIBS= -lcloog
-CFLAGS= -I $(CLOOG_INC) -L $(CLOOG_LIB)
-
-
-example: example.c
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *                Making example                 *"
-	@echo "              *-----------------------------------------------*/"
-	$(CC) example.c -o example $(CFLAGS) $(LDLIBS)
-
-clean:
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *               Cleaning example                *"
-	@echo "              *-----------------------------------------------*/"
-	-rm -f example example.exe core
diff --git a/cloog-0.17.0/examples/example/example.c b/cloog-0.17.0/examples/example/example.c
deleted file mode 100644
index 403d213..0000000
--- a/cloog-0.17.0/examples/example/example.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* This is a very simple example of how to use the CLooGLib inside your
- * programs. You should compile it by typing 'make' (after edition of the
- * makefile), then test it for instance by typing
- * 'more FILE.cloog | ./example' (or example.exe under Cygwin).
- */
-
-# include <stdio.h>
-# include <cloog/cloog.h>
-
-int main()
-{
-  CloogState *state;
-  CloogInput *input;
-  CloogOptions * options ;
-  struct clast_stmt *root;
-  
-  state = cloog_state_malloc();
-  options = cloog_options_malloc(state);
-  input = cloog_input_read(stdin, options);
-  
-  root = cloog_clast_create_from_input(input, options);
-  clast_pprint(stdout, root, 0, options);
-
-  cloog_clast_free(root);
-  cloog_options_free(options) ;
-  cloog_state_free(state);
-  
-  return 0 ;
-}
diff --git a/cloog-0.17.0/genversion.sh.in b/cloog-0.17.0/genversion.sh.in
deleted file mode 100755
index 77c04d7..0000000
--- a/cloog-0.17.0/genversion.sh.in
+++ /dev/null
@@ -1,15 +0,0 @@
-#! /bin/sh
-srcdir=@abs_srcdir@
-PACKAGE=@PACKAGE@
-VERSION=@VERSION@
-
-if test -f $srcdir/.git/HEAD; then
-    GIT_REPO="$srcdir/.git"
-    GIT_HEAD_ID=`GIT_DIR=$GIT_REPO git describe`
-elif test -f $srcdir/CLOOG_HEAD; then
-    GIT_HEAD_ID=`cat $srcdir/CLOOG_HEAD`
-else
-    GIT_HEAD_ID="$PACKAGE-$VERSION-UNKNOWN"
-fi
-
-echo $GIT_HEAD_ID | sed -e 's/cloog-//'
diff --git a/cloog-0.17.0/include/cloog/block.h b/cloog-0.17.0/include/cloog/block.h
deleted file mode 100644
index 95f2a44..0000000
--- a/cloog-0.17.0/include/cloog/block.h
+++ /dev/null
@@ -1,117 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                             block.h                               **
-    **-------------------------------------------------------------------**
-    **                    First version: June 11th 2005                  **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-#ifndef CLOOG_BLOCK_H
-#define CLOOG_BLOCK_H
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-
-/**
- * CloogBlock structure:
- * this structure contains the informations of a statement block. It may happen
- * that users are lazy enough to ask CLooG to generate the code for statements
- * with exactly the same domain/scattering pair (possibly differing by only one
- * constant) instead of giving only one pair. CLooG provides them a last chance
- * to save time and memory by trying to find these blocks itself. The block
- * contains the statement list and the common informations of the statements.
- * This structure contains also the number of existing active references to it:
- * because CLooG uses many copies of blocks there is no need to actually copy
- * these blocks but just to return a pointer to them and to increment the number
- * of active references. Each time a CloogBlock will be freed, we will decrement
- * the active reference counter and actually free it if its value is zero.
- */
-struct cloogblock
-{
-  CloogState *state;            /**< State. */
-  CloogStatement * statement ;  /**< The list of statements in the block. */
-  int  nb_scaldims ;            /**< Number of scalar dimensions. */
-  cloog_int_t *scaldims;        /**< Scalar dimension values. */
-  int depth ;                   /**< Original block depth (outer loop number).*/
-  int references ;              /**< Number of references to this structure. */
-  void * usr;		        /**< User field, for library user convenience.
-				 *   This pointer is not freed when the
-				 *   CloogBlock structure is freed.
-			         */
-} ;
-typedef struct cloogblock CloogBlock ;
-
-
-/**
- * CloogBlockList structure:
- * this structure reprensents a node of a linked list of CloogBlock structures.
- */
-struct cloogblocklist
-{ CloogBlock * block ;          /**< An element of the list. */
-  struct cloogblocklist * next ;/**< Pointer to the next element of the list.*/
-} ;
-typedef struct cloogblocklist CloogBlockList ;
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-void cloog_block_print_structure(FILE *, CloogBlock *, int) ;
-void cloog_block_print(FILE *, CloogBlock *) ;
-void cloog_block_list_print(FILE *, CloogBlockList *) ;
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-void cloog_block_free(CloogBlock *) ;
-void cloog_block_list_free(CloogBlockList *) ;
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-CloogBlock     * cloog_block_malloc(CloogState *state);
-CloogBlock     * cloog_block_alloc(CloogStatement *statement, int nb_scaldims,
-				    cloog_int_t *scaldims, int depth);
-CloogBlockList * cloog_block_list_malloc(void);
-CloogBlockList * cloog_block_list_alloc(CloogBlock *) ;
-CloogBlock     * cloog_block_copy(CloogBlock * block) ;
-void             cloog_block_merge(CloogBlock *, CloogBlock *) ;
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
-
diff --git a/cloog-0.17.0/include/cloog/clast.h b/cloog-0.17.0/include/cloog/clast.h
deleted file mode 100644
index b455369..0000000
--- a/cloog-0.17.0/include/cloog/clast.h
+++ /dev/null
@@ -1,154 +0,0 @@
-#ifndef CLOOG_CLAST_H
-#define CLOOG_CLAST_H
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-enum clast_expr_type {
-    clast_expr_name,
-    clast_expr_term,
-    clast_expr_bin,
-    clast_expr_red
-};
-struct clast_expr {
-    enum clast_expr_type type;
-};
-
-struct clast_name {
-    struct clast_expr	expr;
-    const char *	name;
-};
-
-/* Represents the term
- *	val * var	(if var != NULL)
- * or
- *	val		(if var == NULL)
- */
-struct clast_term {
-    struct clast_expr	expr;
-    cloog_int_t		val;
-    struct clast_expr  *var;
-};
-
-enum clast_red_type { clast_red_sum, clast_red_min, clast_red_max };
-struct clast_reduction {
-    struct clast_expr	expr;
-    enum clast_red_type	type;
-    int			n;
-    struct clast_expr*	elts[1];
-};
-
-enum clast_bin_type { clast_bin_fdiv, clast_bin_cdiv, 
-		      clast_bin_div, clast_bin_mod };
-struct clast_binary {
-    struct clast_expr	expr;
-    enum clast_bin_type type;
-    struct clast_expr*	LHS;
-    cloog_int_t		RHS;
-};
-
-struct clast_stmt;
-struct clast_stmt_op {
-    void (*free)(struct clast_stmt *);
-};
-
-#define CLAST_STMT_IS_A(stmt, type) ((stmt)->op == &(type))
-
-extern const struct clast_stmt_op stmt_root;
-extern const struct clast_stmt_op stmt_ass;
-extern const struct clast_stmt_op stmt_user;
-extern const struct clast_stmt_op stmt_block;
-extern const struct clast_stmt_op stmt_for;
-extern const struct clast_stmt_op stmt_guard;
-
-struct clast_stmt {
-    const struct clast_stmt_op    *op;
-    struct clast_stmt	*next;
-};
-
-struct clast_root {
-    struct clast_stmt	stmt;
-    CloogNames *	names;       /**< Names of iterators and parameters. */
-};
-
-struct clast_assignment {
-    struct clast_stmt	stmt;
-    const char *	LHS;
-    struct clast_expr *	RHS;
-};
-
-struct clast_block {
-    struct clast_stmt	stmt;
-    struct clast_stmt *	body;
-};
-
-struct clast_user_stmt {
-    struct clast_stmt	stmt;
-    CloogDomain *	domain;
-    CloogStatement *	statement;
-    struct clast_stmt *	substitutions;
-};
-
-struct clast_for {
-    struct clast_stmt	stmt;
-    CloogDomain *	domain;
-    const char *	iterator;
-    struct clast_expr *	LB;
-    struct clast_expr *	UB;
-    cloog_int_t		stride;
-    struct clast_stmt *	body;
-};
-
-struct clast_equation {
-    struct clast_expr *	LHS;
-    struct clast_expr *	RHS;
-    int			sign;
-};
-
-struct clast_guard {
-    struct clast_stmt	stmt;
-    struct clast_stmt *	then;
-    int			n;
-    struct clast_equation	eq[1];
-};
-
-
-struct clast_stmt *cloog_clast_create_from_input(CloogInput *input,
-						 CloogOptions *options);
-struct clast_stmt *cloog_clast_create(CloogProgram *program,
-				      CloogOptions *options);
-void cloog_clast_free(struct clast_stmt *s);
-
-struct clast_name *new_clast_name(const char *name);
-struct clast_term *new_clast_term(cloog_int_t c, struct clast_expr *v);
-struct clast_binary *new_clast_binary(enum clast_bin_type t, 
-				      struct clast_expr *lhs, cloog_int_t rhs);
-struct clast_reduction *new_clast_reduction(enum clast_red_type t, int n);
-struct clast_root *new_clast_root(CloogNames *names);
-struct clast_assignment *new_clast_assignment(const char *lhs,
-					      struct clast_expr *rhs);
-struct clast_user_stmt *new_clast_user_stmt(CloogDomain *domain,
-    CloogStatement *stmt, struct clast_stmt *subs);
-struct clast_block *new_clast_block(void);
-struct clast_for *new_clast_for(CloogDomain *domain, const char *it,
-                                struct clast_expr *LB, struct clast_expr *UB,
-                                CloogStride *stride);
-struct clast_guard *new_clast_guard(int n);
-
-void free_clast_name(struct clast_name *t);
-void free_clast_term(struct clast_term *t);
-void free_clast_binary(struct clast_binary *b);
-void free_clast_reduction(struct clast_reduction *r);
-void free_clast_expr(struct clast_expr *e);
-void free_clast_stmt(struct clast_stmt *s);
-
-int clast_expr_equal(struct clast_expr *e1, struct clast_expr *e2);
-
-struct clast_expr *clast_bound_from_constraint(CloogConstraint *constraint,
-					       int level, CloogNames *names);
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.17.0/include/cloog/cloog.h b/cloog-0.17.0/include/cloog/cloog.h
deleted file mode 100644
index a8c3f28..0000000
--- a/cloog-0.17.0/include/cloog/cloog.h
+++ /dev/null
@@ -1,62 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                               CLooG                               **
-    **-------------------------------------------------------------------**
-    **                              cloog.h                              **
-    **-------------------------------------------------------------------**
-    **                   First version: july 25th 2002                   **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-/******************************************************************************
- *  THIS FILE HAS BEEN AUTOMATICALLY GENERATED FROM clooh.h.in BY configure   *
- ******************************************************************************/
-
-#ifndef CLOOG_H
-#define CLOOG_H
-
-#include <cloog/version.h>
-#include <cloog/int.h>
-#include <cloog/matrix.h>
-#include <cloog/state.h>
-#include <cloog/options.h>
-#include <cloog/names.h>
-#include <cloog/constraints.h>
-#include <cloog/stride.h>
-#include <cloog/domain.h>
-#include <cloog/statement.h>
-#include <cloog/block.h>
-#include <cloog/loop.h>
-#include <cloog/union_domain.h>
-#include <cloog/input.h>
-#include <cloog/program.h>
-#include <cloog/clast.h>
-#include <cloog/pprint.h>
-
-#endif /* !CLOOG_H */
diff --git a/cloog-0.17.0/include/cloog/constraints.h b/cloog-0.17.0/include/cloog/constraints.h
deleted file mode 100644
index 4818c4c..0000000
--- a/cloog-0.17.0/include/cloog/constraints.h
+++ /dev/null
@@ -1,121 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                               CLooG                               **
-    **-------------------------------------------------------------------**
-    **                           constraints.h                           **
-    **-------------------------------------------------------------------**
-    **                    First version: april 17th 2005                 **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2005 Cedric Bastoul                                          *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-#ifndef CLOOG_CONSTRAINTS_H
-#define CLOOG_CONSTRAINTS_H
-
-struct cloogconstraint;
-typedef struct cloogconstraint CloogConstraint;
-struct cloogconstraintset;
-typedef struct cloogconstraintset CloogConstraintSet;
-struct cloogequalities;
-typedef struct cloogequalities CloogEqualities;
-
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-/******************************************************************************
- *                        Equalities spreading functions                      *
- ******************************************************************************/
-CloogEqualities *cloog_equal_alloc(int n, int nb_levels,
-			int nb_parameters);
-void		 cloog_equal_free(CloogEqualities *equal);
-int              cloog_equal_count(CloogEqualities *equal);
-int              cloog_equal_type(CloogEqualities *equal, int level);
-void             cloog_equal_del(CloogEqualities *equal, int level);
-int              cloog_equal_total_dimension(CloogEqualities *equal);
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-void          cloog_constraint_set_normalize(CloogConstraintSet *, int);
-void          cloog_constraint_set_free(CloogConstraintSet *);
-int           cloog_constraint_set_contains_level(CloogConstraintSet *constraints,
-			int level, int nb_parameters);
-int           cloog_constraint_set_total_dimension(CloogConstraintSet *constraints);
-int           cloog_constraint_set_n_iterators(CloogConstraintSet *constraints,
-			int nb_parameters);
-CloogConstraintSet *cloog_constraint_set_copy(CloogConstraintSet *);
-CloogConstraintSet *cloog_constraint_set_simplify(CloogConstraintSet *, CloogEqualities *, int, int);
-
-int cloog_constraint_needs_reduction(CloogConstraint *upper, int level);
-CloogConstraintSet *cloog_constraint_set_for_reduction(CloogConstraint *upper,
-	       CloogConstraint *lower);
-CloogConstraintSet *cloog_constraint_set_reduce(CloogConstraintSet *constraints,
-	int level, CloogEqualities *equal, int nb_par, cloog_int_t *bound);
-int cloog_constraint_set_foreach_constraint(CloogConstraintSet *constraints,
-	int (*fn)(CloogConstraint *constraint, void *user), void *user);
-int              cloog_constraint_is_valid(CloogConstraint *constraint);
-CloogConstraint *cloog_constraint_copy(CloogConstraint *constraint);
-void             cloog_constraint_release(CloogConstraint *constraint);
-CloogConstraint *cloog_constraint_invalid(void);
-int              cloog_constraint_total_dimension(CloogConstraint *constraint);
-
-CloogConstraint *cloog_equal_constraint(CloogEqualities *equal, int j);
-void             cloog_equal_add(CloogEqualities *equal,
-				  CloogConstraintSet *constraints,
-				  int level, CloogConstraint *line, int nb_par);
-
-CloogConstraint *cloog_constraint_set_defining_equality(
-			CloogConstraintSet *constraints, int level);
-CloogConstraint *cloog_constraint_set_defining_inequalities(
-			CloogConstraintSet *constraints,
-			int level, CloogConstraint **lower, int nb_parameters);
-int           cloog_constraint_involves(CloogConstraint *constraint, int v);
-int           cloog_constraint_is_lower_bound(CloogConstraint *constraint, int v);
-int           cloog_constraint_is_upper_bound(CloogConstraint *constraint, int v);
-int           cloog_constraint_is_equality(CloogConstraint *constraint);
-void          cloog_constraint_constant_get(CloogConstraint *constraint,
-			cloog_int_t *val);
-void          cloog_constraint_coefficient_get(CloogConstraint *constraint,
-			int var, cloog_int_t *val);
-void          cloog_constraint_coefficient_set(CloogConstraint *constraint,
-			int var, cloog_int_t val);
-void          cloog_constraint_copy_coefficients(CloogConstraint *constraint,
-			cloog_int_t *dst);
-CloogConstraintSet *cloog_constraint_set_drop_constraint(
-	CloogConstraintSet *constraints, CloogConstraint *constraint);
-
-struct clast_expr *cloog_constraint_variable_expr(CloogConstraint *constraint,
-			int level, CloogNames *names);
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.17.0/include/cloog/domain.h b/cloog-0.17.0/include/cloog/domain.h
deleted file mode 100644
index 767771b..0000000
--- a/cloog-0.17.0/include/cloog/domain.h
+++ /dev/null
@@ -1,177 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                               CLooG                               **
-    **-------------------------------------------------------------------**
-    **                             domain.h                              **
-    **-------------------------------------------------------------------**
-    **                  First version: october 28th 2001                 **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-#ifndef CLOOG_DOMAIN_H
-#define CLOOG_DOMAIN_H
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-
-struct cloogdomain;
-typedef struct cloogdomain CloogDomain ;
-struct cloogscattering;
-typedef struct cloogscattering CloogScattering;
-struct osl_relation;
-
-
-/**
- * CloogDomainList structure:
- * this structure reprensents a node of a linked list of CloogDomain structures.
- */
-struct cloogdomainlist {
-  CloogDomain *domain;         /**< An element of the list. */
-  struct cloogdomainlist *next;/**< Pointer to the next element of the list.*/
-} ;
-typedef struct cloogdomainlist CloogDomainList;
-
-
-/**
- * CloogScatteringList structure:
- * this structure reprensents a node of a linked list of CloogScattering structures.
- */
-struct cloogscatteringlist {
-  CloogScattering *scatt;          /**< An element of the list. */
-  struct cloogscatteringlist *next;/**< Pointer to the next element of the list.*/
-} ;
-typedef struct cloogscatteringlist CloogScatteringList;
-
-
-/******************************************************************************
- *                              PolyLib interface                             *
- ******************************************************************************/
-void          cloog_domain_print_constraints(FILE *, CloogDomain *,
-						int print_number);
-void          cloog_scattering_print_constraints(FILE *, CloogScattering *);
-void          cloog_domain_free(CloogDomain *) ;
-void          cloog_scattering_free(CloogScattering *);
-CloogDomain * cloog_domain_copy(CloogDomain *) ;
-CloogDomain * cloog_domain_convex(CloogDomain * Pol) ;
-CloogDomain * cloog_domain_simple_convex(CloogDomain * domain);
-CloogDomain * cloog_domain_simplify(CloogDomain *, CloogDomain *) ;
-CloogDomain * cloog_domain_union(CloogDomain *, CloogDomain *) ;
-CloogDomain * cloog_domain_intersection(CloogDomain *, CloogDomain *) ;
-CloogDomain * cloog_domain_difference(CloogDomain *, CloogDomain *) ;
-void          cloog_domain_sort(CloogDomain**,unsigned,unsigned,int *);
-int cloog_domain_follows(CloogDomain *dom1, CloogDomain *dom2, unsigned level);
-CloogDomain * cloog_domain_empty(CloogDomain *model);
-int cloog_domain_is_bounded(CloogDomain *dim, unsigned level);
-CloogDomain *cloog_domain_bound_splitter(CloogDomain *dom, int level);
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-void cloog_domain_print_structure(FILE *file, CloogDomain *domain, int level,
-				  const char *name);
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-void cloog_domain_list_free(CloogDomainList *);
-void cloog_scattering_list_free(CloogScatteringList *);
-
-
-/*+****************************************************************************
- *                               Reading function                             *
- ******************************************************************************/
-CloogDomain * cloog_domain_read_context(CloogState *state, FILE * foo);
-CloogDomain * cloog_domain_union_read(CloogState *state, FILE *foo, int nb_par);
-CloogScattering *cloog_domain_read_scattering(CloogDomain *domain, FILE *foo);
-
-CloogDomain * cloog_domain_from_cloog_matrix(CloogState *state,
-				CloogMatrix *matrix, int nb_par);
-CloogScattering * cloog_scattering_from_cloog_matrix(CloogState *state,
-				CloogMatrix *matrix, int nb_scat, int nb_par);
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-CloogDomain *cloog_domain_from_osl_relation(CloogState *,
-                                            struct osl_relation *);
-CloogScattering *cloog_scattering_from_osl_relation(CloogState *,
-                                                    struct osl_relation *);
-CloogConstraintSet *cloog_domain_constraints(CloogDomain *);
-int           cloog_domain_isempty(CloogDomain *) ;
-CloogDomain * cloog_domain_universe(CloogState *state, unsigned dim);
-CloogDomain * cloog_domain_project(CloogDomain *, int);
-CloogDomain * cloog_domain_extend(CloogDomain *, int);
-int           cloog_domain_never_integral(CloogDomain *) ;
-void          cloog_domain_stride(CloogDomain *, int, cloog_int_t *, cloog_int_t *);
-int           cloog_domain_can_stride(CloogDomain *domain, int level);
-int           cloog_domain_is_otl(CloogDomain *domain, int level);
-CloogDomain * cloog_domain_stride_lower_bound(CloogDomain *domain, int level,
-					CloogStride *stride);
-CloogDomain * cloog_domain_add_stride_constraint(CloogDomain *domain,
-					CloogStride *stride);
-int           cloog_domain_can_unroll(CloogDomain *domain, int level,
-				cloog_int_t *n, CloogConstraint **lb);
-CloogDomain * cloog_domain_fixed_offset(CloogDomain *domain, int level,
-				CloogConstraint *lb, cloog_int_t offset);
-int           cloog_domain_lazy_disjoint(CloogDomain *, CloogDomain *) ;
-int           cloog_domain_lazy_equal(CloogDomain *, CloogDomain *) ;
-int           cloog_scattering_lazy_block(CloogScattering *, CloogScattering *,
-                                      CloogScatteringList *, int);
-int           cloog_scattering_lazy_isscalar(CloogScattering *, int,
-								cloog_int_t *);
-int           cloog_domain_lazy_isconstant(CloogDomain *domain, int dimension,
-					   cloog_int_t *value);
-int           cloog_scattering_list_lazy_same(CloogScatteringList *);
-CloogDomain * cloog_domain_cut_first(CloogDomain *domain, CloogDomain **rest);
-CloogDomain * cloog_domain_simplify_union(CloogDomain *domain);
-CloogScattering * cloog_scattering_erase_dimension(CloogScattering *, int);
-
-int           cloog_domain_dimension(CloogDomain *) ;
-int           cloog_domain_parameter_dimension(CloogDomain *domain);
-int           cloog_scattering_dimension(CloogScattering *, CloogDomain *);
-int           cloog_domain_isconvex(CloogDomain *) ;
-CloogDomain * cloog_domain_cube(CloogState *state,
-				int dim, cloog_int_t min, cloog_int_t max);
-CloogDomain * cloog_domain_from_context(CloogDomain *context);
-CloogDomain * cloog_domain_scatter(CloogDomain *domain, CloogScattering *scatt);
-int           cloog_scattering_fully_specified(CloogScattering *scattering,
-						CloogDomain *domain);
-
-CloogStride *cloog_domain_list_stride(CloogDomainList *list, int level);
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.17.0/include/cloog/input.h b/cloog-0.17.0/include/cloog/input.h
deleted file mode 100644
index b3d3c53..0000000
--- a/cloog-0.17.0/include/cloog/input.h
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef CLOOG_INPUT_H
-#define CLOOG_INPUT_H
-
-#if defined(__cplusplus)
-extern "C" {
-#endif 
-
-struct osl_scop;
-
-struct clooginput {
-	CloogDomain *context;
-	CloogUnionDomain *ud;
-};
-typedef struct clooginput CloogInput;
-
-CloogInput *cloog_input_from_osl_scop(CloogState *, struct osl_scop *);
-CloogInput *cloog_input_read(FILE *file, CloogOptions *options);
-CloogInput *cloog_input_alloc(CloogDomain *context, CloogUnionDomain *ud);
-void cloog_input_free(CloogInput *input);
-
-void cloog_input_dump_cloog(FILE *file, CloogInput *input, CloogOptions *opt);
-
-#if defined(__cplusplus)
-}
-#endif 
-
-#endif
diff --git a/cloog-0.17.0/include/cloog/int.h b/cloog-0.17.0/include/cloog/int.h
deleted file mode 100644
index 623a1cb..0000000
--- a/cloog-0.17.0/include/cloog/int.h
+++ /dev/null
@@ -1,174 +0,0 @@
-#ifndef CLOOG_INT_H
-#define CLOOG_INT_H
-
-#include <assert.h>
-#include <stdio.h>
-#if defined(CLOOG_INT_GMP)
-#include <string.h>
-#include <gmp.h>
-#ifndef mp_get_memory_functions
-void mp_get_memory_functions(
-		void *(**alloc_func_ptr) (size_t),
-		void *(**realloc_func_ptr) (void *, size_t, size_t),
-		void (**free_func_ptr) (void *, size_t));
-#endif
-#endif
-
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-#if defined(CLOOG_INT_INT)
-typedef int		cloog_int_t;
-#define CLOOG_INT_FORMAT	"%d"
-#elif defined(CLOOG_INT_LONG)
-typedef long		cloog_int_t;
-#define CLOOG_INT_FORMAT	"%ld"
-#elif defined(CLOOG_INT_LONG_LONG)
-typedef long long	cloog_int_t;
-#define CLOOG_INT_FORMAT	"%lld"
-#elif defined(CLOOG_INT_GMP)
-typedef mpz_t		cloog_int_t;
-#else
-#error "No integer type defined"
-#endif
-
-#if defined(CLOOG_INT_GMP)
-
-#define cloog_int_init(i)	mpz_init(i)
-#define cloog_int_clear(i)	mpz_clear(i);
-
-#define cloog_int_set(r,i)	mpz_set(r,i)
-#define cloog_int_set_si(r,i)	mpz_set_si(r,i)
-#define cloog_int_abs(r,i)	mpz_abs(r,i)
-#define cloog_int_neg(r,i)	mpz_neg(r,i)
-#define cloog_int_swap(i,j)	mpz_swap(i,j)
-
-#define cloog_int_add(r,i,j)	mpz_add(r,i,j)
-#define cloog_int_add_ui(r,i,j)	mpz_add_ui(r,i,j)
-#define cloog_int_sub(r,i,j)	mpz_sub(r,i,j)
-#define cloog_int_sub_ui(r,i,j)	mpz_sub_ui(r,i,j)
-#define cloog_int_mul(r,i,j)	mpz_mul(r,i,j)
-#define cloog_int_addmul(r,i,j)	mpz_addmul(r,i,j)
-#define cloog_int_divexact(r,i,j)	mpz_divexact(r,i,j)
-#define cloog_int_tdiv_q(r,i,j)	mpz_tdiv_q(r,i,j)
-#define cloog_int_fdiv_q(r,i,j)	mpz_fdiv_q(r,i,j)
-#define cloog_int_fdiv_r(r,i,j)	mpz_fdiv_r(r,i,j)
-#define cloog_int_cdiv_q(r,i,j)	mpz_cdiv_q(r,i,j)
-#define cloog_int_gcd(r,i,j)	mpz_gcd(r,i,j)
-
-#define cloog_int_sgn(i)	mpz_sgn(i)
-#define cloog_int_cmp(i,j)	mpz_cmp(i,j)
-#define cloog_int_abs_cmp(i,j)	mpz_cmpabs(i,j)
-#define cloog_int_cmp_si(i,si)	mpz_cmp_si(i,si)
-#define cloog_int_eq(i,j)	(mpz_cmp(i,j) == 0)
-#define cloog_int_ne(i,j)	(mpz_cmp(i,j) != 0)
-#define cloog_int_gt(i,j)	(mpz_cmp(i,j) > 0)
-
-#define cloog_int_is_divisible_by(i,j)	mpz_divisible_p(i,j)
-
-#define cloog_int_read(r,s)	mpz_set_str(r,s,10)
-typedef void (*cloog_int_print_gmp_free_t)(void *, size_t);
-#define cloog_int_print(out,i)						\
-	do {								\
-		char *s;						\
-		cloog_int_print_gmp_free_t gmp_free;			\
-		s = mpz_get_str(0, 10, i);				\
-		fprintf(out, "%s", s);					\
-		mp_get_memory_functions(NULL, NULL, &gmp_free);		\
-		(*gmp_free)(s, strlen(s)+1);				\
-	} while (0)
-
-#else
-
-#define cloog_int_init(i)	((i) = 0)
-#define cloog_int_clear(i)	do { } while (0)
-
-#define cloog_int_set(r,i)	((r) = (i))
-#define cloog_int_set_si(r,i)	((r) = (i))
-#define cloog_int_abs(r,i)	((r) = (i) > 0 ? (i) : -(i))
-#define cloog_int_neg(r,i)	((r) = -(i))
-#define cloog_int_swap(i,j)	do {					\
-					cloog_int_t _t = i;		\
-					i = j;				\
-					j = _t;				\
-				} while (0)
-
-#define cloog_int_add(r,i,j)	((r) = (i) + (j))
-#define cloog_int_add_ui(r,i,j)	((r) = (i) + (j))
-#define cloog_int_sub(r,i,j)	((r) = (i) - (j))
-#define cloog_int_sub_ui(r,i,j)	((r) = (i) - (j))
-#define cloog_int_mul(r,i,j)	((r) = (i) * (j))
-#define cloog_int_addmul(r,i,j)	((r) += (i) * (j))
-#define cloog_int_divexact(r,i,j)	((r) = (i) / (j))
-#define cloog_int_tdiv_q(r,i,j)	((r) = (i) / (j))
-#define cloog_int_fdiv_q(r,i,j)	do {					\
-					assert((j) > 0);		\
-					(r) = (i) >= 0 ? (i) / (j) :	\
-					    -((-(i)+(j)-1)/(j));	\
-				} while (0)
-#define cloog_int_fdiv_r(r,i,j)	do {					\
-					assert((j) > 0);		\
-					(r) = (i) >= 0 ? (i) % (j) :	\
-					    (j)-1 - ((-(i)+(j)-1)%(j));	\
-				} while (0)
-#define cloog_int_cdiv_q(r,i,j)	do {					\
-					assert((j) > 0);		\
-					(r) = (i) >= 0 ?		\
-					    ((i)+(j)-1) / (j) :		\
-					    -(-(i)/(j));		\
-				} while (0)
-cloog_int_t cloog_gcd(cloog_int_t a, cloog_int_t b);
-#define cloog_int_gcd(r,i,j)	(r) = cloog_gcd(i,j)
-
-#define cloog_int_sgn(i)	((i) > 0 ? 1 : (i) < 0 ? -1 : 0)
-#define cloog_int_cmp(i,j)	(i - j)
-#define cloog_int_abs_cmp(i,j)	(((i) > 0 ? (i) : -(i)) - ((j) > 0 ? (j) : -(j)))
-#define cloog_int_cmp_si(i,si)	(i - si)
-#define cloog_int_eq(i,j)	((i) == (j))
-#define cloog_int_ne(i,j)	((i) != (j))
-#define cloog_int_gt(i,j)	((i) > (j))
-
-#define cloog_int_is_divisible_by(i,j)	((i) % (j) == 0)
-
-#define cloog_int_read(i,s)	sscanf(s, CLOOG_INT_FORMAT, &i)
-#define cloog_int_print(out,i)	fprintf(out, CLOOG_INT_FORMAT, i)
-
-#endif
-
-#define cloog_int_is_pos(i)	(cloog_int_sgn(i) > 0)
-#define cloog_int_is_neg(i)	(cloog_int_sgn(i) < 0)
-#define cloog_int_is_zero(i)	(cloog_int_sgn(i) == 0)
-#define cloog_int_is_one(i)	(cloog_int_cmp_si(i,1) == 0)
-#define cloog_int_is_neg_one(i)	(cloog_int_cmp_si(i,-1) == 0)
-#define cloog_int_gt_si(i,si)	(cloog_int_cmp_si(i,si) > 0)
-#define cloog_int_ne_si(i,j)	(cloog_int_cmp_si(i,j) != 0)
-#define cloog_int_lt(i,j)	(cloog_int_cmp(i,j) < 0)
-#define cloog_int_le(i,j)	(cloog_int_cmp(i,j) <= 0)
-#define cloog_int_abs_ne(i,j)	(cloog_int_abs_cmp(i,j) != 0)
-#define cloog_int_abs_ge(i,j)	(cloog_int_abs_cmp(i,j) >= 0)
-#define cloog_int_abs_lt(i,j)	(cloog_int_abs_cmp(i,j) < 0)
-
-struct cloog_vec {
-	unsigned	size;
-	cloog_int_t	*p;
-};
-
-struct cloog_vec *cloog_vec_alloc(unsigned size);
-void cloog_vec_free(struct cloog_vec *vec);
-
-int cloog_seq_first_non_zero(cloog_int_t *p, unsigned len);
-void cloog_seq_cpy(cloog_int_t *dst, cloog_int_t *src, unsigned len);
-void cloog_seq_neg(cloog_int_t *dst, cloog_int_t *src, unsigned len);
-void cloog_seq_combine(cloog_int_t *dst, cloog_int_t m1, cloog_int_t *src1,
-			cloog_int_t m2, cloog_int_t *src2, unsigned len);
-void cloog_seq_gcd(cloog_int_t *p, unsigned len, cloog_int_t *gcd);
-int cloog_seq_is_neg(cloog_int_t *p1, cloog_int_t *p2, unsigned len);
-void cloog_seq_normalize(cloog_int_t *p, unsigned len);
-
-#if defined(__cplusplus)
-  }
-#endif 
-
-#endif
diff --git a/cloog-0.17.0/include/cloog/isl/backend.h b/cloog-0.17.0/include/cloog/isl/backend.h
deleted file mode 100644
index e4576d9..0000000
--- a/cloog-0.17.0/include/cloog/isl/backend.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef CLOOG_ISL_BACKEND_H
-#define CLOOG_ISL_BACKEND_H
-
-#include <isl/constraint.h>
-
-struct cloogbackend {
-	struct isl_ctx	*ctx;
-	unsigned	ctx_allocated : 1;
-};
-
-#endif /* define _H */
diff --git a/cloog-0.17.0/include/cloog/isl/cloog.h b/cloog-0.17.0/include/cloog/isl/cloog.h
deleted file mode 100644
index 9379054..0000000
--- a/cloog-0.17.0/include/cloog/isl/cloog.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef CLOOG_ISL_H
-#define CLOOG_ISL_H
-
-#ifndef CLOOG_INT_GMP
-#define CLOOG_INT_GMP
-#endif
-
-#include <cloog/cloog.h>
-#include <cloog/isl/constraintset.h>
-#include <cloog/isl/domain.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif 
-
-CloogState *cloog_isl_state_malloc(struct isl_ctx *ctx);
-
-#if defined(__cplusplus)
-}
-#endif 
-
-#endif /* define _H */
diff --git a/cloog-0.17.0/include/cloog/isl/constraintset.h b/cloog-0.17.0/include/cloog/isl/constraintset.h
deleted file mode 100644
index c3c2eed..0000000
--- a/cloog-0.17.0/include/cloog/isl/constraintset.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef CLOOG_ISL_CONSTRAINTSET_H
-#define CLOOG_ISL_CONSTRAINTSET_H
-
-#include <cloog/isl/backend.h>
-
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-struct cloogconstraintset {
-	int dummy;	/* Solaris cc doesn't like zero-sized structs */
-};
-
-struct cloogequalities {
-	int			  n;
-	unsigned		  total_dim;
-	isl_constraint		**constraints;
-	int			 *types;
-};
-
-struct cloogconstraint {
-	int dummy;	/* Solaris cc doesn't like zero-sized structs */
-};
-
-CloogConstraintSet *cloog_constraint_set_from_isl_basic_set(struct isl_basic_set *bset);
-CloogConstraint *cloog_constraint_from_isl_constraint(struct isl_constraint *constraint);
-isl_constraint *cloog_constraint_to_isl(CloogConstraint *constraint);
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.17.0/include/cloog/isl/domain.h b/cloog-0.17.0/include/cloog/isl/domain.h
deleted file mode 100644
index 427d847..0000000
--- a/cloog-0.17.0/include/cloog/isl/domain.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef CLOOG_ISL_DOMAIN_H
-#define CLOOG_ISL_DOMAIN_H
-
-#include <isl/map.h>
-#include <isl/set.h>
-#include <isl/union_map.h>
-#include <isl/union_set.h>
-
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-
-struct cloogdomain {
-	int dummy;	/* Solaris cc doesn't like zero-sized structs */
-};
-
-struct cloogscattering {
-	int dummy;	/* Solaris cc doesn't like zero-sized structs */
-};
-
-CloogDomain *cloog_domain_from_isl_set(struct isl_set *set);
-CloogScattering *cloog_scattering_from_isl_map(struct isl_map *map);
-CloogUnionDomain *cloog_union_domain_from_isl_union_map(
-	__isl_take isl_union_map *umap);
-CloogUnionDomain *cloog_union_domain_from_isl_set(
-	__isl_take isl_set *set);
-
-__isl_give isl_set *isl_set_from_cloog_domain(CloogDomain *domain);
-
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.17.0/include/cloog/loop.h b/cloog-0.17.0/include/cloog/loop.h
deleted file mode 100644
index b62a274..0000000
--- a/cloog-0.17.0/include/cloog/loop.h
+++ /dev/null
@@ -1,120 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                             loop.h                                **
-    **-------------------------------------------------------------------**
-    **                 First version: october 26th 2001                  **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-#ifndef CLOOG_LOOP_H
-#define CLOOG_LOOP_H
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-/**
- * CloogLoop structure:
- * this structure contains all the informations of a loop generated or to be
- * generated.
- * - if the loop has not been processed yet (it is not a result of a call to
- *   cloog_loop_generate), the domain is the whole iteration domain of a given
- *   block, the stride is 1 (i.e. there is no stride), block is necessarily not
- *   NULL and inner is NULL.
- * - if the loop comes as a result of a cloog_loop_generate call, the domain
- *   describes the constraints (guards and loop bounds) for only one dimension
- *   (the last one: outer dimensions being considered as parameters), the stride
- *   may differ from one (this means that on the considered dimension, a step of
- *   'stride' must be considered between integral point, the first integral
- *   point to be considered being the lower bound of the loop), inner may differ
- *   from NULL, meaning that there are further dimensions and nesting levels in
- *   the loop.
- */
-struct cloogloop
-{
-  CloogState *state;          /**< State. */
-  CloogDomain * domain ;      /**< The iteration domain. */
-  CloogDomain *unsimplified;  /**< Unsimplified version of domain. */
-  int otl;                    /**< Loop is executed at most once. */
-  CloogStride *stride;        /**< If not NULL, stride information on iterator
-                               *   (filled only after loop generation).
-                               */
-  CloogBlock * block ;        /**< The included statement block, NULL if none.*/
-  void * usr;		      /**< User field, for library user convenience.
-			       *   This pointer is not freed when the
-			       *   CloogLoop structure is freed.
-			       */
-  struct cloogloop * inner ;  /**< Loops at the next level. */
-  struct cloogloop * next ;   /**< Next loop at the same level. */
-} ;
-typedef struct cloogloop CloogLoop ;
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-void cloog_loop_print_structure(FILE *, CloogLoop *, int) ;
-void cloog_loop_print(FILE *, CloogLoop *) ;
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-void cloog_loop_free(CloogLoop *) ;
-
-
-/******************************************************************************
- *                              Reading functions                             *
- ******************************************************************************/
-CloogLoop *cloog_loop_from_domain(CloogState *state, CloogDomain *domain,
-				  int number);
-CloogLoop * cloog_loop_read(CloogState *state,
-			    FILE * foo, int number, int nb_parameters);
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-CloogLoop * cloog_loop_block(CloogLoop *loop, int *scaldims, int nb_scattdims);
-CloogLoop * cloog_loop_malloc(CloogState *state);
-CloogLoop *cloog_loop_generate(CloogLoop *loop, CloogDomain *context,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	CloogOptions *options);
-CloogLoop *cloog_loop_simplify(CloogLoop *loop, CloogDomain *context, int level,
-	int nb_scattdims, CloogOptions *options);
-void cloog_loop_scatter(CloogLoop *, CloogScattering *);
-
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.17.0/include/cloog/matrix.h b/cloog-0.17.0/include/cloog/matrix.h
deleted file mode 100644
index 2b73039..0000000
--- a/cloog-0.17.0/include/cloog/matrix.h
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef CLOOG_MATRIX_H
-#define CLOOG_MATRIX_H
-#if defined(__cplusplus)
-extern "C"
-  {
-#endif
-
-/* The CloogMatrix structure is equivalent to the PolyLib Matrix data structure
- * (see Wil93). This structure is devoted to represent a set of constraints.
- *
- * The whole matrix is stored in memory row after row at the p_Init address. p
- * is an array of pointers where p[i] points to the first element of the i^{th
- * row. NbRows and NbColumns are respectively the number of rows and columns of
- * the matrix. Each row corresponds to a constraint. The first element of each
- * row is an equality/inequality tag. The constraint is an equality p(x) = 0 if
- * the first element is 0, but it is an inequality p(x) \geq 0 if the first
- * element is 1. The next elements are the unknown coefficients, followed by
- * the parameter coefficients, then the constant term. For instance, the
- * following three constraints:
- *
- *     -i + m  = 0
- *     -j + n >= 0
- *  i + j - k >= 0
- *
- * would be represented by the following rows:
- *
- * # eq/in  i   j   k   m   n   cst
- *     0    0  -1   0   1   0    0
- *     1   -1   0   0   0   1    0
- *     1    1   1  -1   0   0    0
- *
- * To be able to provide different precision version (CLooG supports 32 bits,
- * 64 bits and arbitrary precision through the GMP library), the cloog_int_t
- * type depends on the configuration options (it may be long int for 32 bits
- * version, long long int for 64 bits version, and mpz_t for multiple precision
- * version). */
-
-struct cloogmatrix
-{ unsigned NbRows;    /* Number of rows. */
-  unsigned NbColumns; /* Number of columns. */
-  cloog_int_t ** p;         /* Array of pointers to the matrix rows. */
-  cloog_int_t * p_Init;     /* Matrix rows contiguously in memory. */
-};
-
-typedef struct cloogmatrix CloogMatrix;
-
-CloogMatrix *cloog_matrix_alloc (unsigned, unsigned);
-void cloog_matrix_free (CloogMatrix *);
-void cloog_matrix_print_structure(FILE *file, CloogMatrix *M,
-		const char *prefix, const char *suffix);
-CloogMatrix *cloog_matrix_read(FILE *input);
-CloogMatrix *cloog_matrix_read_of_size(FILE *input,
-		unsigned n_row, unsigned n_col);
-void cloog_matrix_print(FILE*, CloogMatrix*);
-
-#if defined(__cplusplus)
-  }
-#endif
-#endif /* define _H */
diff --git a/cloog-0.17.0/include/cloog/matrix/constraintset.h b/cloog-0.17.0/include/cloog/matrix/constraintset.h
deleted file mode 100644
index 5023162..0000000
--- a/cloog-0.17.0/include/cloog/matrix/constraintset.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef CLOOG_MATRIX_CONSTRAINTSET_H
-#define CLOOG_MATRIX_CONSTRAINTSET_H
-
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-struct cloogconstraintset {
-	CloogMatrix M;
-};
-
-struct cloogequalities {
-	CloogConstraintSet	*constraints;
-	int			*types;
-};
-
-struct cloogconstraint {
-	CloogConstraintSet	*set;
-	cloog_int_t		**line;
-};
-
-CloogConstraintSet *cloog_constraint_set_from_cloog_matrix(CloogMatrix *M);
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.17.0/include/cloog/names.h b/cloog-0.17.0/include/cloog/names.h
deleted file mode 100644
index 7f566f1..0000000
--- a/cloog-0.17.0/include/cloog/names.h
+++ /dev/null
@@ -1,103 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                             names.h                               **
-    **-------------------------------------------------------------------**
-    **                  First version: august 1st 2002                   **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-#ifndef CLOOG_NAMES_H
-#define CLOOG_NAMES_H
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-
-# define MAX_NAME 50
-# define FIRST_PARAMETER 'M'
-# define FIRST_ITERATOR  'i'
-
-
-/**
- * CloogNames structure:
- * this structure contains all the informations about parameter and iterator
- * names (as strings).
- */
-struct cloognames
-{ int nb_scalars ;         /**< Scalar dimension number. */
-  int nb_scattering ;      /**< Scattering iterator number. */
-  int nb_iterators ;       /**< Iterator number. */
-  int nb_parameters ;      /**< Parameter number. */
-  char ** scalars ;        /**< The scalar names     (an array of strings). */
-  char ** scattering ;     /**< The scattering names (an array of strings). */
-  char ** iterators ;      /**< The iterator names   (an array of strings). */
-  char ** parameters ;     /**< The parameter names  (an array of strings). */
-  int references;          /**< Number of references to this structure. */
-} ;
-typedef struct cloognames CloogNames ;
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-void cloog_names_print_structure(FILE *, CloogNames *, int) ;
-void cloog_names_print(FILE *, CloogNames *) ;
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-void cloog_names_free(CloogNames *) ;
-
-
-/******************************************************************************
- *                              Reading functions                             *
- ******************************************************************************/
-char ** cloog_names_read_strings(FILE *file, int nb_items);
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-CloogNames * cloog_names_malloc(void);
-CloogNames * cloog_names_copy(CloogNames *names);
-CloogNames * cloog_names_alloc(void);
-char ** cloog_names_generate_items(int, char *, char) ;
-CloogNames * cloog_names_generate(int, int, int, int, char, char, char, char) ;
-void cloog_names_scalarize(CloogNames *, int, int *) ;
-const char * cloog_names_name_at_level(CloogNames *names, int level);
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.17.0/include/cloog/options.h b/cloog-0.17.0/include/cloog/options.h
deleted file mode 100644
index 2233579..0000000
--- a/cloog-0.17.0/include/cloog/options.h
+++ /dev/null
@@ -1,165 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                               CLooG                               **
-    **-------------------------------------------------------------------**
-    **                             options.h                             **
-    **-------------------------------------------------------------------**
-    **                  First version: april 19th 2003                   **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-#include <stdio.h>
-
-#ifndef CLOOG_OPTIONS_H
-#define CLOOG_OPTIONS_H
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-
-/* Uncomment the following line if you want some information about
- * maximum total allocated memory for code generation.
-#define CLOOG_MEMORY 
- */
-#define CLOOG_SCALARS
-
-struct osl_scop;
-
-struct cloogoptions;
-typedef struct cloogoptions CloogOptions;
-struct osl_scop;
-
-struct cloogoptions
-{
-  CloogState *state; /* State. */
-  /* OPTIONS FOR LOOP GENERATION */
-  int l ;           /* Last level to optimize. */
-  int f ;           /* First level to optimize. */
-  int stop ;        /* Level to stop code generation. */
-  int strides ;     /* 1 if user wants to handle non-unit strides (then loop
-                     * increment can be something else than one), 0 otherwise.
-                     */
-  int sh;	    /* 1 for computing simple hulls */
-  int first_unroll; /* The first dimension to unroll */
-
-  /* OPTIONS FOR PRETTY PRINTING */
-  int esp ;       /* 1 if user wants to spread all equalities, i.e. when there
-                   * is something like "i = 3*j + 1 ; A[i] = 0 ;" the generator
-                   * will write "A[3*j + 1] = 0 ;", 0 otherwise.
-                   */
-  int fsp ;       /* The iteration level where equalities spreading can begin
-                   * (it might happen that the user wants not to spread values
-                   * of scattering iterators).
-                   */
-  int otl ;       /* 1 for eliminate loops running just one time and write them
-                   * as an affectation of the iterator, 0 otherwise.
-                   */
-  int block ;     /* 1 to make one new block {...} per new dimension,
-                   * 0 otherwise.
-                   */
-  int compilable; /* 1 to generate a compilable code by using
-                   * preprocessing, 0 otherwise.
-                   */
-  int callable;   /* 1 to generate callable code by using
-                   * preprocessing, 0 otherwise.
-                   */
-  int language;   /* 1 to generate FORTRAN, 0 for C otherwise. */
-
-  int save_domains;/* Save unsimplified copy of domain. */
-
-  /* MISC OPTIONS */
-  char * name ;   /* Name of the input file. */
-  float time ;    /* Time spent for code generation in seconds. */
-  int openscop;   /* 1 if the input file has OpenScop format, 0 otherwise. */
-  struct osl_scop *scop; /* Input OpenScop scop if any, NULL otherwise. */
-#ifdef CLOOG_MEMORY
-  int memory ;    /* Memory spent for code generation in kilobytes. */
-#endif
-  int quiet;      /* Don't print any informational messages. */
-  /* UNDOCUMENTED OPTIONS FOR THE AUTHOR ONLY */
-  int leaks ;     /* 1 if I want to print the allocation statistics,
-                   * 0 otherwise.
-		   */
-  int backtrack;  /* 1 to perform backtracking in 
-                   * Quillere's algorithm, 0 otherwise.
-		   */
-  int override ;  /* 1 if I want to bypass CLooG decisions on option correctness
-                   * (generated code may be incorrect), 0 otherwise.
-		   */
-  int structure ; /* 1 if I want to print the CloogProgram structure before the
-                   * pretty printed code, 0 otherwise.
-		   */
-  int noblocks ;  /* 1 if I don't want to make statement blocks, 0 otherwise. */
-  int noscalars ; /* 1 if I don't want to use scalar dimensions, 0 otherwise. */
-  int nosimplify; /* 1 if I don't want to simplify polyhedra, 0 otherwise. */
-} ;
-
-
-/******************************************************************************
- *                          Error reporting functions                         *
- ******************************************************************************/
-
-enum cloog_msg_type { CLOOG_ERROR, CLOOG_WARNING, CLOOG_INFO };
-
-void cloog_msg(CloogOptions *options, enum cloog_msg_type type,
-		const char *msg, ...);
-void cloog_die(const char *msg, ...);
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-void cloog_options_print(FILE *, CloogOptions *) ;
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-void cloog_options_free(CloogOptions *) ;
-
-
-/******************************************************************************
- *                               Reading function                             *
- ******************************************************************************/
-void cloog_options_read(CloogState *state, int argc, char **argv,
-			FILE **input, FILE **output, CloogOptions **options);
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-CloogOptions *cloog_options_malloc(CloogState *state);
-void cloog_options_copy_from_osl_scop(struct osl_scop *, CloogOptions *);
-
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.17.0/include/cloog/pprint.h b/cloog-0.17.0/include/cloog/pprint.h
deleted file mode 100644
index 55e2b5e..0000000
--- a/cloog-0.17.0/include/cloog/pprint.h
+++ /dev/null
@@ -1,67 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                             pprint.h                              **
-    **-------------------------------------------------------------------**
-    **                 First version: october 26th 2001                  **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-#ifndef CLOOG_PPRINT_H
-#define CLOOG_PPRINT_H
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-
-# define MAX_STRING_VAL 32
-# define INDENT_STEP 2
-
-# define EQTYPE_NONE	 0
-# define EQTYPE_CONSTANT 1
-# define EQTYPE_PUREITEM 2
-# define EQTYPE_EXAFFINE 3
-
-#define CLOOG_LANGUAGE_C 0
-#define CLOOG_LANGUAGE_FORTRAN 1
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-void clast_pprint(FILE *foo, struct clast_stmt *root, int indent, 
-	    CloogOptions *options);
-
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.17.0/include/cloog/program.h b/cloog-0.17.0/include/cloog/program.h
deleted file mode 100644
index 530d21f..0000000
--- a/cloog-0.17.0/include/cloog/program.h
+++ /dev/null
@@ -1,116 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                            program.h                              **
-    **-------------------------------------------------------------------**
-    **                 First version: october 25th 2001                  **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-#ifndef CLOOG_PROGRAM_H
-#define CLOOG_PROGRAM_H
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-
-# define MAX_STRING 1024
-# define MEGA 1000000  /* One million. */
-
-
-/**
- * CloogProgram structure:
- * this structure contains all the informations of a program generated or to be
- * generated.
- */
-struct cloogprogram
-{ /* Basic program description fields. */
-  char language ;              /**< The language of the program. */
-  int  nb_scattdims ;          /**< Scattering dimension number. */
-  CloogDomain    * context ;   /**< The context of the program. */
-  CloogLoop      * loop ;      /**< The loops of the program. */
-  CloogNames     * names ;     /**< Iterators and parameters names. */
-  CloogBlockList * blocklist ; /**< The statement block list. */
-  
-  /* Internal service fields, filled up by cloog_program_scatter function. */
-  int * scaldims ;             /**< Boolean array saying whether a given
-                                *   scattering dimension is scalar or not.
-				*/
-  /* Library user reserved field. */
-  void * usr;		       /**< User field, for library user convenience.
-			        *   This pointer is not freed when the
-			        *   CloogProgram structure is freed.
-			        */
-} ;
-typedef struct cloogprogram CloogProgram ;
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-void cloog_program_print_structure(FILE *, CloogProgram *, int) ;
-void cloog_program_print(FILE *, CloogProgram *) ;
-void cloog_program_pprint(FILE *, CloogProgram *, CloogOptions *) ;
-void cloog_program_dump_cloog(FILE *, CloogProgram *, CloogScatteringList *);
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-void cloog_program_free(CloogProgram *) ;
-
-
-/******************************************************************************
- *                               Reading function                             *
- ******************************************************************************/
-CloogProgram * cloog_program_read(FILE *, CloogOptions *) ;
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-CloogProgram * cloog_program_malloc(void);
-CloogProgram * cloog_program_alloc(CloogDomain *context, CloogUnionDomain *ud,
-	CloogOptions *options);
-CloogProgram * cloog_program_generate(CloogProgram *, CloogOptions *) ;
-void cloog_program_block(CloogProgram *program,
-	CloogScatteringList *scattering, CloogOptions *options);
-void cloog_program_extract_scalars(CloogProgram *program,
-	CloogScatteringList *scattering, CloogOptions *options);
-void cloog_program_scatter(CloogProgram *program,
-			CloogScatteringList *scattering, CloogOptions *options);
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
-
diff --git a/cloog-0.17.0/include/cloog/state.h b/cloog-0.17.0/include/cloog/state.h
deleted file mode 100644
index ebc3272..0000000
--- a/cloog-0.17.0/include/cloog/state.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef CLOOG_STATE_H
-#define CLOOG_STATE_H
-
-struct cloogbackend;
-typedef struct cloogbackend CloogBackend;
-
-#if defined(__cplusplus)
-extern "C" {
-#endif 
-
-struct cloogstate {
-  CloogBackend *backend;
-
-  cloog_int_t zero;
-  cloog_int_t one;
-  cloog_int_t negone;
-
-  int block_allocated;
-  int block_freed;
-  int block_max;
-
-  int domain_allocated;
-  int domain_freed;
-  int domain_max;
-
-  int loop_allocated;
-  int loop_freed;
-  int loop_max;
-
-  int statement_allocated;
-  int statement_freed;
-  int statement_max;
-};
-typedef struct cloogstate CloogState;
-
-CloogState *cloog_core_state_malloc(void);
-CloogState *cloog_state_malloc(void);
-
-void cloog_core_state_free(CloogState *state);
-void cloog_state_free(CloogState *state);
-
-#if defined(__cplusplus)
-}
-#endif 
-
-#endif
diff --git a/cloog-0.17.0/include/cloog/statement.h b/cloog-0.17.0/include/cloog/statement.h
deleted file mode 100644
index abc505e..0000000
--- a/cloog-0.17.0/include/cloog/statement.h
+++ /dev/null
@@ -1,85 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                           statement.h                             **
-    **-------------------------------------------------------------------**
-    **                  First version: november 4th 2001                 **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-#ifndef CLOOG_STATEMENT_H
-#define CLOOG_STATEMENT_H
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-
-struct cloogstatement
-{
-  CloogState *state;             /* State. */
-  char *name;			 /* Name of the statement. */
-  int number;                    /* The statement unique number. */
-  void * usr ;                   /* A pointer for library users convenience. */
-  struct cloogstatement * next ; /* Pointer to the next statement with the
-                                  * same original domain and the same
-				  * scattering function.
-				  */
-} ;
-typedef struct cloogstatement CloogStatement ;
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-void cloog_statement_print_structure(FILE *, CloogStatement *, int) ;
-void cloog_statement_print(FILE *, CloogStatement *) ;
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-void cloog_statement_free(CloogStatement *) ;
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-CloogStatement * cloog_statement_malloc(CloogState *state);
-CloogStatement * cloog_statement_alloc(CloogState *state, int);
-CloogStatement * cloog_statement_copy(CloogStatement *) ;
-void cloog_statement_add(CloogStatement**, CloogStatement**, CloogStatement*) ;
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
-
diff --git a/cloog-0.17.0/include/cloog/stride.h b/cloog-0.17.0/include/cloog/stride.h
deleted file mode 100644
index f93dc4e..0000000
--- a/cloog-0.17.0/include/cloog/stride.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef CLOOG_STRIDE_H
-#define CLOOG_STRIDE_H
-
-#if defined(__cplusplus)
-extern "C" {
-#endif 
-
-/**
- * Information about strides.
- */
-struct cloogstride {
-  int references;
-  cloog_int_t stride;         /**< The actual stride. */
-  cloog_int_t offset;         /**< Offset of strided loop. */
-  cloog_int_t factor;
-  CloogConstraint *constraint;
-};
-typedef struct cloogstride CloogStride;
-
-CloogStride *cloog_stride_alloc(cloog_int_t stride, cloog_int_t offset);
-CloogStride *cloog_stride_alloc_from_constraint(cloog_int_t stride,
-	CloogConstraint *constraint, cloog_int_t factor);
-CloogStride *cloog_stride_copy(CloogStride *stride);
-void cloog_stride_free(CloogStride *stride);
-
-CloogConstraint *cloog_constraint_stride_lower_bound(CloogConstraint *c,
-	int level, CloogStride *stride);
-
-#if defined(__cplusplus)
-}
-#endif 
-
-#endif
diff --git a/cloog-0.17.0/include/cloog/union_domain.h b/cloog-0.17.0/include/cloog/union_domain.h
deleted file mode 100644
index 5c6ff86..0000000
--- a/cloog-0.17.0/include/cloog/union_domain.h
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef CLOOG_UNION_DOMAIN_H
-#define CLOOG_UNION_DOMAIN_H
-
-#if defined(__cplusplus)
-extern "C" {
-#endif 
-
-struct osl_scop;
-
-/**
- * CloogNamedDomainList structure:
- * this structure reprensents a node of a linked list of CloogDomain structures.
- */
-struct cloognameddomainlist {
-  CloogDomain *domain;              /**< An element of the list. */
-  CloogScattering *scattering;      /**< Scattering function for domain. */
-  char *name;                       /**< Name of the domain. */
-  void *usr;                        /**< A pointer for library user's convenience. */
-  struct cloognameddomainlist *next;/**< Pointer to the next element of the list.*/
-};
-typedef struct cloognameddomainlist CloogNamedDomainList;
-
-/**
- * A structure representing the input domains and scattering functions.
- */
-struct clooguniondomain {
-	int n_name[3];
-	char **name[3];
-	CloogNamedDomainList *domain;
-	CloogNamedDomainList **next_domain;
-};
-typedef struct clooguniondomain CloogUnionDomain;
-
-enum cloog_dim_type { CLOOG_PARAM, CLOOG_ITER, CLOOG_SCAT };
-
-CloogUnionDomain *cloog_union_domain_read(FILE *file, int nb_par,
-	CloogOptions *options);
-CloogUnionDomain *cloog_union_domain_alloc(int nb_par);
-CloogUnionDomain *cloog_union_domain_add_domain(CloogUnionDomain *ud,
-	const char *name, CloogDomain *domain, CloogScattering *scattering,
-	void *usr);
-CloogUnionDomain *cloog_union_domain_set_name(CloogUnionDomain *ud,
-	enum cloog_dim_type type, int index, const char *name);
-void cloog_union_domain_free(CloogUnionDomain *ud);
-CloogUnionDomain *cloog_union_domain_from_osl_scop(CloogState *,
-                                                   struct osl_scop *);
-
-#if defined(__cplusplus)
-}
-#endif 
-
-#endif
diff --git a/cloog-0.17.0/include/cloog/version.h b/cloog-0.17.0/include/cloog/version.h
deleted file mode 100644
index 18a0db9..0000000
--- a/cloog-0.17.0/include/cloog/version.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-#ifndef CLOOG_VERSION_H
-#define CLOOG_VERSION_H
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-#define CLOOG_VERSION_MAJOR 0
-#define CLOOG_VERSION_MINOR 17
-#define CLOOG_VERSION_REVISION 0
-
-const char *cloog_version(void);
-
-int cloog_version_major(void);
-
-int cloog_version_minor(void);
-
-int cloog_version_revision(void);
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.17.0/include/cloog/version.h.in b/cloog-0.17.0/include/cloog/version.h.in
deleted file mode 100644
index cee91a0..0000000
--- a/cloog-0.17.0/include/cloog/version.h.in
+++ /dev/null
@@ -1,50 +0,0 @@
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-#ifndef CLOOG_VERSION_H
-#define CLOOG_VERSION_H
-#if defined(__cplusplus)
-extern "C" 
-  {
-#endif 
-
-#define CLOOG_VERSION_MAJOR @VERSION_MAJOR@
-#define CLOOG_VERSION_MINOR @VERSION_MINOR@
-#define CLOOG_VERSION_REVISION @VERSION_REVISION@
-
-const char *cloog_version(void);
-
-int cloog_version_major(void);
-
-int cloog_version_minor(void);
-
-int cloog_version_revision(void);
-
-#if defined(__cplusplus)
-  }
-#endif 
-#endif /* define _H */
diff --git a/cloog-0.17.0/isl/AUTHORS b/cloog-0.17.0/isl/AUTHORS
deleted file mode 100644
index 965ed11..0000000
--- a/cloog-0.17.0/isl/AUTHORS
+++ /dev/null
@@ -1,19 +0,0 @@
-isl was written by
-
-	    Sven Verdoolaege
-2006-2007   Leiden Institute of Advanced Computer Science
-	    Universiteit Leiden
-	    Niels Bohrweg 1
-	    2333 CA Leiden
-	    The Netherlands
-2008-2009   K.U.Leuven
-	    Departement Computerwetenschappen
-	    Celestijnenlaan 200A
-	    B-3001 Leuven
-	    Belgium
-2010	    INRIA Saclay - Ile-de-France
-	    Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod
-	    91893 Orsay
-	    France
-
-The quicksort implementation was written by Douglas C. Schmidt.
diff --git a/cloog-0.17.0/isl/ChangeLog b/cloog-0.17.0/isl/ChangeLog
deleted file mode 100644
index 506e95d..0000000
--- a/cloog-0.17.0/isl/ChangeLog
+++ /dev/null
@@ -1,64 +0,0 @@
-version: 0.08
-date: Fri Oct 21 12:36:20 CEST 2011
-changes:
-	- improved parsing
-	- drop isl_div abstraction
-	- rename isl_dim to isl_space
-	- |-
-	  explicitly differentiate between spaces of maps,
-	  sets and parameter sets
-	- add support for identifiers
-	- add support for (piecewise) multi quasi-affine expressions
-	- preliminary Python bindings
----
-version: 0.07
-date: Tue Jul 12 19:34:51 CEST 2011
-changes:
-	- hide internal structures of isl_div and isl_constraint
-	- preliminary scheduling
-	- add support for local spaces and (piecewise) quasi-affine expressions
----
-version: 0.06
-date: Fri Mar 18 15:59:16 CET 2011
-changes:
-	- improved parsing
-	- consistency changes in API
-	- hide internal structure of isl_ctx
----
-version: 0.05.1
-date: Wed Jan  5 10:21:42 CET 2011
-changes:
-	- fix simple symmetry detection in parametric integer programming
----
-version: 0.05
-date: Thu Dec 23 17:03:14 CET 2010
-changes:
-	- rename header files from isl_header.h to isl/header.h
-	- add higher level interface for dependence analysis
-	- improved argument parsing
-	- optionally triangulate domains during Bernstein expansion
-	- support extended PolyLib format
-	- hide internal structure of some data types
-	- improved coalescing
-	- add simple symmetry detection in parametric integer programming
----
-version: 0.04
-date: Fri Sep 10 12:57:50 CEST 2010
-changes:
-	- rename isl_pw_qpolynomial_fold_add
-	- add isl_map_apply_pw_qpolynomial_fold
-	- support named and nested spaces
-	- support union sets and maps
-	- add public API for matrices
----
-version: 0.03
-date: Tue Jun 29 13:16:46 CEST 2010
-changes:
-	- new printing functions
-	- support for "may" accesses in dependence analysis
-	- improved coalescing
-	- improved transitive closure
-	- fix several hard to trigger bugs
-	- improved argument parsing
-	- support parametric vertex enumeration for barvinok
-	- optionally use Bernstein expansion to compute bounds
diff --git a/cloog-0.17.0/isl/GIT_HEAD_ID b/cloog-0.17.0/isl/GIT_HEAD_ID
deleted file mode 100644
index eb4dbb1..0000000
--- a/cloog-0.17.0/isl/GIT_HEAD_ID
+++ /dev/null
@@ -1 +0,0 @@
-isl-0.08-60-g60518c5
diff --git a/cloog-0.17.0/isl/Makefile.am b/cloog-0.17.0/isl/Makefile.am
deleted file mode 100644
index 5a8d307..0000000
--- a/cloog-0.17.0/isl/Makefile.am
+++ /dev/null
@@ -1,274 +0,0 @@
-if HAVE_CLANG
-    MAYBE_INTERFACE = interface
-endif
-SUBDIRS = . $(MAYBE_INTERFACE) doc
-DIST_SUBDIRS = $(MAYBE_INTERFACE) doc
-
-ACLOCAL_AMFLAGS = -I m4
-AUTOMAKE_OPTIONS = nostdinc
-
-lib_LTLIBRARIES = libisl.la
-noinst_PROGRAMS = isl_test isl_polyhedron_sample isl_pip \
-	isl_polyhedron_minimize isl_polytope_scan \
-	isl_polyhedron_detect_equalities isl_cat \
-	isl_closure isl_bound
-TESTS = isl_test pip_test.sh bound_test.sh
-
-if HAVE_PIPLIB
-ISL_PIPLIB = \
-	isl_lp_piplib.c \
-	isl_map_piplib.c \
-	isl_sample_piplib.c \
-	isl_sample_piplib.h \
-	isl_piplib.c
-else
-ISL_PIPLIB = \
-	isl_lp_no_piplib.c \
-	isl_map_no_piplib.c \
-	isl_sample_no_piplib.c
-endif
-
-if NEED_GET_MEMORY_FUNCTIONS
-GET_MEMORY_FUNCTIONS=mp_get_memory_functions.c
-endif
-
-INCLUDES = -I. -I$(srcdir) -I$(srcdir)/include -Iinclude/ 
-AM_CFLAGS = @WARNING_FLAGS@
-
-libisl_la_SOURCES = \
-	$(ISL_PIPLIB) \
-	$(GET_MEMORY_FUNCTIONS) \
-	isl_aff.c \
-	isl_aff_private.h \
-	isl_affine_hull.c \
-	isl_arg.c \
-	isl_band.c \
-	isl_band_private.h \
-	isl_basis_reduction.h \
-	basis_reduction_tab.c \
-	isl_bernstein.c \
-	isl_bernstein.h \
-	isl_blk.c \
-	isl_bound.c \
-	isl_bound.h \
-	isl_coalesce.c \
-	isl_constraint.c \
-	isl_constraint_private.h \
-	isl_convex_hull.c \
-	isl_ctx.c \
-	isl_ctx_private.h \
-	isl_dim.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_flow.c \
-	isl_fold.c \
-	isl_gmp.c \
-	isl_hash.c \
-	isl_hmap_map_basic_set.c \
-	isl_hmap_map_basic_set.h \
-	isl_ilp.c \
-	isl_input.c \
-	isl_list.c \
-	isl_list_private.h \
-	isl_local_space_private.h \
-	isl_local_space.c \
-	isl_lp.c \
-	isl_lp_piplib.h \
-	isl_map.c \
-	isl_map_simplify.c \
-	isl_map_subtract.c \
-	isl_map_private.h \
-	isl_map_piplib.h \
-	isl_mat.c \
-	isl_mat_private.h \
-	isl_morph.c \
-	isl_morph.h \
-	isl_id.c \
-	isl_id_private.h \
-	isl_obj.c \
-	isl_options.c \
-	isl_options_private.h \
-	isl_output.c \
-	isl_qsort.c \
-	isl_qsort.h \
-	isl_piplib.h \
-	isl_point_private.h \
-	isl_point.c \
-	isl_polynomial_private.h \
-	isl_polynomial.c \
-	isl_printer_private.h \
-	isl_printer.c \
-	print.c \
-	isl_range.c \
-	isl_range.h \
-	isl_reordering.c \
-	isl_reordering.h \
-	isl_sample.h \
-	isl_sample.c \
-	isl_scan.c \
-	isl_scan.h \
-	isl_schedule.c \
-	isl_schedule_private.h \
-	isl_space.c \
-	isl_space_private.h \
-	isl_stream.c \
-	isl_stream_private.h \
-	isl_seq.c \
-	isl_tab.c \
-	isl_tab.h \
-	isl_tab_pip.c \
-	isl_transitive_closure.c \
-	isl_union_map.c \
-	isl_union_map_private.h \
-	isl_vec.c \
-	isl_version.c \
-	isl_vertices_private.h \
-	isl_vertices.c
-EXTRA_libisl_la_SOURCES = \
-	isl_lp_piplib.c \
-	isl_lp_no_piplib.c \
-	isl_map_piplib.c \
-	isl_map_no_piplib.c \
-	isl_sample_no_piplib.c \
-	isl_sample_piplib.c \
-	isl_sample_piplib.h \
-	isl_piplib.c
-libisl_la_LIBADD = @PIPLIB_LIBS@ @GMP_LIBS@
-libisl_la_LDFLAGS = -version-info @versioninfo@ \
-	@PIPLIB_LDFLAGS@ @GMP_LDFLAGS@
-libisl_la_CPPFLAGS = $(INCLUDES) @PIPLIB_CPPFLAGS@ @GMP_CPPFLAGS@
-
-isl_test_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_test_LDFLAGS = @GMP_LDFLAGS@
-isl_test_LDADD = libisl.la @GMP_LIBS@
-
-isl_polyhedron_sample_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_polyhedron_sample_LDADD = libisl.la
-isl_polyhedron_sample_SOURCES = \
-	polyhedron_sample.c
-
-isl_pip_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_pip_LDFLAGS = @GMP_LDFLAGS@
-isl_pip_LDADD = libisl.la @GMP_LIBS@
-isl_pip_SOURCES = \
-	pip.c
-
-isl_bound_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_bound_LDFLAGS = @GMP_LDFLAGS@
-isl_bound_LDADD = libisl.la @GMP_LIBS@
-isl_bound_SOURCES = \
-	bound.c
-
-isl_polyhedron_minimize_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_polyhedron_minimize_LDFLAGS = @GMP_LDFLAGS@
-isl_polyhedron_minimize_LDADD = libisl.la @GMP_LIBS@
-isl_polyhedron_minimize_SOURCES = \
-	polyhedron_minimize.c
-
-isl_polytope_scan_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_polytope_scan_LDADD = libisl.la
-isl_polytope_scan_SOURCES = \
-	polytope_scan.c
-
-isl_polyhedron_detect_equalities_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_polyhedron_detect_equalities_LDADD = libisl.la
-isl_polyhedron_detect_equalities_SOURCES = \
-	polyhedron_detect_equalities.c
-
-isl_cat_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_cat_LDADD = libisl.la
-isl_cat_SOURCES = \
-	cat.c
-
-isl_closure_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_closure_LDADD = libisl.la
-isl_closure_SOURCES = \
-	closure.c
-
-nodist_pkginclude_HEADERS = \
-	include/isl/config.h \
-	include/isl/stdint.h
-pkginclude_HEADERS = \
-	include/isl/aff.h \
-	include/isl/aff_type.h \
-	include/isl/arg.h \
-	include/isl/band.h \
-	include/isl/blk.h \
-	include/isl/constraint.h \
-	include/isl/ctx.h \
-	include/isl/dim.h \
-	include/isl/flow.h \
-	include/isl/id.h \
-	include/isl/ilp.h \
-	include/isl/int.h \
-	include/isl/hash.h \
-	include/isl/list.h \
-	include/isl/local_space.h \
-	include/isl/lp.h \
-	include/isl/mat.h \
-	include/isl/map.h \
-	include/isl/map_type.h \
-	include/isl/multi.h \
-	include/isl/obj.h \
-	include/isl/options.h \
-	include/isl/point.h \
-	include/isl/polynomial.h \
-	include/isl/polynomial_type.h \
-	include/isl/printer.h \
-	include/isl/schedule.h \
-	include/isl/seq.h \
-	include/isl/set.h \
-	include/isl/set_type.h \
-	include/isl/space.h \
-	include/isl/stream.h \
-	include/isl/union_map.h \
-	include/isl/union_set.h \
-	include/isl/vec.h \
-	include/isl/version.h \
-	include/isl/vertices.h
-
-EXTRA_DIST = \
-	isl_config_post.h \
-	basis_reduction_templ.c \
-	isl_list_templ.c \
-	isl_list_templ.h \
-	isl_multi_templ.c \
-	isl_multi_templ.h \
-	print_templ.c \
-	isl_pw_templ.c \
-	isl_union_templ.c \
-	isl.py \
-	doc/chicago.bst \
-	doc/chicago.sty \
-	doc/implementation.tex \
-	doc/isl.bib \
-	doc/mypod2latex \
-	doc/manual.tex \
-	doc/user.pod \
-	test_inputs
-
-dist-hook:
-	echo @GIT_HEAD_VERSION@ > $(distdir)/GIT_HEAD_ID
-	(cd doc; make manual.pdf)
-	cp doc/manual.pdf $(distdir)/doc/
-
-pkgconfigdir=$(pkgconfig_libdir)
-pkgconfig_DATA = $(pkgconfig_libfile)
-
-gitversion.h: @GIT_HEAD@
-	$(AM_V_GEN)echo '#define GIT_HEAD_ID "'@GIT_HEAD_VERSION@'"' > $@
-
-install-data-local: $(srcdir)/isl.py
-	@libisl=`sed -ne "/^library_names=/{s/.*='//;s/'$$//;s/ .*//;p}" \
-		 $(builddir)/libisl.la`; \
-	case $$libisl in \
-	'') echo Cannot find isl library name. GDB bindings not installed.;; \
-	*) echo $(INSTALL_DATA) $(srcdir)/isl.py \
-		$(DESTDIR)$(libdir)/$$libisl-gdb.py; \
-	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"; \
-	$(INSTALL_DATA) $(srcdir)/isl.py $(DESTDIR)$(libdir)/$$libisl-gdb.py; esac
diff --git a/cloog-0.17.0/isl/Makefile.in b/cloog-0.17.0/isl/Makefile.in
deleted file mode 100644
index 0a62eee..0000000
--- a/cloog-0.17.0/isl/Makefile.in
+++ /dev/null
@@ -1,2227 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-
-
-
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-noinst_PROGRAMS = isl_test$(EXEEXT) isl_polyhedron_sample$(EXEEXT) \
-	isl_pip$(EXEEXT) isl_polyhedron_minimize$(EXEEXT) \
-	isl_polytope_scan$(EXEEXT) \
-	isl_polyhedron_detect_equalities$(EXEEXT) isl_cat$(EXEEXT) \
-	isl_closure$(EXEEXT) isl_bound$(EXEEXT)
-TESTS = isl_test$(EXEEXT) pip_test.sh bound_test.sh
-subdir = .
-DIST_COMMON = $(am__configure_deps) $(pkginclude_HEADERS) \
-	$(srcdir)/Makefile.am $(srcdir)/Makefile.in \
-	$(srcdir)/bound_test.sh.in $(srcdir)/isl_config.h.in \
-	$(srcdir)/pip_test.sh.in $(top_srcdir)/configure \
-	$(top_srcdir)/include/isl/config.h.in AUTHORS ChangeLog \
-	config.guess config.sub depcomp install-sh ltmain.sh missing
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_c___attribute__.m4 \
-	$(top_srcdir)/m4/ax_cc_maxopt.m4 \
-	$(top_srcdir)/m4/ax_check_compiler_flags.m4 \
-	$(top_srcdir)/m4/ax_compiler_vendor.m4 \
-	$(top_srcdir)/m4/ax_create_pkgconfig_info.m4 \
-	$(top_srcdir)/m4/ax_create_stdint_h.m4 \
-	$(top_srcdir)/m4/ax_detect_git_head.m4 \
-	$(top_srcdir)/m4/ax_gcc_archflag.m4 \
-	$(top_srcdir)/m4/ax_gcc_warn_unused_result.m4 \
-	$(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \
-	$(top_srcdir)/m4/ax_set_warning_flags.m4 \
-	$(top_srcdir)/m4/ax_submodule.m4 $(top_srcdir)/m4/libtool.m4 \
-	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno config.status.lineno
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = isl_config.h $(top_builddir)/include/isl/config.h
-CONFIG_CLEAN_FILES = bound_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 \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" \
-	"$(DESTDIR)$(pkgincludedir)" "$(DESTDIR)$(pkgincludedir)"
-LTLIBRARIES = $(lib_LTLIBRARIES)
-libisl_la_DEPENDENCIES =
-am__libisl_la_SOURCES_DIST = isl_lp_no_piplib.c isl_map_no_piplib.c \
-	isl_sample_no_piplib.c isl_lp_piplib.c isl_map_piplib.c \
-	isl_sample_piplib.c isl_sample_piplib.h isl_piplib.c \
-	mp_get_memory_functions.c isl_aff.c isl_aff_private.h \
-	isl_affine_hull.c isl_arg.c isl_band.c isl_band_private.h \
-	isl_basis_reduction.h basis_reduction_tab.c isl_bernstein.c \
-	isl_bernstein.h isl_blk.c isl_bound.c isl_bound.h \
-	isl_coalesce.c isl_constraint.c isl_constraint_private.h \
-	isl_convex_hull.c isl_ctx.c isl_ctx_private.h isl_dim.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_flow.c isl_fold.c isl_gmp.c isl_hash.c \
-	isl_hmap_map_basic_set.c isl_hmap_map_basic_set.h isl_ilp.c \
-	isl_input.c isl_list.c isl_list_private.h \
-	isl_local_space_private.h isl_local_space.c isl_lp.c \
-	isl_lp_piplib.h isl_map.c isl_map_simplify.c \
-	isl_map_subtract.c isl_map_private.h isl_map_piplib.h \
-	isl_mat.c isl_mat_private.h isl_morph.c isl_morph.h isl_id.c \
-	isl_id_private.h isl_obj.c isl_options.c isl_options_private.h \
-	isl_output.c isl_qsort.c isl_qsort.h isl_piplib.h \
-	isl_point_private.h isl_point.c isl_polynomial_private.h \
-	isl_polynomial.c isl_printer_private.h isl_printer.c print.c \
-	isl_range.c isl_range.h isl_reordering.c isl_reordering.h \
-	isl_sample.h isl_sample.c isl_scan.c isl_scan.h isl_schedule.c \
-	isl_schedule_private.h isl_space.c isl_space_private.h \
-	isl_stream.c isl_stream_private.h isl_seq.c isl_tab.c \
-	isl_tab.h isl_tab_pip.c isl_transitive_closure.c \
-	isl_union_map.c isl_union_map_private.h isl_vec.c \
-	isl_version.c isl_vertices_private.h isl_vertices.c
-@HAVE_PIPLIB_FALSE@am__objects_1 = libisl_la-isl_lp_no_piplib.lo \
-@HAVE_PIPLIB_FALSE@	libisl_la-isl_map_no_piplib.lo \
-@HAVE_PIPLIB_FALSE@	libisl_la-isl_sample_no_piplib.lo
-@HAVE_PIPLIB_TRUE@am__objects_1 = libisl_la-isl_lp_piplib.lo \
-@HAVE_PIPLIB_TRUE@	libisl_la-isl_map_piplib.lo \
-@HAVE_PIPLIB_TRUE@	libisl_la-isl_sample_piplib.lo \
-@HAVE_PIPLIB_TRUE@	libisl_la-isl_piplib.lo
-@NEED_GET_MEMORY_FUNCTIONS_TRUE@am__objects_2 = libisl_la-mp_get_memory_functions.lo
-am_libisl_la_OBJECTS = $(am__objects_1) $(am__objects_2) \
-	libisl_la-isl_aff.lo libisl_la-isl_affine_hull.lo \
-	libisl_la-isl_arg.lo libisl_la-isl_band.lo \
-	libisl_la-basis_reduction_tab.lo libisl_la-isl_bernstein.lo \
-	libisl_la-isl_blk.lo libisl_la-isl_bound.lo \
-	libisl_la-isl_coalesce.lo libisl_la-isl_constraint.lo \
-	libisl_la-isl_convex_hull.lo libisl_la-isl_ctx.lo \
-	libisl_la-isl_dim.lo libisl_la-isl_dim_map.lo \
-	libisl_la-isl_equalities.lo libisl_la-isl_factorization.lo \
-	libisl_la-isl_farkas.lo libisl_la-isl_flow.lo \
-	libisl_la-isl_fold.lo libisl_la-isl_gmp.lo \
-	libisl_la-isl_hash.lo libisl_la-isl_hmap_map_basic_set.lo \
-	libisl_la-isl_ilp.lo libisl_la-isl_input.lo \
-	libisl_la-isl_list.lo libisl_la-isl_local_space.lo \
-	libisl_la-isl_lp.lo libisl_la-isl_map.lo \
-	libisl_la-isl_map_simplify.lo libisl_la-isl_map_subtract.lo \
-	libisl_la-isl_mat.lo libisl_la-isl_morph.lo \
-	libisl_la-isl_id.lo libisl_la-isl_obj.lo \
-	libisl_la-isl_options.lo libisl_la-isl_output.lo \
-	libisl_la-isl_qsort.lo libisl_la-isl_point.lo \
-	libisl_la-isl_polynomial.lo libisl_la-isl_printer.lo \
-	libisl_la-print.lo libisl_la-isl_range.lo \
-	libisl_la-isl_reordering.lo libisl_la-isl_sample.lo \
-	libisl_la-isl_scan.lo libisl_la-isl_schedule.lo \
-	libisl_la-isl_space.lo libisl_la-isl_stream.lo \
-	libisl_la-isl_seq.lo libisl_la-isl_tab.lo \
-	libisl_la-isl_tab_pip.lo libisl_la-isl_transitive_closure.lo \
-	libisl_la-isl_union_map.lo libisl_la-isl_vec.lo \
-	libisl_la-isl_version.lo libisl_la-isl_vertices.lo
-libisl_la_OBJECTS = $(am_libisl_la_OBJECTS)
-AM_V_lt = $(am__v_lt_$(V))
-am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
-am__v_lt_0 = --silent
-libisl_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(libisl_la_LDFLAGS) $(LDFLAGS) -o $@
-PROGRAMS = $(noinst_PROGRAMS)
-am_isl_bound_OBJECTS = isl_bound-bound.$(OBJEXT)
-isl_bound_OBJECTS = $(am_isl_bound_OBJECTS)
-isl_bound_DEPENDENCIES = libisl.la
-isl_bound_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(isl_bound_LDFLAGS) $(LDFLAGS) -o $@
-am_isl_cat_OBJECTS = isl_cat-cat.$(OBJEXT)
-isl_cat_OBJECTS = $(am_isl_cat_OBJECTS)
-isl_cat_DEPENDENCIES = libisl.la
-am_isl_closure_OBJECTS = isl_closure-closure.$(OBJEXT)
-isl_closure_OBJECTS = $(am_isl_closure_OBJECTS)
-isl_closure_DEPENDENCIES = libisl.la
-am_isl_pip_OBJECTS = isl_pip-pip.$(OBJEXT)
-isl_pip_OBJECTS = $(am_isl_pip_OBJECTS)
-isl_pip_DEPENDENCIES = libisl.la
-isl_pip_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(isl_pip_LDFLAGS) $(LDFLAGS) -o $@
-am_isl_polyhedron_detect_equalities_OBJECTS = isl_polyhedron_detect_equalities-polyhedron_detect_equalities.$(OBJEXT)
-isl_polyhedron_detect_equalities_OBJECTS =  \
-	$(am_isl_polyhedron_detect_equalities_OBJECTS)
-isl_polyhedron_detect_equalities_DEPENDENCIES = libisl.la
-am_isl_polyhedron_minimize_OBJECTS =  \
-	isl_polyhedron_minimize-polyhedron_minimize.$(OBJEXT)
-isl_polyhedron_minimize_OBJECTS =  \
-	$(am_isl_polyhedron_minimize_OBJECTS)
-isl_polyhedron_minimize_DEPENDENCIES = libisl.la
-isl_polyhedron_minimize_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
-	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
-	$(AM_CFLAGS) $(CFLAGS) $(isl_polyhedron_minimize_LDFLAGS) \
-	$(LDFLAGS) -o $@
-am_isl_polyhedron_sample_OBJECTS =  \
-	isl_polyhedron_sample-polyhedron_sample.$(OBJEXT)
-isl_polyhedron_sample_OBJECTS = $(am_isl_polyhedron_sample_OBJECTS)
-isl_polyhedron_sample_DEPENDENCIES = libisl.la
-am_isl_polytope_scan_OBJECTS =  \
-	isl_polytope_scan-polytope_scan.$(OBJEXT)
-isl_polytope_scan_OBJECTS = $(am_isl_polytope_scan_OBJECTS)
-isl_polytope_scan_DEPENDENCIES = libisl.la
-isl_test_SOURCES = isl_test.c
-isl_test_OBJECTS = isl_test-isl_test.$(OBJEXT)
-isl_test_DEPENDENCIES = libisl.la
-isl_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(isl_test_LDFLAGS) $(LDFLAGS) -o $@
-DEFAULT_INCLUDES = 
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_$(V))
-am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
-am__v_CC_0 = @echo "  CC    " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
-CCLD = $(CC)
-LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_$(V))
-am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
-am__v_CCLD_0 = @echo "  CCLD  " $@;
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
-SOURCES = $(libisl_la_SOURCES) $(EXTRA_libisl_la_SOURCES) \
-	$(isl_bound_SOURCES) $(isl_cat_SOURCES) $(isl_closure_SOURCES) \
-	$(isl_pip_SOURCES) $(isl_polyhedron_detect_equalities_SOURCES) \
-	$(isl_polyhedron_minimize_SOURCES) \
-	$(isl_polyhedron_sample_SOURCES) $(isl_polytope_scan_SOURCES) \
-	isl_test.c
-DIST_SOURCES = $(am__libisl_la_SOURCES_DIST) \
-	$(EXTRA_libisl_la_SOURCES) $(isl_bound_SOURCES) \
-	$(isl_cat_SOURCES) $(isl_closure_SOURCES) $(isl_pip_SOURCES) \
-	$(isl_polyhedron_detect_equalities_SOURCES) \
-	$(isl_polyhedron_minimize_SOURCES) \
-	$(isl_polyhedron_sample_SOURCES) $(isl_polytope_scan_SOURCES) \
-	isl_test.c
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-dvi-recursive install-exec-recursive \
-	install-html-recursive install-info-recursive \
-	install-pdf-recursive install-ps-recursive install-recursive \
-	installcheck-recursive installdirs-recursive pdf-recursive \
-	ps-recursive uninstall-recursive
-DATA = $(pkgconfig_DATA)
-HEADERS = $(nodist_pkginclude_HEADERS) $(pkginclude_HEADERS)
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
-  distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
-	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
-	distdir dist dist-all distcheck
-ETAGS = etags
-CTAGS = ctags
-am__tty_colors = \
-red=; grn=; lgn=; blu=; std=
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-distdir = $(PACKAGE)-$(VERSION)
-top_distdir = $(distdir)
-am__remove_distdir = \
-  { test ! -d "$(distdir)" \
-    || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
-         && rm -fr "$(distdir)"; }; }
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-DIST_ARCHIVES = $(distdir).tar.gz
-GZIP_ENV = --best
-distuninstallcheck_listfiles = find . -type f -print
-distcleancheck_listfiles = find . -type f -print
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CLANG_CXXFLAGS = @CLANG_CXXFLAGS@
-CLANG_LDFLAGS = @CLANG_LDFLAGS@
-CLANG_LIBS = @CLANG_LIBS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GIT_HEAD = @GIT_HEAD@
-GIT_HEAD_ID = @GIT_HEAD_ID@
-GIT_HEAD_VERSION = @GIT_HEAD_VERSION@
-GMP_CPPFLAGS = @GMP_CPPFLAGS@
-GMP_LDFLAGS = @GMP_LDFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PDFLATEX = @PDFLATEX@
-PERL = @PERL@
-PIPLIB_CPPFLAGS = @PIPLIB_CPPFLAGS@
-PIPLIB_LDFLAGS = @PIPLIB_LDFLAGS@
-PIPLIB_LIBS = @PIPLIB_LIBS@
-POD2HTML = @POD2HTML@
-PRTDIAG = @PRTDIAG@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-WARNING_FLAGS = @WARNING_FLAGS@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-llvm_config_found = @llvm_config_found@
-localedir = @localedir@
-localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-pkgconfig_libdir = @pkgconfig_libdir@
-pkgconfig_libfile = @pkgconfig_libfile@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-versioninfo = @versioninfo@
-@HAVE_CLANG_TRUE@MAYBE_INTERFACE = interface
-SUBDIRS = . $(MAYBE_INTERFACE) doc
-DIST_SUBDIRS = $(MAYBE_INTERFACE) doc
-ACLOCAL_AMFLAGS = -I m4
-AUTOMAKE_OPTIONS = nostdinc
-lib_LTLIBRARIES = libisl.la
-@HAVE_PIPLIB_FALSE@ISL_PIPLIB = \
-@HAVE_PIPLIB_FALSE@	isl_lp_no_piplib.c \
-@HAVE_PIPLIB_FALSE@	isl_map_no_piplib.c \
-@HAVE_PIPLIB_FALSE@	isl_sample_no_piplib.c
-
-@HAVE_PIPLIB_TRUE@ISL_PIPLIB = \
-@HAVE_PIPLIB_TRUE@	isl_lp_piplib.c \
-@HAVE_PIPLIB_TRUE@	isl_map_piplib.c \
-@HAVE_PIPLIB_TRUE@	isl_sample_piplib.c \
-@HAVE_PIPLIB_TRUE@	isl_sample_piplib.h \
-@HAVE_PIPLIB_TRUE@	isl_piplib.c
-
-@NEED_GET_MEMORY_FUNCTIONS_TRUE@GET_MEMORY_FUNCTIONS = mp_get_memory_functions.c
-INCLUDES = -I. -I$(srcdir) -I$(srcdir)/include -Iinclude/ 
-AM_CFLAGS = @WARNING_FLAGS@
-libisl_la_SOURCES = \
-	$(ISL_PIPLIB) \
-	$(GET_MEMORY_FUNCTIONS) \
-	isl_aff.c \
-	isl_aff_private.h \
-	isl_affine_hull.c \
-	isl_arg.c \
-	isl_band.c \
-	isl_band_private.h \
-	isl_basis_reduction.h \
-	basis_reduction_tab.c \
-	isl_bernstein.c \
-	isl_bernstein.h \
-	isl_blk.c \
-	isl_bound.c \
-	isl_bound.h \
-	isl_coalesce.c \
-	isl_constraint.c \
-	isl_constraint_private.h \
-	isl_convex_hull.c \
-	isl_ctx.c \
-	isl_ctx_private.h \
-	isl_dim.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_flow.c \
-	isl_fold.c \
-	isl_gmp.c \
-	isl_hash.c \
-	isl_hmap_map_basic_set.c \
-	isl_hmap_map_basic_set.h \
-	isl_ilp.c \
-	isl_input.c \
-	isl_list.c \
-	isl_list_private.h \
-	isl_local_space_private.h \
-	isl_local_space.c \
-	isl_lp.c \
-	isl_lp_piplib.h \
-	isl_map.c \
-	isl_map_simplify.c \
-	isl_map_subtract.c \
-	isl_map_private.h \
-	isl_map_piplib.h \
-	isl_mat.c \
-	isl_mat_private.h \
-	isl_morph.c \
-	isl_morph.h \
-	isl_id.c \
-	isl_id_private.h \
-	isl_obj.c \
-	isl_options.c \
-	isl_options_private.h \
-	isl_output.c \
-	isl_qsort.c \
-	isl_qsort.h \
-	isl_piplib.h \
-	isl_point_private.h \
-	isl_point.c \
-	isl_polynomial_private.h \
-	isl_polynomial.c \
-	isl_printer_private.h \
-	isl_printer.c \
-	print.c \
-	isl_range.c \
-	isl_range.h \
-	isl_reordering.c \
-	isl_reordering.h \
-	isl_sample.h \
-	isl_sample.c \
-	isl_scan.c \
-	isl_scan.h \
-	isl_schedule.c \
-	isl_schedule_private.h \
-	isl_space.c \
-	isl_space_private.h \
-	isl_stream.c \
-	isl_stream_private.h \
-	isl_seq.c \
-	isl_tab.c \
-	isl_tab.h \
-	isl_tab_pip.c \
-	isl_transitive_closure.c \
-	isl_union_map.c \
-	isl_union_map_private.h \
-	isl_vec.c \
-	isl_version.c \
-	isl_vertices_private.h \
-	isl_vertices.c
-
-EXTRA_libisl_la_SOURCES = \
-	isl_lp_piplib.c \
-	isl_lp_no_piplib.c \
-	isl_map_piplib.c \
-	isl_map_no_piplib.c \
-	isl_sample_no_piplib.c \
-	isl_sample_piplib.c \
-	isl_sample_piplib.h \
-	isl_piplib.c
-
-libisl_la_LIBADD = @PIPLIB_LIBS@ @GMP_LIBS@
-libisl_la_LDFLAGS = -version-info @versioninfo@ \
-	@PIPLIB_LDFLAGS@ @GMP_LDFLAGS@
-
-libisl_la_CPPFLAGS = $(INCLUDES) @PIPLIB_CPPFLAGS@ @GMP_CPPFLAGS@
-isl_test_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_test_LDFLAGS = @GMP_LDFLAGS@
-isl_test_LDADD = libisl.la @GMP_LIBS@
-isl_polyhedron_sample_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_polyhedron_sample_LDADD = libisl.la
-isl_polyhedron_sample_SOURCES = \
-	polyhedron_sample.c
-
-isl_pip_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_pip_LDFLAGS = @GMP_LDFLAGS@
-isl_pip_LDADD = libisl.la @GMP_LIBS@
-isl_pip_SOURCES = \
-	pip.c
-
-isl_bound_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_bound_LDFLAGS = @GMP_LDFLAGS@
-isl_bound_LDADD = libisl.la @GMP_LIBS@
-isl_bound_SOURCES = \
-	bound.c
-
-isl_polyhedron_minimize_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_polyhedron_minimize_LDFLAGS = @GMP_LDFLAGS@
-isl_polyhedron_minimize_LDADD = libisl.la @GMP_LIBS@
-isl_polyhedron_minimize_SOURCES = \
-	polyhedron_minimize.c
-
-isl_polytope_scan_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_polytope_scan_LDADD = libisl.la
-isl_polytope_scan_SOURCES = \
-	polytope_scan.c
-
-isl_polyhedron_detect_equalities_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_polyhedron_detect_equalities_LDADD = libisl.la
-isl_polyhedron_detect_equalities_SOURCES = \
-	polyhedron_detect_equalities.c
-
-isl_cat_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_cat_LDADD = libisl.la
-isl_cat_SOURCES = \
-	cat.c
-
-isl_closure_CPPFLAGS = $(INCLUDES) @GMP_CPPFLAGS@
-isl_closure_LDADD = libisl.la
-isl_closure_SOURCES = \
-	closure.c
-
-nodist_pkginclude_HEADERS = \
-	include/isl/config.h \
-	include/isl/stdint.h
-
-pkginclude_HEADERS = \
-	include/isl/aff.h \
-	include/isl/aff_type.h \
-	include/isl/arg.h \
-	include/isl/band.h \
-	include/isl/blk.h \
-	include/isl/constraint.h \
-	include/isl/ctx.h \
-	include/isl/dim.h \
-	include/isl/flow.h \
-	include/isl/id.h \
-	include/isl/ilp.h \
-	include/isl/int.h \
-	include/isl/hash.h \
-	include/isl/list.h \
-	include/isl/local_space.h \
-	include/isl/lp.h \
-	include/isl/mat.h \
-	include/isl/map.h \
-	include/isl/map_type.h \
-	include/isl/multi.h \
-	include/isl/obj.h \
-	include/isl/options.h \
-	include/isl/point.h \
-	include/isl/polynomial.h \
-	include/isl/polynomial_type.h \
-	include/isl/printer.h \
-	include/isl/schedule.h \
-	include/isl/seq.h \
-	include/isl/set.h \
-	include/isl/set_type.h \
-	include/isl/space.h \
-	include/isl/stream.h \
-	include/isl/union_map.h \
-	include/isl/union_set.h \
-	include/isl/vec.h \
-	include/isl/version.h \
-	include/isl/vertices.h
-
-EXTRA_DIST = \
-	isl_config_post.h \
-	basis_reduction_templ.c \
-	isl_list_templ.c \
-	isl_list_templ.h \
-	isl_multi_templ.c \
-	isl_multi_templ.h \
-	print_templ.c \
-	isl_pw_templ.c \
-	isl_union_templ.c \
-	isl.py \
-	doc/chicago.bst \
-	doc/chicago.sty \
-	doc/implementation.tex \
-	doc/isl.bib \
-	doc/mypod2latex \
-	doc/manual.tex \
-	doc/user.pod \
-	test_inputs
-
-pkgconfigdir = $(pkgconfig_libdir)
-pkgconfig_DATA = $(pkgconfig_libfile)
-all: isl_config.h
-	$(MAKE) $(AM_MAKEFLAGS) all-recursive
-
-.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
-am--refresh:
-	@:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
-	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    echo ' $(SHELL) ./config.status'; \
-	    $(SHELL) ./config.status;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	$(SHELL) ./config.status --recheck
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	$(am__cd) $(srcdir) && $(AUTOCONF)
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
-$(am__aclocal_m4_deps):
-
-isl_config.h: stamp-h1
-	@if test ! -f $@; then \
-	  rm -f stamp-h1; \
-	  $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
-	else :; fi
-
-stamp-h1: $(srcdir)/isl_config.h.in $(top_builddir)/config.status
-	@rm -f stamp-h1
-	cd $(top_builddir) && $(SHELL) ./config.status isl_config.h
-$(srcdir)/isl_config.h.in:  $(am__configure_deps) 
-	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
-	rm -f stamp-h1
-	touch $@
-
-include/isl/config.h: include/isl/stamp-h2
-	@if test ! -f $@; then \
-	  rm -f include/isl/stamp-h2; \
-	  $(MAKE) $(AM_MAKEFLAGS) include/isl/stamp-h2; \
-	else :; fi
-
-include/isl/stamp-h2: $(top_srcdir)/include/isl/config.h.in $(top_builddir)/config.status
-	@rm -f include/isl/stamp-h2
-	cd $(top_builddir) && $(SHELL) ./config.status include/isl/config.h
-
-distclean-hdr:
-	-rm -f isl_config.h stamp-h1 include/isl/config.h include/isl/stamp-h2
-bound_test.sh: $(top_builddir)/config.status $(srcdir)/bound_test.sh.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-pip_test.sh: $(top_builddir)/config.status $(srcdir)/pip_test.sh.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
-	}
-
-uninstall-libLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
-	done
-
-clean-libLTLIBRARIES:
-	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
-	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" != "$$p" || dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-libisl.la: $(libisl_la_OBJECTS) $(libisl_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(libisl_la_LINK) -rpath $(libdir) $(libisl_la_OBJECTS) $(libisl_la_LIBADD) $(LIBS)
-
-clean-noinstPROGRAMS:
-	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
-	echo " rm -f" $$list; \
-	rm -f $$list || exit $$?; \
-	test -n "$(EXEEXT)" || exit 0; \
-	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
-	echo " rm -f" $$list; \
-	rm -f $$list
-isl_bound$(EXEEXT): $(isl_bound_OBJECTS) $(isl_bound_DEPENDENCIES) 
-	@rm -f isl_bound$(EXEEXT)
-	$(AM_V_CCLD)$(isl_bound_LINK) $(isl_bound_OBJECTS) $(isl_bound_LDADD) $(LIBS)
-isl_cat$(EXEEXT): $(isl_cat_OBJECTS) $(isl_cat_DEPENDENCIES) 
-	@rm -f isl_cat$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(isl_cat_OBJECTS) $(isl_cat_LDADD) $(LIBS)
-isl_closure$(EXEEXT): $(isl_closure_OBJECTS) $(isl_closure_DEPENDENCIES) 
-	@rm -f isl_closure$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(isl_closure_OBJECTS) $(isl_closure_LDADD) $(LIBS)
-isl_pip$(EXEEXT): $(isl_pip_OBJECTS) $(isl_pip_DEPENDENCIES) 
-	@rm -f isl_pip$(EXEEXT)
-	$(AM_V_CCLD)$(isl_pip_LINK) $(isl_pip_OBJECTS) $(isl_pip_LDADD) $(LIBS)
-isl_polyhedron_detect_equalities$(EXEEXT): $(isl_polyhedron_detect_equalities_OBJECTS) $(isl_polyhedron_detect_equalities_DEPENDENCIES) 
-	@rm -f isl_polyhedron_detect_equalities$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(isl_polyhedron_detect_equalities_OBJECTS) $(isl_polyhedron_detect_equalities_LDADD) $(LIBS)
-isl_polyhedron_minimize$(EXEEXT): $(isl_polyhedron_minimize_OBJECTS) $(isl_polyhedron_minimize_DEPENDENCIES) 
-	@rm -f isl_polyhedron_minimize$(EXEEXT)
-	$(AM_V_CCLD)$(isl_polyhedron_minimize_LINK) $(isl_polyhedron_minimize_OBJECTS) $(isl_polyhedron_minimize_LDADD) $(LIBS)
-isl_polyhedron_sample$(EXEEXT): $(isl_polyhedron_sample_OBJECTS) $(isl_polyhedron_sample_DEPENDENCIES) 
-	@rm -f isl_polyhedron_sample$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(isl_polyhedron_sample_OBJECTS) $(isl_polyhedron_sample_LDADD) $(LIBS)
-isl_polytope_scan$(EXEEXT): $(isl_polytope_scan_OBJECTS) $(isl_polytope_scan_DEPENDENCIES) 
-	@rm -f isl_polytope_scan$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(isl_polytope_scan_OBJECTS) $(isl_polytope_scan_LDADD) $(LIBS)
-isl_test$(EXEEXT): $(isl_test_OBJECTS) $(isl_test_DEPENDENCIES) 
-	@rm -f isl_test$(EXEEXT)
-	$(AM_V_CCLD)$(isl_test_LINK) $(isl_test_OBJECTS) $(isl_test_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_bound-bound.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_cat-cat.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_closure-closure.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_pip-pip.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_polyhedron_detect_equalities-polyhedron_detect_equalities.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_polyhedron_minimize-polyhedron_minimize.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_polyhedron_sample-polyhedron_sample.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_polytope_scan-polytope_scan.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isl_test-isl_test.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-basis_reduction_tab.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_aff.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_affine_hull.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_arg.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_band.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_bernstein.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_blk.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_bound.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_coalesce.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_constraint.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_convex_hull.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_ctx.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_dim.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_dim_map.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_equalities.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_factorization.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_farkas.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_flow.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_fold.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_gmp.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_hash.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_hmap_map_basic_set.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_id.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_ilp.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_input.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_list.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_local_space.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_lp.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_lp_no_piplib.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_lp_piplib.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_map.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_map_no_piplib.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_map_piplib.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_map_simplify.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_map_subtract.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_mat.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_morph.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_obj.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_options.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_output.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_piplib.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_point.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_polynomial.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_printer.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_qsort.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_range.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_reordering.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_sample.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_sample_no_piplib.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_sample_piplib.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_scan.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_schedule.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_seq.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_space.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_stream.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_tab.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_tab_pip.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_transitive_closure.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_union_map.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_vec.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_version.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-isl_vertices.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-mp_get_memory_functions.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libisl_la-print.Plo@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c $<
-
-.c.obj:
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.c.lo:
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
-
-libisl_la-isl_lp_no_piplib.lo: isl_lp_no_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_lp_no_piplib.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_lp_no_piplib.Tpo -c -o libisl_la-isl_lp_no_piplib.lo `test -f 'isl_lp_no_piplib.c' || echo '$(srcdir)/'`isl_lp_no_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_lp_no_piplib.Tpo $(DEPDIR)/libisl_la-isl_lp_no_piplib.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_lp_no_piplib.c' object='libisl_la-isl_lp_no_piplib.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_lp_no_piplib.lo `test -f 'isl_lp_no_piplib.c' || echo '$(srcdir)/'`isl_lp_no_piplib.c
-
-libisl_la-isl_map_no_piplib.lo: isl_map_no_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_map_no_piplib.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_map_no_piplib.Tpo -c -o libisl_la-isl_map_no_piplib.lo `test -f 'isl_map_no_piplib.c' || echo '$(srcdir)/'`isl_map_no_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_map_no_piplib.Tpo $(DEPDIR)/libisl_la-isl_map_no_piplib.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_map_no_piplib.c' object='libisl_la-isl_map_no_piplib.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_map_no_piplib.lo `test -f 'isl_map_no_piplib.c' || echo '$(srcdir)/'`isl_map_no_piplib.c
-
-libisl_la-isl_sample_no_piplib.lo: isl_sample_no_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_sample_no_piplib.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_sample_no_piplib.Tpo -c -o libisl_la-isl_sample_no_piplib.lo `test -f 'isl_sample_no_piplib.c' || echo '$(srcdir)/'`isl_sample_no_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_sample_no_piplib.Tpo $(DEPDIR)/libisl_la-isl_sample_no_piplib.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_sample_no_piplib.c' object='libisl_la-isl_sample_no_piplib.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_sample_no_piplib.lo `test -f 'isl_sample_no_piplib.c' || echo '$(srcdir)/'`isl_sample_no_piplib.c
-
-libisl_la-isl_lp_piplib.lo: isl_lp_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_lp_piplib.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_lp_piplib.Tpo -c -o libisl_la-isl_lp_piplib.lo `test -f 'isl_lp_piplib.c' || echo '$(srcdir)/'`isl_lp_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_lp_piplib.Tpo $(DEPDIR)/libisl_la-isl_lp_piplib.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_lp_piplib.c' object='libisl_la-isl_lp_piplib.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_lp_piplib.lo `test -f 'isl_lp_piplib.c' || echo '$(srcdir)/'`isl_lp_piplib.c
-
-libisl_la-isl_map_piplib.lo: isl_map_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_map_piplib.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_map_piplib.Tpo -c -o libisl_la-isl_map_piplib.lo `test -f 'isl_map_piplib.c' || echo '$(srcdir)/'`isl_map_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_map_piplib.Tpo $(DEPDIR)/libisl_la-isl_map_piplib.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_map_piplib.c' object='libisl_la-isl_map_piplib.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_map_piplib.lo `test -f 'isl_map_piplib.c' || echo '$(srcdir)/'`isl_map_piplib.c
-
-libisl_la-isl_sample_piplib.lo: isl_sample_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_sample_piplib.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_sample_piplib.Tpo -c -o libisl_la-isl_sample_piplib.lo `test -f 'isl_sample_piplib.c' || echo '$(srcdir)/'`isl_sample_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_sample_piplib.Tpo $(DEPDIR)/libisl_la-isl_sample_piplib.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_sample_piplib.c' object='libisl_la-isl_sample_piplib.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_sample_piplib.lo `test -f 'isl_sample_piplib.c' || echo '$(srcdir)/'`isl_sample_piplib.c
-
-libisl_la-isl_piplib.lo: isl_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_piplib.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_piplib.Tpo -c -o libisl_la-isl_piplib.lo `test -f 'isl_piplib.c' || echo '$(srcdir)/'`isl_piplib.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_piplib.Tpo $(DEPDIR)/libisl_la-isl_piplib.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_piplib.c' object='libisl_la-isl_piplib.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_piplib.lo `test -f 'isl_piplib.c' || echo '$(srcdir)/'`isl_piplib.c
-
-libisl_la-mp_get_memory_functions.lo: mp_get_memory_functions.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-mp_get_memory_functions.lo -MD -MP -MF $(DEPDIR)/libisl_la-mp_get_memory_functions.Tpo -c -o libisl_la-mp_get_memory_functions.lo `test -f 'mp_get_memory_functions.c' || echo '$(srcdir)/'`mp_get_memory_functions.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-mp_get_memory_functions.Tpo $(DEPDIR)/libisl_la-mp_get_memory_functions.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='mp_get_memory_functions.c' object='libisl_la-mp_get_memory_functions.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-mp_get_memory_functions.lo `test -f 'mp_get_memory_functions.c' || echo '$(srcdir)/'`mp_get_memory_functions.c
-
-libisl_la-isl_aff.lo: isl_aff.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_aff.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_aff.Tpo -c -o libisl_la-isl_aff.lo `test -f 'isl_aff.c' || echo '$(srcdir)/'`isl_aff.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_aff.Tpo $(DEPDIR)/libisl_la-isl_aff.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_aff.c' object='libisl_la-isl_aff.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_aff.lo `test -f 'isl_aff.c' || echo '$(srcdir)/'`isl_aff.c
-
-libisl_la-isl_affine_hull.lo: isl_affine_hull.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_affine_hull.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_affine_hull.Tpo -c -o libisl_la-isl_affine_hull.lo `test -f 'isl_affine_hull.c' || echo '$(srcdir)/'`isl_affine_hull.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_affine_hull.Tpo $(DEPDIR)/libisl_la-isl_affine_hull.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_affine_hull.c' object='libisl_la-isl_affine_hull.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_affine_hull.lo `test -f 'isl_affine_hull.c' || echo '$(srcdir)/'`isl_affine_hull.c
-
-libisl_la-isl_arg.lo: isl_arg.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_arg.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_arg.Tpo -c -o libisl_la-isl_arg.lo `test -f 'isl_arg.c' || echo '$(srcdir)/'`isl_arg.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_arg.Tpo $(DEPDIR)/libisl_la-isl_arg.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_arg.c' object='libisl_la-isl_arg.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_arg.lo `test -f 'isl_arg.c' || echo '$(srcdir)/'`isl_arg.c
-
-libisl_la-isl_band.lo: isl_band.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_band.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_band.Tpo -c -o libisl_la-isl_band.lo `test -f 'isl_band.c' || echo '$(srcdir)/'`isl_band.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_band.Tpo $(DEPDIR)/libisl_la-isl_band.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_band.c' object='libisl_la-isl_band.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_band.lo `test -f 'isl_band.c' || echo '$(srcdir)/'`isl_band.c
-
-libisl_la-basis_reduction_tab.lo: basis_reduction_tab.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-basis_reduction_tab.lo -MD -MP -MF $(DEPDIR)/libisl_la-basis_reduction_tab.Tpo -c -o libisl_la-basis_reduction_tab.lo `test -f 'basis_reduction_tab.c' || echo '$(srcdir)/'`basis_reduction_tab.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-basis_reduction_tab.Tpo $(DEPDIR)/libisl_la-basis_reduction_tab.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='basis_reduction_tab.c' object='libisl_la-basis_reduction_tab.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-basis_reduction_tab.lo `test -f 'basis_reduction_tab.c' || echo '$(srcdir)/'`basis_reduction_tab.c
-
-libisl_la-isl_bernstein.lo: isl_bernstein.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_bernstein.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_bernstein.Tpo -c -o libisl_la-isl_bernstein.lo `test -f 'isl_bernstein.c' || echo '$(srcdir)/'`isl_bernstein.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_bernstein.Tpo $(DEPDIR)/libisl_la-isl_bernstein.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_bernstein.c' object='libisl_la-isl_bernstein.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_bernstein.lo `test -f 'isl_bernstein.c' || echo '$(srcdir)/'`isl_bernstein.c
-
-libisl_la-isl_blk.lo: isl_blk.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_blk.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_blk.Tpo -c -o libisl_la-isl_blk.lo `test -f 'isl_blk.c' || echo '$(srcdir)/'`isl_blk.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_blk.Tpo $(DEPDIR)/libisl_la-isl_blk.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_blk.c' object='libisl_la-isl_blk.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_blk.lo `test -f 'isl_blk.c' || echo '$(srcdir)/'`isl_blk.c
-
-libisl_la-isl_bound.lo: isl_bound.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_bound.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_bound.Tpo -c -o libisl_la-isl_bound.lo `test -f 'isl_bound.c' || echo '$(srcdir)/'`isl_bound.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_bound.Tpo $(DEPDIR)/libisl_la-isl_bound.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_bound.c' object='libisl_la-isl_bound.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_bound.lo `test -f 'isl_bound.c' || echo '$(srcdir)/'`isl_bound.c
-
-libisl_la-isl_coalesce.lo: isl_coalesce.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_coalesce.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_coalesce.Tpo -c -o libisl_la-isl_coalesce.lo `test -f 'isl_coalesce.c' || echo '$(srcdir)/'`isl_coalesce.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_coalesce.Tpo $(DEPDIR)/libisl_la-isl_coalesce.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_coalesce.c' object='libisl_la-isl_coalesce.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_coalesce.lo `test -f 'isl_coalesce.c' || echo '$(srcdir)/'`isl_coalesce.c
-
-libisl_la-isl_constraint.lo: isl_constraint.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_constraint.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_constraint.Tpo -c -o libisl_la-isl_constraint.lo `test -f 'isl_constraint.c' || echo '$(srcdir)/'`isl_constraint.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_constraint.Tpo $(DEPDIR)/libisl_la-isl_constraint.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_constraint.c' object='libisl_la-isl_constraint.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_constraint.lo `test -f 'isl_constraint.c' || echo '$(srcdir)/'`isl_constraint.c
-
-libisl_la-isl_convex_hull.lo: isl_convex_hull.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_convex_hull.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_convex_hull.Tpo -c -o libisl_la-isl_convex_hull.lo `test -f 'isl_convex_hull.c' || echo '$(srcdir)/'`isl_convex_hull.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_convex_hull.Tpo $(DEPDIR)/libisl_la-isl_convex_hull.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_convex_hull.c' object='libisl_la-isl_convex_hull.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_convex_hull.lo `test -f 'isl_convex_hull.c' || echo '$(srcdir)/'`isl_convex_hull.c
-
-libisl_la-isl_ctx.lo: isl_ctx.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_ctx.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_ctx.Tpo -c -o libisl_la-isl_ctx.lo `test -f 'isl_ctx.c' || echo '$(srcdir)/'`isl_ctx.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_ctx.Tpo $(DEPDIR)/libisl_la-isl_ctx.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_ctx.c' object='libisl_la-isl_ctx.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_ctx.lo `test -f 'isl_ctx.c' || echo '$(srcdir)/'`isl_ctx.c
-
-libisl_la-isl_dim.lo: isl_dim.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_dim.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_dim.Tpo -c -o libisl_la-isl_dim.lo `test -f 'isl_dim.c' || echo '$(srcdir)/'`isl_dim.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_dim.Tpo $(DEPDIR)/libisl_la-isl_dim.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_dim.c' object='libisl_la-isl_dim.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_dim.lo `test -f 'isl_dim.c' || echo '$(srcdir)/'`isl_dim.c
-
-libisl_la-isl_dim_map.lo: isl_dim_map.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_dim_map.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_dim_map.Tpo -c -o libisl_la-isl_dim_map.lo `test -f 'isl_dim_map.c' || echo '$(srcdir)/'`isl_dim_map.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_dim_map.Tpo $(DEPDIR)/libisl_la-isl_dim_map.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_dim_map.c' object='libisl_la-isl_dim_map.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_dim_map.lo `test -f 'isl_dim_map.c' || echo '$(srcdir)/'`isl_dim_map.c
-
-libisl_la-isl_equalities.lo: isl_equalities.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_equalities.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_equalities.Tpo -c -o libisl_la-isl_equalities.lo `test -f 'isl_equalities.c' || echo '$(srcdir)/'`isl_equalities.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_equalities.Tpo $(DEPDIR)/libisl_la-isl_equalities.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_equalities.c' object='libisl_la-isl_equalities.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_equalities.lo `test -f 'isl_equalities.c' || echo '$(srcdir)/'`isl_equalities.c
-
-libisl_la-isl_factorization.lo: isl_factorization.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_factorization.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_factorization.Tpo -c -o libisl_la-isl_factorization.lo `test -f 'isl_factorization.c' || echo '$(srcdir)/'`isl_factorization.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_factorization.Tpo $(DEPDIR)/libisl_la-isl_factorization.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_factorization.c' object='libisl_la-isl_factorization.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_factorization.lo `test -f 'isl_factorization.c' || echo '$(srcdir)/'`isl_factorization.c
-
-libisl_la-isl_farkas.lo: isl_farkas.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_farkas.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_farkas.Tpo -c -o libisl_la-isl_farkas.lo `test -f 'isl_farkas.c' || echo '$(srcdir)/'`isl_farkas.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_farkas.Tpo $(DEPDIR)/libisl_la-isl_farkas.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_farkas.c' object='libisl_la-isl_farkas.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_farkas.lo `test -f 'isl_farkas.c' || echo '$(srcdir)/'`isl_farkas.c
-
-libisl_la-isl_flow.lo: isl_flow.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_flow.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_flow.Tpo -c -o libisl_la-isl_flow.lo `test -f 'isl_flow.c' || echo '$(srcdir)/'`isl_flow.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_flow.Tpo $(DEPDIR)/libisl_la-isl_flow.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_flow.c' object='libisl_la-isl_flow.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_flow.lo `test -f 'isl_flow.c' || echo '$(srcdir)/'`isl_flow.c
-
-libisl_la-isl_fold.lo: isl_fold.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_fold.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_fold.Tpo -c -o libisl_la-isl_fold.lo `test -f 'isl_fold.c' || echo '$(srcdir)/'`isl_fold.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_fold.Tpo $(DEPDIR)/libisl_la-isl_fold.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_fold.c' object='libisl_la-isl_fold.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_fold.lo `test -f 'isl_fold.c' || echo '$(srcdir)/'`isl_fold.c
-
-libisl_la-isl_gmp.lo: isl_gmp.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_gmp.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_gmp.Tpo -c -o libisl_la-isl_gmp.lo `test -f 'isl_gmp.c' || echo '$(srcdir)/'`isl_gmp.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_gmp.Tpo $(DEPDIR)/libisl_la-isl_gmp.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_gmp.c' object='libisl_la-isl_gmp.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_gmp.lo `test -f 'isl_gmp.c' || echo '$(srcdir)/'`isl_gmp.c
-
-libisl_la-isl_hash.lo: isl_hash.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_hash.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_hash.Tpo -c -o libisl_la-isl_hash.lo `test -f 'isl_hash.c' || echo '$(srcdir)/'`isl_hash.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_hash.Tpo $(DEPDIR)/libisl_la-isl_hash.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_hash.c' object='libisl_la-isl_hash.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_hash.lo `test -f 'isl_hash.c' || echo '$(srcdir)/'`isl_hash.c
-
-libisl_la-isl_hmap_map_basic_set.lo: isl_hmap_map_basic_set.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_hmap_map_basic_set.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_hmap_map_basic_set.Tpo -c -o libisl_la-isl_hmap_map_basic_set.lo `test -f 'isl_hmap_map_basic_set.c' || echo '$(srcdir)/'`isl_hmap_map_basic_set.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_hmap_map_basic_set.Tpo $(DEPDIR)/libisl_la-isl_hmap_map_basic_set.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_hmap_map_basic_set.c' object='libisl_la-isl_hmap_map_basic_set.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_hmap_map_basic_set.lo `test -f 'isl_hmap_map_basic_set.c' || echo '$(srcdir)/'`isl_hmap_map_basic_set.c
-
-libisl_la-isl_ilp.lo: isl_ilp.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_ilp.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_ilp.Tpo -c -o libisl_la-isl_ilp.lo `test -f 'isl_ilp.c' || echo '$(srcdir)/'`isl_ilp.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_ilp.Tpo $(DEPDIR)/libisl_la-isl_ilp.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_ilp.c' object='libisl_la-isl_ilp.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_ilp.lo `test -f 'isl_ilp.c' || echo '$(srcdir)/'`isl_ilp.c
-
-libisl_la-isl_input.lo: isl_input.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_input.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_input.Tpo -c -o libisl_la-isl_input.lo `test -f 'isl_input.c' || echo '$(srcdir)/'`isl_input.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_input.Tpo $(DEPDIR)/libisl_la-isl_input.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_input.c' object='libisl_la-isl_input.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_input.lo `test -f 'isl_input.c' || echo '$(srcdir)/'`isl_input.c
-
-libisl_la-isl_list.lo: isl_list.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_list.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_list.Tpo -c -o libisl_la-isl_list.lo `test -f 'isl_list.c' || echo '$(srcdir)/'`isl_list.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_list.Tpo $(DEPDIR)/libisl_la-isl_list.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_list.c' object='libisl_la-isl_list.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_list.lo `test -f 'isl_list.c' || echo '$(srcdir)/'`isl_list.c
-
-libisl_la-isl_local_space.lo: isl_local_space.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_local_space.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_local_space.Tpo -c -o libisl_la-isl_local_space.lo `test -f 'isl_local_space.c' || echo '$(srcdir)/'`isl_local_space.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_local_space.Tpo $(DEPDIR)/libisl_la-isl_local_space.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_local_space.c' object='libisl_la-isl_local_space.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_local_space.lo `test -f 'isl_local_space.c' || echo '$(srcdir)/'`isl_local_space.c
-
-libisl_la-isl_lp.lo: isl_lp.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_lp.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_lp.Tpo -c -o libisl_la-isl_lp.lo `test -f 'isl_lp.c' || echo '$(srcdir)/'`isl_lp.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_lp.Tpo $(DEPDIR)/libisl_la-isl_lp.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_lp.c' object='libisl_la-isl_lp.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_lp.lo `test -f 'isl_lp.c' || echo '$(srcdir)/'`isl_lp.c
-
-libisl_la-isl_map.lo: isl_map.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_map.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_map.Tpo -c -o libisl_la-isl_map.lo `test -f 'isl_map.c' || echo '$(srcdir)/'`isl_map.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_map.Tpo $(DEPDIR)/libisl_la-isl_map.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_map.c' object='libisl_la-isl_map.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_map.lo `test -f 'isl_map.c' || echo '$(srcdir)/'`isl_map.c
-
-libisl_la-isl_map_simplify.lo: isl_map_simplify.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_map_simplify.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_map_simplify.Tpo -c -o libisl_la-isl_map_simplify.lo `test -f 'isl_map_simplify.c' || echo '$(srcdir)/'`isl_map_simplify.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_map_simplify.Tpo $(DEPDIR)/libisl_la-isl_map_simplify.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_map_simplify.c' object='libisl_la-isl_map_simplify.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_map_simplify.lo `test -f 'isl_map_simplify.c' || echo '$(srcdir)/'`isl_map_simplify.c
-
-libisl_la-isl_map_subtract.lo: isl_map_subtract.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_map_subtract.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_map_subtract.Tpo -c -o libisl_la-isl_map_subtract.lo `test -f 'isl_map_subtract.c' || echo '$(srcdir)/'`isl_map_subtract.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_map_subtract.Tpo $(DEPDIR)/libisl_la-isl_map_subtract.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_map_subtract.c' object='libisl_la-isl_map_subtract.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_map_subtract.lo `test -f 'isl_map_subtract.c' || echo '$(srcdir)/'`isl_map_subtract.c
-
-libisl_la-isl_mat.lo: isl_mat.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_mat.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_mat.Tpo -c -o libisl_la-isl_mat.lo `test -f 'isl_mat.c' || echo '$(srcdir)/'`isl_mat.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_mat.Tpo $(DEPDIR)/libisl_la-isl_mat.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_mat.c' object='libisl_la-isl_mat.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_mat.lo `test -f 'isl_mat.c' || echo '$(srcdir)/'`isl_mat.c
-
-libisl_la-isl_morph.lo: isl_morph.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_morph.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_morph.Tpo -c -o libisl_la-isl_morph.lo `test -f 'isl_morph.c' || echo '$(srcdir)/'`isl_morph.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_morph.Tpo $(DEPDIR)/libisl_la-isl_morph.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_morph.c' object='libisl_la-isl_morph.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_morph.lo `test -f 'isl_morph.c' || echo '$(srcdir)/'`isl_morph.c
-
-libisl_la-isl_id.lo: isl_id.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_id.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_id.Tpo -c -o libisl_la-isl_id.lo `test -f 'isl_id.c' || echo '$(srcdir)/'`isl_id.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_id.Tpo $(DEPDIR)/libisl_la-isl_id.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_id.c' object='libisl_la-isl_id.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_id.lo `test -f 'isl_id.c' || echo '$(srcdir)/'`isl_id.c
-
-libisl_la-isl_obj.lo: isl_obj.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_obj.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_obj.Tpo -c -o libisl_la-isl_obj.lo `test -f 'isl_obj.c' || echo '$(srcdir)/'`isl_obj.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_obj.Tpo $(DEPDIR)/libisl_la-isl_obj.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_obj.c' object='libisl_la-isl_obj.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_obj.lo `test -f 'isl_obj.c' || echo '$(srcdir)/'`isl_obj.c
-
-libisl_la-isl_options.lo: isl_options.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_options.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_options.Tpo -c -o libisl_la-isl_options.lo `test -f 'isl_options.c' || echo '$(srcdir)/'`isl_options.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_options.Tpo $(DEPDIR)/libisl_la-isl_options.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_options.c' object='libisl_la-isl_options.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_options.lo `test -f 'isl_options.c' || echo '$(srcdir)/'`isl_options.c
-
-libisl_la-isl_output.lo: isl_output.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_output.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_output.Tpo -c -o libisl_la-isl_output.lo `test -f 'isl_output.c' || echo '$(srcdir)/'`isl_output.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_output.Tpo $(DEPDIR)/libisl_la-isl_output.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_output.c' object='libisl_la-isl_output.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_output.lo `test -f 'isl_output.c' || echo '$(srcdir)/'`isl_output.c
-
-libisl_la-isl_qsort.lo: isl_qsort.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_qsort.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_qsort.Tpo -c -o libisl_la-isl_qsort.lo `test -f 'isl_qsort.c' || echo '$(srcdir)/'`isl_qsort.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_qsort.Tpo $(DEPDIR)/libisl_la-isl_qsort.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_qsort.c' object='libisl_la-isl_qsort.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_qsort.lo `test -f 'isl_qsort.c' || echo '$(srcdir)/'`isl_qsort.c
-
-libisl_la-isl_point.lo: isl_point.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_point.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_point.Tpo -c -o libisl_la-isl_point.lo `test -f 'isl_point.c' || echo '$(srcdir)/'`isl_point.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_point.Tpo $(DEPDIR)/libisl_la-isl_point.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_point.c' object='libisl_la-isl_point.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_point.lo `test -f 'isl_point.c' || echo '$(srcdir)/'`isl_point.c
-
-libisl_la-isl_polynomial.lo: isl_polynomial.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_polynomial.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_polynomial.Tpo -c -o libisl_la-isl_polynomial.lo `test -f 'isl_polynomial.c' || echo '$(srcdir)/'`isl_polynomial.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_polynomial.Tpo $(DEPDIR)/libisl_la-isl_polynomial.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_polynomial.c' object='libisl_la-isl_polynomial.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_polynomial.lo `test -f 'isl_polynomial.c' || echo '$(srcdir)/'`isl_polynomial.c
-
-libisl_la-isl_printer.lo: isl_printer.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_printer.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_printer.Tpo -c -o libisl_la-isl_printer.lo `test -f 'isl_printer.c' || echo '$(srcdir)/'`isl_printer.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_printer.Tpo $(DEPDIR)/libisl_la-isl_printer.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_printer.c' object='libisl_la-isl_printer.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_printer.lo `test -f 'isl_printer.c' || echo '$(srcdir)/'`isl_printer.c
-
-libisl_la-print.lo: print.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-print.lo -MD -MP -MF $(DEPDIR)/libisl_la-print.Tpo -c -o libisl_la-print.lo `test -f 'print.c' || echo '$(srcdir)/'`print.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-print.Tpo $(DEPDIR)/libisl_la-print.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='print.c' object='libisl_la-print.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-print.lo `test -f 'print.c' || echo '$(srcdir)/'`print.c
-
-libisl_la-isl_range.lo: isl_range.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_range.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_range.Tpo -c -o libisl_la-isl_range.lo `test -f 'isl_range.c' || echo '$(srcdir)/'`isl_range.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_range.Tpo $(DEPDIR)/libisl_la-isl_range.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_range.c' object='libisl_la-isl_range.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_range.lo `test -f 'isl_range.c' || echo '$(srcdir)/'`isl_range.c
-
-libisl_la-isl_reordering.lo: isl_reordering.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_reordering.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_reordering.Tpo -c -o libisl_la-isl_reordering.lo `test -f 'isl_reordering.c' || echo '$(srcdir)/'`isl_reordering.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_reordering.Tpo $(DEPDIR)/libisl_la-isl_reordering.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_reordering.c' object='libisl_la-isl_reordering.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_reordering.lo `test -f 'isl_reordering.c' || echo '$(srcdir)/'`isl_reordering.c
-
-libisl_la-isl_sample.lo: isl_sample.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_sample.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_sample.Tpo -c -o libisl_la-isl_sample.lo `test -f 'isl_sample.c' || echo '$(srcdir)/'`isl_sample.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_sample.Tpo $(DEPDIR)/libisl_la-isl_sample.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_sample.c' object='libisl_la-isl_sample.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_sample.lo `test -f 'isl_sample.c' || echo '$(srcdir)/'`isl_sample.c
-
-libisl_la-isl_scan.lo: isl_scan.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_scan.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_scan.Tpo -c -o libisl_la-isl_scan.lo `test -f 'isl_scan.c' || echo '$(srcdir)/'`isl_scan.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_scan.Tpo $(DEPDIR)/libisl_la-isl_scan.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_scan.c' object='libisl_la-isl_scan.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_scan.lo `test -f 'isl_scan.c' || echo '$(srcdir)/'`isl_scan.c
-
-libisl_la-isl_schedule.lo: isl_schedule.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_schedule.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_schedule.Tpo -c -o libisl_la-isl_schedule.lo `test -f 'isl_schedule.c' || echo '$(srcdir)/'`isl_schedule.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_schedule.Tpo $(DEPDIR)/libisl_la-isl_schedule.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_schedule.c' object='libisl_la-isl_schedule.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_schedule.lo `test -f 'isl_schedule.c' || echo '$(srcdir)/'`isl_schedule.c
-
-libisl_la-isl_space.lo: isl_space.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_space.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_space.Tpo -c -o libisl_la-isl_space.lo `test -f 'isl_space.c' || echo '$(srcdir)/'`isl_space.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_space.Tpo $(DEPDIR)/libisl_la-isl_space.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_space.c' object='libisl_la-isl_space.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_space.lo `test -f 'isl_space.c' || echo '$(srcdir)/'`isl_space.c
-
-libisl_la-isl_stream.lo: isl_stream.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_stream.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_stream.Tpo -c -o libisl_la-isl_stream.lo `test -f 'isl_stream.c' || echo '$(srcdir)/'`isl_stream.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_stream.Tpo $(DEPDIR)/libisl_la-isl_stream.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_stream.c' object='libisl_la-isl_stream.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_stream.lo `test -f 'isl_stream.c' || echo '$(srcdir)/'`isl_stream.c
-
-libisl_la-isl_seq.lo: isl_seq.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_seq.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_seq.Tpo -c -o libisl_la-isl_seq.lo `test -f 'isl_seq.c' || echo '$(srcdir)/'`isl_seq.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_seq.Tpo $(DEPDIR)/libisl_la-isl_seq.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_seq.c' object='libisl_la-isl_seq.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_seq.lo `test -f 'isl_seq.c' || echo '$(srcdir)/'`isl_seq.c
-
-libisl_la-isl_tab.lo: isl_tab.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_tab.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_tab.Tpo -c -o libisl_la-isl_tab.lo `test -f 'isl_tab.c' || echo '$(srcdir)/'`isl_tab.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_tab.Tpo $(DEPDIR)/libisl_la-isl_tab.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_tab.c' object='libisl_la-isl_tab.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_tab.lo `test -f 'isl_tab.c' || echo '$(srcdir)/'`isl_tab.c
-
-libisl_la-isl_tab_pip.lo: isl_tab_pip.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_tab_pip.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_tab_pip.Tpo -c -o libisl_la-isl_tab_pip.lo `test -f 'isl_tab_pip.c' || echo '$(srcdir)/'`isl_tab_pip.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_tab_pip.Tpo $(DEPDIR)/libisl_la-isl_tab_pip.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_tab_pip.c' object='libisl_la-isl_tab_pip.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_tab_pip.lo `test -f 'isl_tab_pip.c' || echo '$(srcdir)/'`isl_tab_pip.c
-
-libisl_la-isl_transitive_closure.lo: isl_transitive_closure.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_transitive_closure.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_transitive_closure.Tpo -c -o libisl_la-isl_transitive_closure.lo `test -f 'isl_transitive_closure.c' || echo '$(srcdir)/'`isl_transitive_closure.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_transitive_closure.Tpo $(DEPDIR)/libisl_la-isl_transitive_closure.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_transitive_closure.c' object='libisl_la-isl_transitive_closure.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_transitive_closure.lo `test -f 'isl_transitive_closure.c' || echo '$(srcdir)/'`isl_transitive_closure.c
-
-libisl_la-isl_union_map.lo: isl_union_map.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_union_map.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_union_map.Tpo -c -o libisl_la-isl_union_map.lo `test -f 'isl_union_map.c' || echo '$(srcdir)/'`isl_union_map.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_union_map.Tpo $(DEPDIR)/libisl_la-isl_union_map.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_union_map.c' object='libisl_la-isl_union_map.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_union_map.lo `test -f 'isl_union_map.c' || echo '$(srcdir)/'`isl_union_map.c
-
-libisl_la-isl_vec.lo: isl_vec.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_vec.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_vec.Tpo -c -o libisl_la-isl_vec.lo `test -f 'isl_vec.c' || echo '$(srcdir)/'`isl_vec.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_vec.Tpo $(DEPDIR)/libisl_la-isl_vec.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_vec.c' object='libisl_la-isl_vec.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_vec.lo `test -f 'isl_vec.c' || echo '$(srcdir)/'`isl_vec.c
-
-libisl_la-isl_version.lo: isl_version.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_version.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_version.Tpo -c -o libisl_la-isl_version.lo `test -f 'isl_version.c' || echo '$(srcdir)/'`isl_version.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_version.Tpo $(DEPDIR)/libisl_la-isl_version.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_version.c' object='libisl_la-isl_version.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_version.lo `test -f 'isl_version.c' || echo '$(srcdir)/'`isl_version.c
-
-libisl_la-isl_vertices.lo: isl_vertices.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libisl_la-isl_vertices.lo -MD -MP -MF $(DEPDIR)/libisl_la-isl_vertices.Tpo -c -o libisl_la-isl_vertices.lo `test -f 'isl_vertices.c' || echo '$(srcdir)/'`isl_vertices.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libisl_la-isl_vertices.Tpo $(DEPDIR)/libisl_la-isl_vertices.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_vertices.c' object='libisl_la-isl_vertices.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libisl_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libisl_la-isl_vertices.lo `test -f 'isl_vertices.c' || echo '$(srcdir)/'`isl_vertices.c
-
-isl_bound-bound.o: bound.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_bound_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_bound-bound.o -MD -MP -MF $(DEPDIR)/isl_bound-bound.Tpo -c -o isl_bound-bound.o `test -f 'bound.c' || echo '$(srcdir)/'`bound.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_bound-bound.Tpo $(DEPDIR)/isl_bound-bound.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='bound.c' object='isl_bound-bound.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_bound_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_bound-bound.o `test -f 'bound.c' || echo '$(srcdir)/'`bound.c
-
-isl_bound-bound.obj: bound.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_bound_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_bound-bound.obj -MD -MP -MF $(DEPDIR)/isl_bound-bound.Tpo -c -o isl_bound-bound.obj `if test -f 'bound.c'; then $(CYGPATH_W) 'bound.c'; else $(CYGPATH_W) '$(srcdir)/bound.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_bound-bound.Tpo $(DEPDIR)/isl_bound-bound.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='bound.c' object='isl_bound-bound.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_bound_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_bound-bound.obj `if test -f 'bound.c'; then $(CYGPATH_W) 'bound.c'; else $(CYGPATH_W) '$(srcdir)/bound.c'; fi`
-
-isl_cat-cat.o: cat.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_cat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_cat-cat.o -MD -MP -MF $(DEPDIR)/isl_cat-cat.Tpo -c -o isl_cat-cat.o `test -f 'cat.c' || echo '$(srcdir)/'`cat.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_cat-cat.Tpo $(DEPDIR)/isl_cat-cat.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='cat.c' object='isl_cat-cat.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_cat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_cat-cat.o `test -f 'cat.c' || echo '$(srcdir)/'`cat.c
-
-isl_cat-cat.obj: cat.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_cat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_cat-cat.obj -MD -MP -MF $(DEPDIR)/isl_cat-cat.Tpo -c -o isl_cat-cat.obj `if test -f 'cat.c'; then $(CYGPATH_W) 'cat.c'; else $(CYGPATH_W) '$(srcdir)/cat.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_cat-cat.Tpo $(DEPDIR)/isl_cat-cat.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='cat.c' object='isl_cat-cat.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_cat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_cat-cat.obj `if test -f 'cat.c'; then $(CYGPATH_W) 'cat.c'; else $(CYGPATH_W) '$(srcdir)/cat.c'; fi`
-
-isl_closure-closure.o: closure.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_closure_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_closure-closure.o -MD -MP -MF $(DEPDIR)/isl_closure-closure.Tpo -c -o isl_closure-closure.o `test -f 'closure.c' || echo '$(srcdir)/'`closure.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_closure-closure.Tpo $(DEPDIR)/isl_closure-closure.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='closure.c' object='isl_closure-closure.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_closure_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_closure-closure.o `test -f 'closure.c' || echo '$(srcdir)/'`closure.c
-
-isl_closure-closure.obj: closure.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_closure_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_closure-closure.obj -MD -MP -MF $(DEPDIR)/isl_closure-closure.Tpo -c -o isl_closure-closure.obj `if test -f 'closure.c'; then $(CYGPATH_W) 'closure.c'; else $(CYGPATH_W) '$(srcdir)/closure.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_closure-closure.Tpo $(DEPDIR)/isl_closure-closure.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='closure.c' object='isl_closure-closure.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_closure_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_closure-closure.obj `if test -f 'closure.c'; then $(CYGPATH_W) 'closure.c'; else $(CYGPATH_W) '$(srcdir)/closure.c'; fi`
-
-isl_pip-pip.o: pip.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_pip_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_pip-pip.o -MD -MP -MF $(DEPDIR)/isl_pip-pip.Tpo -c -o isl_pip-pip.o `test -f 'pip.c' || echo '$(srcdir)/'`pip.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_pip-pip.Tpo $(DEPDIR)/isl_pip-pip.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='pip.c' object='isl_pip-pip.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_pip_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_pip-pip.o `test -f 'pip.c' || echo '$(srcdir)/'`pip.c
-
-isl_pip-pip.obj: pip.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_pip_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_pip-pip.obj -MD -MP -MF $(DEPDIR)/isl_pip-pip.Tpo -c -o isl_pip-pip.obj `if test -f 'pip.c'; then $(CYGPATH_W) 'pip.c'; else $(CYGPATH_W) '$(srcdir)/pip.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_pip-pip.Tpo $(DEPDIR)/isl_pip-pip.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='pip.c' object='isl_pip-pip.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_pip_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_pip-pip.obj `if test -f 'pip.c'; then $(CYGPATH_W) 'pip.c'; else $(CYGPATH_W) '$(srcdir)/pip.c'; fi`
-
-isl_polyhedron_detect_equalities-polyhedron_detect_equalities.o: polyhedron_detect_equalities.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_detect_equalities_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_polyhedron_detect_equalities-polyhedron_detect_equalities.o -MD -MP -MF $(DEPDIR)/isl_polyhedron_detect_equalities-polyhedron_detect_equalities.Tpo -c -o isl_polyhedron_detect_equalities-polyhedron_detect_equalities.o `test -f 'polyhedron_detect_equalities.c' || echo '$(srcdir)/'`polyhedron_detect_equalities.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_polyhedron_detect_equalities-polyhedron_detect_equalities.Tpo $(DEPDIR)/isl_polyhedron_detect_equalities-polyhedron_detect_equalities.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='polyhedron_detect_equalities.c' object='isl_polyhedron_detect_equalities-polyhedron_detect_equalities.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_detect_equalities_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_polyhedron_detect_equalities-polyhedron_detect_equalities.o `test -f 'polyhedron_detect_equalities.c' || echo '$(srcdir)/'`polyhedron_detect_equalities.c
-
-isl_polyhedron_detect_equalities-polyhedron_detect_equalities.obj: polyhedron_detect_equalities.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_detect_equalities_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_polyhedron_detect_equalities-polyhedron_detect_equalities.obj -MD -MP -MF $(DEPDIR)/isl_polyhedron_detect_equalities-polyhedron_detect_equalities.Tpo -c -o isl_polyhedron_detect_equalities-polyhedron_detect_equalities.obj `if test -f 'polyhedron_detect_equalities.c'; then $(CYGPATH_W) 'polyhedron_detect_equalities.c'; else $(CYGPATH_W) '$(srcdir)/polyhedron_detect_equalities.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_polyhedron_detect_equalities-polyhedron_detect_equalities.Tpo $(DEPDIR)/isl_polyhedron_detect_equalities-polyhedron_detect_equalities.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='polyhedron_detect_equalities.c' object='isl_polyhedron_detect_equalities-polyhedron_detect_equalities.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_detect_equalities_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_polyhedron_detect_equalities-polyhedron_detect_equalities.obj `if test -f 'polyhedron_detect_equalities.c'; then $(CYGPATH_W) 'polyhedron_detect_equalities.c'; else $(CYGPATH_W) '$(srcdir)/polyhedron_detect_equalities.c'; fi`
-
-isl_polyhedron_minimize-polyhedron_minimize.o: polyhedron_minimize.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_minimize_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_polyhedron_minimize-polyhedron_minimize.o -MD -MP -MF $(DEPDIR)/isl_polyhedron_minimize-polyhedron_minimize.Tpo -c -o isl_polyhedron_minimize-polyhedron_minimize.o `test -f 'polyhedron_minimize.c' || echo '$(srcdir)/'`polyhedron_minimize.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_polyhedron_minimize-polyhedron_minimize.Tpo $(DEPDIR)/isl_polyhedron_minimize-polyhedron_minimize.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='polyhedron_minimize.c' object='isl_polyhedron_minimize-polyhedron_minimize.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_minimize_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_polyhedron_minimize-polyhedron_minimize.o `test -f 'polyhedron_minimize.c' || echo '$(srcdir)/'`polyhedron_minimize.c
-
-isl_polyhedron_minimize-polyhedron_minimize.obj: polyhedron_minimize.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_minimize_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_polyhedron_minimize-polyhedron_minimize.obj -MD -MP -MF $(DEPDIR)/isl_polyhedron_minimize-polyhedron_minimize.Tpo -c -o isl_polyhedron_minimize-polyhedron_minimize.obj `if test -f 'polyhedron_minimize.c'; then $(CYGPATH_W) 'polyhedron_minimize.c'; else $(CYGPATH_W) '$(srcdir)/polyhedron_minimize.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_polyhedron_minimize-polyhedron_minimize.Tpo $(DEPDIR)/isl_polyhedron_minimize-polyhedron_minimize.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='polyhedron_minimize.c' object='isl_polyhedron_minimize-polyhedron_minimize.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_minimize_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_polyhedron_minimize-polyhedron_minimize.obj `if test -f 'polyhedron_minimize.c'; then $(CYGPATH_W) 'polyhedron_minimize.c'; else $(CYGPATH_W) '$(srcdir)/polyhedron_minimize.c'; fi`
-
-isl_polyhedron_sample-polyhedron_sample.o: polyhedron_sample.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_sample_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_polyhedron_sample-polyhedron_sample.o -MD -MP -MF $(DEPDIR)/isl_polyhedron_sample-polyhedron_sample.Tpo -c -o isl_polyhedron_sample-polyhedron_sample.o `test -f 'polyhedron_sample.c' || echo '$(srcdir)/'`polyhedron_sample.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_polyhedron_sample-polyhedron_sample.Tpo $(DEPDIR)/isl_polyhedron_sample-polyhedron_sample.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='polyhedron_sample.c' object='isl_polyhedron_sample-polyhedron_sample.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_sample_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_polyhedron_sample-polyhedron_sample.o `test -f 'polyhedron_sample.c' || echo '$(srcdir)/'`polyhedron_sample.c
-
-isl_polyhedron_sample-polyhedron_sample.obj: polyhedron_sample.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_sample_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_polyhedron_sample-polyhedron_sample.obj -MD -MP -MF $(DEPDIR)/isl_polyhedron_sample-polyhedron_sample.Tpo -c -o isl_polyhedron_sample-polyhedron_sample.obj `if test -f 'polyhedron_sample.c'; then $(CYGPATH_W) 'polyhedron_sample.c'; else $(CYGPATH_W) '$(srcdir)/polyhedron_sample.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_polyhedron_sample-polyhedron_sample.Tpo $(DEPDIR)/isl_polyhedron_sample-polyhedron_sample.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='polyhedron_sample.c' object='isl_polyhedron_sample-polyhedron_sample.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polyhedron_sample_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_polyhedron_sample-polyhedron_sample.obj `if test -f 'polyhedron_sample.c'; then $(CYGPATH_W) 'polyhedron_sample.c'; else $(CYGPATH_W) '$(srcdir)/polyhedron_sample.c'; fi`
-
-isl_polytope_scan-polytope_scan.o: polytope_scan.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polytope_scan_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_polytope_scan-polytope_scan.o -MD -MP -MF $(DEPDIR)/isl_polytope_scan-polytope_scan.Tpo -c -o isl_polytope_scan-polytope_scan.o `test -f 'polytope_scan.c' || echo '$(srcdir)/'`polytope_scan.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_polytope_scan-polytope_scan.Tpo $(DEPDIR)/isl_polytope_scan-polytope_scan.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='polytope_scan.c' object='isl_polytope_scan-polytope_scan.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polytope_scan_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_polytope_scan-polytope_scan.o `test -f 'polytope_scan.c' || echo '$(srcdir)/'`polytope_scan.c
-
-isl_polytope_scan-polytope_scan.obj: polytope_scan.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polytope_scan_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_polytope_scan-polytope_scan.obj -MD -MP -MF $(DEPDIR)/isl_polytope_scan-polytope_scan.Tpo -c -o isl_polytope_scan-polytope_scan.obj `if test -f 'polytope_scan.c'; then $(CYGPATH_W) 'polytope_scan.c'; else $(CYGPATH_W) '$(srcdir)/polytope_scan.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_polytope_scan-polytope_scan.Tpo $(DEPDIR)/isl_polytope_scan-polytope_scan.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='polytope_scan.c' object='isl_polytope_scan-polytope_scan.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_polytope_scan_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_polytope_scan-polytope_scan.obj `if test -f 'polytope_scan.c'; then $(CYGPATH_W) 'polytope_scan.c'; else $(CYGPATH_W) '$(srcdir)/polytope_scan.c'; fi`
-
-isl_test-isl_test.o: isl_test.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_test-isl_test.o -MD -MP -MF $(DEPDIR)/isl_test-isl_test.Tpo -c -o isl_test-isl_test.o `test -f 'isl_test.c' || echo '$(srcdir)/'`isl_test.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_test-isl_test.Tpo $(DEPDIR)/isl_test-isl_test.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_test.c' object='isl_test-isl_test.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_test-isl_test.o `test -f 'isl_test.c' || echo '$(srcdir)/'`isl_test.c
-
-isl_test-isl_test.obj: isl_test.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT isl_test-isl_test.obj -MD -MP -MF $(DEPDIR)/isl_test-isl_test.Tpo -c -o isl_test-isl_test.obj `if test -f 'isl_test.c'; then $(CYGPATH_W) 'isl_test.c'; else $(CYGPATH_W) '$(srcdir)/isl_test.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/isl_test-isl_test.Tpo $(DEPDIR)/isl_test-isl_test.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='isl_test.c' object='isl_test-isl_test.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(isl_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o isl_test-isl_test.obj `if test -f 'isl_test.c'; then $(CYGPATH_W) 'isl_test.c'; else $(CYGPATH_W) '$(srcdir)/isl_test.c'; fi`
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool config.lt
-install-pkgconfigDATA: $(pkgconfig_DATA)
-	@$(NORMAL_INSTALL)
-	test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)"
-	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \
-	done
-
-uninstall-pkgconfigDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files
-install-nodist_pkgincludeHEADERS: $(nodist_pkginclude_HEADERS)
-	@$(NORMAL_INSTALL)
-	test -z "$(pkgincludedir)" || $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)"
-	@list='$(nodist_pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
-	done
-
-uninstall-nodist_pkgincludeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(nodist_pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(pkgincludedir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(pkgincludedir)" && rm -f $$files
-install-pkgincludeHEADERS: $(pkginclude_HEADERS)
-	@$(NORMAL_INSTALL)
-	test -z "$(pkgincludedir)" || $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)"
-	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
-	done
-
-uninstall-pkgincludeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(pkgincludedir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(pkgincludedir)" && rm -f $$files
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) isl_config.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS) isl_config.h.in $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES) isl_config.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS) isl_config.h.in $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-check-TESTS: $(TESTS)
-	@failed=0; all=0; xfail=0; xpass=0; skip=0; \
-	srcdir=$(srcdir); export srcdir; \
-	list=' $(TESTS) '; \
-	$(am__tty_colors); \
-	if test -n "$$list"; then \
-	  for tst in $$list; do \
-	    if test -f ./$$tst; then dir=./; \
-	    elif test -f $$tst; then dir=; \
-	    else dir="$(srcdir)/"; fi; \
-	    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
-	      all=`expr $$all + 1`; \
-	      case " $(XFAIL_TESTS) " in \
-	      *[\ \	]$$tst[\ \	]*) \
-		xpass=`expr $$xpass + 1`; \
-		failed=`expr $$failed + 1`; \
-		col=$$red; res=XPASS; \
-	      ;; \
-	      *) \
-		col=$$grn; res=PASS; \
-	      ;; \
-	      esac; \
-	    elif test $$? -ne 77; then \
-	      all=`expr $$all + 1`; \
-	      case " $(XFAIL_TESTS) " in \
-	      *[\ \	]$$tst[\ \	]*) \
-		xfail=`expr $$xfail + 1`; \
-		col=$$lgn; res=XFAIL; \
-	      ;; \
-	      *) \
-		failed=`expr $$failed + 1`; \
-		col=$$red; res=FAIL; \
-	      ;; \
-	      esac; \
-	    else \
-	      skip=`expr $$skip + 1`; \
-	      col=$$blu; res=SKIP; \
-	    fi; \
-	    echo "$${col}$$res$${std}: $$tst"; \
-	  done; \
-	  if test "$$all" -eq 1; then \
-	    tests="test"; \
-	    All=""; \
-	  else \
-	    tests="tests"; \
-	    All="All "; \
-	  fi; \
-	  if test "$$failed" -eq 0; then \
-	    if test "$$xfail" -eq 0; then \
-	      banner="$$All$$all $$tests passed"; \
-	    else \
-	      if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
-	      banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
-	    fi; \
-	  else \
-	    if test "$$xpass" -eq 0; then \
-	      banner="$$failed of $$all $$tests failed"; \
-	    else \
-	      if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
-	      banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
-	    fi; \
-	  fi; \
-	  dashes="$$banner"; \
-	  skipped=""; \
-	  if test "$$skip" -ne 0; then \
-	    if test "$$skip" -eq 1; then \
-	      skipped="($$skip test was not run)"; \
-	    else \
-	      skipped="($$skip tests were not run)"; \
-	    fi; \
-	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
-	      dashes="$$skipped"; \
-	  fi; \
-	  report=""; \
-	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
-	    report="Please report to $(PACKAGE_BUGREPORT)"; \
-	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
-	      dashes="$$report"; \
-	  fi; \
-	  dashes=`echo "$$dashes" | sed s/./=/g`; \
-	  if test "$$failed" -eq 0; then \
-	    echo "$$grn$$dashes"; \
-	  else \
-	    echo "$$red$$dashes"; \
-	  fi; \
-	  echo "$$banner"; \
-	  test -z "$$skipped" || echo "$$skipped"; \
-	  test -z "$$report" || echo "$$report"; \
-	  echo "$$dashes$$std"; \
-	  test "$$failed" -eq 0; \
-	else :; fi
-
-distdir: $(DISTFILES)
-	$(am__remove_distdir)
-	test -d "$(distdir)" || mkdir "$(distdir)"
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test -d "$(distdir)/$$subdir" \
-	    || $(MKDIR_P) "$(distdir)/$$subdir" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-	    $(am__relativize); \
-	    new_distdir=$$reldir; \
-	    dir1=$$subdir; dir2="$(top_distdir)"; \
-	    $(am__relativize); \
-	    new_top_distdir=$$reldir; \
-	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-	    ($(am__cd) $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$new_top_distdir" \
-	        distdir="$$new_distdir" \
-		am__remove_distdir=: \
-		am__skip_length_check=: \
-		am__skip_mode_fix=: \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-	$(MAKE) $(AM_MAKEFLAGS) \
-	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
-	  dist-hook
-	-test -n "$(am__skip_mode_fix)" \
-	|| find "$(distdir)" -type d ! -perm -755 \
-		-exec chmod u+rwx,go+rx {} \; -o \
-	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
-	|| chmod -R a+r "$(distdir)"
-dist-gzip: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__remove_distdir)
-
-dist-bzip2: distdir
-	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
-	$(am__remove_distdir)
-
-dist-lzma: distdir
-	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
-	$(am__remove_distdir)
-
-dist-xz: distdir
-	tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
-	$(am__remove_distdir)
-
-dist-tarZ: distdir
-	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
-	$(am__remove_distdir)
-
-dist-shar: distdir
-	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
-	$(am__remove_distdir)
-
-dist-zip: distdir
-	-rm -f $(distdir).zip
-	zip -rq $(distdir).zip $(distdir)
-	$(am__remove_distdir)
-
-dist dist-all: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__remove_distdir)
-
-# This target untars the dist file and tries a VPATH configuration.  Then
-# it guarantees that the distribution is self-contained by making another
-# tarfile.
-distcheck: dist
-	case '$(DIST_ARCHIVES)' in \
-	*.tar.gz*) \
-	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
-	*.tar.bz2*) \
-	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
-	*.tar.lzma*) \
-	  lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
-	*.tar.xz*) \
-	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
-	*.tar.Z*) \
-	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
-	*.shar.gz*) \
-	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
-	*.zip*) \
-	  unzip $(distdir).zip ;;\
-	esac
-	chmod -R a-w $(distdir); chmod a+w $(distdir)
-	mkdir $(distdir)/_build
-	mkdir $(distdir)/_inst
-	chmod a-w $(distdir)
-	test -d $(distdir)/_build || exit 0; \
-	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
-	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
-	  && am__cwd=`pwd` \
-	  && $(am__cd) $(distdir)/_build \
-	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
-	    $(DISTCHECK_CONFIGURE_FLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
-	  && $(MAKE) $(AM_MAKEFLAGS) check \
-	  && $(MAKE) $(AM_MAKEFLAGS) install \
-	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
-	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
-	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
-	        distuninstallcheck \
-	  && chmod -R a-w "$$dc_install_base" \
-	  && ({ \
-	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
-	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
-	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
-	  && rm -rf "$$dc_destdir" \
-	  && $(MAKE) $(AM_MAKEFLAGS) dist \
-	  && rm -rf $(DIST_ARCHIVES) \
-	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
-	  && cd "$$am__cwd" \
-	  || exit 1
-	$(am__remove_distdir)
-	@(echo "$(distdir) archives ready for distribution: "; \
-	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
-	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
-distuninstallcheck:
-	@$(am__cd) '$(distuninstallcheck_dir)' \
-	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
-	   || { echo "ERROR: files left after uninstall:" ; \
-	        if test -n "$(DESTDIR)"; then \
-	          echo "  (check DESTDIR support)"; \
-	        fi ; \
-	        $(distuninstallcheck_listfiles) ; \
-	        exit 1; } >&2
-distcleancheck: distclean
-	@if test '$(srcdir)' = . ; then \
-	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
-	  exit 1 ; \
-	fi
-	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
-	  || { echo "ERROR: files left in build directory after distclean:" ; \
-	       $(distcleancheck_listfiles) ; \
-	       exit 1; } >&2
-check-am: all-am
-	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
-check: check-recursive
-all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) $(HEADERS) \
-		isl_config.h
-installdirs: installdirs-recursive
-installdirs-am:
-	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(pkgincludedir)" "$(DESTDIR)$(pkgincludedir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
-	clean-noinstPROGRAMS mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-hdr distclean-libtool distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am: install-data-local install-nodist_pkgincludeHEADERS \
-	install-pkgconfigDATA install-pkgincludeHEADERS
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am: install-libLTLIBRARIES
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf $(top_srcdir)/autom4te.cache
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-libLTLIBRARIES \
-	uninstall-nodist_pkgincludeHEADERS uninstall-pkgconfigDATA \
-	uninstall-pkgincludeHEADERS
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check-am \
-	ctags-recursive install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-	all all-am am--refresh check check-TESTS check-am clean \
-	clean-generic clean-libLTLIBRARIES clean-libtool \
-	clean-noinstPROGRAMS ctags ctags-recursive dist dist-all \
-	dist-bzip2 dist-gzip dist-hook dist-lzma dist-shar dist-tarZ \
-	dist-xz dist-zip distcheck distclean distclean-compile \
-	distclean-generic distclean-hdr distclean-libtool \
-	distclean-tags distcleancheck distdir distuninstallcheck dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-data-local install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am \
-	install-libLTLIBRARIES install-man \
-	install-nodist_pkgincludeHEADERS install-pdf install-pdf-am \
-	install-pkgconfigDATA install-pkgincludeHEADERS install-ps \
-	install-ps-am install-strip installcheck installcheck-am \
-	installdirs installdirs-am maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags tags-recursive uninstall uninstall-am \
-	uninstall-libLTLIBRARIES uninstall-nodist_pkgincludeHEADERS \
-	uninstall-pkgconfigDATA uninstall-pkgincludeHEADERS
-
-
-dist-hook:
-	echo @GIT_HEAD_VERSION@ > $(distdir)/GIT_HEAD_ID
-	(cd doc; make manual.pdf)
-	cp doc/manual.pdf $(distdir)/doc/
-
-gitversion.h: @GIT_HEAD@
-	$(AM_V_GEN)echo '#define GIT_HEAD_ID "'@GIT_HEAD_VERSION@'"' > $@
-
-install-data-local: $(srcdir)/isl.py
-	@libisl=`sed -ne "/^library_names=/{s/.*='//;s/'$$//;s/ .*//;p}" \
-		 $(builddir)/libisl.la`; \
-	case $$libisl in \
-	'') echo Cannot find isl library name. GDB bindings not installed.;; \
-	*) echo $(INSTALL_DATA) $(srcdir)/isl.py \
-		$(DESTDIR)$(libdir)/$$libisl-gdb.py; \
-	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"; \
-	$(INSTALL_DATA) $(srcdir)/isl.py $(DESTDIR)$(libdir)/$$libisl-gdb.py; esac
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/cloog-0.17.0/isl/aclocal.m4 b/cloog-0.17.0/isl/aclocal.m4
deleted file mode 100644
index 0e08e3f..0000000
--- a/cloog-0.17.0/isl/aclocal.m4
+++ /dev/null
@@ -1,995 +0,0 @@
-# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-m4_ifndef([AC_AUTOCONF_VERSION],
-  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.67],,
-[m4_warning([this file was generated for autoconf 2.67.
-You have another version of autoconf.  It may work, but is not guaranteed to.
-If you have problems, you may need to regenerate the build system entirely.
-To do so, use the procedure documented by the package, typically `autoreconf'.])])
-
-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_AUTOMAKE_VERSION(VERSION)
-# ----------------------------
-# Automake X.Y traces this macro to ensure aclocal.m4 has been
-# generated from the m4 files accompanying Automake X.Y.
-# (This private macro should not be called outside this file.)
-AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.11'
-dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
-dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.11.1], [],
-      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
-])
-
-# _AM_AUTOCONF_VERSION(VERSION)
-# -----------------------------
-# aclocal traces this macro to find the Autoconf version.
-# This is a private macro too.  Using m4_define simplifies
-# the logic in aclocal, which can simply ignore this definition.
-m4_define([_AM_AUTOCONF_VERSION], [])
-
-# AM_SET_CURRENT_AUTOMAKE_VERSION
-# -------------------------------
-# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
-# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
-AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.1])dnl
-m4_ifndef([AC_AUTOCONF_VERSION],
-  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
-
-# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
-# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
-#
-# Of course, Automake must honor this variable whenever it calls a
-# tool from the auxiliary directory.  The problem is that $srcdir (and
-# therefore $ac_aux_dir as well) can be either absolute or relative,
-# depending on how configure is run.  This is pretty annoying, since
-# it makes $ac_aux_dir quite unusable in subdirectories: in the top
-# source directory, any form will work fine, but in subdirectories a
-# relative path needs to be adjusted first.
-#
-# $ac_aux_dir/missing
-#    fails when called from a subdirectory if $ac_aux_dir is relative
-# $top_srcdir/$ac_aux_dir/missing
-#    fails if $ac_aux_dir is absolute,
-#    fails when called from a subdirectory in a VPATH build with
-#          a relative $ac_aux_dir
-#
-# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
-# are both prefixed by $srcdir.  In an in-source build this is usually
-# harmless because $srcdir is `.', but things will broke when you
-# start a VPATH build or use an absolute $srcdir.
-#
-# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
-# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
-#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
-# and then we would define $MISSING as
-#   MISSING="\${SHELL} $am_aux_dir/missing"
-# This will work as long as MISSING is not called from configure, because
-# unfortunately $(top_srcdir) has no meaning in configure.
-# However there are other variables, like CC, which are often used in
-# configure, and could therefore not use this "fixed" $ac_aux_dir.
-#
-# Another solution, used here, is to always expand $ac_aux_dir to an
-# absolute PATH.  The drawback is that using absolute paths prevent a
-# configured tree to be moved without reconfiguration.
-
-AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-])
-
-# AM_CONDITIONAL                                            -*- Autoconf -*-
-
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 9
-
-# AM_CONDITIONAL(NAME, SHELL-CONDITION)
-# -------------------------------------
-# Define a conditional.
-AC_DEFUN([AM_CONDITIONAL],
-[AC_PREREQ(2.52)dnl
- ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
-	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
-AC_SUBST([$1_TRUE])dnl
-AC_SUBST([$1_FALSE])dnl
-_AM_SUBST_NOTMAKE([$1_TRUE])dnl
-_AM_SUBST_NOTMAKE([$1_FALSE])dnl
-m4_define([_AM_COND_VALUE_$1], [$2])dnl
-if $2; then
-  $1_TRUE=
-  $1_FALSE='#'
-else
-  $1_TRUE='#'
-  $1_FALSE=
-fi
-AC_CONFIG_COMMANDS_PRE(
-[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
-  AC_MSG_ERROR([[conditional "$1" was never defined.
-Usually this means the macro was only invoked conditionally.]])
-fi])])
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 10
-
-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
-# written in clear, in which case automake, when reading aclocal.m4,
-# will think it sees a *use*, and therefore will trigger all it's
-# C support machinery.  Also note that it means that autoscan, seeing
-# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
-
-
-# _AM_DEPENDENCIES(NAME)
-# ----------------------
-# See how the compiler implements dependency checking.
-# NAME is "CC", "CXX", "GCJ", or "OBJC".
-# We try a few techniques and use that to set a single cache variable.
-#
-# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
-# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
-# dependency, and given that the user is not expected to run this macro,
-# just rely on AC_PROG_CC.
-AC_DEFUN([_AM_DEPENDENCIES],
-[AC_REQUIRE([AM_SET_DEPDIR])dnl
-AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
-AC_REQUIRE([AM_MAKE_INCLUDE])dnl
-AC_REQUIRE([AM_DEP_TRACK])dnl
-
-ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
-       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
-       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
-       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
-       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
-                   [depcc="$$1"   am_compiler_list=])
-
-AC_CACHE_CHECK([dependency style of $depcc],
-               [am_cv_$1_dependencies_compiler_type],
-[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_$1_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
-  fi
-  am__universal=false
-  m4_case([$1], [CC],
-    [case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac],
-    [CXX],
-    [case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac])
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_$1_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_$1_dependencies_compiler_type=none
-fi
-])
-AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
-AM_CONDITIONAL([am__fastdep$1], [
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
-])
-
-
-# AM_SET_DEPDIR
-# -------------
-# Choose a directory name for dependency files.
-# This macro is AC_REQUIREd in _AM_DEPENDENCIES
-AC_DEFUN([AM_SET_DEPDIR],
-[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
-])
-
-
-# AM_DEP_TRACK
-# ------------
-AC_DEFUN([AM_DEP_TRACK],
-[AC_ARG_ENABLE(dependency-tracking,
-[  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors])
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-fi
-AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
-AC_SUBST([AMDEPBACKSLASH])dnl
-_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
-])
-
-# Generate code to set up dependency tracking.              -*- Autoconf -*-
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-#serial 5
-
-# _AM_OUTPUT_DEPENDENCY_COMMANDS
-# ------------------------------
-AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
-[{
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
-  # are listed without --file.  Let's play safe and only enable the eval
-  # if we detect the quoting.
-  case $CONFIG_FILES in
-  *\'*) eval set x "$CONFIG_FILES" ;;
-  *)   set x $CONFIG_FILES ;;
-  esac
-  shift
-  for mf
-  do
-    # Strip MF so we end up with the name of the file.
-    mf=`echo "$mf" | sed -e 's/:.*$//'`
-    # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
-    # some people rename them; so instead we look at the file content.
-    # Grep'ing the first line is not enough: some people post-process
-    # each Makefile.in and add a new line on top of each file to say so.
-    # Grep'ing the whole file is not good either: AIX grep has a line
-    # limit of 2048, but all sed's we know have understand at least 4000.
-    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-      dirpart=`AS_DIRNAME("$mf")`
-    else
-      continue
-    fi
-    # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
-    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-    test -z "$DEPDIR" && continue
-    am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
-    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
-    # Find all dependency output files, they are included files with
-    # $(DEPDIR) in their names.  We invoke sed twice because it is the
-    # simplest approach to changing $(DEPDIR) to its actual value in the
-    # expansion.
-    for file in `sed -n "
-      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-      # Make sure the directory exists.
-      test -f "$dirpart/$file" && continue
-      fdir=`AS_DIRNAME(["$file"])`
-      AS_MKDIR_P([$dirpart/$fdir])
-      # echo "creating $dirpart/$file"
-      echo '# dummy' > "$dirpart/$file"
-    done
-  done
-}
-])# _AM_OUTPUT_DEPENDENCY_COMMANDS
-
-
-# AM_OUTPUT_DEPENDENCY_COMMANDS
-# -----------------------------
-# This macro should only be invoked once -- use via AC_REQUIRE.
-#
-# This code is only required when automatic dependency tracking
-# is enabled.  FIXME.  This creates each `.P' file that we will
-# need in order to bootstrap the dependency handling code.
-AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
-[AC_CONFIG_COMMANDS([depfiles],
-     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
-     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
-])
-
-# Do all the work for Automake.                             -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 16
-
-# This macro actually does too much.  Some checks are only needed if
-# your package does certain things.  But this isn't really a big deal.
-
-# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
-# AM_INIT_AUTOMAKE([OPTIONS])
-# -----------------------------------------------
-# The call with PACKAGE and VERSION arguments is the old style
-# call (pre autoconf-2.50), which is being phased out.  PACKAGE
-# and VERSION should now be passed to AC_INIT and removed from
-# the call to AM_INIT_AUTOMAKE.
-# We support both call styles for the transition.  After
-# the next Automake release, Autoconf can make the AC_INIT
-# arguments mandatory, and then we can depend on a new Autoconf
-# release and drop the old call support.
-AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.62])dnl
-dnl Autoconf wants to disallow AM_ names.  We explicitly allow
-dnl the ones we care about.
-m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
-AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
-AC_REQUIRE([AC_PROG_INSTALL])dnl
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-AC_SUBST([CYGPATH_W])
-
-# Define the identity of the package.
-dnl Distinguish between old-style and new-style calls.
-m4_ifval([$2],
-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
- AC_SUBST([PACKAGE], [$1])dnl
- AC_SUBST([VERSION], [$2])],
-[_AM_SET_OPTIONS([$1])dnl
-dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
-m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
-  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
-
-_AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
-
-# Some tools Automake needs.
-AC_REQUIRE([AM_SANITY_CHECK])dnl
-AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
-AM_MISSING_PROG(AUTOCONF, autoconf)
-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
-AM_MISSING_PROG(AUTOHEADER, autoheader)
-AM_MISSING_PROG(MAKEINFO, makeinfo)
-AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
-AC_REQUIRE([AM_PROG_MKDIR_P])dnl
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([AC_PROG_MAKE_SET])dnl
-AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
-	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
-			     [_AM_PROG_TAR([v7])])])
-_AM_IF_OPTION([no-dependencies],,
-[AC_PROVIDE_IFELSE([AC_PROG_CC],
-		  [_AM_DEPENDENCIES(CC)],
-		  [define([AC_PROG_CC],
-			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_CXX],
-		  [_AM_DEPENDENCIES(CXX)],
-		  [define([AC_PROG_CXX],
-			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_OBJC],
-		  [_AM_DEPENDENCIES(OBJC)],
-		  [define([AC_PROG_OBJC],
-			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
-])
-_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
-dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
-dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
-dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
-AC_CONFIG_COMMANDS_PRE(dnl
-[m4_provide_if([_AM_COMPILER_EXEEXT],
-  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
-])
-
-dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
-dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
-dnl mangled by Autoconf and run in a shell conditional statement.
-m4_define([_AC_COMPILER_EXEEXT],
-m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
-
-
-# When config.status generates a header, we must update the stamp-h file.
-# This file resides in the same directory as the config header
-# that is generated.  The stamp files are numbered to have different names.
-
-# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
-# loop where config.status creates the headers, so we can generate
-# our stamp files there.
-AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
-[# Compute $1's index in $config_headers.
-_am_arg=$1
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $_am_arg | $_am_arg:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
-
-# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_INSTALL_SH
-# ------------------
-# Define $install_sh.
-AC_DEFUN([AM_PROG_INSTALL_SH],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-if test x"${install_sh}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
-  *)
-    install_sh="\${SHELL} $am_aux_dir/install-sh"
-  esac
-fi
-AC_SUBST(install_sh)])
-
-# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# Check whether the underlying file-system supports filenames
-# with a leading dot.  For instance MS-DOS doesn't.
-AC_DEFUN([AM_SET_LEADING_DOT],
-[rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
-else
-  am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-AC_SUBST([am__leading_dot])])
-
-# Check to see how 'make' treats includes.	            -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 4
-
-# AM_MAKE_INCLUDE()
-# -----------------
-# Check to see how make treats includes.
-AC_DEFUN([AM_MAKE_INCLUDE],
-[am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-	@echo this is the am__doit target
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-AC_MSG_CHECKING([for style of include used by $am_make])
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
-  am__include=include
-  am__quote=
-  _am_result=GNU
-  ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   case `$am_make -s -f confmf 2> /dev/null` in #(
-   *the\ am__doit\ target*)
-     am__include=.include
-     am__quote="\""
-     _am_result=BSD
-     ;;
-   esac
-fi
-AC_SUBST([am__include])
-AC_SUBST([am__quote])
-AC_MSG_RESULT([$_am_result])
-rm -f confinc confmf
-])
-
-# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
-
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 6
-
-# AM_MISSING_PROG(NAME, PROGRAM)
-# ------------------------------
-AC_DEFUN([AM_MISSING_PROG],
-[AC_REQUIRE([AM_MISSING_HAS_RUN])
-$1=${$1-"${am_missing_run}$2"}
-AC_SUBST($1)])
-
-
-# AM_MISSING_HAS_RUN
-# ------------------
-# Define MISSING if not defined so far and test if it supports --run.
-# If it does, set am_missing_run to use it, otherwise, to nothing.
-AC_DEFUN([AM_MISSING_HAS_RUN],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([missing])dnl
-if test x"${MISSING+set}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
-  *)
-    MISSING="\${SHELL} $am_aux_dir/missing" ;;
-  esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  AC_MSG_WARN([`missing' script is too old or missing])
-fi
-])
-
-# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_MKDIR_P
-# ---------------
-# Check for `mkdir -p'.
-AC_DEFUN([AM_PROG_MKDIR_P],
-[AC_PREREQ([2.60])dnl
-AC_REQUIRE([AC_PROG_MKDIR_P])dnl
-dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
-dnl while keeping a definition of mkdir_p for backward compatibility.
-dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
-dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
-dnl Makefile.ins that do not define MKDIR_P, so we do our own
-dnl adjustment using top_builddir (which is defined more often than
-dnl MKDIR_P).
-AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
-case $mkdir_p in
-  [[\\/$]]* | ?:[[\\/]]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-])
-
-# Helper functions for option handling.                     -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 4
-
-# _AM_MANGLE_OPTION(NAME)
-# -----------------------
-AC_DEFUN([_AM_MANGLE_OPTION],
-[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
-
-# _AM_SET_OPTION(NAME)
-# ------------------------------
-# Set option NAME.  Presently that only means defining a flag for this option.
-AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
-
-# _AM_SET_OPTIONS(OPTIONS)
-# ----------------------------------
-# OPTIONS is a space-separated list of Automake options.
-AC_DEFUN([_AM_SET_OPTIONS],
-[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
-
-# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
-# -------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-AC_DEFUN([_AM_IF_OPTION],
-[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-
-# Check to make sure that the build environment is sane.    -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# AM_SANITY_CHECK
-# ---------------
-AC_DEFUN([AM_SANITY_CHECK],
-[AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name.  Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
-  *[[\\\"\#\$\&\'\`$am_lf]]*)
-    AC_MSG_ERROR([unsafe absolute working directory name]);;
-esac
-case $srcdir in
-  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
-    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$[*]" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$[*]" != "X $srcdir/configure conftest.file" \
-      && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
-alias in your environment])
-   fi
-
-   test "$[2]" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   AC_MSG_ERROR([newly created file is older than distributed files!
-Check your system clock])
-fi
-AC_MSG_RESULT(yes)])
-
-# Copyright (C) 2009  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 1
-
-# AM_SILENT_RULES([DEFAULT])
-# --------------------------
-# Enable less verbose build rules; with the default set to DEFAULT
-# (`yes' being less verbose, `no' or empty being verbose).
-AC_DEFUN([AM_SILENT_RULES],
-[AC_ARG_ENABLE([silent-rules],
-[  --enable-silent-rules          less verbose build output (undo: `make V=1')
-  --disable-silent-rules         verbose build output (undo: `make V=0')])
-case $enable_silent_rules in
-yes) AM_DEFAULT_VERBOSITY=0;;
-no)  AM_DEFAULT_VERBOSITY=1;;
-*)   AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
-esac
-AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
-AM_BACKSLASH='\'
-AC_SUBST([AM_BACKSLASH])dnl
-_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
-])
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_INSTALL_STRIP
-# ---------------------
-# One issue with vendor `install' (even GNU) is that you can't
-# specify the program used to strip binaries.  This is especially
-# annoying in cross-compiling environments, where the build's strip
-# is unlikely to handle the host's binaries.
-# Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in `make install-strip', and initialize
-# STRIPPROG with the value of the STRIP variable (set by the user).
-AC_DEFUN([AM_PROG_INSTALL_STRIP],
-[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
-if test "$cross_compiling" != no; then
-  AC_CHECK_TOOL([STRIP], [strip], :)
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-AC_SUBST([INSTALL_STRIP_PROGRAM])])
-
-# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# _AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
-# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
-# This macro is traced by Automake.
-AC_DEFUN([_AM_SUBST_NOTMAKE])
-
-# AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
-# Public sister of _AM_SUBST_NOTMAKE.
-AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
-
-# Check how to create a tarball.                            -*- Autoconf -*-
-
-# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# _AM_PROG_TAR(FORMAT)
-# --------------------
-# Check how to create a tarball in format FORMAT.
-# FORMAT should be one of `v7', `ustar', or `pax'.
-#
-# Substitute a variable $(am__tar) that is a command
-# writing to stdout a FORMAT-tarball containing the directory
-# $tardir.
-#     tardir=directory && $(am__tar) > result.tar
-#
-# Substitute a variable $(am__untar) that extract such
-# a tarball read from stdin.
-#     $(am__untar) < result.tar
-AC_DEFUN([_AM_PROG_TAR],
-[# Always define AMTAR for backward compatibility.
-AM_MISSING_PROG([AMTAR], [tar])
-m4_if([$1], [v7],
-     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
-     [m4_case([$1], [ustar],, [pax],,
-              [m4_fatal([Unknown tar format])])
-AC_MSG_CHECKING([how to create a $1 tar archive])
-# Loop over all known methods to create a tar archive until one works.
-_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
-_am_tools=${am_cv_prog_tar_$1-$_am_tools}
-# Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of `-'.
-for _am_tool in $_am_tools
-do
-  case $_am_tool in
-  gnutar)
-    for _am_tar in tar gnutar gtar;
-    do
-      AM_RUN_LOG([$_am_tar --version]) && break
-    done
-    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
-    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
-    am__untar="$_am_tar -xf -"
-    ;;
-  plaintar)
-    # Must skip GNU tar: if it does not support --format= it doesn't create
-    # ustar tarball either.
-    (tar --version) >/dev/null 2>&1 && continue
-    am__tar='tar chf - "$$tardir"'
-    am__tar_='tar chf - "$tardir"'
-    am__untar='tar xf -'
-    ;;
-  pax)
-    am__tar='pax -L -x $1 -w "$$tardir"'
-    am__tar_='pax -L -x $1 -w "$tardir"'
-    am__untar='pax -r'
-    ;;
-  cpio)
-    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
-    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
-    am__untar='cpio -i -H $1 -d'
-    ;;
-  none)
-    am__tar=false
-    am__tar_=false
-    am__untar=false
-    ;;
-  esac
-
-  # If the value was cached, stop now.  We just wanted to have am__tar
-  # and am__untar set.
-  test -n "${am_cv_prog_tar_$1}" && break
-
-  # tar/untar a dummy directory, and stop if the command works
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  echo GrepMe > conftest.dir/file
-  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
-  rm -rf conftest.dir
-  if test -s conftest.tar; then
-    AM_RUN_LOG([$am__untar <conftest.tar])
-    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
-  fi
-done
-rm -rf conftest.dir
-
-AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
-AC_MSG_RESULT([$am_cv_prog_tar_$1])])
-AC_SUBST([am__tar])
-AC_SUBST([am__untar])
-]) # _AM_PROG_TAR
-
-m4_include([m4/ax_c___attribute__.m4])
-m4_include([m4/ax_cc_maxopt.m4])
-m4_include([m4/ax_check_compiler_flags.m4])
-m4_include([m4/ax_compiler_vendor.m4])
-m4_include([m4/ax_create_pkgconfig_info.m4])
-m4_include([m4/ax_create_stdint_h.m4])
-m4_include([m4/ax_detect_git_head.m4])
-m4_include([m4/ax_gcc_archflag.m4])
-m4_include([m4/ax_gcc_warn_unused_result.m4])
-m4_include([m4/ax_gcc_x86_cpuid.m4])
-m4_include([m4/ax_set_warning_flags.m4])
-m4_include([m4/ax_submodule.m4])
-m4_include([m4/libtool.m4])
-m4_include([m4/ltoptions.m4])
-m4_include([m4/ltsugar.m4])
-m4_include([m4/ltversion.m4])
-m4_include([m4/lt~obsolete.m4])
diff --git a/cloog-0.17.0/isl/basis_reduction_tab.c b/cloog-0.17.0/isl/basis_reduction_tab.c
deleted file mode 100644
index af54569..0000000
--- a/cloog-0.17.0/isl/basis_reduction_tab.c
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <assert.h>
-#include <isl_map_private.h>
-#include <isl/seq.h>
-#include "isl_tab.h"
-
-struct tab_lp {
-	struct isl_ctx  *ctx;
-	struct isl_vec  *row;
-	struct isl_tab  *tab;
-	struct isl_tab_undo	**stack;
-	isl_int		*obj;
-	isl_int		 opt;
-	isl_int		 opt_denom;
-	isl_int		 tmp;
-	isl_int		 tmp2;
-	int	         neq;
-	unsigned	 dim;
-	/* number of constraints in initial product tableau */
-	int		 con_offset;
-	/* objective function has fixed or no integer value */
-	int		 is_fixed;
-};
-
-static struct tab_lp *init_lp(struct isl_tab *tab);
-static void set_lp_obj(struct tab_lp *lp, isl_int *row, int dim);
-static int solve_lp(struct tab_lp *lp);
-static void get_obj_val(struct tab_lp* lp, mpq_t *F);
-static void delete_lp(struct tab_lp *lp);
-static int add_lp_row(struct tab_lp *lp, isl_int *row, int dim);
-static void get_alpha(struct tab_lp* lp, int row, mpq_t *alpha);
-static int del_lp_row(struct tab_lp *lp) WARN_UNUSED;
-static int cut_lp_to_hyperplane(struct tab_lp *lp, isl_int *row);
-
-#define GBR_LP			    	    struct tab_lp
-#define GBR_type		    	    mpq_t
-#define GBR_init(v)		    	    mpq_init(v)
-#define GBR_clear(v)		    	    mpq_clear(v)
-#define GBR_set(a,b)			    mpq_set(a,b)
-#define GBR_set_ui(a,b)			    mpq_set_ui(a,b,1)
-#define GBR_mul(a,b,c)			    mpq_mul(a,b,c)
-#define GBR_lt(a,b)			    (mpq_cmp(a,b) < 0)
-#define GBR_is_zero(a)			    (mpq_sgn(a) == 0)
-#define GBR_floor(a,b)			    mpz_fdiv_q(a,mpq_numref(b),mpq_denref(b))
-#define GBR_ceil(a,b)			    mpz_cdiv_q(a,mpq_numref(b),mpq_denref(b))
-#define GBR_lp_init(P)		    	    init_lp(P)
-#define GBR_lp_set_obj(lp, obj, dim)	    set_lp_obj(lp, obj, dim)
-#define GBR_lp_solve(lp)		    solve_lp(lp)
-#define GBR_lp_get_obj_val(lp, F)	    get_obj_val(lp, F)
-#define GBR_lp_delete(lp)		    delete_lp(lp)
-#define GBR_lp_next_row(lp)		    lp->neq
-#define GBR_lp_add_row(lp, row, dim)	    add_lp_row(lp, row, dim)
-#define GBR_lp_get_alpha(lp, row, alpha)    get_alpha(lp, row, alpha)
-#define GBR_lp_del_row(lp)		    del_lp_row(lp)
-#define GBR_lp_is_fixed(lp)		    (lp)->is_fixed
-#define GBR_lp_cut(lp, obj)	    	    cut_lp_to_hyperplane(lp, obj)
-#include "basis_reduction_templ.c"
-
-/* Set up a tableau for the Cartesian product of bset with itself.
- * This could be optimized by first setting up a tableau for bset
- * and then performing the Cartesian product on the tableau.
- */
-static struct isl_tab *gbr_tab(struct isl_tab *tab, struct isl_vec *row)
-{
-	unsigned dim;
-	struct isl_tab *prod;
-
-	if (!tab || !row)
-		return NULL;
-
-	dim = tab->n_var;
-	prod = isl_tab_product(tab, tab);
-	if (isl_tab_extend_cons(prod, 3 * dim + 1) < 0) {
-		isl_tab_free(prod);
-		return NULL;
-	}
-	return prod;
-}
-
-static struct tab_lp *init_lp(struct isl_tab *tab)
-{
-	struct tab_lp *lp = NULL;
-
-	if (!tab)
-		return NULL;
-
-	lp = isl_calloc_type(tab->mat->ctx, struct tab_lp);
-	if (!lp)
-		return NULL;
-
-	isl_int_init(lp->opt);
-	isl_int_init(lp->opt_denom);
-	isl_int_init(lp->tmp);
-	isl_int_init(lp->tmp2);
-
-	lp->dim = tab->n_var;
-
-	lp->ctx = tab->mat->ctx;
-	isl_ctx_ref(lp->ctx);
-
-	lp->stack = isl_alloc_array(lp->ctx, struct isl_tab_undo *, lp->dim);
-
-	lp->row = isl_vec_alloc(lp->ctx, 1 + 2 * lp->dim);
-	if (!lp->row)
-		goto error;
-	lp->tab = gbr_tab(tab, lp->row);
-	if (!lp->tab)
-		goto error;
-	lp->con_offset = lp->tab->n_con;
-	lp->obj = NULL;
-	lp->neq = 0;
-
-	return lp;
-error:
-	delete_lp(lp);
-	return NULL;
-}
-
-static void set_lp_obj(struct tab_lp *lp, isl_int *row, int dim)
-{
-	lp->obj = row;
-}
-
-static int solve_lp(struct tab_lp *lp)
-{
-	enum isl_lp_result res;
-	unsigned flags = 0;
-
-	lp->is_fixed = 0;
-
-	isl_int_set_si(lp->row->el[0], 0);
-	isl_seq_cpy(lp->row->el + 1, lp->obj, lp->dim);
-	isl_seq_neg(lp->row->el + 1 + lp->dim, lp->obj, lp->dim);
-	if (lp->neq)
-		flags = ISL_TAB_SAVE_DUAL;
-	res = isl_tab_min(lp->tab, lp->row->el, lp->ctx->one,
-			  &lp->opt, &lp->opt_denom, flags);
-	isl_int_mul_ui(lp->opt_denom, lp->opt_denom, 2);
-	if (isl_int_abs_lt(lp->opt, lp->opt_denom)) {
-		struct isl_vec *sample = isl_tab_get_sample_value(lp->tab);
-		if (!sample)
-			return -1;
-		isl_seq_inner_product(lp->obj, sample->el + 1, lp->dim, &lp->tmp);
-		isl_seq_inner_product(lp->obj, sample->el + 1 + lp->dim, lp->dim, &lp->tmp2);
-		isl_int_cdiv_q(lp->tmp, lp->tmp, sample->el[0]);
-		isl_int_fdiv_q(lp->tmp2, lp->tmp2, sample->el[0]);
-		if (isl_int_ge(lp->tmp, lp->tmp2))
-			lp->is_fixed = 1;
-		isl_vec_free(sample);
-	}
-	isl_int_divexact_ui(lp->opt_denom, lp->opt_denom, 2);
-	if (res != isl_lp_ok)
-		return -1;
-	return 0;
-}
-
-/* The current objective function has a fixed (or no) integer value.
- * Cut the tableau to the hyperplane that fixes this value in
- * both halves of the tableau.
- * Return 1 if the resulting tableau is empty.
- */
-static int cut_lp_to_hyperplane(struct tab_lp *lp, isl_int *row)
-{
-	enum isl_lp_result res;
-
-	isl_int_set_si(lp->row->el[0], 0);
-	isl_seq_cpy(lp->row->el + 1, row, lp->dim);
-	isl_seq_clr(lp->row->el + 1 + lp->dim, lp->dim);
-	res = isl_tab_min(lp->tab, lp->row->el, lp->ctx->one,
-			  &lp->tmp, NULL, 0);
-	if (res != isl_lp_ok)
-		return -1;
-
-	isl_int_neg(lp->row->el[0], lp->tmp);
-	if (isl_tab_add_eq(lp->tab, lp->row->el) < 0)
-		return -1;
-
-	isl_seq_cpy(lp->row->el + 1 + lp->dim, row, lp->dim);
-	isl_seq_clr(lp->row->el + 1, lp->dim);
-	if (isl_tab_add_eq(lp->tab, lp->row->el) < 0)
-		return -1;
-
-	lp->con_offset += 2;
-
-	return lp->tab->empty;
-}
-
-static void get_obj_val(struct tab_lp* lp, mpq_t *F)
-{
-	isl_int_neg(mpq_numref(*F), lp->opt);
-	isl_int_set(mpq_denref(*F), lp->opt_denom);
-}
-
-static void delete_lp(struct tab_lp *lp)
-{
-	if (!lp)
-		return;
-
-	isl_int_clear(lp->opt);
-	isl_int_clear(lp->opt_denom);
-	isl_int_clear(lp->tmp);
-	isl_int_clear(lp->tmp2);
-	isl_vec_free(lp->row);
-	free(lp->stack);
-	isl_tab_free(lp->tab);
-	isl_ctx_deref(lp->ctx);
-	free(lp);
-}
-
-static int add_lp_row(struct tab_lp *lp, isl_int *row, int dim)
-{
-	lp->stack[lp->neq] = isl_tab_snap(lp->tab);
-
-	isl_int_set_si(lp->row->el[0], 0);
-	isl_seq_cpy(lp->row->el + 1, row, lp->dim);
-	isl_seq_neg(lp->row->el + 1 + lp->dim, row, lp->dim);
-
-	if (isl_tab_add_valid_eq(lp->tab, lp->row->el) < 0)
-		return -1;
-
-	return lp->neq++;
-}
-
-static void get_alpha(struct tab_lp* lp, int row, mpq_t *alpha)
-{
-	row += lp->con_offset;
-	isl_int_neg(mpq_numref(*alpha), lp->tab->dual->el[1 + row]);
-	isl_int_set(mpq_denref(*alpha), lp->tab->dual->el[0]);
-}
-
-static int del_lp_row(struct tab_lp *lp)
-{
-	lp->neq--;
-	return isl_tab_rollback(lp->tab, lp->stack[lp->neq]);
-}
diff --git a/cloog-0.17.0/isl/basis_reduction_templ.c b/cloog-0.17.0/isl/basis_reduction_templ.c
deleted file mode 100644
index f4c50ed..0000000
--- a/cloog-0.17.0/isl/basis_reduction_templ.c
+++ /dev/null
@@ -1,357 +0,0 @@
-/*
- * Copyright 2006-2007 Universiteit Leiden
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, Leiden Institute of Advanced Computer Science,
- * Universiteit Leiden, Niels Bohrweg 1, 2333 CA Leiden, The Netherlands
- * and K.U.Leuven, Departement Computerwetenschappen, Celestijnenlaan 200A,
- * B-3001 Leuven, Belgium
- */
-
-#include <stdlib.h>
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl_options_private.h>
-#include "isl_basis_reduction.h"
-
-static void save_alpha(GBR_LP *lp, int first, int n, GBR_type *alpha)
-{
-	int i;
-
-	for (i = 0; i < n; ++i)
-		GBR_lp_get_alpha(lp, first + i, &alpha[i]);
-}
-
-/* Compute a reduced basis for the set represented by the tableau "tab".
- * tab->basis, which must be initialized by the calling function to an affine
- * unimodular basis, is updated to reflect the reduced basis.
- * The first tab->n_zero rows of the basis (ignoring the constant row)
- * are assumed to correspond to equalities and are left untouched.
- * tab->n_zero is updated to reflect any additional equalities that
- * have been detected in the first rows of the new basis.
- * The final tab->n_unbounded rows of the basis are assumed to correspond
- * to unbounded directions and are also left untouched.
- * In particular this means that the remaining rows are assumed to
- * correspond to bounded directions.
- *
- * This function implements the algorithm described in
- * "An Implementation of the Generalized Basis Reduction Algorithm
- *  for Integer Programming" of Cook el al. to compute a reduced basis.
- * We use \epsilon = 1/4.
- *
- * If ctx->opt->gbr_only_first is set, the user is only interested
- * in the first direction.  In this case we stop the basis reduction when
- * the width in the first direction becomes smaller than 2.
- */
-struct isl_tab *isl_tab_compute_reduced_basis(struct isl_tab *tab)
-{
-	unsigned dim;
-	struct isl_ctx *ctx;
-	struct isl_mat *B;
-	int unbounded;
-	int i;
-	GBR_LP *lp = NULL;
-	GBR_type F_old, alpha, F_new;
-	int row;
-	isl_int tmp;
-	struct isl_vec *b_tmp;
-	GBR_type *F = NULL;
-	GBR_type *alpha_buffer[2] = { NULL, NULL };
-	GBR_type *alpha_saved;
-	GBR_type F_saved;
-	int use_saved = 0;
-	isl_int mu[2];
-	GBR_type mu_F[2];
-	GBR_type two;
-	GBR_type one;
-	int empty = 0;
-	int fixed = 0;
-	int fixed_saved = 0;
-	int mu_fixed[2];
-	int n_bounded;
-	int gbr_only_first;
-
-	if (!tab)
-		return NULL;
-
-	if (tab->empty)
-		return tab;
-
-	ctx = tab->mat->ctx;
-	gbr_only_first = ctx->opt->gbr_only_first;
-	dim = tab->n_var;
-	B = tab->basis;
-	if (!B)
-		return tab;
-
-	n_bounded = dim - tab->n_unbounded;
-	if (n_bounded <= tab->n_zero + 1)
-		return tab;
-
-	isl_int_init(tmp);
-	isl_int_init(mu[0]);
-	isl_int_init(mu[1]);
-
-	GBR_init(alpha);
-	GBR_init(F_old);
-	GBR_init(F_new);
-	GBR_init(F_saved);
-	GBR_init(mu_F[0]);
-	GBR_init(mu_F[1]);
-	GBR_init(two);
-	GBR_init(one);
-
-	b_tmp = isl_vec_alloc(ctx, dim);
-	if (!b_tmp)
-		goto error;
-
-	F = isl_alloc_array(ctx, GBR_type, n_bounded);
-	alpha_buffer[0] = isl_alloc_array(ctx, GBR_type, n_bounded);
-	alpha_buffer[1] = isl_alloc_array(ctx, GBR_type, n_bounded);
-	alpha_saved = alpha_buffer[0];
-
-	if (!F || !alpha_buffer[0] || !alpha_buffer[1])
-		goto error;
-
-	for (i = 0; i < n_bounded; ++i) {
-		GBR_init(F[i]);
-		GBR_init(alpha_buffer[0][i]);
-		GBR_init(alpha_buffer[1][i]);
-	}
-
-	GBR_set_ui(two, 2);
-	GBR_set_ui(one, 1);
-
-	lp = GBR_lp_init(tab);
-	if (!lp)
-		goto error;
-
-	i = tab->n_zero;
-
-	GBR_lp_set_obj(lp, B->row[1+i]+1, dim);
-	ctx->stats->gbr_solved_lps++;
-	unbounded = GBR_lp_solve(lp);
-	isl_assert(ctx, !unbounded, goto error);
-	GBR_lp_get_obj_val(lp, &F[i]);
-
-	if (GBR_lt(F[i], one)) {
-		if (!GBR_is_zero(F[i])) {
-			empty = GBR_lp_cut(lp, B->row[1+i]+1);
-			if (empty)
-				goto done;
-			GBR_set_ui(F[i], 0);
-		}
-		tab->n_zero++;
-	}
-
-	do {
-		if (i+1 == tab->n_zero) {
-			GBR_lp_set_obj(lp, B->row[1+i+1]+1, dim);
-			ctx->stats->gbr_solved_lps++;
-			unbounded = GBR_lp_solve(lp);
-			isl_assert(ctx, !unbounded, goto error);
-			GBR_lp_get_obj_val(lp, &F_new);
-			fixed = GBR_lp_is_fixed(lp);
-			GBR_set_ui(alpha, 0);
-		} else
-		if (use_saved) {
-			row = GBR_lp_next_row(lp);
-			GBR_set(F_new, F_saved);
-			fixed = fixed_saved;
-			GBR_set(alpha, alpha_saved[i]);
-		} else {
-			row = GBR_lp_add_row(lp, B->row[1+i]+1, dim);
-			GBR_lp_set_obj(lp, B->row[1+i+1]+1, dim);
-			ctx->stats->gbr_solved_lps++;
-			unbounded = GBR_lp_solve(lp);
-			isl_assert(ctx, !unbounded, goto error);
-			GBR_lp_get_obj_val(lp, &F_new);
-			fixed = GBR_lp_is_fixed(lp);
-
-			GBR_lp_get_alpha(lp, row, &alpha);
-
-			if (i > 0)
-				save_alpha(lp, row-i, i, alpha_saved);
-
-			if (GBR_lp_del_row(lp) < 0)
-				goto error;
-		}
-		GBR_set(F[i+1], F_new);
-
-		GBR_floor(mu[0], alpha);
-		GBR_ceil(mu[1], alpha);
-
-		if (isl_int_eq(mu[0], mu[1]))
-			isl_int_set(tmp, mu[0]);
-		else {
-			int j;
-
-			for (j = 0; j <= 1; ++j) {
-				isl_int_set(tmp, mu[j]);
-				isl_seq_combine(b_tmp->el,
-						ctx->one, B->row[1+i+1]+1,
-						tmp, B->row[1+i]+1, dim);
-				GBR_lp_set_obj(lp, b_tmp->el, dim);
-				ctx->stats->gbr_solved_lps++;
-				unbounded = GBR_lp_solve(lp);
-				isl_assert(ctx, !unbounded, goto error);
-				GBR_lp_get_obj_val(lp, &mu_F[j]);
-				mu_fixed[j] = GBR_lp_is_fixed(lp);
-				if (i > 0)
-					save_alpha(lp, row-i, i, alpha_buffer[j]);
-			}
-
-			if (GBR_lt(mu_F[0], mu_F[1]))
-				j = 0;
-			else
-				j = 1;
-
-			isl_int_set(tmp, mu[j]);
-			GBR_set(F_new, mu_F[j]);
-			fixed = mu_fixed[j];
-			alpha_saved = alpha_buffer[j];
-		}
-		isl_seq_combine(B->row[1+i+1]+1, ctx->one, B->row[1+i+1]+1,
-				tmp, B->row[1+i]+1, dim);
-
-		if (i+1 == tab->n_zero && fixed) {
-			if (!GBR_is_zero(F[i+1])) {
-				empty = GBR_lp_cut(lp, B->row[1+i+1]+1);
-				if (empty)
-					goto done;
-				GBR_set_ui(F[i+1], 0);
-			}
-			tab->n_zero++;
-		}
-
-		GBR_set(F_old, F[i]);
-
-		use_saved = 0;
-		/* mu_F[0] = 4 * F_new; mu_F[1] = 3 * F_old */
-		GBR_set_ui(mu_F[0], 4);
-		GBR_mul(mu_F[0], mu_F[0], F_new);
-		GBR_set_ui(mu_F[1], 3);
-		GBR_mul(mu_F[1], mu_F[1], F_old);
-		if (GBR_lt(mu_F[0], mu_F[1])) {
-			B = isl_mat_swap_rows(B, 1 + i, 1 + i + 1);
-			if (i > tab->n_zero) {
-				use_saved = 1;
-				GBR_set(F_saved, F_new);
-				fixed_saved = fixed;
-				if (GBR_lp_del_row(lp) < 0)
-					goto error;
-				--i;
-			} else {
-				GBR_set(F[tab->n_zero], F_new);
-				if (gbr_only_first && GBR_lt(F[tab->n_zero], two))
-					break;
-
-				if (fixed) {
-					if (!GBR_is_zero(F[tab->n_zero])) {
-						empty = GBR_lp_cut(lp, B->row[1+tab->n_zero]+1);
-						if (empty)
-							goto done;
-						GBR_set_ui(F[tab->n_zero], 0);
-					}
-					tab->n_zero++;
-				}
-			}
-		} else {
-			GBR_lp_add_row(lp, B->row[1+i]+1, dim);
-			++i;
-		}
-	} while (i < n_bounded - 1);
-
-	if (0) {
-done:
-		if (empty < 0) {
-error:
-			isl_mat_free(B);
-			B = NULL;
-		}
-	}
-
-	GBR_lp_delete(lp);
-
-	if (alpha_buffer[1])
-		for (i = 0; i < n_bounded; ++i) {
-			GBR_clear(F[i]);
-			GBR_clear(alpha_buffer[0][i]);
-			GBR_clear(alpha_buffer[1][i]);
-		}
-	free(F);
-	free(alpha_buffer[0]);
-	free(alpha_buffer[1]);
-
-	isl_vec_free(b_tmp);
-
-	GBR_clear(alpha);
-	GBR_clear(F_old);
-	GBR_clear(F_new);
-	GBR_clear(F_saved);
-	GBR_clear(mu_F[0]);
-	GBR_clear(mu_F[1]);
-	GBR_clear(two);
-	GBR_clear(one);
-
-	isl_int_clear(tmp);
-	isl_int_clear(mu[0]);
-	isl_int_clear(mu[1]);
-
-	tab->basis = B;
-
-	return tab;
-}
-
-/* Compute an affine form of a reduced basis of the given basic
- * non-parametric set, which is assumed to be bounded and not
- * include any integer divisions.
- * The first column and the first row correspond to the constant term.
- *
- * If the input contains any equalities, we first create an initial
- * basis with the equalities first.  Otherwise, we start off with
- * the identity matrix.
- */
-struct isl_mat *isl_basic_set_reduced_basis(struct isl_basic_set *bset)
-{
-	struct isl_mat *basis;
-	struct isl_tab *tab;
-
-	if (!bset)
-		return NULL;
-
-	if (isl_basic_set_dim(bset, isl_dim_div) != 0)
-		isl_die(bset->ctx, isl_error_invalid,
-			"no integer division allowed", return NULL);
-	if (isl_basic_set_dim(bset, isl_dim_param) != 0)
-		isl_die(bset->ctx, isl_error_invalid,
-			"no parameters allowed", return NULL);
-
-	tab = isl_tab_from_basic_set(bset);
-	if (!tab)
-		return NULL;
-
-	if (bset->n_eq == 0)
-		tab->basis = isl_mat_identity(bset->ctx, 1 + tab->n_var);
-	else {
-		isl_mat *eq;
-		unsigned nvar = isl_basic_set_total_dim(bset);
-		eq = isl_mat_sub_alloc6(bset->ctx, bset->eq, 0, bset->n_eq,
-					1, nvar);
-		eq = isl_mat_left_hermite(eq, 0, NULL, &tab->basis);
-		tab->basis = isl_mat_lin_to_aff(tab->basis);
-		tab->n_zero = bset->n_eq;
-		isl_mat_free(eq);
-	}
-	tab = isl_tab_compute_reduced_basis(tab);
-	if (!tab)
-		return NULL;
-
-	basis = isl_mat_copy(tab->basis);
-
-	isl_tab_free(tab);
-
-	return basis;
-}
diff --git a/cloog-0.17.0/isl/bound.c b/cloog-0.17.0/isl/bound.c
deleted file mode 100644
index a0772b7..0000000
--- a/cloog-0.17.0/isl/bound.c
+++ /dev/null
@@ -1,278 +0,0 @@
-#include <assert.h>
-#include <isl/stream.h>
-#include <isl_polynomial_private.h>
-#include <isl_scan.h>
-#include <isl/options.h>
-
-struct bound_options {
-	struct isl_options	*isl;
-	unsigned		 verify;
-	int			 print_all;
-	int			 continue_on_error;
-};
-
-ISL_ARGS_START(struct bound_options, bound_options_args)
-ISL_ARG_CHILD(struct bound_options, isl, "isl", &isl_options_args,
-	"isl options")
-ISL_ARG_BOOL(struct bound_options, verify, 'T', "verify", 0, NULL)
-ISL_ARG_BOOL(struct bound_options, print_all, 'A', "print-all", 0, NULL)
-ISL_ARG_BOOL(struct bound_options, continue_on_error, '\0', "continue-on-error", 0, NULL)
-ISL_ARGS_END
-
-ISL_ARG_DEF(bound_options, struct bound_options, bound_options_args)
-
-static __isl_give isl_set *set_bounds(__isl_take isl_set *set)
-{
-	unsigned nparam;
-	int i, r;
-	isl_point *pt, *pt2;
-	isl_set *box;
-
-	nparam = isl_set_dim(set, isl_dim_param);
-	r = nparam >= 8 ? 5 : nparam >= 5 ? 15 : 50;
-
-	pt = isl_set_sample_point(isl_set_copy(set));
-	pt2 = isl_point_copy(pt);
-
-	for (i = 0; i < nparam; ++i) {
-		pt = isl_point_add_ui(pt, isl_dim_param, i, r);
-		pt2 = isl_point_sub_ui(pt2, isl_dim_param, i, r);
-	}
-
-	box = isl_set_box_from_points(pt, pt2);
-
-	return isl_set_intersect(set, box);
-}
-
-struct verify_point_bound {
-	struct bound_options *options;
-	int stride;
-	int n;
-	int exact;
-	int error;
-
-	isl_pw_qpolynomial_fold *pwf;
-	isl_pw_qpolynomial_fold *bound;
-};
-
-static int verify_point(__isl_take isl_point *pnt, void *user)
-{
-	int i;
-	unsigned nvar;
-	unsigned nparam;
-	struct verify_point_bound *vpb = (struct verify_point_bound *) user;
-	isl_int t;
-	isl_pw_qpolynomial_fold *pwf;
-	isl_qpolynomial *bound = NULL;
-	isl_qpolynomial *opt = NULL;
-	isl_set *dom = NULL;
-	const char *minmax;
-	int bounded;
-	int sign;
-	int ok;
-	FILE *out = vpb->options->print_all ? stdout : stderr;
-
-	vpb->n--;
-
-	if (1) {
-		minmax = "ub";
-		sign = 1;
-	} else {
-		minmax = "lb";
-		sign = -1;
-	}
-
-	isl_int_init(t);
-
-	pwf = isl_pw_qpolynomial_fold_copy(vpb->pwf);
-
-	nparam = isl_pw_qpolynomial_fold_dim(pwf, isl_dim_param);
-	for (i = 0; i < nparam; ++i) {
-		isl_point_get_coordinate(pnt, isl_dim_param, i, &t);
-		pwf = isl_pw_qpolynomial_fold_fix_dim(pwf, isl_dim_param, i, t);
-	}
-
-	bound = isl_pw_qpolynomial_fold_eval(
-				    isl_pw_qpolynomial_fold_copy(vpb->bound),
-				    isl_point_copy(pnt));
-
-	dom = isl_pw_qpolynomial_fold_domain(isl_pw_qpolynomial_fold_copy(pwf));
-	bounded = isl_set_is_bounded(dom);
-
-	if (bounded < 0)
-		goto error;
-
-	if (!bounded)
-		opt = isl_pw_qpolynomial_fold_eval(
-				    isl_pw_qpolynomial_fold_copy(pwf),
-				    isl_set_sample_point(isl_set_copy(dom)));
-	else if (sign > 0)
-		opt = isl_pw_qpolynomial_fold_max(isl_pw_qpolynomial_fold_copy(pwf));
-	else
-		opt = isl_pw_qpolynomial_fold_min(isl_pw_qpolynomial_fold_copy(pwf));
-
-	nvar = isl_set_dim(dom, isl_dim_set);
-	opt = isl_qpolynomial_project_domain_on_params(opt);
-	if (vpb->exact && bounded)
-		ok = isl_qpolynomial_plain_is_equal(opt, bound);
-	else if (sign > 0)
-		ok = isl_qpolynomial_le_cst(opt, bound);
-	else
-		ok = isl_qpolynomial_le_cst(bound, opt);
-	if (ok < 0)
-		goto error;
-
-	if (vpb->options->print_all || !ok) {
-		fprintf(out, "%s(", minmax);
-		for (i = 0; i < nparam; ++i) {
-			if (i)
-				fprintf(out, ", ");
-			isl_point_get_coordinate(pnt, isl_dim_param, i, &t);
-			isl_int_print(out, t, 0);
-		}
-		fprintf(out, ") = ");
-		isl_qpolynomial_print(bound, out, ISL_FORMAT_ISL);
-		fprintf(out, ", %s = ", bounded ? "opt" : "sample");
-		isl_qpolynomial_print(opt, out, ISL_FORMAT_ISL);
-		if (ok)
-			fprintf(out, ". OK\n");
-		else
-			fprintf(out, ". NOT OK\n");
-	} else if ((vpb->n % vpb->stride) == 0) {
-		printf("o");
-		fflush(stdout);
-	}
-
-	if (0) {
-error:
-		ok = 0;
-	}
-
-	isl_pw_qpolynomial_fold_free(pwf);
-	isl_qpolynomial_free(bound);
-	isl_qpolynomial_free(opt);
-	isl_point_free(pnt);
-	isl_set_free(dom);
-
-	isl_int_clear(t);
-
-	if (!ok)
-		vpb->error = 1;
-
-	if (vpb->options->continue_on_error)
-		ok = 1;
-
-	return (vpb->n >= 1 && ok) ? 0 : -1;
-}
-
-static int check_solution(__isl_take isl_pw_qpolynomial_fold *pwf,
-	__isl_take isl_pw_qpolynomial_fold *bound, int exact,
-	struct bound_options *options)
-{
-	struct verify_point_bound vpb;
-	isl_int count, max;
-	isl_set *dom;
-	isl_set *context;
-	int i, r, n;
-
-	dom = isl_pw_qpolynomial_fold_domain(isl_pw_qpolynomial_fold_copy(pwf));
-	context = isl_set_params(isl_set_copy(dom));
-	context = isl_set_remove_divs(context);
-	context = set_bounds(context);
-
-	isl_int_init(count);
-	isl_int_init(max);
-
-	isl_int_set_si(max, 200);
-	r = isl_set_count_upto(context, max, &count);
-	assert(r >= 0);
-	n = isl_int_get_si(count);
-
-	isl_int_clear(max);
-	isl_int_clear(count);
-
-	vpb.options = options;
-	vpb.pwf = pwf;
-	vpb.bound = bound;
-	vpb.n = n;
-	vpb.stride = n > 70 ? 1 + (n + 1)/70 : 1;
-	vpb.error = 0;
-	vpb.exact = exact;
-
-	if (!options->print_all) {
-		for (i = 0; i < vpb.n; i += vpb.stride)
-			printf(".");
-		printf("\r");
-		fflush(stdout);
-	}
-
-	isl_set_foreach_point(context, verify_point, &vpb);
-
-	isl_set_free(context);
-	isl_set_free(dom);
-	isl_pw_qpolynomial_fold_free(pwf);
-	isl_pw_qpolynomial_fold_free(bound);
-
-	if (!options->print_all)
-		printf("\n");
-
-	if (vpb.error) {
-		fprintf(stderr, "Check failed !\n");
-		return -1;
-	}
-
-	return 0;
-}
-
-int main(int argc, char **argv)
-{
-	isl_ctx *ctx;
-	isl_pw_qpolynomial_fold *copy;
-	isl_pw_qpolynomial_fold *pwf;
-	struct isl_stream *s;
-	struct isl_obj obj;
-	struct bound_options *options;
-	int exact;
-	int r = 0;
-
-	options = bound_options_new_with_defaults();
-	assert(options);
-	argc = bound_options_parse(options, argc, argv, ISL_ARG_ALL);
-
-	ctx = isl_ctx_alloc_with_options(&bound_options_args, options);
-
-	s = isl_stream_new_file(ctx, stdin);
-	obj = isl_stream_read_obj(s);
-	if (obj.type == isl_obj_pw_qpolynomial)
-		pwf = isl_pw_qpolynomial_fold_from_pw_qpolynomial(isl_fold_max,
-								  obj.v);
-	else if (obj.type == isl_obj_pw_qpolynomial_fold)
-		pwf = obj.v;
-	else {
-		obj.type->free(obj.v);
-		isl_die(ctx, isl_error_invalid, "invalid input", goto error);
-	}
-
-	if (options->verify)
-		copy = isl_pw_qpolynomial_fold_copy(pwf);
-
-	pwf = isl_pw_qpolynomial_fold_bound(pwf, &exact);
-	pwf = isl_pw_qpolynomial_fold_coalesce(pwf);
-
-	if (options->verify) {
-		r = check_solution(copy, pwf, exact, options);
-	} else {
-		if (!exact)
-			printf("# NOT exact\n");
-		isl_pw_qpolynomial_fold_print(pwf, stdout, 0);
-		fprintf(stdout, "\n");
-		isl_pw_qpolynomial_fold_free(pwf);
-	}
-
-error:
-	isl_stream_free(s);
-
-	isl_ctx_free(ctx);
-
-	return r;
-}
diff --git a/cloog-0.17.0/isl/bound_test.sh.in b/cloog-0.17.0/isl/bound_test.sh.in
deleted file mode 100755
index e3fc037..0000000
--- a/cloog-0.17.0/isl/bound_test.sh.in
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/bin/sh
-
-EXEEXT=@EXEEXT@
-
-BOUND_TESTS="\
-	basicLinear2.pwqp \
-	basicLinear.pwqp \
-	basicTestParameterPosNeg.pwqp \
-	basicTest.pwqp \
-	devos.pwqp \
-	equality1.pwqp \
-	equality2.pwqp \
-	equality3.pwqp \
-	equality4.pwqp \
-	equality5.pwqp \
-	faddeev.pwqp \
-	linearExample.pwqp \
-	neg.pwqp \
-	philippe3vars3pars.pwqp \
-	philippe3vars.pwqp \
-	philippeNeg.pwqp \
-	philippePolynomialCoeff1P.pwqp \
-	philippePolynomialCoeff.pwqp \
-	philippe.pwqp \
-	product.pwqp \
-	split.pwqp \
-	test3Deg3Var.pwqp \
-	toplas.pwqp \
-	unexpanded.pwqp"
-
-for i in $BOUND_TESTS; do
-	echo $i;
-	./isl_bound$EXEEXT -T --bound=bernstein < $srcdir/test_inputs/$i || exit
-	./isl_bound$EXEEXT -T --bound=range < $srcdir/test_inputs/$i || exit
-done
diff --git a/cloog-0.17.0/isl/cat.c b/cloog-0.17.0/isl/cat.c
deleted file mode 100644
index 6313142..0000000
--- a/cloog-0.17.0/isl/cat.c
+++ /dev/null
@@ -1,58 +0,0 @@
-#include <assert.h>
-#include <isl/obj.h>
-#include <isl/printer.h>
-#include <isl/stream.h>
-#include <isl/options.h>
-
-struct isl_arg_choice cat_format[] = {
-	{"isl",		ISL_FORMAT_ISL},
-	{"omega",	ISL_FORMAT_OMEGA},
-	{"polylib",	ISL_FORMAT_POLYLIB},
-	{"ext-polylib",	ISL_FORMAT_EXT_POLYLIB},
-	{"latex",	ISL_FORMAT_LATEX},
-	{0}
-};
-
-struct cat_options {
-	struct isl_options	*isl;
-	unsigned		 format;
-};
-
-ISL_ARGS_START(struct cat_options, cat_options_args)
-ISL_ARG_CHILD(struct cat_options, isl, "isl", &isl_options_args, "isl options")
-ISL_ARG_CHOICE(struct cat_options, format, 0, "format", \
-	cat_format,	ISL_FORMAT_ISL, "output format")
-ISL_ARGS_END
-
-ISL_ARG_DEF(cat_options, struct cat_options, cat_options_args)
-
-int main(int argc, char **argv)
-{
-	struct isl_ctx *ctx;
-	struct isl_stream *s;
-	struct isl_obj obj;
-	struct cat_options *options;
-	isl_printer *p;
-
-	options = cat_options_new_with_defaults();
-	assert(options);
-	argc = cat_options_parse(options, argc, argv, ISL_ARG_ALL);
-
-	ctx = isl_ctx_alloc_with_options(&cat_options_args, options);
-
-	s = isl_stream_new_file(ctx, stdin);
-	obj = isl_stream_read_obj(s);
-	isl_stream_free(s);
-
-	p = isl_printer_to_file(ctx, stdout);
-	p = isl_printer_set_output_format(p, options->format);
-	p = obj.type->print(p, obj.v);
-	p = isl_printer_end_line(p);
-	isl_printer_free(p);
-
-	obj.type->free(obj.v);
-
-	isl_ctx_free(ctx);
-
-	return 0;
-}
diff --git a/cloog-0.17.0/isl/closure.c b/cloog-0.17.0/isl/closure.c
deleted file mode 100644
index a0faa15..0000000
--- a/cloog-0.17.0/isl/closure.c
+++ /dev/null
@@ -1,34 +0,0 @@
-#include <assert.h>
-#include <isl/map.h>
-#include <isl/options.h>
-
-int main(int argc, char **argv)
-{
-	struct isl_ctx *ctx;
-	struct isl_map *map;
-	struct isl_options *options;
-	int exact;
-
-	options = isl_options_new_with_defaults();
-	assert(options);
-	argc = isl_options_parse(options, argc, argv, ISL_ARG_ALL);
-
-	ctx = isl_ctx_alloc_with_options(&isl_options_args, options);
-
-	map = isl_map_read_from_file(ctx, stdin);
-	map = isl_map_transitive_closure(map, &exact);
-	if (!exact)
-		printf("# NOT exact\n");
-	isl_map_print(map, stdout, 0, ISL_FORMAT_ISL);
-	printf("\n");
-	map = isl_map_compute_divs(map);
-	map = isl_map_coalesce(map);
-	printf("# coalesced\n");
-	isl_map_print(map, stdout, 0, ISL_FORMAT_ISL);
-	printf("\n");
-	isl_map_free(map);
-
-	isl_ctx_free(ctx);
-
-	return 0;
-}
diff --git a/cloog-0.17.0/isl/config.guess b/cloog-0.17.0/isl/config.guess
deleted file mode 100755
index c2246a4..0000000
--- a/cloog-0.17.0/isl/config.guess
+++ /dev/null
@@ -1,1502 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-#   Free Software Foundation, Inc.
-
-timestamp='2009-12-30'
-
-# 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
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner.  Please send patches (context
-# diff format) to <config-patches@gnu.org> and include a ChangeLog
-# entry.
-#
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
-#
-# 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
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help" >&2
-       exit 1 ;;
-    * )
-       break ;;
-  esac
-done
-
-if test $# != 0; then
-  echo "$me: too many arguments$help" >&2
-  exit 1
-fi
-
-trap 'exit 1' 1 2 15
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
-
-set_cc_for_build='
-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
-: ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
-dummy=$tmp/dummy ;
-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
-case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,)    echo "int x;" > $dummy.c ;
-	for c in cc gcc c89 c99 ; do
-	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
-	     CC_FOR_BUILD="$c"; break ;
-	  fi ;
-	done ;
-	if test x"$CC_FOR_BUILD" = x ; then
-	  CC_FOR_BUILD=no_compiler_found ;
-	fi
-	;;
- ,,*)   CC_FOR_BUILD=$CC ;;
- ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
-esac ; set_cc_for_build= ;'
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
-	PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
-    *:NetBSD:*:*)
-	# NetBSD (nbsd) targets should (where applicable) match one or
-	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
-	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
-	# switched to ELF, *-*-netbsd* would select the old
-	# object file format.  This provides both forward
-	# compatibility and a consistent mechanism for selecting the
-	# object file format.
-	#
-	# Note: NetBSD doesn't particularly care about the vendor
-	# portion of the name.  We always set it to "unknown".
-	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
-	case "${UNAME_MACHINE_ARCH}" in
-	    armeb) machine=armeb-unknown ;;
-	    arm*) machine=arm-unknown ;;
-	    sh3el) machine=shl-unknown ;;
-	    sh3eb) machine=sh-unknown ;;
-	    sh5el) machine=sh5le-unknown ;;
-	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
-	esac
-	# The Operating System including object format, if it has switched
-	# to ELF recently, or will in the future.
-	case "${UNAME_MACHINE_ARCH}" in
-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
-		eval $set_cc_for_build
-		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
-			| grep -q __ELF__
-		then
-		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
-		    # Return netbsd for either.  FIX?
-		    os=netbsd
-		else
-		    os=netbsdelf
-		fi
-		;;
-	    *)
-	        os=netbsd
-		;;
-	esac
-	# The OS release
-	# Debian GNU/NetBSD machines have a different userland, and
-	# thus, need a distinct triplet. However, they do not need
-	# kernel version information, so it can be replaced with a
-	# suitable tag, in the style of linux-gnu.
-	case "${UNAME_VERSION}" in
-	    Debian*)
-		release='-gnu'
-		;;
-	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
-		;;
-	esac
-	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
-	# contains redundant information, the shorter form:
-	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
-	exit ;;
-    *:OpenBSD:*:*)
-	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
-	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
-	exit ;;
-    *:ekkoBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
-	exit ;;
-    *:SolidBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
-	exit ;;
-    macppc:MirBSD:*:*)
-	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    *:MirBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    alpha:OSF1:*:*)
-	case $UNAME_RELEASE in
-	*4.0)
-		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
-		;;
-	*5.*)
-	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
-		;;
-	esac
-	# According to Compaq, /usr/sbin/psrinfo has been available on
-	# OSF/1 and Tru64 systems produced since 1995.  I hope that
-	# covers most systems running today.  This code pipes the CPU
-	# types through head -n 1, so we only detect the type of CPU 0.
-	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" ;;
-	    "EV4.5 (21064)")
-		UNAME_MACHINE="alpha" ;;
-	    "LCA4 (21066/21068)")
-		UNAME_MACHINE="alpha" ;;
-	    "EV5 (21164)")
-		UNAME_MACHINE="alphaev5" ;;
-	    "EV5.6 (21164A)")
-		UNAME_MACHINE="alphaev56" ;;
-	    "EV5.6 (21164PC)")
-		UNAME_MACHINE="alphapca56" ;;
-	    "EV5.7 (21164PC)")
-		UNAME_MACHINE="alphapca57" ;;
-	    "EV6 (21264)")
-		UNAME_MACHINE="alphaev6" ;;
-	    "EV6.7 (21264A)")
-		UNAME_MACHINE="alphaev67" ;;
-	    "EV6.8CB (21264C)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8AL (21264B)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8CX (21264D)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.9A (21264/EV69A)")
-		UNAME_MACHINE="alphaev69" ;;
-	    "EV7 (21364)")
-		UNAME_MACHINE="alphaev7" ;;
-	    "EV7.9 (21364A)")
-		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'`
-	exit ;;
-    Alpha\ *:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# Should we change UNAME_MACHINE based on the output of uname instead
-	# of the specific Alpha model?
-	echo alpha-pc-interix
-	exit ;;
-    21064:Windows_NT:50:3)
-	echo alpha-dec-winnt3.5
-	exit ;;
-    Amiga*:UNIX_System_V:4.0:*)
-	echo m68k-unknown-sysv4
-	exit ;;
-    *:[Aa]miga[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-amigaos
-	exit ;;
-    *:[Mm]orph[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-morphos
-	exit ;;
-    *:OS/390:*:*)
-	echo i370-ibm-openedition
-	exit ;;
-    *:z/VM:*:*)
-	echo s390-ibm-zvmoe
-	exit ;;
-    *:OS400:*:*)
-        echo powerpc-ibm-os400
-	exit ;;
-    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
-	echo arm-acorn-riscix${UNAME_RELEASE}
-	exit ;;
-    arm:riscos:*:*|arm:RISCOS:*:*)
-	echo arm-unknown-riscos
-	exit ;;
-    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
-	echo hppa1.1-hitachi-hiuxmpp
-	exit ;;
-    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
-	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
-	if test "`(/bin/universe) 2>/dev/null`" = att ; then
-		echo pyramid-pyramid-sysv3
-	else
-		echo pyramid-pyramid-bsd
-	fi
-	exit ;;
-    NILE*:*:*:dcosx)
-	echo pyramid-pyramid-svr4
-	exit ;;
-    DRS?6000:unix:4.0:6*)
-	echo sparc-icl-nx6
-	exit ;;
-    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
-	case `/usr/bin/uname -p` in
-	    sparc) echo sparc-icl-nx7; exit ;;
-	esac ;;
-    s390x:SunOS:*:*)
-	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4H:SunOS:5.*:*)
-	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
-	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
-	echo i386-pc-auroraux${UNAME_RELEASE}
-	exit ;;
-    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
-	eval $set_cc_for_build
-	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 (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
-		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		grep IS_64BIT_ARCH >/dev/null
-	    then
-		SUN_ARCH="x86_64"
-	    fi
-	fi
-	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:6*:*)
-	# According to config.sub, this is the proper way to canonicalize
-	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
-	# it's likely to be more like Solaris than SunOS4.
-	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:*:*)
-	case "`/usr/bin/arch -k`" in
-	    Series*|S4*)
-		UNAME_RELEASE=`uname -v`
-		;;
-	esac
-	# Japanese Language versions have a version number like `4.1.3-JL'.
-	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
-	exit ;;
-    sun3*:SunOS:*:*)
-	echo m68k-sun-sunos${UNAME_RELEASE}
-	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
-	case "`/bin/arch`" in
-	    sun3)
-		echo m68k-sun-sunos${UNAME_RELEASE}
-		;;
-	    sun4)
-		echo sparc-sun-sunos${UNAME_RELEASE}
-		;;
-	esac
-	exit ;;
-    aushp:SunOS:*:*)
-	echo sparc-auspex-sunos${UNAME_RELEASE}
-	exit ;;
-    # The situation for MiNT is a little confusing.  The machine name
-    # can be virtually everything (everything which is not
-    # "atarist" or "atariste" at least should have a processor
-    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
-    # to the lowercase version "mint" (or "freemint").  Finally
-    # the system name "TOS" denotes a system which is actually not
-    # MiNT.  But MiNT is downward compatible to TOS, so this should
-    # be no problem.
-    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
-	echo m68k-atari-mint${UNAME_RELEASE}
-        exit ;;
-    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-        echo m68k-milan-mint${UNAME_RELEASE}
-        exit ;;
-    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-        echo m68k-hades-mint${UNAME_RELEASE}
-        exit ;;
-    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-        echo m68k-unknown-mint${UNAME_RELEASE}
-        exit ;;
-    m68k:machten:*:*)
-	echo m68k-apple-machten${UNAME_RELEASE}
-	exit ;;
-    powerpc:machten:*:*)
-	echo powerpc-apple-machten${UNAME_RELEASE}
-	exit ;;
-    RISC*:Mach:*:*)
-	echo mips-dec-mach_bsd4.3
-	exit ;;
-    RISC*:ULTRIX:*:*)
-	echo mips-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    VAX*:ULTRIX*:*:*)
-	echo vax-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    2020:CLIX:*:* | 2430:CLIX:*:*)
-	echo clipper-intergraph-clix${UNAME_RELEASE}
-	exit ;;
-    mips:*:*:UMIPS | mips:*:*:RISCos)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-#ifdef __cplusplus
-#include <stdio.h>  /* for printf() prototype */
-	int main (int argc, char *argv[]) {
-#else
-	int main (argc, argv) int argc; char *argv[]; {
-#endif
-	#if defined (host_mips) && defined (MIPSEB)
-	#if defined (SYSTYPE_SYSV)
-	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_SVR4)
-	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
-	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
-	#endif
-	#endif
-	  exit (-1);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c &&
-	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
-	  SYSTEM_NAME=`$dummy $dummyarg` &&
-	    { echo "$SYSTEM_NAME"; exit; }
-	echo mips-mips-riscos${UNAME_RELEASE}
-	exit ;;
-    Motorola:PowerMAX_OS:*:*)
-	echo powerpc-motorola-powermax
-	exit ;;
-    Motorola:*:4.3:PL8-*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:Power_UNIX:*:*)
-	echo powerpc-harris-powerunix
-	exit ;;
-    m88k:CX/UX:7*:*)
-	echo m88k-harris-cxux7
-	exit ;;
-    m88k:*:4*:R4*)
-	echo m88k-motorola-sysv4
-	exit ;;
-    m88k:*:3*:R3*)
-	echo m88k-motorola-sysv3
-	exit ;;
-    AViiON:dgux:*:*)
-        # DG/UX returns AViiON for all architectures
-        UNAME_PROCESSOR=`/usr/bin/uname -p`
-	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
-	then
-	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
-	       [ ${TARGET_BINARY_INTERFACE}x = x ]
-	    then
-		echo m88k-dg-dgux${UNAME_RELEASE}
-	    else
-		echo m88k-dg-dguxbcs${UNAME_RELEASE}
-	    fi
-	else
-	    echo i586-dg-dgux${UNAME_RELEASE}
-	fi
- 	exit ;;
-    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
-	echo m88k-dolphin-sysv3
-	exit ;;
-    M88*:*:R3*:*)
-	# Delta 88k system running SVR3
-	echo m88k-motorola-sysv3
-	exit ;;
-    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
-	echo m88k-tektronix-sysv3
-	exit ;;
-    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
-	echo m68k-tektronix-bsd
-	exit ;;
-    *:IRIX*:*:*)
-	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
-	exit ;;
-    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
-	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
-    i*86:AIX:*:*)
-	echo i386-ibm-aix
-	exit ;;
-    ia64:AIX:*:*)
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:2:3)
-	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
-		eval $set_cc_for_build
-		sed 's/^		//' << EOF >$dummy.c
-		#include <sys/systemcfg.h>
-
-		main()
-			{
-			if (!__power_pc())
-				exit(1);
-			puts("powerpc-ibm-aix3.2.5");
-			exit(0);
-			}
-EOF
-		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
-		then
-			echo "$SYSTEM_NAME"
-		else
-			echo rs6000-ibm-aix3.2.5
-		fi
-	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
-		echo rs6000-ibm-aix3.2.4
-	else
-		echo rs6000-ibm-aix3.2
-	fi
-	exit ;;
-    *:AIX:*:[456])
-	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
-	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
-		IBM_ARCH=rs6000
-	else
-		IBM_ARCH=powerpc
-	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:*:*)
-	echo rs6000-ibm-aix
-	exit ;;
-    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
-	echo romp-ibm-bsd4.4
-	exit ;;
-    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
-	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
-	exit ;;                             # report: romp-ibm BSD 4.3
-    *:BOSX:*:*)
-	echo rs6000-bull-bosx
-	exit ;;
-    DPX/2?00:B.O.S.:*:*)
-	echo m68k-bull-sysv3
-	exit ;;
-    9000/[34]??:4.3bsd:1.*:*)
-	echo m68k-hp-bsd
-	exit ;;
-    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
-	echo m68k-hp-bsd4.4
-	exit ;;
-    9000/[34678]??:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	case "${UNAME_MACHINE}" in
-	    9000/31? )            HP_ARCH=m68000 ;;
-	    9000/[34]?? )         HP_ARCH=m68k ;;
-	    9000/[678][0-9][0-9])
-		if [ -x /usr/bin/getconf ]; then
-		    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
-                      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
-                        esac ;;
-                    esac
-		fi
-		if [ "${HP_ARCH}" = "" ]; then
-		    eval $set_cc_for_build
-		    sed 's/^              //' << EOF >$dummy.c
-
-              #define _HPUX_SOURCE
-              #include <stdlib.h>
-              #include <unistd.h>
-
-              int main ()
-              {
-              #if defined(_SC_KERNEL_BITS)
-                  long bits = sysconf(_SC_KERNEL_BITS);
-              #endif
-                  long cpu  = sysconf (_SC_CPU_VERSION);
-
-                  switch (cpu)
-              	{
-              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-              	case CPU_PA_RISC2_0:
-              #if defined(_SC_KERNEL_BITS)
-              	    switch (bits)
-              		{
-              		case 64: puts ("hppa2.0w"); break;
-              		case 32: puts ("hppa2.0n"); break;
-              		default: puts ("hppa2.0"); break;
-              		} break;
-              #else  /* !defined(_SC_KERNEL_BITS) */
-              	    puts ("hppa2.0"); break;
-              #endif
-              	default: puts ("hppa1.0"); break;
-              	}
-                  exit (0);
-              }
-EOF
-		    (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" ]
-	then
-	    eval $set_cc_for_build
-
-	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
-	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
-	    # generating 64-bit code.  GNU and HP use different nomenclature:
-	    #
-	    # $ CC_FOR_BUILD=cc ./config.guess
-	    # => hppa2.0w-hp-hpux11.23
-	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
-	    # => hppa64-hp-hpux11.23
-
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
-		grep -q __LP64__
-	    then
-		HP_ARCH="hppa2.0w"
-	    else
-		HP_ARCH="hppa64"
-	    fi
-	fi
-	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
-	exit ;;
-    ia64:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	echo ia64-hp-hpux${HPUX_REV}
-	exit ;;
-    3050*:HI-UX:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <unistd.h>
-	int
-	main ()
-	{
-	  long cpu = sysconf (_SC_CPU_VERSION);
-	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
-	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
-	     results, however.  */
-	  if (CPU_IS_PA_RISC (cpu))
-	    {
-	      switch (cpu)
-		{
-		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
-		  default: puts ("hppa-hitachi-hiuxwe2"); break;
-		}
-	    }
-	  else if (CPU_IS_HP_MC68K (cpu))
-	    puts ("m68k-hitachi-hiuxwe2");
-	  else puts ("unknown-hitachi-hiuxwe2");
-	  exit (0);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
-		{ echo "$SYSTEM_NAME"; exit; }
-	echo unknown-hitachi-hiuxwe2
-	exit ;;
-    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
-	echo hppa1.1-hp-bsd
-	exit ;;
-    9000/8??:4.3bsd:*:*)
-	echo hppa1.0-hp-bsd
-	exit ;;
-    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
-	echo hppa1.0-hp-mpeix
-	exit ;;
-    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
-	echo hppa1.1-hp-osf
-	exit ;;
-    hp8??:OSF1:*:*)
-	echo hppa1.0-hp-osf
-	exit ;;
-    i*86:OSF1:*:*)
-	if [ -x /usr/sbin/sysversion ] ; then
-	    echo ${UNAME_MACHINE}-unknown-osf1mk
-	else
-	    echo ${UNAME_MACHINE}-unknown-osf1
-	fi
-	exit ;;
-    parisc*:Lites*:*:*)
-	echo hppa1.1-hp-lites
-	exit ;;
-    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
-	echo c1-convex-bsd
-        exit ;;
-    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-        exit ;;
-    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
-	echo c34-convex-bsd
-        exit ;;
-    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
-	echo c38-convex-bsd
-        exit ;;
-    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
-	echo c4-convex-bsd
-        exit ;;
-    CRAY*Y-MP:*:*:*)
-	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*[A-Z]90:*:*:*)
-	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
-	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
-	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
-	      -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*TS:*:*:*)
-	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*T3E:*:*:*)
-	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*SV1:*:*:*)
-	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    *:UNICOS/mp:*:*)
-	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_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/ /_/'`
-        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-	exit ;;
-    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
-	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
-	exit ;;
-    sparc*:BSD/OS:*:*)
-	echo sparc-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:BSD/OS:*:*)
-	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:FreeBSD:*:*)
-	case ${UNAME_MACHINE} in
-	    pc98)
-		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    amd64)
-		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    *)
-		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	esac
-	exit ;;
-    i*:CYGWIN*:*)
-	echo ${UNAME_MACHINE}-pc-cygwin
-	exit ;;
-    *:MINGW*:*)
-	echo ${UNAME_MACHINE}-pc-mingw32
-	exit ;;
-    i*:windows32*:*)
-    	# uname -m includes "-pc" on this system.
-    	echo ${UNAME_MACHINE}-mingw32
-	exit ;;
-    i*:PW*:*)
-	echo ${UNAME_MACHINE}-pc-pw32
-	exit ;;
-    *:Interix*:*)
-    	case ${UNAME_MACHINE} in
-	    x86)
-		echo i586-pc-interix${UNAME_RELEASE}
-		exit ;;
-	    authenticamd | genuineintel | EM64T)
-		echo x86_64-unknown-interix${UNAME_RELEASE}
-		exit ;;
-	    IA64)
-		echo ia64-unknown-interix${UNAME_RELEASE}
-		exit ;;
-	esac ;;
-    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
-	echo i${UNAME_MACHINE}-pc-mks
-	exit ;;
-    8664:Windows_NT:*)
-	echo x86_64-pc-mks
-	exit ;;
-    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
-	# UNAME_MACHINE based on the output of uname instead of i386?
-	echo i586-pc-interix
-	exit ;;
-    i*:UWIN*:*)
-	echo ${UNAME_MACHINE}-pc-uwin
-	exit ;;
-    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
-	echo x86_64-unknown-cygwin
-	exit ;;
-    p*:CYGWIN*:*)
-	echo powerpcle-unknown-cygwin
-	exit ;;
-    prep*:SunOS:5.*:*)
-	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    *:GNU:*:*)
-	# the GNU system
-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-	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/[-(].*//'`-gnu
-	exit ;;
-    i*86:Minix:*:*)
-	echo ${UNAME_MACHINE}-pc-minix
-	exit ;;
-    alpha:Linux:*:*)
-	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
-	  EV5)   UNAME_MACHINE=alphaev5 ;;
-	  EV56)  UNAME_MACHINE=alphaev56 ;;
-	  PCA56) UNAME_MACHINE=alphapca56 ;;
-	  PCA57) UNAME_MACHINE=alphapca56 ;;
-	  EV6)   UNAME_MACHINE=alphaev6 ;;
-	  EV67)  UNAME_MACHINE=alphaev67 ;;
-	  EV68*) UNAME_MACHINE=alphaev68 ;;
-        esac
-	objdump --private-headers /bin/sh | grep -q ld.so.1
-	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
-	exit ;;
-    arm*:Linux:*:*)
-	eval $set_cc_for_build
-	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
-	    | grep -q __ARM_EABI__
-	then
-	    echo ${UNAME_MACHINE}-unknown-linux-gnu
-	else
-	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
-	fi
-	exit ;;
-    avr32*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    cris:Linux:*:*)
-	echo cris-axis-linux-gnu
-	exit ;;
-    crisv32:Linux:*:*)
-	echo crisv32-axis-linux-gnu
-	exit ;;
-    frv:Linux:*:*)
-    	echo frv-unknown-linux-gnu
-	exit ;;
-    i*86:Linux:*:*)
-	LIBC=gnu
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#ifdef __dietlibc__
-	LIBC=dietlibc
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
-	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
-	exit ;;
-    ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m32r*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    mips:Linux:*:* | mips64:Linux:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#undef CPU
-	#undef ${UNAME_MACHINE}
-	#undef ${UNAME_MACHINE}el
-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=${UNAME_MACHINE}el
-	#else
-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=${UNAME_MACHINE}
-	#else
-	CPU=
-	#endif
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
-	;;
-    or32:Linux:*:*)
-	echo or32-unknown-linux-gnu
-	exit ;;
-    padre:Linux:*:*)
-	echo sparc-unknown-linux-gnu
-	exit ;;
-    parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-gnu
-	exit ;;
-    parisc:Linux:*:* | hppa:Linux:*:*)
-	# Look for CPU level
-	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
-	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
-	  *)    echo hppa-unknown-linux-gnu ;;
-	esac
-	exit ;;
-    ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-gnu
-	exit ;;
-    ppc:Linux:*:*)
-	echo powerpc-unknown-linux-gnu
-	exit ;;
-    s390:Linux:*:* | s390x:Linux:*:*)
-	echo ${UNAME_MACHINE}-ibm-linux
-	exit ;;
-    sh64*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sh*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    vax:Linux:*:*)
-	echo ${UNAME_MACHINE}-dec-linux-gnu
-	exit ;;
-    x86_64:Linux:*:*)
-	echo x86_64-unknown-linux-gnu
-	exit ;;
-    xtensa*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    i*86:DYNIX/ptx:4*:*)
-	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
-	# earlier versions are messed up and put the nodename in both
-	# sysname and nodename.
-	echo i386-sequent-sysv4
-	exit ;;
-    i*86:UNIX_SV:4.2MP:2.*)
-        # Unixware is an offshoot of SVR4, but it has its own version
-        # number series starting with 2...
-        # I am not positive that other SVR4 systems won't match this,
-	# I just have to hope.  -- rms.
-        # Use sysv4.2uw... so that sysv4* matches it.
-	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
-	exit ;;
-    i*86:OS/2:*:*)
-	# If we were able to find `uname', then EMX Unix compatibility
-	# is probably installed.
-	echo ${UNAME_MACHINE}-pc-os2-emx
-	exit ;;
-    i*86:XTS-300:*:STOP)
-	echo ${UNAME_MACHINE}-unknown-stop
-	exit ;;
-    i*86:atheos:*:*)
-	echo ${UNAME_MACHINE}-unknown-atheos
-	exit ;;
-    i*86:syllable:*:*)
-	echo ${UNAME_MACHINE}-pc-syllable
-	exit ;;
-    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
-	echo i386-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    i*86:*DOS:*:*)
-	echo ${UNAME_MACHINE}-pc-msdosdjgpp
-	exit ;;
-    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
-	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
-	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
-		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
-	else
-		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
-	fi
-	exit ;;
-    i*86:*:5:[678]*)
-    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
-	case `/bin/uname -X | grep "^Machine"` in
-	    *486*)	     UNAME_MACHINE=i486 ;;
-	    *Pentium)	     UNAME_MACHINE=i586 ;;
-	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
-	esac
-	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
-	exit ;;
-    i*86:*:3.2:*)
-	if test -f /usr/options/cb.name; then
-		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
-		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
-	elif /bin/uname -X 2>/dev/null >/dev/null ; then
-		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
-		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
-		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
-			&& UNAME_MACHINE=i586
-		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
-	else
-		echo ${UNAME_MACHINE}-pc-sysv32
-	fi
-	exit ;;
-    pc:*:*:*)
-	# Left here for compatibility:
-        # 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
-	# this is a cross-build.
-	echo i586-pc-msdosdjgpp
-        exit ;;
-    Intel:Mach:3*:*)
-	echo i386-pc-mach3
-	exit ;;
-    paragon:*:*:*)
-	echo i860-intel-osf1
-	exit ;;
-    i860:*:4.*:*) # i860-SVR4
-	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
-	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
-	else # Add other i860-SVR4 vendors below as they are discovered.
-	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
-	fi
-	exit ;;
-    mini*:CTIX:SYS*5:*)
-	# "miniframe"
-	echo m68010-convergent-sysv
-	exit ;;
-    mc68k:UNIX:SYSTEM5:3.51m)
-	echo m68k-convergent-sysv
-	exit ;;
-    M680?0:D-NIX:5.3:*)
-	echo m68k-diab-dnix
-	exit ;;
-    M68*:*:R3V[5678]*:*)
-	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
-    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
-	OS_REL=''
-	test -r /etc/.relid \
-	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-          && { echo i486-ncr-sysv4; exit; } ;;
-    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
-	OS_REL='.3'
-	test -r /etc/.relid \
-	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
-	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
-	echo m68k-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    mc68030:UNIX_System_V:4.*:*)
-	echo m68k-atari-sysv4
-	exit ;;
-    TSUNAMI:LynxOS:2.*:*)
-	echo sparc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    rs6000:LynxOS:2.*:*)
-	echo rs6000-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
-	echo powerpc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    SM[BE]S:UNIX_SV:*:*)
-	echo mips-dde-sysv${UNAME_RELEASE}
-	exit ;;
-    RM*:ReliantUNIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    RM*:SINIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    *:SINIX-*:*:*)
-	if uname -p 2>/dev/null >/dev/null ; then
-		UNAME_MACHINE=`(uname -p) 2>/dev/null`
-		echo ${UNAME_MACHINE}-sni-sysv4
-	else
-		echo ns32k-sni-sysv
-	fi
-	exit ;;
-    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-                      # says <Richard.M.Bartel@ccMail.Census.GOV>
-        echo i586-unisys-sysv4
-        exit ;;
-    *:UNIX_System_V:4*:FTX*)
-	# From Gerald Hewes <hewes@openmarket.com>.
-	# How about differentiating between stratus architectures? -djm
-	echo hppa1.1-stratus-sysv4
-	exit ;;
-    *:*:*:FTX*)
-	# From seanf@swdc.stratus.com.
-	echo i860-stratus-sysv4
-	exit ;;
-    i*86:VOS:*:*)
-	# From Paul.Green@stratus.com.
-	echo ${UNAME_MACHINE}-stratus-vos
-	exit ;;
-    *:VOS:*:*)
-	# From Paul.Green@stratus.com.
-	echo hppa1.1-stratus-vos
-	exit ;;
-    mc68*:A/UX:*:*)
-	echo m68k-apple-aux${UNAME_RELEASE}
-	exit ;;
-    news*:NEWS-OS:6*:*)
-	echo mips-sony-newsos6
-	exit ;;
-    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
-	if [ -d /usr/nec ]; then
-	        echo mips-nec-sysv${UNAME_RELEASE}
-	else
-	        echo mips-unknown-sysv${UNAME_RELEASE}
-	fi
-        exit ;;
-    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
-	echo powerpc-be-beos
-	exit ;;
-    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
-	echo powerpc-apple-beos
-	exit ;;
-    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
-	echo i586-pc-beos
-	exit ;;
-    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
-	echo i586-pc-haiku
-	exit ;;
-    SX-4:SUPER-UX:*:*)
-	echo sx4-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-5:SUPER-UX:*:*)
-	echo sx5-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-6:SUPER-UX:*:*)
-	echo sx6-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-7:SUPER-UX:*:*)
-	echo sx7-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-8:SUPER-UX:*:*)
-	echo sx8-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-8R:SUPER-UX:*:*)
-	echo sx8r-nec-superux${UNAME_RELEASE}
-	exit ;;
-    Power*:Rhapsody:*:*)
-	echo powerpc-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Rhapsody:*:*)
-	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Darwin:*:*)
-	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-	case $UNAME_PROCESSOR in
-	    i386)
-		eval $set_cc_for_build
-		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) | \
-		      grep IS_64BIT_ARCH >/dev/null
-		  then
-		      UNAME_PROCESSOR="x86_64"
-		  fi
-		fi ;;
-	    unknown) UNAME_PROCESSOR=powerpc ;;
-	esac
-	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
-	exit ;;
-    *:procnto*:*:* | *:QNX:[0123456789]*:*)
-	UNAME_PROCESSOR=`uname -p`
-	if test "$UNAME_PROCESSOR" = "x86"; then
-		UNAME_PROCESSOR=i386
-		UNAME_MACHINE=pc
-	fi
-	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
-	exit ;;
-    *:QNX:*:4*)
-	echo i386-pc-qnx
-	exit ;;
-    NSE-?:NONSTOP_KERNEL:*:*)
-	echo nse-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    NSR-?:NONSTOP_KERNEL:*:*)
-	echo nsr-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    *:NonStop-UX:*:*)
-	echo mips-compaq-nonstopux
-	exit ;;
-    BS2000:POSIX*:*:*)
-	echo bs2000-siemens-sysv
-	exit ;;
-    DS/*:UNIX_System_V:*:*)
-	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
-	exit ;;
-    *:Plan9:*:*)
-	# "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
-	    UNAME_MACHINE=i386
-	else
-	    UNAME_MACHINE="$cputype"
-	fi
-	echo ${UNAME_MACHINE}-unknown-plan9
-	exit ;;
-    *:TOPS-10:*:*)
-	echo pdp10-unknown-tops10
-	exit ;;
-    *:TENEX:*:*)
-	echo pdp10-unknown-tenex
-	exit ;;
-    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
-	echo pdp10-dec-tops20
-	exit ;;
-    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
-	echo pdp10-xkl-tops20
-	exit ;;
-    *:TOPS-20:*:*)
-	echo pdp10-unknown-tops20
-	exit ;;
-    *:ITS:*:*)
-	echo pdp10-unknown-its
-	exit ;;
-    SEI:*:*:SEIUX)
-        echo mips-sei-seiux${UNAME_RELEASE}
-	exit ;;
-    *:DragonFly:*:*)
-	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
-	exit ;;
-    *:*VMS:*:*)
-    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
-	case "${UNAME_MACHINE}" in
-	    A*) echo alpha-dec-vms ; exit ;;
-	    I*) echo ia64-dec-vms ; exit ;;
-	    V*) echo vax-dec-vms ; exit ;;
-	esac ;;
-    *:XENIX:*:SysV)
-	echo i386-pc-xenix
-	exit ;;
-    i*86:skyos:*:*)
-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
-	exit ;;
-    i*86:rdos:*:*)
-	echo ${UNAME_MACHINE}-pc-rdos
-	exit ;;
-    i*86:AROS:*:*)
-	echo ${UNAME_MACHINE}-pc-aros
-	exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-          "4"
-#else
-	  ""
-#endif
-         ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
-	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    c34*)
-	echo c34-convex-bsd
-	exit ;;
-    c38*)
-	echo c38-convex-bsd
-	exit ;;
-    c4*)
-	echo c4-convex-bsd
-	exit ;;
-    esac
-fi
-
-cat >&2 <<EOF
-$0: unable to guess system type
-
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
-
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
-and
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches@gnu.org> in order to provide the needed
-information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
-
-hostinfo               = `(hostinfo) 2>/dev/null`
-/bin/universe          = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch              = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
-
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM  = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
-EOF
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/cloog-0.17.0/isl/config.sub b/cloog-0.17.0/isl/config.sub
deleted file mode 100755
index c2d1257..0000000
--- a/cloog-0.17.0/isl/config.sub
+++ /dev/null
@@ -1,1714 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-#   Free Software Foundation, Inc.
-
-timestamp='2010-01-22'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# 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
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted GNU ChangeLog entry.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support.  The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help"
-       exit 1 ;;
-
-    *local*)
-       # First pass through any local machine types.
-       echo $1
-       exit ;;
-
-    * )
-       break ;;
-  esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
-    exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
-    exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
-  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
-  kopensolaris*-gnu* | \
-  storm-chaos* | os2-emx* | rtmk-nova*)
-    os=-$maybe_os
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
-    ;;
-  *)
-    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
-    if [ $basic_machine != $1 ]
-    then os=`echo $1 | sed 's/.*-/-/'`
-    else os=; fi
-    ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work.  We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
-	-sun*os*)
-		# Prevent following clause from handling this invalid input.
-		;;
-	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis | -knuth | -cray | -microblaze)
-		os=
-		basic_machine=$1
-		;;
-        -bluegene*)
-	        os=-cnk
-		;;
-	-sim | -cisco | -oki | -wec | -winbond)
-		os=
-		basic_machine=$1
-		;;
-	-scout)
-		;;
-	-wrs)
-		os=-vxworks
-		basic_machine=$1
-		;;
-	-chorusos*)
-		os=-chorusos
-		basic_machine=$1
-		;;
- 	-chorusrdb)
- 		os=-chorusrdb
-		basic_machine=$1
- 		;;
-	-hiux*)
-		os=-hiuxwe2
-		;;
-	-sco6)
-		os=-sco5v6
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5)
-		os=-sco3.2v5
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco4)
-		os=-sco3.2v4
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2.[4-9]*)
-		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2v[4-9]*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5v6*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco*)
-		os=-sco3.2v2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-udk*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-isc)
-		os=-isc2.2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-clix*)
-		basic_machine=clipper-intergraph
-		;;
-	-isc*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-lynx*)
-		os=-lynxos
-		;;
-	-ptx*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
-		;;
-	-windowsnt*)
-		os=`echo $os | sed -e 's/windowsnt/winnt/'`
-		;;
-	-psos*)
-		os=-psos
-		;;
-	-mint | -mint[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
-	# Recognize the basic CPU types without company name.
-	# Some are omitted here because they have special meanings below.
-	1750a | 580 \
-	| a29k \
-	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
-	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
-	| am33_2.0 \
-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
-	| bfin \
-	| c4x | clipper \
-	| d10v | d30v | dlx | dsp16xx \
-	| fido | fr30 | frv \
-	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
-	| i370 | i860 | i960 | ia64 \
-	| ip2k | iq2000 \
-	| lm32 \
-	| m32c | m32r | m32rle | m68000 | m68k | m88k \
-	| maxq | mb | microblaze | mcore | mep | metag \
-	| mips | mipsbe | mipseb | mipsel | mipsle \
-	| mips16 \
-	| mips64 | mips64el \
-	| mips64octeon | mips64octeonel \
-	| mips64orion | mips64orionel \
-	| mips64r5900 | mips64r5900el \
-	| mips64vr | mips64vrel \
-	| mips64vr4100 | mips64vr4100el \
-	| mips64vr4300 | mips64vr4300el \
-	| mips64vr5000 | mips64vr5000el \
-	| mips64vr5900 | mips64vr5900el \
-	| mipsisa32 | mipsisa32el \
-	| mipsisa32r2 | mipsisa32r2el \
-	| mipsisa64 | mipsisa64el \
-	| mipsisa64r2 | mipsisa64r2el \
-	| mipsisa64sb1 | mipsisa64sb1el \
-	| mipsisa64sr71k | mipsisa64sr71kel \
-	| mipstx39 | mipstx39el \
-	| mn10200 | mn10300 \
-	| moxie \
-	| mt \
-	| msp430 \
-	| nios | nios2 \
-	| ns16k | ns32k \
-	| or32 \
-	| pdp10 | pdp11 | pj | pjl \
-	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
-	| pyramid \
-	| rx \
-	| score \
-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
-	| sh64 | sh64le \
-	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
-	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-	| spu | strongarm \
-	| tahoe | thumb | tic4x | tic80 | tron \
-	| ubicom32 \
-	| v850 | v850e \
-	| we32k \
-	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
-	| z8k | z80)
-		basic_machine=$basic_machine-unknown
-		;;
-	m6811 | m68hc11 | m6812 | m68hc12 | picochip)
-		# Motorola 68HC11/12.
-		basic_machine=$basic_machine-unknown
-		os=-none
-		;;
-	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
-		;;
-	ms1)
-		basic_machine=mt-unknown
-		;;
-
-	# We use `pc' rather than `unknown'
-	# because (1) that's what they normally are, and
-	# (2) the word "unknown" tends to confuse beginning users.
-	i*86 | x86_64)
-	  basic_machine=$basic_machine-pc
-	  ;;
-	# Object if more than one company name word.
-	*-*-*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-	# Recognize the basic CPU types with company name.
-	580-* \
-	| a29k-* \
-	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
-	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
-	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
-	| avr-* | avr32-* \
-	| bfin-* | bs2000-* \
-	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
-	| clipper-* | craynv-* | cydra-* \
-	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
-	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
-	| h8300-* | h8500-* \
-	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
-	| i*86-* | i860-* | i960-* | ia64-* \
-	| ip2k-* | iq2000-* \
-	| lm32-* \
-	| m32c-* | m32r-* | m32rle-* \
-	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
-	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
-	| mips16-* \
-	| mips64-* | mips64el-* \
-	| mips64octeon-* | mips64octeonel-* \
-	| mips64orion-* | mips64orionel-* \
-	| mips64r5900-* | mips64r5900el-* \
-	| mips64vr-* | mips64vrel-* \
-	| mips64vr4100-* | mips64vr4100el-* \
-	| mips64vr4300-* | mips64vr4300el-* \
-	| mips64vr5000-* | mips64vr5000el-* \
-	| mips64vr5900-* | mips64vr5900el-* \
-	| mipsisa32-* | mipsisa32el-* \
-	| mipsisa32r2-* | mipsisa32r2el-* \
-	| mipsisa64-* | mipsisa64el-* \
-	| mipsisa64r2-* | mipsisa64r2el-* \
-	| mipsisa64sb1-* | mipsisa64sb1el-* \
-	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
-	| mipstx39-* | mipstx39el-* \
-	| mmix-* \
-	| mt-* \
-	| msp430-* \
-	| nios-* | nios2-* \
-	| none-* | np1-* | ns16k-* | ns32k-* \
-	| orion-* \
-	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
-	| pyramid-* \
-	| romp-* | rs6000-* | rx-* \
-	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
-	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
-	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
-	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
-	| tahoe-* | thumb-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
-	| tile-* | tilegx-* \
-	| tron-* \
-	| ubicom32-* \
-	| v850-* | v850e-* | vax-* \
-	| we32k-* \
-	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
-	| xstormy16-* | xtensa*-* \
-	| ymp-* \
-	| z8k-* | z80-*)
-		;;
-	# Recognize the basic CPU types without company name, with glob match.
-	xtensa*)
-		basic_machine=$basic_machine-unknown
-		;;
-	# Recognize the various machine names and aliases which stand
-	# for a CPU type and a company and sometimes even an OS.
-	386bsd)
-		basic_machine=i386-unknown
-		os=-bsd
-		;;
-	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
-		basic_machine=m68000-att
-		;;
-	3b*)
-		basic_machine=we32k-att
-		;;
-	a29khif)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-    	abacus)
-		basic_machine=abacus-unknown
-		;;
-	adobe68k)
-		basic_machine=m68010-adobe
-		os=-scout
-		;;
-	alliant | fx80)
-		basic_machine=fx80-alliant
-		;;
-	altos | altos3068)
-		basic_machine=m68k-altos
-		;;
-	am29k)
-		basic_machine=a29k-none
-		os=-bsd
-		;;
-	amd64)
-		basic_machine=x86_64-pc
-		;;
-	amd64-*)
-		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	amdahl)
-		basic_machine=580-amdahl
-		os=-sysv
-		;;
-	amiga | amiga-*)
-		basic_machine=m68k-unknown
-		;;
-	amigaos | amigados)
-		basic_machine=m68k-unknown
-		os=-amigaos
-		;;
-	amigaunix | amix)
-		basic_machine=m68k-unknown
-		os=-sysv4
-		;;
-	apollo68)
-		basic_machine=m68k-apollo
-		os=-sysv
-		;;
-	apollo68bsd)
-		basic_machine=m68k-apollo
-		os=-bsd
-		;;
-	aros)
-		basic_machine=i386-pc
-		os=-aros
-		;;
-	aux)
-		basic_machine=m68k-apple
-		os=-aux
-		;;
-	balance)
-		basic_machine=ns32k-sequent
-		os=-dynix
-		;;
-	blackfin)
-		basic_machine=bfin-unknown
-		os=-linux
-		;;
-	blackfin-*)
-		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	bluegene*)
-		basic_machine=powerpc-ibm
-		os=-cnk
-		;;
-	c90)
-		basic_machine=c90-cray
-		os=-unicos
-		;;
-        cegcc)
-		basic_machine=arm-unknown
-		os=-cegcc
-		;;
-	convex-c1)
-		basic_machine=c1-convex
-		os=-bsd
-		;;
-	convex-c2)
-		basic_machine=c2-convex
-		os=-bsd
-		;;
-	convex-c32)
-		basic_machine=c32-convex
-		os=-bsd
-		;;
-	convex-c34)
-		basic_machine=c34-convex
-		os=-bsd
-		;;
-	convex-c38)
-		basic_machine=c38-convex
-		os=-bsd
-		;;
-	cray | j90)
-		basic_machine=j90-cray
-		os=-unicos
-		;;
-	craynv)
-		basic_machine=craynv-cray
-		os=-unicosmp
-		;;
-	cr16)
-		basic_machine=cr16-unknown
-		os=-elf
-		;;
-	crds | unos)
-		basic_machine=m68k-crds
-		;;
-	crisv32 | crisv32-* | etraxfs*)
-		basic_machine=crisv32-axis
-		;;
-	cris | cris-* | etrax*)
-		basic_machine=cris-axis
-		;;
-	crx)
-		basic_machine=crx-unknown
-		os=-elf
-		;;
-	da30 | da30-*)
-		basic_machine=m68k-da30
-		;;
-	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
-		basic_machine=mips-dec
-		;;
-	decsystem10* | dec10*)
-		basic_machine=pdp10-dec
-		os=-tops10
-		;;
-	decsystem20* | dec20*)
-		basic_machine=pdp10-dec
-		os=-tops20
-		;;
-	delta | 3300 | motorola-3300 | motorola-delta \
-	      | 3300-motorola | delta-motorola)
-		basic_machine=m68k-motorola
-		;;
-	delta88)
-		basic_machine=m88k-motorola
-		os=-sysv3
-		;;
-	dicos)
-		basic_machine=i686-pc
-		os=-dicos
-		;;
-	djgpp)
-		basic_machine=i586-pc
-		os=-msdosdjgpp
-		;;
-	dpx20 | dpx20-*)
-		basic_machine=rs6000-bull
-		os=-bosx
-		;;
-	dpx2* | dpx2*-bull)
-		basic_machine=m68k-bull
-		os=-sysv3
-		;;
-	ebmon29k)
-		basic_machine=a29k-amd
-		os=-ebmon
-		;;
-	elxsi)
-		basic_machine=elxsi-elxsi
-		os=-bsd
-		;;
-	encore | umax | mmax)
-		basic_machine=ns32k-encore
-		;;
-	es1800 | OSE68k | ose68k | ose | OSE)
-		basic_machine=m68k-ericsson
-		os=-ose
-		;;
-	fx2800)
-		basic_machine=i860-alliant
-		;;
-	genix)
-		basic_machine=ns32k-ns
-		;;
-	gmicro)
-		basic_machine=tron-gmicro
-		os=-sysv
-		;;
-	go32)
-		basic_machine=i386-pc
-		os=-go32
-		;;
-	h3050r* | hiux*)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	h8300hms)
-		basic_machine=h8300-hitachi
-		os=-hms
-		;;
-	h8300xray)
-		basic_machine=h8300-hitachi
-		os=-xray
-		;;
-	h8500hms)
-		basic_machine=h8500-hitachi
-		os=-hms
-		;;
-	harris)
-		basic_machine=m88k-harris
-		os=-sysv3
-		;;
-	hp300-*)
-		basic_machine=m68k-hp
-		;;
-	hp300bsd)
-		basic_machine=m68k-hp
-		os=-bsd
-		;;
-	hp300hpux)
-		basic_machine=m68k-hp
-		os=-hpux
-		;;
-	hp3k9[0-9][0-9] | hp9[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k2[0-9][0-9] | hp9k31[0-9])
-		basic_machine=m68000-hp
-		;;
-	hp9k3[2-9][0-9])
-		basic_machine=m68k-hp
-		;;
-	hp9k6[0-9][0-9] | hp6[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k7[0-79][0-9] | hp7[0-79][0-9])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k78[0-9] | hp78[0-9])
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][13679] | hp8[0-9][13679])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][0-9] | hp8[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hppa-next)
-		os=-nextstep3
-		;;
-	hppaosf)
-		basic_machine=hppa1.1-hp
-		os=-osf
-		;;
-	hppro)
-		basic_machine=hppa1.1-hp
-		os=-proelf
-		;;
-	i370-ibm* | ibm*)
-		basic_machine=i370-ibm
-		;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
-	i*86v32)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv32
-		;;
-	i*86v4*)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv4
-		;;
-	i*86v)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv
-		;;
-	i*86sol2)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-solaris2
-		;;
-	i386mach)
-		basic_machine=i386-mach
-		os=-mach
-		;;
-	i386-vsta | vsta)
-		basic_machine=i386-unknown
-		os=-vsta
-		;;
-	iris | iris4d)
-		basic_machine=mips-sgi
-		case $os in
-		    -irix*)
-			;;
-		    *)
-			os=-irix4
-			;;
-		esac
-		;;
-	isi68 | isi)
-		basic_machine=m68k-isi
-		os=-sysv
-		;;
-	m68knommu)
-		basic_machine=m68k-unknown
-		os=-linux
-		;;
-	m68knommu-*)
-		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	m88k-omron*)
-		basic_machine=m88k-omron
-		;;
-	magnum | m3230)
-		basic_machine=mips-mips
-		os=-sysv
-		;;
-	merlin)
-		basic_machine=ns32k-utek
-		os=-sysv
-		;;
-        microblaze)
-		basic_machine=microblaze-xilinx
-		;;
-	mingw32)
-		basic_machine=i386-pc
-		os=-mingw32
-		;;
-	mingw32ce)
-		basic_machine=arm-unknown
-		os=-mingw32ce
-		;;
-	miniframe)
-		basic_machine=m68000-convergent
-		;;
-	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-	mips3*-*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
-		;;
-	mips3*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
-		;;
-	monitor)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	morphos)
-		basic_machine=powerpc-unknown
-		os=-morphos
-		;;
-	msdos)
-		basic_machine=i386-pc
-		os=-msdos
-		;;
-	ms1-*)
-		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
-		;;
-	mvs)
-		basic_machine=i370-ibm
-		os=-mvs
-		;;
-	ncr3000)
-		basic_machine=i486-ncr
-		os=-sysv4
-		;;
-	netbsd386)
-		basic_machine=i386-unknown
-		os=-netbsd
-		;;
-	netwinder)
-		basic_machine=armv4l-rebel
-		os=-linux
-		;;
-	news | news700 | news800 | news900)
-		basic_machine=m68k-sony
-		os=-newsos
-		;;
-	news1000)
-		basic_machine=m68030-sony
-		os=-newsos
-		;;
-	news-3600 | risc-news)
-		basic_machine=mips-sony
-		os=-newsos
-		;;
-	necv70)
-		basic_machine=v70-nec
-		os=-sysv
-		;;
-	next | m*-next )
-		basic_machine=m68k-next
-		case $os in
-		    -nextstep* )
-			;;
-		    -ns2*)
-		      os=-nextstep2
-			;;
-		    *)
-		      os=-nextstep3
-			;;
-		esac
-		;;
-	nh3000)
-		basic_machine=m68k-harris
-		os=-cxux
-		;;
-	nh[45]000)
-		basic_machine=m88k-harris
-		os=-cxux
-		;;
-	nindy960)
-		basic_machine=i960-intel
-		os=-nindy
-		;;
-	mon960)
-		basic_machine=i960-intel
-		os=-mon960
-		;;
-	nonstopux)
-		basic_machine=mips-compaq
-		os=-nonstopux
-		;;
-	np1)
-		basic_machine=np1-gould
-		;;
-	nsr-tandem)
-		basic_machine=nsr-tandem
-		;;
-	op50n-* | op60c-*)
-		basic_machine=hppa1.1-oki
-		os=-proelf
-		;;
-	openrisc | openrisc-*)
-		basic_machine=or32-unknown
-		;;
-	os400)
-		basic_machine=powerpc-ibm
-		os=-os400
-		;;
-	OSE68000 | ose68000)
-		basic_machine=m68000-ericsson
-		os=-ose
-		;;
-	os68k)
-		basic_machine=m68k-none
-		os=-os68k
-		;;
-	pa-hitachi)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	paragon)
-		basic_machine=i860-intel
-		os=-osf
-		;;
-	parisc)
-		basic_machine=hppa-unknown
-		os=-linux
-		;;
-	parisc-*)
-		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	pbd)
-		basic_machine=sparc-tti
-		;;
-	pbb)
-		basic_machine=m68k-tti
-		;;
-	pc532 | pc532-*)
-		basic_machine=ns32k-pc532
-		;;
-	pc98)
-		basic_machine=i386-pc
-		;;
-	pc98-*)
-		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium | p5 | k5 | k6 | nexgen | viac3)
-		basic_machine=i586-pc
-		;;
-	pentiumpro | p6 | 6x86 | athlon | athlon_*)
-		basic_machine=i686-pc
-		;;
-	pentiumii | pentium2 | pentiumiii | pentium3)
-		basic_machine=i686-pc
-		;;
-	pentium4)
-		basic_machine=i786-pc
-		;;
-	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
-		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumpro-* | p6-* | 6x86-* | athlon-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium4-*)
-		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pn)
-		basic_machine=pn-gould
-		;;
-	power)	basic_machine=power-ibm
-		;;
-	ppc)	basic_machine=powerpc-unknown
-		;;
-	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppcle | powerpclittle | ppc-le | powerpc-little)
-		basic_machine=powerpcle-unknown
-		;;
-	ppcle-* | powerpclittle-*)
-		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64)	basic_machine=powerpc64-unknown
-		;;
-	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
-		basic_machine=powerpc64le-unknown
-		;;
-	ppc64le-* | powerpc64little-*)
-		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ps2)
-		basic_machine=i386-ibm
-		;;
-	pw32)
-		basic_machine=i586-unknown
-		os=-pw32
-		;;
-	rdos)
-		basic_machine=i386-pc
-		os=-rdos
-		;;
-	rom68k)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	rm[46]00)
-		basic_machine=mips-siemens
-		;;
-	rtpc | rtpc-*)
-		basic_machine=romp-ibm
-		;;
-	s390 | s390-*)
-		basic_machine=s390-ibm
-		;;
-	s390x | s390x-*)
-		basic_machine=s390x-ibm
-		;;
-	sa29200)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	sb1)
-		basic_machine=mipsisa64sb1-unknown
-		;;
-	sb1el)
-		basic_machine=mipsisa64sb1el-unknown
-		;;
-	sde)
-		basic_machine=mipsisa32-sde
-		os=-elf
-		;;
-	sei)
-		basic_machine=mips-sei
-		os=-seiux
-		;;
-	sequent)
-		basic_machine=i386-sequent
-		;;
-	sh)
-		basic_machine=sh-hitachi
-		os=-hms
-		;;
-	sh5el)
-		basic_machine=sh5le-unknown
-		;;
-	sh64)
-		basic_machine=sh64-unknown
-		;;
-	sparclite-wrs | simso-wrs)
-		basic_machine=sparclite-wrs
-		os=-vxworks
-		;;
-	sps7)
-		basic_machine=m68k-bull
-		os=-sysv2
-		;;
-	spur)
-		basic_machine=spur-unknown
-		;;
-	st2000)
-		basic_machine=m68k-tandem
-		;;
-	stratus)
-		basic_machine=i860-stratus
-		os=-sysv4
-		;;
-	sun2)
-		basic_machine=m68000-sun
-		;;
-	sun2os3)
-		basic_machine=m68000-sun
-		os=-sunos3
-		;;
-	sun2os4)
-		basic_machine=m68000-sun
-		os=-sunos4
-		;;
-	sun3os3)
-		basic_machine=m68k-sun
-		os=-sunos3
-		;;
-	sun3os4)
-		basic_machine=m68k-sun
-		os=-sunos4
-		;;
-	sun4os3)
-		basic_machine=sparc-sun
-		os=-sunos3
-		;;
-	sun4os4)
-		basic_machine=sparc-sun
-		os=-sunos4
-		;;
-	sun4sol2)
-		basic_machine=sparc-sun
-		os=-solaris2
-		;;
-	sun3 | sun3-*)
-		basic_machine=m68k-sun
-		;;
-	sun4)
-		basic_machine=sparc-sun
-		;;
-	sun386 | sun386i | roadrunner)
-		basic_machine=i386-sun
-		;;
-	sv1)
-		basic_machine=sv1-cray
-		os=-unicos
-		;;
-	symmetry)
-		basic_machine=i386-sequent
-		os=-dynix
-		;;
-	t3e)
-		basic_machine=alphaev5-cray
-		os=-unicos
-		;;
-	t90)
-		basic_machine=t90-cray
-		os=-unicos
-		;;
-	tic54x | c54x*)
-		basic_machine=tic54x-unknown
-		os=-coff
-		;;
-	tic55x | c55x*)
-		basic_machine=tic55x-unknown
-		os=-coff
-		;;
-	tic6x | c6x*)
-		basic_machine=tic6x-unknown
-		os=-coff
-		;;
-        # This must be matched before tile*.
-        tilegx*)
-		basic_machine=tilegx-unknown
-		os=-linux-gnu
-		;;
-	tile*)
-		basic_machine=tile-unknown
-		os=-linux-gnu
-		;;
-	tx39)
-		basic_machine=mipstx39-unknown
-		;;
-	tx39el)
-		basic_machine=mipstx39el-unknown
-		;;
-	toad1)
-		basic_machine=pdp10-xkl
-		os=-tops20
-		;;
-	tower | tower-32)
-		basic_machine=m68k-ncr
-		;;
-	tpf)
-		basic_machine=s390x-ibm
-		os=-tpf
-		;;
-	udi29k)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	ultra3)
-		basic_machine=a29k-nyu
-		os=-sym1
-		;;
-	v810 | necv810)
-		basic_machine=v810-nec
-		os=-none
-		;;
-	vaxv)
-		basic_machine=vax-dec
-		os=-sysv
-		;;
-	vms)
-		basic_machine=vax-dec
-		os=-vms
-		;;
-	vpp*|vx|vx-*)
-		basic_machine=f301-fujitsu
-		;;
-	vxworks960)
-		basic_machine=i960-wrs
-		os=-vxworks
-		;;
-	vxworks68)
-		basic_machine=m68k-wrs
-		os=-vxworks
-		;;
-	vxworks29k)
-		basic_machine=a29k-wrs
-		os=-vxworks
-		;;
-	w65*)
-		basic_machine=w65-wdc
-		os=-none
-		;;
-	w89k-*)
-		basic_machine=hppa1.1-winbond
-		os=-proelf
-		;;
-	xbox)
-		basic_machine=i686-pc
-		os=-mingw32
-		;;
-	xps | xps100)
-		basic_machine=xps100-honeywell
-		;;
-	ymp)
-		basic_machine=ymp-cray
-		os=-unicos
-		;;
-	z8k-*-coff)
-		basic_machine=z8k-unknown
-		os=-sim
-		;;
-	z80-*-coff)
-		basic_machine=z80-unknown
-		os=-sim
-		;;
-	none)
-		basic_machine=none-none
-		os=-none
-		;;
-
-# Here we handle the default manufacturer of certain CPU types.  It is in
-# some cases the only manufacturer, in others, it is the most popular.
-	w89k)
-		basic_machine=hppa1.1-winbond
-		;;
-	op50n)
-		basic_machine=hppa1.1-oki
-		;;
-	op60c)
-		basic_machine=hppa1.1-oki
-		;;
-	romp)
-		basic_machine=romp-ibm
-		;;
-	mmix)
-		basic_machine=mmix-knuth
-		;;
-	rs6000)
-		basic_machine=rs6000-ibm
-		;;
-	vax)
-		basic_machine=vax-dec
-		;;
-	pdp10)
-		# there are many clones, so DEC is not a safe bet
-		basic_machine=pdp10-unknown
-		;;
-	pdp11)
-		basic_machine=pdp11-dec
-		;;
-	we32k)
-		basic_machine=we32k-att
-		;;
-	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
-		basic_machine=sh-unknown
-		;;
-	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
-		basic_machine=sparc-sun
-		;;
-	cydra)
-		basic_machine=cydra-cydrome
-		;;
-	orion)
-		basic_machine=orion-highlevel
-		;;
-	orion105)
-		basic_machine=clipper-highlevel
-		;;
-	mac | mpw | mac-mpw)
-		basic_machine=m68k-apple
-		;;
-	pmac | pmac-mpw)
-		basic_machine=powerpc-apple
-		;;
-	*-unknown)
-		# Make sure to match an already-canonicalized machine name.
-		;;
-	*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
-	*-digital*)
-		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
-		;;
-	*-commodore*)
-		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
-		;;
-	*)
-		;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
-        # First match some system type aliases
-        # that might get confused with valid system types.
-	# -solaris* is a basic system type, with this one exception.
-        -auroraux)
-	        os=-auroraux
-		;;
-	-solaris1 | -solaris1.*)
-		os=`echo $os | sed -e 's|solaris1|sunos4|'`
-		;;
-	-solaris)
-		os=-solaris2
-		;;
-	-svr4*)
-		os=-sysv4
-		;;
-	-unixware*)
-		os=-sysv4.2uw
-		;;
-	-gnu/linux*)
-		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
-		;;
-	# First accept the basic system types.
-	# The portable systems comes first.
-	# Each alternative MUST END IN A *, to match a version number.
-	# -sysv* is not here because it comes later, after sysvr4.
-	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
-	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
-	      | -sym* | -kopensolaris* \
-	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* | -aros* \
-	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
-	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
-	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -openbsd* | -solidbsd* \
-	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
-	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
-	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
-	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-	      | -chorusos* | -chorusrdb* | -cegcc* \
-	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
-	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
-	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
-	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
-	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
-	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
-	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
-	# Remember, each alternative MUST END IN *, to match a version number.
-		;;
-	-qnx*)
-		case $basic_machine in
-		    x86-* | i*86-*)
-			;;
-		    *)
-			os=-nto$os
-			;;
-		esac
-		;;
-	-nto-qnx*)
-		;;
-	-nto*)
-		os=`echo $os | sed -e 's|nto|nto-qnx|'`
-		;;
-	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
-	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
-	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
-		;;
-	-mac*)
-		os=`echo $os | sed -e 's|mac|macos|'`
-		;;
-	-linux-dietlibc)
-		os=-linux-dietlibc
-		;;
-	-linux*)
-		os=`echo $os | sed -e 's|linux|linux-gnu|'`
-		;;
-	-sunos5*)
-		os=`echo $os | sed -e 's|sunos5|solaris2|'`
-		;;
-	-sunos6*)
-		os=`echo $os | sed -e 's|sunos6|solaris3|'`
-		;;
-	-opened*)
-		os=-openedition
-		;;
-        -os400*)
-		os=-os400
-		;;
-	-wince*)
-		os=-wince
-		;;
-	-osfrose*)
-		os=-osfrose
-		;;
-	-osf*)
-		os=-osf
-		;;
-	-utek*)
-		os=-bsd
-		;;
-	-dynix*)
-		os=-bsd
-		;;
-	-acis*)
-		os=-aos
-		;;
-	-atheos*)
-		os=-atheos
-		;;
-	-syllable*)
-		os=-syllable
-		;;
-	-386bsd)
-		os=-bsd
-		;;
-	-ctix* | -uts*)
-		os=-sysv
-		;;
-	-nova*)
-		os=-rtmk-nova
-		;;
-	-ns2 )
-		os=-nextstep2
-		;;
-	-nsk*)
-		os=-nsk
-		;;
-	# Preserve the version number of sinix5.
-	-sinix5.*)
-		os=`echo $os | sed -e 's|sinix|sysv|'`
-		;;
-	-sinix*)
-		os=-sysv4
-		;;
-        -tpf*)
-		os=-tpf
-		;;
-	-triton*)
-		os=-sysv3
-		;;
-	-oss*)
-		os=-sysv3
-		;;
-	-svr4)
-		os=-sysv4
-		;;
-	-svr3)
-		os=-sysv3
-		;;
-	-sysvr4)
-		os=-sysv4
-		;;
-	# This must come after -sysvr4.
-	-sysv*)
-		;;
-	-ose*)
-		os=-ose
-		;;
-	-es1800*)
-		os=-ose
-		;;
-	-xenix)
-		os=-xenix
-		;;
-	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-		os=-mint
-		;;
-	-aros*)
-		os=-aros
-		;;
-	-kaos*)
-		os=-kaos
-		;;
-	-zvmoe)
-		os=-zvmoe
-		;;
-	-dicos*)
-		os=-dicos
-		;;
-        -nacl*)
-	        ;;
-	-none)
-		;;
-	*)
-		# Get rid of the `-' at the beginning of $os.
-		os=`echo $os | sed 's/[^-]*-//'`
-		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
-		exit 1
-		;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system.  Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
-        score-*)
-		os=-elf
-		;;
-        spu-*)
-		os=-elf
-		;;
-	*-acorn)
-		os=-riscix1.2
-		;;
-	arm*-rebel)
-		os=-linux
-		;;
-	arm*-semi)
-		os=-aout
-		;;
-        c4x-* | tic4x-*)
-        	os=-coff
-		;;
-	# This must come before the *-dec entry.
-	pdp10-*)
-		os=-tops20
-		;;
-	pdp11-*)
-		os=-none
-		;;
-	*-dec | vax-*)
-		os=-ultrix4.2
-		;;
-	m68*-apollo)
-		os=-domain
-		;;
-	i386-sun)
-		os=-sunos4.0.2
-		;;
-	m68000-sun)
-		os=-sunos3
-		# This also exists in the configure program, but was not the
-		# default.
-		# os=-sunos4
-		;;
-	m68*-cisco)
-		os=-aout
-		;;
-        mep-*)
-		os=-elf
-		;;
-	mips*-cisco)
-		os=-elf
-		;;
-	mips*-*)
-		os=-elf
-		;;
-	or32-*)
-		os=-coff
-		;;
-	*-tti)	# must be before sparc entry or we get the wrong os.
-		os=-sysv3
-		;;
-	sparc-* | *-sun)
-		os=-sunos4.1.1
-		;;
-	*-be)
-		os=-beos
-		;;
-	*-haiku)
-		os=-haiku
-		;;
-	*-ibm)
-		os=-aix
-		;;
-    	*-knuth)
-		os=-mmixware
-		;;
-	*-wec)
-		os=-proelf
-		;;
-	*-winbond)
-		os=-proelf
-		;;
-	*-oki)
-		os=-proelf
-		;;
-	*-hp)
-		os=-hpux
-		;;
-	*-hitachi)
-		os=-hiux
-		;;
-	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
-		os=-sysv
-		;;
-	*-cbm)
-		os=-amigaos
-		;;
-	*-dg)
-		os=-dgux
-		;;
-	*-dolphin)
-		os=-sysv3
-		;;
-	m68k-ccur)
-		os=-rtu
-		;;
-	m88k-omron*)
-		os=-luna
-		;;
-	*-next )
-		os=-nextstep
-		;;
-	*-sequent)
-		os=-ptx
-		;;
-	*-crds)
-		os=-unos
-		;;
-	*-ns)
-		os=-genix
-		;;
-	i370-*)
-		os=-mvs
-		;;
-	*-next)
-		os=-nextstep3
-		;;
-	*-gould)
-		os=-sysv
-		;;
-	*-highlevel)
-		os=-bsd
-		;;
-	*-encore)
-		os=-bsd
-		;;
-	*-sgi)
-		os=-irix
-		;;
-	*-siemens)
-		os=-sysv4
-		;;
-	*-masscomp)
-		os=-rtu
-		;;
-	f30[01]-fujitsu | f700-fujitsu)
-		os=-uxpv
-		;;
-	*-rom68k)
-		os=-coff
-		;;
-	*-*bug)
-		os=-coff
-		;;
-	*-apple)
-		os=-macos
-		;;
-	*-atari*)
-		os=-mint
-		;;
-	*)
-		os=-none
-		;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer.  We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
-	*-unknown)
-		case $os in
-			-riscix*)
-				vendor=acorn
-				;;
-			-sunos*)
-				vendor=sun
-				;;
-			-cnk*|-aix*)
-				vendor=ibm
-				;;
-			-beos*)
-				vendor=be
-				;;
-			-hpux*)
-				vendor=hp
-				;;
-			-mpeix*)
-				vendor=hp
-				;;
-			-hiux*)
-				vendor=hitachi
-				;;
-			-unos*)
-				vendor=crds
-				;;
-			-dgux*)
-				vendor=dg
-				;;
-			-luna*)
-				vendor=omron
-				;;
-			-genix*)
-				vendor=ns
-				;;
-			-mvs* | -opened*)
-				vendor=ibm
-				;;
-			-os400*)
-				vendor=ibm
-				;;
-			-ptx*)
-				vendor=sequent
-				;;
-			-tpf*)
-				vendor=ibm
-				;;
-			-vxsim* | -vxworks* | -windiss*)
-				vendor=wrs
-				;;
-			-aux*)
-				vendor=apple
-				;;
-			-hms*)
-				vendor=hitachi
-				;;
-			-mpw* | -macos*)
-				vendor=apple
-				;;
-			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-				vendor=atari
-				;;
-			-vos*)
-				vendor=stratus
-				;;
-		esac
-		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
-		;;
-esac
-
-echo $basic_machine$os
-exit
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/cloog-0.17.0/isl/configure b/cloog-0.17.0/isl/configure
deleted file mode 100755
index b397e19..0000000
--- a/cloog-0.17.0/isl/configure
+++ /dev/null
@@ -1,20410 +0,0 @@
-#! /bin/sh
-# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.67 for isl 0.08.
-#
-# Report bugs to <isl-development@googlegroups.com>.
-#
-#
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
-# Foundation, Inc.
-#
-#
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
-      PATH_SEPARATOR=';'
-  }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-case $0 in #((
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-  done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test "x$CONFIG_SHELL" = x; then
-  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '\${1+\"\$@\"}'='\"\$@\"'
-  setopt NO_GLOB_SUBST
-else
-  case \`(set -o) 2>/dev/null\` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-"
-  as_required="as_fn_return () { (exit \$1); }
-as_fn_success () { as_fn_return 0; }
-as_fn_failure () { as_fn_return 1; }
-as_fn_ret_success () { return 0; }
-as_fn_ret_failure () { return 1; }
-
-exitcode=0
-as_fn_success || { exitcode=1; echo as_fn_success failed.; }
-as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
-as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
-as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
-
-else
-  exitcode=1; echo positional parameters were not saved.
-fi
-test x\$exitcode = x0 || exit 1"
-  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
-  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
-  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
-  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
-test \$(( 1 + 1 )) = 2 || exit 1"
-  if (eval "$as_required") 2>/dev/null; then :
-  as_have_required=yes
-else
-  as_have_required=no
-fi
-  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
-
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_found=false
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  as_found=:
-  case $as_dir in #(
-	 /*)
-	   for as_base in sh bash ksh sh5; do
-	     # Try only shells that exist, to save several forks.
-	     as_shell=$as_dir/$as_base
-	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
-		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
-  CONFIG_SHELL=$as_shell as_have_required=yes
-		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
-  break 2
-fi
-fi
-	   done;;
-       esac
-  as_found=false
-done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
-	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
-  CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
-IFS=$as_save_IFS
-
-
-      if test "x$CONFIG_SHELL" != x; then :
-  # We cannot yet assume a decent shell, so we have to provide a
-	# neutralization value for shells without unset; and this also
-	# works around shells that cannot unset nonexistent variables.
-	BASH_ENV=/dev/null
-	ENV=/dev/null
-	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-	export CONFIG_SHELL
-	exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
-fi
-
-    if test x$as_have_required = xno; then :
-  $as_echo "$0: This script requires a shell more modern than all"
-  $as_echo "$0: the shells that I found on your system."
-  if test x${ZSH_VERSION+set} = xset ; then
-    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
-    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
-  else
-    $as_echo "$0: Please tell bug-autoconf@gnu.org and
-$0: isl-development@googlegroups.com about your system,
-$0: including any error possibly output before this
-$0: message. Then install a modern shell, or manually run
-$0: the script under such a shell if you do have one."
-  fi
-  exit 1
-fi
-fi
-fi
-SHELL=${CONFIG_SHELL-/bin/sh}
-export SHELL
-# Unset more variables known to interfere with behavior of common tools.
-CLICOLOR_FORCE= GREP_OPTIONS=
-unset CLICOLOR_FORCE GREP_OPTIONS
-
-## --------------------- ##
-## M4sh Shell Functions. ##
-## --------------------- ##
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
-  { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
-  return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
-  set +e
-  as_fn_set_status $1
-  exit $1
-} # as_fn_exit
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || eval $as_mkdir_p || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
-  eval 'as_fn_append ()
-  {
-    eval $1+=\$2
-  }'
-else
-  as_fn_append ()
-  {
-    eval $1=\$$1\$2
-  }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
-  eval 'as_fn_arith ()
-  {
-    as_val=$(( $* ))
-  }'
-else
-  as_fn_arith ()
-  {
-    as_val=`expr "$@" || test $? -eq 1`
-  }
-fi # as_fn_arith
-
-
-# as_fn_error STATUS ERROR [LINENO LOG_FD]
-# ----------------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with STATUS, using 1 if that was 0.
-as_fn_error ()
-{
-  as_status=$1; test $as_status -eq 0 && as_status=1
-  if test "$4"; then
-    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
-  fi
-  $as_echo "$as_me: error: $2" >&2
-  as_fn_exit $as_status
-} # as_fn_error
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-
-  as_lineno_1=$LINENO as_lineno_1a=$LINENO
-  as_lineno_2=$LINENO as_lineno_2a=$LINENO
-  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
-  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
-  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
-  sed -n '
-    p
-    /[$]LINENO/=
-  ' <$as_myself |
-    sed '
-      s/[$]LINENO.*/&-/
-      t lineno
-      b
-      :lineno
-      N
-      :loop
-      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
-      t loop
-      s/-\n.*//
-    ' >$as_me.lineno &&
-  chmod +x "$as_me.lineno" ||
-    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
-
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensitive to this).
-  . "./$as_me.lineno"
-  # Exit status is that of the last command.
-  exit
-}
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
-  case `echo 'xy\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  xy)  ECHO_C='\c';;
-  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
-       ECHO_T='	';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
-  if ln -s conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s='ln -s'
-    # ... but there are two gotchas:
-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
-  elif ln conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s=ln
-  else
-    as_ln_s='cp -p'
-  fi
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p='mkdir -p "$as_dir"'
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-	test -d "$1/.";
-      else
-	case $1 in #(
-	-*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-
-# Check that we are running under the correct shell.
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-case X$lt_ECHO in
-X*--fallback-echo)
-  # Remove one level of quotation (which was required for Make).
-  ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','`
-  ;;
-esac
-
-ECHO=${lt_ECHO-echo}
-if test "X$1" = X--no-reexec; then
-  # Discard the --no-reexec flag, and continue.
-  shift
-elif test "X$1" = X--fallback-echo; then
-  # Avoid inline document here, it may be left over
-  :
-elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
-  # Yippee, $ECHO works!
-  :
-else
-  # Restart under the correct shell.
-  exec $SHELL "$0" --no-reexec ${1+"$@"}
-fi
-
-if test "X$1" = X--fallback-echo; then
-  # used as fallback echo
-  shift
-  cat <<_LT_EOF
-$*
-_LT_EOF
-  exit 0
-fi
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test -z "$lt_ECHO"; then
-  if test "X${echo_test_string+set}" != Xset; then
-    # find a string as large as possible, as long as the shell can cope with it
-    for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
-      # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
-      if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
-	 { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
-      then
-        break
-      fi
-    done
-  fi
-
-  if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
-     echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
-     test "X$echo_testing_string" = "X$echo_test_string"; then
-    :
-  else
-    # The Solaris, AIX, and Digital Unix default echo programs unquote
-    # backslashes.  This makes it impossible to quote backslashes using
-    #   echo "$something" | sed 's/\\/\\\\/g'
-    #
-    # So, first we look for a working echo in the user's PATH.
-
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for dir in $PATH /usr/ucb; do
-      IFS="$lt_save_ifs"
-      if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
-         test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
-         echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
-         test "X$echo_testing_string" = "X$echo_test_string"; then
-        ECHO="$dir/echo"
-        break
-      fi
-    done
-    IFS="$lt_save_ifs"
-
-    if test "X$ECHO" = Xecho; then
-      # We didn't find a better echo, so look for alternatives.
-      if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
-         echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
-         test "X$echo_testing_string" = "X$echo_test_string"; then
-        # This shell has a builtin print -r that does the trick.
-        ECHO='print -r'
-      elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
-	   test "X$CONFIG_SHELL" != X/bin/ksh; then
-        # If we have ksh, try running configure again with it.
-        ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
-        export ORIGINAL_CONFIG_SHELL
-        CONFIG_SHELL=/bin/ksh
-        export CONFIG_SHELL
-        exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
-      else
-        # Try using printf.
-        ECHO='printf %s\n'
-        if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
-	   echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
-	   test "X$echo_testing_string" = "X$echo_test_string"; then
-	  # Cool, printf works
-	  :
-        elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
-	     test "X$echo_testing_string" = 'X\t' &&
-	     echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-	     test "X$echo_testing_string" = "X$echo_test_string"; then
-	  CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
-	  export CONFIG_SHELL
-	  SHELL="$CONFIG_SHELL"
-	  export SHELL
-	  ECHO="$CONFIG_SHELL $0 --fallback-echo"
-        elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
-	     test "X$echo_testing_string" = 'X\t' &&
-	     echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-	     test "X$echo_testing_string" = "X$echo_test_string"; then
-	  ECHO="$CONFIG_SHELL $0 --fallback-echo"
-        else
-	  # maybe with a smaller string...
-	  prev=:
-
-	  for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
-	    if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
-	    then
-	      break
-	    fi
-	    prev="$cmd"
-	  done
-
-	  if test "$prev" != 'sed 50q "$0"'; then
-	    echo_test_string=`eval $prev`
-	    export echo_test_string
-	    exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
-	  else
-	    # Oops.  We lost completely, so just stick with echo.
-	    ECHO=echo
-	  fi
-        fi
-      fi
-    fi
-  fi
-fi
-
-# Copy echo and quote the copy suitably for passing to libtool from
-# the Makefile, instead of quoting the original, which is used later.
-lt_ECHO=$ECHO
-if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
-   lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
-fi
-
-
-
-
-test -n "$DJDIR" || exec 7<&0 </dev/null
-exec 6>&1
-
-# Name of the host.
-# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
-# so uname gets run too.
-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
-#
-# Initializations.
-#
-ac_default_prefix=/usr/local
-ac_clean_files=
-ac_config_libobj_dir=.
-LIBOBJS=
-cross_compiling=no
-subdirs=
-MFLAGS=
-MAKEFLAGS=
-
-# Identity of this package.
-PACKAGE_NAME='isl'
-PACKAGE_TARNAME='isl'
-PACKAGE_VERSION='0.08'
-PACKAGE_STRING='isl 0.08'
-PACKAGE_BUGREPORT='isl-development@googlegroups.com'
-PACKAGE_URL=''
-
-# Factoring default headers for most tests.
-ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#ifdef STDC_HEADERS
-# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-#  include <stdlib.h>
-# endif
-#endif
-#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-#  include <memory.h>
-# endif
-# include <string.h>
-#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-#ifdef HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif"
-
-ac_subst_vars='am__EXEEXT_FALSE
-am__EXEEXT_TRUE
-LTLIBOBJS
-LIBOBJS
-GIT_HEAD_VERSION
-GIT_HEAD
-GIT_HEAD_ID
-pkgconfig_libfile
-pkgconfig_libdir
-WARNING_FLAGS
-HAVE_CLANG_FALSE
-HAVE_CLANG_TRUE
-llvm_config_found
-CLANG_LIBS
-CLANG_LDFLAGS
-CLANG_CXXFLAGS
-HAVE_PIPLIB_FALSE
-HAVE_PIPLIB_TRUE
-PIPLIB_LIBS
-PIPLIB_LDFLAGS
-PIPLIB_CPPFLAGS
-NEED_GET_MEMORY_FUNCTIONS_FALSE
-NEED_GET_MEMORY_FUNCTIONS_TRUE
-GMP_LIBS
-GMP_LDFLAGS
-GMP_CPPFLAGS
-GENERATE_DOC_FALSE
-GENERATE_DOC_TRUE
-POD2HTML
-PDFLATEX
-PERL
-CXXCPP
-CPP
-OTOOL64
-OTOOL
-LIPO
-NMEDIT
-DSYMUTIL
-lt_ECHO
-RANLIB
-AR
-OBJDUMP
-LN_S
-NM
-ac_ct_DUMPBIN
-DUMPBIN
-LD
-FGREP
-EGREP
-GREP
-SED
-LIBTOOL
-PRTDIAG
-host_os
-host_vendor
-host_cpu
-host
-build_os
-build_vendor
-build_cpu
-build
-am__fastdepCXX_FALSE
-am__fastdepCXX_TRUE
-CXXDEPMODE
-ac_ct_CXX
-CXXFLAGS
-CXX
-am__fastdepCC_FALSE
-am__fastdepCC_TRUE
-CCDEPMODE
-AMDEPBACKSLASH
-AMDEP_FALSE
-AMDEP_TRUE
-am__quote
-am__include
-DEPDIR
-OBJEXT
-EXEEXT
-ac_ct_CC
-CPPFLAGS
-LDFLAGS
-CFLAGS
-CC
-versioninfo
-AM_BACKSLASH
-AM_DEFAULT_VERBOSITY
-am__untar
-am__tar
-AMTAR
-am__leading_dot
-SET_MAKE
-AWK
-mkdir_p
-MKDIR_P
-INSTALL_STRIP_PROGRAM
-STRIP
-install_sh
-MAKEINFO
-AUTOHEADER
-AUTOMAKE
-AUTOCONF
-ACLOCAL
-VERSION
-PACKAGE
-CYGPATH_W
-am__isrc
-INSTALL_DATA
-INSTALL_SCRIPT
-INSTALL_PROGRAM
-target_alias
-host_alias
-build_alias
-LIBS
-ECHO_T
-ECHO_N
-ECHO_C
-DEFS
-mandir
-localedir
-libdir
-psdir
-pdfdir
-dvidir
-htmldir
-infodir
-docdir
-oldincludedir
-includedir
-localstatedir
-sharedstatedir
-sysconfdir
-datadir
-datarootdir
-libexecdir
-sbindir
-bindir
-program_transform_name
-prefix
-exec_prefix
-PACKAGE_URL
-PACKAGE_BUGREPORT
-PACKAGE_STRING
-PACKAGE_VERSION
-PACKAGE_TARNAME
-PACKAGE_NAME
-PATH_SEPARATOR
-SHELL'
-ac_subst_files=''
-ac_user_opts='
-enable_option_checking
-enable_silent_rules
-enable_dependency_tracking
-enable_portable_binary
-with_gcc_arch
-enable_shared
-enable_static
-with_pic
-enable_fast_install
-with_gnu_ld
-enable_libtool_lock
-with_gmp
-with_gmp_prefix
-with_gmp_exec_prefix
-with_gmp_builddir
-with_piplib
-with_piplib_prefix
-with_piplib_exec_prefix
-with_piplib_builddir
-with_clang
-with_clang_prefix
-with_clang_exec_prefix
-'
-      ac_precious_vars='build_alias
-host_alias
-target_alias
-CC
-CFLAGS
-LDFLAGS
-LIBS
-CPPFLAGS
-CXX
-CXXFLAGS
-CCC
-CPP
-CXXCPP'
-
-
-# Initialize some variables set by options.
-ac_init_help=
-ac_init_version=false
-ac_unrecognized_opts=
-ac_unrecognized_sep=
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-cache_file=/dev/null
-exec_prefix=NONE
-no_create=
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-verbose=
-x_includes=NONE
-x_libraries=NONE
-
-# Installation directory options.
-# These are left unexpanded so users can "make install exec_prefix=/foo"
-# and all the variables that are supposed to be based on exec_prefix
-# by default will actually change.
-# Use braces instead of parens because sh, perl, etc. also accept them.
-# (The list follows the same order as the GNU Coding Standards.)
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datarootdir='${prefix}/share'
-datadir='${datarootdir}'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
-infodir='${datarootdir}/info'
-htmldir='${docdir}'
-dvidir='${docdir}'
-pdfdir='${docdir}'
-psdir='${docdir}'
-libdir='${exec_prefix}/lib'
-localedir='${datarootdir}/locale'
-mandir='${datarootdir}/man'
-
-ac_prev=
-ac_dashdash=
-for ac_option
-do
-  # If the previous option needs an argument, assign it.
-  if test -n "$ac_prev"; then
-    eval $ac_prev=\$ac_option
-    ac_prev=
-    continue
-  fi
-
-  case $ac_option in
-  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
-  *=)   ac_optarg= ;;
-  *)    ac_optarg=yes ;;
-  esac
-
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
-  case $ac_dashdash$ac_option in
-  --)
-    ac_dashdash=yes ;;
-
-  -bindir | --bindir | --bindi | --bind | --bin | --bi)
-    ac_prev=bindir ;;
-  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
-    bindir=$ac_optarg ;;
-
-  -build | --build | --buil | --bui | --bu)
-    ac_prev=build_alias ;;
-  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
-    build_alias=$ac_optarg ;;
-
-  -cache-file | --cache-file | --cache-fil | --cache-fi \
-  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-    ac_prev=cache_file ;;
-  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
-    cache_file=$ac_optarg ;;
-
-  --config-cache | -C)
-    cache_file=config.cache ;;
-
-  -datadir | --datadir | --datadi | --datad)
-    ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=*)
-    datadir=$ac_optarg ;;
-
-  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
-  | --dataroo | --dataro | --datar)
-    ac_prev=datarootdir ;;
-  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
-  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
-    datarootdir=$ac_optarg ;;
-
-  -disable-* | --disable-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid feature name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"enable_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval enable_$ac_useropt=no ;;
-
-  -docdir | --docdir | --docdi | --doc | --do)
-    ac_prev=docdir ;;
-  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
-    docdir=$ac_optarg ;;
-
-  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
-    ac_prev=dvidir ;;
-  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
-    dvidir=$ac_optarg ;;
-
-  -enable-* | --enable-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid feature name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"enable_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval enable_$ac_useropt=\$ac_optarg ;;
-
-  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
-  | --exec | --exe | --ex)
-    ac_prev=exec_prefix ;;
-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
-  | --exec=* | --exe=* | --ex=*)
-    exec_prefix=$ac_optarg ;;
-
-  -gas | --gas | --ga | --g)
-    # Obsolete; use --with-gas.
-    with_gas=yes ;;
-
-  -help | --help | --hel | --he | -h)
-    ac_init_help=long ;;
-  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
-    ac_init_help=recursive ;;
-  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
-    ac_init_help=short ;;
-
-  -host | --host | --hos | --ho)
-    ac_prev=host_alias ;;
-  -host=* | --host=* | --hos=* | --ho=*)
-    host_alias=$ac_optarg ;;
-
-  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
-    ac_prev=htmldir ;;
-  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
-  | --ht=*)
-    htmldir=$ac_optarg ;;
-
-  -includedir | --includedir | --includedi | --included | --include \
-  | --includ | --inclu | --incl | --inc)
-    ac_prev=includedir ;;
-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
-  | --includ=* | --inclu=* | --incl=* | --inc=*)
-    includedir=$ac_optarg ;;
-
-  -infodir | --infodir | --infodi | --infod | --info | --inf)
-    ac_prev=infodir ;;
-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
-    infodir=$ac_optarg ;;
-
-  -libdir | --libdir | --libdi | --libd)
-    ac_prev=libdir ;;
-  -libdir=* | --libdir=* | --libdi=* | --libd=*)
-    libdir=$ac_optarg ;;
-
-  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
-  | --libexe | --libex | --libe)
-    ac_prev=libexecdir ;;
-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
-  | --libexe=* | --libex=* | --libe=*)
-    libexecdir=$ac_optarg ;;
-
-  -localedir | --localedir | --localedi | --localed | --locale)
-    ac_prev=localedir ;;
-  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
-    localedir=$ac_optarg ;;
-
-  -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst | --locals)
-    ac_prev=localstatedir ;;
-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
-    localstatedir=$ac_optarg ;;
-
-  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
-    ac_prev=mandir ;;
-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
-    mandir=$ac_optarg ;;
-
-  -nfp | --nfp | --nf)
-    # Obsolete; use --without-fp.
-    with_fp=no ;;
-
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c | -n)
-    no_create=yes ;;
-
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
-    no_recursion=yes ;;
-
-  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
-  | --oldin | --oldi | --old | --ol | --o)
-    ac_prev=oldincludedir ;;
-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
-    oldincludedir=$ac_optarg ;;
-
-  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-    ac_prev=prefix ;;
-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-    prefix=$ac_optarg ;;
-
-  -program-prefix | --program-prefix | --program-prefi | --program-pref \
-  | --program-pre | --program-pr | --program-p)
-    ac_prev=program_prefix ;;
-  -program-prefix=* | --program-prefix=* | --program-prefi=* \
-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
-    program_prefix=$ac_optarg ;;
-
-  -program-suffix | --program-suffix | --program-suffi | --program-suff \
-  | --program-suf | --program-su | --program-s)
-    ac_prev=program_suffix ;;
-  -program-suffix=* | --program-suffix=* | --program-suffi=* \
-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
-    program_suffix=$ac_optarg ;;
-
-  -program-transform-name | --program-transform-name \
-  | --program-transform-nam | --program-transform-na \
-  | --program-transform-n | --program-transform- \
-  | --program-transform | --program-transfor \
-  | --program-transfo | --program-transf \
-  | --program-trans | --program-tran \
-  | --progr-tra | --program-tr | --program-t)
-    ac_prev=program_transform_name ;;
-  -program-transform-name=* | --program-transform-name=* \
-  | --program-transform-nam=* | --program-transform-na=* \
-  | --program-transform-n=* | --program-transform-=* \
-  | --program-transform=* | --program-transfor=* \
-  | --program-transfo=* | --program-transf=* \
-  | --program-trans=* | --program-tran=* \
-  | --progr-tra=* | --program-tr=* | --program-t=*)
-    program_transform_name=$ac_optarg ;;
-
-  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
-    ac_prev=pdfdir ;;
-  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
-    pdfdir=$ac_optarg ;;
-
-  -psdir | --psdir | --psdi | --psd | --ps)
-    ac_prev=psdir ;;
-  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
-    psdir=$ac_optarg ;;
-
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil)
-    silent=yes ;;
-
-  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
-    ac_prev=sbindir ;;
-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
-  | --sbi=* | --sb=*)
-    sbindir=$ac_optarg ;;
-
-  -sharedstatedir | --sharedstatedir | --sharedstatedi \
-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
-  | --sharedst | --shareds | --shared | --share | --shar \
-  | --sha | --sh)
-    ac_prev=sharedstatedir ;;
-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
-  | --sha=* | --sh=*)
-    sharedstatedir=$ac_optarg ;;
-
-  -site | --site | --sit)
-    ac_prev=site ;;
-  -site=* | --site=* | --sit=*)
-    site=$ac_optarg ;;
-
-  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-    ac_prev=srcdir ;;
-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-    srcdir=$ac_optarg ;;
-
-  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
-  | --syscon | --sysco | --sysc | --sys | --sy)
-    ac_prev=sysconfdir ;;
-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
-    sysconfdir=$ac_optarg ;;
-
-  -target | --target | --targe | --targ | --tar | --ta | --t)
-    ac_prev=target_alias ;;
-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
-    target_alias=$ac_optarg ;;
-
-  -v | -verbose | --verbose | --verbos | --verbo | --verb)
-    verbose=yes ;;
-
-  -version | --version | --versio | --versi | --vers | -V)
-    ac_init_version=: ;;
-
-  -with-* | --with-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid package name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"with_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval with_$ac_useropt=\$ac_optarg ;;
-
-  -without-* | --without-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid package name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"with_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval with_$ac_useropt=no ;;
-
-  --x)
-    # Obsolete; use --with-x.
-    with_x=yes ;;
-
-  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
-  | --x-incl | --x-inc | --x-in | --x-i)
-    ac_prev=x_includes ;;
-  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
-  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
-    x_includes=$ac_optarg ;;
-
-  -x-libraries | --x-libraries | --x-librarie | --x-librari \
-  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
-    ac_prev=x_libraries ;;
-  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
-  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
-    x_libraries=$ac_optarg ;;
-
-  -*) as_fn_error $? "unrecognized option: \`$ac_option'
-Try \`$0 --help' for more information"
-    ;;
-
-  *=*)
-    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
-    # Reject names that are not valid shell variable names.
-    case $ac_envvar in #(
-      '' | [0-9]* | *[!_$as_cr_alnum]* )
-      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
-    esac
-    eval $ac_envvar=\$ac_optarg
-    export $ac_envvar ;;
-
-  *)
-    # FIXME: should be removed in autoconf 3.0.
-    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
-    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
-    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
-    ;;
-
-  esac
-done
-
-if test -n "$ac_prev"; then
-  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
-  as_fn_error $? "missing argument to $ac_option"
-fi
-
-if test -n "$ac_unrecognized_opts"; then
-  case $enable_option_checking in
-    no) ;;
-    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
-    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
-  esac
-fi
-
-# Check all directory arguments for consistency.
-for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
-		datadir sysconfdir sharedstatedir localstatedir includedir \
-		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
-do
-  eval ac_val=\$$ac_var
-  # Remove trailing slashes.
-  case $ac_val in
-    */ )
-      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
-      eval $ac_var=\$ac_val;;
-  esac
-  # Be sure to have absolute directory names.
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* )  continue;;
-    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
-  esac
-  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
-done
-
-# There might be people who depend on the old broken behavior: `$host'
-# used to hold the argument of --host etc.
-# FIXME: To remove some day.
-build=$build_alias
-host=$host_alias
-target=$target_alias
-
-# FIXME: To remove some day.
-if test "x$host_alias" != x; then
-  if test "x$build_alias" = x; then
-    cross_compiling=maybe
-    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
-    If a cross compiler is detected then cross compile mode will be used" >&2
-  elif test "x$build_alias" != "x$host_alias"; then
-    cross_compiling=yes
-  fi
-fi
-
-ac_tool_prefix=
-test -n "$host_alias" && ac_tool_prefix=$host_alias-
-
-test "$silent" = yes && exec 6>/dev/null
-
-
-ac_pwd=`pwd` && test -n "$ac_pwd" &&
-ac_ls_di=`ls -di .` &&
-ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
-  as_fn_error $? "working directory cannot be determined"
-test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
-  as_fn_error $? "pwd does not report name of working directory"
-
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
-  ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then the parent directory.
-  ac_confdir=`$as_dirname -- "$as_myself" ||
-$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_myself" : 'X\(//\)[^/]' \| \
-	 X"$as_myself" : 'X\(//\)$' \| \
-	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  srcdir=$ac_confdir
-  if test ! -r "$srcdir/$ac_unique_file"; then
-    srcdir=..
-  fi
-else
-  ac_srcdir_defaulted=no
-fi
-if test ! -r "$srcdir/$ac_unique_file"; then
-  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
-  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
-fi
-ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
-ac_abs_confdir=`(
-	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
-	pwd)`
-# When building in place, set srcdir=.
-if test "$ac_abs_confdir" = "$ac_pwd"; then
-  srcdir=.
-fi
-# Remove unnecessary trailing slashes from srcdir.
-# Double slashes in file names in object file debugging info
-# mess up M-x gdb in Emacs.
-case $srcdir in
-*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
-esac
-for ac_var in $ac_precious_vars; do
-  eval ac_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_env_${ac_var}_value=\$${ac_var}
-  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_cv_env_${ac_var}_value=\$${ac_var}
-done
-
-#
-# Report the --help message.
-#
-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.08 to adapt to many kinds of systems.
-
-Usage: $0 [OPTION]... [VAR=VALUE]...
-
-To assign environment variables (e.g., CC, CFLAGS...), specify them as
-VAR=VALUE.  See below for descriptions of some of the useful variables.
-
-Defaults for the options are specified in brackets.
-
-Configuration:
-  -h, --help              display this help and exit
-      --help=short        display options specific to this package
-      --help=recursive    display the short help of all the included packages
-  -V, --version           display version information and exit
-  -q, --quiet, --silent   do not print \`checking ...' messages
-      --cache-file=FILE   cache test results in FILE [disabled]
-  -C, --config-cache      alias for \`--cache-file=config.cache'
-  -n, --no-create         do not create output files
-      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
-
-Installation directories:
-  --prefix=PREFIX         install architecture-independent files in PREFIX
-                          [$ac_default_prefix]
-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-                          [PREFIX]
-
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
-
-For better control, use the options below.
-
-Fine tuning of the installation directories:
-  --bindir=DIR            user executables [EPREFIX/bin]
-  --sbindir=DIR           system admin executables [EPREFIX/sbin]
-  --libexecdir=DIR        program executables [EPREFIX/libexec]
-  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
-  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
-  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
-  --libdir=DIR            object code libraries [EPREFIX/lib]
-  --includedir=DIR        C header files [PREFIX/include]
-  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
-  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
-  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
-  --infodir=DIR           info documentation [DATAROOTDIR/info]
-  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
-  --mandir=DIR            man documentation [DATAROOTDIR/man]
-  --docdir=DIR            documentation root [DATAROOTDIR/doc/isl]
-  --htmldir=DIR           html documentation [DOCDIR]
-  --dvidir=DIR            dvi documentation [DOCDIR]
-  --pdfdir=DIR            pdf documentation [DOCDIR]
-  --psdir=DIR             ps documentation [DOCDIR]
-_ACEOF
-
-  cat <<\_ACEOF
-
-Program names:
-  --program-prefix=PREFIX            prepend PREFIX to installed program names
-  --program-suffix=SUFFIX            append SUFFIX to installed program names
-  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
-
-System types:
-  --build=BUILD     configure for building on BUILD [guessed]
-  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
-_ACEOF
-fi
-
-if test -n "$ac_init_help"; then
-  case $ac_init_help in
-     short | recursive ) echo "Configuration of isl 0.08:";;
-   esac
-  cat <<\_ACEOF
-
-Optional Features:
-  --disable-option-checking  ignore unrecognized --enable/--with options
-  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
-  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --enable-silent-rules          less verbose build output (undo: `make V=1')
-  --disable-silent-rules         verbose build output (undo: `make V=0')
-  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors
-  --enable-portable-binary
-                          disable compiler optimizations that would produce
-                          unportable binaries
-  --enable-shared[=PKGS]  build shared libraries [default=yes]
-  --enable-static[=PKGS]  build static libraries [default=yes]
-  --enable-fast-install[=PKGS]
-                          optimize for fast installation [default=yes]
-  --disable-libtool-lock  avoid locking (might break parallel builds)
-
-Optional Packages:
-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --with-gcc-arch=<arch>  use architecture <arch> for gcc -march/-mtune,
-                          instead of guessing
-  --with-pic              try to use only PIC/non-PIC objects [default=use
-                          both]
-  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
-  --with-gmp=system|build Which gmp to use [default=system]
-  --with-gmp-prefix=DIR   Prefix of gmp installation
-  --with-gmp-exec-prefix=DIR
-                          Exec prefix of gmp installation
-  --with-gmp-builddir=DIR Location of gmp builddir
-  --with-piplib=no|system|build
-                          Which piplib to use [default=no]
-  --with-piplib-prefix=DIR
-                          Prefix of piplib installation
-  --with-piplib-exec-prefix=DIR
-                          Exec prefix of piplib installation
-  --with-piplib-builddir=DIR
-                          Location of piplib builddir
-  --with-clang=system|no  Which clang to use [default=no]
-  --with-clang-prefix=DIR Prefix of clang installation
-  --with-clang-exec-prefix=DIR
-                          Exec prefix of clang installation
-
-Some influential environment variables:
-  CC          C compiler command
-  CFLAGS      C compiler flags
-  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
-              nonstandard directory <lib dir>
-  LIBS        libraries to pass to the linker, e.g. -l<library>
-  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
-              you have headers in a nonstandard directory <include dir>
-  CXX         C++ compiler command
-  CXXFLAGS    C++ compiler flags
-  CPP         C preprocessor
-  CXXCPP      C++ preprocessor
-
-Use these variables to override the choices made by `configure' or to help
-it to find libraries and programs with nonstandard names/locations.
-
-Report bugs to <isl-development@googlegroups.com>.
-_ACEOF
-ac_status=$?
-fi
-
-if test "$ac_init_help" = "recursive"; then
-  # If there are subdirs, report their specific --help.
-  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d "$ac_dir" ||
-      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
-      continue
-    ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-    cd "$ac_dir" || { ac_status=$?; continue; }
-    # Check for guested configure.
-    if test -f "$ac_srcdir/configure.gnu"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
-    elif test -f "$ac_srcdir/configure"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure" --help=recursive
-    else
-      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
-    fi || ac_status=$?
-    cd "$ac_pwd" || { ac_status=$?; break; }
-  done
-fi
-
-test -n "$ac_init_help" && exit $ac_status
-if $ac_init_version; then
-  cat <<\_ACEOF
-isl configure 0.08
-generated by GNU Autoconf 2.67
-
-Copyright (C) 2010 Free Software Foundation, Inc.
-This configure script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it.
-_ACEOF
-  exit
-fi
-
-## ------------------------ ##
-## Autoconf initialization. ##
-## ------------------------ ##
-
-# ac_fn_c_try_compile LINENO
-# --------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext
-  if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_compile
-
-# ac_fn_cxx_try_compile LINENO
-# ----------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext
-  if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_cxx_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_compile
-
-# ac_fn_c_try_run LINENO
-# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_c_try_run ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-       $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-       ac_retval=$ac_status
-fi
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_run
-
-# ac_fn_c_try_link LINENO
-# -----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
-  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
-  # interfere with the next link command; also delete a directory that is
-  # left behind by Apple's compiler.  We do this before executing the actions.
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_link
-
-# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists and can be compiled using the include files in
-# INCLUDES, setting the cache variable VAR accordingly.
-ac_fn_c_check_header_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_header_compile
-
-# ac_fn_c_try_cpp LINENO
-# ----------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_cpp ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } > conftest.i && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-    ac_retval=1
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_cpp
-
-# ac_fn_c_check_func LINENO FUNC VAR
-# ----------------------------------
-# Tests whether FUNC exists, setting the cache variable VAR accordingly
-ac_fn_c_check_func ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $2 innocuous_$2
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $2 (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $2
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $2 ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined __stub_$2 || defined __stub___$2
-choke me
-#endif
-
-int
-main ()
-{
-return $2 ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_func
-
-# ac_fn_cxx_try_cpp LINENO
-# ------------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_cpp ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } > conftest.i && {
-	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
-	 test ! -s conftest.err
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-    ac_retval=1
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_cpp
-
-# ac_fn_cxx_try_link LINENO
-# -------------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_link ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_cxx_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
-  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
-  # interfere with the next link command; also delete a directory that is
-  # left behind by Apple's compiler.  We do this before executing the actions.
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_link
-
-# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
-# -------------------------------------------
-# Tests whether TYPE exists after having included INCLUDES, setting cache
-# variable VAR accordingly.
-ac_fn_c_check_type ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=no"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof ($2))
-	 return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof (($2)))
-	    return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  eval "$3=yes"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_type
-
-# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
-# --------------------------------------------
-# Tries to find the compile-time value of EXPR in a program that includes
-# INCLUDES, setting VAR accordingly. Returns whether the value could be
-# computed
-ac_fn_c_compute_int ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if test "$cross_compiling" = yes; then
-    # Depending upon the size, compute the lo and hi bounds.
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) >= 0)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_lo=0 ac_mid=0
-  while :; do
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) <= $ac_mid)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_hi=$ac_mid; break
-else
-  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
-			if test $ac_lo -le $ac_mid; then
-			  ac_lo= ac_hi=
-			  break
-			fi
-			as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  done
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) < 0)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_hi=-1 ac_mid=-1
-  while :; do
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) >= $ac_mid)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_lo=$ac_mid; break
-else
-  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
-			if test $ac_mid -le $ac_hi; then
-			  ac_lo= ac_hi=
-			  break
-			fi
-			as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  done
-else
-  ac_lo= ac_hi=
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-# Binary search between lo and hi bounds.
-while test "x$ac_lo" != "x$ac_hi"; do
-  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-static int test_array [1 - 2 * !(($2) <= $ac_mid)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_hi=$ac_mid
-else
-  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-case $ac_lo in #((
-?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
-'') ac_retval=1 ;;
-esac
-  else
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-static long int longval () { return $2; }
-static unsigned long int ulongval () { return $2; }
-#include <stdio.h>
-#include <stdlib.h>
-int
-main ()
-{
-
-  FILE *f = fopen ("conftest.val", "w");
-  if (! f)
-    return 1;
-  if (($2) < 0)
-    {
-      long int i = longval ();
-      if (i != ($2))
-	return 1;
-      fprintf (f, "%ld", i);
-    }
-  else
-    {
-      unsigned long int i = ulongval ();
-      if (i != ($2))
-	return 1;
-      fprintf (f, "%lu", i);
-    }
-  /* Do not output a trailing newline, as this causes \r\n confusion
-     on some platforms.  */
-  return ferror (f) || fclose (f) != 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  echo >>conftest.val; read $3 <conftest.val; ac_retval=0
-else
-  ac_retval=1
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-rm -f conftest.val
-
-  fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_compute_int
-
-# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
-# ---------------------------------------------
-# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
-# accordingly.
-ac_fn_c_check_decl ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  as_decl_name=`echo $2|sed 's/ *(.*//'`
-  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
-$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-#ifndef $as_decl_name
-#ifdef __cplusplus
-  (void) $as_decl_use;
-#else
-  (void) $as_decl_name;
-#endif
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_decl
-
-# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
-# ----------------------------------------------------
-# Tries to find if the field MEMBER exists in type AGGR, after including
-# INCLUDES, setting cache variable VAR accordingly.
-ac_fn_c_check_member ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
-$as_echo_n "checking for $2.$3... " >&6; }
-if eval "test \"\${$4+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$5
-int
-main ()
-{
-static $2 ac_aggr;
-if (ac_aggr.$3)
-return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$4=yes"
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$5
-int
-main ()
-{
-static $2 ac_aggr;
-if (sizeof ac_aggr.$3)
-return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$4=yes"
-else
-  eval "$4=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$4
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_member
-
-# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES
-# ---------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_cxx_check_header_mongrel ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if eval "test \"\${$3+set}\"" = set; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
-  # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_header_compiler=yes
-else
-  ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <$2>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-  ac_header_preproc=yes
-else
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #((
-  yes:no: )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-    ;;
-  no:yes:* )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( $as_echo "## ----------------------------------------------- ##
-## Report this to isl-development@googlegroups.com ##
-## ----------------------------------------------- ##"
-     ) | sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_cxx_check_header_mongrel
-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.08, which was
-generated by GNU Autoconf 2.67.  Invocation command line was
-
-  $ $0 $@
-
-_ACEOF
-exec 5>>config.log
-{
-cat <<_ASUNAME
-## --------- ##
-## Platform. ##
-## --------- ##
-
-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
-
-/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
-/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
-/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
-
-_ASUNAME
-
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    $as_echo "PATH: $as_dir"
-  done
-IFS=$as_save_IFS
-
-} >&5
-
-cat >&5 <<_ACEOF
-
-
-## ----------- ##
-## Core tests. ##
-## ----------- ##
-
-_ACEOF
-
-
-# Keep a trace of the command line.
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Strip out --silent because we don't want to record it for future runs.
-# Also quote any args containing shell meta-characters.
-# Make two passes to allow for proper duplicate-argument suppression.
-ac_configure_args=
-ac_configure_args0=
-ac_configure_args1=
-ac_must_keep_next=false
-for ac_pass in 1 2
-do
-  for ac_arg
-  do
-    case $ac_arg in
-    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
-    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-    | -silent | --silent | --silen | --sile | --sil)
-      continue ;;
-    *\'*)
-      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    case $ac_pass in
-    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
-    2)
-      as_fn_append ac_configure_args1 " '$ac_arg'"
-      if test $ac_must_keep_next = true; then
-	ac_must_keep_next=false # Got value, back to normal.
-      else
-	case $ac_arg in
-	  *=* | --config-cache | -C | -disable-* | --disable-* \
-	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
-	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
-	  | -with-* | --with-* | -without-* | --without-* | --x)
-	    case "$ac_configure_args0 " in
-	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
-	    esac
-	    ;;
-	  -* ) ac_must_keep_next=true ;;
-	esac
-      fi
-      as_fn_append ac_configure_args " '$ac_arg'"
-      ;;
-    esac
-  done
-done
-{ ac_configure_args0=; unset ac_configure_args0;}
-{ ac_configure_args1=; unset ac_configure_args1;}
-
-# When interrupted or exit'd, cleanup temporary files, and complete
-# config.log.  We remove comments because anyway the quotes in there
-# would cause problems or look ugly.
-# WARNING: Use '\'' to represent an apostrophe within the trap.
-# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
-trap 'exit_status=$?
-  # Save into config.log some information that might help in debugging.
-  {
-    echo
-
-    $as_echo "## ---------------- ##
-## Cache variables. ##
-## ---------------- ##"
-    echo
-    # The following way of writing the cache mishandles newlines in values,
-(
-  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) { eval $ac_var=; unset $ac_var;} ;;
-      esac ;;
-    esac
-  done
-  (set) 2>&1 |
-    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      sed -n \
-	"s/'\''/'\''\\\\'\'''\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
-      ;; #(
-    *)
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-)
-    echo
-
-    $as_echo "## ----------------- ##
-## Output variables. ##
-## ----------------- ##"
-    echo
-    for ac_var in $ac_subst_vars
-    do
-      eval ac_val=\$$ac_var
-      case $ac_val in
-      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-      esac
-      $as_echo "$ac_var='\''$ac_val'\''"
-    done | sort
-    echo
-
-    if test -n "$ac_subst_files"; then
-      $as_echo "## ------------------- ##
-## File substitutions. ##
-## ------------------- ##"
-      echo
-      for ac_var in $ac_subst_files
-      do
-	eval ac_val=\$$ac_var
-	case $ac_val in
-	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-	esac
-	$as_echo "$ac_var='\''$ac_val'\''"
-      done | sort
-      echo
-    fi
-
-    if test -s confdefs.h; then
-      $as_echo "## ----------- ##
-## confdefs.h. ##
-## ----------- ##"
-      echo
-      cat confdefs.h
-      echo
-    fi
-    test "$ac_signal" != 0 &&
-      $as_echo "$as_me: caught signal $ac_signal"
-    $as_echo "$as_me: exit $exit_status"
-  } >&5
-  rm -f core *.core core.conftest.* &&
-    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
-    exit $exit_status
-' 0
-for ac_signal in 1 2 13 15; do
-  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
-done
-ac_signal=0
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -f -r conftest* confdefs.h
-
-$as_echo "/* confdefs.h */" > confdefs.h
-
-# Predefined preprocessor variables.
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
-
-
-# Let the site file select an alternate cache file if it wants to.
-# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
-if test -n "$CONFIG_SITE"; then
-  # We do not want a PATH search for config.site.
-  case $CONFIG_SITE in #((
-    -*)  ac_site_file1=./$CONFIG_SITE;;
-    */*) ac_site_file1=$CONFIG_SITE;;
-    *)   ac_site_file1=./$CONFIG_SITE;;
-  esac
-elif test "x$prefix" != xNONE; then
-  ac_site_file1=$prefix/share/config.site
-  ac_site_file2=$prefix/etc/config.site
-else
-  ac_site_file1=$ac_default_prefix/share/config.site
-  ac_site_file2=$ac_default_prefix/etc/config.site
-fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
-do
-  test "x$ac_site_file" = xNONE && continue
-  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
-    sed 's/^/| /' "$ac_site_file" >&5
-    . "$ac_site_file" \
-      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "failed to load site script $ac_site_file
-See \`config.log' for more details" "$LINENO" 5 ; }
-  fi
-done
-
-if test -r "$cache_file"; then
-  # Some versions of bash will fail to source /dev/null (special files
-  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
-  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
-    case $cache_file in
-      [\\/]* | ?:[\\/]* ) . "$cache_file";;
-      *)                      . "./$cache_file";;
-    esac
-  fi
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
-  >$cache_file
-fi
-
-# Check that the precious variables saved in the cache have kept the same
-# value.
-ac_cache_corrupted=false
-for ac_var in $ac_precious_vars; do
-  eval ac_old_set=\$ac_cv_env_${ac_var}_set
-  eval ac_new_set=\$ac_env_${ac_var}_set
-  eval ac_old_val=\$ac_cv_env_${ac_var}_value
-  eval ac_new_val=\$ac_env_${ac_var}_value
-  case $ac_old_set,$ac_new_set in
-    set,)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,set)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,);;
-    *)
-      if test "x$ac_old_val" != "x$ac_new_val"; then
-	# differences in whitespace do not lead to failure.
-	ac_old_val_w=`echo x $ac_old_val`
-	ac_new_val_w=`echo x $ac_new_val`
-	if test "$ac_old_val_w" != "$ac_new_val_w"; then
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
-	  ac_cache_corrupted=:
-	else
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
-	  eval $ac_var=\$ac_old_val
-	fi
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
-$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
-$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
-      fi;;
-  esac
-  # Pass precious variables to config.status.
-  if test "$ac_new_set" = set; then
-    case $ac_new_val in
-    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
-    *) ac_arg=$ac_var=$ac_new_val ;;
-    esac
-    case " $ac_configure_args " in
-      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
-      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
-    esac
-  fi
-done
-if $ac_cache_corrupted; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
-fi
-## -------------------- ##
-## Main body of script. ##
-## -------------------- ##
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-ac_aux_dir=
-for ac_dir in . "$srcdir"/.; do
-  if test -f "$ac_dir/install-sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install-sh -c"
-    break
-  elif test -f "$ac_dir/install.sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install.sh -c"
-    break
-  elif test -f "$ac_dir/shtool"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/shtool install -c"
-    break
-  fi
-done
-if test -z "$ac_aux_dir"; then
-  as_fn_error $? "cannot find install-sh, install.sh, or shtool in . \"$srcdir\"/." "$LINENO" 5
-fi
-
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
-
-
-
-am__api_version='1.11'
-
-# Find a good install program.  We prefer a C program (faster),
-# so one script is as good as another.  But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AmigaOS /C/install, which installs bootblocks on floppy discs
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# OS/2's system install, which has a completely different semantic
-# ./install, which can be erroneously created by make from ./install.sh.
-# Reject install programs that cannot install multiple files.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
-$as_echo_n "checking for a BSD-compatible install... " >&6; }
-if test -z "$INSTALL"; then
-if test "${ac_cv_path_install+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in #((
-  ./ | .// | /[cC]/* | \
-  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
-  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
-  /usr/ucb/* ) ;;
-  *)
-    # OSF1 and SCO ODT 3.0 have their own names for install.
-    # Don't use installbsd from OSF since it installs stuff as root
-    # by default.
-    for ac_prog in ginstall scoinst install; do
-      for ac_exec_ext in '' $ac_executable_extensions; do
-	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
-	  if test $ac_prog = install &&
-	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # AIX install.  It has an incompatible calling convention.
-	    :
-	  elif test $ac_prog = install &&
-	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # program-specific install script used by HP pwplus--don't use.
-	    :
-	  else
-	    rm -rf conftest.one conftest.two conftest.dir
-	    echo one > conftest.one
-	    echo two > conftest.two
-	    mkdir conftest.dir
-	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
-	      test -s conftest.one && test -s conftest.two &&
-	      test -s conftest.dir/conftest.one &&
-	      test -s conftest.dir/conftest.two
-	    then
-	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
-	      break 3
-	    fi
-	  fi
-	fi
-      done
-    done
-    ;;
-esac
-
-  done
-IFS=$as_save_IFS
-
-rm -rf conftest.one conftest.two conftest.dir
-
-fi
-  if test "${ac_cv_path_install+set}" = set; then
-    INSTALL=$ac_cv_path_install
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for INSTALL within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    INSTALL=$ac_install_sh
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
-$as_echo "$INSTALL" >&6; }
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
-$as_echo_n "checking whether build environment is sane... " >&6; }
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name.  Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
-  *[\\\"\#\$\&\'\`$am_lf]*)
-    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5 ;;
-esac
-case $srcdir in
-  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
-    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5 ;;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$*" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$*" != "X $srcdir/configure conftest.file" \
-      && test "$*" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
-alias in your environment" "$LINENO" 5
-   fi
-
-   test "$2" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   as_fn_error $? "newly created file is older than distributed files!
-Check your system clock" "$LINENO" 5
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-test "$program_prefix" != NONE &&
-  program_transform_name="s&^&$program_prefix&;$program_transform_name"
-# Use a double $ so make ignores it.
-test "$program_suffix" != NONE &&
-  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
-# Double any \ or $.
-# By default was `s,x,x', remove it if useless.
-ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
-program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
-
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-
-if test x"${MISSING+set}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
-  *)
-    MISSING="\${SHELL} $am_aux_dir/missing" ;;
-  esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
-$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
-fi
-
-if test x"${install_sh}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
-  *)
-    install_sh="\${SHELL} $am_aux_dir/install-sh"
-  esac
-fi
-
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-if test "$cross_compiling" != no; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
-$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
-if test -z "$MKDIR_P"; then
-  if test "${ac_cv_path_mkdir+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in mkdir gmkdir; do
-	 for ac_exec_ext in '' $ac_executable_extensions; do
-	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
-	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
-	     'mkdir (GNU coreutils) '* | \
-	     'mkdir (coreutils) '* | \
-	     'mkdir (fileutils) '4.1*)
-	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
-	       break 3;;
-	   esac
-	 done
-       done
-  done
-IFS=$as_save_IFS
-
-fi
-
-  test -d ./--version && rmdir ./--version
-  if test "${ac_cv_path_mkdir+set}" = set; then
-    MKDIR_P="$ac_cv_path_mkdir -p"
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for MKDIR_P within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    MKDIR_P="$ac_install_sh -d"
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
-$as_echo "$MKDIR_P" >&6; }
-
-mkdir_p="$MKDIR_P"
-case $mkdir_p in
-  [\\/$]* | ?:[\\/]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-
-for ac_prog in gawk mawk nawk awk
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_AWK+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$AWK"; then
-  ac_cv_prog_AWK="$AWK" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_AWK="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-AWK=$ac_cv_prog_AWK
-if test -n "$AWK"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
-$as_echo "$AWK" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$AWK" && break
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
-set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.make <<\_ACEOF
-SHELL = /bin/sh
-all:
-	@echo '@@@%%%=$(MAKE)=@@@%%%'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
-case `${MAKE-make} -f conftest.make 2>/dev/null` in
-  *@@@%%%=?*=@@@%%%*)
-    eval ac_cv_prog_make_${ac_make}_set=yes;;
-  *)
-    eval ac_cv_prog_make_${ac_make}_set=no;;
-esac
-rm -f conftest.make
-fi
-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-  SET_MAKE=
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-  SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
-else
-  am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  am__isrc=' -I$(srcdir)'
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-
-
-# Define the identity of the package.
- PACKAGE='isl'
- VERSION='0.08'
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE "$PACKAGE"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define VERSION "$VERSION"
-_ACEOF
-
-# Some tools Automake needs.
-
-ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
-
-
-AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
-
-
-AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
-
-
-AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
-
-
-MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
-
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-# Always define AMTAR for backward compatibility.
-
-AMTAR=${AMTAR-"${am_missing_run}tar"}
-
-am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
-
-
-
-
-
-# Check whether --enable-silent-rules was given.
-if test "${enable_silent_rules+set}" = set; then :
-  enableval=$enable_silent_rules;
-fi
-
-case $enable_silent_rules in
-yes) AM_DEFAULT_VERBOSITY=0;;
-no)  AM_DEFAULT_VERBOSITY=1;;
-*)   AM_DEFAULT_VERBOSITY=0;;
-esac
-AM_BACKSLASH='\'
-
-
-versioninfo=8:0:0
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
-          if test -n "$ac_tool_prefix"; then
-    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  fi
-fi
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_CC="cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
-  fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl.exe
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$CC" && break
-  done
-fi
-if test -z "$CC"; then
-  ac_ct_CC=$CC
-  for ac_prog in cl.exe
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_CC" && break
-done
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-fi
-
-fi
-
-
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5 ; }
-
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
-  { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    sed '10a\
-... rest of stderr output deleted ...
-         10q' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-  fi
-  rm -f conftest.er1 conftest.err
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-done
-
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-
-# The possible output files:
-ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
-
-ac_rmfiles=
-for ac_file in $ac_files
-do
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
-  esac
-done
-rm -f $ac_rmfiles
-
-if { { ac_try="$ac_link_default"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link_default") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
-# in a Makefile.  We should not override ac_cv_exeext if it was cached,
-# so that the user can short-circuit this test for compilers unknown to
-# Autoconf.
-for ac_file in $ac_files ''
-do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
-	;;
-    [ab].out )
-	# We found the default executable, but exeext='' is most
-	# certainly right.
-	break;;
-    *.* )
-	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
-	then :; else
-	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	fi
-	# We set ac_cv_exeext here because the later test for it is not
-	# safe: cross compilers may not add the suffix if given an `-o'
-	# argument, so we may need to know it at that point already.
-	# Even if this section looks crufty: it has the advantage of
-	# actually working.
-	break;;
-    * )
-	break;;
-  esac
-done
-test "$ac_cv_exeext" = no && ac_cv_exeext=
-
-else
-  ac_file=''
-fi
-if test -z "$ac_file"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "C compiler cannot create executables
-See \`config.log' for more details" "$LINENO" 5 ; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
-ac_exeext=$ac_cv_exeext
-
-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
-if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	  break;;
-    * ) break;;
-  esac
-done
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details" "$LINENO" 5 ; }
-fi
-rm -f conftest conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-FILE *f = fopen ("conftest.out", "w");
- return ferror (f) || fclose (f) != 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files="$ac_clean_files conftest.out"
-# Check that the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
-if test "$cross_compiling" != yes; then
-  { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-  if { ac_try='./conftest$ac_cv_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then
-    cross_compiling=no
-  else
-    if test "$cross_compiling" = maybe; then
-	cross_compiling=yes
-    else
-	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details" "$LINENO" 5 ; }
-    fi
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
-
-rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if test "${ac_cv_objext+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  for ac_file in conftest.o conftest.obj conftest.*; do
-  test -f "$ac_file" || continue;
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
-    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
-       break;;
-  esac
-done
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details" "$LINENO" 5 ; }
-fi
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if test "${ac_cv_c_compiler_gnu+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_compiler_gnu=yes
-else
-  ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
-  GCC=yes
-else
-  GCC=
-fi
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if test "${ac_cv_prog_cc_g+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_save_c_werror_flag=$ac_c_werror_flag
-   ac_c_werror_flag=yes
-   ac_cv_prog_cc_g=no
-   CFLAGS="-g"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-else
-  CFLAGS=""
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  ac_c_werror_flag=$ac_save_c_werror_flag
-	 CFLAGS="-g"
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if test "${ac_cv_prog_cc_c89+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
-     char **p;
-     int i;
-{
-  return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
-  char *s;
-  va_list v;
-  va_start (v,p);
-  s = g (p, va_arg (v,int));
-  va_end (v);
-  return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
-   function prototypes and stuff, but not '\xHH' hex character constants.
-   These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std is added to get
-   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
-   array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std.  */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
-   inside strings and character constants.  */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
-  ;
-  return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
-	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_c89=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
-  test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
-  x)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
-  xno)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
-  *)
-    CC="$CC $ac_cv_prog_cc_c89"
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
-
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-DEPDIR="${am__leading_dot}deps"
-
-ac_config_commands="$ac_config_commands depfiles"
-
-
-am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-	@echo this is the am__doit target
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
-$as_echo_n "checking for style of include used by $am_make... " >&6; }
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
-  am__include=include
-  am__quote=
-  _am_result=GNU
-  ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   case `$am_make -s -f confmf 2> /dev/null` in #(
-   *the\ am__doit\ target*)
-     am__include=.include
-     am__quote="\""
-     _am_result=BSD
-     ;;
-   esac
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
-$as_echo "$_am_result" >&6; }
-rm -f confinc confmf
-
-# Check whether --enable-dependency-tracking was given.
-if test "${enable_dependency_tracking+set}" = set; then :
-  enableval=$enable_dependency_tracking;
-fi
-
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-fi
- if test "x$enable_dependency_tracking" != xno; then
-  AMDEP_TRUE=
-  AMDEP_FALSE='#'
-else
-  AMDEP_TRUE='#'
-  AMDEP_FALSE=
-fi
-
-
-
-depcc="$CC"   am_compiler_list=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_CC_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  am__universal=false
-  case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CC_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CC_dependencies_compiler_type=none
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
-CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
-
- if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
-  am__fastdepCC_TRUE=
-  am__fastdepCC_FALSE='#'
-else
-  am__fastdepCC_TRUE='#'
-  am__fastdepCC_FALSE=
-fi
-
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-if test -z "$CXX"; then
-  if test -n "$CCC"; then
-    CXX=$CCC
-  else
-    if test -n "$ac_tool_prefix"; then
-  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CXX+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CXX"; then
-  ac_cv_prog_CXX="$CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CXX=$ac_cv_prog_CXX
-if test -n "$CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
-$as_echo "$CXX" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$CXX" && break
-  done
-fi
-if test -z "$CXX"; then
-  ac_ct_CXX=$CXX
-  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CXX"; then
-  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CXX="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
-if test -n "$ac_ct_CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
-$as_echo "$ac_ct_CXX" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_CXX" && break
-done
-
-  if test "x$ac_ct_CXX" = x; then
-    CXX="g++"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CXX=$ac_ct_CXX
-  fi
-fi
-
-  fi
-fi
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
-  { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    sed '10a\
-... rest of stderr output deleted ...
-         10q' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-  fi
-  rm -f conftest.er1 conftest.err
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
-$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
-if test "${ac_cv_cxx_compiler_gnu+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_compiler_gnu=yes
-else
-  ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
-$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
-  GXX=yes
-else
-  GXX=
-fi
-ac_test_CXXFLAGS=${CXXFLAGS+set}
-ac_save_CXXFLAGS=$CXXFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
-$as_echo_n "checking whether $CXX accepts -g... " >&6; }
-if test "${ac_cv_prog_cxx_g+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
-   ac_cxx_werror_flag=yes
-   ac_cv_prog_cxx_g=no
-   CXXFLAGS="-g"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_cv_prog_cxx_g=yes
-else
-  CXXFLAGS=""
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-
-else
-  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
-	 CXXFLAGS="-g"
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_cv_prog_cxx_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
-$as_echo "$ac_cv_prog_cxx_g" >&6; }
-if test "$ac_test_CXXFLAGS" = set; then
-  CXXFLAGS=$ac_save_CXXFLAGS
-elif test $ac_cv_prog_cxx_g = yes; then
-  if test "$GXX" = yes; then
-    CXXFLAGS="-g -O2"
-  else
-    CXXFLAGS="-g"
-  fi
-else
-  if test "$GXX" = yes; then
-    CXXFLAGS="-O2"
-  else
-    CXXFLAGS=
-  fi
-fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-depcc="$CXX"  am_compiler_list=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_CXX_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  am__universal=false
-  case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CXX_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CXX_dependencies_compiler_type=none
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
-CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
-
- if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
-  am__fastdepCXX_TRUE=
-  am__fastdepCXX_FALSE='#'
-else
-  am__fastdepCXX_TRUE='#'
-  am__fastdepCXX_FALSE=
-fi
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler vendor" >&5
-$as_echo_n "checking for C compiler vendor... " >&6; }
-if test "${ax_cv_c_compiler_vendor+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ax_cv_c_compiler_vendor=unknown
-  # note: don't check for gcc first since some other compilers define __GNUC__
-  for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale:__PATHCC__,__PATHSCALE__ clang:__clang__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do
-    vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")"
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-#if !($vencpp)
-      thisisanerror;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_c_compiler_vendor=`echo $ventest | cut -d: -f1`; break
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  done
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_vendor" >&5
-$as_echo "$ax_cv_c_compiler_vendor" >&6; }
-
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if test "${ac_cv_build+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
-  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
-test "x$ac_build_alias" = x &&
-  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5 ;;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if test "${ac_cv_host+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "x$host_alias" = x; then
-  ac_cv_host=$ac_cv_build
-else
-  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
-    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
-case $ac_cv_host in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5 ;;
-esac
-host=$ac_cv_host
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_host
-shift
-host_cpu=$1
-host_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-host_os=$*
-IFS=$ac_save_IFS
-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
-
-
-
-
-
-
-
-# Check whether --enable-portable-binary was given.
-if test "${enable_portable_binary+set}" = set; then :
-  enableval=$enable_portable_binary; acx_maxopt_portable=$withval
-else
-  acx_maxopt_portable=no
-fi
-
-
-# Try to determine "good" native compiler flags if none specified via CFLAGS
-if test "$ac_test_CFLAGS" != "set"; then
-  CFLAGS=""
-  case $ax_cv_c_compiler_vendor in
-    dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host"
-	 if test "x$acx_maxopt_portable" = xno; then
-           CFLAGS="$CFLAGS -arch host"
-         fi;;
-
-    sun) CFLAGS="-native -fast -xO5 -dalign"
-	 if test "x$acx_maxopt_portable" = xyes; then
-	   CFLAGS="$CFLAGS -xarch=generic"
-         fi;;
-
-    hp)  CFLAGS="+Oall +Optrs_ansi +DSnative"
-	 if test "x$acx_maxopt_portable" = xyes; then
-	   CFLAGS="$CFLAGS +DAportable"
-	 fi;;
-
-    ibm) if test "x$acx_maxopt_portable" = xno; then
-           xlc_opt="-qarch=auto -qtune=auto"
-	 else
-           xlc_opt="-qtune=auto"
-	 fi
-          { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $xlc_opt" >&5
-$as_echo_n "checking whether C compiler accepts $xlc_opt... " >&6; }
-ax_save_FLAGS=$CFLAGS
-   CFLAGS="$xlc_opt"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval `$as_echo "ax_cv_c_flags_$xlc_opt" | $as_tr_sh`=yes
-else
-  eval `$as_echo "ax_cv_c_flags_$xlc_opt" | $as_tr_sh`=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   CFLAGS=$ax_save_FLAGS
-eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$xlc_opt" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	CFLAGS="-O3 -qansialias -w $xlc_opt"
-else
-	CFLAGS="-O3 -qansialias -w"
-                echo "******************************************************"
-                echo "*  You seem to have the IBM  C compiler.  It is      *"
-                echo "*  recommended for best performance that you use:    *"
-                echo "*                                                    *"
-                echo "*    CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *"
-                echo "*                      ^^^        ^^^                *"
-                echo "*  where xxx is pwr2, pwr3, 604, or whatever kind of *"
-                echo "*  CPU you have.  (Set the CFLAGS environment var.   *"
-                echo "*  and re-run configure.)  For more info, man cc.    *"
-                echo "******************************************************"
-fi
-
-         ;;
-
-    intel) CFLAGS="-O3 -ansi_alias"
-	if test "x$acx_maxopt_portable" = xno; then
-	  icc_archflag=unknown
-	  icc_flags=""
-	  case $host_cpu in
-	    i686*|x86_64*)
-              # icc accepts gcc assembly syntax, so these should work:
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0 output" >&5
-$as_echo_n "checking for x86 cpuid 0 output... " >&6; }
-if test "${ax_cv_gcc_x86_cpuid_0+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ax_cv_gcc_x86_cpuid_0=unknown
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-
-     int op = 0, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ax_cv_gcc_x86_cpuid_0=`cat conftest_cpuid`; rm -f conftest_cpuid
-else
-  ax_cv_gcc_x86_cpuid_0=unknown; rm -f conftest_cpuid
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0" >&5
-$as_echo "$ax_cv_gcc_x86_cpuid_0" >&6; }
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 1 output" >&5
-$as_echo_n "checking for x86 cpuid 1 output... " >&6; }
-if test "${ax_cv_gcc_x86_cpuid_1+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ax_cv_gcc_x86_cpuid_1=unknown
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-
-     int op = 1, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ax_cv_gcc_x86_cpuid_1=`cat conftest_cpuid`; rm -f conftest_cpuid
-else
-  ax_cv_gcc_x86_cpuid_1=unknown; rm -f conftest_cpuid
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_1" >&5
-$as_echo "$ax_cv_gcc_x86_cpuid_1" >&6; }
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-	      case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG
-                *:756e6547:*:*) # Intel
-                  case $ax_cv_gcc_x86_cpuid_1 in
-                    *6a?:*[234]:*:*|*6[789b]?:*:*:*) icc_flags="-xK";;
-                    *f3[347]:*:*:*|*f41347:*:*:*) icc_flags="-xP -xN -xW -xK";;
-                    *f??:*:*:*) icc_flags="-xN -xW -xK";;
-                  esac ;;
-              esac ;;
-          esac
-          if test "x$icc_flags" != x; then
-            for flag in $icc_flags; do
-               { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
-$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
-ax_save_FLAGS=$CFLAGS
-   CFLAGS="$flag"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=yes
-else
-  eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   CFLAGS=$ax_save_FLAGS
-eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	icc_archflag=$flag; break
-else
-	:
-fi
-
-            done
-          fi
-          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for icc architecture flag" >&5
-$as_echo_n "checking for icc architecture flag... " >&6; }
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $icc_archflag" >&5
-$as_echo "$icc_archflag" >&6; }
-          if test "x$icc_archflag" != xunknown; then
-            CFLAGS="$CFLAGS $icc_archflag"
-          fi
-        fi
-	;;
-
-    gnu)
-     # default optimization flags for gcc on all systems
-     CFLAGS="-O3 -fomit-frame-pointer"
-
-     # -malign-double for x86 systems
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -malign-double" >&5
-$as_echo_n "checking whether C compiler accepts -malign-double... " >&6; }
-if test "${ax_cv_c_flags__malign_double+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      ax_save_FLAGS=$CFLAGS
-      CFLAGS="-malign-double"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_c_flags__malign_double=yes
-else
-  ax_cv_c_flags__malign_double=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-      CFLAGS=$ax_save_FLAGS
-fi
-
-eval ax_check_compiler_flags=$ax_cv_c_flags__malign_double
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	CFLAGS="$CFLAGS -malign-double"
-else
-	:
-fi
-
-
-     #  -fstrict-aliasing for gcc-2.95+
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fstrict-aliasing" >&5
-$as_echo_n "checking whether C compiler accepts -fstrict-aliasing... " >&6; }
-if test "${ax_cv_c_flags__fstrict_aliasing+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      ax_save_FLAGS=$CFLAGS
-      CFLAGS="-fstrict-aliasing"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_c_flags__fstrict_aliasing=yes
-else
-  ax_cv_c_flags__fstrict_aliasing=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-      CFLAGS=$ax_save_FLAGS
-fi
-
-eval ax_check_compiler_flags=$ax_cv_c_flags__fstrict_aliasing
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	CFLAGS="$CFLAGS -fstrict-aliasing"
-else
-	:
-fi
-
-
-     # note that we enable "unsafe" fp optimization with other compilers, too
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -ffast-math" >&5
-$as_echo_n "checking whether C compiler accepts -ffast-math... " >&6; }
-if test "${ax_cv_c_flags__ffast_math+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-      ax_save_FLAGS=$CFLAGS
-      CFLAGS="-ffast-math"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_c_flags__ffast_math=yes
-else
-  ax_cv_c_flags__ffast_math=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-      CFLAGS=$ax_save_FLAGS
-fi
-
-eval ax_check_compiler_flags=$ax_cv_c_flags__ffast_math
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	CFLAGS="$CFLAGS -ffast-math"
-else
-	:
-fi
-
-
-
-
-
-
-# Check whether --with-gcc-arch was given.
-if test "${with_gcc_arch+set}" = set; then :
-  withval=$with_gcc_arch; ax_gcc_arch=$withval
-else
-  ax_gcc_arch=yes
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc architecture flag" >&5
-$as_echo_n "checking for gcc architecture flag... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
-$as_echo "" >&6; }
-if test "${ax_cv_gcc_archflag+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-ax_cv_gcc_archflag="unknown"
-
-if test "$GCC" = yes; then
-
-if test "x$ax_gcc_arch" = xyes; then
-ax_gcc_arch=""
-if test "$cross_compiling" = no; then
-case $host_cpu in
-  i[3456]86*|x86_64*) # use cpuid codes, in part from x86info-1.7 by D. Jones
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0 output" >&5
-$as_echo_n "checking for x86 cpuid 0 output... " >&6; }
-if test "${ax_cv_gcc_x86_cpuid_0+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ax_cv_gcc_x86_cpuid_0=unknown
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-
-     int op = 0, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ax_cv_gcc_x86_cpuid_0=`cat conftest_cpuid`; rm -f conftest_cpuid
-else
-  ax_cv_gcc_x86_cpuid_0=unknown; rm -f conftest_cpuid
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0" >&5
-$as_echo "$ax_cv_gcc_x86_cpuid_0" >&6; }
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 1 output" >&5
-$as_echo_n "checking for x86 cpuid 1 output... " >&6; }
-if test "${ax_cv_gcc_x86_cpuid_1+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ax_cv_gcc_x86_cpuid_1=unknown
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-
-     int op = 1, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ax_cv_gcc_x86_cpuid_1=`cat conftest_cpuid`; rm -f conftest_cpuid
-else
-  ax_cv_gcc_x86_cpuid_1=unknown; rm -f conftest_cpuid
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_1" >&5
-$as_echo "$ax_cv_gcc_x86_cpuid_1" >&6; }
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-     case $ax_cv_gcc_x86_cpuid_0 in
-       *:756e6547:*:*) # Intel
-          case $ax_cv_gcc_x86_cpuid_1 in
-	    *5[48]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;;
-	    *5??:*:*:*) ax_gcc_arch=pentium ;;
-	    *6[3456]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
-	    *6a?:*[01]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
-	    *6a?:*[234]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
-	    *6[9d]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;;
-	    *6[78b]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
-	    *6??:*:*:*) ax_gcc_arch=pentiumpro ;;
-            *f3[347]:*:*:*|*f41347:*:*:*)
-		case $host_cpu in
-                  x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;;
-                  *) ax_gcc_arch="prescott pentium4 pentiumpro" ;;
-                esac ;;
-            *f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";;
-          esac ;;
-       *:68747541:*:*) # AMD
-          case $ax_cv_gcc_x86_cpuid_1 in
-	    *5[67]?:*:*:*) ax_gcc_arch=k6 ;;
-	    *5[8d]?:*:*:*) ax_gcc_arch="k6-2 k6" ;;
-	    *5[9]?:*:*:*) ax_gcc_arch="k6-3 k6" ;;
-	    *60?:*:*:*) ax_gcc_arch=k7 ;;
-	    *6[12]?:*:*:*) ax_gcc_arch="athlon k7" ;;
-	    *6[34]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;;
-	    *67?:*:*:*) ax_gcc_arch="athlon-4 athlon k7" ;;
-	    *6[68a]?:*:*:*)
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86 cpuid 0x80000006 output" >&5
-$as_echo_n "checking for x86 cpuid 0x80000006 output... " >&6; }
-if test "${ax_cv_gcc_x86_cpuid_0x80000006+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ax_cv_gcc_x86_cpuid_0x80000006=unknown
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-
-     int op = 0x80000006, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ax_cv_gcc_x86_cpuid_0x80000006=`cat conftest_cpuid`; rm -f conftest_cpuid
-else
-  ax_cv_gcc_x86_cpuid_0x80000006=unknown; rm -f conftest_cpuid
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_x86_cpuid_0x80000006" >&5
-$as_echo "$ax_cv_gcc_x86_cpuid_0x80000006" >&6; }
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
- # L2 cache size
-	       case $ax_cv_gcc_x86_cpuid_0x80000006 in
-                 *:*:*[1-9a-f]??????:*) # (L2 = ecx >> 16) >= 256
-			ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;;
-                 *) ax_gcc_arch="athlon-4 athlon k7" ;;
-	       esac ;;
-	    *f[4cef8b]?:*:*:*) ax_gcc_arch="athlon64 k8" ;;
-	    *f5?:*:*:*) ax_gcc_arch="opteron k8" ;;
-	    *f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;;
-	    *f??:*:*:*) ax_gcc_arch="k8" ;;
-          esac ;;
-	*:746e6543:*:*) # IDT
-	   case $ax_cv_gcc_x86_cpuid_1 in
-	     *54?:*:*:*) ax_gcc_arch=winchip-c6 ;;
-	     *58?:*:*:*) ax_gcc_arch=winchip2 ;;
-	     *6[78]?:*:*:*) ax_gcc_arch=c3 ;;
-	     *69?:*:*:*) ax_gcc_arch="c3-2 c3" ;;
-	   esac ;;
-     esac
-     if test x"$ax_gcc_arch" = x; then # fallback
-	case $host_cpu in
-	  i586*) ax_gcc_arch=pentium ;;
-	  i686*) ax_gcc_arch=pentiumpro ;;
-        esac
-     fi
-     ;;
-
-  sparc*)
-     # Extract the first word of "prtdiag", so it can be a program name with args.
-set dummy prtdiag; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_PRTDIAG+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $PRTDIAG in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_PRTDIAG="$PRTDIAG" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_dummy="$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/"
-for as_dir in $as_dummy
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_path_PRTDIAG="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-  test -z "$ac_cv_path_PRTDIAG" && ac_cv_path_PRTDIAG="prtdiag"
-  ;;
-esac
-fi
-PRTDIAG=$ac_cv_path_PRTDIAG
-if test -n "$PRTDIAG"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PRTDIAG" >&5
-$as_echo "$PRTDIAG" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-     cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null`
-     cputype=`echo "$cputype" | tr -d ' -' |tr $as_cr_LETTERS $as_cr_letters`
-     case $cputype in
-         *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;;
-         *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;;
-         *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;;
-         *supersparc*|*tms390z5[05]*) ax_gcc_arch="supersparc v8" ;;
-         *hypersparc*|*rt62[056]*) ax_gcc_arch="hypersparc v8" ;;
-         *cypress*) ax_gcc_arch=cypress ;;
-     esac ;;
-
-  alphaev5) ax_gcc_arch=ev5 ;;
-  alphaev56) ax_gcc_arch=ev56 ;;
-  alphapca56) ax_gcc_arch="pca56 ev56" ;;
-  alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;;
-  alphaev6) ax_gcc_arch=ev6 ;;
-  alphaev67) ax_gcc_arch=ev67 ;;
-  alphaev68) ax_gcc_arch="ev68 ev67" ;;
-  alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;;
-  alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;;
-  alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;;
-
-  powerpc*)
-     cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null`
-     cputype=`echo $cputype | sed -e 's/ppc//g;s/ *//g'`
-     case $cputype in
-       *750*) ax_gcc_arch="750 G3" ;;
-       *740[0-9]*) ax_gcc_arch="$cputype 7400 G4" ;;
-       *74[4-5][0-9]*) ax_gcc_arch="$cputype 7450 G4" ;;
-       *74[0-9][0-9]*) ax_gcc_arch="$cputype G4" ;;
-       *970*) ax_gcc_arch="970 G5 power4";;
-       *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";;
-       *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";;
-       603ev|8240) ax_gcc_arch="$cputype 603e 603";;
-       *) ax_gcc_arch=$cputype ;;
-     esac
-     ax_gcc_arch="$ax_gcc_arch powerpc"
-     ;;
-esac
-fi # not cross-compiling
-fi # guess arch
-
-if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then
-for arch in $ax_gcc_arch; do
-  if test "x$acx_maxopt_portable" = xyes; then # if we require portable code
-    flags="-mtune=$arch"
-    # -mcpu=$arch and m$arch generate nonportable code on every arch except
-    # x86.  And some other arches (e.g. Alpha) don't accept -mtune.  Grrr.
-    case $host_cpu in i*86|x86_64*) flags="$flags -mcpu=$arch -m$arch";; esac
-  else
-    flags="-march=$arch -mcpu=$arch -m$arch"
-  fi
-  for flag in $flags; do
-     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
-$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
-ax_save_FLAGS=$CFLAGS
-   CFLAGS="$flag"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=yes
-else
-  eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   CFLAGS=$ax_save_FLAGS
-eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	ax_cv_gcc_archflag=$flag; break
-else
-	:
-fi
-
-  done
-  test "x$ax_cv_gcc_archflag" = xunknown || break
-done
-fi
-
-fi # $GCC=yes
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc architecture flag" >&5
-$as_echo_n "checking for gcc architecture flag... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_archflag" >&5
-$as_echo "$ax_cv_gcc_archflag" >&6; }
-if test "x$ax_cv_gcc_archflag" = xunknown; then
-  :
-else
-  CFLAGS="$CFLAGS $ax_cv_gcc_archflag"
-fi
-
-
-     # drop to -O1 for gcc 4.2
-     $CC --version |
-	sed -e 's/.* \([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\1 \2/' |
-	(read major minor
-	    if test $major -eq 4 -a $minor -eq 2; then
-				exit 0
-	    fi
-	    exit 1
-	) && CFLAGS="-O1"
-     ;;
-  esac
-
-  if test -z "$CFLAGS"; then
-	echo ""
-	echo "********************************************************"
-        echo "* WARNING: Don't know the best CFLAGS for this system  *"
-        echo "* Use ./configure CFLAGS=... to specify your own flags *"
-	echo "* (otherwise, a default of CFLAGS=-O3 will be used)    *"
-	echo "********************************************************"
-	echo ""
-        CFLAGS="-O3"
-  fi
-
-   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CFLAGS" >&5
-$as_echo_n "checking whether C compiler accepts $CFLAGS... " >&6; }
-ax_save_FLAGS=$CFLAGS
-   CFLAGS="$CFLAGS"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval `$as_echo "ax_cv_c_flags_$CFLAGS" | $as_tr_sh`=yes
-else
-  eval `$as_echo "ax_cv_c_flags_$CFLAGS" | $as_tr_sh`=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   CFLAGS=$ax_save_FLAGS
-eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$CFLAGS" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5
-$as_echo "$ax_check_compiler_flags" >&6; }
-if test "x$ax_check_compiler_flags" = xyes; then
-	:
-else
-
-	echo ""
-        echo "********************************************************"
-        echo "* WARNING: The guessed CFLAGS don't seem to work with  *"
-        echo "* your compiler.                                       *"
-        echo "* Use ./configure CFLAGS=... to specify your own flags *"
-        echo "********************************************************"
-        echo ""
-        CFLAGS=""
-
-fi
-
-
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports function __attribute__((__warn_unused_result__))" >&5
-$as_echo_n "checking whether the compiler supports function __attribute__((__warn_unused_result__))... " >&6; }
-if test "${ax_cv_gcc_warn_unused_result+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-__attribute__((__warn_unused_result__))
- int f(int i) { return i; }
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_gcc_warn_unused_result=yes
-else
-  ax_cv_gcc_warn_unused_result=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_warn_unused_result" >&5
-$as_echo "$ax_cv_gcc_warn_unused_result" >&6; }
- if test "$ax_cv_gcc_warn_unused_result" = yes; then
-
-$as_echo "#define GCC_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__))" >>confdefs.h
-
- fi
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __attribute__" >&5
-$as_echo_n "checking for __attribute__... " >&6; }
-if test "${ax_cv___attribute__+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-	  static void foo(void) __attribute__ ((unused));
-	  static void
-	  foo(void) {
-	      exit(1);
-	  }
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv___attribute__=yes
-else
-  ax_cv___attribute__=no
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv___attribute__" >&5
-$as_echo "$ax_cv___attribute__" >&6; }
-  if test "$ax_cv___attribute__" = "yes"; then
-
-$as_echo "#define HAVE___ATTRIBUTE__ 1" >>confdefs.h
-
-  fi
-
-
-case `pwd` in
-  *\ * | *\	*)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
-$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
-esac
-
-
-
-macro_version='2.2.6b'
-macro_revision='1.3017'
-
-
-
-
-
-
-
-
-
-
-
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
-$as_echo_n "checking for a sed that does not truncate output... " >&6; }
-if test "${ac_cv_path_SED+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
-     for ac_i in 1 2 3 4 5 6 7; do
-       ac_script="$ac_script$as_nl$ac_script"
-     done
-     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
-     { ac_script=; unset ac_script;}
-     if test -z "$SED"; then
-  ac_path_SED_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
-# Check for GNU ac_path_SED and select it if it is found.
-  # Check for GNU $ac_path_SED
-case `"$ac_path_SED" --version 2>&1` in
-*GNU*)
-  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo '' >> "conftest.nl"
-    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_SED_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_SED="$ac_path_SED"
-      ac_path_SED_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_SED_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_SED"; then
-    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
-  fi
-else
-  ac_cv_path_SED=$SED
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
-$as_echo "$ac_cv_path_SED" >&6; }
- SED="$ac_cv_path_SED"
-  rm -f conftest.sed
-
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if test "${ac_cv_path_GREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$GREP"; then
-  ac_path_GREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in grep ggrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
-# Check for GNU ac_path_GREP and select it if it is found.
-  # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'GREP' >> "conftest.nl"
-    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_GREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_GREP="$ac_path_GREP"
-      ac_path_GREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_GREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_GREP"; then
-    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if test "${ac_cv_path_EGREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
-   then ac_cv_path_EGREP="$GREP -E"
-   else
-     if test -z "$EGREP"; then
-  ac_path_EGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in egrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
-  # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'EGREP' >> "conftest.nl"
-    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_EGREP="$ac_path_EGREP"
-      ac_path_EGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_EGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_EGREP"; then
-    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_EGREP=$EGREP
-fi
-
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
-$as_echo_n "checking for fgrep... " >&6; }
-if test "${ac_cv_path_FGREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
-   then ac_cv_path_FGREP="$GREP -F"
-   else
-     if test -z "$FGREP"; then
-  ac_path_FGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in fgrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
-# Check for GNU ac_path_FGREP and select it if it is found.
-  # Check for GNU $ac_path_FGREP
-case `"$ac_path_FGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'FGREP' >> "conftest.nl"
-    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_FGREP="$ac_path_FGREP"
-      ac_path_FGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_FGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_FGREP"; then
-    as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_FGREP=$FGREP
-fi
-
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
-$as_echo "$ac_cv_path_FGREP" >&6; }
- FGREP="$ac_cv_path_FGREP"
-
-
-test -z "$GREP" && GREP=grep
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | ?:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if test "${lt_cv_path_LD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if test "${lt_cv_prog_gnu_ld+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
-$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
-if test "${lt_cv_path_NM+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  : ${lt_cv_path_NM=no}
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
-$as_echo "$lt_cv_path_NM" >&6; }
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
-else
-  # Didn't find any BSD compatible name lister, look for dumpbin.
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in "dumpbin -symbols" "link -dump -symbols"
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_DUMPBIN+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DUMPBIN"; then
-  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DUMPBIN=$ac_cv_prog_DUMPBIN
-if test -n "$DUMPBIN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
-$as_echo "$DUMPBIN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$DUMPBIN" && break
-  done
-fi
-if test -z "$DUMPBIN"; then
-  ac_ct_DUMPBIN=$DUMPBIN
-  for ac_prog in "dumpbin -symbols" "link -dump -symbols"
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DUMPBIN"; then
-  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
-if test -n "$ac_ct_DUMPBIN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
-$as_echo "$ac_ct_DUMPBIN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_DUMPBIN" && break
-done
-
-  if test "x$ac_ct_DUMPBIN" = x; then
-    DUMPBIN=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DUMPBIN=$ac_ct_DUMPBIN
-  fi
-fi
-
-
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
-  fi
-fi
-test -z "$NM" && NM=nm
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
-$as_echo_n "checking the name lister ($NM) interface... " >&6; }
-if test "${lt_cv_nm_interface+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_nm_interface="BSD nm"
-  echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:6351: $ac_compile\"" >&5)
-  (eval "$ac_compile" 2>conftest.err)
-  cat conftest.err >&5
-  (eval echo "\"\$as_me:6354: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
-  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
-  cat conftest.err >&5
-  (eval echo "\"\$as_me:6357: output\"" >&5)
-  cat conftest.out >&5
-  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
-    lt_cv_nm_interface="MS dumpbin"
-  fi
-  rm -f conftest*
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
-$as_echo "$lt_cv_nm_interface" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
-$as_echo_n "checking whether ln -s works... " >&6; }
-LN_S=$as_ln_s
-if test "$LN_S" = "ln -s"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
-$as_echo "no, using $LN_S" >&6; }
-fi
-
-# find the maximum length of command line arguments
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
-$as_echo_n "checking the maximum length of command line arguments... " >&6; }
-if test "${lt_cv_sys_max_cmd_len+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-    i=0
-  teststring="ABCD"
-
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
-
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
-
-  cygwin* | mingw* | cegcc*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
-
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
-
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    else
-      # Make teststring a little bigger before we do anything with it.
-      # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
-        teststring=$teststring$teststring
-      done
-      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-      # If test is not a shell built-in, we'll probably end up computing a
-      # maximum length that is only half of the actual maximum length, but
-      # we can't tell.
-      while { test "X"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
-	         = "XX$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
-      do
-        i=`expr $i + 1`
-        teststring=$teststring$teststring
-      done
-      # Only check the string length outside the loop.
-      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
-      teststring=
-      # Add a significant safety factor because C++ compilers can tack on
-      # massive amounts of additional arguments before passing them to the
-      # linker.  It appears as though 1/2 is a usable value.
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    fi
-    ;;
-  esac
-
-fi
-
-if test -n $lt_cv_sys_max_cmd_len ; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
-$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
-$as_echo "none" >&6; }
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-
-
-
-
-
-
-: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
-$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
-$as_echo "$xsi_shell" >&6; }
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
-$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
-$as_echo "$lt_shell_append" >&6; }
-
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  lt_unset=unset
-else
-  lt_unset=false
-fi
-
-
-
-
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  lt_SP2NL='tr \040 \012'
-  lt_NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  lt_SP2NL='tr \100 \n'
-  lt_NL2SP='tr \r\n \100\100'
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
-$as_echo_n "checking for $LD option to reload object files... " >&6; }
-if test "${lt_cv_ld_reload_flag+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_reload_flag='-r'
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
-$as_echo "$lt_cv_ld_reload_flag" >&6; }
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
-set dummy ${ac_tool_prefix}objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OBJDUMP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OBJDUMP"; then
-  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OBJDUMP=$ac_cv_prog_OBJDUMP
-if test -n "$OBJDUMP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
-$as_echo "$OBJDUMP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OBJDUMP"; then
-  ac_ct_OBJDUMP=$OBJDUMP
-  # Extract the first word of "objdump", so it can be a program name with args.
-set dummy objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OBJDUMP"; then
-  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OBJDUMP="objdump"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
-if test -n "$ac_ct_OBJDUMP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
-$as_echo "$ac_ct_OBJDUMP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OBJDUMP" = x; then
-    OBJDUMP="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OBJDUMP=$ac_ct_OBJDUMP
-  fi
-else
-  OBJDUMP="$ac_cv_prog_OBJDUMP"
-fi
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
-$as_echo_n "checking how to recognize dependent libraries... " >&6; }
-if test "${lt_cv_deplibs_check_method+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[4-9]*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[45]*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump',
-  # unless we find 'file', for example because we are cross-compiling.
-  if ( file / ) >/dev/null 2>&1; then
-    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-    lt_cv_file_magic_cmd='func_win32_libid'
-  else
-    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
-    lt_cv_file_magic_cmd='$OBJDUMP -f'
-  fi
-  ;;
-
-cegcc)
-  # use the weaker test based on 'objdump'. See mingw*.
-  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
-
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-freebsd* | dragonfly*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
-
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
-
-interix[3-9]*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd* | netbsdelf*-gnu)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
-  fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-*nto* | *qnx*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-rdos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-tpf*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
-$as_echo "$lt_cv_deplibs_check_method" >&6; }
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_AR+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$AR"; then
-  ac_cv_prog_AR="$AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_AR="${ac_tool_prefix}ar"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-AR=$ac_cv_prog_AR
-if test -n "$AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
-$as_echo "$AR" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_AR"; then
-  ac_ct_AR=$AR
-  # Extract the first word of "ar", so it can be a program name with args.
-set dummy ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_AR+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_AR"; then
-  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_AR="ar"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_AR=$ac_cv_prog_ac_ct_AR
-if test -n "$ac_ct_AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
-$as_echo "$ac_ct_AR" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_AR" = x; then
-    AR="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    AR=$ac_ct_AR
-  fi
-else
-  AR="$ac_cv_prog_AR"
-fi
-
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-
-
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-test -z "$STRIP" && STRIP=:
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_RANLIB+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
-  ac_ct_RANLIB=$RANLIB
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_RANLIB"; then
-  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_RANLIB="ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_RANLIB" = x; then
-    RANLIB=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    RANLIB=$ac_ct_RANLIB
-  fi
-else
-  RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-test -z "$RANLIB" && RANLIB=:
-
-
-
-
-
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
-$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
-if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[BCDEGRST]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[BCDT]'
-  ;;
-cygwin* | mingw* | pw32* | cegcc*)
-  symcode='[ABCDGISTW]'
-  ;;
-hpux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[ABCDEGRST]'
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[BCDEGRST]'
-  ;;
-osf*)
-  symcode='[BCDEGQRST]'
-  ;;
-solaris*)
-  symcode='[BDRT]'
-  ;;
-sco3.2v5*)
-  symcode='[DT]'
-  ;;
-sysv4.2uw2*)
-  symcode='[DT]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[ABDT]'
-  ;;
-sysv4)
-  symcode='[DFNSTU]'
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[ABCDGIRSTW]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
-    # Also find C++ and __fastcall symbols from MSVC++,
-    # which start with @ or ?.
-    lt_cv_sys_global_symbol_pipe="$AWK '"\
-"     {last_section=section; section=\$ 3};"\
-"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-"     \$ 0!~/External *\|/{next};"\
-"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-"     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-"     ' prfx=^$ac_symprfx"
-  else
-    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-  fi
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\""; } >&5
-  (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
-	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<_LT_EOF > conftest.$ac_ext
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
-	  cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols.  */
-const struct {
-  const char *name;
-  void       *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[] =
-{
-  { "@PROGRAM@", (void *) 0 },
-_LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
-	  cat <<\_LT_EOF >> conftest.$ac_ext
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_save_LIBS="$LIBS"
-	  lt_save_CFLAGS="$CFLAGS"
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS="$lt_save_LIBS"
-	  CFLAGS="$lt_save_CFLAGS"
-	else
-	  echo "cannot find nm_test_func in $nlist" >&5
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&5
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
-    fi
-  else
-    echo "$progname: failed program was:" >&5
-    cat conftest.$ac_ext >&5
-  fi
-  rm -rf conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-
-fi
-
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
-$as_echo "failed" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
-$as_echo "ok" >&6; }
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Check whether --enable-libtool-lock was given.
-if test "${enable_libtool_lock+set}" = set; then :
-  enableval=$enable_libtool_lock;
-fi
-
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.$ac_objext` in
-      *ELF-32*)
-	HPUX_IA64_MODE="32"
-	;;
-      *ELF-64*)
-	HPUX_IA64_MODE="64"
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '#line 7562 "configure"' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -melf32bsmip"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -melf32bmipn32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -melf64bmip"
-	;;
-      esac
-    else
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -32"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -n32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -64"
-	  ;;
-      esac
-    fi
-  fi
-  rm -rf conftest*
-  ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.o` in
-      *32-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_i386_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_i386"
-	    ;;
-	  ppc64-*linux*|powerpc64-*linux*)
-	    LD="${LD-ld} -m elf32ppclinux"
-	    ;;
-	  s390x-*linux*)
-	    LD="${LD-ld} -m elf_s390"
-	    ;;
-	  sparc64-*linux*)
-	    LD="${LD-ld} -m elf32_sparc"
-	    ;;
-	esac
-	;;
-      *64-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_x86_64_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_x86_64"
-	    ;;
-	  ppc*-*linux*|powerpc*-*linux*)
-	    LD="${LD-ld} -m elf64ppc"
-	    ;;
-	  s390*-*linux*|s390*-*tpf*)
-	    LD="${LD-ld} -m elf64_s390"
-	    ;;
-	  sparc*-*linux*)
-	    LD="${LD-ld} -m elf64_sparc"
-	    ;;
-	esac
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
-$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
-if test "${lt_cv_cc_needs_belf+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_cc_needs_belf=yes
-else
-  lt_cv_cc_needs_belf=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-     ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
-$as_echo "$lt_cv_cc_needs_belf" >&6; }
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-sparc*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
-      *)
-	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
-	  LD="${LD-ld} -64"
-	fi
-	;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-esac
-
-need_locks="$enable_libtool_lock"
-
-
-  case $host_os in
-    rhapsody* | darwin*)
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
-set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_DSYMUTIL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DSYMUTIL"; then
-  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DSYMUTIL=$ac_cv_prog_DSYMUTIL
-if test -n "$DSYMUTIL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
-$as_echo "$DSYMUTIL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_DSYMUTIL"; then
-  ac_ct_DSYMUTIL=$DSYMUTIL
-  # Extract the first word of "dsymutil", so it can be a program name with args.
-set dummy dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DSYMUTIL"; then
-  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
-if test -n "$ac_ct_DSYMUTIL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
-$as_echo "$ac_ct_DSYMUTIL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_DSYMUTIL" = x; then
-    DSYMUTIL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DSYMUTIL=$ac_ct_DSYMUTIL
-  fi
-else
-  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
-set dummy ${ac_tool_prefix}nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_NMEDIT+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$NMEDIT"; then
-  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-NMEDIT=$ac_cv_prog_NMEDIT
-if test -n "$NMEDIT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
-$as_echo "$NMEDIT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_NMEDIT"; then
-  ac_ct_NMEDIT=$NMEDIT
-  # Extract the first word of "nmedit", so it can be a program name with args.
-set dummy nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_NMEDIT"; then
-  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_NMEDIT="nmedit"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
-if test -n "$ac_ct_NMEDIT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
-$as_echo "$ac_ct_NMEDIT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_NMEDIT" = x; then
-    NMEDIT=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    NMEDIT=$ac_ct_NMEDIT
-  fi
-else
-  NMEDIT="$ac_cv_prog_NMEDIT"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
-set dummy ${ac_tool_prefix}lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_LIPO+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$LIPO"; then
-  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-LIPO=$ac_cv_prog_LIPO
-if test -n "$LIPO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
-$as_echo "$LIPO" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_LIPO"; then
-  ac_ct_LIPO=$LIPO
-  # Extract the first word of "lipo", so it can be a program name with args.
-set dummy lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_LIPO"; then
-  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_LIPO="lipo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
-if test -n "$ac_ct_LIPO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
-$as_echo "$ac_ct_LIPO" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_LIPO" = x; then
-    LIPO=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    LIPO=$ac_ct_LIPO
-  fi
-else
-  LIPO="$ac_cv_prog_LIPO"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OTOOL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OTOOL"; then
-  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL=$ac_cv_prog_OTOOL
-if test -n "$OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
-$as_echo "$OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL"; then
-  ac_ct_OTOOL=$OTOOL
-  # Extract the first word of "otool", so it can be a program name with args.
-set dummy otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OTOOL"; then
-  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OTOOL="otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
-if test -n "$ac_ct_OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
-$as_echo "$ac_ct_OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OTOOL" = x; then
-    OTOOL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OTOOL=$ac_ct_OTOOL
-  fi
-else
-  OTOOL="$ac_cv_prog_OTOOL"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OTOOL64+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OTOOL64"; then
-  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL64=$ac_cv_prog_OTOOL64
-if test -n "$OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
-$as_echo "$OTOOL64" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL64"; then
-  ac_ct_OTOOL64=$OTOOL64
-  # Extract the first word of "otool64", so it can be a program name with args.
-set dummy otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OTOOL64"; then
-  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OTOOL64="otool64"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
-if test -n "$ac_ct_OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
-$as_echo "$ac_ct_OTOOL64" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OTOOL64" = x; then
-    OTOOL64=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OTOOL64=$ac_ct_OTOOL64
-  fi
-else
-  OTOOL64="$ac_cv_prog_OTOOL64"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
-$as_echo_n "checking for -single_module linker flag... " >&6; }
-if test "${lt_cv_apple_cc_single_mod+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
-	# By default we will add the -single_module flag. You can override
-	# by either setting the environment variable LT_MULTI_MODULE
-	# non-empty at configure time, or by adding -multi_module to the
-	# link flags.
-	rm -rf libconftest.dylib*
-	echo "int foo(void){return 1;}" > conftest.c
-	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&5
-	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
-        _lt_result=$?
-	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
-	  lt_cv_apple_cc_single_mod=yes
-	else
-	  cat conftest.err >&5
-	fi
-	rm -rf libconftest.dylib*
-	rm -f conftest.*
-      fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
-$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
-$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
-if test "${lt_cv_ld_exported_symbols_list+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_exported_symbols_list=no
-      save_LDFLAGS=$LDFLAGS
-      echo "_main" > conftest.sym
-      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_ld_exported_symbols_list=yes
-else
-  lt_cv_ld_exported_symbols_list=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-	LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
-$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
-    case $host_os in
-    rhapsody* | darwin1.[012])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-    darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-    darwin*) # darwin 5.x on
-      # if running on 10.5 or later, the deployment target defaults
-      # to the OS version, if on x86, and 10.4, the deployment
-      # target defaults to 10.4. Don't you love it?
-      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[012]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-      esac
-    ;;
-  esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-      _lt_dar_single_mod='$single_module'
-    fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-    else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    fi
-    if test "$DSYMUTIL" != ":"; then
-      _lt_dsymutil='~$DSYMUTIL $lib || :'
-    else
-      _lt_dsymutil=
-    fi
-    ;;
-  esac
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-  if test "${ac_cv_prog_CPP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-      # Double quotes because CPP needs to be expanded
-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-  break
-fi
-
-    done
-    ac_cv_prog_CPP=$CPP
-
-fi
-  CPP=$ac_cv_prog_CPP
-else
-  ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5 ; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if test "${ac_cv_header_stdc+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_stdc=yes
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      return 2;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
-		  inttypes.h stdint.h unistd.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in dlfcn.h
-do :
-  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
-"
-if test "x$ac_cv_header_dlfcn_h" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DLFCN_H 1
-_ACEOF
-
-fi
-
-done
-
-
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-if test -z "$CXX"; then
-  if test -n "$CCC"; then
-    CXX=$CCC
-  else
-    if test -n "$ac_tool_prefix"; then
-  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CXX+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CXX"; then
-  ac_cv_prog_CXX="$CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CXX=$ac_cv_prog_CXX
-if test -n "$CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
-$as_echo "$CXX" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$CXX" && break
-  done
-fi
-if test -z "$CXX"; then
-  ac_ct_CXX=$CXX
-  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CXX"; then
-  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CXX="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
-if test -n "$ac_ct_CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
-$as_echo "$ac_ct_CXX" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_CXX" && break
-done
-
-  if test "x$ac_ct_CXX" = x; then
-    CXX="g++"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CXX=$ac_ct_CXX
-  fi
-fi
-
-  fi
-fi
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
-  { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    sed '10a\
-... rest of stderr output deleted ...
-         10q' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-  fi
-  rm -f conftest.er1 conftest.err
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
-$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
-if test "${ac_cv_cxx_compiler_gnu+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_compiler_gnu=yes
-else
-  ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
-$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
-  GXX=yes
-else
-  GXX=
-fi
-ac_test_CXXFLAGS=${CXXFLAGS+set}
-ac_save_CXXFLAGS=$CXXFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
-$as_echo_n "checking whether $CXX accepts -g... " >&6; }
-if test "${ac_cv_prog_cxx_g+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
-   ac_cxx_werror_flag=yes
-   ac_cv_prog_cxx_g=no
-   CXXFLAGS="-g"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_cv_prog_cxx_g=yes
-else
-  CXXFLAGS=""
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-
-else
-  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
-	 CXXFLAGS="-g"
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_cv_prog_cxx_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
-$as_echo "$ac_cv_prog_cxx_g" >&6; }
-if test "$ac_test_CXXFLAGS" = set; then
-  CXXFLAGS=$ac_save_CXXFLAGS
-elif test $ac_cv_prog_cxx_g = yes; then
-  if test "$GXX" = yes; then
-    CXXFLAGS="-g -O2"
-  else
-    CXXFLAGS="-g"
-  fi
-else
-  if test "$GXX" = yes; then
-    CXXFLAGS="-O2"
-  else
-    CXXFLAGS=
-  fi
-fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-depcc="$CXX"  am_compiler_list=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_CXX_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  am__universal=false
-  case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CXX_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CXX_dependencies_compiler_type=none
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
-CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
-
- if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
-  am__fastdepCXX_TRUE=
-  am__fastdepCXX_FALSE='#'
-else
-  am__fastdepCXX_TRUE='#'
-  am__fastdepCXX_FALSE=
-fi
-
-
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
-  ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
-$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
-if test -z "$CXXCPP"; then
-  if test "${ac_cv_prog_CXXCPP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-      # Double quotes because CXXCPP needs to be expanded
-    for CXXCPP in "$CXX -E" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-  break
-fi
-
-    done
-    ac_cv_prog_CXXCPP=$CXXCPP
-
-fi
-  CXXCPP=$ac_cv_prog_CXXCPP
-else
-  ac_cv_prog_CXXCPP=$CXXCPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
-$as_echo "$CXXCPP" >&6; }
-ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-_lt_caught_CXX_error=yes; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-else
-  _lt_caught_CXX_error=yes
-fi
-
-
-
-
-
-# Set options
-
-
-
-        enable_dlopen=no
-
-
-  enable_win32_dll=no
-
-
-            # Check whether --enable-shared was given.
-if test "${enable_shared+set}" = set; then :
-  enableval=$enable_shared; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_shared=yes
-fi
-
-
-
-
-
-
-
-
-
-  # Check whether --enable-static was given.
-if test "${enable_static+set}" = set; then :
-  enableval=$enable_static; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_static=yes
-fi
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-pic was given.
-if test "${with_pic+set}" = set; then :
-  withval=$with_pic; pic_mode="$withval"
-else
-  pic_mode=default
-fi
-
-
-test -z "$pic_mode" && pic_mode=default
-
-
-
-
-
-
-
-  # Check whether --enable-fast-install was given.
-if test "${enable_fast_install+set}" = set; then :
-  enableval=$enable_fast_install; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_fast_install=yes
-fi
-
-
-
-
-
-
-
-
-
-
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-test -z "$LN_S" && LN_S="ln -s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
-$as_echo_n "checking for objdir... " >&6; }
-if test "${lt_cv_objdir+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
-$as_echo "$lt_cv_objdir" >&6; }
-objdir=$lt_cv_objdir
-
-
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define LT_OBJDIR "$lt_cv_objdir/"
-_ACEOF
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
-
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
-$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/${ac_tool_prefix}file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-
-
-
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
-$as_echo_n "checking for file... " >&6; }
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  else
-    MAGIC_CMD=:
-  fi
-fi
-
-  fi
-  ;;
-esac
-
-# Use C for the default configuration in the libtool script
-
-lt_save_CC="$CC"
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-objext=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-
-lt_prog_compiler_no_builtin_flag=
-
-if test "$GCC" = yes; then
-  lt_prog_compiler_no_builtin_flag=' -fno-builtin'
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
-if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_rtti_exceptions=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="-fno-rtti -fno-exceptions"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:9618: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:9622: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_rtti_exceptions=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
-$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
-
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
-    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
-else
-    :
-fi
-
-fi
-
-
-
-
-
-
-  lt_prog_compiler_wl=
-lt_prog_compiler_pic=
-lt_prog_compiler_static=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-
-  if test "$GCC" = yes; then
-    lt_prog_compiler_wl='-Wl,'
-    lt_prog_compiler_static='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            lt_prog_compiler_pic='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic='-fno-common'
-      ;;
-
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='-fPIC'
-	;;
-      esac
-      ;;
-
-    interix[3-9]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      lt_prog_compiler_can_build_shared=no
-      enable_shared=no
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic='-fPIC -shared'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic=-Kconform_pic
-      fi
-      ;;
-
-    *)
-      lt_prog_compiler_pic='-fPIC'
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      lt_prog_compiler_wl='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      else
-	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC (with -KPIC) is the default.
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
-      case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
-      ecc*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-KPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      # icc used to be incompatible with GCC.
-      # ICC 10 doesn't accept -KPIC any more.
-      icc* | ifort*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      # Lahey Fortran 8.1.
-      lf95*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='--shared'
-	lt_prog_compiler_static='--static'
-	;;
-      pgcc* | pgf77* | pgf90* | pgf95*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fpic'
-	lt_prog_compiler_static='-Bstatic'
-        ;;
-      ccc*)
-        lt_prog_compiler_wl='-Wl,'
-        # All Alpha code is PIC.
-        lt_prog_compiler_static='-non_shared'
-        ;;
-      xl*)
-	# IBM XL C 8.0/Fortran 10.1 on PPC
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-qpic'
-	lt_prog_compiler_static='-qstaticlink'
-	;;
-      *)
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)
-	  # Sun C 5.9
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl='-Wl,'
-	  ;;
-	*Sun\ F*)
-	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl=''
-	  ;;
-	esac
-	;;
-      esac
-      ;;
-
-    newsos6)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic='-fPIC -shared'
-      ;;
-
-    osf3* | osf4* | osf5*)
-      lt_prog_compiler_wl='-Wl,'
-      # All OSF/1 code is PIC.
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    rdos*)
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    solaris*)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95*)
-	lt_prog_compiler_wl='-Qoption ld ';;
-      *)
-	lt_prog_compiler_wl='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      lt_prog_compiler_wl='-Qoption ld '
-      lt_prog_compiler_pic='-PIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	lt_prog_compiler_pic='-Kconform_pic'
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    unicos*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_can_build_shared=no
-      ;;
-
-    uts4*)
-      lt_prog_compiler_pic='-pic'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    *)
-      lt_prog_compiler_can_build_shared=no
-      ;;
-    esac
-  fi
-
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic=
-    ;;
-  *)
-    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
-    ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5
-$as_echo "$lt_prog_compiler_pic" >&6; }
-
-
-
-
-
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
-if test "${lt_cv_prog_compiler_pic_works+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_pic_works=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:9957: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:9961: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_pic_works=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
-    case $lt_prog_compiler_pic in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
-     esac
-else
-    lt_prog_compiler_pic=
-     lt_prog_compiler_can_build_shared=no
-fi
-
-fi
-
-
-
-
-
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if test "${lt_cv_prog_compiler_static_works+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_static_works=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler_static_works=yes
-       fi
-     else
-       lt_cv_prog_compiler_static_works=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
-$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_static_works" = xyes; then
-    :
-else
-    lt_prog_compiler_static=
-fi
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:10062: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:10066: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:10117: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:10121: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-
-  runpath_var=
-  allow_undefined_flag=
-  always_export_symbols=no
-  archive_cmds=
-  archive_expsym_cmds=
-  compiler_needs_object=no
-  enable_shared_with_static_runtimes=no
-  export_dynamic_flag_spec=
-  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  hardcode_automatic=no
-  hardcode_direct=no
-  hardcode_direct_absolute=no
-  hardcode_libdir_flag_spec=
-  hardcode_libdir_flag_spec_ld=
-  hardcode_libdir_separator=
-  hardcode_minus_L=no
-  hardcode_shlibpath_var=unsupported
-  inherit_rpath=no
-  link_all_deplibs=unknown
-  module_cmds=
-  module_expsym_cmds=
-  old_archive_from_new_cmds=
-  old_archive_from_expsyms_cmds=
-  thread_safe_flag_spec=
-  whole_archive_flag_spec=
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  include_expsyms=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  # Exclude shared library initialization/finalization symbols.
-  extract_expsyms_cmds=
-
-  case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  linux* | k*bsd*-gnu)
-    link_all_deplibs=no
-    ;;
-  esac
-
-  ld_shlibs=yes
-  if test "$with_gnu_ld" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-    export_dynamic_flag_spec='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      whole_archive_flag_spec=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>&1` in
-      *GNU\ gold*) supports_anon_versioning=yes ;;
-      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[3-9]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
-
-_LT_EOF
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds=''
-        ;;
-      m68k)
-            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_minus_L=yes
-        ;;
-      esac
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	allow_undefined_flag=unsupported
-	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
-      # as there is no search path for DLLs.
-      hardcode_libdir_flag_spec='-L$libdir'
-      allow_undefined_flag=unsupported
-      always_export_symbols=no
-      enable_shared_with_static_runtimes=yes
-      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
-
-      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    interix[3-9]*)
-      hardcode_direct=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
-	case $cc_basename in
-	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
-	esac
-      fi
-      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
-      then
-	tmp_addflag=
-	tmp_sharedflag='-shared'
-	case $cc_basename,$host_cpu in
-        pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	lf95*)				# Lahey Fortran 8.1
-	  whole_archive_flag_spec=
-	  tmp_sharedflag='--shared' ;;
-	xl[cC]*)			# IBM XL C 8.0 on PPC (deal with xlf below)
-	  tmp_sharedflag='-qmkshrobj'
-	  tmp_addflag= ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object=yes
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	esac
-	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-        if test "x$supports_anon_versioning" = xyes; then
-          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-        fi
-
-	case $cc_basename in
-	xlf*)
-	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
-	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
-	  hardcode_libdir_flag_spec=
-	  hardcode_libdir_flag_spec_ld='-rpath $libdir'
-	  archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
-	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
-	  fi
-	  ;;
-	esac
-      else
-        ld_shlibs=no
-      fi
-      ;;
-
-    netbsd* | netbsdelf*-gnu)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  # For security reasons, it is highly recommended that you always
-	  # use absolute paths for naming shared libraries, and exclude the
-	  # DT_RUNPATH tag from executables and libraries.  But doing so
-	  # requires that you compile everything twice, which is a pain.
-	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  else
-	    ld_shlibs=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-    esac
-
-    if test "$ld_shlibs" = no; then
-      runpath_var=
-      hardcode_libdir_flag_spec=
-      export_dynamic_flag_spec=
-      whole_archive_flag_spec=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      allow_undefined_flag=unsupported
-      always_export_symbols=yes
-      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      hardcode_minus_L=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	hardcode_direct=unsupported
-      fi
-      ;;
-
-    aix[4-9]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	else
-	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
-	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-	    aix_use_runtimelinking=yes
-	    break
-	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      archive_cmds=''
-      hardcode_direct=yes
-      hardcode_direct_absolute=yes
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      file_list_spec='${wl}-f,'
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[012]|aix4.[012].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	  # We have reworked collect2
-	  :
-	  else
-	  # We have old collect2
-	  hardcode_direct=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  hardcode_minus_L=yes
-	  hardcode_libdir_flag_spec='-L$libdir'
-	  hardcode_libdir_separator=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-	link_all_deplibs=no
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      export_dynamic_flag_spec='${wl}-bexpall'
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      always_export_symbols=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	allow_undefined_flag='-berok'
-        # Determine the default libpath from the value encoded in an
-        # empty executable.
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-      else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
-	  allow_undefined_flag="-z nodefs"
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an
-	 # empty executable.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag=' ${wl}-bernotok'
-	  allow_undefined_flag=' ${wl}-berok'
-	  # Exported symbols can be pulled into shared objects from archives
-	  whole_archive_flag_spec='$convenience'
-	  archive_cmds_need_lc=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds=''
-        ;;
-      m68k)
-            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_minus_L=yes
-        ;;
-      esac
-      ;;
-
-    bsdi[45]*)
-      export_dynamic_flag_spec=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      hardcode_libdir_flag_spec=' '
-      allow_undefined_flag=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      old_archive_from_new_cmds='true'
-      # FIXME: Should let the user specify the lib program.
-      old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
-      fix_srcfile_path='`cygpath -w "$srcfile"`'
-      enable_shared_with_static_runtimes=yes
-      ;;
-
-    darwin* | rhapsody*)
-
-
-  archive_cmds_need_lc=no
-  hardcode_direct=no
-  hardcode_automatic=yes
-  hardcode_shlibpath_var=unsupported
-  whole_archive_flag_spec=''
-  link_all_deplibs=yes
-  allow_undefined_flag="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=echo
-    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-
-  else
-  ld_shlibs=no
-  fi
-
-      ;;
-
-    dgux*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
-
-    freebsd1*)
-      ld_shlibs=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_direct=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      hardcode_minus_L=yes
-      export_dynamic_flag_spec='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_flag_spec_ld='+b $libdir'
-	hardcode_libdir_separator=:
-	hardcode_direct=yes
-	hardcode_direct_absolute=yes
-	export_dynamic_flag_spec='${wl}-E'
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	hardcode_minus_L=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  hardcode_direct=no
-	  hardcode_shlibpath_var=no
-	  ;;
-	*)
-	  hardcode_direct=yes
-	  hardcode_direct_absolute=yes
-	  export_dynamic_flag_spec='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  hardcode_minus_L=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	# Try to use the -exported_symbol ld option, if it does not
-	# work, assume that -exports_file does not work either and
-	# implicitly export all symbols.
-        save_LDFLAGS="$LDFLAGS"
-        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-int foo(void) {}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-        LDFLAGS="$save_LDFLAGS"
-      else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      inherit_rpath=yes
-      link_all_deplibs=yes
-      ;;
-
-    netbsd* | netbsdelf*-gnu)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    newsos6)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_shlibpath_var=no
-      ;;
-
-    *nto* | *qnx*)
-      ;;
-
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	hardcode_direct=yes
-	hardcode_shlibpath_var=no
-	hardcode_direct_absolute=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	  export_dynamic_flag_spec='${wl}-E'
-	else
-	  case $host_os in
-	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     hardcode_libdir_flag_spec='-R$libdir'
-	     ;;
-	   *)
-	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-	fi
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    os2*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_minus_L=yes
-      allow_undefined_flag=unsupported
-      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	hardcode_libdir_flag_spec='-rpath $libdir'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_separator=:
-      ;;
-
-    solaris*)
-      no_undefined_flag=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-      else
-	case `$CC -V 2>&1` in
-	*"Compilers 5.0"*)
-	  wlarc=''
-	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
-	  ;;
-	*)
-	  wlarc='${wl}'
-	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-	  ;;
-	esac
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_shlibpath_var=no
-      case $host_os in
-      solaris2.[0-5] | solaris2.[0-5].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
-	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      link_all_deplibs=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  reload_cmds='$CC -r -o $output$reload_objs'
-	  hardcode_direct=no
-        ;;
-	motorola)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      hardcode_shlibpath_var=no
-      ;;
-
-    sysv4.3*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_shlibpath_var=no
-      export_dynamic_flag_spec='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	hardcode_shlibpath_var=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	ld_shlibs=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag='${wl}-z,text'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      no_undefined_flag='${wl}-z,text'
-      allow_undefined_flag='${wl}-z,nodefs'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-R,$libdir'
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      export_dynamic_flag_spec='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
-
-    *)
-      ld_shlibs=no
-      ;;
-    esac
-
-    if test x$host_vendor = xsni; then
-      case $host in
-      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	export_dynamic_flag_spec='${wl}-Blargedynsym'
-	;;
-      esac
-    fi
-  fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
-$as_echo "$ld_shlibs" >&6; }
-test "$ld_shlibs" = no && can_build_shared=no
-
-with_gnu_ld=$with_gnu_ld
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-      $RM conftest*
-      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-      if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } 2>conftest.err; then
-        soname=conftest
-        lib=conftest
-        libobjs=conftest.$ac_objext
-        deplibs=
-        wl=$lt_prog_compiler_wl
-	pic_flag=$lt_prog_compiler_pic
-        compiler_flags=-v
-        linker_flags=-v
-        verstring=
-        output_objdir=.
-        libname=conftest
-        lt_save_allow_undefined_flag=$allow_undefined_flag
-        allow_undefined_flag=
-        if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
-  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-        then
-	  archive_cmds_need_lc=no
-        else
-	  archive_cmds_need_lc=yes
-        fi
-        allow_undefined_flag=$lt_save_allow_undefined_flag
-      else
-        cat conftest.err 1>&5
-      fi
-      $RM conftest*
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5
-$as_echo "$archive_cmds_need_lc" >&6; }
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
-
-if test "$GCC" = yes; then
-  case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
-  esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-  if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'`
-  else
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-  fi
-  # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
-  lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
-  for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
-      test -d "$lt_sys_path" && \
-	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
-    fi
-  done
-  lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
-  for (lt_i = NF; lt_i > 0; lt_i--) {
-    if ($lt_i != "" && $lt_i != ".") {
-      if ($lt_i == "..") {
-        lt_count++;
-      } else {
-        if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
-        } else {
-          lt_count--;
-        }
-      }
-    }
-  }
-  if (lt_foo != "") { lt_freq[lt_foo]++; }
-  if (lt_freq[lt_foo] == 1) { print lt_foo; }
-}'`
-  sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[4-9]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[45]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
-        # It is most probably a Windows format PATH printed by
-        # mingw gcc, but we are running on Cygwin. Gcc prints its search
-        # path with ; separators, and with drive letters. We can handle the
-        # drive letters (cygwin fileutils understands them), so leave them,
-        # especially as we might pass files found there to a mingw objdump,
-        # which wouldn't understand a cygwinified path. Ahh.
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
-
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-
-  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd1*)
-  dynamic_linker=no
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[123]*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555.
-  postinstall_cmds='chmod 555 $lib'
-  ;;
-
-interix[3-9]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  # Some binutils ld are patched to set DT_RUNPATH
-  save_LDFLAGS=$LDFLAGS
-  save_libdir=$libdir
-  eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
-       LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
-  shlibpath_overrides_runpath=yes
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  LDFLAGS=$save_LDFLAGS
-  libdir=$save_libdir
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsdelf*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='NetBSD ld.elf_so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
-hardcode_action=
-if test -n "$hardcode_libdir_flag_spec" ||
-   test -n "$runpath_var" ||
-   test "X$hardcode_automatic" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$hardcode_direct" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
-     test "$hardcode_minus_L" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action=unsupported
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
-$as_echo "$hardcode_action" >&6; }
-
-if test "$hardcode_action" = relink ||
-   test "$inherit_rpath" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-
-
-
-
-
-
-  if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-    ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-    ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-
-fi
-
-    ;;
-
-  *)
-    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
-if test "x$ac_cv_func_shl_load" = x""yes; then :
-  lt_cv_dlopen="shl_load"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
-$as_echo_n "checking for shl_load in -ldld... " >&6; }
-if test "${ac_cv_lib_dld_shl_load+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char shl_load ();
-int
-main ()
-{
-return shl_load ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dld_shl_load=yes
-else
-  ac_cv_lib_dld_shl_load=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
-$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
-if test "x$ac_cv_lib_dld_shl_load" = x""yes; then :
-  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
-else
-  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
-if test "x$ac_cv_func_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
-$as_echo_n "checking for dlopen in -lsvld... " >&6; }
-if test "${ac_cv_lib_svld_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsvld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_svld_dlopen=yes
-else
-  ac_cv_lib_svld_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
-$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
-if test "x$ac_cv_lib_svld_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
-$as_echo_n "checking for dld_link in -ldld... " >&6; }
-if test "${ac_cv_lib_dld_dld_link+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dld_link ();
-int
-main ()
-{
-return dld_link ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dld_dld_link=yes
-else
-  ac_cv_lib_dld_dld_link=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
-$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
-if test "x$ac_cv_lib_dld_dld_link" = x""yes; then :
-  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-    ;;
-  esac
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
-$as_echo_n "checking whether a program can dlopen itself... " >&6; }
-if test "${lt_cv_dlopen_self+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-#line 12501 "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-void fnord() { int i=42;}
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}
-_LT_EOF
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self=no
-  fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
-$as_echo "$lt_cv_dlopen_self" >&6; }
-
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
-$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
-if test "${lt_cv_dlopen_self_static+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self_static=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-#line 12597 "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-void fnord() { int i=42;}
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}
-_LT_EOF
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self_static=no
-  fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
-$as_echo "$lt_cv_dlopen_self_static" >&6; }
-    fi
-
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
-
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-striplib=
-old_striplib=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
-$as_echo_n "checking whether stripping libraries is possible... " >&6; }
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-  darwin*)
-    if test -n "$STRIP" ; then
-      striplib="$STRIP -x"
-      old_striplib="$STRIP -S"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-    else
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    fi
-    ;;
-  *)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    ;;
-  esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-  # Report which library types will actually be built
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
-$as_echo_n "checking if libtool supports shared libraries... " >&6; }
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
-$as_echo "$can_build_shared" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
-$as_echo_n "checking whether to build shared libraries... " >&6; }
-  test "$can_build_shared" = "no" && enable_shared=no
-
-  # On AIX, shared libraries and static libraries use the same namespace, and
-  # are all built from PIC.
-  case $host_os in
-  aix3*)
-    test "$enable_shared" = yes && enable_static=no
-    if test -n "$RANLIB"; then
-      archive_cmds="$archive_cmds~\$RANLIB \$lib"
-      postinstall_cmds='$RANLIB $lib'
-    fi
-    ;;
-
-  aix[4-9]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
-    fi
-    ;;
-  esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
-$as_echo "$enable_shared" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
-$as_echo_n "checking whether to build static libraries... " >&6; }
-  # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
-$as_echo "$enable_static" >&6; }
-
-
-
-
-fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-CC="$lt_save_CC"
-
-
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-archive_cmds_need_lc_CXX=no
-allow_undefined_flag_CXX=
-always_export_symbols_CXX=no
-archive_expsym_cmds_CXX=
-compiler_needs_object_CXX=no
-export_dynamic_flag_spec_CXX=
-hardcode_direct_CXX=no
-hardcode_direct_absolute_CXX=no
-hardcode_libdir_flag_spec_CXX=
-hardcode_libdir_flag_spec_ld_CXX=
-hardcode_libdir_separator_CXX=
-hardcode_minus_L_CXX=no
-hardcode_shlibpath_var_CXX=unsupported
-hardcode_automatic_CXX=no
-inherit_rpath_CXX=no
-module_cmds_CXX=
-module_expsym_cmds_CXX=
-link_all_deplibs_CXX=unknown
-old_archive_cmds_CXX=$old_archive_cmds
-no_undefined_flag_CXX=
-whole_archive_flag_spec_CXX=
-enable_shared_with_static_runtimes_CXX=no
-
-# Source file extension for C++ test sources.
-ac_ext=cpp
-
-# Object file extension for compiled C++ test sources.
-objext=o
-objext_CXX=$objext
-
-# No sense in running all these tests if we already determined that
-# the CXX compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="int some_variable = 0;"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-
-  # save warnings/boilerplate of simple test code
-  ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-
-  ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC=$CC
-  lt_save_LD=$LD
-  lt_save_GCC=$GCC
-  GCC=$GXX
-  lt_save_with_gnu_ld=$with_gnu_ld
-  lt_save_path_LD=$lt_cv_path_LD
-  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
-    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
-  else
-    $as_unset lt_cv_prog_gnu_ld
-  fi
-  if test -n "${lt_cv_path_LDCXX+set}"; then
-    lt_cv_path_LD=$lt_cv_path_LDCXX
-  else
-    $as_unset lt_cv_path_LD
-  fi
-  test -z "${LDCXX+set}" || LD=$LDCXX
-  CC=${CXX-"c++"}
-  compiler=$CC
-  compiler_CXX=$CC
-  for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
-
-
-  if test -n "$compiler"; then
-    # We don't want -fno-exception when compiling C++ code, so set the
-    # no_builtin_flag separately
-    if test "$GXX" = yes; then
-      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
-    else
-      lt_prog_compiler_no_builtin_flag_CXX=
-    fi
-
-    if test "$GXX" = yes; then
-      # Set up default GNU C++ configuration
-
-
-
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | ?:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if test "${lt_cv_path_LD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if test "${lt_cv_prog_gnu_ld+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
-
-
-
-
-
-
-      # Check if GNU C++ uses GNU ld as the underlying linker, since the
-      # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-
-        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-        export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-
-        # If archive_cmds runs LD, not CC, wlarc should be empty
-        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
-        #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
-
-        # ancient GNU ld didn't support --whole-archive et. al.
-        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
-	  $GREP 'no-whole-archive' > /dev/null; then
-          whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-        else
-          whole_archive_flag_spec_CXX=
-        fi
-      else
-        with_gnu_ld=no
-        wlarc=
-
-        # A generic and very simple default shared library creation
-        # command for GNU C++ for the case where it uses the native
-        # linker, instead of GNU ld.  If possible, this setting should
-        # overridden to take advantage of the native linker features on
-        # the platform it is being used on.
-        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-      fi
-
-      # Commands to make compiler produce verbose output that lists
-      # what "hidden" libraries, object files and flags are used when
-      # linking a shared library.
-      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
-
-    else
-      GXX=no
-      with_gnu_ld=no
-      wlarc=
-    fi
-
-    # PORTME: fill in a description of your system's C++ link characteristics
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-    ld_shlibs_CXX=yes
-    case $host_os in
-      aix3*)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-        ;;
-      aix[4-9]*)
-        if test "$host_cpu" = ia64; then
-          # On IA64, the linker does run time linking by default, so we don't
-          # have to do anything special.
-          aix_use_runtimelinking=no
-          exp_sym_flag='-Bexport'
-          no_entry_flag=""
-        else
-          aix_use_runtimelinking=no
-
-          # Test if we are trying to use run time linking or normal
-          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
-          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
-	    for ld_flag in $LDFLAGS; do
-	      case $ld_flag in
-	      *-brtl*)
-	        aix_use_runtimelinking=yes
-	        break
-	        ;;
-	      esac
-	    done
-	    ;;
-          esac
-
-          exp_sym_flag='-bexport'
-          no_entry_flag='-bnoentry'
-        fi
-
-        # When large executables or shared objects are built, AIX ld can
-        # have problems creating the table of contents.  If linking a library
-        # or program results in "error TOC overflow" add -mminimal-toc to
-        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-        archive_cmds_CXX=''
-        hardcode_direct_CXX=yes
-        hardcode_direct_absolute_CXX=yes
-        hardcode_libdir_separator_CXX=':'
-        link_all_deplibs_CXX=yes
-        file_list_spec_CXX='${wl}-f,'
-
-        if test "$GXX" = yes; then
-          case $host_os in aix4.[012]|aix4.[012].*)
-          # We only want to do this on AIX 4.2 and lower, the check
-          # below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	    # We have reworked collect2
-	    :
-	  else
-	    # We have old collect2
-	    hardcode_direct_CXX=unsupported
-	    # It fails to find uninstalled libraries when the uninstalled
-	    # path is not listed in the libpath.  Setting hardcode_minus_L
-	    # to unsupported forces relinking
-	    hardcode_minus_L_CXX=yes
-	    hardcode_libdir_flag_spec_CXX='-L$libdir'
-	    hardcode_libdir_separator_CXX=
-	  fi
-          esac
-          shared_flag='-shared'
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag="$shared_flag "'${wl}-G'
-	  fi
-        else
-          # not using gcc
-          if test "$host_cpu" = ia64; then
-	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	  # chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-          else
-	    if test "$aix_use_runtimelinking" = yes; then
-	      shared_flag='${wl}-G'
-	    else
-	      shared_flag='${wl}-bM:SRE'
-	    fi
-          fi
-        fi
-
-        export_dynamic_flag_spec_CXX='${wl}-bexpall'
-        # It seems that -bexpall does not export symbols beginning with
-        # underscore (_), so it is better to generate a list of symbols to
-	# export.
-        always_export_symbols_CXX=yes
-        if test "$aix_use_runtimelinking" = yes; then
-          # Warning - without using the other runtime loading flags (-brtl),
-          # -berok will link without error, but may produce a broken library.
-          allow_undefined_flag_CXX='-berok'
-          # Determine the default libpath from the value encoded in an empty
-          # executable.
-          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-          hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
-
-          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-        else
-          if test "$host_cpu" = ia64; then
-	    hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
-	    allow_undefined_flag_CXX="-z nodefs"
-	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-          else
-	    # Determine the default libpath from the value encoded in an
-	    # empty executable.
-	    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-	    hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
-	    # Warning - without using the other run time loading flags,
-	    # -berok will link without error, but may produce a broken library.
-	    no_undefined_flag_CXX=' ${wl}-bernotok'
-	    allow_undefined_flag_CXX=' ${wl}-berok'
-	    # Exported symbols can be pulled into shared objects from archives
-	    whole_archive_flag_spec_CXX='$convenience'
-	    archive_cmds_need_lc_CXX=yes
-	    # This is similar to how AIX traditionally builds its shared
-	    # libraries.
-	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-          fi
-        fi
-        ;;
-
-      beos*)
-	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	  allow_undefined_flag_CXX=unsupported
-	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	  # support --undefined.  This deserves some investigation.  FIXME
-	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	else
-	  ld_shlibs_CXX=no
-	fi
-	;;
-
-      chorus*)
-        case $cc_basename in
-          *)
-	  # FIXME: insert proper C++ library support
-	  ld_shlibs_CXX=no
-	  ;;
-        esac
-        ;;
-
-      cygwin* | mingw* | pw32* | cegcc*)
-        # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
-        # as there is no search path for DLLs.
-        hardcode_libdir_flag_spec_CXX='-L$libdir'
-        allow_undefined_flag_CXX=unsupported
-        always_export_symbols_CXX=no
-        enable_shared_with_static_runtimes_CXX=yes
-
-        if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-          archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-          # If the export-symbols file already is a .def file (1st line
-          # is EXPORTS), use it as is; otherwise, prepend...
-          archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    cp $export_symbols $output_objdir/$soname.def;
-          else
-	    echo EXPORTS > $output_objdir/$soname.def;
-	    cat $export_symbols >> $output_objdir/$soname.def;
-          fi~
-          $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-        else
-          ld_shlibs_CXX=no
-        fi
-        ;;
-      darwin* | rhapsody*)
-
-
-  archive_cmds_need_lc_CXX=no
-  hardcode_direct_CXX=no
-  hardcode_automatic_CXX=yes
-  hardcode_shlibpath_var_CXX=unsupported
-  whole_archive_flag_spec_CXX=''
-  link_all_deplibs_CXX=yes
-  allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=echo
-    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-       if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-      archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
-    fi
-
-  else
-  ld_shlibs_CXX=no
-  fi
-
-	;;
-
-      dgux*)
-        case $cc_basename in
-          ec++*)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          ghcx*)
-	    # Green Hills C++ Compiler
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-        esac
-        ;;
-
-      freebsd[12]*)
-        # C++ shared libraries reported to be fairly broken before
-	# switch to ELF
-        ld_shlibs_CXX=no
-        ;;
-
-      freebsd-elf*)
-        archive_cmds_need_lc_CXX=no
-        ;;
-
-      freebsd* | dragonfly*)
-        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
-        # conventions
-        ld_shlibs_CXX=yes
-        ;;
-
-      gnu*)
-        ;;
-
-      hpux9*)
-        hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
-        hardcode_libdir_separator_CXX=:
-        export_dynamic_flag_spec_CXX='${wl}-E'
-        hardcode_direct_CXX=yes
-        hardcode_minus_L_CXX=yes # Not in the search PATH,
-				             # but as the default
-				             # location of the library.
-
-        case $cc_basename in
-          CC*)
-            # FIXME: insert proper C++ library support
-            ld_shlibs_CXX=no
-            ;;
-          aCC*)
-            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            # Commands to make compiler produce verbose output that lists
-            # what "hidden" libraries, object files and flags are used when
-            # linking a shared library.
-            #
-            # There doesn't appear to be a way to prevent this compiler from
-            # explicitly linking system object files so we need to strip them
-            # from the output so that they don't get included in the library
-            # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
-            ;;
-          *)
-            if test "$GXX" = yes; then
-              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            else
-              # FIXME: insert proper C++ library support
-              ld_shlibs_CXX=no
-            fi
-            ;;
-        esac
-        ;;
-
-      hpux10*|hpux11*)
-        if test $with_gnu_ld = no; then
-	  hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
-	  hardcode_libdir_separator_CXX=:
-
-          case $host_cpu in
-            hppa*64*|ia64*)
-              ;;
-            *)
-	      export_dynamic_flag_spec_CXX='${wl}-E'
-              ;;
-          esac
-        fi
-        case $host_cpu in
-          hppa*64*|ia64*)
-            hardcode_direct_CXX=no
-            hardcode_shlibpath_var_CXX=no
-            ;;
-          *)
-            hardcode_direct_CXX=yes
-            hardcode_direct_absolute_CXX=yes
-            hardcode_minus_L_CXX=yes # Not in the search PATH,
-					         # but as the default
-					         # location of the library.
-            ;;
-        esac
-
-        case $cc_basename in
-          CC*)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          aCC*)
-	    case $host_cpu in
-	      hppa*64*)
-	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      ia64*)
-	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      *)
-	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	    esac
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test $with_gnu_ld = no; then
-	        case $host_cpu in
-	          hppa*64*)
-	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          ia64*)
-	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          *)
-	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	        esac
-	      fi
-	    else
-	      # FIXME: insert proper C++ library support
-	      ld_shlibs_CXX=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      interix[3-9]*)
-	hardcode_direct_CXX=no
-	hardcode_shlibpath_var_CXX=no
-	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	export_dynamic_flag_spec_CXX='${wl}-E'
-	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-	# Instead, shared libraries are loaded at an image base (0x10000000 by
-	# default) and relocated if they conflict, which is a slow very memory
-	# consuming and fragmenting process.  To avoid this, we pick a random,
-	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-	archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	;;
-      irix5* | irix6*)
-        case $cc_basename in
-          CC*)
-	    # SGI C++
-	    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test "$with_gnu_ld" = no; then
-	        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	      else
-	        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib'
-	      fi
-	    fi
-	    link_all_deplibs_CXX=yes
-	    ;;
-        esac
-        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-        hardcode_libdir_separator_CXX=:
-        inherit_rpath_CXX=yes
-        ;;
-
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
-
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	    old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
-	    ;;
-	  icpc* | ecpc* )
-	    # Intel C++
-	    with_gnu_ld=yes
-	    # version 8.0 and above of icpc choke on multiply defined symbols
-	    # if we add $predep_objects and $postdep_objects, however 7.1 and
-	    # earlier do not add the objects themselves.
-	    case `$CC -V 2>&1` in
-	      *"Version 7."*)
-	        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	      *)  # Version 8.0 or newer
-	        tmp_idyn=
-	        case $host_cpu in
-		  ia64*) tmp_idyn=' -i_dynamic';;
-		esac
-	        archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	    esac
-	    archive_cmds_need_lc_CXX=no
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	    whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    ;;
-          pgCC* | pgcpp*)
-            # Portland Group C++ compiler
-	    case `$CC -V` in
-	    *pgCC\ [1-5]* | *pgcpp\ [1-5]*)
-	      prelink_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-		compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"'
-	      old_archive_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~
-		$RANLIB $oldlib'
-	      archive_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      archive_expsym_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    *) # Version 6 will use weak symbols
-	      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    esac
-
-	    hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	    whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-            ;;
-	  cxx*)
-	    # Compaq C++
-	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
-
-	    runpath_var=LD_RUN_PATH
-	    hardcode_libdir_flag_spec_CXX='-rpath $libdir'
-	    hardcode_libdir_separator_CXX=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
-	    ;;
-	  xl*)
-	    # IBM XL 8.0 on PPC, with GNU ld
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    if test "x$supports_anon_versioning" = xyes; then
-	      archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
-		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-		echo "local: *; };" >> $output_objdir/$libname.ver~
-		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-	    fi
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      no_undefined_flag_CXX=' -zdefs'
-	      archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
-	      hardcode_libdir_flag_spec_CXX='-R$libdir'
-	      whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-	      compiler_needs_object_CXX=yes
-
-	      # Not sure whether something based on
-	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
-	      # would be better.
-	      output_verbose_link_cmd='echo'
-
-	      # Archives containing C++ object files must be created using
-	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	      # necessary to make sure instantiated templates are included
-	      # in the archive.
-	      old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-
-      lynxos*)
-        # FIXME: insert proper C++ library support
-	ld_shlibs_CXX=no
-	;;
-
-      m88k*)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-	;;
-
-      mvs*)
-        case $cc_basename in
-          cxx*)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-	  *)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-	esac
-	;;
-
-      netbsd*)
-        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	  archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
-	  wlarc=
-	  hardcode_libdir_flag_spec_CXX='-R$libdir'
-	  hardcode_direct_CXX=yes
-	  hardcode_shlibpath_var_CXX=no
-	fi
-	# Workaround some broken pre-1.5 toolchains
-	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
-	;;
-
-      *nto* | *qnx*)
-        ld_shlibs_CXX=yes
-	;;
-
-      openbsd2*)
-        # C++ shared libraries are fairly broken
-	ld_shlibs_CXX=no
-	;;
-
-      openbsd*)
-	if test -f /usr/libexec/ld.so; then
-	  hardcode_direct_CXX=yes
-	  hardcode_shlibpath_var_CXX=no
-	  hardcode_direct_absolute_CXX=yes
-	  archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-	  hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-	    export_dynamic_flag_spec_CXX='${wl}-E'
-	    whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-	  fi
-	  output_verbose_link_cmd=echo
-	else
-	  ld_shlibs_CXX=no
-	fi
-	;;
-
-      osf3* | osf4* | osf5*)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	    hardcode_libdir_separator_CXX=:
-
-	    # Archives containing C++ object files must be created using
-	    # the KAI C++ compiler.
-	    case $host in
-	      osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
-	      *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
-	    esac
-	    ;;
-          RCC*)
-	    # Rational C++ 2.4.1
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          cxx*)
-	    case $host in
-	      osf3*)
-	        allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
-	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-	        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-		;;
-	      *)
-	        allow_undefined_flag_CXX=' -expect_unresolved \*'
-	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-	        archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	          echo "-hidden">> $lib.exp~
-	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~
-	          $RM $lib.exp'
-	        hardcode_libdir_flag_spec_CXX='-rpath $libdir'
-		;;
-	    esac
-
-	    hardcode_libdir_separator_CXX=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
-	    ;;
-	  *)
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
-	      case $host in
-	        osf3*)
-	          archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	        *)
-	          archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	      esac
-
-	      hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-	      hardcode_libdir_separator_CXX=:
-
-	      # Commands to make compiler produce verbose output that lists
-	      # what "hidden" libraries, object files and flags are used when
-	      # linking a shared library.
-	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
-
-	    else
-	      # FIXME: insert proper C++ library support
-	      ld_shlibs_CXX=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      psos*)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-        ;;
-
-      sunos4*)
-        case $cc_basename in
-          CC*)
-	    # Sun C++ 4.x
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          lcc*)
-	    # Lucid
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-        esac
-        ;;
-
-      solaris*)
-        case $cc_basename in
-          CC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-            archive_cmds_need_lc_CXX=yes
-	    no_undefined_flag_CXX=' -zdefs'
-	    archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	    archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	    hardcode_libdir_flag_spec_CXX='-R$libdir'
-	    hardcode_shlibpath_var_CXX=no
-	    case $host_os in
-	      solaris2.[0-5] | solaris2.[0-5].*) ;;
-	      *)
-		# The compiler driver will combine and reorder linker options,
-		# but understands `-z linker_flag'.
-	        # Supported since Solaris 2.6 (maybe 2.5.1?)
-		whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
-	        ;;
-	    esac
-	    link_all_deplibs_CXX=yes
-
-	    output_verbose_link_cmd='echo'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
-	    ;;
-          gcx*)
-	    # Green Hills C++ Compiler
-	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-
-	    # The C++ compiler must be used to create the archive.
-	    old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    # GNU C++ compiler with Solaris linker
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
-	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-	        archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
-	      else
-	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
-	        # platform.
-	        archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
-	      fi
-
-	      hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
-	      case $host_os in
-		solaris2.[0-5] | solaris2.[0-5].*) ;;
-		*)
-		  whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-		  ;;
-	      esac
-	    fi
-	    ;;
-        esac
-        ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag_CXX='${wl}-z,text'
-      archive_cmds_need_lc_CXX=no
-      hardcode_shlibpath_var_CXX=no
-      runpath_var='LD_RUN_PATH'
-
-      case $cc_basename in
-        CC*)
-	  archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-      esac
-      ;;
-
-      sysv5* | sco3.2v5* | sco5v6*)
-	# Note: We can NOT use -z defs as we might desire, because we do not
-	# link with -lc, and that would cause any symbols used from libc to
-	# always be unresolved, which means just about no library would
-	# ever link correctly.  If we're not using GNU ld we use -z text
-	# though, which does catch some bad symbols but isn't as heavy-handed
-	# as -z defs.
-	no_undefined_flag_CXX='${wl}-z,text'
-	allow_undefined_flag_CXX='${wl}-z,nodefs'
-	archive_cmds_need_lc_CXX=no
-	hardcode_shlibpath_var_CXX=no
-	hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir'
-	hardcode_libdir_separator_CXX=':'
-	link_all_deplibs_CXX=yes
-	export_dynamic_flag_spec_CXX='${wl}-Bexport'
-	runpath_var='LD_RUN_PATH'
-
-	case $cc_basename in
-          CC*)
-	    archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    ;;
-	  *)
-	    archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    ;;
-	esac
-      ;;
-
-      tandem*)
-        case $cc_basename in
-          NCC*)
-	    # NonStop-UX NCC 3.20
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    ld_shlibs_CXX=no
-	    ;;
-        esac
-        ;;
-
-      vxworks*)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-        ;;
-
-      *)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-        ;;
-    esac
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
-$as_echo "$ld_shlibs_CXX" >&6; }
-    test "$ld_shlibs_CXX" = no && can_build_shared=no
-
-    GCC_CXX="$GXX"
-    LD_CXX="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    # Dependencies to place before and after the object being linked:
-predep_objects_CXX=
-postdep_objects_CXX=
-predeps_CXX=
-postdeps_CXX=
-compiler_lib_search_path_CXX=
-
-cat > conftest.$ac_ext <<_LT_EOF
-class Foo
-{
-public:
-  Foo (void) { a = 0; }
-private:
-  int a;
-};
-_LT_EOF
-
-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-  # Parse the compiler output and extract the necessary
-  # objects, libraries and library flags.
-
-  # Sentinel used to keep track of whether or not we are before
-  # the conftest object file.
-  pre_test_object_deps_done=no
-
-  for p in `eval "$output_verbose_link_cmd"`; do
-    case $p in
-
-    -L* | -R* | -l*)
-       # Some compilers place space between "-{L,R}" and the path.
-       # Remove the space.
-       if test $p = "-L" ||
-          test $p = "-R"; then
-	 prev=$p
-	 continue
-       else
-	 prev=
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 case $p in
-	 -L* | -R*)
-	   # Internal compiler library paths should come after those
-	   # provided the user.  The postdeps already come after the
-	   # user supplied libs so there is no need to process them.
-	   if test -z "$compiler_lib_search_path_CXX"; then
-	     compiler_lib_search_path_CXX="${prev}${p}"
-	   else
-	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
-	   fi
-	   ;;
-	 # The "-l" case would never come before the object being
-	 # linked, so don't bother handling this case.
-	 esac
-       else
-	 if test -z "$postdeps_CXX"; then
-	   postdeps_CXX="${prev}${p}"
-	 else
-	   postdeps_CXX="${postdeps_CXX} ${prev}${p}"
-	 fi
-       fi
-       ;;
-
-    *.$objext)
-       # This assumes that the test object file only shows up
-       # once in the compiler output.
-       if test "$p" = "conftest.$objext"; then
-	 pre_test_object_deps_done=yes
-	 continue
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 if test -z "$predep_objects_CXX"; then
-	   predep_objects_CXX="$p"
-	 else
-	   predep_objects_CXX="$predep_objects_CXX $p"
-	 fi
-       else
-	 if test -z "$postdep_objects_CXX"; then
-	   postdep_objects_CXX="$p"
-	 else
-	   postdep_objects_CXX="$postdep_objects_CXX $p"
-	 fi
-       fi
-       ;;
-
-    *) ;; # Ignore the rest.
-
-    esac
-  done
-
-  # Clean up.
-  rm -f a.out a.exe
-else
-  echo "libtool.m4: error: problem compiling CXX test program"
-fi
-
-$RM -f confest.$objext
-
-# PORTME: override above test on systems where it is broken
-case $host_os in
-interix[3-9]*)
-  # Interix 3.5 installs completely hosed .la files for C++, so rather than
-  # hack all around it, let's just trust "g++" to DTRT.
-  predep_objects_CXX=
-  postdep_objects_CXX=
-  postdeps_CXX=
-  ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    if test "$solaris_use_stlport4" != yes; then
-      postdeps_CXX='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      postdeps_CXX='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-esac
-
-
-case " $postdeps_CXX " in
-*" -lc "*) archive_cmds_need_lc_CXX=no ;;
-esac
- compiler_lib_search_dirs_CXX=
-if test -n "${compiler_lib_search_path_CXX}"; then
- compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    lt_prog_compiler_wl_CXX=
-lt_prog_compiler_pic_CXX=
-lt_prog_compiler_static_CXX=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-
-  # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
-    lt_prog_compiler_wl_CXX='-Wl,'
-    lt_prog_compiler_static_CXX='-static'
-
-    case $host_os in
-    aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static_CXX='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            lt_prog_compiler_pic_CXX='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-    mingw* | cygwin* | os2* | pw32* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
-      ;;
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic_CXX='-fno-common'
-      ;;
-    *djgpp*)
-      # DJGPP does not support shared libraries at all
-      lt_prog_compiler_pic_CXX=
-      ;;
-    interix[3-9]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic_CXX=-Kconform_pic
-      fi
-      ;;
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	;;
-      *)
-	lt_prog_compiler_pic_CXX='-fPIC'
-	;;
-      esac
-      ;;
-    *qnx* | *nto*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic_CXX='-fPIC -shared'
-      ;;
-    *)
-      lt_prog_compiler_pic_CXX='-fPIC'
-      ;;
-    esac
-  else
-    case $host_os in
-      aix[4-9]*)
-	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
-	  # AIX 5 now supports IA64 processor
-	  lt_prog_compiler_static_CXX='-Bstatic'
-	else
-	  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
-	fi
-	;;
-      chorus*)
-	case $cc_basename in
-	cxch68*)
-	  # Green Hills C++ Compiler
-	  # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
-	  ;;
-	esac
-	;;
-      dgux*)
-	case $cc_basename in
-	  ec++*)
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    ;;
-	  ghcx*)
-	    # Green Hills C++ Compiler
-	    lt_prog_compiler_pic_CXX='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      freebsd* | dragonfly*)
-	# FreeBSD uses GNU C++
-	;;
-      hpux9* | hpux10* | hpux11*)
-	case $cc_basename in
-	  CC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
-	      lt_prog_compiler_pic_CXX='+Z'
-	    fi
-	    ;;
-	  aCC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
-	    case $host_cpu in
-	    hppa*64*|ia64*)
-	      # +Z the default
-	      ;;
-	    *)
-	      lt_prog_compiler_pic_CXX='+Z'
-	      ;;
-	    esac
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      interix*)
-	# This is c89, which is MS Visual C++ (no shared libs)
-	# Anyone wants to do a port?
-	;;
-      irix5* | irix6* | nonstopux*)
-	case $cc_basename in
-	  CC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='-non_shared'
-	    # CC pic flag -KPIC is the default.
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-	case $cc_basename in
-	  KCC*)
-	    # KAI C++ Compiler
-	    lt_prog_compiler_wl_CXX='--backend -Wl,'
-	    lt_prog_compiler_pic_CXX='-fPIC'
-	    ;;
-	  ecpc* )
-	    # old Intel C++ for x86_64 which still supported -KPIC.
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    lt_prog_compiler_static_CXX='-static'
-	    ;;
-	  icpc* )
-	    # Intel C++, used to be incompatible with GCC.
-	    # ICC 10 doesn't accept -KPIC any more.
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-fPIC'
-	    lt_prog_compiler_static_CXX='-static'
-	    ;;
-	  pgCC* | pgcpp*)
-	    # Portland Group C++ compiler
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-fpic'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    ;;
-	  cxx*)
-	    # Compaq C++
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    lt_prog_compiler_pic_CXX=
-	    lt_prog_compiler_static_CXX='-non_shared'
-	    ;;
-	  xlc* | xlC*)
-	    # IBM XL 8.0 on PPC
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-qpic'
-	    lt_prog_compiler_static_CXX='-qstaticlink'
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      lt_prog_compiler_pic_CXX='-KPIC'
-	      lt_prog_compiler_static_CXX='-Bstatic'
-	      lt_prog_compiler_wl_CXX='-Qoption ld '
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-      lynxos*)
-	;;
-      m88k*)
-	;;
-      mvs*)
-	case $cc_basename in
-	  cxx*)
-	    lt_prog_compiler_pic_CXX='-W c,exportall'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      netbsd* | netbsdelf*-gnu)
-	;;
-      *qnx* | *nto*)
-        # QNX uses GNU C++, but need to define -shared option too, otherwise
-        # it will coredump.
-        lt_prog_compiler_pic_CXX='-fPIC -shared'
-        ;;
-      osf3* | osf4* | osf5*)
-	case $cc_basename in
-	  KCC*)
-	    lt_prog_compiler_wl_CXX='--backend -Wl,'
-	    ;;
-	  RCC*)
-	    # Rational C++ 2.4.1
-	    lt_prog_compiler_pic_CXX='-pic'
-	    ;;
-	  cxx*)
-	    # Digital/Compaq C++
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    lt_prog_compiler_pic_CXX=
-	    lt_prog_compiler_static_CXX='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      psos*)
-	;;
-      solaris*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    lt_prog_compiler_wl_CXX='-Qoption ld '
-	    ;;
-	  gcx*)
-	    # Green Hills C++ Compiler
-	    lt_prog_compiler_pic_CXX='-PIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sunos4*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.x
-	    lt_prog_compiler_pic_CXX='-pic'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    ;;
-	  lcc*)
-	    # Lucid
-	    lt_prog_compiler_pic_CXX='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-	case $cc_basename in
-	  CC*)
-	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    lt_prog_compiler_static_CXX='-Bstatic'
-	    ;;
-	esac
-	;;
-      tandem*)
-	case $cc_basename in
-	  NCC*)
-	    # NonStop-UX NCC 3.20
-	    lt_prog_compiler_pic_CXX='-KPIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      vxworks*)
-	;;
-      *)
-	lt_prog_compiler_can_build_shared_CXX=no
-	;;
-    esac
-  fi
-
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic_CXX=
-    ;;
-  *)
-    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
-    ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_CXX" >&5
-$as_echo "$lt_prog_compiler_pic_CXX" >&6; }
-
-
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic_CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
-if test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_pic_works_CXX=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:14553: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:14557: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_pic_works_CXX=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
-
-if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
-    case $lt_prog_compiler_pic_CXX in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
-     esac
-else
-    lt_prog_compiler_pic_CXX=
-     lt_prog_compiler_can_build_shared_CXX=no
-fi
-
-fi
-
-
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_static_works_CXX=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler_static_works_CXX=yes
-       fi
-     else
-       lt_cv_prog_compiler_static_works_CXX=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
-
-if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
-    :
-else
-    lt_prog_compiler_static_CXX=
-fi
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o_CXX=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:14652: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:14656: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o_CXX=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o_CXX=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:14704: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:14708: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o_CXX=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
-$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
-
-
-
-
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-
-  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  case $host_os in
-  aix[4-9]*)
-    # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    else
-      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    fi
-    ;;
-  pw32*)
-    export_symbols_cmds_CXX="$ltdll_cmds"
-  ;;
-  cygwin* | mingw* | cegcc*)
-    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  linux* | k*bsd*-gnu)
-    link_all_deplibs_CXX=no
-  ;;
-  *)
-    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  esac
-  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
-$as_echo "$ld_shlibs_CXX" >&6; }
-test "$ld_shlibs_CXX" = no && can_build_shared=no
-
-with_gnu_ld_CXX=$with_gnu_ld
-
-
-
-
-
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc_CXX" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc_CXX=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds_CXX in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-      $RM conftest*
-      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-      if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } 2>conftest.err; then
-        soname=conftest
-        lib=conftest
-        libobjs=conftest.$ac_objext
-        deplibs=
-        wl=$lt_prog_compiler_wl_CXX
-	pic_flag=$lt_prog_compiler_pic_CXX
-        compiler_flags=-v
-        linker_flags=-v
-        verstring=
-        output_objdir=.
-        libname=conftest
-        lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
-        allow_undefined_flag_CXX=
-        if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
-  (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-        then
-	  archive_cmds_need_lc_CXX=no
-        else
-	  archive_cmds_need_lc_CXX=yes
-        fi
-        allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
-      else
-        cat conftest.err 1>&5
-      fi
-      $RM conftest*
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc_CXX" >&5
-$as_echo "$archive_cmds_need_lc_CXX" >&6; }
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
-
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[4-9]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[45]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
-        # It is most probably a Windows format PATH printed by
-        # mingw gcc, but we are running on Cygwin. Gcc prints its search
-        # path with ; separators, and with drive letters. We can handle the
-        # drive letters (cygwin fileutils understands them), so leave them,
-        # especially as we might pass files found there to a mingw objdump,
-        # which wouldn't understand a cygwinified path. Ahh.
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
-
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd1*)
-  dynamic_linker=no
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[123]*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555.
-  postinstall_cmds='chmod 555 $lib'
-  ;;
-
-interix[3-9]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  # Some binutils ld are patched to set DT_RUNPATH
-  save_LDFLAGS=$LDFLAGS
-  save_libdir=$libdir
-  eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
-       LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
-  shlibpath_overrides_runpath=yes
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  LDFLAGS=$save_LDFLAGS
-  libdir=$save_libdir
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsdelf*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='NetBSD ld.elf_so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
-hardcode_action_CXX=
-if test -n "$hardcode_libdir_flag_spec_CXX" ||
-   test -n "$runpath_var_CXX" ||
-   test "X$hardcode_automatic_CXX" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$hardcode_direct_CXX" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
-     test "$hardcode_minus_L_CXX" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action_CXX=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action_CXX=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action_CXX=unsupported
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
-$as_echo "$hardcode_action_CXX" >&6; }
-
-if test "$hardcode_action_CXX" = relink ||
-   test "$inherit_rpath_CXX" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-
-
-
-
-
-
-
-  fi # test -n "$compiler"
-
-  CC=$lt_save_CC
-  LDCXX=$LD
-  LD=$lt_save_LD
-  GCC=$lt_save_GCC
-  with_gnu_ld=$lt_save_with_gnu_ld
-  lt_cv_path_LDCXX=$lt_cv_path_LD
-  lt_cv_path_LD=$lt_save_path_LD
-  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
-  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-
-
-
-
-
-
-
-
-
-
-        ac_config_commands="$ac_config_commands libtool"
-
-
-
-
-# Only expand once:
-
-
-
-# Extract the first word of "perl", so it can be a program name with args.
-set dummy perl; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_PERL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$PERL"; then
-  ac_cv_prog_PERL="$PERL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_PERL="perl"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-PERL=$ac_cv_prog_PERL
-if test -n "$PERL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5
-$as_echo "$PERL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-# Extract the first word of "pdflatex", so it can be a program name with args.
-set dummy pdflatex; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_PDFLATEX+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$PDFLATEX"; then
-  ac_cv_prog_PDFLATEX="$PDFLATEX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_PDFLATEX="pdflatex"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-PDFLATEX=$ac_cv_prog_PDFLATEX
-if test -n "$PDFLATEX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PDFLATEX" >&5
-$as_echo "$PDFLATEX" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-# Extract the first word of "pod2html", so it can be a program name with args.
-set dummy pod2html; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_POD2HTML+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$POD2HTML"; then
-  ac_cv_prog_POD2HTML="$POD2HTML" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_POD2HTML="pod2html"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-POD2HTML=$ac_cv_prog_POD2HTML
-if test -n "$POD2HTML"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $POD2HTML" >&5
-$as_echo "$POD2HTML" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-
- if test -n "$PERL" -a -n "$PDFLATEX" -a -n "$POD2HTML"; then
-  GENERATE_DOC_TRUE=
-  GENERATE_DOC_FALSE='#'
-else
-  GENERATE_DOC_TRUE='#'
-  GENERATE_DOC_FALSE=
-fi
-
-
-# ------ AX CREATE STDINT H -------------------------------------
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint types" >&5
-$as_echo_n "checking for stdint types... " >&6; }
-ac_stdint_h=`echo include/isl/stdint.h`
-# try to shortcircuit - if the default include path of the compiler
-# can find a "stdint.h" header then we assume that all compilers can.
-if test "${ac_cv_header_stdint_t+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-old_CXXFLAGS="$CXXFLAGS" ; CXXFLAGS=""
-old_CPPFLAGS="$CPPFLAGS" ; CPPFLAGS=""
-old_CFLAGS="$CFLAGS"     ; CFLAGS=""
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdint.h>
-int
-main ()
-{
-int_least32_t v = 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_stdint_result="(assuming C99 compatible system)"
- ac_cv_header_stdint_t="stdint.h";
-else
-  ac_cv_header_stdint_t=""
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-if test "$GCC" = "yes" && test ".$ac_cv_header_stdint_t" = "."; then
-CFLAGS="-std=c99"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdint.h>
-int
-main ()
-{
-int_least32_t v = 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: your GCC compiler has a defunct stdint.h for its default-mode" >&5
-$as_echo "$as_me: WARNING: your GCC compiler has a defunct stdint.h for its default-mode" >&2;}
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-CXXFLAGS="$old_CXXFLAGS"
-CPPFLAGS="$old_CPPFLAGS"
-CFLAGS="$old_CFLAGS"
-fi
-
-
-v="... $ac_cv_header_stdint_h"
-if test "$ac_stdint_h" = "stdint.h" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: (are you sure you want them in ./stdint.h?)" >&5
-$as_echo "(are you sure you want them in ./stdint.h?)" >&6; }
-elif test "$ac_stdint_h" = "inttypes.h" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: (are you sure you want them in ./inttypes.h?)" >&5
-$as_echo "(are you sure you want them in ./inttypes.h?)" >&6; }
-elif test "_$ac_cv_header_stdint_t" = "_" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: (putting them into $ac_stdint_h)$v" >&5
-$as_echo "(putting them into $ac_stdint_h)$v" >&6; }
-else
- ac_cv_header_stdint="$ac_cv_header_stdint_t"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint (shortcircuit)" >&5
-$as_echo "$ac_cv_header_stdint (shortcircuit)" >&6; }
-fi
-
-if test "_$ac_cv_header_stdint_t" = "_" ; then # can not shortcircuit..
-
-
-inttype_headers=`echo  | sed -e 's/,/ /g'`
-
-ac_cv_stdint_result="(no helpful system typedefs seen)"
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uintptr_t" >&5
-$as_echo_n "checking for stdint uintptr_t... " >&6; }
-if test "${ac_cv_header_stdint_x+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
- ac_cv_header_stdint_x="" # the 1997 typedefs (inttypes.h)
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5
-$as_echo "(..)" >&6; }
-  for i in    stdint.h inttypes.h sys/inttypes.h $inttype_headers
-  do
-   unset ac_cv_type_uintptr_t
-   unset ac_cv_type_uint64_t
-   ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "#include <$i>
-"
-if test "x$ac_cv_type_uintptr_t" = x""yes; then :
-  ac_cv_header_stdint_x=$i
-else
-  continue
-fi
-
-   ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "#include<$i>
-"
-if test "x$ac_cv_type_uint64_t" = x""yes; then :
-  and64="/uint64_t"
-else
-  and64=""
-fi
-
-   ac_cv_stdint_result="(seen uintptr_t$and64 in $i)"
- break
-  done
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uintptr_t" >&5
-$as_echo_n "checking for stdint uintptr_t... " >&6; }
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint_x" >&5
-$as_echo "$ac_cv_header_stdint_x" >&6; }
-
-
-if test "_$ac_cv_header_stdint_x" = "_" ; then
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uint32_t" >&5
-$as_echo_n "checking for stdint uint32_t... " >&6; }
-if test "${ac_cv_header_stdint_o+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
- ac_cv_header_stdint_o="" # the 1995 typedefs (sys/inttypes.h)
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5
-$as_echo "(..)" >&6; }
-  for i in    inttypes.h sys/inttypes.h stdint.h $inttype_headers
-  do
-   unset ac_cv_type_uint32_t
-   unset ac_cv_type_uint64_t
-   ac_fn_c_check_type "$LINENO" "uint32_t" "ac_cv_type_uint32_t" "#include <$i>
-"
-if test "x$ac_cv_type_uint32_t" = x""yes; then :
-  ac_cv_header_stdint_o=$i
-else
-  continue
-fi
-
-   ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "#include<$i>
-"
-if test "x$ac_cv_type_uint64_t" = x""yes; then :
-  and64="/uint64_t"
-else
-  and64=""
-fi
-
-   ac_cv_stdint_result="(seen uint32_t$and64 in $i)"
- break
-   break;
-  done
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uint32_t" >&5
-$as_echo_n "checking for stdint uint32_t... " >&6; }
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint_o" >&5
-$as_echo "$ac_cv_header_stdint_o" >&6; }
-
-fi
-
-if test "_$ac_cv_header_stdint_x" = "_" ; then
-if test "_$ac_cv_header_stdint_o" = "_" ; then
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint u_int32_t" >&5
-$as_echo_n "checking for stdint u_int32_t... " >&6; }
-if test "${ac_cv_header_stdint_u+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
- ac_cv_header_stdint_u="" # the BSD typedefs (sys/types.h)
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5
-$as_echo "(..)" >&6; }
-  for i in    sys/types.h inttypes.h sys/inttypes.h $inttype_headers ; do
-   unset ac_cv_type_u_int32_t
-   unset ac_cv_type_u_int64_t
-   ac_fn_c_check_type "$LINENO" "u_int32_t" "ac_cv_type_u_int32_t" "#include <$i>
-"
-if test "x$ac_cv_type_u_int32_t" = x""yes; then :
-  ac_cv_header_stdint_u=$i
-else
-  continue
-fi
-
-   ac_fn_c_check_type "$LINENO" "u_int64_t" "ac_cv_type_u_int64_t" "#include<$i>
-"
-if test "x$ac_cv_type_u_int64_t" = x""yes; then :
-  and64="/u_int64_t"
-else
-  and64=""
-fi
-
-   ac_cv_stdint_result="(seen u_int32_t$and64 in $i)"
- break
-   break;
-  done
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint u_int32_t" >&5
-$as_echo_n "checking for stdint u_int32_t... " >&6; }
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint_u" >&5
-$as_echo "$ac_cv_header_stdint_u" >&6; }
-
-fi fi
-
-if test "_$ac_cv_header_stdint_x" = "_" ; then
-   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint datatype model" >&5
-$as_echo_n "checking for stdint datatype model... " >&6; }
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5
-$as_echo "(..)" >&6; }
-
-   # The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char" >&5
-$as_echo_n "checking size of char... " >&6; }
-if test "${ac_cv_sizeof_char+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_char" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (char)
-See \`config.log' for more details" "$LINENO" 5 ; }
-   else
-     ac_cv_sizeof_char=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_char" >&5
-$as_echo "$ac_cv_sizeof_char" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_CHAR $ac_cv_sizeof_char
-_ACEOF
-
-
-   # The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5
-$as_echo_n "checking size of short... " >&6; }
-if test "${ac_cv_sizeof_short+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_short" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (short)
-See \`config.log' for more details" "$LINENO" 5 ; }
-   else
-     ac_cv_sizeof_short=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5
-$as_echo "$ac_cv_sizeof_short" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_SHORT $ac_cv_sizeof_short
-_ACEOF
-
-
-   # The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
-$as_echo_n "checking size of int... " >&6; }
-if test "${ac_cv_sizeof_int+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_int" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (int)
-See \`config.log' for more details" "$LINENO" 5 ; }
-   else
-     ac_cv_sizeof_int=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
-$as_echo "$ac_cv_sizeof_int" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_INT $ac_cv_sizeof_int
-_ACEOF
-
-
-   # The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
-$as_echo_n "checking size of long... " >&6; }
-if test "${ac_cv_sizeof_long+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_long" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (long)
-See \`config.log' for more details" "$LINENO" 5 ; }
-   else
-     ac_cv_sizeof_long=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
-$as_echo "$ac_cv_sizeof_long" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_LONG $ac_cv_sizeof_long
-_ACEOF
-
-
-   # The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void*" >&5
-$as_echo_n "checking size of void*... " >&6; }
-if test "${ac_cv_sizeof_voidp+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ac_cv_sizeof_voidp"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_voidp" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (void*)
-See \`config.log' for more details" "$LINENO" 5 ; }
-   else
-     ac_cv_sizeof_voidp=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_voidp" >&5
-$as_echo "$ac_cv_sizeof_voidp" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_VOIDP $ac_cv_sizeof_voidp
-_ACEOF
-
-
-   ac_cv_char_data_model=""
-   ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_char"
-   ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_short"
-   ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_int"
-   ac_cv_long_data_model=""
-   ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_int"
-   ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_long"
-   ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_voidp"
-   { $as_echo "$as_me:${as_lineno-$LINENO}: checking data model" >&5
-$as_echo_n "checking data model... " >&6; }
-   case "$ac_cv_char_data_model/$ac_cv_long_data_model" in
-    122/242)     ac_cv_data_model="IP16"  ; n="standard 16bit machine" ;;
-    122/244)     ac_cv_data_model="LP32"  ; n="standard 32bit machine" ;;
-    122/*)       ac_cv_data_model="i16"   ; n="unusual int16 model" ;;
-    124/444)     ac_cv_data_model="ILP32" ; n="standard 32bit unixish" ;;
-    124/488)     ac_cv_data_model="LP64"  ; n="standard 64bit unixish" ;;
-    124/448)     ac_cv_data_model="LLP64" ; n="unusual 64bit unixish" ;;
-    124/*)       ac_cv_data_model="i32"   ; n="unusual int32 model" ;;
-    128/888)     ac_cv_data_model="ILP64" ; n="unusual 64bit numeric" ;;
-    128/*)       ac_cv_data_model="i64"   ; n="unusual int64 model" ;;
-    222/*2)      ac_cv_data_model="DSP16" ; n="strict 16bit dsptype" ;;
-    333/*3)      ac_cv_data_model="DSP24" ; n="strict 24bit dsptype" ;;
-    444/*4)      ac_cv_data_model="DSP32" ; n="strict 32bit dsptype" ;;
-    666/*6)      ac_cv_data_model="DSP48" ; n="strict 48bit dsptype" ;;
-    888/*8)      ac_cv_data_model="DSP64" ; n="strict 64bit dsptype" ;;
-    222/*|333/*|444/*|666/*|888/*) :
-                 ac_cv_data_model="iDSP"  ; n="unusual dsptype" ;;
-     *)          ac_cv_data_model="none"  ; n="very unusual model" ;;
-   esac
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_data_model ($ac_cv_long_data_model, $n)" >&5
-$as_echo "$ac_cv_data_model ($ac_cv_long_data_model, $n)" >&6; }
-
-fi
-
-if test "_$ac_cv_header_stdint_x" != "_" ; then
-   ac_cv_header_stdint="$ac_cv_header_stdint_x"
-elif  test "_$ac_cv_header_stdint_o" != "_" ; then
-   ac_cv_header_stdint="$ac_cv_header_stdint_o"
-elif  test "_$ac_cv_header_stdint_u" != "_" ; then
-   ac_cv_header_stdint="$ac_cv_header_stdint_u"
-else
-   ac_cv_header_stdint="stddef.h"
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for extra inttypes in chosen header" >&5
-$as_echo_n "checking for extra inttypes in chosen header... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ($ac_cv_header_stdint)" >&5
-$as_echo "($ac_cv_header_stdint)" >&6; }
-unset ac_cv_type_int_least32_t
-unset ac_cv_type_int_fast32_t
-ac_fn_c_check_type "$LINENO" "int_least32_t" "ac_cv_type_int_least32_t" "#include <$ac_cv_header_stdint>
-"
-if test "x$ac_cv_type_int_least32_t" = x""yes; then :
-
-fi
-
-ac_fn_c_check_type "$LINENO" "int_fast32_t" "ac_cv_type_int_fast32_t" "#include<$ac_cv_header_stdint>
-"
-if test "x$ac_cv_type_int_fast32_t" = x""yes; then :
-
-fi
-
-ac_fn_c_check_type "$LINENO" "intmax_t" "ac_cv_type_intmax_t" "#include <$ac_cv_header_stdint>
-"
-if test "x$ac_cv_type_intmax_t" = x""yes; then :
-
-fi
-
-
-fi # shortcircut to system "stdint.h"
-# ------------------ PREPARE VARIABLES ------------------------------
-if test "$GCC" = "yes" ; then
-ac_cv_stdint_message="using gnu compiler "`$CC --version | head -1`
-else
-ac_cv_stdint_message="using $CC"
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: make use of $ac_cv_header_stdint in $ac_stdint_h $ac_cv_stdint_result" >&5
-$as_echo "make use of $ac_cv_header_stdint in $ac_stdint_h $ac_cv_stdint_result" >&6; }
-
-# ----------------- DONE inttypes.h checks START header -------------
-ac_config_commands="$ac_config_commands $ac_stdint_h"
-
-
-
-
-
-
-# Check whether --with-gmp was given.
-if test "${with_gmp+set}" = set; then :
-  withval=$with_gmp;
-fi
-
-case "system" in
-system|build)
-
-# Check whether --with-gmp_prefix was given.
-if test "${with_gmp_prefix+set}" = set; then :
-  withval=$with_gmp_prefix;
-fi
-
-
-# Check whether --with-gmp_exec_prefix was given.
-if test "${with_gmp_exec_prefix+set}" = set; then :
-  withval=$with_gmp_exec_prefix;
-fi
-
-esac
-
-# Check whether --with-gmp_builddir was given.
-if test "${with_gmp_builddir+set}" = set; then :
-  withval=$with_gmp_builddir;
-fi
-
-if test "x$with_gmp_prefix" != "x" -a "x$with_gmp_exec_prefix" = "x"; then
-	with_gmp_exec_prefix=$with_gmp_prefix
-fi
-if test "x$with_gmp_prefix" != "x" -o "x$with_gmp_exec_prefix" != "x"; then
-	if test "x$with_gmp" != "x" -a "x$with_gmp" != "xyes" -a "x$with_gmp" != "xsystem"; then
-		as_fn_error $? "Setting $with_gmp_prefix implies use of system gmp" "$LINENO" 5
-	fi
-	with_gmp="system"
-fi
-if test "x$with_gmp_builddir" != "x"; then
-	if test "x$with_gmp" != "x" -a "x$with_gmp" != "xyes" -a "x$with_gmp" != "xbuild"; then
-		as_fn_error $? "Setting $with_gmp_builddir implies use of build gmp" "$LINENO" 5
-	fi
-	with_gmp="build"
-	gmp_srcdir=`echo @abs_srcdir@ | $with_gmp_builddir/config.status --file=-`
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: gmp sources in $gmp_srcdir" >&5
-$as_echo "$as_me: gmp sources in $gmp_srcdir" >&6;}
-fi
-if test "x$with_gmp_exec_prefix" != "x"; then
-	export PKG_CONFIG_PATH="$with_gmp_exec_prefix/lib/pkgconfig${PKG_CONFIG_PATH+:$PKG_CONFIG_PATH}"
-fi
-case "$with_gmp" in
-system|build)
-	;;
-*)
-	case "system" in
-	bundled)
-		if test -d $srcdir/.git -a \
-			-d $srcdir/gmp -a \
-			! -d $srcdir/gmp/.git; then
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: git repo detected, but submodule gmp not initialized" >&5
-$as_echo "$as_me: WARNING: git repo detected, but submodule gmp not initialized" >&2;}
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You may want to run" >&5
-$as_echo "$as_me: WARNING: You may want to run" >&2;}
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	git submodule init" >&5
-$as_echo "$as_me: WARNING: 	git submodule init" >&2;}
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	git submodule update" >&5
-$as_echo "$as_me: WARNING: 	git submodule update" >&2;}
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	sh autogen.sh" >&5
-$as_echo "$as_me: WARNING: 	sh autogen.sh" >&2;}
-		fi
-		if test -f $srcdir/gmp/configure; then
-			with_gmp="bundled"
-		else
-			with_gmp="no"
-		fi
-		;;
-	*)
-		with_gmp="system"
-		;;
-	esac
-	;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which gmp to use" >&5
-$as_echo_n "checking which gmp to use... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_gmp" >&5
-$as_echo "$with_gmp" >&6; }
-
-
-
-
-
-
-case "$with_gmp" in
-system)
-	if test "x$with_gmp_prefix" != "x"; then
-		isl_configure_args="$isl_configure_args --with-gmp=$with_gmp_prefix"
-		GMP_CPPFLAGS="-I$with_gmp_prefix/include"
-		GMP_LDFLAGS="-L$with_gmp_prefix/lib"
-	fi
-	GMP_LIBS=-lgmp
-	;;
-build)
-	GMP_CPPFLAGS="-I$gmp_srcdir -I$with_gmp_builddir"
-	GMP_LIBS="$with_gmp_builddir/libgmp.la"
-	;;
-esac
-SAVE_CPPFLAGS="$CPPFLAGS"
-CPPFLAGS="$GMP_CPPFLAGS $CPPFLAGS"
-need_get_memory_functions=false
-ac_fn_c_check_decl "$LINENO" "mp_get_memory_functions" "ac_cv_have_decl_mp_get_memory_functions" "#include <gmp.h>
-"
-if test "x$ac_cv_have_decl_mp_get_memory_functions" = x""yes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_MP_GET_MEMORY_FUNCTIONS $ac_have_decl
-_ACEOF
-if test $ac_have_decl = 1; then :
-
-else
-
-	need_get_memory_functions=true
-
-fi
-
-CPPFLAGS="$SAVE_CPPFLAGS"
- if test x$need_get_memory_functions = xtrue; then
-  NEED_GET_MEMORY_FUNCTIONS_TRUE=
-  NEED_GET_MEMORY_FUNCTIONS_FALSE='#'
-else
-  NEED_GET_MEMORY_FUNCTIONS_TRUE='#'
-  NEED_GET_MEMORY_FUNCTIONS_FALSE=
-fi
-
-ac_fn_c_check_decl "$LINENO" "ffs" "ac_cv_have_decl_ffs" "#include <strings.h>
-"
-if test "x$ac_cv_have_decl_ffs" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_FFS $ac_have_decl
-_ACEOF
-
-ac_fn_c_check_decl "$LINENO" "__builtin_ffs" "ac_cv_have_decl___builtin_ffs" "$ac_includes_default"
-if test "x$ac_cv_have_decl___builtin_ffs" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL___BUILTIN_FFS $ac_have_decl
-_ACEOF
-
-
-
-
-
-# Check whether --with-piplib was given.
-if test "${with_piplib+set}" = set; then :
-  withval=$with_piplib;
-fi
-
-case "system" in
-no|system|build)
-
-# Check whether --with-piplib_prefix was given.
-if test "${with_piplib_prefix+set}" = set; then :
-  withval=$with_piplib_prefix;
-fi
-
-
-# Check whether --with-piplib_exec_prefix was given.
-if test "${with_piplib_exec_prefix+set}" = set; then :
-  withval=$with_piplib_exec_prefix;
-fi
-
-esac
-
-# Check whether --with-piplib_builddir was given.
-if test "${with_piplib_builddir+set}" = set; then :
-  withval=$with_piplib_builddir;
-fi
-
-if test "x$with_piplib_prefix" != "x" -a "x$with_piplib_exec_prefix" = "x"; then
-	with_piplib_exec_prefix=$with_piplib_prefix
-fi
-if test "x$with_piplib_prefix" != "x" -o "x$with_piplib_exec_prefix" != "x"; then
-	if test "x$with_piplib" != "x" -a "x$with_piplib" != "xyes" -a "x$with_piplib" != "xsystem"; then
-		as_fn_error $? "Setting $with_piplib_prefix implies use of system piplib" "$LINENO" 5
-	fi
-	with_piplib="system"
-fi
-if test "x$with_piplib_builddir" != "x"; then
-	if test "x$with_piplib" != "x" -a "x$with_piplib" != "xyes" -a "x$with_piplib" != "xbuild"; then
-		as_fn_error $? "Setting $with_piplib_builddir implies use of build piplib" "$LINENO" 5
-	fi
-	with_piplib="build"
-	piplib_srcdir=`echo @abs_srcdir@ | $with_piplib_builddir/config.status --file=-`
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: piplib sources in $piplib_srcdir" >&5
-$as_echo "$as_me: piplib sources in $piplib_srcdir" >&6;}
-fi
-if test "x$with_piplib_exec_prefix" != "x"; then
-	export PKG_CONFIG_PATH="$with_piplib_exec_prefix/lib/pkgconfig${PKG_CONFIG_PATH+:$PKG_CONFIG_PATH}"
-fi
-case "$with_piplib" in
-no|system|build)
-	;;
-*)
-	case "no" in
-	bundled)
-		if test -d $srcdir/.git -a \
-			-d $srcdir/piplib -a \
-			! -d $srcdir/piplib/.git; then
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: git repo detected, but submodule piplib not initialized" >&5
-$as_echo "$as_me: WARNING: git repo detected, but submodule piplib not initialized" >&2;}
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You may want to run" >&5
-$as_echo "$as_me: WARNING: You may want to run" >&2;}
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	git submodule init" >&5
-$as_echo "$as_me: WARNING: 	git submodule init" >&2;}
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	git submodule update" >&5
-$as_echo "$as_me: WARNING: 	git submodule update" >&2;}
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	sh autogen.sh" >&5
-$as_echo "$as_me: WARNING: 	sh autogen.sh" >&2;}
-		fi
-		if test -f $srcdir/piplib/configure; then
-			with_piplib="bundled"
-		else
-			with_piplib="no"
-		fi
-		;;
-	*)
-		with_piplib="no"
-		;;
-	esac
-	;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which piplib to use" >&5
-$as_echo_n "checking which piplib to use... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_piplib" >&5
-$as_echo "$with_piplib" >&6; }
-
-
-
-have_piplib=false
-
-
-
-case "$with_piplib" in
-	build)
-		PIPLIB_CPPFLAGS="-I$piplib_srcdir/include"
-		PIPLIB_LIBS="$with_piplib_builddir/libpiplibMP.la"
-	;;
-	system)
-		PIPLIB_LIBS="-lpiplibMP"
-		if test "x$with_piplib_prefix" != "x"; then
-			PIPLIB_CPPFLAGS="-I$with_piplib_prefix/include"
-			PIPLIB_LDFLAGS="-L$with_piplib_prefix/lib"
-		fi
-		SAVE_CPPFLAGS="$CPPFLAGS"
-		SAVE_LDFLAGS="$LDFLAGS"
-		CPPFLAGS="$PIPLIB_CPPFLAGS $CPPFLAGS"
-		LDFLAGS="$PIPLIB_LDFLAGS $LDFLAGS"
-		{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pip_solve in -lpiplibMP" >&5
-$as_echo_n "checking for pip_solve in -lpiplibMP... " >&6; }
-if test "${ac_cv_lib_piplibMP_pip_solve+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lpiplibMP  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char pip_solve ();
-int
-main ()
-{
-return pip_solve ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_piplibMP_pip_solve=yes
-else
-  ac_cv_lib_piplibMP_pip_solve=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_piplibMP_pip_solve" >&5
-$as_echo "$ac_cv_lib_piplibMP_pip_solve" >&6; }
-if test "x$ac_cv_lib_piplibMP_pip_solve" = x""yes; then :
-
-			ac_fn_c_check_member "$LINENO" "PipOptions" "Urs_parms" "ac_cv_member_PipOptions_Urs_parms" "#include <piplib/piplibMP.h>
-"
-if test "x$ac_cv_member_PipOptions_Urs_parms" = x""yes; then :
-
-else
-
-				as_fn_error $? "Piplib too old; please install version 1.3.6 or newer" "$LINENO" 5
-
-fi
-
-
-else
-
-			as_fn_error $? "Piplib not found" "$LINENO" 5
-
-fi
-
-		CPPFLAGS="$SAVE_CPPFLAGS"
-		LDFLAGS="$SAVE_LDFLAGS"
-	;;
-	no)
-	;;
-	*)
-		as_fn_error $? "unsupported" "$LINENO" 5
-	;;
-esac
-if test "$with_piplib" != "no"; then
-
-$as_echo "#define ISL_PIPLIB /**/" >>confdefs.h
-
-	have_piplib=true
-fi
- if test x$have_piplib = xtrue; then
-  HAVE_PIPLIB_TRUE=
-  HAVE_PIPLIB_FALSE='#'
-else
-  HAVE_PIPLIB_TRUE='#'
-  HAVE_PIPLIB_FALSE=
-fi
-
-
-
-
-
-
-
-
-# Check whether --with-clang was given.
-if test "${with_clang+set}" = set; then :
-  withval=$with_clang;
-fi
-
-case "system" in
-system|no)
-
-# Check whether --with-clang_prefix was given.
-if test "${with_clang_prefix+set}" = set; then :
-  withval=$with_clang_prefix;
-fi
-
-
-# Check whether --with-clang_exec_prefix was given.
-if test "${with_clang_exec_prefix+set}" = set; then :
-  withval=$with_clang_exec_prefix;
-fi
-
-esac
-
-if test "x$with_clang_prefix" != "x" -a "x$with_clang_exec_prefix" = "x"; then
-	with_clang_exec_prefix=$with_clang_prefix
-fi
-if test "x$with_clang_prefix" != "x" -o "x$with_clang_exec_prefix" != "x"; then
-	if test "x$with_clang" != "x" -a "x$with_clang" != "xyes" -a "x$with_clang" != "xsystem"; then
-		as_fn_error $? "Setting $with_clang_prefix implies use of system clang" "$LINENO" 5
-	fi
-	with_clang="system"
-fi
-if test "x$with_clang_builddir" != "x"; then
-	if test "x$with_clang" != "x" -a "x$with_clang" != "xyes" -a "x$with_clang" != "xbuild"; then
-		as_fn_error $? "Setting $with_clang_builddir implies use of build clang" "$LINENO" 5
-	fi
-	with_clang="build"
-	clang_srcdir=`echo @abs_srcdir@ | $with_clang_builddir/config.status --file=-`
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: clang sources in $clang_srcdir" >&5
-$as_echo "$as_me: clang sources in $clang_srcdir" >&6;}
-fi
-if test "x$with_clang_exec_prefix" != "x"; then
-	export PKG_CONFIG_PATH="$with_clang_exec_prefix/lib/pkgconfig${PKG_CONFIG_PATH+:$PKG_CONFIG_PATH}"
-fi
-case "$with_clang" in
-system|no)
-	;;
-*)
-	case "no" in
-	bundled)
-		if test -d $srcdir/.git -a \
-			-d $srcdir/clang -a \
-			! -d $srcdir/clang/.git; then
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: git repo detected, but submodule clang not initialized" >&5
-$as_echo "$as_me: WARNING: git repo detected, but submodule clang not initialized" >&2;}
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: You may want to run" >&5
-$as_echo "$as_me: WARNING: You may want to run" >&2;}
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	git submodule init" >&5
-$as_echo "$as_me: WARNING: 	git submodule init" >&2;}
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	git submodule update" >&5
-$as_echo "$as_me: WARNING: 	git submodule update" >&2;}
-			{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 	sh autogen.sh" >&5
-$as_echo "$as_me: WARNING: 	sh autogen.sh" >&2;}
-		fi
-		if test -f $srcdir/clang/configure; then
-			with_clang="bundled"
-		else
-			with_clang="no"
-		fi
-		;;
-	*)
-		with_clang="no"
-		;;
-	esac
-	;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which clang to use" >&5
-$as_echo_n "checking which clang to use... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_clang" >&5
-$as_echo "$with_clang" >&6; }
-
-
-case "$with_clang" in
-system)
-	llvm_config="llvm-config"
-	# Extract the first word of ""$llvm_config"", so it can be a program name with args.
-set dummy "$llvm_config"; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_llvm_config_found+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$llvm_config_found"; then
-  ac_cv_prog_llvm_config_found="$llvm_config_found" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_llvm_config_found="yes"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-llvm_config_found=$ac_cv_prog_llvm_config_found
-if test -n "$llvm_config_found"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $llvm_config_found" >&5
-$as_echo "$llvm_config_found" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-	if test "x$with_clang_prefix" != "x"; then
-		llvm_config="$with_clang_prefix/bin/llvm-config"
-		if test -x "$llvm_config"; then
-			llvm_config_found=yes
-		fi
-	fi
-	if test "$llvm_config_found" != yes; then
-		as_fn_error $? "llvm-config not found" "$LINENO" 5
-	fi
-	CLANG_CXXFLAGS=`$llvm_config --cxxflags`
-	CLANG_LDFLAGS=`$llvm_config --ldflags`
-	CLANG_LIBS=`$llvm_config --libs`
-	CLANG_PREFIX=`$llvm_config --prefix`
-
-cat >>confdefs.h <<_ACEOF
-#define CLANG_PREFIX "$CLANG_PREFIX"
-_ACEOF
-
-
-	SAVE_CPPFLAGS="$CPPFLAGS"
-	CPPFLAGS="$CLANG_CXXFLAGS $CPPFLAGS"
-	ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-ac_fn_cxx_check_header_mongrel "$LINENO" "clang/Basic/SourceLocation.h" "ac_cv_header_clang_Basic_SourceLocation_h" "$ac_includes_default"
-if test "x$ac_cv_header_clang_Basic_SourceLocation_h" = x""yes; then :
-
-else
-  as_fn_error $? "clang header file not found" "$LINENO" 5
-fi
-
-
-	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <llvm/Support/Host.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "getDefaultTargetTriple" >/dev/null 2>&1; then :
-
-else
-
-$as_echo "#define getDefaultTargetTriple getHostTriple" >>confdefs.h
-
-fi
-rm -f conftest*
-
-	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <clang/Basic/SourceLocation.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "getExpansionLineNumber" >/dev/null 2>&1; then :
-
-else
-
-$as_echo "#define getExpansionLineNumber getInstantiationLineNumber" >>confdefs.h
-
-fi
-rm -f conftest*
-
-	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <clang/Basic/Diagnostic.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "DiagnosticsEngine" >/dev/null 2>&1; then :
-
-else
-
-$as_echo "#define DiagnosticsEngine Diagnostic" >>confdefs.h
-
-fi
-rm -f conftest*
-
-	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <clang/Driver/Driver.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "ArrayRef" >/dev/null 2>&1; then :
-
-$as_echo "#define USE_ARRAYREF /**/" >>confdefs.h
-
-fi
-rm -f conftest*
-
-	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <clang/Driver/Driver.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "CXXIsProduction" >/dev/null 2>&1; then :
-
-$as_echo "#define HAVE_CXXISPRODUCTION /**/" >>confdefs.h
-
-fi
-rm -f conftest*
-
-	ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-	CPPFLAGS="$SAVE_CPPFLAGS"
-	;;
-esac
- if test $with_clang = system; then
-  HAVE_CLANG_TRUE=
-  HAVE_CLANG_FALSE='#'
-else
-  HAVE_CLANG_TRUE='#'
-  HAVE_CLANG_FALSE=
-fi
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler vendor" >&5
-$as_echo_n "checking for C compiler vendor... " >&6; }
-if test "${ax_cv_c_compiler_vendor+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ax_cv_c_compiler_vendor=unknown
-  # note: don't check for gcc first since some other compilers define __GNUC__
-  for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale:__PATHCC__,__PATHSCALE__ clang:__clang__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do
-    vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")"
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-#if !($vencpp)
-      thisisanerror;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_c_compiler_vendor=`echo $ventest | cut -d: -f1`; break
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  done
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_vendor" >&5
-$as_echo "$ax_cv_c_compiler_vendor" >&6; }
-
-
-	WARNING_FLAGS=""
-
-	if test "${ax_cv_c_compiler_vendor}" = "clang"; then
-												WARNING_FLAGS="-Wall"
-	fi
-
-
-
-
-PACKAGE_CFLAGS="$GMP_CPPFLAGS"
-PACKAGE_LDFLAGS="$GMP_LDFLAGS"
-PACKAGE_LIBS="-lisl -lgmp"
-
-# we need the expanded forms...
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig libname" >&5
-$as_echo_n "checking our pkgconfig libname... " >&6; }
-test ".$ax_create_pkgconfig_libname" != "." || \
-ax_create_pkgconfig_libname="${PACKAGE_NAME}"
-test ".$ax_create_pkgconfig_libname" != "." || \
-ax_create_pkgconfig_libname="$PACKAGE"
-ax_create_pkgconfig_libname=`eval echo "$ax_create_pkgconfig_libname"`
-ax_create_pkgconfig_libname=`eval echo "$ax_create_pkgconfig_libname"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_libname" >&5
-$as_echo "$ax_create_pkgconfig_libname" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig version" >&5
-$as_echo_n "checking our pkgconfig version... " >&6; }
-test ".$ax_create_pkgconfig_version" != "." || \
-ax_create_pkgconfig_version="${PACKAGE_VERSION}"
-test ".$ax_create_pkgconfig_version" != "." || \
-ax_create_pkgconfig_version="$VERSION"
-ax_create_pkgconfig_version=`eval echo "$ax_create_pkgconfig_version"`
-ax_create_pkgconfig_version=`eval echo "$ax_create_pkgconfig_version"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_version" >&5
-$as_echo "$ax_create_pkgconfig_version" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig_libdir" >&5
-$as_echo_n "checking our pkgconfig_libdir... " >&6; }
-test ".$pkgconfig_libdir" = "." && \
-pkgconfig_libdir='${libdir}/pkgconfig'
-ax_create_pkgconfig_libdir=`eval echo "$pkgconfig_libdir"`
-ax_create_pkgconfig_libdir=`eval echo "$ax_create_pkgconfig_libdir"`
-ax_create_pkgconfig_libdir=`eval echo "$ax_create_pkgconfig_libdir"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pkgconfig_libdir" >&5
-$as_echo "$pkgconfig_libdir" >&6; }
-test "$pkgconfig_libdir" != "$ax_create_pkgconfig_libdir" && (
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: expanded our pkgconfig_libdir... $ax_create_pkgconfig_libdir" >&5
-$as_echo "expanded our pkgconfig_libdir... $ax_create_pkgconfig_libdir" >&6; })
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig_libfile" >&5
-$as_echo_n "checking our pkgconfig_libfile... " >&6; }
-test ".$pkgconfig_libfile" != "." || \
-pkgconfig_libfile="$ax_create_pkgconfig_libname.pc"
-ax_create_pkgconfig_libfile=`eval echo "$pkgconfig_libfile"`
-ax_create_pkgconfig_libfile=`eval echo "$ax_create_pkgconfig_libfile"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pkgconfig_libfile" >&5
-$as_echo "$pkgconfig_libfile" >&6; }
-test "$pkgconfig_libfile" != "$ax_create_pkgconfig_libfile" && (
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: expanded our pkgconfig_libfile... $ax_create_pkgconfig_libfile" >&5
-$as_echo "expanded our pkgconfig_libfile... $ax_create_pkgconfig_libfile" >&6; })
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our package / suffix" >&5
-$as_echo_n "checking our package / suffix... " >&6; }
-ax_create_pkgconfig_suffix="$program_suffix"
-test ".$ax_create_pkgconfig_suffix" != .NONE || ax_create_pkgconfig_suffix=""
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${PACKAGE_NAME} / ${ax_create_pkgconfig_suffix}" >&5
-$as_echo "${PACKAGE_NAME} / ${ax_create_pkgconfig_suffix}" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig description" >&5
-$as_echo_n "checking our pkgconfig description... " >&6; }
-ax_create_pkgconfig_description="$PACKAGE_SUMMARY"
-test ".$ax_create_pkgconfig_description" != "." || \
-ax_create_pkgconfig_description="$ax_create_pkgconfig_libname Library"
-ax_create_pkgconfig_description=`eval echo "$ax_create_pkgconfig_description"`
-ax_create_pkgconfig_description=`eval echo "$ax_create_pkgconfig_description"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_description" >&5
-$as_echo "$ax_create_pkgconfig_description" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig requires" >&5
-$as_echo_n "checking our pkgconfig requires... " >&6; }
-ax_create_pkgconfig_requires="$PACKAGE_REQUIRES"
-ax_create_pkgconfig_requires=`eval echo "$ax_create_pkgconfig_requires"`
-ax_create_pkgconfig_requires=`eval echo "$ax_create_pkgconfig_requires"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_requires" >&5
-$as_echo "$ax_create_pkgconfig_requires" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig ext libs" >&5
-$as_echo_n "checking our pkgconfig ext libs... " >&6; }
-ax_create_pkgconfig_pkglibs="$PACKAGE_LIBS"
-test ".$ax_create_pkgconfig_pkglibs" != "." || ax_create_pkgconfig_pkglibs="-l$ax_create_pkgconfig_libname"
-ax_create_pkgconfig_libs="$ax_create_pkgconfig_pkglibs $LIBS"
-ax_create_pkgconfig_libs=`eval echo "$ax_create_pkgconfig_libs"`
-ax_create_pkgconfig_libs=`eval echo "$ax_create_pkgconfig_libs"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_libs" >&5
-$as_echo "$ax_create_pkgconfig_libs" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig cppflags" >&5
-$as_echo_n "checking our pkgconfig cppflags... " >&6; }
-ax_create_pkgconfig_cppflags="$CPPFLAGS $PACKAGE_CFLAGS"
-ax_create_pkgconfig_cppflags=`eval echo "$ax_create_pkgconfig_cppflags"`
-ax_create_pkgconfig_cppflags=`eval echo "$ax_create_pkgconfig_cppflags"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_cppflags" >&5
-$as_echo "$ax_create_pkgconfig_cppflags" >&6; }
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking our pkgconfig ldflags" >&5
-$as_echo_n "checking our pkgconfig ldflags... " >&6; }
-ax_create_pkgconfig_ldflags="$LDFLAGS $PACKAGE_LDFLAGS"
-ax_create_pkgconfig_ldflags=`eval echo "$ax_create_pkgconfig_ldflags"`
-ax_create_pkgconfig_ldflags=`eval echo "$ax_create_pkgconfig_ldflags"`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_create_pkgconfig_ldflags" >&5
-$as_echo "$ax_create_pkgconfig_ldflags" >&6; }
-
-test ".$ax_create_pkgconfig_generate" != "." || \
-ax_create_pkgconfig_generate="$ax_create_pkgconfig_libname.pc"
-ax_create_pkgconfig_generate=`eval echo "$ax_create_pkgconfig_generate"`
-ax_create_pkgconfig_generate=`eval echo "$ax_create_pkgconfig_generate"`
-test "$pkgconfig_libfile" != "$ax_create_pkgconfig_generate" && (
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: generate the pkgconfig later... $ax_create_pkgconfig_generate" >&5
-$as_echo "generate the pkgconfig later... $ax_create_pkgconfig_generate" >&6; })
-
-if test ".$ax_create_pkgconfig_src_libdir" = "." ; then
-ax_create_pkgconfig_src_libdir=`pwd`
-ax_create_pkgconfig_src_libdir=`$as_dirname -- "$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" ||
-$as_expr X"$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" : 'X\(//\)[^/]' \| \
-	 X"$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" : 'X\(//\)$' \| \
-	 X"$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ax_create_pkgconfig_src_libdir/$ax_create_pkgconfig_generate" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-test ! -d $ax_create_pkgconfig_src_libdir/src || \
-ax_create_pkgconfig_src_libdir="$ax_create_pkgconfig_src_libdir/src"
-case ".$objdir" in
-*libs) ax_create_pkgconfig_src_libdir="$ax_create_pkgconfig_src_libdir/$objdir" ;; esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: noninstalled pkgconfig -L $ax_create_pkgconfig_src_libdir" >&5
-$as_echo "noninstalled pkgconfig -L $ax_create_pkgconfig_src_libdir" >&6; }
-fi
-
-if test ".$ax_create_pkgconfig_src_headers" = "." ; then
-ax_create_pkgconfig_src_headers=`pwd`
-v="$ac_top_srcdir" ;
-test ".$v" != "." || v="$ax_spec_dir"
-test ".$v" != "." || v="$srcdir"
-case "$v" in /*) ax_create_pkgconfig_src_headers="" ;; esac
-ax_create_pkgconfig_src_headers=`$as_dirname -- "$ax_create_pkgconfig_src_headers/$v/x" ||
-$as_expr X"$ax_create_pkgconfig_src_headers/$v/x" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ax_create_pkgconfig_src_headers/$v/x" : 'X\(//\)[^/]' \| \
-	 X"$ax_create_pkgconfig_src_headers/$v/x" : 'X\(//\)$' \| \
-	 X"$ax_create_pkgconfig_src_headers/$v/x" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ax_create_pkgconfig_src_headers/$v/x" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-test ! -d $ax_create_pkgconfig_src_headers/include || \
-ax_create_pkgconfig_src_headers="$ax_create_pkgconfig_src_headers/include"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: noninstalled pkgconfig -I $ax_create_pkgconfig_src_headers" >&5
-$as_echo "noninstalled pkgconfig -I $ax_create_pkgconfig_src_headers" >&6; }
-fi
-
-
-ac_config_commands="$ac_config_commands $ax_create_pkgconfig_generate"
-
-
-
-
-
-
-	if test -f $srcdir/.git/HEAD; then
-		GIT_HEAD="$srcdir/.git/index"
-		GIT_REPO="$srcdir/.git"
-		GIT_HEAD_ID=`GIT_DIR=$GIT_REPO git describe`
-	elif test -f $srcdir/GIT_HEAD_ID; then
-		GIT_HEAD_ID=`cat $srcdir/GIT_HEAD_ID`
-	else
-		mysrcdir=`(cd $srcdir; pwd)`
-		head=`basename $mysrcdir | sed -e 's/.*-//'`
-		head2=`echo $head | sed -e 's/^0-9a-f//'`
-		head3=`echo $head2 | sed -e 's/........................................//'`
-		if test "x$head3" = "x" -a "x$head" = "x$head2"; then
-			GIT_HEAD_ID="$head"
-		else
-			GIT_HEAD_ID="UNKNOWN"
-		fi
-	fi
-	if test -z "$GIT_REPO" ; then
-		GIT_HEAD_VERSION="$GIT_HEAD_ID"
-	else
-	    GIT_HEAD_VERSION="\`GIT_DIR=$GIT_REPO git describe\`"
-	fi
-
-echo '#define GIT_HEAD_ID "'$GIT_HEAD_ID'"' > gitversion.h
-
-
-ac_config_headers="$ac_config_headers isl_config.h"
-
-ac_config_headers="$ac_config_headers include/isl/config.h"
-
-ac_config_files="$ac_config_files Makefile"
-
-ac_config_files="$ac_config_files doc/Makefile"
-
-if test $with_clang = system; then
-	ac_config_files="$ac_config_files interface/Makefile"
-
-fi
-ac_config_files="$ac_config_files bound_test.sh"
-
-ac_config_files="$ac_config_files pip_test.sh"
-
-
-cat >confcache <<\_ACEOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs, see configure's option --config-cache.
-# It is not useful on other systems.  If it contains results you don't
-# want to keep, you may remove or edit it.
-#
-# config.status only pays attention to the cache file if you give it
-# the --recheck option to rerun configure.
-#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
-# following values.
-
-_ACEOF
-
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, we kill variables containing newlines.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(
-  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) { eval $ac_var=; unset $ac_var;} ;;
-      esac ;;
-    esac
-  done
-
-  (set) 2>&1 |
-    case $as_nl`(ac_space=' '; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      # `set' does not quote correctly, so add quotes: double-quote
-      # substitution turns \\\\ into \\, and sed turns \\ into \.
-      sed -n \
-	"s/'/'\\\\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
-      ;; #(
-    *)
-      # `set' quotes correctly as required by POSIX, so do not add quotes.
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-) |
-  sed '
-     /^ac_cv_env_/b end
-     t clear
-     :clear
-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
-     t end
-     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
-     :end' >>confcache
-if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
-  if test -w "$cache_file"; then
-    test "x$cache_file" != "x/dev/null" &&
-      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
-    cat confcache >$cache_file
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
-  fi
-fi
-rm -f confcache
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-DEFS=-DHAVE_CONFIG_H
-
-ac_libobjs=
-ac_ltlibobjs=
-U=
-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
-  # 1. Remove the extension, and $U if already installed.
-  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
-  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
-  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
-  #    will be set to the directory where LIBOBJS objects are built.
-  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
-  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
-done
-LIBOBJS=$ac_libobjs
-
-LTLIBOBJS=$ac_ltlibobjs
-
-
- if test -n "$EXEEXT"; then
-  am__EXEEXT_TRUE=
-  am__EXEEXT_FALSE='#'
-else
-  am__EXEEXT_TRUE='#'
-  am__EXEEXT_FALSE=
-fi
-
-if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
-  as_fn_error $? "conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
-  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
-  as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
-  as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${GENERATE_DOC_TRUE}" && test -z "${GENERATE_DOC_FALSE}"; then
-  as_fn_error $? "conditional \"GENERATE_DOC\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${NEED_GET_MEMORY_FUNCTIONS_TRUE}" && test -z "${NEED_GET_MEMORY_FUNCTIONS_FALSE}"; then
-  as_fn_error $? "conditional \"NEED_GET_MEMORY_FUNCTIONS\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${HAVE_PIPLIB_TRUE}" && test -z "${HAVE_PIPLIB_FALSE}"; then
-  as_fn_error $? "conditional \"HAVE_PIPLIB\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${HAVE_CLANG_TRUE}" && test -z "${HAVE_CLANG_FALSE}"; then
-  as_fn_error $? "conditional \"HAVE_CLANG\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-
-: ${CONFIG_STATUS=./config.status}
-ac_write_fail=0
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
-as_write_fail=0
-cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate the current configuration.
-# Compiler output produced by configure, useful for debugging
-# configure, is in config.log if it exists.
-
-debug=false
-ac_cs_recheck=false
-ac_cs_silent=false
-
-SHELL=\${CONFIG_SHELL-$SHELL}
-export SHELL
-_ASEOF
-cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
-      PATH_SEPARATOR=';'
-  }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-case $0 in #((
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-  done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-
-# as_fn_error STATUS ERROR [LINENO LOG_FD]
-# ----------------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with STATUS, using 1 if that was 0.
-as_fn_error ()
-{
-  as_status=$1; test $as_status -eq 0 && as_status=1
-  if test "$4"; then
-    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
-  fi
-  $as_echo "$as_me: error: $2" >&2
-  as_fn_exit $as_status
-} # as_fn_error
-
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
-  return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
-  set +e
-  as_fn_set_status $1
-  exit $1
-} # as_fn_exit
-
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
-  { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
-  eval 'as_fn_append ()
-  {
-    eval $1+=\$2
-  }'
-else
-  as_fn_append ()
-  {
-    eval $1=\$$1\$2
-  }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
-  eval 'as_fn_arith ()
-  {
-    as_val=$(( $* ))
-  }'
-else
-  as_fn_arith ()
-  {
-    as_val=`expr "$@" || test $? -eq 1`
-  }
-fi # as_fn_arith
-
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
-  case `echo 'xy\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  xy)  ECHO_C='\c';;
-  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
-       ECHO_T='	';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
-  if ln -s conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s='ln -s'
-    # ... but there are two gotchas:
-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
-  elif ln conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s=ln
-  else
-    as_ln_s='cp -p'
-  fi
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || eval $as_mkdir_p || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p='mkdir -p "$as_dir"'
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-	test -d "$1/.";
-      else
-	case $1 in #(
-	-*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-exec 6>&1
-## ----------------------------------- ##
-## Main body of $CONFIG_STATUS script. ##
-## ----------------------------------- ##
-_ASEOF
-test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# Save the log message, to keep $0 and so on meaningful, and to
-# 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.08, which was
-generated by GNU Autoconf 2.67.  Invocation command line was
-
-  CONFIG_FILES    = $CONFIG_FILES
-  CONFIG_HEADERS  = $CONFIG_HEADERS
-  CONFIG_LINKS    = $CONFIG_LINKS
-  CONFIG_COMMANDS = $CONFIG_COMMANDS
-  $ $0 $@
-
-on `(hostname || uname -n) 2>/dev/null | sed 1q`
-"
-
-_ACEOF
-
-case $ac_config_files in *"
-"*) set x $ac_config_files; shift; ac_config_files=$*;;
-esac
-
-case $ac_config_headers in *"
-"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
-esac
-
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-# Files that config.status was made for.
-config_files="$ac_config_files"
-config_headers="$ac_config_headers"
-config_commands="$ac_config_commands"
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-ac_cs_usage="\
-\`$as_me' instantiates files and other configuration actions
-from templates according to the current configuration.  Unless the files
-and actions are specified as TAGs, all are instantiated by default.
-
-Usage: $0 [OPTION]... [TAG]...
-
-  -h, --help       print this help, then exit
-  -V, --version    print version number and configuration settings, then exit
-      --config     print configuration, then exit
-  -q, --quiet, --silent
-                   do not print progress messages
-  -d, --debug      don't remove temporary files
-      --recheck    update $as_me by reconfiguring in the same conditions
-      --file=FILE[:TEMPLATE]
-                   instantiate the configuration file FILE
-      --header=FILE[:TEMPLATE]
-                   instantiate the configuration header FILE
-
-Configuration files:
-$config_files
-
-Configuration headers:
-$config_headers
-
-Configuration commands:
-$config_commands
-
-Report bugs to <isl-development@googlegroups.com>."
-
-_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.08
-configured by $0, generated by GNU Autoconf 2.67,
-  with options \\"\$ac_cs_config\\"
-
-Copyright (C) 2010 Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-
-ac_pwd='$ac_pwd'
-srcdir='$srcdir'
-INSTALL='$INSTALL'
-MKDIR_P='$MKDIR_P'
-AWK='$AWK'
-test -n "\$AWK" || AWK=awk
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# The default lists apply if the user does not specify any file.
-ac_need_defaults=:
-while test $# != 0
-do
-  case $1 in
-  --*=?*)
-    ac_option=`expr "X$1" : 'X\([^=]*\)='`
-    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
-    ac_shift=:
-    ;;
-  --*=)
-    ac_option=`expr "X$1" : 'X\([^=]*\)='`
-    ac_optarg=
-    ac_shift=:
-    ;;
-  *)
-    ac_option=$1
-    ac_optarg=$2
-    ac_shift=shift
-    ;;
-  esac
-
-  case $ac_option in
-  # Handling of the options.
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    ac_cs_recheck=: ;;
-  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
-    $as_echo "$ac_cs_version"; exit ;;
-  --config | --confi | --conf | --con | --co | --c )
-    $as_echo "$ac_cs_config"; exit ;;
-  --debug | --debu | --deb | --de | --d | -d )
-    debug=: ;;
-  --file | --fil | --fi | --f )
-    $ac_shift
-    case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    '') as_fn_error $? "missing file argument" ;;
-    esac
-    as_fn_append CONFIG_FILES " '$ac_optarg'"
-    ac_need_defaults=false;;
-  --header | --heade | --head | --hea )
-    $ac_shift
-    case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
-    ac_need_defaults=false;;
-  --he | --h)
-    # Conflict between --help and --header
-    as_fn_error $? "ambiguous option: \`$1'
-Try \`$0 --help' for more information.";;
-  --help | --hel | -h )
-    $as_echo "$ac_cs_usage"; exit ;;
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil | --si | --s)
-    ac_cs_silent=: ;;
-
-  # This is an error.
-  -*) as_fn_error $? "unrecognized option: \`$1'
-Try \`$0 --help' for more information." ;;
-
-  *) as_fn_append ac_config_targets " $1"
-     ac_need_defaults=false ;;
-
-  esac
-  shift
-done
-
-ac_configure_extra_args=
-
-if $ac_cs_silent; then
-  exec 6>/dev/null
-  ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-if \$ac_cs_recheck; then
-  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
-  shift
-  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
-  CONFIG_SHELL='$SHELL'
-  export CONFIG_SHELL
-  exec "\$@"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-exec 5>>config.log
-{
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-  $as_echo "$ac_log"
-} >&5
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-#
-# INIT-COMMANDS
-#
-AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
-
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`'
-macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`'
-enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`'
-enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`'
-pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`'
-enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`'
-host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`'
-host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`'
-host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`'
-build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`'
-build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`'
-build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`'
-SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`'
-Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`'
-GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`'
-EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`'
-FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`'
-LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`'
-NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`'
-LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`'
-max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`'
-ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`'
-exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`'
-lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`'
-lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`'
-lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`'
-reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`'
-reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`'
-deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`'
-file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`'
-AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`'
-AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`'
-STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`'
-RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`'
-old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`'
-CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`'
-compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`'
-GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`'
-objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`'
-SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`'
-ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`'
-MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`'
-need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`'
-DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`'
-NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`'
-LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`'
-OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`'
-OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`'
-libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`'
-shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`'
-enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`'
-export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
-whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
-compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`'
-old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`'
-allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`'
-no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`'
-inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`'
-link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`'
-fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`'
-always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`'
-export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`'
-include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`'
-prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`'
-variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`'
-need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`'
-need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`'
-version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`'
-runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`'
-shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`'
-shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`'
-libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`'
-library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`'
-soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`'
-postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`'
-sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`'
-sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`'
-enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`'
-enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`'
-enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`'
-old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`'
-striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`'
-compiler_lib_search_dirs='`$ECHO "X$compiler_lib_search_dirs" | $Xsed -e "$delay_single_quote_subst"`'
-predep_objects='`$ECHO "X$predep_objects" | $Xsed -e "$delay_single_quote_subst"`'
-postdep_objects='`$ECHO "X$postdep_objects" | $Xsed -e "$delay_single_quote_subst"`'
-predeps='`$ECHO "X$predeps" | $Xsed -e "$delay_single_quote_subst"`'
-postdeps='`$ECHO "X$postdeps" | $Xsed -e "$delay_single_quote_subst"`'
-compiler_lib_search_path='`$ECHO "X$compiler_lib_search_path" | $Xsed -e "$delay_single_quote_subst"`'
-LD_CXX='`$ECHO "X$LD_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-old_archive_cmds_CXX='`$ECHO "X$old_archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-compiler_CXX='`$ECHO "X$compiler_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-GCC_CXX='`$ECHO "X$GCC_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "X$lt_prog_compiler_no_builtin_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_wl_CXX='`$ECHO "X$lt_prog_compiler_wl_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_pic_CXX='`$ECHO "X$lt_prog_compiler_pic_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_static_CXX='`$ECHO "X$lt_prog_compiler_static_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_prog_compiler_c_o_CXX='`$ECHO "X$lt_cv_prog_compiler_c_o_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-archive_cmds_need_lc_CXX='`$ECHO "X$archive_cmds_need_lc_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-enable_shared_with_static_runtimes_CXX='`$ECHO "X$enable_shared_with_static_runtimes_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-export_dynamic_flag_spec_CXX='`$ECHO "X$export_dynamic_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-whole_archive_flag_spec_CXX='`$ECHO "X$whole_archive_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-compiler_needs_object_CXX='`$ECHO "X$compiler_needs_object_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-old_archive_from_new_cmds_CXX='`$ECHO "X$old_archive_from_new_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-old_archive_from_expsyms_cmds_CXX='`$ECHO "X$old_archive_from_expsyms_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-archive_cmds_CXX='`$ECHO "X$archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-archive_expsym_cmds_CXX='`$ECHO "X$archive_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-module_cmds_CXX='`$ECHO "X$module_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-module_expsym_cmds_CXX='`$ECHO "X$module_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-with_gnu_ld_CXX='`$ECHO "X$with_gnu_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-allow_undefined_flag_CXX='`$ECHO "X$allow_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-no_undefined_flag_CXX='`$ECHO "X$no_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_CXX='`$ECHO "X$hardcode_libdir_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_ld_CXX='`$ECHO "X$hardcode_libdir_flag_spec_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_libdir_separator_CXX='`$ECHO "X$hardcode_libdir_separator_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_direct_CXX='`$ECHO "X$hardcode_direct_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_direct_absolute_CXX='`$ECHO "X$hardcode_direct_absolute_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_minus_L_CXX='`$ECHO "X$hardcode_minus_L_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_shlibpath_var_CXX='`$ECHO "X$hardcode_shlibpath_var_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_automatic_CXX='`$ECHO "X$hardcode_automatic_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-inherit_rpath_CXX='`$ECHO "X$inherit_rpath_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-link_all_deplibs_CXX='`$ECHO "X$link_all_deplibs_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-fix_srcfile_path_CXX='`$ECHO "X$fix_srcfile_path_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-always_export_symbols_CXX='`$ECHO "X$always_export_symbols_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-export_symbols_cmds_CXX='`$ECHO "X$export_symbols_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-exclude_expsyms_CXX='`$ECHO "X$exclude_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-include_expsyms_CXX='`$ECHO "X$include_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-prelink_cmds_CXX='`$ECHO "X$prelink_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-file_list_spec_CXX='`$ECHO "X$file_list_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_action_CXX='`$ECHO "X$hardcode_action_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-compiler_lib_search_dirs_CXX='`$ECHO "X$compiler_lib_search_dirs_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-predep_objects_CXX='`$ECHO "X$predep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-postdep_objects_CXX='`$ECHO "X$postdep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-predeps_CXX='`$ECHO "X$predeps_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-postdeps_CXX='`$ECHO "X$postdeps_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-compiler_lib_search_path_CXX='`$ECHO "X$compiler_lib_search_path_CXX" | $Xsed -e "$delay_single_quote_subst"`'
-
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# Quote evaled strings.
-for var in SED \
-GREP \
-EGREP \
-FGREP \
-LD \
-NM \
-LN_S \
-lt_SP2NL \
-lt_NL2SP \
-reload_flag \
-OBJDUMP \
-deplibs_check_method \
-file_magic_cmd \
-AR \
-AR_FLAGS \
-STRIP \
-RANLIB \
-CC \
-CFLAGS \
-compiler \
-lt_cv_sys_global_symbol_pipe \
-lt_cv_sys_global_symbol_to_cdecl \
-lt_cv_sys_global_symbol_to_c_name_address \
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
-SHELL \
-ECHO \
-lt_prog_compiler_no_builtin_flag \
-lt_prog_compiler_wl \
-lt_prog_compiler_pic \
-lt_prog_compiler_static \
-lt_cv_prog_compiler_c_o \
-need_locks \
-DSYMUTIL \
-NMEDIT \
-LIPO \
-OTOOL \
-OTOOL64 \
-shrext_cmds \
-export_dynamic_flag_spec \
-whole_archive_flag_spec \
-compiler_needs_object \
-with_gnu_ld \
-allow_undefined_flag \
-no_undefined_flag \
-hardcode_libdir_flag_spec \
-hardcode_libdir_flag_spec_ld \
-hardcode_libdir_separator \
-fix_srcfile_path \
-exclude_expsyms \
-include_expsyms \
-file_list_spec \
-variables_saved_for_relink \
-libname_spec \
-library_names_spec \
-soname_spec \
-finish_eval \
-old_striplib \
-striplib \
-compiler_lib_search_dirs \
-predep_objects \
-postdep_objects \
-predeps \
-postdeps \
-compiler_lib_search_path \
-LD_CXX \
-compiler_CXX \
-lt_prog_compiler_no_builtin_flag_CXX \
-lt_prog_compiler_wl_CXX \
-lt_prog_compiler_pic_CXX \
-lt_prog_compiler_static_CXX \
-lt_cv_prog_compiler_c_o_CXX \
-export_dynamic_flag_spec_CXX \
-whole_archive_flag_spec_CXX \
-compiler_needs_object_CXX \
-with_gnu_ld_CXX \
-allow_undefined_flag_CXX \
-no_undefined_flag_CXX \
-hardcode_libdir_flag_spec_CXX \
-hardcode_libdir_flag_spec_ld_CXX \
-hardcode_libdir_separator_CXX \
-fix_srcfile_path_CXX \
-exclude_expsyms_CXX \
-include_expsyms_CXX \
-file_list_spec_CXX \
-compiler_lib_search_dirs_CXX \
-predep_objects_CXX \
-postdep_objects_CXX \
-predeps_CXX \
-postdeps_CXX \
-compiler_lib_search_path_CXX; do
-    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
-    *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Double-quote double-evaled strings.
-for var in reload_cmds \
-old_postinstall_cmds \
-old_postuninstall_cmds \
-old_archive_cmds \
-extract_expsyms_cmds \
-old_archive_from_new_cmds \
-old_archive_from_expsyms_cmds \
-archive_cmds \
-archive_expsym_cmds \
-module_cmds \
-module_expsym_cmds \
-export_symbols_cmds \
-prelink_cmds \
-postinstall_cmds \
-postuninstall_cmds \
-finish_cmds \
-sys_lib_search_path_spec \
-sys_lib_dlsearch_path_spec \
-old_archive_cmds_CXX \
-old_archive_from_new_cmds_CXX \
-old_archive_from_expsyms_cmds_CXX \
-archive_cmds_CXX \
-archive_expsym_cmds_CXX \
-module_cmds_CXX \
-module_expsym_cmds_CXX \
-export_symbols_cmds_CXX \
-prelink_cmds_CXX; do
-    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
-    *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Fix-up fallback echo if it was mangled by the above quoting rules.
-case \$lt_ECHO in
-*'\\\$0 --fallback-echo"')  lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\`
-  ;;
-esac
-
-ac_aux_dir='$ac_aux_dir'
-xsi_shell='$xsi_shell'
-lt_shell_append='$lt_shell_append'
-
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-
-    PACKAGE='$PACKAGE'
-    VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
-    RM='$RM'
-    ofile='$ofile'
-
-
-
-
-
-# variables for create stdint.h replacement
-PACKAGE="$PACKAGE"
-VERSION="$VERSION"
-ac_stdint_h="$ac_stdint_h"
-_ac_stdint_h=`$as_echo "_$PACKAGE-$ac_stdint_h" | $as_tr_cpp`
-ac_cv_stdint_message="$ac_cv_stdint_message"
-ac_cv_header_stdint_t="$ac_cv_header_stdint_t"
-ac_cv_header_stdint_x="$ac_cv_header_stdint_x"
-ac_cv_header_stdint_o="$ac_cv_header_stdint_o"
-ac_cv_header_stdint_u="$ac_cv_header_stdint_u"
-ac_cv_type_uint64_t="$ac_cv_type_uint64_t"
-ac_cv_type_u_int64_t="$ac_cv_type_u_int64_t"
-ac_cv_char_data_model="$ac_cv_char_data_model"
-ac_cv_long_data_model="$ac_cv_long_data_model"
-ac_cv_type_int_least32_t="$ac_cv_type_int_least32_t"
-ac_cv_type_int_fast32_t="$ac_cv_type_int_fast32_t"
-ac_cv_type_intmax_t="$ac_cv_type_intmax_t"
-
-
-ax_create_pkgconfig_generate="$ax_create_pkgconfig_generate"
-pkgconfig_prefix='$prefix'
-pkgconfig_execprefix='$exec_prefix'
-pkgconfig_bindir='$bindir'
-pkgconfig_libdir='$libdir'
-pkgconfig_includedir='$includedir'
-pkgconfig_datarootdir='$datarootdir'
-pkgconfig_datadir='$datadir'
-pkgconfig_sysconfdir='$sysconfdir'
-pkgconfig_suffix='$ax_create_pkgconfig_suffix'
-pkgconfig_package='$PACKAGE_NAME'
-pkgconfig_libname='$ax_create_pkgconfig_libname'
-pkgconfig_description='$ax_create_pkgconfig_description'
-pkgconfig_version='$ax_create_pkgconfig_version'
-pkgconfig_requires='$ax_create_pkgconfig_requires'
-pkgconfig_libs='$ax_create_pkgconfig_libs'
-pkgconfig_ldflags='$ax_create_pkgconfig_ldflags'
-pkgconfig_cppflags='$ax_create_pkgconfig_cppflags'
-pkgconfig_src_libdir='$ax_create_pkgconfig_src_libdir'
-pkgconfig_src_headers='$ax_create_pkgconfig_src_headers'
-
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-
-# Handling of arguments.
-for ac_config_target in $ac_config_targets
-do
-  case $ac_config_target in
-    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
-    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
-    "$ac_stdint_h") CONFIG_COMMANDS="$CONFIG_COMMANDS $ac_stdint_h" ;;
-    "$ax_create_pkgconfig_generate") CONFIG_COMMANDS="$CONFIG_COMMANDS $ax_create_pkgconfig_generate" ;;
-    "isl_config.h") CONFIG_HEADERS="$CONFIG_HEADERS isl_config.h" ;;
-    "include/isl/config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/isl/config.h" ;;
-    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-    "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
-    "interface/Makefile") CONFIG_FILES="$CONFIG_FILES interface/Makefile" ;;
-    "bound_test.sh") CONFIG_FILES="$CONFIG_FILES bound_test.sh" ;;
-    "pip_test.sh") CONFIG_FILES="$CONFIG_FILES pip_test.sh" ;;
-
-  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;;
-  esac
-done
-
-
-# If the user did not use the arguments to specify the items to instantiate,
-# then the envvar interface is used.  Set only those that are not.
-# We use the long form for the default assignment because of an extremely
-# bizarre bug on SunOS 4.1.3.
-if $ac_need_defaults; then
-  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
-  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
-  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
-fi
-
-# Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason against having it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Hook for its removal unless debugging.
-# Note that there is a small window in which the directory will not be cleaned:
-# after its creation but before its name has been assigned to `$tmp'.
-$debug ||
-{
-  tmp=
-  trap 'exit_status=$?
-  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
-' 0
-  trap 'as_fn_exit 1' 1 2 13 15
-}
-# Create a (secure) tmp directory for tmp files.
-
-{
-  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
-  test -n "$tmp" && test -d "$tmp"
-}  ||
-{
-  tmp=./conf$$-$RANDOM
-  (umask 077 && mkdir "$tmp")
-} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
-
-# Set up the scripts for CONFIG_FILES section.
-# No need to generate them if there are no CONFIG_FILES.
-# This happens for instance with `./config.status config.h'.
-if test -n "$CONFIG_FILES"; then
-
-
-ac_cr=`echo X | tr X '\015'`
-# On cygwin, bash can eat \r inside `` if the user requested igncr.
-# But we know of no other shell where ac_cr would be empty at this
-# point, so we can use a bashism as a fallback.
-if test "x$ac_cr" = x; then
-  eval ac_cr=\$\'\\r\'
-fi
-ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
-if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
-  ac_cs_awk_cr='\\r'
-else
-  ac_cs_awk_cr=$ac_cr
-fi
-
-echo 'BEGIN {' >"$tmp/subs1.awk" &&
-_ACEOF
-
-
-{
-  echo "cat >conf$$subs.awk <<_ACEOF" &&
-  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
-  echo "_ACEOF"
-} >conf$$subs.sh ||
-  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
-ac_delim='%!_!# '
-for ac_last_try in false false false false false :; do
-  . ./conf$$subs.sh ||
-    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-
-  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
-  if test $ac_delim_n = $ac_delim_num; then
-    break
-  elif $ac_last_try; then
-    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-  else
-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
-  fi
-done
-rm -f conf$$subs.sh
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
-_ACEOF
-sed -n '
-h
-s/^/S["/; s/!.*/"]=/
-p
-g
-s/^[^!]*!//
-:repl
-t repl
-s/'"$ac_delim"'$//
-t delim
-:nl
-h
-s/\(.\{148\}\)..*/\1/
-t more1
-s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
-p
-n
-b repl
-:more1
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t nl
-:delim
-h
-s/\(.\{148\}\)..*/\1/
-t more2
-s/["\\]/\\&/g; s/^/"/; s/$/"/
-p
-b
-:more2
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t delim
-' <conf$$subs.awk | sed '
-/^[^""]/{
-  N
-  s/\n//
-}
-' >>$CONFIG_STATUS || ac_write_fail=1
-rm -f conf$$subs.awk
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-_ACAWK
-cat >>"\$tmp/subs1.awk" <<_ACAWK &&
-  for (key in S) S_is_set[key] = 1
-  FS = ""
-
-}
-{
-  line = $ 0
-  nfields = split(line, field, "@")
-  substed = 0
-  len = length(field[1])
-  for (i = 2; i < nfields; i++) {
-    key = field[i]
-    keylen = length(key)
-    if (S_is_set[key]) {
-      value = S[key]
-      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
-      len += length(value) + length(field[++i])
-      substed = 1
-    } else
-      len += 1 + keylen
-  }
-
-  print line
-}
-
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
-  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
-else
-  cat
-fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
-  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
-_ACEOF
-
-# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
-# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
-h
-s///
-s/^/:/
-s/[	 ]*$/:/
-s/:\$(srcdir):/:/g
-s/:\${srcdir}:/:/g
-s/:@srcdir@:/:/g
-s/^:*//
-s/:*$//
-x
-s/\(=[	 ]*\).*/\1/
-G
-s/\n//
-s/^[^=]*=[	 ]*$//
-}'
-fi
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-fi # test -n "$CONFIG_FILES"
-
-# Set up the scripts for CONFIG_HEADERS section.
-# No need to generate them if there are no CONFIG_HEADERS.
-# This happens for instance with `./config.status Makefile'.
-if test -n "$CONFIG_HEADERS"; then
-cat >"$tmp/defines.awk" <<\_ACAWK ||
-BEGIN {
-_ACEOF
-
-# Transform confdefs.h into an awk script `defines.awk', embedded as
-# here-document in config.status, that substitutes the proper values into
-# config.h.in to produce config.h.
-
-# Create a delimiter string that does not exist in confdefs.h, to ease
-# handling of long lines.
-ac_delim='%!_!# '
-for ac_last_try in false false :; do
-  ac_t=`sed -n "/$ac_delim/p" confdefs.h`
-  if test -z "$ac_t"; then
-    break
-  elif $ac_last_try; then
-    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
-  else
-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
-  fi
-done
-
-# For the awk script, D is an array of macro values keyed by name,
-# likewise P contains macro parameters if any.  Preserve backslash
-# newline sequences.
-
-ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
-sed -n '
-s/.\{148\}/&'"$ac_delim"'/g
-t rset
-:rset
-s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
-t def
-d
-:def
-s/\\$//
-t bsnl
-s/["\\]/\\&/g
-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
-D["\1"]=" \3"/p
-s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
-d
-:bsnl
-s/["\\]/\\&/g
-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
-D["\1"]=" \3\\\\\\n"\\/p
-t cont
-s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
-t cont
-d
-:cont
-n
-s/.\{148\}/&'"$ac_delim"'/g
-t clear
-:clear
-s/\\$//
-t bsnlc
-s/["\\]/\\&/g; s/^/"/; s/$/"/p
-d
-:bsnlc
-s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
-b cont
-' <confdefs.h | sed '
-s/'"$ac_delim"'/"\\\
-"/g' >>$CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-  for (key in D) D_is_set[key] = 1
-  FS = ""
-}
-/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
-  line = \$ 0
-  split(line, arg, " ")
-  if (arg[1] == "#") {
-    defundef = arg[2]
-    mac1 = arg[3]
-  } else {
-    defundef = substr(arg[1], 2)
-    mac1 = arg[2]
-  }
-  split(mac1, mac2, "(") #)
-  macro = mac2[1]
-  prefix = substr(line, 1, index(line, defundef) - 1)
-  if (D_is_set[macro]) {
-    # Preserve the white space surrounding the "#".
-    print prefix "define", macro P[macro] D[macro]
-    next
-  } else {
-    # Replace #undef with comments.  This is necessary, for example,
-    # in the case of _POSIX_SOURCE, which is predefined and required
-    # on some systems where configure will not decide to define it.
-    if (defundef == "undef") {
-      print "/*", prefix defundef, macro, "*/"
-      next
-    }
-  }
-}
-{ print }
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
-fi # test -n "$CONFIG_HEADERS"
-
-
-eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
-shift
-for ac_tag
-do
-  case $ac_tag in
-  :[FHLC]) ac_mode=$ac_tag; continue;;
-  esac
-  case $ac_mode$ac_tag in
-  :[FHL]*:*);;
-  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;;
-  :[FH]-) ac_tag=-:-;;
-  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
-  esac
-  ac_save_IFS=$IFS
-  IFS=:
-  set x $ac_tag
-  IFS=$ac_save_IFS
-  shift
-  ac_file=$1
-  shift
-
-  case $ac_mode in
-  :L) ac_source=$1;;
-  :[FH])
-    ac_file_inputs=
-    for ac_f
-    do
-      case $ac_f in
-      -) ac_f="$tmp/stdin";;
-      *) # Look for the file first in the build tree, then in the source tree
-	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
-	 # because $ac_f cannot contain `:'.
-	 test -f "$ac_f" ||
-	   case $ac_f in
-	   [\\/$]*) false;;
-	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
-	   esac ||
-	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;;
-      esac
-      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
-      as_fn_append ac_file_inputs " '$ac_f'"
-    done
-
-    # Let's still pretend it is `configure' which instantiates (i.e., don't
-    # use $as_me), people would be surprised to read:
-    #    /* config.h.  Generated by config.status.  */
-    configure_input='Generated from '`
-	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
-	`' by configure.'
-    if test x"$ac_file" != x-; then
-      configure_input="$ac_file.  $configure_input"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
-    fi
-    # Neutralize special characters interpreted by sed in replacement strings.
-    case $configure_input in #(
-    *\&* | *\|* | *\\* )
-       ac_sed_conf_input=`$as_echo "$configure_input" |
-       sed 's/[\\\\&|]/\\\\&/g'`;; #(
-    *) ac_sed_conf_input=$configure_input;;
-    esac
-
-    case $ac_tag in
-    *:-:* | *:-) cat >"$tmp/stdin" \
-      || as_fn_error $? "could not create $ac_file" "$LINENO" 5  ;;
-    esac
-    ;;
-  esac
-
-  ac_dir=`$as_dirname -- "$ac_file" ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  as_dir="$ac_dir"; as_fn_mkdir_p
-  ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-
-  case $ac_mode in
-  :F)
-  #
-  # CONFIG_FILE
-  #
-
-  case $INSTALL in
-  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
-  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
-  esac
-  ac_MKDIR_P=$MKDIR_P
-  case $MKDIR_P in
-  [\\/$]* | ?:[\\/]* ) ;;
-  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
-  esac
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# If the template does not know about datarootdir, expand it.
-# FIXME: This hack should be removed a few years after 2.60.
-ac_datarootdir_hack=; ac_datarootdir_seen=
-ac_sed_dataroot='
-/datarootdir/ {
-  p
-  q
-}
-/@datadir@/p
-/@docdir@/p
-/@infodir@/p
-/@localedir@/p
-/@mandir@/p'
-case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
-*datarootdir*) ac_datarootdir_seen=yes;;
-*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-  ac_datarootdir_hack='
-  s&@datadir@&$datadir&g
-  s&@docdir@&$docdir&g
-  s&@infodir@&$infodir&g
-  s&@localedir@&$localedir&g
-  s&@mandir@&$mandir&g
-  s&\\\${datarootdir}&$datarootdir&g' ;;
-esac
-_ACEOF
-
-# Neutralize VPATH when `$srcdir' = `.'.
-# Shell code in configure.ac might set extrasub.
-# FIXME: do we really want to maintain this feature?
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_sed_extra="$ac_vpsub
-$extrasub
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s|@configure_input@|$ac_sed_conf_input|;t t
-s&@top_builddir@&$ac_top_builddir_sub&;t t
-s&@top_build_prefix@&$ac_top_build_prefix&;t t
-s&@srcdir@&$ac_srcdir&;t t
-s&@abs_srcdir@&$ac_abs_srcdir&;t t
-s&@top_srcdir@&$ac_top_srcdir&;t t
-s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
-s&@builddir@&$ac_builddir&;t t
-s&@abs_builddir@&$ac_abs_builddir&;t t
-s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
-s&@INSTALL@&$ac_INSTALL&;t t
-s&@MKDIR_P@&$ac_MKDIR_P&;t t
-$ac_datarootdir_hack
-"
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
-  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
-
-test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
-  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
-  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined" >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined" >&2;}
-
-  rm -f "$tmp/stdin"
-  case $ac_file in
-  -) cat "$tmp/out" && rm -f "$tmp/out";;
-  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
-  esac \
-  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
- ;;
-  :H)
-  #
-  # CONFIG_HEADER
-  #
-  if test x"$ac_file" != x-; then
-    {
-      $as_echo "/* $configure_input  */" \
-      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
-    } >"$tmp/config.h" \
-      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
-    if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
-$as_echo "$as_me: $ac_file is unchanged" >&6;}
-    else
-      rm -f "$ac_file"
-      mv "$tmp/config.h" "$ac_file" \
-	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
-    fi
-  else
-    $as_echo "/* $configure_input  */" \
-      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
-      || as_fn_error $? "could not create -" "$LINENO" 5
-  fi
-# Compute "$ac_file"'s index in $config_headers.
-_am_arg="$ac_file"
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $_am_arg | $_am_arg:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
-$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$_am_arg" : 'X\(//\)[^/]' \| \
-	 X"$_am_arg" : 'X\(//\)$' \| \
-	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$_am_arg" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`/stamp-h$_am_stamp_count
- ;;
-
-  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
-$as_echo "$as_me: executing $ac_file commands" >&6;}
- ;;
-  esac
-
-
-  case $ac_file$ac_mode in
-    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
-  # are listed without --file.  Let's play safe and only enable the eval
-  # if we detect the quoting.
-  case $CONFIG_FILES in
-  *\'*) eval set x "$CONFIG_FILES" ;;
-  *)   set x $CONFIG_FILES ;;
-  esac
-  shift
-  for mf
-  do
-    # Strip MF so we end up with the name of the file.
-    mf=`echo "$mf" | sed -e 's/:.*$//'`
-    # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
-    # some people rename them; so instead we look at the file content.
-    # Grep'ing the first line is not enough: some people post-process
-    # each Makefile.in and add a new line on top of each file to say so.
-    # Grep'ing the whole file is not good either: AIX grep has a line
-    # limit of 2048, but all sed's we know have understand at least 4000.
-    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-      dirpart=`$as_dirname -- "$mf" ||
-$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$mf" : 'X\(//\)[^/]' \| \
-	 X"$mf" : 'X\(//\)$' \| \
-	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$mf" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-    else
-      continue
-    fi
-    # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
-    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-    test -z "$DEPDIR" && continue
-    am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
-    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
-    # Find all dependency output files, they are included files with
-    # $(DEPDIR) in their names.  We invoke sed twice because it is the
-    # simplest approach to changing $(DEPDIR) to its actual value in the
-    # expansion.
-    for file in `sed -n "
-      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-      # Make sure the directory exists.
-      test -f "$dirpart/$file" && continue
-      fdir=`$as_dirname -- "$file" ||
-$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$file" : 'X\(//\)[^/]' \| \
-	 X"$file" : 'X\(//\)$' \| \
-	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      as_dir=$dirpart/$fdir; as_fn_mkdir_p
-      # echo "creating $dirpart/$file"
-      echo '# dummy' > "$dirpart/$file"
-    done
-  done
-}
- ;;
-    "libtool":C)
-
-    # See if we are running on zsh, and set the options which allow our
-    # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
-      setopt NO_GLOB_SUBST
-    fi
-
-    cfgfile="${ofile}T"
-    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
-    $RM "$cfgfile"
-
-    cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $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.
-#
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008 Free Software Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-
-# The names of the tagged configurations supported by this script.
-available_tags="CXX "
-
-# ### BEGIN LIBTOOL CONFIG
-
-# Which release of libtool.m4 was used?
-macro_version=$macro_version
-macro_revision=$macro_revision
-
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
-
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
-
-# What type of objects to build.
-pic_mode=$pic_mode
-
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
-
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
-
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
-
-# A sed program that does not truncate output.
-SED=$lt_SED
-
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="\$SED -e 1s/^X//"
-
-# A grep program that handles long lines.
-GREP=$lt_GREP
-
-# An ERE matcher.
-EGREP=$lt_EGREP
-
-# A literal string matcher.
-FGREP=$lt_FGREP
-
-# A BSD- or MS-compatible name lister.
-NM=$lt_NM
-
-# Whether we need soft or hard links.
-LN_S=$lt_LN_S
-
-# What is the maximum length of a command?
-max_cmd_len=$max_cmd_len
-
-# Object file suffix (normally "o").
-objext=$ac_objext
-
-# Executable file suffix (normally "").
-exeext=$exeext
-
-# whether the shell understands "unset".
-lt_unset=$lt_unset
-
-# turn spaces into newlines.
-SP2NL=$lt_lt_SP2NL
-
-# turn newlines into spaces.
-NL2SP=$lt_lt_NL2SP
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
-
-# An object symbol dumper.
-OBJDUMP=$lt_OBJDUMP
-
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
-
-# Command to use when deplibs_check_method == "file_magic".
-file_magic_cmd=$lt_file_magic_cmd
-
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
-
-# A symbol stripping program.
-STRIP=$lt_STRIP
-
-# Commands used to install an old-style archive.
-RANLIB=$lt_RANLIB
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
-
-# A C compiler.
-LTCC=$lt_CC
-
-# LTCC compiler flags.
-LTCFLAGS=$lt_CFLAGS
-
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
-
-# Transform the output of nm in a proper C declaration.
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
-
-# Transform the output of nm in a C name address pair.
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
-
-# Transform the output of nm in a C name address pair when lib prefix is needed.
-global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
-
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
-
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
-
-# An echo program that does not interpret backslashes.
-ECHO=$lt_ECHO
-
-# Used to examine libraries when file_magic_cmd begins with "file".
-MAGIC_CMD=$MAGIC_CMD
-
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
-
-# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
-DSYMUTIL=$lt_DSYMUTIL
-
-# Tool to change global to local symbols on Mac OS X.
-NMEDIT=$lt_NMEDIT
-
-# Tool to manipulate fat objects and archives on Mac OS X.
-LIPO=$lt_LIPO
-
-# ldd/readelf like tool for Mach-O binaries on Mac OS X.
-OTOOL=$lt_OTOOL
-
-# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
-OTOOL64=$lt_OTOOL64
-
-# Old archive suffix (normally "a").
-libext=$libext
-
-# Shared library suffix (normally ".so").
-shrext_cmds=$lt_shrext_cmds
-
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
-
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at link time.
-variables_saved_for_relink=$lt_variables_saved_for_relink
-
-# Do we need the "lib" prefix for modules?
-need_lib_prefix=$need_lib_prefix
-
-# Do we need a version for libraries?
-need_version=$need_version
-
-# Library versioning type.
-version_type=$version_type
-
-# Shared library runtime path variable.
-runpath_var=$runpath_var
-
-# Shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
-
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
-
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME
-library_names_spec=$lt_library_names_spec
-
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
-
-# Command to use after installation of a shared archive.
-postinstall_cmds=$lt_postinstall_cmds
-
-# Command to use after uninstallation of a shared archive.
-postuninstall_cmds=$lt_postuninstall_cmds
-
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
-
-# As "finish_cmds", except a single script fragment to be evaled but
-# not shown.
-finish_eval=$lt_finish_eval
-
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
-
-# Compile-time system search path for libraries.
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
-
-# Run-time system search path for libraries.
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
-
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
-
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
-
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
-
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
-
-
-# The linker used to build libraries.
-LD=$lt_LD
-
-# Commands used to build an old-style archive.
-old_archive_cmds=$lt_old_archive_cmds
-
-# A language specific compiler.
-CC=$lt_compiler
-
-# Is the compiler the GNU compiler?
-with_gcc=$GCC
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
-
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc
-
-# Whether or not to disallow shared libs when runtime libs are static.
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec
-
-# Whether the compiler copes with passing no objects directly.
-compiler_needs_object=$lt_compiler_needs_object
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
-
-# Commands used to build a shared archive.
-archive_cmds=$lt_archive_cmds
-archive_expsym_cmds=$lt_archive_expsym_cmds
-
-# Commands used to build a loadable module if different from building
-# a shared archive.
-module_cmds=$lt_module_cmds
-module_expsym_cmds=$lt_module_expsym_cmds
-
-# Whether we are building with GNU ld or not.
-with_gnu_ld=$lt_with_gnu_ld
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag
-
-# Flag that enforces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
-
-# If ld is used when linking, flag to hardcode \$libdir into a binary
-# during linking.  This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
-
-# Whether we need a single "-rpath" flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary.
-hardcode_direct=$hardcode_direct
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
-# library is relocated.
-hardcode_direct_absolute=$hardcode_direct_absolute
-
-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-# into the resulting binary.
-hardcode_minus_L=$hardcode_minus_L
-
-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-# into the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var
-
-# Set to "yes" if building a shared library automatically hardcodes DIR
-# into the library and all subsequent libraries and executables linked
-# against it.
-hardcode_automatic=$hardcode_automatic
-
-# Set to yes if linker adds runtime paths of dependent libraries
-# to runtime path list.
-inherit_rpath=$inherit_rpath
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs
-
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path=$lt_fix_srcfile_path
-
-# Set to "yes" if exported symbols are required.
-always_export_symbols=$always_export_symbols
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms
-
-# Commands necessary for linking programs (against libraries) with templates.
-prelink_cmds=$lt_prelink_cmds
-
-# Specify filename containing input files.
-file_list_spec=$lt_file_list_spec
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action
-
-# The directories searched by this compiler when creating a shared library.
-compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
-
-# Dependencies to place before and after the objects being linked to
-# create a shared library.
-predep_objects=$lt_predep_objects
-postdep_objects=$lt_postdep_objects
-predeps=$lt_predeps
-postdeps=$lt_postdeps
-
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path
-
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
-  case $host_os in
-  aix3*)
-    cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-_LT_EOF
-    ;;
-  esac
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  case $xsi_shell in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result="${1##*/}"
-}
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-  func_basename_result="${1##*/}"
-}
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-func_stripname ()
-{
-  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-  # positional parameters, so assign one to ordinary parameter first.
-  func_stripname_result=${3}
-  func_stripname_result=${func_stripname_result#"${1}"}
-  func_stripname_result=${func_stripname_result%"${2}"}
-}
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=${1%%=*}
-  func_opt_split_arg=${1#*=}
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  case ${1} in
-    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-    *)    func_lo2o_result=${1} ;;
-  esac
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=${1%.*}.lo
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=$(( $* ))
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=${#1}
-}
-
-_LT_EOF
-    ;;
-  *) # Bourne compatible functions.
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
-}
-
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-  case ${2} in
-    .*) func_stripname_result=`$ECHO "X${3}" \
-           | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
-    *)  func_stripname_result=`$ECHO "X${3}" \
-           | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
-  esac
-}
-
-# sed scripts:
-my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q'
-my_sed_long_arg='1s/^-[^=]*=//'
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
-  func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'`
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=`expr "$@"`
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
-}
-
-_LT_EOF
-esac
-
-case $lt_shell_append in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$1+=\$2"
-}
-_LT_EOF
-    ;;
-  *)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$1=\$$1\$2"
-}
-
-_LT_EOF
-    ;;
-  esac
-
-
-  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  mv -f "$cfgfile" "$ofile" ||
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
-
-
-    cat <<_LT_EOF >> "$ofile"
-
-# ### BEGIN LIBTOOL TAG CONFIG: CXX
-
-# The linker used to build libraries.
-LD=$lt_LD_CXX
-
-# Commands used to build an old-style archive.
-old_archive_cmds=$lt_old_archive_cmds_CXX
-
-# A language specific compiler.
-CC=$lt_compiler_CXX
-
-# Is the compiler the GNU compiler?
-with_gcc=$GCC_CXX
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
-
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl_CXX
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic_CXX
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static_CXX
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc_CXX
-
-# Whether or not to disallow shared libs when runtime libs are static.
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
-
-# Whether the compiler copes with passing no objects directly.
-compiler_needs_object=$lt_compiler_needs_object_CXX
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
-
-# Commands used to build a shared archive.
-archive_cmds=$lt_archive_cmds_CXX
-archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
-
-# Commands used to build a loadable module if different from building
-# a shared archive.
-module_cmds=$lt_module_cmds_CXX
-module_expsym_cmds=$lt_module_expsym_cmds_CXX
-
-# Whether we are building with GNU ld or not.
-with_gnu_ld=$lt_with_gnu_ld_CXX
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag_CXX
-
-# Flag that enforces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag_CXX
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
-
-# If ld is used when linking, flag to hardcode \$libdir into a binary
-# during linking.  This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX
-
-# Whether we need a single "-rpath" flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary.
-hardcode_direct=$hardcode_direct_CXX
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
-# library is relocated.
-hardcode_direct_absolute=$hardcode_direct_absolute_CXX
-
-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-# into the resulting binary.
-hardcode_minus_L=$hardcode_minus_L_CXX
-
-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-# into the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
-
-# Set to "yes" if building a shared library automatically hardcodes DIR
-# into the library and all subsequent libraries and executables linked
-# against it.
-hardcode_automatic=$hardcode_automatic_CXX
-
-# Set to yes if linker adds runtime paths of dependent libraries
-# to runtime path list.
-inherit_rpath=$inherit_rpath_CXX
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs_CXX
-
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path=$lt_fix_srcfile_path_CXX
-
-# Set to "yes" if exported symbols are required.
-always_export_symbols=$always_export_symbols_CXX
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds_CXX
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms_CXX
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms_CXX
-
-# Commands necessary for linking programs (against libraries) with templates.
-prelink_cmds=$lt_prelink_cmds_CXX
-
-# Specify filename containing input files.
-file_list_spec=$lt_file_list_spec_CXX
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action_CXX
-
-# The directories searched by this compiler when creating a shared library.
-compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
-
-# Dependencies to place before and after the objects being linked to
-# create a shared library.
-predep_objects=$lt_predep_objects_CXX
-postdep_objects=$lt_postdep_objects_CXX
-predeps=$lt_predeps_CXX
-postdeps=$lt_postdeps_CXX
-
-# The library search path used internally by the compiler when linking
-# a shared library.
-compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
-
-# ### END LIBTOOL TAG CONFIG: CXX
-_LT_EOF
-
- ;;
-    "$ac_stdint_h":C)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_stdint_h : $_ac_stdint_h" >&5
-$as_echo "$as_me: creating $ac_stdint_h : $_ac_stdint_h" >&6;}
-ac_stdint=$tmp/_stdint.h
-
-echo "#ifndef" $_ac_stdint_h >$ac_stdint
-echo "#define" $_ac_stdint_h "1" >>$ac_stdint
-echo "#ifndef" _GENERATED_STDINT_H >>$ac_stdint
-echo "#define" _GENERATED_STDINT_H '"'$PACKAGE $VERSION'"' >>$ac_stdint
-echo "/* generated $ac_cv_stdint_message */" >>$ac_stdint
-if test "_$ac_cv_header_stdint_t" != "_" ; then
-echo "#define _STDINT_HAVE_STDINT_H" "1" >>$ac_stdint
-echo "#include <stdint.h>" >>$ac_stdint
-echo "#endif" >>$ac_stdint
-echo "#endif" >>$ac_stdint
-else
-
-cat >>$ac_stdint <<STDINT_EOF
-
-/* ................... shortcircuit part ........................... */
-
-#if defined HAVE_STDINT_H || defined _STDINT_HAVE_STDINT_H
-#include <stdint.h>
-#else
-#include <stddef.h>
-
-/* .................... configured part ............................ */
-
-STDINT_EOF
-
-echo "/* whether we have a C99 compatible stdint header file */" >>$ac_stdint
-if test "_$ac_cv_header_stdint_x" != "_" ; then
-  ac_header="$ac_cv_header_stdint_x"
-  echo "#define _STDINT_HEADER_INTPTR" '"'"$ac_header"'"' >>$ac_stdint
-else
-  echo "/* #undef _STDINT_HEADER_INTPTR */" >>$ac_stdint
-fi
-
-echo "/* whether we have a C96 compatible inttypes header file */" >>$ac_stdint
-if  test "_$ac_cv_header_stdint_o" != "_" ; then
-  ac_header="$ac_cv_header_stdint_o"
-  echo "#define _STDINT_HEADER_UINT32" '"'"$ac_header"'"' >>$ac_stdint
-else
-  echo "/* #undef _STDINT_HEADER_UINT32 */" >>$ac_stdint
-fi
-
-echo "/* whether we have a BSD compatible inet types header */" >>$ac_stdint
-if  test "_$ac_cv_header_stdint_u" != "_" ; then
-  ac_header="$ac_cv_header_stdint_u"
-  echo "#define _STDINT_HEADER_U_INT32" '"'"$ac_header"'"' >>$ac_stdint
-else
-  echo "/* #undef _STDINT_HEADER_U_INT32 */" >>$ac_stdint
-fi
-
-echo "" >>$ac_stdint
-
-if test "_$ac_header" != "_" ; then if test "$ac_header" != "stddef.h" ; then
-  echo "#include <$ac_header>" >>$ac_stdint
-  echo "" >>$ac_stdint
-fi fi
-
-echo "/* which 64bit typedef has been found */" >>$ac_stdint
-if test "$ac_cv_type_uint64_t" = "yes" ; then
-echo "#define   _STDINT_HAVE_UINT64_T" "1"  >>$ac_stdint
-else
-echo "/* #undef _STDINT_HAVE_UINT64_T */" >>$ac_stdint
-fi
-if test "$ac_cv_type_u_int64_t" = "yes" ; then
-echo "#define   _STDINT_HAVE_U_INT64_T" "1"  >>$ac_stdint
-else
-echo "/* #undef _STDINT_HAVE_U_INT64_T */" >>$ac_stdint
-fi
-echo "" >>$ac_stdint
-
-echo "/* which type model has been detected */" >>$ac_stdint
-if test "_$ac_cv_char_data_model" != "_" ; then
-echo "#define   _STDINT_CHAR_MODEL" "$ac_cv_char_data_model" >>$ac_stdint
-echo "#define   _STDINT_LONG_MODEL" "$ac_cv_long_data_model" >>$ac_stdint
-else
-echo "/* #undef _STDINT_CHAR_MODEL // skipped */" >>$ac_stdint
-echo "/* #undef _STDINT_LONG_MODEL // skipped */" >>$ac_stdint
-fi
-echo "" >>$ac_stdint
-
-echo "/* whether int_least types were detected */" >>$ac_stdint
-if test "$ac_cv_type_int_least32_t" = "yes"; then
-echo "#define   _STDINT_HAVE_INT_LEAST32_T" "1"  >>$ac_stdint
-else
-echo "/* #undef _STDINT_HAVE_INT_LEAST32_T */" >>$ac_stdint
-fi
-echo "/* whether int_fast types were detected */" >>$ac_stdint
-if test "$ac_cv_type_int_fast32_t" = "yes"; then
-echo "#define   _STDINT_HAVE_INT_FAST32_T" "1" >>$ac_stdint
-else
-echo "/* #undef _STDINT_HAVE_INT_FAST32_T */" >>$ac_stdint
-fi
-echo "/* whether intmax_t type was detected */" >>$ac_stdint
-if test "$ac_cv_type_intmax_t" = "yes"; then
-echo "#define   _STDINT_HAVE_INTMAX_T" "1" >>$ac_stdint
-else
-echo "/* #undef _STDINT_HAVE_INTMAX_T */" >>$ac_stdint
-fi
-echo "" >>$ac_stdint
-
-  cat >>$ac_stdint <<STDINT_EOF
-/* .................... detections part ............................ */
-
-/* whether we need to define bitspecific types from compiler base types */
-#ifndef _STDINT_HEADER_INTPTR
-#ifndef _STDINT_HEADER_UINT32
-#ifndef _STDINT_HEADER_U_INT32
-#define _STDINT_NEED_INT_MODEL_T
-#else
-#define _STDINT_HAVE_U_INT_TYPES
-#endif
-#endif
-#endif
-
-#ifdef _STDINT_HAVE_U_INT_TYPES
-#undef _STDINT_NEED_INT_MODEL_T
-#endif
-
-#ifdef  _STDINT_CHAR_MODEL
-#if     _STDINT_CHAR_MODEL+0 == 122 || _STDINT_CHAR_MODEL+0 == 124
-#ifndef _STDINT_BYTE_MODEL
-#define _STDINT_BYTE_MODEL 12
-#endif
-#endif
-#endif
-
-#ifndef _STDINT_HAVE_INT_LEAST32_T
-#define _STDINT_NEED_INT_LEAST_T
-#endif
-
-#ifndef _STDINT_HAVE_INT_FAST32_T
-#define _STDINT_NEED_INT_FAST_T
-#endif
-
-#ifndef _STDINT_HEADER_INTPTR
-#define _STDINT_NEED_INTPTR_T
-#ifndef _STDINT_HAVE_INTMAX_T
-#define _STDINT_NEED_INTMAX_T
-#endif
-#endif
-
-
-/* .................... definition part ............................ */
-
-/* some system headers have good uint64_t */
-#ifndef _HAVE_UINT64_T
-#if     defined _STDINT_HAVE_UINT64_T  || defined HAVE_UINT64_T
-#define _HAVE_UINT64_T
-#elif   defined _STDINT_HAVE_U_INT64_T || defined HAVE_U_INT64_T
-#define _HAVE_UINT64_T
-typedef u_int64_t uint64_t;
-#endif
-#endif
-
-#ifndef _HAVE_UINT64_T
-/* .. here are some common heuristics using compiler runtime specifics */
-#if defined __STDC_VERSION__ && defined __STDC_VERSION__ >= 199901L
-#define _HAVE_UINT64_T
-#define _HAVE_LONGLONG_UINT64_T
-typedef long long int64_t;
-typedef unsigned long long uint64_t;
-
-#elif !defined __STRICT_ANSI__
-#if defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__
-#define _HAVE_UINT64_T
-typedef __int64 int64_t;
-typedef unsigned __int64 uint64_t;
-
-#elif defined __GNUC__ || defined __MWERKS__ || defined __ELF__
-/* note: all ELF-systems seem to have loff-support which needs 64-bit */
-#if !defined _NO_LONGLONG
-#define _HAVE_UINT64_T
-#define _HAVE_LONGLONG_UINT64_T
-typedef long long int64_t;
-typedef unsigned long long uint64_t;
-#endif
-
-#elif defined __alpha || (defined __mips && defined _ABIN32)
-#if !defined _NO_LONGLONG
-typedef long int64_t;
-typedef unsigned long uint64_t;
-#endif
-  /* compiler/cpu type to define int64_t */
-#endif
-#endif
-#endif
-
-#if defined _STDINT_HAVE_U_INT_TYPES
-/* int8_t int16_t int32_t defined by inet code, redeclare the u_intXX types */
-typedef u_int8_t uint8_t;
-typedef u_int16_t uint16_t;
-typedef u_int32_t uint32_t;
-
-/* glibc compatibility */
-#ifndef __int8_t_defined
-#define __int8_t_defined
-#endif
-#endif
-
-#ifdef _STDINT_NEED_INT_MODEL_T
-/* we must guess all the basic types. Apart from byte-adressable system, */
-/* there a few 32-bit-only dsp-systems that we guard with BYTE_MODEL 8-} */
-/* (btw, those nibble-addressable systems are way off, or so we assume) */
-
-
-#if defined _STDINT_BYTE_MODEL
-#if _STDINT_LONG_MODEL+0 == 242
-/* 2:4:2 =  IP16 = a normal 16-bit system                */
-typedef unsigned char   uint8_t;
-typedef unsigned short  uint16_t;
-typedef unsigned long   uint32_t;
-#ifndef __int8_t_defined
-#define __int8_t_defined
-typedef          char    int8_t;
-typedef          short   int16_t;
-typedef          long    int32_t;
-#endif
-#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL == 444
-/* 2:4:4 =  LP32 = a 32-bit system derived from a 16-bit */
-/* 4:4:4 = ILP32 = a normal 32-bit system                */
-typedef unsigned char   uint8_t;
-typedef unsigned short  uint16_t;
-typedef unsigned int    uint32_t;
-#ifndef __int8_t_defined
-#define __int8_t_defined
-typedef          char    int8_t;
-typedef          short   int16_t;
-typedef          int     int32_t;
-#endif
-#elif _STDINT_LONG_MODEL+0 == 484 || _STDINT_LONG_MODEL+0 == 488
-/* 4:8:4 =  IP32 = a 32-bit system prepared for 64-bit    */
-/* 4:8:8 =  LP64 = a normal 64-bit system                 */
-typedef unsigned char   uint8_t;
-typedef unsigned short  uint16_t;
-typedef unsigned int    uint32_t;
-#ifndef __int8_t_defined
-#define __int8_t_defined
-typedef          char    int8_t;
-typedef          short   int16_t;
-typedef          int     int32_t;
-#endif
-/* this system has a "long" of 64bit */
-#ifndef _HAVE_UINT64_T
-#define _HAVE_UINT64_T
-typedef unsigned long   uint64_t;
-typedef          long    int64_t;
-#endif
-#elif _STDINT_LONG_MODEL+0 == 448
-/*      LLP64   a 64-bit system derived from a 32-bit system */
-typedef unsigned char   uint8_t;
-typedef unsigned short  uint16_t;
-typedef unsigned int    uint32_t;
-#ifndef __int8_t_defined
-#define __int8_t_defined
-typedef          char    int8_t;
-typedef          short   int16_t;
-typedef          int     int32_t;
-#endif
-/* assuming the system has a "long long" */
-#ifndef _HAVE_UINT64_T
-#define _HAVE_UINT64_T
-#define _HAVE_LONGLONG_UINT64_T
-typedef unsigned long long uint64_t;
-typedef          long long  int64_t;
-#endif
-#else
-#define _STDINT_NO_INT32_T
-#endif
-#else
-#define _STDINT_NO_INT8_T
-#define _STDINT_NO_INT32_T
-#endif
-#endif
-
-/*
- * quote from SunOS-5.8 sys/inttypes.h:
- * Use at your own risk.  As of February 1996, the committee is squarely
- * behind the fixed sized types; the "least" and "fast" types are still being
- * discussed.  The probability that the "fast" types may be removed before
- * the standard is finalized is high enough that they are not currently
- * implemented.
- */
-
-#if defined _STDINT_NEED_INT_LEAST_T
-typedef  int8_t    int_least8_t;
-typedef  int16_t   int_least16_t;
-typedef  int32_t   int_least32_t;
-#ifdef _HAVE_UINT64_T
-typedef  int64_t   int_least64_t;
-#endif
-
-typedef uint8_t   uint_least8_t;
-typedef uint16_t  uint_least16_t;
-typedef uint32_t  uint_least32_t;
-#ifdef _HAVE_UINT64_T
-typedef uint64_t  uint_least64_t;
-#endif
-  /* least types */
-#endif
-
-#if defined _STDINT_NEED_INT_FAST_T
-typedef  int8_t    int_fast8_t;
-typedef  int       int_fast16_t;
-typedef  int32_t   int_fast32_t;
-#ifdef _HAVE_UINT64_T
-typedef  int64_t   int_fast64_t;
-#endif
-
-typedef uint8_t   uint_fast8_t;
-typedef unsigned  uint_fast16_t;
-typedef uint32_t  uint_fast32_t;
-#ifdef _HAVE_UINT64_T
-typedef uint64_t  uint_fast64_t;
-#endif
-  /* fast types */
-#endif
-
-#ifdef _STDINT_NEED_INTMAX_T
-#ifdef _HAVE_UINT64_T
-typedef  int64_t       intmax_t;
-typedef uint64_t      uintmax_t;
-#else
-typedef          long  intmax_t;
-typedef unsigned long uintmax_t;
-#endif
-#endif
-
-#ifdef _STDINT_NEED_INTPTR_T
-#ifndef __intptr_t_defined
-#define __intptr_t_defined
-/* we encourage using "long" to store pointer values, never use "int" ! */
-#if   _STDINT_LONG_MODEL+0 == 242 || _STDINT_LONG_MODEL+0 == 484
-typedef  unsigned int   uintptr_t;
-typedef           int    intptr_t;
-#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL+0 == 444
-typedef  unsigned long  uintptr_t;
-typedef           long   intptr_t;
-#elif _STDINT_LONG_MODEL+0 == 448 && defined _HAVE_UINT64_T
-typedef        uint64_t uintptr_t;
-typedef         int64_t  intptr_t;
-#else /* matches typical system types ILP32 and LP64 - but not IP16 or LLP64 */
-typedef  unsigned long  uintptr_t;
-typedef           long   intptr_t;
-#endif
-#endif
-#endif
-
-/* The ISO C99 standard specifies that in C++ implementations these
-   should only be defined if explicitly requested.  */
-#if !defined __cplusplus || defined __STDC_CONSTANT_MACROS
-#ifndef UINT32_C
-
-/* Signed.  */
-# define INT8_C(c)      c
-# define INT16_C(c)     c
-# define INT32_C(c)     c
-# ifdef _HAVE_LONGLONG_UINT64_T
-#  define INT64_C(c)    c ## L
-# else
-#  define INT64_C(c)    c ## LL
-# endif
-
-/* Unsigned.  */
-# define UINT8_C(c)     c ## U
-# define UINT16_C(c)    c ## U
-# define UINT32_C(c)    c ## U
-# ifdef _HAVE_LONGLONG_UINT64_T
-#  define UINT64_C(c)   c ## UL
-# else
-#  define UINT64_C(c)   c ## ULL
-# endif
-
-/* Maximal type.  */
-# ifdef _HAVE_LONGLONG_UINT64_T
-#  define INTMAX_C(c)   c ## L
-#  define UINTMAX_C(c)  c ## UL
-# else
-#  define INTMAX_C(c)   c ## LL
-#  define UINTMAX_C(c)  c ## ULL
-# endif
-
-  /* literalnumbers */
-#endif
-#endif
-
-/* These limits are merily those of a two complement byte-oriented system */
-
-/* Minimum of signed integral types.  */
-# define INT8_MIN               (-128)
-# define INT16_MIN              (-32767-1)
-# define INT32_MIN              (-2147483647-1)
-#ifndef INT64_MIN
-# define INT64_MIN              (-__INT64_C(9223372036854775807)-1)
-#endif
-/* Maximum of signed integral types.  */
-# define INT8_MAX               (127)
-# define INT16_MAX              (32767)
-# define INT32_MAX              (2147483647)
-#ifndef INT64_MAX
-# define INT64_MAX              (__INT64_C(9223372036854775807))
-#endif
-
-/* Maximum of unsigned integral types.  */
-#ifndef UINT8_MAX
-# define UINT8_MAX              (255)
-#endif
-#ifndef UINT16_MAX
-# define UINT16_MAX             (65535)
-#endif
-# define UINT32_MAX             (4294967295U)
-#ifndef UINT64_MAX
-# define UINT64_MAX             (__UINT64_C(18446744073709551615))
-#endif
-
-/* Minimum of signed integral types having a minimum size.  */
-# define INT_LEAST8_MIN         INT8_MIN
-# define INT_LEAST16_MIN        INT16_MIN
-# define INT_LEAST32_MIN        INT32_MIN
-# define INT_LEAST64_MIN        INT64_MIN
-/* Maximum of signed integral types having a minimum size.  */
-# define INT_LEAST8_MAX         INT8_MAX
-# define INT_LEAST16_MAX        INT16_MAX
-# define INT_LEAST32_MAX        INT32_MAX
-# define INT_LEAST64_MAX        INT64_MAX
-
-/* Maximum of unsigned integral types having a minimum size.  */
-# define UINT_LEAST8_MAX        UINT8_MAX
-# define UINT_LEAST16_MAX       UINT16_MAX
-# define UINT_LEAST32_MAX       UINT32_MAX
-# define UINT_LEAST64_MAX       UINT64_MAX
-
-  /* shortcircuit*/
-#endif
-  /* once */
-#endif
-#endif
-STDINT_EOF
-fi
-    if cmp -s $ac_stdint_h $ac_stdint 2>/dev/null; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_stdint_h is unchanged" >&5
-$as_echo "$as_me: $ac_stdint_h is unchanged" >&6;}
-    else
-      ac_dir=`$as_dirname -- "$ac_stdint_h" ||
-$as_expr X"$ac_stdint_h" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_stdint_h" : 'X\(//\)[^/]' \| \
-	 X"$ac_stdint_h" : 'X\(//\)$' \| \
-	 X"$ac_stdint_h" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_stdint_h" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      as_dir="$ac_dir"; as_fn_mkdir_p
-      rm -f $ac_stdint_h
-      mv $ac_stdint $ac_stdint_h
-    fi
- ;;
-    "$ax_create_pkgconfig_generate":C)
-pkgconfig_generate="$ax_create_pkgconfig_generate"
-if test ! -f "$pkgconfig_generate.in"
-then generate="true"
-elif grep ' generated by configure ' $pkgconfig_generate.in >/dev/null
-then generate="true"
-else generate="false";
-fi
-if $generate ; then
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $pkgconfig_generate.in" >&5
-$as_echo "$as_me: creating $pkgconfig_generate.in" >&6;}
-cat > $pkgconfig_generate.in <<AXEOF
-# generated by configure / remove this line to disable regeneration
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-bindir=@bindir@
-libdir=@libdir@
-datarootdir=@datarootdir@
-datadir=@datadir@
-sysconfdir=@sysconfdir@
-includedir=@includedir@
-package=@PACKAGE@
-suffix=@suffix@
-
-Name: @PACKAGE_NAME@
-Description: @PACKAGE_DESCRIPTION@
-Version: @PACKAGE_VERSION@
-Requires: @PACKAGE_REQUIRES@
-Libs: -L\${libdir} @LDFLAGS@ @LIBS@
-Cflags: -I\${includedir} @CPPFLAGS@
-AXEOF
-fi # DONE generate $pkgconfig_generate.in
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $pkgconfig_generate" >&5
-$as_echo "$as_me: creating $pkgconfig_generate" >&6;}
-cat >conftest.sed <<AXEOF
-s|@prefix@|${pkgconfig_prefix}|
-s|@exec_prefix@|${pkgconfig_execprefix}|
-s|@bindir@|${pkgconfig_bindir}|
-s|@libdir@|${pkgconfig_libdir}|
-s|@datarootdir@|${pkgconfig_datarootdir}|
-s|@datadir@|${pkgconfig_datadir}|
-s|@sysconfdir@|${pkgconfig_sysconfdir}|
-s|@includedir@|${pkgconfig_includedir}|
-s|@suffix@|${pkgconfig_suffix}|
-s|@PACKAGE@|${pkgconfig_package}|
-s|@PACKAGE_NAME@|${pkgconfig_libname}|
-s|@PACKAGE_DESCRIPTION@|${pkgconfig_description}|
-s|@PACKAGE_VERSION@|${pkgconfig_version}|
-s|@PACKAGE_REQUIRES@|${pkgconfig_requires}|
-s|@LIBS@|${pkgconfig_libs}|
-s|@LDFLAGS@|${pkgconfig_ldflags}|
-s|@CPPFLAGS@|${pkgconfig_cppflags}|
-AXEOF
-sed -f conftest.sed  $pkgconfig_generate.in > $pkgconfig_generate
-if test ! -s $pkgconfig_generate ; then
-    as_fn_error $? "$pkgconfig_generate is empty" "$LINENO" 5
-fi ; rm conftest.sed # DONE generate $pkgconfig_generate
-pkgconfig_uninstalled=`echo $pkgconfig_generate |sed 's/.pc$/-uninstalled.pc/'`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $pkgconfig_uninstalled" >&5
-$as_echo "$as_me: creating $pkgconfig_uninstalled" >&6;}
-cat >conftest.sed <<AXEOF
-s|@prefix@|${pkgconfig_prefix}|
-s|@exec_prefix@|${pkgconfig_execprefix}|
-s|@bindir@|${pkgconfig_bindir}|
-s|@libdir@|${pkgconfig_src_libdir}|
-s|@datarootdir@|${pkgconfig_datarootdir}|
-s|@datadir@|${pkgconfig_datadir}|
-s|@sysconfdir@|${pkgconfig_sysconfdir}|
-s|@includedir@|${pkgconfig_src_headers}|
-s|@suffix@|${pkgconfig_suffix}|
-s|@PACKAGE@|${pkgconfig_package}|
-s|@PACKAGE_NAME@|${pkgconfig_libname}|
-s|@PACKAGE_DESCRIPTION@|${pkgconfig_description}|
-s|@PACKAGE_VERSION@|${pkgconfig_version}|
-s|@PACKAGE_REQUIRES@|${pkgconfig_requires}|
-s|@LIBS@|${pkgconfig_libs}|
-s|@LDFLAGS@|${pkgconfig_ldflags}|
-s|@CPPFLAGS@|${pkgconfig_cppflags}|
-AXEOF
-sed -f conftest.sed $pkgconfig_generate.in > $pkgconfig_uninstalled
-if test ! -s $pkgconfig_uninstalled ; then
-    as_fn_error $? "$pkgconfig_uninstalled is empty" "$LINENO" 5
-fi ; rm conftest.sed # DONE generate $pkgconfig_uninstalled
-           pkgconfig_requires_add=`echo ${pkgconfig_requires}`
-if test ".$pkgconfig_requires_add" != "." ; then
-           pkgconfig_requires_add="pkg-config $pkgconfig_requires_add"
-    else   pkgconfig_requires_add=":" ; fi
-pkgconfig_uninstalled=`echo $pkgconfig_generate |sed 's/.pc$/-uninstalled.sh/'`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $pkgconfig_uninstalled" >&5
-$as_echo "$as_me: creating $pkgconfig_uninstalled" >&6;}
-cat >conftest.sed <<AXEOF
-s|@prefix@|\"${pkgconfig_prefix}\"|
-s|@exec_prefix@|\"${pkgconfig_execprefix}\"|
-s|@bindir@|\"${pkgconfig_bindir}\"|
-s|@libdir@|\"${pkgconfig_src_libdir}\"|
-s|@datarootdir@|\"${pkgconfig_datarootdir}\"|
-s|@datadir@|\"${pkgconfig_datadir}\"|
-s|@sysconfdir@|\"${pkgconfig_sysconfdir}\"|
-s|@includedir@|\"${pkgconfig_src_headers}\"|
-s|@suffix@|\"${pkgconfig_suffix}\"|
-s|@PACKAGE@|\"${pkgconfig_package}\"|
-s|@PACKAGE_NAME@|\"${pkgconfig_libname}\"|
-s|@PACKAGE_DESCRIPTION@|\"${pkgconfig_description}\"|
-s|@PACKAGE_VERSION@|\"${pkgconfig_version}\"|
-s|@PACKAGE_REQUIRES@|\"${pkgconfig_requires}\"|
-s|@LIBS@|\"${pkgconfig_libs}\"|
-s|@LDFLAGS@|\"${pkgconfig_ldflags}\"|
-s|@CPPFLAGS@|\"${pkgconfig_cppflags}\"|
-s>Name:>for option\\; do case \"\$option\" in --list-all|--name) echo >
-s>Description: *>\\;\\; --help) pkg-config --help \\; echo Buildscript Of >
-s>Version: *>\\;\\; --modversion|--version) echo >
-s>Requires:>\\;\\; --requires) echo $pkgconfig_requires_add>
-s>Libs: *>\\;\\; --libs) echo >
-s>Cflags: *>\\;\\; --cflags) echo >
-/--libs)/a\\
-       $pkgconfig_requires_add
-/--cflags)/a\\
-       $pkgconfig_requires_add\\
-;; --variable=*) eval echo '\$'\`echo \$option | sed -e 's/.*=//'\`\\
-;; --uninstalled) exit 0 \\
-;; *) ;; esac done
-AXEOF
-sed -f conftest.sed  $pkgconfig_generate.in > $pkgconfig_uninstalled
-if test ! -s $pkgconfig_uninstalled ; then
-    as_fn_error $? "$pkgconfig_uninstalled is empty" "$LINENO" 5
-fi ; rm conftest.sed # DONE generate $pkgconfig_uninstalled
- ;;
-    "bound_test.sh":F) chmod +x bound_test.sh ;;
-    "pip_test.sh":F) chmod +x pip_test.sh ;;
-
-  esac
-done # for ac_tag
-
-
-as_fn_exit 0
-_ACEOF
-ac_clean_files=$ac_clean_files_save
-
-test $ac_write_fail = 0 ||
-  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
-
-
-			ac_configure_args="$ac_configure_args $isl_configure_args"
-
-
-# configure is writing to config.log, and then calls config.status.
-# config.status does its own redirection, appending to config.log.
-# Unfortunately, on DOS this fails, as config.log is still kept open
-# by configure, so config.status won't be able to write to it; its
-# output is simply discarded.  So we exec the FD to /dev/null,
-# effectively closing config.log, so it can be properly (re)opened and
-# appended to by config.status.  When coming back to configure, we
-# need to make the FD available again.
-if test "$no_create" != yes; then
-  ac_cs_success=:
-  ac_config_status_args=
-  test "$silent" = yes &&
-    ac_config_status_args="$ac_config_status_args --quiet"
-  exec 5>/dev/null
-  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
-  exec 5>>config.log
-  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
-  # would make configure fail if this is the last instruction.
-  $ac_cs_success || as_fn_exit 1
-fi
-if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
-fi
-
diff --git a/cloog-0.17.0/isl/configure.ac b/cloog-0.17.0/isl/configure.ac
deleted file mode 100644
index a41023c..0000000
--- a/cloog-0.17.0/isl/configure.ac
+++ /dev/null
@@ -1,180 +0,0 @@
-AC_INIT([isl], [0.08], [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=8:0:0
-
-AC_PROG_CC
-AC_PROG_CXX
-
-AX_CC_MAXOPT
-AX_GCC_WARN_UNUSED_RESULT
-AX_C___ATTRIBUTE__
-
-AC_PROG_LIBTOOL
-
-AC_CHECK_PROG(PERL, perl, perl, [])
-AC_CHECK_PROG(PDFLATEX, pdflatex, pdflatex, [])
-AC_CHECK_PROG(POD2HTML, pod2html, pod2html, [])
-
-AM_CONDITIONAL(GENERATE_DOC, test -n "$PERL" -a -n "$PDFLATEX" -a -n "$POD2HTML")
-
-AX_CREATE_STDINT_H(include/isl/stdint.h)
-
-AX_SUBMODULE(gmp,system|build,system)
-
-AC_SUBST(GMP_CPPFLAGS)
-AC_SUBST(GMP_LDFLAGS)
-AC_SUBST(GMP_LIBS)
-case "$with_gmp" in
-system)
-	if test "x$with_gmp_prefix" != "x"; then
-		isl_configure_args="$isl_configure_args --with-gmp=$with_gmp_prefix"
-		GMP_CPPFLAGS="-I$with_gmp_prefix/include"
-		GMP_LDFLAGS="-L$with_gmp_prefix/lib"
-	fi
-	GMP_LIBS=-lgmp
-	;;
-build)
-	GMP_CPPFLAGS="-I$gmp_srcdir -I$with_gmp_builddir"
-	GMP_LIBS="$with_gmp_builddir/libgmp.la"
-	;;
-esac
-SAVE_CPPFLAGS="$CPPFLAGS"
-CPPFLAGS="$GMP_CPPFLAGS $CPPFLAGS"
-need_get_memory_functions=false
-AC_CHECK_DECLS(mp_get_memory_functions,[],[
-	need_get_memory_functions=true
-],[#include <gmp.h>])
-CPPFLAGS="$SAVE_CPPFLAGS"
-AM_CONDITIONAL(NEED_GET_MEMORY_FUNCTIONS, test x$need_get_memory_functions = xtrue)
-AC_CHECK_DECLS(ffs,[],[],[#include <strings.h>])
-AC_CHECK_DECLS(__builtin_ffs,[],[],[])
-
-AX_SUBMODULE(piplib,no|system|build,no)
-
-have_piplib=false
-AC_SUBST(PIPLIB_CPPFLAGS)
-AC_SUBST(PIPLIB_LDFLAGS)
-AC_SUBST(PIPLIB_LIBS)
-case "$with_piplib" in
-	build)
-		PIPLIB_CPPFLAGS="-I$piplib_srcdir/include"
-		PIPLIB_LIBS="$with_piplib_builddir/libpiplibMP.la"
-	;;
-	system)
-		PIPLIB_LIBS="-lpiplibMP"
-		if test "x$with_piplib_prefix" != "x"; then
-			PIPLIB_CPPFLAGS="-I$with_piplib_prefix/include"
-			PIPLIB_LDFLAGS="-L$with_piplib_prefix/lib"
-		fi
-		SAVE_CPPFLAGS="$CPPFLAGS"
-		SAVE_LDFLAGS="$LDFLAGS"
-		CPPFLAGS="$PIPLIB_CPPFLAGS $CPPFLAGS"
-		LDFLAGS="$PIPLIB_LDFLAGS $LDFLAGS"
-		AC_CHECK_LIB(piplibMP, pip_solve,[
-			AC_CHECK_MEMBER(PipOptions.Urs_parms, [], [
-				AC_MSG_ERROR([Piplib too old; please install version 1.3.6 or newer])
-			],[#include <piplib/piplibMP.h>])
-		],[
-			AC_MSG_ERROR([Piplib not found])
-		])
-		CPPFLAGS="$SAVE_CPPFLAGS"
-		LDFLAGS="$SAVE_LDFLAGS"
-	;;
-	no)
-	;;
-	*)
-		AC_MSG_ERROR(unsupported)
-	;;
-esac
-if test "$with_piplib" != "no"; then
-	AC_DEFINE(ISL_PIPLIB,,piplib is available)
-	have_piplib=true
-fi
-AM_CONDITIONAL(HAVE_PIPLIB, test x$have_piplib = xtrue)
-
-AC_SUBST(CLANG_CXXFLAGS)
-AC_SUBST(CLANG_LDFLAGS)
-AC_SUBST(CLANG_LIBS)
-AX_SUBMODULE(clang,system|no,no)
-case "$with_clang" in
-system)
-	llvm_config="llvm-config"
-	AC_CHECK_PROG([llvm_config_found], ["$llvm_config"], [yes])
-	if test "x$with_clang_prefix" != "x"; then
-		llvm_config="$with_clang_prefix/bin/llvm-config"
-		if test -x "$llvm_config"; then
-			llvm_config_found=yes
-		fi
-	fi
-	if test "$llvm_config_found" != yes; then
-		AC_MSG_ERROR([llvm-config not found])
-	fi
-	CLANG_CXXFLAGS=`$llvm_config --cxxflags`
-	CLANG_LDFLAGS=`$llvm_config --ldflags`
-	CLANG_LIBS=`$llvm_config --libs`
-	CLANG_PREFIX=`$llvm_config --prefix`
-	AC_DEFINE_UNQUOTED(CLANG_PREFIX, ["$CLANG_PREFIX"],
-				[Clang installation prefix])
-
-	SAVE_CPPFLAGS="$CPPFLAGS"
-	CPPFLAGS="$CLANG_CXXFLAGS $CPPFLAGS"
-	AC_LANG_PUSH(C++)
-	AC_CHECK_HEADER([clang/Basic/SourceLocation.h], [],
-		[AC_ERROR([clang header file not found])])
-	AC_EGREP_HEADER([getDefaultTargetTriple], [llvm/Support/Host.h], [],
-		[AC_DEFINE([getDefaultTargetTriple], [getHostTriple],
-		[Define to getHostTriple for older versions of clang])])
-	AC_EGREP_HEADER([getExpansionLineNumber],
-		[clang/Basic/SourceLocation.h], [],
-		[AC_DEFINE([getExpansionLineNumber],
-			[getInstantiationLineNumber],
-	    [Define to getInstantiationLineNumber for older versions of clang])])
-	AC_EGREP_HEADER([DiagnosticsEngine],
-		[clang/Basic/Diagnostic.h], [],
-		[AC_DEFINE([DiagnosticsEngine],
-			[Diagnostic],
-	    [Define to Diagnostic for older versions of clang])])
-	AC_EGREP_HEADER([ArrayRef], [clang/Driver/Driver.h],
-		[AC_DEFINE([USE_ARRAYREF], [],
-			[Define if Driver::BuildCompilation takes ArrayRef])])
-	AC_EGREP_HEADER([CXXIsProduction], [clang/Driver/Driver.h],
-		[AC_DEFINE([HAVE_CXXISPRODUCTION], [],
-		[Define if Driver constructor takes CXXIsProduction argument])])
-	AC_LANG_POP
-	CPPFLAGS="$SAVE_CPPFLAGS"
-	;;
-esac
-AM_CONDITIONAL(HAVE_CLANG, test $with_clang = system)
-
-AX_SET_WARNING_FLAGS
-
-AC_SUBST(WARNING_FLAGS)
-
-PACKAGE_CFLAGS="$GMP_CPPFLAGS"
-PACKAGE_LDFLAGS="$GMP_LDFLAGS"
-PACKAGE_LIBS="-lisl -lgmp"
-AX_CREATE_PKGCONFIG_INFO
-
-AX_DETECT_GIT_HEAD
-echo '#define GIT_HEAD_ID "'$GIT_HEAD_ID'"' > gitversion.h
-
-AH_BOTTOM([#include <isl_config_post.h>])
-AC_CONFIG_HEADERS(isl_config.h)
-AC_CONFIG_HEADERS(include/isl/config.h)
-AC_CONFIG_FILES(Makefile)
-AC_CONFIG_FILES(doc/Makefile)
-if test $with_clang = system; then
-	AC_CONFIG_FILES(interface/Makefile)
-fi
-AC_CONFIG_FILES([bound_test.sh], [chmod +x bound_test.sh])
-AC_CONFIG_FILES([pip_test.sh], [chmod +x pip_test.sh])
-AC_CONFIG_COMMANDS_POST([
-	dnl pass on arguments to subdir configures, but don't
-	dnl add them to config.status
-	ac_configure_args="$ac_configure_args $isl_configure_args"
-])
-AC_OUTPUT
diff --git a/cloog-0.17.0/isl/depcomp b/cloog-0.17.0/isl/depcomp
deleted file mode 100755
index df8eea7..0000000
--- a/cloog-0.17.0/isl/depcomp
+++ /dev/null
@@ -1,630 +0,0 @@
-#! /bin/sh
-# depcomp - compile a program generating dependencies as side-effects
-
-scriptversion=2009-04-28.21; # UTC
-
-# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
-# Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
-
-case $1 in
-  '')
-     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
-     exit 1;
-     ;;
-  -h | --h*)
-    cat <<\EOF
-Usage: depcomp [--help] [--version] PROGRAM [ARGS]
-
-Run PROGRAMS ARGS to compile a file, generating dependencies
-as side-effects.
-
-Environment variables:
-  depmode     Dependency tracking mode.
-  source      Source file read by `PROGRAMS ARGS'.
-  object      Object file output by `PROGRAMS ARGS'.
-  DEPDIR      directory where to store dependencies.
-  depfile     Dependency file to output.
-  tmpdepfile  Temporary file to use when outputing dependencies.
-  libtool     Whether libtool is used (yes/no).
-
-Report bugs to <bug-automake@gnu.org>.
-EOF
-    exit $?
-    ;;
-  -v | --v*)
-    echo "depcomp $scriptversion"
-    exit $?
-    ;;
-esac
-
-if test -z "$depmode" || test -z "$source" || test -z "$object"; then
-  echo "depcomp: Variables source, object and depmode must be set" 1>&2
-  exit 1
-fi
-
-# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
-depfile=${depfile-`echo "$object" |
-  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
-tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
-
-rm -f "$tmpdepfile"
-
-# Some modes work just like other modes, but use different flags.  We
-# parameterize here, but still list the modes in the big case below,
-# to make depend.m4 easier to write.  Note that we *cannot* use a case
-# here, because this file can only contain one case statement.
-if test "$depmode" = hp; then
-  # HP compiler uses -M and no extra arg.
-  gccflag=-M
-  depmode=gcc
-fi
-
-if test "$depmode" = dashXmstdout; then
-   # This is just like dashmstdout with a different argument.
-   dashmflag=-xM
-   depmode=dashmstdout
-fi
-
-cygpath_u="cygpath -u -f -"
-if test "$depmode" = msvcmsys; then
-   # This is just like msvisualcpp but w/o cygpath translation.
-   # Just convert the backslash-escaped backslashes to single forward
-   # slashes to satisfy depend.m4
-   cygpath_u="sed s,\\\\\\\\,/,g"
-   depmode=msvisualcpp
-fi
-
-case "$depmode" in
-gcc3)
-## gcc 3 implements dependency tracking that does exactly what
-## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
-## it if -MD -MP comes after the -MF stuff.  Hmm.
-## Unfortunately, FreeBSD c89 acceptance of flags depends upon
-## the command line argument order; so add the flags where they
-## appear in depend2.am.  Note that the slowdown incurred here
-## affects only configure: in makefiles, %FASTDEP% shortcuts this.
-  for arg
-  do
-    case $arg in
-    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
-    *)  set fnord "$@" "$arg" ;;
-    esac
-    shift # fnord
-    shift # $arg
-  done
-  "$@"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  mv "$tmpdepfile" "$depfile"
-  ;;
-
-gcc)
-## There are various ways to get dependency output from gcc.  Here's
-## why we pick this rather obscure method:
-## - Don't want to use -MD because we'd like the dependencies to end
-##   up in a subdir.  Having to rename by hand is ugly.
-##   (We might end up doing this anyway to support other compilers.)
-## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
-##   -MM, not -M (despite what the docs say).
-## - Using -M directly means running the compiler twice (even worse
-##   than renaming).
-  if test -z "$gccflag"; then
-    gccflag=-MD,
-  fi
-  "$@" -Wp,"$gccflag$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
-## The second -e expression handles DOS-style file names with drive letters.
-  sed -e 's/^[^:]*: / /' \
-      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the `deleted header file' problem.
-## The problem is that when a header file which appears in a .P file
-## is deleted, the dependency causes make to die (because there is
-## typically no way to rebuild the header).  We avoid this by adding
-## dummy dependencies for each header file.  Too bad gcc doesn't do
-## this for us directly.
-  tr ' ' '
-' < "$tmpdepfile" |
-## Some versions of gcc put a space before the `:'.  On the theory
-## that the space means something, we add a space to the output as
-## well.
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-hp)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-sgi)
-  if test "$libtool" = yes; then
-    "$@" "-Wp,-MDupdate,$tmpdepfile"
-  else
-    "$@" -MDupdate "$tmpdepfile"
-  fi
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-
-  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
-    echo "$object : \\" > "$depfile"
-
-    # Clip off the initial element (the dependent).  Don't try to be
-    # clever and replace this with sed code, as IRIX sed won't handle
-    # lines with more than a fixed number of characters (4096 in
-    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
-    # the IRIX cc adds comments like `#:fec' to the end of the
-    # dependency line.
-    tr ' ' '
-' < "$tmpdepfile" \
-    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
-    tr '
-' ' ' >> "$depfile"
-    echo >> "$depfile"
-
-    # The second pass generates a dummy entry for each header file.
-    tr ' ' '
-' < "$tmpdepfile" \
-   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
-   >> "$depfile"
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile"
-  ;;
-
-aix)
-  # The C for AIX Compiler uses -M and outputs the dependencies
-  # in a .u file.  In older versions, this file always lives in the
-  # current directory.  Also, the AIX compiler puts `$object:' at the
-  # start of each line; $object doesn't have directory information.
-  # Version 6 uses the directory in both cases.
-  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-  test "x$dir" = "x$object" && dir=
-  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-  if test "$libtool" = yes; then
-    tmpdepfile1=$dir$base.u
-    tmpdepfile2=$base.u
-    tmpdepfile3=$dir.libs/$base.u
-    "$@" -Wc,-M
-  else
-    tmpdepfile1=$dir$base.u
-    tmpdepfile2=$dir$base.u
-    tmpdepfile3=$dir$base.u
-    "$@" -M
-  fi
-  stat=$?
-
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
-    exit $stat
-  fi
-
-  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
-  do
-    test -f "$tmpdepfile" && break
-  done
-  if test -f "$tmpdepfile"; then
-    # Each line is of the form `foo.o: dependent.h'.
-    # Do two passes, one to just change these to
-    # `$object: dependent.h' and one to simply `dependent.h:'.
-    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-    # That's a tab and a space in the [].
-    sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile"
-  ;;
-
-icc)
-  # Intel's C compiler understands `-MD -MF file'.  However on
-  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
-  # ICC 7.0 will fill foo.d with something like
-  #    foo.o: sub/foo.c
-  #    foo.o: sub/foo.h
-  # which is wrong.  We want:
-  #    sub/foo.o: sub/foo.c
-  #    sub/foo.o: sub/foo.h
-  #    sub/foo.c:
-  #    sub/foo.h:
-  # ICC 7.1 will output
-  #    foo.o: sub/foo.c sub/foo.h
-  # and will wrap long lines using \ :
-  #    foo.o: sub/foo.c ... \
-  #     sub/foo.h ... \
-  #     ...
-
-  "$@" -MD -MF "$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  # Each line is of the form `foo.o: dependent.h',
-  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
-  # Do two passes, one to just change these to
-  # `$object: dependent.h' and one to simply `dependent.h:'.
-  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
-  # Some versions of the HPUX 10.20 sed can't process this invocation
-  # correctly.  Breaking it into two sed invocations is a workaround.
-  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
-    sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-hp2)
-  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
-  # compilers, which have integrated preprocessors.  The correct option
-  # to use with these is +Maked; it writes dependencies to a file named
-  # 'foo.d', which lands next to the object file, wherever that
-  # happens to be.
-  # Much of this is similar to the tru64 case; see comments there.
-  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-  test "x$dir" = "x$object" && dir=
-  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-  if test "$libtool" = yes; then
-    tmpdepfile1=$dir$base.d
-    tmpdepfile2=$dir.libs/$base.d
-    "$@" -Wc,+Maked
-  else
-    tmpdepfile1=$dir$base.d
-    tmpdepfile2=$dir$base.d
-    "$@" +Maked
-  fi
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-     rm -f "$tmpdepfile1" "$tmpdepfile2"
-     exit $stat
-  fi
-
-  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
-  do
-    test -f "$tmpdepfile" && break
-  done
-  if test -f "$tmpdepfile"; then
-    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
-    # Add `dependent.h:' lines.
-    sed -ne '2,${
-	       s/^ *//
-	       s/ \\*$//
-	       s/$/:/
-	       p
-	     }' "$tmpdepfile" >> "$depfile"
-  else
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile" "$tmpdepfile2"
-  ;;
-
-tru64)
-   # The Tru64 compiler uses -MD to generate dependencies as a side
-   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
-   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
-   # dependencies in `foo.d' instead, so we check for that too.
-   # Subdirectories are respected.
-   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-   test "x$dir" = "x$object" && dir=
-   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-
-   if test "$libtool" = yes; then
-      # With Tru64 cc, shared objects can also be used to make a
-      # static library.  This mechanism is used in libtool 1.4 series to
-      # handle both shared and static libraries in a single compilation.
-      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
-      #
-      # With libtool 1.5 this exception was removed, and libtool now
-      # generates 2 separate objects for the 2 libraries.  These two
-      # compilations output dependencies in $dir.libs/$base.o.d and
-      # in $dir$base.o.d.  We have to check for both files, because
-      # one of the two compilations can be disabled.  We should prefer
-      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
-      # automatically cleaned when .libs/ is deleted, while ignoring
-      # the former would cause a distcleancheck panic.
-      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
-      tmpdepfile2=$dir$base.o.d          # libtool 1.5
-      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
-      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
-      "$@" -Wc,-MD
-   else
-      tmpdepfile1=$dir$base.o.d
-      tmpdepfile2=$dir$base.d
-      tmpdepfile3=$dir$base.d
-      tmpdepfile4=$dir$base.d
-      "$@" -MD
-   fi
-
-   stat=$?
-   if test $stat -eq 0; then :
-   else
-      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-      exit $stat
-   fi
-
-   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-   do
-     test -f "$tmpdepfile" && break
-   done
-   if test -f "$tmpdepfile"; then
-      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-      # That's a tab and a space in the [].
-      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-   else
-      echo "#dummy" > "$depfile"
-   fi
-   rm -f "$tmpdepfile"
-   ;;
-
-#nosideeffect)
-  # This comment above is used by automake to tell side-effect
-  # dependency tracking mechanisms from slower ones.
-
-dashmstdout)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout, regardless of -o.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove `-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  test -z "$dashmflag" && dashmflag=-M
-  # Require at least two characters before searching for `:'
-  # in the target name.  This is to cope with DOS-style filenames:
-  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
-  "$@" $dashmflag |
-    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
-  rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  tr ' ' '
-' < "$tmpdepfile" | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-dashXmstdout)
-  # This case only exists to satisfy depend.m4.  It is never actually
-  # run, as this mode is specially recognized in the preamble.
-  exit 1
-  ;;
-
-makedepend)
-  "$@" || exit $?
-  # Remove any Libtool call
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-  # X makedepend
-  shift
-  cleared=no eat=no
-  for arg
-  do
-    case $cleared in
-    no)
-      set ""; shift
-      cleared=yes ;;
-    esac
-    if test $eat = yes; then
-      eat=no
-      continue
-    fi
-    case "$arg" in
-    -D*|-I*)
-      set fnord "$@" "$arg"; shift ;;
-    # Strip any option that makedepend may not understand.  Remove
-    # the object too, otherwise makedepend will parse it as a source file.
-    -arch)
-      eat=yes ;;
-    -*|$object)
-      ;;
-    *)
-      set fnord "$@" "$arg"; shift ;;
-    esac
-  done
-  obj_suffix=`echo "$object" | sed 's/^.*\././'`
-  touch "$tmpdepfile"
-  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
-  rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  sed '1,2d' "$tmpdepfile" | tr ' ' '
-' | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile" "$tmpdepfile".bak
-  ;;
-
-cpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove `-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  "$@" -E |
-    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
-       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
-    sed '$ s: \\$::' > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  cat < "$tmpdepfile" >> "$depfile"
-  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-msvisualcpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  IFS=" "
-  for arg
-  do
-    case "$arg" in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
-	set fnord "$@"
-	shift
-	shift
-	;;
-    *)
-	set fnord "$@" "$arg"
-	shift
-	shift
-	;;
-    esac
-  done
-  "$@" -E 2>/dev/null |
-  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
-  echo "	" >> "$depfile"
-  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-msvcmsys)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-none)
-  exec "$@"
-  ;;
-
-*)
-  echo "Unknown depmode $depmode" 1>&2
-  exit 1
-  ;;
-esac
-
-exit 0
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/cloog-0.17.0/isl/doc/Makefile.am b/cloog-0.17.0/isl/doc/Makefile.am
deleted file mode 100644
index aa79a6c..0000000
--- a/cloog-0.17.0/isl/doc/Makefile.am
+++ /dev/null
@@ -1,17 +0,0 @@
-if GENERATE_DOC
-export TEXINPUTS := $(srcdir):$(TEXINPUTS)
-export BIBINPUTS := $(srcdir):$(BIBINPUTS)
-export BSTINPUTS := $(srcdir):$(BSTINPUTS)
-
-user.tex: user.pod
-	$(PERL) $(srcdir)/mypod2latex $< $@
-manual.pdf: manual.tex user.tex $(srcdir)/implementation.tex
-	(cd ..; echo "@GIT_HEAD_VERSION@") > version.tex
-	$(PDFLATEX) $<
-	bibtex manual
-	$(PDFLATEX) $<
-	$(PDFLATEX) $<
-user.html: user.pod
-	(cd ..; echo "@GIT_HEAD_VERSION@") > version
-	$(POD2HTML) --infile=$< --outfile=$@ --title="Integer Set Library: Manual [version `cat version`]"
-endif
diff --git a/cloog-0.17.0/isl/doc/Makefile.in b/cloog-0.17.0/isl/doc/Makefile.in
deleted file mode 100644
index ca5f881..0000000
--- a/cloog-0.17.0/isl/doc/Makefile.in
+++ /dev/null
@@ -1,410 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = doc
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_c___attribute__.m4 \
-	$(top_srcdir)/m4/ax_cc_maxopt.m4 \
-	$(top_srcdir)/m4/ax_check_compiler_flags.m4 \
-	$(top_srcdir)/m4/ax_compiler_vendor.m4 \
-	$(top_srcdir)/m4/ax_create_pkgconfig_info.m4 \
-	$(top_srcdir)/m4/ax_create_stdint_h.m4 \
-	$(top_srcdir)/m4/ax_detect_git_head.m4 \
-	$(top_srcdir)/m4/ax_gcc_archflag.m4 \
-	$(top_srcdir)/m4/ax_gcc_warn_unused_result.m4 \
-	$(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \
-	$(top_srcdir)/m4/ax_set_warning_flags.m4 \
-	$(top_srcdir)/m4/ax_submodule.m4 $(top_srcdir)/m4/libtool.m4 \
-	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/isl_config.h \
-	$(top_builddir)/include/isl/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
-SOURCES =
-DIST_SOURCES =
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CLANG_CXXFLAGS = @CLANG_CXXFLAGS@
-CLANG_LDFLAGS = @CLANG_LDFLAGS@
-CLANG_LIBS = @CLANG_LIBS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GIT_HEAD = @GIT_HEAD@
-GIT_HEAD_ID = @GIT_HEAD_ID@
-GIT_HEAD_VERSION = @GIT_HEAD_VERSION@
-GMP_CPPFLAGS = @GMP_CPPFLAGS@
-GMP_LDFLAGS = @GMP_LDFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PDFLATEX = @PDFLATEX@
-PERL = @PERL@
-PIPLIB_CPPFLAGS = @PIPLIB_CPPFLAGS@
-PIPLIB_LDFLAGS = @PIPLIB_LDFLAGS@
-PIPLIB_LIBS = @PIPLIB_LIBS@
-POD2HTML = @POD2HTML@
-PRTDIAG = @PRTDIAG@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-WARNING_FLAGS = @WARNING_FLAGS@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-llvm_config_found = @llvm_config_found@
-localedir = @localedir@
-localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-pkgconfig_libdir = @pkgconfig_libdir@
-pkgconfig_libfile = @pkgconfig_libfile@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-versioninfo = @versioninfo@
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign doc/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-	distclean distclean-generic distclean-libtool distdir dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-man install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am
-
-@GENERATE_DOC_TRUE@export TEXINPUTS := $(srcdir):$(TEXINPUTS)
-@GENERATE_DOC_TRUE@export BIBINPUTS := $(srcdir):$(BIBINPUTS)
-@GENERATE_DOC_TRUE@export BSTINPUTS := $(srcdir):$(BSTINPUTS)
-
-@GENERATE_DOC_TRUE@user.tex: user.pod
-@GENERATE_DOC_TRUE@	$(PERL) $(srcdir)/mypod2latex $< $@
-@GENERATE_DOC_TRUE@manual.pdf: manual.tex user.tex $(srcdir)/implementation.tex
-@GENERATE_DOC_TRUE@	(cd ..; echo "@GIT_HEAD_VERSION@") > version.tex
-@GENERATE_DOC_TRUE@	$(PDFLATEX) $<
-@GENERATE_DOC_TRUE@	bibtex manual
-@GENERATE_DOC_TRUE@	$(PDFLATEX) $<
-@GENERATE_DOC_TRUE@	$(PDFLATEX) $<
-@GENERATE_DOC_TRUE@user.html: user.pod
-@GENERATE_DOC_TRUE@	(cd ..; echo "@GIT_HEAD_VERSION@") > version
-@GENERATE_DOC_TRUE@	$(POD2HTML) --infile=$< --outfile=$@ --title="Integer Set Library: Manual [version `cat version`]"
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/cloog-0.17.0/isl/doc/chicago.bst b/cloog-0.17.0/isl/doc/chicago.bst
deleted file mode 100644
index ba05833..0000000
--- a/cloog-0.17.0/isl/doc/chicago.bst
+++ /dev/null
@@ -1,1726 +0,0 @@
-%%% ====================================================================
-%%%  @BibTeX-style-file{
-%%%     author          = "Glenn Paulley",
-%%%     version         = "4",
-%%%     date            = "28 August 1992",
-%%%     time            = "10:23:39 199",
-%%%     filename        = "chicago.bst",
-%%%     address         = "Data Structuring Group
-%%%                        Department of Computer Science
-%%%                        University of Waterloo
-%%%                        Waterloo, Ontario, Canada
-%%%                        N2L 3G1",
-%%%     telephone       = "(519) 885-1211",
-%%%     FAX             = "(519) 885-1208",
-%%%     checksum        = "26323 1654 5143 37417",
-%%%     email           = "gnpaulle@bluebox.uwaterloo.ca",
-%%%     codetable       = "ISO/ASCII",
-%%%     keywords        = "",
-%%%     supported       = "yes",
-%%%     abstract        = "A BibTeX bibliography style that follows the
-%%%                        `B' reference style of the 13th Edition of
-%%%                        the Chicago Manual of Style. A detailed
-%%%                        feature list is given below.",
-%%%     docstring       = "The checksum field above contains a CRC-16
-%%%                        checksum as the first value, followed by the
-%%%                        equivalent of the standard UNIX wc (word
-%%%                        count) utility output of lines, words, and
-%%%                        characters.  This is produced by Robert
-%%%                        Solovay's checksum utility.",
-%%%  }
-%%% ====================================================================
-%
-% "Chicago" BibTeX style, chicago.bst
-% ===================================
-%
-% BibTeX `chicago' style file for BibTeX version 0.99c, LaTeX version 2.09
-% Place it in a file called chicago.bst in the BibTeX search path.
-% You need to include chicago.sty as a \documentstyle option.
-% (Placing it in the same directory as the LaTeX document should also work.)
-% This "chicago" style is based on newapa.bst (American Psych. Assoc.)
-% found at ymir.claremont.edu.
-%
-%   Citation format: (author-last-name year)
-%             (author-last-name and author-last-name year)
-%             (author-last-name, author-last-name, and author-last-name year)
-%             (author-last-name et al. year)
-%             (author-last-name)
-%             author-last-name (year)
-%             (author-last-name and author-last-name)
-%             (author-last-name et al.)
-%             (year) or (year,year)
-%             year or year,year
-%
-%   Reference list ordering: alphabetical by author or whatever passes
-%    for author in the absence of one.
-%
-% This BibTeX style has support for abbreviated author lists and for
-%    year-only citations.  This is done by having the citations
-%    actually look like
-%
-%    \citeauthoryear{full-author-info}{abbrev-author-info}{year}
-%
-% The LaTeX style has to have the following (or similar)
-%
-%     \let\@internalcite\cite
-%     \def\fullcite{\def\citeauthoryear##1##2##3{##1, ##3}\@internalcite}
-%     \def\fullciteA{\def\citeauthoryear##1##2##3{##1}\@internalcite}
-%     \def\shortcite{\def\citeauthoryear##1##2##3{##2, ##3}\@internalcite}
-%     \def\shortciteA{\def\citeauthoryear##1##2##3{##2}\@internalcite}
-%     \def\citeyear{\def\citeauthoryear##1##2##3{##3}\@internalcite}
-%
-% These TeX macro definitions are found in chicago.sty. Additional
-% commands to manipulate different components of a citation can be defined
-% so that, for example, you can list author's names without parentheses
-% if using a citation as a noun or object in a sentence.
-%
-% This file was originally copied from newapa.bst at ymir.claremont.edu.
-%
-% Features of chicago.bst:
-% =======================
-%
-% - full names used in citations, but abbreviated citations are available
-%   (see above)
-% - if an entry has a "month", then the month and year are also printed
-%   as part of that bibitem.
-% - all conjunctions use "and" instead of "\&"
-% - major modification from Chicago Manual of Style (13th ed.) is that
-%   only the first author in a reference appears last name first-
-%   additional authors appear as J. Q. Public.
-% - pages are listed as "pp. xx-xx" in all entry types except
-%   article entries.
-% - book, inbook, and manual use "location: publisher" (or organization)
-%   for address and publisher. All other types list publishers separately.
-% - "pp." are used to identify page numbers for all entry types except
-%   articles.
-% - organization is used as a citation label if neither author nor editor
-%   is present (for manuals).
-% - "et al." is used for long author and editor lists, or when "others"
-%   is used.
-%
-% Modifications and bug fixes from newapa.bst:
-% ===========================================
-%
-%   - added month, year to bib entries if month is present
-%   - fixed bug with In proceedings, added necessary comma after title
-%   - all conjunctions changed to "and" from "\&"
-%   - fixed bug with author labels in my.full.label: "et al." now is
-%        generated when "others" is an author name
-%   - major modification from Chicago Manual of Style (13th ed.) is that
-%     only the first author in a reference appears last name first-
-%     additional authors appear as J. Q. Public.
-%   - pages are listed as "pp. xx-xx" in all entry types except
-%     article entries. Unnecessary (IMHO) "()" around page numbers
-%     were removed, and page numbers now don't end with a period.
-%   - created chicago.sty for use with this bibstyle (required).
-%   - fixed bugs in FUNCTION {format.vol.num.pages} for missing volume,
-%     number, and /or pages. Renamed to format.jour.vol.
-%   - fixed bug in formatting booktitles: additional period an error if
-%     book has a volume.
-%   - fixed bug: editors usually given redundant period before next clause
-%     (format.editors.dot) removed.
-%   - added label support for organizations, if both author and editor
-%     are missing (from alpha.bst). If organization is too long, then
-%     the key field is used for abbreviated citations.
-%   - In proceedings or books of several volumes, no comma was written
-%     between the "Volume x" and the page numbers (this was intentional
-%     in newapa.bst). Fixed.
-%   - Some journals may not have volumes/numbers, only month/year (eg.
-%     IEEE Computer). Fixed bug in article style that assumed volume/number
-%     was always present.
-%
-% Original documentation for newapa.sty:
-% =====================================
-%
-% This version was made by modifying the master file made by
-% Oren Patashnik (PATASHNIK@SCORE.STANFORD.EDU), and the 'named' BibTeX
-% style of Peter F. Patel-Schneider.
-%
-% Copyright (C) 1985, all rights reserved.
-% Copying of this file is authorized only if either
-% (1) you make absolutely no changes to your copy, including name, or
-% (2) if you do make changes, you name it something other than 'newapa.bst'.
-% There are undoubtably bugs in this style.  If you make bug fixes,
-% improvements, etc.  please let me know.  My e-mail address is:
-%    spencer@cgrg.ohio.state.edu or 71160.3141@compuserve.com
-%
-% This style was made from 'plain.bst', 'named.bst', and 'apalike.bst',
-% with lots of tweaking to make it look like APA style, along with tips
-% from Young Ryu and Brian Reiser's modifications of 'apalike.bst'.
-
-ENTRY
-  { address
-    author
-    booktitle
-    chapter
-    edition
-    editor
-    fjournal
-    howpublished
-    institution
-    journal
-    key
-    month
-    note
-    number
-    organization
-    pages
-    publisher
-    school
-    series
-    title
-    type
-    volume
-    year
-  }
-  {}
-  { label.year extra.label sort.year sort.label }
-
-INTEGERS { output.state before.all mid.sentence after.sentence after.block }
-
-FUNCTION {init.state.consts}
-{ #0 'before.all :=
-  #1 'mid.sentence :=
-  #2 'after.sentence :=
-  #3 'after.block :=
-}
-
-STRINGS { s t u }
-
-FUNCTION {output.nonnull}
-{ 's :=
-  output.state mid.sentence =
-    { ", " * write$ }
-    { output.state after.block =
-    { add.period$ write$
-      newline$
-      "\newblock " write$
-    }
-    { output.state before.all =
-        'write$
-        { add.period$ " " * write$ }
-      if$
-    }
-      if$
-      mid.sentence 'output.state :=
-    }
-  if$
-  s
-}
-
-% Use a colon to separate output. Used only for address/publisher
-% combination in book/inbook types, address/institution for manuals,
-% and organization:publisher for proceedings (inproceedings).
-%
-FUNCTION {output.nonnull.colon}
-{ 's :=
-  output.state mid.sentence =
-    { ": " * write$ }
-    { output.state after.block =
-    { add.period$ write$
-      newline$
-      "\newblock " write$
-    }
-    { output.state before.all =
-        'write$
-        { add.period$ " " * write$ }
-      if$
-    }
-      if$
-      mid.sentence 'output.state :=
-    }
-  if$
-  s
-}
-
-FUNCTION {output}
-{ duplicate$ empty$
-    'pop$
-    'output.nonnull
-  if$
-}
-
-FUNCTION {output.colon}
-{ duplicate$ empty$
-    'pop$
-    'output.nonnull.colon
-  if$
-}
-
-FUNCTION {output.check}
-{ 't :=
-  duplicate$ empty$
-    { pop$ "empty " t * " in " * cite$ * warning$ }
-    'output.nonnull
-  if$
-}
-
-FUNCTION {output.check.colon}
-{ 't :=
-  duplicate$ empty$
-    { pop$ "empty " t * " in " * cite$ * warning$ }
-    'output.nonnull.colon
-  if$
-}
-
-FUNCTION {output.year.check}
-{ year empty$
-     { "empty year in " cite$ * warning$ }
-     { write$
-        " (" year * extra.label *
-       month empty$
-          { ")" * }
-          { ", " * month * ")" * }
-       if$
-       mid.sentence 'output.state :=
-     }
-  if$
-}
-
-
-FUNCTION {fin.entry}
-{ add.period$
-  write$
-  newline$
-}
-
-FUNCTION {new.block}
-{ output.state before.all =
-    'skip$
-    { after.block 'output.state := }
-  if$
-}
-
-FUNCTION {new.sentence}
-{ output.state after.block =
-    'skip$
-    { output.state before.all =
-    'skip$
-    { after.sentence 'output.state := }
-      if$
-    }
-  if$
-}
-
-FUNCTION {not}
-{   { #0 }
-    { #1 }
-  if$
-}
-
-FUNCTION {and}
-{   'skip$
-    { pop$ #0 }
-  if$
-}
-
-FUNCTION {or}
-{   { pop$ #1 }
-    'skip$
-  if$
-}
-
-FUNCTION {new.block.checka}
-{ empty$
-    'skip$
-    'new.block
-  if$
-}
-
-FUNCTION {new.block.checkb}
-{ empty$
-  swap$ empty$
-  and
-    'skip$
-    'new.block
-  if$
-}
-
-FUNCTION {new.sentence.checka}
-{ empty$
-    'skip$
-    'new.sentence
-  if$
-}
-
-FUNCTION {new.sentence.checkb}
-{ empty$
-  swap$ empty$
-  and
-    'skip$
-    'new.sentence
-  if$
-}
-
-FUNCTION {field.or.null}
-{ duplicate$ empty$
-    { pop$ "" }
-    'skip$
-  if$
-}
-
-%
-% Emphasize the top string on the stack.
-%
-FUNCTION {emphasize}
-{ duplicate$ empty$
-    { pop$ "" }
-    { "{\em " swap$ * "}" * }
-  if$
-}
-
-%
-% Emphasize the top string on the stack, but add a trailing space.
-%
-FUNCTION {emphasize.space}
-{ duplicate$ empty$
-    { pop$ "" }
-    { "{\em " swap$ * "\/}" * }
-  if$
-}
-
-INTEGERS { nameptr namesleft numnames }
-%
-% Format bibliographical entries with the first author last name first,
-% and subsequent authors with initials followed by last name.
-% All names are formatted in this routine.
-%
-FUNCTION {format.names}
-{ 's :=
-  #1 'nameptr :=               % nameptr = 1;
-  s num.names$ 'numnames :=    % numnames = num.name$(s);
-  numnames 'namesleft :=
-    { namesleft #0 > }
-
-    { nameptr #1 =
-        {s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := }
-        {s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't := }
-      if$
-      nameptr #1 >
-        { namesleft #1 >
-              { ", " * t * }
-              { numnames #2 >
-                  { "," * }
-                  'skip$
-                if$
-                t "others" =
-                    { " et~al." * }
-                    { " and " * t * } % from Chicago Manual of Style
-                  if$
-               }
-               if$
-             }
-            't
-        if$
-        s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := 
-	"\protect \index {" * t * "|hyperemph}" *
-        nameptr #1 + 'nameptr :=          % nameptr += 1;
-        namesleft #1 - 'namesleft :=      % namesleft =- 1;
-    }
-  while$
-}
-
-FUNCTION {my.full.label}
-{ 's :=
-  #1 'nameptr :=               % nameptr = 1;
-  s num.names$ 'numnames :=    % numnames = num.name$(s);
-  numnames 'namesleft :=
-    { namesleft #0 > }
-
-    { s nameptr "{vv~}{ll}" format.name$ 't :=  % get the next name
-      nameptr #1 >
-        { namesleft #1 >
-              { ", " * t * }
-              { numnames #2 >
-                  { "," * }
-                  'skip$
-                if$
-                t "others" =
-                    { " et~al." * }
-                    { " and " * t * } % from Chicago Manual of Style
-                  if$
-               }
-               if$
-             }
-            't
-        if$
-        s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := 
-	"\protect \index {" * t * "|bold}" *
-        nameptr #1 + 'nameptr :=          % nameptr += 1;
-        namesleft #1 - 'namesleft :=      % namesleft =- 1;
-    }
-  while$
-
-}
-
-FUNCTION {format.names.fml}
-%
-% Format names in "familiar" format, with first initial followed by
-% last name. Like format.names, ALL names are formatted.
-%
-{ 's :=
-  #1 'nameptr :=               % nameptr = 1;
-  s num.names$ 'numnames :=    % numnames = num.name$(s);
-  numnames 'namesleft :=
-    { namesleft #0 > }
-
-    { s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't :=
-
-      nameptr #1 >
-        { namesleft #1 >
-              { ", " * t * }
-               { numnames #2 >
-                    { "," * }
-                    'skip$
-                  if$
-                  t "others" =
-                        { " et~al." * }
-                        { " and " * t * }
-%                       { " \& " * t * }
-                      if$
-                }
-               if$
-             }
-            't
-        if$
-        nameptr #1 + 'nameptr :=          % nameptr += 1;
-        namesleft #1 - 'namesleft :=      % namesleft =- 1;
-    }
-  while$
-}
-
-FUNCTION {format.authors}
-{ author empty$
-    { "" }
-    { author format.names }
-  if$
-}
-
-FUNCTION {format.key}
-{ empty$
-    { key field.or.null }
-    { "" }
-  if$
-}
-
-%
-% Format editor names for use in the "in" types: inbook, incollection,
-% inproceedings: first initial, then last names. When editors are the
-% LABEL for an entry, then format.editor is used which lists editors
-% by last name first.
-%
-FUNCTION {format.editors.fml}
-{ editor empty$
-    { "" }
-    { editor format.names.fml
-      editor num.names$ #1 >
-    { " (Eds.)" * }
-    { " (Ed.)" * }
-      if$
-    }
-  if$
-}
-
-%
-% Format editor names for use in labels, last names first.
-%
-FUNCTION {format.editors}
-{ editor empty$
-    { "" }
-    { editor format.names
-      editor num.names$ #1 >
-    { " (Eds.)" * }
-    { " (Ed.)" * }
-      if$
-    }
-  if$
-}
-
-FUNCTION {format.title}
-{ title empty$
-    { "" }
-    { title "t" change.case$ }
-  if$
-}
-
-% Note that the APA style requres case changes
-% in article titles. The following does not
-% change cases. If you perfer it, uncomment the
-% following and comment out the above.
-
-%FUNCTION {format.title}
-%{ title empty$
-%    { "" }
-%    { title }
-%  if$
-%}
-
-FUNCTION {n.dashify}
-{ 't :=
-  ""
-    { t empty$ not }
-    { t #1 #1 substring$ "-" =
-    { t #1 #2 substring$ "--" = not
-        { "--" *
-          t #2 global.max$ substring$ 't :=
-        }
-        {   { t #1 #1 substring$ "-" = }
-        { "-" *
-          t #2 global.max$ substring$ 't :=
-        }
-          while$
-        }
-      if$
-    }
-    { t #1 #1 substring$ *
-      t #2 global.max$ substring$ 't :=
-    }
-      if$
-    }
-  while$
-}
-
-FUNCTION {format.btitle}
-{ edition empty$
-  { title emphasize }
-  { title empty$
-    { title emphasize }
-    { volume empty$     % gnp - check for volume, then don't need period
-       { "{\em " title * "\/} (" * edition * " ed.)" * "." * }
-       { "{\em " title * "\/} (" * edition * " ed.)" * }
-      if$
-    }
-    if$
-  }
-  if$
-}
-
-FUNCTION {format.emphasize.booktitle}
-{ edition empty$
-  { booktitle emphasize }
-  { booktitle empty$
-    { booktitle emphasize }
-    { volume empty$    % gnp - extra period an error if book has a volume
-        { "{\em " booktitle * "\/} (" * edition * " ed.)" * "." *}
-        { "{\em " booktitle * "\/} (" * edition * " ed.)" * }
-      if$
-      }
-    if$
-    }
-  if$
-  }
-
-
-FUNCTION {tie.or.space.connect}
-{ duplicate$ text.length$ #3 <
-    { "~" }
-    { " " }
-  if$
-  swap$ * *
-}
-
-FUNCTION {either.or.check}
-{ empty$
-    'pop$
-    { "can't use both " swap$ * " fields in " * cite$ * warning$ }
-  if$
-}
-
-FUNCTION {format.bvolume}
-{ volume empty$
-    { "" }
-    { "Volume" volume tie.or.space.connect % gnp - changed to mixed case
-      series empty$
-        'skip$
-        { " of " * series emphasize * }
-      if$
-      "volume and number" number either.or.check
-    }
-  if$
-}
-
-FUNCTION {format.number.series}
-{ volume empty$
-    { number empty$
-    { series field.or.null }
-    { output.state mid.sentence =
-        { "Number" } % gnp - changed to mixed case always
-        { "Number" }
-      if$
-      number tie.or.space.connect
-      series empty$
-        { "there's a number but no series in " cite$ * warning$ }
-        { " in " * series * }
-      if$
-    }
-      if$
-    }
-    { "" }
-  if$
-}
-
-INTEGERS { multiresult }
-
-FUNCTION {multi.page.check}
-{ 't :=
-  #0 'multiresult :=
-    { multiresult not
-      t empty$ not
-      and
-    }
-    { t #1 #1 substring$
-      duplicate$ "-" =
-      swap$ duplicate$ "," =
-      swap$ "+" =
-      or or
-    { #1 'multiresult := }
-    { t #2 global.max$ substring$ 't := }
-      if$
-    }
-  while$
-  multiresult
-}
-
-FUNCTION {format.pages}
-{ pages empty$
-  { "" }
-  { pages multi.page.check
-	{ "pp.\ " pages n.dashify tie.or.space.connect } % gnp - removed ()
-	{ "pp.\ " pages tie.or.space.connect }
-    if$
-  }
-  if$
-}
-
-% By Young (and Spencer)
-% GNP - fixed bugs with missing volume, number, and/or pages
-%
-% Format journal, volume, number, pages for article types.
-%
-FUNCTION {format.jour.vol}
-{ fjournal empty$
-    { journal empty$
-	{ "no journal in " cite$ * warning$
-	  "" }
-	{ journal emphasize.space }
-	if$
-    } 
-    { fjournal emphasize.space }
-    if$
-  number empty$
-    { volume empty$
-       { "no number and no volume in " cite$ * warning$
-         "" * }
-       { "~{\em " * Volume * "}" * }
-      if$
-    }
-    { volume empty$
-      {"no volume for " cite$ * warning$
-       "~(" * number * ")" * }
-      { "~" *
-        volume emphasize.space
-        "(" * number * ")" * * }
-      if$
-    }
-  if$
-  pages empty$
-    {"page numbers missing in " cite$ * warning$
-     "" * } % gnp - place a null string on the stack for output
-    { duplicate$ empty$
-      { pop$ format.pages }
-      { ", " *  pages n.dashify * } % gnp - removed pp. for articles
-      if$
-    }
-  if$
-}
-
-FUNCTION {format.chapter.pages}
-{ chapter empty$
-    'format.pages
-    { type empty$
-        { "Chapter" } % gnp - changed to mixed case
-        { type "t" change.case$ }
-      if$
-      chapter tie.or.space.connect
-      pages empty$
-        {"page numbers missing in " cite$ * warning$} % gnp - added check
-        { ", " * format.pages * }
-      if$
-    }
-  if$
-}
-
-FUNCTION {format.in.ed.booktitle}
-{ booktitle empty$
-  { "" }
-  { editor empty$
-    { "In " format.emphasize.booktitle * }
-    { "In " format.editors.fml * ", " * format.emphasize.booktitle * }
-    if$
-  }
-  if$
-}
-
-FUNCTION {format.thesis.type}
-{ type empty$
-    'skip$
-    { pop$
-      type "t" change.case$
-    }
-  if$
-}
-
-FUNCTION {format.tr.number}
-{ type empty$
-    { "Technical Report" }
-    'type
-  if$
-  number empty$
-    { "t" change.case$ }
-    { number tie.or.space.connect }
-  if$
-}
-
-FUNCTION {format.article.crossref}
-{ "See"
-  "\citeN{" * crossref * "}" *
-}
-
-FUNCTION {format.crossref.editor}
-{ editor #1 "{vv~}{ll}" format.name$
-  editor num.names$ duplicate$
-  #2 >
-    { pop$ " et~al." * }
-    { #2 <
-    'skip$
-    { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
-        { " et~al." * }
-        { " and " * editor #2 "{vv~}{ll}" format.name$ * }
-      if$
-    }
-      if$
-    }
-  if$
-}
-
-FUNCTION {format.book.crossref}
-{ volume empty$
-    { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
-      "In "
-    }
-    { "Volume" volume tie.or.space.connect % gnp - changed to mixed case
-      " of " *
-    }
-  if$
-  editor empty$
-  editor field.or.null author field.or.null =
-  or
-    { key empty$
-    { series empty$
-        { "need editor, key, or series for " cite$ * " to crossref " *
-          crossref * warning$
-          "" *
-        }
-        { "{\em " * series * "\/}" * }
-      if$
-    }
-    { key * }
-      if$
-    }
-    { format.crossref.editor * }
-  if$
-  " \citeN{" * crossref * "}" *
-}
-
-FUNCTION {format.incoll.inproc.crossref}
-{ "See"
-  " \citeN{" * crossref * "}" *
-}
-
-% format.lab.names:
-%
-% determines "short" names for the abbreviated author information.
-% "Long" labels are created in calc.label, using the routine my.full.label
-% to format author and editor fields.
-%
-% There are 4 cases for labels.   (n=3 in the example)
-% a) one author             Foo
-% b) one to n               Foo, Bar and Baz
-% c) use of "and others"    Foo, Bar et al.
-% d) more than n            Foo et al.
-%
-FUNCTION {format.lab.names}
-{ 's :=
-  s num.names$ 'numnames :=
-  numnames #2 >    % change number to number of others allowed before
-		   % forcing "et al".
-    { s #1 "{vv~}{ll}" format.name$ 
-      "\protect \index {" * 
-      s #1 "{vv~}{ll}{, jj}{, f.}" format.name$ *
-      "}" *
-	"\protect\chicagoetal/" * }
-    {
-      numnames #1 - 'namesleft :=
-      #2 'nameptr :=
-      s #1 "{vv~}{ll}" format.name$
-      "\protect \index {" * 
-      s #1 "{vv~}{ll}{, jj}{, f.}" format.name$ *
-      "}" *
-	{ namesleft #0 > }
-	{ nameptr numnames =
-	    { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" =
-		{ "\protect\chicagoetal/" * }
-		{ "\protect\chicagoand/" * s nameptr "{vv~}{ll}" format.name$ * 
-		  "\protect \index {" * 
-		  s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ *
-		  "}" *
-                }
-	      if$
-	    }
-	    { ", " * s nameptr "{vv~}{ll}" format.name$ * }
-	  if$
-	  nameptr #1 + 'nameptr :=
-	  namesleft #1 - 'namesleft :=
-	}
-      while$
-    }
-  if$
-}
-
-FUNCTION {author.key.label}
-{ author empty$
-    { key empty$
-          { "no key, author in " cite$ * warning$
-            cite$ #1 #3 substring$ }
-         'key
-      if$
-    }
-    { author format.lab.names }
-  if$
-}
-
-FUNCTION {editor.key.label}
-{ editor empty$
-    { key empty$
-          { "no key, editor in " cite$ * warning$
-            cite$ #1 #3 substring$ }
-          'key
-        if$
-     }
-     { editor format.lab.names }
-  if$
-}
-
-FUNCTION {author.key.organization.label}
-%
-% added - gnp. Provide label formatting by organization if author is null.
-%
-{ author empty$
-    { organization empty$
-	{ key empty$
-	    { "no key, author or organization in " cite$ * warning$
-              cite$ #1 #3 substring$ }
-	    'key
-	  if$
-	}
-        { organization }
-      if$
-    }
-    { author format.lab.names }
-  if$
-}
-
-FUNCTION {editor.key.organization.label}
-%
-% added - gnp. Provide label formatting by organization if editor is null.
-%
-{ editor empty$
-    { organization empty$
-	{ key empty$
-	    { "no key, editor or organization in " cite$ * warning$
-              cite$ #1 #3 substring$ }
-	    'key
-	  if$
-	}
-        { organization }
-      if$
-    }
-    { editor format.lab.names }
-  if$
-}
-
-FUNCTION {author.editor.key.label}
-{ author empty$
-    { editor empty$
-          { key empty$
-               { "no key, author, or editor in " cite$ * warning$
-                 cite$ #1 #3 substring$ }
-             'key
-           if$
-         }
-          { editor format.lab.names }
-      if$
-    }
-    { author format.lab.names }
-  if$
-}
-
-FUNCTION {calc.label.orig}
-%
-% Changed - GNP. See also author.organization.sort, editor.organization.sort
-% Form label for BibTeX entry. The classification of which fields are used
-% for which type of entry (book, inbook, etc.) are taken from alpha.bst.
-% The change here from newapa is to also include organization as a
-% citation label if author or editor is missing.
-%
-{ type$ "book" =
-  type$ "inbook" =
-  or
-    'author.editor.key.label
-    { type$ "proceedings" =
-	'editor.key.organization.label
-	{ type$ "manual" =
-	    'author.key.organization.label
-	    'author.key.label
-	  if$
-	}
-      if$
-    }
-  if$
-
-  author empty$  % generate the full label citation information.
-    { editor empty$
-        { organization empty$
-           { "no author, editor, or organization in " cite$ * warning$
-             "??" }
-           { organization }
-           if$
-        }
-        { editor my.full.label }
-        if$
-    }
-    { author.key.label }
-  if$
-
-% leave label on the stack, to be popped when required.
-
-  "}{" * swap$ *
-%  year field.or.null purify$ #-1 #4 substring$ *
-%
-% save the year for sort processing afterwards (adding a, b, c, etc.)
-%
-  year field.or.null purify$ #-1 #4 substring$
-  'label.year :=
-}
-
-FUNCTION {calc.label}
-%
-% Changed - GNP. See also author.organization.sort, editor.organization.sort
-% Form label for BibTeX entry. The classification of which fields are used
-% for which type of entry (book, inbook, etc.) are taken from alpha.bst.
-% The change here from newapa is to also include organization as a
-% citation label if author or editor is missing.
-%
-{ type$ "book" =
-  type$ "inbook" =
-  or
-    'author.editor.key.label
-    { type$ "proceedings" =
-	'editor.key.organization.label
-	{ type$ "manual" =
-	    'author.key.organization.label
-	    'author.key.label
-	  if$
-	}
-      if$
-    }
-  if$
-
-  author empty$  % generate the full label citation information.
-    { editor empty$
-        { organization empty$
-           { "no author, editor, or organization in " cite$ * warning$
-             "??" }
-           { organization }
-           if$
-        }
-        { editor my.full.label }
-        if$
-    }
-    { author my.full.label }
-  if$
-
-% leave label on the stack, to be popped when required.
-
-  "}{" * swap$ * "}{" * title * "}{" *
-%  year field.or.null purify$ #-1 #4 substring$ *
-%
-% save the year for sort processing afterwards (adding a, b, c, etc.)
-%
-  year field.or.null purify$ #-1 #4 substring$
-  'label.year :=
-}
-
-FUNCTION {output.bibitem}
-{ newline$
-
-  "\bibitem[\protect\citeauthortitleyear{" write$
-  calc.label write$
-  sort.year write$
-  "}]{" write$
-
-  cite$ write$
-  "}" write$
-  newline$
-  ""
-  before.all 'output.state :=
-}
-
-FUNCTION {article}
-{ output.bibitem
-  format.authors
-  "author" output.check
-  author format.key output          % added
-  output.year.check                 % added
-  new.block
-  format.title
-  "title" output.check
-  new.block
-  crossref missing$
-    { format.jour.vol output
-    }
-    { format.article.crossref output.nonnull
-      format.pages output
-    }
-  if$
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {book}
-{ output.bibitem
-  author empty$
-    { format.editors
-	  "author and editor" output.check }
-    { format.authors
-	  output.nonnull
-      crossref missing$
-    	{ "author and editor" editor either.or.check }
-    	'skip$
-      if$
-    }
-  if$
-  output.year.check       % added
-  new.block
-  format.btitle
-  "title" output.check
-  crossref missing$
-    { format.bvolume output
-      new.block
-      format.number.series output
-      new.sentence
-      address output
-      publisher "publisher" output.check.colon
-    }
-    { new.block
-      format.book.crossref output.nonnull
-    }
-  if$
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {booklet}
-{ output.bibitem
-  format.authors output
-  author format.key output          % added
-  output.year.check                 % added
-  new.block
-  format.title
-  "title" output.check
-  new.block
-  howpublished output
-  address output
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {inbook}
-{ output.bibitem
-  author empty$
-    { format.editors
-      "author and editor" output.check
-    }
-    { format.authors output.nonnull
-      crossref missing$
-    { "author and editor" editor either.or.check }
-    'skip$
-      if$
-    }
-  if$
-  output.year.check                 % added
-  new.block
-  format.btitle
-  "title" output.check
-  crossref missing$
-    { format.bvolume output
-      format.chapter.pages
-      "chapter and pages" output.check
-      new.block
-      format.number.series output
-      new.sentence
-      address output
-      publisher
-      "publisher" output.check.colon
-    }
-    { format.chapter.pages "chapter and pages" output.check
-      new.block
-      format.book.crossref output.nonnull
-    }
-  if$
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {incollection}
-{ output.bibitem
-  format.authors
-  "author" output.check
-  author format.key output       % added
-  output.year.check              % added
-  new.block
-  format.title
-  "title" output.check
-  new.block
-  crossref missing$
-  { format.in.ed.booktitle
-    "booktitle" output.check
-    format.bvolume output
-    format.number.series output
-    format.chapter.pages output % gnp - was special.output.nonnull
-%                                 left out comma before page numbers
-    new.sentence
-    address output
-    publisher "publisher" output.check.colon
-  }
-  { format.incoll.inproc.crossref
-	output.nonnull
-    format.chapter.pages output
-  }
-  if$
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {inproceedings}
-{ output.bibitem
-  format.authors
-  "author" output.check
-  author format.key output            % added
-  output.year.check                   % added
-  new.block
-  format.title
-  "title" output.check
-  new.block
-  crossref missing$
-    { format.in.ed.booktitle
-	  "booktitle" output.check
-      format.bvolume output
-      format.number.series output
-      address output
-      format.pages output
-      new.sentence
-      organization output
-      publisher output.colon
-      }
-    { format.incoll.inproc.crossref output.nonnull
-      format.pages output
-    }
-  if$
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {conference} { inproceedings }
-
-FUNCTION {manual}
-{ output.bibitem
-  author empty$
-    { editor empty$
-      { organization "organization" output.check
-        organization format.key output }  % if all else fails, use key
-      { format.editors "author and editor" output.check }
-      if$
-    }
-    { format.authors output.nonnull }
-    if$
-  output.year.check                 % added
-  new.block
-  format.btitle
-  "title" output.check
-  organization address new.block.checkb
-% Reversed the order of "address" and "organization", added the ":".
-  address output
-  organization "organization" output.check.colon
-%  address output
-%  ":" output
-%  organization output
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {mastersthesis}
-{ output.bibitem
-  format.authors
-  "author" output.check
-  author format.key output          % added
-  output.year.check                 % added
-  new.block
-  format.title
-  "title" output.check
-  new.block
-  "Master's thesis" format.thesis.type output.nonnull
-  school "school" output.check
-  address output
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {misc}
-{ output.bibitem
-  format.authors output
-  author format.key output            % added
-  output.year.check                   % added
-  title howpublished new.block.checkb
-  format.title output
-  new.block
-  howpublished output
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {phdthesis}
-{ output.bibitem
-  format.authors
-  "author" output.check
-  author format.key output            % added
-  output.year.check                   % added
-  new.block
-  format.btitle
-  "title" output.check
-  new.block
-  "Ph.\ D. thesis" format.thesis.type output.nonnull
-  school "school" output.check
-  address output
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {proceedings}
-{ output.bibitem
-  editor empty$
-    { organization output
-      organization format.key output }  % gnp - changed from author format.key
-    { format.editors output.nonnull }
-  if$
-% author format.key output             % gnp - removed (should be either
-%                                        editor or organization
-  output.year.check                    % added (newapa)
-  new.block
-  format.btitle
-  "title" output.check
-  format.bvolume output
-  format.number.series output
-  address output
-  new.sentence
-  organization output
-  publisher output.colon
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {techreport}
-{ output.bibitem
-  format.authors
-  "author" output.check
-  author format.key output             % added
-  output.year.check                    % added
-  new.block
-  format.title
-  "title" output.check
-  new.block
-  format.tr.number output.nonnull
-  institution
-  "institution" output.check
-  address output
-  new.block
-  note output
-  fin.entry
-}
-
-FUNCTION {unpublished}
-{ output.bibitem
-  format.authors
-  "author" output.check
-  author format.key output              % added
-  output.year.check                      % added
-  new.block
-  format.title
-  "title" output.check
-  new.block
-  note "note" output.check
-  fin.entry
-}
-
-FUNCTION {default.type} { misc }
-
-MACRO {jan} {"January"}
-
-MACRO {feb} {"February"}
-
-MACRO {mar} {"March"}
-
-MACRO {apr} {"April"}
-
-MACRO {may} {"May"}
-
-MACRO {jun} {"June"}
-
-MACRO {jul} {"July"}
-
-MACRO {aug} {"August"}
-
-MACRO {sep} {"September"}
-
-MACRO {oct} {"October"}
-
-MACRO {nov} {"November"}
-
-MACRO {dec} {"December"}
-
-MACRO {acmcs} {"ACM Computing Surveys"}
-
-MACRO {acta} {"Acta Informatica"}
-
-MACRO {ai} {"Artificial Intelligence"}
-
-MACRO {cacm} {"Communications of the ACM"}
-
-MACRO {ibmjrd} {"IBM Journal of Research and Development"}
-
-MACRO {ibmsj} {"IBM Systems Journal"}
-
-MACRO {ieeese} {"IEEE Transactions on Software Engineering"}
-
-MACRO {ieeetc} {"IEEE Transactions on Computers"}
-
-MACRO {ieeetcad}
- {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"}
-
-MACRO {ipl} {"Information Processing Letters"}
-
-MACRO {jacm} {"Journal of the ACM"}
-
-MACRO {jcss} {"Journal of Computer and System Sciences"}
-
-MACRO {scp} {"Science of Computer Programming"}
-
-MACRO {sicomp} {"SIAM Journal on Computing"}
-
-MACRO {tocs} {"ACM Transactions on Computer Systems"}
-
-MACRO {tods} {"ACM Transactions on Database Systems"}
-
-MACRO {tog} {"ACM Transactions on Graphics"}
-
-MACRO {toms} {"ACM Transactions on Mathematical Software"}
-
-MACRO {toois} {"ACM Transactions on Office Information Systems"}
-
-MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"}
-
-MACRO {tcs} {"Theoretical Computer Science"}
-
-READ
-
-FUNCTION {sortify}
-{ purify$
-  "l" change.case$
-}
-
-INTEGERS { len }
-
-FUNCTION {chop.word}
-{ 's :=
-  'len :=
-  s #1 len substring$ =
-    { s len #1 + global.max$ substring$ }
-    's
-  if$
-}
-
-
-
-FUNCTION {sort.format.names}
-{ 's :=
-  #1 'nameptr :=
-  ""
-  s num.names$ 'numnames :=
-  numnames 'namesleft :=
-    { namesleft #0 > }
-    { nameptr #2 =
-	{ year field.or.null purify$ #-1 #4 substring$ * }
-	'skip$
-      if$
-      nameptr #1 >
-          { "   " * }
-         'skip$
-      if$
-      s nameptr "{vv{ } }{ll{ }}{  f{ }}{  jj{ }}" format.name$ 't :=
-      nameptr numnames = t "others" = and
-          { " et~al" * }
-          { t sortify * }
-      if$
-      nameptr #1 + 'nameptr :=
-      namesleft #1 - 'namesleft :=
-    }
-  while$
-}
-
-FUNCTION {sort.format.title}
-{ 't :=
-  "A " #2
-    "An " #3
-      "The " #4 t chop.word
-    chop.word
-  chop.word
-  sortify
-  #1 global.max$ substring$
-}
-
-FUNCTION {author.sort}
-{ author empty$
-    { key empty$
-         { "to sort, need author or key in " cite$ * warning$
-           "" }
-         { key sortify }
-      if$
-    }
-    { author sort.format.names }
-  if$
-}
-
-FUNCTION {editor.sort}
-{ editor empty$
-    { key empty$
-         { "to sort, need editor or key in " cite$ * warning$
-           ""
-         }
-         { key sortify }
-      if$
-    }
-    { editor sort.format.names }
-  if$
-}
-
-FUNCTION {author.editor.sort}
-{ author empty$
-    { "missing author in " cite$ * warning$
-      editor empty$
-         { key empty$
-             { "to sort, need author, editor, or key in " cite$ * warning$
-               ""
-             }
-             { key sortify }
-           if$
-         }
-         { editor sort.format.names }
-      if$
-    }
-    { author sort.format.names }
-  if$
-}
-
-FUNCTION {author.organization.sort}
-%
-% added - GNP. Stack author or organization for sorting (from alpha.bst).
-% Unlike alpha.bst, we need entire names, not abbreviations
-%
-{ author empty$
-    { organization empty$
-	{ key empty$
-	    { "to sort, need author, organization, or key in " cite$ * warning$
-	      ""
-	    }
-	    { key sortify }
-	  if$
-	}
-	{ organization sortify }
-      if$
-    }
-    { author sort.format.names }
-  if$
-}
-
-FUNCTION {editor.organization.sort}
-%
-% added - GNP. Stack editor or organization for sorting (from alpha.bst).
-% Unlike alpha.bst, we need entire names, not abbreviations
-%
-{ editor empty$
-    { organization empty$
-	{ key empty$
-	    { "to sort, need editor, organization, or key in " cite$ * warning$
-	      ""
-	    }
-	    { key sortify }
-	  if$
-	}
-	{ organization sortify }
-      if$
-    }
-    { editor sort.format.names }
-  if$
-}
-
-FUNCTION {presort}
-%
-% Presort creates the bibentry's label via a call to calc.label, and then
-% sorts the entries based on entry type. Chicago.bst adds support for
-% including organizations as the sort key; the following is stolen from
-% alpha.bst.
-%
-{ %calc.label sortify % recalculate bibitem label
-  %year field.or.null purify$ #-1 #4 substring$ * % add year
-  %duplicate$ warning$
-  %"    "
-  %*
-  type$ "book" =
-  type$ "inbook" =
-  or
-    'author.editor.sort
-    { type$ "proceedings" =
-	'editor.organization.sort
-	{ type$ "manual" =
-	    'author.organization.sort
-	    'author.sort
-	  if$
-	}
-      if$
-    }
-  if$
-  #1 entry.max$ substring$        % added for newapa
-  'sort.label :=                  % added for newapa
-  sort.label                      % added for newapa
-  %*
-  "    "
-  *
-  title field.or.null
-  sort.format.title
-  *
-  #1 entry.max$ substring$
-  'sort.key$ :=
-}
-
-ITERATE {presort}
-
-SORT             % by label, year, author/editor, title
-
-STRINGS { last.label next.extra }
-
-INTEGERS { last.extra.num }
-
-FUNCTION {initialize.extra.label.stuff}
-{ #0 int.to.chr$ 'last.label :=
-  "" 'next.extra :=
-  #0 'last.extra.num :=
-}
-
-FUNCTION {forward.pass}
-%
-% Pass through all entries, comparing current entry to last one.
-% Need to concatenate year to the stack (done by calc.label) to determine
-% if two entries are the same (see presort)
-%
-{ last.label
-  calc.label.orig year field.or.null purify$ #-1 #4 substring$ * % add year
-  #1 entry.max$ substring$ =     % are they equal?
-     { last.extra.num #1 + 'last.extra.num :=
-       last.extra.num int.to.chr$ 'extra.label :=
-     }
-     { "a" chr.to.int$ 'last.extra.num :=
-       "" 'extra.label :=
-       calc.label.orig year field.or.null purify$ #-1 #4 substring$ * % add year
-       #1 entry.max$ substring$ 'last.label := % assign to last.label
-     }
-  if$
-}
-
-FUNCTION {reverse.pass}
-{ next.extra "b" =
-    { "a" 'extra.label := }
-     'skip$
-  if$
-  label.year extra.label * 'sort.year :=
-  extra.label 'next.extra :=
-}
-
-EXECUTE {initialize.extra.label.stuff}
-
-ITERATE {forward.pass}
-
-REVERSE {reverse.pass}
-
-FUNCTION {bib.sort.order}
-{ sort.label
-  "    "
-  *
-  year field.or.null sortify
-  *
-  "    "
-  *
-  title field.or.null
-  sort.format.title
-  *
-  #1 entry.max$ substring$
-  'sort.key$ :=
-}
-
-ITERATE {bib.sort.order}
-
-SORT             % by sort.label, year, title --- giving final bib. order.
-
-FUNCTION {begin.bib}
-
-{ preamble$ empty$
-    'skip$
-    { preamble$ write$ newline$ }
-  if$
-  "\begin{thebibliography}{}" write$ newline$
-}
-
-
-EXECUTE {begin.bib}
-
-EXECUTE {init.state.consts}
-
-ITERATE {call.type$}
-
-FUNCTION {end.bib}
-{ newline$
-  "\end{thebibliography}" write$ newline$
-}
-
-EXECUTE {end.bib}
-
diff --git a/cloog-0.17.0/isl/doc/chicago.sty b/cloog-0.17.0/isl/doc/chicago.sty
deleted file mode 100644
index 33588db..0000000
--- a/cloog-0.17.0/isl/doc/chicago.sty
+++ /dev/null
@@ -1,320 +0,0 @@
-% -*- LaTeX -*-
-%%% ====================================================================
-%%%  @LaTeX-style-file{
-%%%     author          = "Glenn Paulley",
-%%%     version         = "4",
-%%%     date            = "31 August 1992",
-%%%     time            = "09:42:44 199",
-%%%     filename        = "chicago.sty",
-%%%     address         = "Data Structuring Group
-%%%                        Department of Computer Science
-%%%                        University of Waterloo
-%%%                        Waterloo, Ontario, Canada
-%%%                        N2L 3G1",
-%%%     telephone       = "(519) 885-1211",
-%%%     FAX             = "(519) 885-1208",
-%%%     checksum        = "44674 264 1050 10394",
-%%%     email           = "gnpaulle@bluebox.uwaterloo.ca",
-%%%     codetable       = "ISO/ASCII",
-%%%     keywords        = "",
-%%%     supported       = "yes",
-%%%     abstract        = "Contains the LaTeX style command definitions
-%%%                        for the Chicago BibTeX styles chicago.bst and
-%%%                        chicagoa.bst. For details, see below.",
-%%%     docstring       = "The checksum field above contains a CRC-16
-%%%                        checksum as the first value, followed by the
-%%%                        equivalent of the standard UNIX wc (word
-%%%                        count) utility output of lines, words, and
-%%%                        characters.  This is produced by Robert
-%%%                        Solovay's checksum utility.",
-%%%  }
-%%% ====================================================================
-%
-% chicago.sty: Style file for use with bibtex style chicago.bst, for
-% bibliographies formatted according to the 13th Edition of the Chicago
-% Manual of Style.
-%
-% 'newapa.bst' was made from 'plain.bst', 'named.bst', and 'apalike.bst',
-% with lots of tweaking to make it look like APA style, along with tips
-% from Young Ryu and Brian Reiser's modifications of 'apalike.bst'.
-% newapa.sty formed the basis of this style, chicago.sty. Author-date
-% references in newapa.bst formed the basis for chicago.bst. Chicagoa.bst
-% supports annotations.
-%
-% Version 4 (August, 1992):
-% - fixed chicago.bst and chicagoa.bst to handle long author lists in
-%   sorting
-% - fixed chicago.bst and chicagoa.bst so that missing page numbers in
-%   ``article'' entries are handled correctly
-% - modified chicago.sty to format entries with 2nd and subsequent lines
-%   indented.
-%
-%   Citation format: (author-last-name year)
-%             (author-last-name and author-last-name year)
-%             (author-last-name et al. year)
-%             (author-last-name)
-%             author-last-name
-%             author-last-name (year)
-%             (author-last-name and author-last-name)
-%             (author-last-name et al.)
-%             (year) or (year,year)
-%             year or year,year
-%
-%   Reference list ordering: alphabetical by author or whatever passes
-%    for author in the absence of one.
-%
-% This BibTeX style has support for abbreviated author lists and for
-%    year-only citations.  This is done by having the citations
-%    actually look like
-%
-%    \citeauthoryear{full-author-info}{abbrev-author-info}{year}
-%
-% The LaTeX style has to have the following (or similar)
-%
-%     \let\@internalcite\cite
-%     \def\fullcite{\def\citeauthoryear##1##2##3{##1, ##3}\@internalcite}
-%     \def\fullciteA{\def\citeauthoryear##1##2##3{##1}\@internalcite}
-%     \def\shortcite{\def\citeauthoryear##1##2##3{##2, ##3}\@internalcite}
-%     \def\shortciteA{\def\citeauthoryear##1##2##3{##2}\@internalcite}
-%     \def\citeyear{\def\citeauthoryear##1##2##3{##3}\@internalcite}
-%
-% -------------------------------------------------------------------------
-% This file implements citations for the ``chicago'' bibliography style.
-%  Place it in a file called chicago.sty in the TeX search path.
-%(Placing it in the same directory as the LaTeX document should also work.)
-%
-%    This file is a modification of the ``newapa'' LaTeX style,
-%    originally adapted by Steven Spencer from the ``apalike'' LaTeX style.
-%    It was originally modified by Stephen N. Spencer, with further
-%    modifications by Young U. Ryu.
-%
-% The ``chicago'' BibTeX bibliography style creates citations with labels:
-%       \citeauthoryear{author-info}{abbrev. author-info}{year}
-%
-% These labels are processed by the following LaTeX commands:
-%
-%  \cite{key}
-%    which produces citations with full author list and year.
-%    eg. (Brown 1978; Jarke, Turner, Stohl, et al. 1985)
-%  \citeNP{key}
-%    which produces citations with full author list and year, but without
-%    enclosing parentheses:
-%    eg. Brown 1978; Jarke, Turner and Stohl 1985
-%  \citeA{key}
-%    which produces citations with only the full author list.
-%    eg. (Brown; Jarke, Turner and Stohl)
-%  \citeANP{key}
-%    which produces citations with only the full author list, without
-%    parentheses eg. Brown; Jarke, Turner and Stohl
-%  \citeN{key}
-%    which produces citations with the full author list and year, but
-%    can be used as nouns in a sentence; no parentheses appear around
-%    the author names, but only around the year.
-%      eg. Shneiderman (1978) states that......
-%    \citeN should only be used for a single citation.
-%  \shortcite{key}
-%    which produces citations with abbreviated author list and year.
-%  \shortciteNP{key}
-%    which produces citations with abbreviated author list and year.
-%  \shortciteA{key}
-%    which produces only the abbreviated author list.
-%  \shortciteANP{key}
-%    which produces only the abbreviated author list.
-%  \shortciteN{key}
-%    which produces the abbreviated author list and year, with only the
-%    year in parentheses. Use with only one citation.
-%  \citeyear{key}
-%    which produces the year information only, within parentheses.
-%  \citeyearNP{key}
-%    which produces the year information only.
-%
-% Abbreviated author lists use the ``et al.'' construct.
-%
-% `NP' means `no parentheses'.
-%
-% This LaTeX style file must be used with the ``chicago'' or ``chicagoa''
-% (annotated chicago style) BibTeX styles.
-%
-\typeout{Using Chicago Manual of Style bibliography: 31 August 1992}
-%
-% -------------------------------------------------------------------------
-%
-% Citation macros.
-%
-\def\chicagoand/{ and }
-\def\chicagoetal/{ et~al.}
-%
-\let\@internalcite\cite
-%
-\def\cite{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{(##1\if@tempswa , ##2\fi)}%
-    \def\citeauthortitleyear##1##2##3##4{##1\ ##4}\@internalcite}
-\def\citeNP{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{##1\if@tempswa , ##2\fi}%
-    \def\citeauthortitleyear##1##2##3##4{##1\ ##4}\@internalcite}
-\def\citetitleN{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{##1\if@tempswa , ##2)\else{)}\fi}%
-    \def\citeauthortitleyear##1##2##3##4{##3\ (##1; ##4}\@citedata}
-\def\citeN{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{##1\if@tempswa , ##2)\else{)}\fi}%
-    \def\citeauthortitleyear##1##2##3##4{##1\ (##4}\@citedata}
-\def\citeA{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{(##1\if@tempswa , ##2\fi)}%
-    \def\citeauthortitleyear##1##2##3##4{##1}\@internalcite}
-\def\citeANP{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{##1\if@tempswa , ##2\fi}%
-    \def\citeauthortitleyear##1##2##3##4{##1}\@internalcite}
-%
-\def\shortcite{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{(##1\if@tempswa , ##2\fi)}%
-    \def\citeauthortitleyear##1##2##3##4{##2\ ##4}\@internalcite}
-\def\shortciteNP{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{##1\if@tempswa , ##2\fi}%
-    \def\citeauthortitleyear##1##2##3##4{##2\ ##4}\@internalcite}
-\def\shortciteN{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{##1\if@tempswa , ##2)\else{)}\fi}%
-    \def\citeauthortitleyear##1##2##3##4{##2\ (##4}\@citedata}
-\def\shortciteA{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{(##1\if@tempswa , ##2\fi)}%
-    \def\citeauthortitleyear##1##2##3##4{##2}\@internalcite}
-\def\shortciteANP{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{##1\if@tempswa , ##2\fi}%
-    \def\citeauthortitleyear##1##2##3##4{##2}\@internalcite}
-%
-\def\citeyear{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{(##1\if@tempswa , ##2\fi)}%
-    \def\citeauthortitleyear##1##2##3##4{##4}\@citedata}
-\def\citeyearNP{\def\@citeseppen{-1000}%
-    \def\@cite##1##2{##1\if@tempswa , ##2\fi}%
-    \def\citeauthortitleyear##1##2##3##4{##4}\@citedata}
-
-%
-% \@citedata and \@citedatax:
-%
-% Place commas in-between citations in the same \citeyear, \citeyearNP,
-% \citeN, or \shortciteN command.
-% Use something like \citeN{ref1,ref2,ref3} and \citeN{ref4} for a list.
-%
-\def\@citedata{%
-	\@ifnextchar [{\@tempswatrue\@citedatax}%
-				  {\@tempswafalse\@citedatax[]}%
-}
-
-\def\@citedatax[#1]#2{%
-\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi%
-  \def\@citea{}\@cite{\@for\@citeb:=#2\do%
-    {\@citea\def\@citea{), }\@ifundefined% by Young
-       {b@\@citeb}{{\bf ?}%
-       \@warning{Citation `\@citeb' on page \thepage \space undefined}}%
-{\csname b@\@citeb\endcsname}}}{#1}}%
-
-\@ifpackageloaded{hyperref}{%
-  \let\BRorg@citedatax\@citedatax 
-  \def\@citedatax[#1]#2{%
-    \BRorg@citedatax[#1]{#2}%
-    \Hy@backout{#2}%
-  }%
-}{}
-\@ifpackageloaded{hyperref}{%
-\def\hyperemph#1{{\em\hyperpage{#1}}}%
-\def\bold#1{{\bf\hyperpage{#1}}}%
-}{%
-\def\hyperemph#1{{\em #1}}%
-\def\bold#1{{\bf #1}}%
-}
-
-\def\BR@@lbibitem[#1]#2#3\par{%
-  \BRorg@bibitem[#1]{#2}#3\hfill\penalty100\hbox{}
-  \newblock
-  \backref\hfill[{\csname br@#2\endcsname}%
-  ]\parskip=-10pt\penalty-10000\hbox{}\nobreak\par
-}%
-\def\BR@@bibitem#1#2\par{%
-  \BRorg@bibitem{#1}#2
-  \newblock
-  \backref\penalty-100\hbox{}\nobreak\hfill[\hbox{\csname br@#2\endcsname}%
-  ]\par
-}
-\def\thepageorcolor{\thepage}
-\def\Hy@backout#1{%
-  \@bsphack
-  \ifx\@empty\@currentlabel
-    \protected@write\@auxout{}{%
-      \string\@writefile{brf}{%
-        \string\backcite{#1}{{\thepageorcolor}{(document)}{Doc-Start}}%
-      }%
-    }%
-  \else
-   \protected@write\@auxout{}{%
-     \string\@writefile{brf}{%
-       \string\backcite{#1}{{\thepageorcolor}{\@currentlabel}{\@currentHref}}%
-     }%
-   }%
-  \fi
-  \@esphack
-}
-
-% don't box citations, separate with ; and a space
-% also, make the penalty between citations negative: a good place to break.
-%
-\def\@citex[#1]#2{%
-\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi%
-  \def\@citea{}\@cite{\@for\@citeb:=#2\do%
-    {\@citea\def\@citea{; }\@ifundefined% by Young
-       {b@\@citeb}{{\bf ?}%
-       \@warning{Citation `\@citeb' on page \thepage \space undefined}}%
-{\csname b@\@citeb\endcsname}}}{#1}}%
-
-% (from apalike.sty)
-% No labels in the bibliography.
-%
-\def\@biblabel#1{}
-
-% (from apalike.sty)
-% Set length of hanging indentation for bibliography entries.
-%
-\newlength{\bibhang}
-\setlength{\bibhang}{2em}
-
-% Indent second and subsequent lines of bibliographic entries. Stolen
-% from openbib.sty: \newblock is set to {}.
-
-\newdimen\bibindent
-\bibindent=1.5em
-\@ifundefined{refname}%
-   {\@ifundefined{chapter}%
-     {\newcommand{\refname}{References}}%
-     {\newcommand{\refname}{Bibliography}}%
-   }%
-   {}%
-\@ifundefined{chapter}%
- {\def\thebibliography#1{\section*{\refname\@mkboth
-   {\uppercase{\refname}}{\uppercase{\refname}}}
-   \addcontentsline{toc}{section}{References}
-   \list
-   {[\arabic{enumi}]}{\settowidth\labelwidth{[#1]}
-   \leftmargin\labelwidth
-   \advance\leftmargin\labelsep
-   \advance\leftmargin\bibindent
-   \itemindent -\bibindent
-   \listparindent \itemindent
-   \parsep \z@
-   \usecounter{enumi}}
-   \def\newblock{}
-   \sloppy
-   \sfcode`\.=1000\relax}}
- {\def\thebibliography#1{\chapter*{\refname\@mkboth
-   {\refname}{\refname}}
-   \addcontentsline{toc}{chapter}{References}
-   \list
-   {[\arabic{enumi}]}{\settowidth\labelwidth{[#1]}
-   \leftmargin\labelwidth
-   \advance\leftmargin\labelsep
-   \advance\leftmargin\bibindent
-   \itemindent -\bibindent
-   \listparindent \itemindent
-   \parsep \z@
-   \usecounter{enumi}}
-   \def\newblock{}
-   \sloppy
-   \sfcode`\.=1000\relax}}
diff --git a/cloog-0.17.0/isl/doc/implementation.tex b/cloog-0.17.0/isl/doc/implementation.tex
deleted file mode 100644
index d5ece80..0000000
--- a/cloog-0.17.0/isl/doc/implementation.tex
+++ /dev/null
@@ -1,2036 +0,0 @@
-\section{Sets and Relations}
-
-\begin{definition}[Polyhedral Set]
-A {\em polyhedral set}\index{polyhedral set} $S$ is a finite union of basic sets
-$S = \bigcup_i S_i$, each of which can be represented using affine
-constraints
-$$
-S_i : \Z^n \to 2^{\Z^d} : \vec s \mapsto
-S_i(\vec s) =
-\{\, \vec x \in \Z^d \mid \exists \vec z \in \Z^e :
-A \vec x + B \vec s + D \vec z + \vec c \geq \vec 0 \,\}
-,
-$$
-with $A \in \Z^{m \times d}$,
-$B \in \Z^{m \times n}$,
-$D \in \Z^{m \times e}$
-and $\vec c \in \Z^m$.
-\end{definition}
-
-\begin{definition}[Parameter Domain of a Set]
-Let $S \in \Z^n \to 2^{\Z^d}$ be a set.
-The {\em parameter domain} of $S$ is the set
-$$\pdom S \coloneqq \{\, \vec s \in \Z^n \mid S(\vec s) \ne \emptyset \,\}.$$
-\end{definition}
-
-\begin{definition}[Polyhedral Relation]
-A {\em polyhedral relation}\index{polyhedral relation}
-$R$ is a finite union of basic relations
-$R = \bigcup_i R_i$ of type
-$\Z^n \to 2^{\Z^{d_1+d_2}}$,
-each of which can be represented using affine
-constraints
-$$
-R_i = \vec s \mapsto
-R_i(\vec s) =
-\{\, \vec x_1 \to \vec x_2 \in \Z^{d_1} \times \Z^{d_2}
-\mid \exists \vec z \in \Z^e :
-A_1 \vec x_1 + A_2 \vec x_2 + B \vec s + D \vec z + \vec c \geq \vec 0 \,\}
-,
-$$
-with $A_i \in \Z^{m \times d_i}$,
-$B \in \Z^{m \times n}$,
-$D \in \Z^{m \times e}$
-and $\vec c \in \Z^m$.
-\end{definition}
-
-\begin{definition}[Parameter Domain of a Relation]
-Let $R \in \Z^n \to 2^{\Z^{d+d}}$ be a relation.
-The {\em parameter domain} of $R$ is the set
-$$\pdom R \coloneqq \{\, \vec s \in \Z^n \mid R(\vec s) \ne \emptyset \,\}.$$
-\end{definition}
-
-\begin{definition}[Domain of a Relation]
-Let $R \in \Z^n \to 2^{\Z^{d+d}}$ be a relation.
-The {\em domain} of $R$ is the polyhedral set
-$$\domain R \coloneqq \vec s \mapsto
-\{\, \vec x_1 \in \Z^{d_1} \mid \exists \vec x_2 \in \Z^{d_2} :
-(\vec x_1, \vec x_2) \in R(\vec s) \,\}
-.
-$$
-\end{definition}
-
-\begin{definition}[Range of a Relation]
-Let $R \in \Z^n \to 2^{\Z^{d+d}}$ be a relation.
-The {\em range} of $R$ is the polyhedral set
-$$
-\range R \coloneqq \vec s \mapsto
-\{\, \vec x_2 \in \Z^{d_2} \mid \exists \vec x_1 \in \Z^{d_1} :
-(\vec x_1, \vec x_2) \in R(\vec s) \,\}
-.
-$$
-\end{definition}
-
-\begin{definition}[Composition of Relations]
-Let $R \in \Z^n \to 2^{\Z^{d_1+d_2}}$ and
-$S \in \Z^n \to 2^{\Z^{d_2+d_3}}$ be two relations,
-then the composition of
-$R$ and $S$ is defined as
-$$
-S \circ R \coloneqq
-\vec s \mapsto
-\{\, \vec x_1 \to \vec x_3 \in \Z^{d_1} \times \Z^{d_3}
-\mid \exists \vec x_2 \in \Z^{d_2} :
-\vec x_1 \to \vec x_2 \in R(\vec s) \wedge
-\vec x_2 \to \vec x_3 \in S(\vec s)
-\,\}
-.
-$$
-\end{definition}
-
-\begin{definition}[Difference Set of a Relation]
-Let $R \in \Z^n \to 2^{\Z^{d+d}}$ be a relation.
-The difference set ($\Delta \, R$) of $R$ is the set
-of differences between image elements and the corresponding
-domain elements,
-$$
-\diff R \coloneqq
-\vec s \mapsto
-\{\, \vec \delta \in \Z^{d} \mid \exists \vec x \to \vec y \in R :
-\vec \delta = \vec y - \vec x
-\,\}
-$$
-\end{definition}
-
-\section{Simple Hull}\label{s:simple hull}
-
-It is sometimes useful to have a single
-basic set or basic relation that contains a given set or relation.
-For rational sets, the obvious choice would be to compute the
-(rational) convex hull.  For integer sets, the obvious choice
-would be the integer hull.
-However, {\tt isl} currently does not support an integer hull operation
-and even if it did, it would be fairly expensive to compute.
-The convex hull operation is supported, but it is also fairly
-expensive to compute given only an implicit representation.
-
-Usually, it is not required to compute the exact integer hull,
-and an overapproximation of this hull is sufficient.
-The ``simple hull'' of a set is such an overapproximation
-and it is defined as the (inclusion-wise) smallest basic set
-that is described by constraints that are translates of
-the constraints in the input set.
-This means that the simple hull is relatively cheap to compute
-and that the number of constraints in the simple hull is no
-larger than the number of constraints in the input.
-\begin{definition}[Simple Hull of a Set]
-The {\em simple hull} of a set
-$S = \bigcup_{1 \le i \le v} S_i$, with
-$$
-S : \Z^n \to 2^{\Z^d} : \vec s \mapsto
-S(\vec s) =
-\left\{\, \vec x \in \Z^d \mid \exists \vec z \in \Z^e :
-\bigvee_{1 \le i \le v}
-A_i \vec x + B_i \vec s + D_i \vec z + \vec c_i \geq \vec 0 \,\right\}
-$$
-is the set
-$$
-H : \Z^n \to 2^{\Z^d} : \vec s \mapsto
-S(\vec s) =
-\left\{\, \vec x \in \Z^d \mid \exists \vec z \in \Z^e :
-\bigwedge_{1 \le i \le v}
-A_i \vec x + B_i \vec s + D_i \vec z + \vec c_i + \vec K_i \geq \vec 0
-\,\right\}
-,
-$$
-with $\vec K_i$ the (component-wise) smallest non-negative integer vectors
-such that $S \subseteq H$.
-\end{definition}
-The $\vec K_i$ can be obtained by solving a number of
-LP problems, one for each element of each $\vec K_i$.
-If any LP problem is unbounded, then the corresponding constraint
-is dropped.
-
-\section{Parametric Integer Programming}
-
-\subsection{Introduction}\label{s:intro}
-
-Parametric integer programming \shortcite{Feautrier88parametric}
-is used to solve many problems within the context of the polyhedral model.
-Here, we are mainly interested in dependence analysis \shortcite{Fea91}
-and in computing a unique representation for existentially quantified
-variables.  The latter operation has been used for counting elements
-in sets involving such variables
-\shortcite{BouletRe98,Verdoolaege2005experiences} and lies at the core
-of the internal representation of {\tt isl}.
-
-Parametric integer programming was first implemented in \texttt{PipLib}.
-An alternative method for parametric integer programming
-was later implemented in {\tt barvinok} \cite{barvinok-0.22}.
-This method is not based on Feautrier's algorithm, but on rational
-generating functions \cite{Woods2003short} and was inspired by the
-``digging'' technique of \shortciteN{DeLoera2004Three} for solving
-non-parametric integer programming problems.
-
-In the following sections, we briefly recall the dual simplex
-method combined with Gomory cuts and describe some extensions
-and optimizations.  The main algorithm is applied to a matrix
-data structure known as a tableau.  In case of parametric problems,
-there are two tableaus, one for the main problem and one for
-the constraints on the parameters, known as the context tableau.
-The handling of the context tableau is described in \autoref{s:context}.
-
-\subsection{The Dual Simplex Method}
-
-Tableaus can be represented in several slightly different ways.
-In {\tt isl}, the dual simplex method uses the same representation
-as that used by its incremental LP solver based on the \emph{primal}
-simplex method.  The implementation of this LP solver is based
-on that of {\tt Simplify} \shortcite{Detlefs2005simplify}, which, in turn,
-was derived from the work of \shortciteN{Nelson1980phd}.
-In the original \shortcite{Nelson1980phd}, the tableau was implemented
-as a sparse matrix, but neither {\tt Simplify} nor the current
-implementation of {\tt isl} does so.
-
-Given some affine constraints on the variables,
-$A \vec x + \vec b \ge \vec 0$, the tableau represents the relationship
-between the variables $\vec x$ and non-negative variables
-$\vec y = A \vec x + \vec b$ corresponding to the constraints.
-The initial tableau contains $\begin{pmatrix}
-\vec b & A
-\end{pmatrix}$ and expresses the constraints $\vec y$ in the rows in terms
-of the variables $\vec x$ in the columns.  The main operation defined
-on a tableau exchanges a column and a row variable and is called a pivot.
-During this process, some coefficients may become rational.
-As in the \texttt{PipLib} implementation,
-{\tt isl} maintains a shared denominator per row.
-The sample value of a tableau is one where each column variable is assigned
-zero and each row variable is assigned the constant term of the row.
-This sample value represents a valid solution if each constraint variable
-is assigned a non-negative value, i.e., if the constant terms of
-rows corresponding to constraints are all non-negative.
-
-The dual simplex method starts from an initial sample value that
-may be invalid, but that is known to be (lexicographically) no
-greater than any solution, and gradually increments this sample value
-through pivoting until a valid solution is obtained.
-In particular, each pivot exchanges a row variable
-$r = -n + \sum_i a_i \, c_i$ with negative
-sample value $-n$ with a column variable $c_j$
-such that $a_j > 0$.  Since $c_j = (n + r - \sum_{i\ne j} a_i \, c_i)/a_j$,
-the new row variable will have a positive sample value $n$.
-If no such column can be found, then the problem is infeasible.
-By always choosing the column that leads to the (lexicographically)
-smallest increment in the variables $\vec x$,
-the first solution found is guaranteed to be the (lexicographically)
-minimal solution \cite{Feautrier88parametric}.
-In order to be able to determine the smallest increment, the tableau
-is (implicitly) extended with extra rows defining the original
-variables in terms of the column variables.
-If we assume that all variables are non-negative, then we know
-that the zero vector is no greater than the minimal solution and
-then the initial extended tableau looks as follows.
-$$
-\begin{tikzpicture}
-\matrix (m) [matrix of math nodes]
-{
-& {} & 1 & \vec c \\
-\vec x && |(top)| \vec 0 & I \\
-\vec r && \vec b & |(bottom)|A \\
-};
-\begin{pgfonlayer}{background}
-\node (core) [inner sep=0pt,fill=black!20,right delimiter=),left delimiter=(,fit=(top)(bottom)] {};
-\end{pgfonlayer}
-\end{tikzpicture}
-$$
-Each column in this extended tableau is lexicographically positive
-and will remain so because of the column choice explained above.
-It is then clear that the value of $\vec x$ will increase in each step.
-Note that there is no need to store the extra rows explicitly.
-If a given $x_i$ is a column variable, then the corresponding row
-is the unit vector $e_i$.  If, on the other hand, it is a row variable,
-then the row already appears somewhere else in the tableau.
-
-In case of parametric problems, the sign of the constant term
-may depend on the parameters.  Each time the constant term of a constraint row
-changes, we therefore need to check whether the new term can attain
-negative and/or positive values over the current set of possible
-parameter values, i.e., the context.
-If all these terms can only attain non-negative values, the current
-state of the tableau represents a solution.  If one of the terms
-can only attain non-positive values and is not identically zero,
-the corresponding row can be pivoted.
-Otherwise, we pick one of the terms that can attain both positive
-and negative values and split the context into a part where
-it only attains non-negative values and a part where it only attains
-negative values.
-
-\subsection{Gomory Cuts}
-
-The solution found by the dual simplex method may have
-non-integral coordinates.  If so, some rational solutions
-(including the current sample value), can be cut off by
-applying a (parametric) Gomory cut.
-Let $r = b(\vec p) + \sp {\vec a} {\vec c}$ be the row
-corresponding to the first non-integral coordinate of $\vec x$,
-with $b(\vec p)$ the constant term, an affine expression in the
-parameters $\vec p$, i.e., $b(\vec p) = \sp {\vec f} {\vec p} + g$.
-Note that only row variables can attain
-non-integral values as the sample value of the column variables is zero.
-Consider the expression
-$b(\vec p) - \ceil{b(\vec p)} + \sp {\fract{\vec a}} {\vec c}$,
-with $\ceil\cdot$ the ceiling function and $\fract\cdot$ the
-fractional part.  This expression is negative at the sample value
-since $\vec c = \vec 0$ and $r = b(\vec p)$ is fractional, i.e.,
-$\ceil{b(\vec p)} > b(\vec p)$.  On the other hand, for each integral
-value of $r$ and $\vec c \ge 0$, the expression is non-negative
-because $b(\vec p) - \ceil{b(\vec p)} > -1$.
-Imposing this expression to be non-negative therefore does not
-invalidate any integral solutions, while it does cut away the current
-fractional sample value.  To be able to formulate this constraint,
-a new variable $q = \floor{-b(\vec p)} = - \ceil{b(\vec p)}$ is added
-to the context.  This integral variable is uniquely defined by the constraints
-$0 \le -d \, b(\vec p) - d \, q \le d - 1$, with $d$ the common
-denominator of $\vec f$ and $g$.  In practice, the variable
-$q' = \floor{\sp {\fract{-f}} {\vec p} + \fract{-g}}$ is used instead
-and the coefficients of the new constraint are adjusted accordingly.
-The sign of the constant term of this new constraint need not be determined
-as it is non-positive by construction.
-When several of these extra context variables are added, it is important
-to avoid adding duplicates.
-Recent versions of {\tt PipLib} also check for such duplicates.
-
-\subsection{Negative Unknowns and Maximization}
-
-There are two places in the above algorithm where the unknowns $\vec x$
-are assumed to be non-negative: the initial tableau starts from
-sample value $\vec x = \vec 0$ and $\vec c$ is assumed to be non-negative
-during the construction of Gomory cuts.
-To deal with negative unknowns, \shortciteN[Appendix A.2]{Fea91}
-proposed to use a ``big parameter'', say $M$, that is taken to be
-an arbitrarily large positive number.  Instead of looking for the
-lexicographically minimal value of $\vec x$, we search instead
-for the lexicographically minimal value of $\vec x' = \vec M + \vec x$.
-The sample value $\vec x' = \vec 0$ of the initial tableau then
-corresponds to $\vec x = -\vec M$, which is clearly not greater than
-any potential solution.  The sign of the constant term of a row
-is determined lexicographically, with the coefficient of $M$ considered
-first.  That is, if the coefficient of $M$ is not zero, then its sign
-is the sign of the entire term.  Otherwise, the sign is determined
-by the remaining affine expression in the parameters.
-If the original problem has a bounded optimum, then the final sample
-value will be of the form $\vec M + \vec v$ and the optimal value
-of the original problem is then $\vec v$.
-Maximization problems can be handled in a similar way by computing
-the minimum of $\vec M - \vec x$.
-
-When the optimum is unbounded, the optimal value computed for
-the original problem will involve the big parameter.
-In the original implementation of {\tt PipLib}, the big parameter could
-even appear in some of the extra variables $\vec q$ created during
-the application of a Gomory cut.  The final result could then contain
-implicit conditions on the big parameter through conditions on such
-$\vec q$ variables.  This problem was resolved in later versions
-of {\tt PipLib} by taking $M$ to be divisible by any positive number.
-The big parameter can then never appear in any $\vec q$ because
-$\fract {\alpha M } = 0$.  It should be noted, though, that an unbounded
-problem usually (but not always)
-indicates an incorrect formulation of the problem.
-
-The original version of {\tt PipLib} required the user to ``manually''
-add a big parameter, perform the reformulation and interpret the result
-\shortcite{Feautrier02}.  Recent versions allow the user to simply
-specify that the unknowns may be negative or that the maximum should
-be computed and then these transformations are performed internally.
-Although there are some application, e.g.,
-that of \shortciteN{Feautrier92multi},
-where it is useful to have explicit control over the big parameter,
-negative unknowns and maximization are by far the most common applications
-of the big parameter and we believe that the user should not be bothered
-with such implementation issues.
-The current version of {\tt isl} therefore does not
-provide any interface for specifying big parameters.  Instead, the user
-can specify whether a maximum needs to be computed and no assumptions
-are made on the sign of the unknowns.  Instead, the sign of the unknowns
-is checked internally and a big parameter is automatically introduced when
-needed.  For compatibility with {\tt PipLib}, the {\tt isl\_pip} tool
-does explicitly add non-negativity constraints on the unknowns unless
-the \verb+Urs_unknowns+ option is specified.
-Currently, there is also no way in {\tt isl} of expressing a big
-parameter in the output.  Even though
-{\tt isl} makes the same divisibility assumption on the big parameter
-as recent versions of {\tt PipLib}, it will therefore eventually
-produce an error if the problem turns out to be unbounded.
-
-\subsection{Preprocessing}
-
-In this section, we describe some transformations that are
-or can be applied in advance to reduce the running time
-of the actual dual simplex method with Gomory cuts.
-
-\subsubsection{Feasibility Check and Detection of Equalities}
-
-Experience with the original {\tt PipLib} has shown that Gomory cuts
-do not perform very well on problems that are (non-obviously) empty,
-i.e., problems with rational solutions, but no integer solutions.
-In {\tt isl}, we therefore first perform a feasibility check on
-the original problem considered as a non-parametric problem
-over the combined space of unknowns and parameters.
-In fact, we do not simply check the feasibility, but we also
-check for implicit equalities among the integer points by computing
-the integer affine hull.  The algorithm used is the same as that
-described in \autoref{s:GBR} below.
-Computing the affine hull is fairly expensive, but it can
-bring huge benefits if any equalities can be found or if the problem
-turns out to be empty.
-
-\subsubsection{Constraint Simplification}
-
-If the coefficients of the unknown and parameters in a constraint
-have a common factor, then this factor should be removed, possibly
-rounding down the constant term.  For example, the constraint
-$2 x - 5 \ge 0$ should be simplified to $x - 3 \ge 0$.
-{\tt isl} performs such simplifications on all sets and relations.
-Recent versions of {\tt PipLib} also perform this simplification
-on the input.
-
-\subsubsection{Exploiting Equalities}\label{s:equalities}
-
-If there are any (explicit) equalities in the input description,
-{\tt PipLib} converts each into a pair of inequalities.
-It is also possible to write $r$ equalities as $r+1$ inequalities
-\shortcite{Feautrier02}, but it is even better to \emph{exploit} the
-equalities to reduce the dimensionality of the problem.
-Given an equality involving at least one unknown, we pivot
-the row corresponding to the equality with the column corresponding
-to the last unknown with non-zero coefficient.  The new column variable
-can then be removed completely because it is identically zero,
-thereby reducing the dimensionality of the problem by one.
-The last unknown is chosen to ensure that the columns of the initial
-tableau remain lexicographically positive.  In particular, if
-the equality is of the form $b + \sum_{i \le j} a_i \, x_i = 0$ with
-$a_j \ne 0$, then the (implicit) top rows of the initial tableau
-are changed as follows
-$$
-\begin{tikzpicture}
-\matrix [matrix of math nodes]
-{
- & {} & |(top)| 0 & I_1 & |(j)| &  \\
-j && 0 & & 1 & \\
-  && 0 & & & |(bottom)|I_2 \\
-};
-\node[overlay,above=2mm of j,anchor=south]{j};
-\begin{pgfonlayer}{background}
-\node (m) [inner sep=0pt,fill=black!20,right delimiter=),left delimiter=(,fit=(top)(bottom)] {};
-\end{pgfonlayer}
-\begin{scope}[xshift=4cm]
-\matrix [matrix of math nodes]
-{
- & {} & |(top)| 0 & I_1 &  \\
-j && |(left)| -b/a_j & -a_i/a_j & \\
-  && 0 & & |(bottom)|I_2 \\
-};
-\begin{pgfonlayer}{background}
-\node (m2) [inner sep=0pt,fill=black!20,right delimiter=),left delimiter=(,fit=(top)(bottom)(left)] {};
-\end{pgfonlayer}
-\end{scope}
- \draw [shorten >=7mm,-to,thick,decorate,
-        decoration={snake,amplitude=.4mm,segment length=2mm,
-                    pre=moveto,pre length=5mm,post length=8mm}]
-   (m) -- (m2);
-\end{tikzpicture}
-$$
-Currently, {\tt isl} also eliminates equalities involving only parameters
-in a similar way, provided at least one of the coefficients is equal to one.
-The application of parameter compression (see below)
-would obviate the need for removing parametric equalities.
-
-\subsubsection{Offline Symmetry Detection}\label{s:offline}
-
-Some problems, notably those of \shortciteN{Bygde2010licentiate},
-have a collection of constraints, say
-$b_i(\vec p) + \sp {\vec a} {\vec x} \ge 0$,
-that only differ in their (parametric) constant terms.
-These constant terms will be non-negative on different parts
-of the context and this context may have to be split for each
-of the constraints.  In the worst case, the basic algorithm may
-have to consider all possible orderings of the constant terms.
-Instead, {\tt isl} introduces a new parameter, say $u$, and
-replaces the collection of constraints by the single
-constraint $u + \sp {\vec a} {\vec x} \ge 0$ along with
-context constraints $u \le b_i(\vec p)$.
-Any solution to the new system is also a solution
-to the original system since
-$\sp {\vec a} {\vec x} \ge -u \ge -b_i(\vec p)$.
-Conversely, $m = \min_i b_i(\vec p)$ satisfies the constraints
-on $u$ and therefore extends a solution to the new system.
-It can also be plugged into a new solution.
-See \autoref{s:post} for how this substitution is currently performed
-in {\tt isl}.
-The method described in this section can only detect symmetries
-that are explicitly available in the input.
-See \autoref{s:online} for the detection
-and exploitation of symmetries that appear during the course of
-the dual simplex method.
-
-\subsubsection{Parameter Compression}\label{s:compression}
-
-It may in some cases be apparent from the equalities in the problem
-description that there can only be a solution for a sublattice
-of the parameters.  In such cases ``parameter compression''
-\shortcite{Meister2004PhD,Meister2008} can be used to replace
-the parameters by alternative ``dense'' parameters.
-For example, if there is a constraint $2x = n$, then the system
-will only have solutions for even values of $n$ and $n$ can be replaced
-by $2n'$.  Similarly, the parameters $n$ and $m$ in a system with
-the constraint $2n = 3m$ can be replaced by a single parameter $n'$
-with $n=3n'$ and $m=2n'$.
-It is also possible to perform a similar compression on the unknowns,
-but it would be more complicated as the compression would have to
-preserve the lexicographical order.  Moreover, due to our handling
-of equalities described above there should be
-no need for such variable compression.
-Although parameter compression has been implemented in {\tt isl},
-it is currently not yet used during parametric integer programming.
-
-\subsection{Postprocessing}\label{s:post}
-
-The output of {\tt PipLib} is a quast (quasi-affine selection tree).
-Each internal node in this tree corresponds to a split of the context
-based on a parametric constant term in the main tableau with indeterminate
-sign.  Each of these nodes may introduce extra variables in the context
-corresponding to integer divisions.  Each leaf of the tree prescribes
-the solution in that part of the context that satisfies all the conditions
-on the path leading to the leaf.
-Such a quast is a very economical way of representing the solution, but
-it would not be suitable as the (only) internal representation of
-sets and relations in {\tt isl}.  Instead, {\tt isl} represents
-the constraints of a set or relation in disjunctive normal form.
-The result of a parametric integer programming problem is then also
-converted to this internal representation.  Unfortunately, the conversion
-to disjunctive normal form can lead to an explosion of the size
-of the representation.
-In some cases, this overhead would have to be paid anyway in subsequent
-operations, but in other cases, especially for outside users that just
-want to solve parametric integer programming problems, we would like
-to avoid this overhead in future.  That is, we are planning on introducing
-quasts or a related representation as one of several possible internal
-representations and on allowing the output of {\tt isl\_pip} to optionally
-be printed as a quast.
-
-Currently, {\tt isl} also does not have an internal representation
-for expressions such as $\min_i b_i(\vec p)$ from the offline
-symmetry detection of \autoref{s:offline}.
-Assume that one of these expressions has $n$ bounds $b_i(\vec p)$.
-If the expression
-does not appear in the affine expression describing the solution,
-but only in the constraints, and if moreover, the expression
-only appears with a positive coefficient, i.e.,
-$\min_i b_i(\vec p) \ge f_j(\vec p)$, then each of these constraints
-can simply be reduplicated $n$ times, once for each of the bounds.
-Otherwise, a conversion to disjunctive normal form
-leads to $n$ cases, each described as $u = b_i(\vec p)$ with constraints
-$b_i(\vec p) \le b_j(\vec p)$ for $j > i$
-and
-$b_i(\vec p)  < b_j(\vec p)$ for $j < i$.
-Note that even though this conversion leads to a size increase
-by a factor of $n$, not detecting the symmetry could lead to
-an increase by a factor of $n!$ if all possible orderings end up being
-considered.
-
-\subsection{Context Tableau}\label{s:context}
-
-The main operation that a context tableau needs to provide is a test
-on the sign of an affine expression over the elements of the context.
-This sign can be determined by solving two integer linear feasibility
-problems, one with a constraint added to the context that enforces
-the expression to be non-negative and one where the expression is
-negative.  As already mentioned by \shortciteN{Feautrier88parametric},
-any integer linear feasibility solver could be used, but the {\tt PipLib}
-implementation uses a recursive call to the dual simplex with Gomory
-cuts algorithm to determine the feasibility of a context.
-In {\tt isl}, two ways of handling the context have been implemented,
-one that performs the recursive call and one, used by default, that
-uses generalized basis reduction.
-We start with some optimizations that are shared between the two
-implementations and then discuss additional details of each of them.
-
-\subsubsection{Maintaining Witnesses}\label{s:witness}
-
-A common feature of both integer linear feasibility solvers is that
-they will not only say whether a set is empty or not, but if the set
-is non-empty, they will also provide a \emph{witness} for this result,
-i.e., a point that belongs to the set.  By maintaining a list of such
-witnesses, we can avoid many feasibility tests during the determination
-of the signs of affine expressions.  In particular, if the expression
-evaluates to a positive number on some of these points and to a negative
-number on some others, then no feasibility test needs to be performed.
-If all the evaluations are non-negative, we only need to check for the
-possibility of a negative value and similarly in case of all
-non-positive evaluations.  Finally, in the rare case that all points
-evaluate to zero or at the start, when no points have been collected yet,
-one or two feasibility tests need to be performed depending on the result
-of the first test.
-
-When a new constraint is added to the context, the points that
-violate the constraint are temporarily removed.  They are reconsidered
-when we backtrack over the addition of the constraint, as they will
-satisfy the negation of the constraint.  It is only when we backtrack
-over the addition of the points that they are finally removed completely.
-When an extra integer division is added to the context,
-the new coordinates of the
-witnesses can easily be computed by evaluating the integer division.
-The idea of keeping track of witnesses was first used in {\tt barvinok}.
-
-\subsubsection{Choice of Constant Term on which to Split}
-
-Recall that if there are no rows with a non-positive constant term,
-but there are rows with an indeterminate sign, then the context
-needs to be split along the constant term of one of these rows.
-If there is more than one such row, then we need to choose which row
-to split on first.  {\tt PipLib} uses a heuristic based on the (absolute)
-sizes of the coefficients.  In particular, it takes the largest coefficient
-of each row and then selects the row where this largest coefficient is smaller
-than those of the other rows.
-
-In {\tt isl}, we take that row for which non-negativity of its constant
-term implies non-negativity of as many of the constant terms of the other
-rows as possible.  The intuition behind this heuristic is that on the
-positive side, we will have fewer negative and indeterminate signs,
-while on the negative side, we need to perform a pivot, which may
-affect any number of rows meaning that the effect on the signs
-is difficult to predict.  This heuristic is of course much more
-expensive to evaluate than the heuristic used by {\tt PipLib}.
-More extensive tests are needed to evaluate whether the heuristic is worthwhile.
-
-\subsubsection{Dual Simplex + Gomory Cuts}
-
-When a new constraint is added to the context, the first steps
-of the dual simplex method applied to this new context will be the same
-or at least very similar to those taken on the original context, i.e.,
-before the constraint was added.  In {\tt isl}, we therefore apply
-the dual simplex method incrementally on the context and backtrack
-to a previous state when a constraint is removed again.
-An initial implementation that was never made public would also
-keep the Gomory cuts, but the current implementation backtracks
-to before the point where Gomory cuts are added before adding
-an extra constraint to the context.
-Keeping the Gomory cuts has the advantage that the sample value
-is always an integer point and that this point may also satisfy
-the new constraint.  However, due to the technique of maintaining
-witnesses explained above,
-we would not perform a feasibility test in such cases and then
-the previously added cuts may be redundant, possibly resulting
-in an accumulation of a large number of cuts.
-
-If the parameters may be negative, then the same big parameter trick
-used in the main tableau is applied to the context.  This big parameter
-is of course unrelated to the big parameter from the main tableau.
-Note that it is not a requirement for this parameter to be ``big'',
-but it does allow for some code reuse in {\tt isl}.
-In {\tt PipLib}, the extra parameter is not ``big'', but this may be because
-the big parameter of the main tableau also appears
-in the context tableau.
-
-Finally, it was reported by \shortciteN{Galea2009personal}, who
-worked on a parametric integer programming implementation
-in {\tt PPL} \shortcite{PPL},
-that it is beneficial to add cuts for \emph{all} rational coordinates
-in the context tableau.  Based on this report,
-the initial {\tt isl} implementation was adapted accordingly.
-
-\subsubsection{Generalized Basis Reduction}\label{s:GBR}
-
-The default algorithm used in {\tt isl} for feasibility checking
-is generalized basis reduction \shortcite{Cook1991implementation}.
-This algorithm is also used in the {\tt barvinok} implementation.
-The algorithm is fairly robust, but it has some overhead.
-We therefore try to avoid calling the algorithm in easy cases.
-In particular, we incrementally keep track of points for which
-the entire unit hypercube positioned at that point lies in the context.
-This set is described by translates of the constraints of the context
-and if (rationally) non-empty, any rational point
-in the set can be rounded up to yield an integer point in the context.
-
-A restriction of the algorithm is that it only works on bounded sets.
-The affine hull of the recession cone therefore needs to be projected
-out first.  As soon as the algorithm is invoked, we then also
-incrementally keep track of this recession cone.  The reduced basis
-found by one call of the algorithm is also reused as initial basis
-for the next call.
-
-Some problems lead to the
-introduction of many integer divisions.  Within a given context,
-some of these integer divisions may be equal to each other, even
-if the expressions are not identical, or they may be equal to some
-affine combination of other variables.
-To detect such cases, we compute the affine hull of the context
-each time a new integer division is added.  The algorithm used
-for computing this affine hull is that of \shortciteN{Karr1976affine},
-while the points used in this algorithm are obtained by performing
-integer feasibility checks on that part of the context outside
-the current approximation of the affine hull.
-The list of witnesses is used to construct an initial approximation
-of the hull, while any extra points found during the construction
-of the hull is added to this list.
-Any equality found in this way that expresses an integer division
-as an \emph{integer} affine combination of other variables is
-propagated to the main tableau, where it is used to eliminate that
-integer division.
-
-\subsection{Experiments}
-
-\autoref{t:comparison} compares the execution times of {\tt isl}
-(with both types of context tableau)
-on some more difficult instances to those of other tools,
-run on an Intel Xeon W3520 @ 2.66GHz.
-Easier problems such as the
-test cases distributed with {\tt Pip\-Lib} can be solved so quickly
-that we would only be measuring overhead such as input/output and conversions
-and not the running time of the actual algorithm.
-We compare the following versions:
-{\tt piplib-1.4.0-5-g0132fd9},
-{\tt barvinok-0.32.1-73-gc5d7751},
-{\tt isl-0.05.1-82-g3a37260}
-and {\tt PPL} version 0.11.2.
-
-The first test case is the following dependence analysis problem
-originating from the Phideo project \shortcite{Verhaegh1995PhD}
-that was communicated to us by Bart Kienhuis:
-\begin{lstlisting}[flexiblecolumns=true,breaklines=true]{}
-lexmax { [j1,j2] -> [i1,i2,i3,i4,i5,i6,i7,i8,i9,i10] : 1 <= i1,j1 <= 8 and 1 <= i2,i3,i4,i5,i6,i7,i8,i9,i10 <= 2 and 1 <= j2 <= 128 and i1-1 = j1-1 and i2-1+2*i3-2+4*i4-4+8*i5-8+16*i6-16+32*i7-32+64*i8-64+128*i9-128+256*i10-256=3*j2-3+66 };
-\end{lstlisting}
-This problem was the main inspiration
-for some of the optimizations in \autoref{s:GBR}.
-The second group of test cases are projections used during counting.
-The first nine of these come from \shortciteN{Seghir2006minimizing}.
-The remaining two come from \shortciteN{Verdoolaege2005experiences} and
-were used to drive the first, Gomory cuts based, implementation
-in {\tt isl}.
-The third and final group of test cases are borrowed from
-\shortciteN{Bygde2010licentiate} and inspired the offline symmetry detection
-of \autoref{s:offline}.  Without symmetry detection, the running times
-are 11s and 5.9s.
-All running times of {\tt barvinok} and {\tt isl} include a conversion
-to disjunctive normal form.  Without this conversion, the final two
-cases can be solved in 0.07s and 0.21s.
-The {\tt PipLib} implementation has some fixed limits and will
-sometimes report the problem to be too complex (TC), while on some other
-problems it will run out of memory (OOM).
-The {\tt barvinok} implementation does not support problems
-with a non-trivial lineality space (line) nor maximization problems (max).
-The Gomory cuts based {\tt isl} implementation was terminated after 1000
-minutes on the first problem.  The gbr version introduces some
-overhead on some of the easier problems, but is overall the clear winner.
-
-\begin{table}
-\begin{center}
-\begin{tabular}{lrrrrr}
-    & {\tt PipLib} & {\tt barvinok} & {\tt isl} cut & {\tt isl} gbr & {\tt PPL} \\
-\hline
-\hline
-% bart.pip
-Phideo & TC    & 793m   & $>$999m &   2.7s  & 372m \\
-\hline
-e1 & 0.33s & 3.5s & 0.08s & 0.11s & 0.18s \\
-e3 & 0.14s & 0.13s & 0.10s & 0.10s & 0.17s \\
-e4 & 0.24s & 9.1s & 0.09s & 0.11s & 0.70s \\
-e5 & 0.12s & 6.0s & 0.06s & 0.14s & 0.17s \\
-e6 & 0.10s & 6.8s & 0.17s & 0.08s & 0.21s \\
-e7 & 0.03s & 0.27s & 0.04s & 0.04s & 0.03s \\
-e8 & 0.03s & 0.18s & 0.03s & 0.04s & 0.01s \\
-e9 & OOM & 70m & 2.6s & 0.94s & 22s \\
-vd & 0.04s & 0.10s & 0.03s & 0.03s & 0.03s \\
-bouleti & 0.25s & line & 0.06s & 0.06s & 0.15s \\
-difficult & OOM & 1.3s & 1.7s & 0.33s & 1.4s \\
-\hline
-cnt/sum & TC & max & 2.2s & 2.2s & OOM \\
-jcomplex & TC & max & 3.7s & 3.9s & OOM \\
-\end{tabular}
-\caption{Comparison of Execution Times}
-\label{t:comparison}
-\end{center}
-\end{table}
-
-\subsection{Online Symmetry Detection}\label{s:online}
-
-Manual experiments on small instances of the problems of
-\shortciteN{Bygde2010licentiate} and an analysis of the results
-by the approximate MPA method developed by \shortciteN{Bygde2010licentiate}
-have revealed that these problems contain many more symmetries
-than can be detected using the offline method of \autoref{s:offline}.
-In this section, we present an online detection mechanism that has
-not been implemented yet, but that has shown promising results
-in manual applications.
-
-Let us first consider what happens when we do not perform offline
-symmetry detection.  At some point, one of the
-$b_i(\vec p) + \sp {\vec a} {\vec x} \ge 0$ constraints,
-say the $j$th constraint, appears as a column
-variable, say $c_1$, while the other constraints are represented
-as rows of the form $b_i(\vec p) - b_j(\vec p) + c$.
-The context is then split according to the relative order of
-$b_j(\vec p)$ and one of the remaining $b_i(\vec p)$.
-The offline method avoids this split by replacing all $b_i(\vec p)$
-by a single newly introduced parameter that represents the minimum
-of these $b_i(\vec p)$.
-In the online method the split is similarly avoided by the introduction
-of a new parameter.  In particular, a new parameter is introduced
-that represents
-$\left| b_j(\vec p) - b_i(\vec p) \right|_+ =
-\max(b_j(\vec p) - b_i(\vec p), 0)$.
-
-In general, let $r = b(\vec p) + \sp {\vec a} {\vec c}$ be a row
-of the tableau such that the sign of $b(\vec p)$ is indeterminate
-and such that exactly one of the elements of $\vec a$ is a $1$,
-while all remaining elements are non-positive.
-That is, $r = b(\vec p) + c_j - f$ with $f = -\sum_{i\ne j} a_i c_i \ge 0$.
-We introduce a new parameter $t$ with
-context constraints $t \ge -b(\vec p)$ and $t \ge 0$ and replace
-the column variable $c_j$ by $c' + t$.  The row $r$ is now equal
-to $b(\vec p) + t + c' - f$.  The constant term of this row is always
-non-negative because any negative value of $b(\vec p)$ is compensated
-by $t \ge -b(\vec p)$ while and non-negative value remains non-negative
-because $t \ge 0$.
-
-We need to show that this transformation does not eliminate any valid
-solutions and that it does not introduce any spurious solutions.
-Given a valid solution for the original problem, we need to find
-a non-negative value of $c'$ satisfying the constraints.
-If $b(\vec p) \ge 0$, we can take $t = 0$ so that
-$c' = c_j - t = c_j \ge 0$.
-If $b(\vec p) < 0$, we can take $t = -b(\vec p)$.
-Since $r = b(\vec p) + c_j - f \ge 0$ and $f \ge 0$, we have 
-$c' = c_j + b(\vec p) \ge 0$.
-Note that these choices amount to plugging in
-$t = \left|-b(\vec p)\right|_+ = \max(-b(\vec p), 0)$.
-Conversely, given a solution to the new problem, we need to find
-a non-negative value of $c_j$, but this is easy since $c_j = c' + t$
-and both of these are non-negative.
-
-Plugging in $t = \max(-b(\vec p), 0)$ can be performed as in
-\autoref{s:post}, but, as in the case of offline symmetry detection,
-it may be better to provide a direct representation for such
-expressions in the internal representation of sets and relations
-or at least in a quast-like output format.
-
-\section{Coalescing}\label{s:coalescing}
-
-See \shortciteN{Verdoolaege2009isl}, for now.
-More details will be added later.
-
-\section{Transitive Closure}
-
-\subsection{Introduction}
-
-\begin{definition}[Power of a Relation]
-Let $R \in \Z^n \to 2^{\Z^{d+d}}$ be a relation and
-$k \in \Z_{\ge 1}$
-a positive number, then power $k$ of relation $R$ is defined as
-\begin{equation}
-\label{eq:transitive:power}
-R^k \coloneqq
-\begin{cases}
-R & \text{if $k = 1$}
-\\
-R \circ R^{k-1} & \text{if $k \ge 2$}
-.
-\end{cases}
-\end{equation}
-\end{definition}
-
-\begin{definition}[Transitive Closure of a Relation]
-Let $R \in \Z^n \to 2^{\Z^{d+d}}$ be a relation,
-then the transitive closure $R^+$ of $R$ is the union
-of all positive powers of $R$,
-$$
-R^+ \coloneqq \bigcup_{k \ge 1} R^k
-.
-$$
-\end{definition}
-Alternatively, the transitive closure may be defined
-inductively as
-\begin{equation}
-\label{eq:transitive:inductive}
-R^+ \coloneqq R \cup \left(R \circ R^+\right)
-.
-\end{equation}
-
-Since the transitive closure of a polyhedral relation
-may no longer be a polyhedral relation \shortcite{Kelly1996closure},
-we can, in the general case, only compute an approximation
-of the transitive closure.
-Whereas \shortciteN{Kelly1996closure} compute underapproximations,
-we, like \shortciteN{Beletska2009}, compute overapproximations.
-That is, given a relation $R$, we will compute a relation $T$
-such that $R^+ \subseteq T$.  Of course, we want this approximation
-to be as close as possible to the actual transitive closure
-$R^+$ and we want to detect the cases where the approximation is
-exact, i.e., where $T = R^+$.
-
-For computing an approximation of the transitive closure of $R$,
-we follow the same general strategy as \shortciteN{Beletska2009}
-and first compute an approximation of $R^k$ for $k \ge 1$ and then project
-out the parameter $k$ from the resulting relation.
-
-\begin{example}
-As a trivial example, consider the relation
-$R = \{\, x \to x + 1 \,\}$.  The $k$th power of this map
-for arbitrary $k$ is
-$$
-R^k = k \mapsto \{\, x \to x + k \mid k \ge 1 \,\}
-.
-$$
-The transitive closure is then
-$$
-\begin{aligned}
-R^+ & = \{\, x \to y \mid \exists k \in \Z_{\ge 1} : y = x + k \,\}
-\\
-& = \{\, x \to y \mid y \ge x + 1 \,\}
-.
-\end{aligned}
-$$
-\end{example}
-
-\subsection{Computing an Approximation of $R^k$}
-\label{s:power}
-
-There are some special cases where the computation of $R^k$ is very easy.
-One such case is that where $R$ does not compose with itself,
-i.e., $R \circ R = \emptyset$ or $\domain R \cap \range R = \emptyset$.
-In this case, $R^k$ is only non-empty for $k=1$ where it is equal
-to $R$ itself.
-
-In general, it is impossible to construct a closed form
-of $R^k$ as a polyhedral relation.
-We will therefore need to make some approximations.
-As a first approximations, we will consider each of the basic
-relations in $R$ as simply adding one or more offsets to a domain element
-to arrive at an image element and ignore the fact that some of these
-offsets may only be applied to some of the domain elements.
-That is, we will only consider the difference set $\Delta\,R$ of the relation.
-In particular, we will first construct a collection $P$ of paths
-that move through
-a total of $k$ offsets and then intersect domain and range of this
-collection with those of $R$.
-That is, 
-\begin{equation}
-\label{eq:transitive:approx}
-K = P \cap \left(\domain R \to \range R\right)
-,
-\end{equation}
-with
-\begin{equation}
-\label{eq:transitive:path}
-P = \vec s \mapsto \{\, \vec x \to \vec y \mid
-\exists k_i \in \Z_{\ge 0}, \vec\delta_i \in k_i \, \Delta_i(\vec s) :
-\vec y = \vec x + \sum_i \vec\delta_i
-\wedge
-\sum_i k_i = k > 0
-\,\}
-\end{equation}
-and with $\Delta_i$ the basic sets that compose
-the difference set $\Delta\,R$.
-Note that the number of basic sets $\Delta_i$ need not be
-the same as the number of basic relations in $R$.
-Also note that since addition is commutative, it does not
-matter in which order we add the offsets and so we are allowed
-to group them as we did in \eqref{eq:transitive:path}.
-
-If all the $\Delta_i$s are singleton sets
-$\Delta_i = \{\, \vec \delta_i \,\}$ with $\vec \delta_i \in \Z^d$,
-then \eqref{eq:transitive:path} simplifies to
-\begin{equation}
-\label{eq:transitive:singleton}
-P = \{\, \vec x \to \vec y \mid
-\exists k_i \in \Z_{\ge 0} :
-\vec y = \vec x + \sum_i k_i \, \vec \delta_i
-\wedge
-\sum_i k_i = k > 0
-\,\}
-\end{equation}
-and then the approximation computed in \eqref{eq:transitive:approx}
-is essentially the same as that of \shortciteN{Beletska2009}.
-If some of the $\Delta_i$s are not singleton sets or if
-some of $\vec \delta_i$s are parametric, then we need
-to resort to further approximations.
-
-To ease both the exposition and the implementation, we will for
-the remainder of this section work with extended offsets
-$\Delta_i' = \Delta_i \times \{\, 1 \,\}$.
-That is, each offset is extended with an extra coordinate that is
-set equal to one.  The paths constructed by summing such extended
-offsets have the length encoded as the difference of their
-final coordinates.  The path $P'$ can then be decomposed into
-paths $P_i'$, one for each $\Delta_i$,
-\begin{equation}
-\label{eq:transitive:decompose}
-P' = \left(
-(P_m' \cup \identity) \circ \cdots \circ
-(P_2' \cup \identity) \circ
-(P_1' \cup \identity)
-\right) \cap
-\{\,
-\vec x' \to \vec y' \mid y_{d+1} - x_{d+1} = k > 0
-\,\}
-,
-\end{equation}
-with
-$$
-P_i' = \vec s \mapsto \{\, \vec x' \to \vec y' \mid
-\exists k \in \Z_{\ge 1}, \vec \delta \in k \, \Delta_i'(\vec s) :
-\vec y' = \vec x' + \vec \delta
-\,\}
-.
-$$
-Note that each $P_i'$ contains paths of length at least one.
-We therefore need to take the union with the identity relation
-when composing the $P_i'$s to allow for paths that do not contain
-any offsets from one or more $\Delta_i'$.
-The path that consists of only identity relations is removed
-by imposing the constraint $y_{d+1} - x_{d+1} > 0$.
-Taking the union with the identity relation means that
-that the relations we compose in \eqref{eq:transitive:decompose}
-each consist of two basic relations.  If there are $m$
-disjuncts in the input relation, then a direct application
-of the composition operation may therefore result in a relation
-with $2^m$ disjuncts, which is prohibitively expensive.
-It is therefore crucial to apply coalescing (\autoref{s:coalescing})
-after each composition.
-
-Let us now consider how to compute an overapproximation of $P_i'$.
-Those that correspond to singleton $\Delta_i$s are grouped together
-and handled as in \eqref{eq:transitive:singleton}.
-Note that this is just an optimization.  The procedure described
-below would produce results that are at least as accurate.
-For simplicity, we first assume that no constraint in $\Delta_i'$
-involves any existentially quantified variables.
-We will return to existentially quantified variables at the end
-of this section.
-Without existentially quantified variables, we can classify
-the constraints of $\Delta_i'$ as follows
-\begin{enumerate}
-\item non-parametric constraints
-\begin{equation}
-\label{eq:transitive:non-parametric}
-A_1 \vec x + \vec c_1 \geq \vec 0
-\end{equation}
-\item purely parametric constraints
-\begin{equation}
-\label{eq:transitive:parametric}
-B_2 \vec s + \vec c_2 \geq \vec 0
-\end{equation}
-\item negative mixed constraints
-\begin{equation}
-\label{eq:transitive:mixed}
-A_3 \vec x + B_3 \vec s + \vec c_3 \geq \vec 0
-\end{equation}
-such that for each row $j$ and for all $\vec s$,
-$$
-\Delta_i'(\vec s) \cap
-\{\, \vec \delta' \mid B_{3,j} \vec s + c_{3,j} > 0 \,\}
-= \emptyset
-$$
-\item positive mixed constraints
-$$
-A_4 \vec x + B_4 \vec s + \vec c_4 \geq \vec 0
-$$
-such that for each row $j$, there is at least one $\vec s$ such that
-$$
-\Delta_i'(\vec s) \cap
-\{\, \vec \delta' \mid B_{4,j} \vec s + c_{4,j} > 0 \,\}
-\ne \emptyset
-$$
-\end{enumerate}
-We will use the following approximation $Q_i$ for $P_i'$:
-\begin{equation}
-\label{eq:transitive:Q}
-\begin{aligned}
-Q_i = \vec s \mapsto
-\{\,
-\vec x' \to \vec y'
-\mid {} & \exists k \in \Z_{\ge 1}, \vec f \in \Z^d :
-\vec y' = \vec x' + (\vec f, k)
-\wedge {}
-\\
-&
-A_1 \vec f + k \vec c_1 \geq \vec 0
-\wedge
-B_2 \vec s + \vec c_2 \geq \vec 0
-\wedge
-A_3 \vec f + B_3 \vec s + \vec c_3 \geq \vec 0
-\,\}
-.
-\end{aligned}
-\end{equation}
-To prove that $Q_i$ is indeed an overapproximation of $P_i'$,
-we need to show that for every $\vec s \in \Z^n$, for every
-$k \in \Z_{\ge 1}$ and for every $\vec f \in k \, \Delta_i(\vec s)$
-we have that
-$(\vec f, k)$ satisfies the constraints in \eqref{eq:transitive:Q}.
-If $\Delta_i(\vec s)$ is non-empty, then $\vec s$ must satisfy
-the constraints in \eqref{eq:transitive:parametric}.
-Each element $(\vec f, k) \in k \, \Delta_i'(\vec s)$ is a sum
-of $k$ elements $(\vec f_j, 1)$ in $\Delta_i'(\vec s)$.
-Each of these elements satisfies the constraints in
-\eqref{eq:transitive:non-parametric}, i.e.,
-$$
-\left[
-\begin{matrix}
-A_1 & \vec c_1
-\end{matrix}
-\right]
-\left[
-\begin{matrix}
-\vec f_j \\ 1
-\end{matrix}
-\right]
-\ge \vec 0
-.
-$$
-The sum of these elements therefore satisfies the same set of inequalities,
-i.e., $A_1 \vec f + k \vec c_1 \geq \vec 0$.
-Finally, the constraints in \eqref{eq:transitive:mixed} are such
-that for any $\vec s$ in the parameter domain of $\Delta$,
-we have $-\vec r(\vec s) \coloneqq B_3 \vec s + \vec c_3 \le \vec 0$,
-i.e., $A_3 \vec f_j \ge \vec r(\vec s) \ge \vec 0$
-and therefore also $A_3 \vec f \ge \vec r(\vec s)$.
-Note that if there are no mixed constraints and if the
-rational relaxation of $\Delta_i(\vec s)$, i.e.,
-$\{\, \vec x \in \Q^d \mid A_1 \vec x + \vec c_1 \ge \vec 0\,\}$,
-has integer vertices, then the approximation is exact, i.e.,
-$Q_i = P_i'$.  In this case, the vertices of $\Delta'_i(\vec s)$
-generate the rational cone
-$\{\, \vec x' \in \Q^{d+1} \mid \left[
-\begin{matrix}
-A_1 & \vec c_1
-\end{matrix}
-\right] \vec x' \,\}$ and therefore $\Delta'_i(\vec s)$ is
-a Hilbert basis of this cone \shortcite[Theorem~16.4]{Schrijver1986}.
-
-Note however that, as pointed out by \shortciteN{DeSmet2010personal},
-if there \emph{are} any mixed constraints, then the above procedure may
-not compute the most accurate affine approximation of
-$k \, \Delta_i(\vec s)$ with $k \ge 1$.
-In particular, we only consider the negative mixed constraints that
-happen to appear in the description of $\Delta_i(\vec s)$, while we
-should instead consider \emph{all} valid such constraints.
-It is also sufficient to consider those constraints because any
-constraint that is valid for $k \, \Delta_i(\vec s)$ is also
-valid for $1 \, \Delta_i(\vec s) = \Delta_i(\vec s)$.
-Take therefore any constraint
-$\spv a x + \spv b s + c \ge 0$ valid for $\Delta_i(\vec s)$.
-This constraint is also valid for $k \, \Delta_i(\vec s)$ iff
-$k \, \spv a x + \spv b s + c \ge 0$.
-If $\spv b s + c$ can attain any positive value, then $\spv a x$
-may be negative for some elements of $\Delta_i(\vec s)$.
-We then have $k \, \spv a x < \spv a x$ for $k > 1$ and so the constraint
-is not valid for $k \, \Delta_i(\vec s)$.
-We therefore need to impose $\spv b s + c \le 0$ for all values
-of $\vec s$ such that $\Delta_i(\vec s)$ is non-empty, i.e.,
-$\vec b$ and $c$ need to be such that $- \spv b s - c \ge 0$ is a valid
-constraint of $\Delta_i(\vec s)$.  That is, $(\vec b, c)$ are the opposites
-of the coefficients of a valid constraint of $\Delta_i(\vec s)$.
-The approximation of $k \, \Delta_i(\vec s)$ can therefore be obtained
-using three applications of Farkas' lemma.  The first obtains the coefficients
-of constraints valid for $\Delta_i(\vec s)$.  The second obtains
-the coefficients of constraints valid for the projection of $\Delta_i(\vec s)$
-onto the parameters.  The opposite of the second set is then computed
-and intersected with the first set.  The result is the set of coefficients
-of constraints valid for $k \, \Delta_i(\vec s)$.  A final application
-of Farkas' lemma is needed to obtain the approximation of
-$k \, \Delta_i(\vec s)$ itself.
-
-\begin{example}
-Consider the relation
-$$
-n \to \{\, (x, y) \to (1 + x, 1 - n + y) \mid n \ge 2 \,\}
-.
-$$
-The difference set of this relation is
-$$
-\Delta = n \to \{\, (1, 1 - n) \mid n \ge 2 \,\}
-.
-$$
-Using our approach, we would only consider the mixed constraint
-$y - 1 + n \ge 0$, leading to the following approximation of the
-transitive closure:
-$$
-n \to \{\, (x, y) \to (o_0, o_1) \mid n \ge 2 \wedge o_1 \le 1 - n + y \wedge o_0 \ge 1 + x \,\}
-.
-$$
-If, instead, we apply Farkas's lemma to $\Delta$, i.e.,
-\begin{verbatim}
-D := [n] -> { [1, 1 - n] : n >= 2 };
-CD := coefficients D;
-CD;
-\end{verbatim}
-we obtain
-\begin{verbatim}
-{ rat: coefficients[[c_cst, c_n] -> [i2, i3]] : i3 <= c_n and
-  i3 <= c_cst + 2c_n + i2 }
-\end{verbatim}
-The pure-parametric constraints valid for $\Delta$,
-\begin{verbatim}
-P := { [a,b] -> [] }(D);
-CP := coefficients P;
-CP;
-\end{verbatim}
-are
-\begin{verbatim}
-{ rat: coefficients[[c_cst, c_n] -> []] : c_n >= 0 and 2c_n >= -c_cst }
-\end{verbatim}
-Negating these coefficients and intersecting with \verb+CD+,
-\begin{verbatim}
-NCP := { rat: coefficients[[a,b] -> []]
-              -> coefficients[[-a,-b] -> []] }(CP);
-CK := wrap((unwrap CD) * (dom (unwrap NCP)));
-CK;
-\end{verbatim}
-we obtain
-\begin{verbatim}
-{ rat: [[c_cst, c_n] -> [i2, i3]] : i3 <= c_n and
-  i3 <= c_cst + 2c_n + i2 and c_n <= 0 and 2c_n <= -c_cst }
-\end{verbatim}
-The approximation for $k\,\Delta$,
-\begin{verbatim}
-K := solutions CK;
-K;
-\end{verbatim}
-is then
-\begin{verbatim}
-[n] -> { rat: [i0, i1] : i1 <= -i0 and i0 >= 1 and i1 <= 2 - n - i0 }
-\end{verbatim}
-Finally, the computed approximation for $R^+$,
-\begin{verbatim}
-T := unwrap({ [dx,dy] -> [[x,y] -> [x+dx,y+dy]] }(K));
-R := [n] -> { [x,y] -> [x+1,y+1-n] : n >= 2 };
-T := T * ((dom R) -> (ran R));
-T;
-\end{verbatim}
-is
-\begin{verbatim}
-[n] -> { [x, y] -> [o0, o1] : o1 <= x + y - o0 and
-         o0 >= 1 + x and o1 <= 2 - n + x + y - o0 and n >= 2 }
-\end{verbatim}
-\end{example}
-
-Existentially quantified variables can be handled by
-classifying them into variables that are uniquely
-determined by the parameters, variables that are independent
-of the parameters and others.  The first set can be treated
-as parameters and the second as variables.  Constraints involving
-the other existentially quantified variables are removed.
-
-\begin{example}
-Consider the relation
-$$
-R =
-n \to \{\, x \to y \mid \exists \, \alpha_0, \alpha_1: 7\alpha_0 = -2 + n \wedge 5\alpha_1 = -1 - x + y \wedge y \ge 6 + x \,\}
-.
-$$
-The difference set of this relation is
-$$
-\Delta = \Delta \, R =
-n \to \{\, x \mid \exists \, \alpha_0, \alpha_1: 7\alpha_0 = -2 + n \wedge 5\alpha_1 = -1 + x \wedge x \ge 6 \,\}
-.
-$$
-The existentially quantified variables can be defined in terms
-of the parameters and variables as
-$$
-\alpha_0 = \floor{\frac{-2 + n}7}
-\qquad
-\text{and}
-\qquad
-\alpha_1 = \floor{\frac{-1 + x}5}
-.
-$$
-$\alpha_0$ can therefore be treated as a parameter,
-while $\alpha_1$ can be treated as a variable.
-This in turn means that $7\alpha_0 = -2 + n$ can be treated as
-a purely parametric constraint, while the other two constraints are
-non-parametric.
-The corresponding $Q$~\eqref{eq:transitive:Q} is therefore
-$$
-\begin{aligned}
-n \to \{\, (x,z) \to (y,w) \mid
-\exists\, \alpha_0, \alpha_1, k, f : {} &
-k \ge 1 \wedge
-y = x + f \wedge
-w = z + k \wedge {} \\
-&
-7\alpha_0 = -2 + n \wedge
-5\alpha_1 = -k + x \wedge
-x \ge 6 k
-\,\}
-.
-\end{aligned}
-$$
-Projecting out the final coordinates encoding the length of the paths,
-results in the exact transitive closure
-$$
-R^+ =
-n \to \{\, x \to y \mid \exists \, \alpha_0, \alpha_1: 7\alpha_1 = -2 + n \wedge 6\alpha_0 \ge -x + y \wedge 5\alpha_0 \le -1 - x + y \,\}
-.
-$$
-\end{example}
-
-The fact that we ignore some impure constraints clearly leads
-to a loss of accuracy.  In some cases, some of this loss can be recovered
-by not considering the parameters in a special way.
-That is, instead of considering the set
-$$
-\Delta = \diff R =
-\vec s \mapsto
-\{\, \vec \delta \in \Z^{d} \mid \exists \vec x \to \vec y \in R :
-\vec \delta = \vec y - \vec x
-\,\}
-$$
-we consider the set
-$$
-\Delta' = \diff R' =
-\{\, \vec \delta \in \Z^{n+d} \mid \exists
-(\vec s, \vec x) \to (\vec s, \vec y) \in R' :
-\vec \delta = (\vec s - \vec s, \vec y - \vec x)
-\,\}
-.
-$$
-The first $n$ coordinates of every element in $\Delta'$ are zero.
-Projecting out these zero coordinates from $\Delta'$ is equivalent
-to projecting out the parameters in $\Delta$.
-The result is obviously a superset of $\Delta$, but all its constraints
-are of type \eqref{eq:transitive:non-parametric} and they can therefore
-all be used in the construction of $Q_i$.
-
-\begin{example}
-Consider the relation
-$$
-% [n] -> { [x, y] -> [1 + x, 1 - n + y] | n >= 2 }
-R = n \to \{\, (x, y) \to (1 + x, 1 - n + y) \mid n \ge 2 \,\}
-.
-$$
-We have
-$$
-\diff R = n \to \{\, (1, 1 - n) \mid n \ge 2 \,\}
-$$
-and so, by treating the parameters in a special way, we obtain
-the following approximation for $R^+$:
-$$
-n \to \{\, (x, y) \to (x', y') \mid n \ge 2 \wedge y' \le 1 - n + y \wedge x' \ge 1 + x \,\}
-.
-$$
-If we consider instead
-$$
-R' = \{\, (n, x, y) \to (n, 1 + x, 1 - n + y) \mid n \ge 2 \,\}
-$$
-then
-$$
-\diff R' = \{\, (0, 1, y) \mid y \le -1 \,\}
-$$
-and we obtain the approximation
-$$
-n \to \{\, (x, y) \to (x', y') \mid n \ge 2 \wedge x' \ge 1 + x \wedge y' \le x + y - x' \,\}
-.
-$$
-If we consider both $\diff R$ and $\diff R'$, then we obtain
-$$
-n \to \{\, (x, y) \to (x', y') \mid n \ge 2 \wedge y' \le 1 - n + y \wedge x' \ge 1 + x \wedge y' \le x + y - x' \,\}
-.
-$$
-Note, however, that this is not the most accurate affine approximation that
-can be obtained.  That would be
-$$
-n \to \{\, (x, y) \to (x', y') \mid y' \le 2 - n + x + y - x' \wedge n \ge 2 \wedge x' \ge 1 + x \,\}
-.
-$$
-\end{example}
-
-\subsection{Checking Exactness}
-
-The approximation $T$ for the transitive closure $R^+$ can be obtained
-by projecting out the parameter $k$ from the approximation $K$
-\eqref{eq:transitive:approx} of the power $R^k$.
-Since $K$ is an overapproximation of $R^k$, $T$ will also be an
-overapproximation of $R^+$.
-To check whether the results are exact, we need to consider two
-cases depending on whether $R$ is {\em cyclic}, where $R$ is defined
-to be cyclic if $R^+$ maps any element to itself, i.e.,
-$R^+ \cap \identity \ne \emptyset$.
-If $R$ is acyclic, then the inductive definition of
-\eqref{eq:transitive:inductive} is equivalent to its completion,
-i.e.,
-$$
-R^+ = R \cup \left(R \circ R^+\right)
-$$
-is a defining property.
-Since $T$ is known to be an overapproximation, we only need to check
-whether
-$$
-T \subseteq R \cup \left(R \circ T\right)
-.
-$$
-This is essentially Theorem~5 of \shortciteN{Kelly1996closure}.
-The only difference is that they only consider lexicographically
-forward relations, a special case of acyclic relations.
-
-If, on the other hand, $R$ is cyclic, then we have to resort
-to checking whether the approximation $K$ of the power is exact.
-Note that $T$ may be exact even if $K$ is not exact, so the check
-is sound, but incomplete.
-To check exactness of the power, we simply need to check
-\eqref{eq:transitive:power}.  Since again $K$ is known
-to be an overapproximation, we only need to check whether
-$$
-\begin{aligned}
-K'|_{y_{d+1} - x_{d+1} = 1} & \subseteq R'
-\\
-K'|_{y_{d+1} - x_{d+1} \ge 2} & \subseteq R' \circ K'|_{y_{d+1} - x_{d+1} \ge 1}
-,
-\end{aligned}
-$$
-where $R' = \{\, \vec x' \to \vec y' \mid \vec x \to \vec y \in R
-\wedge y_{d+1} - x_{d+1} = 1\,\}$, i.e., $R$ extended with path
-lengths equal to 1.
-
-All that remains is to explain how to check the cyclicity of $R$.
-Note that the exactness on the power is always sound, even
-in the acyclic case, so we only need to be careful that we find
-all cyclic cases.  Now, if $R$ is cyclic, i.e.,
-$R^+ \cap \identity \ne \emptyset$, then, since $T$ is
-an overapproximation of $R^+$, also
-$T \cap \identity \ne \emptyset$.  This in turn means
-that $\Delta \, K'$ contains a point whose first $d$ coordinates
-are zero and whose final coordinate is positive.
-In the implementation we currently perform this test on $P'$ instead of $K'$.
-Note that if $R^+$ is acyclic and $T$ is not, then the approximation
-is clearly not exact and the approximation of the power $K$
-will not be exact either.
-
-\subsection{Decomposing $R$ into strongly connected components}
-
-If the input relation $R$ is a union of several basic relations
-that can be partially ordered
-then the accuracy of the approximation may be improved by computing
-an approximation of each strongly connected components separately.
-For example, if $R = R_1 \cup R_2$ and $R_1 \circ R_2 = \emptyset$,
-then we know that any path that passes through $R_2$ cannot later
-pass through $R_1$, i.e.,
-\begin{equation}
-\label{eq:transitive:components}
-R^+ = R_1^+ \cup R_2^+ \cup \left(R_2^+ \circ R_1^+\right)
-.
-\end{equation}
-We can therefore compute (approximations of) transitive closures
-of $R_1$ and $R_2$ separately.
-Note, however, that the condition $R_1 \circ R_2 = \emptyset$
-is actually too strong.
-If $R_1 \circ R_2$ is a subset of $R_2 \circ R_1$
-then we can reorder the segments
-in any path that moves through both $R_1$ and $R_2$ to
-first move through $R_1$ and then through $R_2$.
-
-This idea can be generalized to relations that are unions
-of more than two basic relations by constructing the
-strongly connected components in the graph with as vertices
-the basic relations and an edge between two basic relations
-$R_i$ and $R_j$ if $R_i$ needs to follow $R_j$ in some paths.
-That is, there is an edge from $R_i$ to $R_j$ iff
-\begin{equation}
-\label{eq:transitive:edge}
-R_i \circ R_j
-\not\subseteq
-R_j \circ R_i
-.
-\end{equation}
-The components can be obtained from the graph by applying
-Tarjan's algorithm \shortcite{Tarjan1972}.
-
-In practice, we compute the (extended) powers $K_i'$ of each component
-separately and then compose them as in \eqref{eq:transitive:decompose}.
-Note, however, that in this case the order in which we apply them is
-important and should correspond to a topological ordering of the
-strongly connected components.  Simply applying Tarjan's
-algorithm will produce topologically sorted strongly connected components.
-The graph on which Tarjan's algorithm is applied is constructed on-the-fly.
-That is, whenever the algorithm checks if there is an edge between
-two vertices, we evaluate \eqref{eq:transitive:edge}.
-The exactness check is performed on each component separately.
-If the approximation turns out to be inexact for any of the components,
-then the entire result is marked inexact and the exactness check
-is skipped on the components that still need to be handled.
-
-It should be noted that \eqref{eq:transitive:components}
-is only valid for exact transitive closures.
-If overapproximations are computed in the right hand side, then the result will
-still be an overapproximation of the left hand side, but this result
-may not be transitively closed.  If we only separate components based
-on the condition $R_i \circ R_j = \emptyset$, then there is no problem,
-as this condition will still hold on the computed approximations
-of the transitive closures.  If, however, we have exploited
-\eqref{eq:transitive:edge} during the decomposition and if the
-result turns out not to be exact, then we check whether
-the result is transitively closed.  If not, we recompute
-the transitive closure, skipping the decomposition.
-Note that testing for transitive closedness on the result may
-be fairly expensive, so we may want to make this check
-configurable.
-
-\begin{figure}
-\begin{center}
-\begin{tikzpicture}[x=0.5cm,y=0.5cm,>=stealth,shorten >=1pt]
-\foreach \x in {1,...,10}{
-    \foreach \y in {1,...,10}{
-	\draw[->] (\x,\y) -- (\x,\y+1);
-    }
-}
-\foreach \x in {1,...,20}{
-    \foreach \y in {5,...,15}{
-	\draw[->] (\x,\y) -- (\x+1,\y);
-    }
-}
-\end{tikzpicture}
-\end{center}
-\caption{The relation from \autoref{ex:closure4}}
-\label{f:closure4}
-\end{figure}
-\begin{example}
-\label{ex:closure4}
-Consider the relation in example {\tt closure4} that comes with
-the Omega calculator~\shortcite{Omega_calc}, $R = R_1 \cup R_2$,
-with
-$$
-\begin{aligned}
-R_1 & = \{\, (x,y) \to (x,y+1) \mid 1 \le x,y \le 10 \,\}
-\\
-R_2 & = \{\, (x,y) \to (x+1,y) \mid 1 \le x \le 20 \wedge 5 \le y \le 15 \,\}
-.
-\end{aligned}
-$$
-This relation is shown graphically in \autoref{f:closure4}.
-We have
-$$
-\begin{aligned}
-R_1 \circ R_2 &=
-\{\, (x,y) \to (x+1,y+1) \mid 1 \le x \le 9 \wedge 5 \le y \le 10 \,\}
-\\
-R_2 \circ R_1 &=
-\{\, (x,y) \to (x+1,y+1) \mid 1 \le x \le 10 \wedge 4 \le y \le 10 \,\}
-.
-\end{aligned}
-$$
-Clearly, $R_1 \circ R_2 \subseteq R_2 \circ R_1$ and so
-$$
-\left(
-R_1 \cup R_2
-\right)^+
-=
-\left(R_2^+ \circ R_1^+\right)
-\cup R_1^+
-\cup R_2^+
-.
-$$
-\end{example}
-
-\begin{figure}
-\newcounter{n}
-\newcounter{t1}
-\newcounter{t2}
-\newcounter{t3}
-\newcounter{t4}
-\begin{center}
-\begin{tikzpicture}[>=stealth,shorten >=1pt]
-\setcounter{n}{7}
-\foreach \i in {1,...,\value{n}}{
-    \foreach \j in {1,...,\value{n}}{
-	\setcounter{t1}{2 * \j - 4 - \i + 1}
-	\setcounter{t2}{\value{n} - 3 - \i + 1}
-	\setcounter{t3}{2 * \i - 1 - \j + 1}
-	\setcounter{t4}{\value{n} - \j + 1}
-	\ifnum\value{t1}>0\ifnum\value{t2}>0
-	\ifnum\value{t3}>0\ifnum\value{t4}>0
-	    \draw[thick,->] (\i,\j) to[out=20] (\i+3,\j);
-	\fi\fi\fi\fi
-	\setcounter{t1}{2 * \j - 1 - \i + 1}
-	\setcounter{t2}{\value{n} - \i + 1}
-	\setcounter{t3}{2 * \i - 4 - \j + 1}
-	\setcounter{t4}{\value{n} - 3 - \j + 1}
-	\ifnum\value{t1}>0\ifnum\value{t2}>0
-	\ifnum\value{t3}>0\ifnum\value{t4}>0
-	    \draw[thick,->] (\i,\j) to[in=-20,out=20] (\i,\j+3);
-	\fi\fi\fi\fi
-	\setcounter{t1}{2 * \j - 1 - \i + 1}
-	\setcounter{t2}{\value{n} - 1 - \i + 1}
-	\setcounter{t3}{2 * \i - 1 - \j + 1}
-	\setcounter{t4}{\value{n} - 1 - \j + 1}
-	\ifnum\value{t1}>0\ifnum\value{t2}>0
-	\ifnum\value{t3}>0\ifnum\value{t4}>0
-	    \draw[thick,->] (\i,\j) to (\i+1,\j+1);
-	\fi\fi\fi\fi
-    }
-}
-\end{tikzpicture}
-\end{center}
-\caption{The relation from \autoref{ex:decomposition}}
-\label{f:decomposition}
-\end{figure}
-\begin{example}
-\label{ex:decomposition}
-Consider the relation on the right of \shortciteN[Figure~2]{Beletska2009},
-reproduced in \autoref{f:decomposition}.
-The relation can be described as $R = R_1 \cup R_2 \cup R_3$,
-with
-$$
-\begin{aligned}
-R_1 &= n \mapsto \{\, (i,j) \to (i+3,j) \mid
-i \le 2 j - 4 \wedge
-i \le n - 3 \wedge
-j \le 2 i - 1 \wedge
-j \le n \,\}
-\\
-R_2 &= n \mapsto \{\, (i,j) \to (i,j+3) \mid
-i \le 2 j - 1 \wedge
-i \le n \wedge
-j \le 2 i - 4 \wedge
-j \le n - 3 \,\}
-\\
-R_3 &= n \mapsto \{\, (i,j) \to (i+1,j+1) \mid
-i \le 2 j - 1 \wedge
-i \le n - 1 \wedge
-j \le 2 i - 1 \wedge
-j \le n - 1\,\}
-.
-\end{aligned}
-$$
-The figure shows this relation for $n = 7$.
-Both
-$R_3 \circ R_1 \subseteq R_1 \circ R_3$
-and
-$R_3 \circ R_2 \subseteq R_2 \circ R_3$,
-which the reader can verify using the {\tt iscc} calculator:
-\begin{verbatim}
-R1 := [n] -> { [i,j] -> [i+3,j] : i <= 2 j - 4 and i <= n - 3 and
-                                  j <= 2 i - 1 and j <= n };
-R2 := [n] -> { [i,j] -> [i,j+3] : i <= 2 j - 1 and i <= n and
-                                  j <= 2 i - 4 and j <= n - 3 };
-R3 := [n] -> { [i,j] -> [i+1,j+1] : i <= 2 j - 1 and i <= n - 1 and
-                                    j <= 2 i - 1 and j <= n - 1 };
-(R1 . R3) - (R3 . R1);
-(R2 . R3) - (R3 . R2);
-\end{verbatim}
-$R_3$ can therefore be moved forward in any path.
-For the other two basic relations, we have both
-$R_2 \circ R_1 \not\subseteq R_1 \circ R_2$
-and
-$R_1 \circ R_2 \not\subseteq R_2 \circ R_1$
-and so $R_1$ and $R_2$ form a strongly connected component.
-By computing the power of $R_3$ and $R_1 \cup R_2$ separately
-and composing the results, the power of $R$ can be computed exactly
-using \eqref{eq:transitive:singleton}.
-As explained by \shortciteN{Beletska2009}, applying the same formula
-to $R$ directly, without a decomposition, would result in
-an overapproximation of the power.
-\end{example}
-
-\subsection{Partitioning the domains and ranges of $R$}
-
-The algorithm of \autoref{s:power} assumes that the input relation $R$
-can be treated as a union of translations.
-This is a reasonable assumption if $R$ maps elements of a given
-abstract domain to the same domain.
-However, if $R$ is a union of relations that map between different
-domains, then this assumption no longer holds.
-In particular, when an entire dependence graph is encoded
-in a single relation, as is done by, e.g.,
-\shortciteN[Section~6.1]{Barthou2000MSE}, then it does not make
-sense to look at differences between iterations of different domains.
-Now, arguably, a modified Floyd-Warshall algorithm should
-be applied to the dependence graph, as advocated by
-\shortciteN{Kelly1996closure}, with the transitive closure operation
-only being applied to relations from a given domain to itself.
-However, it is also possible to detect disjoint domains and ranges
-and to apply Floyd-Warshall internally.
-
-\linesnumbered
-\begin{algorithm}
-\caption{The modified Floyd-Warshall algorithm of
-\protect\shortciteN{Kelly1996closure}}
-\label{a:Floyd}
-\SetKwInput{Input}{Input}
-\SetKwInput{Output}{Output}
-\Input{Relations $R_{pq}$, $0 \le p, q < n$}
-\Output{Updated relations $R_{pq}$ such that each relation
-$R_{pq}$ contains all indirect paths from $p$ to $q$ in the input graph}
-%
-\BlankLine
-\SetVline
-\dontprintsemicolon
-%
-\For{$r \in [0, n-1]$}{
-    $R_{rr} \coloneqq R_{rr}^+$ \nllabel{l:Floyd:closure}\;
-    \For{$p \in [0, n-1]$}{
-	\For{$q \in [0, n-1]$}{
-	    \If{$p \ne r$ or $q \ne r$}{
-		$R_{pq} \coloneqq R_{pq} \cup \left(R_{rq} \circ R_{pr}\right)
-			     \cup \left(R_{rq} \circ R_{rr} \circ R_{pr}\right)$
-	     \nllabel{l:Floyd:update}
-	     }
-	}
-    }
-}
-\end{algorithm}
-
-Let the input relation $R$ be a union of $m$ basic relations $R_i$.
-Let $D_{2i}$ be the domains of $R_i$ and $D_{2i+1}$ the ranges of $R_i$.
-The first step is to group overlapping $D_j$ until a partition is
-obtained.  If the resulting partition consists of a single part,
-then we continue with the algorithm of \autoref{s:power}.
-Otherwise, we apply Floyd-Warshall on the graph with as vertices
-the parts of the partition and as edges the $R_i$ attached to
-the appropriate pairs of vertices.
-In particular, let there be $n$ parts $P_k$ in the partition.
-We construct $n^2$ relations
-$$
-R_{pq} \coloneqq \bigcup_{i \text{ s.t. } \domain R_i \subseteq P_p \wedge
-				 \range R_i \subseteq P_q} R_i
-,
-$$
-apply \autoref{a:Floyd} and return the union of all resulting
-$R_{pq}$ as the transitive closure of $R$.
-Each iteration of the $r$-loop in \autoref{a:Floyd} updates
-all relations $R_{pq}$ to include paths that go from $p$ to $r$,
-possibly stay there for a while, and then go from $r$ to $q$.
-Note that paths that ``stay in $r$'' include all paths that
-pass through earlier vertices since $R_{rr}$ itself has been updated
-accordingly in previous iterations of the outer loop.
-In principle, it would be sufficient to use the $R_{pr}$
-and $R_{rq}$ computed in the previous iteration of the
-$r$-loop in Line~\ref{l:Floyd:update}.
-However, from an implementation perspective, it is easier
-to allow either or both of these to have been updated
-in the same iteration of the $r$-loop.
-This may result in duplicate paths, but these can usually
-be removed by coalescing (\autoref{s:coalescing}) the result of the union
-in Line~\ref{l:Floyd:update}, which should be done in any case.
-The transitive closure in Line~\ref{l:Floyd:closure}
-is performed using a recursive call.  This recursive call
-includes the partitioning step, but the resulting partition will
-usually be a singleton.
-The result of the recursive call will either be exact or an
-overapproximation.  The final result of Floyd-Warshall is therefore
-also exact or an overapproximation.
-
-\begin{figure}
-\begin{center}
-\begin{tikzpicture}[x=1cm,y=1cm,>=stealth,shorten >=3pt]
-\foreach \x/\y in {0/0,1/1,3/2} {
-    \fill (\x,\y) circle (2pt);
-}
-\foreach \x/\y in {0/1,2/2,3/3} {
-    \draw (\x,\y) circle (2pt);
-}
-\draw[->] (0,0) -- (0,1);
-\draw[->] (0,1) -- (1,1);
-\draw[->] (2,2) -- (3,2);
-\draw[->] (3,2) -- (3,3);
-\draw[->,dashed] (2,2) -- (3,3);
-\draw[->,dotted] (0,0) -- (1,1);
-\end{tikzpicture}
-\end{center}
-\caption{The relation (solid arrows) on the right of Figure~1 of
-\protect\shortciteN{Beletska2009} and its transitive closure}
-\label{f:COCOA:1}
-\end{figure}
-\begin{example}
-Consider the relation on the right of Figure~1 of
-\shortciteN{Beletska2009},
-reproduced in \autoref{f:COCOA:1}.
-This relation can be described as
-$$
-\begin{aligned}
-\{\, (x, y) \to (x_2, y_2) \mid {} & (3y = 2x \wedge x_2 = x \wedge 3y_2 = 3 + 2x \wedge x \ge 0 \wedge x \le 3) \vee {} \\
-& (x_2 = 1 + x \wedge y_2 = y \wedge x \ge 0 \wedge 3y \ge 2 + 2x \wedge x \le 2 \wedge 3y \le 3 + 2x) \,\}
-.
-\end{aligned}
-$$
-Note that the domain of the upward relation overlaps with the range
-of the rightward relation and vice versa, but that the domain
-of neither relation overlaps with its own range or the domain of
-the other relation.
-The domains and ranges can therefore be partitioned into two parts,
-$P_0$ and $P_1$, shown as the white and black dots in \autoref{f:COCOA:1},
-respectively.
-Initially, we have
-$$
-\begin{aligned}
-R_{00} & = \emptyset
-\\
-R_{01} & = 
-\{\, (x, y) \to (x+1, y) \mid 
-(x \ge 0 \wedge 3y \ge 2 + 2x \wedge x \le 2 \wedge 3y \le 3 + 2x) \,\}
-\\
-R_{10} & =
-\{\, (x, y) \to (x_2, y_2) \mid (3y = 2x \wedge x_2 = x \wedge 3y_2 = 3 + 2x \wedge x \ge 0 \wedge x \le 3) \,\}
-\\
-R_{11} & = \emptyset
-.
-\end{aligned}
-$$
-In the first iteration, $R_{00}$ remains the same ($\emptyset^+ = \emptyset$).
-$R_{01}$ and $R_{10}$ are therefore also unaffected, but
-$R_{11}$ is updated to include $R_{01} \circ R_{10}$, i.e.,
-the dashed arrow in the figure.
-This new $R_{11}$ is obviously transitively closed, so it is not
-changed in the second iteration and it does not have an effect
-on $R_{01}$ and $R_{10}$.  However, $R_{00}$ is updated to
-include $R_{10} \circ R_{01}$, i.e., the dotted arrow in the figure.
-The transitive closure of the original relation is then equal to
-$R_{00} \cup R_{01} \cup R_{10} \cup R_{11}$.
-\end{example}
-
-\subsection{Incremental Computation}
-\label{s:incremental}
-
-In some cases it is possible and useful to compute the transitive closure
-of union of basic relations incrementally.  In particular,
-if $R$ is a union of $m$ basic maps,
-$$
-R = \bigcup_j R_j
-,
-$$
-then we can pick some $R_i$ and compute the transitive closure of $R$ as
-\begin{equation}
-\label{eq:transitive:incremental}
-R^+ = R_i^+ \cup
-\left(
-\bigcup_{j \ne i}
-R_i^* \circ R_j \circ R_i^*
-\right)^+
-.
-\end{equation}
-For this approach to be successful, it is crucial that each
-of the disjuncts in the argument of the second transitive
-closure in \eqref{eq:transitive:incremental} be representable
-as a single basic relation, i.e., without a union.
-If this condition holds, then by using \eqref{eq:transitive:incremental},
-the number of disjuncts in the argument of the transitive closure
-can be reduced by one.
-Now, $R_i^* = R_i^+ \cup \identity$, but in some cases it is possible
-to relax the constraints of $R_i^+$ to include part of the identity relation,
-say on domain $D$.  We will use the notation
-${\cal C}(R_i,D) = R_i^+ \cup \identity_D$ to represent
-this relaxed version of $R^+$.
-\shortciteN{Kelly1996closure} use the notation $R_i^?$.
-${\cal C}(R_i,D)$ can be computed by allowing $k$ to attain
-the value $0$ in \eqref{eq:transitive:Q} and by using
-$$
-P \cap \left(D \to D\right)
-$$
-instead of \eqref{eq:transitive:approx}.
-Typically, $D$ will be a strict superset of both $\domain R_i$
-and $\range R_i$.  We therefore need to check that domain
-and range of the transitive closure are part of ${\cal C}(R_i,D)$,
-i.e., the part that results from the paths of positive length ($k \ge 1$),
-are equal to the domain and range of $R_i$.
-If not, then the incremental approach cannot be applied for
-the given choice of $R_i$ and $D$.
-
-In order to be able to replace $R^*$ by ${\cal C}(R_i,D)$
-in \eqref{eq:transitive:incremental}, $D$ should be chosen
-to include both $\domain R$ and $\range R$, i.e., such
-that $\identity_D \circ R_j \circ \identity_D = R_j$ for all $j\ne i$.
-\shortciteN{Kelly1996closure} say that they use
-$D = \domain R_i \cup \range R_i$, but presumably they mean that
-they use $D = \domain R \cup \range R$.
-Now, this expression of $D$ contains a union, so it not directly usable.
-\shortciteN{Kelly1996closure} do not explain how they avoid this union.
-Apparently, in their implementation,
-they are using the convex hull of $\domain R \cup \range R$
-or at least an approximation of this convex hull.
-We use the simple hull (\autoref{s:simple hull}) of $\domain R \cup \range R$.
-
-It is also possible to use a domain $D$ that does {\em not\/}
-include $\domain R \cup \range R$, but then we have to
-compose with ${\cal C}(R_i,D)$ more selectively.
-In particular, if we have
-\begin{equation}
-\label{eq:transitive:right}
-\text{for each $j \ne i$ either }
-\domain R_j \subseteq D \text{ or } \domain R_j \cap \range R_i = \emptyset
-\end{equation}
-and, similarly,
-\begin{equation}
-\label{eq:transitive:left}
-\text{for each $j \ne i$ either }
-\range R_j \subseteq D \text{ or } \range R_j \cap \domain R_i = \emptyset
-\end{equation}
-then we can refine \eqref{eq:transitive:incremental} to
-$$
-R_i^+ \cup
-\left(
-\left(
-\bigcup_{\shortstack{$\scriptstyle\domain R_j \subseteq D $\\
-		     $\scriptstyle\range R_j \subseteq D$}}
-{\cal C} \circ R_j \circ {\cal C}
-\right)
-\cup
-\left(
-\bigcup_{\shortstack{$\scriptstyle\domain R_j \cap \range R_i = \emptyset$\\
-		     $\scriptstyle\range R_j \subseteq D$}}
-\!\!\!\!\!
-{\cal C} \circ R_j
-\right)
-\cup
-\left(
-\bigcup_{\shortstack{$\scriptstyle\domain R_j \subseteq D $\\
-		     $\scriptstyle\range R_j \cap \domain R_i = \emptyset$}}
-\!\!\!\!\!
-R_j \circ {\cal C}
-\right)
-\cup
-\left(
-\bigcup_{\shortstack{$\scriptstyle\domain R_j \cap \range R_i = \emptyset$\\
-		     $\scriptstyle\range R_j \cap \domain R_i = \emptyset$}}
-\!\!\!\!\!
-R_j
-\right)
-\right)^+
-.
-$$
-If only property~\eqref{eq:transitive:right} holds,
-we can use
-$$
-R_i^+ \cup
-\left(
-\left(
-R_i^+ \cup \identity
-\right)
-\circ
-\left(
-\left(
-\bigcup_{\shortstack{$\scriptstyle\domain R_j \subseteq D $}}
-R_j \circ {\cal C}
-\right)
-\cup
-\left(
-\bigcup_{\shortstack{$\scriptstyle\domain R_j \cap \range R_i = \emptyset$}}
-\!\!\!\!\!
-R_j
-\right)
-\right)^+
-\right)
-,
-$$
-while if only property~\eqref{eq:transitive:left} holds,
-we can use
-$$
-R_i^+ \cup
-\left(
-\left(
-\left(
-\bigcup_{\shortstack{$\scriptstyle\range R_j \subseteq D $}}
-{\cal C} \circ R_j
-\right)
-\cup
-\left(
-\bigcup_{\shortstack{$\scriptstyle\range R_j \cap \domain R_i = \emptyset$}}
-\!\!\!\!\!
-R_j
-\right)
-\right)^+
-\circ
-\left(
-R_i^+ \cup \identity
-\right)
-\right)
-.
-$$
-
-It should be noted that if we want the result of the incremental
-approach to be transitively closed, then we can only apply it
-if all of the transitive closure operations involved are exact.
-If, say, the second transitive closure in \eqref{eq:transitive:incremental}
-contains extra elements, then the result does not necessarily contain
-the composition of these extra elements with powers of $R_i$.
-
-\subsection{An {\tt Omega}-like implementation}
-
-While the main algorithm of \shortciteN{Kelly1996closure} is
-designed to compute and underapproximation of the transitive closure,
-the authors mention that they could also compute overapproximations.
-In this section, we describe our implementation of an algorithm
-that is based on their ideas.
-Note that the {\tt Omega} library computes underapproximations
-\shortcite[Section 6.4]{Omega_lib}.
-
-The main tool is Equation~(2) of \shortciteN{Kelly1996closure}.
-The input relation $R$ is first overapproximated by a ``d-form'' relation
-$$
-\{\, \vec i \to \vec j \mid \exists \vec \alpha :
-\vec L \le \vec j - \vec i \le \vec U
-\wedge
-(\forall p : j_p - i_p = M_p \alpha_p)
-\,\}
-,
-$$
-where $p$ ranges over the dimensions and $\vec L$, $\vec U$ and
-$\vec M$ are constant integer vectors.  The elements of $\vec U$
-may be $\infty$, meaning that there is no upper bound corresponding
-to that element, and similarly for $\vec L$.
-Such an overapproximation can be obtained by computing strides,
-lower and upper bounds on the difference set $\Delta \, R$.
-The transitive closure of such a ``d-form'' relation is
-\begin{equation}
-\label{eq:omega}
-\{\, \vec i \to \vec j \mid \exists \vec \alpha, k :
-k \ge 1 \wedge
-k \, \vec L \le \vec j - \vec i \le k \, \vec U
-\wedge
-(\forall p : j_p - i_p = M_p \alpha_p)
-\,\}
-.
-\end{equation}
-The domain and range of this transitive closure are then
-intersected with those of the input relation.
-This is a special case of the algorithm in \autoref{s:power}.
-
-In their algorithm for computing lower bounds, the authors
-use the above algorithm as a substep on the disjuncts in the relation.
-At the end, they say
-\begin{quote}
-If an upper bound is required, it can be calculated in a manner
-similar to that of a single conjunct [sic] relation.
-\end{quote}
-Presumably, the authors mean that a ``d-form'' approximation
-of the whole input relation should be used.
-However, the accuracy can be improved by also trying to
-apply the incremental technique from the same paper,
-which is explained in more detail in \autoref{s:incremental}.
-In this case, ${\cal C}(R_i,D)$ can be obtained by
-allowing the value zero for $k$ in \eqref{eq:omega},
-i.e., by computing
-$$
-\{\, \vec i \to \vec j \mid \exists \vec \alpha, k :
-k \ge 0 \wedge
-k \, \vec L \le \vec j - \vec i \le k \, \vec U
-\wedge
-(\forall p : j_p - i_p = M_p \alpha_p)
-\,\}
-.
-$$
-In our implementation we take as $D$ the simple hull
-(\autoref{s:simple hull}) of $\domain R \cup \range R$.
-To determine whether it is safe to use ${\cal C}(R_i,D)$,
-we check the following conditions, as proposed by
-\shortciteN{Kelly1996closure}:
-${\cal C}(R_i,D) - R_i^+$ is not a union and for each $j \ne i$
-the condition
-$$
-\left({\cal C}(R_i,D) - R_i^+\right)
-\circ
-R_j
-\circ
-\left({\cal C}(R_i,D) - R_i^+\right)
-=
-R_j
-$$
-holds.
diff --git a/cloog-0.17.0/isl/doc/isl.bib b/cloog-0.17.0/isl/doc/isl.bib
deleted file mode 100644
index cfe8081..0000000
--- a/cloog-0.17.0/isl/doc/isl.bib
+++ /dev/null
@@ -1,313 +0,0 @@
-@inproceedings{Kelly1996closure,
-  author    = {Wayne Kelly and
-               William Pugh and
-               Evan Rosser and
-               Tatiana Shpeisman},
-  title     = {Transitive Closure of Infinite Graphs and Its Applications},
-  pages     = {126-140},
-  editor    = {Chua-Huang Huang and
-               P. Sadayappan and
-               Utpal Banerjee and
-               David Gelernter and
-               Alexandru Nicolau and
-               David A. Padua},
-  booktitle = {Languages and Compilers for Parallel Computing, 8th International
-               Workshop, LCPC'95, Columbus, Ohio, USA, August 10-12, 1995,
-               Proceedings},
-  publisher = {Springer},
-  series    = {Lecture Notes in Computer Science},
-  volume    = {1033},
-  year      = {1996},
-  isbn      = {3-540-60765-X},
-}
-
-@inproceedings{Beletska2009,
-  author = {Beletska, Anna and Barthou, Denis and Bielecki, Wlodzimierz and Cohen, Albert},
-  title = {Computing the Transitive Closure of a Union of Affine Integer Tuple Relations},
-  booktitle = {COCOA '09: Proceedings of the 3rd International Conference on Combinatorial Optimization and Applications},
-  year = {2009},
-  isbn = {978-3-642-02025-4},
-  pages = {98--109},
-  location = {Huangshan, China},
-  doi = {10.1007/978-3-642-02026-1_9},
-  publisher = {Springer-Verlag},
-  address = {Berlin, Heidelberg},
-}
-
-@book{Schrijver1986,
-    author  =	"Schrijver, Alexander",
-    title   =	"Theory of Linear and Integer Programming",
-    publisher	=   "John Wiley \& Sons",
-    year    =	1986
-}
-
-@article{Tarjan1972,
-    author = {Tarjan, Robert},
-    journal = {SIAM Journal on Computing},
-    number = {2},
-    pages = {146--160},
-    publisher = {SIAM},
-    title = {Depth-First Search and Linear Graph Algorithms},
-    volume = {1},
-    year = {1972}
-}
-
-@TechReport{ Omega_calc,
-    author = "Wayne Kelly and Vadim Maslov and William Pugh and Evan Rosser and Tatiana Shpeisman and Dave Wonnacott",
-    title = "The {Omega} Calculator and Library",
-    month = nov,
-    institution = "University of Maryland",
-    year = 1996
-}
-
-@TechReport{ Omega_lib,
-    author = "Wayne Kelly and Vadim Maslov and William Pugh and Evan Rosser and Tatiana Shpeisman and Dave Wonnacott",
-    title = "The {Omega} Library",
-    month = nov,
-    institution = "University of Maryland",
-    year = 1996
-}
-
-@unpublished{Verdoolaege2009isl,
-  author = "Verdoolaege, Sven",
-  title = "An integer set library for program analysis",
-  note = "Advances in the Theory of Integer Linear Optimization and its Extensions,AMS 2009 Spring Western Section Meeting, San Francisco, California, 25-26 April 2009",
-  month = Apr,
-  year = "2009",
-  url = "https://lirias.kuleuven.be/handle/123456789/228373",
-}
-
-@article{Barthou2000MSE,
-  author = {Barthou, Denis and Cohen, Albert and Collard, Jean-Fran\c{c}ois},
-  title = {Maximal Static Expansion},
-  journal = {Int. J. Parallel Program.},
-  volume = {28},
-  number = {3},
-  year = {2000},
-  issn = {0885-7458},
-  pages = {213--243},
-  doi = {10.1023/A:1007500431910},
-  publisher = {Kluwer Academic Publishers},
-  address = {Norwell, MA, USA},
-}
-
-@article{ Feautrier88parametric,
-    author = "P. Feautrier",
-    title = "Parametric Integer Programming",
-    journal = "RAIRO Recherche Op\'erationnelle",
-    volume = "22",
-    number = "3",
-    pages = "243--268",
-    year = "1988",
-}
-
-@Article{ Fea91,
-  author =       {Feautrier, P.},
-  title =        {Dataflow analysis of array and scalar references},
-  journal =      {International Journal of Parallel Programming},
-  year =         {1991},
-  OPTkey =         {},
-  volume =       {20},
-  number =       {1},
-  OPTmonth =     {},
-  pages =        {23--53},
-  OPTnote =      {},
-  OPTannote =    {},
-}
-
-@INPROCEEDINGS{BouletRe98,
-  AUTHOR = {Pierre Boulet and Xavier Redon},
-  TITLE = {Communication Pre-evaluation in {HPF}},
-  BOOKTITLE = {EUROPAR'98},
-  PAGES = {263--272},
-  YEAR = 1998,
-  VOLUME = 1470,
-  series =	 {Lecture Notes in Computer Science},
-  PUBLISHER = {Springer-Verlag, Berlin},
-  ABSTRACT = {  Parallel computers are difficult to program efficiently.  We believe
-  that a good way to help programmers write efficient programs is to
-  provide them with tools that show them how their programs behave on
-  a parallel computer.  Data distribution is the major performance
-  factor of data-parallel programs and so automatic data layout for
-  HPF programs has been studied by many researchers recently.  The
-  communication volume induced by a data distribution is a good
-  estimator of the efficiency of this data distribution.
-
-  We present here a symbolic method to compute the communication
-  volume generated by a given data distribution during the program
-  writing phase (before compilation). We stay machine-independent to
-  assure portability.  Our goal is to help the programmer understand
-  the data movements its program generates and thus find a good data
-  distribution. Our method is based on parametric polyhedral
-  computations. It can be applied to a large class of regular codes.},
-}
-
-@INPROCEEDINGS {Verdoolaege2005experiences,
-  AUTHOR = "Verdoolaege, Sven and Beyls, Kristof and Bruynooghe, Maurice and Catthoor, Francky",
-  TITLE = {{E}xperiences with enumeration of integer projections of parametric polytopes},
-  BOOKTITLE = {{P}roceedings of 14th {I}nternational {C}onference on {C}ompiler {C}onstruction, {E}dinburgh, {S}cotland},
-  YEAR = {2005},
-  EDITOR = {Bodik, R.},
-  VOLUME = 3443,
-    pages = "91-105",
-    series = "Lecture Notes in Computer Science",
-    publisher = "Springer-Verlag",
-    address = "Berlin",
-    doi = "10.1007/b107108",
-}
-
-@article{Detlefs2005simplify,
- author = {David Detlefs and Greg Nelson and James B. Saxe},
- title = {Simplify: a theorem prover for program checking},
- journal = {J. ACM},
- volume = {52},
- number = {3},
- year = {2005},
- issn = {0004-5411},
- pages = {365--473},
- doi = {10.1145/1066100.1066102},
- publisher = {ACM},
- address = {New York, NY, USA},
- }
-
-@phdthesis{Nelson1980phd,
- author = {Charles Gregory Nelson},
- title = {Techniques for program verification},
- year = {1980},
- order_no = {AAI8011683},
- school = {Stanford University},
- address = {Stanford, CA, USA},
- }
-
-@article{Woods2003short,
-    year = 2003,
-    Journal = "J. Amer. Math. Soc.",
-    volume =  16,
-    pages = "957--979",
-    month = apr,
-    title = {{Short rational generating functions for lattice point
-        problems}},
-    author = {Alexander Barvinok and Kevin Woods},
-}
-
-@misc{barvinok-0.22,
-  author = {Sven Verdoolaege},
-  title = {{\texttt{barvinok}}, version 0.22},
-  howpublished = {Available from \url{http://freshmeat.net/projects/barvinok/}},
-  year = 2006
-}
-
-@inproceedings{DeLoera2004Three,
-    title = "Three Kinds of Integer Programming Algorithms based on Barvinok's Rational Functions",
-    author = "De Loera, J. A. and D. Haws and R. Hemmecke and P. Huggins and R. Yoshida",
-    booktitle = "Integer Programming and Combinatorial Optimization: 10th International IPCO Conference",
-    year = "2004",
-    month = jan,
-    series = "Lecture Notes in Computer Science",
-    Volume = 3064,
-    Pages = "244-255",
-}
-
-@TechReport{Feautrier02,
-  author = 	 {P. Feautrier and J. Collard and C. Bastoul},
-  title = 	 {Solving systems of affine (in)equalities},
-  institution =  {PRiSM, Versailles University},
-  year = 	 2002
-}
-
-@article{ Feautrier92multi,
-    author = "Paul Feautrier",
-    title = "Some Efficient Solutions to the Affine Scheduling Problem. {P}art {II}. Multidimensional Time",
-    journal = "International Journal of Parallel Programming",
-    volume = "21",
-    number = "6",
-    pages = "389--420",
-    year = "1992",
-    month = dec,
-    url = "citeseer.nj.nec.com/article/feautrier92some.html",
-}
-
-@misc{Bygde2010licentiate,
-   author = {Stefan Bygde},
-   title = {Static {WCET} Analysis based on Abstract Interpretation and Counting of Elements},
-   month = {March},
-   year = {2010},
-   howpublished = {Licentiate thesis},
-   publisher = {M{\"{a}}lardalen University Press},
-   url = {http://www.mrtc.mdh.se/index.php?choice=publications&id=2144},
-}
-
-@phdthesis{Meister2004PhD,
-	title = {Stating and Manipulating Periodicity in the Polytope Model. Applications to Program Analysis and Optimization},
-	author= {Beno\^it Meister},
- 	school = {Universit\'e Louis Pasteur},
-	month = Dec,
-	year  = {2004},
-}
-
-@inproceedings{Meister2008,
-  author = {Beno\^it Meister and Sven Verdoolaege},
-  title = {Polynomial Approximations in the Polytope Model: Bringing the Power
-  of Quasi-Polynomials to the Masses},
-  year = {2008},
-  booktitle = {Digest of the 6th Workshop on Optimization for DSP and Embedded Systems, ODES-6},
-  editor = "Jagadeesh Sankaran and Vander Aa, Tom",
-  month = apr,
-}
-
-@misc{Galea2009personal,
-    author = "Fran\c{c}ois Galea",
-    title = "personal communication",
-    year = 2009,
-    month = nov,
-}
-
-@misc{PPL,
-  author = "R. Bagnara and P. M. Hill and E. Zaffanella",
-  title = "The {Parma Polyhedra Library}",
-  howpublished = {\url{http://www.cs.unipr.it/ppl/}},
-}
-
-@TECHREPORT{Cook1991implementation,
-AUTHOR={William Cook and Thomas Rutherford and Herbert E. Scarf and David F. Shallcross},
-TITLE={An Implementation of the Generalized Basis Reduction Algorithm for Integer Programming},
-YEAR=1991,
-MONTH=Aug,
-INSTITUTION={Cowles Foundation, Yale University},
-TYPE={Cowles Foundation Discussion Papers},
-NOTE={available at \url{http://ideas.repec.org/p/cwl/cwldpp/990.html}},
-NUMBER={990},
-}
-
- @article{Karr1976affine,
-author={ Michael Karr},
-title={ Affine Relationships Among Variables of a Program },
-journal={Acta Informatica},
-Volume={6},
-pages={133-151},
-year={1976},
-publisher={Springer-Verlag},
-ignore={ },
-}
-
-@PhdThesis{Verhaegh1995PhD,
-	title = "Multidimensional Periodic Scheduling",
-	author = "Wim F. J. Verhaegh",
-	school = "Technische Universiteit Eindhoven",
-	year = 1995,
-}
-
-@INPROCEEDINGS{Seghir2006minimizing,
-  AUTHOR = "Rachid Seghir and Vincent Loechner",
-  TITLE = {Memory Optimization by Counting Points in Integer Transformations of Parametric Polytopes},
-  BOOKTITLE = {{P}roceedings of the {I}nternational {C}onference on {C}ompilers, {A}rchitectures, and {S}ynthesis for {E}mbedded Systems, CASES 2006, {S}eoul, {K}orea},
-  month = oct,
-  YEAR = {2006}
-}
-
-@misc{DeSmet2010personal,
-    author = "De Smet, Sven",
-    title = "personal communication",
-    year = 2010,
-    month = apr,
-}
diff --git a/cloog-0.17.0/isl/doc/manual.pdf b/cloog-0.17.0/isl/doc/manual.pdf
deleted file mode 100644
index 3bd2207..0000000
--- a/cloog-0.17.0/isl/doc/manual.pdf
+++ /dev/null
Binary files differ
diff --git a/cloog-0.17.0/isl/doc/manual.tex b/cloog-0.17.0/isl/doc/manual.tex
deleted file mode 100644
index 91b3db0..0000000
--- a/cloog-0.17.0/isl/doc/manual.tex
+++ /dev/null
@@ -1,75 +0,0 @@
-\documentclass{report}
-\usepackage[plainpages=false,pdfpagelabels,breaklinks,pagebackref]{hyperref}
-\usepackage{amsmath}
-\usepackage{amssymb}
-\usepackage{txfonts}
-\usepackage{chicago}
-\usepackage{aliascnt}
-\usepackage{tikz}
-\usepackage{calc}
-\usepackage[ruled]{algorithm2e}
-\usetikzlibrary{matrix,fit,backgrounds,decorations.pathmorphing,positioning}
-\usepackage{listings}
-
-\lstset{basicstyle=\tt,flexiblecolumns=false}
-
-\def\vec#1{\mathchoice{\mbox{\boldmath$\displaystyle\bf#1$}}
-{\mbox{\boldmath$\textstyle\bf#1$}}
-{\mbox{\boldmath$\scriptstyle\bf#1$}}
-{\mbox{\boldmath$\scriptscriptstyle\bf#1$}}}
-
-\providecommand{\fract}[1]{\left\{#1\right\}}
-\providecommand{\floor}[1]{\left\lfloor#1\right\rfloor}
-\providecommand{\ceil}[1]{\left\lceil#1\right\rceil}
-\def\sp#1#2{\langle #1, #2 \rangle}
-\def\spv#1#2{\langle\vec #1,\vec #2\rangle}
-
-\newtheorem{theorem}{Theorem}
-\newaliascnt{example}{theorem}
-\newtheorem{example}[example]{Example}
-\newaliascnt{def}{theorem}
-\newtheorem{definition}[def]{Definition}
-\aliascntresetthe{example}
-\aliascntresetthe{def}
-\numberwithin{theorem}{section}
-\numberwithin{def}{section}
-\numberwithin{example}{section}
-
-\newcommand{\algocflineautorefname}{Algorithm}
-\newcommand{\exampleautorefname}{Example}
-\newcommand{\lstnumberautorefname}{Line}
-\renewcommand{\sectionautorefname}{Section}
-\renewcommand{\subsectionautorefname}{Section}
-
-\def\Z{\mathbb{Z}}
-\def\Q{\mathbb{Q}}
-
-\def\pdom{\mathop{\rm pdom}\nolimits}
-\def\domain{\mathop{\rm dom}\nolimits}
-\def\range{\mathop{\rm ran}\nolimits}
-\def\identity{\mathop{\rm Id}\nolimits}
-\def\diff{\mathop{\Delta}\nolimits}
-
-\providecommand{\floor}[1]{\left\lfloor#1\right\rfloor}
-
-\begin{document}
-
-\title{Integer Set Library: Manual\\
-\small Version: \input{version} }
-\author{Sven Verdoolaege}
-
-\maketitle
-\tableofcontents
-
-\chapter{User Manual}
-
-\input{user}
-
-\chapter{Implementation Details}
-
-\input{implementation}
-
-\bibliography{isl}
-\bibliographystyle{chicago}
-
-\end{document}
diff --git a/cloog-0.17.0/isl/doc/mypod2latex b/cloog-0.17.0/isl/doc/mypod2latex
deleted file mode 100755
index b11c059..0000000
--- a/cloog-0.17.0/isl/doc/mypod2latex
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use Pod::LaTeX;
-
-my ($in, $out) = @ARGV;
-
-my $parser = new Pod::LaTeX(
-		AddPreamble => 0,
-		AddPostamble => 0,
-		LevelNoNum => 5,
-	     );
-
-$parser->parse_from_file($in, $out);
diff --git a/cloog-0.17.0/isl/doc/user.pod b/cloog-0.17.0/isl/doc/user.pod
deleted file mode 100644
index 720a12a..0000000
--- a/cloog-0.17.0/isl/doc/user.pod
+++ /dev/null
@@ -1,4267 +0,0 @@
-=head1 Introduction
-
-C<isl> is a thread-safe C library for manipulating
-sets and relations of integer points bounded by affine constraints.
-The descriptions of the sets and relations may involve
-both parameters and existentially quantified variables.
-All computations are performed in exact integer arithmetic
-using C<GMP>.
-The C<isl> library offers functionality that is similar
-to that offered by the C<Omega> and C<Omega+> libraries,
-but the underlying algorithms are in most cases completely different.
-
-The library is by no means complete and some fairly basic
-functionality is still missing.
-Still, even in its current form, the library has been successfully
-used as a backend polyhedral library for the polyhedral
-scanner C<CLooG> and as part of an equivalence checker of
-static affine programs.
-For bug reports, feature requests and questions,
-visit the the discussion group at
-L<http://groups.google.com/group/isl-development>.
-
-=head2 Backward Incompatible Changes
-
-=head3 Changes since isl-0.02
-
-=over
-
-=item * The old printing functions have been deprecated
-and replaced by C<isl_printer> functions, see L<Input and Output>.
-
-=item * Most functions related to dependence analysis have acquired
-an extra C<must> argument.  To obtain the old behavior, this argument
-should be given the value 1.  See L<Dependence Analysis>.
-
-=back
-
-=head3 Changes since isl-0.03
-
-=over
-
-=item * The function C<isl_pw_qpolynomial_fold_add> has been
-renamed to C<isl_pw_qpolynomial_fold_fold>.
-Similarly, C<isl_union_pw_qpolynomial_fold_add> has been
-renamed to C<isl_union_pw_qpolynomial_fold_fold>.
-
-=back
-
-=head3 Changes since isl-0.04
-
-=over
-
-=item * All header files have been renamed from C<isl_header.h>
-to C<isl/header.h>.
-
-=back
-
-=head3 Changes since isl-0.05
-
-=over
-
-=item * The functions C<isl_printer_print_basic_set> and
-C<isl_printer_print_basic_map> no longer print a newline.
-
-=item * The functions C<isl_flow_get_no_source>
-and C<isl_union_map_compute_flow> now return
-the accesses for which no source could be found instead of
-the iterations where those accesses occur.
-
-=item * The functions C<isl_basic_map_identity> and
-C<isl_map_identity> now take a B<map> space as input.  An old call
-C<isl_map_identity(space)> can be rewritten to
-C<isl_map_identity(isl_space_map_from_set(space))>.
-
-=item * The function C<isl_map_power> no longer takes
-a parameter position as input.  Instead, the exponent
-is now expressed as the domain of the resulting relation.
-
-=back
-
-=head3 Changes since isl-0.06
-
-=over
-
-=item * The format of C<isl_printer_print_qpolynomial>'s
-C<ISL_FORMAT_ISL> output has changed.
-Use C<ISL_FORMAT_C> to obtain the old output.
-
-=item * The C<*_fast_*> functions have been renamed to C<*_plain_*>.
-Some of the old names have been kept for backward compatibility,
-but they will be removed in the future.
-
-=back
-
-=head3 Changes since isl-0.07
-
-=over
-
-=item * The function C<isl_pw_aff_max> has been renamed to
-C<isl_pw_aff_union_max>.
-Similarly, the function C<isl_pw_aff_add> has been renamed to
-C<isl_pw_aff_union_add>.
-
-=item * The C<isl_dim> type has been renamed to C<isl_space>
-along with the associated functions.
-Some of the old names have been kept for backward compatibility,
-but they will be removed in the future.
-
-=item * Spaces of maps, sets and parameter domains are now
-treated differently.  The distinction between map spaces and set spaces
-has always been made on a conceptual level, but proper use of such spaces
-was never checked.  Furthermore, up until isl-0.07 there was no way
-of explicitly creating a parameter space.  These can now be created
-directly using C<isl_space_params_alloc> or from other spaces using
-C<isl_space_params>.
-
-=item * The space in which C<isl_aff>, C<isl_pw_aff>, C<isl_qpolynomial>,
-C<isl_pw_qpolynomial>, C<isl_qpolynomial_fold> and C<isl_pw_qpolynomial_fold>
-objects live is now a map space
-instead of a set space.  This means, for example, that the dimensions
-of the domain of an C<isl_aff> are now considered to be of type
-C<isl_dim_in> instead of C<isl_dim_set>.  Extra functions have been
-added to obtain the domain space.  Some of the constructors still
-take a domain space and have therefore been renamed.
-
-=item * The functions C<isl_equality_alloc> and C<isl_inequality_alloc>
-now take an C<isl_local_space> instead of an C<isl_space>.
-An C<isl_local_space> can be created from an C<isl_space>
-using C<isl_local_space_from_space>.
-
-=item * The C<isl_div> type has been removed.  Functions that used
-to return an C<isl_div> now return an C<isl_aff>.
-Note that the space of an C<isl_aff> is that of relation.
-When replacing a call to C<isl_div_get_coefficient> by a call to
-C<isl_aff_get_coefficient> any C<isl_dim_set> argument needs
-to be replaced by C<isl_dim_in>.
-A call to C<isl_aff_from_div> can be replaced by a call
-to C<isl_aff_floor>.
-A call to C<isl_qpolynomial_div(div)> call be replaced by
-the nested call
-
-	isl_qpolynomial_from_aff(isl_aff_floor(div))
-
-The function C<isl_constraint_div> has also been renamed
-to C<isl_constraint_get_div>.
-
-=item * The C<nparam> argument has been removed from
-C<isl_map_read_from_str> and similar functions.
-When reading input in the original PolyLib format,
-the result will have no parameters.
-If parameters are expected, the caller may want to perform
-dimension manipulation on the result.
-
-=back
-
-=head1 Installation
-
-The source of C<isl> can be obtained either as a tarball
-or from the git repository.  Both are available from
-L<http://freshmeat.net/projects/isl/>.
-The installation process depends on how you obtained
-the source.
-
-=head2 Installation from the git repository
-
-=over
-
-=item 1 Clone or update the repository
-
-The first time the source is obtained, you need to clone
-the repository.
-
-	git clone git://repo.or.cz/isl.git
-
-To obtain updates, you need to pull in the latest changes
-
-	git pull
-
-=item 2 Generate C<configure>
-
-	./autogen.sh
-
-=back
-
-After performing the above steps, continue
-with the L<Common installation instructions>.
-
-=head2 Common installation instructions
-
-=over
-
-=item 1 Obtain C<GMP>
-
-Building C<isl> requires C<GMP>, including its headers files.
-Your distribution may not provide these header files by default
-and you may need to install a package called C<gmp-devel> or something
-similar.  Alternatively, C<GMP> can be built from
-source, available from L<http://gmplib.org/>.
-
-=item 2 Configure
-
-C<isl> uses the standard C<autoconf> C<configure> script.
-To run it, just type
-
-	./configure
-
-optionally followed by some configure options.
-A complete list of options can be obtained by running
-
-	./configure --help
-
-Below we discuss some of the more common options.
-
-C<isl> can optionally use C<piplib>, but no
-C<piplib> functionality is currently used by default.
-The C<--with-piplib> option can
-be used to specify which C<piplib>
-library to use, either an installed version (C<system>),
-an externally built version (C<build>)
-or no version (C<no>).  The option C<build> is mostly useful
-in C<configure> scripts of larger projects that bundle both C<isl>
-and C<piplib>.
-
-=over
-
-=item C<--prefix>
-
-Installation prefix for C<isl>
-
-=item C<--with-gmp-prefix>
-
-Installation prefix for C<GMP> (architecture-independent files).
-
-=item C<--with-gmp-exec-prefix>
-
-Installation prefix for C<GMP> (architecture-dependent files).
-
-=item C<--with-piplib>
-
-Which copy of C<piplib> to use, either C<no> (default), C<system> or C<build>.
-
-=item C<--with-piplib-prefix>
-
-Installation prefix for C<system> C<piplib> (architecture-independent files).
-
-=item C<--with-piplib-exec-prefix>
-
-Installation prefix for C<system> C<piplib> (architecture-dependent files).
-
-=item C<--with-piplib-builddir>
-
-Location where C<build> C<piplib> was built.
-
-=back
-
-=item 3 Compile
-
-	make
-
-=item 4 Install (optional)
-
-	make install
-
-=back
-
-=head1 Library
-
-=head2 Initialization
-
-All manipulations of integer sets and relations occur within
-the context of an C<isl_ctx>.
-A given C<isl_ctx> can only be used within a single thread.
-All arguments of a function are required to have been allocated
-within the same context.
-There are currently no functions available for moving an object
-from one C<isl_ctx> to another C<isl_ctx>.  This means that
-there is currently no way of safely moving an object from one
-thread to another, unless the whole C<isl_ctx> is moved.
-
-An C<isl_ctx> can be allocated using C<isl_ctx_alloc> and
-freed using C<isl_ctx_free>.
-All objects allocated within an C<isl_ctx> should be freed
-before the C<isl_ctx> itself is freed.
-
-	isl_ctx *isl_ctx_alloc();
-	void isl_ctx_free(isl_ctx *ctx);
-
-=head2 Integers
-
-All operations on integers, mainly the coefficients
-of the constraints describing the sets and relations,
-are performed in exact integer arithmetic using C<GMP>.
-However, to allow future versions of C<isl> to optionally
-support fixed integer arithmetic, all calls to C<GMP>
-are wrapped inside C<isl> specific macros.
-The basic type is C<isl_int> and the operations below
-are available on this type.
-The meanings of these operations are essentially the same
-as their C<GMP> C<mpz_> counterparts.
-As always with C<GMP> types, C<isl_int>s need to be
-initialized with C<isl_int_init> before they can be used
-and they need to be released with C<isl_int_clear>
-after the last use.
-The user should not assume that an C<isl_int> is represented
-as a C<mpz_t>, but should instead explicitly convert between
-C<mpz_t>s and C<isl_int>s using C<isl_int_set_gmp> and
-C<isl_int_get_gmp> whenever a C<mpz_t> is required.
-
-=over
-
-=item isl_int_init(i)
-
-=item isl_int_clear(i)
-
-=item isl_int_set(r,i)
-
-=item isl_int_set_si(r,i)
-
-=item isl_int_set_gmp(r,g)
-
-=item isl_int_get_gmp(i,g)
-
-=item isl_int_abs(r,i)
-
-=item isl_int_neg(r,i)
-
-=item isl_int_swap(i,j)
-
-=item isl_int_swap_or_set(i,j)
-
-=item isl_int_add_ui(r,i,j)
-
-=item isl_int_sub_ui(r,i,j)
-
-=item isl_int_add(r,i,j)
-
-=item isl_int_sub(r,i,j)
-
-=item isl_int_mul(r,i,j)
-
-=item isl_int_mul_ui(r,i,j)
-
-=item isl_int_addmul(r,i,j)
-
-=item isl_int_submul(r,i,j)
-
-=item isl_int_gcd(r,i,j)
-
-=item isl_int_lcm(r,i,j)
-
-=item isl_int_divexact(r,i,j)
-
-=item isl_int_cdiv_q(r,i,j)
-
-=item isl_int_fdiv_q(r,i,j)
-
-=item isl_int_fdiv_r(r,i,j)
-
-=item isl_int_fdiv_q_ui(r,i,j)
-
-=item isl_int_read(r,s)
-
-=item isl_int_print(out,i,width)
-
-=item isl_int_sgn(i)
-
-=item isl_int_cmp(i,j)
-
-=item isl_int_cmp_si(i,si)
-
-=item isl_int_eq(i,j)
-
-=item isl_int_ne(i,j)
-
-=item isl_int_lt(i,j)
-
-=item isl_int_le(i,j)
-
-=item isl_int_gt(i,j)
-
-=item isl_int_ge(i,j)
-
-=item isl_int_abs_eq(i,j)
-
-=item isl_int_abs_ne(i,j)
-
-=item isl_int_abs_lt(i,j)
-
-=item isl_int_abs_gt(i,j)
-
-=item isl_int_abs_ge(i,j)
-
-=item isl_int_is_zero(i)
-
-=item isl_int_is_one(i)
-
-=item isl_int_is_negone(i)
-
-=item isl_int_is_pos(i)
-
-=item isl_int_is_neg(i)
-
-=item isl_int_is_nonpos(i)
-
-=item isl_int_is_nonneg(i)
-
-=item isl_int_is_divisible_by(i,j)
-
-=back
-
-=head2 Sets and Relations
-
-C<isl> uses six types of objects for representing sets and relations,
-C<isl_basic_set>, C<isl_basic_map>, C<isl_set>, C<isl_map>,
-C<isl_union_set> and C<isl_union_map>.
-C<isl_basic_set> and C<isl_basic_map> represent sets and relations that
-can be described as a conjunction of affine constraints, while
-C<isl_set> and C<isl_map> represent unions of
-C<isl_basic_set>s and C<isl_basic_map>s, respectively.
-However, all C<isl_basic_set>s or C<isl_basic_map>s in the union need
-to live in the same space.  C<isl_union_set>s and C<isl_union_map>s
-represent unions of C<isl_set>s or C<isl_map>s in I<different> spaces,
-where spaces are considered different if they have a different number
-of dimensions and/or different names (see L<"Spaces">).
-The difference between sets and relations (maps) is that sets have
-one set of variables, while relations have two sets of variables,
-input variables and output variables.
-
-=head2 Memory Management
-
-Since a high-level operation on sets and/or relations usually involves
-several substeps and since the user is usually not interested in
-the intermediate results, most functions that return a new object
-will also release all the objects passed as arguments.
-If the user still wants to use one or more of these arguments
-after the function call, she should pass along a copy of the
-object rather than the object itself.
-The user is then responsible for making sure that the original
-object gets used somewhere else or is explicitly freed.
-
-The arguments and return values of all documented functions are
-annotated to make clear which arguments are released and which
-arguments are preserved.  In particular, the following annotations
-are used
-
-=over
-
-=item C<__isl_give>
-
-C<__isl_give> means that a new object is returned.
-The user should make sure that the returned pointer is
-used exactly once as a value for an C<__isl_take> argument.
-In between, it can be used as a value for as many
-C<__isl_keep> arguments as the user likes.
-There is one exception, and that is the case where the
-pointer returned is C<NULL>.  Is this case, the user
-is free to use it as an C<__isl_take> argument or not.
-
-=item C<__isl_take>
-
-C<__isl_take> means that the object the argument points to
-is taken over by the function and may no longer be used
-by the user as an argument to any other function.
-The pointer value must be one returned by a function
-returning an C<__isl_give> pointer.
-If the user passes in a C<NULL> value, then this will
-be treated as an error in the sense that the function will
-not perform its usual operation.  However, it will still
-make sure that all the other C<__isl_take> arguments
-are released.
-
-=item C<__isl_keep>
-
-C<__isl_keep> means that the function will only use the object
-temporarily.  After the function has finished, the user
-can still use it as an argument to other functions.
-A C<NULL> value will be treated in the same way as
-a C<NULL> value for an C<__isl_take> argument.
-
-=back
-
-=head2 Error Handling
-
-C<isl> supports different ways to react in case a runtime error is triggered.
-Runtime errors arise, e.g., if a function such as C<isl_map_intersect> is called
-with two maps that have incompatible spaces. There are three possible ways
-to react on error: to warn, to continue or to abort.
-
-The default behavior is to warn. In this mode, C<isl> prints a warning, stores
-the last error in the corresponding C<isl_ctx> and the function in which the
-error was triggered returns C<NULL>. An error does not corrupt internal state,
-such that isl can continue to be used. C<isl> also provides functions to
-read the last error and to reset the memory that stores the last error. The
-last error is only stored for information purposes. Its presence does not
-change the behavior of C<isl>. Hence, resetting an error is not required to
-continue to use isl, but only to observe new errors.
-
-	#include <isl/ctx.h>
-	enum isl_error isl_ctx_last_error(isl_ctx *ctx);
-	void isl_ctx_reset_error(isl_ctx *ctx);
-
-Another option is to continue on error. This is similar to warn on error mode,
-except that C<isl> does not print any warning. This allows a program to
-implement its own error reporting.
-
-The last option is to directly abort the execution of the program from within
-the isl library. This makes it obviously impossible to recover from an error,
-but it allows to directly spot the error location. By aborting on error,
-debuggers break at the location the error occurred and can provide a stack
-trace. Other tools that automatically provide stack traces on abort or that do
-not want to continue execution after an error was triggered may also prefer to
-abort on error.
-
-The on error behavior of isl can be specified by calling
-C<isl_options_set_on_error> or by setting the command line option
-C<--isl-on-error>. Valid arguments for the function call are
-C<ISL_ON_ERROR_WARN>, C<ISL_ON_ERROR_CONTINUE> and C<ISL_ON_ERROR_ABORT>. The
-choices for the command line option are C<warn>, C<continue> and C<abort>.
-It is also possible to query the current error mode.
-
-	#include <isl/options.h>
-	int isl_options_set_on_error(isl_ctx *ctx, int val);
-	int isl_options_get_on_error(isl_ctx *ctx);
-
-=head2 Identifiers
-
-Identifiers are used to identify both individual dimensions
-and tuples of dimensions.  They consist of a name and an optional
-pointer.  Identifiers with the same name but different pointer values
-are considered to be distinct.
-Identifiers can be constructed, copied, freed, inspected and printed
-using the following functions.
-
-	#include <isl/id.h>
-	__isl_give isl_id *isl_id_alloc(isl_ctx *ctx,
-		__isl_keep const char *name, void *user);
-	__isl_give isl_id *isl_id_copy(isl_id *id);
-	void *isl_id_free(__isl_take isl_id *id);
-
-	isl_ctx *isl_id_get_ctx(__isl_keep isl_id *id);
-	void *isl_id_get_user(__isl_keep isl_id *id);
-	__isl_keep const char *isl_id_get_name(__isl_keep isl_id *id);
-
-	__isl_give isl_printer *isl_printer_print_id(
-		__isl_take isl_printer *p, __isl_keep isl_id *id);
-
-Note that C<isl_id_get_name> returns a pointer to some internal
-data structure, so the result can only be used while the
-corresponding C<isl_id> is alive.
-
-=head2 Spaces
-
-Whenever a new set or relation is created from scratch,
-the space in which it lives needs to be specified using an C<isl_space>.
-
-	#include <isl/space.h>
-	__isl_give isl_space *isl_space_alloc(isl_ctx *ctx,
-		unsigned nparam, unsigned n_in, unsigned n_out);
-	__isl_give isl_space *isl_space_params_alloc(isl_ctx *ctx,
-		unsigned nparam);
-	__isl_give isl_space *isl_space_set_alloc(isl_ctx *ctx,
-		unsigned nparam, unsigned dim);
-	__isl_give isl_space *isl_space_copy(__isl_keep isl_space *space);
-	void isl_space_free(__isl_take isl_space *space);
-	unsigned isl_space_dim(__isl_keep isl_space *space,
-		enum isl_dim_type type);
-
-The space used for creating a parameter domain
-needs to be created using C<isl_space_params_alloc>.
-For other sets, the space
-needs to be created using C<isl_space_set_alloc>, while
-for a relation, the space
-needs to be created using C<isl_space_alloc>.
-C<isl_space_dim> can be used
-to find out the number of dimensions of each type in
-a space, where type may be
-C<isl_dim_param>, C<isl_dim_in> (only for relations),
-C<isl_dim_out> (only for relations), C<isl_dim_set>
-(only for sets) or C<isl_dim_all>.
-
-To check whether a given space is that of a set or a map
-or whether it is a parameter space, use these functions:
-
-	#include <isl/space.h>
-	int isl_space_is_params(__isl_keep isl_space *space);
-	int isl_space_is_set(__isl_keep isl_space *space);
-
-It is often useful to create objects that live in the
-same space as some other object.  This can be accomplished
-by creating the new objects
-(see L<Creating New Sets and Relations> or
-L<Creating New (Piecewise) Quasipolynomials>) based on the space
-of the original object.
-
-	#include <isl/set.h>
-	__isl_give isl_space *isl_basic_set_get_space(
-		__isl_keep isl_basic_set *bset);
-	__isl_give isl_space *isl_set_get_space(__isl_keep isl_set *set);
-
-	#include <isl/union_set.h>
-	__isl_give isl_space *isl_union_set_get_space(
-		__isl_keep isl_union_set *uset);
-
-	#include <isl/map.h>
-	__isl_give isl_space *isl_basic_map_get_space(
-		__isl_keep isl_basic_map *bmap);
-	__isl_give isl_space *isl_map_get_space(__isl_keep isl_map *map);
-
-	#include <isl/union_map.h>
-	__isl_give isl_space *isl_union_map_get_space(
-		__isl_keep isl_union_map *umap);
-
-	#include <isl/constraint.h>
-	__isl_give isl_space *isl_constraint_get_space(
-		__isl_keep isl_constraint *constraint);
-
-	#include <isl/polynomial.h>
-	__isl_give isl_space *isl_qpolynomial_get_domain_space(
-		__isl_keep isl_qpolynomial *qp);
-	__isl_give isl_space *isl_qpolynomial_get_space(
-		__isl_keep isl_qpolynomial *qp);
-	__isl_give isl_space *isl_qpolynomial_fold_get_space(
-		__isl_keep isl_qpolynomial_fold *fold);
-	__isl_give isl_space *isl_pw_qpolynomial_get_domain_space(
-		__isl_keep isl_pw_qpolynomial *pwqp);
-	__isl_give isl_space *isl_pw_qpolynomial_get_space(
-		__isl_keep isl_pw_qpolynomial *pwqp);
-	__isl_give isl_space *isl_pw_qpolynomial_fold_get_domain_space(
-		__isl_keep isl_pw_qpolynomial_fold *pwf);
-	__isl_give isl_space *isl_pw_qpolynomial_fold_get_space(
-		__isl_keep isl_pw_qpolynomial_fold *pwf);
-	__isl_give isl_space *isl_union_pw_qpolynomial_get_space(
-		__isl_keep isl_union_pw_qpolynomial *upwqp);
-	__isl_give isl_space *isl_union_pw_qpolynomial_fold_get_space(
-		__isl_keep isl_union_pw_qpolynomial_fold *upwf);
-
-	#include <isl/aff.h>
-	__isl_give isl_space *isl_aff_get_domain_space(
-		__isl_keep isl_aff *aff);
-	__isl_give isl_space *isl_aff_get_space(
-		__isl_keep isl_aff *aff);
-	__isl_give isl_space *isl_pw_aff_get_domain_space(
-		__isl_keep isl_pw_aff *pwaff);
-	__isl_give isl_space *isl_pw_aff_get_space(
-		__isl_keep isl_pw_aff *pwaff);
-	__isl_give isl_space *isl_multi_aff_get_space(
-		__isl_keep isl_multi_aff *maff);
-	__isl_give isl_space *isl_pw_multi_aff_get_domain_space(
-		__isl_keep isl_pw_multi_aff *pma);
-	__isl_give isl_space *isl_pw_multi_aff_get_space(
-		__isl_keep isl_pw_multi_aff *pma);
-
-	#include <isl/point.h>
-	__isl_give isl_space *isl_point_get_space(
-		__isl_keep isl_point *pnt);
-
-The identifiers or names of the individual dimensions may be set or read off
-using the following functions.
-
-	#include <isl/space.h>
-	__isl_give isl_space *isl_space_set_dim_id(
-		__isl_take isl_space *space,
-		enum isl_dim_type type, unsigned pos,
-		__isl_take isl_id *id);
-	int isl_space_has_dim_id(__isl_keep isl_space *space,
-		enum isl_dim_type type, unsigned pos);
-	__isl_give isl_id *isl_space_get_dim_id(
-		__isl_keep isl_space *space,
-		enum isl_dim_type type, unsigned pos);
-	__isl_give isl_space *isl_space_set_dim_name(__isl_take isl_space *space,
-				 enum isl_dim_type type, unsigned pos,
-				 __isl_keep const char *name);
-	__isl_keep const char *isl_space_get_dim_name(__isl_keep isl_space *space,
-				 enum isl_dim_type type, unsigned pos);
-
-Note that C<isl_space_get_name> returns a pointer to some internal
-data structure, so the result can only be used while the
-corresponding C<isl_space> is alive.
-Also note that every function that operates on two sets or relations
-requires that both arguments have the same parameters.  This also
-means that if one of the arguments has named parameters, then the
-other needs to have named parameters too and the names need to match.
-Pairs of C<isl_set>, C<isl_map>, C<isl_union_set> and/or C<isl_union_map>
-arguments may have different parameters (as long as they are named),
-in which case the result will have as parameters the union of the parameters of
-the arguments.
-
-Given the identifier or name of a dimension (typically a parameter),
-its position can be obtained from the following function.
-
-	#include <isl/space.h>
-	int isl_space_find_dim_by_id(__isl_keep isl_space *space,
-		enum isl_dim_type type, __isl_keep isl_id *id);
-	int isl_space_find_dim_by_name(__isl_keep isl_space *space,
-		enum isl_dim_type type, const char *name);
-
-The identifiers or names of entire spaces may be set or read off
-using the following functions.
-
-	#include <isl/space.h>
-	__isl_give isl_space *isl_space_set_tuple_id(
-		__isl_take isl_space *space,
-		enum isl_dim_type type, __isl_take isl_id *id);
-	__isl_give isl_space *isl_space_reset_tuple_id(
-		__isl_take isl_space *space, enum isl_dim_type type);
-	int isl_space_has_tuple_id(__isl_keep isl_space *space,
-		enum isl_dim_type type);
-	__isl_give isl_id *isl_space_get_tuple_id(
-		__isl_keep isl_space *space, enum isl_dim_type type);
-	__isl_give isl_space *isl_space_set_tuple_name(
-		__isl_take isl_space *space,
-		enum isl_dim_type type, const char *s);
-	const char *isl_space_get_tuple_name(__isl_keep isl_space *space,
-		enum isl_dim_type type);
-
-The C<type> argument needs to be one of C<isl_dim_in>, C<isl_dim_out>
-or C<isl_dim_set>.  As with C<isl_space_get_name>,
-the C<isl_space_get_tuple_name> function returns a pointer to some internal
-data structure.
-Binary operations require the corresponding spaces of their arguments
-to have the same name.
-
-Spaces can be nested.  In particular, the domain of a set or
-the domain or range of a relation can be a nested relation.
-The following functions can be used to construct and deconstruct
-such nested spaces.
-
-	#include <isl/space.h>
-	int isl_space_is_wrapping(__isl_keep isl_space *space);
-	__isl_give isl_space *isl_space_wrap(__isl_take isl_space *space);
-	__isl_give isl_space *isl_space_unwrap(__isl_take isl_space *space);
-
-The input to C<isl_space_is_wrapping> and C<isl_space_unwrap> should
-be the space of a set, while that of
-C<isl_space_wrap> should be the space of a relation.
-Conversely, the output of C<isl_space_unwrap> is the space
-of a relation, while that of C<isl_space_wrap> is the space of a set.
-
-Spaces can be created from other spaces
-using the following functions.
-
-	__isl_give isl_space *isl_space_domain(__isl_take isl_space *space);
-	__isl_give isl_space *isl_space_from_domain(__isl_take isl_space *space);
-	__isl_give isl_space *isl_space_range(__isl_take isl_space *space);
-	__isl_give isl_space *isl_space_from_range(__isl_take isl_space *space);
-	__isl_give isl_space *isl_space_params(
-		__isl_take isl_space *space);
-	__isl_give isl_space *isl_space_set_from_params(
-		__isl_take isl_space *space);
-	__isl_give isl_space *isl_space_reverse(__isl_take isl_space *space);
-	__isl_give isl_space *isl_space_join(__isl_take isl_space *left,
-		__isl_take isl_space *right);
-	__isl_give isl_space *isl_space_align_params(
-		__isl_take isl_space *space1, __isl_take isl_space *space2)
-	__isl_give isl_space *isl_space_insert_dims(__isl_take isl_space *space,
-		enum isl_dim_type type, unsigned pos, unsigned n);
-	__isl_give isl_space *isl_space_add_dims(__isl_take isl_space *space,
-		enum isl_dim_type type, unsigned n);
-	__isl_give isl_space *isl_space_drop_dims(__isl_take isl_space *space,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	__isl_give isl_space *isl_space_move_dims(__isl_take isl_space *space,
-		enum isl_dim_type dst_type, unsigned dst_pos,
-		enum isl_dim_type src_type, unsigned src_pos,
-		unsigned n);
-	__isl_give isl_space *isl_space_map_from_set(
-		__isl_take isl_space *space);
-	__isl_give isl_space *isl_space_zip(__isl_take isl_space *space);
-
-Note that if dimensions are added or removed from a space, then
-the name and the internal structure are lost.
-
-=head2 Local Spaces
-
-A local space is essentially a space with
-zero or more existentially quantified variables.
-The local space of a basic set or relation can be obtained
-using the following functions.
-
-	#include <isl/set.h>
-	__isl_give isl_local_space *isl_basic_set_get_local_space(
-		__isl_keep isl_basic_set *bset);
-
-	#include <isl/map.h>
-	__isl_give isl_local_space *isl_basic_map_get_local_space(
-		__isl_keep isl_basic_map *bmap);
-
-A new local space can be created from a space using
-
-	#include <isl/local_space.h>
-	__isl_give isl_local_space *isl_local_space_from_space(
-		__isl_take isl_space *space);
-
-They can be inspected, modified, copied and freed using the following functions.
-
-	#include <isl/local_space.h>
-	isl_ctx *isl_local_space_get_ctx(
-		__isl_keep isl_local_space *ls);
-	int isl_local_space_is_set(__isl_keep isl_local_space *ls);
-	int isl_local_space_dim(__isl_keep isl_local_space *ls,
-		enum isl_dim_type type);
-	const char *isl_local_space_get_dim_name(
-		__isl_keep isl_local_space *ls,
-		enum isl_dim_type type, unsigned pos);
-	__isl_give isl_local_space *isl_local_space_set_dim_name(
-		__isl_take isl_local_space *ls,
-		enum isl_dim_type type, unsigned pos, const char *s);
-	__isl_give isl_local_space *isl_local_space_set_dim_id(
-		__isl_take isl_local_space *ls,
-		enum isl_dim_type type, unsigned pos,
-		__isl_take isl_id *id);
-	__isl_give isl_space *isl_local_space_get_space(
-		__isl_keep isl_local_space *ls);
-	__isl_give isl_aff *isl_local_space_get_div(
-		__isl_keep isl_local_space *ls, int pos);
-	__isl_give isl_local_space *isl_local_space_copy(
-		__isl_keep isl_local_space *ls);
-	void *isl_local_space_free(__isl_take isl_local_space *ls);
-
-Two local spaces can be compared using
-
-	int isl_local_space_is_equal(__isl_keep isl_local_space *ls1,
-		__isl_keep isl_local_space *ls2);
-
-Local spaces can be created from other local spaces
-using the following functions.
-
-	__isl_give isl_local_space *isl_local_space_domain(
-		__isl_take isl_local_space *ls);
-	__isl_give isl_local_space *isl_local_space_range(
-		__isl_take isl_local_space *ls);
-	__isl_give isl_local_space *isl_local_space_from_domain(
-		__isl_take isl_local_space *ls);
-	__isl_give isl_local_space *isl_local_space_intersect(
-		__isl_take isl_local_space *ls1,
-		__isl_take isl_local_space *ls2);
-	__isl_give isl_local_space *isl_local_space_add_dims(
-		__isl_take isl_local_space *ls,
-		enum isl_dim_type type, unsigned n);
-	__isl_give isl_local_space *isl_local_space_insert_dims(
-		__isl_take isl_local_space *ls,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	__isl_give isl_local_space *isl_local_space_drop_dims(
-		__isl_take isl_local_space *ls,
-		enum isl_dim_type type, unsigned first, unsigned n);
-
-=head2 Input and Output
-
-C<isl> supports its own input/output format, which is similar
-to the C<Omega> format, but also supports the C<PolyLib> format
-in some cases.
-
-=head3 C<isl> format
-
-The C<isl> format is similar to that of C<Omega>, but has a different
-syntax for describing the parameters and allows for the definition
-of an existentially quantified variable as the integer division
-of an affine expression.
-For example, the set of integers C<i> between C<0> and C<n>
-such that C<i % 10 <= 6> can be described as
-
-	[n] -> { [i] : exists (a = [i/10] : 0 <= i and i <= n and
-				i - 10 a <= 6) }
-
-A set or relation can have several disjuncts, separated
-by the keyword C<or>.  Each disjunct is either a conjunction
-of constraints or a projection (C<exists>) of a conjunction
-of constraints.  The constraints are separated by the keyword
-C<and>.
-
-=head3 C<PolyLib> format
-
-If the represented set is a union, then the first line
-contains a single number representing the number of disjuncts.
-Otherwise, a line containing the number C<1> is optional.
-
-Each disjunct is represented by a matrix of constraints.
-The first line contains two numbers representing
-the number of rows and columns,
-where the number of rows is equal to the number of constraints
-and the number of columns is equal to two plus the number of variables.
-The following lines contain the actual rows of the constraint matrix.
-In each row, the first column indicates whether the constraint
-is an equality (C<0>) or inequality (C<1>).  The final column
-corresponds to the constant term.
-
-If the set is parametric, then the coefficients of the parameters
-appear in the last columns before the constant column.
-The coefficients of any existentially quantified variables appear
-between those of the set variables and those of the parameters.
-
-=head3 Extended C<PolyLib> format
-
-The extended C<PolyLib> format is nearly identical to the
-C<PolyLib> format.  The only difference is that the line
-containing the number of rows and columns of a constraint matrix
-also contains four additional numbers:
-the number of output dimensions, the number of input dimensions,
-the number of local dimensions (i.e., the number of existentially
-quantified variables) and the number of parameters.
-For sets, the number of ``output'' dimensions is equal
-to the number of set dimensions, while the number of ``input''
-dimensions is zero.
-
-=head3 Input
-
-	#include <isl/set.h>
-	__isl_give isl_basic_set *isl_basic_set_read_from_file(
-		isl_ctx *ctx, FILE *input);
-	__isl_give isl_basic_set *isl_basic_set_read_from_str(
-		isl_ctx *ctx, const char *str);
-	__isl_give isl_set *isl_set_read_from_file(isl_ctx *ctx,
-		FILE *input);
-	__isl_give isl_set *isl_set_read_from_str(isl_ctx *ctx,
-		const char *str);
-
-	#include <isl/map.h>
-	__isl_give isl_basic_map *isl_basic_map_read_from_file(
-		isl_ctx *ctx, FILE *input);
-	__isl_give isl_basic_map *isl_basic_map_read_from_str(
-		isl_ctx *ctx, const char *str);
-	__isl_give isl_map *isl_map_read_from_file(
-		isl_ctx *ctx, FILE *input);
-	__isl_give isl_map *isl_map_read_from_str(isl_ctx *ctx,
-		const char *str);
-
-	#include <isl/union_set.h>
-	__isl_give isl_union_set *isl_union_set_read_from_file(
-		isl_ctx *ctx, FILE *input);
-	__isl_give isl_union_set *isl_union_set_read_from_str(
-		isl_ctx *ctx, const char *str);
-
-	#include <isl/union_map.h>
-	__isl_give isl_union_map *isl_union_map_read_from_file(
-		isl_ctx *ctx, FILE *input);
-	__isl_give isl_union_map *isl_union_map_read_from_str(
-		isl_ctx *ctx, const char *str);
-
-The input format is autodetected and may be either the C<PolyLib> format
-or the C<isl> format.
-
-=head3 Output
-
-Before anything can be printed, an C<isl_printer> needs to
-be created.
-
-	__isl_give isl_printer *isl_printer_to_file(isl_ctx *ctx,
-		FILE *file);
-	__isl_give isl_printer *isl_printer_to_str(isl_ctx *ctx);
-	void isl_printer_free(__isl_take isl_printer *printer);
-	__isl_give char *isl_printer_get_str(
-		__isl_keep isl_printer *printer);
-
-The behavior of the printer can be modified in various ways
-
-	__isl_give isl_printer *isl_printer_set_output_format(
-		__isl_take isl_printer *p, int output_format);
-	__isl_give isl_printer *isl_printer_set_indent(
-		__isl_take isl_printer *p, int indent);
-	__isl_give isl_printer *isl_printer_indent(
-		__isl_take isl_printer *p, int indent);
-	__isl_give isl_printer *isl_printer_set_prefix(
-		__isl_take isl_printer *p, const char *prefix);
-	__isl_give isl_printer *isl_printer_set_suffix(
-		__isl_take isl_printer *p, const char *suffix);
-
-The C<output_format> may be either C<ISL_FORMAT_ISL>, C<ISL_FORMAT_OMEGA>,
-C<ISL_FORMAT_POLYLIB>, C<ISL_FORMAT_EXT_POLYLIB> or C<ISL_FORMAT_LATEX>
-and defaults to C<ISL_FORMAT_ISL>.
-Each line in the output is indented by C<indent> (set by
-C<isl_printer_set_indent>) spaces
-(default: 0), prefixed by C<prefix> and suffixed by C<suffix>.
-In the C<PolyLib> format output,
-the coefficients of the existentially quantified variables
-appear between those of the set variables and those
-of the parameters.
-The function C<isl_printer_indent> increases the indentation
-by the specified amount (which may be negative).
-
-To actually print something, use
-
-	#include <isl/set.h>
-	__isl_give isl_printer *isl_printer_print_basic_set(
-		__isl_take isl_printer *printer,
-		__isl_keep isl_basic_set *bset);
-	__isl_give isl_printer *isl_printer_print_set(
-		__isl_take isl_printer *printer,
-		__isl_keep isl_set *set);
-
-	#include <isl/map.h>
-	__isl_give isl_printer *isl_printer_print_basic_map(
-		__isl_take isl_printer *printer,
-		__isl_keep isl_basic_map *bmap);
-	__isl_give isl_printer *isl_printer_print_map(
-		__isl_take isl_printer *printer,
-		__isl_keep isl_map *map);
-
-	#include <isl/union_set.h>
-	__isl_give isl_printer *isl_printer_print_union_set(
-		__isl_take isl_printer *p,
-		__isl_keep isl_union_set *uset);
-
-	#include <isl/union_map.h>
-	__isl_give isl_printer *isl_printer_print_union_map(
-		__isl_take isl_printer *p,
-		__isl_keep isl_union_map *umap);
-
-When called on a file printer, the following function flushes
-the file.  When called on a string printer, the buffer is cleared.
-
-	__isl_give isl_printer *isl_printer_flush(
-		__isl_take isl_printer *p);
-
-=head2 Creating New Sets and Relations
-
-C<isl> has functions for creating some standard sets and relations.
-
-=over
-
-=item * Empty sets and relations
-
-	__isl_give isl_basic_set *isl_basic_set_empty(
-		__isl_take isl_space *space);
-	__isl_give isl_basic_map *isl_basic_map_empty(
-		__isl_take isl_space *space);
-	__isl_give isl_set *isl_set_empty(
-		__isl_take isl_space *space);
-	__isl_give isl_map *isl_map_empty(
-		__isl_take isl_space *space);
-	__isl_give isl_union_set *isl_union_set_empty(
-		__isl_take isl_space *space);
-	__isl_give isl_union_map *isl_union_map_empty(
-		__isl_take isl_space *space);
-
-For C<isl_union_set>s and C<isl_union_map>s, the space
-is only used to specify the parameters.
-
-=item * Universe sets and relations
-
-	__isl_give isl_basic_set *isl_basic_set_universe(
-		__isl_take isl_space *space);
-	__isl_give isl_basic_map *isl_basic_map_universe(
-		__isl_take isl_space *space);
-	__isl_give isl_set *isl_set_universe(
-		__isl_take isl_space *space);
-	__isl_give isl_map *isl_map_universe(
-		__isl_take isl_space *space);
-	__isl_give isl_union_set *isl_union_set_universe(
-		__isl_take isl_union_set *uset);
-	__isl_give isl_union_map *isl_union_map_universe(
-		__isl_take isl_union_map *umap);
-
-The sets and relations constructed by the functions above
-contain all integer values, while those constructed by the
-functions below only contain non-negative values.
-
-	__isl_give isl_basic_set *isl_basic_set_nat_universe(
-		__isl_take isl_space *space);
-	__isl_give isl_basic_map *isl_basic_map_nat_universe(
-		__isl_take isl_space *space);
-	__isl_give isl_set *isl_set_nat_universe(
-		__isl_take isl_space *space);
-	__isl_give isl_map *isl_map_nat_universe(
-		__isl_take isl_space *space);
-
-=item * Identity relations
-
-	__isl_give isl_basic_map *isl_basic_map_identity(
-		__isl_take isl_space *space);
-	__isl_give isl_map *isl_map_identity(
-		__isl_take isl_space *space);
-
-The number of input and output dimensions in C<space> needs
-to be the same.
-
-=item * Lexicographic order
-
-	__isl_give isl_map *isl_map_lex_lt(
-		__isl_take isl_space *set_space);
-	__isl_give isl_map *isl_map_lex_le(
-		__isl_take isl_space *set_space);
-	__isl_give isl_map *isl_map_lex_gt(
-		__isl_take isl_space *set_space);
-	__isl_give isl_map *isl_map_lex_ge(
-		__isl_take isl_space *set_space);
-	__isl_give isl_map *isl_map_lex_lt_first(
-		__isl_take isl_space *space, unsigned n);
-	__isl_give isl_map *isl_map_lex_le_first(
-		__isl_take isl_space *space, unsigned n);
-	__isl_give isl_map *isl_map_lex_gt_first(
-		__isl_take isl_space *space, unsigned n);
-	__isl_give isl_map *isl_map_lex_ge_first(
-		__isl_take isl_space *space, unsigned n);
-
-The first four functions take a space for a B<set>
-and return relations that express that the elements in the domain
-are lexicographically less
-(C<isl_map_lex_lt>), less or equal (C<isl_map_lex_le>),
-greater (C<isl_map_lex_gt>) or greater or equal (C<isl_map_lex_ge>)
-than the elements in the range.
-The last four functions take a space for a map
-and return relations that express that the first C<n> dimensions
-in the domain are lexicographically less
-(C<isl_map_lex_lt_first>), less or equal (C<isl_map_lex_le_first>),
-greater (C<isl_map_lex_gt_first>) or greater or equal (C<isl_map_lex_ge_first>)
-than the first C<n> dimensions in the range.
-
-=back
-
-A basic set or relation can be converted to a set or relation
-using the following functions.
-
-	__isl_give isl_set *isl_set_from_basic_set(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_map *isl_map_from_basic_map(
-		__isl_take isl_basic_map *bmap);
-
-Sets and relations can be converted to union sets and relations
-using the following functions.
-
-	__isl_give isl_union_map *isl_union_map_from_map(
-		__isl_take isl_map *map);
-	__isl_give isl_union_set *isl_union_set_from_set(
-		__isl_take isl_set *set);
-
-The inverse conversions below can only be used if the input
-union set or relation is known to contain elements in exactly one
-space.
-
-	__isl_give isl_set *isl_set_from_union_set(
-		__isl_take isl_union_set *uset);
-	__isl_give isl_map *isl_map_from_union_map(
-		__isl_take isl_union_map *umap);
-
-A zero-dimensional set can be constructed on a given parameter domain
-using the following function.
-
-	__isl_give isl_set *isl_set_from_params(
-		__isl_take isl_set *set);
-
-Sets and relations can be copied and freed again using the following
-functions.
-
-	__isl_give isl_basic_set *isl_basic_set_copy(
-		__isl_keep isl_basic_set *bset);
-	__isl_give isl_set *isl_set_copy(__isl_keep isl_set *set);
-	__isl_give isl_union_set *isl_union_set_copy(
-		__isl_keep isl_union_set *uset);
-	__isl_give isl_basic_map *isl_basic_map_copy(
-		__isl_keep isl_basic_map *bmap);
-	__isl_give isl_map *isl_map_copy(__isl_keep isl_map *map);
-	__isl_give isl_union_map *isl_union_map_copy(
-		__isl_keep isl_union_map *umap);
-	void isl_basic_set_free(__isl_take isl_basic_set *bset);
-	void isl_set_free(__isl_take isl_set *set);
-	void *isl_union_set_free(__isl_take isl_union_set *uset);
-	void isl_basic_map_free(__isl_take isl_basic_map *bmap);
-	void isl_map_free(__isl_take isl_map *map);
-	void *isl_union_map_free(__isl_take isl_union_map *umap);
-
-Other sets and relations can be constructed by starting
-from a universe set or relation, adding equality and/or
-inequality constraints and then projecting out the
-existentially quantified variables, if any.
-Constraints can be constructed, manipulated and
-added to (or removed from) (basic) sets and relations
-using the following functions.
-
-	#include <isl/constraint.h>
-	__isl_give isl_constraint *isl_equality_alloc(
-		__isl_take isl_local_space *ls);
-	__isl_give isl_constraint *isl_inequality_alloc(
-		__isl_take isl_local_space *ls);
-	__isl_give isl_constraint *isl_constraint_set_constant(
-		__isl_take isl_constraint *constraint, isl_int v);
-	__isl_give isl_constraint *isl_constraint_set_constant_si(
-		__isl_take isl_constraint *constraint, int v);
-	__isl_give isl_constraint *isl_constraint_set_coefficient(
-		__isl_take isl_constraint *constraint,
-		enum isl_dim_type type, int pos, isl_int v);
-	__isl_give isl_constraint *isl_constraint_set_coefficient_si(
-		__isl_take isl_constraint *constraint,
-		enum isl_dim_type type, int pos, int v);
-	__isl_give isl_basic_map *isl_basic_map_add_constraint(
-		__isl_take isl_basic_map *bmap,
-		__isl_take isl_constraint *constraint);
-	__isl_give isl_basic_set *isl_basic_set_add_constraint(
-		__isl_take isl_basic_set *bset,
-		__isl_take isl_constraint *constraint);
-	__isl_give isl_map *isl_map_add_constraint(
-		__isl_take isl_map *map,
-		__isl_take isl_constraint *constraint);
-	__isl_give isl_set *isl_set_add_constraint(
-		__isl_take isl_set *set,
-		__isl_take isl_constraint *constraint);
-	__isl_give isl_basic_set *isl_basic_set_drop_constraint(
-		__isl_take isl_basic_set *bset,
-		__isl_take isl_constraint *constraint);
-
-For example, to create a set containing the even integers
-between 10 and 42, you would use the following code.
-
-	isl_space *space;
-	isl_local_space *ls;
-	isl_constraint *c;
-	isl_basic_set *bset;
-
-	space = isl_space_set_alloc(ctx, 0, 2);
-	bset = isl_basic_set_universe(isl_space_copy(space));
-	ls = isl_local_space_from_space(space);
-
-	c = isl_equality_alloc(isl_local_space_copy(ls));
-	c = isl_constraint_set_coefficient_si(c, isl_dim_set, 0, -1);
-	c = isl_constraint_set_coefficient_si(c, isl_dim_set, 1, 2);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	c = isl_inequality_alloc(isl_local_space_copy(ls));
-	c = isl_constraint_set_constant_si(c, -10);
-	c = isl_constraint_set_coefficient_si(c, isl_dim_set, 0, 1);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	c = isl_inequality_alloc(ls);
-	c = isl_constraint_set_constant_si(c, 42);
-	c = isl_constraint_set_coefficient_si(c, isl_dim_set, 0, -1);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 1, 1);
-
-Or, alternatively,
-
-	isl_basic_set *bset;
-	bset = isl_basic_set_read_from_str(ctx,
-		"{[i] : exists (a : i = 2a and i >= 10 and i <= 42)}");
-
-A basic set or relation can also be constructed from two matrices
-describing the equalities and the inequalities.
-
-	__isl_give isl_basic_set *isl_basic_set_from_constraint_matrices(
-		__isl_take isl_space *space,
-		__isl_take isl_mat *eq, __isl_take isl_mat *ineq,
-		enum isl_dim_type c1,
-		enum isl_dim_type c2, enum isl_dim_type c3,
-		enum isl_dim_type c4);
-	__isl_give isl_basic_map *isl_basic_map_from_constraint_matrices(
-		__isl_take isl_space *space,
-		__isl_take isl_mat *eq, __isl_take isl_mat *ineq,
-		enum isl_dim_type c1,
-		enum isl_dim_type c2, enum isl_dim_type c3,
-		enum isl_dim_type c4, enum isl_dim_type c5);
-
-The C<isl_dim_type> arguments indicate the order in which
-different kinds of variables appear in the input matrices
-and should be a permutation of C<isl_dim_cst>, C<isl_dim_param>,
-C<isl_dim_set> and C<isl_dim_div> for sets and
-of C<isl_dim_cst>, C<isl_dim_param>,
-C<isl_dim_in>, C<isl_dim_out> and C<isl_dim_div> for relations.
-
-A (basic) set or relation can also be constructed from a (piecewise)
-(multiple) affine expression
-or a list of affine expressions
-(See L<"Piecewise Quasi Affine Expressions"> and
-L<"Piecewise Multiple Quasi Affine Expressions">).
-
-	__isl_give isl_basic_map *isl_basic_map_from_aff(
-		__isl_take isl_aff *aff);
-	__isl_give isl_set *isl_set_from_pw_aff(
-		__isl_take isl_pw_aff *pwaff);
-	__isl_give isl_map *isl_map_from_pw_aff(
-		__isl_take isl_pw_aff *pwaff);
-	__isl_give isl_basic_map *isl_basic_map_from_aff_list(
-		__isl_take isl_space *domain_space,
-		__isl_take isl_aff_list *list);
-	__isl_give isl_basic_map *isl_basic_map_from_multi_aff(
-		__isl_take isl_multi_aff *maff)
-	__isl_give isl_set *isl_set_from_pw_multi_aff(
-		__isl_take isl_pw_multi_aff *pma);
-	__isl_give isl_map *isl_map_from_pw_multi_aff(
-		__isl_take isl_pw_multi_aff *pma);
-
-The C<domain_dim> argument describes the domain of the resulting
-basic relation.  It is required because the C<list> may consist
-of zero affine expressions.
-
-=head2 Inspecting Sets and Relations
-
-Usually, the user should not have to care about the actual constraints
-of the sets and maps, but should instead apply the abstract operations
-explained in the following sections.
-Occasionally, however, it may be required to inspect the individual
-coefficients of the constraints.  This section explains how to do so.
-In these cases, it may also be useful to have C<isl> compute
-an explicit representation of the existentially quantified variables.
-
-	__isl_give isl_set *isl_set_compute_divs(
-		__isl_take isl_set *set);
-	__isl_give isl_map *isl_map_compute_divs(
-		__isl_take isl_map *map);
-	__isl_give isl_union_set *isl_union_set_compute_divs(
-		__isl_take isl_union_set *uset);
-	__isl_give isl_union_map *isl_union_map_compute_divs(
-		__isl_take isl_union_map *umap);
-
-This explicit representation defines the existentially quantified
-variables as integer divisions of the other variables, possibly
-including earlier existentially quantified variables.
-An explicitly represented existentially quantified variable therefore
-has a unique value when the values of the other variables are known.
-If, furthermore, the same existentials, i.e., existentials
-with the same explicit representations, should appear in the
-same order in each of the disjuncts of a set or map, then the user should call
-either of the following functions.
-
-	__isl_give isl_set *isl_set_align_divs(
-		__isl_take isl_set *set);
-	__isl_give isl_map *isl_map_align_divs(
-		__isl_take isl_map *map);
-
-Alternatively, the existentially quantified variables can be removed
-using the following functions, which compute an overapproximation.
-
-	__isl_give isl_basic_set *isl_basic_set_remove_divs(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_basic_map *isl_basic_map_remove_divs(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_set *isl_set_remove_divs(
-		__isl_take isl_set *set);
-	__isl_give isl_map *isl_map_remove_divs(
-		__isl_take isl_map *map);
-
-To iterate over all the sets or maps in a union set or map, use
-
-	int isl_union_set_foreach_set(__isl_keep isl_union_set *uset,
-		int (*fn)(__isl_take isl_set *set, void *user),
-		void *user);
-	int isl_union_map_foreach_map(__isl_keep isl_union_map *umap,
-		int (*fn)(__isl_take isl_map *map, void *user),
-		void *user);
-
-The number of sets or maps in a union set or map can be obtained
-from
-
-	int isl_union_set_n_set(__isl_keep isl_union_set *uset);
-	int isl_union_map_n_map(__isl_keep isl_union_map *umap);
-
-To extract the set or map in a given space from a union, use
-
-	__isl_give isl_set *isl_union_set_extract_set(
-		__isl_keep isl_union_set *uset,
-		__isl_take isl_space *space);
-	__isl_give isl_map *isl_union_map_extract_map(
-		__isl_keep isl_union_map *umap,
-		__isl_take isl_space *space);
-
-To iterate over all the basic sets or maps in a set or map, use
-
-	int isl_set_foreach_basic_set(__isl_keep isl_set *set,
-		int (*fn)(__isl_take isl_basic_set *bset, void *user),
-		void *user);
-	int isl_map_foreach_basic_map(__isl_keep isl_map *map,
-		int (*fn)(__isl_take isl_basic_map *bmap, void *user),
-		void *user);
-
-The callback function C<fn> should return 0 if successful and
--1 if an error occurs.  In the latter case, or if any other error
-occurs, the above functions will return -1.
-
-It should be noted that C<isl> does not guarantee that
-the basic sets or maps passed to C<fn> are disjoint.
-If this is required, then the user should call one of
-the following functions first.
-
-	__isl_give isl_set *isl_set_make_disjoint(
-		__isl_take isl_set *set);
-	__isl_give isl_map *isl_map_make_disjoint(
-		__isl_take isl_map *map);
-
-The number of basic sets in a set can be obtained
-from
-
-	int isl_set_n_basic_set(__isl_keep isl_set *set);
-
-To iterate over the constraints of a basic set or map, use
-
-	#include <isl/constraint.h>
-
-	int isl_basic_map_foreach_constraint(
-		__isl_keep isl_basic_map *bmap,
-		int (*fn)(__isl_take isl_constraint *c, void *user),
-		void *user);
-	void *isl_constraint_free(__isl_take isl_constraint *c);
-
-Again, the callback function C<fn> should return 0 if successful and
--1 if an error occurs.  In the latter case, or if any other error
-occurs, the above functions will return -1.
-The constraint C<c> represents either an equality or an inequality.
-Use the following function to find out whether a constraint
-represents an equality.  If not, it represents an inequality.
-
-	int isl_constraint_is_equality(
-		__isl_keep isl_constraint *constraint);
-
-The coefficients of the constraints can be inspected using
-the following functions.
-
-	void isl_constraint_get_constant(
-		__isl_keep isl_constraint *constraint, isl_int *v);
-	void isl_constraint_get_coefficient(
-		__isl_keep isl_constraint *constraint,
-		enum isl_dim_type type, int pos, isl_int *v);
-	int isl_constraint_involves_dims(
-		__isl_keep isl_constraint *constraint,
-		enum isl_dim_type type, unsigned first, unsigned n);
-
-The explicit representations of the existentially quantified
-variables can be inspected using the following function.
-Note that the user is only allowed to use this function
-if the inspected set or map is the result of a call
-to C<isl_set_compute_divs> or C<isl_map_compute_divs>.
-The existentially quantified variable is equal to the floor
-of the returned affine expression.  The affine expression
-itself can be inspected using the functions in
-L<"Piecewise Quasi Affine Expressions">.
-
-	__isl_give isl_aff *isl_constraint_get_div(
-		__isl_keep isl_constraint *constraint, int pos);
-
-To obtain the constraints of a basic set or map in matrix
-form, use the following functions.
-
-	__isl_give isl_mat *isl_basic_set_equalities_matrix(
-		__isl_keep isl_basic_set *bset,
-		enum isl_dim_type c1, enum isl_dim_type c2,
-		enum isl_dim_type c3, enum isl_dim_type c4);
-	__isl_give isl_mat *isl_basic_set_inequalities_matrix(
-		__isl_keep isl_basic_set *bset,
-		enum isl_dim_type c1, enum isl_dim_type c2,
-		enum isl_dim_type c3, enum isl_dim_type c4);
-	__isl_give isl_mat *isl_basic_map_equalities_matrix(
-		__isl_keep isl_basic_map *bmap,
-		enum isl_dim_type c1,
-		enum isl_dim_type c2, enum isl_dim_type c3,
-		enum isl_dim_type c4, enum isl_dim_type c5);
-	__isl_give isl_mat *isl_basic_map_inequalities_matrix(
-		__isl_keep isl_basic_map *bmap,
-		enum isl_dim_type c1,
-		enum isl_dim_type c2, enum isl_dim_type c3,
-		enum isl_dim_type c4, enum isl_dim_type c5);
-
-The C<isl_dim_type> arguments dictate the order in which
-different kinds of variables appear in the resulting matrix
-and should be a permutation of C<isl_dim_cst>, C<isl_dim_param>,
-C<isl_dim_in>, C<isl_dim_out> and C<isl_dim_div>.
-
-The number of parameters, input, output or set dimensions can
-be obtained using the following functions.
-
-	unsigned isl_basic_set_dim(__isl_keep isl_basic_set *bset,
-		enum isl_dim_type type);
-	unsigned isl_basic_map_dim(__isl_keep isl_basic_map *bmap,
-		enum isl_dim_type type);
-	unsigned isl_set_dim(__isl_keep isl_set *set,
-		enum isl_dim_type type);
-	unsigned isl_map_dim(__isl_keep isl_map *map,
-		enum isl_dim_type type);
-
-To check whether the description of a set or relation depends
-on one or more given dimensions, it is not necessary to iterate over all
-constraints.  Instead the following functions can be used.
-
-	int isl_basic_set_involves_dims(
-		__isl_keep isl_basic_set *bset,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	int isl_set_involves_dims(__isl_keep isl_set *set,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	int isl_basic_map_involves_dims(
-		__isl_keep isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	int isl_map_involves_dims(__isl_keep isl_map *map,
-		enum isl_dim_type type, unsigned first, unsigned n);
-
-Similarly, the following functions can be used to check whether
-a given dimension is involved in any lower or upper bound.
-
-	int isl_set_dim_has_lower_bound(__isl_keep isl_set *set,
-		enum isl_dim_type type, unsigned pos);
-	int isl_set_dim_has_upper_bound(__isl_keep isl_set *set,
-		enum isl_dim_type type, unsigned pos);
-
-The identifiers or names of the domain and range spaces of a set
-or relation can be read off or set using the following functions.
-
-	__isl_give isl_set *isl_set_set_tuple_id(
-		__isl_take isl_set *set, __isl_take isl_id *id);
-	__isl_give isl_set *isl_set_reset_tuple_id(
-		__isl_take isl_set *set);
-	int isl_set_has_tuple_id(__isl_keep isl_set *set);
-	__isl_give isl_id *isl_set_get_tuple_id(
-		__isl_keep isl_set *set);
-	__isl_give isl_map *isl_map_set_tuple_id(
-		__isl_take isl_map *map, enum isl_dim_type type,
-		__isl_take isl_id *id);
-	__isl_give isl_map *isl_map_reset_tuple_id(
-		__isl_take isl_map *map, enum isl_dim_type type);
-	int isl_map_has_tuple_id(__isl_keep isl_map *map,
-		enum isl_dim_type type);
-	__isl_give isl_id *isl_map_get_tuple_id(
-		__isl_keep isl_map *map, enum isl_dim_type type);
-
-	const char *isl_basic_set_get_tuple_name(
-		__isl_keep isl_basic_set *bset);
-	__isl_give isl_basic_set *isl_basic_set_set_tuple_name(
-		__isl_take isl_basic_set *set, const char *s);
-	const char *isl_set_get_tuple_name(
-		__isl_keep isl_set *set);
-	const char *isl_basic_map_get_tuple_name(
-		__isl_keep isl_basic_map *bmap,
-		enum isl_dim_type type);
-	__isl_give isl_basic_map *isl_basic_map_set_tuple_name(
-		__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, const char *s);
-	const char *isl_map_get_tuple_name(
-		__isl_keep isl_map *map,
-		enum isl_dim_type type);
-
-As with C<isl_space_get_tuple_name>, the value returned points to
-an internal data structure.
-The identifiers, positions or names of individual dimensions can be
-read off using the following functions.
-
-	__isl_give isl_set *isl_set_set_dim_id(
-		__isl_take isl_set *set, enum isl_dim_type type,
-		unsigned pos, __isl_take isl_id *id);
-	int isl_set_has_dim_id(__isl_keep isl_set *set,
-		enum isl_dim_type type, unsigned pos);
-	__isl_give isl_id *isl_set_get_dim_id(
-		__isl_keep isl_set *set, enum isl_dim_type type,
-		unsigned pos);
-	int isl_basic_map_has_dim_id(
-		__isl_keep isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned pos);
-	__isl_give isl_map *isl_map_set_dim_id(
-		__isl_take isl_map *map, enum isl_dim_type type,
-		unsigned pos, __isl_take isl_id *id);
-	int isl_map_has_dim_id(__isl_keep isl_map *map,
-		enum isl_dim_type type, unsigned pos);
-	__isl_give isl_id *isl_map_get_dim_id(
-		__isl_keep isl_map *map, enum isl_dim_type type,
-		unsigned pos);
-
-	int isl_set_find_dim_by_id(__isl_keep isl_set *set,
-		enum isl_dim_type type, __isl_keep isl_id *id);
-	int isl_map_find_dim_by_id(__isl_keep isl_map *map,
-		enum isl_dim_type type, __isl_keep isl_id *id);
-	int isl_set_find_dim_by_name(__isl_keep isl_set *set,
-		enum isl_dim_type type, const char *name);
-	int isl_map_find_dim_by_name(__isl_keep isl_map *map,
-		enum isl_dim_type type, const char *name);
-
-	const char *isl_constraint_get_dim_name(
-		__isl_keep isl_constraint *constraint,
-		enum isl_dim_type type, unsigned pos);
-	const char *isl_basic_set_get_dim_name(
-		__isl_keep isl_basic_set *bset,
-		enum isl_dim_type type, unsigned pos);
-	const char *isl_set_get_dim_name(
-		__isl_keep isl_set *set,
-		enum isl_dim_type type, unsigned pos);
-	const char *isl_basic_map_get_dim_name(
-		__isl_keep isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned pos);
-	const char *isl_map_get_dim_name(
-		__isl_keep isl_map *map,
-		enum isl_dim_type type, unsigned pos);
-
-These functions are mostly useful to obtain the identifiers, positions
-or names of the parameters.  Identifiers of individual dimensions are
-essentially only useful for printing.  They are ignored by all other
-operations and may not be preserved across those operations.
-
-=head2 Properties
-
-=head3 Unary Properties
-
-=over
-
-=item * Emptiness
-
-The following functions test whether the given set or relation
-contains any integer points.  The ``plain'' variants do not perform
-any computations, but simply check if the given set or relation
-is already known to be empty.
-
-	int isl_basic_set_plain_is_empty(__isl_keep isl_basic_set *bset);
-	int isl_basic_set_is_empty(__isl_keep isl_basic_set *bset);
-	int isl_set_plain_is_empty(__isl_keep isl_set *set);
-	int isl_set_is_empty(__isl_keep isl_set *set);
-	int isl_union_set_is_empty(__isl_keep isl_union_set *uset);
-	int isl_basic_map_plain_is_empty(__isl_keep isl_basic_map *bmap);
-	int isl_basic_map_is_empty(__isl_keep isl_basic_map *bmap);
-	int isl_map_plain_is_empty(__isl_keep isl_map *map);
-	int isl_map_is_empty(__isl_keep isl_map *map);
-	int isl_union_map_is_empty(__isl_keep isl_union_map *umap);
-
-=item * Universality
-
-	int isl_basic_set_is_universe(__isl_keep isl_basic_set *bset);
-	int isl_basic_map_is_universe(__isl_keep isl_basic_map *bmap);
-	int isl_set_plain_is_universe(__isl_keep isl_set *set);
-
-=item * Single-valuedness
-
-	int isl_map_is_single_valued(__isl_keep isl_map *map);
-	int isl_union_map_is_single_valued(__isl_keep isl_union_map *umap);
-
-=item * Injectivity
-
-	int isl_map_plain_is_injective(__isl_keep isl_map *map);
-	int isl_map_is_injective(__isl_keep isl_map *map);
-	int isl_union_map_plain_is_injective(
-		__isl_keep isl_union_map *umap);
-	int isl_union_map_is_injective(
-		__isl_keep isl_union_map *umap);
-
-=item * Bijectivity
-
-	int isl_map_is_bijective(__isl_keep isl_map *map);
-	int isl_union_map_is_bijective(__isl_keep isl_union_map *umap);
-
-=item * Position
-
-	int isl_basic_map_plain_is_fixed(
-		__isl_keep isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned pos,
-		isl_int *val);
-	int isl_set_plain_is_fixed(__isl_keep isl_set *set,
-		enum isl_dim_type type, unsigned pos,
-		isl_int *val);
-	int isl_map_plain_is_fixed(__isl_keep isl_map *map,
-		enum isl_dim_type type, unsigned pos,
-		isl_int *val);
-
-Check if the relation obviously lies on a hyperplane where the given dimension
-has a fixed value and if so, return that value in C<*val>.
-
-=item * Space
-
-To check whether a set is a parameter domain, use this function:
-
-	int isl_set_is_params(__isl_keep isl_set *set);
-	int isl_union_set_is_params(
-		__isl_keep isl_union_set *uset);
-
-=item * Wrapping
-
-The following functions check whether the domain of the given
-(basic) set is a wrapped relation.
-
-	int isl_basic_set_is_wrapping(
-		__isl_keep isl_basic_set *bset);
-	int isl_set_is_wrapping(__isl_keep isl_set *set);
-
-=item * Internal Product
-
-	int isl_basic_map_can_zip(
-		__isl_keep isl_basic_map *bmap);
-	int isl_map_can_zip(__isl_keep isl_map *map);
-
-Check whether the product of domain and range of the given relation
-can be computed,
-i.e., whether both domain and range are nested relations.
-
-=back
-
-=head3 Binary Properties
-
-=over
-
-=item * Equality
-
-	int isl_set_plain_is_equal(__isl_keep isl_set *set1,
-		__isl_keep isl_set *set2);
-	int isl_set_is_equal(__isl_keep isl_set *set1,
-		__isl_keep isl_set *set2);
-	int isl_union_set_is_equal(
-		__isl_keep isl_union_set *uset1,
-		__isl_keep isl_union_set *uset2);
-	int isl_basic_map_is_equal(
-		__isl_keep isl_basic_map *bmap1,
-		__isl_keep isl_basic_map *bmap2);
-	int isl_map_is_equal(__isl_keep isl_map *map1,
-		__isl_keep isl_map *map2);
-	int isl_map_plain_is_equal(__isl_keep isl_map *map1,
-		__isl_keep isl_map *map2);
-	int isl_union_map_is_equal(
-		__isl_keep isl_union_map *umap1,
-		__isl_keep isl_union_map *umap2);
-
-=item * Disjointness
-
-	int isl_set_plain_is_disjoint(__isl_keep isl_set *set1,
-		__isl_keep isl_set *set2);
-
-=item * Subset
-
-	int isl_set_is_subset(__isl_keep isl_set *set1,
-		__isl_keep isl_set *set2);
-	int isl_set_is_strict_subset(
-		__isl_keep isl_set *set1,
-		__isl_keep isl_set *set2);
-	int isl_union_set_is_subset(
-		__isl_keep isl_union_set *uset1,
-		__isl_keep isl_union_set *uset2);
-	int isl_union_set_is_strict_subset(
-		__isl_keep isl_union_set *uset1,
-		__isl_keep isl_union_set *uset2);
-	int isl_basic_map_is_subset(
-		__isl_keep isl_basic_map *bmap1,
-		__isl_keep isl_basic_map *bmap2);
-	int isl_basic_map_is_strict_subset(
-		__isl_keep isl_basic_map *bmap1,
-		__isl_keep isl_basic_map *bmap2);
-	int isl_map_is_subset(
-		__isl_keep isl_map *map1,
-		__isl_keep isl_map *map2);
-	int isl_map_is_strict_subset(
-		__isl_keep isl_map *map1,
-		__isl_keep isl_map *map2);
-	int isl_union_map_is_subset(
-		__isl_keep isl_union_map *umap1,
-		__isl_keep isl_union_map *umap2);
-	int isl_union_map_is_strict_subset(
-		__isl_keep isl_union_map *umap1,
-		__isl_keep isl_union_map *umap2);
-
-=back
-
-=head2 Unary Operations
-
-=over
-
-=item * Complement
-
-	__isl_give isl_set *isl_set_complement(
-		__isl_take isl_set *set);
-
-=item * Inverse map
-
-	__isl_give isl_basic_map *isl_basic_map_reverse(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_map *isl_map_reverse(
-		__isl_take isl_map *map);
-	__isl_give isl_union_map *isl_union_map_reverse(
-		__isl_take isl_union_map *umap);
-
-=item * Projection
-
-	__isl_give isl_basic_set *isl_basic_set_project_out(
-		__isl_take isl_basic_set *bset,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	__isl_give isl_basic_map *isl_basic_map_project_out(
-		__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	__isl_give isl_set *isl_set_project_out(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	__isl_give isl_map *isl_map_project_out(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	__isl_give isl_basic_set *isl_basic_set_params(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_basic_set *isl_basic_map_domain(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_basic_set *isl_basic_map_range(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_set *isl_set_params(__isl_take isl_set *set);
-	__isl_give isl_set *isl_map_params(__isl_take isl_map *map);
-	__isl_give isl_set *isl_map_domain(
-		__isl_take isl_map *bmap);
-	__isl_give isl_set *isl_map_range(
-		__isl_take isl_map *map);
-	__isl_give isl_set *isl_union_set_params(
-		__isl_take isl_union_set *uset);
-	__isl_give isl_set *isl_union_map_params(
-		__isl_take isl_union_map *umap);
-	__isl_give isl_union_set *isl_union_map_domain(
-		__isl_take isl_union_map *umap);
-	__isl_give isl_union_set *isl_union_map_range(
-		__isl_take isl_union_map *umap);
-
-	__isl_give isl_basic_map *isl_basic_map_domain_map(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_basic_map *isl_basic_map_range_map(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_map *isl_map_domain_map(__isl_take isl_map *map);
-	__isl_give isl_map *isl_map_range_map(__isl_take isl_map *map);
-	__isl_give isl_union_map *isl_union_map_domain_map(
-		__isl_take isl_union_map *umap);
-	__isl_give isl_union_map *isl_union_map_range_map(
-		__isl_take isl_union_map *umap);
-
-The functions above construct a (basic, regular or union) relation
-that maps (a wrapped version of) the input relation to its domain or range.
-
-=item * Elimination
-
-	__isl_give isl_set *isl_set_eliminate(
-		__isl_take isl_set *set, enum isl_dim_type type,
-		unsigned first, unsigned n);
-	__isl_give isl_basic_map *isl_basic_map_eliminate(
-		__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type,
-		unsigned first, unsigned n);
-	__isl_give isl_map *isl_map_eliminate(
-		__isl_take isl_map *map, enum isl_dim_type type,
-		unsigned first, unsigned n);
-
-Eliminate the coefficients for the given dimensions from the constraints,
-without removing the dimensions.
-
-=item * Slicing
-
-	__isl_give isl_basic_set *isl_basic_set_fix(
-		__isl_take isl_basic_set *bset,
-		enum isl_dim_type type, unsigned pos,
-		isl_int value);
-	__isl_give isl_basic_set *isl_basic_set_fix_si(
-		__isl_take isl_basic_set *bset,
-		enum isl_dim_type type, unsigned pos, int value);
-	__isl_give isl_set *isl_set_fix(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos,
-		isl_int value);
-	__isl_give isl_set *isl_set_fix_si(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos, int value);
-	__isl_give isl_basic_map *isl_basic_map_fix_si(
-		__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned pos, int value);
-	__isl_give isl_map *isl_map_fix_si(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned pos, int value);
-
-Intersect the set or relation with the hyperplane where the given
-dimension has the fixed given value.
-
-	__isl_give isl_basic_map *isl_basic_map_lower_bound_si(
-		__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned pos, int value);
-	__isl_give isl_set *isl_set_lower_bound_si(
-		__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos, int value);
-	__isl_give isl_map *isl_map_lower_bound_si(
-		__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned pos, int value);
-	__isl_give isl_set *isl_set_upper_bound_si(
-		__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos, int value);
-	__isl_give isl_map *isl_map_upper_bound_si(
-		__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned pos, int value);
-
-Intersect the set or relation with the half-space where the given
-dimension has a value bounded the fixed given value.
-
-	__isl_give isl_set *isl_set_equate(__isl_take isl_set *set,
-		enum isl_dim_type type1, int pos1,
-		enum isl_dim_type type2, int pos2);
-	__isl_give isl_map *isl_map_equate(__isl_take isl_map *map,
-		enum isl_dim_type type1, int pos1,
-		enum isl_dim_type type2, int pos2);
-
-Intersect the set or relation with the hyperplane where the given
-dimensions are equal to each other.
-
-	__isl_give isl_map *isl_map_oppose(__isl_take isl_map *map,
-		enum isl_dim_type type1, int pos1,
-		enum isl_dim_type type2, int pos2);
-
-Intersect the relation with the hyperplane where the given
-dimensions have opposite values.
-
-=item * Identity
-
-	__isl_give isl_map *isl_set_identity(
-		__isl_take isl_set *set);
-	__isl_give isl_union_map *isl_union_set_identity(
-		__isl_take isl_union_set *uset);
-
-Construct an identity relation on the given (union) set.
-
-=item * Deltas
-
-	__isl_give isl_basic_set *isl_basic_map_deltas(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_set *isl_map_deltas(__isl_take isl_map *map);
-	__isl_give isl_union_set *isl_union_map_deltas(
-		__isl_take isl_union_map *umap);
-
-These functions return a (basic) set containing the differences
-between image elements and corresponding domain elements in the input.
-
-	__isl_give isl_basic_map *isl_basic_map_deltas_map(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_map *isl_map_deltas_map(
-		__isl_take isl_map *map);
-	__isl_give isl_union_map *isl_union_map_deltas_map(
-		__isl_take isl_union_map *umap);
-
-The functions above construct a (basic, regular or union) relation
-that maps (a wrapped version of) the input relation to its delta set.
-
-=item * Coalescing
-
-Simplify the representation of a set or relation by trying
-to combine pairs of basic sets or relations into a single
-basic set or relation.
-
-	__isl_give isl_set *isl_set_coalesce(__isl_take isl_set *set);
-	__isl_give isl_map *isl_map_coalesce(__isl_take isl_map *map);
-	__isl_give isl_union_set *isl_union_set_coalesce(
-		__isl_take isl_union_set *uset);
-	__isl_give isl_union_map *isl_union_map_coalesce(
-		__isl_take isl_union_map *umap);
-
-=item * Detecting equalities
-
-	__isl_give isl_basic_set *isl_basic_set_detect_equalities(
-                __isl_take isl_basic_set *bset);
-	__isl_give isl_basic_map *isl_basic_map_detect_equalities(
-                __isl_take isl_basic_map *bmap);
-	__isl_give isl_set *isl_set_detect_equalities(
-		__isl_take isl_set *set);
-	__isl_give isl_map *isl_map_detect_equalities(
-		__isl_take isl_map *map);
-	__isl_give isl_union_set *isl_union_set_detect_equalities(
-		__isl_take isl_union_set *uset);
-	__isl_give isl_union_map *isl_union_map_detect_equalities(
-		__isl_take isl_union_map *umap);
-
-Simplify the representation of a set or relation by detecting implicit
-equalities.
-
-=item * Removing redundant constraints
-
-	__isl_give isl_basic_set *isl_basic_set_remove_redundancies(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_set *isl_set_remove_redundancies(
-		__isl_take isl_set *set);
-	__isl_give isl_basic_map *isl_basic_map_remove_redundancies(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_map *isl_map_remove_redundancies(
-		__isl_take isl_map *map);
-
-=item * Convex hull
-
-	__isl_give isl_basic_set *isl_set_convex_hull(
-		__isl_take isl_set *set);
-	__isl_give isl_basic_map *isl_map_convex_hull(
-		__isl_take isl_map *map);
-
-If the input set or relation has any existentially quantified
-variables, then the result of these operations is currently undefined.
-
-=item * Simple hull
-
-	__isl_give isl_basic_set *isl_set_simple_hull(
-		__isl_take isl_set *set);
-	__isl_give isl_basic_map *isl_map_simple_hull(
-		__isl_take isl_map *map);
-	__isl_give isl_union_map *isl_union_map_simple_hull(
-		__isl_take isl_union_map *umap);
-
-These functions compute a single basic set or relation
-that contains the whole input set or relation.
-In particular, the output is described by translates
-of the constraints describing the basic sets or relations in the input.
-
-=begin latex
-
-(See \autoref{s:simple hull}.)
-
-=end latex
-
-=item * Affine hull
-
-	__isl_give isl_basic_set *isl_basic_set_affine_hull(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_basic_set *isl_set_affine_hull(
-		__isl_take isl_set *set);
-	__isl_give isl_union_set *isl_union_set_affine_hull(
-		__isl_take isl_union_set *uset);
-	__isl_give isl_basic_map *isl_basic_map_affine_hull(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_basic_map *isl_map_affine_hull(
-		__isl_take isl_map *map);
-	__isl_give isl_union_map *isl_union_map_affine_hull(
-		__isl_take isl_union_map *umap);
-
-In case of union sets and relations, the affine hull is computed
-per space.
-
-=item * Polyhedral hull
-
-	__isl_give isl_basic_set *isl_set_polyhedral_hull(
-		__isl_take isl_set *set);
-	__isl_give isl_basic_map *isl_map_polyhedral_hull(
-		__isl_take isl_map *map);
-	__isl_give isl_union_set *isl_union_set_polyhedral_hull(
-		__isl_take isl_union_set *uset);
-	__isl_give isl_union_map *isl_union_map_polyhedral_hull(
-		__isl_take isl_union_map *umap);
-
-These functions compute a single basic set or relation
-not involving any existentially quantified variables
-that contains the whole input set or relation.
-In case of union sets and relations, the polyhedral hull is computed
-per space.
-
-=item * Optimization
-
-	#include <isl/ilp.h>
-	enum isl_lp_result isl_basic_set_max(
-		__isl_keep isl_basic_set *bset,
-		__isl_keep isl_aff *obj, isl_int *opt)
-	enum isl_lp_result isl_set_min(__isl_keep isl_set *set,
-		__isl_keep isl_aff *obj, isl_int *opt);
-	enum isl_lp_result isl_set_max(__isl_keep isl_set *set,
-		__isl_keep isl_aff *obj, isl_int *opt);
-
-Compute the minimum or maximum of the integer affine expression C<obj>
-over the points in C<set>, returning the result in C<opt>.
-The return value may be one of C<isl_lp_error>,
-C<isl_lp_ok>, C<isl_lp_unbounded> or C<isl_lp_empty>.
-
-=item * Parametric optimization
-
-	__isl_give isl_pw_aff *isl_set_dim_min(
-		__isl_take isl_set *set, int pos);
-	__isl_give isl_pw_aff *isl_set_dim_max(
-		__isl_take isl_set *set, int pos);
-	__isl_give isl_pw_aff *isl_map_dim_max(
-		__isl_take isl_map *map, int pos);
-
-Compute the minimum or maximum of the given set or output dimension
-as a function of the parameters (and input dimensions), but independently
-of the other set or output dimensions.
-For lexicographic optimization, see L<"Lexicographic Optimization">.
-
-=item * Dual
-
-The following functions compute either the set of (rational) coefficient
-values of valid constraints for the given set or the set of (rational)
-values satisfying the constraints with coefficients from the given set.
-Internally, these two sets of functions perform essentially the
-same operations, except that the set of coefficients is assumed to
-be a cone, while the set of values may be any polyhedron.
-The current implementation is based on the Farkas lemma and
-Fourier-Motzkin elimination, but this may change or be made optional
-in future.  In particular, future implementations may use different
-dualization algorithms or skip the elimination step.
-
-	__isl_give isl_basic_set *isl_basic_set_coefficients(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_basic_set *isl_set_coefficients(
-		__isl_take isl_set *set);
-	__isl_give isl_union_set *isl_union_set_coefficients(
-		__isl_take isl_union_set *bset);
-	__isl_give isl_basic_set *isl_basic_set_solutions(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_basic_set *isl_set_solutions(
-		__isl_take isl_set *set);
-	__isl_give isl_union_set *isl_union_set_solutions(
-		__isl_take isl_union_set *bset);
-
-=item * Power
-
-	__isl_give isl_map *isl_map_power(__isl_take isl_map *map,
-		int *exact);
-	__isl_give isl_union_map *isl_union_map_power(
-		__isl_take isl_union_map *umap, int *exact);
-
-Compute a parametric representation for all positive powers I<k> of C<map>.
-The result maps I<k> to a nested relation corresponding to the
-I<k>th power of C<map>.
-The result may be an overapproximation.  If the result is known to be exact,
-then C<*exact> is set to C<1>.
-
-=item * Transitive closure
-
-	__isl_give isl_map *isl_map_transitive_closure(
-		__isl_take isl_map *map, int *exact);
-	__isl_give isl_union_map *isl_union_map_transitive_closure(
-		__isl_take isl_union_map *umap, int *exact);
-
-Compute the transitive closure of C<map>.
-The result may be an overapproximation.  If the result is known to be exact,
-then C<*exact> is set to C<1>.
-
-=item * Reaching path lengths
-
-	__isl_give isl_map *isl_map_reaching_path_lengths(
-		__isl_take isl_map *map, int *exact);
-
-Compute a relation that maps each element in the range of C<map>
-to the lengths of all paths composed of edges in C<map> that
-end up in the given element.
-The result may be an overapproximation.  If the result is known to be exact,
-then C<*exact> is set to C<1>.
-To compute the I<maximal> path length, the resulting relation
-should be postprocessed by C<isl_map_lexmax>.
-In particular, if the input relation is a dependence relation
-(mapping sources to sinks), then the maximal path length corresponds
-to the free schedule.
-Note, however, that C<isl_map_lexmax> expects the maximum to be
-finite, so if the path lengths are unbounded (possibly due to
-the overapproximation), then you will get an error message.
-
-=item * Wrapping
-
-	__isl_give isl_basic_set *isl_basic_map_wrap(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_set *isl_map_wrap(
-		__isl_take isl_map *map);
-	__isl_give isl_union_set *isl_union_map_wrap(
-		__isl_take isl_union_map *umap);
-	__isl_give isl_basic_map *isl_basic_set_unwrap(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_map *isl_set_unwrap(
-		__isl_take isl_set *set);
-	__isl_give isl_union_map *isl_union_set_unwrap(
-		__isl_take isl_union_set *uset);
-
-=item * Flattening
-
-Remove any internal structure of domain (and range) of the given
-set or relation.  If there is any such internal structure in the input,
-then the name of the space is also removed.
-
-	__isl_give isl_basic_set *isl_basic_set_flatten(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_set *isl_set_flatten(
-		__isl_take isl_set *set);
-	__isl_give isl_basic_map *isl_basic_map_flatten_domain(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_basic_map *isl_basic_map_flatten_range(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_map *isl_map_flatten_range(
-		__isl_take isl_map *map);
-	__isl_give isl_map *isl_map_flatten_domain(
-		__isl_take isl_map *map);
-	__isl_give isl_basic_map *isl_basic_map_flatten(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_map *isl_map_flatten(
-		__isl_take isl_map *map);
-
-	__isl_give isl_map *isl_set_flatten_map(
-		__isl_take isl_set *set);
-
-The function above constructs a relation
-that maps the input set to a flattened version of the set.
-
-=item * Lifting
-
-Lift the input set to a space with extra dimensions corresponding
-to the existentially quantified variables in the input.
-In particular, the result lives in a wrapped map where the domain
-is the original space and the range corresponds to the original
-existentially quantified variables.
-
-	__isl_give isl_basic_set *isl_basic_set_lift(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_set *isl_set_lift(
-		__isl_take isl_set *set);
-	__isl_give isl_union_set *isl_union_set_lift(
-		__isl_take isl_union_set *uset);
-
-Given a local space that contains the existentially quantified
-variables of a set, a basic relation that, when applied to
-a basic set, has essentially the same effect as C<isl_basic_set_lift>,
-can be constructed using the following function.
-
-	#include <isl/local_space.h>
-	__isl_give isl_basic_map *isl_local_space_lifting(
-		__isl_take isl_local_space *ls);
-
-=item * Internal Product
-
-	__isl_give isl_basic_map *isl_basic_map_zip(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_map *isl_map_zip(
-		__isl_take isl_map *map);
-	__isl_give isl_union_map *isl_union_map_zip(
-		__isl_take isl_union_map *umap);
-
-Given a relation with nested relations for domain and range,
-interchange the range of the domain with the domain of the range.
-
-=item * Aligning parameters
-
-	__isl_give isl_set *isl_set_align_params(
-		__isl_take isl_set *set,
-		__isl_take isl_space *model);
-	__isl_give isl_map *isl_map_align_params(
-		__isl_take isl_map *map,
-		__isl_take isl_space *model);
-
-Change the order of the parameters of the given set or relation
-such that the first parameters match those of C<model>.
-This may involve the introduction of extra parameters.
-All parameters need to be named.
-
-=item * Dimension manipulation
-
-	__isl_give isl_set *isl_set_add_dims(
-		__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned n);
-	__isl_give isl_map *isl_map_add_dims(
-		__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned n);
-	__isl_give isl_set *isl_set_insert_dims(
-		__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos, unsigned n);
-	__isl_give isl_map *isl_map_insert_dims(
-		__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned pos, unsigned n);
-	__isl_give isl_basic_set *isl_basic_set_move_dims(
-		__isl_take isl_basic_set *bset,
-		enum isl_dim_type dst_type, unsigned dst_pos,
-		enum isl_dim_type src_type, unsigned src_pos,
-		unsigned n);
-	__isl_give isl_basic_map *isl_basic_map_move_dims(
-		__isl_take isl_basic_map *bmap,
-		enum isl_dim_type dst_type, unsigned dst_pos,
-		enum isl_dim_type src_type, unsigned src_pos,
-		unsigned n);
-	__isl_give isl_set *isl_set_move_dims(
-		__isl_take isl_set *set,
-		enum isl_dim_type dst_type, unsigned dst_pos,
-		enum isl_dim_type src_type, unsigned src_pos,
-		unsigned n);
-	__isl_give isl_map *isl_map_move_dims(
-		__isl_take isl_map *map,
-		enum isl_dim_type dst_type, unsigned dst_pos,
-		enum isl_dim_type src_type, unsigned src_pos,
-		unsigned n);
-
-It is usually not advisable to directly change the (input or output)
-space of a set or a relation as this removes the name and the internal
-structure of the space.  However, the above functions can be useful
-to add new parameters, assuming
-C<isl_set_align_params> and C<isl_map_align_params>
-are not sufficient.
-
-=back
-
-=head2 Binary Operations
-
-The two arguments of a binary operation not only need to live
-in the same C<isl_ctx>, they currently also need to have
-the same (number of) parameters.
-
-=head3 Basic Operations
-
-=over
-
-=item * Intersection
-
-	__isl_give isl_basic_set *isl_basic_set_intersect_params(
-		__isl_take isl_basic_set *bset1,
-		__isl_take isl_basic_set *bset2);
-	__isl_give isl_basic_set *isl_basic_set_intersect(
-		__isl_take isl_basic_set *bset1,
-		__isl_take isl_basic_set *bset2);
-	__isl_give isl_set *isl_set_intersect_params(
-		__isl_take isl_set *set,
-		__isl_take isl_set *params);
-	__isl_give isl_set *isl_set_intersect(
-		__isl_take isl_set *set1,
-		__isl_take isl_set *set2);
-	__isl_give isl_union_set *isl_union_set_intersect_params(
-		__isl_take isl_union_set *uset,
-		__isl_take isl_set *set);
-	__isl_give isl_union_map *isl_union_map_intersect_params(
-		__isl_take isl_union_map *umap,
-		__isl_take isl_set *set);
-	__isl_give isl_union_set *isl_union_set_intersect(
-		__isl_take isl_union_set *uset1,
-		__isl_take isl_union_set *uset2);
-	__isl_give isl_basic_map *isl_basic_map_intersect_domain(
-		__isl_take isl_basic_map *bmap,
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_basic_map *isl_basic_map_intersect_range(
-		__isl_take isl_basic_map *bmap,
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_basic_map *isl_basic_map_intersect(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-	__isl_give isl_map *isl_map_intersect_params(
-		__isl_take isl_map *map,
-		__isl_take isl_set *params);
-	__isl_give isl_map *isl_map_intersect_domain(
-		__isl_take isl_map *map,
-		__isl_take isl_set *set);
-	__isl_give isl_map *isl_map_intersect_range(
-		__isl_take isl_map *map,
-		__isl_take isl_set *set);
-	__isl_give isl_map *isl_map_intersect(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-	__isl_give isl_union_map *isl_union_map_intersect_domain(
-		__isl_take isl_union_map *umap,
-		__isl_take isl_union_set *uset);
-	__isl_give isl_union_map *isl_union_map_intersect_range(
-		__isl_take isl_union_map *umap,
-		__isl_take isl_union_set *uset);
-	__isl_give isl_union_map *isl_union_map_intersect(
-		__isl_take isl_union_map *umap1,
-		__isl_take isl_union_map *umap2);
-
-=item * Union
-
-	__isl_give isl_set *isl_basic_set_union(
-		__isl_take isl_basic_set *bset1,
-		__isl_take isl_basic_set *bset2);
-	__isl_give isl_map *isl_basic_map_union(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-	__isl_give isl_set *isl_set_union(
-		__isl_take isl_set *set1,
-		__isl_take isl_set *set2);
-	__isl_give isl_map *isl_map_union(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-	__isl_give isl_union_set *isl_union_set_union(
-		__isl_take isl_union_set *uset1,
-		__isl_take isl_union_set *uset2);
-	__isl_give isl_union_map *isl_union_map_union(
-		__isl_take isl_union_map *umap1,
-		__isl_take isl_union_map *umap2);
-
-=item * Set difference
-
-	__isl_give isl_set *isl_set_subtract(
-		__isl_take isl_set *set1,
-		__isl_take isl_set *set2);
-	__isl_give isl_map *isl_map_subtract(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-	__isl_give isl_map *isl_map_subtract_domain(
-		__isl_take isl_map *map,
-		__isl_take isl_set *dom);
-	__isl_give isl_map *isl_map_subtract_range(
-		__isl_take isl_map *map,
-		__isl_take isl_set *dom);
-	__isl_give isl_union_set *isl_union_set_subtract(
-		__isl_take isl_union_set *uset1,
-		__isl_take isl_union_set *uset2);
-	__isl_give isl_union_map *isl_union_map_subtract(
-		__isl_take isl_union_map *umap1,
-		__isl_take isl_union_map *umap2);
-
-=item * Application
-
-	__isl_give isl_basic_set *isl_basic_set_apply(
-		__isl_take isl_basic_set *bset,
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_set *isl_set_apply(
-		__isl_take isl_set *set,
-		__isl_take isl_map *map);
-	__isl_give isl_union_set *isl_union_set_apply(
-		__isl_take isl_union_set *uset,
-		__isl_take isl_union_map *umap);
-	__isl_give isl_basic_map *isl_basic_map_apply_domain(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-	__isl_give isl_basic_map *isl_basic_map_apply_range(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-	__isl_give isl_map *isl_map_apply_domain(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-	__isl_give isl_union_map *isl_union_map_apply_domain(
-		__isl_take isl_union_map *umap1,
-		__isl_take isl_union_map *umap2);
-	__isl_give isl_map *isl_map_apply_range(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-	__isl_give isl_union_map *isl_union_map_apply_range(
-		__isl_take isl_union_map *umap1,
-		__isl_take isl_union_map *umap2);
-
-=item * Cartesian Product
-
-	__isl_give isl_set *isl_set_product(
-		__isl_take isl_set *set1,
-		__isl_take isl_set *set2);
-	__isl_give isl_union_set *isl_union_set_product(
-		__isl_take isl_union_set *uset1,
-		__isl_take isl_union_set *uset2);
-	__isl_give isl_basic_map *isl_basic_map_domain_product(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-	__isl_give isl_basic_map *isl_basic_map_range_product(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-	__isl_give isl_map *isl_map_domain_product(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-	__isl_give isl_map *isl_map_range_product(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-	__isl_give isl_union_map *isl_union_map_range_product(
-		__isl_take isl_union_map *umap1,
-		__isl_take isl_union_map *umap2);
-	__isl_give isl_map *isl_map_product(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-	__isl_give isl_union_map *isl_union_map_product(
-		__isl_take isl_union_map *umap1,
-		__isl_take isl_union_map *umap2);
-
-The above functions compute the cross product of the given
-sets or relations.  The domains and ranges of the results
-are wrapped maps between domains and ranges of the inputs.
-To obtain a ``flat'' product, use the following functions
-instead.
-
-	__isl_give isl_basic_set *isl_basic_set_flat_product(
-		__isl_take isl_basic_set *bset1,
-		__isl_take isl_basic_set *bset2);
-	__isl_give isl_set *isl_set_flat_product(
-		__isl_take isl_set *set1,
-		__isl_take isl_set *set2);
-	__isl_give isl_basic_map *isl_basic_map_flat_range_product(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-	__isl_give isl_map *isl_map_flat_domain_product(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-	__isl_give isl_map *isl_map_flat_range_product(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-	__isl_give isl_union_map *isl_union_map_flat_range_product(
-		__isl_take isl_union_map *umap1,
-		__isl_take isl_union_map *umap2);
-	__isl_give isl_basic_map *isl_basic_map_flat_product(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-	__isl_give isl_map *isl_map_flat_product(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-
-=item * Simplification
-
-	__isl_give isl_basic_set *isl_basic_set_gist(
-		__isl_take isl_basic_set *bset,
-		__isl_take isl_basic_set *context);
-	__isl_give isl_set *isl_set_gist(__isl_take isl_set *set,
-		__isl_take isl_set *context);
-	__isl_give isl_set *isl_set_gist_params(
-		__isl_take isl_set *set,
-		__isl_take isl_set *context);
-	__isl_give isl_union_set *isl_union_set_gist(
-		__isl_take isl_union_set *uset,
-		__isl_take isl_union_set *context);
-	__isl_give isl_union_set *isl_union_set_gist_params(
-		__isl_take isl_union_set *uset,
-		__isl_take isl_set *set);
-	__isl_give isl_basic_map *isl_basic_map_gist(
-		__isl_take isl_basic_map *bmap,
-		__isl_take isl_basic_map *context);
-	__isl_give isl_map *isl_map_gist(__isl_take isl_map *map,
-		__isl_take isl_map *context);
-	__isl_give isl_map *isl_map_gist_params(
-		__isl_take isl_map *map,
-		__isl_take isl_set *context);
-	__isl_give isl_map *isl_map_gist_domain(
-		__isl_take isl_map *map,
-		__isl_take isl_set *context);
-	__isl_give isl_map *isl_map_gist_range(
-		__isl_take isl_map *map,
-		__isl_take isl_set *context);
-	__isl_give isl_union_map *isl_union_map_gist(
-		__isl_take isl_union_map *umap,
-		__isl_take isl_union_map *context);
-	__isl_give isl_union_map *isl_union_map_gist_params(
-		__isl_take isl_union_map *umap,
-		__isl_take isl_set *set);
-	__isl_give isl_union_map *isl_union_map_gist_domain(
-		__isl_take isl_union_map *umap,
-		__isl_take isl_union_set *uset);
-
-The gist operation returns a set or relation that has the
-same intersection with the context as the input set or relation.
-Any implicit equality in the intersection is made explicit in the result,
-while all inequalities that are redundant with respect to the intersection
-are removed.
-In case of union sets and relations, the gist operation is performed
-per space.
-
-=back
-
-=head3 Lexicographic Optimization
-
-Given a (basic) set C<set> (or C<bset>) and a zero-dimensional domain C<dom>,
-the following functions
-compute a set that contains the lexicographic minimum or maximum
-of the elements in C<set> (or C<bset>) for those values of the parameters
-that satisfy C<dom>.
-If C<empty> is not C<NULL>, then C<*empty> is assigned a set
-that contains the parameter values in C<dom> for which C<set> (or C<bset>)
-has no elements.
-In other words, the union of the parameter values
-for which the result is non-empty and of C<*empty>
-is equal to C<dom>.
-
-	__isl_give isl_set *isl_basic_set_partial_lexmin(
-		__isl_take isl_basic_set *bset,
-		__isl_take isl_basic_set *dom,
-		__isl_give isl_set **empty);
-	__isl_give isl_set *isl_basic_set_partial_lexmax(
-		__isl_take isl_basic_set *bset,
-		__isl_take isl_basic_set *dom,
-		__isl_give isl_set **empty);
-	__isl_give isl_set *isl_set_partial_lexmin(
-		__isl_take isl_set *set, __isl_take isl_set *dom,
-		__isl_give isl_set **empty);
-	__isl_give isl_set *isl_set_partial_lexmax(
-		__isl_take isl_set *set, __isl_take isl_set *dom,
-		__isl_give isl_set **empty);
-
-Given a (basic) set C<set> (or C<bset>), the following functions simply
-return a set containing the lexicographic minimum or maximum
-of the elements in C<set> (or C<bset>).
-In case of union sets, the optimum is computed per space.
-
-	__isl_give isl_set *isl_basic_set_lexmin(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_set *isl_basic_set_lexmax(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_set *isl_set_lexmin(
-		__isl_take isl_set *set);
-	__isl_give isl_set *isl_set_lexmax(
-		__isl_take isl_set *set);
-	__isl_give isl_union_set *isl_union_set_lexmin(
-		__isl_take isl_union_set *uset);
-	__isl_give isl_union_set *isl_union_set_lexmax(
-		__isl_take isl_union_set *uset);
-
-Given a (basic) relation C<map> (or C<bmap>) and a domain C<dom>,
-the following functions
-compute a relation that maps each element of C<dom>
-to the single lexicographic minimum or maximum
-of the elements that are associated to that same
-element in C<map> (or C<bmap>).
-If C<empty> is not C<NULL>, then C<*empty> is assigned a set
-that contains the elements in C<dom> that do not map
-to any elements in C<map> (or C<bmap>).
-In other words, the union of the domain of the result and of C<*empty>
-is equal to C<dom>.
-
-	__isl_give isl_map *isl_basic_map_partial_lexmax(
-		__isl_take isl_basic_map *bmap,
-		__isl_take isl_basic_set *dom,
-		__isl_give isl_set **empty);
-	__isl_give isl_map *isl_basic_map_partial_lexmin(
-		__isl_take isl_basic_map *bmap,
-		__isl_take isl_basic_set *dom,
-		__isl_give isl_set **empty);
-	__isl_give isl_map *isl_map_partial_lexmax(
-		__isl_take isl_map *map, __isl_take isl_set *dom,
-		__isl_give isl_set **empty);
-	__isl_give isl_map *isl_map_partial_lexmin(
-		__isl_take isl_map *map, __isl_take isl_set *dom,
-		__isl_give isl_set **empty);
-
-Given a (basic) map C<map> (or C<bmap>), the following functions simply
-return a map mapping each element in the domain of
-C<map> (or C<bmap>) to the lexicographic minimum or maximum
-of all elements associated to that element.
-In case of union relations, the optimum is computed per space.
-
-	__isl_give isl_map *isl_basic_map_lexmin(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_map *isl_basic_map_lexmax(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_map *isl_map_lexmin(
-		__isl_take isl_map *map);
-	__isl_give isl_map *isl_map_lexmax(
-		__isl_take isl_map *map);
-	__isl_give isl_union_map *isl_union_map_lexmin(
-		__isl_take isl_union_map *umap);
-	__isl_give isl_union_map *isl_union_map_lexmax(
-		__isl_take isl_union_map *umap);
-
-The following functions return their result in the form of
-a piecewise multi-affine expression
-(See L<"Piecewise Multiple Quasi Affine Expressions">),
-but are otherwise equivalent to the corresponding functions
-returning a basic set or relation.
-
-	__isl_give isl_pw_multi_aff *
-	isl_basic_map_lexmin_pw_multi_aff(
-		__isl_take isl_basic_map *bmap);
-	__isl_give isl_pw_multi_aff *
-	isl_basic_set_partial_lexmin_pw_multi_aff(
-		__isl_take isl_basic_set *bset,
-		__isl_take isl_basic_set *dom,
-		__isl_give isl_set **empty);
-	__isl_give isl_pw_multi_aff *
-	isl_basic_set_partial_lexmax_pw_multi_aff(
-		__isl_take isl_basic_set *bset,
-		__isl_take isl_basic_set *dom,
-		__isl_give isl_set **empty);
-	__isl_give isl_pw_multi_aff *
-	isl_basic_map_partial_lexmin_pw_multi_aff(
-		__isl_take isl_basic_map *bmap,
-		__isl_take isl_basic_set *dom,
-		__isl_give isl_set **empty);
-	__isl_give isl_pw_multi_aff *
-	isl_basic_map_partial_lexmax_pw_multi_aff(
-		__isl_take isl_basic_map *bmap,
-		__isl_take isl_basic_set *dom,
-		__isl_give isl_set **empty);
-
-=head2 Lists
-
-Lists are defined over several element types, including
-C<isl_aff>, C<isl_pw_aff>, C<isl_basic_set> and C<isl_set>.
-Here we take lists of C<isl_set>s as an example.
-Lists can be created, copied and freed using the following functions.
-
-	#include <isl/list.h>
-	__isl_give isl_set_list *isl_set_list_from_set(
-		__isl_take isl_set *el);
-	__isl_give isl_set_list *isl_set_list_alloc(
-		isl_ctx *ctx, int n);
-	__isl_give isl_set_list *isl_set_list_copy(
-		__isl_keep isl_set_list *list);
-	__isl_give isl_set_list *isl_set_list_add(
-		__isl_take isl_set_list *list,
-		__isl_take isl_set *el);
-	__isl_give isl_set_list *isl_set_list_concat(
-		__isl_take isl_set_list *list1,
-		__isl_take isl_set_list *list2);
-	void *isl_set_list_free(__isl_take isl_set_list *list);
-
-C<isl_set_list_alloc> creates an empty list with a capacity for
-C<n> elements.  C<isl_set_list_from_set> creates a list with a single
-element.
-
-Lists can be inspected using the following functions.
-
-	#include <isl/list.h>
-	isl_ctx *isl_set_list_get_ctx(__isl_keep isl_set_list *list);
-	int isl_set_list_n_set(__isl_keep isl_set_list *list);
-	__isl_give isl_set *isl_set_list_get_set(
-		__isl_keep isl_set_list *list, int index);
-	int isl_set_list_foreach(__isl_keep isl_set_list *list,
-		int (*fn)(__isl_take isl_set *el, void *user),
-		void *user);
-
-Lists can be printed using
-
-	#include <isl/list.h>
-	__isl_give isl_printer *isl_printer_print_set_list(
-		__isl_take isl_printer *p,
-		__isl_keep isl_set_list *list);
-
-=head2 Matrices
-
-Matrices can be created, copied and freed using the following functions.
-
-	#include <isl/mat.h>
-	__isl_give isl_mat *isl_mat_alloc(isl_ctx *ctx,
-		unsigned n_row, unsigned n_col);
-	__isl_give isl_mat *isl_mat_copy(__isl_keep isl_mat *mat);
-	void isl_mat_free(__isl_take isl_mat *mat);
-
-Note that the elements of a newly created matrix may have arbitrary values.
-The elements can be changed and inspected using the following functions.
-
-	isl_ctx *isl_mat_get_ctx(__isl_keep isl_mat *mat);
-	int isl_mat_rows(__isl_keep isl_mat *mat);
-	int isl_mat_cols(__isl_keep isl_mat *mat);
-	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,
-		int row, int col, isl_int v);
-	__isl_give isl_mat *isl_mat_set_element_si(__isl_take isl_mat *mat,
-		int row, int col, int v);
-
-C<isl_mat_get_element> will return a negative value if anything went wrong.
-In that case, the value of C<*v> is undefined.
-
-The following function can be used to compute the (right) inverse
-of a matrix, i.e., a matrix such that the product of the original
-and the inverse (in that order) is a multiple of the identity matrix.
-The input matrix is assumed to be of full row-rank.
-
-	__isl_give isl_mat *isl_mat_right_inverse(__isl_take isl_mat *mat);
-
-The following function can be used to compute the (right) kernel
-(or null space) of a matrix, i.e., a matrix such that the product of
-the original and the kernel (in that order) is the zero matrix.
-
-	__isl_give isl_mat *isl_mat_right_kernel(__isl_take isl_mat *mat);
-
-=head2 Piecewise Quasi Affine Expressions
-
-The zero quasi affine expression on a given domain can be created using
-
-	__isl_give isl_aff *isl_aff_zero_on_domain(
-		__isl_take isl_local_space *ls);
-
-Note that the space in which the resulting object lives is a map space
-with the given space as domain and a one-dimensional range.
-
-An empty piecewise quasi affine expression (one with no cells)
-or a piecewise quasi affine expression with a single cell can
-be created using the following functions.
-
-	#include <isl/aff.h>
-	__isl_give isl_pw_aff *isl_pw_aff_empty(
-		__isl_take isl_space *space);
-	__isl_give isl_pw_aff *isl_pw_aff_alloc(
-		__isl_take isl_set *set, __isl_take isl_aff *aff);
-	__isl_give isl_pw_aff *isl_pw_aff_from_aff(
-		__isl_take isl_aff *aff);
-
-Quasi affine expressions can be copied and freed using
-
-	#include <isl/aff.h>
-	__isl_give isl_aff *isl_aff_copy(__isl_keep isl_aff *aff);
-	void *isl_aff_free(__isl_take isl_aff *aff);
-
-	__isl_give isl_pw_aff *isl_pw_aff_copy(
-		__isl_keep isl_pw_aff *pwaff);
-	void *isl_pw_aff_free(__isl_take isl_pw_aff *pwaff);
-
-A (rational) bound on a dimension can be extracted from an C<isl_constraint>
-using the following function.  The constraint is required to have
-a non-zero coefficient for the specified dimension.
-
-	#include <isl/constraint.h>
-	__isl_give isl_aff *isl_constraint_get_bound(
-		__isl_keep isl_constraint *constraint,
-		enum isl_dim_type type, int pos);
-
-The entire affine expression of the constraint can also be extracted
-using the following function.
-
-	#include <isl/constraint.h>
-	__isl_give isl_aff *isl_constraint_get_aff(
-		__isl_keep isl_constraint *constraint);
-
-Conversely, an equality constraint equating
-the affine expression to zero or an inequality constraint enforcing
-the affine expression to be non-negative, can be constructed using
-
-	__isl_give isl_constraint *isl_equality_from_aff(
-		__isl_take isl_aff *aff);
-	__isl_give isl_constraint *isl_inequality_from_aff(
-		__isl_take isl_aff *aff);
-
-The expression can be inspected using
-
-	#include <isl/aff.h>
-	isl_ctx *isl_aff_get_ctx(__isl_keep isl_aff *aff);
-	int isl_aff_dim(__isl_keep isl_aff *aff,
-		enum isl_dim_type type);
-	__isl_give isl_local_space *isl_aff_get_domain_local_space(
-		__isl_keep isl_aff *aff);
-	__isl_give isl_local_space *isl_aff_get_local_space(
-		__isl_keep isl_aff *aff);
-	const char *isl_aff_get_dim_name(__isl_keep isl_aff *aff,
-		enum isl_dim_type type, unsigned pos);
-	const char *isl_pw_aff_get_dim_name(
-		__isl_keep isl_pw_aff *pa,
-		enum isl_dim_type type, unsigned pos);
-	int isl_pw_aff_has_dim_id(__isl_keep isl_pw_aff *pa,
-		enum isl_dim_type type, unsigned pos);
-	__isl_give isl_id *isl_pw_aff_get_dim_id(
-		__isl_keep isl_pw_aff *pa,
-		enum isl_dim_type type, unsigned pos);
-	int isl_aff_get_constant(__isl_keep isl_aff *aff,
-		isl_int *v);
-	int isl_aff_get_coefficient(__isl_keep isl_aff *aff,
-		enum isl_dim_type type, int pos, isl_int *v);
-	int isl_aff_get_denominator(__isl_keep isl_aff *aff,
-		isl_int *v);
-	__isl_give isl_aff *isl_aff_get_div(
-		__isl_keep isl_aff *aff, int pos);
-
-	int isl_pw_aff_foreach_piece(__isl_keep isl_pw_aff *pwaff,
-		int (*fn)(__isl_take isl_set *set,
-			  __isl_take isl_aff *aff,
-			  void *user), void *user);
-
-	int isl_aff_is_cst(__isl_keep isl_aff *aff);
-	int isl_pw_aff_is_cst(__isl_keep isl_pw_aff *pwaff);
-
-	int isl_aff_involves_dims(__isl_keep isl_aff *aff,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	int isl_pw_aff_involves_dims(__isl_keep isl_pw_aff *pwaff,
-		enum isl_dim_type type, unsigned first, unsigned n);
-
-	isl_ctx *isl_pw_aff_get_ctx(__isl_keep isl_pw_aff *pwaff);
-	unsigned isl_pw_aff_dim(__isl_keep isl_pw_aff *pwaff,
-		enum isl_dim_type type);
-	int isl_pw_aff_is_empty(__isl_keep isl_pw_aff *pwaff);
-
-It can be modified using
-
-	#include <isl/aff.h>
-	__isl_give isl_pw_aff *isl_pw_aff_set_tuple_id(
-		__isl_take isl_pw_aff *pwaff,
-		enum isl_dim_type type, __isl_take isl_id *id);
-	__isl_give isl_aff *isl_aff_set_dim_name(
-		__isl_take isl_aff *aff, enum isl_dim_type type,
-		unsigned pos, const char *s);
-	__isl_give isl_aff *isl_aff_set_dim_id(
-		__isl_take isl_aff *aff, enum isl_dim_type type,
-		unsigned pos, __isl_take isl_id *id);
-	__isl_give isl_pw_aff *isl_pw_aff_set_dim_id(
-		__isl_take isl_pw_aff *pma,
-		enum isl_dim_type type, unsigned pos,
-		__isl_take isl_id *id);
-	__isl_give isl_aff *isl_aff_set_constant(
-		__isl_take isl_aff *aff, isl_int v);
-	__isl_give isl_aff *isl_aff_set_constant_si(
-		__isl_take isl_aff *aff, int v);
-	__isl_give isl_aff *isl_aff_set_coefficient(
-		__isl_take isl_aff *aff,
-		enum isl_dim_type type, int pos, isl_int v);
-	__isl_give isl_aff *isl_aff_set_coefficient_si(
-		__isl_take isl_aff *aff,
-		enum isl_dim_type type, int pos, int v);
-	__isl_give isl_aff *isl_aff_set_denominator(
-		__isl_take isl_aff *aff, isl_int v);
-
-	__isl_give isl_aff *isl_aff_add_constant(
-		__isl_take isl_aff *aff, isl_int v);
-	__isl_give isl_aff *isl_aff_add_constant_si(
-		__isl_take isl_aff *aff, int v);
-	__isl_give isl_aff *isl_aff_add_coefficient(
-		__isl_take isl_aff *aff,
-		enum isl_dim_type type, int pos, isl_int v);
-	__isl_give isl_aff *isl_aff_add_coefficient_si(
-		__isl_take isl_aff *aff,
-		enum isl_dim_type type, int pos, int v);
-
-	__isl_give isl_aff *isl_aff_insert_dims(
-		__isl_take isl_aff *aff,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	__isl_give isl_pw_aff *isl_pw_aff_insert_dims(
-		__isl_take isl_pw_aff *pwaff,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	__isl_give isl_aff *isl_aff_add_dims(
-		__isl_take isl_aff *aff,
-		enum isl_dim_type type, unsigned n);
-	__isl_give isl_pw_aff *isl_pw_aff_add_dims(
-		__isl_take isl_pw_aff *pwaff,
-		enum isl_dim_type type, unsigned n);
-	__isl_give isl_aff *isl_aff_drop_dims(
-		__isl_take isl_aff *aff,
-		enum isl_dim_type type, unsigned first, unsigned n);
-	__isl_give isl_pw_aff *isl_pw_aff_drop_dims(
-		__isl_take isl_pw_aff *pwaff,
-		enum isl_dim_type type, unsigned first, unsigned n);
-
-Note that the C<set_constant> and C<set_coefficient> functions
-set the I<numerator> of the constant or coefficient, while
-C<add_constant> and C<add_coefficient> add an integer value to
-the possibly rational constant or coefficient.
-
-To check whether an affine expressions is obviously zero
-or obviously equal to some other affine expression, use
-
-	#include <isl/aff.h>
-	int isl_aff_plain_is_zero(__isl_keep isl_aff *aff);
-	int isl_aff_plain_is_equal(__isl_keep isl_aff *aff1,
-		__isl_keep isl_aff *aff2);
-	int isl_pw_aff_plain_is_equal(
-		__isl_keep isl_pw_aff *pwaff1,
-		__isl_keep isl_pw_aff *pwaff2);
-
-Operations include
-
-	#include <isl/aff.h>
-	__isl_give isl_aff *isl_aff_add(__isl_take isl_aff *aff1,
-		__isl_take isl_aff *aff2);
-	__isl_give isl_pw_aff *isl_pw_aff_add(
-		__isl_take isl_pw_aff *pwaff1,
-		__isl_take isl_pw_aff *pwaff2);
-	__isl_give isl_pw_aff *isl_pw_aff_min(
-		__isl_take isl_pw_aff *pwaff1,
-		__isl_take isl_pw_aff *pwaff2);
-	__isl_give isl_pw_aff *isl_pw_aff_max(
-		__isl_take isl_pw_aff *pwaff1,
-		__isl_take isl_pw_aff *pwaff2);
-	__isl_give isl_aff *isl_aff_sub(__isl_take isl_aff *aff1,
-		__isl_take isl_aff *aff2);
-	__isl_give isl_pw_aff *isl_pw_aff_sub(
-		__isl_take isl_pw_aff *pwaff1,
-		__isl_take isl_pw_aff *pwaff2);
-	__isl_give isl_aff *isl_aff_neg(__isl_take isl_aff *aff);
-	__isl_give isl_pw_aff *isl_pw_aff_neg(
-		__isl_take isl_pw_aff *pwaff);
-	__isl_give isl_aff *isl_aff_ceil(__isl_take isl_aff *aff);
-	__isl_give isl_pw_aff *isl_pw_aff_ceil(
-		__isl_take isl_pw_aff *pwaff);
-	__isl_give isl_aff *isl_aff_floor(__isl_take isl_aff *aff);
-	__isl_give isl_pw_aff *isl_pw_aff_floor(
-		__isl_take isl_pw_aff *pwaff);
-	__isl_give isl_aff *isl_aff_mod(__isl_take isl_aff *aff,
-		isl_int mod);
-	__isl_give isl_pw_aff *isl_pw_aff_mod(
-		__isl_take isl_pw_aff *pwaff, isl_int mod);
-	__isl_give isl_aff *isl_aff_scale(__isl_take isl_aff *aff,
-		isl_int f);
-	__isl_give isl_pw_aff *isl_pw_aff_scale(
-		__isl_take isl_pw_aff *pwaff, isl_int f);
-	__isl_give isl_aff *isl_aff_scale_down(__isl_take isl_aff *aff,
-		isl_int f);
-	__isl_give isl_aff *isl_aff_scale_down_ui(
-		__isl_take isl_aff *aff, unsigned f);
-	__isl_give isl_pw_aff *isl_pw_aff_scale_down(
-		__isl_take isl_pw_aff *pwaff, isl_int f);
-
-	__isl_give isl_pw_aff *isl_pw_aff_list_min(
-		__isl_take isl_pw_aff_list *list);
-	__isl_give isl_pw_aff *isl_pw_aff_list_max(
-		__isl_take isl_pw_aff_list *list);
-
-	__isl_give isl_pw_aff *isl_pw_aff_coalesce(
-		__isl_take isl_pw_aff *pwqp);
-
-	__isl_give isl_pw_aff *isl_pw_aff_align_params(
-		__isl_take isl_pw_aff *pwaff,
-		__isl_take isl_space *model);
-
-	__isl_give isl_aff *isl_aff_gist_params(
-		__isl_take isl_aff *aff,
-		__isl_take isl_set *context);
-	__isl_give isl_aff *isl_aff_gist(__isl_take isl_aff *aff,
-		__isl_take isl_set *context);
-	__isl_give isl_pw_aff *isl_pw_aff_gist_params(
-		__isl_take isl_pw_aff *pwaff,
-		__isl_take isl_set *context);
-	__isl_give isl_pw_aff *isl_pw_aff_gist(
-		__isl_take isl_pw_aff *pwaff,
-		__isl_take isl_set *context);
-
-	__isl_give isl_set *isl_pw_aff_domain(
-		__isl_take isl_pw_aff *pwaff);
-	__isl_give isl_pw_aff *isl_pw_aff_intersect_domain(
-		__isl_take isl_pw_aff *pa,
-		__isl_take isl_set *set);
-	__isl_give isl_pw_aff *isl_pw_aff_intersect_params(
-		__isl_take isl_pw_aff *pa,
-		__isl_take isl_set *set);
-
-	__isl_give isl_aff *isl_aff_mul(__isl_take isl_aff *aff1,
-		__isl_take isl_aff *aff2);
-	__isl_give isl_pw_aff *isl_pw_aff_mul(
-		__isl_take isl_pw_aff *pwaff1,
-		__isl_take isl_pw_aff *pwaff2);
-
-When multiplying two affine expressions, at least one of the two needs
-to be a constant.
-
-	#include <isl/aff.h>
-	__isl_give isl_basic_set *isl_aff_le_basic_set(
-		__isl_take isl_aff *aff1, __isl_take isl_aff *aff2);
-	__isl_give isl_basic_set *isl_aff_ge_basic_set(
-		__isl_take isl_aff *aff1, __isl_take isl_aff *aff2);
-	__isl_give isl_set *isl_pw_aff_eq_set(
-		__isl_take isl_pw_aff *pwaff1,
-		__isl_take isl_pw_aff *pwaff2);
-	__isl_give isl_set *isl_pw_aff_ne_set(
-		__isl_take isl_pw_aff *pwaff1,
-		__isl_take isl_pw_aff *pwaff2);
-	__isl_give isl_set *isl_pw_aff_le_set(
-		__isl_take isl_pw_aff *pwaff1,
-		__isl_take isl_pw_aff *pwaff2);
-	__isl_give isl_set *isl_pw_aff_lt_set(
-		__isl_take isl_pw_aff *pwaff1,
-		__isl_take isl_pw_aff *pwaff2);
-	__isl_give isl_set *isl_pw_aff_ge_set(
-		__isl_take isl_pw_aff *pwaff1,
-		__isl_take isl_pw_aff *pwaff2);
-	__isl_give isl_set *isl_pw_aff_gt_set(
-		__isl_take isl_pw_aff *pwaff1,
-		__isl_take isl_pw_aff *pwaff2);
-
-	__isl_give isl_set *isl_pw_aff_list_eq_set(
-		__isl_take isl_pw_aff_list *list1,
-		__isl_take isl_pw_aff_list *list2);
-	__isl_give isl_set *isl_pw_aff_list_ne_set(
-		__isl_take isl_pw_aff_list *list1,
-		__isl_take isl_pw_aff_list *list2);
-	__isl_give isl_set *isl_pw_aff_list_le_set(
-		__isl_take isl_pw_aff_list *list1,
-		__isl_take isl_pw_aff_list *list2);
-	__isl_give isl_set *isl_pw_aff_list_lt_set(
-		__isl_take isl_pw_aff_list *list1,
-		__isl_take isl_pw_aff_list *list2);
-	__isl_give isl_set *isl_pw_aff_list_ge_set(
-		__isl_take isl_pw_aff_list *list1,
-		__isl_take isl_pw_aff_list *list2);
-	__isl_give isl_set *isl_pw_aff_list_gt_set(
-		__isl_take isl_pw_aff_list *list1,
-		__isl_take isl_pw_aff_list *list2);
-
-The function C<isl_aff_ge_basic_set> returns a basic set
-containing those elements in the shared space
-of C<aff1> and C<aff2> where C<aff1> is greater than or equal to C<aff2>.
-The function C<isl_aff_ge_set> returns a set
-containing those elements in the shared domain
-of C<pwaff1> and C<pwaff2> where C<pwaff1> is greater than or equal to C<pwaff2>.
-The functions operating on C<isl_pw_aff_list> apply the corresponding
-C<isl_pw_aff> function to each pair of elements in the two lists.
-
-	#include <isl/aff.h>
-	__isl_give isl_set *isl_pw_aff_nonneg_set(
-		__isl_take isl_pw_aff *pwaff);
-	__isl_give isl_set *isl_pw_aff_zero_set(
-		__isl_take isl_pw_aff *pwaff);
-	__isl_give isl_set *isl_pw_aff_non_zero_set(
-		__isl_take isl_pw_aff *pwaff);
-
-The function C<isl_pw_aff_nonneg_set> returns a set
-containing those elements in the domain
-of C<pwaff> where C<pwaff> is non-negative.
-
-	#include <isl/aff.h>
-	__isl_give isl_pw_aff *isl_pw_aff_cond(
-		__isl_take isl_set *cond,
-		__isl_take isl_pw_aff *pwaff_true,
-		__isl_take isl_pw_aff *pwaff_false);
-
-The function C<isl_pw_aff_cond> performs a conditional operator
-and returns an expression that is equal to C<pwaff_true>
-for elements in C<cond> and equal to C<pwaff_false> for elements
-not in C<cond>.
-
-	#include <isl/aff.h>
-	__isl_give isl_pw_aff *isl_pw_aff_union_min(
-		__isl_take isl_pw_aff *pwaff1,
-		__isl_take isl_pw_aff *pwaff2);
-	__isl_give isl_pw_aff *isl_pw_aff_union_max(
-		__isl_take isl_pw_aff *pwaff1,
-		__isl_take isl_pw_aff *pwaff2);
-	__isl_give isl_pw_aff *isl_pw_aff_union_add(
-		__isl_take isl_pw_aff *pwaff1,
-		__isl_take isl_pw_aff *pwaff2);
-
-The function C<isl_pw_aff_union_max> computes a piecewise quasi-affine
-expression with a domain that is the union of those of C<pwaff1> and
-C<pwaff2> and such that on each cell, the quasi-affine expression is
-the maximum of those of C<pwaff1> and C<pwaff2>.  If only one of
-C<pwaff1> or C<pwaff2> is defined on a given cell, then the
-associated expression is the defined one.
-
-An expression can be read from input using
-
-	#include <isl/aff.h>
-	__isl_give isl_aff *isl_aff_read_from_str(
-		isl_ctx *ctx, const char *str);
-	__isl_give isl_pw_aff *isl_pw_aff_read_from_str(
-		isl_ctx *ctx, const char *str);
-
-An expression can be printed using
-
-	#include <isl/aff.h>
-	__isl_give isl_printer *isl_printer_print_aff(
-		__isl_take isl_printer *p, __isl_keep isl_aff *aff);
-
-	__isl_give isl_printer *isl_printer_print_pw_aff(
-		__isl_take isl_printer *p,
-		__isl_keep isl_pw_aff *pwaff);
-
-=head2 Piecewise Multiple Quasi Affine Expressions
-
-An C<isl_multi_aff> object represents a sequence of
-zero or more affine expressions, all defined on the same domain space.
-
-An C<isl_multi_aff> can be constructed from a C<isl_aff_list> using the
-following function.
-
-	#include <isl/aff.h>
-	__isl_give isl_multi_aff *isl_multi_aff_from_aff_list(
-		__isl_take isl_space *space,
-		__isl_take isl_aff_list *list);
-
-An empty piecewise multiple quasi affine expression (one with no cells) or
-a piecewise multiple quasi affine expression with a single cell can
-be created using the following functions.
-
-	#include <isl/aff.h>
-	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_empty(
-		__isl_take isl_space *space);
-	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_alloc(
-		__isl_take isl_set *set,
-		__isl_take isl_multi_aff *maff);
-
-A piecewise multiple quasi affine expression can also be initialized
-from an C<isl_set> or C<isl_map>, provided the C<isl_set> is a singleton
-and the C<isl_map> is single-valued.
-
-	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_from_set(
-		__isl_take isl_set *set);
-	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_from_map(
-		__isl_take isl_map *map);
-
-Multiple quasi affine expressions can be copied and freed using
-
-	#include <isl/aff.h>
-	__isl_give isl_multi_aff *isl_multi_aff_copy(
-		__isl_keep isl_multi_aff *maff);
-	void *isl_multi_aff_free(__isl_take isl_multi_aff *maff);
-
-	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_copy(
-		__isl_keep isl_pw_multi_aff *pma);
-	void *isl_pw_multi_aff_free(
-		__isl_take isl_pw_multi_aff *pma);
-
-The expression can be inspected using
-
-	#include <isl/aff.h>
-	isl_ctx *isl_multi_aff_get_ctx(
-		__isl_keep isl_multi_aff *maff);
-	isl_ctx *isl_pw_multi_aff_get_ctx(
-		__isl_keep isl_pw_multi_aff *pma);
-	unsigned isl_multi_aff_dim(__isl_keep isl_multi_aff *maff,
-		enum isl_dim_type type);
-	unsigned isl_pw_multi_aff_dim(
-		__isl_keep isl_pw_multi_aff *pma,
-		enum isl_dim_type type);
-	__isl_give isl_aff *isl_multi_aff_get_aff(
-		__isl_keep isl_multi_aff *multi, int pos);
-	const char *isl_pw_multi_aff_get_dim_name(
-		__isl_keep isl_pw_multi_aff *pma,
-		enum isl_dim_type type, unsigned pos);
-	__isl_give isl_id *isl_pw_multi_aff_get_dim_id(
-		__isl_keep isl_pw_multi_aff *pma,
-		enum isl_dim_type type, unsigned pos);
-	const char *isl_multi_aff_get_tuple_name(
-		__isl_keep isl_multi_aff *multi,
-		enum isl_dim_type type);
-	const char *isl_pw_multi_aff_get_tuple_name(
-		__isl_keep isl_pw_multi_aff *pma,
-		enum isl_dim_type type);
-	int isl_pw_multi_aff_has_tuple_id(
-		__isl_keep isl_pw_multi_aff *pma,
-		enum isl_dim_type type);
-	__isl_give isl_id *isl_pw_multi_aff_get_tuple_id(
-		__isl_keep isl_pw_multi_aff *pma,
-		enum isl_dim_type type);
-
-	int isl_pw_multi_aff_foreach_piece(
-		__isl_keep isl_pw_multi_aff *pma,
-		int (*fn)(__isl_take isl_set *set,
-			    __isl_take isl_multi_aff *maff,
-			    void *user), void *user);
-
-It can be modified using
-
-	#include <isl/aff.h>
-	__isl_give isl_multi_aff *isl_multi_aff_set_dim_name(
-		__isl_take isl_multi_aff *maff,
-		enum isl_dim_type type, unsigned pos, const char *s);
-	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_set_tuple_id(
-		__isl_take isl_pw_multi_aff *pma,
-		enum isl_dim_type type, __isl_take isl_id *id);
-
-To check whether two multiple affine expressions are
-obviously equal to each other, use
-
-	int isl_multi_aff_plain_is_equal(__isl_keep isl_multi_aff *maff1,
-		__isl_keep isl_multi_aff *maff2);
-	int isl_pw_multi_aff_plain_is_equal(
-		__isl_keep isl_pw_multi_aff *pma1,
-		__isl_keep isl_pw_multi_aff *pma2);
-
-Operations include
-
-	#include <isl/aff.h>
-	__isl_give isl_multi_aff *isl_multi_aff_add(
-		__isl_take isl_multi_aff *maff1,
-		__isl_take isl_multi_aff *maff2);
-	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_add(
-		__isl_take isl_pw_multi_aff *pma1,
-		__isl_take isl_pw_multi_aff *pma2);
-	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_union_add(
-		__isl_take isl_pw_multi_aff *pma1,
-		__isl_take isl_pw_multi_aff *pma2);
-	__isl_give isl_multi_aff *isl_multi_aff_scale(
-		__isl_take isl_multi_aff *maff,
-		isl_int f);
-	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_intersect_params(
-		__isl_take isl_pw_multi_aff *pma,
-		__isl_take isl_set *set);
-	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_intersect_domain(
-		__isl_take isl_pw_multi_aff *pma,
-		__isl_take isl_set *set);
-	__isl_give isl_multi_aff *isl_multi_aff_lift(
-		__isl_take isl_multi_aff *maff,
-		__isl_give isl_local_space **ls);
-	__isl_give isl_multi_aff *isl_multi_aff_gist_params(
-		__isl_take isl_multi_aff *maff,
-		__isl_take isl_set *context);
-	__isl_give isl_multi_aff *isl_multi_aff_gist(
-		__isl_take isl_multi_aff *maff,
-		__isl_take isl_set *context);
-	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_gist_params(
-		__isl_take isl_pw_multi_aff *pma,
-		__isl_take isl_set *set);
-	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_gist(
-		__isl_take isl_pw_multi_aff *pma,
-		__isl_take isl_set *set);
-
-If the C<ls> argument of C<isl_multi_aff_lift> is not C<NULL>,
-then it is assigned the local space that lies at the basis of
-the lifting applied.
-
-An expression can be read from input using
-
-	#include <isl/aff.h>
-	__isl_give isl_multi_aff *isl_multi_aff_read_from_str(
-		isl_ctx *ctx, const char *str);
-	__isl_give isl_pw_multi_aff *isl_pw_multi_aff_read_from_str(
-		isl_ctx *ctx, const char *str);
-
-An expression can be printed using
-
-	#include <isl/aff.h>
-	__isl_give isl_printer *isl_printer_print_multi_aff(
-		__isl_take isl_printer *p,
-		__isl_keep isl_multi_aff *maff);
-	__isl_give isl_printer *isl_printer_print_pw_multi_aff(
-		__isl_take isl_printer *p,
-		__isl_keep isl_pw_multi_aff *pma);
-
-=head2 Points
-
-Points are elements of a set.  They can be used to construct
-simple sets (boxes) or they can be used to represent the
-individual elements of a set.
-The zero point (the origin) can be created using
-
-	__isl_give isl_point *isl_point_zero(__isl_take isl_space *space);
-
-The coordinates of a point can be inspected, set and changed
-using
-
-	int isl_point_get_coordinate(__isl_keep isl_point *pnt,
-		enum isl_dim_type type, int pos, isl_int *v);
-	__isl_give isl_point *isl_point_set_coordinate(
-		__isl_take isl_point *pnt,
-		enum isl_dim_type type, int pos, isl_int v);
-
-	__isl_give isl_point *isl_point_add_ui(
-		__isl_take isl_point *pnt,
-		enum isl_dim_type type, int pos, unsigned val);
-	__isl_give isl_point *isl_point_sub_ui(
-		__isl_take isl_point *pnt,
-		enum isl_dim_type type, int pos, unsigned val);
-
-Other properties can be obtained using
-
-	isl_ctx *isl_point_get_ctx(__isl_keep isl_point *pnt);
-
-Points can be copied or freed using
-
-	__isl_give isl_point *isl_point_copy(
-		__isl_keep isl_point *pnt);
-	void isl_point_free(__isl_take isl_point *pnt);
-
-A singleton set can be created from a point using
-
-	__isl_give isl_basic_set *isl_basic_set_from_point(
-		__isl_take isl_point *pnt);
-	__isl_give isl_set *isl_set_from_point(
-		__isl_take isl_point *pnt);
-
-and a box can be created from two opposite extremal points using
-
-	__isl_give isl_basic_set *isl_basic_set_box_from_points(
-		__isl_take isl_point *pnt1,
-		__isl_take isl_point *pnt2);
-	__isl_give isl_set *isl_set_box_from_points(
-		__isl_take isl_point *pnt1,
-		__isl_take isl_point *pnt2);
-
-All elements of a B<bounded> (union) set can be enumerated using
-the following functions.
-
-	int isl_set_foreach_point(__isl_keep isl_set *set,
-		int (*fn)(__isl_take isl_point *pnt, void *user),
-		void *user);
-	int isl_union_set_foreach_point(__isl_keep isl_union_set *uset,
-		int (*fn)(__isl_take isl_point *pnt, void *user),
-		void *user);
-
-The function C<fn> is called for each integer point in
-C<set> with as second argument the last argument of
-the C<isl_set_foreach_point> call.  The function C<fn>
-should return C<0> on success and C<-1> on failure.
-In the latter case, C<isl_set_foreach_point> will stop
-enumerating and return C<-1> as well.
-If the enumeration is performed successfully and to completion,
-then C<isl_set_foreach_point> returns C<0>.
-
-To obtain a single point of a (basic) set, use
-
-	__isl_give isl_point *isl_basic_set_sample_point(
-		__isl_take isl_basic_set *bset);
-	__isl_give isl_point *isl_set_sample_point(
-		__isl_take isl_set *set);
-
-If C<set> does not contain any (integer) points, then the
-resulting point will be ``void'', a property that can be
-tested using
-
-	int isl_point_is_void(__isl_keep isl_point *pnt);
-
-=head2 Piecewise Quasipolynomials
-
-A piecewise quasipolynomial is a particular kind of function that maps
-a parametric point to a rational value.
-More specifically, a quasipolynomial is a polynomial expression in greatest
-integer parts of affine expressions of parameters and variables.
-A piecewise quasipolynomial is a subdivision of a given parametric
-domain into disjoint cells with a quasipolynomial associated to
-each cell.  The value of the piecewise quasipolynomial at a given
-point is the value of the quasipolynomial associated to the cell
-that contains the point.  Outside of the union of cells,
-the value is assumed to be zero.
-For example, the piecewise quasipolynomial
-
-	[n] -> { [x] -> ((1 + n) - x) : x <= n and x >= 0 }
-
-maps C<x> to C<1 + n - x> for values of C<x> between C<0> and C<n>.
-A given piecewise quasipolynomial has a fixed domain dimension.
-Union piecewise quasipolynomials are used to contain piecewise quasipolynomials
-defined over different domains.
-Piecewise quasipolynomials are mainly used by the C<barvinok>
-library for representing the number of elements in a parametric set or map.
-For example, the piecewise quasipolynomial above represents
-the number of points in the map
-
-	[n] -> { [x] -> [y] : x,y >= 0 and 0 <= x + y <= n }
-
-=head3 Input and Output
-
-Piecewise quasipolynomials can be read from input using
-
-	__isl_give isl_union_pw_qpolynomial *
-	isl_union_pw_qpolynomial_read_from_str(
-		isl_ctx *ctx, const char *str);
-
-Quasipolynomials and piecewise quasipolynomials can be printed
-using the following functions.
-
-	__isl_give isl_printer *isl_printer_print_qpolynomial(
-		__isl_take isl_printer *p,
-		__isl_keep isl_qpolynomial *qp);
-
-	__isl_give isl_printer *isl_printer_print_pw_qpolynomial(
-		__isl_take isl_printer *p,
-		__isl_keep isl_pw_qpolynomial *pwqp);
-
-	__isl_give isl_printer *isl_printer_print_union_pw_qpolynomial(
-		__isl_take isl_printer *p,
-		__isl_keep isl_union_pw_qpolynomial *upwqp);
-
-The output format of the printer
-needs to be set to either C<ISL_FORMAT_ISL> or C<ISL_FORMAT_C>.
-For C<isl_printer_print_union_pw_qpolynomial>, only C<ISL_FORMAT_ISL>
-is supported.
-In case of printing in C<ISL_FORMAT_C>, the user may want
-to set the names of all dimensions
-
-	__isl_give isl_qpolynomial *isl_qpolynomial_set_dim_name(
-		__isl_take isl_qpolynomial *qp,
-		enum isl_dim_type type, unsigned pos,
-		const char *s);
-	__isl_give isl_pw_qpolynomial *
-	isl_pw_qpolynomial_set_dim_name(
-		__isl_take isl_pw_qpolynomial *pwqp,
-		enum isl_dim_type type, unsigned pos,
-		const char *s);
-
-=head3 Creating New (Piecewise) Quasipolynomials
-
-Some simple quasipolynomials can be created using the following functions.
-More complicated quasipolynomials can be created by applying
-operations such as addition and multiplication
-on the resulting quasipolynomials
-
-	__isl_give isl_qpolynomial *isl_qpolynomial_zero_on_domain(
-		__isl_take isl_space *domain);
-	__isl_give isl_qpolynomial *isl_qpolynomial_one_on_domain(
-		__isl_take isl_space *domain);
-	__isl_give isl_qpolynomial *isl_qpolynomial_infty_on_domain(
-		__isl_take isl_space *domain);
-	__isl_give isl_qpolynomial *isl_qpolynomial_neginfty_on_domain(
-		__isl_take isl_space *domain);
-	__isl_give isl_qpolynomial *isl_qpolynomial_nan_on_domain(
-		__isl_take isl_space *domain);
-	__isl_give isl_qpolynomial *isl_qpolynomial_rat_cst_on_domain(
-		__isl_take isl_space *domain,
-		const isl_int n, const isl_int d);
-	__isl_give isl_qpolynomial *isl_qpolynomial_var_on_domain(
-		__isl_take isl_space *domain,
-		enum isl_dim_type type, unsigned pos);
-	__isl_give isl_qpolynomial *isl_qpolynomial_from_aff(
-		__isl_take isl_aff *aff);
-
-Note that the space in which a quasipolynomial lives is a map space
-with a one-dimensional range.  The C<domain> argument in some of
-the functions above corresponds to the domain of this map space.
-
-The zero piecewise quasipolynomial or a piecewise quasipolynomial
-with a single cell can be created using the following functions.
-Multiple of these single cell piecewise quasipolynomials can
-be combined to create more complicated piecewise quasipolynomials.
-
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_zero(
-		__isl_take isl_space *space);
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_alloc(
-		__isl_take isl_set *set,
-		__isl_take isl_qpolynomial *qp);
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_from_qpolynomial(
-		__isl_take isl_qpolynomial *qp);
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_from_pw_aff(
-		__isl_take isl_pw_aff *pwaff);
-
-	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_zero(
-		__isl_take isl_space *space);
-	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_from_pw_qpolynomial(
-		__isl_take isl_pw_qpolynomial *pwqp);
-	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_add_pw_qpolynomial(
-		__isl_take isl_union_pw_qpolynomial *upwqp,
-		__isl_take isl_pw_qpolynomial *pwqp);
-
-Quasipolynomials can be copied and freed again using the following
-functions.
-
-	__isl_give isl_qpolynomial *isl_qpolynomial_copy(
-		__isl_keep isl_qpolynomial *qp);
-	void *isl_qpolynomial_free(__isl_take isl_qpolynomial *qp);
-
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_copy(
-		__isl_keep isl_pw_qpolynomial *pwqp);
-	void *isl_pw_qpolynomial_free(
-		__isl_take isl_pw_qpolynomial *pwqp);
-
-	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_copy(
-		__isl_keep isl_union_pw_qpolynomial *upwqp);
-	void isl_union_pw_qpolynomial_free(
-		__isl_take isl_union_pw_qpolynomial *upwqp);
-
-=head3 Inspecting (Piecewise) Quasipolynomials
-
-To iterate over all piecewise quasipolynomials in a union
-piecewise quasipolynomial, use the following function
-
-	int isl_union_pw_qpolynomial_foreach_pw_qpolynomial(
-		__isl_keep isl_union_pw_qpolynomial *upwqp,
-		int (*fn)(__isl_take isl_pw_qpolynomial *pwqp, void *user),
-		void *user);
-
-To extract the piecewise quasipolynomial in a given space from a union, use
-
-	__isl_give isl_pw_qpolynomial *
-	isl_union_pw_qpolynomial_extract_pw_qpolynomial(
-		__isl_keep isl_union_pw_qpolynomial *upwqp,
-		__isl_take isl_space *space);
-
-To iterate over the cells in a piecewise quasipolynomial,
-use either of the following two functions
-
-	int isl_pw_qpolynomial_foreach_piece(
-		__isl_keep isl_pw_qpolynomial *pwqp,
-		int (*fn)(__isl_take isl_set *set,
-			  __isl_take isl_qpolynomial *qp,
-			  void *user), void *user);
-	int isl_pw_qpolynomial_foreach_lifted_piece(
-		__isl_keep isl_pw_qpolynomial *pwqp,
-		int (*fn)(__isl_take isl_set *set,
-			  __isl_take isl_qpolynomial *qp,
-			  void *user), void *user);
-
-As usual, the function C<fn> should return C<0> on success
-and C<-1> on failure.  The difference between
-C<isl_pw_qpolynomial_foreach_piece> and
-C<isl_pw_qpolynomial_foreach_lifted_piece> is that
-C<isl_pw_qpolynomial_foreach_lifted_piece> will first
-compute unique representations for all existentially quantified
-variables and then turn these existentially quantified variables
-into extra set variables, adapting the associated quasipolynomial
-accordingly.  This means that the C<set> passed to C<fn>
-will not have any existentially quantified variables, but that
-the dimensions of the sets may be different for different
-invocations of C<fn>.
-
-To iterate over all terms in a quasipolynomial,
-use
-
-	int isl_qpolynomial_foreach_term(
-		__isl_keep isl_qpolynomial *qp,
-		int (*fn)(__isl_take isl_term *term,
-			  void *user), void *user);
-
-The terms themselves can be inspected and freed using
-these functions
-
-	unsigned isl_term_dim(__isl_keep isl_term *term,
-		enum isl_dim_type type);
-	void isl_term_get_num(__isl_keep isl_term *term,
-		isl_int *n);
-	void isl_term_get_den(__isl_keep isl_term *term,
-		isl_int *d);
-	int isl_term_get_exp(__isl_keep isl_term *term,
-		enum isl_dim_type type, unsigned pos);
-	__isl_give isl_aff *isl_term_get_div(
-		__isl_keep isl_term *term, unsigned pos);
-	void isl_term_free(__isl_take isl_term *term);
-
-Each term is a product of parameters, set variables and
-integer divisions.  The function C<isl_term_get_exp>
-returns the exponent of a given dimensions in the given term.
-The C<isl_int>s in the arguments of C<isl_term_get_num>
-and C<isl_term_get_den> need to have been initialized
-using C<isl_int_init> before calling these functions.
-
-=head3 Properties of (Piecewise) Quasipolynomials
-
-To check whether a quasipolynomial is actually a constant,
-use the following function.
-
-	int isl_qpolynomial_is_cst(__isl_keep isl_qpolynomial *qp,
-		isl_int *n, isl_int *d);
-
-If C<qp> is a constant and if C<n> and C<d> are not C<NULL>
-then the numerator and denominator of the constant
-are returned in C<*n> and C<*d>, respectively.
-
-To check whether two union piecewise quasipolynomials are
-obviously equal, use
-
-	int isl_union_pw_qpolynomial_plain_is_equal(
-		__isl_keep isl_union_pw_qpolynomial *upwqp1,
-		__isl_keep isl_union_pw_qpolynomial *upwqp2);
-
-=head3 Operations on (Piecewise) Quasipolynomials
-
-	__isl_give isl_qpolynomial *isl_qpolynomial_scale(
-		__isl_take isl_qpolynomial *qp, isl_int v);
-	__isl_give isl_qpolynomial *isl_qpolynomial_neg(
-		__isl_take isl_qpolynomial *qp);
-	__isl_give isl_qpolynomial *isl_qpolynomial_add(
-		__isl_take isl_qpolynomial *qp1,
-		__isl_take isl_qpolynomial *qp2);
-	__isl_give isl_qpolynomial *isl_qpolynomial_sub(
-		__isl_take isl_qpolynomial *qp1,
-		__isl_take isl_qpolynomial *qp2);
-	__isl_give isl_qpolynomial *isl_qpolynomial_mul(
-		__isl_take isl_qpolynomial *qp1,
-		__isl_take isl_qpolynomial *qp2);
-	__isl_give isl_qpolynomial *isl_qpolynomial_pow(
-		__isl_take isl_qpolynomial *qp, unsigned exponent);
-
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add(
-		__isl_take isl_pw_qpolynomial *pwqp1,
-		__isl_take isl_pw_qpolynomial *pwqp2);
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_sub(
-		__isl_take isl_pw_qpolynomial *pwqp1,
-		__isl_take isl_pw_qpolynomial *pwqp2);
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add_disjoint(
-		__isl_take isl_pw_qpolynomial *pwqp1,
-		__isl_take isl_pw_qpolynomial *pwqp2);
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_neg(
-		__isl_take isl_pw_qpolynomial *pwqp);
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_mul(
-		__isl_take isl_pw_qpolynomial *pwqp1,
-		__isl_take isl_pw_qpolynomial *pwqp2);
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_pow(
-		__isl_take isl_pw_qpolynomial *pwqp, unsigned exponent);
-
-	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_add(
-		__isl_take isl_union_pw_qpolynomial *upwqp1,
-		__isl_take isl_union_pw_qpolynomial *upwqp2);
-	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_sub(
-		__isl_take isl_union_pw_qpolynomial *upwqp1,
-		__isl_take isl_union_pw_qpolynomial *upwqp2);
-	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_mul(
-		__isl_take isl_union_pw_qpolynomial *upwqp1,
-		__isl_take isl_union_pw_qpolynomial *upwqp2);
-
-	__isl_give isl_qpolynomial *isl_pw_qpolynomial_eval(
-		__isl_take isl_pw_qpolynomial *pwqp,
-		__isl_take isl_point *pnt);
-
-	__isl_give isl_qpolynomial *isl_union_pw_qpolynomial_eval(
-		__isl_take isl_union_pw_qpolynomial *upwqp,
-		__isl_take isl_point *pnt);
-
-	__isl_give isl_set *isl_pw_qpolynomial_domain(
-		__isl_take isl_pw_qpolynomial *pwqp);
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_intersect_domain(
-		__isl_take isl_pw_qpolynomial *pwpq,
-		__isl_take isl_set *set);
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_intersect_params(
-		__isl_take isl_pw_qpolynomial *pwpq,
-		__isl_take isl_set *set);
-
-	__isl_give isl_union_set *isl_union_pw_qpolynomial_domain(
-		__isl_take isl_union_pw_qpolynomial *upwqp);
-	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_intersect_domain(
-		__isl_take isl_union_pw_qpolynomial *upwpq,
-		__isl_take isl_union_set *uset);
-	__isl_give isl_union_pw_qpolynomial *
-	isl_union_pw_qpolynomial_intersect_params(
-		__isl_take isl_union_pw_qpolynomial *upwpq,
-		__isl_take isl_set *set);
-
-	__isl_give isl_qpolynomial *isl_qpolynomial_align_params(
-		__isl_take isl_qpolynomial *qp,
-		__isl_take isl_space *model);
-
-	__isl_give isl_qpolynomial *isl_qpolynomial_project_domain_on_params(
-		__isl_take isl_qpolynomial *qp);
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_project_domain_on_params(
-		__isl_take isl_pw_qpolynomial *pwqp);
-
-	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_coalesce(
-		__isl_take isl_union_pw_qpolynomial *upwqp);
-
-	__isl_give isl_qpolynomial *isl_qpolynomial_gist_params(
-		__isl_take isl_qpolynomial *qp,
-		__isl_take isl_set *context);
-	__isl_give isl_qpolynomial *isl_qpolynomial_gist(
-		__isl_take isl_qpolynomial *qp,
-		__isl_take isl_set *context);
-
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_gist_params(
-		__isl_take isl_pw_qpolynomial *pwqp,
-		__isl_take isl_set *context);
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_gist(
-		__isl_take isl_pw_qpolynomial *pwqp,
-		__isl_take isl_set *context);
-
-	__isl_give isl_union_pw_qpolynomial *
-	isl_union_pw_qpolynomial_gist_params(
-		__isl_take isl_union_pw_qpolynomial *upwqp,
-		__isl_take isl_set *context);
-	__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_gist(
-		__isl_take isl_union_pw_qpolynomial *upwqp,
-		__isl_take isl_union_set *context);
-
-The gist operation applies the gist operation to each of
-the cells in the domain of the input piecewise quasipolynomial.
-The context is also exploited
-to simplify the quasipolynomials associated to each cell.
-
-	__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_to_polynomial(
-		__isl_take isl_pw_qpolynomial *pwqp, int sign);
-	__isl_give isl_union_pw_qpolynomial *
-	isl_union_pw_qpolynomial_to_polynomial(
-		__isl_take isl_union_pw_qpolynomial *upwqp, int sign);
-
-Approximate each quasipolynomial by a polynomial.  If C<sign> is positive,
-the polynomial will be an overapproximation.  If C<sign> is negative,
-it will be an underapproximation.  If C<sign> is zero, the approximation
-will lie somewhere in between.
-
-=head2 Bounds on Piecewise Quasipolynomials and Piecewise Quasipolynomial Reductions
-
-A piecewise quasipolynomial reduction is a piecewise
-reduction (or fold) of quasipolynomials.
-In particular, the reduction can be maximum or a minimum.
-The objects are mainly used to represent the result of
-an upper or lower bound on a quasipolynomial over its domain,
-i.e., as the result of the following function.
-
-	__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_bound(
-		__isl_take isl_pw_qpolynomial *pwqp,
-		enum isl_fold type, int *tight);
-
-	__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_bound(
-		__isl_take isl_union_pw_qpolynomial *upwqp,
-		enum isl_fold type, int *tight);
-
-The C<type> argument may be either C<isl_fold_min> or C<isl_fold_max>.
-If C<tight> is not C<NULL>, then C<*tight> is set to C<1>
-is the returned bound is known be tight, i.e., for each value
-of the parameters there is at least
-one element in the domain that reaches the bound.
-If the domain of C<pwqp> is not wrapping, then the bound is computed
-over all elements in that domain and the result has a purely parametric
-domain.  If the domain of C<pwqp> is wrapping, then the bound is
-computed over the range of the wrapped relation.  The domain of the
-wrapped relation becomes the domain of the result.
-
-A (piecewise) quasipolynomial reduction can be copied or freed using the
-following functions.
-
-	__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_copy(
-		__isl_keep isl_qpolynomial_fold *fold);
-	__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_copy(
-		__isl_keep isl_pw_qpolynomial_fold *pwf);
-	__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_copy(
-		__isl_keep isl_union_pw_qpolynomial_fold *upwf);
-	void isl_qpolynomial_fold_free(
-		__isl_take isl_qpolynomial_fold *fold);
-	void *isl_pw_qpolynomial_fold_free(
-		__isl_take isl_pw_qpolynomial_fold *pwf);
-	void isl_union_pw_qpolynomial_fold_free(
-		__isl_take isl_union_pw_qpolynomial_fold *upwf);
-
-=head3 Printing Piecewise Quasipolynomial Reductions
-
-Piecewise quasipolynomial reductions can be printed
-using the following function.
-
-	__isl_give isl_printer *isl_printer_print_pw_qpolynomial_fold(
-		__isl_take isl_printer *p,
-		__isl_keep isl_pw_qpolynomial_fold *pwf);
-	__isl_give isl_printer *isl_printer_print_union_pw_qpolynomial_fold(
-		__isl_take isl_printer *p,
-		__isl_keep isl_union_pw_qpolynomial_fold *upwf);
-
-For C<isl_printer_print_pw_qpolynomial_fold>,
-output format of the printer
-needs to be set to either C<ISL_FORMAT_ISL> or C<ISL_FORMAT_C>.
-For C<isl_printer_print_union_pw_qpolynomial_fold>,
-output format of the printer
-needs to be set to C<ISL_FORMAT_ISL>.
-In case of printing in C<ISL_FORMAT_C>, the user may want
-to set the names of all dimensions
-
-	__isl_give isl_pw_qpolynomial_fold *
-	isl_pw_qpolynomial_fold_set_dim_name(
-		__isl_take isl_pw_qpolynomial_fold *pwf,
-		enum isl_dim_type type, unsigned pos,
-		const char *s);
-
-=head3 Inspecting (Piecewise) Quasipolynomial Reductions
-
-To iterate over all piecewise quasipolynomial reductions in a union
-piecewise quasipolynomial reduction, use the following function
-
-	int isl_union_pw_qpolynomial_fold_foreach_pw_qpolynomial_fold(
-		__isl_keep isl_union_pw_qpolynomial_fold *upwf,
-		int (*fn)(__isl_take isl_pw_qpolynomial_fold *pwf,
-			    void *user), void *user);
-
-To iterate over the cells in a piecewise quasipolynomial reduction,
-use either of the following two functions
-
-	int isl_pw_qpolynomial_fold_foreach_piece(
-		__isl_keep isl_pw_qpolynomial_fold *pwf,
-		int (*fn)(__isl_take isl_set *set,
-			  __isl_take isl_qpolynomial_fold *fold,
-			  void *user), void *user);
-	int isl_pw_qpolynomial_fold_foreach_lifted_piece(
-		__isl_keep isl_pw_qpolynomial_fold *pwf,
-		int (*fn)(__isl_take isl_set *set,
-			  __isl_take isl_qpolynomial_fold *fold,
-			  void *user), void *user);
-
-See L<Inspecting (Piecewise) Quasipolynomials> for an explanation
-of the difference between these two functions.
-
-To iterate over all quasipolynomials in a reduction, use
-
-	int isl_qpolynomial_fold_foreach_qpolynomial(
-		__isl_keep isl_qpolynomial_fold *fold,
-		int (*fn)(__isl_take isl_qpolynomial *qp,
-			  void *user), void *user);
-
-=head3 Properties of Piecewise Quasipolynomial Reductions
-
-To check whether two union piecewise quasipolynomial reductions are
-obviously equal, use
-
-	int isl_union_pw_qpolynomial_fold_plain_is_equal(
-		__isl_keep isl_union_pw_qpolynomial_fold *upwf1,
-		__isl_keep isl_union_pw_qpolynomial_fold *upwf2);
-
-=head3 Operations on Piecewise Quasipolynomial Reductions
-
-	__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale(
-		__isl_take isl_qpolynomial_fold *fold, isl_int v);
-
-	__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_add(
-		__isl_take isl_pw_qpolynomial_fold *pwf1,
-		__isl_take isl_pw_qpolynomial_fold *pwf2);
-
-	__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_fold(
-		__isl_take isl_pw_qpolynomial_fold *pwf1,
-		__isl_take isl_pw_qpolynomial_fold *pwf2);
-
-	__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_fold(
-		__isl_take isl_union_pw_qpolynomial_fold *upwf1,
-		__isl_take isl_union_pw_qpolynomial_fold *upwf2);
-
-	__isl_give isl_qpolynomial *isl_pw_qpolynomial_fold_eval(
-		__isl_take isl_pw_qpolynomial_fold *pwf,
-		__isl_take isl_point *pnt);
-
-	__isl_give isl_qpolynomial *isl_union_pw_qpolynomial_fold_eval(
-		__isl_take isl_union_pw_qpolynomial_fold *upwf,
-		__isl_take isl_point *pnt);
-
-	__isl_give isl_pw_qpolynomial_fold *
-	sl_pw_qpolynomial_fold_intersect_params(
-		__isl_take isl_pw_qpolynomial_fold *pwf,
-		__isl_take isl_set *set);
-
-	__isl_give isl_union_set *isl_union_pw_qpolynomial_fold_domain(
-		__isl_take isl_union_pw_qpolynomial_fold *upwf);
-	__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_intersect_domain(
-		__isl_take isl_union_pw_qpolynomial_fold *upwf,
-		__isl_take isl_union_set *uset);
-	__isl_give isl_union_pw_qpolynomial_fold *
-	isl_union_pw_qpolynomial_fold_intersect_params(
-		__isl_take isl_union_pw_qpolynomial_fold *upwf,
-		__isl_take isl_set *set);
-
-	__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_project_domain_on_params(
-		__isl_take isl_pw_qpolynomial_fold *pwf);
-
-	__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_coalesce(
-		__isl_take isl_pw_qpolynomial_fold *pwf);
-
-	__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_coalesce(
-		__isl_take isl_union_pw_qpolynomial_fold *upwf);
-
-	__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_gist_params(
-		__isl_take isl_qpolynomial_fold *fold,
-		__isl_take isl_set *context);
-	__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_gist(
-		__isl_take isl_qpolynomial_fold *fold,
-		__isl_take isl_set *context);
-
-	__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_gist(
-		__isl_take isl_pw_qpolynomial_fold *pwf,
-		__isl_take isl_set *context);
-	__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_gist_params(
-		__isl_take isl_pw_qpolynomial_fold *pwf,
-		__isl_take isl_set *context);
-
-	__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_gist(
-		__isl_take isl_union_pw_qpolynomial_fold *upwf,
-		__isl_take isl_union_set *context);
-	__isl_give isl_union_pw_qpolynomial_fold *
-	isl_union_pw_qpolynomial_fold_gist_params(
-		__isl_take isl_union_pw_qpolynomial_fold *upwf,
-		__isl_take isl_set *context);
-
-The gist operation applies the gist operation to each of
-the cells in the domain of the input piecewise quasipolynomial reduction.
-In future, the operation will also exploit the context
-to simplify the quasipolynomial reductions associated to each cell.
-
-	__isl_give isl_pw_qpolynomial_fold *
-	isl_set_apply_pw_qpolynomial_fold(
-		__isl_take isl_set *set,
-		__isl_take isl_pw_qpolynomial_fold *pwf,
-		int *tight);
-	__isl_give isl_pw_qpolynomial_fold *
-	isl_map_apply_pw_qpolynomial_fold(
-		__isl_take isl_map *map,
-		__isl_take isl_pw_qpolynomial_fold *pwf,
-		int *tight);
-	__isl_give isl_union_pw_qpolynomial_fold *
-	isl_union_set_apply_union_pw_qpolynomial_fold(
-		__isl_take isl_union_set *uset,
-		__isl_take isl_union_pw_qpolynomial_fold *upwf,
-		int *tight);
-	__isl_give isl_union_pw_qpolynomial_fold *
-	isl_union_map_apply_union_pw_qpolynomial_fold(
-		__isl_take isl_union_map *umap,
-		__isl_take isl_union_pw_qpolynomial_fold *upwf,
-		int *tight);
-
-The functions taking a map
-compose the given map with the given piecewise quasipolynomial reduction.
-That is, compute a bound (of the same type as C<pwf> or C<upwf> itself)
-over all elements in the intersection of the range of the map
-and the domain of the piecewise quasipolynomial reduction
-as a function of an element in the domain of the map.
-The functions taking a set compute a bound over all elements in the
-intersection of the set and the domain of the
-piecewise quasipolynomial reduction.
-
-=head2 Dependence Analysis
-
-C<isl> contains specialized functionality for performing
-array dataflow analysis.  That is, given a I<sink> access relation
-and a collection of possible I<source> access relations,
-C<isl> can compute relations that describe
-for each iteration of the sink access, which iteration
-of which of the source access relations was the last
-to access the same data element before the given iteration
-of the sink access.
-The resulting dependence relations map source iterations
-to the corresponding sink iterations.
-To compute standard flow dependences, the sink should be
-a read, while the sources should be writes.
-If any of the source accesses are marked as being I<may>
-accesses, then there will be a dependence from the last
-I<must> access B<and> from any I<may> access that follows
-this last I<must> access.
-In particular, if I<all> sources are I<may> accesses,
-then memory based dependence analysis is performed.
-If, on the other hand, all sources are I<must> accesses,
-then value based dependence analysis is performed.
-
-	#include <isl/flow.h>
-
-	typedef int (*isl_access_level_before)(void *first, void *second);
-
-	__isl_give isl_access_info *isl_access_info_alloc(
-		__isl_take isl_map *sink,
-		void *sink_user, isl_access_level_before fn,
-		int max_source);
-	__isl_give isl_access_info *isl_access_info_add_source(
-		__isl_take isl_access_info *acc,
-		__isl_take isl_map *source, int must,
-		void *source_user);
-	void isl_access_info_free(__isl_take isl_access_info *acc);
-
-	__isl_give isl_flow *isl_access_info_compute_flow(
-		__isl_take isl_access_info *acc);
-
-	int isl_flow_foreach(__isl_keep isl_flow *deps,
-		int (*fn)(__isl_take isl_map *dep, int must,
-			  void *dep_user, void *user),
-		void *user);
-	__isl_give isl_map *isl_flow_get_no_source(
-		__isl_keep isl_flow *deps, int must);
-	void isl_flow_free(__isl_take isl_flow *deps);
-
-The function C<isl_access_info_compute_flow> performs the actual
-dependence analysis.  The other functions are used to construct
-the input for this function or to read off the output.
-
-The input is collected in an C<isl_access_info>, which can
-be created through a call to C<isl_access_info_alloc>.
-The arguments to this functions are the sink access relation
-C<sink>, a token C<sink_user> used to identify the sink
-access to the user, a callback function for specifying the
-relative order of source and sink accesses, and the number
-of source access relations that will be added.
-The callback function has type C<int (*)(void *first, void *second)>.
-The function is called with two user supplied tokens identifying
-either a source or the sink and it should return the shared nesting
-level and the relative order of the two accesses.
-In particular, let I<n> be the number of loops shared by
-the two accesses.  If C<first> precedes C<second> textually,
-then the function should return I<2 * n + 1>; otherwise,
-it should return I<2 * n>.
-The sources can be added to the C<isl_access_info> by performing
-(at most) C<max_source> calls to C<isl_access_info_add_source>.
-C<must> indicates whether the source is a I<must> access
-or a I<may> access.  Note that a multi-valued access relation
-should only be marked I<must> if every iteration in the domain
-of the relation accesses I<all> elements in its image.
-The C<source_user> token is again used to identify
-the source access.  The range of the source access relation
-C<source> should have the same dimension as the range
-of the sink access relation.
-The C<isl_access_info_free> function should usually not be
-called explicitly, because it is called implicitly by
-C<isl_access_info_compute_flow>.
-
-The result of the dependence analysis is collected in an
-C<isl_flow>.  There may be elements of
-the sink access for which no preceding source access could be
-found or for which all preceding sources are I<may> accesses.
-The relations containing these elements can be obtained through
-calls to C<isl_flow_get_no_source>, the first with C<must> set
-and the second with C<must> unset.
-In the case of standard flow dependence analysis,
-with the sink a read and the sources I<must> writes,
-the first relation corresponds to the reads from uninitialized
-array elements and the second relation is empty.
-The actual flow dependences can be extracted using
-C<isl_flow_foreach>.  This function will call the user-specified
-callback function C<fn> for each B<non-empty> dependence between
-a source and the sink.  The callback function is called
-with four arguments, the actual flow dependence relation
-mapping source iterations to sink iterations, a boolean that
-indicates whether it is a I<must> or I<may> dependence, a token
-identifying the source and an additional C<void *> with value
-equal to the third argument of the C<isl_flow_foreach> call.
-A dependence is marked I<must> if it originates from a I<must>
-source and if it is not followed by any I<may> sources.
-
-After finishing with an C<isl_flow>, the user should call
-C<isl_flow_free> to free all associated memory.
-
-A higher-level interface to dependence analysis is provided
-by the following function.
-
-	#include <isl/flow.h>
-
-	int isl_union_map_compute_flow(__isl_take isl_union_map *sink,
-		__isl_take isl_union_map *must_source,
-		__isl_take isl_union_map *may_source,
-		__isl_take isl_union_map *schedule,
-		__isl_give isl_union_map **must_dep,
-		__isl_give isl_union_map **may_dep,
-		__isl_give isl_union_map **must_no_source,
-		__isl_give isl_union_map **may_no_source);
-
-The arrays are identified by the tuple names of the ranges
-of the accesses.  The iteration domains by the tuple names
-of the domains of the accesses and of the schedule.
-The relative order of the iteration domains is given by the
-schedule.  The relations returned through C<must_no_source>
-and C<may_no_source> are subsets of C<sink>.
-Any of C<must_dep>, C<may_dep>, C<must_no_source>
-or C<may_no_source> may be C<NULL>, but a C<NULL> value for
-any of the other arguments is treated as an error.
-
-=head2 Scheduling
-
-B<The functionality described in this section is fairly new
-and may be subject to change.>
-
-The following function can be used to compute a schedule
-for a union of domains.  The generated schedule respects
-all C<validity> dependences.  That is, all dependence distances
-over these dependences in the scheduled space are lexicographically
-positive.  The generated schedule schedule also tries to minimize
-the dependence distances over C<proximity> dependences.
-Moreover, it tries to obtain sequences (bands) of schedule dimensions
-for groups of domains where the dependence distances have only
-non-negative values.
-The algorithm used to construct the schedule is similar to that
-of C<Pluto>.
-
-	#include <isl/schedule.h>
-	__isl_give isl_schedule *isl_union_set_compute_schedule(
-		__isl_take isl_union_set *domain,
-		__isl_take isl_union_map *validity,
-		__isl_take isl_union_map *proximity);
-	void *isl_schedule_free(__isl_take isl_schedule *sched);
-
-A mapping from the domains to the scheduled space can be obtained
-from an C<isl_schedule> using the following function.
-
-	__isl_give isl_union_map *isl_schedule_get_map(
-		__isl_keep isl_schedule *sched);
-
-A representation of the schedule can be printed using
-	 
-	__isl_give isl_printer *isl_printer_print_schedule(
-		__isl_take isl_printer *p,
-		__isl_keep isl_schedule *schedule);
-
-A representation of the schedule as a forest of bands can be obtained
-using the following function.
-
-	__isl_give isl_band_list *isl_schedule_get_band_forest(
-		__isl_keep isl_schedule *schedule);
-
-The list can be manipulated as explained in L<"Lists">.
-The bands inside the list can be copied and freed using the following
-functions.
-
-	#include <isl/band.h>
-	__isl_give isl_band *isl_band_copy(
-		__isl_keep isl_band *band);
-	void *isl_band_free(__isl_take isl_band *band);
-
-Each band contains zero or more scheduling dimensions.
-These are referred to as the members of the band.
-The section of the schedule that corresponds to the band is
-referred to as the partial schedule of the band.
-For those nodes that participate in a band, the outer scheduling
-dimensions form the prefix schedule, while the inner scheduling
-dimensions form the suffix schedule.
-That is, if we take a cut of the band forest, then the union of
-the concatenations of the prefix, partial and suffix schedules of
-each band in the cut is equal to the entire schedule (modulo
-some possible padding at the end with zero scheduling dimensions).
-The properties of a band can be inspected using the following functions.
-
-	#include <isl/band.h>
-	isl_ctx *isl_band_get_ctx(__isl_keep isl_band *band);
-
-	int isl_band_has_children(__isl_keep isl_band *band);
-	__isl_give isl_band_list *isl_band_get_children(
-		__isl_keep isl_band *band);
-
-	__isl_give isl_union_map *isl_band_get_prefix_schedule(
-		__isl_keep isl_band *band);
-	__isl_give isl_union_map *isl_band_get_partial_schedule(
-		__isl_keep isl_band *band);
-	__isl_give isl_union_map *isl_band_get_suffix_schedule(
-		__isl_keep isl_band *band);
-
-	int isl_band_n_member(__isl_keep isl_band *band);
-	int isl_band_member_is_zero_distance(
-		__isl_keep isl_band *band, int pos);
-
-Note that a scheduling dimension is considered to be ``zero
-distance'' if it does not carry any proximity dependences
-within its band.
-That is, if the dependence distances of the proximity
-dependences are all zero in that direction (for fixed
-iterations of outer bands).
-
-A representation of the band can be printed using
-
-	#include <isl/band.h>
-	__isl_give isl_printer *isl_printer_print_band(
-		__isl_take isl_printer *p,
-		__isl_keep isl_band *band);
-
-=head3 Options
-
-	#include <isl/schedule.h>
-	int isl_options_set_schedule_max_constant_term(
-		isl_ctx *ctx, int val);
-	int isl_options_get_schedule_max_constant_term(
-		isl_ctx *ctx);
-	int isl_options_set_schedule_maximize_band_depth(
-		isl_ctx *ctx, int val);
-	int isl_options_get_schedule_maximize_band_depth(
-		isl_ctx *ctx);
-	int isl_options_set_schedule_outer_zero_distance(
-		isl_ctx *ctx, int val);
-	int isl_options_get_schedule_outer_zero_distance(
-		isl_ctx *ctx);
-
-=over
-
-=item * max_constant_term
-
-This option enforces that the constant coefficients in the calculated schedule
-are not larger than the maximal constant term. This option can significantly
-increase the speed of the scheduling calculation and may also prevent fusing of
-unrelated dimensions. A value of -1 means that this option does not introduce
-bounds on the constant coefficients.
-
-=item * maximize_band_depth
-
-If this option is set, we do not split bands at the point
-where we detect splitting is necessary. Instead, we
-backtrack and split bands as early as possible. This
-reduces the number of splits and maximizes the width of
-the bands. Wider bands give more possibilities for tiling.
-
-=item * schedule_outer_zero_distance
-
-If this option is set, then we try to construct schedules
-where the outermost scheduling dimension in each band
-results in a zero dependence distance over the proximity
-dependences.
-
-=back
-
-=head2 Parametric Vertex Enumeration
-
-The parametric vertex enumeration described in this section
-is mainly intended to be used internally and by the C<barvinok>
-library.
-
-	#include <isl/vertices.h>
-	__isl_give isl_vertices *isl_basic_set_compute_vertices(
-		__isl_keep isl_basic_set *bset);
-
-The function C<isl_basic_set_compute_vertices> performs the
-actual computation of the parametric vertices and the chamber
-decomposition and store the result in an C<isl_vertices> object.
-This information can be queried by either iterating over all
-the vertices or iterating over all the chambers or cells
-and then iterating over all vertices that are active on the chamber.
-
-	int isl_vertices_foreach_vertex(
-		__isl_keep isl_vertices *vertices,
-		int (*fn)(__isl_take isl_vertex *vertex, void *user),
-		void *user);
-
-	int isl_vertices_foreach_cell(
-		__isl_keep isl_vertices *vertices,
-		int (*fn)(__isl_take isl_cell *cell, void *user),
-		void *user);
-	int isl_cell_foreach_vertex(__isl_keep isl_cell *cell,
-		int (*fn)(__isl_take isl_vertex *vertex, void *user),
-		void *user);
-
-Other operations that can be performed on an C<isl_vertices> object are
-the following.
-
-	isl_ctx *isl_vertices_get_ctx(
-		__isl_keep isl_vertices *vertices);
-	int isl_vertices_get_n_vertices(
-		__isl_keep isl_vertices *vertices);
-	void isl_vertices_free(__isl_take isl_vertices *vertices);
-
-Vertices can be inspected and destroyed using the following functions.
-
-	isl_ctx *isl_vertex_get_ctx(__isl_keep isl_vertex *vertex);
-	int isl_vertex_get_id(__isl_keep isl_vertex *vertex);
-	__isl_give isl_basic_set *isl_vertex_get_domain(
-		__isl_keep isl_vertex *vertex);
-	__isl_give isl_basic_set *isl_vertex_get_expr(
-		__isl_keep isl_vertex *vertex);
-	void isl_vertex_free(__isl_take isl_vertex *vertex);
-
-C<isl_vertex_get_expr> returns a singleton parametric set describing
-the vertex, while C<isl_vertex_get_domain> returns the activity domain
-of the vertex.
-Note that C<isl_vertex_get_domain> and C<isl_vertex_get_expr> return
-B<rational> basic sets, so they should mainly be used for inspection
-and should not be mixed with integer sets.
-
-Chambers can be inspected and destroyed using the following functions.
-
-	isl_ctx *isl_cell_get_ctx(__isl_keep isl_cell *cell);
-	__isl_give isl_basic_set *isl_cell_get_domain(
-		__isl_keep isl_cell *cell);
-	void isl_cell_free(__isl_take isl_cell *cell);
-
-=head1 Applications
-
-Although C<isl> is mainly meant to be used as a library,
-it also contains some basic applications that use some
-of the functionality of C<isl>.
-The input may be specified in either the L<isl format>
-or the L<PolyLib format>.
-
-=head2 C<isl_polyhedron_sample>
-
-C<isl_polyhedron_sample> takes a polyhedron as input and prints
-an integer element of the polyhedron, if there is any.
-The first column in the output is the denominator and is always
-equal to 1.  If the polyhedron contains no integer points,
-then a vector of length zero is printed.
-
-=head2 C<isl_pip>
-
-C<isl_pip> takes the same input as the C<example> program
-from the C<piplib> distribution, i.e., a set of constraints
-on the parameters, a line containing only -1 and finally a set
-of constraints on a parametric polyhedron.
-The coefficients of the parameters appear in the last columns
-(but before the final constant column).
-The output is the lexicographic minimum of the parametric polyhedron.
-As C<isl> currently does not have its own output format, the output
-is just a dump of the internal state.
-
-=head2 C<isl_polyhedron_minimize>
-
-C<isl_polyhedron_minimize> computes the minimum of some linear
-or affine objective function over the integer points in a polyhedron.
-If an affine objective function
-is given, then the constant should appear in the last column.
-
-=head2 C<isl_polytope_scan>
-
-Given a polytope, C<isl_polytope_scan> prints
-all integer points in the polytope.
diff --git a/cloog-0.17.0/isl/include/isl/aff.h b/cloog-0.17.0/isl/include/isl/aff.h
deleted file mode 100644
index 32c0d03..0000000
--- a/cloog-0.17.0/isl/include/isl/aff.h
+++ /dev/null
@@ -1,350 +0,0 @@
-#ifndef ISL_AFF_H
-#define ISL_AFF_H
-
-#include <isl/local_space.h>
-#include <isl/printer.h>
-#include <isl/set_type.h>
-#include <isl/aff_type.h>
-#include <isl/list.h>
-#include <isl/multi.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-__isl_give isl_aff *isl_aff_zero_on_domain(__isl_take isl_local_space *ls);
-
-__isl_give isl_aff *isl_aff_copy(__isl_keep isl_aff *aff);
-void *isl_aff_free(__isl_take isl_aff *aff);
-
-isl_ctx *isl_aff_get_ctx(__isl_keep isl_aff *aff);
-
-int isl_aff_dim(__isl_keep isl_aff *aff, enum isl_dim_type type);
-int isl_aff_involves_dims(__isl_keep isl_aff *aff,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-__isl_give isl_space *isl_aff_get_domain_space(__isl_keep isl_aff *aff);
-__isl_give isl_space *isl_aff_get_space(__isl_keep isl_aff *aff);
-__isl_give isl_local_space *isl_aff_get_domain_local_space(
-	__isl_keep isl_aff *aff);
-__isl_give isl_local_space *isl_aff_get_local_space(__isl_keep isl_aff *aff);
-
-const char *isl_aff_get_dim_name(__isl_keep isl_aff *aff,
-	enum isl_dim_type type, unsigned pos);
-int isl_aff_get_constant(__isl_keep isl_aff *aff, isl_int *v);
-int isl_aff_get_coefficient(__isl_keep isl_aff *aff,
-	enum isl_dim_type type, int pos, isl_int *v);
-int isl_aff_get_denominator(__isl_keep isl_aff *aff, isl_int *v);
-__isl_give isl_aff *isl_aff_set_constant(__isl_take isl_aff *aff, isl_int v);
-__isl_give isl_aff *isl_aff_set_constant_si(__isl_take isl_aff *aff, int v);
-__isl_give isl_aff *isl_aff_set_coefficient(__isl_take isl_aff *aff,
-	enum isl_dim_type type, int pos, isl_int v);
-__isl_give isl_aff *isl_aff_set_coefficient_si(__isl_take isl_aff *aff,
-	enum isl_dim_type type, int pos, int v);
-__isl_give isl_aff *isl_aff_set_denominator(__isl_take isl_aff *aff, isl_int v);
-__isl_give isl_aff *isl_aff_add_constant(__isl_take isl_aff *aff, isl_int v);
-__isl_give isl_aff *isl_aff_add_constant_si(__isl_take isl_aff *aff, int v);
-__isl_give isl_aff *isl_aff_add_coefficient(__isl_take isl_aff *aff,
-	enum isl_dim_type type, int pos, isl_int v);
-__isl_give isl_aff *isl_aff_add_coefficient_si(__isl_take isl_aff *aff,
-	enum isl_dim_type type, int pos, int v);
-
-int isl_aff_is_cst(__isl_keep isl_aff *aff);
-
-__isl_give isl_aff *isl_aff_set_dim_name(__isl_take isl_aff *aff,
-	enum isl_dim_type type, unsigned pos, const char *s);
-__isl_give isl_aff *isl_aff_set_dim_id(__isl_take isl_aff *aff,
-	enum isl_dim_type type, unsigned pos, __isl_take isl_id *id);
-
-int isl_aff_plain_is_equal(__isl_keep isl_aff *aff1, __isl_keep isl_aff *aff2);
-int isl_aff_plain_is_zero(__isl_keep isl_aff *aff);
-
-__isl_give isl_aff *isl_aff_get_div(__isl_keep isl_aff *aff, int pos);
-
-__isl_give isl_aff *isl_aff_neg(__isl_take isl_aff *aff);
-__isl_give isl_aff *isl_aff_ceil(__isl_take isl_aff *aff);
-__isl_give isl_aff *isl_aff_floor(__isl_take isl_aff *aff);
-__isl_give isl_aff *isl_aff_mod(__isl_take isl_aff *aff, isl_int mod);
-
-__isl_give isl_aff *isl_aff_mul(__isl_take isl_aff *aff1,
-	__isl_take isl_aff *aff2);
-__isl_give isl_aff *isl_aff_add(__isl_take isl_aff *aff1,
-	__isl_take isl_aff *aff2);
-__isl_give isl_aff *isl_aff_sub(__isl_take isl_aff *aff1,
-	__isl_take isl_aff *aff2);
-
-__isl_give isl_aff *isl_aff_scale(__isl_take isl_aff *aff, isl_int f);
-__isl_give isl_aff *isl_aff_scale_down(__isl_take isl_aff *aff, isl_int f);
-__isl_give isl_aff *isl_aff_scale_down_ui(__isl_take isl_aff *aff, unsigned f);
-
-__isl_give isl_aff *isl_aff_insert_dims(__isl_take isl_aff *aff,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_aff *isl_aff_add_dims(__isl_take isl_aff *aff,
-	enum isl_dim_type type, unsigned n);
-__isl_give isl_aff *isl_aff_drop_dims(__isl_take isl_aff *aff,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-__isl_give isl_aff *isl_aff_gist(__isl_take isl_aff *aff,
-	__isl_take isl_set *context);
-__isl_give isl_aff *isl_aff_gist_params(__isl_take isl_aff *aff,
-	__isl_take isl_set *context);
-
-__isl_give isl_basic_set *isl_aff_le_basic_set(__isl_take isl_aff *aff1,
-	__isl_take isl_aff *aff2);
-__isl_give isl_basic_set *isl_aff_ge_basic_set(__isl_take isl_aff *aff1,
-	__isl_take isl_aff *aff2);
-
-__isl_give isl_aff *isl_aff_read_from_str(isl_ctx *ctx, const char *str);
-__isl_give isl_printer *isl_printer_print_aff(__isl_take isl_printer *p,
-	__isl_keep isl_aff *aff);
-void isl_aff_dump(__isl_keep isl_aff *aff);
-
-isl_ctx *isl_pw_aff_get_ctx(__isl_keep isl_pw_aff *pwaff);
-__isl_give isl_space *isl_pw_aff_get_domain_space(__isl_keep isl_pw_aff *pwaff);
-__isl_give isl_space *isl_pw_aff_get_space(__isl_keep isl_pw_aff *pwaff);
-
-__isl_give isl_pw_aff *isl_pw_aff_from_aff(__isl_take isl_aff *aff);
-__isl_give isl_pw_aff *isl_pw_aff_empty(__isl_take isl_space *dim);
-__isl_give isl_pw_aff *isl_pw_aff_alloc(__isl_take isl_set *set,
-	__isl_take isl_aff *aff);
-
-const char *isl_pw_aff_get_dim_name(__isl_keep isl_pw_aff *pa,
-	enum isl_dim_type type, unsigned pos);
-int isl_pw_aff_has_dim_id(__isl_keep isl_pw_aff *pa,
-	enum isl_dim_type type, unsigned pos);
-__isl_give isl_id *isl_pw_aff_get_dim_id(__isl_keep isl_pw_aff *pa,
-	enum isl_dim_type type, unsigned pos);
-__isl_give isl_pw_aff *isl_pw_aff_set_dim_id(__isl_take isl_pw_aff *pma,
-	enum isl_dim_type type, unsigned pos, __isl_take isl_id *id);
-
-int isl_pw_aff_is_empty(__isl_keep isl_pw_aff *pwaff);
-int isl_pw_aff_plain_is_equal(__isl_keep isl_pw_aff *pwaff1,
-	__isl_keep isl_pw_aff *pwaff2);
-
-__isl_give isl_pw_aff *isl_pw_aff_union_min(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2);
-__isl_give isl_pw_aff *isl_pw_aff_union_max(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2);
-__isl_give isl_pw_aff *isl_pw_aff_union_add(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2);
-
-__isl_give isl_pw_aff *isl_pw_aff_copy(__isl_keep isl_pw_aff *pwaff);
-void *isl_pw_aff_free(__isl_take isl_pw_aff *pwaff);
-
-unsigned isl_pw_aff_dim(__isl_keep isl_pw_aff *pwaff, enum isl_dim_type type);
-int isl_pw_aff_involves_dims(__isl_keep isl_pw_aff *pwaff,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-int isl_pw_aff_is_cst(__isl_keep isl_pw_aff *pwaff);
-
-__isl_give isl_pw_aff *isl_pw_aff_align_params(__isl_take isl_pw_aff *pwaff,
-	__isl_take isl_space *model);
-
-__isl_give isl_pw_aff *isl_pw_aff_set_tuple_id(__isl_take isl_pw_aff *pwaff,
-	enum isl_dim_type type, __isl_take isl_id *id);
-
-__isl_give isl_set *isl_pw_aff_domain(__isl_take isl_pw_aff *pwaff);
-
-__isl_give isl_pw_aff *isl_pw_aff_min(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2);
-__isl_give isl_pw_aff *isl_pw_aff_max(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2);
-__isl_give isl_pw_aff *isl_pw_aff_mul(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2);
-__isl_give isl_pw_aff *isl_pw_aff_add(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2);
-__isl_give isl_pw_aff *isl_pw_aff_sub(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2);
-__isl_give isl_pw_aff *isl_pw_aff_neg(__isl_take isl_pw_aff *pwaff);
-__isl_give isl_pw_aff *isl_pw_aff_ceil(__isl_take isl_pw_aff *pwaff);
-__isl_give isl_pw_aff *isl_pw_aff_floor(__isl_take isl_pw_aff *pwaff);
-__isl_give isl_pw_aff *isl_pw_aff_mod(__isl_take isl_pw_aff *pwaff,
-	isl_int mod);
-
-__isl_give isl_pw_aff *isl_pw_aff_intersect_params(__isl_take isl_pw_aff *pa,
-	__isl_take isl_set *set);
-__isl_give isl_pw_aff *isl_pw_aff_intersect_domain(__isl_take isl_pw_aff *pa,
-	__isl_take isl_set *set);
-
-__isl_give isl_pw_aff *isl_pw_aff_cond(__isl_take isl_set *cond,
-	__isl_take isl_pw_aff *pwaff_true, __isl_take isl_pw_aff *pwaff_false);
-
-__isl_give isl_pw_aff *isl_pw_aff_scale(__isl_take isl_pw_aff *pwaff,
-	isl_int f);
-__isl_give isl_pw_aff *isl_pw_aff_scale_down(__isl_take isl_pw_aff *pwaff,
-	isl_int f);
-
-__isl_give isl_pw_aff *isl_pw_aff_insert_dims(__isl_take isl_pw_aff *pwaff,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_pw_aff *isl_pw_aff_add_dims(__isl_take isl_pw_aff *pwaff,
-	enum isl_dim_type type, unsigned n);
-__isl_give isl_pw_aff *isl_pw_aff_drop_dims(__isl_take isl_pw_aff *pwaff,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-__isl_give isl_pw_aff *isl_pw_aff_coalesce(__isl_take isl_pw_aff *pwqp);
-__isl_give isl_pw_aff *isl_pw_aff_gist(__isl_take isl_pw_aff *pwaff,
-	__isl_take isl_set *context);
-__isl_give isl_pw_aff *isl_pw_aff_gist_params(__isl_take isl_pw_aff *pwaff,
-	__isl_take isl_set *context);
-
-int isl_pw_aff_foreach_piece(__isl_keep isl_pw_aff *pwaff,
-	int (*fn)(__isl_take isl_set *set, __isl_take isl_aff *aff,
-		    void *user), void *user);
-
-__isl_give isl_set *isl_set_from_pw_aff(__isl_take isl_pw_aff *pwaff);
-__isl_give isl_map *isl_map_from_pw_aff(__isl_take isl_pw_aff *pwaff);
-
-__isl_give isl_set *isl_pw_aff_nonneg_set(__isl_take isl_pw_aff *pwaff);
-__isl_give isl_set *isl_pw_aff_zero_set(__isl_take isl_pw_aff *pwaff);
-__isl_give isl_set *isl_pw_aff_non_zero_set(__isl_take isl_pw_aff *pwaff);
-
-__isl_give isl_set *isl_pw_aff_eq_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2);
-__isl_give isl_set *isl_pw_aff_ne_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2);
-__isl_give isl_set *isl_pw_aff_le_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2);
-__isl_give isl_set *isl_pw_aff_lt_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2);
-__isl_give isl_set *isl_pw_aff_ge_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2);
-__isl_give isl_set *isl_pw_aff_gt_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2);
-
-__isl_give isl_pw_aff *isl_pw_aff_read_from_str(isl_ctx *ctx, const char *str);
-__isl_give isl_printer *isl_printer_print_pw_aff(__isl_take isl_printer *p,
-	__isl_keep isl_pw_aff *pwaff);
-void isl_pw_aff_dump(__isl_keep isl_pw_aff *pwaff);
-
-__isl_give isl_pw_aff *isl_pw_aff_list_min(__isl_take isl_pw_aff_list *list);
-__isl_give isl_pw_aff *isl_pw_aff_list_max(__isl_take isl_pw_aff_list *list);
-
-__isl_give isl_set *isl_pw_aff_list_eq_set(__isl_take isl_pw_aff_list *list1,
-	__isl_take isl_pw_aff_list *list2);
-__isl_give isl_set *isl_pw_aff_list_ne_set(__isl_take isl_pw_aff_list *list1,
-	__isl_take isl_pw_aff_list *list2);
-__isl_give isl_set *isl_pw_aff_list_le_set(__isl_take isl_pw_aff_list *list1,
-	__isl_take isl_pw_aff_list *list2);
-__isl_give isl_set *isl_pw_aff_list_lt_set(__isl_take isl_pw_aff_list *list1,
-	__isl_take isl_pw_aff_list *list2);
-__isl_give isl_set *isl_pw_aff_list_ge_set(__isl_take isl_pw_aff_list *list1,
-	__isl_take isl_pw_aff_list *list2);
-__isl_give isl_set *isl_pw_aff_list_gt_set(__isl_take isl_pw_aff_list *list1,
-	__isl_take isl_pw_aff_list *list2);
-
-isl_ctx *isl_multi_aff_get_ctx(__isl_keep isl_multi_aff *maff);
-__isl_give isl_space *isl_multi_aff_get_space(__isl_keep isl_multi_aff *maff);
-__isl_give isl_multi_aff *isl_multi_aff_copy(__isl_keep isl_multi_aff *maff);
-void *isl_multi_aff_free(__isl_take isl_multi_aff *maff);
-
-unsigned isl_multi_aff_dim(__isl_keep isl_multi_aff *maff,
-	enum isl_dim_type type);
-__isl_give isl_aff *isl_multi_aff_get_aff(__isl_keep isl_multi_aff *multi,
-	int pos);
-
-__isl_give isl_multi_aff *isl_multi_aff_set_dim_name(
-	__isl_take isl_multi_aff *maff,
-	enum isl_dim_type type, unsigned pos, const char *s);
-
-int isl_multi_aff_plain_is_equal(__isl_keep isl_multi_aff *maff1,
-	__isl_keep isl_multi_aff *maff2);
-
-__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_scale(__isl_take isl_multi_aff *maff,
-	isl_int f);
-
-__isl_give isl_multi_aff *isl_multi_aff_gist_params(
-	__isl_take isl_multi_aff *maff, __isl_take isl_set *context);
-__isl_give isl_multi_aff *isl_multi_aff_gist(__isl_take isl_multi_aff *maff,
-	__isl_take isl_set *context);
-
-__isl_give isl_multi_aff *isl_multi_aff_lift(__isl_take isl_multi_aff *maff,
-	__isl_give isl_local_space **ls);
-
-__isl_give isl_printer *isl_printer_print_multi_aff(__isl_take isl_printer *p,
-	__isl_keep isl_multi_aff *maff);
-
-__isl_give isl_multi_aff *isl_multi_aff_read_from_str(isl_ctx *ctx,
-		const char *str);
-void isl_multi_aff_dump(__isl_keep isl_multi_aff *maff);
-
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_alloc(__isl_take isl_set *set,
-	__isl_take isl_multi_aff *maff);
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_copy(
-	__isl_keep isl_pw_multi_aff *pma);
-void *isl_pw_multi_aff_free(__isl_take isl_pw_multi_aff *pma);
-
-unsigned isl_pw_multi_aff_dim(__isl_keep isl_pw_multi_aff *pma,
-	enum isl_dim_type type);
-
-isl_ctx *isl_pw_multi_aff_get_ctx(__isl_keep isl_pw_multi_aff *pma);
-__isl_give isl_space *isl_pw_multi_aff_get_domain_space(
-	__isl_keep isl_pw_multi_aff *pma);
-__isl_give isl_space *isl_pw_multi_aff_get_space(
-	__isl_keep isl_pw_multi_aff *pma);
-const char *isl_pw_multi_aff_get_tuple_name(__isl_keep isl_pw_multi_aff *pma,
-	enum isl_dim_type type);
-__isl_give isl_id *isl_pw_multi_aff_get_tuple_id(
-	__isl_keep isl_pw_multi_aff *pma, enum isl_dim_type type);
-int isl_pw_multi_aff_has_tuple_id(__isl_keep isl_pw_multi_aff *pma,
-	enum isl_dim_type type);
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_set_tuple_id(
-	__isl_take isl_pw_multi_aff *pma,
-	enum isl_dim_type type, __isl_take isl_id *id);
-
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_empty(__isl_take isl_space *space);
-
-const char *isl_pw_multi_aff_get_dim_name(__isl_keep isl_pw_multi_aff *pma,
-	enum isl_dim_type type, unsigned pos);
-__isl_give isl_id *isl_pw_multi_aff_get_dim_id(
-	__isl_keep isl_pw_multi_aff *pma, enum isl_dim_type type,
-	unsigned pos);
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_set_dim_id(
-	__isl_take isl_pw_multi_aff *pma,
-	enum isl_dim_type type, unsigned pos, __isl_take isl_id *id);
-
-int isl_pw_multi_aff_plain_is_equal(__isl_keep isl_pw_multi_aff *pma1,
-	__isl_keep isl_pw_multi_aff *pma2);
-
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_union_add(
-	__isl_take isl_pw_multi_aff *pma1, __isl_take isl_pw_multi_aff *pma2);
-
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_add(
-	__isl_take isl_pw_multi_aff *pma1, __isl_take isl_pw_multi_aff *pma2);
-
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_intersect_params(
-	__isl_take isl_pw_multi_aff *pma, __isl_take isl_set *set);
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_intersect_domain(
-	__isl_take isl_pw_multi_aff *pma, __isl_take isl_set *set);
-
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_gist_params(
-	__isl_take isl_pw_multi_aff *pma, __isl_take isl_set *set);
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_gist(
-	__isl_take isl_pw_multi_aff *pma, __isl_take isl_set *set);
-
-int isl_pw_multi_aff_foreach_piece(__isl_keep isl_pw_multi_aff *pma,
-	int (*fn)(__isl_take isl_set *set, __isl_take isl_multi_aff *maff,
-		    void *user), void *user);
-
-__isl_give isl_map *isl_map_from_pw_multi_aff(__isl_take isl_pw_multi_aff *pma);
-__isl_give isl_set *isl_set_from_pw_multi_aff(__isl_take isl_pw_multi_aff *pma);
-
-__isl_give isl_printer *isl_printer_print_pw_multi_aff(__isl_take isl_printer *p,
-	__isl_keep isl_pw_multi_aff *pma);
-
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_from_set(__isl_take isl_set *set);
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_from_map(__isl_take isl_map *map);
-
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_read_from_str(isl_ctx *ctx,
-	const char *str);
-void isl_pw_multi_aff_dump(__isl_keep isl_pw_multi_aff *pma);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#include <isl/dim.h>
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/aff_type.h b/cloog-0.17.0/isl/include/isl/aff_type.h
deleted file mode 100644
index 152eeb5..0000000
--- a/cloog-0.17.0/isl/include/isl/aff_type.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef ISL_AFF_TYPE_H
-#define ISL_AFF_TYPE_H
-
-struct isl_aff;
-typedef struct isl_aff isl_aff;
-
-struct isl_pw_aff;
-typedef struct isl_pw_aff isl_pw_aff;
-
-struct isl_multi_aff;
-typedef struct isl_multi_aff isl_multi_aff;
-
-struct isl_pw_multi_aff;
-typedef struct isl_pw_multi_aff isl_pw_multi_aff;
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/arg.h b/cloog-0.17.0/isl/include/isl/arg.h
deleted file mode 100644
index 4ae3374..0000000
--- a/cloog-0.17.0/isl/include/isl/arg.h
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_ARG_H
-#define ISL_ARG_H
-
-#include <stddef.h>
-#include <stdlib.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_arg_choice {
-	const char	*name;
-	unsigned	 value;
-};
-
-struct isl_arg_flags {
-	const char	*name;
-	unsigned	 mask;
-	unsigned	 value;
-};
-
-enum isl_arg_type {
-	isl_arg_end,
-	isl_arg_alias,
-	isl_arg_arg,
-	isl_arg_bool,
-	isl_arg_child,
-	isl_arg_choice,
-	isl_arg_flags,
-	isl_arg_footer,
-	isl_arg_int,
-	isl_arg_user,
-	isl_arg_long,
-	isl_arg_ulong,
-	isl_arg_str,
-	isl_arg_str_list,
-	isl_arg_version
-};
-
-struct isl_args;
-
-struct isl_arg {
-	enum isl_arg_type	 type;
-	char			 short_name;
-	const char		*long_name;
-	const char		*argument_name;
-	size_t			 offset;
-	const char		*help_msg;
-#define ISL_ARG_SINGLE_DASH	(1 << 0)
-#define ISL_ARG_BOOL_ARG	(1 << 1)
-#define ISL_ARG_HIDDEN		(1 << 2)
-	unsigned		 flags;
-	union {
-	struct {
-		struct isl_arg_choice	*choice;
-		unsigned	 	 default_value;
-		unsigned	 	 default_selected;
-		int (*set)(void *opt, unsigned val);
-	} choice;
-	struct {
-		struct isl_arg_flags	*flags;
-		unsigned	 	 default_value;
-	} flags;
-	struct {
-		unsigned		 default_value;
-		int (*set)(void *opt, unsigned val);
-	} b;
-	struct {
-		int			default_value;
-	} i;
-	struct {
-		long		 	default_value;
-		long		 	default_selected;
-		int (*set)(void *opt, long val);
-	} l;
-	struct {
-		unsigned long		default_value;
-	} ul;
-	struct {
-		const char		*default_value;
-	} str;
-	struct {
-		size_t			 offset_n;
-	} str_list;
-	struct {
-		struct isl_args		*child;
-	} child;
-	struct {
-		void (*print_version)(void);
-	} version;
-	struct {
-		int (*init)(void*);
-		void (*clear)(void*);
-	} user;
-	} u;
-};
-
-struct isl_args {
-	size_t			 options_size;
-	struct isl_arg		*args;
-};
-
-#define ISL_ARGS_START(s,name)						\
-	struct isl_arg name ## LIST[];					\
-	struct isl_args name = { sizeof(s), name ## LIST };		\
-	struct isl_arg name ## LIST[] = {
-#define ISL_ARGS_END							\
-	{ isl_arg_end } };
-
-#define ISL_ARG_ALIAS(l)	{					\
-	.type = isl_arg_alias,						\
-	.long_name = l,							\
-},
-#define ISL_ARG_ARG(st,f,a,d)	{					\
-	.type = isl_arg_arg,						\
-	.argument_name = a,						\
-	.offset = offsetof(st, f),					\
-	.u = { .str = { .default_value = d } }				\
-},
-#define ISL_ARG_FOOTER(h)	{					\
-	.type = isl_arg_footer,						\
-	.help_msg = h,							\
-},
-#define ISL_ARG_CHOICE(st,f,s,l,c,d,h)	{				\
-	.type = isl_arg_choice,						\
-	.short_name = s,						\
-	.long_name = l,							\
-	.offset = offsetof(st, f),					\
-	.help_msg = h,							\
-	.u = { .choice = { .choice = c, .default_value = d,		\
-			    .default_selected = d, .set = NULL } }	\
-},
-#define ISL_ARG_OPT_CHOICE(st,f,s,l,c,d,ds,h)	{			\
-	.type = isl_arg_choice,						\
-	.short_name = s,						\
-	.long_name = l,							\
-	.offset = offsetof(st, f),					\
-	.help_msg = h,							\
-	.u = { .choice = { .choice = c, .default_value = d,		\
-			    .default_selected = ds, .set = NULL } }	\
-},
-#define ISL_ARG_USER_OPT_CHOICE(st,f,s,l,c,setter,d,ds,h)	{	\
-	.type = isl_arg_choice,						\
-	.short_name = s,						\
-	.long_name = l,							\
-	.offset = offsetof(st, f),					\
-	.help_msg = h,							\
-	.u = { .choice = { .choice = c, .default_value = d,		\
-			    .default_selected = ds, .set = setter } }	\
-},
-#define _ISL_ARG_BOOL_F(o,s,l,setter,d,h,fl)	{			\
-	.type = isl_arg_bool,						\
-	.short_name = s,						\
-	.long_name = l,							\
-	.offset = o,							\
-	.help_msg = h,							\
-	.flags = fl,							\
-	.u = { .b = { .default_value = d, .set = setter } }		\
-},
-#define ISL_ARG_BOOL_F(st,f,s,l,d,h,fl)					\
-	_ISL_ARG_BOOL_F(offsetof(st, f),s,l,NULL,d,h,fl)
-#define ISL_ARG_BOOL(st,f,s,l,d,h)					\
-	ISL_ARG_BOOL_F(st,f,s,l,d,h,0)
-#define ISL_ARG_PHANTOM_BOOL_F(s,l,setter,h,fl)				\
-	_ISL_ARG_BOOL_F(-1,s,l,setter,0,h,fl)
-#define ISL_ARG_PHANTOM_BOOL(s,l,setter,h)				\
-	ISL_ARG_PHANTOM_BOOL_F(s,l,setter,h,0)
-#define ISL_ARG_INT_F(st,f,s,l,a,d,h,fl)	{			\
-	.type = isl_arg_int,						\
-	.short_name = s,						\
-	.long_name = l,							\
-	.argument_name = a,						\
-	.offset = offsetof(st, f),					\
-	.help_msg = h,							\
-	.flags = fl,							\
-	.u = { .ul = { .default_value = d } }				\
-},
-#define ISL_ARG_INT(st,f,s,l,a,d,h)					\
-	ISL_ARG_INT_F(st,f,s,l,a,d,h,0)
-#define ISL_ARG_LONG(st,f,s,lo,d,h)	{				\
-	.type = isl_arg_long,						\
-	.short_name = s,						\
-	.long_name = lo,						\
-	.offset = offsetof(st, f),					\
-	.help_msg = h,							\
-	.u = { .l = { .default_value = d, .default_selected = d,	\
-		      .set = NULL } }					\
-},
-#define ISL_ARG_USER_LONG(st,f,s,lo,setter,d,h)	{			\
-	.type = isl_arg_long,						\
-	.short_name = s,						\
-	.long_name = lo,						\
-	.offset = offsetof(st, f),					\
-	.help_msg = h,							\
-	.u = { .l = { .default_value = d, .default_selected = d,	\
-		      .set = setter } }					\
-},
-#define ISL_ARG_OPT_LONG(st,f,s,lo,d,ds,h)	{			\
-	.type = isl_arg_long,						\
-	.short_name = s,						\
-	.long_name = lo,						\
-	.offset = offsetof(st, f),					\
-	.help_msg = h,							\
-	.u = { .l = { .default_value = d, .default_selected = ds,	\
-		      .set = NULL } }					\
-},
-#define ISL_ARG_ULONG(st,f,s,l,d,h)	{				\
-	.type = isl_arg_ulong,						\
-	.short_name = s,						\
-	.long_name = l,							\
-	.offset = offsetof(st, f),					\
-	.help_msg = h,							\
-	.u = { .ul = { .default_value = d } }				\
-},
-#define ISL_ARG_STR_F(st,f,s,l,a,d,h,fl)	{			\
-	.type = isl_arg_str,						\
-	.short_name = s,						\
-	.long_name = l,							\
-	.argument_name = a,						\
-	.offset = offsetof(st, f),					\
-	.help_msg = h,							\
-	.flags = fl,							\
-	.u = { .str = { .default_value = d } }				\
-},
-#define ISL_ARG_STR(st,f,s,l,a,d,h)					\
-	ISL_ARG_STR_F(st,f,s,l,a,d,h,0)
-#define ISL_ARG_STR_LIST(st,f_n,f_l,s,l,a,h)	{			\
-	.type = isl_arg_str_list,					\
-	.short_name = s,						\
-	.long_name = l,							\
-	.argument_name = a,						\
-	.offset = offsetof(st, f_l),					\
-	.help_msg = h,							\
-	.u = { .str_list = { .offset_n = offsetof(st, f_n) } }		\
-},
-#define _ISL_ARG_CHILD(o,l,c,h,fl)	{				\
-	.type = isl_arg_child,						\
-	.long_name = l,							\
-	.offset = o,							\
-	.help_msg = h,							\
-	.flags = fl,							\
-	.u = { .child = { .child = c } }				\
-},
-#define ISL_ARG_CHILD(st,f,l,c,h)					\
-	_ISL_ARG_CHILD(offsetof(st, f),l,c,h,0)
-#define ISL_ARG_GROUP_F(c,h,fl)						\
-	_ISL_ARG_CHILD(-1,NULL,c,h,fl)
-#define ISL_ARG_GROUP(c,h)						\
-	ISL_ARG_GROUP_F(c,h,0)
-#define ISL_ARG_FLAGS(st,f,s,l,c,d,h)	{				\
-	.type = isl_arg_flags,						\
-	.short_name = s,						\
-	.long_name = l,							\
-	.offset = offsetof(st, f),					\
-	.help_msg = h,							\
-	.u = { .flags = { .flags = c, .default_value = d } }		\
-},
-#define ISL_ARG_USER(st,f,i,c) {					\
-	.type = isl_arg_user,						\
-	.offset = offsetof(st, f),					\
-	.u = { .user = { .init = i, .clear = c} }			\
-},
-#define ISL_ARG_VERSION(print) {					\
-	.type = isl_arg_version,					\
-	.u = { .version = { .print_version = print } }			\
-},
-
-#define ISL_ARG_ALL	(1 << 0)
-
-void isl_args_set_defaults(struct isl_args *args, void *opt);
-void isl_args_free(struct isl_args *args, void *opt);
-int isl_args_parse(struct isl_args *args, int argc, char **argv, void *opt,
-	unsigned flags);
-
-#define ISL_ARG_DECL(prefix,st,args)					\
-extern struct isl_args args;						\
-st *prefix ## _new_with_defaults(void);					\
-void prefix ## _free(st *opt);						\
-int prefix ## _parse(st *opt, int argc, char **argv, unsigned flags);
-
-#define ISL_ARG_DEF(prefix,st,args)					\
-st *prefix ## _new_with_defaults()					\
-{									\
-	st *opt = (st *)calloc(1, sizeof(st));				\
-	if (opt)							\
-		isl_args_set_defaults(&(args), opt);			\
-	return opt;							\
-}									\
-									\
-void prefix ## _free(st *opt)						\
-{									\
-	isl_args_free(&(args), opt);					\
-}									\
-									\
-int prefix ## _parse(st *opt, int argc, char **argv, unsigned flags)	\
-{									\
-	return isl_args_parse(&(args), argc, argv, opt, flags);		\
-}
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/band.h b/cloog-0.17.0/isl/include/isl/band.h
deleted file mode 100644
index 880cb12..0000000
--- a/cloog-0.17.0/isl/include/isl/band.h
+++ /dev/null
@@ -1,42 +0,0 @@
-#ifndef ISL_BAND_H
-#define ISL_BAND_H
-
-#include <isl/printer.h>
-#include <isl/list.h>
-#include <isl/union_map.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_band;
-typedef struct isl_band isl_band;
-
-__isl_give isl_band *isl_band_copy(__isl_keep isl_band *band);
-void *isl_band_free(__isl_take isl_band *band);
-
-isl_ctx *isl_band_get_ctx(__isl_keep isl_band *band);
-
-int isl_band_has_children(__isl_keep isl_band *band);
-__isl_give isl_band_list *isl_band_get_children(
-	__isl_keep isl_band *band);
-
-__isl_give isl_union_map *isl_band_get_prefix_schedule(
-	__isl_keep isl_band *band);
-__isl_give isl_union_map *isl_band_get_partial_schedule(
-	__isl_keep isl_band *band);
-__isl_give isl_union_map *isl_band_get_suffix_schedule(
-	__isl_keep isl_band *band);
-
-int isl_band_n_member(__isl_keep isl_band *band);
-int isl_band_member_is_zero_distance(__isl_keep isl_band *band, int pos);
-
-__isl_give isl_printer *isl_printer_print_band(__isl_take isl_printer *p,
-	__isl_keep isl_band *band);
-void isl_band_dump(__isl_keep isl_band *band);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/blk.h b/cloog-0.17.0/isl/include/isl/blk.h
deleted file mode 100644
index 690a872..0000000
--- a/cloog-0.17.0/isl/include/isl/blk.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_BLK_H
-#define ISL_BLK_H
-
-#include <isl/int.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_blk {
-	size_t size;
-	isl_int *data;
-};
-
-#define ISL_BLK_CACHE_SIZE	20
-
-struct isl_ctx;
-
-struct isl_blk isl_blk_alloc(struct isl_ctx *ctx, size_t n);
-struct isl_blk isl_blk_empty(void);
-int isl_blk_is_error(struct isl_blk block);
-struct isl_blk isl_blk_extend(struct isl_ctx *ctx, struct isl_blk block,
-				size_t new_n);
-void isl_blk_free(struct isl_ctx *ctx, struct isl_blk block);
-void isl_blk_clear_cache(struct isl_ctx *ctx);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/config.h.in b/cloog-0.17.0/isl/include/isl/config.h.in
deleted file mode 100644
index 231575e..0000000
--- a/cloog-0.17.0/isl/include/isl/config.h.in
+++ /dev/null
@@ -1,3 +0,0 @@
-#undef GCC_WARN_UNUSED_RESULT
-
-#undef ISL_PIPLIB
diff --git a/cloog-0.17.0/isl/include/isl/constraint.h b/cloog-0.17.0/isl/include/isl/constraint.h
deleted file mode 100644
index bfd8989..0000000
--- a/cloog-0.17.0/isl/include/isl/constraint.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_CONSTRAINT_H
-#define ISL_CONSTRAINT_H
-
-#include <isl/local_space.h>
-#include <isl/space.h>
-#include <isl/aff_type.h>
-#include <isl/set_type.h>
-#include <isl/printer.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_constraint;
-typedef struct isl_constraint isl_constraint;
-
-isl_ctx *isl_constraint_get_ctx(__isl_keep isl_constraint *c);
-
-__isl_give isl_constraint *isl_equality_alloc(__isl_take isl_local_space *ls);
-__isl_give isl_constraint *isl_inequality_alloc(__isl_take isl_local_space *ls);
-
-struct isl_constraint *isl_constraint_cow(struct isl_constraint *c);
-struct isl_constraint *isl_constraint_copy(struct isl_constraint *c);
-void *isl_constraint_free(__isl_take isl_constraint *c);
-
-int isl_basic_map_foreach_constraint(__isl_keep isl_basic_map *bmap,
-	int (*fn)(__isl_take isl_constraint *c, void *user), void *user);
-int isl_basic_set_foreach_constraint(__isl_keep isl_basic_set *bset,
-	int (*fn)(__isl_take isl_constraint *c, void *user), void *user);
-int isl_constraint_is_equal(struct isl_constraint *constraint1,
-			    struct isl_constraint *constraint2);
-
-int isl_basic_set_foreach_bound_pair(__isl_keep isl_basic_set *bset,
-	enum isl_dim_type type, unsigned pos,
-	int (*fn)(__isl_take isl_constraint *lower,
-		  __isl_take isl_constraint *upper,
-		  __isl_take isl_basic_set *bset, void *user), void *user);
-
-__isl_give isl_basic_map *isl_basic_map_add_constraint(
-	__isl_take isl_basic_map *bmap, __isl_take isl_constraint *constraint);
-__isl_give isl_basic_set *isl_basic_set_add_constraint(
-	__isl_take isl_basic_set *bset, __isl_take isl_constraint *constraint);
-__isl_give isl_map *isl_map_add_constraint(__isl_take isl_map *map,
-	__isl_take isl_constraint *constraint);
-__isl_give isl_set *isl_set_add_constraint(__isl_take isl_set *set,
-	__isl_take isl_constraint *constraint);
-
-int isl_basic_map_has_defining_equality(
-	__isl_keep isl_basic_map *bmap, enum isl_dim_type type, int pos,
-	__isl_give isl_constraint **c);
-int isl_basic_set_has_defining_equality(
-	struct isl_basic_set *bset, enum isl_dim_type type, int pos,
-	struct isl_constraint **constraint);
-int isl_basic_set_has_defining_inequalities(
-	struct isl_basic_set *bset, enum isl_dim_type type, int pos,
-	struct isl_constraint **lower,
-	struct isl_constraint **upper);
-
-__isl_give isl_space *isl_constraint_get_space(
-	__isl_keep isl_constraint *constraint);
-int isl_constraint_dim(struct isl_constraint *constraint,
-	enum isl_dim_type type);
-
-int isl_constraint_involves_dims(__isl_keep isl_constraint *constraint,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-const char *isl_constraint_get_dim_name(__isl_keep isl_constraint *constraint,
-	enum isl_dim_type type, unsigned pos);
-void isl_constraint_get_constant(__isl_keep isl_constraint *constraint,
-	isl_int *v);
-void isl_constraint_get_coefficient(__isl_keep isl_constraint *constraint,
-	enum isl_dim_type type, int pos, isl_int *v);
-__isl_give isl_constraint *isl_constraint_set_constant(
-	__isl_take isl_constraint *constraint, isl_int v);
-__isl_give isl_constraint *isl_constraint_set_constant_si(
-	__isl_take isl_constraint *constraint, int v);
-__isl_give isl_constraint *isl_constraint_set_coefficient(
-	__isl_take isl_constraint *constraint,
-	enum isl_dim_type type, int pos, isl_int v);
-__isl_give isl_constraint *isl_constraint_set_coefficient_si(
-	__isl_take isl_constraint *constraint,
-	enum isl_dim_type type, int pos, int v);
-
-__isl_give isl_aff *isl_constraint_get_div(__isl_keep isl_constraint *constraint,
-	int pos);
-
-struct isl_constraint *isl_constraint_negate(struct isl_constraint *constraint);
-
-int isl_constraint_is_equality(__isl_keep isl_constraint *constraint);
-int isl_constraint_is_div_constraint(__isl_keep isl_constraint *constraint);
-
-__isl_give isl_basic_map *isl_basic_map_from_constraint(
-	__isl_take isl_constraint *constraint);
-struct isl_basic_set *isl_basic_set_from_constraint(
-	struct isl_constraint *constraint);
-
-__isl_give isl_aff *isl_constraint_get_bound(
-	__isl_keep isl_constraint *constraint, enum isl_dim_type type, int pos);
-__isl_give isl_aff *isl_constraint_get_aff(
-	__isl_keep isl_constraint *constraint);
-__isl_give isl_constraint *isl_equality_from_aff(__isl_take isl_aff *aff);
-__isl_give isl_constraint *isl_inequality_from_aff(__isl_take isl_aff *aff);
-
-__isl_give isl_basic_set *isl_basic_set_drop_constraint(
-	__isl_take isl_basic_set *bset, __isl_take isl_constraint *constraint);
-
-__isl_give isl_printer *isl_printer_print_constraint(__isl_take isl_printer *p,
-	__isl_keep isl_constraint *c);
-void isl_constraint_dump(__isl_keep isl_constraint *c);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#include <isl/dim.h>
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/ctx.h b/cloog-0.17.0/isl/include/isl/ctx.h
deleted file mode 100644
index a772723..0000000
--- a/cloog-0.17.0/isl/include/isl/ctx.h
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_CTX_H
-#define ISL_CTX_H
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <isl/int.h>
-#include <isl/blk.h>
-#include <isl/arg.h>
-#include <isl/hash.h>
-#include <isl/config.h>
-
-#ifndef __isl_give
-#define __isl_give
-#endif
-#ifndef __isl_take
-#define __isl_take
-#endif
-#ifndef __isl_keep
-#define __isl_keep
-#endif
-#ifndef __isl_export
-#define __isl_export
-#endif
-#ifndef __isl_constructor
-#define __isl_constructor
-#endif
-#ifndef __isl_subclass
-#define __isl_subclass(super)
-#endif
-
-#ifdef GCC_WARN_UNUSED_RESULT
-#define	WARN_UNUSED	GCC_WARN_UNUSED_RESULT
-#else
-#define WARN_UNUSED
-#endif
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/* Nearly all isa functions require a struct isl_ctx allocated using
- * isl_ctx_alloc.  This ctx contains (or will contain) options that
- * control the behavior of the library and some caches.
- *
- * An object allocated within a given ctx should never be used inside
- * another ctx.  Functions for moving objects from one ctx to another
- * will be added as the need arises.
- *
- * A given context should only be used inside a single thread.
- * A global context for synchronization between different threads
- * as well as functions for moving a context to a different thread
- * will be added as the need arises.
- *
- * If anything goes wrong (out of memory, failed assertion), then
- * the library will currently simply abort.  This will be made
- * configurable in the future.
- * Users of the library should expect functions that return
- * a pointer to a structure, to return NULL, indicating failure.
- * Any function accepting a pointer to a structure will treat
- * a NULL argument as a failure, resulting in the function freeing
- * the remaining structures (if any) and returning NULL itself
- * (in case of pointer return type).
- * The only exception is the isl_ctx argument, which should never be NULL.
- */
-struct isl_stats {
-	long	gbr_solved_lps;
-};
-enum isl_error {
-	isl_error_none = 0,
-	isl_error_abort,
-	isl_error_unknown,
-	isl_error_internal,
-	isl_error_invalid,
-	isl_error_unsupported
-};
-struct isl_ctx;
-typedef struct isl_ctx isl_ctx;
-
-/* Some helper macros */
-
-#define ISL_FL_INIT(l, f)   (l) = (f)               /* Specific flags location. */
-#define ISL_FL_SET(l, f)    ((l) |= (f))
-#define ISL_FL_CLR(l, f)    ((l) &= ~(f))
-#define ISL_FL_ISSET(l, f)  (!!((l) & (f)))
-
-#define ISL_F_INIT(p, f)    ISL_FL_INIT((p)->flags, f)  /* Structure element flags. */
-#define ISL_F_SET(p, f)     ISL_FL_SET((p)->flags, f)
-#define ISL_F_CLR(p, f)     ISL_FL_CLR((p)->flags, f)
-#define ISL_F_ISSET(p, f)   ISL_FL_ISSET((p)->flags, f)
-
-/* isl_check_ctx() checks at compile time if 'ctx' is of type 'isl_ctx *' and
- * returns the value of 'expr'. It is used to ensure, that always an isl_ctx is
- * passed to the following macros, even if they currently do not use it.
- */
-#define isl_check_ctx(ctx, expr)	(ctx != (isl_ctx *) 0) ? expr : expr
-
-#define isl_alloc(ctx,type,size)	isl_check_ctx(ctx, (type *)malloc(size))
-#define isl_calloc(ctx,type,size)	isl_check_ctx(ctx, \
-						(type *)calloc(1, size))
-#define isl_realloc(ctx,ptr,type,size)	isl_check_ctx(ctx, \
-						(type *)realloc(ptr,size))
-#define isl_alloc_type(ctx,type)	isl_alloc(ctx,type,sizeof(type))
-#define isl_calloc_type(ctx,type)	isl_calloc(ctx,type,sizeof(type))
-#define isl_realloc_type(ctx,ptr,type)	isl_realloc(ctx,ptr,type,sizeof(type))
-#define isl_alloc_array(ctx,type,n)	isl_alloc(ctx,type,(n)*sizeof(type))
-#define isl_calloc_array(ctx,type,n)	isl_check_ctx(ctx,\
-						(type *)calloc(n, sizeof(type)))
-#define isl_realloc_array(ctx,ptr,type,n) \
-				    isl_realloc(ctx,ptr,type,(n)*sizeof(type))
-
-#define isl_die(ctx,errno,msg,code)					\
-	do {								\
-		isl_handle_error(ctx, errno, msg, __FILE__, __LINE__);	\
-		code;							\
-	} while (0)
-
-void isl_handle_error(isl_ctx *ctx, int errno, const char *msg,
-	const char *file, int line);
-
-#define isl_assert4(ctx,test,code,errno)				\
-	do {								\
-		if (test)						\
-			break;						\
-		isl_die(ctx, errno, "Assertion \"" #test "\" failed", code);	\
-	} while (0)
-#define isl_assert(ctx,test,code)					\
-	isl_assert4(ctx,test,code,isl_error_unknown)
-
-#define isl_min(a,b)			((a < b) ? (a) : (b))
-
-/* struct isl_ctx functions */
-
-struct isl_options *isl_ctx_options(isl_ctx *ctx);
-
-isl_ctx *isl_ctx_alloc_with_options(struct isl_args *args,
-	__isl_take void *opt);
-isl_ctx *isl_ctx_alloc(void);
-void *isl_ctx_peek_options(isl_ctx *ctx, struct isl_args *args);
-int isl_ctx_parse_options(isl_ctx *ctx, int argc, char **argv, unsigned flags);
-void isl_ctx_ref(struct isl_ctx *ctx);
-void isl_ctx_deref(struct isl_ctx *ctx);
-void isl_ctx_free(isl_ctx *ctx);
-
-void isl_ctx_abort(isl_ctx *ctx);
-void isl_ctx_resume(isl_ctx *ctx);
-int isl_ctx_aborted(isl_ctx *ctx);
-
-#define ISL_ARG_CTX_DECL(prefix,st,args)				\
-st *isl_ctx_peek_ ## prefix(isl_ctx *ctx);
-
-#define ISL_ARG_CTX_DEF(prefix,st,args)					\
-st *isl_ctx_peek_ ## prefix(isl_ctx *ctx)				\
-{									\
-	return (st *)isl_ctx_peek_options(ctx, &(args));		\
-}
-
-#define ISL_CTX_GET_INT_DEF(prefix,st,args,field)			\
-int prefix ## _get_ ## field(isl_ctx *ctx)				\
-{									\
-	st *options;							\
-	options = isl_ctx_peek_ ## prefix(ctx);				\
-	if (!options)							\
-		isl_die(ctx, isl_error_invalid,				\
-			"isl_ctx does not reference " #prefix,		\
-			return -1);					\
-	return options->field;						\
-}
-
-#define ISL_CTX_SET_INT_DEF(prefix,st,args,field)			\
-int prefix ## _set_ ## field(isl_ctx *ctx, int val)			\
-{									\
-	st *options;							\
-	options = isl_ctx_peek_ ## prefix(ctx);				\
-	if (!options)							\
-		isl_die(ctx, isl_error_invalid,				\
-			"isl_ctx does not reference " #prefix,		\
-			return -1);					\
-	options->field = val;						\
-	return 0;							\
-}
-
-#define ISL_CTX_GET_BOOL_DEF(prefix,st,args,field)			\
-	ISL_CTX_GET_INT_DEF(prefix,st,args,field)
-
-#define ISL_CTX_SET_BOOL_DEF(prefix,st,args,field)			\
-	ISL_CTX_SET_INT_DEF(prefix,st,args,field)
-
-#define ISL_CTX_GET_CHOICE_DEF(prefix,st,args,field)			\
-	ISL_CTX_GET_INT_DEF(prefix,st,args,field)
-
-#define ISL_CTX_SET_CHOICE_DEF(prefix,st,args,field)			\
-	ISL_CTX_SET_INT_DEF(prefix,st,args,field)
-
-enum isl_error isl_ctx_last_error(isl_ctx *ctx);
-void isl_ctx_reset_error(isl_ctx *ctx);
-void isl_ctx_set_error(isl_ctx *ctx, enum isl_error error);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/dim.h b/cloog-0.17.0/isl/include/isl/dim.h
deleted file mode 100644
index 7c31c02..0000000
--- a/cloog-0.17.0/isl/include/isl/dim.h
+++ /dev/null
@@ -1,122 +0,0 @@
-#ifndef ISL_DIM_H
-#define ISL_DIM_H
-
-#include <isl/space.h>
-#include <isl/local_space.h>
-#include <isl/aff_type.h>
-#include <isl/constraint.h>
-#include <isl/map_type.h>
-#include <isl/set_type.h>
-#include <isl/point.h>
-#include <isl/union_map.h>
-#include <isl/union_set.h>
-#include <isl/polynomial_type.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-#define isl_dim isl_space
-
-isl_ctx *isl_dim_get_ctx(__isl_keep isl_space *dim);
-__isl_give isl_space *isl_dim_alloc(isl_ctx *ctx,
-			unsigned nparam, unsigned n_in, unsigned n_out);
-__isl_give isl_space *isl_dim_set_alloc(isl_ctx *ctx,
-			unsigned nparam, unsigned dim);
-__isl_give isl_space *isl_dim_copy(__isl_keep isl_space *dim);
-void isl_dim_free(__isl_take isl_space *dim);
-
-unsigned isl_dim_size(__isl_keep isl_space *dim, enum isl_dim_type type);
-
-__isl_give isl_space *isl_dim_set_dim_id(__isl_take isl_space *dim,
-	enum isl_dim_type type, unsigned pos, __isl_take isl_id *id);
-int isl_dim_has_dim_id(__isl_keep isl_space *dim,
-	enum isl_dim_type type, unsigned pos);
-__isl_give isl_id *isl_dim_get_dim_id(__isl_keep isl_space *dim,
-	enum isl_dim_type type, unsigned pos);
-
-int isl_dim_find_dim_by_id(__isl_keep isl_space *dim,
-	enum isl_dim_type type, __isl_keep isl_id *id);
-
-__isl_give isl_space *isl_dim_set_tuple_id(__isl_take isl_space *dim,
-	enum isl_dim_type type, __isl_take isl_id *id);
-__isl_give isl_space *isl_dim_reset_tuple_id(__isl_take isl_space *dim,
-	enum isl_dim_type type);
-int isl_dim_has_tuple_id(__isl_keep isl_space *dim, enum isl_dim_type type);
-__isl_give isl_id *isl_dim_get_tuple_id(__isl_keep isl_space *dim,
-	enum isl_dim_type type);
-
-__isl_give isl_space *isl_dim_set_name(__isl_take isl_space *dim,
-	enum isl_dim_type type, unsigned pos, __isl_keep const char *name);
-__isl_keep const char *isl_dim_get_name(__isl_keep isl_space *dim,
-	enum isl_dim_type type, unsigned pos);
-
-__isl_give isl_space *isl_dim_set_tuple_name(__isl_take isl_space *dim,
-	enum isl_dim_type type, const char *s);
-const char *isl_dim_get_tuple_name(__isl_keep isl_space *dim,
-				 enum isl_dim_type type);
-
-int isl_dim_is_wrapping(__isl_keep isl_space *dim);
-__isl_give isl_space *isl_dim_wrap(__isl_take isl_space *dim);
-__isl_give isl_space *isl_dim_unwrap(__isl_take isl_space *dim);
-
-__isl_give isl_space *isl_dim_domain(__isl_take isl_space *dim);
-__isl_give isl_space *isl_dim_from_domain(__isl_take isl_space *dim);
-__isl_give isl_space *isl_dim_range(__isl_take isl_space *dim);
-__isl_give isl_space *isl_dim_from_range(__isl_take isl_space *dim);
-__isl_give isl_space *isl_dim_reverse(__isl_take isl_space *dim);
-__isl_give isl_space *isl_dim_join(__isl_take isl_space *left,
-	__isl_take isl_space *right);
-__isl_give isl_space *isl_dim_align_params(__isl_take isl_space *dim1,
-	__isl_take isl_space *dim2);
-__isl_give isl_space *isl_dim_insert(__isl_take isl_space *dim,
-	enum isl_dim_type type, unsigned pos, unsigned n);
-__isl_give isl_space *isl_dim_add(__isl_take isl_space *dim,
-	enum isl_dim_type type, unsigned n);
-__isl_give isl_space *isl_dim_drop(__isl_take isl_space *dim,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_space *isl_dim_move(__isl_take isl_space *dim,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n);
-__isl_give isl_space *isl_dim_map_from_set(
-	__isl_take isl_space *dim);
-__isl_give isl_space *isl_dim_zip(__isl_take isl_space *dim);
-
-__isl_give isl_local_space *isl_local_space_from_dim(
-	__isl_take isl_space *dim);
-__isl_give isl_space *isl_local_space_get_dim(
-	__isl_keep isl_local_space *ls);
-
-__isl_give isl_space *isl_aff_get_dim(__isl_keep isl_aff *aff);
-__isl_give isl_space *isl_pw_aff_get_dim(__isl_keep isl_pw_aff *pwaff);
-
-__isl_give isl_space *isl_constraint_get_dim(
-	__isl_keep isl_constraint *constraint);
-
-__isl_give isl_space *isl_basic_map_get_dim(__isl_keep isl_basic_map *bmap);
-__isl_give isl_space *isl_map_get_dim(__isl_keep isl_map *map);
-__isl_give isl_space *isl_union_map_get_dim(__isl_keep isl_union_map *umap);
-
-__isl_give isl_space *isl_basic_set_get_dim(__isl_keep isl_basic_set *bset);
-__isl_give isl_space *isl_set_get_dim(__isl_keep isl_set *set);
-__isl_give isl_space *isl_union_set_get_dim(__isl_keep isl_union_set *uset);
-
-__isl_give isl_space *isl_point_get_dim(__isl_keep isl_point *pnt);
-
-__isl_give isl_space *isl_qpolynomial_get_dim(__isl_keep isl_qpolynomial *qp);
-__isl_give isl_space *isl_pw_qpolynomial_get_dim(
-	__isl_keep isl_pw_qpolynomial *pwqp);
-__isl_give isl_space *isl_qpolynomial_fold_get_dim(
-	__isl_keep isl_qpolynomial_fold *fold);
-__isl_give isl_space *isl_pw_qpolynomial_fold_get_dim(
-	__isl_keep isl_pw_qpolynomial_fold *pwf);
-__isl_give isl_space *isl_union_pw_qpolynomial_get_dim(
-	__isl_keep isl_union_pw_qpolynomial *upwqp);
-__isl_give isl_space *isl_union_pw_qpolynomial_fold_get_dim(
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/flow.h b/cloog-0.17.0/isl/include/isl/flow.h
deleted file mode 100644
index 8fc2698..0000000
--- a/cloog-0.17.0/isl/include/isl/flow.h
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef ISL_FLOW_H
-#define ISL_FLOW_H
-
-#include <isl/set_type.h>
-#include <isl/map_type.h>
-#include <isl/union_set.h>
-#include <isl/union_map.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/* Let n (>= 0) be the number of iterators shared by first and second.
- * If first precedes second textually return 2 * n + 1,
- * otherwise return 2 * n.
- */
-typedef int (*isl_access_level_before)(void *first, void *second);
-
-struct isl_access_info;
-typedef struct isl_access_info isl_access_info;
-struct isl_flow;
-typedef struct isl_flow isl_flow;
-
-__isl_give isl_access_info *isl_access_info_alloc(__isl_take isl_map *sink,
-	void *sink_user, isl_access_level_before fn, int max_source);
-__isl_give isl_access_info *isl_access_info_add_source(
-	__isl_take isl_access_info *acc, __isl_take isl_map *source,
-	int must, void *source_user);
-void isl_access_info_free(__isl_take isl_access_info *acc);
-
-isl_ctx *isl_access_info_get_ctx(__isl_keep isl_access_info *acc);
-
-__isl_give isl_flow *isl_access_info_compute_flow(__isl_take isl_access_info *acc);
-int isl_flow_foreach(__isl_keep isl_flow *deps,
-	int (*fn)(__isl_take isl_map *dep, int must, void *dep_user, void *user),
-	void *user);
-__isl_give isl_map *isl_flow_get_no_source(__isl_keep isl_flow *deps, int must);
-void isl_flow_free(__isl_take isl_flow *deps);
-
-isl_ctx *isl_flow_get_ctx(__isl_keep isl_flow *deps);
-
-int isl_union_map_compute_flow(__isl_take isl_union_map *sink,
-	__isl_take isl_union_map *must_source,
-	__isl_take isl_union_map *may_source,
-	__isl_take isl_union_map *schedule,
-	__isl_give isl_union_map **must_dep, __isl_give isl_union_map **may_dep,
-	__isl_give isl_union_map **must_no_source,
-	__isl_give isl_union_map **may_no_source);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/hash.h b/cloog-0.17.0/isl/include/isl/hash.h
deleted file mode 100644
index 654b6b6..0000000
--- a/cloog-0.17.0/isl/include/isl/hash.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_HASH_H
-#define ISL_HASH_H
-
-#include <stdlib.h>
-#include <isl/stdint.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-#define isl_hash_init()		(2166136261u)
-#define isl_hash_byte(h,b)	do {					\
-					h *= 16777619;			\
-					h ^= b;				\
-				} while(0)
-#define isl_hash_hash(h,h2)						\
-	do {								\
-		isl_hash_byte(h, (h2) & 0xFF);				\
-		isl_hash_byte(h, ((h2) >> 8) & 0xFF);			\
-		isl_hash_byte(h, ((h2) >> 16) & 0xFF);			\
-		isl_hash_byte(h, ((h2) >> 24) & 0xFF);			\
-	} while(0)
-#define isl_hash_bits(h,bits)						\
-	((bits) == 32) ? (h) :						\
-	((bits) >= 16) ?						\
-	      ((h) >> (bits)) ^ ((h) & (((uint32_t)1 << (bits)) - 1)) :	\
-	      (((h) >> (bits)) ^ (h)) & (((uint32_t)1 << (bits)) - 1)
-
-uint32_t isl_hash_string(uint32_t hash, const char *s);
-uint32_t isl_hash_mem(uint32_t hash, const void *p, size_t len);
-
-#define isl_hash_builtin(h,l)	isl_hash_mem(h, &l, sizeof(l))
-
-struct isl_hash_table_entry
-{
-	uint32_t  hash;
-	void     *data;
-};
-
-struct isl_hash_table {
-	int    bits;
-	int    n;
-	struct isl_hash_table_entry *entries;
-};
-
-struct isl_ctx;
-
-struct isl_hash_table *isl_hash_table_alloc(struct isl_ctx *ctx, int min_size);
-void isl_hash_table_free(struct isl_ctx *ctx, struct isl_hash_table *table);
-
-int isl_hash_table_init(struct isl_ctx *ctx, struct isl_hash_table *table,
-			int min_size);
-void isl_hash_table_clear(struct isl_hash_table *table);
-struct isl_hash_table_entry *isl_hash_table_find(struct isl_ctx *ctx,
-				struct isl_hash_table *table,
-				uint32_t key_hash,
-				int (*eq)(const void *entry, const void *val),
-				const void *val, int reserve);
-int isl_hash_table_foreach(struct isl_ctx *ctx,
-			    struct isl_hash_table *table,
-			    int (*fn)(void **entry, void *user), void *user);
-void isl_hash_table_remove(struct isl_ctx *ctx,
-				struct isl_hash_table *table,
-				struct isl_hash_table_entry *entry);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/id.h b/cloog-0.17.0/isl/include/isl/id.h
deleted file mode 100644
index 86232f7..0000000
--- a/cloog-0.17.0/isl/include/isl/id.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef ISL_ID_H
-#define ISL_ID_H
-
-#include <isl/ctx.h>
-#include <isl/printer.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_id;
-typedef struct isl_id isl_id;
-
-isl_ctx *isl_id_get_ctx(__isl_keep isl_id *id);
-
-__isl_give isl_id *isl_id_alloc(isl_ctx *ctx,
-	__isl_keep const char *name, void *user);
-__isl_give isl_id *isl_id_copy(isl_id *id);
-void *isl_id_free(__isl_take isl_id *id);
-
-void *isl_id_get_user(__isl_keep isl_id *id);
-__isl_keep const char *isl_id_get_name(__isl_keep isl_id *id);
-
-__isl_give isl_printer *isl_printer_print_id(__isl_take isl_printer *p,
-	__isl_keep isl_id *id);
-void isl_id_dump(__isl_keep isl_id *id);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/ilp.h b/cloog-0.17.0/isl/include/isl/ilp.h
deleted file mode 100644
index de5ec80..0000000
--- a/cloog-0.17.0/isl/include/isl/ilp.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_ILP_H
-#define ISL_ILP_H
-
-#include <isl/aff_type.h>
-#include <isl/lp.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-enum isl_lp_result isl_basic_set_solve_ilp(struct isl_basic_set *bset, int max,
-				      isl_int *f, isl_int *opt,
-				      struct isl_vec **sol_p);
-enum isl_lp_result isl_basic_set_max(__isl_keep isl_basic_set *bset,
-	__isl_keep isl_aff *obj, isl_int *opt);
-enum isl_lp_result isl_set_min(__isl_keep isl_set *set,
-	__isl_keep isl_aff *obj, isl_int *opt);
-enum isl_lp_result isl_set_max(__isl_keep isl_set *set,
-	__isl_keep isl_aff *obj, isl_int *opt);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/int.h b/cloog-0.17.0/isl/include/isl/int.h
deleted file mode 100644
index d5385b1..0000000
--- a/cloog-0.17.0/isl/include/isl/int.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_INT_H
-#define ISL_INT_H
-
-#include <isl/hash.h>
-#include <string.h>
-#include <gmp.h>
-#if defined(__cplusplus)
-#include <iostream>
-#endif
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-#ifndef mp_get_memory_functions
-void mp_get_memory_functions(
-		void *(**alloc_func_ptr) (size_t),
-		void *(**realloc_func_ptr) (void *, size_t, size_t),
-		void (**free_func_ptr) (void *, size_t));
-#endif
-
-/* isl_int is the basic integer type.  It currently always corresponds
- * to a gmp mpz_t, but in the future, different types such as long long
- * or cln::cl_I will be supported.
- */
-typedef mpz_t	isl_int;
-
-#define isl_int_init(i)		mpz_init(i)
-#define isl_int_clear(i)	mpz_clear(i)
-
-#define isl_int_set(r,i)	mpz_set(r,i)
-#define isl_int_set_gmp(r,i)	mpz_set(r,i)
-#define isl_int_set_si(r,i)	mpz_set_si(r,i)
-#define isl_int_set_ui(r,i)	mpz_set_ui(r,i)
-#define isl_int_get_gmp(i,g)	mpz_set(g,i)
-#define isl_int_get_si(r)	mpz_get_si(r)
-#define isl_int_get_ui(r)	mpz_get_ui(r)
-#define isl_int_get_d(r)	mpz_get_d(r)
-#define isl_int_get_str(r)	mpz_get_str(0, 10, r)
-#define isl_int_abs(r,i)	mpz_abs(r,i)
-#define isl_int_neg(r,i)	mpz_neg(r,i)
-#define isl_int_swap(i,j)	mpz_swap(i,j)
-#define isl_int_swap_or_set(i,j)	mpz_swap(i,j)
-#define isl_int_add_ui(r,i,j)	mpz_add_ui(r,i,j)
-#define isl_int_sub_ui(r,i,j)	mpz_sub_ui(r,i,j)
-
-#define isl_int_add(r,i,j)	mpz_add(r,i,j)
-#define isl_int_sub(r,i,j)	mpz_sub(r,i,j)
-#define isl_int_mul(r,i,j)	mpz_mul(r,i,j)
-#define isl_int_mul_2exp(r,i,j)	mpz_mul_2exp(r,i,j)
-#define isl_int_mul_ui(r,i,j)	mpz_mul_ui(r,i,j)
-#define isl_int_pow_ui(r,i,j)	mpz_pow_ui(r,i,j)
-#define isl_int_addmul(r,i,j)	mpz_addmul(r,i,j)
-#define isl_int_submul(r,i,j)	mpz_submul(r,i,j)
-
-#define isl_int_gcd(r,i,j)	mpz_gcd(r,i,j)
-#define isl_int_lcm(r,i,j)	mpz_lcm(r,i,j)
-#define isl_int_divexact(r,i,j)	mpz_divexact(r,i,j)
-#define isl_int_divexact_ui(r,i,j)	mpz_divexact_ui(r,i,j)
-#define isl_int_tdiv_q(r,i,j)	mpz_tdiv_q(r,i,j)
-#define isl_int_cdiv_q(r,i,j)	mpz_cdiv_q(r,i,j)
-#define isl_int_fdiv_q(r,i,j)	mpz_fdiv_q(r,i,j)
-#define isl_int_fdiv_r(r,i,j)	mpz_fdiv_r(r,i,j)
-#define isl_int_fdiv_q_ui(r,i,j)	mpz_fdiv_q_ui(r,i,j)
-
-#define isl_int_read(r,s)	mpz_set_str(r,s,10)
-typedef void (*isl_int_print_gmp_free_t)(void *, size_t);
-#define isl_int_print(out,i,width)					\
-	do {								\
-		char *s;						\
-		isl_int_print_gmp_free_t gmp_free;			\
-		s = mpz_get_str(0, 10, i);				\
-		fprintf(out, "%*s", width, s);				\
-		mp_get_memory_functions(NULL, NULL, &gmp_free);		\
-		(*gmp_free)(s, strlen(s)+1);				\
-	} while (0)
-
-#define isl_int_sgn(i)		mpz_sgn(i)
-#define isl_int_cmp(i,j)	mpz_cmp(i,j)
-#define isl_int_cmp_si(i,si)	mpz_cmp_si(i,si)
-#define isl_int_eq(i,j)		(mpz_cmp(i,j) == 0)
-#define isl_int_ne(i,j)		(mpz_cmp(i,j) != 0)
-#define isl_int_lt(i,j)		(mpz_cmp(i,j) < 0)
-#define isl_int_le(i,j)		(mpz_cmp(i,j) <= 0)
-#define isl_int_gt(i,j)		(mpz_cmp(i,j) > 0)
-#define isl_int_ge(i,j)		(mpz_cmp(i,j) >= 0)
-#define isl_int_abs_eq(i,j)	(mpz_cmpabs(i,j) == 0)
-#define isl_int_abs_ne(i,j)	(mpz_cmpabs(i,j) != 0)
-#define isl_int_abs_lt(i,j)	(mpz_cmpabs(i,j) < 0)
-#define isl_int_abs_gt(i,j)	(mpz_cmpabs(i,j) > 0)
-#define isl_int_abs_ge(i,j)	(mpz_cmpabs(i,j) >= 0)
-
-
-#define isl_int_is_zero(i)	(isl_int_sgn(i) == 0)
-#define isl_int_is_one(i)	(isl_int_cmp_si(i,1) == 0)
-#define isl_int_is_negone(i)	(isl_int_cmp_si(i,-1) == 0)
-#define isl_int_is_pos(i)	(isl_int_sgn(i) > 0)
-#define isl_int_is_neg(i)	(isl_int_sgn(i) < 0)
-#define isl_int_is_nonpos(i)	(isl_int_sgn(i) <= 0)
-#define isl_int_is_nonneg(i)	(isl_int_sgn(i) >= 0)
-#define isl_int_is_divisible_by(i,j)	mpz_divisible_p(i,j)
-
-uint32_t isl_gmp_hash(mpz_t v, uint32_t hash);
-#define isl_int_hash(v,h)	isl_gmp_hash(v,h)
-
-#if defined(__cplusplus)
-}
-#endif
-
-#if defined(__cplusplus)
-extern "C" { typedef void (*isl_gmp_free_t)(void *, size_t); }
-
-static inline std::ostream &operator<<(std::ostream &os, isl_int i)
-{
-	char *s;
-	isl_gmp_free_t gmp_free;
-	s = mpz_get_str(0, 10, i);
-	os << s;
-	mp_get_memory_functions(NULL, NULL, &gmp_free);
-	(*gmp_free)(s, strlen(s)+1);
-	return os;
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/list.h b/cloog-0.17.0/isl/include/isl/list.h
deleted file mode 100644
index e0dbfed..0000000
--- a/cloog-0.17.0/isl/include/isl/list.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_LIST_H
-#define ISL_LIST_H
-
-#include <isl/ctx.h>
-#include <isl/printer.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-#define ISL_DECLARE_LIST(EL)						\
-struct isl_##EL;							\
-struct isl_##EL##_list;							\
-typedef struct isl_##EL##_list isl_##EL##_list;				\
-isl_ctx *isl_##EL##_list_get_ctx(__isl_keep isl_##EL##_list *list);	\
-__isl_give isl_##EL##_list *isl_##EL##_list_from_##EL(			\
-	__isl_take struct isl_##EL *el);				\
-__isl_give isl_##EL##_list *isl_##EL##_list_alloc(isl_ctx *ctx, int n);	\
-__isl_give isl_##EL##_list *isl_##EL##_list_copy(			\
-	__isl_keep isl_##EL##_list *list);				\
-void *isl_##EL##_list_free(__isl_take isl_##EL##_list *list);		\
-__isl_give isl_##EL##_list *isl_##EL##_list_add(			\
-	__isl_take isl_##EL##_list *list,				\
-	__isl_take struct isl_##EL *el);				\
-__isl_give isl_##EL##_list *isl_##EL##_list_concat(			\
-	__isl_take isl_##EL##_list *list1,				\
-	__isl_take isl_##EL##_list *list2);				\
-int isl_##EL##_list_n_##EL(__isl_keep isl_##EL##_list *list);		\
-__isl_give struct isl_##EL *isl_##EL##_list_get_##EL(			\
-	__isl_keep isl_##EL##_list *list, int index);			\
-int isl_##EL##_list_foreach(__isl_keep isl_##EL##_list *list,		\
-	int (*fn)(__isl_take struct isl_##EL *el, void *user),		\
-	void *user);							\
-__isl_give isl_printer *isl_printer_print_##EL##_list(			\
-	__isl_take isl_printer *p, __isl_keep isl_##EL##_list *list);	\
-void isl_##EL##_list_dump(__isl_keep isl_##EL##_list *list);
-
-ISL_DECLARE_LIST(basic_set)
-ISL_DECLARE_LIST(set)
-ISL_DECLARE_LIST(aff)
-ISL_DECLARE_LIST(pw_aff)
-ISL_DECLARE_LIST(band)
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/local_space.h b/cloog-0.17.0/isl/include/isl/local_space.h
deleted file mode 100644
index 1f6108d..0000000
--- a/cloog-0.17.0/isl/include/isl/local_space.h
+++ /dev/null
@@ -1,72 +0,0 @@
-#ifndef ISL_LOCAL_SPACE_H
-#define ISL_LOCAL_SPACE_H
-
-#include <isl/aff_type.h>
-#include <isl/space.h>
-#include <isl/printer.h>
-#include <isl/map_type.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_local_space;
-typedef struct isl_local_space isl_local_space;
-
-isl_ctx *isl_local_space_get_ctx(__isl_keep isl_local_space *ls);
-
-__isl_give isl_local_space *isl_local_space_from_space(__isl_take isl_space *dim);
-
-__isl_give isl_local_space *isl_local_space_copy(
-	__isl_keep isl_local_space *ls);
-void *isl_local_space_free(__isl_take isl_local_space *ls);
-
-int isl_local_space_is_set(__isl_keep isl_local_space *ls);
-
-int isl_local_space_dim(__isl_keep isl_local_space *ls,
-	enum isl_dim_type type);
-const char *isl_local_space_get_dim_name(__isl_keep isl_local_space *ls,
-	enum isl_dim_type type, unsigned pos);
-__isl_give isl_local_space *isl_local_space_set_dim_name(
-	__isl_take isl_local_space *ls,
-	enum isl_dim_type type, unsigned pos, const char *s);
-__isl_give isl_local_space *isl_local_space_set_dim_id(
-	__isl_take isl_local_space *ls,
-	enum isl_dim_type type, unsigned pos, __isl_take isl_id *id);
-__isl_give isl_space *isl_local_space_get_space(__isl_keep isl_local_space *ls);
-__isl_give isl_aff *isl_local_space_get_div(__isl_keep isl_local_space *ls,
-	int pos);
-
-__isl_give isl_local_space *isl_local_space_domain(
-	__isl_take isl_local_space *ls);
-__isl_give isl_local_space *isl_local_space_range(
-	__isl_take isl_local_space *ls);
-__isl_give isl_local_space *isl_local_space_from_domain(
-	__isl_take isl_local_space *ls);
-__isl_give isl_local_space *isl_local_space_add_dims(
-	__isl_take isl_local_space *ls, enum isl_dim_type type, unsigned n);
-__isl_give isl_local_space *isl_local_space_drop_dims(
-	__isl_take isl_local_space *ls,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_local_space *isl_local_space_insert_dims(
-	__isl_take isl_local_space *ls,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-__isl_give isl_local_space *isl_local_space_intersect(
-	__isl_take isl_local_space *ls1, __isl_take isl_local_space *ls2);
-
-int isl_local_space_is_equal(__isl_keep isl_local_space *ls1,
-	__isl_keep isl_local_space *ls2);
-
-__isl_give isl_basic_map *isl_local_space_lifting(
-	__isl_take isl_local_space *ls);
-
-__isl_give isl_printer *isl_printer_print_local_space(__isl_take isl_printer *p,
-	__isl_keep isl_local_space *ls);
-void isl_local_space_dump(__isl_keep isl_local_space *ls);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/lp.h b/cloog-0.17.0/isl/include/isl/lp.h
deleted file mode 100644
index 9f7a912..0000000
--- a/cloog-0.17.0/isl/include/isl/lp.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_LP_H
-#define ISL_LP_H
-
-#include <isl/int.h>
-#include <isl/vec.h>
-#include <isl/map_type.h>
-#include <isl/set_type.h>
-
-enum isl_lp_result {
-	isl_lp_error = -1,
-	isl_lp_ok = 0,
-	isl_lp_unbounded,
-	isl_lp_empty
-};
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-enum isl_lp_result isl_basic_map_solve_lp(struct isl_basic_map *bmap, int max,
-				      isl_int *f, isl_int denom, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **sol);
-enum isl_lp_result isl_basic_set_solve_lp(struct isl_basic_set *bset, int max,
-				      isl_int *f, isl_int denom, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **sol);
-enum isl_lp_result isl_map_solve_lp(__isl_keep isl_map *map, int max,
-				      isl_int *f, isl_int denom, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **sol);
-enum isl_lp_result isl_set_solve_lp(__isl_keep isl_set *set, int max,
-				      isl_int *f, isl_int denom, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **sol);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/map.h b/cloog-0.17.0/isl/include/isl/map.h
deleted file mode 100644
index 289e7cc..0000000
--- a/cloog-0.17.0/isl/include/isl/map.h
+++ /dev/null
@@ -1,594 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_MAP_H
-#define ISL_MAP_H
-
-#include <stdio.h>
-
-#include <isl/int.h>
-#include <isl/ctx.h>
-#include <isl/blk.h>
-#include <isl/space.h>
-#include <isl/vec.h>
-#include <isl/mat.h>
-#include <isl/printer.h>
-#include <isl/local_space.h>
-#include <isl/aff_type.h>
-#include <isl/list.h>
-#include <isl/map_type.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/* General notes:
- *
- * All structures are reference counted to allow reuse without duplication.
- * A *_copy operation will increase the reference count, while a *_free
- * operation will decrease the reference count and only actually release
- * the structures when the reference count drops to zero.
- *
- * Functions that return an isa structure will in general _destroy_
- * all argument isa structures (the obvious execption begin the _copy
- * functions).  A pointer passed to such a function may therefore
- * never be used after the function call.  If you want to keep a
- * reference to the old structure(s), use the appropriate _copy function.
- */
-
-unsigned isl_basic_map_n_in(const struct isl_basic_map *bmap);
-unsigned isl_basic_map_n_out(const struct isl_basic_map *bmap);
-unsigned isl_basic_map_n_param(const struct isl_basic_map *bmap);
-unsigned isl_basic_map_n_div(const struct isl_basic_map *bmap);
-unsigned isl_basic_map_total_dim(const struct isl_basic_map *bmap);
-unsigned isl_basic_map_dim(__isl_keep isl_basic_map *bmap,
-				enum isl_dim_type type);
-
-unsigned isl_map_n_in(const struct isl_map *map);
-unsigned isl_map_n_out(const struct isl_map *map);
-unsigned isl_map_n_param(const struct isl_map *map);
-unsigned isl_map_dim(__isl_keep isl_map *map, enum isl_dim_type type);
-
-isl_ctx *isl_basic_map_get_ctx(__isl_keep isl_basic_map *bmap);
-isl_ctx *isl_map_get_ctx(__isl_keep isl_map *map);
-__isl_give isl_space *isl_basic_map_get_space(__isl_keep isl_basic_map *bmap);
-__isl_give isl_space *isl_map_get_space(__isl_keep isl_map *map);
-
-__isl_give isl_aff *isl_basic_map_get_div(__isl_keep isl_basic_map *bmap,
-	int pos);
-
-__isl_give isl_local_space *isl_basic_map_get_local_space(
-	__isl_keep isl_basic_map *bmap);
-
-__isl_give isl_basic_map *isl_basic_map_set_tuple_name(
-	__isl_take isl_basic_map *bmap, enum isl_dim_type type, const char *s);
-const char *isl_basic_map_get_tuple_name(__isl_keep isl_basic_map *bmap,
-	enum isl_dim_type type);
-const char *isl_map_get_tuple_name(__isl_keep isl_map *map,
-	enum isl_dim_type type);
-__isl_give isl_map *isl_map_set_tuple_name(__isl_take isl_map *map,
-	enum isl_dim_type type, const char *s);
-const char *isl_basic_map_get_dim_name(__isl_keep isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned pos);
-const char *isl_map_get_dim_name(__isl_keep isl_map *map,
-	enum isl_dim_type type, unsigned pos);
-__isl_give isl_basic_map *isl_basic_map_set_dim_name(
-	__isl_take isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned pos, const char *s);
-__isl_give isl_map *isl_map_set_dim_name(__isl_take isl_map *map,
-	enum isl_dim_type type, unsigned pos, const char *s);
-
-__isl_give isl_map *isl_map_set_dim_id(__isl_take isl_map *map,
-	enum isl_dim_type type, unsigned pos, __isl_take isl_id *id);
-int isl_basic_map_has_dim_id(__isl_keep isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned pos);
-int isl_map_has_dim_id(__isl_keep isl_map *map,
-	enum isl_dim_type type, unsigned pos);
-__isl_give isl_id *isl_map_get_dim_id(__isl_keep isl_map *map,
-	enum isl_dim_type type, unsigned pos);
-__isl_give isl_map *isl_map_set_tuple_id(__isl_take isl_map *map,
-	enum isl_dim_type type, __isl_take isl_id *id);
-__isl_give isl_map *isl_map_reset_tuple_id(__isl_take isl_map *map,
-	enum isl_dim_type type);
-int isl_map_has_tuple_id(__isl_keep isl_map *map, enum isl_dim_type type);
-__isl_give isl_id *isl_map_get_tuple_id(__isl_keep isl_map *map,
-	enum isl_dim_type type);
-
-int isl_map_find_dim_by_id(__isl_keep isl_map *map, enum isl_dim_type type,
-	__isl_keep isl_id *id);
-int isl_map_find_dim_by_name(__isl_keep isl_map *map, enum isl_dim_type type,
-	const char *name);
-
-int isl_basic_map_is_rational(__isl_keep isl_basic_map *bmap);
-
-struct isl_basic_map *isl_basic_map_alloc(struct isl_ctx *ctx,
-		unsigned nparam, unsigned in, unsigned out, unsigned extra,
-		unsigned n_eq, unsigned n_ineq);
-__isl_give isl_basic_map *isl_basic_map_identity(__isl_take isl_space *dim);
-struct isl_basic_map *isl_basic_map_identity_like(struct isl_basic_map *model);
-struct isl_basic_map *isl_basic_map_finalize(struct isl_basic_map *bmap);
-void isl_basic_map_free(__isl_take isl_basic_map *bmap);
-__isl_give isl_basic_map *isl_basic_map_copy(__isl_keep isl_basic_map *bmap);
-struct isl_basic_map *isl_basic_map_extend(struct isl_basic_map *base,
-		unsigned nparam, unsigned n_in, unsigned n_out, unsigned extra,
-		unsigned n_eq, unsigned n_ineq);
-struct isl_basic_map *isl_basic_map_extend_constraints(
-		struct isl_basic_map *base, unsigned n_eq, unsigned n_ineq);
-__isl_give isl_basic_map *isl_basic_map_equal(
-	__isl_take isl_space *dim, unsigned n_equal);
-__isl_give isl_basic_map *isl_basic_map_less_at(__isl_take isl_space *dim,
-	unsigned pos);
-__isl_give isl_basic_map *isl_basic_map_more_at(__isl_take isl_space *dim,
-	unsigned pos);
-__isl_give isl_basic_map *isl_basic_map_empty(__isl_take isl_space *dim);
-struct isl_basic_map *isl_basic_map_empty_like(struct isl_basic_map *model);
-struct isl_basic_map *isl_basic_map_empty_like_map(struct isl_map *model);
-__isl_give isl_basic_map *isl_basic_map_universe(__isl_take isl_space *dim);
-__isl_give isl_basic_map *isl_basic_map_nat_universe(__isl_take isl_space *dim);
-__isl_give isl_basic_map *isl_basic_map_universe_like(
-		__isl_keep isl_basic_map *bmap);
-__isl_give isl_basic_map *isl_basic_map_remove_redundancies(
-	__isl_take isl_basic_map *bmap);
-__isl_give isl_map *isl_map_remove_redundancies(__isl_take isl_map *map);
-__isl_give isl_basic_map *isl_map_simple_hull(__isl_take isl_map *map);
-
-__isl_export
-__isl_give isl_basic_map *isl_basic_map_intersect_domain(
-		__isl_take isl_basic_map *bmap,
-		__isl_take isl_basic_set *bset);
-__isl_export
-__isl_give isl_basic_map *isl_basic_map_intersect_range(
-		__isl_take isl_basic_map *bmap,
-		__isl_take isl_basic_set *bset);
-__isl_export
-__isl_give isl_basic_map *isl_basic_map_intersect(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-__isl_export
-__isl_give isl_map *isl_basic_map_union(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-__isl_export
-__isl_give isl_basic_map *isl_basic_map_apply_domain(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-__isl_export
-__isl_give isl_basic_map *isl_basic_map_apply_range(
-		__isl_take isl_basic_map *bmap1,
-		__isl_take isl_basic_map *bmap2);
-__isl_export
-__isl_give isl_basic_map *isl_basic_map_affine_hull(
-		__isl_take isl_basic_map *bmap);
-__isl_export
-__isl_give isl_basic_map *isl_basic_map_reverse(__isl_take isl_basic_map *bmap);
-__isl_give isl_basic_set *isl_basic_map_domain(__isl_take isl_basic_map *bmap);
-__isl_give isl_basic_set *isl_basic_map_range(__isl_take isl_basic_map *bmap);
-__isl_give isl_basic_map *isl_basic_map_domain_map(
-	__isl_take isl_basic_map *bmap);
-__isl_give isl_basic_map *isl_basic_map_range_map(
-	__isl_take isl_basic_map *bmap);
-__isl_give isl_basic_map *isl_basic_map_remove_dims(
-	__isl_take isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_basic_map *isl_basic_map_eliminate(
-	__isl_take isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_basic_map *isl_basic_map_from_basic_set(
-	__isl_take isl_basic_set *bset, __isl_take isl_space *dim);
-struct isl_basic_set *isl_basic_set_from_basic_map(struct isl_basic_map *bmap);
-__isl_export
-__isl_give isl_basic_map *isl_basic_map_sample(__isl_take isl_basic_map *bmap);
-struct isl_basic_map *isl_basic_map_simplify(struct isl_basic_map *bmap);
-__isl_export
-__isl_give isl_basic_map *isl_basic_map_detect_equalities(
-						__isl_take isl_basic_map *bmap);
-__isl_give isl_basic_map *isl_basic_map_read_from_file(isl_ctx *ctx,
-	FILE *input);
-__isl_constructor
-__isl_give isl_basic_map *isl_basic_map_read_from_str(isl_ctx *ctx,
-	const char *str);
-__isl_give isl_map *isl_map_read_from_file(isl_ctx *ctx, FILE *input);
-__isl_constructor
-__isl_give isl_map *isl_map_read_from_str(isl_ctx *ctx, const char *str);
-void isl_basic_map_dump(__isl_keep isl_basic_map *bmap);
-void isl_basic_map_print(__isl_keep isl_basic_map *bmap, FILE *out, int indent,
-	const char *prefix, const char *suffix, unsigned output_format);
-void isl_map_dump(__isl_keep isl_map *map);
-void isl_map_print(__isl_keep isl_map *map, FILE *out, int indent,
-	unsigned output_format);
-__isl_give isl_printer *isl_printer_print_basic_map(
-	__isl_take isl_printer *printer, __isl_keep isl_basic_map *bmap);
-__isl_give isl_printer *isl_printer_print_map(__isl_take isl_printer *printer,
-	__isl_keep isl_map *map);
-__isl_give isl_basic_map *isl_basic_map_fix_si(__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned pos, int value);
-__isl_give isl_basic_map *isl_basic_map_lower_bound_si(
-		__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned pos, int value);
-
-struct isl_basic_map *isl_basic_map_sum(
-		struct isl_basic_map *bmap1, struct isl_basic_map *bmap2);
-struct isl_basic_map *isl_basic_map_neg(struct isl_basic_map *bmap);
-struct isl_basic_map *isl_basic_map_floordiv(struct isl_basic_map *bmap,
-		isl_int d);
-
-struct isl_map *isl_map_sum(struct isl_map *map1, struct isl_map *map2);
-struct isl_map *isl_map_neg(struct isl_map *map);
-struct isl_map *isl_map_floordiv(struct isl_map *map, isl_int d);
-
-__isl_export
-int isl_basic_map_is_equal(
-		__isl_keep isl_basic_map *bmap1,
-		__isl_keep isl_basic_map *bmap2);
-
-__isl_give isl_map *isl_basic_map_partial_lexmax(
-		__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-		__isl_give isl_set **empty);
-__isl_give isl_map *isl_basic_map_partial_lexmin(
-		__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-		__isl_give isl_set **empty);
-__isl_give isl_map *isl_map_partial_lexmax(
-		__isl_take isl_map *map, __isl_take isl_set *dom,
-		__isl_give isl_set **empty);
-__isl_give isl_map *isl_map_partial_lexmin(
-		__isl_take isl_map *map, __isl_take isl_set *dom,
-		__isl_give isl_set **empty);
-__isl_export
-__isl_give isl_map *isl_basic_map_lexmin(__isl_take isl_basic_map *bmap);
-__isl_export
-__isl_give isl_map *isl_basic_map_lexmax(__isl_take isl_basic_map *bmap);
-__isl_export
-__isl_give isl_map *isl_map_lexmin(__isl_take isl_map *map);
-__isl_export
-__isl_give isl_map *isl_map_lexmax(__isl_take isl_map *map);
-__isl_give isl_pw_multi_aff *isl_basic_map_partial_lexmin_pw_multi_aff(
-	__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty);
-__isl_give isl_pw_multi_aff *isl_basic_map_partial_lexmax_pw_multi_aff(
-	__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty);
-__isl_give isl_pw_multi_aff *isl_basic_map_lexmin_pw_multi_aff(
-	__isl_take isl_basic_map *bmap);
-
-void isl_basic_map_print_internal(__isl_keep isl_basic_map *bmap,
-	FILE *out, int indent);
-
-struct isl_basic_map *isl_map_copy_basic_map(struct isl_map *map);
-__isl_give isl_map *isl_map_drop_basic_map(__isl_take isl_map *map,
-						__isl_keep isl_basic_map *bmap);
-
-int isl_basic_map_plain_is_fixed(__isl_keep isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned pos, isl_int *val);
-
-int isl_basic_map_image_is_bounded(__isl_keep isl_basic_map *bmap);
-int isl_basic_map_is_universe(__isl_keep isl_basic_map *bmap);
-int isl_basic_map_plain_is_empty(__isl_keep isl_basic_map *bmap);
-int isl_basic_map_fast_is_empty(__isl_keep isl_basic_map *bmap);
-__isl_export
-int isl_basic_map_is_empty(__isl_keep isl_basic_map *bmap);
-int isl_basic_map_is_subset(__isl_keep isl_basic_map *bmap1,
-		__isl_keep isl_basic_map *bmap2);
-int isl_basic_map_is_strict_subset(__isl_keep isl_basic_map *bmap1,
-		__isl_keep isl_basic_map *bmap2);
-
-struct isl_map *isl_map_alloc(struct isl_ctx *ctx,
-		unsigned nparam, unsigned in, unsigned out, int n,
-		unsigned flags);
-__isl_give isl_map *isl_map_universe(__isl_take isl_space *dim);
-__isl_give isl_map *isl_map_nat_universe(__isl_take isl_space *dim);
-__isl_give isl_map *isl_map_empty(__isl_take isl_space *dim);
-struct isl_map *isl_map_empty_like(struct isl_map *model);
-struct isl_map *isl_map_empty_like_basic_map(struct isl_basic_map *model);
-struct isl_map *isl_map_dup(struct isl_map *map);
-__isl_give isl_map *isl_map_add_basic_map(__isl_take isl_map *map,
-						__isl_take isl_basic_map *bmap);
-__isl_give isl_map *isl_map_identity(__isl_take isl_space *dim);
-struct isl_map *isl_map_identity_like(struct isl_map *model);
-struct isl_map *isl_map_identity_like_basic_map(struct isl_basic_map *model);
-__isl_give isl_map *isl_map_lex_lt_first(__isl_take isl_space *dim, unsigned n);
-__isl_give isl_map *isl_map_lex_le_first(__isl_take isl_space *dim, unsigned n);
-__isl_give isl_map *isl_map_lex_lt(__isl_take isl_space *set_dim);
-__isl_give isl_map *isl_map_lex_le(__isl_take isl_space *set_dim);
-__isl_give isl_map *isl_map_lex_gt_first(__isl_take isl_space *dim, unsigned n);
-__isl_give isl_map *isl_map_lex_ge_first(__isl_take isl_space *dim, unsigned n);
-__isl_give isl_map *isl_map_lex_gt(__isl_take isl_space *set_dim);
-__isl_give isl_map *isl_map_lex_ge(__isl_take isl_space *set_dim);
-struct isl_map *isl_map_finalize(struct isl_map *map);
-void isl_map_free(__isl_take isl_map *map);
-__isl_give isl_map *isl_map_copy(__isl_keep isl_map *map);
-struct isl_map *isl_map_extend(struct isl_map *base,
-		unsigned nparam, unsigned n_in, unsigned n_out);
-__isl_export
-__isl_give isl_map *isl_map_reverse(__isl_take isl_map *map);
-__isl_export
-__isl_give isl_map *isl_map_union(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-struct isl_map *isl_map_union_disjoint(
-			struct isl_map *map1, struct isl_map *map2);
-__isl_export
-__isl_give isl_map *isl_map_intersect_domain(
-		__isl_take isl_map *map,
-		__isl_take isl_set *set);
-__isl_export
-__isl_give isl_map *isl_map_intersect_range(
-		__isl_take isl_map *map,
-		__isl_take isl_set *set);
-__isl_export
-__isl_give isl_map *isl_map_apply_domain(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-__isl_export
-__isl_give isl_map *isl_map_apply_range(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-__isl_give isl_map *isl_map_product(__isl_take isl_map *map1,
-	__isl_take isl_map *map2);
-__isl_give isl_basic_map *isl_basic_map_domain_product(
-	__isl_take isl_basic_map *bmap1, __isl_take isl_basic_map *bmap2);
-__isl_give isl_basic_map *isl_basic_map_range_product(
-	__isl_take isl_basic_map *bmap1, __isl_take isl_basic_map *bmap2);
-__isl_give isl_map *isl_map_domain_product(__isl_take isl_map *map1,
-	__isl_take isl_map *map2);
-__isl_give isl_map *isl_map_range_product(__isl_take isl_map *map1,
-	__isl_take isl_map *map2);
-__isl_give isl_basic_map *isl_basic_map_flat_product(
-	__isl_take isl_basic_map *bmap1, __isl_take isl_basic_map *bmap2);
-__isl_give isl_map *isl_map_flat_product(__isl_take isl_map *map1,
-	__isl_take isl_map *map2);
-__isl_give isl_basic_map *isl_basic_map_flat_range_product(
-	__isl_take isl_basic_map *bmap1, __isl_take isl_basic_map *bmap2);
-__isl_give isl_map *isl_map_flat_domain_product(__isl_take isl_map *map1,
-	__isl_take isl_map *map2);
-__isl_give isl_map *isl_map_flat_range_product(__isl_take isl_map *map1,
-	__isl_take isl_map *map2);
-__isl_export
-__isl_give isl_map *isl_map_intersect(__isl_take isl_map *map1,
-				      __isl_take isl_map *map2);
-__isl_export
-__isl_give isl_map *isl_map_intersect_params(__isl_take isl_map *map,
-		__isl_take isl_set *params);
-__isl_export
-__isl_give isl_map *isl_map_subtract(
-		__isl_take isl_map *map1,
-		__isl_take isl_map *map2);
-__isl_give isl_map *isl_map_subtract_domain(__isl_take isl_map *map,
-	__isl_take isl_set *dom);
-__isl_give isl_map *isl_map_subtract_range(__isl_take isl_map *map,
-	__isl_take isl_set *dom);
-struct isl_map *isl_map_fix_input_si(struct isl_map *map,
-		unsigned input, int value);
-__isl_give isl_map *isl_map_fix_si(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned pos, int value);
-__isl_give isl_map *isl_map_lower_bound_si(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned pos, int value);
-__isl_give isl_map *isl_map_upper_bound_si(__isl_take isl_map *map,
-	enum isl_dim_type type, unsigned pos, int value);
-__isl_export
-__isl_give isl_basic_set *isl_basic_map_deltas(__isl_take isl_basic_map *bmap);
-__isl_export
-__isl_give isl_set *isl_map_deltas(__isl_take isl_map *map);
-__isl_give isl_basic_map *isl_basic_map_deltas_map(
-	__isl_take isl_basic_map *bmap);
-__isl_give isl_map *isl_map_deltas_map(__isl_take isl_map *map);
-__isl_export
-__isl_give isl_map *isl_map_detect_equalities(__isl_take isl_map *map);
-__isl_export
-__isl_give isl_basic_map *isl_map_affine_hull(__isl_take isl_map *map);
-__isl_give isl_basic_map *isl_map_convex_hull(__isl_take isl_map *map);
-__isl_export
-__isl_give isl_basic_map *isl_map_polyhedral_hull(__isl_take isl_map *map);
-__isl_give isl_basic_map *isl_basic_map_add(__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned n);
-__isl_give isl_map *isl_map_add_dims(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned n);
-__isl_give isl_map *isl_map_insert_dims(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned pos, unsigned n);
-__isl_give isl_basic_map *isl_basic_map_move_dims(
-	__isl_take isl_basic_map *bmap,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n);
-__isl_give isl_map *isl_map_move_dims(__isl_take isl_map *map,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n);
-__isl_give isl_basic_map *isl_basic_map_project_out(
-		__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_map *isl_map_project_out(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_basic_map *isl_basic_map_remove_divs(
-	__isl_take isl_basic_map *bmap);
-__isl_give isl_map *isl_map_remove_divs(__isl_take isl_map *map);
-__isl_give isl_map *isl_map_eliminate(__isl_take isl_map *map,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_map *isl_map_remove_dims(__isl_take isl_map *map,
-	enum isl_dim_type type, unsigned first, unsigned n);
-struct isl_map *isl_map_remove_inputs(struct isl_map *map,
-	unsigned first, unsigned n);
-
-__isl_give isl_map *isl_map_equate(__isl_take isl_map *map,
-	enum isl_dim_type type1, int pos1, enum isl_dim_type type2, int pos2);
-__isl_give isl_map *isl_map_oppose(__isl_take isl_map *map,
-	enum isl_dim_type type1, int pos1, enum isl_dim_type type2, int pos2);
-
-__isl_export
-__isl_give isl_map *isl_set_identity(__isl_take isl_set *set);
-
-__isl_export
-int isl_basic_set_is_wrapping(__isl_keep isl_basic_set *bset);
-__isl_export
-int isl_set_is_wrapping(__isl_keep isl_set *set);
-__isl_give isl_basic_set *isl_basic_map_wrap(__isl_take isl_basic_map *bmap);
-__isl_give isl_set *isl_map_wrap(__isl_take isl_map *map);
-__isl_give isl_basic_map *isl_basic_set_unwrap(__isl_take isl_basic_set *bset);
-__isl_give isl_map *isl_set_unwrap(__isl_take isl_set *set);
-__isl_export
-__isl_give isl_basic_map *isl_basic_map_flatten(__isl_take isl_basic_map *bmap);
-__isl_export
-__isl_give isl_map *isl_map_flatten(__isl_take isl_map *map);
-__isl_export
-__isl_give isl_basic_map *isl_basic_map_flatten_domain(
-	__isl_take isl_basic_map *bmap);
-__isl_export
-__isl_give isl_basic_map *isl_basic_map_flatten_range(
-	__isl_take isl_basic_map *bmap);
-__isl_export
-__isl_give isl_map *isl_map_flatten_domain(__isl_take isl_map *map);
-__isl_export
-__isl_give isl_map *isl_map_flatten_range(__isl_take isl_map *map);
-__isl_export
-__isl_give isl_basic_set *isl_basic_set_flatten(__isl_take isl_basic_set *bset);
-__isl_export
-__isl_give isl_set *isl_set_flatten(__isl_take isl_set *set);
-__isl_give isl_map *isl_set_flatten_map(__isl_take isl_set *set);
-__isl_give isl_set *isl_map_params(__isl_take isl_map *map);
-__isl_give isl_set *isl_map_domain(__isl_take isl_map *bmap);
-__isl_give isl_set *isl_map_range(__isl_take isl_map *map);
-__isl_give isl_map *isl_map_domain_map(__isl_take isl_map *map);
-__isl_give isl_map *isl_map_range_map(__isl_take isl_map *map);
-__isl_constructor
-__isl_give isl_map *isl_map_from_basic_map(__isl_take isl_basic_map *bmap);
-__isl_give isl_map *isl_map_from_domain(__isl_take isl_set *set);
-__isl_give isl_basic_map *isl_basic_map_from_domain(
-	__isl_take isl_basic_set *bset);
-__isl_give isl_basic_map *isl_basic_map_from_range(
-	__isl_take isl_basic_set *bset);
-struct isl_map *isl_map_from_range(struct isl_set *set);
-__isl_give isl_basic_map *isl_basic_map_from_domain_and_range(
-	__isl_take isl_basic_set *domain, __isl_take isl_basic_set *range);
-__isl_give isl_map *isl_map_from_domain_and_range(__isl_take isl_set *domain,
-	__isl_take isl_set *range);
-__isl_give isl_map *isl_map_from_set(__isl_take isl_set *set,
-	__isl_take isl_space *dim);
-struct isl_set *isl_set_from_map(struct isl_map *map);
-__isl_export
-__isl_give isl_basic_map *isl_map_sample(__isl_take isl_map *map);
-
-int isl_map_plain_is_empty(__isl_keep isl_map *map);
-int isl_map_fast_is_empty(__isl_keep isl_map *map);
-int isl_map_plain_is_universe(__isl_keep isl_map *map);
-__isl_export
-int isl_map_is_empty(__isl_keep isl_map *map);
-__isl_export
-int isl_map_is_subset(__isl_keep isl_map *map1, __isl_keep isl_map *map2);
-__isl_export
-int isl_map_is_strict_subset(__isl_keep isl_map *map1, __isl_keep isl_map *map2);
-__isl_export
-int isl_map_is_equal(__isl_keep isl_map *map1, __isl_keep isl_map *map2);
-__isl_export
-int isl_map_is_single_valued(__isl_keep isl_map *map);
-int isl_map_plain_is_injective(__isl_keep isl_map *map);
-__isl_export
-int isl_map_is_injective(__isl_keep isl_map *map);
-__isl_export
-int isl_map_is_bijective(__isl_keep isl_map *map);
-int isl_map_is_translation(__isl_keep isl_map *map);
-int isl_map_has_equal_space(__isl_keep isl_map *map1, __isl_keep isl_map *map2);
-
-int isl_basic_map_can_zip(__isl_keep isl_basic_map *bmap);
-int isl_map_can_zip(__isl_keep isl_map *map);
-__isl_give isl_basic_map *isl_basic_map_zip(__isl_take isl_basic_map *bmap);
-__isl_give isl_map *isl_map_zip(__isl_take isl_map *map);
-
-__isl_give isl_map *isl_map_make_disjoint(__isl_take isl_map *map);
-__isl_give isl_map *isl_basic_map_compute_divs(__isl_take isl_basic_map *bmap);
-__isl_give isl_map *isl_map_compute_divs(__isl_take isl_map *map);
-__isl_give isl_map *isl_map_align_divs(__isl_take isl_map *map);
-
-int isl_basic_map_involves_dims(__isl_keep isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned first, unsigned n);
-int isl_map_involves_dims(__isl_keep isl_map *map,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-void isl_map_print_internal(__isl_keep isl_map *map, FILE *out, int indent);
-
-int isl_map_plain_input_is_fixed(__isl_keep isl_map *map,
-		unsigned in, isl_int *val);
-int isl_map_plain_is_fixed(__isl_keep isl_map *map,
-	enum isl_dim_type type, unsigned pos, isl_int *val);
-int isl_map_fast_is_fixed(__isl_keep isl_map *map,
-	enum isl_dim_type type, unsigned pos, isl_int *val);
-
-__isl_export
-__isl_give isl_basic_map *isl_basic_map_gist(__isl_take isl_basic_map *bmap,
-	__isl_take isl_basic_map *context);
-__isl_export
-__isl_give isl_map *isl_map_gist(__isl_take isl_map *map,
-	__isl_take isl_map *context);
-__isl_export
-__isl_give isl_map *isl_map_gist_domain(__isl_take isl_map *map,
-	__isl_take isl_set *context);
-__isl_give isl_map *isl_map_gist_range(__isl_take isl_map *map,
-	__isl_take isl_set *context);
-__isl_give isl_map *isl_map_gist_params(__isl_take isl_map *map,
-	__isl_take isl_set *context);
-__isl_give isl_map *isl_map_gist_basic_map(__isl_take isl_map *map,
-	__isl_take isl_basic_map *context);
-
-__isl_export
-__isl_give isl_map *isl_map_coalesce(__isl_take isl_map *map);
-
-int isl_map_plain_is_equal(__isl_keep isl_map *map1, __isl_keep isl_map *map2);
-int isl_map_fast_is_equal(__isl_keep isl_map *map1, __isl_keep isl_map *map2);
-
-uint32_t isl_map_get_hash(__isl_keep isl_map *map);
-
-__isl_export
-int isl_map_foreach_basic_map(__isl_keep isl_map *map,
-	int (*fn)(__isl_take isl_basic_map *bmap, void *user), void *user);
-
-__isl_give isl_map *isl_set_lifting(__isl_take isl_set *set);
-
-__isl_give isl_map *isl_map_power(__isl_take isl_map *map, int *exact);
-__isl_give isl_map *isl_map_reaching_path_lengths(__isl_take isl_map *map,
-	int *exact);
-__isl_give isl_map *isl_map_transitive_closure(__isl_take isl_map *map,
-	int *exact);
-
-__isl_give isl_map *isl_map_lex_le_map(__isl_take isl_map *map1,
-	__isl_take isl_map *map2);
-__isl_give isl_map *isl_map_lex_lt_map(__isl_take isl_map *map1,
-	__isl_take isl_map *map2);
-__isl_give isl_map *isl_map_lex_ge_map(__isl_take isl_map *map1,
-	__isl_take isl_map *map2);
-__isl_give isl_map *isl_map_lex_gt_map(__isl_take isl_map *map1,
-	__isl_take isl_map *map2);
-
-__isl_give isl_map *isl_map_align_params(__isl_take isl_map *map,
-	__isl_take isl_space *model);
-
-__isl_give isl_mat *isl_basic_map_equalities_matrix(
-		__isl_keep isl_basic_map *bmap, enum isl_dim_type c1,
-		enum isl_dim_type c2, enum isl_dim_type c3,
-		enum isl_dim_type c4, enum isl_dim_type c5);
-__isl_give isl_mat *isl_basic_map_inequalities_matrix(
-		__isl_keep isl_basic_map *bmap, enum isl_dim_type c1,
-		enum isl_dim_type c2, enum isl_dim_type c3,
-		enum isl_dim_type c4, enum isl_dim_type c5);
-__isl_give isl_basic_map *isl_basic_map_from_constraint_matrices(
-	__isl_take isl_space *dim,
-	__isl_take isl_mat *eq, __isl_take isl_mat *ineq, enum isl_dim_type c1,
-	enum isl_dim_type c2, enum isl_dim_type c3,
-	enum isl_dim_type c4, enum isl_dim_type c5);
-
-__isl_give isl_basic_map *isl_basic_map_from_aff(__isl_take isl_aff *aff);
-__isl_give isl_basic_map *isl_basic_map_from_multi_aff(
-	__isl_take isl_multi_aff *maff);
-__isl_give isl_basic_map *isl_basic_map_from_aff_list(
-	__isl_take isl_space *domain_dim, __isl_take isl_aff_list *list);
-
-__isl_give isl_pw_aff *isl_map_dim_max(__isl_take isl_map *map, int pos);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#include <isl/dim.h>
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/map_type.h b/cloog-0.17.0/isl/include/isl/map_type.h
deleted file mode 100644
index a600233..0000000
--- a/cloog-0.17.0/isl/include/isl/map_type.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef ISL_MAP_TYPE_H
-#define ISL_MAP_TYPE_H
-
-#include <isl/ctx.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-__isl_subclass(isl_map)
-struct isl_basic_map;
-typedef struct isl_basic_map isl_basic_map;
-__isl_subclass(isl_union_map)
-struct isl_map;
-typedef struct isl_map isl_map;
-
-#ifndef isl_basic_set
-__isl_subclass(isl_set)
-struct isl_basic_set;
-typedef struct isl_basic_set isl_basic_set;
-#endif
-#ifndef isl_set
-__isl_subclass(isl_union_set)
-struct isl_set;
-typedef struct isl_set isl_set;
-#endif
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/mat.h b/cloog-0.17.0/isl/include/isl/mat.h
deleted file mode 100644
index e888888..0000000
--- a/cloog-0.17.0/isl/include/isl/mat.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_MAT_H
-#define ISL_MAT_H
-
-#include <stdio.h>
-
-#include <isl/int.h>
-#include <isl/ctx.h>
-#include <isl/blk.h>
-#include <isl/vec.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_mat;
-typedef struct isl_mat	isl_mat;
-
-isl_ctx *isl_mat_get_ctx(__isl_keep isl_mat *mat);
-
-__isl_give isl_mat *isl_mat_alloc(isl_ctx *ctx,
-	unsigned n_row, unsigned n_col);
-struct isl_mat *isl_mat_dup(struct isl_mat *mat);
-struct isl_mat *isl_mat_extend(struct isl_mat *mat,
-	unsigned n_row, unsigned n_col);
-struct isl_mat *isl_mat_identity(struct isl_ctx *ctx, unsigned n_row);
-__isl_give isl_mat *isl_mat_copy(__isl_keep isl_mat *mat);
-struct isl_mat *isl_mat_cow(struct isl_mat *mat);
-void isl_mat_free(__isl_take isl_mat *mat);
-
-int isl_mat_rows(__isl_keep isl_mat *mat);
-int isl_mat_cols(__isl_keep isl_mat *mat);
-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,
-	int row, int col, isl_int v);
-__isl_give isl_mat *isl_mat_set_element_si(__isl_take isl_mat *mat,
-	int row, int col, int v);
-
-struct isl_mat *isl_mat_swap_cols(struct isl_mat *mat, unsigned i, unsigned j);
-struct isl_mat *isl_mat_swap_rows(struct isl_mat *mat, unsigned i, unsigned j);
-
-struct isl_vec *isl_mat_vec_product(struct isl_mat *mat, struct isl_vec *vec);
-struct isl_vec *isl_vec_mat_product(struct isl_vec *vec, struct isl_mat *mat);
-__isl_give isl_vec *isl_mat_vec_inverse_product(__isl_take isl_mat *mat,
-						__isl_take isl_vec *vec);
-struct isl_mat *isl_mat_aff_direct_sum(struct isl_mat *left,
-					struct isl_mat *right);
-__isl_give isl_mat *isl_mat_diagonal(__isl_take isl_mat *mat1,
-	__isl_take isl_mat *mat2);
-struct isl_mat *isl_mat_left_hermite(struct isl_mat *M,
-	int neg, struct isl_mat **U, struct isl_mat **Q);
-struct isl_mat *isl_mat_lin_to_aff(struct isl_mat *mat);
-struct isl_mat *isl_mat_inverse_product(struct isl_mat *left,
-	struct isl_mat *right);
-struct isl_mat *isl_mat_product(struct isl_mat *left, struct isl_mat *right);
-struct isl_mat *isl_mat_transpose(struct isl_mat *mat);
-__isl_give isl_mat *isl_mat_right_inverse(__isl_take isl_mat *mat);
-__isl_give isl_mat *isl_mat_right_kernel(__isl_take isl_mat *mat);
-
-__isl_give isl_mat *isl_mat_normalize(__isl_take isl_mat *mat);
-__isl_give isl_mat *isl_mat_normalize_row(__isl_take isl_mat *mat, int row);
-
-struct isl_mat *isl_mat_drop_cols(struct isl_mat *mat,
-				unsigned col, unsigned n);
-struct isl_mat *isl_mat_drop_rows(struct isl_mat *mat,
-				unsigned row, unsigned n);
-__isl_give isl_mat *isl_mat_insert_cols(__isl_take isl_mat *mat,
-				unsigned col, unsigned n);
-__isl_give isl_mat *isl_mat_insert_rows(__isl_take isl_mat *mat,
-				unsigned row, unsigned n);
-__isl_give isl_mat *isl_mat_move_cols(__isl_take isl_mat *mat,
-	unsigned dst_col, unsigned src_col, unsigned n);
-__isl_give isl_mat *isl_mat_add_rows(__isl_take isl_mat *mat, unsigned n);
-__isl_give isl_mat *isl_mat_insert_zero_cols(__isl_take isl_mat *mat,
-	unsigned first, unsigned n);
-__isl_give isl_mat *isl_mat_add_zero_cols(__isl_take isl_mat *mat, unsigned n);
-__isl_give isl_mat *isl_mat_insert_zero_rows(__isl_take isl_mat *mat,
-	unsigned row, unsigned n);
-__isl_give isl_mat *isl_mat_add_zero_rows(__isl_take isl_mat *mat, unsigned n);
-
-void isl_mat_col_add(__isl_keep isl_mat *mat, int dst_col, int src_col);
-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);
-
-struct isl_mat *isl_mat_unimodular_complete(struct isl_mat *M, int row);
-
-__isl_give isl_mat *isl_mat_from_row_vec(__isl_take isl_vec *vec);
-__isl_give isl_mat *isl_mat_concat(__isl_take isl_mat *top,
-	__isl_take isl_mat *bot);
-__isl_give isl_mat *isl_mat_vec_concat(__isl_take isl_mat *top,
-	__isl_take isl_vec *bot);
-
-int isl_mat_is_equal(__isl_keep isl_mat *mat1, __isl_keep isl_mat *mat2);
-
-int isl_mat_initial_non_zero_cols(__isl_keep isl_mat *mat);
-
-void isl_mat_print_internal(__isl_keep isl_mat *mat, FILE *out, int indent);
-void isl_mat_dump(__isl_keep isl_mat *mat);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/multi.h b/cloog-0.17.0/isl/include/isl/multi.h
deleted file mode 100644
index b9bb116..0000000
--- a/cloog-0.17.0/isl/include/isl/multi.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef ISL_MULTI_H
-#define ISL_MULTI_H
-
-#include <isl/list.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-#define ISL_DECLARE_MULTI(BASE)						\
-__isl_give isl_multi_##BASE *isl_multi_##BASE##_from_##BASE##_list(	\
-	__isl_take isl_space *space, __isl_take isl_##BASE##_list *list); \
-const char *isl_multi_##BASE##_get_tuple_name(				\
-	__isl_keep isl_multi_##BASE *multi, enum isl_dim_type type);
-
-ISL_DECLARE_MULTI(aff)
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/obj.h b/cloog-0.17.0/isl/include/isl/obj.h
deleted file mode 100644
index d40a82c..0000000
--- a/cloog-0.17.0/isl/include/isl/obj.h
+++ /dev/null
@@ -1,64 +0,0 @@
-#ifndef ISL_OBJ_H
-#define ISL_OBJ_H
-
-#include <isl/set_type.h>
-#include <isl/map_type.h>
-#include <isl/union_set.h>
-#include <isl/union_map.h>
-#include <isl/polynomial_type.h>
-#include <isl/printer.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_obj_vtable {
-	void *(*copy)(void *v1);
-	void *(*add)(void *v1, void *v2);
-	__isl_give isl_printer *(*print)(__isl_take isl_printer *p, void *v);
-	void (*free)(void *v);
-};
-typedef struct isl_obj_vtable *isl_obj_type;
-extern struct isl_obj_vtable isl_obj_none_vtable;
-#define isl_obj_none		(&isl_obj_none_vtable)
-extern struct isl_obj_vtable isl_obj_int_vtable;
-#define isl_obj_int		(&isl_obj_int_vtable)
-extern struct isl_obj_vtable isl_obj_set_vtable;
-#define isl_obj_set		(&isl_obj_set_vtable)
-extern struct isl_obj_vtable isl_obj_union_set_vtable;
-#define isl_obj_union_set	(&isl_obj_union_set_vtable)
-extern struct isl_obj_vtable isl_obj_map_vtable;
-#define isl_obj_map		(&isl_obj_map_vtable)
-extern struct isl_obj_vtable isl_obj_union_map_vtable;
-#define isl_obj_union_map	(&isl_obj_union_map_vtable)
-extern struct isl_obj_vtable isl_obj_pw_qpolynomial_vtable;
-#define isl_obj_pw_qpolynomial	(&isl_obj_pw_qpolynomial_vtable)
-extern struct isl_obj_vtable isl_obj_union_pw_qpolynomial_vtable;
-#define isl_obj_union_pw_qpolynomial	(&isl_obj_union_pw_qpolynomial_vtable)
-extern struct isl_obj_vtable isl_obj_pw_qpolynomial_fold_vtable;
-#define isl_obj_pw_qpolynomial_fold	(&isl_obj_pw_qpolynomial_fold_vtable)
-extern struct isl_obj_vtable isl_obj_union_pw_qpolynomial_fold_vtable;
-#define isl_obj_union_pw_qpolynomial_fold	(&isl_obj_union_pw_qpolynomial_fold_vtable)
-struct isl_obj {
-	isl_obj_type	type;
-	void		*v;
-};
-
-struct isl_int_obj;
-typedef struct isl_int_obj isl_int_obj;
-
-__isl_give isl_int_obj *isl_int_obj_alloc(isl_ctx *ctx, isl_int v);
-void isl_int_obj_free(__isl_take isl_int_obj *i);
-__isl_give isl_int_obj *isl_int_obj_add(__isl_take isl_int_obj *i1,
-	__isl_take isl_int_obj *i2);
-__isl_give isl_int_obj *isl_int_obj_sub(__isl_take isl_int_obj *i1,
-	__isl_take isl_int_obj *i2);
-__isl_give isl_int_obj *isl_int_obj_mul(__isl_take isl_int_obj *i1,
-	__isl_take isl_int_obj *i2);
-void isl_int_obj_get_int(__isl_keep isl_int_obj *i, isl_int *v);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/options.h b/cloog-0.17.0/isl/include/isl/options.h
deleted file mode 100644
index 1c14b19..0000000
--- a/cloog-0.17.0/isl/include/isl/options.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_OPTIONS_H
-#define ISL_OPTIONS_H
-
-#include <isl/arg.h>
-#include <isl/ctx.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_options;
-
-ISL_ARG_DECL(isl_options, struct isl_options, isl_options_args)
-
-#define			ISL_BOUND_BERNSTEIN	0
-#define			ISL_BOUND_RANGE		1
-int isl_options_set_bound(isl_ctx *ctx, int val);
-int isl_options_get_bound(isl_ctx *ctx);
-
-#define			ISL_ON_ERROR_WARN	0
-#define			ISL_ON_ERROR_CONTINUE	1
-#define			ISL_ON_ERROR_ABORT	2
-int isl_options_set_on_error(isl_ctx *ctx, int val);
-int isl_options_get_on_error(isl_ctx *ctx);
-
-int isl_options_set_gbr_only_first(isl_ctx *ctx, int val);
-int isl_options_get_gbr_only_first(isl_ctx *ctx);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/point.h b/cloog-0.17.0/isl/include/isl/point.h
deleted file mode 100644
index 5d845e9..0000000
--- a/cloog-0.17.0/isl/include/isl/point.h
+++ /dev/null
@@ -1,43 +0,0 @@
-#ifndef ISL_POINT_H
-#define ISL_POINT_H
-
-#include <stdio.h>
-#include <isl/space.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_point;
-typedef struct isl_point isl_point;
-
-isl_ctx *isl_point_get_ctx(__isl_keep isl_point *pnt);
-__isl_give isl_space *isl_point_get_space(__isl_keep isl_point *pnt);
-
-__isl_give isl_point *isl_point_zero(__isl_take isl_space *dim);
-__isl_give isl_point *isl_point_copy(__isl_keep isl_point *pnt);
-void isl_point_free(__isl_take isl_point *pnt);
-
-int isl_point_get_coordinate(__isl_keep isl_point *pnt,
-	enum isl_dim_type type, int pos, isl_int *v);
-__isl_give isl_point *isl_point_set_coordinate(__isl_take isl_point *pnt,
-	enum isl_dim_type type, int pos, isl_int v);
-
-__isl_give isl_point *isl_point_add_ui(__isl_take isl_point *pnt,
-	enum isl_dim_type type, int pos, unsigned val);
-__isl_give isl_point *isl_point_sub_ui(__isl_take isl_point *pnt,
-	enum isl_dim_type type, int pos, unsigned val);
-
-__isl_give isl_point *isl_point_void(__isl_take isl_space *dim);
-int isl_point_is_void(__isl_keep isl_point *pnt);
-
-__isl_give isl_printer *isl_printer_print_point(
-	__isl_take isl_printer *printer, __isl_keep isl_point *pnt);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#include <isl/dim.h>
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/polynomial.h b/cloog-0.17.0/isl/include/isl/polynomial.h
deleted file mode 100644
index de4d4a7..0000000
--- a/cloog-0.17.0/isl/include/isl/polynomial.h
+++ /dev/null
@@ -1,593 +0,0 @@
-#ifndef ISL_POLYNOMIAL_H
-#define ISL_POLYNOMIAL_H
-
-#include <isl/ctx.h>
-#include <isl/constraint.h>
-#include <isl/space.h>
-#include <isl/set_type.h>
-#include <isl/point.h>
-#include <isl/printer.h>
-#include <isl/union_set.h>
-#include <isl/aff_type.h>
-#include <isl/polynomial_type.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-isl_ctx *isl_qpolynomial_get_ctx(__isl_keep isl_qpolynomial *qp);
-__isl_give isl_space *isl_qpolynomial_get_domain_space(
-	__isl_keep isl_qpolynomial *qp);
-__isl_give isl_space *isl_qpolynomial_get_space(__isl_keep isl_qpolynomial *qp);
-unsigned isl_qpolynomial_dim(__isl_keep isl_qpolynomial *qp,
-	enum isl_dim_type type);
-int isl_qpolynomial_involves_dims(__isl_keep isl_qpolynomial *qp,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_set_dim_name(
-	__isl_take isl_qpolynomial *qp,
-	enum isl_dim_type type, unsigned pos, const char *s);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_zero_on_domain(__isl_take isl_space *dim);
-__isl_give isl_qpolynomial *isl_qpolynomial_one_on_domain(__isl_take isl_space *dim);
-__isl_give isl_qpolynomial *isl_qpolynomial_infty_on_domain(__isl_take isl_space *dim);
-__isl_give isl_qpolynomial *isl_qpolynomial_neginfty_on_domain(__isl_take isl_space *dim);
-__isl_give isl_qpolynomial *isl_qpolynomial_nan_on_domain(__isl_take isl_space *dim);
-__isl_give isl_qpolynomial *isl_qpolynomial_rat_cst_on_domain(__isl_take isl_space *dim,
-	const isl_int n, const isl_int d);
-__isl_give isl_qpolynomial *isl_qpolynomial_var_on_domain(__isl_take isl_space *dim,
-	enum isl_dim_type type, unsigned pos);
-__isl_give isl_qpolynomial *isl_qpolynomial_copy(__isl_keep isl_qpolynomial *qp);
-void *isl_qpolynomial_free(__isl_take isl_qpolynomial *qp);
-
-int isl_qpolynomial_plain_is_equal(__isl_keep isl_qpolynomial *qp1,
-	__isl_keep isl_qpolynomial *qp2);
-int isl_qpolynomial_is_zero(__isl_keep isl_qpolynomial *qp);
-int isl_qpolynomial_is_nan(__isl_keep isl_qpolynomial *qp);
-int isl_qpolynomial_is_infty(__isl_keep isl_qpolynomial *qp);
-int isl_qpolynomial_is_neginfty(__isl_keep isl_qpolynomial *qp);
-int isl_qpolynomial_sgn(__isl_keep isl_qpolynomial *qp);
-int isl_qpolynomial_is_cst(__isl_keep isl_qpolynomial *qp,
-	isl_int *n, isl_int *d);
-void isl_qpolynomial_get_den(__isl_keep isl_qpolynomial *qp, isl_int *d);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_neg(__isl_take isl_qpolynomial *qp);
-__isl_give isl_qpolynomial *isl_qpolynomial_add(__isl_take isl_qpolynomial *qp1,
-	__isl_take isl_qpolynomial *qp2);
-__isl_give isl_qpolynomial *isl_qpolynomial_sub(__isl_take isl_qpolynomial *qp1,
-	__isl_take isl_qpolynomial *qp2);
-__isl_give isl_qpolynomial *isl_qpolynomial_mul(__isl_take isl_qpolynomial *qp1,
-	__isl_take isl_qpolynomial *qp2);
-__isl_give isl_qpolynomial *isl_qpolynomial_pow(__isl_take isl_qpolynomial *qp,
-	unsigned power);
-__isl_give isl_qpolynomial *isl_qpolynomial_add_isl_int(
-	__isl_take isl_qpolynomial *qp, isl_int v);
-__isl_give isl_qpolynomial *isl_qpolynomial_mul_isl_int(
-	__isl_take isl_qpolynomial *qp, isl_int v);
-__isl_give isl_qpolynomial *isl_qpolynomial_scale(
-	__isl_take isl_qpolynomial *qp, isl_int v);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_insert_dims(
-	__isl_take isl_qpolynomial *qp, enum isl_dim_type type,
-	unsigned first, unsigned n);
-__isl_give isl_qpolynomial *isl_qpolynomial_add_dims(
-	__isl_take isl_qpolynomial *qp, enum isl_dim_type type, unsigned n);
-__isl_give isl_qpolynomial *isl_qpolynomial_move_dims(
-	__isl_take isl_qpolynomial *qp,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n);
-__isl_give isl_qpolynomial *isl_qpolynomial_project_domain_on_params(
-	__isl_take isl_qpolynomial *qp);
-__isl_give isl_qpolynomial *isl_qpolynomial_drop_dims(
-	__isl_take isl_qpolynomial *qp,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_substitute(
-	__isl_take isl_qpolynomial *qp,
-	enum isl_dim_type type, unsigned first, unsigned n,
-	__isl_keep isl_qpolynomial **subs);
-
-int isl_qpolynomial_as_polynomial_on_domain(__isl_keep isl_qpolynomial *qp,
-	__isl_keep isl_basic_set *bset,
-	int (*fn)(__isl_take isl_basic_set *bset,
-		  __isl_take isl_qpolynomial *poly, void *user), void *user);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_homogenize(
-	__isl_take isl_qpolynomial *poly);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_align_params(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_space *model);
-
-isl_ctx *isl_term_get_ctx(__isl_keep isl_term *term);
-
-__isl_give isl_term *isl_term_copy(__isl_keep isl_term *term);
-void isl_term_free(__isl_take isl_term *term);
-
-unsigned isl_term_dim(__isl_keep isl_term *term, enum isl_dim_type type);
-void isl_term_get_num(__isl_keep isl_term *term, isl_int *n);
-void isl_term_get_den(__isl_keep isl_term *term, isl_int *d);
-int isl_term_get_exp(__isl_keep isl_term *term,
-	enum isl_dim_type type, unsigned pos);
-__isl_give isl_aff *isl_term_get_div(__isl_keep isl_term *term, unsigned pos);
-
-int isl_qpolynomial_foreach_term(__isl_keep isl_qpolynomial *qp,
-	int (*fn)(__isl_take isl_term *term, void *user), void *user);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_eval(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_point *pnt);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_gist_params(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_set *context);
-__isl_give isl_qpolynomial *isl_qpolynomial_gist(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_set *context);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_from_constraint(
-	__isl_take isl_constraint *c, enum isl_dim_type type, unsigned pos);
-__isl_give isl_qpolynomial *isl_qpolynomial_from_term(__isl_take isl_term *term);
-__isl_give isl_qpolynomial *isl_qpolynomial_from_aff(__isl_take isl_aff *aff);
-__isl_give isl_basic_map *isl_basic_map_from_qpolynomial(
-	__isl_take isl_qpolynomial *qp);
-
-__isl_give isl_printer *isl_printer_print_qpolynomial(
-	__isl_take isl_printer *p, __isl_keep isl_qpolynomial *qp);
-void isl_qpolynomial_print(__isl_keep isl_qpolynomial *qp, FILE *out,
-	unsigned output_format);
-void isl_qpolynomial_dump(__isl_keep isl_qpolynomial *qp);
-
-isl_ctx *isl_pw_qpolynomial_get_ctx(__isl_keep isl_pw_qpolynomial *pwqp);
-
-int isl_pw_qpolynomial_plain_is_equal(__isl_keep isl_pw_qpolynomial *pwqp1,
-	__isl_keep isl_pw_qpolynomial *pwqp2);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_zero(__isl_take isl_space *dim);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_alloc(__isl_take isl_set *set,
-	__isl_take isl_qpolynomial *qp);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_from_qpolynomial(
-	__isl_take isl_qpolynomial *qp);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_copy(
-	__isl_keep isl_pw_qpolynomial *pwqp);
-void *isl_pw_qpolynomial_free(__isl_take isl_pw_qpolynomial *pwqp);
-
-int isl_pw_qpolynomial_is_zero(__isl_keep isl_pw_qpolynomial *pwqp);
-
-__isl_give isl_space *isl_pw_qpolynomial_get_domain_space(
-	__isl_keep isl_pw_qpolynomial *pwqp);
-__isl_give isl_space *isl_pw_qpolynomial_get_space(
-	__isl_keep isl_pw_qpolynomial *pwqp);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_reset_domain_space(
-	__isl_take isl_pw_qpolynomial *pwqp, __isl_take isl_space *dim);
-unsigned isl_pw_qpolynomial_dim(__isl_keep isl_pw_qpolynomial *pwqp,
-	enum isl_dim_type type);
-int isl_pw_qpolynomial_involves_dims(__isl_keep isl_pw_qpolynomial *pwqp,
-	enum isl_dim_type type, unsigned first, unsigned n);
-int isl_pw_qpolynomial_has_equal_space(__isl_keep isl_pw_qpolynomial *pwqp1,
-	__isl_keep isl_pw_qpolynomial *pwqp2);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_set_dim_name(
-	__isl_take isl_pw_qpolynomial *pwqp,
-	enum isl_dim_type type, unsigned pos, const char *s);
-
-__isl_give isl_set *isl_pw_qpolynomial_domain(__isl_take isl_pw_qpolynomial *pwqp);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_intersect_domain(
-	__isl_take isl_pw_qpolynomial *pwpq, __isl_take isl_set *set);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_intersect_params(
-	__isl_take isl_pw_qpolynomial *pwpq, __isl_take isl_set *set);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_project_domain_on_params(
-	__isl_take isl_pw_qpolynomial *pwqp);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_drop_dims(
-	__isl_take isl_pw_qpolynomial *pwqp,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_split_dims(
-	__isl_take isl_pw_qpolynomial *pwqp,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add(
-	__isl_take isl_pw_qpolynomial *pwqp1,
-	__isl_take isl_pw_qpolynomial *pwqp2);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_sub(
-	__isl_take isl_pw_qpolynomial *pwqp1,
-	__isl_take isl_pw_qpolynomial *pwqp2);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add_disjoint(
-	__isl_take isl_pw_qpolynomial *pwqp1,
-	__isl_take isl_pw_qpolynomial *pwqp2);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_neg(
-	__isl_take isl_pw_qpolynomial *pwqp);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_mul(
-	__isl_take isl_pw_qpolynomial *pwqp1,
-	__isl_take isl_pw_qpolynomial *pwqp2);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_mul_isl_int(
-	__isl_take isl_pw_qpolynomial *pwqp, isl_int v);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_pow(
-	__isl_take isl_pw_qpolynomial *pwqp, unsigned exponent);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_insert_dims(
-	__isl_take isl_pw_qpolynomial *pwqp, enum isl_dim_type type,
-	unsigned first, unsigned n);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add_dims(
-	__isl_take isl_pw_qpolynomial *pwqp,
-	enum isl_dim_type type, unsigned n);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_move_dims(
-	__isl_take isl_pw_qpolynomial *pwqp,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_fix_dim(
-	__isl_take isl_pw_qpolynomial *pwqp,
-	enum isl_dim_type type, unsigned n, isl_int v);
-
-__isl_give isl_qpolynomial *isl_pw_qpolynomial_eval(
-	__isl_take isl_pw_qpolynomial *pwqp, __isl_take isl_point *pnt);
-
-__isl_give isl_qpolynomial *isl_pw_qpolynomial_max(
-	__isl_take isl_pw_qpolynomial *pwqp);
-__isl_give isl_qpolynomial *isl_pw_qpolynomial_min(
-	__isl_take isl_pw_qpolynomial *pwqp);
-
-int isl_pw_qpolynomial_foreach_piece(__isl_keep isl_pw_qpolynomial *pwqp,
-	int (*fn)(__isl_take isl_set *set, __isl_take isl_qpolynomial *qp,
-		    void *user), void *user);
-int isl_pw_qpolynomial_foreach_lifted_piece(__isl_keep isl_pw_qpolynomial *pwqp,
-	int (*fn)(__isl_take isl_set *set, __isl_take isl_qpolynomial *qp,
-		    void *user), void *user);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_from_pw_aff(
-	__isl_take isl_pw_aff *pwaff);
-
-__isl_constructor
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_read_from_str(isl_ctx *ctx,
-		const char *str);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_read_from_file(isl_ctx *ctx,
-		FILE *input);
-__isl_give isl_printer *isl_printer_print_pw_qpolynomial(
-	__isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial *pwqp);
-void isl_pw_qpolynomial_print(__isl_keep isl_pw_qpolynomial *pwqp, FILE *out,
-	unsigned output_format);
-void isl_pw_qpolynomial_dump(__isl_keep isl_pw_qpolynomial *pwqp);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_coalesce(
-	__isl_take isl_pw_qpolynomial *pwqp);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_gist(
-	__isl_take isl_pw_qpolynomial *pwqp, __isl_take isl_set *context);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_gist_params(
-	__isl_take isl_pw_qpolynomial *pwqp, __isl_take isl_set *context);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_split_periods(
-	__isl_take isl_pw_qpolynomial *pwqp, int max_periods);
-
-__isl_give isl_pw_qpolynomial *isl_basic_set_multiplicative_call(
-	__isl_take isl_basic_set *bset,
-	__isl_give isl_pw_qpolynomial *(*fn)(__isl_take isl_basic_set *bset));
-
-isl_ctx *isl_qpolynomial_fold_get_ctx(__isl_keep isl_qpolynomial_fold *fold);
-enum isl_fold isl_qpolynomial_fold_get_type(__isl_keep isl_qpolynomial_fold *fold);
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_empty(enum isl_fold type,
-	__isl_take isl_space *dim);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_alloc(
-	enum isl_fold type, __isl_take isl_qpolynomial *qp);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_copy(
-	__isl_keep isl_qpolynomial_fold *fold);
-void isl_qpolynomial_fold_free(__isl_take isl_qpolynomial_fold *fold);
-
-int isl_qpolynomial_fold_is_empty(__isl_keep isl_qpolynomial_fold *fold);
-int isl_qpolynomial_fold_plain_is_equal(__isl_keep isl_qpolynomial_fold *fold1,
-	__isl_keep isl_qpolynomial_fold *fold2);
-
-__isl_give isl_space *isl_qpolynomial_fold_get_space(
-	__isl_keep isl_qpolynomial_fold *fold);
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_fold(
-	__isl_take isl_qpolynomial_fold *fold1,
-	__isl_take isl_qpolynomial_fold *fold2);
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_mul_isl_int(
-	__isl_take isl_qpolynomial_fold *fold, isl_int v);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale(
-	__isl_take isl_qpolynomial_fold *fold, isl_int v);
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_move_dims(
-	__isl_take isl_qpolynomial_fold *fold,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n);
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_substitute(
-	__isl_take isl_qpolynomial_fold *fold,
-	enum isl_dim_type type, unsigned first, unsigned n,
-	__isl_keep isl_qpolynomial **subs);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_fold_eval(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_point *pnt);
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_gist_params(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_set *context);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_gist(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_set *context);
-
-int isl_qpolynomial_fold_foreach_qpolynomial(
-	__isl_keep isl_qpolynomial_fold *fold,
-	int (*fn)(__isl_take isl_qpolynomial *qp, void *user), void *user);
-
-__isl_give isl_printer *isl_printer_print_qpolynomial_fold(
-	__isl_take isl_printer *p, __isl_keep isl_qpolynomial_fold *fold);
-void isl_qpolynomial_fold_print(__isl_keep isl_qpolynomial_fold *fold, FILE *out,
-	unsigned output_format);
-void isl_qpolynomial_fold_dump(__isl_keep isl_qpolynomial_fold *fold);
-
-isl_ctx *isl_pw_qpolynomial_fold_get_ctx(__isl_keep isl_pw_qpolynomial_fold *pwf);
-
-int isl_pw_qpolynomial_fold_plain_is_equal(
-	__isl_keep isl_pw_qpolynomial_fold *pwf1,
-	__isl_keep isl_pw_qpolynomial_fold *pwf2);
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_from_pw_qpolynomial(
-	enum isl_fold type, __isl_take isl_pw_qpolynomial *pwqp);
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_alloc(
-	enum isl_fold type,
-	__isl_take isl_set *set, __isl_take isl_qpolynomial_fold *fold);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_copy(
-	__isl_keep isl_pw_qpolynomial_fold *pwf);
-void *isl_pw_qpolynomial_fold_free(__isl_take isl_pw_qpolynomial_fold *pwf);
-
-int isl_pw_qpolynomial_fold_is_zero(__isl_keep isl_pw_qpolynomial_fold *pwf);
-
-__isl_give isl_space *isl_pw_qpolynomial_fold_get_domain_space(
-	__isl_keep isl_pw_qpolynomial_fold *pwf);
-__isl_give isl_space *isl_pw_qpolynomial_fold_get_space(
-	__isl_keep isl_pw_qpolynomial_fold *pwf);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_reset_space(
-	__isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_space *dim);
-unsigned isl_pw_qpolynomial_fold_dim(__isl_keep isl_pw_qpolynomial_fold *pwf,
-	enum isl_dim_type type);
-int isl_pw_qpolynomial_fold_has_equal_space(
-	__isl_keep isl_pw_qpolynomial_fold *pwf1,
-	__isl_keep isl_pw_qpolynomial_fold *pwf2);
-
-size_t isl_pw_qpolynomial_fold_size(__isl_keep isl_pw_qpolynomial_fold *pwf);
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_zero(
-	__isl_take isl_space *dim, enum isl_fold type);
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_set_dim_name(
-	__isl_take isl_pw_qpolynomial_fold *pwf,
-	enum isl_dim_type type, unsigned pos, const char *s);
-
-__isl_give isl_set *isl_pw_qpolynomial_fold_domain(
-	__isl_take isl_pw_qpolynomial_fold *pwf);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_intersect_domain(
-	__isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_set *set);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_intersect_params(
-	__isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_set *set);
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_add(
-	__isl_take isl_pw_qpolynomial_fold *pwf1,
-	__isl_take isl_pw_qpolynomial_fold *pwf2);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_fold(
-	__isl_take isl_pw_qpolynomial_fold *pwf1,
-	__isl_take isl_pw_qpolynomial_fold *pwf2);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_add_disjoint(
-	__isl_take isl_pw_qpolynomial_fold *pwf1,
-	__isl_take isl_pw_qpolynomial_fold *pwf2);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_mul_isl_int(
-	__isl_take isl_pw_qpolynomial_fold *pwf, isl_int v);
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_project_domain_on_params(
-	__isl_take isl_pw_qpolynomial_fold *pwf);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_drop_dims(
-	__isl_take isl_pw_qpolynomial_fold *pwf,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_move_dims(
-	__isl_take isl_pw_qpolynomial_fold *pwf,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n);
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_fix_dim(
-	__isl_take isl_pw_qpolynomial_fold *pwf,
-	enum isl_dim_type type, unsigned n, isl_int v);
-
-__isl_give isl_qpolynomial *isl_pw_qpolynomial_fold_eval(
-	__isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_point *pnt);
-
-int isl_pw_qpolynomial_fold_foreach_piece(
-	__isl_keep isl_pw_qpolynomial_fold *pwf,
-	int (*fn)(__isl_take isl_set *set, __isl_take isl_qpolynomial_fold *fold,
-		    void *user), void *user);
-int isl_pw_qpolynomial_fold_foreach_lifted_piece(
-	__isl_keep isl_pw_qpolynomial_fold *pwf,
-	int (*fn)(__isl_take isl_set *set, __isl_take isl_qpolynomial_fold *fold,
-		    void *user), void *user);
-
-__isl_give isl_printer *isl_printer_print_pw_qpolynomial_fold(
-	__isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial_fold *pwf);
-void isl_pw_qpolynomial_fold_print(__isl_keep isl_pw_qpolynomial_fold *pwf,
-	FILE *out, unsigned output_format);
-void isl_pw_qpolynomial_fold_dump(__isl_keep isl_pw_qpolynomial_fold *pwf);
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_coalesce(
-	__isl_take isl_pw_qpolynomial_fold *pwf);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_gist(
-	__isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_set *context);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_gist_params(
-	__isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_set *context);
-
-__isl_give isl_qpolynomial *isl_pw_qpolynomial_fold_max(
-	__isl_take isl_pw_qpolynomial_fold *pwf);
-__isl_give isl_qpolynomial *isl_pw_qpolynomial_fold_min(
-	__isl_take isl_pw_qpolynomial_fold *pwf);
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_bound(
-	__isl_take isl_pw_qpolynomial *pwqp, enum isl_fold type, int *tight);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_bound(
-	__isl_take isl_pw_qpolynomial_fold *pwf, int *tight);
-__isl_give isl_pw_qpolynomial_fold *isl_set_apply_pw_qpolynomial_fold(
-	__isl_take isl_set *set, __isl_take isl_pw_qpolynomial_fold *pwf,
-	int *tight);
-__isl_give isl_pw_qpolynomial_fold *isl_map_apply_pw_qpolynomial_fold(
-	__isl_take isl_map *map, __isl_take isl_pw_qpolynomial_fold *pwf,
-	int *tight);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_to_polynomial(
-	__isl_take isl_pw_qpolynomial *pwqp, int sign);
-
-isl_ctx *isl_union_pw_qpolynomial_get_ctx(
-	__isl_keep isl_union_pw_qpolynomial *upwqp);
-
-int isl_union_pw_qpolynomial_plain_is_equal(
-	__isl_keep isl_union_pw_qpolynomial *upwqp1,
-	__isl_keep isl_union_pw_qpolynomial *upwqp2);
-
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_from_pw_qpolynomial(__isl_take isl_pw_qpolynomial *pwqp);
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_zero(
-	__isl_take isl_space *dim);
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_add_pw_qpolynomial(
-	__isl_take isl_union_pw_qpolynomial *upwqp,
-	__isl_take isl_pw_qpolynomial *pwqp);
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_copy(
-	__isl_keep isl_union_pw_qpolynomial *upwqp);
-void isl_union_pw_qpolynomial_free(__isl_take isl_union_pw_qpolynomial *upwqp);
-
-__isl_constructor
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_read_from_str(
-	isl_ctx *ctx, const char *str);
-
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_add(
-	__isl_take isl_union_pw_qpolynomial *upwqp1,
-	__isl_take isl_union_pw_qpolynomial *upwqp2);
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_sub(
-	__isl_take isl_union_pw_qpolynomial *upwqp1,
-	__isl_take isl_union_pw_qpolynomial *upwqp2);
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_mul(
-	__isl_take isl_union_pw_qpolynomial *upwqp1,
-	__isl_take isl_union_pw_qpolynomial *upwqp2);
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_mul_isl_int(
-	__isl_take isl_union_pw_qpolynomial *upwqp, isl_int v);
-
-__isl_give isl_union_set *isl_union_pw_qpolynomial_domain(
-	__isl_take isl_union_pw_qpolynomial *upwqp);
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_intersect_domain(
-	__isl_take isl_union_pw_qpolynomial *upwpq,
-	__isl_take isl_union_set *uset);
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_intersect_params(
-	__isl_take isl_union_pw_qpolynomial *upwpq,
-	__isl_take isl_set *set);
-
-__isl_give isl_space *isl_union_pw_qpolynomial_get_space(
-	__isl_keep isl_union_pw_qpolynomial *upwqp);
-
-__isl_give isl_qpolynomial *isl_union_pw_qpolynomial_eval(
-	__isl_take isl_union_pw_qpolynomial *upwqp, __isl_take isl_point *pnt);
-
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_coalesce(
-	__isl_take isl_union_pw_qpolynomial *upwqp);
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_gist(
-	__isl_take isl_union_pw_qpolynomial *upwqp,
-	__isl_take isl_union_set *context);
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_gist_params(
-	__isl_take isl_union_pw_qpolynomial *upwqp,
-	__isl_take isl_set *context);
-
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_align_params(
-	__isl_take isl_union_pw_qpolynomial *upwqp,
-	__isl_take isl_space *model);
-
-int isl_union_pw_qpolynomial_foreach_pw_qpolynomial(
-	__isl_keep isl_union_pw_qpolynomial *upwqp,
-	int (*fn)(__isl_take isl_pw_qpolynomial *pwqp, void *user), void *user);
-__isl_give isl_pw_qpolynomial *isl_union_pw_qpolynomial_extract_pw_qpolynomial(
-	__isl_keep isl_union_pw_qpolynomial *upwqp, __isl_take isl_space *dim);
-
-__isl_give isl_printer *isl_printer_print_union_pw_qpolynomial(
-	__isl_take isl_printer *p, __isl_keep isl_union_pw_qpolynomial *upwqp);
-
-isl_ctx *isl_union_pw_qpolynomial_fold_get_ctx(
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf);
-
-int isl_union_pw_qpolynomial_fold_plain_is_equal(
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf1,
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf2);
-
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_from_pw_qpolynomial_fold(__isl_take isl_pw_qpolynomial_fold *pwf);
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_zero(
-	__isl_take isl_space *dim, enum isl_fold type);
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_fold_pw_qpolynomial_fold(
-	__isl_take isl_union_pw_qpolynomial_fold *upwqp,
-	__isl_take isl_pw_qpolynomial_fold *pwqp);
-void isl_union_pw_qpolynomial_fold_free(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf);
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_copy(
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf);
-
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_fold(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf1,
-	__isl_take isl_union_pw_qpolynomial_fold *upwf2);
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_add_union_pw_qpolynomial(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf,
-	__isl_take isl_union_pw_qpolynomial *upwqp);
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_mul_isl_int(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf, isl_int v);
-
-__isl_give isl_union_set *isl_union_pw_qpolynomial_fold_domain(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf);
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_intersect_domain(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf,
-	__isl_take isl_union_set *uset);
-__isl_give isl_union_pw_qpolynomial_fold *
-isl_union_pw_qpolynomial_fold_intersect_params(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf,
-	__isl_take isl_set *set);
-
-enum isl_fold isl_union_pw_qpolynomial_fold_get_type(
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf);
-__isl_give isl_space *isl_union_pw_qpolynomial_fold_get_space(
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf);
-
-__isl_give isl_qpolynomial *isl_union_pw_qpolynomial_fold_eval(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf,
-	__isl_take isl_point *pnt);
-
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_coalesce(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf);
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_gist(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf,
-	__isl_take isl_union_set *context);
-__isl_give isl_union_pw_qpolynomial_fold *
-isl_union_pw_qpolynomial_fold_gist_params(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf,
-	__isl_take isl_set *context);
-
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_align_params(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf,
-	__isl_take isl_space *model);
-
-int isl_union_pw_qpolynomial_fold_foreach_pw_qpolynomial_fold(
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf,
-	int (*fn)(__isl_take isl_pw_qpolynomial_fold *pwf,
-		    void *user), void *user);
-__isl_give isl_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_extract_pw_qpolynomial_fold(
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf, __isl_take isl_space *dim);
-
-__isl_give isl_printer *isl_printer_print_union_pw_qpolynomial_fold(
-	__isl_take isl_printer *p,
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf);
-
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_bound(
-	__isl_take isl_union_pw_qpolynomial *upwqp,
-	enum isl_fold type, int *tight);
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_set_apply_union_pw_qpolynomial_fold(
-	__isl_take isl_union_set *uset,
-	__isl_take isl_union_pw_qpolynomial_fold *upwf, int *tight);
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_map_apply_union_pw_qpolynomial_fold(
-	__isl_take isl_union_map *umap,
-	__isl_take isl_union_pw_qpolynomial_fold *upwf, int *tight);
-
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_to_polynomial(
-	__isl_take isl_union_pw_qpolynomial *upwqp, int sign);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#include <isl/dim.h>
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/polynomial_type.h b/cloog-0.17.0/isl/include/isl/polynomial_type.h
deleted file mode 100644
index bb022bf..0000000
--- a/cloog-0.17.0/isl/include/isl/polynomial_type.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef ISL_POLYNOMIAL_TYPE_H
-#define ISL_POLYNOMIAL_TYPE_H
-
-struct isl_qpolynomial;
-typedef struct isl_qpolynomial isl_qpolynomial;
-
-struct isl_term;
-typedef struct isl_term isl_term;
-
-__isl_export
-struct isl_pw_qpolynomial;
-typedef struct isl_pw_qpolynomial isl_pw_qpolynomial;
-
-enum isl_fold {
-	isl_fold_min,
-	isl_fold_max,
-	isl_fold_list
-};
-
-struct isl_qpolynomial_fold;
-typedef struct isl_qpolynomial_fold isl_qpolynomial_fold;
-
-struct isl_pw_qpolynomial_fold;
-typedef struct isl_pw_qpolynomial_fold isl_pw_qpolynomial_fold;
-
-__isl_export
-struct isl_union_pw_qpolynomial;
-typedef struct isl_union_pw_qpolynomial isl_union_pw_qpolynomial;
-
-struct isl_union_pw_qpolynomial_fold;
-typedef struct isl_union_pw_qpolynomial_fold isl_union_pw_qpolynomial_fold;
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/printer.h b/cloog-0.17.0/isl/include/isl/printer.h
deleted file mode 100644
index da2f043..0000000
--- a/cloog-0.17.0/isl/include/isl/printer.h
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef ISL_PRINTER_H
-#define ISL_PRINTER_H
-
-#include <stdio.h>
-#include <isl/ctx.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_printer;
-typedef struct isl_printer isl_printer;
-
-__isl_give isl_printer *isl_printer_to_file(isl_ctx *ctx, FILE *file);
-__isl_give isl_printer *isl_printer_to_str(isl_ctx *ctx);
-void isl_printer_free(__isl_take isl_printer *printer);
-
-isl_ctx *isl_printer_get_ctx(__isl_keep isl_printer *printer);
-
-__isl_give char *isl_printer_get_str(__isl_keep isl_printer *printer);
-
-__isl_give isl_printer *isl_printer_set_indent(__isl_take isl_printer *p,
-	int indent);
-__isl_give isl_printer *isl_printer_indent(__isl_take isl_printer *p,
-	int indent);
-
-#define ISL_FORMAT_ISL			0
-#define ISL_FORMAT_POLYLIB		1
-#define ISL_FORMAT_POLYLIB_CONSTRAINTS	2
-#define ISL_FORMAT_OMEGA		3
-#define ISL_FORMAT_C			4
-#define ISL_FORMAT_LATEX		5
-#define ISL_FORMAT_EXT_POLYLIB		6
-__isl_give isl_printer *isl_printer_set_output_format(__isl_take isl_printer *p,
-	int output_format);
-
-__isl_give isl_printer *isl_printer_set_prefix(__isl_take isl_printer *p,
-	const char *prefix);
-__isl_give isl_printer *isl_printer_set_suffix(__isl_take isl_printer *p,
-	const char *suffix);
-__isl_give isl_printer *isl_printer_set_isl_int_width(__isl_take isl_printer *p,
-	int width);
-
-__isl_give isl_printer *isl_printer_start_line(__isl_take isl_printer *p);
-__isl_give isl_printer *isl_printer_end_line(__isl_take isl_printer *p);
-__isl_give isl_printer *isl_printer_print_int(__isl_take isl_printer *p, int i);
-__isl_give isl_printer *isl_printer_print_isl_int(__isl_take isl_printer *p,
-	isl_int i);
-__isl_give isl_printer *isl_printer_print_str(__isl_take isl_printer *p,
-	const char *s);
-
-__isl_give isl_printer *isl_printer_flush(__isl_take isl_printer *p);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/schedule.h b/cloog-0.17.0/isl/include/isl/schedule.h
deleted file mode 100644
index 7978979..0000000
--- a/cloog-0.17.0/isl/include/isl/schedule.h
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef ISL_SCHEDULE_H
-#define ISL_SCHEDULE_H
-
-#include <isl/union_set.h>
-#include <isl/union_map.h>
-#include <isl/list.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_schedule;
-typedef struct isl_schedule isl_schedule;
-
-int isl_options_set_schedule_max_constant_term(isl_ctx *ctx, int val);
-int isl_options_get_schedule_max_constant_term(isl_ctx *ctx);
-
-int isl_options_set_schedule_maximize_band_depth(isl_ctx *ctx, int val);
-int isl_options_get_schedule_maximize_band_depth(isl_ctx *ctx);
-
-int isl_options_set_schedule_outer_zero_distance(isl_ctx *ctx, int val);
-int isl_options_get_schedule_outer_zero_distance(isl_ctx *ctx);
-
-__isl_give isl_schedule *isl_union_set_compute_schedule(
-	__isl_take isl_union_set *domain,
-	__isl_take isl_union_map *validity,
-	__isl_take isl_union_map *proximity);
-void *isl_schedule_free(__isl_take isl_schedule *sched);
-__isl_give isl_union_map *isl_schedule_get_map(__isl_keep isl_schedule *sched);
-
-isl_ctx *isl_schedule_get_ctx(__isl_keep isl_schedule *sched);
-
-__isl_give isl_band_list *isl_schedule_get_band_forest(
-	__isl_keep isl_schedule *schedule);
-
-__isl_give isl_printer *isl_printer_print_schedule(__isl_take isl_printer *p,
-	__isl_keep isl_schedule *schedule);
-void isl_schedule_dump(__isl_keep isl_schedule *schedule);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/seq.h b/cloog-0.17.0/isl/include/isl/seq.h
deleted file mode 100644
index eda8818..0000000
--- a/cloog-0.17.0/isl/include/isl/seq.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_SEQ_H
-#define ISL_SEQ_H
-
-#include <sys/types.h>
-#include <isl/int.h>
-#include <isl/ctx.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/* Some common operations on sequences of isl_int's */
-
-void isl_seq_clr(isl_int *p, unsigned len);
-void isl_seq_set(isl_int *p, isl_int v, unsigned len);
-void isl_seq_neg(isl_int *dat, isl_int *src, unsigned len);
-void isl_seq_cpy(isl_int *dst, isl_int *src, unsigned len);
-void isl_seq_addmul(isl_int *dst, isl_int f, isl_int *src, unsigned len);
-void isl_seq_submul(isl_int *dst, isl_int f, isl_int *src, unsigned len);
-void isl_seq_swp_or_cpy(isl_int *dst, isl_int *src, unsigned len);
-void isl_seq_scale(isl_int *dst, isl_int *src, isl_int f, unsigned len);
-void isl_seq_scale_down(isl_int *dst, isl_int *src, isl_int f, unsigned len);
-void isl_seq_cdiv_q(isl_int *dst, isl_int *src, isl_int m, unsigned len);
-void isl_seq_fdiv_q(isl_int *dst, isl_int *src, isl_int m, unsigned len);
-void isl_seq_fdiv_r(isl_int *dst, isl_int *src, isl_int m, unsigned len);
-void isl_seq_combine(isl_int *dst, isl_int m1, isl_int *src1,
-			isl_int m2, isl_int *src2, unsigned len);
-void isl_seq_elim(isl_int *dst, isl_int *src, unsigned pos, unsigned len,
-		  isl_int *m);
-void isl_seq_gcd(isl_int *p, unsigned len, isl_int *gcd);
-void isl_seq_lcm(isl_int *p, unsigned len, isl_int *lcm);
-void isl_seq_normalize(struct isl_ctx *ctx, isl_int *p, unsigned len);
-void isl_seq_inner_product(isl_int *p1, isl_int *p2, unsigned len,
-			   isl_int *prod);
-int isl_seq_first_non_zero(isl_int *p, unsigned len);
-int isl_seq_last_non_zero(isl_int *p, unsigned len);
-int isl_seq_abs_min_non_zero(isl_int *p, unsigned len);
-int isl_seq_eq(isl_int *p1, isl_int *p2, unsigned len);
-int isl_seq_cmp(isl_int *p1, isl_int *p2, unsigned len);
-int isl_seq_is_neg(isl_int *p1, isl_int *p2, unsigned len);
-
-uint32_t isl_seq_get_hash(isl_int *p, unsigned len);
-uint32_t isl_seq_get_hash_bits(isl_int *p, unsigned len, unsigned bits);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/set.h b/cloog-0.17.0/isl/include/isl/set.h
deleted file mode 100644
index 2711427..0000000
--- a/cloog-0.17.0/isl/include/isl/set.h
+++ /dev/null
@@ -1,477 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_SET_H
-#define ISL_SET_H
-
-#include <isl/map_type.h>
-#include <isl/aff_type.h>
-#include <isl/list.h>
-#include <isl/mat.h>
-#include <isl/point.h>
-#include <isl/local_space.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-unsigned isl_basic_set_n_dim(__isl_keep isl_basic_set *bset);
-unsigned isl_basic_set_n_param(__isl_keep isl_basic_set *bset);
-unsigned isl_basic_set_total_dim(const struct isl_basic_set *bset);
-unsigned isl_basic_set_dim(__isl_keep isl_basic_set *bset,
-				enum isl_dim_type type);
-
-unsigned isl_set_n_dim(__isl_keep isl_set *set);
-unsigned isl_set_n_param(__isl_keep isl_set *set);
-unsigned isl_set_dim(__isl_keep isl_set *set, enum isl_dim_type type);
-
-isl_ctx *isl_basic_set_get_ctx(__isl_keep isl_basic_set *bset);
-isl_ctx *isl_set_get_ctx(__isl_keep isl_set *set);
-__isl_give isl_space *isl_basic_set_get_space(__isl_keep isl_basic_set *bset);
-__isl_give isl_space *isl_set_get_space(__isl_keep isl_set *set);
-__isl_give isl_set *isl_set_reset_space(__isl_take isl_set *set,
-	__isl_take isl_space *dim);
-
-__isl_give isl_aff *isl_basic_set_get_div(__isl_keep isl_basic_set *bset,
-	int pos);
-
-__isl_give isl_local_space *isl_basic_set_get_local_space(
-	__isl_keep isl_basic_set *bset);
-
-const char *isl_basic_set_get_tuple_name(__isl_keep isl_basic_set *bset);
-const char *isl_set_get_tuple_name(__isl_keep isl_set *set);
-__isl_give isl_basic_set *isl_basic_set_set_tuple_name(
-	__isl_take isl_basic_set *set, const char *s);
-__isl_give isl_set *isl_set_set_tuple_name(__isl_take isl_set *set,
-	const char *s);
-const char *isl_basic_set_get_dim_name(__isl_keep isl_basic_set *bset,
-	enum isl_dim_type type, unsigned pos);
-__isl_give isl_basic_set *isl_basic_set_set_dim_name(
-	__isl_take isl_basic_set *bset,
-	enum isl_dim_type type, unsigned pos, const char *s);
-const char *isl_set_get_dim_name(__isl_keep isl_set *set,
-	enum isl_dim_type type, unsigned pos);
-__isl_give isl_set *isl_set_set_dim_name(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned pos, const char *s);
-
-__isl_give isl_set *isl_set_set_dim_id(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned pos, __isl_take isl_id *id);
-int isl_set_has_dim_id(__isl_keep isl_set *set,
-	enum isl_dim_type type, unsigned pos);
-__isl_give isl_id *isl_set_get_dim_id(__isl_keep isl_set *set,
-	enum isl_dim_type type, unsigned pos);
-__isl_give isl_set *isl_set_set_tuple_id(__isl_take isl_set *set,
-	__isl_take isl_id *id);
-__isl_give isl_set *isl_set_reset_tuple_id(__isl_take isl_set *set);
-int isl_set_has_tuple_id(__isl_keep isl_set *set);
-__isl_give isl_id *isl_set_get_tuple_id(__isl_keep isl_set *set);
-
-int isl_set_find_dim_by_id(__isl_keep isl_set *set, enum isl_dim_type type,
-	__isl_keep isl_id *id);
-int isl_set_find_dim_by_name(__isl_keep isl_set *set, enum isl_dim_type type,
-	const char *name);
-
-int isl_basic_set_is_rational(__isl_keep isl_basic_set *bset);
-
-struct isl_basic_set *isl_basic_set_alloc(struct isl_ctx *ctx,
-		unsigned nparam, unsigned dim, unsigned extra,
-		unsigned n_eq, unsigned n_ineq);
-struct isl_basic_set *isl_basic_set_extend(struct isl_basic_set *base,
-		unsigned nparam, unsigned dim, unsigned extra,
-		unsigned n_eq, unsigned n_ineq);
-struct isl_basic_set *isl_basic_set_extend_constraints(
-		struct isl_basic_set *base, unsigned n_eq, unsigned n_ineq);
-struct isl_basic_set *isl_basic_set_finalize(struct isl_basic_set *bset);
-void isl_basic_set_free(__isl_take isl_basic_set *bset);
-__isl_give isl_basic_set *isl_basic_set_copy(__isl_keep isl_basic_set *bset);
-struct isl_basic_set *isl_basic_set_dup(struct isl_basic_set *bset);
-__isl_give isl_basic_set *isl_basic_set_empty(__isl_take isl_space *dim);
-struct isl_basic_set *isl_basic_set_empty_like(struct isl_basic_set *bset);
-__isl_give isl_basic_set *isl_basic_set_universe(__isl_take isl_space *dim);
-__isl_give isl_basic_set *isl_basic_set_nat_universe(__isl_take isl_space *dim);
-struct isl_basic_set *isl_basic_set_universe_like(struct isl_basic_set *bset);
-__isl_give isl_basic_set *isl_basic_set_universe_like_set(
-	__isl_keep isl_set *model);
-struct isl_basic_set *isl_basic_set_interval(struct isl_ctx *ctx,
-	isl_int min, isl_int max);
-__isl_give isl_basic_set *isl_basic_set_positive_orthant(
-	__isl_take isl_space *space);
-void isl_basic_set_print_internal(__isl_keep isl_basic_set *bset,
-				FILE *out, int indent);
-__isl_export
-__isl_give isl_basic_set *isl_basic_set_intersect(
-		__isl_take isl_basic_set *bset1,
-		__isl_take isl_basic_set *bset2);
-__isl_export
-__isl_give isl_basic_set *isl_basic_set_intersect_params(
-	__isl_take isl_basic_set *bset1, __isl_take isl_basic_set *bset2);
-__isl_export
-__isl_give isl_basic_set *isl_basic_set_apply(
-		__isl_take isl_basic_set *bset,
-		__isl_take isl_basic_map *bmap);
-__isl_export
-__isl_give isl_basic_set *isl_basic_set_affine_hull(
-		__isl_take isl_basic_set *bset);
-__isl_give isl_basic_set *isl_basic_set_remove_dims(
-	__isl_take isl_basic_set *bset,
-	enum isl_dim_type type, unsigned first, unsigned n);
-struct isl_basic_set *isl_basic_set_simplify(struct isl_basic_set *bset);
-__isl_export
-__isl_give isl_basic_set *isl_basic_set_detect_equalities(
-						__isl_take isl_basic_set *bset);
-__isl_give isl_basic_set *isl_basic_set_remove_redundancies(
-	__isl_take isl_basic_set *bset);
-__isl_give isl_set *isl_set_remove_redundancies(__isl_take isl_set *set);
-__isl_give isl_basic_set *isl_basic_set_list_product(
-	__isl_take struct isl_basic_set_list *list);
-
-__isl_give isl_basic_set *isl_basic_set_read_from_file(isl_ctx *ctx,
-	FILE *input);
-__isl_constructor
-__isl_give isl_basic_set *isl_basic_set_read_from_str(isl_ctx *ctx,
-	const char *str);
-__isl_give isl_set *isl_set_read_from_file(isl_ctx *ctx, FILE *input);
-__isl_constructor
-__isl_give isl_set *isl_set_read_from_str(isl_ctx *ctx, const char *str);
-void isl_basic_set_dump(__isl_keep isl_basic_set *bset);
-void isl_set_dump(__isl_keep isl_set *set);
-__isl_give isl_printer *isl_printer_print_basic_set(
-	__isl_take isl_printer *printer, __isl_keep isl_basic_set *bset);
-__isl_give isl_printer *isl_printer_print_set(__isl_take isl_printer *printer,
-	__isl_keep isl_set *map);
-void isl_basic_set_print(__isl_keep isl_basic_set *bset, FILE *out, int indent,
-	const char *prefix, const char *suffix, unsigned output_format);
-void isl_set_print(__isl_keep struct isl_set *set, FILE *out, int indent,
-	unsigned output_format);
-__isl_give isl_basic_set *isl_basic_set_fix(__isl_take isl_basic_set *bset,
-		enum isl_dim_type type, unsigned pos, isl_int value);
-__isl_give isl_basic_set *isl_basic_set_fix_si(__isl_take isl_basic_set *bset,
-		enum isl_dim_type type, unsigned pos, int value);
-__isl_give isl_set *isl_set_fix_si(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos, int value);
-__isl_give isl_set *isl_set_lower_bound_si(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos, int value);
-__isl_give isl_set *isl_set_upper_bound_si(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned pos, int value);
-
-__isl_give isl_set *isl_set_equate(__isl_take isl_set *set,
-	enum isl_dim_type type1, int pos1, enum isl_dim_type type2, int pos2);
-
-struct isl_basic_set *isl_basic_set_from_underlying_set(
-	struct isl_basic_set *bset, struct isl_basic_set *like);
-struct isl_set *isl_set_from_underlying_set(
-	struct isl_set *set, struct isl_basic_set *like);
-struct isl_set *isl_set_to_underlying_set(struct isl_set *set);
-
-__isl_export
-int isl_basic_set_is_equal(
-		struct isl_basic_set *bset1, struct isl_basic_set *bset2);
-
-__isl_give isl_set *isl_basic_set_partial_lexmin(
-		__isl_take isl_basic_set *bset, __isl_take isl_basic_set *dom,
-		__isl_give isl_set **empty);
-__isl_give isl_set *isl_basic_set_partial_lexmax(
-		__isl_take isl_basic_set *bset, __isl_take isl_basic_set *dom,
-		__isl_give isl_set **empty);
-__isl_give isl_set *isl_set_partial_lexmin(
-		__isl_take isl_set *set, __isl_take isl_set *dom,
-		__isl_give isl_set **empty);
-__isl_give isl_set *isl_set_partial_lexmax(
-		__isl_take isl_set *set, __isl_take isl_set *dom,
-		__isl_give isl_set **empty);
-__isl_export
-__isl_give isl_set *isl_basic_set_lexmin(__isl_take isl_basic_set *bset);
-__isl_export
-__isl_give isl_set *isl_basic_set_lexmax(__isl_take isl_basic_set *bset);
-__isl_export
-__isl_give isl_set *isl_set_lexmin(__isl_take isl_set *set);
-__isl_export
-__isl_give isl_set *isl_set_lexmax(__isl_take isl_set *set);
-__isl_give isl_pw_multi_aff *isl_basic_set_partial_lexmin_pw_multi_aff(
-	__isl_take isl_basic_set *bset, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty);
-__isl_give isl_pw_multi_aff *isl_basic_set_partial_lexmax_pw_multi_aff(
-	__isl_take isl_basic_set *bset, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty);
-
-__isl_export
-__isl_give isl_set *isl_basic_set_union(
-		__isl_take isl_basic_set *bset1,
-		__isl_take isl_basic_set *bset2);
-
-int isl_basic_set_compare_at(struct isl_basic_set *bset1,
-	struct isl_basic_set *bset2, int pos);
-int isl_set_follows_at(__isl_keep isl_set *set1,
-	__isl_keep isl_set *set2, int pos);
-
-__isl_give isl_basic_set *isl_basic_set_params(__isl_take isl_basic_set *bset);
-__isl_give isl_set *isl_set_params(__isl_take isl_set *set);
-__isl_give isl_set *isl_set_from_params(__isl_take isl_set *set);
-
-int isl_basic_set_dims_get_sign(__isl_keep isl_basic_set *bset,
-	enum isl_dim_type type, unsigned pos, unsigned n, int *signs);
-
-int isl_basic_set_is_universe(__isl_keep isl_basic_set *bset);
-int isl_basic_set_plain_is_empty(__isl_keep isl_basic_set *bset);
-int isl_basic_set_fast_is_empty(__isl_keep isl_basic_set *bset);
-__isl_export
-int isl_basic_set_is_empty(__isl_keep isl_basic_set *bset);
-int isl_basic_set_is_bounded(__isl_keep isl_basic_set *bset);
-
-struct isl_set *isl_set_alloc(struct isl_ctx *ctx,
-		unsigned nparam, unsigned dim, int n, unsigned flags);
-struct isl_set *isl_set_extend(struct isl_set *base,
-		unsigned nparam, unsigned dim);
-__isl_give isl_set *isl_set_empty(__isl_take isl_space *dim);
-struct isl_set *isl_set_empty_like(struct isl_set *set);
-__isl_give isl_set *isl_set_universe(__isl_take isl_space *dim);
-__isl_give isl_set *isl_set_nat_universe(__isl_take isl_space *dim);
-__isl_give isl_set *isl_set_universe_like(__isl_keep isl_set *model);
-__isl_give isl_set *isl_set_add_basic_set(__isl_take isl_set *set,
-						__isl_take isl_basic_set *bset);
-struct isl_set *isl_set_finalize(struct isl_set *set);
-__isl_give isl_set *isl_set_copy(__isl_keep isl_set *set);
-void isl_set_free(__isl_take isl_set *set);
-struct isl_set *isl_set_dup(struct isl_set *set);
-__isl_constructor
-__isl_give isl_set *isl_set_from_basic_set(__isl_take isl_basic_set *bset);
-__isl_give isl_basic_set *isl_set_sample(__isl_take isl_set *set);
-__isl_give isl_point *isl_basic_set_sample_point(__isl_take isl_basic_set *bset);
-__isl_give isl_point *isl_set_sample_point(__isl_take isl_set *set);
-__isl_export
-__isl_give isl_set *isl_set_detect_equalities(__isl_take isl_set *set);
-__isl_export
-__isl_give isl_basic_set *isl_set_affine_hull(__isl_take isl_set *set);
-__isl_give isl_basic_set *isl_set_convex_hull(__isl_take isl_set *set);
-__isl_export
-__isl_give isl_basic_set *isl_set_polyhedral_hull(__isl_take isl_set *set);
-__isl_give isl_basic_set *isl_set_simple_hull(__isl_take isl_set *set);
-struct isl_basic_set *isl_set_bounded_simple_hull(struct isl_set *set);
-__isl_give isl_set *isl_set_recession_cone(__isl_take isl_set *set);
-
-struct isl_set *isl_set_union_disjoint(
-			struct isl_set *set1, struct isl_set *set2);
-__isl_export
-__isl_give isl_set *isl_set_union(
-		__isl_take isl_set *set1,
-		__isl_take isl_set *set2);
-__isl_give isl_set *isl_set_product(__isl_take isl_set *set1,
-	__isl_take isl_set *set2);
-__isl_give isl_basic_set *isl_basic_set_flat_product(
-	__isl_take isl_basic_set *bset1, __isl_take isl_basic_set *bset2);
-__isl_give isl_set *isl_set_flat_product(__isl_take isl_set *set1,
-	__isl_take isl_set *set2);
-__isl_export
-__isl_give isl_set *isl_set_intersect(
-		__isl_take isl_set *set1,
-		__isl_take isl_set *set2);
-__isl_export
-__isl_give isl_set *isl_set_intersect_params(__isl_take isl_set *set,
-		__isl_take isl_set *params);
-__isl_export
-__isl_give isl_set *isl_set_subtract(
-		__isl_take isl_set *set1,
-		__isl_take isl_set *set2);
-__isl_export
-__isl_give isl_set *isl_set_complement(__isl_take isl_set *set);
-__isl_export
-__isl_give isl_set *isl_set_apply(
-		__isl_take isl_set *set,
-		__isl_take isl_map *map);
-__isl_give isl_set *isl_set_fix(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos, isl_int value);
-struct isl_set *isl_set_fix_dim_si(struct isl_set *set,
-		unsigned dim, int value);
-struct isl_set *isl_set_lower_bound_dim(struct isl_set *set,
-		unsigned dim, isl_int value);
-__isl_give isl_set *isl_set_insert_dims(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos, unsigned n);
-__isl_give isl_basic_set *isl_basic_set_add(__isl_take isl_basic_set *bset,
-		enum isl_dim_type type, unsigned n);
-__isl_give isl_set *isl_set_add_dims(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned n);
-__isl_give isl_basic_set *isl_basic_set_move_dims(__isl_take isl_basic_set *bset,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n);
-__isl_give isl_set *isl_set_move_dims(__isl_take isl_set *set,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n);
-__isl_give isl_basic_set *isl_basic_set_project_out(
-		__isl_take isl_basic_set *bset,
-		enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_set *isl_set_project_out(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_basic_set *isl_basic_set_remove_divs(
-	__isl_take isl_basic_set *bset);
-__isl_give isl_set *isl_set_eliminate(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned first, unsigned n);
-struct isl_set *isl_set_eliminate_dims(struct isl_set *set,
-		unsigned first, unsigned n);
-__isl_give isl_set *isl_set_remove_dims(__isl_take isl_set *bset,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_set *isl_set_remove_divs_involving_dims(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_set *isl_set_remove_unknown_divs(__isl_take isl_set *set);
-__isl_give isl_set *isl_set_remove_divs(__isl_take isl_set *set);
-__isl_give isl_set *isl_set_split_dims(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-int isl_basic_set_involves_dims(__isl_keep isl_basic_set *bset,
-	enum isl_dim_type type, unsigned first, unsigned n);
-int isl_set_involves_dims(__isl_keep isl_set *set,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-void isl_set_print_internal(__isl_keep isl_set *set, FILE *out, int indent);
-int isl_set_plain_is_empty(__isl_keep isl_set *set);
-int isl_set_fast_is_empty(__isl_keep isl_set *set);
-int isl_set_plain_is_universe(__isl_keep isl_set *set);
-int isl_set_fast_is_universe(__isl_keep isl_set *set);
-int isl_set_is_params(__isl_keep isl_set *set);
-__isl_export
-int isl_set_is_empty(__isl_keep isl_set *set);
-int isl_set_is_bounded(__isl_keep isl_set *set);
-__isl_export
-int isl_set_is_subset(__isl_keep isl_set *set1, __isl_keep isl_set *set2);
-__isl_export
-int isl_set_is_strict_subset(__isl_keep isl_set *set1, __isl_keep isl_set *set2);
-__isl_export
-int isl_set_is_equal(__isl_keep isl_set *set1, __isl_keep isl_set *set2);
-int isl_set_is_singleton(__isl_keep isl_set *set);
-int isl_set_is_box(__isl_keep isl_set *set);
-int isl_set_has_equal_space(__isl_keep isl_set *set1, __isl_keep isl_set *set2);
-
-__isl_give isl_set *isl_set_sum(__isl_take isl_set *set1,
-	__isl_take isl_set *set2);
-__isl_give isl_basic_set *isl_basic_set_neg(__isl_take isl_basic_set *bset);
-__isl_give isl_set *isl_set_neg(__isl_take isl_set *set);
-
-__isl_give isl_set *isl_set_make_disjoint(__isl_take isl_set *set);
-struct isl_set *isl_basic_set_compute_divs(struct isl_basic_set *bset);
-__isl_give isl_set *isl_set_compute_divs(__isl_take isl_set *set);
-__isl_give isl_set *isl_set_align_divs(__isl_take isl_set *set);
-
-struct isl_basic_set *isl_set_copy_basic_set(struct isl_set *set);
-struct isl_set *isl_set_drop_basic_set(struct isl_set *set,
-						struct isl_basic_set *bset);
-
-int isl_basic_set_plain_dim_is_fixed(__isl_keep isl_basic_set *bset,
-	unsigned dim, isl_int *val);
-
-int isl_set_plain_is_fixed(__isl_keep isl_set *set,
-	enum isl_dim_type type, unsigned pos, isl_int *val);
-int isl_set_plain_dim_is_fixed(__isl_keep isl_set *set,
-	unsigned dim, isl_int *val);
-int isl_set_fast_dim_is_fixed(__isl_keep isl_set *set,
-	unsigned dim, isl_int *val);
-int isl_set_plain_dim_has_fixed_lower_bound(__isl_keep isl_set *set,
-	unsigned dim, isl_int *val);
-int isl_set_dim_is_bounded(__isl_keep isl_set *set,
-	enum isl_dim_type type, unsigned pos);
-int isl_set_dim_has_lower_bound(__isl_keep isl_set *set,
-	enum isl_dim_type type, unsigned pos);
-int isl_set_dim_has_upper_bound(__isl_keep isl_set *set,
-	enum isl_dim_type type, unsigned pos);
-
-__isl_export
-__isl_give isl_basic_set *isl_basic_set_gist(__isl_take isl_basic_set *bset,
-					    __isl_take isl_basic_set *context);
-__isl_give isl_set *isl_set_gist_basic_set(__isl_take isl_set *set,
-	__isl_take isl_basic_set *context);
-__isl_export
-__isl_give isl_set *isl_set_gist(__isl_take isl_set *set,
-	__isl_take isl_set *context);
-__isl_give isl_set *isl_set_gist_params(__isl_take isl_set *set,
-	__isl_take isl_set *context);
-int isl_basic_set_dim_residue_class(struct isl_basic_set *bset,
-	int pos, isl_int *modulo, isl_int *residue);
-int isl_set_dim_residue_class(struct isl_set *set,
-	int pos, isl_int *modulo, isl_int *residue);
-
-__isl_export
-__isl_give isl_set *isl_set_coalesce(__isl_take isl_set *set);
-
-int isl_set_plain_is_equal(__isl_keep isl_set *set1, __isl_keep isl_set *set2);
-int isl_set_fast_is_equal(__isl_keep isl_set *set1, __isl_keep isl_set *set2);
-int isl_set_plain_is_disjoint(__isl_keep isl_set *set1,
-	__isl_keep isl_set *set2);
-int isl_set_fast_is_disjoint(__isl_keep isl_set *set1,
-	__isl_keep isl_set *set2);
-
-uint32_t isl_set_get_hash(struct isl_set *set);
-
-int isl_set_dim_is_unique(struct isl_set *set, unsigned dim);
-
-int isl_set_n_basic_set(__isl_keep isl_set *set);
-__isl_export
-int isl_set_foreach_basic_set(__isl_keep isl_set *set,
-	int (*fn)(__isl_take isl_basic_set *bset, void *user), void *user);
-
-int isl_set_foreach_point(__isl_keep isl_set *set,
-	int (*fn)(__isl_take isl_point *pnt, void *user), void *user);
-int isl_set_count(__isl_keep isl_set *set, isl_int *count);
-int isl_basic_set_count_upto(__isl_keep isl_basic_set *bset,
-	isl_int max, isl_int *count);
-int isl_set_count_upto(__isl_keep isl_set *set, isl_int max, isl_int *count);
-
-__isl_give isl_basic_set *isl_basic_set_from_point(__isl_take isl_point *pnt);
-__isl_give isl_set *isl_set_from_point(__isl_take isl_point *pnt);
-__isl_give isl_basic_set *isl_basic_set_box_from_points(
-	__isl_take isl_point *pnt1, __isl_take isl_point *pnt2);
-__isl_give isl_set *isl_set_box_from_points(__isl_take isl_point *pnt1,
-	__isl_take isl_point *pnt2);
-
-__isl_give isl_basic_set *isl_basic_set_lift(__isl_take isl_basic_set *bset);
-__isl_give isl_set *isl_set_lift(__isl_take isl_set *set);
-
-__isl_give isl_map *isl_set_lex_le_set(__isl_take isl_set *set1,
-	__isl_take isl_set *set2);
-__isl_give isl_map *isl_set_lex_lt_set(__isl_take isl_set *set1,
-	__isl_take isl_set *set2);
-__isl_give isl_map *isl_set_lex_ge_set(__isl_take isl_set *set1,
-	__isl_take isl_set *set2);
-__isl_give isl_map *isl_set_lex_gt_set(__isl_take isl_set *set1,
-	__isl_take isl_set *set2);
-
-int isl_set_size(__isl_keep isl_set *set);
-
-__isl_give isl_set *isl_set_align_params(__isl_take isl_set *set,
-	__isl_take isl_space *model);
-
-__isl_give isl_mat *isl_basic_set_equalities_matrix(
-	__isl_keep isl_basic_set *bset, enum isl_dim_type c1,
-	enum isl_dim_type c2, enum isl_dim_type c3, enum isl_dim_type c4);
-__isl_give isl_mat *isl_basic_set_inequalities_matrix(
-	__isl_keep isl_basic_set *bset, enum isl_dim_type c1,
-	enum isl_dim_type c2, enum isl_dim_type c3, enum isl_dim_type c4);
-__isl_give isl_basic_set *isl_basic_set_from_constraint_matrices(
-	__isl_take isl_space *dim,
-	__isl_take isl_mat *eq, __isl_take isl_mat *ineq, enum isl_dim_type c1,
-	enum isl_dim_type c2, enum isl_dim_type c3, enum isl_dim_type c4);
-
-__isl_give isl_mat *isl_basic_set_reduced_basis(__isl_keep isl_basic_set *bset);
-
-__isl_give isl_basic_set *isl_basic_set_coefficients(
-	__isl_take isl_basic_set *bset);
-__isl_give isl_basic_set *isl_set_coefficients(__isl_take isl_set *set);
-__isl_give isl_basic_set *isl_basic_set_solutions(
-	__isl_take isl_basic_set *bset);
-__isl_give isl_basic_set *isl_set_solutions(__isl_take isl_set *set);
-
-__isl_give isl_pw_aff *isl_set_dim_max(__isl_take isl_set *set, int pos);
-__isl_give isl_pw_aff *isl_set_dim_min(__isl_take isl_set *set, int pos);
-
-__isl_give char *isl_set_to_str(__isl_keep isl_set *set);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#include <isl/dim.h>
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/set_type.h b/cloog-0.17.0/isl/include/isl/set_type.h
deleted file mode 100644
index ce349e1..0000000
--- a/cloog-0.17.0/isl/include/isl/set_type.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef ISL_SET_TYPE_H
-#define ISL_SET_TYPE_H
-
-#include <isl/map_type.h>
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/space.h b/cloog-0.17.0/isl/include/isl/space.h
deleted file mode 100644
index d3496e0..0000000
--- a/cloog-0.17.0/isl/include/isl/space.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_SPACE_H
-#define ISL_SPACE_H
-
-#include <isl/ctx.h>
-#include <isl/id.h>
-#include <isl/printer.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_space;
-typedef struct isl_space isl_space;
-
-enum isl_dim_type {
-	isl_dim_cst,
-	isl_dim_param,
-	isl_dim_in,
-	isl_dim_out,
-	isl_dim_set = isl_dim_out,
-	isl_dim_div,
-	isl_dim_all
-};
-
-isl_ctx *isl_space_get_ctx(__isl_keep isl_space *dim);
-__isl_give isl_space *isl_space_alloc(isl_ctx *ctx,
-			unsigned nparam, unsigned n_in, unsigned n_out);
-__isl_give isl_space *isl_space_set_alloc(isl_ctx *ctx,
-			unsigned nparam, unsigned dim);
-__isl_give isl_space *isl_space_params_alloc(isl_ctx *ctx, unsigned nparam);
-__isl_give isl_space *isl_space_copy(__isl_keep isl_space *dim);
-void isl_space_free(__isl_take isl_space *dim);
-
-int isl_space_is_params(__isl_keep isl_space *space);
-int isl_space_is_set(__isl_keep isl_space *space);
-
-__isl_give isl_space *isl_space_set_tuple_name(__isl_take isl_space *dim,
-	enum isl_dim_type type, const char *s);
-const char *isl_space_get_tuple_name(__isl_keep isl_space *dim,
-				 enum isl_dim_type type);
-__isl_give isl_space *isl_space_set_tuple_id(__isl_take isl_space *dim,
-	enum isl_dim_type type, __isl_take isl_id *id);
-__isl_give isl_space *isl_space_reset_tuple_id(__isl_take isl_space *dim,
-	enum isl_dim_type type);
-int isl_space_has_tuple_id(__isl_keep isl_space *dim, enum isl_dim_type type);
-__isl_give isl_id *isl_space_get_tuple_id(__isl_keep isl_space *dim,
-	enum isl_dim_type type);
-
-__isl_give isl_space *isl_space_set_dim_id(__isl_take isl_space *dim,
-	enum isl_dim_type type, unsigned pos, __isl_take isl_id *id);
-int isl_space_has_dim_id(__isl_keep isl_space *dim,
-	enum isl_dim_type type, unsigned pos);
-__isl_give isl_id *isl_space_get_dim_id(__isl_keep isl_space *dim,
-	enum isl_dim_type type, unsigned pos);
-
-int isl_space_find_dim_by_id(__isl_keep isl_space *dim, enum isl_dim_type type,
-	__isl_keep isl_id *id);
-int isl_space_find_dim_by_name(__isl_keep isl_space *space,
-	enum isl_dim_type type, const char *name);
-
-__isl_give isl_space *isl_space_set_dim_name(__isl_take isl_space *dim,
-				 enum isl_dim_type type, unsigned pos,
-				 __isl_keep const char *name);
-__isl_keep const char *isl_space_get_dim_name(__isl_keep isl_space *dim,
-				 enum isl_dim_type type, unsigned pos);
-
-__isl_give isl_space *isl_space_extend(__isl_take isl_space *dim,
-			unsigned nparam, unsigned n_in, unsigned n_out);
-__isl_give isl_space *isl_space_add_dims(__isl_take isl_space *dim, enum isl_dim_type type,
-		unsigned n);
-__isl_give isl_space *isl_space_move_dims(__isl_take isl_space *dim,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n);
-__isl_give isl_space *isl_space_insert_dims(__isl_take isl_space *dim,
-	enum isl_dim_type type, unsigned pos, unsigned n);
-__isl_give isl_space *isl_space_join(__isl_take isl_space *left,
-	__isl_take isl_space *right);
-__isl_give isl_space *isl_space_product(__isl_take isl_space *left,
-	__isl_take isl_space *right);
-__isl_give isl_space *isl_space_domain_product(__isl_take isl_space *left,
-	__isl_take isl_space *right);
-__isl_give isl_space *isl_space_range_product(__isl_take isl_space *left,
-	__isl_take isl_space *right);
-__isl_give isl_space *isl_space_map_from_set(__isl_take isl_space *dim);
-__isl_give isl_space *isl_space_reverse(__isl_take isl_space *dim);
-__isl_give isl_space *isl_space_drop_dims(__isl_take isl_space *dim,
-	enum isl_dim_type type, unsigned first, unsigned num);
-__isl_give isl_space *isl_space_drop_inputs(__isl_take isl_space *dim,
-		unsigned first, unsigned n);
-__isl_give isl_space *isl_space_drop_outputs(__isl_take isl_space *dim,
-		unsigned first, unsigned n);
-__isl_give isl_space *isl_space_domain(__isl_take isl_space *dim);
-__isl_give isl_space *isl_space_from_domain(__isl_take isl_space *dim);
-__isl_give isl_space *isl_space_range(__isl_take isl_space *dim);
-__isl_give isl_space *isl_space_from_range(__isl_take isl_space *dim);
-__isl_give isl_space *isl_space_params(__isl_take isl_space *space);
-__isl_give isl_space *isl_space_set_from_params(__isl_take isl_space *space);
-
-__isl_give isl_space *isl_space_align_params(__isl_take isl_space *dim1,
-	__isl_take isl_space *dim2);
-
-int isl_space_is_wrapping(__isl_keep isl_space *dim);
-__isl_give isl_space *isl_space_wrap(__isl_take isl_space *dim);
-__isl_give isl_space *isl_space_unwrap(__isl_take isl_space *dim);
-
-int isl_space_can_zip(__isl_keep isl_space *dim);
-__isl_give isl_space *isl_space_zip(__isl_take isl_space *dim);
-
-int isl_space_is_equal(__isl_keep isl_space *dim1, __isl_keep isl_space *dim2);
-int isl_space_match(__isl_keep isl_space *dim1, enum isl_dim_type dim1_type,
-	__isl_keep isl_space *dim2, enum isl_dim_type dim2_type);
-int isl_space_tuple_match(__isl_keep isl_space *dim1, enum isl_dim_type dim1_type,
-			__isl_keep isl_space *dim2, enum isl_dim_type dim2_type);
-int isl_space_compatible(__isl_keep isl_space *dim1,
-	__isl_keep isl_space *dim2);
-unsigned isl_space_dim(__isl_keep isl_space *dim, enum isl_dim_type type);
-
-__isl_give isl_printer *isl_printer_print_space(__isl_take isl_printer *p,
-	__isl_keep isl_space *dim);
-void isl_space_dump(__isl_keep isl_space *dim);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/stream.h b/cloog-0.17.0/isl/include/isl/stream.h
deleted file mode 100644
index 7c19299..0000000
--- a/cloog-0.17.0/isl/include/isl/stream.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_STREAM_H
-#define ISL_STREAM_H
-
-#include <stdio.h>
-#include <isl/hash.h>
-#include <isl/aff_type.h>
-#include <isl/obj.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-enum isl_token_type { ISL_TOKEN_ERROR = -1,
-			ISL_TOKEN_UNKNOWN = 256, ISL_TOKEN_VALUE,
-			ISL_TOKEN_IDENT, ISL_TOKEN_GE,
-			ISL_TOKEN_LE, ISL_TOKEN_GT, ISL_TOKEN_LT,
-			ISL_TOKEN_NE, ISL_TOKEN_EQ_EQ,
-			ISL_TOKEN_LEX_GE, ISL_TOKEN_LEX_LE,
-			ISL_TOKEN_LEX_GT, ISL_TOKEN_LEX_LT,
-			ISL_TOKEN_TO, ISL_TOKEN_AND,
-			ISL_TOKEN_OR, ISL_TOKEN_EXISTS, ISL_TOKEN_NOT,
-			ISL_TOKEN_DEF, ISL_TOKEN_INFTY, ISL_TOKEN_NAN,
-			ISL_TOKEN_MIN, ISL_TOKEN_MAX, ISL_TOKEN_RAT,
-			ISL_TOKEN_TRUE, ISL_TOKEN_FALSE,
-			ISL_TOKEN_CEILD, ISL_TOKEN_FLOORD, ISL_TOKEN_MOD,
-			ISL_TOKEN_STRING,
-			ISL_TOKEN_MAP, ISL_TOKEN_AFF,
-			ISL_TOKEN_LAST };
-
-struct isl_token {
-	enum isl_token_type  type;
-
-	unsigned int on_new_line : 1;
-	unsigned is_keyword : 1;
-	int line;
-	int col;
-
-	union {
-		isl_int	v;
-		char	*s;
-		isl_map *map;
-		isl_pw_aff *pwaff;
-	} u;
-};
-
-void isl_token_free(struct isl_token *tok);
-
-struct isl_stream {
-	struct isl_ctx	*ctx;
-	FILE        	*file;
-	const char  	*str;
-	int	    	line;
-	int	    	col;
-	int	    	eof;
-
-	char	    	*buffer;
-	size_t	    	size;
-	size_t	    	len;
-	int	    	c;
-	int		un[5];
-	int		n_un;
-
-	struct isl_token	*tokens[5];
-	int	    	n_token;
-
-	struct isl_hash_table	*keywords;
-	enum isl_token_type	 next_type;
-};
-
-struct isl_stream* isl_stream_new_file(struct isl_ctx *ctx, FILE *file);
-struct isl_stream* isl_stream_new_str(struct isl_ctx *ctx, const char *str);
-void isl_stream_free(struct isl_stream *s);
-
-void isl_stream_error(struct isl_stream *s, struct isl_token *tok, char *msg);
-
-struct isl_token *isl_stream_next_token(struct isl_stream *s);
-struct isl_token *isl_stream_next_token_on_same_line(struct isl_stream *s);
-int isl_stream_next_token_is(struct isl_stream *s, int type);
-void isl_stream_push_token(struct isl_stream *s, struct isl_token *tok);
-void isl_stream_flush_tokens(struct isl_stream *s);
-int isl_stream_eat_if_available(struct isl_stream *s, int type);
-char *isl_stream_read_ident_if_available(struct isl_stream *s);
-int isl_stream_eat(struct isl_stream *s, int type);
-int isl_stream_is_empty(struct isl_stream *s);
-int isl_stream_skip_line(struct isl_stream *s);
-
-enum isl_token_type isl_stream_register_keyword(struct isl_stream *s,
-	const char *name);
-
-struct isl_obj isl_stream_read_obj(struct isl_stream *s);
-__isl_give isl_map *isl_stream_read_map(struct isl_stream *s);
-__isl_give isl_set *isl_stream_read_set(struct isl_stream *s);
-__isl_give isl_pw_qpolynomial *isl_stream_read_pw_qpolynomial(
-	struct isl_stream *s);
-__isl_give isl_union_map *isl_stream_read_union_map(struct isl_stream *s);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/union_map.h b/cloog-0.17.0/isl/include/isl/union_map.h
deleted file mode 100644
index f0ebeb2..0000000
--- a/cloog-0.17.0/isl/include/isl/union_map.h
+++ /dev/null
@@ -1,191 +0,0 @@
-#ifndef ISL_UNION_MAP_H
-#define ISL_UNION_MAP_H
-
-#include <isl/space.h>
-#include <isl/map_type.h>
-#include <isl/printer.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-__isl_export
-struct isl_union_map;
-typedef struct isl_union_map isl_union_map;
-#ifndef isl_union_set
-__isl_export
-struct isl_union_set;
-typedef struct isl_union_set isl_union_set;
-#endif
-
-__isl_constructor
-__isl_give isl_union_map *isl_union_map_from_map(__isl_take isl_map *map);
-__isl_give isl_union_map *isl_union_map_empty(__isl_take isl_space *dim);
-__isl_give isl_union_map *isl_union_map_copy(__isl_keep isl_union_map *umap);
-void *isl_union_map_free(__isl_take isl_union_map *umap);
-
-isl_ctx *isl_union_map_get_ctx(__isl_keep isl_union_map *umap);
-__isl_give isl_space *isl_union_map_get_space(__isl_keep isl_union_map *umap);
-
-__isl_give isl_union_map *isl_union_map_universe(
-	__isl_take isl_union_map *umap);
-__isl_give isl_set *isl_union_map_params(__isl_take isl_union_map *umap);
-__isl_give isl_union_set *isl_union_map_domain(__isl_take isl_union_map *umap);
-__isl_give isl_union_set *isl_union_map_range(__isl_take isl_union_map *umap);
-__isl_give isl_union_map *isl_union_map_domain_map(
-	__isl_take isl_union_map *umap);
-__isl_give isl_union_map *isl_union_map_range_map(
-	__isl_take isl_union_map *umap);
-__isl_give isl_union_map *isl_union_map_from_domain(
-	__isl_take isl_union_set *uset);
-__isl_give isl_union_map *isl_union_map_from_range(
-	__isl_take isl_union_set *uset);
-
-__isl_export
-__isl_give isl_union_map *isl_union_map_affine_hull(
-	__isl_take isl_union_map *umap);
-__isl_export
-__isl_give isl_union_map *isl_union_map_polyhedral_hull(
-	__isl_take isl_union_map *umap);
-__isl_give isl_union_map *isl_union_map_simple_hull(
-	__isl_take isl_union_map *umap);
-__isl_export
-__isl_give isl_union_map *isl_union_map_coalesce(
-	__isl_take isl_union_map *umap);
-__isl_give isl_union_map *isl_union_map_compute_divs(
-	__isl_take isl_union_map *umap);
-__isl_export
-__isl_give isl_union_map *isl_union_map_lexmin(__isl_take isl_union_map *umap);
-__isl_export
-__isl_give isl_union_map *isl_union_map_lexmax(__isl_take isl_union_map *umap);
-
-__isl_give isl_union_map *isl_union_map_add_map(__isl_take isl_union_map *umap,
-	__isl_take isl_map *map);
-__isl_export
-__isl_give isl_union_map *isl_union_map_union(__isl_take isl_union_map *umap1,
-	__isl_take isl_union_map *umap2);
-__isl_export
-__isl_give isl_union_map *isl_union_map_subtract(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2);
-__isl_export
-__isl_give isl_union_map *isl_union_map_intersect(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2);
-__isl_export
-__isl_give isl_union_map *isl_union_map_intersect_params(
-	__isl_take isl_union_map *umap, __isl_take isl_set *set);
-__isl_give isl_union_map *isl_union_map_product(__isl_take isl_union_map *umap1,
-	__isl_take isl_union_map *umap2);
-__isl_give isl_union_map *isl_union_map_range_product(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2);
-__isl_give isl_union_map *isl_union_map_flat_range_product(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2);
-__isl_export
-__isl_give isl_union_map *isl_union_map_gist(__isl_take isl_union_map *umap,
-	__isl_take isl_union_map *context);
-__isl_export
-__isl_give isl_union_map *isl_union_map_gist_params(
-	__isl_take isl_union_map *umap, __isl_take isl_set *set);
-__isl_export
-__isl_give isl_union_map *isl_union_map_gist_domain(
-	__isl_take isl_union_map *umap, __isl_take isl_union_set *uset);
-
-__isl_export
-__isl_give isl_union_map *isl_union_map_intersect_domain(
-	__isl_take isl_union_map *umap, __isl_take isl_union_set *uset);
-__isl_export
-__isl_give isl_union_map *isl_union_map_intersect_range(
-	__isl_take isl_union_map *umap, __isl_take isl_union_set *uset);
-
-__isl_export
-__isl_give isl_union_map *isl_union_map_apply_domain(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2);
-__isl_export
-__isl_give isl_union_map *isl_union_map_apply_range(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2);
-__isl_export
-__isl_give isl_union_map *isl_union_map_reverse(__isl_take isl_union_map *umap);
-__isl_give isl_union_map *isl_union_map_from_domain_and_range(
-	__isl_take isl_union_set *domain, __isl_take isl_union_set *range);
-
-__isl_export
-__isl_give isl_union_map *isl_union_map_detect_equalities(
-	__isl_keep isl_union_map *umap);
-__isl_export
-__isl_give isl_union_set *isl_union_map_deltas(__isl_take isl_union_map *umap);
-__isl_give isl_union_map *isl_union_map_deltas_map(
-	__isl_take isl_union_map *umap);
-__isl_export
-__isl_give isl_union_map *isl_union_set_identity(__isl_take isl_union_set *uset);
-
-__isl_export
-int isl_union_map_is_empty(__isl_keep isl_union_map *umap);
-__isl_export
-int isl_union_map_is_single_valued(__isl_keep isl_union_map *umap);
-int isl_union_map_plain_is_injective(__isl_keep isl_union_map *umap);
-__isl_export
-int isl_union_map_is_injective(__isl_keep isl_union_map *umap);
-__isl_export
-int isl_union_map_is_bijective(__isl_keep isl_union_map *umap);
-
-__isl_export
-int isl_union_map_is_subset(__isl_keep isl_union_map *umap1,
-	__isl_keep isl_union_map *umap2);
-__isl_export
-int isl_union_map_is_equal(__isl_keep isl_union_map *umap1,
-	__isl_keep isl_union_map *umap2);
-__isl_export
-int isl_union_map_is_strict_subset(__isl_keep isl_union_map *umap1,
-	__isl_keep isl_union_map *umap2);
-
-int isl_union_map_n_map(__isl_keep isl_union_map *umap);
-__isl_export
-int isl_union_map_foreach_map(__isl_keep isl_union_map *umap,
-	int (*fn)(__isl_take isl_map *map, void *user), void *user);
-__isl_give int isl_union_map_contains(__isl_keep isl_union_map *umap,
-	__isl_keep isl_space *dim);
-__isl_give isl_map *isl_union_map_extract_map(__isl_keep isl_union_map *umap,
-	__isl_take isl_space *dim);
-__isl_give isl_map *isl_map_from_union_map(__isl_take isl_union_map *umap);
-
-__isl_give isl_basic_map *isl_union_map_sample(__isl_take isl_union_map *umap);
-
-__isl_give isl_union_map *isl_union_map_power(__isl_take isl_union_map *umap,
-	int *exact);
-__isl_give isl_union_map *isl_union_map_transitive_closure(
-	__isl_take isl_union_map *umap, int *exact);
-
-__isl_give isl_union_map *isl_union_map_lex_lt_union_map(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2);
-__isl_give isl_union_map *isl_union_map_lex_le_union_map(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2);
-__isl_give isl_union_map *isl_union_map_lex_gt_union_map(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2);
-__isl_give isl_union_map *isl_union_map_lex_ge_union_map(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2);
-
-__isl_give isl_union_map *isl_union_map_read_from_file(isl_ctx *ctx,
-	FILE *input);
-__isl_constructor
-__isl_give isl_union_map *isl_union_map_read_from_str(isl_ctx *ctx,
-	const char *str);
-__isl_give isl_printer *isl_printer_print_union_map(__isl_take isl_printer *p,
-	__isl_keep isl_union_map *umap);
-void isl_union_map_dump(__isl_keep isl_union_map *umap);
-
-__isl_give isl_union_set *isl_union_map_wrap(__isl_take isl_union_map *umap);
-__isl_give isl_union_map *isl_union_set_unwrap(__isl_take isl_union_set *uset);
-
-__isl_give isl_union_map *isl_union_map_zip(__isl_take isl_union_map *umap);
-
-__isl_give isl_union_map *isl_union_map_align_params(
-	__isl_take isl_union_map *umap, __isl_take isl_space *model);
-__isl_give isl_union_set *isl_union_set_align_params(
-	__isl_take isl_union_set *uset, __isl_take isl_space *model);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#include <isl/dim.h>
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/union_set.h b/cloog-0.17.0/isl/include/isl/union_set.h
deleted file mode 100644
index c2acec4..0000000
--- a/cloog-0.17.0/isl/include/isl/union_set.h
+++ /dev/null
@@ -1,130 +0,0 @@
-#ifndef ISL_UNION_SET_H
-#define ISL_UNION_SET_H
-
-#include <isl/point.h>
-#include <isl/union_map.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-__isl_constructor
-__isl_give isl_union_set *isl_union_set_from_set(__isl_take isl_set *set);
-__isl_give isl_union_set *isl_union_set_empty(__isl_take isl_space *dim);
-__isl_give isl_union_set *isl_union_set_copy(__isl_keep isl_union_set *uset);
-void *isl_union_set_free(__isl_take isl_union_set *uset);
-
-isl_ctx *isl_union_set_get_ctx(__isl_keep isl_union_set *uset);
-__isl_give isl_space *isl_union_set_get_space(__isl_keep isl_union_set *uset);
-
-__isl_give isl_union_set *isl_union_set_universe(
-	__isl_take isl_union_set *uset);
-__isl_give isl_set *isl_union_set_params(__isl_take isl_union_set *uset);
-
-__isl_export
-__isl_give isl_union_set *isl_union_set_detect_equalities(
-	__isl_take isl_union_set *uset);
-__isl_export
-__isl_give isl_union_set *isl_union_set_affine_hull(
-	__isl_take isl_union_set *uset);
-__isl_export
-__isl_give isl_union_set *isl_union_set_polyhedral_hull(
-	__isl_take isl_union_set *uset);
-__isl_give isl_union_set *isl_union_set_simple_hull(
-	__isl_take isl_union_set *uset);
-__isl_export
-__isl_give isl_union_set *isl_union_set_coalesce(
-	__isl_take isl_union_set *uset);
-__isl_give isl_union_set *isl_union_set_compute_divs(
-	__isl_take isl_union_set *uset);
-__isl_export
-__isl_give isl_union_set *isl_union_set_lexmin(__isl_take isl_union_set *uset);
-__isl_export
-__isl_give isl_union_set *isl_union_set_lexmax(__isl_take isl_union_set *uset);
-
-__isl_give isl_union_set *isl_union_set_add_set(__isl_take isl_union_set *uset,
-	__isl_take isl_set *set);
-__isl_give isl_union_set *isl_union_set_union(__isl_take isl_union_set *uset1,
-	__isl_take isl_union_set *uset2);
-__isl_export
-__isl_give isl_union_set *isl_union_set_subtract(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2);
-__isl_export
-__isl_give isl_union_set *isl_union_set_intersect(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2);
-__isl_export
-__isl_give isl_union_set *isl_union_set_intersect_params(
-	__isl_take isl_union_set *uset, __isl_take isl_set *set);
-__isl_give isl_union_set *isl_union_set_product(__isl_take isl_union_set *uset1,
-	__isl_take isl_union_set *uset2);
-__isl_export
-__isl_give isl_union_set *isl_union_set_gist(__isl_take isl_union_set *uset,
-	__isl_take isl_union_set *context);
-__isl_export
-__isl_give isl_union_set *isl_union_set_gist_params(
-	__isl_take isl_union_set *uset, __isl_take isl_set *set);
-
-__isl_export
-__isl_give isl_union_set *isl_union_set_apply(
-	__isl_take isl_union_set *uset, __isl_take isl_union_map *umap);
-
-int isl_union_set_is_params(__isl_keep isl_union_set *uset);
-__isl_export
-int isl_union_set_is_empty(__isl_keep isl_union_set *uset);
-
-__isl_export
-int isl_union_set_is_subset(__isl_keep isl_union_set *uset1,
-	__isl_keep isl_union_set *uset2);
-__isl_export
-int isl_union_set_is_equal(__isl_keep isl_union_set *uset1,
-	__isl_keep isl_union_set *uset2);
-__isl_export
-int isl_union_set_is_strict_subset(__isl_keep isl_union_set *uset1,
-	__isl_keep isl_union_set *uset2);
-
-int isl_union_set_n_set(__isl_keep isl_union_set *uset);
-__isl_export
-int isl_union_set_foreach_set(__isl_keep isl_union_set *uset,
-	int (*fn)(__isl_take isl_set *set, void *user), void *user);
-__isl_give int isl_union_set_contains(__isl_keep isl_union_set *uset,
-	__isl_keep isl_space *dim);
-__isl_give isl_set *isl_union_set_extract_set(__isl_keep isl_union_set *uset,
-	__isl_take isl_space *dim);
-__isl_give isl_set *isl_set_from_union_set(__isl_take isl_union_set *uset);
-int isl_union_set_foreach_point(__isl_keep isl_union_set *uset,
-	int (*fn)(__isl_take isl_point *pnt, void *user), void *user);
-
-__isl_give isl_basic_set *isl_union_set_sample(__isl_take isl_union_set *uset);
-
-__isl_give isl_union_set *isl_union_set_lift(__isl_take isl_union_set *uset);
-
-__isl_give isl_union_map *isl_union_set_lex_lt_union_set(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2);
-__isl_give isl_union_map *isl_union_set_lex_le_union_set(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2);
-__isl_give isl_union_map *isl_union_set_lex_gt_union_set(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2);
-__isl_give isl_union_map *isl_union_set_lex_ge_union_set(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2);
-
-__isl_give isl_union_set *isl_union_set_coefficients(
-	__isl_take isl_union_set *bset);
-__isl_give isl_union_set *isl_union_set_solutions(
-	__isl_take isl_union_set *bset);
-
-__isl_give isl_union_set *isl_union_set_read_from_file(isl_ctx *ctx,
-	FILE *input);
-__isl_constructor
-__isl_give isl_union_set *isl_union_set_read_from_str(isl_ctx *ctx,
-	const char *str);
-__isl_give isl_printer *isl_printer_print_union_set(__isl_take isl_printer *p,
-	__isl_keep isl_union_set *uset);
-void isl_union_set_dump(__isl_keep isl_union_set *uset);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#include <isl/dim.h>
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/vec.h b/cloog-0.17.0/isl/include/isl/vec.h
deleted file mode 100644
index eb9a7e2..0000000
--- a/cloog-0.17.0/isl/include/isl/vec.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_VEC_H
-#define ISL_VEC_H
-
-#include <stdio.h>
-
-#include <isl/int.h>
-#include <isl/ctx.h>
-#include <isl/blk.h>
-#include <isl/printer.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_vec {
-	int ref;
-
-	struct isl_ctx *ctx;
-
-	unsigned size;
-	isl_int *el;
-
-	struct isl_blk block;
-};
-typedef struct isl_vec isl_vec;
-
-struct isl_vec *isl_vec_alloc(struct isl_ctx *ctx, unsigned size);
-struct isl_vec *isl_vec_copy(struct isl_vec *vec);
-struct isl_vec *isl_vec_cow(struct isl_vec *vec);
-void isl_vec_free(struct isl_vec *vec);
-
-isl_ctx *isl_vec_get_ctx(__isl_keep isl_vec *vec);
-
-int isl_vec_is_equal(__isl_keep isl_vec *vec1, __isl_keep isl_vec *vec2);
-
-void isl_vec_dump(__isl_keep isl_vec *vec);
-__isl_give isl_printer *isl_printer_print_vec(__isl_take isl_printer *printer,
-	__isl_keep isl_vec *vec);
-
-void isl_vec_lcm(struct isl_vec *vec, isl_int *lcm);
-struct isl_vec *isl_vec_ceil(struct isl_vec *vec);
-struct isl_vec *isl_vec_normalize(struct isl_vec *vec);
-__isl_give isl_vec *isl_vec_clr(__isl_take isl_vec *vec);
-__isl_give isl_vec *isl_vec_neg(__isl_take isl_vec *vec);
-__isl_give isl_vec *isl_vec_scale(__isl_take isl_vec *vec, isl_int m);
-__isl_give isl_vec *isl_vec_add(__isl_take isl_vec *vec1,
-	__isl_take isl_vec *vec2);
-__isl_give isl_vec *isl_vec_extend(__isl_take isl_vec *vec, unsigned size);
-__isl_give isl_vec *isl_vec_zero_extend(__isl_take isl_vec *vec, unsigned size);
-
-__isl_give isl_vec *isl_vec_sort(__isl_take isl_vec *vec);
-
-__isl_give isl_vec *isl_vec_read_from_file(isl_ctx *ctx, FILE *input);
-
-__isl_give isl_vec *isl_vec_drop_els(__isl_take isl_vec *vec,
-	unsigned pos, unsigned n);
-__isl_give isl_vec *isl_vec_insert_els(__isl_take isl_vec *vec,
-	unsigned pos, unsigned n);
-__isl_give isl_vec *isl_vec_insert_zero_els(__isl_take isl_vec *vec,
-	unsigned pos, unsigned n);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/version.h b/cloog-0.17.0/isl/include/isl/version.h
deleted file mode 100644
index 7f8f23d..0000000
--- a/cloog-0.17.0/isl/include/isl/version.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef ISL_VERSION_H
-#define ISL_VERSION_H
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-const char *isl_version(void);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/include/isl/vertices.h b/cloog-0.17.0/isl/include/isl/vertices.h
deleted file mode 100644
index 3e8460d..0000000
--- a/cloog-0.17.0/isl/include/isl/vertices.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef ISL_VERTICES_H
-#define ISL_VERTICES_H
-
-#include <isl/set_type.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_external_vertex;
-typedef struct isl_external_vertex	isl_vertex;
-
-struct isl_cell;
-typedef struct isl_cell		isl_cell;
-
-struct isl_vertices;
-typedef struct isl_vertices	isl_vertices;
-
-isl_ctx *isl_vertex_get_ctx(__isl_keep isl_vertex *vertex);
-int isl_vertex_get_id(__isl_keep isl_vertex *vertex);
-__isl_give isl_basic_set *isl_vertex_get_domain(__isl_keep isl_vertex *vertex);
-__isl_give isl_basic_set *isl_vertex_get_expr(__isl_keep isl_vertex *vertex);
-void isl_vertex_free(__isl_take isl_vertex *vertex);
-
-__isl_give isl_vertices *isl_basic_set_compute_vertices(
-	__isl_keep isl_basic_set *bset);
-isl_ctx *isl_vertices_get_ctx(__isl_keep isl_vertices *vertices);
-int isl_vertices_get_n_vertices(__isl_keep isl_vertices *vertices);
-int isl_vertices_foreach_vertex(__isl_keep isl_vertices *vertices,
-	int (*fn)(__isl_take isl_vertex *vertex, void *user), void *user);
-void isl_vertices_free(__isl_take isl_vertices *vertices);
-
-isl_ctx *isl_cell_get_ctx(__isl_keep isl_cell *cell);
-__isl_give isl_basic_set *isl_cell_get_domain(__isl_keep isl_cell *cell);
-int isl_cell_foreach_vertex(__isl_keep isl_cell *cell,
-	int (*fn)(__isl_take isl_vertex *vertex, void *user), void *user);
-void isl_cell_free(__isl_take isl_cell *cell);
-
-int isl_vertices_foreach_cell(__isl_keep isl_vertices *vertices,
-	int (*fn)(__isl_take isl_cell *cell, void *user), void *user);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/install-sh b/cloog-0.17.0/isl/install-sh
deleted file mode 100755
index 6781b98..0000000
--- a/cloog-0.17.0/isl/install-sh
+++ /dev/null
@@ -1,520 +0,0 @@
-#!/bin/sh
-# install - install a program, script, or datafile
-
-scriptversion=2009-04-28.21; # UTC
-
-# This originates from X11R5 (mit/util/scripts/install.sh), which was
-# later released in X11R6 (xc/config/util/install.sh) with the
-# following copyright and license.
-#
-# Copyright (C) 1994 X Consortium
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
-# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-# Except as contained in this notice, the name of the X Consortium shall not
-# be used in advertising or otherwise to promote the sale, use or other deal-
-# ings in this Software without prior written authorization from the X Consor-
-# tium.
-#
-#
-# FSF changes to this file are in the public domain.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.
-
-nl='
-'
-IFS=" ""	$nl"
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit=${DOITPROG-}
-if test -z "$doit"; then
-  doit_exec=exec
-else
-  doit_exec=$doit
-fi
-
-# Put in absolute file names if you don't have them in your path;
-# or use environment vars.
-
-chgrpprog=${CHGRPPROG-chgrp}
-chmodprog=${CHMODPROG-chmod}
-chownprog=${CHOWNPROG-chown}
-cmpprog=${CMPPROG-cmp}
-cpprog=${CPPROG-cp}
-mkdirprog=${MKDIRPROG-mkdir}
-mvprog=${MVPROG-mv}
-rmprog=${RMPROG-rm}
-stripprog=${STRIPPROG-strip}
-
-posix_glob='?'
-initialize_posix_glob='
-  test "$posix_glob" != "?" || {
-    if (set -f) 2>/dev/null; then
-      posix_glob=
-    else
-      posix_glob=:
-    fi
-  }
-'
-
-posix_mkdir=
-
-# Desired mode of installed file.
-mode=0755
-
-chgrpcmd=
-chmodcmd=$chmodprog
-chowncmd=
-mvcmd=$mvprog
-rmcmd="$rmprog -f"
-stripcmd=
-
-src=
-dst=
-dir_arg=
-dst_arg=
-
-copy_on_change=false
-no_target_directory=
-
-usage="\
-Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
-   or: $0 [OPTION]... SRCFILES... DIRECTORY
-   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
-   or: $0 [OPTION]... -d DIRECTORIES...
-
-In the 1st form, copy SRCFILE to DSTFILE.
-In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
-In the 4th, create DIRECTORIES.
-
-Options:
-     --help     display this help and exit.
-     --version  display version info and exit.
-
-  -c            (ignored)
-  -C            install only if different (preserve the last data modification time)
-  -d            create directories instead of installing files.
-  -g GROUP      $chgrpprog installed files to GROUP.
-  -m MODE       $chmodprog installed files to MODE.
-  -o USER       $chownprog installed files to USER.
-  -s            $stripprog installed files.
-  -t DIRECTORY  install into DIRECTORY.
-  -T            report an error if DSTFILE is a directory.
-
-Environment variables override the default commands:
-  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
-  RMPROG STRIPPROG
-"
-
-while test $# -ne 0; do
-  case $1 in
-    -c) ;;
-
-    -C) copy_on_change=true;;
-
-    -d) dir_arg=true;;
-
-    -g) chgrpcmd="$chgrpprog $2"
-	shift;;
-
-    --help) echo "$usage"; exit $?;;
-
-    -m) mode=$2
-	case $mode in
-	  *' '* | *'	'* | *'
-'*	  | *'*'* | *'?'* | *'['*)
-	    echo "$0: invalid mode: $mode" >&2
-	    exit 1;;
-	esac
-	shift;;
-
-    -o) chowncmd="$chownprog $2"
-	shift;;
-
-    -s) stripcmd=$stripprog;;
-
-    -t) dst_arg=$2
-	shift;;
-
-    -T) no_target_directory=true;;
-
-    --version) echo "$0 $scriptversion"; exit $?;;
-
-    --)	shift
-	break;;
-
-    -*)	echo "$0: invalid option: $1" >&2
-	exit 1;;
-
-    *)  break;;
-  esac
-  shift
-done
-
-if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
-  # When -d is used, all remaining arguments are directories to create.
-  # When -t is used, the destination is already specified.
-  # Otherwise, the last argument is the destination.  Remove it from $@.
-  for arg
-  do
-    if test -n "$dst_arg"; then
-      # $@ is not empty: it contains at least $arg.
-      set fnord "$@" "$dst_arg"
-      shift # fnord
-    fi
-    shift # arg
-    dst_arg=$arg
-  done
-fi
-
-if test $# -eq 0; then
-  if test -z "$dir_arg"; then
-    echo "$0: no input file specified." >&2
-    exit 1
-  fi
-  # It's OK to call `install-sh -d' without argument.
-  # This can happen when creating conditional directories.
-  exit 0
-fi
-
-if test -z "$dir_arg"; then
-  trap '(exit $?); exit' 1 2 13 15
-
-  # Set umask so as not to create temps with too-generous modes.
-  # However, 'strip' requires both read and write access to temps.
-  case $mode in
-    # Optimize common cases.
-    *644) cp_umask=133;;
-    *755) cp_umask=22;;
-
-    *[0-7])
-      if test -z "$stripcmd"; then
-	u_plus_rw=
-      else
-	u_plus_rw='% 200'
-      fi
-      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
-    *)
-      if test -z "$stripcmd"; then
-	u_plus_rw=
-      else
-	u_plus_rw=,u+rw
-      fi
-      cp_umask=$mode$u_plus_rw;;
-  esac
-fi
-
-for src
-do
-  # Protect names starting with `-'.
-  case $src in
-    -*) src=./$src;;
-  esac
-
-  if test -n "$dir_arg"; then
-    dst=$src
-    dstdir=$dst
-    test -d "$dstdir"
-    dstdir_status=$?
-  else
-
-    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
-    # might cause directories to be created, which would be especially bad
-    # if $src (and thus $dsttmp) contains '*'.
-    if test ! -f "$src" && test ! -d "$src"; then
-      echo "$0: $src does not exist." >&2
-      exit 1
-    fi
-
-    if test -z "$dst_arg"; then
-      echo "$0: no destination specified." >&2
-      exit 1
-    fi
-
-    dst=$dst_arg
-    # Protect names starting with `-'.
-    case $dst in
-      -*) dst=./$dst;;
-    esac
-
-    # If destination is a directory, append the input filename; won't work
-    # if double slashes aren't ignored.
-    if test -d "$dst"; then
-      if test -n "$no_target_directory"; then
-	echo "$0: $dst_arg: Is a directory" >&2
-	exit 1
-      fi
-      dstdir=$dst
-      dst=$dstdir/`basename "$src"`
-      dstdir_status=0
-    else
-      # Prefer dirname, but fall back on a substitute if dirname fails.
-      dstdir=`
-	(dirname "$dst") 2>/dev/null ||
-	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	     X"$dst" : 'X\(//\)[^/]' \| \
-	     X"$dst" : 'X\(//\)$' \| \
-	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
-	echo X"$dst" |
-	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)[^/].*/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\).*/{
-		   s//\1/
-		   q
-		 }
-		 s/.*/./; q'
-      `
-
-      test -d "$dstdir"
-      dstdir_status=$?
-    fi
-  fi
-
-  obsolete_mkdir_used=false
-
-  if test $dstdir_status != 0; then
-    case $posix_mkdir in
-      '')
-	# Create intermediate dirs using mode 755 as modified by the umask.
-	# This is like FreeBSD 'install' as of 1997-10-28.
-	umask=`umask`
-	case $stripcmd.$umask in
-	  # Optimize common cases.
-	  *[2367][2367]) mkdir_umask=$umask;;
-	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
-	  *[0-7])
-	    mkdir_umask=`expr $umask + 22 \
-	      - $umask % 100 % 40 + $umask % 20 \
-	      - $umask % 10 % 4 + $umask % 2
-	    `;;
-	  *) mkdir_umask=$umask,go-w;;
-	esac
-
-	# With -d, create the new directory with the user-specified mode.
-	# Otherwise, rely on $mkdir_umask.
-	if test -n "$dir_arg"; then
-	  mkdir_mode=-m$mode
-	else
-	  mkdir_mode=
-	fi
-
-	posix_mkdir=false
-	case $umask in
-	  *[123567][0-7][0-7])
-	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
-	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-	    ;;
-	  *)
-	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-	    if (umask $mkdir_umask &&
-		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
-	    then
-	      if test -z "$dir_arg" || {
-		   # Check for POSIX incompatibilities with -m.
-		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-		   # other-writeable bit of parent directory when it shouldn't.
-		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
-		   case $ls_ld_tmpdir in
-		     d????-?r-*) different_mode=700;;
-		     d????-?--*) different_mode=755;;
-		     *) false;;
-		   esac &&
-		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
-		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
-		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-		   }
-		 }
-	      then posix_mkdir=:
-	      fi
-	      rmdir "$tmpdir/d" "$tmpdir"
-	    else
-	      # Remove any dirs left behind by ancient mkdir implementations.
-	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
-	    fi
-	    trap '' 0;;
-	esac;;
-    esac
-
-    if
-      $posix_mkdir && (
-	umask $mkdir_umask &&
-	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
-      )
-    then :
-    else
-
-      # The umask is ridiculous, or mkdir does not conform to POSIX,
-      # or it failed possibly due to a race condition.  Create the
-      # directory the slow way, step by step, checking for races as we go.
-
-      case $dstdir in
-	/*) prefix='/';;
-	-*) prefix='./';;
-	*)  prefix='';;
-      esac
-
-      eval "$initialize_posix_glob"
-
-      oIFS=$IFS
-      IFS=/
-      $posix_glob set -f
-      set fnord $dstdir
-      shift
-      $posix_glob set +f
-      IFS=$oIFS
-
-      prefixes=
-
-      for d
-      do
-	test -z "$d" && continue
-
-	prefix=$prefix$d
-	if test -d "$prefix"; then
-	  prefixes=
-	else
-	  if $posix_mkdir; then
-	    (umask=$mkdir_umask &&
-	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-	    # Don't fail if two instances are running concurrently.
-	    test -d "$prefix" || exit 1
-	  else
-	    case $prefix in
-	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-	      *) qprefix=$prefix;;
-	    esac
-	    prefixes="$prefixes '$qprefix'"
-	  fi
-	fi
-	prefix=$prefix/
-      done
-
-      if test -n "$prefixes"; then
-	# Don't fail if two instances are running concurrently.
-	(umask $mkdir_umask &&
-	 eval "\$doit_exec \$mkdirprog $prefixes") ||
-	  test -d "$dstdir" || exit 1
-	obsolete_mkdir_used=true
-      fi
-    fi
-  fi
-
-  if test -n "$dir_arg"; then
-    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
-    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
-      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
-  else
-
-    # Make a couple of temp file names in the proper directory.
-    dsttmp=$dstdir/_inst.$$_
-    rmtmp=$dstdir/_rm.$$_
-
-    # Trap to clean up those temp files at exit.
-    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
-
-    # Copy the file name to the temp name.
-    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
-
-    # and set any options; do chmod last to preserve setuid bits.
-    #
-    # If any of these fail, we abort the whole thing.  If we want to
-    # ignore errors from any of these, just make sure not to ignore
-    # errors from the above "$doit $cpprog $src $dsttmp" command.
-    #
-    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
-    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
-    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
-
-    # If -C, don't bother to copy if it wouldn't change the file.
-    if $copy_on_change &&
-       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
-       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
-
-       eval "$initialize_posix_glob" &&
-       $posix_glob set -f &&
-       set X $old && old=:$2:$4:$5:$6 &&
-       set X $new && new=:$2:$4:$5:$6 &&
-       $posix_glob set +f &&
-
-       test "$old" = "$new" &&
-       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
-    then
-      rm -f "$dsttmp"
-    else
-      # Rename the file to the real destination.
-      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
-
-      # The rename failed, perhaps because mv can't rename something else
-      # to itself, or perhaps because mv is so ancient that it does not
-      # support -f.
-      {
-	# Now remove or move aside any old file at destination location.
-	# We try this two ways since rm can't unlink itself on some
-	# systems and the destination file might be busy for other
-	# reasons.  In this case, the final cleanup might fail but the new
-	# file should still install successfully.
-	{
-	  test ! -f "$dst" ||
-	  $doit $rmcmd -f "$dst" 2>/dev/null ||
-	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
-	  } ||
-	  { echo "$0: cannot unlink or rename $dst" >&2
-	    (exit 1); exit 1
-	  }
-	} &&
-
-	# Now rename the file to the real destination.
-	$doit $mvcmd "$dsttmp" "$dst"
-      }
-    fi || exit 1
-
-    trap '' 0
-  fi
-done
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/cloog-0.17.0/isl/interface/Makefile.am b/cloog-0.17.0/isl/interface/Makefile.am
deleted file mode 100644
index 89644b9..0000000
--- a/cloog-0.17.0/isl/interface/Makefile.am
+++ /dev/null
@@ -1,30 +0,0 @@
-AUTOMAKE_OPTIONS = nostdinc
-
-noinst_PROGRAMS = extract_interface
-
-AM_CXXFLAGS = $(CLANG_CXXFLAGS)
-AM_LDFLAGS = $(CLANG_LDFLAGS)
-
-INCLUDES = -I$(top_builddir) -I$(top_srcdir) \
-	-I$(top_builddir)/include -I$(top_srcdir)/include
-
-extract_interface_SOURCES = \
-	python.h \
-	python.cc \
-	extract_interface.h \
-	extract_interface.cc
-extract_interface_LDADD = \
-	-lclangFrontend -lclangSerialization -lclangParse -lclangSema \
-	-lclangAnalysis -lclangAST -lclangLex -lclangBasic -lclangDriver \
-	$(CLANG_LIBS) $(CLANG_LDFLAGS)
-
-test: extract_interface
-	./extract_interface$(EXEEXT) $(INCLUDES) $(srcdir)/all.h
-
-isl.py: extract_interface isl.py.top
-	(cat $(srcdir)/isl.py.top; \
-		./extract_interface$(EXEEXT) $(INCLUDES) $(srcdir)/all.h) \
-			> isl.py
-
-dist-hook: isl.py
-	cp isl.py $(distdir)/
diff --git a/cloog-0.17.0/isl/interface/Makefile.in b/cloog-0.17.0/isl/interface/Makefile.in
deleted file mode 100644
index dc65cbf..0000000
--- a/cloog-0.17.0/isl/interface/Makefile.in
+++ /dev/null
@@ -1,575 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-noinst_PROGRAMS = extract_interface$(EXEEXT)
-subdir = interface
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_c___attribute__.m4 \
-	$(top_srcdir)/m4/ax_cc_maxopt.m4 \
-	$(top_srcdir)/m4/ax_check_compiler_flags.m4 \
-	$(top_srcdir)/m4/ax_compiler_vendor.m4 \
-	$(top_srcdir)/m4/ax_create_pkgconfig_info.m4 \
-	$(top_srcdir)/m4/ax_create_stdint_h.m4 \
-	$(top_srcdir)/m4/ax_detect_git_head.m4 \
-	$(top_srcdir)/m4/ax_gcc_archflag.m4 \
-	$(top_srcdir)/m4/ax_gcc_warn_unused_result.m4 \
-	$(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \
-	$(top_srcdir)/m4/ax_set_warning_flags.m4 \
-	$(top_srcdir)/m4/ax_submodule.m4 $(top_srcdir)/m4/libtool.m4 \
-	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/isl_config.h \
-	$(top_builddir)/include/isl/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-PROGRAMS = $(noinst_PROGRAMS)
-am_extract_interface_OBJECTS = python.$(OBJEXT) \
-	extract_interface.$(OBJEXT)
-extract_interface_OBJECTS = $(am_extract_interface_OBJECTS)
-am__DEPENDENCIES_1 =
-extract_interface_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
-AM_V_lt = $(am__v_lt_$(V))
-am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
-am__v_lt_0 = --silent
-DEFAULT_INCLUDES = 
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CXXFLAGS) $(CXXFLAGS)
-AM_V_CXX = $(am__v_CXX_$(V))
-am__v_CXX_ = $(am__v_CXX_$(AM_DEFAULT_VERBOSITY))
-am__v_CXX_0 = @echo "  CXX   " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
-	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CXXLD = $(am__v_CXXLD_$(V))
-am__v_CXXLD_ = $(am__v_CXXLD_$(AM_DEFAULT_VERBOSITY))
-am__v_CXXLD_0 = @echo "  CXXLD " $@;
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_$(V))
-am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
-am__v_CC_0 = @echo "  CC    " $@;
-CCLD = $(CC)
-LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_$(V))
-am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
-am__v_CCLD_0 = @echo "  CCLD  " $@;
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
-SOURCES = $(extract_interface_SOURCES)
-DIST_SOURCES = $(extract_interface_SOURCES)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CLANG_CXXFLAGS = @CLANG_CXXFLAGS@
-CLANG_LDFLAGS = @CLANG_LDFLAGS@
-CLANG_LIBS = @CLANG_LIBS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GIT_HEAD = @GIT_HEAD@
-GIT_HEAD_ID = @GIT_HEAD_ID@
-GIT_HEAD_VERSION = @GIT_HEAD_VERSION@
-GMP_CPPFLAGS = @GMP_CPPFLAGS@
-GMP_LDFLAGS = @GMP_LDFLAGS@
-GMP_LIBS = @GMP_LIBS@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PDFLATEX = @PDFLATEX@
-PERL = @PERL@
-PIPLIB_CPPFLAGS = @PIPLIB_CPPFLAGS@
-PIPLIB_LDFLAGS = @PIPLIB_LDFLAGS@
-PIPLIB_LIBS = @PIPLIB_LIBS@
-POD2HTML = @POD2HTML@
-PRTDIAG = @PRTDIAG@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-WARNING_FLAGS = @WARNING_FLAGS@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-llvm_config_found = @llvm_config_found@
-localedir = @localedir@
-localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-pkgconfig_libdir = @pkgconfig_libdir@
-pkgconfig_libfile = @pkgconfig_libfile@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-versioninfo = @versioninfo@
-AUTOMAKE_OPTIONS = nostdinc
-AM_CXXFLAGS = $(CLANG_CXXFLAGS)
-AM_LDFLAGS = $(CLANG_LDFLAGS)
-INCLUDES = -I$(top_builddir) -I$(top_srcdir) \
-	-I$(top_builddir)/include -I$(top_srcdir)/include
-
-extract_interface_SOURCES = \
-	python.h \
-	python.cc \
-	extract_interface.h \
-	extract_interface.cc
-
-extract_interface_LDADD = \
-	-lclangFrontend -lclangSerialization -lclangParse -lclangSema \
-	-lclangAnalysis -lclangAST -lclangLex -lclangBasic -lclangDriver \
-	$(CLANG_LIBS) $(CLANG_LDFLAGS)
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .cc .lo .o .obj
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interface/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign interface/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-clean-noinstPROGRAMS:
-	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
-	echo " rm -f" $$list; \
-	rm -f $$list || exit $$?; \
-	test -n "$(EXEEXT)" || exit 0; \
-	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
-	echo " rm -f" $$list; \
-	rm -f $$list
-extract_interface$(EXEEXT): $(extract_interface_OBJECTS) $(extract_interface_DEPENDENCIES) 
-	@rm -f extract_interface$(EXEEXT)
-	$(AM_V_CXXLD)$(CXXLINK) $(extract_interface_OBJECTS) $(extract_interface_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extract_interface.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/python.Po@am__quote@
-
-.cc.o:
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCXX_FALSE@	$(AM_V_CXX) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
-
-.cc.obj:
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCXX_FALSE@	$(AM_V_CXX) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.cc.lo:
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@am__fastdepCXX_FALSE@	$(AM_V_CXX) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-	$(MAKE) $(AM_MAKEFLAGS) \
-	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
-	  dist-hook
-check-am: all-am
-check: check-am
-all-am: Makefile $(PROGRAMS)
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
-	mostlyclean-am
-
-distclean: distclean-am
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool clean-noinstPROGRAMS ctags dist-hook distclean \
-	distclean-compile distclean-generic distclean-libtool \
-	distclean-tags distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-	pdf pdf-am ps ps-am tags uninstall uninstall-am
-
-
-test: extract_interface
-	./extract_interface$(EXEEXT) $(INCLUDES) $(srcdir)/all.h
-
-isl.py: extract_interface isl.py.top
-	(cat $(srcdir)/isl.py.top; \
-		./extract_interface$(EXEEXT) $(INCLUDES) $(srcdir)/all.h) \
-			> isl.py
-
-dist-hook: isl.py
-	cp isl.py $(distdir)/
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/cloog-0.17.0/isl/interface/extract_interface.cc b/cloog-0.17.0/isl/interface/extract_interface.cc
deleted file mode 100644
index b2126a3..0000000
--- a/cloog-0.17.0/isl/interface/extract_interface.cc
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright 2011 Sven Verdoolaege. All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 
- *    1. Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- * 
- *    2. Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY SVEN VERDOOLAEGE ''AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SVEN VERDOOLAEGE OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- * 
- * The views and conclusions contained in the software and documentation
- * are those of the authors and should not be interpreted as
- * representing official policies, either expressed or implied, of
- * Sven Verdoolaege.
- */ 
-
-#include <assert.h>
-#include <iostream>
-#include <llvm/Support/raw_ostream.h>
-#include <llvm/Support/CommandLine.h>
-#include <llvm/Support/Host.h>
-#include <llvm/Support/ManagedStatic.h>
-#include <clang/AST/ASTContext.h>
-#include <clang/AST/ASTConsumer.h>
-#include <clang/Basic/FileSystemOptions.h>
-#include <clang/Basic/FileManager.h>
-#include <clang/Basic/TargetOptions.h>
-#include <clang/Basic/TargetInfo.h>
-#include <clang/Basic/Version.h>
-#include <clang/Driver/Compilation.h>
-#include <clang/Driver/Driver.h>
-#include <clang/Driver/Tool.h>
-#include <clang/Frontend/CompilerInstance.h>
-#include <clang/Frontend/CompilerInvocation.h>
-#include <clang/Frontend/DiagnosticOptions.h>
-#include <clang/Frontend/TextDiagnosticPrinter.h>
-#include <clang/Frontend/Utils.h>
-#include <clang/Lex/HeaderSearch.h>
-#include <clang/Lex/Preprocessor.h>
-#include <clang/Parse/ParseAST.h>
-#include <clang/Sema/Sema.h>
-
-#include "isl_config.h"
-#include "extract_interface.h"
-#include "python.h"
-
-using namespace std;
-using namespace clang;
-using namespace clang::driver;
-
-static llvm::cl::opt<string> InputFilename(llvm::cl::Positional,
-			llvm::cl::Required, llvm::cl::desc("<input file>"));
-static llvm::cl::list<string> Includes("I",
-			llvm::cl::desc("Header search path"),
-			llvm::cl::value_desc("path"), llvm::cl::Prefix);
-
-static const char *ResourceDir = CLANG_PREFIX"/lib/clang/"CLANG_VERSION_STRING;
-
-/* Does decl have an attribute of the following form?
- *
- *	__attribute__((annotate("name")))
- */
-bool has_annotation(Decl *decl, const char *name)
-{
-	if (!decl->hasAttrs())
-		return false;
-
-	AttrVec attrs = decl->getAttrs();
-	for (AttrVec::const_iterator i = attrs.begin() ; i != attrs.end(); ++i) {
-		const AnnotateAttr *ann = dyn_cast<AnnotateAttr>(*i);
-		if (!ann)
-			continue;
-		if (ann->getAnnotation().str() == name)
-			return true;
-	}
-
-	return false;
-}
-
-/* Is decl marked as exported?
- */
-static bool is_exported(Decl *decl)
-{
-	return has_annotation(decl, "isl_export");
-}
-
-/* Collect all types and functions that are annotated "isl_export"
- * in "types" and "function".
- *
- * We currently only consider single declarations.
- */
-struct MyASTConsumer : public ASTConsumer {
-	set<RecordDecl *> types;
-	set<FunctionDecl *> functions;
-
-	virtual void HandleTopLevelDecl(DeclGroupRef D) {
-		Decl *decl;
-
-		if (!D.isSingleDecl())
-			return;
-		decl = D.getSingleDecl();
-		if (!is_exported(decl))
-			return;
-		switch (decl->getKind()) {
-		case Decl::Record:
-			types.insert(cast<RecordDecl>(decl));
-			break;
-		case Decl::Function:
-			functions.insert(cast<FunctionDecl>(decl));
-			break;
-		default:
-			break;
-		}
-	}
-};
-
-#ifdef USE_ARRAYREF
-
-#ifdef HAVE_CXXISPRODUCTION
-static Driver *construct_driver(const char *binary, DiagnosticsEngine &Diags)
-{
-	return new Driver(binary, llvm::sys::getDefaultTargetTriple(),
-			    "", false, false, Diags);
-}
-#else
-static Driver *construct_driver(const char *binary, DiagnosticsEngine &Diags)
-{
-	return new Driver(binary, llvm::sys::getDefaultTargetTriple(),
-			    "", false, Diags);
-}
-#endif
-
-/* Create a CompilerInvocation object that stores the command line
- * arguments constructed by the driver.
- * The arguments are mainly useful for setting up the system include
- * paths on newer clangs and on some platforms.
- */
-static CompilerInvocation *construct_invocation(const char *filename,
-	DiagnosticsEngine &Diags)
-{
-	const char *binary = CLANG_PREFIX"/bin/clang";
-	const llvm::OwningPtr<Driver> driver(construct_driver(binary, Diags));
-	std::vector<const char *> Argv;
-	Argv.push_back(binary);
-	Argv.push_back(filename);
-	const llvm::OwningPtr<Compilation> compilation(
-		driver->BuildCompilation(llvm::ArrayRef<const char *>(Argv)));
-	JobList &Jobs = compilation->getJobs();
-
-	Command *cmd = cast<Command>(*Jobs.begin());
-	if (strcmp(cmd->getCreator().getName(), "clang"))
-		return NULL;
-
-	const ArgStringList *args = &cmd->getArguments();
-
-	CompilerInvocation *invocation = new CompilerInvocation;
-	CompilerInvocation::CreateFromArgs(*invocation, args->data() + 1,
-						args->data() + args->size(),
-						Diags);
-	return invocation;
-}
-
-#else
-
-static CompilerInvocation *construct_invocation(const char *filename,
-	DiagnosticsEngine &Diags)
-{
-	return NULL;
-}
-
-#endif
-
-int main(int argc, char *argv[])
-{
-	llvm::cl::ParseCommandLineOptions(argc, argv);
-
-	CompilerInstance *Clang = new CompilerInstance();
-	DiagnosticOptions DO;
-	Clang->createDiagnostics(0, NULL,
-				new TextDiagnosticPrinter(llvm::errs(), DO));
-	DiagnosticsEngine &Diags = Clang->getDiagnostics();
-	Diags.setSuppressSystemWarnings(true);
-	CompilerInvocation *invocation =
-		construct_invocation(InputFilename.c_str(), Diags);
-	if (invocation)
-		Clang->setInvocation(invocation);
-	Clang->createFileManager();
-	Clang->createSourceManager(Clang->getFileManager());
-	TargetOptions TO;
-	TO.Triple = llvm::sys::getDefaultTargetTriple();
-	TargetInfo *target = TargetInfo::CreateTargetInfo(Diags, TO);
-	Clang->setTarget(target);
-	CompilerInvocation::setLangDefaults(Clang->getLangOpts(), IK_C,
-					    LangStandard::lang_unspecified);
-	HeaderSearchOptions &HSO = Clang->getHeaderSearchOpts();
-	LangOptions &LO = Clang->getLangOpts();
-	PreprocessorOptions &PO = Clang->getPreprocessorOpts();
-	HSO.ResourceDir = ResourceDir;
-
-	for (int i = 0; i < Includes.size(); ++i)
-		HSO.AddPath(Includes[i], frontend::Angled, true, false, false);
-
-	PO.addMacroDef("__isl_give=__attribute__((annotate(\"isl_give\")))");
-	PO.addMacroDef("__isl_keep=__attribute__((annotate(\"isl_keep\")))");
-	PO.addMacroDef("__isl_take=__attribute__((annotate(\"isl_take\")))");
-	PO.addMacroDef("__isl_export=__attribute__((annotate(\"isl_export\")))");
-	PO.addMacroDef("__isl_constructor=__attribute__((annotate(\"isl_constructor\"))) __attribute__((annotate(\"isl_export\")))");
-	PO.addMacroDef("__isl_subclass(super)=__attribute__((annotate(\"isl_subclass(\" #super \")\"))) __attribute__((annotate(\"isl_export\")))");
-
-	Clang->createPreprocessor();
-	Preprocessor &PP = Clang->getPreprocessor();
-
-	PP.getBuiltinInfo().InitializeBuiltins(PP.getIdentifierTable(), LO);
-
-	const FileEntry *file = Clang->getFileManager().getFile(InputFilename);
-	assert(file);
-	Clang->getSourceManager().createMainFileID(file);
-
-	Clang->createASTContext();
-	MyASTConsumer consumer;
-	Sema *sema = new Sema(PP, Clang->getASTContext(), consumer);
-
-	Diags.getClient()->BeginSourceFile(LO, &PP);
-	ParseAST(*sema);
-	Diags.getClient()->EndSourceFile();
-
-	generate_python(consumer.types, consumer.functions);
-
-	delete sema;
-	delete Clang;
-	llvm::llvm_shutdown();
-
-	return 0;
-}
diff --git a/cloog-0.17.0/isl/interface/extract_interface.h b/cloog-0.17.0/isl/interface/extract_interface.h
deleted file mode 100644
index b6788f1..0000000
--- a/cloog-0.17.0/isl/interface/extract_interface.h
+++ /dev/null
@@ -1,3 +0,0 @@
-#include <clang/AST/Decl.h>
-
-bool has_annotation(clang::Decl *decl, const char *name);
diff --git a/cloog-0.17.0/isl/interface/isl.py b/cloog-0.17.0/isl/interface/isl.py
deleted file mode 100644
index 98eeb47..0000000
--- a/cloog-0.17.0/isl/interface/isl.py
+++ /dev/null
@@ -1,1091 +0,0 @@
-from ctypes import *
-
-isl = cdll.LoadLibrary("libisl.so")
-libc = cdll.LoadLibrary("libc.so.6")
-
-class Error(Exception):
-    pass
-
-class Context:
-    defaultInstance = None
-
-    def __init__(self):
-        ptr = isl.isl_ctx_alloc()
-        self.ptr = ptr
-
-    def __del__(self):
-        isl.isl_ctx_free(self)
-
-    def from_param(self):
-        return self.ptr
-
-    @staticmethod
-    def getDefaultInstance():
-        if Context.defaultInstance == None:
-            Context.defaultInstance = Context()
-        return Context.defaultInstance
-
-isl.isl_ctx_alloc.restype = c_void_p
-isl.isl_ctx_free.argtypes = [Context]
-
-class union_map:
-    def __init__(self, *args, **keywords):
-        if "ptr" in keywords:
-            self.ctx = keywords["ctx"]
-            self.ptr = keywords["ptr"]
-            return
-        if len(args) == 1 and args[0].__class__ is map:
-            self.ctx = Context.getDefaultInstance()
-            self.ptr = isl.isl_union_map_from_map(isl.isl_map_copy(args[0].ptr))
-            return
-        if len(args) == 1 and type(args[0]) == str:
-            self.ctx = Context.getDefaultInstance()
-            self.ptr = isl.isl_union_map_read_from_str(self.ctx, args[0])
-            return
-        raise Error
-    def __del__(self):
-        if hasattr(self, 'ptr'):
-            isl.isl_union_map_free(self.ptr)
-    def __str__(self):
-        ptr = isl.isl_union_map_to_str(self.ptr)
-        res = str(cast(ptr, c_char_p).value)
-        libc.free(ptr)
-        return res
-    def __repr__(self):
-        return 'isl.union_map("%s")' % str(self)
-    def affine_hull(self):
-        res = isl.isl_union_map_affine_hull(isl.isl_union_map_copy(self.ptr))
-        return union_map(ctx=self.ctx, ptr=res)
-    def polyhedral_hull(self):
-        res = isl.isl_union_map_polyhedral_hull(isl.isl_union_map_copy(self.ptr))
-        return union_map(ctx=self.ctx, ptr=res)
-    def coalesce(self):
-        res = isl.isl_union_map_coalesce(isl.isl_union_map_copy(self.ptr))
-        return union_map(ctx=self.ctx, ptr=res)
-    def lexmin(self):
-        res = isl.isl_union_map_lexmin(isl.isl_union_map_copy(self.ptr))
-        return union_map(ctx=self.ctx, ptr=res)
-    def lexmax(self):
-        res = isl.isl_union_map_lexmax(isl.isl_union_map_copy(self.ptr))
-        return union_map(ctx=self.ctx, ptr=res)
-    def union(self, arg1):
-        try:
-            if not arg1.__class__ is union_map:
-                arg1 = union_map(arg1)
-        except:
-            raise
-        res = isl.isl_union_map_union(isl.isl_union_map_copy(self.ptr), isl.isl_union_map_copy(arg1.ptr))
-        return union_map(ctx=self.ctx, ptr=res)
-    def subtract(self, arg1):
-        try:
-            if not arg1.__class__ is union_map:
-                arg1 = union_map(arg1)
-        except:
-            raise
-        res = isl.isl_union_map_subtract(isl.isl_union_map_copy(self.ptr), isl.isl_union_map_copy(arg1.ptr))
-        return union_map(ctx=self.ctx, ptr=res)
-    def intersect(self, arg1):
-        try:
-            if not arg1.__class__ is union_map:
-                arg1 = union_map(arg1)
-        except:
-            raise
-        res = isl.isl_union_map_intersect(isl.isl_union_map_copy(self.ptr), isl.isl_union_map_copy(arg1.ptr))
-        return union_map(ctx=self.ctx, ptr=res)
-    def intersect_params(self, arg1):
-        try:
-            if not arg1.__class__ is set:
-                arg1 = set(arg1)
-        except:
-            raise
-        res = isl.isl_union_map_intersect_params(isl.isl_union_map_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
-        return union_map(ctx=self.ctx, ptr=res)
-    def gist(self, arg1):
-        try:
-            if not arg1.__class__ is union_map:
-                arg1 = union_map(arg1)
-        except:
-            raise
-        res = isl.isl_union_map_gist(isl.isl_union_map_copy(self.ptr), isl.isl_union_map_copy(arg1.ptr))
-        return union_map(ctx=self.ctx, ptr=res)
-    def gist_params(self, arg1):
-        try:
-            if not arg1.__class__ is set:
-                arg1 = set(arg1)
-        except:
-            raise
-        res = isl.isl_union_map_gist_params(isl.isl_union_map_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
-        return union_map(ctx=self.ctx, ptr=res)
-    def gist_domain(self, arg1):
-        try:
-            if not arg1.__class__ is union_set:
-                arg1 = union_set(arg1)
-        except:
-            raise
-        res = isl.isl_union_map_gist_domain(isl.isl_union_map_copy(self.ptr), isl.isl_union_set_copy(arg1.ptr))
-        return union_map(ctx=self.ctx, ptr=res)
-    def intersect_domain(self, arg1):
-        try:
-            if not arg1.__class__ is union_set:
-                arg1 = union_set(arg1)
-        except:
-            raise
-        res = isl.isl_union_map_intersect_domain(isl.isl_union_map_copy(self.ptr), isl.isl_union_set_copy(arg1.ptr))
-        return union_map(ctx=self.ctx, ptr=res)
-    def intersect_range(self, arg1):
-        try:
-            if not arg1.__class__ is union_set:
-                arg1 = union_set(arg1)
-        except:
-            raise
-        res = isl.isl_union_map_intersect_range(isl.isl_union_map_copy(self.ptr), isl.isl_union_set_copy(arg1.ptr))
-        return union_map(ctx=self.ctx, ptr=res)
-    def apply_domain(self, arg1):
-        try:
-            if not arg1.__class__ is union_map:
-                arg1 = union_map(arg1)
-        except:
-            raise
-        res = isl.isl_union_map_apply_domain(isl.isl_union_map_copy(self.ptr), isl.isl_union_map_copy(arg1.ptr))
-        return union_map(ctx=self.ctx, ptr=res)
-    def apply_range(self, arg1):
-        try:
-            if not arg1.__class__ is union_map:
-                arg1 = union_map(arg1)
-        except:
-            raise
-        res = isl.isl_union_map_apply_range(isl.isl_union_map_copy(self.ptr), isl.isl_union_map_copy(arg1.ptr))
-        return union_map(ctx=self.ctx, ptr=res)
-    def reverse(self):
-        res = isl.isl_union_map_reverse(isl.isl_union_map_copy(self.ptr))
-        return union_map(ctx=self.ctx, ptr=res)
-    def detect_equalities(self):
-        res = isl.isl_union_map_detect_equalities(self.ptr)
-        return union_map(ctx=self.ctx, ptr=res)
-    def deltas(self):
-        res = isl.isl_union_map_deltas(isl.isl_union_map_copy(self.ptr))
-        return union_set(ctx=self.ctx, ptr=res)
-    def is_empty(self):
-        res = isl.isl_union_map_is_empty(self.ptr)
-        return res
-    def is_single_valued(self):
-        res = isl.isl_union_map_is_single_valued(self.ptr)
-        return res
-    def is_injective(self):
-        res = isl.isl_union_map_is_injective(self.ptr)
-        return res
-    def is_bijective(self):
-        res = isl.isl_union_map_is_bijective(self.ptr)
-        return res
-    def is_subset(self, arg1):
-        try:
-            if not arg1.__class__ is union_map:
-                arg1 = union_map(arg1)
-        except:
-            raise
-        res = isl.isl_union_map_is_subset(self.ptr, arg1.ptr)
-        return res
-    def is_equal(self, arg1):
-        try:
-            if not arg1.__class__ is union_map:
-                arg1 = union_map(arg1)
-        except:
-            raise
-        res = isl.isl_union_map_is_equal(self.ptr, arg1.ptr)
-        return res
-    def is_strict_subset(self, arg1):
-        try:
-            if not arg1.__class__ is union_map:
-                arg1 = union_map(arg1)
-        except:
-            raise
-        res = isl.isl_union_map_is_strict_subset(self.ptr, arg1.ptr)
-        return res
-    def foreach_map(self, arg1):
-        exc_info = [None]
-        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
-        def cb_func(cb_arg0, cb_arg1):
-            cb_arg0 = map(ctx=self.ctx, ptr=cb_arg0)
-            try:
-                arg1(cb_arg0)
-            except:
-                import sys
-                exc_info[0] = sys.exc_info()
-                return -1
-            return 0
-        cb = fn(cb_func)
-        res = isl.isl_union_map_foreach_map(self.ptr, cb, None)
-        if exc_info[0] != None:
-            raise exc_info[0][0], exc_info[0][1], exc_info[0][2]
-        return res
-
-isl.isl_union_map_from_map.restype = c_void_p
-isl.isl_union_map_from_map.argtypes = [c_void_p]
-isl.isl_union_map_read_from_str.restype = c_void_p
-isl.isl_union_map_read_from_str.argtypes = [Context, c_char_p]
-isl.isl_union_map_affine_hull.restype = c_void_p
-isl.isl_union_map_polyhedral_hull.restype = c_void_p
-isl.isl_union_map_coalesce.restype = c_void_p
-isl.isl_union_map_lexmin.restype = c_void_p
-isl.isl_union_map_lexmax.restype = c_void_p
-isl.isl_union_map_union.restype = c_void_p
-isl.isl_union_map_subtract.restype = c_void_p
-isl.isl_union_map_intersect.restype = c_void_p
-isl.isl_union_map_intersect_params.restype = c_void_p
-isl.isl_union_map_gist.restype = c_void_p
-isl.isl_union_map_gist_params.restype = c_void_p
-isl.isl_union_map_gist_domain.restype = c_void_p
-isl.isl_union_map_intersect_domain.restype = c_void_p
-isl.isl_union_map_intersect_range.restype = c_void_p
-isl.isl_union_map_apply_domain.restype = c_void_p
-isl.isl_union_map_apply_range.restype = c_void_p
-isl.isl_union_map_reverse.restype = c_void_p
-isl.isl_union_map_detect_equalities.restype = c_void_p
-isl.isl_union_map_deltas.restype = c_void_p
-isl.isl_union_map_free.argtypes = [c_void_p]
-isl.isl_union_map_to_str.argtypes = [c_void_p]
-isl.isl_union_map_to_str.restype = POINTER(c_char)
-
-class map(union_map):
-    def __init__(self, *args, **keywords):
-        if "ptr" in keywords:
-            self.ctx = keywords["ctx"]
-            self.ptr = keywords["ptr"]
-            return
-        if len(args) == 1 and type(args[0]) == str:
-            self.ctx = Context.getDefaultInstance()
-            self.ptr = isl.isl_map_read_from_str(self.ctx, args[0])
-            return
-        if len(args) == 1 and args[0].__class__ is basic_map:
-            self.ctx = Context.getDefaultInstance()
-            self.ptr = isl.isl_map_from_basic_map(isl.isl_basic_map_copy(args[0].ptr))
-            return
-        raise Error
-    def __del__(self):
-        if hasattr(self, 'ptr'):
-            isl.isl_map_free(self.ptr)
-    def __str__(self):
-        ptr = isl.isl_map_to_str(self.ptr)
-        res = str(cast(ptr, c_char_p).value)
-        libc.free(ptr)
-        return res
-    def __repr__(self):
-        return 'isl.map("%s")' % str(self)
-    def lexmin(self):
-        res = isl.isl_map_lexmin(isl.isl_map_copy(self.ptr))
-        return map(ctx=self.ctx, ptr=res)
-    def lexmax(self):
-        res = isl.isl_map_lexmax(isl.isl_map_copy(self.ptr))
-        return map(ctx=self.ctx, ptr=res)
-    def reverse(self):
-        res = isl.isl_map_reverse(isl.isl_map_copy(self.ptr))
-        return map(ctx=self.ctx, ptr=res)
-    def union(self, arg1):
-        try:
-            if not arg1.__class__ is map:
-                arg1 = map(arg1)
-        except:
-            return union_map(self).union(arg1)
-        res = isl.isl_map_union(isl.isl_map_copy(self.ptr), isl.isl_map_copy(arg1.ptr))
-        return map(ctx=self.ctx, ptr=res)
-    def intersect_domain(self, arg1):
-        try:
-            if not arg1.__class__ is set:
-                arg1 = set(arg1)
-        except:
-            return union_map(self).intersect_domain(arg1)
-        res = isl.isl_map_intersect_domain(isl.isl_map_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
-        return map(ctx=self.ctx, ptr=res)
-    def intersect_range(self, arg1):
-        try:
-            if not arg1.__class__ is set:
-                arg1 = set(arg1)
-        except:
-            return union_map(self).intersect_range(arg1)
-        res = isl.isl_map_intersect_range(isl.isl_map_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
-        return map(ctx=self.ctx, ptr=res)
-    def apply_domain(self, arg1):
-        try:
-            if not arg1.__class__ is map:
-                arg1 = map(arg1)
-        except:
-            return union_map(self).apply_domain(arg1)
-        res = isl.isl_map_apply_domain(isl.isl_map_copy(self.ptr), isl.isl_map_copy(arg1.ptr))
-        return map(ctx=self.ctx, ptr=res)
-    def apply_range(self, arg1):
-        try:
-            if not arg1.__class__ is map:
-                arg1 = map(arg1)
-        except:
-            return union_map(self).apply_range(arg1)
-        res = isl.isl_map_apply_range(isl.isl_map_copy(self.ptr), isl.isl_map_copy(arg1.ptr))
-        return map(ctx=self.ctx, ptr=res)
-    def intersect(self, arg1):
-        try:
-            if not arg1.__class__ is map:
-                arg1 = map(arg1)
-        except:
-            return union_map(self).intersect(arg1)
-        res = isl.isl_map_intersect(isl.isl_map_copy(self.ptr), isl.isl_map_copy(arg1.ptr))
-        return map(ctx=self.ctx, ptr=res)
-    def intersect_params(self, arg1):
-        try:
-            if not arg1.__class__ is set:
-                arg1 = set(arg1)
-        except:
-            return union_map(self).intersect_params(arg1)
-        res = isl.isl_map_intersect_params(isl.isl_map_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
-        return map(ctx=self.ctx, ptr=res)
-    def subtract(self, arg1):
-        try:
-            if not arg1.__class__ is map:
-                arg1 = map(arg1)
-        except:
-            return union_map(self).subtract(arg1)
-        res = isl.isl_map_subtract(isl.isl_map_copy(self.ptr), isl.isl_map_copy(arg1.ptr))
-        return map(ctx=self.ctx, ptr=res)
-    def deltas(self):
-        res = isl.isl_map_deltas(isl.isl_map_copy(self.ptr))
-        return set(ctx=self.ctx, ptr=res)
-    def detect_equalities(self):
-        res = isl.isl_map_detect_equalities(isl.isl_map_copy(self.ptr))
-        return map(ctx=self.ctx, ptr=res)
-    def affine_hull(self):
-        res = isl.isl_map_affine_hull(isl.isl_map_copy(self.ptr))
-        return basic_map(ctx=self.ctx, ptr=res)
-    def polyhedral_hull(self):
-        res = isl.isl_map_polyhedral_hull(isl.isl_map_copy(self.ptr))
-        return basic_map(ctx=self.ctx, ptr=res)
-    def flatten(self):
-        res = isl.isl_map_flatten(isl.isl_map_copy(self.ptr))
-        return map(ctx=self.ctx, ptr=res)
-    def flatten_domain(self):
-        res = isl.isl_map_flatten_domain(isl.isl_map_copy(self.ptr))
-        return map(ctx=self.ctx, ptr=res)
-    def flatten_range(self):
-        res = isl.isl_map_flatten_range(isl.isl_map_copy(self.ptr))
-        return map(ctx=self.ctx, ptr=res)
-    def sample(self):
-        res = isl.isl_map_sample(isl.isl_map_copy(self.ptr))
-        return basic_map(ctx=self.ctx, ptr=res)
-    def is_empty(self):
-        res = isl.isl_map_is_empty(self.ptr)
-        return res
-    def is_subset(self, arg1):
-        try:
-            if not arg1.__class__ is map:
-                arg1 = map(arg1)
-        except:
-            return union_map(self).is_subset(arg1)
-        res = isl.isl_map_is_subset(self.ptr, arg1.ptr)
-        return res
-    def is_strict_subset(self, arg1):
-        try:
-            if not arg1.__class__ is map:
-                arg1 = map(arg1)
-        except:
-            return union_map(self).is_strict_subset(arg1)
-        res = isl.isl_map_is_strict_subset(self.ptr, arg1.ptr)
-        return res
-    def is_equal(self, arg1):
-        try:
-            if not arg1.__class__ is map:
-                arg1 = map(arg1)
-        except:
-            return union_map(self).is_equal(arg1)
-        res = isl.isl_map_is_equal(self.ptr, arg1.ptr)
-        return res
-    def is_single_valued(self):
-        res = isl.isl_map_is_single_valued(self.ptr)
-        return res
-    def is_injective(self):
-        res = isl.isl_map_is_injective(self.ptr)
-        return res
-    def is_bijective(self):
-        res = isl.isl_map_is_bijective(self.ptr)
-        return res
-    def gist(self, arg1):
-        try:
-            if not arg1.__class__ is map:
-                arg1 = map(arg1)
-        except:
-            return union_map(self).gist(arg1)
-        res = isl.isl_map_gist(isl.isl_map_copy(self.ptr), isl.isl_map_copy(arg1.ptr))
-        return map(ctx=self.ctx, ptr=res)
-    def gist_domain(self, arg1):
-        try:
-            if not arg1.__class__ is set:
-                arg1 = set(arg1)
-        except:
-            return union_map(self).gist_domain(arg1)
-        res = isl.isl_map_gist_domain(isl.isl_map_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
-        return map(ctx=self.ctx, ptr=res)
-    def coalesce(self):
-        res = isl.isl_map_coalesce(isl.isl_map_copy(self.ptr))
-        return map(ctx=self.ctx, ptr=res)
-    def foreach_basic_map(self, arg1):
-        exc_info = [None]
-        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
-        def cb_func(cb_arg0, cb_arg1):
-            cb_arg0 = basic_map(ctx=self.ctx, ptr=cb_arg0)
-            try:
-                arg1(cb_arg0)
-            except:
-                import sys
-                exc_info[0] = sys.exc_info()
-                return -1
-            return 0
-        cb = fn(cb_func)
-        res = isl.isl_map_foreach_basic_map(self.ptr, cb, None)
-        if exc_info[0] != None:
-            raise exc_info[0][0], exc_info[0][1], exc_info[0][2]
-        return res
-
-isl.isl_map_read_from_str.restype = c_void_p
-isl.isl_map_read_from_str.argtypes = [Context, c_char_p]
-isl.isl_map_from_basic_map.restype = c_void_p
-isl.isl_map_from_basic_map.argtypes = [c_void_p]
-isl.isl_map_lexmin.restype = c_void_p
-isl.isl_map_lexmax.restype = c_void_p
-isl.isl_map_reverse.restype = c_void_p
-isl.isl_map_union.restype = c_void_p
-isl.isl_map_intersect_domain.restype = c_void_p
-isl.isl_map_intersect_range.restype = c_void_p
-isl.isl_map_apply_domain.restype = c_void_p
-isl.isl_map_apply_range.restype = c_void_p
-isl.isl_map_intersect.restype = c_void_p
-isl.isl_map_intersect_params.restype = c_void_p
-isl.isl_map_subtract.restype = c_void_p
-isl.isl_map_deltas.restype = c_void_p
-isl.isl_map_detect_equalities.restype = c_void_p
-isl.isl_map_affine_hull.restype = c_void_p
-isl.isl_map_polyhedral_hull.restype = c_void_p
-isl.isl_map_flatten.restype = c_void_p
-isl.isl_map_flatten_domain.restype = c_void_p
-isl.isl_map_flatten_range.restype = c_void_p
-isl.isl_map_sample.restype = c_void_p
-isl.isl_map_gist.restype = c_void_p
-isl.isl_map_gist_domain.restype = c_void_p
-isl.isl_map_coalesce.restype = c_void_p
-isl.isl_map_free.argtypes = [c_void_p]
-isl.isl_map_to_str.argtypes = [c_void_p]
-isl.isl_map_to_str.restype = POINTER(c_char)
-
-class basic_map(map):
-    def __init__(self, *args, **keywords):
-        if "ptr" in keywords:
-            self.ctx = keywords["ctx"]
-            self.ptr = keywords["ptr"]
-            return
-        if len(args) == 1 and type(args[0]) == str:
-            self.ctx = Context.getDefaultInstance()
-            self.ptr = isl.isl_basic_map_read_from_str(self.ctx, args[0])
-            return
-        raise Error
-    def __del__(self):
-        if hasattr(self, 'ptr'):
-            isl.isl_basic_map_free(self.ptr)
-    def __str__(self):
-        ptr = isl.isl_basic_map_to_str(self.ptr)
-        res = str(cast(ptr, c_char_p).value)
-        libc.free(ptr)
-        return res
-    def __repr__(self):
-        return 'isl.basic_map("%s")' % str(self)
-    def intersect_domain(self, arg1):
-        try:
-            if not arg1.__class__ is basic_set:
-                arg1 = basic_set(arg1)
-        except:
-            return map(self).intersect_domain(arg1)
-        res = isl.isl_basic_map_intersect_domain(isl.isl_basic_map_copy(self.ptr), isl.isl_basic_set_copy(arg1.ptr))
-        return basic_map(ctx=self.ctx, ptr=res)
-    def intersect_range(self, arg1):
-        try:
-            if not arg1.__class__ is basic_set:
-                arg1 = basic_set(arg1)
-        except:
-            return map(self).intersect_range(arg1)
-        res = isl.isl_basic_map_intersect_range(isl.isl_basic_map_copy(self.ptr), isl.isl_basic_set_copy(arg1.ptr))
-        return basic_map(ctx=self.ctx, ptr=res)
-    def intersect(self, arg1):
-        try:
-            if not arg1.__class__ is basic_map:
-                arg1 = basic_map(arg1)
-        except:
-            return map(self).intersect(arg1)
-        res = isl.isl_basic_map_intersect(isl.isl_basic_map_copy(self.ptr), isl.isl_basic_map_copy(arg1.ptr))
-        return basic_map(ctx=self.ctx, ptr=res)
-    def union(self, arg1):
-        try:
-            if not arg1.__class__ is basic_map:
-                arg1 = basic_map(arg1)
-        except:
-            return map(self).union(arg1)
-        res = isl.isl_basic_map_union(isl.isl_basic_map_copy(self.ptr), isl.isl_basic_map_copy(arg1.ptr))
-        return map(ctx=self.ctx, ptr=res)
-    def apply_domain(self, arg1):
-        try:
-            if not arg1.__class__ is basic_map:
-                arg1 = basic_map(arg1)
-        except:
-            return map(self).apply_domain(arg1)
-        res = isl.isl_basic_map_apply_domain(isl.isl_basic_map_copy(self.ptr), isl.isl_basic_map_copy(arg1.ptr))
-        return basic_map(ctx=self.ctx, ptr=res)
-    def apply_range(self, arg1):
-        try:
-            if not arg1.__class__ is basic_map:
-                arg1 = basic_map(arg1)
-        except:
-            return map(self).apply_range(arg1)
-        res = isl.isl_basic_map_apply_range(isl.isl_basic_map_copy(self.ptr), isl.isl_basic_map_copy(arg1.ptr))
-        return basic_map(ctx=self.ctx, ptr=res)
-    def affine_hull(self):
-        res = isl.isl_basic_map_affine_hull(isl.isl_basic_map_copy(self.ptr))
-        return basic_map(ctx=self.ctx, ptr=res)
-    def reverse(self):
-        res = isl.isl_basic_map_reverse(isl.isl_basic_map_copy(self.ptr))
-        return basic_map(ctx=self.ctx, ptr=res)
-    def sample(self):
-        res = isl.isl_basic_map_sample(isl.isl_basic_map_copy(self.ptr))
-        return basic_map(ctx=self.ctx, ptr=res)
-    def detect_equalities(self):
-        res = isl.isl_basic_map_detect_equalities(isl.isl_basic_map_copy(self.ptr))
-        return basic_map(ctx=self.ctx, ptr=res)
-    def is_equal(self, arg1):
-        try:
-            if not arg1.__class__ is basic_map:
-                arg1 = basic_map(arg1)
-        except:
-            return map(self).is_equal(arg1)
-        res = isl.isl_basic_map_is_equal(self.ptr, arg1.ptr)
-        return res
-    def lexmin(self):
-        res = isl.isl_basic_map_lexmin(isl.isl_basic_map_copy(self.ptr))
-        return map(ctx=self.ctx, ptr=res)
-    def lexmax(self):
-        res = isl.isl_basic_map_lexmax(isl.isl_basic_map_copy(self.ptr))
-        return map(ctx=self.ctx, ptr=res)
-    def is_empty(self):
-        res = isl.isl_basic_map_is_empty(self.ptr)
-        return res
-    def deltas(self):
-        res = isl.isl_basic_map_deltas(isl.isl_basic_map_copy(self.ptr))
-        return basic_set(ctx=self.ctx, ptr=res)
-    def flatten(self):
-        res = isl.isl_basic_map_flatten(isl.isl_basic_map_copy(self.ptr))
-        return basic_map(ctx=self.ctx, ptr=res)
-    def flatten_domain(self):
-        res = isl.isl_basic_map_flatten_domain(isl.isl_basic_map_copy(self.ptr))
-        return basic_map(ctx=self.ctx, ptr=res)
-    def flatten_range(self):
-        res = isl.isl_basic_map_flatten_range(isl.isl_basic_map_copy(self.ptr))
-        return basic_map(ctx=self.ctx, ptr=res)
-    def gist(self, arg1):
-        try:
-            if not arg1.__class__ is basic_map:
-                arg1 = basic_map(arg1)
-        except:
-            return map(self).gist(arg1)
-        res = isl.isl_basic_map_gist(isl.isl_basic_map_copy(self.ptr), isl.isl_basic_map_copy(arg1.ptr))
-        return basic_map(ctx=self.ctx, ptr=res)
-
-isl.isl_basic_map_read_from_str.restype = c_void_p
-isl.isl_basic_map_read_from_str.argtypes = [Context, c_char_p]
-isl.isl_basic_map_intersect_domain.restype = c_void_p
-isl.isl_basic_map_intersect_range.restype = c_void_p
-isl.isl_basic_map_intersect.restype = c_void_p
-isl.isl_basic_map_union.restype = c_void_p
-isl.isl_basic_map_apply_domain.restype = c_void_p
-isl.isl_basic_map_apply_range.restype = c_void_p
-isl.isl_basic_map_affine_hull.restype = c_void_p
-isl.isl_basic_map_reverse.restype = c_void_p
-isl.isl_basic_map_sample.restype = c_void_p
-isl.isl_basic_map_detect_equalities.restype = c_void_p
-isl.isl_basic_map_lexmin.restype = c_void_p
-isl.isl_basic_map_lexmax.restype = c_void_p
-isl.isl_basic_map_deltas.restype = c_void_p
-isl.isl_basic_map_flatten.restype = c_void_p
-isl.isl_basic_map_flatten_domain.restype = c_void_p
-isl.isl_basic_map_flatten_range.restype = c_void_p
-isl.isl_basic_map_gist.restype = c_void_p
-isl.isl_basic_map_free.argtypes = [c_void_p]
-isl.isl_basic_map_to_str.argtypes = [c_void_p]
-isl.isl_basic_map_to_str.restype = POINTER(c_char)
-
-class union_set:
-    def __init__(self, *args, **keywords):
-        if "ptr" in keywords:
-            self.ctx = keywords["ctx"]
-            self.ptr = keywords["ptr"]
-            return
-        if len(args) == 1 and args[0].__class__ is set:
-            self.ctx = Context.getDefaultInstance()
-            self.ptr = isl.isl_union_set_from_set(isl.isl_set_copy(args[0].ptr))
-            return
-        if len(args) == 1 and type(args[0]) == str:
-            self.ctx = Context.getDefaultInstance()
-            self.ptr = isl.isl_union_set_read_from_str(self.ctx, args[0])
-            return
-        raise Error
-    def __del__(self):
-        if hasattr(self, 'ptr'):
-            isl.isl_union_set_free(self.ptr)
-    def __str__(self):
-        ptr = isl.isl_union_set_to_str(self.ptr)
-        res = str(cast(ptr, c_char_p).value)
-        libc.free(ptr)
-        return res
-    def __repr__(self):
-        return 'isl.union_set("%s")' % str(self)
-    def identity(self):
-        res = isl.isl_union_set_identity(isl.isl_union_set_copy(self.ptr))
-        return union_map(ctx=self.ctx, ptr=res)
-    def detect_equalities(self):
-        res = isl.isl_union_set_detect_equalities(isl.isl_union_set_copy(self.ptr))
-        return union_set(ctx=self.ctx, ptr=res)
-    def affine_hull(self):
-        res = isl.isl_union_set_affine_hull(isl.isl_union_set_copy(self.ptr))
-        return union_set(ctx=self.ctx, ptr=res)
-    def polyhedral_hull(self):
-        res = isl.isl_union_set_polyhedral_hull(isl.isl_union_set_copy(self.ptr))
-        return union_set(ctx=self.ctx, ptr=res)
-    def coalesce(self):
-        res = isl.isl_union_set_coalesce(isl.isl_union_set_copy(self.ptr))
-        return union_set(ctx=self.ctx, ptr=res)
-    def lexmin(self):
-        res = isl.isl_union_set_lexmin(isl.isl_union_set_copy(self.ptr))
-        return union_set(ctx=self.ctx, ptr=res)
-    def lexmax(self):
-        res = isl.isl_union_set_lexmax(isl.isl_union_set_copy(self.ptr))
-        return union_set(ctx=self.ctx, ptr=res)
-    def subtract(self, arg1):
-        try:
-            if not arg1.__class__ is union_set:
-                arg1 = union_set(arg1)
-        except:
-            raise
-        res = isl.isl_union_set_subtract(isl.isl_union_set_copy(self.ptr), isl.isl_union_set_copy(arg1.ptr))
-        return union_set(ctx=self.ctx, ptr=res)
-    def intersect(self, arg1):
-        try:
-            if not arg1.__class__ is union_set:
-                arg1 = union_set(arg1)
-        except:
-            raise
-        res = isl.isl_union_set_intersect(isl.isl_union_set_copy(self.ptr), isl.isl_union_set_copy(arg1.ptr))
-        return union_set(ctx=self.ctx, ptr=res)
-    def intersect_params(self, arg1):
-        try:
-            if not arg1.__class__ is set:
-                arg1 = set(arg1)
-        except:
-            raise
-        res = isl.isl_union_set_intersect_params(isl.isl_union_set_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
-        return union_set(ctx=self.ctx, ptr=res)
-    def gist(self, arg1):
-        try:
-            if not arg1.__class__ is union_set:
-                arg1 = union_set(arg1)
-        except:
-            raise
-        res = isl.isl_union_set_gist(isl.isl_union_set_copy(self.ptr), isl.isl_union_set_copy(arg1.ptr))
-        return union_set(ctx=self.ctx, ptr=res)
-    def gist_params(self, arg1):
-        try:
-            if not arg1.__class__ is set:
-                arg1 = set(arg1)
-        except:
-            raise
-        res = isl.isl_union_set_gist_params(isl.isl_union_set_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
-        return union_set(ctx=self.ctx, ptr=res)
-    def apply(self, arg1):
-        try:
-            if not arg1.__class__ is union_map:
-                arg1 = union_map(arg1)
-        except:
-            raise
-        res = isl.isl_union_set_apply(isl.isl_union_set_copy(self.ptr), isl.isl_union_map_copy(arg1.ptr))
-        return union_set(ctx=self.ctx, ptr=res)
-    def is_empty(self):
-        res = isl.isl_union_set_is_empty(self.ptr)
-        return res
-    def is_subset(self, arg1):
-        try:
-            if not arg1.__class__ is union_set:
-                arg1 = union_set(arg1)
-        except:
-            raise
-        res = isl.isl_union_set_is_subset(self.ptr, arg1.ptr)
-        return res
-    def is_equal(self, arg1):
-        try:
-            if not arg1.__class__ is union_set:
-                arg1 = union_set(arg1)
-        except:
-            raise
-        res = isl.isl_union_set_is_equal(self.ptr, arg1.ptr)
-        return res
-    def is_strict_subset(self, arg1):
-        try:
-            if not arg1.__class__ is union_set:
-                arg1 = union_set(arg1)
-        except:
-            raise
-        res = isl.isl_union_set_is_strict_subset(self.ptr, arg1.ptr)
-        return res
-    def foreach_set(self, arg1):
-        exc_info = [None]
-        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
-        def cb_func(cb_arg0, cb_arg1):
-            cb_arg0 = set(ctx=self.ctx, ptr=cb_arg0)
-            try:
-                arg1(cb_arg0)
-            except:
-                import sys
-                exc_info[0] = sys.exc_info()
-                return -1
-            return 0
-        cb = fn(cb_func)
-        res = isl.isl_union_set_foreach_set(self.ptr, cb, None)
-        if exc_info[0] != None:
-            raise exc_info[0][0], exc_info[0][1], exc_info[0][2]
-        return res
-
-isl.isl_union_set_from_set.restype = c_void_p
-isl.isl_union_set_from_set.argtypes = [c_void_p]
-isl.isl_union_set_read_from_str.restype = c_void_p
-isl.isl_union_set_read_from_str.argtypes = [Context, c_char_p]
-isl.isl_union_set_identity.restype = c_void_p
-isl.isl_union_set_detect_equalities.restype = c_void_p
-isl.isl_union_set_affine_hull.restype = c_void_p
-isl.isl_union_set_polyhedral_hull.restype = c_void_p
-isl.isl_union_set_coalesce.restype = c_void_p
-isl.isl_union_set_lexmin.restype = c_void_p
-isl.isl_union_set_lexmax.restype = c_void_p
-isl.isl_union_set_subtract.restype = c_void_p
-isl.isl_union_set_intersect.restype = c_void_p
-isl.isl_union_set_intersect_params.restype = c_void_p
-isl.isl_union_set_gist.restype = c_void_p
-isl.isl_union_set_gist_params.restype = c_void_p
-isl.isl_union_set_apply.restype = c_void_p
-isl.isl_union_set_free.argtypes = [c_void_p]
-isl.isl_union_set_to_str.argtypes = [c_void_p]
-isl.isl_union_set_to_str.restype = POINTER(c_char)
-
-class set(union_set):
-    def __init__(self, *args, **keywords):
-        if "ptr" in keywords:
-            self.ctx = keywords["ctx"]
-            self.ptr = keywords["ptr"]
-            return
-        if len(args) == 1 and type(args[0]) == str:
-            self.ctx = Context.getDefaultInstance()
-            self.ptr = isl.isl_set_read_from_str(self.ctx, args[0])
-            return
-        if len(args) == 1 and args[0].__class__ is basic_set:
-            self.ctx = Context.getDefaultInstance()
-            self.ptr = isl.isl_set_from_basic_set(isl.isl_basic_set_copy(args[0].ptr))
-            return
-        raise Error
-    def __del__(self):
-        if hasattr(self, 'ptr'):
-            isl.isl_set_free(self.ptr)
-    def __str__(self):
-        ptr = isl.isl_set_to_str(self.ptr)
-        res = str(cast(ptr, c_char_p).value)
-        libc.free(ptr)
-        return res
-    def __repr__(self):
-        return 'isl.set("%s")' % str(self)
-    def intersect(self, arg1):
-        try:
-            if not arg1.__class__ is set:
-                arg1 = set(arg1)
-        except:
-            return union_set(self).intersect(arg1)
-        res = isl.isl_set_intersect(isl.isl_set_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
-        return set(ctx=self.ctx, ptr=res)
-    def intersect_params(self, arg1):
-        try:
-            if not arg1.__class__ is set:
-                arg1 = set(arg1)
-        except:
-            return union_set(self).intersect_params(arg1)
-        res = isl.isl_set_intersect_params(isl.isl_set_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
-        return set(ctx=self.ctx, ptr=res)
-    def subtract(self, arg1):
-        try:
-            if not arg1.__class__ is set:
-                arg1 = set(arg1)
-        except:
-            return union_set(self).subtract(arg1)
-        res = isl.isl_set_subtract(isl.isl_set_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
-        return set(ctx=self.ctx, ptr=res)
-    def complement(self):
-        res = isl.isl_set_complement(isl.isl_set_copy(self.ptr))
-        return set(ctx=self.ctx, ptr=res)
-    def apply(self, arg1):
-        try:
-            if not arg1.__class__ is map:
-                arg1 = map(arg1)
-        except:
-            return union_set(self).apply(arg1)
-        res = isl.isl_set_apply(isl.isl_set_copy(self.ptr), isl.isl_map_copy(arg1.ptr))
-        return set(ctx=self.ctx, ptr=res)
-    def is_empty(self):
-        res = isl.isl_set_is_empty(self.ptr)
-        return res
-    def is_subset(self, arg1):
-        try:
-            if not arg1.__class__ is set:
-                arg1 = set(arg1)
-        except:
-            return union_set(self).is_subset(arg1)
-        res = isl.isl_set_is_subset(self.ptr, arg1.ptr)
-        return res
-    def is_strict_subset(self, arg1):
-        try:
-            if not arg1.__class__ is set:
-                arg1 = set(arg1)
-        except:
-            return union_set(self).is_strict_subset(arg1)
-        res = isl.isl_set_is_strict_subset(self.ptr, arg1.ptr)
-        return res
-    def is_equal(self, arg1):
-        try:
-            if not arg1.__class__ is set:
-                arg1 = set(arg1)
-        except:
-            return union_set(self).is_equal(arg1)
-        res = isl.isl_set_is_equal(self.ptr, arg1.ptr)
-        return res
-    def gist(self, arg1):
-        try:
-            if not arg1.__class__ is set:
-                arg1 = set(arg1)
-        except:
-            return union_set(self).gist(arg1)
-        res = isl.isl_set_gist(isl.isl_set_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
-        return set(ctx=self.ctx, ptr=res)
-    def coalesce(self):
-        res = isl.isl_set_coalesce(isl.isl_set_copy(self.ptr))
-        return set(ctx=self.ctx, ptr=res)
-    def foreach_basic_set(self, arg1):
-        exc_info = [None]
-        fn = CFUNCTYPE(c_int, c_void_p, c_void_p)
-        def cb_func(cb_arg0, cb_arg1):
-            cb_arg0 = basic_set(ctx=self.ctx, ptr=cb_arg0)
-            try:
-                arg1(cb_arg0)
-            except:
-                import sys
-                exc_info[0] = sys.exc_info()
-                return -1
-            return 0
-        cb = fn(cb_func)
-        res = isl.isl_set_foreach_basic_set(self.ptr, cb, None)
-        if exc_info[0] != None:
-            raise exc_info[0][0], exc_info[0][1], exc_info[0][2]
-        return res
-    def lexmin(self):
-        res = isl.isl_set_lexmin(isl.isl_set_copy(self.ptr))
-        return set(ctx=self.ctx, ptr=res)
-    def lexmax(self):
-        res = isl.isl_set_lexmax(isl.isl_set_copy(self.ptr))
-        return set(ctx=self.ctx, ptr=res)
-    def detect_equalities(self):
-        res = isl.isl_set_detect_equalities(isl.isl_set_copy(self.ptr))
-        return set(ctx=self.ctx, ptr=res)
-    def affine_hull(self):
-        res = isl.isl_set_affine_hull(isl.isl_set_copy(self.ptr))
-        return basic_set(ctx=self.ctx, ptr=res)
-    def polyhedral_hull(self):
-        res = isl.isl_set_polyhedral_hull(isl.isl_set_copy(self.ptr))
-        return basic_set(ctx=self.ctx, ptr=res)
-    def union(self, arg1):
-        try:
-            if not arg1.__class__ is set:
-                arg1 = set(arg1)
-        except:
-            return union_set(self).union(arg1)
-        res = isl.isl_set_union(isl.isl_set_copy(self.ptr), isl.isl_set_copy(arg1.ptr))
-        return set(ctx=self.ctx, ptr=res)
-    def identity(self):
-        res = isl.isl_set_identity(isl.isl_set_copy(self.ptr))
-        return map(ctx=self.ctx, ptr=res)
-    def is_wrapping(self):
-        res = isl.isl_set_is_wrapping(self.ptr)
-        return res
-    def flatten(self):
-        res = isl.isl_set_flatten(isl.isl_set_copy(self.ptr))
-        return set(ctx=self.ctx, ptr=res)
-
-isl.isl_set_read_from_str.restype = c_void_p
-isl.isl_set_read_from_str.argtypes = [Context, c_char_p]
-isl.isl_set_from_basic_set.restype = c_void_p
-isl.isl_set_from_basic_set.argtypes = [c_void_p]
-isl.isl_set_intersect.restype = c_void_p
-isl.isl_set_intersect_params.restype = c_void_p
-isl.isl_set_subtract.restype = c_void_p
-isl.isl_set_complement.restype = c_void_p
-isl.isl_set_apply.restype = c_void_p
-isl.isl_set_gist.restype = c_void_p
-isl.isl_set_coalesce.restype = c_void_p
-isl.isl_set_lexmin.restype = c_void_p
-isl.isl_set_lexmax.restype = c_void_p
-isl.isl_set_detect_equalities.restype = c_void_p
-isl.isl_set_affine_hull.restype = c_void_p
-isl.isl_set_polyhedral_hull.restype = c_void_p
-isl.isl_set_union.restype = c_void_p
-isl.isl_set_identity.restype = c_void_p
-isl.isl_set_flatten.restype = c_void_p
-isl.isl_set_free.argtypes = [c_void_p]
-isl.isl_set_to_str.argtypes = [c_void_p]
-isl.isl_set_to_str.restype = POINTER(c_char)
-
-class basic_set(set):
-    def __init__(self, *args, **keywords):
-        if "ptr" in keywords:
-            self.ctx = keywords["ctx"]
-            self.ptr = keywords["ptr"]
-            return
-        if len(args) == 1 and type(args[0]) == str:
-            self.ctx = Context.getDefaultInstance()
-            self.ptr = isl.isl_basic_set_read_from_str(self.ctx, args[0])
-            return
-        raise Error
-    def __del__(self):
-        if hasattr(self, 'ptr'):
-            isl.isl_basic_set_free(self.ptr)
-    def __str__(self):
-        ptr = isl.isl_basic_set_to_str(self.ptr)
-        res = str(cast(ptr, c_char_p).value)
-        libc.free(ptr)
-        return res
-    def __repr__(self):
-        return 'isl.basic_set("%s")' % str(self)
-    def gist(self, arg1):
-        try:
-            if not arg1.__class__ is basic_set:
-                arg1 = basic_set(arg1)
-        except:
-            return set(self).gist(arg1)
-        res = isl.isl_basic_set_gist(isl.isl_basic_set_copy(self.ptr), isl.isl_basic_set_copy(arg1.ptr))
-        return basic_set(ctx=self.ctx, ptr=res)
-    def intersect(self, arg1):
-        try:
-            if not arg1.__class__ is basic_set:
-                arg1 = basic_set(arg1)
-        except:
-            return set(self).intersect(arg1)
-        res = isl.isl_basic_set_intersect(isl.isl_basic_set_copy(self.ptr), isl.isl_basic_set_copy(arg1.ptr))
-        return basic_set(ctx=self.ctx, ptr=res)
-    def intersect_params(self, arg1):
-        try:
-            if not arg1.__class__ is basic_set:
-                arg1 = basic_set(arg1)
-        except:
-            return set(self).intersect_params(arg1)
-        res = isl.isl_basic_set_intersect_params(isl.isl_basic_set_copy(self.ptr), isl.isl_basic_set_copy(arg1.ptr))
-        return basic_set(ctx=self.ctx, ptr=res)
-    def apply(self, arg1):
-        try:
-            if not arg1.__class__ is basic_map:
-                arg1 = basic_map(arg1)
-        except:
-            return set(self).apply(arg1)
-        res = isl.isl_basic_set_apply(isl.isl_basic_set_copy(self.ptr), isl.isl_basic_map_copy(arg1.ptr))
-        return basic_set(ctx=self.ctx, ptr=res)
-    def affine_hull(self):
-        res = isl.isl_basic_set_affine_hull(isl.isl_basic_set_copy(self.ptr))
-        return basic_set(ctx=self.ctx, ptr=res)
-    def detect_equalities(self):
-        res = isl.isl_basic_set_detect_equalities(isl.isl_basic_set_copy(self.ptr))
-        return basic_set(ctx=self.ctx, ptr=res)
-    def is_equal(self, arg1):
-        res = isl.isl_basic_set_is_equal(self.ptr, arg1.ptr)
-        return res
-    def lexmin(self):
-        res = isl.isl_basic_set_lexmin(isl.isl_basic_set_copy(self.ptr))
-        return set(ctx=self.ctx, ptr=res)
-    def lexmax(self):
-        res = isl.isl_basic_set_lexmax(isl.isl_basic_set_copy(self.ptr))
-        return set(ctx=self.ctx, ptr=res)
-    def union(self, arg1):
-        try:
-            if not arg1.__class__ is basic_set:
-                arg1 = basic_set(arg1)
-        except:
-            return set(self).union(arg1)
-        res = isl.isl_basic_set_union(isl.isl_basic_set_copy(self.ptr), isl.isl_basic_set_copy(arg1.ptr))
-        return set(ctx=self.ctx, ptr=res)
-    def is_empty(self):
-        res = isl.isl_basic_set_is_empty(self.ptr)
-        return res
-    def is_wrapping(self):
-        res = isl.isl_basic_set_is_wrapping(self.ptr)
-        return res
-    def flatten(self):
-        res = isl.isl_basic_set_flatten(isl.isl_basic_set_copy(self.ptr))
-        return basic_set(ctx=self.ctx, ptr=res)
-
-isl.isl_basic_set_read_from_str.restype = c_void_p
-isl.isl_basic_set_read_from_str.argtypes = [Context, c_char_p]
-isl.isl_basic_set_gist.restype = c_void_p
-isl.isl_basic_set_intersect.restype = c_void_p
-isl.isl_basic_set_intersect_params.restype = c_void_p
-isl.isl_basic_set_apply.restype = c_void_p
-isl.isl_basic_set_affine_hull.restype = c_void_p
-isl.isl_basic_set_detect_equalities.restype = c_void_p
-isl.isl_basic_set_lexmin.restype = c_void_p
-isl.isl_basic_set_lexmax.restype = c_void_p
-isl.isl_basic_set_union.restype = c_void_p
-isl.isl_basic_set_flatten.restype = c_void_p
-isl.isl_basic_set_free.argtypes = [c_void_p]
-isl.isl_basic_set_to_str.argtypes = [c_void_p]
-isl.isl_basic_set_to_str.restype = POINTER(c_char)
-
-class pw_qpolynomial:
-    def __init__(self, *args, **keywords):
-        if "ptr" in keywords:
-            self.ctx = keywords["ctx"]
-            self.ptr = keywords["ptr"]
-            return
-        raise Error
-    def __del__(self):
-        if hasattr(self, 'ptr'):
-            isl.isl_pw_qpolynomial_free(self.ptr)
-    def __str__(self):
-        ptr = isl.isl_pw_qpolynomial_to_str(self.ptr)
-        res = str(cast(ptr, c_char_p).value)
-        libc.free(ptr)
-        return res
-    def __repr__(self):
-        return 'isl.pw_qpolynomial("%s")' % str(self)
-
-isl.isl_pw_qpolynomial_free.argtypes = [c_void_p]
-isl.isl_pw_qpolynomial_to_str.argtypes = [c_void_p]
-isl.isl_pw_qpolynomial_to_str.restype = POINTER(c_char)
-
-class union_pw_qpolynomial:
-    def __init__(self, *args, **keywords):
-        if "ptr" in keywords:
-            self.ctx = keywords["ctx"]
-            self.ptr = keywords["ptr"]
-            return
-        raise Error
-    def __del__(self):
-        if hasattr(self, 'ptr'):
-            isl.isl_union_pw_qpolynomial_free(self.ptr)
-    def __str__(self):
-        ptr = isl.isl_union_pw_qpolynomial_to_str(self.ptr)
-        res = str(cast(ptr, c_char_p).value)
-        libc.free(ptr)
-        return res
-    def __repr__(self):
-        return 'isl.union_pw_qpolynomial("%s")' % str(self)
-
-isl.isl_union_pw_qpolynomial_free.argtypes = [c_void_p]
-isl.isl_union_pw_qpolynomial_to_str.argtypes = [c_void_p]
-isl.isl_union_pw_qpolynomial_to_str.restype = POINTER(c_char)
diff --git a/cloog-0.17.0/isl/interface/python.cc b/cloog-0.17.0/isl/interface/python.cc
deleted file mode 100644
index 784b4be..0000000
--- a/cloog-0.17.0/isl/interface/python.cc
+++ /dev/null
@@ -1,515 +0,0 @@
-/*
- * Copyright 2011 Sven Verdoolaege. All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 
- *    1. Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- * 
- *    2. Redistributions in binary form must reproduce the above
- *       copyright notice, this list of conditions and the following
- *       disclaimer in the documentation and/or other materials provided
- *       with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY SVEN VERDOOLAEGE ''AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SVEN VERDOOLAEGE OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- * 
- * The views and conclusions contained in the software and documentation
- * are those of the authors and should not be interpreted as
- * representing official policies, either expressed or implied, of
- * Sven Verdoolaege.
- */ 
-
-#include <stdio.h>
-#include <iostream>
-#include <map>
-#include "extract_interface.h"
-#include "python.h"
-
-/* Is the given type declaration marked as being a subtype of some other
- * type?  If so, return that other type in "super".
- */
-static bool is_subclass(RecordDecl *decl, string &super)
-{
-	if (!decl->hasAttrs())
-		return false;
-
-	string sub = "isl_subclass";
-	size_t len = sub.length();
-	AttrVec attrs = decl->getAttrs();
-	for (AttrVec::const_iterator i = attrs.begin() ; i != attrs.end(); ++i) {
-		const AnnotateAttr *ann = dyn_cast<AnnotateAttr>(*i);
-		if (!ann)
-			continue;
-		string s = ann->getAnnotation().str();
-		if (s.substr(0, len) == sub) {
-			super = s.substr(len + 1, s.length() - len  - 2);
-			return true;
-		}
-	}
-
-	return false;
-}
-
-/* Is decl marked as a constructor?
- */
-static bool is_constructor(Decl *decl)
-{
-	return has_annotation(decl, "isl_constructor");
-}
-
-/* Is decl marked as consuming a reference?
- */
-static bool takes(Decl *decl)
-{
-	return has_annotation(decl, "isl_take");
-}
-
-/* isl_class collects all constructors and methods for an isl "class".
- * "name" is the name of the class.
- * "type" is the declaration that introduces the type.
- */
-struct isl_class {
-	string name;
-	RecordDecl *type;
-	set<FunctionDecl *> constructors;
-	set<FunctionDecl *> methods;
-
-	void print(map<string, isl_class> &classes, set<string> &done);
-	void print_constructor(FunctionDecl *method);
-	void print_method(FunctionDecl *method, bool subclass, string super);
-};
-
-/* Return the class that has a name that matches the initial part
- * of the namd of function "fd".
- */
-static isl_class &method2class(map<string, isl_class> &classes,
-	FunctionDecl *fd)
-{
-	string best;
-	map<string, isl_class>::iterator ci;
-	string name = fd->getNameAsString();
-
-	for (ci = classes.begin(); ci != classes.end(); ++ci) {
-		if (name.substr(0, ci->first.length()) == ci->first)
-			best = ci->first;
-	}
-
-	return classes[best];
-}
-
-/* Is "type" the type "isl_ctx *"?
- */
-static bool is_isl_ctx(QualType type)
-{
-	if (!type->isPointerType())
-		return 0;
-	type = type->getPointeeType();
-	if (type.getAsString() != "isl_ctx")
-		return false;
-
-	return true;
-}
-
-/* Is the first argument of "fd" of type "isl_ctx *"?
- */
-static bool first_arg_is_isl_ctx(FunctionDecl *fd)
-{
-	ParmVarDecl *param;
-
-	if (fd->getNumParams() < 1)
-		return false;
-
-	param = fd->getParamDecl(0);
-	return is_isl_ctx(param->getOriginalType());
-}
-
-/* Is "type" that of a pointer to an isl_* structure?
- */
-static bool is_isl_type(QualType type)
-{
-	if (type->isPointerType()) {
-		string s = type->getPointeeType().getAsString();
-		return s.substr(0, 4) == "isl_";
-	}
-
-	return false;
-}
-
-/* Is "type" that of a pointer to a function?
- */
-static bool is_callback(QualType type)
-{
-	if (!type->isPointerType())
-		return false;
-	type = type->getPointeeType();
-	return type->isFunctionType();
-}
-
-/* Is "type" that of "char *" of "const char *"?
- */
-static bool is_string(QualType type)
-{
-	if (type->isPointerType()) {
-		string s = type->getPointeeType().getAsString();
-		return s == "const char" || s == "char";
-	}
-
-	return false;
-}
-
-/* Return the name of the type that "type" points to.
- * The input "type" is assumed to be a pointer type.
- */
-static string extract_type(QualType type)
-{
-	if (type->isPointerType())
-		return type->getPointeeType().getAsString();
-	assert(0);
-}
-
-/* Drop the "isl_" initial part of the type name "name".
- */
-static string type2python(string name)
-{
-	return name.substr(4);
-}
-
-/* Construct a wrapper for a callback argument (at position "arg").
- * Assign the wrapper to "cb".  We assume here that a function call
- * has at most one callback argument.
- *
- * The wrapper converts the arguments of the callback to python types.
- * If any exception is thrown, the wrapper keeps track of it in exc_info[0]
- * and returns -1.  Otherwise the wrapper returns 0.
- */
-static void print_callback(QualType type, int arg)
-{
-	const FunctionProtoType *fn = type->getAs<FunctionProtoType>();
-	unsigned n_arg = fn->getNumArgs();
-
-	printf("        exc_info = [None]\n");
-	printf("        fn = CFUNCTYPE(c_int");
-	for (int i = 0; i < n_arg - 1; ++i) {
-		QualType arg_type = fn->getArgType(i);
-		assert(is_isl_type(arg_type));
-		printf(", c_void_p");
-	}
-	printf(", c_void_p)\n");
-	printf("        def cb_func(");
-	for (int i = 0; i < n_arg; ++i) {
-		if (i)
-			printf(", ");
-		printf("cb_arg%d", i);
-	}
-	printf("):\n");
-	for (int i = 0; i < n_arg - 1; ++i) {
-		string arg_type;
-		arg_type = type2python(extract_type(fn->getArgType(i)));
-		printf("            cb_arg%d = %s(ctx=self.ctx, ptr=cb_arg%d)\n",
-			i, arg_type.c_str(), i);
-	}
-	printf("            try:\n");
-	printf("                arg%d(", arg);
-	for (int i = 0; i < n_arg - 1; ++i) {
-		if (i)
-			printf(", ");
-		printf("cb_arg%d", i);
-	}
-	printf(")\n");
-	printf("            except:\n");
-	printf("                import sys\n");
-	printf("                exc_info[0] = sys.exc_info()\n");
-	printf("                return -1\n");
-	printf("            return 0\n");
-	printf("        cb = fn(cb_func)\n");
-}
-
-/* Print a python method corresponding to the C function "method".
- * "subclass" is set if the method belongs to a class that is a subclass
- * of some other class ("super").
- *
- * If the function has a callback argument, then it also has a "user"
- * argument.  Since Python has closures, there is no need for such
- * a user argument in the Python interface, so we simply drop it.
- * We also create a wrapper ("cb") for the callback.
- *
- * If the function has additional arguments that refer to isl structures,
- * then we check if the actual arguments are of the right type.
- * If not, we try to convert it to the right type.
- * It that doesn't work and if subclass is set, we try to convert self
- * to the type of the superclass and call the corresponding method.
- *
- * If the function consumes a reference, then we pass it a copy of
- * the actual argument.
- */
-void isl_class::print_method(FunctionDecl *method, bool subclass, string super)
-{
-	string fullname = method->getName();
-	string cname = fullname.substr(name.length() + 1);
-	int num_params = method->getNumParams();
-	int drop_user = 0;
-
-	for (int i = 1; i < num_params; ++i) {
-		ParmVarDecl *param = method->getParamDecl(i);
-		QualType type = param->getOriginalType();
-		if (is_callback(type))
-			drop_user = 1;
-	}
-
-	printf("    def %s(self", cname.c_str());
-	for (int i = 1; i < num_params - drop_user; ++i)
-		printf(", arg%d", i);
-	printf("):\n");
-
-	for (int i = 1; i < num_params; ++i) {
-		ParmVarDecl *param = method->getParamDecl(i);
-		string type;
-		if (!is_isl_type(param->getOriginalType()))
-			continue;
-		type = type2python(extract_type(param->getOriginalType()));
-		printf("        try:\n");
-		printf("            if not arg%d.__class__ is %s:\n",
-			i, type.c_str());
-		printf("                arg%d = %s(arg%d)\n",
-			i, type.c_str(), i);
-		printf("        except:\n");
-		if (subclass) {
-			printf("            return %s(self).%s(",
-				type2python(super).c_str(), cname.c_str());
-			for (int i = 1; i < num_params - drop_user; ++i) {
-				if (i != 1)
-					printf(", ");
-				printf("arg%d", i);
-			}
-			printf(")\n");
-		} else
-			printf("            raise\n");
-	}
-	for (int i = 1; i < num_params; ++i) {
-		ParmVarDecl *param = method->getParamDecl(i);
-		QualType type = param->getOriginalType();
-		if (!is_callback(type))
-			continue;
-		print_callback(type->getPointeeType(), i);
-	}
-	printf("        res = isl.%s(", fullname.c_str());
-	if (takes(method->getParamDecl(0)))
-		printf("isl.%s_copy(self.ptr)", name.c_str());
-	else
-		printf("self.ptr");
-	for (int i = 1; i < num_params - drop_user; ++i) {
-		ParmVarDecl *param = method->getParamDecl(i);
-		QualType type = param->getOriginalType();
-		if (is_callback(type))
-			printf(", cb");
-		else if (takes(param)) {
-			string type_s = extract_type(type);
-			printf(", isl.%s_copy(arg%d.ptr)", type_s.c_str(), i);
-		} else
-			printf(", arg%d.ptr", i);
-	}
-	if (drop_user)
-		printf(", None");
-	printf(")\n");
-
-	if (is_isl_type(method->getResultType())) {
-		string type;
-		type = type2python(extract_type(method->getResultType()));
-		printf("        return %s(ctx=self.ctx, ptr=res)\n",
-			type.c_str());
-	} else {
-		if (drop_user) {
-			printf("        if exc_info[0] != None:\n");
-			printf("            raise exc_info[0][0], "
-				"exc_info[0][1], exc_info[0][2]\n");
-		}
-		printf("        return res\n");
-	}
-}
-
-/* Print part of the constructor for this isl_class.
- *
- * In particular, check if the actual arguments correspond to the
- * formal arguments of "cons" and if so call "cons" and put the
- * result in self.ptr and a reference to the default context in self.ctx.
- *
- * If the function consumes a reference, then we pass it a copy of
- * the actual argument.
- */
-void isl_class::print_constructor(FunctionDecl *cons)
-{
-	string fullname = cons->getName();
-	string cname = fullname.substr(name.length() + 1);
-	int num_params = cons->getNumParams();
-	int drop_ctx = first_arg_is_isl_ctx(cons);
-
-	printf("        if len(args) == %d", num_params - drop_ctx);
-	for (int i = drop_ctx; i < num_params; ++i) {
-		ParmVarDecl *param = cons->getParamDecl(i);
-		if (is_isl_type(param->getOriginalType())) {
-			string type;
-			type = extract_type(param->getOriginalType());
-			type = type2python(type);
-			printf(" and args[%d].__class__ is %s",
-				i - drop_ctx, type.c_str());
-		} else
-			printf(" and type(args[%d]) == str", i - drop_ctx);
-	}
-	printf(":\n");
-	printf("            self.ctx = Context.getDefaultInstance()\n");
-	printf("            self.ptr = isl.%s(", fullname.c_str());
-	if (drop_ctx)
-		printf("self.ctx");
-	for (int i = drop_ctx; i < num_params; ++i) {
-		ParmVarDecl *param = cons->getParamDecl(i);
-		if (i)
-			printf(", ");
-		if (is_isl_type(param->getOriginalType())) {
-			if (takes(param)) {
-				string type;
-				type = extract_type(param->getOriginalType());
-				printf("isl.%s_copy(args[%d].ptr)",
-					type.c_str(), i - drop_ctx);
-			} else
-				printf("args[%d].ptr", i - drop_ctx);
-		} else
-			printf("args[%d]", i - drop_ctx);
-	}
-	printf(")\n");
-	printf("            return\n");
-}
-
-/* Print out the definition of this isl_class.
- *
- * We first check if this isl_class is a subclass of some other class.
- * If it is, we make sure the superclass is printed out first.
- *
- * Then we print a constructor with several cases, one for constructing
- * a Python object from a return value and one for each function that
- * was marked as a constructor.
- *
- * Next, we print out some common methods and the methods corresponding
- * to functions that are not marked as constructors.
- *
- * Finally, we tell ctypes about the types of the arguments of the
- * constructor functions and the return types of those function returning
- * an isl object.
- */
-void isl_class::print(map<string, isl_class> &classes, set<string> &done)
-{
-	string super;
-	string p_name = type2python(name);
-	set<FunctionDecl *>::iterator in;
-	bool subclass = is_subclass(type, super);
-
-	if (subclass && done.find(super) == done.end())
-		classes[super].print(classes, done);
-	done.insert(name);
-
-	printf("\n");
-	printf("class %s", p_name.c_str());
-	if (subclass)
-		printf("(%s)", type2python(super).c_str());
-	printf(":\n");
-	printf("    def __init__(self, *args, **keywords):\n");
-
-	printf("        if \"ptr\" in keywords:\n");
-	printf("            self.ctx = keywords[\"ctx\"]\n");
-	printf("            self.ptr = keywords[\"ptr\"]\n");
-	printf("            return\n");
-
-	for (in = constructors.begin(); in != constructors.end(); ++in)
-		print_constructor(*in);
-	printf("        raise Error\n");
-	printf("    def __del__(self):\n");
-	printf("        if hasattr(self, 'ptr'):\n");
-	printf("            isl.%s_free(self.ptr)\n", name.c_str());
-	printf("    def __str__(self):\n");
-	printf("        ptr = isl.%s_to_str(self.ptr)\n", name.c_str());
-	printf("        res = str(cast(ptr, c_char_p).value)\n");
-	printf("        libc.free(ptr)\n");
-	printf("        return res\n");
-	printf("    def __repr__(self):\n");
-	printf("        return 'isl.%s(\"%%s\")' %% str(self)\n", p_name.c_str());
-
-	for (in = methods.begin(); in != methods.end(); ++in)
-		print_method(*in, subclass, super);
-
-	printf("\n");
-	for (in = constructors.begin(); in != constructors.end(); ++in) {
-		string fullname = (*in)->getName();
-		printf("isl.%s.restype = c_void_p\n", fullname.c_str());
-		printf("isl.%s.argtypes = [", fullname.c_str());
-		for (int i = 0; i < (*in)->getNumParams(); ++i) {
-			ParmVarDecl *param = (*in)->getParamDecl(i);
-			QualType type = param->getOriginalType();
-			if (i)
-				printf(", ");
-			if (is_isl_ctx(type))
-				printf("Context");
-			else if (is_isl_type(type))
-				printf("c_void_p");
-			else if (is_string(type))
-				printf("c_char_p");
-			else
-				printf("c_int");
-		}
-		printf("]\n");
-	}
-	for (in = methods.begin(); in != methods.end(); ++in) {
-		string fullname = (*in)->getName();
-		if (is_isl_type((*in)->getResultType()))
-			printf("isl.%s.restype = c_void_p\n", fullname.c_str());
-	}
-	printf("isl.%s_free.argtypes = [c_void_p]\n", name.c_str());
-	printf("isl.%s_to_str.argtypes = [c_void_p]\n", name.c_str());
-	printf("isl.%s_to_str.restype = POINTER(c_char)\n", name.c_str());
-}
-
-/* Generate a python interface based on the extracted types and functions.
- * We first collect all functions that belong to a certain type,
- * separating constructors from regular methods.
- *
- * Then we print out each class in turn.  If one of these is a subclass
- * of some other class, it will make sure the superclass is printed out first.
- */
-void generate_python(set<RecordDecl *> &types, set<FunctionDecl *> functions)
-{
-	map<string, isl_class> classes;
-	map<string, isl_class>::iterator ci;
-	set<string> done;
-
-	set<RecordDecl *>::iterator it;
-	for (it = types.begin(); it != types.end(); ++it) {
-		RecordDecl *decl = *it;
-		string name = decl->getName();
-		classes[name].name = name;
-		classes[name].type = decl;
-	}
-
-	set<FunctionDecl *>::iterator in;
-	for (in = functions.begin(); in != functions.end(); ++in) {
-		isl_class &c = method2class(classes, *in);
-		if (is_constructor(*in))
-			c.constructors.insert(*in);
-		else
-			c.methods.insert(*in);
-	}
-
-	for (ci = classes.begin(); ci != classes.end(); ++ci) {
-		if (done.find(ci->first) == done.end())
-			ci->second.print(classes, done);
-	}
-}
diff --git a/cloog-0.17.0/isl/interface/python.h b/cloog-0.17.0/isl/interface/python.h
deleted file mode 100644
index 0f6e8ec..0000000
--- a/cloog-0.17.0/isl/interface/python.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <set>
-#include <clang/AST/Decl.h>
-
-using namespace std;
-using namespace clang;
-
-void generate_python(set<RecordDecl *> &types, set<FunctionDecl *> functions);
diff --git a/cloog-0.17.0/isl/isl.py b/cloog-0.17.0/isl/isl.py
deleted file mode 100644
index 6382f63..0000000
--- a/cloog-0.17.0/isl/isl.py
+++ /dev/null
@@ -1,100 +0,0 @@
-import gdb
-import re
-
-# GDB Pretty Printers for most isl objects
-class IslObjectPrinter:
-	"""Print an isl object"""
-	def __init__ (self, val, type):
-                self.val = val
-                self.type = type
-
-	def to_string (self):
-                # Cast val to a void pointer to stop gdb using this pretty
-                # printer for the pointer which would lead to an infinite loop.
-                void_ptr = gdb.lookup_type('void').pointer()
-                value = str(self.val.cast(void_ptr))
-                printer = gdb.parse_and_eval("isl_printer_to_str(isl_"
-                                             + str(self.type)
-					     + "_get_ctx(" + value + "))")
-                printer = gdb.parse_and_eval("isl_printer_print_"
-                                             + str(self.type) + "("
-                                             + str(printer) + ", "
-                                             + value + ")")
-                string = gdb.parse_and_eval("(char*)isl_printer_get_str("
-                                            + str(printer) + ")")
-                gdb.parse_and_eval("isl_printer_free(" + str(printer) + ")")
-                return string
-
-	def display_hint (self):
-                return 'string'
-
-class IslIntPrinter:
-	"""Print an isl_int """
-	def __init__ (self, val):
-                self.val = val
-
-	def to_string (self):
-                # Cast val to a void pointer to stop gdb using this pretty
-                # printer for the pointer which would lead to an infinite loop.
-                void_ptr = gdb.lookup_type('void').pointer()
-                value = str(self.val.cast(void_ptr))
-
-                context = gdb.parse_and_eval("isl_ctx_alloc()")
-                printer = gdb.parse_and_eval("isl_printer_to_str("
-                                             + str(context) + ")")
-                printer = gdb.parse_and_eval("isl_printer_print_isl_int("
-                                             + str(printer) + ", "
-                                             + value + ")")
-                string = gdb.parse_and_eval("(char*)isl_printer_get_str("
-                                            + str(printer) + ")")
-                gdb.parse_and_eval("isl_printer_free(" + str(printer) + ")")
-                gdb.parse_and_eval("isl_ctx_free(" + str(context) + ")")
-                return string
-
-	def display_hint (self):
-                return 'string'
-
-class IslPrintCommand (gdb.Command):
-        """Print an isl value."""
-        def __init__ (self):
-                super (IslPrintCommand, self).__init__ ("islprint",
-                                                        gdb.COMMAND_OBSCURE)
-        def invoke (self, arg, from_tty):
-                arg = gdb.parse_and_eval(arg);
-                printer = str_lookup_function(arg)
-
-                if printer == None:
-                        print "No isl printer for this type"
-                        return
-
-                print printer.to_string()
-
-IslPrintCommand()
-
-def str_lookup_function (val):
-	if val.type.code != gdb.TYPE_CODE_PTR:
-		if str(val.type) == "isl_int":
-			return IslIntPrinter(val)
-                else:
-                        return None
-
-	lookup_tag = val.type.target()
-	regex = re.compile ("^isl_(.*)$")
-
-	if lookup_tag == None:
-		return None
-
-	m = regex.match (str(lookup_tag))
-
-	if m:
-                # Those types of printers defined in isl.
-                if m.group(1) in ["basic_set", "set", "union_set", "basic_map",
-                                  "map", "union_map", "qpolynomial",
-                                  "pw_qpolynomial", "pw_qpolynomial_fold",
-                                  "union_pw_qpolynomial",
-                                  "union_pw_qpolynomial_fold"]:
-                        return IslObjectPrinter(val, m.group(1))
-        return None
-
-# Do not register the pretty printer.
-# gdb.current_objfile().pretty_printers.append(str_lookup_function)
diff --git a/cloog-0.17.0/isl/isl_aff.c b/cloog-0.17.0/isl/isl_aff.c
deleted file mode 100644
index 173ccf0..0000000
--- a/cloog-0.17.0/isl/isl_aff.c
+++ /dev/null
@@ -1,2516 +0,0 @@
-/*
- * Copyright 2011      INRIA Saclay
- * Copyright 2011      Sven Verdoolaege
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl_aff_private.h>
-#include <isl_space_private.h>
-#include <isl_local_space_private.h>
-#include <isl_mat_private.h>
-#include <isl_list_private.h>
-#include <isl/constraint.h>
-#include <isl/seq.h>
-#include <isl/set.h>
-#include <isl_config.h>
-
-__isl_give isl_aff *isl_aff_alloc_vec(__isl_take isl_local_space *ls,
-	__isl_take isl_vec *v)
-{
-	isl_aff *aff;
-
-	if (!ls || !v)
-		goto error;
-
-	aff = isl_calloc_type(v->ctx, struct isl_aff);
-	if (!aff)
-		goto error;
-
-	aff->ref = 1;
-	aff->ls = ls;
-	aff->v = v;
-
-	return aff;
-error:
-	isl_local_space_free(ls);
-	isl_vec_free(v);
-	return NULL;
-}
-
-__isl_give isl_aff *isl_aff_alloc(__isl_take isl_local_space *ls)
-{
-	isl_ctx *ctx;
-	isl_vec *v;
-	unsigned total;
-
-	if (!ls)
-		return NULL;
-
-	ctx = isl_local_space_get_ctx(ls);
-	if (!isl_local_space_divs_known(ls))
-		isl_die(ctx, isl_error_invalid, "local space has unknown divs",
-			goto error);
-	if (!isl_local_space_is_set(ls))
-		isl_die(ctx, isl_error_invalid,
-			"domain of affine expression should be a set",
-			goto error);
-
-	total = isl_local_space_dim(ls, isl_dim_all);
-	v = isl_vec_alloc(ctx, 1 + 1 + total);
-	return isl_aff_alloc_vec(ls, v);
-error:
-	isl_local_space_free(ls);
-	return NULL;
-}
-
-__isl_give isl_aff *isl_aff_zero_on_domain(__isl_take isl_local_space *ls)
-{
-	isl_aff *aff;
-
-	aff = isl_aff_alloc(ls);
-	if (!aff)
-		return NULL;
-
-	isl_int_set_si(aff->v->el[0], 1);
-	isl_seq_clr(aff->v->el + 1, aff->v->size - 1);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_copy(__isl_keep isl_aff *aff)
-{
-	if (!aff)
-		return NULL;
-
-	aff->ref++;
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_dup(__isl_keep isl_aff *aff)
-{
-	if (!aff)
-		return NULL;
-
-	return isl_aff_alloc_vec(isl_local_space_copy(aff->ls),
-				 isl_vec_copy(aff->v));
-}
-
-__isl_give isl_aff *isl_aff_cow(__isl_take isl_aff *aff)
-{
-	if (!aff)
-		return NULL;
-
-	if (aff->ref == 1)
-		return aff;
-	aff->ref--;
-	return isl_aff_dup(aff);
-}
-
-void *isl_aff_free(__isl_take isl_aff *aff)
-{
-	if (!aff)
-		return NULL;
-
-	if (--aff->ref > 0)
-		return NULL;
-
-	isl_local_space_free(aff->ls);
-	isl_vec_free(aff->v);
-
-	free(aff);
-
-	return NULL;
-}
-
-isl_ctx *isl_aff_get_ctx(__isl_keep isl_aff *aff)
-{
-	return aff ? isl_local_space_get_ctx(aff->ls) : NULL;
-}
-
-/* Externally, an isl_aff has a map space, but internally, the
- * ls field corresponds to the domain of that space.
- */
-int isl_aff_dim(__isl_keep isl_aff *aff, enum isl_dim_type type)
-{
-	if (!aff)
-		return 0;
-	if (type == isl_dim_out)
-		return 1;
-	if (type == isl_dim_in)
-		type = isl_dim_set;
-	return isl_local_space_dim(aff->ls, type);
-}
-
-__isl_give isl_space *isl_aff_get_domain_space(__isl_keep isl_aff *aff)
-{
-	return aff ? isl_local_space_get_space(aff->ls) : NULL;
-}
-
-__isl_give isl_space *isl_aff_get_space(__isl_keep isl_aff *aff)
-{
-	isl_space *space;
-	if (!aff)
-		return NULL;
-	space = isl_local_space_get_space(aff->ls);
-	space = isl_space_from_domain(space);
-	space = isl_space_add_dims(space, isl_dim_out, 1);
-	return space;
-}
-
-__isl_give isl_local_space *isl_aff_get_domain_local_space(
-	__isl_keep isl_aff *aff)
-{
-	return aff ? isl_local_space_copy(aff->ls) : NULL;
-}
-
-__isl_give isl_local_space *isl_aff_get_local_space(__isl_keep isl_aff *aff)
-{
-	isl_local_space *ls;
-	if (!aff)
-		return NULL;
-	ls = isl_local_space_copy(aff->ls);
-	ls = isl_local_space_from_domain(ls);
-	ls = isl_local_space_add_dims(ls, isl_dim_out, 1);
-	return ls;
-}
-
-/* Externally, an isl_aff has a map space, but internally, the
- * ls field corresponds to the domain of that space.
- */
-const char *isl_aff_get_dim_name(__isl_keep isl_aff *aff,
-	enum isl_dim_type type, unsigned pos)
-{
-	if (!aff)
-		return NULL;
-	if (type == isl_dim_out)
-		return NULL;
-	if (type == isl_dim_in)
-		type = isl_dim_set;
-	return isl_local_space_get_dim_name(aff->ls, type, pos);
-}
-
-__isl_give isl_aff *isl_aff_reset_domain_space(__isl_take isl_aff *aff,
-	__isl_take isl_space *dim)
-{
-	aff = isl_aff_cow(aff);
-	if (!aff || !dim)
-		goto error;
-
-	aff->ls = isl_local_space_reset_space(aff->ls, dim);
-	if (!aff->ls)
-		return isl_aff_free(aff);
-
-	return aff;
-error:
-	isl_aff_free(aff);
-	isl_space_free(dim);
-	return NULL;
-}
-
-/* Reset the space of "aff".  This function is called from isl_pw_templ.c
- * and doesn't know if the space of an element object is represented
- * directly or through its domain.  It therefore passes along both.
- */
-__isl_give isl_aff *isl_aff_reset_space_and_domain(__isl_take isl_aff *aff,
-	__isl_take isl_space *space, __isl_take isl_space *domain)
-{
-	isl_space_free(space);
-	return isl_aff_reset_domain_space(aff, domain);
-}
-
-/* Reorder the coefficients of the affine expression based
- * on the given reodering.
- * The reordering r is assumed to have been extended with the local
- * variables.
- */
-static __isl_give isl_vec *vec_reorder(__isl_take isl_vec *vec,
-	__isl_take isl_reordering *r, int n_div)
-{
-	isl_vec *res;
-	int i;
-
-	if (!vec || !r)
-		goto error;
-
-	res = isl_vec_alloc(vec->ctx,
-			    2 + isl_space_dim(r->dim, isl_dim_all) + n_div);
-	isl_seq_cpy(res->el, vec->el, 2);
-	isl_seq_clr(res->el + 2, res->size - 2);
-	for (i = 0; i < r->len; ++i)
-		isl_int_set(res->el[2 + r->pos[i]], vec->el[2 + i]);
-
-	isl_reordering_free(r);
-	isl_vec_free(vec);
-	return res;
-error:
-	isl_vec_free(vec);
-	isl_reordering_free(r);
-	return NULL;
-}
-
-/* Reorder the dimensions of the domain of "aff" according
- * to the given reordering.
- */
-__isl_give isl_aff *isl_aff_realign_domain(__isl_take isl_aff *aff,
-	__isl_take isl_reordering *r)
-{
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		goto error;
-
-	r = isl_reordering_extend(r, aff->ls->div->n_row);
-	aff->v = vec_reorder(aff->v, isl_reordering_copy(r),
-				aff->ls->div->n_row);
-	aff->ls = isl_local_space_realign(aff->ls, r);
-
-	if (!aff->v || !aff->ls)
-		return isl_aff_free(aff);
-
-	return aff;
-error:
-	isl_aff_free(aff);
-	isl_reordering_free(r);
-	return NULL;
-}
-
-int isl_aff_plain_is_zero(__isl_keep isl_aff *aff)
-{
-	if (!aff)
-		return -1;
-
-	return isl_seq_first_non_zero(aff->v->el + 1, aff->v->size - 1) < 0;
-}
-
-int isl_aff_plain_is_equal(__isl_keep isl_aff *aff1, __isl_keep isl_aff *aff2)
-{
-	int equal;
-
-	if (!aff1 || !aff2)
-		return -1;
-
-	equal = isl_local_space_is_equal(aff1->ls, aff2->ls);
-	if (equal < 0 || !equal)
-		return equal;
-
-	return isl_vec_is_equal(aff1->v, aff2->v);
-}
-
-int isl_aff_get_denominator(__isl_keep isl_aff *aff, isl_int *v)
-{
-	if (!aff)
-		return -1;
-	isl_int_set(*v, aff->v->el[0]);
-	return 0;
-}
-
-int isl_aff_get_constant(__isl_keep isl_aff *aff, isl_int *v)
-{
-	if (!aff)
-		return -1;
-	isl_int_set(*v, aff->v->el[1]);
-	return 0;
-}
-
-int isl_aff_get_coefficient(__isl_keep isl_aff *aff,
-	enum isl_dim_type type, int pos, isl_int *v)
-{
-	if (!aff)
-		return -1;
-
-	if (type == isl_dim_out)
-		isl_die(aff->v->ctx, isl_error_invalid,
-			"output/set dimension does not have a coefficient",
-			return -1);
-	if (type == isl_dim_in)
-		type = isl_dim_set;
-
-	if (pos >= isl_local_space_dim(aff->ls, type))
-		isl_die(aff->v->ctx, isl_error_invalid,
-			"position out of bounds", return -1);
-
-	pos += isl_local_space_offset(aff->ls, type);
-	isl_int_set(*v, aff->v->el[1 + pos]);
-
-	return 0;
-}
-
-__isl_give isl_aff *isl_aff_set_denominator(__isl_take isl_aff *aff, isl_int v)
-{
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-
-	aff->v = isl_vec_cow(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	isl_int_set(aff->v->el[0], v);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_set_constant(__isl_take isl_aff *aff, isl_int v)
-{
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-
-	aff->v = isl_vec_cow(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	isl_int_set(aff->v->el[1], v);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_add_constant(__isl_take isl_aff *aff, isl_int v)
-{
-	if (isl_int_is_zero(v))
-		return aff;
-
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-
-	aff->v = isl_vec_cow(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	isl_int_addmul(aff->v->el[1], aff->v->el[0], v);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_add_constant_si(__isl_take isl_aff *aff, int v)
-{
-	isl_int t;
-
-	isl_int_init(t);
-	isl_int_set_si(t, v);
-	aff = isl_aff_add_constant(aff, t);
-	isl_int_clear(t);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_set_constant_si(__isl_take isl_aff *aff, int v)
-{
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-
-	aff->v = isl_vec_cow(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	isl_int_set_si(aff->v->el[1], v);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_set_coefficient(__isl_take isl_aff *aff,
-	enum isl_dim_type type, int pos, isl_int v)
-{
-	if (!aff)
-		return NULL;
-
-	if (type == isl_dim_out)
-		isl_die(aff->v->ctx, isl_error_invalid,
-			"output/set dimension does not have a coefficient",
-			return isl_aff_free(aff));
-	if (type == isl_dim_in)
-		type = isl_dim_set;
-
-	if (pos >= isl_local_space_dim(aff->ls, type))
-		isl_die(aff->v->ctx, isl_error_invalid,
-			"position out of bounds", return isl_aff_free(aff));
-
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-
-	aff->v = isl_vec_cow(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	pos += isl_local_space_offset(aff->ls, type);
-	isl_int_set(aff->v->el[1 + pos], v);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_set_coefficient_si(__isl_take isl_aff *aff,
-	enum isl_dim_type type, int pos, int v)
-{
-	if (!aff)
-		return NULL;
-
-	if (type == isl_dim_out)
-		isl_die(aff->v->ctx, isl_error_invalid,
-			"output/set dimension does not have a coefficient",
-			return isl_aff_free(aff));
-	if (type == isl_dim_in)
-		type = isl_dim_set;
-
-	if (pos >= isl_local_space_dim(aff->ls, type))
-		isl_die(aff->v->ctx, isl_error_invalid,
-			"position out of bounds", return isl_aff_free(aff));
-
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-
-	aff->v = isl_vec_cow(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	pos += isl_local_space_offset(aff->ls, type);
-	isl_int_set_si(aff->v->el[1 + pos], v);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_add_coefficient(__isl_take isl_aff *aff,
-	enum isl_dim_type type, int pos, isl_int v)
-{
-	if (!aff)
-		return NULL;
-
-	if (type == isl_dim_out)
-		isl_die(aff->v->ctx, isl_error_invalid,
-			"output/set dimension does not have a coefficient",
-			return isl_aff_free(aff));
-	if (type == isl_dim_in)
-		type = isl_dim_set;
-
-	if (pos >= isl_local_space_dim(aff->ls, type))
-		isl_die(aff->v->ctx, isl_error_invalid,
-			"position out of bounds", return isl_aff_free(aff));
-
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-
-	aff->v = isl_vec_cow(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	pos += isl_local_space_offset(aff->ls, type);
-	isl_int_addmul(aff->v->el[1 + pos], aff->v->el[0], v);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_add_coefficient_si(__isl_take isl_aff *aff,
-	enum isl_dim_type type, int pos, int v)
-{
-	isl_int t;
-
-	isl_int_init(t);
-	isl_int_set_si(t, v);
-	aff = isl_aff_add_coefficient(aff, type, pos, t);
-	isl_int_clear(t);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_get_div(__isl_keep isl_aff *aff, int pos)
-{
-	if (!aff)
-		return NULL;
-
-	return isl_local_space_get_div(aff->ls, pos);
-}
-
-__isl_give isl_aff *isl_aff_neg(__isl_take isl_aff *aff)
-{
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-	aff->v = isl_vec_cow(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	isl_seq_neg(aff->v->el + 1, aff->v->el + 1, aff->v->size - 1);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_normalize(__isl_take isl_aff *aff)
-{
-	if (!aff)
-		return NULL;
-	aff->v = isl_vec_normalize(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-	return aff;
-}
-
-/* Given f, return floor(f).
- * If f is an integer expression, then just return f.
- * Otherwise, if f = g/m, write g = q m + r,
- * create a new div d = [r/m] and return the expression q + d.
- * The coefficients in r are taken to lie between -m/2 and m/2.
- */
-__isl_give isl_aff *isl_aff_floor(__isl_take isl_aff *aff)
-{
-	int i;
-	int size;
-	isl_ctx *ctx;
-	isl_vec *div;
-
-	if (!aff)
-		return NULL;
-
-	if (isl_int_is_one(aff->v->el[0]))
-		return aff;
-
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-
-	aff->v = isl_vec_cow(aff->v);
-	div = isl_vec_copy(aff->v);
-	div = isl_vec_cow(div);
-	if (!div)
-		return isl_aff_free(aff);
-
-	ctx = isl_aff_get_ctx(aff);
-	isl_int_fdiv_q(aff->v->el[0], aff->v->el[0], ctx->two);
-	for (i = 1; i < aff->v->size; ++i) {
-		isl_int_fdiv_r(div->el[i], div->el[i], div->el[0]);
-		isl_int_fdiv_q(aff->v->el[i], aff->v->el[i], div->el[0]);
-		if (isl_int_gt(div->el[i], aff->v->el[0])) {
-			isl_int_sub(div->el[i], div->el[i], div->el[0]);
-			isl_int_add_ui(aff->v->el[i], aff->v->el[i], 1);
-		}
-	}
-
-	aff->ls = isl_local_space_add_div(aff->ls, div);
-	if (!aff->ls)
-		return isl_aff_free(aff);
-
-	size = aff->v->size;
-	aff->v = isl_vec_extend(aff->v, size + 1);
-	if (!aff->v)
-		return isl_aff_free(aff);
-	isl_int_set_si(aff->v->el[0], 1);
-	isl_int_set_si(aff->v->el[size], 1);
-
-	return aff;
-}
-
-/* Compute
- *
- *	aff mod m = aff - m * floor(aff/m)
- */
-__isl_give isl_aff *isl_aff_mod(__isl_take isl_aff *aff, isl_int m)
-{
-	isl_aff *res;
-
-	res = isl_aff_copy(aff);
-	aff = isl_aff_scale_down(aff, m);
-	aff = isl_aff_floor(aff);
-	aff = isl_aff_scale(aff, m);
-	res = isl_aff_sub(res, aff);
-
-	return res;
-}
-
-/* Compute
- *
- *	pwaff mod m = pwaff - m * floor(pwaff/m)
- */
-__isl_give isl_pw_aff *isl_pw_aff_mod(__isl_take isl_pw_aff *pwaff, isl_int m)
-{
-	isl_pw_aff *res;
-
-	res = isl_pw_aff_copy(pwaff);
-	pwaff = isl_pw_aff_scale_down(pwaff, m);
-	pwaff = isl_pw_aff_floor(pwaff);
-	pwaff = isl_pw_aff_scale(pwaff, m);
-	res = isl_pw_aff_sub(res, pwaff);
-
-	return res;
-}
-
-/* Given f, return ceil(f).
- * If f is an integer expression, then just return f.
- * Otherwise, create a new div d = [-f] and return the expression -d.
- */
-__isl_give isl_aff *isl_aff_ceil(__isl_take isl_aff *aff)
-{
-	if (!aff)
-		return NULL;
-
-	if (isl_int_is_one(aff->v->el[0]))
-		return aff;
-
-	aff = isl_aff_neg(aff);
-	aff = isl_aff_floor(aff);
-	aff = isl_aff_neg(aff);
-
-	return aff;
-}
-
-/* Apply the expansion computed by isl_merge_divs.
- * The expansion itself is given by "exp" while the resulting
- * list of divs is given by "div".
- */
-__isl_give isl_aff *isl_aff_expand_divs( __isl_take isl_aff *aff,
-	__isl_take isl_mat *div, int *exp)
-{
-	int i, j;
-	int old_n_div;
-	int new_n_div;
-	int offset;
-
-	aff = isl_aff_cow(aff);
-	if (!aff || !div)
-		goto error;
-
-	old_n_div = isl_local_space_dim(aff->ls, isl_dim_div);
-	new_n_div = isl_mat_rows(div);
-	if (new_n_div < old_n_div)
-		isl_die(isl_mat_get_ctx(div), isl_error_invalid,
-			"not an expansion", goto error);
-
-	aff->v = isl_vec_extend(aff->v, aff->v->size + new_n_div - old_n_div);
-	if (!aff->v)
-		goto error;
-
-	offset = 1 + isl_local_space_offset(aff->ls, isl_dim_div);
-	j = old_n_div - 1;
-	for (i = new_n_div - 1; i >= 0; --i) {
-		if (j >= 0 && exp[j] == i) {
-			if (i != j)
-				isl_int_swap(aff->v->el[offset + i],
-					     aff->v->el[offset + j]);
-			j--;
-		} else
-			isl_int_set_si(aff->v->el[offset + i], 0);
-	}
-
-	aff->ls = isl_local_space_replace_divs(aff->ls, isl_mat_copy(div));
-	if (!aff->ls)
-		goto error;
-	isl_mat_free(div);
-	return aff;
-error:
-	isl_aff_free(aff);
-	isl_mat_free(div);
-	return NULL;
-}
-
-/* Add two affine expressions that live in the same local space.
- */
-static __isl_give isl_aff *add_expanded(__isl_take isl_aff *aff1,
-	__isl_take isl_aff *aff2)
-{
-	isl_int gcd, f;
-
-	aff1 = isl_aff_cow(aff1);
-	if (!aff1 || !aff2)
-		goto error;
-
-	aff1->v = isl_vec_cow(aff1->v);
-	if (!aff1->v)
-		goto error;
-
-	isl_int_init(gcd);
-	isl_int_init(f);
-	isl_int_gcd(gcd, aff1->v->el[0], aff2->v->el[0]);
-	isl_int_divexact(f, aff2->v->el[0], gcd);
-	isl_seq_scale(aff1->v->el + 1, aff1->v->el + 1, f, aff1->v->size - 1);
-	isl_int_divexact(f, aff1->v->el[0], gcd);
-	isl_seq_addmul(aff1->v->el + 1, f, aff2->v->el + 1, aff1->v->size - 1);
-	isl_int_divexact(f, aff2->v->el[0], gcd);
-	isl_int_mul(aff1->v->el[0], aff1->v->el[0], f);
-	isl_int_clear(f);
-	isl_int_clear(gcd);
-
-	isl_aff_free(aff2);
-	return aff1;
-error:
-	isl_aff_free(aff1);
-	isl_aff_free(aff2);
-	return NULL;
-}
-
-__isl_give isl_aff *isl_aff_add(__isl_take isl_aff *aff1,
-	__isl_take isl_aff *aff2)
-{
-	isl_ctx *ctx;
-	int *exp1 = NULL;
-	int *exp2 = NULL;
-	isl_mat *div;
-
-	if (!aff1 || !aff2)
-		goto error;
-
-	ctx = isl_aff_get_ctx(aff1);
-	if (!isl_space_is_equal(aff1->ls->dim, aff2->ls->dim))
-		isl_die(ctx, isl_error_invalid,
-			"spaces don't match", goto error);
-
-	if (aff1->ls->div->n_row == 0 && aff2->ls->div->n_row == 0)
-		return add_expanded(aff1, aff2);
-
-	exp1 = isl_alloc_array(ctx, int, aff1->ls->div->n_row);
-	exp2 = isl_alloc_array(ctx, int, aff2->ls->div->n_row);
-	if (!exp1 || !exp2)
-		goto error;
-
-	div = isl_merge_divs(aff1->ls->div, aff2->ls->div, exp1, exp2);
-	aff1 = isl_aff_expand_divs(aff1, isl_mat_copy(div), exp1);
-	aff2 = isl_aff_expand_divs(aff2, div, exp2);
-	free(exp1);
-	free(exp2);
-
-	return add_expanded(aff1, aff2);
-error:
-	free(exp1);
-	free(exp2);
-	isl_aff_free(aff1);
-	isl_aff_free(aff2);
-	return NULL;
-}
-
-__isl_give isl_aff *isl_aff_sub(__isl_take isl_aff *aff1,
-	__isl_take isl_aff *aff2)
-{
-	return isl_aff_add(aff1, isl_aff_neg(aff2));
-}
-
-__isl_give isl_aff *isl_aff_scale(__isl_take isl_aff *aff, isl_int f)
-{
-	isl_int gcd;
-
-	if (isl_int_is_one(f))
-		return aff;
-
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-	aff->v = isl_vec_cow(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	isl_int_init(gcd);
-	isl_int_gcd(gcd, aff->v->el[0], f);
-	isl_int_divexact(aff->v->el[0], aff->v->el[0], gcd);
-	isl_int_divexact(gcd, f, gcd);
-	isl_seq_scale(aff->v->el + 1, aff->v->el + 1, gcd, aff->v->size - 1);
-	isl_int_clear(gcd);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_scale_down(__isl_take isl_aff *aff, isl_int f)
-{
-	isl_int gcd;
-
-	if (isl_int_is_one(f))
-		return aff;
-
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-	aff->v = isl_vec_cow(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	isl_int_init(gcd);
-	isl_seq_gcd(aff->v->el + 1, aff->v->size - 1, &gcd);
-	isl_int_gcd(gcd, gcd, f);
-	isl_seq_scale_down(aff->v->el + 1, aff->v->el + 1, gcd, aff->v->size - 1);
-	isl_int_divexact(gcd, f, gcd);
-	isl_int_mul(aff->v->el[0], aff->v->el[0], gcd);
-	isl_int_clear(gcd);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_scale_down_ui(__isl_take isl_aff *aff, unsigned f)
-{
-	isl_int v;
-
-	if (f == 1)
-		return aff;
-
-	isl_int_init(v);
-	isl_int_set_ui(v, f);
-	aff = isl_aff_scale_down(aff, v);
-	isl_int_clear(v);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_set_dim_name(__isl_take isl_aff *aff,
-	enum isl_dim_type type, unsigned pos, const char *s)
-{
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-	if (type == isl_dim_out)
-		isl_die(aff->v->ctx, isl_error_invalid,
-			"cannot set name of output/set dimension",
-			return isl_aff_free(aff));
-	if (type == isl_dim_in)
-		type = isl_dim_set;
-	aff->ls = isl_local_space_set_dim_name(aff->ls, type, pos, s);
-	if (!aff->ls)
-		return isl_aff_free(aff);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_set_dim_id(__isl_take isl_aff *aff,
-	enum isl_dim_type type, unsigned pos, __isl_take isl_id *id)
-{
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return isl_id_free(id);
-	if (type == isl_dim_out)
-		isl_die(aff->v->ctx, isl_error_invalid,
-			"cannot set name of output/set dimension",
-			goto error);
-	if (type == isl_dim_in)
-		type = isl_dim_set;
-	aff->ls = isl_local_space_set_dim_id(aff->ls, type, pos, id);
-	if (!aff->ls)
-		return isl_aff_free(aff);
-
-	return aff;
-error:
-	isl_id_free(id);
-	isl_aff_free(aff);
-	return NULL;
-}
-
-/* Exploit the equalities in "eq" to simplify the affine expression
- * and the expressions of the integer divisions in the local space.
- * The integer divisions in this local space are assumed to appear
- * as regular dimensions in "eq".
- */
-static __isl_give isl_aff *isl_aff_substitute_equalities_lifted(
-	__isl_take isl_aff *aff, __isl_take isl_basic_set *eq)
-{
-	int i, j;
-	unsigned total;
-	unsigned n_div;
-
-	if (!eq)
-		goto error;
-	if (eq->n_eq == 0) {
-		isl_basic_set_free(eq);
-		return aff;
-	}
-
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		goto error;
-
-	aff->ls = isl_local_space_substitute_equalities(aff->ls,
-							isl_basic_set_copy(eq));
-	if (!aff->ls)
-		goto error;
-
-	total = 1 + isl_space_dim(eq->dim, isl_dim_all);
-	n_div = eq->n_div;
-	for (i = 0; i < eq->n_eq; ++i) {
-		j = isl_seq_last_non_zero(eq->eq[i], total + n_div);
-		if (j < 0 || j == 0 || j >= total)
-			continue;
-
-		isl_seq_elim(aff->v->el + 1, eq->eq[i], j, total,
-				&aff->v->el[0]);
-	}
-
-	isl_basic_set_free(eq);
-	return aff;
-error:
-	isl_basic_set_free(eq);
-	isl_aff_free(aff);
-	return NULL;
-}
-
-/* Exploit the equalities in "eq" to simplify the affine expression
- * and the expressions of the integer divisions in the local space.
- */
-static __isl_give isl_aff *isl_aff_substitute_equalities(
-	__isl_take isl_aff *aff, __isl_take isl_basic_set *eq)
-{
-	int n_div;
-
-	if (!aff || !eq)
-		goto error;
-	n_div = isl_local_space_dim(aff->ls, isl_dim_div);
-	if (n_div > 0)
-		eq = isl_basic_set_add(eq, isl_dim_set, n_div);
-	return isl_aff_substitute_equalities_lifted(aff, eq);
-error:
-	isl_basic_set_free(eq);
-	isl_aff_free(aff);
-	return NULL;
-}
-
-/* Look for equalities among the variables shared by context and aff
- * and the integer divisions of aff, if any.
- * The equalities are then used to eliminate coefficients and/or integer
- * divisions from aff.
- */
-__isl_give isl_aff *isl_aff_gist(__isl_take isl_aff *aff,
-	__isl_take isl_set *context)
-{
-	isl_basic_set *hull;
-	int n_div;
-
-	if (!aff)
-		goto error;
-	n_div = isl_local_space_dim(aff->ls, isl_dim_div);
-	if (n_div > 0) {
-		isl_basic_set *bset;
-		isl_local_space *ls;
-		context = isl_set_add_dims(context, isl_dim_set, n_div);
-		ls = isl_aff_get_domain_local_space(aff);
-		bset = isl_basic_set_from_local_space(ls);
-		bset = isl_basic_set_lift(bset);
-		bset = isl_basic_set_flatten(bset);
-		context = isl_set_intersect(context,
-					    isl_set_from_basic_set(bset));
-	}
-
-	hull = isl_set_affine_hull(context);
-	return isl_aff_substitute_equalities_lifted(aff, hull);
-error:
-	isl_aff_free(aff);
-	isl_set_free(context);
-	return NULL;
-}
-
-__isl_give isl_aff *isl_aff_gist_params(__isl_take isl_aff *aff,
-	__isl_take isl_set *context)
-{
-	isl_set *dom_context = isl_set_universe(isl_aff_get_domain_space(aff));
-	dom_context = isl_set_intersect_params(dom_context, context);
-	return isl_aff_gist(aff, dom_context);
-}
-
-/* Return a basic set containing those elements in the space
- * of aff where it is non-negative.
- */
-__isl_give isl_basic_set *isl_aff_nonneg_basic_set(__isl_take isl_aff *aff)
-{
-	isl_constraint *ineq;
-
-	ineq = isl_inequality_from_aff(aff);
-
-	return isl_basic_set_from_constraint(ineq);
-}
-
-/* Return a basic set containing those elements in the space
- * of aff where it is zero.
- */
-__isl_give isl_basic_set *isl_aff_zero_basic_set(__isl_take isl_aff *aff)
-{
-	isl_constraint *ineq;
-
-	ineq = isl_equality_from_aff(aff);
-
-	return isl_basic_set_from_constraint(ineq);
-}
-
-/* Return a basic set containing those elements in the shared space
- * of aff1 and aff2 where aff1 is greater than or equal to aff2.
- */
-__isl_give isl_basic_set *isl_aff_ge_basic_set(__isl_take isl_aff *aff1,
-	__isl_take isl_aff *aff2)
-{
-	aff1 = isl_aff_sub(aff1, aff2);
-
-	return isl_aff_nonneg_basic_set(aff1);
-}
-
-/* Return a basic set containing those elements in the shared space
- * of aff1 and aff2 where aff1 is smaller than or equal to aff2.
- */
-__isl_give isl_basic_set *isl_aff_le_basic_set(__isl_take isl_aff *aff1,
-	__isl_take isl_aff *aff2)
-{
-	return isl_aff_ge_basic_set(aff2, aff1);
-}
-
-__isl_give isl_aff *isl_aff_add_on_domain(__isl_keep isl_set *dom,
-	__isl_take isl_aff *aff1, __isl_take isl_aff *aff2)
-{
-	aff1 = isl_aff_add(aff1, aff2);
-	aff1 = isl_aff_gist(aff1, isl_set_copy(dom));
-	return aff1;
-}
-
-int isl_aff_is_empty(__isl_keep isl_aff *aff)
-{
-	if (!aff)
-		return -1;
-
-	return 0;
-}
-
-/* Check whether the given affine expression has non-zero coefficient
- * for any dimension in the given range or if any of these dimensions
- * appear with non-zero coefficients in any of the integer divisions
- * involved in the affine expression.
- */
-int isl_aff_involves_dims(__isl_keep isl_aff *aff,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-	isl_ctx *ctx;
-	int *active = NULL;
-	int involves = 0;
-
-	if (!aff)
-		return -1;
-	if (n == 0)
-		return 0;
-
-	ctx = isl_aff_get_ctx(aff);
-	if (first + n > isl_aff_dim(aff, type))
-		isl_die(ctx, isl_error_invalid,
-			"range out of bounds", return -1);
-
-	active = isl_local_space_get_active(aff->ls, aff->v->el + 2);
-	if (!active)
-		goto error;
-
-	first += isl_local_space_offset(aff->ls, type) - 1;
-	for (i = 0; i < n; ++i)
-		if (active[first + i]) {
-			involves = 1;
-			break;
-		}
-
-	free(active);
-
-	return involves;
-error:
-	free(active);
-	return -1;
-}
-
-__isl_give isl_aff *isl_aff_drop_dims(__isl_take isl_aff *aff,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	isl_ctx *ctx;
-
-	if (!aff)
-		return NULL;
-	if (type == isl_dim_out)
-		isl_die(aff->v->ctx, isl_error_invalid,
-			"cannot drop output/set dimension",
-			return isl_aff_free(aff));
-	if (type == isl_dim_in)
-		type = isl_dim_set;
-	if (n == 0 && !isl_local_space_is_named_or_nested(aff->ls, type))
-		return aff;
-
-	ctx = isl_aff_get_ctx(aff);
-	if (first + n > isl_local_space_dim(aff->ls, type))
-		isl_die(ctx, isl_error_invalid, "range out of bounds",
-			return isl_aff_free(aff));
-
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-
-	aff->ls = isl_local_space_drop_dims(aff->ls, type, first, n);
-	if (!aff->ls)
-		return isl_aff_free(aff);
-
-	first += 1 + isl_local_space_offset(aff->ls, type);
-	aff->v = isl_vec_drop_els(aff->v, first, n);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_insert_dims(__isl_take isl_aff *aff,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	isl_ctx *ctx;
-
-	if (!aff)
-		return NULL;
-	if (type == isl_dim_out)
-		isl_die(aff->v->ctx, isl_error_invalid,
-			"cannot insert output/set dimensions",
-			return isl_aff_free(aff));
-	if (type == isl_dim_in)
-		type = isl_dim_set;
-	if (n == 0 && !isl_local_space_is_named_or_nested(aff->ls, type))
-		return aff;
-
-	ctx = isl_aff_get_ctx(aff);
-	if (first > isl_local_space_dim(aff->ls, type))
-		isl_die(ctx, isl_error_invalid, "position out of bounds",
-			return isl_aff_free(aff));
-
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-
-	aff->ls = isl_local_space_insert_dims(aff->ls, type, first, n);
-	if (!aff->ls)
-		return isl_aff_free(aff);
-
-	first += 1 + isl_local_space_offset(aff->ls, type);
-	aff->v = isl_vec_insert_zero_els(aff->v, first, n);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	return aff;
-}
-
-__isl_give isl_aff *isl_aff_add_dims(__isl_take isl_aff *aff,
-	enum isl_dim_type type, unsigned n)
-{
-	unsigned pos;
-
-	pos = isl_aff_dim(aff, type);
-
-	return isl_aff_insert_dims(aff, type, pos, n);
-}
-
-__isl_give isl_pw_aff *isl_pw_aff_add_dims(__isl_take isl_pw_aff *pwaff,
-	enum isl_dim_type type, unsigned n)
-{
-	unsigned pos;
-
-	pos = isl_pw_aff_dim(pwaff, type);
-
-	return isl_pw_aff_insert_dims(pwaff, type, pos, n);
-}
-
-__isl_give isl_pw_aff *isl_pw_aff_from_aff(__isl_take isl_aff *aff)
-{
-	isl_set *dom = isl_set_universe(isl_aff_get_domain_space(aff));
-	return isl_pw_aff_alloc(dom, aff);
-}
-
-#undef PW
-#define PW isl_pw_aff
-#undef EL
-#define EL isl_aff
-#undef EL_IS_ZERO
-#define EL_IS_ZERO is_empty
-#undef ZERO
-#define ZERO empty
-#undef IS_ZERO
-#define IS_ZERO is_empty
-#undef FIELD
-#define FIELD aff
-#undef DEFAULT_IS_ZERO
-#define DEFAULT_IS_ZERO 0
-
-#define NO_EVAL
-#define NO_OPT
-#define NO_MOVE_DIMS
-#define NO_LIFT
-#define NO_MORPH
-
-#include <isl_pw_templ.c>
-
-static __isl_give isl_set *align_params_pw_pw_set_and(
-	__isl_take isl_pw_aff *pwaff1, __isl_take isl_pw_aff *pwaff2,
-	__isl_give isl_set *(*fn)(__isl_take isl_pw_aff *pwaff1,
-				    __isl_take isl_pw_aff *pwaff2))
-{
-	if (!pwaff1 || !pwaff2)
-		goto error;
-	if (isl_space_match(pwaff1->dim, isl_dim_param,
-			  pwaff2->dim, isl_dim_param))
-		return fn(pwaff1, pwaff2);
-	if (!isl_space_has_named_params(pwaff1->dim) ||
-	    !isl_space_has_named_params(pwaff2->dim))
-		isl_die(isl_pw_aff_get_ctx(pwaff1), isl_error_invalid,
-			"unaligned unnamed parameters", goto error);
-	pwaff1 = isl_pw_aff_align_params(pwaff1, isl_pw_aff_get_space(pwaff2));
-	pwaff2 = isl_pw_aff_align_params(pwaff2, isl_pw_aff_get_space(pwaff1));
-	return fn(pwaff1, pwaff2);
-error:
-	isl_pw_aff_free(pwaff1);
-	isl_pw_aff_free(pwaff2);
-	return NULL;
-}
-
-/* Compute a piecewise quasi-affine expression with a domain that
- * is the union of those of pwaff1 and pwaff2 and such that on each
- * cell, the quasi-affine expression is the better (according to cmp)
- * of those of pwaff1 and pwaff2.  If only one of pwaff1 or pwaff2
- * is defined on a given cell, then the associated expression
- * is the defined one.
- */
-static __isl_give isl_pw_aff *pw_aff_union_opt(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2,
-	__isl_give isl_basic_set *(*cmp)(__isl_take isl_aff *aff1,
-					__isl_take isl_aff *aff2))
-{
-	int i, j, n;
-	isl_pw_aff *res;
-	isl_ctx *ctx;
-	isl_set *set;
-
-	if (!pwaff1 || !pwaff2)
-		goto error;
-
-	ctx = isl_space_get_ctx(pwaff1->dim);
-	if (!isl_space_is_equal(pwaff1->dim, pwaff2->dim))
-		isl_die(ctx, isl_error_invalid,
-			"arguments should live in same space", goto error);
-
-	if (isl_pw_aff_is_empty(pwaff1)) {
-		isl_pw_aff_free(pwaff1);
-		return pwaff2;
-	}
-
-	if (isl_pw_aff_is_empty(pwaff2)) {
-		isl_pw_aff_free(pwaff2);
-		return pwaff1;
-	}
-
-	n = 2 * (pwaff1->n + 1) * (pwaff2->n + 1);
-	res = isl_pw_aff_alloc_size(isl_space_copy(pwaff1->dim), n);
-
-	for (i = 0; i < pwaff1->n; ++i) {
-		set = isl_set_copy(pwaff1->p[i].set);
-		for (j = 0; j < pwaff2->n; ++j) {
-			struct isl_set *common;
-			isl_set *better;
-
-			common = isl_set_intersect(
-					isl_set_copy(pwaff1->p[i].set),
-					isl_set_copy(pwaff2->p[j].set));
-			better = isl_set_from_basic_set(cmp(
-					isl_aff_copy(pwaff2->p[j].aff),
-					isl_aff_copy(pwaff1->p[i].aff)));
-			better = isl_set_intersect(common, better);
-			if (isl_set_plain_is_empty(better)) {
-				isl_set_free(better);
-				continue;
-			}
-			set = isl_set_subtract(set, isl_set_copy(better));
-
-			res = isl_pw_aff_add_piece(res, better,
-						isl_aff_copy(pwaff2->p[j].aff));
-		}
-		res = isl_pw_aff_add_piece(res, set,
-						isl_aff_copy(pwaff1->p[i].aff));
-	}
-
-	for (j = 0; j < pwaff2->n; ++j) {
-		set = isl_set_copy(pwaff2->p[j].set);
-		for (i = 0; i < pwaff1->n; ++i)
-			set = isl_set_subtract(set,
-					isl_set_copy(pwaff1->p[i].set));
-		res = isl_pw_aff_add_piece(res, set,
-						isl_aff_copy(pwaff2->p[j].aff));
-	}
-
-	isl_pw_aff_free(pwaff1);
-	isl_pw_aff_free(pwaff2);
-
-	return res;
-error:
-	isl_pw_aff_free(pwaff1);
-	isl_pw_aff_free(pwaff2);
-	return NULL;
-}
-
-/* Compute a piecewise quasi-affine expression with a domain that
- * is the union of those of pwaff1 and pwaff2 and such that on each
- * cell, the quasi-affine expression is the maximum of those of pwaff1
- * and pwaff2.  If only one of pwaff1 or pwaff2 is defined on a given
- * cell, then the associated expression is the defined one.
- */
-static __isl_give isl_pw_aff *pw_aff_union_max(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return pw_aff_union_opt(pwaff1, pwaff2, &isl_aff_ge_basic_set);
-}
-
-__isl_give isl_pw_aff *isl_pw_aff_union_max(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return isl_pw_aff_align_params_pw_pw_and(pwaff1, pwaff2,
-							&pw_aff_union_max);
-}
-
-/* Compute a piecewise quasi-affine expression with a domain that
- * is the union of those of pwaff1 and pwaff2 and such that on each
- * cell, the quasi-affine expression is the minimum of those of pwaff1
- * and pwaff2.  If only one of pwaff1 or pwaff2 is defined on a given
- * cell, then the associated expression is the defined one.
- */
-static __isl_give isl_pw_aff *pw_aff_union_min(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return pw_aff_union_opt(pwaff1, pwaff2, &isl_aff_le_basic_set);
-}
-
-__isl_give isl_pw_aff *isl_pw_aff_union_min(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return isl_pw_aff_align_params_pw_pw_and(pwaff1, pwaff2,
-							&pw_aff_union_min);
-}
-
-__isl_give isl_pw_aff *isl_pw_aff_union_opt(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2, int max)
-{
-	if (max)
-		return isl_pw_aff_union_max(pwaff1, pwaff2);
-	else
-		return isl_pw_aff_union_min(pwaff1, pwaff2);
-}
-
-/* Construct a map with as domain the domain of pwaff and
- * one-dimensional range corresponding to the affine expressions.
- */
-static __isl_give isl_map *map_from_pw_aff(__isl_take isl_pw_aff *pwaff)
-{
-	int i;
-	isl_space *dim;
-	isl_map *map;
-
-	if (!pwaff)
-		return NULL;
-
-	dim = isl_pw_aff_get_space(pwaff);
-	map = isl_map_empty(dim);
-
-	for (i = 0; i < pwaff->n; ++i) {
-		isl_basic_map *bmap;
-		isl_map *map_i;
-
-		bmap = isl_basic_map_from_aff(isl_aff_copy(pwaff->p[i].aff));
-		map_i = isl_map_from_basic_map(bmap);
-		map_i = isl_map_intersect_domain(map_i,
-						isl_set_copy(pwaff->p[i].set));
-		map = isl_map_union_disjoint(map, map_i);
-	}
-
-	isl_pw_aff_free(pwaff);
-
-	return map;
-}
-
-/* Construct a map with as domain the domain of pwaff and
- * one-dimensional range corresponding to the affine expressions.
- */
-__isl_give isl_map *isl_map_from_pw_aff(__isl_take isl_pw_aff *pwaff)
-{
-	if (isl_space_is_set(pwaff->dim))
-		isl_die(isl_pw_aff_get_ctx(pwaff), isl_error_invalid,
-			"space of input is not a map",
-			return isl_pw_aff_free(pwaff));
-	return map_from_pw_aff(pwaff);
-}
-
-/* Construct a one-dimensional set with as parameter domain
- * the domain of pwaff and the single set dimension
- * corresponding to the affine expressions.
- */
-__isl_give isl_set *isl_set_from_pw_aff(__isl_take isl_pw_aff *pwaff)
-{
-	if (!pwaff)
-		return NULL;
-	if (!isl_space_is_set(pwaff->dim))
-		isl_die(isl_pw_aff_get_ctx(pwaff), isl_error_invalid,
-			"space of input is not a set",
-			return isl_pw_aff_free(pwaff));
-	return map_from_pw_aff(pwaff);
-}
-
-/* Return a set containing those elements in the domain
- * of pwaff where it is non-negative.
- */
-__isl_give isl_set *isl_pw_aff_nonneg_set(__isl_take isl_pw_aff *pwaff)
-{
-	int i;
-	isl_set *set;
-
-	if (!pwaff)
-		return NULL;
-
-	set = isl_set_empty(isl_pw_aff_get_domain_space(pwaff));
-
-	for (i = 0; i < pwaff->n; ++i) {
-		isl_basic_set *bset;
-		isl_set *set_i;
-
-		bset = isl_aff_nonneg_basic_set(isl_aff_copy(pwaff->p[i].aff));
-		set_i = isl_set_from_basic_set(bset);
-		set_i = isl_set_intersect(set_i, isl_set_copy(pwaff->p[i].set));
-		set = isl_set_union_disjoint(set, set_i);
-	}
-
-	isl_pw_aff_free(pwaff);
-
-	return set;
-}
-
-/* Return a set containing those elements in the domain
- * of pwaff where it is zero.
- */
-__isl_give isl_set *isl_pw_aff_zero_set(__isl_take isl_pw_aff *pwaff)
-{
-	int i;
-	isl_set *set;
-
-	if (!pwaff)
-		return NULL;
-
-	set = isl_set_empty(isl_pw_aff_get_domain_space(pwaff));
-
-	for (i = 0; i < pwaff->n; ++i) {
-		isl_basic_set *bset;
-		isl_set *set_i;
-
-		bset = isl_aff_zero_basic_set(isl_aff_copy(pwaff->p[i].aff));
-		set_i = isl_set_from_basic_set(bset);
-		set_i = isl_set_intersect(set_i, isl_set_copy(pwaff->p[i].set));
-		set = isl_set_union_disjoint(set, set_i);
-	}
-
-	isl_pw_aff_free(pwaff);
-
-	return set;
-}
-
-/* Return a set containing those elements in the domain
- * of pwaff where it is not zero.
- */
-__isl_give isl_set *isl_pw_aff_non_zero_set(__isl_take isl_pw_aff *pwaff)
-{
-	return isl_set_complement(isl_pw_aff_zero_set(pwaff));
-}
-
-/* Return a set containing those elements in the shared domain
- * of pwaff1 and pwaff2 where pwaff1 is greater than (or equal) to pwaff2.
- *
- * We compute the difference on the shared domain and then construct
- * the set of values where this difference is non-negative.
- * If strict is set, we first subtract 1 from the difference.
- * If equal is set, we only return the elements where pwaff1 and pwaff2
- * are equal.
- */
-static __isl_give isl_set *pw_aff_gte_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2, int strict, int equal)
-{
-	isl_set *set1, *set2;
-
-	set1 = isl_pw_aff_domain(isl_pw_aff_copy(pwaff1));
-	set2 = isl_pw_aff_domain(isl_pw_aff_copy(pwaff2));
-	set1 = isl_set_intersect(set1, set2);
-	pwaff1 = isl_pw_aff_intersect_domain(pwaff1, isl_set_copy(set1));
-	pwaff2 = isl_pw_aff_intersect_domain(pwaff2, isl_set_copy(set1));
-	pwaff1 = isl_pw_aff_add(pwaff1, isl_pw_aff_neg(pwaff2));
-
-	if (strict) {
-		isl_space *dim = isl_set_get_space(set1);
-		isl_aff *aff;
-		aff = isl_aff_zero_on_domain(isl_local_space_from_space(dim));
-		aff = isl_aff_add_constant_si(aff, -1);
-		pwaff1 = isl_pw_aff_add(pwaff1, isl_pw_aff_alloc(set1, aff));
-	} else
-		isl_set_free(set1);
-
-	if (equal)
-		return isl_pw_aff_zero_set(pwaff1);
-	return isl_pw_aff_nonneg_set(pwaff1);
-}
-
-/* Return a set containing those elements in the shared domain
- * of pwaff1 and pwaff2 where pwaff1 is equal to pwaff2.
- */
-static __isl_give isl_set *pw_aff_eq_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return pw_aff_gte_set(pwaff1, pwaff2, 0, 1);
-}
-
-__isl_give isl_set *isl_pw_aff_eq_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return align_params_pw_pw_set_and(pwaff1, pwaff2, &pw_aff_eq_set);
-}
-
-/* Return a set containing those elements in the shared domain
- * of pwaff1 and pwaff2 where pwaff1 is greater than or equal to pwaff2.
- */
-static __isl_give isl_set *pw_aff_ge_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return pw_aff_gte_set(pwaff1, pwaff2, 0, 0);
-}
-
-__isl_give isl_set *isl_pw_aff_ge_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return align_params_pw_pw_set_and(pwaff1, pwaff2, &pw_aff_ge_set);
-}
-
-/* Return a set containing those elements in the shared domain
- * of pwaff1 and pwaff2 where pwaff1 is strictly greater than pwaff2.
- */
-static __isl_give isl_set *pw_aff_gt_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return pw_aff_gte_set(pwaff1, pwaff2, 1, 0);
-}
-
-__isl_give isl_set *isl_pw_aff_gt_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return align_params_pw_pw_set_and(pwaff1, pwaff2, &pw_aff_gt_set);
-}
-
-__isl_give isl_set *isl_pw_aff_le_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return isl_pw_aff_ge_set(pwaff2, pwaff1);
-}
-
-__isl_give isl_set *isl_pw_aff_lt_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return isl_pw_aff_gt_set(pwaff2, pwaff1);
-}
-
-/* Return a set containing those elements in the shared domain
- * of the elements of list1 and list2 where each element in list1
- * has the relation specified by "fn" with each element in list2.
- */
-static __isl_give isl_set *pw_aff_list_set(__isl_take isl_pw_aff_list *list1,
-	__isl_take isl_pw_aff_list *list2,
-	__isl_give isl_set *(*fn)(__isl_take isl_pw_aff *pwaff1,
-				    __isl_take isl_pw_aff *pwaff2))
-{
-	int i, j;
-	isl_ctx *ctx;
-	isl_set *set;
-
-	if (!list1 || !list2)
-		goto error;
-
-	ctx = isl_pw_aff_list_get_ctx(list1);
-	if (list1->n < 1 || list2->n < 1)
-		isl_die(ctx, isl_error_invalid,
-			"list should contain at least one element", goto error);
-
-	set = isl_set_universe(isl_pw_aff_get_domain_space(list1->p[0]));
-	for (i = 0; i < list1->n; ++i)
-		for (j = 0; j < list2->n; ++j) {
-			isl_set *set_ij;
-
-			set_ij = fn(isl_pw_aff_copy(list1->p[i]),
-				    isl_pw_aff_copy(list2->p[j]));
-			set = isl_set_intersect(set, set_ij);
-		}
-
-	isl_pw_aff_list_free(list1);
-	isl_pw_aff_list_free(list2);
-	return set;
-error:
-	isl_pw_aff_list_free(list1);
-	isl_pw_aff_list_free(list2);
-	return NULL;
-}
-
-/* Return a set containing those elements in the shared domain
- * of the elements of list1 and list2 where each element in list1
- * is equal to each element in list2.
- */
-__isl_give isl_set *isl_pw_aff_list_eq_set(__isl_take isl_pw_aff_list *list1,
-	__isl_take isl_pw_aff_list *list2)
-{
-	return pw_aff_list_set(list1, list2, &isl_pw_aff_eq_set);
-}
-
-__isl_give isl_set *isl_pw_aff_list_ne_set(__isl_take isl_pw_aff_list *list1,
-	__isl_take isl_pw_aff_list *list2)
-{
-	return pw_aff_list_set(list1, list2, &isl_pw_aff_ne_set);
-}
-
-/* Return a set containing those elements in the shared domain
- * of the elements of list1 and list2 where each element in list1
- * is less than or equal to each element in list2.
- */
-__isl_give isl_set *isl_pw_aff_list_le_set(__isl_take isl_pw_aff_list *list1,
-	__isl_take isl_pw_aff_list *list2)
-{
-	return pw_aff_list_set(list1, list2, &isl_pw_aff_le_set);
-}
-
-__isl_give isl_set *isl_pw_aff_list_lt_set(__isl_take isl_pw_aff_list *list1,
-	__isl_take isl_pw_aff_list *list2)
-{
-	return pw_aff_list_set(list1, list2, &isl_pw_aff_lt_set);
-}
-
-__isl_give isl_set *isl_pw_aff_list_ge_set(__isl_take isl_pw_aff_list *list1,
-	__isl_take isl_pw_aff_list *list2)
-{
-	return pw_aff_list_set(list1, list2, &isl_pw_aff_ge_set);
-}
-
-__isl_give isl_set *isl_pw_aff_list_gt_set(__isl_take isl_pw_aff_list *list1,
-	__isl_take isl_pw_aff_list *list2)
-{
-	return pw_aff_list_set(list1, list2, &isl_pw_aff_gt_set);
-}
-
-
-/* Return a set containing those elements in the shared domain
- * of pwaff1 and pwaff2 where pwaff1 is not equal to pwaff2.
- */
-static __isl_give isl_set *pw_aff_ne_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	isl_set *set_lt, *set_gt;
-
-	set_lt = isl_pw_aff_lt_set(isl_pw_aff_copy(pwaff1),
-				   isl_pw_aff_copy(pwaff2));
-	set_gt = isl_pw_aff_gt_set(pwaff1, pwaff2);
-	return isl_set_union_disjoint(set_lt, set_gt);
-}
-
-__isl_give isl_set *isl_pw_aff_ne_set(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return align_params_pw_pw_set_and(pwaff1, pwaff2, &pw_aff_ne_set);
-}
-
-__isl_give isl_pw_aff *isl_pw_aff_scale_down(__isl_take isl_pw_aff *pwaff,
-	isl_int v)
-{
-	int i;
-
-	if (isl_int_is_one(v))
-		return pwaff;
-	if (!isl_int_is_pos(v))
-		isl_die(isl_pw_aff_get_ctx(pwaff), isl_error_invalid,
-			"factor needs to be positive",
-			return isl_pw_aff_free(pwaff));
-	pwaff = isl_pw_aff_cow(pwaff);
-	if (!pwaff)
-		return NULL;
-	if (pwaff->n == 0)
-		return pwaff;
-
-	for (i = 0; i < pwaff->n; ++i) {
-		pwaff->p[i].aff = isl_aff_scale_down(pwaff->p[i].aff, v);
-		if (!pwaff->p[i].aff)
-			return isl_pw_aff_free(pwaff);
-	}
-
-	return pwaff;
-}
-
-__isl_give isl_pw_aff *isl_pw_aff_floor(__isl_take isl_pw_aff *pwaff)
-{
-	int i;
-
-	pwaff = isl_pw_aff_cow(pwaff);
-	if (!pwaff)
-		return NULL;
-	if (pwaff->n == 0)
-		return pwaff;
-
-	for (i = 0; i < pwaff->n; ++i) {
-		pwaff->p[i].aff = isl_aff_floor(pwaff->p[i].aff);
-		if (!pwaff->p[i].aff)
-			return isl_pw_aff_free(pwaff);
-	}
-
-	return pwaff;
-}
-
-__isl_give isl_pw_aff *isl_pw_aff_ceil(__isl_take isl_pw_aff *pwaff)
-{
-	int i;
-
-	pwaff = isl_pw_aff_cow(pwaff);
-	if (!pwaff)
-		return NULL;
-	if (pwaff->n == 0)
-		return pwaff;
-
-	for (i = 0; i < pwaff->n; ++i) {
-		pwaff->p[i].aff = isl_aff_ceil(pwaff->p[i].aff);
-		if (!pwaff->p[i].aff)
-			return isl_pw_aff_free(pwaff);
-	}
-
-	return pwaff;
-}
-
-/* Return an affine expression that is equal to pwaff_true for elements
- * in "cond" and to pwaff_false for elements not in "cond".
- * That is, return cond ? pwaff_true : pwaff_false;
- */
-__isl_give isl_pw_aff *isl_pw_aff_cond(__isl_take isl_set *cond,
-	__isl_take isl_pw_aff *pwaff_true, __isl_take isl_pw_aff *pwaff_false)
-{
-	isl_set *comp;
-
-	comp = isl_set_complement(isl_set_copy(cond));
-	pwaff_true = isl_pw_aff_intersect_domain(pwaff_true, cond);
-	pwaff_false = isl_pw_aff_intersect_domain(pwaff_false, comp);
-
-	return isl_pw_aff_add_disjoint(pwaff_true, pwaff_false);
-}
-
-int isl_aff_is_cst(__isl_keep isl_aff *aff)
-{
-	if (!aff)
-		return -1;
-
-	return isl_seq_first_non_zero(aff->v->el + 2, aff->v->size - 2) == -1;
-}
-
-/* Check whether pwaff is a piecewise constant.
- */
-int isl_pw_aff_is_cst(__isl_keep isl_pw_aff *pwaff)
-{
-	int i;
-
-	if (!pwaff)
-		return -1;
-
-	for (i = 0; i < pwaff->n; ++i) {
-		int is_cst = isl_aff_is_cst(pwaff->p[i].aff);
-		if (is_cst < 0 || !is_cst)
-			return is_cst;
-	}
-
-	return 1;
-}
-
-__isl_give isl_aff *isl_aff_mul(__isl_take isl_aff *aff1,
-	__isl_take isl_aff *aff2)
-{
-	if (!isl_aff_is_cst(aff2) && isl_aff_is_cst(aff1))
-		return isl_aff_mul(aff2, aff1);
-
-	if (!isl_aff_is_cst(aff2))
-		isl_die(isl_aff_get_ctx(aff1), isl_error_invalid,
-			"at least one affine expression should be constant",
-			goto error);
-
-	aff1 = isl_aff_cow(aff1);
-	if (!aff1 || !aff2)
-		goto error;
-
-	aff1 = isl_aff_scale(aff1, aff2->v->el[1]);
-	aff1 = isl_aff_scale_down(aff1, aff2->v->el[0]);
-
-	isl_aff_free(aff2);
-	return aff1;
-error:
-	isl_aff_free(aff1);
-	isl_aff_free(aff2);
-	return NULL;
-}
-
-static __isl_give isl_pw_aff *pw_aff_add(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return isl_pw_aff_on_shared_domain(pwaff1, pwaff2, &isl_aff_add);
-}
-
-__isl_give isl_pw_aff *isl_pw_aff_add(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return isl_pw_aff_align_params_pw_pw_and(pwaff1, pwaff2, &pw_aff_add);
-}
-
-__isl_give isl_pw_aff *isl_pw_aff_union_add(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return isl_pw_aff_union_add_(pwaff1, pwaff2);
-}
-
-static __isl_give isl_pw_aff *pw_aff_mul(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return isl_pw_aff_on_shared_domain(pwaff1, pwaff2, &isl_aff_mul);
-}
-
-__isl_give isl_pw_aff *isl_pw_aff_mul(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return isl_pw_aff_align_params_pw_pw_and(pwaff1, pwaff2, &pw_aff_mul);
-}
-
-static __isl_give isl_pw_aff *pw_aff_min(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	isl_set *le;
-
-	le = isl_pw_aff_le_set(isl_pw_aff_copy(pwaff1),
-				isl_pw_aff_copy(pwaff2));
-	return isl_pw_aff_cond(le, pwaff1, pwaff2);
-}
-
-__isl_give isl_pw_aff *isl_pw_aff_min(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return isl_pw_aff_align_params_pw_pw_and(pwaff1, pwaff2, &pw_aff_min);
-}
-
-static __isl_give isl_pw_aff *pw_aff_max(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	isl_set *le;
-
-	le = isl_pw_aff_ge_set(isl_pw_aff_copy(pwaff1),
-				isl_pw_aff_copy(pwaff2));
-	return isl_pw_aff_cond(le, pwaff1, pwaff2);
-}
-
-__isl_give isl_pw_aff *isl_pw_aff_max(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2)
-{
-	return isl_pw_aff_align_params_pw_pw_and(pwaff1, pwaff2, &pw_aff_max);
-}
-
-static __isl_give isl_pw_aff *pw_aff_list_reduce(
-	__isl_take isl_pw_aff_list *list,
-	__isl_give isl_pw_aff *(*fn)(__isl_take isl_pw_aff *pwaff1,
-					__isl_take isl_pw_aff *pwaff2))
-{
-	int i;
-	isl_ctx *ctx;
-	isl_pw_aff *res;
-
-	if (!list)
-		return NULL;
-
-	ctx = isl_pw_aff_list_get_ctx(list);
-	if (list->n < 1)
-		isl_die(ctx, isl_error_invalid,
-			"list should contain at least one element",
-			return isl_pw_aff_list_free(list));
-
-	res = isl_pw_aff_copy(list->p[0]);
-	for (i = 1; i < list->n; ++i)
-		res = fn(res, isl_pw_aff_copy(list->p[i]));
-
-	isl_pw_aff_list_free(list);
-	return res;
-}
-
-/* Return an isl_pw_aff that maps each element in the intersection of the
- * domains of the elements of list to the minimal corresponding affine
- * expression.
- */
-__isl_give isl_pw_aff *isl_pw_aff_list_min(__isl_take isl_pw_aff_list *list)
-{
-	return pw_aff_list_reduce(list, &isl_pw_aff_min);
-}
-
-/* Return an isl_pw_aff that maps each element in the intersection of the
- * domains of the elements of list to the maximal corresponding affine
- * expression.
- */
-__isl_give isl_pw_aff *isl_pw_aff_list_max(__isl_take isl_pw_aff_list *list)
-{
-	return pw_aff_list_reduce(list, &isl_pw_aff_max);
-}
-
-#undef BASE
-#define BASE aff
-
-#include <isl_multi_templ.c>
-
-__isl_give isl_multi_aff *isl_multi_aff_add(__isl_take isl_multi_aff *maff1,
-	__isl_take isl_multi_aff *maff2)
-{
-	int i;
-	isl_ctx *ctx;
-
-	maff1 = isl_multi_aff_cow(maff1);
-	if (!maff1 || !maff2)
-		goto error;
-
-	ctx = isl_multi_aff_get_ctx(maff1);
-	if (!isl_space_is_equal(maff1->space, maff2->space))
-		isl_die(ctx, isl_error_invalid,
-			"spaces don't match", goto error);
-
-	for (i = 0; i < maff1->n; ++i) {
-		maff1->p[i] = isl_aff_add(maff1->p[i],
-					    isl_aff_copy(maff2->p[i]));
-		if (!maff1->p[i])
-			goto error;
-	}
-
-	isl_multi_aff_free(maff2);
-	return maff1;
-error:
-	isl_multi_aff_free(maff1);
-	isl_multi_aff_free(maff2);
-	return NULL;
-}
-
-/* Exploit the equalities in "eq" to simplify the affine expressions.
- */
-static __isl_give isl_multi_aff *isl_multi_aff_substitute_equalities(
-	__isl_take isl_multi_aff *maff, __isl_take isl_basic_set *eq)
-{
-	int i;
-
-	maff = isl_multi_aff_cow(maff);
-	if (!maff || !eq)
-		goto error;
-
-	for (i = 0; i < maff->n; ++i) {
-		maff->p[i] = isl_aff_substitute_equalities(maff->p[i],
-						    isl_basic_set_copy(eq));
-		if (!maff->p[i])
-			goto error;
-	}
-
-	isl_basic_set_free(eq);
-	return maff;
-error:
-	isl_basic_set_free(eq);
-	isl_multi_aff_free(maff);
-	return NULL;
-}
-
-__isl_give isl_multi_aff *isl_multi_aff_scale(__isl_take isl_multi_aff *maff,
-	isl_int f)
-{
-	int i;
-
-	maff = isl_multi_aff_cow(maff);
-	if (!maff)
-		return NULL;
-
-	for (i = 0; i < maff->n; ++i) {
-		maff->p[i] = isl_aff_scale(maff->p[i], f);
-		if (!maff->p[i])
-			return isl_multi_aff_free(maff);
-	}
-
-	return maff;
-}
-
-__isl_give isl_multi_aff *isl_multi_aff_add_on_domain(__isl_keep isl_set *dom,
-	__isl_take isl_multi_aff *maff1, __isl_take isl_multi_aff *maff2)
-{
-	maff1 = isl_multi_aff_add(maff1, maff2);
-	maff1 = isl_multi_aff_gist(maff1, isl_set_copy(dom));
-	return maff1;
-}
-
-int isl_multi_aff_is_empty(__isl_keep isl_multi_aff *maff)
-{
-	if (!maff)
-		return -1;
-
-	return 0;
-}
-
-int isl_multi_aff_plain_is_equal(__isl_keep isl_multi_aff *maff1,
-	__isl_keep isl_multi_aff *maff2)
-{
-	int i;
-	int equal;
-
-	if (!maff1 || !maff2)
-		return -1;
-	if (maff1->n != maff2->n)
-		return 0;
-	equal = isl_space_is_equal(maff1->space, maff2->space);
-	if (equal < 0 || !equal)
-		return equal;
-
-	for (i = 0; i < maff1->n; ++i) {
-		equal = isl_aff_plain_is_equal(maff1->p[i], maff2->p[i]);
-		if (equal < 0 || !equal)
-			return equal;
-	}
-
-	return 1;
-}
-
-__isl_give isl_multi_aff *isl_multi_aff_set_dim_name(
-	__isl_take isl_multi_aff *maff,
-	enum isl_dim_type type, unsigned pos, const char *s)
-{
-	int i;
-
-	maff = isl_multi_aff_cow(maff);
-	if (!maff)
-		return NULL;
-
-	maff->space = isl_space_set_dim_name(maff->space, type, pos, s);
-	if (!maff->space)
-		return isl_multi_aff_free(maff);
-	for (i = 0; i < maff->n; ++i) {
-		maff->p[i] = isl_aff_set_dim_name(maff->p[i], type, pos, s);
-		if (!maff->p[i])
-			return isl_multi_aff_free(maff);
-	}
-
-	return maff;
-}
-
-__isl_give isl_multi_aff *isl_multi_aff_drop_dims(__isl_take isl_multi_aff *maff,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	maff = isl_multi_aff_cow(maff);
-	if (!maff)
-		return NULL;
-
-	maff->space = isl_space_drop_dims(maff->space, type, first, n);
-	if (!maff->space)
-		return isl_multi_aff_free(maff);
-	for (i = 0; i < maff->n; ++i) {
-		maff->p[i] = isl_aff_drop_dims(maff->p[i], type, first, n);
-		if (!maff->p[i])
-			return isl_multi_aff_free(maff);
-	}
-
-	return maff;
-}
-
-#undef PW
-#define PW isl_pw_multi_aff
-#undef EL
-#define EL isl_multi_aff
-#undef EL_IS_ZERO
-#define EL_IS_ZERO is_empty
-#undef ZERO
-#define ZERO empty
-#undef IS_ZERO
-#define IS_ZERO is_empty
-#undef FIELD
-#define FIELD maff
-#undef DEFAULT_IS_ZERO
-#define DEFAULT_IS_ZERO 0
-
-#define NO_NEG
-#define NO_EVAL
-#define NO_OPT
-#define NO_INVOLVES_DIMS
-#define NO_MOVE_DIMS
-#define NO_INSERT_DIMS
-#define NO_LIFT
-#define NO_MORPH
-
-#include <isl_pw_templ.c>
-
-static __isl_give isl_pw_multi_aff *pw_multi_aff_add(
-	__isl_take isl_pw_multi_aff *pma1, __isl_take isl_pw_multi_aff *pma2)
-{
-	return isl_pw_multi_aff_on_shared_domain(pma1, pma2,
-						&isl_multi_aff_add);
-}
-
-__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)
-{
-	return isl_pw_multi_aff_align_params_pw_pw_and(pma1, pma2,
-						&pw_multi_aff_add);
-}
-
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_union_add(
-	__isl_take isl_pw_multi_aff *pma1, __isl_take isl_pw_multi_aff *pma2)
-{
-	return isl_pw_multi_aff_union_add_(pma1, pma2);
-}
-
-/* Construct a map mapping the domain the piecewise multi-affine expression
- * to its range, with each dimension in the range equated to the
- * corresponding affine expression on its cell.
- */
-__isl_give isl_map *isl_map_from_pw_multi_aff(__isl_take isl_pw_multi_aff *pma)
-{
-	int i;
-	isl_map *map;
-
-	if (!pma)
-		return NULL;
-
-	map = isl_map_empty(isl_pw_multi_aff_get_space(pma));
-
-	for (i = 0; i < pma->n; ++i) {
-		isl_multi_aff *maff;
-		isl_basic_map *bmap;
-		isl_map *map_i;
-
-		maff = isl_multi_aff_copy(pma->p[i].maff);
-		bmap = isl_basic_map_from_multi_aff(maff);
-		map_i = isl_map_from_basic_map(bmap);
-		map_i = isl_map_intersect_domain(map_i,
-						isl_set_copy(pma->p[i].set));
-		map = isl_map_union_disjoint(map, map_i);
-	}
-
-	isl_pw_multi_aff_free(pma);
-	return map;
-}
-
-__isl_give isl_set *isl_set_from_pw_multi_aff(__isl_take isl_pw_multi_aff *pma)
-{
-	if (!isl_space_is_set(pma->dim))
-		isl_die(isl_pw_multi_aff_get_ctx(pma), isl_error_invalid,
-			"isl_pw_multi_aff cannot be converted into an isl_set",
-			return isl_pw_multi_aff_free(pma));
-
-	return isl_map_from_pw_multi_aff(pma);
-}
-
-/* Try and create an isl_pw_multi_aff that is equivalent to the given isl_map.
- * This obivously only works if the input "map" is single-valued.
- * If so, we compute the lexicographic minimum of the image in the form
- * of an isl_pw_multi_aff.  Since the image is unique, it is equal
- * to its lexicographic minimum.
- * If the input is not single-valued, we produce an error.
- */
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_from_map(__isl_take isl_map *map)
-{
-	int i;
-	int sv;
-	isl_pw_multi_aff *pma;
-
-	if (!map)
-		return NULL;
-
-	sv = isl_map_is_single_valued(map);
-	if (sv < 0)
-		goto error;
-	if (!sv)
-		isl_die(isl_map_get_ctx(map), isl_error_invalid,
-			"map is not single-valued", goto error);
-	map = isl_map_make_disjoint(map);
-	if (!map)
-		return NULL;
-
-	pma = isl_pw_multi_aff_empty(isl_map_get_space(map));
-
-	for (i = 0; i < map->n; ++i) {
-		isl_pw_multi_aff *pma_i;
-		isl_basic_map *bmap;
-		bmap = isl_basic_map_copy(map->p[i]);
-		pma_i = isl_basic_map_lexmin_pw_multi_aff(bmap);
-		pma = isl_pw_multi_aff_add_disjoint(pma, pma_i);
-	}
-
-	isl_map_free(map);
-	return pma;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_from_set(__isl_take isl_set *set)
-{
-	return isl_pw_multi_aff_from_map(set);
-}
-
-/* Plug in "subs" for dimension "type", "pos" of "aff".
- *
- * Let i be the dimension to replace and let "subs" be of the form
- *
- *	f/d
- *
- * and "aff" of the form
- *
- *	(a i + g)/m
- *
- * The result is
- *
- *	floor((a f + d g')/(m d))
- *
- * where g' is the result of plugging in "subs" in each of the integer
- * divisions in g.
- */
-__isl_give isl_aff *isl_aff_substitute(__isl_take isl_aff *aff,
-	enum isl_dim_type type, unsigned pos, __isl_keep isl_aff *subs)
-{
-	isl_ctx *ctx;
-	isl_int v;
-
-	aff = isl_aff_cow(aff);
-	if (!aff || !subs)
-		return isl_aff_free(aff);
-
-	ctx = isl_aff_get_ctx(aff);
-	if (!isl_space_is_equal(aff->ls->dim, subs->ls->dim))
-		isl_die(ctx, isl_error_invalid,
-			"spaces don't match", return isl_aff_free(aff));
-	if (isl_local_space_dim(subs->ls, isl_dim_div) != 0)
-		isl_die(ctx, isl_error_unsupported,
-			"cannot handle divs yet", return isl_aff_free(aff));
-
-	aff->ls = isl_local_space_substitute(aff->ls, type, pos, subs);
-	if (!aff->ls)
-		return isl_aff_free(aff);
-
-	aff->v = isl_vec_cow(aff->v);
-	if (!aff->v)
-		return isl_aff_free(aff);
-
-	pos += isl_local_space_offset(aff->ls, type);
-
-	isl_int_init(v);
-	isl_int_set(v, aff->v->el[1 + pos]);
-	isl_int_set_si(aff->v->el[1 + pos], 0);
-	isl_seq_combine(aff->v->el + 1, subs->v->el[0], aff->v->el + 1,
-			v, subs->v->el + 1, subs->v->size - 1);
-	isl_int_mul(aff->v->el[0], aff->v->el[0], subs->v->el[0]);
-	isl_int_clear(v);
-
-	return aff;
-}
-
-/* Plug in "subs" for dimension "type", "pos" in each of the affine
- * expressions in "maff".
- */
-__isl_give isl_multi_aff *isl_multi_aff_substitute(
-	__isl_take isl_multi_aff *maff, enum isl_dim_type type, unsigned pos,
-	__isl_keep isl_aff *subs)
-{
-	int i;
-
-	maff = isl_multi_aff_cow(maff);
-	if (!maff || !subs)
-		return isl_multi_aff_free(maff);
-
-	if (type == isl_dim_in)
-		type = isl_dim_set;
-
-	for (i = 0; i < maff->n; ++i) {
-		maff->p[i] = isl_aff_substitute(maff->p[i], type, pos, subs);
-		if (!maff->p[i])
-			return isl_multi_aff_free(maff);
-	}
-
-	return maff;
-}
-
-/* Plug in "subs" for dimension "type", "pos" of "pma".
- *
- * pma is of the form
- *
- *	A_i(v) -> M_i(v)
- *
- * while subs is of the form
- *
- *	v' = B_j(v) -> S_j
- *
- * Each pair i,j such that C_ij = A_i \cap B_i is non-empty
- * has a contribution in the result, in particular
- *
- *	C_ij(S_j) -> M_i(S_j)
- *
- * Note that plugging in S_j in C_ij may also result in an empty set
- * and this contribution should simply be discarded.
- */
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_substitute(
-	__isl_take isl_pw_multi_aff *pma, enum isl_dim_type type, unsigned pos,
-	__isl_keep isl_pw_aff *subs)
-{
-	int i, j, n;
-	isl_pw_multi_aff *res;
-
-	if (!pma || !subs)
-		return isl_pw_multi_aff_free(pma);
-
-	n = pma->n * subs->n;
-	res = isl_pw_multi_aff_alloc_size(isl_space_copy(pma->dim), n);
-
-	for (i = 0; i < pma->n; ++i) {
-		for (j = 0; j < subs->n; ++j) {
-			isl_set *common;
-			isl_multi_aff *res_ij;
-			common = isl_set_intersect(
-					isl_set_copy(pma->p[i].set),
-					isl_set_copy(subs->p[j].set));
-			common = isl_set_substitute(common,
-					type, pos, subs->p[j].aff);
-			if (isl_set_plain_is_empty(common)) {
-				isl_set_free(common);
-				continue;
-			}
-
-			res_ij = isl_multi_aff_substitute(
-					isl_multi_aff_copy(pma->p[i].maff),
-					type, pos, subs->p[j].aff);
-
-			res = isl_pw_multi_aff_add_piece(res, common, res_ij);
-		}
-	}
-
-	isl_pw_multi_aff_free(pma);
-	return res;
-}
-
-/* Extend the local space of "dst" to include the divs
- * in the local space of "src".
- */
-__isl_give isl_aff *isl_aff_align_divs(__isl_take isl_aff *dst,
-	__isl_keep isl_aff *src)
-{
-	isl_ctx *ctx;
-	int *exp1 = NULL;
-	int *exp2 = NULL;
-	isl_mat *div;
-
-	if (!src || !dst)
-		return isl_aff_free(dst);
-
-	ctx = isl_aff_get_ctx(src);
-	if (!isl_space_is_equal(src->ls->dim, dst->ls->dim))
-		isl_die(ctx, isl_error_invalid,
-			"spaces don't match", goto error);
-
-	if (src->ls->div->n_row == 0)
-		return dst;
-
-	exp1 = isl_alloc_array(ctx, int, src->ls->div->n_row);
-	exp2 = isl_alloc_array(ctx, int, dst->ls->div->n_row);
-	if (!exp1 || !exp2)
-		goto error;
-
-	div = isl_merge_divs(src->ls->div, dst->ls->div, exp1, exp2);
-	dst = isl_aff_expand_divs(dst, div, exp2);
-	free(exp1);
-	free(exp2);
-
-	return dst;
-error:
-	free(exp1);
-	free(exp2);
-	return isl_aff_free(dst);
-}
-
-/* Adjust the local spaces of the affine expressions in "maff"
- * such that they all have the save divs.
- */
-__isl_give isl_multi_aff *isl_multi_aff_align_divs(
-	__isl_take isl_multi_aff *maff)
-{
-	int i;
-
-	if (!maff)
-		return NULL;
-	if (maff->n == 0)
-		return maff;
-	maff = isl_multi_aff_cow(maff);
-	if (!maff)
-		return NULL;
-
-	for (i = 1; i < maff->n; ++i)
-		maff->p[0] = isl_aff_align_divs(maff->p[0], maff->p[i]);
-	for (i = 1; i < maff->n; ++i) {
-		maff->p[i] = isl_aff_align_divs(maff->p[i], maff->p[0]);
-		if (!maff->p[i])
-			return isl_multi_aff_free(maff);
-	}
-
-	return maff;
-}
-
-__isl_give isl_aff *isl_aff_lift(__isl_take isl_aff *aff)
-{
-	aff = isl_aff_cow(aff);
-	if (!aff)
-		return NULL;
-
-	aff->ls = isl_local_space_lift(aff->ls);
-	if (!aff->ls)
-		return isl_aff_free(aff);
-
-	return aff;
-}
-
-/* Lift "maff" to a space with extra dimensions such that the result
- * has no more existentially quantified variables.
- * If "ls" is not NULL, then *ls is assigned the local space that lies
- * at the basis of the lifting applied to "maff".
- */
-__isl_give isl_multi_aff *isl_multi_aff_lift(__isl_take isl_multi_aff *maff,
-	__isl_give isl_local_space **ls)
-{
-	int i;
-	isl_space *space;
-	unsigned n_div;
-
-	if (ls)
-		*ls = NULL;
-
-	if (!maff)
-		return NULL;
-
-	if (maff->n == 0) {
-		if (ls) {
-			isl_space *space = isl_multi_aff_get_domain_space(maff);
-			*ls = isl_local_space_from_space(space);
-			if (!*ls)
-				return isl_multi_aff_free(maff);
-		}
-		return maff;
-	}
-
-	maff = isl_multi_aff_cow(maff);
-	maff = isl_multi_aff_align_divs(maff);
-	if (!maff)
-		return NULL;
-
-	n_div = isl_aff_dim(maff->p[0], isl_dim_div);
-	space = isl_multi_aff_get_space(maff);
-	space = isl_space_lift(isl_space_domain(space), n_div);
-	space = isl_space_extend_domain_with_range(space,
-						isl_multi_aff_get_space(maff));
-	if (!space)
-		return isl_multi_aff_free(maff);
-	isl_space_free(maff->space);
-	maff->space = space;
-
-	if (ls) {
-		*ls = isl_aff_get_domain_local_space(maff->p[0]);
-		if (!*ls)
-			return isl_multi_aff_free(maff);
-	}
-
-	for (i = 0; i < maff->n; ++i) {
-		maff->p[i] = isl_aff_lift(maff->p[i]);
-		if (!maff->p[i])
-			goto error;
-	}
-
-	return maff;
-error:
-	if (ls)
-		isl_local_space_free(*ls);
-	return isl_multi_aff_free(maff);
-}
diff --git a/cloog-0.17.0/isl/isl_aff_private.h b/cloog-0.17.0/isl/isl_aff_private.h
deleted file mode 100644
index 5a7c3e0..0000000
--- a/cloog-0.17.0/isl/isl_aff_private.h
+++ /dev/null
@@ -1,104 +0,0 @@
-#ifndef ISL_AFF_PRIVATE_H
-#define ISL_AFF_PRIVATE_H
-
-#include <isl/aff.h>
-#include <isl/vec.h>
-#include <isl/mat.h>
-#include <isl/local_space.h>
-
-/* ls represents the domain space.
- */
-struct isl_aff {
-	int ref;
-
-	isl_local_space	*ls;
-	isl_vec		*v;
-};
-
-struct isl_pw_aff_piece {
-	struct isl_set *set;
-	struct isl_aff *aff;
-};
-
-struct isl_pw_aff {
-	int ref;
-
-	isl_space *dim;
-
-	int n;
-
-	size_t size;
-	struct isl_pw_aff_piece p[1];
-};
-
-struct isl_pw_multi_aff_piece {
-	isl_set *set;
-	isl_multi_aff *maff;
-};
-
-struct isl_pw_multi_aff {
-	int ref;
-
-	isl_space *dim;
-
-	int n;
-
-	size_t size;
-	struct isl_pw_multi_aff_piece p[1];
-};
-
-__isl_give isl_aff *isl_aff_alloc(__isl_take isl_local_space *ls);
-
-__isl_give isl_aff *isl_aff_reset_space_and_domain(__isl_take isl_aff *aff,
-	__isl_take isl_space *space, __isl_take isl_space *domain);
-__isl_give isl_aff *isl_aff_reset_domain_space(__isl_take isl_aff *aff,
-	__isl_take isl_space *dim);
-__isl_give isl_aff *isl_aff_realign_domain(__isl_take isl_aff *aff,
-	__isl_take isl_reordering *r);
-
-__isl_give isl_aff *isl_aff_normalize(__isl_take isl_aff *aff);
-
-__isl_give isl_aff *isl_aff_expand_divs( __isl_take isl_aff *aff,
-	__isl_take isl_mat *div, int *exp);
-
-__isl_give isl_pw_aff *isl_pw_aff_alloc_size(__isl_take isl_space *space,
-	int n);
-__isl_give isl_pw_aff *isl_pw_aff_reset_space(__isl_take isl_pw_aff *pwaff,
-	__isl_take isl_space *dim);
-__isl_give isl_pw_aff *isl_pw_aff_reset_domain_space(
-	__isl_take isl_pw_aff *pwaff, __isl_take isl_space *space);
-__isl_give isl_pw_aff *isl_pw_aff_add_disjoint(
-	__isl_take isl_pw_aff *pwaff1, __isl_take isl_pw_aff *pwaff2);
-
-__isl_give isl_pw_aff *isl_pw_aff_union_opt(__isl_take isl_pw_aff *pwaff1,
-	__isl_take isl_pw_aff *pwaff2, int max);
-
-#undef BASE
-#define BASE aff
-
-#include <isl_multi_templ.h>
-
-__isl_give isl_multi_aff *isl_multi_aff_dup(__isl_keep isl_multi_aff *multi);
-__isl_give isl_multi_aff *isl_multi_aff_align_params(
-	__isl_take isl_multi_aff *multi, __isl_take isl_space *model);
-
-__isl_give isl_multi_aff *isl_multi_aff_drop_dims(
-	__isl_take isl_multi_aff *maff,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_reset_domain_space(
-	__isl_take isl_pw_multi_aff *pwmaff, __isl_take isl_space *space);
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_reset_space(
-	__isl_take isl_pw_multi_aff *pwmaff, __isl_take isl_space *space);
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_add_disjoint(
-	__isl_take isl_pw_multi_aff *pma1, __isl_take isl_pw_multi_aff *pma2);
-
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_project_out(
-	__isl_take isl_pw_multi_aff *pma,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_substitute(
-	__isl_take isl_pw_multi_aff *pma, enum isl_dim_type type, unsigned pos,
-	__isl_keep isl_pw_aff *subs);
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_affine_hull.c b/cloog-0.17.0/isl/isl_affine_hull.c
deleted file mode 100644
index 96af313..0000000
--- a/cloog-0.17.0/isl/isl_affine_hull.c
+++ /dev/null
@@ -1,1018 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl/seq.h>
-#include <isl/set.h>
-#include <isl/lp.h>
-#include <isl/map.h>
-#include "isl_equalities.h"
-#include "isl_sample.h"
-#include "isl_tab.h"
-#include <isl_mat_private.h>
-
-struct isl_basic_map *isl_basic_map_implicit_equalities(
-						struct isl_basic_map *bmap)
-{
-	struct isl_tab *tab;
-
-	if (!bmap)
-		return bmap;
-
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY))
-		return bmap;
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_NO_IMPLICIT))
-		return bmap;
-	if (bmap->n_ineq <= 1)
-		return bmap;
-
-	tab = isl_tab_from_basic_map(bmap);
-	if (isl_tab_detect_implicit_equalities(tab) < 0)
-		goto error;
-	bmap = isl_basic_map_update_from_tab(bmap, tab);
-	isl_tab_free(tab);
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	ISL_F_SET(bmap, ISL_BASIC_MAP_NO_IMPLICIT);
-	return bmap;
-error:
-	isl_tab_free(tab);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_implicit_equalities(
-						struct isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_implicit_equalities((struct isl_basic_map*)bset);
-}
-
-struct isl_map *isl_map_implicit_equalities(struct isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return map;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_implicit_equalities(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Make eq[row][col] of both bmaps equal so we can add the row
- * add the column to the common matrix.
- * Note that because of the echelon form, the columns of row row
- * after column col are zero.
- */
-static void set_common_multiple(
-	struct isl_basic_set *bset1, struct isl_basic_set *bset2,
-	unsigned row, unsigned col)
-{
-	isl_int m, c;
-
-	if (isl_int_eq(bset1->eq[row][col], bset2->eq[row][col]))
-		return;
-
-	isl_int_init(c);
-	isl_int_init(m);
-	isl_int_lcm(m, bset1->eq[row][col], bset2->eq[row][col]);
-	isl_int_divexact(c, m, bset1->eq[row][col]);
-	isl_seq_scale(bset1->eq[row], bset1->eq[row], c, col+1);
-	isl_int_divexact(c, m, bset2->eq[row][col]);
-	isl_seq_scale(bset2->eq[row], bset2->eq[row], c, col+1);
-	isl_int_clear(c);
-	isl_int_clear(m);
-}
-
-/* Delete a given equality, moving all the following equalities one up.
- */
-static void delete_row(struct isl_basic_set *bset, unsigned row)
-{
-	isl_int *t;
-	int r;
-
-	t = bset->eq[row];
-	bset->n_eq--;
-	for (r = row; r < bset->n_eq; ++r)
-		bset->eq[r] = bset->eq[r+1];
-	bset->eq[bset->n_eq] = t;
-}
-
-/* Make first row entries in column col of bset1 identical to
- * those of bset2, using the fact that entry bset1->eq[row][col]=a
- * is non-zero.  Initially, these elements of bset1 are all zero.
- * For each row i < row, we set
- *		A[i] = a * A[i] + B[i][col] * A[row]
- *		B[i] = a * B[i]
- * so that
- *		A[i][col] = B[i][col] = a * old(B[i][col])
- */
-static void construct_column(
-	struct isl_basic_set *bset1, struct isl_basic_set *bset2,
-	unsigned row, unsigned col)
-{
-	int r;
-	isl_int a;
-	isl_int b;
-	unsigned total;
-
-	isl_int_init(a);
-	isl_int_init(b);
-	total = 1 + isl_basic_set_n_dim(bset1);
-	for (r = 0; r < row; ++r) {
-		if (isl_int_is_zero(bset2->eq[r][col]))
-			continue;
-		isl_int_gcd(b, bset2->eq[r][col], bset1->eq[row][col]);
-		isl_int_divexact(a, bset1->eq[row][col], b);
-		isl_int_divexact(b, bset2->eq[r][col], b);
-		isl_seq_combine(bset1->eq[r], a, bset1->eq[r],
-					      b, bset1->eq[row], total);
-		isl_seq_scale(bset2->eq[r], bset2->eq[r], a, total);
-	}
-	isl_int_clear(a);
-	isl_int_clear(b);
-	delete_row(bset1, row);
-}
-
-/* Make first row entries in column col of bset1 identical to
- * those of bset2, using only these entries of the two matrices.
- * Let t be the last row with different entries.
- * For each row i < t, we set
- *	A[i] = (A[t][col]-B[t][col]) * A[i] + (B[i][col]-A[i][col) * A[t]
- *	B[i] = (A[t][col]-B[t][col]) * B[i] + (B[i][col]-A[i][col) * B[t]
- * so that
- *	A[i][col] = B[i][col] = old(A[t][col]*B[i][col]-A[i][col]*B[t][col])
- */
-static int transform_column(
-	struct isl_basic_set *bset1, struct isl_basic_set *bset2,
-	unsigned row, unsigned col)
-{
-	int i, t;
-	isl_int a, b, g;
-	unsigned total;
-
-	for (t = row-1; t >= 0; --t)
-		if (isl_int_ne(bset1->eq[t][col], bset2->eq[t][col]))
-			break;
-	if (t < 0)
-		return 0;
-
-	total = 1 + isl_basic_set_n_dim(bset1);
-	isl_int_init(a);
-	isl_int_init(b);
-	isl_int_init(g);
-	isl_int_sub(b, bset1->eq[t][col], bset2->eq[t][col]);
-	for (i = 0; i < t; ++i) {
-		isl_int_sub(a, bset2->eq[i][col], bset1->eq[i][col]);
-		isl_int_gcd(g, a, b);
-		isl_int_divexact(a, a, g);
-		isl_int_divexact(g, b, g);
-		isl_seq_combine(bset1->eq[i], g, bset1->eq[i], a, bset1->eq[t],
-				total);
-		isl_seq_combine(bset2->eq[i], g, bset2->eq[i], a, bset2->eq[t],
-				total);
-	}
-	isl_int_clear(a);
-	isl_int_clear(b);
-	isl_int_clear(g);
-	delete_row(bset1, t);
-	delete_row(bset2, t);
-	return 1;
-}
-
-/* The implementation is based on Section 5.2 of Michael Karr,
- * "Affine Relationships Among Variables of a Program",
- * except that the echelon form we use starts from the last column
- * and that we are dealing with integer coefficients.
- */
-static struct isl_basic_set *affine_hull(
-	struct isl_basic_set *bset1, struct isl_basic_set *bset2)
-{
-	unsigned total;
-	int col;
-	int row;
-
-	if (!bset1 || !bset2)
-		goto error;
-
-	total = 1 + isl_basic_set_n_dim(bset1);
-
-	row = 0;
-	for (col = total-1; col >= 0; --col) {
-		int is_zero1 = row >= bset1->n_eq ||
-			isl_int_is_zero(bset1->eq[row][col]);
-		int is_zero2 = row >= bset2->n_eq ||
-			isl_int_is_zero(bset2->eq[row][col]);
-		if (!is_zero1 && !is_zero2) {
-			set_common_multiple(bset1, bset2, row, col);
-			++row;
-		} else if (!is_zero1 && is_zero2) {
-			construct_column(bset1, bset2, row, col);
-		} else if (is_zero1 && !is_zero2) {
-			construct_column(bset2, bset1, row, col);
-		} else {
-			if (transform_column(bset1, bset2, row, col))
-				--row;
-		}
-	}
-	isl_assert(bset1->ctx, row == bset1->n_eq, goto error);
-	isl_basic_set_free(bset2);
-	bset1 = isl_basic_set_normalize_constraints(bset1);
-	return bset1;
-error:
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	return NULL;
-}
-
-/* Find an integer point in the set represented by "tab"
- * that lies outside of the equality "eq" e(x) = 0.
- * If "up" is true, look for a point satisfying e(x) - 1 >= 0.
- * Otherwise, look for a point satisfying -e(x) - 1 >= 0 (i.e., e(x) <= -1).
- * The point, if found, is returned.
- * If no point can be found, a zero-length vector is returned.
- *
- * Before solving an ILP problem, we first check if simply
- * adding the normal of the constraint to one of the known
- * integer points in the basic set represented by "tab"
- * yields another point inside the basic set.
- *
- * The caller of this function ensures that the tableau is bounded or
- * that tab->basis and tab->n_unbounded have been set appropriately.
- */
-static struct isl_vec *outside_point(struct isl_tab *tab, isl_int *eq, int up)
-{
-	struct isl_ctx *ctx;
-	struct isl_vec *sample = NULL;
-	struct isl_tab_undo *snap;
-	unsigned dim;
-
-	if (!tab)
-		return NULL;
-	ctx = tab->mat->ctx;
-
-	dim = tab->n_var;
-	sample = isl_vec_alloc(ctx, 1 + dim);
-	if (!sample)
-		return NULL;
-	isl_int_set_si(sample->el[0], 1);
-	isl_seq_combine(sample->el + 1,
-		ctx->one, tab->bmap->sample->el + 1,
-		up ? ctx->one : ctx->negone, eq + 1, dim);
-	if (isl_basic_map_contains(tab->bmap, sample))
-		return sample;
-	isl_vec_free(sample);
-	sample = NULL;
-
-	snap = isl_tab_snap(tab);
-
-	if (!up)
-		isl_seq_neg(eq, eq, 1 + dim);
-	isl_int_sub_ui(eq[0], eq[0], 1);
-
-	if (isl_tab_extend_cons(tab, 1) < 0)
-		goto error;
-	if (isl_tab_add_ineq(tab, eq) < 0)
-		goto error;
-
-	sample = isl_tab_sample(tab);
-
-	isl_int_add_ui(eq[0], eq[0], 1);
-	if (!up)
-		isl_seq_neg(eq, eq, 1 + dim);
-
-	if (sample && isl_tab_rollback(tab, snap) < 0)
-		goto error;
-
-	return sample;
-error:
-	isl_vec_free(sample);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_recession_cone(struct isl_basic_set *bset)
-{
-	int i;
-
-	bset = isl_basic_set_cow(bset);
-	if (!bset)
-		return NULL;
-	isl_assert(bset->ctx, bset->n_div == 0, goto error);
-
-	for (i = 0; i < bset->n_eq; ++i)
-		isl_int_set_si(bset->eq[i][0], 0);
-
-	for (i = 0; i < bset->n_ineq; ++i)
-		isl_int_set_si(bset->ineq[i][0], 0);
-
-	ISL_F_CLR(bset, ISL_BASIC_SET_NO_IMPLICIT);
-	return isl_basic_set_implicit_equalities(bset);
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_recession_cone(__isl_take isl_set *set)
-{
-	int i;
-
-	if (!set)
-		return NULL;
-	if (set->n == 0)
-		return set;
-
-	set = isl_set_remove_divs(set);
-	set = isl_set_cow(set);
-	if (!set)
-		return NULL;
-
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_basic_set_recession_cone(set->p[i]);
-		if (!set->p[i])
-			goto error;
-	}
-
-	return set;
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-/* Extend an initial (under-)approximation of the affine hull of basic
- * set represented by the tableau "tab"
- * by looking for points that do not satisfy one of the equalities
- * in the current approximation and adding them to that approximation
- * until no such points can be found any more.
- *
- * The caller of this function ensures that "tab" is bounded or
- * that tab->basis and tab->n_unbounded have been set appropriately.
- */
-static struct isl_basic_set *extend_affine_hull(struct isl_tab *tab,
-	struct isl_basic_set *hull)
-{
-	int i, j;
-	unsigned dim;
-
-	if (!tab || !hull)
-		goto error;
-
-	dim = tab->n_var;
-
-	if (isl_tab_extend_cons(tab, 2 * dim + 1) < 0)
-		goto error;
-
-	for (i = 0; i < dim; ++i) {
-		struct isl_vec *sample;
-		struct isl_basic_set *point;
-		for (j = 0; j < hull->n_eq; ++j) {
-			sample = outside_point(tab, hull->eq[j], 1);
-			if (!sample)
-				goto error;
-			if (sample->size > 0)
-				break;
-			isl_vec_free(sample);
-			sample = outside_point(tab, hull->eq[j], 0);
-			if (!sample)
-				goto error;
-			if (sample->size > 0)
-				break;
-			isl_vec_free(sample);
-
-			if (isl_tab_add_eq(tab, hull->eq[j]) < 0)
-				goto error;
-		}
-		if (j == hull->n_eq)
-			break;
-		if (tab->samples)
-			tab = isl_tab_add_sample(tab, isl_vec_copy(sample));
-		if (!tab)
-			goto error;
-		point = isl_basic_set_from_vec(sample);
-		hull = affine_hull(hull, point);
-		if (!hull)
-			return NULL;
-	}
-
-	return hull;
-error:
-	isl_basic_set_free(hull);
-	return NULL;
-}
-
-/* Drop all constraints in bset that involve any of the dimensions
- * first to first+n-1.
- */
-__isl_give isl_basic_set *isl_basic_set_drop_constraints_involving(
-	__isl_take isl_basic_set *bset, unsigned first, unsigned n)
-{
-	int i;
-
-	if (n == 0)
-		return bset;
-
-	bset = isl_basic_set_cow(bset);
-
-	if (!bset)
-		return NULL;
-
-	for (i = bset->n_eq - 1; i >= 0; --i) {
-		if (isl_seq_first_non_zero(bset->eq[i] + 1 + first, n) == -1)
-			continue;
-		isl_basic_set_drop_equality(bset, i);
-	}
-
-	for (i = bset->n_ineq - 1; i >= 0; --i) {
-		if (isl_seq_first_non_zero(bset->ineq[i] + 1 + first, n) == -1)
-			continue;
-		isl_basic_set_drop_inequality(bset, i);
-	}
-
-	return bset;
-}
-
-/* Look for all equalities satisfied by the integer points in bset,
- * which is assumed to be bounded.
- *
- * The equalities are obtained by successively looking for
- * a point that is affinely independent of the points found so far.
- * In particular, for each equality satisfied by the points so far,
- * we check if there is any point on a hyperplane parallel to the
- * corresponding hyperplane shifted by at least one (in either direction).
- */
-static struct isl_basic_set *uset_affine_hull_bounded(struct isl_basic_set *bset)
-{
-	struct isl_vec *sample = NULL;
-	struct isl_basic_set *hull;
-	struct isl_tab *tab = NULL;
-	unsigned dim;
-
-	if (isl_basic_set_plain_is_empty(bset))
-		return bset;
-
-	dim = isl_basic_set_n_dim(bset);
-
-	if (bset->sample && bset->sample->size == 1 + dim) {
-		int contains = isl_basic_set_contains(bset, bset->sample);
-		if (contains < 0)
-			goto error;
-		if (contains) {
-			if (dim == 0)
-				return bset;
-			sample = isl_vec_copy(bset->sample);
-		} else {
-			isl_vec_free(bset->sample);
-			bset->sample = NULL;
-		}
-	}
-
-	tab = isl_tab_from_basic_set(bset);
-	if (!tab)
-		goto error;
-	if (tab->empty) {
-		isl_tab_free(tab);
-		isl_vec_free(sample);
-		return isl_basic_set_set_to_empty(bset);
-	}
-	if (isl_tab_track_bset(tab, isl_basic_set_copy(bset)) < 0)
-		goto error;
-
-	if (!sample) {
-		struct isl_tab_undo *snap;
-		snap = isl_tab_snap(tab);
-		sample = isl_tab_sample(tab);
-		if (isl_tab_rollback(tab, snap) < 0)
-			goto error;
-		isl_vec_free(tab->bmap->sample);
-		tab->bmap->sample = isl_vec_copy(sample);
-	}
-
-	if (!sample)
-		goto error;
-	if (sample->size == 0) {
-		isl_tab_free(tab);
-		isl_vec_free(sample);
-		return isl_basic_set_set_to_empty(bset);
-	}
-
-	hull = isl_basic_set_from_vec(sample);
-
-	isl_basic_set_free(bset);
-	hull = extend_affine_hull(tab, hull);
-	isl_tab_free(tab);
-
-	return hull;
-error:
-	isl_vec_free(sample);
-	isl_tab_free(tab);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Given an unbounded tableau and an integer point satisfying the tableau,
- * construct an initial affine hull containing the recession cone
- * shifted to the given point.
- *
- * The unbounded directions are taken from the last rows of the basis,
- * which is assumed to have been initialized appropriately.
- */
-static __isl_give isl_basic_set *initial_hull(struct isl_tab *tab,
-	__isl_take isl_vec *vec)
-{
-	int i;
-	int k;
-	struct isl_basic_set *bset = NULL;
-	struct isl_ctx *ctx;
-	unsigned dim;
-
-	if (!vec || !tab)
-		return NULL;
-	ctx = vec->ctx;
-	isl_assert(ctx, vec->size != 0, goto error);
-
-	bset = isl_basic_set_alloc(ctx, 0, vec->size - 1, 0, vec->size - 1, 0);
-	if (!bset)
-		goto error;
-	dim = isl_basic_set_n_dim(bset) - tab->n_unbounded;
-	for (i = 0; i < dim; ++i) {
-		k = isl_basic_set_alloc_equality(bset);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(bset->eq[k] + 1, tab->basis->row[1 + i] + 1,
-			    vec->size - 1);
-		isl_seq_inner_product(bset->eq[k] + 1, vec->el +1,
-				      vec->size - 1, &bset->eq[k][0]);
-		isl_int_neg(bset->eq[k][0], bset->eq[k][0]);
-	}
-	bset->sample = vec;
-	bset = isl_basic_set_gauss(bset, NULL);
-
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	isl_vec_free(vec);
-	return NULL;
-}
-
-/* Given a tableau of a set and a tableau of the corresponding
- * recession cone, detect and add all equalities to the tableau.
- * If the tableau is bounded, then we can simply keep the
- * tableau in its state after the return from extend_affine_hull.
- * However, if the tableau is unbounded, then
- * isl_tab_set_initial_basis_with_cone will add some additional
- * constraints to the tableau that have to be removed again.
- * In this case, we therefore rollback to the state before
- * any constraints were added and then add the equalities back in.
- */
-struct isl_tab *isl_tab_detect_equalities(struct isl_tab *tab,
-	struct isl_tab *tab_cone)
-{
-	int j;
-	struct isl_vec *sample;
-	struct isl_basic_set *hull;
-	struct isl_tab_undo *snap;
-
-	if (!tab || !tab_cone)
-		goto error;
-
-	snap = isl_tab_snap(tab);
-
-	isl_mat_free(tab->basis);
-	tab->basis = NULL;
-
-	isl_assert(tab->mat->ctx, tab->bmap, goto error);
-	isl_assert(tab->mat->ctx, tab->samples, goto error);
-	isl_assert(tab->mat->ctx, tab->samples->n_col == 1 + tab->n_var, goto error);
-	isl_assert(tab->mat->ctx, tab->n_sample > tab->n_outside, goto error);
-
-	if (isl_tab_set_initial_basis_with_cone(tab, tab_cone) < 0)
-		goto error;
-
-	sample = isl_vec_alloc(tab->mat->ctx, 1 + tab->n_var);
-	if (!sample)
-		goto error;
-
-	isl_seq_cpy(sample->el, tab->samples->row[tab->n_outside], sample->size);
-
-	isl_vec_free(tab->bmap->sample);
-	tab->bmap->sample = isl_vec_copy(sample);
-
-	if (tab->n_unbounded == 0)
-		hull = isl_basic_set_from_vec(isl_vec_copy(sample));
-	else
-		hull = initial_hull(tab, isl_vec_copy(sample));
-
-	for (j = tab->n_outside + 1; j < tab->n_sample; ++j) {
-		isl_seq_cpy(sample->el, tab->samples->row[j], sample->size);
-		hull = affine_hull(hull,
-				isl_basic_set_from_vec(isl_vec_copy(sample)));
-	}
-
-	isl_vec_free(sample);
-
-	hull = extend_affine_hull(tab, hull);
-	if (!hull)
-		goto error;
-
-	if (tab->n_unbounded == 0) {
-		isl_basic_set_free(hull);
-		return tab;
-	}
-
-	if (isl_tab_rollback(tab, snap) < 0)
-		goto error;
-
-	if (hull->n_eq > tab->n_zero) {
-		for (j = 0; j < hull->n_eq; ++j) {
-			isl_seq_normalize(tab->mat->ctx, hull->eq[j], 1 + tab->n_var);
-			if (isl_tab_add_eq(tab, hull->eq[j]) < 0)
-				goto error;
-		}
-	}
-
-	isl_basic_set_free(hull);
-
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-/* Compute the affine hull of "bset", where "cone" is the recession cone
- * of "bset".
- *
- * We first compute a unimodular transformation that puts the unbounded
- * directions in the last dimensions.  In particular, we take a transformation
- * that maps all equalities to equalities (in HNF) on the first dimensions.
- * Let x be the original dimensions and y the transformed, with y_1 bounded
- * and y_2 unbounded.
- *
- *	       [ y_1 ]			[ y_1 ]   [ Q_1 ]
- *	x = U  [ y_2 ]			[ y_2 ] = [ Q_2 ] x
- *
- * Let's call the input basic set S.  We compute S' = preimage(S, U)
- * and drop the final dimensions including any constraints involving them.
- * This results in set S''.
- * Then we compute the affine hull A'' of S''.
- * Let F y_1 >= g be the constraint system of A''.  In the transformed
- * space the y_2 are unbounded, so we can add them back without any constraints,
- * resulting in
- *
- *		        [ y_1 ]
- *		[ F 0 ] [ y_2 ] >= g
- * or
- *		        [ Q_1 ]
- *		[ F 0 ] [ Q_2 ] x >= g
- * or
- *		F Q_1 x >= g
- *
- * The affine hull in the original space is then obtained as
- * A = preimage(A'', Q_1).
- */
-static struct isl_basic_set *affine_hull_with_cone(struct isl_basic_set *bset,
-	struct isl_basic_set *cone)
-{
-	unsigned total;
-	unsigned cone_dim;
-	struct isl_basic_set *hull;
-	struct isl_mat *M, *U, *Q;
-
-	if (!bset || !cone)
-		goto error;
-
-	total = isl_basic_set_total_dim(cone);
-	cone_dim = total - cone->n_eq;
-
-	M = isl_mat_sub_alloc6(bset->ctx, cone->eq, 0, cone->n_eq, 1, total);
-	M = isl_mat_left_hermite(M, 0, &U, &Q);
-	if (!M)
-		goto error;
-	isl_mat_free(M);
-
-	U = isl_mat_lin_to_aff(U);
-	bset = isl_basic_set_preimage(bset, isl_mat_copy(U));
-
-	bset = isl_basic_set_drop_constraints_involving(bset, total - cone_dim,
-							cone_dim);
-	bset = isl_basic_set_drop_dims(bset, total - cone_dim, cone_dim);
-
-	Q = isl_mat_lin_to_aff(Q);
-	Q = isl_mat_drop_rows(Q, 1 + total - cone_dim, cone_dim);
-
-	if (bset && bset->sample && bset->sample->size == 1 + total)
-		bset->sample = isl_mat_vec_product(isl_mat_copy(Q), bset->sample);
-
-	hull = uset_affine_hull_bounded(bset);
-
-	if (!hull)
-		isl_mat_free(U);
-	else {
-		struct isl_vec *sample = isl_vec_copy(hull->sample);
-		U = isl_mat_drop_cols(U, 1 + total - cone_dim, cone_dim);
-		if (sample && sample->size > 0)
-			sample = isl_mat_vec_product(U, sample);
-		else
-			isl_mat_free(U);
-		hull = isl_basic_set_preimage(hull, Q);
-		if (hull) {
-			isl_vec_free(hull->sample);
-			hull->sample = sample;
-		} else
-			isl_vec_free(sample);
-	}
-
-	isl_basic_set_free(cone);
-
-	return hull;
-error:
-	isl_basic_set_free(bset);
-	isl_basic_set_free(cone);
-	return NULL;
-}
-
-/* Look for all equalities satisfied by the integer points in bset,
- * which is assumed not to have any explicit equalities.
- *
- * The equalities are obtained by successively looking for
- * a point that is affinely independent of the points found so far.
- * In particular, for each equality satisfied by the points so far,
- * we check if there is any point on a hyperplane parallel to the
- * corresponding hyperplane shifted by at least one (in either direction).
- *
- * Before looking for any outside points, we first compute the recession
- * cone.  The directions of this recession cone will always be part
- * of the affine hull, so there is no need for looking for any points
- * in these directions.
- * In particular, if the recession cone is full-dimensional, then
- * the affine hull is simply the whole universe.
- */
-static struct isl_basic_set *uset_affine_hull(struct isl_basic_set *bset)
-{
-	struct isl_basic_set *cone;
-
-	if (isl_basic_set_plain_is_empty(bset))
-		return bset;
-
-	cone = isl_basic_set_recession_cone(isl_basic_set_copy(bset));
-	if (!cone)
-		goto error;
-	if (cone->n_eq == 0) {
-		struct isl_basic_set *hull;
-		isl_basic_set_free(cone);
-		hull = isl_basic_set_universe_like(bset);
-		isl_basic_set_free(bset);
-		return hull;
-	}
-
-	if (cone->n_eq < isl_basic_set_total_dim(cone))
-		return affine_hull_with_cone(bset, cone);
-
-	isl_basic_set_free(cone);
-	return uset_affine_hull_bounded(bset);
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Look for all equalities satisfied by the integer points in bmap
- * that are independent of the equalities already explicitly available
- * in bmap.
- *
- * We first remove all equalities already explicitly available,
- * then look for additional equalities in the reduced space
- * and then transform the result to the original space.
- * The original equalities are _not_ added to this set.  This is
- * the responsibility of the calling function.
- * The resulting basic set has all meaning about the dimensions removed.
- * In particular, dimensions that correspond to existential variables
- * in bmap and that are found to be fixed are not removed.
- */
-static struct isl_basic_set *equalities_in_underlying_set(
-						struct isl_basic_map *bmap)
-{
-	struct isl_mat *T1 = NULL;
-	struct isl_mat *T2 = NULL;
-	struct isl_basic_set *bset = NULL;
-	struct isl_basic_set *hull = NULL;
-
-	bset = isl_basic_map_underlying_set(bmap);
-	if (!bset)
-		return NULL;
-	if (bset->n_eq)
-		bset = isl_basic_set_remove_equalities(bset, &T1, &T2);
-	if (!bset)
-		goto error;
-
-	hull = uset_affine_hull(bset);
-	if (!T2)
-		return hull;
-
-	if (!hull) {
-		isl_mat_free(T1);
-		isl_mat_free(T2);
-	} else {
-		struct isl_vec *sample = isl_vec_copy(hull->sample);
-		if (sample && sample->size > 0)
-			sample = isl_mat_vec_product(T1, sample);
-		else
-			isl_mat_free(T1);
-		hull = isl_basic_set_preimage(hull, T2);
-		if (hull) {
-			isl_vec_free(hull->sample);
-			hull->sample = sample;
-		} else
-			isl_vec_free(sample);
-	}
-
-	return hull;
-error:
-	isl_mat_free(T2);
-	isl_basic_set_free(bset);
-	isl_basic_set_free(hull);
-	return NULL;
-}
-
-/* Detect and make explicit all equalities satisfied by the (integer)
- * points in bmap.
- */
-struct isl_basic_map *isl_basic_map_detect_equalities(
-						struct isl_basic_map *bmap)
-{
-	int i, j;
-	struct isl_basic_set *hull = NULL;
-
-	if (!bmap)
-		return NULL;
-	if (bmap->n_ineq == 0)
-		return bmap;
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY))
-		return bmap;
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_ALL_EQUALITIES))
-		return bmap;
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL))
-		return isl_basic_map_implicit_equalities(bmap);
-
-	hull = equalities_in_underlying_set(isl_basic_map_copy(bmap));
-	if (!hull)
-		goto error;
-	if (ISL_F_ISSET(hull, ISL_BASIC_SET_EMPTY)) {
-		isl_basic_set_free(hull);
-		return isl_basic_map_set_to_empty(bmap);
-	}
-	bmap = isl_basic_map_extend_space(bmap, isl_space_copy(bmap->dim), 0,
-					hull->n_eq, 0);
-	for (i = 0; i < hull->n_eq; ++i) {
-		j = isl_basic_map_alloc_equality(bmap);
-		if (j < 0)
-			goto error;
-		isl_seq_cpy(bmap->eq[j], hull->eq[i],
-				1 + isl_basic_set_total_dim(hull));
-	}
-	isl_vec_free(bmap->sample);
-	bmap->sample = isl_vec_copy(hull->sample);
-	isl_basic_set_free(hull);
-	ISL_F_SET(bmap, ISL_BASIC_MAP_NO_IMPLICIT | ISL_BASIC_MAP_ALL_EQUALITIES);
-	bmap = isl_basic_map_simplify(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_set_free(hull);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_detect_equalities(
-						__isl_take isl_basic_set *bset)
-{
-	return (isl_basic_set *)
-		isl_basic_map_detect_equalities((isl_basic_map *)bset);
-}
-
-__isl_give isl_map *isl_map_inline_foreach_basic_map(__isl_take isl_map *map,
-	__isl_give isl_basic_map *(*fn)(__isl_take isl_basic_map *bmap))
-{
-	struct isl_basic_map *bmap;
-	int i;
-
-	if (!map)
-		return NULL;
-
-	for (i = 0; i < map->n; ++i) {
-		bmap = isl_basic_map_copy(map->p[i]);
-		bmap = fn(bmap);
-		if (!bmap)
-			goto error;
-		isl_basic_map_free(map->p[i]);
-		map->p[i] = bmap;
-	}
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_detect_equalities(__isl_take isl_map *map)
-{
-	return isl_map_inline_foreach_basic_map(map,
-					    &isl_basic_map_detect_equalities);
-}
-
-__isl_give isl_set *isl_set_detect_equalities(__isl_take isl_set *set)
-{
-	return (isl_set *)isl_map_detect_equalities((isl_map *)set);
-}
-
-/* After computing the rational affine hull (by detecting the implicit
- * equalities), we compute the additional equalities satisfied by
- * the integer points (if any) and add the original equalities back in.
- */
-struct isl_basic_map *isl_basic_map_affine_hull(struct isl_basic_map *bmap)
-{
-	bmap = isl_basic_map_detect_equalities(bmap);
-	bmap = isl_basic_map_cow(bmap);
-	if (bmap)
-		isl_basic_map_free_inequality(bmap, bmap->n_ineq);
-	bmap = isl_basic_map_finalize(bmap);
-	return bmap;
-}
-
-struct isl_basic_set *isl_basic_set_affine_hull(struct isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_affine_hull((struct isl_basic_map *)bset);
-}
-
-struct isl_basic_map *isl_map_affine_hull(struct isl_map *map)
-{
-	int i;
-	struct isl_basic_map *model = NULL;
-	struct isl_basic_map *hull = NULL;
-	struct isl_set *set;
-
-	map = isl_map_detect_equalities(map);
-	map = isl_map_align_divs(map);
-
-	if (!map)
-		return NULL;
-
-	if (map->n == 0) {
-		hull = isl_basic_map_empty_like_map(map);
-		isl_map_free(map);
-		return hull;
-	}
-
-	model = isl_basic_map_copy(map->p[0]);
-	set = isl_map_underlying_set(map);
-	set = isl_set_cow(set);
-	if (!set)
-		goto error;
-
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_basic_set_cow(set->p[i]);
-		set->p[i] = isl_basic_set_affine_hull(set->p[i]);
-		set->p[i] = isl_basic_set_gauss(set->p[i], NULL);
-		if (!set->p[i])
-			goto error;
-	}
-	set = isl_set_remove_empty_parts(set);
-	if (set->n == 0) {
-		hull = isl_basic_map_empty_like(model);
-		isl_basic_map_free(model);
-	} else {
-		struct isl_basic_set *bset;
-		while (set->n > 1) {
-			set->p[0] = affine_hull(set->p[0], set->p[--set->n]);
-			if (!set->p[0])
-				goto error;
-		}
-		bset = isl_basic_set_copy(set->p[0]);
-		hull = isl_basic_map_overlying_set(bset, model);
-	}
-	isl_set_free(set);
-	hull = isl_basic_map_simplify(hull);
-	return isl_basic_map_finalize(hull);
-error:
-	isl_basic_map_free(model);
-	isl_set_free(set);
-	return NULL;
-}
-
-struct isl_basic_set *isl_set_affine_hull(struct isl_set *set)
-{
-	return (struct isl_basic_set *)
-		isl_map_affine_hull((struct isl_map *)set);
-}
diff --git a/cloog-0.17.0/isl/isl_arg.c b/cloog-0.17.0/isl/isl_arg.c
deleted file mode 100644
index 6961a07..0000000
--- a/cloog-0.17.0/isl/isl_arg.c
+++ /dev/null
@@ -1,1205 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <isl/arg.h>
-#include <isl/ctx.h>
-
-static struct isl_arg help_arg[] = {
-ISL_ARG_PHANTOM_BOOL('h', "help", NULL, "print this help, then exit")
-};
-
-static void set_default_choice(struct isl_arg *arg, void *opt)
-{
-	*(unsigned *)(((char *)opt) + arg->offset) = arg->u.choice.default_value;
-}
-
-static void set_default_flags(struct isl_arg *arg, void *opt)
-{
-	*(unsigned *)(((char *)opt) + arg->offset) = arg->u.flags.default_value;
-}
-
-static void set_default_bool(struct isl_arg *arg, void *opt)
-{
-	if (arg->offset == (size_t) -1)
-		return;
-	*(unsigned *)(((char *)opt) + arg->offset) = arg->u.b.default_value;
-}
-
-static void set_default_child(struct isl_arg *arg, void *opt)
-{
-	void *child;
-
-	if (arg->offset == (size_t) -1)
-		child = opt;
-	else {
-		child = calloc(1, arg->u.child.child->options_size);
-		*(void **)(((char *)opt) + arg->offset) = child;
-	}
-
-	if (child)
-		isl_args_set_defaults(arg->u.child.child, child);
-}
-
-static void set_default_user(struct isl_arg *arg, void *opt)
-{
-	arg->u.user.init(((char *)opt) + arg->offset);
-}
-
-static void set_default_int(struct isl_arg *arg, void *opt)
-{
-	*(int *)(((char *)opt) + arg->offset) = arg->u.i.default_value;
-}
-
-static void set_default_long(struct isl_arg *arg, void *opt)
-{
-	*(long *)(((char *)opt) + arg->offset) = arg->u.l.default_value;
-}
-
-static void set_default_ulong(struct isl_arg *arg, void *opt)
-{
-	*(unsigned long *)(((char *)opt) + arg->offset) = arg->u.ul.default_value;
-}
-
-static void set_default_str(struct isl_arg *arg, void *opt)
-{
-	const char *str = NULL;
-	if (arg->u.str.default_value)
-		str = strdup(arg->u.str.default_value);
-	*(const char **)(((char *)opt) + arg->offset) = str;
-}
-
-static void set_default_str_list(struct isl_arg *arg, void *opt)
-{
-	*(const char ***)(((char *) opt) + arg->offset) = NULL;
-	*(int *)(((char *) opt) + arg->u.str_list.offset_n) = 0;
-}
-
-void isl_args_set_defaults(struct isl_args *args, void *opt)
-{
-	int i;
-
-	for (i = 0; args->args[i].type != isl_arg_end; ++i) {
-		switch (args->args[i].type) {
-		case isl_arg_choice:
-			set_default_choice(&args->args[i], opt);
-			break;
-		case isl_arg_flags:
-			set_default_flags(&args->args[i], opt);
-			break;
-		case isl_arg_bool:
-			set_default_bool(&args->args[i], opt);
-			break;
-		case isl_arg_child:
-			set_default_child(&args->args[i], opt);
-			break;
-		case isl_arg_user:
-			set_default_user(&args->args[i], opt);
-			break;
-		case isl_arg_int:
-			set_default_int(&args->args[i], opt);
-			break;
-		case isl_arg_long:
-			set_default_long(&args->args[i], opt);
-			break;
-		case isl_arg_ulong:
-			set_default_ulong(&args->args[i], opt);
-			break;
-		case isl_arg_arg:
-		case isl_arg_str:
-			set_default_str(&args->args[i], opt);
-			break;
-		case isl_arg_str_list:
-			set_default_str_list(&args->args[i], opt);
-			break;
-		case isl_arg_alias:
-		case isl_arg_footer:
-		case isl_arg_version:
-		case isl_arg_end:
-			break;
-		}
-	}
-}
-
-static void free_str_list(struct isl_arg *arg, void *opt)
-{
-	int i;
-	int n = *(int *)(((char *) opt) + arg->u.str_list.offset_n);
-	char **list = *(char ***)(((char *) opt) + arg->offset);
-
-	for (i = 0; i < n; ++i)
-		free(list[i]);
-	free(list);
-}
-
-static void free_args(struct isl_arg *arg, void *opt)
-{
-	int i;
-
-	for (i = 0; arg[i].type != isl_arg_end; ++i) {
-		switch (arg[i].type) {
-		case isl_arg_child:
-			if (arg[i].offset == (size_t) -1)
-				free_args(arg[i].u.child.child->args, opt);
-			else
-				isl_args_free(arg[i].u.child.child,
-				    *(void **)(((char *)opt) + arg[i].offset));
-			break;
-		case isl_arg_arg:
-		case isl_arg_str:
-			free(*(char **)(((char *)opt) + arg[i].offset));
-			break;
-		case isl_arg_str_list:
-			free_str_list(&arg[i], opt);
-			break;
-		case isl_arg_user:
-			if (arg[i].u.user.clear)
-				arg[i].u.user.clear(((char *)opt) + arg[i].offset);
-			break;
-		case isl_arg_alias:
-		case isl_arg_bool:
-		case isl_arg_choice:
-		case isl_arg_flags:
-		case isl_arg_int:
-		case isl_arg_long:
-		case isl_arg_ulong:
-		case isl_arg_version:
-		case isl_arg_footer:
-		case isl_arg_end:
-			break;
-		}
-	}
-}
-
-void isl_args_free(struct isl_args *args, void *opt)
-{
-	if (!opt)
-		return;
-
-	free_args(args->args, opt);
-
-	free(opt);
-}
-
-static int print_arg_help(struct isl_arg *decl, const char *prefix, int no)
-{
-	int len = 0;
-
-	if (!decl->long_name) {
-		printf("  -%c", decl->short_name);
-		return 4;
-	}
-
-	if (decl->short_name) {
-		printf("  -%c, --", decl->short_name);
-		len += 8;
-	} else if (decl->flags & ISL_ARG_SINGLE_DASH) {
-		printf("  -");
-		len += 3;
-	} else {
-		printf("      --");
-		len += 8;
-	}
-
-	if (prefix) {
-		printf("%s-", prefix);
-		len += strlen(prefix) + 1;
-	}
-	if (no) {
-		printf("no-");
-		len += 3;
-	}
-	printf("%s", decl->long_name);
-	len += strlen(decl->long_name);
-
-	while ((++decl)->type == isl_arg_alias) {
-		printf(", --");
-		len += 4;
-		if (no) {
-			printf("no-");
-			len += 3;
-		}
-		printf("%s", decl->long_name);
-		len += strlen(decl->long_name);
-	}
-
-	return len;
-}
-
-const void *isl_memrchr(const void *s, int c, size_t n)
-{
-	const char *p = s;
-	while (n-- > 0)
-		if (p[n] == c)
-			return p + n;
-	return NULL;
-}
-
-static int wrap_msg(const char *s, int indent, int pos)
-{
-	int len;
-	int wrap_len = 75 - indent;
-
-	if (pos + 1 >= indent)
-		printf("\n%*s", indent, "");
-	else
-		printf("%*s", indent - pos, "");
-
-	len = strlen(s);
-	while (len > wrap_len) {
-		const char *space = isl_memrchr(s, ' ', wrap_len);
-		int l;
-
-		if (!space)
-			space = strchr(s + wrap_len, ' ');
-		if (!space)
-			break;
-		l = space - s;
-		printf("%.*s", l, s);
-		s = space + 1;
-		len -= l + 1;
-		printf("\n%*s", indent, "");
-	}
-
-	printf("%s", s);
-	return len;
-}
-
-static int print_help_msg(struct isl_arg *decl, int pos)
-{
-	if (!decl->help_msg)
-		return pos;
-
-	return wrap_msg(decl->help_msg, 30, pos);
-}
-
-static void print_default(struct isl_arg *decl, const char *def, int pos)
-{
-	const char *default_prefix = "[default: ";
-	const char *default_suffix = "]";
-	int len;
-
-	len = strlen(default_prefix) + strlen(def) + strlen(default_suffix);
-
-	if (!decl->help_msg) {
-		if (pos >= 29)
-			printf("\n%30s", "");
-		else
-			printf("%*s", 30 - pos, "");
-		pos = 0;
-	} else {
-		if (pos + len >= 48)
-			printf("\n%30s", "");
-		else
-			printf(" ");
-	}
-	printf("%s%s%s", default_prefix, def, default_suffix);
-}
-
-static void print_default_choice(struct isl_arg *decl, void *opt, int pos)
-{
-	int i;
-	const char *s = "none";
-	unsigned *p;
-
-	p = (unsigned *)(((char *) opt) + decl->offset);
-	for (i = 0; decl->u.choice.choice[i].name; ++i)
-		if (decl->u.choice.choice[i].value == *p) {
-			s = decl->u.choice.choice[i].name;
-			break;
-		}
-
-	print_default(decl, s, pos);
-}
-
-static void print_choice_help(struct isl_arg *decl, const char *prefix,
-	void *opt)
-{
-	int i;
-	int pos;
-
-	pos = print_arg_help(decl, prefix, 0);
-	printf("=");
-	pos++;
-
-	for (i = 0; decl->u.choice.choice[i].name; ++i) {
-		if (i) {
-			printf("|");
-			pos++;
-		}
-		printf("%s", decl->u.choice.choice[i].name);
-		pos += strlen(decl->u.choice.choice[i].name);
-	}
-
-	pos = print_help_msg(decl, pos);
-	print_default_choice(decl, opt, pos);
-
-	printf("\n");
-}
-
-static void print_default_flags(struct isl_arg *decl, void *opt, int pos)
-{
-	int i, first;
-	const char *default_prefix = "[default: ";
-	const char *default_suffix = "]";
-	int len = strlen(default_prefix) + strlen(default_suffix);
-	unsigned *p;
-
-	p = (unsigned *)(((char *) opt) + decl->offset);
-	for (i = 0; decl->u.flags.flags[i].name; ++i)
-		if ((*p & decl->u.flags.flags[i].mask) ==
-		     decl->u.flags.flags[i].value)
-			len += strlen(decl->u.flags.flags[i].name);
-
-	if (!decl->help_msg) {
-		if (pos >= 29)
-			printf("\n%30s", "");
-		else
-			printf("%*s", 30 - pos, "");
-		pos = 0;
-	} else {
-		if (pos + len >= 48)
-			printf("\n%30s", "");
-		else
-			printf(" ");
-	}
-	printf("%s", default_prefix);
-
-	for (first = 1, i = 0; decl->u.flags.flags[i].name; ++i)
-		if ((*p & decl->u.flags.flags[i].mask) ==
-		     decl->u.flags.flags[i].value) {
-			if (!first)
-				printf(",");
-			printf("%s", decl->u.flags.flags[i].name);
-			first = 0;
-		}
-
-	printf("%s", default_suffix);
-}
-
-static void print_flags_help(struct isl_arg *decl, const char *prefix,
-	void *opt)
-{
-	int i, j;
-	int pos;
-
-	pos = print_arg_help(decl, prefix, 0);
-	printf("=");
-	pos++;
-
-	for (i = 0; decl->u.flags.flags[i].name; ++i) {
-		if (i) {
-			printf(",");
-			pos++;
-		}
-		for (j = i;
-		     decl->u.flags.flags[j].mask == decl->u.flags.flags[i].mask;
-		     ++j) {
-			if (j != i) {
-				printf("|");
-				pos++;
-			}
-			printf("%s", decl->u.flags.flags[j].name);
-			pos += strlen(decl->u.flags.flags[j].name);
-		}
-		i = j - 1;
-	}
-
-	pos = print_help_msg(decl, pos);
-	print_default_flags(decl, opt, pos);
-
-	printf("\n");
-}
-
-static void print_bool_help(struct isl_arg *decl, const char *prefix, void *opt)
-{
-	int pos;
-	unsigned *p = opt ? (unsigned *)(((char *) opt) + decl->offset) : NULL;
-	int no = p ? *p == 1 : 0;
-	pos = print_arg_help(decl, prefix, no);
-	pos = print_help_msg(decl, pos);
-	if (decl->offset != (size_t) -1)
-		print_default(decl, no ? "yes" : "no", pos);
-	printf("\n");
-}
-
-static int print_argument_name(struct isl_arg *decl, const char *name, int pos)
-{
-	printf("%c<%s>", decl->long_name ? '=' : ' ', name);
-	return pos + 3 + strlen(name);
-}
-
-static void print_int_help(struct isl_arg *decl, const char *prefix, void *opt)
-{
-	int pos;
-	char val[20];
-	int *p = (int *)(((char *) opt) + decl->offset);
-	pos = print_arg_help(decl, prefix, 0);
-	pos = print_argument_name(decl, decl->argument_name, pos);
-	pos = print_help_msg(decl, pos);
-	snprintf(val, sizeof(val), "%d", *p);
-	print_default(decl, val, pos);
-	printf("\n");
-}
-
-static void print_long_help(struct isl_arg *decl, const char *prefix, void *opt)
-{
-	int pos;
-	long *p = (long *)(((char *) opt) + decl->offset);
-	pos = print_arg_help(decl, prefix, 0);
-	if (*p != decl->u.l.default_selected) {
-		printf("[");
-		pos++;
-	}
-	printf("=long");
-	pos += 5;
-	if (*p != decl->u.l.default_selected) {
-		printf("]");
-		pos++;
-	}
-	print_help_msg(decl, pos);
-	printf("\n");
-}
-
-static void print_ulong_help(struct isl_arg *decl, const char *prefix)
-{
-	int pos;
-	pos = print_arg_help(decl, prefix, 0);
-	printf("=ulong");
-	pos += 6;
-	print_help_msg(decl, pos);
-	printf("\n");
-}
-
-static void print_str_help(struct isl_arg *decl, const char *prefix, void *opt)
-{
-	int pos;
-	const char *a = decl->argument_name ? decl->argument_name : "string";
-	const char **p = (const char **)(((char *) opt) + decl->offset);
-	pos = print_arg_help(decl, prefix, 0);
-	pos = print_argument_name(decl, a, pos);
-	pos = print_help_msg(decl, pos);
-	if (*p)
-		print_default(decl, *p, pos);
-	printf("\n");
-}
-
-static void print_str_list_help(struct isl_arg *decl, const char *prefix)
-{
-	int pos;
-	const char *a = decl->argument_name ? decl->argument_name : "string";
-	pos = print_arg_help(decl, prefix, 0);
-	pos = print_argument_name(decl, a, pos);
-	pos = print_help_msg(decl, pos);
-	printf("\n");
-}
-
-static void print_help(struct isl_arg *arg, const char *prefix, void *opt)
-{
-	int i;
-	int any = 0;
-
-	for (i = 0; arg[i].type != isl_arg_end; ++i) {
-		if (arg[i].flags & ISL_ARG_HIDDEN)
-			continue;
-		switch (arg[i].type) {
-		case isl_arg_flags:
-			print_flags_help(&arg[i], prefix, opt);
-			any = 1;
-			break;
-		case isl_arg_choice:
-			print_choice_help(&arg[i], prefix, opt);
-			any = 1;
-			break;
-		case isl_arg_bool:
-			print_bool_help(&arg[i], prefix, opt);
-			any = 1;
-			break;
-		case isl_arg_int:
-			print_int_help(&arg[i], prefix, opt);
-			any = 1;
-			break;
-		case isl_arg_long:
-			print_long_help(&arg[i], prefix, opt);
-			any = 1;
-			break;
-		case isl_arg_ulong:
-			print_ulong_help(&arg[i], prefix);
-			any = 1;
-			break;
-		case isl_arg_str:
-			print_str_help(&arg[i], prefix, opt);
-			any = 1;
-			break;
-		case isl_arg_str_list:
-			print_str_list_help(&arg[i], prefix);
-			any = 1;
-			break;
-		case isl_arg_alias:
-		case isl_arg_version:
-		case isl_arg_arg:
-		case isl_arg_footer:
-		case isl_arg_child:
-		case isl_arg_user:
-		case isl_arg_end:
-			break;
-		}
-	}
-
-	for (i = 0; arg[i].type != isl_arg_end; ++i) {
-		void *child;
-
-		if (arg[i].type != isl_arg_child)
-			continue;
-		if (arg[i].flags & ISL_ARG_HIDDEN)
-			continue;
-
-		if (any)
-			printf("\n");
-		if (arg[i].help_msg)
-			printf(" %s\n", arg[i].help_msg);
-		if (arg[i].offset == (size_t) -1)
-			child = opt;
-		else
-			child = *(void **)(((char *) opt) + arg[i].offset);
-		print_help(arg[i].u.child.child->args, arg[i].long_name, child);
-		any = 1;
-	}
-}
-
-static const char *prog_name(const char *prog)
-{
-	const char *slash;
-
-	slash = strrchr(prog, '/');
-	if (slash)
-		prog = slash + 1;
-	if (strncmp(prog, "lt-", 3) == 0)
-		prog += 3;
-
-	return prog;
-}
-
-static int any_version(struct isl_arg *decl)
-{
-	int i;
-
-	for (i = 0; decl[i].type != isl_arg_end; ++i) {
-		switch (decl[i].type) {
-		case isl_arg_version:
-			return 1;
-		case isl_arg_child:
-			if (any_version(decl[i].u.child.child->args))
-				return 1;
-			break;
-		default:
-			break;
-		}
-	}
-
-	return 0;
-}
-
-static void print_help_and_exit(struct isl_arg *arg, const char *prog,
-	void *opt)
-{
-	int i;
-
-	printf("Usage: %s [OPTION...]", prog_name(prog));
-
-	for (i = 0; arg[i].type != isl_arg_end; ++i)
-		if (arg[i].type == isl_arg_arg)
-			printf(" %s", arg[i].argument_name);
-
-	printf("\n\n");
-
-	print_help(arg, NULL, opt);
-	printf("\n");
-	if (any_version(arg))
-		printf("  -V, --version\n");
-	print_bool_help(help_arg, NULL, NULL);
-
-	for (i = 0; arg[i].type != isl_arg_end; ++i) {
-		if (arg[i].type != isl_arg_footer)
-			continue;
-		wrap_msg(arg[i].help_msg, 0, 0);
-		printf("\n");
-	}
-
-	exit(0);
-}
-
-static int match_long_name(struct isl_arg *decl,
-	const char *start, const char *end)
-{
-	do {
-		if (end - start == strlen(decl->long_name) &&
-		    !strncmp(start, decl->long_name, end - start))
-			return 1;
-	} while ((++decl)->type == isl_arg_alias);
-
-	return 0;
-}
-
-static const char *skip_dash_dash(struct isl_arg *decl, const char *arg)
-{
-	if (!strncmp(arg, "--", 2))
-		return arg + 2;
-	if ((decl->flags & ISL_ARG_SINGLE_DASH) && arg[0] == '-')
-		return arg + 1;
-	return NULL;
-}
-
-static const char *skip_name(struct isl_arg *decl, const char *arg,
-	const char *prefix, int need_argument, int *has_argument)
-{
-	const char *equal;
-	const char *name;
-	const char *end;
-
-	if (arg[0] == '-' && arg[1] && arg[1] == decl->short_name) {
-		if (need_argument && !arg[2])
-			return NULL;
-		if (has_argument)
-			*has_argument = arg[2] != '\0';
-		return arg + 2;
-	}
-	if (!decl->long_name)
-		return NULL;
-
-	name = skip_dash_dash(decl, arg);
-	if (!name)
-		return NULL;
-
-	equal = strchr(name, '=');
-	if (need_argument && !equal)
-		return NULL;
-
-	if (has_argument)
-		*has_argument = !!equal;
-	end = equal ? equal : name + strlen(name);
-
-	if (prefix) {
-		size_t prefix_len = strlen(prefix);
-		if (strncmp(name, prefix, prefix_len) == 0 &&
-		    name[prefix_len] == '-')
-			name += prefix_len + 1;
-	}
-
-	if (!match_long_name(decl, name, end))
-		return NULL;
-
-	return equal ? equal + 1 : end;
-}
-
-static int parse_choice_option(struct isl_arg *decl, char **arg,
-	const char *prefix, void *opt)
-{
-	int i;
-	int has_argument;
-	const char *choice;
-
-	choice = skip_name(decl, arg[0], prefix, 0, &has_argument);
-	if (!choice)
-		return 0;
-
-	if (!has_argument && (!arg[1] || arg[1][0] == '-')) {
-		unsigned u = decl->u.choice.default_selected;
-		if (decl->u.choice.set)
-			decl->u.choice.set(opt, u);
-		else
-			*(unsigned *)(((char *)opt) + decl->offset) = u;
-
-		return 1;
-	}
-
-	if (!has_argument)
-		choice = arg[1];
-
-	for (i = 0; decl->u.choice.choice[i].name; ++i) {
-		unsigned u;
-
-		if (strcmp(choice, decl->u.choice.choice[i].name))
-			continue;
-
-		u = decl->u.choice.choice[i].value;
-		if (decl->u.choice.set)
-			decl->u.choice.set(opt, u);
-		else
-			*(unsigned *)(((char *)opt) + decl->offset) = u;
-
-		return has_argument ? 1 : 2;
-	}
-
-	return 0;
-}
-
-static int set_flag(struct isl_arg *decl, unsigned *val, const char *flag,
-	size_t len)
-{
-	int i;
-
-	for (i = 0; decl->u.flags.flags[i].name; ++i) {
-		if (strncmp(flag, decl->u.flags.flags[i].name, len))
-			continue;
-
-		*val &= ~decl->u.flags.flags[i].mask;
-		*val |= decl->u.flags.flags[i].value;
-
-		return 1;
-	}
-
-	return 0;
-}
-
-static int parse_flags_option(struct isl_arg *decl, char **arg,
-	const char *prefix, void *opt)
-{
-	int has_argument;
-	const char *flags;
-	const char *comma;
-	unsigned val;
-
-	flags = skip_name(decl, arg[0], prefix, 0, &has_argument);
-	if (!flags)
-		return 0;
-
-	if (!has_argument && !arg[1])
-		return 0;
-
-	if (!has_argument)
-		flags = arg[1];
-
-	val = *(unsigned *)(((char *)opt) + decl->offset);
-
-	while ((comma = strchr(flags, ',')) != NULL) {
-		if (!set_flag(decl, &val, flags, comma - flags))
-			return 0;
-		flags = comma + 1;
-	}
-	if (!set_flag(decl, &val, flags, strlen(flags)))
-		return 0;
-
-	*(unsigned *)(((char *)opt) + decl->offset) = val;
-
-	return has_argument ? 1 : 2;
-}
-
-static int parse_bool_option(struct isl_arg *decl, char **arg,
-	const char *prefix, void *opt)
-{
-	const char *name;
-	unsigned *p = (unsigned *)(((char *)opt) + decl->offset);
-
-	if (skip_name(decl, arg[0], prefix, 0, NULL)) {
-		if ((decl->flags & ISL_ARG_BOOL_ARG) && arg[1]) {
-			char *endptr;
-			int val = strtol(arg[1], &endptr, 0);
-			if (*endptr == '\0' && (val == 0 || val == 1)) {
-				if (decl->u.b.set)
-					decl->u.b.set(opt, val);
-				else if (decl->offset != (size_t) -1)
-					*p = val;
-				return 2;
-			}
-		}
-		if (decl->u.b.set)
-			decl->u.b.set(opt, 1);
-		else if (decl->offset != (size_t) -1)
-			*p = 1;
-
-		return 1;
-	}
-
-	if (!decl->long_name)
-		return 0;
-
-	name = skip_dash_dash(decl, arg[0]);
-	if (!name)
-		return 0;
-
-	if (prefix) {
-		size_t prefix_len = strlen(prefix);
-		if (strncmp(name, prefix, prefix_len) == 0 &&
-		    name[prefix_len] == '-') {
-			name += prefix_len + 1;
-			prefix = NULL;
-		}
-	}
-
-	if (strncmp(name, "no-", 3))
-		return 0;
-	name += 3;
-
-	if (prefix) {
-		size_t prefix_len = strlen(prefix);
-		if (strncmp(name, prefix, prefix_len) == 0 &&
-		    name[prefix_len] == '-')
-			name += prefix_len + 1;
-	}
-
-	if (match_long_name(decl, name, name + strlen(name))) {
-		if (decl->u.b.set)
-			decl->u.b.set(opt, 0);
-		else if (decl->offset != (size_t) -1)
-			*p = 0;
-
-		return 1;
-	}
-
-	return 0;
-}
-
-static int parse_str_option(struct isl_arg *decl, char **arg,
-	const char *prefix, void *opt)
-{
-	int has_argument;
-	const char *s;
-	char **p = (char **)(((char *)opt) + decl->offset);
-
-	s = skip_name(decl, arg[0], prefix, 0, &has_argument);
-	if (!s)
-		return 0;
-
-	if (has_argument) {
-		free(*p);
-		*p = strdup(s);
-		return 1;
-	}
-
-	if (arg[1]) {
-		free(*p);
-		*p = strdup(arg[1]);
-		return 2;
-	}
-
-	return 0;
-}
-
-static int isl_arg_str_list_append(struct isl_arg *decl, void *opt,
-	const char *s)
-{
-	int *n = (int *)(((char *) opt) + decl->u.str_list.offset_n);
-	char **list = *(char ***)(((char *) opt) + decl->offset);
-
-	list = realloc(list, (*n + 1) * sizeof(char *));
-	if (!list)
-		return -1;
-	*(char ***)(((char *) opt) + decl->offset) = list;
-	list[*n] = strdup(s);
-	(*n)++;
-	return 0;
-}
-
-static int parse_str_list_option(struct isl_arg *decl, char **arg,
-	const char *prefix, void *opt)
-{
-	int has_argument;
-	const char *s;
-
-	s = skip_name(decl, arg[0], prefix, 0, &has_argument);
-	if (!s)
-		return 0;
-
-	if (has_argument) {
-		isl_arg_str_list_append(decl, opt, s);
-		return 1;
-	}
-
-	if (arg[1]) {
-		isl_arg_str_list_append(decl, opt, arg[1]);
-		return 2;
-	}
-
-	return 0;
-}
-
-static int parse_int_option(struct isl_arg *decl, char **arg,
-	const char *prefix, void *opt)
-{
-	int has_argument;
-	const char *val;
-	char *endptr;
-	int *p = (int *)(((char *)opt) + decl->offset);
-
-	val = skip_name(decl, arg[0], prefix, 0, &has_argument);
-	if (!val)
-		return 0;
-
-	if (has_argument) {
-		*p = atoi(val);
-		return 1;
-	}
-
-	if (arg[1]) {
-		int i = strtol(arg[1], &endptr, 0);
-		if (*endptr == '\0') {
-			*p = i;
-			return 2;
-		}
-	}
-
-	return 0;
-}
-
-static int parse_long_option(struct isl_arg *decl, char **arg,
-	const char *prefix, void *opt)
-{
-	int has_argument;
-	const char *val;
-	char *endptr;
-	long *p = (long *)(((char *)opt) + decl->offset);
-
-	val = skip_name(decl, arg[0], prefix, 0, &has_argument);
-	if (!val)
-		return 0;
-
-	if (has_argument) {
-		long l = strtol(val, NULL, 0);
-		if (decl->u.l.set)
-			decl->u.l.set(opt, l);
-		else
-			*p = l;
-		return 1;
-	}
-
-	if (arg[1]) {
-		long l = strtol(arg[1], &endptr, 0);
-		if (*endptr == '\0') {
-			if (decl->u.l.set)
-				decl->u.l.set(opt, l);
-			else
-				*p = l;
-			return 2;
-		}
-	}
-
-	if (decl->u.l.default_value != decl->u.l.default_selected) {
-		if (decl->u.l.set)
-			decl->u.l.set(opt, decl->u.l.default_selected);
-		else
-			*p = decl->u.l.default_selected;
-		return 1;
-	}
-
-	return 0;
-}
-
-static int parse_ulong_option(struct isl_arg *decl, char **arg,
-	const char *prefix, void *opt)
-{
-	int has_argument;
-	const char *val;
-	char *endptr;
-	unsigned long *p = (unsigned long *)(((char *)opt) + decl->offset);
-
-	val = skip_name(decl, arg[0], prefix, 0, &has_argument);
-	if (!val)
-		return 0;
-
-	if (has_argument) {
-		*p = strtoul(val, NULL, 0);
-		return 1;
-	}
-
-	if (arg[1]) {
-		unsigned long ul = strtoul(arg[1], &endptr, 0);
-		if (*endptr == '\0') {
-			*p = ul;
-			return 2;
-		}
-	}
-
-	return 0;
-}
-
-static int parse_option(struct isl_arg *decl, char **arg,
-	const char *prefix, void *opt);
-
-static int parse_child_option(struct isl_arg *decl, char **arg,
-	const char *prefix, void *opt)
-{
-	void *child;
-
-	if (decl->offset == (size_t) -1)
-		child = opt;
-	else {
-		child = *(void **)(((char *)opt) + decl->offset);
-		prefix = decl->long_name;
-	}
-	return parse_option(decl->u.child.child->args, arg, prefix, child);
-}
-
-static int parse_option(struct isl_arg *decl, char **arg,
-	const char *prefix, void *opt)
-{
-	int i;
-
-	for (i = 0; decl[i].type != isl_arg_end; ++i) {
-		int parsed = 0;
-		switch (decl[i].type) {
-		case isl_arg_choice:
-			parsed = parse_choice_option(&decl[i], arg, prefix, opt);
-			break;
-		case isl_arg_flags:
-			parsed = parse_flags_option(&decl[i], arg, prefix, opt);
-			break;
-		case isl_arg_int:
-			parsed = parse_int_option(&decl[i], arg, prefix, opt);
-			break;
-		case isl_arg_long:
-			parsed = parse_long_option(&decl[i], arg, prefix, opt);
-			break;
-		case isl_arg_ulong:
-			parsed = parse_ulong_option(&decl[i], arg, prefix, opt);
-			break;
-		case isl_arg_bool:
-			parsed = parse_bool_option(&decl[i], arg, prefix, opt);
-			break;
-		case isl_arg_str:
-			parsed = parse_str_option(&decl[i], arg, prefix, opt);
-			break;
-		case isl_arg_str_list:
-			parsed = parse_str_list_option(&decl[i], arg, prefix,
-							opt);
-			break;
-		case isl_arg_child:
-			parsed = parse_child_option(&decl[i], arg, prefix, opt);
-			break;
-		case isl_arg_alias:
-		case isl_arg_arg:
-		case isl_arg_footer:
-		case isl_arg_user:
-		case isl_arg_version:
-		case isl_arg_end:
-			break;
-		}
-		if (parsed)
-			return parsed;
-	}
-
-	return 0;
-}
-
-static void print_version(struct isl_arg *decl)
-{
-	int i;
-
-	for (i = 0; decl[i].type != isl_arg_end; ++i) {
-		switch (decl[i].type) {
-		case isl_arg_version:
-			decl[i].u.version.print_version();
-			break;
-		case isl_arg_child:
-			print_version(decl[i].u.child.child->args);
-			break;
-		default:
-			break;
-		}
-	}
-}
-
-static void print_version_and_exit(struct isl_arg *decl)
-{
-	print_version(decl);
-
-	exit(0);
-}
-
-static int drop_argument(int argc, char **argv, int drop, int n)
-{
-	for (; drop < argc; ++drop)
-		argv[drop] = argv[drop + n];
-
-	return argc - n;
-}
-
-static int n_arg(struct isl_arg *arg)
-{
-	int i;
-	int n_arg = 0;
-
-	for (i = 0; arg[i].type != isl_arg_end; ++i)
-		if (arg[i].type == isl_arg_arg)
-			n_arg++;
-
-	return n_arg;
-}
-
-static int next_arg(struct isl_arg *arg, int a)
-{
-	for (++a; arg[a].type != isl_arg_end; ++a)
-		if (arg[a].type == isl_arg_arg)
-			return a;
-
-	return -1;
-}
-
-int isl_args_parse(struct isl_args *args, int argc, char **argv, void *opt,
-	unsigned flags)
-{
-	int a = -1;
-	int skip = 0;
-	int i;
-	int n;
-
-	n = n_arg(args->args);
-
-	for (i = 1; i < argc; ++i) {
-		if (strcmp(argv[i], "--help") == 0)
-			print_help_and_exit(args->args, argv[0], opt);
-	}
-
-	for (i = 1; i < argc; ++i) {
-		if ((strcmp(argv[i], "--version") == 0 ||
-		     strcmp(argv[i], "-V") == 0) && any_version(args->args))
-			print_version_and_exit(args->args);
-	}
-
-	while (argc > 1 + skip) {
-		int parsed;
-		if (argv[1 + skip][0] != '-') {
-			a = next_arg(args->args, a);
-			if (a >= 0) {
-				char **p;
-				p = (char **)(((char *)opt)+args->args[a].offset);
-				free(*p);
-				*p = strdup(argv[1 + skip]);
-				argc = drop_argument(argc, argv, 1 + skip, 1);
-				--n;
-			} else if (ISL_FL_ISSET(flags, ISL_ARG_ALL)) {
-				fprintf(stderr, "%s: extra argument: %s\n",
-					    prog_name(argv[0]), argv[1 + skip]);
-				exit(-1);
-			} else
-				++skip;
-			continue;
-		}
-		parsed = parse_option(args->args, &argv[1 + skip], NULL, opt);
-		if (parsed)
-			argc = drop_argument(argc, argv, 1 + skip, parsed);
-		else if (ISL_FL_ISSET(flags, ISL_ARG_ALL)) {
-			fprintf(stderr, "%s: unrecognized option: %s\n",
-					prog_name(argv[0]), argv[1 + skip]);
-			exit(-1);
-		} else
-			++skip;
-	}
-
-	if (n > 0) {
-		fprintf(stderr, "%s: expecting %d more argument(s)\n",
-				prog_name(argv[0]), n);
-		exit(-1);
-	}
-
-	return argc;
-}
diff --git a/cloog-0.17.0/isl/isl_band.c b/cloog-0.17.0/isl/isl_band.c
deleted file mode 100644
index 53582f0..0000000
--- a/cloog-0.17.0/isl/isl_band.c
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Copyright 2011      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France
- */
-
-#include <isl_band_private.h>
-#include <isl_schedule_private.h>
-#include <isl_list_private.h>
-
-isl_ctx *isl_band_get_ctx(__isl_keep isl_band *band)
-{
-	return band ? isl_union_map_get_ctx(band->map) : NULL;
-}
-
-/* We not only increment the reference count of the band,
- * but also that of the schedule that contains this band.
- * This ensures that the schedule won't disappear while there
- * is still a reference to the band outside of the schedule.
- * There is no need to increment the reference count of the parent
- * band as the parent band is part of the same schedule.
- */
-__isl_give isl_band *isl_band_copy(__isl_keep isl_band *band)
-{
-	if (!band)
-		return NULL;
-
-	band->ref++;
-	band->schedule->ref++;
-	return band;
-}
-
-/* If this is not the last reference to the band (the one from within the
- * schedule), then we also need to decrement the reference count of the
- * containing schedule as it was incremented in isl_band_copy.
- */
-void *isl_band_free(__isl_take isl_band *band)
-{
-	if (!band)
-		return NULL;
-
-	if (--band->ref > 0)
-		return isl_schedule_free(band->schedule);
-
-	isl_union_map_free(band->map);
-	isl_band_list_free(band->children);
-	free(band->zero);
-	free(band);
-
-	return NULL;
-}
-
-int isl_band_has_children(__isl_keep isl_band *band)
-{
-	if (!band)
-		return -1;
-
-	return band->children != NULL;
-}
-
-__isl_give isl_band_list *isl_band_get_children(
-	__isl_keep isl_band *band)
-{
-	if (!band)
-		return NULL;
-	if (!band->children)
-		isl_die(isl_band_get_ctx(band), isl_error_invalid,
-			"band has no children", return NULL);
-	return isl_band_list_dup(band->children);
-}
-
-int isl_band_n_member(__isl_keep isl_band *band)
-{
-	return band ? band->n : 0;
-}
-
-/* Is the given scheduling dimension zero distance within the band and
- * with respect to the proximity dependences.
- */
-int isl_band_member_is_zero_distance(__isl_keep isl_band *band, int pos)
-{
-	if (!band)
-		return -1;
-
-	if (pos < 0 || pos >= band->n)
-		isl_die(isl_band_get_ctx(band), isl_error_invalid,
-			"invalid member position", return -1);
-
-	return band->zero[pos];
-}
-
-/* Return the schedule that leads up to this band.
- */
-__isl_give isl_union_map *isl_band_get_prefix_schedule(
-	__isl_keep isl_band *band)
-{
-	isl_union_map *prefix;
-	isl_band *a;
-
-	if (!band)
-		return NULL;
-
-	prefix = isl_union_map_copy(band->map);
-	prefix = isl_union_map_from_domain(isl_union_map_domain(prefix));
-
-	for (a = band->parent; a; a = a->parent) {
-		isl_union_map *partial = isl_union_map_copy(a->map);
-		prefix = isl_union_map_flat_range_product(partial, prefix);
-	}
-
-	return prefix;
-}
-
-/* Return the schedule of the band in isolation.
- */
-__isl_give isl_union_map *isl_band_get_partial_schedule(
-	__isl_keep isl_band *band)
-{
-	return band ? isl_union_map_copy(band->map) : NULL;
-}
-
-/* Return the schedule for the forest underneath the given band.
- */
-__isl_give isl_union_map *isl_band_get_suffix_schedule(
-	__isl_keep isl_band *band)
-{
-	isl_union_map *suffix;
-
-	if (!band)
-		return NULL;
-
-	if (!isl_band_has_children(band)) {
-		suffix = isl_union_map_copy(band->map);
-		suffix = isl_union_map_from_domain(isl_union_map_domain(suffix));
-	} else {
-		int i, n;
-		isl_band_list *children;
-
-		suffix = isl_union_map_empty(isl_union_map_get_space(band->map));
-		children = isl_band_get_children(band);
-		n = isl_band_list_n_band(children);
-		for (i = 0; i < n; ++i) {
-			isl_band *child;
-			isl_union_map *partial_i;
-			isl_union_map *suffix_i;
-
-			child = isl_band_list_get_band(children, i);
-			partial_i = isl_band_get_partial_schedule(child);
-			suffix_i = isl_band_get_suffix_schedule(child);
-			suffix_i = isl_union_map_flat_range_product(partial_i,
-								    suffix_i);
-			suffix = isl_union_map_union(suffix, suffix_i);
-
-			isl_band_free(child);
-		}
-		isl_band_list_free(children);
-	}
-
-	return suffix;
-}
-
-__isl_give isl_printer *isl_printer_print_band(__isl_take isl_printer *p,
-	__isl_keep isl_band *band)
-{
-	isl_union_map *prefix, *partial, *suffix;
-
-	prefix = isl_band_get_prefix_schedule(band);
-	partial = isl_band_get_partial_schedule(band);
-	suffix = isl_band_get_suffix_schedule(band);
-
-	p = isl_printer_print_str(p, "(");
-	p = isl_printer_print_union_map(p, prefix);
-	p = isl_printer_print_str(p, ",");
-	p = isl_printer_print_union_map(p, partial);
-	p = isl_printer_print_str(p, ",");
-	p = isl_printer_print_union_map(p, suffix);
-	p = isl_printer_print_str(p, ")");
-
-	isl_union_map_free(prefix);
-	isl_union_map_free(partial);
-	isl_union_map_free(suffix);
-
-	return p;
-}
diff --git a/cloog-0.17.0/isl/isl_band_private.h b/cloog-0.17.0/isl/isl_band_private.h
deleted file mode 100644
index 579ef66..0000000
--- a/cloog-0.17.0/isl/isl_band_private.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef ISL_BAND_PRIVATE_H
-#define ISL_BAND_PRIVATE_H
-
-#include <isl/band.h>
-#include <isl/list.h>
-#include <isl/schedule.h>
-#include <isl/union_map.h>
-
-/* Information about a band within a schedule.
- *
- * n is the number of scheduling dimensions within the band.
- * zero is an array of length n, indicating whether a scheduling dimension
- *	results in zero dependence distances for the proximity dependences.
- * map is the partial map corresponding to this band.
- * schedule is the schedule that contains this band.
- * parent is the parent of this band (or NULL if the band is a root).
- * children are the children of this band (or NULL if the band is a leaf).
- *
- * To avoid circular dependences in the reference counting,
- * the schedule and parent pointers are not reference counted.
- * isl_band_copy increments the reference count of schedule to ensure
- * that outside references to the band keep the schedule alive.
- */
-struct isl_band {
-	int ref;
-
-	int n;
-	int *zero;
-
-	isl_union_map *map;
-	isl_schedule *schedule;
-	isl_band *parent;
-	isl_band_list *children;
-};
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_basis_reduction.h b/cloog-0.17.0/isl/isl_basis_reduction.h
deleted file mode 100644
index fd63560..0000000
--- a/cloog-0.17.0/isl/isl_basis_reduction.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_BASIS_REDUCTION_H
-#define ISL_BASIS_REDUCTION_H
-
-#include <isl/set.h>
-#include <isl_mat_private.h>
-#include "isl_tab.h"
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_tab *isl_tab_compute_reduced_basis(struct isl_tab *tab);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_bernstein.c b/cloog-0.17.0/isl/isl_bernstein.c
deleted file mode 100644
index 0e528e5..0000000
--- a/cloog-0.17.0/isl/isl_bernstein.c
+++ /dev/null
@@ -1,554 +0,0 @@
-/*
- * Copyright 2006-2007 Universiteit Leiden
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, Leiden Institute of Advanced Computer Science,
- * Universiteit Leiden, Niels Bohrweg 1, 2333 CA Leiden, The Netherlands
- * and K.U.Leuven, Departement Computerwetenschappen, Celestijnenlaan 200A,
- * B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl/set.h>
-#include <isl/seq.h>
-#include <isl_morph.h>
-#include <isl_factorization.h>
-#include <isl_vertices_private.h>
-#include <isl_polynomial_private.h>
-#include <isl_options_private.h>
-#include <isl_bernstein.h>
-
-struct bernstein_data {
-	enum isl_fold type;
-	isl_qpolynomial *poly;
-	int check_tight;
-
-	isl_cell *cell;
-
-	isl_qpolynomial_fold *fold;
-	isl_qpolynomial_fold *fold_tight;
-	isl_pw_qpolynomial_fold *pwf;
-	isl_pw_qpolynomial_fold *pwf_tight;
-};
-
-static int vertex_is_integral(__isl_keep isl_basic_set *vertex)
-{
-	unsigned nvar;
-	unsigned nparam;
-	int i;
-
-	nvar = isl_basic_set_dim(vertex, isl_dim_set);
-	nparam = isl_basic_set_dim(vertex, isl_dim_param);
-	for (i = 0; i < nvar; ++i) {
-		int r = nvar - 1 - i;
-		if (!isl_int_is_one(vertex->eq[r][1 + nparam + i]) &&
-		    !isl_int_is_negone(vertex->eq[r][1 + nparam + i]))
-			return 0;
-	}
-
-	return 1;
-}
-
-static __isl_give isl_qpolynomial *vertex_coordinate(
-	__isl_keep isl_basic_set *vertex, int i, __isl_take isl_space *dim)
-{
-	unsigned nvar;
-	unsigned nparam;
-	int r;
-	isl_int denom;
-	isl_qpolynomial *v;
-
-	nvar = isl_basic_set_dim(vertex, isl_dim_set);
-	nparam = isl_basic_set_dim(vertex, isl_dim_param);
-	r = nvar - 1 - i;
-
-	isl_int_init(denom);
-	isl_int_set(denom, vertex->eq[r][1 + nparam + i]);
-	isl_assert(vertex->ctx, !isl_int_is_zero(denom), goto error);
-
-	if (isl_int_is_pos(denom))
-		isl_seq_neg(vertex->eq[r], vertex->eq[r],
-				1 + isl_basic_set_total_dim(vertex));
-	else
-		isl_int_neg(denom, denom);
-
-	v = isl_qpolynomial_from_affine(dim, vertex->eq[r], denom);
-	isl_int_clear(denom);
-
-	return v;
-error:
-	isl_space_free(dim);
-	isl_int_clear(denom);
-	return NULL;
-}
-
-/* Check whether the bound associated to the selection "k" is tight,
- * which is the case if we select exactly one vertex and if that vertex
- * is integral for all values of the parameters.
- */
-static int is_tight(int *k, int n, int d, isl_cell *cell)
-{
-	int i;
-
-	for (i = 0; i < n; ++i) {
-		int v;
-		if (k[i] != d) {
-			if (k[i])
-				return 0;
-			continue;
-		}
-		v = cell->ids[n - 1 - i];
-		return vertex_is_integral(cell->vertices->v[v].vertex);
-	}
-
-	return 0;
-}
-
-static void add_fold(__isl_take isl_qpolynomial *b, __isl_keep isl_set *dom,
-	int *k, int n, int d, struct bernstein_data *data)
-{
-	isl_qpolynomial_fold *fold;
-
-	fold = isl_qpolynomial_fold_alloc(data->type, b);
-
-	if (data->check_tight && is_tight(k, n, d, data->cell))
-		data->fold_tight = isl_qpolynomial_fold_fold_on_domain(dom,
-							data->fold_tight, fold);
-	else
-		data->fold = isl_qpolynomial_fold_fold_on_domain(dom,
-							data->fold, fold);
-}
-
-/* Extract the coefficients of the Bernstein base polynomials and store
- * them in data->fold and data->fold_tight.
- *
- * In particular, the coefficient of each monomial
- * of multi-degree (k[0], k[1], ..., k[n-1]) is divided by the corresponding
- * multinomial coefficient d!/k[0]! k[1]! ... k[n-1]!
- *
- * c[i] contains the coefficient of the selected powers of the first i+1 vars.
- * multinom[i] contains the partial multinomial coefficient.
- */
-static void extract_coefficients(isl_qpolynomial *poly,
-	__isl_keep isl_set *dom, struct bernstein_data *data)
-{
-	int i;
-	int d;
-	int n;
-	isl_ctx *ctx;
-	isl_qpolynomial **c = NULL;
-	int *k = NULL;
-	int *left = NULL;
-	isl_vec *multinom = NULL;
-
-	if (!poly)
-		return;
-
-	ctx = isl_qpolynomial_get_ctx(poly);
-	n = isl_qpolynomial_dim(poly, isl_dim_in);
-	d = isl_qpolynomial_degree(poly);
-	isl_assert(ctx, n >= 2, return);
-
-	c = isl_calloc_array(ctx, isl_qpolynomial *, n);
-	k = isl_alloc_array(ctx, int, n);
-	left = isl_alloc_array(ctx, int, n);
-	multinom = isl_vec_alloc(ctx, n);
-	if (!c || !k || !left || !multinom)
-		goto error;
-
-	isl_int_set_si(multinom->el[0], 1);
-	for (k[0] = d; k[0] >= 0; --k[0]) {
-		int i = 1;
-		isl_qpolynomial_free(c[0]);
-		c[0] = isl_qpolynomial_coeff(poly, isl_dim_in, n - 1, k[0]);
-		left[0] = d - k[0];
-		k[1] = -1;
-		isl_int_set(multinom->el[1], multinom->el[0]);
-		while (i > 0) {
-			if (i == n - 1) {
-				int j;
-				isl_space *dim;
-				isl_qpolynomial *b;
-				isl_qpolynomial *f;
-				for (j = 2; j <= left[i - 1]; ++j)
-					isl_int_divexact_ui(multinom->el[i],
-						multinom->el[i], j);
-				b = isl_qpolynomial_coeff(c[i - 1], isl_dim_in,
-					n - 1 - i, left[i - 1]);
-				b = isl_qpolynomial_project_domain_on_params(b);
-				dim = isl_qpolynomial_get_domain_space(b);
-				f = isl_qpolynomial_rat_cst_on_domain(dim, ctx->one,
-					multinom->el[i]);
-				b = isl_qpolynomial_mul(b, f);
-				k[n - 1] = left[n - 2];
-				add_fold(b, dom, k, n, d, data);
-				--i;
-				continue;
-			}
-			if (k[i] >= left[i - 1]) {
-				--i;
-				continue;
-			}
-			++k[i];
-			if (k[i])
-				isl_int_divexact_ui(multinom->el[i],
-					multinom->el[i], k[i]);
-			isl_qpolynomial_free(c[i]);
-			c[i] = isl_qpolynomial_coeff(c[i - 1], isl_dim_in,
-					n - 1 - i, k[i]);
-			left[i] = left[i - 1] - k[i];
-			k[i + 1] = -1;
-			isl_int_set(multinom->el[i + 1], multinom->el[i]);
-			++i;
-		}
-		isl_int_mul_ui(multinom->el[0], multinom->el[0], k[0]);
-	}
-
-	for (i = 0; i < n; ++i)
-		isl_qpolynomial_free(c[i]);
-
-	isl_vec_free(multinom);
-	free(left);
-	free(k);
-	free(c);
-	return;
-error:
-	isl_vec_free(multinom);
-	free(left);
-	free(k);
-	if (c)
-		for (i = 0; i < n; ++i)
-			isl_qpolynomial_free(c[i]);
-	free(c);
-	return;
-}
-
-/* Perform bernstein expansion on the parametric vertices that are active
- * on "cell".
- *
- * data->poly has been homogenized in the calling function.
- *
- * We plug in the barycentric coordinates for the set variables
- *
- *		\vec x = \sum_i \alpha_i v_i(\vec p)
- *
- * and the constant "1 = \sum_i \alpha_i" for the homogeneous dimension.
- * Next, we extract the coefficients of the Bernstein base polynomials.
- */
-static int bernstein_coefficients_cell(__isl_take isl_cell *cell, void *user)
-{
-	int i, j;
-	struct bernstein_data *data = (struct bernstein_data *)user;
-	isl_space *dim_param;
-	isl_space *dim_dst;
-	isl_qpolynomial *poly = data->poly;
-	unsigned nvar;
-	int n_vertices;
-	isl_qpolynomial **subs;
-	isl_pw_qpolynomial_fold *pwf;
-	isl_set *dom;
-	isl_ctx *ctx;
-
-	if (!poly)
-		goto error;
-
-	nvar = isl_qpolynomial_dim(poly, isl_dim_in) - 1;
-	n_vertices = cell->n_vertices;
-
-	ctx = isl_qpolynomial_get_ctx(poly);
-	if (n_vertices > nvar + 1 && ctx->opt->bernstein_triangulate)
-		return isl_cell_foreach_simplex(cell,
-					    &bernstein_coefficients_cell, user);
-
-	subs = isl_alloc_array(ctx, isl_qpolynomial *, 1 + nvar);
-	if (!subs)
-		goto error;
-
-	dim_param = isl_basic_set_get_space(cell->dom);
-	dim_dst = isl_qpolynomial_get_domain_space(poly);
-	dim_dst = isl_space_add_dims(dim_dst, isl_dim_set, n_vertices);
-
-	for (i = 0; i < 1 + nvar; ++i)
-		subs[i] = isl_qpolynomial_zero_on_domain(isl_space_copy(dim_dst));
-
-	for (i = 0; i < n_vertices; ++i) {
-		isl_qpolynomial *c;
-		c = isl_qpolynomial_var_on_domain(isl_space_copy(dim_dst), isl_dim_set,
-					1 + nvar + i);
-		for (j = 0; j < nvar; ++j) {
-			int k = cell->ids[i];
-			isl_qpolynomial *v;
-			v = vertex_coordinate(cell->vertices->v[k].vertex, j,
-						isl_space_copy(dim_param));
-			v = isl_qpolynomial_add_dims(v, isl_dim_in,
-							1 + nvar + n_vertices);
-			v = isl_qpolynomial_mul(v, isl_qpolynomial_copy(c));
-			subs[1 + j] = isl_qpolynomial_add(subs[1 + j], v);
-		}
-		subs[0] = isl_qpolynomial_add(subs[0], c);
-	}
-	isl_space_free(dim_dst);
-
-	poly = isl_qpolynomial_copy(poly);
-
-	poly = isl_qpolynomial_add_dims(poly, isl_dim_in, n_vertices);
-	poly = isl_qpolynomial_substitute(poly, isl_dim_in, 0, 1 + nvar, subs);
-	poly = isl_qpolynomial_drop_dims(poly, isl_dim_in, 0, 1 + nvar);
-
-	data->cell = cell;
-	dom = isl_set_from_basic_set(isl_basic_set_copy(cell->dom));
-	data->fold = isl_qpolynomial_fold_empty(data->type, isl_space_copy(dim_param));
-	data->fold_tight = isl_qpolynomial_fold_empty(data->type, dim_param);
-	extract_coefficients(poly, dom, data);
-
-	pwf = isl_pw_qpolynomial_fold_alloc(data->type, isl_set_copy(dom),
-					    data->fold);
-	data->pwf = isl_pw_qpolynomial_fold_fold(data->pwf, pwf);
-	pwf = isl_pw_qpolynomial_fold_alloc(data->type, dom, data->fold_tight);
-	data->pwf_tight = isl_pw_qpolynomial_fold_fold(data->pwf_tight, pwf);
-
-	isl_qpolynomial_free(poly);
-	isl_cell_free(cell);
-	for (i = 0; i < 1 + nvar; ++i)
-		isl_qpolynomial_free(subs[i]);
-	free(subs);
-	return 0;
-error:
-	isl_cell_free(cell);
-	return -1;
-}
-
-/* Base case of applying bernstein expansion.
- *
- * We compute the chamber decomposition of the parametric polytope "bset"
- * and then perform bernstein expansion on the parametric vertices
- * that are active on each chamber.
- */
-static __isl_give isl_pw_qpolynomial_fold *bernstein_coefficients_base(
-	__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, struct bernstein_data *data, int *tight)
-{
-	unsigned nvar;
-	isl_space *dim;
-	isl_pw_qpolynomial_fold *pwf;
-	isl_vertices *vertices;
-	int covers;
-
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-	if (nvar == 0) {
-		isl_set *dom;
-		isl_qpolynomial_fold *fold;
-
-		fold = isl_qpolynomial_fold_alloc(data->type, poly);
-		dom = isl_set_from_basic_set(bset);
-		if (tight)
-			*tight = 1;
-		pwf = isl_pw_qpolynomial_fold_alloc(data->type, dom, fold);
-		return isl_pw_qpolynomial_fold_project_domain_on_params(pwf);
-	}
-
-	if (isl_qpolynomial_is_zero(poly)) {
-		isl_set *dom;
-		isl_qpolynomial_fold *fold;
-		fold = isl_qpolynomial_fold_alloc(data->type, poly);
-		dom = isl_set_from_basic_set(bset);
-		pwf = isl_pw_qpolynomial_fold_alloc(data->type, dom, fold);
-		if (tight)
-			*tight = 1;
-		return isl_pw_qpolynomial_fold_project_domain_on_params(pwf);
-	}
-
-	dim = isl_basic_set_get_space(bset);
-	dim = isl_space_params(dim);
-	dim = isl_space_from_domain(dim);
-	dim = isl_space_add_dims(dim, isl_dim_set, 1);
-	data->pwf = isl_pw_qpolynomial_fold_zero(isl_space_copy(dim), data->type);
-	data->pwf_tight = isl_pw_qpolynomial_fold_zero(dim, data->type);
-	data->poly = isl_qpolynomial_homogenize(isl_qpolynomial_copy(poly));
-	vertices = isl_basic_set_compute_vertices(bset);
-	isl_vertices_foreach_disjoint_cell(vertices,
-		&bernstein_coefficients_cell, data);
-	isl_vertices_free(vertices);
-	isl_qpolynomial_free(data->poly);
-
-	isl_basic_set_free(bset);
-	isl_qpolynomial_free(poly);
-
-	covers = isl_pw_qpolynomial_fold_covers(data->pwf_tight, data->pwf);
-	if (covers < 0)
-		goto error;
-
-	if (tight)
-		*tight = covers;
-
-	if (covers) {
-		isl_pw_qpolynomial_fold_free(data->pwf);
-		return data->pwf_tight;
-	}
-
-	data->pwf = isl_pw_qpolynomial_fold_fold(data->pwf, data->pwf_tight);
-
-	return data->pwf;
-error:
-	isl_pw_qpolynomial_fold_free(data->pwf_tight);
-	isl_pw_qpolynomial_fold_free(data->pwf);
-	return NULL;
-}
-
-/* Apply bernstein expansion recursively by working in on len[i]
- * set variables at a time, with i ranging from n_group - 1 to 0.
- */
-static __isl_give isl_pw_qpolynomial_fold *bernstein_coefficients_recursive(
-	__isl_take isl_pw_qpolynomial *pwqp,
-	int n_group, int *len, struct bernstein_data *data, int *tight)
-{
-	int i;
-	unsigned nparam;
-	unsigned nvar;
-	isl_pw_qpolynomial_fold *pwf;
-
-	if (!pwqp)
-		return NULL;
-
-	nparam = isl_pw_qpolynomial_dim(pwqp, isl_dim_param);
-	nvar = isl_pw_qpolynomial_dim(pwqp, isl_dim_in);
-
-	pwqp = isl_pw_qpolynomial_move_dims(pwqp, isl_dim_param, nparam,
-					isl_dim_in, 0, nvar - len[n_group - 1]);
-	pwf = isl_pw_qpolynomial_bound(pwqp, data->type, tight);
-
-	for (i = n_group - 2; i >= 0; --i) {
-		nparam = isl_pw_qpolynomial_fold_dim(pwf, isl_dim_param);
-		pwf = isl_pw_qpolynomial_fold_move_dims(pwf, isl_dim_in, 0,
-				isl_dim_param, nparam - len[i], len[i]);
-		if (tight && !*tight)
-			tight = NULL;
-		pwf = isl_pw_qpolynomial_fold_bound(pwf, tight);
-	}
-
-	return pwf;
-}
-
-static __isl_give isl_pw_qpolynomial_fold *bernstein_coefficients_factors(
-	__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, struct bernstein_data *data, int *tight)
-{
-	isl_factorizer *f;
-	isl_set *set;
-	isl_pw_qpolynomial *pwqp;
-	isl_pw_qpolynomial_fold *pwf;
-
-	f = isl_basic_set_factorizer(bset);
-	if (!f)
-		goto error;
-	if (f->n_group == 0) {
-		isl_factorizer_free(f);
-		return  bernstein_coefficients_base(bset, poly, data, tight);
-	}
-
-	set = isl_set_from_basic_set(bset);
-	pwqp = isl_pw_qpolynomial_alloc(set, poly);
-	pwqp = isl_pw_qpolynomial_morph_domain(pwqp, isl_morph_copy(f->morph));
-
-	pwf = bernstein_coefficients_recursive(pwqp, f->n_group, f->len, data,
-						tight);
-
-	isl_factorizer_free(f);
-
-	return pwf;
-error:
-	isl_basic_set_free(bset);
-	isl_qpolynomial_free(poly);
-	return NULL;
-}
-
-static __isl_give isl_pw_qpolynomial_fold *bernstein_coefficients_full_recursive(
-	__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, struct bernstein_data *data, int *tight)
-{
-	int i;
-	int *len;
-	unsigned nvar;
-	isl_pw_qpolynomial_fold *pwf;
-	isl_set *set;
-	isl_pw_qpolynomial *pwqp;
-
-	if (!bset || !poly)
-		goto error;
-
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-	
-	len = isl_alloc_array(bset->ctx, int, nvar);
-	if (!len)
-		goto error;
-
-	for (i = 0; i < nvar; ++i)
-		len[i] = 1;
-
-	set = isl_set_from_basic_set(bset);
-	pwqp = isl_pw_qpolynomial_alloc(set, poly);
-
-	pwf = bernstein_coefficients_recursive(pwqp, nvar, len, data, tight);
-
-	free(len);
-
-	return pwf;
-error:
-	isl_basic_set_free(bset);
-	isl_qpolynomial_free(poly);
-	return NULL;
-}
-
-/* Compute a bound on the polynomial defined over the parametric polytope
- * using bernstein expansion and store the result
- * in bound->pwf and bound->pwf_tight.
- *
- * If bernstein_recurse is set to ISL_BERNSTEIN_FACTORS, we check if
- * the polytope can be factorized and apply bernstein expansion recursively
- * on the factors.
- * If bernstein_recurse is set to ISL_BERNSTEIN_INTERVALS, we apply
- * bernstein expansion recursively on each dimension.
- * Otherwise, we apply bernstein expansion on the entire polytope.
- */
-int isl_qpolynomial_bound_on_domain_bernstein(__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, struct isl_bound *bound)
-{
-	struct bernstein_data data;
-	isl_pw_qpolynomial_fold *pwf;
-	unsigned nvar;
-	int tight = 0;
-	int *tp = bound->check_tight ? &tight : NULL;
-
-	if (!bset || !poly)
-		goto error;
-
-	data.type = bound->type;
-	data.check_tight = bound->check_tight;
-
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-
-	if (bset->ctx->opt->bernstein_recurse & ISL_BERNSTEIN_FACTORS)
-		pwf = bernstein_coefficients_factors(bset, poly, &data, tp);
-	else if (nvar > 1 &&
-	    (bset->ctx->opt->bernstein_recurse & ISL_BERNSTEIN_INTERVALS))
-		pwf = bernstein_coefficients_full_recursive(bset, poly, &data, tp);
-	else
-		pwf = bernstein_coefficients_base(bset, poly, &data, tp);
-
-	if (tight)
-		bound->pwf_tight = isl_pw_qpolynomial_fold_fold(bound->pwf_tight, pwf);
-	else
-		bound->pwf = isl_pw_qpolynomial_fold_fold(bound->pwf, pwf);
-
-	return 0;
-error:
-	isl_basic_set_free(bset);
-	isl_qpolynomial_free(poly);
-	return -1;
-}
diff --git a/cloog-0.17.0/isl/isl_bernstein.h b/cloog-0.17.0/isl/isl_bernstein.h
deleted file mode 100644
index 7694b04..0000000
--- a/cloog-0.17.0/isl/isl_bernstein.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#include <isl_bound.h>
-
-int isl_qpolynomial_bound_on_domain_bernstein(__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, struct isl_bound *bound);
diff --git a/cloog-0.17.0/isl/isl_blk.c b/cloog-0.17.0/isl/isl_blk.c
deleted file mode 100644
index 0c1dae7..0000000
--- a/cloog-0.17.0/isl/isl_blk.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl/blk.h>
-#include <isl_ctx_private.h>
-
-/* The maximal number of cache misses before first element is evicted */
-#define ISL_BLK_MAX_MISS	100
-
-struct isl_blk isl_blk_empty()
-{
-	struct isl_blk block;
-	block.size = 0;
-	block.data = NULL;
-	return block;
-}
-
-static int isl_blk_is_empty(struct isl_blk block)
-{
-	return block.size == 0 && block.data == NULL;
-}
-
-static struct isl_blk isl_blk_error()
-{
-	struct isl_blk block;
-	block.size = -1;
-	block.data = NULL;
-	return block;
-}
-
-int isl_blk_is_error(struct isl_blk block)
-{
-	return block.size == -1 && block.data == NULL;
-}
-
-static struct isl_blk extend(struct isl_ctx *ctx, struct isl_blk block,
-				size_t new_n)
-{
-	int i;
-	isl_int *p;
-
-	if (block.size >= new_n)
-		return block;
-
-	p = block.data;
-	block.data = isl_realloc_array(ctx, block.data, isl_int, new_n);
-	if (!block.data) {
-		free(p);
-		return isl_blk_error();
-	}
-
-	for (i = block.size; i < new_n; ++i)
-		isl_int_init(block.data[i]);
-	block.size = new_n;
-
-	return block;
-}
-
-static void isl_blk_free_force(struct isl_ctx *ctx, struct isl_blk block)
-{
-	int i;
-
-	for (i = 0; i < block.size; ++i)
-		isl_int_clear(block.data[i]);
-	free(block.data);
-}
-
-struct isl_blk isl_blk_alloc(struct isl_ctx *ctx, size_t n)
-{
-	int i;
-	struct isl_blk block;
-
-	block = isl_blk_empty();
-	if (n && ctx->n_cached) {
-		int best = 0;
-		for (i = 1; ctx->cache[best].size != n && i < ctx->n_cached; ++i) {
-			if (ctx->cache[best].size < n) {
-				if (ctx->cache[i].size > ctx->cache[best].size)
-					best = i;
-			} else if (ctx->cache[i].size >= n &&
-				   ctx->cache[i].size < ctx->cache[best].size)
-					best = i;
-		}
-		if (ctx->cache[best].size < 2 * n + 100) {
-			block = ctx->cache[best];
-			if (--ctx->n_cached != best)
-				ctx->cache[best] = ctx->cache[ctx->n_cached];
-			if (best == 0)
-				ctx->n_miss = 0;
-		} else if (ctx->n_miss++ >= ISL_BLK_MAX_MISS) {
-			isl_blk_free_force(ctx, ctx->cache[0]);
-			if (--ctx->n_cached != 0)
-				ctx->cache[0] = ctx->cache[ctx->n_cached];
-			ctx->n_miss = 0;
-		}
-	}
-
-	return extend(ctx, block, n);
-}
-
-struct isl_blk isl_blk_extend(struct isl_ctx *ctx, struct isl_blk block,
-				size_t new_n)
-{
-	if (isl_blk_is_empty(block))
-		return isl_blk_alloc(ctx, new_n);
-
-	return extend(ctx, block, new_n);
-}
-
-void isl_blk_free(struct isl_ctx *ctx, struct isl_blk block)
-{
-	if (isl_blk_is_empty(block) || isl_blk_is_error(block))
-		return;
-
-	if (ctx->n_cached < ISL_BLK_CACHE_SIZE)
-		ctx->cache[ctx->n_cached++] = block;
-	else
-		isl_blk_free_force(ctx, block);
-}
-
-void isl_blk_clear_cache(struct isl_ctx *ctx)
-{
-	int i;
-
-	for (i = 0; i < ctx->n_cached; ++i)
-		isl_blk_free_force(ctx, ctx->cache[i]);
-	ctx->n_cached = 0;
-}
diff --git a/cloog-0.17.0/isl/isl_bound.c b/cloog-0.17.0/isl/isl_bound.c
deleted file mode 100644
index d9c10bc..0000000
--- a/cloog-0.17.0/isl/isl_bound.c
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France 
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl_bound.h>
-#include <isl_bernstein.h>
-#include <isl_range.h>
-#include <isl_polynomial_private.h>
-#include <isl_options_private.h>
-
-/* Compute a bound on the polynomial defined over the parametric polytope
- * using either range propagation or bernstein expansion and
- * store the result in bound->pwf and bound->pwf_tight.
- * Since bernstein expansion requires bounded domains, we apply
- * range propagation on unbounded domains.  Otherwise, we respect the choice
- * of the user.
- */
-static int compressed_guarded_poly_bound(__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, void *user)
-{
-	struct isl_bound *bound = (struct isl_bound *)user;
-	int bounded;
-
-	if (!bset || !poly)
-		goto error;
-
-	if (bset->ctx->opt->bound == ISL_BOUND_RANGE)
-		return isl_qpolynomial_bound_on_domain_range(bset, poly, bound);
-
-	bounded = isl_basic_set_is_bounded(bset);
-	if (bounded < 0)
-		goto error;
-	if (bounded)
-		return isl_qpolynomial_bound_on_domain_bernstein(bset, poly, bound);
-	else
-		return isl_qpolynomial_bound_on_domain_range(bset, poly, bound);
-error:
-	isl_basic_set_free(bset);
-	isl_qpolynomial_free(poly);
-	return -1;
-}
-
-static int unwrapped_guarded_poly_bound(__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, void *user)
-{
-	struct isl_bound *bound = (struct isl_bound *)user;
-	isl_pw_qpolynomial_fold *top_pwf;
-	isl_pw_qpolynomial_fold *top_pwf_tight;
-	isl_space *dim;
-	isl_morph *morph;
-	int r;
-
-	bset = isl_basic_set_detect_equalities(bset);
-
-	if (!bset)
-		goto error;
-
-	if (bset->n_eq == 0)
-		return compressed_guarded_poly_bound(bset, poly, user);
-
-	morph = isl_basic_set_full_compression(bset);
-
-	bset = isl_morph_basic_set(isl_morph_copy(morph), bset);
-	poly = isl_qpolynomial_morph_domain(poly, isl_morph_copy(morph));
-
-	dim = isl_morph_get_ran_space(morph);
-	dim = isl_space_params(dim);
-
-	top_pwf = bound->pwf;
-	top_pwf_tight = bound->pwf_tight;
-
-	dim = isl_space_from_domain(dim);
-	dim = isl_space_add_dims(dim, isl_dim_out, 1);
-	bound->pwf = isl_pw_qpolynomial_fold_zero(isl_space_copy(dim),
-						  bound->type);
-	bound->pwf_tight = isl_pw_qpolynomial_fold_zero(dim, bound->type);
-
-	r = compressed_guarded_poly_bound(bset, poly, user);
-
-	morph = isl_morph_dom_params(morph);
-	morph = isl_morph_ran_params(morph);
-	morph = isl_morph_inverse(morph);
-
-	bound->pwf = isl_pw_qpolynomial_fold_morph_domain(bound->pwf,
-							isl_morph_copy(morph));
-	bound->pwf_tight = isl_pw_qpolynomial_fold_morph_domain(
-						bound->pwf_tight, morph);
-
-	bound->pwf = isl_pw_qpolynomial_fold_fold(top_pwf, bound->pwf);
-	bound->pwf_tight = isl_pw_qpolynomial_fold_fold(top_pwf_tight,
-							bound->pwf_tight);
-
-	return r;
-error:
-	isl_basic_set_free(bset);
-	isl_qpolynomial_free(poly);
-	return -1;
-}
-
-static int guarded_poly_bound(__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, void *user)
-{
-	struct isl_bound *bound = (struct isl_bound *)user;
-	isl_space *dim;
-	isl_pw_qpolynomial_fold *top_pwf;
-	isl_pw_qpolynomial_fold *top_pwf_tight;
-	int nparam;
-	int n_in;
-	int r;
-
-	if (!bound->wrapping)
-		return unwrapped_guarded_poly_bound(bset, poly, user);
-
-	nparam = isl_space_dim(bound->dim, isl_dim_param);
-	n_in = isl_space_dim(bound->dim, isl_dim_in);
-
-	bset = isl_basic_set_move_dims(bset, isl_dim_param, nparam,
-					isl_dim_set, 0, n_in);
-	poly = isl_qpolynomial_move_dims(poly, isl_dim_param, nparam,
-					isl_dim_in, 0, n_in);
-
-	dim = isl_basic_set_get_space(bset);
-	dim = isl_space_params(dim);
-
-	top_pwf = bound->pwf;
-	top_pwf_tight = bound->pwf_tight;
-
-	dim = isl_space_from_domain(dim);
-	dim = isl_space_add_dims(dim, isl_dim_out, 1);
-	bound->pwf = isl_pw_qpolynomial_fold_zero(isl_space_copy(dim),
-						  bound->type);
-	bound->pwf_tight = isl_pw_qpolynomial_fold_zero(dim, bound->type);
-
-	r = unwrapped_guarded_poly_bound(bset, poly, user);
-
-	bound->pwf = isl_pw_qpolynomial_fold_reset_space(bound->pwf,
-						    isl_space_copy(bound->dim));
-	bound->pwf_tight = isl_pw_qpolynomial_fold_reset_space(bound->pwf_tight,
-						    isl_space_copy(bound->dim));
-
-	bound->pwf = isl_pw_qpolynomial_fold_fold(top_pwf, bound->pwf);
-	bound->pwf_tight = isl_pw_qpolynomial_fold_fold(top_pwf_tight,
-							bound->pwf_tight);
-
-	return r;
-}
-
-static int guarded_qp(__isl_take isl_qpolynomial *qp, void *user)
-{
-	struct isl_bound *bound = (struct isl_bound *)user;
-	int r;
-
-	r = isl_qpolynomial_as_polynomial_on_domain(qp, bound->bset,
-						    &guarded_poly_bound, user);
-	isl_qpolynomial_free(qp);
-	return r;
-}
-
-static int basic_guarded_fold(__isl_take isl_basic_set *bset, void *user)
-{
-	struct isl_bound *bound = (struct isl_bound *)user;
-	int r;
-
-	bound->bset = bset;
-	r = isl_qpolynomial_fold_foreach_qpolynomial(bound->fold,
-							&guarded_qp, user);
-	isl_basic_set_free(bset);
-	return r;
-}
-
-static int guarded_fold(__isl_take isl_set *set,
-	__isl_take isl_qpolynomial_fold *fold, void *user)
-{
-	struct isl_bound *bound = (struct isl_bound *)user;
-
-	if (!set || !fold)
-		goto error;
-
-	set = isl_set_make_disjoint(set);
-
-	bound->fold = fold;
-	bound->type = isl_qpolynomial_fold_get_type(fold);
-
-	if (isl_set_foreach_basic_set(set, &basic_guarded_fold, bound) < 0)
-		goto error;
-
-	isl_set_free(set);
-	isl_qpolynomial_fold_free(fold);
-
-	return 0;
-error:
-	isl_set_free(set);
-	isl_qpolynomial_fold_free(fold);
-	return -1;
-}
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_bound(
-	__isl_take isl_pw_qpolynomial_fold *pwf, int *tight)
-{
-	unsigned nvar;
-	struct isl_bound bound;
-	int covers;
-
-	if (!pwf)
-		return NULL;
-
-	bound.dim = isl_pw_qpolynomial_fold_get_domain_space(pwf);
-
-	bound.wrapping = isl_space_is_wrapping(bound.dim);
-	if (bound.wrapping)
-		bound.dim = isl_space_unwrap(bound.dim);
-	nvar = isl_space_dim(bound.dim, isl_dim_out);
-	bound.dim = isl_space_domain(bound.dim);
-	bound.dim = isl_space_from_domain(bound.dim);
-	bound.dim = isl_space_add_dims(bound.dim, isl_dim_out, 1);
-
-	if (nvar == 0) {
-		if (tight)
-			*tight = 1;
-		return isl_pw_qpolynomial_fold_reset_space(pwf, bound.dim);
-	}
-
-	if (isl_pw_qpolynomial_fold_is_zero(pwf)) {
-		enum isl_fold type = pwf->type;
-		isl_pw_qpolynomial_fold_free(pwf);
-		if (tight)
-			*tight = 1;
-		return isl_pw_qpolynomial_fold_zero(bound.dim, type);
-	}
-
-	bound.pwf = isl_pw_qpolynomial_fold_zero(isl_space_copy(bound.dim),
-							pwf->type);
-	bound.pwf_tight = isl_pw_qpolynomial_fold_zero(isl_space_copy(bound.dim),
-							pwf->type);
-	bound.check_tight = !!tight;
-
-	if (isl_pw_qpolynomial_fold_foreach_lifted_piece(pwf,
-							guarded_fold, &bound) < 0)
-		goto error;
-
-	covers = isl_pw_qpolynomial_fold_covers(bound.pwf_tight, bound.pwf);
-	if (covers < 0)
-		goto error;
-
-	if (tight)
-		*tight = covers;
-
-	isl_space_free(bound.dim);
-	isl_pw_qpolynomial_fold_free(pwf);
-
-	if (covers) {
-		isl_pw_qpolynomial_fold_free(bound.pwf);
-		return bound.pwf_tight;
-	}
-
-	bound.pwf = isl_pw_qpolynomial_fold_fold(bound.pwf, bound.pwf_tight);
-
-	return bound.pwf;
-error:
-	isl_pw_qpolynomial_fold_free(bound.pwf_tight);
-	isl_pw_qpolynomial_fold_free(bound.pwf);
-	isl_pw_qpolynomial_fold_free(pwf);
-	isl_space_free(bound.dim);
-	return NULL;
-}
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_bound(
-	__isl_take isl_pw_qpolynomial *pwqp, enum isl_fold type, int *tight)
-{
-	isl_pw_qpolynomial_fold *pwf;
-
-	pwf = isl_pw_qpolynomial_fold_from_pw_qpolynomial(type, pwqp);
-	return isl_pw_qpolynomial_fold_bound(pwf, tight);
-}
-
-struct isl_union_bound_data {
-	enum isl_fold type;
-	int tight;
-	isl_union_pw_qpolynomial_fold *res;
-};
-
-static int bound_pw(__isl_take isl_pw_qpolynomial *pwqp, void *user)
-{
-	struct isl_union_bound_data *data = user;
-	isl_pw_qpolynomial_fold *pwf;
-
-	pwf = isl_pw_qpolynomial_bound(pwqp, data->type,
-					data->tight ? &data->tight : NULL);
-	data->res = isl_union_pw_qpolynomial_fold_fold_pw_qpolynomial_fold(
-								data->res, pwf);
-
-	return 0;
-}
-
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_bound(
-	__isl_take isl_union_pw_qpolynomial *upwqp,
-	enum isl_fold type, int *tight)
-{
-	isl_space *dim;
-	struct isl_union_bound_data data = { type, 1, NULL };
-
-	if (!upwqp)
-		return NULL;
-
-	if (!tight)
-		data.tight = 0;
-
-	dim = isl_union_pw_qpolynomial_get_space(upwqp);
-	data.res = isl_union_pw_qpolynomial_fold_zero(dim, type);
-	if (isl_union_pw_qpolynomial_foreach_pw_qpolynomial(upwqp,
-						    &bound_pw, &data) < 0)
-		goto error;
-
-	isl_union_pw_qpolynomial_free(upwqp);
-	if (tight)
-		*tight = data.tight;
-
-	return data.res;
-error:
-	isl_union_pw_qpolynomial_free(upwqp);
-	isl_union_pw_qpolynomial_fold_free(data.res);
-	return NULL;
-}
diff --git a/cloog-0.17.0/isl/isl_bound.h b/cloog-0.17.0/isl/isl_bound.h
deleted file mode 100644
index 1a9d390..0000000
--- a/cloog-0.17.0/isl/isl_bound.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef ISL_BOUND_H
-#define ISL_BOUND_H
-
-#include <isl/polynomial.h>
-
-struct isl_bound {
-	/* input */
-	int check_tight;
-	int wrapping;
-	enum isl_fold type;
-	isl_space *dim;
-	isl_basic_set *bset;
-	isl_qpolynomial_fold *fold;
-
-	/* output */
-	isl_pw_qpolynomial_fold *pwf;
-	isl_pw_qpolynomial_fold *pwf_tight;
-};
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_coalesce.c b/cloog-0.17.0/isl/isl_coalesce.c
deleted file mode 100644
index b99c7b5..0000000
--- a/cloog-0.17.0/isl/isl_coalesce.c
+++ /dev/null
@@ -1,1294 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France 
- */
-
-#include "isl_map_private.h"
-#include <isl/seq.h>
-#include "isl_tab.h"
-#include <isl_mat_private.h>
-
-#define STATUS_ERROR		-1
-#define STATUS_REDUNDANT	 1
-#define STATUS_VALID	 	 2
-#define STATUS_SEPARATE	 	 3
-#define STATUS_CUT	 	 4
-#define STATUS_ADJ_EQ	 	 5
-#define STATUS_ADJ_INEQ	 	 6
-
-static int status_in(isl_int *ineq, struct isl_tab *tab)
-{
-	enum isl_ineq_type type = isl_tab_ineq_type(tab, ineq);
-	switch (type) {
-	default:
-	case isl_ineq_error:		return STATUS_ERROR;
-	case isl_ineq_redundant:	return STATUS_VALID;
-	case isl_ineq_separate:		return STATUS_SEPARATE;
-	case isl_ineq_cut:		return STATUS_CUT;
-	case isl_ineq_adj_eq:		return STATUS_ADJ_EQ;
-	case isl_ineq_adj_ineq:		return STATUS_ADJ_INEQ;
-	}
-}
-
-/* Compute the position of the equalities of basic map "i"
- * with respect to basic map "j".
- * The resulting array has twice as many entries as the number
- * of equalities corresponding to the two inequalties to which
- * each equality corresponds.
- */
-static int *eq_status_in(struct isl_map *map, int i, int j,
-	struct isl_tab **tabs)
-{
-	int k, l;
-	int *eq = isl_calloc_array(map->ctx, int, 2 * map->p[i]->n_eq);
-	unsigned dim;
-
-	dim = isl_basic_map_total_dim(map->p[i]);
-	for (k = 0; k < map->p[i]->n_eq; ++k) {
-		for (l = 0; l < 2; ++l) {
-			isl_seq_neg(map->p[i]->eq[k], map->p[i]->eq[k], 1+dim);
-			eq[2 * k + l] = status_in(map->p[i]->eq[k], tabs[j]);
-			if (eq[2 * k + l] == STATUS_ERROR)
-				goto error;
-		}
-		if (eq[2 * k] == STATUS_SEPARATE ||
-		    eq[2 * k + 1] == STATUS_SEPARATE)
-			break;
-	}
-
-	return eq;
-error:
-	free(eq);
-	return NULL;
-}
-
-/* Compute the position of the inequalities of basic map "i"
- * with respect to basic map "j".
- */
-static int *ineq_status_in(struct isl_map *map, int i, int j,
-	struct isl_tab **tabs)
-{
-	int k;
-	unsigned n_eq = map->p[i]->n_eq;
-	int *ineq = isl_calloc_array(map->ctx, int, map->p[i]->n_ineq);
-
-	for (k = 0; k < map->p[i]->n_ineq; ++k) {
-		if (isl_tab_is_redundant(tabs[i], n_eq + k)) {
-			ineq[k] = STATUS_REDUNDANT;
-			continue;
-		}
-		ineq[k] = status_in(map->p[i]->ineq[k], tabs[j]);
-		if (ineq[k] == STATUS_ERROR)
-			goto error;
-		if (ineq[k] == STATUS_SEPARATE)
-			break;
-	}
-
-	return ineq;
-error:
-	free(ineq);
-	return NULL;
-}
-
-static int any(int *con, unsigned len, int status)
-{
-	int i;
-
-	for (i = 0; i < len ; ++i)
-		if (con[i] == status)
-			return 1;
-	return 0;
-}
-
-static int count(int *con, unsigned len, int status)
-{
-	int i;
-	int c = 0;
-
-	for (i = 0; i < len ; ++i)
-		if (con[i] == status)
-			c++;
-	return c;
-}
-
-static int all(int *con, unsigned len, int status)
-{
-	int i;
-
-	for (i = 0; i < len ; ++i) {
-		if (con[i] == STATUS_REDUNDANT)
-			continue;
-		if (con[i] != status)
-			return 0;
-	}
-	return 1;
-}
-
-static void drop(struct isl_map *map, int i, struct isl_tab **tabs)
-{
-	isl_basic_map_free(map->p[i]);
-	isl_tab_free(tabs[i]);
-
-	if (i != map->n - 1) {
-		map->p[i] = map->p[map->n - 1];
-		tabs[i] = tabs[map->n - 1];
-	}
-	tabs[map->n - 1] = NULL;
-	map->n--;
-}
-
-/* Replace the pair of basic maps i and j by the basic map bounded
- * by the valid constraints in both basic maps and the constraint
- * in extra (if not NULL).
- */
-static int fuse(struct isl_map *map, int i, int j,
-	struct isl_tab **tabs, int *eq_i, int *ineq_i, int *eq_j, int *ineq_j,
-	__isl_keep isl_mat *extra)
-{
-	int k, l;
-	struct isl_basic_map *fused = NULL;
-	struct isl_tab *fused_tab = NULL;
-	unsigned total = isl_basic_map_total_dim(map->p[i]);
-	unsigned extra_rows = extra ? extra->n_row : 0;
-
-	fused = isl_basic_map_alloc_space(isl_space_copy(map->p[i]->dim),
-			map->p[i]->n_div,
-			map->p[i]->n_eq + map->p[j]->n_eq,
-			map->p[i]->n_ineq + map->p[j]->n_ineq + extra_rows);
-	if (!fused)
-		goto error;
-
-	for (k = 0; k < map->p[i]->n_eq; ++k) {
-		if (eq_i && (eq_i[2 * k] != STATUS_VALID ||
-			     eq_i[2 * k + 1] != STATUS_VALID))
-			continue;
-		l = isl_basic_map_alloc_equality(fused);
-		if (l < 0)
-			goto error;
-		isl_seq_cpy(fused->eq[l], map->p[i]->eq[k], 1 + total);
-	}
-
-	for (k = 0; k < map->p[j]->n_eq; ++k) {
-		if (eq_j && (eq_j[2 * k] != STATUS_VALID ||
-			     eq_j[2 * k + 1] != STATUS_VALID))
-			continue;
-		l = isl_basic_map_alloc_equality(fused);
-		if (l < 0)
-			goto error;
-		isl_seq_cpy(fused->eq[l], map->p[j]->eq[k], 1 + total);
-	}
-
-	for (k = 0; k < map->p[i]->n_ineq; ++k) {
-		if (ineq_i[k] != STATUS_VALID)
-			continue;
-		l = isl_basic_map_alloc_inequality(fused);
-		if (l < 0)
-			goto error;
-		isl_seq_cpy(fused->ineq[l], map->p[i]->ineq[k], 1 + total);
-	}
-
-	for (k = 0; k < map->p[j]->n_ineq; ++k) {
-		if (ineq_j[k] != STATUS_VALID)
-			continue;
-		l = isl_basic_map_alloc_inequality(fused);
-		if (l < 0)
-			goto error;
-		isl_seq_cpy(fused->ineq[l], map->p[j]->ineq[k], 1 + total);
-	}
-
-	for (k = 0; k < map->p[i]->n_div; ++k) {
-		int l = isl_basic_map_alloc_div(fused);
-		if (l < 0)
-			goto error;
-		isl_seq_cpy(fused->div[l], map->p[i]->div[k], 1 + 1 + total);
-	}
-
-	for (k = 0; k < extra_rows; ++k) {
-		l = isl_basic_map_alloc_inequality(fused);
-		if (l < 0)
-			goto error;
-		isl_seq_cpy(fused->ineq[l], extra->row[k], 1 + total);
-	}
-
-	fused = isl_basic_map_gauss(fused, NULL);
-	ISL_F_SET(fused, ISL_BASIC_MAP_FINAL);
-	if (ISL_F_ISSET(map->p[i], ISL_BASIC_MAP_RATIONAL) &&
-	    ISL_F_ISSET(map->p[j], ISL_BASIC_MAP_RATIONAL))
-		ISL_F_SET(fused, ISL_BASIC_MAP_RATIONAL);
-
-	fused_tab = isl_tab_from_basic_map(fused);
-	if (isl_tab_detect_redundant(fused_tab) < 0)
-		goto error;
-
-	isl_basic_map_free(map->p[i]);
-	map->p[i] = fused;
-	isl_tab_free(tabs[i]);
-	tabs[i] = fused_tab;
-	drop(map, j, tabs);
-
-	return 1;
-error:
-	isl_tab_free(fused_tab);
-	isl_basic_map_free(fused);
-	return -1;
-}
-
-/* Given a pair of basic maps i and j such that all constraints are either
- * "valid" or "cut", check if the facets corresponding to the "cut"
- * constraints of i lie entirely within basic map j.
- * If so, replace the pair by the basic map consisting of the valid
- * constraints in both basic maps.
- *
- * To see that we are not introducing any extra points, call the
- * two basic maps A and B and the resulting map U and let x
- * be an element of U \setminus ( A \cup B ).
- * Then there is a pair of cut constraints c_1 and c_2 in A and B such that x
- * violates them.  Let X be the intersection of U with the opposites
- * of these constraints.  Then x \in X.
- * The facet corresponding to c_1 contains the corresponding facet of A.
- * This facet is entirely contained in B, so c_2 is valid on the facet.
- * However, since it is also (part of) a facet of X, -c_2 is also valid
- * on the facet.  This means c_2 is saturated on the facet, so c_1 and
- * c_2 must be opposites of each other, but then x could not violate
- * both of them.
- */
-static int check_facets(struct isl_map *map, int i, int j,
-	struct isl_tab **tabs, int *ineq_i, int *ineq_j)
-{
-	int k, l;
-	struct isl_tab_undo *snap;
-	unsigned n_eq = map->p[i]->n_eq;
-
-	snap = isl_tab_snap(tabs[i]);
-
-	for (k = 0; k < map->p[i]->n_ineq; ++k) {
-		if (ineq_i[k] != STATUS_CUT)
-			continue;
-		if (isl_tab_select_facet(tabs[i], n_eq + k) < 0)
-			return -1;
-		for (l = 0; l < map->p[j]->n_ineq; ++l) {
-			int stat;
-			if (ineq_j[l] != STATUS_CUT)
-				continue;
-			stat = status_in(map->p[j]->ineq[l], tabs[i]);
-			if (stat != STATUS_VALID)
-				break;
-		}
-		if (isl_tab_rollback(tabs[i], snap) < 0)
-			return -1;
-		if (l < map->p[j]->n_ineq)
-			break;
-	}
-
-	if (k < map->p[i]->n_ineq)
-		/* BAD CUT PAIR */
-		return 0;
-	return fuse(map, i, j, tabs, NULL, ineq_i, NULL, ineq_j, NULL);
-}
-
-/* Both basic maps have at least one inequality with and adjacent
- * (but opposite) inequality in the other basic map.
- * Check that there are no cut constraints and that there is only
- * a single pair of adjacent inequalities.
- * If so, we can replace the pair by a single basic map described
- * by all but the pair of adjacent inequalities.
- * Any additional points introduced lie strictly between the two
- * adjacent hyperplanes and can therefore be integral.
- *
- *        ____			  _____
- *       /    ||\		 /     \
- *      /     || \		/       \
- *      \     ||  \	=>	\        \
- *       \    ||  /		 \       /
- *        \___||_/		  \_____/
- *
- * The test for a single pair of adjancent inequalities is important
- * for avoiding the combination of two basic maps like the following
- *
- *       /|
- *      / |
- *     /__|
- *         _____
- *         |   |
- *         |   |
- *         |___|
- */
-static int check_adj_ineq(struct isl_map *map, int i, int j,
-	struct isl_tab **tabs, int *ineq_i, int *ineq_j)
-{
-	int changed = 0;
-
-	if (any(ineq_i, map->p[i]->n_ineq, STATUS_CUT) ||
-	    any(ineq_j, map->p[j]->n_ineq, STATUS_CUT))
-		/* ADJ INEQ CUT */
-		;
-	else if (count(ineq_i, map->p[i]->n_ineq, STATUS_ADJ_INEQ) == 1 &&
-		 count(ineq_j, map->p[j]->n_ineq, STATUS_ADJ_INEQ) == 1)
-		changed = fuse(map, i, j, tabs, NULL, ineq_i, NULL, ineq_j, NULL);
-	/* else ADJ INEQ TOO MANY */
-
-	return changed;
-}
-
-/* Check if basic map "i" contains the basic map represented
- * by the tableau "tab".
- */
-static int contains(struct isl_map *map, int i, int *ineq_i,
-	struct isl_tab *tab)
-{
-	int k, l;
-	unsigned dim;
-
-	dim = isl_basic_map_total_dim(map->p[i]);
-	for (k = 0; k < map->p[i]->n_eq; ++k) {
-		for (l = 0; l < 2; ++l) {
-			int stat;
-			isl_seq_neg(map->p[i]->eq[k], map->p[i]->eq[k], 1+dim);
-			stat = status_in(map->p[i]->eq[k], tab);
-			if (stat != STATUS_VALID)
-				return 0;
-		}
-	}
-
-	for (k = 0; k < map->p[i]->n_ineq; ++k) {
-		int stat;
-		if (ineq_i[k] == STATUS_REDUNDANT)
-			continue;
-		stat = status_in(map->p[i]->ineq[k], tab);
-		if (stat != STATUS_VALID)
-			return 0;
-	}
-	return 1;
-}
-
-/* Basic map "i" has an inequality "k" that is adjacent to some equality
- * of basic map "j".  All the other inequalities are valid for "j".
- * Check if basic map "j" forms an extension of basic map "i".
- *
- * In particular, we relax constraint "k", compute the corresponding
- * facet and check whether it is included in the other basic map.
- * If so, we know that relaxing the constraint extends the basic
- * map with exactly the other basic map (we already know that this
- * other basic map is included in the extension, because there
- * were no "cut" inequalities in "i") and we can replace the
- * two basic maps by thie extension.
- *        ____			  _____
- *       /    || 		 /     |
- *      /     ||  		/      |
- *      \     ||   	=>	\      |
- *       \    ||		 \     |
- *        \___||		  \____|
- */
-static int is_extension(struct isl_map *map, int i, int j, int k,
-	struct isl_tab **tabs, int *eq_i, int *ineq_i, int *eq_j, int *ineq_j)
-{
-	int changed = 0;
-	int super;
-	struct isl_tab_undo *snap, *snap2;
-	unsigned n_eq = map->p[i]->n_eq;
-
-	snap = isl_tab_snap(tabs[i]);
-	tabs[i] = isl_tab_relax(tabs[i], n_eq + k);
-	snap2 = isl_tab_snap(tabs[i]);
-	if (isl_tab_select_facet(tabs[i], n_eq + k) < 0)
-		return -1;
-	super = contains(map, j, ineq_j, tabs[i]);
-	if (super) {
-		if (isl_tab_rollback(tabs[i], snap2) < 0)
-			return -1;
-		map->p[i] = isl_basic_map_cow(map->p[i]);
-		if (!map->p[i])
-			return -1;
-		isl_int_add_ui(map->p[i]->ineq[k][0], map->p[i]->ineq[k][0], 1);
-		ISL_F_SET(map->p[i], ISL_BASIC_MAP_FINAL);
-		drop(map, j, tabs);
-		changed = 1;
-	} else
-		if (isl_tab_rollback(tabs[i], snap) < 0)
-			return -1;
-
-	return changed;
-}
-
-/* For each non-redundant constraint in "bmap" (as determined by "tab"),
- * wrap the constraint around "bound" such that it includes the whole
- * set "set" and append the resulting constraint to "wraps".
- * "wraps" is assumed to have been pre-allocated to the appropriate size.
- * wraps->n_row is the number of actual wrapped constraints that have
- * been added.
- * If any of the wrapping problems results in a constraint that is
- * identical to "bound", then this means that "set" is unbounded in such
- * way that no wrapping is possible.  If this happens then wraps->n_row
- * is reset to zero.
- */
-static int add_wraps(__isl_keep isl_mat *wraps, __isl_keep isl_basic_map *bmap,
-	struct isl_tab *tab, isl_int *bound, __isl_keep isl_set *set)
-{
-	int l;
-	int w;
-	unsigned total = isl_basic_map_total_dim(bmap);
-
-	w = wraps->n_row;
-
-	for (l = 0; l < bmap->n_ineq; ++l) {
-		if (isl_seq_is_neg(bound, bmap->ineq[l], 1 + total))
-			continue;
-		if (isl_seq_eq(bound, bmap->ineq[l], 1 + total))
-			continue;
-		if (isl_tab_is_redundant(tab, bmap->n_eq + l))
-			continue;
-
-		isl_seq_cpy(wraps->row[w], bound, 1 + total);
-		if (!isl_set_wrap_facet(set, wraps->row[w], bmap->ineq[l]))
-			return -1;
-		if (isl_seq_eq(wraps->row[w], bound, 1 + total))
-			goto unbounded;
-		++w;
-	}
-	for (l = 0; l < bmap->n_eq; ++l) {
-		if (isl_seq_is_neg(bound, bmap->eq[l], 1 + total))
-			continue;
-		if (isl_seq_eq(bound, bmap->eq[l], 1 + total))
-			continue;
-
-		isl_seq_cpy(wraps->row[w], bound, 1 + total);
-		isl_seq_neg(wraps->row[w + 1], bmap->eq[l], 1 + total);
-		if (!isl_set_wrap_facet(set, wraps->row[w], wraps->row[w + 1]))
-			return -1;
-		if (isl_seq_eq(wraps->row[w], bound, 1 + total))
-			goto unbounded;
-		++w;
-
-		isl_seq_cpy(wraps->row[w], bound, 1 + total);
-		if (!isl_set_wrap_facet(set, wraps->row[w], bmap->eq[l]))
-			return -1;
-		if (isl_seq_eq(wraps->row[w], bound, 1 + total))
-			goto unbounded;
-		++w;
-	}
-
-	wraps->n_row = w;
-	return 0;
-unbounded:
-	wraps->n_row = 0;
-	return 0;
-}
-
-/* Check if the constraints in "wraps" from "first" until the last
- * are all valid for the basic set represented by "tab".
- * If not, wraps->n_row is set to zero.
- */
-static int check_wraps(__isl_keep isl_mat *wraps, int first,
-	struct isl_tab *tab)
-{
-	int i;
-
-	for (i = first; i < wraps->n_row; ++i) {
-		enum isl_ineq_type type;
-		type = isl_tab_ineq_type(tab, wraps->row[i]);
-		if (type == isl_ineq_error)
-			return -1;
-		if (type == isl_ineq_redundant)
-			continue;
-		wraps->n_row = 0;
-		return 0;
-	}
-
-	return 0;
-}
-
-/* Return a set that corresponds to the non-redudant constraints
- * (as recorded in tab) of bmap.
- *
- * It's important to remove the redundant constraints as some
- * of the other constraints may have been modified after the
- * constraints were marked redundant.
- * In particular, a constraint may have been relaxed.
- * Redundant constraints are ignored when a constraint is relaxed
- * and should therefore continue to be ignored ever after.
- * Otherwise, the relaxation might be thwarted by some of
- * these constraints.
- */
-static __isl_give isl_set *set_from_updated_bmap(__isl_keep isl_basic_map *bmap,
-	struct isl_tab *tab)
-{
-	bmap = isl_basic_map_copy(bmap);
-	bmap = isl_basic_map_cow(bmap);
-	bmap = isl_basic_map_update_from_tab(bmap, tab);
-	return isl_set_from_basic_set(isl_basic_map_underlying_set(bmap));
-}
-
-/* Given a basic set i with a constraint k that is adjacent to either the
- * whole of basic set j or a facet of basic set j, check if we can wrap
- * both the facet corresponding to k and the facet of j (or the whole of j)
- * around their ridges to include the other set.
- * If so, replace the pair of basic sets by their union.
- *
- * All constraints of i (except k) are assumed to be valid for j.
- *
- * However, the constraints of j may not be valid for i and so
- * we have to check that the wrapping constraints for j are valid for i.
- *
- * In the case where j has a facet adjacent to i, tab[j] is assumed
- * to have been restricted to this facet, so that the non-redundant
- * constraints in tab[j] are the ridges of the facet.
- * Note that for the purpose of wrapping, it does not matter whether
- * we wrap the ridges of i around the whole of j or just around
- * the facet since all the other constraints are assumed to be valid for j.
- * In practice, we wrap to include the whole of j.
- *        ____			  _____
- *       /    | 		 /     \
- *      /     ||  		/      |
- *      \     ||   	=>	\      |
- *       \    ||		 \     |
- *        \___||		  \____|
- *
- */
-static int can_wrap_in_facet(struct isl_map *map, int i, int j, int k,
-	struct isl_tab **tabs, int *eq_i, int *ineq_i, int *eq_j, int *ineq_j)
-{
-	int changed = 0;
-	struct isl_mat *wraps = NULL;
-	struct isl_set *set_i = NULL;
-	struct isl_set *set_j = NULL;
-	struct isl_vec *bound = NULL;
-	unsigned total = isl_basic_map_total_dim(map->p[i]);
-	struct isl_tab_undo *snap;
-	int n;
-
-	set_i = set_from_updated_bmap(map->p[i], tabs[i]);
-	set_j = set_from_updated_bmap(map->p[j], tabs[j]);
-	wraps = isl_mat_alloc(map->ctx, 2 * (map->p[i]->n_eq + map->p[j]->n_eq) +
-					map->p[i]->n_ineq + map->p[j]->n_ineq,
-					1 + total);
-	bound = isl_vec_alloc(map->ctx, 1 + total);
-	if (!set_i || !set_j || !wraps || !bound)
-		goto error;
-
-	isl_seq_cpy(bound->el, map->p[i]->ineq[k], 1 + total);
-	isl_int_add_ui(bound->el[0], bound->el[0], 1);
-
-	isl_seq_cpy(wraps->row[0], bound->el, 1 + total);
-	wraps->n_row = 1;
-
-	if (add_wraps(wraps, map->p[j], tabs[j], bound->el, set_i) < 0)
-		goto error;
-	if (!wraps->n_row)
-		goto unbounded;
-
-	snap = isl_tab_snap(tabs[i]);
-
-	if (isl_tab_select_facet(tabs[i], map->p[i]->n_eq + k) < 0)
-		goto error;
-	if (isl_tab_detect_redundant(tabs[i]) < 0)
-		goto error;
-
-	isl_seq_neg(bound->el, map->p[i]->ineq[k], 1 + total);
-
-	n = wraps->n_row;
-	if (add_wraps(wraps, map->p[i], tabs[i], bound->el, set_j) < 0)
-		goto error;
-
-	if (isl_tab_rollback(tabs[i], snap) < 0)
-		goto error;
-	if (check_wraps(wraps, n, tabs[i]) < 0)
-		goto error;
-	if (!wraps->n_row)
-		goto unbounded;
-
-	changed = fuse(map, i, j, tabs, eq_i, ineq_i, eq_j, ineq_j, wraps);
-
-unbounded:
-	isl_mat_free(wraps);
-
-	isl_set_free(set_i);
-	isl_set_free(set_j);
-
-	isl_vec_free(bound);
-
-	return changed;
-error:
-	isl_vec_free(bound);
-	isl_mat_free(wraps);
-	isl_set_free(set_i);
-	isl_set_free(set_j);
-	return -1;
-}
-
-/* Set the is_redundant property of the "n" constraints in "cuts",
- * except "k" to "v".
- * This is a fairly tricky operation as it bypasses isl_tab.c.
- * The reason we want to temporarily mark some constraints redundant
- * is that we want to ignore them in add_wraps.
- *
- * Initially all cut constraints are non-redundant, but the
- * selection of a facet right before the call to this function
- * may have made some of them redundant.
- * Likewise, the same constraints are marked non-redundant
- * in the second call to this function, before they are officially
- * made non-redundant again in the subsequent rollback.
- */
-static void set_is_redundant(struct isl_tab *tab, unsigned n_eq,
-	int *cuts, int n, int k, int v)
-{
-	int l;
-
-	for (l = 0; l < n; ++l) {
-		if (l == k)
-			continue;
-		tab->con[n_eq + cuts[l]].is_redundant = v;
-	}
-}
-
-/* Given a pair of basic maps i and j such that j sticks out
- * of i at n cut constraints, each time by at most one,
- * try to compute wrapping constraints and replace the two
- * basic maps by a single basic map.
- * The other constraints of i are assumed to be valid for j.
- *
- * The facets of i corresponding to the cut constraints are
- * wrapped around their ridges, except those ridges determined
- * by any of the other cut constraints.
- * The intersections of cut constraints need to be ignored
- * as the result of wrapping one cut constraint around another
- * would result in a constraint cutting the union.
- * In each case, the facets are wrapped to include the union
- * of the two basic maps.
- *
- * The pieces of j that lie at an offset of exactly one from
- * one of the cut constraints of i are wrapped around their edges.
- * Here, there is no need to ignore intersections because we
- * are wrapping around the union of the two basic maps.
- *
- * If any wrapping fails, i.e., if we cannot wrap to touch
- * the union, then we give up.
- * Otherwise, the pair of basic maps is replaced by their union.
- */
-static int wrap_in_facets(struct isl_map *map, int i, int j,
-	int *cuts, int n, struct isl_tab **tabs,
-	int *eq_i, int *ineq_i, int *eq_j, int *ineq_j)
-{
-	int changed = 0;
-	isl_mat *wraps = NULL;
-	isl_set *set = NULL;
-	isl_vec *bound = NULL;
-	unsigned total = isl_basic_map_total_dim(map->p[i]);
-	int max_wrap;
-	int k;
-	struct isl_tab_undo *snap_i, *snap_j;
-
-	if (isl_tab_extend_cons(tabs[j], 1) < 0)
-		goto error;
-
-	max_wrap = 2 * (map->p[i]->n_eq + map->p[j]->n_eq) +
-		    map->p[i]->n_ineq + map->p[j]->n_ineq;
-	max_wrap *= n;
-
-	set = isl_set_union(set_from_updated_bmap(map->p[i], tabs[i]),
-			    set_from_updated_bmap(map->p[j], tabs[j]));
-	wraps = isl_mat_alloc(map->ctx, max_wrap, 1 + total);
-	bound = isl_vec_alloc(map->ctx, 1 + total);
-	if (!set || !wraps || !bound)
-		goto error;
-
-	snap_i = isl_tab_snap(tabs[i]);
-	snap_j = isl_tab_snap(tabs[j]);
-
-	wraps->n_row = 0;
-
-	for (k = 0; k < n; ++k) {
-		if (isl_tab_select_facet(tabs[i], map->p[i]->n_eq + cuts[k]) < 0)
-			goto error;
-		if (isl_tab_detect_redundant(tabs[i]) < 0)
-			goto error;
-		set_is_redundant(tabs[i], map->p[i]->n_eq, cuts, n, k, 1);
-
-		isl_seq_neg(bound->el, map->p[i]->ineq[cuts[k]], 1 + total);
-		if (add_wraps(wraps, map->p[i], tabs[i], bound->el, set) < 0)
-			goto error;
-
-		set_is_redundant(tabs[i], map->p[i]->n_eq, cuts, n, k, 0);
-		if (isl_tab_rollback(tabs[i], snap_i) < 0)
-			goto error;
-
-		if (!wraps->n_row)
-			break;
-
-		isl_seq_cpy(bound->el, map->p[i]->ineq[cuts[k]], 1 + total);
-		isl_int_add_ui(bound->el[0], bound->el[0], 1);
-		if (isl_tab_add_eq(tabs[j], bound->el) < 0)
-			goto error;
-		if (isl_tab_detect_redundant(tabs[j]) < 0)
-			goto error;
-
-		if (!tabs[j]->empty &&
-		    add_wraps(wraps, map->p[j], tabs[j], bound->el, set) < 0)
-			goto error;
-
-		if (isl_tab_rollback(tabs[j], snap_j) < 0)
-			goto error;
-
-		if (!wraps->n_row)
-			break;
-	}
-
-	if (k == n)
-		changed = fuse(map, i, j, tabs,
-				eq_i, ineq_i, eq_j, ineq_j, wraps);
-
-	isl_vec_free(bound);
-	isl_mat_free(wraps);
-	isl_set_free(set);
-
-	return changed;
-error:
-	isl_vec_free(bound);
-	isl_mat_free(wraps);
-	isl_set_free(set);
-	return -1;
-}
-
-/* Given two basic sets i and j such that i has no cut equalities,
- * check if relaxing all the cut inequalities of i by one turns
- * them into valid constraint for j and check if we can wrap in
- * the bits that are sticking out.
- * If so, replace the pair by their union.
- *
- * We first check if all relaxed cut inequalities of i are valid for j
- * and then try to wrap in the intersections of the relaxed cut inequalities
- * with j.
- *
- * During this wrapping, we consider the points of j that lie at a distance
- * of exactly 1 from i.  In particular, we ignore the points that lie in
- * between this lower-dimensional space and the basic map i.
- * We can therefore only apply this to integer maps.
- *        ____			  _____
- *       / ___|_		 /     \
- *      / |    |  		/      |
- *      \ |    |   	=>	\      |
- *       \|____|		 \     |
- *        \___| 		  \____/
- *
- *	 _____			 ______
- *	| ____|_		|      \
- *	| |     |		|       |
- *	| |	|	=>	|       |
- *	|_|     |		|       |
- *	  |_____|		 \______|
- *
- *	 _______
- *	|       |
- *	|  |\   |
- *	|  | \  |
- *	|  |  \ |
- *	|  |   \|
- *	|  |    \
- *	|  |_____\
- *	|       |
- *	|_______|
- *
- * Wrapping can fail if the result of wrapping one of the facets
- * around its edges does not produce any new facet constraint.
- * In particular, this happens when we try to wrap in unbounded sets.
- *
- *	 _______________________________________________________________________
- *	|
- *	|  ___
- *	| |   |
- *	|_|   |_________________________________________________________________
- *	  |___|
- *
- * The following is not an acceptable result of coalescing the above two
- * sets as it includes extra integer points.
- *	 _______________________________________________________________________
- *	|
- *	|     
- *	|      
- *	|
- *	 \______________________________________________________________________
- */
-static int can_wrap_in_set(struct isl_map *map, int i, int j,
-	struct isl_tab **tabs, int *eq_i, int *ineq_i, int *eq_j, int *ineq_j)
-{
-	int changed = 0;
-	int k, m;
-	int n;
-	int *cuts = NULL;
-
-	if (ISL_F_ISSET(map->p[i], ISL_BASIC_MAP_RATIONAL) ||
-	    ISL_F_ISSET(map->p[j], ISL_BASIC_MAP_RATIONAL))
-		return 0;
-
-	n = count(ineq_i, map->p[i]->n_ineq, STATUS_CUT);
-	if (n == 0)
-		return 0;
-
-	cuts = isl_alloc_array(map->ctx, int, n);
-	if (!cuts)
-		return -1;
-
-	for (k = 0, m = 0; m < n; ++k) {
-		enum isl_ineq_type type;
-
-		if (ineq_i[k] != STATUS_CUT)
-			continue;
-
-		isl_int_add_ui(map->p[i]->ineq[k][0], map->p[i]->ineq[k][0], 1);
-		type = isl_tab_ineq_type(tabs[j], map->p[i]->ineq[k]);
-		isl_int_sub_ui(map->p[i]->ineq[k][0], map->p[i]->ineq[k][0], 1);
-		if (type == isl_ineq_error)
-			goto error;
-		if (type != isl_ineq_redundant)
-			break;
-		cuts[m] = k;
-		++m;
-	}
-
-	if (m == n)
-		changed = wrap_in_facets(map, i, j, cuts, n, tabs,
-					 eq_i, ineq_i, eq_j, ineq_j);
-
-	free(cuts);
-
-	return changed;
-error:
-	free(cuts);
-	return -1;
-}
-
-/* Check if either i or j has a single cut constraint that can
- * be used to wrap in (a facet of) the other basic set.
- * if so, replace the pair by their union.
- */
-static int check_wrap(struct isl_map *map, int i, int j,
-	struct isl_tab **tabs, int *eq_i, int *ineq_i, int *eq_j, int *ineq_j)
-{
-	int changed = 0;
-
-	if (!any(eq_i, 2 * map->p[i]->n_eq, STATUS_CUT))
-		changed = can_wrap_in_set(map, i, j, tabs,
-					    eq_i, ineq_i, eq_j, ineq_j);
-	if (changed)
-		return changed;
-
-	if (!any(eq_j, 2 * map->p[j]->n_eq, STATUS_CUT))
-		changed = can_wrap_in_set(map, j, i, tabs,
-					    eq_j, ineq_j, eq_i, ineq_i);
-	return changed;
-}
-
-/* At least one of the basic maps has an equality that is adjacent
- * to inequality.  Make sure that only one of the basic maps has
- * such an equality and that the other basic map has exactly one
- * inequality adjacent to an equality.
- * We call the basic map that has the inequality "i" and the basic
- * map that has the equality "j".
- * If "i" has any "cut" (in)equality, then relaxing the inequality
- * by one would not result in a basic map that contains the other
- * basic map.
- */
-static int check_adj_eq(struct isl_map *map, int i, int j,
-	struct isl_tab **tabs, int *eq_i, int *ineq_i, int *eq_j, int *ineq_j)
-{
-	int changed = 0;
-	int k;
-
-	if (any(eq_i, 2 * map->p[i]->n_eq, STATUS_ADJ_INEQ) &&
-	    any(eq_j, 2 * map->p[j]->n_eq, STATUS_ADJ_INEQ))
-		/* ADJ EQ TOO MANY */
-		return 0;
-
-	if (any(eq_i, 2 * map->p[i]->n_eq, STATUS_ADJ_INEQ))
-		return check_adj_eq(map, j, i, tabs,
-					eq_j, ineq_j, eq_i, ineq_i);
-
-	/* j has an equality adjacent to an inequality in i */
-
-	if (any(eq_i, 2 * map->p[i]->n_eq, STATUS_CUT))
-		return 0;
-	if (any(ineq_i, map->p[i]->n_ineq, STATUS_CUT))
-		/* ADJ EQ CUT */
-		return 0;
-	if (count(ineq_i, map->p[i]->n_ineq, STATUS_ADJ_EQ) != 1 ||
-	    any(ineq_j, map->p[j]->n_ineq, STATUS_ADJ_EQ) ||
-	    any(ineq_i, map->p[i]->n_ineq, STATUS_ADJ_INEQ) ||
-	    any(ineq_j, map->p[j]->n_ineq, STATUS_ADJ_INEQ))
-		/* ADJ EQ TOO MANY */
-		return 0;
-
-	for (k = 0; k < map->p[i]->n_ineq ; ++k)
-		if (ineq_i[k] == STATUS_ADJ_EQ)
-			break;
-
-	changed = is_extension(map, i, j, k, tabs, eq_i, ineq_i, eq_j, ineq_j);
-	if (changed)
-		return changed;
-
-	if (count(eq_j, 2 * map->p[j]->n_eq, STATUS_ADJ_INEQ) != 1)
-		return 0;
-
-	changed = can_wrap_in_facet(map, i, j, k, tabs, eq_i, ineq_i, eq_j, ineq_j);
-
-	return changed;
-}
-
-/* The two basic maps lie on adjacent hyperplanes.  In particular,
- * basic map "i" has an equality that lies parallel to basic map "j".
- * Check if we can wrap the facets around the parallel hyperplanes
- * to include the other set.
- *
- * We perform basically the same operations as can_wrap_in_facet,
- * except that we don't need to select a facet of one of the sets.
- *				_
- *	\\			\\
- *	 \\		=>	 \\
- *	  \			  \|
- *
- * We only allow one equality of "i" to be adjacent to an equality of "j"
- * to avoid coalescing
- *
- *	[m, n] -> { [x, y] -> [x, 1 + y] : x >= 1 and y >= 1 and
- *					    x <= 10 and y <= 10;
- *		    [x, y] -> [1 + x, y] : x >= 1 and x <= 20 and
- *					    y >= 5 and y <= 15 }
- *
- * to
- *
- *	[m, n] -> { [x, y] -> [x2, y2] : x >= 1 and 10y2 <= 20 - x + 10y and
- *					4y2 >= 5 + 3y and 5y2 <= 15 + 4y and
- *					y2 <= 1 + x + y - x2 and y2 >= y and
- *					y2 >= 1 + x + y - x2 }
- */
-static int check_eq_adj_eq(struct isl_map *map, int i, int j,
-	struct isl_tab **tabs, int *eq_i, int *ineq_i, int *eq_j, int *ineq_j)
-{
-	int k;
-	int changed = 0;
-	struct isl_mat *wraps = NULL;
-	struct isl_set *set_i = NULL;
-	struct isl_set *set_j = NULL;
-	struct isl_vec *bound = NULL;
-	unsigned total = isl_basic_map_total_dim(map->p[i]);
-
-	if (count(eq_i, 2 * map->p[i]->n_eq, STATUS_ADJ_EQ) != 1)
-		return 0;
-
-	for (k = 0; k < 2 * map->p[i]->n_eq ; ++k)
-		if (eq_i[k] == STATUS_ADJ_EQ)
-			break;
-
-	set_i = set_from_updated_bmap(map->p[i], tabs[i]);
-	set_j = set_from_updated_bmap(map->p[j], tabs[j]);
-	wraps = isl_mat_alloc(map->ctx, 2 * (map->p[i]->n_eq + map->p[j]->n_eq) +
-					map->p[i]->n_ineq + map->p[j]->n_ineq,
-					1 + total);
-	bound = isl_vec_alloc(map->ctx, 1 + total);
-	if (!set_i || !set_j || !wraps || !bound)
-		goto error;
-
-	if (k % 2 == 0)
-		isl_seq_neg(bound->el, map->p[i]->eq[k / 2], 1 + total);
-	else
-		isl_seq_cpy(bound->el, map->p[i]->eq[k / 2], 1 + total);
-	isl_int_add_ui(bound->el[0], bound->el[0], 1);
-
-	isl_seq_cpy(wraps->row[0], bound->el, 1 + total);
-	wraps->n_row = 1;
-
-	if (add_wraps(wraps, map->p[j], tabs[j], bound->el, set_i) < 0)
-		goto error;
-	if (!wraps->n_row)
-		goto unbounded;
-
-	isl_int_sub_ui(bound->el[0], bound->el[0], 1);
-	isl_seq_neg(bound->el, bound->el, 1 + total);
-
-	isl_seq_cpy(wraps->row[wraps->n_row], bound->el, 1 + total);
-	wraps->n_row++;
-
-	if (add_wraps(wraps, map->p[i], tabs[i], bound->el, set_j) < 0)
-		goto error;
-	if (!wraps->n_row)
-		goto unbounded;
-
-	changed = fuse(map, i, j, tabs, eq_i, ineq_i, eq_j, ineq_j, wraps);
-
-	if (0) {
-error:		changed = -1;
-	}
-unbounded:
-
-	isl_mat_free(wraps);
-	isl_set_free(set_i);
-	isl_set_free(set_j);
-	isl_vec_free(bound);
-
-	return changed;
-}
-
-/* Check if the union of the given pair of basic maps
- * can be represented by a single basic map.
- * If so, replace the pair by the single basic map and return 1.
- * Otherwise, return 0;
- *
- * We first check the effect of each constraint of one basic map
- * on the other basic map.
- * The constraint may be
- *	redundant	the constraint is redundant in its own
- *			basic map and should be ignore and removed
- *			in the end
- *	valid		all (integer) points of the other basic map
- *			satisfy the constraint
- *	separate	no (integer) point of the other basic map
- *			satisfies the constraint
- *	cut		some but not all points of the other basic map
- *			satisfy the constraint
- *	adj_eq		the given constraint is adjacent (on the outside)
- *			to an equality of the other basic map
- *	adj_ineq	the given constraint is adjacent (on the outside)
- *			to an inequality of the other basic map
- *
- * We consider seven cases in which we can replace the pair by a single
- * basic map.  We ignore all "redundant" constraints.
- *
- *	1. all constraints of one basic map are valid
- *		=> the other basic map is a subset and can be removed
- *
- *	2. all constraints of both basic maps are either "valid" or "cut"
- *	   and the facets corresponding to the "cut" constraints
- *	   of one of the basic maps lies entirely inside the other basic map
- *		=> the pair can be replaced by a basic map consisting
- *		   of the valid constraints in both basic maps
- *
- *	3. there is a single pair of adjacent inequalities
- *	   (all other constraints are "valid")
- *		=> the pair can be replaced by a basic map consisting
- *		   of the valid constraints in both basic maps
- *
- *	4. there is a single adjacent pair of an inequality and an equality,
- *	   the other constraints of the basic map containing the inequality are
- *	   "valid".  Moreover, if the inequality the basic map is relaxed
- *	   and then turned into an equality, then resulting facet lies
- *	   entirely inside the other basic map
- *		=> the pair can be replaced by the basic map containing
- *		   the inequality, with the inequality relaxed.
- *
- *	5. there is a single adjacent pair of an inequality and an equality,
- *	   the other constraints of the basic map containing the inequality are
- *	   "valid".  Moreover, the facets corresponding to both
- *	   the inequality and the equality can be wrapped around their
- *	   ridges to include the other basic map
- *		=> the pair can be replaced by a basic map consisting
- *		   of the valid constraints in both basic maps together
- *		   with all wrapping constraints
- *
- *	6. one of the basic maps extends beyond the other by at most one.
- *	   Moreover, the facets corresponding to the cut constraints and
- *	   the pieces of the other basic map at offset one from these cut
- *	   constraints can be wrapped around their ridges to include
- *	   the union of the two basic maps
- *		=> the pair can be replaced by a basic map consisting
- *		   of the valid constraints in both basic maps together
- *		   with all wrapping constraints
- *
- *	7. the two basic maps live in adjacent hyperplanes.  In principle
- *	   such sets can always be combined through wrapping, but we impose
- *	   that there is only one such pair, to avoid overeager coalescing.
- *
- * Throughout the computation, we maintain a collection of tableaus
- * corresponding to the basic maps.  When the basic maps are dropped
- * or combined, the tableaus are modified accordingly.
- */
-static int coalesce_pair(struct isl_map *map, int i, int j,
-	struct isl_tab **tabs)
-{
-	int changed = 0;
-	int *eq_i = NULL;
-	int *eq_j = NULL;
-	int *ineq_i = NULL;
-	int *ineq_j = NULL;
-
-	eq_i = eq_status_in(map, i, j, tabs);
-	if (!eq_i)
-		goto error;
-	if (any(eq_i, 2 * map->p[i]->n_eq, STATUS_ERROR))
-		goto error;
-	if (any(eq_i, 2 * map->p[i]->n_eq, STATUS_SEPARATE))
-		goto done;
-
-	eq_j = eq_status_in(map, j, i, tabs);
-	if (!eq_j)
-		goto error;
-	if (any(eq_j, 2 * map->p[j]->n_eq, STATUS_ERROR))
-		goto error;
-	if (any(eq_j, 2 * map->p[j]->n_eq, STATUS_SEPARATE))
-		goto done;
-
-	ineq_i = ineq_status_in(map, i, j, tabs);
-	if (!ineq_i)
-		goto error;
-	if (any(ineq_i, map->p[i]->n_ineq, STATUS_ERROR))
-		goto error;
-	if (any(ineq_i, map->p[i]->n_ineq, STATUS_SEPARATE))
-		goto done;
-
-	ineq_j = ineq_status_in(map, j, i, tabs);
-	if (!ineq_j)
-		goto error;
-	if (any(ineq_j, map->p[j]->n_ineq, STATUS_ERROR))
-		goto error;
-	if (any(ineq_j, map->p[j]->n_ineq, STATUS_SEPARATE))
-		goto done;
-
-	if (all(eq_i, 2 * map->p[i]->n_eq, STATUS_VALID) &&
-	    all(ineq_i, map->p[i]->n_ineq, STATUS_VALID)) {
-		drop(map, j, tabs);
-		changed = 1;
-	} else if (all(eq_j, 2 * map->p[j]->n_eq, STATUS_VALID) &&
-		   all(ineq_j, map->p[j]->n_ineq, STATUS_VALID)) {
-		drop(map, i, tabs);
-		changed = 1;
-	} else if (any(eq_i, 2 * map->p[i]->n_eq, STATUS_ADJ_EQ)) {
-		changed = check_eq_adj_eq(map, i, j, tabs,
-					eq_i, ineq_i, eq_j, ineq_j);
-	} else if (any(eq_j, 2 * map->p[j]->n_eq, STATUS_ADJ_EQ)) {
-		changed = check_eq_adj_eq(map, j, i, tabs,
-					eq_j, ineq_j, eq_i, ineq_i);
-	} else if (any(eq_i, 2 * map->p[i]->n_eq, STATUS_ADJ_INEQ) ||
-		   any(eq_j, 2 * map->p[j]->n_eq, STATUS_ADJ_INEQ)) {
-		changed = check_adj_eq(map, i, j, tabs,
-					eq_i, ineq_i, eq_j, ineq_j);
-	} else if (any(ineq_i, map->p[i]->n_ineq, STATUS_ADJ_EQ) ||
-		   any(ineq_j, map->p[j]->n_ineq, STATUS_ADJ_EQ)) {
-		/* Can't happen */
-		/* BAD ADJ INEQ */
-	} else if (any(ineq_i, map->p[i]->n_ineq, STATUS_ADJ_INEQ) ||
-		   any(ineq_j, map->p[j]->n_ineq, STATUS_ADJ_INEQ)) {
-		if (!any(eq_i, 2 * map->p[i]->n_eq, STATUS_CUT) &&
-		    !any(eq_j, 2 * map->p[j]->n_eq, STATUS_CUT))
-			changed = check_adj_ineq(map, i, j, tabs,
-						 ineq_i, ineq_j);
-	} else {
-		if (!any(eq_i, 2 * map->p[i]->n_eq, STATUS_CUT) &&
-		    !any(eq_j, 2 * map->p[j]->n_eq, STATUS_CUT))
-			changed = check_facets(map, i, j, tabs, ineq_i, ineq_j);
-		if (!changed)
-			changed = check_wrap(map, i, j, tabs,
-						eq_i, ineq_i, eq_j, ineq_j);
-	}
-
-done:
-	free(eq_i);
-	free(eq_j);
-	free(ineq_i);
-	free(ineq_j);
-	return changed;
-error:
-	free(eq_i);
-	free(eq_j);
-	free(ineq_i);
-	free(ineq_j);
-	return -1;
-}
-
-static struct isl_map *coalesce(struct isl_map *map, struct isl_tab **tabs)
-{
-	int i, j;
-
-	for (i = map->n - 2; i >= 0; --i)
-restart:
-		for (j = i + 1; j < map->n; ++j) {
-			int changed;
-			changed = coalesce_pair(map, i, j, tabs);
-			if (changed < 0)
-				goto error;
-			if (changed)
-				goto restart;
-		}
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/* For each pair of basic maps in the map, check if the union of the two
- * can be represented by a single basic map.
- * If so, replace the pair by the single basic map and start over.
- */
-struct isl_map *isl_map_coalesce(struct isl_map *map)
-{
-	int i;
-	unsigned n;
-	struct isl_tab **tabs = NULL;
-
-	if (!map)
-		return NULL;
-
-	if (map->n <= 1)
-		return map;
-
-	map = isl_map_align_divs(map);
-
-	tabs = isl_calloc_array(map->ctx, struct isl_tab *, map->n);
-	if (!tabs)
-		goto error;
-
-	n = map->n;
-	for (i = 0; i < map->n; ++i) {
-		tabs[i] = isl_tab_from_basic_map(map->p[i]);
-		if (!tabs[i])
-			goto error;
-		if (!ISL_F_ISSET(map->p[i], ISL_BASIC_MAP_NO_IMPLICIT))
-			if (isl_tab_detect_implicit_equalities(tabs[i]) < 0)
-				goto error;
-		if (!ISL_F_ISSET(map->p[i], ISL_BASIC_MAP_NO_REDUNDANT))
-			if (isl_tab_detect_redundant(tabs[i]) < 0)
-				goto error;
-	}
-	for (i = map->n - 1; i >= 0; --i)
-		if (tabs[i]->empty)
-			drop(map, i, tabs);
-
-	map = coalesce(map, tabs);
-
-	if (map)
-		for (i = 0; i < map->n; ++i) {
-			map->p[i] = isl_basic_map_update_from_tab(map->p[i],
-								    tabs[i]);
-			map->p[i] = isl_basic_map_finalize(map->p[i]);
-			if (!map->p[i])
-				goto error;
-			ISL_F_SET(map->p[i], ISL_BASIC_MAP_NO_IMPLICIT);
-			ISL_F_SET(map->p[i], ISL_BASIC_MAP_NO_REDUNDANT);
-		}
-
-	for (i = 0; i < n; ++i)
-		isl_tab_free(tabs[i]);
-
-	free(tabs);
-
-	return map;
-error:
-	if (tabs)
-		for (i = 0; i < n; ++i)
-			isl_tab_free(tabs[i]);
-	free(tabs);
-	isl_map_free(map);
-	return NULL;
-}
-
-/* For each pair of basic sets in the set, check if the union of the two
- * can be represented by a single basic set.
- * If so, replace the pair by the single basic set and start over.
- */
-struct isl_set *isl_set_coalesce(struct isl_set *set)
-{
-	return (struct isl_set *)isl_map_coalesce((struct isl_map *)set);
-}
diff --git a/cloog-0.17.0/isl/isl_config.h.in b/cloog-0.17.0/isl/isl_config.h.in
deleted file mode 100644
index 9184504..0000000
--- a/cloog-0.17.0/isl/isl_config.h.in
+++ /dev/null
@@ -1,118 +0,0 @@
-/* isl_config.h.in.  Generated from configure.ac by autoheader.  */
-
-/* Clang installation prefix */
-#undef CLANG_PREFIX
-
-/* Define to Diagnostic for older versions of clang */
-#undef DiagnosticsEngine
-
-/* most gcc compilers know a function __attribute__((__warn_unused_result__))
-   */
-#undef GCC_WARN_UNUSED_RESULT
-
-/* Define if Driver constructor takes CXXIsProduction argument */
-#undef HAVE_CXXISPRODUCTION
-
-/* Define to 1 if you have the declaration of `ffs', and to 0 if you don't. */
-#undef HAVE_DECL_FFS
-
-/* Define to 1 if you have the declaration of `mp_get_memory_functions', and
-   to 0 if you don't. */
-#undef HAVE_DECL_MP_GET_MEMORY_FUNCTIONS
-
-/* Define to 1 if you have the declaration of `__builtin_ffs', and to 0 if you
-   don't. */
-#undef HAVE_DECL___BUILTIN_FFS
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#undef HAVE_DLFCN_H
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* define if your compiler has __attribute__ */
-#undef HAVE___ATTRIBUTE__
-
-/* piplib is available */
-#undef ISL_PIPLIB
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
-   */
-#undef LT_OBJDIR
-
-/* Name of package */
-#undef PACKAGE
-
-/* Define to the address where bug reports for this package should be sent. */
-#undef PACKAGE_BUGREPORT
-
-/* Define to the full name of this package. */
-#undef PACKAGE_NAME
-
-/* Define to the full name and version of this package. */
-#undef PACKAGE_STRING
-
-/* Define to the one symbol short name of this package. */
-#undef PACKAGE_TARNAME
-
-/* Define to the home page for this package. */
-#undef PACKAGE_URL
-
-/* Define to the version of this package. */
-#undef PACKAGE_VERSION
-
-/* The size of `char', as computed by sizeof. */
-#undef SIZEOF_CHAR
-
-/* The size of `int', as computed by sizeof. */
-#undef SIZEOF_INT
-
-/* The size of `long', as computed by sizeof. */
-#undef SIZEOF_LONG
-
-/* The size of `short', as computed by sizeof. */
-#undef SIZEOF_SHORT
-
-/* The size of `void*', as computed by sizeof. */
-#undef SIZEOF_VOIDP
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Define if Driver::BuildCompilation takes ArrayRef */
-#undef USE_ARRAYREF
-
-/* Version number of package */
-#undef VERSION
-
-/* Define to getHostTriple for older versions of clang */
-#undef getDefaultTargetTriple
-
-/* Define to getInstantiationLineNumber for older versions of clang */
-#undef getExpansionLineNumber
-
-#include <isl_config_post.h>
diff --git a/cloog-0.17.0/isl/isl_config_post.h b/cloog-0.17.0/isl/isl_config_post.h
deleted file mode 100644
index a9c23f4..0000000
--- a/cloog-0.17.0/isl/isl_config_post.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef HAVE___ATTRIBUTE__
-#define __attribute__(x)
-#endif
-
-#if (HAVE_DECL_FFS==0) && (HAVE_DECL___BUILTIN_FFS==1)
-# define ffs __builtin_ffs
-#endif
diff --git a/cloog-0.17.0/isl/isl_constraint.c b/cloog-0.17.0/isl/isl_constraint.c
deleted file mode 100644
index 923cf59..0000000
--- a/cloog-0.17.0/isl/isl_constraint.c
+++ /dev/null
@@ -1,1170 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France 
- */
-
-#include <isl_map_private.h>
-#include <isl_constraint_private.h>
-#include <isl_space_private.h>
-#include <isl/seq.h>
-#include <isl_aff_private.h>
-#include <isl_local_space_private.h>
-
-isl_ctx *isl_constraint_get_ctx(__isl_keep isl_constraint *c)
-{
-	return c ? isl_local_space_get_ctx(c->ls) : NULL;
-}
-
-static unsigned n(struct isl_constraint *c, enum isl_dim_type type)
-{
-	return isl_local_space_dim(c->ls, type);
-}
-
-static unsigned offset(struct isl_constraint *c, enum isl_dim_type type)
-{
-	return isl_local_space_offset(c->ls, type);
-}
-
-static unsigned basic_map_offset(__isl_keep isl_basic_map *bmap,
-							enum isl_dim_type type)
-{
-	return type == isl_dim_div ? 1 + isl_space_dim(bmap->dim, isl_dim_all)
-				   : 1 + isl_space_offset(bmap->dim, type);
-}
-
-static unsigned basic_set_offset(struct isl_basic_set *bset,
-							enum isl_dim_type type)
-{
-	isl_space *dim = bset->dim;
-	switch (type) {
-	case isl_dim_param:	return 1;
-	case isl_dim_in:	return 1 + dim->nparam;
-	case isl_dim_out:	return 1 + dim->nparam + dim->n_in;
-	case isl_dim_div:	return 1 + dim->nparam + dim->n_in + dim->n_out;
-	default:		return 0;
-	}
-}
-
-__isl_give isl_constraint *isl_constraint_alloc_vec(int eq,
-	__isl_take isl_local_space *ls, __isl_take isl_vec *v)
-{
-	isl_constraint *constraint;
-
-	if (!ls || !v)
-		goto error;
-
-	constraint = isl_alloc_type(isl_vec_get_ctx(v), isl_constraint);
-	if (!constraint)
-		goto error;
-
-	constraint->ref = 1;
-	constraint->eq = eq;
-	constraint->ls = ls;
-	constraint->v = v;
-
-	return constraint;
-error:
-	isl_local_space_free(ls);
-	isl_vec_free(v);
-	return NULL;
-}
-
-__isl_give isl_constraint *isl_constraint_alloc(int eq,
-	__isl_take isl_local_space *ls)
-{
-	isl_ctx *ctx;
-	isl_vec *v;
-
-	if (!ls)
-		return NULL;
-
-	ctx = isl_local_space_get_ctx(ls);
-	v = isl_vec_alloc(ctx, 1 + isl_local_space_dim(ls, isl_dim_all));
-	v = isl_vec_clr(v);
-	return isl_constraint_alloc_vec(eq, ls, v);
-}
-
-struct isl_constraint *isl_basic_map_constraint(struct isl_basic_map *bmap,
-	isl_int **line)
-{
-	int eq;
-	isl_ctx *ctx;
-	isl_vec *v;
-	isl_local_space *ls = NULL;
-	isl_constraint *constraint;
-
-	if (!bmap || !line)
-		goto error;
-
-	eq = line >= bmap->eq;
-
-	ctx = isl_basic_map_get_ctx(bmap);
-	ls = isl_basic_map_get_local_space(bmap);
-	v = isl_vec_alloc(ctx, 1 + isl_local_space_dim(ls, isl_dim_all));
-	if (!v)
-		goto error;
-	isl_seq_cpy(v->el, line[0], v->size);
-	constraint = isl_constraint_alloc_vec(eq, ls, v);
-
-	isl_basic_map_free(bmap);
-	return constraint;
-error:
-	isl_local_space_free(ls);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_constraint *isl_basic_set_constraint(struct isl_basic_set *bset,
-	isl_int **line)
-{
-	return isl_basic_map_constraint((struct isl_basic_map *)bset, line);
-}
-
-__isl_give isl_constraint *isl_equality_alloc(__isl_take isl_local_space *ls)
-{
-	return isl_constraint_alloc(1, ls);
-}
-
-__isl_give isl_constraint *isl_inequality_alloc(__isl_take isl_local_space *ls)
-{
-	return isl_constraint_alloc(0, ls);
-}
-
-struct isl_constraint *isl_constraint_dup(struct isl_constraint *c)
-{
-	if (!c)
-		return NULL;
-
-	return isl_constraint_alloc_vec(c->eq, isl_local_space_copy(c->ls),
-						isl_vec_copy(c->v));
-}
-
-struct isl_constraint *isl_constraint_cow(struct isl_constraint *c)
-{
-	if (!c)
-		return NULL;
-
-	if (c->ref == 1)
-		return c;
-	c->ref--;
-	return isl_constraint_dup(c);
-}
-
-struct isl_constraint *isl_constraint_copy(struct isl_constraint *constraint)
-{
-	if (!constraint)
-		return NULL;
-
-	constraint->ref++;
-	return constraint;
-}
-
-void *isl_constraint_free(struct isl_constraint *c)
-{
-	if (!c)
-		return NULL;
-
-	if (--c->ref > 0)
-		return NULL;
-
-	isl_local_space_free(c->ls);
-	isl_vec_free(c->v);
-	free(c);
-
-	return NULL;
-}
-
-int isl_basic_map_foreach_constraint(__isl_keep isl_basic_map *bmap,
-	int (*fn)(__isl_take isl_constraint *c, void *user), void *user)
-{
-	int i;
-	struct isl_constraint *c;
-
-	if (!bmap)
-		return -1;
-
-	isl_assert(bmap->ctx, ISL_F_ISSET(bmap, ISL_BASIC_MAP_FINAL),
-			return -1);
-
-	for (i = 0; i < bmap->n_eq; ++i) {
-		c = isl_basic_map_constraint(isl_basic_map_copy(bmap),
-						&bmap->eq[i]);
-		if (!c)
-			return -1;
-		if (fn(c, user) < 0)
-			return -1;
-	}
-
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		c = isl_basic_map_constraint(isl_basic_map_copy(bmap),
-						&bmap->ineq[i]);
-		if (!c)
-			return -1;
-		if (fn(c, user) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-int isl_basic_set_foreach_constraint(__isl_keep isl_basic_set *bset,
-	int (*fn)(__isl_take isl_constraint *c, void *user), void *user)
-{
-	return isl_basic_map_foreach_constraint((isl_basic_map *)bset, fn, user);
-}
-
-int isl_constraint_is_equal(struct isl_constraint *constraint1,
-	struct isl_constraint *constraint2)
-{
-	int equal;
-
-	if (!constraint1 || !constraint2)
-		return 0;
-	if (constraint1->eq != constraint2->eq)
-		return 0;
-	equal = isl_local_space_is_equal(constraint1->ls, constraint2->ls);
-	if (equal < 0 || !equal)
-		return equal;
-	return isl_vec_is_equal(constraint1->v, constraint2->v);
-}
-
-struct isl_basic_map *isl_basic_map_add_constraint(
-	struct isl_basic_map *bmap, struct isl_constraint *constraint)
-{
-	isl_ctx *ctx;
-	isl_space *dim;
-	int equal_space;
-
-	if (!bmap || !constraint)
-		goto error;
-
-	ctx = isl_constraint_get_ctx(constraint);
-	dim = isl_constraint_get_space(constraint);
-	equal_space = isl_space_is_equal(bmap->dim, dim);
-	isl_space_free(dim);
-	isl_assert(ctx, equal_space, goto error);
-
-	bmap = isl_basic_map_intersect(bmap,
-				isl_basic_map_from_constraint(constraint));
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	isl_constraint_free(constraint);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_add_constraint(
-	struct isl_basic_set *bset, struct isl_constraint *constraint)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_add_constraint((struct isl_basic_map *)bset,
-						constraint);
-}
-
-__isl_give isl_map *isl_map_add_constraint(__isl_take isl_map *map,
-	__isl_take isl_constraint *constraint)
-{
-	isl_basic_map *bmap;
-
-	bmap = isl_basic_map_from_constraint(constraint);
-	map = isl_map_intersect(map, isl_map_from_basic_map(bmap));
-
-	return map;
-}
-
-__isl_give isl_set *isl_set_add_constraint(__isl_take isl_set *set,
-	__isl_take isl_constraint *constraint)
-{
-	return isl_map_add_constraint(set, constraint);
-}
-
-__isl_give isl_space *isl_constraint_get_space(
-	__isl_keep isl_constraint *constraint)
-{
-	return constraint ? isl_local_space_get_space(constraint->ls) : NULL;
-}
-
-int isl_constraint_dim(struct isl_constraint *constraint,
-	enum isl_dim_type type)
-{
-	if (!constraint)
-		return -1;
-	return n(constraint, type);
-}
-
-int isl_constraint_involves_dims(__isl_keep isl_constraint *constraint,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-	isl_ctx *ctx;
-	int *active = NULL;
-	int involves = 0;
-
-	if (!constraint)
-		return -1;
-	if (n == 0)
-		return 0;
-
-	ctx = isl_constraint_get_ctx(constraint);
-	if (first + n > isl_constraint_dim(constraint, type))
-		isl_die(ctx, isl_error_invalid,
-			"range out of bounds", return -1);
-
-	active = isl_local_space_get_active(constraint->ls,
-					    constraint->v->el + 1);
-	if (!active)
-		goto error;
-
-	first += isl_local_space_offset(constraint->ls, type) - 1;
-	for (i = 0; i < n; ++i)
-		if (active[first + i]) {
-			involves = 1;
-			break;
-		}
-
-	free(active);
-
-	return involves;
-error:
-	free(active);
-	return -1;
-}
-
-const char *isl_constraint_get_dim_name(__isl_keep isl_constraint *constraint,
-	enum isl_dim_type type, unsigned pos)
-{
-	return constraint ?
-	    isl_local_space_get_dim_name(constraint->ls, type, pos) : NULL;
-}
-
-void isl_constraint_get_constant(struct isl_constraint *constraint, isl_int *v)
-{
-	if (!constraint)
-		return;
-	isl_int_set(*v, constraint->v->el[0]);
-}
-
-void isl_constraint_get_coefficient(struct isl_constraint *constraint,
-	enum isl_dim_type type, int pos, isl_int *v)
-{
-	if (!constraint)
-		return;
-
-	if (pos >= isl_local_space_dim(constraint->ls, type))
-		isl_die(constraint->v->ctx, isl_error_invalid,
-			"position out of bounds", return);
-
-	pos += isl_local_space_offset(constraint->ls, type);
-	isl_int_set(*v, constraint->v->el[pos]);
-}
-
-__isl_give isl_aff *isl_constraint_get_div(__isl_keep isl_constraint *constraint,
-	int pos)
-{
-	if (!constraint)
-		return NULL;
-
-	return isl_local_space_get_div(constraint->ls, pos);
-}
-
-__isl_give isl_constraint *isl_constraint_set_constant(
-	__isl_take isl_constraint *constraint, isl_int v)
-{
-	constraint = isl_constraint_cow(constraint);
-	if (!constraint)
-		return NULL;
-
-	constraint->v = isl_vec_cow(constraint->v);
-	if (!constraint->v)
-		return isl_constraint_free(constraint);
-
-	isl_int_set(constraint->v->el[0], v);
-	return constraint;
-}
-
-__isl_give isl_constraint *isl_constraint_set_constant_si(
-	__isl_take isl_constraint *constraint, int v)
-{
-	constraint = isl_constraint_cow(constraint);
-	if (!constraint)
-		return NULL;
-
-	constraint->v = isl_vec_cow(constraint->v);
-	if (!constraint->v)
-		return isl_constraint_free(constraint);
-
-	isl_int_set_si(constraint->v->el[0], v);
-	return constraint;
-}
-
-__isl_give isl_constraint *isl_constraint_set_coefficient(
-	__isl_take isl_constraint *constraint,
-	enum isl_dim_type type, int pos, isl_int v)
-{
-	constraint = isl_constraint_cow(constraint);
-	if (!constraint)
-		return NULL;
-
-	if (pos >= isl_local_space_dim(constraint->ls, type))
-		isl_die(constraint->v->ctx, isl_error_invalid,
-			"position out of bounds",
-			return isl_constraint_free(constraint));
-
-	constraint = isl_constraint_cow(constraint);
-	if (!constraint)
-		return NULL;
-
-	constraint->v = isl_vec_cow(constraint->v);
-	if (!constraint->v)
-		return isl_constraint_free(constraint);
-
-	pos += isl_local_space_offset(constraint->ls, type);
-	isl_int_set(constraint->v->el[pos], v);
-
-	return constraint;
-}
-
-__isl_give isl_constraint *isl_constraint_set_coefficient_si(
-	__isl_take isl_constraint *constraint,
-	enum isl_dim_type type, int pos, int v)
-{
-	constraint = isl_constraint_cow(constraint);
-	if (!constraint)
-		return NULL;
-
-	if (pos >= isl_local_space_dim(constraint->ls, type))
-		isl_die(constraint->v->ctx, isl_error_invalid,
-			"position out of bounds",
-			return isl_constraint_free(constraint));
-
-	constraint = isl_constraint_cow(constraint);
-	if (!constraint)
-		return NULL;
-
-	constraint->v = isl_vec_cow(constraint->v);
-	if (!constraint->v)
-		return isl_constraint_free(constraint);
-
-	pos += isl_local_space_offset(constraint->ls, type);
-	isl_int_set_si(constraint->v->el[pos], v);
-
-	return constraint;
-}
-
-/* Drop any constraint from "bset" that is identical to "constraint".
- * In particular, this means that the local spaces of "bset" and
- * "constraint" need to be the same.
- *
- * Since the given constraint may actually be a pointer into the bset,
- * we have to be careful not to reorder the constraints as the user
- * may be holding on to other constraints from the same bset.
- * This should be cleaned up when the internal representation of
- * isl_constraint is changed to use isl_aff.
- */
-__isl_give isl_basic_set *isl_basic_set_drop_constraint(
-	__isl_take isl_basic_set *bset, __isl_take isl_constraint *constraint)
-{
-	int i;
-	unsigned n;
-	isl_int **row;
-	unsigned total;
-	isl_local_space *ls1;
-	int equal;
-
-	if (!bset || !constraint)
-		goto error;
-
-	ls1 = isl_basic_set_get_local_space(bset);
-	equal = isl_local_space_is_equal(ls1, constraint->ls);
-	isl_local_space_free(ls1);
-	if (equal < 0)
-		goto error;
-	if (!equal) {
-		isl_constraint_free(constraint);
-		return bset;
-	}
-
-	if (isl_constraint_is_equality(constraint)) {
-		n = bset->n_eq;
-		row = bset->eq;
-	} else {
-		n = bset->n_ineq;
-		row = bset->ineq;
-	}
-
-	total = isl_constraint_dim(constraint, isl_dim_all);
-	for (i = 0; i < n; ++i)
-		if (isl_seq_eq(row[i], constraint->v->el, 1 + total))
-			isl_seq_clr(row[i], 1 + total);
-			
-	isl_constraint_free(constraint);
-	return bset;
-error:
-	isl_constraint_free(constraint);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-struct isl_constraint *isl_constraint_negate(struct isl_constraint *constraint)
-{
-	isl_ctx *ctx;
-
-	constraint = isl_constraint_cow(constraint);
-	if (!constraint)
-		return NULL;
-
-	ctx = isl_constraint_get_ctx(constraint);
-	if (isl_constraint_is_equality(constraint))
-		isl_die(ctx, isl_error_invalid, "cannot negate equality",
-			return isl_constraint_free(constraint));
-	constraint->v = isl_vec_neg(constraint->v);
-	constraint->v = isl_vec_cow(constraint->v);
-	if (!constraint->v)
-		return isl_constraint_free(constraint);
-	isl_int_sub_ui(constraint->v->el[0], constraint->v->el[0], 1);
-	return constraint;
-}
-
-int isl_constraint_is_equality(struct isl_constraint *constraint)
-{
-	if (!constraint)
-		return -1;
-	return constraint->eq;
-}
-
-int isl_constraint_is_div_constraint(__isl_keep isl_constraint *constraint)
-{
-	int i;
-	int n_div;
-
-	if (!constraint)
-		return -1;
-	if (isl_constraint_is_equality(constraint))
-		return 0;
-	n_div = isl_constraint_dim(constraint, isl_dim_div);
-	for (i = 0; i < n_div; ++i) {
-		if (isl_local_space_is_div_constraint(constraint->ls,
-							constraint->v->el, i))
-			return 1;
-	}
-
-	return 0;
-}
-
-/* We manually set ISL_BASIC_SET_FINAL instead of calling
- * isl_basic_map_finalize because we want to keep the position
- * of the divs and we therefore do not want to throw away redundant divs.
- * This is arguably a bit fragile.
- */
-__isl_give isl_basic_map *isl_basic_map_from_constraint(
-	__isl_take isl_constraint *constraint)
-{
-	int k;
-	isl_local_space *ls;
-	struct isl_basic_map *bmap;
-	isl_int *c;
-	unsigned total;
-
-	if (!constraint)
-		return NULL;
-
-	ls = isl_local_space_copy(constraint->ls);
-	bmap = isl_basic_map_from_local_space(ls);
-	bmap = isl_basic_map_extend_constraints(bmap, 1, 1);
-	if (isl_constraint_is_equality(constraint)) {
-		k = isl_basic_map_alloc_equality(bmap);
-		if (k < 0)
-			goto error;
-		c = bmap->eq[k];
-	}
-	else {
-		k = isl_basic_map_alloc_inequality(bmap);
-		if (k < 0)
-			goto error;
-		c = bmap->ineq[k];
-	}
-	total = isl_basic_map_total_dim(bmap);
-	isl_seq_cpy(c, constraint->v->el, 1 + total);
-	isl_constraint_free(constraint);
-	if (bmap)
-		ISL_F_SET(bmap, ISL_BASIC_SET_FINAL);
-	return bmap;
-error:
-	isl_constraint_free(constraint);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_from_constraint(
-	struct isl_constraint *constraint)
-{
-	if (!constraint)
-		return NULL;
-
-	if (isl_constraint_dim(constraint, isl_dim_in) != 0)
-		isl_die(isl_constraint_get_ctx(constraint), isl_error_invalid,
-			"not a set constraint",
-			return isl_constraint_free(constraint));
-	return (isl_basic_set *)isl_basic_map_from_constraint(constraint);
-}
-
-int isl_basic_map_has_defining_equality(
-	__isl_keep isl_basic_map *bmap, enum isl_dim_type type, int pos,
-	__isl_give isl_constraint **c)
-{
-	int i;
-	unsigned offset;
-	unsigned total;
-
-	if (!bmap)
-		return -1;
-	offset = basic_map_offset(bmap, type);
-	total = isl_basic_map_total_dim(bmap);
-	isl_assert(bmap->ctx, pos < isl_basic_map_dim(bmap, type), return -1);
-	for (i = 0; i < bmap->n_eq; ++i)
-		if (!isl_int_is_zero(bmap->eq[i][offset + pos]) &&
-		    isl_seq_first_non_zero(bmap->eq[i]+offset+pos+1,
-					   1+total-offset-pos-1) == -1) {
-			*c = isl_basic_map_constraint(isl_basic_map_copy(bmap),
-								&bmap->eq[i]);
-			return 1;
-		}
-	return 0;
-}
-
-int isl_basic_set_has_defining_equality(
-	__isl_keep isl_basic_set *bset, enum isl_dim_type type, int pos,
-	__isl_give isl_constraint **c)
-{
-	return isl_basic_map_has_defining_equality((isl_basic_map *)bset,
-						    type, pos, c);
-}
-
-int isl_basic_set_has_defining_inequalities(
-	struct isl_basic_set *bset, enum isl_dim_type type, int pos,
-	struct isl_constraint **lower,
-	struct isl_constraint **upper)
-{
-	int i, j;
-	unsigned offset;
-	unsigned total;
-	isl_int m;
-	isl_int **lower_line, **upper_line;
-
-	if (!bset)
-		return -1;
-	offset = basic_set_offset(bset, type);
-	total = isl_basic_set_total_dim(bset);
-	isl_assert(bset->ctx, pos < isl_basic_set_dim(bset, type), return -1);
-	isl_int_init(m);
-	for (i = 0; i < bset->n_ineq; ++i) {
-		if (isl_int_is_zero(bset->ineq[i][offset + pos]))
-			continue;
-		if (isl_int_is_one(bset->ineq[i][offset + pos]))
-			continue;
-		if (isl_int_is_negone(bset->ineq[i][offset + pos]))
-			continue;
-		if (isl_seq_first_non_zero(bset->ineq[i]+offset+pos+1,
-						1+total-offset-pos-1) != -1)
-			continue;
-		for (j = i + 1; j < bset->n_ineq; ++j) {
-			if (!isl_seq_is_neg(bset->ineq[i]+1, bset->ineq[j]+1,
-					    total))
-				continue;
-			isl_int_add(m, bset->ineq[i][0], bset->ineq[j][0]);
-			if (isl_int_abs_ge(m, bset->ineq[i][offset+pos]))
-				continue;
-
-			if (isl_int_is_pos(bset->ineq[i][offset+pos])) {
-				lower_line = &bset->ineq[i];
-				upper_line = &bset->ineq[j];
-			} else {
-				lower_line = &bset->ineq[j];
-				upper_line = &bset->ineq[i];
-			}
-			*lower = isl_basic_set_constraint(
-					isl_basic_set_copy(bset), lower_line);
-			*upper = isl_basic_set_constraint(
-					isl_basic_set_copy(bset), upper_line);
-			isl_int_clear(m);
-			return 1;
-		}
-	}
-	*lower = NULL;
-	*upper = NULL;
-	isl_int_clear(m);
-	return 0;
-}
-
-/* Given two constraints "a" and "b" on the variable at position "abs_pos"
- * (in "a" and "b"), add a constraint to "bset" that ensures that the
- * bound implied by "a" is (strictly) larger than the bound implied by "b".
- *
- * If both constraints imply lower bounds, then this means that "a" is
- * active in the result.
- * If both constraints imply upper bounds, then this means that "b" is
- * active in the result.
- */
-static __isl_give isl_basic_set *add_larger_bound_constraint(
-	__isl_take isl_basic_set *bset, isl_int *a, isl_int *b,
-	unsigned abs_pos, int strict)
-{
-	int k;
-	isl_int t;
-	unsigned total;
-
-	k = isl_basic_set_alloc_inequality(bset);
-	if (k < 0)
-		goto error;
-
-	total = isl_basic_set_dim(bset, isl_dim_all);
-
-	isl_int_init(t);
-	isl_int_neg(t, b[1 + abs_pos]);
-
-	isl_seq_combine(bset->ineq[k], t, a, a[1 + abs_pos], b, 1 + abs_pos);
-	isl_seq_combine(bset->ineq[k] + 1 + abs_pos,
-		t, a + 1 + abs_pos + 1, a[1 + abs_pos], b + 1 + abs_pos + 1,
-		total - abs_pos);
-
-	if (strict)
-		isl_int_sub_ui(bset->ineq[k][0], bset->ineq[k][0], 1);
-
-	isl_int_clear(t);
-
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Add constraints to "context" that ensure that "u" is the smallest
- * (and therefore active) upper bound on "abs_pos" in "bset" and return
- * the resulting basic set.
- */
-static __isl_give isl_basic_set *set_smallest_upper_bound(
-	__isl_keep isl_basic_set *context,
-	__isl_keep isl_basic_set *bset, unsigned abs_pos, int n_upper, int u)
-{
-	int j;
-
-	context = isl_basic_set_copy(context);
-	context = isl_basic_set_cow(context);
-
-	context = isl_basic_set_extend_constraints(context, 0, n_upper - 1);
-
-	for (j = 0; j < bset->n_ineq; ++j) {
-		if (j == u)
-			continue;
-		if (!isl_int_is_neg(bset->ineq[j][1 + abs_pos]))
-			continue;
-		context = add_larger_bound_constraint(context,
-			bset->ineq[j], bset->ineq[u], abs_pos, j > u);
-	}
-
-	context = isl_basic_set_simplify(context);
-	context = isl_basic_set_finalize(context);
-
-	return context;
-}
-
-/* Add constraints to "context" that ensure that "u" is the largest
- * (and therefore active) upper bound on "abs_pos" in "bset" and return
- * the resulting basic set.
- */
-static __isl_give isl_basic_set *set_largest_lower_bound(
-	__isl_keep isl_basic_set *context,
-	__isl_keep isl_basic_set *bset, unsigned abs_pos, int n_lower, int l)
-{
-	int j;
-
-	context = isl_basic_set_copy(context);
-	context = isl_basic_set_cow(context);
-
-	context = isl_basic_set_extend_constraints(context, 0, n_lower - 1);
-
-	for (j = 0; j < bset->n_ineq; ++j) {
-		if (j == l)
-			continue;
-		if (!isl_int_is_pos(bset->ineq[j][1 + abs_pos]))
-			continue;
-		context = add_larger_bound_constraint(context,
-			bset->ineq[l], bset->ineq[j], abs_pos, j > l);
-	}
-
-	context = isl_basic_set_simplify(context);
-	context = isl_basic_set_finalize(context);
-
-	return context;
-}
-
-static int foreach_upper_bound(__isl_keep isl_basic_set *bset,
-	enum isl_dim_type type, unsigned abs_pos,
-	__isl_take isl_basic_set *context, int n_upper,
-	int (*fn)(__isl_take isl_constraint *lower,
-		  __isl_take isl_constraint *upper,
-		  __isl_take isl_basic_set *bset, void *user), void *user)
-{
-	isl_basic_set *context_i;
-	isl_constraint *upper = NULL;
-	int i;
-
-	for (i = 0; i < bset->n_ineq; ++i) {
-		if (isl_int_is_zero(bset->ineq[i][1 + abs_pos]))
-			continue;
-
-		context_i = set_smallest_upper_bound(context, bset,
-							abs_pos, n_upper, i);
-		if (isl_basic_set_is_empty(context_i)) {
-			isl_basic_set_free(context_i);
-			continue;
-		}
-		upper = isl_basic_set_constraint(isl_basic_set_copy(bset),
-						&bset->ineq[i]);
-		if (!upper || !context_i)
-			goto error;
-		if (fn(NULL, upper, context_i, user) < 0)
-			break;
-	}
-
-	isl_basic_set_free(context);
-
-	if (i < bset->n_ineq)
-		return -1;
-
-	return 0;
-error:
-	isl_constraint_free(upper);
-	isl_basic_set_free(context_i);
-	isl_basic_set_free(context);
-	return -1;
-}
-
-static int foreach_lower_bound(__isl_keep isl_basic_set *bset,
-	enum isl_dim_type type, unsigned abs_pos,
-	__isl_take isl_basic_set *context, int n_lower,
-	int (*fn)(__isl_take isl_constraint *lower,
-		  __isl_take isl_constraint *upper,
-		  __isl_take isl_basic_set *bset, void *user), void *user)
-{
-	isl_basic_set *context_i;
-	isl_constraint *lower = NULL;
-	int i;
-
-	for (i = 0; i < bset->n_ineq; ++i) {
-		if (isl_int_is_zero(bset->ineq[i][1 + abs_pos]))
-			continue;
-
-		context_i = set_largest_lower_bound(context, bset,
-							abs_pos, n_lower, i);
-		if (isl_basic_set_is_empty(context_i)) {
-			isl_basic_set_free(context_i);
-			continue;
-		}
-		lower = isl_basic_set_constraint(isl_basic_set_copy(bset),
-						&bset->ineq[i]);
-		if (!lower || !context_i)
-			goto error;
-		if (fn(lower, NULL, context_i, user) < 0)
-			break;
-	}
-
-	isl_basic_set_free(context);
-
-	if (i < bset->n_ineq)
-		return -1;
-
-	return 0;
-error:
-	isl_constraint_free(lower);
-	isl_basic_set_free(context_i);
-	isl_basic_set_free(context);
-	return -1;
-}
-
-static int foreach_bound_pair(__isl_keep isl_basic_set *bset,
-	enum isl_dim_type type, unsigned abs_pos,
-	__isl_take isl_basic_set *context, int n_lower, int n_upper,
-	int (*fn)(__isl_take isl_constraint *lower,
-		  __isl_take isl_constraint *upper,
-		  __isl_take isl_basic_set *bset, void *user), void *user)
-{
-	isl_basic_set *context_i, *context_j;
-	isl_constraint *lower = NULL;
-	isl_constraint *upper = NULL;
-	int i, j;
-
-	for (i = 0; i < bset->n_ineq; ++i) {
-		if (!isl_int_is_pos(bset->ineq[i][1 + abs_pos]))
-			continue;
-
-		context_i = set_largest_lower_bound(context, bset,
-							abs_pos, n_lower, i);
-		if (isl_basic_set_is_empty(context_i)) {
-			isl_basic_set_free(context_i);
-			continue;
-		}
-
-		for (j = 0; j < bset->n_ineq; ++j) {
-			if (!isl_int_is_neg(bset->ineq[j][1 + abs_pos]))
-				continue;
-
-			context_j = set_smallest_upper_bound(context_i, bset,
-							    abs_pos, n_upper, j);
-			context_j = isl_basic_set_extend_constraints(context_j,
-									0, 1);
-			context_j = add_larger_bound_constraint(context_j,
-				bset->ineq[i], bset->ineq[j], abs_pos, 0);
-			context_j = isl_basic_set_simplify(context_j);
-			context_j = isl_basic_set_finalize(context_j);
-			if (isl_basic_set_is_empty(context_j)) {
-				isl_basic_set_free(context_j);
-				continue;
-			}
-			lower = isl_basic_set_constraint(isl_basic_set_copy(bset),
-							&bset->ineq[i]);
-			upper = isl_basic_set_constraint(isl_basic_set_copy(bset),
-							&bset->ineq[j]);
-			if (!lower || !upper || !context_j)
-				goto error;
-			if (fn(lower, upper, context_j, user) < 0)
-				break;
-		}
-
-		isl_basic_set_free(context_i);
-
-		if (j < bset->n_ineq)
-			break;
-	}
-
-	isl_basic_set_free(context);
-
-	if (i < bset->n_ineq)
-		return -1;
-
-	return 0;
-error:
-	isl_constraint_free(lower);
-	isl_constraint_free(upper);
-	isl_basic_set_free(context_i);
-	isl_basic_set_free(context_j);
-	isl_basic_set_free(context);
-	return -1;
-}
-
-/* For each pair of lower and upper bounds on the variable "pos"
- * of type "type", call "fn" with these lower and upper bounds and the
- * set of constraints on the remaining variables where these bounds
- * are active, i.e., (stricly) larger/smaller than the other lower/upper bounds.
- *
- * If the designated variable is equal to an affine combination of the
- * other variables then fn is called with both lower and upper
- * set to the corresponding equality.
- *
- * If there is no lower (or upper) bound, then NULL is passed
- * as the corresponding bound.
- *
- * We first check if the variable is involved in any equality.
- * If not, we count the number of lower and upper bounds and
- * act accordingly.
- */
-int isl_basic_set_foreach_bound_pair(__isl_keep isl_basic_set *bset,
-	enum isl_dim_type type, unsigned pos,
-	int (*fn)(__isl_take isl_constraint *lower,
-		  __isl_take isl_constraint *upper,
-		  __isl_take isl_basic_set *bset, void *user), void *user)
-{
-	int i;
-	isl_constraint *lower = NULL;
-	isl_constraint *upper = NULL;
-	isl_basic_set *context = NULL;
-	unsigned abs_pos;
-	int n_lower, n_upper;
-
-	if (!bset)
-		return -1;
-	isl_assert(bset->ctx, pos < isl_basic_set_dim(bset, type), return -1);
-	isl_assert(bset->ctx, type == isl_dim_param || type == isl_dim_set,
-		return -1);
-
-	abs_pos = pos;
-	if (type == isl_dim_set)
-		abs_pos += isl_basic_set_dim(bset, isl_dim_param);
-
-	for (i = 0; i < bset->n_eq; ++i) {
-		if (isl_int_is_zero(bset->eq[i][1 + abs_pos]))
-			continue;
-
-		lower = isl_basic_set_constraint(isl_basic_set_copy(bset),
-						&bset->eq[i]);
-		upper = isl_constraint_copy(lower);
-		context = isl_basic_set_remove_dims(isl_basic_set_copy(bset),
-					type, pos, 1);
-		if (!lower || !upper || !context)
-			goto error;
-		return fn(lower, upper, context, user);
-	}
-
-	n_lower = 0;
-	n_upper = 0;
-	for (i = 0; i < bset->n_ineq; ++i) {
-		if (isl_int_is_pos(bset->ineq[i][1 + abs_pos]))
-			n_lower++;
-		else if (isl_int_is_neg(bset->ineq[i][1 + abs_pos]))
-			n_upper++;
-	}
-
-	context = isl_basic_set_copy(bset);
-	context = isl_basic_set_cow(context);
-	if (!context)
-		goto error;
-	for (i = context->n_ineq - 1; i >= 0; --i)
-		if (!isl_int_is_zero(context->ineq[i][1 + abs_pos]))
-			isl_basic_set_drop_inequality(context, i);
-
-	context = isl_basic_set_drop(context, type, pos, 1);
-	if (!n_lower && !n_upper)
-		return fn(NULL, NULL, context, user);
-	if (!n_lower)
-		return foreach_upper_bound(bset, type, abs_pos, context, n_upper,
-						fn, user);
-	if (!n_upper)
-		return foreach_lower_bound(bset, type, abs_pos, context, n_lower,
-						fn, user);
-	return foreach_bound_pair(bset, type, abs_pos, context, n_lower, n_upper,
-					fn, user);
-error:
-	isl_constraint_free(lower);
-	isl_constraint_free(upper);
-	isl_basic_set_free(context);
-	return -1;
-}
-
-__isl_give isl_aff *isl_constraint_get_bound(
-	__isl_keep isl_constraint *constraint, enum isl_dim_type type, int pos)
-{
-	isl_aff *aff;
-	isl_ctx *ctx;
-
-	if (!constraint)
-		return NULL;
-	ctx = isl_constraint_get_ctx(constraint);
-	if (pos >= isl_constraint_dim(constraint, type))
-		isl_die(ctx, isl_error_invalid,
-			"index out of bounds", return NULL);
-	if (isl_constraint_dim(constraint, isl_dim_in) != 0)
-		isl_die(ctx, isl_error_invalid,
-			"not a set constraint", return NULL);
-
-	pos += offset(constraint, type);
-	if (isl_int_is_zero(constraint->v->el[pos]))
-		isl_die(ctx, isl_error_invalid,
-			"constraint does not define a bound on given dimension",
-			return NULL);
-
-	aff = isl_aff_alloc(isl_local_space_copy(constraint->ls));
-	if (!aff)
-		return NULL;
-
-	if (isl_int_is_neg(constraint->v->el[pos]))
-		isl_seq_cpy(aff->v->el + 1, constraint->v->el, aff->v->size - 1);
-	else
-		isl_seq_neg(aff->v->el + 1, constraint->v->el, aff->v->size - 1);
-	isl_int_set_si(aff->v->el[1 + pos], 0);
-	isl_int_abs(aff->v->el[0], constraint->v->el[pos]);
-
-	return aff;
-}
-
-/* For an inequality constraint
- *
- *	f >= 0
- *
- * or an equality constraint
- *
- *	f = 0
- *
- * return the affine expression f.
- */
-__isl_give isl_aff *isl_constraint_get_aff(
-	__isl_keep isl_constraint *constraint)
-{
-	isl_aff *aff;
-
-	if (!constraint)
-		return NULL;
-
-	aff = isl_aff_alloc(isl_local_space_copy(constraint->ls));
-	if (!aff)
-		return NULL;
-
-	isl_seq_cpy(aff->v->el + 1, constraint->v->el, aff->v->size - 1);
-	isl_int_set_si(aff->v->el[0], 1);
-
-	return aff;
-}
-
-/* Construct an equality constraint equating the given affine expression
- * to zero.
- */
-__isl_give isl_constraint *isl_equality_from_aff(__isl_take isl_aff *aff)
-{
-	int k;
-	isl_local_space *ls;
-	isl_basic_set *bset;
-
-	if (!aff)
-		return NULL;
-
-	ls = isl_aff_get_domain_local_space(aff);
-	bset = isl_basic_set_from_local_space(ls);
-	bset = isl_basic_set_extend_constraints(bset, 1, 0);
-	k = isl_basic_set_alloc_equality(bset);
-	if (k < 0)
-		goto error;
-
-	isl_seq_cpy(bset->eq[k], aff->v->el + 1, aff->v->size - 1);
-	isl_aff_free(aff);
-
-	return isl_basic_set_constraint(bset, &bset->eq[k]);
-error:
-	isl_aff_free(aff);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Construct an inequality constraint enforcing the given affine expression
- * to be non-negative.
- */
-__isl_give isl_constraint *isl_inequality_from_aff(__isl_take isl_aff *aff)
-{
-	int k;
-	isl_local_space *ls;
-	isl_basic_set *bset;
-
-	if (!aff)
-		return NULL;
-
-	ls = isl_aff_get_domain_local_space(aff);
-	bset = isl_basic_set_from_local_space(ls);
-	bset = isl_basic_set_extend_constraints(bset, 0, 1);
-	k = isl_basic_set_alloc_inequality(bset);
-	if (k < 0)
-		goto error;
-
-	isl_seq_cpy(bset->ineq[k], aff->v->el + 1, aff->v->size - 1);
-	isl_aff_free(aff);
-
-	return isl_basic_set_constraint(bset, &bset->ineq[k]);
-error:
-	isl_aff_free(aff);
-	isl_basic_set_free(bset);
-	return NULL;
-}
diff --git a/cloog-0.17.0/isl/isl_constraint_private.h b/cloog-0.17.0/isl/isl_constraint_private.h
deleted file mode 100644
index 8314325..0000000
--- a/cloog-0.17.0/isl/isl_constraint_private.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef ISL_CONSTRAINT_PRIVATE_H
-#define ISL_CONSTRAINT_PRIVATE_H
-
-#include <isl/aff.h>
-#include <isl/constraint.h>
-
-struct isl_constraint {
-	int ref;
-
-	int eq;
-	isl_local_space	*ls;
-	isl_vec		*v;
-};
-
-struct isl_constraint *isl_basic_set_constraint(struct isl_basic_set *bset,
-	isl_int **line);
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_convex_hull.c b/cloog-0.17.0/isl/isl_convex_hull.c
deleted file mode 100644
index a6e26b8..0000000
--- a/cloog-0.17.0/isl/isl_convex_hull.c
+++ /dev/null
@@ -1,2432 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl/lp.h>
-#include <isl/map.h>
-#include <isl_mat_private.h>
-#include <isl/set.h>
-#include <isl/seq.h>
-#include <isl_options_private.h>
-#include "isl_equalities.h"
-#include "isl_tab.h"
-
-static struct isl_basic_set *uset_convex_hull_wrap_bounded(struct isl_set *set);
-
-/* Return 1 if constraint c is redundant with respect to the constraints
- * in bmap.  If c is a lower [upper] bound in some variable and bmap
- * does not have a lower [upper] bound in that variable, then c cannot
- * be redundant and we do not need solve any lp.
- */
-int isl_basic_map_constraint_is_redundant(struct isl_basic_map **bmap,
-	isl_int *c, isl_int *opt_n, isl_int *opt_d)
-{
-	enum isl_lp_result res;
-	unsigned total;
-	int i, j;
-
-	if (!bmap)
-		return -1;
-
-	total = isl_basic_map_total_dim(*bmap);
-	for (i = 0; i < total; ++i) {
-		int sign;
-		if (isl_int_is_zero(c[1+i]))
-			continue;
-		sign = isl_int_sgn(c[1+i]);
-		for (j = 0; j < (*bmap)->n_ineq; ++j)
-			if (sign == isl_int_sgn((*bmap)->ineq[j][1+i]))
-				break;
-		if (j == (*bmap)->n_ineq)
-			break;
-	}
-	if (i < total)
-		return 0;
-
-	res = isl_basic_map_solve_lp(*bmap, 0, c, (*bmap)->ctx->one,
-					opt_n, opt_d, NULL);
-	if (res == isl_lp_unbounded)
-		return 0;
-	if (res == isl_lp_error)
-		return -1;
-	if (res == isl_lp_empty) {
-		*bmap = isl_basic_map_set_to_empty(*bmap);
-		return 0;
-	}
-	return !isl_int_is_neg(*opt_n);
-}
-
-int isl_basic_set_constraint_is_redundant(struct isl_basic_set **bset,
-	isl_int *c, isl_int *opt_n, isl_int *opt_d)
-{
-	return isl_basic_map_constraint_is_redundant(
-			(struct isl_basic_map **)bset, c, opt_n, opt_d);
-}
-
-/* Remove redundant
- * constraints.  If the minimal value along the normal of a constraint
- * is the same if the constraint is removed, then the constraint is redundant.
- *
- * Alternatively, we could have intersected the basic map with the
- * corresponding equality and the checked if the dimension was that
- * of a facet.
- */
-__isl_give isl_basic_map *isl_basic_map_remove_redundancies(
-	__isl_take isl_basic_map *bmap)
-{
-	struct isl_tab *tab;
-
-	if (!bmap)
-		return NULL;
-
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY))
-		return bmap;
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_NO_REDUNDANT))
-		return bmap;
-	if (bmap->n_ineq <= 1)
-		return bmap;
-
-	tab = isl_tab_from_basic_map(bmap);
-	if (isl_tab_detect_implicit_equalities(tab) < 0)
-		goto error;
-	if (isl_tab_detect_redundant(tab) < 0)
-		goto error;
-	bmap = isl_basic_map_update_from_tab(bmap, tab);
-	isl_tab_free(tab);
-	ISL_F_SET(bmap, ISL_BASIC_MAP_NO_IMPLICIT);
-	ISL_F_SET(bmap, ISL_BASIC_MAP_NO_REDUNDANT);
-	return bmap;
-error:
-	isl_tab_free(tab);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_remove_redundancies(
-	__isl_take isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_remove_redundancies((struct isl_basic_map *)bset);
-}
-
-/* Remove redundant constraints in each of the basic maps.
- */
-__isl_give isl_map *isl_map_remove_redundancies(__isl_take isl_map *map)
-{
-	return isl_map_inline_foreach_basic_map(map,
-					    &isl_basic_map_remove_redundancies);
-}
-
-__isl_give isl_set *isl_set_remove_redundancies(__isl_take isl_set *set)
-{
-	return isl_map_remove_redundancies(set);
-}
-
-/* Check if the set set is bound in the direction of the affine
- * constraint c and if so, set the constant term such that the
- * resulting constraint is a bounding constraint for the set.
- */
-static int uset_is_bound(struct isl_set *set, isl_int *c, unsigned len)
-{
-	int first;
-	int j;
-	isl_int opt;
-	isl_int opt_denom;
-
-	isl_int_init(opt);
-	isl_int_init(opt_denom);
-	first = 1;
-	for (j = 0; j < set->n; ++j) {
-		enum isl_lp_result res;
-
-		if (ISL_F_ISSET(set->p[j], ISL_BASIC_SET_EMPTY))
-			continue;
-
-		res = isl_basic_set_solve_lp(set->p[j],
-				0, c, set->ctx->one, &opt, &opt_denom, NULL);
-		if (res == isl_lp_unbounded)
-			break;
-		if (res == isl_lp_error)
-			goto error;
-		if (res == isl_lp_empty) {
-			set->p[j] = isl_basic_set_set_to_empty(set->p[j]);
-			if (!set->p[j])
-				goto error;
-			continue;
-		}
-		if (first || isl_int_is_neg(opt)) {
-			if (!isl_int_is_one(opt_denom))
-				isl_seq_scale(c, c, opt_denom, len);
-			isl_int_sub(c[0], c[0], opt);
-		}
-		first = 0;
-	}
-	isl_int_clear(opt);
-	isl_int_clear(opt_denom);
-	return j >= set->n;
-error:
-	isl_int_clear(opt);
-	isl_int_clear(opt_denom);
-	return -1;
-}
-
-__isl_give isl_basic_map *isl_basic_map_set_rational(
-	__isl_take isl_basic_set *bmap)
-{
-	if (!bmap)
-		return NULL;
-
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL))
-		return bmap;
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-
-	ISL_F_SET(bmap, ISL_BASIC_MAP_RATIONAL);
-
-	return isl_basic_map_finalize(bmap);
-}
-
-__isl_give isl_basic_set *isl_basic_set_set_rational(
-	__isl_take isl_basic_set *bset)
-{
-	return isl_basic_map_set_rational(bset);
-}
-
-__isl_give isl_map *isl_map_set_rational(__isl_take isl_map *map)
-{
-	int i;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_set_rational(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_set_rational(__isl_take isl_set *set)
-{
-	return isl_map_set_rational(set);
-}
-
-static struct isl_basic_set *isl_basic_set_add_equality(
-	struct isl_basic_set *bset, isl_int *c)
-{
-	int i;
-	unsigned dim;
-
-	if (!bset)
-		return NULL;
-
-	if (ISL_F_ISSET(bset, ISL_BASIC_SET_EMPTY))
-		return bset;
-
-	isl_assert(bset->ctx, isl_basic_set_n_param(bset) == 0, goto error);
-	isl_assert(bset->ctx, bset->n_div == 0, goto error);
-	dim = isl_basic_set_n_dim(bset);
-	bset = isl_basic_set_cow(bset);
-	bset = isl_basic_set_extend(bset, 0, dim, 0, 1, 0);
-	i = isl_basic_set_alloc_equality(bset);
-	if (i < 0)
-		goto error;
-	isl_seq_cpy(bset->eq[i], c, 1 + dim);
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-static struct isl_set *isl_set_add_basic_set_equality(struct isl_set *set, isl_int *c)
-{
-	int i;
-
-	set = isl_set_cow(set);
-	if (!set)
-		return NULL;
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_basic_set_add_equality(set->p[i], c);
-		if (!set->p[i])
-			goto error;
-	}
-	return set;
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-/* Given a union of basic sets, construct the constraints for wrapping
- * a facet around one of its ridges.
- * In particular, if each of n the d-dimensional basic sets i in "set"
- * contains the origin, satisfies the constraints x_1 >= 0 and x_2 >= 0
- * and is defined by the constraints
- *				    [ 1 ]
- *				A_i [ x ]  >= 0
- *
- * then the resulting set is of dimension n*(1+d) and has as constraints
- *
- *				    [ a_i ]
- *				A_i [ x_i ] >= 0
- *
- *				      a_i   >= 0
- *
- *			\sum_i x_{i,1} = 1
- */
-static struct isl_basic_set *wrap_constraints(struct isl_set *set)
-{
-	struct isl_basic_set *lp;
-	unsigned n_eq;
-	unsigned n_ineq;
-	int i, j, k;
-	unsigned dim, lp_dim;
-
-	if (!set)
-		return NULL;
-
-	dim = 1 + isl_set_n_dim(set);
-	n_eq = 1;
-	n_ineq = set->n;
-	for (i = 0; i < set->n; ++i) {
-		n_eq += set->p[i]->n_eq;
-		n_ineq += set->p[i]->n_ineq;
-	}
-	lp = isl_basic_set_alloc(set->ctx, 0, dim * set->n, 0, n_eq, n_ineq);
-	lp = isl_basic_set_set_rational(lp);
-	if (!lp)
-		return NULL;
-	lp_dim = isl_basic_set_n_dim(lp);
-	k = isl_basic_set_alloc_equality(lp);
-	isl_int_set_si(lp->eq[k][0], -1);
-	for (i = 0; i < set->n; ++i) {
-		isl_int_set_si(lp->eq[k][1+dim*i], 0);
-		isl_int_set_si(lp->eq[k][1+dim*i+1], 1);
-		isl_seq_clr(lp->eq[k]+1+dim*i+2, dim-2);
-	}
-	for (i = 0; i < set->n; ++i) {
-		k = isl_basic_set_alloc_inequality(lp);
-		isl_seq_clr(lp->ineq[k], 1+lp_dim);
-		isl_int_set_si(lp->ineq[k][1+dim*i], 1);
-
-		for (j = 0; j < set->p[i]->n_eq; ++j) {
-			k = isl_basic_set_alloc_equality(lp);
-			isl_seq_clr(lp->eq[k], 1+dim*i);
-			isl_seq_cpy(lp->eq[k]+1+dim*i, set->p[i]->eq[j], dim);
-			isl_seq_clr(lp->eq[k]+1+dim*(i+1), dim*(set->n-i-1));
-		}
-
-		for (j = 0; j < set->p[i]->n_ineq; ++j) {
-			k = isl_basic_set_alloc_inequality(lp);
-			isl_seq_clr(lp->ineq[k], 1+dim*i);
-			isl_seq_cpy(lp->ineq[k]+1+dim*i, set->p[i]->ineq[j], dim);
-			isl_seq_clr(lp->ineq[k]+1+dim*(i+1), dim*(set->n-i-1));
-		}
-	}
-	return lp;
-}
-
-/* Given a facet "facet" of the convex hull of "set" and a facet "ridge"
- * of that facet, compute the other facet of the convex hull that contains
- * the ridge.
- *
- * We first transform the set such that the facet constraint becomes
- *
- *			x_1 >= 0
- *
- * I.e., the facet lies in
- *
- *			x_1 = 0
- *
- * and on that facet, the constraint that defines the ridge is
- *
- *			x_2 >= 0
- *
- * (This transformation is not strictly needed, all that is needed is
- * that the ridge contains the origin.)
- *
- * Since the ridge contains the origin, the cone of the convex hull
- * will be of the form
- *
- *			x_1 >= 0
- *			x_2 >= a x_1
- *
- * with this second constraint defining the new facet.
- * The constant a is obtained by settting x_1 in the cone of the
- * convex hull to 1 and minimizing x_2.
- * Now, each element in the cone of the convex hull is the sum
- * of elements in the cones of the basic sets.
- * If a_i is the dilation factor of basic set i, then the problem
- * we need to solve is
- *
- *			min \sum_i x_{i,2}
- *			st
- *				\sum_i x_{i,1} = 1
- *				    a_i   >= 0
- *				  [ a_i ]
- *				A [ x_i ] >= 0
- *
- * with
- *				    [  1  ]
- *				A_i [ x_i ] >= 0
- *
- * the constraints of each (transformed) basic set.
- * If a = n/d, then the constraint defining the new facet (in the transformed
- * space) is
- *
- *			-n x_1 + d x_2 >= 0
- *
- * In the original space, we need to take the same combination of the
- * corresponding constraints "facet" and "ridge".
- *
- * If a = -infty = "-1/0", then we just return the original facet constraint.
- * This means that the facet is unbounded, but has a bounded intersection
- * with the union of sets.
- */
-isl_int *isl_set_wrap_facet(__isl_keep isl_set *set,
-	isl_int *facet, isl_int *ridge)
-{
-	int i;
-	isl_ctx *ctx;
-	struct isl_mat *T = NULL;
-	struct isl_basic_set *lp = NULL;
-	struct isl_vec *obj;
-	enum isl_lp_result res;
-	isl_int num, den;
-	unsigned dim;
-
-	if (!set)
-		return NULL;
-	ctx = set->ctx;
-	set = isl_set_copy(set);
-	set = isl_set_set_rational(set);
-
-	dim = 1 + isl_set_n_dim(set);
-	T = isl_mat_alloc(ctx, 3, dim);
-	if (!T)
-		goto error;
-	isl_int_set_si(T->row[0][0], 1);
-	isl_seq_clr(T->row[0]+1, dim - 1);
-	isl_seq_cpy(T->row[1], facet, dim);
-	isl_seq_cpy(T->row[2], ridge, dim);
-	T = isl_mat_right_inverse(T);
-	set = isl_set_preimage(set, T);
-	T = NULL;
-	if (!set)
-		goto error;
-	lp = wrap_constraints(set);
-	obj = isl_vec_alloc(ctx, 1 + dim*set->n);
-	if (!obj)
-		goto error;
-	isl_int_set_si(obj->block.data[0], 0);
-	for (i = 0; i < set->n; ++i) {
-		isl_seq_clr(obj->block.data + 1 + dim*i, 2);
-		isl_int_set_si(obj->block.data[1 + dim*i+2], 1);
-		isl_seq_clr(obj->block.data + 1 + dim*i+3, dim-3);
-	}
-	isl_int_init(num);
-	isl_int_init(den);
-	res = isl_basic_set_solve_lp(lp, 0,
-			    obj->block.data, ctx->one, &num, &den, NULL);
-	if (res == isl_lp_ok) {
-		isl_int_neg(num, num);
-		isl_seq_combine(facet, num, facet, den, ridge, dim);
-		isl_seq_normalize(ctx, facet, dim);
-	}
-	isl_int_clear(num);
-	isl_int_clear(den);
-	isl_vec_free(obj);
-	isl_basic_set_free(lp);
-	isl_set_free(set);
-	if (res == isl_lp_error)
-		return NULL;
-	isl_assert(ctx, res == isl_lp_ok || res == isl_lp_unbounded, 
-		   return NULL);
-	return facet;
-error:
-	isl_basic_set_free(lp);
-	isl_mat_free(T);
-	isl_set_free(set);
-	return NULL;
-}
-
-/* Compute the constraint of a facet of "set".
- *
- * We first compute the intersection with a bounding constraint
- * that is orthogonal to one of the coordinate axes.
- * If the affine hull of this intersection has only one equality,
- * we have found a facet.
- * Otherwise, we wrap the current bounding constraint around
- * one of the equalities of the face (one that is not equal to
- * the current bounding constraint).
- * This process continues until we have found a facet.
- * The dimension of the intersection increases by at least
- * one on each iteration, so termination is guaranteed.
- */
-static __isl_give isl_mat *initial_facet_constraint(__isl_keep isl_set *set)
-{
-	struct isl_set *slice = NULL;
-	struct isl_basic_set *face = NULL;
-	int i;
-	unsigned dim = isl_set_n_dim(set);
-	int is_bound;
-	isl_mat *bounds;
-
-	isl_assert(set->ctx, set->n > 0, goto error);
-	bounds = isl_mat_alloc(set->ctx, 1, 1 + dim);
-	if (!bounds)
-		return NULL;
-
-	isl_seq_clr(bounds->row[0], dim);
-	isl_int_set_si(bounds->row[0][1 + dim - 1], 1);
-	is_bound = uset_is_bound(set, bounds->row[0], 1 + dim);
-	if (is_bound < 0)
-		goto error;
-	isl_assert(set->ctx, is_bound, goto error);
-	isl_seq_normalize(set->ctx, bounds->row[0], 1 + dim);
-	bounds->n_row = 1;
-
-	for (;;) {
-		slice = isl_set_copy(set);
-		slice = isl_set_add_basic_set_equality(slice, bounds->row[0]);
-		face = isl_set_affine_hull(slice);
-		if (!face)
-			goto error;
-		if (face->n_eq == 1) {
-			isl_basic_set_free(face);
-			break;
-		}
-		for (i = 0; i < face->n_eq; ++i)
-			if (!isl_seq_eq(bounds->row[0], face->eq[i], 1 + dim) &&
-			    !isl_seq_is_neg(bounds->row[0],
-						face->eq[i], 1 + dim))
-				break;
-		isl_assert(set->ctx, i < face->n_eq, goto error);
-		if (!isl_set_wrap_facet(set, bounds->row[0], face->eq[i]))
-			goto error;
-		isl_seq_normalize(set->ctx, bounds->row[0], bounds->n_col);
-		isl_basic_set_free(face);
-	}
-
-	return bounds;
-error:
-	isl_basic_set_free(face);
-	isl_mat_free(bounds);
-	return NULL;
-}
-
-/* Given the bounding constraint "c" of a facet of the convex hull of "set",
- * compute a hyperplane description of the facet, i.e., compute the facets
- * of the facet.
- *
- * We compute an affine transformation that transforms the constraint
- *
- *			  [ 1 ]
- *			c [ x ] = 0
- *
- * to the constraint
- *
- *			   z_1  = 0
- *
- * by computing the right inverse U of a matrix that starts with the rows
- *
- *			[ 1 0 ]
- *			[  c  ]
- *
- * Then
- *			[ 1 ]     [ 1 ]
- *			[ x ] = U [ z ]
- * and
- *			[ 1 ]     [ 1 ]
- *			[ z ] = Q [ x ]
- *
- * with Q = U^{-1}
- * Since z_1 is zero, we can drop this variable as well as the corresponding
- * column of U to obtain
- *
- *			[ 1 ]      [ 1  ]
- *			[ x ] = U' [ z' ]
- * and
- *			[ 1  ]      [ 1 ]
- *			[ z' ] = Q' [ x ]
- *
- * with Q' equal to Q, but without the corresponding row.
- * After computing the facets of the facet in the z' space,
- * we convert them back to the x space through Q.
- */
-static struct isl_basic_set *compute_facet(struct isl_set *set, isl_int *c)
-{
-	struct isl_mat *m, *U, *Q;
-	struct isl_basic_set *facet = NULL;
-	struct isl_ctx *ctx;
-	unsigned dim;
-
-	ctx = set->ctx;
-	set = isl_set_copy(set);
-	dim = isl_set_n_dim(set);
-	m = isl_mat_alloc(set->ctx, 2, 1 + dim);
-	if (!m)
-		goto error;
-	isl_int_set_si(m->row[0][0], 1);
-	isl_seq_clr(m->row[0]+1, dim);
-	isl_seq_cpy(m->row[1], c, 1+dim);
-	U = isl_mat_right_inverse(m);
-	Q = isl_mat_right_inverse(isl_mat_copy(U));
-	U = isl_mat_drop_cols(U, 1, 1);
-	Q = isl_mat_drop_rows(Q, 1, 1);
-	set = isl_set_preimage(set, U);
-	facet = uset_convex_hull_wrap_bounded(set);
-	facet = isl_basic_set_preimage(facet, Q);
-	if (facet)
-		isl_assert(ctx, facet->n_eq == 0, goto error);
-	return facet;
-error:
-	isl_basic_set_free(facet);
-	isl_set_free(set);
-	return NULL;
-}
-
-/* Given an initial facet constraint, compute the remaining facets.
- * We do this by running through all facets found so far and computing
- * the adjacent facets through wrapping, adding those facets that we
- * hadn't already found before.
- *
- * For each facet we have found so far, we first compute its facets
- * in the resulting convex hull.  That is, we compute the ridges
- * of the resulting convex hull contained in the facet.
- * We also compute the corresponding facet in the current approximation
- * of the convex hull.  There is no need to wrap around the ridges
- * in this facet since that would result in a facet that is already
- * present in the current approximation.
- *
- * This function can still be significantly optimized by checking which of
- * the facets of the basic sets are also facets of the convex hull and
- * using all the facets so far to help in constructing the facets of the
- * facets
- * and/or
- * using the technique in section "3.1 Ridge Generation" of
- * "Extended Convex Hull" by Fukuda et al.
- */
-static struct isl_basic_set *extend(struct isl_basic_set *hull,
-	struct isl_set *set)
-{
-	int i, j, f;
-	int k;
-	struct isl_basic_set *facet = NULL;
-	struct isl_basic_set *hull_facet = NULL;
-	unsigned dim;
-
-	if (!hull)
-		return NULL;
-
-	isl_assert(set->ctx, set->n > 0, goto error);
-
-	dim = isl_set_n_dim(set);
-
-	for (i = 0; i < hull->n_ineq; ++i) {
-		facet = compute_facet(set, hull->ineq[i]);
-		facet = isl_basic_set_add_equality(facet, hull->ineq[i]);
-		facet = isl_basic_set_gauss(facet, NULL);
-		facet = isl_basic_set_normalize_constraints(facet);
-		hull_facet = isl_basic_set_copy(hull);
-		hull_facet = isl_basic_set_add_equality(hull_facet, hull->ineq[i]);
-		hull_facet = isl_basic_set_gauss(hull_facet, NULL);
-		hull_facet = isl_basic_set_normalize_constraints(hull_facet);
-		if (!facet || !hull_facet)
-			goto error;
-		hull = isl_basic_set_cow(hull);
-		hull = isl_basic_set_extend_space(hull,
-			isl_space_copy(hull->dim), 0, 0, facet->n_ineq);
-		if (!hull)
-			goto error;
-		for (j = 0; j < facet->n_ineq; ++j) {
-			for (f = 0; f < hull_facet->n_ineq; ++f)
-				if (isl_seq_eq(facet->ineq[j],
-						hull_facet->ineq[f], 1 + dim))
-					break;
-			if (f < hull_facet->n_ineq)
-				continue;
-			k = isl_basic_set_alloc_inequality(hull);
-			if (k < 0)
-				goto error;
-			isl_seq_cpy(hull->ineq[k], hull->ineq[i], 1+dim);
-			if (!isl_set_wrap_facet(set, hull->ineq[k], facet->ineq[j]))
-				goto error;
-		}
-		isl_basic_set_free(hull_facet);
-		isl_basic_set_free(facet);
-	}
-	hull = isl_basic_set_simplify(hull);
-	hull = isl_basic_set_finalize(hull);
-	return hull;
-error:
-	isl_basic_set_free(hull_facet);
-	isl_basic_set_free(facet);
-	isl_basic_set_free(hull);
-	return NULL;
-}
-
-/* Special case for computing the convex hull of a one dimensional set.
- * We simply collect the lower and upper bounds of each basic set
- * and the biggest of those.
- */
-static struct isl_basic_set *convex_hull_1d(struct isl_set *set)
-{
-	struct isl_mat *c = NULL;
-	isl_int *lower = NULL;
-	isl_int *upper = NULL;
-	int i, j, k;
-	isl_int a, b;
-	struct isl_basic_set *hull;
-
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_basic_set_simplify(set->p[i]);
-		if (!set->p[i])
-			goto error;
-	}
-	set = isl_set_remove_empty_parts(set);
-	if (!set)
-		goto error;
-	isl_assert(set->ctx, set->n > 0, goto error);
-	c = isl_mat_alloc(set->ctx, 2, 2);
-	if (!c)
-		goto error;
-
-	if (set->p[0]->n_eq > 0) {
-		isl_assert(set->ctx, set->p[0]->n_eq == 1, goto error);
-		lower = c->row[0];
-		upper = c->row[1];
-		if (isl_int_is_pos(set->p[0]->eq[0][1])) {
-			isl_seq_cpy(lower, set->p[0]->eq[0], 2);
-			isl_seq_neg(upper, set->p[0]->eq[0], 2);
-		} else {
-			isl_seq_neg(lower, set->p[0]->eq[0], 2);
-			isl_seq_cpy(upper, set->p[0]->eq[0], 2);
-		}
-	} else {
-		for (j = 0; j < set->p[0]->n_ineq; ++j) {
-			if (isl_int_is_pos(set->p[0]->ineq[j][1])) {
-				lower = c->row[0];
-				isl_seq_cpy(lower, set->p[0]->ineq[j], 2);
-			} else {
-				upper = c->row[1];
-				isl_seq_cpy(upper, set->p[0]->ineq[j], 2);
-			}
-		}
-	}
-
-	isl_int_init(a);
-	isl_int_init(b);
-	for (i = 0; i < set->n; ++i) {
-		struct isl_basic_set *bset = set->p[i];
-		int has_lower = 0;
-		int has_upper = 0;
-
-		for (j = 0; j < bset->n_eq; ++j) {
-			has_lower = 1;
-			has_upper = 1;
-			if (lower) {
-				isl_int_mul(a, lower[0], bset->eq[j][1]);
-				isl_int_mul(b, lower[1], bset->eq[j][0]);
-				if (isl_int_lt(a, b) && isl_int_is_pos(bset->eq[j][1]))
-					isl_seq_cpy(lower, bset->eq[j], 2);
-				if (isl_int_gt(a, b) && isl_int_is_neg(bset->eq[j][1]))
-					isl_seq_neg(lower, bset->eq[j], 2);
-			}
-			if (upper) {
-				isl_int_mul(a, upper[0], bset->eq[j][1]);
-				isl_int_mul(b, upper[1], bset->eq[j][0]);
-				if (isl_int_lt(a, b) && isl_int_is_pos(bset->eq[j][1]))
-					isl_seq_neg(upper, bset->eq[j], 2);
-				if (isl_int_gt(a, b) && isl_int_is_neg(bset->eq[j][1]))
-					isl_seq_cpy(upper, bset->eq[j], 2);
-			}
-		}
-		for (j = 0; j < bset->n_ineq; ++j) {
-			if (isl_int_is_pos(bset->ineq[j][1]))
-				has_lower = 1;
-			if (isl_int_is_neg(bset->ineq[j][1]))
-				has_upper = 1;
-			if (lower && isl_int_is_pos(bset->ineq[j][1])) {
-				isl_int_mul(a, lower[0], bset->ineq[j][1]);
-				isl_int_mul(b, lower[1], bset->ineq[j][0]);
-				if (isl_int_lt(a, b))
-					isl_seq_cpy(lower, bset->ineq[j], 2);
-			}
-			if (upper && isl_int_is_neg(bset->ineq[j][1])) {
-				isl_int_mul(a, upper[0], bset->ineq[j][1]);
-				isl_int_mul(b, upper[1], bset->ineq[j][0]);
-				if (isl_int_gt(a, b))
-					isl_seq_cpy(upper, bset->ineq[j], 2);
-			}
-		}
-		if (!has_lower)
-			lower = NULL;
-		if (!has_upper)
-			upper = NULL;
-	}
-	isl_int_clear(a);
-	isl_int_clear(b);
-
-	hull = isl_basic_set_alloc(set->ctx, 0, 1, 0, 0, 2);
-	hull = isl_basic_set_set_rational(hull);
-	if (!hull)
-		goto error;
-	if (lower) {
-		k = isl_basic_set_alloc_inequality(hull);
-		isl_seq_cpy(hull->ineq[k], lower, 2);
-	}
-	if (upper) {
-		k = isl_basic_set_alloc_inequality(hull);
-		isl_seq_cpy(hull->ineq[k], upper, 2);
-	}
-	hull = isl_basic_set_finalize(hull);
-	isl_set_free(set);
-	isl_mat_free(c);
-	return hull;
-error:
-	isl_set_free(set);
-	isl_mat_free(c);
-	return NULL;
-}
-
-static struct isl_basic_set *convex_hull_0d(struct isl_set *set)
-{
-	struct isl_basic_set *convex_hull;
-
-	if (!set)
-		return NULL;
-
-	if (isl_set_is_empty(set))
-		convex_hull = isl_basic_set_empty(isl_space_copy(set->dim));
-	else
-		convex_hull = isl_basic_set_universe(isl_space_copy(set->dim));
-	isl_set_free(set);
-	return convex_hull;
-}
-
-/* Compute the convex hull of a pair of basic sets without any parameters or
- * integer divisions using Fourier-Motzkin elimination.
- * The convex hull is the set of all points that can be written as
- * the sum of points from both basic sets (in homogeneous coordinates).
- * We set up the constraints in a space with dimensions for each of
- * the three sets and then project out the dimensions corresponding
- * to the two original basic sets, retaining only those corresponding
- * to the convex hull.
- */
-static struct isl_basic_set *convex_hull_pair_elim(struct isl_basic_set *bset1,
-	struct isl_basic_set *bset2)
-{
-	int i, j, k;
-	struct isl_basic_set *bset[2];
-	struct isl_basic_set *hull = NULL;
-	unsigned dim;
-
-	if (!bset1 || !bset2)
-		goto error;
-
-	dim = isl_basic_set_n_dim(bset1);
-	hull = isl_basic_set_alloc(bset1->ctx, 0, 2 + 3 * dim, 0,
-				1 + dim + bset1->n_eq + bset2->n_eq,
-				2 + bset1->n_ineq + bset2->n_ineq);
-	bset[0] = bset1;
-	bset[1] = bset2;
-	for (i = 0; i < 2; ++i) {
-		for (j = 0; j < bset[i]->n_eq; ++j) {
-			k = isl_basic_set_alloc_equality(hull);
-			if (k < 0)
-				goto error;
-			isl_seq_clr(hull->eq[k], (i+1) * (1+dim));
-			isl_seq_clr(hull->eq[k]+(i+2)*(1+dim), (1-i)*(1+dim));
-			isl_seq_cpy(hull->eq[k]+(i+1)*(1+dim), bset[i]->eq[j],
-					1+dim);
-		}
-		for (j = 0; j < bset[i]->n_ineq; ++j) {
-			k = isl_basic_set_alloc_inequality(hull);
-			if (k < 0)
-				goto error;
-			isl_seq_clr(hull->ineq[k], (i+1) * (1+dim));
-			isl_seq_clr(hull->ineq[k]+(i+2)*(1+dim), (1-i)*(1+dim));
-			isl_seq_cpy(hull->ineq[k]+(i+1)*(1+dim),
-					bset[i]->ineq[j], 1+dim);
-		}
-		k = isl_basic_set_alloc_inequality(hull);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(hull->ineq[k], 1+2+3*dim);
-		isl_int_set_si(hull->ineq[k][(i+1)*(1+dim)], 1);
-	}
-	for (j = 0; j < 1+dim; ++j) {
-		k = isl_basic_set_alloc_equality(hull);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(hull->eq[k], 1+2+3*dim);
-		isl_int_set_si(hull->eq[k][j], -1);
-		isl_int_set_si(hull->eq[k][1+dim+j], 1);
-		isl_int_set_si(hull->eq[k][2*(1+dim)+j], 1);
-	}
-	hull = isl_basic_set_set_rational(hull);
-	hull = isl_basic_set_remove_dims(hull, isl_dim_set, dim, 2*(1+dim));
-	hull = isl_basic_set_remove_redundancies(hull);
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	return hull;
-error:
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	isl_basic_set_free(hull);
-	return NULL;
-}
-
-/* Is the set bounded for each value of the parameters?
- */
-int isl_basic_set_is_bounded(__isl_keep isl_basic_set *bset)
-{
-	struct isl_tab *tab;
-	int bounded;
-
-	if (!bset)
-		return -1;
-	if (isl_basic_set_plain_is_empty(bset))
-		return 1;
-
-	tab = isl_tab_from_recession_cone(bset, 1);
-	bounded = isl_tab_cone_is_bounded(tab);
-	isl_tab_free(tab);
-	return bounded;
-}
-
-/* Is the image bounded for each value of the parameters and
- * the domain variables?
- */
-int isl_basic_map_image_is_bounded(__isl_keep isl_basic_map *bmap)
-{
-	unsigned nparam = isl_basic_map_dim(bmap, isl_dim_param);
-	unsigned n_in = isl_basic_map_dim(bmap, isl_dim_in);
-	int bounded;
-
-	bmap = isl_basic_map_copy(bmap);
-	bmap = isl_basic_map_cow(bmap);
-	bmap = isl_basic_map_move_dims(bmap, isl_dim_param, nparam,
-					isl_dim_in, 0, n_in);
-	bounded = isl_basic_set_is_bounded((isl_basic_set *)bmap);
-	isl_basic_map_free(bmap);
-
-	return bounded;
-}
-
-/* Is the set bounded for each value of the parameters?
- */
-int isl_set_is_bounded(__isl_keep isl_set *set)
-{
-	int i;
-
-	if (!set)
-		return -1;
-
-	for (i = 0; i < set->n; ++i) {
-		int bounded = isl_basic_set_is_bounded(set->p[i]);
-		if (!bounded || bounded < 0)
-			return bounded;
-	}
-	return 1;
-}
-
-/* Compute the lineality space of the convex hull of bset1 and bset2.
- *
- * We first compute the intersection of the recession cone of bset1
- * with the negative of the recession cone of bset2 and then compute
- * the linear hull of the resulting cone.
- */
-static struct isl_basic_set *induced_lineality_space(
-	struct isl_basic_set *bset1, struct isl_basic_set *bset2)
-{
-	int i, k;
-	struct isl_basic_set *lin = NULL;
-	unsigned dim;
-
-	if (!bset1 || !bset2)
-		goto error;
-
-	dim = isl_basic_set_total_dim(bset1);
-	lin = isl_basic_set_alloc_space(isl_basic_set_get_space(bset1), 0,
-					bset1->n_eq + bset2->n_eq,
-					bset1->n_ineq + bset2->n_ineq);
-	lin = isl_basic_set_set_rational(lin);
-	if (!lin)
-		goto error;
-	for (i = 0; i < bset1->n_eq; ++i) {
-		k = isl_basic_set_alloc_equality(lin);
-		if (k < 0)
-			goto error;
-		isl_int_set_si(lin->eq[k][0], 0);
-		isl_seq_cpy(lin->eq[k] + 1, bset1->eq[i] + 1, dim);
-	}
-	for (i = 0; i < bset1->n_ineq; ++i) {
-		k = isl_basic_set_alloc_inequality(lin);
-		if (k < 0)
-			goto error;
-		isl_int_set_si(lin->ineq[k][0], 0);
-		isl_seq_cpy(lin->ineq[k] + 1, bset1->ineq[i] + 1, dim);
-	}
-	for (i = 0; i < bset2->n_eq; ++i) {
-		k = isl_basic_set_alloc_equality(lin);
-		if (k < 0)
-			goto error;
-		isl_int_set_si(lin->eq[k][0], 0);
-		isl_seq_neg(lin->eq[k] + 1, bset2->eq[i] + 1, dim);
-	}
-	for (i = 0; i < bset2->n_ineq; ++i) {
-		k = isl_basic_set_alloc_inequality(lin);
-		if (k < 0)
-			goto error;
-		isl_int_set_si(lin->ineq[k][0], 0);
-		isl_seq_neg(lin->ineq[k] + 1, bset2->ineq[i] + 1, dim);
-	}
-
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	return isl_basic_set_affine_hull(lin);
-error:
-	isl_basic_set_free(lin);
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	return NULL;
-}
-
-static struct isl_basic_set *uset_convex_hull(struct isl_set *set);
-
-/* Given a set and a linear space "lin" of dimension n > 0,
- * project the linear space from the set, compute the convex hull
- * and then map the set back to the original space.
- *
- * Let
- *
- *	M x = 0
- *
- * describe the linear space.  We first compute the Hermite normal
- * form H = M U of M = H Q, to obtain
- *
- *	H Q x = 0
- *
- * The last n rows of H will be zero, so the last n variables of x' = Q x
- * are the one we want to project out.  We do this by transforming each
- * basic set A x >= b to A U x' >= b and then removing the last n dimensions.
- * After computing the convex hull in x'_1, i.e., A' x'_1 >= b',
- * we transform the hull back to the original space as A' Q_1 x >= b',
- * with Q_1 all but the last n rows of Q.
- */
-static struct isl_basic_set *modulo_lineality(struct isl_set *set,
-	struct isl_basic_set *lin)
-{
-	unsigned total = isl_basic_set_total_dim(lin);
-	unsigned lin_dim;
-	struct isl_basic_set *hull;
-	struct isl_mat *M, *U, *Q;
-
-	if (!set || !lin)
-		goto error;
-	lin_dim = total - lin->n_eq;
-	M = isl_mat_sub_alloc6(set->ctx, lin->eq, 0, lin->n_eq, 1, total);
-	M = isl_mat_left_hermite(M, 0, &U, &Q);
-	if (!M)
-		goto error;
-	isl_mat_free(M);
-	isl_basic_set_free(lin);
-
-	Q = isl_mat_drop_rows(Q, Q->n_row - lin_dim, lin_dim);
-
-	U = isl_mat_lin_to_aff(U);
-	Q = isl_mat_lin_to_aff(Q);
-
-	set = isl_set_preimage(set, U);
-	set = isl_set_remove_dims(set, isl_dim_set, total - lin_dim, lin_dim);
-	hull = uset_convex_hull(set);
-	hull = isl_basic_set_preimage(hull, Q);
-
-	return hull;
-error:
-	isl_basic_set_free(lin);
-	isl_set_free(set);
-	return NULL;
-}
-
-/* Given two polyhedra with as constraints h_{ij} x >= 0 in homegeneous space,
- * set up an LP for solving
- *
- *	\sum_j \alpha_{1j} h_{1j} = \sum_j \alpha_{2j} h_{2j}
- *
- * \alpha{i0} corresponds to the (implicit) positivity constraint 1 >= 0
- * The next \alpha{ij} correspond to the equalities and come in pairs.
- * The final \alpha{ij} correspond to the inequalities.
- */
-static struct isl_basic_set *valid_direction_lp(
-	struct isl_basic_set *bset1, struct isl_basic_set *bset2)
-{
-	isl_space *dim;
-	struct isl_basic_set *lp;
-	unsigned d;
-	int n;
-	int i, j, k;
-
-	if (!bset1 || !bset2)
-		goto error;
-	d = 1 + isl_basic_set_total_dim(bset1);
-	n = 2 +
-	    2 * bset1->n_eq + bset1->n_ineq + 2 * bset2->n_eq + bset2->n_ineq;
-	dim = isl_space_set_alloc(bset1->ctx, 0, n);
-	lp = isl_basic_set_alloc_space(dim, 0, d, n);
-	if (!lp)
-		goto error;
-	for (i = 0; i < n; ++i) {
-		k = isl_basic_set_alloc_inequality(lp);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(lp->ineq[k] + 1, n);
-		isl_int_set_si(lp->ineq[k][0], -1);
-		isl_int_set_si(lp->ineq[k][1 + i], 1);
-	}
-	for (i = 0; i < d; ++i) {
-		k = isl_basic_set_alloc_equality(lp);
-		if (k < 0)
-			goto error;
-		n = 0;
-		isl_int_set_si(lp->eq[k][n], 0); n++;
-		/* positivity constraint 1 >= 0 */
-		isl_int_set_si(lp->eq[k][n], i == 0); n++;
-		for (j = 0; j < bset1->n_eq; ++j) {
-			isl_int_set(lp->eq[k][n], bset1->eq[j][i]); n++;
-			isl_int_neg(lp->eq[k][n], bset1->eq[j][i]); n++;
-		}
-		for (j = 0; j < bset1->n_ineq; ++j) {
-			isl_int_set(lp->eq[k][n], bset1->ineq[j][i]); n++;
-		}
-		/* positivity constraint 1 >= 0 */
-		isl_int_set_si(lp->eq[k][n], -(i == 0)); n++;
-		for (j = 0; j < bset2->n_eq; ++j) {
-			isl_int_neg(lp->eq[k][n], bset2->eq[j][i]); n++;
-			isl_int_set(lp->eq[k][n], bset2->eq[j][i]); n++;
-		}
-		for (j = 0; j < bset2->n_ineq; ++j) {
-			isl_int_neg(lp->eq[k][n], bset2->ineq[j][i]); n++;
-		}
-	}
-	lp = isl_basic_set_gauss(lp, NULL);
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	return lp;
-error:
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	return NULL;
-}
-
-/* Compute a vector s in the homogeneous space such that <s, r> > 0
- * for all rays in the homogeneous space of the two cones that correspond
- * to the input polyhedra bset1 and bset2.
- *
- * We compute s as a vector that satisfies
- *
- *	s = \sum_j \alpha_{ij} h_{ij}	for i = 1,2			(*)
- *
- * with h_{ij} the normals of the facets of polyhedron i
- * (including the "positivity constraint" 1 >= 0) and \alpha_{ij}
- * strictly positive numbers.  For simplicity we impose \alpha_{ij} >= 1.
- * We first set up an LP with as variables the \alpha{ij}.
- * In this formulation, for each polyhedron i,
- * the first constraint is the positivity constraint, followed by pairs
- * of variables for the equalities, followed by variables for the inequalities.
- * We then simply pick a feasible solution and compute s using (*).
- *
- * Note that we simply pick any valid direction and make no attempt
- * to pick a "good" or even the "best" valid direction.
- */
-static struct isl_vec *valid_direction(
-	struct isl_basic_set *bset1, struct isl_basic_set *bset2)
-{
-	struct isl_basic_set *lp;
-	struct isl_tab *tab;
-	struct isl_vec *sample = NULL;
-	struct isl_vec *dir;
-	unsigned d;
-	int i;
-	int n;
-
-	if (!bset1 || !bset2)
-		goto error;
-	lp = valid_direction_lp(isl_basic_set_copy(bset1),
-				isl_basic_set_copy(bset2));
-	tab = isl_tab_from_basic_set(lp);
-	sample = isl_tab_get_sample_value(tab);
-	isl_tab_free(tab);
-	isl_basic_set_free(lp);
-	if (!sample)
-		goto error;
-	d = isl_basic_set_total_dim(bset1);
-	dir = isl_vec_alloc(bset1->ctx, 1 + d);
-	if (!dir)
-		goto error;
-	isl_seq_clr(dir->block.data + 1, dir->size - 1);
-	n = 1;
-	/* positivity constraint 1 >= 0 */
-	isl_int_set(dir->block.data[0], sample->block.data[n]); n++;
-	for (i = 0; i < bset1->n_eq; ++i) {
-		isl_int_sub(sample->block.data[n],
-			    sample->block.data[n], sample->block.data[n+1]);
-		isl_seq_combine(dir->block.data,
-				bset1->ctx->one, dir->block.data,
-				sample->block.data[n], bset1->eq[i], 1 + d);
-
-		n += 2;
-	}
-	for (i = 0; i < bset1->n_ineq; ++i)
-		isl_seq_combine(dir->block.data,
-				bset1->ctx->one, dir->block.data,
-				sample->block.data[n++], bset1->ineq[i], 1 + d);
-	isl_vec_free(sample);
-	isl_seq_normalize(bset1->ctx, dir->el, dir->size);
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	return dir;
-error:
-	isl_vec_free(sample);
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	return NULL;
-}
-
-/* Given a polyhedron b_i + A_i x >= 0 and a map T = S^{-1},
- * compute b_i' + A_i' x' >= 0, with
- *
- *	[ b_i A_i ]        [ y' ]		              [ y' ]
- *	[  1   0  ] S^{-1} [ x' ] >= 0	or	[ b_i' A_i' ] [ x' ] >= 0
- *
- * In particular, add the "positivity constraint" and then perform
- * the mapping.
- */
-static struct isl_basic_set *homogeneous_map(struct isl_basic_set *bset,
-	struct isl_mat *T)
-{
-	int k;
-
-	if (!bset)
-		goto error;
-	bset = isl_basic_set_extend_constraints(bset, 0, 1);
-	k = isl_basic_set_alloc_inequality(bset);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(bset->ineq[k] + 1, isl_basic_set_total_dim(bset));
-	isl_int_set_si(bset->ineq[k][0], 1);
-	bset = isl_basic_set_preimage(bset, T);
-	return bset;
-error:
-	isl_mat_free(T);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Compute the convex hull of a pair of basic sets without any parameters or
- * integer divisions, where the convex hull is known to be pointed,
- * but the basic sets may be unbounded.
- *
- * We turn this problem into the computation of a convex hull of a pair
- * _bounded_ polyhedra by "changing the direction of the homogeneous
- * dimension".  This idea is due to Matthias Koeppe.
- *
- * Consider the cones in homogeneous space that correspond to the
- * input polyhedra.  The rays of these cones are also rays of the
- * polyhedra if the coordinate that corresponds to the homogeneous
- * dimension is zero.  That is, if the inner product of the rays
- * with the homogeneous direction is zero.
- * The cones in the homogeneous space can also be considered to
- * correspond to other pairs of polyhedra by chosing a different
- * homogeneous direction.  To ensure that both of these polyhedra
- * are bounded, we need to make sure that all rays of the cones
- * correspond to vertices and not to rays.
- * Let s be a direction such that <s, r> > 0 for all rays r of both cones.
- * Then using s as a homogeneous direction, we obtain a pair of polytopes.
- * The vector s is computed in valid_direction.
- *
- * Note that we need to consider _all_ rays of the cones and not just
- * the rays that correspond to rays in the polyhedra.  If we were to
- * only consider those rays and turn them into vertices, then we
- * may inadvertently turn some vertices into rays.
- *
- * The standard homogeneous direction is the unit vector in the 0th coordinate.
- * We therefore transform the two polyhedra such that the selected
- * direction is mapped onto this standard direction and then proceed
- * with the normal computation.
- * Let S be a non-singular square matrix with s as its first row,
- * then we want to map the polyhedra to the space
- *
- *	[ y' ]     [ y ]		[ y ]          [ y' ]
- *	[ x' ] = S [ x ]	i.e.,	[ x ] = S^{-1} [ x' ]
- *
- * We take S to be the unimodular completion of s to limit the growth
- * of the coefficients in the following computations.
- *
- * Let b_i + A_i x >= 0 be the constraints of polyhedron i.
- * We first move to the homogeneous dimension
- *
- *	b_i y + A_i x >= 0		[ b_i A_i ] [ y ]    [ 0 ]
- *	    y         >= 0	or	[  1   0  ] [ x ] >= [ 0 ]
- *
- * Then we change directoin
- *
- *	[ b_i A_i ]        [ y' ]		              [ y' ]
- *	[  1   0  ] S^{-1} [ x' ] >= 0	or	[ b_i' A_i' ] [ x' ] >= 0
- *
- * Then we compute the convex hull of the polytopes b_i' + A_i' x' >= 0
- * resulting in b' + A' x' >= 0, which we then convert back
- *
- *	            [ y ]		        [ y ]
- *	[ b' A' ] S [ x ] >= 0	or	[ b A ] [ x ] >= 0
- *
- * The polyhedron b + A x >= 0 is then the convex hull of the input polyhedra.
- */
-static struct isl_basic_set *convex_hull_pair_pointed(
-	struct isl_basic_set *bset1, struct isl_basic_set *bset2)
-{
-	struct isl_ctx *ctx = NULL;
-	struct isl_vec *dir = NULL;
-	struct isl_mat *T = NULL;
-	struct isl_mat *T2 = NULL;
-	struct isl_basic_set *hull;
-	struct isl_set *set;
-
-	if (!bset1 || !bset2)
-		goto error;
-	ctx = bset1->ctx;
-	dir = valid_direction(isl_basic_set_copy(bset1),
-				isl_basic_set_copy(bset2));
-	if (!dir)
-		goto error;
-	T = isl_mat_alloc(bset1->ctx, dir->size, dir->size);
-	if (!T)
-		goto error;
-	isl_seq_cpy(T->row[0], dir->block.data, dir->size);
-	T = isl_mat_unimodular_complete(T, 1);
-	T2 = isl_mat_right_inverse(isl_mat_copy(T));
-
-	bset1 = homogeneous_map(bset1, isl_mat_copy(T2));
-	bset2 = homogeneous_map(bset2, T2);
-	set = isl_set_alloc_space(isl_basic_set_get_space(bset1), 2, 0);
-	set = isl_set_add_basic_set(set, bset1);
-	set = isl_set_add_basic_set(set, bset2);
-	hull = uset_convex_hull(set);
-	hull = isl_basic_set_preimage(hull, T);
-	 
-	isl_vec_free(dir);
-
-	return hull;
-error:
-	isl_vec_free(dir);
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	return NULL;
-}
-
-static struct isl_basic_set *uset_convex_hull_wrap(struct isl_set *set);
-static struct isl_basic_set *modulo_affine_hull(
-	struct isl_set *set, struct isl_basic_set *affine_hull);
-
-/* Compute the convex hull of a pair of basic sets without any parameters or
- * integer divisions.
- *
- * This function is called from uset_convex_hull_unbounded, which
- * means that the complete convex hull is unbounded.  Some pairs
- * of basic sets may still be bounded, though.
- * They may even lie inside a lower dimensional space, in which
- * case they need to be handled inside their affine hull since
- * the main algorithm assumes that the result is full-dimensional.
- *
- * If the convex hull of the two basic sets would have a non-trivial
- * lineality space, we first project out this lineality space.
- */
-static struct isl_basic_set *convex_hull_pair(struct isl_basic_set *bset1,
-	struct isl_basic_set *bset2)
-{
-	isl_basic_set *lin, *aff;
-	int bounded1, bounded2;
-
-	if (bset1->ctx->opt->convex == ISL_CONVEX_HULL_FM)
-		return convex_hull_pair_elim(bset1, bset2);
-
-	aff = isl_set_affine_hull(isl_basic_set_union(isl_basic_set_copy(bset1),
-						    isl_basic_set_copy(bset2)));
-	if (!aff)
-		goto error;
-	if (aff->n_eq != 0) 
-		return modulo_affine_hull(isl_basic_set_union(bset1, bset2), aff);
-	isl_basic_set_free(aff);
-
-	bounded1 = isl_basic_set_is_bounded(bset1);
-	bounded2 = isl_basic_set_is_bounded(bset2);
-
-	if (bounded1 < 0 || bounded2 < 0)
-		goto error;
-
-	if (bounded1 && bounded2)
-		uset_convex_hull_wrap(isl_basic_set_union(bset1, bset2));
-
-	if (bounded1 || bounded2)
-		return convex_hull_pair_pointed(bset1, bset2);
-
-	lin = induced_lineality_space(isl_basic_set_copy(bset1),
-				      isl_basic_set_copy(bset2));
-	if (!lin)
-		goto error;
-	if (isl_basic_set_is_universe(lin)) {
-		isl_basic_set_free(bset1);
-		isl_basic_set_free(bset2);
-		return lin;
-	}
-	if (lin->n_eq < isl_basic_set_total_dim(lin)) {
-		struct isl_set *set;
-		set = isl_set_alloc_space(isl_basic_set_get_space(bset1), 2, 0);
-		set = isl_set_add_basic_set(set, bset1);
-		set = isl_set_add_basic_set(set, bset2);
-		return modulo_lineality(set, lin);
-	}
-	isl_basic_set_free(lin);
-
-	return convex_hull_pair_pointed(bset1, bset2);
-error:
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	return NULL;
-}
-
-/* Compute the lineality space of a basic set.
- * We currently do not allow the basic set to have any divs.
- * We basically just drop the constants and turn every inequality
- * into an equality.
- */
-struct isl_basic_set *isl_basic_set_lineality_space(struct isl_basic_set *bset)
-{
-	int i, k;
-	struct isl_basic_set *lin = NULL;
-	unsigned dim;
-
-	if (!bset)
-		goto error;
-	isl_assert(bset->ctx, bset->n_div == 0, goto error);
-	dim = isl_basic_set_total_dim(bset);
-
-	lin = isl_basic_set_alloc_space(isl_basic_set_get_space(bset), 0, dim, 0);
-	if (!lin)
-		goto error;
-	for (i = 0; i < bset->n_eq; ++i) {
-		k = isl_basic_set_alloc_equality(lin);
-		if (k < 0)
-			goto error;
-		isl_int_set_si(lin->eq[k][0], 0);
-		isl_seq_cpy(lin->eq[k] + 1, bset->eq[i] + 1, dim);
-	}
-	lin = isl_basic_set_gauss(lin, NULL);
-	if (!lin)
-		goto error;
-	for (i = 0; i < bset->n_ineq && lin->n_eq < dim; ++i) {
-		k = isl_basic_set_alloc_equality(lin);
-		if (k < 0)
-			goto error;
-		isl_int_set_si(lin->eq[k][0], 0);
-		isl_seq_cpy(lin->eq[k] + 1, bset->ineq[i] + 1, dim);
-		lin = isl_basic_set_gauss(lin, NULL);
-		if (!lin)
-			goto error;
-	}
-	isl_basic_set_free(bset);
-	return lin;
-error:
-	isl_basic_set_free(lin);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Compute the (linear) hull of the lineality spaces of the basic sets in the
- * "underlying" set "set".
- */
-static struct isl_basic_set *uset_combined_lineality_space(struct isl_set *set)
-{
-	int i;
-	struct isl_set *lin = NULL;
-
-	if (!set)
-		return NULL;
-	if (set->n == 0) {
-		isl_space *dim = isl_set_get_space(set);
-		isl_set_free(set);
-		return isl_basic_set_empty(dim);
-	}
-
-	lin = isl_set_alloc_space(isl_set_get_space(set), set->n, 0);
-	for (i = 0; i < set->n; ++i)
-		lin = isl_set_add_basic_set(lin,
-		    isl_basic_set_lineality_space(isl_basic_set_copy(set->p[i])));
-	isl_set_free(set);
-	return isl_set_affine_hull(lin);
-}
-
-/* Compute the convex hull of a set without any parameters or
- * integer divisions.
- * In each step, we combined two basic sets until only one
- * basic set is left.
- * The input basic sets are assumed not to have a non-trivial
- * lineality space.  If any of the intermediate results has
- * a non-trivial lineality space, it is projected out.
- */
-static struct isl_basic_set *uset_convex_hull_unbounded(struct isl_set *set)
-{
-	struct isl_basic_set *convex_hull = NULL;
-
-	convex_hull = isl_set_copy_basic_set(set);
-	set = isl_set_drop_basic_set(set, convex_hull);
-	if (!set)
-		goto error;
-	while (set->n > 0) {
-		struct isl_basic_set *t;
-		t = isl_set_copy_basic_set(set);
-		if (!t)
-			goto error;
-		set = isl_set_drop_basic_set(set, t);
-		if (!set)
-			goto error;
-		convex_hull = convex_hull_pair(convex_hull, t);
-		if (set->n == 0)
-			break;
-		t = isl_basic_set_lineality_space(isl_basic_set_copy(convex_hull));
-		if (!t)
-			goto error;
-		if (isl_basic_set_is_universe(t)) {
-			isl_basic_set_free(convex_hull);
-			convex_hull = t;
-			break;
-		}
-		if (t->n_eq < isl_basic_set_total_dim(t)) {
-			set = isl_set_add_basic_set(set, convex_hull);
-			return modulo_lineality(set, t);
-		}
-		isl_basic_set_free(t);
-	}
-	isl_set_free(set);
-	return convex_hull;
-error:
-	isl_set_free(set);
-	isl_basic_set_free(convex_hull);
-	return NULL;
-}
-
-/* Compute an initial hull for wrapping containing a single initial
- * facet.
- * This function assumes that the given set is bounded.
- */
-static struct isl_basic_set *initial_hull(struct isl_basic_set *hull,
-	struct isl_set *set)
-{
-	struct isl_mat *bounds = NULL;
-	unsigned dim;
-	int k;
-
-	if (!hull)
-		goto error;
-	bounds = initial_facet_constraint(set);
-	if (!bounds)
-		goto error;
-	k = isl_basic_set_alloc_inequality(hull);
-	if (k < 0)
-		goto error;
-	dim = isl_set_n_dim(set);
-	isl_assert(set->ctx, 1 + dim == bounds->n_col, goto error);
-	isl_seq_cpy(hull->ineq[k], bounds->row[0], bounds->n_col);
-	isl_mat_free(bounds);
-
-	return hull;
-error:
-	isl_basic_set_free(hull);
-	isl_mat_free(bounds);
-	return NULL;
-}
-
-struct max_constraint {
-	struct isl_mat *c;
-	int	 	count;
-	int		ineq;
-};
-
-static int max_constraint_equal(const void *entry, const void *val)
-{
-	struct max_constraint *a = (struct max_constraint *)entry;
-	isl_int *b = (isl_int *)val;
-
-	return isl_seq_eq(a->c->row[0] + 1, b, a->c->n_col - 1);
-}
-
-static void update_constraint(struct isl_ctx *ctx, struct isl_hash_table *table,
-	isl_int *con, unsigned len, int n, int ineq)
-{
-	struct isl_hash_table_entry *entry;
-	struct max_constraint *c;
-	uint32_t c_hash;
-
-	c_hash = isl_seq_get_hash(con + 1, len);
-	entry = isl_hash_table_find(ctx, table, c_hash, max_constraint_equal,
-			con + 1, 0);
-	if (!entry)
-		return;
-	c = entry->data;
-	if (c->count < n) {
-		isl_hash_table_remove(ctx, table, entry);
-		return;
-	}
-	c->count++;
-	if (isl_int_gt(c->c->row[0][0], con[0]))
-		return;
-	if (isl_int_eq(c->c->row[0][0], con[0])) {
-		if (ineq)
-			c->ineq = ineq;
-		return;
-	}
-	c->c = isl_mat_cow(c->c);
-	isl_int_set(c->c->row[0][0], con[0]);
-	c->ineq = ineq;
-}
-
-/* Check whether the constraint hash table "table" constains the constraint
- * "con".
- */
-static int has_constraint(struct isl_ctx *ctx, struct isl_hash_table *table,
-	isl_int *con, unsigned len, int n)
-{
-	struct isl_hash_table_entry *entry;
-	struct max_constraint *c;
-	uint32_t c_hash;
-
-	c_hash = isl_seq_get_hash(con + 1, len);
-	entry = isl_hash_table_find(ctx, table, c_hash, max_constraint_equal,
-			con + 1, 0);
-	if (!entry)
-		return 0;
-	c = entry->data;
-	if (c->count < n)
-		return 0;
-	return isl_int_eq(c->c->row[0][0], con[0]);
-}
-
-/* Check for inequality constraints of a basic set without equalities
- * such that the same or more stringent copies of the constraint appear
- * in all of the basic sets.  Such constraints are necessarily facet
- * constraints of the convex hull.
- *
- * If the resulting basic set is by chance identical to one of
- * the basic sets in "set", then we know that this basic set contains
- * all other basic sets and is therefore the convex hull of set.
- * In this case we set *is_hull to 1.
- */
-static struct isl_basic_set *common_constraints(struct isl_basic_set *hull,
-	struct isl_set *set, int *is_hull)
-{
-	int i, j, s, n;
-	int min_constraints;
-	int best;
-	struct max_constraint *constraints = NULL;
-	struct isl_hash_table *table = NULL;
-	unsigned total;
-
-	*is_hull = 0;
-
-	for (i = 0; i < set->n; ++i)
-		if (set->p[i]->n_eq == 0)
-			break;
-	if (i >= set->n)
-		return hull;
-	min_constraints = set->p[i]->n_ineq;
-	best = i;
-	for (i = best + 1; i < set->n; ++i) {
-		if (set->p[i]->n_eq != 0)
-			continue;
-		if (set->p[i]->n_ineq >= min_constraints)
-			continue;
-		min_constraints = set->p[i]->n_ineq;
-		best = i;
-	}
-	constraints = isl_calloc_array(hull->ctx, struct max_constraint,
-					min_constraints);
-	if (!constraints)
-		return hull;
-	table = isl_alloc_type(hull->ctx, struct isl_hash_table);
-	if (isl_hash_table_init(hull->ctx, table, min_constraints))
-		goto error;
-
-	total = isl_space_dim(set->dim, isl_dim_all);
-	for (i = 0; i < set->p[best]->n_ineq; ++i) {
-		constraints[i].c = isl_mat_sub_alloc6(hull->ctx,
-			set->p[best]->ineq + i, 0, 1, 0, 1 + total);
-		if (!constraints[i].c)
-			goto error;
-		constraints[i].ineq = 1;
-	}
-	for (i = 0; i < min_constraints; ++i) {
-		struct isl_hash_table_entry *entry;
-		uint32_t c_hash;
-		c_hash = isl_seq_get_hash(constraints[i].c->row[0] + 1, total);
-		entry = isl_hash_table_find(hull->ctx, table, c_hash,
-			max_constraint_equal, constraints[i].c->row[0] + 1, 1);
-		if (!entry)
-			goto error;
-		isl_assert(hull->ctx, !entry->data, goto error);
-		entry->data = &constraints[i];
-	}
-
-	n = 0;
-	for (s = 0; s < set->n; ++s) {
-		if (s == best)
-			continue;
-
-		for (i = 0; i < set->p[s]->n_eq; ++i) {
-			isl_int *eq = set->p[s]->eq[i];
-			for (j = 0; j < 2; ++j) {
-				isl_seq_neg(eq, eq, 1 + total);
-				update_constraint(hull->ctx, table,
-							    eq, total, n, 0);
-			}
-		}
-		for (i = 0; i < set->p[s]->n_ineq; ++i) {
-			isl_int *ineq = set->p[s]->ineq[i];
-			update_constraint(hull->ctx, table, ineq, total, n,
-				set->p[s]->n_eq == 0);
-		}
-		++n;
-	}
-
-	for (i = 0; i < min_constraints; ++i) {
-		if (constraints[i].count < n)
-			continue;
-		if (!constraints[i].ineq)
-			continue;
-		j = isl_basic_set_alloc_inequality(hull);
-		if (j < 0)
-			goto error;
-		isl_seq_cpy(hull->ineq[j], constraints[i].c->row[0], 1 + total);
-	}
-
-	for (s = 0; s < set->n; ++s) {
-		if (set->p[s]->n_eq)
-			continue;
-		if (set->p[s]->n_ineq != hull->n_ineq)
-			continue;
-		for (i = 0; i < set->p[s]->n_ineq; ++i) {
-			isl_int *ineq = set->p[s]->ineq[i];
-			if (!has_constraint(hull->ctx, table, ineq, total, n))
-				break;
-		}
-		if (i == set->p[s]->n_ineq)
-			*is_hull = 1;
-	}
-
-	isl_hash_table_clear(table);
-	for (i = 0; i < min_constraints; ++i)
-		isl_mat_free(constraints[i].c);
-	free(constraints);
-	free(table);
-	return hull;
-error:
-	isl_hash_table_clear(table);
-	free(table);
-	if (constraints)
-		for (i = 0; i < min_constraints; ++i)
-			isl_mat_free(constraints[i].c);
-	free(constraints);
-	return hull;
-}
-
-/* Create a template for the convex hull of "set" and fill it up
- * obvious facet constraints, if any.  If the result happens to
- * be the convex hull of "set" then *is_hull is set to 1.
- */
-static struct isl_basic_set *proto_hull(struct isl_set *set, int *is_hull)
-{
-	struct isl_basic_set *hull;
-	unsigned n_ineq;
-	int i;
-
-	n_ineq = 1;
-	for (i = 0; i < set->n; ++i) {
-		n_ineq += set->p[i]->n_eq;
-		n_ineq += set->p[i]->n_ineq;
-	}
-	hull = isl_basic_set_alloc_space(isl_space_copy(set->dim), 0, 0, n_ineq);
-	hull = isl_basic_set_set_rational(hull);
-	if (!hull)
-		return NULL;
-	return common_constraints(hull, set, is_hull);
-}
-
-static struct isl_basic_set *uset_convex_hull_wrap(struct isl_set *set)
-{
-	struct isl_basic_set *hull;
-	int is_hull;
-
-	hull = proto_hull(set, &is_hull);
-	if (hull && !is_hull) {
-		if (hull->n_ineq == 0)
-			hull = initial_hull(hull, set);
-		hull = extend(hull, set);
-	}
-	isl_set_free(set);
-
-	return hull;
-}
-
-/* Compute the convex hull of a set without any parameters or
- * integer divisions.  Depending on whether the set is bounded,
- * we pass control to the wrapping based convex hull or
- * the Fourier-Motzkin elimination based convex hull.
- * We also handle a few special cases before checking the boundedness.
- */
-static struct isl_basic_set *uset_convex_hull(struct isl_set *set)
-{
-	struct isl_basic_set *convex_hull = NULL;
-	struct isl_basic_set *lin;
-
-	if (isl_set_n_dim(set) == 0)
-		return convex_hull_0d(set);
-
-	set = isl_set_coalesce(set);
-	set = isl_set_set_rational(set);
-
-	if (!set)
-		goto error;
-	if (!set)
-		return NULL;
-	if (set->n == 1) {
-		convex_hull = isl_basic_set_copy(set->p[0]);
-		isl_set_free(set);
-		return convex_hull;
-	}
-	if (isl_set_n_dim(set) == 1)
-		return convex_hull_1d(set);
-
-	if (isl_set_is_bounded(set) &&
-	    set->ctx->opt->convex == ISL_CONVEX_HULL_WRAP)
-		return uset_convex_hull_wrap(set);
-
-	lin = uset_combined_lineality_space(isl_set_copy(set));
-	if (!lin)
-		goto error;
-	if (isl_basic_set_is_universe(lin)) {
-		isl_set_free(set);
-		return lin;
-	}
-	if (lin->n_eq < isl_basic_set_total_dim(lin))
-		return modulo_lineality(set, lin);
-	isl_basic_set_free(lin);
-
-	return uset_convex_hull_unbounded(set);
-error:
-	isl_set_free(set);
-	isl_basic_set_free(convex_hull);
-	return NULL;
-}
-
-/* This is the core procedure, where "set" is a "pure" set, i.e.,
- * without parameters or divs and where the convex hull of set is
- * known to be full-dimensional.
- */
-static struct isl_basic_set *uset_convex_hull_wrap_bounded(struct isl_set *set)
-{
-	struct isl_basic_set *convex_hull = NULL;
-
-	if (!set)
-		goto error;
-
-	if (isl_set_n_dim(set) == 0) {
-		convex_hull = isl_basic_set_universe(isl_space_copy(set->dim));
-		isl_set_free(set);
-		convex_hull = isl_basic_set_set_rational(convex_hull);
-		return convex_hull;
-	}
-
-	set = isl_set_set_rational(set);
-	set = isl_set_coalesce(set);
-	if (!set)
-		goto error;
-	if (set->n == 1) {
-		convex_hull = isl_basic_set_copy(set->p[0]);
-		isl_set_free(set);
-		return convex_hull;
-	}
-	if (isl_set_n_dim(set) == 1)
-		return convex_hull_1d(set);
-
-	return uset_convex_hull_wrap(set);
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-/* Compute the convex hull of set "set" with affine hull "affine_hull",
- * We first remove the equalities (transforming the set), compute the
- * convex hull of the transformed set and then add the equalities back
- * (after performing the inverse transformation.
- */
-static struct isl_basic_set *modulo_affine_hull(
-	struct isl_set *set, struct isl_basic_set *affine_hull)
-{
-	struct isl_mat *T;
-	struct isl_mat *T2;
-	struct isl_basic_set *dummy;
-	struct isl_basic_set *convex_hull;
-
-	dummy = isl_basic_set_remove_equalities(
-			isl_basic_set_copy(affine_hull), &T, &T2);
-	if (!dummy)
-		goto error;
-	isl_basic_set_free(dummy);
-	set = isl_set_preimage(set, T);
-	convex_hull = uset_convex_hull(set);
-	convex_hull = isl_basic_set_preimage(convex_hull, T2);
-	convex_hull = isl_basic_set_intersect(convex_hull, affine_hull);
-	return convex_hull;
-error:
-	isl_basic_set_free(affine_hull);
-	isl_set_free(set);
-	return NULL;
-}
-
-/* Compute the convex hull of a map.
- *
- * The implementation was inspired by "Extended Convex Hull" by Fukuda et al.,
- * specifically, the wrapping of facets to obtain new facets.
- */
-struct isl_basic_map *isl_map_convex_hull(struct isl_map *map)
-{
-	struct isl_basic_set *bset;
-	struct isl_basic_map *model = NULL;
-	struct isl_basic_set *affine_hull = NULL;
-	struct isl_basic_map *convex_hull = NULL;
-	struct isl_set *set = NULL;
-	struct isl_ctx *ctx;
-
-	if (!map)
-		goto error;
-
-	ctx = map->ctx;
-	if (map->n == 0) {
-		convex_hull = isl_basic_map_empty_like_map(map);
-		isl_map_free(map);
-		return convex_hull;
-	}
-
-	map = isl_map_detect_equalities(map);
-	map = isl_map_align_divs(map);
-	if (!map)
-		goto error;
-	model = isl_basic_map_copy(map->p[0]);
-	set = isl_map_underlying_set(map);
-	if (!set)
-		goto error;
-
-	affine_hull = isl_set_affine_hull(isl_set_copy(set));
-	if (!affine_hull)
-		goto error;
-	if (affine_hull->n_eq != 0)
-		bset = modulo_affine_hull(set, affine_hull);
-	else {
-		isl_basic_set_free(affine_hull);
-		bset = uset_convex_hull(set);
-	}
-
-	convex_hull = isl_basic_map_overlying_set(bset, model);
-	if (!convex_hull)
-		return NULL;
-
-	ISL_F_SET(convex_hull, ISL_BASIC_MAP_NO_IMPLICIT);
-	ISL_F_SET(convex_hull, ISL_BASIC_MAP_ALL_EQUALITIES);
-	ISL_F_CLR(convex_hull, ISL_BASIC_MAP_RATIONAL);
-	return convex_hull;
-error:
-	isl_set_free(set);
-	isl_basic_map_free(model);
-	return NULL;
-}
-
-struct isl_basic_set *isl_set_convex_hull(struct isl_set *set)
-{
-	return (struct isl_basic_set *)
-		isl_map_convex_hull((struct isl_map *)set);
-}
-
-__isl_give isl_basic_map *isl_map_polyhedral_hull(__isl_take isl_map *map)
-{
-	isl_basic_map *hull;
-
-	hull = isl_map_convex_hull(map);
-	return isl_basic_map_remove_divs(hull);
-}
-
-__isl_give isl_basic_set *isl_set_polyhedral_hull(__isl_take isl_set *set)
-{
-	return (isl_basic_set *)isl_map_polyhedral_hull((isl_map *)set);
-}
-
-struct sh_data_entry {
-	struct isl_hash_table	*table;
-	struct isl_tab		*tab;
-};
-
-/* Holds the data needed during the simple hull computation.
- * In particular,
- *	n		the number of basic sets in the original set
- *	hull_table	a hash table of already computed constraints
- *			in the simple hull
- *	p		for each basic set,
- *		table		a hash table of the constraints
- *		tab		the tableau corresponding to the basic set
- */
-struct sh_data {
-	struct isl_ctx		*ctx;
-	unsigned		n;
-	struct isl_hash_table	*hull_table;
-	struct sh_data_entry	p[1];
-};
-
-static void sh_data_free(struct sh_data *data)
-{
-	int i;
-
-	if (!data)
-		return;
-	isl_hash_table_free(data->ctx, data->hull_table);
-	for (i = 0; i < data->n; ++i) {
-		isl_hash_table_free(data->ctx, data->p[i].table);
-		isl_tab_free(data->p[i].tab);
-	}
-	free(data);
-}
-
-struct ineq_cmp_data {
-	unsigned	len;
-	isl_int		*p;
-};
-
-static int has_ineq(const void *entry, const void *val)
-{
-	isl_int *row = (isl_int *)entry;
-	struct ineq_cmp_data *v = (struct ineq_cmp_data *)val;
-
-	return isl_seq_eq(row + 1, v->p + 1, v->len) ||
-	       isl_seq_is_neg(row + 1, v->p + 1, v->len);
-}
-
-static int hash_ineq(struct isl_ctx *ctx, struct isl_hash_table *table,
-			isl_int *ineq, unsigned len)
-{
-	uint32_t c_hash;
-	struct ineq_cmp_data v;
-	struct isl_hash_table_entry *entry;
-
-	v.len = len;
-	v.p = ineq;
-	c_hash = isl_seq_get_hash(ineq + 1, len);
-	entry = isl_hash_table_find(ctx, table, c_hash, has_ineq, &v, 1);
-	if (!entry)
-		return - 1;
-	entry->data = ineq;
-	return 0;
-}
-
-/* Fill hash table "table" with the constraints of "bset".
- * Equalities are added as two inequalities.
- * The value in the hash table is a pointer to the (in)equality of "bset".
- */
-static int hash_basic_set(struct isl_hash_table *table,
-				struct isl_basic_set *bset)
-{
-	int i, j;
-	unsigned dim = isl_basic_set_total_dim(bset);
-
-	for (i = 0; i < bset->n_eq; ++i) {
-		for (j = 0; j < 2; ++j) {
-			isl_seq_neg(bset->eq[i], bset->eq[i], 1 + dim);
-			if (hash_ineq(bset->ctx, table, bset->eq[i], dim) < 0)
-				return -1;
-		}
-	}
-	for (i = 0; i < bset->n_ineq; ++i) {
-		if (hash_ineq(bset->ctx, table, bset->ineq[i], dim) < 0)
-			return -1;
-	}
-	return 0;
-}
-
-static struct sh_data *sh_data_alloc(struct isl_set *set, unsigned n_ineq)
-{
-	struct sh_data *data;
-	int i;
-
-	data = isl_calloc(set->ctx, struct sh_data,
-		sizeof(struct sh_data) +
-		(set->n - 1) * sizeof(struct sh_data_entry));
-	if (!data)
-		return NULL;
-	data->ctx = set->ctx;
-	data->n = set->n;
-	data->hull_table = isl_hash_table_alloc(set->ctx, n_ineq);
-	if (!data->hull_table)
-		goto error;
-	for (i = 0; i < set->n; ++i) {
-		data->p[i].table = isl_hash_table_alloc(set->ctx,
-				    2 * set->p[i]->n_eq + set->p[i]->n_ineq);
-		if (!data->p[i].table)
-			goto error;
-		if (hash_basic_set(data->p[i].table, set->p[i]) < 0)
-			goto error;
-	}
-	return data;
-error:
-	sh_data_free(data);
-	return NULL;
-}
-
-/* Check if inequality "ineq" is a bound for basic set "j" or if
- * it can be relaxed (by increasing the constant term) to become
- * a bound for that basic set.  In the latter case, the constant
- * term is updated.
- * Return 1 if "ineq" is a bound
- *	  0 if "ineq" may attain arbitrarily small values on basic set "j"
- *	 -1 if some error occurred
- */
-static int is_bound(struct sh_data *data, struct isl_set *set, int j,
-			isl_int *ineq)
-{
-	enum isl_lp_result res;
-	isl_int opt;
-
-	if (!data->p[j].tab) {
-		data->p[j].tab = isl_tab_from_basic_set(set->p[j]);
-		if (!data->p[j].tab)
-			return -1;
-	}
-
-	isl_int_init(opt);
-
-	res = isl_tab_min(data->p[j].tab, ineq, data->ctx->one,
-				&opt, NULL, 0);
-	if (res == isl_lp_ok && isl_int_is_neg(opt))
-		isl_int_sub(ineq[0], ineq[0], opt);
-
-	isl_int_clear(opt);
-
-	return (res == isl_lp_ok || res == isl_lp_empty) ? 1 :
-	       res == isl_lp_unbounded ? 0 : -1;
-}
-
-/* Check if inequality "ineq" from basic set "i" can be relaxed to
- * become a bound on the whole set.  If so, add the (relaxed) inequality
- * to "hull".
- *
- * We first check if "hull" already contains a translate of the inequality.
- * If so, we are done.
- * Then, we check if any of the previous basic sets contains a translate
- * of the inequality.  If so, then we have already considered this
- * inequality and we are done.
- * Otherwise, for each basic set other than "i", we check if the inequality
- * is a bound on the basic set.
- * For previous basic sets, we know that they do not contain a translate
- * of the inequality, so we directly call is_bound.
- * For following basic sets, we first check if a translate of the
- * inequality appears in its description and if so directly update
- * the inequality accordingly.
- */
-static struct isl_basic_set *add_bound(struct isl_basic_set *hull,
-	struct sh_data *data, struct isl_set *set, int i, isl_int *ineq)
-{
-	uint32_t c_hash;
-	struct ineq_cmp_data v;
-	struct isl_hash_table_entry *entry;
-	int j, k;
-
-	if (!hull)
-		return NULL;
-
-	v.len = isl_basic_set_total_dim(hull);
-	v.p = ineq;
-	c_hash = isl_seq_get_hash(ineq + 1, v.len);
-
-	entry = isl_hash_table_find(hull->ctx, data->hull_table, c_hash,
-					has_ineq, &v, 0);
-	if (entry)
-		return hull;
-
-	for (j = 0; j < i; ++j) {
-		entry = isl_hash_table_find(hull->ctx, data->p[j].table,
-						c_hash, has_ineq, &v, 0);
-		if (entry)
-			break;
-	}
-	if (j < i)
-		return hull;
-
-	k = isl_basic_set_alloc_inequality(hull);
-	isl_seq_cpy(hull->ineq[k], ineq, 1 + v.len);
-	if (k < 0)
-		goto error;
-
-	for (j = 0; j < i; ++j) {
-		int bound;
-		bound = is_bound(data, set, j, hull->ineq[k]);
-		if (bound < 0)
-			goto error;
-		if (!bound)
-			break;
-	}
-	if (j < i) {
-		isl_basic_set_free_inequality(hull, 1);
-		return hull;
-	}
-
-	for (j = i + 1; j < set->n; ++j) {
-		int bound, neg;
-		isl_int *ineq_j;
-		entry = isl_hash_table_find(hull->ctx, data->p[j].table,
-						c_hash, has_ineq, &v, 0);
-		if (entry) {
-			ineq_j = entry->data;
-			neg = isl_seq_is_neg(ineq_j + 1,
-					     hull->ineq[k] + 1, v.len);
-			if (neg)
-				isl_int_neg(ineq_j[0], ineq_j[0]);
-			if (isl_int_gt(ineq_j[0], hull->ineq[k][0]))
-				isl_int_set(hull->ineq[k][0], ineq_j[0]);
-			if (neg)
-				isl_int_neg(ineq_j[0], ineq_j[0]);
-			continue;
-		}
-		bound = is_bound(data, set, j, hull->ineq[k]);
-		if (bound < 0)
-			goto error;
-		if (!bound)
-			break;
-	}
-	if (j < set->n) {
-		isl_basic_set_free_inequality(hull, 1);
-		return hull;
-	}
-
-	entry = isl_hash_table_find(hull->ctx, data->hull_table, c_hash,
-					has_ineq, &v, 1);
-	if (!entry)
-		goto error;
-	entry->data = hull->ineq[k];
-
-	return hull;
-error:
-	isl_basic_set_free(hull);
-	return NULL;
-}
-
-/* Check if any inequality from basic set "i" can be relaxed to
- * become a bound on the whole set.  If so, add the (relaxed) inequality
- * to "hull".
- */
-static struct isl_basic_set *add_bounds(struct isl_basic_set *bset,
-	struct sh_data *data, struct isl_set *set, int i)
-{
-	int j, k;
-	unsigned dim = isl_basic_set_total_dim(bset);
-
-	for (j = 0; j < set->p[i]->n_eq; ++j) {
-		for (k = 0; k < 2; ++k) {
-			isl_seq_neg(set->p[i]->eq[j], set->p[i]->eq[j], 1+dim);
-			bset = add_bound(bset, data, set, i, set->p[i]->eq[j]);
-		}
-	}
-	for (j = 0; j < set->p[i]->n_ineq; ++j)
-		bset = add_bound(bset, data, set, i, set->p[i]->ineq[j]);
-	return bset;
-}
-
-/* Compute a superset of the convex hull of set that is described
- * by only translates of the constraints in the constituents of set.
- */
-static struct isl_basic_set *uset_simple_hull(struct isl_set *set)
-{
-	struct sh_data *data = NULL;
-	struct isl_basic_set *hull = NULL;
-	unsigned n_ineq;
-	int i;
-
-	if (!set)
-		return NULL;
-
-	n_ineq = 0;
-	for (i = 0; i < set->n; ++i) {
-		if (!set->p[i])
-			goto error;
-		n_ineq += 2 * set->p[i]->n_eq + set->p[i]->n_ineq;
-	}
-
-	hull = isl_basic_set_alloc_space(isl_space_copy(set->dim), 0, 0, n_ineq);
-	if (!hull)
-		goto error;
-
-	data = sh_data_alloc(set, n_ineq);
-	if (!data)
-		goto error;
-
-	for (i = 0; i < set->n; ++i)
-		hull = add_bounds(hull, data, set, i);
-
-	sh_data_free(data);
-	isl_set_free(set);
-
-	return hull;
-error:
-	sh_data_free(data);
-	isl_basic_set_free(hull);
-	isl_set_free(set);
-	return NULL;
-}
-
-/* Compute a superset of the convex hull of map that is described
- * by only translates of the constraints in the constituents of map.
- */
-struct isl_basic_map *isl_map_simple_hull(struct isl_map *map)
-{
-	struct isl_set *set = NULL;
-	struct isl_basic_map *model = NULL;
-	struct isl_basic_map *hull;
-	struct isl_basic_map *affine_hull;
-	struct isl_basic_set *bset = NULL;
-
-	if (!map)
-		return NULL;
-	if (map->n == 0) {
-		hull = isl_basic_map_empty_like_map(map);
-		isl_map_free(map);
-		return hull;
-	}
-	if (map->n == 1) {
-		hull = isl_basic_map_copy(map->p[0]);
-		isl_map_free(map);
-		return hull;
-	}
-
-	map = isl_map_detect_equalities(map);
-	affine_hull = isl_map_affine_hull(isl_map_copy(map));
-	map = isl_map_align_divs(map);
-	model = isl_basic_map_copy(map->p[0]);
-
-	set = isl_map_underlying_set(map);
-
-	bset = uset_simple_hull(set);
-
-	hull = isl_basic_map_overlying_set(bset, model);
-
-	hull = isl_basic_map_intersect(hull, affine_hull);
-	hull = isl_basic_map_remove_redundancies(hull);
-	ISL_F_SET(hull, ISL_BASIC_MAP_NO_IMPLICIT);
-	ISL_F_SET(hull, ISL_BASIC_MAP_ALL_EQUALITIES);
-
-	return hull;
-}
-
-struct isl_basic_set *isl_set_simple_hull(struct isl_set *set)
-{
-	return (struct isl_basic_set *)
-		isl_map_simple_hull((struct isl_map *)set);
-}
-
-/* Given a set "set", return parametric bounds on the dimension "dim".
- */
-static struct isl_basic_set *set_bounds(struct isl_set *set, int dim)
-{
-	unsigned set_dim = isl_set_dim(set, isl_dim_set);
-	set = isl_set_copy(set);
-	set = isl_set_eliminate_dims(set, dim + 1, set_dim - (dim + 1));
-	set = isl_set_eliminate_dims(set, 0, dim);
-	return isl_set_convex_hull(set);
-}
-
-/* Computes a "simple hull" and then check if each dimension in the
- * resulting hull is bounded by a symbolic constant.  If not, the
- * hull is intersected with the corresponding bounds on the whole set.
- */
-struct isl_basic_set *isl_set_bounded_simple_hull(struct isl_set *set)
-{
-	int i, j;
-	struct isl_basic_set *hull;
-	unsigned nparam, left;
-	int removed_divs = 0;
-
-	hull = isl_set_simple_hull(isl_set_copy(set));
-	if (!hull)
-		goto error;
-
-	nparam = isl_basic_set_dim(hull, isl_dim_param);
-	for (i = 0; i < isl_basic_set_dim(hull, isl_dim_set); ++i) {
-		int lower = 0, upper = 0;
-		struct isl_basic_set *bounds;
-
-		left = isl_basic_set_total_dim(hull) - nparam - i - 1;
-		for (j = 0; j < hull->n_eq; ++j) {
-			if (isl_int_is_zero(hull->eq[j][1 + nparam + i]))
-				continue;
-			if (isl_seq_first_non_zero(hull->eq[j]+1+nparam+i+1,
-						    left) == -1)
-				break;
-		}
-		if (j < hull->n_eq)
-			continue;
-
-		for (j = 0; j < hull->n_ineq; ++j) {
-			if (isl_int_is_zero(hull->ineq[j][1 + nparam + i]))
-				continue;
-			if (isl_seq_first_non_zero(hull->ineq[j]+1+nparam+i+1,
-						    left) != -1 ||
-			    isl_seq_first_non_zero(hull->ineq[j]+1+nparam,
-						    i) != -1)
-				continue;
-			if (isl_int_is_pos(hull->ineq[j][1 + nparam + i]))
-				lower = 1;
-			else
-				upper = 1;
-			if (lower && upper)
-				break;
-		}
-
-		if (lower && upper)
-			continue;
-
-		if (!removed_divs) {
-			set = isl_set_remove_divs(set);
-			if (!set)
-				goto error;
-			removed_divs = 1;
-		}
-		bounds = set_bounds(set, i);
-		hull = isl_basic_set_intersect(hull, bounds);
-		if (!hull)
-			goto error;
-	}
-
-	isl_set_free(set);
-	return hull;
-error:
-	isl_set_free(set);
-	return NULL;
-}
diff --git a/cloog-0.17.0/isl/isl_ctx.c b/cloog-0.17.0/isl/isl_ctx.c
deleted file mode 100644
index 6f99950..0000000
--- a/cloog-0.17.0/isl/isl_ctx.c
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl/vec.h>
-#include <isl/options.h>
-
-void isl_handle_error(isl_ctx *ctx, int errno, const char *msg,
-	const char *file, int line)
-{
-	isl_ctx_set_error(ctx, errno);
-
-	switch (isl_options_get_on_error(ctx)) {
-	case ISL_ON_ERROR_WARN:
-		fprintf(stderr, "%s:%d: %s\n", file, line, msg);
-		return;
-	case ISL_ON_ERROR_CONTINUE:
-		return;
-	case ISL_ON_ERROR_ABORT:
-		fprintf(stderr, "%s:%d: %s\n", file, line, msg);
-		abort();
-		return;
-	}
-}
-
-static struct isl_options *find_nested_options(struct isl_args *args,
-	void *opt, struct isl_args *wanted)
-{
-	int i;
-	struct isl_options *options;
-
-	if (args == wanted)
-		return opt;
-
-	for (i = 0; args->args[i].type != isl_arg_end; ++i) {
-		if (args->args[i].type != isl_arg_child)
-			continue;
-		options = find_nested_options(args->args[i].u.child.child,
-			    *(void **)(((char *)opt) + args->args[i].offset),
-			    wanted);
-		if (options)
-			return options;
-	}
-
-	return NULL;
-}
-
-static struct isl_options *find_nested_isl_options(struct isl_args *args,
-	void *opt)
-{
-	return find_nested_options(args, opt, &isl_options_args);
-}
-
-void *isl_ctx_peek_options(isl_ctx *ctx, struct isl_args *args)
-{
-	if (!ctx)
-		return NULL;
-	return find_nested_options(ctx->user_args, ctx->user_opt, args);
-}
-
-isl_ctx *isl_ctx_alloc_with_options(struct isl_args *args, void *user_opt)
-{
-	struct isl_ctx *ctx = NULL;
-	struct isl_options *opt = NULL;
-	int opt_allocated = 0;
-
-	if (!user_opt)
-		return NULL;
-
-	opt = find_nested_isl_options(args, user_opt);
-	if (!opt) {
-		opt = isl_options_new_with_defaults();
-		if (!opt)
-			goto error;
-		opt_allocated = 1;
-	}
-
-	ctx = isl_calloc_type(NULL, struct isl_ctx);
-	if (!ctx)
-		goto error;
-
-	if (isl_hash_table_init(ctx, &ctx->id_table, 0))
-		goto error;
-
-	ctx->stats = isl_calloc_type(ctx, struct isl_stats);
-	if (!ctx->stats)
-		goto error;
-
-	ctx->user_args = args;
-	ctx->user_opt = user_opt;
-	ctx->opt_allocated = opt_allocated;
-	ctx->opt = opt;
-	ctx->ref = 0;
-
-	isl_int_init(ctx->zero);
-	isl_int_set_si(ctx->zero, 0);
-
-	isl_int_init(ctx->one);
-	isl_int_set_si(ctx->one, 1);
-
-	isl_int_init(ctx->two);
-	isl_int_set_si(ctx->two, 2);
-
-	isl_int_init(ctx->negone);
-	isl_int_set_si(ctx->negone, -1);
-
-	isl_int_init(ctx->normalize_gcd);
-
-	ctx->n_cached = 0;
-	ctx->n_miss = 0;
-
-	ctx->error = isl_error_none;
-
-	return ctx;
-error:
-	isl_args_free(args, user_opt);
-	if (opt_allocated)
-		isl_options_free(opt);
-	free(ctx);
-	return NULL;
-}
-
-struct isl_ctx *isl_ctx_alloc()
-{
-	struct isl_options *opt;
-
-	opt = isl_options_new_with_defaults();
-
-	return isl_ctx_alloc_with_options(&isl_options_args, opt);
-}
-
-void isl_ctx_ref(struct isl_ctx *ctx)
-{
-	ctx->ref++;
-}
-
-void isl_ctx_deref(struct isl_ctx *ctx)
-{
-	isl_assert(ctx, ctx->ref > 0, return);
-	ctx->ref--;
-}
-
-void isl_ctx_free(struct isl_ctx *ctx)
-{
-	if (!ctx)
-		return;
-	if (ctx->ref != 0)
-		isl_die(ctx, isl_error_invalid,
-			"isl_ctx freed, but some objects still reference it",
-			return);
-
-	isl_hash_table_clear(&ctx->id_table);
-	isl_blk_clear_cache(ctx);
-	isl_int_clear(ctx->zero);
-	isl_int_clear(ctx->one);
-	isl_int_clear(ctx->two);
-	isl_int_clear(ctx->negone);
-	isl_int_clear(ctx->normalize_gcd);
-	isl_args_free(ctx->user_args, ctx->user_opt);
-	if (ctx->opt_allocated)
-		free(ctx->opt);
-	free(ctx->stats);
-	free(ctx);
-}
-
-struct isl_options *isl_ctx_options(isl_ctx *ctx)
-{
-	if (!ctx)
-		return NULL;
-	return ctx->opt;
-}
-
-enum isl_error isl_ctx_last_error(isl_ctx *ctx)
-{
-	return ctx->error;
-}
-
-void isl_ctx_reset_error(isl_ctx *ctx)
-{
-	ctx->error = isl_error_none;
-}
-
-void isl_ctx_set_error(isl_ctx *ctx, enum isl_error error)
-{
-	if (ctx)
-		ctx->error = error;
-}
-
-void isl_ctx_abort(isl_ctx *ctx)
-{
-	if (ctx)
-		ctx->abort = 1;
-}
-
-void isl_ctx_resume(isl_ctx *ctx)
-{
-	if (ctx)
-		ctx->abort = 0;
-}
-
-int isl_ctx_aborted(isl_ctx *ctx)
-{
-	return ctx ? ctx->abort : -1;
-}
-
-int isl_ctx_parse_options(isl_ctx *ctx, int argc, char **argv, unsigned flags)
-{
-	if (!ctx)
-		return -1;
-	return isl_args_parse(ctx->user_args, argc, argv, ctx->user_opt, flags);
-}
diff --git a/cloog-0.17.0/isl/isl_ctx_private.h b/cloog-0.17.0/isl/isl_ctx_private.h
deleted file mode 100644
index 65267f8..0000000
--- a/cloog-0.17.0/isl/isl_ctx_private.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <isl/ctx.h>
-
-struct isl_ctx {
-	int			ref;
-
-	struct isl_stats	*stats;
-
-	int			 opt_allocated;
-	struct isl_options	*opt;
-	void			*user_opt;
-	struct isl_args		*user_args;
-
-	isl_int			zero;
-	isl_int			one;
-	isl_int			two;
-	isl_int			negone;
-
-	isl_int			normalize_gcd;
-
-	int			n_cached;
-	int			n_miss;
-	struct isl_blk		cache[ISL_BLK_CACHE_SIZE];
-	struct isl_hash_table	id_table;
-
-	enum isl_error		error;
-
-	int			abort;
-};
diff --git a/cloog-0.17.0/isl/isl_dim.c b/cloog-0.17.0/isl/isl_dim.c
deleted file mode 100644
index 914d666..0000000
--- a/cloog-0.17.0/isl/isl_dim.c
+++ /dev/null
@@ -1,258 +0,0 @@
-#include <isl/dim.h>
-#include <isl/aff.h>
-#include <isl/map.h>
-#include <isl/set.h>
-#include <isl/polynomial.h>
-
-isl_ctx *isl_dim_get_ctx(__isl_keep isl_space *dim)
-{
-	return isl_space_get_ctx(dim);
-}
-
-__isl_give isl_space *isl_dim_alloc(isl_ctx *ctx,
-	unsigned nparam, unsigned n_in, unsigned n_out)
-{
-	return isl_space_alloc(ctx, nparam, n_in, n_out);
-}
-__isl_give isl_space *isl_dim_set_alloc(isl_ctx *ctx,
-	unsigned nparam, unsigned dim)
-{
-	return isl_space_set_alloc(ctx, nparam, dim);
-}
-__isl_give isl_space *isl_dim_copy(__isl_keep isl_space *dim)
-{
-	return isl_space_copy(dim);
-}
-void isl_dim_free(__isl_take isl_space *dim)
-{
-	isl_space_free(dim);
-}
-
-unsigned isl_dim_size(__isl_keep isl_space *dim, enum isl_dim_type type)
-{
-	return isl_space_dim(dim, type);
-}
-
-__isl_give isl_space *isl_dim_set_dim_id(__isl_take isl_space *dim,
-	enum isl_dim_type type, unsigned pos, __isl_take isl_id *id)
-{
-	return isl_space_set_dim_id(dim, type, pos, id);
-}
-int isl_dim_has_dim_id(__isl_keep isl_space *dim,
-	enum isl_dim_type type, unsigned pos)
-{
-	return isl_space_has_dim_id(dim, type, pos);
-}
-__isl_give isl_id *isl_dim_get_dim_id(__isl_keep isl_space *dim,
-	enum isl_dim_type type, unsigned pos)
-{
-	return isl_space_get_dim_id(dim, type, pos);
-}
-
-int isl_dim_find_dim_by_id(__isl_keep isl_space *dim,
-	enum isl_dim_type type, __isl_keep isl_id *id)
-{
-	return isl_space_find_dim_by_id(dim, type, id);
-}
-
-__isl_give isl_space *isl_dim_set_tuple_id(__isl_take isl_space *dim,
-	enum isl_dim_type type, __isl_take isl_id *id)
-{
-	return isl_space_set_tuple_id(dim, type, id);
-}
-__isl_give isl_space *isl_dim_reset_tuple_id(__isl_take isl_space *dim,
-	enum isl_dim_type type)
-{
-	return isl_space_reset_tuple_id(dim, type);
-}
-int isl_dim_has_tuple_id(__isl_keep isl_space *dim, enum isl_dim_type type)
-{
-	return isl_space_has_tuple_id(dim, type);
-}
-__isl_give isl_id *isl_dim_get_tuple_id(__isl_keep isl_space *dim,
-	enum isl_dim_type type)
-{
-	return isl_space_get_tuple_id(dim, type);
-}
-
-__isl_give isl_space *isl_dim_set_name(__isl_take isl_space *dim,
-	enum isl_dim_type type, unsigned pos, __isl_keep const char *name)
-{
-	return isl_space_set_dim_name(dim, type, pos, name);
-}
-__isl_keep const char *isl_dim_get_name(__isl_keep isl_space *dim,
-	enum isl_dim_type type, unsigned pos)
-{
-	return isl_space_get_dim_name(dim, type, pos);
-}
-
-__isl_give isl_space *isl_dim_set_tuple_name(__isl_take isl_space *dim,
-	enum isl_dim_type type, const char *s)
-{
-	return isl_space_set_tuple_name(dim, type, s);
-}
-const char *isl_dim_get_tuple_name(__isl_keep isl_space *dim,
-	enum isl_dim_type type)
-{
-	return isl_space_get_tuple_name(dim, type);
-}
-
-int isl_dim_is_wrapping(__isl_keep isl_space *dim)
-{
-	return isl_space_is_wrapping(dim);
-}
-__isl_give isl_space *isl_dim_wrap(__isl_take isl_space *dim)
-{
-	return isl_space_wrap(dim);
-}
-__isl_give isl_space *isl_dim_unwrap(__isl_take isl_space *dim)
-{
-	return isl_space_unwrap(dim);
-}
-
-__isl_give isl_space *isl_dim_domain(__isl_take isl_space *dim)
-{
-	return isl_space_domain(dim);
-}
-__isl_give isl_space *isl_dim_from_domain(__isl_take isl_space *dim)
-{
-	return isl_space_from_domain(dim);
-}
-__isl_give isl_space *isl_dim_range(__isl_take isl_space *dim)
-{
-	return isl_space_range(dim);
-}
-__isl_give isl_space *isl_dim_from_range(__isl_take isl_space *dim)
-{
-	return isl_space_from_range(dim);
-}
-__isl_give isl_space *isl_dim_reverse(__isl_take isl_space *dim)
-{
-	return isl_space_reverse(dim);
-}
-__isl_give isl_space *isl_dim_join(__isl_take isl_space *left,
-	__isl_take isl_space *right)
-{
-	return isl_space_join(left, right);
-}
-__isl_give isl_space *isl_dim_align_params(__isl_take isl_space *dim1,
-	__isl_take isl_space *dim2)
-{
-	return isl_space_align_params(dim1, dim2);
-}
-__isl_give isl_space *isl_dim_insert(__isl_take isl_space *dim,
-	enum isl_dim_type type, unsigned pos, unsigned n)
-{
-	return isl_space_insert_dims(dim, type, pos, n);
-}
-__isl_give isl_space *isl_dim_add(__isl_take isl_space *dim,
-	enum isl_dim_type type, unsigned n)
-{
-	return isl_space_add_dims(dim, type, n);
-}
-__isl_give isl_space *isl_dim_drop(__isl_take isl_space *dim,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	return isl_space_drop_dims(dim, type, first, n);
-}
-__isl_give isl_space *isl_dim_move(__isl_take isl_space *dim,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n)
-{
-	return isl_space_move_dims(dim, dst_type, dst_pos, src_type, src_pos, n);
-}
-__isl_give isl_space *isl_dim_map_from_set(__isl_take isl_space *dim)
-{
-	return isl_space_map_from_set(dim);
-}
-__isl_give isl_space *isl_dim_zip(__isl_take isl_space *dim)
-{
-	return isl_space_zip(dim);
-}
-
-__isl_give isl_local_space *isl_local_space_from_dim(
-	__isl_take isl_space *dim)
-{
-	return isl_local_space_from_space(dim);
-}
-__isl_give isl_space *isl_local_space_get_dim(
-	__isl_keep isl_local_space *ls)
-{
-	return isl_local_space_get_space(ls);
-}
-
-__isl_give isl_space *isl_aff_get_dim(__isl_keep isl_aff *aff)
-{
-	return isl_aff_get_space(aff);
-}
-__isl_give isl_space *isl_pw_aff_get_dim(__isl_keep isl_pw_aff *pwaff)
-{
-	return isl_pw_aff_get_space(pwaff);
-}
-
-__isl_give isl_space *isl_constraint_get_dim(
-	__isl_keep isl_constraint *constraint)
-{
-	return isl_constraint_get_space(constraint);
-}
-
-__isl_give isl_space *isl_basic_map_get_dim(__isl_keep isl_basic_map *bmap)
-{
-	return isl_basic_map_get_space(bmap);
-}
-__isl_give isl_space *isl_map_get_dim(__isl_keep isl_map *map)
-{
-	return isl_map_get_space(map);
-}
-__isl_give isl_space *isl_union_map_get_dim(__isl_keep isl_union_map *umap)
-{
-	return isl_union_map_get_space(umap);
-}
-
-__isl_give isl_space *isl_basic_set_get_dim(__isl_keep isl_basic_set *bset)
-{
-	return isl_basic_set_get_space(bset);
-}
-__isl_give isl_space *isl_set_get_dim(__isl_keep isl_set *set)
-{
-	return isl_set_get_space(set);
-}
-__isl_give isl_space *isl_union_set_get_dim(__isl_keep isl_union_set *uset)
-{
-	return isl_union_set_get_space(uset);
-}
-
-__isl_give isl_space *isl_point_get_dim(__isl_keep isl_point *pnt)
-{
-	return isl_point_get_space(pnt);
-}
-
-__isl_give isl_space *isl_qpolynomial_get_dim(__isl_keep isl_qpolynomial *qp)
-{
-	return isl_qpolynomial_get_space(qp);
-}
-__isl_give isl_space *isl_pw_qpolynomial_get_dim(
-	__isl_keep isl_pw_qpolynomial *pwqp)
-{
-	return isl_pw_qpolynomial_get_space(pwqp);
-}
-__isl_give isl_space *isl_qpolynomial_fold_get_dim(
-	__isl_keep isl_qpolynomial_fold *fold)
-{
-	return isl_qpolynomial_fold_get_space(fold);
-}
-__isl_give isl_space *isl_pw_qpolynomial_fold_get_dim(
-	__isl_keep isl_pw_qpolynomial_fold *pwf)
-{
-	return isl_pw_qpolynomial_fold_get_space(pwf);
-}
-__isl_give isl_space *isl_union_pw_qpolynomial_get_dim(
-	__isl_keep isl_union_pw_qpolynomial *upwqp)
-{
-	return isl_union_pw_qpolynomial_get_space(upwqp);
-}
-__isl_give isl_space *isl_union_pw_qpolynomial_fold_get_dim(
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf)
-{
-	return isl_union_pw_qpolynomial_fold_get_space(upwf);
-}
diff --git a/cloog-0.17.0/isl/isl_dim_map.c b/cloog-0.17.0/isl/isl_dim_map.c
deleted file mode 100644
index 37da3d4..0000000
--- a/cloog-0.17.0/isl/isl_dim_map.c
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2010-2011 INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France 
- */
-
-#include <isl_map_private.h>
-#include <isl_space_private.h>
-#include <isl_dim_map.h>
-#include <isl_reordering.h>
-
-struct isl_dim_map_entry {
-	int pos;
-	int sgn;
-};
-
-/* Maps dst positions to src positions */
-struct isl_dim_map {
-	unsigned len;
-	struct isl_dim_map_entry m[1];
-};
-
-__isl_give isl_dim_map *isl_dim_map_alloc(isl_ctx *ctx, unsigned len)
-{
-	int i;
-	struct isl_dim_map *dim_map;
-	dim_map = isl_alloc(ctx, struct isl_dim_map,
-	    sizeof(struct isl_dim_map) + len * sizeof(struct isl_dim_map_entry));
-	if (!dim_map)
-		return NULL;
-	dim_map->len = 1 + len;
-	dim_map->m[0].pos = 0;
-	dim_map->m[0].sgn = 1;
-	for (i = 0; i < len; ++i)
-		dim_map->m[1 + i].sgn = 0;
-	return dim_map;
-}
-
-void isl_dim_map_range(__isl_keep isl_dim_map *dim_map,
-	unsigned dst_pos, unsigned dst_stride,
-	unsigned src_pos, unsigned src_stride,
-	unsigned n, int sign)
-{
-	int i;
-
-	if (!dim_map)
-		return;
-
-	for (i = 0; i < n; ++i) {
-		unsigned d = 1 + dst_pos + dst_stride * i;
-		unsigned s = 1 + src_pos + src_stride * i;
-		dim_map->m[d].pos = s;
-		dim_map->m[d].sgn = sign;
-	}
-}
-
-void isl_dim_map_dim_range(__isl_keep isl_dim_map *dim_map,
-	__isl_keep isl_space *dim, enum isl_dim_type type,
-	unsigned first, unsigned n, unsigned dst_pos)
-{
-	int i;
-	unsigned src_pos;
-
-	if (!dim_map || !dim)
-		return;
-	
-	src_pos = 1 + isl_space_offset(dim, type);
-	for (i = 0; i < n; ++i) {
-		dim_map->m[1 + dst_pos + i].pos = src_pos + first + i;
-		dim_map->m[1 + dst_pos + i].sgn = 1;
-	}
-}
-
-void isl_dim_map_dim(__isl_keep isl_dim_map *dim_map, __isl_keep isl_space *dim,
-	enum isl_dim_type type, unsigned dst_pos)
-{
-	isl_dim_map_dim_range(dim_map, dim, type,
-			      0, isl_space_dim(dim, type), dst_pos);
-}
-
-void isl_dim_map_div(__isl_keep isl_dim_map *dim_map,
-	__isl_keep isl_basic_map *bmap, unsigned dst_pos)
-{
-	int i;
-	unsigned src_pos;
-
-	if (!dim_map || !bmap)
-		return;
-	
-	src_pos = 1 + isl_space_dim(bmap->dim, isl_dim_all);
-	for (i = 0; i < bmap->n_div; ++i) {
-		dim_map->m[1 + dst_pos + i].pos = src_pos + i;
-		dim_map->m[1 + dst_pos + i].sgn = 1;
-	}
-}
-
-void isl_dim_map_dump(struct isl_dim_map *dim_map)
-{
-	int i;
-
-	for (i = 0; i < dim_map->len; ++i)
-		fprintf(stderr, "%d -> %d * %d; ", i,
-			dim_map->m[i].sgn, dim_map->m[i].pos);
-	fprintf(stderr, "\n");
-}
-
-static void copy_constraint_dim_map(isl_int *dst, isl_int *src,
-					struct isl_dim_map *dim_map)
-{
-	int i;
-
-	for (i = 0; i < dim_map->len; ++i) {
-		if (dim_map->m[i].sgn == 0)
-			isl_int_set_si(dst[i], 0);
-		else if (dim_map->m[i].sgn > 0)
-			isl_int_set(dst[i], src[dim_map->m[i].pos]);
-		else
-			isl_int_neg(dst[i], src[dim_map->m[i].pos]);
-	}
-}
-
-static void copy_div_dim_map(isl_int *dst, isl_int *src,
-					struct isl_dim_map *dim_map)
-{
-	isl_int_set(dst[0], src[0]);
-	copy_constraint_dim_map(dst+1, src+1, dim_map);
-}
-
-__isl_give isl_basic_map *isl_basic_map_add_constraints_dim_map(
-	__isl_take isl_basic_map *dst, __isl_take isl_basic_map *src,
-	__isl_take isl_dim_map *dim_map)
-{
-	int i;
-
-	if (!src || !dst || !dim_map)
-		goto error;
-
-	for (i = 0; i < src->n_eq; ++i) {
-		int i1 = isl_basic_map_alloc_equality(dst);
-		if (i1 < 0)
-			goto error;
-		copy_constraint_dim_map(dst->eq[i1], src->eq[i], dim_map);
-	}
-
-	for (i = 0; i < src->n_ineq; ++i) {
-		int i1 = isl_basic_map_alloc_inequality(dst);
-		if (i1 < 0)
-			goto error;
-		copy_constraint_dim_map(dst->ineq[i1], src->ineq[i], dim_map);
-	}
-
-	for (i = 0; i < src->n_div; ++i) {
-		int i1 = isl_basic_map_alloc_div(dst);
-		if (i1 < 0)
-			goto error;
-		copy_div_dim_map(dst->div[i1], src->div[i], dim_map);
-	}
-
-	free(dim_map);
-	isl_basic_map_free(src);
-
-	return dst;
-error:
-	free(dim_map);
-	isl_basic_map_free(src);
-	isl_basic_map_free(dst);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_add_constraints_dim_map(
-	__isl_take isl_basic_set *dst, __isl_take isl_basic_set *src,
-	__isl_take isl_dim_map *dim_map)
-{
-	return isl_basic_map_add_constraints_dim_map(dst, src, dim_map);
-}
-
-/* Extend the given dim_map with mappings for the divs in bmap.
- */
-__isl_give isl_dim_map *isl_dim_map_extend(__isl_keep isl_dim_map *dim_map,
-	__isl_keep isl_basic_map *bmap)
-{
-	int i;
-	struct isl_dim_map *res;
-	int offset;
-
-	offset = isl_basic_map_offset(bmap, isl_dim_div);
-
-	res = isl_dim_map_alloc(bmap->ctx, dim_map->len - 1 + bmap->n_div);
-	if (!res)
-		return NULL;
-
-	for (i = 0; i < dim_map->len; ++i)
-		res->m[i] = dim_map->m[i];
-	for (i = 0; i < bmap->n_div; ++i) {
-		res->m[dim_map->len + i].pos = offset + i;
-		res->m[dim_map->len + i].sgn = 1;
-	}
-
-	return res;
-}
-
-/* Extract a dim_map from a reordering.
- * We essentially need to reverse the mapping, and add an offset
- * of 1 for the constant term.
- */
-__isl_give isl_dim_map *isl_dim_map_from_reordering(
-	__isl_keep isl_reordering *exp)
-{
-	int i;
-	isl_ctx *ctx;
-	struct isl_dim_map *dim_map;
-
-	if (!exp)
-		return NULL;
-
-	ctx = isl_space_get_ctx(exp->dim);
-	dim_map = isl_dim_map_alloc(ctx, isl_space_dim(exp->dim, isl_dim_all));
-	if (!dim_map)
-		return NULL;
-
-	for (i = 0; i < exp->len; ++i) {
-		dim_map->m[1 + exp->pos[i]].pos = 1 + i;
-		dim_map->m[1 + exp->pos[i]].sgn = 1;
-	}
-
-	return dim_map;
-}
diff --git a/cloog-0.17.0/isl/isl_dim_map.h b/cloog-0.17.0/isl/isl_dim_map.h
deleted file mode 100644
index 0f988c3..0000000
--- a/cloog-0.17.0/isl/isl_dim_map.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef ISL_DIM_MAP_H
-#define ISL_DIM_MAP_H
-
-#include <isl/ctx.h>
-#include <isl/space.h>
-#include <isl/map.h>
-
-struct isl_dim_map;
-typedef struct isl_dim_map isl_dim_map;
-
-__isl_give isl_dim_map *isl_dim_map_alloc(isl_ctx *ctx, unsigned len);
-void isl_dim_map_range(__isl_keep isl_dim_map *dim_map,
-	unsigned dst_pos, unsigned dst_stride,
-	unsigned src_pos, unsigned src_stride,
-	unsigned n, int sign);
-void isl_dim_map_dim_range(__isl_keep isl_dim_map *dim_map,
-	isl_space *dim, enum isl_dim_type type,
-	unsigned first, unsigned n, unsigned dst_pos);
-void isl_dim_map_dim(__isl_keep isl_dim_map *dim_map, __isl_keep isl_space *dim,
-	enum isl_dim_type type, unsigned dst_pos);
-void isl_dim_map_div(__isl_keep isl_dim_map *dim_map,
-	__isl_keep isl_basic_map *bmap, unsigned dst_pos);
-__isl_give isl_basic_set *isl_basic_set_add_constraints_dim_map(
-	__isl_take isl_basic_set *dst, __isl_take isl_basic_set *src,
-	__isl_take isl_dim_map *dim_map);
-__isl_give isl_basic_map *isl_basic_map_add_constraints_dim_map(
-	__isl_take isl_basic_map *dst, __isl_take isl_basic_map *src,
-	__isl_take isl_dim_map *dim_map);
-
-__isl_give isl_dim_map *isl_dim_map_extend(__isl_keep isl_dim_map *dim_map,
-	__isl_keep isl_basic_map *bmap);
-
-__isl_give isl_dim_map *isl_dim_map_from_reordering(
-	__isl_keep isl_reordering *exp);
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_equalities.c b/cloog-0.17.0/isl/isl_equalities.c
deleted file mode 100644
index 68d2c89..0000000
--- a/cloog-0.17.0/isl/isl_equalities.c
+++ /dev/null
@@ -1,697 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_mat_private.h>
-#include <isl/seq.h>
-#include "isl_map_private.h"
-#include "isl_equalities.h"
-
-/* Given a set of modulo constraints
- *
- *		c + A y = 0 mod d
- *
- * this function computes a particular solution y_0
- *
- * The input is given as a matrix B = [ c A ] and a vector d.
- *
- * The output is matrix containing the solution y_0 or
- * a zero-column matrix if the constraints admit no integer solution.
- *
- * The given set of constrains is equivalent to
- *
- *		c + A y = -D x
- *
- * with D = diag d and x a fresh set of variables.
- * Reducing both c and A modulo d does not change the
- * value of y in the solution and may lead to smaller coefficients.
- * Let M = [ D A ] and [ H 0 ] = M U, the Hermite normal form of M.
- * Then
- *		  [ x ]
- *		M [ y ] = - c
- * and so
- *		               [ x ]
- *		[ H 0 ] U^{-1} [ y ] = - c
- * Let
- *		[ A ]          [ x ]
- *		[ B ] = U^{-1} [ y ]
- * then
- *		H A + 0 B = -c
- *
- * so B may be chosen arbitrarily, e.g., B = 0, and then
- *
- *		       [ x ] = [ -c ]
- *		U^{-1} [ y ] = [  0 ]
- * or
- *		[ x ]     [ -c ]
- *		[ y ] = U [  0 ]
- * specifically,
- *
- *		y = U_{2,1} (-c)
- *
- * If any of the coordinates of this y are non-integer
- * then the constraints admit no integer solution and
- * a zero-column matrix is returned.
- */
-static struct isl_mat *particular_solution(struct isl_mat *B, struct isl_vec *d)
-{
-	int i, j;
-	struct isl_mat *M = NULL;
-	struct isl_mat *C = NULL;
-	struct isl_mat *U = NULL;
-	struct isl_mat *H = NULL;
-	struct isl_mat *cst = NULL;
-	struct isl_mat *T = NULL;
-
-	M = isl_mat_alloc(B->ctx, B->n_row, B->n_row + B->n_col - 1);
-	C = isl_mat_alloc(B->ctx, 1 + B->n_row, 1);
-	if (!M || !C)
-		goto error;
-	isl_int_set_si(C->row[0][0], 1);
-	for (i = 0; i < B->n_row; ++i) {
-		isl_seq_clr(M->row[i], B->n_row);
-		isl_int_set(M->row[i][i], d->block.data[i]);
-		isl_int_neg(C->row[1 + i][0], B->row[i][0]);
-		isl_int_fdiv_r(C->row[1+i][0], C->row[1+i][0], M->row[i][i]);
-		for (j = 0; j < B->n_col - 1; ++j)
-			isl_int_fdiv_r(M->row[i][B->n_row + j],
-					B->row[i][1 + j], M->row[i][i]);
-	}
-	M = isl_mat_left_hermite(M, 0, &U, NULL);
-	if (!M || !U)
-		goto error;
-	H = isl_mat_sub_alloc(M, 0, B->n_row, 0, B->n_row);
-	H = isl_mat_lin_to_aff(H);
-	C = isl_mat_inverse_product(H, C);
-	if (!C)
-		goto error;
-	for (i = 0; i < B->n_row; ++i) {
-		if (!isl_int_is_divisible_by(C->row[1+i][0], C->row[0][0]))
-			break;
-		isl_int_divexact(C->row[1+i][0], C->row[1+i][0], C->row[0][0]);
-	}
-	if (i < B->n_row)
-		cst = isl_mat_alloc(B->ctx, B->n_row, 0);
-	else
-		cst = isl_mat_sub_alloc(C, 1, B->n_row, 0, 1);
-	T = isl_mat_sub_alloc(U, B->n_row, B->n_col - 1, 0, B->n_row);
-	cst = isl_mat_product(T, cst);
-	isl_mat_free(M);
-	isl_mat_free(C);
-	isl_mat_free(U);
-	return cst;
-error:
-	isl_mat_free(M);
-	isl_mat_free(C);
-	isl_mat_free(U);
-	return NULL;
-}
-
-/* Compute and return the matrix
- *
- *		U_1^{-1} diag(d_1, 1, ..., 1)
- *
- * with U_1 the unimodular completion of the first (and only) row of B.
- * The columns of this matrix generate the lattice that satisfies
- * the single (linear) modulo constraint.
- */
-static struct isl_mat *parameter_compression_1(
-			struct isl_mat *B, struct isl_vec *d)
-{
-	struct isl_mat *U;
-
-	U = isl_mat_alloc(B->ctx, B->n_col - 1, B->n_col - 1);
-	if (!U)
-		return NULL;
-	isl_seq_cpy(U->row[0], B->row[0] + 1, B->n_col - 1);
-	U = isl_mat_unimodular_complete(U, 1);
-	U = isl_mat_right_inverse(U);
-	if (!U)
-		return NULL;
-	isl_mat_col_mul(U, 0, d->block.data[0], 0);
-	U = isl_mat_lin_to_aff(U);
-	return U;
-}
-
-/* Compute a common lattice of solutions to the linear modulo
- * constraints specified by B and d.
- * See also the documentation of isl_mat_parameter_compression.
- * We put the matrix
- * 
- *		A = [ L_1^{-T} L_2^{-T} ... L_k^{-T} ]
- *
- * on a common denominator.  This denominator D is the lcm of modulos d.
- * Since L_i = U_i^{-1} diag(d_i, 1, ... 1), we have
- * L_i^{-T} = U_i^T diag(d_i, 1, ... 1)^{-T} = U_i^T diag(1/d_i, 1, ..., 1).
- * Putting this on the common denominator, we have
- * D * L_i^{-T} = U_i^T diag(D/d_i, D, ..., D).
- */
-static struct isl_mat *parameter_compression_multi(
-			struct isl_mat *B, struct isl_vec *d)
-{
-	int i, j, k;
-	isl_int D;
-	struct isl_mat *A = NULL, *U = NULL;
-	struct isl_mat *T;
-	unsigned size;
-
-	isl_int_init(D);
-
-	isl_vec_lcm(d, &D);
-
-	size = B->n_col - 1;
-	A = isl_mat_alloc(B->ctx, size, B->n_row * size);
-	U = isl_mat_alloc(B->ctx, size, size);
-	if (!U || !A)
-		goto error;
-	for (i = 0; i < B->n_row; ++i) {
-		isl_seq_cpy(U->row[0], B->row[i] + 1, size);
-		U = isl_mat_unimodular_complete(U, 1);
-		if (!U)
-			goto error;
-		isl_int_divexact(D, D, d->block.data[i]);
-		for (k = 0; k < U->n_col; ++k)
-			isl_int_mul(A->row[k][i*size+0], D, U->row[0][k]);
-		isl_int_mul(D, D, d->block.data[i]);
-		for (j = 1; j < U->n_row; ++j)
-			for (k = 0; k < U->n_col; ++k)
-				isl_int_mul(A->row[k][i*size+j],
-						D, U->row[j][k]);
-	}
-	A = isl_mat_left_hermite(A, 0, NULL, NULL);
-	T = isl_mat_sub_alloc(A, 0, A->n_row, 0, A->n_row);
-	T = isl_mat_lin_to_aff(T);
-	if (!T)
-		goto error;
-	isl_int_set(T->row[0][0], D);
-	T = isl_mat_right_inverse(T);
-	if (!T)
-		goto error;
-	isl_assert(T->ctx, isl_int_is_one(T->row[0][0]), goto error);
-	T = isl_mat_transpose(T);
-	isl_mat_free(A);
-	isl_mat_free(U);
-
-	isl_int_clear(D);
-	return T;
-error:
-	isl_mat_free(A);
-	isl_mat_free(U);
-	isl_int_clear(D);
-	return NULL;
-}
-
-/* Given a set of modulo constraints
- *
- *		c + A y = 0 mod d
- *
- * this function returns an affine transformation T,
- *
- *		y = T y'
- *
- * that bijectively maps the integer vectors y' to integer
- * vectors y that satisfy the modulo constraints.
- *
- * This function is inspired by Section 2.5.3
- * of B. Meister, "Stating and Manipulating Periodicity in the Polytope
- * Model.  Applications to Program Analysis and Optimization".
- * However, the implementation only follows the algorithm of that
- * section for computing a particular solution and not for computing
- * a general homogeneous solution.  The latter is incomplete and
- * may remove some valid solutions.
- * Instead, we use an adaptation of the algorithm in Section 7 of
- * B. Meister, S. Verdoolaege, "Polynomial Approximations in the Polytope
- * Model: Bringing the Power of Quasi-Polynomials to the Masses".
- *
- * The input is given as a matrix B = [ c A ] and a vector d.
- * Each element of the vector d corresponds to a row in B.
- * The output is a lower triangular matrix.
- * If no integer vector y satisfies the given constraints then
- * a matrix with zero columns is returned.
- *
- * We first compute a particular solution y_0 to the given set of
- * modulo constraints in particular_solution.  If no such solution
- * exists, then we return a zero-columned transformation matrix.
- * Otherwise, we compute the generic solution to
- *
- *		A y = 0 mod d
- *
- * That is we want to compute G such that
- *
- *		y = G y''
- *
- * with y'' integer, describes the set of solutions.
- *
- * We first remove the common factors of each row.
- * In particular if gcd(A_i,d_i) != 1, then we divide the whole
- * row i (including d_i) by this common factor.  If afterwards gcd(A_i) != 1,
- * then we divide this row of A by the common factor, unless gcd(A_i) = 0.
- * In the later case, we simply drop the row (in both A and d).
- *
- * If there are no rows left in A, then G is the identity matrix. Otherwise,
- * for each row i, we now determine the lattice of integer vectors
- * that satisfies this row.  Let U_i be the unimodular extension of the
- * row A_i.  This unimodular extension exists because gcd(A_i) = 1.
- * The first component of
- *
- *		y' = U_i y
- *
- * needs to be a multiple of d_i.  Let y' = diag(d_i, 1, ..., 1) y''.
- * Then,
- *
- *		y = U_i^{-1} diag(d_i, 1, ..., 1) y''
- *
- * for arbitrary integer vectors y''.  That is, y belongs to the lattice
- * generated by the columns of L_i = U_i^{-1} diag(d_i, 1, ..., 1).
- * If there is only one row, then G = L_1.
- *
- * If there is more than one row left, we need to compute the intersection
- * of the lattices.  That is, we need to compute an L such that
- *
- *		L = L_i L_i'	for all i
- *
- * with L_i' some integer matrices.  Let A be constructed as follows
- *
- *		A = [ L_1^{-T} L_2^{-T} ... L_k^{-T} ]
- *
- * and computed the Hermite Normal Form of A = [ H 0 ] U
- * Then,
- *
- *		L_i^{-T} = H U_{1,i}
- *
- * or
- *
- *		H^{-T} = L_i U_{1,i}^T
- *
- * In other words G = L = H^{-T}.
- * To ensure that G is lower triangular, we compute and use its Hermite
- * normal form.
- *
- * The affine transformation matrix returned is then
- *
- *		[  1   0  ]
- *		[ y_0  G  ]
- *
- * as any y = y_0 + G y' with y' integer is a solution to the original
- * modulo constraints.
- */
-struct isl_mat *isl_mat_parameter_compression(
-			struct isl_mat *B, struct isl_vec *d)
-{
-	int i;
-	struct isl_mat *cst = NULL;
-	struct isl_mat *T = NULL;
-	isl_int D;
-
-	if (!B || !d)
-		goto error;
-	isl_assert(B->ctx, B->n_row == d->size, goto error);
-	cst = particular_solution(B, d);
-	if (!cst)
-		goto error;
-	if (cst->n_col == 0) {
-		T = isl_mat_alloc(B->ctx, B->n_col, 0);
-		isl_mat_free(cst);
-		isl_mat_free(B);
-		isl_vec_free(d);
-		return T;
-	}
-	isl_int_init(D);
-	/* Replace a*g*row = 0 mod g*m by row = 0 mod m */
-	for (i = 0; i < B->n_row; ++i) {
-		isl_seq_gcd(B->row[i] + 1, B->n_col - 1, &D);
-		if (isl_int_is_one(D))
-			continue;
-		if (isl_int_is_zero(D)) {
-			B = isl_mat_drop_rows(B, i, 1);
-			d = isl_vec_cow(d);
-			if (!B || !d)
-				goto error2;
-			isl_seq_cpy(d->block.data+i, d->block.data+i+1,
-							d->size - (i+1));
-			d->size--;
-			i--;
-			continue;
-		}
-		B = isl_mat_cow(B);
-		if (!B)
-			goto error2;
-		isl_seq_scale_down(B->row[i] + 1, B->row[i] + 1, D, B->n_col-1);
-		isl_int_gcd(D, D, d->block.data[i]);
-		d = isl_vec_cow(d);
-		if (!d)
-			goto error2;
-		isl_int_divexact(d->block.data[i], d->block.data[i], D);
-	}
-	isl_int_clear(D);
-	if (B->n_row == 0)
-		T = isl_mat_identity(B->ctx, B->n_col);
-	else if (B->n_row == 1)
-		T = parameter_compression_1(B, d);
-	else
-		T = parameter_compression_multi(B, d);
-	T = isl_mat_left_hermite(T, 0, NULL, NULL);
-	if (!T)
-		goto error;
-	isl_mat_sub_copy(T->ctx, T->row + 1, cst->row, cst->n_row, 0, 0, 1);
-	isl_mat_free(cst);
-	isl_mat_free(B);
-	isl_vec_free(d);
-	return T;
-error2:
-	isl_int_clear(D);
-error:
-	isl_mat_free(cst);
-	isl_mat_free(B);
-	isl_vec_free(d);
-	return NULL;
-}
-
-/* Given a set of equalities
- *
- *		M x - c = 0
- *
- * this function computes a unimodular transformation from a lower-dimensional
- * space to the original space that bijectively maps the integer points x'
- * in the lower-dimensional space to the integer points x in the original
- * space that satisfy the equalities.
- *
- * The input is given as a matrix B = [ -c M ] and the output is a
- * matrix that maps [1 x'] to [1 x].
- * If T2 is not NULL, then *T2 is set to a matrix mapping [1 x] to [1 x'].
- *
- * First compute the (left) Hermite normal form of M,
- *
- *		M [U1 U2] = M U = H = [H1 0]
- * or
- *		              M = H Q = [H1 0] [Q1]
- *                                             [Q2]
- *
- * with U, Q unimodular, Q = U^{-1} (and H lower triangular).
- * Define the transformed variables as
- *
- *		x = [U1 U2] [ x1' ] = [U1 U2] [Q1] x
- *		            [ x2' ]           [Q2]
- *
- * The equalities then become
- *
- *		H1 x1' - c = 0   or   x1' = H1^{-1} c = c'
- *
- * If any of the c' is non-integer, then the original set has no
- * integer solutions (since the x' are a unimodular transformation
- * of the x) and a zero-column matrix is returned.
- * Otherwise, the transformation is given by
- *
- *		x = U1 H1^{-1} c + U2 x2'
- *
- * The inverse transformation is simply
- *
- *		x2' = Q2 x
- */
-struct isl_mat *isl_mat_variable_compression(struct isl_mat *B,
-	struct isl_mat **T2)
-{
-	int i;
-	struct isl_mat *H = NULL, *C = NULL, *H1, *U = NULL, *U1, *U2, *TC;
-	unsigned dim;
-
-	if (T2)
-		*T2 = NULL;
-	if (!B)
-		goto error;
-
-	dim = B->n_col - 1;
-	H = isl_mat_sub_alloc(B, 0, B->n_row, 1, dim);
-	H = isl_mat_left_hermite(H, 0, &U, T2);
-	if (!H || !U || (T2 && !*T2))
-		goto error;
-	if (T2) {
-		*T2 = isl_mat_drop_rows(*T2, 0, B->n_row);
-		*T2 = isl_mat_lin_to_aff(*T2);
-		if (!*T2)
-			goto error;
-	}
-	C = isl_mat_alloc(B->ctx, 1+B->n_row, 1);
-	if (!C)
-		goto error;
-	isl_int_set_si(C->row[0][0], 1);
-	isl_mat_sub_neg(C->ctx, C->row+1, B->row, B->n_row, 0, 0, 1);
-	H1 = isl_mat_sub_alloc(H, 0, H->n_row, 0, H->n_row);
-	H1 = isl_mat_lin_to_aff(H1);
-	TC = isl_mat_inverse_product(H1, C);
-	if (!TC)
-		goto error;
-	isl_mat_free(H);
-	if (!isl_int_is_one(TC->row[0][0])) {
-		for (i = 0; i < B->n_row; ++i) {
-			if (!isl_int_is_divisible_by(TC->row[1+i][0], TC->row[0][0])) {
-				struct isl_ctx *ctx = B->ctx;
-				isl_mat_free(B);
-				isl_mat_free(TC);
-				isl_mat_free(U);
-				if (T2) {
-					isl_mat_free(*T2);
-					*T2 = NULL;
-				}
-				return isl_mat_alloc(ctx, 1 + dim, 0);
-			}
-			isl_seq_scale_down(TC->row[1+i], TC->row[1+i], TC->row[0][0], 1);
-		}
-		isl_int_set_si(TC->row[0][0], 1);
-	}
-	U1 = isl_mat_sub_alloc(U, 0, U->n_row, 0, B->n_row);
-	U1 = isl_mat_lin_to_aff(U1);
-	U2 = isl_mat_sub_alloc(U, 0, U->n_row, B->n_row, U->n_row - B->n_row);
-	U2 = isl_mat_lin_to_aff(U2);
-	isl_mat_free(U);
-	TC = isl_mat_product(U1, TC);
-	TC = isl_mat_aff_direct_sum(TC, U2);
-
-	isl_mat_free(B);
-
-	return TC;
-error:
-	isl_mat_free(B);
-	isl_mat_free(H);
-	isl_mat_free(U);
-	if (T2) {
-		isl_mat_free(*T2);
-		*T2 = NULL;
-	}
-	return NULL;
-}
-
-/* Use the n equalities of bset to unimodularly transform the
- * variables x such that n transformed variables x1' have a constant value
- * and rewrite the constraints of bset in terms of the remaining
- * transformed variables x2'.  The matrix pointed to by T maps
- * the new variables x2' back to the original variables x, while T2
- * maps the original variables to the new variables.
- */
-static struct isl_basic_set *compress_variables(
-	struct isl_basic_set *bset, struct isl_mat **T, struct isl_mat **T2)
-{
-	struct isl_mat *B, *TC;
-	unsigned dim;
-
-	if (T)
-		*T = NULL;
-	if (T2)
-		*T2 = NULL;
-	if (!bset)
-		goto error;
-	isl_assert(bset->ctx, isl_basic_set_n_param(bset) == 0, goto error);
-	isl_assert(bset->ctx, bset->n_div == 0, goto error);
-	dim = isl_basic_set_n_dim(bset);
-	isl_assert(bset->ctx, bset->n_eq <= dim, goto error);
-	if (bset->n_eq == 0)
-		return bset;
-
-	B = isl_mat_sub_alloc6(bset->ctx, bset->eq, 0, bset->n_eq, 0, 1 + dim);
-	TC = isl_mat_variable_compression(B, T2);
-	if (!TC)
-		goto error;
-	if (TC->n_col == 0) {
-		isl_mat_free(TC);
-		if (T2) {
-			isl_mat_free(*T2);
-			*T2 = NULL;
-		}
-		return isl_basic_set_set_to_empty(bset);
-	}
-
-	bset = isl_basic_set_preimage(bset, T ? isl_mat_copy(TC) : TC);
-	if (T)
-		*T = TC;
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_remove_equalities(
-	struct isl_basic_set *bset, struct isl_mat **T, struct isl_mat **T2)
-{
-	if (T)
-		*T = NULL;
-	if (T2)
-		*T2 = NULL;
-	if (!bset)
-		return NULL;
-	isl_assert(bset->ctx, isl_basic_set_n_param(bset) == 0, goto error);
-	bset = isl_basic_set_gauss(bset, NULL);
-	if (ISL_F_ISSET(bset, ISL_BASIC_SET_EMPTY))
-		return bset;
-	bset = compress_variables(bset, T, T2);
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	*T = NULL;
-	return NULL;
-}
-
-/* Check if dimension dim belongs to a residue class
- *		i_dim \equiv r mod m
- * with m != 1 and if so return m in *modulo and r in *residue.
- * As a special case, when i_dim has a fixed value v, then
- * *modulo is set to 0 and *residue to v.
- *
- * If i_dim does not belong to such a residue class, then *modulo
- * is set to 1 and *residue is set to 0.
- */
-int isl_basic_set_dim_residue_class(struct isl_basic_set *bset,
-	int pos, isl_int *modulo, isl_int *residue)
-{
-	struct isl_ctx *ctx;
-	struct isl_mat *H = NULL, *U = NULL, *C, *H1, *U1;
-	unsigned total;
-	unsigned nparam;
-
-	if (!bset || !modulo || !residue)
-		return -1;
-
-	if (isl_basic_set_plain_dim_is_fixed(bset, pos, residue)) {
-		isl_int_set_si(*modulo, 0);
-		return 0;
-	}
-
-	ctx = bset->ctx;
-	total = isl_basic_set_total_dim(bset);
-	nparam = isl_basic_set_n_param(bset);
-	H = isl_mat_sub_alloc6(bset->ctx, bset->eq, 0, bset->n_eq, 1, total);
-	H = isl_mat_left_hermite(H, 0, &U, NULL);
-	if (!H)
-		return -1;
-
-	isl_seq_gcd(U->row[nparam + pos]+bset->n_eq,
-			total-bset->n_eq, modulo);
-	if (isl_int_is_zero(*modulo))
-		isl_int_set_si(*modulo, 1);
-	if (isl_int_is_one(*modulo)) {
-		isl_int_set_si(*residue, 0);
-		isl_mat_free(H);
-		isl_mat_free(U);
-		return 0;
-	}
-
-	C = isl_mat_alloc(bset->ctx, 1+bset->n_eq, 1);
-	if (!C)
-		goto error;
-	isl_int_set_si(C->row[0][0], 1);
-	isl_mat_sub_neg(C->ctx, C->row+1, bset->eq, bset->n_eq, 0, 0, 1);
-	H1 = isl_mat_sub_alloc(H, 0, H->n_row, 0, H->n_row);
-	H1 = isl_mat_lin_to_aff(H1);
-	C = isl_mat_inverse_product(H1, C);
-	isl_mat_free(H);
-	U1 = isl_mat_sub_alloc(U, nparam+pos, 1, 0, bset->n_eq);
-	U1 = isl_mat_lin_to_aff(U1);
-	isl_mat_free(U);
-	C = isl_mat_product(U1, C);
-	if (!C)
-		goto error;
-	if (!isl_int_is_divisible_by(C->row[1][0], C->row[0][0])) {
-		bset = isl_basic_set_copy(bset);
-		bset = isl_basic_set_set_to_empty(bset);
-		isl_basic_set_free(bset);
-		isl_int_set_si(*modulo, 1);
-		isl_int_set_si(*residue, 0);
-		return 0;
-	}
-	isl_int_divexact(*residue, C->row[1][0], C->row[0][0]);
-	isl_int_fdiv_r(*residue, *residue, *modulo);
-	isl_mat_free(C);
-	return 0;
-error:
-	isl_mat_free(H);
-	isl_mat_free(U);
-	return -1;
-}
-
-/* Check if dimension dim belongs to a residue class
- *		i_dim \equiv r mod m
- * with m != 1 and if so return m in *modulo and r in *residue.
- * As a special case, when i_dim has a fixed value v, then
- * *modulo is set to 0 and *residue to v.
- *
- * If i_dim does not belong to such a residue class, then *modulo
- * is set to 1 and *residue is set to 0.
- */
-int isl_set_dim_residue_class(struct isl_set *set,
-	int pos, isl_int *modulo, isl_int *residue)
-{
-	isl_int m;
-	isl_int r;
-	int i;
-
-	if (!set || !modulo || !residue)
-		return -1;
-
-	if (set->n == 0) {
-		isl_int_set_si(*modulo, 0);
-		isl_int_set_si(*residue, 0);
-		return 0;
-	}
-
-	if (isl_basic_set_dim_residue_class(set->p[0], pos, modulo, residue)<0)
-		return -1;
-
-	if (set->n == 1)
-		return 0;
-
-	if (isl_int_is_one(*modulo))
-		return 0;
-
-	isl_int_init(m);
-	isl_int_init(r);
-
-	for (i = 1; i < set->n; ++i) {
-		if (isl_basic_set_dim_residue_class(set->p[0], pos, &m, &r) < 0)
-			goto error;
-		isl_int_gcd(*modulo, *modulo, m);
-		if (!isl_int_is_zero(*modulo))
-			isl_int_fdiv_r(*residue, *residue, *modulo);
-		if (isl_int_is_one(*modulo))
-			break;
-		if (!isl_int_is_zero(*modulo))
-			isl_int_fdiv_r(r, r, *modulo);
-		if (isl_int_ne(*residue, r)) {
-			isl_int_set_si(*modulo, 1);
-			isl_int_set_si(*residue, 0);
-			break;
-		}
-	}
-
-	isl_int_clear(m);
-	isl_int_clear(r);
-
-	return 0;
-error:
-	isl_int_clear(m);
-	isl_int_clear(r);
-	return -1;
-}
diff --git a/cloog-0.17.0/isl/isl_equalities.h b/cloog-0.17.0/isl/isl_equalities.h
deleted file mode 100644
index ceb5544..0000000
--- a/cloog-0.17.0/isl/isl_equalities.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_EQUALITIES_H
-#define ISL_EQUALITIES_H
-
-#include <isl/set.h>
-#include <isl/mat.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_mat *isl_mat_variable_compression(
-			struct isl_mat *B, struct isl_mat **T2);
-struct isl_mat *isl_mat_parameter_compression(
-			struct isl_mat *B, struct isl_vec *d);
-struct isl_basic_set *isl_basic_set_remove_equalities(
-	struct isl_basic_set *bset, struct isl_mat **T, struct isl_mat **T2);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_factorization.c b/cloog-0.17.0/isl/isl_factorization.c
deleted file mode 100644
index 64d6b30..0000000
--- a/cloog-0.17.0/isl/isl_factorization.c
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- * Copyright 2005-2007 Universiteit Leiden
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, Leiden Institute of Advanced Computer Science,
- * Universiteit Leiden, Niels Bohrweg 1, 2333 CA Leiden, The Netherlands
- * and K.U.Leuven, Departement Computerwetenschappen, Celestijnenlaan 200A,
- * B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France 
- */
-
-#include <isl_map_private.h>
-#include <isl_factorization.h>
-#include <isl_space_private.h>
-#include <isl_mat_private.h>
-
-static __isl_give isl_factorizer *isl_factorizer_alloc(
-	__isl_take isl_morph *morph, int n_group)
-{
-	isl_factorizer *f = NULL;
-	int *len = NULL;
-
-	if (!morph)
-		return NULL;
-
-	if (n_group > 0) {
-		len = isl_alloc_array(morph->dom->ctx, int, n_group);
-		if (!len)
-			goto error;
-	}
-
-	f = isl_alloc_type(morph->dom->ctx, struct isl_factorizer);
-	if (!f)
-		goto error;
-
-	f->morph = morph;
-	f->n_group = n_group;
-	f->len = len;
-
-	return f;
-error:
-	free(len);
-	isl_morph_free(morph);
-	return NULL;
-}
-
-void isl_factorizer_free(__isl_take isl_factorizer *f)
-{
-	if (!f)
-		return;
-
-	isl_morph_free(f->morph);
-	free(f->len);
-	free(f);
-}
-
-void isl_factorizer_dump(__isl_take isl_factorizer *f, FILE *out)
-{
-	int i;
-
-	if (!f)
-		return;
-
-	isl_morph_dump(f->morph, out);
-	fprintf(out, "[");
-	for (i = 0; i < f->n_group; ++i) {
-		if (i)
-			fprintf(out, ", ");
-		fprintf(out, "%d", f->len[i]);
-	}
-	fprintf(out, "]\n");
-}
-
-__isl_give isl_factorizer *isl_factorizer_identity(__isl_keep isl_basic_set *bset)
-{
-	return isl_factorizer_alloc(isl_morph_identity(bset), 0);
-}
-
-__isl_give isl_factorizer *isl_factorizer_groups(__isl_keep isl_basic_set *bset,
-	__isl_take isl_mat *Q, __isl_take isl_mat *U, int n, int *len)
-{
-	int i;
-	unsigned nvar;
-	unsigned ovar;
-	isl_space *dim;
-	isl_basic_set *dom;
-	isl_basic_set *ran;
-	isl_morph *morph;
-	isl_factorizer *f;
-	isl_mat *id;
-
-	if (!bset || !Q || !U)
-		goto error;
-
-	ovar = 1 + isl_space_offset(bset->dim, isl_dim_set);
-	id = isl_mat_identity(bset->ctx, ovar);
-	Q = isl_mat_diagonal(isl_mat_copy(id), Q);
-	U = isl_mat_diagonal(id, U);
-
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-	dim = isl_basic_set_get_space(bset);
-	dom = isl_basic_set_universe(isl_space_copy(dim));
-	dim = isl_space_drop_dims(dim, isl_dim_set, 0, nvar);
-	dim = isl_space_add_dims(dim, isl_dim_set, nvar);
-	ran = isl_basic_set_universe(dim);
-	morph = isl_morph_alloc(dom, ran, Q, U);
-	f = isl_factorizer_alloc(morph, n);
-	if (!f)
-		return NULL;
-	for (i = 0; i < n; ++i)
-		f->len[i] = len[i];
-	return f;
-error:
-	isl_mat_free(Q);
-	isl_mat_free(U);
-	return NULL;
-}
-
-struct isl_factor_groups {
-	int *pos;		/* for each column: row position of pivot */
-	int *group;		/* group to which a column belongs */
-	int *cnt;		/* number of columns in the group */
-	int *rowgroup;		/* group to which a constraint belongs */
-};
-
-/* Initialize isl_factor_groups structure: find pivot row positions,
- * each column initially belongs to its own group and the groups
- * of the constraints are still unknown.
- */
-static int init_groups(struct isl_factor_groups *g, __isl_keep isl_mat *H)
-{
-	int i, j;
-
-	if (!H)
-		return -1;
-
-	g->pos = isl_alloc_array(H->ctx, int, H->n_col);
-	g->group = isl_alloc_array(H->ctx, int, H->n_col);
-	g->cnt = isl_alloc_array(H->ctx, int, H->n_col);
-	g->rowgroup = isl_alloc_array(H->ctx, int, H->n_row);
-
-	if (!g->pos || !g->group || !g->cnt || !g->rowgroup)
-		return -1;
-
-	for (i = 0; i < H->n_row; ++i)
-		g->rowgroup[i] = -1;
-	for (i = 0, j = 0; i < H->n_col; ++i) {
-		for ( ; j < H->n_row; ++j)
-			if (!isl_int_is_zero(H->row[j][i]))
-				break;
-		g->pos[i] = j;
-	}
-	for (i = 0; i < H->n_col; ++i) {
-		g->group[i] = i;
-		g->cnt[i] = 1;
-	}
-
-	return 0;
-}
-
-/* Update group[k] to the group column k belongs to.
- * When merging two groups, only the group of the current
- * group leader is changed.  Here we change the group of
- * the other members to also point to the group that the
- * old group leader now points to.
- */
-static void update_group(struct isl_factor_groups *g, int k)
-{
-	int p = g->group[k];
-	while (g->cnt[p] == 0)
-		p = g->group[p];
-	g->group[k] = p;
-}
-
-/* Merge group i with all groups of the subsequent columns
- * with non-zero coefficients in row j of H.
- * (The previous columns are all zero; otherwise we would have handled
- * the row before.)
- */
-static int update_group_i_with_row_j(struct isl_factor_groups *g, int i, int j,
-	__isl_keep isl_mat *H)
-{
-	int k;
-
-	g->rowgroup[j] = g->group[i];
-	for (k = i + 1; k < H->n_col && j >= g->pos[k]; ++k) {
-		update_group(g, k);
-		update_group(g, i);
-		if (g->group[k] != g->group[i] &&
-		    !isl_int_is_zero(H->row[j][k])) {
-			isl_assert(H->ctx, g->cnt[g->group[k]] != 0, return -1);
-			isl_assert(H->ctx, g->cnt[g->group[i]] != 0, return -1);
-			if (g->group[i] < g->group[k]) {
-				g->cnt[g->group[i]] += g->cnt[g->group[k]];
-				g->cnt[g->group[k]] = 0;
-				g->group[g->group[k]] = g->group[i];
-			} else {
-				g->cnt[g->group[k]] += g->cnt[g->group[i]];
-				g->cnt[g->group[i]] = 0;
-				g->group[g->group[i]] = g->group[k];
-			}
-		}
-	}
-
-	return 0;
-}
-
-/* Update the group information based on the constraint matrix.
- */
-static int update_groups(struct isl_factor_groups *g, __isl_keep isl_mat *H)
-{
-	int i, j;
-
-	for (i = 0; i < H->n_col && g->cnt[0] < H->n_col; ++i) {
-		if (g->pos[i] == H->n_row)
-			continue; /* A line direction */
-		if (g->rowgroup[g->pos[i]] == -1)
-			g->rowgroup[g->pos[i]] = i;
-		for (j = g->pos[i] + 1; j < H->n_row; ++j) {
-			if (isl_int_is_zero(H->row[j][i]))
-				continue;
-			if (g->rowgroup[j] != -1)
-				continue;
-			if (update_group_i_with_row_j(g, i, j, H) < 0)
-				return -1;
-		}
-	}
-	for (i = 1; i < H->n_col; ++i)
-		update_group(g, i);
-
-	return 0;
-}
-
-static void clear_groups(struct isl_factor_groups *g)
-{
-	if (!g)
-		return;
-	free(g->pos);
-	free(g->group);
-	free(g->cnt);
-	free(g->rowgroup);
-}
-
-/* Determine if the set variables of the basic set can be factorized and
- * return the results in an isl_factorizer.
- *
- * The algorithm works by first computing the Hermite normal form
- * and then grouping columns linked by one or more constraints together,
- * where a constraints "links" two or more columns if the constraint
- * has nonzero coefficients in the columns.
- */
-__isl_give isl_factorizer *isl_basic_set_factorizer(
-	__isl_keep isl_basic_set *bset)
-{
-	int i, j, n, done;
-	isl_mat *H, *U, *Q;
-	unsigned nvar;
-	struct isl_factor_groups g = { 0 };
-	isl_factorizer *f;
-
-	if (!bset)
-		return NULL;
-
-	isl_assert(bset->ctx, isl_basic_set_dim(bset, isl_dim_div) == 0,
-		return NULL);
-
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-	if (nvar <= 1)
-		return isl_factorizer_identity(bset);
-
-	H = isl_mat_alloc(bset->ctx, bset->n_eq + bset->n_ineq, nvar);
-	if (!H)
-		return NULL;
-	isl_mat_sub_copy(bset->ctx, H->row, bset->eq, bset->n_eq,
-		0, 1 + isl_space_offset(bset->dim, isl_dim_set), nvar);
-	isl_mat_sub_copy(bset->ctx, H->row + bset->n_eq, bset->ineq, bset->n_ineq,
-		0, 1 + isl_space_offset(bset->dim, isl_dim_set), nvar);
-	H = isl_mat_left_hermite(H, 0, &U, &Q);
-
-	if (init_groups(&g, H) < 0)
-		goto error;
-	if (update_groups(&g, H) < 0)
-		goto error;
-
-	if (g.cnt[0] == nvar) {
-		isl_mat_free(H);
-		isl_mat_free(U);
-		isl_mat_free(Q);
-		clear_groups(&g);
-
-		return isl_factorizer_identity(bset);
-	}
-
-	done = 0;
-	n = 0;
-	while (done != nvar) {
-		int group = g.group[done];
-		for (i = 1; i < g.cnt[group]; ++i) {
-			if (g.group[done + i] == group)
-				continue;
-			for (j = done + g.cnt[group]; j < nvar; ++j)
-				if (g.group[j] == group)
-					break;
-			if (j == nvar)
-				isl_die(bset->ctx, isl_error_internal,
-					"internal error", goto error);
-			g.group[j] = g.group[done + i];
-			Q = isl_mat_swap_rows(Q, done + i, j);
-			U = isl_mat_swap_cols(U, done + i, j);
-		}
-		done += g.cnt[group];
-		g.pos[n++] = g.cnt[group];
-	}
-
-	f = isl_factorizer_groups(bset, Q, U, n, g.pos);
-
-	isl_mat_free(H);
-	clear_groups(&g);
-
-	return f;
-error:
-	isl_mat_free(H);
-	isl_mat_free(U);
-	isl_mat_free(Q);
-	clear_groups(&g);
-	return NULL;
-}
diff --git a/cloog-0.17.0/isl/isl_factorization.h b/cloog-0.17.0/isl/isl_factorization.h
deleted file mode 100644
index f0d3518..0000000
--- a/cloog-0.17.0/isl/isl_factorization.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#include <isl/set.h>
-#include <isl_morph.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/* Data for factorizing a particular basic set.
- * After applying "morph" to the basic set, there are "n_group"
- * groups of consecutive set variables, each of length "len[i]",
- * with 0 <= i < n_group.
- * If no factorization is possible, then "n_group" is set to 0.
- */
-struct isl_factorizer {
-	isl_morph	*morph;
-	int		n_group;
-	int		*len;
-};
-typedef struct isl_factorizer isl_factorizer;
-
-__isl_give isl_factorizer *isl_basic_set_factorizer(
-	__isl_keep isl_basic_set *bset);
-
-void isl_factorizer_free(__isl_take isl_factorizer *f);
-void isl_factorizer_dump(__isl_take isl_factorizer *f, FILE *out);
-
-#if defined(__cplusplus)
-}
-#endif
diff --git a/cloog-0.17.0/isl/isl_farkas.c b/cloog-0.17.0/isl/isl_farkas.c
deleted file mode 100644
index 9f6a462..0000000
--- a/cloog-0.17.0/isl/isl_farkas.c
+++ /dev/null
@@ -1,385 +0,0 @@
-/*
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France 
- */
-
-#include <isl_map_private.h>
-#include <isl/set.h>
-#include <isl_space_private.h>
-#include <isl/seq.h>
-
-/*
- * Let C be a cone and define
- *
- *	C' := { y | forall x in C : y x >= 0 }
- *
- * C' contains the coefficients of all linear constraints
- * that are valid for C.
- * Furthermore, C'' = C.
- *
- * If C is defined as { x | A x >= 0 }
- * then any element in C' must be a non-negative combination
- * of the rows of A, i.e., y = t A with t >= 0.  That is,
- *
- *	C' = { y | exists t >= 0 : y = t A }
- *
- * If any of the rows in A actually represents an equality, then
- * also negative combinations of this row are allowed and so the
- * non-negativity constraint on the corresponding element of t
- * can be dropped.
- *
- * A polyhedron P = { x | b + A x >= 0 } can be represented
- * in homogeneous coordinates by the cone
- * C = { [z,x] | b z + A x >= and z >= 0 }
- * The valid linear constraints on C correspond to the valid affine
- * constraints on P.
- * This is essentially Farkas' lemma.
- *
- * Let A' = [b A], then, since
- *				  [ 1 0 ]
- *		[ w y ] = [t_0 t] [ b A ]
- *
- * we have
- *
- *	C' = { w, y | exists t_0, t >= 0 : y = t A' and w = t_0 + t b }
- * or
- *
- *	C' = { w, y | exists t >= 0 : y = t A' and w - t b >= 0 }
- *
- * In practice, we introduce an extra variable (w), shifting all
- * other variables to the right, and an extra inequality
- * (w - t b >= 0) corresponding to the positivity constraint on
- * the homogeneous coordinate.
- *
- * When going back from coefficients to solutions, we immediately
- * plug in 1 for z, which corresponds to shifting all variables
- * to the left, with the leftmost ending up in the constant position.
- */
-
-/* Add the given prefix to all named isl_dim_set dimensions in "dim".
- */
-static __isl_give isl_space *isl_space_prefix(__isl_take isl_space *dim,
-	const char *prefix)
-{
-	int i;
-	isl_ctx *ctx;
-	unsigned nvar;
-	size_t prefix_len = strlen(prefix);
-
-	if (!dim)
-		return NULL;
-
-	ctx = isl_space_get_ctx(dim);
-	nvar = isl_space_dim(dim, isl_dim_set);
-
-	for (i = 0; i < nvar; ++i) {
-		const char *name;
-		char *prefix_name;
-
-		name = isl_space_get_dim_name(dim, isl_dim_set, i);
-		if (!name)
-			continue;
-
-		prefix_name = isl_alloc_array(ctx, char,
-					      prefix_len + strlen(name) + 1);
-		if (!prefix_name)
-			goto error;
-		memcpy(prefix_name, prefix, prefix_len);
-		strcpy(prefix_name + prefix_len, name);
-
-		dim = isl_space_set_dim_name(dim, isl_dim_set, i, prefix_name);
-		free(prefix_name);
-	}
-
-	return dim;
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-/* Given a dimension specification of the solutions space, construct
- * a dimension specification for the space of coefficients.
- *
- * In particular transform
- *
- *	[params] -> { S }
- *
- * to
- *
- *	{ coefficients[[cst, params] -> S] }
- *
- * and prefix each dimension name with "c_".
- */
-static __isl_give isl_space *isl_space_coefficients(__isl_take isl_space *dim)
-{
-	isl_space *dim_param;
-	unsigned nvar;
-	unsigned nparam;
-
-	nvar = isl_space_dim(dim, isl_dim_set);
-	nparam = isl_space_dim(dim, isl_dim_param);
-	dim_param = isl_space_copy(dim);
-	dim_param = isl_space_drop_dims(dim_param, isl_dim_set, 0, nvar);
-	dim_param = isl_space_move_dims(dim_param, isl_dim_set, 0,
-				 isl_dim_param, 0, nparam);
-	dim_param = isl_space_prefix(dim_param, "c_");
-	dim_param = isl_space_insert_dims(dim_param, isl_dim_set, 0, 1);
-	dim_param = isl_space_set_dim_name(dim_param, isl_dim_set, 0, "c_cst");
-	dim = isl_space_drop_dims(dim, isl_dim_param, 0, nparam);
-	dim = isl_space_prefix(dim, "c_");
-	dim = isl_space_join(isl_space_from_domain(dim_param),
-			   isl_space_from_range(dim));
-	dim = isl_space_wrap(dim);
-	dim = isl_space_set_tuple_name(dim, isl_dim_set, "coefficients");
-
-	return dim;
-}
-
-/* Drop the given prefix from all named dimensions of type "type" in "dim".
- */
-static __isl_give isl_space *isl_space_unprefix(__isl_take isl_space *dim,
-	enum isl_dim_type type, const char *prefix)
-{
-	int i;
-	unsigned n;
-	size_t prefix_len = strlen(prefix);
-
-	n = isl_space_dim(dim, type);
-
-	for (i = 0; i < n; ++i) {
-		const char *name;
-
-		name = isl_space_get_dim_name(dim, type, i);
-		if (!name)
-			continue;
-		if (strncmp(name, prefix, prefix_len))
-			continue;
-
-		dim = isl_space_set_dim_name(dim, type, i, name + prefix_len);
-	}
-
-	return dim;
-}
-
-/* Given a dimension specification of the space of coefficients, construct
- * a dimension specification for the space of solutions.
- *
- * In particular transform
- *
- *	{ coefficients[[cst, params] -> S] }
- *
- * to
- *
- *	[params] -> { S }
- *
- * and drop the "c_" prefix from the dimension names.
- */
-static __isl_give isl_space *isl_space_solutions(__isl_take isl_space *dim)
-{
-	unsigned nparam;
-
-	dim = isl_space_unwrap(dim);
-	dim = isl_space_drop_dims(dim, isl_dim_in, 0, 1);
-	dim = isl_space_unprefix(dim, isl_dim_in, "c_");
-	dim = isl_space_unprefix(dim, isl_dim_out, "c_");
-	nparam = isl_space_dim(dim, isl_dim_in);
-	dim = isl_space_move_dims(dim, isl_dim_param, 0, isl_dim_in, 0, nparam);
-	dim = isl_space_range(dim);
-
-	return dim;
-}
-
-/* Compute the dual of "bset" by applying Farkas' lemma.
- * As explained above, we add an extra dimension to represent
- * the coefficient of the constant term when going from solutions
- * to coefficients (shift == 1) and we drop the extra dimension when going
- * in the opposite direction (shift == -1).  "dim" is the space in which
- * the dual should be created.
- */
-static __isl_give isl_basic_set *farkas(__isl_take isl_space *dim,
-	__isl_take isl_basic_set *bset, int shift)
-{
-	int i, j, k;
-	isl_basic_set *dual = NULL;
-	unsigned total;
-
-	total = isl_basic_set_total_dim(bset);
-
-	dual = isl_basic_set_alloc_space(dim, bset->n_eq + bset->n_ineq,
-					total, bset->n_ineq + (shift > 0));
-	dual = isl_basic_set_set_rational(dual);
-
-	for (i = 0; i < bset->n_eq + bset->n_ineq; ++i) {
-		k = isl_basic_set_alloc_div(dual);
-		if (k < 0)
-			goto error;
-		isl_int_set_si(dual->div[k][0], 0);
-	}
-
-	for (i = 0; i < total; ++i) {
-		k = isl_basic_set_alloc_equality(dual);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(dual->eq[k], 1 + shift + total);
-		isl_int_set_si(dual->eq[k][1 + shift + i], -1);
-		for (j = 0; j < bset->n_eq; ++j)
-			isl_int_set(dual->eq[k][1 + shift + total + j],
-				    bset->eq[j][1 + i]);
-		for (j = 0; j < bset->n_ineq; ++j)
-			isl_int_set(dual->eq[k][1 + shift + total + bset->n_eq + j],
-				    bset->ineq[j][1 + i]);
-	}
-
-	for (i = 0; i < bset->n_ineq; ++i) {
-		k = isl_basic_set_alloc_inequality(dual);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(dual->ineq[k],
-			    1 + shift + total + bset->n_eq + bset->n_ineq);
-		isl_int_set_si(dual->ineq[k][1 + shift + total + bset->n_eq + i], 1);
-	}
-
-	if (shift > 0) {
-		k = isl_basic_set_alloc_inequality(dual);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(dual->ineq[k], 2 + total);
-		isl_int_set_si(dual->ineq[k][1], 1);
-		for (j = 0; j < bset->n_eq; ++j)
-			isl_int_neg(dual->ineq[k][2 + total + j],
-				    bset->eq[j][0]);
-		for (j = 0; j < bset->n_ineq; ++j)
-			isl_int_neg(dual->ineq[k][2 + total + bset->n_eq + j],
-				    bset->ineq[j][0]);
-	}
-
-	dual = isl_basic_set_remove_divs(dual);
-	isl_basic_set_simplify(dual);
-	isl_basic_set_finalize(dual);
-
-	isl_basic_set_free(bset);
-	return dual;
-error:
-	isl_basic_set_free(bset);
-	isl_basic_set_free(dual);
-	return NULL;
-}
-
-/* Construct a basic set containing the tuples of coefficients of all
- * valid affine constraints on the given basic set.
- */
-__isl_give isl_basic_set *isl_basic_set_coefficients(
-	__isl_take isl_basic_set *bset)
-{
-	isl_space *dim;
-
-	if (!bset)
-		return NULL;
-	if (bset->n_div)
-		isl_die(bset->ctx, isl_error_invalid,
-			"input set not allowed to have local variables",
-			goto error);
-
-	dim = isl_basic_set_get_space(bset);
-	dim = isl_space_coefficients(dim);
-
-	return farkas(dim, bset, 1);
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Construct a basic set containing the elements that satisfy all
- * affine constraints whose coefficient tuples are
- * contained in the given basic set.
- */
-__isl_give isl_basic_set *isl_basic_set_solutions(
-	__isl_take isl_basic_set *bset)
-{
-	isl_space *dim;
-
-	if (!bset)
-		return NULL;
-	if (bset->n_div)
-		isl_die(bset->ctx, isl_error_invalid,
-			"input set not allowed to have local variables",
-			goto error);
-
-	dim = isl_basic_set_get_space(bset);
-	dim = isl_space_solutions(dim);
-
-	return farkas(dim, bset, -1);
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Construct a basic set containing the tuples of coefficients of all
- * valid affine constraints on the given set.
- */
-__isl_give isl_basic_set *isl_set_coefficients(__isl_take isl_set *set)
-{
-	int i;
-	isl_basic_set *coeff;
-
-	if (!set)
-		return NULL;
-	if (set->n == 0) {
-		isl_space *dim = isl_set_get_space(set);
-		dim = isl_space_coefficients(dim);
-		coeff = isl_basic_set_universe(dim);
-		coeff = isl_basic_set_set_rational(coeff);
-		isl_set_free(set);
-		return coeff;
-	}
-
-	coeff = isl_basic_set_coefficients(isl_basic_set_copy(set->p[0]));
-
-	for (i = 1; i < set->n; ++i) {
-		isl_basic_set *bset, *coeff_i;
-		bset = isl_basic_set_copy(set->p[i]);
-		coeff_i = isl_basic_set_coefficients(bset);
-		coeff = isl_basic_set_intersect(coeff, coeff_i);
-	}
-
-	isl_set_free(set);
-	return coeff;
-}
-
-/* Construct a basic set containing the elements that satisfy all
- * affine constraints whose coefficient tuples are
- * contained in the given set.
- */
-__isl_give isl_basic_set *isl_set_solutions(__isl_take isl_set *set)
-{
-	int i;
-	isl_basic_set *sol;
-
-	if (!set)
-		return NULL;
-	if (set->n == 0) {
-		isl_space *dim = isl_set_get_space(set);
-		dim = isl_space_solutions(dim);
-		sol = isl_basic_set_universe(dim);
-		sol = isl_basic_set_set_rational(sol);
-		isl_set_free(set);
-		return sol;
-	}
-
-	sol = isl_basic_set_solutions(isl_basic_set_copy(set->p[0]));
-
-	for (i = 1; i < set->n; ++i) {
-		isl_basic_set *bset, *sol_i;
-		bset = isl_basic_set_copy(set->p[i]);
-		sol_i = isl_basic_set_solutions(bset);
-		sol = isl_basic_set_intersect(sol, sol_i);
-	}
-
-	isl_set_free(set);
-	return sol;
-}
diff --git a/cloog-0.17.0/isl/isl_flow.c b/cloog-0.17.0/isl/isl_flow.c
deleted file mode 100644
index 1056ab2..0000000
--- a/cloog-0.17.0/isl/isl_flow.c
+++ /dev/null
@@ -1,1320 +0,0 @@
-/*
- * Copyright 2005-2007 Universiteit Leiden
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, Leiden Institute of Advanced Computer Science,
- * Universiteit Leiden, Niels Bohrweg 1, 2333 CA Leiden, The Netherlands
- * and K.U.Leuven, Departement Computerwetenschappen, Celestijnenlaan 200A,
- * B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France 
- */
-
-#include <isl/set.h>
-#include <isl/map.h>
-#include <isl/flow.h>
-
-/* A private structure to keep track of a mapping together with
- * a user-specified identifier and a boolean indicating whether
- * the map represents a must or may access/dependence.
- */
-struct isl_labeled_map {
-	struct isl_map	*map;
-	void		*data;
-	int		must;
-};
-
-/* A structure containing the input for dependence analysis:
- * - a sink
- * - n_must + n_may (<= max_source) sources
- * - a function for determining the relative order of sources and sink
- * The must sources are placed before the may sources.
- */
-struct isl_access_info {
-	struct isl_labeled_map	sink;
-	isl_access_level_before	level_before;
-	int		    	max_source;
-	int		    	n_must;
-	int		    	n_may;
-	struct isl_labeled_map	source[1];
-};
-
-/* A structure containing the output of dependence analysis:
- * - n_source dependences
- * - a wrapped subset of the sink for which definitely no source could be found
- * - a wrapped subset of the sink for which possibly no source could be found
- */
-struct isl_flow {
-	isl_set			*must_no_source;
-	isl_set			*may_no_source;
-	int			n_source;
-	struct isl_labeled_map	*dep;
-};
-
-/* Construct an isl_access_info structure and fill it up with
- * the given data.  The number of sources is set to 0.
- */
-__isl_give isl_access_info *isl_access_info_alloc(__isl_take isl_map *sink,
-	void *sink_user, isl_access_level_before fn, int max_source)
-{
-	isl_ctx *ctx;
-	struct isl_access_info *acc;
-
-	if (!sink)
-		return NULL;
-
-	ctx = isl_map_get_ctx(sink);
-	isl_assert(ctx, max_source >= 0, goto error);
-
-	acc = isl_alloc(ctx, struct isl_access_info,
-			sizeof(struct isl_access_info) +
-			(max_source - 1) * sizeof(struct isl_labeled_map));
-	if (!acc)
-		goto error;
-
-	acc->sink.map = sink;
-	acc->sink.data = sink_user;
-	acc->level_before = fn;
-	acc->max_source = max_source;
-	acc->n_must = 0;
-	acc->n_may = 0;
-
-	return acc;
-error:
-	isl_map_free(sink);
-	return NULL;
-}
-
-/* Free the given isl_access_info structure.
- */
-void isl_access_info_free(__isl_take isl_access_info *acc)
-{
-	int i;
-
-	if (!acc)
-		return;
-	isl_map_free(acc->sink.map);
-	for (i = 0; i < acc->n_must + acc->n_may; ++i)
-		isl_map_free(acc->source[i].map);
-	free(acc);
-}
-
-isl_ctx *isl_access_info_get_ctx(__isl_keep isl_access_info *acc)
-{
-	return acc ? isl_map_get_ctx(acc->sink.map) : NULL;
-}
-
-/* Add another source to an isl_access_info structure, making
- * sure the "must" sources are placed before the "may" sources.
- * This function may be called at most max_source times on a
- * given isl_access_info structure, with max_source as specified
- * in the call to isl_access_info_alloc that constructed the structure.
- */
-__isl_give isl_access_info *isl_access_info_add_source(
-	__isl_take isl_access_info *acc, __isl_take isl_map *source,
-	int must, void *source_user)
-{
-	isl_ctx *ctx;
-
-	if (!acc)
-		return NULL;
-	ctx = isl_map_get_ctx(acc->sink.map);
-	isl_assert(ctx, acc->n_must + acc->n_may < acc->max_source, goto error);
-	
-	if (must) {
-		if (acc->n_may)
-			acc->source[acc->n_must + acc->n_may] =
-				acc->source[acc->n_must];
-		acc->source[acc->n_must].map = source;
-		acc->source[acc->n_must].data = source_user;
-		acc->source[acc->n_must].must = 1;
-		acc->n_must++;
-	} else {
-		acc->source[acc->n_must + acc->n_may].map = source;
-		acc->source[acc->n_must + acc->n_may].data = source_user;
-		acc->source[acc->n_must + acc->n_may].must = 0;
-		acc->n_may++;
-	}
-
-	return acc;
-error:
-	isl_map_free(source);
-	isl_access_info_free(acc);
-	return NULL;
-}
-
-/* A temporary structure used while sorting the accesses in an isl_access_info.
- */
-struct isl_access_sort_info {
-	struct isl_map		*source_map;
-	void			*source_data;
-	struct isl_access_info	*acc;
-};
-
-/* Return -n, 0 or n (with n a positive value), depending on whether
- * the source access identified by p1 should be sorted before, together
- * or after that identified by p2.
- *
- * If p1 and p2 share a different number of levels with the sink,
- * then the one with the lowest number of shared levels should be
- * sorted first.
- * If they both share no levels, then the order is irrelevant.
- * Otherwise, if p1 appears before p2, then it should be sorted first.
- * For more generic initial schedules, it is possible that neither
- * p1 nor p2 appears before the other, or at least not in any obvious way.
- * We therefore also check if p2 appears before p1, in which case p2
- * should be sorted first.
- * If not, we try to order the two statements based on the description
- * of the iteration domains.  This results in an arbitrary, but fairly
- * stable ordering.
- */
-static int access_sort_cmp(const void *p1, const void *p2)
-{
-	const struct isl_access_sort_info *i1, *i2;
-	int level1, level2;
-	uint32_t h1, h2;
-	i1 = (const struct isl_access_sort_info *) p1;
-	i2 = (const struct isl_access_sort_info *) p2;
-
-	level1 = i1->acc->level_before(i1->source_data, i1->acc->sink.data);
-	level2 = i2->acc->level_before(i2->source_data, i2->acc->sink.data);
-
-	if (level1 != level2 || !level1)
-		return level1 - level2;
-
-	level1 = i1->acc->level_before(i1->source_data, i2->source_data);
-	if (level1 % 2)
-		return -1;
-
-	level2 = i1->acc->level_before(i2->source_data, i1->source_data);
-	if (level2 % 2)
-		return 1;
-
-	h1 = isl_map_get_hash(i1->source_map);
-	h2 = isl_map_get_hash(i2->source_map);
-	return h1 > h2 ? 1 : h1 < h2 ? -1 : 0;
-}
-
-/* Sort the must source accesses in order of increasing number of shared
- * levels with the sink access.
- * Source accesses with the same number of shared levels are sorted
- * in their textual order.
- */
-static __isl_give isl_access_info *isl_access_info_sort_sources(
-	__isl_take isl_access_info *acc)
-{
-	int i;
-	isl_ctx *ctx;
-	struct isl_access_sort_info *array;
-
-	if (!acc)
-		return NULL;
-	if (acc->n_must <= 1)
-		return acc;
-
-	ctx = isl_map_get_ctx(acc->sink.map);
-	array = isl_alloc_array(ctx, struct isl_access_sort_info, acc->n_must);
-	if (!array)
-		goto error;
-
-	for (i = 0; i < acc->n_must; ++i) {
-		array[i].source_map = acc->source[i].map;
-		array[i].source_data = acc->source[i].data;
-		array[i].acc = acc;
-	}
-
-	qsort(array, acc->n_must, sizeof(struct isl_access_sort_info),
-		access_sort_cmp);
-
-	for (i = 0; i < acc->n_must; ++i) {
-		acc->source[i].map = array[i].source_map;
-		acc->source[i].data = array[i].source_data;
-	}
-
-	free(array);
-
-	return acc;
-error:
-	isl_access_info_free(acc);
-	return NULL;
-}
-
-/* Align the parameters of the two spaces if needed and then call
- * isl_space_join.
- */
-static __isl_give isl_space *space_align_and_join(__isl_take isl_space *left,
-	__isl_take isl_space *right)
-{
-	if (isl_space_match(left, isl_dim_param, right, isl_dim_param))
-		return isl_space_join(left, right);
-
-	left = isl_space_align_params(left, isl_space_copy(right));
-	right = isl_space_align_params(right, isl_space_copy(left));
-	return isl_space_join(left, right);
-}
-
-/* Initialize an empty isl_flow structure corresponding to a given
- * isl_access_info structure.
- * For each must access, two dependences are created (initialized
- * to the empty relation), one for the resulting must dependences
- * and one for the resulting may dependences.  May accesses can
- * only lead to may dependences, so only one dependence is created
- * for each of them.
- * This function is private as isl_flow structures are only supposed
- * to be created by isl_access_info_compute_flow.
- */
-static __isl_give isl_flow *isl_flow_alloc(__isl_keep isl_access_info *acc)
-{
-	int i;
-	struct isl_ctx *ctx;
-	struct isl_flow *dep;
-
-	if (!acc)
-		return NULL;
-
-	ctx = isl_map_get_ctx(acc->sink.map);
-	dep = isl_calloc_type(ctx, struct isl_flow);
-	if (!dep)
-		return NULL;
-
-	dep->dep = isl_calloc_array(ctx, struct isl_labeled_map,
-					2 * acc->n_must + acc->n_may);
-	if (!dep->dep)
-		goto error;
-
-	dep->n_source = 2 * acc->n_must + acc->n_may;
-	for (i = 0; i < acc->n_must; ++i) {
-		isl_space *dim;
-		dim = space_align_and_join(
-			isl_map_get_space(acc->source[i].map),
-			isl_space_reverse(isl_map_get_space(acc->sink.map)));
-		dep->dep[2 * i].map = isl_map_empty(dim);
-		dep->dep[2 * i + 1].map = isl_map_copy(dep->dep[2 * i].map);
-		dep->dep[2 * i].data = acc->source[i].data;
-		dep->dep[2 * i + 1].data = acc->source[i].data;
-		dep->dep[2 * i].must = 1;
-		dep->dep[2 * i + 1].must = 0;
-		if (!dep->dep[2 * i].map || !dep->dep[2 * i + 1].map)
-			goto error;
-	}
-	for (i = acc->n_must; i < acc->n_must + acc->n_may; ++i) {
-		isl_space *dim;
-		dim = space_align_and_join(
-			isl_map_get_space(acc->source[i].map),
-			isl_space_reverse(isl_map_get_space(acc->sink.map)));
-		dep->dep[acc->n_must + i].map = isl_map_empty(dim);
-		dep->dep[acc->n_must + i].data = acc->source[i].data;
-		dep->dep[acc->n_must + i].must = 0;
-		if (!dep->dep[acc->n_must + i].map)
-			goto error;
-	}
-
-	return dep;
-error:
-	isl_flow_free(dep);
-	return NULL;
-}
-
-/* Iterate over all sources and for each resulting flow dependence
- * that is not empty, call the user specfied function.
- * The second argument in this function call identifies the source,
- * while the third argument correspond to the final argument of
- * the isl_flow_foreach call.
- */
-int isl_flow_foreach(__isl_keep isl_flow *deps,
-	int (*fn)(__isl_take isl_map *dep, int must, void *dep_user, void *user),
-	void *user)
-{
-	int i;
-
-	if (!deps)
-		return -1;
-
-	for (i = 0; i < deps->n_source; ++i) {
-		if (isl_map_plain_is_empty(deps->dep[i].map))
-			continue;
-		if (fn(isl_map_copy(deps->dep[i].map), deps->dep[i].must,
-				deps->dep[i].data, user) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-/* Return a copy of the subset of the sink for which no source could be found.
- */
-__isl_give isl_map *isl_flow_get_no_source(__isl_keep isl_flow *deps, int must)
-{
-	if (!deps)
-		return NULL;
-	
-	if (must)
-		return isl_set_unwrap(isl_set_copy(deps->must_no_source));
-	else
-		return isl_set_unwrap(isl_set_copy(deps->may_no_source));
-}
-
-void isl_flow_free(__isl_take isl_flow *deps)
-{
-	int i;
-
-	if (!deps)
-		return;
-	isl_set_free(deps->must_no_source);
-	isl_set_free(deps->may_no_source);
-	if (deps->dep) {
-		for (i = 0; i < deps->n_source; ++i)
-			isl_map_free(deps->dep[i].map);
-		free(deps->dep);
-	}
-	free(deps);
-}
-
-isl_ctx *isl_flow_get_ctx(__isl_keep isl_flow *deps)
-{
-	return deps ? isl_set_get_ctx(deps->must_no_source) : NULL;
-}
-
-/* Return a map that enforces that the domain iteration occurs after
- * the range iteration at the given level.
- * If level is odd, then the domain iteration should occur after
- * the target iteration in their shared level/2 outermost loops.
- * In this case we simply need to enforce that these outermost
- * loop iterations are the same.
- * If level is even, then the loop iterator of the domain should
- * be greater than the loop iterator of the range at the last
- * of the level/2 shared loops, i.e., loop level/2 - 1.
- */
-static __isl_give isl_map *after_at_level(__isl_take isl_space *dim, int level)
-{
-	struct isl_basic_map *bmap;
-
-	if (level % 2)
-		bmap = isl_basic_map_equal(dim, level/2);
-	else
-		bmap = isl_basic_map_more_at(dim, level/2 - 1);
-
-	return isl_map_from_basic_map(bmap);
-}
-
-/* Compute the last iteration of must source j that precedes the sink
- * at the given level for sink iterations in set_C.
- * The subset of set_C for which no such iteration can be found is returned
- * in *empty.
- */
-static struct isl_map *last_source(struct isl_access_info *acc, 
-				    struct isl_set *set_C,
-				    int j, int level, struct isl_set **empty)
-{
-	struct isl_map *read_map;
-	struct isl_map *write_map;
-	struct isl_map *dep_map;
-	struct isl_map *after;
-	struct isl_map *result;
-
-	read_map = isl_map_copy(acc->sink.map);
-	write_map = isl_map_copy(acc->source[j].map);
-	write_map = isl_map_reverse(write_map);
-	dep_map = isl_map_apply_range(read_map, write_map);
-	after = after_at_level(isl_map_get_space(dep_map), level);
-	dep_map = isl_map_intersect(dep_map, after);
-	result = isl_map_partial_lexmax(dep_map, set_C, empty);
-	result = isl_map_reverse(result);
-
-	return result;
-}
-
-/* For a given mapping between iterations of must source j and iterations
- * of the sink, compute the last iteration of must source k preceding
- * the sink at level before_level for any of the sink iterations,
- * but following the corresponding iteration of must source j at level
- * after_level.
- */
-static struct isl_map *last_later_source(struct isl_access_info *acc,
-					 struct isl_map *old_map,
-					 int j, int before_level,
-					 int k, int after_level,
-					 struct isl_set **empty)
-{
-	isl_space *dim;
-	struct isl_set *set_C;
-	struct isl_map *read_map;
-	struct isl_map *write_map;
-	struct isl_map *dep_map;
-	struct isl_map *after_write;
-	struct isl_map *before_read;
-	struct isl_map *result;
-
-	set_C = isl_map_range(isl_map_copy(old_map));
-	read_map = isl_map_copy(acc->sink.map);
-	write_map = isl_map_copy(acc->source[k].map);
-
-	write_map = isl_map_reverse(write_map);
-	dep_map = isl_map_apply_range(read_map, write_map);
-	dim = space_align_and_join(isl_map_get_space(acc->source[k].map),
-		    isl_space_reverse(isl_map_get_space(acc->source[j].map)));
-	after_write = after_at_level(dim, after_level);
-	after_write = isl_map_apply_range(after_write, old_map);
-	after_write = isl_map_reverse(after_write);
-	dep_map = isl_map_intersect(dep_map, after_write);
-	before_read = after_at_level(isl_map_get_space(dep_map), before_level);
-	dep_map = isl_map_intersect(dep_map, before_read);
-	result = isl_map_partial_lexmax(dep_map, set_C, empty);
-	result = isl_map_reverse(result);
-
-	return result;
-}
-
-/* Given a shared_level between two accesses, return 1 if the
- * the first can precede the second at the requested target_level.
- * If the target level is odd, i.e., refers to a statement level
- * dimension, then first needs to precede second at the requested
- * level, i.e., shared_level must be equal to target_level.
- * If the target level is odd, then the two loops should share
- * at least the requested number of outer loops.
- */
-static int can_precede_at_level(int shared_level, int target_level)
-{
-	if (shared_level < target_level)
-		return 0;
-	if ((target_level % 2) && shared_level > target_level)
-		return 0;
-	return 1;
-}
-
-/* Given a possible flow dependence temp_rel[j] between source j and the sink
- * at level sink_level, remove those elements for which
- * there is an iteration of another source k < j that is closer to the sink.
- * The flow dependences temp_rel[k] are updated with the improved sources.
- * Any improved source needs to precede the sink at the same level
- * and needs to follow source j at the same or a deeper level.
- * The lower this level, the later the execution date of source k.
- * We therefore consider lower levels first.
- *
- * If temp_rel[j] is empty, then there can be no improvement and
- * we return immediately.
- */
-static int intermediate_sources(__isl_keep isl_access_info *acc,
-	struct isl_map **temp_rel, int j, int sink_level)
-{
-	int k, level;
-	int depth = 2 * isl_map_dim(acc->source[j].map, isl_dim_in) + 1;
-
-	if (isl_map_plain_is_empty(temp_rel[j]))
-		return 0;
-
-	for (k = j - 1; k >= 0; --k) {
-		int plevel, plevel2;
-		plevel = acc->level_before(acc->source[k].data, acc->sink.data);
-		if (!can_precede_at_level(plevel, sink_level))
-			continue;
-
-		plevel2 = acc->level_before(acc->source[j].data,
-						acc->source[k].data);
-
-		for (level = sink_level; level <= depth; ++level) {
-			struct isl_map *T;
-			struct isl_set *trest;
-			struct isl_map *copy;
-
-			if (!can_precede_at_level(plevel2, level))
-				continue;
-
-			copy = isl_map_copy(temp_rel[j]);
-			T = last_later_source(acc, copy, j, sink_level, k,
-					      level, &trest);
-			if (isl_map_plain_is_empty(T)) {
-				isl_set_free(trest);
-				isl_map_free(T);
-				continue;
-			}
-			temp_rel[j] = isl_map_intersect_range(temp_rel[j], trest);
-			temp_rel[k] = isl_map_union_disjoint(temp_rel[k], T);
-		}
-	}
-
-	return 0;
-}
-
-/* Compute all iterations of may source j that precedes the sink at the given
- * level for sink iterations in set_C.
- */
-static __isl_give isl_map *all_sources(__isl_keep isl_access_info *acc,
-				    __isl_take isl_set *set_C, int j, int level)
-{
-	isl_map *read_map;
-	isl_map *write_map;
-	isl_map *dep_map;
-	isl_map *after;
-
-	read_map = isl_map_copy(acc->sink.map);
-	read_map = isl_map_intersect_domain(read_map, set_C);
-	write_map = isl_map_copy(acc->source[acc->n_must + j].map);
-	write_map = isl_map_reverse(write_map);
-	dep_map = isl_map_apply_range(read_map, write_map);
-	after = after_at_level(isl_map_get_space(dep_map), level);
-	dep_map = isl_map_intersect(dep_map, after);
-
-	return isl_map_reverse(dep_map);
-}
-
-/* For a given mapping between iterations of must source k and iterations
- * of the sink, compute the all iteration of may source j preceding
- * the sink at level before_level for any of the sink iterations,
- * but following the corresponding iteration of must source k at level
- * after_level.
- */
-static __isl_give isl_map *all_later_sources(__isl_keep isl_access_info *acc,
-	__isl_keep isl_map *old_map,
-	int j, int before_level, int k, int after_level)
-{
-	isl_space *dim;
-	isl_set *set_C;
-	isl_map *read_map;
-	isl_map *write_map;
-	isl_map *dep_map;
-	isl_map *after_write;
-	isl_map *before_read;
-
-	set_C = isl_map_range(isl_map_copy(old_map));
-	read_map = isl_map_copy(acc->sink.map);
-	read_map = isl_map_intersect_domain(read_map, set_C);
-	write_map = isl_map_copy(acc->source[acc->n_must + j].map);
-
-	write_map = isl_map_reverse(write_map);
-	dep_map = isl_map_apply_range(read_map, write_map);
-	dim = isl_space_join(isl_map_get_space(acc->source[acc->n_must + j].map),
-		    isl_space_reverse(isl_map_get_space(acc->source[k].map)));
-	after_write = after_at_level(dim, after_level);
-	after_write = isl_map_apply_range(after_write, old_map);
-	after_write = isl_map_reverse(after_write);
-	dep_map = isl_map_intersect(dep_map, after_write);
-	before_read = after_at_level(isl_map_get_space(dep_map), before_level);
-	dep_map = isl_map_intersect(dep_map, before_read);
-	return isl_map_reverse(dep_map);
-}
-
-/* Given the must and may dependence relations for the must accesses
- * for level sink_level, check if there are any accesses of may access j
- * that occur in between and return their union.
- * If some of these accesses are intermediate with respect to
- * (previously thought to be) must dependences, then these
- * must dependences are turned into may dependences.
- */
-static __isl_give isl_map *all_intermediate_sources(
-	__isl_keep isl_access_info *acc, __isl_take isl_map *map,
-	struct isl_map **must_rel, struct isl_map **may_rel,
-	int j, int sink_level)
-{
-	int k, level;
-	int depth = 2 * isl_map_dim(acc->source[acc->n_must + j].map,
-					isl_dim_in) + 1;
-
-	for (k = 0; k < acc->n_must; ++k) {
-		int plevel;
-
-		if (isl_map_plain_is_empty(may_rel[k]) &&
-		    isl_map_plain_is_empty(must_rel[k]))
-			continue;
-
-		plevel = acc->level_before(acc->source[k].data,
-					acc->source[acc->n_must + j].data);
-
-		for (level = sink_level; level <= depth; ++level) {
-			isl_map *T;
-			isl_map *copy;
-			isl_set *ran;
-
-			if (!can_precede_at_level(plevel, level))
-				continue;
-
-			copy = isl_map_copy(may_rel[k]);
-			T = all_later_sources(acc, copy, j, sink_level, k, level);
-			map = isl_map_union(map, T);
-
-			copy = isl_map_copy(must_rel[k]);
-			T = all_later_sources(acc, copy, j, sink_level, k, level);
-			ran = isl_map_range(isl_map_copy(T));
-			map = isl_map_union(map, T);
-			may_rel[k] = isl_map_union_disjoint(may_rel[k],
-			    isl_map_intersect_range(isl_map_copy(must_rel[k]),
-						    isl_set_copy(ran)));
-			T = isl_map_from_domain_and_range(
-			    isl_set_universe(
-				isl_space_domain(isl_map_get_space(must_rel[k]))),
-			    ran);
-			must_rel[k] = isl_map_subtract(must_rel[k], T);
-		}
-	}
-
-	return map;
-}
-
-/* Compute dependences for the case where all accesses are "may"
- * accesses, which boils down to computing memory based dependences.
- * The generic algorithm would also work in this case, but it would
- * be overkill to use it.
- */
-static __isl_give isl_flow *compute_mem_based_dependences(
-	__isl_take isl_access_info *acc)
-{
-	int i;
-	isl_set *mustdo;
-	isl_set *maydo;
-	isl_flow *res;
-
-	res = isl_flow_alloc(acc);
-	if (!res)
-		goto error;
-
-	mustdo = isl_map_domain(isl_map_copy(acc->sink.map));
-	maydo = isl_set_copy(mustdo);
-
-	for (i = 0; i < acc->n_may; ++i) {
-		int plevel;
-		int is_before;
-		isl_space *dim;
-		isl_map *before;
-		isl_map *dep;
-
-		plevel = acc->level_before(acc->source[i].data, acc->sink.data);
-		is_before = plevel & 1;
-		plevel >>= 1;
-
-		dim = isl_map_get_space(res->dep[i].map);
-		if (is_before)
-			before = isl_map_lex_le_first(dim, plevel);
-		else
-			before = isl_map_lex_lt_first(dim, plevel);
-		dep = isl_map_apply_range(isl_map_copy(acc->source[i].map),
-			isl_map_reverse(isl_map_copy(acc->sink.map)));
-		dep = isl_map_intersect(dep, before);
-		mustdo = isl_set_subtract(mustdo,
-					    isl_map_range(isl_map_copy(dep)));
-		res->dep[i].map = isl_map_union(res->dep[i].map, dep);
-	}
-
-	res->may_no_source = isl_set_subtract(maydo, isl_set_copy(mustdo));
-	res->must_no_source = mustdo;
-
-	isl_access_info_free(acc);
-
-	return res;
-error:
-	isl_access_info_free(acc);
-	return NULL;
-}
-
-/* Compute dependences for the case where there is at least one
- * "must" access.
- *
- * The core algorithm considers all levels in which a source may precede
- * the sink, where a level may either be a statement level or a loop level.
- * The outermost statement level is 1, the first loop level is 2, etc...
- * The algorithm basically does the following:
- * for all levels l of the read access from innermost to outermost
- *	for all sources w that may precede the sink access at that level
- *	    compute the last iteration of the source that precedes the sink access
- *					    at that level
- *	    add result to possible last accesses at level l of source w
- *	    for all sources w2 that we haven't considered yet at this level that may
- *					    also precede the sink access
- *		for all levels l2 of w from l to innermost
- *		    for all possible last accesses dep of w at l
- *			compute last iteration of w2 between the source and sink
- *								of dep
- *			add result to possible last accesses at level l of write w2
- *			and replace possible last accesses dep by the remainder
- *
- *
- * The above algorithm is applied to the must access.  During the course
- * of the algorithm, we keep track of sink iterations that still
- * need to be considered.  These iterations are split into those that
- * haven't been matched to any source access (mustdo) and those that have only
- * been matched to may accesses (maydo).
- * At the end of each level, we also consider the may accesses.
- * In particular, we consider may accesses that precede the remaining
- * sink iterations, moving elements from mustdo to maydo when appropriate,
- * and may accesses that occur between a must source and a sink of any 
- * dependences found at the current level, turning must dependences into
- * may dependences when appropriate.
- * 
- */
-static __isl_give isl_flow *compute_val_based_dependences(
-	__isl_take isl_access_info *acc)
-{
-	isl_ctx *ctx;
-	isl_flow *res;
-	isl_set *mustdo = NULL;
-	isl_set *maydo = NULL;
-	int level, j;
-	int depth;
-	isl_map **must_rel = NULL;
-	isl_map **may_rel = NULL;
-
-	acc = isl_access_info_sort_sources(acc);
-	if (!acc)
-		return NULL;
-
-	res = isl_flow_alloc(acc);
-	if (!res)
-		goto error;
-	ctx = isl_map_get_ctx(acc->sink.map);
-
-	depth = 2 * isl_map_dim(acc->sink.map, isl_dim_in) + 1;
-	mustdo = isl_map_domain(isl_map_copy(acc->sink.map));
-	maydo = isl_set_empty_like(mustdo);
-	if (!mustdo || !maydo)
-		goto error;
-	if (isl_set_plain_is_empty(mustdo))
-		goto done;
-
-	must_rel = isl_alloc_array(ctx, struct isl_map *, acc->n_must);
-	may_rel = isl_alloc_array(ctx, struct isl_map *, acc->n_must);
-	if (!must_rel || !may_rel)
-		goto error;
-
-	for (level = depth; level >= 1; --level) {
-		for (j = acc->n_must-1; j >=0; --j) {
-			must_rel[j] = isl_map_empty_like(res->dep[j].map);
-			may_rel[j] = isl_map_copy(must_rel[j]);
-		}
-
-		for (j = acc->n_must - 1; j >= 0; --j) {
-			struct isl_map *T;
-			struct isl_set *rest;
-			int plevel;
-
-			plevel = acc->level_before(acc->source[j].data,
-						     acc->sink.data);
-			if (!can_precede_at_level(plevel, level))
-				continue;
-
-			T = last_source(acc, mustdo, j, level, &rest);
-			must_rel[j] = isl_map_union_disjoint(must_rel[j], T);
-			mustdo = rest;
-
-			intermediate_sources(acc, must_rel, j, level);
-
-			T = last_source(acc, maydo, j, level, &rest);
-			may_rel[j] = isl_map_union_disjoint(may_rel[j], T);
-			maydo = rest;
-
-			intermediate_sources(acc, may_rel, j, level);
-
-			if (isl_set_plain_is_empty(mustdo) &&
-			    isl_set_plain_is_empty(maydo))
-				break;
-		}
-		for (j = j - 1; j >= 0; --j) {
-			int plevel;
-
-			plevel = acc->level_before(acc->source[j].data,
-						     acc->sink.data);
-			if (!can_precede_at_level(plevel, level))
-				continue;
-
-			intermediate_sources(acc, must_rel, j, level);
-			intermediate_sources(acc, may_rel, j, level);
-		}
-
-		for (j = 0; j < acc->n_may; ++j) {
-			int plevel;
-			isl_map *T;
-			isl_set *ran;
-
-			plevel = acc->level_before(acc->source[acc->n_must + j].data,
-						     acc->sink.data);
-			if (!can_precede_at_level(plevel, level))
-				continue;
-
-			T = all_sources(acc, isl_set_copy(maydo), j, level);
-			res->dep[2 * acc->n_must + j].map =
-			    isl_map_union(res->dep[2 * acc->n_must + j].map, T);
-			T = all_sources(acc, isl_set_copy(mustdo), j, level);
-			ran = isl_map_range(isl_map_copy(T));
-			res->dep[2 * acc->n_must + j].map =
-			    isl_map_union(res->dep[2 * acc->n_must + j].map, T);
-			mustdo = isl_set_subtract(mustdo, isl_set_copy(ran));
-			maydo = isl_set_union_disjoint(maydo, ran);
-
-			T = res->dep[2 * acc->n_must + j].map;
-			T = all_intermediate_sources(acc, T, must_rel, may_rel,
-							j, level);
-			res->dep[2 * acc->n_must + j].map = T;
-		}
-
-		for (j = acc->n_must - 1; j >= 0; --j) {
-			res->dep[2 * j].map =
-				isl_map_union_disjoint(res->dep[2 * j].map,
-							     must_rel[j]);
-			res->dep[2 * j + 1].map =
-				isl_map_union_disjoint(res->dep[2 * j + 1].map,
-							     may_rel[j]);
-		}
-
-		if (isl_set_plain_is_empty(mustdo) &&
-		    isl_set_plain_is_empty(maydo))
-			break;
-	}
-
-	free(must_rel);
-	free(may_rel);
-done:
-	res->must_no_source = mustdo;
-	res->may_no_source = maydo;
-	isl_access_info_free(acc);
-	return res;
-error:
-	isl_access_info_free(acc);
-	isl_flow_free(res);
-	isl_set_free(mustdo);
-	isl_set_free(maydo);
-	free(must_rel);
-	free(may_rel);
-	return NULL;
-}
-
-/* Given a "sink" access, a list of n "source" accesses,
- * compute for each iteration of the sink access
- * and for each element accessed by that iteration,
- * the source access in the list that last accessed the
- * element accessed by the sink access before this sink access.
- * Each access is given as a map from the loop iterators
- * to the array indices.
- * The result is a list of n relations between source and sink
- * iterations and a subset of the domain of the sink access,
- * corresponding to those iterations that access an element
- * not previously accessed.
- *
- * To deal with multi-valued sink access relations, the sink iteration
- * domain is first extended with dimensions that correspond to the data
- * space.  After the computation is finished, these extra dimensions are
- * projected out again.
- */
-__isl_give isl_flow *isl_access_info_compute_flow(__isl_take isl_access_info *acc)
-{
-	int j;
-	struct isl_flow *res;
-	isl_map *domain_map = NULL;
-
-	if (!acc)
-		return NULL;
-
-	domain_map = isl_map_domain_map(isl_map_copy(acc->sink.map));
-	acc->sink.map = isl_map_range_map(acc->sink.map);
-	if (!acc->sink.map)
-		goto error;
-
-	if (acc->n_must == 0)
-		res = compute_mem_based_dependences(acc);
-	else
-		res = compute_val_based_dependences(acc);
-	if (!res)
-		goto error2;
-
-	for (j = 0; j < res->n_source; ++j) {
-		res->dep[j].map = isl_map_apply_range(res->dep[j].map,
-					isl_map_copy(domain_map));
-		if (!res->dep[j].map)
-			goto error2;
-	}
-	if (!res->must_no_source || !res->may_no_source)
-		goto error2;
-
-	isl_map_free(domain_map);
-	return res;
-error:
-	isl_map_free(domain_map);
-	isl_access_info_free(acc);
-	return NULL;
-error2:
-	isl_map_free(domain_map);
-	isl_flow_free(res);
-	return NULL;
-}
-
-
-/* Keep track of some information about a schedule for a given
- * access.  In particular, keep track of which dimensions
- * have a constant value and of the actual constant values.
- */
-struct isl_sched_info {
-	int *is_cst;
-	isl_vec *cst;
-};
-
-static void sched_info_free(__isl_take struct isl_sched_info *info)
-{
-	if (!info)
-		return;
-	isl_vec_free(info->cst);
-	free(info->is_cst);
-	free(info);
-}
-
-/* Extract information on the constant dimensions of the schedule
- * for a given access.  The "map" is of the form
- *
- *	[S -> D] -> A
- *
- * with S the schedule domain, D the iteration domain and A the data domain.
- */
-static __isl_give struct isl_sched_info *sched_info_alloc(
-	__isl_keep isl_map *map)
-{
-	isl_ctx *ctx;
-	isl_space *dim;
-	struct isl_sched_info *info;
-	int i, n;
-
-	if (!map)
-		return NULL;
-
-	dim = isl_space_unwrap(isl_space_domain(isl_map_get_space(map)));
-	if (!dim)
-		return NULL;
-	n = isl_space_dim(dim, isl_dim_in);
-	isl_space_free(dim);
-
-	ctx = isl_map_get_ctx(map);
-	info = isl_alloc_type(ctx, struct isl_sched_info);
-	if (!info)
-		return NULL;
-	info->is_cst = isl_alloc_array(ctx, int, n);
-	info->cst = isl_vec_alloc(ctx, n);
-	if (!info->is_cst || !info->cst)
-		goto error;
-
-	for (i = 0; i < n; ++i)
-		info->is_cst[i] = isl_map_plain_is_fixed(map, isl_dim_in, i,
-							&info->cst->el[i]);
-
-	return info;
-error:
-	sched_info_free(info);
-	return NULL;
-}
-
-struct isl_compute_flow_data {
-	isl_union_map *must_source;
-	isl_union_map *may_source;
-	isl_union_map *must_dep;
-	isl_union_map *may_dep;
-	isl_union_map *must_no_source;
-	isl_union_map *may_no_source;
-
-	int count;
-	int must;
-	isl_space *dim;
-	struct isl_sched_info *sink_info;
-	struct isl_sched_info **source_info;
-	isl_access_info *accesses;
-};
-
-static int count_matching_array(__isl_take isl_map *map, void *user)
-{
-	int eq;
-	isl_space *dim;
-	struct isl_compute_flow_data *data;
-
-	data = (struct isl_compute_flow_data *)user;
-
-	dim = isl_space_range(isl_map_get_space(map));
-
-	eq = isl_space_is_equal(dim, data->dim);
-
-	isl_space_free(dim);
-	isl_map_free(map);
-
-	if (eq < 0)
-		return -1;
-	if (eq)
-		data->count++;
-
-	return 0;
-}
-
-static int collect_matching_array(__isl_take isl_map *map, void *user)
-{
-	int eq;
-	isl_space *dim;
-	struct isl_sched_info *info;
-	struct isl_compute_flow_data *data;
-
-	data = (struct isl_compute_flow_data *)user;
-
-	dim = isl_space_range(isl_map_get_space(map));
-
-	eq = isl_space_is_equal(dim, data->dim);
-
-	isl_space_free(dim);
-
-	if (eq < 0)
-		goto error;
-	if (!eq) {
-		isl_map_free(map);
-		return 0;
-	}
-
-	info = sched_info_alloc(map);
-	data->source_info[data->count] = info;
-
-	data->accesses = isl_access_info_add_source(data->accesses,
-						    map, data->must, info);
-
-	data->count++;
-
-	return 0;
-error:
-	isl_map_free(map);
-	return -1;
-}
-
-/* Determine the shared nesting level and the "textual order" of
- * the given accesses.
- *
- * We first determine the minimal schedule dimension for both accesses.
- *
- * If among those dimensions, we can find one where both have a fixed
- * value and if moreover those values are different, then the previous
- * dimension is the last shared nesting level and the textual order
- * is determined based on the order of the fixed values.
- * If no such fixed values can be found, then we set the shared
- * nesting level to the minimal schedule dimension, with no textual ordering.
- */
-static int before(void *first, void *second)
-{
-	struct isl_sched_info *info1 = first;
-	struct isl_sched_info *info2 = second;
-	int n1, n2;
-	int i;
-
-	n1 = info1->cst->size;
-	n2 = info2->cst->size;
-
-	if (n2 < n1)
-		n1 = n2;
-
-	for (i = 0; i < n1; ++i) {
-		if (!info1->is_cst[i])
-			continue;
-		if (!info2->is_cst[i])
-			continue;
-		if (isl_int_eq(info1->cst->el[i], info2->cst->el[i]))
-			continue;
-		return 2 * i + isl_int_lt(info1->cst->el[i], info2->cst->el[i]);
-	}
-
-	return 2 * n1;
-}
-
-/* Given a sink access, look for all the source accesses that access
- * the same array and perform dataflow analysis on them using
- * isl_access_info_compute_flow.
- */
-static int compute_flow(__isl_take isl_map *map, void *user)
-{
-	int i;
-	isl_ctx *ctx;
-	struct isl_compute_flow_data *data;
-	isl_flow *flow;
-
-	data = (struct isl_compute_flow_data *)user;
-
-	ctx = isl_map_get_ctx(map);
-
-	data->accesses = NULL;
-	data->sink_info = NULL;
-	data->source_info = NULL;
-	data->count = 0;
-	data->dim = isl_space_range(isl_map_get_space(map));
-
-	if (isl_union_map_foreach_map(data->must_source,
-					&count_matching_array, data) < 0)
-		goto error;
-	if (isl_union_map_foreach_map(data->may_source,
-					&count_matching_array, data) < 0)
-		goto error;
-
-	data->sink_info = sched_info_alloc(map);
-	data->source_info = isl_calloc_array(ctx, struct isl_sched_info *,
-					     data->count);
-
-	data->accesses = isl_access_info_alloc(isl_map_copy(map),
-				data->sink_info, &before, data->count);
-	if (!data->sink_info || !data->source_info || !data->accesses)
-		goto error;
-	data->count = 0;
-	data->must = 1;
-	if (isl_union_map_foreach_map(data->must_source,
-					&collect_matching_array, data) < 0)
-		goto error;
-	data->must = 0;
-	if (isl_union_map_foreach_map(data->may_source,
-					&collect_matching_array, data) < 0)
-		goto error;
-
-	flow = isl_access_info_compute_flow(data->accesses);
-	data->accesses = NULL;
-
-	if (!flow)
-		goto error;
-
-	data->must_no_source = isl_union_map_union(data->must_no_source,
-		    isl_union_map_from_map(isl_flow_get_no_source(flow, 1)));
-	data->may_no_source = isl_union_map_union(data->may_no_source,
-		    isl_union_map_from_map(isl_flow_get_no_source(flow, 0)));
-
-	for (i = 0; i < flow->n_source; ++i) {
-		isl_union_map *dep;
-		dep = isl_union_map_from_map(isl_map_copy(flow->dep[i].map));
-		if (flow->dep[i].must)
-			data->must_dep = isl_union_map_union(data->must_dep, dep);
-		else
-			data->may_dep = isl_union_map_union(data->may_dep, dep);
-	}
-
-	isl_flow_free(flow);
-
-	sched_info_free(data->sink_info);
-	if (data->source_info) {
-		for (i = 0; i < data->count; ++i)
-			sched_info_free(data->source_info[i]);
-		free(data->source_info);
-	}
-	isl_space_free(data->dim);
-	isl_map_free(map);
-
-	return 0;
-error:
-	isl_access_info_free(data->accesses);
-	sched_info_free(data->sink_info);
-	if (data->source_info) {
-		for (i = 0; i < data->count; ++i)
-			sched_info_free(data->source_info[i]);
-		free(data->source_info);
-	}
-	isl_space_free(data->dim);
-	isl_map_free(map);
-
-	return -1;
-}
-
-/* Given a collection of "sink" and "source" accesses,
- * compute for each iteration of a sink access
- * and for each element accessed by that iteration,
- * the source access in the list that last accessed the
- * element accessed by the sink access before this sink access.
- * Each access is given as a map from the loop iterators
- * to the array indices.
- * The result is a relations between source and sink
- * iterations and a subset of the domain of the sink accesses,
- * corresponding to those iterations that access an element
- * not previously accessed.
- *
- * We first prepend the schedule dimensions to the domain
- * of the accesses so that we can easily compare their relative order.
- * Then we consider each sink access individually in compute_flow.
- */
-int isl_union_map_compute_flow(__isl_take isl_union_map *sink,
-	__isl_take isl_union_map *must_source,
-	__isl_take isl_union_map *may_source,
-	__isl_take isl_union_map *schedule,
-	__isl_give isl_union_map **must_dep, __isl_give isl_union_map **may_dep,
-	__isl_give isl_union_map **must_no_source,
-	__isl_give isl_union_map **may_no_source)
-{
-	isl_space *dim;
-	isl_union_map *range_map = NULL;
-	struct isl_compute_flow_data data;
-
-	sink = isl_union_map_align_params(sink,
-					    isl_union_map_get_space(must_source));
-	sink = isl_union_map_align_params(sink,
-					    isl_union_map_get_space(may_source));
-	sink = isl_union_map_align_params(sink,
-					    isl_union_map_get_space(schedule));
-	dim = isl_union_map_get_space(sink);
-	must_source = isl_union_map_align_params(must_source, isl_space_copy(dim));
-	may_source = isl_union_map_align_params(may_source, isl_space_copy(dim));
-	schedule = isl_union_map_align_params(schedule, isl_space_copy(dim));
-
-	schedule = isl_union_map_reverse(schedule);
-	range_map = isl_union_map_range_map(schedule);
-	schedule = isl_union_map_reverse(isl_union_map_copy(range_map));
-	sink = isl_union_map_apply_domain(sink, isl_union_map_copy(schedule));
-	must_source = isl_union_map_apply_domain(must_source,
-						isl_union_map_copy(schedule));
-	may_source = isl_union_map_apply_domain(may_source, schedule);
-
-	data.must_source = must_source;
-	data.may_source = may_source;
-	data.must_dep = must_dep ?
-		isl_union_map_empty(isl_space_copy(dim)) : NULL;
-	data.may_dep = may_dep ? isl_union_map_empty(isl_space_copy(dim)) : NULL;
-	data.must_no_source = must_no_source ?
-		isl_union_map_empty(isl_space_copy(dim)) : NULL;
-	data.may_no_source = may_no_source ?
-		isl_union_map_empty(isl_space_copy(dim)) : NULL;
-
-	isl_space_free(dim);
-
-	if (isl_union_map_foreach_map(sink, &compute_flow, &data) < 0)
-		goto error;
-
-	isl_union_map_free(sink);
-	isl_union_map_free(must_source);
-	isl_union_map_free(may_source);
-
-	if (must_dep) {
-		data.must_dep = isl_union_map_apply_domain(data.must_dep,
-					isl_union_map_copy(range_map));
-		data.must_dep = isl_union_map_apply_range(data.must_dep,
-					isl_union_map_copy(range_map));
-		*must_dep = data.must_dep;
-	}
-	if (may_dep) {
-		data.may_dep = isl_union_map_apply_domain(data.may_dep,
-					isl_union_map_copy(range_map));
-		data.may_dep = isl_union_map_apply_range(data.may_dep,
-					isl_union_map_copy(range_map));
-		*may_dep = data.may_dep;
-	}
-	if (must_no_source) {
-		data.must_no_source = isl_union_map_apply_domain(
-			data.must_no_source, isl_union_map_copy(range_map));
-		*must_no_source = data.must_no_source;
-	}
-	if (may_no_source) {
-		data.may_no_source = isl_union_map_apply_domain(
-			data.may_no_source, isl_union_map_copy(range_map));
-		*may_no_source = data.may_no_source;
-	}
-
-	isl_union_map_free(range_map);
-
-	return 0;
-error:
-	isl_union_map_free(range_map);
-	isl_union_map_free(sink);
-	isl_union_map_free(must_source);
-	isl_union_map_free(may_source);
-	isl_union_map_free(data.must_dep);
-	isl_union_map_free(data.may_dep);
-	isl_union_map_free(data.must_no_source);
-	isl_union_map_free(data.may_no_source);
-
-	if (must_dep)
-		*must_dep = NULL;
-	if (may_dep)
-		*may_dep = NULL;
-	if (must_no_source)
-		*must_no_source = NULL;
-	if (may_no_source)
-		*may_no_source = NULL;
-	return -1;
-}
diff --git a/cloog-0.17.0/isl/isl_fold.c b/cloog-0.17.0/isl/isl_fold.c
deleted file mode 100644
index b96c096..0000000
--- a/cloog-0.17.0/isl/isl_fold.c
+++ /dev/null
@@ -1,1629 +0,0 @@
-/*
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France 
- */
-
-#define ISL_DIM_H
-#include <isl_map_private.h>
-#include <isl_union_map_private.h>
-#include <isl_polynomial_private.h>
-#include <isl_point_private.h>
-#include <isl_space_private.h>
-#include <isl/lp.h>
-#include <isl/seq.h>
-#include <isl_mat_private.h>
-#include <isl_config.h>
-
-enum isl_fold isl_fold_type_negate(enum isl_fold type)
-{
-	switch (type) {
-	case isl_fold_min:
-		return isl_fold_max;
-	case isl_fold_max:
-		return isl_fold_min;
-	case isl_fold_list:
-		return isl_fold_list;
-	}
-
-	isl_die(NULL, isl_error_internal, "unhandled isl_fold type", abort());
-}
-
-static __isl_give isl_qpolynomial_fold *qpolynomial_fold_alloc(
-	enum isl_fold type, __isl_take isl_space *dim, int n)
-{
-	isl_qpolynomial_fold *fold;
-
-	if (!dim)
-		goto error;
-
-	isl_assert(dim->ctx, n >= 0, goto error);
-	fold = isl_calloc(dim->ctx, struct isl_qpolynomial_fold,
-			sizeof(struct isl_qpolynomial_fold) +
-			(n - 1) * sizeof(struct isl_qpolynomial *));
-	if (!fold)
-		goto error;
-
-	fold->ref = 1;
-	fold->size = n;
-	fold->n = 0;
-	fold->type = type;
-	fold->dim = dim;
-
-	return fold;
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-isl_ctx *isl_qpolynomial_fold_get_ctx(__isl_keep isl_qpolynomial_fold *fold)
-{
-	return fold ? fold->dim->ctx : NULL;
-}
-
-__isl_give isl_space *isl_qpolynomial_fold_get_domain_space(
-	__isl_keep isl_qpolynomial_fold *fold)
-{
-	return fold ? isl_space_copy(fold->dim) : NULL;
-}
-
-__isl_give isl_space *isl_qpolynomial_fold_get_space(
-	__isl_keep isl_qpolynomial_fold *fold)
-{
-	isl_space *space;
-	if (!fold)
-		return NULL;
-	space = isl_space_copy(fold->dim);
-	space = isl_space_from_domain(space);
-	space = isl_space_add_dims(space, isl_dim_out, 1);
-	return space;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_reset_domain_space(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_space *dim)
-{
-	int i;
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold || !dim)
-		goto error;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_reset_domain_space(fold->qp[i],
-							isl_space_copy(dim));
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	isl_space_free(fold->dim);
-	fold->dim = dim;
-
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	isl_space_free(dim);
-	return NULL;
-}
-
-/* Reset the space of "fold".  This function is called from isl_pw_templ.c
- * and doesn't know if the space of an element object is represented
- * directly or through its domain.  It therefore passes along both.
- */
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_reset_space_and_domain(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_space *space,
-	__isl_take isl_space *domain)
-{
-	isl_space_free(space);
-	return isl_qpolynomial_fold_reset_domain_space(fold, domain);
-}
-
-int isl_qpolynomial_fold_involves_dims(__isl_keep isl_qpolynomial_fold *fold,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!fold)
-		return -1;
-	if (fold->n == 0 || n == 0)
-		return 0;
-
-	for (i = 0; i < fold->n; ++i) {
-		int involves = isl_qpolynomial_involves_dims(fold->qp[i],
-							    type, first, n);
-		if (involves < 0 || involves)
-			return involves;
-	}
-	return 0;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_set_dim_name(
-	__isl_take isl_qpolynomial_fold *fold,
-	enum isl_dim_type type, unsigned pos, const char *s)
-{
-	int i;
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold)
-		return NULL;
-	fold->dim = isl_space_set_dim_name(fold->dim, type, pos, s);
-	if (!fold->dim)
-		goto error;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_set_dim_name(fold->qp[i],
-							    type, pos, s);
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_drop_dims(
-	__isl_take isl_qpolynomial_fold *fold,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-	enum isl_dim_type set_type;
-
-	if (!fold)
-		return NULL;
-	if (n == 0)
-		return fold;
-
-	set_type = type == isl_dim_in ? isl_dim_set : type;
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold)
-		return NULL;
-	fold->dim = isl_space_drop_dims(fold->dim, set_type, first, n);
-	if (!fold->dim)
-		goto error;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_drop_dims(fold->qp[i],
-							    type, first, n);
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_insert_dims(
-	__isl_take isl_qpolynomial_fold *fold,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!fold)
-		return NULL;
-	if (n == 0 && !isl_space_is_named_or_nested(fold->dim, type))
-		return fold;
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold)
-		return NULL;
-	fold->dim = isl_space_insert_dims(fold->dim, type, first, n);
-	if (!fold->dim)
-		goto error;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_insert_dims(fold->qp[i],
-							    type, first, n);
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	return NULL;
-}
-
-static int isl_qpolynomial_cst_sign(__isl_keep isl_qpolynomial *qp)
-{
-	struct isl_upoly_cst *cst;
-
-	cst = isl_upoly_as_cst(qp->upoly);
-	if (!cst)
-		return 0;
-
-	return isl_int_sgn(cst->n) < 0 ? -1 : 1;
-}
-
-static int isl_qpolynomial_aff_sign(__isl_keep isl_set *set,
-	__isl_keep isl_qpolynomial *qp)
-{
-	enum isl_lp_result res;
-	isl_vec *aff;
-	isl_int opt;
-	int sgn = 0;
-
-	aff = isl_qpolynomial_extract_affine(qp);
-	if (!aff)
-		return 0;
-
-	isl_int_init(opt);
-
-	res = isl_set_solve_lp(set, 0, aff->el + 1, aff->el[0],
-				&opt, NULL, NULL);
-	if (res == isl_lp_error)
-		goto done;
-	if (res == isl_lp_empty ||
-	    (res == isl_lp_ok && !isl_int_is_neg(opt))) {
-		sgn = 1;
-		goto done;
-	}
-
-	res = isl_set_solve_lp(set, 1, aff->el + 1, aff->el[0],
-				&opt, NULL, NULL);
-	if (res == isl_lp_ok && !isl_int_is_pos(opt))
-		sgn = -1;
-
-done:
-	isl_int_clear(opt);
-	isl_vec_free(aff);
-	return sgn;
-}
-
-/* Determine, if possible, the sign of the quasipolynomial "qp" on
- * the domain "set".
- *
- * If qp is a constant, then the problem is trivial.
- * If qp is linear, then we check if the minimum of the corresponding
- * affine constraint is non-negative or if the maximum is non-positive.
- *
- * Otherwise, we check if the outermost variable "v" has a lower bound "l"
- * in "set".  If so, we write qp(v,v') as
- *
- *	q(v,v') * (v - l) + r(v')
- *
- * if q(v,v') and r(v') have the same known sign, then the original
- * quasipolynomial has the same sign as well.
- *
- * Return
- *	-1 if qp <= 0
- *	 1 if qp >= 0
- *	 0 if unknown
- */
-static int isl_qpolynomial_sign(__isl_keep isl_set *set,
-	__isl_keep isl_qpolynomial *qp)
-{
-	int d;
-	int i;
-	int is;
-	struct isl_upoly_rec *rec;
-	isl_vec *v;
-	isl_int l;
-	enum isl_lp_result res;
-	int sgn = 0;
-
-	is = isl_qpolynomial_is_cst(qp, NULL, NULL);
-	if (is < 0)
-		return 0;
-	if (is)
-		return isl_qpolynomial_cst_sign(qp);
-
-	is = isl_qpolynomial_is_affine(qp);
-	if (is < 0)
-		return 0;
-	if (is)
-		return isl_qpolynomial_aff_sign(set, qp);
-
-	if (qp->div->n_row > 0)
-		return 0;
-
-	rec = isl_upoly_as_rec(qp->upoly);
-	if (!rec)
-		return 0;
-
-	d = isl_space_dim(qp->dim, isl_dim_all);
-	v = isl_vec_alloc(set->ctx, 2 + d);
-	if (!v)
-		return 0;
-
-	isl_seq_clr(v->el + 1, 1 + d);
-	isl_int_set_si(v->el[0], 1);
-	isl_int_set_si(v->el[2 + qp->upoly->var], 1);
-
-	isl_int_init(l);
-
-	res = isl_set_solve_lp(set, 0, v->el + 1, v->el[0], &l, NULL, NULL);
-	if (res == isl_lp_ok) {
-		isl_qpolynomial *min;
-		isl_qpolynomial *base;
-		isl_qpolynomial *r, *q;
-		isl_qpolynomial *t;
-
-		min = isl_qpolynomial_cst_on_domain(isl_space_copy(qp->dim), l);
-		base = isl_qpolynomial_var_pow_on_domain(isl_space_copy(qp->dim),
-						qp->upoly->var, 1);
-
-		r = isl_qpolynomial_alloc(isl_space_copy(qp->dim), 0,
-					  isl_upoly_copy(rec->p[rec->n - 1]));
-		q = isl_qpolynomial_copy(r);
-
-		for (i = rec->n - 2; i >= 0; --i) {
-			r = isl_qpolynomial_mul(r, isl_qpolynomial_copy(min));
-			t = isl_qpolynomial_alloc(isl_space_copy(qp->dim), 0,
-						  isl_upoly_copy(rec->p[i]));
-			r = isl_qpolynomial_add(r, t);
-			if (i == 0)
-				break;
-			q = isl_qpolynomial_mul(q, isl_qpolynomial_copy(base));
-			q = isl_qpolynomial_add(q, isl_qpolynomial_copy(r));
-		}
-
-		if (isl_qpolynomial_is_zero(q))
-			sgn = isl_qpolynomial_sign(set, r);
-		else if (isl_qpolynomial_is_zero(r))
-			sgn = isl_qpolynomial_sign(set, q);
-		else {
-			int sgn_q, sgn_r;
-			sgn_r = isl_qpolynomial_sign(set, r);
-			sgn_q = isl_qpolynomial_sign(set, q);
-			if (sgn_r == sgn_q)
-				sgn = sgn_r;
-		}
-
-		isl_qpolynomial_free(min);
-		isl_qpolynomial_free(base);
-		isl_qpolynomial_free(q);
-		isl_qpolynomial_free(r);
-	}
-
-	isl_int_clear(l);
-
-	isl_vec_free(v);
-
-	return sgn;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_fold_on_domain(
-	__isl_keep isl_set *set,
-	__isl_take isl_qpolynomial_fold *fold1,
-	__isl_take isl_qpolynomial_fold *fold2)
-{
-	int i, j;
-	int n1;
-	struct isl_qpolynomial_fold *res = NULL;
-	int better;
-
-	if (!fold1 || !fold2)
-		goto error;
-
-	isl_assert(fold1->dim->ctx, fold1->type == fold2->type, goto error);
-	isl_assert(fold1->dim->ctx, isl_space_is_equal(fold1->dim, fold2->dim),
-			goto error);
-
-	better = fold1->type == isl_fold_max ? -1 : 1;
-
-	if (isl_qpolynomial_fold_is_empty(fold1)) {
-		isl_qpolynomial_fold_free(fold1);
-		return fold2;
-	}
-
-	if (isl_qpolynomial_fold_is_empty(fold2)) {
-		isl_qpolynomial_fold_free(fold2);
-		return fold1;
-	}
-
-	res = qpolynomial_fold_alloc(fold1->type, isl_space_copy(fold1->dim),
-					fold1->n + fold2->n);
-	if (!res)
-		goto error;
-
-	for (i = 0; i < fold1->n; ++i) {
-		res->qp[res->n] = isl_qpolynomial_copy(fold1->qp[i]);
-		if (!res->qp[res->n])
-			goto error;
-		res->n++;
-	}
-	n1 = res->n;
-
-	for (i = 0; i < fold2->n; ++i) {
-		for (j = n1 - 1; j >= 0; --j) {
-			isl_qpolynomial *d;
-			int sgn;
-			d = isl_qpolynomial_sub(
-				isl_qpolynomial_copy(res->qp[j]),
-				isl_qpolynomial_copy(fold2->qp[i]));
-			sgn = isl_qpolynomial_sign(set, d);
-			isl_qpolynomial_free(d);
-			if (sgn == 0)
-				continue;
-			if (sgn != better)
-				break;
-			isl_qpolynomial_free(res->qp[j]);
-			if (j != n1 - 1)
-				res->qp[j] = res->qp[n1 - 1];
-			n1--;
-			if (n1 != res->n - 1)
-				res->qp[n1] = res->qp[res->n - 1];
-			res->n--;
-		}
-		if (j >= 0)
-			continue;
-		res->qp[res->n] = isl_qpolynomial_copy(fold2->qp[i]);
-		if (!res->qp[res->n])
-			goto error;
-		res->n++;
-	}
-
-	isl_qpolynomial_fold_free(fold1);
-	isl_qpolynomial_fold_free(fold2);
-
-	return res;
-error:
-	isl_qpolynomial_fold_free(res);
-	isl_qpolynomial_fold_free(fold1);
-	isl_qpolynomial_fold_free(fold2);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_add_qpolynomial(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_qpolynomial *qp)
-{
-	int i;
-
-	if (!fold || !qp)
-		goto error;
-
-	if (isl_qpolynomial_is_zero(qp)) {
-		isl_qpolynomial_free(qp);
-		return fold;
-	}
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold)
-		goto error;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_add(fold->qp[i],
-						isl_qpolynomial_copy(qp));
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	isl_qpolynomial_free(qp);
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_add_on_domain(
-	__isl_keep isl_set *dom,
-	__isl_take isl_qpolynomial_fold *fold1,
-	__isl_take isl_qpolynomial_fold *fold2)
-{
-	int i;
-	isl_qpolynomial_fold *res = NULL;
-
-	if (!fold1 || !fold2)
-		goto error;
-
-	if (isl_qpolynomial_fold_is_empty(fold1)) {
-		isl_qpolynomial_fold_free(fold1);
-		return fold2;
-	}
-
-	if (isl_qpolynomial_fold_is_empty(fold2)) {
-		isl_qpolynomial_fold_free(fold2);
-		return fold1;
-	}
-
-	if (fold1->n == 1 && fold2->n != 1)
-		return isl_qpolynomial_fold_add_on_domain(dom, fold2, fold1);
-
-	if (fold2->n == 1) {
-		res = isl_qpolynomial_fold_add_qpolynomial(fold1,
-					isl_qpolynomial_copy(fold2->qp[0]));
-		isl_qpolynomial_fold_free(fold2);
-		return res;
-	}
-
-	res = isl_qpolynomial_fold_add_qpolynomial(
-				isl_qpolynomial_fold_copy(fold1),
-				isl_qpolynomial_copy(fold2->qp[0]));
-
-	for (i = 1; i < fold2->n; ++i) {
-		isl_qpolynomial_fold *res_i;
-		res_i = isl_qpolynomial_fold_add_qpolynomial(
-					isl_qpolynomial_fold_copy(fold1),
-					isl_qpolynomial_copy(fold2->qp[i]));
-		res = isl_qpolynomial_fold_fold_on_domain(dom, res, res_i);
-	}
-
-	isl_qpolynomial_fold_free(fold1);
-	isl_qpolynomial_fold_free(fold2);
-	return res;
-error:
-	isl_qpolynomial_fold_free(res);
-	isl_qpolynomial_fold_free(fold1);
-	isl_qpolynomial_fold_free(fold2);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_substitute_equalities(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_basic_set *eq)
-{
-	int i;
-
-	if (!fold || !eq)
-		goto error;
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold)
-		return NULL;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_substitute_equalities(fold->qp[i],
-							isl_basic_set_copy(eq));
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	isl_basic_set_free(eq);
-	return fold;
-error:
-	isl_basic_set_free(eq);
-	isl_qpolynomial_fold_free(fold);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_gist(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_set *context)
-{
-	int i;
-
-	if (!fold || !context)
-		goto error;
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold)
-		return NULL;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_gist(fold->qp[i],
-							isl_set_copy(context));
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	isl_set_free(context);
-	return fold;
-error:
-	isl_set_free(context);
-	isl_qpolynomial_fold_free(fold);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_gist_params(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_set *context)
-{
-	isl_space *space = isl_qpolynomial_fold_get_domain_space(fold);
-	isl_set *dom_context = isl_set_universe(space);
-	dom_context = isl_set_intersect_params(dom_context, context);
-	return isl_qpolynomial_fold_gist(fold, dom_context);
-}
-
-#define HAS_TYPE
-
-#undef PW
-#define PW isl_pw_qpolynomial_fold
-#undef EL
-#define EL isl_qpolynomial_fold
-#undef EL_IS_ZERO
-#define EL_IS_ZERO is_empty
-#undef ZERO
-#define ZERO zero
-#undef IS_ZERO
-#define IS_ZERO is_zero
-#undef FIELD
-#define FIELD fold
-#undef DEFAULT_IS_ZERO
-#define DEFAULT_IS_ZERO 1
-
-#define NO_NEG
-
-#include <isl_pw_templ.c>
-
-#undef UNION
-#define UNION isl_union_pw_qpolynomial_fold
-#undef PART
-#define PART isl_pw_qpolynomial_fold
-#undef PARTS
-#define PARTS pw_qpolynomial_fold
-#define ALIGN_DOMAIN
-
-#include <isl_union_templ.c>
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_empty(enum isl_fold type,
-	__isl_take isl_space *dim)
-{
-	return qpolynomial_fold_alloc(type, dim, 0);
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_alloc(
-	enum isl_fold type, __isl_take isl_qpolynomial *qp)
-{
-	isl_qpolynomial_fold *fold;
-
-	if (!qp)
-		return NULL;
-
-	fold = qpolynomial_fold_alloc(type, isl_space_copy(qp->dim), 1);
-	if (!fold)
-		goto error;
-
-	fold->qp[0] = qp;
-	fold->n++;
-
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_copy(
-	__isl_keep isl_qpolynomial_fold *fold)
-{
-	if (!fold)
-		return NULL;
-
-	fold->ref++;
-	return fold;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_dup(
-	__isl_keep isl_qpolynomial_fold *fold)
-{
-	int i;
-	isl_qpolynomial_fold *dup;
-
-	if (!fold)
-		return NULL;
-	dup = qpolynomial_fold_alloc(fold->type,
-					isl_space_copy(fold->dim), fold->n);
-	if (!dup)
-		return NULL;
-	
-	dup->n = fold->n;
-	for (i = 0; i < fold->n; ++i) {
-		dup->qp[i] = isl_qpolynomial_copy(fold->qp[i]);
-		if (!dup->qp[i])
-			goto error;
-	}
-
-	return dup;
-error:
-	isl_qpolynomial_fold_free(dup);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_cow(
-	__isl_take isl_qpolynomial_fold *fold)
-{
-	if (!fold)
-		return NULL;
-
-	if (fold->ref == 1)
-		return fold;
-	fold->ref--;
-	return isl_qpolynomial_fold_dup(fold);
-}
-
-void isl_qpolynomial_fold_free(__isl_take isl_qpolynomial_fold *fold)
-{
-	int i;
-
-	if (!fold)
-		return;
-	if (--fold->ref > 0)
-		return;
-
-	for (i = 0; i < fold->n; ++i)
-		isl_qpolynomial_free(fold->qp[i]);
-	isl_space_free(fold->dim);
-	free(fold);
-}
-
-int isl_qpolynomial_fold_is_empty(__isl_keep isl_qpolynomial_fold *fold)
-{
-	if (!fold)
-		return -1;
-
-	return fold->n == 0;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_fold(
-	__isl_take isl_qpolynomial_fold *fold1,
-	__isl_take isl_qpolynomial_fold *fold2)
-{
-	int i;
-	struct isl_qpolynomial_fold *res = NULL;
-
-	if (!fold1 || !fold2)
-		goto error;
-
-	isl_assert(fold1->dim->ctx, fold1->type == fold2->type, goto error);
-	isl_assert(fold1->dim->ctx, isl_space_is_equal(fold1->dim, fold2->dim),
-			goto error);
-
-	if (isl_qpolynomial_fold_is_empty(fold1)) {
-		isl_qpolynomial_fold_free(fold1);
-		return fold2;
-	}
-
-	if (isl_qpolynomial_fold_is_empty(fold2)) {
-		isl_qpolynomial_fold_free(fold2);
-		return fold1;
-	}
-
-	res = qpolynomial_fold_alloc(fold1->type, isl_space_copy(fold1->dim),
-					fold1->n + fold2->n);
-	if (!res)
-		goto error;
-
-	for (i = 0; i < fold1->n; ++i) {
-		res->qp[res->n] = isl_qpolynomial_copy(fold1->qp[i]);
-		if (!res->qp[res->n])
-			goto error;
-		res->n++;
-	}
-
-	for (i = 0; i < fold2->n; ++i) {
-		res->qp[res->n] = isl_qpolynomial_copy(fold2->qp[i]);
-		if (!res->qp[res->n])
-			goto error;
-		res->n++;
-	}
-
-	isl_qpolynomial_fold_free(fold1);
-	isl_qpolynomial_fold_free(fold2);
-
-	return res;
-error:
-	isl_qpolynomial_fold_free(res);
-	isl_qpolynomial_fold_free(fold1);
-	isl_qpolynomial_fold_free(fold2);
-	return NULL;
-}
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_fold(
-	__isl_take isl_pw_qpolynomial_fold *pw1,
-	__isl_take isl_pw_qpolynomial_fold *pw2)
-{
-	int i, j, n;
-	struct isl_pw_qpolynomial_fold *res;
-	isl_set *set;
-
-	if (!pw1 || !pw2)
-		goto error;
-
-	isl_assert(pw1->dim->ctx, isl_space_is_equal(pw1->dim, pw2->dim), goto error);
-
-	if (isl_pw_qpolynomial_fold_is_zero(pw1)) {
-		isl_pw_qpolynomial_fold_free(pw1);
-		return pw2;
-	}
-
-	if (isl_pw_qpolynomial_fold_is_zero(pw2)) {
-		isl_pw_qpolynomial_fold_free(pw2);
-		return pw1;
-	}
-
-	if (pw1->type != pw2->type)
-		isl_die(pw1->dim->ctx, isl_error_invalid,
-			"fold types don't match", goto error);
-
-	n = (pw1->n + 1) * (pw2->n + 1);
-	res = isl_pw_qpolynomial_fold_alloc_size(isl_space_copy(pw1->dim),
-						pw1->type, n);
-
-	for (i = 0; i < pw1->n; ++i) {
-		set = isl_set_copy(pw1->p[i].set);
-		for (j = 0; j < pw2->n; ++j) {
-			struct isl_set *common;
-			isl_qpolynomial_fold *sum;
-			set = isl_set_subtract(set,
-					isl_set_copy(pw2->p[j].set));
-			common = isl_set_intersect(isl_set_copy(pw1->p[i].set),
-						isl_set_copy(pw2->p[j].set));
-			if (isl_set_plain_is_empty(common)) {
-				isl_set_free(common);
-				continue;
-			}
-
-			sum = isl_qpolynomial_fold_fold_on_domain(common,
-			       isl_qpolynomial_fold_copy(pw1->p[i].fold),
-			       isl_qpolynomial_fold_copy(pw2->p[j].fold));
-
-			res = isl_pw_qpolynomial_fold_add_piece(res, common, sum);
-		}
-		res = isl_pw_qpolynomial_fold_add_piece(res, set,
-			isl_qpolynomial_fold_copy(pw1->p[i].fold));
-	}
-
-	for (j = 0; j < pw2->n; ++j) {
-		set = isl_set_copy(pw2->p[j].set);
-		for (i = 0; i < pw1->n; ++i)
-			set = isl_set_subtract(set, isl_set_copy(pw1->p[i].set));
-		res = isl_pw_qpolynomial_fold_add_piece(res, set,
-				    isl_qpolynomial_fold_copy(pw2->p[j].fold));
-	}
-
-	isl_pw_qpolynomial_fold_free(pw1);
-	isl_pw_qpolynomial_fold_free(pw2);
-
-	return res;
-error:
-	isl_pw_qpolynomial_fold_free(pw1);
-	isl_pw_qpolynomial_fold_free(pw2);
-	return NULL;
-}
-
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_fold_pw_qpolynomial_fold(
-	__isl_take isl_union_pw_qpolynomial_fold *u,
-	__isl_take isl_pw_qpolynomial_fold *part)
-{
-	uint32_t hash;
-	struct isl_hash_table_entry *entry;
-
-	u = isl_union_pw_qpolynomial_fold_cow(u);
-
-	if (!part || !u)
-		goto error;
-
-	isl_assert(u->dim->ctx, isl_space_match(part->dim, isl_dim_param, u->dim,
-					      isl_dim_param), goto error);
-
-	hash = isl_space_get_hash(part->dim);
-	entry = isl_hash_table_find(u->dim->ctx, &u->table, hash,
-				    &has_dim, part->dim, 1);
-	if (!entry)
-		goto error;
-
-	if (!entry->data)
-		entry->data = part;
-	else {
-		entry->data = isl_pw_qpolynomial_fold_fold(entry->data,
-					    isl_pw_qpolynomial_fold_copy(part));
-		if (!entry->data)
-			goto error;
-		isl_pw_qpolynomial_fold_free(part);
-	}
-
-	return u;
-error:
-	isl_pw_qpolynomial_fold_free(part);
-	isl_union_pw_qpolynomial_fold_free(u);
-	return NULL;
-}
-
-static int fold_part(__isl_take isl_pw_qpolynomial_fold *part, void *user)
-{
-	isl_union_pw_qpolynomial_fold **u;
-	u = (isl_union_pw_qpolynomial_fold **)user;
-
-	*u = isl_union_pw_qpolynomial_fold_fold_pw_qpolynomial_fold(*u, part);
-
-	return 0;
-}
-
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_fold(
-	__isl_take isl_union_pw_qpolynomial_fold *u1,
-	__isl_take isl_union_pw_qpolynomial_fold *u2)
-{
-	u1 = isl_union_pw_qpolynomial_fold_cow(u1);
-
-	if (!u1 || !u2)
-		goto error;
-
-	if (isl_union_pw_qpolynomial_fold_foreach_pw_qpolynomial_fold(u2,
-							&fold_part, &u1) < 0)
-		goto error;
-
-	isl_union_pw_qpolynomial_fold_free(u2);
-
-	return u1;
-error:
-	isl_union_pw_qpolynomial_fold_free(u1);
-	isl_union_pw_qpolynomial_fold_free(u2);
-	return NULL;
-}
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_from_pw_qpolynomial(
-	enum isl_fold type, __isl_take isl_pw_qpolynomial *pwqp)
-{
-	int i;
-	isl_pw_qpolynomial_fold *pwf;
-
-	if (!pwqp)
-		return NULL;
-	
-	pwf = isl_pw_qpolynomial_fold_alloc_size(isl_space_copy(pwqp->dim),
-						type, pwqp->n);
-
-	for (i = 0; i < pwqp->n; ++i)
-		pwf = isl_pw_qpolynomial_fold_add_piece(pwf,
-			isl_set_copy(pwqp->p[i].set),
-			isl_qpolynomial_fold_alloc(type,
-				isl_qpolynomial_copy(pwqp->p[i].qp)));
-
-	isl_pw_qpolynomial_free(pwqp);
-
-	return pwf;
-}
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_add(
-	__isl_take isl_pw_qpolynomial_fold *pwf1,
-	__isl_take isl_pw_qpolynomial_fold *pwf2)
-{
-	return isl_pw_qpolynomial_fold_union_add_(pwf1, pwf2);
-}
-
-int isl_qpolynomial_fold_plain_is_equal(__isl_keep isl_qpolynomial_fold *fold1,
-	__isl_keep isl_qpolynomial_fold *fold2)
-{
-	int i;
-
-	if (!fold1 || !fold2)
-		return -1;
-
-	if (fold1->n != fold2->n)
-		return 0;
-
-	/* We probably want to sort the qps first... */
-	for (i = 0; i < fold1->n; ++i) {
-		int eq = isl_qpolynomial_plain_is_equal(fold1->qp[i], fold2->qp[i]);
-		if (eq < 0 || !eq)
-			return eq;
-	}
-
-	return 1;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_fold_eval(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_point *pnt)
-{
-	isl_qpolynomial *qp;
-
-	if (!fold || !pnt)
-		goto error;
-	isl_assert(pnt->dim->ctx, isl_space_is_equal(pnt->dim, fold->dim), goto error);
-	isl_assert(pnt->dim->ctx,
-		fold->type == isl_fold_max || fold->type == isl_fold_min,
-		goto error);
-
-	if (fold->n == 0)
-		qp = isl_qpolynomial_zero_on_domain(isl_space_copy(fold->dim));
-	else {
-		int i;
-		qp = isl_qpolynomial_eval(isl_qpolynomial_copy(fold->qp[0]),
-						isl_point_copy(pnt));
-		for (i = 1; i < fold->n; ++i) {
-			isl_qpolynomial *qp_i;
-			qp_i = isl_qpolynomial_eval(
-					    isl_qpolynomial_copy(fold->qp[i]),
-					    isl_point_copy(pnt));
-			if (fold->type == isl_fold_max)
-				qp = isl_qpolynomial_max_cst(qp, qp_i);
-			else
-				qp = isl_qpolynomial_min_cst(qp, qp_i);
-		}
-	}
-	isl_qpolynomial_fold_free(fold);
-	isl_point_free(pnt);
-
-	return qp;
-error:
-	isl_qpolynomial_fold_free(fold);
-	isl_point_free(pnt);
-	return NULL;
-}
-
-size_t isl_pw_qpolynomial_fold_size(__isl_keep isl_pw_qpolynomial_fold *pwf)
-{
-	int i;
-	size_t n = 0;
-
-	for (i = 0; i < pwf->n; ++i)
-		n += pwf->p[i].fold->n;
-
-	return n;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_fold_opt_on_domain(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_set *set, int max)
-{
-	int i;
-	isl_qpolynomial *opt;
-
-	if (!set || !fold)
-		goto error;
-
-	if (fold->n == 0) {
-		isl_space *dim = isl_space_copy(fold->dim);
-		isl_set_free(set);
-		isl_qpolynomial_fold_free(fold);
-		return isl_qpolynomial_zero_on_domain(dim);
-	}
-
-	opt = isl_qpolynomial_opt_on_domain(isl_qpolynomial_copy(fold->qp[0]),
-						isl_set_copy(set), max);
-	for (i = 1; i < fold->n; ++i) {
-		isl_qpolynomial *opt_i;
-		opt_i = isl_qpolynomial_opt_on_domain(
-				isl_qpolynomial_copy(fold->qp[i]),
-				isl_set_copy(set), max);
-		if (max)
-			opt = isl_qpolynomial_max_cst(opt, opt_i);
-		else
-			opt = isl_qpolynomial_min_cst(opt, opt_i);
-	}
-
-	isl_set_free(set);
-	isl_qpolynomial_fold_free(fold);
-
-	return opt;
-error:
-	isl_set_free(set);
-	isl_qpolynomial_fold_free(fold);
-	return NULL;
-}
-
-/* Check whether for each quasi-polynomial in "fold2" there is
- * a quasi-polynomial in "fold1" that dominates it on "set".
- */
-static int qpolynomial_fold_covers_on_domain(__isl_keep isl_set *set,
-	__isl_keep isl_qpolynomial_fold *fold1,
-	__isl_keep isl_qpolynomial_fold *fold2)
-{
-	int i, j;
-	int covers;
-
-	if (!set || !fold1 || !fold2)
-		return -1;
-
-	covers = fold1->type == isl_fold_max ? 1 : -1;
-
-	for (i = 0; i < fold2->n; ++i) {
-		for (j = 0; j < fold1->n; ++j) {
-			isl_qpolynomial *d;
-			int sgn;
-
-			d = isl_qpolynomial_sub(
-				isl_qpolynomial_copy(fold1->qp[j]),
-				isl_qpolynomial_copy(fold2->qp[i]));
-			sgn = isl_qpolynomial_sign(set, d);
-			isl_qpolynomial_free(d);
-			if (sgn == covers)
-				break;
-		}
-		if (j >= fold1->n)
-			return 0;
-	}
-
-	return 1;
-}
-
-/* Check whether "pwf1" dominated "pwf2", i.e., the domain of "pwf1" contains
- * that of "pwf2" and on each cell, the corresponding fold from pwf1 dominates
- * that of pwf2.
- */
-int isl_pw_qpolynomial_fold_covers(__isl_keep isl_pw_qpolynomial_fold *pwf1,
-	__isl_keep isl_pw_qpolynomial_fold *pwf2)
-{
-	int i, j;
-	isl_set *dom1, *dom2;
-	int is_subset;
-
-	if (!pwf1 || !pwf2)
-		return -1;
-
-	if (pwf2->n == 0)
-		return 1;
-	if (pwf1->n == 0)
-		return 0;
-
-	dom1 = isl_pw_qpolynomial_fold_domain(isl_pw_qpolynomial_fold_copy(pwf1));
-	dom2 = isl_pw_qpolynomial_fold_domain(isl_pw_qpolynomial_fold_copy(pwf2));
-	is_subset = isl_set_is_subset(dom2, dom1);
-	isl_set_free(dom1);
-	isl_set_free(dom2);
-
-	if (is_subset < 0 || !is_subset)
-		return is_subset;
-
-	for (i = 0; i < pwf2->n; ++i) {
-		for (j = 0; j < pwf1->n; ++j) {
-			int is_empty;
-			isl_set *common;
-			int covers;
-
-			common = isl_set_intersect(isl_set_copy(pwf1->p[j].set),
-						   isl_set_copy(pwf2->p[i].set));
-			is_empty = isl_set_is_empty(common);
-			if (is_empty < 0 || is_empty) {
-				isl_set_free(common);
-				if (is_empty < 0)
-					return -1;
-				continue;
-			}
-			covers = qpolynomial_fold_covers_on_domain(common,
-					pwf1->p[j].fold, pwf2->p[i].fold);
-			isl_set_free(common);
-			if (covers < 0 || !covers)
-				return covers;
-		}
-	}
-
-	return 1;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_morph_domain(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_morph *morph)
-{
-	int i;
-	isl_ctx *ctx;
-
-	if (!fold || !morph)
-		goto error;
-
-	ctx = fold->dim->ctx;
-	isl_assert(ctx, isl_space_is_equal(fold->dim, morph->dom->dim), goto error);
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold)
-		goto error;
-
-	isl_space_free(fold->dim);
-	fold->dim = isl_space_copy(morph->ran->dim);
-	if (!fold->dim)
-		goto error;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_morph_domain(fold->qp[i],
-						isl_morph_copy(morph));
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	isl_morph_free(morph);
-
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	isl_morph_free(morph);
-	return NULL;
-}
-
-enum isl_fold isl_qpolynomial_fold_get_type(__isl_keep isl_qpolynomial_fold *fold)
-{
-	if (!fold)
-		return isl_fold_list;
-	return fold->type;
-}
-
-enum isl_fold isl_union_pw_qpolynomial_fold_get_type(
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf)
-{
-	if (!upwf)
-		return isl_fold_list;
-	return upwf->type;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_lift(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_space *dim)
-{
-	int i;
-
-	if (!fold || !dim)
-		goto error;
-
-	if (isl_space_is_equal(fold->dim, dim)) {
-		isl_space_free(dim);
-		return fold;
-	}
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold)
-		goto error;
-
-	isl_space_free(fold->dim);
-	fold->dim = isl_space_copy(dim);
-	if (!fold->dim)
-		goto error;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_lift(fold->qp[i],
-						isl_space_copy(dim));
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	isl_space_free(dim);
-
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	isl_space_free(dim);
-	return NULL;
-}
-
-int isl_qpolynomial_fold_foreach_qpolynomial(
-	__isl_keep isl_qpolynomial_fold *fold,
-	int (*fn)(__isl_take isl_qpolynomial *qp, void *user), void *user)
-{
-	int i;
-
-	if (!fold)
-		return -1;
-
-	for (i = 0; i < fold->n; ++i)
-		if (fn(isl_qpolynomial_copy(fold->qp[i]), user) < 0)
-			return -1;
-
-	return 0;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_move_dims(
-	__isl_take isl_qpolynomial_fold *fold,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n)
-{
-	int i;
-
-	if (n == 0)
-		return fold;
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold)
-		return NULL;
-
-	fold->dim = isl_space_move_dims(fold->dim, dst_type, dst_pos,
-						src_type, src_pos, n);
-	if (!fold->dim)
-		goto error;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_move_dims(fold->qp[i],
-				dst_type, dst_pos, src_type, src_pos, n);
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	return NULL;
-}
-
-/* For each 0 <= i < "n", replace variable "first" + i of type "type"
- * in fold->qp[k] by subs[i].
- */
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_substitute(
-	__isl_take isl_qpolynomial_fold *fold,
-	enum isl_dim_type type, unsigned first, unsigned n,
-	__isl_keep isl_qpolynomial **subs)
-{
-	int i;
-
-	if (n == 0)
-		return fold;
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold)
-		return NULL;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_substitute(fold->qp[i],
-				type, first, n, subs);
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	return NULL;
-}
-
-static int add_pwqp(__isl_take isl_pw_qpolynomial *pwqp, void *user)
-{
-	isl_ctx *ctx;
-	isl_pw_qpolynomial_fold *pwf;
-	isl_union_pw_qpolynomial_fold **upwf;
-	uint32_t hash;
-	struct isl_hash_table_entry *entry;
-
-	upwf = (isl_union_pw_qpolynomial_fold **)user;
-
-	ctx = pwqp->dim->ctx;
-	hash = isl_space_get_hash(pwqp->dim);
-	entry = isl_hash_table_find(ctx, &(*upwf)->table,
-				     hash, &has_dim, pwqp->dim, 1);
-	if (!entry)
-		goto error;
-
-	pwf = isl_pw_qpolynomial_fold_from_pw_qpolynomial((*upwf)->type, pwqp);
-	if (!entry->data)
-		entry->data = pwf;
-	else {
-		entry->data = isl_pw_qpolynomial_fold_add(entry->data, pwf);
-		if (!entry->data)
-			return -1;
-		if (isl_pw_qpolynomial_fold_is_zero(entry->data)) {
-			isl_pw_qpolynomial_fold_free(entry->data);
-			isl_hash_table_remove(ctx, &(*upwf)->table, entry);
-		}
-	}
-
-	return 0;
-error:
-	isl_pw_qpolynomial_free(pwqp);
-	return -1;
-}
-
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_add_union_pw_qpolynomial(
-	__isl_take isl_union_pw_qpolynomial_fold *upwf,
-	__isl_take isl_union_pw_qpolynomial *upwqp)
-{
-	upwf = isl_union_pw_qpolynomial_fold_align_params(upwf,
-				isl_union_pw_qpolynomial_get_space(upwqp));
-	upwqp = isl_union_pw_qpolynomial_align_params(upwqp,
-				isl_union_pw_qpolynomial_fold_get_space(upwf));
-
-	upwf = isl_union_pw_qpolynomial_fold_cow(upwf);
-	if (!upwf || !upwqp)
-		goto error;
-
-	if (isl_union_pw_qpolynomial_foreach_pw_qpolynomial(upwqp, &add_pwqp,
-							 &upwf) < 0)
-		goto error;
-
-	isl_union_pw_qpolynomial_free(upwqp);
-
-	return upwf;
-error:
-	isl_union_pw_qpolynomial_fold_free(upwf);
-	isl_union_pw_qpolynomial_free(upwqp);
-	return NULL;
-}
-
-static int join_compatible(__isl_keep isl_space *dim1, __isl_keep isl_space *dim2)
-{
-	int m;
-	m = isl_space_match(dim1, isl_dim_param, dim2, isl_dim_param);
-	if (m < 0 || !m)
-		return m;
-	return isl_space_tuple_match(dim1, isl_dim_out, dim2, isl_dim_in);
-}
-
-/* Compute the intersection of the range of the map and the domain
- * of the piecewise quasipolynomial reduction and then compute a bound
- * on the associated quasipolynomial reduction over all elements
- * in this intersection.
- *
- * We first introduce some unconstrained dimensions in the
- * piecewise quasipolynomial, intersect the resulting domain
- * with the wrapped map and the compute the sum.
- */
-__isl_give isl_pw_qpolynomial_fold *isl_map_apply_pw_qpolynomial_fold(
-	__isl_take isl_map *map, __isl_take isl_pw_qpolynomial_fold *pwf,
-	int *tight)
-{
-	isl_ctx *ctx;
-	isl_set *dom;
-	isl_space *map_dim;
-	isl_space *pwf_dim;
-	unsigned n_in;
-	int ok;
-
-	ctx = isl_map_get_ctx(map);
-	if (!ctx)
-		goto error;
-
-	map_dim = isl_map_get_space(map);
-	pwf_dim = isl_pw_qpolynomial_fold_get_space(pwf);
-	ok = join_compatible(map_dim, pwf_dim);
-	isl_space_free(map_dim);
-	isl_space_free(pwf_dim);
-	if (!ok)
-		isl_die(ctx, isl_error_invalid, "incompatible dimensions",
-			goto error);
-
-	n_in = isl_map_dim(map, isl_dim_in);
-	pwf = isl_pw_qpolynomial_fold_insert_dims(pwf, isl_dim_in, 0, n_in);
-
-	dom = isl_map_wrap(map);
-	pwf = isl_pw_qpolynomial_fold_reset_domain_space(pwf,
-						isl_set_get_space(dom));
-
-	pwf = isl_pw_qpolynomial_fold_intersect_domain(pwf, dom);
-	pwf = isl_pw_qpolynomial_fold_bound(pwf, tight);
-	
-	return pwf;
-error:
-	isl_map_free(map);
-	isl_pw_qpolynomial_fold_free(pwf);
-	return NULL;
-}
-
-__isl_give isl_pw_qpolynomial_fold *isl_set_apply_pw_qpolynomial_fold(
-	__isl_take isl_set *set, __isl_take isl_pw_qpolynomial_fold *pwf,
-	int *tight)
-{
-	return isl_map_apply_pw_qpolynomial_fold(set, pwf, tight);
-}
-
-struct isl_apply_fold_data {
-	isl_union_pw_qpolynomial_fold *upwf;
-	isl_union_pw_qpolynomial_fold *res;
-	isl_map *map;
-	int tight;
-};
-
-static int pw_qpolynomial_fold_apply(__isl_take isl_pw_qpolynomial_fold *pwf,
-	void *user)
-{
-	isl_space *map_dim;
-	isl_space *pwf_dim;
-	struct isl_apply_fold_data *data = user;
-	int ok;
-
-	map_dim = isl_map_get_space(data->map);
-	pwf_dim = isl_pw_qpolynomial_fold_get_space(pwf);
-	ok = join_compatible(map_dim, pwf_dim);
-	isl_space_free(map_dim);
-	isl_space_free(pwf_dim);
-
-	if (ok) {
-		pwf = isl_map_apply_pw_qpolynomial_fold(isl_map_copy(data->map),
-				    pwf, data->tight ? &data->tight : NULL);
-		data->res = isl_union_pw_qpolynomial_fold_fold_pw_qpolynomial_fold(
-							data->res, pwf);
-	} else
-		isl_pw_qpolynomial_fold_free(pwf);
-
-	return 0;
-}
-
-static int map_apply(__isl_take isl_map *map, void *user)
-{
-	struct isl_apply_fold_data *data = user;
-	int r;
-
-	data->map = map;
-	r = isl_union_pw_qpolynomial_fold_foreach_pw_qpolynomial_fold(
-				data->upwf, &pw_qpolynomial_fold_apply, data);
-
-	isl_map_free(map);
-	return r;
-}
-
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_map_apply_union_pw_qpolynomial_fold(
-	__isl_take isl_union_map *umap,
-	__isl_take isl_union_pw_qpolynomial_fold *upwf, int *tight)
-{
-	isl_space *dim;
-	enum isl_fold type;
-	struct isl_apply_fold_data data;
-
-	upwf = isl_union_pw_qpolynomial_fold_align_params(upwf,
-				isl_union_map_get_space(umap));
-	umap = isl_union_map_align_params(umap,
-				isl_union_pw_qpolynomial_fold_get_space(upwf));
-
-	data.upwf = upwf;
-	data.tight = tight ? 1 : 0;
-	dim = isl_union_pw_qpolynomial_fold_get_space(upwf);
-	type = isl_union_pw_qpolynomial_fold_get_type(upwf);
-	data.res = isl_union_pw_qpolynomial_fold_zero(dim, type);
-	if (isl_union_map_foreach_map(umap, &map_apply, &data) < 0)
-		goto error;
-
-	isl_union_map_free(umap);
-	isl_union_pw_qpolynomial_fold_free(upwf);
-
-	if (tight)
-		*tight = data.tight;
-
-	return data.res;
-error:
-	isl_union_map_free(umap);
-	isl_union_pw_qpolynomial_fold_free(upwf);
-	isl_union_pw_qpolynomial_fold_free(data.res);
-	return NULL;
-}
-
-__isl_give isl_union_pw_qpolynomial_fold *isl_union_set_apply_union_pw_qpolynomial_fold(
-	__isl_take isl_union_set *uset,
-	__isl_take isl_union_pw_qpolynomial_fold *upwf, int *tight)
-{
-	return isl_union_map_apply_union_pw_qpolynomial_fold(uset, upwf, tight);
-}
-
-/* Reorder the dimension of "fold" according to the given reordering.
- */
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_realign_domain(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_reordering *r)
-{
-	int i;
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold || !r)
-		goto error;
-
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_realign_domain(fold->qp[i],
-						    isl_reordering_copy(r));
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	fold = isl_qpolynomial_fold_reset_domain_space(fold,
-						    isl_space_copy(r->dim));
-
-	isl_reordering_free(r);
-
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	isl_reordering_free(r);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_mul_isl_int(
-	__isl_take isl_qpolynomial_fold *fold, isl_int v)
-{
-	int i;
-
-	if (isl_int_is_one(v))
-		return fold;
-	if (fold && isl_int_is_zero(v)) {
-		isl_qpolynomial_fold *zero;
-		isl_space *dim = isl_space_copy(fold->dim);
-		zero = isl_qpolynomial_fold_empty(fold->type, dim);
-		isl_qpolynomial_fold_free(fold);
-		return zero;
-	}
-
-	fold = isl_qpolynomial_fold_cow(fold);
-	if (!fold)
-		return NULL;
-
-	if (isl_int_is_neg(v))
-		fold->type = isl_fold_type_negate(fold->type);
-	for (i = 0; i < fold->n; ++i) {
-		fold->qp[i] = isl_qpolynomial_mul_isl_int(fold->qp[i], v);
-		if (!fold->qp[i])
-			goto error;
-	}
-
-	return fold;
-error:
-	isl_qpolynomial_fold_free(fold);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale(
-	__isl_take isl_qpolynomial_fold *fold, isl_int v)
-{
-	return isl_qpolynomial_fold_mul_isl_int(fold, v);
-}
diff --git a/cloog-0.17.0/isl/isl_gmp.c b/cloog-0.17.0/isl/isl_gmp.c
deleted file mode 100644
index 0c8db59..0000000
--- a/cloog-0.17.0/isl/isl_gmp.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl/int.h>
-
-uint32_t isl_gmp_hash(mpz_t v, uint32_t hash)
-{
-	int sa = v[0]._mp_size;
-	int abs_sa = sa < 0 ? -sa : sa;
-	unsigned char *data = (unsigned char *)v[0]._mp_d;
-	unsigned char *end = data + abs_sa * sizeof(v[0]._mp_d[0]);
-
-	if (sa < 0)
-		isl_hash_byte(hash, 0xFF);
-	for (; data < end; ++data)
-		isl_hash_byte(hash, *data);
-	return hash;
-}
diff --git a/cloog-0.17.0/isl/isl_hash.c b/cloog-0.17.0/isl/isl_hash.c
deleted file mode 100644
index 52e3135..0000000
--- a/cloog-0.17.0/isl/isl_hash.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <stdlib.h>
-#include <strings.h>
-#include <isl/hash.h>
-#include <isl/ctx.h>
-#include "isl_config.h"
-
-uint32_t isl_hash_string(uint32_t hash, const char *s)
-{
-	for (; *s; s++)
-		isl_hash_byte(hash, *s);
-	return hash;
-}
-
-uint32_t isl_hash_mem(uint32_t hash, const void *p, size_t len)
-{
-	int i;
-	const char *s = p;
-	for (i = 0; i < len; ++i)
-		isl_hash_byte(hash, s[i]);
-	return hash;
-}
-
-static unsigned int round_up(unsigned int v)
-{
-	int old_v = v;
-
-	while (v) {
-		old_v = v;
-		v ^= v & -v;
-	}
-	return old_v << 1;
-}
-
-int isl_hash_table_init(struct isl_ctx *ctx, struct isl_hash_table *table,
-			int min_size)
-{
-	size_t size;
-
-	if (!table)
-		return -1;
-
-	if (min_size < 2)
-		min_size = 2;
-	table->bits = ffs(round_up(4 * (min_size + 1) / 3 - 1)) - 1;
-	table->n = 0;
-
-	size = 1 << table->bits;
-	table->entries = isl_calloc_array(ctx, struct isl_hash_table_entry,
-					  size);
-	if (!table->entries)
-		return -1;
-
-	return 0;
-}
-
-static int grow_table(struct isl_ctx *ctx, struct isl_hash_table *table,
-			int (*eq)(const void *entry, const void *val))
-{
-	size_t old_size, size;
-	struct isl_hash_table_entry *entries;
-	uint32_t h;
-
-	entries = table->entries;
-	old_size = 1 << table->bits;
-	size = 2 * old_size;
-	table->entries = isl_calloc_array(ctx, struct isl_hash_table_entry,
-					  size);
-	if (!table->entries) {
-		table->entries = entries;
-		return -1;
-	}
-
-	table->bits++;
-
-	for (h = 0; h < old_size; ++h) {
-		struct isl_hash_table_entry *entry;
-
-		if (!entries[h].data)
-			continue;
-
-		entry = isl_hash_table_find(ctx, table, entries[h].hash,
-					    eq, entries[h].data, 1);
-		if (!entry) {
-			table->bits--;
-			free(table->entries);
-			table->entries = entries;
-			return -1;
-		}
-
-		*entry = entries[h];
-	}
-
-	free(entries);
-
-	return 0;
-}
-
-struct isl_hash_table *isl_hash_table_alloc(struct isl_ctx *ctx, int min_size)
-{
-	struct isl_hash_table *table = NULL;
-
-	table = isl_alloc_type(ctx, struct isl_hash_table);
-	if (isl_hash_table_init(ctx, table, min_size))
-		goto error;
-	return table;
-error:
-	isl_hash_table_free(ctx, table);
-	return NULL;
-}
-
-void isl_hash_table_clear(struct isl_hash_table *table)
-{
-	if (!table)
-		return;
-	free(table->entries);
-}
-
-void isl_hash_table_free(struct isl_ctx *ctx, struct isl_hash_table *table)
-{
-	if (!table)
-		return;
-	isl_hash_table_clear(table);
-	free(table);
-}
-
-struct isl_hash_table_entry *isl_hash_table_find(struct isl_ctx *ctx,
-				struct isl_hash_table *table,
-				uint32_t key_hash,
-				int (*eq)(const void *entry, const void *val),
-				const void *val, int reserve)
-{
-	size_t size;
-	uint32_t h, key_bits;
-
-	key_bits = isl_hash_bits(key_hash, table->bits);
-	size = 1 << table->bits;
-	for (h = key_bits; table->entries[h].data; h = (h+1) % size)
-		if (table->entries[h].hash == key_hash &&
-		    eq(table->entries[h].data, val))
-			return &table->entries[h];
-
-	if (!reserve)
-		return NULL;
-
-	if (4 * table->n >= 3 * size) {
-		if (grow_table(ctx, table, eq) < 0)
-			return NULL;
-		return isl_hash_table_find(ctx, table, key_hash, eq, val, 1);
-	}
-
-	table->n++;
-	table->entries[h].hash = key_hash;
-
-	return &table->entries[h];
-}
-
-int isl_hash_table_foreach(struct isl_ctx *ctx,
-				struct isl_hash_table *table,
-				int (*fn)(void **entry, void *user), void *user)
-{
-	size_t size;
-	uint32_t h;
-
-	size = 1 << table->bits;
-	for (h = 0; h < size; ++ h)
-		if (table->entries[h].data &&
-		    fn(&table->entries[h].data, user) < 0)
-			return -1;
-	
-	return 0;
-}
-
-void isl_hash_table_remove(struct isl_ctx *ctx,
-				struct isl_hash_table *table,
-				struct isl_hash_table_entry *entry)
-{
-	int h, h2;
-	size_t size;
-
-	if (!table || !entry)
-		return;
-
-	size = 1 << table->bits;
-	h = entry - table->entries;
-	isl_assert(ctx, h >= 0 && h < size, return);
-
-	for (h2 = h+1; table->entries[h2 % size].data; h2++) {
-		uint32_t bits = isl_hash_bits(table->entries[h2 % size].hash,
-						table->bits);
-		uint32_t offset = (size + bits - (h+1)) % size;
-		if (offset <= h2 - (h+1))
-			continue;
-		*entry = table->entries[h2 % size];
-		h = h2;
-		entry = &table->entries[h % size];
-	}
-
-	entry->hash = 0;
-	entry->data = NULL;
-	table->n--;
-}
diff --git a/cloog-0.17.0/isl/isl_hmap_map_basic_set.c b/cloog-0.17.0/isl/isl_hmap_map_basic_set.c
deleted file mode 100644
index b303516..0000000
--- a/cloog-0.17.0/isl/isl_hmap_map_basic_set.c
+++ /dev/null
@@ -1,102 +0,0 @@
-#include <isl_hmap_map_basic_set.h>
-
-struct isl_map_basic_set_pair {
-	isl_map		*key;
-	isl_basic_set	*val;
-};
-
-__isl_give isl_hmap_map_basic_set *isl_hmap_map_basic_set_alloc(isl_ctx *ctx,
-	int min_size)
-{
-	return (isl_hmap_map_basic_set *) isl_hash_table_alloc(ctx, min_size);
-}
-
-static int free_pair(void **entry, void *user)
-{
-	struct isl_map_basic_set_pair *pair = *entry;
-	isl_map_free(pair->key);
-	isl_basic_set_free(pair->val);
-	free(pair);
-	*entry = NULL;
-	return 0;
-}
-
-void isl_hmap_map_basic_set_free(isl_ctx *ctx,
-	__isl_take isl_hmap_map_basic_set *hmap)
-{
-	if (!hmap)
-		return;
-	isl_hash_table_foreach(ctx, &hmap->table, &free_pair, NULL);
-	isl_hash_table_free(ctx, &hmap->table);
-}
-
-static int has_key(const void *entry, const void *key)
-{
-	const struct isl_map_basic_set_pair *pair = entry;
-	isl_map *map = (isl_map *)key;
-
-	return isl_map_plain_is_equal(pair->key, map);
-}
-
-int isl_hmap_map_basic_set_has(isl_ctx *ctx,
-	__isl_keep isl_hmap_map_basic_set *hmap, __isl_keep isl_map *key)
-{
-	uint32_t hash;
-
-	hash = isl_map_get_hash(key);
-	return !!isl_hash_table_find(ctx, &hmap->table, hash, &has_key, key, 0);
-}
-
-__isl_give isl_basic_set *isl_hmap_map_basic_set_get(isl_ctx *ctx,
-	__isl_keep isl_hmap_map_basic_set *hmap, __isl_take isl_map *key)
-{
-	struct isl_hash_table_entry *entry;
-	struct isl_map_basic_set_pair *pair;
-	uint32_t hash;
-
-	hash = isl_map_get_hash(key);
-	entry = isl_hash_table_find(ctx, &hmap->table, hash, &has_key, key, 0);
-	isl_map_free(key);
-
-	if (!entry)
-		return NULL;
-
-	pair = entry->data;
-
-	return isl_basic_set_copy(pair->val);
-}
-
-int isl_hmap_map_basic_set_set(isl_ctx *ctx,
-	__isl_keep isl_hmap_map_basic_set *hmap, __isl_take isl_map *key,
-	__isl_take isl_basic_set *val)
-{
-	struct isl_hash_table_entry *entry;
-	struct isl_map_basic_set_pair *pair;
-	uint32_t hash;
-
-	hash = isl_map_get_hash(key);
-	entry = isl_hash_table_find(ctx, &hmap->table, hash, &has_key, key, 1);
-
-	if (!entry)
-		return -1;
-
-	if (entry->data) {
-		pair = entry->data;
-		isl_basic_set_free(pair->val);
-		pair->val = val;
-		isl_map_free(key);
-		return 0;
-	}
-
-	pair = isl_alloc_type(ctx, struct isl_map_basic_set_pair);
-	if (!pair) {
-		isl_map_free(key);
-		isl_basic_set_free(val);
-		return -1;
-	}
-
-	entry->data = pair;
-	pair->key = key;
-	pair->val = val;
-	return 0;
-}
diff --git a/cloog-0.17.0/isl/isl_hmap_map_basic_set.h b/cloog-0.17.0/isl/isl_hmap_map_basic_set.h
deleted file mode 100644
index 905791d..0000000
--- a/cloog-0.17.0/isl/isl_hmap_map_basic_set.h
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifndef ISL_HMAP_MAP_BASIC_SET_H
-#define ISL_HMAP_MAP_BASIC_SET_H
-
-#include <isl/hash.h>
-#include <isl/map.h>
-#include <isl/set.h>
-
-struct isl_hmap_map_basic_set {
-	struct isl_hash_table table;
-};
-typedef struct isl_hmap_map_basic_set	isl_hmap_map_basic_set;
-
-__isl_give isl_hmap_map_basic_set *isl_hmap_map_basic_set_alloc( isl_ctx *ctx,
-	int min_size);
-void isl_hmap_map_basic_set_free(isl_ctx *ctx,
-	__isl_take isl_hmap_map_basic_set *hmap);
-
-int isl_hmap_map_basic_set_has(isl_ctx *ctx,
-	__isl_keep isl_hmap_map_basic_set *hmap, __isl_keep isl_map *key);
-__isl_give isl_basic_set *isl_hmap_map_basic_set_get(isl_ctx *ctx,
-	__isl_keep isl_hmap_map_basic_set *hmap, __isl_take isl_map *key);
-int isl_hmap_map_basic_set_set(isl_ctx *ctx,
-	__isl_keep isl_hmap_map_basic_set *hmap, __isl_take isl_map *key,
-	__isl_take isl_basic_set *val);
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_id.c b/cloog-0.17.0/isl/isl_id.c
deleted file mode 100644
index a3a2ea9..0000000
--- a/cloog-0.17.0/isl/isl_id.c
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <string.h>
-#include <isl_ctx_private.h>
-#include <isl_id_private.h>
-
-/* A special, static isl_id to use as domains (and ranges)
- * of sets and parameters domains.
- * The user should never get a hold on this isl_id.
- */
-isl_id isl_id_none = {
-	.ref = -1,
-	.ctx = NULL,
-	.name = "#none",
-	.user = NULL
-};
-
-isl_ctx *isl_id_get_ctx(__isl_keep isl_id *id)
-{
-	return id ? id->ctx : NULL;
-}
-
-void *isl_id_get_user(__isl_keep isl_id *id)
-{
-	return id ? id->user : NULL;
-}
-
-const char *isl_id_get_name(__isl_keep isl_id *id)
-{
-	return id ? id->name : NULL;
-}
-
-static __isl_give isl_id *id_alloc(isl_ctx *ctx, const char *name, void *user)
-{
-	const char *copy = name ? strdup(name) : NULL;
-	isl_id *id;
-
-	if (name && !copy)
-		return NULL;
-	id = isl_alloc_type(ctx, struct isl_id);
-	if (!id)
-		goto error;
-
-	id->ctx = ctx;
-	isl_ctx_ref(id->ctx);
-	id->ref = 1;
-	id->name = copy;
-	id->user = user;
-
-	id->hash = isl_hash_init();
-	if (name)
-		id->hash = isl_hash_string(id->hash, name);
-	else
-		id->hash = isl_hash_builtin(id->hash, user);
-
-	return id;
-error:
-	free((char *)copy);
-	return NULL;
-}
-
-struct isl_name_and_user {
-	const char *name;
-	void *user;
-};
-
-static int isl_id_has_name_and_user(const void *entry, const void *val)
-{
-	isl_id *id = (isl_id *)entry;
-	struct isl_name_and_user *nu = (struct isl_name_and_user *) val;
-
-	if (id->user != nu->user)
-		return 0;
-	if (!id->name && !nu->name)
-		return 1;
-
-	return !strcmp(id->name, nu->name);
-}
-
-__isl_give isl_id *isl_id_alloc(isl_ctx *ctx, const char *name, void *user)
-{
-	struct isl_hash_table_entry *entry;
-	uint32_t id_hash;
-	struct isl_name_and_user nu = { name, user };
-
-	id_hash = isl_hash_init();
-	if (name)
-		id_hash = isl_hash_string(id_hash, name);
-	else
-		id_hash = isl_hash_builtin(id_hash, user);
-	entry = isl_hash_table_find(ctx, &ctx->id_table, id_hash,
-					isl_id_has_name_and_user, &nu, 1);
-	if (!entry)
-		return NULL;
-	if (entry->data)
-		return isl_id_copy(entry->data);
-	entry->data = id_alloc(ctx, name, user);
-	if (!entry->data)
-		ctx->id_table.n--;
-	return entry->data;
-}
-
-/* If the id has a negative refcount, then it is a static isl_id
- * which should not be changed.
- */
-__isl_give isl_id *isl_id_copy(isl_id *id)
-{
-	if (!id)
-		return NULL;
-
-	if (id->ref < 0)
-		return id;
-
-	id->ref++;
-	return id;
-}
-
-static int isl_id_eq(const void *entry, const void *name)
-{
-	return entry == name;
-}
-
-uint32_t isl_hash_id(uint32_t hash, __isl_keep isl_id *id)
-{
-	if (id)
-		isl_hash_hash(hash, id->hash);
-
-	return hash;
-}
-
-/* If the id has a negative refcount, then it is a static isl_id
- * and should not be freed.
- */
-void *isl_id_free(__isl_take isl_id *id)
-{
-	struct isl_hash_table_entry *entry;
-
-	if (!id)
-		return NULL;
-
-	if (id->ref < 0)
-		return NULL;
-
-	if (--id->ref > 0)
-		return NULL;
-
-	entry = isl_hash_table_find(id->ctx, &id->ctx->id_table, id->hash,
-					isl_id_eq, id, 0);
-	if (!entry)
-		isl_die(id->ctx, isl_error_unknown,
-			"unable to find id", (void)0);
-	else
-		isl_hash_table_remove(id->ctx, &id->ctx->id_table, entry);
-
-	free((char *)id->name);
-	isl_ctx_deref(id->ctx);
-	free(id);
-
-	return NULL;
-}
-
-__isl_give isl_printer *isl_printer_print_id(__isl_take isl_printer *p,
-	__isl_keep isl_id *id)
-{
-	if (!id)
-		goto error;
-
-	if (id->name)
-		p = isl_printer_print_str(p, id->name);
-	if (id->user) {
-		char buffer[50];
-		snprintf(buffer, sizeof(buffer), "@%p", id->user);
-		p = isl_printer_print_str(p, buffer);
-	}
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
diff --git a/cloog-0.17.0/isl/isl_id_private.h b/cloog-0.17.0/isl/isl_id_private.h
deleted file mode 100644
index a472d77..0000000
--- a/cloog-0.17.0/isl/isl_id_private.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_ID_PRIVATE_H
-#define ISL_ID_PRIVATE_H
-
-#include <isl/id.h>
-
-struct isl_id {
-	int ref;
-	isl_ctx *ctx;
-
-	const char *name;
-	void *user;
-	uint32_t hash;
-};
-
-uint32_t isl_hash_id(uint32_t hash, __isl_keep isl_id *id);
-
-extern isl_id isl_id_none;
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_ilp.c b/cloog-0.17.0/isl/isl_ilp.c
deleted file mode 100644
index abfac26..0000000
--- a/cloog-0.17.0/isl/isl_ilp.c
+++ /dev/null
@@ -1,485 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl/ilp.h>
-#include "isl_sample.h"
-#include <isl/seq.h>
-#include "isl_equalities.h"
-#include <isl_aff_private.h>
-#include <isl_local_space_private.h>
-#include <isl_mat_private.h>
-
-/* Given a basic set "bset", construct a basic set U such that for
- * each element x in U, the whole unit box positioned at x is inside
- * the given basic set.
- * Note that U may not contain all points that satisfy this property.
- *
- * We simply add the sum of all negative coefficients to the constant
- * term.  This ensures that if x satisfies the resulting constraints,
- * then x plus any sum of unit vectors satisfies the original constraints.
- */
-static struct isl_basic_set *unit_box_base_points(struct isl_basic_set *bset)
-{
-	int i, j, k;
-	struct isl_basic_set *unit_box = NULL;
-	unsigned total;
-
-	if (!bset)
-		goto error;
-
-	if (bset->n_eq != 0) {
-		unit_box = isl_basic_set_empty_like(bset);
-		isl_basic_set_free(bset);
-		return unit_box;
-	}
-
-	total = isl_basic_set_total_dim(bset);
-	unit_box = isl_basic_set_alloc_space(isl_basic_set_get_space(bset),
-					0, 0, bset->n_ineq);
-
-	for (i = 0; i < bset->n_ineq; ++i) {
-		k = isl_basic_set_alloc_inequality(unit_box);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(unit_box->ineq[k], bset->ineq[i], 1 + total);
-		for (j = 0; j < total; ++j) {
-			if (isl_int_is_nonneg(unit_box->ineq[k][1 + j]))
-				continue;
-			isl_int_add(unit_box->ineq[k][0],
-				unit_box->ineq[k][0], unit_box->ineq[k][1 + j]);
-		}
-	}
-
-	isl_basic_set_free(bset);
-	return unit_box;
-error:
-	isl_basic_set_free(bset);
-	isl_basic_set_free(unit_box);
-	return NULL;
-}
-
-/* Find an integer point in "bset", preferably one that is
- * close to minimizing "f".
- *
- * We first check if we can easily put unit boxes inside bset.
- * If so, we take the best base point of any of the unit boxes we can find
- * and round it up to the nearest integer.
- * If not, we simply pick any integer point in "bset".
- */
-static struct isl_vec *initial_solution(struct isl_basic_set *bset, isl_int *f)
-{
-	enum isl_lp_result res;
-	struct isl_basic_set *unit_box;
-	struct isl_vec *sol;
-
-	unit_box = unit_box_base_points(isl_basic_set_copy(bset));
-
-	res = isl_basic_set_solve_lp(unit_box, 0, f, bset->ctx->one,
-					NULL, NULL, &sol);
-	if (res == isl_lp_ok) {
-		isl_basic_set_free(unit_box);
-		return isl_vec_ceil(sol);
-	}
-
-	isl_basic_set_free(unit_box);
-
-	return isl_basic_set_sample_vec(isl_basic_set_copy(bset));
-}
-
-/* Restrict "bset" to those points with values for f in the interval [l, u].
- */
-static struct isl_basic_set *add_bounds(struct isl_basic_set *bset,
-	isl_int *f, isl_int l, isl_int u)
-{
-	int k;
-	unsigned total;
-
-	total = isl_basic_set_total_dim(bset);
-	bset = isl_basic_set_extend_constraints(bset, 0, 2);
-
-	k = isl_basic_set_alloc_inequality(bset);
-	if (k < 0)
-		goto error;
-	isl_seq_cpy(bset->ineq[k], f, 1 + total);
-	isl_int_sub(bset->ineq[k][0], bset->ineq[k][0], l);
-
-	k = isl_basic_set_alloc_inequality(bset);
-	if (k < 0)
-		goto error;
-	isl_seq_neg(bset->ineq[k], f, 1 + total);
-	isl_int_add(bset->ineq[k][0], bset->ineq[k][0], u);
-
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Find an integer point in "bset" that minimizes f (in any) such that
- * the value of f lies inside the interval [l, u].
- * Return this integer point if it can be found.
- * Otherwise, return sol.
- *
- * We perform a number of steps until l > u.
- * In each step, we look for an integer point with value in either
- * the whole interval [l, u] or half of the interval [l, l+floor(u-l-1/2)].
- * The choice depends on whether we have found an integer point in the
- * previous step.  If so, we look for the next point in half of the remaining
- * interval.
- * If we find a point, the current solution is updated and u is set
- * to its value minus 1.
- * If no point can be found, we update l to the upper bound of the interval
- * we checked (u or l+floor(u-l-1/2)) plus 1.
- */
-static struct isl_vec *solve_ilp_search(struct isl_basic_set *bset,
-	isl_int *f, isl_int *opt, struct isl_vec *sol, isl_int l, isl_int u)
-{
-	isl_int tmp;
-	int divide = 1;
-
-	isl_int_init(tmp);
-
-	while (isl_int_le(l, u)) {
-		struct isl_basic_set *slice;
-		struct isl_vec *sample;
-
-		if (!divide)
-			isl_int_set(tmp, u);
-		else {
-			isl_int_sub(tmp, u, l);
-			isl_int_fdiv_q_ui(tmp, tmp, 2);
-			isl_int_add(tmp, tmp, l);
-		}
-		slice = add_bounds(isl_basic_set_copy(bset), f, l, tmp);
-		sample = isl_basic_set_sample_vec(slice);
-		if (!sample) {
-			isl_vec_free(sol);
-			sol = NULL;
-			break;
-		}
-		if (sample->size > 0) {
-			isl_vec_free(sol);
-			sol = sample;
-			isl_seq_inner_product(f, sol->el, sol->size, opt);
-			isl_int_sub_ui(u, *opt, 1);
-			divide = 1;
-		} else {
-			isl_vec_free(sample);
-			if (!divide)
-				break;
-			isl_int_add_ui(l, tmp, 1);
-			divide = 0;
-		}
-	}
-
-	isl_int_clear(tmp);
-
-	return sol;
-}
-
-/* Find an integer point in "bset" that minimizes f (if any).
- * If sol_p is not NULL then the integer point is returned in *sol_p.
- * The optimal value of f is returned in *opt.
- *
- * The algorithm maintains a currently best solution and an interval [l, u]
- * of values of f for which integer solutions could potentially still be found.
- * The initial value of the best solution so far is any solution.
- * The initial value of l is minimal value of f over the rationals
- * (rounded up to the nearest integer).
- * The initial value of u is the value of f at the initial solution minus 1.
- *
- * We then call solve_ilp_search to perform a binary search on the interval.
- */
-static enum isl_lp_result solve_ilp(struct isl_basic_set *bset,
-				      isl_int *f, isl_int *opt,
-				      struct isl_vec **sol_p)
-{
-	enum isl_lp_result res;
-	isl_int l, u;
-	struct isl_vec *sol;
-
-	res = isl_basic_set_solve_lp(bset, 0, f, bset->ctx->one,
-					opt, NULL, &sol);
-	if (res == isl_lp_ok && isl_int_is_one(sol->el[0])) {
-		if (sol_p)
-			*sol_p = sol;
-		else
-			isl_vec_free(sol);
-		return isl_lp_ok;
-	}
-	isl_vec_free(sol);
-	if (res == isl_lp_error || res == isl_lp_empty)
-		return res;
-
-	sol = initial_solution(bset, f);
-	if (!sol)
-		return isl_lp_error;
-	if (sol->size == 0) {
-		isl_vec_free(sol);
-		return isl_lp_empty;
-	}
-	if (res == isl_lp_unbounded) {
-		isl_vec_free(sol);
-		return isl_lp_unbounded;
-	}
-
-	isl_int_init(l);
-	isl_int_init(u);
-
-	isl_int_set(l, *opt);
-
-	isl_seq_inner_product(f, sol->el, sol->size, opt);
-	isl_int_sub_ui(u, *opt, 1);
-
-	sol = solve_ilp_search(bset, f, opt, sol, l, u);
-	if (!sol)
-		res = isl_lp_error;
-
-	isl_int_clear(l);
-	isl_int_clear(u);
-
-	if (sol_p)
-		*sol_p = sol;
-	else
-		isl_vec_free(sol);
-
-	return res;
-}
-
-static enum isl_lp_result solve_ilp_with_eq(struct isl_basic_set *bset, int max,
-				      isl_int *f, isl_int *opt,
-				      struct isl_vec **sol_p)
-{
-	unsigned dim;
-	enum isl_lp_result res;
-	struct isl_mat *T = NULL;
-	struct isl_vec *v;
-
-	bset = isl_basic_set_copy(bset);
-	dim = isl_basic_set_total_dim(bset);
-	v = isl_vec_alloc(bset->ctx, 1 + dim);
-	if (!v)
-		goto error;
-	isl_seq_cpy(v->el, f, 1 + dim);
-	bset = isl_basic_set_remove_equalities(bset, &T, NULL);
-	v = isl_vec_mat_product(v, isl_mat_copy(T));
-	if (!v)
-		goto error;
-	res = isl_basic_set_solve_ilp(bset, max, v->el, opt, sol_p);
-	isl_vec_free(v);
-	if (res == isl_lp_ok && sol_p) {
-		*sol_p = isl_mat_vec_product(T, *sol_p);
-		if (!*sol_p)
-			res = isl_lp_error;
-	} else
-		isl_mat_free(T);
-	isl_basic_set_free(bset);
-	return res;
-error:
-	isl_mat_free(T);
-	isl_basic_set_free(bset);
-	return isl_lp_error;
-}
-
-/* Find an integer point in "bset" that minimizes (or maximizes if max is set)
- * f (if any).
- * If sol_p is not NULL then the integer point is returned in *sol_p.
- * The optimal value of f is returned in *opt.
- *
- * If there is any equality among the points in "bset", then we first
- * project it out.  Otherwise, we continue with solve_ilp above.
- */
-enum isl_lp_result isl_basic_set_solve_ilp(struct isl_basic_set *bset, int max,
-				      isl_int *f, isl_int *opt,
-				      struct isl_vec **sol_p)
-{
-	unsigned dim;
-	enum isl_lp_result res;
-
-	if (!bset)
-		return isl_lp_error;
-	if (sol_p)
-		*sol_p = NULL;
-
-	isl_assert(bset->ctx, isl_basic_set_n_param(bset) == 0, goto error);
-
-	if (isl_basic_set_plain_is_empty(bset))
-		return isl_lp_empty;
-
-	if (bset->n_eq)
-		return solve_ilp_with_eq(bset, max, f, opt, sol_p);
-
-	dim = isl_basic_set_total_dim(bset);
-
-	if (max)
-		isl_seq_neg(f, f, 1 + dim);
-
-	res = solve_ilp(bset, f, opt, sol_p);
-
-	if (max) {
-		isl_seq_neg(f, f, 1 + dim);
-		isl_int_neg(*opt, *opt);
-	}
-
-	return res;
-error:
-	isl_basic_set_free(bset);
-	return isl_lp_error;
-}
-
-static enum isl_lp_result basic_set_opt(__isl_keep isl_basic_set *bset, int max,
-	__isl_keep isl_aff *obj, isl_int *opt)
-{
-	enum isl_lp_result res;
-
-	if (!obj)
-		return isl_lp_error;
-	bset = isl_basic_set_copy(bset);
-	bset = isl_basic_set_underlying_set(bset);
-	res = isl_basic_set_solve_ilp(bset, max, obj->v->el + 1, opt, NULL);
-	isl_basic_set_free(bset);
-	return res;
-}
-
-static __isl_give isl_mat *extract_divs(__isl_keep isl_basic_set *bset)
-{
-	int i;
-	isl_ctx *ctx = isl_basic_set_get_ctx(bset);
-	isl_mat *div;
-
-	div = isl_mat_alloc(ctx, bset->n_div,
-			    1 + 1 + isl_basic_set_total_dim(bset));
-	if (!div)
-		return NULL;
-
-	for (i = 0; i < bset->n_div; ++i)
-		isl_seq_cpy(div->row[i], bset->div[i], div->n_col);
-
-	return div;
-}
-
-enum isl_lp_result isl_basic_set_opt(__isl_keep isl_basic_set *bset, int max,
-	__isl_keep isl_aff *obj, isl_int *opt)
-{
-	int *exp1 = NULL;
-	int *exp2 = NULL;
-	isl_ctx *ctx;
-	isl_mat *bset_div = NULL;
-	isl_mat *div = NULL;
-	enum isl_lp_result res;
-
-	if (!bset || !obj)
-		return isl_lp_error;
-
-	ctx = isl_aff_get_ctx(obj);
-	if (!isl_space_is_equal(bset->dim, obj->ls->dim))
-		isl_die(ctx, isl_error_invalid,
-			"spaces don't match", return isl_lp_error);
-	if (!isl_int_is_one(obj->v->el[0]))
-		isl_die(ctx, isl_error_unsupported,
-			"expecting integer affine expression",
-			return isl_lp_error);
-
-	if (bset->n_div == 0 && obj->ls->div->n_row == 0)
-		return basic_set_opt(bset, max, obj, opt);
-
-	bset = isl_basic_set_copy(bset);
-	obj = isl_aff_copy(obj);
-
-	bset_div = extract_divs(bset);
-	exp1 = isl_alloc_array(ctx, int, bset_div->n_row);
-	exp2 = isl_alloc_array(ctx, int, obj->ls->div->n_row);
-	if (!bset_div || !exp1 || !exp2)
-		goto error;
-
-	div = isl_merge_divs(bset_div, obj->ls->div, exp1, exp2);
-
-	bset = isl_basic_set_expand_divs(bset, isl_mat_copy(div), exp1);
-	obj = isl_aff_expand_divs(obj, isl_mat_copy(div), exp2);
-
-	res = basic_set_opt(bset, max, obj, opt);
-
-	isl_mat_free(bset_div);
-	isl_mat_free(div);
-	free(exp1);
-	free(exp2);
-	isl_basic_set_free(bset);
-	isl_aff_free(obj);
-
-	return res;
-error:
-	isl_mat_free(div);
-	isl_mat_free(bset_div);
-	free(exp1);
-	free(exp2);
-	isl_basic_set_free(bset);
-	isl_aff_free(obj);
-	return isl_lp_error;
-}
-
-/* Compute the minimum (maximum if max is set) of the integer affine
- * expression obj over the points in set and put the result in *opt.
- */
-enum isl_lp_result isl_set_opt(__isl_keep isl_set *set, int max,
-	__isl_keep isl_aff *obj, isl_int *opt)
-{
-	int i;
-	enum isl_lp_result res;
-	int empty = 1;
-	isl_int opt_i;
-
-	if (!set || !obj)
-		return isl_lp_error;
-	if (set->n == 0)
-		return isl_lp_empty;
-
-	res = isl_basic_set_opt(set->p[0], max, obj, opt);
-	if (res == isl_lp_error || res == isl_lp_unbounded)
-		return res;
-	if (set->n == 1)
-		return res;
-	if (res == isl_lp_ok)
-		empty = 0;
-
-	isl_int_init(opt_i);
-	for (i = 1; i < set->n; ++i) {
-		res = isl_basic_set_opt(set->p[i], max, obj, &opt_i);
-		if (res == isl_lp_error || res == isl_lp_unbounded) {
-			isl_int_clear(opt_i);
-			return res;
-		}
-		if (res == isl_lp_ok)
-			empty = 0;
-		if (isl_int_gt(opt_i, *opt))
-			isl_int_set(*opt, opt_i);
-	}
-	isl_int_clear(opt_i);
-
-	return empty ? isl_lp_empty : isl_lp_ok;
-}
-
-enum isl_lp_result isl_basic_set_max(__isl_keep isl_basic_set *bset,
-	__isl_keep isl_aff *obj, isl_int *opt)
-{
-	return isl_basic_set_opt(bset, 1, obj, opt);
-}
-
-enum isl_lp_result isl_set_max(__isl_keep isl_set *set,
-	__isl_keep isl_aff *obj, isl_int *opt)
-{
-	return isl_set_opt(set, 1, obj, opt);
-}
-
-enum isl_lp_result isl_set_min(__isl_keep isl_set *set,
-	__isl_keep isl_aff *obj, isl_int *opt)
-{
-	return isl_set_opt(set, 0, obj, opt);
-}
diff --git a/cloog-0.17.0/isl/isl_input.c b/cloog-0.17.0/isl/isl_input.c
deleted file mode 100644
index 320703a..0000000
--- a/cloog-0.17.0/isl/isl_input.c
+++ /dev/null
@@ -1,2685 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France 
- */
-
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl/set.h>
-#include <isl/seq.h>
-#include <isl_stream_private.h>
-#include <isl/obj.h>
-#include "isl_polynomial_private.h"
-#include <isl/union_map.h>
-#include <isl_mat_private.h>
-#include <isl_aff_private.h>
-#include <isl/list.h>
-
-struct variable {
-	char    	    	*name;
-	int	     		 pos;
-	struct variable		*next;
-};
-
-struct vars {
-	struct isl_ctx	*ctx;
-	int		 n;
-	struct variable	*v;
-};
-
-static struct vars *vars_new(struct isl_ctx *ctx)
-{
-	struct vars *v;
-	v = isl_alloc_type(ctx, struct vars);
-	if (!v)
-		return NULL;
-	v->ctx = ctx;
-	v->n = 0;
-	v->v = NULL;
-	return v;
-}
-
-static void variable_free(struct variable *var)
-{
-	while (var) {
-		struct variable *next = var->next;
-		free(var->name);
-		free(var);
-		var = next;
-	}
-}
-
-static void vars_free(struct vars *v)
-{
-	if (!v)
-		return;
-	variable_free(v->v);
-	free(v);
-}
-
-static void vars_drop(struct vars *v, int n)
-{
-	struct variable *var;
-
-	if (!v || !v->v)
-		return;
-
-	v->n -= n;
-
-	var = v->v;
-	while (--n >= 0) {
-		struct variable *next = var->next;
-		free(var->name);
-		free(var);
-		var = next;
-	}
-	v->v = var;
-}
-
-static struct variable *variable_new(struct vars *v, const char *name, int len,
-				int pos)
-{
-	struct variable *var;
-	var = isl_calloc_type(v->ctx, struct variable);
-	if (!var)
-		goto error;
-	var->name = strdup(name);
-	var->name[len] = '\0';
-	var->pos = pos;
-	var->next = v->v;
-	return var;
-error:
-	variable_free(v->v);
-	return NULL;
-}
-
-static int vars_pos(struct vars *v, const char *s, int len)
-{
-	int pos;
-	struct variable *q;
-
-	if (len == -1)
-		len = strlen(s);
-	for (q = v->v; q; q = q->next) {
-		if (strncmp(q->name, s, len) == 0 && q->name[len] == '\0')
-			break;
-	}
-	if (q)
-		pos = q->pos;
-	else {
-		pos = v->n;
-		v->v = variable_new(v, s, len, v->n);
-		if (!v->v)
-			return -1;
-		v->n++;
-	}
-	return pos;
-}
-
-static int vars_add_anon(struct vars *v)
-{
-	v->v = variable_new(v, "", 0, v->n);
-
-	if (!v->v)
-		return -1;
-	v->n++;
-
-	return 0;
-}
-
-static __isl_give isl_map *set_name(__isl_take isl_map *map,
-	enum isl_dim_type type, unsigned pos, char *name)
-{
-	char *prime;
-
-	if (!map)
-		return NULL;
-	if (!name)
-		return map;
-
-	prime = strchr(name, '\'');
-	if (prime)
-		*prime = '\0';
-	map = isl_map_set_dim_name(map, type, pos, name);
-	if (prime)
-		*prime = '\'';
-
-	return map;
-}
-
-/* Obtain next token, with some preprocessing.
- * In particular, evaluate expressions of the form x^y,
- * with x and y values.
- */
-static struct isl_token *next_token(struct isl_stream *s)
-{
-	struct isl_token *tok, *tok2;
-
-	tok = isl_stream_next_token(s);
-	if (!tok || tok->type != ISL_TOKEN_VALUE)
-		return tok;
-	if (!isl_stream_eat_if_available(s, '^'))
-		return tok;
-	tok2 = isl_stream_next_token(s);
-	if (!tok2 || tok2->type != ISL_TOKEN_VALUE) {
-		isl_stream_error(s, tok2, "expecting constant value");
-		goto error;
-	}
-
-	isl_int_pow_ui(tok->u.v, tok->u.v, isl_int_get_ui(tok2->u.v));
-
-	isl_token_free(tok2);
-	return tok;
-error:
-	isl_token_free(tok);
-	isl_token_free(tok2);
-	return NULL;
-}
-
-static int accept_cst_factor(struct isl_stream *s, isl_int *f)
-{
-	struct isl_token *tok;
-
-	tok = next_token(s);
-	if (!tok || tok->type != ISL_TOKEN_VALUE) {
-		isl_stream_error(s, tok, "expecting constant value");
-		goto error;
-	}
-
-	isl_int_mul(*f, *f, tok->u.v);
-
-	isl_token_free(tok);
-
-	if (isl_stream_eat_if_available(s, '*'))
-		return accept_cst_factor(s, f);
-
-	return 0;
-error:
-	isl_token_free(tok);
-	return -1;
-}
-
-/* Given an affine expression aff, return an affine expression
- * for aff % d, with d the next token on the stream, which is
- * assumed to be a constant.
- *
- * We introduce an integer division q = [aff/d] and the result
- * is set to aff - d q.
- */
-static __isl_give isl_pw_aff *affine_mod(struct isl_stream *s,
-	struct vars *v, __isl_take isl_pw_aff *aff)
-{
-	struct isl_token *tok;
-	isl_pw_aff *q;
-
-	tok = next_token(s);
-	if (!tok || tok->type != ISL_TOKEN_VALUE) {
-		isl_stream_error(s, tok, "expecting constant value");
-		goto error;
-	}
-
-	q = isl_pw_aff_copy(aff);
-	q = isl_pw_aff_scale_down(q, tok->u.v);
-	q = isl_pw_aff_floor(q);
-	q = isl_pw_aff_scale(q, tok->u.v);
-
-	aff = isl_pw_aff_sub(aff, q);
-
-	isl_token_free(tok);
-	return aff;
-error:
-	isl_pw_aff_free(aff);
-	isl_token_free(tok);
-	return NULL;
-}
-
-static __isl_give isl_pw_aff *accept_affine(struct isl_stream *s,
-	__isl_take isl_space *dim, struct vars *v);
-static __isl_give isl_pw_aff_list *accept_affine_list(struct isl_stream *s,
-	__isl_take isl_space *dim, struct vars *v);
-
-static __isl_give isl_pw_aff *accept_minmax(struct isl_stream *s,
-	__isl_take isl_space *dim, struct vars *v)
-{
-	struct isl_token *tok;
-	isl_pw_aff_list *list = NULL;
-	int min;
-
-	tok = isl_stream_next_token(s);
-	if (!tok)
-		goto error;
-	min = tok->type == ISL_TOKEN_MIN;
-	isl_token_free(tok);
-
-	if (isl_stream_eat(s, '('))
-		goto error;
-
-	list = accept_affine_list(s, isl_space_copy(dim), v);
-	if (!list)
-		goto error;
-
-	if (isl_stream_eat(s, ')'))
-		goto error;
-
-	isl_space_free(dim);
-	return min ? isl_pw_aff_list_min(list) : isl_pw_aff_list_max(list);
-error:
-	isl_space_free(dim);
-	isl_pw_aff_list_free(list);
-	return NULL;
-}
-
-static __isl_give isl_pw_aff *accept_div(struct isl_stream *s,
-	__isl_take isl_space *dim, struct vars *v)
-{
-	struct isl_token *tok;
-	int seen_paren = 0;
-	int f = 0;
-	int c = 0;
-	isl_pw_aff *pwaff = NULL;
-
-	if (isl_stream_eat_if_available(s, ISL_TOKEN_FLOORD))
-		f = 1;
-	else if (isl_stream_eat_if_available(s, ISL_TOKEN_CEILD))
-		c = 1;
-	if (f || c) {
-		if (isl_stream_eat(s, '('))
-			goto error;
-	} else {
-		if (isl_stream_eat(s, '['))
-			goto error;
-		if (isl_stream_eat_if_available(s, '('))
-			seen_paren = 1;
-	}
-
-	pwaff = accept_affine(s, isl_space_copy(dim), v);
-
-	if (f || c) {
-		if (isl_stream_eat(s, ','))
-			goto error;
-	} else {
-		if (seen_paren && isl_stream_eat(s, ')'))
-			goto error;
-		if (isl_stream_eat(s, '/'))
-			goto error;
-	}
-
-	tok = next_token(s);
-	if (!tok)
-		goto error;
-	if (tok->type != ISL_TOKEN_VALUE) {
-		isl_stream_error(s, tok, "expected denominator");
-		isl_stream_push_token(s, tok);
-		goto error;
-	}
-	isl_pw_aff_scale_down(pwaff,  tok->u.v);
-	isl_token_free(tok);
-
-	if (c)
-		pwaff = isl_pw_aff_ceil(pwaff);
-	else
-		pwaff = isl_pw_aff_floor(pwaff);
-
-	if (f || c) {
-		if (isl_stream_eat(s, ')'))
-			goto error;
-	} else {
-		if (isl_stream_eat(s, ']'))
-			goto error;
-	}
-
-	isl_space_free(dim);
-	return pwaff;
-error:
-	isl_space_free(dim);
-	isl_pw_aff_free(pwaff);
-	return NULL;
-}
-
-static __isl_give isl_pw_aff *accept_affine_factor(struct isl_stream *s,
-	__isl_take isl_space *dim, struct vars *v)
-{
-	struct isl_token *tok = NULL;
-	isl_pw_aff *res = NULL;
-
-	tok = next_token(s);
-	if (!tok) {
-		isl_stream_error(s, NULL, "unexpected EOF");
-		goto error;
-	}
-
-	if (tok->type == ISL_TOKEN_AFF) {
-		res = isl_pw_aff_copy(tok->u.pwaff);
-		isl_token_free(tok);
-	} else if (tok->type == ISL_TOKEN_IDENT) {
-		int n = v->n;
-		int pos = vars_pos(v, tok->u.s, -1);
-		isl_aff *aff;
-
-		if (pos < 0)
-			goto error;
-		if (pos >= n) {
-			isl_stream_error(s, tok, "unknown identifier");
-			goto error;
-		}
-
-		aff = isl_aff_zero_on_domain(isl_local_space_from_space(isl_space_copy(dim)));
-		if (!aff)
-			goto error;
-		isl_int_set_si(aff->v->el[2 + pos], 1);
-		res = isl_pw_aff_from_aff(aff);
-		isl_token_free(tok);
-	} else if (tok->type == ISL_TOKEN_VALUE) {
-		if (isl_stream_eat_if_available(s, '*')) {
-			res = accept_affine_factor(s, isl_space_copy(dim), v);
-			res = isl_pw_aff_scale(res, tok->u.v);
-		} else {
-			isl_local_space *ls;
-			isl_aff *aff;
-			ls = isl_local_space_from_space(isl_space_copy(dim));
-			aff = isl_aff_zero_on_domain(ls);
-			aff = isl_aff_add_constant(aff, tok->u.v);
-			res = isl_pw_aff_from_aff(aff);
-		}
-		isl_token_free(tok);
-	} else if (tok->type == '(') {
-		isl_token_free(tok);
-		tok = NULL;
-		res = accept_affine(s, isl_space_copy(dim), v);
-		if (!res)
-			goto error;
-		if (isl_stream_eat(s, ')'))
-			goto error;
-	} else if (tok->type == '[' ||
-		    tok->type == ISL_TOKEN_FLOORD ||
-		    tok->type == ISL_TOKEN_CEILD) {
-		isl_stream_push_token(s, tok);
-		tok = NULL;
-		res = accept_div(s, isl_space_copy(dim), v);
-	} else if (tok->type == ISL_TOKEN_MIN || tok->type == ISL_TOKEN_MAX) {
-		isl_stream_push_token(s, tok);
-		tok = NULL;
-		res = accept_minmax(s, isl_space_copy(dim), v);
-	} else {
-		isl_stream_error(s, tok, "expecting factor");
-		goto error;
-	}
-	if (isl_stream_eat_if_available(s, '%') ||
-	    isl_stream_eat_if_available(s, ISL_TOKEN_MOD)) {
-		isl_space_free(dim);
-		return affine_mod(s, v, res);
-	}
-	if (isl_stream_eat_if_available(s, '*')) {
-		isl_int f;
-		isl_int_init(f);
-		isl_int_set_si(f, 1);
-		if (accept_cst_factor(s, &f) < 0) {
-			isl_int_clear(f);
-			goto error2;
-		}
-		res = isl_pw_aff_scale(res, f);
-		isl_int_clear(f);
-	}
-
-	isl_space_free(dim);
-	return res;
-error:
-	isl_token_free(tok);
-error2:
-	isl_pw_aff_free(res);
-	isl_space_free(dim);
-	return NULL;
-}
-
-static __isl_give isl_pw_aff *add_cst(__isl_take isl_pw_aff *pwaff, isl_int v)
-{
-	isl_aff *aff;
-	isl_space *space;
-
-	space = isl_pw_aff_get_domain_space(pwaff);
-	aff = isl_aff_zero_on_domain(isl_local_space_from_space(space));
-	aff = isl_aff_add_constant(aff, v);
-
-	return isl_pw_aff_add(pwaff, isl_pw_aff_from_aff(aff));
-}
-
-static __isl_give isl_pw_aff *accept_affine(struct isl_stream *s,
-	__isl_take isl_space *dim, struct vars *v)
-{
-	struct isl_token *tok = NULL;
-	isl_local_space *ls;
-	isl_pw_aff *res;
-	int sign = 1;
-
-	ls = isl_local_space_from_space(isl_space_copy(dim));
-	res = isl_pw_aff_from_aff(isl_aff_zero_on_domain(ls));
-	if (!res)
-		goto error;
-
-	for (;;) {
-		tok = next_token(s);
-		if (!tok) {
-			isl_stream_error(s, NULL, "unexpected EOF");
-			goto error;
-		}
-		if (tok->type == '-') {
-			sign = -sign;
-			isl_token_free(tok);
-			continue;
-		}
-		if (tok->type == '(' || tok->type == '[' ||
-		    tok->type == ISL_TOKEN_MIN || tok->type == ISL_TOKEN_MAX ||
-		    tok->type == ISL_TOKEN_FLOORD ||
-		    tok->type == ISL_TOKEN_CEILD ||
-		    tok->type == ISL_TOKEN_IDENT ||
-		    tok->type == ISL_TOKEN_AFF) {
-			isl_pw_aff *term;
-			isl_stream_push_token(s, tok);
-			tok = NULL;
-			term = accept_affine_factor(s, isl_space_copy(dim), v);
-			if (sign < 0)
-				res = isl_pw_aff_sub(res, term);
-			else
-				res = isl_pw_aff_add(res, term);
-			if (!res)
-				goto error;
-			sign = 1;
-		} else if (tok->type == ISL_TOKEN_VALUE) {
-			if (sign < 0)
-				isl_int_neg(tok->u.v, tok->u.v);
-			if (isl_stream_eat_if_available(s, '*') ||
-			    isl_stream_next_token_is(s, ISL_TOKEN_IDENT)) {
-				isl_pw_aff *term;
-				term = accept_affine_factor(s,
-							isl_space_copy(dim), v);
-				term = isl_pw_aff_scale(term, tok->u.v);
-				res = isl_pw_aff_add(res, term);
-				if (!res)
-					goto error;
-			} else {
-				res = add_cst(res, tok->u.v);
-			}
-			sign = 1;
-		} else {
-			isl_stream_error(s, tok, "unexpected isl_token");
-			isl_stream_push_token(s, tok);
-			isl_pw_aff_free(res);
-			isl_space_free(dim);
-			return NULL;
-		}
-		isl_token_free(tok);
-
-		tok = next_token(s);
-		if (tok && tok->type == '-') {
-			sign = -sign;
-			isl_token_free(tok);
-		} else if (tok && tok->type == '+') {
-			/* nothing */
-			isl_token_free(tok);
-		} else if (tok && tok->type == ISL_TOKEN_VALUE &&
-			   isl_int_is_neg(tok->u.v)) {
-			isl_stream_push_token(s, tok);
-		} else {
-			if (tok)
-				isl_stream_push_token(s, tok);
-			break;
-		}
-	}
-
-	isl_space_free(dim);
-	return res;
-error:
-	isl_space_free(dim);
-	isl_token_free(tok);
-	isl_pw_aff_free(res);
-	return NULL;
-}
-
-static int is_comparator(struct isl_token *tok)
-{
-	if (!tok)
-		return 0;
-
-	switch (tok->type) {
-	case ISL_TOKEN_LT:
-	case ISL_TOKEN_GT:
-	case ISL_TOKEN_LE:
-	case ISL_TOKEN_GE:
-	case ISL_TOKEN_NE:
-	case '=':
-		return 1;
-	default:
-		return 0;
-	}
-}
-
-static struct isl_map *read_disjuncts(struct isl_stream *s,
-	struct vars *v, __isl_take isl_map *map);
-static __isl_give isl_pw_aff *accept_extended_affine(struct isl_stream *s,
-	__isl_take isl_space *dim, struct vars *v);
-
-/* Accept a ternary operator, given the first argument.
- */
-static __isl_give isl_pw_aff *accept_ternary(struct isl_stream *s,
-	__isl_take isl_map *cond, struct vars *v)
-{
-	isl_space *dim;
-	isl_pw_aff *pwaff1 = NULL, *pwaff2 = NULL;
-
-	if (!cond)
-		return NULL;
-
-	if (isl_stream_eat(s, '?'))
-		goto error;
-
-	dim = isl_space_wrap(isl_map_get_space(cond));
-	pwaff1 = accept_extended_affine(s, dim, v);
-	if (!pwaff1)
-		goto error;
-
-	if (isl_stream_eat(s, ':'))
-		goto error;
-
-	dim = isl_pw_aff_get_domain_space(pwaff1);
-	pwaff2 = accept_extended_affine(s, dim, v);
-	if (!pwaff1)
-		goto error;
-
-	return isl_pw_aff_cond(isl_map_wrap(cond), pwaff1, pwaff2);
-error:
-	isl_map_free(cond);
-	isl_pw_aff_free(pwaff1);
-	isl_pw_aff_free(pwaff2);
-	return NULL;
-}
-
-/* Accept an affine expression that may involve ternary operators.
- * We first read an affine expression.
- * If it is not followed by a comparison operator, we simply return it.
- * Otherwise, we assume the affine epxression is part of the first
- * argument of a ternary operator and try to parse that.
- */
-static __isl_give isl_pw_aff *accept_extended_affine(struct isl_stream *s,
-	__isl_take isl_space *dim, struct vars *v)
-{
-	isl_space *space;
-	isl_map *cond;
-	isl_pw_aff *pwaff;
-	struct isl_token *tok;
-	int line = -1, col = -1;
-	int is_comp;
-
-	tok = isl_stream_next_token(s);
-	if (tok) {
-		line = tok->line;
-		col = tok->col;
-		isl_stream_push_token(s, tok);
-	}
-
-	pwaff = accept_affine(s, dim, v);
-	if (!pwaff)
-		return NULL;
-
-	tok = isl_stream_next_token(s);
-	if (!tok)
-		return isl_pw_aff_free(pwaff);
-
-	is_comp = is_comparator(tok);
-	isl_stream_push_token(s, tok);
-	if (!is_comp)
-		return pwaff;
-
-	tok = isl_token_new(s->ctx, line, col, 0);
-	if (!tok)
-		return isl_pw_aff_free(pwaff);
-	tok->type = ISL_TOKEN_AFF;
-	tok->u.pwaff = pwaff;
-
-	space = isl_pw_aff_get_domain_space(pwaff);
-	cond = isl_map_universe(isl_space_unwrap(space));
-
-	isl_stream_push_token(s, tok);
-
-	cond = read_disjuncts(s, v, cond);
-
-	return accept_ternary(s, cond, v);
-}
-
-static __isl_give isl_map *read_var_def(struct isl_stream *s,
-	__isl_take isl_map *map, enum isl_dim_type type, struct vars *v)
-{
-	isl_pw_aff *def;
-	int pos;
-	isl_map *def_map;
-
-	if (type == isl_dim_param)
-		pos = isl_map_dim(map, isl_dim_param);
-	else {
-		pos = isl_map_dim(map, isl_dim_in);
-		if (type == isl_dim_out)
-			pos += isl_map_dim(map, isl_dim_out);
-		type = isl_dim_in;
-	}
-	--pos;
-
-	def = accept_extended_affine(s, isl_space_wrap(isl_map_get_space(map)), v);
-	def_map = isl_map_from_pw_aff(def);
-	def_map = isl_map_equate(def_map, type, pos, isl_dim_out, 0);
-	def_map = isl_set_unwrap(isl_map_domain(def_map));
-
-	map = isl_map_intersect(map, def_map);
-
-	return map;
-}
-
-static __isl_give isl_map *read_var_list(struct isl_stream *s,
-	__isl_take isl_map *map, enum isl_dim_type type, struct vars *v)
-{
-	int i = 0;
-	struct isl_token *tok;
-
-	if (isl_stream_next_token_is(s, ']'))
-		return isl_map_add_dims(map, type, 0);
-
-	while ((tok = next_token(s)) != NULL) {
-		int new_name = 0;
-
-		if (tok->type == ISL_TOKEN_IDENT) {
-			int n = v->n;
-			int p = vars_pos(v, tok->u.s, -1);
-			if (p < 0)
-				goto error;
-			new_name = p >= n;
-		}
-
-		if (new_name) {
-			map = isl_map_add_dims(map, type, 1);
-			map = set_name(map, type, i, v->v->name);
-			isl_token_free(tok);
-			if (isl_stream_eat_if_available(s, '='))
-				map = read_var_def(s, map, type, v);
-		} else {
-			if (type == isl_dim_param) {
-				isl_stream_error(s, tok,
-						"expecting unique identifier");
-				goto error;
-			}
-			isl_stream_push_token(s, tok);
-			tok = NULL;
-			if (vars_add_anon(v) < 0)
-				goto error;
-			map = isl_map_add_dims(map, type, 1);
-			map = read_var_def(s, map, type, v);
-		}
-
-		tok = isl_stream_next_token(s);
-		if (tok && tok->type == ']' &&
-		    isl_stream_next_token_is(s, '[')) {
-			isl_token_free(tok);
-			tok = isl_stream_next_token(s);
-		} else if (!tok || tok->type != ',')
-			break;
-
-		isl_token_free(tok);
-		i++;
-	}
-	if (tok)
-		isl_stream_push_token(s, tok);
-
-	return map;
-error:
-	isl_token_free(tok);
-	isl_map_free(map);
-	return NULL;
-}
-
-static __isl_give isl_pw_aff_list *accept_affine_list(struct isl_stream *s,
-	__isl_take isl_space *dim, struct vars *v)
-{
-	isl_pw_aff *pwaff;
-	isl_pw_aff_list *list;
-	struct isl_token *tok = NULL;
-
-	pwaff = accept_affine(s, isl_space_copy(dim), v);
-	list = isl_pw_aff_list_from_pw_aff(pwaff);
-	if (!list)
-		goto error;
-
-	for (;;) {
-		tok = isl_stream_next_token(s);
-		if (!tok) {
-			isl_stream_error(s, NULL, "unexpected EOF");
-			goto error;
-		}
-		if (tok->type != ',') {
-			isl_stream_push_token(s, tok);
-			break;
-		}
-		isl_token_free(tok);
-
-		pwaff = accept_affine(s, isl_space_copy(dim), v);
-		list = isl_pw_aff_list_concat(list,
-				isl_pw_aff_list_from_pw_aff(pwaff));
-		if (!list)
-			return NULL;
-	}
-
-	isl_space_free(dim);
-	return list;
-error:
-	isl_space_free(dim);
-	isl_pw_aff_list_free(list);
-	return NULL;
-}
-
-static __isl_give isl_map *read_defined_var_list(struct isl_stream *s,
-	struct vars *v, __isl_take isl_map *map)
-{
-	struct isl_token *tok;
-
-	while ((tok = isl_stream_next_token(s)) != NULL) {
-		int p;
-		int n = v->n;
-
-		if (tok->type != ISL_TOKEN_IDENT)
-			break;
-
-		p = vars_pos(v, tok->u.s, -1);
-		if (p < 0)
-			goto error;
-		if (p < n) {
-			isl_stream_error(s, tok, "expecting unique identifier");
-			goto error;
-		}
-
-		map = isl_map_add_dims(map, isl_dim_out, 1);
-
-		isl_token_free(tok);
-		tok = isl_stream_next_token(s);
-		if (tok && tok->type == '=') {
-			isl_token_free(tok);
-			map = read_var_def(s, map, isl_dim_out, v);
-			tok = isl_stream_next_token(s);
-		}
-
-		if (!tok || tok->type != ',')
-			break;
-
-		isl_token_free(tok);
-	}
-	if (tok)
-		isl_stream_push_token(s, tok);
-
-	return map;
-error:
-	isl_token_free(tok);
-	isl_map_free(map);
-	return NULL;
-}
-
-static int next_is_tuple(struct isl_stream *s)
-{
-	struct isl_token *tok;
-	int is_tuple;
-
-	tok = isl_stream_next_token(s);
-	if (!tok)
-		return 0;
-	if (tok->type == '[') {
-		isl_stream_push_token(s, tok);
-		return 1;
-	}
-	if (tok->type != ISL_TOKEN_IDENT && !tok->is_keyword) {
-		isl_stream_push_token(s, tok);
-		return 0;
-	}
-
-	is_tuple = isl_stream_next_token_is(s, '[');
-
-	isl_stream_push_token(s, tok);
-
-	return is_tuple;
-}
-
-static __isl_give isl_map *read_tuple(struct isl_stream *s,
-	__isl_take isl_map *map, enum isl_dim_type type, struct vars *v);
-
-static __isl_give isl_set *read_nested_tuple(struct isl_stream *s,
-	__isl_take isl_map *map, struct vars *v)
-{
-	map = read_tuple(s, map, isl_dim_in, v);
-	if (isl_stream_eat(s, ISL_TOKEN_TO))
-		goto error;
-	map = read_tuple(s, map, isl_dim_out, v);
-	return isl_map_wrap(map);
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-static __isl_give isl_map *read_tuple(struct isl_stream *s,
-	__isl_take isl_map *map, enum isl_dim_type type, struct vars *v)
-{
-	struct isl_token *tok;
-	char *name = NULL;
-
-	tok = isl_stream_next_token(s);
-	if (tok && (tok->type == ISL_TOKEN_IDENT || tok->is_keyword)) {
-		name = strdup(tok->u.s);
-		if (!name)
-			goto error;
-		isl_token_free(tok);
-		tok = isl_stream_next_token(s);
-	}
-	if (!tok || tok->type != '[') {
-		isl_stream_error(s, tok, "expecting '['");
-		goto error;
-	}
-	isl_token_free(tok);
-	if (type != isl_dim_param && next_is_tuple(s)) {
-		isl_space *dim = isl_map_get_space(map);
-		int nparam = isl_space_dim(dim, isl_dim_param);
-		int n_in = isl_space_dim(dim, isl_dim_in);
-		isl_set *nested;
-		if (type == isl_dim_out) {
-			dim = isl_space_move_dims(dim, isl_dim_param, nparam,
-						isl_dim_in, 0, n_in);
-			dim = isl_space_params(dim);
-		}
-		nested = read_nested_tuple(s, isl_map_universe(dim), v);
-		if (type == isl_dim_in) {
-			nested = isl_map_reverse(nested);
-			map = isl_map_intersect_params(nested, map);
-		} else {
-			isl_set *set;
-			dim = isl_set_get_space(nested);
-			dim = isl_space_drop_dims(dim, isl_dim_param, nparam, n_in);
-			dim = isl_space_join(isl_map_get_space(map), dim);
-			set = isl_map_domain(map);
-			nested = isl_map_reset_space(nested, dim);
-			map = isl_map_intersect_domain(nested, set);
-		}
-	} else
-		map = read_var_list(s, map, type, v);
-	tok = isl_stream_next_token(s);
-	if (!tok || tok->type != ']') {
-		isl_stream_error(s, tok, "expecting ']'");
-		goto error;
-	}
-	isl_token_free(tok);
-
-	if (name) {
-		map = isl_map_set_tuple_name(map, type, name);
-		free(name);
-	}
-
-	return map;
-error:
-	if (tok)
-		isl_token_free(tok);
-	isl_map_free(map);
-	return NULL;
-}
-
-static __isl_give isl_set *construct_constraints(
-	__isl_take isl_set *set, enum isl_token_type type,
-	__isl_keep isl_pw_aff_list *left, __isl_keep isl_pw_aff_list *right)
-{
-	isl_set *cond;
-
-	if (type == ISL_TOKEN_LE)
-		cond = isl_pw_aff_list_le_set(isl_pw_aff_list_copy(left),
-					      isl_pw_aff_list_copy(right));
-	else if (type == ISL_TOKEN_GE)
-		cond = isl_pw_aff_list_ge_set(isl_pw_aff_list_copy(left),
-					      isl_pw_aff_list_copy(right));
-	else if (type == ISL_TOKEN_LT)
-		cond = isl_pw_aff_list_lt_set(isl_pw_aff_list_copy(left),
-					      isl_pw_aff_list_copy(right));
-	else if (type == ISL_TOKEN_GT)
-		cond = isl_pw_aff_list_gt_set(isl_pw_aff_list_copy(left),
-					      isl_pw_aff_list_copy(right));
-	else if (type == ISL_TOKEN_NE)
-		cond = isl_pw_aff_list_ne_set(isl_pw_aff_list_copy(left),
-					      isl_pw_aff_list_copy(right));
-	else
-		cond = isl_pw_aff_list_eq_set(isl_pw_aff_list_copy(left),
-					      isl_pw_aff_list_copy(right));
-
-	return isl_set_intersect(set, cond);
-}
-
-static __isl_give isl_map *add_constraint(struct isl_stream *s,
-	struct vars *v, __isl_take isl_map *map)
-{
-	struct isl_token *tok = NULL;
-	isl_pw_aff_list *list1 = NULL, *list2 = NULL;
-	isl_set *set;
-
-	set = isl_map_wrap(map);
-	list1 = accept_affine_list(s, isl_set_get_space(set), v);
-	if (!list1)
-		goto error;
-	tok = isl_stream_next_token(s);
-	if (!is_comparator(tok)) {
-		isl_stream_error(s, tok, "missing operator");
-		if (tok)
-			isl_stream_push_token(s, tok);
-		tok = NULL;
-		goto error;
-	}
-	for (;;) {
-		list2 = accept_affine_list(s, isl_set_get_space(set), v);
-		if (!list2)
-			goto error;
-
-		set = construct_constraints(set, tok->type, list1, list2);
-		isl_token_free(tok);
-		isl_pw_aff_list_free(list1);
-		list1 = list2;
-
-		tok = isl_stream_next_token(s);
-		if (!is_comparator(tok)) {
-			if (tok)
-				isl_stream_push_token(s, tok);
-			break;
-		}
-	}
-	isl_pw_aff_list_free(list1);
-
-	return isl_set_unwrap(set);
-error:
-	if (tok)
-		isl_token_free(tok);
-	isl_pw_aff_list_free(list1);
-	isl_pw_aff_list_free(list2);
-	isl_set_free(set);
-	return NULL;
-}
-
-static __isl_give isl_map *read_exists(struct isl_stream *s,
-	struct vars *v, __isl_take isl_map *map)
-{
-	int n = v->n;
-	int seen_paren = isl_stream_eat_if_available(s, '(');
-
-	map = isl_map_from_domain(isl_map_wrap(map));
-	map = read_defined_var_list(s, v, map);
-
-	if (isl_stream_eat(s, ':'))
-		goto error;
-
-	map = read_disjuncts(s, v, map);
-	map = isl_set_unwrap(isl_map_domain(map));
-
-	vars_drop(v, v->n - n);
-	if (seen_paren && isl_stream_eat(s, ')'))
-		goto error;
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Parse an expression between parentheses and push the result
- * back on the stream.
- *
- * The parsed expression may be either an affine expression
- * or a condition.  The first type is pushed onto the stream
- * as an isl_pw_aff, while the second is pushed as an isl_map.
- *
- * If the initial token indicates the start of a condition,
- * we parse it as such.
- * Otherwise, we first parse an affine expression and push
- * that onto the stream.  If the affine expression covers the
- * entire expression between parentheses, we return.
- * Otherwise, we assume that the affine expression is the
- * start of a condition and continue parsing.
- */
-static int resolve_paren_expr(struct isl_stream *s,
-	struct vars *v, __isl_take isl_map *map)
-{
-	struct isl_token *tok, *tok2;
-	int line, col;
-	isl_pw_aff *pwaff;
-
-	tok = isl_stream_next_token(s);
-	if (!tok || tok->type != '(')
-		goto error;
-
-	if (isl_stream_next_token_is(s, '('))
-		if (resolve_paren_expr(s, v, isl_map_copy(map)))
-			goto error;
-
-	if (isl_stream_next_token_is(s, ISL_TOKEN_EXISTS) ||
-	    isl_stream_next_token_is(s, ISL_TOKEN_TRUE) ||
-	    isl_stream_next_token_is(s, ISL_TOKEN_FALSE) ||
-	    isl_stream_next_token_is(s, ISL_TOKEN_MAP)) {
-		map = read_disjuncts(s, v, map);
-		if (isl_stream_eat(s, ')'))
-			goto error;
-		tok->type = ISL_TOKEN_MAP;
-		tok->u.map = map;
-		isl_stream_push_token(s, tok);
-		return 0;
-	}
-
-	tok2 = isl_stream_next_token(s);
-	if (!tok2)
-		goto error;
-	line = tok2->line;
-	col = tok2->col;
-	isl_stream_push_token(s, tok2);
-
-	pwaff = accept_affine(s, isl_space_wrap(isl_map_get_space(map)), v);
-	if (!pwaff)
-		goto error;
-
-	tok2 = isl_token_new(s->ctx, line, col, 0);
-	if (!tok2)
-		goto error2;
-	tok2->type = ISL_TOKEN_AFF;
-	tok2->u.pwaff = pwaff;
-
-	if (isl_stream_eat_if_available(s, ')')) {
-		isl_stream_push_token(s, tok2);
-		isl_token_free(tok);
-		isl_map_free(map);
-		return 0;
-	}
-
-	isl_stream_push_token(s, tok2);
-
-	map = read_disjuncts(s, v, map);
-	if (isl_stream_eat(s, ')'))
-		goto error;
-
-	tok->type = ISL_TOKEN_MAP;
-	tok->u.map = map;
-	isl_stream_push_token(s, tok);
-
-	return 0;
-error2:
-	isl_pw_aff_free(pwaff);
-error:
-	isl_token_free(tok);
-	isl_map_free(map);
-	return -1;
-}
-
-static __isl_give isl_map *read_conjunct(struct isl_stream *s,
-	struct vars *v, __isl_take isl_map *map)
-{
-	if (isl_stream_next_token_is(s, '('))
-		if (resolve_paren_expr(s, v, isl_map_copy(map)))
-			goto error;
-
-	if (isl_stream_next_token_is(s, ISL_TOKEN_MAP)) {
-		struct isl_token *tok;
-		tok = isl_stream_next_token(s);
-		if (!tok)
-			goto error;
-		isl_map_free(map);
-		map = isl_map_copy(tok->u.map);
-		isl_token_free(tok);
-		return map;
-	}
-
-	if (isl_stream_eat_if_available(s, ISL_TOKEN_EXISTS))
-		return read_exists(s, v, map);
-
-	if (isl_stream_eat_if_available(s, ISL_TOKEN_TRUE))
-		return map;
-
-	if (isl_stream_eat_if_available(s, ISL_TOKEN_FALSE)) {
-		isl_space *dim = isl_map_get_space(map);
-		isl_map_free(map);
-		return isl_map_empty(dim);
-	}
-		
-	return add_constraint(s, v, map);
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-static __isl_give isl_map *read_conjuncts(struct isl_stream *s,
-	struct vars *v, __isl_take isl_map *map)
-{
-	isl_map *res;
-	int negate;
-
-	negate = isl_stream_eat_if_available(s, ISL_TOKEN_NOT);
-	res = read_conjunct(s, v, isl_map_copy(map));
-	if (negate)
-		res = isl_map_subtract(isl_map_copy(map), res);
-
-	while (isl_stream_eat_if_available(s, ISL_TOKEN_AND)) {
-		isl_map *res_i;
-
-		negate = isl_stream_eat_if_available(s, ISL_TOKEN_NOT);
-		res_i = read_conjunct(s, v, isl_map_copy(map));
-		if (negate)
-			res = isl_map_subtract(res, res_i);
-		else
-			res = isl_map_intersect(res, res_i);
-	}
-
-	isl_map_free(map);
-	return res;
-}
-
-static struct isl_map *read_disjuncts(struct isl_stream *s,
-	struct vars *v, __isl_take isl_map *map)
-{
-	isl_map *res;
-
-	if (isl_stream_next_token_is(s, '}')) {
-		isl_space *dim = isl_map_get_space(map);
-		isl_map_free(map);
-		return isl_map_universe(dim);
-	}
-
-	res = read_conjuncts(s, v, isl_map_copy(map));
-	while (isl_stream_eat_if_available(s, ISL_TOKEN_OR)) {
-		isl_map *res_i;
-
-		res_i = read_conjuncts(s, v, isl_map_copy(map));
-		res = isl_map_union(res, res_i);
-	}
-
-	isl_map_free(map);
-	return res;
-}
-
-static int polylib_pos_to_isl_pos(__isl_keep isl_basic_map *bmap, int pos)
-{
-	if (pos < isl_basic_map_dim(bmap, isl_dim_out))
-		return 1 + isl_basic_map_dim(bmap, isl_dim_param) +
-			   isl_basic_map_dim(bmap, isl_dim_in) + pos;
-	pos -= isl_basic_map_dim(bmap, isl_dim_out);
-
-	if (pos < isl_basic_map_dim(bmap, isl_dim_in))
-		return 1 + isl_basic_map_dim(bmap, isl_dim_param) + pos;
-	pos -= isl_basic_map_dim(bmap, isl_dim_in);
-
-	if (pos < isl_basic_map_dim(bmap, isl_dim_div))
-		return 1 + isl_basic_map_dim(bmap, isl_dim_param) +
-			   isl_basic_map_dim(bmap, isl_dim_in) +
-			   isl_basic_map_dim(bmap, isl_dim_out) + pos;
-	pos -= isl_basic_map_dim(bmap, isl_dim_div);
-
-	if (pos < isl_basic_map_dim(bmap, isl_dim_param))
-		return 1 + pos;
-
-	return 0;
-}
-
-static __isl_give isl_basic_map *basic_map_read_polylib_constraint(
-	struct isl_stream *s, __isl_take isl_basic_map *bmap)
-{
-	int j;
-	struct isl_token *tok;
-	int type;
-	int k;
-	isl_int *c;
-	unsigned nparam;
-	unsigned dim;
-
-	if (!bmap)
-		return NULL;
-
-	nparam = isl_basic_map_dim(bmap, isl_dim_param);
-	dim = isl_basic_map_dim(bmap, isl_dim_out);
-
-	tok = isl_stream_next_token(s);
-	if (!tok || tok->type != ISL_TOKEN_VALUE) {
-		isl_stream_error(s, tok, "expecting coefficient");
-		if (tok)
-			isl_stream_push_token(s, tok);
-		goto error;
-	}
-	if (!tok->on_new_line) {
-		isl_stream_error(s, tok, "coefficient should appear on new line");
-		isl_stream_push_token(s, tok);
-		goto error;
-	}
-
-	type = isl_int_get_si(tok->u.v);
-	isl_token_free(tok);
-
-	isl_assert(s->ctx, type == 0 || type == 1, goto error);
-	if (type == 0) {
-		k = isl_basic_map_alloc_equality(bmap);
-		c = bmap->eq[k];
-	} else {
-		k = isl_basic_map_alloc_inequality(bmap);
-		c = bmap->ineq[k];
-	}
-	if (k < 0)
-		goto error;
-
-	for (j = 0; j < 1 + isl_basic_map_total_dim(bmap); ++j) {
-		int pos;
-		tok = isl_stream_next_token(s);
-		if (!tok || tok->type != ISL_TOKEN_VALUE) {
-			isl_stream_error(s, tok, "expecting coefficient");
-			if (tok)
-				isl_stream_push_token(s, tok);
-			goto error;
-		}
-		if (tok->on_new_line) {
-			isl_stream_error(s, tok,
-				"coefficient should not appear on new line");
-			isl_stream_push_token(s, tok);
-			goto error;
-		}
-		pos = polylib_pos_to_isl_pos(bmap, j);
-		isl_int_set(c[pos], tok->u.v);
-		isl_token_free(tok);
-	}
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static __isl_give isl_basic_map *basic_map_read_polylib(struct isl_stream *s)
-{
-	int i;
-	struct isl_token *tok;
-	struct isl_token *tok2;
-	int n_row, n_col;
-	int on_new_line;
-	unsigned in = 0, out, local = 0;
-	struct isl_basic_map *bmap = NULL;
-	int nparam = 0;
-
-	tok = isl_stream_next_token(s);
-	if (!tok) {
-		isl_stream_error(s, NULL, "unexpected EOF");
-		return NULL;
-	}
-	tok2 = isl_stream_next_token(s);
-	if (!tok2) {
-		isl_token_free(tok);
-		isl_stream_error(s, NULL, "unexpected EOF");
-		return NULL;
-	}
-	if (tok->type != ISL_TOKEN_VALUE || tok2->type != ISL_TOKEN_VALUE) {
-		isl_stream_push_token(s, tok2);
-		isl_stream_push_token(s, tok);
-		isl_stream_error(s, NULL,
-				 "expecting constraint matrix dimensions");
-		return NULL;
-	}
-	n_row = isl_int_get_si(tok->u.v);
-	n_col = isl_int_get_si(tok2->u.v);
-	on_new_line = tok2->on_new_line;
-	isl_token_free(tok2);
-	isl_token_free(tok);
-	isl_assert(s->ctx, !on_new_line, return NULL);
-	isl_assert(s->ctx, n_row >= 0, return NULL);
-	isl_assert(s->ctx, n_col >= 2 + nparam, return NULL);
-	tok = isl_stream_next_token_on_same_line(s);
-	if (tok) {
-		if (tok->type != ISL_TOKEN_VALUE) {
-			isl_stream_error(s, tok,
-				    "expecting number of output dimensions");
-			isl_stream_push_token(s, tok);
-			goto error;
-		}
-		out = isl_int_get_si(tok->u.v);
-		isl_token_free(tok);
-
-		tok = isl_stream_next_token_on_same_line(s);
-		if (!tok || tok->type != ISL_TOKEN_VALUE) {
-			isl_stream_error(s, tok,
-				    "expecting number of input dimensions");
-			if (tok)
-				isl_stream_push_token(s, tok);
-			goto error;
-		}
-		in = isl_int_get_si(tok->u.v);
-		isl_token_free(tok);
-
-		tok = isl_stream_next_token_on_same_line(s);
-		if (!tok || tok->type != ISL_TOKEN_VALUE) {
-			isl_stream_error(s, tok,
-				    "expecting number of existentials");
-			if (tok)
-				isl_stream_push_token(s, tok);
-			goto error;
-		}
-		local = isl_int_get_si(tok->u.v);
-		isl_token_free(tok);
-
-		tok = isl_stream_next_token_on_same_line(s);
-		if (!tok || tok->type != ISL_TOKEN_VALUE) {
-			isl_stream_error(s, tok,
-				    "expecting number of parameters");
-			if (tok)
-				isl_stream_push_token(s, tok);
-			goto error;
-		}
-		nparam = isl_int_get_si(tok->u.v);
-		isl_token_free(tok);
-		if (n_col != 1 + out + in + local + nparam + 1) {
-			isl_stream_error(s, NULL,
-				    "dimensions don't match");
-			goto error;
-		}
-	} else
-		out = n_col - 2 - nparam;
-	bmap = isl_basic_map_alloc(s->ctx, nparam, in, out, local, n_row, n_row);
-	if (!bmap)
-		return NULL;
-
-	for (i = 0; i < local; ++i) {
-		int k = isl_basic_map_alloc_div(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(bmap->div[k], 1 + 1 + nparam + in + out + local);
-	}
-
-	for (i = 0; i < n_row; ++i)
-		bmap = basic_map_read_polylib_constraint(s, bmap);
-
-	tok = isl_stream_next_token_on_same_line(s);
-	if (tok) {
-		isl_stream_error(s, tok, "unexpected extra token on line");
-		isl_stream_push_token(s, tok);
-		goto error;
-	}
-
-	bmap = isl_basic_map_simplify(bmap);
-	bmap = isl_basic_map_finalize(bmap);
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static struct isl_map *map_read_polylib(struct isl_stream *s)
-{
-	struct isl_token *tok;
-	struct isl_token *tok2;
-	int i, n;
-	struct isl_map *map;
-
-	tok = isl_stream_next_token(s);
-	if (!tok) {
-		isl_stream_error(s, NULL, "unexpected EOF");
-		return NULL;
-	}
-	tok2 = isl_stream_next_token_on_same_line(s);
-	if (tok2 && tok2->type == ISL_TOKEN_VALUE) {
-		isl_stream_push_token(s, tok2);
-		isl_stream_push_token(s, tok);
-		return isl_map_from_basic_map(basic_map_read_polylib(s));
-	}
-	if (tok2) {
-		isl_stream_error(s, tok2, "unexpected token");
-		isl_stream_push_token(s, tok2);
-		isl_stream_push_token(s, tok);
-		return NULL;
-	}
-	n = isl_int_get_si(tok->u.v);
-	isl_token_free(tok);
-
-	isl_assert(s->ctx, n >= 1, return NULL);
-
-	map = isl_map_from_basic_map(basic_map_read_polylib(s));
-
-	for (i = 1; map && i < n; ++i)
-		map = isl_map_union(map,
-			isl_map_from_basic_map(basic_map_read_polylib(s)));
-
-	return map;
-}
-
-static int optional_power(struct isl_stream *s)
-{
-	int pow;
-	struct isl_token *tok;
-
-	tok = isl_stream_next_token(s);
-	if (!tok)
-		return 1;
-	if (tok->type != '^') {
-		isl_stream_push_token(s, tok);
-		return 1;
-	}
-	isl_token_free(tok);
-	tok = isl_stream_next_token(s);
-	if (!tok || tok->type != ISL_TOKEN_VALUE) {
-		isl_stream_error(s, tok, "expecting exponent");
-		if (tok)
-			isl_stream_push_token(s, tok);
-		return 1;
-	}
-	pow = isl_int_get_si(tok->u.v);
-	isl_token_free(tok);
-	return pow;
-}
-
-static __isl_give isl_pw_qpolynomial *read_term(struct isl_stream *s,
-	__isl_keep isl_map *map, struct vars *v);
-
-static __isl_give isl_pw_qpolynomial *read_factor(struct isl_stream *s,
-	__isl_keep isl_map *map, struct vars *v)
-{
-	isl_pw_qpolynomial *pwqp;
-	struct isl_token *tok;
-
-	tok = next_token(s);
-	if (!tok) {
-		isl_stream_error(s, NULL, "unexpected EOF");
-		return NULL;
-	}
-	if (tok->type == '(') {
-		int pow;
-
-		isl_token_free(tok);
-		pwqp = read_term(s, map, v);
-		if (!pwqp)
-			return NULL;
-		if (isl_stream_eat(s, ')'))
-			goto error;
-		pow = optional_power(s);
-		pwqp = isl_pw_qpolynomial_pow(pwqp, pow);
-	} else if (tok->type == ISL_TOKEN_VALUE) {
-		struct isl_token *tok2;
-		tok2 = isl_stream_next_token(s);
-		isl_qpolynomial *qp;
-		if (tok2 && tok2->type == '/') {
-			isl_token_free(tok2);
-			tok2 = next_token(s);
-			if (!tok2 || tok2->type != ISL_TOKEN_VALUE) {
-				isl_stream_error(s, tok2, "expected denominator");
-				isl_token_free(tok);
-				isl_token_free(tok2);
-				return NULL;
-			}
-			qp = isl_qpolynomial_rat_cst_on_domain(isl_map_get_space(map),
-						    tok->u.v, tok2->u.v);
-			isl_token_free(tok2);
-		} else {
-			isl_stream_push_token(s, tok2);
-			qp = isl_qpolynomial_cst_on_domain(isl_map_get_space(map),
-						tok->u.v);
-		}
-		isl_token_free(tok);
-		pwqp = isl_pw_qpolynomial_from_qpolynomial(qp);
-	} else if (tok->type == ISL_TOKEN_INFTY) {
-		isl_qpolynomial *qp;
-		isl_token_free(tok);
-		qp = isl_qpolynomial_infty_on_domain(isl_map_get_space(map));
-		pwqp = isl_pw_qpolynomial_from_qpolynomial(qp);
-	} else if (tok->type == ISL_TOKEN_NAN) {
-		isl_qpolynomial *qp;
-		isl_token_free(tok);
-		qp = isl_qpolynomial_nan_on_domain(isl_map_get_space(map));
-		pwqp = isl_pw_qpolynomial_from_qpolynomial(qp);
-	} else if (tok->type == ISL_TOKEN_IDENT) {
-		int n = v->n;
-		int pos = vars_pos(v, tok->u.s, -1);
-		int pow;
-		isl_qpolynomial *qp;
-		if (pos < 0) {
-			isl_token_free(tok);
-			return NULL;
-		}
-		if (pos >= n) {
-			vars_drop(v, v->n - n);
-			isl_stream_error(s, tok, "unknown identifier");
-			isl_token_free(tok);
-			return NULL;
-		}
-		isl_token_free(tok);
-		pow = optional_power(s);
-		qp = isl_qpolynomial_var_pow_on_domain(isl_map_get_space(map), pos, pow);
-		pwqp = isl_pw_qpolynomial_from_qpolynomial(qp);
-	} else if (tok->type == '[') {
-		isl_pw_aff *pwaff;
-		int pow;
-
-		isl_stream_push_token(s, tok);
-		pwaff = accept_affine(s, isl_map_get_space(map), v);
-		pow = optional_power(s);
-		pwqp = isl_pw_qpolynomial_from_pw_aff(pwaff);
-		pwqp = isl_pw_qpolynomial_pow(pwqp, pow);
-	} else if (tok->type == '-') {
-		isl_token_free(tok);
-		pwqp = read_factor(s, map, v);
-		pwqp = isl_pw_qpolynomial_neg(pwqp);
-	} else {
-		isl_stream_error(s, tok, "unexpected isl_token");
-		isl_stream_push_token(s, tok);
-		return NULL;
-	}
-
-	if (isl_stream_eat_if_available(s, '*') ||
-	    isl_stream_next_token_is(s, ISL_TOKEN_IDENT)) {
-		isl_pw_qpolynomial *pwqp2;
-
-		pwqp2 = read_factor(s, map, v);
-		pwqp = isl_pw_qpolynomial_mul(pwqp, pwqp2);
-	}
-
-	return pwqp;
-error:
-	isl_pw_qpolynomial_free(pwqp);
-	return NULL;
-}
-
-static __isl_give isl_pw_qpolynomial *read_term(struct isl_stream *s,
-	__isl_keep isl_map *map, struct vars *v)
-{
-	struct isl_token *tok;
-	isl_pw_qpolynomial *pwqp;
-
-	pwqp = read_factor(s, map, v);
-
-	for (;;) {
-		tok = next_token(s);
-		if (!tok)
-			return pwqp;
-
-		if (tok->type == '+') {
-			isl_pw_qpolynomial *pwqp2;
-
-			isl_token_free(tok);
-			pwqp2 = read_factor(s, map, v);
-			pwqp = isl_pw_qpolynomial_add(pwqp, pwqp2);
-		} else if (tok->type == '-') {
-			isl_pw_qpolynomial *pwqp2;
-
-			isl_token_free(tok);
-			pwqp2 = read_factor(s, map, v);
-			pwqp = isl_pw_qpolynomial_sub(pwqp, pwqp2);
-		} else if (tok->type == ISL_TOKEN_VALUE &&
-			    isl_int_is_neg(tok->u.v)) {
-			isl_pw_qpolynomial *pwqp2;
-
-			isl_stream_push_token(s, tok);
-			pwqp2 = read_factor(s, map, v);
-			pwqp = isl_pw_qpolynomial_add(pwqp, pwqp2);
-		} else {
-			isl_stream_push_token(s, tok);
-			break;
-		}
-	}
-
-	return pwqp;
-}
-
-static __isl_give isl_map *read_optional_disjuncts(struct isl_stream *s,
-	__isl_take isl_map *map, struct vars *v)
-{
-	struct isl_token *tok;
-
-	tok = isl_stream_next_token(s);
-	if (!tok) {
-		isl_stream_error(s, NULL, "unexpected EOF");
-		goto error;
-	}
-	if (tok->type == ':' ||
-	    (tok->type == ISL_TOKEN_OR && !strcmp(tok->u.s, "|"))) {
-		isl_token_free(tok);
-		map = read_disjuncts(s, v, map);
-	} else
-		isl_stream_push_token(s, tok);
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-static struct isl_obj obj_read_poly(struct isl_stream *s,
-	__isl_take isl_map *map, struct vars *v, int n)
-{
-	struct isl_obj obj = { isl_obj_pw_qpolynomial, NULL };
-	isl_pw_qpolynomial *pwqp;
-	struct isl_set *set;
-
-	pwqp = read_term(s, map, v);
-	map = read_optional_disjuncts(s, map, v);
-	set = isl_map_range(map);
-
-	pwqp = isl_pw_qpolynomial_intersect_domain(pwqp, set);
-
-	vars_drop(v, v->n - n);
-
-	obj.v = pwqp;
-	return obj;
-}
-
-static struct isl_obj obj_read_poly_or_fold(struct isl_stream *s,
-	__isl_take isl_set *set, struct vars *v, int n)
-{
-	struct isl_obj obj = { isl_obj_pw_qpolynomial_fold, NULL };
-	isl_pw_qpolynomial *pwqp;
-	isl_pw_qpolynomial_fold *pwf = NULL;
-
-	if (!isl_stream_eat_if_available(s, ISL_TOKEN_MAX))
-		return obj_read_poly(s, set, v, n);
-
-	if (isl_stream_eat(s, '('))
-		goto error;
-
-	pwqp = read_term(s, set, v);
-	pwf = isl_pw_qpolynomial_fold_from_pw_qpolynomial(isl_fold_max, pwqp);
-
-	while (isl_stream_eat_if_available(s, ',')) {
-		isl_pw_qpolynomial_fold *pwf_i;
-		pwqp = read_term(s, set, v);
-		pwf_i = isl_pw_qpolynomial_fold_from_pw_qpolynomial(isl_fold_max,
-									pwqp);
-		pwf = isl_pw_qpolynomial_fold_fold(pwf, pwf_i);
-	}
-
-	if (isl_stream_eat(s, ')'))
-		goto error;
-
-	set = read_optional_disjuncts(s, set, v);
-	pwf = isl_pw_qpolynomial_fold_intersect_domain(pwf, set);
-
-	vars_drop(v, v->n - n);
-
-	obj.v = pwf;
-	return obj;
-error:
-	isl_set_free(set);
-	isl_pw_qpolynomial_fold_free(pwf);
-	obj.type = isl_obj_none;
-	return obj;
-}
-
-static int is_rational(struct isl_stream *s)
-{
-	struct isl_token *tok;
-
-	tok = isl_stream_next_token(s);
-	if (!tok)
-		return 0;
-	if (tok->type == ISL_TOKEN_RAT && isl_stream_next_token_is(s, ':')) {
-		isl_token_free(tok);
-		isl_stream_eat(s, ':');
-		return 1;
-	}
-
-	isl_stream_push_token(s, tok);
-
-	return 0;
-}
-
-static struct isl_obj obj_read_body(struct isl_stream *s,
-	__isl_take isl_map *map, struct vars *v)
-{
-	struct isl_token *tok;
-	struct isl_obj obj = { isl_obj_set, NULL };
-	int n = v->n;
-
-	if (is_rational(s))
-		map = isl_map_set_rational(map);
-
-	if (isl_stream_next_token_is(s, ':')) {
-		obj.type = isl_obj_set;
-		obj.v = read_optional_disjuncts(s, map, v);
-		return obj;
-	}
-
-	if (!next_is_tuple(s))
-		return obj_read_poly_or_fold(s, map, v, n);
-
-	map = read_tuple(s, map, isl_dim_in, v);
-	if (!map)
-		goto error;
-	tok = isl_stream_next_token(s);
-	if (tok && tok->type == ISL_TOKEN_TO) {
-		obj.type = isl_obj_map;
-		isl_token_free(tok);
-		if (!next_is_tuple(s)) {
-			isl_set *set = isl_map_domain(map);
-			return obj_read_poly_or_fold(s, set, v, n);
-		}
-		map = read_tuple(s, map, isl_dim_out, v);
-		if (!map)
-			goto error;
-	} else {
-		map = isl_map_reverse(map);
-		if (tok)
-			isl_stream_push_token(s, tok);
-	}
-
-	map = read_optional_disjuncts(s, map, v);
-
-	vars_drop(v, v->n - n);
-
-	obj.v = map;
-	return obj;
-error:
-	isl_map_free(map);
-	obj.type = isl_obj_none;
-	return obj;
-}
-
-static struct isl_obj to_union(isl_ctx *ctx, struct isl_obj obj)
-{
-	if (obj.type == isl_obj_map) {
-		obj.v = isl_union_map_from_map(obj.v);
-		obj.type = isl_obj_union_map;
-	} else if (obj.type == isl_obj_set) {
-		obj.v = isl_union_set_from_set(obj.v);
-		obj.type = isl_obj_union_set;
-	} else if (obj.type == isl_obj_pw_qpolynomial) {
-		obj.v = isl_union_pw_qpolynomial_from_pw_qpolynomial(obj.v);
-		obj.type = isl_obj_union_pw_qpolynomial;
-	} else if (obj.type == isl_obj_pw_qpolynomial_fold) {
-		obj.v = isl_union_pw_qpolynomial_fold_from_pw_qpolynomial_fold(obj.v);
-		obj.type = isl_obj_union_pw_qpolynomial_fold;
-	} else
-		isl_assert(ctx, 0, goto error);
-	return obj;
-error:
-	obj.type->free(obj.v);
-	obj.type = isl_obj_none;
-	return obj;
-}
-
-static struct isl_obj obj_add(struct isl_ctx *ctx,
-	struct isl_obj obj1, struct isl_obj obj2)
-{
-	if (obj1.type == isl_obj_set && obj2.type == isl_obj_union_set)
-		obj1 = to_union(ctx, obj1);
-	if (obj1.type == isl_obj_union_set && obj2.type == isl_obj_set)
-		obj2 = to_union(ctx, obj2);
-	if (obj1.type == isl_obj_map && obj2.type == isl_obj_union_map)
-		obj1 = to_union(ctx, obj1);
-	if (obj1.type == isl_obj_union_map && obj2.type == isl_obj_map)
-		obj2 = to_union(ctx, obj2);
-	if (obj1.type == isl_obj_pw_qpolynomial &&
-	    obj2.type == isl_obj_union_pw_qpolynomial)
-		obj1 = to_union(ctx, obj1);
-	if (obj1.type == isl_obj_union_pw_qpolynomial &&
-	    obj2.type == isl_obj_pw_qpolynomial)
-		obj2 = to_union(ctx, obj2);
-	if (obj1.type == isl_obj_pw_qpolynomial_fold &&
-	    obj2.type == isl_obj_union_pw_qpolynomial_fold)
-		obj1 = to_union(ctx, obj1);
-	if (obj1.type == isl_obj_union_pw_qpolynomial_fold &&
-	    obj2.type == isl_obj_pw_qpolynomial_fold)
-		obj2 = to_union(ctx, obj2);
-	isl_assert(ctx, obj1.type == obj2.type, goto error);
-	if (obj1.type == isl_obj_map && !isl_map_has_equal_space(obj1.v, obj2.v)) {
-		obj1 = to_union(ctx, obj1);
-		obj2 = to_union(ctx, obj2);
-	}
-	if (obj1.type == isl_obj_set && !isl_set_has_equal_space(obj1.v, obj2.v)) {
-		obj1 = to_union(ctx, obj1);
-		obj2 = to_union(ctx, obj2);
-	}
-	if (obj1.type == isl_obj_pw_qpolynomial &&
-	    !isl_pw_qpolynomial_has_equal_space(obj1.v, obj2.v)) {
-		obj1 = to_union(ctx, obj1);
-		obj2 = to_union(ctx, obj2);
-	}
-	if (obj1.type == isl_obj_pw_qpolynomial_fold &&
-	    !isl_pw_qpolynomial_fold_has_equal_space(obj1.v, obj2.v)) {
-		obj1 = to_union(ctx, obj1);
-		obj2 = to_union(ctx, obj2);
-	}
-	obj1.v = obj1.type->add(obj1.v, obj2.v);
-	return obj1;
-error:
-	obj1.type->free(obj1.v);
-	obj2.type->free(obj2.v);
-	obj1.type = isl_obj_none;
-	obj1.v = NULL;
-	return obj1;
-}
-
-static struct isl_obj obj_read(struct isl_stream *s)
-{
-	isl_map *map = NULL;
-	struct isl_token *tok;
-	struct vars *v = NULL;
-	struct isl_obj obj = { isl_obj_set, NULL };
-
-	tok = next_token(s);
-	if (!tok) {
-		isl_stream_error(s, NULL, "unexpected EOF");
-		goto error;
-	}
-	if (tok->type == ISL_TOKEN_VALUE) {
-		struct isl_token *tok2;
-		struct isl_map *map;
-
-		tok2 = isl_stream_next_token(s);
-		if (!tok2 || tok2->type != ISL_TOKEN_VALUE ||
-		    isl_int_is_neg(tok2->u.v)) {
-			if (tok2)
-				isl_stream_push_token(s, tok2);
-			obj.type = isl_obj_int;
-			obj.v = isl_int_obj_alloc(s->ctx, tok->u.v);
-			isl_token_free(tok);
-			return obj;
-		}
-		isl_stream_push_token(s, tok2);
-		isl_stream_push_token(s, tok);
-		map = map_read_polylib(s);
-		if (!map)
-			goto error;
-		if (isl_map_may_be_set(map))
-			obj.v = isl_map_range(map);
-		else {
-			obj.type = isl_obj_map;
-			obj.v = map;
-		}
-		return obj;
-	}
-	v = vars_new(s->ctx);
-	if (!v) {
-		isl_stream_push_token(s, tok);
-		goto error;
-	}
-	map = isl_map_universe(isl_space_params_alloc(s->ctx, 0));
-	if (tok->type == '[') {
-		isl_stream_push_token(s, tok);
-		map = read_tuple(s, map, isl_dim_param, v);
-		if (!map)
-			goto error;
-		tok = isl_stream_next_token(s);
-		if (!tok || tok->type != ISL_TOKEN_TO) {
-			isl_stream_error(s, tok, "expecting '->'");
-			if (tok)
-				isl_stream_push_token(s, tok);
-			goto error;
-		}
-		isl_token_free(tok);
-		tok = isl_stream_next_token(s);
-	}
-	if (!tok || tok->type != '{') {
-		isl_stream_error(s, tok, "expecting '{'");
-		if (tok)
-			isl_stream_push_token(s, tok);
-		goto error;
-	}
-	isl_token_free(tok);
-
-	tok = isl_stream_next_token(s);
-	if (!tok)
-		;
-	else if (tok->type == ISL_TOKEN_IDENT && !strcmp(tok->u.s, "Sym")) {
-		isl_token_free(tok);
-		if (isl_stream_eat(s, '='))
-			goto error;
-		map = read_tuple(s, map, isl_dim_param, v);
-		if (!map)
-			goto error;
-	} else if (tok->type == '}') {
-		obj.type = isl_obj_union_set;
-		obj.v = isl_union_set_empty(isl_map_get_space(map));
-		isl_token_free(tok);
-		goto done;
-	} else
-		isl_stream_push_token(s, tok);
-
-	for (;;) {
-		struct isl_obj o;
-		tok = NULL;
-		o = obj_read_body(s, isl_map_copy(map), v);
-		if (o.type == isl_obj_none || !o.v)
-			goto error;
-		if (!obj.v)
-			obj = o;
-		else {
-			obj = obj_add(s->ctx, obj, o);
-			if (obj.type == isl_obj_none || !obj.v)
-				goto error;
-		}
-		tok = isl_stream_next_token(s);
-		if (!tok || tok->type != ';')
-			break;
-		isl_token_free(tok);
-		if (isl_stream_next_token_is(s, '}')) {
-			tok = isl_stream_next_token(s);
-			break;
-		}
-	}
-
-	if (tok && tok->type == '}') {
-		isl_token_free(tok);
-	} else {
-		isl_stream_error(s, tok, "unexpected isl_token");
-		if (tok)
-			isl_token_free(tok);
-		goto error;
-	}
-done:
-	vars_free(v);
-	isl_map_free(map);
-
-	return obj;
-error:
-	isl_map_free(map);
-	obj.type->free(obj.v);
-	if (v)
-		vars_free(v);
-	obj.v = NULL;
-	return obj;
-}
-
-struct isl_obj isl_stream_read_obj(struct isl_stream *s)
-{
-	return obj_read(s);
-}
-
-__isl_give isl_map *isl_stream_read_map(struct isl_stream *s)
-{
-	struct isl_obj obj;
-
-	obj = obj_read(s);
-	if (obj.v)
-		isl_assert(s->ctx, obj.type == isl_obj_map ||
-				   obj.type == isl_obj_set, goto error);
-
-	return obj.v;
-error:
-	obj.type->free(obj.v);
-	return NULL;
-}
-
-__isl_give isl_set *isl_stream_read_set(struct isl_stream *s)
-{
-	struct isl_obj obj;
-
-	obj = obj_read(s);
-	if (obj.v) {
-		if (obj.type == isl_obj_map && isl_map_may_be_set(obj.v)) {
-			obj.v = isl_map_range(obj.v);
-			obj.type = isl_obj_set;
-		}
-		isl_assert(s->ctx, obj.type == isl_obj_set, goto error);
-	}
-
-	return obj.v;
-error:
-	obj.type->free(obj.v);
-	return NULL;
-}
-
-__isl_give isl_union_map *isl_stream_read_union_map(struct isl_stream *s)
-{
-	struct isl_obj obj;
-
-	obj = obj_read(s);
-	if (obj.type == isl_obj_map) {
-		obj.type = isl_obj_union_map;
-		obj.v = isl_union_map_from_map(obj.v);
-	}
-	if (obj.type == isl_obj_set) {
-		obj.type = isl_obj_union_set;
-		obj.v = isl_union_set_from_set(obj.v);
-	}
-	if (obj.v)
-		isl_assert(s->ctx, obj.type == isl_obj_union_map ||
-				   obj.type == isl_obj_union_set, goto error);
-
-	return obj.v;
-error:
-	obj.type->free(obj.v);
-	return NULL;
-}
-
-__isl_give isl_union_set *isl_stream_read_union_set(struct isl_stream *s)
-{
-	struct isl_obj obj;
-
-	obj = obj_read(s);
-	if (obj.type == isl_obj_set) {
-		obj.type = isl_obj_union_set;
-		obj.v = isl_union_set_from_set(obj.v);
-	}
-	if (obj.v)
-		isl_assert(s->ctx, obj.type == isl_obj_union_set, goto error);
-
-	return obj.v;
-error:
-	obj.type->free(obj.v);
-	return NULL;
-}
-
-static __isl_give isl_basic_map *basic_map_read(struct isl_stream *s)
-{
-	struct isl_obj obj;
-	struct isl_map *map;
-	struct isl_basic_map *bmap;
-
-	obj = obj_read(s);
-	map = obj.v;
-	if (!map)
-		return NULL;
-
-	isl_assert(map->ctx, map->n <= 1, goto error);
-
-	if (map->n == 0)
-		bmap = isl_basic_map_empty_like_map(map);
-	else
-		bmap = isl_basic_map_copy(map->p[0]);
-
-	isl_map_free(map);
-
-	return bmap;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-static __isl_give isl_basic_set *basic_set_read(struct isl_stream *s)
-{
-	isl_basic_map *bmap;
-	bmap = basic_map_read(s);
-	if (!bmap)
-		return NULL;
-	if (!isl_basic_map_may_be_set(bmap))
-		isl_die(s->ctx, isl_error_invalid,
-			"input is not a set", goto error);
-	return isl_basic_map_range(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_read_from_file(isl_ctx *ctx,
-	FILE *input)
-{
-	struct isl_basic_map *bmap;
-	struct isl_stream *s = isl_stream_new_file(ctx, input);
-	if (!s)
-		return NULL;
-	bmap = basic_map_read(s);
-	isl_stream_free(s);
-	return bmap;
-}
-
-__isl_give isl_basic_set *isl_basic_set_read_from_file(isl_ctx *ctx,
-	FILE *input)
-{
-	isl_basic_set *bset;
-	struct isl_stream *s = isl_stream_new_file(ctx, input);
-	if (!s)
-		return NULL;
-	bset = basic_set_read(s);
-	isl_stream_free(s);
-	return bset;
-}
-
-struct isl_basic_map *isl_basic_map_read_from_str(struct isl_ctx *ctx,
-	const char *str)
-{
-	struct isl_basic_map *bmap;
-	struct isl_stream *s = isl_stream_new_str(ctx, str);
-	if (!s)
-		return NULL;
-	bmap = basic_map_read(s);
-	isl_stream_free(s);
-	return bmap;
-}
-
-struct isl_basic_set *isl_basic_set_read_from_str(struct isl_ctx *ctx,
-	const char *str)
-{
-	isl_basic_set *bset;
-	struct isl_stream *s = isl_stream_new_str(ctx, str);
-	if (!s)
-		return NULL;
-	bset = basic_set_read(s);
-	isl_stream_free(s);
-	return bset;
-}
-
-__isl_give isl_map *isl_map_read_from_file(struct isl_ctx *ctx,
-	FILE *input)
-{
-	struct isl_map *map;
-	struct isl_stream *s = isl_stream_new_file(ctx, input);
-	if (!s)
-		return NULL;
-	map = isl_stream_read_map(s);
-	isl_stream_free(s);
-	return map;
-}
-
-__isl_give isl_map *isl_map_read_from_str(struct isl_ctx *ctx,
-	const char *str)
-{
-	struct isl_map *map;
-	struct isl_stream *s = isl_stream_new_str(ctx, str);
-	if (!s)
-		return NULL;
-	map = isl_stream_read_map(s);
-	isl_stream_free(s);
-	return map;
-}
-
-__isl_give isl_set *isl_set_read_from_file(struct isl_ctx *ctx,
-	FILE *input)
-{
-	isl_set *set;
-	struct isl_stream *s = isl_stream_new_file(ctx, input);
-	if (!s)
-		return NULL;
-	set = isl_stream_read_set(s);
-	isl_stream_free(s);
-	return set;
-}
-
-struct isl_set *isl_set_read_from_str(struct isl_ctx *ctx,
-	const char *str)
-{
-	isl_set *set;
-	struct isl_stream *s = isl_stream_new_str(ctx, str);
-	if (!s)
-		return NULL;
-	set = isl_stream_read_set(s);
-	isl_stream_free(s);
-	return set;
-}
-
-__isl_give isl_union_map *isl_union_map_read_from_file(isl_ctx *ctx,
-	FILE *input)
-{
-	isl_union_map *umap;
-	struct isl_stream *s = isl_stream_new_file(ctx, input);
-	if (!s)
-		return NULL;
-	umap = isl_stream_read_union_map(s);
-	isl_stream_free(s);
-	return umap;
-}
-
-__isl_give isl_union_map *isl_union_map_read_from_str(struct isl_ctx *ctx,
-		const char *str)
-{
-	isl_union_map *umap;
-	struct isl_stream *s = isl_stream_new_str(ctx, str);
-	if (!s)
-		return NULL;
-	umap = isl_stream_read_union_map(s);
-	isl_stream_free(s);
-	return umap;
-}
-
-__isl_give isl_union_set *isl_union_set_read_from_file(isl_ctx *ctx,
-	FILE *input)
-{
-	isl_union_set *uset;
-	struct isl_stream *s = isl_stream_new_file(ctx, input);
-	if (!s)
-		return NULL;
-	uset = isl_stream_read_union_set(s);
-	isl_stream_free(s);
-	return uset;
-}
-
-__isl_give isl_union_set *isl_union_set_read_from_str(struct isl_ctx *ctx,
-		const char *str)
-{
-	isl_union_set *uset;
-	struct isl_stream *s = isl_stream_new_str(ctx, str);
-	if (!s)
-		return NULL;
-	uset = isl_stream_read_union_set(s);
-	isl_stream_free(s);
-	return uset;
-}
-
-static __isl_give isl_vec *isl_vec_read_polylib(struct isl_stream *s)
-{
-	struct isl_vec *vec = NULL;
-	struct isl_token *tok;
-	unsigned size;
-	int j;
-
-	tok = isl_stream_next_token(s);
-	if (!tok || tok->type != ISL_TOKEN_VALUE) {
-		isl_stream_error(s, tok, "expecting vector length");
-		goto error;
-	}
-
-	size = isl_int_get_si(tok->u.v);
-	isl_token_free(tok);
-
-	vec = isl_vec_alloc(s->ctx, size);
-
-	for (j = 0; j < size; ++j) {
-		tok = isl_stream_next_token(s);
-		if (!tok || tok->type != ISL_TOKEN_VALUE) {
-			isl_stream_error(s, tok, "expecting constant value");
-			goto error;
-		}
-		isl_int_set(vec->el[j], tok->u.v);
-		isl_token_free(tok);
-	}
-
-	return vec;
-error:
-	isl_token_free(tok);
-	isl_vec_free(vec);
-	return NULL;
-}
-
-static __isl_give isl_vec *vec_read(struct isl_stream *s)
-{
-	return isl_vec_read_polylib(s);
-}
-
-__isl_give isl_vec *isl_vec_read_from_file(isl_ctx *ctx, FILE *input)
-{
-	isl_vec *v;
-	struct isl_stream *s = isl_stream_new_file(ctx, input);
-	if (!s)
-		return NULL;
-	v = vec_read(s);
-	isl_stream_free(s);
-	return v;
-}
-
-__isl_give isl_pw_qpolynomial *isl_stream_read_pw_qpolynomial(
-	struct isl_stream *s)
-{
-	struct isl_obj obj;
-
-	obj = obj_read(s);
-	if (obj.v)
-		isl_assert(s->ctx, obj.type == isl_obj_pw_qpolynomial,
-			   goto error);
-
-	return obj.v;
-error:
-	obj.type->free(obj.v);
-	return NULL;
-}
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_read_from_str(isl_ctx *ctx,
-		const char *str)
-{
-	isl_pw_qpolynomial *pwqp;
-	struct isl_stream *s = isl_stream_new_str(ctx, str);
-	if (!s)
-		return NULL;
-	pwqp = isl_stream_read_pw_qpolynomial(s);
-	isl_stream_free(s);
-	return pwqp;
-}
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_read_from_file(isl_ctx *ctx,
-		FILE *input)
-{
-	isl_pw_qpolynomial *pwqp;
-	struct isl_stream *s = isl_stream_new_file(ctx, input);
-	if (!s)
-		return NULL;
-	pwqp = isl_stream_read_pw_qpolynomial(s);
-	isl_stream_free(s);
-	return pwqp;
-}
-
-/* Read an affine expression from "s" with domain (space) "dom".
- * We call accept_affine to parse a possibly piecewise affine expression
- * and then check that the result is a single affine expression on
- * a universe domain.
- */
-static __isl_give isl_aff *read_aff_with_dom(struct isl_stream *s,
-	__isl_take isl_set *dom, struct vars *v)
-{
-	isl_aff *aff = NULL;
-	isl_pw_aff *pwaff = NULL;
-
-	if (!isl_set_plain_is_universe(dom))
-		isl_die(s->ctx, isl_error_invalid,
-			"expecting universe domain", goto error);
-
-	if (!isl_set_is_params(dom) && isl_stream_eat(s, ISL_TOKEN_TO))
-		goto error;
-
-	if (isl_stream_eat(s, '['))
-		goto error;
-
-	pwaff = accept_affine(s, isl_set_get_space(dom), v);
-
-	if (isl_stream_eat(s, ']'))
-		goto error;
-	if (isl_stream_eat(s, '}'))
-		goto error;
-
-	if (!pwaff)
-		goto error;
-
-	if (pwaff->n != 1)
-		isl_die(s->ctx, isl_error_invalid,
-			"expecting single affine expression", goto error);
-	if (!isl_set_plain_is_universe(pwaff->p[0].set))
-		isl_die(s->ctx, isl_error_invalid,
-			"expecting universe domain", goto error);
-
-	aff = isl_aff_copy(pwaff->p[0].aff);
-
-	vars_free(v);
-	isl_pw_aff_free(pwaff);
-	isl_set_free(dom);
-	return aff;
-error:
-	vars_free(v);
-	isl_pw_aff_free(pwaff);
-	isl_set_free(dom);
-	return NULL;
-}
-
-/* Is the next token an identifer not in "v"?
- */
-static int next_is_fresh_ident(struct isl_stream *s, struct vars *v)
-{
-	int n = v->n;
-	int fresh;
-	struct isl_token *tok;
-
-	tok = isl_stream_next_token(s);
-	if (!tok)
-		return 0;
-	fresh = tok->type == ISL_TOKEN_IDENT && vars_pos(v, tok->u.s, -1) >= n;
-	isl_stream_push_token(s, tok);
-
-	vars_drop(v, v->n - n);
-
-	return fresh;
-}
-
-/* First read the domain of the affine expression, which may be
- * a parameter space or a set.
- * The tricky part is that we don't know if the domain is a set or not,
- * so when we are trying to read the domain, we may actually be reading
- * the affine expression itself (defined on a parameter domains)
- * If the tuple we are reading is named, we assume it's the domain.
- * Also, if inside the tuple, the first thing we find is a nested tuple
- * or a new identifier, we again assume it's the domain.
- * Otherwise, we assume we are reading an affine expression.
- */
-static __isl_give isl_set *read_aff_domain(struct isl_stream *s,
-	__isl_take isl_set *dom, struct vars *v)
-{
-	struct isl_token *tok;
-
-	tok = isl_stream_next_token(s);
-	if (tok && (tok->type == ISL_TOKEN_IDENT || tok->is_keyword)) {
-		isl_stream_push_token(s, tok);
-		return read_tuple(s, dom, isl_dim_set, v);
-	}
-	if (!tok || tok->type != '[') {
-		isl_stream_error(s, tok, "expecting '['");
-		goto error;
-	}
-	if (next_is_tuple(s) || next_is_fresh_ident(s, v)) {
-		isl_stream_push_token(s, tok);
-		dom = read_tuple(s, dom, isl_dim_set, v);
-	} else
-		isl_stream_push_token(s, tok);
-
-	return dom;
-error:
-	if (tok)
-		isl_stream_push_token(s, tok);
-	vars_free(v);
-	isl_set_free(dom);
-	return NULL;
-}
-
-/* Read an affine expression from "s".
- * We first read the domain of the affine expression, which may be
- * a parameter space or a set, and then call read_aff_with_dom.
- */
-__isl_give isl_aff *isl_stream_read_aff(struct isl_stream *s)
-{
-	struct vars *v;
-	isl_set *dom = NULL;
-
-	v = vars_new(s->ctx);
-	if (!v)
-		return NULL;
-
-	dom = isl_set_universe(isl_space_params_alloc(s->ctx, 0));
-	if (next_is_tuple(s)) {
-		dom = read_tuple(s, dom, isl_dim_param, v);
-		if (isl_stream_eat(s, ISL_TOKEN_TO))
-			goto error;
-	}
-	if (isl_stream_eat(s, '{'))
-		goto error;
-
-	dom = read_aff_domain(s, dom, v);
-	return read_aff_with_dom(s, dom, v);
-error:
-	vars_free(v);
-	isl_set_free(dom);
-	return NULL;
-}
-
-/* Read a piecewise affine expression from "s" with domain (space) "dom".
- */
-static __isl_give isl_pw_aff *read_pw_aff_with_dom(struct isl_stream *s,
-	__isl_take isl_set *dom, struct vars *v)
-{
-	isl_pw_aff *pwaff = NULL;
-
-	if (!isl_set_is_params(dom) && isl_stream_eat(s, ISL_TOKEN_TO))
-		goto error;
-
-	if (isl_stream_eat(s, '['))
-		goto error;
-
-	pwaff = accept_affine(s, isl_set_get_space(dom), v);
-
-	if (isl_stream_eat(s, ']'))
-		goto error;
-
-	dom = read_optional_disjuncts(s, dom, v);
-	pwaff = isl_pw_aff_intersect_domain(pwaff, dom);
-
-	return pwaff;
-error:
-	isl_set_free(dom);
-	isl_pw_aff_free(pwaff);
-	return NULL;
-}
-
-__isl_give isl_pw_aff *isl_stream_read_pw_aff(struct isl_stream *s)
-{
-	struct vars *v;
-	isl_set *dom = NULL;
-	isl_set *aff_dom;
-	isl_pw_aff *pa = NULL;
-	int n;
-
-	v = vars_new(s->ctx);
-	if (!v)
-		return NULL;
-
-	dom = isl_set_universe(isl_space_params_alloc(s->ctx, 0));
-	if (next_is_tuple(s)) {
-		dom = read_tuple(s, dom, isl_dim_param, v);
-		if (isl_stream_eat(s, ISL_TOKEN_TO))
-			goto error;
-	}
-	if (isl_stream_eat(s, '{'))
-		goto error;
-
-	n = v->n;
-	aff_dom = read_aff_domain(s, isl_set_copy(dom), v);
-	pa = read_pw_aff_with_dom(s, aff_dom, v);
-	vars_drop(v, v->n - n);
-
-	while (isl_stream_eat_if_available(s, ';')) {
-		isl_pw_aff *pa_i;
-
-		n = v->n;
-		aff_dom = read_aff_domain(s, isl_set_copy(dom), v);
-		pa_i = read_pw_aff_with_dom(s, aff_dom, v);
-		vars_drop(v, v->n - n);
-
-		pa = isl_pw_aff_add(pa, pa_i);
-	}
-
-	if (isl_stream_eat(s, '}'))
-		goto error;
-
-	vars_free(v);
-	isl_set_free(dom);
-	return pa;
-error:
-	vars_free(v);
-	isl_set_free(dom);
-	isl_pw_aff_free(pa);
-	return NULL;
-}
-
-__isl_give isl_aff *isl_aff_read_from_str(isl_ctx *ctx, const char *str)
-{
-	isl_aff *aff;
-	struct isl_stream *s = isl_stream_new_str(ctx, str);
-	if (!s)
-		return NULL;
-	aff = isl_stream_read_aff(s);
-	isl_stream_free(s);
-	return aff;
-}
-
-__isl_give isl_pw_aff *isl_pw_aff_read_from_str(isl_ctx *ctx, const char *str)
-{
-	isl_pw_aff *pa;
-	struct isl_stream *s = isl_stream_new_str(ctx, str);
-	if (!s)
-		return NULL;
-	pa = isl_stream_read_pw_aff(s);
-	isl_stream_free(s);
-	return pa;
-}
-
-/* Read an isl_pw_multi_aff from "s".
- * We currently read a generic object and if it turns out to be a set or
- * a map, we convert that to an isl_pw_multi_aff.
- * It would be more efficient if we were to construct the isl_pw_multi_aff
- * directly.
- */
-__isl_give isl_pw_multi_aff *isl_stream_read_pw_multi_aff(struct isl_stream *s)
-{
-	struct isl_obj obj;
-
-	obj = obj_read(s);
-	if (!obj.v)
-		return NULL;
-
-	if (obj.type == isl_obj_map)
-		return isl_pw_multi_aff_from_map(obj.v);
-	if (obj.type == isl_obj_set)
-		return isl_pw_multi_aff_from_set(obj.v);
-
-	obj.type->free(obj.v);
-	isl_die(s->ctx, isl_error_invalid, "unexpected object type",
-		return NULL);
-}
-
-__isl_give isl_pw_multi_aff *isl_pw_multi_aff_read_from_str(isl_ctx *ctx,
-	const char *str)
-{
-	isl_pw_multi_aff *pma;
-	struct isl_stream *s = isl_stream_new_str(ctx, str);
-	if (!s)
-		return NULL;
-	pma = isl_stream_read_pw_multi_aff(s);
-	isl_stream_free(s);
-	return pma;
-}
-
-/* Read a multi-affine expression from "s".
- * We call isl_stream_read_pw_multi_aff to parse a possibly piecewise
- * multi-affine expression and then check that the result is
- * a single multi-affine expression on a universe domain.
- */
-__isl_give isl_multi_aff *isl_stream_read_multi_aff(struct isl_stream *s)
-{
-	isl_pw_multi_aff *pma;
-	isl_multi_aff *maff;
-
-	pma = isl_stream_read_pw_multi_aff(s);
-	if (!pma)
-		return NULL;
-	if (pma->n != 1)
-		isl_die(s->ctx, isl_error_invalid,
-			"expecting single list of affine expressions",
-			return isl_pw_multi_aff_free(pma));
-	if (!isl_set_plain_is_universe(pma->p[0].set))
-		isl_die(s->ctx, isl_error_invalid, "expecting universe domain",
-			return isl_pw_multi_aff_free(pma));
-	maff = isl_multi_aff_copy(pma->p[0].maff);
-	isl_pw_multi_aff_free(pma);
-	return maff;
-}
-
-__isl_give isl_multi_aff *isl_multi_aff_read_from_str(isl_ctx *ctx,
-	const char *str)
-{
-	isl_multi_aff *maff;
-	struct isl_stream *s = isl_stream_new_str(ctx, str);
-	if (!s)
-		return NULL;
-	maff = isl_stream_read_multi_aff(s);
-	isl_stream_free(s);
-	return maff;
-}
-
-__isl_give isl_union_pw_qpolynomial *isl_stream_read_union_pw_qpolynomial(
-	struct isl_stream *s)
-{
-	struct isl_obj obj;
-
-	obj = obj_read(s);
-	if (obj.type == isl_obj_pw_qpolynomial) {
-		obj.type = isl_obj_union_pw_qpolynomial;
-		obj.v = isl_union_pw_qpolynomial_from_pw_qpolynomial(obj.v);
-	}
-	if (obj.v)
-		isl_assert(s->ctx, obj.type == isl_obj_union_pw_qpolynomial,
-			   goto error);
-
-	return obj.v;
-error:
-	obj.type->free(obj.v);
-	return NULL;
-}
-
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_read_from_str(
-	isl_ctx *ctx, const char *str)
-{
-	isl_union_pw_qpolynomial *upwqp;
-	struct isl_stream *s = isl_stream_new_str(ctx, str);
-	if (!s)
-		return NULL;
-	upwqp = isl_stream_read_union_pw_qpolynomial(s);
-	isl_stream_free(s);
-	return upwqp;
-}
diff --git a/cloog-0.17.0/isl/isl_list.c b/cloog-0.17.0/isl/isl_list.c
deleted file mode 100644
index 27baab1..0000000
--- a/cloog-0.17.0/isl/isl_list.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_list_private.h>
-#include <isl/set.h>
-#include <isl/aff.h>
-#include <isl/band.h>
-
-#undef BASE
-#define BASE basic_set
-
-#include <isl_list_templ.c>
-
-#undef BASE
-#define BASE set
-
-#include <isl_list_templ.c>
-
-#undef BASE
-#define BASE aff
-
-#include <isl_list_templ.c>
-
-#undef BASE
-#define BASE pw_aff
-
-#include <isl_list_templ.c>
-
-#undef BASE
-#define BASE band
-
-#include <isl_list_templ.c>
diff --git a/cloog-0.17.0/isl/isl_list_private.h b/cloog-0.17.0/isl/isl_list_private.h
deleted file mode 100644
index da57f41..0000000
--- a/cloog-0.17.0/isl/isl_list_private.h
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef ISL_LIST_PRIVATE_H
-#define ISL_LIST_PRIVATE_H
-
-#include <isl/list.h>
-
-#undef EL
-#define EL isl_basic_set
-
-#include <isl_list_templ.h>
-
-#undef EL
-#define EL isl_set
-
-#include <isl_list_templ.h>
-
-#undef EL
-#define EL isl_aff
-
-#include <isl_list_templ.h>
-
-#undef EL
-#define EL isl_pw_aff
-
-#include <isl_list_templ.h>
-
-#undef EL
-#define EL isl_band
-
-#include <isl_list_templ.h>
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_list_templ.c b/cloog-0.17.0/isl/isl_list_templ.c
deleted file mode 100644
index 9aa4351..0000000
--- a/cloog-0.17.0/isl/isl_list_templ.c
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2011      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France
- */
-
-#define xCAT(A,B) A ## B
-#define CAT(A,B) xCAT(A,B)
-#undef EL
-#define EL CAT(isl_,BASE)
-#define xFN(TYPE,NAME) TYPE ## _ ## NAME
-#define FN(TYPE,NAME) xFN(TYPE,NAME)
-#define xLIST(EL) EL ## _list
-#define LIST(EL) xLIST(EL)
-
-isl_ctx *FN(LIST(EL),get_ctx)(__isl_keep LIST(EL) *list)
-{
-	return list ? list->ctx : NULL;
-}
-
-__isl_give LIST(EL) *FN(LIST(EL),alloc)(isl_ctx *ctx, int n)
-{
-	LIST(EL) *list;
-
-	if (n < 0)
-		isl_die(ctx, isl_error_invalid,
-			"cannot create list of negative length",
-			return NULL);
-	list = isl_alloc(ctx, LIST(EL),
-			 sizeof(LIST(EL)) + (n - 1) * sizeof(struct EL *));
-	if (!list)
-		return NULL;
-
-	list->ctx = ctx;
-	isl_ctx_ref(ctx);
-	list->ref = 1;
-	list->size = n;
-	list->n = 0;
-	return list;
-}
-
-__isl_give LIST(EL) *FN(LIST(EL),copy)(__isl_keep LIST(EL) *list)
-{
-	if (!list)
-		return NULL;
-
-	list->ref++;
-	return list;
-}
-
-__isl_give LIST(EL) *FN(LIST(EL),dup)(__isl_keep LIST(EL) *list)
-{
-	int i;
-	LIST(EL) *dup;
-
-	if (!list)
-		return NULL;
-
-	dup = FN(LIST(EL),alloc)(FN(LIST(EL),get_ctx)(list), list->n);
-	if (!dup)
-		return NULL;
-	for (i = 0; i < list->n; ++i)
-		dup = FN(LIST(EL),add)(dup, FN(EL,copy)(list->p[i]));
-	return dup;
-}
-
-__isl_give LIST(EL) *FN(LIST(EL),add)(__isl_take LIST(EL) *list,
-	__isl_take struct EL *el)
-{
-	if (!list || !el)
-		goto error;
-	isl_assert(list->ctx, list->n < list->size, goto error);
-	list->p[list->n] = el;
-	list->n++;
-	return list;
-error:
-	FN(EL,free)(el);
-	FN(LIST(EL),free)(list);
-	return NULL;
-}
-
-void *FN(LIST(EL),free)(__isl_take LIST(EL) *list)
-{
-	int i;
-
-	if (!list)
-		return NULL;
-
-	if (--list->ref > 0)
-		return NULL;
-
-	isl_ctx_deref(list->ctx);
-	for (i = 0; i < list->n; ++i)
-		FN(EL,free)(list->p[i]);
-	free(list);
-
-	return NULL;
-}
-
-int FN(FN(LIST(EL),n),BASE)(__isl_keep LIST(EL) *list)
-{
-	return list ? list->n : 0;
-}
-
-__isl_give EL *FN(FN(LIST(EL),get),BASE)(__isl_keep LIST(EL) *list, int index)
-{
-	if (!list)
-		return NULL;
-	if (index < 0 || index >= list->n)
-		isl_die(list->ctx, isl_error_invalid,
-			"index out of bounds", return NULL);
-	return FN(EL,copy)(list->p[index]);
-}
-
-int FN(LIST(EL),foreach)(__isl_keep LIST(EL) *list,
-	int (*fn)(__isl_take EL *el, void *user), void *user)
-{
-	int i;
-
-	if (!list)
-		return -1;
-
-	for (i = 0; i < list->n; ++i) {
-		EL *el = FN(EL,copy(list->p[i]));
-		if (!el)
-			return -1;
-		if (fn(el, user) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-__isl_give LIST(EL) *FN(FN(LIST(EL),from),BASE)(__isl_take EL *el)
-{
-	isl_ctx *ctx;
-	LIST(EL) *list;
-
-	if (!el)
-		return NULL;
-	ctx = FN(EL,get_ctx)(el);
-	list = FN(LIST(EL),alloc)(ctx, 1);
-	if (!list)
-		goto error;
-	list = FN(LIST(EL),add)(list, el);
-	return list;
-error:
-	FN(EL,free)(el);
-	return NULL;
-}
-
-__isl_give LIST(EL) *FN(LIST(EL),concat)(__isl_take LIST(EL) *list1,
-	__isl_take LIST(EL) *list2)
-{
-	int i;
-	isl_ctx *ctx;
-	LIST(EL) *res;
-
-	if (!list1 || !list2)
-		goto error;
-
-	ctx = FN(LIST(EL),get_ctx)(list1);
-	res = FN(LIST(EL),alloc)(ctx, list1->n + list2->n);
-	for (i = 0; i < list1->n; ++i)
-		res = FN(LIST(EL),add)(res, FN(EL,copy)(list1->p[i]));
-	for (i = 0; i < list2->n; ++i)
-		res = FN(LIST(EL),add)(res, FN(EL,copy)(list2->p[i]));
-
-	FN(LIST(EL),free)(list1);
-	FN(LIST(EL),free)(list2);
-	return res;
-error:
-	FN(LIST(EL),free)(list1);
-	FN(LIST(EL),free)(list2);
-	return NULL;
-}
-
-__isl_give isl_printer *CAT(isl_printer_print_,LIST(BASE))(
-	__isl_take isl_printer *p, __isl_keep LIST(EL) *list)
-{
-	int i;
-
-	if (!p || !list)
-		goto error;
-	p = isl_printer_print_str(p, "(");
-	for (i = 0; i < list->n; ++i) {
-		if (i)
-			p = isl_printer_print_str(p, ",");
-		p = CAT(isl_printer_print_,BASE)(p, list->p[i]);
-	}
-	p = isl_printer_print_str(p, ")");
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void FN(LIST(EL),dump)(__isl_keep LIST(EL) *list)
-{
-	isl_printer *printer;
-
-	if (!list)
-		return;
-
-	printer = isl_printer_to_file(FN(LIST(EL),get_ctx)(list), stderr);
-	printer = CAT(isl_printer_print_,LIST(BASE))(printer, list);
-	printer = isl_printer_end_line(printer);
-
-	isl_printer_free(printer);
-}
diff --git a/cloog-0.17.0/isl/isl_list_templ.h b/cloog-0.17.0/isl/isl_list_templ.h
deleted file mode 100644
index 9c60f5a..0000000
--- a/cloog-0.17.0/isl/isl_list_templ.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#define xFN(TYPE,NAME) TYPE ## _ ## NAME
-#define FN(TYPE,NAME) xFN(TYPE,NAME)
-#define xLIST(EL) EL ## _list
-#define LIST(EL) xLIST(EL)
-
-struct LIST(EL) {
-	int ref;
-	isl_ctx *ctx;
-
-	int n;
-
-	size_t size;
-	struct EL *p[1];
-};
-
-#define ISL_DECLARE_LIST_PRIVATE(EL)					\
-__isl_give isl_##EL##_list *isl_##EL##_list_dup(			\
-	__isl_keep isl_##EL##_list *list);
-
-ISL_DECLARE_LIST_PRIVATE(basic_set)
-ISL_DECLARE_LIST_PRIVATE(set)
-ISL_DECLARE_LIST_PRIVATE(aff)
-ISL_DECLARE_LIST_PRIVATE(pw_aff)
-ISL_DECLARE_LIST_PRIVATE(band)
diff --git a/cloog-0.17.0/isl/isl_local_space.c b/cloog-0.17.0/isl/isl_local_space.c
deleted file mode 100644
index a57fff1..0000000
--- a/cloog-0.17.0/isl/isl_local_space.c
+++ /dev/null
@@ -1,897 +0,0 @@
-/*
- * Copyright 2011      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl_local_space_private.h>
-#include <isl_space_private.h>
-#include <isl_mat_private.h>
-#include <isl_aff_private.h>
-#include <isl/seq.h>
-
-isl_ctx *isl_local_space_get_ctx(__isl_keep isl_local_space *ls)
-{
-	return ls ? ls->dim->ctx : NULL;
-}
-
-__isl_give isl_local_space *isl_local_space_alloc_div(__isl_take isl_space *dim,
-	__isl_take isl_mat *div)
-{
-	isl_ctx *ctx;
-	isl_local_space *ls = NULL;
-
-	if (!dim)
-		goto error;
-
-	ctx = isl_space_get_ctx(dim);
-	ls = isl_calloc_type(ctx, struct isl_local_space);
-	if (!ls)
-		goto error;
-
-	ls->ref = 1;
-	ls->dim = dim;
-	ls->div = div;
-
-	return ls;
-error:
-	isl_space_free(dim);
-	isl_local_space_free(ls);
-	return NULL;
-}
-
-__isl_give isl_local_space *isl_local_space_alloc(__isl_take isl_space *dim,
-	unsigned n_div)
-{
-	isl_ctx *ctx;
-	isl_mat *div;
-	unsigned total;
-
-	if (!dim)
-		return NULL;
-
-	total = isl_space_dim(dim, isl_dim_all);
-
-	ctx = isl_space_get_ctx(dim);
-	div = isl_mat_alloc(ctx, n_div, 1 + 1 + total + n_div);
-	return isl_local_space_alloc_div(dim, div);
-}
-
-__isl_give isl_local_space *isl_local_space_from_space(__isl_take isl_space *dim)
-{
-	return isl_local_space_alloc(dim, 0);
-}
-
-__isl_give isl_local_space *isl_local_space_copy(__isl_keep isl_local_space *ls)
-{
-	if (!ls)
-		return NULL;
-
-	ls->ref++;
-	return ls;
-}
-
-__isl_give isl_local_space *isl_local_space_dup(__isl_keep isl_local_space *ls)
-{
-	if (!ls)
-		return NULL;
-
-	return isl_local_space_alloc_div(isl_space_copy(ls->dim),
-					 isl_mat_copy(ls->div));
-
-}
-
-__isl_give isl_local_space *isl_local_space_cow(__isl_take isl_local_space *ls)
-{
-	if (!ls)
-		return NULL;
-
-	if (ls->ref == 1)
-		return ls;
-	ls->ref--;
-	return isl_local_space_dup(ls);
-}
-
-void *isl_local_space_free(__isl_take isl_local_space *ls)
-{
-	if (!ls)
-		return NULL;
-
-	if (--ls->ref > 0)
-		return NULL;
-
-	isl_space_free(ls->dim);
-	isl_mat_free(ls->div);
-
-	free(ls);
-
-	return NULL;
-}
-
-/* Is the local space that of a set?
- */
-int isl_local_space_is_set(__isl_keep isl_local_space *ls)
-{
-	return ls ? isl_space_is_set(ls->dim) : -1;
-}
-
-/* Return true if the two local spaces are identical, with identical
- * expressions for the integer divisions.
- */
-int isl_local_space_is_equal(__isl_keep isl_local_space *ls1,
-	__isl_keep isl_local_space *ls2)
-{
-	int equal;
-
-	if (!ls1 || !ls2)
-		return -1;
-
-	equal = isl_space_is_equal(ls1->dim, ls2->dim);
-	if (equal < 0 || !equal)
-		return equal;
-
-	if (!isl_local_space_divs_known(ls1))
-		return 0;
-	if (!isl_local_space_divs_known(ls2))
-		return 0;
-
-	return isl_mat_is_equal(ls1->div, ls2->div);
-}
-
-int isl_local_space_dim(__isl_keep isl_local_space *ls,
-	enum isl_dim_type type)
-{
-	if (!ls)
-		return 0;
-	if (type == isl_dim_div)
-		return ls->div->n_row;
-	if (type == isl_dim_all)
-		return isl_space_dim(ls->dim, isl_dim_all) + ls->div->n_row;
-	return isl_space_dim(ls->dim, type);
-}
-
-unsigned isl_local_space_offset(__isl_keep isl_local_space *ls,
-	enum isl_dim_type type)
-{
-	isl_space *dim;
-
-	if (!ls)
-		return 0;
-
-	dim = ls->dim;
-	switch (type) {
-	case isl_dim_cst:	return 0;
-	case isl_dim_param:	return 1;
-	case isl_dim_in:	return 1 + dim->nparam;
-	case isl_dim_out:	return 1 + dim->nparam + dim->n_in;
-	case isl_dim_div:	return 1 + dim->nparam + dim->n_in + dim->n_out;
-	default:		return 0;
-	}
-}
-
-const char *isl_local_space_get_dim_name(__isl_keep isl_local_space *ls,
-	enum isl_dim_type type, unsigned pos)
-{
-	return ls ? isl_space_get_dim_name(ls->dim, type, pos) : NULL;
-}
-
-__isl_give isl_aff *isl_local_space_get_div(__isl_keep isl_local_space *ls,
-	int pos)
-{
-	isl_aff *aff;
-
-	if (!ls)
-		return NULL;
-
-	if (pos < 0 || pos >= ls->div->n_row)
-		isl_die(isl_local_space_get_ctx(ls), isl_error_invalid,
-			"index out of bounds", return NULL);
-
-	if (isl_int_is_zero(ls->div->row[pos][0]))
-		isl_die(isl_local_space_get_ctx(ls), isl_error_invalid,
-			"expression of div unknown", return NULL);
-
-	aff = isl_aff_alloc(isl_local_space_copy(ls));
-	if (!aff)
-		return NULL;
-	isl_seq_cpy(aff->v->el, ls->div->row[pos], aff->v->size);
-	return aff;
-}
-
-__isl_give isl_space *isl_local_space_get_space(__isl_keep isl_local_space *ls)
-{
-	if (!ls)
-		return NULL;
-
-	return isl_space_copy(ls->dim);
-}
-
-__isl_give isl_local_space *isl_local_space_set_dim_name(
-	__isl_take isl_local_space *ls,
-	enum isl_dim_type type, unsigned pos, const char *s)
-{
-	ls = isl_local_space_cow(ls);
-	if (!ls)
-		return NULL;
-	ls->dim = isl_space_set_dim_name(ls->dim, type, pos, s);
-	if (!ls->dim)
-		return isl_local_space_free(ls);
-
-	return ls;
-}
-
-__isl_give isl_local_space *isl_local_space_set_dim_id(
-	__isl_take isl_local_space *ls,
-	enum isl_dim_type type, unsigned pos, __isl_take isl_id *id)
-{
-	ls = isl_local_space_cow(ls);
-	if (!ls)
-		return isl_id_free(id);
-	ls->dim = isl_space_set_dim_id(ls->dim, type, pos, id);
-	if (!ls->dim)
-		return isl_local_space_free(ls);
-
-	return ls;
-}
-
-__isl_give isl_local_space *isl_local_space_reset_space(
-	__isl_take isl_local_space *ls, __isl_take isl_space *dim)
-{
-	ls = isl_local_space_cow(ls);
-	if (!ls || !dim)
-		goto error;
-
-	isl_space_free(ls->dim);
-	ls->dim = dim;
-
-	return ls;
-error:
-	isl_local_space_free(ls);
-	isl_space_free(dim);
-	return NULL;
-}
-
-/* Reorder the columns of the given div definitions according to the
- * given reordering.
- * The order of the divs themselves is assumed not to change.
- */
-static __isl_give isl_mat *reorder_divs(__isl_take isl_mat *div,
-	__isl_take isl_reordering *r)
-{
-	int i, j;
-	isl_mat *mat;
-	int extra;
-
-	if (!div || !r)
-		goto error;
-
-	extra = isl_space_dim(r->dim, isl_dim_all) + div->n_row - r->len;
-	mat = isl_mat_alloc(div->ctx, div->n_row, div->n_col + extra);
-	if (!mat)
-		goto error;
-
-	for (i = 0; i < div->n_row; ++i) {
-		isl_seq_cpy(mat->row[i], div->row[i], 2);
-		isl_seq_clr(mat->row[i] + 2, mat->n_col - 2);
-		for (j = 0; j < r->len; ++j)
-			isl_int_set(mat->row[i][2 + r->pos[j]],
-				    div->row[i][2 + j]);
-	}
-
-	isl_reordering_free(r);
-	isl_mat_free(div);
-	return mat;
-error:
-	isl_reordering_free(r);
-	isl_mat_free(div);
-	return NULL;
-}
-
-/* Reorder the dimensions of "ls" according to the given reordering.
- * The reordering r is assumed to have been extended with the local
- * variables, leaving them in the same order.
- */
-__isl_give isl_local_space *isl_local_space_realign(
-	__isl_take isl_local_space *ls, __isl_take isl_reordering *r)
-{
-	ls = isl_local_space_cow(ls);
-	if (!ls || !r)
-		goto error;
-
-	ls->div = reorder_divs(ls->div, isl_reordering_copy(r));
-	if (!ls->div)
-		goto error;
-
-	ls = isl_local_space_reset_space(ls, isl_space_copy(r->dim));
-
-	isl_reordering_free(r);
-	return ls;
-error:
-	isl_local_space_free(ls);
-	isl_reordering_free(r);
-	return NULL;
-}
-
-__isl_give isl_local_space *isl_local_space_add_div(
-	__isl_take isl_local_space *ls, __isl_take isl_vec *div)
-{
-	ls = isl_local_space_cow(ls);
-	if (!ls || !div)
-		goto error;
-
-	if (ls->div->n_col != div->size)
-		isl_die(isl_local_space_get_ctx(ls), isl_error_invalid,
-			"incompatible dimensions", goto error);
-
-	ls->div = isl_mat_add_zero_cols(ls->div, 1);
-	ls->div = isl_mat_add_rows(ls->div, 1);
-	if (!ls->div)
-		goto error;
-
-	isl_seq_cpy(ls->div->row[ls->div->n_row - 1], div->el, div->size);
-	isl_int_set_si(ls->div->row[ls->div->n_row - 1][div->size], 0);
-
-	isl_vec_free(div);
-	return ls;
-error:
-	isl_local_space_free(ls);
-	isl_vec_free(div);
-	return NULL;
-}
-
-__isl_give isl_local_space *isl_local_space_replace_divs(
-	__isl_take isl_local_space *ls, __isl_take isl_mat *div)
-{
-	ls = isl_local_space_cow(ls);
-
-	if (!ls || !div)
-		goto error;
-
-	isl_mat_free(ls->div);
-	ls->div = div;
-	return ls;
-error:
-	isl_mat_free(div);
-	isl_local_space_free(ls);
-	return NULL;
-}
-
-/* Copy row "s" of "src" to row "d" of "dst", applying the expansion
- * defined by "exp".
- */
-static void expand_row(__isl_keep isl_mat *dst, int d,
-	__isl_keep isl_mat *src, int s, int *exp)
-{
-	int i;
-	unsigned c = src->n_col - src->n_row;
-
-	isl_seq_cpy(dst->row[d], src->row[s], c);
-	isl_seq_clr(dst->row[d] + c, dst->n_col - c);
-
-	for (i = 0; i < s; ++i)
-		isl_int_set(dst->row[d][c + exp[i]], src->row[s][c + i]);
-}
-
-/* Compare (known) divs.
- * Return non-zero if at least one of the two divs is unknown.
- */
-static int cmp_row(__isl_keep isl_mat *div, int i, int j)
-{
-	int li, lj;
-
-	if (isl_int_is_zero(div->row[j][0]))
-		return -1;
-	if (isl_int_is_zero(div->row[i][0]))
-		return 1;
-
-	li = isl_seq_last_non_zero(div->row[i], div->n_col);
-	lj = isl_seq_last_non_zero(div->row[j], div->n_col);
-
-	if (li != lj)
-		return li - lj;
-
-	return isl_seq_cmp(div->row[i], div->row[j], div->n_col);
-}
-
-/* Combine the two lists of divs into a single list.
- * For each row i in div1, exp1[i] is set to the position of the corresponding
- * row in the result.  Similarly for div2 and exp2.
- * This function guarantees
- *	exp1[i] >= i
- *	exp1[i+1] > exp1[i]
- * For optimal merging, the two input list should have been sorted.
- */
-__isl_give isl_mat *isl_merge_divs(__isl_keep isl_mat *div1,
-	__isl_keep isl_mat *div2, int *exp1, int *exp2)
-{
-	int i, j, k;
-	isl_mat *div = NULL;
-	unsigned d = div1->n_col - div1->n_row;
-
-	div = isl_mat_alloc(div1->ctx, 1 + div1->n_row + div2->n_row,
-				d + div1->n_row + div2->n_row);
-	if (!div)
-		return NULL;
-
-	for (i = 0, j = 0, k = 0; i < div1->n_row && j < div2->n_row; ++k) {
-		int cmp;
-
-		expand_row(div, k, div1, i, exp1);
-		expand_row(div, k + 1, div2, j, exp2);
-
-		cmp = cmp_row(div, k, k + 1);
-		if (cmp == 0) {
-			exp1[i++] = k;
-			exp2[j++] = k;
-		} else if (cmp < 0) {
-			exp1[i++] = k;
-		} else {
-			exp2[j++] = k;
-			isl_seq_cpy(div->row[k], div->row[k + 1], div->n_col);
-		}
-	}
-	for (; i < div1->n_row; ++i, ++k) {
-		expand_row(div, k, div1, i, exp1);
-		exp1[i] = k;
-	}
-	for (; j < div2->n_row; ++j, ++k) {
-		expand_row(div, k, div2, j, exp2);
-		exp2[j] = k;
-	}
-
-	div->n_row = k;
-	div->n_col = d + k;
-
-	return div;
-}
-
-/* Construct a local space that contains all the divs in either
- * "ls1" or "ls2".
- */
-__isl_give isl_local_space *isl_local_space_intersect(
-	__isl_take isl_local_space *ls1, __isl_take isl_local_space *ls2)
-{
-	isl_ctx *ctx;
-	int *exp1 = NULL;
-	int *exp2 = NULL;
-	isl_mat *div;
-
-	if (!ls1 || !ls2)
-		goto error;
-
-	ctx = isl_local_space_get_ctx(ls1);
-	if (!isl_space_is_equal(ls1->dim, ls2->dim))
-		isl_die(ctx, isl_error_invalid,
-			"spaces should be identical", goto error);
-
-	if (ls2->div->n_row == 0) {
-		isl_local_space_free(ls2);
-		return ls1;
-	}
-
-	if (ls1->div->n_row == 0) {
-		isl_local_space_free(ls1);
-		return ls2;
-	}
-
-	exp1 = isl_alloc_array(ctx, int, ls1->div->n_row);
-	exp2 = isl_alloc_array(ctx, int, ls2->div->n_row);
-	if (!exp1 || !exp2)
-		goto error;
-
-	div = isl_merge_divs(ls1->div, ls2->div, exp1, exp2);
-	if (!div)
-		goto error;
-
-	free(exp1);
-	free(exp2);
-	isl_local_space_free(ls2);
-	isl_mat_free(ls1->div);
-	ls1->div = div;
-
-	return ls1;
-error:
-	free(exp1);
-	free(exp2);
-	isl_local_space_free(ls1);
-	isl_local_space_free(ls2);
-	return NULL;
-}
-
-int isl_local_space_divs_known(__isl_keep isl_local_space *ls)
-{
-	int i;
-
-	if (!ls)
-		return -1;
-
-	for (i = 0; i < ls->div->n_row; ++i)
-		if (isl_int_is_zero(ls->div->row[i][0]))
-			return 0;
-
-	return 1;
-}
-
-__isl_give isl_local_space *isl_local_space_domain(
-	__isl_take isl_local_space *ls)
-{
-	ls = isl_local_space_drop_dims(ls, isl_dim_out,
-					0, isl_local_space_dim(ls, isl_dim_out));
-	ls = isl_local_space_cow(ls);
-	if (!ls)
-		return NULL;
-	ls->dim = isl_space_domain(ls->dim);
-	if (!ls->dim)
-		return isl_local_space_free(ls);
-	return ls;
-}
-
-__isl_give isl_local_space *isl_local_space_range(
-	__isl_take isl_local_space *ls)
-{
-	ls = isl_local_space_drop_dims(ls, isl_dim_in,
-					0, isl_local_space_dim(ls, isl_dim_in));
-	ls = isl_local_space_cow(ls);
-	if (!ls)
-		return NULL;
-
-	ls->dim = isl_space_range(ls->dim);
-	if (!ls->dim)
-		return isl_local_space_free(ls);
-	return ls;
-}
-
-/* Construct a local space for a map that has the given local
- * space as domain and that has a zero-dimensional range.
- */
-__isl_give isl_local_space *isl_local_space_from_domain(
-	__isl_take isl_local_space *ls)
-{
-	ls = isl_local_space_cow(ls);
-	if (!ls)
-		return NULL;
-	ls->dim = isl_space_from_domain(ls->dim);
-	if (!ls->dim)
-		return isl_local_space_free(ls);
-	return ls;
-}
-
-__isl_give isl_local_space *isl_local_space_add_dims(
-	__isl_take isl_local_space *ls, enum isl_dim_type type, unsigned n)
-{
-	int pos;
-
-	if (!ls)
-		return NULL;
-	pos = isl_local_space_dim(ls, type);
-	return isl_local_space_insert_dims(ls, type, pos, n);
-}
-
-/* Remove common factor of non-constant terms and denominator.
- */
-static void normalize_div(__isl_keep isl_local_space *ls, int div)
-{
-	isl_ctx *ctx = ls->div->ctx;
-	unsigned total = ls->div->n_col - 2;
-
-	isl_seq_gcd(ls->div->row[div] + 2, total, &ctx->normalize_gcd);
-	isl_int_gcd(ctx->normalize_gcd,
-		    ctx->normalize_gcd, ls->div->row[div][0]);
-	if (isl_int_is_one(ctx->normalize_gcd))
-		return;
-
-	isl_seq_scale_down(ls->div->row[div] + 2, ls->div->row[div] + 2,
-			    ctx->normalize_gcd, total);
-	isl_int_divexact(ls->div->row[div][0], ls->div->row[div][0],
-			    ctx->normalize_gcd);
-	isl_int_fdiv_q(ls->div->row[div][1], ls->div->row[div][1],
-			    ctx->normalize_gcd);
-}
-
-/* Exploit the equalities in "eq" to simplify the expressions of
- * the integer divisions in "ls".
- * The integer divisions in "ls" are assumed to appear as regular
- * dimensions in "eq".
- */
-__isl_give isl_local_space *isl_local_space_substitute_equalities(
-	__isl_take isl_local_space *ls, __isl_take isl_basic_set *eq)
-{
-	int i, j, k;
-	unsigned total;
-	unsigned n_div;
-
-	ls = isl_local_space_cow(ls);
-	if (!ls || !eq)
-		goto error;
-
-	total = isl_space_dim(eq->dim, isl_dim_all);
-	if (isl_local_space_dim(ls, isl_dim_all) != total)
-		isl_die(isl_local_space_get_ctx(ls), isl_error_invalid,
-			"dimensions don't match", goto error);
-	total++;
-	n_div = eq->n_div;
-	for (i = 0; i < eq->n_eq; ++i) {
-		j = isl_seq_last_non_zero(eq->eq[i], total + n_div);
-		if (j < 0 || j == 0 || j >= total)
-			continue;
-
-		for (k = 0; k < ls->div->n_row; ++k) {
-			if (isl_int_is_zero(ls->div->row[k][1 + j]))
-				continue;
-			isl_seq_elim(ls->div->row[k] + 1, eq->eq[i], j, total,
-					&ls->div->row[k][0]);
-			normalize_div(ls, k);
-		}
-	}
-
-	isl_basic_set_free(eq);
-	return ls;
-error:
-	isl_basic_set_free(eq);
-	isl_local_space_free(ls);
-	return NULL;
-}
-
-/* Plug in "subs" for dimension "type", "pos" in the integer divisions
- * of "ls".
- *
- * Let i be the dimension to replace and let "subs" be of the form
- *
- *	f/d
- *
- * Any integer division with a non-zero coefficient for i,
- *
- *	floor((a i + g)/m)
- *
- * is replaced by
- *
- *	floor((a f + d g)/(m d))
- */
-__isl_give isl_local_space *isl_local_space_substitute(
-	__isl_take isl_local_space *ls,
-	enum isl_dim_type type, unsigned pos, __isl_keep isl_aff *subs)
-{
-	int i;
-	isl_int v;
-
-	ls = isl_local_space_cow(ls);
-	if (!ls || !subs)
-		return isl_local_space_free(ls);
-
-	if (!isl_space_is_equal(ls->dim, subs->ls->dim))
-		isl_die(isl_local_space_get_ctx(ls), isl_error_invalid,
-			"spaces don't match", return isl_local_space_free(ls));
-	if (isl_local_space_dim(subs->ls, isl_dim_div) != 0)
-		isl_die(isl_local_space_get_ctx(ls), isl_error_unsupported,
-			"cannot handle divs yet",
-			return isl_local_space_free(ls));
-
-	pos += isl_local_space_offset(ls, type);
-
-	isl_int_init(v);
-	for (i = 0; i < ls->div->n_row; ++i) {
-		if (isl_int_is_zero(ls->div->row[i][1 + pos]))
-			continue;
-		isl_int_set(v, ls->div->row[i][1 + pos]);
-		isl_int_set_si(ls->div->row[i][1 + pos], 0);
-		isl_seq_combine(ls->div->row[i] + 1,
-				subs->v->el[0], ls->div->row[i] + 1,
-				v, subs->v->el + 1, subs->v->size - 1);
-		isl_int_mul(ls->div->row[i][0],
-			    ls->div->row[i][0], subs->v->el[0]);
-		normalize_div(ls, i);
-	}
-	isl_int_clear(v);
-
-	return ls;
-}
-
-int isl_local_space_is_named_or_nested(__isl_keep isl_local_space *ls,
-	enum isl_dim_type type)
-{
-	if (!ls)
-		return -1;
-	return isl_space_is_named_or_nested(ls->dim, type);
-}
-
-__isl_give isl_local_space *isl_local_space_drop_dims(
-	__isl_take isl_local_space *ls,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	isl_ctx *ctx;
-
-	if (!ls)
-		return NULL;
-	if (n == 0 && !isl_local_space_is_named_or_nested(ls, type))
-		return ls;
-
-	ctx = isl_local_space_get_ctx(ls);
-	if (first + n > isl_local_space_dim(ls, type))
-		isl_die(ctx, isl_error_invalid, "range out of bounds",
-			return isl_local_space_free(ls));
-
-	ls = isl_local_space_cow(ls);
-	if (!ls)
-		return NULL;
-
-	if (type == isl_dim_div) {
-		ls->div = isl_mat_drop_rows(ls->div, first, n);
-	} else {
-		ls->dim = isl_space_drop_dims(ls->dim, type, first, n);
-		if (!ls->dim)
-			return isl_local_space_free(ls);
-	}
-
-	first += 1 + isl_local_space_offset(ls, type);
-	ls->div = isl_mat_drop_cols(ls->div, first, n);
-	if (!ls->div)
-		return isl_local_space_free(ls);
-
-	return ls;
-}
-
-__isl_give isl_local_space *isl_local_space_insert_dims(
-	__isl_take isl_local_space *ls,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	isl_ctx *ctx;
-
-	if (!ls)
-		return NULL;
-	if (n == 0 && !isl_local_space_is_named_or_nested(ls, type))
-		return ls;
-
-	ctx = isl_local_space_get_ctx(ls);
-	if (first > isl_local_space_dim(ls, type))
-		isl_die(ctx, isl_error_invalid, "position out of bounds",
-			return isl_local_space_free(ls));
-
-	ls = isl_local_space_cow(ls);
-	if (!ls)
-		return NULL;
-
-	if (type == isl_dim_div) {
-		ls->div = isl_mat_insert_zero_rows(ls->div, first, n);
-	} else {
-		ls->dim = isl_space_insert_dims(ls->dim, type, first, n);
-		if (!ls->dim)
-			return isl_local_space_free(ls);
-	}
-
-	first += 1 + isl_local_space_offset(ls, type);
-	ls->div = isl_mat_insert_zero_cols(ls->div, first, n);
-	if (!ls->div)
-		return isl_local_space_free(ls);
-
-	return ls;
-}
-
-/* Check if the constraints pointed to by "constraint" is a div
- * constraint corresponding to div "div" in "ls".
- *
- * That is, if div = floor(f/m), then check if the constraint is
- *
- *		f - m d >= 0
- * or
- *		-(f-(m-1)) + m d >= 0
- */
-int isl_local_space_is_div_constraint(__isl_keep isl_local_space *ls,
-	isl_int *constraint, unsigned div)
-{
-	unsigned pos;
-
-	if (!ls)
-		return -1;
-
-	if (isl_int_is_zero(ls->div->row[div][0]))
-		return 0;
-
-	pos = isl_local_space_offset(ls, isl_dim_div) + div;
-
-	if (isl_int_eq(constraint[pos], ls->div->row[div][0])) {
-		int neg;
-		isl_int_sub(ls->div->row[div][1],
-				ls->div->row[div][1], ls->div->row[div][0]);
-		isl_int_add_ui(ls->div->row[div][1], ls->div->row[div][1], 1);
-		neg = isl_seq_is_neg(constraint, ls->div->row[div]+1, pos);
-		isl_int_sub_ui(ls->div->row[div][1], ls->div->row[div][1], 1);
-		isl_int_add(ls->div->row[div][1],
-				ls->div->row[div][1], ls->div->row[div][0]);
-		if (!neg)
-			return 0;
-		if (isl_seq_first_non_zero(constraint+pos+1,
-					    ls->div->n_row-div-1) != -1)
-			return 0;
-	} else if (isl_int_abs_eq(constraint[pos], ls->div->row[div][0])) {
-		if (!isl_seq_eq(constraint, ls->div->row[div]+1, pos))
-			return 0;
-		if (isl_seq_first_non_zero(constraint+pos+1,
-					    ls->div->n_row-div-1) != -1)
-			return 0;
-	} else
-		return 0;
-
-	return 1;
-}
-
-/*
- * Set active[i] to 1 if the dimension at position i is involved
- * in the linear expression l.
- */
-int *isl_local_space_get_active(__isl_keep isl_local_space *ls, isl_int *l)
-{
-	int i, j;
-	isl_ctx *ctx;
-	int *active = NULL;
-	unsigned total;
-	unsigned offset;
-
-	ctx = isl_local_space_get_ctx(ls);
-	total = isl_local_space_dim(ls, isl_dim_all);
-	active = isl_calloc_array(ctx, int, total);
-	if (!active)
-		return NULL;
-
-	for (i = 0; i < total; ++i)
-		active[i] = !isl_int_is_zero(l[i]);
-
-	offset = isl_local_space_offset(ls, isl_dim_div) - 1;
-	for (i = ls->div->n_row - 1; i >= 0; --i) {
-		if (!active[offset + i])
-			continue;
-		for (j = 0; j < total; ++j)
-			active[j] |= !isl_int_is_zero(ls->div->row[i][2 + j]);
-	}
-
-	return active;
-}
-
-/* Given a local space "ls" of a set, create a local space
- * for the lift of the set.  In particular, the result
- * is of the form [dim -> local[..]], with ls->div->n_row variables in the
- * range of the wrapped map.
- */
-__isl_give isl_local_space *isl_local_space_lift(
-	__isl_take isl_local_space *ls)
-{
-	ls = isl_local_space_cow(ls);
-	if (!ls)
-		return NULL;
-
-	ls->dim = isl_space_lift(ls->dim, ls->div->n_row);
-	ls->div = isl_mat_drop_rows(ls->div, 0, ls->div->n_row);
-	if (!ls->dim || !ls->div)
-		return isl_local_space_free(ls);
-
-	return ls;
-}
-
-/* Construct a basic map that maps a set living in local space "ls"
- * to the corresponding lifted local space.
- */
-__isl_give isl_basic_map *isl_local_space_lifting(
-	__isl_take isl_local_space *ls)
-{
-	isl_basic_map *lifting;
-	isl_basic_set *bset;
-
-	if (!ls)
-		return NULL;
-	if (!isl_local_space_is_set(ls))
-		isl_die(isl_local_space_get_ctx(ls), isl_error_invalid,
-			"lifting only defined on set spaces",
-			return isl_local_space_free(ls));
-
-	bset = isl_basic_set_from_local_space(ls);
-	lifting = isl_basic_set_unwrap(isl_basic_set_lift(bset));
-	lifting = isl_basic_map_domain_map(lifting);
-	lifting = isl_basic_map_reverse(lifting);
-
-	return lifting;
-}
diff --git a/cloog-0.17.0/isl/isl_local_space_private.h b/cloog-0.17.0/isl/isl_local_space_private.h
deleted file mode 100644
index 8d106bd..0000000
--- a/cloog-0.17.0/isl/isl_local_space_private.h
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef ISL_LOCAL_SPACE_PRIVATE_H
-#define ISL_LOCAL_SPACE_PRIVATE_H
-
-#include <isl/mat.h>
-#include <isl/set.h>
-#include <isl/local_space.h>
-
-struct isl_local_space {
-	int ref;
-
-	isl_space *dim;
-	isl_mat *div;
-};
-
-__isl_give isl_local_space *isl_local_space_alloc(__isl_take isl_space *dim,
-	unsigned n_div);
-__isl_give isl_local_space *isl_local_space_alloc_div(__isl_take isl_space *dim,
-	__isl_take isl_mat *div);
-
-__isl_give isl_local_space *isl_local_space_add_div(
-	__isl_take isl_local_space *ls, __isl_take isl_vec *div);
-
-__isl_give isl_mat *isl_merge_divs(__isl_keep isl_mat *div1,
-	__isl_keep isl_mat *div2, int *exp1, int *exp2);
-
-unsigned isl_local_space_offset(__isl_keep isl_local_space *ls,
-	enum isl_dim_type type);
-
-__isl_give isl_local_space *isl_local_space_replace_divs(
-	__isl_take isl_local_space *ls, __isl_take isl_mat *div);
-int isl_local_space_divs_known(__isl_keep isl_local_space *ls);
-
-__isl_give isl_local_space *isl_local_space_substitute_equalities(
-	__isl_take isl_local_space *ls, __isl_take isl_basic_set *eq);
-
-int isl_local_space_is_named_or_nested(__isl_keep isl_local_space *ls,
-	enum isl_dim_type type);
-
-__isl_give isl_local_space *isl_local_space_reset_space(
-	__isl_take isl_local_space *ls, __isl_take isl_space *dim);
-__isl_give isl_local_space *isl_local_space_realign(
-	__isl_take isl_local_space *ls, __isl_take isl_reordering *r);
-
-int isl_local_space_is_div_constraint(__isl_keep isl_local_space *ls,
-	isl_int *constraint, unsigned div);
-
-int *isl_local_space_get_active(__isl_keep isl_local_space *ls, isl_int *l);
-
-__isl_give isl_local_space *isl_local_space_substitute(
-	__isl_take isl_local_space *ls,
-	enum isl_dim_type type, unsigned pos, __isl_keep isl_aff *subs);
-
-__isl_give isl_local_space *isl_local_space_lift(
-	__isl_take isl_local_space *ls);
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_lp.c b/cloog-0.17.0/isl/isl_lp.c
deleted file mode 100644
index d2e35a5..0000000
--- a/cloog-0.17.0/isl/isl_lp.c
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl/lp.h>
-#include "isl_lp_piplib.h"
-#include <isl/seq.h>
-#include "isl_tab.h"
-#include <isl_options_private.h>
-
-enum isl_lp_result isl_tab_solve_lp(struct isl_basic_map *bmap, int maximize,
-				      isl_int *f, isl_int denom, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **sol)
-{
-	struct isl_tab *tab;
-	enum isl_lp_result res;
-	unsigned dim = isl_basic_map_total_dim(bmap);
-
-	if (maximize)
-		isl_seq_neg(f, f, 1 + dim);
-
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	tab = isl_tab_from_basic_map(bmap);
-	res = isl_tab_min(tab, f, denom, opt, opt_denom, 0);
-	if (res == isl_lp_ok && sol) {
-		*sol = isl_tab_get_sample_value(tab);
-		if (!*sol)
-			res = isl_lp_error;
-	}
-	isl_tab_free(tab);
-
-	if (maximize)
-		isl_seq_neg(f, f, 1 + dim);
-	if (maximize && opt)
-		isl_int_neg(*opt, *opt);
-
-	return res;
-}
-
-/* Given a basic map "bmap" and an affine combination of the variables "f"
- * with denominator "denom", set *opt / *opt_denom to the minimal
- * (or maximal if "maximize" is true) value attained by f/d over "bmap",
- * assuming the basic map is not empty and the expression cannot attain
- * arbitrarily small (or large) values.
- * If opt_denom is NULL, then *opt is rounded up (or down)
- * to the nearest integer.
- * The return value reflects the nature of the result (empty, unbounded,
- * minmimal or maximal value returned in *opt).
- */
-enum isl_lp_result isl_basic_map_solve_lp(struct isl_basic_map *bmap, int max,
-				      isl_int *f, isl_int d, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **sol)
-{
-	if (sol)
-		*sol = NULL;
-
-	if (!bmap)
-		return isl_lp_error;
-
-	switch (bmap->ctx->opt->lp_solver) {
-	case ISL_LP_PIP:
-		return isl_pip_solve_lp(bmap, max, f, d, opt, opt_denom, sol);
-	case ISL_LP_TAB:
-		return isl_tab_solve_lp(bmap, max, f, d, opt, opt_denom, sol);
-	default:
-		return isl_lp_error;
-	}
-}
-
-enum isl_lp_result isl_basic_set_solve_lp(struct isl_basic_set *bset, int max,
-				      isl_int *f, isl_int d, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **sol)
-{
-	return isl_basic_map_solve_lp((struct isl_basic_map *)bset, max,
-					f, d, opt, opt_denom, sol);
-}
-
-enum isl_lp_result isl_map_solve_lp(__isl_keep isl_map *map, int max,
-				      isl_int *f, isl_int d, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **sol)
-{
-	int i;
-	isl_int o;
-	isl_int t;
-	isl_int opt_i;
-	isl_int opt_denom_i;
-	enum isl_lp_result res;
-	int max_div;
-	isl_vec *v = NULL;
-
-	if (!map)
-		return isl_lp_error;
-	if (map->n == 0)
-		return isl_lp_empty;
-
-	max_div = 0;
-	for (i = 0; i < map->n; ++i)
-		if (map->p[i]->n_div > max_div)
-			max_div = map->p[i]->n_div;
-	if (max_div > 0) {
-		unsigned total = isl_space_dim(map->dim, isl_dim_all);
-		v = isl_vec_alloc(map->ctx, 1 + total + max_div);
-		if (!v)
-			return isl_lp_error;
-		isl_seq_cpy(v->el, f, 1 + total);
-		isl_seq_clr(v->el + 1 + total, max_div);
-		f = v->el;
-	}
-
-	if (!opt && map->n > 1 && sol) {
-		isl_int_init(o);
-		opt = &o;
-	}
-	if (map->n > 0)
-		isl_int_init(opt_i);
-	if (map->n > 0 && opt_denom) {
-		isl_int_init(opt_denom_i);
-		isl_int_init(t);
-	}
-
-	res = isl_basic_map_solve_lp(map->p[0], max, f, d,
-					opt, opt_denom, sol);
-	if (res == isl_lp_error || res == isl_lp_unbounded)
-		goto done;
-
-	if (sol)
-		*sol = NULL;
-
-	for (i = 1; i < map->n; ++i) {
-		isl_vec *sol_i = NULL;
-		enum isl_lp_result res_i;
-		int better;
-
-		res_i = isl_basic_map_solve_lp(map->p[i], max, f, d,
-					    &opt_i,
-					    opt_denom ? &opt_denom_i : NULL,
-					    sol ? &sol_i : NULL);
-		if (res_i == isl_lp_error || res_i == isl_lp_unbounded) {
-			res = res_i;
-			goto done;
-		}
-		if (res_i == isl_lp_empty)
-			continue;
-		if (res == isl_lp_empty) {
-			better = 1;
-		} else if (!opt_denom) {
-			if (max)
-				better = isl_int_gt(opt_i, *opt);
-			else
-				better = isl_int_lt(opt_i, *opt);
-		} else {
-			isl_int_mul(t, opt_i, *opt_denom);
-			isl_int_submul(t, *opt, opt_denom_i);
-			if (max)
-				better = isl_int_is_pos(t);
-			else
-				better = isl_int_is_neg(t);
-		}
-		if (better) {
-			res = res_i;
-			if (opt)
-				isl_int_set(*opt, opt_i);
-			if (opt_denom)
-				isl_int_set(*opt_denom, opt_denom_i);
-			if (sol) {
-				isl_vec_free(*sol);
-				*sol = sol_i;
-			}
-		} else
-			isl_vec_free(sol_i);
-	}
-
-done:
-	isl_vec_free(v);
-	if (map->n > 0 && opt_denom) {
-		isl_int_clear(opt_denom_i);
-		isl_int_clear(t);
-	}
-	if (map->n > 0)
-		isl_int_clear(opt_i);
-	if (opt == &o)
-		isl_int_clear(o);
-	return res;
-}
-
-enum isl_lp_result isl_set_solve_lp(__isl_keep isl_set *set, int max,
-				      isl_int *f, isl_int d, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **sol)
-{
-	return isl_map_solve_lp((struct isl_map *)set, max,
-					f, d, opt, opt_denom, sol);
-}
diff --git a/cloog-0.17.0/isl/isl_lp_no_piplib.c b/cloog-0.17.0/isl/isl_lp_no_piplib.c
deleted file mode 100644
index 54c0135..0000000
--- a/cloog-0.17.0/isl/isl_lp_no_piplib.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include "isl_lp_piplib.h"
-
-enum isl_lp_result isl_pip_solve_lp(struct isl_basic_map *bmap, int maximize,
-				      isl_int *f, isl_int denom, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **sol)
-{
-	return isl_lp_error;
-}
diff --git a/cloog-0.17.0/isl/isl_lp_piplib.c b/cloog-0.17.0/isl/isl_lp_piplib.c
deleted file mode 100644
index d4b92af..0000000
--- a/cloog-0.17.0/isl/isl_lp_piplib.c
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl/map.h>
-#include <isl/vec.h>
-#include <isl/lp.h>
-#include "isl_piplib.h"
-#include "isl_map_piplib.h"
-
-static void copy_solution(struct isl_vec *vec, int maximize, isl_int *opt,
-	isl_int *opt_denom, PipQuast *sol)
-{
-	int i;
-	PipList *list;
-	isl_int tmp;
-
-	if (opt) {
-		if (opt_denom) {
-			isl_seq_cpy_from_pip(opt,
-				 &sol->list->vector->the_vector[0], 1);
-			isl_seq_cpy_from_pip(opt_denom,
-				 &sol->list->vector->the_deno[0], 1);
-		} else if (maximize)
-			mpz_fdiv_q(*opt, sol->list->vector->the_vector[0],
-					 sol->list->vector->the_deno[0]);
-		else
-			mpz_cdiv_q(*opt, sol->list->vector->the_vector[0],
-					 sol->list->vector->the_deno[0]);
-	}
-
-	if (!vec)
-		return;
-
-	isl_int_init(tmp);
-	isl_int_set_si(vec->el[0], 1);
-	for (i = 0, list = sol->list->next; list; ++i, list = list->next) {
-		isl_seq_cpy_from_pip(&vec->el[1 + i],
-			&list->vector->the_deno[0], 1);
-		isl_int_lcm(vec->el[0], vec->el[0], vec->el[1 + i]);
-	}
-	for (i = 0, list = sol->list->next; list; ++i, list = list->next) {
-		isl_seq_cpy_from_pip(&tmp, &list->vector->the_deno[0], 1);
-		isl_int_divexact(tmp, vec->el[0], tmp);
-		isl_seq_cpy_from_pip(&vec->el[1 + i],
-			&list->vector->the_vector[0], 1);
-		isl_int_mul(vec->el[1 + i], vec->el[1 + i], tmp);
-	}
-	isl_int_clear(tmp);
-}
-
-enum isl_lp_result isl_pip_solve_lp(struct isl_basic_map *bmap, int maximize,
-				      isl_int *f, isl_int denom, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **vec)
-{
-	enum isl_lp_result res = isl_lp_ok;
-	PipMatrix	*domain = NULL;
-	PipOptions	*options;
-	PipQuast   	*sol;
-	unsigned	 total;
-
-	total = isl_basic_map_total_dim(bmap);
-	domain = isl_basic_map_to_pip(bmap, 0, 1, 0);
-	if (!domain)
-		goto error;
-	entier_set_si(domain->p[0][1], -1);
-	isl_int_set(domain->p[0][domain->NbColumns - 1], f[0]);
-	isl_seq_cpy_to_pip(domain->p[0]+2, f+1, total);
-
-	options = pip_options_init();
-	if (!options)
-		goto error;
-	options->Urs_unknowns = -1;
-	options->Maximize = maximize;
-	options->Nq = 0;
-	sol = pip_solve(domain, NULL, -1, options);
-	pip_options_free(options);
-	if (!sol)
-		goto error;
-
-	if (vec) {
-		isl_ctx *ctx = isl_basic_map_get_ctx(bmap);
-		*vec = isl_vec_alloc(ctx, 1 + total);
-	}
-	if (vec && !*vec)
-		res = isl_lp_error;
-	else if (!sol->list)
-		res = isl_lp_empty;
-	else if (entier_zero_p(sol->list->vector->the_deno[0]))
-		res = isl_lp_unbounded;
-	else
-		copy_solution(*vec, maximize, opt, opt_denom, sol);
-	pip_matrix_free(domain);
-	pip_quast_free(sol);
-	return res;
-error:
-	if (domain)
-		pip_matrix_free(domain);
-	return isl_lp_error;
-}
diff --git a/cloog-0.17.0/isl/isl_lp_piplib.h b/cloog-0.17.0/isl/isl_lp_piplib.h
deleted file mode 100644
index e69a3b4..0000000
--- a/cloog-0.17.0/isl/isl_lp_piplib.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_LP_PIPLIB_H
-#define ISL_LP_PIPLIB_H
-
-#include <isl/lp.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-enum isl_lp_result isl_pip_solve_lp(struct isl_basic_map *bmap, int maximize,
-				      isl_int *f, isl_int denom, isl_int *opt,
-				      isl_int *opt_denom,
-				      struct isl_vec **sol);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_map.c b/cloog-0.17.0/isl/isl_map.c
deleted file mode 100644
index 8b4aea3..0000000
--- a/cloog-0.17.0/isl/isl_map.c
+++ /dev/null
@@ -1,10008 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France 
- */
-
-#include <string.h>
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl/blk.h>
-#include "isl_space_private.h"
-#include "isl_equalities.h"
-#include <isl_list_private.h>
-#include <isl/lp.h>
-#include <isl/seq.h>
-#include <isl/set.h>
-#include <isl/map.h>
-#include "isl_map_piplib.h"
-#include <isl_reordering.h>
-#include "isl_sample.h"
-#include "isl_tab.h"
-#include <isl/vec.h>
-#include <isl_mat_private.h>
-#include <isl_dim_map.h>
-#include <isl_local_space_private.h>
-#include <isl_aff_private.h>
-#include <isl_options_private.h>
-
-static unsigned n(__isl_keep isl_space *dim, enum isl_dim_type type)
-{
-	switch (type) {
-	case isl_dim_param:	return dim->nparam;
-	case isl_dim_in:	return dim->n_in;
-	case isl_dim_out:	return dim->n_out;
-	case isl_dim_all:	return dim->nparam + dim->n_in + dim->n_out;
-	default:		return 0;
-	}
-}
-
-static unsigned pos(__isl_keep isl_space *dim, enum isl_dim_type type)
-{
-	switch (type) {
-	case isl_dim_param:	return 1;
-	case isl_dim_in:	return 1 + dim->nparam;
-	case isl_dim_out:	return 1 + dim->nparam + dim->n_in;
-	default:		return 0;
-	}
-}
-
-unsigned isl_basic_map_dim(__isl_keep isl_basic_map *bmap,
-				enum isl_dim_type type)
-{
-	if (!bmap)
-		return 0;
-	switch (type) {
-	case isl_dim_cst:	return 1;
-	case isl_dim_param:
-	case isl_dim_in:
-	case isl_dim_out:	return isl_space_dim(bmap->dim, type);
-	case isl_dim_div:	return bmap->n_div;
-	case isl_dim_all:	return isl_basic_map_total_dim(bmap);
-	default:		return 0;
-	}
-}
-
-unsigned isl_map_dim(__isl_keep isl_map *map, enum isl_dim_type type)
-{
-	return map ? n(map->dim, type) : 0;
-}
-
-unsigned isl_set_dim(__isl_keep isl_set *set, enum isl_dim_type type)
-{
-	return set ? n(set->dim, type) : 0;
-}
-
-unsigned isl_basic_map_offset(struct isl_basic_map *bmap,
-					enum isl_dim_type type)
-{
-	isl_space *dim = bmap->dim;
-	switch (type) {
-	case isl_dim_cst:	return 0;
-	case isl_dim_param:	return 1;
-	case isl_dim_in:	return 1 + dim->nparam;
-	case isl_dim_out:	return 1 + dim->nparam + dim->n_in;
-	case isl_dim_div:	return 1 + dim->nparam + dim->n_in + dim->n_out;
-	default:		return 0;
-	}
-}
-
-unsigned isl_basic_set_offset(struct isl_basic_set *bset,
-					enum isl_dim_type type)
-{
-	return isl_basic_map_offset(bset, type);
-}
-
-static unsigned map_offset(struct isl_map *map, enum isl_dim_type type)
-{
-	return pos(map->dim, type);
-}
-
-unsigned isl_basic_set_dim(__isl_keep isl_basic_set *bset,
-				enum isl_dim_type type)
-{
-	return isl_basic_map_dim(bset, type);
-}
-
-unsigned isl_basic_set_n_dim(__isl_keep isl_basic_set *bset)
-{
-	return isl_basic_set_dim(bset, isl_dim_set);
-}
-
-unsigned isl_basic_set_n_param(__isl_keep isl_basic_set *bset)
-{
-	return isl_basic_set_dim(bset, isl_dim_param);
-}
-
-unsigned isl_basic_set_total_dim(const struct isl_basic_set *bset)
-{
-	return isl_space_dim(bset->dim, isl_dim_all) + bset->n_div;
-}
-
-unsigned isl_set_n_dim(__isl_keep isl_set *set)
-{
-	return isl_set_dim(set, isl_dim_set);
-}
-
-unsigned isl_set_n_param(__isl_keep isl_set *set)
-{
-	return isl_set_dim(set, isl_dim_param);
-}
-
-unsigned isl_basic_map_n_in(const struct isl_basic_map *bmap)
-{
-	return bmap ? bmap->dim->n_in : 0;
-}
-
-unsigned isl_basic_map_n_out(const struct isl_basic_map *bmap)
-{
-	return bmap ? bmap->dim->n_out : 0;
-}
-
-unsigned isl_basic_map_n_param(const struct isl_basic_map *bmap)
-{
-	return bmap ? bmap->dim->nparam : 0;
-}
-
-unsigned isl_basic_map_n_div(const struct isl_basic_map *bmap)
-{
-	return bmap ? bmap->n_div : 0;
-}
-
-unsigned isl_basic_map_total_dim(const struct isl_basic_map *bmap)
-{
-	return bmap ? isl_space_dim(bmap->dim, isl_dim_all) + bmap->n_div : 0;
-}
-
-unsigned isl_map_n_in(const struct isl_map *map)
-{
-	return map ? map->dim->n_in : 0;
-}
-
-unsigned isl_map_n_out(const struct isl_map *map)
-{
-	return map ? map->dim->n_out : 0;
-}
-
-unsigned isl_map_n_param(const struct isl_map *map)
-{
-	return map ? map->dim->nparam : 0;
-}
-
-int isl_map_compatible_domain(struct isl_map *map, struct isl_set *set)
-{
-	int m;
-	if (!map || !set)
-		return -1;
-	m = isl_space_match(map->dim, isl_dim_param, set->dim, isl_dim_param);
-	if (m < 0 || !m)
-		return m;
-	return isl_space_tuple_match(map->dim, isl_dim_in, set->dim, isl_dim_set);
-}
-
-int isl_basic_map_compatible_domain(struct isl_basic_map *bmap,
-		struct isl_basic_set *bset)
-{
-	int m;
-	if (!bmap || !bset)
-		return -1;
-	m = isl_space_match(bmap->dim, isl_dim_param, bset->dim, isl_dim_param);
-	if (m < 0 || !m)
-		return m;
-	return isl_space_tuple_match(bmap->dim, isl_dim_in, bset->dim, isl_dim_set);
-}
-
-int isl_map_compatible_range(__isl_keep isl_map *map, __isl_keep isl_set *set)
-{
-	int m;
-	if (!map || !set)
-		return -1;
-	m = isl_space_match(map->dim, isl_dim_param, set->dim, isl_dim_param);
-	if (m < 0 || !m)
-		return m;
-	return isl_space_tuple_match(map->dim, isl_dim_out, set->dim, isl_dim_set);
-}
-
-int isl_basic_map_compatible_range(struct isl_basic_map *bmap,
-		struct isl_basic_set *bset)
-{
-	int m;
-	if (!bmap || !bset)
-		return -1;
-	m = isl_space_match(bmap->dim, isl_dim_param, bset->dim, isl_dim_param);
-	if (m < 0 || !m)
-		return m;
-	return isl_space_tuple_match(bmap->dim, isl_dim_out, bset->dim, isl_dim_set);
-}
-
-isl_ctx *isl_basic_map_get_ctx(__isl_keep isl_basic_map *bmap)
-{
-	return bmap ? bmap->ctx : NULL;
-}
-
-isl_ctx *isl_basic_set_get_ctx(__isl_keep isl_basic_set *bset)
-{
-	return bset ? bset->ctx : NULL;
-}
-
-isl_ctx *isl_map_get_ctx(__isl_keep isl_map *map)
-{
-	return map ? map->ctx : NULL;
-}
-
-isl_ctx *isl_set_get_ctx(__isl_keep isl_set *set)
-{
-	return set ? set->ctx : NULL;
-}
-
-__isl_give isl_space *isl_basic_map_get_space(__isl_keep isl_basic_map *bmap)
-{
-	if (!bmap)
-		return NULL;
-	return isl_space_copy(bmap->dim);
-}
-
-__isl_give isl_space *isl_basic_set_get_space(__isl_keep isl_basic_set *bset)
-{
-	if (!bset)
-		return NULL;
-	return isl_space_copy(bset->dim);
-}
-
-__isl_give isl_local_space *isl_basic_map_get_local_space(
-	__isl_keep isl_basic_map *bmap)
-{
-	int i;
-	isl_local_space *ls;
-	unsigned total;
-
-	if (!bmap)
-		return NULL;
-
-	total = isl_basic_map_total_dim(bmap);
-	ls = isl_local_space_alloc(isl_space_copy(bmap->dim), bmap->n_div);
-	if (!ls)
-		return NULL;
-
-	for (i = 0; i < bmap->n_div; ++i)
-		isl_seq_cpy(ls->div->row[i], bmap->div[i], 2 + total);
-
-	return ls;
-}
-
-__isl_give isl_local_space *isl_basic_set_get_local_space(
-	__isl_keep isl_basic_set *bset)
-{
-	return isl_basic_map_get_local_space(bset);
-}
-
-__isl_give isl_basic_map *isl_basic_map_from_local_space(
-	__isl_take isl_local_space *ls)
-{
-	int i;
-	int n_div;
-	isl_basic_map *bmap;
-
-	if (!ls)
-		return NULL;
-
-	n_div = isl_local_space_dim(ls, isl_dim_div);
-	bmap = isl_basic_map_alloc_space(isl_local_space_get_space(ls),
-					n_div, 0, 2 * n_div);
-
-	for (i = 0; i < n_div; ++i)
-		if (isl_basic_map_alloc_div(bmap) < 0)
-			goto error;
-
-	for (i = 0; i < n_div; ++i) {
-		isl_seq_cpy(bmap->div[i], ls->div->row[i], ls->div->n_col);
-		if (isl_basic_map_add_div_constraints(bmap, i) < 0)
-			goto error;
-	}
-					
-	isl_local_space_free(ls);
-	return bmap;
-error:
-	isl_local_space_free(ls);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_from_local_space(
-	__isl_take isl_local_space *ls)
-{
-	return isl_basic_map_from_local_space(ls);
-}
-
-__isl_give isl_space *isl_map_get_space(__isl_keep isl_map *map)
-{
-	if (!map)
-		return NULL;
-	return isl_space_copy(map->dim);
-}
-
-__isl_give isl_space *isl_set_get_space(__isl_keep isl_set *set)
-{
-	if (!set)
-		return NULL;
-	return isl_space_copy(set->dim);
-}
-
-__isl_give isl_basic_map *isl_basic_map_set_tuple_name(
-	__isl_take isl_basic_map *bmap, enum isl_dim_type type, const char *s)
-{
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-	bmap->dim = isl_space_set_tuple_name(bmap->dim, type, s);
-	if (!bmap->dim)
-		goto error;
-	bmap = isl_basic_map_finalize(bmap);
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_set_tuple_name(
-	__isl_take isl_basic_set *bset, const char *s)
-{
-	return isl_basic_map_set_tuple_name(bset, isl_dim_set, s);
-}
-
-const char *isl_basic_map_get_tuple_name(__isl_keep isl_basic_map *bmap,
-	enum isl_dim_type type)
-{
-	return bmap ? isl_space_get_tuple_name(bmap->dim, type) : NULL;
-}
-
-__isl_give isl_map *isl_map_set_tuple_name(__isl_take isl_map *map,
-	enum isl_dim_type type, const char *s)
-{
-	int i;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	map->dim = isl_space_set_tuple_name(map->dim, type, s);
-	if (!map->dim)
-		goto error;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_set_tuple_name(map->p[i], type, s);
-		if (!map->p[i])
-			goto error;
-	}
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-const char *isl_map_get_tuple_name(__isl_keep isl_map *map,
-	enum isl_dim_type type)
-{
-	return map ? isl_space_get_tuple_name(map->dim, type) : NULL;
-}
-
-__isl_give isl_set *isl_set_set_tuple_name(__isl_take isl_set *set,
-	const char *s)
-{
-	return (isl_set *)isl_map_set_tuple_name((isl_map *)set, isl_dim_set, s);
-}
-
-__isl_give isl_map *isl_map_set_tuple_id(__isl_take isl_map *map,
-	enum isl_dim_type type, __isl_take isl_id *id)
-{
-	map = isl_map_cow(map);
-	if (!map)
-		return isl_id_free(id);
-
-	map->dim = isl_space_set_tuple_id(map->dim, type, id);
-
-	return isl_map_reset_space(map, isl_space_copy(map->dim));
-}
-
-__isl_give isl_set *isl_set_set_tuple_id(__isl_take isl_set *set,
-	__isl_take isl_id *id)
-{
-	return isl_map_set_tuple_id(set, isl_dim_set, id);
-}
-
-__isl_give isl_map *isl_map_reset_tuple_id(__isl_take isl_map *map,
-	enum isl_dim_type type)
-{
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	map->dim = isl_space_reset_tuple_id(map->dim, type);
-
-	return isl_map_reset_space(map, isl_space_copy(map->dim));
-}
-
-__isl_give isl_set *isl_set_reset_tuple_id(__isl_take isl_set *set)
-{
-	return isl_map_reset_tuple_id(set, isl_dim_set);
-}
-
-int isl_map_has_tuple_id(__isl_keep isl_map *map, enum isl_dim_type type)
-{
-	return map ? isl_space_has_tuple_id(map->dim, type) : -1;
-}
-
-__isl_give isl_id *isl_map_get_tuple_id(__isl_keep isl_map *map,
-	enum isl_dim_type type)
-{
-	return map ? isl_space_get_tuple_id(map->dim, type) : NULL;
-}
-
-int isl_set_has_tuple_id(__isl_keep isl_set *set)
-{
-	return isl_map_has_tuple_id(set, isl_dim_set);
-}
-
-__isl_give isl_id *isl_set_get_tuple_id(__isl_keep isl_set *set)
-{
-	return isl_map_get_tuple_id(set, isl_dim_set);
-}
-
-const char *isl_basic_set_get_tuple_name(__isl_keep isl_basic_set *bset)
-{
-	return bset ? isl_space_get_tuple_name(bset->dim, isl_dim_set) : NULL;
-}
-
-const char *isl_set_get_tuple_name(__isl_keep isl_set *set)
-{
-	return set ? isl_space_get_tuple_name(set->dim, isl_dim_set) : NULL;
-}
-
-const char *isl_basic_map_get_dim_name(__isl_keep isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned pos)
-{
-	return bmap ? isl_space_get_dim_name(bmap->dim, type, pos) : NULL;
-}
-
-const char *isl_basic_set_get_dim_name(__isl_keep isl_basic_set *bset,
-	enum isl_dim_type type, unsigned pos)
-{
-	return bset ? isl_space_get_dim_name(bset->dim, type, pos) : NULL;
-}
-
-const char *isl_map_get_dim_name(__isl_keep isl_map *map,
-	enum isl_dim_type type, unsigned pos)
-{
-	return map ? isl_space_get_dim_name(map->dim, type, pos) : NULL;
-}
-
-const char *isl_set_get_dim_name(__isl_keep isl_set *set,
-	enum isl_dim_type type, unsigned pos)
-{
-	return set ? isl_space_get_dim_name(set->dim, type, pos) : NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_set_dim_name(
-	__isl_take isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned pos, const char *s)
-{
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-	bmap->dim = isl_space_set_dim_name(bmap->dim, type, pos, s);
-	if (!bmap->dim)
-		goto error;
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_set_dim_name(__isl_take isl_map *map,
-	enum isl_dim_type type, unsigned pos, const char *s)
-{
-	int i;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	map->dim = isl_space_set_dim_name(map->dim, type, pos, s);
-	if (!map->dim)
-		goto error;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_set_dim_name(map->p[i], type, pos, s);
-		if (!map->p[i])
-			goto error;
-	}
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_set_dim_name(
-	__isl_take isl_basic_set *bset,
-	enum isl_dim_type type, unsigned pos, const char *s)
-{
-	return (isl_basic_set *)isl_basic_map_set_dim_name(
-		(isl_basic_map *)bset, type, pos, s);
-}
-
-__isl_give isl_set *isl_set_set_dim_name(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned pos, const char *s)
-{
-	return (isl_set *)isl_map_set_dim_name((isl_map *)set, type, pos, s);
-}
-
-int isl_basic_map_has_dim_id(__isl_keep isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned pos)
-{
-	return bmap ? isl_space_has_dim_id(bmap->dim, type, pos) : -1;
-}
-
-int isl_map_has_dim_id(__isl_keep isl_map *map,
-	enum isl_dim_type type, unsigned pos)
-{
-	return map ? isl_space_has_dim_id(map->dim, type, pos) : -1;
-}
-
-__isl_give isl_id *isl_map_get_dim_id(__isl_keep isl_map *map,
-	enum isl_dim_type type, unsigned pos)
-{
-	return map ? isl_space_get_dim_id(map->dim, type, pos) : NULL;
-}
-
-int isl_set_has_dim_id(__isl_keep isl_set *set,
-	enum isl_dim_type type, unsigned pos)
-{
-	return isl_map_has_dim_id(set, type, pos);
-}
-
-__isl_give isl_id *isl_set_get_dim_id(__isl_keep isl_set *set,
-	enum isl_dim_type type, unsigned pos)
-{
-	return isl_map_get_dim_id(set, type, pos);
-}
-
-__isl_give isl_map *isl_map_set_dim_id(__isl_take isl_map *map,
-	enum isl_dim_type type, unsigned pos, __isl_take isl_id *id)
-{
-	map = isl_map_cow(map);
-	if (!map)
-		return isl_id_free(id);
-
-	map->dim = isl_space_set_dim_id(map->dim, type, pos, id);
-
-	return isl_map_reset_space(map, isl_space_copy(map->dim));
-}
-
-__isl_give isl_set *isl_set_set_dim_id(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned pos, __isl_take isl_id *id)
-{
-	return isl_map_set_dim_id(set, type, pos, id);
-}
-
-int isl_map_find_dim_by_id(__isl_keep isl_map *map, enum isl_dim_type type,
-	__isl_keep isl_id *id)
-{
-	if (!map)
-		return -1;
-	return isl_space_find_dim_by_id(map->dim, type, id);
-}
-
-int isl_set_find_dim_by_id(__isl_keep isl_set *set, enum isl_dim_type type,
-	__isl_keep isl_id *id)
-{
-	return isl_map_find_dim_by_id(set, type, id);
-}
-
-int isl_map_find_dim_by_name(__isl_keep isl_map *map, enum isl_dim_type type,
-	const char *name)
-{
-	if (!map)
-		return -1;
-	return isl_space_find_dim_by_name(map->dim, type, name);
-}
-
-int isl_set_find_dim_by_name(__isl_keep isl_set *set, enum isl_dim_type type,
-	const char *name)
-{
-	return isl_map_find_dim_by_name(set, type, name);
-}
-
-int isl_basic_map_is_rational(__isl_keep isl_basic_map *bmap)
-{
-	if (!bmap)
-		return -1;
-	return ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL);
-}
-
-int isl_basic_set_is_rational(__isl_keep isl_basic_set *bset)
-{
-	return isl_basic_map_is_rational(bset);
-}
-
-/* Is this basic set a parameter domain?
- */
-int isl_basic_set_is_params(__isl_keep isl_basic_set *bset)
-{
-	if (!bset)
-		return -1;
-	return isl_space_is_params(bset->dim);
-}
-
-/* Is this set a parameter domain?
- */
-int isl_set_is_params(__isl_keep isl_set *set)
-{
-	if (!set)
-		return -1;
-	return isl_space_is_params(set->dim);
-}
-
-/* Is this map actually a parameter domain?
- * Users should never call this function.  Outside of isl,
- * a map can never be a parameter domain.
- */
-int isl_map_is_params(__isl_keep isl_map *map)
-{
-	if (!map)
-		return -1;
-	return isl_space_is_params(map->dim);
-}
-
-static struct isl_basic_map *basic_map_init(struct isl_ctx *ctx,
-		struct isl_basic_map *bmap, unsigned extra,
-		unsigned n_eq, unsigned n_ineq)
-{
-	int i;
-	size_t row_size = 1 + isl_space_dim(bmap->dim, isl_dim_all) + extra;
-
-	bmap->ctx = ctx;
-	isl_ctx_ref(ctx);
-
-	bmap->block = isl_blk_alloc(ctx, (n_ineq + n_eq) * row_size);
-	if (isl_blk_is_error(bmap->block))
-		goto error;
-
-	bmap->ineq = isl_alloc_array(ctx, isl_int *, n_ineq + n_eq);
-	if (!bmap->ineq)
-		goto error;
-
-	if (extra == 0) {
-		bmap->block2 = isl_blk_empty();
-		bmap->div = NULL;
-	} else {
-		bmap->block2 = isl_blk_alloc(ctx, extra * (1 + row_size));
-		if (isl_blk_is_error(bmap->block2))
-			goto error;
-
-		bmap->div = isl_alloc_array(ctx, isl_int *, extra);
-		if (!bmap->div)
-			goto error;
-	}
-
-	for (i = 0; i < n_ineq + n_eq; ++i)
-		bmap->ineq[i] = bmap->block.data + i * row_size;
-
-	for (i = 0; i < extra; ++i)
-		bmap->div[i] = bmap->block2.data + i * (1 + row_size);
-
-	bmap->ref = 1;
-	bmap->flags = 0;
-	bmap->c_size = n_eq + n_ineq;
-	bmap->eq = bmap->ineq + n_ineq;
-	bmap->extra = extra;
-	bmap->n_eq = 0;
-	bmap->n_ineq = 0;
-	bmap->n_div = 0;
-	bmap->sample = NULL;
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_alloc(struct isl_ctx *ctx,
-		unsigned nparam, unsigned dim, unsigned extra,
-		unsigned n_eq, unsigned n_ineq)
-{
-	struct isl_basic_map *bmap;
-	isl_space *space;
-
-	space = isl_space_set_alloc(ctx, nparam, dim);
-	if (!space)
-		return NULL;
-
-	bmap = isl_basic_map_alloc_space(space, extra, n_eq, n_ineq);
-	return (struct isl_basic_set *)bmap;
-}
-
-struct isl_basic_set *isl_basic_set_alloc_space(__isl_take isl_space *dim,
-		unsigned extra, unsigned n_eq, unsigned n_ineq)
-{
-	struct isl_basic_map *bmap;
-	if (!dim)
-		return NULL;
-	isl_assert(dim->ctx, dim->n_in == 0, goto error);
-	bmap = isl_basic_map_alloc_space(dim, extra, n_eq, n_ineq);
-	return (struct isl_basic_set *)bmap;
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-struct isl_basic_map *isl_basic_map_alloc_space(__isl_take isl_space *dim,
-		unsigned extra, unsigned n_eq, unsigned n_ineq)
-{
-	struct isl_basic_map *bmap;
-
-	if (!dim)
-		return NULL;
-	bmap = isl_calloc_type(dim->ctx, struct isl_basic_map);
-	if (!bmap)
-		goto error;
-	bmap->dim = dim;
-
-	return basic_map_init(dim->ctx, bmap, extra, n_eq, n_ineq);
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-struct isl_basic_map *isl_basic_map_alloc(struct isl_ctx *ctx,
-		unsigned nparam, unsigned in, unsigned out, unsigned extra,
-		unsigned n_eq, unsigned n_ineq)
-{
-	struct isl_basic_map *bmap;
-	isl_space *dim;
-
-	dim = isl_space_alloc(ctx, nparam, in, out);
-	if (!dim)
-		return NULL;
-
-	bmap = isl_basic_map_alloc_space(dim, extra, n_eq, n_ineq);
-	return bmap;
-}
-
-static void dup_constraints(
-		struct isl_basic_map *dst, struct isl_basic_map *src)
-{
-	int i;
-	unsigned total = isl_basic_map_total_dim(src);
-
-	for (i = 0; i < src->n_eq; ++i) {
-		int j = isl_basic_map_alloc_equality(dst);
-		isl_seq_cpy(dst->eq[j], src->eq[i], 1+total);
-	}
-
-	for (i = 0; i < src->n_ineq; ++i) {
-		int j = isl_basic_map_alloc_inequality(dst);
-		isl_seq_cpy(dst->ineq[j], src->ineq[i], 1+total);
-	}
-
-	for (i = 0; i < src->n_div; ++i) {
-		int j = isl_basic_map_alloc_div(dst);
-		isl_seq_cpy(dst->div[j], src->div[i], 1+1+total);
-	}
-	ISL_F_SET(dst, ISL_BASIC_SET_FINAL);
-}
-
-struct isl_basic_map *isl_basic_map_dup(struct isl_basic_map *bmap)
-{
-	struct isl_basic_map *dup;
-
-	if (!bmap)
-		return NULL;
-	dup = isl_basic_map_alloc_space(isl_space_copy(bmap->dim),
-			bmap->n_div, bmap->n_eq, bmap->n_ineq);
-	if (!dup)
-		return NULL;
-	dup_constraints(dup, bmap);
-	dup->flags = bmap->flags;
-	dup->sample = isl_vec_copy(bmap->sample);
-	return dup;
-}
-
-struct isl_basic_set *isl_basic_set_dup(struct isl_basic_set *bset)
-{
-	struct isl_basic_map *dup;
-
-	dup = isl_basic_map_dup((struct isl_basic_map *)bset);
-	return (struct isl_basic_set *)dup;
-}
-
-struct isl_basic_set *isl_basic_set_copy(struct isl_basic_set *bset)
-{
-	if (!bset)
-		return NULL;
-
-	if (ISL_F_ISSET(bset, ISL_BASIC_SET_FINAL)) {
-		bset->ref++;
-		return bset;
-	}
-	return isl_basic_set_dup(bset);
-}
-
-struct isl_set *isl_set_copy(struct isl_set *set)
-{
-	if (!set)
-		return NULL;
-
-	set->ref++;
-	return set;
-}
-
-struct isl_basic_map *isl_basic_map_copy(struct isl_basic_map *bmap)
-{
-	if (!bmap)
-		return NULL;
-
-	if (ISL_F_ISSET(bmap, ISL_BASIC_SET_FINAL)) {
-		bmap->ref++;
-		return bmap;
-	}
-	bmap = isl_basic_map_dup(bmap);
-	if (bmap)
-		ISL_F_SET(bmap, ISL_BASIC_SET_FINAL);
-	return bmap;
-}
-
-struct isl_map *isl_map_copy(struct isl_map *map)
-{
-	if (!map)
-		return NULL;
-
-	map->ref++;
-	return map;
-}
-
-void isl_basic_map_free(struct isl_basic_map *bmap)
-{
-	if (!bmap)
-		return;
-
-	if (--bmap->ref > 0)
-		return;
-
-	isl_ctx_deref(bmap->ctx);
-	free(bmap->div);
-	isl_blk_free(bmap->ctx, bmap->block2);
-	free(bmap->ineq);
-	isl_blk_free(bmap->ctx, bmap->block);
-	isl_vec_free(bmap->sample);
-	isl_space_free(bmap->dim);
-	free(bmap);
-}
-
-void isl_basic_set_free(struct isl_basic_set *bset)
-{
-	isl_basic_map_free((struct isl_basic_map *)bset);
-}
-
-static int room_for_con(struct isl_basic_map *bmap, unsigned n)
-{
-	return bmap->n_eq + bmap->n_ineq + n <= bmap->c_size;
-}
-
-__isl_give isl_map *isl_map_align_params_map_map_and(
-	__isl_take isl_map *map1, __isl_take isl_map *map2,
-	__isl_give isl_map *(*fn)(__isl_take isl_map *map1,
-				    __isl_take isl_map *map2))
-{
-	if (!map1 || !map2)
-		goto error;
-	if (isl_space_match(map1->dim, isl_dim_param, map2->dim, isl_dim_param))
-		return fn(map1, map2);
-	if (!isl_space_has_named_params(map1->dim) ||
-	    !isl_space_has_named_params(map2->dim))
-		isl_die(map1->ctx, isl_error_invalid,
-			"unaligned unnamed parameters", goto error);
-	map1 = isl_map_align_params(map1, isl_map_get_space(map2));
-	map2 = isl_map_align_params(map2, isl_map_get_space(map1));
-	return fn(map1, map2);
-error:
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return NULL;
-}
-
-int isl_map_align_params_map_map_and_test(__isl_keep isl_map *map1,
-	__isl_keep isl_map *map2,
-	int (*fn)(__isl_keep isl_map *map1, __isl_keep isl_map *map2))
-{
-	int r;
-
-	if (!map1 || !map2)
-		return -1;
-	if (isl_space_match(map1->dim, isl_dim_param, map2->dim, isl_dim_param))
-		return fn(map1, map2);
-	if (!isl_space_has_named_params(map1->dim) ||
-	    !isl_space_has_named_params(map2->dim))
-		isl_die(map1->ctx, isl_error_invalid,
-			"unaligned unnamed parameters", return -1);
-	map1 = isl_map_copy(map1);
-	map2 = isl_map_copy(map2);
-	map1 = isl_map_align_params(map1, isl_map_get_space(map2));
-	map2 = isl_map_align_params(map2, isl_map_get_space(map1));
-	r = fn(map1, map2);
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return r;
-}
-
-int isl_basic_map_alloc_equality(struct isl_basic_map *bmap)
-{
-	struct isl_ctx *ctx;
-	if (!bmap)
-		return -1;
-	ctx = bmap->ctx;
-	isl_assert(ctx, room_for_con(bmap, 1), return -1);
-	isl_assert(ctx, (bmap->eq - bmap->ineq) + bmap->n_eq <= bmap->c_size,
-			return -1);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NO_REDUNDANT);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NO_IMPLICIT);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_ALL_EQUALITIES);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED_DIVS);
-	if ((bmap->eq - bmap->ineq) + bmap->n_eq == bmap->c_size) {
-		isl_int *t;
-		int j = isl_basic_map_alloc_inequality(bmap);
-		if (j < 0)
-			return -1;
-		t = bmap->ineq[j];
-		bmap->ineq[j] = bmap->ineq[bmap->n_ineq - 1];
-		bmap->ineq[bmap->n_ineq - 1] = bmap->eq[-1];
-		bmap->eq[-1] = t;
-		bmap->n_eq++;
-		bmap->n_ineq--;
-		bmap->eq--;
-		return 0;
-	}
-	isl_seq_clr(bmap->eq[bmap->n_eq] + 1 + isl_basic_map_total_dim(bmap),
-		      bmap->extra - bmap->n_div);
-	return bmap->n_eq++;
-}
-
-int isl_basic_set_alloc_equality(struct isl_basic_set *bset)
-{
-	return isl_basic_map_alloc_equality((struct isl_basic_map *)bset);
-}
-
-int isl_basic_map_free_equality(struct isl_basic_map *bmap, unsigned n)
-{
-	if (!bmap)
-		return -1;
-	isl_assert(bmap->ctx, n <= bmap->n_eq, return -1);
-	bmap->n_eq -= n;
-	return 0;
-}
-
-int isl_basic_set_free_equality(struct isl_basic_set *bset, unsigned n)
-{
-	return isl_basic_map_free_equality((struct isl_basic_map *)bset, n);
-}
-
-int isl_basic_map_drop_equality(struct isl_basic_map *bmap, unsigned pos)
-{
-	isl_int *t;
-	if (!bmap)
-		return -1;
-	isl_assert(bmap->ctx, pos < bmap->n_eq, return -1);
-
-	if (pos != bmap->n_eq - 1) {
-		t = bmap->eq[pos];
-		bmap->eq[pos] = bmap->eq[bmap->n_eq - 1];
-		bmap->eq[bmap->n_eq - 1] = t;
-	}
-	bmap->n_eq--;
-	return 0;
-}
-
-int isl_basic_set_drop_equality(struct isl_basic_set *bset, unsigned pos)
-{
-	return isl_basic_map_drop_equality((struct isl_basic_map *)bset, pos);
-}
-
-void isl_basic_map_inequality_to_equality(
-		struct isl_basic_map *bmap, unsigned pos)
-{
-	isl_int *t;
-
-	t = bmap->ineq[pos];
-	bmap->ineq[pos] = bmap->ineq[bmap->n_ineq - 1];
-	bmap->ineq[bmap->n_ineq - 1] = bmap->eq[-1];
-	bmap->eq[-1] = t;
-	bmap->n_eq++;
-	bmap->n_ineq--;
-	bmap->eq--;
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NO_REDUNDANT);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED_DIVS);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_ALL_EQUALITIES);
-}
-
-static int room_for_ineq(struct isl_basic_map *bmap, unsigned n)
-{
-	return bmap->n_ineq + n <= bmap->eq - bmap->ineq;
-}
-
-int isl_basic_map_alloc_inequality(struct isl_basic_map *bmap)
-{
-	struct isl_ctx *ctx;
-	if (!bmap)
-		return -1;
-	ctx = bmap->ctx;
-	isl_assert(ctx, room_for_ineq(bmap, 1), return -1);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NO_IMPLICIT);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NO_REDUNDANT);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_ALL_EQUALITIES);
-	isl_seq_clr(bmap->ineq[bmap->n_ineq] +
-		      1 + isl_basic_map_total_dim(bmap),
-		      bmap->extra - bmap->n_div);
-	return bmap->n_ineq++;
-}
-
-int isl_basic_set_alloc_inequality(struct isl_basic_set *bset)
-{
-	return isl_basic_map_alloc_inequality((struct isl_basic_map *)bset);
-}
-
-int isl_basic_map_free_inequality(struct isl_basic_map *bmap, unsigned n)
-{
-	if (!bmap)
-		return -1;
-	isl_assert(bmap->ctx, n <= bmap->n_ineq, return -1);
-	bmap->n_ineq -= n;
-	return 0;
-}
-
-int isl_basic_set_free_inequality(struct isl_basic_set *bset, unsigned n)
-{
-	return isl_basic_map_free_inequality((struct isl_basic_map *)bset, n);
-}
-
-int isl_basic_map_drop_inequality(struct isl_basic_map *bmap, unsigned pos)
-{
-	isl_int *t;
-	if (!bmap)
-		return -1;
-	isl_assert(bmap->ctx, pos < bmap->n_ineq, return -1);
-
-	if (pos != bmap->n_ineq - 1) {
-		t = bmap->ineq[pos];
-		bmap->ineq[pos] = bmap->ineq[bmap->n_ineq - 1];
-		bmap->ineq[bmap->n_ineq - 1] = t;
-		ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-	}
-	bmap->n_ineq--;
-	return 0;
-}
-
-int isl_basic_set_drop_inequality(struct isl_basic_set *bset, unsigned pos)
-{
-	return isl_basic_map_drop_inequality((struct isl_basic_map *)bset, pos);
-}
-
-__isl_give isl_basic_map *isl_basic_map_add_eq(__isl_take isl_basic_map *bmap,
-	isl_int *eq)
-{
-	int k;
-
-	bmap = isl_basic_map_extend_constraints(bmap, 1, 0);
-	if (!bmap)
-		return NULL;
-	k = isl_basic_map_alloc_equality(bmap);
-	if (k < 0)
-		goto error;
-	isl_seq_cpy(bmap->eq[k], eq, 1 + isl_basic_map_total_dim(bmap));
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_add_eq(__isl_take isl_basic_set *bset,
-	isl_int *eq)
-{
-	return (isl_basic_set *)
-		isl_basic_map_add_eq((isl_basic_map *)bset, eq);
-}
-
-__isl_give isl_basic_map *isl_basic_map_add_ineq(__isl_take isl_basic_map *bmap,
-	isl_int *ineq)
-{
-	int k;
-
-	bmap = isl_basic_map_extend_constraints(bmap, 0, 1);
-	if (!bmap)
-		return NULL;
-	k = isl_basic_map_alloc_inequality(bmap);
-	if (k < 0)
-		goto error;
-	isl_seq_cpy(bmap->ineq[k], ineq, 1 + isl_basic_map_total_dim(bmap));
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_add_ineq(__isl_take isl_basic_set *bset,
-	isl_int *ineq)
-{
-	return (isl_basic_set *)
-		isl_basic_map_add_ineq((isl_basic_map *)bset, ineq);
-}
-
-int isl_basic_map_alloc_div(struct isl_basic_map *bmap)
-{
-	if (!bmap)
-		return -1;
-	isl_assert(bmap->ctx, bmap->n_div < bmap->extra, return -1);
-	isl_seq_clr(bmap->div[bmap->n_div] +
-		      1 + 1 + isl_basic_map_total_dim(bmap),
-		      bmap->extra - bmap->n_div);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED_DIVS);
-	return bmap->n_div++;
-}
-
-int isl_basic_set_alloc_div(struct isl_basic_set *bset)
-{
-	return isl_basic_map_alloc_div((struct isl_basic_map *)bset);
-}
-
-int isl_basic_map_free_div(struct isl_basic_map *bmap, unsigned n)
-{
-	if (!bmap)
-		return -1;
-	isl_assert(bmap->ctx, n <= bmap->n_div, return -1);
-	bmap->n_div -= n;
-	return 0;
-}
-
-int isl_basic_set_free_div(struct isl_basic_set *bset, unsigned n)
-{
-	return isl_basic_map_free_div((struct isl_basic_map *)bset, n);
-}
-
-/* Copy constraint from src to dst, putting the vars of src at offset
- * dim_off in dst and the divs of src at offset div_off in dst.
- * If both sets are actually map, then dim_off applies to the input
- * variables.
- */
-static void copy_constraint(struct isl_basic_map *dst_map, isl_int *dst,
-			    struct isl_basic_map *src_map, isl_int *src,
-			    unsigned in_off, unsigned out_off, unsigned div_off)
-{
-	unsigned src_nparam = isl_basic_map_n_param(src_map);
-	unsigned dst_nparam = isl_basic_map_n_param(dst_map);
-	unsigned src_in = isl_basic_map_n_in(src_map);
-	unsigned dst_in = isl_basic_map_n_in(dst_map);
-	unsigned src_out = isl_basic_map_n_out(src_map);
-	unsigned dst_out = isl_basic_map_n_out(dst_map);
-	isl_int_set(dst[0], src[0]);
-	isl_seq_cpy(dst+1, src+1, isl_min(dst_nparam, src_nparam));
-	if (dst_nparam > src_nparam)
-		isl_seq_clr(dst+1+src_nparam,
-				dst_nparam - src_nparam);
-	isl_seq_clr(dst+1+dst_nparam, in_off);
-	isl_seq_cpy(dst+1+dst_nparam+in_off,
-		    src+1+src_nparam,
-		    isl_min(dst_in-in_off, src_in));
-	if (dst_in-in_off > src_in)
-		isl_seq_clr(dst+1+dst_nparam+in_off+src_in,
-				dst_in - in_off - src_in);
-	isl_seq_clr(dst+1+dst_nparam+dst_in, out_off);
-	isl_seq_cpy(dst+1+dst_nparam+dst_in+out_off,
-		    src+1+src_nparam+src_in,
-		    isl_min(dst_out-out_off, src_out));
-	if (dst_out-out_off > src_out)
-		isl_seq_clr(dst+1+dst_nparam+dst_in+out_off+src_out,
-				dst_out - out_off - src_out);
-	isl_seq_clr(dst+1+dst_nparam+dst_in+dst_out, div_off);
-	isl_seq_cpy(dst+1+dst_nparam+dst_in+dst_out+div_off,
-		    src+1+src_nparam+src_in+src_out,
-		    isl_min(dst_map->extra-div_off, src_map->n_div));
-	if (dst_map->n_div-div_off > src_map->n_div)
-		isl_seq_clr(dst+1+dst_nparam+dst_in+dst_out+
-				div_off+src_map->n_div,
-				dst_map->n_div - div_off - src_map->n_div);
-}
-
-static void copy_div(struct isl_basic_map *dst_map, isl_int *dst,
-		     struct isl_basic_map *src_map, isl_int *src,
-		     unsigned in_off, unsigned out_off, unsigned div_off)
-{
-	isl_int_set(dst[0], src[0]);
-	copy_constraint(dst_map, dst+1, src_map, src+1, in_off, out_off, div_off);
-}
-
-static struct isl_basic_map *add_constraints(struct isl_basic_map *bmap1,
-		struct isl_basic_map *bmap2, unsigned i_pos, unsigned o_pos)
-{
-	int i;
-	unsigned div_off;
-
-	if (!bmap1 || !bmap2)
-		goto error;
-
-	div_off = bmap1->n_div;
-
-	for (i = 0; i < bmap2->n_eq; ++i) {
-		int i1 = isl_basic_map_alloc_equality(bmap1);
-		if (i1 < 0)
-			goto error;
-		copy_constraint(bmap1, bmap1->eq[i1], bmap2, bmap2->eq[i],
-				i_pos, o_pos, div_off);
-	}
-
-	for (i = 0; i < bmap2->n_ineq; ++i) {
-		int i1 = isl_basic_map_alloc_inequality(bmap1);
-		if (i1 < 0)
-			goto error;
-		copy_constraint(bmap1, bmap1->ineq[i1], bmap2, bmap2->ineq[i],
-				i_pos, o_pos, div_off);
-	}
-
-	for (i = 0; i < bmap2->n_div; ++i) {
-		int i1 = isl_basic_map_alloc_div(bmap1);
-		if (i1 < 0)
-			goto error;
-		copy_div(bmap1, bmap1->div[i1], bmap2, bmap2->div[i],
-			 i_pos, o_pos, div_off);
-	}
-
-	isl_basic_map_free(bmap2);
-
-	return bmap1;
-
-error:
-	isl_basic_map_free(bmap1);
-	isl_basic_map_free(bmap2);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_add_constraints(struct isl_basic_set *bset1,
-		struct isl_basic_set *bset2, unsigned pos)
-{
-	return (struct isl_basic_set *)
-		add_constraints((struct isl_basic_map *)bset1,
-				(struct isl_basic_map *)bset2, 0, pos);
-}
-
-struct isl_basic_map *isl_basic_map_extend_space(struct isl_basic_map *base,
-		__isl_take isl_space *dim, unsigned extra,
-		unsigned n_eq, unsigned n_ineq)
-{
-	struct isl_basic_map *ext;
-	unsigned flags;
-	int dims_ok;
-
-	if (!dim)
-		goto error;
-
-	if (!base)
-		goto error;
-
-	dims_ok = isl_space_is_equal(base->dim, dim) &&
-		  base->extra >= base->n_div + extra;
-
-	if (dims_ok && room_for_con(base, n_eq + n_ineq) &&
-		       room_for_ineq(base, n_ineq)) {
-		isl_space_free(dim);
-		return base;
-	}
-
-	isl_assert(base->ctx, base->dim->nparam <= dim->nparam, goto error);
-	isl_assert(base->ctx, base->dim->n_in <= dim->n_in, goto error);
-	isl_assert(base->ctx, base->dim->n_out <= dim->n_out, goto error);
-	extra += base->extra;
-	n_eq += base->n_eq;
-	n_ineq += base->n_ineq;
-
-	ext = isl_basic_map_alloc_space(dim, extra, n_eq, n_ineq);
-	dim = NULL;
-	if (!ext)
-		goto error;
-
-	if (dims_ok)
-		ext->sample = isl_vec_copy(base->sample);
-	flags = base->flags;
-	ext = add_constraints(ext, base, 0, 0);
-	if (ext) {
-		ext->flags = flags;
-		ISL_F_CLR(ext, ISL_BASIC_SET_FINAL);
-	}
-
-	return ext;
-
-error:
-	isl_space_free(dim);
-	isl_basic_map_free(base);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_extend_space(struct isl_basic_set *base,
-		__isl_take isl_space *dim, unsigned extra,
-		unsigned n_eq, unsigned n_ineq)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_extend_space((struct isl_basic_map *)base, dim,
-							extra, n_eq, n_ineq);
-}
-
-struct isl_basic_map *isl_basic_map_extend_constraints(
-		struct isl_basic_map *base, unsigned n_eq, unsigned n_ineq)
-{
-	if (!base)
-		return NULL;
-	return isl_basic_map_extend_space(base, isl_space_copy(base->dim),
-					0, n_eq, n_ineq);
-}
-
-struct isl_basic_map *isl_basic_map_extend(struct isl_basic_map *base,
-		unsigned nparam, unsigned n_in, unsigned n_out, unsigned extra,
-		unsigned n_eq, unsigned n_ineq)
-{
-	struct isl_basic_map *bmap;
-	isl_space *dim;
-
-	if (!base)
-		return NULL;
-	dim = isl_space_alloc(base->ctx, nparam, n_in, n_out);
-	if (!dim)
-		goto error;
-
-	bmap = isl_basic_map_extend_space(base, dim, extra, n_eq, n_ineq);
-	return bmap;
-error:
-	isl_basic_map_free(base);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_extend(struct isl_basic_set *base,
-		unsigned nparam, unsigned dim, unsigned extra,
-		unsigned n_eq, unsigned n_ineq)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_extend((struct isl_basic_map *)base,
-					nparam, 0, dim, extra, n_eq, n_ineq);
-}
-
-struct isl_basic_set *isl_basic_set_extend_constraints(
-		struct isl_basic_set *base, unsigned n_eq, unsigned n_ineq)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_extend_constraints((struct isl_basic_map *)base,
-						    n_eq, n_ineq);
-}
-
-struct isl_basic_set *isl_basic_set_cow(struct isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_cow((struct isl_basic_map *)bset);
-}
-
-struct isl_basic_map *isl_basic_map_cow(struct isl_basic_map *bmap)
-{
-	if (!bmap)
-		return NULL;
-
-	if (bmap->ref > 1) {
-		bmap->ref--;
-		bmap = isl_basic_map_dup(bmap);
-	}
-	if (bmap)
-		ISL_F_CLR(bmap, ISL_BASIC_SET_FINAL);
-	return bmap;
-}
-
-struct isl_set *isl_set_cow(struct isl_set *set)
-{
-	if (!set)
-		return NULL;
-
-	if (set->ref == 1)
-		return set;
-	set->ref--;
-	return isl_set_dup(set);
-}
-
-struct isl_map *isl_map_cow(struct isl_map *map)
-{
-	if (!map)
-		return NULL;
-
-	if (map->ref == 1)
-		return map;
-	map->ref--;
-	return isl_map_dup(map);
-}
-
-static void swap_vars(struct isl_blk blk, isl_int *a,
-			unsigned a_len, unsigned b_len)
-{
-	isl_seq_cpy(blk.data, a+a_len, b_len);
-	isl_seq_cpy(blk.data+b_len, a, a_len);
-	isl_seq_cpy(a, blk.data, b_len+a_len);
-}
-
-static __isl_give isl_basic_map *isl_basic_map_swap_vars(
-	__isl_take isl_basic_map *bmap, unsigned pos, unsigned n1, unsigned n2)
-{
-	int i;
-	struct isl_blk blk;
-
-	if (!bmap)
-		goto error;
-
-	isl_assert(bmap->ctx,
-		pos + n1 + n2 <= 1 + isl_basic_map_total_dim(bmap), goto error);
-
-	if (n1 == 0 || n2 == 0)
-		return bmap;
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-
-	blk = isl_blk_alloc(bmap->ctx, n1 + n2);
-	if (isl_blk_is_error(blk))
-		goto error;
-
-	for (i = 0; i < bmap->n_eq; ++i)
-		swap_vars(blk,
-			  bmap->eq[i] + pos, n1, n2);
-
-	for (i = 0; i < bmap->n_ineq; ++i)
-		swap_vars(blk,
-			  bmap->ineq[i] + pos, n1, n2);
-
-	for (i = 0; i < bmap->n_div; ++i)
-		swap_vars(blk,
-			  bmap->div[i]+1 + pos, n1, n2);
-
-	isl_blk_free(bmap->ctx, blk);
-
-	ISL_F_CLR(bmap, ISL_BASIC_SET_NORMALIZED);
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static __isl_give isl_basic_set *isl_basic_set_swap_vars(
-	__isl_take isl_basic_set *bset, unsigned n)
-{
-	unsigned dim;
-	unsigned nparam;
-
-	nparam = isl_basic_set_n_param(bset);
-	dim = isl_basic_set_n_dim(bset);
-	isl_assert(bset->ctx, n <= dim, goto error);
-
-	return isl_basic_map_swap_vars(bset, 1 + nparam, n, dim - n);
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-struct isl_basic_map *isl_basic_map_set_to_empty(struct isl_basic_map *bmap)
-{
-	int i = 0;
-	unsigned total;
-	if (!bmap)
-		goto error;
-	total = isl_basic_map_total_dim(bmap);
-	isl_basic_map_free_div(bmap, bmap->n_div);
-	isl_basic_map_free_inequality(bmap, bmap->n_ineq);
-	if (bmap->n_eq > 0)
-		isl_basic_map_free_equality(bmap, bmap->n_eq-1);
-	else {
-		i = isl_basic_map_alloc_equality(bmap);
-		if (i < 0)
-			goto error;
-	}
-	isl_int_set_si(bmap->eq[i][0], 1);
-	isl_seq_clr(bmap->eq[i]+1, total);
-	ISL_F_SET(bmap, ISL_BASIC_MAP_EMPTY);
-	isl_vec_free(bmap->sample);
-	bmap->sample = NULL;
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_set_to_empty(struct isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_set_to_empty((struct isl_basic_map *)bset);
-}
-
-void isl_basic_map_swap_div(struct isl_basic_map *bmap, int a, int b)
-{
-	int i;
-	unsigned off = isl_space_dim(bmap->dim, isl_dim_all);
-	isl_int *t = bmap->div[a];
-	bmap->div[a] = bmap->div[b];
-	bmap->div[b] = t;
-
-	for (i = 0; i < bmap->n_eq; ++i)
-		isl_int_swap(bmap->eq[i][1+off+a], bmap->eq[i][1+off+b]);
-
-	for (i = 0; i < bmap->n_ineq; ++i)
-		isl_int_swap(bmap->ineq[i][1+off+a], bmap->ineq[i][1+off+b]);
-
-	for (i = 0; i < bmap->n_div; ++i)
-		isl_int_swap(bmap->div[i][1+1+off+a], bmap->div[i][1+1+off+b]);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-}
-
-/* Eliminate the specified n dimensions starting at first from the
- * constraints using Fourier-Motzkin.  The dimensions themselves
- * are not removed.
- */
-__isl_give isl_map *isl_map_eliminate(__isl_take isl_map *map,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-	if (n == 0)
-		return map;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_eliminate(map->p[i], type, first, n);
-		if (!map->p[i])
-			goto error;
-	}
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Eliminate the specified n dimensions starting at first from the
- * constraints using Fourier-Motzkin.  The dimensions themselves
- * are not removed.
- */
-__isl_give isl_set *isl_set_eliminate(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	return (isl_set *)isl_map_eliminate((isl_map *)set, type, first, n);
-}
-
-/* Eliminate the specified n dimensions starting at first from the
- * constraints using Fourier-Motzkin.  The dimensions themselves
- * are not removed.
- */
-__isl_give isl_set *isl_set_eliminate_dims(__isl_take isl_set *set,
-	unsigned first, unsigned n)
-{
-	return isl_set_eliminate(set, isl_dim_set, first, n);
-}
-
-__isl_give isl_basic_map *isl_basic_map_remove_divs(
-	__isl_take isl_basic_map *bmap)
-{
-	if (!bmap)
-		return NULL;
-	bmap = isl_basic_map_eliminate_vars(bmap,
-			    isl_space_dim(bmap->dim, isl_dim_all), bmap->n_div);
-	if (!bmap)
-		return NULL;
-	bmap->n_div = 0;
-	return isl_basic_map_finalize(bmap);
-}
-
-__isl_give isl_basic_set *isl_basic_set_remove_divs(
-	__isl_take isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)isl_basic_map_remove_divs(
-			(struct isl_basic_map *)bset);
-}
-
-__isl_give isl_map *isl_map_remove_divs(__isl_take isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-	if (map->n == 0)
-		return map;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-	
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_remove_divs(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_remove_divs(__isl_take isl_set *set)
-{
-	return isl_map_remove_divs(set);
-}
-
-struct isl_basic_map *isl_basic_map_remove_dims(struct isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	if (!bmap)
-		return NULL;
-	isl_assert(bmap->ctx, first + n <= isl_basic_map_dim(bmap, type),
-			goto error);
-	if (n == 0 && !isl_space_is_named_or_nested(bmap->dim, type))
-		return bmap;
-	bmap = isl_basic_map_eliminate_vars(bmap,
-			isl_basic_map_offset(bmap, type) - 1 + first, n);
-	if (!bmap)
-		return bmap;
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY) && type == isl_dim_div)
-		return bmap;
-	bmap = isl_basic_map_drop(bmap, type, first, n);
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Return true if the definition of the given div (recursively) involves
- * any of the given variables.
- */
-static int div_involves_vars(__isl_keep isl_basic_map *bmap, int div,
-	unsigned first, unsigned n)
-{
-	int i;
-	unsigned div_offset = isl_basic_map_offset(bmap, isl_dim_div);
-
-	if (isl_int_is_zero(bmap->div[div][0]))
-		return 0;
-	if (isl_seq_first_non_zero(bmap->div[div] + 1 + first, n) >= 0)
-		return 1;
-
-	for (i = bmap->n_div - 1; i >= 0; --i) {
-		if (isl_int_is_zero(bmap->div[div][1 + div_offset + i]))
-			continue;
-		if (div_involves_vars(bmap, i, first, n))
-			return 1;
-	}
-
-	return 0;
-}
-
-/* Remove all divs (recursively) involving any of the given dimensions
- * in their definitions.
- */
-__isl_give isl_basic_map *isl_basic_map_remove_divs_involving_dims(
-	__isl_take isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!bmap)
-		return NULL;
-	isl_assert(bmap->ctx, first + n <= isl_basic_map_dim(bmap, type),
-			goto error);
-	first += isl_basic_map_offset(bmap, type);
-
-	for (i = bmap->n_div - 1; i >= 0; --i) {
-		if (!div_involves_vars(bmap, i, first, n))
-			continue;
-		bmap = isl_basic_map_remove_dims(bmap, isl_dim_div, i, 1);
-		if (!bmap)
-			return NULL;
-		i = bmap->n_div;
-	}
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_remove_divs_involving_dims(__isl_take isl_map *map,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-	if (map->n == 0)
-		return map;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_remove_divs_involving_dims(map->p[i],
-								type, first, n);
-		if (!map->p[i])
-			goto error;
-	}
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_remove_divs_involving_dims(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	return (isl_set *)isl_map_remove_divs_involving_dims((isl_map *)set,
-							      type, first, n);
-}
-
-/* Does the desciption of "bmap" depend on the specified dimensions?
- * We also check whether the dimensions appear in any of the div definitions.
- * In principle there is no need for this check.  If the dimensions appear
- * in a div definition, they also appear in the defining constraints of that
- * div.
- */
-int isl_basic_map_involves_dims(__isl_keep isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!bmap)
-		return -1;
-
-	if (first + n > isl_basic_map_dim(bmap, type))
-		isl_die(bmap->ctx, isl_error_invalid,
-			"index out of bounds", return -1);
-
-	first += isl_basic_map_offset(bmap, type);
-	for (i = 0; i < bmap->n_eq; ++i)
-		if (isl_seq_first_non_zero(bmap->eq[i] + first, n) >= 0)
-			return 1;
-	for (i = 0; i < bmap->n_ineq; ++i)
-		if (isl_seq_first_non_zero(bmap->ineq[i] + first, n) >= 0)
-			return 1;
-	for (i = 0; i < bmap->n_div; ++i) {
-		if (isl_int_is_zero(bmap->div[i][0]))
-			continue;
-		if (isl_seq_first_non_zero(bmap->div[i] + 1 + first, n) >= 0)
-			return 1;
-	}
-
-	return 0;
-}
-
-int isl_map_involves_dims(__isl_keep isl_map *map,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!map)
-		return -1;
-
-	if (first + n > isl_map_dim(map, type))
-		isl_die(map->ctx, isl_error_invalid,
-			"index out of bounds", return -1);
-
-	for (i = 0; i < map->n; ++i) {
-		int involves = isl_basic_map_involves_dims(map->p[i],
-							    type, first, n);
-		if (involves < 0 || involves)
-			return involves;
-	}
-
-	return 0;
-}
-
-int isl_basic_set_involves_dims(__isl_keep isl_basic_set *bset,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	return isl_basic_map_involves_dims(bset, type, first, n);
-}
-
-int isl_set_involves_dims(__isl_keep isl_set *set,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	return isl_map_involves_dims(set, type, first, n);
-}
-
-/* Return true if the definition of the given div is unknown or depends
- * on unknown divs.
- */
-static int div_is_unknown(__isl_keep isl_basic_map *bmap, int div)
-{
-	int i;
-	unsigned div_offset = isl_basic_map_offset(bmap, isl_dim_div);
-
-	if (isl_int_is_zero(bmap->div[div][0]))
-		return 1;
-
-	for (i = bmap->n_div - 1; i >= 0; --i) {
-		if (isl_int_is_zero(bmap->div[div][1 + div_offset + i]))
-			continue;
-		if (div_is_unknown(bmap, i))
-			return 1;
-	}
-
-	return 0;
-}
-
-/* Remove all divs that are unknown or defined in terms of unknown divs.
- */
-__isl_give isl_basic_map *isl_basic_map_remove_unknown_divs(
-	__isl_take isl_basic_map *bmap)
-{
-	int i;
-
-	if (!bmap)
-		return NULL;
-
-	for (i = bmap->n_div - 1; i >= 0; --i) {
-		if (!div_is_unknown(bmap, i))
-			continue;
-		bmap = isl_basic_map_remove_dims(bmap, isl_dim_div, i, 1);
-	}
-
-	return bmap;
-}
-
-__isl_give isl_map *isl_map_remove_unknown_divs(__isl_take isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-	if (map->n == 0)
-		return map;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_remove_unknown_divs(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_remove_unknown_divs(__isl_take isl_set *set)
-{
-	return (isl_set *)isl_map_remove_unknown_divs((isl_map *)set);
-}
-
-__isl_give isl_basic_set *isl_basic_set_remove_dims(
-	__isl_take isl_basic_set *bset,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	return (isl_basic_set *)
-	    isl_basic_map_remove_dims((isl_basic_map *)bset, type, first, n);
-}
-
-struct isl_map *isl_map_remove_dims(struct isl_map *map,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (n == 0)
-		return map;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-	isl_assert(map->ctx, first + n <= isl_map_dim(map, type), goto error);
-	
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_eliminate_vars(map->p[i],
-			isl_basic_map_offset(map->p[i], type) - 1 + first, n);
-		if (!map->p[i])
-			goto error;
-	}
-	map = isl_map_drop(map, type, first, n);
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_remove_dims(__isl_take isl_set *bset,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	return (isl_set *)isl_map_remove_dims((isl_map *)bset, type, first, n);
-}
-
-/* Project out n inputs starting at first using Fourier-Motzkin */
-struct isl_map *isl_map_remove_inputs(struct isl_map *map,
-	unsigned first, unsigned n)
-{
-	return isl_map_remove_dims(map, isl_dim_in, first, n);
-}
-
-static void dump_term(struct isl_basic_map *bmap,
-			isl_int c, int pos, FILE *out)
-{
-	const char *name;
-	unsigned in = isl_basic_map_n_in(bmap);
-	unsigned dim = in + isl_basic_map_n_out(bmap);
-	unsigned nparam = isl_basic_map_n_param(bmap);
-	if (!pos)
-		isl_int_print(out, c, 0);
-	else {
-		if (!isl_int_is_one(c))
-			isl_int_print(out, c, 0);
-		if (pos < 1 + nparam) {
-			name = isl_space_get_dim_name(bmap->dim,
-						isl_dim_param, pos - 1);
-			if (name)
-				fprintf(out, "%s", name);
-			else
-				fprintf(out, "p%d", pos - 1);
-		} else if (pos < 1 + nparam + in)
-			fprintf(out, "i%d", pos - 1 - nparam);
-		else if (pos < 1 + nparam + dim)
-			fprintf(out, "o%d", pos - 1 - nparam - in);
-		else
-			fprintf(out, "e%d", pos - 1 - nparam - dim);
-	}
-}
-
-static void dump_constraint_sign(struct isl_basic_map *bmap, isl_int *c,
-				int sign, FILE *out)
-{
-	int i;
-	int first;
-	unsigned len = 1 + isl_basic_map_total_dim(bmap);
-	isl_int v;
-
-	isl_int_init(v);
-	for (i = 0, first = 1; i < len; ++i) {
-		if (isl_int_sgn(c[i]) * sign <= 0)
-			continue;
-		if (!first)
-			fprintf(out, " + ");
-		first = 0;
-		isl_int_abs(v, c[i]);
-		dump_term(bmap, v, i, out);
-	}
-	isl_int_clear(v);
-	if (first)
-		fprintf(out, "0");
-}
-
-static void dump_constraint(struct isl_basic_map *bmap, isl_int *c,
-				const char *op, FILE *out, int indent)
-{
-	int i;
-
-	fprintf(out, "%*s", indent, "");
-
-	dump_constraint_sign(bmap, c, 1, out);
-	fprintf(out, " %s ", op);
-	dump_constraint_sign(bmap, c, -1, out);
-
-	fprintf(out, "\n");
-
-	for (i = bmap->n_div; i < bmap->extra; ++i) {
-		if (isl_int_is_zero(c[1+isl_space_dim(bmap->dim, isl_dim_all)+i]))
-			continue;
-		fprintf(out, "%*s", indent, "");
-		fprintf(out, "ERROR: unused div coefficient not zero\n");
-		abort();
-	}
-}
-
-static void dump_constraints(struct isl_basic_map *bmap,
-				isl_int **c, unsigned n,
-				const char *op, FILE *out, int indent)
-{
-	int i;
-
-	for (i = 0; i < n; ++i)
-		dump_constraint(bmap, c[i], op, out, indent);
-}
-
-static void dump_affine(struct isl_basic_map *bmap, isl_int *exp, FILE *out)
-{
-	int j;
-	int first = 1;
-	unsigned total = isl_basic_map_total_dim(bmap);
-
-	for (j = 0; j < 1 + total; ++j) {
-		if (isl_int_is_zero(exp[j]))
-			continue;
-		if (!first && isl_int_is_pos(exp[j]))
-			fprintf(out, "+");
-		dump_term(bmap, exp[j], j, out);
-		first = 0;
-	}
-}
-
-static void dump(struct isl_basic_map *bmap, FILE *out, int indent)
-{
-	int i;
-
-	dump_constraints(bmap, bmap->eq, bmap->n_eq, "=", out, indent);
-	dump_constraints(bmap, bmap->ineq, bmap->n_ineq, ">=", out, indent);
-
-	for (i = 0; i < bmap->n_div; ++i) {
-		fprintf(out, "%*s", indent, "");
-		fprintf(out, "e%d = [(", i);
-		dump_affine(bmap, bmap->div[i]+1, out);
-		fprintf(out, ")/");
-		isl_int_print(out, bmap->div[i][0], 0);
-		fprintf(out, "]\n");
-	}
-}
-
-void isl_basic_set_print_internal(struct isl_basic_set *bset,
-	FILE *out, int indent)
-{
-	if (!bset) {
-		fprintf(out, "null basic set\n");
-		return;
-	}
-
-	fprintf(out, "%*s", indent, "");
-	fprintf(out, "ref: %d, nparam: %d, dim: %d, extra: %d, flags: %x\n",
-			bset->ref, bset->dim->nparam, bset->dim->n_out,
-			bset->extra, bset->flags);
-	dump((struct isl_basic_map *)bset, out, indent);
-}
-
-void isl_basic_map_print_internal(struct isl_basic_map *bmap,
-	FILE *out, int indent)
-{
-	if (!bmap) {
-		fprintf(out, "null basic map\n");
-		return;
-	}
-
-	fprintf(out, "%*s", indent, "");
-	fprintf(out, "ref: %d, nparam: %d, in: %d, out: %d, extra: %d, "
-			"flags: %x, n_name: %d\n",
-		bmap->ref,
-		bmap->dim->nparam, bmap->dim->n_in, bmap->dim->n_out,
-		bmap->extra, bmap->flags, bmap->dim->n_id);
-	dump(bmap, out, indent);
-}
-
-int isl_inequality_negate(struct isl_basic_map *bmap, unsigned pos)
-{
-	unsigned total;
-	if (!bmap)
-		return -1;
-	total = isl_basic_map_total_dim(bmap);
-	isl_assert(bmap->ctx, pos < bmap->n_ineq, return -1);
-	isl_seq_neg(bmap->ineq[pos], bmap->ineq[pos], 1 + total);
-	isl_int_sub_ui(bmap->ineq[pos][0], bmap->ineq[pos][0], 1);
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-	return 0;
-}
-
-__isl_give isl_set *isl_set_alloc_space(__isl_take isl_space *dim, int n,
-	unsigned flags)
-{
-	struct isl_set *set;
-
-	if (!dim)
-		return NULL;
-	isl_assert(dim->ctx, dim->n_in == 0, goto error);
-	isl_assert(dim->ctx, n >= 0, goto error);
-	set = isl_alloc(dim->ctx, struct isl_set,
-			sizeof(struct isl_set) +
-			(n - 1) * sizeof(struct isl_basic_set *));
-	if (!set)
-		goto error;
-
-	set->ctx = dim->ctx;
-	isl_ctx_ref(set->ctx);
-	set->ref = 1;
-	set->size = n;
-	set->n = 0;
-	set->dim = dim;
-	set->flags = flags;
-	return set;
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-struct isl_set *isl_set_alloc(struct isl_ctx *ctx,
-		unsigned nparam, unsigned dim, int n, unsigned flags)
-{
-	struct isl_set *set;
-	isl_space *dims;
-
-	dims = isl_space_alloc(ctx, nparam, 0, dim);
-	if (!dims)
-		return NULL;
-
-	set = isl_set_alloc_space(dims, n, flags);
-	return set;
-}
-
-/* Make sure "map" has room for at least "n" more basic maps.
- */
-struct isl_map *isl_map_grow(struct isl_map *map, int n)
-{
-	int i;
-	struct isl_map *grown = NULL;
-
-	if (!map)
-		return NULL;
-	isl_assert(map->ctx, n >= 0, goto error);
-	if (map->n + n <= map->size)
-		return map;
-	grown = isl_map_alloc_space(isl_map_get_space(map), map->n + n, map->flags);
-	if (!grown)
-		goto error;
-	for (i = 0; i < map->n; ++i) {
-		grown->p[i] = isl_basic_map_copy(map->p[i]);
-		if (!grown->p[i])
-			goto error;
-		grown->n++;
-	}
-	isl_map_free(map);
-	return grown;
-error:
-	isl_map_free(grown);
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Make sure "set" has room for at least "n" more basic sets.
- */
-struct isl_set *isl_set_grow(struct isl_set *set, int n)
-{
-	return (struct isl_set *)isl_map_grow((struct isl_map *)set, n);
-}
-
-struct isl_set *isl_set_dup(struct isl_set *set)
-{
-	int i;
-	struct isl_set *dup;
-
-	if (!set)
-		return NULL;
-
-	dup = isl_set_alloc_space(isl_space_copy(set->dim), set->n, set->flags);
-	if (!dup)
-		return NULL;
-	for (i = 0; i < set->n; ++i)
-		dup = isl_set_add_basic_set(dup, isl_basic_set_copy(set->p[i]));
-	return dup;
-}
-
-struct isl_set *isl_set_from_basic_set(struct isl_basic_set *bset)
-{
-	return isl_map_from_basic_map(bset);
-}
-
-struct isl_map *isl_map_from_basic_map(struct isl_basic_map *bmap)
-{
-	struct isl_map *map;
-
-	if (!bmap)
-		return NULL;
-
-	map = isl_map_alloc_space(isl_space_copy(bmap->dim), 1, ISL_MAP_DISJOINT);
-	return isl_map_add_basic_map(map, bmap);
-}
-
-__isl_give isl_set *isl_set_add_basic_set(__isl_take isl_set *set,
-						__isl_take isl_basic_set *bset)
-{
-	return (struct isl_set *)isl_map_add_basic_map((struct isl_map *)set,
-						(struct isl_basic_map *)bset);
-}
-
-void isl_set_free(struct isl_set *set)
-{
-	int i;
-
-	if (!set)
-		return;
-
-	if (--set->ref > 0)
-		return;
-
-	isl_ctx_deref(set->ctx);
-	for (i = 0; i < set->n; ++i)
-		isl_basic_set_free(set->p[i]);
-	isl_space_free(set->dim);
-	free(set);
-}
-
-void isl_set_print_internal(struct isl_set *set, FILE *out, int indent)
-{
-	int i;
-
-	if (!set) {
-		fprintf(out, "null set\n");
-		return;
-	}
-
-	fprintf(out, "%*s", indent, "");
-	fprintf(out, "ref: %d, n: %d, nparam: %d, dim: %d, flags: %x\n",
-			set->ref, set->n, set->dim->nparam, set->dim->n_out,
-			set->flags);
-	for (i = 0; i < set->n; ++i) {
-		fprintf(out, "%*s", indent, "");
-		fprintf(out, "basic set %d:\n", i);
-		isl_basic_set_print_internal(set->p[i], out, indent+4);
-	}
-}
-
-void isl_map_print_internal(struct isl_map *map, FILE *out, int indent)
-{
-	int i;
-
-	if (!map) {
-		fprintf(out, "null map\n");
-		return;
-	}
-
-	fprintf(out, "%*s", indent, "");
-	fprintf(out, "ref: %d, n: %d, nparam: %d, in: %d, out: %d, "
-		     "flags: %x, n_name: %d\n",
-			map->ref, map->n, map->dim->nparam, map->dim->n_in,
-			map->dim->n_out, map->flags, map->dim->n_id);
-	for (i = 0; i < map->n; ++i) {
-		fprintf(out, "%*s", indent, "");
-		fprintf(out, "basic map %d:\n", i);
-		isl_basic_map_print_internal(map->p[i], out, indent+4);
-	}
-}
-
-struct isl_basic_map *isl_basic_map_intersect_domain(
-		struct isl_basic_map *bmap, struct isl_basic_set *bset)
-{
-	struct isl_basic_map *bmap_domain;
-
-	if (!bmap || !bset)
-		goto error;
-
-	isl_assert(bset->ctx, isl_space_match(bmap->dim, isl_dim_param,
-					bset->dim, isl_dim_param), goto error);
-
-	if (isl_space_dim(bset->dim, isl_dim_set) != 0)
-		isl_assert(bset->ctx,
-		    isl_basic_map_compatible_domain(bmap, bset), goto error);
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		goto error;
-	bmap = isl_basic_map_extend_space(bmap, isl_space_copy(bmap->dim),
-			bset->n_div, bset->n_eq, bset->n_ineq);
-	bmap_domain = isl_basic_map_from_domain(bset);
-	bmap = add_constraints(bmap, bmap_domain, 0, 0);
-
-	bmap = isl_basic_map_simplify(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-struct isl_basic_map *isl_basic_map_intersect_range(
-		struct isl_basic_map *bmap, struct isl_basic_set *bset)
-{
-	struct isl_basic_map *bmap_range;
-
-	if (!bmap || !bset)
-		goto error;
-
-	isl_assert(bset->ctx, isl_space_match(bmap->dim, isl_dim_param,
-					bset->dim, isl_dim_param), goto error);
-
-	if (isl_space_dim(bset->dim, isl_dim_set) != 0)
-		isl_assert(bset->ctx,
-		    isl_basic_map_compatible_range(bmap, bset), goto error);
-
-	if (isl_basic_set_is_universe(bset)) {
-		isl_basic_set_free(bset);
-		return bmap;
-	}
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		goto error;
-	bmap = isl_basic_map_extend_space(bmap, isl_space_copy(bmap->dim),
-			bset->n_div, bset->n_eq, bset->n_ineq);
-	bmap_range = isl_basic_map_from_basic_set(bset, isl_space_copy(bset->dim));
-	bmap = add_constraints(bmap, bmap_range, 0, 0);
-
-	bmap = isl_basic_map_simplify(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-int isl_basic_map_contains(struct isl_basic_map *bmap, struct isl_vec *vec)
-{
-	int i;
-	unsigned total;
-	isl_int s;
-
-	total = 1 + isl_basic_map_total_dim(bmap);
-	if (total != vec->size)
-		return -1;
-
-	isl_int_init(s);
-
-	for (i = 0; i < bmap->n_eq; ++i) {
-		isl_seq_inner_product(vec->el, bmap->eq[i], total, &s);
-		if (!isl_int_is_zero(s)) {
-			isl_int_clear(s);
-			return 0;
-		}
-	}
-
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		isl_seq_inner_product(vec->el, bmap->ineq[i], total, &s);
-		if (isl_int_is_neg(s)) {
-			isl_int_clear(s);
-			return 0;
-		}
-	}
-
-	isl_int_clear(s);
-
-	return 1;
-}
-
-int isl_basic_set_contains(struct isl_basic_set *bset, struct isl_vec *vec)
-{
-	return isl_basic_map_contains((struct isl_basic_map *)bset, vec);
-}
-
-struct isl_basic_map *isl_basic_map_intersect(
-		struct isl_basic_map *bmap1, struct isl_basic_map *bmap2)
-{
-	struct isl_vec *sample = NULL;
-
-	if (!bmap1 || !bmap2)
-		goto error;
-
-	isl_assert(bmap1->ctx, isl_space_match(bmap1->dim, isl_dim_param,
-				     bmap2->dim, isl_dim_param), goto error);
-	if (isl_space_dim(bmap1->dim, isl_dim_all) ==
-				isl_space_dim(bmap1->dim, isl_dim_param) &&
-	    isl_space_dim(bmap2->dim, isl_dim_all) !=
-				isl_space_dim(bmap2->dim, isl_dim_param))
-		return isl_basic_map_intersect(bmap2, bmap1);
-
-	if (isl_space_dim(bmap2->dim, isl_dim_all) !=
-					isl_space_dim(bmap2->dim, isl_dim_param))
-		isl_assert(bmap1->ctx,
-			    isl_space_is_equal(bmap1->dim, bmap2->dim), goto error);
-
-	if (bmap1->sample &&
-	    isl_basic_map_contains(bmap1, bmap1->sample) > 0 &&
-	    isl_basic_map_contains(bmap2, bmap1->sample) > 0)
-		sample = isl_vec_copy(bmap1->sample);
-	else if (bmap2->sample &&
-	    isl_basic_map_contains(bmap1, bmap2->sample) > 0 &&
-	    isl_basic_map_contains(bmap2, bmap2->sample) > 0)
-		sample = isl_vec_copy(bmap2->sample);
-
-	bmap1 = isl_basic_map_cow(bmap1);
-	if (!bmap1)
-		goto error;
-	bmap1 = isl_basic_map_extend_space(bmap1, isl_space_copy(bmap1->dim),
-			bmap2->n_div, bmap2->n_eq, bmap2->n_ineq);
-	bmap1 = add_constraints(bmap1, bmap2, 0, 0);
-
-	if (!bmap1)
-		isl_vec_free(sample);
-	else if (sample) {
-		isl_vec_free(bmap1->sample);
-		bmap1->sample = sample;
-	}
-
-	bmap1 = isl_basic_map_simplify(bmap1);
-	return isl_basic_map_finalize(bmap1);
-error:
-	if (sample)
-		isl_vec_free(sample);
-	isl_basic_map_free(bmap1);
-	isl_basic_map_free(bmap2);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_intersect(
-		struct isl_basic_set *bset1, struct isl_basic_set *bset2)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_intersect(
-			(struct isl_basic_map *)bset1,
-			(struct isl_basic_map *)bset2);
-}
-
-__isl_give isl_basic_set *isl_basic_set_intersect_params(
-	__isl_take isl_basic_set *bset1, __isl_take isl_basic_set *bset2)
-{
-	return isl_basic_set_intersect(bset1, bset2);
-}
-
-/* Special case of isl_map_intersect, where both map1 and map2
- * are convex, without any divs and such that either map1 or map2
- * contains a single constraint.  This constraint is then simply
- * added to the other map.
- */
-static __isl_give isl_map *map_intersect_add_constraint(
-	__isl_take isl_map *map1, __isl_take isl_map *map2)
-{
-	isl_assert(map1->ctx, map1->n == 1, goto error);
-	isl_assert(map2->ctx, map1->n == 1, goto error);
-	isl_assert(map1->ctx, map1->p[0]->n_div == 0, goto error);
-	isl_assert(map2->ctx, map1->p[0]->n_div == 0, goto error);
-
-	if (map2->p[0]->n_eq + map2->p[0]->n_ineq != 1)
-		return isl_map_intersect(map2, map1);
-
-	isl_assert(map2->ctx,
-		    map2->p[0]->n_eq + map2->p[0]->n_ineq == 1, goto error);
-
-	map1 = isl_map_cow(map1);
-	if (!map1)
-		goto error;
-	if (isl_map_plain_is_empty(map1)) {
-		isl_map_free(map2);
-		return map1;
-	}
-	map1->p[0] = isl_basic_map_cow(map1->p[0]);
-	if (map2->p[0]->n_eq == 1)
-		map1->p[0] = isl_basic_map_add_eq(map1->p[0], map2->p[0]->eq[0]);
-	else
-		map1->p[0] = isl_basic_map_add_ineq(map1->p[0],
-							map2->p[0]->ineq[0]);
-
-	map1->p[0] = isl_basic_map_simplify(map1->p[0]);
-	map1->p[0] = isl_basic_map_finalize(map1->p[0]);
-	if (!map1->p[0])
-		goto error;
-
-	if (isl_basic_map_plain_is_empty(map1->p[0])) {
-		isl_basic_map_free(map1->p[0]);
-		map1->n = 0;
-	}
-
-	isl_map_free(map2);
-
-	return map1;
-error:
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return NULL;
-}
-
-/* map2 may be either a parameter domain or a map living in the same
- * space as map1.
- */
-static __isl_give isl_map *map_intersect_internal(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	unsigned flags = 0;
-	struct isl_map *result;
-	int i, j;
-
-	if (!map1 || !map2)
-		goto error;
-
-	if (isl_map_plain_is_empty(map1) &&
-	    isl_space_is_equal(map1->dim, map2->dim)) {
-		isl_map_free(map2);
-		return map1;
-	}
-	if (isl_map_plain_is_empty(map2) &&
-	    isl_space_is_equal(map1->dim, map2->dim)) {
-		isl_map_free(map1);
-		return map2;
-	}
-
-	if (map1->n == 1 && map2->n == 1 &&
-	    map1->p[0]->n_div == 0 && map2->p[0]->n_div == 0 &&
-	    isl_space_is_equal(map1->dim, map2->dim) &&
-	    (map1->p[0]->n_eq + map1->p[0]->n_ineq == 1 ||
-	     map2->p[0]->n_eq + map2->p[0]->n_ineq == 1))
-		return map_intersect_add_constraint(map1, map2);
-
-	if (isl_space_dim(map2->dim, isl_dim_all) !=
-				isl_space_dim(map2->dim, isl_dim_param))
-		isl_assert(map1->ctx,
-			    isl_space_is_equal(map1->dim, map2->dim), goto error);
-
-	if (ISL_F_ISSET(map1, ISL_MAP_DISJOINT) &&
-	    ISL_F_ISSET(map2, ISL_MAP_DISJOINT))
-		ISL_FL_SET(flags, ISL_MAP_DISJOINT);
-
-	result = isl_map_alloc_space(isl_space_copy(map1->dim),
-				map1->n * map2->n, flags);
-	if (!result)
-		goto error;
-	for (i = 0; i < map1->n; ++i)
-		for (j = 0; j < map2->n; ++j) {
-			struct isl_basic_map *part;
-			part = isl_basic_map_intersect(
-				    isl_basic_map_copy(map1->p[i]),
-				    isl_basic_map_copy(map2->p[j]));
-			if (isl_basic_map_is_empty(part))
-				isl_basic_map_free(part);
-			else
-				result = isl_map_add_basic_map(result, part);
-			if (!result)
-				goto error;
-		}
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return result;
-error:
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return NULL;
-}
-
-static __isl_give isl_map *map_intersect(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	if (!map1 || !map2)
-		goto error;
-	if (!isl_space_is_equal(map1->dim, map2->dim))
-		isl_die(isl_map_get_ctx(map1), isl_error_invalid,
-			"spaces don't match", goto error);
-	return map_intersect_internal(map1, map2);
-error:
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_intersect(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	return isl_map_align_params_map_map_and(map1, map2, &map_intersect);
-}
-
-struct isl_set *isl_set_intersect(struct isl_set *set1, struct isl_set *set2)
-{
-	return (struct isl_set *)
-		isl_map_intersect((struct isl_map *)set1,
-				  (struct isl_map *)set2);
-}
-
-/* map_intersect_internal accepts intersections
- * with parameter domains, so we can just call that function.
- */
-static __isl_give isl_map *map_intersect_params(__isl_take isl_map *map,
-		__isl_take isl_set *params)
-{
-	return map_intersect_internal(map, params);
-}
-
-__isl_give isl_map *isl_map_intersect_params(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	return isl_map_align_params_map_map_and(map1, map2, &map_intersect_params);
-}
-
-__isl_give isl_set *isl_set_intersect_params(__isl_take isl_set *set,
-		__isl_take isl_set *params)
-{
-	return isl_map_intersect_params(set, params);
-}
-
-struct isl_basic_map *isl_basic_map_reverse(struct isl_basic_map *bmap)
-{
-	isl_space *dim;
-	struct isl_basic_set *bset;
-	unsigned in;
-
-	if (!bmap)
-		return NULL;
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-	dim = isl_space_reverse(isl_space_copy(bmap->dim));
-	in = isl_basic_map_n_in(bmap);
-	bset = isl_basic_set_from_basic_map(bmap);
-	bset = isl_basic_set_swap_vars(bset, in);
-	return isl_basic_map_from_basic_set(bset, dim);
-}
-
-static __isl_give isl_basic_map *basic_map_space_reset(
-	__isl_take isl_basic_map *bmap, enum isl_dim_type type)
-{
-	isl_space *space;
-
-	if (!isl_space_is_named_or_nested(bmap->dim, type))
-		return bmap;
-
-	space = isl_basic_map_get_space(bmap);
-	space = isl_space_reset(space, type);
-	bmap = isl_basic_map_reset_space(bmap, space);
-	return bmap;
-}
-
-__isl_give isl_basic_map *isl_basic_map_insert(__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned pos, unsigned n)
-{
-	isl_space *res_dim;
-	struct isl_basic_map *res;
-	struct isl_dim_map *dim_map;
-	unsigned total, off;
-	enum isl_dim_type t;
-
-	if (n == 0)
-		return basic_map_space_reset(bmap, type);
-
-	if (!bmap)
-		return NULL;
-
-	res_dim = isl_space_insert_dims(isl_basic_map_get_space(bmap), type, pos, n);
-
-	total = isl_basic_map_total_dim(bmap) + n;
-	dim_map = isl_dim_map_alloc(bmap->ctx, total);
-	off = 0;
-	for (t = isl_dim_param; t <= isl_dim_out; ++t) {
-		if (t != type) {
-			isl_dim_map_dim(dim_map, bmap->dim, t, off);
-		} else {
-			unsigned size = isl_basic_map_dim(bmap, t);
-			isl_dim_map_dim_range(dim_map, bmap->dim, t,
-						0, pos, off);
-			isl_dim_map_dim_range(dim_map, bmap->dim, t,
-						pos, size - pos, off + pos + n);
-		}
-		off += isl_space_dim(res_dim, t);
-	}
-	isl_dim_map_div(dim_map, bmap, off);
-
-	res = isl_basic_map_alloc_space(res_dim,
-			bmap->n_div, bmap->n_eq, bmap->n_ineq);
-	if (isl_basic_map_is_rational(bmap))
-		res = isl_basic_map_set_rational(res);
-	res = isl_basic_map_add_constraints_dim_map(res, bmap, dim_map);
-	return isl_basic_map_finalize(res);
-}
-
-__isl_give isl_basic_map *isl_basic_map_add(__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned n)
-{
-	if (!bmap)
-		return NULL;
-	return isl_basic_map_insert(bmap, type,
-					isl_basic_map_dim(bmap, type), n);
-}
-
-__isl_give isl_basic_set *isl_basic_set_add(__isl_take isl_basic_set *bset,
-		enum isl_dim_type type, unsigned n)
-{
-	if (!bset)
-		return NULL;
-	isl_assert(bset->ctx, type != isl_dim_in, goto error);
-	return (isl_basic_set *)isl_basic_map_add((isl_basic_map *)bset, type, n);
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-static __isl_give isl_map *map_space_reset(__isl_take isl_map *map,
-	enum isl_dim_type type)
-{
-	isl_space *space;
-
-	if (!map || !isl_space_is_named_or_nested(map->dim, type))
-		return map;
-
-	space = isl_map_get_space(map);
-	space = isl_space_reset(space, type);
-	map = isl_map_reset_space(map, space);
-	return map;
-}
-
-__isl_give isl_map *isl_map_insert_dims(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned pos, unsigned n)
-{
-	int i;
-
-	if (n == 0)
-		return map_space_reset(map, type);
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	map->dim = isl_space_insert_dims(map->dim, type, pos, n);
-	if (!map->dim)
-		goto error;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_insert(map->p[i], type, pos, n);
-		if (!map->p[i])
-			goto error;
-	}
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_insert_dims(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos, unsigned n)
-{
-	return isl_map_insert_dims(set, type, pos, n);
-}
-
-__isl_give isl_map *isl_map_add_dims(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned n)
-{
-	if (!map)
-		return NULL;
-	return isl_map_insert_dims(map, type, isl_map_dim(map, type), n);
-}
-
-__isl_give isl_set *isl_set_add_dims(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned n)
-{
-	if (!set)
-		return NULL;
-	isl_assert(set->ctx, type != isl_dim_in, goto error);
-	return (isl_set *)isl_map_add_dims((isl_map *)set, type, n);
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_move_dims(
-	__isl_take isl_basic_map *bmap,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n)
-{
-	struct isl_dim_map *dim_map;
-	struct isl_basic_map *res;
-	enum isl_dim_type t;
-	unsigned total, off;
-
-	if (!bmap)
-		return NULL;
-	if (n == 0)
-		return bmap;
-
-	isl_assert(bmap->ctx, src_pos + n <= isl_basic_map_dim(bmap, src_type),
-		goto error);
-
-	if (dst_type == src_type && dst_pos == src_pos)
-		return bmap;
-
-	isl_assert(bmap->ctx, dst_type != src_type, goto error);
-
-	if (pos(bmap->dim, dst_type) + dst_pos ==
-	    pos(bmap->dim, src_type) + src_pos +
-					    ((src_type < dst_type) ? n : 0)) {
-		bmap = isl_basic_map_cow(bmap);
-		if (!bmap)
-			return NULL;
-
-		bmap->dim = isl_space_move_dims(bmap->dim, dst_type, dst_pos,
-						src_type, src_pos, n);
-		if (!bmap->dim)
-			goto error;
-
-		bmap = isl_basic_map_finalize(bmap);
-
-		return bmap;
-	}
-
-	total = isl_basic_map_total_dim(bmap);
-	dim_map = isl_dim_map_alloc(bmap->ctx, total);
-
-	off = 0;
-	for (t = isl_dim_param; t <= isl_dim_out; ++t) {
-		unsigned size = isl_space_dim(bmap->dim, t);
-		if (t == dst_type) {
-			isl_dim_map_dim_range(dim_map, bmap->dim, t,
-					    0, dst_pos, off);
-			off += dst_pos;
-			isl_dim_map_dim_range(dim_map, bmap->dim, src_type,
-					    src_pos, n, off);
-			off += n;
-			isl_dim_map_dim_range(dim_map, bmap->dim, t,
-					    dst_pos, size - dst_pos, off);
-			off += size - dst_pos;
-		} else if (t == src_type) {
-			isl_dim_map_dim_range(dim_map, bmap->dim, t,
-					    0, src_pos, off);
-			off += src_pos;
-			isl_dim_map_dim_range(dim_map, bmap->dim, t,
-					src_pos + n, size - src_pos - n, off);
-			off += size - src_pos - n;
-		} else {
-			isl_dim_map_dim(dim_map, bmap->dim, t, off);
-			off += size;
-		}
-	}
-	isl_dim_map_div(dim_map, bmap, off);
-
-	res = isl_basic_map_alloc_space(isl_basic_map_get_space(bmap),
-			bmap->n_div, bmap->n_eq, bmap->n_ineq);
-	bmap = isl_basic_map_add_constraints_dim_map(res, bmap, dim_map);
-
-	bmap->dim = isl_space_move_dims(bmap->dim, dst_type, dst_pos,
-					src_type, src_pos, n);
-	if (!bmap->dim)
-		goto error;
-
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	bmap = isl_basic_map_finalize(bmap);
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_move_dims(__isl_take isl_basic_set *bset,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n)
-{
-	return (isl_basic_set *)isl_basic_map_move_dims(
-		(isl_basic_map *)bset, dst_type, dst_pos, src_type, src_pos, n);
-}
-
-__isl_give isl_set *isl_set_move_dims(__isl_take isl_set *set,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n)
-{
-	if (!set)
-		return NULL;
-	isl_assert(set->ctx, dst_type != isl_dim_in, goto error);
-	return (isl_set *)isl_map_move_dims((isl_map *)set, dst_type, dst_pos,
-					src_type, src_pos, n);
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_move_dims(__isl_take isl_map *map,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-	if (n == 0)
-		return map;
-
-	isl_assert(map->ctx, src_pos + n <= isl_map_dim(map, src_type),
-		goto error);
-
-	if (dst_type == src_type && dst_pos == src_pos)
-		return map;
-
-	isl_assert(map->ctx, dst_type != src_type, goto error);
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	map->dim = isl_space_move_dims(map->dim, dst_type, dst_pos, src_type, src_pos, n);
-	if (!map->dim)
-		goto error;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_move_dims(map->p[i],
-						dst_type, dst_pos,
-						src_type, src_pos, n);
-		if (!map->p[i])
-			goto error;
-	}
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Move the specified dimensions to the last columns right before
- * the divs.  Don't change the dimension specification of bmap.
- * That's the responsibility of the caller.
- */
-static __isl_give isl_basic_map *move_last(__isl_take isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	struct isl_dim_map *dim_map;
-	struct isl_basic_map *res;
-	enum isl_dim_type t;
-	unsigned total, off;
-
-	if (!bmap)
-		return NULL;
-	if (pos(bmap->dim, type) + first + n ==
-				1 + isl_space_dim(bmap->dim, isl_dim_all))
-		return bmap;
-
-	total = isl_basic_map_total_dim(bmap);
-	dim_map = isl_dim_map_alloc(bmap->ctx, total);
-
-	off = 0;
-	for (t = isl_dim_param; t <= isl_dim_out; ++t) {
-		unsigned size = isl_space_dim(bmap->dim, t);
-		if (t == type) {
-			isl_dim_map_dim_range(dim_map, bmap->dim, t,
-					    0, first, off);
-			off += first;
-			isl_dim_map_dim_range(dim_map, bmap->dim, t,
-					    first, n, total - bmap->n_div - n);
-			isl_dim_map_dim_range(dim_map, bmap->dim, t,
-					    first + n, size - (first + n), off);
-			off += size - (first + n);
-		} else {
-			isl_dim_map_dim(dim_map, bmap->dim, t, off);
-			off += size;
-		}
-	}
-	isl_dim_map_div(dim_map, bmap, off + n);
-
-	res = isl_basic_map_alloc_space(isl_basic_map_get_space(bmap),
-			bmap->n_div, bmap->n_eq, bmap->n_ineq);
-	res = isl_basic_map_add_constraints_dim_map(res, bmap, dim_map);
-	return res;
-}
-
-/* Turn the n dimensions of type type, starting at first
- * into existentially quantified variables.
- */
-__isl_give isl_basic_map *isl_basic_map_project_out(
-		__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-	size_t row_size;
-	isl_int **new_div;
-	isl_int *old;
-
-	if (n == 0)
-		return bmap;
-
-	if (!bmap)
-		return NULL;
-
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL))
-		return isl_basic_map_remove_dims(bmap, type, first, n);
-
-	isl_assert(bmap->ctx, first + n <= isl_basic_map_dim(bmap, type),
-			goto error);
-
-	bmap = move_last(bmap, type, first, n);
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-
-	row_size = 1 + isl_space_dim(bmap->dim, isl_dim_all) + bmap->extra;
-	old = bmap->block2.data;
-	bmap->block2 = isl_blk_extend(bmap->ctx, bmap->block2,
-					(bmap->extra + n) * (1 + row_size));
-	if (!bmap->block2.data)
-		goto error;
-	new_div = isl_alloc_array(bmap->ctx, isl_int *, bmap->extra + n);
-	if (!new_div)
-		goto error;
-	for (i = 0; i < n; ++i) {
-		new_div[i] = bmap->block2.data +
-				(bmap->extra + i) * (1 + row_size);
-		isl_seq_clr(new_div[i], 1 + row_size);
-	}
-	for (i = 0; i < bmap->extra; ++i)
-		new_div[n + i] = bmap->block2.data + (bmap->div[i] - old);
-	free(bmap->div);
-	bmap->div = new_div;
-	bmap->n_div += n;
-	bmap->extra += n;
-
-	bmap->dim = isl_space_drop_dims(bmap->dim, type, first, n);
-	if (!bmap->dim)
-		goto error;
-	bmap = isl_basic_map_simplify(bmap);
-	bmap = isl_basic_map_drop_redundant_divs(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Turn the n dimensions of type type, starting at first
- * into existentially quantified variables.
- */
-struct isl_basic_set *isl_basic_set_project_out(struct isl_basic_set *bset,
-		enum isl_dim_type type, unsigned first, unsigned n)
-{
-	return (isl_basic_set *)isl_basic_map_project_out(
-			(isl_basic_map *)bset, type, first, n);
-}
-
-/* Turn the n dimensions of type type, starting at first
- * into existentially quantified variables.
- */
-__isl_give isl_map *isl_map_project_out(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-
-	if (n == 0)
-		return map;
-
-	isl_assert(map->ctx, first + n <= isl_map_dim(map, type), goto error);
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	map->dim = isl_space_drop_dims(map->dim, type, first, n);
-	if (!map->dim)
-		goto error;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_project_out(map->p[i], type, first, n);
-		if (!map->p[i])
-			goto error;
-	}
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Turn the n dimensions of type type, starting at first
- * into existentially quantified variables.
- */
-__isl_give isl_set *isl_set_project_out(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned first, unsigned n)
-{
-	return (isl_set *)isl_map_project_out((isl_map *)set, type, first, n);
-}
-
-static struct isl_basic_map *add_divs(struct isl_basic_map *bmap, unsigned n)
-{
-	int i, j;
-
-	for (i = 0; i < n; ++i) {
-		j = isl_basic_map_alloc_div(bmap);
-		if (j < 0)
-			goto error;
-		isl_seq_clr(bmap->div[j], 1+1+isl_basic_map_total_dim(bmap));
-	}
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_map *isl_basic_map_apply_range(
-		struct isl_basic_map *bmap1, struct isl_basic_map *bmap2)
-{
-	isl_space *dim_result = NULL;
-	struct isl_basic_map *bmap;
-	unsigned n_in, n_out, n, nparam, total, pos;
-	struct isl_dim_map *dim_map1, *dim_map2;
-
-	if (!bmap1 || !bmap2)
-		goto error;
-
-	dim_result = isl_space_join(isl_space_copy(bmap1->dim),
-				  isl_space_copy(bmap2->dim));
-
-	n_in = isl_basic_map_n_in(bmap1);
-	n_out = isl_basic_map_n_out(bmap2);
-	n = isl_basic_map_n_out(bmap1);
-	nparam = isl_basic_map_n_param(bmap1);
-
-	total = nparam + n_in + n_out + bmap1->n_div + bmap2->n_div + n;
-	dim_map1 = isl_dim_map_alloc(bmap1->ctx, total);
-	dim_map2 = isl_dim_map_alloc(bmap1->ctx, total);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_param, pos = 0);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_param, pos = 0);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_in, pos += nparam);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_out, pos += n_in);
-	isl_dim_map_div(dim_map1, bmap1, pos += n_out);
-	isl_dim_map_div(dim_map2, bmap2, pos += bmap1->n_div);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_out, pos += bmap2->n_div);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_in, pos);
-
-	bmap = isl_basic_map_alloc_space(dim_result,
-			bmap1->n_div + bmap2->n_div + n,
-			bmap1->n_eq + bmap2->n_eq,
-			bmap1->n_ineq + bmap2->n_ineq);
-	bmap = isl_basic_map_add_constraints_dim_map(bmap, bmap1, dim_map1);
-	bmap = isl_basic_map_add_constraints_dim_map(bmap, bmap2, dim_map2);
-	bmap = add_divs(bmap, n);
-	bmap = isl_basic_map_simplify(bmap);
-	bmap = isl_basic_map_drop_redundant_divs(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap1);
-	isl_basic_map_free(bmap2);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_apply(
-		struct isl_basic_set *bset, struct isl_basic_map *bmap)
-{
-	if (!bset || !bmap)
-		goto error;
-
-	isl_assert(bset->ctx, isl_basic_map_compatible_domain(bmap, bset),
-		    goto error);
-
-	return (struct isl_basic_set *)
-		isl_basic_map_apply_range((struct isl_basic_map *)bset, bmap);
-error:
-	isl_basic_set_free(bset);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_map *isl_basic_map_apply_domain(
-		struct isl_basic_map *bmap1, struct isl_basic_map *bmap2)
-{
-	if (!bmap1 || !bmap2)
-		goto error;
-
-	isl_assert(bmap1->ctx,
-	    isl_basic_map_n_in(bmap1) == isl_basic_map_n_in(bmap2), goto error);
-	isl_assert(bmap1->ctx,
-	    isl_basic_map_n_param(bmap1) == isl_basic_map_n_param(bmap2),
-	    goto error);
-
-	bmap1 = isl_basic_map_reverse(bmap1);
-	bmap1 = isl_basic_map_apply_range(bmap1, bmap2);
-	return isl_basic_map_reverse(bmap1);
-error:
-	isl_basic_map_free(bmap1);
-	isl_basic_map_free(bmap2);
-	return NULL;
-}
-
-/* Given two basic maps A -> f(A) and B -> g(B), construct a basic map
- * A \cap B -> f(A) + f(B)
- */
-struct isl_basic_map *isl_basic_map_sum(
-		struct isl_basic_map *bmap1, struct isl_basic_map *bmap2)
-{
-	unsigned n_in, n_out, nparam, total, pos;
-	struct isl_basic_map *bmap = NULL;
-	struct isl_dim_map *dim_map1, *dim_map2;
-	int i;
-
-	if (!bmap1 || !bmap2)
-		goto error;
-
-	isl_assert(bmap1->ctx, isl_space_is_equal(bmap1->dim, bmap2->dim),
-		goto error);
-
-	nparam = isl_basic_map_n_param(bmap1);
-	n_in = isl_basic_map_n_in(bmap1);
-	n_out = isl_basic_map_n_out(bmap1);
-
-	total = nparam + n_in + n_out + bmap1->n_div + bmap2->n_div + 2 * n_out;
-	dim_map1 = isl_dim_map_alloc(bmap1->ctx, total);
-	dim_map2 = isl_dim_map_alloc(bmap2->ctx, total);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_param, pos = 0);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_param, pos);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_in, pos += nparam);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_in, pos);
-	isl_dim_map_div(dim_map1, bmap1, pos += n_in + n_out);
-	isl_dim_map_div(dim_map2, bmap2, pos += bmap1->n_div);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_out, pos += bmap2->n_div);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_out, pos += n_out);
-
-	bmap = isl_basic_map_alloc_space(isl_space_copy(bmap1->dim),
-			bmap1->n_div + bmap2->n_div + 2 * n_out,
-			bmap1->n_eq + bmap2->n_eq + n_out,
-			bmap1->n_ineq + bmap2->n_ineq);
-	for (i = 0; i < n_out; ++i) {
-		int j = isl_basic_map_alloc_equality(bmap);
-		if (j < 0)
-			goto error;
-		isl_seq_clr(bmap->eq[j], 1+total);
-		isl_int_set_si(bmap->eq[j][1+nparam+n_in+i], -1);
-		isl_int_set_si(bmap->eq[j][1+pos+i], 1);
-		isl_int_set_si(bmap->eq[j][1+pos-n_out+i], 1);
-	}
-	bmap = isl_basic_map_add_constraints_dim_map(bmap, bmap1, dim_map1);
-	bmap = isl_basic_map_add_constraints_dim_map(bmap, bmap2, dim_map2);
-	bmap = add_divs(bmap, 2 * n_out);
-
-	bmap = isl_basic_map_simplify(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	isl_basic_map_free(bmap1);
-	isl_basic_map_free(bmap2);
-	return NULL;
-}
-
-/* Given two maps A -> f(A) and B -> g(B), construct a map
- * A \cap B -> f(A) + f(B)
- */
-struct isl_map *isl_map_sum(struct isl_map *map1, struct isl_map *map2)
-{
-	struct isl_map *result;
-	int i, j;
-
-	if (!map1 || !map2)
-		goto error;
-
-	isl_assert(map1->ctx, isl_space_is_equal(map1->dim, map2->dim), goto error);
-
-	result = isl_map_alloc_space(isl_space_copy(map1->dim),
-				map1->n * map2->n, 0);
-	if (!result)
-		goto error;
-	for (i = 0; i < map1->n; ++i)
-		for (j = 0; j < map2->n; ++j) {
-			struct isl_basic_map *part;
-			part = isl_basic_map_sum(
-				    isl_basic_map_copy(map1->p[i]),
-				    isl_basic_map_copy(map2->p[j]));
-			if (isl_basic_map_is_empty(part))
-				isl_basic_map_free(part);
-			else
-				result = isl_map_add_basic_map(result, part);
-			if (!result)
-				goto error;
-		}
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return result;
-error:
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_sum(__isl_take isl_set *set1,
-	__isl_take isl_set *set2)
-{
-	return (isl_set *)isl_map_sum((isl_map *)set1, (isl_map *)set2);
-}
-
-/* Given a basic map A -> f(A), construct A -> -f(A).
- */
-struct isl_basic_map *isl_basic_map_neg(struct isl_basic_map *bmap)
-{
-	int i, j;
-	unsigned off, n;
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-
-	n = isl_basic_map_dim(bmap, isl_dim_out);
-	off = isl_basic_map_offset(bmap, isl_dim_out);
-	for (i = 0; i < bmap->n_eq; ++i)
-		for (j = 0; j < n; ++j)
-			isl_int_neg(bmap->eq[i][off+j], bmap->eq[i][off+j]);
-	for (i = 0; i < bmap->n_ineq; ++i)
-		for (j = 0; j < n; ++j)
-			isl_int_neg(bmap->ineq[i][off+j], bmap->ineq[i][off+j]);
-	for (i = 0; i < bmap->n_div; ++i)
-		for (j = 0; j < n; ++j)
-			isl_int_neg(bmap->div[i][1+off+j], bmap->div[i][1+off+j]);
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	return isl_basic_map_finalize(bmap);
-}
-
-__isl_give isl_basic_set *isl_basic_set_neg(__isl_take isl_basic_set *bset)
-{
-	return isl_basic_map_neg(bset);
-}
-
-/* Given a map A -> f(A), construct A -> -f(A).
- */
-struct isl_map *isl_map_neg(struct isl_map *map)
-{
-	int i;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_neg(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_neg(__isl_take isl_set *set)
-{
-	return (isl_set *)isl_map_neg((isl_map *)set);
-}
-
-/* Given a basic map A -> f(A) and an integer d, construct a basic map
- * A -> floor(f(A)/d).
- */
-struct isl_basic_map *isl_basic_map_floordiv(struct isl_basic_map *bmap,
-		isl_int d)
-{
-	unsigned n_in, n_out, nparam, total, pos;
-	struct isl_basic_map *result = NULL;
-	struct isl_dim_map *dim_map;
-	int i;
-
-	if (!bmap)
-		return NULL;
-
-	nparam = isl_basic_map_n_param(bmap);
-	n_in = isl_basic_map_n_in(bmap);
-	n_out = isl_basic_map_n_out(bmap);
-
-	total = nparam + n_in + n_out + bmap->n_div + n_out;
-	dim_map = isl_dim_map_alloc(bmap->ctx, total);
-	isl_dim_map_dim(dim_map, bmap->dim, isl_dim_param, pos = 0);
-	isl_dim_map_dim(dim_map, bmap->dim, isl_dim_in, pos += nparam);
-	isl_dim_map_div(dim_map, bmap, pos += n_in + n_out);
-	isl_dim_map_dim(dim_map, bmap->dim, isl_dim_out, pos += bmap->n_div);
-
-	result = isl_basic_map_alloc_space(isl_space_copy(bmap->dim),
-			bmap->n_div + n_out,
-			bmap->n_eq, bmap->n_ineq + 2 * n_out);
-	result = isl_basic_map_add_constraints_dim_map(result, bmap, dim_map);
-	result = add_divs(result, n_out);
-	for (i = 0; i < n_out; ++i) {
-		int j;
-		j = isl_basic_map_alloc_inequality(result);
-		if (j < 0)
-			goto error;
-		isl_seq_clr(result->ineq[j], 1+total);
-		isl_int_neg(result->ineq[j][1+nparam+n_in+i], d);
-		isl_int_set_si(result->ineq[j][1+pos+i], 1);
-		j = isl_basic_map_alloc_inequality(result);
-		if (j < 0)
-			goto error;
-		isl_seq_clr(result->ineq[j], 1+total);
-		isl_int_set(result->ineq[j][1+nparam+n_in+i], d);
-		isl_int_set_si(result->ineq[j][1+pos+i], -1);
-		isl_int_sub_ui(result->ineq[j][0], d, 1);
-	}
-
-	result = isl_basic_map_simplify(result);
-	return isl_basic_map_finalize(result);
-error:
-	isl_basic_map_free(result);
-	return NULL;
-}
-
-/* Given a map A -> f(A) and an integer d, construct a map
- * A -> floor(f(A)/d).
- */
-struct isl_map *isl_map_floordiv(struct isl_map *map, isl_int d)
-{
-	int i;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	ISL_F_CLR(map, ISL_MAP_DISJOINT);
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_floordiv(map->p[i], d);
-		if (!map->p[i])
-			goto error;
-	}
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-static struct isl_basic_map *var_equal(struct isl_basic_map *bmap, unsigned pos)
-{
-	int i;
-	unsigned nparam;
-	unsigned n_in;
-
-	i = isl_basic_map_alloc_equality(bmap);
-	if (i < 0)
-		goto error;
-	nparam = isl_basic_map_n_param(bmap);
-	n_in = isl_basic_map_n_in(bmap);
-	isl_seq_clr(bmap->eq[i], 1 + isl_basic_map_total_dim(bmap));
-	isl_int_set_si(bmap->eq[i][1+nparam+pos], -1);
-	isl_int_set_si(bmap->eq[i][1+nparam+n_in+pos], 1);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Add a constraints to "bmap" expressing i_pos < o_pos
- */
-static struct isl_basic_map *var_less(struct isl_basic_map *bmap, unsigned pos)
-{
-	int i;
-	unsigned nparam;
-	unsigned n_in;
-
-	i = isl_basic_map_alloc_inequality(bmap);
-	if (i < 0)
-		goto error;
-	nparam = isl_basic_map_n_param(bmap);
-	n_in = isl_basic_map_n_in(bmap);
-	isl_seq_clr(bmap->ineq[i], 1 + isl_basic_map_total_dim(bmap));
-	isl_int_set_si(bmap->ineq[i][0], -1);
-	isl_int_set_si(bmap->ineq[i][1+nparam+pos], -1);
-	isl_int_set_si(bmap->ineq[i][1+nparam+n_in+pos], 1);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Add a constraint to "bmap" expressing i_pos <= o_pos
- */
-static __isl_give isl_basic_map *var_less_or_equal(
-	__isl_take isl_basic_map *bmap, unsigned pos)
-{
-	int i;
-	unsigned nparam;
-	unsigned n_in;
-
-	i = isl_basic_map_alloc_inequality(bmap);
-	if (i < 0)
-		goto error;
-	nparam = isl_basic_map_n_param(bmap);
-	n_in = isl_basic_map_n_in(bmap);
-	isl_seq_clr(bmap->ineq[i], 1 + isl_basic_map_total_dim(bmap));
-	isl_int_set_si(bmap->ineq[i][1+nparam+pos], -1);
-	isl_int_set_si(bmap->ineq[i][1+nparam+n_in+pos], 1);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Add a constraints to "bmap" expressing i_pos > o_pos
- */
-static struct isl_basic_map *var_more(struct isl_basic_map *bmap, unsigned pos)
-{
-	int i;
-	unsigned nparam;
-	unsigned n_in;
-
-	i = isl_basic_map_alloc_inequality(bmap);
-	if (i < 0)
-		goto error;
-	nparam = isl_basic_map_n_param(bmap);
-	n_in = isl_basic_map_n_in(bmap);
-	isl_seq_clr(bmap->ineq[i], 1 + isl_basic_map_total_dim(bmap));
-	isl_int_set_si(bmap->ineq[i][0], -1);
-	isl_int_set_si(bmap->ineq[i][1+nparam+pos], 1);
-	isl_int_set_si(bmap->ineq[i][1+nparam+n_in+pos], -1);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Add a constraint to "bmap" expressing i_pos >= o_pos
- */
-static __isl_give isl_basic_map *var_more_or_equal(
-	__isl_take isl_basic_map *bmap, unsigned pos)
-{
-	int i;
-	unsigned nparam;
-	unsigned n_in;
-
-	i = isl_basic_map_alloc_inequality(bmap);
-	if (i < 0)
-		goto error;
-	nparam = isl_basic_map_n_param(bmap);
-	n_in = isl_basic_map_n_in(bmap);
-	isl_seq_clr(bmap->ineq[i], 1 + isl_basic_map_total_dim(bmap));
-	isl_int_set_si(bmap->ineq[i][1+nparam+pos], 1);
-	isl_int_set_si(bmap->ineq[i][1+nparam+n_in+pos], -1);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_equal(
-	__isl_take isl_space *dim, unsigned n_equal)
-{
-	int i;
-	struct isl_basic_map *bmap;
-	bmap = isl_basic_map_alloc_space(dim, 0, n_equal, 0);
-	if (!bmap)
-		return NULL;
-	for (i = 0; i < n_equal && bmap; ++i)
-		bmap = var_equal(bmap, i);
-	return isl_basic_map_finalize(bmap);
-}
-
-/* Return a relation on of dimension "dim" expressing i_[0..pos] << o_[0..pos]
- */
-__isl_give isl_basic_map *isl_basic_map_less_at(__isl_take isl_space *dim,
-	unsigned pos)
-{
-	int i;
-	struct isl_basic_map *bmap;
-	bmap = isl_basic_map_alloc_space(dim, 0, pos, 1);
-	if (!bmap)
-		return NULL;
-	for (i = 0; i < pos && bmap; ++i)
-		bmap = var_equal(bmap, i);
-	if (bmap)
-		bmap = var_less(bmap, pos);
-	return isl_basic_map_finalize(bmap);
-}
-
-/* Return a relation on of dimension "dim" expressing i_[0..pos] <<= o_[0..pos]
- */
-__isl_give isl_basic_map *isl_basic_map_less_or_equal_at(
-	__isl_take isl_space *dim, unsigned pos)
-{
-	int i;
-	isl_basic_map *bmap;
-
-	bmap = isl_basic_map_alloc_space(dim, 0, pos, 1);
-	for (i = 0; i < pos; ++i)
-		bmap = var_equal(bmap, i);
-	bmap = var_less_or_equal(bmap, pos);
-	return isl_basic_map_finalize(bmap);
-}
-
-/* Return a relation on pairs of sets of dimension "dim" expressing i_pos > o_pos
- */
-__isl_give isl_basic_map *isl_basic_map_more_at(__isl_take isl_space *dim,
-	unsigned pos)
-{
-	int i;
-	struct isl_basic_map *bmap;
-	bmap = isl_basic_map_alloc_space(dim, 0, pos, 1);
-	if (!bmap)
-		return NULL;
-	for (i = 0; i < pos && bmap; ++i)
-		bmap = var_equal(bmap, i);
-	if (bmap)
-		bmap = var_more(bmap, pos);
-	return isl_basic_map_finalize(bmap);
-}
-
-/* Return a relation on of dimension "dim" expressing i_[0..pos] >>= o_[0..pos]
- */
-__isl_give isl_basic_map *isl_basic_map_more_or_equal_at(
-	__isl_take isl_space *dim, unsigned pos)
-{
-	int i;
-	isl_basic_map *bmap;
-
-	bmap = isl_basic_map_alloc_space(dim, 0, pos, 1);
-	for (i = 0; i < pos; ++i)
-		bmap = var_equal(bmap, i);
-	bmap = var_more_or_equal(bmap, pos);
-	return isl_basic_map_finalize(bmap);
-}
-
-static __isl_give isl_map *map_lex_lte_first(__isl_take isl_space *dims,
-	unsigned n, int equal)
-{
-	struct isl_map *map;
-	int i;
-
-	if (n == 0 && equal)
-		return isl_map_universe(dims);
-
-	map = isl_map_alloc_space(isl_space_copy(dims), n, ISL_MAP_DISJOINT);
-
-	for (i = 0; i + 1 < n; ++i)
-		map = isl_map_add_basic_map(map,
-				  isl_basic_map_less_at(isl_space_copy(dims), i));
-	if (n > 0) {
-		if (equal)
-			map = isl_map_add_basic_map(map,
-			      isl_basic_map_less_or_equal_at(dims, n - 1));
-		else
-			map = isl_map_add_basic_map(map,
-			      isl_basic_map_less_at(dims, n - 1));
-	} else
-		isl_space_free(dims);
-
-	return map;
-}
-
-static __isl_give isl_map *map_lex_lte(__isl_take isl_space *dims, int equal)
-{
-	if (!dims)
-		return NULL;
-	return map_lex_lte_first(dims, dims->n_out, equal);
-}
-
-__isl_give isl_map *isl_map_lex_lt_first(__isl_take isl_space *dim, unsigned n)
-{
-	return map_lex_lte_first(dim, n, 0);
-}
-
-__isl_give isl_map *isl_map_lex_le_first(__isl_take isl_space *dim, unsigned n)
-{
-	return map_lex_lte_first(dim, n, 1);
-}
-
-__isl_give isl_map *isl_map_lex_lt(__isl_take isl_space *set_dim)
-{
-	return map_lex_lte(isl_space_map_from_set(set_dim), 0);
-}
-
-__isl_give isl_map *isl_map_lex_le(__isl_take isl_space *set_dim)
-{
-	return map_lex_lte(isl_space_map_from_set(set_dim), 1);
-}
-
-static __isl_give isl_map *map_lex_gte_first(__isl_take isl_space *dims,
-	unsigned n, int equal)
-{
-	struct isl_map *map;
-	int i;
-
-	if (n == 0 && equal)
-		return isl_map_universe(dims);
-
-	map = isl_map_alloc_space(isl_space_copy(dims), n, ISL_MAP_DISJOINT);
-
-	for (i = 0; i + 1 < n; ++i)
-		map = isl_map_add_basic_map(map,
-				  isl_basic_map_more_at(isl_space_copy(dims), i));
-	if (n > 0) {
-		if (equal)
-			map = isl_map_add_basic_map(map,
-			      isl_basic_map_more_or_equal_at(dims, n - 1));
-		else
-			map = isl_map_add_basic_map(map,
-			      isl_basic_map_more_at(dims, n - 1));
-	} else
-		isl_space_free(dims);
-
-	return map;
-}
-
-static __isl_give isl_map *map_lex_gte(__isl_take isl_space *dims, int equal)
-{
-	if (!dims)
-		return NULL;
-	return map_lex_gte_first(dims, dims->n_out, equal);
-}
-
-__isl_give isl_map *isl_map_lex_gt_first(__isl_take isl_space *dim, unsigned n)
-{
-	return map_lex_gte_first(dim, n, 0);
-}
-
-__isl_give isl_map *isl_map_lex_ge_first(__isl_take isl_space *dim, unsigned n)
-{
-	return map_lex_gte_first(dim, n, 1);
-}
-
-__isl_give isl_map *isl_map_lex_gt(__isl_take isl_space *set_dim)
-{
-	return map_lex_gte(isl_space_map_from_set(set_dim), 0);
-}
-
-__isl_give isl_map *isl_map_lex_ge(__isl_take isl_space *set_dim)
-{
-	return map_lex_gte(isl_space_map_from_set(set_dim), 1);
-}
-
-__isl_give isl_map *isl_set_lex_le_set(__isl_take isl_set *set1,
-	__isl_take isl_set *set2)
-{
-	isl_map *map;
-	map = isl_map_lex_le(isl_set_get_space(set1));
-	map = isl_map_intersect_domain(map, set1);
-	map = isl_map_intersect_range(map, set2);
-	return map;
-}
-
-__isl_give isl_map *isl_set_lex_lt_set(__isl_take isl_set *set1,
-	__isl_take isl_set *set2)
-{
-	isl_map *map;
-	map = isl_map_lex_lt(isl_set_get_space(set1));
-	map = isl_map_intersect_domain(map, set1);
-	map = isl_map_intersect_range(map, set2);
-	return map;
-}
-
-__isl_give isl_map *isl_set_lex_ge_set(__isl_take isl_set *set1,
-	__isl_take isl_set *set2)
-{
-	isl_map *map;
-	map = isl_map_lex_ge(isl_set_get_space(set1));
-	map = isl_map_intersect_domain(map, set1);
-	map = isl_map_intersect_range(map, set2);
-	return map;
-}
-
-__isl_give isl_map *isl_set_lex_gt_set(__isl_take isl_set *set1,
-	__isl_take isl_set *set2)
-{
-	isl_map *map;
-	map = isl_map_lex_gt(isl_set_get_space(set1));
-	map = isl_map_intersect_domain(map, set1);
-	map = isl_map_intersect_range(map, set2);
-	return map;
-}
-
-__isl_give isl_map *isl_map_lex_le_map(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	isl_map *map;
-	map = isl_map_lex_le(isl_space_range(isl_map_get_space(map1)));
-	map = isl_map_apply_domain(map, isl_map_reverse(map1));
-	map = isl_map_apply_range(map, isl_map_reverse(map2));
-	return map;
-}
-
-__isl_give isl_map *isl_map_lex_lt_map(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	isl_map *map;
-	map = isl_map_lex_lt(isl_space_range(isl_map_get_space(map1)));
-	map = isl_map_apply_domain(map, isl_map_reverse(map1));
-	map = isl_map_apply_range(map, isl_map_reverse(map2));
-	return map;
-}
-
-__isl_give isl_map *isl_map_lex_ge_map(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	isl_map *map;
-	map = isl_map_lex_ge(isl_space_range(isl_map_get_space(map1)));
-	map = isl_map_apply_domain(map, isl_map_reverse(map1));
-	map = isl_map_apply_range(map, isl_map_reverse(map2));
-	return map;
-}
-
-__isl_give isl_map *isl_map_lex_gt_map(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	isl_map *map;
-	map = isl_map_lex_gt(isl_space_range(isl_map_get_space(map1)));
-	map = isl_map_apply_domain(map, isl_map_reverse(map1));
-	map = isl_map_apply_range(map, isl_map_reverse(map2));
-	return map;
-}
-
-__isl_give isl_basic_map *isl_basic_map_from_basic_set(
-	__isl_take isl_basic_set *bset, __isl_take isl_space *dim)
-{
-	struct isl_basic_map *bmap;
-
-	bset = isl_basic_set_cow(bset);
-	if (!bset || !dim)
-		goto error;
-
-	isl_assert(bset->ctx, isl_space_compatible(bset->dim, dim), goto error);
-	isl_space_free(bset->dim);
-	bmap = (struct isl_basic_map *) bset;
-	bmap->dim = dim;
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_set_free(bset);
-	isl_space_free(dim);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_from_basic_map(struct isl_basic_map *bmap)
-{
-	if (!bmap)
-		goto error;
-	if (bmap->dim->n_in == 0)
-		return (struct isl_basic_set *)bmap;
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		goto error;
-	bmap->dim = isl_space_as_set_space(bmap->dim);
-	if (!bmap->dim)
-		goto error;
-	bmap = isl_basic_map_finalize(bmap);
-	return (struct isl_basic_set *)bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* For a div d = floor(f/m), add the constraints
- *
- *		f - m d >= 0
- *		-(f-(n-1)) + m d >= 0
- *
- * Note that the second constraint is the negation of
- *
- *		f - m d >= n
- */
-int isl_basic_map_add_div_constraints_var(__isl_keep isl_basic_map *bmap,
-	unsigned pos, isl_int *div)
-{
-	int i, j;
-	unsigned total = isl_basic_map_total_dim(bmap);
-
-	i = isl_basic_map_alloc_inequality(bmap);
-	if (i < 0)
-		return -1;
-	isl_seq_cpy(bmap->ineq[i], div + 1, 1 + total);
-	isl_int_neg(bmap->ineq[i][1 + pos], div[0]);
-
-	j = isl_basic_map_alloc_inequality(bmap);
-	if (j < 0)
-		return -1;
-	isl_seq_neg(bmap->ineq[j], bmap->ineq[i], 1 + total);
-	isl_int_add(bmap->ineq[j][0], bmap->ineq[j][0], bmap->ineq[j][1 + pos]);
-	isl_int_sub_ui(bmap->ineq[j][0], bmap->ineq[j][0], 1);
-	return j;
-}
-
-int isl_basic_set_add_div_constraints_var(__isl_keep isl_basic_set *bset,
-	unsigned pos, isl_int *div)
-{
-	return isl_basic_map_add_div_constraints_var((isl_basic_map *)bset,
-							pos, div);
-}
-
-int isl_basic_map_add_div_constraints(struct isl_basic_map *bmap, unsigned div)
-{
-	unsigned total = isl_basic_map_total_dim(bmap);
-	unsigned div_pos = total - bmap->n_div + div;
-
-	return isl_basic_map_add_div_constraints_var(bmap, div_pos,
-							bmap->div[div]);
-}
-
-struct isl_basic_set *isl_basic_map_underlying_set(
-		struct isl_basic_map *bmap)
-{
-	if (!bmap)
-		goto error;
-	if (bmap->dim->nparam == 0 && bmap->dim->n_in == 0 &&
-	    bmap->n_div == 0 &&
-	    !isl_space_is_named_or_nested(bmap->dim, isl_dim_in) &&
-	    !isl_space_is_named_or_nested(bmap->dim, isl_dim_out))
-		return (struct isl_basic_set *)bmap;
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		goto error;
-	bmap->dim = isl_space_underlying(bmap->dim, bmap->n_div);
-	if (!bmap->dim)
-		goto error;
-	bmap->extra -= bmap->n_div;
-	bmap->n_div = 0;
-	bmap = isl_basic_map_finalize(bmap);
-	return (struct isl_basic_set *)bmap;
-error:
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_underlying_set(
-		__isl_take isl_basic_set *bset)
-{
-	return isl_basic_map_underlying_set((isl_basic_map *)bset);
-}
-
-struct isl_basic_map *isl_basic_map_overlying_set(
-	struct isl_basic_set *bset, struct isl_basic_map *like)
-{
-	struct isl_basic_map *bmap;
-	struct isl_ctx *ctx;
-	unsigned total;
-	int i;
-
-	if (!bset || !like)
-		goto error;
-	ctx = bset->ctx;
-	isl_assert(ctx, bset->n_div == 0, goto error);
-	isl_assert(ctx, isl_basic_set_n_param(bset) == 0, goto error);
-	isl_assert(ctx, bset->dim->n_out == isl_basic_map_total_dim(like),
-			goto error);
-	if (isl_space_is_equal(bset->dim, like->dim) && like->n_div == 0) {
-		isl_basic_map_free(like);
-		return (struct isl_basic_map *)bset;
-	}
-	bset = isl_basic_set_cow(bset);
-	if (!bset)
-		goto error;
-	total = bset->dim->n_out + bset->extra;
-	bmap = (struct isl_basic_map *)bset;
-	isl_space_free(bmap->dim);
-	bmap->dim = isl_space_copy(like->dim);
-	if (!bmap->dim)
-		goto error;
-	bmap->n_div = like->n_div;
-	bmap->extra += like->n_div;
-	if (bmap->extra) {
-		unsigned ltotal;
-		isl_int **div;
-		ltotal = total - bmap->extra + like->extra;
-		if (ltotal > total)
-			ltotal = total;
-		bmap->block2 = isl_blk_extend(ctx, bmap->block2,
-					bmap->extra * (1 + 1 + total));
-		if (isl_blk_is_error(bmap->block2))
-			goto error;
-		div = isl_realloc_array(ctx, bmap->div, isl_int *, bmap->extra);
-		if (!div)
-			goto error;
-		bmap->div = div;
-		for (i = 0; i < bmap->extra; ++i)
-			bmap->div[i] = bmap->block2.data + i * (1 + 1 + total);
-		for (i = 0; i < like->n_div; ++i) {
-			isl_seq_cpy(bmap->div[i], like->div[i], 1 + 1 + ltotal);
-			isl_seq_clr(bmap->div[i]+1+1+ltotal, total - ltotal);
-		}
-		bmap = isl_basic_map_extend_constraints(bmap, 
-							0, 2 * like->n_div);
-		for (i = 0; i < like->n_div; ++i) {
-			if (isl_int_is_zero(bmap->div[i][0]))
-				continue;
-			if (isl_basic_map_add_div_constraints(bmap, i) < 0)
-				goto error;
-		}
-	}
-	isl_basic_map_free(like);
-	bmap = isl_basic_map_simplify(bmap);
-	bmap = isl_basic_map_finalize(bmap);
-	return bmap;
-error:
-	isl_basic_map_free(like);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_from_underlying_set(
-	struct isl_basic_set *bset, struct isl_basic_set *like)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_overlying_set(bset, (struct isl_basic_map *)like);
-}
-
-struct isl_set *isl_set_from_underlying_set(
-	struct isl_set *set, struct isl_basic_set *like)
-{
-	int i;
-
-	if (!set || !like)
-		goto error;
-	isl_assert(set->ctx, set->dim->n_out == isl_basic_set_total_dim(like),
-		    goto error);
-	if (isl_space_is_equal(set->dim, like->dim) && like->n_div == 0) {
-		isl_basic_set_free(like);
-		return set;
-	}
-	set = isl_set_cow(set);
-	if (!set)
-		goto error;
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_basic_set_from_underlying_set(set->p[i],
-						      isl_basic_set_copy(like));
-		if (!set->p[i])
-			goto error;
-	}
-	isl_space_free(set->dim);
-	set->dim = isl_space_copy(like->dim);
-	if (!set->dim)
-		goto error;
-	isl_basic_set_free(like);
-	return set;
-error:
-	isl_basic_set_free(like);
-	isl_set_free(set);
-	return NULL;
-}
-
-struct isl_set *isl_map_underlying_set(struct isl_map *map)
-{
-	int i;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-	map->dim = isl_space_cow(map->dim);
-	if (!map->dim)
-		goto error;
-
-	for (i = 1; i < map->n; ++i)
-		isl_assert(map->ctx, map->p[0]->n_div == map->p[i]->n_div,
-				goto error);
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = (struct isl_basic_map *)
-				isl_basic_map_underlying_set(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	if (map->n == 0)
-		map->dim = isl_space_underlying(map->dim, 0);
-	else {
-		isl_space_free(map->dim);
-		map->dim = isl_space_copy(map->p[0]->dim);
-	}
-	if (!map->dim)
-		goto error;
-	return (struct isl_set *)map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-struct isl_set *isl_set_to_underlying_set(struct isl_set *set)
-{
-	return (struct isl_set *)isl_map_underlying_set((struct isl_map *)set);
-}
-
-__isl_give isl_basic_map *isl_basic_map_reset_space(
-	__isl_take isl_basic_map *bmap, __isl_take isl_space *dim)
-{
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap || !dim)
-		goto error;
-
-	isl_space_free(bmap->dim);
-	bmap->dim = dim;
-
-	bmap = isl_basic_map_finalize(bmap);
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	isl_space_free(dim);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_reset_space(
-	__isl_take isl_basic_set *bset, __isl_take isl_space *dim)
-{
-	return (isl_basic_set *)isl_basic_map_reset_space((isl_basic_map *)bset,
-							dim);
-}
-
-__isl_give isl_map *isl_map_reset_space(__isl_take isl_map *map,
-	__isl_take isl_space *dim)
-{
-	int i;
-
-	map = isl_map_cow(map);
-	if (!map || !dim)
-		goto error;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_reset_space(map->p[i],
-						    isl_space_copy(dim));
-		if (!map->p[i])
-			goto error;
-	}
-	isl_space_free(map->dim);
-	map->dim = dim;
-
-	return map;
-error:
-	isl_map_free(map);
-	isl_space_free(dim);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_reset_space(__isl_take isl_set *set,
-	__isl_take isl_space *dim)
-{
-	return (struct isl_set *) isl_map_reset_space((struct isl_map *)set, dim);
-}
-
-/* Compute the parameter domain of the given basic set.
- */
-__isl_give isl_basic_set *isl_basic_set_params(__isl_take isl_basic_set *bset)
-{
-	isl_space *space;
-	unsigned n;
-
-	if (isl_basic_set_is_params(bset))
-		return bset;
-
-	n = isl_basic_set_dim(bset, isl_dim_set);
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 0, n);
-	space = isl_basic_set_get_space(bset);
-	space = isl_space_params(space);
-	bset = isl_basic_set_reset_space(bset, space);
-	return bset;
-}
-
-/* Compute the parameter domain of the given set.
- */
-__isl_give isl_set *isl_set_params(__isl_take isl_set *set)
-{
-	isl_space *space;
-	unsigned n;
-
-	if (isl_set_is_params(set))
-		return set;
-
-	n = isl_set_dim(set, isl_dim_set);
-	set = isl_set_project_out(set, isl_dim_set, 0, n);
-	space = isl_set_get_space(set);
-	space = isl_space_params(space);
-	set = isl_set_reset_space(set, space);
-	return set;
-}
-
-/* Construct a zero-dimensional set with the given parameter domain.
- */
-__isl_give isl_set *isl_set_from_params(__isl_take isl_set *set)
-{
-	isl_space *space;
-	space = isl_set_get_space(set);
-	space = isl_space_set_from_params(space);
-	set = isl_set_reset_space(set, space);
-	return set;
-}
-
-/* Compute the parameter domain of the given map.
- */
-__isl_give isl_set *isl_map_params(__isl_take isl_map *map)
-{
-	isl_space *space;
-	unsigned n;
-
-	n = isl_map_dim(map, isl_dim_in);
-	map = isl_map_project_out(map, isl_dim_in, 0, n);
-	n = isl_map_dim(map, isl_dim_out);
-	map = isl_map_project_out(map, isl_dim_out, 0, n);
-	space = isl_map_get_space(map);
-	space = isl_space_params(space);
-	map = isl_map_reset_space(map, space);
-	return map;
-}
-
-struct isl_basic_set *isl_basic_map_domain(struct isl_basic_map *bmap)
-{
-	isl_space *dim;
-	struct isl_basic_set *domain;
-	unsigned n_in;
-	unsigned n_out;
-
-	if (!bmap)
-		return NULL;
-	dim = isl_space_domain(isl_basic_map_get_space(bmap));
-
-	n_in = isl_basic_map_n_in(bmap);
-	n_out = isl_basic_map_n_out(bmap);
-	domain = isl_basic_set_from_basic_map(bmap);
-	domain = isl_basic_set_project_out(domain, isl_dim_set, n_in, n_out);
-
-	domain = isl_basic_set_reset_space(domain, dim);
-
-	return domain;
-}
-
-int isl_basic_map_may_be_set(__isl_keep isl_basic_map *bmap)
-{
-	if (!bmap)
-		return -1;
-	return isl_space_may_be_set(bmap->dim);
-}
-
-/* Is this basic map actually a set?
- * Users should never call this function.  Outside of isl,
- * the type should indicate whether something is a set or a map.
- */
-int isl_basic_map_is_set(__isl_keep isl_basic_map *bmap)
-{
-	if (!bmap)
-		return -1;
-	return isl_space_is_set(bmap->dim);
-}
-
-struct isl_basic_set *isl_basic_map_range(struct isl_basic_map *bmap)
-{
-	if (!bmap)
-		return NULL;
-	if (isl_basic_map_is_set(bmap))
-		return bmap;
-	return isl_basic_map_domain(isl_basic_map_reverse(bmap));
-}
-
-__isl_give isl_basic_map *isl_basic_map_domain_map(
-	__isl_take isl_basic_map *bmap)
-{
-	int i, k;
-	isl_space *dim;
-	isl_basic_map *domain;
-	int nparam, n_in, n_out;
-	unsigned total;
-
-	nparam = isl_basic_map_dim(bmap, isl_dim_param);
-	n_in = isl_basic_map_dim(bmap, isl_dim_in);
-	n_out = isl_basic_map_dim(bmap, isl_dim_out);
-
-	dim = isl_space_from_range(isl_space_domain(isl_basic_map_get_space(bmap)));
-	domain = isl_basic_map_universe(dim);
-
-	bmap = isl_basic_map_from_domain(isl_basic_map_wrap(bmap));
-	bmap = isl_basic_map_apply_range(bmap, domain);
-	bmap = isl_basic_map_extend_constraints(bmap, n_in, 0);
-
-	total = isl_basic_map_total_dim(bmap);
-
-	for (i = 0; i < n_in; ++i) {
-		k = isl_basic_map_alloc_equality(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(bmap->eq[k], 1 + total);
-		isl_int_set_si(bmap->eq[k][1 + nparam + i], -1);
-		isl_int_set_si(bmap->eq[k][1 + nparam + n_in + n_out + i], 1);
-	}
-
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_range_map(
-	__isl_take isl_basic_map *bmap)
-{
-	int i, k;
-	isl_space *dim;
-	isl_basic_map *range;
-	int nparam, n_in, n_out;
-	unsigned total;
-
-	nparam = isl_basic_map_dim(bmap, isl_dim_param);
-	n_in = isl_basic_map_dim(bmap, isl_dim_in);
-	n_out = isl_basic_map_dim(bmap, isl_dim_out);
-
-	dim = isl_space_from_range(isl_space_range(isl_basic_map_get_space(bmap)));
-	range = isl_basic_map_universe(dim);
-
-	bmap = isl_basic_map_from_domain(isl_basic_map_wrap(bmap));
-	bmap = isl_basic_map_apply_range(bmap, range);
-	bmap = isl_basic_map_extend_constraints(bmap, n_out, 0);
-
-	total = isl_basic_map_total_dim(bmap);
-
-	for (i = 0; i < n_out; ++i) {
-		k = isl_basic_map_alloc_equality(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(bmap->eq[k], 1 + total);
-		isl_int_set_si(bmap->eq[k][1 + nparam + n_in + i], -1);
-		isl_int_set_si(bmap->eq[k][1 + nparam + n_in + n_out + i], 1);
-	}
-
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-int isl_map_may_be_set(__isl_keep isl_map *map)
-{
-	if (!map)
-		return -1;
-	return isl_space_may_be_set(map->dim);
-}
-
-/* Is this map actually a set?
- * Users should never call this function.  Outside of isl,
- * the type should indicate whether something is a set or a map.
- */
-int isl_map_is_set(__isl_keep isl_map *map)
-{
-	if (!map)
-		return -1;
-	return isl_space_is_set(map->dim);
-}
-
-struct isl_set *isl_map_range(struct isl_map *map)
-{
-	int i;
-	struct isl_set *set;
-
-	if (!map)
-		goto error;
-	if (isl_map_is_set(map))
-		return (isl_set *)map;
-
-	map = isl_map_cow(map);
-	if (!map)
-		goto error;
-
-	set = (struct isl_set *) map;
-	set->dim = isl_space_range(set->dim);
-	if (!set->dim)
-		goto error;
-	for (i = 0; i < map->n; ++i) {
-		set->p[i] = isl_basic_map_range(map->p[i]);
-		if (!set->p[i])
-			goto error;
-	}
-	ISL_F_CLR(set, ISL_MAP_DISJOINT);
-	ISL_F_CLR(set, ISL_SET_NORMALIZED);
-	return set;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_domain_map(__isl_take isl_map *map)
-{
-	int i;
-	isl_space *domain_dim;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	domain_dim = isl_space_from_range(isl_space_domain(isl_map_get_space(map)));
-	map->dim = isl_space_from_domain(isl_space_wrap(map->dim));
-	map->dim = isl_space_join(map->dim, domain_dim);
-	if (!map->dim)
-		goto error;
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_domain_map(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	ISL_F_CLR(map, ISL_MAP_DISJOINT);
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_range_map(__isl_take isl_map *map)
-{
-	int i;
-	isl_space *range_dim;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	range_dim = isl_space_range(isl_map_get_space(map));
-	range_dim = isl_space_from_range(range_dim);
-	map->dim = isl_space_from_domain(isl_space_wrap(map->dim));
-	map->dim = isl_space_join(map->dim, range_dim);
-	if (!map->dim)
-		goto error;
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_range_map(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	ISL_F_CLR(map, ISL_MAP_DISJOINT);
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_from_set(__isl_take isl_set *set,
-	__isl_take isl_space *dim)
-{
-	int i;
-	struct isl_map *map = NULL;
-
-	set = isl_set_cow(set);
-	if (!set || !dim)
-		goto error;
-	isl_assert(set->ctx, isl_space_compatible(set->dim, dim), goto error);
-	map = (struct isl_map *)set;
-	for (i = 0; i < set->n; ++i) {
-		map->p[i] = isl_basic_map_from_basic_set(
-				set->p[i], isl_space_copy(dim));
-		if (!map->p[i])
-			goto error;
-	}
-	isl_space_free(map->dim);
-	map->dim = dim;
-	return map;
-error:
-	isl_space_free(dim);
-	isl_set_free(set);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_from_domain(
-	__isl_take isl_basic_set *bset)
-{
-	return isl_basic_map_reverse(isl_basic_map_from_range(bset));
-}
-
-__isl_give isl_basic_map *isl_basic_map_from_range(
-	__isl_take isl_basic_set *bset)
-{
-	isl_space *space;
-	space = isl_basic_set_get_space(bset);
-	space = isl_space_from_range(space);
-	bset = isl_basic_set_reset_space(bset, space);
-	return (isl_basic_map *)bset;
-}
-
-struct isl_map *isl_map_from_range(struct isl_set *set)
-{
-	isl_space *space;
-	space = isl_set_get_space(set);
-	space = isl_space_from_range(space);
-	set = isl_set_reset_space(set, space);
-	return (struct isl_map *)set;
-}
-
-__isl_give isl_map *isl_map_from_domain(__isl_take isl_set *set)
-{
-	return isl_map_reverse(isl_map_from_range(set));
-}
-
-__isl_give isl_basic_map *isl_basic_map_from_domain_and_range(
-	__isl_take isl_basic_set *domain, __isl_take isl_basic_set *range)
-{
-	return isl_basic_map_apply_range(isl_basic_map_reverse(domain), range);
-}
-
-__isl_give isl_map *isl_map_from_domain_and_range(__isl_take isl_set *domain,
-	__isl_take isl_set *range)
-{
-	return isl_map_apply_range(isl_map_reverse(domain), range);
-}
-
-struct isl_set *isl_set_from_map(struct isl_map *map)
-{
-	int i;
-	struct isl_set *set = NULL;
-
-	if (!map)
-		return NULL;
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-	map->dim = isl_space_as_set_space(map->dim);
-	if (!map->dim)
-		goto error;
-	set = (struct isl_set *)map;
-	for (i = 0; i < map->n; ++i) {
-		set->p[i] = isl_basic_set_from_basic_map(map->p[i]);
-		if (!set->p[i])
-			goto error;
-	}
-	return set;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_alloc_space(__isl_take isl_space *dim, int n,
-	unsigned flags)
-{
-	struct isl_map *map;
-
-	if (!dim)
-		return NULL;
-	if (n < 0)
-		isl_die(dim->ctx, isl_error_internal,
-			"negative number of basic maps", goto error);
-	map = isl_alloc(dim->ctx, struct isl_map,
-			sizeof(struct isl_map) +
-			(n - 1) * sizeof(struct isl_basic_map *));
-	if (!map)
-		goto error;
-
-	map->ctx = dim->ctx;
-	isl_ctx_ref(map->ctx);
-	map->ref = 1;
-	map->size = n;
-	map->n = 0;
-	map->dim = dim;
-	map->flags = flags;
-	return map;
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-struct isl_map *isl_map_alloc(struct isl_ctx *ctx,
-		unsigned nparam, unsigned in, unsigned out, int n,
-		unsigned flags)
-{
-	struct isl_map *map;
-	isl_space *dims;
-
-	dims = isl_space_alloc(ctx, nparam, in, out);
-	if (!dims)
-		return NULL;
-
-	map = isl_map_alloc_space(dims, n, flags);
-	return map;
-}
-
-__isl_give isl_basic_map *isl_basic_map_empty(__isl_take isl_space *dim)
-{
-	struct isl_basic_map *bmap;
-	bmap = isl_basic_map_alloc_space(dim, 0, 1, 0);
-	bmap = isl_basic_map_set_to_empty(bmap);
-	return bmap;
-}
-
-__isl_give isl_basic_set *isl_basic_set_empty(__isl_take isl_space *dim)
-{
-	struct isl_basic_set *bset;
-	bset = isl_basic_set_alloc_space(dim, 0, 1, 0);
-	bset = isl_basic_set_set_to_empty(bset);
-	return bset;
-}
-
-struct isl_basic_map *isl_basic_map_empty_like(struct isl_basic_map *model)
-{
-	struct isl_basic_map *bmap;
-	if (!model)
-		return NULL;
-	bmap = isl_basic_map_alloc_space(isl_space_copy(model->dim), 0, 1, 0);
-	bmap = isl_basic_map_set_to_empty(bmap);
-	return bmap;
-}
-
-struct isl_basic_map *isl_basic_map_empty_like_map(struct isl_map *model)
-{
-	struct isl_basic_map *bmap;
-	if (!model)
-		return NULL;
-	bmap = isl_basic_map_alloc_space(isl_space_copy(model->dim), 0, 1, 0);
-	bmap = isl_basic_map_set_to_empty(bmap);
-	return bmap;
-}
-
-struct isl_basic_set *isl_basic_set_empty_like(struct isl_basic_set *model)
-{
-	struct isl_basic_set *bset;
-	if (!model)
-		return NULL;
-	bset = isl_basic_set_alloc_space(isl_space_copy(model->dim), 0, 1, 0);
-	bset = isl_basic_set_set_to_empty(bset);
-	return bset;
-}
-
-__isl_give isl_basic_map *isl_basic_map_universe(__isl_take isl_space *dim)
-{
-	struct isl_basic_map *bmap;
-	bmap = isl_basic_map_alloc_space(dim, 0, 0, 0);
-	bmap = isl_basic_map_finalize(bmap);
-	return bmap;
-}
-
-__isl_give isl_basic_set *isl_basic_set_universe(__isl_take isl_space *dim)
-{
-	struct isl_basic_set *bset;
-	bset = isl_basic_set_alloc_space(dim, 0, 0, 0);
-	bset = isl_basic_set_finalize(bset);
-	return bset;
-}
-
-__isl_give isl_basic_map *isl_basic_map_nat_universe(__isl_take isl_space *dim)
-{
-	int i;
-	unsigned total = isl_space_dim(dim, isl_dim_all);
-	isl_basic_map *bmap;
-
-	bmap= isl_basic_map_alloc_space(dim, 0, 0, total);
-	for (i = 0; i < total; ++i) {
-		int k = isl_basic_map_alloc_inequality(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(bmap->ineq[k], 1 + total);
-		isl_int_set_si(bmap->ineq[k][1 + i], 1);
-	}
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_nat_universe(__isl_take isl_space *dim)
-{
-	return isl_basic_map_nat_universe(dim);
-}
-
-__isl_give isl_map *isl_map_nat_universe(__isl_take isl_space *dim)
-{
-	return isl_map_from_basic_map(isl_basic_map_nat_universe(dim));
-}
-
-__isl_give isl_set *isl_set_nat_universe(__isl_take isl_space *dim)
-{
-	return isl_map_nat_universe(dim);
-}
-
-__isl_give isl_basic_map *isl_basic_map_universe_like(
-		__isl_keep isl_basic_map *model)
-{
-	if (!model)
-		return NULL;
-	return isl_basic_map_alloc_space(isl_space_copy(model->dim), 0, 0, 0);
-}
-
-struct isl_basic_set *isl_basic_set_universe_like(struct isl_basic_set *model)
-{
-	if (!model)
-		return NULL;
-	return isl_basic_set_alloc_space(isl_space_copy(model->dim), 0, 0, 0);
-}
-
-__isl_give isl_basic_set *isl_basic_set_universe_like_set(
-	__isl_keep isl_set *model)
-{
-	if (!model)
-		return NULL;
-	return isl_basic_set_alloc_space(isl_space_copy(model->dim), 0, 0, 0);
-}
-
-__isl_give isl_map *isl_map_empty(__isl_take isl_space *dim)
-{
-	return isl_map_alloc_space(dim, 0, ISL_MAP_DISJOINT);
-}
-
-struct isl_map *isl_map_empty_like(struct isl_map *model)
-{
-	if (!model)
-		return NULL;
-	return isl_map_alloc_space(isl_space_copy(model->dim), 0, ISL_MAP_DISJOINT);
-}
-
-struct isl_map *isl_map_empty_like_basic_map(struct isl_basic_map *model)
-{
-	if (!model)
-		return NULL;
-	return isl_map_alloc_space(isl_space_copy(model->dim), 0, ISL_MAP_DISJOINT);
-}
-
-__isl_give isl_set *isl_set_empty(__isl_take isl_space *dim)
-{
-	return isl_set_alloc_space(dim, 0, ISL_MAP_DISJOINT);
-}
-
-struct isl_set *isl_set_empty_like(struct isl_set *model)
-{
-	if (!model)
-		return NULL;
-	return isl_set_empty(isl_space_copy(model->dim));
-}
-
-__isl_give isl_map *isl_map_universe(__isl_take isl_space *dim)
-{
-	struct isl_map *map;
-	if (!dim)
-		return NULL;
-	map = isl_map_alloc_space(isl_space_copy(dim), 1, ISL_MAP_DISJOINT);
-	map = isl_map_add_basic_map(map, isl_basic_map_universe(dim));
-	return map;
-}
-
-__isl_give isl_set *isl_set_universe(__isl_take isl_space *dim)
-{
-	struct isl_set *set;
-	if (!dim)
-		return NULL;
-	set = isl_set_alloc_space(isl_space_copy(dim), 1, ISL_MAP_DISJOINT);
-	set = isl_set_add_basic_set(set, isl_basic_set_universe(dim));
-	return set;
-}
-
-__isl_give isl_set *isl_set_universe_like(__isl_keep isl_set *model)
-{
-	if (!model)
-		return NULL;
-	return isl_set_universe(isl_space_copy(model->dim));
-}
-
-struct isl_map *isl_map_dup(struct isl_map *map)
-{
-	int i;
-	struct isl_map *dup;
-
-	if (!map)
-		return NULL;
-	dup = isl_map_alloc_space(isl_space_copy(map->dim), map->n, map->flags);
-	for (i = 0; i < map->n; ++i)
-		dup = isl_map_add_basic_map(dup, isl_basic_map_copy(map->p[i]));
-	return dup;
-}
-
-__isl_give isl_map *isl_map_add_basic_map(__isl_take isl_map *map,
-						__isl_take isl_basic_map *bmap)
-{
-	if (!bmap || !map)
-		goto error;
-	if (isl_basic_map_plain_is_empty(bmap)) {
-		isl_basic_map_free(bmap);
-		return map;
-	}
-	isl_assert(map->ctx, isl_space_is_equal(map->dim, bmap->dim), goto error);
-	isl_assert(map->ctx, map->n < map->size, goto error);
-	map->p[map->n] = bmap;
-	map->n++;
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-error:
-	if (map)
-		isl_map_free(map);
-	if (bmap)
-		isl_basic_map_free(bmap);
-	return NULL;
-}
-
-void isl_map_free(struct isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return;
-
-	if (--map->ref > 0)
-		return;
-
-	isl_ctx_deref(map->ctx);
-	for (i = 0; i < map->n; ++i)
-		isl_basic_map_free(map->p[i]);
-	isl_space_free(map->dim);
-	free(map);
-}
-
-struct isl_map *isl_map_extend(struct isl_map *base,
-		unsigned nparam, unsigned n_in, unsigned n_out)
-{
-	int i;
-
-	base = isl_map_cow(base);
-	if (!base)
-		return NULL;
-
-	base->dim = isl_space_extend(base->dim, nparam, n_in, n_out);
-	if (!base->dim)
-		goto error;
-	for (i = 0; i < base->n; ++i) {
-		base->p[i] = isl_basic_map_extend_space(base->p[i],
-				isl_space_copy(base->dim), 0, 0, 0);
-		if (!base->p[i])
-			goto error;
-	}
-	return base;
-error:
-	isl_map_free(base);
-	return NULL;
-}
-
-struct isl_set *isl_set_extend(struct isl_set *base,
-		unsigned nparam, unsigned dim)
-{
-	return (struct isl_set *)isl_map_extend((struct isl_map *)base,
-							nparam, 0, dim);
-}
-
-static struct isl_basic_map *isl_basic_map_fix_pos_si(
-	struct isl_basic_map *bmap, unsigned pos, int value)
-{
-	int j;
-
-	bmap = isl_basic_map_cow(bmap);
-	bmap = isl_basic_map_extend_constraints(bmap, 1, 0);
-	j = isl_basic_map_alloc_equality(bmap);
-	if (j < 0)
-		goto error;
-	isl_seq_clr(bmap->eq[j] + 1, isl_basic_map_total_dim(bmap));
-	isl_int_set_si(bmap->eq[j][pos], -1);
-	isl_int_set_si(bmap->eq[j][0], value);
-	bmap = isl_basic_map_simplify(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static __isl_give isl_basic_map *isl_basic_map_fix_pos(
-	__isl_take isl_basic_map *bmap, unsigned pos, isl_int value)
-{
-	int j;
-
-	bmap = isl_basic_map_cow(bmap);
-	bmap = isl_basic_map_extend_constraints(bmap, 1, 0);
-	j = isl_basic_map_alloc_equality(bmap);
-	if (j < 0)
-		goto error;
-	isl_seq_clr(bmap->eq[j] + 1, isl_basic_map_total_dim(bmap));
-	isl_int_set_si(bmap->eq[j][pos], -1);
-	isl_int_set(bmap->eq[j][0], value);
-	bmap = isl_basic_map_simplify(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_map *isl_basic_map_fix_si(struct isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned pos, int value)
-{
-	if (!bmap)
-		return NULL;
-	isl_assert(bmap->ctx, pos < isl_basic_map_dim(bmap, type), goto error);
-	return isl_basic_map_fix_pos_si(bmap,
-		isl_basic_map_offset(bmap, type) + pos, value);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_fix(__isl_take isl_basic_map *bmap,
-		enum isl_dim_type type, unsigned pos, isl_int value)
-{
-	if (!bmap)
-		return NULL;
-	isl_assert(bmap->ctx, pos < isl_basic_map_dim(bmap, type), goto error);
-	return isl_basic_map_fix_pos(bmap,
-		isl_basic_map_offset(bmap, type) + pos, value);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_fix_si(struct isl_basic_set *bset,
-		enum isl_dim_type type, unsigned pos, int value)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_fix_si((struct isl_basic_map *)bset,
-					type, pos, value);
-}
-
-__isl_give isl_basic_set *isl_basic_set_fix(__isl_take isl_basic_set *bset,
-		enum isl_dim_type type, unsigned pos, isl_int value)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_fix((struct isl_basic_map *)bset,
-					type, pos, value);
-}
-
-struct isl_basic_map *isl_basic_map_fix_input_si(struct isl_basic_map *bmap,
-		unsigned input, int value)
-{
-	return isl_basic_map_fix_si(bmap, isl_dim_in, input, value);
-}
-
-struct isl_basic_set *isl_basic_set_fix_dim_si(struct isl_basic_set *bset,
-		unsigned dim, int value)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_fix_si((struct isl_basic_map *)bset,
-					isl_dim_set, dim, value);
-}
-
-struct isl_map *isl_map_fix_si(struct isl_map *map,
-		enum isl_dim_type type, unsigned pos, int value)
-{
-	int i;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	isl_assert(map->ctx, pos < isl_map_dim(map, type), goto error);
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_fix_si(map->p[i], type, pos, value);
-		if (!map->p[i])
-			goto error;
-	}
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_fix_si(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos, int value)
-{
-	return (struct isl_set *)
-		isl_map_fix_si((struct isl_map *)set, type, pos, value);
-}
-
-__isl_give isl_map *isl_map_fix(__isl_take isl_map *map,
-		enum isl_dim_type type, unsigned pos, isl_int value)
-{
-	int i;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	isl_assert(map->ctx, pos < isl_map_dim(map, type), goto error);
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_fix(map->p[i], type, pos, value);
-		if (!map->p[i])
-			goto error;
-	}
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_fix(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos, isl_int value)
-{
-	return (struct isl_set *)isl_map_fix((isl_map *)set, type, pos, value);
-}
-
-struct isl_map *isl_map_fix_input_si(struct isl_map *map,
-		unsigned input, int value)
-{
-	return isl_map_fix_si(map, isl_dim_in, input, value);
-}
-
-struct isl_set *isl_set_fix_dim_si(struct isl_set *set, unsigned dim, int value)
-{
-	return (struct isl_set *)
-		isl_map_fix_si((struct isl_map *)set, isl_dim_set, dim, value);
-}
-
-static __isl_give isl_basic_map *basic_map_bound_si(
-	__isl_take isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned pos, int value, int upper)
-{
-	int j;
-
-	if (!bmap)
-		return NULL;
-	isl_assert(bmap->ctx, pos < isl_basic_map_dim(bmap, type), goto error);
-	pos += isl_basic_map_offset(bmap, type);
-	bmap = isl_basic_map_cow(bmap);
-	bmap = isl_basic_map_extend_constraints(bmap, 0, 1);
-	j = isl_basic_map_alloc_inequality(bmap);
-	if (j < 0)
-		goto error;
-	isl_seq_clr(bmap->ineq[j], 1 + isl_basic_map_total_dim(bmap));
-	if (upper) {
-		isl_int_set_si(bmap->ineq[j][pos], -1);
-		isl_int_set_si(bmap->ineq[j][0], value);
-	} else {
-		isl_int_set_si(bmap->ineq[j][pos], 1);
-		isl_int_set_si(bmap->ineq[j][0], -value);
-	}
-	bmap = isl_basic_map_simplify(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_lower_bound_si(
-	__isl_take isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned pos, int value)
-{
-	return basic_map_bound_si(bmap, type, pos, value, 0);
-}
-
-struct isl_basic_set *isl_basic_set_lower_bound_dim(struct isl_basic_set *bset,
-	unsigned dim, isl_int value)
-{
-	int j;
-
-	bset = isl_basic_set_cow(bset);
-	bset = isl_basic_set_extend_constraints(bset, 0, 1);
-	j = isl_basic_set_alloc_inequality(bset);
-	if (j < 0)
-		goto error;
-	isl_seq_clr(bset->ineq[j], 1 + isl_basic_set_total_dim(bset));
-	isl_int_set_si(bset->ineq[j][1 + isl_basic_set_n_param(bset) + dim], 1);
-	isl_int_neg(bset->ineq[j][0], value);
-	bset = isl_basic_set_simplify(bset);
-	return isl_basic_set_finalize(bset);
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-static __isl_give isl_map *map_bound_si(__isl_take isl_map *map,
-	enum isl_dim_type type, unsigned pos, int value, int upper)
-{
-	int i;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	isl_assert(map->ctx, pos < isl_map_dim(map, type), goto error);
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = basic_map_bound_si(map->p[i],
-						 type, pos, value, upper);
-		if (!map->p[i])
-			goto error;
-	}
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_lower_bound_si(__isl_take isl_map *map,
-	enum isl_dim_type type, unsigned pos, int value)
-{
-	return map_bound_si(map, type, pos, value, 0);
-}
-
-__isl_give isl_map *isl_map_upper_bound_si(__isl_take isl_map *map,
-	enum isl_dim_type type, unsigned pos, int value)
-{
-	return map_bound_si(map, type, pos, value, 1);
-}
-
-__isl_give isl_set *isl_set_lower_bound_si(__isl_take isl_set *set,
-		enum isl_dim_type type, unsigned pos, int value)
-{
-	return (struct isl_set *)
-		isl_map_lower_bound_si((struct isl_map *)set, type, pos, value);
-}
-
-__isl_give isl_set *isl_set_upper_bound_si(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned pos, int value)
-{
-	return isl_map_upper_bound_si(set, type, pos, value);
-}
-
-struct isl_set *isl_set_lower_bound_dim(struct isl_set *set, unsigned dim,
-					isl_int value)
-{
-	int i;
-
-	set = isl_set_cow(set);
-	if (!set)
-		return NULL;
-
-	isl_assert(set->ctx, dim < isl_set_n_dim(set), goto error);
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_basic_set_lower_bound_dim(set->p[i], dim, value);
-		if (!set->p[i])
-			goto error;
-	}
-	return set;
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-struct isl_map *isl_map_reverse(struct isl_map *map)
-{
-	int i;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	map->dim = isl_space_reverse(map->dim);
-	if (!map->dim)
-		goto error;
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_reverse(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-static struct isl_map *isl_basic_map_partial_lexopt(
-		struct isl_basic_map *bmap, struct isl_basic_set *dom,
-		struct isl_set **empty, int max)
-{
-	if (!bmap)
-		goto error;
-	if (bmap->ctx->opt->pip == ISL_PIP_PIP)
-		return isl_pip_basic_map_lexopt(bmap, dom, empty, max);
-	else
-		return isl_tab_basic_map_partial_lexopt(bmap, dom, empty, max);
-error:
-	isl_basic_map_free(bmap);
-	isl_basic_set_free(dom);
-	if (empty)
-		*empty = NULL;
-	return NULL;
-}
-
-struct isl_map *isl_basic_map_partial_lexmax(
-		struct isl_basic_map *bmap, struct isl_basic_set *dom,
-		struct isl_set **empty)
-{
-	return isl_basic_map_partial_lexopt(bmap, dom, empty, 1);
-}
-
-struct isl_map *isl_basic_map_partial_lexmin(
-		struct isl_basic_map *bmap, struct isl_basic_set *dom,
-		struct isl_set **empty)
-{
-	return isl_basic_map_partial_lexopt(bmap, dom, empty, 0);
-}
-
-struct isl_set *isl_basic_set_partial_lexmin(
-		struct isl_basic_set *bset, struct isl_basic_set *dom,
-		struct isl_set **empty)
-{
-	return (struct isl_set *)
-		isl_basic_map_partial_lexmin((struct isl_basic_map *)bset,
-			dom, empty);
-}
-
-struct isl_set *isl_basic_set_partial_lexmax(
-		struct isl_basic_set *bset, struct isl_basic_set *dom,
-		struct isl_set **empty)
-{
-	return (struct isl_set *)
-		isl_basic_map_partial_lexmax((struct isl_basic_map *)bset,
-			dom, empty);
-}
-
-__isl_give isl_pw_multi_aff *isl_basic_map_partial_lexmin_pw_multi_aff(
-	__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty)
-{
-	return isl_basic_map_partial_lexopt_pw_multi_aff(bmap, dom, empty, 0);
-}
-
-__isl_give isl_pw_multi_aff *isl_basic_map_partial_lexmax_pw_multi_aff(
-	__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty)
-{
-	return isl_basic_map_partial_lexopt_pw_multi_aff(bmap, dom, empty, 1);
-}
-
-__isl_give isl_pw_multi_aff *isl_basic_set_partial_lexmin_pw_multi_aff(
-	__isl_take isl_basic_set *bset, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty)
-{
-	return isl_basic_map_partial_lexmin_pw_multi_aff(bset, dom, empty);
-}
-
-__isl_give isl_pw_multi_aff *isl_basic_set_partial_lexmax_pw_multi_aff(
-	__isl_take isl_basic_set *bset, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty)
-{
-	return isl_basic_map_partial_lexmax_pw_multi_aff(bset, dom, empty);
-}
-
-__isl_give isl_pw_multi_aff *isl_basic_map_lexopt_pw_multi_aff(
-	__isl_take isl_basic_map *bmap, int max)
-{
-	isl_basic_set *dom = NULL;
-	isl_space *dom_space;
-
-	if (!bmap)
-		goto error;
-	dom_space = isl_space_domain(isl_space_copy(bmap->dim));
-	dom = isl_basic_set_universe(dom_space);
-	return isl_basic_map_partial_lexopt_pw_multi_aff(bmap, dom, NULL, max);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_pw_multi_aff *isl_basic_map_lexmin_pw_multi_aff(
-	__isl_take isl_basic_map *bmap)
-{
-	return isl_basic_map_lexopt_pw_multi_aff(bmap, 0);
-}
-
-/* Given a basic map "bmap", compute the lexicographically minimal
- * (or maximal) image element for each domain element in dom.
- * Set *empty to those elements in dom that do not have an image element.
- *
- * We first make sure the basic sets in dom are disjoint and then
- * simply collect the results over each of the basic sets separately.
- * We could probably improve the efficiency a bit by moving the union
- * domain down into the parametric integer programming.
- */
-static __isl_give isl_map *basic_map_partial_lexopt(
-		__isl_take isl_basic_map *bmap, __isl_take isl_set *dom,
-		__isl_give isl_set **empty, int max)
-{
-	int i;
-	struct isl_map *res;
-
-	dom = isl_set_make_disjoint(dom);
-	if (!dom)
-		goto error;
-
-	if (isl_set_plain_is_empty(dom)) {
-		res = isl_map_empty_like_basic_map(bmap);
-		*empty = isl_set_empty_like(dom);
-		isl_set_free(dom);
-		isl_basic_map_free(bmap);
-		return res;
-	}
-
-	res = isl_basic_map_partial_lexopt(isl_basic_map_copy(bmap),
-			isl_basic_set_copy(dom->p[0]), empty, max);
-		
-	for (i = 1; i < dom->n; ++i) {
-		struct isl_map *res_i;
-		struct isl_set *empty_i;
-
-		res_i = isl_basic_map_partial_lexopt(isl_basic_map_copy(bmap),
-				isl_basic_set_copy(dom->p[i]), &empty_i, max);
-
-		res = isl_map_union_disjoint(res, res_i);
-		*empty = isl_set_union_disjoint(*empty, empty_i);
-	}
-
-	isl_set_free(dom);
-	isl_basic_map_free(bmap);
-	return res;
-error:
-	*empty = NULL;
-	isl_set_free(dom);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Given a map "map", compute the lexicographically minimal
- * (or maximal) image element for each domain element in dom.
- * Set *empty to those elements in dom that do not have an image element.
- *
- * We first compute the lexicographically minimal or maximal element
- * in the first basic map.  This results in a partial solution "res"
- * and a subset "todo" of dom that still need to be handled.
- * We then consider each of the remaining maps in "map" and successively
- * improve both "res" and "todo".
- *
- * Let res^k and todo^k be the results after k steps and let i = k + 1.
- * Assume we are computing the lexicographical maximum.
- * We first compute the lexicographically maximal element in basic map i.
- * This results in a partial solution res_i and a subset todo_i.
- * Then we combine these results with those obtain for the first k basic maps
- * to obtain a result that is valid for the first k+1 basic maps.
- * In particular, the set where there is no solution is the set where
- * there is no solution for the first k basic maps and also no solution
- * for the ith basic map, i.e.,
- *
- *	todo^i = todo^k * todo_i
- *
- * On dom(res^k) * dom(res_i), we need to pick the larger of the two
- * solutions, arbitrarily breaking ties in favor of res^k.
- * That is, when res^k(a) >= res_i(a), we pick res^k and
- * when res^k(a) < res_i(a), we pick res_i.  (Here, ">=" and "<" denote
- * the lexicographic order.)
- * In practice, we compute
- *
- *	res^k * (res_i . "<=")
- *
- * and
- *
- *	res_i * (res^k . "<")
- *
- * Finally, we consider the symmetric difference of dom(res^k) and dom(res_i),
- * where only one of res^k and res_i provides a solution and we simply pick
- * that one, i.e.,
- *
- *	res^k * todo_i
- * and
- *	res_i * todo^k
- *
- * Note that we only compute these intersections when dom(res^k) intersects
- * dom(res_i).  Otherwise, the only effect of these intersections is to
- * potentially break up res^k and res_i into smaller pieces.
- * We want to avoid such splintering as much as possible.
- * In fact, an earlier implementation of this function would look for
- * better results in the domain of res^k and for extra results in todo^k,
- * but this would always result in a splintering according to todo^k,
- * even when the domain of basic map i is disjoint from the domains of
- * the previous basic maps.
- */
-static __isl_give isl_map *isl_map_partial_lexopt_aligned(
-		__isl_take isl_map *map, __isl_take isl_set *dom,
-		__isl_give isl_set **empty, int max)
-{
-	int i;
-	struct isl_map *res;
-	struct isl_set *todo;
-
-	if (!map || !dom)
-		goto error;
-
-	if (isl_map_plain_is_empty(map)) {
-		if (empty)
-			*empty = dom;
-		else
-			isl_set_free(dom);
-		return map;
-	}
-
-	res = basic_map_partial_lexopt(isl_basic_map_copy(map->p[0]),
-					isl_set_copy(dom), &todo, max);
-
-	for (i = 1; i < map->n; ++i) {
-		isl_map *lt, *le;
-		isl_map *res_i;
-		isl_set *todo_i;
-		isl_space *dim = isl_space_range(isl_map_get_space(res));
-
-		res_i = basic_map_partial_lexopt(isl_basic_map_copy(map->p[i]),
-					isl_set_copy(dom), &todo_i, max);
-
-		if (max) {
-			lt = isl_map_lex_lt(isl_space_copy(dim));
-			le = isl_map_lex_le(dim);
-		} else {
-			lt = isl_map_lex_gt(isl_space_copy(dim));
-			le = isl_map_lex_ge(dim);
-		}
-		lt = isl_map_apply_range(isl_map_copy(res), lt);
-		lt = isl_map_intersect(lt, isl_map_copy(res_i));
-		le = isl_map_apply_range(isl_map_copy(res_i), le);
-		le = isl_map_intersect(le, isl_map_copy(res));
-
-		if (!isl_map_is_empty(lt) || !isl_map_is_empty(le)) {
-			res = isl_map_intersect_domain(res,
-							isl_set_copy(todo_i));
-			res_i = isl_map_intersect_domain(res_i,
-							isl_set_copy(todo));
-		}
-
-		res = isl_map_union_disjoint(res, res_i);
-		res = isl_map_union_disjoint(res, lt);
-		res = isl_map_union_disjoint(res, le);
-
-		todo = isl_set_intersect(todo, todo_i);
-	}
-
-	isl_set_free(dom);
-	isl_map_free(map);
-
-	if (empty)
-		*empty = todo;
-	else
-		isl_set_free(todo);
-
-	return res;
-error:
-	if (empty)
-		*empty = NULL;
-	isl_set_free(dom);
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Given a map "map", compute the lexicographically minimal
- * (or maximal) image element for each domain element in dom.
- * Set *empty to those elements in dom that do not have an image element.
- *
- * Align parameters if needed and then call isl_map_partial_lexopt_aligned.
- */
-static __isl_give isl_map *isl_map_partial_lexopt(
-		__isl_take isl_map *map, __isl_take isl_set *dom,
-		__isl_give isl_set **empty, int max)
-{
-	if (!map || !dom)
-		goto error;
-	if (isl_space_match(map->dim, isl_dim_param, dom->dim, isl_dim_param))
-		return isl_map_partial_lexopt_aligned(map, dom, empty, max);
-	if (!isl_space_has_named_params(map->dim) ||
-	    !isl_space_has_named_params(dom->dim))
-		isl_die(map->ctx, isl_error_invalid,
-			"unaligned unnamed parameters", goto error);
-	map = isl_map_align_params(map, isl_map_get_space(dom));
-	dom = isl_map_align_params(dom, isl_map_get_space(map));
-	return isl_map_partial_lexopt_aligned(map, dom, empty, max);
-error:
-	if (empty)
-		*empty = NULL;
-	isl_set_free(dom);
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_partial_lexmax(
-		__isl_take isl_map *map, __isl_take isl_set *dom,
-		__isl_give isl_set **empty)
-{
-	return isl_map_partial_lexopt(map, dom, empty, 1);
-}
-
-__isl_give isl_map *isl_map_partial_lexmin(
-		__isl_take isl_map *map, __isl_take isl_set *dom,
-		__isl_give isl_set **empty)
-{
-	return isl_map_partial_lexopt(map, dom, empty, 0);
-}
-
-__isl_give isl_set *isl_set_partial_lexmin(
-		__isl_take isl_set *set, __isl_take isl_set *dom,
-		__isl_give isl_set **empty)
-{
-	return (struct isl_set *)
-		isl_map_partial_lexmin((struct isl_map *)set,
-			dom, empty);
-}
-
-__isl_give isl_set *isl_set_partial_lexmax(
-		__isl_take isl_set *set, __isl_take isl_set *dom,
-		__isl_give isl_set **empty)
-{
-	return (struct isl_set *)
-		isl_map_partial_lexmax((struct isl_map *)set,
-			dom, empty);
-}
-
-__isl_give isl_map *isl_basic_map_lexopt(__isl_take isl_basic_map *bmap, int max)
-{
-	struct isl_basic_set *dom = NULL;
-	isl_space *dom_dim;
-
-	if (!bmap)
-		goto error;
-	dom_dim = isl_space_domain(isl_space_copy(bmap->dim));
-	dom = isl_basic_set_universe(dom_dim);
-	return isl_basic_map_partial_lexopt(bmap, dom, NULL, max);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_map *isl_basic_map_lexmin(__isl_take isl_basic_map *bmap)
-{
-	return isl_basic_map_lexopt(bmap, 0);
-}
-
-__isl_give isl_map *isl_basic_map_lexmax(__isl_take isl_basic_map *bmap)
-{
-	return isl_basic_map_lexopt(bmap, 1);
-}
-
-__isl_give isl_set *isl_basic_set_lexmin(__isl_take isl_basic_set *bset)
-{
-	return (isl_set *)isl_basic_map_lexmin((isl_basic_map *)bset);
-}
-
-__isl_give isl_set *isl_basic_set_lexmax(__isl_take isl_basic_set *bset)
-{
-	return (isl_set *)isl_basic_map_lexmax((isl_basic_map *)bset);
-}
-
-__isl_give isl_map *isl_map_lexopt(__isl_take isl_map *map, int max)
-{
-	struct isl_set *dom = NULL;
-	isl_space *dom_dim;
-
-	if (!map)
-		goto error;
-	dom_dim = isl_space_domain(isl_space_copy(map->dim));
-	dom = isl_set_universe(dom_dim);
-	return isl_map_partial_lexopt(map, dom, NULL, max);
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_lexmin(__isl_take isl_map *map)
-{
-	return isl_map_lexopt(map, 0);
-}
-
-__isl_give isl_map *isl_map_lexmax(__isl_take isl_map *map)
-{
-	return isl_map_lexopt(map, 1);
-}
-
-__isl_give isl_set *isl_set_lexmin(__isl_take isl_set *set)
-{
-	return (isl_set *)isl_map_lexmin((isl_map *)set);
-}
-
-__isl_give isl_set *isl_set_lexmax(__isl_take isl_set *set)
-{
-	return (isl_set *)isl_map_lexmax((isl_map *)set);
-}
-
-/* Extract the first and only affine expression from list
- * and then add it to *pwaff with the given dom.
- * This domain is known to be disjoint from other domains
- * because of the way isl_basic_map_foreach_lexmax works.
- */
-static int update_dim_opt(__isl_take isl_basic_set *dom,
-	__isl_take isl_aff_list *list, void *user)
-{
-	isl_ctx *ctx = isl_basic_set_get_ctx(dom);
-	isl_aff *aff;
-	isl_pw_aff **pwaff = user;
-	isl_pw_aff *pwaff_i;
-
-	if (isl_aff_list_n_aff(list) != 1)
-		isl_die(ctx, isl_error_internal,
-			"expecting single element list", goto error);
-
-	aff = isl_aff_list_get_aff(list, 0);
-	pwaff_i = isl_pw_aff_alloc(isl_set_from_basic_set(dom), aff);
-
-	*pwaff = isl_pw_aff_add_disjoint(*pwaff, pwaff_i);
-
-	isl_aff_list_free(list);
-
-	return 0;
-error:
-	isl_basic_set_free(dom);
-	isl_aff_list_free(list);
-	return -1;
-}
-
-/* Given a basic map with one output dimension, compute the minimum or
- * maximum of that dimension as an isl_pw_aff.
- *
- * The isl_pw_aff is constructed by having isl_basic_map_foreach_lexopt
- * call update_dim_opt on each leaf of the result.
- */
-static __isl_give isl_pw_aff *basic_map_dim_opt(__isl_keep isl_basic_map *bmap,
-	int max)
-{
-	isl_space *dim = isl_basic_map_get_space(bmap);
-	isl_pw_aff *pwaff;
-	int r;
-
-	dim = isl_space_from_domain(isl_space_domain(dim));
-	dim = isl_space_add_dims(dim, isl_dim_out, 1);
-	pwaff = isl_pw_aff_empty(dim);
-
-	r = isl_basic_map_foreach_lexopt(bmap, max, &update_dim_opt, &pwaff);
-	if (r < 0)
-		return isl_pw_aff_free(pwaff);
-
-	return pwaff;
-}
-
-/* Compute the minimum or maximum of the given output dimension
- * as a function of the parameters and the input dimensions,
- * but independently of the other output dimensions.
- *
- * We first project out the other output dimension and then compute
- * the "lexicographic" maximum in each basic map, combining the results
- * using isl_pw_aff_union_max.
- */
-static __isl_give isl_pw_aff *map_dim_opt(__isl_take isl_map *map, int pos,
-	int max)
-{
-	int i;
-	isl_pw_aff *pwaff;
-	unsigned n_out;
-
-	n_out = isl_map_dim(map, isl_dim_out);
-	map = isl_map_project_out(map, isl_dim_out, pos + 1, n_out - (pos + 1));
-	map = isl_map_project_out(map, isl_dim_out, 0, pos);
-	if (!map)
-		return NULL;
-
-	if (map->n == 0) {
-		isl_space *dim = isl_map_get_space(map);
-		dim = isl_space_domain(isl_space_from_range(dim));
-		isl_map_free(map);
-		return isl_pw_aff_empty(dim);
-	}
-
-	pwaff = basic_map_dim_opt(map->p[0], max);
-	for (i = 1; i < map->n; ++i) {
-		isl_pw_aff *pwaff_i;
-
-		pwaff_i = basic_map_dim_opt(map->p[i], max);
-		pwaff = isl_pw_aff_union_opt(pwaff, pwaff_i, max);
-	}
-
-	isl_map_free(map);
-
-	return pwaff;
-}
-
-/* Compute the maximum of the given output dimension as a function of the
- * parameters and input dimensions, but independently of
- * the other output dimensions.
- */
-__isl_give isl_pw_aff *isl_map_dim_max(__isl_take isl_map *map, int pos)
-{
-	return map_dim_opt(map, pos, 1);
-}
-
-/* Compute the minimum or maximum of the given set dimension
- * as a function of the parameters,
- * but independently of the other set dimensions.
- */
-static __isl_give isl_pw_aff *set_dim_opt(__isl_take isl_set *set, int pos,
-	int max)
-{
-	return map_dim_opt(set, pos, max);
-}
-
-/* Compute the maximum of the given set dimension as a function of the
- * parameters, but independently of the other set dimensions.
- */
-__isl_give isl_pw_aff *isl_set_dim_max(__isl_take isl_set *set, int pos)
-{
-	return set_dim_opt(set, pos, 1);
-}
-
-/* Compute the minimum of the given set dimension as a function of the
- * parameters, but independently of the other set dimensions.
- */
-__isl_give isl_pw_aff *isl_set_dim_min(__isl_take isl_set *set, int pos)
-{
-	return set_dim_opt(set, pos, 0);
-}
-
-/* Apply a preimage specified by "mat" on the parameters of "bset".
- * bset is assumed to have only parameters and divs.
- */
-static struct isl_basic_set *basic_set_parameter_preimage(
-	struct isl_basic_set *bset, struct isl_mat *mat)
-{
-	unsigned nparam;
-
-	if (!bset || !mat)
-		goto error;
-
-	bset->dim = isl_space_cow(bset->dim);
-	if (!bset->dim)
-		goto error;
-
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-
-	isl_assert(bset->ctx, mat->n_row == 1 + nparam, goto error);
-
-	bset->dim->nparam = 0;
-	bset->dim->n_out = nparam;
-	bset = isl_basic_set_preimage(bset, mat);
-	if (bset) {
-		bset->dim->nparam = bset->dim->n_out;
-		bset->dim->n_out = 0;
-	}
-	return bset;
-error:
-	isl_mat_free(mat);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Apply a preimage specified by "mat" on the parameters of "set".
- * set is assumed to have only parameters and divs.
- */
-static struct isl_set *set_parameter_preimage(
-	struct isl_set *set, struct isl_mat *mat)
-{
-	isl_space *dim = NULL;
-	unsigned nparam;
-
-	if (!set || !mat)
-		goto error;
-
-	dim = isl_space_copy(set->dim);
-	dim = isl_space_cow(dim);
-	if (!dim)
-		goto error;
-
-	nparam = isl_set_dim(set, isl_dim_param);
-
-	isl_assert(set->ctx, mat->n_row == 1 + nparam, goto error);
-
-	dim->nparam = 0;
-	dim->n_out = nparam;
-	isl_set_reset_space(set, dim);
-	set = isl_set_preimage(set, mat);
-	if (!set)
-		goto error2;
-	dim = isl_space_copy(set->dim);
-	dim = isl_space_cow(dim);
-	if (!dim)
-		goto error2;
-	dim->nparam = dim->n_out;
-	dim->n_out = 0;
-	isl_set_reset_space(set, dim);
-	return set;
-error:
-	isl_space_free(dim);
-	isl_mat_free(mat);
-error2:
-	isl_set_free(set);
-	return NULL;
-}
-
-/* Intersect the basic set "bset" with the affine space specified by the
- * equalities in "eq".
- */
-static struct isl_basic_set *basic_set_append_equalities(
-	struct isl_basic_set *bset, struct isl_mat *eq)
-{
-	int i, k;
-	unsigned len;
-
-	if (!bset || !eq)
-		goto error;
-
-	bset = isl_basic_set_extend_space(bset, isl_space_copy(bset->dim), 0,
-					eq->n_row, 0);
-	if (!bset)
-		goto error;
-
-	len = 1 + isl_space_dim(bset->dim, isl_dim_all) + bset->extra;
-	for (i = 0; i < eq->n_row; ++i) {
-		k = isl_basic_set_alloc_equality(bset);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(bset->eq[k], eq->row[i], eq->n_col);
-		isl_seq_clr(bset->eq[k] + eq->n_col, len - eq->n_col);
-	}
-	isl_mat_free(eq);
-
-	bset = isl_basic_set_gauss(bset, NULL);
-	bset = isl_basic_set_finalize(bset);
-
-	return bset;
-error:
-	isl_mat_free(eq);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Intersect the set "set" with the affine space specified by the
- * equalities in "eq".
- */
-static struct isl_set *set_append_equalities(struct isl_set *set,
-	struct isl_mat *eq)
-{
-	int i;
-
-	if (!set || !eq)
-		goto error;
-
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = basic_set_append_equalities(set->p[i],
-					isl_mat_copy(eq));
-		if (!set->p[i])
-			goto error;
-	}
-	isl_mat_free(eq);
-	return set;
-error:
-	isl_mat_free(eq);
-	isl_set_free(set);
-	return NULL;
-}
-
-/* Project the given basic set onto its parameter domain, possibly introducing
- * new, explicit, existential variables in the constraints.
- * The input has parameters and (possibly implicit) existential variables.
- * The output has the same parameters, but only
- * explicit existentially quantified variables.
- *
- * The actual projection is performed by pip, but pip doesn't seem
- * to like equalities very much, so we first remove the equalities
- * among the parameters by performing a variable compression on
- * the parameters.  Afterward, an inverse transformation is performed
- * and the equalities among the parameters are inserted back in.
- */
-static struct isl_set *parameter_compute_divs(struct isl_basic_set *bset)
-{
-	int i, j;
-	struct isl_mat *eq;
-	struct isl_mat *T, *T2;
-	struct isl_set *set;
-	unsigned nparam, n_div;
-
-	bset = isl_basic_set_cow(bset);
-	if (!bset)
-		return NULL;
-
-	if (bset->n_eq == 0)
-		return isl_basic_set_lexmin(bset);
-
-	isl_basic_set_gauss(bset, NULL);
-
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-	n_div = isl_basic_set_dim(bset, isl_dim_div);
-
-	for (i = 0, j = n_div - 1; i < bset->n_eq && j >= 0; --j) {
-		if (!isl_int_is_zero(bset->eq[i][1 + nparam + j]))
-			++i;
-	}
-	if (i == bset->n_eq)
-		return isl_basic_set_lexmin(bset);
-
-	eq = isl_mat_sub_alloc6(bset->ctx, bset->eq, i, bset->n_eq - i,
-		0, 1 + nparam);
-	eq = isl_mat_cow(eq);
-	T = isl_mat_variable_compression(isl_mat_copy(eq), &T2);
-	if (T && T->n_col == 0) {
-		isl_mat_free(T);
-		isl_mat_free(T2);
-		isl_mat_free(eq);
-		bset = isl_basic_set_set_to_empty(bset);
-		return isl_set_from_basic_set(bset);
-	}
-	bset = basic_set_parameter_preimage(bset, T);
-
-	set = isl_basic_set_lexmin(bset);
-	set = set_parameter_preimage(set, T2);
-	set = set_append_equalities(set, eq);
-	return set;
-}
-
-/* Compute an explicit representation for all the existentially
- * quantified variables.
- * The input and output dimensions are first turned into parameters.
- * compute_divs then returns a map with the same parameters and
- * no input or output dimensions and the dimension specification
- * is reset to that of the input.
- */
-static struct isl_map *compute_divs(struct isl_basic_map *bmap)
-{
-	struct isl_basic_set *bset;
-	struct isl_set *set;
-	struct isl_map *map;
-	isl_space *dim, *orig_dim = NULL;
-	unsigned	 nparam;
-	unsigned	 n_in;
-	unsigned	 n_out;
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-
-	nparam = isl_basic_map_dim(bmap, isl_dim_param);
-	n_in = isl_basic_map_dim(bmap, isl_dim_in);
-	n_out = isl_basic_map_dim(bmap, isl_dim_out);
-	dim = isl_space_set_alloc(bmap->ctx, nparam + n_in + n_out, 0);
-	if (!dim)
-		goto error;
-
-	orig_dim = bmap->dim;
-	bmap->dim = dim;
-	bset = (struct isl_basic_set *)bmap;
-
-	set = parameter_compute_divs(bset);
-	map = (struct isl_map *)set;
-	map = isl_map_reset_space(map, orig_dim);
-
-	return map;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-int isl_basic_map_divs_known(__isl_keep isl_basic_map *bmap)
-{
-	int i;
-	unsigned off;
-
-	if (!bmap)
-		return -1;
-
-	off = isl_space_dim(bmap->dim, isl_dim_all);
-	for (i = 0; i < bmap->n_div; ++i) {
-		if (isl_int_is_zero(bmap->div[i][0]))
-			return 0;
-		isl_assert(bmap->ctx, isl_int_is_zero(bmap->div[i][1+1+off+i]),
-				return -1);
-	}
-	return 1;
-}
-
-static int map_divs_known(__isl_keep isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return -1;
-
-	for (i = 0; i < map->n; ++i) {
-		int known = isl_basic_map_divs_known(map->p[i]);
-		if (known <= 0)
-			return known;
-	}
-
-	return 1;
-}
-
-/* If bmap contains any unknown divs, then compute explicit
- * expressions for them.  However, this computation may be
- * quite expensive, so first try to remove divs that aren't
- * strictly needed.
- */
-struct isl_map *isl_basic_map_compute_divs(struct isl_basic_map *bmap)
-{
-	int known;
-	struct isl_map *map;
-
-	known = isl_basic_map_divs_known(bmap);
-	if (known < 0)
-		goto error;
-	if (known)
-		return isl_map_from_basic_map(bmap);
-
-	bmap = isl_basic_map_drop_redundant_divs(bmap);
-
-	known = isl_basic_map_divs_known(bmap);
-	if (known < 0)
-		goto error;
-	if (known)
-		return isl_map_from_basic_map(bmap);
-
-	map = compute_divs(bmap);
-	return map;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_map *isl_map_compute_divs(struct isl_map *map)
-{
-	int i;
-	int known;
-	struct isl_map *res;
-
-	if (!map)
-		return NULL;
-	if (map->n == 0)
-		return map;
-
-	known = map_divs_known(map);
-	if (known < 0) {
-		isl_map_free(map);
-		return NULL;
-	}
-	if (known)
-		return map;
-
-	res = isl_basic_map_compute_divs(isl_basic_map_copy(map->p[0]));
-	for (i = 1 ; i < map->n; ++i) {
-		struct isl_map *r2;
-		r2 = isl_basic_map_compute_divs(isl_basic_map_copy(map->p[i]));
-		if (ISL_F_ISSET(map, ISL_MAP_DISJOINT))
-			res = isl_map_union_disjoint(res, r2);
-		else
-			res = isl_map_union(res, r2);
-	}
-	isl_map_free(map);
-
-	return res;
-}
-
-struct isl_set *isl_basic_set_compute_divs(struct isl_basic_set *bset)
-{
-	return (struct isl_set *)
-		isl_basic_map_compute_divs((struct isl_basic_map *)bset);
-}
-
-struct isl_set *isl_set_compute_divs(struct isl_set *set)
-{
-	return (struct isl_set *)
-		isl_map_compute_divs((struct isl_map *)set);
-}
-
-struct isl_set *isl_map_domain(struct isl_map *map)
-{
-	int i;
-	struct isl_set *set;
-
-	if (!map)
-		goto error;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	set = (struct isl_set *)map;
-	set->dim = isl_space_domain(set->dim);
-	if (!set->dim)
-		goto error;
-	for (i = 0; i < map->n; ++i) {
-		set->p[i] = isl_basic_map_domain(map->p[i]);
-		if (!set->p[i])
-			goto error;
-	}
-	ISL_F_CLR(set, ISL_MAP_DISJOINT);
-	ISL_F_CLR(set, ISL_SET_NORMALIZED);
-	return set;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-static __isl_give isl_map *map_union_disjoint(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	int i;
-	unsigned flags = 0;
-	struct isl_map *map = NULL;
-
-	if (!map1 || !map2)
-		goto error;
-
-	if (map1->n == 0) {
-		isl_map_free(map1);
-		return map2;
-	}
-	if (map2->n == 0) {
-		isl_map_free(map2);
-		return map1;
-	}
-
-	isl_assert(map1->ctx, isl_space_is_equal(map1->dim, map2->dim), goto error);
-
-	if (ISL_F_ISSET(map1, ISL_MAP_DISJOINT) &&
-	    ISL_F_ISSET(map2, ISL_MAP_DISJOINT))
-		ISL_FL_SET(flags, ISL_MAP_DISJOINT);
-
-	map = isl_map_alloc_space(isl_space_copy(map1->dim),
-				map1->n + map2->n, flags);
-	if (!map)
-		goto error;
-	for (i = 0; i < map1->n; ++i) {
-		map = isl_map_add_basic_map(map,
-				  isl_basic_map_copy(map1->p[i]));
-		if (!map)
-			goto error;
-	}
-	for (i = 0; i < map2->n; ++i) {
-		map = isl_map_add_basic_map(map,
-				  isl_basic_map_copy(map2->p[i]));
-		if (!map)
-			goto error;
-	}
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return map;
-error:
-	isl_map_free(map);
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_union_disjoint(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	return isl_map_align_params_map_map_and(map1, map2, &map_union_disjoint);
-}
-
-struct isl_map *isl_map_union(struct isl_map *map1, struct isl_map *map2)
-{
-	map1 = isl_map_union_disjoint(map1, map2);
-	if (!map1)
-		return NULL;
-	if (map1->n > 1)
-		ISL_F_CLR(map1, ISL_MAP_DISJOINT);
-	return map1;
-}
-
-struct isl_set *isl_set_union_disjoint(
-			struct isl_set *set1, struct isl_set *set2)
-{
-	return (struct isl_set *)
-		isl_map_union_disjoint(
-			(struct isl_map *)set1, (struct isl_map *)set2);
-}
-
-struct isl_set *isl_set_union(struct isl_set *set1, struct isl_set *set2)
-{
-	return (struct isl_set *)
-		isl_map_union((struct isl_map *)set1, (struct isl_map *)set2);
-}
-
-static __isl_give isl_map *map_intersect_range(__isl_take isl_map *map,
-	__isl_take isl_set *set)
-{
-	unsigned flags = 0;
-	struct isl_map *result;
-	int i, j;
-
-	if (!map || !set)
-		goto error;
-
-	if (!isl_space_match(map->dim, isl_dim_param, set->dim, isl_dim_param))
-		isl_die(set->ctx, isl_error_invalid,
-			"parameters don't match", goto error);
-
-	if (isl_space_dim(set->dim, isl_dim_set) != 0 &&
-	    !isl_map_compatible_range(map, set))
-		isl_die(set->ctx, isl_error_invalid,
-			"incompatible spaces", goto error);
-
-	if (isl_set_plain_is_universe(set)) {
-		isl_set_free(set);
-		return map;
-	}
-
-	if (ISL_F_ISSET(map, ISL_MAP_DISJOINT) &&
-	    ISL_F_ISSET(set, ISL_MAP_DISJOINT))
-		ISL_FL_SET(flags, ISL_MAP_DISJOINT);
-
-	result = isl_map_alloc_space(isl_space_copy(map->dim),
-					map->n * set->n, flags);
-	if (!result)
-		goto error;
-	for (i = 0; i < map->n; ++i)
-		for (j = 0; j < set->n; ++j) {
-			result = isl_map_add_basic_map(result,
-			    isl_basic_map_intersect_range(
-				isl_basic_map_copy(map->p[i]),
-				isl_basic_set_copy(set->p[j])));
-			if (!result)
-				goto error;
-		}
-	isl_map_free(map);
-	isl_set_free(set);
-	return result;
-error:
-	isl_map_free(map);
-	isl_set_free(set);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_intersect_range(__isl_take isl_map *map,
-	__isl_take isl_set *set)
-{
-	return isl_map_align_params_map_map_and(map, set, &map_intersect_range);
-}
-
-struct isl_map *isl_map_intersect_domain(
-		struct isl_map *map, struct isl_set *set)
-{
-	return isl_map_reverse(
-		isl_map_intersect_range(isl_map_reverse(map), set));
-}
-
-static __isl_give isl_map *map_apply_domain(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	if (!map1 || !map2)
-		goto error;
-	map1 = isl_map_reverse(map1);
-	map1 = isl_map_apply_range(map1, map2);
-	return isl_map_reverse(map1);
-error:
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_apply_domain(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	return isl_map_align_params_map_map_and(map1, map2, &map_apply_domain);
-}
-
-static __isl_give isl_map *map_apply_range(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	isl_space *dim_result;
-	struct isl_map *result;
-	int i, j;
-
-	if (!map1 || !map2)
-		goto error;
-
-	dim_result = isl_space_join(isl_space_copy(map1->dim),
-				  isl_space_copy(map2->dim));
-
-	result = isl_map_alloc_space(dim_result, map1->n * map2->n, 0);
-	if (!result)
-		goto error;
-	for (i = 0; i < map1->n; ++i)
-		for (j = 0; j < map2->n; ++j) {
-			result = isl_map_add_basic_map(result,
-			    isl_basic_map_apply_range(
-				isl_basic_map_copy(map1->p[i]),
-				isl_basic_map_copy(map2->p[j])));
-			if (!result)
-				goto error;
-		}
-	isl_map_free(map1);
-	isl_map_free(map2);
-	if (result && result->n <= 1)
-		ISL_F_SET(result, ISL_MAP_DISJOINT);
-	return result;
-error:
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_apply_range(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	return isl_map_align_params_map_map_and(map1, map2, &map_apply_range);
-}
-
-/*
- * returns range - domain
- */
-struct isl_basic_set *isl_basic_map_deltas(struct isl_basic_map *bmap)
-{
-	isl_space *dims, *target_dim;
-	struct isl_basic_set *bset;
-	unsigned dim;
-	unsigned nparam;
-	int i;
-
-	if (!bmap)
-		goto error;
-	isl_assert(bmap->ctx, isl_space_tuple_match(bmap->dim, isl_dim_in,
-						  bmap->dim, isl_dim_out),
-		   goto error);
-	target_dim = isl_space_domain(isl_basic_map_get_space(bmap));
-	dim = isl_basic_map_n_in(bmap);
-	nparam = isl_basic_map_n_param(bmap);
-	bset = isl_basic_set_from_basic_map(bmap);
-	bset = isl_basic_set_cow(bset);
-	dims = isl_basic_set_get_space(bset);
-	dims = isl_space_add_dims(dims, isl_dim_set, dim);
-	bset = isl_basic_set_extend_space(bset, dims, 0, dim, 0);
-	bset = isl_basic_set_swap_vars(bset, 2*dim);
-	for (i = 0; i < dim; ++i) {
-		int j = isl_basic_map_alloc_equality(
-					    (struct isl_basic_map *)bset);
-		if (j < 0)
-			goto error;
-		isl_seq_clr(bset->eq[j], 1 + isl_basic_set_total_dim(bset));
-		isl_int_set_si(bset->eq[j][1+nparam+i], 1);
-		isl_int_set_si(bset->eq[j][1+nparam+dim+i], 1);
-		isl_int_set_si(bset->eq[j][1+nparam+2*dim+i], -1);
-	}
-	bset = isl_basic_set_project_out(bset, isl_dim_set, dim, 2*dim);
-	bset = isl_basic_set_reset_space(bset, target_dim);
-	return bset;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/*
- * returns range - domain
- */
-struct isl_set *isl_map_deltas(struct isl_map *map)
-{
-	int i;
-	isl_space *dim;
-	struct isl_set *result;
-
-	if (!map)
-		return NULL;
-
-	isl_assert(map->ctx, isl_space_tuple_match(map->dim, isl_dim_in,
-						 map->dim, isl_dim_out),
-		   goto error);
-	dim = isl_map_get_space(map);
-	dim = isl_space_domain(dim);
-	result = isl_set_alloc_space(dim, map->n, 0);
-	if (!result)
-		goto error;
-	for (i = 0; i < map->n; ++i)
-		result = isl_set_add_basic_set(result,
-			  isl_basic_map_deltas(isl_basic_map_copy(map->p[i])));
-	isl_map_free(map);
-	return result;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/*
- * returns [domain -> range] -> range - domain
- */
-__isl_give isl_basic_map *isl_basic_map_deltas_map(
-	__isl_take isl_basic_map *bmap)
-{
-	int i, k;
-	isl_space *dim;
-	isl_basic_map *domain;
-	int nparam, n;
-	unsigned total;
-
-	if (!isl_space_tuple_match(bmap->dim, isl_dim_in, bmap->dim, isl_dim_out))
-		isl_die(bmap->ctx, isl_error_invalid,
-			"domain and range don't match", goto error);
-
-	nparam = isl_basic_map_dim(bmap, isl_dim_param);
-	n = isl_basic_map_dim(bmap, isl_dim_in);
-
-	dim = isl_space_from_range(isl_space_domain(isl_basic_map_get_space(bmap)));
-	domain = isl_basic_map_universe(dim);
-
-	bmap = isl_basic_map_from_domain(isl_basic_map_wrap(bmap));
-	bmap = isl_basic_map_apply_range(bmap, domain);
-	bmap = isl_basic_map_extend_constraints(bmap, n, 0);
-
-	total = isl_basic_map_total_dim(bmap);
-
-	for (i = 0; i < n; ++i) {
-		k = isl_basic_map_alloc_equality(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(bmap->eq[k], 1 + total);
-		isl_int_set_si(bmap->eq[k][1 + nparam + i], 1);
-		isl_int_set_si(bmap->eq[k][1 + nparam + n + i], -1);
-		isl_int_set_si(bmap->eq[k][1 + nparam + n + n + i], 1);
-	}
-
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/*
- * returns [domain -> range] -> range - domain
- */
-__isl_give isl_map *isl_map_deltas_map(__isl_take isl_map *map)
-{
-	int i;
-	isl_space *domain_dim;
-
-	if (!map)
-		return NULL;
-
-	if (!isl_space_tuple_match(map->dim, isl_dim_in, map->dim, isl_dim_out))
-		isl_die(map->ctx, isl_error_invalid,
-			"domain and range don't match", goto error);
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	domain_dim = isl_space_from_range(isl_space_domain(isl_map_get_space(map)));
-	map->dim = isl_space_from_domain(isl_space_wrap(map->dim));
-	map->dim = isl_space_join(map->dim, domain_dim);
-	if (!map->dim)
-		goto error;
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_deltas_map(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give struct isl_basic_map *basic_map_identity(__isl_take isl_space *dims)
-{
-	struct isl_basic_map *bmap;
-	unsigned nparam;
-	unsigned dim;
-	int i;
-
-	if (!dims)
-		return NULL;
-
-	nparam = dims->nparam;
-	dim = dims->n_out;
-	bmap = isl_basic_map_alloc_space(dims, 0, dim, 0);
-	if (!bmap)
-		goto error;
-
-	for (i = 0; i < dim; ++i) {
-		int j = isl_basic_map_alloc_equality(bmap);
-		if (j < 0)
-			goto error;
-		isl_seq_clr(bmap->eq[j], 1 + isl_basic_map_total_dim(bmap));
-		isl_int_set_si(bmap->eq[j][1+nparam+i], 1);
-		isl_int_set_si(bmap->eq[j][1+nparam+dim+i], -1);
-	}
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_identity(__isl_take isl_space *dim)
-{
-	if (!dim)
-		return NULL;
-	if (dim->n_in != dim->n_out)
-		isl_die(dim->ctx, isl_error_invalid,
-			"number of input and output dimensions needs to be "
-			"the same", goto error);
-	return basic_map_identity(dim);
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-struct isl_basic_map *isl_basic_map_identity_like(struct isl_basic_map *model)
-{
-	if (!model || !model->dim)
-		return NULL;
-	return isl_basic_map_identity(isl_space_copy(model->dim));
-}
-
-__isl_give isl_map *isl_map_identity(__isl_take isl_space *dim)
-{
-	return isl_map_from_basic_map(isl_basic_map_identity(dim));
-}
-
-struct isl_map *isl_map_identity_like(struct isl_map *model)
-{
-	if (!model || !model->dim)
-		return NULL;
-	return isl_map_identity(isl_space_copy(model->dim));
-}
-
-struct isl_map *isl_map_identity_like_basic_map(struct isl_basic_map *model)
-{
-	if (!model || !model->dim)
-		return NULL;
-	return isl_map_identity(isl_space_copy(model->dim));
-}
-
-__isl_give isl_map *isl_set_identity(__isl_take isl_set *set)
-{
-	isl_space *dim = isl_set_get_space(set);
-	isl_map *id;
-	id = isl_map_identity(isl_space_map_from_set(dim));
-	return isl_map_intersect_range(id, set);
-}
-
-/* Construct a basic set with all set dimensions having only non-negative
- * values.
- */
-__isl_give isl_basic_set *isl_basic_set_positive_orthant(
-	__isl_take isl_space *space)
-{
-	int i;
-	unsigned nparam;
-	unsigned dim;
-	struct isl_basic_set *bset;
-
-	if (!space)
-		return NULL;
-	nparam = space->nparam;
-	dim = space->n_out;
-	bset = isl_basic_set_alloc_space(space, 0, 0, dim);
-	if (!bset)
-		return NULL;
-	for (i = 0; i < dim; ++i) {
-		int k = isl_basic_set_alloc_inequality(bset);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(bset->ineq[k], 1 + isl_basic_set_total_dim(bset));
-		isl_int_set_si(bset->ineq[k][1 + nparam + i], 1);
-	}
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Construct the half-space x_pos >= 0.
- */
-static __isl_give isl_basic_set *nonneg_halfspace(__isl_take isl_space *dim,
-	int pos)
-{
-	int k;
-	isl_basic_set *nonneg;
-
-	nonneg = isl_basic_set_alloc_space(dim, 0, 0, 1);
-	k = isl_basic_set_alloc_inequality(nonneg);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(nonneg->ineq[k], 1 + isl_basic_set_total_dim(nonneg));
-	isl_int_set_si(nonneg->ineq[k][pos], 1);
-
-	return isl_basic_set_finalize(nonneg);
-error:
-	isl_basic_set_free(nonneg);
-	return NULL;
-}
-
-/* Construct the half-space x_pos <= -1.
- */
-static __isl_give isl_basic_set *neg_halfspace(__isl_take isl_space *dim, int pos)
-{
-	int k;
-	isl_basic_set *neg;
-
-	neg = isl_basic_set_alloc_space(dim, 0, 0, 1);
-	k = isl_basic_set_alloc_inequality(neg);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(neg->ineq[k], 1 + isl_basic_set_total_dim(neg));
-	isl_int_set_si(neg->ineq[k][0], -1);
-	isl_int_set_si(neg->ineq[k][pos], -1);
-
-	return isl_basic_set_finalize(neg);
-error:
-	isl_basic_set_free(neg);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_split_dims(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-	isl_basic_set *nonneg;
-	isl_basic_set *neg;
-
-	if (!set)
-		return NULL;
-	if (n == 0)
-		return set;
-
-	isl_assert(set->ctx, first + n <= isl_set_dim(set, type), goto error);
-
-	for (i = 0; i < n; ++i) {
-		nonneg = nonneg_halfspace(isl_set_get_space(set),
-					  pos(set->dim, type) + first + i);
-		neg = neg_halfspace(isl_set_get_space(set),
-					  pos(set->dim, type) + first + i);
-
-		set = isl_set_intersect(set, isl_basic_set_union(nonneg, neg));
-	}
-
-	return set;
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-static int foreach_orthant(__isl_take isl_set *set, int *signs, int first,
-	int len, int (*fn)(__isl_take isl_set *orthant, int *signs, void *user),
-	void *user)
-{
-	isl_set *half;
-
-	if (!set)
-		return -1;
-	if (isl_set_plain_is_empty(set)) {
-		isl_set_free(set);
-		return 0;
-	}
-	if (first == len)
-		return fn(set, signs, user);
-
-	signs[first] = 1;
-	half = isl_set_from_basic_set(nonneg_halfspace(isl_set_get_space(set),
-							1 + first));
-	half = isl_set_intersect(half, isl_set_copy(set));
-	if (foreach_orthant(half, signs, first + 1, len, fn, user) < 0)
-		goto error;
-
-	signs[first] = -1;
-	half = isl_set_from_basic_set(neg_halfspace(isl_set_get_space(set),
-							1 + first));
-	half = isl_set_intersect(half, set);
-	return foreach_orthant(half, signs, first + 1, len, fn, user);
-error:
-	isl_set_free(set);
-	return -1;
-}
-
-/* Call "fn" on the intersections of "set" with each of the orthants
- * (except for obviously empty intersections).  The orthant is identified
- * by the signs array, with each entry having value 1 or -1 according
- * to the sign of the corresponding variable.
- */
-int isl_set_foreach_orthant(__isl_keep isl_set *set,
-	int (*fn)(__isl_take isl_set *orthant, int *signs, void *user),
-	void *user)
-{
-	unsigned nparam;
-	unsigned nvar;
-	int *signs;
-	int r;
-
-	if (!set)
-		return -1;
-	if (isl_set_plain_is_empty(set))
-		return 0;
-
-	nparam = isl_set_dim(set, isl_dim_param);
-	nvar = isl_set_dim(set, isl_dim_set);
-
-	signs = isl_alloc_array(set->ctx, int, nparam + nvar);
-
-	r = foreach_orthant(isl_set_copy(set), signs, 0, nparam + nvar,
-			    fn, user);
-
-	free(signs);
-
-	return r;
-}
-
-int isl_set_is_equal(struct isl_set *set1, struct isl_set *set2)
-{
-	return isl_map_is_equal((struct isl_map *)set1, (struct isl_map *)set2);
-}
-
-int isl_basic_map_is_subset(
-		struct isl_basic_map *bmap1, struct isl_basic_map *bmap2)
-{
-	int is_subset;
-	struct isl_map *map1;
-	struct isl_map *map2;
-
-	if (!bmap1 || !bmap2)
-		return -1;
-
-	map1 = isl_map_from_basic_map(isl_basic_map_copy(bmap1));
-	map2 = isl_map_from_basic_map(isl_basic_map_copy(bmap2));
-
-	is_subset = isl_map_is_subset(map1, map2);
-
-	isl_map_free(map1);
-	isl_map_free(map2);
-
-	return is_subset;
-}
-
-int isl_basic_map_is_equal(
-		struct isl_basic_map *bmap1, struct isl_basic_map *bmap2)
-{
-	int is_subset;
-
-	if (!bmap1 || !bmap2)
-		return -1;
-	is_subset = isl_basic_map_is_subset(bmap1, bmap2);
-	if (is_subset != 1)
-		return is_subset;
-	is_subset = isl_basic_map_is_subset(bmap2, bmap1);
-	return is_subset;
-}
-
-int isl_basic_set_is_equal(
-		struct isl_basic_set *bset1, struct isl_basic_set *bset2)
-{
-	return isl_basic_map_is_equal(
-		(struct isl_basic_map *)bset1, (struct isl_basic_map *)bset2);
-}
-
-int isl_map_is_empty(struct isl_map *map)
-{
-	int i;
-	int is_empty;
-
-	if (!map)
-		return -1;
-	for (i = 0; i < map->n; ++i) {
-		is_empty = isl_basic_map_is_empty(map->p[i]);
-		if (is_empty < 0)
-			return -1;
-		if (!is_empty)
-			return 0;
-	}
-	return 1;
-}
-
-int isl_map_plain_is_empty(__isl_keep isl_map *map)
-{
-	return map ? map->n == 0 : -1;
-}
-
-int isl_map_fast_is_empty(__isl_keep isl_map *map)
-{
-	return isl_map_plain_is_empty(map);
-}
-
-int isl_set_plain_is_empty(struct isl_set *set)
-{
-	return set ? set->n == 0 : -1;
-}
-
-int isl_set_fast_is_empty(__isl_keep isl_set *set)
-{
-	return isl_set_plain_is_empty(set);
-}
-
-int isl_set_is_empty(struct isl_set *set)
-{
-	return isl_map_is_empty((struct isl_map *)set);
-}
-
-int isl_map_has_equal_space(__isl_keep isl_map *map1, __isl_keep isl_map *map2)
-{
-	if (!map1 || !map2)
-		return -1;
-
-	return isl_space_is_equal(map1->dim, map2->dim);
-}
-
-int isl_set_has_equal_space(__isl_keep isl_set *set1, __isl_keep isl_set *set2)
-{
-	if (!set1 || !set2)
-		return -1;
-
-	return isl_space_is_equal(set1->dim, set2->dim);
-}
-
-static int map_is_equal(__isl_keep isl_map *map1, __isl_keep isl_map *map2)
-{
-	int is_subset;
-
-	if (!map1 || !map2)
-		return -1;
-	is_subset = isl_map_is_subset(map1, map2);
-	if (is_subset != 1)
-		return is_subset;
-	is_subset = isl_map_is_subset(map2, map1);
-	return is_subset;
-}
-
-int isl_map_is_equal(__isl_keep isl_map *map1, __isl_keep isl_map *map2)
-{
-	return isl_map_align_params_map_map_and_test(map1, map2, &map_is_equal);
-}
-
-int isl_basic_map_is_strict_subset(
-		struct isl_basic_map *bmap1, struct isl_basic_map *bmap2)
-{
-	int is_subset;
-
-	if (!bmap1 || !bmap2)
-		return -1;
-	is_subset = isl_basic_map_is_subset(bmap1, bmap2);
-	if (is_subset != 1)
-		return is_subset;
-	is_subset = isl_basic_map_is_subset(bmap2, bmap1);
-	if (is_subset == -1)
-		return is_subset;
-	return !is_subset;
-}
-
-int isl_map_is_strict_subset(struct isl_map *map1, struct isl_map *map2)
-{
-	int is_subset;
-
-	if (!map1 || !map2)
-		return -1;
-	is_subset = isl_map_is_subset(map1, map2);
-	if (is_subset != 1)
-		return is_subset;
-	is_subset = isl_map_is_subset(map2, map1);
-	if (is_subset == -1)
-		return is_subset;
-	return !is_subset;
-}
-
-int isl_set_is_strict_subset(__isl_keep isl_set *set1, __isl_keep isl_set *set2)
-{
-	return isl_map_is_strict_subset((isl_map *)set1, (isl_map *)set2);
-}
-
-int isl_basic_map_is_universe(struct isl_basic_map *bmap)
-{
-	if (!bmap)
-		return -1;
-	return bmap->n_eq == 0 && bmap->n_ineq == 0;
-}
-
-int isl_basic_set_is_universe(struct isl_basic_set *bset)
-{
-	if (!bset)
-		return -1;
-	return bset->n_eq == 0 && bset->n_ineq == 0;
-}
-
-int isl_map_plain_is_universe(__isl_keep isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return -1;
-
-	for (i = 0; i < map->n; ++i) {
-		int r = isl_basic_map_is_universe(map->p[i]);
-		if (r < 0 || r)
-			return r;
-	}
-
-	return 0;
-}
-
-int isl_set_plain_is_universe(__isl_keep isl_set *set)
-{
-	return isl_map_plain_is_universe((isl_map *) set);
-}
-
-int isl_set_fast_is_universe(__isl_keep isl_set *set)
-{
-	return isl_set_plain_is_universe(set);
-}
-
-int isl_basic_map_is_empty(struct isl_basic_map *bmap)
-{
-	struct isl_basic_set *bset = NULL;
-	struct isl_vec *sample = NULL;
-	int empty;
-	unsigned total;
-
-	if (!bmap)
-		return -1;
-
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY))
-		return 1;
-
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL)) {
-		struct isl_basic_map *copy = isl_basic_map_copy(bmap);
-		copy = isl_basic_map_remove_redundancies(copy);
-		empty = ISL_F_ISSET(copy, ISL_BASIC_MAP_EMPTY);
-		isl_basic_map_free(copy);
-		return empty;
-	}
-
-	total = 1 + isl_basic_map_total_dim(bmap);
-	if (bmap->sample && bmap->sample->size == total) {
-		int contains = isl_basic_map_contains(bmap, bmap->sample);
-		if (contains < 0)
-			return -1;
-		if (contains)
-			return 0;
-	}
-	isl_vec_free(bmap->sample);
-	bmap->sample = NULL;
-	bset = isl_basic_map_underlying_set(isl_basic_map_copy(bmap));
-	if (!bset)
-		return -1;
-	sample = isl_basic_set_sample_vec(bset);
-	if (!sample)
-		return -1;
-	empty = sample->size == 0;
-	isl_vec_free(bmap->sample);
-	bmap->sample = sample;
-	if (empty)
-		ISL_F_SET(bmap, ISL_BASIC_MAP_EMPTY);
-
-	return empty;
-}
-
-int isl_basic_map_plain_is_empty(__isl_keep isl_basic_map *bmap)
-{
-	if (!bmap)
-		return -1;
-	return ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY);
-}
-
-int isl_basic_map_fast_is_empty(__isl_keep isl_basic_map *bmap)
-{
-	return isl_basic_map_plain_is_empty(bmap);
-}
-
-int isl_basic_set_plain_is_empty(__isl_keep isl_basic_set *bset)
-{
-	if (!bset)
-		return -1;
-	return ISL_F_ISSET(bset, ISL_BASIC_SET_EMPTY);
-}
-
-int isl_basic_set_fast_is_empty(__isl_keep isl_basic_set *bset)
-{
-	return isl_basic_set_plain_is_empty(bset);
-}
-
-int isl_basic_set_is_empty(struct isl_basic_set *bset)
-{
-	return isl_basic_map_is_empty((struct isl_basic_map *)bset);
-}
-
-struct isl_map *isl_basic_map_union(
-	struct isl_basic_map *bmap1, struct isl_basic_map *bmap2)
-{
-	struct isl_map *map;
-	if (!bmap1 || !bmap2)
-		return NULL;
-
-	isl_assert(bmap1->ctx, isl_space_is_equal(bmap1->dim, bmap2->dim), goto error);
-
-	map = isl_map_alloc_space(isl_space_copy(bmap1->dim), 2, 0);
-	if (!map)
-		goto error;
-	map = isl_map_add_basic_map(map, bmap1);
-	map = isl_map_add_basic_map(map, bmap2);
-	return map;
-error:
-	isl_basic_map_free(bmap1);
-	isl_basic_map_free(bmap2);
-	return NULL;
-}
-
-struct isl_set *isl_basic_set_union(
-		struct isl_basic_set *bset1, struct isl_basic_set *bset2)
-{
-	return (struct isl_set *)isl_basic_map_union(
-					    (struct isl_basic_map *)bset1,
-					    (struct isl_basic_map *)bset2);
-}
-
-/* Order divs such that any div only depends on previous divs */
-struct isl_basic_map *isl_basic_map_order_divs(struct isl_basic_map *bmap)
-{
-	int i;
-	unsigned off;
-
-	if (!bmap)
-		return NULL;
-
-	off = isl_space_dim(bmap->dim, isl_dim_all);
-
-	for (i = 0; i < bmap->n_div; ++i) {
-		int pos;
-		if (isl_int_is_zero(bmap->div[i][0]))
-			continue;
-		pos = isl_seq_first_non_zero(bmap->div[i]+1+1+off+i,
-							    bmap->n_div-i);
-		if (pos == -1)
-			continue;
-		isl_basic_map_swap_div(bmap, i, i + pos);
-		--i;
-	}
-	return bmap;
-}
-
-struct isl_basic_set *isl_basic_set_order_divs(struct isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_order_divs((struct isl_basic_map *)bset);
-}
-
-__isl_give isl_map *isl_map_order_divs(__isl_take isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return 0;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_order_divs(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Apply the expansion computed by isl_merge_divs.
- * The expansion itself is given by "exp" while the resulting
- * list of divs is given by "div".
- */
-__isl_give isl_basic_set *isl_basic_set_expand_divs(
-	__isl_take isl_basic_set *bset, __isl_take isl_mat *div, int *exp)
-{
-	int i, j;
-	int n_div;
-
-	bset = isl_basic_set_cow(bset);
-	if (!bset || !div)
-		goto error;
-
-	if (div->n_row < bset->n_div)
-		isl_die(isl_mat_get_ctx(div), isl_error_invalid,
-			"not an expansion", goto error);
-
-	bset = isl_basic_map_extend_space(bset, isl_space_copy(bset->dim),
-					div->n_row - bset->n_div, 0,
-					2 * (div->n_row - bset->n_div));
-
-	n_div = bset->n_div;
-	for (i = n_div; i < div->n_row; ++i)
-		if (isl_basic_set_alloc_div(bset) < 0)
-			goto error;
-
-	j = n_div - 1;
-	for (i = div->n_row - 1; i >= 0; --i) {
-		if (j >= 0 && exp[j] == i) {
-			if (i != j)
-				isl_basic_map_swap_div(bset, i, j);
-			j--;
-		} else {
-			isl_seq_cpy(bset->div[i], div->row[i], div->n_col);
-			if (isl_basic_map_add_div_constraints(bset, i) < 0)
-				goto error;
-		}
-	}
-
-	isl_mat_free(div);
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	isl_mat_free(div);
-	return NULL;
-}
-
-/* Look for a div in dst that corresponds to the div "div" in src.
- * The divs before "div" in src and dst are assumed to be the same.
- * 
- * Returns -1 if no corresponding div was found and the position
- * of the corresponding div in dst otherwise.
- */
-static int find_div(struct isl_basic_map *dst,
-			struct isl_basic_map *src, unsigned div)
-{
-	int i;
-
-	unsigned total = isl_space_dim(src->dim, isl_dim_all);
-
-	isl_assert(dst->ctx, div <= dst->n_div, return -1);
-	for (i = div; i < dst->n_div; ++i)
-		if (isl_seq_eq(dst->div[i], src->div[div], 1+1+total+div) &&
-		    isl_seq_first_non_zero(dst->div[i]+1+1+total+div,
-						dst->n_div - div) == -1)
-			return i;
-	return -1;
-}
-
-struct isl_basic_map *isl_basic_map_align_divs(
-		struct isl_basic_map *dst, struct isl_basic_map *src)
-{
-	int i;
-	unsigned total = isl_space_dim(src->dim, isl_dim_all);
-
-	if (!dst || !src)
-		goto error;
-
-	if (src->n_div == 0)
-		return dst;
-
-	for (i = 0; i < src->n_div; ++i)
-		isl_assert(src->ctx, !isl_int_is_zero(src->div[i][0]), goto error);
-
-	src = isl_basic_map_order_divs(src);
-	dst = isl_basic_map_cow(dst);
-	dst = isl_basic_map_extend_space(dst, isl_space_copy(dst->dim),
-			src->n_div, 0, 2 * src->n_div);
-	if (!dst)
-		return NULL;
-	for (i = 0; i < src->n_div; ++i) {
-		int j = find_div(dst, src, i);
-		if (j < 0) {
-			j = isl_basic_map_alloc_div(dst);
-			if (j < 0)
-				goto error;
-			isl_seq_cpy(dst->div[j], src->div[i], 1+1+total+i);
-			isl_seq_clr(dst->div[j]+1+1+total+i, dst->n_div - i);
-			if (isl_basic_map_add_div_constraints(dst, j) < 0)
-				goto error;
-		}
-		if (j != i)
-			isl_basic_map_swap_div(dst, i, j);
-	}
-	return dst;
-error:
-	isl_basic_map_free(dst);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_align_divs(
-		struct isl_basic_set *dst, struct isl_basic_set *src)
-{
-	return (struct isl_basic_set *)isl_basic_map_align_divs(
-		(struct isl_basic_map *)dst, (struct isl_basic_map *)src);
-}
-
-struct isl_map *isl_map_align_divs(struct isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-	if (map->n == 0)
-		return map;
-	map = isl_map_compute_divs(map);
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	for (i = 1; i < map->n; ++i)
-		map->p[0] = isl_basic_map_align_divs(map->p[0], map->p[i]);
-	for (i = 1; i < map->n; ++i)
-		map->p[i] = isl_basic_map_align_divs(map->p[i], map->p[0]);
-
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-}
-
-struct isl_set *isl_set_align_divs(struct isl_set *set)
-{
-	return (struct isl_set *)isl_map_align_divs((struct isl_map *)set);
-}
-
-static __isl_give isl_set *set_apply( __isl_take isl_set *set,
-	__isl_take isl_map *map)
-{
-	if (!set || !map)
-		goto error;
-	isl_assert(set->ctx, isl_map_compatible_domain(map, set), goto error);
-	map = isl_map_intersect_domain(map, set);
-	set = isl_map_range(map);
-	return set;
-error:
-	isl_set_free(set);
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_apply( __isl_take isl_set *set,
-	__isl_take isl_map *map)
-{
-	return isl_map_align_params_map_map_and(set, map, &set_apply);
-}
-
-/* There is no need to cow as removing empty parts doesn't change
- * the meaning of the set.
- */
-struct isl_map *isl_map_remove_empty_parts(struct isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-
-	for (i = map->n-1; i >= 0; --i) {
-		if (!ISL_F_ISSET(map->p[i], ISL_BASIC_MAP_EMPTY))
-			continue;
-		isl_basic_map_free(map->p[i]);
-		if (i != map->n-1) {
-			ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-			map->p[i] = map->p[map->n-1];
-		}
-		map->n--;
-	}
-
-	return map;
-}
-
-struct isl_set *isl_set_remove_empty_parts(struct isl_set *set)
-{
-	return (struct isl_set *)
-		isl_map_remove_empty_parts((struct isl_map *)set);
-}
-
-struct isl_basic_map *isl_map_copy_basic_map(struct isl_map *map)
-{
-	struct isl_basic_map *bmap;
-	if (!map || map->n == 0)
-		return NULL;
-	bmap = map->p[map->n-1];
-	isl_assert(map->ctx, ISL_F_ISSET(bmap, ISL_BASIC_SET_FINAL), return NULL);
-	return isl_basic_map_copy(bmap);
-}
-
-struct isl_basic_set *isl_set_copy_basic_set(struct isl_set *set)
-{
-	return (struct isl_basic_set *)
-		isl_map_copy_basic_map((struct isl_map *)set);
-}
-
-__isl_give isl_map *isl_map_drop_basic_map(__isl_take isl_map *map,
-						__isl_keep isl_basic_map *bmap)
-{
-	int i;
-
-	if (!map || !bmap)
-		goto error;
-	for (i = map->n-1; i >= 0; --i) {
-		if (map->p[i] != bmap)
-			continue;
-		map = isl_map_cow(map);
-		if (!map)
-			goto error;
-		isl_basic_map_free(map->p[i]);
-		if (i != map->n-1) {
-			ISL_F_CLR(map, ISL_SET_NORMALIZED);
-			map->p[i] = map->p[map->n-1];
-		}
-		map->n--;
-		return map;
-	}
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-struct isl_set *isl_set_drop_basic_set(struct isl_set *set,
-						struct isl_basic_set *bset)
-{
-	return (struct isl_set *)isl_map_drop_basic_map((struct isl_map *)set,
-						(struct isl_basic_map *)bset);
-}
-
-/* Given two basic sets bset1 and bset2, compute the maximal difference
- * between the values of dimension pos in bset1 and those in bset2
- * for any common value of the parameters and dimensions preceding pos.
- */
-static enum isl_lp_result basic_set_maximal_difference_at(
-	__isl_keep isl_basic_set *bset1, __isl_keep isl_basic_set *bset2,
-	int pos, isl_int *opt)
-{
-	isl_space *dims;
-	struct isl_basic_map *bmap1 = NULL;
-	struct isl_basic_map *bmap2 = NULL;
-	struct isl_ctx *ctx;
-	struct isl_vec *obj;
-	unsigned total;
-	unsigned nparam;
-	unsigned dim1, dim2;
-	enum isl_lp_result res;
-
-	if (!bset1 || !bset2)
-		return isl_lp_error;
-
-	nparam = isl_basic_set_n_param(bset1);
-	dim1 = isl_basic_set_n_dim(bset1);
-	dim2 = isl_basic_set_n_dim(bset2);
-	dims = isl_space_alloc(bset1->ctx, nparam, pos, dim1 - pos);
-	bmap1 = isl_basic_map_from_basic_set(isl_basic_set_copy(bset1), dims);
-	dims = isl_space_alloc(bset2->ctx, nparam, pos, dim2 - pos);
-	bmap2 = isl_basic_map_from_basic_set(isl_basic_set_copy(bset2), dims);
-	if (!bmap1 || !bmap2)
-		goto error;
-	bmap1 = isl_basic_map_cow(bmap1);
-	bmap1 = isl_basic_map_extend(bmap1, nparam,
-			pos, (dim1 - pos) + (dim2 - pos),
-			bmap2->n_div, bmap2->n_eq, bmap2->n_ineq);
-	bmap1 = add_constraints(bmap1, bmap2, 0, dim1 - pos);
-	if (!bmap1)
-		goto error;
-	total = isl_basic_map_total_dim(bmap1);
-	ctx = bmap1->ctx;
-	obj = isl_vec_alloc(ctx, 1 + total);
-	isl_seq_clr(obj->block.data, 1 + total);
-	isl_int_set_si(obj->block.data[1+nparam+pos], 1);
-	isl_int_set_si(obj->block.data[1+nparam+pos+(dim1-pos)], -1);
-	if (!obj)
-		goto error;
-	res = isl_basic_map_solve_lp(bmap1, 1, obj->block.data, ctx->one,
-					opt, NULL, NULL);
-	isl_basic_map_free(bmap1);
-	isl_vec_free(obj);
-	return res;
-error:
-	isl_basic_map_free(bmap1);
-	isl_basic_map_free(bmap2);
-	return isl_lp_error;
-}
-
-/* Given two _disjoint_ basic sets bset1 and bset2, check whether
- * for any common value of the parameters and dimensions preceding pos
- * in both basic sets, the values of dimension pos in bset1 are
- * smaller or larger than those in bset2.
- *
- * Returns
- *	 1 if bset1 follows bset2
- *	-1 if bset1 precedes bset2
- *	 0 if bset1 and bset2 are incomparable
- *	-2 if some error occurred.
- */
-int isl_basic_set_compare_at(struct isl_basic_set *bset1,
-	struct isl_basic_set *bset2, int pos)
-{
-	isl_int opt;
-	enum isl_lp_result res;
-	int cmp;
-
-	isl_int_init(opt);
-
-	res = basic_set_maximal_difference_at(bset1, bset2, pos, &opt);
-
-	if (res == isl_lp_empty)
-		cmp = 0;
-	else if ((res == isl_lp_ok && isl_int_is_pos(opt)) ||
-		  res == isl_lp_unbounded)
-		cmp = 1;
-	else if (res == isl_lp_ok && isl_int_is_neg(opt))
-		cmp = -1;
-	else
-		cmp = -2;
-
-	isl_int_clear(opt);
-	return cmp;
-}
-
-/* Given two basic sets bset1 and bset2, check whether
- * for any common value of the parameters and dimensions preceding pos
- * there is a value of dimension pos in bset1 that is larger
- * than a value of the same dimension in bset2.
- *
- * Return
- *	 1 if there exists such a pair
- *	 0 if there is no such pair, but there is a pair of equal values
- *	-1 otherwise
- *	-2 if some error occurred.
- */
-int isl_basic_set_follows_at(__isl_keep isl_basic_set *bset1,
-	__isl_keep isl_basic_set *bset2, int pos)
-{
-	isl_int opt;
-	enum isl_lp_result res;
-	int cmp;
-
-	isl_int_init(opt);
-
-	res = basic_set_maximal_difference_at(bset1, bset2, pos, &opt);
-
-	if (res == isl_lp_empty)
-		cmp = -1;
-	else if ((res == isl_lp_ok && isl_int_is_pos(opt)) ||
-		  res == isl_lp_unbounded)
-		cmp = 1;
-	else if (res == isl_lp_ok && isl_int_is_neg(opt))
-		cmp = -1;
-	else if (res == isl_lp_ok)
-		cmp = 0;
-	else
-		cmp = -2;
-
-	isl_int_clear(opt);
-	return cmp;
-}
-
-/* Given two sets set1 and set2, check whether
- * for any common value of the parameters and dimensions preceding pos
- * there is a value of dimension pos in set1 that is larger
- * than a value of the same dimension in set2.
- *
- * Return
- *	 1 if there exists such a pair
- *	 0 if there is no such pair, but there is a pair of equal values
- *	-1 otherwise
- *	-2 if some error occurred.
- */
-int isl_set_follows_at(__isl_keep isl_set *set1,
-	__isl_keep isl_set *set2, int pos)
-{
-	int i, j;
-	int follows = -1;
-
-	if (!set1 || !set2)
-		return -2;
-
-	for (i = 0; i < set1->n; ++i)
-		for (j = 0; j < set2->n; ++j) {
-			int f;
-			f = isl_basic_set_follows_at(set1->p[i], set2->p[j], pos);
-			if (f == 1 || f == -2)
-				return f;
-			if (f > follows)
-				follows = f;
-		}
-
-	return follows;
-}
-
-static int isl_basic_map_plain_has_fixed_var(__isl_keep isl_basic_map *bmap,
-	unsigned pos, isl_int *val)
-{
-	int i;
-	int d;
-	unsigned total;
-
-	if (!bmap)
-		return -1;
-	total = isl_basic_map_total_dim(bmap);
-	for (i = 0, d = total-1; i < bmap->n_eq && d+1 > pos; ++i) {
-		for (; d+1 > pos; --d)
-			if (!isl_int_is_zero(bmap->eq[i][1+d]))
-				break;
-		if (d != pos)
-			continue;
-		if (isl_seq_first_non_zero(bmap->eq[i]+1, d) != -1)
-			return 0;
-		if (isl_seq_first_non_zero(bmap->eq[i]+1+d+1, total-d-1) != -1)
-			return 0;
-		if (!isl_int_is_one(bmap->eq[i][1+d]))
-			return 0;
-		if (val)
-			isl_int_neg(*val, bmap->eq[i][0]);
-		return 1;
-	}
-	return 0;
-}
-
-static int isl_map_plain_has_fixed_var(__isl_keep isl_map *map,
-	unsigned pos, isl_int *val)
-{
-	int i;
-	isl_int v;
-	isl_int tmp;
-	int fixed;
-
-	if (!map)
-		return -1;
-	if (map->n == 0)
-		return 0;
-	if (map->n == 1)
-		return isl_basic_map_plain_has_fixed_var(map->p[0], pos, val); 
-	isl_int_init(v);
-	isl_int_init(tmp);
-	fixed = isl_basic_map_plain_has_fixed_var(map->p[0], pos, &v); 
-	for (i = 1; fixed == 1 && i < map->n; ++i) {
-		fixed = isl_basic_map_plain_has_fixed_var(map->p[i], pos, &tmp); 
-		if (fixed == 1 && isl_int_ne(tmp, v))
-			fixed = 0;
-	}
-	if (val)
-		isl_int_set(*val, v);
-	isl_int_clear(tmp);
-	isl_int_clear(v);
-	return fixed;
-}
-
-static int isl_basic_set_plain_has_fixed_var(__isl_keep isl_basic_set *bset,
-	unsigned pos, isl_int *val)
-{
-	return isl_basic_map_plain_has_fixed_var((struct isl_basic_map *)bset,
-						pos, val);
-}
-
-static int isl_set_plain_has_fixed_var(__isl_keep isl_set *set, unsigned pos,
-	isl_int *val)
-{
-	return isl_map_plain_has_fixed_var((struct isl_map *)set, pos, val);
-}
-
-int isl_basic_map_plain_is_fixed(__isl_keep isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned pos, isl_int *val)
-{
-	if (pos >= isl_basic_map_dim(bmap, type))
-		return -1;
-	return isl_basic_map_plain_has_fixed_var(bmap,
-		isl_basic_map_offset(bmap, type) - 1 + pos, val);
-}
-
-int isl_map_plain_is_fixed(__isl_keep isl_map *map,
-	enum isl_dim_type type, unsigned pos, isl_int *val)
-{
-	if (pos >= isl_map_dim(map, type))
-		return -1;
-	return isl_map_plain_has_fixed_var(map,
-		map_offset(map, type) - 1 + pos, val);
-}
-
-int isl_set_plain_is_fixed(__isl_keep isl_set *set,
-	enum isl_dim_type type, unsigned pos, isl_int *val)
-{
-	return isl_map_plain_is_fixed(set, type, pos, val);
-}
-
-int isl_map_fast_is_fixed(__isl_keep isl_map *map,
-	enum isl_dim_type type, unsigned pos, isl_int *val)
-{
-	return isl_map_plain_is_fixed(map, type, pos, val);
-}
-
-/* Check if dimension dim has fixed value and if so and if val is not NULL,
- * then return this fixed value in *val.
- */
-int isl_basic_set_plain_dim_is_fixed(__isl_keep isl_basic_set *bset,
-	unsigned dim, isl_int *val)
-{
-	return isl_basic_set_plain_has_fixed_var(bset,
-					isl_basic_set_n_param(bset) + dim, val);
-}
-
-/* Check if dimension dim has fixed value and if so and if val is not NULL,
- * then return this fixed value in *val.
- */
-int isl_set_plain_dim_is_fixed(__isl_keep isl_set *set,
-	unsigned dim, isl_int *val)
-{
-	return isl_set_plain_has_fixed_var(set, isl_set_n_param(set) + dim, val);
-}
-
-int isl_set_fast_dim_is_fixed(__isl_keep isl_set *set,
-	unsigned dim, isl_int *val)
-{
-	return isl_set_plain_dim_is_fixed(set, dim, val);
-}
-
-/* Check if input variable in has fixed value and if so and if val is not NULL,
- * then return this fixed value in *val.
- */
-int isl_map_plain_input_is_fixed(__isl_keep isl_map *map,
-	unsigned in, isl_int *val)
-{
-	return isl_map_plain_has_fixed_var(map, isl_map_n_param(map) + in, val);
-}
-
-/* Check if dimension dim has an (obvious) fixed lower bound and if so
- * and if val is not NULL, then return this lower bound in *val.
- */
-int isl_basic_set_plain_dim_has_fixed_lower_bound(
-	__isl_keep isl_basic_set *bset, unsigned dim, isl_int *val)
-{
-	int i, i_eq = -1, i_ineq = -1;
-	isl_int *c;
-	unsigned total;
-	unsigned nparam;
-
-	if (!bset)
-		return -1;
-	total = isl_basic_set_total_dim(bset);
-	nparam = isl_basic_set_n_param(bset);
-	for (i = 0; i < bset->n_eq; ++i) {
-		if (isl_int_is_zero(bset->eq[i][1+nparam+dim]))
-			continue;
-		if (i_eq != -1)
-			return 0;
-		i_eq = i;
-	}
-	for (i = 0; i < bset->n_ineq; ++i) {
-		if (!isl_int_is_pos(bset->ineq[i][1+nparam+dim]))
-			continue;
-		if (i_eq != -1 || i_ineq != -1)
-			return 0;
-		i_ineq = i;
-	}
-	if (i_eq == -1 && i_ineq == -1)
-		return 0;
-	c = i_eq != -1 ? bset->eq[i_eq] : bset->ineq[i_ineq];
-	/* The coefficient should always be one due to normalization. */
-	if (!isl_int_is_one(c[1+nparam+dim]))
-		return 0;
-	if (isl_seq_first_non_zero(c+1, nparam+dim) != -1)
-		return 0;
-	if (isl_seq_first_non_zero(c+1+nparam+dim+1,
-					total - nparam - dim - 1) != -1)
-		return 0;
-	if (val)
-		isl_int_neg(*val, c[0]);
-	return 1;
-}
-
-int isl_set_plain_dim_has_fixed_lower_bound(__isl_keep isl_set *set,
-	unsigned dim, isl_int *val)
-{
-	int i;
-	isl_int v;
-	isl_int tmp;
-	int fixed;
-
-	if (!set)
-		return -1;
-	if (set->n == 0)
-		return 0;
-	if (set->n == 1)
-		return isl_basic_set_plain_dim_has_fixed_lower_bound(set->p[0],
-								dim, val);
-	isl_int_init(v);
-	isl_int_init(tmp);
-	fixed = isl_basic_set_plain_dim_has_fixed_lower_bound(set->p[0],
-								dim, &v);
-	for (i = 1; fixed == 1 && i < set->n; ++i) {
-		fixed = isl_basic_set_plain_dim_has_fixed_lower_bound(set->p[i],
-								dim, &tmp);
-		if (fixed == 1 && isl_int_ne(tmp, v))
-			fixed = 0;
-	}
-	if (val)
-		isl_int_set(*val, v);
-	isl_int_clear(tmp);
-	isl_int_clear(v);
-	return fixed;
-}
-
-struct constraint {
-	unsigned	size;
-	isl_int		*c;
-};
-
-/* uset_gist depends on constraints without existentially quantified
- * variables sorting first.
- */
-static int qsort_constraint_cmp(const void *p1, const void *p2)
-{
-	const struct constraint *c1 = (const struct constraint *)p1;
-	const struct constraint *c2 = (const struct constraint *)p2;
-	int l1, l2;
-	unsigned size = isl_min(c1->size, c2->size);
-
-	l1 = isl_seq_last_non_zero(c1->c, size);
-	l2 = isl_seq_last_non_zero(c2->c, size);
-
-	if (l1 != l2)
-		return l1 - l2;
-
-	return isl_seq_cmp(c1->c, c2->c, size);
-}
-
-static struct isl_basic_map *isl_basic_map_sort_constraints(
-	struct isl_basic_map *bmap)
-{
-	int i;
-	struct constraint *c;
-	unsigned total;
-
-	if (!bmap)
-		return NULL;
-	total = isl_basic_map_total_dim(bmap);
-	c = isl_alloc_array(bmap->ctx, struct constraint, bmap->n_ineq);
-	if (!c)
-		goto error;
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		c[i].size = total;
-		c[i].c = bmap->ineq[i];
-	}
-	qsort(c, bmap->n_ineq, sizeof(struct constraint), qsort_constraint_cmp);
-	for (i = 0; i < bmap->n_ineq; ++i)
-		bmap->ineq[i] = c[i].c;
-	free(c);
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_sort_constraints(
-	__isl_take isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)isl_basic_map_sort_constraints(
-						(struct isl_basic_map *)bset);
-}
-
-struct isl_basic_map *isl_basic_map_normalize(struct isl_basic_map *bmap)
-{
-	if (!bmap)
-		return NULL;
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_NORMALIZED))
-		return bmap;
-	bmap = isl_basic_map_remove_redundancies(bmap);
-	bmap = isl_basic_map_sort_constraints(bmap);
-	ISL_F_SET(bmap, ISL_BASIC_MAP_NORMALIZED);
-	return bmap;
-}
-
-struct isl_basic_set *isl_basic_set_normalize(struct isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)isl_basic_map_normalize(
-						(struct isl_basic_map *)bset);
-}
-
-int isl_basic_map_plain_cmp(const __isl_keep isl_basic_map *bmap1,
-	const __isl_keep isl_basic_map *bmap2)
-{
-	int i, cmp;
-	unsigned total;
-
-	if (bmap1 == bmap2)
-		return 0;
-	if (ISL_F_ISSET(bmap1, ISL_BASIC_MAP_RATIONAL) !=
-	    ISL_F_ISSET(bmap2, ISL_BASIC_MAP_RATIONAL))
-		return ISL_F_ISSET(bmap1, ISL_BASIC_MAP_RATIONAL) ? -1 : 1;
-	if (isl_basic_map_n_param(bmap1) != isl_basic_map_n_param(bmap2))
-		return isl_basic_map_n_param(bmap1) - isl_basic_map_n_param(bmap2);
-	if (isl_basic_map_n_in(bmap1) != isl_basic_map_n_in(bmap2))
-		return isl_basic_map_n_out(bmap1) - isl_basic_map_n_out(bmap2);
-	if (isl_basic_map_n_out(bmap1) != isl_basic_map_n_out(bmap2))
-		return isl_basic_map_n_out(bmap1) - isl_basic_map_n_out(bmap2);
-	if (ISL_F_ISSET(bmap1, ISL_BASIC_MAP_EMPTY) &&
-	    ISL_F_ISSET(bmap2, ISL_BASIC_MAP_EMPTY))
-		return 0;
-	if (ISL_F_ISSET(bmap1, ISL_BASIC_MAP_EMPTY))
-		return 1;
-	if (ISL_F_ISSET(bmap2, ISL_BASIC_MAP_EMPTY))
-		return -1;
-	if (bmap1->n_eq != bmap2->n_eq)
-		return bmap1->n_eq - bmap2->n_eq;
-	if (bmap1->n_ineq != bmap2->n_ineq)
-		return bmap1->n_ineq - bmap2->n_ineq;
-	if (bmap1->n_div != bmap2->n_div)
-		return bmap1->n_div - bmap2->n_div;
-	total = isl_basic_map_total_dim(bmap1);
-	for (i = 0; i < bmap1->n_eq; ++i) {
-		cmp = isl_seq_cmp(bmap1->eq[i], bmap2->eq[i], 1+total);
-		if (cmp)
-			return cmp;
-	}
-	for (i = 0; i < bmap1->n_ineq; ++i) {
-		cmp = isl_seq_cmp(bmap1->ineq[i], bmap2->ineq[i], 1+total);
-		if (cmp)
-			return cmp;
-	}
-	for (i = 0; i < bmap1->n_div; ++i) {
-		cmp = isl_seq_cmp(bmap1->div[i], bmap2->div[i], 1+1+total);
-		if (cmp)
-			return cmp;
-	}
-	return 0;
-}
-
-int isl_basic_set_plain_cmp(const __isl_keep isl_basic_set *bset1,
-	const __isl_keep isl_basic_set *bset2)
-{
-	return isl_basic_map_plain_cmp(bset1, bset2);
-}
-
-int isl_set_plain_cmp(const __isl_keep isl_set *set1,
-	const __isl_keep isl_set *set2)
-{
-	int i, cmp;
-
-	if (set1 == set2)
-		return 0;
-	if (set1->n != set2->n)
-		return set1->n - set2->n;
-
-	for (i = 0; i < set1->n; ++i) {
-		cmp = isl_basic_set_plain_cmp(set1->p[i], set2->p[i]);
-		if (cmp)
-			return cmp;
-	}
-
-	return 0;
-}
-
-int isl_basic_map_plain_is_equal(__isl_keep isl_basic_map *bmap1,
-	__isl_keep isl_basic_map *bmap2)
-{
-	return isl_basic_map_plain_cmp(bmap1, bmap2) == 0;
-}
-
-int isl_basic_set_plain_is_equal(__isl_keep isl_basic_set *bset1,
-	__isl_keep isl_basic_set *bset2)
-{
-	return isl_basic_map_plain_is_equal((isl_basic_map *)bset1,
-					    (isl_basic_map *)bset2);
-}
-
-static int qsort_bmap_cmp(const void *p1, const void *p2)
-{
-	const struct isl_basic_map *bmap1 = *(const struct isl_basic_map **)p1;
-	const struct isl_basic_map *bmap2 = *(const struct isl_basic_map **)p2;
-
-	return isl_basic_map_plain_cmp(bmap1, bmap2);
-}
-
-/* We normalize in place, but if anything goes wrong we need
- * to return NULL, so we need to make sure we don't change the
- * meaning of any possible other copies of map.
- */
-struct isl_map *isl_map_normalize(struct isl_map *map)
-{
-	int i, j;
-	struct isl_basic_map *bmap;
-
-	if (!map)
-		return NULL;
-	if (ISL_F_ISSET(map, ISL_MAP_NORMALIZED))
-		return map;
-	for (i = 0; i < map->n; ++i) {
-		bmap = isl_basic_map_normalize(isl_basic_map_copy(map->p[i]));
-		if (!bmap)
-			goto error;
-		isl_basic_map_free(map->p[i]);
-		map->p[i] = bmap;
-	}
-	qsort(map->p, map->n, sizeof(struct isl_basic_map *), qsort_bmap_cmp);
-	ISL_F_SET(map, ISL_MAP_NORMALIZED);
-	map = isl_map_remove_empty_parts(map);
-	if (!map)
-		return NULL;
-	for (i = map->n - 1; i >= 1; --i) {
-		if (!isl_basic_map_plain_is_equal(map->p[i-1], map->p[i]))
-			continue;
-		isl_basic_map_free(map->p[i-1]);
-		for (j = i; j < map->n; ++j)
-			map->p[j-1] = map->p[j];
-		map->n--;
-	}
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-
-}
-
-struct isl_set *isl_set_normalize(struct isl_set *set)
-{
-	return (struct isl_set *)isl_map_normalize((struct isl_map *)set);
-}
-
-int isl_map_plain_is_equal(__isl_keep isl_map *map1, __isl_keep isl_map *map2)
-{
-	int i;
-	int equal;
-
-	if (!map1 || !map2)
-		return -1;
-
-	if (map1 == map2)
-		return 1;
-	if (!isl_space_is_equal(map1->dim, map2->dim))
-		return 0;
-
-	map1 = isl_map_copy(map1);
-	map2 = isl_map_copy(map2);
-	map1 = isl_map_normalize(map1);
-	map2 = isl_map_normalize(map2);
-	if (!map1 || !map2)
-		goto error;
-	equal = map1->n == map2->n;
-	for (i = 0; equal && i < map1->n; ++i) {
-		equal = isl_basic_map_plain_is_equal(map1->p[i], map2->p[i]);
-		if (equal < 0)
-			goto error;
-	}
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return equal;
-error:
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return -1;
-}
-
-int isl_map_fast_is_equal(__isl_keep isl_map *map1, __isl_keep isl_map *map2)
-{
-	return isl_map_plain_is_equal(map1, map2);
-}
-
-int isl_set_plain_is_equal(__isl_keep isl_set *set1, __isl_keep isl_set *set2)
-{
-	return isl_map_plain_is_equal((struct isl_map *)set1,
-						(struct isl_map *)set2);
-}
-
-int isl_set_fast_is_equal(__isl_keep isl_set *set1, __isl_keep isl_set *set2)
-{
-	return isl_set_plain_is_equal(set1, set2);
-}
-
-/* Return an interval that ranges from min to max (inclusive)
- */
-struct isl_basic_set *isl_basic_set_interval(struct isl_ctx *ctx,
-	isl_int min, isl_int max)
-{
-	int k;
-	struct isl_basic_set *bset = NULL;
-
-	bset = isl_basic_set_alloc(ctx, 0, 1, 0, 0, 2);
-	if (!bset)
-		goto error;
-
-	k = isl_basic_set_alloc_inequality(bset);
-	if (k < 0)
-		goto error;
-	isl_int_set_si(bset->ineq[k][1], 1);
-	isl_int_neg(bset->ineq[k][0], min);
-
-	k = isl_basic_set_alloc_inequality(bset);
-	if (k < 0)
-		goto error;
-	isl_int_set_si(bset->ineq[k][1], -1);
-	isl_int_set(bset->ineq[k][0], max);
-
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Return the Cartesian product of the basic sets in list (in the given order).
- */
-__isl_give isl_basic_set *isl_basic_set_list_product(
-	__isl_take struct isl_basic_set_list *list)
-{
-	int i;
-	unsigned dim;
-	unsigned nparam;
-	unsigned extra;
-	unsigned n_eq;
-	unsigned n_ineq;
-	struct isl_basic_set *product = NULL;
-
-	if (!list)
-		goto error;
-	isl_assert(list->ctx, list->n > 0, goto error);
-	isl_assert(list->ctx, list->p[0], goto error);
-	nparam = isl_basic_set_n_param(list->p[0]);
-	dim = isl_basic_set_n_dim(list->p[0]);
-	extra = list->p[0]->n_div;
-	n_eq = list->p[0]->n_eq;
-	n_ineq = list->p[0]->n_ineq;
-	for (i = 1; i < list->n; ++i) {
-		isl_assert(list->ctx, list->p[i], goto error);
-		isl_assert(list->ctx,
-		    nparam == isl_basic_set_n_param(list->p[i]), goto error);
-		dim += isl_basic_set_n_dim(list->p[i]);
-		extra += list->p[i]->n_div;
-		n_eq += list->p[i]->n_eq;
-		n_ineq += list->p[i]->n_ineq;
-	}
-	product = isl_basic_set_alloc(list->ctx, nparam, dim, extra,
-					n_eq, n_ineq);
-	if (!product)
-		goto error;
-	dim = 0;
-	for (i = 0; i < list->n; ++i) {
-		isl_basic_set_add_constraints(product,
-					isl_basic_set_copy(list->p[i]), dim);
-		dim += isl_basic_set_n_dim(list->p[i]);
-	}
-	isl_basic_set_list_free(list);
-	return product;
-error:
-	isl_basic_set_free(product);
-	isl_basic_set_list_free(list);
-	return NULL;
-}
-
-struct isl_basic_map *isl_basic_map_product(
-		struct isl_basic_map *bmap1, struct isl_basic_map *bmap2)
-{
-	isl_space *dim_result = NULL;
-	struct isl_basic_map *bmap;
-	unsigned in1, in2, out1, out2, nparam, total, pos;
-	struct isl_dim_map *dim_map1, *dim_map2;
-
-	if (!bmap1 || !bmap2)
-		goto error;
-
-	isl_assert(bmap1->ctx, isl_space_match(bmap1->dim, isl_dim_param,
-				     bmap2->dim, isl_dim_param), goto error);
-	dim_result = isl_space_product(isl_space_copy(bmap1->dim),
-						   isl_space_copy(bmap2->dim));
-
-	in1 = isl_basic_map_n_in(bmap1);
-	in2 = isl_basic_map_n_in(bmap2);
-	out1 = isl_basic_map_n_out(bmap1);
-	out2 = isl_basic_map_n_out(bmap2);
-	nparam = isl_basic_map_n_param(bmap1);
-
-	total = nparam + in1 + in2 + out1 + out2 + bmap1->n_div + bmap2->n_div;
-	dim_map1 = isl_dim_map_alloc(bmap1->ctx, total);
-	dim_map2 = isl_dim_map_alloc(bmap1->ctx, total);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_param, pos = 0);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_param, pos = 0);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_in, pos += nparam);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_in, pos += in1);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_out, pos += in2);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_out, pos += out1);
-	isl_dim_map_div(dim_map1, bmap1, pos += out2);
-	isl_dim_map_div(dim_map2, bmap2, pos += bmap1->n_div);
-
-	bmap = isl_basic_map_alloc_space(dim_result,
-			bmap1->n_div + bmap2->n_div,
-			bmap1->n_eq + bmap2->n_eq,
-			bmap1->n_ineq + bmap2->n_ineq);
-	bmap = isl_basic_map_add_constraints_dim_map(bmap, bmap1, dim_map1);
-	bmap = isl_basic_map_add_constraints_dim_map(bmap, bmap2, dim_map2);
-	bmap = isl_basic_map_simplify(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap1);
-	isl_basic_map_free(bmap2);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_flat_product(
-	__isl_take isl_basic_map *bmap1, __isl_take isl_basic_map *bmap2)
-{
-	isl_basic_map *prod;
-
-	prod = isl_basic_map_product(bmap1, bmap2);
-	prod = isl_basic_map_flatten(prod);
-	return prod;
-}
-
-__isl_give isl_basic_set *isl_basic_set_flat_product(
-	__isl_take isl_basic_set *bset1, __isl_take isl_basic_set *bset2)
-{
-	return isl_basic_map_flat_range_product(bset1, bset2);
-}
-
-__isl_give isl_basic_map *isl_basic_map_domain_product(
-	__isl_take isl_basic_map *bmap1, __isl_take isl_basic_map *bmap2)
-{
-	isl_space *space_result = NULL;
-	isl_basic_map *bmap;
-	unsigned in1, in2, out, nparam, total, pos;
-	struct isl_dim_map *dim_map1, *dim_map2;
-
-	if (!bmap1 || !bmap2)
-		goto error;
-
-	space_result = isl_space_domain_product(isl_space_copy(bmap1->dim),
-						isl_space_copy(bmap2->dim));
-
-	in1 = isl_basic_map_dim(bmap1, isl_dim_in);
-	in2 = isl_basic_map_dim(bmap2, isl_dim_in);
-	out = isl_basic_map_dim(bmap1, isl_dim_out);
-	nparam = isl_basic_map_dim(bmap1, isl_dim_param);
-
-	total = nparam + in1 + in2 + out + bmap1->n_div + bmap2->n_div;
-	dim_map1 = isl_dim_map_alloc(bmap1->ctx, total);
-	dim_map2 = isl_dim_map_alloc(bmap1->ctx, total);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_param, pos = 0);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_param, pos = 0);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_in, pos += nparam);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_in, pos += in1);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_out, pos += in2);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_out, pos);
-	isl_dim_map_div(dim_map1, bmap1, pos += out);
-	isl_dim_map_div(dim_map2, bmap2, pos += bmap1->n_div);
-
-	bmap = isl_basic_map_alloc_space(space_result,
-			bmap1->n_div + bmap2->n_div,
-			bmap1->n_eq + bmap2->n_eq,
-			bmap1->n_ineq + bmap2->n_ineq);
-	bmap = isl_basic_map_add_constraints_dim_map(bmap, bmap1, dim_map1);
-	bmap = isl_basic_map_add_constraints_dim_map(bmap, bmap2, dim_map2);
-	bmap = isl_basic_map_simplify(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap1);
-	isl_basic_map_free(bmap2);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_range_product(
-	__isl_take isl_basic_map *bmap1, __isl_take isl_basic_map *bmap2)
-{
-	isl_space *dim_result = NULL;
-	isl_basic_map *bmap;
-	unsigned in, out1, out2, nparam, total, pos;
-	struct isl_dim_map *dim_map1, *dim_map2;
-
-	if (!bmap1 || !bmap2)
-		goto error;
-
-	dim_result = isl_space_range_product(isl_space_copy(bmap1->dim),
-					   isl_space_copy(bmap2->dim));
-
-	in = isl_basic_map_dim(bmap1, isl_dim_in);
-	out1 = isl_basic_map_n_out(bmap1);
-	out2 = isl_basic_map_n_out(bmap2);
-	nparam = isl_basic_map_n_param(bmap1);
-
-	total = nparam + in + out1 + out2 + bmap1->n_div + bmap2->n_div;
-	dim_map1 = isl_dim_map_alloc(bmap1->ctx, total);
-	dim_map2 = isl_dim_map_alloc(bmap1->ctx, total);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_param, pos = 0);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_param, pos = 0);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_in, pos += nparam);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_in, pos);
-	isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_out, pos += in);
-	isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_out, pos += out1);
-	isl_dim_map_div(dim_map1, bmap1, pos += out2);
-	isl_dim_map_div(dim_map2, bmap2, pos += bmap1->n_div);
-
-	bmap = isl_basic_map_alloc_space(dim_result,
-			bmap1->n_div + bmap2->n_div,
-			bmap1->n_eq + bmap2->n_eq,
-			bmap1->n_ineq + bmap2->n_ineq);
-	bmap = isl_basic_map_add_constraints_dim_map(bmap, bmap1, dim_map1);
-	bmap = isl_basic_map_add_constraints_dim_map(bmap, bmap2, dim_map2);
-	bmap = isl_basic_map_simplify(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap1);
-	isl_basic_map_free(bmap2);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_flat_range_product(
-	__isl_take isl_basic_map *bmap1, __isl_take isl_basic_map *bmap2)
-{
-	isl_basic_map *prod;
-
-	prod = isl_basic_map_range_product(bmap1, bmap2);
-	prod = isl_basic_map_flatten_range(prod);
-	return prod;
-}
-
-static __isl_give isl_map *map_product(__isl_take isl_map *map1,
-	__isl_take isl_map *map2,
-	__isl_give isl_space *(*dim_product)(__isl_take isl_space *left,
-					   __isl_take isl_space *right),
-	__isl_give isl_basic_map *(*basic_map_product)(
-		__isl_take isl_basic_map *left, __isl_take isl_basic_map *right))
-{
-	unsigned flags = 0;
-	struct isl_map *result;
-	int i, j;
-
-	if (!map1 || !map2)
-		goto error;
-
-	isl_assert(map1->ctx, isl_space_match(map1->dim, isl_dim_param,
-					 map2->dim, isl_dim_param), goto error);
-
-	if (ISL_F_ISSET(map1, ISL_MAP_DISJOINT) &&
-	    ISL_F_ISSET(map2, ISL_MAP_DISJOINT))
-		ISL_FL_SET(flags, ISL_MAP_DISJOINT);
-
-	result = isl_map_alloc_space(dim_product(isl_space_copy(map1->dim),
-					       isl_space_copy(map2->dim)),
-				map1->n * map2->n, flags);
-	if (!result)
-		goto error;
-	for (i = 0; i < map1->n; ++i)
-		for (j = 0; j < map2->n; ++j) {
-			struct isl_basic_map *part;
-			part = basic_map_product(isl_basic_map_copy(map1->p[i]),
-						 isl_basic_map_copy(map2->p[j]));
-			if (isl_basic_map_is_empty(part))
-				isl_basic_map_free(part);
-			else
-				result = isl_map_add_basic_map(result, part);
-			if (!result)
-				goto error;
-		}
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return result;
-error:
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return NULL;
-}
-
-/* Given two maps A -> B and C -> D, construct a map [A -> C] -> [B -> D]
- */
-static __isl_give isl_map *map_product_aligned(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	return map_product(map1, map2, &isl_space_product, &isl_basic_map_product);
-}
-
-__isl_give isl_map *isl_map_product(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	return isl_map_align_params_map_map_and(map1, map2, &map_product_aligned);
-}
-
-/* Given two maps A -> B and C -> D, construct a map (A, C) -> (B, D)
- */
-__isl_give isl_map *isl_map_flat_product(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	isl_map *prod;
-
-	prod = isl_map_product(map1, map2);
-	prod = isl_map_flatten(prod);
-	return prod;
-}
-
-/* Given two set A and B, construct its Cartesian product A x B.
- */
-struct isl_set *isl_set_product(struct isl_set *set1, struct isl_set *set2)
-{
-	return isl_map_range_product(set1, set2);
-}
-
-__isl_give isl_set *isl_set_flat_product(__isl_take isl_set *set1,
-	__isl_take isl_set *set2)
-{
-	return isl_map_flat_range_product(set1, set2);
-}
-
-/* Given two maps A -> B and C -> D, construct a map [A -> C] -> (B * D)
- */
-static __isl_give isl_map *map_domain_product_aligned(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	return map_product(map1, map2, &isl_space_domain_product,
-				&isl_basic_map_domain_product);
-}
-
-/* Given two maps A -> B and C -> D, construct a map (A * C) -> [B -> D]
- */
-static __isl_give isl_map *map_range_product_aligned(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	return map_product(map1, map2, &isl_space_range_product,
-				&isl_basic_map_range_product);
-}
-
-__isl_give isl_map *isl_map_domain_product(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	return isl_map_align_params_map_map_and(map1, map2,
-						&map_domain_product_aligned);
-}
-
-__isl_give isl_map *isl_map_range_product(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	return isl_map_align_params_map_map_and(map1, map2,
-						&map_range_product_aligned);
-}
-
-/* Given two maps A -> B and C -> D, construct a map (A, C) -> (B * D)
- */
-__isl_give isl_map *isl_map_flat_domain_product(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	isl_map *prod;
-
-	prod = isl_map_domain_product(map1, map2);
-	prod = isl_map_flatten_domain(prod);
-	return prod;
-}
-
-/* Given two maps A -> B and C -> D, construct a map (A * C) -> (B, D)
- */
-__isl_give isl_map *isl_map_flat_range_product(__isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	isl_map *prod;
-
-	prod = isl_map_range_product(map1, map2);
-	prod = isl_map_flatten_range(prod);
-	return prod;
-}
-
-uint32_t isl_basic_map_get_hash(__isl_keep isl_basic_map *bmap)
-{
-	int i;
-	uint32_t hash = isl_hash_init();
-	unsigned total;
-
-	if (!bmap)
-		return 0;
-	bmap = isl_basic_map_copy(bmap);
-	bmap = isl_basic_map_normalize(bmap);
-	if (!bmap)
-		return 0;
-	total = isl_basic_map_total_dim(bmap);
-	isl_hash_byte(hash, bmap->n_eq & 0xFF);
-	for (i = 0; i < bmap->n_eq; ++i) {
-		uint32_t c_hash;
-		c_hash = isl_seq_get_hash(bmap->eq[i], 1 + total);
-		isl_hash_hash(hash, c_hash);
-	}
-	isl_hash_byte(hash, bmap->n_ineq & 0xFF);
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		uint32_t c_hash;
-		c_hash = isl_seq_get_hash(bmap->ineq[i], 1 + total);
-		isl_hash_hash(hash, c_hash);
-	}
-	isl_hash_byte(hash, bmap->n_div & 0xFF);
-	for (i = 0; i < bmap->n_div; ++i) {
-		uint32_t c_hash;
-		if (isl_int_is_zero(bmap->div[i][0]))
-			continue;
-		isl_hash_byte(hash, i & 0xFF);
-		c_hash = isl_seq_get_hash(bmap->div[i], 1 + 1 + total);
-		isl_hash_hash(hash, c_hash);
-	}
-	isl_basic_map_free(bmap);
-	return hash;
-}
-
-uint32_t isl_basic_set_get_hash(__isl_keep isl_basic_set *bset)
-{
-	return isl_basic_map_get_hash((isl_basic_map *)bset);
-}
-
-uint32_t isl_map_get_hash(__isl_keep isl_map *map)
-{
-	int i;
-	uint32_t hash;
-
-	if (!map)
-		return 0;
-	map = isl_map_copy(map);
-	map = isl_map_normalize(map);
-	if (!map)
-		return 0;
-
-	hash = isl_hash_init();
-	for (i = 0; i < map->n; ++i) {
-		uint32_t bmap_hash;
-		bmap_hash = isl_basic_map_get_hash(map->p[i]);
-		isl_hash_hash(hash, bmap_hash);
-	}
-		
-	isl_map_free(map);
-
-	return hash;
-}
-
-uint32_t isl_set_get_hash(__isl_keep isl_set *set)
-{
-	return isl_map_get_hash((isl_map *)set);
-}
-
-/* Check if the value for dimension dim is completely determined
- * by the values of the other parameters and variables.
- * That is, check if dimension dim is involved in an equality.
- */
-int isl_basic_set_dim_is_unique(struct isl_basic_set *bset, unsigned dim)
-{
-	int i;
-	unsigned nparam;
-
-	if (!bset)
-		return -1;
-	nparam = isl_basic_set_n_param(bset);
-	for (i = 0; i < bset->n_eq; ++i)
-		if (!isl_int_is_zero(bset->eq[i][1 + nparam + dim]))
-			return 1;
-	return 0;
-}
-
-/* Check if the value for dimension dim is completely determined
- * by the values of the other parameters and variables.
- * That is, check if dimension dim is involved in an equality
- * for each of the subsets.
- */
-int isl_set_dim_is_unique(struct isl_set *set, unsigned dim)
-{
-	int i;
-
-	if (!set)
-		return -1;
-	for (i = 0; i < set->n; ++i) {
-		int unique;
-		unique = isl_basic_set_dim_is_unique(set->p[i], dim);
-		if (unique != 1)
-			return unique;
-	}
-	return 1;
-}
-
-int isl_set_n_basic_set(__isl_keep isl_set *set)
-{
-	return set ? set->n : 0;
-}
-
-int isl_map_foreach_basic_map(__isl_keep isl_map *map,
-	int (*fn)(__isl_take isl_basic_map *bmap, void *user), void *user)
-{
-	int i;
-
-	if (!map)
-		return -1;
-
-	for (i = 0; i < map->n; ++i)
-		if (fn(isl_basic_map_copy(map->p[i]), user) < 0)
-			return -1;
-
-	return 0;
-}
-
-int isl_set_foreach_basic_set(__isl_keep isl_set *set,
-	int (*fn)(__isl_take isl_basic_set *bset, void *user), void *user)
-{
-	int i;
-
-	if (!set)
-		return -1;
-
-	for (i = 0; i < set->n; ++i)
-		if (fn(isl_basic_set_copy(set->p[i]), user) < 0)
-			return -1;
-
-	return 0;
-}
-
-__isl_give isl_basic_set *isl_basic_set_lift(__isl_take isl_basic_set *bset)
-{
-	isl_space *dim;
-
-	if (!bset)
-		return NULL;
-
-	bset = isl_basic_set_cow(bset);
-	if (!bset)
-		return NULL;
-
-	dim = isl_basic_set_get_space(bset);
-	dim = isl_space_lift(dim, bset->n_div);
-	if (!dim)
-		goto error;
-	isl_space_free(bset->dim);
-	bset->dim = dim;
-	bset->extra -= bset->n_div;
-	bset->n_div = 0;
-
-	bset = isl_basic_set_finalize(bset);
-
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_lift(__isl_take isl_set *set)
-{
-	int i;
-	isl_space *dim;
-	unsigned n_div;
-
-	set = isl_set_align_divs(set);
-
-	if (!set)
-		return NULL;
-
-	set = isl_set_cow(set);
-	if (!set)
-		return NULL;
-
-	n_div = set->p[0]->n_div;
-	dim = isl_set_get_space(set);
-	dim = isl_space_lift(dim, n_div);
-	if (!dim)
-		goto error;
-	isl_space_free(set->dim);
-	set->dim = dim;
-
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_basic_set_lift(set->p[i]);
-		if (!set->p[i])
-			goto error;
-	}
-
-	return set;
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-__isl_give isl_map *isl_set_lifting(__isl_take isl_set *set)
-{
-	isl_space *dim;
-	struct isl_basic_map *bmap;
-	unsigned n_set;
-	unsigned n_div;
-	unsigned n_param;
-	unsigned total;
-	int i, k, l;
-
-	set = isl_set_align_divs(set);
-
-	if (!set)
-		return NULL;
-
-	dim = isl_set_get_space(set);
-	if (set->n == 0 || set->p[0]->n_div == 0) {
-		isl_set_free(set);
-		return isl_map_identity(isl_space_map_from_set(dim));
-	}
-
-	n_div = set->p[0]->n_div;
-	dim = isl_space_map_from_set(dim);
-	n_param = isl_space_dim(dim, isl_dim_param);
-	n_set = isl_space_dim(dim, isl_dim_in);
-	dim = isl_space_extend(dim, n_param, n_set, n_set + n_div);
-	bmap = isl_basic_map_alloc_space(dim, 0, n_set, 2 * n_div);
-	for (i = 0; i < n_set; ++i)
-		bmap = var_equal(bmap, i);
-
-	total = n_param + n_set + n_set + n_div;
-	for (i = 0; i < n_div; ++i) {
-		k = isl_basic_map_alloc_inequality(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(bmap->ineq[k], set->p[0]->div[i]+1, 1+n_param);
-		isl_seq_clr(bmap->ineq[k]+1+n_param, n_set);
-		isl_seq_cpy(bmap->ineq[k]+1+n_param+n_set,
-			    set->p[0]->div[i]+1+1+n_param, n_set + n_div);
-		isl_int_neg(bmap->ineq[k][1+n_param+n_set+n_set+i],
-			    set->p[0]->div[i][0]);
-
-		l = isl_basic_map_alloc_inequality(bmap);
-		if (l < 0)
-			goto error;
-		isl_seq_neg(bmap->ineq[l], bmap->ineq[k], 1 + total);
-		isl_int_add(bmap->ineq[l][0], bmap->ineq[l][0],
-			    set->p[0]->div[i][0]);
-		isl_int_sub_ui(bmap->ineq[l][0], bmap->ineq[l][0], 1);
-	}
-
-	isl_set_free(set);
-	bmap = isl_basic_map_simplify(bmap);
-	bmap = isl_basic_map_finalize(bmap);
-	return isl_map_from_basic_map(bmap);
-error:
-	isl_set_free(set);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-int isl_basic_set_size(__isl_keep isl_basic_set *bset)
-{
-	unsigned dim;
-	int size = 0;
-
-	if (!bset)
-		return -1;
-
-	dim = isl_basic_set_total_dim(bset);
-	size += bset->n_eq * (1 + dim);
-	size += bset->n_ineq * (1 + dim);
-	size += bset->n_div * (2 + dim);
-
-	return size;
-}
-
-int isl_set_size(__isl_keep isl_set *set)
-{
-	int i;
-	int size = 0;
-
-	if (!set)
-		return -1;
-
-	for (i = 0; i < set->n; ++i)
-		size += isl_basic_set_size(set->p[i]);
-
-	return size;
-}
-
-/* Check if there is any lower bound (if lower == 0) and/or upper
- * bound (if upper == 0) on the specified dim.
- */
-static int basic_map_dim_is_bounded(__isl_keep isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned pos, int lower, int upper)
-{
-	int i;
-
-	if (!bmap)
-		return -1;
-
-	isl_assert(bmap->ctx, pos < isl_basic_map_dim(bmap, type), return -1);
-
-	pos += isl_basic_map_offset(bmap, type);
-
-	for (i = 0; i < bmap->n_div; ++i) {
-		if (isl_int_is_zero(bmap->div[i][0]))
-			continue;
-		if (!isl_int_is_zero(bmap->div[i][1 + pos]))
-			return 1;
-	}
-
-	for (i = 0; i < bmap->n_eq; ++i)
-		if (!isl_int_is_zero(bmap->eq[i][pos]))
-			return 1;
-
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		int sgn = isl_int_sgn(bmap->ineq[i][pos]);
-		if (sgn > 0)
-			lower = 1;
-		if (sgn < 0)
-			upper = 1;
-	}
-
-	return lower && upper;
-}
-
-int isl_basic_map_dim_is_bounded(__isl_keep isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned pos)
-{
-	return basic_map_dim_is_bounded(bmap, type, pos, 0, 0);
-}
-
-int isl_basic_map_dim_has_lower_bound(__isl_keep isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned pos)
-{
-	return basic_map_dim_is_bounded(bmap, type, pos, 0, 1);
-}
-
-int isl_basic_map_dim_has_upper_bound(__isl_keep isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned pos)
-{
-	return basic_map_dim_is_bounded(bmap, type, pos, 1, 0);
-}
-
-int isl_map_dim_is_bounded(__isl_keep isl_map *map,
-	enum isl_dim_type type, unsigned pos)
-{
-	int i;
-
-	if (!map)
-		return -1;
-
-	for (i = 0; i < map->n; ++i) {
-		int bounded;
-		bounded = isl_basic_map_dim_is_bounded(map->p[i], type, pos);
-		if (bounded < 0 || !bounded)
-			return bounded;
-	}
-
-	return 1;
-}
-
-/* Return 1 if the specified dim is involved in both an upper bound
- * and a lower bound.
- */
-int isl_set_dim_is_bounded(__isl_keep isl_set *set,
-	enum isl_dim_type type, unsigned pos)
-{
-	return isl_map_dim_is_bounded((isl_map *)set, type, pos);
-}
-
-static int has_bound(__isl_keep isl_map *map,
-	enum isl_dim_type type, unsigned pos,
-	int (*fn)(__isl_keep isl_basic_map *bmap,
-		  enum isl_dim_type type, unsigned pos))
-{
-	int i;
-
-	if (!map)
-		return -1;
-
-	for (i = 0; i < map->n; ++i) {
-		int bounded;
-		bounded = fn(map->p[i], type, pos);
-		if (bounded < 0 || bounded)
-			return bounded;
-	}
-
-	return 0;
-}
-
-/* Return 1 if the specified dim is involved in any lower bound.
- */
-int isl_set_dim_has_lower_bound(__isl_keep isl_set *set,
-	enum isl_dim_type type, unsigned pos)
-{
-	return has_bound(set, type, pos, &isl_basic_map_dim_has_lower_bound);
-}
-
-/* Return 1 if the specified dim is involved in any upper bound.
- */
-int isl_set_dim_has_upper_bound(__isl_keep isl_set *set,
-	enum isl_dim_type type, unsigned pos)
-{
-	return has_bound(set, type, pos, &isl_basic_map_dim_has_upper_bound);
-}
-
-/* For each of the "n" variables starting at "first", determine
- * the sign of the variable and put the results in the first "n"
- * elements of the array "signs".
- * Sign
- *	1 means that the variable is non-negative
- *	-1 means that the variable is non-positive
- *	0 means the variable attains both positive and negative values.
- */
-int isl_basic_set_vars_get_sign(__isl_keep isl_basic_set *bset,
-	unsigned first, unsigned n, int *signs)
-{
-	isl_vec *bound = NULL;
-	struct isl_tab *tab = NULL;
-	struct isl_tab_undo *snap;
-	int i;
-
-	if (!bset || !signs)
-		return -1;
-
-	bound = isl_vec_alloc(bset->ctx, 1 + isl_basic_set_total_dim(bset));
-	tab = isl_tab_from_basic_set(bset);
-	if (!bound || !tab)
-		goto error;
-
-	isl_seq_clr(bound->el, bound->size);
-	isl_int_set_si(bound->el[0], -1);
-
-	snap = isl_tab_snap(tab);
-	for (i = 0; i < n; ++i) {
-		int empty;
-
-		isl_int_set_si(bound->el[1 + first + i], -1);
-		if (isl_tab_add_ineq(tab, bound->el) < 0)
-			goto error;
-		empty = tab->empty;
-		isl_int_set_si(bound->el[1 + first + i], 0);
-		if (isl_tab_rollback(tab, snap) < 0)
-			goto error;
-
-		if (empty) {
-			signs[i] = 1;
-			continue;
-		}
-
-		isl_int_set_si(bound->el[1 + first + i], 1);
-		if (isl_tab_add_ineq(tab, bound->el) < 0)
-			goto error;
-		empty = tab->empty;
-		isl_int_set_si(bound->el[1 + first + i], 0);
-		if (isl_tab_rollback(tab, snap) < 0)
-			goto error;
-
-		signs[i] = empty ? -1 : 0;
-	}
-
-	isl_tab_free(tab);
-	isl_vec_free(bound);
-	return 0;
-error:
-	isl_tab_free(tab);
-	isl_vec_free(bound);
-	return -1;
-}
-
-int isl_basic_set_dims_get_sign(__isl_keep isl_basic_set *bset,
-	enum isl_dim_type type, unsigned first, unsigned n, int *signs)
-{
-	if (!bset || !signs)
-		return -1;
-	isl_assert(bset->ctx, first + n <= isl_basic_set_dim(bset, type),
-		return -1);
-
-	first += pos(bset->dim, type) - 1;
-	return isl_basic_set_vars_get_sign(bset, first, n, signs);
-}
-
-/* Check if the given basic map is obviously single-valued.
- * In particular, for each output dimension, check that there is
- * an equality that defines the output dimension in terms of
- * earlier dimensions.
- */
-int isl_basic_map_plain_is_single_valued(__isl_keep isl_basic_map *bmap)
-{
-	int i, j;
-	unsigned total;
-	unsigned n_out;
-	unsigned o_out;
-
-	if (!bmap)
-		return -1;
-
-	total = 1 + isl_basic_map_total_dim(bmap);
-	n_out = isl_basic_map_dim(bmap, isl_dim_out);
-	o_out = isl_basic_map_offset(bmap, isl_dim_out);
-
-	for (i = 0; i < n_out; ++i) {
-		for (j = 0; j < bmap->n_eq; ++j) {
-			if (isl_int_is_zero(bmap->eq[j][o_out + i]))
-				continue;
-			if (isl_seq_first_non_zero(bmap->eq[j] + o_out + i + 1,
-						total - (o_out + i + 1)) == -1)
-				break;
-		}
-		if (j >= bmap->n_eq)
-			return 0;
-	}
-
-	return 1;
-}
-
-/* Check if the given map is obviously single-valued.
- */
-int isl_map_plain_is_single_valued(__isl_keep isl_map *map)
-{
-	if (!map)
-		return -1;
-	if (map->n == 0)
-		return 1;
-	if (map->n >= 2)
-		return 0;
-
-	return isl_basic_map_plain_is_single_valued(map->p[0]);
-}
-
-/* Check if the given map is single-valued.
- * We simply compute
- *
- *	M \circ M^-1
- *
- * and check if the result is a subset of the identity mapping.
- */
-int isl_map_is_single_valued(__isl_keep isl_map *map)
-{
-	isl_space *dim;
-	isl_map *test;
-	isl_map *id;
-	int sv;
-
-	sv = isl_map_plain_is_single_valued(map);
-	if (sv < 0 || sv)
-		return sv;
-
-	test = isl_map_reverse(isl_map_copy(map));
-	test = isl_map_apply_range(test, isl_map_copy(map));
-
-	dim = isl_space_map_from_set(isl_space_range(isl_map_get_space(map)));
-	id = isl_map_identity(dim);
-
-	sv = isl_map_is_subset(test, id);
-
-	isl_map_free(test);
-	isl_map_free(id);
-
-	return sv;
-}
-
-int isl_map_is_injective(__isl_keep isl_map *map)
-{
-	int in;
-
-	map = isl_map_copy(map);
-	map = isl_map_reverse(map);
-	in = isl_map_is_single_valued(map);
-	isl_map_free(map);
-
-	return in;
-}
-
-/* Check if the given map is obviously injective.
- */
-int isl_map_plain_is_injective(__isl_keep isl_map *map)
-{
-	int in;
-
-	map = isl_map_copy(map);
-	map = isl_map_reverse(map);
-	in = isl_map_plain_is_single_valued(map);
-	isl_map_free(map);
-
-	return in;
-}
-
-int isl_map_is_bijective(__isl_keep isl_map *map)
-{
-	int sv;
-
-	sv = isl_map_is_single_valued(map);
-	if (sv < 0 || !sv)
-		return sv;
-
-	return isl_map_is_injective(map);
-}
-
-int isl_set_is_singleton(__isl_keep isl_set *set)
-{
-	return isl_map_is_single_valued((isl_map *)set);
-}
-
-int isl_map_is_translation(__isl_keep isl_map *map)
-{
-	int ok;
-	isl_set *delta;
-
-	delta = isl_map_deltas(isl_map_copy(map));
-	ok = isl_set_is_singleton(delta);
-	isl_set_free(delta);
-
-	return ok;
-}
-
-static int unique(isl_int *p, unsigned pos, unsigned len)
-{
-	if (isl_seq_first_non_zero(p, pos) != -1)
-		return 0;
-	if (isl_seq_first_non_zero(p + pos + 1, len - pos - 1) != -1)
-		return 0;
-	return 1;
-}
-
-int isl_basic_set_is_box(__isl_keep isl_basic_set *bset)
-{
-	int i, j;
-	unsigned nvar;
-	unsigned ovar;
-
-	if (!bset)
-		return -1;
-
-	if (isl_basic_set_dim(bset, isl_dim_div) != 0)
-		return 0;
-
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-	ovar = isl_space_offset(bset->dim, isl_dim_set);
-	for (j = 0; j < nvar; ++j) {
-		int lower = 0, upper = 0;
-		for (i = 0; i < bset->n_eq; ++i) {
-			if (isl_int_is_zero(bset->eq[i][1 + ovar + j]))
-				continue;
-			if (!unique(bset->eq[i] + 1 + ovar, j, nvar))
-				return 0;
-			break;
-		}
-		if (i < bset->n_eq)
-			continue;
-		for (i = 0; i < bset->n_ineq; ++i) {
-			if (isl_int_is_zero(bset->ineq[i][1 + ovar + j]))
-				continue;
-			if (!unique(bset->ineq[i] + 1 + ovar, j, nvar))
-				return 0;
-			if (isl_int_is_pos(bset->ineq[i][1 + ovar + j]))
-				lower = 1;
-			else
-				upper = 1;
-		}
-		if (!lower || !upper)
-			return 0;
-	}
-
-	return 1;
-}
-
-int isl_set_is_box(__isl_keep isl_set *set)
-{
-	if (!set)
-		return -1;
-	if (set->n != 1)
-		return 0;
-
-	return isl_basic_set_is_box(set->p[0]);
-}
-
-int isl_basic_set_is_wrapping(__isl_keep isl_basic_set *bset)
-{
-	if (!bset)
-		return -1;
-	
-	return isl_space_is_wrapping(bset->dim);
-}
-
-int isl_set_is_wrapping(__isl_keep isl_set *set)
-{
-	if (!set)
-		return -1;
-	
-	return isl_space_is_wrapping(set->dim);
-}
-
-__isl_give isl_basic_set *isl_basic_map_wrap(__isl_take isl_basic_map *bmap)
-{
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-
-	bmap->dim = isl_space_wrap(bmap->dim);
-	if (!bmap->dim)
-		goto error;
-
-	bmap = isl_basic_map_finalize(bmap);
-
-	return (isl_basic_set *)bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_set *isl_map_wrap(__isl_take isl_map *map)
-{
-	int i;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = (isl_basic_map *)isl_basic_map_wrap(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	map->dim = isl_space_wrap(map->dim);
-	if (!map->dim)
-		goto error;
-
-	return (isl_set *)map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_set_unwrap(__isl_take isl_basic_set *bset)
-{
-	bset = isl_basic_set_cow(bset);
-	if (!bset)
-		return NULL;
-
-	bset->dim = isl_space_unwrap(bset->dim);
-	if (!bset->dim)
-		goto error;
-
-	bset = isl_basic_set_finalize(bset);
-
-	return (isl_basic_map *)bset;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-__isl_give isl_map *isl_set_unwrap(__isl_take isl_set *set)
-{
-	int i;
-
-	if (!set)
-		return NULL;
-
-	if (!isl_set_is_wrapping(set))
-		isl_die(set->ctx, isl_error_invalid, "not a wrapping set",
-			goto error);
-
-	set = isl_set_cow(set);
-	if (!set)
-		return NULL;
-
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = (isl_basic_set *)isl_basic_set_unwrap(set->p[i]);
-		if (!set->p[i])
-			goto error;
-	}
-
-	set->dim = isl_space_unwrap(set->dim);
-	if (!set->dim)
-		goto error;
-
-	return (isl_map *)set;
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_reset(__isl_take isl_basic_map *bmap,
-	enum isl_dim_type type)
-{
-	if (!bmap)
-		return NULL;
-
-	if (!isl_space_is_named_or_nested(bmap->dim, type))
-		return bmap;
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-
-	bmap->dim = isl_space_reset(bmap->dim, type);
-	if (!bmap->dim)
-		goto error;
-
-	bmap = isl_basic_map_finalize(bmap);
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_reset(__isl_take isl_map *map,
-	enum isl_dim_type type)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-
-	if (!isl_space_is_named_or_nested(map->dim, type))
-		return map;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_reset(map->p[i], type);
-		if (!map->p[i])
-			goto error;
-	}
-	map->dim = isl_space_reset(map->dim, type);
-	if (!map->dim)
-		goto error;
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_flatten(__isl_take isl_basic_map *bmap)
-{
-	if (!bmap)
-		return NULL;
-
-	if (!bmap->dim->nested[0] && !bmap->dim->nested[1])
-		return bmap;
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-
-	bmap->dim = isl_space_flatten(bmap->dim);
-	if (!bmap->dim)
-		goto error;
-
-	bmap = isl_basic_map_finalize(bmap);
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_flatten(__isl_take isl_basic_set *bset)
-{
-	return (isl_basic_set *)isl_basic_map_flatten((isl_basic_map *)bset);
-}
-
-__isl_give isl_basic_map *isl_basic_map_flatten_domain(
-	__isl_take isl_basic_map *bmap)
-{
-	if (!bmap)
-		return NULL;
-
-	if (!bmap->dim->nested[0])
-		return bmap;
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-
-	bmap->dim = isl_space_flatten_domain(bmap->dim);
-	if (!bmap->dim)
-		goto error;
-
-	bmap = isl_basic_map_finalize(bmap);
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_flatten_range(
-	__isl_take isl_basic_map *bmap)
-{
-	if (!bmap)
-		return NULL;
-
-	if (!bmap->dim->nested[1])
-		return bmap;
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-
-	bmap->dim = isl_space_flatten_range(bmap->dim);
-	if (!bmap->dim)
-		goto error;
-
-	bmap = isl_basic_map_finalize(bmap);
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_flatten(__isl_take isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-
-	if (!map->dim->nested[0] && !map->dim->nested[1])
-		return map;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_flatten(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	map->dim = isl_space_flatten(map->dim);
-	if (!map->dim)
-		goto error;
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_flatten(__isl_take isl_set *set)
-{
-	return (isl_set *)isl_map_flatten((isl_map *)set);
-}
-
-__isl_give isl_map *isl_set_flatten_map(__isl_take isl_set *set)
-{
-	isl_space *dim, *flat_dim;
-	isl_map *map;
-
-	dim = isl_set_get_space(set);
-	flat_dim = isl_space_flatten(isl_space_copy(dim));
-	map = isl_map_identity(isl_space_join(isl_space_reverse(dim), flat_dim));
-	map = isl_map_intersect_domain(map, set);
-
-	return map;
-}
-
-__isl_give isl_map *isl_map_flatten_domain(__isl_take isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-
-	if (!map->dim->nested[0])
-		return map;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_flatten_domain(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	map->dim = isl_space_flatten_domain(map->dim);
-	if (!map->dim)
-		goto error;
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_flatten_range(__isl_take isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-
-	if (!map->dim->nested[1])
-		return map;
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_flatten_range(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	map->dim = isl_space_flatten_range(map->dim);
-	if (!map->dim)
-		goto error;
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Reorder the dimensions of "bmap" according to the given dim_map
- * and set the dimension specification to "dim".
- */
-__isl_give isl_basic_map *isl_basic_map_realign(__isl_take isl_basic_map *bmap,
-	__isl_take isl_space *dim, __isl_take struct isl_dim_map *dim_map)
-{
-	isl_basic_map *res;
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap || !dim || !dim_map)
-		goto error;
-
-	res = isl_basic_map_alloc_space(dim,
-			bmap->n_div, bmap->n_eq, bmap->n_ineq);
-	res = isl_basic_map_add_constraints_dim_map(res, bmap, dim_map);
-	res = isl_basic_map_finalize(res);
-	return res;
-error:
-	free(dim_map);
-	isl_basic_map_free(bmap);
-	isl_space_free(dim);
-	return NULL;
-}
-
-/* Reorder the dimensions of "map" according to given reordering.
- */
-__isl_give isl_map *isl_map_realign(__isl_take isl_map *map,
-	__isl_take isl_reordering *r)
-{
-	int i;
-	struct isl_dim_map *dim_map;
-
-	map = isl_map_cow(map);
-	dim_map = isl_dim_map_from_reordering(r);
-	if (!map || !r || !dim_map)
-		goto error;
-
-	for (i = 0; i < map->n; ++i) {
-		struct isl_dim_map *dim_map_i;
-
-		dim_map_i = isl_dim_map_extend(dim_map, map->p[i]);
-
-		map->p[i] = isl_basic_map_realign(map->p[i],
-					    isl_space_copy(r->dim), dim_map_i);
-
-		if (!map->p[i])
-			goto error;
-	}
-
-	map = isl_map_reset_space(map, isl_space_copy(r->dim));
-
-	isl_reordering_free(r);
-	free(dim_map);
-	return map;
-error:
-	free(dim_map);
-	isl_map_free(map);
-	isl_reordering_free(r);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_realign(__isl_take isl_set *set,
-	__isl_take isl_reordering *r)
-{
-	return (isl_set *)isl_map_realign((isl_map *)set, r);
-}
-
-__isl_give isl_map *isl_map_align_params(__isl_take isl_map *map,
-	__isl_take isl_space *model)
-{
-	isl_ctx *ctx;
-
-	if (!map || !model)
-		goto error;
-
-	ctx = isl_space_get_ctx(model);
-	if (!isl_space_has_named_params(model))
-		isl_die(ctx, isl_error_invalid,
-			"model has unnamed parameters", goto error);
-	if (!isl_space_has_named_params(map->dim))
-		isl_die(ctx, isl_error_invalid,
-			"relation has unnamed parameters", goto error);
-	if (!isl_space_match(map->dim, isl_dim_param, model, isl_dim_param)) {
-		isl_reordering *exp;
-
-		model = isl_space_drop_dims(model, isl_dim_in,
-					0, isl_space_dim(model, isl_dim_in));
-		model = isl_space_drop_dims(model, isl_dim_out,
-					0, isl_space_dim(model, isl_dim_out));
-		exp = isl_parameter_alignment_reordering(map->dim, model);
-		exp = isl_reordering_extend_space(exp, isl_map_get_space(map));
-		map = isl_map_realign(map, exp);
-	}
-
-	isl_space_free(model);
-	return map;
-error:
-	isl_space_free(model);
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_align_params(__isl_take isl_set *set,
-	__isl_take isl_space *model)
-{
-	return isl_map_align_params(set, model);
-}
-
-__isl_give isl_mat *isl_basic_map_equalities_matrix(
-		__isl_keep isl_basic_map *bmap, enum isl_dim_type c1,
-		enum isl_dim_type c2, enum isl_dim_type c3,
-		enum isl_dim_type c4, enum isl_dim_type c5)
-{
-	enum isl_dim_type c[5] = { c1, c2, c3, c4, c5 };
-	struct isl_mat *mat;
-	int i, j, k;
-	int pos;
-
-	if (!bmap)
-		return NULL;
-	mat = isl_mat_alloc(bmap->ctx, bmap->n_eq,
-				isl_basic_map_total_dim(bmap) + 1);
-	if (!mat)
-		return NULL;
-	for (i = 0; i < bmap->n_eq; ++i)
-		for (j = 0, pos = 0; j < 5; ++j) {
-			int off = isl_basic_map_offset(bmap, c[j]);
-			for (k = 0; k < isl_basic_map_dim(bmap, c[j]); ++k) {
-				isl_int_set(mat->row[i][pos],
-					    bmap->eq[i][off + k]);
-				++pos;
-			}
-		}
-
-	return mat;
-}
-
-__isl_give isl_mat *isl_basic_map_inequalities_matrix(
-		__isl_keep isl_basic_map *bmap, enum isl_dim_type c1,
-		enum isl_dim_type c2, enum isl_dim_type c3,
-		enum isl_dim_type c4, enum isl_dim_type c5)
-{
-	enum isl_dim_type c[5] = { c1, c2, c3, c4, c5 };
-	struct isl_mat *mat;
-	int i, j, k;
-	int pos;
-
-	if (!bmap)
-		return NULL;
-	mat = isl_mat_alloc(bmap->ctx, bmap->n_ineq,
-				isl_basic_map_total_dim(bmap) + 1);
-	if (!mat)
-		return NULL;
-	for (i = 0; i < bmap->n_ineq; ++i)
-		for (j = 0, pos = 0; j < 5; ++j) {
-			int off = isl_basic_map_offset(bmap, c[j]);
-			for (k = 0; k < isl_basic_map_dim(bmap, c[j]); ++k) {
-				isl_int_set(mat->row[i][pos],
-					    bmap->ineq[i][off + k]);
-				++pos;
-			}
-		}
-
-	return mat;
-}
-
-__isl_give isl_basic_map *isl_basic_map_from_constraint_matrices(
-	__isl_take isl_space *dim,
-	__isl_take isl_mat *eq, __isl_take isl_mat *ineq, enum isl_dim_type c1,
-	enum isl_dim_type c2, enum isl_dim_type c3,
-	enum isl_dim_type c4, enum isl_dim_type c5)
-{
-	enum isl_dim_type c[5] = { c1, c2, c3, c4, c5 };
-	isl_basic_map *bmap;
-	unsigned total;
-	unsigned extra;
-	int i, j, k, l;
-	int pos;
-
-	if (!dim || !eq || !ineq)
-		goto error;
-
-	if (eq->n_col != ineq->n_col)
-		isl_die(dim->ctx, isl_error_invalid,
-			"equalities and inequalities matrices should have "
-			"same number of columns", goto error);
-
-	total = 1 + isl_space_dim(dim, isl_dim_all);
-
-	if (eq->n_col < total)
-		isl_die(dim->ctx, isl_error_invalid,
-			"number of columns too small", goto error);
-
-	extra = eq->n_col - total;
-
-	bmap = isl_basic_map_alloc_space(isl_space_copy(dim), extra,
-				       eq->n_row, ineq->n_row);
-	if (!bmap)
-		goto error;
-	for (i = 0; i < extra; ++i) {
-		k = isl_basic_map_alloc_div(bmap);
-		if (k < 0)
-			goto error;
-		isl_int_set_si(bmap->div[k][0], 0);
-	}
-	for (i = 0; i < eq->n_row; ++i) {
-		l = isl_basic_map_alloc_equality(bmap);
-		if (l < 0)
-			goto error;
-		for (j = 0, pos = 0; j < 5; ++j) {
-			int off = isl_basic_map_offset(bmap, c[j]);
-			for (k = 0; k < isl_basic_map_dim(bmap, c[j]); ++k) {
-				isl_int_set(bmap->eq[l][off + k], 
-					    eq->row[i][pos]);
-				++pos;
-			}
-		}
-	}
-	for (i = 0; i < ineq->n_row; ++i) {
-		l = isl_basic_map_alloc_inequality(bmap);
-		if (l < 0)
-			goto error;
-		for (j = 0, pos = 0; j < 5; ++j) {
-			int off = isl_basic_map_offset(bmap, c[j]);
-			for (k = 0; k < isl_basic_map_dim(bmap, c[j]); ++k) {
-				isl_int_set(bmap->ineq[l][off + k], 
-					    ineq->row[i][pos]);
-				++pos;
-			}
-		}
-	}
-
-	isl_space_free(dim);
-	isl_mat_free(eq);
-	isl_mat_free(ineq);
-
-	return bmap;
-error:
-	isl_space_free(dim);
-	isl_mat_free(eq);
-	isl_mat_free(ineq);
-	return NULL;
-}
-
-__isl_give isl_mat *isl_basic_set_equalities_matrix(
-	__isl_keep isl_basic_set *bset, enum isl_dim_type c1,
-	enum isl_dim_type c2, enum isl_dim_type c3, enum isl_dim_type c4)
-{
-	return isl_basic_map_equalities_matrix((isl_basic_map *)bset,
-						c1, c2, c3, c4, isl_dim_in);
-}
-
-__isl_give isl_mat *isl_basic_set_inequalities_matrix(
-	__isl_keep isl_basic_set *bset, enum isl_dim_type c1,
-	enum isl_dim_type c2, enum isl_dim_type c3, enum isl_dim_type c4)
-{
-	return isl_basic_map_inequalities_matrix((isl_basic_map *)bset,
-						 c1, c2, c3, c4, isl_dim_in);
-}
-
-__isl_give isl_basic_set *isl_basic_set_from_constraint_matrices(
-	__isl_take isl_space *dim,
-	__isl_take isl_mat *eq, __isl_take isl_mat *ineq, enum isl_dim_type c1,
-	enum isl_dim_type c2, enum isl_dim_type c3, enum isl_dim_type c4)
-{
-	return (isl_basic_set*)
-	    isl_basic_map_from_constraint_matrices(dim, eq, ineq,
-						   c1, c2, c3, c4, isl_dim_in);
-}
-
-int isl_basic_map_can_zip(__isl_keep isl_basic_map *bmap)
-{
-	if (!bmap)
-		return -1;
-	
-	return isl_space_can_zip(bmap->dim);
-}
-
-int isl_map_can_zip(__isl_keep isl_map *map)
-{
-	if (!map)
-		return -1;
-	
-	return isl_space_can_zip(map->dim);
-}
-
-/* Given a basic map (A -> B) -> (C -> D), return the corresponding basic map
- * (A -> C) -> (B -> D).
- */
-__isl_give isl_basic_map *isl_basic_map_zip(__isl_take isl_basic_map *bmap)
-{
-	unsigned pos;
-	unsigned n1;
-	unsigned n2;
-
-	if (!bmap)
-		return NULL;
-
-	if (!isl_basic_map_can_zip(bmap))
-		isl_die(bmap->ctx, isl_error_invalid,
-			"basic map cannot be zipped", goto error);
-	pos = isl_basic_map_offset(bmap, isl_dim_in) +
-		isl_space_dim(bmap->dim->nested[0], isl_dim_in);
-	n1 = isl_space_dim(bmap->dim->nested[0], isl_dim_out);
-	n2 = isl_space_dim(bmap->dim->nested[1], isl_dim_in);
-	bmap = isl_basic_map_swap_vars(bmap, pos, n1, n2);
-	if (!bmap)
-		return NULL;
-	bmap->dim = isl_space_zip(bmap->dim);
-	if (!bmap->dim)
-		goto error;
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Given a map (A -> B) -> (C -> D), return the corresponding map
- * (A -> C) -> (B -> D).
- */
-__isl_give isl_map *isl_map_zip(__isl_take isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-
-	if (!isl_map_can_zip(map))
-		isl_die(map->ctx, isl_error_invalid, "map cannot be zipped",
-			goto error);
-
-	map = isl_map_cow(map);
-	if (!map)
-		return NULL;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_zip(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-
-	map->dim = isl_space_zip(map->dim);
-	if (!map->dim)
-		goto error;
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Construct a basic map mapping the domain of the affine expression
- * to a one-dimensional range prescribed by the affine expression.
- */
-__isl_give isl_basic_map *isl_basic_map_from_aff(__isl_take isl_aff *aff)
-{
-	int k;
-	int pos;
-	isl_local_space *ls;
-	isl_basic_map *bmap;
-
-	if (!aff)
-		return NULL;
-
-	ls = isl_aff_get_local_space(aff);
-	bmap = isl_basic_map_from_local_space(ls);
-	bmap = isl_basic_map_extend_constraints(bmap, 1, 0);
-	k = isl_basic_map_alloc_equality(bmap);
-	if (k < 0)
-		goto error;
-
-	pos = isl_basic_map_offset(bmap, isl_dim_out);
-	isl_seq_cpy(bmap->eq[k], aff->v->el + 1, pos);
-	isl_int_neg(bmap->eq[k][pos], aff->v->el[0]);
-	isl_seq_cpy(bmap->eq[k] + pos + 1, aff->v->el + 1 + pos,
-		    aff->v->size - (pos + 1));
-
-	isl_aff_free(aff);
-	bmap = isl_basic_map_finalize(bmap);
-	return bmap;
-error:
-	isl_aff_free(aff);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Construct a basic map mapping the domain the multi-affine expression
- * to its range, with each dimension in the range equated to the
- * corresponding affine expression.
- */
-__isl_give isl_basic_map *isl_basic_map_from_multi_aff(
-	__isl_take isl_multi_aff *maff)
-{
-	int i;
-	isl_space *space;
-	isl_basic_map *bmap;
-
-	if (!maff)
-		return NULL;
-
-	if (isl_space_dim(maff->space, isl_dim_out) != maff->n)
-		isl_die(isl_multi_aff_get_ctx(maff), isl_error_internal,
-			"invalid space", return isl_multi_aff_free(maff));
-
-	space = isl_space_domain(isl_multi_aff_get_space(maff));
-	bmap = isl_basic_map_universe(isl_space_from_domain(space));
-
-	for (i = 0; i < maff->n; ++i) {
-		isl_aff *aff;
-		isl_basic_map *bmap_i;
-
-		aff = isl_aff_copy(maff->p[i]);
-		bmap_i = isl_basic_map_from_aff(aff);
-
-		bmap = isl_basic_map_flat_range_product(bmap, bmap_i);
-	}
-
-	bmap = isl_basic_map_reset_space(bmap, isl_multi_aff_get_space(maff));
-
-	isl_multi_aff_free(maff);
-	return bmap;
-}
-
-/* Construct a basic map mapping a domain in the given space to
- * to an n-dimensional range, with n the number of elements in the list,
- * where each coordinate in the range is prescribed by the
- * corresponding affine expression.
- * The domains of all affine expressions in the list are assumed to match
- * domain_dim.
- */
-__isl_give isl_basic_map *isl_basic_map_from_aff_list(
-	__isl_take isl_space *domain_dim, __isl_take isl_aff_list *list)
-{
-	int i;
-	isl_space *dim;
-	isl_basic_map *bmap;
-
-	if (!list)
-		return NULL;
-
-	dim = isl_space_from_domain(domain_dim);
-	bmap = isl_basic_map_universe(dim);
-
-	for (i = 0; i < list->n; ++i) {
-		isl_aff *aff;
-		isl_basic_map *bmap_i;
-
-		aff = isl_aff_copy(list->p[i]);
-		bmap_i = isl_basic_map_from_aff(aff);
-
-		bmap = isl_basic_map_flat_range_product(bmap, bmap_i);
-	}
-
-	isl_aff_list_free(list);
-	return bmap;
-}
-
-__isl_give isl_set *isl_set_equate(__isl_take isl_set *set,
-	enum isl_dim_type type1, int pos1, enum isl_dim_type type2, int pos2)
-{
-	return isl_map_equate(set, type1, pos1, type2, pos2);
-}
-
-/* Add a constraint imposing that the given two dimensions are equal.
- */
-__isl_give isl_map *isl_map_equate(__isl_take isl_map *map,
-	enum isl_dim_type type1, int pos1, enum isl_dim_type type2, int pos2)
-{
-	isl_basic_map *bmap = NULL;
-	int i;
-
-	if (!map)
-		return NULL;
-
-	if (pos1 >= isl_map_dim(map, type1))
-		isl_die(map->ctx, isl_error_invalid,
-			"index out of bounds", goto error);
-	if (pos2 >= isl_map_dim(map, type2))
-		isl_die(map->ctx, isl_error_invalid,
-			"index out of bounds", goto error);
-
-	bmap = isl_basic_map_alloc_space(isl_map_get_space(map), 0, 1, 0);
-	i = isl_basic_map_alloc_equality(bmap);
-	if (i < 0)
-		goto error;
-	isl_seq_clr(bmap->eq[i], 1 + isl_basic_map_total_dim(bmap));
-	pos1 += isl_basic_map_offset(bmap, type1);
-	pos2 += isl_basic_map_offset(bmap, type2);
-	isl_int_set_si(bmap->eq[i][pos1], -1);
-	isl_int_set_si(bmap->eq[i][pos2], 1);
-	bmap = isl_basic_map_finalize(bmap);
-
-	map = isl_map_intersect(map, isl_map_from_basic_map(bmap));
-
-	return map;
-error:
-	isl_basic_map_free(bmap);
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Add a constraint imposing that the given two dimensions have opposite values.
- */
-__isl_give isl_map *isl_map_oppose(__isl_take isl_map *map,
-	enum isl_dim_type type1, int pos1, enum isl_dim_type type2, int pos2)
-{
-	isl_basic_map *bmap = NULL;
-	int i;
-
-	if (!map)
-		return NULL;
-
-	if (pos1 >= isl_map_dim(map, type1))
-		isl_die(map->ctx, isl_error_invalid,
-			"index out of bounds", goto error);
-	if (pos2 >= isl_map_dim(map, type2))
-		isl_die(map->ctx, isl_error_invalid,
-			"index out of bounds", goto error);
-
-	bmap = isl_basic_map_alloc_space(isl_map_get_space(map), 0, 1, 0);
-	i = isl_basic_map_alloc_equality(bmap);
-	if (i < 0)
-		goto error;
-	isl_seq_clr(bmap->eq[i], 1 + isl_basic_map_total_dim(bmap));
-	pos1 += isl_basic_map_offset(bmap, type1);
-	pos2 += isl_basic_map_offset(bmap, type2);
-	isl_int_set_si(bmap->eq[i][pos1], 1);
-	isl_int_set_si(bmap->eq[i][pos2], 1);
-	bmap = isl_basic_map_finalize(bmap);
-
-	map = isl_map_intersect(map, isl_map_from_basic_map(bmap));
-
-	return map;
-error:
-	isl_basic_map_free(bmap);
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_aff *isl_basic_map_get_div(__isl_keep isl_basic_map *bmap,
-	int pos)
-{
-	isl_aff *div;
-	isl_local_space *ls;
-
-	if (!bmap)
-		return NULL;
-
-	if (!isl_basic_map_divs_known(bmap))
-		isl_die(isl_basic_map_get_ctx(bmap), isl_error_invalid,
-			"some divs are unknown", return NULL);
-
-	ls = isl_basic_map_get_local_space(bmap);
-	div = isl_local_space_get_div(ls, pos);
-	isl_local_space_free(ls);
-
-	return div;
-}
-
-__isl_give isl_aff *isl_basic_set_get_div(__isl_keep isl_basic_set *bset,
-	int pos)
-{
-	return isl_basic_map_get_div(bset, pos);
-}
-
-/* Plug in "subs" for dimension "type", "pos" of "bset".
- *
- * Let i be the dimension to replace and let "subs" be of the form
- *
- *	f/d
- *
- * Any integer division with a non-zero coefficient for i,
- *
- *	floor((a i + g)/m)
- *
- * is replaced by
- *
- *	floor((a f + d g)/(m d))
- *
- * Constraints of the form
- *
- *	a i + g
- *
- * are replaced by
- *
- *	a f + d g
- */
-__isl_give isl_basic_set *isl_basic_set_substitute(
-	__isl_take isl_basic_set *bset,
-	enum isl_dim_type type, unsigned pos, __isl_keep isl_aff *subs)
-{
-	int i;
-	isl_int v;
-	isl_ctx *ctx;
-
-	if (bset && isl_basic_set_plain_is_empty(bset))
-		return bset;
-
-	bset = isl_basic_set_cow(bset);
-	if (!bset || !subs)
-		goto error;
-
-	ctx = isl_basic_set_get_ctx(bset);
-	if (!isl_space_is_equal(bset->dim, subs->ls->dim))
-		isl_die(ctx, isl_error_invalid,
-			"spaces don't match", goto error);
-	if (isl_local_space_dim(subs->ls, isl_dim_div) != 0)
-		isl_die(ctx, isl_error_unsupported,
-			"cannot handle divs yet", goto error);
-
-	pos += isl_basic_set_offset(bset, type);
-
-	isl_int_init(v);
-
-	for (i = 0; i < bset->n_eq; ++i) {
-		if (isl_int_is_zero(bset->eq[i][pos]))
-			continue;
-		isl_int_set(v, bset->eq[i][pos]);
-		isl_int_set_si(bset->eq[i][pos], 0);
-		isl_seq_combine(bset->eq[i], subs->v->el[0], bset->eq[i],
-				v, subs->v->el + 1, subs->v->size - 1);
-	}
-
-	for (i = 0; i < bset->n_ineq; ++i) {
-		if (isl_int_is_zero(bset->ineq[i][pos]))
-			continue;
-		isl_int_set(v, bset->ineq[i][pos]);
-		isl_int_set_si(bset->ineq[i][pos], 0);
-		isl_seq_combine(bset->ineq[i], subs->v->el[0], bset->ineq[i],
-				v, subs->v->el + 1, subs->v->size - 1);
-	}
-
-	for (i = 0; i < bset->n_div; ++i) {
-		if (isl_int_is_zero(bset->div[i][1 + pos]))
-			continue;
-		isl_int_set(v, bset->div[i][1 + pos]);
-		isl_int_set_si(bset->div[i][1 + pos], 0);
-		isl_seq_combine(bset->div[i] + 1,
-				subs->v->el[0], bset->div[i] + 1,
-				v, subs->v->el + 1, subs->v->size - 1);
-		isl_int_mul(bset->div[i][0], bset->div[i][0], subs->v->el[0]);
-	}
-
-	isl_int_clear(v);
-
-	bset = isl_basic_set_simplify(bset);
-	return isl_basic_set_finalize(bset);
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Plug in "subs" for dimension "type", "pos" of "set".
- */
-__isl_give isl_set *isl_set_substitute(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned pos, __isl_keep isl_aff *subs)
-{
-	int i;
-
-	if (set && isl_set_plain_is_empty(set))
-		return set;
-
-	set = isl_set_cow(set);
-	if (!set || !subs)
-		goto error;
-
-	for (i = set->n - 1; i >= 0; --i) {
-		set->p[i] = isl_basic_set_substitute(set->p[i], type, pos, subs);
-		if (!set->p[i])
-			goto error;
-		if (isl_basic_set_plain_is_empty(set->p[i])) {
-			isl_basic_set_free(set->p[i]);
-			if (i != set->n - 1)
-				set->p[i] = set->p[set->n - 1];
-			set->n--;
-		}
-	}
-
-	return set;
-error:
-	isl_set_free(set);
-	return NULL;
-}
diff --git a/cloog-0.17.0/isl/isl_map_no_piplib.c b/cloog-0.17.0/isl/isl_map_no_piplib.c
deleted file mode 100644
index 8a28b07..0000000
--- a/cloog-0.17.0/isl/isl_map_no_piplib.c
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include "isl_map_piplib.h"
-#include <isl/set.h>
-
-struct isl_map *isl_pip_basic_map_lexopt(
-		struct isl_basic_map *bmap, struct isl_basic_set *dom,
-		struct isl_set **empty, int max)
-{
-	isl_basic_map_free(bmap);
-	isl_basic_set_free(dom);
-	return NULL;
-}
diff --git a/cloog-0.17.0/isl/isl_map_piplib.c b/cloog-0.17.0/isl/isl_map_piplib.c
deleted file mode 100644
index 1718153..0000000
--- a/cloog-0.17.0/isl/isl_map_piplib.c
+++ /dev/null
@@ -1,476 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl/set.h>
-#include <isl/map.h>
-#include <isl/mat.h>
-#include <isl/seq.h>
-#include "isl_piplib.h"
-#include "isl_map_piplib.h"
-
-static void copy_values_from(isl_int *dst, Entier *src, unsigned n)
-{
-	int i;
-
-	for (i = 0; i < n; ++i)
-		entier_assign(dst[i], src[i]);
-}
-
-static void add_value(isl_int *dst, Entier *src)
-{
-	mpz_add(*dst, *dst, *src);
-}
-
-static void copy_constraint_from(isl_int *dst, PipVector *src,
-		unsigned nparam, unsigned n_in, unsigned n_out,
-		unsigned extra, int *pos)
-{
-	int i;
-
-	copy_values_from(dst, src->the_vector+src->nb_elements-1, 1);
-	copy_values_from(dst+1, src->the_vector, nparam+n_in);
-	isl_seq_clr(dst+1+nparam+n_in, n_out);
-	isl_seq_clr(dst+1+nparam+n_in+n_out, extra);
-	for (i = 0; i + n_in + nparam < src->nb_elements-1; ++i) {
-		int p = pos[i];
-		add_value(&dst[1+nparam+n_in+n_out+p],
-			  &src->the_vector[n_in+nparam+i]);
-	}
-}
-
-static int add_inequality(struct isl_ctx *ctx,
-		   struct isl_basic_map *bmap, int *pos, PipVector *vec)
-{
-	unsigned nparam = isl_basic_map_n_param(bmap);
-	unsigned n_in = isl_basic_map_n_in(bmap);
-	unsigned n_out = isl_basic_map_n_out(bmap);
-	unsigned n_div = isl_basic_map_n_div(bmap);
-	int i = isl_basic_map_alloc_inequality(bmap);
-	if (i < 0)
-		return -1;
-	copy_constraint_from(bmap->ineq[i], vec,
-	    nparam, n_in, n_out, n_div, pos);
-
-	return i;
-}
-
-/* For a div d = floor(f/m), add the constraints
- *
- *		f - m d >= 0
- *		-(f-(n-1)) + m d >= 0
- *
- * Note that the second constraint is the negation of
- *
- *		f - m d >= n
- */
-static int add_div_constraints(struct isl_ctx *ctx,
-	struct isl_basic_map *bmap, int *pos, PipNewparm *p, unsigned div)
-{
-	int i, j;
-	unsigned total = isl_basic_map_total_dim(bmap);
-	unsigned div_pos = 1 + total - bmap->n_div + div;
-
-	i = add_inequality(ctx, bmap, pos, p->vector);
-	if (i < 0)
-		return -1;
-	copy_values_from(&bmap->ineq[i][div_pos], &p->deno, 1);
-	isl_int_neg(bmap->ineq[i][div_pos], bmap->ineq[i][div_pos]);
-
-	j = isl_basic_map_alloc_inequality(bmap);
-	if (j < 0)
-		return -1;
-	isl_seq_neg(bmap->ineq[j], bmap->ineq[i], 1 + total);
-	isl_int_add(bmap->ineq[j][0], bmap->ineq[j][0], bmap->ineq[j][div_pos]);
-	isl_int_sub_ui(bmap->ineq[j][0], bmap->ineq[j][0], 1);
-	return j;
-}
-
-static int add_equality(struct isl_ctx *ctx,
-		   struct isl_basic_map *bmap, int *pos,
-		   unsigned var, PipVector *vec)
-{
-	int i;
-	unsigned nparam = isl_basic_map_n_param(bmap);
-	unsigned n_in = isl_basic_map_n_in(bmap);
-	unsigned n_out = isl_basic_map_n_out(bmap);
-
-	isl_assert(ctx, var < n_out, return -1);
-
-	i = isl_basic_map_alloc_equality(bmap);
-	if (i < 0)
-		return -1;
-	copy_constraint_from(bmap->eq[i], vec,
-	    nparam, n_in, n_out, bmap->extra, pos);
-	isl_int_set_si(bmap->eq[i][1+nparam+n_in+var], -1);
-
-	return i;
-}
-
-static int find_div(struct isl_ctx *ctx,
-		   struct isl_basic_map *bmap, int *pos, PipNewparm *p)
-{
-	int i, j;
-	unsigned nparam = isl_basic_map_n_param(bmap);
-	unsigned n_in = isl_basic_map_n_in(bmap);
-	unsigned n_out = isl_basic_map_n_out(bmap);
-
-	i = isl_basic_map_alloc_div(bmap);
-	if (i < 0)
-		return -1;
-
-	copy_constraint_from(bmap->div[i]+1, p->vector,
-	    nparam, n_in, n_out, bmap->extra, pos);
-
-	copy_values_from(bmap->div[i], &p->deno, 1);
-	for (j = 0; j < i; ++j)
-		if (isl_seq_eq(bmap->div[i], bmap->div[j],
-				1+1+isl_basic_map_total_dim(bmap)+j)) {
-			isl_basic_map_free_div(bmap, 1);
-			return j;
-		}
-
-	if (add_div_constraints(ctx, bmap, pos, p, i) < 0)
-		return -1;
-
-	return i;
-}
-
-/* Count some properties of a quast
- * - maximal number of new parameters
- * - maximal depth
- * - total number of solutions
- * - total number of empty branches
- */
-static void quast_count(PipQuast *q, int *maxnew, int depth, int *maxdepth,
-		        int *sol, int *nosol)
-{
-	PipNewparm *p;
-
-	for (p = q->newparm; p; p = p->next)
-		if (p->rank > *maxnew)
-			*maxnew = p->rank;
-	if (q->condition) {
-		if (++depth > *maxdepth)
-			*maxdepth = depth;
-		quast_count(q->next_else, maxnew, depth, maxdepth, sol, nosol);
-		quast_count(q->next_then, maxnew, depth, maxdepth, sol, nosol);
-	} else {
-		if (q->list)
-			++(*sol);
-		else
-			++(*nosol);
-	}
-}
-
-/*
- * pos: array of length bmap->set.extra, mapping each of the existential
- *		variables PIP proposes to an existential variable in bmap
- * bmap: collects the currently active constraints
- * rest: collects the empty leaves of the quast (if not NULL)
- */
-struct scan_data {
-	struct isl_ctx 			*ctx;
-	struct isl_basic_map 		*bmap;
-	struct isl_set			**rest;
-	int	   *pos;
-};
-
-/*
- * New existentially quantified variables are places after the existing ones.
- */
-static struct isl_map *scan_quast_r(struct scan_data *data, PipQuast *q,
-				    struct isl_map *map)
-{
-	PipNewparm *p;
-	struct isl_basic_map *bmap = data->bmap;
-	unsigned old_n_div = bmap->n_div;
-	unsigned nparam = isl_basic_map_n_param(bmap);
-	unsigned n_in = isl_basic_map_n_in(bmap);
-	unsigned n_out = isl_basic_map_n_out(bmap);
-
-	if (!map)
-		goto error;
-
-	for (p = q->newparm; p; p = p->next) {
-		int pos;
-		unsigned pip_param = nparam + n_in;
-
-		pos = find_div(data->ctx, bmap, data->pos, p);
-		if (pos < 0)
-			goto error;
-		data->pos[p->rank - pip_param] = pos;
-	}
-
-	if (q->condition) {
-		int pos = add_inequality(data->ctx, bmap, data->pos,
-					 q->condition);
-		if (pos < 0)
-			goto error;
-		map = scan_quast_r(data, q->next_then, map);
-
-		if (isl_inequality_negate(bmap, pos))
-			goto error;
-		map = scan_quast_r(data, q->next_else, map);
-
-		if (isl_basic_map_free_inequality(bmap, 1))
-			goto error;
-	} else if (q->list) {
-		PipList *l;
-		int j;
-		/* if bmap->n_out is zero, we are only interested in the domains
-		 * where a solution exists and not in the actual solution
-		 */
-		for (j = 0, l = q->list; j < n_out && l; ++j, l = l->next)
-			if (add_equality(data->ctx, bmap, data->pos, j,
-						l->vector) < 0)
-				goto error;
-		map = isl_map_add_basic_map(map, isl_basic_map_copy(bmap));
-		if (isl_basic_map_free_equality(bmap, n_out))
-			goto error;
-	} else if (data->rest) {
-		struct isl_basic_set *bset;
-		bset = isl_basic_set_from_basic_map(isl_basic_map_copy(bmap));
-		bset = isl_basic_set_drop_dims(bset, n_in, n_out);
-		if (!bset)
-			goto error;
-		*data->rest = isl_set_add_basic_set(*data->rest, bset);
-	}
-
-	if (isl_basic_map_free_inequality(bmap, 2*(bmap->n_div - old_n_div)))
-		goto error;
-	if (isl_basic_map_free_div(bmap, bmap->n_div - old_n_div))
-		goto error;
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/*
- * Returns a map of dimension "keep_dim" with "context" as domain and
- * as range the first "isl_space_dim(keep_dim, isl_dim_out)" variables
- * in the quast lists.
- */
-static struct isl_map *isl_map_from_quast(struct isl_ctx *ctx, PipQuast *q,
-		isl_space *keep_dim,
-		struct isl_basic_set *context,
-		struct isl_set **rest)
-{
-	int		pip_param;
-	int		nexist;
-	int		max_depth;
-	int		n_sol, n_nosol;
-	struct scan_data	data;
-	struct isl_map		*map = NULL;
-	isl_space		*dims;
-	unsigned		nparam;
-	unsigned		dim;
-	unsigned		keep;
-
-	data.ctx = ctx;
-	data.rest = rest;
-	data.bmap = NULL;
-	data.pos = NULL;
-
-	if (!context || !keep_dim)
-		goto error;
-
-	dim = isl_basic_set_n_dim(context);
-	nparam = isl_basic_set_n_param(context);
-	keep = isl_space_dim(keep_dim, isl_dim_out);
-	pip_param = nparam + dim;
-
-	max_depth = 0;
-	n_sol = 0;
-	n_nosol = 0;
-	nexist = pip_param-1;
-	quast_count(q, &nexist, 0, &max_depth, &n_sol, &n_nosol);
-	nexist -= pip_param-1;
-
-	if (rest) {
-		*rest = isl_set_alloc_space(isl_space_copy(context->dim), n_nosol,
-					ISL_MAP_DISJOINT);
-		if (!*rest)
-			goto error;
-	}
-	map = isl_map_alloc_space(isl_space_copy(keep_dim), n_sol,
-				ISL_MAP_DISJOINT);
-	if (!map)
-		goto error;
-
-	dims = isl_space_reverse(isl_space_copy(context->dim));
-	data.bmap = isl_basic_map_from_basic_set(context, dims);
-	data.bmap = isl_basic_map_extend_space(data.bmap,
-		keep_dim, nexist, keep, max_depth+2*nexist);
-	if (!data.bmap)
-		goto error2;
-
-	if (data.bmap->extra) {
-		int i;
-		data.pos = isl_alloc_array(ctx, int, data.bmap->extra);
-		if (!data.pos)
-			goto error;
-		for (i = 0; i < data.bmap->n_div; ++i)
-			data.pos[i] = i;
-	}
-
-	map = scan_quast_r(&data, q, map);
-	map = isl_map_finalize(map);
-	if (!map)
-		goto error2;
-	if (rest) {
-		*rest = isl_set_finalize(*rest);
-		if (!*rest)
-			goto error2;
-	}
-	isl_basic_map_free(data.bmap);
-	if (data.pos)
-		free(data.pos);
-	return map;
-error:
-	isl_basic_set_free(context);
-	isl_space_free(keep_dim);
-error2:
-	if (data.pos)
-		free(data.pos);
-	isl_basic_map_free(data.bmap);
-	isl_map_free(map);
-	if (rest) {
-		isl_set_free(*rest);
-		*rest = NULL;
-	}
-	return NULL;
-}
-
-static void copy_values_to(Entier *dst, isl_int *src, unsigned n)
-{
-	int i;
-
-	for (i = 0; i < n; ++i)
-		entier_assign(dst[i], src[i]);
-}
-
-static void copy_constraint_to(Entier *dst, isl_int *src,
-		unsigned pip_param, unsigned pip_var,
-		unsigned extra_front, unsigned extra_back)
-{
-	copy_values_to(dst+1+extra_front+pip_var+pip_param+extra_back, src, 1);
-	copy_values_to(dst+1+extra_front+pip_var, src+1, pip_param);
-	copy_values_to(dst+1+extra_front, src+1+pip_param, pip_var);
-}
-
-PipMatrix *isl_basic_map_to_pip(struct isl_basic_map *bmap, unsigned pip_param,
-			 unsigned extra_front, unsigned extra_back)
-{
-	int i;
-	unsigned nrow;
-	unsigned ncol;
-	PipMatrix *M;
-	unsigned off;
-	unsigned pip_var = isl_basic_map_total_dim(bmap) - pip_param;
-
-	nrow = extra_front + bmap->n_eq + bmap->n_ineq;
-	ncol = 1 + extra_front + pip_var + pip_param + extra_back + 1;
-	M = pip_matrix_alloc(nrow, ncol);
-	if (!M)
-		return NULL;
-
-	off = extra_front;
-	for (i = 0; i < bmap->n_eq; ++i) {
-		entier_set_si(M->p[off+i][0], 0);
-		copy_constraint_to(M->p[off+i], bmap->eq[i],
-				   pip_param, pip_var, extra_front, extra_back);
-	}
-	off += bmap->n_eq;
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		entier_set_si(M->p[off+i][0], 1);
-		copy_constraint_to(M->p[off+i], bmap->ineq[i],
-				   pip_param, pip_var, extra_front, extra_back);
-	}
-	return M;
-}
-
-PipMatrix *isl_basic_set_to_pip(struct isl_basic_set *bset, unsigned pip_param,
-			 unsigned extra_front, unsigned extra_back)
-{
-	return isl_basic_map_to_pip((struct isl_basic_map *)bset,
-					pip_param, extra_front, extra_back);
-}
-
-struct isl_map *isl_pip_basic_map_lexopt(
-		struct isl_basic_map *bmap, struct isl_basic_set *dom,
-		struct isl_set **empty, int max)
-{
-	PipOptions	*options;
-	PipQuast	*sol;
-	struct isl_map	*map;
-	struct isl_ctx  *ctx;
-	PipMatrix *domain = NULL, *context = NULL;
-	unsigned	 nparam, n_in, n_out;
-
-	bmap = isl_basic_map_detect_equalities(bmap);
-	if (!bmap || !dom)
-		goto error;
-
-	ctx = bmap->ctx;
-	isl_assert(ctx, isl_basic_map_compatible_domain(bmap, dom), goto error);
-	nparam = isl_basic_map_n_param(bmap);
-	n_in = isl_basic_map_n_in(bmap);
-	n_out = isl_basic_map_n_out(bmap);
-
-	domain = isl_basic_map_to_pip(bmap, nparam + n_in, 0, dom->n_div);
-	if (!domain)
-		goto error;
-	context = isl_basic_map_to_pip((struct isl_basic_map *)dom, 0, 0, 0);
-	if (!context)
-		goto error;
-
-	options = pip_options_init();
-	options->Simplify = 1;
-	options->Maximize = max;
-	options->Urs_unknowns = -1;
-	options->Urs_parms = -1;
-	sol = pip_solve(domain, context, -1, options);
-
-	if (sol) {
-		struct isl_basic_set *copy;
-		copy = isl_basic_set_copy(dom);
-		map = isl_map_from_quast(ctx, sol,
-				isl_space_copy(bmap->dim), copy, empty);
-	} else {
-		map = isl_map_empty_like_basic_map(bmap);
-		if (empty)
-			*empty = NULL;
-	}
-	if (!map)
-		goto error;
-	if (map->n == 0 && empty) {
-		isl_set_free(*empty);
-		*empty = isl_set_from_basic_set(dom);
-	} else
-		isl_basic_set_free(dom);
-	isl_basic_map_free(bmap);
-
-	pip_quast_free(sol);
-	pip_options_free(options);
-	pip_matrix_free(domain);
-	pip_matrix_free(context);
-
-	return map;
-error:
-	if (domain)
-		pip_matrix_free(domain);
-	if (context)
-		pip_matrix_free(context);
-	isl_basic_map_free(bmap);
-	isl_basic_set_free(dom);
-	return NULL;
-}
diff --git a/cloog-0.17.0/isl/isl_map_piplib.h b/cloog-0.17.0/isl/isl_map_piplib.h
deleted file mode 100644
index e796e4a..0000000
--- a/cloog-0.17.0/isl/isl_map_piplib.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_MAP_PIPLIB_H
-#define ISL_MAP_PIPLIB_H
-
-#include <isl/map.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_map *isl_pip_basic_map_lexopt(
-		struct isl_basic_map *bmap, struct isl_basic_set *dom,
-		struct isl_set **empty, int max);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_map_private.h b/cloog-0.17.0/isl/isl_map_private.h
deleted file mode 100644
index f3c6cd2..0000000
--- a/cloog-0.17.0/isl/isl_map_private.h
+++ /dev/null
@@ -1,341 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_MAP_PRIVATE_H
-#define ISL_MAP_PRIVATE_H
-
-#define isl_basic_set	isl_basic_map
-#define isl_set		isl_map
-#define isl_basic_set_list	isl_basic_map_list
-#include <isl/set.h>
-#include <isl/map.h>
-#include <isl_reordering.h>
-#include <isl/vec.h>
-
-/* A "basic map" is a relation between two sets of variables,
- * called the "in" and "out" variables.
- * A "basic set" is a basic map with a zero-dimensional
- * domain.
- *
- * It is implemented as a set with two extra fields:
- * n_in is the number of in variables
- * n_out is the number of out variables
- * n_in + n_out should be equal to set.dim
- */
-struct isl_basic_map {
-	int ref;
-#define ISL_BASIC_MAP_FINAL		(1 << 0)
-#define ISL_BASIC_MAP_EMPTY		(1 << 1)
-#define ISL_BASIC_MAP_NO_IMPLICIT	(1 << 2)
-#define ISL_BASIC_MAP_NO_REDUNDANT	(1 << 3)
-#define ISL_BASIC_MAP_RATIONAL		(1 << 4)
-#define ISL_BASIC_MAP_NORMALIZED	(1 << 5)
-#define ISL_BASIC_MAP_NORMALIZED_DIVS	(1 << 6)
-#define ISL_BASIC_MAP_ALL_EQUALITIES	(1 << 7)
-#define ISL_BASIC_SET_FINAL		(1 << 0)
-#define ISL_BASIC_SET_EMPTY		(1 << 1)
-#define ISL_BASIC_SET_NO_IMPLICIT	(1 << 2)
-#define ISL_BASIC_SET_NO_REDUNDANT	(1 << 3)
-#define ISL_BASIC_SET_RATIONAL		(1 << 4)
-#define ISL_BASIC_SET_NORMALIZED	(1 << 5)
-#define ISL_BASIC_SET_NORMALIZED_DIVS	(1 << 6)
-#define ISL_BASIC_SET_ALL_EQUALITIES	(1 << 7)
-	unsigned flags;
-
-	struct isl_ctx *ctx;
-
-	isl_space *dim;
-	unsigned extra;
-
-	unsigned n_eq;
-	unsigned n_ineq;
-
-	size_t c_size;
-	isl_int **eq;
-	isl_int **ineq;
-
-	unsigned n_div;
-
-	isl_int **div;
-
-	struct isl_vec *sample;
-
-	struct isl_blk block;
-	struct isl_blk block2;
-};
-
-/* A "map" is a (possibly disjoint) union of basic maps.
- * A "set" is a (possibly disjoint) union of basic sets.
- *
- * Currently, the isl_set structure is identical to the isl_map structure
- * and the library depends on this correspondence internally.
- * However, users should not depend on this correspondence.
- */
-struct isl_map {
-	int ref;
-#define ISL_MAP_DISJOINT		(1 << 0)
-#define ISL_MAP_NORMALIZED		(1 << 1)
-#define ISL_SET_DISJOINT		(1 << 0)
-#define ISL_SET_NORMALIZED		(1 << 1)
-	unsigned flags;
-
-	struct isl_ctx *ctx;
-
-	isl_space *dim;
-
-	int n;
-
-	size_t size;
-	struct isl_basic_map *p[1];
-};
-
-__isl_give isl_map *isl_map_realign(__isl_take isl_map *map,
-	__isl_take isl_reordering *r);
-__isl_give isl_set *isl_set_realign(__isl_take isl_set *set,
-	__isl_take isl_reordering *r);
-
-__isl_give isl_map *isl_map_reset(__isl_take isl_map *map,
-	enum isl_dim_type type);
-
-__isl_give isl_basic_set *isl_basic_set_reset_space(
-	__isl_take isl_basic_set *bset, __isl_take isl_space *dim);
-__isl_give isl_basic_map *isl_basic_map_reset_space(
-	__isl_take isl_basic_map *bmap, __isl_take isl_space *dim);
-__isl_give isl_map *isl_map_reset_space(__isl_take isl_map *map,
-	__isl_take isl_space *dim);
-
-unsigned isl_basic_map_offset(struct isl_basic_map *bmap,
-					enum isl_dim_type type);
-unsigned isl_basic_set_offset(struct isl_basic_set *bset,
-					enum isl_dim_type type);
-
-int isl_basic_map_may_be_set(__isl_keep isl_basic_map *bmap);
-int isl_map_may_be_set(__isl_keep isl_map *map);
-int isl_map_compatible_domain(struct isl_map *map, struct isl_set *set);
-int isl_basic_map_compatible_domain(struct isl_basic_map *bmap,
-		struct isl_basic_set *bset);
-int isl_basic_map_compatible_range(struct isl_basic_map *bmap,
-		struct isl_basic_set *bset);
-
-struct isl_basic_map *isl_basic_map_extend_space(struct isl_basic_map *base,
-		__isl_take isl_space *dim, unsigned extra,
-		unsigned n_eq, unsigned n_ineq);
-struct isl_basic_set *isl_basic_set_extend_space(struct isl_basic_set *base,
-		__isl_take isl_space *dim, unsigned extra,
-		unsigned n_eq, unsigned n_ineq);
-struct isl_basic_set *isl_basic_set_add_constraints(struct isl_basic_set *bset1,
-		struct isl_basic_set *bset2, unsigned pos);
-
-struct isl_map *isl_map_grow(struct isl_map *map, int n);
-struct isl_set *isl_set_grow(struct isl_set *set, int n);
-
-int isl_basic_set_contains(struct isl_basic_set *bset, struct isl_vec *vec);
-int isl_basic_map_contains(struct isl_basic_map *bmap, struct isl_vec *vec);
-
-__isl_give isl_basic_set *isl_basic_set_alloc_space(__isl_take isl_space *dim,
-		unsigned extra, unsigned n_eq, unsigned n_ineq);
-__isl_give isl_set *isl_set_alloc_space(__isl_take isl_space *dim, int n,
-	unsigned flags);
-__isl_give isl_basic_map *isl_basic_map_alloc_space(__isl_take isl_space *dim,
-		unsigned extra, unsigned n_eq, unsigned n_ineq);
-__isl_give isl_map *isl_map_alloc_space(__isl_take isl_space *dim, int n,
-	unsigned flags);
-
-unsigned isl_basic_map_total_dim(const struct isl_basic_map *bmap);
-
-int isl_basic_map_alloc_equality(struct isl_basic_map *bmap);
-int isl_basic_set_alloc_equality(struct isl_basic_set *bset);
-int isl_basic_set_free_inequality(struct isl_basic_set *bset, unsigned n);
-int isl_basic_map_free_equality(struct isl_basic_map *bmap, unsigned n);
-int isl_basic_set_free_equality(struct isl_basic_set *bset, unsigned n);
-int isl_basic_set_alloc_inequality(struct isl_basic_set *bset);
-int isl_basic_map_alloc_inequality(struct isl_basic_map *bmap);
-int isl_basic_map_free_inequality(struct isl_basic_map *bmap, unsigned n);
-int isl_basic_map_alloc_div(struct isl_basic_map *bmap);
-int isl_basic_set_alloc_div(struct isl_basic_set *bset);
-int isl_basic_map_free_div(struct isl_basic_map *bmap, unsigned n);
-int isl_basic_set_free_div(struct isl_basic_set *bset, unsigned n);
-void isl_basic_map_inequality_to_equality(
-		struct isl_basic_map *bmap, unsigned pos);
-int isl_basic_map_drop_equality(struct isl_basic_map *bmap, unsigned pos);
-int isl_basic_set_drop_equality(struct isl_basic_set *bset, unsigned pos);
-int isl_basic_set_drop_inequality(struct isl_basic_set *bset, unsigned pos);
-int isl_basic_map_drop_inequality(struct isl_basic_map *bmap, unsigned pos);
-__isl_give isl_basic_set *isl_basic_set_add_eq(__isl_take isl_basic_set *bset,
-	isl_int *eq);
-__isl_give isl_basic_map *isl_basic_map_add_eq(__isl_take isl_basic_map *bmap,
-	isl_int *eq);
-__isl_give isl_basic_set *isl_basic_set_add_ineq(__isl_take isl_basic_set *bset,
-	isl_int *ineq);
-__isl_give isl_basic_map *isl_basic_map_add_ineq(__isl_take isl_basic_map *bmap,
-	isl_int *ineq);
-
-int isl_inequality_negate(struct isl_basic_map *bmap, unsigned pos);
-
-struct isl_basic_set *isl_basic_set_cow(struct isl_basic_set *bset);
-struct isl_basic_map *isl_basic_map_cow(struct isl_basic_map *bmap);
-struct isl_set *isl_set_cow(struct isl_set *set);
-struct isl_map *isl_map_cow(struct isl_map *map);
-
-struct isl_basic_map *isl_basic_map_set_to_empty(struct isl_basic_map *bmap);
-struct isl_basic_set *isl_basic_set_set_to_empty(struct isl_basic_set *bset);
-struct isl_basic_set *isl_basic_set_order_divs(struct isl_basic_set *bset);
-void isl_basic_map_swap_div(struct isl_basic_map *bmap, int a, int b);
-struct isl_basic_map *isl_basic_map_order_divs(struct isl_basic_map *bmap);
-__isl_give isl_map *isl_map_order_divs(__isl_take isl_map *map);
-struct isl_basic_map *isl_basic_map_align_divs(
-		struct isl_basic_map *dst, struct isl_basic_map *src);
-struct isl_basic_set *isl_basic_set_align_divs(
-		struct isl_basic_set *dst, struct isl_basic_set *src);
-struct isl_basic_map *isl_basic_map_gauss(
-	struct isl_basic_map *bmap, int *progress);
-struct isl_basic_set *isl_basic_set_gauss(
-	struct isl_basic_set *bset, int *progress);
-__isl_give isl_basic_set *isl_basic_set_sort_constraints(
-	__isl_take isl_basic_set *bset);
-int isl_basic_map_plain_cmp(const __isl_keep isl_basic_map *bmap1,
-	const __isl_keep isl_basic_map *bmap2);
-int isl_set_plain_cmp(const __isl_keep isl_set *set1,
-	const __isl_keep isl_set *set2);
-int isl_basic_set_plain_is_equal(__isl_keep isl_basic_set *bset1,
-	__isl_keep isl_basic_set *bset2);
-int isl_basic_map_plain_is_equal(__isl_keep isl_basic_map *bmap1,
-	__isl_keep isl_basic_map *bmap2);
-struct isl_basic_map *isl_basic_map_normalize_constraints(
-	struct isl_basic_map *bmap);
-struct isl_basic_set *isl_basic_set_normalize_constraints(
-	struct isl_basic_set *bset);
-struct isl_basic_map *isl_basic_map_implicit_equalities(
-						struct isl_basic_map *bmap);
-struct isl_basic_set *isl_basic_map_underlying_set(struct isl_basic_map *bmap);
-__isl_give isl_basic_set *isl_basic_set_underlying_set(
-		__isl_take isl_basic_set *bset);
-struct isl_set *isl_map_underlying_set(struct isl_map *map);
-struct isl_basic_map *isl_basic_map_overlying_set(struct isl_basic_set *bset,
-	struct isl_basic_map *like);
-__isl_give isl_basic_set *isl_basic_set_drop_constraints_involving(
-	__isl_take isl_basic_set *bset, unsigned first, unsigned n);
-__isl_give isl_basic_set *isl_basic_set_drop(__isl_take isl_basic_set *bset,
-	enum isl_dim_type type, unsigned first, unsigned n);
-struct isl_basic_map *isl_basic_map_drop(struct isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned first, unsigned n);
-struct isl_set *isl_set_drop(struct isl_set *set,
-	enum isl_dim_type type, unsigned first, unsigned n);
-struct isl_basic_set *isl_basic_set_drop_dims(
-		struct isl_basic_set *bset, unsigned first, unsigned n);
-struct isl_set *isl_set_drop_dims(
-		struct isl_set *set, unsigned first, unsigned n);
-struct isl_map *isl_map_drop_inputs(
-		struct isl_map *map, unsigned first, unsigned n);
-struct isl_map *isl_map_drop(struct isl_map *map,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-struct isl_map *isl_map_remove_empty_parts(struct isl_map *map);
-struct isl_set *isl_set_remove_empty_parts(struct isl_set *set);
-
-struct isl_set *isl_set_normalize(struct isl_set *set);
-
-struct isl_set *isl_set_drop_vars(
-		struct isl_set *set, unsigned first, unsigned n);
-
-struct isl_basic_map *isl_basic_map_eliminate_vars(
-	struct isl_basic_map *bmap, unsigned pos, unsigned n);
-struct isl_basic_set *isl_basic_set_eliminate_vars(
-	struct isl_basic_set *bset, unsigned pos, unsigned n);
-
-__isl_give isl_map *isl_map_eliminate(__isl_take isl_map *map,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_set *isl_set_eliminate(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-int isl_basic_set_constraint_is_redundant(struct isl_basic_set **bset,
-	isl_int *c, isl_int *opt_n, isl_int *opt_d);
-
-int isl_basic_map_add_div_constraints(struct isl_basic_map *bmap, unsigned div);
-struct isl_basic_map *isl_basic_map_drop_redundant_divs(
-	struct isl_basic_map *bmap);
-struct isl_basic_set *isl_basic_set_drop_redundant_divs(
-	struct isl_basic_set *bset);
-
-struct isl_basic_set *isl_basic_set_recession_cone(struct isl_basic_set *bset);
-struct isl_basic_set *isl_basic_set_lineality_space(struct isl_basic_set *bset);
-
-struct isl_basic_set *isl_basic_set_set_rational(struct isl_basic_set *bset);
-__isl_give isl_basic_map *isl_basic_map_set_rational(
-	__isl_take isl_basic_map *bmap);
-__isl_give isl_map *isl_map_set_rational(__isl_take isl_map *map);
-
-struct isl_mat;
-
-struct isl_basic_set *isl_basic_set_preimage(struct isl_basic_set *bset,
-	struct isl_mat *mat);
-struct isl_set *isl_set_preimage(struct isl_set *set, struct isl_mat *mat);
-
-__isl_give isl_basic_set *isl_basic_set_transform_dims(
-	__isl_take isl_basic_set *bset, enum isl_dim_type type, unsigned first,
-	__isl_take isl_mat *trans);
-
-isl_int *isl_set_wrap_facet(__isl_keep isl_set *set,
-	isl_int *facet, isl_int *ridge);
-
-int isl_basic_map_contains_point(__isl_keep isl_basic_map *bmap,
-	__isl_keep isl_point *point);
-int isl_set_contains_point(__isl_keep isl_set *set, __isl_keep isl_point *point);
-
-int isl_basic_set_vars_get_sign(__isl_keep isl_basic_set *bset,
-	unsigned first, unsigned n, int *signs);
-int isl_set_foreach_orthant(__isl_keep isl_set *set,
-	int (*fn)(__isl_take isl_set *orthant, int *signs, void *user),
-	void *user);
-
-int isl_basic_map_add_div_constraints_var(__isl_keep isl_basic_map *bmap,
-	unsigned pos, isl_int *div);
-int isl_basic_set_add_div_constraints_var(__isl_keep isl_basic_set *bset,
-	unsigned pos, isl_int *div);
-int isl_basic_map_is_div_constraint(__isl_keep isl_basic_map *bmap,
-	isl_int *constraint, unsigned div);
-
-__isl_give isl_basic_set *isl_basic_set_from_local_space(
-	__isl_take isl_local_space *ls);
-__isl_give isl_basic_map *isl_basic_map_from_local_space(
-	__isl_take isl_local_space *ls);
-__isl_give isl_basic_set *isl_basic_set_expand_divs(
-	__isl_take isl_basic_set *bset, __isl_take isl_mat *div, int *exp);
-
-int isl_basic_map_divs_known(__isl_keep isl_basic_map *bmap);
-
-__isl_give isl_map *isl_map_inline_foreach_basic_map(__isl_take isl_map *map,
-	__isl_give isl_basic_map *(*fn)(__isl_take isl_basic_map *bmap));
-
-__isl_give isl_map *isl_map_align_params_map_map_and(
-	__isl_take isl_map *map1, __isl_take isl_map *map2,
-	__isl_give isl_map *(*fn)(__isl_take isl_map *map1,
-				    __isl_take isl_map *map2));
-int isl_map_align_params_map_map_and_test(__isl_keep isl_map *map1,
-	__isl_keep isl_map *map2,
-	int (*fn)(__isl_keep isl_map *map1, __isl_keep isl_map *map2));
-
-int isl_basic_map_foreach_lexopt(__isl_keep isl_basic_map *bmap, int max,
-	int (*fn)(__isl_take isl_basic_set *dom, __isl_take isl_aff_list *list,
-		  void *user),
-	void *user);
-int isl_basic_set_foreach_lexopt(__isl_keep isl_basic_set *bset, int max,
-	int (*fn)(__isl_take isl_basic_set *dom, __isl_take isl_aff_list *list,
-		  void *user),
-	void *user);
-
-__isl_give isl_set *isl_set_substitute(__isl_take isl_set *set,
-	enum isl_dim_type type, unsigned pos, __isl_keep isl_aff *subs);
-
-__isl_give isl_set *isl_set_gist_params_basic_set(__isl_take isl_set *set,
-	__isl_take isl_basic_set *context);
-
-int isl_map_compatible_range(__isl_keep isl_map *map, __isl_keep isl_set *set);
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_map_simplify.c b/cloog-0.17.0/isl/isl_map_simplify.c
deleted file mode 100644
index e568733..0000000
--- a/cloog-0.17.0/isl/isl_map_simplify.c
+++ /dev/null
@@ -1,2569 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <strings.h>
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include "isl_equalities.h"
-#include <isl/map.h>
-#include <isl/seq.h>
-#include "isl_tab.h"
-#include <isl_space_private.h>
-#include <isl_mat_private.h>
-
-static void swap_equality(struct isl_basic_map *bmap, int a, int b)
-{
-	isl_int *t = bmap->eq[a];
-	bmap->eq[a] = bmap->eq[b];
-	bmap->eq[b] = t;
-}
-
-static void swap_inequality(struct isl_basic_map *bmap, int a, int b)
-{
-	if (a != b) {
-		isl_int *t = bmap->ineq[a];
-		bmap->ineq[a] = bmap->ineq[b];
-		bmap->ineq[b] = t;
-	}
-}
-
-static void constraint_drop_vars(isl_int *c, unsigned n, unsigned rem)
-{
-	isl_seq_cpy(c, c + n, rem);
-	isl_seq_clr(c + rem, n);
-}
-
-/* Drop n dimensions starting at first.
- *
- * In principle, this frees up some extra variables as the number
- * of columns remains constant, but we would have to extend
- * the div array too as the number of rows in this array is assumed
- * to be equal to extra.
- */
-struct isl_basic_set *isl_basic_set_drop_dims(
-		struct isl_basic_set *bset, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!bset)
-		goto error;
-
-	isl_assert(bset->ctx, first + n <= bset->dim->n_out, goto error);
-
-	if (n == 0 && !isl_space_get_tuple_name(bset->dim, isl_dim_set))
-		return bset;
-
-	bset = isl_basic_set_cow(bset);
-	if (!bset)
-		return NULL;
-
-	for (i = 0; i < bset->n_eq; ++i)
-		constraint_drop_vars(bset->eq[i]+1+bset->dim->nparam+first, n,
-				     (bset->dim->n_out-first-n)+bset->extra);
-
-	for (i = 0; i < bset->n_ineq; ++i)
-		constraint_drop_vars(bset->ineq[i]+1+bset->dim->nparam+first, n,
-				     (bset->dim->n_out-first-n)+bset->extra);
-
-	for (i = 0; i < bset->n_div; ++i)
-		constraint_drop_vars(bset->div[i]+1+1+bset->dim->nparam+first, n,
-				     (bset->dim->n_out-first-n)+bset->extra);
-
-	bset->dim = isl_space_drop_outputs(bset->dim, first, n);
-	if (!bset->dim)
-		goto error;
-
-	ISL_F_CLR(bset, ISL_BASIC_SET_NORMALIZED);
-	bset = isl_basic_set_simplify(bset);
-	return isl_basic_set_finalize(bset);
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-struct isl_set *isl_set_drop_dims(
-		struct isl_set *set, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!set)
-		goto error;
-
-	isl_assert(set->ctx, first + n <= set->dim->n_out, goto error);
-
-	if (n == 0 && !isl_space_get_tuple_name(set->dim, isl_dim_set))
-		return set;
-	set = isl_set_cow(set);
-	if (!set)
-		goto error;
-	set->dim = isl_space_drop_outputs(set->dim, first, n);
-	if (!set->dim)
-		goto error;
-
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_basic_set_drop_dims(set->p[i], first, n);
-		if (!set->p[i])
-			goto error;
-	}
-
-	ISL_F_CLR(set, ISL_SET_NORMALIZED);
-	return set;
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-/* Move "n" divs starting at "first" to the end of the list of divs.
- */
-static struct isl_basic_map *move_divs_last(struct isl_basic_map *bmap,
-	unsigned first, unsigned n)
-{
-	isl_int **div;
-	int i;
-
-	if (first + n == bmap->n_div)
-		return bmap;
-
-	div = isl_alloc_array(bmap->ctx, isl_int *, n);
-	if (!div)
-		goto error;
-	for (i = 0; i < n; ++i)
-		div[i] = bmap->div[first + i];
-	for (i = 0; i < bmap->n_div - first - n; ++i)
-		bmap->div[first + i] = bmap->div[first + n + i];
-	for (i = 0; i < n; ++i)
-		bmap->div[bmap->n_div - n + i] = div[i];
-	free(div);
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Drop "n" dimensions of type "type" starting at "first".
- *
- * In principle, this frees up some extra variables as the number
- * of columns remains constant, but we would have to extend
- * the div array too as the number of rows in this array is assumed
- * to be equal to extra.
- */
-struct isl_basic_map *isl_basic_map_drop(struct isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-	unsigned dim;
-	unsigned offset;
-	unsigned left;
-
-	if (!bmap)
-		goto error;
-
-	dim = isl_basic_map_dim(bmap, type);
-	isl_assert(bmap->ctx, first + n <= dim, goto error);
-
-	if (n == 0 && !isl_space_is_named_or_nested(bmap->dim, type))
-		return bmap;
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-
-	offset = isl_basic_map_offset(bmap, type) + first;
-	left = isl_basic_map_total_dim(bmap) - (offset - 1) - n;
-	for (i = 0; i < bmap->n_eq; ++i)
-		constraint_drop_vars(bmap->eq[i]+offset, n, left);
-
-	for (i = 0; i < bmap->n_ineq; ++i)
-		constraint_drop_vars(bmap->ineq[i]+offset, n, left);
-
-	for (i = 0; i < bmap->n_div; ++i)
-		constraint_drop_vars(bmap->div[i]+1+offset, n, left);
-
-	if (type == isl_dim_div) {
-		bmap = move_divs_last(bmap, first, n);
-		if (!bmap)
-			goto error;
-		isl_basic_map_free_div(bmap, n);
-	} else
-		bmap->dim = isl_space_drop_dims(bmap->dim, type, first, n);
-	if (!bmap->dim)
-		goto error;
-
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-	bmap = isl_basic_map_simplify(bmap);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_basic_set_drop(__isl_take isl_basic_set *bset,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	return (isl_basic_set *)isl_basic_map_drop((isl_basic_map *)bset,
-							type, first, n);
-}
-
-struct isl_basic_map *isl_basic_map_drop_inputs(
-		struct isl_basic_map *bmap, unsigned first, unsigned n)
-{
-	return isl_basic_map_drop(bmap, isl_dim_in, first, n);
-}
-
-struct isl_map *isl_map_drop(struct isl_map *map,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!map)
-		goto error;
-
-	isl_assert(map->ctx, first + n <= isl_map_dim(map, type), goto error);
-
-	if (n == 0 && !isl_space_get_tuple_name(map->dim, type))
-		return map;
-	map = isl_map_cow(map);
-	if (!map)
-		goto error;
-	map->dim = isl_space_drop_dims(map->dim, type, first, n);
-	if (!map->dim)
-		goto error;
-
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_drop(map->p[i], type, first, n);
-		if (!map->p[i])
-			goto error;
-	}
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-struct isl_set *isl_set_drop(struct isl_set *set,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	return (isl_set *)isl_map_drop((isl_map *)set, type, first, n);
-}
-
-struct isl_map *isl_map_drop_inputs(
-		struct isl_map *map, unsigned first, unsigned n)
-{
-	return isl_map_drop(map, isl_dim_in, first, n);
-}
-
-/*
- * We don't cow, as the div is assumed to be redundant.
- */
-static struct isl_basic_map *isl_basic_map_drop_div(
-		struct isl_basic_map *bmap, unsigned div)
-{
-	int i;
-	unsigned pos;
-
-	if (!bmap)
-		goto error;
-
-	pos = 1 + isl_space_dim(bmap->dim, isl_dim_all) + div;
-
-	isl_assert(bmap->ctx, div < bmap->n_div, goto error);
-
-	for (i = 0; i < bmap->n_eq; ++i)
-		constraint_drop_vars(bmap->eq[i]+pos, 1, bmap->extra-div-1);
-
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		if (!isl_int_is_zero(bmap->ineq[i][pos])) {
-			isl_basic_map_drop_inequality(bmap, i);
-			--i;
-			continue;
-		}
-		constraint_drop_vars(bmap->ineq[i]+pos, 1, bmap->extra-div-1);
-	}
-
-	for (i = 0; i < bmap->n_div; ++i)
-		constraint_drop_vars(bmap->div[i]+1+pos, 1, bmap->extra-div-1);
-
-	if (div != bmap->n_div - 1) {
-		int j;
-		isl_int *t = bmap->div[div];
-
-		for (j = div; j < bmap->n_div - 1; ++j)
-			bmap->div[j] = bmap->div[j+1];
-
-		bmap->div[bmap->n_div - 1] = t;
-	}
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-	isl_basic_map_free_div(bmap, 1);
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_map *isl_basic_map_normalize_constraints(
-	struct isl_basic_map *bmap)
-{
-	int i;
-	isl_int gcd;
-	unsigned total = isl_basic_map_total_dim(bmap);
-
-	if (!bmap)
-		return NULL;
-
-	isl_int_init(gcd);
-	for (i = bmap->n_eq - 1; i >= 0; --i) {
-		isl_seq_gcd(bmap->eq[i]+1, total, &gcd);
-		if (isl_int_is_zero(gcd)) {
-			if (!isl_int_is_zero(bmap->eq[i][0])) {
-				bmap = isl_basic_map_set_to_empty(bmap);
-				break;
-			}
-			isl_basic_map_drop_equality(bmap, i);
-			continue;
-		}
-		if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL))
-			isl_int_gcd(gcd, gcd, bmap->eq[i][0]);
-		if (isl_int_is_one(gcd))
-			continue;
-		if (!isl_int_is_divisible_by(bmap->eq[i][0], gcd)) {
-			bmap = isl_basic_map_set_to_empty(bmap);
-			break;
-		}
-		isl_seq_scale_down(bmap->eq[i], bmap->eq[i], gcd, 1+total);
-	}
-
-	for (i = bmap->n_ineq - 1; i >= 0; --i) {
-		isl_seq_gcd(bmap->ineq[i]+1, total, &gcd);
-		if (isl_int_is_zero(gcd)) {
-			if (isl_int_is_neg(bmap->ineq[i][0])) {
-				bmap = isl_basic_map_set_to_empty(bmap);
-				break;
-			}
-			isl_basic_map_drop_inequality(bmap, i);
-			continue;
-		}
-		if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL))
-			isl_int_gcd(gcd, gcd, bmap->ineq[i][0]);
-		if (isl_int_is_one(gcd))
-			continue;
-		isl_int_fdiv_q(bmap->ineq[i][0], bmap->ineq[i][0], gcd);
-		isl_seq_scale_down(bmap->ineq[i]+1, bmap->ineq[i]+1, gcd, total);
-	}
-	isl_int_clear(gcd);
-
-	return bmap;
-}
-
-struct isl_basic_set *isl_basic_set_normalize_constraints(
-	struct isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)isl_basic_map_normalize_constraints(
-		(struct isl_basic_map *)bset);
-}
-
-/* Assumes divs have been ordered if keep_divs is set.
- */
-static void eliminate_var_using_equality(struct isl_basic_map *bmap,
-	unsigned pos, isl_int *eq, int keep_divs, int *progress)
-{
-	unsigned total;
-	unsigned space_total;
-	int k;
-	int last_div;
-
-	total = isl_basic_map_total_dim(bmap);
-	space_total = isl_space_dim(bmap->dim, isl_dim_all);
-	last_div = isl_seq_last_non_zero(eq + 1 + space_total, bmap->n_div);
-	for (k = 0; k < bmap->n_eq; ++k) {
-		if (bmap->eq[k] == eq)
-			continue;
-		if (isl_int_is_zero(bmap->eq[k][1+pos]))
-			continue;
-		if (progress)
-			*progress = 1;
-		isl_seq_elim(bmap->eq[k], eq, 1+pos, 1+total, NULL);
-		isl_seq_normalize(bmap->ctx, bmap->eq[k], 1 + total);
-	}
-
-	for (k = 0; k < bmap->n_ineq; ++k) {
-		if (isl_int_is_zero(bmap->ineq[k][1+pos]))
-			continue;
-		if (progress)
-			*progress = 1;
-		isl_seq_elim(bmap->ineq[k], eq, 1+pos, 1+total, NULL);
-		isl_seq_normalize(bmap->ctx, bmap->ineq[k], 1 + total);
-		ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-	}
-
-	for (k = 0; k < bmap->n_div; ++k) {
-		if (isl_int_is_zero(bmap->div[k][0]))
-			continue;
-		if (isl_int_is_zero(bmap->div[k][1+1+pos]))
-			continue;
-		if (progress)
-			*progress = 1;
-		/* We need to be careful about circular definitions,
-		 * so for now we just remove the definition of div k
-		 * if the equality contains any divs.
-		 * If keep_divs is set, then the divs have been ordered
-		 * and we can keep the definition as long as the result
-		 * is still ordered.
-		 */
-		if (last_div == -1 || (keep_divs && last_div < k))
-			isl_seq_elim(bmap->div[k]+1, eq,
-					1+pos, 1+total, &bmap->div[k][0]);
-		else
-			isl_seq_clr(bmap->div[k], 1 + total);
-		ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-	}
-}
-
-/* Assumes divs have been ordered if keep_divs is set.
- */
-static void eliminate_div(struct isl_basic_map *bmap, isl_int *eq,
-	unsigned div, int keep_divs)
-{
-	unsigned pos = isl_space_dim(bmap->dim, isl_dim_all) + div;
-
-	eliminate_var_using_equality(bmap, pos, eq, keep_divs, NULL);
-
-	isl_basic_map_drop_div(bmap, div);
-}
-
-/* Check if elimination of div "div" using equality "eq" would not
- * result in a div depending on a later div.
- */
-static int ok_to_eliminate_div(struct isl_basic_map *bmap, isl_int *eq,
-	unsigned div)
-{
-	int k;
-	int last_div;
-	unsigned space_total = isl_space_dim(bmap->dim, isl_dim_all);
-	unsigned pos = space_total + div;
-
-	last_div = isl_seq_last_non_zero(eq + 1 + space_total, bmap->n_div);
-	if (last_div < 0 || last_div <= div)
-		return 1;
-
-	for (k = 0; k <= last_div; ++k) {
-		if (isl_int_is_zero(bmap->div[k][0]))
-			return 1;
-		if (!isl_int_is_zero(bmap->div[k][1 + 1 + pos]))
-			return 0;
-	}
-
-	return 1;
-}
-
-/* Elimininate divs based on equalities
- */
-static struct isl_basic_map *eliminate_divs_eq(
-		struct isl_basic_map *bmap, int *progress)
-{
-	int d;
-	int i;
-	int modified = 0;
-	unsigned off;
-
-	bmap = isl_basic_map_order_divs(bmap);
-
-	if (!bmap)
-		return NULL;
-
-	off = 1 + isl_space_dim(bmap->dim, isl_dim_all);
-
-	for (d = bmap->n_div - 1; d >= 0 ; --d) {
-		for (i = 0; i < bmap->n_eq; ++i) {
-			if (!isl_int_is_one(bmap->eq[i][off + d]) &&
-			    !isl_int_is_negone(bmap->eq[i][off + d]))
-				continue;
-			if (!ok_to_eliminate_div(bmap, bmap->eq[i], d))
-				continue;
-			modified = 1;
-			*progress = 1;
-			eliminate_div(bmap, bmap->eq[i], d, 1);
-			isl_basic_map_drop_equality(bmap, i);
-			break;
-		}
-	}
-	if (modified)
-		return eliminate_divs_eq(bmap, progress);
-	return bmap;
-}
-
-/* Elimininate divs based on inequalities
- */
-static struct isl_basic_map *eliminate_divs_ineq(
-		struct isl_basic_map *bmap, int *progress)
-{
-	int d;
-	int i;
-	unsigned off;
-	struct isl_ctx *ctx;
-
-	if (!bmap)
-		return NULL;
-
-	ctx = bmap->ctx;
-	off = 1 + isl_space_dim(bmap->dim, isl_dim_all);
-
-	for (d = bmap->n_div - 1; d >= 0 ; --d) {
-		for (i = 0; i < bmap->n_eq; ++i)
-			if (!isl_int_is_zero(bmap->eq[i][off + d]))
-				break;
-		if (i < bmap->n_eq)
-			continue;
-		for (i = 0; i < bmap->n_ineq; ++i)
-			if (isl_int_abs_gt(bmap->ineq[i][off + d], ctx->one))
-				break;
-		if (i < bmap->n_ineq)
-			continue;
-		*progress = 1;
-		bmap = isl_basic_map_eliminate_vars(bmap, (off-1)+d, 1);
-		if (!bmap || ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY))
-			break;
-		bmap = isl_basic_map_drop_div(bmap, d);
-		if (!bmap)
-			break;
-	}
-	return bmap;
-}
-
-struct isl_basic_map *isl_basic_map_gauss(
-	struct isl_basic_map *bmap, int *progress)
-{
-	int k;
-	int done;
-	int last_var;
-	unsigned total_var;
-	unsigned total;
-
-	bmap = isl_basic_map_order_divs(bmap);
-
-	if (!bmap)
-		return NULL;
-
-	total = isl_basic_map_total_dim(bmap);
-	total_var = total - bmap->n_div;
-
-	last_var = total - 1;
-	for (done = 0; done < bmap->n_eq; ++done) {
-		for (; last_var >= 0; --last_var) {
-			for (k = done; k < bmap->n_eq; ++k)
-				if (!isl_int_is_zero(bmap->eq[k][1+last_var]))
-					break;
-			if (k < bmap->n_eq)
-				break;
-		}
-		if (last_var < 0)
-			break;
-		if (k != done)
-			swap_equality(bmap, k, done);
-		if (isl_int_is_neg(bmap->eq[done][1+last_var]))
-			isl_seq_neg(bmap->eq[done], bmap->eq[done], 1+total);
-
-		eliminate_var_using_equality(bmap, last_var, bmap->eq[done], 1,
-						progress);
-
-		if (last_var >= total_var &&
-		    isl_int_is_zero(bmap->div[last_var - total_var][0])) {
-			unsigned div = last_var - total_var;
-			isl_seq_neg(bmap->div[div]+1, bmap->eq[done], 1+total);
-			isl_int_set_si(bmap->div[div][1+1+last_var], 0);
-			isl_int_set(bmap->div[div][0],
-				    bmap->eq[done][1+last_var]);
-			ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-		}
-	}
-	if (done == bmap->n_eq)
-		return bmap;
-	for (k = done; k < bmap->n_eq; ++k) {
-		if (isl_int_is_zero(bmap->eq[k][0]))
-			continue;
-		return isl_basic_map_set_to_empty(bmap);
-	}
-	isl_basic_map_free_equality(bmap, bmap->n_eq-done);
-	return bmap;
-}
-
-struct isl_basic_set *isl_basic_set_gauss(
-	struct isl_basic_set *bset, int *progress)
-{
-	return (struct isl_basic_set*)isl_basic_map_gauss(
-			(struct isl_basic_map *)bset, progress);
-}
-
-
-static unsigned int round_up(unsigned int v)
-{
-	int old_v = v;
-
-	while (v) {
-		old_v = v;
-		v ^= v & -v;
-	}
-	return old_v << 1;
-}
-
-static int hash_index(isl_int ***index, unsigned int size, int bits,
-			struct isl_basic_map *bmap, int k)
-{
-	int h;
-	unsigned total = isl_basic_map_total_dim(bmap);
-	uint32_t hash = isl_seq_get_hash_bits(bmap->ineq[k]+1, total, bits);
-	for (h = hash; index[h]; h = (h+1) % size)
-		if (&bmap->ineq[k] != index[h] &&
-		    isl_seq_eq(bmap->ineq[k]+1, index[h][0]+1, total))
-			break;
-	return h;
-}
-
-static int set_hash_index(isl_int ***index, unsigned int size, int bits,
-			  struct isl_basic_set *bset, int k)
-{
-	return hash_index(index, size, bits, (struct isl_basic_map *)bset, k);
-}
-
-/* If we can eliminate more than one div, then we need to make
- * sure we do it from last div to first div, in order not to
- * change the position of the other divs that still need to
- * be removed.
- */
-static struct isl_basic_map *remove_duplicate_divs(
-	struct isl_basic_map *bmap, int *progress)
-{
-	unsigned int size;
-	int *index;
-	int *elim_for;
-	int k, l, h;
-	int bits;
-	struct isl_blk eq;
-	unsigned total_var;
-	unsigned total;
-	struct isl_ctx *ctx;
-
-	if (!bmap || bmap->n_div <= 1)
-		return bmap;
-
-	total_var = isl_space_dim(bmap->dim, isl_dim_all);
-	total = total_var + bmap->n_div;
-
-	ctx = bmap->ctx;
-	for (k = bmap->n_div - 1; k >= 0; --k)
-		if (!isl_int_is_zero(bmap->div[k][0]))
-			break;
-	if (k <= 0)
-		return bmap;
-
-	elim_for = isl_calloc_array(ctx, int, bmap->n_div);
-	size = round_up(4 * bmap->n_div / 3 - 1);
-	bits = ffs(size) - 1;
-	index = isl_calloc_array(ctx, int, size);
-	if (!index)
-		return bmap;
-	eq = isl_blk_alloc(ctx, 1+total);
-	if (isl_blk_is_error(eq))
-		goto out;
-
-	isl_seq_clr(eq.data, 1+total);
-	index[isl_seq_get_hash_bits(bmap->div[k], 2+total, bits)] = k + 1;
-	for (--k; k >= 0; --k) {
-		uint32_t hash;
-
-		if (isl_int_is_zero(bmap->div[k][0]))
-			continue;
-
-		hash = isl_seq_get_hash_bits(bmap->div[k], 2+total, bits);
-		for (h = hash; index[h]; h = (h+1) % size)
-			if (isl_seq_eq(bmap->div[k],
-				       bmap->div[index[h]-1], 2+total))
-				break;
-		if (index[h]) {
-			*progress = 1;
-			l = index[h] - 1;
-			elim_for[l] = k + 1;
-		}
-		index[h] = k+1;
-	}
-	for (l = bmap->n_div - 1; l >= 0; --l) {
-		if (!elim_for[l])
-			continue;
-		k = elim_for[l] - 1;
-		isl_int_set_si(eq.data[1+total_var+k], -1);
-		isl_int_set_si(eq.data[1+total_var+l], 1);
-		eliminate_div(bmap, eq.data, l, 0);
-		isl_int_set_si(eq.data[1+total_var+k], 0);
-		isl_int_set_si(eq.data[1+total_var+l], 0);
-	}
-
-	isl_blk_free(ctx, eq);
-out:
-	free(index);
-	free(elim_for);
-	return bmap;
-}
-
-static int n_pure_div_eq(struct isl_basic_map *bmap)
-{
-	int i, j;
-	unsigned total;
-
-	total = isl_space_dim(bmap->dim, isl_dim_all);
-	for (i = 0, j = bmap->n_div-1; i < bmap->n_eq; ++i) {
-		while (j >= 0 && isl_int_is_zero(bmap->eq[i][1 + total + j]))
-			--j;
-		if (j < 0)
-			break;
-		if (isl_seq_first_non_zero(bmap->eq[i] + 1 + total, j) != -1)
-			return 0;
-	}
-	return i;
-}
-
-/* Normalize divs that appear in equalities.
- *
- * In particular, we assume that bmap contains some equalities
- * of the form
- *
- *	a x = m * e_i
- *
- * and we want to replace the set of e_i by a minimal set and
- * such that the new e_i have a canonical representation in terms
- * of the vector x.
- * If any of the equalities involves more than one divs, then
- * we currently simply bail out.
- *
- * Let us first additionally assume that all equalities involve
- * a div.  The equalities then express modulo constraints on the
- * remaining variables and we can use "parameter compression"
- * to find a minimal set of constraints.  The result is a transformation
- *
- *	x = T(x') = x_0 + G x'
- *
- * with G a lower-triangular matrix with all elements below the diagonal
- * non-negative and smaller than the diagonal element on the same row.
- * We first normalize x_0 by making the same property hold in the affine
- * T matrix.
- * The rows i of G with a 1 on the diagonal do not impose any modulo
- * constraint and simply express x_i = x'_i.
- * For each of the remaining rows i, we introduce a div and a corresponding
- * equality.  In particular
- *
- *	g_ii e_j = x_i - g_i(x')
- *
- * where each x'_k is replaced either by x_k (if g_kk = 1) or the
- * corresponding div (if g_kk != 1).
- *
- * If there are any equalities not involving any div, then we
- * first apply a variable compression on the variables x:
- *
- *	x = C x''	x'' = C_2 x
- *
- * and perform the above parameter compression on A C instead of on A.
- * The resulting compression is then of the form
- *
- *	x'' = T(x') = x_0 + G x'
- *
- * and in constructing the new divs and the corresponding equalities,
- * we have to replace each x'', i.e., the x'_k with (g_kk = 1),
- * by the corresponding row from C_2.
- */
-static struct isl_basic_map *normalize_divs(
-	struct isl_basic_map *bmap, int *progress)
-{
-	int i, j, k;
-	int total;
-	int div_eq;
-	struct isl_mat *B;
-	struct isl_vec *d;
-	struct isl_mat *T = NULL;
-	struct isl_mat *C = NULL;
-	struct isl_mat *C2 = NULL;
-	isl_int v;
-	int *pos;
-	int dropped, needed;
-
-	if (!bmap)
-		return NULL;
-
-	if (bmap->n_div == 0)
-		return bmap;
-
-	if (bmap->n_eq == 0)
-		return bmap;
-
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_NORMALIZED_DIVS))
-		return bmap;
-
-	total = isl_space_dim(bmap->dim, isl_dim_all);
-	div_eq = n_pure_div_eq(bmap);
-	if (div_eq == 0)
-		return bmap;
-
-	if (div_eq < bmap->n_eq) {
-		B = isl_mat_sub_alloc6(bmap->ctx, bmap->eq, div_eq,
-					bmap->n_eq - div_eq, 0, 1 + total);
-		C = isl_mat_variable_compression(B, &C2);
-		if (!C || !C2)
-			goto error;
-		if (C->n_col == 0) {
-			bmap = isl_basic_map_set_to_empty(bmap);
-			isl_mat_free(C);
-			isl_mat_free(C2);
-			goto done;
-		}
-	}
-
-	d = isl_vec_alloc(bmap->ctx, div_eq);
-	if (!d)
-		goto error;
-	for (i = 0, j = bmap->n_div-1; i < div_eq; ++i) {
-		while (j >= 0 && isl_int_is_zero(bmap->eq[i][1 + total + j]))
-			--j;
-		isl_int_set(d->block.data[i], bmap->eq[i][1 + total + j]);
-	}
-	B = isl_mat_sub_alloc6(bmap->ctx, bmap->eq, 0, div_eq, 0, 1 + total);
-
-	if (C) {
-		B = isl_mat_product(B, C);
-		C = NULL;
-	}
-
-	T = isl_mat_parameter_compression(B, d);
-	if (!T)
-		goto error;
-	if (T->n_col == 0) {
-		bmap = isl_basic_map_set_to_empty(bmap);
-		isl_mat_free(C2);
-		isl_mat_free(T);
-		goto done;
-	}
-	isl_int_init(v);
-	for (i = 0; i < T->n_row - 1; ++i) {
-		isl_int_fdiv_q(v, T->row[1 + i][0], T->row[1 + i][1 + i]);
-		if (isl_int_is_zero(v))
-			continue;
-		isl_mat_col_submul(T, 0, v, 1 + i);
-	}
-	isl_int_clear(v);
-	pos = isl_alloc_array(bmap->ctx, int, T->n_row);
-	if (!pos)
-		goto error;
-	/* We have to be careful because dropping equalities may reorder them */
-	dropped = 0;
-	for (j = bmap->n_div - 1; j >= 0; --j) {
-		for (i = 0; i < bmap->n_eq; ++i)
-			if (!isl_int_is_zero(bmap->eq[i][1 + total + j]))
-				break;
-		if (i < bmap->n_eq) {
-			bmap = isl_basic_map_drop_div(bmap, j);
-			isl_basic_map_drop_equality(bmap, i);
-			++dropped;
-		}
-	}
-	pos[0] = 0;
-	needed = 0;
-	for (i = 1; i < T->n_row; ++i) {
-		if (isl_int_is_one(T->row[i][i]))
-			pos[i] = i;
-		else
-			needed++;
-	}
-	if (needed > dropped) {
-		bmap = isl_basic_map_extend_space(bmap, isl_space_copy(bmap->dim),
-				needed, needed, 0);
-		if (!bmap)
-			goto error;
-	}
-	for (i = 1; i < T->n_row; ++i) {
-		if (isl_int_is_one(T->row[i][i]))
-			continue;
-		k = isl_basic_map_alloc_div(bmap);
-		pos[i] = 1 + total + k;
-		isl_seq_clr(bmap->div[k] + 1, 1 + total + bmap->n_div);
-		isl_int_set(bmap->div[k][0], T->row[i][i]);
-		if (C2)
-			isl_seq_cpy(bmap->div[k] + 1, C2->row[i], 1 + total);
-		else
-			isl_int_set_si(bmap->div[k][1 + i], 1);
-		for (j = 0; j < i; ++j) {
-			if (isl_int_is_zero(T->row[i][j]))
-				continue;
-			if (pos[j] < T->n_row && C2)
-				isl_seq_submul(bmap->div[k] + 1, T->row[i][j],
-						C2->row[pos[j]], 1 + total);
-			else
-				isl_int_neg(bmap->div[k][1 + pos[j]],
-								T->row[i][j]);
-		}
-		j = isl_basic_map_alloc_equality(bmap);
-		isl_seq_neg(bmap->eq[j], bmap->div[k]+1, 1+total+bmap->n_div);
-		isl_int_set(bmap->eq[j][pos[i]], bmap->div[k][0]);
-	}
-	free(pos);
-	isl_mat_free(C2);
-	isl_mat_free(T);
-
-	if (progress)
-		*progress = 1;
-done:
-	ISL_F_SET(bmap, ISL_BASIC_MAP_NORMALIZED_DIVS);
-
-	return bmap;
-error:
-	isl_mat_free(C);
-	isl_mat_free(C2);
-	isl_mat_free(T);
-	return bmap;
-}
-
-static struct isl_basic_map *set_div_from_lower_bound(
-	struct isl_basic_map *bmap, int div, int ineq)
-{
-	unsigned total = 1 + isl_space_dim(bmap->dim, isl_dim_all);
-
-	isl_seq_neg(bmap->div[div] + 1, bmap->ineq[ineq], total + bmap->n_div);
-	isl_int_set(bmap->div[div][0], bmap->ineq[ineq][total + div]);
-	isl_int_add(bmap->div[div][1], bmap->div[div][1], bmap->div[div][0]);
-	isl_int_sub_ui(bmap->div[div][1], bmap->div[div][1], 1);
-	isl_int_set_si(bmap->div[div][1 + total + div], 0);
-
-	return bmap;
-}
-
-/* Check whether it is ok to define a div based on an inequality.
- * To avoid the introduction of circular definitions of divs, we
- * do not allow such a definition if the resulting expression would refer to
- * any other undefined divs or if any known div is defined in
- * terms of the unknown div.
- */
-static int ok_to_set_div_from_bound(struct isl_basic_map *bmap,
-	int div, int ineq)
-{
-	int j;
-	unsigned total = 1 + isl_space_dim(bmap->dim, isl_dim_all);
-
-	/* Not defined in terms of unknown divs */
-	for (j = 0; j < bmap->n_div; ++j) {
-		if (div == j)
-			continue;
-		if (isl_int_is_zero(bmap->ineq[ineq][total + j]))
-			continue;
-		if (isl_int_is_zero(bmap->div[j][0]))
-			return 0;
-	}
-
-	/* No other div defined in terms of this one => avoid loops */
-	for (j = 0; j < bmap->n_div; ++j) {
-		if (div == j)
-			continue;
-		if (isl_int_is_zero(bmap->div[j][0]))
-			continue;
-		if (!isl_int_is_zero(bmap->div[j][1 + total + div]))
-			return 0;
-	}
-
-	return 1;
-}
-
-/* Given two constraints "k" and "l" that are opposite to each other,
- * except for the constant term, check if we can use them
- * to obtain an expression for one of the hitherto unknown divs.
- * "sum" is the sum of the constant terms of the constraints.
- * If this sum is strictly smaller than the coefficient of one
- * of the divs, then this pair can be used define the div.
- * To avoid the introduction of circular definitions of divs, we
- * do not use the pair if the resulting expression would refer to
- * any other undefined divs or if any known div is defined in
- * terms of the unknown div.
- */
-static struct isl_basic_map *check_for_div_constraints(
-	struct isl_basic_map *bmap, int k, int l, isl_int sum, int *progress)
-{
-	int i;
-	unsigned total = 1 + isl_space_dim(bmap->dim, isl_dim_all);
-
-	for (i = 0; i < bmap->n_div; ++i) {
-		if (!isl_int_is_zero(bmap->div[i][0]))
-			continue;
-		if (isl_int_is_zero(bmap->ineq[k][total + i]))
-			continue;
-		if (isl_int_abs_ge(sum, bmap->ineq[k][total + i]))
-			continue;
-		if (!ok_to_set_div_from_bound(bmap, i, k))
-			break;
-		if (isl_int_is_pos(bmap->ineq[k][total + i]))
-			bmap = set_div_from_lower_bound(bmap, i, k);
-		else
-			bmap = set_div_from_lower_bound(bmap, i, l);
-		if (progress)
-			*progress = 1;
-		break;
-	}
-	return bmap;
-}
-
-static struct isl_basic_map *remove_duplicate_constraints(
-	struct isl_basic_map *bmap, int *progress, int detect_divs)
-{
-	unsigned int size;
-	isl_int ***index;
-	int k, l, h;
-	int bits;
-	unsigned total = isl_basic_map_total_dim(bmap);
-	isl_int sum;
-	isl_ctx *ctx;
-
-	if (!bmap || bmap->n_ineq <= 1)
-		return bmap;
-
-	size = round_up(4 * (bmap->n_ineq+1) / 3 - 1);
-	bits = ffs(size) - 1;
-	ctx = isl_basic_map_get_ctx(bmap);
-	index = isl_calloc_array(ctx, isl_int **, size);
-	if (!index)
-		return bmap;
-
-	index[isl_seq_get_hash_bits(bmap->ineq[0]+1, total, bits)] = &bmap->ineq[0];
-	for (k = 1; k < bmap->n_ineq; ++k) {
-		h = hash_index(index, size, bits, bmap, k);
-		if (!index[h]) {
-			index[h] = &bmap->ineq[k];
-			continue;
-		}
-		if (progress)
-			*progress = 1;
-		l = index[h] - &bmap->ineq[0];
-		if (isl_int_lt(bmap->ineq[k][0], bmap->ineq[l][0]))
-			swap_inequality(bmap, k, l);
-		isl_basic_map_drop_inequality(bmap, k);
-		--k;
-	}
-	isl_int_init(sum);
-	for (k = 0; k < bmap->n_ineq-1; ++k) {
-		isl_seq_neg(bmap->ineq[k]+1, bmap->ineq[k]+1, total);
-		h = hash_index(index, size, bits, bmap, k);
-		isl_seq_neg(bmap->ineq[k]+1, bmap->ineq[k]+1, total);
-		if (!index[h])
-			continue;
-		l = index[h] - &bmap->ineq[0];
-		isl_int_add(sum, bmap->ineq[k][0], bmap->ineq[l][0]);
-		if (isl_int_is_pos(sum)) {
-			if (detect_divs)
-				bmap = check_for_div_constraints(bmap, k, l,
-								 sum, progress);
-			continue;
-		}
-		if (isl_int_is_zero(sum)) {
-			/* We need to break out of the loop after these
-			 * changes since the contents of the hash
-			 * will no longer be valid.
-			 * Plus, we probably we want to regauss first.
-			 */
-			if (progress)
-				*progress = 1;
-			isl_basic_map_drop_inequality(bmap, l);
-			isl_basic_map_inequality_to_equality(bmap, k);
-		} else
-			bmap = isl_basic_map_set_to_empty(bmap);
-		break;
-	}
-	isl_int_clear(sum);
-
-	free(index);
-	return bmap;
-}
-
-
-struct isl_basic_map *isl_basic_map_simplify(struct isl_basic_map *bmap)
-{
-	int progress = 1;
-	if (!bmap)
-		return NULL;
-	while (progress) {
-		progress = 0;
-		bmap = isl_basic_map_normalize_constraints(bmap);
-		bmap = remove_duplicate_divs(bmap, &progress);
-		bmap = eliminate_divs_eq(bmap, &progress);
-		bmap = eliminate_divs_ineq(bmap, &progress);
-		bmap = isl_basic_map_gauss(bmap, &progress);
-		/* requires equalities in normal form */
-		bmap = normalize_divs(bmap, &progress);
-		bmap = remove_duplicate_constraints(bmap, &progress, 1);
-	}
-	return bmap;
-}
-
-struct isl_basic_set *isl_basic_set_simplify(struct isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_simplify((struct isl_basic_map *)bset);
-}
-
-
-int isl_basic_map_is_div_constraint(__isl_keep isl_basic_map *bmap,
-	isl_int *constraint, unsigned div)
-{
-	unsigned pos;
-
-	if (!bmap)
-		return -1;
-
-	pos = 1 + isl_space_dim(bmap->dim, isl_dim_all) + div;
-
-	if (isl_int_eq(constraint[pos], bmap->div[div][0])) {
-		int neg;
-		isl_int_sub(bmap->div[div][1],
-				bmap->div[div][1], bmap->div[div][0]);
-		isl_int_add_ui(bmap->div[div][1], bmap->div[div][1], 1);
-		neg = isl_seq_is_neg(constraint, bmap->div[div]+1, pos);
-		isl_int_sub_ui(bmap->div[div][1], bmap->div[div][1], 1);
-		isl_int_add(bmap->div[div][1],
-				bmap->div[div][1], bmap->div[div][0]);
-		if (!neg)
-			return 0;
-		if (isl_seq_first_non_zero(constraint+pos+1,
-					    bmap->n_div-div-1) != -1)
-			return 0;
-	} else if (isl_int_abs_eq(constraint[pos], bmap->div[div][0])) {
-		if (!isl_seq_eq(constraint, bmap->div[div]+1, pos))
-			return 0;
-		if (isl_seq_first_non_zero(constraint+pos+1,
-					    bmap->n_div-div-1) != -1)
-			return 0;
-	} else
-		return 0;
-
-	return 1;
-}
-
-
-/* If the only constraints a div d=floor(f/m)
- * appears in are its two defining constraints
- *
- *	f - m d >=0
- *	-(f - (m - 1)) + m d >= 0
- *
- * then it can safely be removed.
- */
-static int div_is_redundant(struct isl_basic_map *bmap, int div)
-{
-	int i;
-	unsigned pos = 1 + isl_space_dim(bmap->dim, isl_dim_all) + div;
-
-	for (i = 0; i < bmap->n_eq; ++i)
-		if (!isl_int_is_zero(bmap->eq[i][pos]))
-			return 0;
-
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		if (isl_int_is_zero(bmap->ineq[i][pos]))
-			continue;
-		if (!isl_basic_map_is_div_constraint(bmap, bmap->ineq[i], div))
-			return 0;
-	}
-
-	for (i = 0; i < bmap->n_div; ++i)
-		if (!isl_int_is_zero(bmap->div[i][1+pos]))
-			return 0;
-
-	return 1;
-}
-
-/*
- * Remove divs that don't occur in any of the constraints or other divs.
- * These can arise when dropping some of the variables in a quast
- * returned by piplib.
- */
-static struct isl_basic_map *remove_redundant_divs(struct isl_basic_map *bmap)
-{
-	int i;
-
-	if (!bmap)
-		return NULL;
-
-	for (i = bmap->n_div-1; i >= 0; --i) {
-		if (!div_is_redundant(bmap, i))
-			continue;
-		bmap = isl_basic_map_drop_div(bmap, i);
-	}
-	return bmap;
-}
-
-struct isl_basic_map *isl_basic_map_finalize(struct isl_basic_map *bmap)
-{
-	bmap = remove_redundant_divs(bmap);
-	if (!bmap)
-		return NULL;
-	ISL_F_SET(bmap, ISL_BASIC_SET_FINAL);
-	return bmap;
-}
-
-struct isl_basic_set *isl_basic_set_finalize(struct isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)
-		isl_basic_map_finalize((struct isl_basic_map *)bset);
-}
-
-struct isl_set *isl_set_finalize(struct isl_set *set)
-{
-	int i;
-
-	if (!set)
-		return NULL;
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_basic_set_finalize(set->p[i]);
-		if (!set->p[i])
-			goto error;
-	}
-	return set;
-error:
-	isl_set_free(set);
-	return NULL;
-}
-
-struct isl_map *isl_map_finalize(struct isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_finalize(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-
-/* Remove definition of any div that is defined in terms of the given variable.
- * The div itself is not removed.  Functions such as
- * eliminate_divs_ineq depend on the other divs remaining in place.
- */
-static struct isl_basic_map *remove_dependent_vars(struct isl_basic_map *bmap,
-									int pos)
-{
-	int i;
-
-	for (i = 0; i < bmap->n_div; ++i) {
-		if (isl_int_is_zero(bmap->div[i][0]))
-			continue;
-		if (isl_int_is_zero(bmap->div[i][1+1+pos]))
-			continue;
-		isl_int_set_si(bmap->div[i][0], 0);
-	}
-	return bmap;
-}
-
-/* Eliminate the specified variables from the constraints using
- * Fourier-Motzkin.  The variables themselves are not removed.
- */
-struct isl_basic_map *isl_basic_map_eliminate_vars(
-	struct isl_basic_map *bmap, unsigned pos, unsigned n)
-{
-	int d;
-	int i, j, k;
-	unsigned total;
-	int need_gauss = 0;
-
-	if (n == 0)
-		return bmap;
-	if (!bmap)
-		return NULL;
-	total = isl_basic_map_total_dim(bmap);
-
-	bmap = isl_basic_map_cow(bmap);
-	for (d = pos + n - 1; d >= 0 && d >= pos; --d)
-		bmap = remove_dependent_vars(bmap, d);
-
-	for (d = pos + n - 1;
-	     d >= 0 && d >= total - bmap->n_div && d >= pos; --d)
-		isl_seq_clr(bmap->div[d-(total-bmap->n_div)], 2+total);
-	for (d = pos + n - 1; d >= 0 && d >= pos; --d) {
-		int n_lower, n_upper;
-		if (!bmap)
-			return NULL;
-		for (i = 0; i < bmap->n_eq; ++i) {
-			if (isl_int_is_zero(bmap->eq[i][1+d]))
-				continue;
-			eliminate_var_using_equality(bmap, d, bmap->eq[i], 0, NULL);
-			isl_basic_map_drop_equality(bmap, i);
-			need_gauss = 1;
-			break;
-		}
-		if (i < bmap->n_eq)
-			continue;
-		n_lower = 0;
-		n_upper = 0;
-		for (i = 0; i < bmap->n_ineq; ++i) {
-			if (isl_int_is_pos(bmap->ineq[i][1+d]))
-				n_lower++;
-			else if (isl_int_is_neg(bmap->ineq[i][1+d]))
-				n_upper++;
-		}
-		bmap = isl_basic_map_extend_constraints(bmap,
-				0, n_lower * n_upper);
-		if (!bmap)
-			goto error;
-		for (i = bmap->n_ineq - 1; i >= 0; --i) {
-			int last;
-			if (isl_int_is_zero(bmap->ineq[i][1+d]))
-				continue;
-			last = -1;
-			for (j = 0; j < i; ++j) {
-				if (isl_int_is_zero(bmap->ineq[j][1+d]))
-					continue;
-				last = j;
-				if (isl_int_sgn(bmap->ineq[i][1+d]) ==
-				    isl_int_sgn(bmap->ineq[j][1+d]))
-					continue;
-				k = isl_basic_map_alloc_inequality(bmap);
-				if (k < 0)
-					goto error;
-				isl_seq_cpy(bmap->ineq[k], bmap->ineq[i],
-						1+total);
-				isl_seq_elim(bmap->ineq[k], bmap->ineq[j],
-						1+d, 1+total, NULL);
-			}
-			isl_basic_map_drop_inequality(bmap, i);
-			i = last + 1;
-		}
-		if (n_lower > 0 && n_upper > 0) {
-			bmap = isl_basic_map_normalize_constraints(bmap);
-			bmap = remove_duplicate_constraints(bmap, NULL, 0);
-			bmap = isl_basic_map_gauss(bmap, NULL);
-			bmap = isl_basic_map_remove_redundancies(bmap);
-			need_gauss = 0;
-			if (!bmap)
-				goto error;
-			if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY))
-				break;
-		}
-	}
-	ISL_F_CLR(bmap, ISL_BASIC_MAP_NORMALIZED);
-	if (need_gauss)
-		bmap = isl_basic_map_gauss(bmap, NULL);
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_eliminate_vars(
-	struct isl_basic_set *bset, unsigned pos, unsigned n)
-{
-	return (struct isl_basic_set *)isl_basic_map_eliminate_vars(
-			(struct isl_basic_map *)bset, pos, n);
-}
-
-/* Eliminate the specified n dimensions starting at first from the
- * constraints using Fourier-Motzkin.  The dimensions themselves
- * are not removed.
- */
-__isl_give isl_basic_map *isl_basic_map_eliminate(
-	__isl_take isl_basic_map *bmap,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	if (!bmap)
-		return NULL;
-	if (n == 0)
-		return bmap;
-
-	if (first + n > isl_basic_map_dim(bmap, type))
-		isl_die(bmap->ctx, isl_error_invalid,
-			"index out of bounds", goto error);
-
-	first += isl_basic_map_offset(bmap, type) - 1;
-	bmap = isl_basic_map_eliminate_vars(bmap, first, n);
-	return isl_basic_map_finalize(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Don't assume equalities are in order, because align_divs
- * may have changed the order of the divs.
- */
-static void compute_elimination_index(struct isl_basic_map *bmap, int *elim)
-{
-	int d, i;
-	unsigned total;
-
-	total = isl_space_dim(bmap->dim, isl_dim_all);
-	for (d = 0; d < total; ++d)
-		elim[d] = -1;
-	for (i = 0; i < bmap->n_eq; ++i) {
-		for (d = total - 1; d >= 0; --d) {
-			if (isl_int_is_zero(bmap->eq[i][1+d]))
-				continue;
-			elim[d] = i;
-			break;
-		}
-	}
-}
-
-static void set_compute_elimination_index(struct isl_basic_set *bset, int *elim)
-{
-	compute_elimination_index((struct isl_basic_map *)bset, elim);
-}
-
-static int reduced_using_equalities(isl_int *dst, isl_int *src,
-	struct isl_basic_map *bmap, int *elim)
-{
-	int d;
-	int copied = 0;
-	unsigned total;
-
-	total = isl_space_dim(bmap->dim, isl_dim_all);
-	for (d = total - 1; d >= 0; --d) {
-		if (isl_int_is_zero(src[1+d]))
-			continue;
-		if (elim[d] == -1)
-			continue;
-		if (!copied) {
-			isl_seq_cpy(dst, src, 1 + total);
-			copied = 1;
-		}
-		isl_seq_elim(dst, bmap->eq[elim[d]], 1 + d, 1 + total, NULL);
-	}
-	return copied;
-}
-
-static int set_reduced_using_equalities(isl_int *dst, isl_int *src,
-	struct isl_basic_set *bset, int *elim)
-{
-	return reduced_using_equalities(dst, src,
-					(struct isl_basic_map *)bset, elim);
-}
-
-static struct isl_basic_set *isl_basic_set_reduce_using_equalities(
-	struct isl_basic_set *bset, struct isl_basic_set *context)
-{
-	int i;
-	int *elim;
-
-	if (!bset || !context)
-		goto error;
-
-	if (context->n_eq == 0) {
-		isl_basic_set_free(context);
-		return bset;
-	}
-
-	bset = isl_basic_set_cow(bset);
-	if (!bset)
-		goto error;
-
-	elim = isl_alloc_array(bset->ctx, int, isl_basic_set_n_dim(bset));
-	if (!elim)
-		goto error;
-	set_compute_elimination_index(context, elim);
-	for (i = 0; i < bset->n_eq; ++i)
-		set_reduced_using_equalities(bset->eq[i], bset->eq[i],
-							context, elim);
-	for (i = 0; i < bset->n_ineq; ++i)
-		set_reduced_using_equalities(bset->ineq[i], bset->ineq[i],
-							context, elim);
-	isl_basic_set_free(context);
-	free(elim);
-	bset = isl_basic_set_simplify(bset);
-	bset = isl_basic_set_finalize(bset);
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	isl_basic_set_free(context);
-	return NULL;
-}
-
-static struct isl_basic_set *remove_shifted_constraints(
-	struct isl_basic_set *bset, struct isl_basic_set *context)
-{
-	unsigned int size;
-	isl_int ***index;
-	int bits;
-	int k, h, l;
-	isl_ctx *ctx;
-
-	if (!bset)
-		return NULL;
-
-	size = round_up(4 * (context->n_ineq+1) / 3 - 1);
-	bits = ffs(size) - 1;
-	ctx = isl_basic_set_get_ctx(bset);
-	index = isl_calloc_array(ctx, isl_int **, size);
-	if (!index)
-		return bset;
-
-	for (k = 0; k < context->n_ineq; ++k) {
-		h = set_hash_index(index, size, bits, context, k);
-		index[h] = &context->ineq[k];
-	}
-	for (k = 0; k < bset->n_ineq; ++k) {
-		h = set_hash_index(index, size, bits, bset, k);
-		if (!index[h])
-			continue;
-		l = index[h] - &context->ineq[0];
-		if (isl_int_lt(bset->ineq[k][0], context->ineq[l][0]))
-			continue;
-		bset = isl_basic_set_cow(bset);
-		if (!bset)
-			goto error;
-		isl_basic_set_drop_inequality(bset, k);
-		--k;
-	}
-	free(index);
-	return bset;
-error:
-	free(index);
-	return bset;
-}
-
-/* Remove all information from bset that is redundant in the context
- * of context.  Both bset and context are assumed to be full-dimensional.
- *
- * We first * remove the inequalities from "bset"
- * that are obviously redundant with respect to some inequality in "context".
- *
- * If there are any inequalities left, we construct a tableau for
- * the context and then add the inequalities of "bset".
- * Before adding these inequalities, we freeze all constraints such that
- * they won't be considered redundant in terms of the constraints of "bset".
- * Then we detect all redundant constraints (among the
- * constraints that weren't frozen), first by checking for redundancy in the
- * the tableau and then by checking if replacing a constraint by its negation
- * would lead to an empty set.  This last step is fairly expensive
- * and could be optimized by more reuse of the tableau.
- * Finally, we update bset according to the results.
- */
-static __isl_give isl_basic_set *uset_gist_full(__isl_take isl_basic_set *bset,
-	__isl_take isl_basic_set *context)
-{
-	int i, k;
-	isl_basic_set *combined = NULL;
-	struct isl_tab *tab = NULL;
-	unsigned context_ineq;
-	unsigned total;
-
-	if (!bset || !context)
-		goto error;
-
-	if (isl_basic_set_is_universe(bset)) {
-		isl_basic_set_free(context);
-		return bset;
-	}
-
-	if (isl_basic_set_is_universe(context)) {
-		isl_basic_set_free(context);
-		return bset;
-	}
-
-	bset = remove_shifted_constraints(bset, context);
-	if (!bset)
-		goto error;
-	if (bset->n_ineq == 0)
-		goto done;
-
-	context_ineq = context->n_ineq;
-	combined = isl_basic_set_cow(isl_basic_set_copy(context));
-	combined = isl_basic_set_extend_constraints(combined, 0, bset->n_ineq);
-	tab = isl_tab_from_basic_set(combined);
-	for (i = 0; i < context_ineq; ++i)
-		if (isl_tab_freeze_constraint(tab, i) < 0)
-			goto error;
-	tab = isl_tab_extend(tab, bset->n_ineq);
-	for (i = 0; i < bset->n_ineq; ++i)
-		if (isl_tab_add_ineq(tab, bset->ineq[i]) < 0)
-			goto error;
-	bset = isl_basic_set_add_constraints(combined, bset, 0);
-	combined = NULL;
-	if (!bset)
-		goto error;
-	if (isl_tab_detect_redundant(tab) < 0)
-		goto error;
-	total = isl_basic_set_total_dim(bset);
-	for (i = context_ineq; i < bset->n_ineq; ++i) {
-		int is_empty;
-		if (tab->con[i].is_redundant)
-			continue;
-		tab->con[i].is_redundant = 1;
-		combined = isl_basic_set_dup(bset);
-		combined = isl_basic_set_update_from_tab(combined, tab);
-		combined = isl_basic_set_extend_constraints(combined, 0, 1);
-		k = isl_basic_set_alloc_inequality(combined);
-		if (k < 0)
-			goto error;
-		isl_seq_neg(combined->ineq[k], bset->ineq[i], 1 + total);
-		isl_int_sub_ui(combined->ineq[k][0], combined->ineq[k][0], 1);
-		is_empty = isl_basic_set_is_empty(combined);
-		if (is_empty < 0)
-			goto error;
-		isl_basic_set_free(combined);
-		combined = NULL;
-		if (!is_empty)
-			tab->con[i].is_redundant = 0;
-	}
-	for (i = 0; i < context_ineq; ++i)
-		tab->con[i].is_redundant = 1;
-	bset = isl_basic_set_update_from_tab(bset, tab);
-	if (bset) {
-		ISL_F_SET(bset, ISL_BASIC_SET_NO_IMPLICIT);
-		ISL_F_SET(bset, ISL_BASIC_SET_NO_REDUNDANT);
-	}
-
-	isl_tab_free(tab);
-done:
-	bset = isl_basic_set_simplify(bset);
-	bset = isl_basic_set_finalize(bset);
-	isl_basic_set_free(context);
-	return bset;
-error:
-	isl_tab_free(tab);
-	isl_basic_set_free(combined);
-	isl_basic_set_free(context);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Remove all information from bset that is redundant in the context
- * of context.  In particular, equalities that are linear combinations
- * of those in context are removed.  Then the inequalities that are
- * redundant in the context of the equalities and inequalities of
- * context are removed.
- *
- * We first compute the integer affine hull of the intersection,
- * compute the gist inside this affine hull and then add back
- * those equalities that are not implied by the context.
- *
- * If two constraints are mutually redundant, then uset_gist_full
- * will remove the second of those constraints.  We therefore first
- * sort the constraints so that constraints not involving existentially
- * quantified variables are given precedence over those that do.
- * We have to perform this sorting before the variable compression,
- * because that may effect the order of the variables.
- */
-static __isl_give isl_basic_set *uset_gist(__isl_take isl_basic_set *bset,
-	__isl_take isl_basic_set *context)
-{
-	isl_mat *eq;
-	isl_mat *T, *T2;
-	isl_basic_set *aff;
-	isl_basic_set *aff_context;
-	unsigned total;
-
-	if (!bset || !context)
-		goto error;
-
-	bset = isl_basic_set_intersect(bset, isl_basic_set_copy(context));
-	if (isl_basic_set_plain_is_empty(bset)) {
-		isl_basic_set_free(context);
-		return bset;
-	}
-	bset = isl_basic_set_sort_constraints(bset);
-	aff = isl_basic_set_affine_hull(isl_basic_set_copy(bset));
-	if (!aff)
-		goto error;
-	if (isl_basic_set_plain_is_empty(aff)) {
-		isl_basic_set_free(aff);
-		isl_basic_set_free(context);
-		return bset;
-	}
-	if (aff->n_eq == 0) {
-		isl_basic_set_free(aff);
-		return uset_gist_full(bset, context);
-	}
-	total = isl_basic_set_total_dim(bset);
-	eq = isl_mat_sub_alloc6(bset->ctx, aff->eq, 0, aff->n_eq, 0, 1 + total);
-	eq = isl_mat_cow(eq);
-	T = isl_mat_variable_compression(eq, &T2);
-	if (T && T->n_col == 0) {
-		isl_mat_free(T);
-		isl_mat_free(T2);
-		isl_basic_set_free(context);
-		isl_basic_set_free(aff);
-		return isl_basic_set_set_to_empty(bset);
-	}
-
-	aff_context = isl_basic_set_affine_hull(isl_basic_set_copy(context));
-
-	bset = isl_basic_set_preimage(bset, isl_mat_copy(T));
-	context = isl_basic_set_preimage(context, T);
-
-	bset = uset_gist_full(bset, context);
-	bset = isl_basic_set_preimage(bset, T2);
-	bset = isl_basic_set_intersect(bset, aff);
-	bset = isl_basic_set_reduce_using_equalities(bset, aff_context);
-
-	if (bset) {
-		ISL_F_SET(bset, ISL_BASIC_SET_NO_IMPLICIT);
-		ISL_F_SET(bset, ISL_BASIC_SET_NO_REDUNDANT);
-	}
-
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	isl_basic_set_free(context);
-	return NULL;
-}
-
-/* Normalize the divs in "bmap" in the context of the equalities in "context".
- * We simply add the equalities in context to bmap and then do a regular
- * div normalizations.  Better results can be obtained by normalizing
- * only the divs in bmap than do not also appear in context.
- * We need to be careful to reduce the divs using the equalities
- * so that later calls to isl_basic_map_overlying_set wouldn't introduce
- * spurious constraints.
- */
-static struct isl_basic_map *normalize_divs_in_context(
-	struct isl_basic_map *bmap, struct isl_basic_map *context)
-{
-	int i;
-	unsigned total_context;
-	int div_eq;
-
-	div_eq = n_pure_div_eq(bmap);
-	if (div_eq == 0)
-		return bmap;
-
-	if (context->n_div > 0)
-		bmap = isl_basic_map_align_divs(bmap, context);
-
-	total_context = isl_basic_map_total_dim(context);
-	bmap = isl_basic_map_extend_constraints(bmap, context->n_eq, 0);
-	for (i = 0; i < context->n_eq; ++i) {
-		int k;
-		k = isl_basic_map_alloc_equality(bmap);
-		isl_seq_cpy(bmap->eq[k], context->eq[i], 1 + total_context);
-		isl_seq_clr(bmap->eq[k] + 1 + total_context,
-				isl_basic_map_total_dim(bmap) - total_context);
-	}
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	bmap = normalize_divs(bmap, NULL);
-	bmap = isl_basic_map_gauss(bmap, NULL);
-	return bmap;
-}
-
-struct isl_basic_map *isl_basic_map_gist(struct isl_basic_map *bmap,
-	struct isl_basic_map *context)
-{
-	struct isl_basic_set *bset;
-
-	if (!bmap || !context)
-		goto error;
-
-	if (isl_basic_map_is_universe(bmap)) {
-		isl_basic_map_free(context);
-		return bmap;
-	}
-	if (isl_basic_map_plain_is_empty(context)) {
-		isl_basic_map_free(bmap);
-		return context;
-	}
-	if (isl_basic_map_plain_is_empty(bmap)) {
-		isl_basic_map_free(context);
-		return bmap;
-	}
-
-	bmap = isl_basic_map_remove_redundancies(bmap);
-	context = isl_basic_map_remove_redundancies(context);
-
-	if (context->n_eq)
-		bmap = normalize_divs_in_context(bmap, context);
-
-	context = isl_basic_map_align_divs(context, bmap);
-	bmap = isl_basic_map_align_divs(bmap, context);
-
-	bset = uset_gist(isl_basic_map_underlying_set(isl_basic_map_copy(bmap)),
-			 isl_basic_map_underlying_set(context));
-
-	return isl_basic_map_overlying_set(bset, bmap);
-error:
-	isl_basic_map_free(bmap);
-	isl_basic_map_free(context);
-	return NULL;
-}
-
-/*
- * Assumes context has no implicit divs.
- */
-__isl_give isl_map *isl_map_gist_basic_map(__isl_take isl_map *map,
-	__isl_take isl_basic_map *context)
-{
-	int i;
-
-	if (!map || !context)
-		goto error;;
-
-	if (isl_basic_map_plain_is_empty(context)) {
-		isl_map_free(map);
-		return isl_map_from_basic_map(context);
-	}
-
-	context = isl_basic_map_remove_redundancies(context);
-	map = isl_map_cow(map);
-	if (!map || !context)
-		goto error;;
-	isl_assert(map->ctx, isl_space_is_equal(map->dim, context->dim), goto error);
-	map = isl_map_compute_divs(map);
-	for (i = 0; i < map->n; ++i)
-		context = isl_basic_map_align_divs(context, map->p[i]);
-	for (i = map->n - 1; i >= 0; --i) {
-		map->p[i] = isl_basic_map_gist(map->p[i],
-						isl_basic_map_copy(context));
-		if (!map->p[i])
-			goto error;
-		if (isl_basic_map_plain_is_empty(map->p[i])) {
-			isl_basic_map_free(map->p[i]);
-			if (i != map->n - 1)
-				map->p[i] = map->p[map->n - 1];
-			map->n--;
-		}
-	}
-	isl_basic_map_free(context);
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-error:
-	isl_map_free(map);
-	isl_basic_map_free(context);
-	return NULL;
-}
-
-static __isl_give isl_map *map_gist(__isl_take isl_map *map,
-	__isl_take isl_map *context)
-{
-	context = isl_map_compute_divs(context);
-	return isl_map_gist_basic_map(map, isl_map_simple_hull(context));
-}
-
-__isl_give isl_map *isl_map_gist(__isl_take isl_map *map,
-	__isl_take isl_map *context)
-{
-	return isl_map_align_params_map_map_and(map, context, &map_gist);
-}
-
-struct isl_basic_set *isl_basic_set_gist(struct isl_basic_set *bset,
-						struct isl_basic_set *context)
-{
-	return (struct isl_basic_set *)isl_basic_map_gist(
-		(struct isl_basic_map *)bset, (struct isl_basic_map *)context);
-}
-
-__isl_give isl_set *isl_set_gist_basic_set(__isl_take isl_set *set,
-	__isl_take isl_basic_set *context)
-{
-	return (struct isl_set *)isl_map_gist_basic_map((struct isl_map *)set,
-					(struct isl_basic_map *)context);
-}
-
-__isl_give isl_set *isl_set_gist_params_basic_set(__isl_take isl_set *set,
-	__isl_take isl_basic_set *context)
-{
-	isl_space *space = isl_set_get_space(set);
-	isl_basic_set *dom_context = isl_basic_set_universe(space);
-	dom_context = isl_basic_set_intersect_params(dom_context, context);
-	return isl_set_gist_basic_set(set, dom_context);
-}
-
-__isl_give isl_set *isl_set_gist(__isl_take isl_set *set,
-	__isl_take isl_set *context)
-{
-	return (struct isl_set *)isl_map_gist((struct isl_map *)set,
-					(struct isl_map *)context);
-}
-
-__isl_give isl_map *isl_map_gist_domain(__isl_take isl_map *map,
-	__isl_take isl_set *context)
-{
-	isl_map *map_context = isl_map_universe(isl_map_get_space(map));
-	map_context = isl_map_intersect_domain(map_context, context);
-	return isl_map_gist(map, map_context);
-}
-
-__isl_give isl_map *isl_map_gist_range(__isl_take isl_map *map,
-	__isl_take isl_set *context)
-{
-	isl_map *map_context = isl_map_universe(isl_map_get_space(map));
-	map_context = isl_map_intersect_range(map_context, context);
-	return isl_map_gist(map, map_context);
-}
-
-__isl_give isl_map *isl_map_gist_params(__isl_take isl_map *map,
-	__isl_take isl_set *context)
-{
-	isl_map *map_context = isl_map_universe(isl_map_get_space(map));
-	map_context = isl_map_intersect_params(map_context, context);
-	return isl_map_gist(map, map_context);
-}
-
-__isl_give isl_set *isl_set_gist_params(__isl_take isl_set *set,
-	__isl_take isl_set *context)
-{
-	return isl_map_gist_params(set, context);
-}
-
-/* Quick check to see if two basic maps are disjoint.
- * In particular, we reduce the equalities and inequalities of
- * one basic map in the context of the equalities of the other
- * basic map and check if we get a contradiction.
- */
-int isl_basic_map_plain_is_disjoint(__isl_keep isl_basic_map *bmap1,
-	__isl_keep isl_basic_map *bmap2)
-{
-	struct isl_vec *v = NULL;
-	int *elim = NULL;
-	unsigned total;
-	int i;
-
-	if (!bmap1 || !bmap2)
-		return -1;
-	isl_assert(bmap1->ctx, isl_space_is_equal(bmap1->dim, bmap2->dim),
-			return -1);
-	if (bmap1->n_div || bmap2->n_div)
-		return 0;
-	if (!bmap1->n_eq && !bmap2->n_eq)
-		return 0;
-
-	total = isl_space_dim(bmap1->dim, isl_dim_all);
-	if (total == 0)
-		return 0;
-	v = isl_vec_alloc(bmap1->ctx, 1 + total);
-	if (!v)
-		goto error;
-	elim = isl_alloc_array(bmap1->ctx, int, total);
-	if (!elim)
-		goto error;
-	compute_elimination_index(bmap1, elim);
-	for (i = 0; i < bmap2->n_eq; ++i) {
-		int reduced;
-		reduced = reduced_using_equalities(v->block.data, bmap2->eq[i],
-							bmap1, elim);
-		if (reduced && !isl_int_is_zero(v->block.data[0]) &&
-		    isl_seq_first_non_zero(v->block.data + 1, total) == -1)
-			goto disjoint;
-	}
-	for (i = 0; i < bmap2->n_ineq; ++i) {
-		int reduced;
-		reduced = reduced_using_equalities(v->block.data,
-						bmap2->ineq[i], bmap1, elim);
-		if (reduced && isl_int_is_neg(v->block.data[0]) &&
-		    isl_seq_first_non_zero(v->block.data + 1, total) == -1)
-			goto disjoint;
-	}
-	compute_elimination_index(bmap2, elim);
-	for (i = 0; i < bmap1->n_ineq; ++i) {
-		int reduced;
-		reduced = reduced_using_equalities(v->block.data,
-						bmap1->ineq[i], bmap2, elim);
-		if (reduced && isl_int_is_neg(v->block.data[0]) &&
-		    isl_seq_first_non_zero(v->block.data + 1, total) == -1)
-			goto disjoint;
-	}
-	isl_vec_free(v);
-	free(elim);
-	return 0;
-disjoint:
-	isl_vec_free(v);
-	free(elim);
-	return 1;
-error:
-	isl_vec_free(v);
-	free(elim);
-	return -1;
-}
-
-int isl_basic_set_plain_is_disjoint(__isl_keep isl_basic_set *bset1,
-	__isl_keep isl_basic_set *bset2)
-{
-	return isl_basic_map_plain_is_disjoint((struct isl_basic_map *)bset1,
-					      (struct isl_basic_map *)bset2);
-}
-
-int isl_map_plain_is_disjoint(__isl_keep isl_map *map1,
-	__isl_keep isl_map *map2)
-{
-	int i, j;
-
-	if (!map1 || !map2)
-		return -1;
-
-	if (isl_map_plain_is_equal(map1, map2))
-		return 0;
-
-	for (i = 0; i < map1->n; ++i) {
-		for (j = 0; j < map2->n; ++j) {
-			int d = isl_basic_map_plain_is_disjoint(map1->p[i],
-							       map2->p[j]);
-			if (d != 1)
-				return d;
-		}
-	}
-	return 1;
-}
-
-int isl_set_plain_is_disjoint(__isl_keep isl_set *set1,
-	__isl_keep isl_set *set2)
-{
-	return isl_map_plain_is_disjoint((struct isl_map *)set1,
-					(struct isl_map *)set2);
-}
-
-int isl_set_fast_is_disjoint(__isl_keep isl_set *set1, __isl_keep isl_set *set2)
-{
-	return isl_set_plain_is_disjoint(set1, set2);
-}
-
-/* Check if we can combine a given div with lower bound l and upper
- * bound u with some other div and if so return that other div.
- * Otherwise return -1.
- *
- * We first check that
- *	- the bounds are opposites of each other (except for the constant
- *	  term)
- *	- the bounds do not reference any other div
- *	- no div is defined in terms of this div
- *
- * Let m be the size of the range allowed on the div by the bounds.
- * That is, the bounds are of the form
- *
- *	e <= a <= e + m - 1
- *
- * with e some expression in the other variables.
- * We look for another div b such that no third div is defined in terms
- * of this second div b and such that in any constraint that contains
- * a (except for the given lower and upper bound), also contains b
- * with a coefficient that is m times that of b.
- * That is, all constraints (execpt for the lower and upper bound)
- * are of the form
- *
- *	e + f (a + m b) >= 0
- *
- * If so, we return b so that "a + m b" can be replaced by
- * a single div "c = a + m b".
- */
-static int div_find_coalesce(struct isl_basic_map *bmap, int *pairs,
-	unsigned div, unsigned l, unsigned u)
-{
-	int i, j;
-	unsigned dim;
-	int coalesce = -1;
-
-	if (bmap->n_div <= 1)
-		return -1;
-	dim = isl_space_dim(bmap->dim, isl_dim_all);
-	if (isl_seq_first_non_zero(bmap->ineq[l] + 1 + dim, div) != -1)
-		return -1;
-	if (isl_seq_first_non_zero(bmap->ineq[l] + 1 + dim + div + 1,
-				   bmap->n_div - div - 1) != -1)
-		return -1;
-	if (!isl_seq_is_neg(bmap->ineq[l] + 1, bmap->ineq[u] + 1,
-			    dim + bmap->n_div))
-		return -1;
-
-	for (i = 0; i < bmap->n_div; ++i) {
-		if (isl_int_is_zero(bmap->div[i][0]))
-			continue;
-		if (!isl_int_is_zero(bmap->div[i][1 + 1 + dim + div]))
-			return -1;
-	}
-
-	isl_int_add(bmap->ineq[l][0], bmap->ineq[l][0], bmap->ineq[u][0]);
-	if (isl_int_is_neg(bmap->ineq[l][0])) {
-		isl_int_sub(bmap->ineq[l][0],
-			    bmap->ineq[l][0], bmap->ineq[u][0]);
-		bmap = isl_basic_map_copy(bmap);
-		bmap = isl_basic_map_set_to_empty(bmap);
-		isl_basic_map_free(bmap);
-		return -1;
-	}
-	isl_int_add_ui(bmap->ineq[l][0], bmap->ineq[l][0], 1);
-	for (i = 0; i < bmap->n_div; ++i) {
-		if (i == div)
-			continue;
-		if (!pairs[i])
-			continue;
-		for (j = 0; j < bmap->n_div; ++j) {
-			if (isl_int_is_zero(bmap->div[j][0]))
-				continue;
-			if (!isl_int_is_zero(bmap->div[j][1 + 1 + dim + i]))
-				break;
-		}
-		if (j < bmap->n_div)
-			continue;
-		for (j = 0; j < bmap->n_ineq; ++j) {
-			int valid;
-			if (j == l || j == u)
-				continue;
-			if (isl_int_is_zero(bmap->ineq[j][1 + dim + div]))
-				continue;
-			if (isl_int_is_zero(bmap->ineq[j][1 + dim + i]))
-				break;
-			isl_int_mul(bmap->ineq[j][1 + dim + div],
-				    bmap->ineq[j][1 + dim + div],
-				    bmap->ineq[l][0]);
-			valid = isl_int_eq(bmap->ineq[j][1 + dim + div],
-					   bmap->ineq[j][1 + dim + i]);
-			isl_int_divexact(bmap->ineq[j][1 + dim + div],
-					 bmap->ineq[j][1 + dim + div],
-					 bmap->ineq[l][0]);
-			if (!valid)
-				break;
-		}
-		if (j < bmap->n_ineq)
-			continue;
-		coalesce = i;
-		break;
-	}
-	isl_int_sub_ui(bmap->ineq[l][0], bmap->ineq[l][0], 1);
-	isl_int_sub(bmap->ineq[l][0], bmap->ineq[l][0], bmap->ineq[u][0]);
-	return coalesce;
-}
-
-/* Given a lower and an upper bound on div i, construct an inequality
- * that when nonnegative ensures that this pair of bounds always allows
- * for an integer value of the given div.
- * The lower bound is inequality l, while the upper bound is inequality u.
- * The constructed inequality is stored in ineq.
- * g, fl, fu are temporary scalars.
- *
- * Let the upper bound be
- *
- *	-n_u a + e_u >= 0
- *
- * and the lower bound
- *
- *	n_l a + e_l >= 0
- *
- * Let n_u = f_u g and n_l = f_l g, with g = gcd(n_u, n_l).
- * We have
- *
- *	- f_u e_l <= f_u f_l g a <= f_l e_u
- *
- * Since all variables are integer valued, this is equivalent to
- *
- *	- f_u e_l - (f_u - 1) <= f_u f_l g a <= f_l e_u + (f_l - 1)
- *
- * If this interval is at least f_u f_l g, then it contains at least
- * one integer value for a.
- * That is, the test constraint is
- *
- *	f_l e_u + f_u e_l + f_l - 1 + f_u - 1 + 1 >= f_u f_l g
- */
-static void construct_test_ineq(struct isl_basic_map *bmap, int i,
-	int l, int u, isl_int *ineq, isl_int g, isl_int fl, isl_int fu)
-{
-	unsigned dim;
-	dim = isl_space_dim(bmap->dim, isl_dim_all);
-
-	isl_int_gcd(g, bmap->ineq[l][1 + dim + i], bmap->ineq[u][1 + dim + i]);
-	isl_int_divexact(fl, bmap->ineq[l][1 + dim + i], g);
-	isl_int_divexact(fu, bmap->ineq[u][1 + dim + i], g);
-	isl_int_neg(fu, fu);
-	isl_seq_combine(ineq, fl, bmap->ineq[u], fu, bmap->ineq[l],
-			1 + dim + bmap->n_div);
-	isl_int_add(ineq[0], ineq[0], fl);
-	isl_int_add(ineq[0], ineq[0], fu);
-	isl_int_sub_ui(ineq[0], ineq[0], 1);
-	isl_int_mul(g, g, fl);
-	isl_int_mul(g, g, fu);
-	isl_int_sub(ineq[0], ineq[0], g);
-}
-
-/* Remove more kinds of divs that are not strictly needed.
- * In particular, if all pairs of lower and upper bounds on a div
- * are such that they allow at least one integer value of the div,
- * the we can eliminate the div using Fourier-Motzkin without
- * introducing any spurious solutions.
- */
-static struct isl_basic_map *drop_more_redundant_divs(
-	struct isl_basic_map *bmap, int *pairs, int n)
-{
-	struct isl_tab *tab = NULL;
-	struct isl_vec *vec = NULL;
-	unsigned dim;
-	int remove = -1;
-	isl_int g, fl, fu;
-
-	isl_int_init(g);
-	isl_int_init(fl);
-	isl_int_init(fu);
-
-	if (!bmap)
-		goto error;
-
-	dim = isl_space_dim(bmap->dim, isl_dim_all);
-	vec = isl_vec_alloc(bmap->ctx, 1 + dim + bmap->n_div);
-	if (!vec)
-		goto error;
-
-	tab = isl_tab_from_basic_map(bmap);
-
-	while (n > 0) {
-		int i, l, u;
-		int best = -1;
-		enum isl_lp_result res;
-
-		for (i = 0; i < bmap->n_div; ++i) {
-			if (!pairs[i])
-				continue;
-			if (best >= 0 && pairs[best] <= pairs[i])
-				continue;
-			best = i;
-		}
-
-		i = best;
-		for (l = 0; l < bmap->n_ineq; ++l) {
-			if (!isl_int_is_pos(bmap->ineq[l][1 + dim + i]))
-				continue;
-			for (u = 0; u < bmap->n_ineq; ++u) {
-				if (!isl_int_is_neg(bmap->ineq[u][1 + dim + i]))
-					continue;
-				construct_test_ineq(bmap, i, l, u,
-						    vec->el, g, fl, fu);
-				res = isl_tab_min(tab, vec->el,
-						  bmap->ctx->one, &g, NULL, 0);
-				if (res == isl_lp_error)
-					goto error;
-				if (res == isl_lp_empty) {
-					bmap = isl_basic_map_set_to_empty(bmap);
-					break;
-				}
-				if (res != isl_lp_ok || isl_int_is_neg(g))
-					break;
-			}
-			if (u < bmap->n_ineq)
-				break;
-		}
-		if (l == bmap->n_ineq) {
-			remove = i;
-			break;
-		}
-		pairs[i] = 0;
-		--n;
-	}
-
-	isl_tab_free(tab);
-	isl_vec_free(vec);
-
-	isl_int_clear(g);
-	isl_int_clear(fl);
-	isl_int_clear(fu);
-
-	free(pairs);
-
-	if (remove < 0)
-		return bmap;
-
-	bmap = isl_basic_map_remove_dims(bmap, isl_dim_div, remove, 1);
-	return isl_basic_map_drop_redundant_divs(bmap);
-error:
-	free(pairs);
-	isl_basic_map_free(bmap);
-	isl_tab_free(tab);
-	isl_vec_free(vec);
-	isl_int_clear(g);
-	isl_int_clear(fl);
-	isl_int_clear(fu);
-	return NULL;
-}
-
-/* Given a pair of divs div1 and div2 such that, expect for the lower bound l
- * and the upper bound u, div1 always occurs together with div2 in the form 
- * (div1 + m div2), where m is the constant range on the variable div1
- * allowed by l and u, replace the pair div1 and div2 by a single
- * div that is equal to div1 + m div2.
- *
- * The new div will appear in the location that contains div2.
- * We need to modify all constraints that contain
- * div2 = (div - div1) / m
- * (If a constraint does not contain div2, it will also not contain div1.)
- * If the constraint also contains div1, then we know they appear
- * as f (div1 + m div2) and we can simply replace (div1 + m div2) by div,
- * i.e., the coefficient of div is f.
- *
- * Otherwise, we first need to introduce div1 into the constraint.
- * Let the l be
- *
- *	div1 + f >=0
- *
- * and u
- *
- *	-div1 + f' >= 0
- *
- * A lower bound on div2
- *
- *	n div2 + t >= 0
- *
- * can be replaced by
- *
- *	(n * (m div 2 + div1) + m t + n f)/g >= 0
- *
- * with g = gcd(m,n).
- * An upper bound
- *
- *	-n div2 + t >= 0
- *
- * can be replaced by
- *
- *	(-n * (m div2 + div1) + m t + n f')/g >= 0
- *
- * These constraint are those that we would obtain from eliminating
- * div1 using Fourier-Motzkin.
- *
- * After all constraints have been modified, we drop the lower and upper
- * bound and then drop div1.
- */
-static struct isl_basic_map *coalesce_divs(struct isl_basic_map *bmap,
-	unsigned div1, unsigned div2, unsigned l, unsigned u)
-{
-	isl_int a;
-	isl_int b;
-	isl_int m;
-	unsigned dim, total;
-	int i;
-
-	dim = isl_space_dim(bmap->dim, isl_dim_all);
-	total = 1 + dim + bmap->n_div;
-
-	isl_int_init(a);
-	isl_int_init(b);
-	isl_int_init(m);
-	isl_int_add(m, bmap->ineq[l][0], bmap->ineq[u][0]);
-	isl_int_add_ui(m, m, 1);
-
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		if (i == l || i == u)
-			continue;
-		if (isl_int_is_zero(bmap->ineq[i][1 + dim + div2]))
-			continue;
-		if (isl_int_is_zero(bmap->ineq[i][1 + dim + div1])) {
-			isl_int_gcd(b, m, bmap->ineq[i][1 + dim + div2]);
-			isl_int_divexact(a, m, b);
-			isl_int_divexact(b, bmap->ineq[i][1 + dim + div2], b);
-			if (isl_int_is_pos(b)) {
-				isl_seq_combine(bmap->ineq[i], a, bmap->ineq[i],
-						b, bmap->ineq[l], total);
-			} else {
-				isl_int_neg(b, b);
-				isl_seq_combine(bmap->ineq[i], a, bmap->ineq[i],
-						b, bmap->ineq[u], total);
-			}
-		}
-		isl_int_set(bmap->ineq[i][1 + dim + div2],
-			    bmap->ineq[i][1 + dim + div1]);
-		isl_int_set_si(bmap->ineq[i][1 + dim + div1], 0);
-	}
-
-	isl_int_clear(a);
-	isl_int_clear(b);
-	isl_int_clear(m);
-	if (l > u) {
-		isl_basic_map_drop_inequality(bmap, l);
-		isl_basic_map_drop_inequality(bmap, u);
-	} else {
-		isl_basic_map_drop_inequality(bmap, u);
-		isl_basic_map_drop_inequality(bmap, l);
-	}
-	bmap = isl_basic_map_drop_div(bmap, div1);
-	return bmap;
-}
-
-/* First check if we can coalesce any pair of divs and
- * then continue with dropping more redundant divs.
- *
- * We loop over all pairs of lower and upper bounds on a div
- * with coefficient 1 and -1, respectively, check if there
- * is any other div "c" with which we can coalesce the div
- * and if so, perform the coalescing.
- */
-static struct isl_basic_map *coalesce_or_drop_more_redundant_divs(
-	struct isl_basic_map *bmap, int *pairs, int n)
-{
-	int i, l, u;
-	unsigned dim;
-
-	dim = isl_space_dim(bmap->dim, isl_dim_all);
-
-	for (i = 0; i < bmap->n_div; ++i) {
-		if (!pairs[i])
-			continue;
-		for (l = 0; l < bmap->n_ineq; ++l) {
-			if (!isl_int_is_one(bmap->ineq[l][1 + dim + i]))
-				continue;
-			for (u = 0; u < bmap->n_ineq; ++u) {
-				int c;
-
-				if (!isl_int_is_negone(bmap->ineq[u][1+dim+i]))
-					continue;
-				c = div_find_coalesce(bmap, pairs, i, l, u);
-				if (c < 0)
-					continue;
-				free(pairs);
-				bmap = coalesce_divs(bmap, i, c, l, u);
-				return isl_basic_map_drop_redundant_divs(bmap);
-			}
-		}
-	}
-
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY))
-		return bmap;
-
-	return drop_more_redundant_divs(bmap, pairs, n);
-}
-
-/* Remove divs that are not strictly needed.
- * In particular, if a div only occurs positively (or negatively)
- * in constraints, then it can simply be dropped.
- * Also, if a div occurs only occurs in two constraints and if moreover
- * those two constraints are opposite to each other, except for the constant
- * term and if the sum of the constant terms is such that for any value
- * of the other values, there is always at least one integer value of the
- * div, i.e., if one plus this sum is greater than or equal to
- * the (absolute value) of the coefficent of the div in the constraints,
- * then we can also simply drop the div.
- *
- * If any divs are left after these simple checks then we move on
- * to more complicated cases in drop_more_redundant_divs.
- */
-struct isl_basic_map *isl_basic_map_drop_redundant_divs(
-	struct isl_basic_map *bmap)
-{
-	int i, j;
-	unsigned off;
-	int *pairs = NULL;
-	int n = 0;
-
-	if (!bmap)
-		goto error;
-
-	off = isl_space_dim(bmap->dim, isl_dim_all);
-	pairs = isl_calloc_array(bmap->ctx, int, bmap->n_div);
-	if (!pairs)
-		goto error;
-
-	for (i = 0; i < bmap->n_div; ++i) {
-		int pos, neg;
-		int last_pos, last_neg;
-		int redundant;
-		int defined;
-
-		defined = !isl_int_is_zero(bmap->div[i][0]);
-		for (j = 0; j < bmap->n_eq; ++j)
-			if (!isl_int_is_zero(bmap->eq[j][1 + off + i]))
-				break;
-		if (j < bmap->n_eq)
-			continue;
-		++n;
-		pos = neg = 0;
-		for (j = 0; j < bmap->n_ineq; ++j) {
-			if (isl_int_is_pos(bmap->ineq[j][1 + off + i])) {
-				last_pos = j;
-				++pos;
-			}
-			if (isl_int_is_neg(bmap->ineq[j][1 + off + i])) {
-				last_neg = j;
-				++neg;
-			}
-		}
-		pairs[i] = pos * neg;
-		if (pairs[i] == 0) {
-			for (j = bmap->n_ineq - 1; j >= 0; --j)
-				if (!isl_int_is_zero(bmap->ineq[j][1+off+i]))
-					isl_basic_map_drop_inequality(bmap, j);
-			bmap = isl_basic_map_drop_div(bmap, i);
-			free(pairs);
-			return isl_basic_map_drop_redundant_divs(bmap);
-		}
-		if (pairs[i] != 1)
-			continue;
-		if (!isl_seq_is_neg(bmap->ineq[last_pos] + 1,
-				    bmap->ineq[last_neg] + 1,
-				    off + bmap->n_div))
-			continue;
-
-		isl_int_add(bmap->ineq[last_pos][0],
-			    bmap->ineq[last_pos][0], bmap->ineq[last_neg][0]);
-		isl_int_add_ui(bmap->ineq[last_pos][0],
-			       bmap->ineq[last_pos][0], 1);
-		redundant = isl_int_ge(bmap->ineq[last_pos][0],
-				bmap->ineq[last_pos][1+off+i]);
-		isl_int_sub_ui(bmap->ineq[last_pos][0],
-			       bmap->ineq[last_pos][0], 1);
-		isl_int_sub(bmap->ineq[last_pos][0],
-			    bmap->ineq[last_pos][0], bmap->ineq[last_neg][0]);
-		if (!redundant) {
-			if (defined ||
-			    !ok_to_set_div_from_bound(bmap, i, last_pos)) {
-				pairs[i] = 0;
-				--n;
-				continue;
-			}
-			bmap = set_div_from_lower_bound(bmap, i, last_pos);
-			bmap = isl_basic_map_simplify(bmap);
-			free(pairs);
-			return isl_basic_map_drop_redundant_divs(bmap);
-		}
-		if (last_pos > last_neg) {
-			isl_basic_map_drop_inequality(bmap, last_pos);
-			isl_basic_map_drop_inequality(bmap, last_neg);
-		} else {
-			isl_basic_map_drop_inequality(bmap, last_neg);
-			isl_basic_map_drop_inequality(bmap, last_pos);
-		}
-		bmap = isl_basic_map_drop_div(bmap, i);
-		free(pairs);
-		return isl_basic_map_drop_redundant_divs(bmap);
-	}
-
-	if (n > 0)
-		return coalesce_or_drop_more_redundant_divs(bmap, pairs, n);
-
-	free(pairs);
-	return bmap;
-error:
-	free(pairs);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_basic_set *isl_basic_set_drop_redundant_divs(
-	struct isl_basic_set *bset)
-{
-	return (struct isl_basic_set *)
-	    isl_basic_map_drop_redundant_divs((struct isl_basic_map *)bset);
-}
-
-struct isl_map *isl_map_drop_redundant_divs(struct isl_map *map)
-{
-	int i;
-
-	if (!map)
-		return NULL;
-	for (i = 0; i < map->n; ++i) {
-		map->p[i] = isl_basic_map_drop_redundant_divs(map->p[i]);
-		if (!map->p[i])
-			goto error;
-	}
-	ISL_F_CLR(map, ISL_MAP_NORMALIZED);
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-struct isl_set *isl_set_drop_redundant_divs(struct isl_set *set)
-{
-	return (struct isl_set *)
-	    isl_map_drop_redundant_divs((struct isl_map *)set);
-}
diff --git a/cloog-0.17.0/isl/isl_map_subtract.c b/cloog-0.17.0/isl/isl_map_subtract.c
deleted file mode 100644
index 1fd4086..0000000
--- a/cloog-0.17.0/isl/isl_map_subtract.c
+++ /dev/null
@@ -1,858 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_map_private.h>
-#include <isl/seq.h>
-#include <isl/set.h>
-#include <isl/map.h>
-#include "isl_tab.h"
-#include <isl_point_private.h>
-
-static void expand_constraint(isl_vec *v, unsigned dim,
-	isl_int *c, int *div_map, unsigned n_div)
-{
-	int i;
-
-	isl_seq_cpy(v->el, c, 1 + dim);
-	isl_seq_clr(v->el + 1 + dim, v->size - (1 + dim));
-
-	for (i = 0; i < n_div; ++i)
-		isl_int_set(v->el[1 + dim + div_map[i]], c[1 + dim + i]);
-}
-
-/* Add all constraints of bmap to tab.  The equalities of bmap
- * are added as a pair of inequalities.
- */
-static int tab_add_constraints(struct isl_tab *tab,
-	__isl_keep isl_basic_map *bmap, int *div_map)
-{
-	int i;
-	unsigned dim;
-	unsigned tab_total;
-	unsigned bmap_total;
-	isl_vec *v;
-
-	if (!tab || !bmap)
-		return -1;
-
-	tab_total = isl_basic_map_total_dim(tab->bmap);
-	bmap_total = isl_basic_map_total_dim(bmap);
-	dim = isl_space_dim(tab->bmap->dim, isl_dim_all);
-
-	if (isl_tab_extend_cons(tab, 2 * bmap->n_eq + bmap->n_ineq) < 0)
-		return -1;
-
-	v = isl_vec_alloc(bmap->ctx, 1 + tab_total);
-	if (!v)
-		return -1;
-
-	for (i = 0; i < bmap->n_eq; ++i) {
-		expand_constraint(v, dim, bmap->eq[i], div_map, bmap->n_div);
-		if (isl_tab_add_ineq(tab, v->el) < 0)
-			goto error;
-		isl_seq_neg(bmap->eq[i], bmap->eq[i], 1 + bmap_total);
-		expand_constraint(v, dim, bmap->eq[i], div_map, bmap->n_div);
-		if (isl_tab_add_ineq(tab, v->el) < 0)
-			goto error;
-		isl_seq_neg(bmap->eq[i], bmap->eq[i], 1 + bmap_total);
-		if (tab->empty)
-			break;
-	}
-
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		expand_constraint(v, dim, bmap->ineq[i], div_map, bmap->n_div);
-		if (isl_tab_add_ineq(tab, v->el) < 0)
-			goto error;
-		if (tab->empty)
-			break;
-	}
-
-	isl_vec_free(v);
-	return 0;
-error:
-	isl_vec_free(v);
-	return -1;
-}
-
-/* Add a specific constraint of bmap (or its opposite) to tab.
- * The position of the constraint is specified by "c", where
- * the equalities of bmap are counted twice, once for the inequality
- * that is equal to the equality, and once for its negation.
- */
-static int tab_add_constraint(struct isl_tab *tab,
-	__isl_keep isl_basic_map *bmap, int *div_map, int c, int oppose)
-{
-	unsigned dim;
-	unsigned tab_total;
-	unsigned bmap_total;
-	isl_vec *v;
-	int r;
-
-	if (!tab || !bmap)
-		return -1;
-
-	tab_total = isl_basic_map_total_dim(tab->bmap);
-	bmap_total = isl_basic_map_total_dim(bmap);
-	dim = isl_space_dim(tab->bmap->dim, isl_dim_all);
-
-	v = isl_vec_alloc(bmap->ctx, 1 + tab_total);
-	if (!v)
-		return -1;
-
-	if (c < 2 * bmap->n_eq) {
-		if ((c % 2) != oppose)
-			isl_seq_neg(bmap->eq[c/2], bmap->eq[c/2],
-					1 + bmap_total);
-		if (oppose)
-			isl_int_sub_ui(bmap->eq[c/2][0], bmap->eq[c/2][0], 1);
-		expand_constraint(v, dim, bmap->eq[c/2], div_map, bmap->n_div);
-		r = isl_tab_add_ineq(tab, v->el);
-		if (oppose)
-			isl_int_add_ui(bmap->eq[c/2][0], bmap->eq[c/2][0], 1);
-		if ((c % 2) != oppose)
-			isl_seq_neg(bmap->eq[c/2], bmap->eq[c/2],
-					1 + bmap_total);
-	} else {
-		c -= 2 * bmap->n_eq;
-		if (oppose) {
-			isl_seq_neg(bmap->ineq[c], bmap->ineq[c],
-					1 + bmap_total);
-			isl_int_sub_ui(bmap->ineq[c][0], bmap->ineq[c][0], 1);
-		}
-		expand_constraint(v, dim, bmap->ineq[c], div_map, bmap->n_div);
-		r = isl_tab_add_ineq(tab, v->el);
-		if (oppose) {
-			isl_int_add_ui(bmap->ineq[c][0], bmap->ineq[c][0], 1);
-			isl_seq_neg(bmap->ineq[c], bmap->ineq[c],
-					1 + bmap_total);
-		}
-	}
-
-	isl_vec_free(v);
-	return r;
-}
-
-static int tab_add_divs(struct isl_tab *tab, __isl_keep isl_basic_map *bmap,
-	int **div_map)
-{
-	int i, j;
-	struct isl_vec *vec;
-	unsigned total;
-	unsigned dim;
-
-	if (!bmap)
-		return -1;
-	if (!bmap->n_div)
-		return 0;
-
-	if (!*div_map)
-		*div_map = isl_alloc_array(bmap->ctx, int, bmap->n_div);
-	if (!*div_map)
-		return -1;
-
-	total = isl_basic_map_total_dim(tab->bmap);
-	dim = total - tab->bmap->n_div;
-	vec = isl_vec_alloc(bmap->ctx, 2 + total + bmap->n_div);
-	if (!vec)
-		return -1;
-
-	for (i = 0; i < bmap->n_div; ++i) {
-		isl_seq_cpy(vec->el, bmap->div[i], 2 + dim);
-		isl_seq_clr(vec->el + 2 + dim, tab->bmap->n_div);
-		for (j = 0; j < i; ++j)
-			isl_int_set(vec->el[2 + dim + (*div_map)[j]],
-					bmap->div[i][2 + dim + j]);
-		for (j = 0; j < tab->bmap->n_div; ++j)
-			if (isl_seq_eq(tab->bmap->div[j],
-					vec->el, 2 + dim + tab->bmap->n_div))
-				break;
-		(*div_map)[i] = j;
-		if (j == tab->bmap->n_div) {
-			vec->size = 2 + dim + tab->bmap->n_div;
-			if (isl_tab_add_div(tab, vec, NULL, NULL) < 0)
-				goto error;
-		}
-	}
-
-	isl_vec_free(vec);
-
-	return 0;
-error:
-	isl_vec_free(vec);
-
-	return -1;
-}
-
-/* Freeze all constraints of tableau tab.
- */
-static int tab_freeze_constraints(struct isl_tab *tab)
-{
-	int i;
-
-	for (i = 0; i < tab->n_con; ++i)
-		if (isl_tab_freeze_constraint(tab, i) < 0)
-			return -1;
-
-	return 0;
-}
-
-/* Check for redundant constraints starting at offset.
- * Put the indices of the redundant constraints in index
- * and return the number of redundant constraints.
- */
-static int n_non_redundant(isl_ctx *ctx, struct isl_tab *tab,
-	int offset, int **index)
-{
-	int i, n;
-	int n_test = tab->n_con - offset;
-
-	if (isl_tab_detect_redundant(tab) < 0)
-		return -1;
-
-	if (!*index)
-		*index = isl_alloc_array(ctx, int, n_test);
-	if (!*index)
-		return -1;
-
-	for (n = 0, i = 0; i < n_test; ++i) {
-		int r;
-		r = isl_tab_is_redundant(tab, offset + i);
-		if (r < 0)
-			return -1;
-		if (r)
-			continue;
-		(*index)[n++] = i;
-	}
-
-	return n;
-}
-
-/* basic_map_collect_diff calls add on each of the pieces of
- * the set difference between bmap and map until the add method
- * return a negative value.
- */
-struct isl_diff_collector {
-	int (*add)(struct isl_diff_collector *dc,
-		    __isl_take isl_basic_map *bmap);
-};
-
-/* Compute the set difference between bmap and map and call
- * dc->add on each of the piece until this function returns
- * a negative value.
- * Return 0 on success and -1 on error.  dc->add returning
- * a negative value is treated as an error, but the calling
- * function can interpret the results based on the state of dc.
- *
- * Assumes that map has known divs.
- *
- * The difference is computed by a backtracking algorithm.
- * Each level corresponds to a basic map in "map".
- * When a node in entered for the first time, we check
- * if the corresonding basic map intersects the current piece
- * of "bmap".  If not, we move to the next level.
- * Otherwise, we split the current piece into as many
- * pieces as there are non-redundant constraints of the current
- * basic map in the intersection.  Each of these pieces is
- * handled by a child of the current node.
- * In particular, if there are n non-redundant constraints,
- * then for each 0 <= i < n, a piece is cut off by adding
- * constraints 0 <= j < i and adding the opposite of constraint i.
- * If there are no non-redundant constraints, meaning that the current
- * piece is a subset of the current basic map, then we simply backtrack.
- *
- * In the leaves, we check if the remaining piece has any integer points
- * and if so, pass it along to dc->add.  As a special case, if nothing
- * has been removed when we end up in a leaf, we simply pass along
- * the original basic map.
- */
-static int basic_map_collect_diff(__isl_take isl_basic_map *bmap,
-	__isl_take isl_map *map, struct isl_diff_collector *dc)
-{
-	int i;
-	int modified;
-	int level;
-	int init;
-	int empty;
-	isl_ctx *ctx;
-	struct isl_tab *tab = NULL;
-	struct isl_tab_undo **snap = NULL;
-	int *k = NULL;
-	int *n = NULL;
-	int **index = NULL;
-	int **div_map = NULL;
-
-	empty = isl_basic_map_is_empty(bmap);
-	if (empty) {
-		isl_basic_map_free(bmap);
-		isl_map_free(map);
-		return empty < 0 ? -1 : 0;
-	}
-
-	bmap = isl_basic_map_cow(bmap);
-	map = isl_map_cow(map);
-
-	if (!bmap || !map)
-		goto error;
-
-	ctx = map->ctx;
-	snap = isl_alloc_array(map->ctx, struct isl_tab_undo *, map->n);
-	k = isl_alloc_array(map->ctx, int, map->n);
-	n = isl_alloc_array(map->ctx, int, map->n);
-	index = isl_calloc_array(map->ctx, int *, map->n);
-	div_map = isl_calloc_array(map->ctx, int *, map->n);
-	if (!snap || !k || !n || !index || !div_map)
-		goto error;
-
-	bmap = isl_basic_map_order_divs(bmap);
-	map = isl_map_order_divs(map);
-
-	tab = isl_tab_from_basic_map(bmap);
-	if (isl_tab_track_bmap(tab, isl_basic_map_copy(bmap)) < 0)
-		goto error;
-
-	modified = 0;
-	level = 0;
-	init = 1;
-
-	while (level >= 0) {
-		if (level >= map->n) {
-			int empty;
-			struct isl_basic_map *bm;
-			if (!modified) {
-				if (dc->add(dc, isl_basic_map_copy(bmap)) < 0)
-					goto error;
-				break;
-			}
-			bm = isl_basic_map_copy(tab->bmap);
-			bm = isl_basic_map_cow(bm);
-			bm = isl_basic_map_update_from_tab(bm, tab);
-			bm = isl_basic_map_simplify(bm);
-			bm = isl_basic_map_finalize(bm);
-			empty = isl_basic_map_is_empty(bm);
-			if (empty)
-				isl_basic_map_free(bm);
-			else if (dc->add(dc, bm) < 0)
-				goto error;
-			if (empty < 0)
-				goto error;
-			level--;
-			init = 0;
-			continue;
-		}
-		if (init) {
-			int offset;
-			struct isl_tab_undo *snap2;
-			snap2 = isl_tab_snap(tab);
-			if (tab_add_divs(tab, map->p[level],
-					 &div_map[level]) < 0)
-				goto error;
-			offset = tab->n_con;
-			snap[level] = isl_tab_snap(tab);
-			if (tab_freeze_constraints(tab) < 0)
-				goto error;
-			if (tab_add_constraints(tab, map->p[level],
-						div_map[level]) < 0)
-				goto error;
-			k[level] = 0;
-			n[level] = 0;
-			if (tab->empty) {
-				if (isl_tab_rollback(tab, snap2) < 0)
-					goto error;
-				level++;
-				continue;
-			}
-			modified = 1;
-			n[level] = n_non_redundant(ctx, tab, offset,
-						    &index[level]);
-			if (n[level] < 0)
-				goto error;
-			if (n[level] == 0) {
-				level--;
-				init = 0;
-				continue;
-			}
-			if (isl_tab_rollback(tab, snap[level]) < 0)
-				goto error;
-			if (tab_add_constraint(tab, map->p[level],
-					div_map[level], index[level][0], 1) < 0)
-				goto error;
-			level++;
-			continue;
-		} else {
-			if (k[level] + 1 >= n[level]) {
-				level--;
-				continue;
-			}
-			if (isl_tab_rollback(tab, snap[level]) < 0)
-				goto error;
-			if (tab_add_constraint(tab, map->p[level],
-						div_map[level],
-						index[level][k[level]], 0) < 0)
-				goto error;
-			snap[level] = isl_tab_snap(tab);
-			k[level]++;
-			if (tab_add_constraint(tab, map->p[level],
-						div_map[level],
-						index[level][k[level]], 1) < 0)
-				goto error;
-			level++;
-			init = 1;
-			continue;
-		}
-	}
-
-	isl_tab_free(tab);
-	free(snap);
-	free(n);
-	free(k);
-	for (i = 0; index && i < map->n; ++i)
-		free(index[i]);
-	free(index);
-	for (i = 0; div_map && i < map->n; ++i)
-		free(div_map[i]);
-	free(div_map);
-
-	isl_basic_map_free(bmap);
-	isl_map_free(map);
-
-	return 0;
-error:
-	isl_tab_free(tab);
-	free(snap);
-	free(n);
-	free(k);
-	for (i = 0; index && i < map->n; ++i)
-		free(index[i]);
-	free(index);
-	for (i = 0; div_map && i < map->n; ++i)
-		free(div_map[i]);
-	free(div_map);
-	isl_basic_map_free(bmap);
-	isl_map_free(map);
-	return -1;
-}
-
-/* A diff collector that actually collects all parts of the
- * set difference in the field diff.
- */
-struct isl_subtract_diff_collector {
-	struct isl_diff_collector dc;
-	struct isl_map *diff;
-};
-
-/* isl_subtract_diff_collector callback.
- */
-static int basic_map_subtract_add(struct isl_diff_collector *dc,
-			    __isl_take isl_basic_map *bmap)
-{
-	struct isl_subtract_diff_collector *sdc;
-	sdc = (struct isl_subtract_diff_collector *)dc;
-
-	sdc->diff = isl_map_union_disjoint(sdc->diff,
-			isl_map_from_basic_map(bmap));
-
-	return sdc->diff ? 0 : -1;
-}
-
-/* Return the set difference between bmap and map.
- */
-static __isl_give isl_map *basic_map_subtract(__isl_take isl_basic_map *bmap,
-	__isl_take isl_map *map)
-{
-	struct isl_subtract_diff_collector sdc;
-	sdc.dc.add = &basic_map_subtract_add;
-	sdc.diff = isl_map_empty_like_basic_map(bmap);
-	if (basic_map_collect_diff(bmap, map, &sdc.dc) < 0) {
-		isl_map_free(sdc.diff);
-		sdc.diff = NULL;
-	}
-	return sdc.diff;
-}
-
-/* Return the set difference between map1 and map2.
- * (U_i A_i) \ (U_j B_j) is computed as U_i (A_i \ (U_j B_j))
- */
-static __isl_give isl_map *map_subtract( __isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	int i;
-	struct isl_map *diff;
-
-	if (!map1 || !map2)
-		goto error;
-
-	isl_assert(map1->ctx, isl_space_is_equal(map1->dim, map2->dim), goto error);
-
-	if (isl_map_is_empty(map2)) {
-		isl_map_free(map2);
-		return map1;
-	}
-
-	map1 = isl_map_compute_divs(map1);
-	map2 = isl_map_compute_divs(map2);
-	if (!map1 || !map2)
-		goto error;
-
-	map1 = isl_map_remove_empty_parts(map1);
-	map2 = isl_map_remove_empty_parts(map2);
-
-	diff = isl_map_empty_like(map1);
-	for (i = 0; i < map1->n; ++i) {
-		struct isl_map *d;
-		d = basic_map_subtract(isl_basic_map_copy(map1->p[i]),
-				       isl_map_copy(map2));
-		if (ISL_F_ISSET(map1, ISL_MAP_DISJOINT))
-			diff = isl_map_union_disjoint(diff, d);
-		else
-			diff = isl_map_union(diff, d);
-	}
-
-	isl_map_free(map1);
-	isl_map_free(map2);
-
-	return diff;
-error:
-	isl_map_free(map1);
-	isl_map_free(map2);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_subtract( __isl_take isl_map *map1,
-	__isl_take isl_map *map2)
-{
-	return isl_map_align_params_map_map_and(map1, map2, &map_subtract);
-}
-
-struct isl_set *isl_set_subtract(struct isl_set *set1, struct isl_set *set2)
-{
-	return (struct isl_set *)
-		isl_map_subtract(
-			(struct isl_map *)set1, (struct isl_map *)set2);
-}
-
-/* Remove the elements of "dom" from the domain of "map".
- */
-static __isl_give isl_map *map_subtract_domain(__isl_take isl_map *map,
-	__isl_take isl_set *dom)
-{
-	isl_map *ext_dom;
-
-	if (!isl_map_compatible_domain(map, dom))
-		isl_die(isl_set_get_ctx(dom), isl_error_invalid,
-			"incompatible spaces", goto error);
-	
-	ext_dom = isl_map_universe(isl_map_get_space(map));
-	ext_dom = isl_map_intersect_domain(ext_dom, dom);
-	return isl_map_subtract(map, ext_dom);
-error:
-	isl_map_free(map);
-	isl_set_free(dom);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_subtract_domain(__isl_take isl_map *map,
-	__isl_take isl_set *dom)
-{
-	return isl_map_align_params_map_map_and(map, dom, &map_subtract_domain);
-}
-
-/* Remove the elements of "dom" from the range of "map".
- */
-static __isl_give isl_map *map_subtract_range(__isl_take isl_map *map,
-	__isl_take isl_set *dom)
-{
-	isl_map *ext_dom;
-
-	if (!isl_map_compatible_range(map, dom))
-		isl_die(isl_set_get_ctx(dom), isl_error_invalid,
-			"incompatible spaces", goto error);
-	
-	ext_dom = isl_map_universe(isl_map_get_space(map));
-	ext_dom = isl_map_intersect_range(ext_dom, dom);
-	return isl_map_subtract(map, ext_dom);
-error:
-	isl_map_free(map);
-	isl_set_free(dom);
-	return NULL;
-}
-
-__isl_give isl_map *isl_map_subtract_range(__isl_take isl_map *map,
-	__isl_take isl_set *dom)
-{
-	return isl_map_align_params_map_map_and(map, dom, &map_subtract_range);
-}
-
-/* A diff collector that aborts as soon as its add function is called,
- * setting empty to 0.
- */
-struct isl_is_empty_diff_collector {
-	struct isl_diff_collector dc;
-	int empty;
-};
-
-/* isl_is_empty_diff_collector callback.
- */
-static int basic_map_is_empty_add(struct isl_diff_collector *dc,
-			    __isl_take isl_basic_map *bmap)
-{
-	struct isl_is_empty_diff_collector *edc;
-	edc = (struct isl_is_empty_diff_collector *)dc;
-
-	edc->empty = 0;
-
-	isl_basic_map_free(bmap);
-	return -1;
-}
-
-/* Check if bmap \ map is empty by computing this set difference
- * and breaking off as soon as the difference is known to be non-empty.
- */
-static int basic_map_diff_is_empty(__isl_keep isl_basic_map *bmap,
-	__isl_keep isl_map *map)
-{
-	int r;
-	struct isl_is_empty_diff_collector edc;
-
-	r = isl_basic_map_plain_is_empty(bmap);
-	if (r)
-		return r;
-
-	edc.dc.add = &basic_map_is_empty_add;
-	edc.empty = 1;
-	r = basic_map_collect_diff(isl_basic_map_copy(bmap),
-				   isl_map_copy(map), &edc.dc);
-	if (!edc.empty)
-		return 0;
-
-	return r < 0 ? -1 : 1;
-}
-
-/* Check if map1 \ map2 is empty by checking if the set difference is empty
- * for each of the basic maps in map1.
- */
-static int map_diff_is_empty(__isl_keep isl_map *map1, __isl_keep isl_map *map2)
-{
-	int i;
-	int is_empty = 1;
-
-	if (!map1 || !map2)
-		return -1;
-	
-	for (i = 0; i < map1->n; ++i) {
-		is_empty = basic_map_diff_is_empty(map1->p[i], map2);
-		if (is_empty < 0 || !is_empty)
-			 break;
-	}
-
-	return is_empty;
-}
-
-/* Return 1 if "bmap" contains a single element.
- */
-int isl_basic_map_plain_is_singleton(__isl_keep isl_basic_map *bmap)
-{
-	if (!bmap)
-		return -1;
-	if (bmap->n_div)
-		return 0;
-	if (bmap->n_ineq)
-		return 0;
-	return bmap->n_eq == isl_basic_map_total_dim(bmap);
-}
-
-/* Return 1 if "map" contains a single element.
- */
-int isl_map_plain_is_singleton(__isl_keep isl_map *map)
-{
-	if (!map)
-		return -1;
-	if (map->n != 1)
-		return 0;
-
-	return isl_basic_map_plain_is_singleton(map->p[0]);
-}
-
-/* Given a singleton basic map, extract the single element
- * as an isl_point.
- */
-static __isl_give isl_point *singleton_extract_point(
-	__isl_keep isl_basic_map *bmap)
-{
-	int j;
-	unsigned dim;
-	struct isl_vec *point;
-	isl_int m;
-
-	if (!bmap)
-		return NULL;
-
-	dim = isl_basic_map_total_dim(bmap);
-	isl_assert(bmap->ctx, bmap->n_eq == dim, return NULL);
-	point = isl_vec_alloc(bmap->ctx, 1 + dim);
-	if (!point)
-		return NULL;
-
-	isl_int_init(m);
-
-	isl_int_set_si(point->el[0], 1);
-	for (j = 0; j < bmap->n_eq; ++j) {
-		int i = dim - 1 - j;
-		isl_assert(bmap->ctx,
-		    isl_seq_first_non_zero(bmap->eq[j] + 1, i) == -1,
-		    goto error);
-		isl_assert(bmap->ctx,
-		    isl_int_is_one(bmap->eq[j][1 + i]) ||
-		    isl_int_is_negone(bmap->eq[j][1 + i]),
-		    goto error);
-		isl_assert(bmap->ctx,
-		    isl_seq_first_non_zero(bmap->eq[j]+1+i+1, dim-i-1) == -1,
-		    goto error);
-
-		isl_int_gcd(m, point->el[0], bmap->eq[j][1 + i]);
-		isl_int_divexact(m, bmap->eq[j][1 + i], m);
-		isl_int_abs(m, m);
-		isl_seq_scale(point->el, point->el, m, 1 + i);
-		isl_int_divexact(m, point->el[0], bmap->eq[j][1 + i]);
-		isl_int_neg(m, m);
-		isl_int_mul(point->el[1 + i], m, bmap->eq[j][0]);
-	}
-
-	isl_int_clear(m);
-	return isl_point_alloc(isl_basic_map_get_space(bmap), point);
-error:
-	isl_int_clear(m);
-	isl_vec_free(point);
-	return NULL;
-}
-
-/* Return 1 is the singleton map "map1" is a subset of "map2",
- * i.e., if the single element of "map1" is also an element of "map2".
- * Assumes "map2" has known divs.
- */
-static int map_is_singleton_subset(__isl_keep isl_map *map1,
-	__isl_keep isl_map *map2)
-{
-	int i;
-	int is_subset = 0;
-	struct isl_point *point;
-
-	if (!map1 || !map2)
-		return -1;
-	if (map1->n != 1)
-		return -1;
-
-	point = singleton_extract_point(map1->p[0]);
-	if (!point)
-		return -1;
-
-	for (i = 0; i < map2->n; ++i) {
-		is_subset = isl_basic_map_contains_point(map2->p[i], point);
-		if (is_subset)
-			break;
-	}
-
-	isl_point_free(point);
-	return is_subset;
-}
-
-static int map_is_subset(__isl_keep isl_map *map1, __isl_keep isl_map *map2)
-{
-	int is_subset = 0;
-
-	if (!map1 || !map2)
-		return -1;
-
-	if (!isl_map_has_equal_space(map1, map2))
-		return 0;
-
-	if (isl_map_is_empty(map1))
-		return 1;
-
-	if (isl_map_is_empty(map2))
-		return 0;
-
-	if (isl_map_plain_is_universe(map2))
-		return 1;
-
-	map2 = isl_map_compute_divs(isl_map_copy(map2));
-	if (isl_map_plain_is_singleton(map1)) {
-		is_subset = map_is_singleton_subset(map1, map2);
-		isl_map_free(map2);
-		return is_subset;
-	}
-	is_subset = map_diff_is_empty(map1, map2);
-	isl_map_free(map2);
-
-	return is_subset;
-}
-
-int isl_map_is_subset(__isl_keep isl_map *map1, __isl_keep isl_map *map2)
-{
-	return isl_map_align_params_map_map_and_test(map1, map2,
-							&map_is_subset);
-}
-
-int isl_set_is_subset(struct isl_set *set1, struct isl_set *set2)
-{
-	return isl_map_is_subset(
-			(struct isl_map *)set1, (struct isl_map *)set2);
-}
-
-__isl_give isl_map *isl_map_make_disjoint(__isl_take isl_map *map)
-{
-	int i;
-	struct isl_subtract_diff_collector sdc;
-	sdc.dc.add = &basic_map_subtract_add;
-
-	if (!map)
-		return NULL;
-	if (ISL_F_ISSET(map, ISL_MAP_DISJOINT))
-		return map;
-	if (map->n <= 1)
-		return map;
-
-	map = isl_map_compute_divs(map);
-	map = isl_map_remove_empty_parts(map);
-
-	if (!map || map->n <= 1)
-		return map;
-
-	sdc.diff = isl_map_from_basic_map(isl_basic_map_copy(map->p[0]));
-
-	for (i = 1; i < map->n; ++i) {
-		struct isl_basic_map *bmap = isl_basic_map_copy(map->p[i]);
-		struct isl_map *copy = isl_map_copy(sdc.diff);
-		if (basic_map_collect_diff(bmap, copy, &sdc.dc) < 0) {
-			isl_map_free(sdc.diff);
-			sdc.diff = NULL;
-			break;
-		}
-	}
-
-	isl_map_free(map);
-
-	return sdc.diff;
-}
-
-__isl_give isl_set *isl_set_make_disjoint(__isl_take isl_set *set)
-{
-	return (struct isl_set *)isl_map_make_disjoint((struct isl_map *)set);
-}
-
-__isl_give isl_set *isl_set_complement(__isl_take isl_set *set)
-{
-	isl_set *universe;
-
-	if (!set)
-		return NULL;
-
-	universe = isl_set_universe(isl_set_get_space(set));
-
-	return isl_set_subtract(universe, set);
-}
diff --git a/cloog-0.17.0/isl/isl_mat.c b/cloog-0.17.0/isl/isl_mat.c
deleted file mode 100644
index 9724900..0000000
--- a/cloog-0.17.0/isl/isl_mat.c
+++ /dev/null
@@ -1,1632 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl/space.h>
-#include <isl/seq.h>
-#include <isl_mat_private.h>
-#include "isl_map_private.h"
-#include <isl_space_private.h>
-
-isl_ctx *isl_mat_get_ctx(__isl_keep isl_mat *mat)
-{
-	return mat ? mat->ctx : NULL;
-}
-
-struct isl_mat *isl_mat_alloc(struct isl_ctx *ctx,
-	unsigned n_row, unsigned n_col)
-{
-	int i;
-	struct isl_mat *mat;
-
-	mat = isl_alloc_type(ctx, struct isl_mat);
-	if (!mat)
-		return NULL;
-
-	mat->row = NULL;
-	mat->block = isl_blk_alloc(ctx, n_row * n_col);
-	if (isl_blk_is_error(mat->block))
-		goto error;
-	mat->row = isl_alloc_array(ctx, isl_int *, n_row);
-	if (!mat->row)
-		goto error;
-
-	for (i = 0; i < n_row; ++i)
-		mat->row[i] = mat->block.data + i * n_col;
-
-	mat->ctx = ctx;
-	isl_ctx_ref(ctx);
-	mat->ref = 1;
-	mat->n_row = n_row;
-	mat->n_col = n_col;
-	mat->max_col = n_col;
-	mat->flags = 0;
-
-	return mat;
-error:
-	isl_blk_free(ctx, mat->block);
-	free(mat);
-	return NULL;
-}
-
-struct isl_mat *isl_mat_extend(struct isl_mat *mat,
-	unsigned n_row, unsigned n_col)
-{
-	int i;
-	isl_int *old;
-	isl_int **row;
-
-	if (!mat)
-		return NULL;
-
-	if (mat->max_col >= n_col && mat->n_row >= n_row) {
-		if (mat->n_col < n_col)
-			mat->n_col = n_col;
-		return mat;
-	}
-
-	if (mat->max_col < n_col) {
-		struct isl_mat *new_mat;
-
-		if (n_row < mat->n_row)
-			n_row = mat->n_row;
-		new_mat = isl_mat_alloc(mat->ctx, n_row, n_col);
-		if (!new_mat)
-			goto error;
-		for (i = 0; i < mat->n_row; ++i)
-			isl_seq_cpy(new_mat->row[i], mat->row[i], mat->n_col);
-		isl_mat_free(mat);
-		return new_mat;
-	}
-
-	mat = isl_mat_cow(mat);
-	if (!mat)
-		goto error;
-
-	old = mat->block.data;
-	mat->block = isl_blk_extend(mat->ctx, mat->block, n_row * mat->max_col);
-	if (isl_blk_is_error(mat->block))
-		goto error;
-	row = isl_realloc_array(mat->ctx, mat->row, isl_int *, n_row);
-	if (!row)
-		goto error;
-	mat->row = row;
-
-	for (i = 0; i < mat->n_row; ++i)
-		mat->row[i] = mat->block.data + (mat->row[i] - old);
-	for (i = mat->n_row; i < n_row; ++i)
-		mat->row[i] = mat->block.data + i * mat->max_col;
-	mat->n_row = n_row;
-	if (mat->n_col < n_col)
-		mat->n_col = n_col;
-
-	return mat;
-error:
-	isl_mat_free(mat);
-	return NULL;
-}
-
-__isl_give isl_mat *isl_mat_sub_alloc6(isl_ctx *ctx, isl_int **row,
-	unsigned first_row, unsigned n_row, unsigned first_col, unsigned n_col)
-{
-	int i;
-	struct isl_mat *mat;
-
-	mat = isl_alloc_type(ctx, struct isl_mat);
-	if (!mat)
-		return NULL;
-	mat->row = isl_alloc_array(ctx, isl_int *, n_row);
-	if (!mat->row)
-		goto error;
-	for (i = 0; i < n_row; ++i)
-		mat->row[i] = row[first_row+i] + first_col;
-	mat->ctx = ctx;
-	isl_ctx_ref(ctx);
-	mat->ref = 1;
-	mat->n_row = n_row;
-	mat->n_col = n_col;
-	mat->block = isl_blk_empty();
-	mat->flags = ISL_MAT_BORROWED;
-	return mat;
-error:
-	free(mat);
-	return NULL;
-}
-
-__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)
-{
-	if (!mat)
-		return NULL;
-	return isl_mat_sub_alloc6(mat->ctx, mat->row, first_row, n_row,
-				  first_col, n_col);
-}
-
-void isl_mat_sub_copy(struct isl_ctx *ctx, isl_int **dst, isl_int **src,
-	unsigned n_row, unsigned dst_col, unsigned src_col, unsigned n_col)
-{
-	int i;
-
-	for (i = 0; i < n_row; ++i)
-		isl_seq_cpy(dst[i]+dst_col, src[i]+src_col, n_col);
-}
-
-void isl_mat_sub_neg(struct isl_ctx *ctx, isl_int **dst, isl_int **src,
-	unsigned n_row, unsigned dst_col, unsigned src_col, unsigned n_col)
-{
-	int i;
-
-	for (i = 0; i < n_row; ++i)
-		isl_seq_neg(dst[i]+dst_col, src[i]+src_col, n_col);
-}
-
-struct isl_mat *isl_mat_copy(struct isl_mat *mat)
-{
-	if (!mat)
-		return NULL;
-
-	mat->ref++;
-	return mat;
-}
-
-struct isl_mat *isl_mat_dup(struct isl_mat *mat)
-{
-	int i;
-	struct isl_mat *mat2;
-
-	if (!mat)
-		return NULL;
-	mat2 = isl_mat_alloc(mat->ctx, mat->n_row, mat->n_col);
-	if (!mat2)
-		return NULL;
-	for (i = 0; i < mat->n_row; ++i)
-		isl_seq_cpy(mat2->row[i], mat->row[i], mat->n_col);
-	return mat2;
-}
-
-struct isl_mat *isl_mat_cow(struct isl_mat *mat)
-{
-	struct isl_mat *mat2;
-	if (!mat)
-		return NULL;
-
-	if (mat->ref == 1 && !ISL_F_ISSET(mat, ISL_MAT_BORROWED))
-		return mat;
-
-	mat2 = isl_mat_dup(mat);
-	isl_mat_free(mat);
-	return mat2;
-}
-
-void isl_mat_free(struct isl_mat *mat)
-{
-	if (!mat)
-		return;
-
-	if (--mat->ref > 0)
-		return;
-
-	if (!ISL_F_ISSET(mat, ISL_MAT_BORROWED))
-		isl_blk_free(mat->ctx, mat->block);
-	isl_ctx_deref(mat->ctx);
-	free(mat->row);
-	free(mat);
-}
-
-int isl_mat_rows(__isl_keep isl_mat *mat)
-{
-	return mat ? mat->n_row : -1;
-}
-
-int isl_mat_cols(__isl_keep isl_mat *mat)
-{
-	return mat ? mat->n_col : -1;
-}
-
-int isl_mat_get_element(__isl_keep isl_mat *mat, int row, int col, isl_int *v)
-{
-	if (!mat)
-		return -1;
-	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);
-	isl_int_set(*v, mat->row[row][col]);
-	return 0;
-}
-
-__isl_give isl_mat *isl_mat_set_element(__isl_take isl_mat *mat,
-	int row, int col, isl_int v)
-{
-	mat = isl_mat_cow(mat);
-	if (!mat)
-		return NULL;
-	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);
-	isl_int_set(mat->row[row][col], v);
-	return mat;
-error:
-	isl_mat_free(mat);
-	return NULL;
-}
-
-__isl_give isl_mat *isl_mat_set_element_si(__isl_take isl_mat *mat,
-	int row, int col, int v)
-{
-	mat = isl_mat_cow(mat);
-	if (!mat)
-		return NULL;
-	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);
-	isl_int_set_si(mat->row[row][col], v);
-	return mat;
-error:
-	isl_mat_free(mat);
-	return NULL;
-}
-
-__isl_give isl_mat *isl_mat_diag(isl_ctx *ctx, unsigned n_row, isl_int d)
-{
-	int i;
-	struct isl_mat *mat;
-
-	mat = isl_mat_alloc(ctx, n_row, n_row);
-	if (!mat)
-		return NULL;
-	for (i = 0; i < n_row; ++i) {
-		isl_seq_clr(mat->row[i], i);
-		isl_int_set(mat->row[i][i], d);
-		isl_seq_clr(mat->row[i]+i+1, n_row-(i+1));
-	}
-
-	return mat;
-}
-
-__isl_give isl_mat *isl_mat_identity(isl_ctx *ctx, unsigned n_row)
-{
-	if (!ctx)
-		return NULL;
-	return isl_mat_diag(ctx, n_row, ctx->one);
-}
-
-struct isl_vec *isl_mat_vec_product(struct isl_mat *mat, struct isl_vec *vec)
-{
-	int i;
-	struct isl_vec *prod;
-
-	if (!mat || !vec)
-		goto error;
-
-	isl_assert(mat->ctx, mat->n_col == vec->size, goto error);
-
-	prod = isl_vec_alloc(mat->ctx, mat->n_row);
-	if (!prod)
-		goto error;
-
-	for (i = 0; i < prod->size; ++i)
-		isl_seq_inner_product(mat->row[i], vec->el, vec->size,
-					&prod->block.data[i]);
-	isl_mat_free(mat);
-	isl_vec_free(vec);
-	return prod;
-error:
-	isl_mat_free(mat);
-	isl_vec_free(vec);
-	return NULL;
-}
-
-__isl_give isl_vec *isl_mat_vec_inverse_product(__isl_take isl_mat *mat,
-	__isl_take isl_vec *vec)
-{
-	struct isl_mat *vec_mat;
-	int i;
-
-	if (!mat || !vec)
-		goto error;
-	vec_mat = isl_mat_alloc(vec->ctx, vec->size, 1);
-	if (!vec_mat)
-		goto error;
-	for (i = 0; i < vec->size; ++i)
-		isl_int_set(vec_mat->row[i][0], vec->el[i]);
-	vec_mat = isl_mat_inverse_product(mat, vec_mat);
-	isl_vec_free(vec);
-	if (!vec_mat)
-		return NULL;
-	vec = isl_vec_alloc(vec_mat->ctx, vec_mat->n_row);
-	if (vec)
-		for (i = 0; i < vec->size; ++i)
-			isl_int_set(vec->el[i], vec_mat->row[i][0]);
-	isl_mat_free(vec_mat);
-	return vec;
-error:
-	isl_mat_free(mat);
-	isl_vec_free(vec);
-	return NULL;
-}
-
-struct isl_vec *isl_vec_mat_product(struct isl_vec *vec, struct isl_mat *mat)
-{
-	int i, j;
-	struct isl_vec *prod;
-
-	if (!mat || !vec)
-		goto error;
-
-	isl_assert(mat->ctx, mat->n_row == vec->size, goto error);
-
-	prod = isl_vec_alloc(mat->ctx, mat->n_col);
-	if (!prod)
-		goto error;
-
-	for (i = 0; i < prod->size; ++i) {
-		isl_int_set_si(prod->el[i], 0);
-		for (j = 0; j < vec->size; ++j)
-			isl_int_addmul(prod->el[i], vec->el[j], mat->row[j][i]);
-	}
-	isl_mat_free(mat);
-	isl_vec_free(vec);
-	return prod;
-error:
-	isl_mat_free(mat);
-	isl_vec_free(vec);
-	return NULL;
-}
-
-struct isl_mat *isl_mat_aff_direct_sum(struct isl_mat *left,
-	struct isl_mat *right)
-{
-	int i;
-	struct isl_mat *sum;
-
-	if (!left || !right)
-		goto error;
-
-	isl_assert(left->ctx, left->n_row == right->n_row, goto error);
-	isl_assert(left->ctx, left->n_row >= 1, goto error);
-	isl_assert(left->ctx, left->n_col >= 1, goto error);
-	isl_assert(left->ctx, right->n_col >= 1, goto error);
-	isl_assert(left->ctx,
-	    isl_seq_first_non_zero(left->row[0]+1, left->n_col-1) == -1,
-	    goto error);
-	isl_assert(left->ctx,
-	    isl_seq_first_non_zero(right->row[0]+1, right->n_col-1) == -1,
-	    goto error);
-
-	sum = isl_mat_alloc(left->ctx, left->n_row, left->n_col + right->n_col - 1);
-	if (!sum)
-		goto error;
-	isl_int_lcm(sum->row[0][0], left->row[0][0], right->row[0][0]);
-	isl_int_divexact(left->row[0][0], sum->row[0][0], left->row[0][0]);
-	isl_int_divexact(right->row[0][0], sum->row[0][0], right->row[0][0]);
-
-	isl_seq_clr(sum->row[0]+1, sum->n_col-1);
-	for (i = 1; i < sum->n_row; ++i) {
-		isl_int_mul(sum->row[i][0], left->row[0][0], left->row[i][0]);
-		isl_int_addmul(sum->row[i][0],
-				right->row[0][0], right->row[i][0]);
-		isl_seq_scale(sum->row[i]+1, left->row[i]+1, left->row[0][0],
-				left->n_col-1);
-		isl_seq_scale(sum->row[i]+left->n_col,
-				right->row[i]+1, right->row[0][0],
-				right->n_col-1);
-	}
-
-	isl_int_divexact(left->row[0][0], sum->row[0][0], left->row[0][0]);
-	isl_int_divexact(right->row[0][0], sum->row[0][0], right->row[0][0]);
-	isl_mat_free(left);
-	isl_mat_free(right);
-	return sum;
-error:
-	isl_mat_free(left);
-	isl_mat_free(right);
-	return NULL;
-}
-
-static void exchange(struct isl_mat *M, struct isl_mat **U,
-	struct isl_mat **Q, unsigned row, unsigned i, unsigned j)
-{
-	int r;
-	for (r = row; r < M->n_row; ++r)
-		isl_int_swap(M->row[r][i], M->row[r][j]);
-	if (U) {
-		for (r = 0; r < (*U)->n_row; ++r)
-			isl_int_swap((*U)->row[r][i], (*U)->row[r][j]);
-	}
-	if (Q)
-		isl_mat_swap_rows(*Q, i, j);
-}
-
-static void subtract(struct isl_mat *M, struct isl_mat **U,
-	struct isl_mat **Q, unsigned row, unsigned i, unsigned j, isl_int m)
-{
-	int r;
-	for (r = row; r < M->n_row; ++r)
-		isl_int_submul(M->row[r][j], m, M->row[r][i]);
-	if (U) {
-		for (r = 0; r < (*U)->n_row; ++r)
-			isl_int_submul((*U)->row[r][j], m, (*U)->row[r][i]);
-	}
-	if (Q) {
-		for (r = 0; r < (*Q)->n_col; ++r)
-			isl_int_addmul((*Q)->row[i][r], m, (*Q)->row[j][r]);
-	}
-}
-
-static void oppose(struct isl_mat *M, struct isl_mat **U,
-	struct isl_mat **Q, unsigned row, unsigned col)
-{
-	int r;
-	for (r = row; r < M->n_row; ++r)
-		isl_int_neg(M->row[r][col], M->row[r][col]);
-	if (U) {
-		for (r = 0; r < (*U)->n_row; ++r)
-			isl_int_neg((*U)->row[r][col], (*U)->row[r][col]);
-	}
-	if (Q)
-		isl_seq_neg((*Q)->row[col], (*Q)->row[col], (*Q)->n_col);
-}
-
-/* Given matrix M, compute
- *
- *		M U = H
- *		M   = H Q
- *
- * with U and Q unimodular matrices and H a matrix in column echelon form
- * such that on each echelon row the entries in the non-echelon column
- * are non-negative (if neg == 0) or non-positive (if neg == 1)
- * and stricly smaller (in absolute value) than the entries in the echelon
- * column.
- * If U or Q are NULL, then these matrices are not computed.
- */
-struct isl_mat *isl_mat_left_hermite(struct isl_mat *M, int neg,
-	struct isl_mat **U, struct isl_mat **Q)
-{
-	isl_int c;
-	int row, col;
-
-	if (U)
-		*U = NULL;
-	if (Q)
-		*Q = NULL;
-	if (!M)
-		goto error;
-	M = isl_mat_cow(M);
-	if (!M)
-		goto error;
-	if (U) {
-		*U = isl_mat_identity(M->ctx, M->n_col);
-		if (!*U)
-			goto error;
-	}
-	if (Q) {
-		*Q = isl_mat_identity(M->ctx, M->n_col);
-		if (!*Q)
-			goto error;
-	}
-
-	col = 0;
-	isl_int_init(c);
-	for (row = 0; row < M->n_row; ++row) {
-		int first, i, off;
-		first = isl_seq_abs_min_non_zero(M->row[row]+col, M->n_col-col);
-		if (first == -1)
-			continue;
-		first += col;
-		if (first != col)
-			exchange(M, U, Q, row, first, col);
-		if (isl_int_is_neg(M->row[row][col]))
-			oppose(M, U, Q, row, col);
-		first = col+1;
-		while ((off = isl_seq_first_non_zero(M->row[row]+first,
-						       M->n_col-first)) != -1) {
-			first += off;
-			isl_int_fdiv_q(c, M->row[row][first], M->row[row][col]);
-			subtract(M, U, Q, row, col, first, c);
-			if (!isl_int_is_zero(M->row[row][first]))
-				exchange(M, U, Q, row, first, col);
-			else
-				++first;
-		}
-		for (i = 0; i < col; ++i) {
-			if (isl_int_is_zero(M->row[row][i]))
-				continue;
-			if (neg)
-				isl_int_cdiv_q(c, M->row[row][i], M->row[row][col]);
-			else
-				isl_int_fdiv_q(c, M->row[row][i], M->row[row][col]);
-			if (isl_int_is_zero(c))
-				continue;
-			subtract(M, U, Q, row, col, i, c);
-		}
-		++col;
-	}
-	isl_int_clear(c);
-
-	return M;
-error:
-	if (Q) {
-		isl_mat_free(*Q);
-		*Q = NULL;
-	}
-	if (U) {
-		isl_mat_free(*U);
-		*U = NULL;
-	}
-	isl_mat_free(M);
-	return NULL;
-}
-
-struct isl_mat *isl_mat_right_kernel(struct isl_mat *mat)
-{
-	int i, rank;
-	struct isl_mat *U = NULL;
-	struct isl_mat *K;
-
-	mat = isl_mat_left_hermite(mat, 0, &U, NULL);
-	if (!mat || !U)
-		goto error;
-
-	for (i = 0, rank = 0; rank < mat->n_col; ++rank) {
-		while (i < mat->n_row && isl_int_is_zero(mat->row[i][rank]))
-			++i;
-		if (i >= mat->n_row)
-			break;
-	}
-	K = isl_mat_alloc(U->ctx, U->n_row, U->n_col - rank);
-	if (!K)
-		goto error;
-	isl_mat_sub_copy(K->ctx, K->row, U->row, U->n_row, 0, rank, U->n_col-rank);
-	isl_mat_free(mat);
-	isl_mat_free(U);
-	return K;
-error:
-	isl_mat_free(mat);
-	isl_mat_free(U);
-	return NULL;
-}
-
-struct isl_mat *isl_mat_lin_to_aff(struct isl_mat *mat)
-{
-	int i;
-	struct isl_mat *mat2;
-
-	if (!mat)
-		return NULL;
-	mat2 = isl_mat_alloc(mat->ctx, 1+mat->n_row, 1+mat->n_col);
-	if (!mat2)
-		goto error;
-	isl_int_set_si(mat2->row[0][0], 1);
-	isl_seq_clr(mat2->row[0]+1, mat->n_col);
-	for (i = 0; i < mat->n_row; ++i) {
-		isl_int_set_si(mat2->row[1+i][0], 0);
-		isl_seq_cpy(mat2->row[1+i]+1, mat->row[i], mat->n_col);
-	}
-	isl_mat_free(mat);
-	return mat2;
-error:
-	isl_mat_free(mat);
-	return NULL;
-}
-
-/* Given two matrices M1 and M2, return the block matrix
- *
- *	[ M1  0  ]
- *	[ 0   M2 ]
- */
-__isl_give isl_mat *isl_mat_diagonal(__isl_take isl_mat *mat1,
-	__isl_take isl_mat *mat2)
-{
-	int i;
-	isl_mat *mat;
-
-	if (!mat1 || !mat2)
-		goto error;
-
-	mat = isl_mat_alloc(mat1->ctx, mat1->n_row + mat2->n_row,
-				       mat1->n_col + mat2->n_col);
-	if (!mat)
-		goto error;
-	for (i = 0; i < mat1->n_row; ++i) {
-		isl_seq_cpy(mat->row[i], mat1->row[i], mat1->n_col);
-		isl_seq_clr(mat->row[i] + mat1->n_col, mat2->n_col);
-	}
-	for (i = 0; i < mat2->n_row; ++i) {
-		isl_seq_clr(mat->row[mat1->n_row + i], mat1->n_col);
-		isl_seq_cpy(mat->row[mat1->n_row + i] + mat1->n_col,
-						    mat2->row[i], mat2->n_col);
-	}
-	isl_mat_free(mat1);
-	isl_mat_free(mat2);
-	return mat;
-error:
-	isl_mat_free(mat1);
-	isl_mat_free(mat2);
-	return NULL;
-}
-
-static int row_first_non_zero(isl_int **row, unsigned n_row, unsigned col)
-{
-	int i;
-
-	for (i = 0; i < n_row; ++i)
-		if (!isl_int_is_zero(row[i][col]))
-			return i;
-	return -1;
-}
-
-static int row_abs_min_non_zero(isl_int **row, unsigned n_row, unsigned col)
-{
-	int i, min = row_first_non_zero(row, n_row, col);
-	if (min < 0)
-		return -1;
-	for (i = min + 1; i < n_row; ++i) {
-		if (isl_int_is_zero(row[i][col]))
-			continue;
-		if (isl_int_abs_lt(row[i][col], row[min][col]))
-			min = i;
-	}
-	return min;
-}
-
-static void inv_exchange(struct isl_mat *left, struct isl_mat *right,
-	unsigned i, unsigned j)
-{
-	left = isl_mat_swap_rows(left, i, j);
-	right = isl_mat_swap_rows(right, i, j);
-}
-
-static void inv_oppose(
-	struct isl_mat *left, struct isl_mat *right, unsigned row)
-{
-	isl_seq_neg(left->row[row]+row, left->row[row]+row, left->n_col-row);
-	isl_seq_neg(right->row[row], right->row[row], right->n_col);
-}
-
-static void inv_subtract(struct isl_mat *left, struct isl_mat *right,
-	unsigned row, unsigned i, isl_int m)
-{
-	isl_int_neg(m, m);
-	isl_seq_combine(left->row[i]+row,
-			left->ctx->one, left->row[i]+row,
-			m, left->row[row]+row,
-			left->n_col-row);
-	isl_seq_combine(right->row[i], right->ctx->one, right->row[i],
-			m, right->row[row], right->n_col);
-}
-
-/* Compute inv(left)*right
- */
-struct isl_mat *isl_mat_inverse_product(struct isl_mat *left,
-	struct isl_mat *right)
-{
-	int row;
-	isl_int a, b;
-
-	if (!left || !right)
-		goto error;
-
-	isl_assert(left->ctx, left->n_row == left->n_col, goto error);
-	isl_assert(left->ctx, left->n_row == right->n_row, goto error);
-
-	if (left->n_row == 0) {
-		isl_mat_free(left);
-		return right;
-	}
-
-	left = isl_mat_cow(left);
-	right = isl_mat_cow(right);
-	if (!left || !right)
-		goto error;
-
-	isl_int_init(a);
-	isl_int_init(b);
-	for (row = 0; row < left->n_row; ++row) {
-		int pivot, first, i, off;
-		pivot = row_abs_min_non_zero(left->row+row, left->n_row-row, row);
-		if (pivot < 0) {
-			isl_int_clear(a);
-			isl_int_clear(b);
-			isl_assert(left->ctx, pivot >= 0, goto error);
-		}
-		pivot += row;
-		if (pivot != row)
-			inv_exchange(left, right, pivot, row);
-		if (isl_int_is_neg(left->row[row][row]))
-			inv_oppose(left, right, row);
-		first = row+1;
-		while ((off = row_first_non_zero(left->row+first,
-					left->n_row-first, row)) != -1) {
-			first += off;
-			isl_int_fdiv_q(a, left->row[first][row],
-					left->row[row][row]);
-			inv_subtract(left, right, row, first, a);
-			if (!isl_int_is_zero(left->row[first][row]))
-				inv_exchange(left, right, row, first);
-			else
-				++first;
-		}
-		for (i = 0; i < row; ++i) {
-			if (isl_int_is_zero(left->row[i][row]))
-				continue;
-			isl_int_gcd(a, left->row[row][row], left->row[i][row]);
-			isl_int_divexact(b, left->row[i][row], a);
-			isl_int_divexact(a, left->row[row][row], a);
-			isl_int_neg(b, b);
-			isl_seq_combine(left->row[i] + i,
-					a, left->row[i] + i,
-					b, left->row[row] + i,
-					left->n_col - i);
-			isl_seq_combine(right->row[i], a, right->row[i],
-					b, right->row[row], right->n_col);
-		}
-	}
-	isl_int_clear(b);
-
-	isl_int_set(a, left->row[0][0]);
-	for (row = 1; row < left->n_row; ++row)
-		isl_int_lcm(a, a, left->row[row][row]);
-	if (isl_int_is_zero(a)){
-		isl_int_clear(a);
-		isl_assert(left->ctx, 0, goto error);
-	}
-	for (row = 0; row < left->n_row; ++row) {
-		isl_int_divexact(left->row[row][row], a, left->row[row][row]);
-		if (isl_int_is_one(left->row[row][row]))
-			continue;
-		isl_seq_scale(right->row[row], right->row[row],
-				left->row[row][row], right->n_col);
-	}
-	isl_int_clear(a);
-
-	isl_mat_free(left);
-	return right;
-error:
-	isl_mat_free(left);
-	isl_mat_free(right);
-	return NULL;
-}
-
-void isl_mat_col_scale(struct isl_mat *mat, unsigned col, isl_int m)
-{
-	int i;
-
-	for (i = 0; i < mat->n_row; ++i)
-		isl_int_mul(mat->row[i][col], mat->row[i][col], m);
-}
-
-void isl_mat_col_combine(struct isl_mat *mat, unsigned dst,
-	isl_int m1, unsigned src1, isl_int m2, unsigned src2)
-{
-	int i;
-	isl_int tmp;
-
-	isl_int_init(tmp);
-	for (i = 0; i < mat->n_row; ++i) {
-		isl_int_mul(tmp, m1, mat->row[i][src1]);
-		isl_int_addmul(tmp, m2, mat->row[i][src2]);
-		isl_int_set(mat->row[i][dst], tmp);
-	}
-	isl_int_clear(tmp);
-}
-
-struct isl_mat *isl_mat_right_inverse(struct isl_mat *mat)
-{
-	struct isl_mat *inv;
-	int row;
-	isl_int a, b;
-
-	mat = isl_mat_cow(mat);
-	if (!mat)
-		return NULL;
-
-	inv = isl_mat_identity(mat->ctx, mat->n_col);
-	inv = isl_mat_cow(inv);
-	if (!inv)
-		goto error;
-
-	isl_int_init(a);
-	isl_int_init(b);
-	for (row = 0; row < mat->n_row; ++row) {
-		int pivot, first, i, off;
-		pivot = isl_seq_abs_min_non_zero(mat->row[row]+row, mat->n_col-row);
-		if (pivot < 0) {
-			isl_int_clear(a);
-			isl_int_clear(b);
-			isl_assert(mat->ctx, pivot >= 0, goto error);
-		}
-		pivot += row;
-		if (pivot != row)
-			exchange(mat, &inv, NULL, row, pivot, row);
-		if (isl_int_is_neg(mat->row[row][row]))
-			oppose(mat, &inv, NULL, row, row);
-		first = row+1;
-		while ((off = isl_seq_first_non_zero(mat->row[row]+first,
-						    mat->n_col-first)) != -1) {
-			first += off;
-			isl_int_fdiv_q(a, mat->row[row][first],
-						    mat->row[row][row]);
-			subtract(mat, &inv, NULL, row, row, first, a);
-			if (!isl_int_is_zero(mat->row[row][first]))
-				exchange(mat, &inv, NULL, row, row, first);
-			else
-				++first;
-		}
-		for (i = 0; i < row; ++i) {
-			if (isl_int_is_zero(mat->row[row][i]))
-				continue;
-			isl_int_gcd(a, mat->row[row][row], mat->row[row][i]);
-			isl_int_divexact(b, mat->row[row][i], a);
-			isl_int_divexact(a, mat->row[row][row], a);
-			isl_int_neg(a, a);
-			isl_mat_col_combine(mat, i, a, i, b, row);
-			isl_mat_col_combine(inv, i, a, i, b, row);
-		}
-	}
-	isl_int_clear(b);
-
-	isl_int_set(a, mat->row[0][0]);
-	for (row = 1; row < mat->n_row; ++row)
-		isl_int_lcm(a, a, mat->row[row][row]);
-	if (isl_int_is_zero(a)){
-		isl_int_clear(a);
-		goto error;
-	}
-	for (row = 0; row < mat->n_row; ++row) {
-		isl_int_divexact(mat->row[row][row], a, mat->row[row][row]);
-		if (isl_int_is_one(mat->row[row][row]))
-			continue;
-		isl_mat_col_scale(inv, row, mat->row[row][row]);
-	}
-	isl_int_clear(a);
-
-	isl_mat_free(mat);
-
-	return inv;
-error:
-	isl_mat_free(mat);
-	isl_mat_free(inv);
-	return NULL;
-}
-
-struct isl_mat *isl_mat_transpose(struct isl_mat *mat)
-{
-	struct isl_mat *transpose = NULL;
-	int i, j;
-
-	if (mat->n_col == mat->n_row) {
-		mat = isl_mat_cow(mat);
-		if (!mat)
-			return NULL;
-		for (i = 0; i < mat->n_row; ++i)
-			for (j = i + 1; j < mat->n_col; ++j)
-				isl_int_swap(mat->row[i][j], mat->row[j][i]);
-		return mat;
-	}
-	transpose = isl_mat_alloc(mat->ctx, mat->n_col, mat->n_row);
-	if (!transpose)
-		goto error;
-	for (i = 0; i < mat->n_row; ++i)
-		for (j = 0; j < mat->n_col; ++j)
-			isl_int_set(transpose->row[j][i], mat->row[i][j]);
-	isl_mat_free(mat);
-	return transpose;
-error:
-	isl_mat_free(mat);
-	return NULL;
-}
-
-struct isl_mat *isl_mat_swap_cols(struct isl_mat *mat, unsigned i, unsigned j)
-{
-	int r;
-
-	mat = isl_mat_cow(mat);
-	if (!mat)
-		return NULL;
-	isl_assert(mat->ctx, i < mat->n_col, goto error);
-	isl_assert(mat->ctx, j < mat->n_col, goto error);
-
-	for (r = 0; r < mat->n_row; ++r)
-		isl_int_swap(mat->row[r][i], mat->row[r][j]);
-	return mat;
-error:
-	isl_mat_free(mat);
-	return NULL;
-}
-
-struct isl_mat *isl_mat_swap_rows(struct isl_mat *mat, unsigned i, unsigned j)
-{
-	isl_int *t;
-
-	if (!mat)
-		return NULL;
-	mat = isl_mat_cow(mat);
-	if (!mat)
-		return NULL;
-	t = mat->row[i];
-	mat->row[i] = mat->row[j];
-	mat->row[j] = t;
-	return mat;
-}
-
-struct isl_mat *isl_mat_product(struct isl_mat *left, struct isl_mat *right)
-{
-	int i, j, k;
-	struct isl_mat *prod;
-
-	if (!left || !right)
-		goto error;
-	isl_assert(left->ctx, left->n_col == right->n_row, goto error);
-	prod = isl_mat_alloc(left->ctx, left->n_row, right->n_col);
-	if (!prod)
-		goto error;
-	if (left->n_col == 0) {
-		for (i = 0; i < prod->n_row; ++i)
-			isl_seq_clr(prod->row[i], prod->n_col);
-		isl_mat_free(left);
-		isl_mat_free(right);
-		return prod;
-	}
-	for (i = 0; i < prod->n_row; ++i) {
-		for (j = 0; j < prod->n_col; ++j) {
-			isl_int_mul(prod->row[i][j],
-				    left->row[i][0], right->row[0][j]);
-			for (k = 1; k < left->n_col; ++k)
-				isl_int_addmul(prod->row[i][j],
-					    left->row[i][k], right->row[k][j]);
-		}
-	}
-	isl_mat_free(left);
-	isl_mat_free(right);
-	return prod;
-error:
-	isl_mat_free(left);
-	isl_mat_free(right);
-	return NULL;
-}
-
-/* Replace the variables x in the rows q by x' given by x = M x',
- * with M the matrix mat.
- *
- * If the number of new variables is greater than the original
- * number of variables, then the rows q have already been
- * preextended.  If the new number is smaller, then the coefficients
- * of the divs, which are not changed, need to be shifted down.
- * The row q may be the equalities, the inequalities or the
- * div expressions.  In the latter case, has_div is true and
- * we need to take into account the extra denominator column.
- */
-static int preimage(struct isl_ctx *ctx, isl_int **q, unsigned n,
-	unsigned n_div, int has_div, struct isl_mat *mat)
-{
-	int i;
-	struct isl_mat *t;
-	int e;
-
-	if (mat->n_col >= mat->n_row)
-		e = 0;
-	else
-		e = mat->n_row - mat->n_col;
-	if (has_div)
-		for (i = 0; i < n; ++i)
-			isl_int_mul(q[i][0], q[i][0], mat->row[0][0]);
-	t = isl_mat_sub_alloc6(mat->ctx, q, 0, n, has_div, mat->n_row);
-	t = isl_mat_product(t, mat);
-	if (!t)
-		return -1;
-	for (i = 0; i < n; ++i) {
-		isl_seq_swp_or_cpy(q[i] + has_div, t->row[i], t->n_col);
-		isl_seq_cpy(q[i] + has_div + t->n_col,
-			    q[i] + has_div + t->n_col + e, n_div);
-		isl_seq_clr(q[i] + has_div + t->n_col + n_div, e);
-	}
-	isl_mat_free(t);
-	return 0;
-}
-
-/* Replace the variables x in bset by x' given by x = M x', with
- * M the matrix mat.
- *
- * If there are fewer variables x' then there are x, then we perform
- * the transformation in place, which that, in principle,
- * this frees up some extra variables as the number
- * of columns remains constant, but we would have to extend
- * the div array too as the number of rows in this array is assumed
- * to be equal to extra.
- */
-struct isl_basic_set *isl_basic_set_preimage(struct isl_basic_set *bset,
-	struct isl_mat *mat)
-{
-	struct isl_ctx *ctx;
-
-	if (!bset || !mat)
-		goto error;
-
-	ctx = bset->ctx;
-	bset = isl_basic_set_cow(bset);
-	if (!bset)
-		goto error;
-
-	isl_assert(ctx, bset->dim->nparam == 0, goto error);
-	isl_assert(ctx, 1+bset->dim->n_out == mat->n_row, goto error);
-	isl_assert(ctx, mat->n_col > 0, goto error);
-
-	if (mat->n_col > mat->n_row) {
-		bset = isl_basic_set_extend(bset, 0, mat->n_col-1, 0, 0, 0);
-		if (!bset)
-			goto error;
-	} else if (mat->n_col < mat->n_row) {
-		bset->dim = isl_space_cow(bset->dim);
-		if (!bset->dim)
-			goto error;
-		bset->dim->n_out -= mat->n_row - mat->n_col;
-	}
-
-	if (preimage(ctx, bset->eq, bset->n_eq, bset->n_div, 0,
-			isl_mat_copy(mat)) < 0)
-		goto error;
-
-	if (preimage(ctx, bset->ineq, bset->n_ineq, bset->n_div, 0,
-			isl_mat_copy(mat)) < 0)
-		goto error;
-
-	if (preimage(ctx, bset->div, bset->n_div, bset->n_div, 1, mat) < 0)
-		goto error2;
-
-	ISL_F_CLR(bset, ISL_BASIC_SET_NO_IMPLICIT);
-	ISL_F_CLR(bset, ISL_BASIC_SET_NO_REDUNDANT);
-	ISL_F_CLR(bset, ISL_BASIC_SET_NORMALIZED);
-	ISL_F_CLR(bset, ISL_BASIC_SET_NORMALIZED_DIVS);
-	ISL_F_CLR(bset, ISL_BASIC_SET_ALL_EQUALITIES);
-
-	bset = isl_basic_set_simplify(bset);
-	bset = isl_basic_set_finalize(bset);
-
-	return bset;
-error:
-	isl_mat_free(mat);
-error2:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-struct isl_set *isl_set_preimage(struct isl_set *set, struct isl_mat *mat)
-{
-	struct isl_ctx *ctx;
-	int i;
-
-	set = isl_set_cow(set);
-	if (!set)
-		return NULL;
-
-	ctx = set->ctx;
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_basic_set_preimage(set->p[i],
-						    isl_mat_copy(mat));
-		if (!set->p[i])
-			goto error;
-	}
-	if (mat->n_col != mat->n_row) {
-		set->dim = isl_space_cow(set->dim);
-		if (!set->dim)
-			goto error;
-		set->dim->n_out += mat->n_col;
-		set->dim->n_out -= mat->n_row;
-	}
-	isl_mat_free(mat);
-	ISL_F_CLR(set, ISL_SET_NORMALIZED);
-	return set;
-error:
-	isl_set_free(set);
-	isl_mat_free(mat);
-	return NULL;
-}
-
-/* Replace the variables x starting at pos in the rows q
- * by x' with x = M x' with M the matrix mat.
- * That is, replace the corresponding coefficients c by c M.
- */
-static int transform(isl_ctx *ctx, isl_int **q, unsigned n,
-	unsigned pos, __isl_take isl_mat *mat)
-{
-	int i;
-	isl_mat *t;
-
-	t = isl_mat_sub_alloc6(ctx, q, 0, n, pos, mat->n_row);
-	t = isl_mat_product(t, mat);
-	if (!t)
-		return -1;
-	for (i = 0; i < n; ++i)
-		isl_seq_swp_or_cpy(q[i] + pos, t->row[i], t->n_col);
-	isl_mat_free(t);
-	return 0;
-}
-
-/* Replace the variables x of type "type" starting at "first" in "bset"
- * by x' with x = M x' with M the matrix trans.
- * That is, replace the corresponding coefficients c by c M.
- *
- * The transformation matrix should be a square matrix.
- */
-__isl_give isl_basic_set *isl_basic_set_transform_dims(
-	__isl_take isl_basic_set *bset, enum isl_dim_type type, unsigned first,
-	__isl_take isl_mat *trans)
-{
-	isl_ctx *ctx;
-	unsigned pos;
-
-	bset = isl_basic_set_cow(bset);
-	if (!bset || !trans)
-		goto error;
-
-	ctx = isl_basic_set_get_ctx(bset);
-	if (trans->n_row != trans->n_col)
-		isl_die(trans->ctx, isl_error_invalid,
-			"expecting square transformation matrix", goto error);
-	if (first + trans->n_row > isl_basic_set_dim(bset, type))
-		isl_die(trans->ctx, isl_error_invalid,
-			"oversized transformation matrix", goto error);
-
-	pos = isl_basic_set_offset(bset, type) + first;
-
-	if (transform(ctx, bset->eq, bset->n_eq, pos, isl_mat_copy(trans)) < 0)
-		goto error;
-	if (transform(ctx, bset->ineq, bset->n_ineq, pos,
-		      isl_mat_copy(trans)) < 0)
-		goto error;
-	if (transform(ctx, bset->div, bset->n_div, 1 + pos,
-		      isl_mat_copy(trans)) < 0)
-		goto error;
-
-	ISL_F_CLR(bset, ISL_BASIC_SET_NORMALIZED);
-	ISL_F_CLR(bset, ISL_BASIC_SET_NORMALIZED_DIVS);
-
-	isl_mat_free(trans);
-	return bset;
-error:
-	isl_mat_free(trans);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-void isl_mat_print_internal(__isl_keep isl_mat *mat, FILE *out, int indent)
-{
-	int i, j;
-
-	if (!mat) {
-		fprintf(out, "%*snull mat\n", indent, "");
-		return;
-	}
-
-	if (mat->n_row == 0)
-		fprintf(out, "%*s[]\n", indent, "");
-
-	for (i = 0; i < mat->n_row; ++i) {
-		if (!i)
-			fprintf(out, "%*s[[", indent, "");
-		else
-			fprintf(out, "%*s[", indent+1, "");
-		for (j = 0; j < mat->n_col; ++j) {
-			if (j)
-			    fprintf(out, ",");
-			isl_int_print(out, mat->row[i][j], 0);
-		}
-		if (i == mat->n_row-1)
-			fprintf(out, "]]\n");
-		else
-			fprintf(out, "]\n");
-	}
-}
-
-void isl_mat_dump(__isl_keep isl_mat *mat)
-{
-	isl_mat_print_internal(mat, stderr, 0);
-}
-
-struct isl_mat *isl_mat_drop_cols(struct isl_mat *mat, unsigned col, unsigned n)
-{
-	int r;
-
-	mat = isl_mat_cow(mat);
-	if (!mat)
-		return NULL;
-
-	if (col != mat->n_col-n) {
-		for (r = 0; r < mat->n_row; ++r)
-			isl_seq_cpy(mat->row[r]+col, mat->row[r]+col+n,
-					mat->n_col - col - n);
-	}
-	mat->n_col -= n;
-	return mat;
-}
-
-struct isl_mat *isl_mat_drop_rows(struct isl_mat *mat, unsigned row, unsigned n)
-{
-	int r;
-
-	mat = isl_mat_cow(mat);
-	if (!mat)
-		return NULL;
-
-	for (r = row; r+n < mat->n_row; ++r)
-		mat->row[r] = mat->row[r+n];
-
-	mat->n_row -= n;
-	return mat;
-}
-
-__isl_give isl_mat *isl_mat_insert_cols(__isl_take isl_mat *mat,
-				unsigned col, unsigned n)
-{
-	isl_mat *ext;
-
-	if (!mat)
-		return NULL;
-	if (n == 0)
-		return mat;
-
-	ext = isl_mat_alloc(mat->ctx, mat->n_row, mat->n_col + n);
-	if (!ext)
-		goto error;
-
-	isl_mat_sub_copy(mat->ctx, ext->row, mat->row, mat->n_row, 0, 0, col);
-	isl_mat_sub_copy(mat->ctx, ext->row, mat->row, mat->n_row,
-				col + n, col, mat->n_col - col);
-
-	isl_mat_free(mat);
-	return ext;
-error:
-	isl_mat_free(mat);
-	return NULL;
-}
-
-__isl_give isl_mat *isl_mat_insert_zero_cols(__isl_take isl_mat *mat,
-	unsigned first, unsigned n)
-{
-	int i;
-
-	if (!mat)
-		return NULL;
-	mat = isl_mat_insert_cols(mat, first, n);
-	if (!mat)
-		return NULL;
-
-	for (i = 0; i < mat->n_row; ++i)
-		isl_seq_clr(mat->row[i] + first, n);
-
-	return mat;
-}
-
-__isl_give isl_mat *isl_mat_add_zero_cols(__isl_take isl_mat *mat, unsigned n)
-{
-	if (!mat)
-		return NULL;
-
-	return isl_mat_insert_zero_cols(mat, mat->n_col, n);
-}
-
-__isl_give isl_mat *isl_mat_insert_rows(__isl_take isl_mat *mat,
-				unsigned row, unsigned n)
-{
-	isl_mat *ext;
-
-	if (!mat)
-		return NULL;
-	if (n == 0)
-		return mat;
-
-	ext = isl_mat_alloc(mat->ctx, mat->n_row + n, mat->n_col);
-	if (!ext)
-		goto error;
-
-	isl_mat_sub_copy(mat->ctx, ext->row, mat->row, row, 0, 0, mat->n_col);
-	isl_mat_sub_copy(mat->ctx, ext->row + row + n, mat->row + row,
-				mat->n_row - row, 0, 0, mat->n_col);
-
-	isl_mat_free(mat);
-	return ext;
-error:
-	isl_mat_free(mat);
-	return NULL;
-}
-
-__isl_give isl_mat *isl_mat_add_rows(__isl_take isl_mat *mat, unsigned n)
-{
-	if (!mat)
-		return NULL;
-
-	return isl_mat_insert_rows(mat, mat->n_row, n);
-}
-
-__isl_give isl_mat *isl_mat_insert_zero_rows(__isl_take isl_mat *mat,
-	unsigned row, unsigned n)
-{
-	int i;
-
-	mat = isl_mat_insert_rows(mat, row, n);
-	if (!mat)
-		return NULL;
-	
-	for (i = 0; i < n; ++i)
-		isl_seq_clr(mat->row[row + i], mat->n_col);
-
-	return mat;
-}
-
-__isl_give isl_mat *isl_mat_add_zero_rows(__isl_take isl_mat *mat, unsigned n)
-{
-	if (!mat)
-		return NULL;
-
-	return isl_mat_insert_zero_rows(mat, mat->n_row, n);
-}
-
-void isl_mat_col_submul(struct isl_mat *mat,
-			int dst_col, isl_int f, int src_col)
-{
-	int i;
-
-	for (i = 0; i < mat->n_row; ++i)
-		isl_int_submul(mat->row[i][dst_col], f, mat->row[i][src_col]);
-}
-
-void isl_mat_col_add(__isl_keep isl_mat *mat, int dst_col, int src_col)
-{
-	int i;
-
-	if (!mat)
-		return;
-
-	for (i = 0; i < mat->n_row; ++i)
-		isl_int_add(mat->row[i][dst_col],
-			    mat->row[i][dst_col], mat->row[i][src_col]);
-}
-
-void isl_mat_col_mul(struct isl_mat *mat, int dst_col, isl_int f, int src_col)
-{
-	int i;
-
-	for (i = 0; i < mat->n_row; ++i)
-		isl_int_mul(mat->row[i][dst_col], f, mat->row[i][src_col]);
-}
-
-struct isl_mat *isl_mat_unimodular_complete(struct isl_mat *M, int row)
-{
-	int r;
-	struct isl_mat *H = NULL, *Q = NULL;
-
-	if (!M)
-		return NULL;
-
-	isl_assert(M->ctx, M->n_row == M->n_col, goto error);
-	M->n_row = row;
-	H = isl_mat_left_hermite(isl_mat_copy(M), 0, NULL, &Q);
-	M->n_row = M->n_col;
-	if (!H)
-		goto error;
-	for (r = 0; r < row; ++r)
-		isl_assert(M->ctx, isl_int_is_one(H->row[r][r]), goto error);
-	for (r = row; r < M->n_row; ++r)
-		isl_seq_cpy(M->row[r], Q->row[r], M->n_col);
-	isl_mat_free(H);
-	isl_mat_free(Q);
-	return M;
-error:
-	isl_mat_free(H);
-	isl_mat_free(Q);
-	isl_mat_free(M);
-	return NULL;
-}
-
-__isl_give isl_mat *isl_mat_concat(__isl_take isl_mat *top,
-	__isl_take isl_mat *bot)
-{
-	struct isl_mat *mat;
-
-	if (!top || !bot)
-		goto error;
-
-	isl_assert(top->ctx, top->n_col == bot->n_col, goto error);
-	if (top->n_row == 0) {
-		isl_mat_free(top);
-		return bot;
-	}
-	if (bot->n_row == 0) {
-		isl_mat_free(bot);
-		return top;
-	}
-
-	mat = isl_mat_alloc(top->ctx, top->n_row + bot->n_row, top->n_col);
-	if (!mat)
-		goto error;
-	isl_mat_sub_copy(mat->ctx, mat->row, top->row, top->n_row,
-			 0, 0, mat->n_col);
-	isl_mat_sub_copy(mat->ctx, mat->row + top->n_row, bot->row, bot->n_row,
-			 0, 0, mat->n_col);
-	isl_mat_free(top);
-	isl_mat_free(bot);
-	return mat;
-error:
-	isl_mat_free(top);
-	isl_mat_free(bot);
-	return NULL;
-}
-
-int isl_mat_is_equal(__isl_keep isl_mat *mat1, __isl_keep isl_mat *mat2)
-{
-	int i;
-
-	if (!mat1 || !mat2)
-		return -1;
-
-	if (mat1->n_row != mat2->n_row)
-		return 0;
-
-	if (mat1->n_col != mat2->n_col)
-		return 0;
-
-	for (i = 0; i < mat1->n_row; ++i)
-		if (!isl_seq_eq(mat1->row[i], mat2->row[i], mat1->n_col))
-			return 0;
-
-	return 1;
-}
-
-__isl_give isl_mat *isl_mat_from_row_vec(__isl_take isl_vec *vec)
-{
-	struct isl_mat *mat;
-
-	if (!vec)
-		return NULL;
-	mat = isl_mat_alloc(vec->ctx, 1, vec->size);
-	if (!mat)
-		goto error;
-
-	isl_seq_cpy(mat->row[0], vec->el, vec->size);
-
-	isl_vec_free(vec);
-	return mat;
-error:
-	isl_vec_free(vec);
-	return NULL;
-}
-
-__isl_give isl_mat *isl_mat_vec_concat(__isl_take isl_mat *top,
-	__isl_take isl_vec *bot)
-{
-	return isl_mat_concat(top, isl_mat_from_row_vec(bot));
-}
-
-__isl_give isl_mat *isl_mat_move_cols(__isl_take isl_mat *mat,
-	unsigned dst_col, unsigned src_col, unsigned n)
-{
-	isl_mat *res;
-
-	if (!mat)
-		return NULL;
-	if (n == 0 || dst_col == src_col)
-		return mat;
-
-	res = isl_mat_alloc(mat->ctx, mat->n_row, mat->n_col);
-	if (!res)
-		goto error;
-
-	if (dst_col < src_col) {
-		isl_mat_sub_copy(res->ctx, res->row, mat->row, mat->n_row,
-				 0, 0, dst_col);
-		isl_mat_sub_copy(res->ctx, res->row, mat->row, mat->n_row,
-				 dst_col, src_col, n);
-		isl_mat_sub_copy(res->ctx, res->row, mat->row, mat->n_row,
-				 dst_col + n, dst_col, src_col - dst_col);
-		isl_mat_sub_copy(res->ctx, res->row, mat->row, mat->n_row,
-				 src_col + n, src_col + n,
-				 res->n_col - src_col - n);
-	} else {
-		isl_mat_sub_copy(res->ctx, res->row, mat->row, mat->n_row,
-				 0, 0, src_col);
-		isl_mat_sub_copy(res->ctx, res->row, mat->row, mat->n_row,
-				 src_col, src_col + n, dst_col - src_col);
-		isl_mat_sub_copy(res->ctx, res->row, mat->row, mat->n_row,
-				 dst_col, src_col, n);
-		isl_mat_sub_copy(res->ctx, res->row, mat->row, mat->n_row,
-				 dst_col + n, dst_col + n,
-				 res->n_col - dst_col - n);
-	}
-	isl_mat_free(mat);
-
-	return res;
-error:
-	isl_mat_free(mat);
-	return NULL;
-}
-
-void isl_mat_gcd(__isl_keep isl_mat *mat, isl_int *gcd)
-{
-	int i;
-	isl_int g;
-
-	isl_int_set_si(*gcd, 0);
-	if (!mat)
-		return;
-
-	isl_int_init(g);
-	for (i = 0; i < mat->n_row; ++i) {
-		isl_seq_gcd(mat->row[i], mat->n_col, &g);
-		isl_int_gcd(*gcd, *gcd, g);
-	}
-	isl_int_clear(g);
-}
-
-__isl_give isl_mat *isl_mat_scale_down(__isl_take isl_mat *mat, isl_int m)
-{
-	int i;
-
-	if (isl_int_is_one(m))
-		return mat;
-
-	mat = isl_mat_cow(mat);
-	if (!mat)
-		return NULL;
-
-	for (i = 0; i < mat->n_row; ++i)
-		isl_seq_scale_down(mat->row[i], mat->row[i], m, mat->n_col);
-
-	return mat;
-}
-
-__isl_give isl_mat *isl_mat_normalize(__isl_take isl_mat *mat)
-{
-	isl_int gcd;
-
-	if (!mat)
-		return NULL;
-
-	isl_int_init(gcd);
-	isl_mat_gcd(mat, &gcd);
-	mat = isl_mat_scale_down(mat, gcd);
-	isl_int_clear(gcd);
-
-	return mat;
-}
-
-__isl_give isl_mat *isl_mat_normalize_row(__isl_take isl_mat *mat, int row)
-{
-	mat = isl_mat_cow(mat);
-	if (!mat)
-		return NULL;
-
-	isl_seq_normalize(mat->ctx, mat->row[row], mat->n_col);
-
-	return mat;
-}
-
-/* Number of initial non-zero columns.
- */
-int isl_mat_initial_non_zero_cols(__isl_keep isl_mat *mat)
-{
-	int i;
-
-	if (!mat)
-		return -1;
-
-	for (i = 0; i < mat->n_col; ++i)
-		if (row_first_non_zero(mat->row, mat->n_row, i) < 0)
-			break;
-
-	return i;
-}
diff --git a/cloog-0.17.0/isl/isl_mat_private.h b/cloog-0.17.0/isl/isl_mat_private.h
deleted file mode 100644
index f27f29a..0000000
--- a/cloog-0.17.0/isl/isl_mat_private.h
+++ /dev/null
@@ -1,30 +0,0 @@
-#include <isl/mat.h>
-
-struct isl_mat {
-	int ref;
-
-	struct isl_ctx *ctx;
-
-#define ISL_MAT_BORROWED		(1 << 0)
-	unsigned flags;
-
-	unsigned n_row;
-	unsigned n_col;
-
-	isl_int **row;
-
-	/* actual size of the rows in memory; n_col <= max_col */
-	unsigned max_col;
-
-	struct isl_blk block;
-};
-
-__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,
-	unsigned first_row, unsigned n_row, unsigned first_col, unsigned n_col);
-void isl_mat_sub_copy(struct isl_ctx *ctx, isl_int **dst, isl_int **src,
-	unsigned n_row, unsigned dst_col, unsigned src_col, unsigned n_col);
-void isl_mat_sub_neg(struct isl_ctx *ctx, isl_int **dst, isl_int **src,
-	unsigned n_row, unsigned dst_col, unsigned src_col, unsigned n_col);
-__isl_give isl_mat *isl_mat_diag(isl_ctx *ctx, unsigned n_row, isl_int d);
diff --git a/cloog-0.17.0/isl/isl_morph.c b/cloog-0.17.0/isl/isl_morph.c
deleted file mode 100644
index 69aabab..0000000
--- a/cloog-0.17.0/isl/isl_morph.c
+++ /dev/null
@@ -1,817 +0,0 @@
-/*
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France 
- */
-
-#include <isl_map_private.h>
-#include <isl_morph.h>
-#include <isl/seq.h>
-#include <isl_mat_private.h>
-#include <isl_space_private.h>
-#include <isl_equalities.h>
-
-__isl_give isl_morph *isl_morph_alloc(
-	__isl_take isl_basic_set *dom, __isl_take isl_basic_set *ran,
-	__isl_take isl_mat *map, __isl_take isl_mat *inv)
-{
-	isl_morph *morph;
-
-	if (!dom || !ran || !map || !inv)
-		goto error;
-
-	morph = isl_alloc_type(dom->ctx, struct isl_morph);
-	if (!morph)
-		goto error;
-
-	morph->ref = 1;
-	morph->dom = dom;
-	morph->ran = ran;
-	morph->map = map;
-	morph->inv = inv;
-
-	return morph;
-error:
-	isl_basic_set_free(dom);
-	isl_basic_set_free(ran);
-	isl_mat_free(map);
-	isl_mat_free(inv);
-	return NULL;
-}
-
-__isl_give isl_morph *isl_morph_copy(__isl_keep isl_morph *morph)
-{
-	if (!morph)
-		return NULL;
-
-	morph->ref++;
-	return morph;
-}
-
-__isl_give isl_morph *isl_morph_dup(__isl_keep isl_morph *morph)
-{
-	if (!morph)
-		return NULL;
-
-	return isl_morph_alloc(isl_basic_set_copy(morph->dom),
-		isl_basic_set_copy(morph->ran),
-		isl_mat_copy(morph->map), isl_mat_copy(morph->inv));
-}
-
-__isl_give isl_morph *isl_morph_cow(__isl_take isl_morph *morph)
-{
-	if (!morph)
-		return NULL;
-
-	if (morph->ref == 1)
-		return morph;
-	morph->ref--;
-	return isl_morph_dup(morph);
-}
-
-void isl_morph_free(__isl_take isl_morph *morph)
-{
-	if (!morph)
-		return;
-
-	if (--morph->ref > 0)
-		return;
-
-	isl_basic_set_free(morph->dom);
-	isl_basic_set_free(morph->ran);
-	isl_mat_free(morph->map);
-	isl_mat_free(morph->inv);
-	free(morph);
-}
-
-__isl_give isl_space *isl_morph_get_ran_space(__isl_keep isl_morph *morph)
-{
-	if (!morph)
-		return NULL;
-	
-	return isl_space_copy(morph->ran->dim);
-}
-
-unsigned isl_morph_dom_dim(__isl_keep isl_morph *morph, enum isl_dim_type type)
-{
-	if (!morph)
-		return 0;
-
-	return isl_basic_set_dim(morph->dom, type);
-}
-
-unsigned isl_morph_ran_dim(__isl_keep isl_morph *morph, enum isl_dim_type type)
-{
-	if (!morph)
-		return 0;
-
-	return isl_basic_set_dim(morph->ran, type);
-}
-
-__isl_give isl_morph *isl_morph_remove_dom_dims(__isl_take isl_morph *morph,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	unsigned dom_offset;
-
-	if (n == 0)
-		return morph;
-
-	morph = isl_morph_cow(morph);
-	if (!morph)
-		return NULL;
-
-	dom_offset = 1 + isl_space_offset(morph->dom->dim, type);
-
-	morph->dom = isl_basic_set_remove_dims(morph->dom, type, first, n);
-
-	morph->map = isl_mat_drop_cols(morph->map, dom_offset + first, n);
-
-	morph->inv = isl_mat_drop_rows(morph->inv, dom_offset + first, n);
-
-	if (morph->dom && morph->ran && morph->map && morph->inv)
-		return morph;
-
-	isl_morph_free(morph);
-	return NULL;
-}
-
-__isl_give isl_morph *isl_morph_remove_ran_dims(__isl_take isl_morph *morph,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	unsigned ran_offset;
-
-	if (n == 0)
-		return morph;
-
-	morph = isl_morph_cow(morph);
-	if (!morph)
-		return NULL;
-
-	ran_offset = 1 + isl_space_offset(morph->ran->dim, type);
-
-	morph->ran = isl_basic_set_remove_dims(morph->ran, type, first, n);
-
-	morph->map = isl_mat_drop_rows(morph->map, ran_offset + first, n);
-
-	morph->inv = isl_mat_drop_cols(morph->inv, ran_offset + first, n);
-
-	if (morph->dom && morph->ran && morph->map && morph->inv)
-		return morph;
-
-	isl_morph_free(morph);
-	return NULL;
-}
-
-/* Project domain of morph onto its parameter domain.
- */
-__isl_give isl_morph *isl_morph_dom_params(__isl_take isl_morph *morph)
-{
-	unsigned n;
-
-	if (!morph)
-		return NULL;
-	n = isl_basic_set_dim(morph->dom, isl_dim_set);
-	morph = isl_morph_remove_dom_dims(morph, isl_dim_set, 0, n);
-	if (!morph)
-		return NULL;
-	morph->dom = isl_basic_set_params(morph->dom);
-	if (morph->dom)
-		return morph;
-
-	isl_morph_free(morph);
-	return NULL;
-}
-
-/* Project range of morph onto its parameter domain.
- */
-__isl_give isl_morph *isl_morph_ran_params(__isl_take isl_morph *morph)
-{
-	unsigned n;
-
-	if (!morph)
-		return NULL;
-	n = isl_basic_set_dim(morph->ran, isl_dim_set);
-	morph = isl_morph_remove_ran_dims(morph, isl_dim_set, 0, n);
-	if (!morph)
-		return NULL;
-	morph->ran = isl_basic_set_params(morph->ran);
-	if (morph->ran)
-		return morph;
-
-	isl_morph_free(morph);
-	return NULL;
-}
-
-void isl_morph_dump(__isl_take isl_morph *morph, FILE *out)
-{
-	if (!morph)
-		return;
-
-	isl_basic_set_print(morph->dom, out, 0, "", "", ISL_FORMAT_ISL);
-	isl_basic_set_print(morph->ran, out, 0, "", "", ISL_FORMAT_ISL);
-	isl_mat_print_internal(morph->map, out, 4);
-	isl_mat_print_internal(morph->inv, out, 4);
-}
-
-__isl_give isl_morph *isl_morph_identity(__isl_keep isl_basic_set *bset)
-{
-	isl_mat *id;
-	isl_basic_set *universe;
-	unsigned total;
-
-	if (!bset)
-		return NULL;
-
-	total = isl_basic_set_total_dim(bset);
-	id = isl_mat_identity(bset->ctx, 1 + total);
-	universe = isl_basic_set_universe(isl_space_copy(bset->dim));
-
-	return isl_morph_alloc(universe, isl_basic_set_copy(universe),
-		id, isl_mat_copy(id));
-}
-
-/* Create a(n identity) morphism between empty sets of the same dimension
- * a "bset".
- */
-__isl_give isl_morph *isl_morph_empty(__isl_keep isl_basic_set *bset)
-{
-	isl_mat *id;
-	isl_basic_set *empty;
-	unsigned total;
-
-	if (!bset)
-		return NULL;
-
-	total = isl_basic_set_total_dim(bset);
-	id = isl_mat_identity(bset->ctx, 1 + total);
-	empty = isl_basic_set_empty(isl_space_copy(bset->dim));
-
-	return isl_morph_alloc(empty, isl_basic_set_copy(empty),
-		id, isl_mat_copy(id));
-}
-
-/* Given a matrix that maps a (possibly) parametric domain to
- * a parametric domain, add in rows that map the "nparam" parameters onto
- * themselves.
- */
-static __isl_give isl_mat *insert_parameter_rows(__isl_take isl_mat *mat,
-	unsigned nparam)
-{
-	int i;
-
-	if (nparam == 0)
-		return mat;
-	if (!mat)
-		return NULL;
-
-	mat = isl_mat_insert_rows(mat, 1, nparam);
-	if (!mat)
-		return NULL;
-
-	for (i = 0; i < nparam; ++i) {
-		isl_seq_clr(mat->row[1 + i], mat->n_col);
-		isl_int_set(mat->row[1 + i][1 + i], mat->row[0][0]);
-	}
-
-	return mat;
-}
-
-/* Construct a basic set described by the "n" equalities of "bset" starting
- * at "first".
- */
-static __isl_give isl_basic_set *copy_equalities(__isl_keep isl_basic_set *bset,
-	unsigned first, unsigned n)
-{
-	int i, k;
-	isl_basic_set *eq;
-	unsigned total;
-
-	isl_assert(bset->ctx, bset->n_div == 0, return NULL);
-
-	total = isl_basic_set_total_dim(bset);
-	eq = isl_basic_set_alloc_space(isl_space_copy(bset->dim), 0, n, 0);
-	if (!eq)
-		return NULL;
-	for (i = 0; i < n; ++i) {
-		k = isl_basic_set_alloc_equality(eq);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(eq->eq[k], bset->eq[first + k], 1 + total);
-	}
-
-	return eq;
-error:
-	isl_basic_set_free(eq);
-	return NULL;
-}
-
-/* Given a basic set, exploit the equalties in the a basic set to construct
- * a morphishm that maps the basic set to a lower-dimensional space.
- * Specifically, the morphism reduces the number of dimensions of type "type".
- *
- * This function is a slight generalization of isl_mat_variable_compression
- * in that it allows the input to be parametric and that it allows for the
- * compression of either parameters or set variables.
- *
- * We first select the equalities of interest, that is those that involve
- * variables of type "type" and no later variables.
- * Denote those equalities as
- *
- *		-C(p) + M x = 0
- *
- * where C(p) depends on the parameters if type == isl_dim_set and
- * is a constant if type == isl_dim_param.
- *
- * First compute the (left) Hermite normal form of M,
- *
- *		M [U1 U2] = M U = H = [H1 0]
- * or
- *		              M = H Q = [H1 0] [Q1]
- *                                             [Q2]
- *
- * with U, Q unimodular, Q = U^{-1} (and H lower triangular).
- * Define the transformed variables as
- *
- *		x = [U1 U2] [ x1' ] = [U1 U2] [Q1] x
- *		            [ x2' ]           [Q2]
- *
- * The equalities then become
- *
- *		-C(p) + H1 x1' = 0   or   x1' = H1^{-1} C(p) = C'(p)
- *
- * If the denominator of the constant term does not divide the
- * the common denominator of the parametric terms, then every
- * integer point is mapped to a non-integer point and then the original set has no
- * integer solutions (since the x' are a unimodular transformation
- * of the x).  In this case, an empty morphism is returned.
- * Otherwise, the transformation is given by
- *
- *		x = U1 H1^{-1} C(p) + U2 x2'
- *
- * The inverse transformation is simply
- *
- *		x2' = Q2 x
- *
- * Both matrices are extended to map the full original space to the full
- * compressed space.
- */
-__isl_give isl_morph *isl_basic_set_variable_compression(
-	__isl_keep isl_basic_set *bset, enum isl_dim_type type)
-{
-	unsigned otype;
-	unsigned ntype;
-	unsigned orest;
-	unsigned nrest;
-	int f_eq, n_eq;
-	isl_space *dim;
-	isl_mat *H, *U, *Q, *C = NULL, *H1, *U1, *U2;
-	isl_basic_set *dom, *ran;
-
-	if (!bset)
-		return NULL;
-
-	if (isl_basic_set_plain_is_empty(bset))
-		return isl_morph_empty(bset);
-
-	isl_assert(bset->ctx, bset->n_div == 0, return NULL);
-
-	otype = 1 + isl_space_offset(bset->dim, type);
-	ntype = isl_basic_set_dim(bset, type);
-	orest = otype + ntype;
-	nrest = isl_basic_set_total_dim(bset) - (orest - 1);
-
-	for (f_eq = 0; f_eq < bset->n_eq; ++f_eq)
-		if (isl_seq_first_non_zero(bset->eq[f_eq] + orest, nrest) == -1)
-			break;
-	for (n_eq = 0; f_eq + n_eq < bset->n_eq; ++n_eq)
-		if (isl_seq_first_non_zero(bset->eq[f_eq + n_eq] + otype, ntype) == -1)
-			break;
-	if (n_eq == 0)
-		return isl_morph_identity(bset);
-
-	H = isl_mat_sub_alloc6(bset->ctx, bset->eq, f_eq, n_eq, otype, ntype);
-	H = isl_mat_left_hermite(H, 0, &U, &Q);
-	if (!H || !U || !Q)
-		goto error;
-	Q = isl_mat_drop_rows(Q, 0, n_eq);
-	Q = isl_mat_diagonal(isl_mat_identity(bset->ctx, otype), Q);
-	Q = isl_mat_diagonal(Q, isl_mat_identity(bset->ctx, nrest));
-	C = isl_mat_alloc(bset->ctx, 1 + n_eq, otype);
-	if (!C)
-		goto error;
-	isl_int_set_si(C->row[0][0], 1);
-	isl_seq_clr(C->row[0] + 1, otype - 1);
-	isl_mat_sub_neg(C->ctx, C->row + 1, bset->eq + f_eq, n_eq, 0, 0, otype);
-	H1 = isl_mat_sub_alloc(H, 0, H->n_row, 0, H->n_row);
-	H1 = isl_mat_lin_to_aff(H1);
-	C = isl_mat_inverse_product(H1, C);
-	if (!C)
-		goto error;
-	isl_mat_free(H);
-
-	if (!isl_int_is_one(C->row[0][0])) {
-		int i;
-		isl_int g;
-
-		isl_int_init(g);
-		for (i = 0; i < n_eq; ++i) {
-			isl_seq_gcd(C->row[1 + i] + 1, otype - 1, &g);
-			isl_int_gcd(g, g, C->row[0][0]);
-			if (!isl_int_is_divisible_by(C->row[1 + i][0], g))
-				break;
-		}
-		isl_int_clear(g);
-
-		if (i < n_eq) {
-			isl_mat_free(C);
-			isl_mat_free(U);
-			isl_mat_free(Q);
-			return isl_morph_empty(bset);
-		}
-
-		C = isl_mat_normalize(C);
-	}
-
-	U1 = isl_mat_sub_alloc(U, 0, U->n_row, 0, n_eq);
-	U1 = isl_mat_lin_to_aff(U1);
-	U2 = isl_mat_sub_alloc(U, 0, U->n_row, n_eq, U->n_row - n_eq);
-	U2 = isl_mat_lin_to_aff(U2);
-	isl_mat_free(U);
-
-	C = isl_mat_product(U1, C);
-	C = isl_mat_aff_direct_sum(C, U2);
-	C = insert_parameter_rows(C, otype - 1);
-	C = isl_mat_diagonal(C, isl_mat_identity(bset->ctx, nrest));
-
-	dim = isl_space_copy(bset->dim);
-	dim = isl_space_drop_dims(dim, type, 0, ntype);
-	dim = isl_space_add_dims(dim, type, ntype - n_eq);
-	ran = isl_basic_set_universe(dim);
-	dom = copy_equalities(bset, f_eq, n_eq);
-
-	return isl_morph_alloc(dom, ran, Q, C);
-error:
-	isl_mat_free(C);
-	isl_mat_free(H);
-	isl_mat_free(U);
-	isl_mat_free(Q);
-	return NULL;
-}
-
-/* Construct a parameter compression for "bset".
- * We basically just call isl_mat_parameter_compression with the right input
- * and then extend the resulting matrix to include the variables.
- *
- * Let the equalities be given as
- *
- *	B(p) + A x = 0
- *
- * and let [H 0] be the Hermite Normal Form of A, then
- *
- *	H^-1 B(p)
- *
- * needs to be integer, so we impose that each row is divisible by
- * the denominator.
- */
-__isl_give isl_morph *isl_basic_set_parameter_compression(
-	__isl_keep isl_basic_set *bset)
-{
-	unsigned nparam;
-	unsigned nvar;
-	int n_eq;
-	isl_mat *H, *B;
-	isl_vec *d;
-	isl_mat *map, *inv;
-	isl_basic_set *dom, *ran;
-
-	if (!bset)
-		return NULL;
-
-	if (isl_basic_set_plain_is_empty(bset))
-		return isl_morph_empty(bset);
-	if (bset->n_eq == 0)
-		return isl_morph_identity(bset);
-
-	isl_assert(bset->ctx, bset->n_div == 0, return NULL);
-
-	n_eq = bset->n_eq;
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-
-	isl_assert(bset->ctx, n_eq <= nvar, return NULL);
-
-	d = isl_vec_alloc(bset->ctx, n_eq);
-	B = isl_mat_sub_alloc6(bset->ctx, bset->eq, 0, n_eq, 0, 1 + nparam);
-	H = isl_mat_sub_alloc6(bset->ctx, bset->eq, 0, n_eq, 1 + nparam, nvar);
-	H = isl_mat_left_hermite(H, 0, NULL, NULL);
-	H = isl_mat_drop_cols(H, n_eq, nvar - n_eq);
-	H = isl_mat_lin_to_aff(H);
-	H = isl_mat_right_inverse(H);
-	if (!H || !d)
-		goto error;
-	isl_seq_set(d->el, H->row[0][0], d->size);
-	H = isl_mat_drop_rows(H, 0, 1);
-	H = isl_mat_drop_cols(H, 0, 1);
-	B = isl_mat_product(H, B);
-	inv = isl_mat_parameter_compression(B, d);
-	inv = isl_mat_diagonal(inv, isl_mat_identity(bset->ctx, nvar));
-	map = isl_mat_right_inverse(isl_mat_copy(inv));
-
-	dom = isl_basic_set_universe(isl_space_copy(bset->dim));
-	ran = isl_basic_set_universe(isl_space_copy(bset->dim));
-
-	return isl_morph_alloc(dom, ran, map, inv);
-error:
-	isl_mat_free(H);
-	isl_mat_free(B);
-	isl_vec_free(d);
-	return NULL;
-}
-
-/* Add stride constraints to "bset" based on the inverse mapping
- * that was plugged in.  In particular, if morph maps x' to x,
- * the the constraints of the original input
- *
- *	A x' + b >= 0
- *
- * have been rewritten to
- *
- *	A inv x + b >= 0
- *
- * However, this substitution may loose information on the integrality of x',
- * so we need to impose that
- *
- *	inv x
- *
- * is integral.  If inv = B/d, this means that we need to impose that
- *
- *	B x = 0		mod d
- *
- * or
- *
- *	exists alpha in Z^m: B x = d alpha
- *
- */
-static __isl_give isl_basic_set *add_strides(__isl_take isl_basic_set *bset,
-	__isl_keep isl_morph *morph)
-{
-	int i, div, k;
-	isl_int gcd;
-
-	if (isl_int_is_one(morph->inv->row[0][0]))
-		return bset;
-
-	isl_int_init(gcd);
-
-	for (i = 0; 1 + i < morph->inv->n_row; ++i) {
-		isl_seq_gcd(morph->inv->row[1 + i], morph->inv->n_col, &gcd);
-		if (isl_int_is_divisible_by(gcd, morph->inv->row[0][0]))
-			continue;
-		div = isl_basic_set_alloc_div(bset);
-		if (div < 0)
-			goto error;
-		k = isl_basic_set_alloc_equality(bset);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(bset->eq[k], morph->inv->row[1 + i],
-			    morph->inv->n_col);
-		isl_seq_clr(bset->eq[k] + morph->inv->n_col, bset->n_div);
-		isl_int_set(bset->eq[k][morph->inv->n_col + div],
-			    morph->inv->row[0][0]);
-	}
-
-	isl_int_clear(gcd);
-
-	return bset;
-error:
-	isl_int_clear(gcd);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Apply the morphism to the basic set.
- * We basically just compute the preimage of "bset" under the inverse mapping
- * in morph, add in stride constraints and intersect with the range
- * of the morphism.
- */
-__isl_give isl_basic_set *isl_morph_basic_set(__isl_take isl_morph *morph,
-	__isl_take isl_basic_set *bset)
-{
-	isl_basic_set *res = NULL;
-	isl_mat *mat = NULL;
-	int i, k;
-	int max_stride;
-
-	if (!morph || !bset)
-		goto error;
-
-	isl_assert(bset->ctx, isl_space_is_equal(bset->dim, morph->dom->dim),
-		    goto error);
-
-	max_stride = morph->inv->n_row - 1;
-	if (isl_int_is_one(morph->inv->row[0][0]))
-		max_stride = 0;
-	res = isl_basic_set_alloc_space(isl_space_copy(morph->ran->dim),
-		bset->n_div + max_stride, bset->n_eq + max_stride, bset->n_ineq);
-
-	for (i = 0; i < bset->n_div; ++i)
-		if (isl_basic_set_alloc_div(res) < 0)
-			goto error;
-
-	mat = isl_mat_sub_alloc6(bset->ctx, bset->eq, 0, bset->n_eq,
-					0, morph->inv->n_row);
-	mat = isl_mat_product(mat, isl_mat_copy(morph->inv));
-	if (!mat)
-		goto error;
-	for (i = 0; i < bset->n_eq; ++i) {
-		k = isl_basic_set_alloc_equality(res);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(res->eq[k], mat->row[i], mat->n_col);
-		isl_seq_scale(res->eq[k] + mat->n_col, bset->eq[i] + mat->n_col,
-				morph->inv->row[0][0], bset->n_div);
-	}
-	isl_mat_free(mat);
-
-	mat = isl_mat_sub_alloc6(bset->ctx, bset->ineq, 0, bset->n_ineq,
-					0, morph->inv->n_row);
-	mat = isl_mat_product(mat, isl_mat_copy(morph->inv));
-	if (!mat)
-		goto error;
-	for (i = 0; i < bset->n_ineq; ++i) {
-		k = isl_basic_set_alloc_inequality(res);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(res->ineq[k], mat->row[i], mat->n_col);
-		isl_seq_scale(res->ineq[k] + mat->n_col,
-				bset->ineq[i] + mat->n_col,
-				morph->inv->row[0][0], bset->n_div);
-	}
-	isl_mat_free(mat);
-
-	mat = isl_mat_sub_alloc6(bset->ctx, bset->div, 0, bset->n_div,
-					1, morph->inv->n_row);
-	mat = isl_mat_product(mat, isl_mat_copy(morph->inv));
-	if (!mat)
-		goto error;
-	for (i = 0; i < bset->n_div; ++i) {
-		isl_int_mul(res->div[i][0],
-				morph->inv->row[0][0], bset->div[i][0]);
-		isl_seq_cpy(res->div[i] + 1, mat->row[i], mat->n_col);
-		isl_seq_scale(res->div[i] + 1 + mat->n_col,
-				bset->div[i] + 1 + mat->n_col,
-				morph->inv->row[0][0], bset->n_div);
-	}
-	isl_mat_free(mat);
-
-	res = add_strides(res, morph);
-
-	if (isl_basic_set_is_rational(bset))
-		res = isl_basic_set_set_rational(res);
-
-	res = isl_basic_set_simplify(res);
-	res = isl_basic_set_finalize(res);
-
-	res = isl_basic_set_intersect(res, isl_basic_set_copy(morph->ran));
-
-	isl_morph_free(morph);
-	isl_basic_set_free(bset);
-	return res;
-error:
-	isl_mat_free(mat);
-	isl_morph_free(morph);
-	isl_basic_set_free(bset);
-	isl_basic_set_free(res);
-	return NULL;
-}
-
-/* Apply the morphism to the set.
- */
-__isl_give isl_set *isl_morph_set(__isl_take isl_morph *morph,
-	__isl_take isl_set *set)
-{
-	int i;
-
-	if (!morph || !set)
-		goto error;
-
-	isl_assert(set->ctx, isl_space_is_equal(set->dim, morph->dom->dim), goto error);
-
-	set = isl_set_cow(set);
-	if (!set)
-		goto error;
-
-	isl_space_free(set->dim);
-	set->dim = isl_space_copy(morph->ran->dim);
-	if (!set->dim)
-		goto error;
-
-	for (i = 0; i < set->n; ++i) {
-		set->p[i] = isl_morph_basic_set(isl_morph_copy(morph), set->p[i]);
-		if (!set->p[i])
-			goto error;
-	}
-
-	isl_morph_free(morph);
-
-	ISL_F_CLR(set, ISL_SET_NORMALIZED);
-
-	return set;
-error:
-	isl_set_free(set);
-	isl_morph_free(morph);
-	return NULL;
-}
-
-/* Construct a morphism that first does morph2 and then morph1.
- */
-__isl_give isl_morph *isl_morph_compose(__isl_take isl_morph *morph1,
-	__isl_take isl_morph *morph2)
-{
-	isl_mat *map, *inv;
-	isl_basic_set *dom, *ran;
-
-	if (!morph1 || !morph2)
-		goto error;
-
-	map = isl_mat_product(isl_mat_copy(morph1->map), isl_mat_copy(morph2->map));
-	inv = isl_mat_product(isl_mat_copy(morph2->inv), isl_mat_copy(morph1->inv));
-	dom = isl_morph_basic_set(isl_morph_inverse(isl_morph_copy(morph2)),
-				  isl_basic_set_copy(morph1->dom));
-	dom = isl_basic_set_intersect(dom, isl_basic_set_copy(morph2->dom));
-	ran = isl_morph_basic_set(isl_morph_copy(morph1),
-				  isl_basic_set_copy(morph2->ran));
-	ran = isl_basic_set_intersect(ran, isl_basic_set_copy(morph1->ran));
-
-	isl_morph_free(morph1);
-	isl_morph_free(morph2);
-
-	return isl_morph_alloc(dom, ran, map, inv);
-error:
-	isl_morph_free(morph1);
-	isl_morph_free(morph2);
-	return NULL;
-}
-
-__isl_give isl_morph *isl_morph_inverse(__isl_take isl_morph *morph)
-{
-	isl_basic_set *bset;
-	isl_mat *mat;
-
-	morph = isl_morph_cow(morph);
-	if (!morph)
-		return NULL;
-
-	bset = morph->dom;
-	morph->dom = morph->ran;
-	morph->ran = bset;
-
-	mat = morph->map;
-	morph->map = morph->inv;
-	morph->inv = mat;
-
-	return morph;
-}
-
-__isl_give isl_morph *isl_basic_set_full_compression(
-	__isl_keep isl_basic_set *bset)
-{
-	isl_morph *morph, *morph2;
-
-	bset = isl_basic_set_copy(bset);
-
-	morph = isl_basic_set_variable_compression(bset, isl_dim_param);
-	bset = isl_morph_basic_set(isl_morph_copy(morph), bset);
-
-	morph2 = isl_basic_set_parameter_compression(bset);
-	bset = isl_morph_basic_set(isl_morph_copy(morph2), bset);
-
-	morph = isl_morph_compose(morph2, morph);
-
-	morph2 = isl_basic_set_variable_compression(bset, isl_dim_set);
-	isl_basic_set_free(bset);
-
-	morph = isl_morph_compose(morph2, morph);
-
-	return morph;
-}
-
-__isl_give isl_vec *isl_morph_vec(__isl_take isl_morph *morph,
-	__isl_take isl_vec *vec)
-{
-	if (!morph)
-		goto error;
-
-	vec = isl_mat_vec_product(isl_mat_copy(morph->map), vec);
-
-	isl_morph_free(morph);
-	return vec;
-error:
-	isl_morph_free(morph);
-	isl_vec_free(vec);
-	return NULL;
-}
diff --git a/cloog-0.17.0/isl/isl_morph.h b/cloog-0.17.0/isl/isl_morph.h
deleted file mode 100644
index 3723448..0000000
--- a/cloog-0.17.0/isl/isl_morph.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France 
- */
-
-#ifndef ISL_MORHP_H
-#define ISL_MORHP_H
-
-#include <stdio.h>
-#include <isl/space.h>
-#include <isl/mat.h>
-#include <isl/set.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/* An isl_morph is a "morphism" on (basic) sets.
- * "map" is an affine mapping from "dom" to "ran"
- * and "inv" is the inverse mapping.
- */
-struct isl_morph {
-	int ref;
-
-	isl_basic_set *dom;
-	isl_basic_set *ran;
-
-	isl_mat *map;
-	isl_mat *inv;
-};
-typedef struct isl_morph isl_morph;
-
-__isl_give isl_morph *isl_morph_alloc(
-	__isl_take isl_basic_set *dom, __isl_take isl_basic_set *ran,
-	__isl_take isl_mat *map, __isl_take isl_mat *inv);
-__isl_give isl_morph *isl_morph_copy(__isl_keep isl_morph *morph);
-__isl_give isl_morph *isl_morph_identity(__isl_keep isl_basic_set *bset);
-void isl_morph_free(__isl_take isl_morph *morph);
-
-__isl_give isl_space *isl_morph_get_ran_space(__isl_keep isl_morph *morph);
-unsigned isl_morph_dom_dim(__isl_keep isl_morph *morph, enum isl_dim_type type);
-unsigned isl_morph_ran_dim(__isl_keep isl_morph *morph, enum isl_dim_type type);
-
-__isl_give isl_morph *isl_morph_remove_dom_dims(__isl_take isl_morph *morph,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_morph *isl_morph_remove_ran_dims(__isl_take isl_morph *morph,
-	enum isl_dim_type type, unsigned first, unsigned n);
-__isl_give isl_morph *isl_morph_dom_params(__isl_take isl_morph *morph);
-__isl_give isl_morph *isl_morph_ran_params(__isl_take isl_morph *morph);
-
-__isl_give isl_morph *isl_morph_compose(__isl_take isl_morph *morph1,
-	__isl_take isl_morph *morph2);
-__isl_give isl_morph *isl_morph_inverse(__isl_take isl_morph *morph);
-
-void isl_morph_dump(__isl_take isl_morph *morph, FILE *out);
-
-__isl_give isl_morph *isl_basic_set_variable_compression(
-	__isl_keep isl_basic_set *bset, enum isl_dim_type type);
-__isl_give isl_morph *isl_basic_set_parameter_compression(
-	__isl_keep isl_basic_set *bset);
-__isl_give isl_morph *isl_basic_set_full_compression(
-	__isl_keep isl_basic_set *bset);
-
-__isl_give isl_basic_set *isl_morph_basic_set(__isl_take isl_morph *morph,
-	__isl_take isl_basic_set *bset);
-__isl_give isl_set *isl_morph_set(__isl_take isl_morph *morph,
-	__isl_take isl_set *set);
-__isl_give isl_vec *isl_morph_vec(__isl_take isl_morph *morph,
-	__isl_take isl_vec *vec);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_multi_templ.c b/cloog-0.17.0/isl/isl_multi_templ.c
deleted file mode 100644
index a60b7d4..0000000
--- a/cloog-0.17.0/isl/isl_multi_templ.c
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- * Copyright 2011      Sven Verdoolaege
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- */
-
-#define xCAT(A,B) A ## B
-#define CAT(A,B) xCAT(A,B)
-#undef EL
-#define EL CAT(isl_,BASE)
-#define xFN(TYPE,NAME) TYPE ## _ ## NAME
-#define FN(TYPE,NAME) xFN(TYPE,NAME)
-#define xMULTI(BASE) isl_multi_ ## BASE
-#define MULTI(BASE) xMULTI(BASE)
-#define MULTI_NAME(BASE) "isl_multi_" #BASE
-#define xLIST(EL) EL ## _list
-#define LIST(EL) xLIST(EL)
-
-isl_ctx *FN(MULTI(BASE),get_ctx)(__isl_keep MULTI(BASE) *multi)
-{
-	return multi ? isl_space_get_ctx(multi->space) : NULL;
-}
-
-__isl_give isl_space *FN(MULTI(BASE),get_space)(__isl_keep MULTI(BASE) *multi)
-{
-	return multi ? isl_space_copy(multi->space) : NULL;
-}
-
-__isl_give isl_space *FN(MULTI(BASE),get_domain_space)(
-	__isl_keep MULTI(BASE) *multi)
-{
-	return multi ? isl_space_domain(isl_space_copy(multi->space)) : NULL;
-}
-
-__isl_give MULTI(BASE) *FN(MULTI(BASE),alloc)(__isl_take isl_space *space)
-{
-	isl_ctx *ctx;
-	int n;
-	MULTI(BASE) *multi;
-
-	if (!space)
-		return NULL;
-
-	ctx = isl_space_get_ctx(space);
-	n = isl_space_dim(space, isl_dim_out);
-	multi = isl_calloc(ctx, MULTI(BASE),
-			 sizeof(MULTI(BASE)) + (n - 1) * sizeof(struct EL *));
-	if (!multi)
-		goto error;
-
-	multi->space = space;
-	multi->n = n;
-	multi->ref = 1;
-	return multi;
-error:
-	isl_space_free(space);
-	return NULL;
-}
-
-__isl_give MULTI(BASE) *FN(MULTI(BASE),dup)(__isl_keep MULTI(BASE) *multi)
-{
-	int i;
-	MULTI(BASE) *dup;
-
-	if (!multi)
-		return NULL;
-
-	dup = FN(MULTI(BASE),alloc)(isl_space_copy(multi->space));
-	if (!dup)
-		return NULL;
-
-	for (i = 0; i < multi->n; ++i)
-		dup = FN(FN(MULTI(BASE),set),BASE)(dup, i,
-						    FN(EL,copy)(multi->p[i]));
-
-	return dup;
-}
-
-__isl_give MULTI(BASE) *FN(MULTI(BASE),cow)(__isl_take MULTI(BASE) *multi)
-{
-	if (!multi)
-		return NULL;
-
-	if (multi->ref == 1)
-		return multi;
-
-	multi->ref--;
-	return FN(MULTI(BASE),dup)(multi);
-}
-
-__isl_give MULTI(BASE) *FN(MULTI(BASE),copy)(__isl_keep MULTI(BASE) *multi)
-{
-	if (!multi)
-		return NULL;
-
-	multi->ref++;
-	return multi;
-}
-
-void *FN(MULTI(BASE),free)(__isl_take MULTI(BASE) *multi)
-{
-	int i;
-
-	if (!multi)
-		return NULL;
-
-	if (--multi->ref > 0)
-		return NULL;
-
-	isl_space_free(multi->space);
-	for (i = 0; i < multi->n; ++i)
-		FN(EL,free)(multi->p[i]);
-	free(multi);
-
-	return NULL;
-}
-
-unsigned FN(MULTI(BASE),dim)(__isl_keep MULTI(BASE) *multi,
-	enum isl_dim_type type)
-{
-	return multi ? isl_space_dim(multi->space, type) : 0;
-}
-
-const char *FN(MULTI(BASE),get_tuple_name)(__isl_keep MULTI(BASE) *multi,
-	enum isl_dim_type type)
-{
-	return multi ? isl_space_get_tuple_name(multi->space, type) : NULL;
-}
-
-__isl_give EL *FN(FN(MULTI(BASE),get),BASE)(__isl_keep MULTI(BASE) *multi,
-	int pos)
-{
-	isl_ctx *ctx;
-
-	if (!multi)
-		return NULL;
-	ctx = FN(MULTI(BASE),get_ctx)(multi);
-	if (pos < 0 || pos >= multi->n)
-		isl_die(ctx, isl_error_invalid,
-			"index out of bounds", return NULL);
-	return FN(EL,copy)(multi->p[pos]);
-}
-
-__isl_give MULTI(BASE) *FN(FN(MULTI(BASE),set),BASE)(
-	__isl_take MULTI(BASE) *multi, int pos, __isl_take EL *el)
-{
-	if (!multi || !el)
-		goto error;
-
-	FN(EL,free)(multi->p[pos]);
-	multi->p[pos] = el;
-
-	return multi;
-error:
-	FN(MULTI(BASE),free)(multi);
-	FN(EL,free)(el);
-	return NULL;
-}
-
-/* Reset the space of "multi".  This function is called from isl_pw_templ.c
- * and doesn't know if the space of an element object is represented
- * directly or through its domain.  It therefore passes along both,
- * which we pass along to the element function since we don't how
- * that is represented either.
- */
-__isl_give MULTI(BASE) *FN(MULTI(BASE),reset_space_and_domain)(
-	__isl_take MULTI(BASE) *multi, __isl_take isl_space *space,
-	__isl_take isl_space *domain)
-{
-	int i;
-
-	multi = FN(MULTI(BASE),cow)(multi);
-	if (!multi || !space || !domain)
-		goto error;
-
-	for (i = 0; i < multi->n; ++i) {
-		multi->p[i] = FN(EL,reset_space_and_domain)(multi->p[i],
-				 isl_space_copy(space), isl_space_copy(domain));
-		if (!multi->p[i])
-			goto error;
-	}
-	isl_space_free(domain);
-	isl_space_free(multi->space);
-	multi->space = space;
-
-	return multi;
-error:
-	isl_space_free(domain);
-	isl_space_free(space);
-	FN(MULTI(BASE),free)(multi);
-	return NULL;
-}
-
-__isl_give MULTI(BASE) *FN(MULTI(BASE),reset_domain_space)(
-	__isl_take MULTI(BASE) *multi, __isl_take isl_space *domain)
-{
-	isl_space *space;
-
-	space = isl_space_extend_domain_with_range(isl_space_copy(domain),
-						isl_space_copy(multi->space));
-	return FN(MULTI(BASE),reset_space_and_domain)(multi, space, domain);
-}
-
-__isl_give MULTI(BASE) *FN(MULTI(BASE),realign_domain)(
-	__isl_take MULTI(BASE) *multi, __isl_take isl_reordering *exp)
-{
-	int i;
-
-	multi = FN(MULTI(BASE),cow)(multi);
-	if (!multi || !exp)
-		return NULL;
-
-	for (i = 0; i < multi->n; ++i) {
-		multi->p[i] = FN(EL,realign_domain)(multi->p[i],
-						isl_reordering_copy(exp));
-		if (!multi->p[i])
-			goto error;
-	}
-
-	multi = FN(MULTI(BASE),reset_domain_space)(multi,
-						    isl_space_copy(exp->dim));
-
-	isl_reordering_free(exp);
-	return multi;
-error:
-	isl_reordering_free(exp);
-	FN(MULTI(BASE),free)(multi);
-	return NULL;
-}
-
-/* Align the parameters of "multi" to those of "model".
- */
-__isl_give MULTI(BASE) *FN(MULTI(BASE),align_params)(
-	__isl_take MULTI(BASE) *multi, __isl_take isl_space *model)
-{
-	isl_ctx *ctx;
-
-	if (!multi || !model)
-		goto error;
-
-	ctx = isl_space_get_ctx(model);
-	if (!isl_space_has_named_params(model))
-		isl_die(ctx, isl_error_invalid,
-			"model has unnamed parameters", goto error);
-	if (!isl_space_has_named_params(multi->space))
-		isl_die(ctx, isl_error_invalid,
-			"input has unnamed parameters", goto error);
-	if (!isl_space_match(multi->space, isl_dim_param,
-			     model, isl_dim_param)) {
-		isl_reordering *exp;
-
-		model = isl_space_params(model);
-		exp = isl_parameter_alignment_reordering(multi->space, model);
-		exp = isl_reordering_extend_space(exp,
-				    FN(MULTI(BASE),get_domain_space)(multi));
-		multi = FN(MULTI(BASE),realign_domain)(multi, exp);
-	}
-
-	isl_space_free(model);
-	return multi;
-error:
-	isl_space_free(model);
-	FN(MULTI(BASE),free)(multi);
-	return NULL;
-}
-
-static __isl_give MULTI(BASE) *align_params_multi_set_and(
-	__isl_take MULTI(BASE) *multi, __isl_take isl_set *set,
-	__isl_give MULTI(BASE) *(*fn)(__isl_take MULTI(BASE) *multi,
-					__isl_take isl_set *set))
-{
-	isl_ctx *ctx;
-
-	if (!multi || !set)
-		goto error;
-	if (isl_space_match(multi->space, isl_dim_param,
-			    set->dim, isl_dim_param))
-		return fn(multi, set);
-	ctx = FN(MULTI(BASE),get_ctx)(multi);
-	if (!isl_space_has_named_params(multi->space) ||
-	    !isl_space_has_named_params(set->dim))
-		isl_die(ctx, isl_error_invalid,
-			"unaligned unnamed parameters", goto error);
-	multi = FN(MULTI(BASE),align_params)(multi, isl_set_get_space(set));
-	set = isl_set_align_params(set, FN(MULTI(BASE),get_space)(multi));
-	return fn(multi, set);
-error:
-	FN(MULTI(BASE),free)(multi);
-	isl_set_free(set);
-	return NULL;
-}
-
-__isl_give MULTI(BASE) *FN(MULTI(BASE),gist_aligned)(
-	__isl_take MULTI(BASE) *multi, __isl_take isl_set *context)
-{
-	int i;
-
-	if (!multi || !context)
-		goto error;
-
-	for (i = 0; i < multi->n; ++i) {
-		multi->p[i] = FN(EL,gist)(multi->p[i], isl_set_copy(context));
-		if (!multi->p[i])
-			goto error;
-	}
-
-	isl_set_free(context);
-	return multi;
-error:
-	isl_set_free(context);
-	FN(MULTI(BASE),free)(multi);
-	return NULL;
-}
-
-__isl_give MULTI(BASE) *FN(MULTI(BASE),gist)(__isl_take MULTI(BASE) *multi,
-	__isl_take isl_set *context)
-{
-	return align_params_multi_set_and(multi, context,
-						&FN(MULTI(BASE),gist_aligned));
-}
-
-__isl_give MULTI(BASE) *FN(MULTI(BASE),gist_params)(
-	__isl_take MULTI(BASE) *multi, __isl_take isl_set *context)
-{
-	isl_space *space = FN(MULTI(BASE),get_domain_space)(multi);
-	isl_set *dom_context = isl_set_universe(space);
-	dom_context = isl_set_intersect_params(dom_context, context);
-	return FN(MULTI(BASE),gist)(multi, dom_context);
-}
-
-__isl_give MULTI(BASE) *FN(FN(MULTI(BASE),from),LIST(BASE))(
-	__isl_take isl_space *space, __isl_take LIST(EL) *list)
-{
-	int i;
-	int n;
-	isl_ctx *ctx;
-	MULTI(BASE) *multi;
-
-	if (!space || !list)
-		goto error;
-
-	ctx = isl_space_get_ctx(space);
-	n = FN(FN(LIST(EL),n),BASE)(list);
-	if (n != isl_space_dim(space, isl_dim_out))
-		isl_die(ctx, isl_error_invalid,
-			"invalid number of elements in list", goto error);
-
-	multi = FN(MULTI(BASE),alloc)(isl_space_copy(space));
-	for (i = 0; i < n; ++i) {
-		multi = FN(FN(MULTI(BASE),set),BASE)(multi, i,
-					FN(FN(LIST(EL),get),BASE)(list, i));
-	}
-
-	isl_space_free(space);
-	FN(LIST(EL),free)(list);
-	return multi;
-error:
-	isl_space_free(space);
-	FN(LIST(EL),free)(list);
-	return NULL;
-}
diff --git a/cloog-0.17.0/isl/isl_multi_templ.h b/cloog-0.17.0/isl/isl_multi_templ.h
deleted file mode 100644
index 329985e..0000000
--- a/cloog-0.17.0/isl/isl_multi_templ.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#define xCAT(A,B) A ## B
-#define CAT(A,B) xCAT(A,B)
-#undef EL
-#define EL CAT(isl_,BASE)
-#define xMULTI(BASE) isl_multi_ ## BASE
-#define MULTI(BASE) xMULTI(BASE)
-
-struct MULTI(BASE) {
-	int ref;
-	isl_space *space;
-
-	int n;
-	EL *p[1];
-};
-
-#define ISL_DECLARE_MULTI_PRIVATE(BASE)					\
-__isl_give isl_multi_##BASE *isl_multi_##BASE##_alloc(			\
-	__isl_take isl_space *space);					\
-__isl_give isl_multi_##BASE *isl_multi_##BASE##_set_##BASE(		\
-	__isl_take isl_multi_##BASE *multi, int pos, __isl_take EL *el);
-
-ISL_DECLARE_MULTI_PRIVATE(aff)
diff --git a/cloog-0.17.0/isl/isl_obj.c b/cloog-0.17.0/isl/isl_obj.c
deleted file mode 100644
index dc63454..0000000
--- a/cloog-0.17.0/isl/isl_obj.c
+++ /dev/null
@@ -1,426 +0,0 @@
-/*
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France 
- */
-
-#include <isl/set.h>
-#include <isl/map.h>
-#include <isl/polynomial.h>
-#include <isl/obj.h>
-
-struct isl_int_obj {
-	int ref;
-	isl_ctx *ctx;
-	isl_int v;
-};
-
-__isl_give isl_int_obj *isl_int_obj_alloc(isl_ctx *ctx, isl_int v)
-{
-	isl_int_obj *i;
-
-	i = isl_alloc_type(ctx, isl_int_obj);
-	if (!i)
-		return NULL;
-	
-	i->ctx = ctx;
-	isl_ctx_ref(ctx);
-	i->ref = 1;
-	isl_int_init(i->v);
-	isl_int_set(i->v, v);
-
-	return i;
-}
-
-__isl_give isl_int_obj *isl_int_obj_copy(__isl_keep isl_int_obj *i)
-{
-	if (!i)
-		return NULL;
-
-	i->ref++;
-	return i;
-}
-
-__isl_give isl_int_obj *isl_int_obj_dup(__isl_keep isl_int_obj *i)
-{
-	if (!i)
-		return NULL;
-
-	return isl_int_obj_alloc(i->ctx, i->v);
-}
-
-__isl_give isl_int_obj *isl_int_obj_cow(__isl_take isl_int_obj *i)
-{
-	if (!i)
-		return NULL;
-
-	if (i->ref == 1)
-		return i;
-	i->ref--;
-	return isl_int_obj_dup(i);
-}
-
-void isl_int_obj_free(__isl_take isl_int_obj *i)
-{
-	if (!i)
-		return;
-
-	if (--i->ref > 0)
-		return;
-
-	isl_ctx_deref(i->ctx);
-	isl_int_clear(i->v);
-	free(i);
-}
-
-__isl_give isl_int_obj *isl_int_obj_add(__isl_take isl_int_obj *i1,
-	__isl_take isl_int_obj *i2)
-{
-	i1 = isl_int_obj_cow(i1);
-	if (!i1 || !i2)
-		goto error;
-	
-	isl_int_add(i1->v, i1->v, i2->v);
-
-	isl_int_obj_free(i2);
-	return i1;
-error:
-	isl_int_obj_free(i1);
-	isl_int_obj_free(i2);
-	return NULL;
-}
-
-__isl_give isl_int_obj *isl_int_obj_sub(__isl_take isl_int_obj *i1,
-	__isl_take isl_int_obj *i2)
-{
-	i1 = isl_int_obj_cow(i1);
-	if (!i1 || !i2)
-		goto error;
-	
-	isl_int_sub(i1->v, i1->v, i2->v);
-
-	isl_int_obj_free(i2);
-	return i1;
-error:
-	isl_int_obj_free(i1);
-	isl_int_obj_free(i2);
-	return NULL;
-}
-
-__isl_give isl_int_obj *isl_int_obj_mul(__isl_take isl_int_obj *i1,
-	__isl_take isl_int_obj *i2)
-{
-	i1 = isl_int_obj_cow(i1);
-	if (!i1 || !i2)
-		goto error;
-	
-	isl_int_mul(i1->v, i1->v, i2->v);
-
-	isl_int_obj_free(i2);
-	return i1;
-error:
-	isl_int_obj_free(i1);
-	isl_int_obj_free(i2);
-	return NULL;
-}
-
-void isl_int_obj_get_int(__isl_keep isl_int_obj *i, isl_int *v)
-{
-	if (!i)
-		return;
-	isl_int_set(*v, i->v);
-}
-
-static void *isl_obj_int_copy(void *v)
-{
-	return isl_int_obj_copy((isl_int_obj *)v);
-}
-
-static void isl_obj_int_free(void *v)
-{
-	isl_int_obj_free((isl_int_obj *)v);
-}
-
-static __isl_give isl_printer *isl_obj_int_print(__isl_take isl_printer *p,
-	void *v)
-{
-	isl_int_obj *i = v;
-	return isl_printer_print_isl_int(p, i->v);
-}
-
-static void *isl_obj_int_add(void *v1, void *v2)
-{
-	return isl_int_obj_add((isl_int_obj *)v1, (isl_int_obj *)v2);
-}
-
-struct isl_obj_vtable isl_obj_int_vtable = {
-	isl_obj_int_copy,
-	isl_obj_int_add,
-	isl_obj_int_print,
-	isl_obj_int_free
-};
-
-static void *isl_obj_map_copy(void *v)
-{
-	return isl_map_copy((struct isl_map *)v);
-}
-
-static void isl_obj_map_free(void *v)
-{
-	isl_map_free((struct isl_map *)v);
-}
-
-static __isl_give isl_printer *isl_obj_map_print(__isl_take isl_printer *p,
-	void *v)
-{
-	return isl_printer_print_map(p, (struct isl_map *)v);
-}
-
-static void *isl_obj_map_add(void *v1, void *v2)
-{
-	return isl_map_union((struct isl_map *)v1, (struct isl_map *)v2);
-}
-
-struct isl_obj_vtable isl_obj_map_vtable = {
-	isl_obj_map_copy,
-	isl_obj_map_add,
-	isl_obj_map_print,
-	isl_obj_map_free
-};
-
-static void *isl_obj_union_map_copy(void *v)
-{
-	return isl_union_map_copy((isl_union_map *)v);
-}
-
-static void isl_obj_union_map_free(void *v)
-{
-	isl_union_map_free((isl_union_map *)v);
-}
-
-static __isl_give isl_printer *isl_obj_union_map_print(__isl_take isl_printer *p,
-	void *v)
-{
-	return isl_printer_print_union_map(p, (isl_union_map *)v);
-}
-
-static void *isl_obj_union_map_add(void *v1, void *v2)
-{
-	return isl_union_map_union((isl_union_map *)v1, (isl_union_map *)v2);
-}
-
-struct isl_obj_vtable isl_obj_union_map_vtable = {
-	isl_obj_union_map_copy,
-	isl_obj_union_map_add,
-	isl_obj_union_map_print,
-	isl_obj_union_map_free
-};
-
-static void *isl_obj_set_copy(void *v)
-{
-	return isl_set_copy((struct isl_set *)v);
-}
-
-static void isl_obj_set_free(void *v)
-{
-	isl_set_free((struct isl_set *)v);
-}
-
-static __isl_give isl_printer *isl_obj_set_print(__isl_take isl_printer *p,
-	void *v)
-{
-	return isl_printer_print_set(p, (struct isl_set *)v);
-}
-
-static void *isl_obj_set_add(void *v1, void *v2)
-{
-	return isl_set_union((struct isl_set *)v1, (struct isl_set *)v2);
-}
-
-struct isl_obj_vtable isl_obj_set_vtable = {
-	isl_obj_set_copy,
-	isl_obj_set_add,
-	isl_obj_set_print,
-	isl_obj_set_free
-};
-
-static void *isl_obj_union_set_copy(void *v)
-{
-	return isl_union_set_copy((isl_union_set *)v);
-}
-
-static void isl_obj_union_set_free(void *v)
-{
-	isl_union_set_free((isl_union_set *)v);
-}
-
-static __isl_give isl_printer *isl_obj_union_set_print(__isl_take isl_printer *p,
-	void *v)
-{
-	return isl_printer_print_union_set(p, (isl_union_set *)v);
-}
-
-static void *isl_obj_union_set_add(void *v1, void *v2)
-{
-	return isl_union_set_union((isl_union_set *)v1, (isl_union_set *)v2);
-}
-
-struct isl_obj_vtable isl_obj_union_set_vtable = {
-	isl_obj_union_set_copy,
-	isl_obj_union_set_add,
-	isl_obj_union_set_print,
-	isl_obj_union_set_free
-};
-
-static void *isl_obj_none_copy(void *v)
-{
-	return v;
-}
-
-static void isl_obj_none_free(void *v)
-{
-}
-
-static __isl_give isl_printer *isl_obj_none_print(__isl_take isl_printer *p,
-	void *v)
-{
-	return p;
-}
-
-static void *isl_obj_none_add(void *v1, void *v2)
-{
-	return NULL;
-}
-
-struct isl_obj_vtable isl_obj_none_vtable = {
-	isl_obj_none_copy,
-	isl_obj_none_add,
-	isl_obj_none_print,
-	isl_obj_none_free
-};
-
-static void *isl_obj_pw_qp_copy(void *v)
-{
-	return isl_pw_qpolynomial_copy((struct isl_pw_qpolynomial *)v);
-}
-
-static void isl_obj_pw_qp_free(void *v)
-{
-	isl_pw_qpolynomial_free((struct isl_pw_qpolynomial *)v);
-}
-
-static __isl_give isl_printer *isl_obj_pw_qp_print(__isl_take isl_printer *p,
-	void *v)
-{
-	return isl_printer_print_pw_qpolynomial(p,
-						(struct isl_pw_qpolynomial *)v);
-}
-
-static void *isl_obj_pw_qp_add(void *v1, void *v2)
-{
-	return isl_pw_qpolynomial_add((struct isl_pw_qpolynomial *)v1,
-					(struct isl_pw_qpolynomial *)v2);
-}
-
-struct isl_obj_vtable isl_obj_pw_qpolynomial_vtable = {
-	isl_obj_pw_qp_copy,
-	isl_obj_pw_qp_add,
-	isl_obj_pw_qp_print,
-	isl_obj_pw_qp_free
-};
-
-static void *isl_obj_union_pw_qp_copy(void *v)
-{
-	return isl_union_pw_qpolynomial_copy((struct isl_union_pw_qpolynomial *)v);
-}
-
-static void isl_obj_union_pw_qp_free(void *v)
-{
-	isl_union_pw_qpolynomial_free((struct isl_union_pw_qpolynomial *)v);
-}
-
-static __isl_give isl_printer *isl_obj_union_pw_qp_print(
-	__isl_take isl_printer *p, void *v)
-{
-	return isl_printer_print_union_pw_qpolynomial(p,
-					(struct isl_union_pw_qpolynomial *)v);
-}
-
-static void *isl_obj_union_pw_qp_add(void *v1, void *v2)
-{
-	return isl_union_pw_qpolynomial_add(
-					(struct isl_union_pw_qpolynomial *)v1,
-					(struct isl_union_pw_qpolynomial *)v2);
-}
-
-struct isl_obj_vtable isl_obj_union_pw_qpolynomial_vtable = {
-	isl_obj_union_pw_qp_copy,
-	isl_obj_union_pw_qp_add,
-	isl_obj_union_pw_qp_print,
-	isl_obj_union_pw_qp_free
-};
-
-static void *isl_obj_pw_qpf_copy(void *v)
-{
-	return isl_pw_qpolynomial_fold_copy((struct isl_pw_qpolynomial_fold *)v);
-}
-
-static void isl_obj_pw_qpf_free(void *v)
-{
-	isl_pw_qpolynomial_fold_free((struct isl_pw_qpolynomial_fold *)v);
-}
-
-static __isl_give isl_printer *isl_obj_pw_qpf_print(__isl_take isl_printer *p,
-	void *v)
-{
-	return isl_printer_print_pw_qpolynomial_fold(p,
-					(struct isl_pw_qpolynomial_fold *)v);
-}
-
-static void *isl_obj_pw_qpf_add(void *v1, void *v2)
-{
-	return isl_pw_qpolynomial_fold_fold((struct isl_pw_qpolynomial_fold *)v1,
-					    (struct isl_pw_qpolynomial_fold *)v2);
-}
-
-struct isl_obj_vtable isl_obj_pw_qpolynomial_fold_vtable = {
-	isl_obj_pw_qpf_copy,
-	isl_obj_pw_qpf_add,
-	isl_obj_pw_qpf_print,
-	isl_obj_pw_qpf_free
-};
-
-static void *isl_obj_union_pw_qpf_copy(void *v)
-{
-	return isl_union_pw_qpolynomial_fold_copy((struct isl_union_pw_qpolynomial_fold *)v);
-}
-
-static void isl_obj_union_pw_qpf_free(void *v)
-{
-	isl_union_pw_qpolynomial_fold_free((struct isl_union_pw_qpolynomial_fold *)v);
-}
-
-static __isl_give isl_printer *isl_obj_union_pw_qpf_print(
-	__isl_take isl_printer *p, void *v)
-{
-	return isl_printer_print_union_pw_qpolynomial_fold(p,
-				    (struct isl_union_pw_qpolynomial_fold *)v);
-}
-
-static void *isl_obj_union_pw_qpf_add(void *v1, void *v2)
-{
-	return isl_union_pw_qpolynomial_fold_fold(
-				    (struct isl_union_pw_qpolynomial_fold *)v1,
-				    (struct isl_union_pw_qpolynomial_fold *)v2);
-}
-
-struct isl_obj_vtable isl_obj_union_pw_qpolynomial_fold_vtable = {
-	isl_obj_union_pw_qpf_copy,
-	isl_obj_union_pw_qpf_add,
-	isl_obj_union_pw_qpf_print,
-	isl_obj_union_pw_qpf_free
-};
diff --git a/cloog-0.17.0/isl/isl_options.c b/cloog-0.17.0/isl/isl_options.c
deleted file mode 100644
index 35d8a46..0000000
--- a/cloog-0.17.0/isl/isl_options.c
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <isl/ctx.h>
-#include <isl_options_private.h>
-#include <isl/version.h>
-
-struct isl_arg_choice isl_lp_solver_choice[] = {
-	{"tab",		ISL_LP_TAB},
-#ifdef ISL_PIPLIB
-	{"pip",		ISL_LP_PIP},
-#endif
-	{0}
-};
-
-struct isl_arg_choice isl_ilp_solver_choice[] = {
-	{"gbr",		ISL_ILP_GBR},
-#ifdef ISL_PIPLIB
-	{"pip",		ISL_ILP_PIP},
-#endif
-	{0}
-};
-
-struct isl_arg_choice isl_pip_solver_choice[] = {
-	{"tab",		ISL_PIP_TAB},
-#ifdef ISL_PIPLIB
-	{"pip",		ISL_PIP_PIP},
-#endif
-	{0}
-};
-
-struct isl_arg_choice isl_pip_context_choice[] = {
-	{"gbr",		ISL_CONTEXT_GBR},
-	{"lexmin",	ISL_CONTEXT_LEXMIN},
-	{0}
-};
-
-struct isl_arg_choice isl_gbr_choice[] = {
-	{"never",	ISL_GBR_NEVER},
-	{"once",	ISL_GBR_ONCE},
-	{"always",	ISL_GBR_ALWAYS},
-	{0}
-};
-
-struct isl_arg_choice isl_closure_choice[] = {
-	{"isl",		ISL_CLOSURE_ISL},
-	{"box",		ISL_CLOSURE_BOX},
-	{0}
-};
-
-static struct isl_arg_choice bound[] = {
-	{"bernstein",	ISL_BOUND_BERNSTEIN},
-	{"range",	ISL_BOUND_RANGE},
-	{0}
-};
-
-static struct isl_arg_choice on_error[] = {
-	{"warn",	ISL_ON_ERROR_WARN},
-	{"continue",	ISL_ON_ERROR_CONTINUE},
-	{"abort",	ISL_ON_ERROR_ABORT},
-	{0}
-};
-
-static struct isl_arg_flags bernstein_recurse[] = {
-	{"none",	ISL_BERNSTEIN_FACTORS | ISL_BERNSTEIN_INTERVALS, 0},
-	{"factors",	ISL_BERNSTEIN_FACTORS | ISL_BERNSTEIN_INTERVALS,
-			ISL_BERNSTEIN_FACTORS},
-	{"intervals",	ISL_BERNSTEIN_FACTORS | ISL_BERNSTEIN_INTERVALS,
-			ISL_BERNSTEIN_INTERVALS},
-	{"full",	ISL_BERNSTEIN_FACTORS | ISL_BERNSTEIN_INTERVALS,
-			ISL_BERNSTEIN_FACTORS | ISL_BERNSTEIN_INTERVALS},
-	{0}
-};
-
-static struct isl_arg_choice convex[] = {
-	{"wrap",	ISL_CONVEX_HULL_WRAP},
-	{"fm",		ISL_CONVEX_HULL_FM},
-	{0}
-};
-
-static void print_version(void)
-{
-	printf("%s", isl_version());
-}
-
-ISL_ARGS_START(struct isl_options, isl_options_args)
-ISL_ARG_CHOICE(struct isl_options, lp_solver, 0, "lp-solver", \
-	isl_lp_solver_choice,	ISL_LP_TAB, "lp solver to use")
-ISL_ARG_CHOICE(struct isl_options, ilp_solver, 0, "ilp-solver", \
-	isl_ilp_solver_choice,	ISL_ILP_GBR, "ilp solver to use")
-ISL_ARG_CHOICE(struct isl_options, pip, 0, "pip", \
-	isl_pip_solver_choice,	ISL_PIP_TAB, "pip solver to use")
-ISL_ARG_CHOICE(struct isl_options, context, 0, "context", \
-	isl_pip_context_choice,	ISL_CONTEXT_GBR,
-	"how to handle the pip context tableau")
-ISL_ARG_CHOICE(struct isl_options, gbr, 0, "gbr", \
-	isl_gbr_choice,	ISL_GBR_ONCE,
-	"how often to use generalized basis reduction")
-ISL_ARG_CHOICE(struct isl_options, closure, 0, "closure", \
-	isl_closure_choice,	ISL_CLOSURE_ISL,
-	"closure operation to use")
-ISL_ARG_BOOL(struct isl_options, gbr_only_first, 0, "gbr-only-first", 0,
-	"only perform basis reduction in first direction")
-ISL_ARG_CHOICE(struct isl_options, bound, 0, "bound", bound,
-	ISL_BOUND_BERNSTEIN, "algorithm to use for computing bounds")
-ISL_ARG_CHOICE(struct isl_options, on_error, 0, "on-error", on_error,
-	ISL_ON_ERROR_WARN, "how to react if an error is detected")
-ISL_ARG_FLAGS(struct isl_options, bernstein_recurse, 0,
-	"bernstein-recurse", bernstein_recurse, ISL_BERNSTEIN_FACTORS, NULL)
-ISL_ARG_BOOL(struct isl_options, bernstein_triangulate, 0,
-	"bernstein-triangulate", 1,
-	"triangulate domains during Bernstein expansion")
-ISL_ARG_BOOL(struct isl_options, pip_symmetry, 0, "pip-symmetry", 1,
-	"detect simple symmetries in PIP input")
-ISL_ARG_CHOICE(struct isl_options, convex, 0, "convex-hull", \
-	convex,	ISL_CONVEX_HULL_WRAP, "convex hull algorithm to use")
-ISL_ARG_INT(struct isl_options, schedule_max_constant_term, 0,
-	"schedule-max-constant-term", "limit", -1, "Only consider schedules "
-	"where the coefficients of the constant dimension do not exceed "
-	"<limit>. A value of -1 allows arbitrary coefficients.")
-ISL_ARG_BOOL(struct isl_options, schedule_parametric, 0,
-	"schedule-parametric", 1, "construct possibly parametric schedules")
-ISL_ARG_BOOL(struct isl_options, schedule_outer_zero_distance, 0,
-	"schedule-outer-zero-distance", 0,
-	"try to construct schedules with outer zero distances over "
-	"proximity dependences")
-ISL_ARG_BOOL(struct isl_options, schedule_maximize_band_depth, 0,
-	"schedule-maximize-band-depth", 1,
-	"maximize the number of scheduling dimensions in a band")
-ISL_ARG_BOOL(struct isl_options, schedule_split_parallel, 0,
-	"schedule-split-parallel", 1,
-	"split non-tilable bands with parallel schedules")
-ISL_ARG_VERSION(print_version)
-ISL_ARGS_END
-
-ISL_ARG_DEF(isl_options, struct isl_options, isl_options_args)
-
-ISL_ARG_CTX_DEF(isl_options, struct isl_options, isl_options_args)
-
-ISL_CTX_SET_CHOICE_DEF(isl_options, struct isl_options, isl_options_args, bound)
-ISL_CTX_GET_CHOICE_DEF(isl_options, struct isl_options, isl_options_args, bound)
-
-ISL_CTX_SET_CHOICE_DEF(isl_options, struct isl_options, isl_options_args,
-	on_error)
-ISL_CTX_GET_CHOICE_DEF(isl_options, struct isl_options, isl_options_args,
-	on_error)
-
-ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args,
-	gbr_only_first)
-ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args,
-	gbr_only_first)
-
-ISL_CTX_SET_INT_DEF(isl_options, struct isl_options, isl_options_args,
-	schedule_max_constant_term)
-ISL_CTX_GET_INT_DEF(isl_options, struct isl_options, isl_options_args,
-	schedule_max_constant_term)
-
-ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args,
-	schedule_maximize_band_depth)
-ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args,
-	schedule_maximize_band_depth)
-
-ISL_CTX_SET_BOOL_DEF(isl_options, struct isl_options, isl_options_args,
-	schedule_outer_zero_distance)
-ISL_CTX_GET_BOOL_DEF(isl_options, struct isl_options, isl_options_args,
-	schedule_outer_zero_distance)
diff --git a/cloog-0.17.0/isl/isl_options_private.h b/cloog-0.17.0/isl/isl_options_private.h
deleted file mode 100644
index 6cbd882..0000000
--- a/cloog-0.17.0/isl/isl_options_private.h
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef ISL_OPTIONS_PRIVATE_H
-#define ISL_OPTIONS_PRIVATE_H
-
-#include <isl/options.h>
-
-struct isl_options {
-	#define			ISL_LP_TAB	0
-	#define			ISL_LP_PIP	1
-	unsigned		lp_solver;
-
-	#define			ISL_ILP_GBR	0
-	#define			ISL_ILP_PIP	1
-	unsigned		ilp_solver;
-
-	#define			ISL_PIP_TAB	0
-	#define			ISL_PIP_PIP	1
-	unsigned		pip;
-
-	#define			ISL_CONTEXT_GBR		0
-	#define			ISL_CONTEXT_LEXMIN	1
-	unsigned		context;
-
-	#define			ISL_GBR_NEVER	0
-	#define			ISL_GBR_ONCE	1
-	#define			ISL_GBR_ALWAYS	2
-	unsigned		gbr;
-	unsigned		gbr_only_first;
-
-	#define			ISL_CLOSURE_ISL		0
-	#define			ISL_CLOSURE_BOX		1
-	unsigned		closure;
-
-	int			bound;
-	unsigned		on_error;
-
-	#define			ISL_BERNSTEIN_FACTORS	1
-	#define			ISL_BERNSTEIN_INTERVALS	2
-	int			bernstein_recurse;
-
-	int			bernstein_triangulate;
-
-	int			pip_symmetry;
-
-	#define			ISL_CONVEX_HULL_WRAP	0
-	#define			ISL_CONVEX_HULL_FM	1
-	int			convex;
-
-	int			schedule_max_constant_term;
-	int			schedule_parametric;
-	int			schedule_outer_zero_distance;
-	int			schedule_maximize_band_depth;
-	int			schedule_split_parallel;
-};
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_output.c b/cloog-0.17.0/isl/isl_output.c
deleted file mode 100644
index 6883e7f..0000000
--- a/cloog-0.17.0/isl/isl_output.c
+++ /dev/null
@@ -1,2389 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France 
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl/set.h>
-#include <isl/seq.h>
-#include <isl_polynomial_private.h>
-#include <isl_printer_private.h>
-#include <isl_space_private.h>
-#include <isl_mat_private.h>
-#include <isl/union_map.h>
-#include <isl/constraint.h>
-#include <isl_local_space_private.h>
-#include <isl_aff_private.h>
-
-static const char *s_to[2] = { " -> ", " \\to " };
-static const char *s_and[2] = { " and ", " \\wedge " };
-static const char *s_or[2] = { " or ", " \\vee " };
-static const char *s_le[2] = { "<=", "\\le" };
-static const char *s_ge[2] = { ">=", "\\ge" };
-static const char *s_open_set[2] = { "{ ", "\\{\\, " };
-static const char *s_close_set[2] = { " }", " \\,\\}" };
-static const char *s_open_list[2] = { "[", "(" };
-static const char *s_close_list[2] = { "]", ")" };
-static const char *s_such_that[2] = { " : ", " \\mid " };
-static const char *s_open_exists[2] = { "exists (", "\\exists \\, " };
-static const char *s_close_exists[2] = { ")", "" };
-static const char *s_div_prefix[2] = { "e", "\\alpha_" };
-static const char *s_param_prefix[2] = { "p", "p_" };
-static const char *s_input_prefix[2] = { "i", "i_" };
-static const char *s_output_prefix[2] = { "o", "o_" };
-
-static __isl_give isl_printer *print_constraint_polylib(
-	struct isl_basic_map *bmap, int ineq, int n, __isl_take isl_printer *p)
-{
-	int i;
-	unsigned n_in = isl_basic_map_dim(bmap, isl_dim_in);
-	unsigned n_out = isl_basic_map_dim(bmap, isl_dim_out);
-	unsigned nparam = isl_basic_map_dim(bmap, isl_dim_param);
-	isl_int *c = ineq ? bmap->ineq[n] : bmap->eq[n];
-
-	p = isl_printer_start_line(p);
-	p = isl_printer_print_int(p, ineq);
-	for (i = 0; i < n_out; ++i) {
-		p = isl_printer_print_str(p, " ");
-		p = isl_printer_print_isl_int(p, c[1+nparam+n_in+i]);
-	}
-	for (i = 0; i < n_in; ++i) {
-		p = isl_printer_print_str(p, " ");
-		p = isl_printer_print_isl_int(p, c[1+nparam+i]);
-	}
-	for (i = 0; i < bmap->n_div; ++i) {
-		p = isl_printer_print_str(p, " ");
-		p = isl_printer_print_isl_int(p, c[1+nparam+n_in+n_out+i]);
-	}
-	for (i = 0; i < nparam; ++i) {
-		p = isl_printer_print_str(p, " ");
-		p = isl_printer_print_isl_int(p, c[1+i]);
-	}
-	p = isl_printer_print_str(p, " ");
-	p = isl_printer_print_isl_int(p, c[0]);
-	p = isl_printer_end_line(p);
-	return p;
-}
-
-static __isl_give isl_printer *print_constraints_polylib(
-	struct isl_basic_map *bmap, __isl_take isl_printer *p)
-{
-	int i;
-
-	p = isl_printer_set_isl_int_width(p, 5);
-
-	for (i = 0; i < bmap->n_eq; ++i)
-		p = print_constraint_polylib(bmap, 0, i, p);
-	for (i = 0; i < bmap->n_ineq; ++i)
-		p = print_constraint_polylib(bmap, 1, i, p);
-
-	return p;
-}
-
-static __isl_give isl_printer *bset_print_constraints_polylib(
-	struct isl_basic_set *bset, __isl_take isl_printer *p)
-{
-	return print_constraints_polylib((struct isl_basic_map *)bset, p);
-}
-
-static __isl_give isl_printer *isl_basic_map_print_polylib(
-	__isl_keep isl_basic_map *bmap, __isl_take isl_printer *p, int ext)
-{
-	unsigned total = isl_basic_map_total_dim(bmap);
-	p = isl_printer_start_line(p);
-	p = isl_printer_print_int(p, bmap->n_eq + bmap->n_ineq);
-	p = isl_printer_print_str(p, " ");
-	p = isl_printer_print_int(p, 1 + total + 1);
-	if (ext) {
-		p = isl_printer_print_str(p, " ");
-		p = isl_printer_print_int(p,
-				    isl_basic_map_dim(bmap, isl_dim_out));
-		p = isl_printer_print_str(p, " ");
-		p = isl_printer_print_int(p,
-				    isl_basic_map_dim(bmap, isl_dim_in));
-		p = isl_printer_print_str(p, " ");
-		p = isl_printer_print_int(p,
-				    isl_basic_map_dim(bmap, isl_dim_div));
-		p = isl_printer_print_str(p, " ");
-		p = isl_printer_print_int(p,
-				    isl_basic_map_dim(bmap, isl_dim_param));
-	}
-	p = isl_printer_end_line(p);
-	return print_constraints_polylib(bmap, p);
-}
-
-static __isl_give isl_printer *isl_basic_set_print_polylib(
-	__isl_keep isl_basic_set *bset, __isl_take isl_printer *p, int ext)
-{
-	return isl_basic_map_print_polylib((struct isl_basic_map *)bset, p, ext);
-}
-
-static __isl_give isl_printer *isl_map_print_polylib(__isl_keep isl_map *map,
-	__isl_take isl_printer *p, int ext)
-{
-	int i;
-
-	p = isl_printer_start_line(p);
-	p = isl_printer_print_int(p, map->n);
-	p = isl_printer_end_line(p);
-	for (i = 0; i < map->n; ++i) {
-		p = isl_printer_start_line(p);
-		p = isl_printer_end_line(p);
-		p = isl_basic_map_print_polylib(map->p[i], p, ext);
-	}
-	return p;
-}
-
-static __isl_give isl_printer *isl_set_print_polylib(__isl_keep isl_set *set,
-	__isl_take isl_printer *p, int ext)
-{
-	return isl_map_print_polylib((struct isl_map *)set, p, ext);
-}
-
-static int count_same_name(__isl_keep isl_space *dim,
-	enum isl_dim_type type, unsigned pos, const char *name)
-{
-	enum isl_dim_type t;
-	unsigned p, s;
-	int count = 0;
-
-	for (t = isl_dim_param; t <= type && t <= isl_dim_out; ++t) {
-		s = t == type ? pos : isl_space_dim(dim, t);
-		for (p = 0; p < s; ++p) {
-			const char *n = isl_space_get_dim_name(dim, t, p);
-			if (n && !strcmp(n, name))
-				count++;
-		}
-	}
-	return count;
-}
-
-static __isl_give isl_printer *print_name(__isl_keep isl_space *dim,
-	__isl_take isl_printer *p, enum isl_dim_type type, unsigned pos,
-	int latex)
-{
-	const char *name;
-	char buffer[20];
-	int primes;
-
-	name = type == isl_dim_div ? NULL : isl_space_get_dim_name(dim, type, pos);
-
-	if (!name) {
-		const char *prefix;
-		if (type == isl_dim_param)
-			prefix = s_param_prefix[latex];
-		else if (type == isl_dim_div)
-			prefix = s_div_prefix[latex];
-		else if (isl_space_is_set(dim) || type == isl_dim_in)
-			prefix = s_input_prefix[latex];
-		else
-			prefix = s_output_prefix[latex];
-		snprintf(buffer, sizeof(buffer), "%s%d", prefix, pos);
-		name = buffer;
-	}
-	primes = count_same_name(dim, name == buffer ? isl_dim_div : type,
-				 pos, name);
-	p = isl_printer_print_str(p, name);
-	while (primes-- > 0)
-		p = isl_printer_print_str(p, "'");
-	return p;
-}
-
-static enum isl_dim_type pos2type(__isl_keep isl_space *dim, unsigned *pos)
-{
-	enum isl_dim_type type;
-	unsigned n_in = isl_space_dim(dim, isl_dim_in);
-	unsigned n_out = isl_space_dim(dim, isl_dim_out);
-	unsigned nparam = isl_space_dim(dim, isl_dim_param);
-
-	if (*pos < 1 + nparam) {
-		type = isl_dim_param;
-		*pos -= 1;
-	} else if (*pos < 1 + nparam + n_in) {
-		type = isl_dim_in;
-		*pos -= 1 + nparam;
-	} else if (*pos < 1 + nparam + n_in + n_out) {
-		type = isl_dim_out;
-		*pos -= 1 + nparam + n_in;
-	} else {
-		type = isl_dim_div;
-		*pos -= 1 + nparam + n_in + n_out;
-	}
-
-	return type;
-}
-
-static __isl_give isl_printer *print_div(__isl_keep isl_space *dim,
-	__isl_keep isl_mat *div, int pos, __isl_take isl_printer *p);
-
-static __isl_give isl_printer *print_term(__isl_keep isl_space *dim,
-	__isl_keep isl_mat *div,
-	isl_int c, unsigned pos, __isl_take isl_printer *p, int latex)
-{
-	enum isl_dim_type type;
-	int print_div_def;
-
-	if (pos == 0)
-		return isl_printer_print_isl_int(p, c);
-
-	type = pos2type(dim, &pos);
-	print_div_def = type == isl_dim_div && div &&
-			!isl_int_is_zero(div->row[pos][0]);
-
-	if (isl_int_is_one(c))
-		;
-	else if (isl_int_is_negone(c))
-		p = isl_printer_print_str(p, "-");
-	else {
-		p = isl_printer_print_isl_int(p, c);
-		if (p->output_format == ISL_FORMAT_C || print_div_def)
-			p = isl_printer_print_str(p, "*");
-	}
-	if (print_div_def)
-		p = print_div(dim, div, pos, p);
-	else
-		p = print_name(dim, p, type, pos, latex);
-	return p;
-}
-
-static __isl_give isl_printer *print_affine_of_len(__isl_keep isl_space *dim,
-	__isl_keep isl_mat *div,
-	__isl_take isl_printer *p, isl_int *c, int len)
-{
-	int i;
-	int first;
-
-	for (i = 0, first = 1; i < len; ++i) {
-		int flip = 0;
-		if (isl_int_is_zero(c[i]))
-			continue;
-		if (!first) {
-			if (isl_int_is_neg(c[i])) {
-				flip = 1;
-				isl_int_neg(c[i], c[i]);
-				p = isl_printer_print_str(p, " - ");
-			} else 
-				p = isl_printer_print_str(p, " + ");
-		}
-		first = 0;
-		p = print_term(dim, div, c[i], i, p, 0);
-		if (flip)
-			isl_int_neg(c[i], c[i]);
-	}
-	if (first)
-		p = isl_printer_print_str(p, "0");
-	return p;
-}
-
-static __isl_give isl_printer *print_affine(__isl_keep isl_basic_map *bmap,
-	__isl_keep isl_space *dim, __isl_take isl_printer *p, isl_int *c)
-{
-	unsigned len = 1 + isl_basic_map_total_dim(bmap);
-	return print_affine_of_len(dim, NULL, p, c, len);
-}
-
-static int defining_equality(__isl_keep isl_basic_map *eq,
-	__isl_keep isl_space *dim, enum isl_dim_type type, int pos)
-{
-	int i;
-	unsigned total;
-
-	if (!eq)
-		return -1;
-
-	pos += isl_space_offset(dim, type);
-	total = isl_basic_map_total_dim(eq);
-
-	for (i = 0; i < eq->n_eq; ++i) {
-		if (isl_seq_last_non_zero(eq->eq[i] + 1, total) != pos)
-			continue;
-		if (isl_int_is_one(eq->eq[i][1 + pos]))
-			isl_seq_neg(eq->eq[i], eq->eq[i], 1 + total);
-		return i;
-	}
-
-	return -1;
-}
-
-static __isl_give isl_printer *print_aff_body(__isl_take isl_printer *p,
-	__isl_keep isl_aff *aff);
-
-/* offset is the offset of local_dim inside global_type of global_dim.
- */
-static __isl_give isl_printer *print_nested_var_list(__isl_take isl_printer *p,
-	__isl_keep isl_space *global_dim, enum isl_dim_type global_type,
-	__isl_keep isl_space *local_dim, enum isl_dim_type local_type,
-	int latex, __isl_keep isl_basic_map *eq,
-	__isl_keep isl_multi_aff *maff, int offset)
-{
-	int i, j;
-
-	if (global_dim != local_dim && local_type == isl_dim_out)
-		offset += local_dim->n_in;
-
-	for (i = 0; i < isl_space_dim(local_dim, local_type); ++i) {
-		if (i)
-			p = isl_printer_print_str(p, ", ");
-		if (maff && global_type == isl_dim_out) {
-			p = print_aff_body(p, maff->p[offset + i]);
-			continue;
-		}
-		j = defining_equality(eq, global_dim, global_type, offset + i);
-		if (j >= 0) {
-			int pos = 1 + isl_space_offset(global_dim, global_type)
-				    + offset + i;
-			p = print_affine_of_len(eq->dim, NULL,
-						p, eq->eq[j], pos);
-		} else {
-			p = print_name(global_dim, p, global_type, offset + i,
-					latex);
-		}
-	}
-	return p;
-}
-
-static __isl_give isl_printer *print_var_list(__isl_keep isl_space *dim,
-	__isl_take isl_printer *p, enum isl_dim_type type,
-	int latex, __isl_keep isl_basic_map *eq, __isl_keep isl_multi_aff *maff)
-{
-	return print_nested_var_list(p, dim, type, dim, type, latex,
-					eq, maff, 0);
-}
-
-static __isl_give isl_printer *print_nested_map_dim(__isl_take isl_printer *p,
-	__isl_keep isl_space *global_dim, enum isl_dim_type global_type,
-	__isl_keep isl_space *local_dim,
-	int latex, __isl_keep isl_basic_map *eq,
-	__isl_keep isl_multi_aff *maff, int offset);
-
-static __isl_give isl_printer *print_nested_tuple(__isl_take isl_printer *p,
-	__isl_keep isl_space *global_dim, enum isl_dim_type global_type,
-	__isl_keep isl_space *local_dim, enum isl_dim_type local_type,
-	int latex, __isl_keep isl_basic_map *eq,
-	__isl_keep isl_multi_aff *maff, int offset)
-{
-	const char *name = NULL;
-	unsigned n = isl_space_dim(local_dim, local_type);
-	if ((local_type == isl_dim_in || local_type == isl_dim_out)) {
-		name = isl_space_get_tuple_name(local_dim, local_type);
-		if (name) {
-			if (latex)
-				p = isl_printer_print_str(p, "\\mathrm{");
-			p = isl_printer_print_str(p, name);
-			if (latex)
-				p = isl_printer_print_str(p, "}");
-		}
-	}
-	if (!latex || n != 1 || name)
-		p = isl_printer_print_str(p, s_open_list[latex]);
-	if ((local_type == isl_dim_in || local_type == isl_dim_out) &&
-	    local_dim->nested[local_type - isl_dim_in]) {
-		if (global_dim != local_dim && local_type == isl_dim_out)
-			offset += local_dim->n_in;
-		p = print_nested_map_dim(p, global_dim, global_type,
-				local_dim->nested[local_type - isl_dim_in],
-				latex, eq, maff, offset);
-	} else
-		p = print_nested_var_list(p, global_dim, global_type,
-					  local_dim, local_type, latex,
-					  eq, maff, offset);
-	if (!latex || n != 1 || name)
-		p = isl_printer_print_str(p, s_close_list[latex]);
-	return p;
-}
-
-static __isl_give isl_printer *print_tuple(__isl_keep isl_space *dim,
-	__isl_take isl_printer *p, enum isl_dim_type type,
-	int latex, __isl_keep isl_basic_map *eq, __isl_keep isl_multi_aff *maff)
-{
-	return print_nested_tuple(p, dim, type, dim, type, latex, eq, maff, 0);
-}
-
-static __isl_give isl_printer *print_nested_map_dim(__isl_take isl_printer *p,
-	__isl_keep isl_space *global_dim, enum isl_dim_type global_type,
-	__isl_keep isl_space *local_dim,
-	int latex, __isl_keep isl_basic_map *eq,
-	__isl_keep isl_multi_aff *maff, int offset)
-{
-	p = print_nested_tuple(p, global_dim, global_type,
-			local_dim, isl_dim_in, latex, eq, maff, offset);
-	p = isl_printer_print_str(p, s_to[latex]);
-	p = print_nested_tuple(p, global_dim, global_type,
-			local_dim, isl_dim_out, latex, eq, maff, offset);
-
-	return p;
-}
-
-static __isl_give isl_printer *print_space(__isl_keep isl_space *dim,
-	__isl_take isl_printer *p, int latex, int rational,
-	__isl_keep isl_basic_map *eq, __isl_keep isl_multi_aff *maff)
-{
-	if (rational && !latex)
-		p = isl_printer_print_str(p, "rat: ");
-	if (isl_space_is_params(dim))
-		;
-	else if (isl_space_is_set(dim))
-		p = print_tuple(dim, p, isl_dim_set, latex, eq, maff);
-	else {
-		p = print_tuple(dim, p, isl_dim_in, latex, eq, maff);
-		p = isl_printer_print_str(p, s_to[latex]);
-		p = print_tuple(dim, p, isl_dim_out, latex, eq, maff);
-	}
-
-	return p;
-}
-
-static __isl_give isl_printer *print_omega_parameters(__isl_keep isl_space *dim,
-	__isl_take isl_printer *p)
-{
-	if (isl_space_dim(dim, isl_dim_param) == 0)
-		return p;
-
-	p = isl_printer_start_line(p);
-	p = isl_printer_print_str(p, "symbolic ");
-	p = print_var_list(dim, p, isl_dim_param, 0, NULL, NULL);
-	p = isl_printer_print_str(p, ";");
-	p = isl_printer_end_line(p);
-	return p;
-}
-
-static __isl_give isl_printer *print_constraint(struct isl_basic_map *bmap,
-	__isl_keep isl_space *dim, __isl_take isl_printer *p,
-	isl_int *c, int last, const char *op, int first_constraint, int latex)
-{
-	if (!first_constraint)
-		p = isl_printer_print_str(p, s_and[latex]);
-
-	isl_int_abs(c[last], c[last]);
-
-	p = print_term(dim, NULL, c[last], last, p, latex);
-
-	p = isl_printer_print_str(p, " ");
-	p = isl_printer_print_str(p, op);
-	p = isl_printer_print_str(p, " ");
-
-	isl_int_set_si(c[last], 0);
-	p = print_affine(bmap, dim, p, c);
-
-	return p;
-}
-
-static __isl_give isl_printer *print_constraints(__isl_keep isl_basic_map *bmap,
-	__isl_keep isl_space *dim, __isl_take isl_printer *p, int latex)
-{
-	int i;
-	struct isl_vec *c;
-	unsigned total = isl_basic_map_total_dim(bmap);
-
-	c = isl_vec_alloc(bmap->ctx, 1 + total);
-	if (!c)
-		goto error;
-
-	for (i = bmap->n_eq - 1; i >= 0; --i) {
-		int l = isl_seq_last_non_zero(bmap->eq[i], 1 + total);
-		if (l < 0) {
-			if (i != bmap->n_eq - 1)
-				p = isl_printer_print_str(p, s_and[latex]);
-			p = isl_printer_print_str(p, "0 = 0");
-			continue;
-		}
-		if (isl_int_is_neg(bmap->eq[i][l]))
-			isl_seq_cpy(c->el, bmap->eq[i], 1 + total);
-		else
-			isl_seq_neg(c->el, bmap->eq[i], 1 + total);
-		p = print_constraint(bmap, dim, p, c->el, l,
-				    "=", i == bmap->n_eq - 1, latex);
-	}
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		int l = isl_seq_last_non_zero(bmap->ineq[i], 1 + total);
-		int s;
-		const char *op;
-		if (l < 0)
-			continue;
-		s = isl_int_sgn(bmap->ineq[i][l]);
-		if (s < 0)
-			isl_seq_cpy(c->el, bmap->ineq[i], 1 + total);
-		else
-			isl_seq_neg(c->el, bmap->ineq[i], 1 + total);
-		op = s < 0 ? s_le[latex] : s_ge[latex];
-		p = print_constraint(bmap, dim, p, c->el, l,
-					op, !bmap->n_eq && !i, latex);
-	}
-
-	isl_vec_free(c);
-
-	return p;
-error:
-	isl_vec_free(c);
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_omega_constraints(
-	__isl_keep isl_basic_map *bmap, __isl_take isl_printer *p)
-{
-	if (bmap->n_eq + bmap->n_ineq == 0)
-		return p;
-
-	p = isl_printer_print_str(p, ": ");
-	if (bmap->n_div > 0) {
-		int i;
-		p = isl_printer_print_str(p, "exists (");
-		for (i = 0; i < bmap->n_div; ++i) {
-			if (i)
-				p = isl_printer_print_str(p, ", ");
-			p = print_name(bmap->dim, p, isl_dim_div, i, 0);
-		}
-		p = isl_printer_print_str(p, ": ");
-	}
-	p = print_constraints(bmap, bmap->dim, p, 0);
-	if (bmap->n_div > 0)
-		p = isl_printer_print_str(p, ")");
-	return p;
-}
-
-static __isl_give isl_printer *basic_map_print_omega(
-	__isl_keep isl_basic_map *bmap, __isl_take isl_printer *p)
-{
-	p = isl_printer_print_str(p, "{ [");
-	p = print_var_list(bmap->dim, p, isl_dim_in, 0, NULL, NULL);
-	p = isl_printer_print_str(p, "] -> [");
-	p = print_var_list(bmap->dim, p, isl_dim_out, 0, NULL, NULL);
-	p = isl_printer_print_str(p, "] ");
-	p = print_omega_constraints(bmap, p);
-	p = isl_printer_print_str(p, " }");
-	return p;
-}
-
-static __isl_give isl_printer *isl_basic_map_print_omega(
-	__isl_keep isl_basic_map *bmap, __isl_take isl_printer *p)
-{
-	p = print_omega_parameters(bmap->dim, p);
-
-	p = isl_printer_start_line(p);
-	p = basic_map_print_omega(bmap, p);
-	p = isl_printer_end_line(p);
-	return p;
-}
-
-static __isl_give isl_printer *basic_set_print_omega(
-	__isl_keep isl_basic_set *bset, __isl_take isl_printer *p)
-{
-	p = isl_printer_print_str(p, "{ [");
-	p = print_var_list(bset->dim, p, isl_dim_set, 0, NULL, NULL);
-	p = isl_printer_print_str(p, "] ");
-	p = print_omega_constraints((isl_basic_map *)bset, p);
-	p = isl_printer_print_str(p, " }");
-	return p;
-}
-
-static __isl_give isl_printer *isl_basic_set_print_omega(
-	__isl_keep isl_basic_set *bset, __isl_take isl_printer *p)
-{
-	p = print_omega_parameters(bset->dim, p);
-
-	p = isl_printer_start_line(p);
-	p = basic_set_print_omega(bset, p);
-	p = isl_printer_end_line(p);
-	return p;
-}
-
-static __isl_give isl_printer *isl_map_print_omega(__isl_keep isl_map *map,
-	__isl_take isl_printer *p)
-{
-	int i;
-
-	p = print_omega_parameters(map->dim, p);
-
-	p = isl_printer_start_line(p);
-	for (i = 0; i < map->n; ++i) {
-		if (i)
-			p = isl_printer_print_str(p, " union ");
-		p = basic_map_print_omega(map->p[i], p);
-	}
-	p = isl_printer_end_line(p);
-	return p;
-}
-
-static __isl_give isl_printer *isl_set_print_omega(__isl_keep isl_set *set,
-	__isl_take isl_printer *p)
-{
-	int i;
-
-	p = print_omega_parameters(set->dim, p);
-
-	p = isl_printer_start_line(p);
-	for (i = 0; i < set->n; ++i) {
-		if (i)
-			p = isl_printer_print_str(p, " union ");
-		p = basic_set_print_omega(set->p[i], p);
-	}
-	p = isl_printer_end_line(p);
-	return p;
-}
-
-static __isl_give isl_printer *print_disjunct(__isl_keep isl_basic_map *bmap,
-	__isl_keep isl_space *dim, __isl_take isl_printer *p, int latex)
-{
-	if (bmap->n_div > 0) {
-		int i;
-		p = isl_printer_print_str(p, s_open_exists[latex]);
-		for (i = 0; i < bmap->n_div; ++i) {
-			if (i)
-				p = isl_printer_print_str(p, ", ");
-			p = print_name(dim, p, isl_dim_div, i, latex);
-			if (latex || isl_int_is_zero(bmap->div[i][0]))
-				continue;
-			p = isl_printer_print_str(p, " = [(");
-			p = print_affine(bmap, dim, p, bmap->div[i] + 1);
-			p = isl_printer_print_str(p, ")/");
-			p = isl_printer_print_isl_int(p, bmap->div[i][0]);
-			p = isl_printer_print_str(p, "]");
-		}
-		p = isl_printer_print_str(p, ": ");
-	}
-
-	p = print_constraints(bmap, dim, p, latex);
-
-	if (bmap->n_div > 0)
-		p = isl_printer_print_str(p, s_close_exists[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)
-{
-	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, latex, NULL, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	p = isl_printer_print_str(p, "{ ");
-	p = print_space(bmap->dim, p, latex, rational, NULL, NULL);
-	p = isl_printer_print_str(p, " : ");
-	p = print_disjunct(bmap, bmap->dim, p, latex);
-	p = isl_printer_print_str(p, " }");
-	return p;
-}
-
-static __isl_give isl_printer *print_disjuncts(__isl_keep isl_map *map,
-	__isl_take isl_printer *p, int latex)
-{
-	int i;
-
-	if (isl_map_plain_is_universe(map))
-		return p;
-
-	p = isl_printer_print_str(p, s_such_that[latex]);
-	if (map->n == 0)
-		p = isl_printer_print_str(p, "1 = 0");
-	for (i = 0; i < map->n; ++i) {
-		if (i)
-			p = isl_printer_print_str(p, s_or[latex]);
-		if (map->n > 1 && map->p[i]->n_eq + map->p[i]->n_ineq > 1)
-			p = isl_printer_print_str(p, "(");
-		p = print_disjunct(map->p[i], map->dim, p, latex);
-		if (map->n > 1 && map->p[i]->n_eq + map->p[i]->n_ineq > 1)
-			p = isl_printer_print_str(p, ")");
-	}
-	return p;
-}
-
-/* Print the disjuncts of a map (or set).
- * If the map turns out to be a universal parameter domain, then
- * we need to print the colon.  Otherwise, the output looks identical
- * to the empty set.
- */
-static __isl_give isl_printer *print_disjuncts_map(__isl_keep isl_map *map,
-	__isl_take isl_printer *p, int latex)
-{
-	if (isl_map_plain_is_universe(map) && isl_space_is_params(map->dim))
-		return isl_printer_print_str(p, s_such_that[latex]);
-	else
-		return print_disjuncts(map, p, latex);
-}
-
-struct isl_aff_split {
-	isl_basic_map *aff;
-	isl_map *map;
-};
-
-static void free_split(__isl_take struct isl_aff_split *split, int n)
-{
-	int i;
-
-	if (!split)
-		return;
-
-	for (i = 0; i < n; ++i) {
-		isl_basic_map_free(split[i].aff);
-		isl_map_free(split[i].map);
-	}
-
-	free(split);
-}
-
-static __isl_give isl_basic_map *get_aff(__isl_take isl_basic_map *bmap)
-{
-	int i, j;
-	unsigned nparam, n_in, n_out, total;
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		return NULL;
-	if (isl_basic_map_free_inequality(bmap, bmap->n_ineq) < 0)
-		goto error;
-
-	nparam = isl_basic_map_dim(bmap, isl_dim_param);
-	n_in = isl_basic_map_dim(bmap, isl_dim_in);
-	n_out = isl_basic_map_dim(bmap, isl_dim_out);
-	total = isl_basic_map_dim(bmap, isl_dim_all);
-	for (i = bmap->n_eq - 1; i >= 0; --i) {
-		j = isl_seq_last_non_zero(bmap->eq[i] + 1, total);
-		if (j >= nparam && j < nparam + n_in + n_out &&
-		    (isl_int_is_one(bmap->eq[i][1 + j]) ||
-		     isl_int_is_negone(bmap->eq[i][1 + j])))
-			continue;
-		if (isl_basic_map_drop_equality(bmap, i) < 0)
-			goto error;
-	}
-
-	bmap = isl_basic_map_finalize(bmap);
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static int aff_split_cmp(const void *p1, const void *p2)
-{
-	const struct isl_aff_split *s1, *s2;
-	s1 = (const struct isl_aff_split *) p1;
-	s2 = (const struct isl_aff_split *) p2;
-
-	return isl_basic_map_plain_cmp(s1->aff, s2->aff);
-}
-
-static __isl_give isl_basic_map *drop_aff(__isl_take isl_basic_map *bmap,
-	__isl_keep isl_basic_map *aff)
-{
-	int i, j;
-	unsigned total;
-
-	if (!bmap || !aff)
-		goto error;
-
-	total = isl_space_dim(bmap->dim, isl_dim_all);
-
-	for (i = bmap->n_eq - 1; i >= 0; --i) {
-		if (isl_seq_first_non_zero(bmap->eq[i] + 1 + total,
-					    bmap->n_div) != -1)
-			continue;
-		for (j = 0; j < aff->n_eq; ++j) {
-			if (!isl_seq_eq(bmap->eq[i], aff->eq[j], 1 + total) &&
-			    !isl_seq_is_neg(bmap->eq[i], aff->eq[j], 1 + total))
-				continue;
-			if (isl_basic_map_drop_equality(bmap, i) < 0)
-				goto error;
-			break;
-		}
-	}
-
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-static __isl_give struct isl_aff_split *split_aff(__isl_keep isl_map *map)
-{
-	int i, n;
-	struct isl_aff_split *split;
-	isl_ctx *ctx;
-
-	ctx = isl_map_get_ctx(map);
-	split = isl_calloc_array(ctx, struct isl_aff_split, map->n);
-	if (!split)
-		return NULL;
-
-	for (i = 0; i < map->n; ++i) {
-		isl_basic_map *bmap;
-		split[i].aff = get_aff(isl_basic_map_copy(map->p[i]));
-		bmap = isl_basic_map_copy(map->p[i]);
-		bmap = isl_basic_map_cow(bmap);
-		bmap = drop_aff(bmap, split[i].aff);
-		split[i].map = isl_map_from_basic_map(bmap);
-		if (!split[i].aff || !split[i].map)
-			goto error;
-	}
-
-	qsort(split, map->n, sizeof(struct isl_aff_split), &aff_split_cmp);
-
-	n = map->n;
-	for (i = n - 1; i >= 1; --i) {
-		if (!isl_basic_map_plain_is_equal(split[i - 1].aff,
-						 split[i].aff))
-			continue;
-		isl_basic_map_free(split[i].aff);
-		split[i - 1].map = isl_map_union(split[i - 1].map,
-						 split[i].map);
-		if (i != n - 1)
-			split[i] = split[n - 1];
-		split[n - 1].aff = NULL;
-		split[n - 1].map = NULL;
-		--n;
-	}
-
-	return split;
-error:
-	free_split(split, map->n);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_split_map(__isl_take isl_printer *p,
-	struct isl_aff_split *split, int n)
-{
-	int i;
-	int rational;
-
-	for (i = 0; i < n; ++i) {
-		isl_space *dim;
-
-		if (!split[i].map)
-			break;
-		dim = split[i].map->dim;
-		rational = split[i].map->n > 0 &&
-		    ISL_F_ISSET(split[i].map->p[0], ISL_BASIC_MAP_RATIONAL);
-		if (i)
-			p = isl_printer_print_str(p, "; ");
-		p = print_space(dim, p, 0, rational, split[i].aff, NULL);
-		p = print_disjuncts_map(split[i].map, p, 0);
-	}
-
-	return p;
-}
-
-static __isl_give isl_printer *isl_map_print_isl_body(__isl_keep isl_map *map,
-	__isl_take isl_printer *p)
-{
-	struct isl_aff_split *split = NULL;
-	int rational;
-
-	if (map->n > 0)
-		split = split_aff(map);
-	if (split) {
-		p = print_split_map(p, split, map->n);
-	} else {
-		rational = map->n > 0 &&
-		    ISL_F_ISSET(map->p[0], ISL_BASIC_MAP_RATIONAL);
-		p = print_space(map->dim, p, 0, rational, NULL, NULL);
-		p = print_disjuncts_map(map, p, 0);
-	}
-	free_split(split, map->n);
-	return p;
-}
-
-static __isl_give isl_printer *isl_map_print_isl(__isl_keep isl_map *map,
-	__isl_take isl_printer *p)
-{
-	if (isl_map_dim(map, isl_dim_param) > 0) {
-		p = print_tuple(map->dim, p, isl_dim_param, 0, NULL, NULL);
-		p = isl_printer_print_str(p, s_to[0]);
-	}
-	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]);
-	return p;
-}
-
-static __isl_give isl_printer *print_latex_map(__isl_keep isl_map *map,
-	__isl_take isl_printer *p, __isl_keep isl_basic_map *aff)
-{
-	if (isl_map_dim(map, isl_dim_param) > 0) {
-		p = print_tuple(map->dim, p, isl_dim_param, 1, NULL, NULL);
-		p = isl_printer_print_str(p, s_to[1]);
-	}
-	p = isl_printer_print_str(p, s_open_set[1]);
-	p = print_space(map->dim, p, 1, 0, aff, NULL);
-	p = print_disjuncts_map(map, p, 1);
-	p = isl_printer_print_str(p, s_close_set[1]);
-
-	return p;
-}
-
-static __isl_give isl_printer *isl_map_print_latex(__isl_keep isl_map *map,
-	__isl_take isl_printer *p)
-{
-	int i;
-	struct isl_aff_split *split = NULL;
-
-	if (map->n > 0)
-		split = split_aff(map);
-
-	if (!split)
-		return print_latex_map(map, p, NULL);
-
-	for (i = 0; i < map->n; ++i) {
-		if (!split[i].map)
-			break;
-		if (i)
-			p = isl_printer_print_str(p, " \\cup ");
-		p = print_latex_map(split[i].map, p, split[i].aff);
-	}
-
-	free_split(split, map->n);
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_print_basic_map(__isl_take isl_printer *p,
-	__isl_keep isl_basic_map *bmap)
-{
-	if (!p || !bmap)
-		goto error;
-	if (p->output_format == ISL_FORMAT_ISL)
-		return isl_basic_map_print_isl(bmap, p, 0);
-	else if (p->output_format == ISL_FORMAT_OMEGA)
-		return isl_basic_map_print_omega(bmap, p);
-	isl_assert(bmap->ctx, 0, goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void isl_basic_map_print(__isl_keep isl_basic_map *bmap, FILE *out, int indent,
-	const char *prefix, const char *suffix, unsigned output_format)
-{
-	isl_printer *printer;
-
-	if (!bmap)
-		return;
-
-	printer = isl_printer_to_file(bmap->ctx, out);
-	printer = isl_printer_set_indent(printer, indent);
-	printer = isl_printer_set_prefix(printer, prefix);
-	printer = isl_printer_set_suffix(printer, suffix);
-	printer = isl_printer_set_output_format(printer, output_format);
-	isl_printer_print_basic_map(printer, bmap);
-
-	isl_printer_free(printer);
-}
-
-__isl_give isl_printer *isl_printer_print_basic_set(__isl_take isl_printer *p,
-	__isl_keep isl_basic_set *bset)
-{
-	if (!p || !bset)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return isl_basic_map_print_isl(bset, p, 0);
-	else if (p->output_format == ISL_FORMAT_POLYLIB)
-		return isl_basic_set_print_polylib(bset, p, 0);
-	else if (p->output_format == ISL_FORMAT_EXT_POLYLIB)
-		return isl_basic_set_print_polylib(bset, p, 1);
-	else if (p->output_format == ISL_FORMAT_POLYLIB_CONSTRAINTS)
-		return bset_print_constraints_polylib(bset, p);
-	else if (p->output_format == ISL_FORMAT_OMEGA)
-		return isl_basic_set_print_omega(bset, p);
-	isl_assert(p->ctx, 0, goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void isl_basic_set_print(struct isl_basic_set *bset, FILE *out, int indent,
-	const char *prefix, const char *suffix, unsigned output_format)
-{
-	isl_printer *printer;
-
-	if (!bset)
-		return;
-
-	printer = isl_printer_to_file(bset->ctx, out);
-	printer = isl_printer_set_indent(printer, indent);
-	printer = isl_printer_set_prefix(printer, prefix);
-	printer = isl_printer_set_suffix(printer, suffix);
-	printer = isl_printer_set_output_format(printer, output_format);
-	isl_printer_print_basic_set(printer, bset);
-
-	isl_printer_free(printer);
-}
-
-__isl_give isl_printer *isl_printer_print_set(__isl_take isl_printer *p,
-	__isl_keep isl_set *set)
-{
-	if (!p || !set)
-		goto error;
-	if (p->output_format == ISL_FORMAT_ISL)
-		return isl_map_print_isl((isl_map *)set, p);
-	else if (p->output_format == ISL_FORMAT_POLYLIB)
-		return isl_set_print_polylib(set, p, 0);
-	else if (p->output_format == ISL_FORMAT_EXT_POLYLIB)
-		return isl_set_print_polylib(set, p, 1);
-	else if (p->output_format == ISL_FORMAT_OMEGA)
-		return isl_set_print_omega(set, p);
-	else if (p->output_format == ISL_FORMAT_LATEX)
-		return isl_map_print_latex((isl_map *)set, p);
-	isl_assert(set->ctx, 0, goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void isl_set_print(struct isl_set *set, FILE *out, int indent,
-	unsigned output_format)
-{
-	isl_printer *printer;
-
-	if (!set)
-		return;
-
-	printer = isl_printer_to_file(set->ctx, out);
-	printer = isl_printer_set_indent(printer, indent);
-	printer = isl_printer_set_output_format(printer, output_format);
-	printer = isl_printer_print_set(printer, set);
-
-	isl_printer_free(printer);
-}
-
-__isl_give isl_printer *isl_printer_print_map(__isl_take isl_printer *p,
-	__isl_keep isl_map *map)
-{
-	if (!p || !map)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return isl_map_print_isl(map, p);
-	else if (p->output_format == ISL_FORMAT_POLYLIB)
-		return isl_map_print_polylib(map, p, 0);
-	else if (p->output_format == ISL_FORMAT_EXT_POLYLIB)
-		return isl_map_print_polylib(map, p, 1);
-	else if (p->output_format == ISL_FORMAT_OMEGA)
-		return isl_map_print_omega(map, p);
-	else if (p->output_format == ISL_FORMAT_LATEX)
-		return isl_map_print_latex(map, p);
-	isl_assert(map->ctx, 0, goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-struct isl_union_print_data {
-	isl_printer *p;
-	int first;
-};
-
-static int print_map_body(__isl_take isl_map *map, void *user)
-{
-	struct isl_union_print_data *data;
-	data = (struct isl_union_print_data *)user;
-
-	if (!data->first)
-		data->p = isl_printer_print_str(data->p, "; ");
-	data->first = 0;
-
-	data->p = isl_map_print_isl_body(map, data->p);
-	isl_map_free(map);
-
-	return 0;
-}
-
-static __isl_give isl_printer *isl_union_map_print_isl(
-	__isl_keep isl_union_map *umap, __isl_take isl_printer *p)
-{
-	struct isl_union_print_data data = { p, 1 };
-	isl_space *dim;
-	dim = isl_union_map_get_space(umap);
-	if (isl_space_dim(dim, isl_dim_param) > 0) {
-		p = print_tuple(dim, p, isl_dim_param, 0, NULL, NULL);
-		p = isl_printer_print_str(p, s_to[0]);
-	}
-	isl_space_free(dim);
-	p = isl_printer_print_str(p, s_open_set[0]);
-	isl_union_map_foreach_map(umap, &print_map_body, &data);
-	p = data.p;
-	p = isl_printer_print_str(p, s_close_set[0]);
-	return p;
-}
-
-static int print_latex_map_body(__isl_take isl_map *map, void *user)
-{
-	struct isl_union_print_data *data;
-	data = (struct isl_union_print_data *)user;
-
-	if (!data->first)
-		data->p = isl_printer_print_str(data->p, " \\cup ");
-	data->first = 0;
-
-	data->p = isl_map_print_latex(map, data->p);
-	isl_map_free(map);
-
-	return 0;
-}
-
-static __isl_give isl_printer *isl_union_map_print_latex(
-	__isl_keep isl_union_map *umap, __isl_take isl_printer *p)
-{
-	struct isl_union_print_data data = { p, 1 };
-	isl_union_map_foreach_map(umap, &print_latex_map_body, &data);
-	p = data.p;
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_print_union_map(__isl_take isl_printer *p,
-	__isl_keep isl_union_map *umap)
-{
-	if (!p || !umap)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return isl_union_map_print_isl(umap, p);
-	if (p->output_format == ISL_FORMAT_LATEX)
-		return isl_union_map_print_latex(umap, p);
-
-	isl_die(p->ctx, isl_error_invalid,
-		"invalid output format for isl_union_map", goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-__isl_give isl_printer *isl_printer_print_union_set(__isl_take isl_printer *p,
-	__isl_keep isl_union_set *uset)
-{
-	if (!p || !uset)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return isl_union_map_print_isl((isl_union_map *)uset, p);
-	if (p->output_format == ISL_FORMAT_LATEX)
-		return isl_union_map_print_latex((isl_union_map *)uset, p);
-
-	isl_die(p->ctx, isl_error_invalid,
-		"invalid output format for isl_union_set", goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void isl_map_print(__isl_keep isl_map *map, FILE *out, int indent,
-	unsigned output_format)
-{
-	isl_printer *printer;
-
-	if (!map)
-		return;
-
-	printer = isl_printer_to_file(map->ctx, out);
-	printer = isl_printer_set_indent(printer, indent);
-	printer = isl_printer_set_output_format(printer, output_format);
-	printer = isl_printer_print_map(printer, map);
-
-	isl_printer_free(printer);
-}
-
-static int upoly_rec_n_non_zero(__isl_keep struct isl_upoly_rec *rec)
-{
-	int i;
-	int n;
-
-	for (i = 0, n = 0; i < rec->n; ++i)
-		if (!isl_upoly_is_zero(rec->p[i]))
-			++n;
-
-	return n;
-}
-
-static __isl_give isl_printer *print_div(__isl_keep isl_space *dim,
-	__isl_keep isl_mat *div, int pos, __isl_take isl_printer *p)
-{
-	int c = p->output_format == ISL_FORMAT_C;
-	p = isl_printer_print_str(p, c ? "floord(" : "[(");
-	p = print_affine_of_len(dim, div, p,
-				div->row[pos] + 1, div->n_col - 1);
-	p = isl_printer_print_str(p, c ? ", " : ")/");
-	p = isl_printer_print_isl_int(p, div->row[pos][0]);
-	p = isl_printer_print_str(p, c ? ")" : "]");
-	return p;
-}
-
-static __isl_give isl_printer *upoly_print_cst(__isl_keep struct isl_upoly *up,
-	__isl_take isl_printer *p, int first)
-{
-	struct isl_upoly_cst *cst;
-	int neg;
-
-	cst = isl_upoly_as_cst(up);
-	if (!cst)
-		goto error;
-	neg = !first && isl_int_is_neg(cst->n);
-	if (!first)
-		p = isl_printer_print_str(p, neg ? " - " :  " + ");
-	if (neg)
-		isl_int_neg(cst->n, cst->n);
-	if (isl_int_is_zero(cst->d)) {
-		int sgn = isl_int_sgn(cst->n);
-		p = isl_printer_print_str(p, sgn < 0 ? "-infty" :
-					    sgn == 0 ? "NaN" : "infty");
-	} else
-		p = isl_printer_print_isl_int(p, cst->n);
-	if (neg)
-		isl_int_neg(cst->n, cst->n);
-	if (!isl_int_is_zero(cst->d) && !isl_int_is_one(cst->d)) {
-		p = isl_printer_print_str(p, "/");
-		p = isl_printer_print_isl_int(p, cst->d);
-	}
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_base(__isl_take isl_printer *p,
-	__isl_keep isl_space *dim, __isl_keep isl_mat *div, int var)
-{
-	unsigned total;
-
-	total = isl_space_dim(dim, isl_dim_all);
-	if (var < total)
-		p = print_term(dim, NULL, dim->ctx->one, 1 + var, p, 0);
-	else
-		p = print_div(dim, div, var - total, p);
-	return p;
-}
-
-static __isl_give isl_printer *print_pow(__isl_take isl_printer *p,
-	__isl_keep isl_space *dim, __isl_keep isl_mat *div, int var, int exp)
-{
-	p = print_base(p, dim, div, var);
-	if (exp == 1)
-		return p;
-	if (p->output_format == ISL_FORMAT_C) {
-		int i;
-		for (i = 1; i < exp; ++i) {
-			p = isl_printer_print_str(p, "*");
-			p = print_base(p, dim, div, var);
-		}
-	} else {
-		p = isl_printer_print_str(p, "^");
-		p = isl_printer_print_int(p, exp);
-	}
-	return p;
-}
-
-static __isl_give isl_printer *upoly_print(__isl_keep struct isl_upoly *up,
-	__isl_keep isl_space *dim, __isl_keep isl_mat *div,
-	__isl_take isl_printer *p, int outer)
-{
-	int i, n, first, print_parens;
-	struct isl_upoly_rec *rec;
-
-	if (!p || !up || !dim || !div)
-		goto error;
-
-	if (isl_upoly_is_cst(up))
-		return upoly_print_cst(up, p, 1);
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-	n = upoly_rec_n_non_zero(rec);
-	print_parens = n > 1 ||
-		    (outer && rec->up.var >= isl_space_dim(dim, isl_dim_all));
-	if (print_parens)
-		p = isl_printer_print_str(p, "(");
-	for (i = 0, first = 1; i < rec->n; ++i) {
-		if (isl_upoly_is_zero(rec->p[i]))
-			continue;
-		if (isl_upoly_is_negone(rec->p[i])) {
-			if (!i)
-				p = isl_printer_print_str(p, "-1");
-			else if (first)
-				p = isl_printer_print_str(p, "-");
-			else
-				p = isl_printer_print_str(p, " - ");
-		} else if (isl_upoly_is_cst(rec->p[i]) &&
-				!isl_upoly_is_one(rec->p[i]))
-			p = upoly_print_cst(rec->p[i], p, first);
-		else {
-			if (!first)
-				p = isl_printer_print_str(p, " + ");
-			if (i == 0 || !isl_upoly_is_one(rec->p[i]))
-				p = upoly_print(rec->p[i], dim, div, p, 0);
-		}
-		first = 0;
-		if (i == 0)
-			continue;
-		if (!isl_upoly_is_one(rec->p[i]) &&
-		    !isl_upoly_is_negone(rec->p[i]))
-			p = isl_printer_print_str(p, " * ");
-		p = print_pow(p, dim, div, rec->up.var, i);
-	}
-	if (print_parens)
-		p = isl_printer_print_str(p, ")");
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_qpolynomial(__isl_take isl_printer *p,
-	__isl_keep isl_qpolynomial *qp)
-{
-	if (!p || !qp)
-		goto error;
-	p = upoly_print(qp->upoly, qp->dim, qp->div, p, 1);
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_qpolynomial_isl(__isl_take isl_printer *p,
-	__isl_keep isl_qpolynomial *qp)
-{
-	if (!p || !qp)
-		goto error;
-
-	if (isl_space_dim(qp->dim, isl_dim_param) > 0) {
-		p = print_tuple(qp->dim, p, isl_dim_param, 0, NULL, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	p = isl_printer_print_str(p, "{ ");
-	if (!isl_space_is_params(qp->dim)) {
-		p = print_space(qp->dim, p, 0, 0, NULL, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	p = print_qpolynomial(p, qp);
-	p = isl_printer_print_str(p, " }");
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_qpolynomial_c(__isl_take isl_printer *p,
-	__isl_keep isl_space *dim, __isl_keep isl_qpolynomial *qp)
-{
-	isl_int den;
-
-	isl_int_init(den);
-	isl_qpolynomial_get_den(qp, &den);
-	if (!isl_int_is_one(den)) {
-		isl_qpolynomial *f;
-		p = isl_printer_print_str(p, "(");
-		qp = isl_qpolynomial_copy(qp);
-		f = isl_qpolynomial_rat_cst_on_domain(isl_space_copy(qp->dim),
-						den, qp->dim->ctx->one);
-		qp = isl_qpolynomial_mul(qp, f);
-	}
-	if (qp)
-		p = upoly_print(qp->upoly, dim, qp->div, p, 0);
-	if (!isl_int_is_one(den)) {
-		p = isl_printer_print_str(p, ")/");
-		p = isl_printer_print_isl_int(p, den);
-		isl_qpolynomial_free(qp);
-	}
-	isl_int_clear(den);
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_print_qpolynomial(
-	__isl_take isl_printer *p, __isl_keep isl_qpolynomial *qp)
-{
-	if (!p || !qp)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return print_qpolynomial_isl(p, qp);
-	else if (p->output_format == ISL_FORMAT_C)
-		return print_qpolynomial_c(p, qp->dim, qp);
-	else
-		isl_die(qp->dim->ctx, isl_error_unsupported,
-			"output format not supported for isl_qpolynomials",
-			goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void isl_qpolynomial_print(__isl_keep isl_qpolynomial *qp, FILE *out,
-	unsigned output_format)
-{
-	isl_printer *p;
-
-	if  (!qp)
-		return;
-
-	isl_assert(qp->dim->ctx, output_format == ISL_FORMAT_ISL, return);
-	p = isl_printer_to_file(qp->dim->ctx, out);
-	p = isl_printer_print_qpolynomial(p, qp);
-	isl_printer_free(p);
-}
-
-static __isl_give isl_printer *qpolynomial_fold_print(
-	__isl_keep isl_qpolynomial_fold *fold, __isl_take isl_printer *p)
-{
-	int i;
-
-	if (fold->type == isl_fold_min)
-		p = isl_printer_print_str(p, "min");
-	else if (fold->type == isl_fold_max)
-		p = isl_printer_print_str(p, "max");
-	p = isl_printer_print_str(p, "(");
-	for (i = 0; i < fold->n; ++i) {
-		if (i)
-			p = isl_printer_print_str(p, ", ");
-		p = print_qpolynomial(p, fold->qp[i]);
-	}
-	p = isl_printer_print_str(p, ")");
-	return p;
-}
-
-void isl_qpolynomial_fold_print(__isl_keep isl_qpolynomial_fold *fold,
-	FILE *out, unsigned output_format)
-{
-	isl_printer *p;
-
-	if (!fold)
-		return;
-
-	isl_assert(fold->dim->ctx, output_format == ISL_FORMAT_ISL, return);
-
-	p = isl_printer_to_file(fold->dim->ctx, out);
-	p = isl_printer_print_qpolynomial_fold(p, fold);
-
-	isl_printer_free(p);
-}
-
-static __isl_give isl_printer *isl_pwqp_print_isl_body(
-	__isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial *pwqp)
-{
-	int i = 0;
-
-	for (i = 0; i < pwqp->n; ++i) {
-		if (i)
-			p = isl_printer_print_str(p, "; ");
-		if (!isl_space_is_params(pwqp->p[i].set->dim)) {
-			p = print_space(pwqp->p[i].set->dim, p, 0, 0, NULL, NULL);
-			p = isl_printer_print_str(p, " -> ");
-		}
-		p = print_qpolynomial(p, pwqp->p[i].qp);
-		p = print_disjuncts((isl_map *)pwqp->p[i].set, p, 0);
-	}
-
-	return p;
-}
-
-static __isl_give isl_printer *print_pw_qpolynomial_isl(
-	__isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial *pwqp)
-{
-	if (!p || !pwqp)
-		goto error;
-
-	if (isl_space_dim(pwqp->dim, isl_dim_param) > 0) {
-		p = print_tuple(pwqp->dim, p, isl_dim_param, 0, NULL, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	p = isl_printer_print_str(p, "{ ");
-	if (pwqp->n == 0) {
-		if (!isl_space_is_set(pwqp->dim)) {
-			p = print_tuple(pwqp->dim, p, isl_dim_in, 0, NULL, NULL);
-			p = isl_printer_print_str(p, " -> ");
-		}
-		p = isl_printer_print_str(p, "0");
-	}
-	p = isl_pwqp_print_isl_body(p, pwqp);
-	p = isl_printer_print_str(p, " }");
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void isl_pw_qpolynomial_print(__isl_keep isl_pw_qpolynomial *pwqp, FILE *out,
-	unsigned output_format)
-{
-	isl_printer *p;
-
-	if (!pwqp)
-		return;
-
-	p = isl_printer_to_file(pwqp->dim->ctx, out);
-	p = isl_printer_set_output_format(p, output_format);
-	p = isl_printer_print_pw_qpolynomial(p, pwqp);
-
-	isl_printer_free(p);
-}
-
-static __isl_give isl_printer *isl_pwf_print_isl_body(
-	__isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial_fold *pwf)
-{
-	int i = 0;
-
-	for (i = 0; i < pwf->n; ++i) {
-		if (i)
-			p = isl_printer_print_str(p, "; ");
-		if (!isl_space_is_params(pwf->p[i].set->dim)) {
-			p = print_space(pwf->p[i].set->dim, p, 0, 0, NULL, NULL);
-			p = isl_printer_print_str(p, " -> ");
-		}
-		p = qpolynomial_fold_print(pwf->p[i].fold, p);
-		p = print_disjuncts((isl_map *)pwf->p[i].set, p, 0);
-	}
-
-	return p;
-}
-
-static __isl_give isl_printer *print_pw_qpolynomial_fold_isl(
-	__isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial_fold *pwf)
-{
-	if (isl_space_dim(pwf->dim, isl_dim_param) > 0) {
-		p = print_tuple(pwf->dim, p, isl_dim_param, 0, NULL, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	p = isl_printer_print_str(p, "{ ");
-	if (pwf->n == 0) {
-		if (!isl_space_is_set(pwf->dim)) {
-			p = print_tuple(pwf->dim, p, isl_dim_in, 0, NULL, NULL);
-			p = isl_printer_print_str(p, " -> ");
-		}
-		p = isl_printer_print_str(p, "0");
-	}
-	p = isl_pwf_print_isl_body(p, pwf);
-	p = isl_printer_print_str(p, " }");
-	return p;
-}
-
-static __isl_give isl_printer *print_affine_c(__isl_take isl_printer *p,
-	__isl_keep isl_space *dim, __isl_keep isl_basic_set *bset, isl_int *c);
-
-static __isl_give isl_printer *print_name_c(__isl_take isl_printer *p,
-	__isl_keep isl_space *dim,
-	__isl_keep isl_basic_set *bset, enum isl_dim_type type, unsigned pos)
-{
-	if (type == isl_dim_div) {
-		p = isl_printer_print_str(p, "floord(");
-		p = print_affine_c(p, dim, bset, bset->div[pos] + 1);
-		p = isl_printer_print_str(p, ", ");
-		p = isl_printer_print_isl_int(p, bset->div[pos][0]);
-		p = isl_printer_print_str(p, ")");
-	} else {
-		const char *name;
-
-		name = isl_space_get_dim_name(dim, type, pos);
-		if (!name)
-			name = "UNNAMED";
-		p = isl_printer_print_str(p, name);
-	}
-	return p;
-}
-
-static __isl_give isl_printer *print_term_c(__isl_take isl_printer *p,
-	__isl_keep isl_space *dim,
-	__isl_keep isl_basic_set *bset, isl_int c, unsigned pos)
-{
-	enum isl_dim_type type;
-
-	if (pos == 0)
-		return isl_printer_print_isl_int(p, c);
-
-	if (isl_int_is_one(c))
-		;
-	else if (isl_int_is_negone(c))
-		p = isl_printer_print_str(p, "-");
-	else {
-		p = isl_printer_print_isl_int(p, c);
-		p = isl_printer_print_str(p, "*");
-	}
-	type = pos2type(dim, &pos);
-	p = print_name_c(p, dim, bset, type, pos);
-	return p;
-}
-
-static __isl_give isl_printer *print_partial_affine_c(__isl_take isl_printer *p,
-	__isl_keep isl_space *dim,
-	__isl_keep isl_basic_set *bset, isl_int *c, unsigned len)
-{
-	int i;
-	int first;
-
-	for (i = 0, first = 1; i < len; ++i) {
-		int flip = 0;
-		if (isl_int_is_zero(c[i]))
-			continue;
-		if (!first) {
-			if (isl_int_is_neg(c[i])) {
-				flip = 1;
-				isl_int_neg(c[i], c[i]);
-				p = isl_printer_print_str(p, " - ");
-			} else 
-				p = isl_printer_print_str(p, " + ");
-		}
-		first = 0;
-		p = print_term_c(p, dim, bset, c[i], i);
-		if (flip)
-			isl_int_neg(c[i], c[i]);
-	}
-	if (first)
-		p = isl_printer_print_str(p, "0");
-	return p;
-}
-
-static __isl_give isl_printer *print_affine_c(__isl_take isl_printer *p,
-	__isl_keep isl_space *dim, __isl_keep isl_basic_set *bset, isl_int *c)
-{
-	unsigned len = 1 + isl_basic_set_total_dim(bset);
-	return print_partial_affine_c(p, dim, bset, c, len);
-}
-
-static __isl_give isl_printer *print_constraint_c(__isl_take isl_printer *p,
-	__isl_keep isl_space *dim,
-	__isl_keep isl_basic_set *bset, isl_int *c, const char *op, int first)
-{
-	if (!first)
-		p = isl_printer_print_str(p, " && ");
-
-	p = print_affine_c(p, dim, bset, c);
-	p = isl_printer_print_str(p, " ");
-	p = isl_printer_print_str(p, op);
-	p = isl_printer_print_str(p, " 0");
-	return p;
-}
-
-static __isl_give isl_printer *print_basic_set_c(__isl_take isl_printer *p,
-	__isl_keep isl_space *dim, __isl_keep isl_basic_set *bset)
-{
-	int i, j;
-	unsigned n_div = isl_basic_set_dim(bset, isl_dim_div);
-	unsigned total = isl_basic_set_total_dim(bset) - n_div;
-
-	for (i = 0; i < bset->n_eq; ++i) {
-		j = isl_seq_last_non_zero(bset->eq[i] + 1 + total, n_div);
-		if (j < 0)
-			p = print_constraint_c(p, dim, bset,
-						bset->eq[i], "==", !i);
-		else {
-			if (i)
-				p = isl_printer_print_str(p, " && ");
-			p = isl_printer_print_str(p, "(");
-			p = print_partial_affine_c(p, dim, bset, bset->eq[i],
-						   1 + total + j);
-			p = isl_printer_print_str(p, ") % ");
-			p = isl_printer_print_isl_int(p,
-						bset->eq[i][1 + total + j]);
-			p = isl_printer_print_str(p, " == 0");
-		}
-	}
-	for (i = 0; i < bset->n_ineq; ++i)
-		p = print_constraint_c(p, dim, bset, bset->ineq[i], ">=",
-					!bset->n_eq && !i);
-	return p;
-}
-
-static __isl_give isl_printer *print_set_c(__isl_take isl_printer *p,
-	__isl_keep isl_space *dim, __isl_keep isl_set *set)
-{
-	int i;
-
-	if (set->n == 0)
-		p = isl_printer_print_str(p, "0");
-
-	for (i = 0; i < set->n; ++i) {
-		if (i)
-			p = isl_printer_print_str(p, " || ");
-		if (set->n > 1)
-			p = isl_printer_print_str(p, "(");
-		p = print_basic_set_c(p, dim, set->p[i]);
-		if (set->n > 1)
-			p = isl_printer_print_str(p, ")");
-	}
-	return p;
-}
-
-static __isl_give isl_printer *print_pw_qpolynomial_c(
-	__isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial *pwqp)
-{
-	int i;
-
-	if (pwqp->n == 1 && isl_set_plain_is_universe(pwqp->p[0].set))
-		return print_qpolynomial_c(p, pwqp->dim, pwqp->p[0].qp);
-
-	for (i = 0; i < pwqp->n; ++i) {
-		p = isl_printer_print_str(p, "(");
-		p = print_set_c(p, pwqp->dim, pwqp->p[i].set);
-		p = isl_printer_print_str(p, ") ? (");
-		p = print_qpolynomial_c(p, pwqp->dim, pwqp->p[i].qp);
-		p = isl_printer_print_str(p, ") : ");
-	}
-
-	p = isl_printer_print_str(p, "0");
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_print_pw_qpolynomial(
-	__isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial *pwqp)
-{
-	if (!p || !pwqp)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return print_pw_qpolynomial_isl(p, pwqp);
-	else if (p->output_format == ISL_FORMAT_C)
-		return print_pw_qpolynomial_c(p, pwqp);
-	isl_assert(p->ctx, 0, goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static int print_pwqp_body(__isl_take isl_pw_qpolynomial *pwqp, void *user)
-{
-	struct isl_union_print_data *data;
-	data = (struct isl_union_print_data *)user;
-
-	if (!data->first)
-		data->p = isl_printer_print_str(data->p, "; ");
-	data->first = 0;
-
-	data->p = isl_pwqp_print_isl_body(data->p, pwqp);
-	isl_pw_qpolynomial_free(pwqp);
-
-	return 0;
-}
-
-static __isl_give isl_printer *print_union_pw_qpolynomial_isl(
-	__isl_take isl_printer *p, __isl_keep isl_union_pw_qpolynomial *upwqp)
-{
-	struct isl_union_print_data data = { p, 1 };
-	isl_space *dim;
-	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, 0, NULL, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	isl_space_free(dim);
-	p = isl_printer_print_str(p, "{ ");
-	isl_union_pw_qpolynomial_foreach_pw_qpolynomial(upwqp, &print_pwqp_body,
-							&data);
-	p = data.p;
-	p = isl_printer_print_str(p, " }");
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_print_union_pw_qpolynomial(
-	__isl_take isl_printer *p, __isl_keep isl_union_pw_qpolynomial *upwqp)
-{
-	if (!p || !upwqp)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return print_union_pw_qpolynomial_isl(p, upwqp);
-	isl_die(p->ctx, isl_error_invalid,
-		"invalid output format for isl_union_pw_qpolynomial",
-		goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_qpolynomial_fold_c(
-	__isl_take isl_printer *p, __isl_keep isl_space *dim,
-	__isl_keep isl_qpolynomial_fold *fold)
-{
-	int i;
-
-	for (i = 0; i < fold->n - 1; ++i)
-		if (fold->type == isl_fold_min)
-			p = isl_printer_print_str(p, "min(");
-		else if (fold->type == isl_fold_max)
-			p = isl_printer_print_str(p, "max(");
-
-	for (i = 0; i < fold->n; ++i) {
-		if (i)
-			p = isl_printer_print_str(p, ", ");
-		p = print_qpolynomial_c(p, dim, fold->qp[i]);
-		if (i)
-			p = isl_printer_print_str(p, ")");
-	}
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_print_qpolynomial_fold(
-	__isl_take isl_printer *p, __isl_keep isl_qpolynomial_fold *fold)
-{
-	if  (!p || !fold)
-		goto error;
-	if (p->output_format == ISL_FORMAT_ISL)
-		return qpolynomial_fold_print(fold, p);
-	else if (p->output_format == ISL_FORMAT_C)
-		return print_qpolynomial_fold_c(p, fold->dim, fold);
-	isl_die(p->ctx, isl_error_unsupported, "unsupported output format",
-		goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_pw_qpolynomial_fold_c(
-	__isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial_fold *pwf)
-{
-	int i;
-
-	if (pwf->n == 1 && isl_set_plain_is_universe(pwf->p[0].set))
-		return print_qpolynomial_fold_c(p, pwf->dim, pwf->p[0].fold);
-
-	for (i = 0; i < pwf->n; ++i) {
-		p = isl_printer_print_str(p, "(");
-		p = print_set_c(p, pwf->dim, pwf->p[i].set);
-		p = isl_printer_print_str(p, ") ? (");
-		p = print_qpolynomial_fold_c(p, pwf->dim, pwf->p[i].fold);
-		p = isl_printer_print_str(p, ") : ");
-	}
-
-	p = isl_printer_print_str(p, "0");
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_print_pw_qpolynomial_fold(
-	__isl_take isl_printer *p, __isl_keep isl_pw_qpolynomial_fold *pwf)
-{
-	if (!p || !pwf)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return print_pw_qpolynomial_fold_isl(p, pwf);
-	else if (p->output_format == ISL_FORMAT_C)
-		return print_pw_qpolynomial_fold_c(p, pwf);
-	isl_assert(p->ctx, 0, goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void isl_pw_qpolynomial_fold_print(__isl_keep isl_pw_qpolynomial_fold *pwf,
-	FILE *out, unsigned output_format)
-{
-	isl_printer *p;
-
-	if (!pwf)
-		return;
-
-	p = isl_printer_to_file(pwf->dim->ctx, out);
-	p = isl_printer_set_output_format(p, output_format);
-	p = isl_printer_print_pw_qpolynomial_fold(p, pwf);
-
-	isl_printer_free(p);
-}
-
-static int print_pwf_body(__isl_take isl_pw_qpolynomial_fold *pwf, void *user)
-{
-	struct isl_union_print_data *data;
-	data = (struct isl_union_print_data *)user;
-
-	if (!data->first)
-		data->p = isl_printer_print_str(data->p, "; ");
-	data->first = 0;
-
-	data->p = isl_pwf_print_isl_body(data->p, pwf);
-	isl_pw_qpolynomial_fold_free(pwf);
-
-	return 0;
-}
-
-static __isl_give isl_printer *print_union_pw_qpolynomial_fold_isl(
-	__isl_take isl_printer *p,
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf)
-{
-	struct isl_union_print_data data = { p, 1 };
-	isl_space *dim;
-	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, 0, NULL, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	isl_space_free(dim);
-	p = isl_printer_print_str(p, "{ ");
-	isl_union_pw_qpolynomial_fold_foreach_pw_qpolynomial_fold(upwf,
-							&print_pwf_body, &data);
-	p = data.p;
-	p = isl_printer_print_str(p, " }");
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_print_union_pw_qpolynomial_fold(
-	__isl_take isl_printer *p,
-	__isl_keep isl_union_pw_qpolynomial_fold *upwf)
-{
-	if (!p || !upwf)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return print_union_pw_qpolynomial_fold_isl(p, upwf);
-	isl_die(p->ctx, isl_error_invalid,
-		"invalid output format for isl_union_pw_qpolynomial_fold",
-		goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-__isl_give isl_printer *isl_printer_print_constraint(__isl_take isl_printer *p,
-	__isl_keep isl_constraint *c)
-{
-	isl_basic_map *bmap;
-
-	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);
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-__isl_give isl_printer *isl_printer_print_space(__isl_take isl_printer *p,
-	__isl_keep isl_space *dim)
-{
-	if (!dim)
-		goto error;
-
-	if (isl_space_dim(dim, isl_dim_param) > 0) {
-		p = print_tuple(dim, p, isl_dim_param, 0, NULL, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-
-	p = isl_printer_print_str(p, "{ ");
-	if (isl_space_is_params(dim))
-		p = isl_printer_print_str(p, s_such_that[0]);
-	else
-		p = print_space(dim, p, 0, 0, NULL, NULL);
-	p = isl_printer_print_str(p, " }");
-
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-__isl_give isl_printer *isl_printer_print_local_space(__isl_take isl_printer *p,
-	__isl_keep isl_local_space *ls)
-{
-	unsigned total;
-	unsigned n_div;
-
-	if (!ls)
-		goto error;
-
-	total = isl_local_space_dim(ls, isl_dim_all);
-	if (isl_local_space_dim(ls, isl_dim_param) > 0) {
-		p = print_tuple(ls->dim, p, isl_dim_param, 0, NULL, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	p = isl_printer_print_str(p, "{ ");
-	p = print_space(ls->dim, p, 0, 0, NULL, NULL);
-	n_div = isl_local_space_dim(ls, isl_dim_div);
-	if (n_div > 0) {
-		int i;
-		p = isl_printer_print_str(p, " : ");
-		p = isl_printer_print_str(p, s_open_exists[0]);
-		for (i = 0; i < n_div; ++i) {
-			if (i)
-				p = isl_printer_print_str(p, ", ");
-			p = print_name(ls->dim, p, isl_dim_div, i, 0);
-			if (isl_int_is_zero(ls->div->row[i][0]))
-				continue;
-			p = isl_printer_print_str(p, " = [(");
-			p = print_affine_of_len(ls->dim, ls->div, p,
-					    ls->div->row[i] + 1, 1 + total);
-			p = isl_printer_print_str(p, ")/");
-			p = isl_printer_print_isl_int(p, ls->div->row[i][0]);
-			p = isl_printer_print_str(p, "]");
-		}
-	} else if (isl_space_is_params(ls->dim))
-		p = isl_printer_print_str(p, s_such_that[0]);
-	p = isl_printer_print_str(p, " }");
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_aff_body(__isl_take isl_printer *p,
-	__isl_keep isl_aff *aff)
-{
-	unsigned total;
-
-	total = isl_local_space_dim(aff->ls, isl_dim_all);
-	p = isl_printer_print_str(p, "(");
-	p = print_affine_of_len(aff->ls->dim, aff->ls->div, p,
-				aff->v->el + 1, 1 + total);
-	if (isl_int_is_one(aff->v->el[0]))
-		p = isl_printer_print_str(p, ")");
-	else {
-		p = isl_printer_print_str(p, ")/");
-		p = isl_printer_print_isl_int(p, aff->v->el[0]);
-	}
-
-	return p;
-}
-
-static __isl_give isl_printer *print_aff(__isl_take isl_printer *p,
-	__isl_keep isl_aff *aff)
-{
-	if (isl_space_is_params(aff->ls->dim))
-		;
-	else {
-		p = print_tuple(aff->ls->dim, p, isl_dim_set, 0, NULL, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	p = isl_printer_print_str(p, "[");
-	p = print_aff_body(p, aff);
-	p = isl_printer_print_str(p, "]");
-
-	return p;
-}
-
-static __isl_give isl_printer *print_aff_isl(__isl_take isl_printer *p,
-	__isl_keep isl_aff *aff)
-{
-	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, 0, NULL, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	p = isl_printer_print_str(p, "{ ");
-	p = print_aff(p, aff);
-	p = isl_printer_print_str(p, " }");
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_pw_aff_isl(__isl_take isl_printer *p,
-	__isl_keep isl_pw_aff *pwaff)
-{
-	int i;
-
-	if (!pwaff)
-		goto error;
-
-	if (isl_space_dim(pwaff->dim, isl_dim_param) > 0) {
-		p = print_tuple(pwaff->dim, p, isl_dim_param, 0, NULL, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	p = isl_printer_print_str(p, "{ ");
-	for (i = 0; i < pwaff->n; ++i) {
-		if (i)
-			p = isl_printer_print_str(p, "; ");
-		p = print_aff(p, pwaff->p[i].aff);
-		p = print_disjuncts((isl_map *)pwaff->p[i].set, p, 0);
-	}
-	p = isl_printer_print_str(p, " }");
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_ls_affine_c(__isl_take isl_printer *p,
-	__isl_keep isl_local_space *ls, isl_int *c);
-
-static __isl_give isl_printer *print_ls_name_c(__isl_take isl_printer *p,
-	__isl_keep isl_local_space *ls, enum isl_dim_type type, unsigned pos)
-{
-	if (type == isl_dim_div) {
-		p = isl_printer_print_str(p, "floord(");
-		p = print_ls_affine_c(p, ls, ls->div->row[pos] + 1);
-		p = isl_printer_print_str(p, ", ");
-		p = isl_printer_print_isl_int(p, ls->div->row[pos][0]);
-		p = isl_printer_print_str(p, ")");
-	} else {
-		const char *name;
-
-		name = isl_space_get_dim_name(ls->dim, type, pos);
-		if (!name)
-			name = "UNNAMED";
-		p = isl_printer_print_str(p, name);
-	}
-	return p;
-}
-
-static __isl_give isl_printer *print_ls_term_c(__isl_take isl_printer *p,
-	__isl_keep isl_local_space *ls, isl_int c, unsigned pos)
-{
-	enum isl_dim_type type;
-
-	if (pos == 0)
-		return isl_printer_print_isl_int(p, c);
-
-	if (isl_int_is_one(c))
-		;
-	else if (isl_int_is_negone(c))
-		p = isl_printer_print_str(p, "-");
-	else {
-		p = isl_printer_print_isl_int(p, c);
-		p = isl_printer_print_str(p, "*");
-	}
-	type = pos2type(ls->dim, &pos);
-	p = print_ls_name_c(p, ls, type, pos);
-	return p;
-}
-
-static __isl_give isl_printer *print_ls_partial_affine_c(
-	__isl_take isl_printer *p, __isl_keep isl_local_space *ls,
-	isl_int *c, unsigned len)
-{
-	int i;
-	int first;
-
-	for (i = 0, first = 1; i < len; ++i) {
-		int flip = 0;
-		if (isl_int_is_zero(c[i]))
-			continue;
-		if (!first) {
-			if (isl_int_is_neg(c[i])) {
-				flip = 1;
-				isl_int_neg(c[i], c[i]);
-				p = isl_printer_print_str(p, " - ");
-			} else 
-				p = isl_printer_print_str(p, " + ");
-		}
-		first = 0;
-		p = print_ls_term_c(p, ls, c[i], i);
-		if (flip)
-			isl_int_neg(c[i], c[i]);
-	}
-	if (first)
-		p = isl_printer_print_str(p, "0");
-	return p;
-}
-
-static __isl_give isl_printer *print_ls_affine_c(__isl_take isl_printer *p,
-	__isl_keep isl_local_space *ls, isl_int *c)
-{
-	unsigned len = 1 + isl_local_space_dim(ls, isl_dim_all);
-	return print_ls_partial_affine_c(p, ls, c, len);
-}
-
-static __isl_give isl_printer *print_aff_c(__isl_take isl_printer *p,
-	__isl_keep isl_aff *aff)
-{
-	unsigned total;
-
-	total = isl_local_space_dim(aff->ls, isl_dim_all);
-	p = isl_printer_print_str(p, "(");
-	p = print_ls_partial_affine_c(p, aff->ls, aff->v->el + 1, 1 + total);
-	if (isl_int_is_one(aff->v->el[0]))
-		p = isl_printer_print_str(p, ")");
-	else {
-		p = isl_printer_print_str(p, ")/");
-		p = isl_printer_print_isl_int(p, aff->v->el[0]);
-	}
-	return p;
-}
-
-static __isl_give isl_printer *print_pw_aff_c(__isl_take isl_printer *p,
-	__isl_keep isl_pw_aff *pwaff)
-{
-	int i;
-
-	if (pwaff->n < 1)
-		isl_die(p->ctx, isl_error_unsupported,
-			"cannot print empty isl_pw_aff in C format", goto error);
-
-	for (i = 0; i < pwaff->n - 1; ++i) {
-		p = isl_printer_print_str(p, "(");
-		p = print_set_c(p, pwaff->dim, pwaff->p[i].set);
-		p = isl_printer_print_str(p, ") ? (");
-		p = print_aff_c(p, pwaff->p[i].aff);
-		p = isl_printer_print_str(p, ") : ");
-	}
-
-	return print_aff_c(p, pwaff->p[pwaff->n - 1].aff);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-__isl_give isl_printer *isl_printer_print_aff(__isl_take isl_printer *p,
-	__isl_keep isl_aff *aff)
-{
-	if (!p || !aff)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return print_aff_isl(p, aff);
-	else if (p->output_format == ISL_FORMAT_C)
-		return print_aff_c(p, aff);
-	isl_die(p->ctx, isl_error_unsupported, "unsupported output format",
-		goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-__isl_give isl_printer *isl_printer_print_pw_aff(__isl_take isl_printer *p,
-	__isl_keep isl_pw_aff *pwaff)
-{
-	if (!p || !pwaff)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return print_pw_aff_isl(p, pwaff);
-	else if (p->output_format == ISL_FORMAT_C)
-		return print_pw_aff_c(p, pwaff);
-	isl_die(p->ctx, isl_error_unsupported, "unsupported output format",
-		goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_multi_aff(__isl_take isl_printer *p,
-	__isl_keep isl_multi_aff *maff)
-{
-	return print_space(maff->space, p, 0, 0, NULL, maff);
-}
-
-static __isl_give isl_printer *print_multi_aff_isl(__isl_take isl_printer *p,
-	__isl_keep isl_multi_aff *maff)
-{
-	if (!maff)
-		goto error;
-
-	if (isl_space_dim(maff->space, isl_dim_param) > 0) {
-		p = print_tuple(maff->space, p, isl_dim_param, 0, NULL, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	p = isl_printer_print_str(p, "{ ");
-	p = print_multi_aff(p, maff);
-	p = isl_printer_print_str(p, " }");
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-__isl_give isl_printer *isl_printer_print_multi_aff(__isl_take isl_printer *p,
-	__isl_keep isl_multi_aff *maff)
-{
-	if (!p || !maff)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return print_multi_aff_isl(p, maff);
-	isl_die(p->ctx, isl_error_unsupported, "unsupported output format",
-		goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_pw_multi_aff_isl(__isl_take isl_printer *p,
-	__isl_keep isl_pw_multi_aff *pma)
-{
-	int i;
-
-	if (!pma)
-		goto error;
-
-	if (isl_space_dim(pma->dim, isl_dim_param) > 0) {
-		p = print_tuple(pma->dim, p, isl_dim_param, 0, NULL, NULL);
-		p = isl_printer_print_str(p, " -> ");
-	}
-	p = isl_printer_print_str(p, "{ ");
-	for (i = 0; i < pma->n; ++i) {
-		if (i)
-			p = isl_printer_print_str(p, "; ");
-		p = print_multi_aff(p, pma->p[i].maff);
-		p = print_disjuncts((isl_map *)pma->p[i].set, p, 0);
-	}
-	p = isl_printer_print_str(p, " }");
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *print_unnamed_pw_multi_aff_c(
-	__isl_take isl_printer *p, __isl_keep isl_pw_multi_aff *pma)
-{
-	int i;
-
-	for (i = 0; i < pma->n - 1; ++i) {
-		p = isl_printer_print_str(p, "(");
-		p = print_set_c(p, pma->dim, pma->p[i].set);
-		p = isl_printer_print_str(p, ") ? (");
-		p = print_aff_c(p, pma->p[i].maff->p[0]);
-		p = isl_printer_print_str(p, ") : ");
-	}
-
-	return print_aff_c(p, pma->p[pma->n - 1].maff->p[0]);
-}
-
-static __isl_give isl_printer *print_pw_multi_aff_c(__isl_take isl_printer *p,
-	__isl_keep isl_pw_multi_aff *pma)
-{
-	int n;
-	const char *name;
-
-	if (!pma)
-		goto error;
-	if (pma->n < 1)
-		isl_die(p->ctx, isl_error_unsupported,
-			"cannot print empty isl_pw_multi_aff in C format",
-			goto error);
-	name = isl_pw_multi_aff_get_tuple_name(pma, isl_dim_out);
-	if (!name && isl_pw_multi_aff_dim(pma, isl_dim_out) == 1)
-		return print_unnamed_pw_multi_aff_c(p, pma);
-	if (!name)
-		isl_die(p->ctx, isl_error_unsupported,
-			"cannot print unnamed isl_pw_multi_aff in C format",
-			goto error);
-
-	p = isl_printer_print_str(p, name);
-	n = isl_pw_multi_aff_dim(pma, isl_dim_out);
-	if (n != 0)
-		isl_die(p->ctx, isl_error_unsupported,
-			"not supported yet", goto error);
-
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-__isl_give isl_printer *isl_printer_print_pw_multi_aff(
-	__isl_take isl_printer *p, __isl_keep isl_pw_multi_aff *pma)
-{
-	if (!p || !pma)
-		goto error;
-
-	if (p->output_format == ISL_FORMAT_ISL)
-		return print_pw_multi_aff_isl(p, pma);
-	if (p->output_format == ISL_FORMAT_C)
-		return print_pw_multi_aff_c(p, pma);
-	isl_die(p->ctx, isl_error_unsupported, "unsupported output format",
-		goto error);
-error:
-	isl_printer_free(p);
-	return NULL;
-}
diff --git a/cloog-0.17.0/isl/isl_piplib.c b/cloog-0.17.0/isl/isl_piplib.c
deleted file mode 100644
index e33b981..0000000
--- a/cloog-0.17.0/isl/isl_piplib.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include "isl_piplib.h"
-
-void isl_seq_cpy_to_pip(Entier *dst, isl_int *src, unsigned len)
-{
-	int i;
-
-	for (i = 0; i < len; ++i)
-		entier_assign(dst[i], src[i]);
-}
-
-void isl_seq_cpy_from_pip(isl_int *dst, Entier *src, unsigned len)
-{
-	int i;
-
-	for (i = 0; i < len; ++i)
-		entier_assign(dst[i], src[i]);
-}
diff --git a/cloog-0.17.0/isl/isl_piplib.h b/cloog-0.17.0/isl/isl_piplib.h
deleted file mode 100644
index 8408770..0000000
--- a/cloog-0.17.0/isl/isl_piplib.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_PIPLIB_H
-#define ISL_PIPLIB_H
-
-#include <isl/ctx.h>
-#include <isl/int.h>
-#include <isl/map.h>
-#ifndef ISL_PIPLIB
-#error "no piplib"
-#endif
-
-#include <piplib/piplibMP.h>
-
-void isl_seq_cpy_to_pip(Entier *dst, isl_int *src, unsigned len);
-void isl_seq_cpy_from_pip(isl_int *dst, Entier *src, unsigned len);
-
-PipMatrix *isl_basic_map_to_pip(struct isl_basic_map *bmap, unsigned pip_param,
-			 unsigned extra_front, unsigned extra_back);
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_point.c b/cloog-0.17.0/isl/isl_point.c
deleted file mode 100644
index 00514a9..0000000
--- a/cloog-0.17.0/isl/isl_point.c
+++ /dev/null
@@ -1,500 +0,0 @@
-#include <isl_map_private.h>
-#include <isl_point_private.h>
-#include <isl/set.h>
-#include <isl_sample.h>
-#include <isl_scan.h>
-#include <isl/seq.h>
-#include <isl_space_private.h>
-
-isl_ctx *isl_point_get_ctx(__isl_keep isl_point *pnt)
-{
-	return pnt ? isl_space_get_ctx(pnt->dim) : NULL;
-}
-
-__isl_give isl_space *isl_point_get_space(__isl_keep isl_point *pnt)
-{
-	return pnt ? isl_space_copy(pnt->dim) : NULL;
-}
-
-__isl_give isl_point *isl_point_alloc(__isl_take isl_space *dim,
-	__isl_take isl_vec *vec)
-{
-	struct isl_point *pnt;
-
-	if (!dim || !vec)
-		goto error;
-
-	if (vec->size > 1 + isl_space_dim(dim, isl_dim_all)) {
-		vec = isl_vec_cow(vec);
-		if (!vec)
-			goto error;
-		vec->size = 1 + isl_space_dim(dim, isl_dim_all);
-	}
-
-	pnt = isl_alloc_type(dim->ctx, struct isl_point);
-	if (!pnt)
-		goto error;
-
-	pnt->ref = 1;
-	pnt->dim = dim;
-	pnt->vec = vec;
-
-	return pnt;
-error:
-	isl_space_free(dim);
-	isl_vec_free(vec);
-	return NULL;
-}
-
-__isl_give isl_point *isl_point_zero(__isl_take isl_space *dim)
-{
-	isl_vec *vec;
-
-	if (!dim)
-		return NULL;
-	vec = isl_vec_alloc(dim->ctx, 1 + isl_space_dim(dim, isl_dim_all));
-	if (!vec)
-		goto error;
-	isl_int_set_si(vec->el[0], 1);
-	isl_seq_clr(vec->el + 1, vec->size - 1);
-	return isl_point_alloc(dim, vec);
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-__isl_give isl_point *isl_point_dup(__isl_keep isl_point *pnt)
-{
-	struct isl_point *pnt2;
-
-	if (!pnt)
-		return NULL;
-	pnt2 = isl_point_alloc(isl_space_copy(pnt->dim), isl_vec_copy(pnt->vec));
-	return pnt2;
-}
-
-__isl_give isl_point *isl_point_cow(__isl_take isl_point *pnt)
-{
-	struct isl_point *pnt2;
-	if (!pnt)
-		return NULL;
-
-	if (pnt->ref == 1)
-		return pnt;
-
-	pnt2 = isl_point_dup(pnt);
-	isl_point_free(pnt);
-	return pnt2;
-}
-
-__isl_give isl_point *isl_point_copy(__isl_keep isl_point *pnt)
-{
-	if (!pnt)
-		return NULL;
-
-	pnt->ref++;
-	return pnt;
-}
-
-void isl_point_free(__isl_take isl_point *pnt)
-{
-	if (!pnt)
-		return;
-
-	if (--pnt->ref > 0)
-		return;
-
-	isl_space_free(pnt->dim);
-	isl_vec_free(pnt->vec);
-	free(pnt);
-}
-
-__isl_give isl_point *isl_point_void(__isl_take isl_space *dim)
-{
-	if (!dim)
-		return NULL;
-
-	return isl_point_alloc(dim, isl_vec_alloc(dim->ctx, 0));
-}
-
-int isl_point_is_void(__isl_keep isl_point *pnt)
-{
-	if (!pnt)
-		return -1;
-
-	return pnt->vec->size == 0;
-}
-
-int isl_point_get_coordinate(__isl_keep isl_point *pnt,
-	enum isl_dim_type type, int pos, isl_int *v)
-{
-	if (!pnt || isl_point_is_void(pnt))
-		return -1;
-
-	if (pos < 0 || pos >= isl_space_dim(pnt->dim, type))
-		isl_die(isl_point_get_ctx(pnt), isl_error_invalid,
-			"position out of bounds", return -1);
-
-	if (type == isl_dim_set)
-		pos += isl_space_dim(pnt->dim, isl_dim_param);
-	isl_int_set(*v, pnt->vec->el[1 + pos]);
-
-	return 0;
-}
-
-__isl_give isl_point *isl_point_set_coordinate(__isl_take isl_point *pnt,
-	enum isl_dim_type type, int pos, isl_int v)
-{
-	if (!pnt || isl_point_is_void(pnt))
-		return pnt;
-
-	pnt = isl_point_cow(pnt);
-	if (!pnt)
-		return NULL;
-	pnt->vec = isl_vec_cow(pnt->vec);
-	if (!pnt->vec)
-		goto error;
-
-	if (type == isl_dim_set)
-		pos += isl_space_dim(pnt->dim, isl_dim_param);
-
-	isl_int_set(pnt->vec->el[1 + pos], v);
-
-	return pnt;
-error:
-	isl_point_free(pnt);
-	return NULL;
-}
-
-__isl_give isl_point *isl_point_add_ui(__isl_take isl_point *pnt,
-	enum isl_dim_type type, int pos, unsigned val)
-{
-	if (!pnt || isl_point_is_void(pnt))
-		return pnt;
-
-	pnt = isl_point_cow(pnt);
-	if (!pnt)
-		return NULL;
-	pnt->vec = isl_vec_cow(pnt->vec);
-	if (!pnt->vec)
-		goto error;
-
-	if (type == isl_dim_set)
-		pos += isl_space_dim(pnt->dim, isl_dim_param);
-
-	isl_int_add_ui(pnt->vec->el[1 + pos], pnt->vec->el[1 + pos], val);
-
-	return pnt;
-error:
-	isl_point_free(pnt);
-	return NULL;
-}
-
-__isl_give isl_point *isl_point_sub_ui(__isl_take isl_point *pnt,
-	enum isl_dim_type type, int pos, unsigned val)
-{
-	if (!pnt || isl_point_is_void(pnt))
-		return pnt;
-
-	pnt = isl_point_cow(pnt);
-	if (!pnt)
-		return NULL;
-	pnt->vec = isl_vec_cow(pnt->vec);
-	if (!pnt->vec)
-		goto error;
-
-	if (type == isl_dim_set)
-		pos += isl_space_dim(pnt->dim, isl_dim_param);
-
-	isl_int_sub_ui(pnt->vec->el[1 + pos], pnt->vec->el[1 + pos], val);
-
-	return pnt;
-error:
-	isl_point_free(pnt);
-	return NULL;
-}
-
-struct isl_foreach_point {
-	struct isl_scan_callback callback;
-	int (*fn)(__isl_take isl_point *pnt, void *user);
-	void *user;
-	isl_space *dim;
-};
-
-static int foreach_point(struct isl_scan_callback *cb, __isl_take isl_vec *sample)
-{
-	struct isl_foreach_point *fp = (struct isl_foreach_point *)cb;
-	isl_point *pnt;
-
-	pnt = isl_point_alloc(isl_space_copy(fp->dim), sample);
-
-	return fp->fn(pnt, fp->user);
-}
-
-int isl_set_foreach_point(__isl_keep isl_set *set,
-	int (*fn)(__isl_take isl_point *pnt, void *user), void *user)
-{
-	struct isl_foreach_point fp = { { &foreach_point }, fn, user };
-	int i;
-
-	if (!set)
-		return -1;
-
-	fp.dim = isl_set_get_space(set);
-	if (!fp.dim)
-		return -1;
-
-	set = isl_set_copy(set);
-	set = isl_set_cow(set);
-	set = isl_set_make_disjoint(set);
-	set = isl_set_compute_divs(set);
-	if (!set)
-		goto error;
-
-	for (i = 0; i < set->n; ++i)
-		if (isl_basic_set_scan(isl_basic_set_copy(set->p[i]),
-					&fp.callback) < 0)
-			goto error;
-
-	isl_set_free(set);
-	isl_space_free(fp.dim);
-
-	return 0;
-error:
-	isl_set_free(set);
-	isl_space_free(fp.dim);
-	return -1;
-}
-
-/* Return 1 if "bmap" contains the point "point".
- * "bmap" is assumed to have known divs.
- * The point is first extended with the divs and then passed
- * to basic_map_contains.
- */
-int isl_basic_map_contains_point(__isl_keep isl_basic_map *bmap,
-	__isl_keep isl_point *point)
-{
-	int i;
-	struct isl_vec *vec;
-	unsigned dim;
-	int contains;
-
-	if (!bmap || !point)
-		return -1;
-	isl_assert(bmap->ctx, isl_space_is_equal(bmap->dim, point->dim), return -1);
-	if (bmap->n_div == 0)
-		return isl_basic_map_contains(bmap, point->vec);
-
-	dim = isl_basic_map_total_dim(bmap) - bmap->n_div;
-	vec = isl_vec_alloc(bmap->ctx, 1 + dim + bmap->n_div);
-	if (!vec)
-		return -1;
-
-	isl_seq_cpy(vec->el, point->vec->el, point->vec->size);
-	for (i = 0; i < bmap->n_div; ++i) {
-		isl_seq_inner_product(bmap->div[i] + 1, vec->el,
-					1 + dim + i, &vec->el[1+dim+i]);
-		isl_int_fdiv_q(vec->el[1+dim+i], vec->el[1+dim+i],
-				bmap->div[i][0]);
-	}
-
-	contains = isl_basic_map_contains(bmap, vec);
-
-	isl_vec_free(vec);
-	return contains;
-}
-
-int isl_map_contains_point(__isl_keep isl_map *map, __isl_keep isl_point *point)
-{
-	int i;
-	int found = 0;
-
-	if (!map || !point)
-		return -1;
-
-	map = isl_map_copy(map);
-	map = isl_map_compute_divs(map);
-	if (!map)
-		return -1;
-
-	for (i = 0; i < map->n; ++i) {
-		found = isl_basic_map_contains_point(map->p[i], point);
-		if (found < 0)
-			goto error;
-		if (found)
-			break;
-	}
-	isl_map_free(map);
-
-	return found;
-error:
-	isl_map_free(map);
-	return -1;
-}
-
-int isl_set_contains_point(__isl_keep isl_set *set, __isl_keep isl_point *point)
-{
-	return isl_map_contains_point((isl_map *)set, point);
-}
-
-__isl_give isl_basic_set *isl_basic_set_from_point(__isl_take isl_point *pnt)
-{
-	isl_basic_set *bset;
-	isl_basic_set *model;
-
-	model = isl_basic_set_empty(isl_space_copy(pnt->dim));
-	bset = isl_basic_set_from_vec(isl_vec_copy(pnt->vec));
-	bset = isl_basic_set_from_underlying_set(bset, model);
-	isl_point_free(pnt);
-
-	return bset;
-}
-
-__isl_give isl_set *isl_set_from_point(__isl_take isl_point *pnt)
-{
-	isl_basic_set *bset;
-	bset = isl_basic_set_from_point(pnt);
-	return isl_set_from_basic_set(bset);
-}
-
-__isl_give isl_basic_set *isl_basic_set_box_from_points(
-	__isl_take isl_point *pnt1, __isl_take isl_point *pnt2)
-{
-	isl_basic_set *bset;
-	unsigned total;
-	int i;
-	int k;
-	isl_int t;
-
-	isl_int_init(t);
-
-	if (!pnt1 || !pnt2)
-		goto error;
-
-	isl_assert(pnt1->dim->ctx,
-			isl_space_is_equal(pnt1->dim, pnt2->dim), goto error);
-
-	if (isl_point_is_void(pnt1) && isl_point_is_void(pnt2)) {
-		isl_space *dim = isl_space_copy(pnt1->dim);
-		isl_point_free(pnt1);
-		isl_point_free(pnt2);
-		isl_int_clear(t);
-		return isl_basic_set_empty(dim);
-	}
-	if (isl_point_is_void(pnt1)) {
-		isl_point_free(pnt1);
-		isl_int_clear(t);
-		return isl_basic_set_from_point(pnt2);
-	}
-	if (isl_point_is_void(pnt2)) {
-		isl_point_free(pnt2);
-		isl_int_clear(t);
-		return isl_basic_set_from_point(pnt1);
-	}
-
-	total = isl_space_dim(pnt1->dim, isl_dim_all);
-	bset = isl_basic_set_alloc_space(isl_space_copy(pnt1->dim), 0, 0, 2 * total);
-
-	for (i = 0; i < total; ++i) {
-		isl_int_mul(t, pnt1->vec->el[1 + i], pnt2->vec->el[0]);
-		isl_int_submul(t, pnt2->vec->el[1 + i], pnt1->vec->el[0]);
-
-		k = isl_basic_set_alloc_inequality(bset);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(bset->ineq[k] + 1, total);
-		if (isl_int_is_pos(t)) {
-			isl_int_set_si(bset->ineq[k][1 + i], -1);
-			isl_int_set(bset->ineq[k][0], pnt1->vec->el[1 + i]);
-		} else {
-			isl_int_set_si(bset->ineq[k][1 + i], 1);
-			isl_int_neg(bset->ineq[k][0], pnt1->vec->el[1 + i]);
-		}
-		isl_int_fdiv_q(bset->ineq[k][0], bset->ineq[k][0], pnt1->vec->el[0]);
-
-		k = isl_basic_set_alloc_inequality(bset);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(bset->ineq[k] + 1, total);
-		if (isl_int_is_pos(t)) {
-			isl_int_set_si(bset->ineq[k][1 + i], 1);
-			isl_int_neg(bset->ineq[k][0], pnt2->vec->el[1 + i]);
-		} else {
-			isl_int_set_si(bset->ineq[k][1 + i], -1);
-			isl_int_set(bset->ineq[k][0], pnt2->vec->el[1 + i]);
-		}
-		isl_int_fdiv_q(bset->ineq[k][0], bset->ineq[k][0], pnt2->vec->el[0]);
-	}
-
-	bset = isl_basic_set_finalize(bset);
-
-	isl_point_free(pnt1);
-	isl_point_free(pnt2);
-
-	isl_int_clear(t);
-
-	return bset;
-error:
-	isl_point_free(pnt1);
-	isl_point_free(pnt2);
-	isl_int_clear(t);
-	return NULL;
-}
-
-__isl_give isl_set *isl_set_box_from_points(__isl_take isl_point *pnt1,
-	__isl_take isl_point *pnt2)
-{
-	isl_basic_set *bset;
-	bset = isl_basic_set_box_from_points(pnt1, pnt2);
-	return isl_set_from_basic_set(bset);
-}
-
-__isl_give isl_printer *isl_printer_print_point(
-	__isl_take isl_printer *p, __isl_keep isl_point *pnt)
-{
-	int i;
-	unsigned nparam;
-	unsigned dim;
-
-	if (!pnt)
-		return p;
-	if (isl_point_is_void(pnt)) {
-		p = isl_printer_print_str(p, "void");
-		return p;
-	}
-
-	nparam = isl_space_dim(pnt->dim, isl_dim_param);
-	dim = isl_space_dim(pnt->dim, isl_dim_set);
-	if (nparam > 0) {
-		p = isl_printer_print_str(p, "[");
-		for (i = 0; i < nparam; ++i) {
-			const char *name;
-			if (i)
-				p = isl_printer_print_str(p, ", ");
-			name = isl_space_get_dim_name(pnt->dim, isl_dim_param, i);
-			if (name) {
-				p = isl_printer_print_str(p, name);
-				p = isl_printer_print_str(p, " = ");
-			}
-			p = isl_printer_print_isl_int(p, pnt->vec->el[1 + i]);
-			if (!isl_int_is_one(pnt->vec->el[0])) {
-				p = isl_printer_print_str(p, "/");
-				p = isl_printer_print_isl_int(p, pnt->vec->el[0]);
-			}
-		}
-		p = isl_printer_print_str(p, "]");
-		p = isl_printer_print_str(p, " -> ");
-	}
-	p = isl_printer_print_str(p, "[");
-	for (i = 0; i < dim; ++i) {
-		if (i)
-			p = isl_printer_print_str(p, ", ");
-		p = isl_printer_print_isl_int(p, pnt->vec->el[1 + nparam + i]);
-		if (!isl_int_is_one(pnt->vec->el[0])) {
-			p = isl_printer_print_str(p, "/");
-			p = isl_printer_print_isl_int(p, pnt->vec->el[0]);
-		}
-	}
-	p = isl_printer_print_str(p, "]");
-	return p;
-}
diff --git a/cloog-0.17.0/isl/isl_point_private.h b/cloog-0.17.0/isl/isl_point_private.h
deleted file mode 100644
index 305b81e..0000000
--- a/cloog-0.17.0/isl/isl_point_private.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <isl/space.h>
-#include <isl/point.h>
-#include <isl/vec.h>
-
-struct isl_point {
-	int		ref;
-	isl_space	*dim;
-	struct isl_vec	*vec;
-};
-
-__isl_give isl_point *isl_point_alloc(__isl_take isl_space *dim,
-	__isl_take isl_vec *vec);
diff --git a/cloog-0.17.0/isl/isl_polynomial.c b/cloog-0.17.0/isl/isl_polynomial.c
deleted file mode 100644
index 132986e..0000000
--- a/cloog-0.17.0/isl/isl_polynomial.c
+++ /dev/null
@@ -1,4781 +0,0 @@
-/*
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France 
- */
-
-#include <stdlib.h>
-#define ISL_DIM_H
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl_factorization.h>
-#include <isl/lp.h>
-#include <isl/seq.h>
-#include <isl_union_map_private.h>
-#include <isl_constraint_private.h>
-#include <isl_polynomial_private.h>
-#include <isl_point_private.h>
-#include <isl_space_private.h>
-#include <isl_mat_private.h>
-#include <isl_range.h>
-#include <isl_local_space_private.h>
-#include <isl_aff_private.h>
-#include <isl_config.h>
-
-static unsigned pos(__isl_keep isl_space *dim, enum isl_dim_type type)
-{
-	switch (type) {
-	case isl_dim_param:	return 0;
-	case isl_dim_in:	return dim->nparam;
-	case isl_dim_out:	return dim->nparam + dim->n_in;
-	default:		return 0;
-	}
-}
-
-int isl_upoly_is_cst(__isl_keep struct isl_upoly *up)
-{
-	if (!up)
-		return -1;
-
-	return up->var < 0;
-}
-
-__isl_keep struct isl_upoly_cst *isl_upoly_as_cst(__isl_keep struct isl_upoly *up)
-{
-	if (!up)
-		return NULL;
-
-	isl_assert(up->ctx, up->var < 0, return NULL);
-
-	return (struct isl_upoly_cst *)up;
-}
-
-__isl_keep struct isl_upoly_rec *isl_upoly_as_rec(__isl_keep struct isl_upoly *up)
-{
-	if (!up)
-		return NULL;
-
-	isl_assert(up->ctx, up->var >= 0, return NULL);
-
-	return (struct isl_upoly_rec *)up;
-}
-
-int isl_upoly_is_equal(__isl_keep struct isl_upoly *up1,
-	__isl_keep struct isl_upoly *up2)
-{
-	int i;
-	struct isl_upoly_rec *rec1, *rec2;
-
-	if (!up1 || !up2)
-		return -1;
-	if (up1 == up2)
-		return 1;
-	if (up1->var != up2->var)
-		return 0;
-	if (isl_upoly_is_cst(up1)) {
-		struct isl_upoly_cst *cst1, *cst2;
-		cst1 = isl_upoly_as_cst(up1);
-		cst2 = isl_upoly_as_cst(up2);
-		if (!cst1 || !cst2)
-			return -1;
-		return isl_int_eq(cst1->n, cst2->n) &&
-		       isl_int_eq(cst1->d, cst2->d);
-	}
-
-	rec1 = isl_upoly_as_rec(up1);
-	rec2 = isl_upoly_as_rec(up2);
-	if (!rec1 || !rec2)
-		return -1;
-
-	if (rec1->n != rec2->n)
-		return 0;
-
-	for (i = 0; i < rec1->n; ++i) {
-		int eq = isl_upoly_is_equal(rec1->p[i], rec2->p[i]);
-		if (eq < 0 || !eq)
-			return eq;
-	}
-
-	return 1;
-}
-
-int isl_upoly_is_zero(__isl_keep struct isl_upoly *up)
-{
-	struct isl_upoly_cst *cst;
-
-	if (!up)
-		return -1;
-	if (!isl_upoly_is_cst(up))
-		return 0;
-
-	cst = isl_upoly_as_cst(up);
-	if (!cst)
-		return -1;
-
-	return isl_int_is_zero(cst->n) && isl_int_is_pos(cst->d);
-}
-
-int isl_upoly_sgn(__isl_keep struct isl_upoly *up)
-{
-	struct isl_upoly_cst *cst;
-
-	if (!up)
-		return 0;
-	if (!isl_upoly_is_cst(up))
-		return 0;
-
-	cst = isl_upoly_as_cst(up);
-	if (!cst)
-		return 0;
-
-	return isl_int_sgn(cst->n);
-}
-
-int isl_upoly_is_nan(__isl_keep struct isl_upoly *up)
-{
-	struct isl_upoly_cst *cst;
-
-	if (!up)
-		return -1;
-	if (!isl_upoly_is_cst(up))
-		return 0;
-
-	cst = isl_upoly_as_cst(up);
-	if (!cst)
-		return -1;
-
-	return isl_int_is_zero(cst->n) && isl_int_is_zero(cst->d);
-}
-
-int isl_upoly_is_infty(__isl_keep struct isl_upoly *up)
-{
-	struct isl_upoly_cst *cst;
-
-	if (!up)
-		return -1;
-	if (!isl_upoly_is_cst(up))
-		return 0;
-
-	cst = isl_upoly_as_cst(up);
-	if (!cst)
-		return -1;
-
-	return isl_int_is_pos(cst->n) && isl_int_is_zero(cst->d);
-}
-
-int isl_upoly_is_neginfty(__isl_keep struct isl_upoly *up)
-{
-	struct isl_upoly_cst *cst;
-
-	if (!up)
-		return -1;
-	if (!isl_upoly_is_cst(up))
-		return 0;
-
-	cst = isl_upoly_as_cst(up);
-	if (!cst)
-		return -1;
-
-	return isl_int_is_neg(cst->n) && isl_int_is_zero(cst->d);
-}
-
-int isl_upoly_is_one(__isl_keep struct isl_upoly *up)
-{
-	struct isl_upoly_cst *cst;
-
-	if (!up)
-		return -1;
-	if (!isl_upoly_is_cst(up))
-		return 0;
-
-	cst = isl_upoly_as_cst(up);
-	if (!cst)
-		return -1;
-
-	return isl_int_eq(cst->n, cst->d) && isl_int_is_pos(cst->d);
-}
-
-int isl_upoly_is_negone(__isl_keep struct isl_upoly *up)
-{
-	struct isl_upoly_cst *cst;
-
-	if (!up)
-		return -1;
-	if (!isl_upoly_is_cst(up))
-		return 0;
-
-	cst = isl_upoly_as_cst(up);
-	if (!cst)
-		return -1;
-
-	return isl_int_is_negone(cst->n) && isl_int_is_one(cst->d);
-}
-
-__isl_give struct isl_upoly_cst *isl_upoly_cst_alloc(struct isl_ctx *ctx)
-{
-	struct isl_upoly_cst *cst;
-
-	cst = isl_alloc_type(ctx, struct isl_upoly_cst);
-	if (!cst)
-		return NULL;
-
-	cst->up.ref = 1;
-	cst->up.ctx = ctx;
-	isl_ctx_ref(ctx);
-	cst->up.var = -1;
-
-	isl_int_init(cst->n);
-	isl_int_init(cst->d);
-
-	return cst;
-}
-
-__isl_give struct isl_upoly *isl_upoly_zero(struct isl_ctx *ctx)
-{
-	struct isl_upoly_cst *cst;
-
-	cst = isl_upoly_cst_alloc(ctx);
-	if (!cst)
-		return NULL;
-
-	isl_int_set_si(cst->n, 0);
-	isl_int_set_si(cst->d, 1);
-
-	return &cst->up;
-}
-
-__isl_give struct isl_upoly *isl_upoly_one(struct isl_ctx *ctx)
-{
-	struct isl_upoly_cst *cst;
-
-	cst = isl_upoly_cst_alloc(ctx);
-	if (!cst)
-		return NULL;
-
-	isl_int_set_si(cst->n, 1);
-	isl_int_set_si(cst->d, 1);
-
-	return &cst->up;
-}
-
-__isl_give struct isl_upoly *isl_upoly_infty(struct isl_ctx *ctx)
-{
-	struct isl_upoly_cst *cst;
-
-	cst = isl_upoly_cst_alloc(ctx);
-	if (!cst)
-		return NULL;
-
-	isl_int_set_si(cst->n, 1);
-	isl_int_set_si(cst->d, 0);
-
-	return &cst->up;
-}
-
-__isl_give struct isl_upoly *isl_upoly_neginfty(struct isl_ctx *ctx)
-{
-	struct isl_upoly_cst *cst;
-
-	cst = isl_upoly_cst_alloc(ctx);
-	if (!cst)
-		return NULL;
-
-	isl_int_set_si(cst->n, -1);
-	isl_int_set_si(cst->d, 0);
-
-	return &cst->up;
-}
-
-__isl_give struct isl_upoly *isl_upoly_nan(struct isl_ctx *ctx)
-{
-	struct isl_upoly_cst *cst;
-
-	cst = isl_upoly_cst_alloc(ctx);
-	if (!cst)
-		return NULL;
-
-	isl_int_set_si(cst->n, 0);
-	isl_int_set_si(cst->d, 0);
-
-	return &cst->up;
-}
-
-__isl_give struct isl_upoly *isl_upoly_rat_cst(struct isl_ctx *ctx,
-	isl_int n, isl_int d)
-{
-	struct isl_upoly_cst *cst;
-
-	cst = isl_upoly_cst_alloc(ctx);
-	if (!cst)
-		return NULL;
-
-	isl_int_set(cst->n, n);
-	isl_int_set(cst->d, d);
-
-	return &cst->up;
-}
-
-__isl_give struct isl_upoly_rec *isl_upoly_alloc_rec(struct isl_ctx *ctx,
-	int var, int size)
-{
-	struct isl_upoly_rec *rec;
-
-	isl_assert(ctx, var >= 0, return NULL);
-	isl_assert(ctx, size >= 0, return NULL);
-	rec = isl_calloc(ctx, struct isl_upoly_rec,
-			sizeof(struct isl_upoly_rec) +
-			size * sizeof(struct isl_upoly *));
-	if (!rec)
-		return NULL;
-
-	rec->up.ref = 1;
-	rec->up.ctx = ctx;
-	isl_ctx_ref(ctx);
-	rec->up.var = var;
-
-	rec->n = 0;
-	rec->size = size;
-
-	return rec;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_reset_domain_space(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_space *dim)
-{
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp || !dim)
-		goto error;
-
-	isl_space_free(qp->dim);
-	qp->dim = dim;
-
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	isl_space_free(dim);
-	return NULL;
-}
-
-/* Reset the space of "qp".  This function is called from isl_pw_templ.c
- * and doesn't know if the space of an element object is represented
- * directly or through its domain.  It therefore passes along both.
- */
-__isl_give isl_qpolynomial *isl_qpolynomial_reset_space_and_domain(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_space *space,
-	__isl_take isl_space *domain)
-{
-	isl_space_free(space);
-	return isl_qpolynomial_reset_domain_space(qp, domain);
-}
-
-isl_ctx *isl_qpolynomial_get_ctx(__isl_keep isl_qpolynomial *qp)
-{
-	return qp ? qp->dim->ctx : NULL;
-}
-
-__isl_give isl_space *isl_qpolynomial_get_domain_space(
-	__isl_keep isl_qpolynomial *qp)
-{
-	return qp ? isl_space_copy(qp->dim) : NULL;
-}
-
-__isl_give isl_space *isl_qpolynomial_get_space(__isl_keep isl_qpolynomial *qp)
-{
-	isl_space *space;
-	if (!qp)
-		return NULL;
-	space = isl_space_copy(qp->dim);
-	space = isl_space_from_domain(space);
-	space = isl_space_add_dims(space, isl_dim_out, 1);
-	return space;
-}
-
-/* Externally, an isl_qpolynomial has a map space, but internally, the
- * ls field corresponds to the domain of that space.
- */
-unsigned isl_qpolynomial_dim(__isl_keep isl_qpolynomial *qp,
-	enum isl_dim_type type)
-{
-	if (!qp)
-		return 0;
-	if (type == isl_dim_out)
-		return 1;
-	if (type == isl_dim_in)
-		type = isl_dim_set;
-	return isl_space_dim(qp->dim, type);
-}
-
-int isl_qpolynomial_is_zero(__isl_keep isl_qpolynomial *qp)
-{
-	return qp ? isl_upoly_is_zero(qp->upoly) : -1;
-}
-
-int isl_qpolynomial_is_one(__isl_keep isl_qpolynomial *qp)
-{
-	return qp ? isl_upoly_is_one(qp->upoly) : -1;
-}
-
-int isl_qpolynomial_is_nan(__isl_keep isl_qpolynomial *qp)
-{
-	return qp ? isl_upoly_is_nan(qp->upoly) : -1;
-}
-
-int isl_qpolynomial_is_infty(__isl_keep isl_qpolynomial *qp)
-{
-	return qp ? isl_upoly_is_infty(qp->upoly) : -1;
-}
-
-int isl_qpolynomial_is_neginfty(__isl_keep isl_qpolynomial *qp)
-{
-	return qp ? isl_upoly_is_neginfty(qp->upoly) : -1;
-}
-
-int isl_qpolynomial_sgn(__isl_keep isl_qpolynomial *qp)
-{
-	return qp ? isl_upoly_sgn(qp->upoly) : 0;
-}
-
-static void upoly_free_cst(__isl_take struct isl_upoly_cst *cst)
-{
-	isl_int_clear(cst->n);
-	isl_int_clear(cst->d);
-}
-
-static void upoly_free_rec(__isl_take struct isl_upoly_rec *rec)
-{
-	int i;
-
-	for (i = 0; i < rec->n; ++i)
-		isl_upoly_free(rec->p[i]);
-}
-
-__isl_give struct isl_upoly *isl_upoly_copy(__isl_keep struct isl_upoly *up)
-{
-	if (!up)
-		return NULL;
-
-	up->ref++;
-	return up;
-}
-
-__isl_give struct isl_upoly *isl_upoly_dup_cst(__isl_keep struct isl_upoly *up)
-{
-	struct isl_upoly_cst *cst;
-	struct isl_upoly_cst *dup;
-
-	cst = isl_upoly_as_cst(up);
-	if (!cst)
-		return NULL;
-
-	dup = isl_upoly_as_cst(isl_upoly_zero(up->ctx));
-	if (!dup)
-		return NULL;
-	isl_int_set(dup->n, cst->n);
-	isl_int_set(dup->d, cst->d);
-
-	return &dup->up;
-}
-
-__isl_give struct isl_upoly *isl_upoly_dup_rec(__isl_keep struct isl_upoly *up)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-	struct isl_upoly_rec *dup;
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		return NULL;
-
-	dup = isl_upoly_alloc_rec(up->ctx, up->var, rec->n);
-	if (!dup)
-		return NULL;
-
-	for (i = 0; i < rec->n; ++i) {
-		dup->p[i] = isl_upoly_copy(rec->p[i]);
-		if (!dup->p[i])
-			goto error;
-		dup->n++;
-	}
-
-	return &dup->up;
-error:
-	isl_upoly_free(&dup->up);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_dup(__isl_keep struct isl_upoly *up)
-{
-	if (!up)
-		return NULL;
-
-	if (isl_upoly_is_cst(up))
-		return isl_upoly_dup_cst(up);
-	else
-		return isl_upoly_dup_rec(up);
-}
-
-__isl_give struct isl_upoly *isl_upoly_cow(__isl_take struct isl_upoly *up)
-{
-	if (!up)
-		return NULL;
-
-	if (up->ref == 1)
-		return up;
-	up->ref--;
-	return isl_upoly_dup(up);
-}
-
-void isl_upoly_free(__isl_take struct isl_upoly *up)
-{
-	if (!up)
-		return;
-
-	if (--up->ref > 0)
-		return;
-
-	if (up->var < 0)
-		upoly_free_cst((struct isl_upoly_cst *)up);
-	else
-		upoly_free_rec((struct isl_upoly_rec *)up);
-
-	isl_ctx_deref(up->ctx);
-	free(up);
-}
-
-static void isl_upoly_cst_reduce(__isl_keep struct isl_upoly_cst *cst)
-{
-	isl_int gcd;
-
-	isl_int_init(gcd);
-	isl_int_gcd(gcd, cst->n, cst->d);
-	if (!isl_int_is_zero(gcd) && !isl_int_is_one(gcd)) {
-		isl_int_divexact(cst->n, cst->n, gcd);
-		isl_int_divexact(cst->d, cst->d, gcd);
-	}
-	isl_int_clear(gcd);
-}
-
-__isl_give struct isl_upoly *isl_upoly_sum_cst(__isl_take struct isl_upoly *up1,
-	__isl_take struct isl_upoly *up2)
-{
-	struct isl_upoly_cst *cst1;
-	struct isl_upoly_cst *cst2;
-
-	up1 = isl_upoly_cow(up1);
-	if (!up1 || !up2)
-		goto error;
-
-	cst1 = isl_upoly_as_cst(up1);
-	cst2 = isl_upoly_as_cst(up2);
-
-	if (isl_int_eq(cst1->d, cst2->d))
-		isl_int_add(cst1->n, cst1->n, cst2->n);
-	else {
-		isl_int_mul(cst1->n, cst1->n, cst2->d);
-		isl_int_addmul(cst1->n, cst2->n, cst1->d);
-		isl_int_mul(cst1->d, cst1->d, cst2->d);
-	}
-
-	isl_upoly_cst_reduce(cst1);
-
-	isl_upoly_free(up2);
-	return up1;
-error:
-	isl_upoly_free(up1);
-	isl_upoly_free(up2);
-	return NULL;
-}
-
-static __isl_give struct isl_upoly *replace_by_zero(
-	__isl_take struct isl_upoly *up)
-{
-	struct isl_ctx *ctx;
-
-	if (!up)
-		return NULL;
-	ctx = up->ctx;
-	isl_upoly_free(up);
-	return isl_upoly_zero(ctx);
-}
-
-static __isl_give struct isl_upoly *replace_by_constant_term(
-	__isl_take struct isl_upoly *up)
-{
-	struct isl_upoly_rec *rec;
-	struct isl_upoly *cst;
-
-	if (!up)
-		return NULL;
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-	cst = isl_upoly_copy(rec->p[0]);
-	isl_upoly_free(up);
-	return cst;
-error:
-	isl_upoly_free(up);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_sum(__isl_take struct isl_upoly *up1,
-	__isl_take struct isl_upoly *up2)
-{
-	int i;
-	struct isl_upoly_rec *rec1, *rec2;
-
-	if (!up1 || !up2)
-		goto error;
-
-	if (isl_upoly_is_nan(up1)) {
-		isl_upoly_free(up2);
-		return up1;
-	}
-
-	if (isl_upoly_is_nan(up2)) {
-		isl_upoly_free(up1);
-		return up2;
-	}
-
-	if (isl_upoly_is_zero(up1)) {
-		isl_upoly_free(up1);
-		return up2;
-	}
-
-	if (isl_upoly_is_zero(up2)) {
-		isl_upoly_free(up2);
-		return up1;
-	}
-
-	if (up1->var < up2->var)
-		return isl_upoly_sum(up2, up1);
-
-	if (up2->var < up1->var) {
-		struct isl_upoly_rec *rec;
-		if (isl_upoly_is_infty(up2) || isl_upoly_is_neginfty(up2)) {
-			isl_upoly_free(up1);
-			return up2;
-		}
-		up1 = isl_upoly_cow(up1);
-		rec = isl_upoly_as_rec(up1);
-		if (!rec)
-			goto error;
-		rec->p[0] = isl_upoly_sum(rec->p[0], up2);
-		if (rec->n == 1)
-			up1 = replace_by_constant_term(up1);
-		return up1;
-	}
-
-	if (isl_upoly_is_cst(up1))
-		return isl_upoly_sum_cst(up1, up2);
-
-	rec1 = isl_upoly_as_rec(up1);
-	rec2 = isl_upoly_as_rec(up2);
-	if (!rec1 || !rec2)
-		goto error;
-
-	if (rec1->n < rec2->n)
-		return isl_upoly_sum(up2, up1);
-
-	up1 = isl_upoly_cow(up1);
-	rec1 = isl_upoly_as_rec(up1);
-	if (!rec1)
-		goto error;
-
-	for (i = rec2->n - 1; i >= 0; --i) {
-		rec1->p[i] = isl_upoly_sum(rec1->p[i],
-					    isl_upoly_copy(rec2->p[i]));
-		if (!rec1->p[i])
-			goto error;
-		if (i == rec1->n - 1 && isl_upoly_is_zero(rec1->p[i])) {
-			isl_upoly_free(rec1->p[i]);
-			rec1->n--;
-		}
-	}
-
-	if (rec1->n == 0)
-		up1 = replace_by_zero(up1);
-	else if (rec1->n == 1)
-		up1 = replace_by_constant_term(up1);
-
-	isl_upoly_free(up2);
-
-	return up1;
-error:
-	isl_upoly_free(up1);
-	isl_upoly_free(up2);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_cst_add_isl_int(
-	__isl_take struct isl_upoly *up, isl_int v)
-{
-	struct isl_upoly_cst *cst;
-
-	up = isl_upoly_cow(up);
-	if (!up)
-		return NULL;
-
-	cst = isl_upoly_as_cst(up);
-
-	isl_int_addmul(cst->n, cst->d, v);
-
-	return up;
-}
-
-__isl_give struct isl_upoly *isl_upoly_add_isl_int(
-	__isl_take struct isl_upoly *up, isl_int v)
-{
-	struct isl_upoly_rec *rec;
-
-	if (!up)
-		return NULL;
-
-	if (isl_upoly_is_cst(up))
-		return isl_upoly_cst_add_isl_int(up, v);
-
-	up = isl_upoly_cow(up);
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-
-	rec->p[0] = isl_upoly_add_isl_int(rec->p[0], v);
-	if (!rec->p[0])
-		goto error;
-
-	return up;
-error:
-	isl_upoly_free(up);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_cst_mul_isl_int(
-	__isl_take struct isl_upoly *up, isl_int v)
-{
-	struct isl_upoly_cst *cst;
-
-	if (isl_upoly_is_zero(up))
-		return up;
-
-	up = isl_upoly_cow(up);
-	if (!up)
-		return NULL;
-
-	cst = isl_upoly_as_cst(up);
-
-	isl_int_mul(cst->n, cst->n, v);
-
-	return up;
-}
-
-__isl_give struct isl_upoly *isl_upoly_mul_isl_int(
-	__isl_take struct isl_upoly *up, isl_int v)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-
-	if (!up)
-		return NULL;
-
-	if (isl_upoly_is_cst(up))
-		return isl_upoly_cst_mul_isl_int(up, v);
-
-	up = isl_upoly_cow(up);
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-
-	for (i = 0; i < rec->n; ++i) {
-		rec->p[i] = isl_upoly_mul_isl_int(rec->p[i], v);
-		if (!rec->p[i])
-			goto error;
-	}
-
-	return up;
-error:
-	isl_upoly_free(up);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_mul_cst(__isl_take struct isl_upoly *up1,
-	__isl_take struct isl_upoly *up2)
-{
-	struct isl_upoly_cst *cst1;
-	struct isl_upoly_cst *cst2;
-
-	up1 = isl_upoly_cow(up1);
-	if (!up1 || !up2)
-		goto error;
-
-	cst1 = isl_upoly_as_cst(up1);
-	cst2 = isl_upoly_as_cst(up2);
-
-	isl_int_mul(cst1->n, cst1->n, cst2->n);
-	isl_int_mul(cst1->d, cst1->d, cst2->d);
-
-	isl_upoly_cst_reduce(cst1);
-
-	isl_upoly_free(up2);
-	return up1;
-error:
-	isl_upoly_free(up1);
-	isl_upoly_free(up2);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_mul_rec(__isl_take struct isl_upoly *up1,
-	__isl_take struct isl_upoly *up2)
-{
-	struct isl_upoly_rec *rec1;
-	struct isl_upoly_rec *rec2;
-	struct isl_upoly_rec *res = NULL;
-	int i, j;
-	int size;
-
-	rec1 = isl_upoly_as_rec(up1);
-	rec2 = isl_upoly_as_rec(up2);
-	if (!rec1 || !rec2)
-		goto error;
-	size = rec1->n + rec2->n - 1;
-	res = isl_upoly_alloc_rec(up1->ctx, up1->var, size);
-	if (!res)
-		goto error;
-
-	for (i = 0; i < rec1->n; ++i) {
-		res->p[i] = isl_upoly_mul(isl_upoly_copy(rec2->p[0]),
-					    isl_upoly_copy(rec1->p[i]));
-		if (!res->p[i])
-			goto error;
-		res->n++;
-	}
-	for (; i < size; ++i) {
-		res->p[i] = isl_upoly_zero(up1->ctx);
-		if (!res->p[i])
-			goto error;
-		res->n++;
-	}
-	for (i = 0; i < rec1->n; ++i) {
-		for (j = 1; j < rec2->n; ++j) {
-			struct isl_upoly *up;
-			up = isl_upoly_mul(isl_upoly_copy(rec2->p[j]),
-					    isl_upoly_copy(rec1->p[i]));
-			res->p[i + j] = isl_upoly_sum(res->p[i + j], up);
-			if (!res->p[i + j])
-				goto error;
-		}
-	}
-
-	isl_upoly_free(up1);
-	isl_upoly_free(up2);
-
-	return &res->up;
-error:
-	isl_upoly_free(up1);
-	isl_upoly_free(up2);
-	isl_upoly_free(&res->up);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_mul(__isl_take struct isl_upoly *up1,
-	__isl_take struct isl_upoly *up2)
-{
-	if (!up1 || !up2)
-		goto error;
-
-	if (isl_upoly_is_nan(up1)) {
-		isl_upoly_free(up2);
-		return up1;
-	}
-
-	if (isl_upoly_is_nan(up2)) {
-		isl_upoly_free(up1);
-		return up2;
-	}
-
-	if (isl_upoly_is_zero(up1)) {
-		isl_upoly_free(up2);
-		return up1;
-	}
-
-	if (isl_upoly_is_zero(up2)) {
-		isl_upoly_free(up1);
-		return up2;
-	}
-
-	if (isl_upoly_is_one(up1)) {
-		isl_upoly_free(up1);
-		return up2;
-	}
-
-	if (isl_upoly_is_one(up2)) {
-		isl_upoly_free(up2);
-		return up1;
-	}
-
-	if (up1->var < up2->var)
-		return isl_upoly_mul(up2, up1);
-
-	if (up2->var < up1->var) {
-		int i;
-		struct isl_upoly_rec *rec;
-		if (isl_upoly_is_infty(up2) || isl_upoly_is_neginfty(up2)) {
-			isl_ctx *ctx = up1->ctx;
-			isl_upoly_free(up1);
-			isl_upoly_free(up2);
-			return isl_upoly_nan(ctx);
-		}
-		up1 = isl_upoly_cow(up1);
-		rec = isl_upoly_as_rec(up1);
-		if (!rec)
-			goto error;
-
-		for (i = 0; i < rec->n; ++i) {
-			rec->p[i] = isl_upoly_mul(rec->p[i],
-						    isl_upoly_copy(up2));
-			if (!rec->p[i])
-				goto error;
-		}
-		isl_upoly_free(up2);
-		return up1;
-	}
-
-	if (isl_upoly_is_cst(up1))
-		return isl_upoly_mul_cst(up1, up2);
-
-	return isl_upoly_mul_rec(up1, up2);
-error:
-	isl_upoly_free(up1);
-	isl_upoly_free(up2);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_pow(__isl_take struct isl_upoly *up,
-	unsigned power)
-{
-	struct isl_upoly *res;
-
-	if (!up)
-		return NULL;
-	if (power == 1)
-		return up;
-
-	if (power % 2)
-		res = isl_upoly_copy(up);
-	else
-		res = isl_upoly_one(up->ctx);
-
-	while (power >>= 1) {
-		up = isl_upoly_mul(up, isl_upoly_copy(up));
-		if (power % 2)
-			res = isl_upoly_mul(res, isl_upoly_copy(up));
-	}
-
-	isl_upoly_free(up);
-	return res;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_alloc(__isl_take isl_space *dim,
-	unsigned n_div, __isl_take struct isl_upoly *up)
-{
-	struct isl_qpolynomial *qp = NULL;
-	unsigned total;
-
-	if (!dim || !up)
-		goto error;
-
-	if (!isl_space_is_set(dim))
-		isl_die(isl_space_get_ctx(dim), isl_error_invalid,
-			"domain of polynomial should be a set", goto error);
-
-	total = isl_space_dim(dim, isl_dim_all);
-
-	qp = isl_calloc_type(dim->ctx, struct isl_qpolynomial);
-	if (!qp)
-		goto error;
-
-	qp->ref = 1;
-	qp->div = isl_mat_alloc(dim->ctx, n_div, 1 + 1 + total + n_div);
-	if (!qp->div)
-		goto error;
-
-	qp->dim = dim;
-	qp->upoly = up;
-
-	return qp;
-error:
-	isl_space_free(dim);
-	isl_upoly_free(up);
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_copy(__isl_keep isl_qpolynomial *qp)
-{
-	if (!qp)
-		return NULL;
-
-	qp->ref++;
-	return qp;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_dup(__isl_keep isl_qpolynomial *qp)
-{
-	struct isl_qpolynomial *dup;
-
-	if (!qp)
-		return NULL;
-
-	dup = isl_qpolynomial_alloc(isl_space_copy(qp->dim), qp->div->n_row,
-				    isl_upoly_copy(qp->upoly));
-	if (!dup)
-		return NULL;
-	isl_mat_free(dup->div);
-	dup->div = isl_mat_copy(qp->div);
-	if (!dup->div)
-		goto error;
-
-	return dup;
-error:
-	isl_qpolynomial_free(dup);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_cow(__isl_take isl_qpolynomial *qp)
-{
-	if (!qp)
-		return NULL;
-
-	if (qp->ref == 1)
-		return qp;
-	qp->ref--;
-	return isl_qpolynomial_dup(qp);
-}
-
-void *isl_qpolynomial_free(__isl_take isl_qpolynomial *qp)
-{
-	if (!qp)
-		return NULL;
-
-	if (--qp->ref > 0)
-		return NULL;
-
-	isl_space_free(qp->dim);
-	isl_mat_free(qp->div);
-	isl_upoly_free(qp->upoly);
-
-	free(qp);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_var_pow(isl_ctx *ctx, int pos, int power)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-	struct isl_upoly_cst *cst;
-
-	rec = isl_upoly_alloc_rec(ctx, pos, 1 + power);
-	if (!rec)
-		return NULL;
-	for (i = 0; i < 1 + power; ++i) {
-		rec->p[i] = isl_upoly_zero(ctx);
-		if (!rec->p[i])
-			goto error;
-		rec->n++;
-	}
-	cst = isl_upoly_as_cst(rec->p[power]);
-	isl_int_set_si(cst->n, 1);
-
-	return &rec->up;
-error:
-	isl_upoly_free(&rec->up);
-	return NULL;
-}
-
-/* r array maps original positions to new positions.
- */
-static __isl_give struct isl_upoly *reorder(__isl_take struct isl_upoly *up,
-	int *r)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-	struct isl_upoly *base;
-	struct isl_upoly *res;
-
-	if (isl_upoly_is_cst(up))
-		return up;
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-
-	isl_assert(up->ctx, rec->n >= 1, goto error);
-
-	base = isl_upoly_var_pow(up->ctx, r[up->var], 1);
-	res = reorder(isl_upoly_copy(rec->p[rec->n - 1]), r);
-
-	for (i = rec->n - 2; i >= 0; --i) {
-		res = isl_upoly_mul(res, isl_upoly_copy(base));
-		res = isl_upoly_sum(res, reorder(isl_upoly_copy(rec->p[i]), r));
-	}
-
-	isl_upoly_free(base);
-	isl_upoly_free(up);
-
-	return res;
-error:
-	isl_upoly_free(up);
-	return NULL;
-}
-
-static int compatible_divs(__isl_keep isl_mat *div1, __isl_keep isl_mat *div2)
-{
-	int n_row, n_col;
-	int equal;
-
-	isl_assert(div1->ctx, div1->n_row >= div2->n_row &&
-				div1->n_col >= div2->n_col, return -1);
-
-	if (div1->n_row == div2->n_row)
-		return isl_mat_is_equal(div1, div2);
-
-	n_row = div1->n_row;
-	n_col = div1->n_col;
-	div1->n_row = div2->n_row;
-	div1->n_col = div2->n_col;
-
-	equal = isl_mat_is_equal(div1, div2);
-
-	div1->n_row = n_row;
-	div1->n_col = n_col;
-
-	return equal;
-}
-
-static int cmp_row(__isl_keep isl_mat *div, int i, int j)
-{
-	int li, lj;
-
-	li = isl_seq_last_non_zero(div->row[i], div->n_col);
-	lj = isl_seq_last_non_zero(div->row[j], div->n_col);
-
-	if (li != lj)
-		return li - lj;
-
-	return isl_seq_cmp(div->row[i], div->row[j], div->n_col);
-}
-
-struct isl_div_sort_info {
-	isl_mat	*div;
-	int	 row;
-};
-
-static int div_sort_cmp(const void *p1, const void *p2)
-{
-	const struct isl_div_sort_info *i1, *i2;
-	i1 = (const struct isl_div_sort_info *) p1;
-	i2 = (const struct isl_div_sort_info *) p2;
-
-	return cmp_row(i1->div, i1->row, i2->row);
-}
-
-/* Sort divs and remove duplicates.
- */
-static __isl_give isl_qpolynomial *sort_divs(__isl_take isl_qpolynomial *qp)
-{
-	int i;
-	int skip;
-	int len;
-	struct isl_div_sort_info *array = NULL;
-	int *pos = NULL, *at = NULL;
-	int *reordering = NULL;
-	unsigned div_pos;
-
-	if (!qp)
-		return NULL;
-	if (qp->div->n_row <= 1)
-		return qp;
-
-	div_pos = isl_space_dim(qp->dim, isl_dim_all);
-
-	array = isl_alloc_array(qp->div->ctx, struct isl_div_sort_info,
-				qp->div->n_row);
-	pos = isl_alloc_array(qp->div->ctx, int, qp->div->n_row);
-	at = isl_alloc_array(qp->div->ctx, int, qp->div->n_row);
-	len = qp->div->n_col - 2;
-	reordering = isl_alloc_array(qp->div->ctx, int, len);
-	if (!array || !pos || !at || !reordering)
-		goto error;
-
-	for (i = 0; i < qp->div->n_row; ++i) {
-		array[i].div = qp->div;
-		array[i].row = i;
-		pos[i] = i;
-		at[i] = i;
-	}
-
-	qsort(array, qp->div->n_row, sizeof(struct isl_div_sort_info),
-		div_sort_cmp);
-
-	for (i = 0; i < div_pos; ++i)
-		reordering[i] = i;
-
-	for (i = 0; i < qp->div->n_row; ++i) {
-		if (pos[array[i].row] == i)
-			continue;
-		qp->div = isl_mat_swap_rows(qp->div, i, pos[array[i].row]);
-		pos[at[i]] = pos[array[i].row];
-		at[pos[array[i].row]] = at[i];
-		at[i] = array[i].row;
-		pos[array[i].row] = i;
-	}
-
-	skip = 0;
-	for (i = 0; i < len - div_pos; ++i) {
-		if (i > 0 &&
-		    isl_seq_eq(qp->div->row[i - skip - 1],
-			       qp->div->row[i - skip], qp->div->n_col)) {
-			qp->div = isl_mat_drop_rows(qp->div, i - skip, 1);
-			isl_mat_col_add(qp->div, 2 + div_pos + i - skip - 1,
-						 2 + div_pos + i - skip);
-			qp->div = isl_mat_drop_cols(qp->div,
-						    2 + div_pos + i - skip, 1);
-			skip++;
-		}
-		reordering[div_pos + array[i].row] = div_pos + i - skip;
-	}
-
-	qp->upoly = reorder(qp->upoly, reordering);
-
-	if (!qp->upoly || !qp->div)
-		goto error;
-
-	free(at);
-	free(pos);
-	free(array);
-	free(reordering);
-
-	return qp;
-error:
-	free(at);
-	free(pos);
-	free(array);
-	free(reordering);
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-static __isl_give struct isl_upoly *expand(__isl_take struct isl_upoly *up,
-	int *exp, int first)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-
-	if (isl_upoly_is_cst(up))
-		return up;
-
-	if (up->var < first)
-		return up;
-
-	if (exp[up->var - first] == up->var - first)
-		return up;
-
-	up = isl_upoly_cow(up);
-	if (!up)
-		goto error;
-
-	up->var = exp[up->var - first] + first;
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-
-	for (i = 0; i < rec->n; ++i) {
-		rec->p[i] = expand(rec->p[i], exp, first);
-		if (!rec->p[i])
-			goto error;
-	}
-
-	return up;
-error:
-	isl_upoly_free(up);
-	return NULL;
-}
-
-static __isl_give isl_qpolynomial *with_merged_divs(
-	__isl_give isl_qpolynomial *(*fn)(__isl_take isl_qpolynomial *qp1,
-					  __isl_take isl_qpolynomial *qp2),
-	__isl_take isl_qpolynomial *qp1, __isl_take isl_qpolynomial *qp2)
-{
-	int *exp1 = NULL;
-	int *exp2 = NULL;
-	isl_mat *div = NULL;
-
-	qp1 = isl_qpolynomial_cow(qp1);
-	qp2 = isl_qpolynomial_cow(qp2);
-
-	if (!qp1 || !qp2)
-		goto error;
-
-	isl_assert(qp1->div->ctx, qp1->div->n_row >= qp2->div->n_row &&
-				qp1->div->n_col >= qp2->div->n_col, goto error);
-
-	exp1 = isl_alloc_array(qp1->div->ctx, int, qp1->div->n_row);
-	exp2 = isl_alloc_array(qp2->div->ctx, int, qp2->div->n_row);
-	if (!exp1 || !exp2)
-		goto error;
-
-	div = isl_merge_divs(qp1->div, qp2->div, exp1, exp2);
-	if (!div)
-		goto error;
-
-	isl_mat_free(qp1->div);
-	qp1->div = isl_mat_copy(div);
-	isl_mat_free(qp2->div);
-	qp2->div = isl_mat_copy(div);
-
-	qp1->upoly = expand(qp1->upoly, exp1, div->n_col - div->n_row - 2);
-	qp2->upoly = expand(qp2->upoly, exp2, div->n_col - div->n_row - 2);
-
-	if (!qp1->upoly || !qp2->upoly)
-		goto error;
-
-	isl_mat_free(div);
-	free(exp1);
-	free(exp2);
-
-	return fn(qp1, qp2);
-error:
-	isl_mat_free(div);
-	free(exp1);
-	free(exp2);
-	isl_qpolynomial_free(qp1);
-	isl_qpolynomial_free(qp2);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_add(__isl_take isl_qpolynomial *qp1,
-	__isl_take isl_qpolynomial *qp2)
-{
-	qp1 = isl_qpolynomial_cow(qp1);
-
-	if (!qp1 || !qp2)
-		goto error;
-
-	if (qp1->div->n_row < qp2->div->n_row)
-		return isl_qpolynomial_add(qp2, qp1);
-
-	isl_assert(qp1->dim->ctx, isl_space_is_equal(qp1->dim, qp2->dim), goto error);
-	if (!compatible_divs(qp1->div, qp2->div))
-		return with_merged_divs(isl_qpolynomial_add, qp1, qp2);
-
-	qp1->upoly = isl_upoly_sum(qp1->upoly, isl_upoly_copy(qp2->upoly));
-	if (!qp1->upoly)
-		goto error;
-
-	isl_qpolynomial_free(qp2);
-
-	return qp1;
-error:
-	isl_qpolynomial_free(qp1);
-	isl_qpolynomial_free(qp2);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_add_on_domain(
-	__isl_keep isl_set *dom,
-	__isl_take isl_qpolynomial *qp1,
-	__isl_take isl_qpolynomial *qp2)
-{
-	qp1 = isl_qpolynomial_add(qp1, qp2);
-	qp1 = isl_qpolynomial_gist(qp1, isl_set_copy(dom));
-	return qp1;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_sub(__isl_take isl_qpolynomial *qp1,
-	__isl_take isl_qpolynomial *qp2)
-{
-	return isl_qpolynomial_add(qp1, isl_qpolynomial_neg(qp2));
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_add_isl_int(
-	__isl_take isl_qpolynomial *qp, isl_int v)
-{
-	if (isl_int_is_zero(v))
-		return qp;
-
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		return NULL;
-
-	qp->upoly = isl_upoly_add_isl_int(qp->upoly, v);
-	if (!qp->upoly)
-		goto error;
-
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	return NULL;
-
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_neg(__isl_take isl_qpolynomial *qp)
-{
-	if (!qp)
-		return NULL;
-
-	return isl_qpolynomial_mul_isl_int(qp, qp->dim->ctx->negone);
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_mul_isl_int(
-	__isl_take isl_qpolynomial *qp, isl_int v)
-{
-	if (isl_int_is_one(v))
-		return qp;
-
-	if (qp && isl_int_is_zero(v)) {
-		isl_qpolynomial *zero;
-		zero = isl_qpolynomial_zero_on_domain(isl_space_copy(qp->dim));
-		isl_qpolynomial_free(qp);
-		return zero;
-	}
-	
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		return NULL;
-
-	qp->upoly = isl_upoly_mul_isl_int(qp->upoly, v);
-	if (!qp->upoly)
-		goto error;
-
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_scale(
-	__isl_take isl_qpolynomial *qp, isl_int v)
-{
-	return isl_qpolynomial_mul_isl_int(qp, v);
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_mul(__isl_take isl_qpolynomial *qp1,
-	__isl_take isl_qpolynomial *qp2)
-{
-	qp1 = isl_qpolynomial_cow(qp1);
-
-	if (!qp1 || !qp2)
-		goto error;
-
-	if (qp1->div->n_row < qp2->div->n_row)
-		return isl_qpolynomial_mul(qp2, qp1);
-
-	isl_assert(qp1->dim->ctx, isl_space_is_equal(qp1->dim, qp2->dim), goto error);
-	if (!compatible_divs(qp1->div, qp2->div))
-		return with_merged_divs(isl_qpolynomial_mul, qp1, qp2);
-
-	qp1->upoly = isl_upoly_mul(qp1->upoly, isl_upoly_copy(qp2->upoly));
-	if (!qp1->upoly)
-		goto error;
-
-	isl_qpolynomial_free(qp2);
-
-	return qp1;
-error:
-	isl_qpolynomial_free(qp1);
-	isl_qpolynomial_free(qp2);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_pow(__isl_take isl_qpolynomial *qp,
-	unsigned power)
-{
-	qp = isl_qpolynomial_cow(qp);
-
-	if (!qp)
-		return NULL;
-
-	qp->upoly = isl_upoly_pow(qp->upoly, power);
-	if (!qp->upoly)
-		goto error;
-
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_pow(
-	__isl_take isl_pw_qpolynomial *pwqp, unsigned power)
-{
-	int i;
-
-	if (power == 1)
-		return pwqp;
-
-	pwqp = isl_pw_qpolynomial_cow(pwqp);
-	if (!pwqp)
-		return NULL;
-
-	for (i = 0; i < pwqp->n; ++i) {
-		pwqp->p[i].qp = isl_qpolynomial_pow(pwqp->p[i].qp, power);
-		if (!pwqp->p[i].qp)
-			return isl_pw_qpolynomial_free(pwqp);
-	}
-
-	return pwqp;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_zero_on_domain(
-	__isl_take isl_space *dim)
-{
-	if (!dim)
-		return NULL;
-	return isl_qpolynomial_alloc(dim, 0, isl_upoly_zero(dim->ctx));
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_one_on_domain(
-	__isl_take isl_space *dim)
-{
-	if (!dim)
-		return NULL;
-	return isl_qpolynomial_alloc(dim, 0, isl_upoly_one(dim->ctx));
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_infty_on_domain(
-	__isl_take isl_space *dim)
-{
-	if (!dim)
-		return NULL;
-	return isl_qpolynomial_alloc(dim, 0, isl_upoly_infty(dim->ctx));
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_neginfty_on_domain(
-	__isl_take isl_space *dim)
-{
-	if (!dim)
-		return NULL;
-	return isl_qpolynomial_alloc(dim, 0, isl_upoly_neginfty(dim->ctx));
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_nan_on_domain(
-	__isl_take isl_space *dim)
-{
-	if (!dim)
-		return NULL;
-	return isl_qpolynomial_alloc(dim, 0, isl_upoly_nan(dim->ctx));
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_cst_on_domain(
-	__isl_take isl_space *dim,
-	isl_int v)
-{
-	struct isl_qpolynomial *qp;
-	struct isl_upoly_cst *cst;
-
-	if (!dim)
-		return NULL;
-
-	qp = isl_qpolynomial_alloc(dim, 0, isl_upoly_zero(dim->ctx));
-	if (!qp)
-		return NULL;
-
-	cst = isl_upoly_as_cst(qp->upoly);
-	isl_int_set(cst->n, v);
-
-	return qp;
-}
-
-int isl_qpolynomial_is_cst(__isl_keep isl_qpolynomial *qp,
-	isl_int *n, isl_int *d)
-{
-	struct isl_upoly_cst *cst;
-
-	if (!qp)
-		return -1;
-
-	if (!isl_upoly_is_cst(qp->upoly))
-		return 0;
-
-	cst = isl_upoly_as_cst(qp->upoly);
-	if (!cst)
-		return -1;
-
-	if (n)
-		isl_int_set(*n, cst->n);
-	if (d)
-		isl_int_set(*d, cst->d);
-
-	return 1;
-}
-
-int isl_upoly_is_affine(__isl_keep struct isl_upoly *up)
-{
-	int is_cst;
-	struct isl_upoly_rec *rec;
-
-	if (!up)
-		return -1;
-
-	if (up->var < 0)
-		return 1;
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		return -1;
-
-	if (rec->n > 2)
-		return 0;
-
-	isl_assert(up->ctx, rec->n > 1, return -1);
-
-	is_cst = isl_upoly_is_cst(rec->p[1]);
-	if (is_cst < 0)
-		return -1;
-	if (!is_cst)
-		return 0;
-
-	return isl_upoly_is_affine(rec->p[0]);
-}
-
-int isl_qpolynomial_is_affine(__isl_keep isl_qpolynomial *qp)
-{
-	if (!qp)
-		return -1;
-
-	if (qp->div->n_row > 0)
-		return 0;
-
-	return isl_upoly_is_affine(qp->upoly);
-}
-
-static void update_coeff(__isl_keep isl_vec *aff,
-	__isl_keep struct isl_upoly_cst *cst, int pos)
-{
-	isl_int gcd;
-	isl_int f;
-
-	if (isl_int_is_zero(cst->n))
-		return;
-
-	isl_int_init(gcd);
-	isl_int_init(f);
-	isl_int_gcd(gcd, cst->d, aff->el[0]);
-	isl_int_divexact(f, cst->d, gcd);
-	isl_int_divexact(gcd, aff->el[0], gcd);
-	isl_seq_scale(aff->el, aff->el, f, aff->size);
-	isl_int_mul(aff->el[1 + pos], gcd, cst->n);
-	isl_int_clear(gcd);
-	isl_int_clear(f);
-}
-
-int isl_upoly_update_affine(__isl_keep struct isl_upoly *up,
-	__isl_keep isl_vec *aff)
-{
-	struct isl_upoly_cst *cst;
-	struct isl_upoly_rec *rec;
-
-	if (!up || !aff)
-		return -1;
-
-	if (up->var < 0) {
-		struct isl_upoly_cst *cst;
-
-		cst = isl_upoly_as_cst(up);
-		if (!cst)
-			return -1;
-		update_coeff(aff, cst, 0);
-		return 0;
-	}
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		return -1;
-	isl_assert(up->ctx, rec->n == 2, return -1);
-
-	cst = isl_upoly_as_cst(rec->p[1]);
-	if (!cst)
-		return -1;
-	update_coeff(aff, cst, 1 + up->var);
-
-	return isl_upoly_update_affine(rec->p[0], aff);
-}
-
-__isl_give isl_vec *isl_qpolynomial_extract_affine(
-	__isl_keep isl_qpolynomial *qp)
-{
-	isl_vec *aff;
-	unsigned d;
-
-	if (!qp)
-		return NULL;
-
-	d = isl_space_dim(qp->dim, isl_dim_all);
-	aff = isl_vec_alloc(qp->div->ctx, 2 + d + qp->div->n_row);
-	if (!aff)
-		return NULL;
-
-	isl_seq_clr(aff->el + 1, 1 + d + qp->div->n_row);
-	isl_int_set_si(aff->el[0], 1);
-
-	if (isl_upoly_update_affine(qp->upoly, aff) < 0)
-		goto error;
-
-	return aff;
-error:
-	isl_vec_free(aff);
-	return NULL;
-}
-
-int isl_qpolynomial_plain_is_equal(__isl_keep isl_qpolynomial *qp1,
-	__isl_keep isl_qpolynomial *qp2)
-{
-	int equal;
-
-	if (!qp1 || !qp2)
-		return -1;
-
-	equal = isl_space_is_equal(qp1->dim, qp2->dim);
-	if (equal < 0 || !equal)
-		return equal;
-
-	equal = isl_mat_is_equal(qp1->div, qp2->div);
-	if (equal < 0 || !equal)
-		return equal;
-
-	return isl_upoly_is_equal(qp1->upoly, qp2->upoly);
-}
-
-static void upoly_update_den(__isl_keep struct isl_upoly *up, isl_int *d)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-
-	if (isl_upoly_is_cst(up)) {
-		struct isl_upoly_cst *cst;
-		cst = isl_upoly_as_cst(up);
-		if (!cst)
-			return;
-		isl_int_lcm(*d, *d, cst->d);
-		return;
-	}
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		return;
-
-	for (i = 0; i < rec->n; ++i)
-		upoly_update_den(rec->p[i], d);
-}
-
-void isl_qpolynomial_get_den(__isl_keep isl_qpolynomial *qp, isl_int *d)
-{
-	isl_int_set_si(*d, 1);
-	if (!qp)
-		return;
-	upoly_update_den(qp->upoly, d);
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_var_pow_on_domain(
-	__isl_take isl_space *dim, int pos, int power)
-{
-	struct isl_ctx *ctx;
-
-	if (!dim)
-		return NULL;
-
-	ctx = dim->ctx;
-
-	return isl_qpolynomial_alloc(dim, 0, isl_upoly_var_pow(ctx, pos, power));
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_var_on_domain(__isl_take isl_space *dim,
-	enum isl_dim_type type, unsigned pos)
-{
-	if (!dim)
-		return NULL;
-
-	isl_assert(dim->ctx, isl_space_dim(dim, isl_dim_in) == 0, goto error);
-	isl_assert(dim->ctx, pos < isl_space_dim(dim, type), goto error);
-
-	if (type == isl_dim_set)
-		pos += isl_space_dim(dim, isl_dim_param);
-
-	return isl_qpolynomial_var_pow_on_domain(dim, pos, 1);
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_subs(__isl_take struct isl_upoly *up,
-	unsigned first, unsigned n, __isl_keep struct isl_upoly **subs)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-	struct isl_upoly *base, *res;
-
-	if (!up)
-		return NULL;
-
-	if (isl_upoly_is_cst(up))
-		return up;
-
-	if (up->var < first)
-		return up;
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-
-	isl_assert(up->ctx, rec->n >= 1, goto error);
-
-	if (up->var >= first + n)
-		base = isl_upoly_var_pow(up->ctx, up->var, 1);
-	else
-		base = isl_upoly_copy(subs[up->var - first]);
-
-	res = isl_upoly_subs(isl_upoly_copy(rec->p[rec->n - 1]), first, n, subs);
-	for (i = rec->n - 2; i >= 0; --i) {
-		struct isl_upoly *t;
-		t = isl_upoly_subs(isl_upoly_copy(rec->p[i]), first, n, subs);
-		res = isl_upoly_mul(res, isl_upoly_copy(base));
-		res = isl_upoly_sum(res, t);
-	}
-
-	isl_upoly_free(base);
-	isl_upoly_free(up);
-				
-	return res;
-error:
-	isl_upoly_free(up);
-	return NULL;
-}	
-
-__isl_give struct isl_upoly *isl_upoly_from_affine(isl_ctx *ctx, isl_int *f,
-	isl_int denom, unsigned len)
-{
-	int i;
-	struct isl_upoly *up;
-
-	isl_assert(ctx, len >= 1, return NULL);
-
-	up = isl_upoly_rat_cst(ctx, f[0], denom);
-	for (i = 0; i < len - 1; ++i) {
-		struct isl_upoly *t;
-		struct isl_upoly *c;
-
-		if (isl_int_is_zero(f[1 + i]))
-			continue;
-
-		c = isl_upoly_rat_cst(ctx, f[1 + i], denom);
-		t = isl_upoly_var_pow(ctx, i, 1);
-		t = isl_upoly_mul(c, t);
-		up = isl_upoly_sum(up, t);
-	}
-
-	return up;
-}
-
-/* Remove common factor of non-constant terms and denominator.
- */
-static void normalize_div(__isl_keep isl_qpolynomial *qp, int div)
-{
-	isl_ctx *ctx = qp->div->ctx;
-	unsigned total = qp->div->n_col - 2;
-
-	isl_seq_gcd(qp->div->row[div] + 2, total, &ctx->normalize_gcd);
-	isl_int_gcd(ctx->normalize_gcd,
-		    ctx->normalize_gcd, qp->div->row[div][0]);
-	if (isl_int_is_one(ctx->normalize_gcd))
-		return;
-
-	isl_seq_scale_down(qp->div->row[div] + 2, qp->div->row[div] + 2,
-			    ctx->normalize_gcd, total);
-	isl_int_divexact(qp->div->row[div][0], qp->div->row[div][0],
-			    ctx->normalize_gcd);
-	isl_int_fdiv_q(qp->div->row[div][1], qp->div->row[div][1],
-			    ctx->normalize_gcd);
-}
-
-/* Replace the integer division identified by "div" by the polynomial "s".
- * The integer division is assumed not to appear in the definition
- * of any other integer divisions.
- */
-static __isl_give isl_qpolynomial *substitute_div(
-	__isl_take isl_qpolynomial *qp,
-	int div, __isl_take struct isl_upoly *s)
-{
-	int i;
-	int total;
-	int *reordering;
-
-	if (!qp || !s)
-		goto error;
-
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		goto error;
-
-	total = isl_space_dim(qp->dim, isl_dim_all);
-	qp->upoly = isl_upoly_subs(qp->upoly, total + div, 1, &s);
-	if (!qp->upoly)
-		goto error;
-
-	reordering = isl_alloc_array(qp->dim->ctx, int, total + qp->div->n_row);
-	if (!reordering)
-		goto error;
-	for (i = 0; i < total + div; ++i)
-		reordering[i] = i;
-	for (i = total + div + 1; i < total + qp->div->n_row; ++i)
-		reordering[i] = i - 1;
-	qp->div = isl_mat_drop_rows(qp->div, div, 1);
-	qp->div = isl_mat_drop_cols(qp->div, 2 + total + div, 1);
-	qp->upoly = reorder(qp->upoly, reordering);
-	free(reordering);
-
-	if (!qp->upoly || !qp->div)
-		goto error;
-
-	isl_upoly_free(s);
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	isl_upoly_free(s);
-	return NULL;
-}
-
-/* Replace all integer divisions [e/d] that turn out to not actually be integer
- * divisions because d is equal to 1 by their definition, i.e., e.
- */
-static __isl_give isl_qpolynomial *substitute_non_divs(
-	__isl_take isl_qpolynomial *qp)
-{
-	int i, j;
-	int total;
-	struct isl_upoly *s;
-
-	if (!qp)
-		return NULL;
-
-	total = isl_space_dim(qp->dim, isl_dim_all);
-	for (i = 0; qp && i < qp->div->n_row; ++i) {
-		if (!isl_int_is_one(qp->div->row[i][0]))
-			continue;
-		for (j = i + 1; j < qp->div->n_row; ++j) {
-			if (isl_int_is_zero(qp->div->row[j][2 + total + i]))
-				continue;
-			isl_seq_combine(qp->div->row[j] + 1,
-				qp->div->ctx->one, qp->div->row[j] + 1,
-				qp->div->row[j][2 + total + i],
-				qp->div->row[i] + 1, 1 + total + i);
-			isl_int_set_si(qp->div->row[j][2 + total + i], 0);
-			normalize_div(qp, j);
-		}
-		s = isl_upoly_from_affine(qp->dim->ctx, qp->div->row[i] + 1,
-					qp->div->row[i][0], qp->div->n_col - 1);
-		qp = substitute_div(qp, i, s);
-		--i;
-	}
-
-	return qp;
-}
-
-/* Reduce the coefficients of div "div" to lie in the interval [0, d-1],
- * with d the denominator.  When replacing the coefficient e of x by
- * d * frac(e/d) = e - d * floor(e/d), we are subtracting d * floor(e/d) * x
- * 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").
- */
-static void reduce_div(__isl_keep isl_qpolynomial *qp, int div,
-	__isl_keep isl_vec *aff)
-{
-	int i, j;
-	isl_int v;
-	unsigned total = qp->div->n_col - qp->div->n_row - 2;
-
-	isl_int_init(v);
-	for (i = 0; i < 1 + total + div; ++i) {
-		if (isl_int_is_nonneg(qp->div->row[div][1 + i]) &&
-		    isl_int_lt(qp->div->row[div][1 + i], qp->div->row[div][0]))
-			continue;
-		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]);
-		for (j = div + 1; j < qp->div->n_row; ++j) {
-			if (isl_int_is_zero(qp->div->row[j][2 + total + div]))
-				continue;
-			isl_int_addmul(qp->div->row[j][1 + i],
-					v, qp->div->row[j][2 + total + div]);
-		}
-	}
-	isl_int_clear(v);
-}
-
-/* Check if the last non-zero coefficient is bigger that half of the
- * denominator.  If so, we will invert the div to further reduce the number
- * of distinct divs that may appear.
- * If the last non-zero coefficient is exactly half the denominator,
- * then we continue looking for earlier coefficients that are bigger
- * than half the denominator.
- */
-static int needs_invert(__isl_keep isl_mat *div, int row)
-{
-	int i;
-	int cmp;
-
-	for (i = div->n_col - 1; i >= 1; --i) {
-		if (isl_int_is_zero(div->row[row][i]))
-			continue;
-		isl_int_mul_ui(div->row[row][i], div->row[row][i], 2);
-		cmp = isl_int_cmp(div->row[row][i], div->row[row][0]);
-		isl_int_divexact_ui(div->row[row][i], div->row[row][i], 2);
-		if (cmp)
-			return cmp > 0;
-		if (i == 1)
-			return 1;
-	}
-
-	return 0;
-}
-
-/* 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
- * coefficients of e should be reduced again.
- */
-static void invert_div(__isl_keep isl_qpolynomial *qp, int div,
-	__isl_keep isl_vec *aff)
-{
-	unsigned total = qp->div->n_col - qp->div->n_row - 2;
-
-	isl_seq_neg(qp->div->row[div] + 1,
-		    qp->div->row[div] + 1, qp->div->n_col - 1);
-	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]);
-	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
- * 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.
- *
- * After the reduction, some divs may have become redundant or identical,
- * so we call substitute_non_divs and sort_divs.  If these functions
- * eliminate divs or merge two or more divs into one, the coefficients
- * of the enclosing divs may have to be reduced again, so we call
- * ourselves recursively if the number of divs decreases.
- */
-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;
-
-	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;
-
-	isl_int_set_si(aff->el[1 + qp->upoly->var], 1);
-
-	for (i = 0; i < qp->div->n_row; ++i) {
-		normalize_div(qp, i);
-		reduce_div(qp, i, aff);
-		if (needs_invert(qp->div, i)) {
-			invert_div(qp, i, aff);
-			reduce_div(qp, i, aff);
-		}
-	}
-
-	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);
-	if (!qp->upoly)
-		goto error;
-
-	isl_vec_free(aff);
-
-	n_div = qp->div->n_row;
-	qp = substitute_non_divs(qp);
-	qp = sort_divs(qp);
-	if (qp && qp->div->n_row < n_div)
-		return reduce_divs(qp);
-
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	isl_vec_free(aff);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_rat_cst_on_domain(
-	__isl_take isl_space *dim, const isl_int n, const isl_int d)
-{
-	struct isl_qpolynomial *qp;
-	struct isl_upoly_cst *cst;
-
-	if (!dim)
-		return NULL;
-
-	qp = isl_qpolynomial_alloc(dim, 0, isl_upoly_zero(dim->ctx));
-	if (!qp)
-		return NULL;
-
-	cst = isl_upoly_as_cst(qp->upoly);
-	isl_int_set(cst->n, n);
-	isl_int_set(cst->d, d);
-
-	return qp;
-}
-
-static int up_set_active(__isl_keep struct isl_upoly *up, int *active, int d)
-{
-	struct isl_upoly_rec *rec;
-	int i;
-
-	if (!up)
-		return -1;
-
-	if (isl_upoly_is_cst(up))
-		return 0;
-
-	if (up->var < d)
-		active[up->var] = 1;
-
-	rec = isl_upoly_as_rec(up);
-	for (i = 0; i < rec->n; ++i)
-		if (up_set_active(rec->p[i], active, d) < 0)
-			return -1;
-
-	return 0;
-}
-
-static int set_active(__isl_keep isl_qpolynomial *qp, int *active)
-{
-	int i, j;
-	int d = isl_space_dim(qp->dim, isl_dim_all);
-
-	if (!qp || !active)
-		return -1;
-
-	for (i = 0; i < d; ++i)
-		for (j = 0; j < qp->div->n_row; ++j) {
-			if (isl_int_is_zero(qp->div->row[j][2 + i]))
-				continue;
-			active[i] = 1;
-			break;
-		}
-
-	return up_set_active(qp->upoly, active, d);
-}
-
-int isl_qpolynomial_involves_dims(__isl_keep isl_qpolynomial *qp,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-	int *active = NULL;
-	int involves = 0;
-
-	if (!qp)
-		return -1;
-	if (n == 0)
-		return 0;
-
-	isl_assert(qp->dim->ctx,
-		    first + n <= isl_qpolynomial_dim(qp, type), return -1);
-	isl_assert(qp->dim->ctx, type == isl_dim_param ||
-				 type == isl_dim_in, return -1);
-
-	active = isl_calloc_array(qp->dim->ctx, int,
-					isl_space_dim(qp->dim, isl_dim_all));
-	if (set_active(qp, active) < 0)
-		goto error;
-
-	if (type == isl_dim_in)
-		first += isl_space_dim(qp->dim, isl_dim_param);
-	for (i = 0; i < n; ++i)
-		if (active[first + i]) {
-			involves = 1;
-			break;
-		}
-
-	free(active);
-
-	return involves;
-error:
-	free(active);
-	return -1;
-}
-
-/* Remove divs that do not appear in the quasi-polynomial, nor in any
- * of the divs that do appear in the quasi-polynomial.
- */
-static __isl_give isl_qpolynomial *remove_redundant_divs(
-	__isl_take isl_qpolynomial *qp)
-{
-	int i, j;
-	int d;
-	int len;
-	int skip;
-	int *active = NULL;
-	int *reordering = NULL;
-	int redundant = 0;
-	int n_div;
-	isl_ctx *ctx;
-
-	if (!qp)
-		return NULL;
-	if (qp->div->n_row == 0)
-		return qp;
-
-	d = isl_space_dim(qp->dim, isl_dim_all);
-	len = qp->div->n_col - 2;
-	ctx = isl_qpolynomial_get_ctx(qp);
-	active = isl_calloc_array(ctx, int, len);
-	if (!active)
-		goto error;
-
-	if (up_set_active(qp->upoly, active, len) < 0)
-		goto error;
-
-	for (i = qp->div->n_row - 1; i >= 0; --i) {
-		if (!active[d + i]) {
-			redundant = 1;
-			continue;
-		}
-		for (j = 0; j < i; ++j) {
-			if (isl_int_is_zero(qp->div->row[i][2 + d + j]))
-				continue;
-			active[d + j] = 1;
-			break;
-		}
-	}
-
-	if (!redundant) {
-		free(active);
-		return qp;
-	}
-
-	reordering = isl_alloc_array(qp->div->ctx, int, len);
-	if (!reordering)
-		goto error;
-
-	for (i = 0; i < d; ++i)
-		reordering[i] = i;
-
-	skip = 0;
-	n_div = qp->div->n_row;
-	for (i = 0; i < n_div; ++i) {
-		if (!active[d + i]) {
-			qp->div = isl_mat_drop_rows(qp->div, i - skip, 1);
-			qp->div = isl_mat_drop_cols(qp->div,
-						    2 + d + i - skip, 1);
-			skip++;
-		}
-		reordering[d + i] = d + i - skip;
-	}
-
-	qp->upoly = reorder(qp->upoly, reordering);
-
-	if (!qp->upoly || !qp->div)
-		goto error;
-
-	free(active);
-	free(reordering);
-
-	return qp;
-error:
-	free(active);
-	free(reordering);
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_drop(__isl_take struct isl_upoly *up,
-	unsigned first, unsigned n)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-
-	if (!up)
-		return NULL;
-	if (n == 0 || up->var < 0 || up->var < first)
-		return up;
-	if (up->var < first + n) {
-		up = replace_by_constant_term(up);
-		return isl_upoly_drop(up, first, n);
-	}
-	up = isl_upoly_cow(up);
-	if (!up)
-		return NULL;
-	up->var -= n;
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-
-	for (i = 0; i < rec->n; ++i) {
-		rec->p[i] = isl_upoly_drop(rec->p[i], first, n);
-		if (!rec->p[i])
-			goto error;
-	}
-
-	return up;
-error:
-	isl_upoly_free(up);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_set_dim_name(
-	__isl_take isl_qpolynomial *qp,
-	enum isl_dim_type type, unsigned pos, const char *s)
-{
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		return NULL;
-	qp->dim = isl_space_set_dim_name(qp->dim, type, pos, s);
-	if (!qp->dim)
-		goto error;
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_drop_dims(
-	__isl_take isl_qpolynomial *qp,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	if (!qp)
-		return NULL;
-	if (type == isl_dim_out)
-		isl_die(qp->dim->ctx, isl_error_invalid,
-			"cannot drop output/set dimension",
-			goto error);
-	if (type == isl_dim_in)
-		type = isl_dim_set;
-	if (n == 0 && !isl_space_is_named_or_nested(qp->dim, type))
-		return qp;
-
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		return NULL;
-
-	isl_assert(qp->dim->ctx, first + n <= isl_space_dim(qp->dim, type),
-			goto error);
-	isl_assert(qp->dim->ctx, type == isl_dim_param ||
-				 type == isl_dim_set, goto error);
-
-	qp->dim = isl_space_drop_dims(qp->dim, type, first, n);
-	if (!qp->dim)
-		goto error;
-
-	if (type == isl_dim_set)
-		first += isl_space_dim(qp->dim, isl_dim_param);
-
-	qp->div = isl_mat_drop_cols(qp->div, 2 + first, n);
-	if (!qp->div)
-		goto error;
-
-	qp->upoly = isl_upoly_drop(qp->upoly, first, n);
-	if (!qp->upoly)
-		goto error;
-
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-/* Project the domain of the quasi-polynomial onto its parameter space.
- * The quasi-polynomial may not involve any of the domain dimensions.
- */
-__isl_give isl_qpolynomial *isl_qpolynomial_project_domain_on_params(
-	__isl_take isl_qpolynomial *qp)
-{
-	isl_space *space;
-	unsigned n;
-	int involves;
-
-	n = isl_qpolynomial_dim(qp, isl_dim_in);
-	involves = isl_qpolynomial_involves_dims(qp, isl_dim_in, 0, n);
-	if (involves < 0)
-		return isl_qpolynomial_free(qp);
-	if (involves)
-		isl_die(isl_qpolynomial_get_ctx(qp), isl_error_invalid,
-			"polynomial involves some of the domain dimensions",
-			return isl_qpolynomial_free(qp));
-	qp = isl_qpolynomial_drop_dims(qp, isl_dim_in, 0, n);
-	space = isl_qpolynomial_get_domain_space(qp);
-	space = isl_space_params(space);
-	qp = isl_qpolynomial_reset_domain_space(qp, space);
-	return qp;
-}
-
-static __isl_give isl_qpolynomial *isl_qpolynomial_substitute_equalities_lifted(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_basic_set *eq)
-{
-	int i, j, k;
-	isl_int denom;
-	unsigned total;
-	unsigned n_div;
-	struct isl_upoly *up;
-
-	if (!eq)
-		goto error;
-	if (eq->n_eq == 0) {
-		isl_basic_set_free(eq);
-		return qp;
-	}
-
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		goto error;
-	qp->div = isl_mat_cow(qp->div);
-	if (!qp->div)
-		goto error;
-
-	total = 1 + isl_space_dim(eq->dim, isl_dim_all);
-	n_div = eq->n_div;
-	isl_int_init(denom);
-	for (i = 0; i < eq->n_eq; ++i) {
-		j = isl_seq_last_non_zero(eq->eq[i], total + n_div);
-		if (j < 0 || j == 0 || j >= total)
-			continue;
-
-		for (k = 0; k < qp->div->n_row; ++k) {
-			if (isl_int_is_zero(qp->div->row[k][1 + j]))
-				continue;
-			isl_seq_elim(qp->div->row[k] + 1, eq->eq[i], j, total,
-					&qp->div->row[k][0]);
-			normalize_div(qp, k);
-		}
-
-		if (isl_int_is_pos(eq->eq[i][j]))
-			isl_seq_neg(eq->eq[i], eq->eq[i], total);
-		isl_int_abs(denom, eq->eq[i][j]);
-		isl_int_set_si(eq->eq[i][j], 0);
-
-		up = isl_upoly_from_affine(qp->dim->ctx,
-						   eq->eq[i], denom, total);
-		qp->upoly = isl_upoly_subs(qp->upoly, j - 1, 1, &up);
-		isl_upoly_free(up);
-	}
-	isl_int_clear(denom);
-
-	if (!qp->upoly)
-		goto error;
-
-	isl_basic_set_free(eq);
-
-	qp = substitute_non_divs(qp);
-	qp = sort_divs(qp);
-
-	return qp;
-error:
-	isl_basic_set_free(eq);
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-/* Exploit the equalities in "eq" to simplify the quasi-polynomial.
- */
-__isl_give isl_qpolynomial *isl_qpolynomial_substitute_equalities(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_basic_set *eq)
-{
-	if (!qp || !eq)
-		goto error;
-	if (qp->div->n_row > 0)
-		eq = isl_basic_set_add(eq, isl_dim_set, qp->div->n_row);
-	return isl_qpolynomial_substitute_equalities_lifted(qp, eq);
-error:
-	isl_basic_set_free(eq);
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-static __isl_give isl_basic_set *add_div_constraints(
-	__isl_take isl_basic_set *bset, __isl_take isl_mat *div)
-{
-	int i;
-	unsigned total;
-
-	if (!bset || !div)
-		goto error;
-
-	bset = isl_basic_set_extend_constraints(bset, 0, 2 * div->n_row);
-	if (!bset)
-		goto error;
-	total = isl_basic_set_total_dim(bset);
-	for (i = 0; i < div->n_row; ++i)
-		if (isl_basic_set_add_div_constraints_var(bset,
-				    total - div->n_row + i, div->row[i]) < 0)
-			goto error;
-
-	isl_mat_free(div);
-	return bset;
-error:
-	isl_mat_free(div);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Look for equalities among the variables shared by context and qp
- * and the integer divisions of qp, if any.
- * The equalities are then used to eliminate variables and/or integer
- * divisions from qp.
- */
-__isl_give isl_qpolynomial *isl_qpolynomial_gist(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_set *context)
-{
-	isl_basic_set *aff;
-
-	if (!qp)
-		goto error;
-	if (qp->div->n_row > 0) {
-		isl_basic_set *bset;
-		context = isl_set_add_dims(context, isl_dim_set,
-					    qp->div->n_row);
-		bset = isl_basic_set_universe(isl_set_get_space(context));
-		bset = add_div_constraints(bset, isl_mat_copy(qp->div));
-		context = isl_set_intersect(context,
-					    isl_set_from_basic_set(bset));
-	}
-
-	aff = isl_set_affine_hull(context);
-	return isl_qpolynomial_substitute_equalities_lifted(qp, aff);
-error:
-	isl_qpolynomial_free(qp);
-	isl_set_free(context);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_gist_params(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_set *context)
-{
-	isl_space *space = isl_qpolynomial_get_domain_space(qp);
-	isl_set *dom_context = isl_set_universe(space);
-	dom_context = isl_set_intersect_params(dom_context, context);
-	return isl_qpolynomial_gist(qp, dom_context);
-}
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_from_qpolynomial(
-	__isl_take isl_qpolynomial *qp)
-{
-	isl_set *dom;
-
-	if (!qp)
-		return NULL;
-	if (isl_qpolynomial_is_zero(qp)) {
-		isl_space *dim = isl_qpolynomial_get_space(qp);
-		isl_qpolynomial_free(qp);
-		return isl_pw_qpolynomial_zero(dim);
-	}
-
-	dom = isl_set_universe(isl_qpolynomial_get_domain_space(qp));
-	return isl_pw_qpolynomial_alloc(dom, qp);
-}
-
-#undef PW
-#define PW isl_pw_qpolynomial
-#undef EL
-#define EL isl_qpolynomial
-#undef EL_IS_ZERO
-#define EL_IS_ZERO is_zero
-#undef ZERO
-#define ZERO zero
-#undef IS_ZERO
-#define IS_ZERO is_zero
-#undef FIELD
-#define FIELD qp
-#undef DEFAULT_IS_ZERO
-#define DEFAULT_IS_ZERO 1
-
-#include <isl_pw_templ.c>
-
-#undef UNION
-#define UNION isl_union_pw_qpolynomial
-#undef PART
-#define PART isl_pw_qpolynomial
-#undef PARTS
-#define PARTS pw_qpolynomial
-#define ALIGN_DOMAIN
-
-#include <isl_union_templ.c>
-
-int isl_pw_qpolynomial_is_one(__isl_keep isl_pw_qpolynomial *pwqp)
-{
-	if (!pwqp)
-		return -1;
-
-	if (pwqp->n != -1)
-		return 0;
-
-	if (!isl_set_plain_is_universe(pwqp->p[0].set))
-		return 0;
-
-	return isl_qpolynomial_is_one(pwqp->p[0].qp);
-}
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add(
-	__isl_take isl_pw_qpolynomial *pwqp1,
-	__isl_take isl_pw_qpolynomial *pwqp2)
-{
-	return isl_pw_qpolynomial_union_add_(pwqp1, pwqp2);
-}
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_mul(
-	__isl_take isl_pw_qpolynomial *pwqp1,
-	__isl_take isl_pw_qpolynomial *pwqp2)
-{
-	int i, j, n;
-	struct isl_pw_qpolynomial *res;
-
-	if (!pwqp1 || !pwqp2)
-		goto error;
-
-	isl_assert(pwqp1->dim->ctx, isl_space_is_equal(pwqp1->dim, pwqp2->dim),
-			goto error);
-
-	if (isl_pw_qpolynomial_is_zero(pwqp1)) {
-		isl_pw_qpolynomial_free(pwqp2);
-		return pwqp1;
-	}
-
-	if (isl_pw_qpolynomial_is_zero(pwqp2)) {
-		isl_pw_qpolynomial_free(pwqp1);
-		return pwqp2;
-	}
-
-	if (isl_pw_qpolynomial_is_one(pwqp1)) {
-		isl_pw_qpolynomial_free(pwqp1);
-		return pwqp2;
-	}
-
-	if (isl_pw_qpolynomial_is_one(pwqp2)) {
-		isl_pw_qpolynomial_free(pwqp2);
-		return pwqp1;
-	}
-
-	n = pwqp1->n * pwqp2->n;
-	res = isl_pw_qpolynomial_alloc_size(isl_space_copy(pwqp1->dim), n);
-
-	for (i = 0; i < pwqp1->n; ++i) {
-		for (j = 0; j < pwqp2->n; ++j) {
-			struct isl_set *common;
-			struct isl_qpolynomial *prod;
-			common = isl_set_intersect(isl_set_copy(pwqp1->p[i].set),
-						isl_set_copy(pwqp2->p[j].set));
-			if (isl_set_plain_is_empty(common)) {
-				isl_set_free(common);
-				continue;
-			}
-
-			prod = isl_qpolynomial_mul(
-				isl_qpolynomial_copy(pwqp1->p[i].qp),
-				isl_qpolynomial_copy(pwqp2->p[j].qp));
-
-			res = isl_pw_qpolynomial_add_piece(res, common, prod);
-		}
-	}
-
-	isl_pw_qpolynomial_free(pwqp1);
-	isl_pw_qpolynomial_free(pwqp2);
-
-	return res;
-error:
-	isl_pw_qpolynomial_free(pwqp1);
-	isl_pw_qpolynomial_free(pwqp2);
-	return NULL;
-}
-
-__isl_give struct isl_upoly *isl_upoly_eval(
-	__isl_take struct isl_upoly *up, __isl_take isl_vec *vec)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-	struct isl_upoly *res;
-	struct isl_upoly *base;
-
-	if (isl_upoly_is_cst(up)) {
-		isl_vec_free(vec);
-		return up;
-	}
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-
-	isl_assert(up->ctx, rec->n >= 1, goto error);
-
-	base = isl_upoly_rat_cst(up->ctx, vec->el[1 + up->var], vec->el[0]);
-
-	res = isl_upoly_eval(isl_upoly_copy(rec->p[rec->n - 1]),
-				isl_vec_copy(vec));
-
-	for (i = rec->n - 2; i >= 0; --i) {
-		res = isl_upoly_mul(res, isl_upoly_copy(base));
-		res = isl_upoly_sum(res, 
-			    isl_upoly_eval(isl_upoly_copy(rec->p[i]),
-							    isl_vec_copy(vec)));
-	}
-
-	isl_upoly_free(base);
-	isl_upoly_free(up);
-	isl_vec_free(vec);
-	return res;
-error:
-	isl_upoly_free(up);
-	isl_vec_free(vec);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_eval(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_point *pnt)
-{
-	isl_vec *ext;
-	struct isl_upoly *up;
-	isl_space *dim;
-
-	if (!qp || !pnt)
-		goto error;
-	isl_assert(pnt->dim->ctx, isl_space_is_equal(pnt->dim, qp->dim), goto error);
-
-	if (qp->div->n_row == 0)
-		ext = isl_vec_copy(pnt->vec);
-	else {
-		int i;
-		unsigned dim = isl_space_dim(qp->dim, isl_dim_all);
-		ext = isl_vec_alloc(qp->dim->ctx, 1 + dim + qp->div->n_row);
-		if (!ext)
-			goto error;
-
-		isl_seq_cpy(ext->el, pnt->vec->el, pnt->vec->size);
-		for (i = 0; i < qp->div->n_row; ++i) {
-			isl_seq_inner_product(qp->div->row[i] + 1, ext->el,
-						1 + dim + i, &ext->el[1+dim+i]);
-			isl_int_fdiv_q(ext->el[1+dim+i], ext->el[1+dim+i],
-					qp->div->row[i][0]);
-		}
-	}
-
-	up = isl_upoly_eval(isl_upoly_copy(qp->upoly), ext);
-	if (!up)
-		goto error;
-
-	dim = isl_space_copy(qp->dim);
-	isl_qpolynomial_free(qp);
-	isl_point_free(pnt);
-
-	return isl_qpolynomial_alloc(dim, 0, up);
-error:
-	isl_qpolynomial_free(qp);
-	isl_point_free(pnt);
-	return NULL;
-}
-
-int isl_upoly_cmp(__isl_keep struct isl_upoly_cst *cst1,
-	__isl_keep struct isl_upoly_cst *cst2)
-{
-	int cmp;
-	isl_int t;
-	isl_int_init(t);
-	isl_int_mul(t, cst1->n, cst2->d);
-	isl_int_submul(t, cst2->n, cst1->d);
-	cmp = isl_int_sgn(t);
-	isl_int_clear(t);
-	return cmp;
-}
-
-int isl_qpolynomial_le_cst(__isl_keep isl_qpolynomial *qp1,
-	__isl_keep isl_qpolynomial *qp2)
-{
-	struct isl_upoly_cst *cst1, *cst2;
-
-	if (!qp1 || !qp2)
-		return -1;
-	isl_assert(qp1->dim->ctx, isl_upoly_is_cst(qp1->upoly), return -1);
-	isl_assert(qp2->dim->ctx, isl_upoly_is_cst(qp2->upoly), return -1);
-	if (isl_qpolynomial_is_nan(qp1))
-		return -1;
-	if (isl_qpolynomial_is_nan(qp2))
-		return -1;
-	cst1 = isl_upoly_as_cst(qp1->upoly);
-	cst2 = isl_upoly_as_cst(qp2->upoly);
-
-	return isl_upoly_cmp(cst1, cst2) <= 0;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_min_cst(
-	__isl_take isl_qpolynomial *qp1, __isl_take isl_qpolynomial *qp2)
-{
-	struct isl_upoly_cst *cst1, *cst2;
-	int cmp;
-
-	if (!qp1 || !qp2)
-		goto error;
-	isl_assert(qp1->dim->ctx, isl_upoly_is_cst(qp1->upoly), goto error);
-	isl_assert(qp2->dim->ctx, isl_upoly_is_cst(qp2->upoly), goto error);
-	cst1 = isl_upoly_as_cst(qp1->upoly);
-	cst2 = isl_upoly_as_cst(qp2->upoly);
-	cmp = isl_upoly_cmp(cst1, cst2);
-
-	if (cmp <= 0) {
-		isl_qpolynomial_free(qp2);
-	} else {
-		isl_qpolynomial_free(qp1);
-		qp1 = qp2;
-	}
-	return qp1;
-error:
-	isl_qpolynomial_free(qp1);
-	isl_qpolynomial_free(qp2);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_max_cst(
-	__isl_take isl_qpolynomial *qp1, __isl_take isl_qpolynomial *qp2)
-{
-	struct isl_upoly_cst *cst1, *cst2;
-	int cmp;
-
-	if (!qp1 || !qp2)
-		goto error;
-	isl_assert(qp1->dim->ctx, isl_upoly_is_cst(qp1->upoly), goto error);
-	isl_assert(qp2->dim->ctx, isl_upoly_is_cst(qp2->upoly), goto error);
-	cst1 = isl_upoly_as_cst(qp1->upoly);
-	cst2 = isl_upoly_as_cst(qp2->upoly);
-	cmp = isl_upoly_cmp(cst1, cst2);
-
-	if (cmp >= 0) {
-		isl_qpolynomial_free(qp2);
-	} else {
-		isl_qpolynomial_free(qp1);
-		qp1 = qp2;
-	}
-	return qp1;
-error:
-	isl_qpolynomial_free(qp1);
-	isl_qpolynomial_free(qp2);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_insert_dims(
-	__isl_take isl_qpolynomial *qp, enum isl_dim_type type,
-	unsigned first, unsigned n)
-{
-	unsigned total;
-	unsigned g_pos;
-	int *exp;
-
-	if (!qp)
-		return NULL;
-	if (type == isl_dim_out)
-		isl_die(qp->div->ctx, isl_error_invalid,
-			"cannot insert output/set dimensions",
-			goto error);
-	if (type == isl_dim_in)
-		type = isl_dim_set;
-	if (n == 0 && !isl_space_is_named_or_nested(qp->dim, type))
-		return qp;
-
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		return NULL;
-
-	isl_assert(qp->div->ctx, first <= isl_space_dim(qp->dim, type),
-		    goto error);
-
-	g_pos = pos(qp->dim, type) + first;
-
-	qp->div = isl_mat_insert_zero_cols(qp->div, 2 + g_pos, n);
-	if (!qp->div)
-		goto error;
-
-	total = qp->div->n_col - 2;
-	if (total > g_pos) {
-		int i;
-		exp = isl_alloc_array(qp->div->ctx, int, total - g_pos);
-		if (!exp)
-			goto error;
-		for (i = 0; i < total - g_pos; ++i)
-			exp[i] = i + n;
-		qp->upoly = expand(qp->upoly, exp, g_pos);
-		free(exp);
-		if (!qp->upoly)
-			goto error;
-	}
-
-	qp->dim = isl_space_insert_dims(qp->dim, type, first, n);
-	if (!qp->dim)
-		goto error;
-
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_add_dims(
-	__isl_take isl_qpolynomial *qp, enum isl_dim_type type, unsigned n)
-{
-	unsigned pos;
-
-	pos = isl_qpolynomial_dim(qp, type);
-
-	return isl_qpolynomial_insert_dims(qp, type, pos, n);
-}
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add_dims(
-	__isl_take isl_pw_qpolynomial *pwqp,
-	enum isl_dim_type type, unsigned n)
-{
-	unsigned pos;
-
-	pos = isl_pw_qpolynomial_dim(pwqp, type);
-
-	return isl_pw_qpolynomial_insert_dims(pwqp, type, pos, n);
-}
-
-static int *reordering_move(isl_ctx *ctx,
-	unsigned len, unsigned dst, unsigned src, unsigned n)
-{
-	int i;
-	int *reordering;
-
-	reordering = isl_alloc_array(ctx, int, len);
-	if (!reordering)
-		return NULL;
-
-	if (dst <= src) {
-		for (i = 0; i < dst; ++i)
-			reordering[i] = i;
-		for (i = 0; i < n; ++i)
-			reordering[src + i] = dst + i;
-		for (i = 0; i < src - dst; ++i)
-			reordering[dst + i] = dst + n + i;
-		for (i = 0; i < len - src - n; ++i)
-			reordering[src + n + i] = src + n + i;
-	} else {
-		for (i = 0; i < src; ++i)
-			reordering[i] = i;
-		for (i = 0; i < n; ++i)
-			reordering[src + i] = dst + i;
-		for (i = 0; i < dst - src; ++i)
-			reordering[src + n + i] = src + i;
-		for (i = 0; i < len - dst - n; ++i)
-			reordering[dst + n + i] = dst + n + i;
-	}
-
-	return reordering;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_move_dims(
-	__isl_take isl_qpolynomial *qp,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n)
-{
-	unsigned g_dst_pos;
-	unsigned g_src_pos;
-	int *reordering;
-
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		return NULL;
-
-	if (dst_type == isl_dim_out || src_type == isl_dim_out)
-		isl_die(qp->dim->ctx, isl_error_invalid,
-			"cannot move output/set dimension",
-			goto error);
-	if (dst_type == isl_dim_in)
-		dst_type = isl_dim_set;
-	if (src_type == isl_dim_in)
-		src_type = isl_dim_set;
-
-	isl_assert(qp->dim->ctx, src_pos + n <= isl_space_dim(qp->dim, src_type),
-		goto error);
-
-	g_dst_pos = pos(qp->dim, dst_type) + dst_pos;
-	g_src_pos = pos(qp->dim, src_type) + src_pos;
-	if (dst_type > src_type)
-		g_dst_pos -= n;
-
-	qp->div = isl_mat_move_cols(qp->div, 2 + g_dst_pos, 2 + g_src_pos, n);
-	if (!qp->div)
-		goto error;
-	qp = sort_divs(qp);
-	if (!qp)
-		goto error;
-
-	reordering = reordering_move(qp->dim->ctx,
-				qp->div->n_col - 2, g_dst_pos, g_src_pos, n);
-	if (!reordering)
-		goto error;
-
-	qp->upoly = reorder(qp->upoly, reordering);
-	free(reordering);
-	if (!qp->upoly)
-		goto error;
-
-	qp->dim = isl_space_move_dims(qp->dim, dst_type, dst_pos, src_type, src_pos, n);
-	if (!qp->dim)
-		goto error;
-
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_from_affine(__isl_take isl_space *dim,
-	isl_int *f, isl_int denom)
-{
-	struct isl_upoly *up;
-
-	dim = isl_space_domain(dim);
-	if (!dim)
-		return NULL;
-
-	up = isl_upoly_from_affine(dim->ctx, f, denom,
-					1 + isl_space_dim(dim, isl_dim_all));
-
-	return isl_qpolynomial_alloc(dim, 0, up);
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_from_aff(__isl_take isl_aff *aff)
-{
-	isl_ctx *ctx;
-	struct isl_upoly *up;
-	isl_qpolynomial *qp;
-
-	if (!aff)
-		return NULL;
-
-	ctx = isl_aff_get_ctx(aff);
-	up = isl_upoly_from_affine(ctx, aff->v->el + 1, aff->v->el[0],
-				    aff->v->size - 1);
-
-	qp = isl_qpolynomial_alloc(isl_aff_get_domain_space(aff),
-				    aff->ls->div->n_row, up);
-	if (!qp)
-		goto error;
-
-	isl_mat_free(qp->div);
-	qp->div = isl_mat_copy(aff->ls->div);
-	qp->div = isl_mat_cow(qp->div);
-	if (!qp->div)
-		goto error;
-
-	isl_aff_free(aff);
-	qp = reduce_divs(qp);
-	qp = remove_redundant_divs(qp);
-	return qp;
-error:
-	isl_aff_free(aff);
-	return NULL;
-}
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_from_pw_aff(
-	__isl_take isl_pw_aff *pwaff)
-{
-	int i;
-	isl_pw_qpolynomial *pwqp;
-
-	if (!pwaff)
-		return NULL;
-
-	pwqp = isl_pw_qpolynomial_alloc_size(isl_pw_aff_get_space(pwaff),
-						pwaff->n);
-
-	for (i = 0; i < pwaff->n; ++i) {
-		isl_set *dom;
-		isl_qpolynomial *qp;
-
-		dom = isl_set_copy(pwaff->p[i].set);
-		qp = isl_qpolynomial_from_aff(isl_aff_copy(pwaff->p[i].aff));
-		pwqp = isl_pw_qpolynomial_add_piece(pwqp,  dom, qp);
-	}
-
-	isl_pw_aff_free(pwaff);
-	return pwqp;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_from_constraint(
-	__isl_take isl_constraint *c, enum isl_dim_type type, unsigned pos)
-{
-	isl_aff *aff;
-
-	aff = isl_constraint_get_bound(c, type, pos);
-	isl_constraint_free(c);
-	return isl_qpolynomial_from_aff(aff);
-}
-
-/* For each 0 <= i < "n", replace variable "first" + i of type "type"
- * in "qp" by subs[i].
- */
-__isl_give isl_qpolynomial *isl_qpolynomial_substitute(
-	__isl_take isl_qpolynomial *qp,
-	enum isl_dim_type type, unsigned first, unsigned n,
-	__isl_keep isl_qpolynomial **subs)
-{
-	int i;
-	struct isl_upoly **ups;
-
-	if (n == 0)
-		return qp;
-
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		return NULL;
-
-	if (type == isl_dim_out)
-		isl_die(qp->dim->ctx, isl_error_invalid,
-			"cannot substitute output/set dimension",
-			goto error);
-	if (type == isl_dim_in)
-		type = isl_dim_set;
-
-	for (i = 0; i < n; ++i)
-		if (!subs[i])
-			goto error;
-
-	isl_assert(qp->dim->ctx, first + n <= isl_space_dim(qp->dim, type),
-			goto error);
-
-	for (i = 0; i < n; ++i)
-		isl_assert(qp->dim->ctx, isl_space_is_equal(qp->dim, subs[i]->dim),
-				goto error);
-
-	isl_assert(qp->dim->ctx, qp->div->n_row == 0, goto error);
-	for (i = 0; i < n; ++i)
-		isl_assert(qp->dim->ctx, subs[i]->div->n_row == 0, goto error);
-
-	first += pos(qp->dim, type);
-
-	ups = isl_alloc_array(qp->dim->ctx, struct isl_upoly *, n);
-	if (!ups)
-		goto error;
-	for (i = 0; i < n; ++i)
-		ups[i] = subs[i]->upoly;
-
-	qp->upoly = isl_upoly_subs(qp->upoly, first, n, ups);
-
-	free(ups);
-
-	if (!qp->upoly)
-		goto error;
-
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-/* Extend "bset" with extra set dimensions for each integer division
- * in "qp" and then call "fn" with the extended bset and the polynomial
- * that results from replacing each of the integer divisions by the
- * corresponding extra set dimension.
- */
-int isl_qpolynomial_as_polynomial_on_domain(__isl_keep isl_qpolynomial *qp,
-	__isl_keep isl_basic_set *bset,
-	int (*fn)(__isl_take isl_basic_set *bset,
-		  __isl_take isl_qpolynomial *poly, void *user), void *user)
-{
-	isl_space *dim;
-	isl_mat *div;
-	isl_qpolynomial *poly;
-
-	if (!qp || !bset)
-		goto error;
-	if (qp->div->n_row == 0)
-		return fn(isl_basic_set_copy(bset), isl_qpolynomial_copy(qp),
-			  user);
-
-	div = isl_mat_copy(qp->div);
-	dim = isl_space_copy(qp->dim);
-	dim = isl_space_add_dims(dim, isl_dim_set, qp->div->n_row);
-	poly = isl_qpolynomial_alloc(dim, 0, isl_upoly_copy(qp->upoly));
-	bset = isl_basic_set_copy(bset);
-	bset = isl_basic_set_add(bset, isl_dim_set, qp->div->n_row);
-	bset = add_div_constraints(bset, div);
-
-	return fn(bset, poly, user);
-error:
-	return -1;
-}
-
-/* Return total degree in variables first (inclusive) up to last (exclusive).
- */
-int isl_upoly_degree(__isl_keep struct isl_upoly *up, int first, int last)
-{
-	int deg = -1;
-	int i;
-	struct isl_upoly_rec *rec;
-
-	if (!up)
-		return -2;
-	if (isl_upoly_is_zero(up))
-		return -1;
-	if (isl_upoly_is_cst(up) || up->var < first)
-		return 0;
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		return -2;
-
-	for (i = 0; i < rec->n; ++i) {
-		int d;
-
-		if (isl_upoly_is_zero(rec->p[i]))
-			continue;
-		d = isl_upoly_degree(rec->p[i], first, last);
-		if (up->var < last)
-			d += i;
-		if (d > deg)
-			deg = d;
-	}
-
-	return deg;
-}
-
-/* Return total degree in set variables.
- */
-int isl_qpolynomial_degree(__isl_keep isl_qpolynomial *poly)
-{
-	unsigned ovar;
-	unsigned nvar;
-
-	if (!poly)
-		return -2;
-
-	ovar = isl_space_offset(poly->dim, isl_dim_set);
-	nvar = isl_space_dim(poly->dim, isl_dim_set);
-	return isl_upoly_degree(poly->upoly, ovar, ovar + nvar);
-}
-
-__isl_give struct isl_upoly *isl_upoly_coeff(__isl_keep struct isl_upoly *up,
-	unsigned pos, int deg)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-
-	if (!up)
-		return NULL;
-
-	if (isl_upoly_is_cst(up) || up->var < pos) {
-		if (deg == 0)
-			return isl_upoly_copy(up);
-		else
-			return isl_upoly_zero(up->ctx);
-	}
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		return NULL;
-
-	if (up->var == pos) {
-		if (deg < rec->n)
-			return isl_upoly_copy(rec->p[deg]);
-		else
-			return isl_upoly_zero(up->ctx);
-	}
-
-	up = isl_upoly_copy(up);
-	up = isl_upoly_cow(up);
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-
-	for (i = 0; i < rec->n; ++i) {
-		struct isl_upoly *t;
-		t = isl_upoly_coeff(rec->p[i], pos, deg);
-		if (!t)
-			goto error;
-		isl_upoly_free(rec->p[i]);
-		rec->p[i] = t;
-	}
-
-	return up;
-error:
-	isl_upoly_free(up);
-	return NULL;
-}
-
-/* Return coefficient of power "deg" of variable "t_pos" of type "type".
- */
-__isl_give isl_qpolynomial *isl_qpolynomial_coeff(
-	__isl_keep isl_qpolynomial *qp,
-	enum isl_dim_type type, unsigned t_pos, int deg)
-{
-	unsigned g_pos;
-	struct isl_upoly *up;
-	isl_qpolynomial *c;
-
-	if (!qp)
-		return NULL;
-
-	if (type == isl_dim_out)
-		isl_die(qp->div->ctx, isl_error_invalid,
-			"output/set dimension does not have a coefficient",
-			return NULL);
-	if (type == isl_dim_in)
-		type = isl_dim_set;
-
-	isl_assert(qp->div->ctx, t_pos < isl_space_dim(qp->dim, type),
-			return NULL);
-
-	g_pos = pos(qp->dim, type) + t_pos;
-	up = isl_upoly_coeff(qp->upoly, g_pos, deg);
-
-	c = isl_qpolynomial_alloc(isl_space_copy(qp->dim), qp->div->n_row, up);
-	if (!c)
-		return NULL;
-	isl_mat_free(c->div);
-	c->div = isl_mat_copy(qp->div);
-	if (!c->div)
-		goto error;
-	return c;
-error:
-	isl_qpolynomial_free(c);
-	return NULL;
-}
-
-/* Homogenize the polynomial in the variables first (inclusive) up to
- * last (exclusive) by inserting powers of variable first.
- * Variable first is assumed not to appear in the input.
- */
-__isl_give struct isl_upoly *isl_upoly_homogenize(
-	__isl_take struct isl_upoly *up, int deg, int target,
-	int first, int last)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-
-	if (!up)
-		return NULL;
-	if (isl_upoly_is_zero(up))
-		return up;
-	if (deg == target)
-		return up;
-	if (isl_upoly_is_cst(up) || up->var < first) {
-		struct isl_upoly *hom;
-
-		hom = isl_upoly_var_pow(up->ctx, first, target - deg);
-		if (!hom)
-			goto error;
-		rec = isl_upoly_as_rec(hom);
-		rec->p[target - deg] = isl_upoly_mul(rec->p[target - deg], up);
-
-		return hom;
-	}
-
-	up = isl_upoly_cow(up);
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-
-	for (i = 0; i < rec->n; ++i) {
-		if (isl_upoly_is_zero(rec->p[i]))
-			continue;
-		rec->p[i] = isl_upoly_homogenize(rec->p[i],
-				up->var < last ? deg + i : i, target,
-				first, last);
-		if (!rec->p[i])
-			goto error;
-	}
-
-	return up;
-error:
-	isl_upoly_free(up);
-	return NULL;
-}
-
-/* Homogenize the polynomial in the set variables by introducing
- * powers of an extra set variable at position 0.
- */
-__isl_give isl_qpolynomial *isl_qpolynomial_homogenize(
-	__isl_take isl_qpolynomial *poly)
-{
-	unsigned ovar;
-	unsigned nvar;
-	int deg = isl_qpolynomial_degree(poly);
-
-	if (deg < -1)
-		goto error;
-
-	poly = isl_qpolynomial_insert_dims(poly, isl_dim_in, 0, 1);
-	poly = isl_qpolynomial_cow(poly);
-	if (!poly)
-		goto error;
-
-	ovar = isl_space_offset(poly->dim, isl_dim_set);
-	nvar = isl_space_dim(poly->dim, isl_dim_set);
-	poly->upoly = isl_upoly_homogenize(poly->upoly, 0, deg,
-						ovar, ovar + nvar);
-	if (!poly->upoly)
-		goto error;
-
-	return poly;
-error:
-	isl_qpolynomial_free(poly);
-	return NULL;
-}
-
-__isl_give isl_term *isl_term_alloc(__isl_take isl_space *dim,
-	__isl_take isl_mat *div)
-{
-	isl_term *term;
-	int n;
-
-	if (!dim || !div)
-		goto error;
-
-	n = isl_space_dim(dim, isl_dim_all) + div->n_row;
-
-	term = isl_calloc(dim->ctx, struct isl_term,
-			sizeof(struct isl_term) + (n - 1) * sizeof(int));
-	if (!term)
-		goto error;
-
-	term->ref = 1;
-	term->dim = dim;
-	term->div = div;
-	isl_int_init(term->n);
-	isl_int_init(term->d);
-	
-	return term;
-error:
-	isl_space_free(dim);
-	isl_mat_free(div);
-	return NULL;
-}
-
-__isl_give isl_term *isl_term_copy(__isl_keep isl_term *term)
-{
-	if (!term)
-		return NULL;
-
-	term->ref++;
-	return term;
-}
-
-__isl_give isl_term *isl_term_dup(__isl_keep isl_term *term)
-{
-	int i;
-	isl_term *dup;
-	unsigned total;
-
-	if (term)
-		return NULL;
-
-	total = isl_space_dim(term->dim, isl_dim_all) + term->div->n_row;
-
-	dup = isl_term_alloc(isl_space_copy(term->dim), isl_mat_copy(term->div));
-	if (!dup)
-		return NULL;
-
-	isl_int_set(dup->n, term->n);
-	isl_int_set(dup->d, term->d);
-
-	for (i = 0; i < total; ++i)
-		dup->pow[i] = term->pow[i];
-
-	return dup;
-}
-
-__isl_give isl_term *isl_term_cow(__isl_take isl_term *term)
-{
-	if (!term)
-		return NULL;
-
-	if (term->ref == 1)
-		return term;
-	term->ref--;
-	return isl_term_dup(term);
-}
-
-void isl_term_free(__isl_take isl_term *term)
-{
-	if (!term)
-		return;
-
-	if (--term->ref > 0)
-		return;
-
-	isl_space_free(term->dim);
-	isl_mat_free(term->div);
-	isl_int_clear(term->n);
-	isl_int_clear(term->d);
-	free(term);
-}
-
-unsigned isl_term_dim(__isl_keep isl_term *term, enum isl_dim_type type)
-{
-	if (!term)
-		return 0;
-
-	switch (type) {
-	case isl_dim_param:
-	case isl_dim_in:
-	case isl_dim_out:	return isl_space_dim(term->dim, type);
-	case isl_dim_div:	return term->div->n_row;
-	case isl_dim_all:	return isl_space_dim(term->dim, isl_dim_all) +
-								term->div->n_row;
-	default:		return 0;
-	}
-}
-
-isl_ctx *isl_term_get_ctx(__isl_keep isl_term *term)
-{
-	return term ? term->dim->ctx : NULL;
-}
-
-void isl_term_get_num(__isl_keep isl_term *term, isl_int *n)
-{
-	if (!term)
-		return;
-	isl_int_set(*n, term->n);
-}
-
-void isl_term_get_den(__isl_keep isl_term *term, isl_int *d)
-{
-	if (!term)
-		return;
-	isl_int_set(*d, term->d);
-}
-
-int isl_term_get_exp(__isl_keep isl_term *term,
-	enum isl_dim_type type, unsigned pos)
-{
-	if (!term)
-		return -1;
-
-	isl_assert(term->dim->ctx, pos < isl_term_dim(term, type), return -1);
-
-	if (type >= isl_dim_set)
-		pos += isl_space_dim(term->dim, isl_dim_param);
-	if (type >= isl_dim_div)
-		pos += isl_space_dim(term->dim, isl_dim_set);
-
-	return term->pow[pos];
-}
-
-__isl_give isl_aff *isl_term_get_div(__isl_keep isl_term *term, unsigned pos)
-{
-	isl_local_space *ls;
-	isl_aff *aff;
-	unsigned total;
-
-	if (!term)
-		return NULL;
-
-	isl_assert(term->dim->ctx, pos < isl_term_dim(term, isl_dim_div),
-			return NULL);
-
-	total = term->div->n_col - term->div->n_row - 2;
-	/* No nested divs for now */
-	isl_assert(term->dim->ctx,
-		isl_seq_first_non_zero(term->div->row[pos] + 2 + total,
-					term->div->n_row) == -1,
-		return NULL);
-
-	ls = isl_local_space_alloc_div(isl_space_copy(term->dim),
-					isl_mat_copy(term->div));
-	aff = isl_aff_alloc(ls);
-	if (!aff)
-		return NULL;
-
-	isl_seq_cpy(aff->v->el, term->div->row[pos], aff->v->size);
-
-	return aff;
-}
-
-__isl_give isl_term *isl_upoly_foreach_term(__isl_keep struct isl_upoly *up,
-	int (*fn)(__isl_take isl_term *term, void *user),
-	__isl_take isl_term *term, void *user)
-{
-	int i;
-	struct isl_upoly_rec *rec;
-
-	if (!up || !term)
-		goto error;
-
-	if (isl_upoly_is_zero(up))
-		return term;
-
-	isl_assert(up->ctx, !isl_upoly_is_nan(up), goto error);
-	isl_assert(up->ctx, !isl_upoly_is_infty(up), goto error);
-	isl_assert(up->ctx, !isl_upoly_is_neginfty(up), goto error);
-
-	if (isl_upoly_is_cst(up)) {
-		struct isl_upoly_cst *cst;
-		cst = isl_upoly_as_cst(up);
-		if (!cst)
-			goto error;
-		term = isl_term_cow(term);
-		if (!term)
-			goto error;
-		isl_int_set(term->n, cst->n);
-		isl_int_set(term->d, cst->d);
-		if (fn(isl_term_copy(term), user) < 0)
-			goto error;
-		return term;
-	}
-
-	rec = isl_upoly_as_rec(up);
-	if (!rec)
-		goto error;
-
-	for (i = 0; i < rec->n; ++i) {
-		term = isl_term_cow(term);
-		if (!term)
-			goto error;
-		term->pow[up->var] = i;
-		term = isl_upoly_foreach_term(rec->p[i], fn, term, user);
-		if (!term)
-			goto error;
-	}
-	term->pow[up->var] = 0;
-
-	return term;
-error:
-	isl_term_free(term);
-	return NULL;
-}
-
-int isl_qpolynomial_foreach_term(__isl_keep isl_qpolynomial *qp,
-	int (*fn)(__isl_take isl_term *term, void *user), void *user)
-{
-	isl_term *term;
-
-	if (!qp)
-		return -1;
-
-	term = isl_term_alloc(isl_space_copy(qp->dim), isl_mat_copy(qp->div));
-	if (!term)
-		return -1;
-
-	term = isl_upoly_foreach_term(qp->upoly, fn, term, user);
-
-	isl_term_free(term);
-
-	return term ? 0 : -1;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_from_term(__isl_take isl_term *term)
-{
-	struct isl_upoly *up;
-	isl_qpolynomial *qp;
-	int i, n;
-
-	if (!term)
-		return NULL;
-
-	n = isl_space_dim(term->dim, isl_dim_all) + term->div->n_row;
-
-	up = isl_upoly_rat_cst(term->dim->ctx, term->n, term->d);
-	for (i = 0; i < n; ++i) {
-		if (!term->pow[i])
-			continue;
-		up = isl_upoly_mul(up,
-			isl_upoly_var_pow(term->dim->ctx, i, term->pow[i]));
-	}
-
-	qp = isl_qpolynomial_alloc(isl_space_copy(term->dim), term->div->n_row, up);
-	if (!qp)
-		goto error;
-	isl_mat_free(qp->div);
-	qp->div = isl_mat_copy(term->div);
-	if (!qp->div)
-		goto error;
-
-	isl_term_free(term);
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	isl_term_free(term);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_lift(__isl_take isl_qpolynomial *qp,
-	__isl_take isl_space *dim)
-{
-	int i;
-	int extra;
-	unsigned total;
-
-	if (!qp || !dim)
-		goto error;
-
-	if (isl_space_is_equal(qp->dim, dim)) {
-		isl_space_free(dim);
-		return qp;
-	}
-
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		goto error;
-
-	extra = isl_space_dim(dim, isl_dim_set) -
-			isl_space_dim(qp->dim, isl_dim_set);
-	total = isl_space_dim(qp->dim, isl_dim_all);
-	if (qp->div->n_row) {
-		int *exp;
-
-		exp = isl_alloc_array(qp->div->ctx, int, qp->div->n_row);
-		if (!exp)
-			goto error;
-		for (i = 0; i < qp->div->n_row; ++i)
-			exp[i] = extra + i;
-		qp->upoly = expand(qp->upoly, exp, total);
-		free(exp);
-		if (!qp->upoly)
-			goto error;
-	}
-	qp->div = isl_mat_insert_cols(qp->div, 2 + total, extra);
-	if (!qp->div)
-		goto error;
-	for (i = 0; i < qp->div->n_row; ++i)
-		isl_seq_clr(qp->div->row[i] + 2 + total, extra);
-
-	isl_space_free(qp->dim);
-	qp->dim = dim;
-
-	return qp;
-error:
-	isl_space_free(dim);
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-/* For each parameter or variable that does not appear in qp,
- * first eliminate the variable from all constraints and then set it to zero.
- */
-static __isl_give isl_set *fix_inactive(__isl_take isl_set *set,
-	__isl_keep isl_qpolynomial *qp)
-{
-	int *active = NULL;
-	int i;
-	int d;
-	unsigned nparam;
-	unsigned nvar;
-
-	if (!set || !qp)
-		goto error;
-
-	d = isl_space_dim(set->dim, isl_dim_all);
-	active = isl_calloc_array(set->ctx, int, d);
-	if (set_active(qp, active) < 0)
-		goto error;
-
-	for (i = 0; i < d; ++i)
-		if (!active[i])
-			break;
-
-	if (i == d) {
-		free(active);
-		return set;
-	}
-
-	nparam = isl_space_dim(set->dim, isl_dim_param);
-	nvar = isl_space_dim(set->dim, isl_dim_set);
-	for (i = 0; i < nparam; ++i) {
-		if (active[i])
-			continue;
-		set = isl_set_eliminate(set, isl_dim_param, i, 1);
-		set = isl_set_fix_si(set, isl_dim_param, i, 0);
-	}
-	for (i = 0; i < nvar; ++i) {
-		if (active[nparam + i])
-			continue;
-		set = isl_set_eliminate(set, isl_dim_set, i, 1);
-		set = isl_set_fix_si(set, isl_dim_set, i, 0);
-	}
-
-	free(active);
-
-	return set;
-error:
-	free(active);
-	isl_set_free(set);
-	return NULL;
-}
-
-struct isl_opt_data {
-	isl_qpolynomial *qp;
-	int first;
-	isl_qpolynomial *opt;
-	int max;
-};
-
-static int opt_fn(__isl_take isl_point *pnt, void *user)
-{
-	struct isl_opt_data *data = (struct isl_opt_data *)user;
-	isl_qpolynomial *val;
-
-	val = isl_qpolynomial_eval(isl_qpolynomial_copy(data->qp), pnt);
-	if (data->first) {
-		data->first = 0;
-		data->opt = val;
-	} else if (data->max) {
-		data->opt = isl_qpolynomial_max_cst(data->opt, val);
-	} else {
-		data->opt = isl_qpolynomial_min_cst(data->opt, val);
-	}
-
-	return 0;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_opt_on_domain(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_set *set, int max)
-{
-	struct isl_opt_data data = { NULL, 1, NULL, max };
-
-	if (!set || !qp)
-		goto error;
-
-	if (isl_upoly_is_cst(qp->upoly)) {
-		isl_set_free(set);
-		return qp;
-	}
-
-	set = fix_inactive(set, qp);
-
-	data.qp = qp;
-	if (isl_set_foreach_point(set, opt_fn, &data) < 0)
-		goto error;
-
-	if (data.first) {
-		isl_space *space = isl_qpolynomial_get_domain_space(qp);
-		data.opt = isl_qpolynomial_zero_on_domain(space);
-	}
-
-	isl_set_free(set);
-	isl_qpolynomial_free(qp);
-	return data.opt;
-error:
-	isl_set_free(set);
-	isl_qpolynomial_free(qp);
-	isl_qpolynomial_free(data.opt);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_morph_domain(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_morph *morph)
-{
-	int i;
-	int n_sub;
-	isl_ctx *ctx;
-	struct isl_upoly **subs;
-	isl_mat *mat, *diag;
-
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp || !morph)
-		goto error;
-
-	ctx = qp->dim->ctx;
-	isl_assert(ctx, isl_space_is_equal(qp->dim, morph->dom->dim), goto error);
-
-	n_sub = morph->inv->n_row - 1;
-	if (morph->inv->n_row != morph->inv->n_col)
-		n_sub += qp->div->n_row;
-	subs = isl_calloc_array(ctx, struct isl_upoly *, n_sub);
-	if (!subs)
-		goto error;
-
-	for (i = 0; 1 + i < morph->inv->n_row; ++i)
-		subs[i] = isl_upoly_from_affine(ctx, morph->inv->row[1 + i],
-					morph->inv->row[0][0], morph->inv->n_col);
-	if (morph->inv->n_row != morph->inv->n_col)
-		for (i = 0; i < qp->div->n_row; ++i)
-			subs[morph->inv->n_row - 1 + i] =
-			    isl_upoly_var_pow(ctx, morph->inv->n_col - 1 + i, 1);
-
-	qp->upoly = isl_upoly_subs(qp->upoly, 0, n_sub, subs);
-
-	for (i = 0; i < n_sub; ++i)
-		isl_upoly_free(subs[i]);
-	free(subs);
-
-	diag = isl_mat_diag(ctx, 1, morph->inv->row[0][0]);
-	mat = isl_mat_diagonal(diag, isl_mat_copy(morph->inv));
-	diag = isl_mat_diag(ctx, qp->div->n_row, morph->inv->row[0][0]);
-	mat = isl_mat_diagonal(mat, diag);
-	qp->div = isl_mat_product(qp->div, mat);
-	isl_space_free(qp->dim);
-	qp->dim = isl_space_copy(morph->ran->dim);
-
-	if (!qp->upoly || !qp->div || !qp->dim)
-		goto error;
-
-	isl_morph_free(morph);
-
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	isl_morph_free(morph);
-	return NULL;
-}
-
-static int neg_entry(void **entry, void *user)
-{
-	isl_pw_qpolynomial **pwqp = (isl_pw_qpolynomial **)entry;
-
-	*pwqp = isl_pw_qpolynomial_neg(*pwqp);
-
-	return *pwqp ? 0 : -1;
-}
-
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_neg(
-	__isl_take isl_union_pw_qpolynomial *upwqp)
-{
-	upwqp = isl_union_pw_qpolynomial_cow(upwqp);
-	if (!upwqp)
-		return NULL;
-
-	if (isl_hash_table_foreach(upwqp->dim->ctx, &upwqp->table,
-				   &neg_entry, NULL) < 0)
-		goto error;
-
-	return upwqp;
-error:
-	isl_union_pw_qpolynomial_free(upwqp);
-	return NULL;
-}
-
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_sub(
-	__isl_take isl_union_pw_qpolynomial *upwqp1,
-	__isl_take isl_union_pw_qpolynomial *upwqp2)
-{
-	return isl_union_pw_qpolynomial_add(upwqp1,
-					isl_union_pw_qpolynomial_neg(upwqp2));
-}
-
-static int mul_entry(void **entry, void *user)
-{
-	struct isl_union_pw_qpolynomial_match_bin_data *data = user;
-	uint32_t hash;
-	struct isl_hash_table_entry *entry2;
-	isl_pw_qpolynomial *pwpq = *entry;
-	int empty;
-
-	hash = isl_space_get_hash(pwpq->dim);
-	entry2 = isl_hash_table_find(data->u2->dim->ctx, &data->u2->table,
-				     hash, &has_dim, pwpq->dim, 0);
-	if (!entry2)
-		return 0;
-
-	pwpq = isl_pw_qpolynomial_copy(pwpq);
-	pwpq = isl_pw_qpolynomial_mul(pwpq,
-				      isl_pw_qpolynomial_copy(entry2->data));
-
-	empty = isl_pw_qpolynomial_is_zero(pwpq);
-	if (empty < 0) {
-		isl_pw_qpolynomial_free(pwpq);
-		return -1;
-	}
-	if (empty) {
-		isl_pw_qpolynomial_free(pwpq);
-		return 0;
-	}
-
-	data->res = isl_union_pw_qpolynomial_add_pw_qpolynomial(data->res, pwpq);
-
-	return 0;
-}
-
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_mul(
-	__isl_take isl_union_pw_qpolynomial *upwqp1,
-	__isl_take isl_union_pw_qpolynomial *upwqp2)
-{
-	return match_bin_op(upwqp1, upwqp2, &mul_entry);
-}
-
-/* Reorder the columns of the given div definitions according to the
- * given reordering.
- */
-static __isl_give isl_mat *reorder_divs(__isl_take isl_mat *div,
-	__isl_take isl_reordering *r)
-{
-	int i, j;
-	isl_mat *mat;
-	int extra;
-
-	if (!div || !r)
-		goto error;
-
-	extra = isl_space_dim(r->dim, isl_dim_all) + div->n_row - r->len;
-	mat = isl_mat_alloc(div->ctx, div->n_row, div->n_col + extra);
-	if (!mat)
-		goto error;
-
-	for (i = 0; i < div->n_row; ++i) {
-		isl_seq_cpy(mat->row[i], div->row[i], 2);
-		isl_seq_clr(mat->row[i] + 2, mat->n_col - 2);
-		for (j = 0; j < r->len; ++j)
-			isl_int_set(mat->row[i][2 + r->pos[j]],
-				    div->row[i][2 + j]);
-	}
-
-	isl_reordering_free(r);
-	isl_mat_free(div);
-	return mat;
-error:
-	isl_reordering_free(r);
-	isl_mat_free(div);
-	return NULL;
-}
-
-/* Reorder the dimension of "qp" according to the given reordering.
- */
-__isl_give isl_qpolynomial *isl_qpolynomial_realign_domain(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_reordering *r)
-{
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		goto error;
-
-	r = isl_reordering_extend(r, qp->div->n_row);
-	if (!r)
-		goto error;
-
-	qp->div = reorder_divs(qp->div, isl_reordering_copy(r));
-	if (!qp->div)
-		goto error;
-
-	qp->upoly = reorder(qp->upoly, r->pos);
-	if (!qp->upoly)
-		goto error;
-
-	qp = isl_qpolynomial_reset_domain_space(qp, isl_space_copy(r->dim));
-
-	isl_reordering_free(r);
-	return qp;
-error:
-	isl_qpolynomial_free(qp);
-	isl_reordering_free(r);
-	return NULL;
-}
-
-__isl_give isl_qpolynomial *isl_qpolynomial_align_params(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_space *model)
-{
-	if (!qp || !model)
-		goto error;
-
-	if (!isl_space_match(qp->dim, isl_dim_param, model, isl_dim_param)) {
-		isl_reordering *exp;
-
-		model = isl_space_drop_dims(model, isl_dim_in,
-					0, isl_space_dim(model, isl_dim_in));
-		model = isl_space_drop_dims(model, isl_dim_out,
-					0, isl_space_dim(model, isl_dim_out));
-		exp = isl_parameter_alignment_reordering(qp->dim, model);
-		exp = isl_reordering_extend_space(exp,
-					isl_qpolynomial_get_domain_space(qp));
-		qp = isl_qpolynomial_realign_domain(qp, exp);
-	}
-
-	isl_space_free(model);
-	return qp;
-error:
-	isl_space_free(model);
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-struct isl_split_periods_data {
-	int max_periods;
-	isl_pw_qpolynomial *res;
-};
-
-/* Create a slice where the integer division "div" has the fixed value "v".
- * In particular, if "div" refers to floor(f/m), then create a slice
- *
- *	m v <= f <= m v + (m - 1)
- *
- * or
- *
- *	f - m v >= 0
- *	-f + m v + (m - 1) >= 0
- */
-static __isl_give isl_set *set_div_slice(__isl_take isl_space *dim,
-	__isl_keep isl_qpolynomial *qp, int div, isl_int v)
-{
-	int total;
-	isl_basic_set *bset = NULL;
-	int k;
-
-	if (!dim || !qp)
-		goto error;
-
-	total = isl_space_dim(dim, isl_dim_all);
-	bset = isl_basic_set_alloc_space(isl_space_copy(dim), 0, 0, 2);
-
-	k = isl_basic_set_alloc_inequality(bset);
-	if (k < 0)
-		goto error;
-	isl_seq_cpy(bset->ineq[k], qp->div->row[div] + 1, 1 + total);
-	isl_int_submul(bset->ineq[k][0], v, qp->div->row[div][0]);
-
-	k = isl_basic_set_alloc_inequality(bset);
-	if (k < 0)
-		goto error;
-	isl_seq_neg(bset->ineq[k], qp->div->row[div] + 1, 1 + total);
-	isl_int_addmul(bset->ineq[k][0], v, qp->div->row[div][0]);
-	isl_int_add(bset->ineq[k][0], bset->ineq[k][0], qp->div->row[div][0]);
-	isl_int_sub_ui(bset->ineq[k][0], bset->ineq[k][0], 1);
-
-	isl_space_free(dim);
-	return isl_set_from_basic_set(bset);
-error:
-	isl_basic_set_free(bset);
-	isl_space_free(dim);
-	return NULL;
-}
-
-static int split_periods(__isl_take isl_set *set,
-	__isl_take isl_qpolynomial *qp, void *user);
-
-/* Create a slice of the domain "set" such that integer division "div"
- * has the fixed value "v" and add the results to data->res,
- * replacing the integer division by "v" in "qp".
- */
-static int set_div(__isl_take isl_set *set,
-	__isl_take isl_qpolynomial *qp, int div, isl_int v,
-	struct isl_split_periods_data *data)
-{
-	int i;
-	int total;
-	isl_set *slice;
-	struct isl_upoly *cst;
-
-	slice = set_div_slice(isl_set_get_space(set), qp, div, v);
-	set = isl_set_intersect(set, slice);
-
-	if (!qp)
-		goto error;
-
-	total = isl_space_dim(qp->dim, isl_dim_all);
-
-	for (i = div + 1; i < qp->div->n_row; ++i) {
-		if (isl_int_is_zero(qp->div->row[i][2 + total + div]))
-			continue;
-		isl_int_addmul(qp->div->row[i][1],
-				qp->div->row[i][2 + total + div], v);
-		isl_int_set_si(qp->div->row[i][2 + total + div], 0);
-	}
-
-	cst = isl_upoly_rat_cst(qp->dim->ctx, v, qp->dim->ctx->one);
-	qp = substitute_div(qp, div, cst);
-
-	return split_periods(set, qp, data);
-error:
-	isl_set_free(set);
-	isl_qpolynomial_free(qp);
-	return -1;
-}
-
-/* Split the domain "set" such that integer division "div"
- * has a fixed value (ranging from "min" to "max") on each slice
- * and add the results to data->res.
- */
-static int split_div(__isl_take isl_set *set,
-	__isl_take isl_qpolynomial *qp, int div, isl_int min, isl_int max,
-	struct isl_split_periods_data *data)
-{
-	for (; isl_int_le(min, max); isl_int_add_ui(min, min, 1)) {
-		isl_set *set_i = isl_set_copy(set);
-		isl_qpolynomial *qp_i = isl_qpolynomial_copy(qp);
-
-		if (set_div(set_i, qp_i, div, min, data) < 0)
-			goto error;
-	}
-	isl_set_free(set);
-	isl_qpolynomial_free(qp);
-	return 0;
-error:
-	isl_set_free(set);
-	isl_qpolynomial_free(qp);
-	return -1;
-}
-
-/* If "qp" refers to any integer division
- * that can only attain "max_periods" distinct values on "set"
- * then split the domain along those distinct values.
- * Add the results (or the original if no splitting occurs)
- * to data->res.
- */
-static int split_periods(__isl_take isl_set *set,
-	__isl_take isl_qpolynomial *qp, void *user)
-{
-	int i;
-	isl_pw_qpolynomial *pwqp;
-	struct isl_split_periods_data *data;
-	isl_int min, max;
-	int total;
-	int r = 0;
-
-	data = (struct isl_split_periods_data *)user;
-
-	if (!set || !qp)
-		goto error;
-
-	if (qp->div->n_row == 0) {
-		pwqp = isl_pw_qpolynomial_alloc(set, qp);
-		data->res = isl_pw_qpolynomial_add_disjoint(data->res, pwqp);
-		return 0;
-	}
-
-	isl_int_init(min);
-	isl_int_init(max);
-	total = isl_space_dim(qp->dim, isl_dim_all);
-	for (i = 0; i < qp->div->n_row; ++i) {
-		enum isl_lp_result lp_res;
-
-		if (isl_seq_first_non_zero(qp->div->row[i] + 2 + total,
-						qp->div->n_row) != -1)
-			continue;
-
-		lp_res = isl_set_solve_lp(set, 0, qp->div->row[i] + 1,
-					  set->ctx->one, &min, NULL, NULL);
-		if (lp_res == isl_lp_error)
-			goto error2;
-		if (lp_res == isl_lp_unbounded || lp_res == isl_lp_empty)
-			continue;
-		isl_int_fdiv_q(min, min, qp->div->row[i][0]);
-
-		lp_res = isl_set_solve_lp(set, 1, qp->div->row[i] + 1,
-					  set->ctx->one, &max, NULL, NULL);
-		if (lp_res == isl_lp_error)
-			goto error2;
-		if (lp_res == isl_lp_unbounded || lp_res == isl_lp_empty)
-			continue;
-		isl_int_fdiv_q(max, max, qp->div->row[i][0]);
-
-		isl_int_sub(max, max, min);
-		if (isl_int_cmp_si(max, data->max_periods) < 0) {
-			isl_int_add(max, max, min);
-			break;
-		}
-	}
-
-	if (i < qp->div->n_row) {
-		r = split_div(set, qp, i, min, max, data);
-	} else {
-		pwqp = isl_pw_qpolynomial_alloc(set, qp);
-		data->res = isl_pw_qpolynomial_add_disjoint(data->res, pwqp);
-	}
-
-	isl_int_clear(max);
-	isl_int_clear(min);
-
-	return r;
-error2:
-	isl_int_clear(max);
-	isl_int_clear(min);
-error:
-	isl_set_free(set);
-	isl_qpolynomial_free(qp);
-	return -1;
-}
-
-/* If any quasi-polynomial in pwqp refers to any integer division
- * that can only attain "max_periods" distinct values on its domain
- * then split the domain along those distinct values.
- */
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_split_periods(
-	__isl_take isl_pw_qpolynomial *pwqp, int max_periods)
-{
-	struct isl_split_periods_data data;
-
-	data.max_periods = max_periods;
-	data.res = isl_pw_qpolynomial_zero(isl_pw_qpolynomial_get_space(pwqp));
-
-	if (isl_pw_qpolynomial_foreach_piece(pwqp, &split_periods, &data) < 0)
-		goto error;
-
-	isl_pw_qpolynomial_free(pwqp);
-
-	return data.res;
-error:
-	isl_pw_qpolynomial_free(data.res);
-	isl_pw_qpolynomial_free(pwqp);
-	return NULL;
-}
-
-/* Construct a piecewise quasipolynomial that is constant on the given
- * domain.  In particular, it is
- *	0	if cst == 0
- *	1	if cst == 1
- *  infinity	if cst == -1
- */
-static __isl_give isl_pw_qpolynomial *constant_on_domain(
-	__isl_take isl_basic_set *bset, int cst)
-{
-	isl_space *dim;
-	isl_qpolynomial *qp;
-
-	if (!bset)
-		return NULL;
-
-	bset = isl_basic_set_params(bset);
-	dim = isl_basic_set_get_space(bset);
-	if (cst < 0)
-		qp = isl_qpolynomial_infty_on_domain(dim);
-	else if (cst == 0)
-		qp = isl_qpolynomial_zero_on_domain(dim);
-	else
-		qp = isl_qpolynomial_one_on_domain(dim);
-	return isl_pw_qpolynomial_alloc(isl_set_from_basic_set(bset), qp);
-}
-
-/* Factor bset, call fn on each of the factors and return the product.
- *
- * If no factors can be found, simply call fn on the input.
- * Otherwise, construct the factors based on the factorizer,
- * call fn on each factor and compute the product.
- */
-static __isl_give isl_pw_qpolynomial *compressed_multiplicative_call(
-	__isl_take isl_basic_set *bset,
-	__isl_give isl_pw_qpolynomial *(*fn)(__isl_take isl_basic_set *bset))
-{
-	int i, n;
-	isl_space *dim;
-	isl_set *set;
-	isl_factorizer *f;
-	isl_qpolynomial *qp;
-	isl_pw_qpolynomial *pwqp;
-	unsigned nparam;
-	unsigned nvar;
-
-	f = isl_basic_set_factorizer(bset);
-	if (!f)
-		goto error;
-	if (f->n_group == 0) {
-		isl_factorizer_free(f);
-		return fn(bset);
-	}
-
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-
-	dim = isl_basic_set_get_space(bset);
-	dim = isl_space_domain(dim);
-	set = isl_set_universe(isl_space_copy(dim));
-	qp = isl_qpolynomial_one_on_domain(dim);
-	pwqp = isl_pw_qpolynomial_alloc(set, qp);
-
-	bset = isl_morph_basic_set(isl_morph_copy(f->morph), bset);
-
-	for (i = 0, n = 0; i < f->n_group; ++i) {
-		isl_basic_set *bset_i;
-		isl_pw_qpolynomial *pwqp_i;
-
-		bset_i = isl_basic_set_copy(bset);
-		bset_i = isl_basic_set_drop_constraints_involving(bset_i,
-			    nparam + n + f->len[i], nvar - n - f->len[i]);
-		bset_i = isl_basic_set_drop_constraints_involving(bset_i,
-			    nparam, n);
-		bset_i = isl_basic_set_drop(bset_i, isl_dim_set,
-			    n + f->len[i], nvar - n - f->len[i]);
-		bset_i = isl_basic_set_drop(bset_i, isl_dim_set, 0, n);
-
-		pwqp_i = fn(bset_i);
-		pwqp = isl_pw_qpolynomial_mul(pwqp, pwqp_i);
-
-		n += f->len[i];
-	}
-
-	isl_basic_set_free(bset);
-	isl_factorizer_free(f);
-
-	return pwqp;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Factor bset, call fn on each of the factors and return the product.
- * The function is assumed to evaluate to zero on empty domains,
- * to one on zero-dimensional domains and to infinity on unbounded domains
- * and will not be called explicitly on zero-dimensional or unbounded domains.
- *
- * We first check for some special cases and remove all equalities.
- * Then we hand over control to compressed_multiplicative_call.
- */
-__isl_give isl_pw_qpolynomial *isl_basic_set_multiplicative_call(
-	__isl_take isl_basic_set *bset,
-	__isl_give isl_pw_qpolynomial *(*fn)(__isl_take isl_basic_set *bset))
-{
-	int bounded;
-	isl_morph *morph;
-	isl_pw_qpolynomial *pwqp;
-
-	if (!bset)
-		return NULL;
-
-	if (isl_basic_set_plain_is_empty(bset))
-		return constant_on_domain(bset, 0);
-
-	if (isl_basic_set_dim(bset, isl_dim_set) == 0)
-		return constant_on_domain(bset, 1);
-
-	bounded = isl_basic_set_is_bounded(bset);
-	if (bounded < 0)
-		goto error;
-	if (!bounded)
-		return constant_on_domain(bset, -1);
-
-	if (bset->n_eq == 0)
-		return compressed_multiplicative_call(bset, fn);
-
-	morph = isl_basic_set_full_compression(bset);
-	bset = isl_morph_basic_set(isl_morph_copy(morph), bset);
-
-	pwqp = compressed_multiplicative_call(bset, fn);
-
-	morph = isl_morph_dom_params(morph);
-	morph = isl_morph_ran_params(morph);
-	morph = isl_morph_inverse(morph);
-
-	pwqp = isl_pw_qpolynomial_morph_domain(pwqp, morph);
-
-	return pwqp;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Drop all floors in "qp", turning each integer division [a/m] into
- * a rational division a/m.  If "down" is set, then the integer division
- * is replaces by (a-(m-1))/m instead.
- */
-static __isl_give isl_qpolynomial *qp_drop_floors(
-	__isl_take isl_qpolynomial *qp, int down)
-{
-	int i;
-	struct isl_upoly *s;
-
-	if (!qp)
-		return NULL;
-	if (qp->div->n_row == 0)
-		return qp;
-
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		return NULL;
-
-	for (i = qp->div->n_row - 1; i >= 0; --i) {
-		if (down) {
-			isl_int_sub(qp->div->row[i][1],
-				    qp->div->row[i][1], qp->div->row[i][0]);
-			isl_int_add_ui(qp->div->row[i][1],
-				       qp->div->row[i][1], 1);
-		}
-		s = isl_upoly_from_affine(qp->dim->ctx, qp->div->row[i] + 1,
-					qp->div->row[i][0], qp->div->n_col - 1);
-		qp = substitute_div(qp, i, s);
-		if (!qp)
-			return NULL;
-	}
-
-	return qp;
-}
-
-/* Drop all floors in "pwqp", turning each integer division [a/m] into
- * a rational division a/m.
- */
-static __isl_give isl_pw_qpolynomial *pwqp_drop_floors(
-	__isl_take isl_pw_qpolynomial *pwqp)
-{
-	int i;
-
-	if (!pwqp)
-		return NULL;
-
-	if (isl_pw_qpolynomial_is_zero(pwqp))
-		return pwqp;
-
-	pwqp = isl_pw_qpolynomial_cow(pwqp);
-	if (!pwqp)
-		return NULL;
-
-	for (i = 0; i < pwqp->n; ++i) {
-		pwqp->p[i].qp = qp_drop_floors(pwqp->p[i].qp, 0);
-		if (!pwqp->p[i].qp)
-			goto error;
-	}
-
-	return pwqp;
-error:
-	isl_pw_qpolynomial_free(pwqp);
-	return NULL;
-}
-
-/* Adjust all the integer divisions in "qp" such that they are at least
- * one over the given orthant (identified by "signs").  This ensures
- * that they will still be non-negative even after subtracting (m-1)/m.
- *
- * In particular, f is replaced by f' + v, changing f = [a/m]
- * to f' = [(a - m v)/m].
- * If the constant term k in a is smaller than m,
- * the constant term of v is set to floor(k/m) - 1.
- * For any other term, if the coefficient c and the variable x have
- * the same sign, then no changes are needed.
- * Otherwise, if the variable is positive (and c is negative),
- * then the coefficient of x in v is set to floor(c/m).
- * If the variable is negative (and c is positive),
- * then the coefficient of x in v is set to ceil(c/m).
- */
-static __isl_give isl_qpolynomial *make_divs_pos(__isl_take isl_qpolynomial *qp,
-	int *signs)
-{
-	int i, j;
-	int total;
-	isl_vec *v = NULL;
-	struct isl_upoly *s;
-
-	qp = isl_qpolynomial_cow(qp);
-	if (!qp)
-		return NULL;
-	qp->div = isl_mat_cow(qp->div);
-	if (!qp->div)
-		goto error;
-
-	total = isl_space_dim(qp->dim, isl_dim_all);
-	v = isl_vec_alloc(qp->div->ctx, qp->div->n_col - 1);
-
-	for (i = 0; i < qp->div->n_row; ++i) {
-		isl_int *row = qp->div->row[i];
-		v = isl_vec_clr(v);
-		if (!v)
-			goto error;
-		if (isl_int_lt(row[1], row[0])) {
-			isl_int_fdiv_q(v->el[0], row[1], row[0]);
-			isl_int_sub_ui(v->el[0], v->el[0], 1);
-			isl_int_submul(row[1], row[0], v->el[0]);
-		}
-		for (j = 0; j < total; ++j) {
-			if (isl_int_sgn(row[2 + j]) * signs[j] >= 0)
-				continue;
-			if (signs[j] < 0)
-				isl_int_cdiv_q(v->el[1 + j], row[2 + j], row[0]);
-			else
-				isl_int_fdiv_q(v->el[1 + j], row[2 + j], row[0]);
-			isl_int_submul(row[2 + j], row[0], v->el[1 + j]);
-		}
-		for (j = 0; j < i; ++j) {
-			if (isl_int_sgn(row[2 + total + j]) >= 0)
-				continue;
-			isl_int_fdiv_q(v->el[1 + total + j],
-					row[2 + total + j], row[0]);
-			isl_int_submul(row[2 + total + j],
-					row[0], v->el[1 + total + j]);
-		}
-		for (j = i + 1; j < qp->div->n_row; ++j) {
-			if (isl_int_is_zero(qp->div->row[j][2 + total + i]))
-				continue;
-			isl_seq_combine(qp->div->row[j] + 1,
-				qp->div->ctx->one, qp->div->row[j] + 1,
-				qp->div->row[j][2 + total + i], v->el, v->size);
-		}
-		isl_int_set_si(v->el[1 + total + i], 1);
-		s = isl_upoly_from_affine(qp->dim->ctx, v->el,
-					qp->div->ctx->one, v->size);
-		qp->upoly = isl_upoly_subs(qp->upoly, total + i, 1, &s);
-		isl_upoly_free(s);
-		if (!qp->upoly)
-			goto error;
-	}
-
-	isl_vec_free(v);
-	return qp;
-error:
-	isl_vec_free(v);
-	isl_qpolynomial_free(qp);
-	return NULL;
-}
-
-struct isl_to_poly_data {
-	int sign;
-	isl_pw_qpolynomial *res;
-	isl_qpolynomial *qp;
-};
-
-/* Appoximate data->qp by a polynomial on the orthant identified by "signs".
- * We first make all integer divisions positive and then split the
- * quasipolynomials into terms with sign data->sign (the direction
- * of the requested approximation) and terms with the opposite sign.
- * In the first set of terms, each integer division [a/m] is
- * overapproximated by a/m, while in the second it is underapproximated
- * by (a-(m-1))/m.
- */
-static int to_polynomial_on_orthant(__isl_take isl_set *orthant, int *signs,
-	void *user)
-{
-	struct isl_to_poly_data *data = user;
-	isl_pw_qpolynomial *t;
-	isl_qpolynomial *qp, *up, *down;
-
-	qp = isl_qpolynomial_copy(data->qp);
-	qp = make_divs_pos(qp, signs);
-
-	up = isl_qpolynomial_terms_of_sign(qp, signs, data->sign);
-	up = qp_drop_floors(up, 0);
-	down = isl_qpolynomial_terms_of_sign(qp, signs, -data->sign);
-	down = qp_drop_floors(down, 1);
-
-	isl_qpolynomial_free(qp);
-	qp = isl_qpolynomial_add(up, down);
-
-	t = isl_pw_qpolynomial_alloc(orthant, qp);
-	data->res = isl_pw_qpolynomial_add_disjoint(data->res, t);
-
-	return 0;
-}
-
-/* Approximate each quasipolynomial by a polynomial.  If "sign" is positive,
- * the polynomial will be an overapproximation.  If "sign" is negative,
- * it will be an underapproximation.  If "sign" is zero, the approximation
- * will lie somewhere in between.
- *
- * In particular, is sign == 0, we simply drop the floors, turning
- * the integer divisions into rational divisions.
- * Otherwise, we split the domains into orthants, make all integer divisions
- * positive and then approximate each [a/m] by either a/m or (a-(m-1))/m,
- * depending on the requested sign and the sign of the term in which
- * the integer division appears.
- */
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_to_polynomial(
-	__isl_take isl_pw_qpolynomial *pwqp, int sign)
-{
-	int i;
-	struct isl_to_poly_data data;
-
-	if (sign == 0)
-		return pwqp_drop_floors(pwqp);
-
-	if (!pwqp)
-		return NULL;
-
-	data.sign = sign;
-	data.res = isl_pw_qpolynomial_zero(isl_pw_qpolynomial_get_space(pwqp));
-
-	for (i = 0; i < pwqp->n; ++i) {
-		if (pwqp->p[i].qp->div->n_row == 0) {
-			isl_pw_qpolynomial *t;
-			t = isl_pw_qpolynomial_alloc(
-					isl_set_copy(pwqp->p[i].set),
-					isl_qpolynomial_copy(pwqp->p[i].qp));
-			data.res = isl_pw_qpolynomial_add_disjoint(data.res, t);
-			continue;
-		}
-		data.qp = pwqp->p[i].qp;
-		if (isl_set_foreach_orthant(pwqp->p[i].set,
-					&to_polynomial_on_orthant, &data) < 0)
-			goto error;
-	}
-
-	isl_pw_qpolynomial_free(pwqp);
-
-	return data.res;
-error:
-	isl_pw_qpolynomial_free(pwqp);
-	isl_pw_qpolynomial_free(data.res);
-	return NULL;
-}
-
-static int poly_entry(void **entry, void *user)
-{
-	int *sign = user;
-	isl_pw_qpolynomial **pwqp = (isl_pw_qpolynomial **)entry;
-
-	*pwqp = isl_pw_qpolynomial_to_polynomial(*pwqp, *sign);
-
-	return *pwqp ? 0 : -1;
-}
-
-__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_to_polynomial(
-	__isl_take isl_union_pw_qpolynomial *upwqp, int sign)
-{
-	upwqp = isl_union_pw_qpolynomial_cow(upwqp);
-	if (!upwqp)
-		return NULL;
-
-	if (isl_hash_table_foreach(upwqp->dim->ctx, &upwqp->table,
-				   &poly_entry, &sign) < 0)
-		goto error;
-
-	return upwqp;
-error:
-	isl_union_pw_qpolynomial_free(upwqp);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_from_qpolynomial(
-	__isl_take isl_qpolynomial *qp)
-{
-	int i, k;
-	isl_space *dim;
-	isl_vec *aff = NULL;
-	isl_basic_map *bmap = NULL;
-	unsigned pos;
-	unsigned n_div;
-
-	if (!qp)
-		return NULL;
-	if (!isl_upoly_is_affine(qp->upoly))
-		isl_die(qp->dim->ctx, isl_error_invalid,
-			"input quasi-polynomial not affine", goto error);
-	aff = isl_qpolynomial_extract_affine(qp);
-	if (!aff)
-		goto error;
-	dim = isl_qpolynomial_get_space(qp);
-	pos = 1 + isl_space_offset(dim, isl_dim_out);
-	n_div = qp->div->n_row;
-	bmap = isl_basic_map_alloc_space(dim, n_div, 1, 2 * n_div);
-
-	for (i = 0; i < n_div; ++i) {
-		k = isl_basic_map_alloc_div(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(bmap->div[k], qp->div->row[i], qp->div->n_col);
-		isl_int_set_si(bmap->div[k][qp->div->n_col], 0);
-		if (isl_basic_map_add_div_constraints(bmap, k) < 0)
-			goto error;
-	}
-	k = isl_basic_map_alloc_equality(bmap);
-	if (k < 0)
-		goto error;
-	isl_int_neg(bmap->eq[k][pos], aff->el[0]);
-	isl_seq_cpy(bmap->eq[k], aff->el + 1, pos);
-	isl_seq_cpy(bmap->eq[k] + pos + 1, aff->el + 1 + pos, n_div);
-
-	isl_vec_free(aff);
-	isl_qpolynomial_free(qp);
-	bmap = isl_basic_map_finalize(bmap);
-	return bmap;
-error:
-	isl_vec_free(aff);
-	isl_qpolynomial_free(qp);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
diff --git a/cloog-0.17.0/isl/isl_polynomial_private.h b/cloog-0.17.0/isl/isl_polynomial_private.h
deleted file mode 100644
index 7370731..0000000
--- a/cloog-0.17.0/isl/isl_polynomial_private.h
+++ /dev/null
@@ -1,233 +0,0 @@
-#include <stdio.h>
-#include <isl/map.h>
-#include <isl/mat.h>
-#include <isl_morph.h>
-#include <isl/polynomial.h>
-#include <isl_reordering.h>
-
-struct isl_upoly {
-	int ref;
-	struct isl_ctx *ctx;
-
-	int var;
-};
-
-struct isl_upoly_cst {
-	struct isl_upoly up;
-	isl_int n;
-	isl_int d;
-};
-
-struct isl_upoly_rec {
-	struct isl_upoly up;
-	int n;
-
-	size_t size;
-	struct isl_upoly *p[];
-};
-
-/* dim represents the domain space.
- */
-struct isl_qpolynomial {
-	int ref;
-
-	isl_space *dim;
-	struct isl_mat *div;
-	struct isl_upoly *upoly;
-};
-
-struct isl_term {
-	int ref;
-
-	isl_int n;
-	isl_int d;
-
-	isl_space *dim;
-	struct isl_mat *div;
-
-	int pow[1];
-};
-
-struct isl_pw_qpolynomial_piece {
-	struct isl_set *set;
-	struct isl_qpolynomial *qp;
-};
-
-struct isl_pw_qpolynomial {
-	int ref;
-
-	isl_space *dim;
-
-	int n;
-
-	size_t size;
-	struct isl_pw_qpolynomial_piece p[1];
-};
-
-/* dim represents the domain space.
- */
-struct isl_qpolynomial_fold {
-	int ref;
-
-	enum isl_fold type;
-	isl_space *dim;
-
-	int n;
-
-	size_t size;
-	struct isl_qpolynomial *qp[1];
-};
-
-struct isl_pw_qpolynomial_fold_piece {
-	struct isl_set *set;
-	struct isl_qpolynomial_fold *fold;
-};
-
-struct isl_pw_qpolynomial_fold {
-	int ref;
-
-	enum isl_fold type;
-	isl_space *dim;
-
-	int n;
-
-	size_t size;
-	struct isl_pw_qpolynomial_fold_piece p[1];
-};
-
-__isl_give struct isl_upoly *isl_upoly_zero(struct isl_ctx *ctx);
-__isl_give struct isl_upoly *isl_upoly_copy(__isl_keep struct isl_upoly *up);
-__isl_give struct isl_upoly *isl_upoly_cow(__isl_take struct isl_upoly *up);
-__isl_give struct isl_upoly *isl_upoly_dup(__isl_keep struct isl_upoly *up);
-void isl_upoly_free(__isl_take struct isl_upoly *up);
-__isl_give struct isl_upoly *isl_upoly_mul(__isl_take struct isl_upoly *up1,
-	__isl_take struct isl_upoly *up2);
-
-int isl_upoly_is_cst(__isl_keep struct isl_upoly *up);
-int isl_upoly_is_zero(__isl_keep struct isl_upoly *up);
-int isl_upoly_is_one(__isl_keep struct isl_upoly *up);
-int isl_upoly_is_negone(__isl_keep struct isl_upoly *up);
-__isl_keep struct isl_upoly_cst *isl_upoly_as_cst(__isl_keep struct isl_upoly *up);
-__isl_keep struct isl_upoly_rec *isl_upoly_as_rec(__isl_keep struct isl_upoly *up);
-
-__isl_give struct isl_upoly *isl_upoly_sum(__isl_take struct isl_upoly *up1,
-	__isl_take struct isl_upoly *up2);
-__isl_give struct isl_upoly *isl_upoly_mul_isl_int(
-	__isl_take struct isl_upoly *up, isl_int v);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_alloc(__isl_take isl_space *dim,
-	unsigned n_div, __isl_take struct isl_upoly *up);
-__isl_give isl_qpolynomial *isl_qpolynomial_cow(__isl_take isl_qpolynomial *qp);
-__isl_give isl_qpolynomial *isl_qpolynomial_dup(__isl_keep isl_qpolynomial *qp);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_cst_on_domain(__isl_take isl_space *dim,
-	isl_int v);
-__isl_give isl_qpolynomial *isl_qpolynomial_var_pow_on_domain(__isl_take isl_space *dim,
-	int pos, int power);
-int isl_qpolynomial_is_one(__isl_keep isl_qpolynomial *qp);
-int isl_qpolynomial_is_affine(__isl_keep isl_qpolynomial *qp);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_add_on_domain(
-	__isl_keep isl_set *dom,
-	__isl_take isl_qpolynomial *qp1,
-	__isl_take isl_qpolynomial *qp2);
-
-int isl_qpolynomial_le_cst(__isl_keep isl_qpolynomial *qp1,
-	__isl_keep isl_qpolynomial *qp2);
-__isl_give isl_qpolynomial *isl_qpolynomial_max_cst(
-	__isl_take isl_qpolynomial *qp1, __isl_take isl_qpolynomial *qp2);
-__isl_give isl_qpolynomial *isl_qpolynomial_min_cst(
-	__isl_take isl_qpolynomial *qp1, __isl_take isl_qpolynomial *qp2);
-
-int isl_qpolynomial_degree(__isl_keep isl_qpolynomial *poly);
-__isl_give isl_qpolynomial *isl_qpolynomial_coeff(
-	__isl_keep isl_qpolynomial *poly,
-	enum isl_dim_type type, unsigned pos, int deg);
-
-__isl_give isl_vec *isl_qpolynomial_extract_affine(
-	__isl_keep isl_qpolynomial *qp);
-__isl_give isl_qpolynomial *isl_qpolynomial_from_affine(__isl_take isl_space *dim,
-	isl_int *f, isl_int denom);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_cow(
-	__isl_take isl_pw_qpolynomial *pwqp);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add_piece(
-	__isl_take isl_pw_qpolynomial *pwqp,
-	__isl_take isl_set *set, __isl_take isl_qpolynomial *qp);
-int isl_pw_qpolynomial_is_one(__isl_keep isl_pw_qpolynomial *pwqp);
-
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_project_out(
-	__isl_take isl_pw_qpolynomial *pwqp,
-	enum isl_dim_type type, unsigned first, unsigned n);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_opt_on_domain(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_set *set, int max);
-
-enum isl_fold isl_fold_type_negate(enum isl_fold type);
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_cow(
-	__isl_take isl_qpolynomial_fold *fold);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_dup(
-	__isl_keep isl_qpolynomial_fold *fold);
-
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_cow(
-	__isl_take isl_pw_qpolynomial_fold *pwf);
-
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_add_on_domain(
-	__isl_keep isl_set *set,
-	__isl_take isl_qpolynomial_fold *fold1,
-	__isl_take isl_qpolynomial_fold *fold2);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_fold_on_domain(
-	__isl_keep isl_set *set,
-	__isl_take isl_qpolynomial_fold *fold1,
-	__isl_take isl_qpolynomial_fold *fold2);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_fold_opt_on_domain(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_set *set, int max);
-
-int isl_pw_qpolynomial_fold_covers(__isl_keep isl_pw_qpolynomial_fold *pwf1,
-	__isl_keep isl_pw_qpolynomial_fold *pwf2);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_morph_domain(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_morph *morph);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_morph_domain(
-	__isl_take isl_pw_qpolynomial *pwqp, __isl_take isl_morph *morph);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_morph_domain(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_morph *morph);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_morph_domain(
-	__isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_morph *morph);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_lift(__isl_take isl_qpolynomial *qp,
-	__isl_take isl_space *dim);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_lift(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_space *dim);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_substitute_equalities(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_basic_set *eq);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_substitute_equalities(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_basic_set *eq);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_gist(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_set *context);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_realign_domain(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_reordering *r);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_realign_domain(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_reordering *r);
-__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_realign_domain(
-	__isl_take isl_pw_qpolynomial *pwqp, __isl_take isl_reordering *r);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_realign_domain(
-	__isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_reordering *r);
-
-__isl_give isl_qpolynomial *isl_qpolynomial_reset_domain_space(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_space *dim);
-__isl_give isl_qpolynomial *isl_qpolynomial_reset_space_and_domain(
-	__isl_take isl_qpolynomial *qp, __isl_take isl_space *space,
-	__isl_take isl_space *domain);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_reset_domain_space(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_space *dim);
-__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_reset_space_and_domain(
-	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_space *space,
-	__isl_take isl_space *domain);
-__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_reset_domain_space(
-	__isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_space *dim);
diff --git a/cloog-0.17.0/isl/isl_printer.c b/cloog-0.17.0/isl/isl_printer.c
deleted file mode 100644
index ae7596d..0000000
--- a/cloog-0.17.0/isl/isl_printer.c
+++ /dev/null
@@ -1,367 +0,0 @@
-#include <string.h>
-#include <isl_printer_private.h>
-
-static __isl_give isl_printer *file_start_line(__isl_take isl_printer *p)
-{
-	fprintf(p->file, "%*s%s", p->indent, "", p->prefix ? p->prefix : "");
-	return p;
-}
-
-static __isl_give isl_printer *file_end_line(__isl_take isl_printer *p)
-{
-	fprintf(p->file, "%s\n", p->suffix ? p->suffix : "");
-	return p;
-}
-
-static __isl_give isl_printer *file_flush(__isl_take isl_printer *p)
-{
-	fflush(p->file);
-	return p;
-}
-
-static __isl_give isl_printer *file_print_str(__isl_take isl_printer *p,
-	const char *s)
-{
-	fprintf(p->file, "%s", s);
-	return p;
-}
-
-static __isl_give isl_printer *file_print_int(__isl_take isl_printer *p, int i)
-{
-	fprintf(p->file, "%d", i);
-	return p;
-}
-
-static __isl_give isl_printer *file_print_isl_int(__isl_take isl_printer *p, isl_int i)
-{
-	isl_int_print(p->file, i, p->width);
-	return p;
-}
-
-static int grow_buf(__isl_keep isl_printer *p, int extra)
-{
-	int new_size;
-	char *new_buf;
-
-	if (p->buf_size == 0)
-		return -1;
-
-	new_size = ((p->buf_n + extra + 1) * 3) / 2;
-	new_buf = isl_realloc_array(p->ctx, p->buf, char, new_size);
-	if (!new_buf) {
-		p->buf_size = 0;
-		return -1;
-	}
-	p->buf = new_buf;
-	p->buf_size = new_size;
-
-	return 0;
-}
-
-static __isl_give isl_printer *str_print(__isl_take isl_printer *p,
-	const char *s, int len)
-{
-	if (p->buf_n + len + 1 >= p->buf_size && grow_buf(p, len))
-		goto error;
-	memcpy(p->buf + p->buf_n, s, len);
-	p->buf_n += len;
-
-	p->buf[p->buf_n] = '\0';
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *str_print_indent(__isl_take isl_printer *p,
-	int indent)
-{
-	int i;
-
-	if (p->buf_n + indent + 1 >= p->buf_size && grow_buf(p, indent))
-		goto error;
-	for (i = 0; i < indent; ++i)
-		p->buf[p->buf_n++] = ' ';
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *str_start_line(__isl_take isl_printer *p)
-{
-	p = str_print_indent(p, p->indent);
-	if (p->prefix)
-		p = str_print(p, p->prefix, strlen(p->prefix));
-	return p;
-}
-
-static __isl_give isl_printer *str_end_line(__isl_take isl_printer *p)
-{
-	if (p->suffix)
-		p = str_print(p, p->suffix, strlen(p->suffix));
-	p = str_print(p, "\n", strlen("\n"));
-	return p;
-}
-
-static __isl_give isl_printer *str_flush(__isl_take isl_printer *p)
-{
-	p->buf_n = 0;
-	return p;
-}
-
-static __isl_give isl_printer *str_print_str(__isl_take isl_printer *p,
-	const char *s)
-{
-	return str_print(p, s, strlen(s));
-}
-
-static __isl_give isl_printer *str_print_int(__isl_take isl_printer *p, int i)
-{
-	int left = p->buf_size - p->buf_n;
-	int need = snprintf(p->buf + p->buf_n, left, "%d", i);
-	if (need >= left) {
-		if (grow_buf(p, need))
-			goto error;
-		left = p->buf_size - p->buf_n;
-		need = snprintf(p->buf + p->buf_n, left, "%d", i);
-	}
-	p->buf_n += need;
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-static __isl_give isl_printer *str_print_isl_int(__isl_take isl_printer *p,
-	isl_int i)
-{
-	char *s;
-	int len;
-	isl_int_print_gmp_free_t gmp_free;
-
-	s = isl_int_get_str(i);
-	len = strlen(s);
-	if (len < p->width)
-		p = str_print_indent(p, p->width - len);
-	p = str_print(p, s, len);
-	mp_get_memory_functions(NULL, NULL, &gmp_free);
-	(*gmp_free)(s, len + 1);
-	return p;
-}
-
-struct isl_printer_ops {
-	__isl_give isl_printer *(*start_line)(__isl_take isl_printer *p);
-	__isl_give isl_printer *(*end_line)(__isl_take isl_printer *p);
-	__isl_give isl_printer *(*print_int)(__isl_take isl_printer *p, int i);
-	__isl_give isl_printer *(*print_isl_int)(__isl_take isl_printer *p,
-						isl_int i);
-	__isl_give isl_printer *(*print_str)(__isl_take isl_printer *p,
-						const char *s);
-	__isl_give isl_printer *(*flush)(__isl_take isl_printer *p);
-};
-
-static struct isl_printer_ops file_ops = {
-	file_start_line,
-	file_end_line,
-	file_print_int,
-	file_print_isl_int,
-	file_print_str,
-	file_flush
-};
-
-static struct isl_printer_ops str_ops = {
-	str_start_line,
-	str_end_line,
-	str_print_int,
-	str_print_isl_int,
-	str_print_str,
-	str_flush
-};
-
-__isl_give isl_printer *isl_printer_to_file(isl_ctx *ctx, FILE *file)
-{
-	struct isl_printer *p = isl_alloc_type(ctx, struct isl_printer);
-	if (!p)
-		return NULL;
-	p->ctx = ctx;
-	isl_ctx_ref(p->ctx);
-	p->ops = &file_ops;
-	p->file = file;
-	p->buf = NULL;
-	p->buf_n = 0;
-	p->buf_size = 0;
-	p->indent = 0;
-	p->output_format = ISL_FORMAT_ISL;
-	p->prefix = NULL;
-	p->suffix = NULL;
-	p->width = 0;
-
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_to_str(isl_ctx *ctx)
-{
-	struct isl_printer *p = isl_alloc_type(ctx, struct isl_printer);
-	if (!p)
-		return NULL;
-	p->ctx = ctx;
-	isl_ctx_ref(p->ctx);
-	p->ops = &str_ops;
-	p->file = NULL;
-	p->buf = isl_alloc_array(ctx, char, 256);
-	if (!p->buf)
-		goto error;
-	p->buf_n = 0;
-	p->buf[0] = '\0';
-	p->buf_size = 256;
-	p->indent = 0;
-	p->output_format = ISL_FORMAT_ISL;
-	p->prefix = NULL;
-	p->suffix = NULL;
-	p->width = 0;
-
-	return p;
-error:
-	isl_printer_free(p);
-	return NULL;
-}
-
-void isl_printer_free(__isl_take isl_printer *p)
-{
-	if (!p)
-		return;
-	free(p->buf);
-	isl_ctx_deref(p->ctx);
-	free(p);
-}
-
-isl_ctx *isl_printer_get_ctx(__isl_keep isl_printer *printer)
-{
-	return printer ? printer->ctx : NULL;
-}
-
-__isl_give isl_printer *isl_printer_set_isl_int_width(__isl_take isl_printer *p,
-	int width)
-{
-	if (!p)
-		return NULL;
-
-	p->width = width;
-
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_set_indent(__isl_take isl_printer *p,
-	int indent)
-{
-	if (!p)
-		return NULL;
-
-	p->indent = indent;
-
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_indent(__isl_take isl_printer *p,
-	int indent)
-{
-	if (!p)
-		return NULL;
-
-	p->indent += indent;
-	if (p->indent < 0)
-		p->indent = 0;
-
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_set_prefix(__isl_take isl_printer *p,
-	const char *prefix)
-{
-	if (!p)
-		return NULL;
-
-	p->prefix = prefix;
-
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_set_suffix(__isl_take isl_printer *p,
-	const char *suffix)
-{
-	if (!p)
-		return NULL;
-
-	p->suffix = suffix;
-
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_set_output_format(__isl_take isl_printer *p,
-	int output_format)
-{
-	if (!p)
-		return NULL;
-
-	p->output_format = output_format;
-
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_print_str(__isl_take isl_printer *p,
-	const char *s)
-{
-	if (!p)
-		return NULL;
-
-	return p->ops->print_str(p, s);
-}
-
-__isl_give isl_printer *isl_printer_print_int(__isl_take isl_printer *p, int i)
-{
-	if (!p)
-		return NULL;
-
-	return p->ops->print_int(p, i);
-}
-
-__isl_give isl_printer *isl_printer_print_isl_int(__isl_take isl_printer *p,
-	isl_int i)
-{
-	if (!p)
-		return NULL;
-
-	return p->ops->print_isl_int(p, i);
-}
-
-__isl_give isl_printer *isl_printer_start_line(__isl_take isl_printer *p)
-{
-	if (!p)
-		return NULL;
-
-	return p->ops->start_line(p);
-}
-
-__isl_give isl_printer *isl_printer_end_line(__isl_take isl_printer *p)
-{
-	if (!p)
-		return NULL;
-
-	return p->ops->end_line(p);
-}
-
-char *isl_printer_get_str(__isl_keep isl_printer *printer)
-{
-	if (!printer || !printer->buf)
-		return NULL;
-	return strdup(printer->buf);
-}
-
-__isl_give isl_printer *isl_printer_flush(__isl_take isl_printer *p)
-{
-	if (!p)
-		return NULL;
-
-	return p->ops->flush(p);
-}
diff --git a/cloog-0.17.0/isl/isl_printer_private.h b/cloog-0.17.0/isl/isl_printer_private.h
deleted file mode 100644
index 9d76808..0000000
--- a/cloog-0.17.0/isl/isl_printer_private.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <isl/printer.h>
-
-struct isl_printer_ops;
-
-struct isl_printer {
-	struct isl_ctx	*ctx;
-	struct isl_printer_ops *ops;
-	FILE        	*file;
-	int		buf_n;
-	int		buf_size;
-	char		*buf;
-	int		indent;
-	int		output_format;
-	const char	*prefix;
-	const char	*suffix;
-	int		width;
-};
diff --git a/cloog-0.17.0/isl/isl_pw_templ.c b/cloog-0.17.0/isl/isl_pw_templ.c
deleted file mode 100644
index 65bdf46..0000000
--- a/cloog-0.17.0/isl/isl_pw_templ.c
+++ /dev/null
@@ -1,1570 +0,0 @@
-#define xFN(TYPE,NAME) TYPE ## _ ## NAME
-#define FN(TYPE,NAME) xFN(TYPE,NAME)
-#define xS(TYPE,NAME) struct TYPE ## _ ## NAME
-#define S(TYPE,NAME) xS(TYPE,NAME)
-
-#ifdef HAS_TYPE
-__isl_give PW *FN(PW,alloc_size)(__isl_take isl_space *dim,
-	enum isl_fold type, int n)
-#else
-__isl_give PW *FN(PW,alloc_size)(__isl_take isl_space *dim, int n)
-#endif
-{
-	isl_ctx *ctx;
-	struct PW *pw;
-
-	if (!dim)
-		return NULL;
-	ctx = isl_space_get_ctx(dim);
-	isl_assert(ctx, n >= 0, goto error);
-	pw = isl_alloc(ctx, struct PW,
-			sizeof(struct PW) + (n - 1) * sizeof(S(PW,piece)));
-	if (!pw)
-		goto error;
-
-	pw->ref = 1;
-#ifdef HAS_TYPE
-	pw->type = type;
-#endif
-	pw->size = n;
-	pw->n = 0;
-	pw->dim = dim;
-	return pw;
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-#ifdef HAS_TYPE
-__isl_give PW *FN(PW,ZERO)(__isl_take isl_space *dim, enum isl_fold type)
-{
-	return FN(PW,alloc_size)(dim, type, 0);
-}
-#else
-__isl_give PW *FN(PW,ZERO)(__isl_take isl_space *dim)
-{
-	return FN(PW,alloc_size)(dim, 0);
-}
-#endif
-
-__isl_give PW *FN(PW,add_piece)(__isl_take PW *pw,
-	__isl_take isl_set *set, __isl_take EL *el)
-{
-	isl_ctx *ctx;
-	isl_space *el_dim = NULL;
-
-	if (!pw || !set || !el)
-		goto error;
-
-	if (isl_set_plain_is_empty(set) || FN(EL,EL_IS_ZERO)(el)) {
-		isl_set_free(set);
-		FN(EL,free)(el);
-		return pw;
-	}
-
-	ctx = isl_set_get_ctx(set);
-#ifdef HAS_TYPE
-	if (pw->type != el->type)
-		isl_die(ctx, isl_error_invalid, "fold types don't match",
-			goto error);
-#endif
-	el_dim = FN(EL,get_space(el));
-	isl_assert(ctx, isl_space_is_equal(pw->dim, el_dim), goto error);
-	isl_assert(ctx, pw->n < pw->size, goto error);
-
-	pw->p[pw->n].set = set;
-	pw->p[pw->n].FIELD = el;
-	pw->n++;
-	
-	isl_space_free(el_dim);
-	return pw;
-error:
-	isl_space_free(el_dim);
-	FN(PW,free)(pw);
-	isl_set_free(set);
-	FN(EL,free)(el);
-	return NULL;
-}
-
-#ifdef HAS_TYPE
-__isl_give PW *FN(PW,alloc)(enum isl_fold type,
-	__isl_take isl_set *set, __isl_take EL *el)
-#else
-__isl_give PW *FN(PW,alloc)(__isl_take isl_set *set, __isl_take EL *el)
-#endif
-{
-	PW *pw;
-
-	if (!set || !el)
-		goto error;
-
-#ifdef HAS_TYPE
-	pw = FN(PW,alloc_size)(FN(EL,get_space)(el), type, 1);
-#else
-	pw = FN(PW,alloc_size)(FN(EL,get_space)(el), 1);
-#endif
-
-	return FN(PW,add_piece)(pw, set, el);
-error:
-	isl_set_free(set);
-	FN(EL,free)(el);
-	return NULL;
-}
-
-__isl_give PW *FN(PW,dup)(__isl_keep PW *pw)
-{
-	int i;
-	PW *dup;
-
-	if (!pw)
-		return NULL;
-
-#ifdef HAS_TYPE
-	dup = FN(PW,alloc_size)(isl_space_copy(pw->dim), pw->type, pw->n);
-#else
-	dup = FN(PW,alloc_size)(isl_space_copy(pw->dim), pw->n);
-#endif
-	if (!dup)
-		return NULL;
-
-	for (i = 0; i < pw->n; ++i)
-		dup = FN(PW,add_piece)(dup, isl_set_copy(pw->p[i].set),
-					    FN(EL,copy)(pw->p[i].FIELD));
-
-	return dup;
-}
-
-__isl_give PW *FN(PW,cow)(__isl_take PW *pw)
-{
-	if (!pw)
-		return NULL;
-
-	if (pw->ref == 1)
-		return pw;
-	pw->ref--;
-	return FN(PW,dup)(pw);
-}
-
-__isl_give PW *FN(PW,copy)(__isl_keep PW *pw)
-{
-	if (!pw)
-		return NULL;
-
-	pw->ref++;
-	return pw;
-}
-
-void *FN(PW,free)(__isl_take PW *pw)
-{
-	int i;
-
-	if (!pw)
-		return NULL;
-	if (--pw->ref > 0)
-		return NULL;
-
-	for (i = 0; i < pw->n; ++i) {
-		isl_set_free(pw->p[i].set);
-		FN(EL,free)(pw->p[i].FIELD);
-	}
-	isl_space_free(pw->dim);
-	free(pw);
-
-	return NULL;
-}
-
-const char *FN(PW,get_dim_name)(__isl_keep PW *pw, enum isl_dim_type type,
-	unsigned pos)
-{
-	return pw ? isl_space_get_dim_name(pw->dim, type, pos) : NULL;
-}
-
-int FN(PW,has_dim_id)(__isl_keep PW *pw, enum isl_dim_type type, unsigned pos)
-{
-	return pw ? isl_space_has_dim_id(pw->dim, type, pos) : -1;
-}
-
-__isl_give isl_id *FN(PW,get_dim_id)(__isl_keep PW *pw, enum isl_dim_type type,
-	unsigned pos)
-{
-	return pw ? isl_space_get_dim_id(pw->dim, type, pos) : NULL;
-}
-
-const char *FN(PW,get_tuple_name)(__isl_keep PW *pw, enum isl_dim_type type)
-{
-	return pw ? isl_space_get_tuple_name(pw->dim, type) : NULL;
-}
-
-int FN(PW,has_tuple_id)(__isl_keep PW *pw, enum isl_dim_type type)
-{
-	return pw ? isl_space_has_tuple_id(pw->dim, type) : -1;
-}
-
-__isl_give isl_id *FN(PW,get_tuple_id)(__isl_keep PW *pw, enum isl_dim_type type)
-{
-	return pw ? isl_space_get_tuple_id(pw->dim, type) : NULL;
-}
-
-int FN(PW,IS_ZERO)(__isl_keep PW *pw)
-{
-	if (!pw)
-		return -1;
-
-	return pw->n == 0;
-}
-
-#ifndef NO_REALIGN
-__isl_give PW *FN(PW,realign_domain)(__isl_take PW *pw,
-	__isl_take isl_reordering *exp)
-{
-	int i;
-
-	pw = FN(PW,cow)(pw);
-	if (!pw || !exp)
-		return NULL;
-
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].set = isl_set_realign(pw->p[i].set,
-						    isl_reordering_copy(exp));
-		if (!pw->p[i].set)
-			goto error;
-		pw->p[i].FIELD = FN(EL,realign_domain)(pw->p[i].FIELD,
-						    isl_reordering_copy(exp));
-		if (!pw->p[i].FIELD)
-			goto error;
-	}
-
-	pw = FN(PW,reset_domain_space)(pw, isl_space_copy(exp->dim));
-
-	isl_reordering_free(exp);
-	return pw;
-error:
-	isl_reordering_free(exp);
-	FN(PW,free)(pw);
-	return NULL;
-}
-
-/* Align the parameters of "pw" to those of "model".
- */
-__isl_give PW *FN(PW,align_params)(__isl_take PW *pw, __isl_take isl_space *model)
-{
-	isl_ctx *ctx;
-
-	if (!pw || !model)
-		goto error;
-
-	ctx = isl_space_get_ctx(model);
-	if (!isl_space_has_named_params(model))
-		isl_die(ctx, isl_error_invalid,
-			"model has unnamed parameters", goto error);
-	if (!isl_space_has_named_params(pw->dim))
-		isl_die(ctx, isl_error_invalid,
-			"input has unnamed parameters", goto error);
-	if (!isl_space_match(pw->dim, isl_dim_param, model, isl_dim_param)) {
-		isl_reordering *exp;
-
-		model = isl_space_drop_dims(model, isl_dim_in,
-					0, isl_space_dim(model, isl_dim_in));
-		model = isl_space_drop_dims(model, isl_dim_out,
-					0, isl_space_dim(model, isl_dim_out));
-		exp = isl_parameter_alignment_reordering(pw->dim, model);
-		exp = isl_reordering_extend_space(exp,
-					FN(PW,get_domain_space)(pw));
-		pw = FN(PW,realign_domain)(pw, exp);
-	}
-
-	isl_space_free(model);
-	return pw;
-error:
-	isl_space_free(model);
-	FN(PW,free)(pw);
-	return NULL;
-}
-
-static __isl_give PW *FN(PW,align_params_pw_pw_and)(__isl_take PW *pw1,
-	__isl_take PW *pw2,
-	__isl_give PW *(*fn)(__isl_take PW *pw1, __isl_take PW *pw2))
-{
-	isl_ctx *ctx;
-
-	if (!pw1 || !pw2)
-		goto error;
-	if (isl_space_match(pw1->dim, isl_dim_param, pw2->dim, isl_dim_param))
-		return fn(pw1, pw2);
-	ctx = FN(PW,get_ctx)(pw1);
-	if (!isl_space_has_named_params(pw1->dim) ||
-	    !isl_space_has_named_params(pw2->dim))
-		isl_die(ctx, isl_error_invalid,
-			"unaligned unnamed parameters", goto error);
-	pw1 = FN(PW,align_params)(pw1, FN(PW,get_space)(pw2));
-	pw2 = FN(PW,align_params)(pw2, FN(PW,get_space)(pw1));
-	return fn(pw1, pw2);
-error:
-	FN(PW,free)(pw1);
-	FN(PW,free)(pw2);
-	return NULL;
-}
-
-static __isl_give PW *FN(PW,align_params_pw_set_and)(__isl_take PW *pw,
-	__isl_take isl_set *set,
-	__isl_give PW *(*fn)(__isl_take PW *pw, __isl_take isl_set *set))
-{
-	isl_ctx *ctx;
-
-	if (!pw || !set)
-		goto error;
-	if (isl_space_match(pw->dim, isl_dim_param, set->dim, isl_dim_param))
-		return fn(pw, set);
-	ctx = FN(PW,get_ctx)(pw);
-	if (!isl_space_has_named_params(pw->dim) ||
-	    !isl_space_has_named_params(set->dim))
-		isl_die(ctx, isl_error_invalid,
-			"unaligned unnamed parameters", goto error);
-	pw = FN(PW,align_params)(pw, isl_set_get_space(set));
-	set = isl_set_align_params(set, FN(PW,get_space)(pw));
-	return fn(pw, set);
-error:
-	FN(PW,free)(pw);
-	isl_set_free(set);
-	return NULL;
-}
-#endif
-
-static __isl_give PW *FN(PW,union_add_aligned)(__isl_take PW *pw1,
-	__isl_take PW *pw2)
-{
-	int i, j, n;
-	struct PW *res;
-	isl_ctx *ctx;
-	isl_set *set;
-
-	if (!pw1 || !pw2)
-		goto error;
-
-	ctx = isl_space_get_ctx(pw1->dim);
-#ifdef HAS_TYPE
-	if (pw1->type != pw2->type)
-		isl_die(ctx, isl_error_invalid,
-			"fold types don't match", goto error);
-#endif
-	isl_assert(ctx, isl_space_is_equal(pw1->dim, pw2->dim), goto error);
-
-	if (FN(PW,IS_ZERO)(pw1)) {
-		FN(PW,free)(pw1);
-		return pw2;
-	}
-
-	if (FN(PW,IS_ZERO)(pw2)) {
-		FN(PW,free)(pw2);
-		return pw1;
-	}
-
-	n = (pw1->n + 1) * (pw2->n + 1);
-#ifdef HAS_TYPE
-	res = FN(PW,alloc_size)(isl_space_copy(pw1->dim), pw1->type, n);
-#else
-	res = FN(PW,alloc_size)(isl_space_copy(pw1->dim), n);
-#endif
-
-	for (i = 0; i < pw1->n; ++i) {
-		set = isl_set_copy(pw1->p[i].set);
-		for (j = 0; j < pw2->n; ++j) {
-			struct isl_set *common;
-			EL *sum;
-			set = isl_set_subtract(set,
-					isl_set_copy(pw2->p[j].set));
-			common = isl_set_intersect(isl_set_copy(pw1->p[i].set),
-						isl_set_copy(pw2->p[j].set));
-			if (isl_set_plain_is_empty(common)) {
-				isl_set_free(common);
-				continue;
-			}
-
-			sum = FN(EL,add_on_domain)(common,
-						   FN(EL,copy)(pw1->p[i].FIELD),
-						   FN(EL,copy)(pw2->p[j].FIELD));
-
-			res = FN(PW,add_piece)(res, common, sum);
-		}
-		res = FN(PW,add_piece)(res, set, FN(EL,copy)(pw1->p[i].FIELD));
-	}
-
-	for (j = 0; j < pw2->n; ++j) {
-		set = isl_set_copy(pw2->p[j].set);
-		for (i = 0; i < pw1->n; ++i)
-			set = isl_set_subtract(set,
-					isl_set_copy(pw1->p[i].set));
-		res = FN(PW,add_piece)(res, set, FN(EL,copy)(pw2->p[j].FIELD));
-	}
-
-	FN(PW,free)(pw1);
-	FN(PW,free)(pw2);
-
-	return res;
-error:
-	FN(PW,free)(pw1);
-	FN(PW,free)(pw2);
-	return NULL;
-}
-
-/* Private version of "union_add".  For isl_pw_qpolynomial and
- * isl_pw_qpolynomial_fold, we prefer to simply call it "add".
- */
-static __isl_give PW *FN(PW,union_add_)(__isl_take PW *pw1, __isl_take PW *pw2)
-{
-	return FN(PW,align_params_pw_pw_and)(pw1, pw2,
-						&FN(PW,union_add_aligned));
-}
-
-/* Make sure "pw" has room for at least "n" more pieces.
- *
- * If there is only one reference to pw, we extend it in place.
- * Otherwise, we create a new PW and copy the pieces.
- */
-static __isl_give PW *FN(PW,grow)(__isl_take PW *pw, int n)
-{
-	int i;
-	isl_ctx *ctx;
-	PW *res;
-
-	if (!pw)
-		return NULL;
-	if (pw->n + n <= pw->size)
-		return pw;
-	ctx = FN(PW,get_ctx)(pw);
-	n += pw->n;
-	if (pw->ref == 1) {
-		res = isl_realloc(ctx, pw, struct PW,
-			    sizeof(struct PW) + (n - 1) * sizeof(S(PW,piece)));
-		if (!res)
-			return FN(PW,free)(pw);
-		res->size = n;
-		return res;
-	}
-#ifdef HAS_TYPE
-	res = FN(PW,alloc_size)(isl_space_copy(pw->dim), pw->type, n);
-#else
-	res = FN(PW,alloc_size)(isl_space_copy(pw->dim), n);
-#endif
-	if (!res)
-		return FN(PW,free)(pw);
-	for (i = 0; i < pw->n; ++i)
-		res = FN(PW,add_piece)(res, isl_set_copy(pw->p[i].set),
-					    FN(EL,copy)(pw->p[i].FIELD));
-	FN(PW,free)(pw);
-	return res;
-}
-
-static __isl_give PW *FN(PW,add_disjoint_aligned)(__isl_take PW *pw1,
-	__isl_take PW *pw2)
-{
-	int i;
-	isl_ctx *ctx;
-
-	if (!pw1 || !pw2)
-		goto error;
-
-	if (pw1->size < pw1->n + pw2->n && pw1->n < pw2->n)
-		return FN(PW,add_disjoint_aligned)(pw2, pw1);
-
-	ctx = isl_space_get_ctx(pw1->dim);
-#ifdef HAS_TYPE
-	if (pw1->type != pw2->type)
-		isl_die(ctx, isl_error_invalid,
-			"fold types don't match", goto error);
-#endif
-	isl_assert(ctx, isl_space_is_equal(pw1->dim, pw2->dim), goto error);
-
-	if (FN(PW,IS_ZERO)(pw1)) {
-		FN(PW,free)(pw1);
-		return pw2;
-	}
-
-	if (FN(PW,IS_ZERO)(pw2)) {
-		FN(PW,free)(pw2);
-		return pw1;
-	}
-
-	pw1 = FN(PW,grow)(pw1, pw2->n);
-	if (!pw1)
-		goto error;
-
-	for (i = 0; i < pw2->n; ++i)
-		pw1 = FN(PW,add_piece)(pw1,
-				isl_set_copy(pw2->p[i].set),
-				FN(EL,copy)(pw2->p[i].FIELD));
-
-	FN(PW,free)(pw2);
-
-	return pw1;
-error:
-	FN(PW,free)(pw1);
-	FN(PW,free)(pw2);
-	return NULL;
-}
-
-__isl_give PW *FN(PW,add_disjoint)(__isl_take PW *pw1, __isl_take PW *pw2)
-{
-	return FN(PW,align_params_pw_pw_and)(pw1, pw2,
-						&FN(PW,add_disjoint_aligned));
-}
-
-/* This function is currently only used from isl_aff.c
- */
-static __isl_give PW *FN(PW,on_shared_domain)(__isl_take PW *pw1,
-	__isl_take PW *pw2,
-	__isl_give EL *(*fn)(__isl_take EL *el1, __isl_take EL *el2))
-	__attribute__ ((unused));
-
-/* Apply "fn" to pairs of elements from pw1 and pw2 on shared domains.
- */
-static __isl_give PW *FN(PW,on_shared_domain)(__isl_take PW *pw1,
-	__isl_take PW *pw2,
-	__isl_give EL *(*fn)(__isl_take EL *el1, __isl_take EL *el2))
-{
-	int i, j, n;
-	PW *res;
-
-	if (!pw1 || !pw2)
-		goto error;
-
-	n = pw1->n * pw2->n;
-#ifdef HAS_TYPE
-	res = FN(PW,alloc_size)(isl_space_copy(pw1->dim), pw1->type, n);
-#else
-	res = FN(PW,alloc_size)(isl_space_copy(pw1->dim), n);
-#endif
-
-	for (i = 0; i < pw1->n; ++i) {
-		for (j = 0; j < pw2->n; ++j) {
-			isl_set *common;
-			EL *res_ij;
-			common = isl_set_intersect(
-					isl_set_copy(pw1->p[i].set),
-					isl_set_copy(pw2->p[j].set));
-			if (isl_set_plain_is_empty(common)) {
-				isl_set_free(common);
-				continue;
-			}
-
-			res_ij = fn(FN(EL,copy)(pw1->p[i].FIELD),
-				    FN(EL,copy)(pw2->p[j].FIELD));
-
-			res = FN(PW,add_piece)(res, common, res_ij);
-		}
-	}
-
-	FN(PW,free)(pw1);
-	FN(PW,free)(pw2);
-	return res;
-error:
-	FN(PW,free)(pw1);
-	FN(PW,free)(pw2);
-	return NULL;
-}
-
-#ifndef NO_NEG
-__isl_give PW *FN(PW,neg)(__isl_take PW *pw)
-{
-	int i;
-
-	if (!pw)
-		return NULL;
-
-	if (FN(PW,IS_ZERO)(pw))
-		return pw;
-
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		return NULL;
-
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].FIELD = FN(EL,neg)(pw->p[i].FIELD);
-		if (!pw->p[i].FIELD)
-			return FN(PW,free)(pw);
-	}
-
-	return pw;
-}
-
-__isl_give PW *FN(PW,sub)(__isl_take PW *pw1, __isl_take PW *pw2)
-{
-	return FN(PW,add)(pw1, FN(PW,neg)(pw2));
-}
-#endif
-
-#ifndef NO_EVAL
-__isl_give isl_qpolynomial *FN(PW,eval)(__isl_take PW *pw,
-	__isl_take isl_point *pnt)
-{
-	int i;
-	int found = 0;
-	isl_ctx *ctx;
-	isl_space *pnt_dim = NULL;
-	isl_qpolynomial *qp;
-
-	if (!pw || !pnt)
-		goto error;
-	ctx = isl_point_get_ctx(pnt);
-	pnt_dim = isl_point_get_space(pnt);
-	isl_assert(ctx, isl_space_is_domain(pnt_dim, pw->dim), goto error);
-
-	for (i = 0; i < pw->n; ++i) {
-		found = isl_set_contains_point(pw->p[i].set, pnt);
-		if (found < 0)
-			goto error;
-		if (found)
-			break;
-	}
-	if (found)
-		qp = FN(EL,eval)(FN(EL,copy)(pw->p[i].FIELD),
-					    isl_point_copy(pnt));
-	else
-		qp = isl_qpolynomial_zero_on_domain(FN(PW,get_domain_space)(pw));
-	FN(PW,free)(pw);
-	isl_space_free(pnt_dim);
-	isl_point_free(pnt);
-	return qp;
-error:
-	FN(PW,free)(pw);
-	isl_space_free(pnt_dim);
-	isl_point_free(pnt);
-	return NULL;
-}
-#endif
-
-__isl_give isl_set *FN(PW,domain)(__isl_take PW *pw)
-{
-	int i;
-	isl_set *dom;
-
-	if (!pw)
-		return NULL;
-
-	dom = isl_set_empty(FN(PW,get_domain_space)(pw));
-	for (i = 0; i < pw->n; ++i)
-		dom = isl_set_union_disjoint(dom, isl_set_copy(pw->p[i].set));
-
-	FN(PW,free)(pw);
-
-	return dom;
-}
-
-/* Restrict the domain of "pw" by combining each cell
- * with "set" through a call to "fn", where "fn" may be
- * isl_set_intersect or isl_set_intersect_params.
- */
-static __isl_give PW *FN(PW,intersect_aligned)(__isl_take PW *pw,
-	__isl_take isl_set *set,
-	__isl_give isl_set *(*fn)(__isl_take isl_set *set1,
-				    __isl_take isl_set *set2))
-{
-	int i;
-
-	if (!pw || !set)
-		goto error;
-
-	if (pw->n == 0) {
-		isl_set_free(set);
-		return pw;
-	}
-
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		goto error;
-
-	for (i = pw->n - 1; i >= 0; --i) {
-		isl_basic_set *aff;
-		pw->p[i].set = fn(pw->p[i].set, isl_set_copy(set));
-		if (!pw->p[i].set)
-			goto error;
-		aff = isl_set_affine_hull(isl_set_copy(pw->p[i].set));
-		pw->p[i].FIELD = FN(EL,substitute_equalities)(pw->p[i].FIELD,
-								aff);
-		if (!pw->p[i].FIELD)
-			goto error;
-		if (isl_set_plain_is_empty(pw->p[i].set)) {
-			isl_set_free(pw->p[i].set);
-			FN(EL,free)(pw->p[i].FIELD);
-			if (i != pw->n - 1)
-				pw->p[i] = pw->p[pw->n - 1];
-			pw->n--;
-		}
-	}
-	
-	isl_set_free(set);
-	return pw;
-error:
-	isl_set_free(set);
-	FN(PW,free)(pw);
-	return NULL;
-}
-
-static __isl_give PW *FN(PW,intersect_domain_aligned)(__isl_take PW *pw,
-	__isl_take isl_set *set)
-{
-	return FN(PW,intersect_aligned)(pw, set, &isl_set_intersect);
-}
-
-__isl_give PW *FN(PW,intersect_domain)(__isl_take PW *pw,
-	__isl_take isl_set *context)
-{
-	return FN(PW,align_params_pw_set_and)(pw, context,
-					&FN(PW,intersect_domain_aligned));
-}
-
-static __isl_give PW *FN(PW,intersect_params_aligned)(__isl_take PW *pw,
-	__isl_take isl_set *set)
-{
-	return FN(PW,intersect_aligned)(pw, set, &isl_set_intersect_params);
-}
-
-/* Intersect the domain of "pw" with the parameter domain "context".
- */
-__isl_give PW *FN(PW,intersect_params)(__isl_take PW *pw,
-	__isl_take isl_set *context)
-{
-	return FN(PW,align_params_pw_set_and)(pw, context,
-					&FN(PW,intersect_params_aligned));
-}
-
-static __isl_give PW *FN(PW,gist_aligned)(__isl_take PW *pw,
-	__isl_take isl_set *context,
-	__isl_give EL *(*fn_el)(__isl_take EL *el,
-				    __isl_take isl_set *set),
-	__isl_give isl_set *(*fn_dom)(__isl_take isl_set *set,
-				    __isl_take isl_basic_set *bset))
-{
-	int i;
-	isl_basic_set *hull = NULL;
-
-	if (!pw || !context)
-		goto error;
-
-	if (pw->n == 0) {
-		isl_set_free(context);
-		return pw;
-	}
-
-	if (!isl_space_match(pw->dim, isl_dim_param,
-				context->dim, isl_dim_param)) {
-		pw = FN(PW,align_params)(pw, isl_set_get_space(context));
-		context = isl_set_align_params(context, FN(PW,get_space)(pw));
-	}
-
-	context = isl_set_compute_divs(context);
-	hull = isl_set_simple_hull(isl_set_copy(context));
-
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		goto error;
-
-	for (i = pw->n - 1; i >= 0; --i) {
-		pw->p[i].set = isl_set_intersect(pw->p[i].set,
-						 isl_set_copy(context));
-		if (!pw->p[i].set)
-			goto error;
-		pw->p[i].FIELD = fn_el(pw->p[i].FIELD,
-					     isl_set_copy(pw->p[i].set));
-		pw->p[i].set = fn_dom(pw->p[i].set, isl_basic_set_copy(hull));
-		if (!pw->p[i].set)
-			goto error;
-		if (isl_set_plain_is_empty(pw->p[i].set)) {
-			isl_set_free(pw->p[i].set);
-			FN(EL,free)(pw->p[i].FIELD);
-			if (i != pw->n - 1)
-				pw->p[i] = pw->p[pw->n - 1];
-			pw->n--;
-		}
-	}
-
-	isl_basic_set_free(hull);
-	isl_set_free(context);
-
-	return pw;
-error:
-	FN(PW,free)(pw);
-	isl_basic_set_free(hull);
-	isl_set_free(context);
-	return NULL;
-}
-
-static __isl_give PW *FN(PW,gist_domain_aligned)(__isl_take PW *pw,
-	__isl_take isl_set *set)
-{
-	return FN(PW,gist_aligned)(pw, set, &FN(EL,gist),
-					&isl_set_gist_basic_set);
-}
-
-__isl_give PW *FN(PW,gist)(__isl_take PW *pw, __isl_take isl_set *context)
-{
-	return FN(PW,align_params_pw_set_and)(pw, context,
-						&FN(PW,gist_domain_aligned));
-}
-
-static __isl_give PW *FN(PW,gist_params_aligned)(__isl_take PW *pw,
-	__isl_take isl_set *set)
-{
-	return FN(PW,gist_aligned)(pw, set, &FN(EL,gist_params),
-					&isl_set_gist_params_basic_set);
-}
-
-__isl_give PW *FN(PW,gist_params)(__isl_take PW *pw,
-	__isl_take isl_set *context)
-{
-	return FN(PW,align_params_pw_set_and)(pw, context,
-						&FN(PW,gist_params_aligned));
-}
-
-__isl_give PW *FN(PW,coalesce)(__isl_take PW *pw)
-{
-	int i, j;
-
-	if (!pw)
-		return NULL;
-	if (pw->n == 0)
-		return pw;
-
-	for (i = pw->n - 1; i >= 0; --i) {
-		for (j = i - 1; j >= 0; --j) {
-			if (!FN(EL,plain_is_equal)(pw->p[i].FIELD,
-							pw->p[j].FIELD))
-				continue;
-			pw->p[j].set = isl_set_union(pw->p[j].set,
-							pw->p[i].set);
-			FN(EL,free)(pw->p[i].FIELD);
-			if (i != pw->n - 1)
-				pw->p[i] = pw->p[pw->n - 1];
-			pw->n--;
-			break;
-		}
-		if (j >= 0)
-			continue;
-		pw->p[i].set = isl_set_coalesce(pw->p[i].set);
-		if (!pw->p[i].set)
-			goto error;
-	}
-
-	return pw;
-error:
-	FN(PW,free)(pw);
-	return NULL;
-}
-
-isl_ctx *FN(PW,get_ctx)(__isl_keep PW *pw)
-{
-	return pw ? isl_space_get_ctx(pw->dim) : NULL;
-}
-
-#ifndef NO_INVOLVES_DIMS
-int FN(PW,involves_dims)(__isl_keep PW *pw, enum isl_dim_type type,
-	unsigned first, unsigned n)
-{
-	int i;
-	enum isl_dim_type set_type;
-
-	if (!pw)
-		return -1;
-	if (pw->n == 0 || n == 0)
-		return 0;
-
-	set_type = type == isl_dim_in ? isl_dim_set : type;
-
-	for (i = 0; i < pw->n; ++i) {
-		int involves = FN(EL,involves_dims)(pw->p[i].FIELD,
-							type, first, n);
-		if (involves < 0 || involves)
-			return involves;
-		involves = isl_set_involves_dims(pw->p[i].set,
-							set_type, first, n);
-		if (involves < 0 || involves)
-			return involves;
-	}
-	return 0;
-}
-#endif
-
-__isl_give PW *FN(PW,set_dim_name)(__isl_take PW *pw,
-	enum isl_dim_type type, unsigned pos, const char *s)
-{
-	int i;
-	enum isl_dim_type set_type;
-
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		return NULL;
-
-	set_type = type == isl_dim_in ? isl_dim_set : type;
-
-	pw->dim = isl_space_set_dim_name(pw->dim, type, pos, s);
-	if (!pw->dim)
-		goto error;
-
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].set = isl_set_set_dim_name(pw->p[i].set,
-							set_type, pos, s);
-		if (!pw->p[i].set)
-			goto error;
-		pw->p[i].FIELD = FN(EL,set_dim_name)(pw->p[i].FIELD, type, pos, s);
-		if (!pw->p[i].FIELD)
-			goto error;
-	}
-
-	return pw;
-error:
-	FN(PW,free)(pw);
-	return NULL;
-}
-
-#ifndef NO_DROP_DIMS
-__isl_give PW *FN(PW,drop_dims)(__isl_take PW *pw,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-	enum isl_dim_type set_type;
-
-	if (!pw)
-		return NULL;
-	if (n == 0 && !isl_space_get_tuple_name(pw->dim, type))
-		return pw;
-
-	set_type = type == isl_dim_in ? isl_dim_set : type;
-
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		return NULL;
-	pw->dim = isl_space_drop_dims(pw->dim, type, first, n);
-	if (!pw->dim)
-		goto error;
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].set = isl_set_drop(pw->p[i].set, set_type, first, n);
-		if (!pw->p[i].set)
-			goto error;
-		pw->p[i].FIELD = FN(EL,drop_dims)(pw->p[i].FIELD, type, first, n);
-		if (!pw->p[i].FIELD)
-			goto error;
-	}
-
-	return pw;
-error:
-	FN(PW,free)(pw);
-	return NULL;
-}
-
-/* This function is very similar to drop_dims.
- * The only difference is that the cells may still involve
- * the specified dimensions.  They are removed using
- * isl_set_project_out instead of isl_set_drop.
- */
-__isl_give PW *FN(PW,project_out)(__isl_take PW *pw,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-	enum isl_dim_type set_type;
-
-	if (!pw)
-		return NULL;
-	if (n == 0 && !isl_space_get_tuple_name(pw->dim, type))
-		return pw;
-
-	set_type = type == isl_dim_in ? isl_dim_set : type;
-
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		return NULL;
-	pw->dim = isl_space_drop_dims(pw->dim, type, first, n);
-	if (!pw->dim)
-		goto error;
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].set = isl_set_project_out(pw->p[i].set,
-							set_type, first, n);
-		if (!pw->p[i].set)
-			goto error;
-		pw->p[i].FIELD = FN(EL,drop_dims)(pw->p[i].FIELD, type, first, n);
-		if (!pw->p[i].FIELD)
-			goto error;
-	}
-
-	return pw;
-error:
-	FN(PW,free)(pw);
-	return NULL;
-}
-
-/* Project the domain of pw onto its parameter space.
- */
-__isl_give PW *FN(PW,project_domain_on_params)(__isl_take PW *pw)
-{
-	isl_space *space;
-	unsigned n;
-
-	n = FN(PW,dim)(pw, isl_dim_in);
-	pw = FN(PW,project_out)(pw, isl_dim_in, 0, n);
-	space = FN(PW,get_domain_space)(pw);
-	space = isl_space_params(space);
-	pw = FN(PW,reset_domain_space)(pw, space);
-	return pw;
-}
-#endif
-
-#ifndef NO_INSERT_DIMS
-__isl_give PW *FN(PW,insert_dims)(__isl_take PW *pw, enum isl_dim_type type,
-	unsigned first, unsigned n)
-{
-	int i;
-	enum isl_dim_type set_type;
-
-	if (!pw)
-		return NULL;
-	if (n == 0 && !isl_space_is_named_or_nested(pw->dim, type))
-		return pw;
-
-	set_type = type == isl_dim_in ? isl_dim_set : type;
-
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		return NULL;
-
-	pw->dim = isl_space_insert_dims(pw->dim, type, first, n);
-	if (!pw->dim)
-		goto error;
-
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].set = isl_set_insert_dims(pw->p[i].set,
-							    set_type, first, n);
-		if (!pw->p[i].set)
-			goto error;
-		pw->p[i].FIELD = FN(EL,insert_dims)(pw->p[i].FIELD,
-								type, first, n);
-		if (!pw->p[i].FIELD)
-			goto error;
-	}
-
-	return pw;
-error:
-	FN(PW,free)(pw);
-	return NULL;
-}
-#endif
-
-__isl_give PW *FN(PW,fix_dim)(__isl_take PW *pw,
-	enum isl_dim_type type, unsigned pos, isl_int v)
-{
-	int i;
-
-	if (!pw)
-		return NULL;
-
-	if (type == isl_dim_in)
-		type = isl_dim_set;
-
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		return NULL;
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].set = isl_set_fix(pw->p[i].set, type, pos, v);
-		if (!pw->p[i].set)
-			goto error;
-	}
-
-	return pw;
-error:
-	FN(PW,free)(pw);
-	return NULL;
-}
-
-unsigned FN(PW,dim)(__isl_keep PW *pw, enum isl_dim_type type)
-{
-	return pw ? isl_space_dim(pw->dim, type) : 0;
-}
-
-__isl_give PW *FN(PW,split_dims)(__isl_take PW *pw,
-	enum isl_dim_type type, unsigned first, unsigned n)
-{
-	int i;
-
-	if (!pw)
-		return NULL;
-	if (n == 0)
-		return pw;
-
-	if (type == isl_dim_in)
-		type = isl_dim_set;
-
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		return NULL;
-	if (!pw->dim)
-		goto error;
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].set = isl_set_split_dims(pw->p[i].set, type, first, n);
-		if (!pw->p[i].set)
-			goto error;
-	}
-
-	return pw;
-error:
-	FN(PW,free)(pw);
-	return NULL;
-}
-
-#ifndef NO_OPT
-/* Compute the maximal value attained by the piecewise quasipolynomial
- * on its domain or zero if the domain is empty.
- * In the worst case, the domain is scanned completely,
- * so the domain is assumed to be bounded.
- */
-__isl_give isl_qpolynomial *FN(PW,opt)(__isl_take PW *pw, int max)
-{
-	int i;
-	isl_qpolynomial *opt;
-
-	if (!pw)
-		return NULL;
-
-	if (pw->n == 0) {
-		isl_space *dim = isl_space_copy(pw->dim);
-		FN(PW,free)(pw);
-		return isl_qpolynomial_zero_on_domain(isl_space_domain(dim));
-	}
-
-	opt = FN(EL,opt_on_domain)(FN(EL,copy)(pw->p[0].FIELD),
-					isl_set_copy(pw->p[0].set), max);
-	for (i = 1; i < pw->n; ++i) {
-		isl_qpolynomial *opt_i;
-		opt_i = FN(EL,opt_on_domain)(FN(EL,copy)(pw->p[i].FIELD),
-						isl_set_copy(pw->p[i].set), max);
-		if (max)
-			opt = isl_qpolynomial_max_cst(opt, opt_i);
-		else
-			opt = isl_qpolynomial_min_cst(opt, opt_i);
-	}
-
-	FN(PW,free)(pw);
-	return opt;
-}
-
-__isl_give isl_qpolynomial *FN(PW,max)(__isl_take PW *pw)
-{
-	return FN(PW,opt)(pw, 1);
-}
-
-__isl_give isl_qpolynomial *FN(PW,min)(__isl_take PW *pw)
-{
-	return FN(PW,opt)(pw, 0);
-}
-#endif
-
-__isl_give isl_space *FN(PW,get_space)(__isl_keep PW *pw)
-{
-	return pw ? isl_space_copy(pw->dim) : NULL;
-}
-
-__isl_give isl_space *FN(PW,get_domain_space)(__isl_keep PW *pw)
-{
-	return pw ? isl_space_domain(isl_space_copy(pw->dim)) : NULL;
-}
-
-#ifndef NO_RESET_DIM
-/* Reset the space of "pw".  Since we don't know if the elements
- * represent the spaces themselves or their domains, we pass along
- * both when we call their reset_space_and_domain.
- */
-static __isl_give PW *FN(PW,reset_space_and_domain)(__isl_take PW *pw,
-	__isl_take isl_space *space, __isl_take isl_space *domain)
-{
-	int i;
-
-	pw = FN(PW,cow)(pw);
-	if (!pw || !space || !domain)
-		goto error;
-
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].set = isl_set_reset_space(pw->p[i].set,
-						 isl_space_copy(domain));
-		if (!pw->p[i].set)
-			goto error;
-		pw->p[i].FIELD = FN(EL,reset_space_and_domain)(pw->p[i].FIELD,
-			      isl_space_copy(space), isl_space_copy(domain));
-		if (!pw->p[i].FIELD)
-			goto error;
-	}
-
-	isl_space_free(domain);
-
-	isl_space_free(pw->dim);
-	pw->dim = space;
-
-	return pw;
-error:
-	isl_space_free(domain);
-	isl_space_free(space);
-	FN(PW,free)(pw);
-	return NULL;
-}
-
-__isl_give PW *FN(PW,reset_domain_space)(__isl_take PW *pw,
-	__isl_take isl_space *domain)
-{
-	isl_space *space;
-
-	space = isl_space_extend_domain_with_range(isl_space_copy(domain),
-						   FN(PW,get_space)(pw));
-	return FN(PW,reset_space_and_domain)(pw, space, domain);
-}
-
-__isl_give PW *FN(PW,reset_space)(__isl_take PW *pw, __isl_take isl_space *dim)
-{
-	isl_space *domain;
-
-	domain = isl_space_domain(isl_space_copy(dim));
-	return FN(PW,reset_space_and_domain)(pw, dim, domain);
-}
-
-__isl_give PW *FN(PW,set_tuple_id)(__isl_keep PW *pw, enum isl_dim_type type,
-	__isl_take isl_id *id)
-{
-	isl_space *space;
-
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		return isl_id_free(id);
-
-	space = FN(PW,get_space)(pw);
-	space = isl_space_set_tuple_id(space, type, id);
-
-	return FN(PW,reset_space)(pw, space);
-}
-
-__isl_give PW *FN(PW,set_dim_id)(__isl_take PW *pw,
-	enum isl_dim_type type, unsigned pos, __isl_take isl_id *id)
-{
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		return isl_id_free(id);
-	pw->dim = isl_space_set_dim_id(pw->dim, type, pos, id);
-	return FN(PW,reset_space)(pw, isl_space_copy(pw->dim));
-}
-#endif
-
-int FN(PW,has_equal_space)(__isl_keep PW *pw1, __isl_keep PW *pw2)
-{
-	if (!pw1 || !pw2)
-		return -1;
-
-	return isl_space_is_equal(pw1->dim, pw2->dim);
-}
-
-#ifndef NO_MORPH
-__isl_give PW *FN(PW,morph_domain)(__isl_take PW *pw,
-	__isl_take isl_morph *morph)
-{
-	int i;
-	isl_ctx *ctx;
-
-	if (!pw || !morph)
-		goto error;
-
-	ctx = isl_space_get_ctx(pw->dim);
-	isl_assert(ctx, isl_space_is_domain(morph->dom->dim, pw->dim),
-		goto error);
-
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		goto error;
-	pw->dim = isl_space_extend_domain_with_range(
-			isl_space_copy(morph->ran->dim), pw->dim);
-	if (!pw->dim)
-		goto error;
-
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].set = isl_morph_set(isl_morph_copy(morph), pw->p[i].set);
-		if (!pw->p[i].set)
-			goto error;
-		pw->p[i].FIELD = FN(EL,morph_domain)(pw->p[i].FIELD,
-						isl_morph_copy(morph));
-		if (!pw->p[i].FIELD)
-			goto error;
-	}
-
-	isl_morph_free(morph);
-
-	return pw;
-error:
-	FN(PW,free)(pw);
-	isl_morph_free(morph);
-	return NULL;
-}
-#endif
-
-int FN(PW,foreach_piece)(__isl_keep PW *pw,
-	int (*fn)(__isl_take isl_set *set, __isl_take EL *el, void *user),
-	void *user)
-{
-	int i;
-
-	if (!pw)
-		return -1;
-
-	for (i = 0; i < pw->n; ++i)
-		if (fn(isl_set_copy(pw->p[i].set),
-				FN(EL,copy)(pw->p[i].FIELD), user) < 0)
-			return -1;
-
-	return 0;
-}
-
-#ifndef NO_LIFT
-static int any_divs(__isl_keep isl_set *set)
-{
-	int i;
-
-	if (!set)
-		return -1;
-
-	for (i = 0; i < set->n; ++i)
-		if (set->p[i]->n_div > 0)
-			return 1;
-
-	return 0;
-}
-
-static int foreach_lifted_subset(__isl_take isl_set *set, __isl_take EL *el,
-	int (*fn)(__isl_take isl_set *set, __isl_take EL *el,
-		    void *user), void *user)
-{
-	int i;
-
-	if (!set || !el)
-		goto error;
-
-	for (i = 0; i < set->n; ++i) {
-		isl_set *lift;
-		EL *copy;
-
-		lift = isl_set_from_basic_set(isl_basic_set_copy(set->p[i]));
-		lift = isl_set_lift(lift);
-
-		copy = FN(EL,copy)(el);
-		copy = FN(EL,lift)(copy, isl_set_get_space(lift));
-
-		if (fn(lift, copy, user) < 0)
-			goto error;
-	}
-
-	isl_set_free(set);
-	FN(EL,free)(el);
-
-	return 0;
-error:
-	isl_set_free(set);
-	FN(EL,free)(el);
-	return -1;
-}
-
-int FN(PW,foreach_lifted_piece)(__isl_keep PW *pw,
-	int (*fn)(__isl_take isl_set *set, __isl_take EL *el,
-		    void *user), void *user)
-{
-	int i;
-
-	if (!pw)
-		return -1;
-
-	for (i = 0; i < pw->n; ++i) {
-		isl_set *set;
-		EL *el;
-
-		set = isl_set_copy(pw->p[i].set);
-		el = FN(EL,copy)(pw->p[i].FIELD);
-		if (!any_divs(set)) {
-			if (fn(set, el, user) < 0)
-				return -1;
-			continue;
-		}
-		if (foreach_lifted_subset(set, el, fn, user) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-#endif
-
-#ifndef NO_MOVE_DIMS
-__isl_give PW *FN(PW,move_dims)(__isl_take PW *pw,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n)
-{
-	int i;
-
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		return NULL;
-
-	pw->dim = isl_space_move_dims(pw->dim, dst_type, dst_pos, src_type, src_pos, n);
-	if (!pw->dim)
-		goto error;
-
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].FIELD = FN(EL,move_dims)(pw->p[i].FIELD,
-					dst_type, dst_pos, src_type, src_pos, n);
-		if (!pw->p[i].FIELD)
-			goto error;
-	}
-
-	if (dst_type == isl_dim_in)
-		dst_type = isl_dim_set;
-	if (src_type == isl_dim_in)
-		src_type = isl_dim_set;
-
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].set = isl_set_move_dims(pw->p[i].set,
-						dst_type, dst_pos,
-						src_type, src_pos, n);
-		if (!pw->p[i].set)
-			goto error;
-	}
-
-	return pw;
-error:
-	FN(PW,free)(pw);
-	return NULL;
-}
-#endif
-
-__isl_give PW *FN(PW,mul_isl_int)(__isl_take PW *pw, isl_int v)
-{
-	int i;
-
-	if (isl_int_is_one(v))
-		return pw;
-	if (pw && DEFAULT_IS_ZERO && isl_int_is_zero(v)) {
-		PW *zero;
-		isl_space *dim = FN(PW,get_space)(pw);
-#ifdef HAS_TYPE
-		zero = FN(PW,ZERO)(dim, pw->type);
-#else
-		zero = FN(PW,ZERO)(dim);
-#endif
-		FN(PW,free)(pw);
-		return zero;
-	}
-	pw = FN(PW,cow)(pw);
-	if (!pw)
-		return NULL;
-	if (pw->n == 0)
-		return pw;
-
-#ifdef HAS_TYPE
-	if (isl_int_is_neg(v))
-		pw->type = isl_fold_type_negate(pw->type);
-#endif
-	for (i = 0; i < pw->n; ++i) {
-		pw->p[i].FIELD = FN(EL,scale)(pw->p[i].FIELD, v);
-		if (!pw->p[i].FIELD)
-			goto error;
-	}
-
-	return pw;
-error:
-	FN(PW,free)(pw);
-	return NULL;
-}
-
-__isl_give PW *FN(PW,scale)(__isl_take PW *pw, isl_int v)
-{
-	return FN(PW,mul_isl_int)(pw, v);
-}
-
-static int FN(PW,qsort_set_cmp)(const void *p1, const void *p2)
-{
-	const isl_set *set1 = *(const isl_set **)p1;
-	const isl_set *set2 = *(const isl_set **)p2;
-
-	return isl_set_plain_cmp(set1, set2);
-}
-
-/* We normalize in place, but if anything goes wrong we need
- * to return NULL, so we need to make sure we don't change the
- * meaning of any possible other copies of map.
- */
-__isl_give PW *FN(PW,normalize)(__isl_take PW *pw)
-{
-	int i, j;
-	isl_set *set;
-
-	if (!pw)
-		return NULL;
-	for (i = 0; i < pw->n; ++i) {
-		set = isl_set_normalize(isl_set_copy(pw->p[i].set));
-		if (!set)
-			return FN(PW,free)(pw);
-		isl_set_free(pw->p[i].set);
-		pw->p[i].set = set;
-	}
-	qsort(pw->p, pw->n, sizeof(pw->p[0]), &FN(PW,qsort_set_cmp));
-	for (i = pw->n - 1; i >= 1; --i) {
-		if (!isl_set_plain_is_equal(pw->p[i - 1].set, pw->p[i].set))
-			continue;
-		if (!FN(EL,plain_is_equal)(pw->p[i - 1].FIELD, pw->p[i].FIELD))
-			continue;
-		set = isl_set_union(isl_set_copy(pw->p[i - 1].set),
-				    isl_set_copy(pw->p[i].set));
-		if (!set)
-			return FN(PW,free)(pw);
-		isl_set_free(pw->p[i].set);
-		FN(EL,free)(pw->p[i].FIELD);
-		isl_set_free(pw->p[i - 1].set);
-		pw->p[i - 1].set = set;
-		for (j = i + 1; j < pw->n; ++j)
-			pw->p[j - 1] = pw->p[j];
-		pw->n--;
-	}
-
-	return pw;
-}
-
-/* Is pw1 obviously equal to pw2?
- * That is, do they have obviously identical cells and obviously identical
- * elements on each cell?
- */
-int FN(PW,plain_is_equal)(__isl_keep PW *pw1, __isl_keep PW *pw2)
-{
-	int i;
-	int equal;
-
-	if (!pw1 || !pw2)
-		return -1;
-
-	if (pw1 == pw2)
-		return 1;
-	if (!isl_space_is_equal(pw1->dim, pw2->dim))
-		return 0;
-
-	pw1 = FN(PW,copy)(pw1);
-	pw2 = FN(PW,copy)(pw2);
-	pw1 = FN(PW,normalize)(pw1);
-	pw2 = FN(PW,normalize)(pw2);
-	if (!pw1 || !pw2)
-		goto error;
-
-	equal = pw1->n == pw2->n;
-	for (i = 0; equal && i < pw1->n; ++i) {
-		equal = isl_set_plain_is_equal(pw1->p[i].set, pw2->p[i].set);
-		if (equal < 0)
-			goto error;
-		if (!equal)
-			break;
-		equal = FN(EL,plain_is_equal)(pw1->p[i].FIELD, pw2->p[i].FIELD);
-		if (equal < 0)
-			goto error;
-	}
-
-	FN(PW,free)(pw1);
-	FN(PW,free)(pw2);
-	return equal;
-error:
-	FN(PW,free)(pw1);
-	FN(PW,free)(pw2);
-	return -1;
-}
diff --git a/cloog-0.17.0/isl/isl_qsort.c b/cloog-0.17.0/isl/isl_qsort.c
deleted file mode 100644
index 3183048..0000000
--- a/cloog-0.17.0/isl/isl_qsort.c
+++ /dev/null
@@ -1,249 +0,0 @@
-/* Copyright (C) 1991,1992,1996,1997,1999,2004 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Written by Douglas C. Schmidt (schmidt@ics.uci.edu).
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-/* If you consider tuning this algorithm, you should consult first:
-   Engineering a sort function; Jon Bentley and M. Douglas McIlroy;
-   Software - Practice and Experience; Vol. 23 (11), 1249-1265, 1993.  */
-
-#include <limits.h>
-#include <stdlib.h>
-#include <string.h>
-#include <isl_qsort.h>
-
-/* Byte-wise swap two items of size SIZE. */
-#define SWAP(a, b, size)						      \
-  do									      \
-    {									      \
-      register size_t __size = (size);					      \
-      register char *__a = (a), *__b = (b);				      \
-      do								      \
-	{								      \
-	  char __tmp = *__a;						      \
-	  *__a++ = *__b;						      \
-	  *__b++ = __tmp;						      \
-	} while (--__size > 0);						      \
-    } while (0)
-
-/* Discontinue quicksort algorithm when partition gets below this size.
-   This particular magic number was chosen to work best on a Sun 4/260. */
-#define MAX_THRESH 4
-
-/* Stack node declarations used to store unfulfilled partition obligations. */
-typedef struct
-  {
-    char *lo;
-    char *hi;
-  } stack_node;
-
-/* The next 4 #defines implement a very fast in-line stack abstraction. */
-/* The stack needs log (total_elements) entries (we could even subtract
-   log(MAX_THRESH)).  Since total_elements has type size_t, we get as
-   upper bound for log (total_elements):
-   bits per byte (CHAR_BIT) * sizeof(size_t).  */
-#define STACK_SIZE	(CHAR_BIT * sizeof(size_t))
-#define PUSH(low, high)	((void) ((top->lo = (low)), (top->hi = (high)), ++top))
-#define	POP(low, high)	((void) (--top, (low = top->lo), (high = top->hi)))
-#define	STACK_NOT_EMPTY	(stack < top)
-
-
-/* Order size using quicksort.  This implementation incorporates
-   four optimizations discussed in Sedgewick:
-
-   1. Non-recursive, using an explicit stack of pointer that store the
-      next array partition to sort.  To save time, this maximum amount
-      of space required to store an array of SIZE_MAX is allocated on the
-      stack.  Assuming a 32-bit (64 bit) integer for size_t, this needs
-      only 32 * sizeof(stack_node) == 256 bytes (for 64 bit: 1024 bytes).
-      Pretty cheap, actually.
-
-   2. Chose the pivot element using a median-of-three decision tree.
-      This reduces the probability of selecting a bad pivot value and
-      eliminates certain extraneous comparisons.
-
-   3. Only quicksorts TOTAL_ELEMS / MAX_THRESH partitions, leaving
-      insertion sort to order the MAX_THRESH items within each partition.
-      This is a big win, since insertion sort is faster for small, mostly
-      sorted array segments.
-
-   4. The larger of the two sub-partitions is always pushed onto the
-      stack first, with the algorithm then concentrating on the
-      smaller partition.  This *guarantees* no more than log (total_elems)
-      stack size is needed (actually O(1) in this case)!  */
-
-void isl_quicksort (void *const pbase, size_t total_elems, size_t size,
-	int (*cmp)(const void *, const void *, void *arg), void *arg)
-{
-  register char *base_ptr = (char *) pbase;
-
-  const size_t max_thresh = MAX_THRESH * size;
-
-  if (total_elems == 0)
-    /* Avoid lossage with unsigned arithmetic below.  */
-    return;
-
-  if (total_elems > MAX_THRESH)
-    {
-      char *lo = base_ptr;
-      char *hi = &lo[size * (total_elems - 1)];
-      stack_node stack[STACK_SIZE];
-      stack_node *top = stack;
-
-      PUSH (NULL, NULL);
-
-      while (STACK_NOT_EMPTY)
-        {
-          char *left_ptr;
-          char *right_ptr;
-
-	  /* Select median value from among LO, MID, and HI. Rearrange
-	     LO and HI so the three values are sorted. This lowers the
-	     probability of picking a pathological pivot value and
-	     skips a comparison for both the LEFT_PTR and RIGHT_PTR in
-	     the while loops. */
-
-	  char *mid = lo + size * ((hi - lo) / size >> 1);
-
-	  if ((*cmp) ((void *) mid, (void *) lo, arg) < 0)
-	    SWAP (mid, lo, size);
-	  if ((*cmp) ((void *) hi, (void *) mid, arg) < 0)
-	    SWAP (mid, hi, size);
-	  else
-	    goto jump_over;
-	  if ((*cmp) ((void *) mid, (void *) lo, arg) < 0)
-	    SWAP (mid, lo, size);
-	jump_over:;
-
-	  left_ptr  = lo + size;
-	  right_ptr = hi - size;
-
-	  /* Here's the famous ``collapse the walls'' section of quicksort.
-	     Gotta like those tight inner loops!  They are the main reason
-	     that this algorithm runs much faster than others. */
-	  do
-	    {
-	      while ((*cmp) ((void *) left_ptr, (void *) mid, arg) < 0)
-		left_ptr += size;
-
-	      while ((*cmp) ((void *) mid, (void *) right_ptr, arg) < 0)
-		right_ptr -= size;
-
-	      if (left_ptr < right_ptr)
-		{
-		  SWAP (left_ptr, right_ptr, size);
-		  if (mid == left_ptr)
-		    mid = right_ptr;
-		  else if (mid == right_ptr)
-		    mid = left_ptr;
-		  left_ptr += size;
-		  right_ptr -= size;
-		}
-	      else if (left_ptr == right_ptr)
-		{
-		  left_ptr += size;
-		  right_ptr -= size;
-		  break;
-		}
-	    }
-	  while (left_ptr <= right_ptr);
-
-          /* Set up pointers for next iteration.  First determine whether
-             left and right partitions are below the threshold size.  If so,
-             ignore one or both.  Otherwise, push the larger partition's
-             bounds on the stack and continue sorting the smaller one. */
-
-          if ((size_t) (right_ptr - lo) <= max_thresh)
-            {
-              if ((size_t) (hi - left_ptr) <= max_thresh)
-		/* Ignore both small partitions. */
-                POP (lo, hi);
-              else
-		/* Ignore small left partition. */
-                lo = left_ptr;
-            }
-          else if ((size_t) (hi - left_ptr) <= max_thresh)
-	    /* Ignore small right partition. */
-            hi = right_ptr;
-          else if ((right_ptr - lo) > (hi - left_ptr))
-            {
-	      /* Push larger left partition indices. */
-              PUSH (lo, right_ptr);
-              lo = left_ptr;
-            }
-          else
-            {
-	      /* Push larger right partition indices. */
-              PUSH (left_ptr, hi);
-              hi = right_ptr;
-            }
-        }
-    }
-
-  /* Once the BASE_PTR array is partially sorted by quicksort the rest
-     is completely sorted using insertion sort, since this is efficient
-     for partitions below MAX_THRESH size. BASE_PTR points to the beginning
-     of the array to sort, and END_PTR points at the very last element in
-     the array (*not* one beyond it!). */
-
-#define min(x, y) ((x) < (y) ? (x) : (y))
-
-  {
-    char *const end_ptr = &base_ptr[size * (total_elems - 1)];
-    char *tmp_ptr = base_ptr;
-    char *thresh = min(end_ptr, base_ptr + max_thresh);
-    register char *run_ptr;
-
-    /* Find smallest element in first threshold and place it at the
-       array's beginning.  This is the smallest array element,
-       and the operation speeds up insertion sort's inner loop. */
-
-    for (run_ptr = tmp_ptr + size; run_ptr <= thresh; run_ptr += size)
-      if ((*cmp) ((void *) run_ptr, (void *) tmp_ptr, arg) < 0)
-        tmp_ptr = run_ptr;
-
-    if (tmp_ptr != base_ptr)
-      SWAP (tmp_ptr, base_ptr, size);
-
-    /* Insertion sort, running from left-hand-side up to right-hand-side.  */
-
-    run_ptr = base_ptr + size;
-    while ((run_ptr += size) <= end_ptr)
-      {
-	tmp_ptr = run_ptr - size;
-	while ((*cmp) ((void *) run_ptr, (void *) tmp_ptr, arg) < 0)
-	  tmp_ptr -= size;
-
-	tmp_ptr += size;
-        if (tmp_ptr != run_ptr)
-          {
-            char *trav;
-
-	    trav = run_ptr + size;
-	    while (--trav >= run_ptr)
-              {
-                char c = *trav;
-                char *hi, *lo;
-
-                for (hi = lo = trav; (lo -= size) >= tmp_ptr; hi = lo)
-                  *hi = *lo;
-                *hi = c;
-              }
-          }
-      }
-  }
-}
diff --git a/cloog-0.17.0/isl/isl_qsort.h b/cloog-0.17.0/isl/isl_qsort.h
deleted file mode 100644
index 5ca1634..0000000
--- a/cloog-0.17.0/isl/isl_qsort.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef ISL_QSORT_H
-#define ISL_QSORT_H
-
-void isl_quicksort (void *const pbase, size_t total_elems, size_t size,
-	int (*cmp)(const void *, const void *, void *arg), void *arg);
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_range.c b/cloog-0.17.0/isl/isl_range.c
deleted file mode 100644
index 2653fc4..0000000
--- a/cloog-0.17.0/isl/isl_range.c
+++ /dev/null
@@ -1,491 +0,0 @@
-#include <isl_ctx_private.h>
-#include <isl/constraint.h>
-#include <isl/set.h>
-#include <isl_polynomial_private.h>
-#include <isl_morph.h>
-#include <isl_range.h>
-
-struct range_data {
-	struct isl_bound	*bound;
-	int 		    	*signs;
-	int			sign;
-	int			test_monotonicity;
-	int		    	monotonicity;
-	int			tight;
-	isl_qpolynomial	    	*poly;
-	isl_pw_qpolynomial_fold *pwf;
-	isl_pw_qpolynomial_fold *pwf_tight;
-};
-
-static int propagate_on_domain(__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, struct range_data *data);
-
-/* Check whether the polynomial "poly" has sign "sign" over "bset",
- * i.e., if sign == 1, check that the lower bound on the polynomial
- * is non-negative and if sign == -1, check that the upper bound on
- * the polynomial is non-positive.
- */
-static int has_sign(__isl_keep isl_basic_set *bset,
-	__isl_keep isl_qpolynomial *poly, int sign, int *signs)
-{
-	struct range_data data_m;
-	unsigned nvar;
-	unsigned nparam;
-	isl_space *dim;
-	isl_qpolynomial *opt;
-	int r;
-	enum isl_fold type;
-
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-
-	bset = isl_basic_set_copy(bset);
-	poly = isl_qpolynomial_copy(poly);
-
-	bset = isl_basic_set_move_dims(bset, isl_dim_set, 0,
-					isl_dim_param, 0, nparam);
-	poly = isl_qpolynomial_move_dims(poly, isl_dim_in, 0,
-					isl_dim_param, 0, nparam);
-
-	dim = isl_qpolynomial_get_space(poly);
-	dim = isl_space_params(dim);
-	dim = isl_space_from_domain(dim);
-	dim = isl_space_add_dims(dim, isl_dim_out, 1);
-
-	data_m.test_monotonicity = 0;
-	data_m.signs = signs;
-	data_m.sign = -sign;
-	type = data_m.sign < 0 ? isl_fold_min : isl_fold_max;
-	data_m.pwf = isl_pw_qpolynomial_fold_zero(dim, type);
-	data_m.tight = 0;
-	data_m.pwf_tight = NULL;
-
-	if (propagate_on_domain(bset, poly, &data_m) < 0)
-		goto error;
-
-	if (sign > 0)
-		opt = isl_pw_qpolynomial_fold_min(data_m.pwf);
-	else
-		opt = isl_pw_qpolynomial_fold_max(data_m.pwf);
-
-	if (!opt)
-		r = -1;
-	else if (isl_qpolynomial_is_nan(opt) ||
-		 isl_qpolynomial_is_infty(opt) ||
-		 isl_qpolynomial_is_neginfty(opt))
-		r = 0;
-	else
-		r = sign * isl_qpolynomial_sgn(opt) >= 0;
-
-	isl_qpolynomial_free(opt);
-
-	return r;
-error:
-	isl_pw_qpolynomial_fold_free(data_m.pwf);
-	return -1;
-}
-
-/* Return  1 if poly is monotonically increasing in the last set variable,
- *        -1 if poly is monotonically decreasing in the last set variable,
- *	   0 if no conclusion,
- *	  -2 on error.
- *
- * We simply check the sign of p(x+1)-p(x)
- */
-static int monotonicity(__isl_keep isl_basic_set *bset,
-	__isl_keep isl_qpolynomial *poly, struct range_data *data)
-{
-	isl_ctx *ctx;
-	isl_space *dim;
-	isl_qpolynomial *sub = NULL;
-	isl_qpolynomial *diff = NULL;
-	int result = 0;
-	int s;
-	unsigned nvar;
-
-	ctx = isl_qpolynomial_get_ctx(poly);
-	dim = isl_qpolynomial_get_domain_space(poly);
-
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-
-	sub = isl_qpolynomial_var_on_domain(isl_space_copy(dim), isl_dim_set, nvar - 1);
-	sub = isl_qpolynomial_add(sub,
-		isl_qpolynomial_rat_cst_on_domain(dim, ctx->one, ctx->one));
-
-	diff = isl_qpolynomial_substitute(isl_qpolynomial_copy(poly),
-			isl_dim_in, nvar - 1, 1, &sub);
-	diff = isl_qpolynomial_sub(diff, isl_qpolynomial_copy(poly));
-
-	s = has_sign(bset, diff, 1, data->signs);
-	if (s < 0)
-		goto error;
-	if (s)
-		result = 1;
-	else {
-		s = has_sign(bset, diff, -1, data->signs);
-		if (s < 0)
-			goto error;
-		if (s)
-			result = -1;
-	}
-
-	isl_qpolynomial_free(diff);
-	isl_qpolynomial_free(sub);
-
-	return result;
-error:
-	isl_qpolynomial_free(diff);
-	isl_qpolynomial_free(sub);
-	return -2;
-}
-
-static __isl_give isl_qpolynomial *bound2poly(__isl_take isl_constraint *bound,
-	__isl_take isl_space *dim, unsigned pos, 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);
-	return isl_qpolynomial_from_constraint(bound, isl_dim_set, pos);
-}
-
-static int bound_is_integer(__isl_take isl_constraint *bound, unsigned pos)
-{
-	isl_int c;
-	int is_int;
-
-	if (!bound)
-		return 1;
-
-	isl_int_init(c);
-	isl_constraint_get_coefficient(bound, isl_dim_set, pos, &c);
-	is_int = isl_int_is_one(c) || isl_int_is_negone(c);
-	isl_int_clear(c);
-
-	return is_int;
-}
-
-struct isl_fixed_sign_data {
-	int		*signs;
-	int		sign;
-	isl_qpolynomial	*poly;
-};
-
-/* Add term "term" to data->poly if it has sign data->sign.
- * The sign is determined based on the signs of the parameters
- * and variables in data->signs.  The integer divisions, if
- * any, are assumed to be non-negative.
- */
-static int collect_fixed_sign_terms(__isl_take isl_term *term, void *user)
-{
-	struct isl_fixed_sign_data *data = (struct isl_fixed_sign_data *)user;
-	isl_int n;
-	int i;
-	int sign;
-	unsigned nparam;
-	unsigned nvar;
-
-	if (!term)
-		return -1;
-
-	nparam = isl_term_dim(term, isl_dim_param);
-	nvar = isl_term_dim(term, isl_dim_set);
-
-	isl_int_init(n);
-
-	isl_term_get_num(term, &n);
-
-	sign = isl_int_sgn(n);
-	for (i = 0; i < nparam; ++i) {
-		if (data->signs[i] > 0)
-			continue;
-		if (isl_term_get_exp(term, isl_dim_param, i) % 2)
-			sign = -sign;
-	}
-	for (i = 0; i < nvar; ++i) {
-		if (data->signs[nparam + i] > 0)
-			continue;
-		if (isl_term_get_exp(term, isl_dim_set, i) % 2)
-			sign = -sign;
-	}
-
-	if (sign == data->sign) {
-		isl_qpolynomial *t = isl_qpolynomial_from_term(term);
-
-		data->poly = isl_qpolynomial_add(data->poly, t);
-	} else
-		isl_term_free(term);
-
-	isl_int_clear(n);
-
-	return 0;
-}
-
-/* Construct and return a polynomial that consists of the terms
- * in "poly" that have sign "sign".  The integer divisions, if
- * any, are assumed to be non-negative.
- */
-__isl_give isl_qpolynomial *isl_qpolynomial_terms_of_sign(
-	__isl_keep isl_qpolynomial *poly, int *signs, int sign)
-{
-	isl_space *space;
-	struct isl_fixed_sign_data data = { signs, sign };
-
-	space = isl_qpolynomial_get_domain_space(poly);
-	data.poly = isl_qpolynomial_zero_on_domain(space);
-
-	if (isl_qpolynomial_foreach_term(poly, collect_fixed_sign_terms, &data) < 0)
-		goto error;
-
-	return data.poly;
-error:
-	isl_qpolynomial_free(data.poly);
-	return NULL;
-}
-
-/* Helper function to add a guarded polynomial to either pwf_tight or pwf,
- * depending on whether the result has been determined to be tight.
- */
-static int add_guarded_poly(__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, struct range_data *data)
-{
-	enum isl_fold type = data->sign < 0 ? isl_fold_min : isl_fold_max;
-	isl_set *set;
-	isl_qpolynomial_fold *fold;
-	isl_pw_qpolynomial_fold *pwf;
-
-	bset = isl_basic_set_params(bset);
-	poly = isl_qpolynomial_project_domain_on_params(poly);
-
-	fold = isl_qpolynomial_fold_alloc(type, poly);
-	set = isl_set_from_basic_set(bset);
-	pwf = isl_pw_qpolynomial_fold_alloc(type, set, fold);
-	if (data->tight)
-		data->pwf_tight = isl_pw_qpolynomial_fold_fold(
-						data->pwf_tight, pwf);
-	else
-		data->pwf = isl_pw_qpolynomial_fold_fold(data->pwf, pwf);
-
-	return 0;
-}
-
-/* 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.
- * If the polynomial has been determined to be monotonic
- * in the variable, then simply plug in the appropriate bound.
- * If the current polynomial is tight and if this bound is integer,
- * then the result is still tight.  In all other cases, the results
- * may not be tight.
- * Otherwise, plug in the largest bound (in absolute value) in
- * the positive terms (if an upper bound is wanted) or the negative terms
- * (if a lower bounded is wanted) and the other bound in the other terms.
- *
- * If all variables have been eliminated, then record the result.
- * Ohterwise, recurse on the next variable.
- */
-static int propagate_on_bound_pair(__isl_take isl_constraint *lower,
-	__isl_take isl_constraint *upper, __isl_take isl_basic_set *bset,
-	void *user)
-{
-	struct range_data *data = (struct range_data *)user;
-	int save_tight = data->tight;
-	isl_qpolynomial *poly;
-	int r;
-	unsigned nvar;
-
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-
-	if (data->monotonicity) {
-		isl_qpolynomial *sub;
-		isl_space *dim = isl_qpolynomial_get_domain_space(data->poly);
-		if (data->monotonicity * data->sign > 0) {
-			if (data->tight)
-				data->tight = bound_is_integer(upper, nvar);
-			sub = bound2poly(upper, dim, nvar, 1);
-			isl_constraint_free(lower);
-		} else {
-			if (data->tight)
-				data->tight = bound_is_integer(lower, nvar);
-			sub = bound2poly(lower, dim, nvar, -1);
-			isl_constraint_free(upper);
-		}
-		poly = isl_qpolynomial_copy(data->poly);
-		poly = isl_qpolynomial_substitute(poly, isl_dim_in, nvar, 1, &sub);
-		poly = isl_qpolynomial_drop_dims(poly, isl_dim_in, nvar, 1);
-
-		isl_qpolynomial_free(sub);
-	} else {
-		isl_qpolynomial *l, *u;
-		isl_qpolynomial *pos, *neg;
-		isl_space *dim = isl_qpolynomial_get_domain_space(data->poly);
-		unsigned nparam = isl_basic_set_dim(bset, isl_dim_param);
-		int sign = data->sign * data->signs[nparam + nvar];
-
-		data->tight = 0;
-
-		u = bound2poly(upper, isl_space_copy(dim), nvar, 1);
-		l = bound2poly(lower, dim, nvar, -1);
-
-		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);
-
-		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)
-		r = add_guarded_poly(bset, poly, data);
-	else
-		r = propagate_on_domain(bset, poly, data);
-
-	data->tight = save_tight;
-
-	return r;
-}
-
-/* Recursively perform range propagation on the polynomial "poly"
- * defined over the basic set "bset" and collect the results in "data".
- */
-static int propagate_on_domain(__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, struct range_data *data)
-{
-	isl_ctx *ctx;
-	isl_qpolynomial *save_poly = data->poly;
-	int save_monotonicity = data->monotonicity;
-	unsigned d;
-
-	if (!bset || !poly)
-		goto error;
-
-	ctx = isl_basic_set_get_ctx(bset);
-	d = isl_basic_set_dim(bset, isl_dim_set);
-	isl_assert(ctx, d >= 1, goto error);
-
-	if (isl_qpolynomial_is_cst(poly, NULL, NULL)) {
-		bset = isl_basic_set_project_out(bset, isl_dim_set, 0, d);
-		poly = isl_qpolynomial_drop_dims(poly, isl_dim_in, 0, d);
-		return add_guarded_poly(bset, poly, data);
-	}
-
-	if (data->test_monotonicity)
-		data->monotonicity = monotonicity(bset, poly, data);
-	else
-		data->monotonicity = 0;
-	if (data->monotonicity < -1)
-		goto error;
-
-	data->poly = poly;
-	if (isl_basic_set_foreach_bound_pair(bset, isl_dim_set, d - 1,
-					    &propagate_on_bound_pair, data) < 0)
-		goto error;
-
-	isl_basic_set_free(bset);
-	isl_qpolynomial_free(poly);
-	data->monotonicity = save_monotonicity;
-	data->poly = save_poly;
-
-	return 0;
-error:
-	isl_basic_set_free(bset);
-	isl_qpolynomial_free(poly);
-	data->monotonicity = save_monotonicity;
-	data->poly = save_poly;
-	return -1;
-}
-
-static int basic_guarded_poly_bound(__isl_take isl_basic_set *bset, void *user)
-{
-	struct range_data *data = (struct range_data *)user;
-	isl_ctx *ctx;
-	unsigned nparam = isl_basic_set_dim(bset, isl_dim_param);
-	unsigned dim = isl_basic_set_dim(bset, isl_dim_set);
-	int r;
-
-	data->signs = NULL;
-
-	ctx = isl_basic_set_get_ctx(bset);
-	data->signs = isl_alloc_array(ctx, int,
-					isl_basic_set_dim(bset, isl_dim_all));
-
-	if (isl_basic_set_dims_get_sign(bset, isl_dim_set, 0, dim,
-					data->signs + nparam) < 0)
-		goto error;
-	if (isl_basic_set_dims_get_sign(bset, isl_dim_param, 0, nparam,
-					data->signs) < 0)
-		goto error;
-
-	r = propagate_on_domain(bset, isl_qpolynomial_copy(data->poly), data);
-
-	free(data->signs);
-
-	return r;
-error:
-	free(data->signs);
-	isl_basic_set_free(bset);
-	return -1;
-}
-
-static int qpolynomial_bound_on_domain_range(__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, struct range_data *data)
-{
-	unsigned nparam = isl_basic_set_dim(bset, isl_dim_param);
-	unsigned nvar = isl_basic_set_dim(bset, isl_dim_set);
-	isl_set *set;
-
-	if (!bset)
-		goto error;
-
-	if (nvar == 0)
-		return add_guarded_poly(bset, poly, data);
-
-	set = isl_set_from_basic_set(bset);
-	set = isl_set_split_dims(set, isl_dim_param, 0, nparam);
-	set = isl_set_split_dims(set, isl_dim_set, 0, nvar);
-
-	data->poly = poly;
-
-	data->test_monotonicity = 1;
-	if (isl_set_foreach_basic_set(set, &basic_guarded_poly_bound, data) < 0)
-		goto error;
-
-	isl_set_free(set);
-	isl_qpolynomial_free(poly);
-
-	return 0;
-error:
-	isl_set_free(set);
-	isl_qpolynomial_free(poly);
-	return -1;
-}
-
-int isl_qpolynomial_bound_on_domain_range(__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, struct isl_bound *bound)
-{
-	struct range_data data;
-	int r;
-
-	data.pwf = bound->pwf;
-	data.pwf_tight = bound->pwf_tight;
-	data.tight = bound->check_tight;
-	if (bound->type == isl_fold_min)
-		data.sign = -1;
-	else
-		data.sign = 1;
-
-	r = qpolynomial_bound_on_domain_range(bset, poly, &data);
-
-	bound->pwf = data.pwf;
-	bound->pwf_tight = data.pwf_tight;
-
-	return r;
-}
diff --git a/cloog-0.17.0/isl/isl_range.h b/cloog-0.17.0/isl/isl_range.h
deleted file mode 100644
index c097079..0000000
--- a/cloog-0.17.0/isl/isl_range.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <isl_bound.h>
-
-int isl_qpolynomial_bound_on_domain_range(__isl_take isl_basic_set *bset,
-	__isl_take isl_qpolynomial *poly, struct isl_bound *bound);
-__isl_give isl_qpolynomial *isl_qpolynomial_terms_of_sign(
-	__isl_keep isl_qpolynomial *poly, int *signs, int sign);
diff --git a/cloog-0.17.0/isl/isl_reordering.c b/cloog-0.17.0/isl/isl_reordering.c
deleted file mode 100644
index d99d7ac..0000000
--- a/cloog-0.17.0/isl/isl_reordering.c
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France
- */
-
-#include <isl_ctx_private.h>
-#include <isl_space_private.h>
-#include <isl_reordering.h>
-
-__isl_give isl_reordering *isl_reordering_alloc(isl_ctx *ctx, int len)
-{
-	isl_reordering *exp;
-
-	exp = isl_alloc(ctx, struct isl_reordering,
-			sizeof(struct isl_reordering) + (len - 1) * sizeof(int));
-	if (!exp)
-		return NULL;
-
-	exp->ref = 1;
-	exp->len = len;
-	exp->dim = NULL;
-
-	return exp;
-}
-
-__isl_give isl_reordering *isl_reordering_copy(__isl_keep isl_reordering *exp)
-{
-	if (!exp)
-		return NULL;
-
-	exp->ref++;
-	return exp;
-}
-
-__isl_give isl_reordering *isl_reordering_dup(__isl_keep isl_reordering *r)
-{
-	int i;
-	isl_reordering *dup;
-
-	if (!r)
-		return NULL;
-
-	dup = isl_reordering_alloc(r->dim->ctx, r->len);
-	if (!dup)
-		return NULL;
-
-	dup->dim = isl_space_copy(r->dim);
-	if (!dup->dim)
-		return isl_reordering_free(dup);
-	for (i = 0; i < dup->len; ++i)
-		dup->pos[i] = r->pos[i];
-
-	return dup;
-}
-
-__isl_give isl_reordering *isl_reordering_cow(__isl_take isl_reordering *r)
-{
-	if (!r)
-		return NULL;
-
-	if (r->ref == 1)
-		return r;
-	r->ref--;
-	return isl_reordering_dup(r);
-}
-
-void *isl_reordering_free(__isl_take isl_reordering *exp)
-{
-	if (!exp)
-		return NULL;
-
-	if (--exp->ref > 0)
-		return NULL;
-
-	isl_space_free(exp->dim);
-	free(exp);
-	return NULL;
-}
-
-/* Construct a reordering that maps the parameters of "alignee"
- * to the corresponding parameters in a new dimension specification
- * that has the parameters of "aligner" first, followed by
- * any remaining parameters of "alignee" that do not occur in "aligner".
- */
-__isl_give isl_reordering *isl_parameter_alignment_reordering(
-	__isl_keep isl_space *alignee, __isl_keep isl_space *aligner)
-{
-	int i, j;
-	isl_reordering *exp;
-
-	if (!alignee || !aligner)
-		return NULL;
-
-	exp = isl_reordering_alloc(alignee->ctx, alignee->nparam);
-	if (!exp)
-		return NULL;
-
-	exp->dim = isl_space_copy(aligner);
-
-	for (i = 0; i < alignee->nparam; ++i) {
-		isl_id *id_i;
-		id_i = isl_space_get_dim_id(alignee, isl_dim_param, i);
-		if (!id_i)
-			isl_die(alignee->ctx, isl_error_invalid,
-				"cannot align unnamed parameters", goto error);
-		for (j = 0; j < aligner->nparam; ++j) {
-			isl_id *id_j;
-			id_j = isl_space_get_dim_id(aligner, isl_dim_param, j);
-			isl_id_free(id_j);
-			if (id_i == id_j)
-				break;
-		}
-		if (j < aligner->nparam) {
-			exp->pos[i] = j;
-			isl_id_free(id_i);
-		} else {
-			int pos;
-			pos = isl_space_dim(exp->dim, isl_dim_param);
-			exp->dim = isl_space_add_dims(exp->dim, isl_dim_param, 1);
-			exp->dim = isl_space_set_dim_id(exp->dim,
-						isl_dim_param, pos, id_i);
-			exp->pos[i] = pos;
-		}
-	}
-
-	return exp;
-error:
-	isl_reordering_free(exp);
-	return NULL;
-}
-
-__isl_give isl_reordering *isl_reordering_extend(__isl_take isl_reordering *exp,
-	unsigned extra)
-{
-	int i;
-	isl_reordering *res;
-	int offset;
-
-	if (!exp)
-		return NULL;
-	if (extra == 0)
-		return exp;
-
-	offset = isl_space_dim(exp->dim, isl_dim_all) - exp->len;
-	res = isl_reordering_alloc(exp->dim->ctx, exp->len + extra);
-	if (!res)
-		goto error;
-	res->dim = isl_space_copy(exp->dim);
-	for (i = 0; i < exp->len; ++i)
-		res->pos[i] = exp->pos[i];
-	for (i = exp->len; i < res->len; ++i)
-		res->pos[i] = offset + i;
-
-	isl_reordering_free(exp);
-
-	return res;
-error:
-	isl_reordering_free(exp);
-	return NULL;
-}
-
-__isl_give isl_reordering *isl_reordering_extend_space(
-	__isl_take isl_reordering *exp, __isl_take isl_space *dim)
-{
-	isl_reordering *res;
-
-	if (!exp || !dim)
-		goto error;
-
-	res = isl_reordering_extend(isl_reordering_copy(exp),
-				    isl_space_dim(dim, isl_dim_all) - exp->len);
-	res = isl_reordering_cow(res);
-	if (!res)
-		goto error;
-	isl_space_free(res->dim);
-	res->dim = isl_space_replace(dim, isl_dim_param, exp->dim);
-
-	isl_reordering_free(exp);
-
-	return res;
-error:
-	isl_reordering_free(exp);
-	isl_space_free(dim);
-	return NULL;
-}
-
-void isl_reordering_dump(__isl_keep isl_reordering *exp)
-{
-	int i;
-
-	for (i = 0; i < exp->len; ++i)
-		fprintf(stderr, "%d -> %d; ", i, exp->pos[i]);
-	fprintf(stderr, "\n");
-}
diff --git a/cloog-0.17.0/isl/isl_reordering.h b/cloog-0.17.0/isl/isl_reordering.h
deleted file mode 100644
index ac5b6fa..0000000
--- a/cloog-0.17.0/isl/isl_reordering.h
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef ISL_REORDERING_H
-#define ISL_REORDERING_H
-
-#include <isl/space.h>
-
-/* pos maps original dimensions to new dimensions.
- * The final dimension is given by dim.
- * The number of dimensions (i.e., the range of values) in the result
- * may be larger than the number of dimensions in the input.
- * In particular, the possible values of the entries in pos ranges from 0 to
- * the total dimension of dim - 1, unless isl_reordering_extend
- * has been called.
- */
-struct isl_reordering {
-	int ref;
-	isl_space *dim;
-	unsigned len;
-	int pos[1];
-};
-typedef struct isl_reordering isl_reordering;
-
-__isl_give isl_reordering *isl_parameter_alignment_reordering(
-	__isl_keep isl_space *alignee, __isl_keep isl_space *aligner);
-__isl_give isl_reordering *isl_reordering_copy(__isl_keep isl_reordering *exp);
-void *isl_reordering_free(__isl_take isl_reordering *exp);
-__isl_give isl_reordering *isl_reordering_extend_space(
-	__isl_take isl_reordering *exp, __isl_take isl_space *dim);
-__isl_give isl_reordering *isl_reordering_extend(__isl_take isl_reordering *exp,
-	unsigned extra);
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_sample.c b/cloog-0.17.0/isl/isl_sample.c
deleted file mode 100644
index ec63745..0000000
--- a/cloog-0.17.0/isl/isl_sample.c
+++ /dev/null
@@ -1,1358 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include "isl_sample.h"
-#include "isl_sample_piplib.h"
-#include <isl/vec.h>
-#include <isl/mat.h>
-#include <isl/seq.h>
-#include "isl_equalities.h"
-#include "isl_tab.h"
-#include "isl_basis_reduction.h"
-#include <isl_factorization.h>
-#include <isl_point_private.h>
-#include <isl_options_private.h>
-
-static struct isl_vec *empty_sample(struct isl_basic_set *bset)
-{
-	struct isl_vec *vec;
-
-	vec = isl_vec_alloc(bset->ctx, 0);
-	isl_basic_set_free(bset);
-	return vec;
-}
-
-/* Construct a zero sample of the same dimension as bset.
- * As a special case, if bset is zero-dimensional, this
- * function creates a zero-dimensional sample point.
- */
-static struct isl_vec *zero_sample(struct isl_basic_set *bset)
-{
-	unsigned dim;
-	struct isl_vec *sample;
-
-	dim = isl_basic_set_total_dim(bset);
-	sample = isl_vec_alloc(bset->ctx, 1 + dim);
-	if (sample) {
-		isl_int_set_si(sample->el[0], 1);
-		isl_seq_clr(sample->el + 1, dim);
-	}
-	isl_basic_set_free(bset);
-	return sample;
-}
-
-static struct isl_vec *interval_sample(struct isl_basic_set *bset)
-{
-	int i;
-	isl_int t;
-	struct isl_vec *sample;
-
-	bset = isl_basic_set_simplify(bset);
-	if (!bset)
-		return NULL;
-	if (isl_basic_set_plain_is_empty(bset))
-		return empty_sample(bset);
-	if (bset->n_eq == 0 && bset->n_ineq == 0)
-		return zero_sample(bset);
-
-	sample = isl_vec_alloc(bset->ctx, 2);
-	if (!sample)
-		goto error;
-	if (!bset)
-		return NULL;
-	isl_int_set_si(sample->block.data[0], 1);
-
-	if (bset->n_eq > 0) {
-		isl_assert(bset->ctx, bset->n_eq == 1, goto error);
-		isl_assert(bset->ctx, bset->n_ineq == 0, goto error);
-		if (isl_int_is_one(bset->eq[0][1]))
-			isl_int_neg(sample->el[1], bset->eq[0][0]);
-		else {
-			isl_assert(bset->ctx, isl_int_is_negone(bset->eq[0][1]),
-				   goto error);
-			isl_int_set(sample->el[1], bset->eq[0][0]);
-		}
-		isl_basic_set_free(bset);
-		return sample;
-	}
-
-	isl_int_init(t);
-	if (isl_int_is_one(bset->ineq[0][1]))
-		isl_int_neg(sample->block.data[1], bset->ineq[0][0]);
-	else
-		isl_int_set(sample->block.data[1], bset->ineq[0][0]);
-	for (i = 1; i < bset->n_ineq; ++i) {
-		isl_seq_inner_product(sample->block.data,
-					bset->ineq[i], 2, &t);
-		if (isl_int_is_neg(t))
-			break;
-	}
-	isl_int_clear(t);
-	if (i < bset->n_ineq) {
-		isl_vec_free(sample);
-		return empty_sample(bset);
-	}
-
-	isl_basic_set_free(bset);
-	return sample;
-error:
-	isl_basic_set_free(bset);
-	isl_vec_free(sample);
-	return NULL;
-}
-
-static struct isl_mat *independent_bounds(struct isl_basic_set *bset)
-{
-	int i, j, n;
-	struct isl_mat *dirs = NULL;
-	struct isl_mat *bounds = NULL;
-	unsigned dim;
-
-	if (!bset)
-		return NULL;
-
-	dim = isl_basic_set_n_dim(bset);
-	bounds = isl_mat_alloc(bset->ctx, 1+dim, 1+dim);
-	if (!bounds)
-		return NULL;
-
-	isl_int_set_si(bounds->row[0][0], 1);
-	isl_seq_clr(bounds->row[0]+1, dim);
-	bounds->n_row = 1;
-
-	if (bset->n_ineq == 0)
-		return bounds;
-
-	dirs = isl_mat_alloc(bset->ctx, dim, dim);
-	if (!dirs) {
-		isl_mat_free(bounds);
-		return NULL;
-	}
-	isl_seq_cpy(dirs->row[0], bset->ineq[0]+1, dirs->n_col);
-	isl_seq_cpy(bounds->row[1], bset->ineq[0], bounds->n_col);
-	for (j = 1, n = 1; n < dim && j < bset->n_ineq; ++j) {
-		int pos;
-
-		isl_seq_cpy(dirs->row[n], bset->ineq[j]+1, dirs->n_col);
-
-		pos = isl_seq_first_non_zero(dirs->row[n], dirs->n_col);
-		if (pos < 0)
-			continue;
-		for (i = 0; i < n; ++i) {
-			int pos_i;
-			pos_i = isl_seq_first_non_zero(dirs->row[i], dirs->n_col);
-			if (pos_i < pos)
-				continue;
-			if (pos_i > pos)
-				break;
-			isl_seq_elim(dirs->row[n], dirs->row[i], pos,
-					dirs->n_col, NULL);
-			pos = isl_seq_first_non_zero(dirs->row[n], dirs->n_col);
-			if (pos < 0)
-				break;
-		}
-		if (pos < 0)
-			continue;
-		if (i < n) {
-			int k;
-			isl_int *t = dirs->row[n];
-			for (k = n; k > i; --k)
-				dirs->row[k] = dirs->row[k-1];
-			dirs->row[i] = t;
-		}
-		++n;
-		isl_seq_cpy(bounds->row[n], bset->ineq[j], bounds->n_col);
-	}
-	isl_mat_free(dirs);
-	bounds->n_row = 1+n;
-	return bounds;
-}
-
-static void swap_inequality(struct isl_basic_set *bset, int a, int b)
-{
-	isl_int *t = bset->ineq[a];
-	bset->ineq[a] = bset->ineq[b];
-	bset->ineq[b] = t;
-}
-
-/* Skew into positive orthant and project out lineality space.
- *
- * We perform a unimodular transformation that turns a selected
- * maximal set of linearly independent bounds into constraints
- * on the first dimensions that impose that these first dimensions
- * are non-negative.  In particular, the constraint matrix is lower
- * triangular with positive entries on the diagonal and negative
- * entries below.
- * If "bset" has a lineality space then these constraints (and therefore
- * all constraints in bset) only involve the first dimensions.
- * The remaining dimensions then do not appear in any constraints and
- * we can select any value for them, say zero.  We therefore project
- * out this final dimensions and plug in the value zero later.  This
- * is accomplished by simply dropping the final columns of
- * the unimodular transformation.
- */
-static struct isl_basic_set *isl_basic_set_skew_to_positive_orthant(
-	struct isl_basic_set *bset, struct isl_mat **T)
-{
-	struct isl_mat *U = NULL;
-	struct isl_mat *bounds = NULL;
-	int i, j;
-	unsigned old_dim, new_dim;
-
-	*T = NULL;
-	if (!bset)
-		return NULL;
-
-	isl_assert(bset->ctx, isl_basic_set_n_param(bset) == 0, goto error);
-	isl_assert(bset->ctx, bset->n_div == 0, goto error);
-	isl_assert(bset->ctx, bset->n_eq == 0, goto error);
-	
-	old_dim = isl_basic_set_n_dim(bset);
-	/* Try to move (multiples of) unit rows up. */
-	for (i = 0, j = 0; i < bset->n_ineq; ++i) {
-		int pos = isl_seq_first_non_zero(bset->ineq[i]+1, old_dim);
-		if (pos < 0)
-			continue;
-		if (isl_seq_first_non_zero(bset->ineq[i]+1+pos+1,
-						old_dim-pos-1) >= 0)
-			continue;
-		if (i != j)
-			swap_inequality(bset, i, j);
-		++j;
-	}
-	bounds = independent_bounds(bset);
-	if (!bounds)
-		goto error;
-	new_dim = bounds->n_row - 1;
-	bounds = isl_mat_left_hermite(bounds, 1, &U, NULL);
-	if (!bounds)
-		goto error;
-	U = isl_mat_drop_cols(U, 1 + new_dim, old_dim - new_dim);
-	bset = isl_basic_set_preimage(bset, isl_mat_copy(U));
-	if (!bset)
-		goto error;
-	*T = U;
-	isl_mat_free(bounds);
-	return bset;
-error:
-	isl_mat_free(bounds);
-	isl_mat_free(U);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Find a sample integer point, if any, in bset, which is known
- * to have equalities.  If bset contains no integer points, then
- * return a zero-length vector.
- * We simply remove the known equalities, compute a sample
- * in the resulting bset, using the specified recurse function,
- * and then transform the sample back to the original space.
- */
-static struct isl_vec *sample_eq(struct isl_basic_set *bset,
-	struct isl_vec *(*recurse)(struct isl_basic_set *))
-{
-	struct isl_mat *T;
-	struct isl_vec *sample;
-
-	if (!bset)
-		return NULL;
-
-	bset = isl_basic_set_remove_equalities(bset, &T, NULL);
-	sample = recurse(bset);
-	if (!sample || sample->size == 0)
-		isl_mat_free(T);
-	else
-		sample = isl_mat_vec_product(T, sample);
-	return sample;
-}
-
-/* Return a matrix containing the equalities of the tableau
- * in constraint form.  The tableau is assumed to have
- * an associated bset that has been kept up-to-date.
- */
-static struct isl_mat *tab_equalities(struct isl_tab *tab)
-{
-	int i, j;
-	int n_eq;
-	struct isl_mat *eq;
-	struct isl_basic_set *bset;
-
-	if (!tab)
-		return NULL;
-
-	bset = isl_tab_peek_bset(tab);
-	isl_assert(tab->mat->ctx, bset, return NULL);
-
-	n_eq = tab->n_var - tab->n_col + tab->n_dead;
-	if (tab->empty || n_eq == 0)
-		return isl_mat_alloc(tab->mat->ctx, 0, tab->n_var);
-	if (n_eq == tab->n_var)
-		return isl_mat_identity(tab->mat->ctx, tab->n_var);
-
-	eq = isl_mat_alloc(tab->mat->ctx, n_eq, tab->n_var);
-	if (!eq)
-		return NULL;
-	for (i = 0, j = 0; i < tab->n_con; ++i) {
-		if (tab->con[i].is_row)
-			continue;
-		if (tab->con[i].index >= 0 && tab->con[i].index >= tab->n_dead)
-			continue;
-		if (i < bset->n_eq)
-			isl_seq_cpy(eq->row[j], bset->eq[i] + 1, tab->n_var);
-		else
-			isl_seq_cpy(eq->row[j],
-				    bset->ineq[i - bset->n_eq] + 1, tab->n_var);
-		++j;
-	}
-	isl_assert(bset->ctx, j == n_eq, goto error);
-	return eq;
-error:
-	isl_mat_free(eq);
-	return NULL;
-}
-
-/* Compute and return an initial basis for the bounded tableau "tab".
- *
- * If the tableau is either full-dimensional or zero-dimensional,
- * the we simply return an identity matrix.
- * Otherwise, we construct a basis whose first directions correspond
- * to equalities.
- */
-static struct isl_mat *initial_basis(struct isl_tab *tab)
-{
-	int n_eq;
-	struct isl_mat *eq;
-	struct isl_mat *Q;
-
-	tab->n_unbounded = 0;
-	tab->n_zero = n_eq = tab->n_var - tab->n_col + tab->n_dead;
-	if (tab->empty || n_eq == 0 || n_eq == tab->n_var)
-		return isl_mat_identity(tab->mat->ctx, 1 + tab->n_var);
-
-	eq = tab_equalities(tab);
-	eq = isl_mat_left_hermite(eq, 0, NULL, &Q);
-	if (!eq)
-		return NULL;
-	isl_mat_free(eq);
-
-	Q = isl_mat_lin_to_aff(Q);
-	return Q;
-}
-
-/* Given a tableau representing a set, find and return
- * an integer point in the set, if there is any.
- *
- * We perform a depth first search
- * for an integer point, by scanning all possible values in the range
- * attained by a basis vector, where an initial basis may have been set
- * by the calling function.  Otherwise an initial basis that exploits
- * the equalities in the tableau is created.
- * tab->n_zero is currently ignored and is clobbered by this function.
- *
- * The tableau is allowed to have unbounded direction, but then
- * the calling function needs to set an initial basis, with the
- * unbounded directions last and with tab->n_unbounded set
- * to the number of unbounded directions.
- * Furthermore, the calling functions needs to add shifted copies
- * of all constraints involving unbounded directions to ensure
- * that any feasible rational value in these directions can be rounded
- * up to yield a feasible integer value.
- * In particular, let B define the given basis x' = B x
- * and let T be the inverse of B, i.e., X = T x'.
- * Let a x + c >= 0 be a constraint of the set represented by the tableau,
- * or a T x' + c >= 0 in terms of the given basis.  Assume that
- * the bounded directions have an integer value, then we can safely
- * round up the values for the unbounded directions if we make sure
- * that x' not only satisfies the original constraint, but also
- * the constraint "a T x' + c + s >= 0" with s the sum of all
- * negative values in the last n_unbounded entries of "a T".
- * The calling function therefore needs to add the constraint
- * a x + c + s >= 0.  The current function then scans the first
- * directions for an integer value and once those have been found,
- * it can compute "T ceil(B x)" to yield an integer point in the set.
- * Note that during the search, the first rows of B may be changed
- * by a basis reduction, but the last n_unbounded rows of B remain
- * unaltered and are also not mixed into the first rows.
- *
- * The search is implemented iteratively.  "level" identifies the current
- * basis vector.  "init" is true if we want the first value at the current
- * level and false if we want the next value.
- *
- * The initial basis is the identity matrix.  If the range in some direction
- * contains more than one integer value, we perform basis reduction based
- * on the value of ctx->opt->gbr
- *	- ISL_GBR_NEVER:	never perform basis reduction
- *	- ISL_GBR_ONCE:		only perform basis reduction the first
- *				time such a range is encountered
- *	- ISL_GBR_ALWAYS:	always perform basis reduction when
- *				such a range is encountered
- *
- * When ctx->opt->gbr is set to ISL_GBR_ALWAYS, then we allow the basis
- * reduction computation to return early.  That is, as soon as it
- * finds a reasonable first direction.
- */ 
-struct isl_vec *isl_tab_sample(struct isl_tab *tab)
-{
-	unsigned dim;
-	unsigned gbr;
-	struct isl_ctx *ctx;
-	struct isl_vec *sample;
-	struct isl_vec *min;
-	struct isl_vec *max;
-	enum isl_lp_result res;
-	int level;
-	int init;
-	int reduced;
-	struct isl_tab_undo **snap;
-
-	if (!tab)
-		return NULL;
-	if (tab->empty)
-		return isl_vec_alloc(tab->mat->ctx, 0);
-
-	if (!tab->basis)
-		tab->basis = initial_basis(tab);
-	if (!tab->basis)
-		return NULL;
-	isl_assert(tab->mat->ctx, tab->basis->n_row == tab->n_var + 1,
-		    return NULL);
-	isl_assert(tab->mat->ctx, tab->basis->n_col == tab->n_var + 1,
-		    return NULL);
-
-	ctx = tab->mat->ctx;
-	dim = tab->n_var;
-	gbr = ctx->opt->gbr;
-
-	if (tab->n_unbounded == tab->n_var) {
-		sample = isl_tab_get_sample_value(tab);
-		sample = isl_mat_vec_product(isl_mat_copy(tab->basis), sample);
-		sample = isl_vec_ceil(sample);
-		sample = isl_mat_vec_inverse_product(isl_mat_copy(tab->basis),
-							sample);
-		return sample;
-	}
-
-	if (isl_tab_extend_cons(tab, dim + 1) < 0)
-		return NULL;
-
-	min = isl_vec_alloc(ctx, dim);
-	max = isl_vec_alloc(ctx, dim);
-	snap = isl_alloc_array(ctx, struct isl_tab_undo *, dim);
-
-	if (!min || !max || !snap)
-		goto error;
-
-	level = 0;
-	init = 1;
-	reduced = 0;
-
-	while (level >= 0) {
-		int empty = 0;
-		if (init) {
-			res = isl_tab_min(tab, tab->basis->row[1 + level],
-				    ctx->one, &min->el[level], NULL, 0);
-			if (res == isl_lp_empty)
-				empty = 1;
-			isl_assert(ctx, res != isl_lp_unbounded, goto error);
-			if (res == isl_lp_error)
-				goto error;
-			if (!empty && isl_tab_sample_is_integer(tab))
-				break;
-			isl_seq_neg(tab->basis->row[1 + level] + 1,
-				    tab->basis->row[1 + level] + 1, dim);
-			res = isl_tab_min(tab, tab->basis->row[1 + level],
-				    ctx->one, &max->el[level], NULL, 0);
-			isl_seq_neg(tab->basis->row[1 + level] + 1,
-				    tab->basis->row[1 + level] + 1, dim);
-			isl_int_neg(max->el[level], max->el[level]);
-			if (res == isl_lp_empty)
-				empty = 1;
-			isl_assert(ctx, res != isl_lp_unbounded, goto error);
-			if (res == isl_lp_error)
-				goto error;
-			if (!empty && isl_tab_sample_is_integer(tab))
-				break;
-			if (!empty && !reduced &&
-			    ctx->opt->gbr != ISL_GBR_NEVER &&
-			    isl_int_lt(min->el[level], max->el[level])) {
-				unsigned gbr_only_first;
-				if (ctx->opt->gbr == ISL_GBR_ONCE)
-					ctx->opt->gbr = ISL_GBR_NEVER;
-				tab->n_zero = level;
-				gbr_only_first = ctx->opt->gbr_only_first;
-				ctx->opt->gbr_only_first =
-					ctx->opt->gbr == ISL_GBR_ALWAYS;
-				tab = isl_tab_compute_reduced_basis(tab);
-				ctx->opt->gbr_only_first = gbr_only_first;
-				if (!tab || !tab->basis)
-					goto error;
-				reduced = 1;
-				continue;
-			}
-			reduced = 0;
-			snap[level] = isl_tab_snap(tab);
-		} else
-			isl_int_add_ui(min->el[level], min->el[level], 1);
-
-		if (empty || isl_int_gt(min->el[level], max->el[level])) {
-			level--;
-			init = 0;
-			if (level >= 0)
-				if (isl_tab_rollback(tab, snap[level]) < 0)
-					goto error;
-			continue;
-		}
-		isl_int_neg(tab->basis->row[1 + level][0], min->el[level]);
-		if (isl_tab_add_valid_eq(tab, tab->basis->row[1 + level]) < 0)
-			goto error;
-		isl_int_set_si(tab->basis->row[1 + level][0], 0);
-		if (level + tab->n_unbounded < dim - 1) {
-			++level;
-			init = 1;
-			continue;
-		}
-		break;
-	}
-
-	if (level >= 0) {
-		sample = isl_tab_get_sample_value(tab);
-		if (!sample)
-			goto error;
-		if (tab->n_unbounded && !isl_int_is_one(sample->el[0])) {
-			sample = isl_mat_vec_product(isl_mat_copy(tab->basis),
-						     sample);
-			sample = isl_vec_ceil(sample);
-			sample = isl_mat_vec_inverse_product(
-					isl_mat_copy(tab->basis), sample);
-		}
-	} else
-		sample = isl_vec_alloc(ctx, 0);
-
-	ctx->opt->gbr = gbr;
-	isl_vec_free(min);
-	isl_vec_free(max);
-	free(snap);
-	return sample;
-error:
-	ctx->opt->gbr = gbr;
-	isl_vec_free(min);
-	isl_vec_free(max);
-	free(snap);
-	return NULL;
-}
-
-static struct isl_vec *sample_bounded(struct isl_basic_set *bset);
-
-/* Compute a sample point of the given basic set, based on the given,
- * non-trivial factorization.
- */
-static __isl_give isl_vec *factored_sample(__isl_take isl_basic_set *bset,
-	__isl_take isl_factorizer *f)
-{
-	int i, n;
-	isl_vec *sample = NULL;
-	isl_ctx *ctx;
-	unsigned nparam;
-	unsigned nvar;
-
-	ctx = isl_basic_set_get_ctx(bset);
-	if (!ctx)
-		goto error;
-
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-
-	sample = isl_vec_alloc(ctx, 1 + isl_basic_set_total_dim(bset));
-	if (!sample)
-		goto error;
-	isl_int_set_si(sample->el[0], 1);
-
-	bset = isl_morph_basic_set(isl_morph_copy(f->morph), bset);
-
-	for (i = 0, n = 0; i < f->n_group; ++i) {
-		isl_basic_set *bset_i;
-		isl_vec *sample_i;
-
-		bset_i = isl_basic_set_copy(bset);
-		bset_i = isl_basic_set_drop_constraints_involving(bset_i,
-			    nparam + n + f->len[i], nvar - n - f->len[i]);
-		bset_i = isl_basic_set_drop_constraints_involving(bset_i,
-			    nparam, n);
-		bset_i = isl_basic_set_drop(bset_i, isl_dim_set,
-			    n + f->len[i], nvar - n - f->len[i]);
-		bset_i = isl_basic_set_drop(bset_i, isl_dim_set, 0, n);
-
-		sample_i = sample_bounded(bset_i);
-		if (!sample_i)
-			goto error;
-		if (sample_i->size == 0) {
-			isl_basic_set_free(bset);
-			isl_factorizer_free(f);
-			isl_vec_free(sample);
-			return sample_i;
-		}
-		isl_seq_cpy(sample->el + 1 + nparam + n,
-			    sample_i->el + 1, f->len[i]);
-		isl_vec_free(sample_i);
-
-		n += f->len[i];
-	}
-
-	f->morph = isl_morph_inverse(f->morph);
-	sample = isl_morph_vec(isl_morph_copy(f->morph), sample);
-
-	isl_basic_set_free(bset);
-	isl_factorizer_free(f);
-	return sample;
-error:
-	isl_basic_set_free(bset);
-	isl_factorizer_free(f);
-	isl_vec_free(sample);
-	return NULL;
-}
-
-/* Given a basic set that is known to be bounded, find and return
- * an integer point in the basic set, if there is any.
- *
- * After handling some trivial cases, we construct a tableau
- * and then use isl_tab_sample to find a sample, passing it
- * the identity matrix as initial basis.
- */ 
-static struct isl_vec *sample_bounded(struct isl_basic_set *bset)
-{
-	unsigned dim;
-	struct isl_ctx *ctx;
-	struct isl_vec *sample;
-	struct isl_tab *tab = NULL;
-	isl_factorizer *f;
-
-	if (!bset)
-		return NULL;
-
-	if (isl_basic_set_plain_is_empty(bset))
-		return empty_sample(bset);
-
-	dim = isl_basic_set_total_dim(bset);
-	if (dim == 0)
-		return zero_sample(bset);
-	if (dim == 1)
-		return interval_sample(bset);
-	if (bset->n_eq > 0)
-		return sample_eq(bset, sample_bounded);
-
-	f = isl_basic_set_factorizer(bset);
-	if (!f)
-		goto error;
-	if (f->n_group != 0)
-		return factored_sample(bset, f);
-	isl_factorizer_free(f);
-		
-	ctx = bset->ctx;
-
-	tab = isl_tab_from_basic_set(bset);
-	if (tab && tab->empty) {
-		isl_tab_free(tab);
-		ISL_F_SET(bset, ISL_BASIC_SET_EMPTY);
-		sample = isl_vec_alloc(bset->ctx, 0);
-		isl_basic_set_free(bset);
-		return sample;
-	}
-
-	if (isl_tab_track_bset(tab, isl_basic_set_copy(bset)) < 0)
-		goto error;
-	if (!ISL_F_ISSET(bset, ISL_BASIC_SET_NO_IMPLICIT))
-		if (isl_tab_detect_implicit_equalities(tab) < 0)
-			goto error;
-
-	sample = isl_tab_sample(tab);
-	if (!sample)
-		goto error;
-
-	if (sample->size > 0) {
-		isl_vec_free(bset->sample);
-		bset->sample = isl_vec_copy(sample);
-	}
-
-	isl_basic_set_free(bset);
-	isl_tab_free(tab);
-	return sample;
-error:
-	isl_basic_set_free(bset);
-	isl_tab_free(tab);
-	return NULL;
-}
-
-/* Given a basic set "bset" and a value "sample" for the first coordinates
- * of bset, plug in these values and drop the corresponding coordinates.
- *
- * We do this by computing the preimage of the transformation
- *
- *	     [ 1 0 ]
- *	x =  [ s 0 ] x'
- *	     [ 0 I ]
- *
- * where [1 s] is the sample value and I is the identity matrix of the
- * appropriate dimension.
- */
-static struct isl_basic_set *plug_in(struct isl_basic_set *bset,
-	struct isl_vec *sample)
-{
-	int i;
-	unsigned total;
-	struct isl_mat *T;
-
-	if (!bset || !sample)
-		goto error;
-
-	total = isl_basic_set_total_dim(bset);
-	T = isl_mat_alloc(bset->ctx, 1 + total, 1 + total - (sample->size - 1));
-	if (!T)
-		goto error;
-
-	for (i = 0; i < sample->size; ++i) {
-		isl_int_set(T->row[i][0], sample->el[i]);
-		isl_seq_clr(T->row[i] + 1, T->n_col - 1);
-	}
-	for (i = 0; i < T->n_col - 1; ++i) {
-		isl_seq_clr(T->row[sample->size + i], T->n_col);
-		isl_int_set_si(T->row[sample->size + i][1 + i], 1);
-	}
-	isl_vec_free(sample);
-
-	bset = isl_basic_set_preimage(bset, T);
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	isl_vec_free(sample);
-	return NULL;
-}
-
-/* Given a basic set "bset", return any (possibly non-integer) point
- * in the basic set.
- */
-static struct isl_vec *rational_sample(struct isl_basic_set *bset)
-{
-	struct isl_tab *tab;
-	struct isl_vec *sample;
-
-	if (!bset)
-		return NULL;
-
-	tab = isl_tab_from_basic_set(bset);
-	sample = isl_tab_get_sample_value(tab);
-	isl_tab_free(tab);
-
-	isl_basic_set_free(bset);
-
-	return sample;
-}
-
-/* Given a linear cone "cone" and a rational point "vec",
- * construct a polyhedron with shifted copies of the constraints in "cone",
- * i.e., a polyhedron with "cone" as its recession cone, such that each
- * point x in this polyhedron is such that the unit box positioned at x
- * lies entirely inside the affine cone 'vec + cone'.
- * Any rational point in this polyhedron may therefore be rounded up
- * to yield an integer point that lies inside said affine cone.
- *
- * Denote the constraints of cone by "<a_i, x> >= 0" and the rational
- * point "vec" by v/d.
- * Let b_i = <a_i, v>.  Then the affine cone 'vec + cone' is given
- * by <a_i, x> - b/d >= 0.
- * The polyhedron <a_i, x> - ceil{b/d} >= 0 is a subset of this affine cone.
- * We prefer this polyhedron over the actual affine cone because it doesn't
- * require a scaling of the constraints.
- * If each of the vertices of the unit cube positioned at x lies inside
- * this polyhedron, then the whole unit cube at x lies inside the affine cone.
- * We therefore impose that x' = x + \sum e_i, for any selection of unit
- * vectors lies inside the polyhedron, i.e.,
- *
- *	<a_i, x'> - ceil{b/d} = <a_i, x> + sum a_i - ceil{b/d} >= 0
- *
- * The most stringent of these constraints is the one that selects
- * all negative a_i, so the polyhedron we are looking for has constraints
- *
- *	<a_i, x> + sum_{a_i < 0} a_i - ceil{b/d} >= 0
- *
- * Note that if cone were known to have only non-negative rays
- * (which can be accomplished by a unimodular transformation),
- * then we would only have to check the points x' = x + e_i
- * and we only have to add the smallest negative a_i (if any)
- * instead of the sum of all negative a_i.
- */
-static struct isl_basic_set *shift_cone(struct isl_basic_set *cone,
-	struct isl_vec *vec)
-{
-	int i, j, k;
-	unsigned total;
-
-	struct isl_basic_set *shift = NULL;
-
-	if (!cone || !vec)
-		goto error;
-
-	isl_assert(cone->ctx, cone->n_eq == 0, goto error);
-
-	total = isl_basic_set_total_dim(cone);
-
-	shift = isl_basic_set_alloc_space(isl_basic_set_get_space(cone),
-					0, 0, cone->n_ineq);
-
-	for (i = 0; i < cone->n_ineq; ++i) {
-		k = isl_basic_set_alloc_inequality(shift);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(shift->ineq[k] + 1, cone->ineq[i] + 1, total);
-		isl_seq_inner_product(shift->ineq[k] + 1, vec->el + 1, total,
-				      &shift->ineq[k][0]);
-		isl_int_cdiv_q(shift->ineq[k][0],
-			       shift->ineq[k][0], vec->el[0]);
-		isl_int_neg(shift->ineq[k][0], shift->ineq[k][0]);
-		for (j = 0; j < total; ++j) {
-			if (isl_int_is_nonneg(shift->ineq[k][1 + j]))
-				continue;
-			isl_int_add(shift->ineq[k][0],
-				    shift->ineq[k][0], shift->ineq[k][1 + j]);
-		}
-	}
-
-	isl_basic_set_free(cone);
-	isl_vec_free(vec);
-
-	return isl_basic_set_finalize(shift);
-error:
-	isl_basic_set_free(shift);
-	isl_basic_set_free(cone);
-	isl_vec_free(vec);
-	return NULL;
-}
-
-/* Given a rational point vec in a (transformed) basic set,
- * such that cone is the recession cone of the original basic set,
- * "round up" the rational point to an integer point.
- *
- * We first check if the rational point just happens to be integer.
- * If not, we transform the cone in the same way as the basic set,
- * pick a point x in this cone shifted to the rational point such that
- * the whole unit cube at x is also inside this affine cone.
- * Then we simply round up the coordinates of x and return the
- * resulting integer point.
- */
-static struct isl_vec *round_up_in_cone(struct isl_vec *vec,
-	struct isl_basic_set *cone, struct isl_mat *U)
-{
-	unsigned total;
-
-	if (!vec || !cone || !U)
-		goto error;
-
-	isl_assert(vec->ctx, vec->size != 0, goto error);
-	if (isl_int_is_one(vec->el[0])) {
-		isl_mat_free(U);
-		isl_basic_set_free(cone);
-		return vec;
-	}
-
-	total = isl_basic_set_total_dim(cone);
-	cone = isl_basic_set_preimage(cone, U);
-	cone = isl_basic_set_remove_dims(cone, isl_dim_set,
-					 0, total - (vec->size - 1));
-
-	cone = shift_cone(cone, vec);
-
-	vec = rational_sample(cone);
-	vec = isl_vec_ceil(vec);
-	return vec;
-error:
-	isl_mat_free(U);
-	isl_vec_free(vec);
-	isl_basic_set_free(cone);
-	return NULL;
-}
-
-/* Concatenate two integer vectors, i.e., two vectors with denominator
- * (stored in element 0) equal to 1.
- */
-static struct isl_vec *vec_concat(struct isl_vec *vec1, struct isl_vec *vec2)
-{
-	struct isl_vec *vec;
-
-	if (!vec1 || !vec2)
-		goto error;
-	isl_assert(vec1->ctx, vec1->size > 0, goto error);
-	isl_assert(vec2->ctx, vec2->size > 0, goto error);
-	isl_assert(vec1->ctx, isl_int_is_one(vec1->el[0]), goto error);
-	isl_assert(vec2->ctx, isl_int_is_one(vec2->el[0]), goto error);
-
-	vec = isl_vec_alloc(vec1->ctx, vec1->size + vec2->size - 1);
-	if (!vec)
-		goto error;
-
-	isl_seq_cpy(vec->el, vec1->el, vec1->size);
-	isl_seq_cpy(vec->el + vec1->size, vec2->el + 1, vec2->size - 1);
-
-	isl_vec_free(vec1);
-	isl_vec_free(vec2);
-
-	return vec;
-error:
-	isl_vec_free(vec1);
-	isl_vec_free(vec2);
-	return NULL;
-}
-
-/* Give a basic set "bset" with recession cone "cone", compute and
- * return an integer point in bset, if any.
- *
- * If the recession cone is full-dimensional, then we know that
- * bset contains an infinite number of integer points and it is
- * fairly easy to pick one of them.
- * If the recession cone is not full-dimensional, then we first
- * transform bset such that the bounded directions appear as
- * the first dimensions of the transformed basic set.
- * We do this by using a unimodular transformation that transforms
- * the equalities in the recession cone to equalities on the first
- * dimensions.
- *
- * The transformed set is then projected onto its bounded dimensions.
- * Note that to compute this projection, we can simply drop all constraints
- * involving any of the unbounded dimensions since these constraints
- * cannot be combined to produce a constraint on the bounded dimensions.
- * To see this, assume that there is such a combination of constraints
- * that produces a constraint on the bounded dimensions.  This means
- * that some combination of the unbounded dimensions has both an upper
- * bound and a lower bound in terms of the bounded dimensions, but then
- * this combination would be a bounded direction too and would have been
- * transformed into a bounded dimensions.
- *
- * We then compute a sample value in the bounded dimensions.
- * If no such value can be found, then the original set did not contain
- * any integer points and we are done.
- * Otherwise, we plug in the value we found in the bounded dimensions,
- * project out these bounded dimensions and end up with a set with
- * a full-dimensional recession cone.
- * A sample point in this set is computed by "rounding up" any
- * rational point in the set.
- *
- * The sample points in the bounded and unbounded dimensions are
- * then combined into a single sample point and transformed back
- * to the original space.
- */
-__isl_give isl_vec *isl_basic_set_sample_with_cone(
-	__isl_take isl_basic_set *bset, __isl_take isl_basic_set *cone)
-{
-	unsigned total;
-	unsigned cone_dim;
-	struct isl_mat *M, *U;
-	struct isl_vec *sample;
-	struct isl_vec *cone_sample;
-	struct isl_ctx *ctx;
-	struct isl_basic_set *bounded;
-
-	if (!bset || !cone)
-		goto error;
-
-	ctx = bset->ctx;
-	total = isl_basic_set_total_dim(cone);
-	cone_dim = total - cone->n_eq;
-
-	M = isl_mat_sub_alloc6(bset->ctx, cone->eq, 0, cone->n_eq, 1, total);
-	M = isl_mat_left_hermite(M, 0, &U, NULL);
-	if (!M)
-		goto error;
-	isl_mat_free(M);
-
-	U = isl_mat_lin_to_aff(U);
-	bset = isl_basic_set_preimage(bset, isl_mat_copy(U));
-
-	bounded = isl_basic_set_copy(bset);
-	bounded = isl_basic_set_drop_constraints_involving(bounded,
-						   total - cone_dim, cone_dim);
-	bounded = isl_basic_set_drop_dims(bounded, total - cone_dim, cone_dim);
-	sample = sample_bounded(bounded);
-	if (!sample || sample->size == 0) {
-		isl_basic_set_free(bset);
-		isl_basic_set_free(cone);
-		isl_mat_free(U);
-		return sample;
-	}
-	bset = plug_in(bset, isl_vec_copy(sample));
-	cone_sample = rational_sample(bset);
-	cone_sample = round_up_in_cone(cone_sample, cone, isl_mat_copy(U));
-	sample = vec_concat(sample, cone_sample);
-	sample = isl_mat_vec_product(U, sample);
-	return sample;
-error:
-	isl_basic_set_free(cone);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-static void vec_sum_of_neg(struct isl_vec *v, isl_int *s)
-{
-	int i;
-
-	isl_int_set_si(*s, 0);
-
-	for (i = 0; i < v->size; ++i)
-		if (isl_int_is_neg(v->el[i]))
-			isl_int_add(*s, *s, v->el[i]);
-}
-
-/* Given a tableau "tab", a tableau "tab_cone" that corresponds
- * to the recession cone and the inverse of a new basis U = inv(B),
- * with the unbounded directions in B last,
- * add constraints to "tab" that ensure any rational value
- * in the unbounded directions can be rounded up to an integer value.
- *
- * The new basis is given by x' = B x, i.e., x = U x'.
- * For any rational value of the last tab->n_unbounded coordinates
- * in the update tableau, the value that is obtained by rounding
- * up this value should be contained in the original tableau.
- * For any constraint "a x + c >= 0", we therefore need to add
- * a constraint "a x + c + s >= 0", with s the sum of all negative
- * entries in the last elements of "a U".
- *
- * Since we are not interested in the first entries of any of the "a U",
- * we first drop the columns of U that correpond to bounded directions.
- */
-static int tab_shift_cone(struct isl_tab *tab,
-	struct isl_tab *tab_cone, struct isl_mat *U)
-{
-	int i;
-	isl_int v;
-	struct isl_basic_set *bset = NULL;
-
-	if (tab && tab->n_unbounded == 0) {
-		isl_mat_free(U);
-		return 0;
-	}
-	isl_int_init(v);
-	if (!tab || !tab_cone || !U)
-		goto error;
-	bset = isl_tab_peek_bset(tab_cone);
-	U = isl_mat_drop_cols(U, 0, tab->n_var - tab->n_unbounded);
-	for (i = 0; i < bset->n_ineq; ++i) {
-		int ok;
-		struct isl_vec *row = NULL;
-		if (isl_tab_is_equality(tab_cone, tab_cone->n_eq + i))
-			continue;
-		row = isl_vec_alloc(bset->ctx, tab_cone->n_var);
-		if (!row)
-			goto error;
-		isl_seq_cpy(row->el, bset->ineq[i] + 1, tab_cone->n_var);
-		row = isl_vec_mat_product(row, isl_mat_copy(U));
-		if (!row)
-			goto error;
-		vec_sum_of_neg(row, &v);
-		isl_vec_free(row);
-		if (isl_int_is_zero(v))
-			continue;
-		tab = isl_tab_extend(tab, 1);
-		isl_int_add(bset->ineq[i][0], bset->ineq[i][0], v);
-		ok = isl_tab_add_ineq(tab, bset->ineq[i]) >= 0;
-		isl_int_sub(bset->ineq[i][0], bset->ineq[i][0], v);
-		if (!ok)
-			goto error;
-	}
-
-	isl_mat_free(U);
-	isl_int_clear(v);
-	return 0;
-error:
-	isl_mat_free(U);
-	isl_int_clear(v);
-	return -1;
-}
-
-/* Compute and return an initial basis for the possibly
- * unbounded tableau "tab".  "tab_cone" is a tableau
- * for the corresponding recession cone.
- * Additionally, add constraints to "tab" that ensure
- * that any rational value for the unbounded directions
- * can be rounded up to an integer value.
- *
- * If the tableau is bounded, i.e., if the recession cone
- * is zero-dimensional, then we just use inital_basis.
- * Otherwise, we construct a basis whose first directions
- * correspond to equalities, followed by bounded directions,
- * i.e., equalities in the recession cone.
- * The remaining directions are then unbounded.
- */
-int isl_tab_set_initial_basis_with_cone(struct isl_tab *tab,
-	struct isl_tab *tab_cone)
-{
-	struct isl_mat *eq;
-	struct isl_mat *cone_eq;
-	struct isl_mat *U, *Q;
-
-	if (!tab || !tab_cone)
-		return -1;
-
-	if (tab_cone->n_col == tab_cone->n_dead) {
-		tab->basis = initial_basis(tab);
-		return tab->basis ? 0 : -1;
-	}
-
-	eq = tab_equalities(tab);
-	if (!eq)
-		return -1;
-	tab->n_zero = eq->n_row;
-	cone_eq = tab_equalities(tab_cone);
-	eq = isl_mat_concat(eq, cone_eq);
-	if (!eq)
-		return -1;
-	tab->n_unbounded = tab->n_var - (eq->n_row - tab->n_zero);
-	eq = isl_mat_left_hermite(eq, 0, &U, &Q);
-	if (!eq)
-		return -1;
-	isl_mat_free(eq);
-	tab->basis = isl_mat_lin_to_aff(Q);
-	if (tab_shift_cone(tab, tab_cone, U) < 0)
-		return -1;
-	if (!tab->basis)
-		return -1;
-	return 0;
-}
-
-/* Compute and return a sample point in bset using generalized basis
- * reduction.  We first check if the input set has a non-trivial
- * recession cone.  If so, we perform some extra preprocessing in
- * sample_with_cone.  Otherwise, we directly perform generalized basis
- * reduction.
- */
-static struct isl_vec *gbr_sample(struct isl_basic_set *bset)
-{
-	unsigned dim;
-	struct isl_basic_set *cone;
-
-	dim = isl_basic_set_total_dim(bset);
-
-	cone = isl_basic_set_recession_cone(isl_basic_set_copy(bset));
-	if (!cone)
-		goto error;
-
-	if (cone->n_eq < dim)
-		return isl_basic_set_sample_with_cone(bset, cone);
-
-	isl_basic_set_free(cone);
-	return sample_bounded(bset);
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-static struct isl_vec *pip_sample(struct isl_basic_set *bset)
-{
-	struct isl_mat *T;
-	struct isl_ctx *ctx;
-	struct isl_vec *sample;
-
-	bset = isl_basic_set_skew_to_positive_orthant(bset, &T);
-	if (!bset)
-		return NULL;
-
-	ctx = bset->ctx;
-	sample = isl_pip_basic_set_sample(bset);
-
-	if (sample && sample->size != 0)
-		sample = isl_mat_vec_product(T, sample);
-	else
-		isl_mat_free(T);
-
-	return sample;
-}
-
-static struct isl_vec *basic_set_sample(struct isl_basic_set *bset, int bounded)
-{
-	struct isl_ctx *ctx;
-	unsigned dim;
-	if (!bset)
-		return NULL;
-
-	ctx = bset->ctx;
-	if (isl_basic_set_plain_is_empty(bset))
-		return empty_sample(bset);
-
-	dim = isl_basic_set_n_dim(bset);
-	isl_assert(ctx, isl_basic_set_n_param(bset) == 0, goto error);
-	isl_assert(ctx, bset->n_div == 0, goto error);
-
-	if (bset->sample && bset->sample->size == 1 + dim) {
-		int contains = isl_basic_set_contains(bset, bset->sample);
-		if (contains < 0)
-			goto error;
-		if (contains) {
-			struct isl_vec *sample = isl_vec_copy(bset->sample);
-			isl_basic_set_free(bset);
-			return sample;
-		}
-	}
-	isl_vec_free(bset->sample);
-	bset->sample = NULL;
-
-	if (bset->n_eq > 0)
-		return sample_eq(bset, bounded ? isl_basic_set_sample_bounded
-					       : isl_basic_set_sample_vec);
-	if (dim == 0)
-		return zero_sample(bset);
-	if (dim == 1)
-		return interval_sample(bset);
-
-	switch (bset->ctx->opt->ilp_solver) {
-	case ISL_ILP_PIP:
-		return pip_sample(bset);
-	case ISL_ILP_GBR:
-		return bounded ? sample_bounded(bset) : gbr_sample(bset);
-	}
-	isl_assert(bset->ctx, 0, );
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-__isl_give isl_vec *isl_basic_set_sample_vec(__isl_take isl_basic_set *bset)
-{
-	return basic_set_sample(bset, 0);
-}
-
-/* Compute an integer sample in "bset", where the caller guarantees
- * that "bset" is bounded.
- */
-struct isl_vec *isl_basic_set_sample_bounded(struct isl_basic_set *bset)
-{
-	return basic_set_sample(bset, 1);
-}
-
-__isl_give isl_basic_set *isl_basic_set_from_vec(__isl_take isl_vec *vec)
-{
-	int i;
-	int k;
-	struct isl_basic_set *bset = NULL;
-	struct isl_ctx *ctx;
-	unsigned dim;
-
-	if (!vec)
-		return NULL;
-	ctx = vec->ctx;
-	isl_assert(ctx, vec->size != 0, goto error);
-
-	bset = isl_basic_set_alloc(ctx, 0, vec->size - 1, 0, vec->size - 1, 0);
-	if (!bset)
-		goto error;
-	dim = isl_basic_set_n_dim(bset);
-	for (i = dim - 1; i >= 0; --i) {
-		k = isl_basic_set_alloc_equality(bset);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(bset->eq[k], 1 + dim);
-		isl_int_neg(bset->eq[k][0], vec->el[1 + i]);
-		isl_int_set(bset->eq[k][1 + i], vec->el[0]);
-	}
-	bset->sample = vec;
-
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	isl_vec_free(vec);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_basic_map_sample(__isl_take isl_basic_map *bmap)
-{
-	struct isl_basic_set *bset;
-	struct isl_vec *sample_vec;
-
-	bset = isl_basic_map_underlying_set(isl_basic_map_copy(bmap));
-	sample_vec = isl_basic_set_sample_vec(bset);
-	if (!sample_vec)
-		goto error;
-	if (sample_vec->size == 0) {
-		struct isl_basic_map *sample;
-		sample = isl_basic_map_empty_like(bmap);
-		isl_vec_free(sample_vec);
-		isl_basic_map_free(bmap);
-		return sample;
-	}
-	bset = isl_basic_set_from_vec(sample_vec);
-	return isl_basic_map_overlying_set(bset, bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-__isl_give isl_basic_map *isl_map_sample(__isl_take isl_map *map)
-{
-	int i;
-	isl_basic_map *sample = NULL;
-
-	if (!map)
-		goto error;
-
-	for (i = 0; i < map->n; ++i) {
-		sample = isl_basic_map_sample(isl_basic_map_copy(map->p[i]));
-		if (!sample)
-			goto error;
-		if (!ISL_F_ISSET(sample, ISL_BASIC_MAP_EMPTY))
-			break;
-		isl_basic_map_free(sample);
-	}
-	if (i == map->n)
-		sample = isl_basic_map_empty_like_map(map);
-	isl_map_free(map);
-	return sample;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_set_sample(__isl_take isl_set *set)
-{
-	return (isl_basic_set *) isl_map_sample((isl_map *)set);
-}
-
-__isl_give isl_point *isl_basic_set_sample_point(__isl_take isl_basic_set *bset)
-{
-	isl_vec *vec;
-	isl_space *dim;
-
-	dim = isl_basic_set_get_space(bset);
-	bset = isl_basic_set_underlying_set(bset);
-	vec = isl_basic_set_sample_vec(bset);
-
-	return isl_point_alloc(dim, vec);
-}
-
-__isl_give isl_point *isl_set_sample_point(__isl_take isl_set *set)
-{
-	int i;
-	isl_point *pnt;
-
-	if (!set)
-		return NULL;
-
-	for (i = 0; i < set->n; ++i) {
-		pnt = isl_basic_set_sample_point(isl_basic_set_copy(set->p[i]));
-		if (!pnt)
-			goto error;
-		if (!isl_point_is_void(pnt))
-			break;
-		isl_point_free(pnt);
-	}
-	if (i == set->n)
-		pnt = isl_point_void(isl_set_get_space(set));
-
-	isl_set_free(set);
-	return pnt;
-error:
-	isl_set_free(set);
-	return NULL;
-}
diff --git a/cloog-0.17.0/isl/isl_sample.h b/cloog-0.17.0/isl/isl_sample.h
deleted file mode 100644
index b657e6e..0000000
--- a/cloog-0.17.0/isl/isl_sample.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_SAMPLE_H
-#define ISL_SAMPLE
-
-#include <isl/set.h>
-#include <isl_tab.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-__isl_give isl_vec *isl_basic_set_sample_vec(__isl_take isl_basic_set *bset);
-struct isl_vec *isl_basic_set_sample_bounded(struct isl_basic_set *bset);
-__isl_give isl_vec *isl_basic_set_sample_with_cone(
-	__isl_take isl_basic_set *bset, __isl_take isl_basic_set *cone);
-
-__isl_give isl_basic_set *isl_basic_set_from_vec(__isl_take isl_vec *vec);
-
-int isl_tab_set_initial_basis_with_cone(struct isl_tab *tab,
-	struct isl_tab *tab_cone);
-struct isl_vec *isl_tab_sample(struct isl_tab *tab);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_sample_no_piplib.c b/cloog-0.17.0/isl/isl_sample_no_piplib.c
deleted file mode 100644
index e2c7ea4..0000000
--- a/cloog-0.17.0/isl/isl_sample_no_piplib.c
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include "isl_sample_piplib.h"
-
-struct isl_vec *isl_pip_basic_set_sample(struct isl_basic_set *bset)
-{
-	isl_basic_set_free(bset);
-	return NULL;
-}
diff --git a/cloog-0.17.0/isl/isl_sample_piplib.c b/cloog-0.17.0/isl/isl_sample_piplib.c
deleted file mode 100644
index 3755008..0000000
--- a/cloog-0.17.0/isl/isl_sample_piplib.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl/mat.h>
-#include <isl/vec.h>
-#include <isl/seq.h>
-#include "isl_piplib.h"
-#include "isl_sample_piplib.h"
-
-struct isl_vec *isl_pip_basic_set_sample(struct isl_basic_set *bset)
-{
-	PipOptions	*options = NULL;
-	PipMatrix	*domain = NULL;
-	PipQuast	*sol = NULL;
-	struct isl_vec *vec = NULL;
-	unsigned	dim;
-	struct isl_ctx *ctx;
-
-	if (!bset)
-		goto error;
-	ctx = isl_basic_set_get_ctx(bset);
-	isl_assert(ctx, isl_basic_set_n_param(bset) == 0, goto error);
-	isl_assert(ctx, isl_basic_set_dim(bset, isl_dim_div) == 0, goto error);
-	dim = isl_basic_set_n_dim(bset);
-	domain = isl_basic_map_to_pip((struct isl_basic_map *)bset, 0, 0, 0);
-	if (!domain)
-		goto error;
-
-	options = pip_options_init();
-	if (!options)
-		goto error;
-	sol = pip_solve(domain, NULL, -1, options);
-	if (!sol)
-		goto error;
-	if (!sol->list)
-		vec = isl_vec_alloc(ctx, 0);
-	else {
-		PipList *l;
-		int i;
-		vec = isl_vec_alloc(ctx, 1 + dim);
-		if (!vec)
-			goto error;
-		isl_int_set_si(vec->block.data[0], 1);
-		for (i = 0, l = sol->list; l && i < dim; ++i, l = l->next) {
-			isl_seq_cpy_from_pip(&vec->block.data[1+i],
-					&l->vector->the_vector[0], 1);
-			isl_assert(ctx, !entier_zero_p(l->vector->the_deno[0]),
-					goto error);
-		}
-		isl_assert(ctx, i == dim, goto error);
-	}
-
-	pip_quast_free(sol);
-	pip_options_free(options);
-	pip_matrix_free(domain);
-
-	isl_basic_set_free(bset);
-	return vec;
-error:
-	isl_vec_free(vec);
-	isl_basic_set_free(bset);
-	if (sol)
-		pip_quast_free(sol);
-	if (domain)
-		pip_matrix_free(domain);
-	return NULL;
-}
diff --git a/cloog-0.17.0/isl/isl_sample_piplib.h b/cloog-0.17.0/isl/isl_sample_piplib.h
deleted file mode 100644
index 52f2156..0000000
--- a/cloog-0.17.0/isl/isl_sample_piplib.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_SAMPLE_PIP_H
-#define ISL_SAMPLE_PIP
-
-#include <isl/set.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_vec *isl_pip_basic_set_sample(struct isl_basic_set *bset);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_scan.c b/cloog-0.17.0/isl/isl_scan.c
deleted file mode 100644
index 64654be..0000000
--- a/cloog-0.17.0/isl/isl_scan.c
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include "isl_basis_reduction.h"
-#include "isl_scan.h"
-#include <isl/seq.h>
-#include "isl_tab.h"
-
-struct isl_counter {
-	struct isl_scan_callback callback;
-	isl_int count;
-	isl_int max;
-};
-
-static int increment_counter(struct isl_scan_callback *cb,
-	__isl_take isl_vec *sample)
-{
-	struct isl_counter *cnt = (struct isl_counter *)cb;
-
-	isl_int_add_ui(cnt->count, cnt->count, 1);
-
-	isl_vec_free(sample);
-
-	if (isl_int_is_zero(cnt->max) || isl_int_lt(cnt->count, cnt->max))
-		return 0;
-	return -1;
-}
-
-static int increment_range(struct isl_scan_callback *cb, isl_int min, isl_int max)
-{
-	struct isl_counter *cnt = (struct isl_counter *)cb;
-
-	isl_int_add(cnt->count, cnt->count, max);
-	isl_int_sub(cnt->count, cnt->count, min);
-	isl_int_add_ui(cnt->count, cnt->count, 1);
-
-	if (isl_int_is_zero(cnt->max) || isl_int_lt(cnt->count, cnt->max))
-		return 0;
-	isl_int_set(cnt->count, cnt->max);
-	return -1;
-}
-
-/* Call callback->add with the current sample value of the tableau "tab".
- */
-static int add_solution(struct isl_tab *tab, struct isl_scan_callback *callback)
-{
-	struct isl_vec *sample;
-
-	if (!tab)
-		return -1;
-	sample = isl_tab_get_sample_value(tab);
-	if (!sample)
-		return -1;
-
-	return callback->add(callback, sample);
-}
-
-static int scan_0D(struct isl_basic_set *bset,
-	struct isl_scan_callback *callback)
-{
-	struct isl_vec *sample;
-
-	sample = isl_vec_alloc(bset->ctx, 1);
-	isl_basic_set_free(bset);
-
-	if (!sample)
-		return -1;
-
-	isl_int_set_si(sample->el[0], 1);
-
-	return callback->add(callback, sample);
-}
-
-/* Look for all integer points in "bset", which is assumed to be bounded,
- * and call callback->add on each of them.
- *
- * We first compute a reduced basis for the set and then scan
- * the set in the directions of this basis.
- * We basically perform a depth first search, where in each level i
- * we compute the range in the i-th basis vector direction, given
- * fixed values in the directions of the previous basis vector.
- * We then add an equality to the tableau fixing the value in the
- * direction of the current basis vector to each value in the range
- * in turn and then continue to the next level.
- *
- * The search is implemented iteratively.  "level" identifies the current
- * basis vector.  "init" is true if we want the first value at the current
- * level and false if we want the next value.
- * Solutions are added in the leaves of the search tree, i.e., after
- * we have fixed a value in each direction of the basis.
- */
-int isl_basic_set_scan(struct isl_basic_set *bset,
-	struct isl_scan_callback *callback)
-{
-	unsigned dim;
-	struct isl_mat *B = NULL;
-	struct isl_tab *tab = NULL;
-	struct isl_vec *min;
-	struct isl_vec *max;
-	struct isl_tab_undo **snap;
-	int level;
-	int init;
-	enum isl_lp_result res;
-
-	if (!bset)
-		return -1;
-
-	dim = isl_basic_set_total_dim(bset);
-	if (dim == 0)
-		return scan_0D(bset, callback);
-
-	min = isl_vec_alloc(bset->ctx, dim);
-	max = isl_vec_alloc(bset->ctx, dim);
-	snap = isl_alloc_array(bset->ctx, struct isl_tab_undo *, dim);
-
-	if (!min || !max || !snap)
-		goto error;
-
-	tab = isl_tab_from_basic_set(bset);
-	if (!tab)
-		goto error;
-	if (isl_tab_extend_cons(tab, dim + 1) < 0)
-		goto error;
-
-	tab->basis = isl_mat_identity(bset->ctx, 1 + dim);
-	if (1)
-		tab = isl_tab_compute_reduced_basis(tab);
-	if (!tab)
-		goto error;
-	B = isl_mat_copy(tab->basis);
-	if (!B)
-		goto error;
-
-	level = 0;
-	init = 1;
-
-	while (level >= 0) {
-		int empty = 0;
-		if (init) {
-			res = isl_tab_min(tab, B->row[1 + level],
-				    bset->ctx->one, &min->el[level], NULL, 0);
-			if (res == isl_lp_empty)
-				empty = 1;
-			if (res == isl_lp_error || res == isl_lp_unbounded)
-				goto error;
-			isl_seq_neg(B->row[1 + level] + 1,
-				    B->row[1 + level] + 1, dim);
-			res = isl_tab_min(tab, B->row[1 + level],
-				    bset->ctx->one, &max->el[level], NULL, 0);
-			isl_seq_neg(B->row[1 + level] + 1,
-				    B->row[1 + level] + 1, dim);
-			isl_int_neg(max->el[level], max->el[level]);
-			if (res == isl_lp_empty)
-				empty = 1;
-			if (res == isl_lp_error || res == isl_lp_unbounded)
-				goto error;
-			snap[level] = isl_tab_snap(tab);
-		} else
-			isl_int_add_ui(min->el[level], min->el[level], 1);
-
-		if (empty || isl_int_gt(min->el[level], max->el[level])) {
-			level--;
-			init = 0;
-			if (level >= 0)
-				if (isl_tab_rollback(tab, snap[level]) < 0)
-					goto error;
-			continue;
-		}
-		if (level == dim - 1 && callback->add == increment_counter) {
-			if (increment_range(callback,
-					    min->el[level], max->el[level]))
-				goto error;
-			level--;
-			init = 0;
-			if (level >= 0)
-				if (isl_tab_rollback(tab, snap[level]) < 0)
-					goto error;
-			continue;
-		}
-		isl_int_neg(B->row[1 + level][0], min->el[level]);
-		if (isl_tab_add_valid_eq(tab, B->row[1 + level]) < 0)
-			goto error;
-		isl_int_set_si(B->row[1 + level][0], 0);
-		if (level < dim - 1) {
-			++level;
-			init = 1;
-			continue;
-		}
-		if (add_solution(tab, callback) < 0)
-			goto error;
-		init = 0;
-		if (isl_tab_rollback(tab, snap[level]) < 0)
-			goto error;
-	}
-
-	isl_tab_free(tab);
-	free(snap);
-	isl_vec_free(min);
-	isl_vec_free(max);
-	isl_basic_set_free(bset);
-	isl_mat_free(B);
-	return 0;
-error:
-	isl_tab_free(tab);
-	free(snap);
-	isl_vec_free(min);
-	isl_vec_free(max);
-	isl_basic_set_free(bset);
-	isl_mat_free(B);
-	return -1;
-}
-
-int isl_set_scan(__isl_take isl_set *set, struct isl_scan_callback *callback)
-{
-	int i;
-
-	if (!set || !callback)
-		goto error;
-
-	set = isl_set_cow(set);
-	set = isl_set_make_disjoint(set);
-	set = isl_set_compute_divs(set);
-	if (!set)
-		goto error;
-
-	for (i = 0; i < set->n; ++i)
-		if (isl_basic_set_scan(isl_basic_set_copy(set->p[i]),
-					callback) < 0)
-			goto error;
-
-	isl_set_free(set);
-	return 0;
-error:
-	isl_set_free(set);
-	return -1;
-}
-
-int isl_basic_set_count_upto(__isl_keep isl_basic_set *bset,
-	isl_int max, isl_int *count)
-{
-	struct isl_counter cnt = { { &increment_counter } };
-
-	if (!bset)
-		return -1;
-
-	isl_int_init(cnt.count);
-	isl_int_init(cnt.max);
-
-	isl_int_set_si(cnt.count, 0);
-	isl_int_set(cnt.max, max);
-	if (isl_basic_set_scan(isl_basic_set_copy(bset), &cnt.callback) < 0 &&
-	    isl_int_lt(cnt.count, cnt.max))
-		goto error;
-
-	isl_int_set(*count, cnt.count);
-	isl_int_clear(cnt.max);
-	isl_int_clear(cnt.count);
-
-	return 0;
-error:
-	isl_int_clear(cnt.count);
-	return -1;
-}
-
-int isl_set_count_upto(__isl_keep isl_set *set, isl_int max, isl_int *count)
-{
-	struct isl_counter cnt = { { &increment_counter } };
-
-	if (!set)
-		return -1;
-
-	isl_int_init(cnt.count);
-	isl_int_init(cnt.max);
-
-	isl_int_set_si(cnt.count, 0);
-	isl_int_set(cnt.max, max);
-	if (isl_set_scan(isl_set_copy(set), &cnt.callback) < 0 &&
-	    isl_int_lt(cnt.count, cnt.max))
-		goto error;
-
-	isl_int_set(*count, cnt.count);
-	isl_int_clear(cnt.max);
-	isl_int_clear(cnt.count);
-
-	return 0;
-error:
-	isl_int_clear(cnt.count);
-	return -1;
-}
-
-int isl_set_count(__isl_keep isl_set *set, isl_int *count)
-{
-	if (!set)
-		return -1;
-	return isl_set_count_upto(set, set->ctx->zero, count);
-}
diff --git a/cloog-0.17.0/isl/isl_scan.h b/cloog-0.17.0/isl/isl_scan.h
deleted file mode 100644
index 8e5ad74..0000000
--- a/cloog-0.17.0/isl/isl_scan.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_SCAN_H
-#define ISL_SCAN_H
-
-#include <isl/set.h>
-#include <isl/vec.h>
-
-struct isl_scan_callback {
-	int (*add)(struct isl_scan_callback *cb, __isl_take isl_vec *sample);
-};
-
-int isl_basic_set_scan(struct isl_basic_set *bset,
-	struct isl_scan_callback *callback);
-int isl_set_scan(__isl_take isl_set *set, struct isl_scan_callback *callback);
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_schedule.c b/cloog-0.17.0/isl/isl_schedule.c
deleted file mode 100644
index cc7adc8..0000000
--- a/cloog-0.17.0/isl/isl_schedule.c
+++ /dev/null
@@ -1,2842 +0,0 @@
-/*
- * Copyright 2011      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl_space_private.h>
-#include <isl/hash.h>
-#include <isl/constraint.h>
-#include <isl/schedule.h>
-#include <isl_mat_private.h>
-#include <isl/set.h>
-#include <isl/seq.h>
-#include <isl_tab.h>
-#include <isl_dim_map.h>
-#include <isl_hmap_map_basic_set.h>
-#include <isl_qsort.h>
-#include <isl_schedule_private.h>
-#include <isl_band_private.h>
-#include <isl_list_private.h>
-#include <isl_options_private.h>
-
-/*
- * The scheduling algorithm implemented in this file was inspired by
- * Bondhugula et al., "Automatic Transformations for Communication-Minimized
- * Parallelization and Locality Optimization in the Polyhedral Model".
- */
-
-
-/* Internal information about a node that is used during the construction
- * of a schedule.
- * dim represents the space in which the domain lives
- * sched is a matrix representation of the schedule being constructed
- *	for this node
- * sched_map is an isl_map representation of the same (partial) schedule
- *	sched_map may be NULL
- * rank is the number of linearly independent rows in the linear part
- *	of sched
- * the columns of cmap represent a change of basis for the schedule
- *	coefficients; the first rank columns span the linear part of
- *	the schedule rows
- * start is the first variable in the LP problem in the sequences that
- *	represents the schedule coefficients of this node
- * nvar is the dimension of the domain
- * nparam is the number of parameters or 0 if we are not constructing
- *	a parametric schedule
- *
- * scc is the index of SCC (or WCC) this node belongs to
- *
- * band contains the band index for each of the rows of the schedule.
- * band_id is used to differentiate between separate bands at the same
- * level within the same parent band, i.e., bands that are separated
- * by the parent band or bands that are independent of each other.
- * zero contains a boolean for each of the rows of the schedule,
- * indicating whether the corresponding scheduling dimension results
- * in zero dependence distances within its band and with respect
- * to the proximity edges.
- *
- * index, min_index and on_stack are used during the SCC detection
- * index represents the order in which nodes are visited.
- * min_index is the index of the root of a (sub)component.
- * on_stack indicates whether the node is currently on the stack.
- */
-struct isl_sched_node {
-	isl_space *dim;
-	isl_mat *sched;
-	isl_map *sched_map;
-	int	 rank;
-	isl_mat *cmap;
-	int	 start;
-	int	 nvar;
-	int	 nparam;
-
-	int	 scc;
-
-	int	*band;
-	int	*band_id;
-	int	*zero;
-
-	/* scc detection */
-	int	 index;
-	int	 min_index;
-	int	 on_stack;
-};
-
-static int node_has_dim(const void *entry, const void *val)
-{
-	struct isl_sched_node *node = (struct isl_sched_node *)entry;
-	isl_space *dim = (isl_space *)val;
-
-	return isl_space_is_equal(node->dim, dim);
-}
-
-/* An edge in the dependence graph.  An edge may be used to
- * ensure validity of the generated schedule, to minimize the dependence
- * distance or both
- *
- * map is the dependence relation
- * src is the source node
- * dst is the sink node
- * validity is set if the edge is used to ensure correctness
- * proximity is set if the edge is used to minimize dependence distances
- *
- * For validity edges, start and end mark the sequence of inequality
- * constraints in the LP problem that encode the validity constraint
- * corresponding to this edge.
- */
-struct isl_sched_edge {
-	isl_map *map;
-
-	struct isl_sched_node *src;
-	struct isl_sched_node *dst;
-
-	int validity;
-	int proximity;
-
-	int start;
-	int end;
-};
-
-/* Internal information about the dependence graph used during
- * the construction of the schedule.
- *
- * intra_hmap is a cache, mapping dependence relations to their dual,
- *	for dependences from a node to itself
- * inter_hmap is a cache, mapping dependence relations to their dual,
- *	for dependences between distinct nodes
- *
- * n is the number of nodes
- * node is the list of nodes
- * maxvar is the maximal number of variables over all nodes
- * n_row is the current (maximal) number of linearly independent
- *	rows in the node schedules
- * n_total_row is the current number of rows in the node schedules
- * n_band is the current number of completed bands
- * band_start is the starting row in the node schedules of the current band
- * root is set if this graph is the original dependence graph,
- *	without any splitting
- *
- * sorted contains a list of node indices sorted according to the
- *	SCC to which a node belongs
- *
- * n_edge is the number of edges
- * edge is the list of edges
- * edge_table contains pointers into the edge array, hashed on the source
- *	and sink spaces; the table only contains edges that represent
- *	validity constraints (and that may or may not also represent proximity
- *	constraints)
- *
- * node_table contains pointers into the node array, hashed on the space
- *
- * region contains a list of variable sequences that should be non-trivial
- *
- * lp contains the (I)LP problem used to obtain new schedule rows
- *
- * src_scc and dst_scc are the source and sink SCCs of an edge with
- *	conflicting constraints
- *
- * scc, sp, index and stack are used during the detection of SCCs
- * scc is the number of the next SCC
- * stack contains the nodes on the path from the root to the current node
- * sp is the stack pointer
- * index is the index of the last node visited
- */
-struct isl_sched_graph {
-	isl_hmap_map_basic_set *intra_hmap;
-	isl_hmap_map_basic_set *inter_hmap;
-
-	struct isl_sched_node *node;
-	int n;
-	int maxvar;
-	int n_row;
-
-	int *sorted;
-
-	int n_band;
-	int n_total_row;
-	int band_start;
-
-	int root;
-
-	struct isl_sched_edge *edge;
-	int n_edge;
-	struct isl_hash_table *edge_table;
-
-	struct isl_hash_table *node_table;
-	struct isl_region *region;
-
-	isl_basic_set *lp;
-
-	int src_scc;
-	int dst_scc;
-
-	/* scc detection */
-	int scc;
-	int sp;
-	int index;
-	int *stack;
-};
-
-/* Initialize node_table based on the list of nodes.
- */
-static int graph_init_table(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	int i;
-
-	graph->node_table = isl_hash_table_alloc(ctx, graph->n);
-	if (!graph->node_table)
-		return -1;
-
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_hash_table_entry *entry;
-		uint32_t hash;
-
-		hash = isl_space_get_hash(graph->node[i].dim);
-		entry = isl_hash_table_find(ctx, graph->node_table, hash,
-					    &node_has_dim,
-					    graph->node[i].dim, 1);
-		if (!entry)
-			return -1;
-		entry->data = &graph->node[i];
-	}
-
-	return 0;
-}
-
-/* Return a pointer to the node that lives within the given space,
- * or NULL if there is no such node.
- */
-static struct isl_sched_node *graph_find_node(isl_ctx *ctx,
-	struct isl_sched_graph *graph, __isl_keep isl_space *dim)
-{
-	struct isl_hash_table_entry *entry;
-	uint32_t hash;
-
-	hash = isl_space_get_hash(dim);
-	entry = isl_hash_table_find(ctx, graph->node_table, hash,
-				    &node_has_dim, dim, 0);
-
-	return entry ? entry->data : NULL;
-}
-
-static int edge_has_src_and_dst(const void *entry, const void *val)
-{
-	const struct isl_sched_edge *edge = entry;
-	const struct isl_sched_edge *temp = val;
-
-	return edge->src == temp->src && edge->dst == temp->dst;
-}
-
-/* Initialize edge_table based on the list of edges.
- * Only edges with validity set are added to the table.
- */
-static int graph_init_edge_table(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	int i;
-
-	graph->edge_table = isl_hash_table_alloc(ctx, graph->n_edge);
-	if (!graph->edge_table)
-		return -1;
-
-	for (i = 0; i < graph->n_edge; ++i) {
-		struct isl_hash_table_entry *entry;
-		uint32_t hash;
-
-		if (!graph->edge[i].validity)
-			continue;
-
-		hash = isl_hash_init();
-		hash = isl_hash_builtin(hash, graph->edge[i].src);
-		hash = isl_hash_builtin(hash, graph->edge[i].dst);
-		entry = isl_hash_table_find(ctx, graph->edge_table, hash,
-					    &edge_has_src_and_dst,
-					    &graph->edge[i], 1);
-		if (!entry)
-			return -1;
-		entry->data = &graph->edge[i];
-	}
-
-	return 0;
-}
-
-/* Check whether the dependence graph has a (validity) edge
- * between the given two nodes.
- */
-static int graph_has_edge(struct isl_sched_graph *graph,
-	struct isl_sched_node *src, struct isl_sched_node *dst)
-{
-	isl_ctx *ctx = isl_space_get_ctx(src->dim);
-	struct isl_hash_table_entry *entry;
-	uint32_t hash;
-	struct isl_sched_edge temp = { .src = src, .dst = dst };
-	struct isl_sched_edge *edge;
-	int empty;
-
-	hash = isl_hash_init();
-	hash = isl_hash_builtin(hash, temp.src);
-	hash = isl_hash_builtin(hash, temp.dst);
-	entry = isl_hash_table_find(ctx, graph->edge_table, hash,
-				    &edge_has_src_and_dst, &temp, 0);
-	if (!entry)
-		return 0;
-
-	edge = entry->data;
-	empty = isl_map_plain_is_empty(edge->map);
-	if (empty < 0)
-		return -1;
-
-	return !empty;
-}
-
-static int graph_alloc(isl_ctx *ctx, struct isl_sched_graph *graph,
-	int n_node, int n_edge)
-{
-	int i;
-
-	graph->n = n_node;
-	graph->n_edge = n_edge;
-	graph->node = isl_calloc_array(ctx, struct isl_sched_node, graph->n);
-	graph->sorted = isl_calloc_array(ctx, int, graph->n);
-	graph->region = isl_alloc_array(ctx, struct isl_region, graph->n);
-	graph->stack = isl_alloc_array(ctx, int, graph->n);
-	graph->edge = isl_calloc_array(ctx,
-					struct isl_sched_edge, graph->n_edge);
-
-	graph->intra_hmap = isl_hmap_map_basic_set_alloc(ctx, 2 * n_edge);
-	graph->inter_hmap = isl_hmap_map_basic_set_alloc(ctx, 2 * n_edge);
-
-	if (!graph->node || !graph->region || !graph->stack || !graph->edge ||
-	    !graph->sorted)
-		return -1;
-
-	for(i = 0; i < graph->n; ++i)
-		graph->sorted[i] = i;
-
-	return 0;
-}
-
-static void graph_free(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	int i;
-
-	isl_hmap_map_basic_set_free(ctx, graph->intra_hmap);
-	isl_hmap_map_basic_set_free(ctx, graph->inter_hmap);
-
-	for (i = 0; i < graph->n; ++i) {
-		isl_space_free(graph->node[i].dim);
-		isl_mat_free(graph->node[i].sched);
-		isl_map_free(graph->node[i].sched_map);
-		isl_mat_free(graph->node[i].cmap);
-		if (graph->root) {
-			free(graph->node[i].band);
-			free(graph->node[i].band_id);
-			free(graph->node[i].zero);
-		}
-	}
-	free(graph->node);
-	free(graph->sorted);
-	for (i = 0; i < graph->n_edge; ++i)
-		isl_map_free(graph->edge[i].map);
-	free(graph->edge);
-	free(graph->region);
-	free(graph->stack);
-	isl_hash_table_free(ctx, graph->edge_table);
-	isl_hash_table_free(ctx, graph->node_table);
-	isl_basic_set_free(graph->lp);
-}
-
-/* Add a new node to the graph representing the given set.
- */
-static int extract_node(__isl_take isl_set *set, void *user)
-{
-	int nvar, nparam;
-	isl_ctx *ctx;
-	isl_space *dim;
-	isl_mat *sched;
-	struct isl_sched_graph *graph = user;
-	int *band, *band_id, *zero;
-
-	ctx = isl_set_get_ctx(set);
-	dim = isl_set_get_space(set);
-	isl_set_free(set);
-	nvar = isl_space_dim(dim, isl_dim_set);
-	nparam = isl_space_dim(dim, isl_dim_param);
-	if (!ctx->opt->schedule_parametric)
-		nparam = 0;
-	sched = isl_mat_alloc(ctx, 0, 1 + nparam + nvar);
-	graph->node[graph->n].dim = dim;
-	graph->node[graph->n].nvar = nvar;
-	graph->node[graph->n].nparam = nparam;
-	graph->node[graph->n].sched = sched;
-	graph->node[graph->n].sched_map = NULL;
-	band = isl_alloc_array(ctx, int, graph->n_edge + nvar);
-	graph->node[graph->n].band = band;
-	band_id = isl_calloc_array(ctx, int, graph->n_edge + nvar);
-	graph->node[graph->n].band_id = band_id;
-	zero = isl_calloc_array(ctx, int, graph->n_edge + nvar);
-	graph->node[graph->n].zero = zero;
-	graph->n++;
-
-	if (!sched || !band || !band_id || !zero)
-		return -1;
-
-	return 0;
-}
-
-/* Add a new edge to the graph based on the given map.
- * Edges are first extracted from the validity dependences,
- * from which the edge_table is constructed.
- * Afterwards, the proximity dependences are added.  If a proximity
- * dependence relation happens to be identical to one of the
- * validity dependence relations added before, then we don't create
- * a new edge, but instead mark the original edge as also representing
- * a proximity dependence.
- */
-static int extract_edge(__isl_take isl_map *map, void *user)
-{
-	isl_ctx *ctx = isl_map_get_ctx(map);
-	struct isl_sched_graph *graph = user;
-	struct isl_sched_node *src, *dst;
-	isl_space *dim;
-
-	dim = isl_space_domain(isl_map_get_space(map));
-	src = graph_find_node(ctx, graph, dim);
-	isl_space_free(dim);
-	dim = isl_space_range(isl_map_get_space(map));
-	dst = graph_find_node(ctx, graph, dim);
-	isl_space_free(dim);
-
-	if (!src || !dst) {
-		isl_map_free(map);
-		return 0;
-	}
-
-	graph->edge[graph->n_edge].src = src;
-	graph->edge[graph->n_edge].dst = dst;
-	graph->edge[graph->n_edge].map = map;
-	graph->edge[graph->n_edge].validity = !graph->edge_table;
-	graph->edge[graph->n_edge].proximity = !!graph->edge_table;
-	graph->n_edge++;
-
-	if (graph->edge_table) {
-		uint32_t hash;
-		struct isl_hash_table_entry *entry;
-		struct isl_sched_edge *edge;
-		int is_equal;
-
-		hash = isl_hash_init();
-		hash = isl_hash_builtin(hash, src);
-		hash = isl_hash_builtin(hash, dst);
-		entry = isl_hash_table_find(ctx, graph->edge_table, hash,
-					    &edge_has_src_and_dst,
-					    &graph->edge[graph->n_edge - 1], 0);
-		if (!entry)
-			return 0;
-		edge = entry->data;
-		is_equal = isl_map_plain_is_equal(map, edge->map);
-		if (is_equal < 0)
-			return -1;
-		if (!is_equal)
-			return 0;
-
-		graph->n_edge--;
-		edge->proximity = 1;
-		isl_map_free(map);
-	}
-
-	return 0;
-}
-
-/* Check whether there is a validity dependence from src to dst,
- * forcing dst to follow src.
- */
-static int node_follows(struct isl_sched_graph *graph, 
-	struct isl_sched_node *dst, struct isl_sched_node *src)
-{
-	return graph_has_edge(graph, src, dst);
-}
-
-/* Perform Tarjan's algorithm for computing the strongly connected components
- * in the dependence graph (only validity edges).
- * If directed is not set, we consider the graph to be undirected and
- * we effectively compute the (weakly) connected components.
- */
-static int detect_sccs_tarjan(struct isl_sched_graph *g, int i, int directed)
-{
-	int j;
-
-	g->node[i].index = g->index;
-	g->node[i].min_index = g->index;
-	g->node[i].on_stack = 1;
-	g->index++;
-	g->stack[g->sp++] = i;
-
-	for (j = g->n - 1; j >= 0; --j) {
-		int f;
-
-		if (j == i)
-			continue;
-		if (g->node[j].index >= 0 &&
-			(!g->node[j].on_stack ||
-			 g->node[j].index > g->node[i].min_index))
-			continue;
-		
-		f = node_follows(g, &g->node[i], &g->node[j]);
-		if (f < 0)
-			return -1;
-		if (!f && !directed) {
-			f = node_follows(g, &g->node[j], &g->node[i]);
-			if (f < 0)
-				return -1;
-		}
-		if (!f)
-			continue;
-		if (g->node[j].index < 0) {
-			detect_sccs_tarjan(g, j, directed);
-			if (g->node[j].min_index < g->node[i].min_index)
-				g->node[i].min_index = g->node[j].min_index;
-		} else if (g->node[j].index < g->node[i].min_index)
-			g->node[i].min_index = g->node[j].index;
-	}
-
-	if (g->node[i].index != g->node[i].min_index)
-		return 0;
-
-	do {
-		j = g->stack[--g->sp];
-		g->node[j].on_stack = 0;
-		g->node[j].scc = g->scc;
-	} while (j != i);
-	g->scc++;
-
-	return 0;
-}
-
-static int detect_ccs(struct isl_sched_graph *graph, int directed)
-{
-	int i;
-
-	graph->index = 0;
-	graph->sp = 0;
-	graph->scc = 0;
-	for (i = graph->n - 1; i >= 0; --i)
-		graph->node[i].index = -1;
-
-	for (i = graph->n - 1; i >= 0; --i) {
-		if (graph->node[i].index >= 0)
-			continue;
-		if (detect_sccs_tarjan(graph, i, directed) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-/* Apply Tarjan's algorithm to detect the strongly connected components
- * in the dependence graph.
- */
-static int detect_sccs(struct isl_sched_graph *graph)
-{
-	return detect_ccs(graph, 1);
-}
-
-/* Apply Tarjan's algorithm to detect the (weakly) connected components
- * in the dependence graph.
- */
-static int detect_wccs(struct isl_sched_graph *graph)
-{
-	return detect_ccs(graph, 0);
-}
-
-static int cmp_scc(const void *a, const void *b, void *data)
-{
-	struct isl_sched_graph *graph = data;
-	const int *i1 = a;
-	const int *i2 = b;
-
-	return graph->node[*i1].scc - graph->node[*i2].scc;
-}
-
-/* Sort the elements of graph->sorted according to the corresponding SCCs.
- */
-static void sort_sccs(struct isl_sched_graph *graph)
-{
-	isl_quicksort(graph->sorted, graph->n, sizeof(int), &cmp_scc, graph);
-}
-
-/* Given a dependence relation R from a node to itself,
- * construct the set of coefficients of valid constraints for elements
- * in that dependence relation.
- * In particular, the result contains tuples of coefficients
- * c_0, c_n, c_x such that
- *
- *	c_0 + c_n n + c_x y - c_x x >= 0 for each (x,y) in R
- *
- * or, equivalently,
- *
- *	c_0 + c_n n + c_x d >= 0 for each d in delta R = { y - x | (x,y) in R }
- *
- * We choose here to compute the dual of delta R.
- * Alternatively, we could have computed the dual of R, resulting
- * in a set of tuples c_0, c_n, c_x, c_y, and then
- * plugged in (c_0, c_n, c_x, -c_x).
- */
-static __isl_give isl_basic_set *intra_coefficients(
-	struct isl_sched_graph *graph, __isl_take isl_map *map)
-{
-	isl_ctx *ctx = isl_map_get_ctx(map);
-	isl_set *delta;
-	isl_basic_set *coef;
-
-	if (isl_hmap_map_basic_set_has(ctx, graph->intra_hmap, map))
-		return isl_hmap_map_basic_set_get(ctx, graph->intra_hmap, map);
-
-	delta = isl_set_remove_divs(isl_map_deltas(isl_map_copy(map)));
-	coef = isl_set_coefficients(delta);
-	isl_hmap_map_basic_set_set(ctx, graph->intra_hmap, map,
-					isl_basic_set_copy(coef));
-
-	return coef;
-}
-
-/* Given a dependence relation R, * construct the set of coefficients
- * of valid constraints for elements in that dependence relation.
- * In particular, the result contains tuples of coefficients
- * c_0, c_n, c_x, c_y such that
- *
- *	c_0 + c_n n + c_x x + c_y y >= 0 for each (x,y) in R
- *
- */
-static __isl_give isl_basic_set *inter_coefficients(
-	struct isl_sched_graph *graph, __isl_take isl_map *map)
-{
-	isl_ctx *ctx = isl_map_get_ctx(map);
-	isl_set *set;
-	isl_basic_set *coef;
-
-	if (isl_hmap_map_basic_set_has(ctx, graph->inter_hmap, map))
-		return isl_hmap_map_basic_set_get(ctx, graph->inter_hmap, map);
-
-	set = isl_map_wrap(isl_map_remove_divs(isl_map_copy(map)));
-	coef = isl_set_coefficients(set);
-	isl_hmap_map_basic_set_set(ctx, graph->inter_hmap, map,
-					isl_basic_set_copy(coef));
-
-	return coef;
-}
-
-/* Add constraints to graph->lp that force validity for the given
- * dependence from a node i to itself.
- * That is, add constraints that enforce
- *
- *	(c_i_0 + c_i_n n + c_i_x y) - (c_i_0 + c_i_n n + c_i_x x)
- *	= c_i_x (y - x) >= 0
- *
- * for each (x,y) in R.
- * We obtain general constraints on coefficients (c_0, c_n, c_x)
- * of valid constraints for (y - x) and then plug in (0, 0, c_i_x^+ - c_i_x^-),
- * where c_i_x = c_i_x^+ - c_i_x^-, with c_i_x^+ and c_i_x^- non-negative.
- * In graph->lp, the c_i_x^- appear before their c_i_x^+ counterpart.
- *
- * Actually, we do not construct constraints for the c_i_x themselves,
- * but for the coefficients of c_i_x written as a linear combination
- * of the columns in node->cmap.
- */
-static int add_intra_validity_constraints(struct isl_sched_graph *graph,
-	struct isl_sched_edge *edge)
-{
-	unsigned total;
-	isl_map *map = isl_map_copy(edge->map);
-	isl_ctx *ctx = isl_map_get_ctx(map);
-	isl_space *dim;
-	isl_dim_map *dim_map;
-	isl_basic_set *coef;
-	struct isl_sched_node *node = edge->src;
-
-	coef = intra_coefficients(graph, map);
-
-	dim = isl_space_domain(isl_space_unwrap(isl_basic_set_get_space(coef)));
-
-	coef = isl_basic_set_transform_dims(coef, isl_dim_set,
-		    isl_space_dim(dim, isl_dim_set), isl_mat_copy(node->cmap));
-
-	total = isl_basic_set_total_dim(graph->lp);
-	dim_map = isl_dim_map_alloc(ctx, total);
-	isl_dim_map_range(dim_map, node->start + 2 * node->nparam + 1, 2,
-			  isl_space_dim(dim, isl_dim_set), 1,
-			  node->nvar, -1);
-	isl_dim_map_range(dim_map, node->start + 2 * node->nparam + 2, 2,
-			  isl_space_dim(dim, isl_dim_set), 1,
-			  node->nvar, 1);
-	graph->lp = isl_basic_set_extend_constraints(graph->lp,
-			coef->n_eq, coef->n_ineq);
-	graph->lp = isl_basic_set_add_constraints_dim_map(graph->lp,
-							   coef, dim_map);
-	isl_space_free(dim);
-
-	return 0;
-}
-
-/* Add constraints to graph->lp that force validity for the given
- * dependence from node i to node j.
- * That is, add constraints that enforce
- *
- *	(c_j_0 + c_j_n n + c_j_x y) - (c_i_0 + c_i_n n + c_i_x x) >= 0
- *
- * for each (x,y) in R.
- * We obtain general constraints on coefficients (c_0, c_n, c_x, c_y)
- * of valid constraints for R and then plug in
- * (c_j_0 - c_i_0, c_j_n^+ - c_j_n^- - (c_i_n^+ - c_i_n^-),
- *  c_j_x^+ - c_j_x^- - (c_i_x^+ - c_i_x^-)),
- * where c_* = c_*^+ - c_*^-, with c_*^+ and c_*^- non-negative.
- * In graph->lp, the c_*^- appear before their c_*^+ counterpart.
- *
- * Actually, we do not construct constraints for the c_*_x themselves,
- * but for the coefficients of c_*_x written as a linear combination
- * of the columns in node->cmap.
- */
-static int add_inter_validity_constraints(struct isl_sched_graph *graph,
-	struct isl_sched_edge *edge)
-{
-	unsigned total;
-	isl_map *map = isl_map_copy(edge->map);
-	isl_ctx *ctx = isl_map_get_ctx(map);
-	isl_space *dim;
-	isl_dim_map *dim_map;
-	isl_basic_set *coef;
-	struct isl_sched_node *src = edge->src;
-	struct isl_sched_node *dst = edge->dst;
-
-	coef = inter_coefficients(graph, map);
-
-	dim = isl_space_domain(isl_space_unwrap(isl_basic_set_get_space(coef)));
-
-	coef = isl_basic_set_transform_dims(coef, isl_dim_set,
-		    isl_space_dim(dim, isl_dim_set), isl_mat_copy(src->cmap));
-	coef = isl_basic_set_transform_dims(coef, isl_dim_set,
-		    isl_space_dim(dim, isl_dim_set) + src->nvar,
-		    isl_mat_copy(dst->cmap));
-
-	total = isl_basic_set_total_dim(graph->lp);
-	dim_map = isl_dim_map_alloc(ctx, total);
-
-	isl_dim_map_range(dim_map, dst->start, 0, 0, 0, 1, 1);
-	isl_dim_map_range(dim_map, dst->start + 1, 2, 1, 1, dst->nparam, -1);
-	isl_dim_map_range(dim_map, dst->start + 2, 2, 1, 1, dst->nparam, 1);
-	isl_dim_map_range(dim_map, dst->start + 2 * dst->nparam + 1, 2,
-			  isl_space_dim(dim, isl_dim_set) + src->nvar, 1,
-			  dst->nvar, -1);
-	isl_dim_map_range(dim_map, dst->start + 2 * dst->nparam + 2, 2,
-			  isl_space_dim(dim, isl_dim_set) + src->nvar, 1,
-			  dst->nvar, 1);
-
-	isl_dim_map_range(dim_map, src->start, 0, 0, 0, 1, -1);
-	isl_dim_map_range(dim_map, src->start + 1, 2, 1, 1, src->nparam, 1);
-	isl_dim_map_range(dim_map, src->start + 2, 2, 1, 1, src->nparam, -1);
-	isl_dim_map_range(dim_map, src->start + 2 * src->nparam + 1, 2,
-			  isl_space_dim(dim, isl_dim_set), 1,
-			  src->nvar, 1);
-	isl_dim_map_range(dim_map, src->start + 2 * src->nparam + 2, 2,
-			  isl_space_dim(dim, isl_dim_set), 1,
-			  src->nvar, -1);
-
-	edge->start = graph->lp->n_ineq;
-	graph->lp = isl_basic_set_extend_constraints(graph->lp,
-			coef->n_eq, coef->n_ineq);
-	graph->lp = isl_basic_set_add_constraints_dim_map(graph->lp,
-							   coef, dim_map);
-	isl_space_free(dim);
-	edge->end = graph->lp->n_ineq;
-
-	return 0;
-}
-
-/* Add constraints to graph->lp that bound the dependence distance for the given
- * dependence from a node i to itself.
- * If s = 1, we add the constraint
- *
- *	c_i_x (y - x) <= m_0 + m_n n
- *
- * or
- *
- *	-c_i_x (y - x) + m_0 + m_n n >= 0
- *
- * for each (x,y) in R.
- * If s = -1, we add the constraint
- *
- *	-c_i_x (y - x) <= m_0 + m_n n
- *
- * or
- *
- *	c_i_x (y - x) + m_0 + m_n n >= 0
- *
- * for each (x,y) in R.
- * We obtain general constraints on coefficients (c_0, c_n, c_x)
- * of valid constraints for (y - x) and then plug in (m_0, m_n, -s * c_i_x),
- * with each coefficient (except m_0) represented as a pair of non-negative
- * coefficients.
- *
- * Actually, we do not construct constraints for the c_i_x themselves,
- * but for the coefficients of c_i_x written as a linear combination
- * of the columns in node->cmap.
- */
-static int add_intra_proximity_constraints(struct isl_sched_graph *graph,
-	struct isl_sched_edge *edge, int s)
-{
-	unsigned total;
-	unsigned nparam;
-	isl_map *map = isl_map_copy(edge->map);
-	isl_ctx *ctx = isl_map_get_ctx(map);
-	isl_space *dim;
-	isl_dim_map *dim_map;
-	isl_basic_set *coef;
-	struct isl_sched_node *node = edge->src;
-
-	coef = intra_coefficients(graph, map);
-
-	dim = isl_space_domain(isl_space_unwrap(isl_basic_set_get_space(coef)));
-
-	coef = isl_basic_set_transform_dims(coef, isl_dim_set,
-		    isl_space_dim(dim, isl_dim_set), isl_mat_copy(node->cmap));
-
-	nparam = isl_space_dim(node->dim, isl_dim_param);
-	total = isl_basic_set_total_dim(graph->lp);
-	dim_map = isl_dim_map_alloc(ctx, total);
-	isl_dim_map_range(dim_map, 1, 0, 0, 0, 1, 1);
-	isl_dim_map_range(dim_map, 4, 2, 1, 1, nparam, -1);
-	isl_dim_map_range(dim_map, 5, 2, 1, 1, nparam, 1);
-	isl_dim_map_range(dim_map, node->start + 2 * node->nparam + 1, 2,
-			  isl_space_dim(dim, isl_dim_set), 1,
-			  node->nvar, s);
-	isl_dim_map_range(dim_map, node->start + 2 * node->nparam + 2, 2,
-			  isl_space_dim(dim, isl_dim_set), 1,
-			  node->nvar, -s);
-	graph->lp = isl_basic_set_extend_constraints(graph->lp,
-			coef->n_eq, coef->n_ineq);
-	graph->lp = isl_basic_set_add_constraints_dim_map(graph->lp,
-							   coef, dim_map);
-	isl_space_free(dim);
-
-	return 0;
-}
-
-/* Add constraints to graph->lp that bound the dependence distance for the given
- * dependence from node i to node j.
- * If s = 1, we add the constraint
- *
- *	(c_j_0 + c_j_n n + c_j_x y) - (c_i_0 + c_i_n n + c_i_x x)
- *		<= m_0 + m_n n
- *
- * or
- *
- *	-(c_j_0 + c_j_n n + c_j_x y) + (c_i_0 + c_i_n n + c_i_x x) +
- *		m_0 + m_n n >= 0
- *
- * for each (x,y) in R.
- * If s = -1, we add the constraint
- *
- *	-((c_j_0 + c_j_n n + c_j_x y) - (c_i_0 + c_i_n n + c_i_x x))
- *		<= m_0 + m_n n
- *
- * or
- *
- *	(c_j_0 + c_j_n n + c_j_x y) - (c_i_0 + c_i_n n + c_i_x x) +
- *		m_0 + m_n n >= 0
- *
- * for each (x,y) in R.
- * We obtain general constraints on coefficients (c_0, c_n, c_x, c_y)
- * of valid constraints for R and then plug in
- * (m_0 - s*c_j_0 + s*c_i_0, m_n - s*c_j_n + s*c_i_n,
- *  -s*c_j_x+s*c_i_x)
- * with each coefficient (except m_0, c_j_0 and c_i_0)
- * represented as a pair of non-negative coefficients.
- *
- * Actually, we do not construct constraints for the c_*_x themselves,
- * but for the coefficients of c_*_x written as a linear combination
- * of the columns in node->cmap.
- */
-static int add_inter_proximity_constraints(struct isl_sched_graph *graph,
-	struct isl_sched_edge *edge, int s)
-{
-	unsigned total;
-	unsigned nparam;
-	isl_map *map = isl_map_copy(edge->map);
-	isl_ctx *ctx = isl_map_get_ctx(map);
-	isl_space *dim;
-	isl_dim_map *dim_map;
-	isl_basic_set *coef;
-	struct isl_sched_node *src = edge->src;
-	struct isl_sched_node *dst = edge->dst;
-
-	coef = inter_coefficients(graph, map);
-
-	dim = isl_space_domain(isl_space_unwrap(isl_basic_set_get_space(coef)));
-
-	coef = isl_basic_set_transform_dims(coef, isl_dim_set,
-		    isl_space_dim(dim, isl_dim_set), isl_mat_copy(src->cmap));
-	coef = isl_basic_set_transform_dims(coef, isl_dim_set,
-		    isl_space_dim(dim, isl_dim_set) + src->nvar,
-		    isl_mat_copy(dst->cmap));
-
-	nparam = isl_space_dim(src->dim, isl_dim_param);
-	total = isl_basic_set_total_dim(graph->lp);
-	dim_map = isl_dim_map_alloc(ctx, total);
-
-	isl_dim_map_range(dim_map, 1, 0, 0, 0, 1, 1);
-	isl_dim_map_range(dim_map, 4, 2, 1, 1, nparam, -1);
-	isl_dim_map_range(dim_map, 5, 2, 1, 1, nparam, 1);
-
-	isl_dim_map_range(dim_map, dst->start, 0, 0, 0, 1, -s);
-	isl_dim_map_range(dim_map, dst->start + 1, 2, 1, 1, dst->nparam, s);
-	isl_dim_map_range(dim_map, dst->start + 2, 2, 1, 1, dst->nparam, -s);
-	isl_dim_map_range(dim_map, dst->start + 2 * dst->nparam + 1, 2,
-			  isl_space_dim(dim, isl_dim_set) + src->nvar, 1,
-			  dst->nvar, s);
-	isl_dim_map_range(dim_map, dst->start + 2 * dst->nparam + 2, 2,
-			  isl_space_dim(dim, isl_dim_set) + src->nvar, 1,
-			  dst->nvar, -s);
-
-	isl_dim_map_range(dim_map, src->start, 0, 0, 0, 1, s);
-	isl_dim_map_range(dim_map, src->start + 1, 2, 1, 1, src->nparam, -s);
-	isl_dim_map_range(dim_map, src->start + 2, 2, 1, 1, src->nparam, s);
-	isl_dim_map_range(dim_map, src->start + 2 * src->nparam + 1, 2,
-			  isl_space_dim(dim, isl_dim_set), 1,
-			  src->nvar, -s);
-	isl_dim_map_range(dim_map, src->start + 2 * src->nparam + 2, 2,
-			  isl_space_dim(dim, isl_dim_set), 1,
-			  src->nvar, s);
-
-	graph->lp = isl_basic_set_extend_constraints(graph->lp,
-			coef->n_eq, coef->n_ineq);
-	graph->lp = isl_basic_set_add_constraints_dim_map(graph->lp,
-							   coef, dim_map);
-	isl_space_free(dim);
-
-	return 0;
-}
-
-static int add_all_validity_constraints(struct isl_sched_graph *graph)
-{
-	int i;
-
-	for (i = 0; i < graph->n_edge; ++i) {
-		struct isl_sched_edge *edge= &graph->edge[i];
-		if (!edge->validity)
-			continue;
-		if (edge->src != edge->dst)
-			continue;
-		if (add_intra_validity_constraints(graph, edge) < 0)
-			return -1;
-	}
-
-	for (i = 0; i < graph->n_edge; ++i) {
-		struct isl_sched_edge *edge = &graph->edge[i];
-		if (!edge->validity)
-			continue;
-		if (edge->src == edge->dst)
-			continue;
-		if (add_inter_validity_constraints(graph, edge) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-/* Add constraints to graph->lp that bound the dependence distance
- * for all dependence relations.
- * If a given proximity dependence is identical to a validity
- * dependence, then the dependence distance is already bounded
- * from below (by zero), so we only need to bound the distance
- * from above.
- * Otherwise, we need to bound the distance both from above and from below.
- */
-static int add_all_proximity_constraints(struct isl_sched_graph *graph)
-{
-	int i;
-
-	for (i = 0; i < graph->n_edge; ++i) {
-		struct isl_sched_edge *edge= &graph->edge[i];
-		if (!edge->proximity)
-			continue;
-		if (edge->src == edge->dst &&
-		    add_intra_proximity_constraints(graph, edge, 1) < 0)
-			return -1;
-		if (edge->src != edge->dst &&
-		    add_inter_proximity_constraints(graph, edge, 1) < 0)
-			return -1;
-		if (edge->validity)
-			continue;
-		if (edge->src == edge->dst &&
-		    add_intra_proximity_constraints(graph, edge, -1) < 0)
-			return -1;
-		if (edge->src != edge->dst &&
-		    add_inter_proximity_constraints(graph, edge, -1) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-/* Compute a basis for the rows in the linear part of the schedule
- * and extend this basis to a full basis.  The remaining rows
- * can then be used to force linear independence from the rows
- * in the schedule.
- *
- * In particular, given the schedule rows S, we compute
- *
- *	S = H Q
- *
- * with H the Hermite normal form of S.  That is, all but the
- * first rank columns of Q are zero and so each row in S is
- * a linear combination of the first rank rows of Q.
- * The matrix Q is then transposed because we will write the
- * coefficients of the next schedule row as a column vector s
- * and express this s as a linear combination s = Q c of the
- * computed basis.
- */
-static int node_update_cmap(struct isl_sched_node *node)
-{
-	isl_mat *H, *Q;
-	int n_row = isl_mat_rows(node->sched);
-
-	H = isl_mat_sub_alloc(node->sched, 0, n_row,
-			      1 + node->nparam, node->nvar);
-
-	H = isl_mat_left_hermite(H, 0, NULL, &Q);
-	isl_mat_free(node->cmap);
-	node->cmap = isl_mat_transpose(Q);
-	node->rank = isl_mat_initial_non_zero_cols(H);
-	isl_mat_free(H);
-
-	if (!node->cmap || node->rank < 0)
-		return -1;
-	return 0;
-}
-
-/* Count the number of equality and inequality constraints
- * that will be added for the given map.
- * If once is set, then we count
- * each edge exactly once.  Otherwise, we count as follows
- * validity		-> 1 (>= 0)
- * validity+proximity	-> 2 (>= 0 and upper bound)
- * proximity		-> 2 (lower and upper bound)
- */
-static int count_map_constraints(struct isl_sched_graph *graph,
-	struct isl_sched_edge *edge, __isl_take isl_map *map,
-	int *n_eq, int *n_ineq, int once)
-{
-	isl_basic_set *coef;
-	int f = once ? 1 : edge->proximity ? 2 : 1;
-
-	if (edge->src == edge->dst)
-		coef = intra_coefficients(graph, map);
-	else
-		coef = inter_coefficients(graph, map);
-	if (!coef)
-		return -1;
-	*n_eq += f * coef->n_eq;
-	*n_ineq += f * coef->n_ineq;
-	isl_basic_set_free(coef);
-
-	return 0;
-}
-
-/* Count the number of equality and inequality constraints
- * that will be added to the main lp problem.
- * If once is set, then we count
- * each edge exactly once.  Otherwise, we count as follows
- * validity		-> 1 (>= 0)
- * validity+proximity	-> 2 (>= 0 and upper bound)
- * proximity		-> 2 (lower and upper bound)
- */
-static int count_constraints(struct isl_sched_graph *graph,
-	int *n_eq, int *n_ineq, int once)
-{
-	int i;
-
-	*n_eq = *n_ineq = 0;
-	for (i = 0; i < graph->n_edge; ++i) {
-		struct isl_sched_edge *edge= &graph->edge[i];
-		isl_map *map = isl_map_copy(edge->map);
-
-		if (count_map_constraints(graph, edge, map,
-					  n_eq, n_ineq, once) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-/* Construct an ILP problem for finding schedule coefficients
- * that result in non-negative, but small dependence distances
- * over all dependences.
- * In particular, the dependence distances over proximity edges
- * are bounded by m_0 + m_n n and we compute schedule coefficients
- * with small values (preferably zero) of m_n and m_0.
- *
- * All variables of the ILP are non-negative.  The actual coefficients
- * may be negative, so each coefficient is represented as the difference
- * of two non-negative variables.  The negative part always appears
- * immediately before the positive part.
- * Other than that, the variables have the following order
- *
- *	- sum of positive and negative parts of m_n coefficients
- *	- m_0
- *	- sum of positive and negative parts of all c_n coefficients
- *		(unconstrained when computing non-parametric schedules)
- *	- sum of positive and negative parts of all c_x coefficients
- *	- positive and negative parts of m_n coefficients
- *	- for each node
- *		- c_i_0
- *		- positive and negative parts of c_i_n (if parametric)
- *		- positive and negative parts of c_i_x
- *
- * The c_i_x are not represented directly, but through the columns of
- * node->cmap.  That is, the computed values are for variable t_i_x
- * such that c_i_x = Q t_i_x with Q equal to node->cmap.
- *
- * The constraints are those from the edges plus two or three equalities
- * to express the sums.
- *
- * If force_zero is set, then we add equalities to ensure that
- * the sum of the m_n coefficients and m_0 are both zero.
- */
-static int setup_lp(isl_ctx *ctx, struct isl_sched_graph *graph,
-	int force_zero, int max_constant_term)
-{
-	int i, j;
-	int k;
-	unsigned nparam;
-	unsigned total;
-	isl_space *dim;
-	int parametric;
-	int param_pos;
-	int n_eq, n_ineq;
-
-	parametric = ctx->opt->schedule_parametric;
-	nparam = isl_space_dim(graph->node[0].dim, isl_dim_param);
-	param_pos = 4;
-	total = param_pos + 2 * nparam;
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[graph->sorted[i]];
-		if (node_update_cmap(node) < 0)
-			return -1;
-		node->start = total;
-		total += 1 + 2 * (node->nparam + node->nvar);
-	}
-
-	if (count_constraints(graph, &n_eq, &n_ineq, 0) < 0)
-		return -1;
-
-	dim = isl_space_set_alloc(ctx, 0, total);
-	isl_basic_set_free(graph->lp);
-	n_eq += 2 + parametric + force_zero;
-	if (max_constant_term != -1)
-		n_ineq += graph->n;
-
-	graph->lp = isl_basic_set_alloc_space(dim, 0, n_eq, n_ineq);
-
-	k = isl_basic_set_alloc_equality(graph->lp);
-	if (k < 0)
-		return -1;
-	isl_seq_clr(graph->lp->eq[k], 1 +  total);
-	if (!force_zero)
-		isl_int_set_si(graph->lp->eq[k][1], -1);
-	for (i = 0; i < 2 * nparam; ++i)
-		isl_int_set_si(graph->lp->eq[k][1 + param_pos + i], 1);
-
-	if (force_zero) {
-		k = isl_basic_set_alloc_equality(graph->lp);
-		if (k < 0)
-			return -1;
-		isl_seq_clr(graph->lp->eq[k], 1 +  total);
-		isl_int_set_si(graph->lp->eq[k][2], -1);
-	}
-
-	if (parametric) {
-		k = isl_basic_set_alloc_equality(graph->lp);
-		if (k < 0)
-			return -1;
-		isl_seq_clr(graph->lp->eq[k], 1 +  total);
-		isl_int_set_si(graph->lp->eq[k][3], -1);
-		for (i = 0; i < graph->n; ++i) {
-			int pos = 1 + graph->node[i].start + 1;
-
-			for (j = 0; j < 2 * graph->node[i].nparam; ++j)
-				isl_int_set_si(graph->lp->eq[k][pos + j], 1);
-		}
-	}
-
-	k = isl_basic_set_alloc_equality(graph->lp);
-	if (k < 0)
-		return -1;
-	isl_seq_clr(graph->lp->eq[k], 1 +  total);
-	isl_int_set_si(graph->lp->eq[k][4], -1);
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[i];
-		int pos = 1 + node->start + 1 + 2 * node->nparam;
-
-		for (j = 0; j < 2 * node->nvar; ++j)
-			isl_int_set_si(graph->lp->eq[k][pos + j], 1);
-	}
-
-	if (max_constant_term != -1)
-		for (i = 0; i < graph->n; ++i) {
-			struct isl_sched_node *node = &graph->node[i];
-			k = isl_basic_set_alloc_inequality(graph->lp);
-			if (k < 0)
-				return -1;
-			isl_seq_clr(graph->lp->ineq[k], 1 +  total);
-			isl_int_set_si(graph->lp->ineq[k][1 + node->start], -1);
-			isl_int_set_si(graph->lp->ineq[k][0], max_constant_term);
-		}
-
-	if (add_all_validity_constraints(graph) < 0)
-		return -1;
-	if (add_all_proximity_constraints(graph) < 0)
-		return -1;
-
-	return 0;
-}
-
-/* Analyze the conflicting constraint found by
- * isl_tab_basic_set_non_trivial_lexmin.  If it corresponds to the validity
- * constraint of one of the edges between distinct nodes, living, moreover
- * in distinct SCCs, then record the source and sink SCC as this may
- * be a good place to cut between SCCs.
- */
-static int check_conflict(int con, void *user)
-{
-	int i;
-	struct isl_sched_graph *graph = user;
-
-	if (graph->src_scc >= 0)
-		return 0;
-
-	con -= graph->lp->n_eq;
-
-	if (con >= graph->lp->n_ineq)
-		return 0;
-
-	for (i = 0; i < graph->n_edge; ++i) {
-		if (!graph->edge[i].validity)
-			continue;
-		if (graph->edge[i].src == graph->edge[i].dst)
-			continue;
-		if (graph->edge[i].src->scc == graph->edge[i].dst->scc)
-			continue;
-		if (graph->edge[i].start > con)
-			continue;
-		if (graph->edge[i].end <= con)
-			continue;
-		graph->src_scc = graph->edge[i].src->scc;
-		graph->dst_scc = graph->edge[i].dst->scc;
-	}
-
-	return 0;
-}
-
-/* Check whether the next schedule row of the given node needs to be
- * non-trivial.  Lower-dimensional domains may have some trivial rows,
- * but as soon as the number of remaining required non-trivial rows
- * is as large as the number or remaining rows to be computed,
- * all remaining rows need to be non-trivial.
- */
-static int needs_row(struct isl_sched_graph *graph, struct isl_sched_node *node)
-{
-	return node->nvar - node->rank >= graph->maxvar - graph->n_row;
-}
-
-/* Solve the ILP problem constructed in setup_lp.
- * For each node such that all the remaining rows of its schedule
- * need to be non-trivial, we construct a non-triviality region.
- * This region imposes that the next row is independent of previous rows.
- * In particular the coefficients c_i_x are represented by t_i_x
- * variables with c_i_x = Q t_i_x and Q a unimodular matrix such that
- * its first columns span the rows of the previously computed part
- * of the schedule.  The non-triviality region enforces that at least
- * one of the remaining components of t_i_x is non-zero, i.e.,
- * that the new schedule row depends on at least one of the remaining
- * columns of Q.
- */
-static __isl_give isl_vec *solve_lp(struct isl_sched_graph *graph)
-{
-	int i;
-	isl_vec *sol;
-	isl_basic_set *lp;
-
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[i];
-		int skip = node->rank;
-		graph->region[i].pos = node->start + 1 + 2*(node->nparam+skip);
-		if (needs_row(graph, node))
-			graph->region[i].len = 2 * (node->nvar - skip);
-		else
-			graph->region[i].len = 0;
-	}
-	lp = isl_basic_set_copy(graph->lp);
-	sol = isl_tab_basic_set_non_trivial_lexmin(lp, 2, graph->n,
-				       graph->region, &check_conflict, graph);
-	return sol;
-}
-
-/* Update the schedules of all nodes based on the given solution
- * of the LP problem.
- * The new row is added to the current band.
- * All possibly negative coefficients are encoded as a difference
- * of two non-negative variables, so we need to perform the subtraction
- * here.  Moreover, if use_cmap is set, then the solution does
- * not refer to the actual coefficients c_i_x, but instead to variables
- * t_i_x such that c_i_x = Q t_i_x and Q is equal to node->cmap.
- * In this case, we then also need to perform this multiplication
- * to obtain the values of c_i_x.
- *
- * If check_zero is set, then the first two coordinates of sol are
- * assumed to correspond to the dependence distance.  If these two
- * coordinates are zero, then the corresponding scheduling dimension
- * is marked as being zero distance.
- */
-static int update_schedule(struct isl_sched_graph *graph,
-	__isl_take isl_vec *sol, int use_cmap, int check_zero)
-{
-	int i, j;
-	int zero = 0;
-	isl_vec *csol = NULL;
-
-	if (!sol)
-		goto error;
-	if (sol->size == 0)
-		isl_die(sol->ctx, isl_error_internal,
-			"no solution found", goto error);
-
-	if (check_zero)
-		zero = isl_int_is_zero(sol->el[1]) &&
-			   isl_int_is_zero(sol->el[2]);
-
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[i];
-		int pos = node->start;
-		int row = isl_mat_rows(node->sched);
-
-		isl_vec_free(csol);
-		csol = isl_vec_alloc(sol->ctx, node->nvar);
-		if (!csol)
-			goto error;
-
-		isl_map_free(node->sched_map);
-		node->sched_map = NULL;
-		node->sched = isl_mat_add_rows(node->sched, 1);
-		if (!node->sched)
-			goto error;
-		node->sched = isl_mat_set_element(node->sched, row, 0,
-						  sol->el[1 + pos]);
-		for (j = 0; j < node->nparam + node->nvar; ++j)
-			isl_int_sub(sol->el[1 + pos + 1 + 2 * j + 1],
-				    sol->el[1 + pos + 1 + 2 * j + 1],
-				    sol->el[1 + pos + 1 + 2 * j]);
-		for (j = 0; j < node->nparam; ++j)
-			node->sched = isl_mat_set_element(node->sched,
-					row, 1 + j, sol->el[1+pos+1+2*j+1]);
-		for (j = 0; j < node->nvar; ++j)
-			isl_int_set(csol->el[j],
-				    sol->el[1+pos+1+2*(node->nparam+j)+1]);
-		if (use_cmap)
-			csol = isl_mat_vec_product(isl_mat_copy(node->cmap),
-						   csol);
-		if (!csol)
-			goto error;
-		for (j = 0; j < node->nvar; ++j)
-			node->sched = isl_mat_set_element(node->sched,
-					row, 1 + node->nparam + j, csol->el[j]);
-		node->band[graph->n_total_row] = graph->n_band;
-		node->zero[graph->n_total_row] = zero;
-	}
-	isl_vec_free(sol);
-	isl_vec_free(csol);
-
-	graph->n_row++;
-	graph->n_total_row++;
-
-	return 0;
-error:
-	isl_vec_free(sol);
-	isl_vec_free(csol);
-	return -1;
-}
-
-/* Convert node->sched into a map and return this map.
- * We simply add equality constraints that express each output variable
- * as the affine combination of parameters and input variables specified
- * by the schedule matrix.
- *
- * The result is cached in node->sched_map, which needs to be released
- * whenever node->sched is updated.
- */
-static __isl_give isl_map *node_extract_schedule(struct isl_sched_node *node)
-{
-	int i, j;
-	isl_space *dim;
-	isl_local_space *ls;
-	isl_basic_map *bmap;
-	isl_constraint *c;
-	int nrow, ncol;
-	isl_int v;
-
-	if (node->sched_map)
-		return isl_map_copy(node->sched_map);
-
-	nrow = isl_mat_rows(node->sched);
-	ncol = isl_mat_cols(node->sched) - 1;
-	dim = isl_space_from_domain(isl_space_copy(node->dim));
-	dim = isl_space_add_dims(dim, isl_dim_out, nrow);
-	bmap = isl_basic_map_universe(isl_space_copy(dim));
-	ls = isl_local_space_from_space(dim);
-
-	isl_int_init(v);
-
-	for (i = 0; i < nrow; ++i) {
-		c = isl_equality_alloc(isl_local_space_copy(ls));
-		isl_constraint_set_coefficient_si(c, isl_dim_out, i, -1);
-		isl_mat_get_element(node->sched, i, 0, &v);
-		isl_constraint_set_constant(c, v);
-		for (j = 0; j < node->nparam; ++j) {
-			isl_mat_get_element(node->sched, i, 1 + j, &v);
-			isl_constraint_set_coefficient(c, isl_dim_param, j, v);
-		}
-		for (j = 0; j < node->nvar; ++j) {
-			isl_mat_get_element(node->sched,
-					    i, 1 + node->nparam + j, &v);
-			isl_constraint_set_coefficient(c, isl_dim_in, j, v);
-		}
-		bmap = isl_basic_map_add_constraint(bmap, c);
-	}
-
-	isl_int_clear(v);
-
-	isl_local_space_free(ls);
-
-	node->sched_map = isl_map_from_basic_map(bmap);
-	return isl_map_copy(node->sched_map);
-}
-
-/* Update the given dependence relation based on the current schedule.
- * That is, intersect the dependence relation with a map expressing
- * that source and sink are executed within the same iteration of
- * the current schedule.
- * This is not the most efficient way, but this shouldn't be a critical
- * operation.
- */
-static __isl_give isl_map *specialize(__isl_take isl_map *map,
-	struct isl_sched_node *src, struct isl_sched_node *dst)
-{
-	isl_map *src_sched, *dst_sched, *id;
-
-	src_sched = node_extract_schedule(src);
-	dst_sched = node_extract_schedule(dst);
-	id = isl_map_apply_range(src_sched, isl_map_reverse(dst_sched));
-	return isl_map_intersect(map, id);
-}
-
-/* Update the dependence relations of all edges based on the current schedule.
- * If a dependence is carried completely by the current schedule, then
- * it is removed and edge_table is updated accordingly.
- */
-static int update_edges(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	int i;
-	int reset_table = 0;
-
-	for (i = graph->n_edge - 1; i >= 0; --i) {
-		struct isl_sched_edge *edge = &graph->edge[i];
-		edge->map = specialize(edge->map, edge->src, edge->dst);
-		if (!edge->map)
-			return -1;
-
-		if (isl_map_plain_is_empty(edge->map)) {
-			reset_table = 1;
-			isl_map_free(edge->map);
-			if (i != graph->n_edge - 1)
-				graph->edge[i] = graph->edge[graph->n_edge - 1];
-			graph->n_edge--;
-		}
-	}
-
-	if (reset_table) {
-		isl_hash_table_free(ctx, graph->edge_table);
-		graph->edge_table = NULL;
-		return graph_init_edge_table(ctx, graph);
-	}
-
-	return 0;
-}
-
-static void next_band(struct isl_sched_graph *graph)
-{
-	graph->band_start = graph->n_total_row;
-	graph->n_band++;
-}
-
-/* Topologically sort statements mapped to same schedule iteration
- * and add a row to the schedule corresponding to this order.
- */
-static int sort_statements(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	int i, j;
-
-	if (graph->n <= 1)
-		return 0;
-
-	if (update_edges(ctx, graph) < 0)
-		return -1;
-
-	if (graph->n_edge == 0)
-		return 0;
-
-	if (detect_sccs(graph) < 0)
-		return -1;
-
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[i];
-		int row = isl_mat_rows(node->sched);
-		int cols = isl_mat_cols(node->sched);
-
-		isl_map_free(node->sched_map);
-		node->sched_map = NULL;
-		node->sched = isl_mat_add_rows(node->sched, 1);
-		if (!node->sched)
-			return -1;
-		node->sched = isl_mat_set_element_si(node->sched, row, 0,
-						     node->scc);
-		for (j = 1; j < cols; ++j)
-			node->sched = isl_mat_set_element_si(node->sched,
-							     row, j, 0);
-		node->band[graph->n_total_row] = graph->n_band;
-	}
-
-	graph->n_total_row++;
-	next_band(graph);
-
-	return 0;
-}
-
-/* Construct an isl_schedule based on the computed schedule stored
- * in graph and with parameters specified by dim.
- */
-static __isl_give isl_schedule *extract_schedule(struct isl_sched_graph *graph,
-	__isl_take isl_space *dim)
-{
-	int i;
-	isl_ctx *ctx;
-	isl_schedule *sched = NULL;
-		
-	if (!dim)
-		return NULL;
-
-	ctx = isl_space_get_ctx(dim);
-	sched = isl_calloc(ctx, struct isl_schedule,
-			   sizeof(struct isl_schedule) +
-			   (graph->n - 1) * sizeof(struct isl_schedule_node));
-	if (!sched)
-		goto error;
-
-	sched->ref = 1;
-	sched->n = graph->n;
-	sched->n_band = graph->n_band;
-	sched->n_total_row = graph->n_total_row;
-
-	for (i = 0; i < sched->n; ++i) {
-		int r, b;
-		int *band_end, *band_id, *zero;
-
-		band_end = isl_alloc_array(ctx, int, graph->n_band);
-		band_id = isl_alloc_array(ctx, int, graph->n_band);
-		zero = isl_alloc_array(ctx, int, graph->n_total_row);
-		sched->node[i].sched = node_extract_schedule(&graph->node[i]);
-		sched->node[i].band_end = band_end;
-		sched->node[i].band_id = band_id;
-		sched->node[i].zero = zero;
-		if (!band_end || !band_id || !zero)
-			goto error;
-
-		for (r = 0; r < graph->n_total_row; ++r)
-			zero[r] = graph->node[i].zero[r];
-		for (r = b = 0; r < graph->n_total_row; ++r) {
-			if (graph->node[i].band[r] == b)
-				continue;
-			band_end[b++] = r;
-			if (graph->node[i].band[r] == -1)
-				break;
-		}
-		if (r == graph->n_total_row)
-			band_end[b++] = r;
-		sched->node[i].n_band = b;
-		for (--b; b >= 0; --b)
-			band_id[b] = graph->node[i].band_id[b];
-	}
-
-	sched->dim = dim;
-
-	return sched;
-error:
-	isl_space_free(dim);
-	isl_schedule_free(sched);
-	return NULL;
-}
-
-/* Copy nodes that satisfy node_pred from the src dependence graph
- * to the dst dependence graph.
- */
-static int copy_nodes(struct isl_sched_graph *dst, struct isl_sched_graph *src,
-	int (*node_pred)(struct isl_sched_node *node, int data), int data)
-{
-	int i;
-
-	dst->n = 0;
-	for (i = 0; i < src->n; ++i) {
-		if (!node_pred(&src->node[i], data))
-			continue;
-		dst->node[dst->n].dim = isl_space_copy(src->node[i].dim);
-		dst->node[dst->n].nvar = src->node[i].nvar;
-		dst->node[dst->n].nparam = src->node[i].nparam;
-		dst->node[dst->n].sched = isl_mat_copy(src->node[i].sched);
-		dst->node[dst->n].sched_map =
-			isl_map_copy(src->node[i].sched_map);
-		dst->node[dst->n].band = src->node[i].band;
-		dst->node[dst->n].band_id = src->node[i].band_id;
-		dst->node[dst->n].zero = src->node[i].zero;
-		dst->n++;
-	}
-
-	return 0;
-}
-
-/* Copy non-empty edges that satisfy edge_pred from the src dependence graph
- * to the dst dependence graph.
- */
-static int copy_edges(isl_ctx *ctx, struct isl_sched_graph *dst,
-	struct isl_sched_graph *src,
-	int (*edge_pred)(struct isl_sched_edge *edge, int data), int data)
-{
-	int i;
-
-	dst->n_edge = 0;
-	for (i = 0; i < src->n_edge; ++i) {
-		struct isl_sched_edge *edge = &src->edge[i];
-		isl_map *map;
-
-		if (!edge_pred(edge, data))
-			continue;
-
-		if (isl_map_plain_is_empty(edge->map))
-			continue;
-
-		map = isl_map_copy(edge->map);
-
-		dst->edge[dst->n_edge].src =
-			graph_find_node(ctx, dst, edge->src->dim);
-		dst->edge[dst->n_edge].dst =
-			graph_find_node(ctx, dst, edge->dst->dim);
-		dst->edge[dst->n_edge].map = map;
-		dst->edge[dst->n_edge].validity = edge->validity;
-		dst->edge[dst->n_edge].proximity = edge->proximity;
-		dst->n_edge++;
-	}
-
-	return 0;
-}
-
-/* Given a "src" dependence graph that contains the nodes from "dst"
- * that satisfy node_pred, copy the schedule computed in "src"
- * for those nodes back to "dst".
- */
-static int copy_schedule(struct isl_sched_graph *dst,
-	struct isl_sched_graph *src,
-	int (*node_pred)(struct isl_sched_node *node, int data), int data)
-{
-	int i;
-
-	src->n = 0;
-	for (i = 0; i < dst->n; ++i) {
-		if (!node_pred(&dst->node[i], data))
-			continue;
-		isl_mat_free(dst->node[i].sched);
-		isl_map_free(dst->node[i].sched_map);
-		dst->node[i].sched = isl_mat_copy(src->node[src->n].sched);
-		dst->node[i].sched_map =
-			isl_map_copy(src->node[src->n].sched_map);
-		src->n++;
-	}
-
-	dst->n_total_row = src->n_total_row;
-	dst->n_band = src->n_band;
-
-	return 0;
-}
-
-/* Compute the maximal number of variables over all nodes.
- * This is the maximal number of linearly independent schedule
- * rows that we need to compute.
- * Just in case we end up in a part of the dependence graph
- * with only lower-dimensional domains, we make sure we will
- * compute the required amount of extra linearly independent rows.
- */
-static int compute_maxvar(struct isl_sched_graph *graph)
-{
-	int i;
-
-	graph->maxvar = 0;
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[i];
-		int nvar;
-
-		if (node_update_cmap(node) < 0)
-			return -1;
-		nvar = node->nvar + graph->n_row - node->rank;
-		if (nvar > graph->maxvar)
-			graph->maxvar = nvar;
-	}
-
-	return 0;
-}
-
-static int compute_schedule(isl_ctx *ctx, struct isl_sched_graph *graph);
-static int compute_schedule_wcc(isl_ctx *ctx, struct isl_sched_graph *graph);
-
-/* Compute a schedule for a subgraph of "graph".  In particular, for
- * the graph composed of nodes that satisfy node_pred and edges that
- * that satisfy edge_pred.  The caller should precompute the number
- * of nodes and edges that satisfy these predicates and pass them along
- * as "n" and "n_edge".
- * If the subgraph is known to consist of a single component, then wcc should
- * be set and then we call compute_schedule_wcc on the constructed subgraph.
- * Otherwise, we call compute_schedule, which will check whether the subgraph
- * is connected.
- */
-static int compute_sub_schedule(isl_ctx *ctx,
-	struct isl_sched_graph *graph, int n, int n_edge,
-	int (*node_pred)(struct isl_sched_node *node, int data),
-	int (*edge_pred)(struct isl_sched_edge *edge, int data),
-	int data, int wcc)
-{
-	struct isl_sched_graph split = { 0 };
-
-	if (graph_alloc(ctx, &split, n, n_edge) < 0)
-		goto error;
-	if (copy_nodes(&split, graph, node_pred, data) < 0)
-		goto error;
-	if (graph_init_table(ctx, &split) < 0)
-		goto error;
-	if (copy_edges(ctx, &split, graph, edge_pred, data) < 0)
-		goto error;
-	if (graph_init_edge_table(ctx, &split) < 0)
-		goto error;
-	split.n_row = graph->n_row;
-	split.n_total_row = graph->n_total_row;
-	split.n_band = graph->n_band;
-	split.band_start = graph->band_start;
-
-	if (wcc && compute_schedule_wcc(ctx, &split) < 0)
-		goto error;
-	if (!wcc && compute_schedule(ctx, &split) < 0)
-		goto error;
-
-	copy_schedule(graph, &split, node_pred, data);
-
-	graph_free(ctx, &split);
-	return 0;
-error:
-	graph_free(ctx, &split);
-	return -1;
-}
-
-static int node_scc_exactly(struct isl_sched_node *node, int scc)
-{
-	return node->scc == scc;
-}
-
-static int node_scc_at_most(struct isl_sched_node *node, int scc)
-{
-	return node->scc <= scc;
-}
-
-static int node_scc_at_least(struct isl_sched_node *node, int scc)
-{
-	return node->scc >= scc;
-}
-
-static int edge_src_scc_exactly(struct isl_sched_edge *edge, int scc)
-{
-	return edge->src->scc == scc;
-}
-
-static int edge_dst_scc_at_most(struct isl_sched_edge *edge, int scc)
-{
-	return edge->dst->scc <= scc;
-}
-
-static int edge_src_scc_at_least(struct isl_sched_edge *edge, int scc)
-{
-	return edge->src->scc >= scc;
-}
-
-/* Pad the schedules of all nodes with zero rows such that in the end
- * they all have graph->n_total_row rows.
- * The extra rows don't belong to any band, so they get assigned band number -1.
- */
-static int pad_schedule(struct isl_sched_graph *graph)
-{
-	int i, j;
-
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[i];
-		int row = isl_mat_rows(node->sched);
-		if (graph->n_total_row > row) {
-			isl_map_free(node->sched_map);
-			node->sched_map = NULL;
-		}
-		node->sched = isl_mat_add_zero_rows(node->sched,
-						    graph->n_total_row - row);
-		if (!node->sched)
-			return -1;
-		for (j = row; j < graph->n_total_row; ++j)
-			node->band[j] = -1;
-	}
-
-	return 0;
-}
-
-/* Split the current graph into two parts and compute a schedule for each
- * part individually.  In particular, one part consists of all SCCs up
- * to and including graph->src_scc, while the other part contains the other
- * SCCS.
- *
- * The split is enforced in the schedule by constant rows with two different
- * values (0 and 1).  These constant rows replace the previously computed rows
- * in the current band.
- * It would be possible to reuse them as the first rows in the next
- * band, but recomputing them may result in better rows as we are looking
- * at a smaller part of the dependence graph.
- *
- * The band_id of the second group is set to n, where n is the number
- * of nodes in the first group.  This ensures that the band_ids over
- * the two groups remain disjoint, even if either or both of the two
- * groups contain independent components.
- */
-static int compute_split_schedule(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	int i, j, n, e1, e2;
-	int n_total_row, orig_total_row;
-	int n_band, orig_band;
-	int drop;
-
-	drop = graph->n_total_row - graph->band_start;
-	graph->n_total_row -= drop;
-	graph->n_row -= drop;
-
-	n = 0;
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[i];
-		int row = isl_mat_rows(node->sched) - drop;
-		int cols = isl_mat_cols(node->sched);
-		int before = node->scc <= graph->src_scc;
-
-		if (before)
-			n++;
-
-		isl_map_free(node->sched_map);
-		node->sched_map = NULL;
-		node->sched = isl_mat_drop_rows(node->sched,
-						graph->band_start, drop);
-		node->sched = isl_mat_add_rows(node->sched, 1);
-		if (!node->sched)
-			return -1;
-		node->sched = isl_mat_set_element_si(node->sched, row, 0,
-						     !before);
-		for (j = 1; j < cols; ++j)
-			node->sched = isl_mat_set_element_si(node->sched,
-							     row, j, 0);
-		node->band[graph->n_total_row] = graph->n_band;
-	}
-
-	e1 = e2 = 0;
-	for (i = 0; i < graph->n_edge; ++i) {
-		if (graph->edge[i].dst->scc <= graph->src_scc)
-			e1++;
-		if (graph->edge[i].src->scc > graph->src_scc)
-			e2++;
-	}
-
-	graph->n_total_row++;
-	next_band(graph);
-
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[i];
-		if (node->scc > graph->src_scc)
-			node->band_id[graph->n_band] = n;
-	}
-
-	orig_total_row = graph->n_total_row;
-	orig_band = graph->n_band;
-	if (compute_sub_schedule(ctx, graph, n, e1,
-				&node_scc_at_most, &edge_dst_scc_at_most,
-				graph->src_scc, 0) < 0)
-		return -1;
-	n_total_row = graph->n_total_row;
-	graph->n_total_row = orig_total_row;
-	n_band = graph->n_band;
-	graph->n_band = orig_band;
-	if (compute_sub_schedule(ctx, graph, graph->n - n, e2,
-				&node_scc_at_least, &edge_src_scc_at_least,
-				graph->src_scc + 1, 0) < 0)
-		return -1;
-	if (n_total_row > graph->n_total_row)
-		graph->n_total_row = n_total_row;
-	if (n_band > graph->n_band)
-		graph->n_band = n_band;
-
-	return pad_schedule(graph);
-}
-
-/* Compute the next band of the schedule after updating the dependence
- * relations based on the the current schedule.
- */
-static int compute_next_band(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	if (update_edges(ctx, graph) < 0)
-		return -1;
-	next_band(graph);
-		
-	return compute_schedule(ctx, graph);
-}
-
-/* Add constraints to graph->lp that force the dependence "map" (which
- * is part of the dependence relation of "edge")
- * to be respected and attempt to carry it, where the edge is one from
- * a node j to itself.  "pos" is the sequence number of the given map.
- * That is, add constraints that enforce
- *
- *	(c_j_0 + c_j_n n + c_j_x y) - (c_j_0 + c_j_n n + c_j_x x)
- *	= c_j_x (y - x) >= e_i
- *
- * for each (x,y) in R.
- * We obtain general constraints on coefficients (c_0, c_n, c_x)
- * of valid constraints for (y - x) and then plug in (-e_i, 0, c_j_x),
- * with each coefficient in c_j_x represented as a pair of non-negative
- * coefficients.
- */
-static int add_intra_constraints(struct isl_sched_graph *graph,
-	struct isl_sched_edge *edge, __isl_take isl_map *map, int pos)
-{
-	unsigned total;
-	isl_ctx *ctx = isl_map_get_ctx(map);
-	isl_space *dim;
-	isl_dim_map *dim_map;
-	isl_basic_set *coef;
-	struct isl_sched_node *node = edge->src;
-
-	coef = intra_coefficients(graph, map);
-
-	dim = isl_space_domain(isl_space_unwrap(isl_basic_set_get_space(coef)));
-
-	total = isl_basic_set_total_dim(graph->lp);
-	dim_map = isl_dim_map_alloc(ctx, total);
-	isl_dim_map_range(dim_map, 3 + pos, 0, 0, 0, 1, -1);
-	isl_dim_map_range(dim_map, node->start + 2 * node->nparam + 1, 2,
-			  isl_space_dim(dim, isl_dim_set), 1,
-			  node->nvar, -1);
-	isl_dim_map_range(dim_map, node->start + 2 * node->nparam + 2, 2,
-			  isl_space_dim(dim, isl_dim_set), 1,
-			  node->nvar, 1);
-	graph->lp = isl_basic_set_extend_constraints(graph->lp,
-			coef->n_eq, coef->n_ineq);
-	graph->lp = isl_basic_set_add_constraints_dim_map(graph->lp,
-							   coef, dim_map);
-	isl_space_free(dim);
-
-	return 0;
-}
-
-/* Add constraints to graph->lp that force the dependence "map" (which
- * is part of the dependence relation of "edge")
- * to be respected and attempt to carry it, where the edge is one from
- * node j to node k.  "pos" is the sequence number of the given map.
- * That is, add constraints that enforce
- *
- *	(c_k_0 + c_k_n n + c_k_x y) - (c_j_0 + c_j_n n + c_j_x x) >= e_i
- *
- * for each (x,y) in R.
- * We obtain general constraints on coefficients (c_0, c_n, c_x)
- * of valid constraints for R and then plug in
- * (-e_i + c_k_0 - c_j_0, c_k_n - c_j_n, c_k_x - c_j_x)
- * with each coefficient (except e_i, c_k_0 and c_j_0)
- * represented as a pair of non-negative coefficients.
- */
-static int add_inter_constraints(struct isl_sched_graph *graph,
-	struct isl_sched_edge *edge, __isl_take isl_map *map, int pos)
-{
-	unsigned total;
-	isl_ctx *ctx = isl_map_get_ctx(map);
-	isl_space *dim;
-	isl_dim_map *dim_map;
-	isl_basic_set *coef;
-	struct isl_sched_node *src = edge->src;
-	struct isl_sched_node *dst = edge->dst;
-
-	coef = inter_coefficients(graph, map);
-
-	dim = isl_space_domain(isl_space_unwrap(isl_basic_set_get_space(coef)));
-
-	total = isl_basic_set_total_dim(graph->lp);
-	dim_map = isl_dim_map_alloc(ctx, total);
-
-	isl_dim_map_range(dim_map, 3 + pos, 0, 0, 0, 1, -1);
-
-	isl_dim_map_range(dim_map, dst->start, 0, 0, 0, 1, 1);
-	isl_dim_map_range(dim_map, dst->start + 1, 2, 1, 1, dst->nparam, -1);
-	isl_dim_map_range(dim_map, dst->start + 2, 2, 1, 1, dst->nparam, 1);
-	isl_dim_map_range(dim_map, dst->start + 2 * dst->nparam + 1, 2,
-			  isl_space_dim(dim, isl_dim_set) + src->nvar, 1,
-			  dst->nvar, -1);
-	isl_dim_map_range(dim_map, dst->start + 2 * dst->nparam + 2, 2,
-			  isl_space_dim(dim, isl_dim_set) + src->nvar, 1,
-			  dst->nvar, 1);
-
-	isl_dim_map_range(dim_map, src->start, 0, 0, 0, 1, -1);
-	isl_dim_map_range(dim_map, src->start + 1, 2, 1, 1, src->nparam, 1);
-	isl_dim_map_range(dim_map, src->start + 2, 2, 1, 1, src->nparam, -1);
-	isl_dim_map_range(dim_map, src->start + 2 * src->nparam + 1, 2,
-			  isl_space_dim(dim, isl_dim_set), 1,
-			  src->nvar, 1);
-	isl_dim_map_range(dim_map, src->start + 2 * src->nparam + 2, 2,
-			  isl_space_dim(dim, isl_dim_set), 1,
-			  src->nvar, -1);
-
-	graph->lp = isl_basic_set_extend_constraints(graph->lp,
-			coef->n_eq, coef->n_ineq);
-	graph->lp = isl_basic_set_add_constraints_dim_map(graph->lp,
-							   coef, dim_map);
-	isl_space_free(dim);
-
-	return 0;
-}
-
-/* Add constraints to graph->lp that force all dependence
- * to be respected and attempt to carry it.
- */
-static int add_all_constraints(struct isl_sched_graph *graph)
-{
-	int i, j;
-	int pos;
-
-	pos = 0;
-	for (i = 0; i < graph->n_edge; ++i) {
-		struct isl_sched_edge *edge= &graph->edge[i];
-		for (j = 0; j < edge->map->n; ++j) {
-			isl_basic_map *bmap;
-			isl_map *map;
-
-			bmap = isl_basic_map_copy(edge->map->p[j]);
-			map = isl_map_from_basic_map(bmap);
-
-			if (edge->src == edge->dst &&
-			    add_intra_constraints(graph, edge, map, pos) < 0)
-				return -1;
-			if (edge->src != edge->dst &&
-			    add_inter_constraints(graph, edge, map, pos) < 0)
-				return -1;
-			++pos;
-		}
-	}
-
-	return 0;
-}
-
-/* Count the number of equality and inequality constraints
- * that will be added to the carry_lp problem.
- * If once is set, then we count
- * each edge exactly once.  Otherwise, we count as follows
- * validity		-> 1 (>= 0)
- * validity+proximity	-> 2 (>= 0 and upper bound)
- * proximity		-> 2 (lower and upper bound)
- */
-static int count_all_constraints(struct isl_sched_graph *graph,
-	int *n_eq, int *n_ineq, int once)
-{
-	int i, j;
-
-	*n_eq = *n_ineq = 0;
-	for (i = 0; i < graph->n_edge; ++i) {
-		struct isl_sched_edge *edge= &graph->edge[i];
-		for (j = 0; j < edge->map->n; ++j) {
-			isl_basic_map *bmap;
-			isl_map *map;
-
-			bmap = isl_basic_map_copy(edge->map->p[j]);
-			map = isl_map_from_basic_map(bmap);
-
-			if (count_map_constraints(graph, edge, map,
-						  n_eq, n_ineq, once) < 0)
-				    return -1;
-		}
-	}
-
-	return 0;
-}
-
-/* Construct an LP problem for finding schedule coefficients
- * such that the schedule carries as many dependences as possible.
- * In particular, for each dependence i, we bound the dependence distance
- * from below by e_i, with 0 <= e_i <= 1 and then maximize the sum
- * of all e_i's.  Dependence with e_i = 0 in the solution are simply
- * respected, while those with e_i > 0 (in practice e_i = 1) are carried.
- * Note that if the dependence relation is a union of basic maps,
- * then we have to consider each basic map individually as it may only
- * be possible to carry the dependences expressed by some of those
- * basic maps and not all off them.
- * Below, we consider each of those basic maps as a separate "edge".
- *
- * All variables of the LP are non-negative.  The actual coefficients
- * may be negative, so each coefficient is represented as the difference
- * of two non-negative variables.  The negative part always appears
- * immediately before the positive part.
- * Other than that, the variables have the following order
- *
- *	- sum of (1 - e_i) over all edges
- *	- sum of positive and negative parts of all c_n coefficients
- *		(unconstrained when computing non-parametric schedules)
- *	- sum of positive and negative parts of all c_x coefficients
- *	- for each edge
- *		- e_i
- *	- for each node
- *		- c_i_0
- *		- positive and negative parts of c_i_n (if parametric)
- *		- positive and negative parts of c_i_x
- *
- * The constraints are those from the edges plus three equalities
- * to express the sums and n_edge inequalities to express e_i <= 1.
- */
-static int setup_carry_lp(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	int i, j;
-	int k;
-	isl_space *dim;
-	unsigned total;
-	int n_eq, n_ineq;
-	int n_edge;
-
-	n_edge = 0;
-	for (i = 0; i < graph->n_edge; ++i)
-		n_edge += graph->edge[i].map->n;
-
-	total = 3 + n_edge;
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[graph->sorted[i]];
-		node->start = total;
-		total += 1 + 2 * (node->nparam + node->nvar);
-	}
-
-	if (count_all_constraints(graph, &n_eq, &n_ineq, 1) < 0)
-		return -1;
-
-	dim = isl_space_set_alloc(ctx, 0, total);
-	isl_basic_set_free(graph->lp);
-	n_eq += 3;
-	n_ineq += n_edge;
-	graph->lp = isl_basic_set_alloc_space(dim, 0, n_eq, n_ineq);
-	graph->lp = isl_basic_set_set_rational(graph->lp);
-
-	k = isl_basic_set_alloc_equality(graph->lp);
-	if (k < 0)
-		return -1;
-	isl_seq_clr(graph->lp->eq[k], 1 +  total);
-	isl_int_set_si(graph->lp->eq[k][0], -n_edge);
-	isl_int_set_si(graph->lp->eq[k][1], 1);
-	for (i = 0; i < n_edge; ++i)
-		isl_int_set_si(graph->lp->eq[k][4 + i], 1);
-
-	k = isl_basic_set_alloc_equality(graph->lp);
-	if (k < 0)
-		return -1;
-	isl_seq_clr(graph->lp->eq[k], 1 +  total);
-	isl_int_set_si(graph->lp->eq[k][2], -1);
-	for (i = 0; i < graph->n; ++i) {
-		int pos = 1 + graph->node[i].start + 1;
-
-		for (j = 0; j < 2 * graph->node[i].nparam; ++j)
-			isl_int_set_si(graph->lp->eq[k][pos + j], 1);
-	}
-
-	k = isl_basic_set_alloc_equality(graph->lp);
-	if (k < 0)
-		return -1;
-	isl_seq_clr(graph->lp->eq[k], 1 +  total);
-	isl_int_set_si(graph->lp->eq[k][3], -1);
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[i];
-		int pos = 1 + node->start + 1 + 2 * node->nparam;
-
-		for (j = 0; j < 2 * node->nvar; ++j)
-			isl_int_set_si(graph->lp->eq[k][pos + j], 1);
-	}
-
-	for (i = 0; i < n_edge; ++i) {
-		k = isl_basic_set_alloc_inequality(graph->lp);
-		if (k < 0)
-			return -1;
-		isl_seq_clr(graph->lp->ineq[k], 1 +  total);
-		isl_int_set_si(graph->lp->ineq[k][4 + i], -1);
-		isl_int_set_si(graph->lp->ineq[k][0], 1);
-	}
-
-	if (add_all_constraints(graph) < 0)
-		return -1;
-
-	return 0;
-}
-
-/* If the schedule_split_parallel option is set and if the linear
- * parts of the scheduling rows for all nodes in the graphs are the same,
- * then split off the constant term from the linear part.
- * The constant term is then placed in a separate band and
- * the linear part is simplified.
- */
-static int split_parallel(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	int i;
-	int equal = 1;
-	int row, cols;
-	struct isl_sched_node *node0;
-
-	if (!ctx->opt->schedule_split_parallel)
-		return 0;
-	if (graph->n <= 1)
-		return 0;
-
-	node0 = &graph->node[0];
-	row = isl_mat_rows(node0->sched) - 1;
-	cols = isl_mat_cols(node0->sched);
-	for (i = 1; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[i];
-
-		if (!isl_seq_eq(node0->sched->row[row] + 1,
-				node->sched->row[row] + 1, cols - 1))
-			return 0;
-		if (equal &&
-		    isl_int_ne(node0->sched->row[row][0],
-			       node->sched->row[row][0]))
-			equal = 0;
-	}
-	if (equal)
-		return 0;
-
-	next_band(graph);
-
-	for (i = 0; i < graph->n; ++i) {
-		struct isl_sched_node *node = &graph->node[i];
-
-		isl_map_free(node->sched_map);
-		node->sched_map = NULL;
-		node->sched = isl_mat_add_zero_rows(node->sched, 1);
-		if (!node->sched)
-			return -1;
-		isl_int_set(node->sched->row[row + 1][0],
-			    node->sched->row[row][0]);
-		isl_int_set_si(node->sched->row[row][0], 0);
-		node->sched = isl_mat_normalize_row(node->sched, row);
-		if (!node->sched)
-			return -1;
-		node->band[graph->n_total_row] = graph->n_band;
-	}
-
-	graph->n_total_row++;
-
-	return 0;
-}
-
-/* Construct a schedule row for each node such that as many dependences
- * as possible are carried and then continue with the next band.
- */
-static int carry_dependences(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	int i;
-	int n_edge;
-	isl_vec *sol;
-	isl_basic_set *lp;
-
-	n_edge = 0;
-	for (i = 0; i < graph->n_edge; ++i)
-		n_edge += graph->edge[i].map->n;
-
-	if (setup_carry_lp(ctx, graph) < 0)
-		return -1;
-
-	lp = isl_basic_set_copy(graph->lp);
-	sol = isl_tab_basic_set_non_neg_lexmin(lp);
-	if (!sol)
-		return -1;
-
-	if (sol->size == 0) {
-		isl_vec_free(sol);
-		isl_die(ctx, isl_error_internal,
-			"error in schedule construction", return -1);
-	}
-
-	if (isl_int_cmp_si(sol->el[1], n_edge) >= 0) {
-		isl_vec_free(sol);
-		isl_die(ctx, isl_error_unknown,
-			"unable to carry dependences", return -1);
-	}
-
-	if (update_schedule(graph, sol, 0, 0) < 0)
-		return -1;
-
-	if (split_parallel(ctx, graph) < 0)
-		return -1;
-
-	return compute_next_band(ctx, graph);
-}
-
-/* Compute a schedule for a connected dependence graph.
- * We try to find a sequence of as many schedule rows as possible that result
- * in non-negative dependence distances (independent of the previous rows
- * in the sequence, i.e., such that the sequence is tilable).
- * If we can't find any more rows we either
- * - split between SCCs and start over (assuming we found an interesting
- *	pair of SCCs between which to split)
- * - continue with the next band (assuming the current band has at least
- *	one row)
- * - try to carry as many dependences as possible and continue with the next
- *	band
- *
- * If we manage to complete the schedule, we finish off by topologically
- * sorting the statements based on the remaining dependences.
- *
- * If ctx->opt->schedule_outer_zero_distance is set, then we force the
- * outermost dimension in the current band to be zero distance.  If this
- * turns out to be impossible, we fall back on the general scheme above
- * and try to carry as many dependences as possible.
- */
-static int compute_schedule_wcc(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	int force_zero = 0;
-	int max_constant_term;
-
-	if (detect_sccs(graph) < 0)
-		return -1;
-	sort_sccs(graph);
-
-	if (compute_maxvar(graph) < 0)
-		return -1;
-
-	if (ctx->opt->schedule_outer_zero_distance)
-		force_zero = 1;
-
-	max_constant_term = ctx->opt->schedule_max_constant_term;
-
-	while (graph->n_row < graph->maxvar) {
-		isl_vec *sol;
-
-		graph->src_scc = -1;
-		graph->dst_scc = -1;
-
-		if (setup_lp(ctx, graph, force_zero, max_constant_term) < 0)
-			return -1;
-		sol = solve_lp(graph);
-		if (!sol)
-			return -1;
-		if (sol->size == 0) {
-			isl_vec_free(sol);
-			if (!ctx->opt->schedule_maximize_band_depth &&
-			    graph->n_total_row > graph->band_start)
-				return compute_next_band(ctx, graph);
-			if (graph->src_scc >= 0)
-				return compute_split_schedule(ctx, graph);
-			if (graph->n_total_row > graph->band_start)
-				return compute_next_band(ctx, graph);
-			return carry_dependences(ctx, graph);
-		}
-		if (update_schedule(graph, sol, 1, 1) < 0)
-			return -1;
-		force_zero = 0;
-	}
-
-	if (graph->n_total_row > graph->band_start)
-		next_band(graph);
-	return sort_statements(ctx, graph);
-}
-
-/* Compute a schedule for each component (identified by node->scc)
- * of the dependence graph separately and then combine the results.
- *
- * The band_id is adjusted such that each component has a separate id.
- * Note that the band_id may have already been set to a value different
- * from zero by compute_split_schedule.
- */
-static int compute_component_schedule(isl_ctx *ctx,
-	struct isl_sched_graph *graph)
-{
-	int wcc, i;
-	int n, n_edge;
-	int n_total_row, orig_total_row;
-	int n_band, orig_band;
-
-	n_total_row = 0;
-	orig_total_row = graph->n_total_row;
-	n_band = 0;
-	orig_band = graph->n_band;
-	for (i = 0; i < graph->n; ++i)
-		graph->node[i].band_id[graph->n_band] += graph->node[i].scc;
-	for (wcc = 0; wcc < graph->scc; ++wcc) {
-		n = 0;
-		for (i = 0; i < graph->n; ++i)
-			if (graph->node[i].scc == wcc)
-				n++;
-		n_edge = 0;
-		for (i = 0; i < graph->n_edge; ++i)
-			if (graph->edge[i].src->scc == wcc)
-				n_edge++;
-
-		if (compute_sub_schedule(ctx, graph, n, n_edge,
-				    &node_scc_exactly,
-				    &edge_src_scc_exactly, wcc, 1) < 0)
-			return -1;
-		if (graph->n_total_row > n_total_row)
-			n_total_row = graph->n_total_row;
-		graph->n_total_row = orig_total_row;
-		if (graph->n_band > n_band)
-			n_band = graph->n_band;
-		graph->n_band = orig_band;
-	}
-
-	graph->n_total_row = n_total_row;
-	graph->n_band = n_band;
-
-	return pad_schedule(graph);
-}
-
-/* Compute a schedule for the given dependence graph.
- * We first check if the graph is connected (through validity dependences)
- * and, if not, compute a schedule for each component separately.
- */
-static int compute_schedule(isl_ctx *ctx, struct isl_sched_graph *graph)
-{
-	if (detect_wccs(graph) < 0)
-		return -1;
-
-	if (graph->scc > 1)
-		return compute_component_schedule(ctx, graph);
-
-	return compute_schedule_wcc(ctx, graph);
-}
-
-/* Compute a schedule for the given union of domains that respects
- * all the validity dependences and tries to minimize the dependence
- * distances over the proximity dependences.
- */
-__isl_give isl_schedule *isl_union_set_compute_schedule(
-	__isl_take isl_union_set *domain,
-	__isl_take isl_union_map *validity,
-	__isl_take isl_union_map *proximity)
-{
-	isl_ctx *ctx = isl_union_set_get_ctx(domain);
-	isl_space *dim;
-	struct isl_sched_graph graph = { 0 };
-	isl_schedule *sched;
-
-	domain = isl_union_set_align_params(domain,
-					    isl_union_map_get_space(validity));
-	domain = isl_union_set_align_params(domain,
-					    isl_union_map_get_space(proximity));
-	dim = isl_union_set_get_space(domain);
-	validity = isl_union_map_align_params(validity, isl_space_copy(dim));
-	proximity = isl_union_map_align_params(proximity, dim);
-
-	if (!domain)
-		goto error;
-
-	graph.n = isl_union_set_n_set(domain);
-	if (graph.n == 0)
-		goto empty;
-	if (graph_alloc(ctx, &graph, graph.n,
-	    isl_union_map_n_map(validity) + isl_union_map_n_map(proximity)) < 0)
-		goto error;
-	graph.root = 1;
-	graph.n = 0;
-	if (isl_union_set_foreach_set(domain, &extract_node, &graph) < 0)
-		goto error;
-	if (graph_init_table(ctx, &graph) < 0)
-		goto error;
-	graph.n_edge = 0;
-	if (isl_union_map_foreach_map(validity, &extract_edge, &graph) < 0)
-		goto error;
-	if (graph_init_edge_table(ctx, &graph) < 0)
-		goto error;
-	if (isl_union_map_foreach_map(proximity, &extract_edge, &graph) < 0)
-		goto error;
-
-	if (compute_schedule(ctx, &graph) < 0)
-		goto error;
-
-empty:
-	sched = extract_schedule(&graph, isl_union_set_get_space(domain));
-
-	graph_free(ctx, &graph);
-	isl_union_set_free(domain);
-	isl_union_map_free(validity);
-	isl_union_map_free(proximity);
-
-	return sched;
-error:
-	graph_free(ctx, &graph);
-	isl_union_set_free(domain);
-	isl_union_map_free(validity);
-	isl_union_map_free(proximity);
-	return NULL;
-}
-
-void *isl_schedule_free(__isl_take isl_schedule *sched)
-{
-	int i;
-	if (!sched)
-		return NULL;
-
-	if (--sched->ref > 0)
-		return NULL;
-
-	for (i = 0; i < sched->n; ++i) {
-		isl_map_free(sched->node[i].sched);
-		free(sched->node[i].band_end);
-		free(sched->node[i].band_id);
-		free(sched->node[i].zero);
-	}
-	isl_space_free(sched->dim);
-	isl_band_list_free(sched->band_forest);
-	free(sched);
-	return NULL;
-}
-
-isl_ctx *isl_schedule_get_ctx(__isl_keep isl_schedule *schedule)
-{
-	return schedule ? isl_space_get_ctx(schedule->dim) : NULL;
-}
-
-__isl_give isl_union_map *isl_schedule_get_map(__isl_keep isl_schedule *sched)
-{
-	int i;
-	isl_union_map *umap;
-
-	if (!sched)
-		return NULL;
-
-	umap = isl_union_map_empty(isl_space_copy(sched->dim));
-	for (i = 0; i < sched->n; ++i)
-		umap = isl_union_map_add_map(umap,
-					    isl_map_copy(sched->node[i].sched));
-
-	return umap;
-}
-
-static __isl_give isl_band_list *construct_band_list(
-	__isl_keep isl_schedule *schedule, __isl_keep isl_band *parent,
-	int band_nr, int *parent_active, int n_active);
-
-/* Construct an isl_band structure for the band in the given schedule
- * with sequence number band_nr for the n_active nodes marked by active.
- * If the nodes don't have a band with the given sequence number,
- * then a band without members is created.
- *
- * Because of the way the schedule is constructed, we know that
- * the position of the band inside the schedule of a node is the same
- * for all active nodes.
- */
-static __isl_give isl_band *construct_band(__isl_keep isl_schedule *schedule,
-	__isl_keep isl_band *parent,
-	int band_nr, int *active, int n_active)
-{
-	int i, j;
-	isl_ctx *ctx = isl_schedule_get_ctx(schedule);
-	isl_band *band;
-	unsigned start, end;
-
-	band = isl_calloc_type(ctx, isl_band);
-	if (!band)
-		return NULL;
-
-	band->ref = 1;
-	band->schedule = schedule;
-	band->parent = parent;
-
-	for (i = 0; i < schedule->n; ++i)
-		if (active[i] && schedule->node[i].n_band > band_nr + 1)
-			break;
-
-	if (i < schedule->n) {
-		band->children = construct_band_list(schedule, band,
-						band_nr + 1, active, n_active);
-		if (!band->children)
-			goto error;
-	}
-
-	for (i = 0; i < schedule->n; ++i)
-		if (active[i])
-			break;
-
-	if (i >= schedule->n)
-		isl_die(ctx, isl_error_internal,
-			"band without active statements", goto error);
-
-	start = band_nr ? schedule->node[i].band_end[band_nr - 1] : 0;
-	end = band_nr < schedule->node[i].n_band ?
-		schedule->node[i].band_end[band_nr] : start;
-	band->n = end - start;
-
-	band->zero = isl_alloc_array(ctx, int, band->n);
-	if (!band->zero)
-		goto error;
-
-	for (j = 0; j < band->n; ++j)
-		band->zero[j] = schedule->node[i].zero[start + j];
-
-	band->map = isl_union_map_empty(isl_space_copy(schedule->dim));
-	for (i = 0; i < schedule->n; ++i) {
-		isl_map *map;
-		unsigned n_out;
-
-		if (!active[i])
-			continue;
-
-		map = isl_map_copy(schedule->node[i].sched);
-		n_out = isl_map_dim(map, isl_dim_out);
-		map = isl_map_project_out(map, isl_dim_out, end, n_out - end);
-		map = isl_map_project_out(map, isl_dim_out, 0, start);
-		band->map = isl_union_map_union(band->map,
-						isl_union_map_from_map(map));
-	}
-	if (!band->map)
-		goto error;
-
-	return band;
-error:
-	isl_band_free(band);
-	return NULL;
-}
-
-/* Construct a list of bands that start at the same position (with
- * sequence number band_nr) in the schedules of the nodes that
- * were active in the parent band.
- *
- * A separate isl_band structure is created for each band_id
- * and for each node that does not have a band with sequence
- * number band_nr.  In the latter case, a band without members
- * is created.
- * This ensures that if a band has any children, then each node
- * that was active in the band is active in exactly one of the children.
- */
-static __isl_give isl_band_list *construct_band_list(
-	__isl_keep isl_schedule *schedule, __isl_keep isl_band *parent,
-	int band_nr, int *parent_active, int n_active)
-{
-	int i, j;
-	isl_ctx *ctx = isl_schedule_get_ctx(schedule);
-	int *active;
-	int n_band;
-	isl_band_list *list;
-
-	n_band = 0;
-	for (i = 0; i < n_active; ++i) {
-		for (j = 0; j < schedule->n; ++j) {
-			if (!parent_active[j])
-				continue;
-			if (schedule->node[j].n_band <= band_nr)
-				continue;
-			if (schedule->node[j].band_id[band_nr] == i) {
-				n_band++;
-				break;
-			}
-		}
-	}
-	for (j = 0; j < schedule->n; ++j)
-		if (schedule->node[j].n_band <= band_nr)
-			n_band++;
-
-	if (n_band == 1) {
-		isl_band *band;
-		list = isl_band_list_alloc(ctx, n_band);
-		band = construct_band(schedule, parent, band_nr,
-					parent_active, n_active);
-		return isl_band_list_add(list, band);
-	}
-
-	active = isl_alloc_array(ctx, int, schedule->n);
-	if (!active)
-		return NULL;
-
-	list = isl_band_list_alloc(ctx, n_band);
-
-	for (i = 0; i < n_active; ++i) {
-		int n = 0;
-		isl_band *band;
-
-		for (j = 0; j < schedule->n; ++j) {
-			active[j] = parent_active[j] &&
-					schedule->node[j].n_band > band_nr &&
-					schedule->node[j].band_id[band_nr] == i;
-			if (active[j])
-				n++;
-		}
-		if (n == 0)
-			continue;
-
-		band = construct_band(schedule, parent, band_nr, active, n);
-
-		list = isl_band_list_add(list, band);
-	}
-	for (i = 0; i < schedule->n; ++i) {
-		isl_band *band;
-		if (!parent_active[i])
-			continue;
-		if (schedule->node[i].n_band > band_nr)
-			continue;
-		for (j = 0; j < schedule->n; ++j)
-			active[j] = j == i;
-		band = construct_band(schedule, parent, band_nr, active, 1);
-		list = isl_band_list_add(list, band);
-	}
-
-	free(active);
-
-	return list;
-}
-
-/* Construct a band forest representation of the schedule and
- * return the list of roots.
- */
-static __isl_give isl_band_list *construct_forest(
-	__isl_keep isl_schedule *schedule)
-{
-	int i;
-	isl_ctx *ctx = isl_schedule_get_ctx(schedule);
-	isl_band_list *forest;
-	int *active;
-
-	active = isl_alloc_array(ctx, int, schedule->n);
-	if (!active)
-		return NULL;
-
-	for (i = 0; i < schedule->n; ++i)
-		active[i] = 1;
-
-	forest = construct_band_list(schedule, NULL, 0, active, schedule->n);
-
-	free(active);
-
-	return forest;
-}
-
-/* Return the roots of a band forest representation of the schedule.
- */
-__isl_give isl_band_list *isl_schedule_get_band_forest(
-	__isl_keep isl_schedule *schedule)
-{
-	if (!schedule)
-		return NULL;
-	if (!schedule->band_forest)
-		schedule->band_forest = construct_forest(schedule);
-	return isl_band_list_dup(schedule->band_forest);
-}
-
-static __isl_give isl_printer *print_band_list(__isl_take isl_printer *p,
-	__isl_keep isl_band_list *list);
-
-static __isl_give isl_printer *print_band(__isl_take isl_printer *p,
-	__isl_keep isl_band *band)
-{
-	isl_band_list *children;
-
-	p = isl_printer_start_line(p);
-	p = isl_printer_print_union_map(p, band->map);
-	p = isl_printer_end_line(p);
-
-	if (!isl_band_has_children(band))
-		return p;
-
-	children = isl_band_get_children(band);
-
-	p = isl_printer_indent(p, 4);
-	p = print_band_list(p, children);
-	p = isl_printer_indent(p, -4);
-
-	isl_band_list_free(children);
-
-	return p;
-}
-
-static __isl_give isl_printer *print_band_list(__isl_take isl_printer *p,
-	__isl_keep isl_band_list *list)
-{
-	int i, n;
-
-	n = isl_band_list_n_band(list);
-	for (i = 0; i < n; ++i) {
-		isl_band *band;
-		band = isl_band_list_get_band(list, i);
-		p = print_band(p, band);
-		isl_band_free(band);
-	}
-
-	return p;
-}
-
-__isl_give isl_printer *isl_printer_print_schedule(__isl_take isl_printer *p,
-	__isl_keep isl_schedule *schedule)
-{
-	isl_band_list *forest;
-
-	forest = isl_schedule_get_band_forest(schedule);
-
-	p = print_band_list(p, forest);
-
-	isl_band_list_free(forest);
-
-	return p;
-}
-
-void isl_schedule_dump(__isl_keep isl_schedule *schedule)
-{
-	isl_printer *printer;
-
-	if (!schedule)
-		return;
-
-	printer = isl_printer_to_file(isl_schedule_get_ctx(schedule), stderr);
-	printer = isl_printer_print_schedule(printer, schedule);
-
-	isl_printer_free(printer);
-}
diff --git a/cloog-0.17.0/isl/isl_schedule_private.h b/cloog-0.17.0/isl/isl_schedule_private.h
deleted file mode 100644
index cbf1f9c..0000000
--- a/cloog-0.17.0/isl/isl_schedule_private.h
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef ISL_SCHEDLUE_PRIVATE_H
-#define ISL_SCHEDLUE_PRIVATE_H
-
-#include <isl/schedule.h>
-
-/* The schedule for an individual domain, plus information about the bands
- * and scheduling dimensions.
- * In particular, we keep track of the number of bands and for each
- * band, the starting position of the next band.  The first band starts at
- * position 0.
- * For each scheduling dimension, we keep track of whether it result
- * in zero dependence distances (within its band) with respect
- * to the proximity edges.
- */
-struct isl_schedule_node {
-	isl_map *sched;
-	int	 n_band;
-	int	*band_end;
-	int	*band_id;
-	int	*zero;
-};
-
-/* Information about the computed schedule.
- * n is the number of nodes/domains/statements.
- * n_band is the maximal number of bands.
- * n_total_row is the number of coordinates of the schedule.
- * dim contains a description of the parameters.
- * band_forest points to a band forest representation of the schedule
- * and may be NULL if the forest hasn't been created yet.
- */
-struct isl_schedule {
-	int ref;
-
-	int n;
-	int n_band;
-	int n_total_row;
-	isl_space *dim;
-
-	isl_band_list *band_forest;
-
-	struct isl_schedule_node node[1];
-};
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_seq.c b/cloog-0.17.0/isl/isl_seq.c
deleted file mode 100644
index dd80c19..0000000
--- a/cloog-0.17.0/isl/isl_seq.c
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl/seq.h>
-
-void isl_seq_clr(isl_int *p, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_set_si(p[i], 0);
-}
-
-void isl_seq_set(isl_int *p, isl_int v, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_set(p[i], v);
-}
-
-void isl_seq_neg(isl_int *dst, isl_int *src, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_neg(dst[i], src[i]);
-}
-
-void isl_seq_cpy(isl_int *dst, isl_int *src, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_set(dst[i], src[i]);
-}
-
-void isl_seq_submul(isl_int *dst, isl_int f, isl_int *src, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_submul(dst[i], f, src[i]);
-}
-
-void isl_seq_addmul(isl_int *dst, isl_int f, isl_int *src, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_addmul(dst[i], f, src[i]);
-}
-
-void isl_seq_swp_or_cpy(isl_int *dst, isl_int *src, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_swap_or_set(dst[i], src[i]);
-}
-
-void isl_seq_scale(isl_int *dst, isl_int *src, isl_int m, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_mul(dst[i], src[i], m);
-}
-
-void isl_seq_scale_down(isl_int *dst, isl_int *src, isl_int m, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_divexact(dst[i], src[i], m);
-}
-
-void isl_seq_cdiv_q(isl_int *dst, isl_int *src, isl_int m, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_cdiv_q(dst[i], src[i], m);
-}
-
-void isl_seq_fdiv_q(isl_int *dst, isl_int *src, isl_int m, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_fdiv_q(dst[i], src[i], m);
-}
-
-void isl_seq_fdiv_r(isl_int *dst, isl_int *src, isl_int m, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		isl_int_fdiv_r(dst[i], src[i], m);
-}
-
-void isl_seq_combine(isl_int *dst, isl_int m1, isl_int *src1,
-			isl_int m2, isl_int *src2, unsigned len)
-{
-	int i;
-	isl_int tmp;
-
-	isl_int_init(tmp);
-	for (i = 0; i < len; ++i) {
-		isl_int_mul(tmp, m1, src1[i]);
-		isl_int_addmul(tmp, m2, src2[i]);
-		isl_int_set(dst[i], tmp);
-	}
-	isl_int_clear(tmp);
-}
-
-/*
- * Let d = dst[pos] and s = src[pos]
- * dst is replaced by |s| dst - sgn(s)d src
- */
-void isl_seq_elim(isl_int *dst, isl_int *src, unsigned pos, unsigned len,
-		  isl_int *m)
-{
-	isl_int a;
-	isl_int b;
-
-	if (isl_int_is_zero(dst[pos]))
-		return;
-
-	isl_int_init(a);
-	isl_int_init(b);
-
-	isl_int_gcd(a, src[pos], dst[pos]);
-	isl_int_divexact(b, dst[pos], a);
-	if (isl_int_is_pos(src[pos]))
-		isl_int_neg(b, b);
-	isl_int_divexact(a, src[pos], a);
-	isl_int_abs(a, a);
-	isl_seq_combine(dst, a, dst, b, src, len);
-
-	if (m)
-		isl_int_mul(*m, *m, a);
-
-	isl_int_clear(a);
-	isl_int_clear(b);
-}
-
-int isl_seq_eq(isl_int *p1, isl_int *p2, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		if (isl_int_ne(p1[i], p2[i]))
-			return 0;
-	return 1;
-}
-
-int isl_seq_cmp(isl_int *p1, isl_int *p2, unsigned len)
-{
-	int i;
-	int cmp;
-	for (i = 0; i < len; ++i)
-		if ((cmp = isl_int_cmp(p1[i], p2[i])) != 0)
-			return cmp;
-	return 0;
-}
-
-int isl_seq_is_neg(isl_int *p1, isl_int *p2, unsigned len)
-{
-	int i;
-
-	for (i = 0; i < len; ++i) {
-		if (isl_int_abs_ne(p1[i], p2[i]))
-			return 0;
-		if (isl_int_is_zero(p1[i]))
-			continue;
-		if (isl_int_eq(p1[i], p2[i]))
-			return 0;
-	}
-	return 1;
-}
-
-int isl_seq_first_non_zero(isl_int *p, unsigned len)
-{
-	int i;
-
-	for (i = 0; i < len; ++i)
-		if (!isl_int_is_zero(p[i]))
-			return i;
-	return -1;
-}
-
-int isl_seq_last_non_zero(isl_int *p, unsigned len)
-{
-	int i;
-
-	for (i = len - 1; i >= 0; --i)
-		if (!isl_int_is_zero(p[i]))
-			return i;
-	return -1;
-}
-
-int isl_seq_abs_min_non_zero(isl_int *p, unsigned len)
-{
-	int i, min = isl_seq_first_non_zero(p, len);
-	if (min < 0)
-		return -1;
-	for (i = min + 1; i < len; ++i) {
-		if (isl_int_is_zero(p[i]))
-			continue;
-		if (isl_int_abs_lt(p[i], p[min]))
-			min = i;
-	}
-	return min;
-}
-
-void isl_seq_gcd(isl_int *p, unsigned len, isl_int *gcd)
-{
-	int i, min = isl_seq_abs_min_non_zero(p, len);
-
-	if (min < 0) {
-		isl_int_set_si(*gcd, 0);
-		return;
-	}
-	isl_int_abs(*gcd, p[min]);
-	for (i = 0; isl_int_cmp_si(*gcd, 1) > 0 && i < len; ++i) {
-		if (i == min)
-			continue;
-		if (isl_int_is_zero(p[i]))
-			continue;
-		isl_int_gcd(*gcd, *gcd, p[i]);
-	}
-}
-
-void isl_seq_normalize(struct isl_ctx *ctx, isl_int *p, unsigned len)
-{
-	if (len == 0)
-		return;
-	isl_seq_gcd(p, len, &ctx->normalize_gcd);
-	if (!isl_int_is_zero(ctx->normalize_gcd) &&
-	    !isl_int_is_one(ctx->normalize_gcd))
-		isl_seq_scale_down(p, p, ctx->normalize_gcd, len);
-}
-
-void isl_seq_lcm(isl_int *p, unsigned len, isl_int *lcm)
-{
-	int i;
-
-	if (len == 0) {
-		isl_int_set_si(*lcm, 1);
-		return;
-	}
-	isl_int_set(*lcm, p[0]);
-	for (i = 1; i < len; ++i)
-		isl_int_lcm(*lcm, *lcm, p[i]);
-}
-
-void isl_seq_inner_product(isl_int *p1, isl_int *p2, unsigned len,
-			   isl_int *prod)
-{
-	int i;
-	if (len == 0) {
-		isl_int_set_si(*prod, 0);
-		return;
-	}
-	isl_int_mul(*prod, p1[0], p2[0]);
-	for (i = 1; i < len; ++i)
-		isl_int_addmul(*prod, p1[i], p2[i]);
-}
-
-uint32_t isl_seq_hash(isl_int *p, unsigned len, uint32_t hash)
-{
-	int i;
-	for (i = 0; i < len; ++i) {
-		if (isl_int_is_zero(p[i]))
-			continue;
-		hash *= 16777619;
-		hash ^= (i & 0xFF);
-		hash = isl_int_hash(p[i], hash);
-	}
-	return hash;
-}
-
-uint32_t isl_seq_get_hash(isl_int *p, unsigned len)
-{
-	uint32_t hash = isl_hash_init();
-
-	return isl_seq_hash(p, len, hash);
-}
-
-uint32_t isl_seq_get_hash_bits(isl_int *p, unsigned len, unsigned bits)
-{
-	uint32_t hash;
-
-	hash = isl_seq_get_hash(p, len);
-	return isl_hash_bits(hash, bits);
-}
diff --git a/cloog-0.17.0/isl/isl_space.c b/cloog-0.17.0/isl/isl_space.c
deleted file mode 100644
index ae68013..0000000
--- a/cloog-0.17.0/isl/isl_space.c
+++ /dev/null
@@ -1,1682 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France 
- */
-
-#include <stdlib.h>
-#include <isl_space_private.h>
-#include <isl_id_private.h>
-#include <isl_reordering.h>
-
-isl_ctx *isl_space_get_ctx(__isl_keep isl_space *dim)
-{
-	return dim ? dim->ctx : NULL;
-}
-
-__isl_give isl_space *isl_space_alloc(isl_ctx *ctx,
-			unsigned nparam, unsigned n_in, unsigned n_out)
-{
-	isl_space *dim;
-
-	dim = isl_alloc_type(ctx, struct isl_space);
-	if (!dim)
-		return NULL;
-
-	dim->ctx = ctx;
-	isl_ctx_ref(ctx);
-	dim->ref = 1;
-	dim->nparam = nparam;
-	dim->n_in = n_in;
-	dim->n_out = n_out;
-
-	dim->tuple_id[0] = NULL;
-	dim->tuple_id[1] = NULL;
-
-	dim->nested[0] = NULL;
-	dim->nested[1] = NULL;
-
-	dim->n_id = 0;
-	dim->ids = NULL;
-
-	return dim;
-}
-
-/* Mark the space as being that of a set, by setting the domain tuple
- * to isl_id_none.
- */
-static __isl_give isl_space *mark_as_set(__isl_take isl_space *space)
-{
-	space = isl_space_cow(space);
-	if (!space)
-		return NULL;
-	space = isl_space_set_tuple_id(space, isl_dim_in, &isl_id_none);
-	return space;
-}
-
-/* Is the space that of a set?
- */
-int isl_space_is_set(__isl_keep isl_space *space)
-{
-	if (!space)
-		return -1;
-	if (space->n_in != 0 || space->nested[0])
-		return 0;
-	if (space->tuple_id[0] != &isl_id_none)
-		return 0;
-	return 1;
-}
-
-__isl_give isl_space *isl_space_set_alloc(isl_ctx *ctx,
-			unsigned nparam, unsigned dim)
-{
-	isl_space *space;
-	space = isl_space_alloc(ctx, nparam, 0, dim);
-	space = mark_as_set(space);
-	return space;
-}
-
-/* Mark the space as being that of a parameter domain, by setting
- * both tuples to isl_id_none.
- */
-static __isl_give isl_space *mark_as_params(isl_space *space)
-{
-	if (!space)
-		return NULL;
-	space = isl_space_set_tuple_id(space, isl_dim_in, &isl_id_none);
-	space = isl_space_set_tuple_id(space, isl_dim_out, &isl_id_none);
-	return space;
-}
-
-/* Is the space that of a parameter domain?
- */
-int isl_space_is_params(__isl_keep isl_space *space)
-{
-	if (!space)
-		return -1;
-	if (space->n_in != 0 || space->nested[0] ||
-	    space->n_out != 0 || space->nested[1])
-		return 0;
-	if (space->tuple_id[0] != &isl_id_none)
-		return 0;
-	if (space->tuple_id[1] != &isl_id_none)
-		return 0;
-	return 1;
-}
-
-/* Create a space for a parameter domain.
- */
-__isl_give isl_space *isl_space_params_alloc(isl_ctx *ctx, unsigned nparam)
-{
-	isl_space *space;
-	space = isl_space_alloc(ctx, nparam, 0, 0);
-	space = mark_as_params(space);
-	return space;
-}
-
-static unsigned global_pos(__isl_keep isl_space *dim,
-				 enum isl_dim_type type, unsigned pos)
-{
-	struct isl_ctx *ctx = dim->ctx;
-
-	switch (type) {
-	case isl_dim_param:
-		isl_assert(ctx, pos < dim->nparam,
-			    return isl_space_dim(dim, isl_dim_all));
-		return pos;
-	case isl_dim_in:
-		isl_assert(ctx, pos < dim->n_in,
-			    return isl_space_dim(dim, isl_dim_all));
-		return pos + dim->nparam;
-	case isl_dim_out:
-		isl_assert(ctx, pos < dim->n_out,
-			    return isl_space_dim(dim, isl_dim_all));
-		return pos + dim->nparam + dim->n_in;
-	default:
-		isl_assert(ctx, 0, return isl_space_dim(dim, isl_dim_all));
-	}
-	return isl_space_dim(dim, isl_dim_all);
-}
-
-/* Extend length of ids array to the total number of dimensions.
- */
-static __isl_give isl_space *extend_ids(__isl_take isl_space *dim)
-{
-	isl_id **ids;
-	int i;
-
-	if (isl_space_dim(dim, isl_dim_all) <= dim->n_id)
-		return dim;
-
-	if (!dim->ids) {
-		dim->ids = isl_calloc_array(dim->ctx,
-				isl_id *, isl_space_dim(dim, isl_dim_all));
-		if (!dim->ids)
-			goto error;
-	} else {
-		ids = isl_realloc_array(dim->ctx, dim->ids,
-				isl_id *, isl_space_dim(dim, isl_dim_all));
-		if (!ids)
-			goto error;
-		dim->ids = ids;
-		for (i = dim->n_id; i < isl_space_dim(dim, isl_dim_all); ++i)
-			dim->ids[i] = NULL;
-	}
-
-	dim->n_id = isl_space_dim(dim, isl_dim_all);
-
-	return dim;
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-static __isl_give isl_space *set_id(__isl_take isl_space *dim,
-	enum isl_dim_type type, unsigned pos, __isl_take isl_id *id)
-{
-	dim = isl_space_cow(dim);
-
-	if (!dim)
-		goto error;
-
-	pos = global_pos(dim, type, pos);
-	if (pos == isl_space_dim(dim, isl_dim_all))
-		goto error;
-
-	if (pos >= dim->n_id) {
-		if (!id)
-			return dim;
-		dim = extend_ids(dim);
-		if (!dim)
-			goto error;
-	}
-
-	dim->ids[pos] = id;
-
-	return dim;
-error:
-	isl_id_free(id);
-	isl_space_free(dim);
-	return NULL;
-}
-
-static __isl_keep isl_id *get_id(__isl_keep isl_space *dim,
-				 enum isl_dim_type type, unsigned pos)
-{
-	if (!dim)
-		return NULL;
-
-	pos = global_pos(dim, type, pos);
-	if (pos == isl_space_dim(dim, isl_dim_all))
-		return NULL;
-	if (pos >= dim->n_id)
-		return NULL;
-	return dim->ids[pos];
-}
-
-static unsigned offset(__isl_keep isl_space *dim, enum isl_dim_type type)
-{
-	switch (type) {
-	case isl_dim_param:	return 0;
-	case isl_dim_in:	return dim->nparam;
-	case isl_dim_out:	return dim->nparam + dim->n_in;
-	default:		return 0;
-	}
-}
-
-static unsigned n(__isl_keep isl_space *dim, enum isl_dim_type type)
-{
-	switch (type) {
-	case isl_dim_param:	return dim->nparam;
-	case isl_dim_in:	return dim->n_in;
-	case isl_dim_out:	return dim->n_out;
-	case isl_dim_all:	return dim->nparam + dim->n_in + dim->n_out;
-	default:		return 0;
-	}
-}
-
-unsigned isl_space_dim(__isl_keep isl_space *dim, enum isl_dim_type type)
-{
-	if (!dim)
-		return 0;
-	return n(dim, type);
-}
-
-unsigned isl_space_offset(__isl_keep isl_space *dim, enum isl_dim_type type)
-{
-	if (!dim)
-		return 0;
-	return offset(dim, type);
-}
-
-static __isl_give isl_space *copy_ids(__isl_take isl_space *dst,
-	enum isl_dim_type dst_type, unsigned offset, __isl_keep isl_space *src,
-	enum isl_dim_type src_type)
-{
-	int i;
-	isl_id *id;
-
-	if (!dst)
-		return NULL;
-
-	for (i = 0; i < n(src, src_type); ++i) {
-		id = get_id(src, src_type, i);
-		if (!id)
-			continue;
-		dst = set_id(dst, dst_type, offset + i, isl_id_copy(id));
-		if (!dst)
-			return NULL;
-	}
-	return dst;
-}
-
-__isl_take isl_space *isl_space_dup(__isl_keep isl_space *dim)
-{
-	isl_space *dup;
-	if (!dim)
-		return NULL;
-	dup = isl_space_alloc(dim->ctx, dim->nparam, dim->n_in, dim->n_out);
-	if (dim->tuple_id[0] &&
-	    !(dup->tuple_id[0] = isl_id_copy(dim->tuple_id[0])))
-		goto error;
-	if (dim->tuple_id[1] &&
-	    !(dup->tuple_id[1] = isl_id_copy(dim->tuple_id[1])))
-		goto error;
-	if (dim->nested[0] && !(dup->nested[0] = isl_space_copy(dim->nested[0])))
-		goto error;
-	if (dim->nested[1] && !(dup->nested[1] = isl_space_copy(dim->nested[1])))
-		goto error;
-	if (!dim->ids)
-		return dup;
-	dup = copy_ids(dup, isl_dim_param, 0, dim, isl_dim_param);
-	dup = copy_ids(dup, isl_dim_in, 0, dim, isl_dim_in);
-	dup = copy_ids(dup, isl_dim_out, 0, dim, isl_dim_out);
-	return dup;
-error:
-	isl_space_free(dup);
-	return NULL;
-}
-
-__isl_give isl_space *isl_space_cow(__isl_take isl_space *dim)
-{
-	if (!dim)
-		return NULL;
-
-	if (dim->ref == 1)
-		return dim;
-	dim->ref--;
-	return isl_space_dup(dim);
-}
-
-__isl_give isl_space *isl_space_copy(__isl_keep isl_space *dim)
-{
-	if (!dim)
-		return NULL;
-
-	dim->ref++;
-	return dim;
-}
-
-void isl_space_free(__isl_take isl_space *dim)
-{
-	int i;
-
-	if (!dim)
-		return;
-
-	if (--dim->ref > 0)
-		return;
-
-	isl_id_free(dim->tuple_id[0]);
-	isl_id_free(dim->tuple_id[1]);
-
-	isl_space_free(dim->nested[0]);
-	isl_space_free(dim->nested[1]);
-
-	for (i = 0; i < dim->n_id; ++i)
-		isl_id_free(dim->ids[i]);
-	free(dim->ids);
-	isl_ctx_deref(dim->ctx);
-	
-	free(dim);
-}
-
-static int name_ok(isl_ctx *ctx, const char *s)
-{
-	char *p;
-	long dummy;
-
-	dummy = strtol(s, &p, 0);
-	if (p != s)
-		isl_die(ctx, isl_error_invalid, "name looks like a number",
-			return 0);
-
-	return 1;
-}
-
-int isl_space_has_tuple_id(__isl_keep isl_space *dim, enum isl_dim_type type)
-{
-	if (!dim)
-		return -1;
-	if (isl_space_is_params(dim))
-		isl_die(dim->ctx, isl_error_invalid,
-			"parameter spaces don't have tuple ids", return -1);
-	if (isl_space_is_set(dim) && type != isl_dim_set)
-		isl_die(dim->ctx, isl_error_invalid,
-			"set spaces can only have a set id", return -1);
-	if (type != isl_dim_in && type != isl_dim_out)
-		isl_die(dim->ctx, isl_error_invalid,
-			"only input, output and set tuples can have ids",
-			return -1);
-	return dim->tuple_id[type - isl_dim_in] != NULL;
-}
-
-__isl_give isl_id *isl_space_get_tuple_id(__isl_keep isl_space *dim,
-	enum isl_dim_type type)
-{
-	int has_id;
-
-	if (!dim)
-		return NULL;
-	has_id = isl_space_has_tuple_id(dim, type);
-	if (has_id < 0)
-		return NULL;
-	if (!has_id)
-		isl_die(dim->ctx, isl_error_invalid,
-			"tuple has no id", return NULL);
-	return isl_id_copy(dim->tuple_id[type - isl_dim_in]);
-}
-
-__isl_give isl_space *isl_space_set_tuple_id(__isl_take isl_space *dim,
-	enum isl_dim_type type, __isl_take isl_id *id)
-{
-	dim = isl_space_cow(dim);
-	if (!dim || !id)
-		goto error;
-	if (type != isl_dim_in && type != isl_dim_out)
-		isl_die(dim->ctx, isl_error_invalid,
-			"only input, output and set tuples can have names",
-			goto error);
-
-	isl_id_free(dim->tuple_id[type - isl_dim_in]);
-	dim->tuple_id[type - isl_dim_in] = id;
-
-	return dim;
-error:
-	isl_id_free(id);
-	isl_space_free(dim);
-	return NULL;
-}
-
-__isl_give isl_space *isl_space_reset_tuple_id(__isl_take isl_space *dim,
-	enum isl_dim_type type)
-{
-	dim = isl_space_cow(dim);
-	if (!dim)
-		return NULL;
-	if (type != isl_dim_in && type != isl_dim_out)
-		isl_die(dim->ctx, isl_error_invalid,
-			"only input, output and set tuples can have names",
-			goto error);
-
-	isl_id_free(dim->tuple_id[type - isl_dim_in]);
-	dim->tuple_id[type - isl_dim_in] = NULL;
-
-	return dim;
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-__isl_give isl_space *isl_space_set_dim_id(__isl_take isl_space *dim,
-	enum isl_dim_type type, unsigned pos, __isl_take isl_id *id)
-{
-	dim = isl_space_cow(dim);
-	if (!dim || !id)
-		goto error;
-	isl_id_free(get_id(dim, type, pos));
-	return set_id(dim, type, pos, id);
-error:
-	isl_id_free(id);
-	isl_space_free(dim);
-	return NULL;
-}
-
-int isl_space_has_dim_id(__isl_keep isl_space *dim,
-	enum isl_dim_type type, unsigned pos)
-{
-	if (!dim)
-		return -1;
-	return get_id(dim, type, pos) != NULL;
-}
-
-__isl_give isl_id *isl_space_get_dim_id(__isl_keep isl_space *dim,
-	enum isl_dim_type type, unsigned pos)
-{
-	if (!dim)
-		return NULL;
-	if (!get_id(dim, type, pos))
-		isl_die(dim->ctx, isl_error_invalid,
-			"dim has no id", return NULL);
-	return isl_id_copy(get_id(dim, type, pos));
-}
-
-__isl_give isl_space *isl_space_set_tuple_name(__isl_take isl_space *dim,
-	enum isl_dim_type type, const char *s)
-{
-	isl_id *id;
-
-	if (!dim)
-		return NULL;
-
-	if (!s)
-		return isl_space_reset_tuple_id(dim, type);
-
-	if (!name_ok(dim->ctx, s))
-		goto error;
-
-	id = isl_id_alloc(dim->ctx, s, NULL);
-	return isl_space_set_tuple_id(dim, type, id);
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-const char *isl_space_get_tuple_name(__isl_keep isl_space *dim,
-	 enum isl_dim_type type)
-{
-	isl_id *id;
-	if (!dim)
-		return NULL;
-	if (type != isl_dim_in && type != isl_dim_out)
-		return NULL;
-	id = dim->tuple_id[type - isl_dim_in];
-	return id ? id->name : NULL;
-}
-
-__isl_give isl_space *isl_space_set_dim_name(__isl_take isl_space *dim,
-				 enum isl_dim_type type, unsigned pos,
-				 const char *s)
-{
-	isl_id *id;
-
-	if (!dim)
-		return NULL;
-	if (!name_ok(dim->ctx, s))
-		goto error;
-	id = isl_id_alloc(dim->ctx, s, NULL);
-	return isl_space_set_dim_id(dim, type, pos, id);
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-__isl_keep const char *isl_space_get_dim_name(__isl_keep isl_space *dim,
-				 enum isl_dim_type type, unsigned pos)
-{
-	isl_id *id = get_id(dim, type, pos);
-	return id ? id->name : NULL;
-}
-
-int isl_space_find_dim_by_id(__isl_keep isl_space *dim, enum isl_dim_type type,
-	__isl_keep isl_id *id)
-{
-	int i;
-	int offset;
-	int n;
-
-	if (!dim || !id)
-		return -1;
-
-	offset = isl_space_offset(dim, type);
-	n = isl_space_dim(dim, type);
-	for (i = 0; i < n && offset + i < dim->n_id; ++i)
-		if (dim->ids[offset + i] == id)
-			return i;
-
-	return -1;
-}
-
-int isl_space_find_dim_by_name(__isl_keep isl_space *space,
-	enum isl_dim_type type, const char *name)
-{
-	int i;
-	int offset;
-	int n;
-
-	if (!space || !name)
-		return -1;
-
-	offset = isl_space_offset(space, type);
-	n = isl_space_dim(space, type);
-	for (i = 0; i < n && offset + i < space->n_id; ++i)
-		if (space->ids[offset + i]->name &&
-		    !strcmp(space->ids[offset + i]->name, name))
-			return i;
-
-	return -1;
-}
-
-static __isl_keep isl_id *tuple_id(__isl_keep isl_space *dim,
-	enum isl_dim_type type)
-{
-	if (!dim)
-		return NULL;
-	if (type == isl_dim_in)
-		return dim->tuple_id[0];
-	if (type == isl_dim_out)
-		return dim->tuple_id[1];
-	return NULL;
-}
-
-static __isl_keep isl_space *nested(__isl_keep isl_space *dim,
-	enum isl_dim_type type)
-{
-	if (!dim)
-		return NULL;
-	if (type == isl_dim_in)
-		return dim->nested[0];
-	if (type == isl_dim_out)
-		return dim->nested[1];
-	return NULL;
-}
-
-int isl_space_tuple_match(__isl_keep isl_space *dim1, enum isl_dim_type dim1_type,
-			__isl_keep isl_space *dim2, enum isl_dim_type dim2_type)
-{
-	isl_id *id1, *id2;
-	isl_space *nested1, *nested2;
-
-	if (!dim1 || !dim2)
-		return -1;
-
-	if (dim1 == dim2 && dim1_type == dim2_type)
-		return 1;
-
-	if (n(dim1, dim1_type) != n(dim2, dim2_type))
-		return 0;
-	id1 = tuple_id(dim1, dim1_type);
-	id2 = tuple_id(dim2, dim2_type);
-	if (!id1 ^ !id2)
-		return 0;
-	if (id1 && id1 != id2)
-		return 0;
-	nested1 = nested(dim1, dim1_type);
-	nested2 = nested(dim2, dim2_type);
-	if (!nested1 ^ !nested2)
-		return 0;
-	if (nested1 && !isl_space_is_equal(nested1, nested2))
-		return 0;
-	return 1;
-}
-
-static int match(__isl_keep isl_space *dim1, enum isl_dim_type dim1_type,
-	__isl_keep isl_space *dim2, enum isl_dim_type dim2_type)
-{
-	int i;
-
-	if (dim1 == dim2 && dim1_type == dim2_type)
-		return 1;
-
-	if (!isl_space_tuple_match(dim1, dim1_type, dim2, dim2_type))
-		return 0;
-
-	if (!dim1->ids && !dim2->ids)
-		return 1;
-
-	for (i = 0; i < n(dim1, dim1_type); ++i) {
-		if (get_id(dim1, dim1_type, i) != get_id(dim2, dim2_type, i))
-			return 0;
-	}
-	return 1;
-}
-
-int isl_space_match(__isl_keep isl_space *dim1, enum isl_dim_type dim1_type,
-	__isl_keep isl_space *dim2, enum isl_dim_type dim2_type)
-{
-	if (!dim1 || !dim2)
-		return -1;
-
-	return match(dim1, dim1_type, dim2, dim2_type);
-}
-
-static void get_ids(__isl_keep isl_space *dim, enum isl_dim_type type,
-	unsigned first, unsigned n, __isl_keep isl_id **ids)
-{
-	int i;
-
-	for (i = 0; i < n ; ++i)
-		ids[i] = get_id(dim, type, first + i);
-}
-
-__isl_give isl_space *isl_space_extend(__isl_take isl_space *dim,
-			unsigned nparam, unsigned n_in, unsigned n_out)
-{
-	isl_id **ids = NULL;
-
-	if (!dim)
-		return NULL;
-	if (dim->nparam == nparam && dim->n_in == n_in && dim->n_out == n_out)
-		return dim;
-
-	isl_assert(dim->ctx, dim->nparam <= nparam, goto error);
-	isl_assert(dim->ctx, dim->n_in <= n_in, goto error);
-	isl_assert(dim->ctx, dim->n_out <= n_out, goto error);
-
-	dim = isl_space_cow(dim);
-
-	if (dim->ids) {
-		ids = isl_calloc_array(dim->ctx, isl_id *,
-					 nparam + n_in + n_out);
-		if (!ids)
-			goto error;
-		get_ids(dim, isl_dim_param, 0, dim->nparam, ids);
-		get_ids(dim, isl_dim_in, 0, dim->n_in, ids + nparam);
-		get_ids(dim, isl_dim_out, 0, dim->n_out, ids + nparam + n_in);
-		free(dim->ids);
-		dim->ids = ids;
-		dim->n_id = nparam + n_in + n_out;
-	}
-	dim->nparam = nparam;
-	dim->n_in = n_in;
-	dim->n_out = n_out;
-
-	return dim;
-error:
-	free(ids);
-	isl_space_free(dim);
-	return NULL;
-}
-
-__isl_give isl_space *isl_space_add_dims(__isl_take isl_space *dim,
-	enum isl_dim_type type, unsigned n)
-{
-	if (!dim)
-		return NULL;
-	dim = isl_space_reset(dim, type);
-	switch (type) {
-	case isl_dim_param:
-		dim = isl_space_extend(dim,
-					dim->nparam + n, dim->n_in, dim->n_out);
-		if (dim && dim->nested[0] &&
-		    !(dim->nested[0] = isl_space_add_dims(dim->nested[0],
-						    isl_dim_param, n)))
-			goto error;
-		if (dim && dim->nested[1] &&
-		    !(dim->nested[1] = isl_space_add_dims(dim->nested[1],
-						    isl_dim_param, n)))
-			goto error;
-		return dim;
-	case isl_dim_in:
-		return isl_space_extend(dim,
-					dim->nparam, dim->n_in + n, dim->n_out);
-	case isl_dim_out:
-		return isl_space_extend(dim,
-					dim->nparam, dim->n_in, dim->n_out + n);
-	default:
-		isl_die(dim->ctx, isl_error_invalid,
-			"cannot add dimensions of specified type", goto error);
-	}
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-static int valid_dim_type(enum isl_dim_type type)
-{
-	switch (type) {
-	case isl_dim_param:
-	case isl_dim_in:
-	case isl_dim_out:
-		return 1;
-	default:
-		return 0;
-	}
-}
-
-__isl_give isl_space *isl_space_insert_dims(__isl_take isl_space *dim,
-	enum isl_dim_type type, unsigned pos, unsigned n)
-{
-	isl_id **ids = NULL;
-
-	if (!dim)
-		return NULL;
-	if (n == 0)
-		return isl_space_reset(dim, type);
-
-	if (!valid_dim_type(type))
-		isl_die(dim->ctx, isl_error_invalid,
-			"cannot insert dimensions of specified type",
-			goto error);
-
-	isl_assert(dim->ctx, pos <= isl_space_dim(dim, type), goto error);
-
-	dim = isl_space_cow(dim);
-	if (!dim)
-		return NULL;
-
-	if (dim->ids) {
-		enum isl_dim_type t;
-		int off;
-		int s[3];
-		int *size = s - isl_dim_param;
-		ids = isl_calloc_array(dim->ctx, isl_id *,
-				     dim->nparam + dim->n_in + dim->n_out + n);
-		if (!ids)
-			goto error;
-		off = 0;
-		size[isl_dim_param] = dim->nparam;
-		size[isl_dim_in] = dim->n_in;
-		size[isl_dim_out] = dim->n_out;
-		for (t = isl_dim_param; t <= isl_dim_out; ++t) {
-			if (t != type) {
-				get_ids(dim, t, 0, size[t], ids + off);
-				off += size[t];
-			} else {
-				get_ids(dim, t, 0, pos, ids + off);
-				off += pos + n;
-				get_ids(dim, t, pos, size[t] - pos, ids + off);
-				off += size[t] - pos;
-			}
-		}
-		free(dim->ids);
-		dim->ids = ids;
-		dim->n_id = dim->nparam + dim->n_in + dim->n_out + n;
-	}
-	switch (type) {
-	case isl_dim_param:	dim->nparam += n; break;
-	case isl_dim_in:	dim->n_in += n; break;
-	case isl_dim_out:	dim->n_out += n; break;
-	default:		;
-	}
-	dim = isl_space_reset(dim, type);
-
-	return dim;
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-__isl_give isl_space *isl_space_move_dims(__isl_take isl_space *dim,
-	enum isl_dim_type dst_type, unsigned dst_pos,
-	enum isl_dim_type src_type, unsigned src_pos, unsigned n)
-{
-	int i;
-
-	if (!dim)
-		return NULL;
-	if (n == 0)
-		return dim;
-
-	isl_assert(dim->ctx, src_pos + n <= isl_space_dim(dim, src_type),
-		goto error);
-
-	if (dst_type == src_type && dst_pos == src_pos)
-		return dim;
-
-	isl_assert(dim->ctx, dst_type != src_type, goto error);
-
-	dim = isl_space_reset(dim, src_type);
-	dim = isl_space_reset(dim, dst_type);
-
-	dim = isl_space_cow(dim);
-	if (!dim)
-		return NULL;
-
-	if (dim->ids) {
-		isl_id **ids;
-		enum isl_dim_type t;
-		int off;
-		int s[3];
-		int *size = s - isl_dim_param;
-		ids = isl_calloc_array(dim->ctx, isl_id *,
-					 dim->nparam + dim->n_in + dim->n_out);
-		if (!ids)
-			goto error;
-		off = 0;
-		size[isl_dim_param] = dim->nparam;
-		size[isl_dim_in] = dim->n_in;
-		size[isl_dim_out] = dim->n_out;
-		for (t = isl_dim_param; t <= isl_dim_out; ++t) {
-			if (t == dst_type) {
-				get_ids(dim, t, 0, dst_pos, ids + off);
-				off += dst_pos;
-				get_ids(dim, src_type, src_pos, n, ids + off);
-				off += n;
-				get_ids(dim, t, dst_pos, size[t] - dst_pos,
-						ids + off);
-				off += size[t] - dst_pos;
-			} else if (t == src_type) {
-				get_ids(dim, t, 0, src_pos, ids + off);
-				off += src_pos;
-				get_ids(dim, t, src_pos + n,
-					    size[t] - src_pos - n, ids + off);
-				off += size[t] - src_pos - n;
-			} else {
-				get_ids(dim, t, 0, size[t], ids + off);
-				off += size[t];
-			}
-		}
-		free(dim->ids);
-		dim->ids = ids;
-		dim->n_id = dim->nparam + dim->n_in + dim->n_out;
-	}
-
-	switch (dst_type) {
-	case isl_dim_param:	dim->nparam += n; break;
-	case isl_dim_in:	dim->n_in += n; break;
-	case isl_dim_out:	dim->n_out += n; break;
-	default:		;
-	}
-
-	switch (src_type) {
-	case isl_dim_param:	dim->nparam -= n; break;
-	case isl_dim_in:	dim->n_in -= n; break;
-	case isl_dim_out:	dim->n_out -= n; break;
-	default:		;
-	}
-
-	if (dst_type != isl_dim_param && src_type != isl_dim_param)
-		return dim;
-
-	for (i = 0; i < 2; ++i) {
-		if (!dim->nested[i])
-			continue;
-		dim->nested[i] = isl_space_replace(dim->nested[i],
-						 isl_dim_param, dim);
-		if (!dim->nested[i])
-			goto error;
-	}
-
-	return dim;
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-__isl_give isl_space *isl_space_join(__isl_take isl_space *left,
-	__isl_take isl_space *right)
-{
-	isl_space *dim;
-
-	if (!left || !right)
-		goto error;
-
-	isl_assert(left->ctx, match(left, isl_dim_param, right, isl_dim_param),
-			goto error);
-	isl_assert(left->ctx,
-		isl_space_tuple_match(left, isl_dim_out, right, isl_dim_in),
-		goto error);
-
-	dim = isl_space_alloc(left->ctx, left->nparam, left->n_in, right->n_out);
-	if (!dim)
-		goto error;
-
-	dim = copy_ids(dim, isl_dim_param, 0, left, isl_dim_param);
-	dim = copy_ids(dim, isl_dim_in, 0, left, isl_dim_in);
-	dim = copy_ids(dim, isl_dim_out, 0, right, isl_dim_out);
-
-	if (dim && left->tuple_id[0] &&
-	    !(dim->tuple_id[0] = isl_id_copy(left->tuple_id[0])))
-		goto error;
-	if (dim && right->tuple_id[1] &&
-	    !(dim->tuple_id[1] = isl_id_copy(right->tuple_id[1])))
-		goto error;
-	if (dim && left->nested[0] &&
-	    !(dim->nested[0] = isl_space_copy(left->nested[0])))
-		goto error;
-	if (dim && right->nested[1] &&
-	    !(dim->nested[1] = isl_space_copy(right->nested[1])))
-		goto error;
-
-	isl_space_free(left);
-	isl_space_free(right);
-
-	return dim;
-error:
-	isl_space_free(left);
-	isl_space_free(right);
-	return NULL;
-}
-
-__isl_give isl_space *isl_space_product(__isl_take isl_space *left,
-	__isl_take isl_space *right)
-{
-	isl_space *dom1, *dom2, *nest1, *nest2;
-
-	if (!left || !right)
-		goto error;
-
-	isl_assert(left->ctx, match(left, isl_dim_param, right, isl_dim_param),
-			goto error);
-
-	dom1 = isl_space_domain(isl_space_copy(left));
-	dom2 = isl_space_domain(isl_space_copy(right));
-	nest1 = isl_space_wrap(isl_space_join(isl_space_reverse(dom1), dom2));
-
-	dom1 = isl_space_range(left);
-	dom2 = isl_space_range(right);
-	nest2 = isl_space_wrap(isl_space_join(isl_space_reverse(dom1), dom2));
-
-	return isl_space_join(isl_space_reverse(nest1), nest2);
-error:
-	isl_space_free(left);
-	isl_space_free(right);
-	return NULL;
-}
-
-/* Given two spaces { A -> C } and { B -> C }, construct the space
- * { [A -> B] -> C }
- */
-__isl_give isl_space *isl_space_domain_product(__isl_take isl_space *left,
-	__isl_take isl_space *right)
-{
-	isl_space *ran, *dom1, *dom2, *nest;
-
-	if (!left || !right)
-		goto error;
-
-	if (!match(left, isl_dim_param, right, isl_dim_param))
-		isl_die(left->ctx, isl_error_invalid,
-			"parameters need to match", goto error);
-	if (!isl_space_tuple_match(left, isl_dim_out, right, isl_dim_out))
-		isl_die(left->ctx, isl_error_invalid,
-			"ranges need to match", goto error);
-
-	ran = isl_space_range(isl_space_copy(left));
-
-	dom1 = isl_space_domain(left);
-	dom2 = isl_space_domain(right);
-	nest = isl_space_wrap(isl_space_join(isl_space_reverse(dom1), dom2));
-
-	return isl_space_join(isl_space_reverse(nest), ran);
-error:
-	isl_space_free(left);
-	isl_space_free(right);
-	return NULL;
-}
-
-__isl_give isl_space *isl_space_range_product(__isl_take isl_space *left,
-	__isl_take isl_space *right)
-{
-	isl_space *dom, *ran1, *ran2, *nest;
-
-	if (!left || !right)
-		goto error;
-
-	isl_assert(left->ctx, match(left, isl_dim_param, right, isl_dim_param),
-			goto error);
-	if (!isl_space_tuple_match(left, isl_dim_in, right, isl_dim_in))
-		isl_die(left->ctx, isl_error_invalid,
-			"domains need to match", goto error);
-
-	dom = isl_space_domain(isl_space_copy(left));
-
-	ran1 = isl_space_range(left);
-	ran2 = isl_space_range(right);
-	nest = isl_space_wrap(isl_space_join(isl_space_reverse(ran1), ran2));
-
-	return isl_space_join(isl_space_reverse(dom), nest);
-error:
-	isl_space_free(left);
-	isl_space_free(right);
-	return NULL;
-}
-
-__isl_give isl_space *isl_space_map_from_set(__isl_take isl_space *dim)
-{
-	isl_ctx *ctx;
-	isl_id **ids = NULL;
-
-	if (!dim)
-		return NULL;
-	ctx = isl_space_get_ctx(dim);
-	if (!isl_space_is_set(dim))
-		isl_die(ctx, isl_error_invalid, "not a set space", goto error);
-	dim = isl_space_cow(dim);
-	if (!dim)
-		return NULL;
-	if (dim->ids) {
-		ids = isl_calloc_array(dim->ctx, isl_id *,
-					dim->nparam + dim->n_out + dim->n_out);
-		if (!ids)
-			goto error;
-		get_ids(dim, isl_dim_param, 0, dim->nparam, ids);
-		get_ids(dim, isl_dim_out, 0, dim->n_out, ids + dim->nparam);
-	}
-	dim->n_in = dim->n_out;
-	if (ids) {
-		free(dim->ids);
-		dim->ids = ids;
-		dim->n_id = dim->nparam + dim->n_out + dim->n_out;
-		dim = copy_ids(dim, isl_dim_out, 0, dim, isl_dim_in);
-	}
-	isl_id_free(dim->tuple_id[0]);
-	dim->tuple_id[0] = isl_id_copy(dim->tuple_id[1]);
-	isl_space_free(dim->nested[0]);
-	dim->nested[0] = isl_space_copy(dim->nested[1]);
-	return dim;
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-static __isl_give isl_space *set_ids(__isl_take isl_space *dim,
-	enum isl_dim_type type,
-	unsigned first, unsigned n, __isl_take isl_id **ids)
-{
-	int i;
-
-	for (i = 0; i < n ; ++i)
-		dim = set_id(dim, type, first + i, ids[i]);
-
-	return dim;
-}
-
-__isl_give isl_space *isl_space_reverse(__isl_take isl_space *dim)
-{
-	unsigned t;
-	isl_space *nested;
-	isl_id **ids = NULL;
-	isl_id *id;
-
-	if (!dim)
-		return NULL;
-	if (match(dim, isl_dim_in, dim, isl_dim_out))
-		return dim;
-
-	dim = isl_space_cow(dim);
-	if (!dim)
-		return NULL;
-
-	id = dim->tuple_id[0];
-	dim->tuple_id[0] = dim->tuple_id[1];
-	dim->tuple_id[1] = id;
-
-	nested = dim->nested[0];
-	dim->nested[0] = dim->nested[1];
-	dim->nested[1] = nested;
-
-	if (dim->ids) {
-		ids = isl_alloc_array(dim->ctx, isl_id *,
-					dim->n_in + dim->n_out);
-		if (!ids)
-			goto error;
-		get_ids(dim, isl_dim_in, 0, dim->n_in, ids);
-		get_ids(dim, isl_dim_out, 0, dim->n_out, ids + dim->n_in);
-	}
-
-	t = dim->n_in;
-	dim->n_in = dim->n_out;
-	dim->n_out = t;
-
-	if (dim->ids) {
-		dim = set_ids(dim, isl_dim_out, 0, dim->n_out, ids);
-		dim = set_ids(dim, isl_dim_in, 0, dim->n_in, ids + dim->n_out);
-		free(ids);
-	}
-
-	return dim;
-error:
-	free(ids);
-	isl_space_free(dim);
-	return NULL;
-}
-
-__isl_give isl_space *isl_space_drop_dims(__isl_take isl_space *dim,
-	enum isl_dim_type type, unsigned first, unsigned num)
-{
-	int i;
-
-	if (!dim)
-		return NULL;
-
-	if (num == 0)
-		return isl_space_reset(dim, type);
-
-	if (!valid_dim_type(type))
-		isl_die(dim->ctx, isl_error_invalid,
-			"cannot drop dimensions of specified type", goto error);
-
-	isl_assert(dim->ctx, first + num <= n(dim, type), goto error);
-	dim = isl_space_cow(dim);
-	if (!dim)
-		goto error;
-	if (dim->ids) {
-		dim = extend_ids(dim);
-		if (!dim)
-			goto error;
-		for (i = 0; i < num; ++i)
-			isl_id_free(get_id(dim, type, first + i));
-		for (i = first+num; i < n(dim, type); ++i)
-			set_id(dim, type, i - num, get_id(dim, type, i));
-		switch (type) {
-		case isl_dim_param:
-			get_ids(dim, isl_dim_in, 0, dim->n_in,
-				dim->ids + offset(dim, isl_dim_in) - num);
-		case isl_dim_in:
-			get_ids(dim, isl_dim_out, 0, dim->n_out,
-				dim->ids + offset(dim, isl_dim_out) - num);
-		default:
-			;
-		}
-		dim->n_id -= num;
-	}
-	switch (type) {
-	case isl_dim_param:	dim->nparam -= num; break;
-	case isl_dim_in:	dim->n_in -= num; break;
-	case isl_dim_out:	dim->n_out -= num; break;
-	default:		;
-	}
-	dim = isl_space_reset(dim, type);
-	if (type == isl_dim_param) {
-		if (dim && dim->nested[0] &&
-		    !(dim->nested[0] = isl_space_drop_dims(dim->nested[0],
-						    isl_dim_param, first, num)))
-			goto error;
-		if (dim && dim->nested[1] &&
-		    !(dim->nested[1] = isl_space_drop_dims(dim->nested[1],
-						    isl_dim_param, first, num)))
-			goto error;
-	}
-	return dim;
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-__isl_give isl_space *isl_space_drop_inputs(__isl_take isl_space *dim,
-		unsigned first, unsigned n)
-{
-	if (!dim)
-		return NULL;
-	return isl_space_drop_dims(dim, isl_dim_in, first, n);
-}
-
-__isl_give isl_space *isl_space_drop_outputs(__isl_take isl_space *dim,
-		unsigned first, unsigned n)
-{
-	if (!dim)
-		return NULL;
-	return isl_space_drop_dims(dim, isl_dim_out, first, n);
-}
-
-__isl_give isl_space *isl_space_domain(__isl_take isl_space *dim)
-{
-	if (!dim)
-		return NULL;
-	dim = isl_space_drop_outputs(dim, 0, dim->n_out);
-	dim = isl_space_reverse(dim);
-	dim = mark_as_set(dim);
-	return dim;
-}
-
-__isl_give isl_space *isl_space_from_domain(__isl_take isl_space *dim)
-{
-	if (!dim)
-		return NULL;
-	if (!isl_space_is_set(dim))
-		isl_die(isl_space_get_ctx(dim), isl_error_invalid,
-			"not a set space", goto error);
-	dim = isl_space_reverse(dim);
-	dim = isl_space_reset(dim, isl_dim_out);
-	return dim;
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-__isl_give isl_space *isl_space_range(__isl_take isl_space *dim)
-{
-	if (!dim)
-		return NULL;
-	dim = isl_space_drop_inputs(dim, 0, dim->n_in);
-	dim = mark_as_set(dim);
-	return dim;
-}
-
-__isl_give isl_space *isl_space_from_range(__isl_take isl_space *dim)
-{
-	if (!dim)
-		return NULL;
-	if (!isl_space_is_set(dim))
-		isl_die(isl_space_get_ctx(dim), isl_error_invalid,
-			"not a set space", goto error);
-	return isl_space_reset(dim, isl_dim_in);
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-__isl_give isl_space *isl_space_params(__isl_take isl_space *space)
-{
-	if (isl_space_is_params(space))
-		return space;
-	space = isl_space_drop_dims(space,
-			    isl_dim_in, 0, isl_space_dim(space, isl_dim_in));
-	space = isl_space_drop_dims(space,
-			    isl_dim_out, 0, isl_space_dim(space, isl_dim_out));
-	space = mark_as_params(space);
-	return space;
-}
-
-__isl_give isl_space *isl_space_set_from_params(__isl_take isl_space *space)
-{
-	if (!space)
-		return NULL;
-	if (!isl_space_is_params(space))
-		isl_die(isl_space_get_ctx(space), isl_error_invalid,
-			"not a parameter space", goto error);
-	return isl_space_reset(space, isl_dim_set);
-error:
-	isl_space_free(space);
-	return NULL;
-}
-
-__isl_give isl_space *isl_space_as_set_space(__isl_take isl_space *dim)
-{
-	dim = isl_space_cow(dim);
-	if (!dim)
-		return NULL;
-
-	dim->n_out += dim->n_in;
-	dim->n_in = 0;
-	dim = isl_space_reset(dim, isl_dim_in);
-	dim = isl_space_reset(dim, isl_dim_out);
-
-	return dim;
-}
-
-__isl_give isl_space *isl_space_underlying(__isl_take isl_space *dim,
-	unsigned n_div)
-{
-	int i;
-
-	if (!dim)
-		return NULL;
-	if (n_div == 0 &&
-	    dim->nparam == 0 && dim->n_in == 0 && dim->n_id == 0)
-		return isl_space_reset(isl_space_reset(dim, isl_dim_in), isl_dim_out);
-	dim = isl_space_cow(dim);
-	if (!dim)
-		return NULL;
-	dim->n_out += dim->nparam + dim->n_in + n_div;
-	dim->nparam = 0;
-	dim->n_in = 0;
-
-	for (i = 0; i < dim->n_id; ++i)
-		isl_id_free(get_id(dim, isl_dim_out, i));
-	dim->n_id = 0;
-	dim = isl_space_reset(dim, isl_dim_in);
-	dim = isl_space_reset(dim, isl_dim_out);
-
-	return dim;
-}
-
-int isl_space_is_equal(__isl_keep isl_space *dim1, __isl_keep isl_space *dim2)
-{
-	if (!dim1 || !dim2)
-		return -1;
-	if (dim1 == dim2)
-		return 1;
-	return match(dim1, isl_dim_param, dim2, isl_dim_param) &&
-	       isl_space_tuple_match(dim1, isl_dim_in, dim2, isl_dim_in) &&
-	       isl_space_tuple_match(dim1, isl_dim_out, dim2, isl_dim_out);
-}
-
-/* Is space1 equal to the domain of space2?
- */
-int isl_space_is_domain(__isl_keep isl_space *space1,
-	__isl_keep isl_space *space2)
-{
-	if (!space1 || !space2)
-		return -1;
-	if (!isl_space_is_set(space1))
-		return 0;
-	return match(space1, isl_dim_param, space2, isl_dim_param) &&
-	       isl_space_tuple_match(space1, isl_dim_set, space2, isl_dim_in);
-}
-
-int isl_space_compatible(__isl_keep isl_space *dim1,
-	__isl_keep isl_space *dim2)
-{
-	return dim1->nparam == dim2->nparam &&
-	       dim1->n_in + dim1->n_out == dim2->n_in + dim2->n_out;
-}
-
-static uint32_t isl_hash_dim(uint32_t hash, __isl_keep isl_space *dim)
-{
-	int i;
-	isl_id *id;
-
-	if (!dim)
-		return hash;
-
-	hash = isl_hash_builtin(hash, dim->nparam);
-	hash = isl_hash_builtin(hash, dim->n_in);
-	hash = isl_hash_builtin(hash, dim->n_out);
-
-	for (i = 0; i < dim->nparam; ++i) {
-		id = get_id(dim, isl_dim_param, i);
-		hash = isl_hash_id(hash, id);
-	}
-
-	id = tuple_id(dim, isl_dim_in);
-	hash = isl_hash_id(hash, id);
-	id = tuple_id(dim, isl_dim_out);
-	hash = isl_hash_id(hash, id);
-
-	hash = isl_hash_dim(hash, dim->nested[0]);
-	hash = isl_hash_dim(hash, dim->nested[1]);
-
-	return hash;
-}
-
-uint32_t isl_space_get_hash(__isl_keep isl_space *dim)
-{
-	uint32_t hash;
-
-	if (!dim)
-		return 0;
-
-	hash = isl_hash_init();
-	hash = isl_hash_dim(hash, dim);
-
-	return hash;
-}
-
-int isl_space_is_wrapping(__isl_keep isl_space *dim)
-{
-	if (!dim)
-		return -1;
-
-	if (!isl_space_is_set(dim))
-		return 0;
-
-	return dim->nested[1] != NULL;
-}
-
-__isl_give isl_space *isl_space_wrap(__isl_take isl_space *dim)
-{
-	isl_space *wrap;
-
-	if (!dim)
-		return NULL;
-
-	wrap = isl_space_set_alloc(dim->ctx,
-				    dim->nparam, dim->n_in + dim->n_out);
-
-	wrap = copy_ids(wrap, isl_dim_param, 0, dim, isl_dim_param);
-	wrap = copy_ids(wrap, isl_dim_set, 0, dim, isl_dim_in);
-	wrap = copy_ids(wrap, isl_dim_set, dim->n_in, dim, isl_dim_out);
-
-	if (!wrap)
-		goto error;
-
-	wrap->nested[1] = dim;
-
-	return wrap;
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-__isl_give isl_space *isl_space_unwrap(__isl_take isl_space *dim)
-{
-	isl_space *unwrap;
-
-	if (!dim)
-		return NULL;
-
-	if (!isl_space_is_wrapping(dim))
-		isl_die(dim->ctx, isl_error_invalid, "not a wrapping dim",
-			goto error);
-
-	unwrap = isl_space_copy(dim->nested[1]);
-	isl_space_free(dim);
-
-	return unwrap;
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-int isl_space_is_named_or_nested(__isl_keep isl_space *dim, enum isl_dim_type type)
-{
-	if (type != isl_dim_in && type != isl_dim_out)
-		return 0;
-	if (!dim)
-		return -1;
-	if (dim->tuple_id[type - isl_dim_in])
-		return 1;
-	if (dim->nested[type - isl_dim_in])
-		return 1;
-	return 0;
-}
-
-int isl_space_may_be_set(__isl_keep isl_space *dim)
-{
-	if (!dim)
-		return -1;
-	if (isl_space_is_set(dim))
-		return 1;
-	if (isl_space_dim(dim, isl_dim_in) != 0)
-		return 0;
-	if (isl_space_is_named_or_nested(dim, isl_dim_in))
-		return 0;
-	return 1;
-}
-
-__isl_give isl_space *isl_space_reset(__isl_take isl_space *dim,
-	enum isl_dim_type type)
-{
-	if (!isl_space_is_named_or_nested(dim, type))
-		return dim;
-
-	dim = isl_space_cow(dim);
-	if (!dim)
-		return NULL;
-
-	isl_id_free(dim->tuple_id[type - isl_dim_in]);
-	dim->tuple_id[type - isl_dim_in] = NULL;
-	isl_space_free(dim->nested[type - isl_dim_in]);
-	dim->nested[type - isl_dim_in] = NULL;
-
-	return dim;
-}
-
-__isl_give isl_space *isl_space_flatten(__isl_take isl_space *dim)
-{
-	if (!dim)
-		return NULL;
-	if (!dim->nested[0] && !dim->nested[1])
-		return dim;
-
-	if (dim->nested[0])
-		dim = isl_space_reset(dim, isl_dim_in);
-	if (dim && dim->nested[1])
-		dim = isl_space_reset(dim, isl_dim_out);
-
-	return dim;
-}
-
-__isl_give isl_space *isl_space_flatten_domain(__isl_take isl_space *dim)
-{
-	if (!dim)
-		return NULL;
-	if (!dim->nested[0])
-		return dim;
-
-	return isl_space_reset(dim, isl_dim_in);
-}
-
-__isl_give isl_space *isl_space_flatten_range(__isl_take isl_space *dim)
-{
-	if (!dim)
-		return NULL;
-	if (!dim->nested[1])
-		return dim;
-
-	return isl_space_reset(dim, isl_dim_out);
-}
-
-/* Replace the dimensions of the given type of dst by those of src.
- */
-__isl_give isl_space *isl_space_replace(__isl_take isl_space *dst,
-	enum isl_dim_type type, __isl_keep isl_space *src)
-{
-	dst = isl_space_cow(dst);
-
-	if (!dst || !src)
-		goto error;
-
-	dst = isl_space_drop_dims(dst, type, 0, isl_space_dim(dst, type));
-	dst = isl_space_add_dims(dst, type, isl_space_dim(src, type));
-	dst = copy_ids(dst, type, 0, src, type);
-
-	if (dst && type == isl_dim_param) {
-		int i;
-		for (i = 0; i <= 1; ++i) {
-			if (!dst->nested[i])
-				continue;
-			dst->nested[i] = isl_space_replace(dst->nested[i],
-							 type, src);
-			if (!dst->nested[i])
-				goto error;
-		}
-	}
-
-	return dst;
-error:
-	isl_space_free(dst);
-	return NULL;
-}
-
-/* Given a dimension specification "dim" of a set, create a dimension
- * specification for the lift of the set.  In particular, the result
- * is of the form [dim -> local[..]], with n_local variables in the
- * range of the wrapped map.
- */
-__isl_give isl_space *isl_space_lift(__isl_take isl_space *dim, unsigned n_local)
-{
-	isl_space *local_dim;
-
-	if (!dim)
-		return NULL;
-
-	local_dim = isl_space_dup(dim);
-	local_dim = isl_space_drop_dims(local_dim, isl_dim_set, 0, dim->n_out);
-	local_dim = isl_space_add_dims(local_dim, isl_dim_set, n_local);
-	local_dim = isl_space_set_tuple_name(local_dim, isl_dim_set, "local");
-	dim = isl_space_join(isl_space_from_domain(dim),
-			    isl_space_from_range(local_dim));
-	dim = isl_space_wrap(dim);
-	dim = isl_space_set_tuple_name(dim, isl_dim_set, "lifted");
-
-	return dim;
-}
-
-int isl_space_can_zip(__isl_keep isl_space *dim)
-{
-	if (!dim)
-		return -1;
-
-	return dim->nested[0] && dim->nested[1];
-}
-
-__isl_give isl_space *isl_space_zip(__isl_take isl_space *dim)
-{
-	isl_space *dom, *ran;
-	isl_space *dom_dom, *dom_ran, *ran_dom, *ran_ran;
-
-	if (!isl_space_can_zip(dim))
-		isl_die(dim->ctx, isl_error_invalid, "dim cannot be zipped",
-			goto error);
-
-	if (!dim)
-		return 0;
-	dom = isl_space_unwrap(isl_space_domain(isl_space_copy(dim)));
-	ran = isl_space_unwrap(isl_space_range(dim));
-	dom_dom = isl_space_domain(isl_space_copy(dom));
-	dom_ran = isl_space_range(dom);
-	ran_dom = isl_space_domain(isl_space_copy(ran));
-	ran_ran = isl_space_range(ran);
-	dom = isl_space_join(isl_space_from_domain(dom_dom),
-			   isl_space_from_range(ran_dom));
-	ran = isl_space_join(isl_space_from_domain(dom_ran),
-			   isl_space_from_range(ran_ran));
-	return isl_space_join(isl_space_from_domain(isl_space_wrap(dom)),
-			    isl_space_from_range(isl_space_wrap(ran)));
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-int isl_space_has_named_params(__isl_keep isl_space *dim)
-{
-	int i;
-	unsigned off;
-
-	if (!dim)
-		return -1;
-	if (dim->nparam == 0)
-		return 1;
-	off = isl_space_offset(dim, isl_dim_param);
-	if (off + dim->nparam > dim->n_id)
-		return 0;
-	for (i = 0; i < dim->nparam; ++i)
-		if (!dim->ids[off + i])
-			return 0;
-	return 1;
-}
-
-/* Align the initial parameters of dim1 to match the order in dim2.
- */
-__isl_give isl_space *isl_space_align_params(__isl_take isl_space *dim1,
-	__isl_take isl_space *dim2)
-{
-	isl_reordering *exp;
-
-	if (!isl_space_has_named_params(dim1) || !isl_space_has_named_params(dim2))
-		isl_die(isl_space_get_ctx(dim1), isl_error_invalid,
-			"parameter alignment requires named parameters",
-			goto error);
-
-	dim2 = isl_space_params(dim2);
-	exp = isl_parameter_alignment_reordering(dim1, dim2);
-	exp = isl_reordering_extend_space(exp, dim1);
-	isl_space_free(dim2);
-	if (!exp)
-		return NULL;
-	dim1 = isl_space_copy(exp->dim);
-	isl_reordering_free(exp);
-	return dim1;
-error:
-	isl_space_free(dim1);
-	isl_space_free(dim2);
-	return NULL;
-}
-
-/* Given the space of set (domain), construct a space for a map
- * with as domain the given space and as range the range of "model".
- */
-__isl_give isl_space *isl_space_extend_domain_with_range(
-	__isl_take isl_space *domain, __isl_take isl_space *model)
-{
-	isl_space *space;
-
-	space = isl_space_from_domain(domain);
-	space = isl_space_add_dims(space, isl_dim_out,
-				    isl_space_dim(model, isl_dim_out));
-	if (isl_space_has_tuple_id(model, isl_dim_out))
-		space = isl_space_set_tuple_id(space, isl_dim_out,
-				isl_space_get_tuple_id(model, isl_dim_out));
-	isl_space_free(model);
-	return space;
-}
diff --git a/cloog-0.17.0/isl/isl_space_private.h b/cloog-0.17.0/isl/isl_space_private.h
deleted file mode 100644
index 73762de..0000000
--- a/cloog-0.17.0/isl/isl_space_private.h
+++ /dev/null
@@ -1,51 +0,0 @@
-#include <isl/space.h>
-#include <isl/hash.h>
-#include <isl/id.h>
-
-struct isl_name;
-struct isl_space {
-	int ref;
-
-	struct isl_ctx *ctx;
-
-	unsigned nparam;
-	unsigned n_in;		/* zero for sets */
-	unsigned n_out;		/* dim for sets */
-
-	isl_id *tuple_id[2];
-	isl_space *nested[2];
-
-	unsigned n_id;
-	isl_id **ids;
-};
-
-__isl_give isl_space *isl_space_cow(__isl_take isl_space *dim);
-
-__isl_give isl_space *isl_space_underlying(__isl_take isl_space *dim,
-	unsigned n_div);
-
-uint32_t isl_space_get_hash(__isl_keep isl_space *dim);
-
-int isl_space_is_domain(__isl_keep isl_space *space1,
-	__isl_keep isl_space *space2);
-
-__isl_give isl_space *isl_space_as_set_space(__isl_take isl_space *dim);
-
-unsigned isl_space_offset(__isl_keep isl_space *dim, enum isl_dim_type type);
-
-int isl_space_may_be_set(__isl_keep isl_space *dim);
-int isl_space_is_named_or_nested(__isl_keep isl_space *dim, enum isl_dim_type type);
-int isl_space_has_named_params(__isl_keep isl_space *dim);
-__isl_give isl_space *isl_space_reset(__isl_take isl_space *dim,
-	enum isl_dim_type type);
-__isl_give isl_space *isl_space_flatten(__isl_take isl_space *dim);
-__isl_give isl_space *isl_space_flatten_domain(__isl_take isl_space *dim);
-__isl_give isl_space *isl_space_flatten_range(__isl_take isl_space *dim);
-
-__isl_give isl_space *isl_space_replace(__isl_take isl_space *dst,
-	enum isl_dim_type type, __isl_keep isl_space *src);
-
-__isl_give isl_space *isl_space_lift(__isl_take isl_space *dim, unsigned n_local);
-
-__isl_give isl_space *isl_space_extend_domain_with_range(
-	__isl_take isl_space *domain, __isl_take isl_space *model);
diff --git a/cloog-0.17.0/isl/isl_stream.c b/cloog-0.17.0/isl/isl_stream.c
deleted file mode 100644
index db59468..0000000
--- a/cloog-0.17.0/isl/isl_stream.c
+++ /dev/null
@@ -1,735 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <ctype.h>
-#include <string.h>
-#include <strings.h>
-#include <isl/ctx.h>
-#include <isl_stream_private.h>
-#include <isl/map.h>
-#include <isl/aff.h>
-
-struct isl_keyword {
-	char			*name;
-	enum isl_token_type	type;
-};
-
-static int same_name(const void *entry, const void *val)
-{
-	const struct isl_keyword *keyword = (const struct isl_keyword *)entry;
-
-	return !strcmp(keyword->name, val);
-}
-
-enum isl_token_type isl_stream_register_keyword(struct isl_stream *s,
-	const char *name)
-{
-	struct isl_hash_table_entry *entry;
-	struct isl_keyword *keyword;
-	uint32_t name_hash;
-
-	if (!s->keywords) {
-		s->keywords = isl_hash_table_alloc(s->ctx, 10);
-		if (!s->keywords)
-			return ISL_TOKEN_ERROR;
-		s->next_type = ISL_TOKEN_LAST;
-	}
-
-	name_hash = isl_hash_string(isl_hash_init(), name);
-
-	entry = isl_hash_table_find(s->ctx, s->keywords, name_hash,
-					same_name, name, 1);
-	if (!entry)
-		return ISL_TOKEN_ERROR;
-	if (entry->data) {
-		keyword = entry->data;
-		return keyword->type;
-	}
-
-	keyword = isl_calloc_type(s->ctx, struct isl_keyword);
-	if (!keyword)
-		return ISL_TOKEN_ERROR;
-	keyword->type = s->next_type++;
-	keyword->name = strdup(name);
-	if (!keyword->name) {
-		free(keyword);
-		return ISL_TOKEN_ERROR;
-	}
-	entry->data = keyword;
-
-	return keyword->type;
-}
-
-struct isl_token *isl_token_new(isl_ctx *ctx,
-	int line, int col, unsigned on_new_line)
-{
-	struct isl_token *tok = isl_alloc_type(ctx, struct isl_token);
-	if (!tok)
-		return NULL;
-	tok->line = line;
-	tok->col = col;
-	tok->on_new_line = on_new_line;
-	tok->is_keyword = 0;
-	tok->u.s = NULL;
-	return tok;
-}
-
-void isl_token_free(struct isl_token *tok)
-{
-	if (!tok)
-		return;
-	if (tok->type == ISL_TOKEN_VALUE)
-		isl_int_clear(tok->u.v);
-	else if (tok->type == ISL_TOKEN_MAP)
-		isl_map_free(tok->u.map);
-	else if (tok->type == ISL_TOKEN_AFF)
-		isl_pw_aff_free(tok->u.pwaff);
-	else
-		free(tok->u.s);
-	free(tok);
-}
-
-void isl_stream_error(struct isl_stream *s, struct isl_token *tok, char *msg)
-{
-	int line = tok ? tok->line : s->line;
-	int col = tok ? tok->col : s->col;
-	fprintf(stderr, "syntax error (%d, %d): %s\n", line, col, msg);
-	if (tok) {
-		if (tok->type < 256)
-			fprintf(stderr, "got '%c'\n", tok->type);
-		else if (tok->type == ISL_TOKEN_IDENT)
-			fprintf(stderr, "got ident '%s'\n", tok->u.s);
-		else if (tok->is_keyword)
-			fprintf(stderr, "got keyword '%s'\n", tok->u.s);
-		else if (tok->type == ISL_TOKEN_VALUE) {
-			fprintf(stderr, "got value '");
-			isl_int_print(stderr, tok->u.v, 0);
-			fprintf(stderr, "'\n");
-		} else if (tok->type == ISL_TOKEN_MAP) {
-			isl_printer *p;
-			fprintf(stderr, "got map '");
-			p = isl_printer_to_file(s->ctx, stderr);
-			p = isl_printer_print_map(p, tok->u.map);
-			isl_printer_free(p);
-			fprintf(stderr, "'\n");
-		} else if (tok->type == ISL_TOKEN_AFF) {
-			isl_printer *p;
-			fprintf(stderr, "got affine expression '");
-			p = isl_printer_to_file(s->ctx, stderr);
-			p = isl_printer_print_pw_aff(p, tok->u.pwaff);
-			isl_printer_free(p);
-			fprintf(stderr, "'\n");
-		} else if (tok->u.s)
-			fprintf(stderr, "got token '%s'\n", tok->u.s);
-		else
-			fprintf(stderr, "got token type %d\n", tok->type);
-	}
-}
-
-static struct isl_stream* isl_stream_new(struct isl_ctx *ctx)
-{
-	int i;
-	struct isl_stream *s = isl_alloc_type(ctx, struct isl_stream);
-	if (!s)
-		return NULL;
-	s->ctx = ctx;
-	isl_ctx_ref(s->ctx);
-	s->file = NULL;
-	s->str = NULL;
-	s->len = 0;
-	s->line = 1;
-	s->col = 0;
-	s->eof = 0;
-	s->c = -1;
-	s->n_un = 0;
-	for (i = 0; i < 5; ++i)
-		s->tokens[i] = NULL;
-	s->n_token = 0;
-	s->keywords = NULL;
-	s->size = 256;
-	s->buffer = isl_alloc_array(ctx, char, s->size);
-	if (!s->buffer)
-		goto error;
-	return s;
-error:
-	isl_stream_free(s);
-	return NULL;
-}
-
-struct isl_stream* isl_stream_new_file(struct isl_ctx *ctx, FILE *file)
-{
-	struct isl_stream *s = isl_stream_new(ctx);
-	if (!s)
-		return NULL;
-	s->file = file;
-	return s;
-}
-
-struct isl_stream* isl_stream_new_str(struct isl_ctx *ctx, const char *str)
-{
-	struct isl_stream *s = isl_stream_new(ctx);
-	if (!s)
-		return NULL;
-	s->str = str;
-	return s;
-}
-
-static int stream_getc(struct isl_stream *s)
-{
-	int c;
-	if (s->eof)
-		return -1;
-	if (s->n_un)
-		return s->c = s->un[--s->n_un];
-	if (s->file)
-		c = fgetc(s->file);
-	else {
-		c = *s->str++;
-		if (c == '\0')
-			c = -1;
-	}
-	if (c == -1)
-		s->eof = 1;
-	if (!s->eof) {
-		if (s->c == '\n') {
-			s->line++;
-			s->col = 0;
-		} else
-			s->col++;
-	}
-	s->c = c;
-	return c;
-}
-
-static void isl_stream_ungetc(struct isl_stream *s, int c)
-{
-	isl_assert(s->ctx, s->n_un < 5, return);
-	s->un[s->n_un++] = c;
-	s->c = -1;
-}
-
-static int isl_stream_getc(struct isl_stream *s)
-{
-	int c;
-
-	do {
-		c = stream_getc(s);
-		if (c != '\\')
-			return c;
-		c = stream_getc(s);
-	} while (c == '\n');
-
-	isl_stream_ungetc(s, c);
-
-	return '\\';
-}
-
-static int isl_stream_push_char(struct isl_stream *s, int c)
-{
-	if (s->len >= s->size) {
-		char *buffer;
-		s->size = (3*s->size)/2;
-		buffer = isl_realloc_array(s->ctx, s->buffer, char, s->size);
-		if (!buffer)
-			return -1;
-		s->buffer = buffer;
-	}
-	s->buffer[s->len++] = c;
-	return 0;
-}
-
-void isl_stream_push_token(struct isl_stream *s, struct isl_token *tok)
-{
-	isl_assert(s->ctx, s->n_token < 5, return);
-	s->tokens[s->n_token++] = tok;
-}
-
-static enum isl_token_type check_keywords(struct isl_stream *s)
-{
-	struct isl_hash_table_entry *entry;
-	struct isl_keyword *keyword;
-	uint32_t name_hash;
-
-	if (!strcasecmp(s->buffer, "exists"))
-		return ISL_TOKEN_EXISTS;
-	if (!strcasecmp(s->buffer, "and"))
-		return ISL_TOKEN_AND;
-	if (!strcasecmp(s->buffer, "or"))
-		return ISL_TOKEN_OR;
-	if (!strcasecmp(s->buffer, "not"))
-		return ISL_TOKEN_NOT;
-	if (!strcasecmp(s->buffer, "infty"))
-		return ISL_TOKEN_INFTY;
-	if (!strcasecmp(s->buffer, "infinity"))
-		return ISL_TOKEN_INFTY;
-	if (!strcasecmp(s->buffer, "NaN"))
-		return ISL_TOKEN_NAN;
-	if (!strcasecmp(s->buffer, "min"))
-		return ISL_TOKEN_MIN;
-	if (!strcasecmp(s->buffer, "max"))
-		return ISL_TOKEN_MAX;
-	if (!strcasecmp(s->buffer, "rat"))
-		return ISL_TOKEN_RAT;
-	if (!strcasecmp(s->buffer, "true"))
-		return ISL_TOKEN_TRUE;
-	if (!strcasecmp(s->buffer, "false"))
-		return ISL_TOKEN_FALSE;
-	if (!strcasecmp(s->buffer, "ceild"))
-		return ISL_TOKEN_CEILD;
-	if (!strcasecmp(s->buffer, "floord"))
-		return ISL_TOKEN_FLOORD;
-	if (!strcasecmp(s->buffer, "mod"))
-		return ISL_TOKEN_MOD;
-
-	if (!s->keywords)
-		return ISL_TOKEN_IDENT;
-
-	name_hash = isl_hash_string(isl_hash_init(), s->buffer);
-	entry = isl_hash_table_find(s->ctx, s->keywords, name_hash, same_name,
-					s->buffer, 0);
-	if (entry) {
-		keyword = entry->data;
-		return keyword->type;
-	}
-
-	return ISL_TOKEN_IDENT;
-}
-
-int isl_stream_skip_line(struct isl_stream *s)
-{
-	int c;
-
-	while ((c = isl_stream_getc(s)) != -1 && c != '\n')
-		/* nothing */
-		;
-
-	return c == -1 ? -1 : 0;
-}
-
-static struct isl_token *next_token(struct isl_stream *s, int same_line)
-{
-	int c;
-	struct isl_token *tok = NULL;
-	int line, col;
-	int old_line = s->line;
-
-	if (s->n_token) {
-		if (same_line && s->tokens[s->n_token - 1]->on_new_line)
-			return NULL;
-		return s->tokens[--s->n_token];
-	}
-
-	if (same_line && s->c == '\n')
-		return NULL;
-
-	s->len = 0;
-
-	/* skip spaces and comment lines */
-	while ((c = isl_stream_getc(s)) != -1) {
-		if (c == '#') {
-			if (isl_stream_skip_line(s) < 0)
-				break;
-			c = '\n';
-			if (same_line)
-				break;
-		} else if (!isspace(c) || (same_line && c == '\n'))
-			break;
-	}
-
-	line = s->line;
-	col = s->col;
-
-	if (c == -1 || (same_line && c == '\n'))
-		return NULL;
-	if (c == '(' ||
-	    c == ')' ||
-	    c == '+' ||
-	    c == '*' ||
-	    c == '%' ||
-	    c == '?' ||
-	    c == '^' ||
-	    c == '@' ||
-	    c == '$' ||
-	    c == ',' ||
-	    c == '.' ||
-	    c == ';' ||
-	    c == '[' ||
-	    c == ']' ||
-	    c == '{' ||
-	    c == '}') {
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		tok->type = (enum isl_token_type)c;
-		return tok;
-	}
-	if (c == '-') {
-		int c;
-		if ((c = isl_stream_getc(s)) == '>') {
-			tok = isl_token_new(s->ctx, line, col, old_line != line);
-			if (!tok)
-				return NULL;
-			tok->u.s = strdup("->");
-			tok->type = ISL_TOKEN_TO;
-			return tok;
-		}
-		if (c != -1)
-			isl_stream_ungetc(s, c);
-		if (!isdigit(c)) {
-			tok = isl_token_new(s->ctx, line, col, old_line != line);
-			if (!tok)
-				return NULL;
-			tok->type = (enum isl_token_type) '-';
-			return tok;
-		}
-	}
-	if (c == '-' || isdigit(c)) {
-		int minus = c == '-';
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		tok->type = ISL_TOKEN_VALUE;
-		isl_int_init(tok->u.v);
-		if (isl_stream_push_char(s, c))
-			goto error;
-		while ((c = isl_stream_getc(s)) != -1 && isdigit(c))
-			if (isl_stream_push_char(s, c))
-				goto error;
-		if (c != -1)
-			isl_stream_ungetc(s, c);
-		isl_stream_push_char(s, '\0');
-		isl_int_read(tok->u.v, s->buffer);
-		if (minus && isl_int_is_zero(tok->u.v)) {
-			tok->col++;
-			tok->on_new_line = 0;
-			isl_stream_push_token(s, tok);
-			tok = isl_token_new(s->ctx, line, col, old_line != line);
-			if (!tok)
-				return NULL;
-			tok->type = (enum isl_token_type) '-';
-		}
-		return tok;
-	}
-	if (isalpha(c) || c == '_') {
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		isl_stream_push_char(s, c);
-		while ((c = isl_stream_getc(s)) != -1 &&
-				(isalnum(c) || c == '_'))
-			isl_stream_push_char(s, c);
-		if (c != -1)
-			isl_stream_ungetc(s, c);
-		while ((c = isl_stream_getc(s)) != -1 && c == '\'')
-			isl_stream_push_char(s, c);
-		if (c != -1)
-			isl_stream_ungetc(s, c);
-		isl_stream_push_char(s, '\0');
-		tok->type = check_keywords(s);
-		if (tok->type != ISL_TOKEN_IDENT)
-			tok->is_keyword = 1;
-		tok->u.s = strdup(s->buffer);
-		if (!tok->u.s)
-			goto error;
-		return tok;
-	}
-	if (c == '"') {
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		tok->type = ISL_TOKEN_STRING;
-		tok->u.s = NULL;
-		while ((c = isl_stream_getc(s)) != -1 && c != '"' && c != '\n')
-			isl_stream_push_char(s, c);
-		if (c != '"') {
-			isl_stream_error(s, NULL, "unterminated string");
-			goto error;
-		}
-		isl_stream_push_char(s, '\0');
-		tok->u.s = strdup(s->buffer);
-		return tok;
-	}
-	if (c == '=') {
-		int c;
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		if ((c = isl_stream_getc(s)) == '=') {
-			tok->u.s = strdup("==");
-			tok->type = ISL_TOKEN_EQ_EQ;
-			return tok;
-		}
-		if (c != -1)
-			isl_stream_ungetc(s, c);
-		tok->type = (enum isl_token_type) '=';
-		return tok;
-	}
-	if (c == ':') {
-		int c;
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		if ((c = isl_stream_getc(s)) == '=') {
-			tok->u.s = strdup(":=");
-			tok->type = ISL_TOKEN_DEF;
-			return tok;
-		}
-		if (c != -1)
-			isl_stream_ungetc(s, c);
-		tok->type = (enum isl_token_type) ':';
-		return tok;
-	}
-	if (c == '>') {
-		int c;
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		if ((c = isl_stream_getc(s)) == '=') {
-			tok->u.s = strdup(">=");
-			tok->type = ISL_TOKEN_GE;
-			return tok;
-		} else if (c == '>') {
-			if ((c = isl_stream_getc(s)) == '=') {
-				tok->u.s = strdup(">>=");
-				tok->type = ISL_TOKEN_LEX_GE;
-				return tok;
-			}
-			tok->u.s = strdup(">>");
-			tok->type = ISL_TOKEN_LEX_GT;
-		} else {
-			tok->u.s = strdup(">");
-			tok->type = ISL_TOKEN_GT;
-		}
-		if (c != -1)
-			isl_stream_ungetc(s, c);
-		return tok;
-	}
-	if (c == '<') {
-		int c;
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		if ((c = isl_stream_getc(s)) == '=') {
-			tok->u.s = strdup("<=");
-			tok->type = ISL_TOKEN_LE;
-			return tok;
-		} else if (c == '<') {
-			if ((c = isl_stream_getc(s)) == '=') {
-				tok->u.s = strdup("<<=");
-				tok->type = ISL_TOKEN_LEX_LE;
-				return tok;
-			}
-			tok->u.s = strdup("<<");
-			tok->type = ISL_TOKEN_LEX_LT;
-		} else {
-			tok->u.s = strdup("<");
-			tok->type = ISL_TOKEN_LT;
-		}
-		if (c != -1)
-			isl_stream_ungetc(s, c);
-		return tok;
-	}
-	if (c == '&') {
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		tok->type = ISL_TOKEN_AND;
-		if ((c = isl_stream_getc(s)) != '&' && c != -1) {
-			tok->u.s = strdup("&");
-			isl_stream_ungetc(s, c);
-		} else
-			tok->u.s = strdup("&&");
-		return tok;
-	}
-	if (c == '|') {
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		tok->type = ISL_TOKEN_OR;
-		if ((c = isl_stream_getc(s)) != '|' && c != -1) {
-			tok->u.s = strdup("|");
-			isl_stream_ungetc(s, c);
-		} else
-			tok->u.s = strdup("||");
-		return tok;
-	}
-	if (c == '/') {
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		if ((c = isl_stream_getc(s)) != '\\' && c != -1) {
-			tok->type = (enum isl_token_type) '/';
-			isl_stream_ungetc(s, c);
-		} else {
-			tok->u.s = strdup("/\\");
-			tok->type = ISL_TOKEN_AND;
-		}
-		return tok;
-	}
-	if (c == '\\') {
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		if ((c = isl_stream_getc(s)) != '/' && c != -1) {
-			tok->type = (enum isl_token_type) '\\';
-			isl_stream_ungetc(s, c);
-		} else {
-			tok->u.s = strdup("\\/");
-			tok->type = ISL_TOKEN_OR;
-		}
-		return tok;
-	}
-	if (c == '!') {
-		tok = isl_token_new(s->ctx, line, col, old_line != line);
-		if (!tok)
-			return NULL;
-		if ((c = isl_stream_getc(s)) == '=') {
-			tok->u.s = strdup("!=");
-			tok->type = ISL_TOKEN_NE;
-			return tok;
-		} else {
-			tok->type = ISL_TOKEN_NOT;
-			tok->u.s = strdup("!");
-		}
-		if (c != -1)
-			isl_stream_ungetc(s, c);
-		return tok;
-	}
-
-	tok = isl_token_new(s->ctx, line, col, old_line != line);
-	if (!tok)
-		return NULL;
-	tok->type = ISL_TOKEN_UNKNOWN;
-	return tok;
-error:
-	isl_token_free(tok);
-	return NULL;
-}
-
-struct isl_token *isl_stream_next_token(struct isl_stream *s)
-{
-	return next_token(s, 0);
-}
-
-struct isl_token *isl_stream_next_token_on_same_line(struct isl_stream *s)
-{
-	return next_token(s, 1);
-}
-
-int isl_stream_eat_if_available(struct isl_stream *s, int type)
-{
-	struct isl_token *tok;
-
-	tok = isl_stream_next_token(s);
-	if (!tok)
-		return 0;
-	if (tok->type == type) {
-		isl_token_free(tok);
-		return 1;
-	}
-	isl_stream_push_token(s, tok);
-	return 0;
-}
-
-int isl_stream_next_token_is(struct isl_stream *s, int type)
-{
-	struct isl_token *tok;
-	int r;
-
-	tok = isl_stream_next_token(s);
-	if (!tok)
-		return 0;
-	r = tok->type == type;
-	isl_stream_push_token(s, tok);
-	return r;
-}
-
-char *isl_stream_read_ident_if_available(struct isl_stream *s)
-{
-	struct isl_token *tok;
-
-	tok = isl_stream_next_token(s);
-	if (!tok)
-		return NULL;
-	if (tok->type == ISL_TOKEN_IDENT) {
-		char *ident = strdup(tok->u.s);
-		isl_token_free(tok);
-		return ident;
-	}
-	isl_stream_push_token(s, tok);
-	return NULL;
-}
-
-int isl_stream_eat(struct isl_stream *s, int type)
-{
-	struct isl_token *tok;
-
-	tok = isl_stream_next_token(s);
-	if (!tok)
-		return -1;
-	if (tok->type == type) {
-		isl_token_free(tok);
-		return 0;
-	}
-	isl_stream_error(s, tok, "expecting other token");
-	isl_stream_push_token(s, tok);
-	return -1;
-}
-
-int isl_stream_is_empty(struct isl_stream *s)
-{
-	struct isl_token *tok;
-
-	tok = isl_stream_next_token(s);
-
-	if (!tok)
-		return 1;
-
-	isl_stream_push_token(s, tok);
-	return 0;
-}
-
-static int free_keyword(void **p, void *user)
-{
-	struct isl_keyword *keyword = *p;
-
-	free(keyword->name);
-	free(keyword);
-
-	return 0;
-}
-
-void isl_stream_flush_tokens(struct isl_stream *s)
-{
-	int i;
-
-	if (!s)
-		return;
-	for (i = 0; i < s->n_token; ++i)
-		isl_token_free(s->tokens[i]);
-	s->n_token = 0;
-}
-
-void isl_stream_free(struct isl_stream *s)
-{
-	if (!s)
-		return;
-	free(s->buffer);
-	if (s->n_token != 0) {
-		struct isl_token *tok = isl_stream_next_token(s);
-		isl_stream_error(s, tok, "unexpected token");
-		isl_token_free(tok);
-	}
-	if (s->keywords) {
-		isl_hash_table_foreach(s->ctx, s->keywords, &free_keyword, NULL);
-		isl_hash_table_free(s->ctx, s->keywords);
-	}
-	isl_ctx_deref(s->ctx);
-	free(s);
-}
diff --git a/cloog-0.17.0/isl/isl_stream_private.h b/cloog-0.17.0/isl/isl_stream_private.h
deleted file mode 100644
index 5623251..0000000
--- a/cloog-0.17.0/isl/isl_stream_private.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#include <isl/stream.h>
-
-struct isl_token *isl_token_new(isl_ctx *ctx,
-	int line, int col, unsigned on_new_line);
diff --git a/cloog-0.17.0/isl/isl_tab.c b/cloog-0.17.0/isl/isl_tab.c
deleted file mode 100644
index 220f0b0..0000000
--- a/cloog-0.17.0/isl/isl_tab.c
+++ /dev/null
@@ -1,3342 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl_mat_private.h>
-#include "isl_map_private.h"
-#include "isl_tab.h"
-#include <isl/seq.h>
-#include <isl_config.h>
-
-/*
- * The implementation of tableaus in this file was inspired by Section 8
- * of David Detlefs, Greg Nelson and James B. Saxe, "Simplify: a theorem
- * prover for program checking".
- */
-
-struct isl_tab *isl_tab_alloc(struct isl_ctx *ctx,
-	unsigned n_row, unsigned n_var, unsigned M)
-{
-	int i;
-	struct isl_tab *tab;
-	unsigned off = 2 + M;
-
-	tab = isl_calloc_type(ctx, struct isl_tab);
-	if (!tab)
-		return NULL;
-	tab->mat = isl_mat_alloc(ctx, n_row, off + n_var);
-	if (!tab->mat)
-		goto error;
-	tab->var = isl_alloc_array(ctx, struct isl_tab_var, n_var);
-	if (!tab->var)
-		goto error;
-	tab->con = isl_alloc_array(ctx, struct isl_tab_var, n_row);
-	if (!tab->con)
-		goto error;
-	tab->col_var = isl_alloc_array(ctx, int, n_var);
-	if (!tab->col_var)
-		goto error;
-	tab->row_var = isl_alloc_array(ctx, int, n_row);
-	if (!tab->row_var)
-		goto error;
-	for (i = 0; i < n_var; ++i) {
-		tab->var[i].index = i;
-		tab->var[i].is_row = 0;
-		tab->var[i].is_nonneg = 0;
-		tab->var[i].is_zero = 0;
-		tab->var[i].is_redundant = 0;
-		tab->var[i].frozen = 0;
-		tab->var[i].negated = 0;
-		tab->col_var[i] = i;
-	}
-	tab->n_row = 0;
-	tab->n_con = 0;
-	tab->n_eq = 0;
-	tab->max_con = n_row;
-	tab->n_col = n_var;
-	tab->n_var = n_var;
-	tab->max_var = n_var;
-	tab->n_param = 0;
-	tab->n_div = 0;
-	tab->n_dead = 0;
-	tab->n_redundant = 0;
-	tab->strict_redundant = 0;
-	tab->need_undo = 0;
-	tab->rational = 0;
-	tab->empty = 0;
-	tab->in_undo = 0;
-	tab->M = M;
-	tab->cone = 0;
-	tab->bottom.type = isl_tab_undo_bottom;
-	tab->bottom.next = NULL;
-	tab->top = &tab->bottom;
-
-	tab->n_zero = 0;
-	tab->n_unbounded = 0;
-	tab->basis = NULL;
-
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-int isl_tab_extend_cons(struct isl_tab *tab, unsigned n_new)
-{
-	unsigned off;
-
-	if (!tab)
-		return -1;
-
-	off = 2 + tab->M;
-
-	if (tab->max_con < tab->n_con + n_new) {
-		struct isl_tab_var *con;
-
-		con = isl_realloc_array(tab->mat->ctx, tab->con,
-				    struct isl_tab_var, tab->max_con + n_new);
-		if (!con)
-			return -1;
-		tab->con = con;
-		tab->max_con += n_new;
-	}
-	if (tab->mat->n_row < tab->n_row + n_new) {
-		int *row_var;
-
-		tab->mat = isl_mat_extend(tab->mat,
-					tab->n_row + n_new, off + tab->n_col);
-		if (!tab->mat)
-			return -1;
-		row_var = isl_realloc_array(tab->mat->ctx, tab->row_var,
-					    int, tab->mat->n_row);
-		if (!row_var)
-			return -1;
-		tab->row_var = row_var;
-		if (tab->row_sign) {
-			enum isl_tab_row_sign *s;
-			s = isl_realloc_array(tab->mat->ctx, tab->row_sign,
-					enum isl_tab_row_sign, tab->mat->n_row);
-			if (!s)
-				return -1;
-			tab->row_sign = s;
-		}
-	}
-	return 0;
-}
-
-/* Make room for at least n_new extra variables.
- * Return -1 if anything went wrong.
- */
-int isl_tab_extend_vars(struct isl_tab *tab, unsigned n_new)
-{
-	struct isl_tab_var *var;
-	unsigned off = 2 + tab->M;
-
-	if (tab->max_var < tab->n_var + n_new) {
-		var = isl_realloc_array(tab->mat->ctx, tab->var,
-				    struct isl_tab_var, tab->n_var + n_new);
-		if (!var)
-			return -1;
-		tab->var = var;
-		tab->max_var += n_new;
-	}
-
-	if (tab->mat->n_col < off + tab->n_col + n_new) {
-		int *p;
-
-		tab->mat = isl_mat_extend(tab->mat,
-				    tab->mat->n_row, off + tab->n_col + n_new);
-		if (!tab->mat)
-			return -1;
-		p = isl_realloc_array(tab->mat->ctx, tab->col_var,
-					    int, tab->n_col + n_new);
-		if (!p)
-			return -1;
-		tab->col_var = p;
-	}
-
-	return 0;
-}
-
-struct isl_tab *isl_tab_extend(struct isl_tab *tab, unsigned n_new)
-{
-	if (isl_tab_extend_cons(tab, n_new) >= 0)
-		return tab;
-
-	isl_tab_free(tab);
-	return NULL;
-}
-
-static void free_undo_record(struct isl_tab_undo *undo)
-{
-	switch (undo->type) {
-	case isl_tab_undo_saved_basis:
-		free(undo->u.col_var);
-		break;
-	default:;
-	}
-	free(undo);
-}
-
-static void free_undo(struct isl_tab *tab)
-{
-	struct isl_tab_undo *undo, *next;
-
-	for (undo = tab->top; undo && undo != &tab->bottom; undo = next) {
-		next = undo->next;
-		free_undo_record(undo);
-	}
-	tab->top = undo;
-}
-
-void isl_tab_free(struct isl_tab *tab)
-{
-	if (!tab)
-		return;
-	free_undo(tab);
-	isl_mat_free(tab->mat);
-	isl_vec_free(tab->dual);
-	isl_basic_map_free(tab->bmap);
-	free(tab->var);
-	free(tab->con);
-	free(tab->row_var);
-	free(tab->col_var);
-	free(tab->row_sign);
-	isl_mat_free(tab->samples);
-	free(tab->sample_index);
-	isl_mat_free(tab->basis);
-	free(tab);
-}
-
-struct isl_tab *isl_tab_dup(struct isl_tab *tab)
-{
-	int i;
-	struct isl_tab *dup;
-	unsigned off;
-
-	if (!tab)
-		return NULL;
-
-	off = 2 + tab->M;
-	dup = isl_calloc_type(tab->mat->ctx, struct isl_tab);
-	if (!dup)
-		return NULL;
-	dup->mat = isl_mat_dup(tab->mat);
-	if (!dup->mat)
-		goto error;
-	dup->var = isl_alloc_array(tab->mat->ctx, struct isl_tab_var, tab->max_var);
-	if (!dup->var)
-		goto error;
-	for (i = 0; i < tab->n_var; ++i)
-		dup->var[i] = tab->var[i];
-	dup->con = isl_alloc_array(tab->mat->ctx, struct isl_tab_var, tab->max_con);
-	if (!dup->con)
-		goto error;
-	for (i = 0; i < tab->n_con; ++i)
-		dup->con[i] = tab->con[i];
-	dup->col_var = isl_alloc_array(tab->mat->ctx, int, tab->mat->n_col - off);
-	if (!dup->col_var)
-		goto error;
-	for (i = 0; i < tab->n_col; ++i)
-		dup->col_var[i] = tab->col_var[i];
-	dup->row_var = isl_alloc_array(tab->mat->ctx, int, tab->mat->n_row);
-	if (!dup->row_var)
-		goto error;
-	for (i = 0; i < tab->n_row; ++i)
-		dup->row_var[i] = tab->row_var[i];
-	if (tab->row_sign) {
-		dup->row_sign = isl_alloc_array(tab->mat->ctx, enum isl_tab_row_sign,
-						tab->mat->n_row);
-		if (!dup->row_sign)
-			goto error;
-		for (i = 0; i < tab->n_row; ++i)
-			dup->row_sign[i] = tab->row_sign[i];
-	}
-	if (tab->samples) {
-		dup->samples = isl_mat_dup(tab->samples);
-		if (!dup->samples)
-			goto error;
-		dup->sample_index = isl_alloc_array(tab->mat->ctx, int,
-							tab->samples->n_row);
-		if (!dup->sample_index)
-			goto error;
-		dup->n_sample = tab->n_sample;
-		dup->n_outside = tab->n_outside;
-	}
-	dup->n_row = tab->n_row;
-	dup->n_con = tab->n_con;
-	dup->n_eq = tab->n_eq;
-	dup->max_con = tab->max_con;
-	dup->n_col = tab->n_col;
-	dup->n_var = tab->n_var;
-	dup->max_var = tab->max_var;
-	dup->n_param = tab->n_param;
-	dup->n_div = tab->n_div;
-	dup->n_dead = tab->n_dead;
-	dup->n_redundant = tab->n_redundant;
-	dup->rational = tab->rational;
-	dup->empty = tab->empty;
-	dup->strict_redundant = 0;
-	dup->need_undo = 0;
-	dup->in_undo = 0;
-	dup->M = tab->M;
-	tab->cone = tab->cone;
-	dup->bottom.type = isl_tab_undo_bottom;
-	dup->bottom.next = NULL;
-	dup->top = &dup->bottom;
-
-	dup->n_zero = tab->n_zero;
-	dup->n_unbounded = tab->n_unbounded;
-	dup->basis = isl_mat_dup(tab->basis);
-
-	return dup;
-error:
-	isl_tab_free(dup);
-	return NULL;
-}
-
-/* Construct the coefficient matrix of the product tableau
- * of two tableaus.
- * mat{1,2} is the coefficient matrix of tableau {1,2}
- * row{1,2} is the number of rows in tableau {1,2}
- * col{1,2} is the number of columns in tableau {1,2}
- * off is the offset to the coefficient column (skipping the
- *	denominator, the constant term and the big parameter if any)
- * r{1,2} is the number of redundant rows in tableau {1,2}
- * d{1,2} is the number of dead columns in tableau {1,2}
- *
- * The order of the rows and columns in the result is as explained
- * in isl_tab_product.
- */
-static struct isl_mat *tab_mat_product(struct isl_mat *mat1,
-	struct isl_mat *mat2, unsigned row1, unsigned row2,
-	unsigned col1, unsigned col2,
-	unsigned off, unsigned r1, unsigned r2, unsigned d1, unsigned d2)
-{
-	int i;
-	struct isl_mat *prod;
-	unsigned n;
-
-	prod = isl_mat_alloc(mat1->ctx, mat1->n_row + mat2->n_row,
-					off + col1 + col2);
-	if (!prod)
-		return NULL;
-
-	n = 0;
-	for (i = 0; i < r1; ++i) {
-		isl_seq_cpy(prod->row[n + i], mat1->row[i], off + d1);
-		isl_seq_clr(prod->row[n + i] + off + d1, d2);
-		isl_seq_cpy(prod->row[n + i] + off + d1 + d2,
-				mat1->row[i] + off + d1, col1 - d1);
-		isl_seq_clr(prod->row[n + i] + off + col1 + d1, col2 - d2);
-	}
-
-	n += r1;
-	for (i = 0; i < r2; ++i) {
-		isl_seq_cpy(prod->row[n + i], mat2->row[i], off);
-		isl_seq_clr(prod->row[n + i] + off, d1);
-		isl_seq_cpy(prod->row[n + i] + off + d1,
-			    mat2->row[i] + off, d2);
-		isl_seq_clr(prod->row[n + i] + off + d1 + d2, col1 - d1);
-		isl_seq_cpy(prod->row[n + i] + off + col1 + d1,
-			    mat2->row[i] + off + d2, col2 - d2);
-	}
-
-	n += r2;
-	for (i = 0; i < row1 - r1; ++i) {
-		isl_seq_cpy(prod->row[n + i], mat1->row[r1 + i], off + d1);
-		isl_seq_clr(prod->row[n + i] + off + d1, d2);
-		isl_seq_cpy(prod->row[n + i] + off + d1 + d2,
-				mat1->row[r1 + i] + off + d1, col1 - d1);
-		isl_seq_clr(prod->row[n + i] + off + col1 + d1, col2 - d2);
-	}
-
-	n += row1 - r1;
-	for (i = 0; i < row2 - r2; ++i) {
-		isl_seq_cpy(prod->row[n + i], mat2->row[r2 + i], off);
-		isl_seq_clr(prod->row[n + i] + off, d1);
-		isl_seq_cpy(prod->row[n + i] + off + d1,
-			    mat2->row[r2 + i] + off, d2);
-		isl_seq_clr(prod->row[n + i] + off + d1 + d2, col1 - d1);
-		isl_seq_cpy(prod->row[n + i] + off + col1 + d1,
-			    mat2->row[r2 + i] + off + d2, col2 - d2);
-	}
-
-	return prod;
-}
-
-/* Update the row or column index of a variable that corresponds
- * to a variable in the first input tableau.
- */
-static void update_index1(struct isl_tab_var *var,
-	unsigned r1, unsigned r2, unsigned d1, unsigned d2)
-{
-	if (var->index == -1)
-		return;
-	if (var->is_row && var->index >= r1)
-		var->index += r2;
-	if (!var->is_row && var->index >= d1)
-		var->index += d2;
-}
-
-/* Update the row or column index of a variable that corresponds
- * to a variable in the second input tableau.
- */
-static void update_index2(struct isl_tab_var *var,
-	unsigned row1, unsigned col1,
-	unsigned r1, unsigned r2, unsigned d1, unsigned d2)
-{
-	if (var->index == -1)
-		return;
-	if (var->is_row) {
-		if (var->index < r2)
-			var->index += r1;
-		else
-			var->index += row1;
-	} else {
-		if (var->index < d2)
-			var->index += d1;
-		else
-			var->index += col1;
-	}
-}
-
-/* Create a tableau that represents the Cartesian product of the sets
- * represented by tableaus tab1 and tab2.
- * The order of the rows in the product is
- *	- redundant rows of tab1
- *	- redundant rows of tab2
- *	- non-redundant rows of tab1
- *	- non-redundant rows of tab2
- * The order of the columns is
- *	- denominator
- *	- constant term
- *	- coefficient of big parameter, if any
- *	- dead columns of tab1
- *	- dead columns of tab2
- *	- live columns of tab1
- *	- live columns of tab2
- * The order of the variables and the constraints is a concatenation
- * of order in the two input tableaus.
- */
-struct isl_tab *isl_tab_product(struct isl_tab *tab1, struct isl_tab *tab2)
-{
-	int i;
-	struct isl_tab *prod;
-	unsigned off;
-	unsigned r1, r2, d1, d2;
-
-	if (!tab1 || !tab2)
-		return NULL;
-
-	isl_assert(tab1->mat->ctx, tab1->M == tab2->M, return NULL);
-	isl_assert(tab1->mat->ctx, tab1->rational == tab2->rational, return NULL);
-	isl_assert(tab1->mat->ctx, tab1->cone == tab2->cone, return NULL);
-	isl_assert(tab1->mat->ctx, !tab1->row_sign, return NULL);
-	isl_assert(tab1->mat->ctx, !tab2->row_sign, return NULL);
-	isl_assert(tab1->mat->ctx, tab1->n_param == 0, return NULL);
-	isl_assert(tab1->mat->ctx, tab2->n_param == 0, return NULL);
-	isl_assert(tab1->mat->ctx, tab1->n_div == 0, return NULL);
-	isl_assert(tab1->mat->ctx, tab2->n_div == 0, return NULL);
-
-	off = 2 + tab1->M;
-	r1 = tab1->n_redundant;
-	r2 = tab2->n_redundant;
-	d1 = tab1->n_dead;
-	d2 = tab2->n_dead;
-	prod = isl_calloc_type(tab1->mat->ctx, struct isl_tab);
-	if (!prod)
-		return NULL;
-	prod->mat = tab_mat_product(tab1->mat, tab2->mat,
-				tab1->n_row, tab2->n_row,
-				tab1->n_col, tab2->n_col, off, r1, r2, d1, d2);
-	if (!prod->mat)
-		goto error;
-	prod->var = isl_alloc_array(tab1->mat->ctx, struct isl_tab_var,
-					tab1->max_var + tab2->max_var);
-	if (!prod->var)
-		goto error;
-	for (i = 0; i < tab1->n_var; ++i) {
-		prod->var[i] = tab1->var[i];
-		update_index1(&prod->var[i], r1, r2, d1, d2);
-	}
-	for (i = 0; i < tab2->n_var; ++i) {
-		prod->var[tab1->n_var + i] = tab2->var[i];
-		update_index2(&prod->var[tab1->n_var + i],
-				tab1->n_row, tab1->n_col,
-				r1, r2, d1, d2);
-	}
-	prod->con = isl_alloc_array(tab1->mat->ctx, struct isl_tab_var,
-					tab1->max_con +  tab2->max_con);
-	if (!prod->con)
-		goto error;
-	for (i = 0; i < tab1->n_con; ++i) {
-		prod->con[i] = tab1->con[i];
-		update_index1(&prod->con[i], r1, r2, d1, d2);
-	}
-	for (i = 0; i < tab2->n_con; ++i) {
-		prod->con[tab1->n_con + i] = tab2->con[i];
-		update_index2(&prod->con[tab1->n_con + i],
-				tab1->n_row, tab1->n_col,
-				r1, r2, d1, d2);
-	}
-	prod->col_var = isl_alloc_array(tab1->mat->ctx, int,
-					tab1->n_col + tab2->n_col);
-	if (!prod->col_var)
-		goto error;
-	for (i = 0; i < tab1->n_col; ++i) {
-		int pos = i < d1 ? i : i + d2;
-		prod->col_var[pos] = tab1->col_var[i];
-	}
-	for (i = 0; i < tab2->n_col; ++i) {
-		int pos = i < d2 ? d1 + i : tab1->n_col + i;
-		int t = tab2->col_var[i];
-		if (t >= 0)
-			t += tab1->n_var;
-		else
-			t -= tab1->n_con;
-		prod->col_var[pos] = t;
-	}
-	prod->row_var = isl_alloc_array(tab1->mat->ctx, int,
-					tab1->mat->n_row + tab2->mat->n_row);
-	if (!prod->row_var)
-		goto error;
-	for (i = 0; i < tab1->n_row; ++i) {
-		int pos = i < r1 ? i : i + r2;
-		prod->row_var[pos] = tab1->row_var[i];
-	}
-	for (i = 0; i < tab2->n_row; ++i) {
-		int pos = i < r2 ? r1 + i : tab1->n_row + i;
-		int t = tab2->row_var[i];
-		if (t >= 0)
-			t += tab1->n_var;
-		else
-			t -= tab1->n_con;
-		prod->row_var[pos] = t;
-	}
-	prod->samples = NULL;
-	prod->sample_index = NULL;
-	prod->n_row = tab1->n_row + tab2->n_row;
-	prod->n_con = tab1->n_con + tab2->n_con;
-	prod->n_eq = 0;
-	prod->max_con = tab1->max_con + tab2->max_con;
-	prod->n_col = tab1->n_col + tab2->n_col;
-	prod->n_var = tab1->n_var + tab2->n_var;
-	prod->max_var = tab1->max_var + tab2->max_var;
-	prod->n_param = 0;
-	prod->n_div = 0;
-	prod->n_dead = tab1->n_dead + tab2->n_dead;
-	prod->n_redundant = tab1->n_redundant + tab2->n_redundant;
-	prod->rational = tab1->rational;
-	prod->empty = tab1->empty || tab2->empty;
-	prod->strict_redundant = tab1->strict_redundant || tab2->strict_redundant;
-	prod->need_undo = 0;
-	prod->in_undo = 0;
-	prod->M = tab1->M;
-	prod->cone = tab1->cone;
-	prod->bottom.type = isl_tab_undo_bottom;
-	prod->bottom.next = NULL;
-	prod->top = &prod->bottom;
-
-	prod->n_zero = 0;
-	prod->n_unbounded = 0;
-	prod->basis = NULL;
-
-	return prod;
-error:
-	isl_tab_free(prod);
-	return NULL;
-}
-
-static struct isl_tab_var *var_from_index(struct isl_tab *tab, int i)
-{
-	if (i >= 0)
-		return &tab->var[i];
-	else
-		return &tab->con[~i];
-}
-
-struct isl_tab_var *isl_tab_var_from_row(struct isl_tab *tab, int i)
-{
-	return var_from_index(tab, tab->row_var[i]);
-}
-
-static struct isl_tab_var *var_from_col(struct isl_tab *tab, int i)
-{
-	return var_from_index(tab, tab->col_var[i]);
-}
-
-/* Check if there are any upper bounds on column variable "var",
- * i.e., non-negative rows where var appears with a negative coefficient.
- * Return 1 if there are no such bounds.
- */
-static int max_is_manifestly_unbounded(struct isl_tab *tab,
-	struct isl_tab_var *var)
-{
-	int i;
-	unsigned off = 2 + tab->M;
-
-	if (var->is_row)
-		return 0;
-	for (i = tab->n_redundant; i < tab->n_row; ++i) {
-		if (!isl_int_is_neg(tab->mat->row[i][off + var->index]))
-			continue;
-		if (isl_tab_var_from_row(tab, i)->is_nonneg)
-			return 0;
-	}
-	return 1;
-}
-
-/* Check if there are any lower bounds on column variable "var",
- * i.e., non-negative rows where var appears with a positive coefficient.
- * Return 1 if there are no such bounds.
- */
-static int min_is_manifestly_unbounded(struct isl_tab *tab,
-	struct isl_tab_var *var)
-{
-	int i;
-	unsigned off = 2 + tab->M;
-
-	if (var->is_row)
-		return 0;
-	for (i = tab->n_redundant; i < tab->n_row; ++i) {
-		if (!isl_int_is_pos(tab->mat->row[i][off + var->index]))
-			continue;
-		if (isl_tab_var_from_row(tab, i)->is_nonneg)
-			return 0;
-	}
-	return 1;
-}
-
-static int row_cmp(struct isl_tab *tab, int r1, int r2, int c, isl_int t)
-{
-	unsigned off = 2 + tab->M;
-
-	if (tab->M) {
-		int s;
-		isl_int_mul(t, tab->mat->row[r1][2], tab->mat->row[r2][off+c]);
-		isl_int_submul(t, tab->mat->row[r2][2], tab->mat->row[r1][off+c]);
-		s = isl_int_sgn(t);
-		if (s)
-			return s;
-	}
-	isl_int_mul(t, tab->mat->row[r1][1], tab->mat->row[r2][off + c]);
-	isl_int_submul(t, tab->mat->row[r2][1], tab->mat->row[r1][off + c]);
-	return isl_int_sgn(t);
-}
-
-/* Given the index of a column "c", return the index of a row
- * that can be used to pivot the column in, with either an increase
- * (sgn > 0) or a decrease (sgn < 0) of the corresponding variable.
- * If "var" is not NULL, then the row returned will be different from
- * the one associated with "var".
- *
- * Each row in the tableau is of the form
- *
- *	x_r = a_r0 + \sum_i a_ri x_i
- *
- * Only rows with x_r >= 0 and with the sign of a_ri opposite to "sgn"
- * impose any limit on the increase or decrease in the value of x_c
- * and this bound is equal to a_r0 / |a_rc|.  We are therefore looking
- * for the row with the smallest (most stringent) such bound.
- * Note that the common denominator of each row drops out of the fraction.
- * To check if row j has a smaller bound than row r, i.e.,
- * a_j0 / |a_jc| < a_r0 / |a_rc| or a_j0 |a_rc| < a_r0 |a_jc|,
- * we check if -sign(a_jc) (a_j0 a_rc - a_r0 a_jc) < 0,
- * where -sign(a_jc) is equal to "sgn".
- */
-static int pivot_row(struct isl_tab *tab,
-	struct isl_tab_var *var, int sgn, int c)
-{
-	int j, r, tsgn;
-	isl_int t;
-	unsigned off = 2 + tab->M;
-
-	isl_int_init(t);
-	r = -1;
-	for (j = tab->n_redundant; j < tab->n_row; ++j) {
-		if (var && j == var->index)
-			continue;
-		if (!isl_tab_var_from_row(tab, j)->is_nonneg)
-			continue;
-		if (sgn * isl_int_sgn(tab->mat->row[j][off + c]) >= 0)
-			continue;
-		if (r < 0) {
-			r = j;
-			continue;
-		}
-		tsgn = sgn * row_cmp(tab, r, j, c, t);
-		if (tsgn < 0 || (tsgn == 0 &&
-					    tab->row_var[j] < tab->row_var[r]))
-			r = j;
-	}
-	isl_int_clear(t);
-	return r;
-}
-
-/* Find a pivot (row and col) that will increase (sgn > 0) or decrease
- * (sgn < 0) the value of row variable var.
- * If not NULL, then skip_var is a row variable that should be ignored
- * while looking for a pivot row.  It is usually equal to var.
- *
- * As the given row in the tableau is of the form
- *
- *	x_r = a_r0 + \sum_i a_ri x_i
- *
- * we need to find a column such that the sign of a_ri is equal to "sgn"
- * (such that an increase in x_i will have the desired effect) or a
- * column with a variable that may attain negative values.
- * If a_ri is positive, then we need to move x_i in the same direction
- * to obtain the desired effect.  Otherwise, x_i has to move in the
- * opposite direction.
- */
-static void find_pivot(struct isl_tab *tab,
-	struct isl_tab_var *var, struct isl_tab_var *skip_var,
-	int sgn, int *row, int *col)
-{
-	int j, r, c;
-	isl_int *tr;
-
-	*row = *col = -1;
-
-	isl_assert(tab->mat->ctx, var->is_row, return);
-	tr = tab->mat->row[var->index] + 2 + tab->M;
-
-	c = -1;
-	for (j = tab->n_dead; j < tab->n_col; ++j) {
-		if (isl_int_is_zero(tr[j]))
-			continue;
-		if (isl_int_sgn(tr[j]) != sgn &&
-		    var_from_col(tab, j)->is_nonneg)
-			continue;
-		if (c < 0 || tab->col_var[j] < tab->col_var[c])
-			c = j;
-	}
-	if (c < 0)
-		return;
-
-	sgn *= isl_int_sgn(tr[c]);
-	r = pivot_row(tab, skip_var, sgn, c);
-	*row = r < 0 ? var->index : r;
-	*col = c;
-}
-
-/* Return 1 if row "row" represents an obviously redundant inequality.
- * This means
- *	- it represents an inequality or a variable
- *	- that is the sum of a non-negative sample value and a positive
- *	  combination of zero or more non-negative constraints.
- */
-int isl_tab_row_is_redundant(struct isl_tab *tab, int row)
-{
-	int i;
-	unsigned off = 2 + tab->M;
-
-	if (tab->row_var[row] < 0 && !isl_tab_var_from_row(tab, row)->is_nonneg)
-		return 0;
-
-	if (isl_int_is_neg(tab->mat->row[row][1]))
-		return 0;
-	if (tab->strict_redundant && isl_int_is_zero(tab->mat->row[row][1]))
-		return 0;
-	if (tab->M && isl_int_is_neg(tab->mat->row[row][2]))
-		return 0;
-
-	for (i = tab->n_dead; i < tab->n_col; ++i) {
-		if (isl_int_is_zero(tab->mat->row[row][off + i]))
-			continue;
-		if (tab->col_var[i] >= 0)
-			return 0;
-		if (isl_int_is_neg(tab->mat->row[row][off + i]))
-			return 0;
-		if (!var_from_col(tab, i)->is_nonneg)
-			return 0;
-	}
-	return 1;
-}
-
-static void swap_rows(struct isl_tab *tab, int row1, int row2)
-{
-	int t;
-	enum isl_tab_row_sign s;
-
-	t = tab->row_var[row1];
-	tab->row_var[row1] = tab->row_var[row2];
-	tab->row_var[row2] = t;
-	isl_tab_var_from_row(tab, row1)->index = row1;
-	isl_tab_var_from_row(tab, row2)->index = row2;
-	tab->mat = isl_mat_swap_rows(tab->mat, row1, row2);
-
-	if (!tab->row_sign)
-		return;
-	s = tab->row_sign[row1];
-	tab->row_sign[row1] = tab->row_sign[row2];
-	tab->row_sign[row2] = s;
-}
-
-static int push_union(struct isl_tab *tab,
-	enum isl_tab_undo_type type, union isl_tab_undo_val u) WARN_UNUSED;
-static int push_union(struct isl_tab *tab,
-	enum isl_tab_undo_type type, union isl_tab_undo_val u)
-{
-	struct isl_tab_undo *undo;
-
-	if (!tab->need_undo)
-		return 0;
-
-	undo = isl_alloc_type(tab->mat->ctx, struct isl_tab_undo);
-	if (!undo)
-		return -1;
-	undo->type = type;
-	undo->u = u;
-	undo->next = tab->top;
-	tab->top = undo;
-
-	return 0;
-}
-
-int isl_tab_push_var(struct isl_tab *tab,
-	enum isl_tab_undo_type type, struct isl_tab_var *var)
-{
-	union isl_tab_undo_val u;
-	if (var->is_row)
-		u.var_index = tab->row_var[var->index];
-	else
-		u.var_index = tab->col_var[var->index];
-	return push_union(tab, type, u);
-}
-
-int isl_tab_push(struct isl_tab *tab, enum isl_tab_undo_type type)
-{
-	union isl_tab_undo_val u = { 0 };
-	return push_union(tab, type, u);
-}
-
-/* Push a record on the undo stack describing the current basic
- * variables, so that the this state can be restored during rollback.
- */
-int isl_tab_push_basis(struct isl_tab *tab)
-{
-	int i;
-	union isl_tab_undo_val u;
-
-	u.col_var = isl_alloc_array(tab->mat->ctx, int, tab->n_col);
-	if (!u.col_var)
-		return -1;
-	for (i = 0; i < tab->n_col; ++i)
-		u.col_var[i] = tab->col_var[i];
-	return push_union(tab, isl_tab_undo_saved_basis, u);
-}
-
-int isl_tab_push_callback(struct isl_tab *tab, struct isl_tab_callback *callback)
-{
-	union isl_tab_undo_val u;
-	u.callback = callback;
-	return push_union(tab, isl_tab_undo_callback, u);
-}
-
-struct isl_tab *isl_tab_init_samples(struct isl_tab *tab)
-{
-	if (!tab)
-		return NULL;
-
-	tab->n_sample = 0;
-	tab->n_outside = 0;
-	tab->samples = isl_mat_alloc(tab->mat->ctx, 1, 1 + tab->n_var);
-	if (!tab->samples)
-		goto error;
-	tab->sample_index = isl_alloc_array(tab->mat->ctx, int, 1);
-	if (!tab->sample_index)
-		goto error;
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-struct isl_tab *isl_tab_add_sample(struct isl_tab *tab,
-	__isl_take isl_vec *sample)
-{
-	if (!tab || !sample)
-		goto error;
-
-	if (tab->n_sample + 1 > tab->samples->n_row) {
-		int *t = isl_realloc_array(tab->mat->ctx,
-			    tab->sample_index, int, tab->n_sample + 1);
-		if (!t)
-			goto error;
-		tab->sample_index = t;
-	}
-
-	tab->samples = isl_mat_extend(tab->samples,
-				tab->n_sample + 1, tab->samples->n_col);
-	if (!tab->samples)
-		goto error;
-
-	isl_seq_cpy(tab->samples->row[tab->n_sample], sample->el, sample->size);
-	isl_vec_free(sample);
-	tab->sample_index[tab->n_sample] = tab->n_sample;
-	tab->n_sample++;
-
-	return tab;
-error:
-	isl_vec_free(sample);
-	isl_tab_free(tab);
-	return NULL;
-}
-
-struct isl_tab *isl_tab_drop_sample(struct isl_tab *tab, int s)
-{
-	if (s != tab->n_outside) {
-		int t = tab->sample_index[tab->n_outside];
-		tab->sample_index[tab->n_outside] = tab->sample_index[s];
-		tab->sample_index[s] = t;
-		isl_mat_swap_rows(tab->samples, tab->n_outside, s);
-	}
-	tab->n_outside++;
-	if (isl_tab_push(tab, isl_tab_undo_drop_sample) < 0) {
-		isl_tab_free(tab);
-		return NULL;
-	}
-
-	return tab;
-}
-
-/* Record the current number of samples so that we can remove newer
- * samples during a rollback.
- */
-int isl_tab_save_samples(struct isl_tab *tab)
-{
-	union isl_tab_undo_val u;
-
-	if (!tab)
-		return -1;
-
-	u.n = tab->n_sample;
-	return push_union(tab, isl_tab_undo_saved_samples, u);
-}
-
-/* Mark row with index "row" as being redundant.
- * If we may need to undo the operation or if the row represents
- * a variable of the original problem, the row is kept,
- * but no longer considered when looking for a pivot row.
- * Otherwise, the row is simply removed.
- *
- * The row may be interchanged with some other row.  If it
- * is interchanged with a later row, return 1.  Otherwise return 0.
- * If the rows are checked in order in the calling function,
- * then a return value of 1 means that the row with the given
- * row number may now contain a different row that hasn't been checked yet.
- */
-int isl_tab_mark_redundant(struct isl_tab *tab, int row)
-{
-	struct isl_tab_var *var = isl_tab_var_from_row(tab, row);
-	var->is_redundant = 1;
-	isl_assert(tab->mat->ctx, row >= tab->n_redundant, return -1);
-	if (tab->need_undo || tab->row_var[row] >= 0) {
-		if (tab->row_var[row] >= 0 && !var->is_nonneg) {
-			var->is_nonneg = 1;
-			if (isl_tab_push_var(tab, isl_tab_undo_nonneg, var) < 0)
-				return -1;
-		}
-		if (row != tab->n_redundant)
-			swap_rows(tab, row, tab->n_redundant);
-		tab->n_redundant++;
-		return isl_tab_push_var(tab, isl_tab_undo_redundant, var);
-	} else {
-		if (row != tab->n_row - 1)
-			swap_rows(tab, row, tab->n_row - 1);
-		isl_tab_var_from_row(tab, tab->n_row - 1)->index = -1;
-		tab->n_row--;
-		return 1;
-	}
-}
-
-int isl_tab_mark_empty(struct isl_tab *tab)
-{
-	if (!tab)
-		return -1;
-	if (!tab->empty && tab->need_undo)
-		if (isl_tab_push(tab, isl_tab_undo_empty) < 0)
-			return -1;
-	tab->empty = 1;
-	return 0;
-}
-
-int isl_tab_freeze_constraint(struct isl_tab *tab, int con)
-{
-	struct isl_tab_var *var;
-
-	if (!tab)
-		return -1;
-
-	var = &tab->con[con];
-	if (var->frozen)
-		return 0;
-	if (var->index < 0)
-		return 0;
-	var->frozen = 1;
-
-	if (tab->need_undo)
-		return isl_tab_push_var(tab, isl_tab_undo_freeze, var);
-
-	return 0;
-}
-
-/* Update the rows signs after a pivot of "row" and "col", with "row_sgn"
- * the original sign of the pivot element.
- * We only keep track of row signs during PILP solving and in this case
- * we only pivot a row with negative sign (meaning the value is always
- * non-positive) using a positive pivot element.
- *
- * For each row j, the new value of the parametric constant is equal to
- *
- *	a_j0 - a_jc a_r0/a_rc
- *
- * where a_j0 is the original parametric constant, a_rc is the pivot element,
- * a_r0 is the parametric constant of the pivot row and a_jc is the
- * pivot column entry of the row j.
- * Since a_r0 is non-positive and a_rc is positive, the sign of row j
- * remains the same if a_jc has the same sign as the row j or if
- * a_jc is zero.  In all other cases, we reset the sign to "unknown".
- */
-static void update_row_sign(struct isl_tab *tab, int row, int col, int row_sgn)
-{
-	int i;
-	struct isl_mat *mat = tab->mat;
-	unsigned off = 2 + tab->M;
-
-	if (!tab->row_sign)
-		return;
-
-	if (tab->row_sign[row] == 0)
-		return;
-	isl_assert(mat->ctx, row_sgn > 0, return);
-	isl_assert(mat->ctx, tab->row_sign[row] == isl_tab_row_neg, return);
-	tab->row_sign[row] = isl_tab_row_pos;
-	for (i = 0; i < tab->n_row; ++i) {
-		int s;
-		if (i == row)
-			continue;
-		s = isl_int_sgn(mat->row[i][off + col]);
-		if (!s)
-			continue;
-		if (!tab->row_sign[i])
-			continue;
-		if (s < 0 && tab->row_sign[i] == isl_tab_row_neg)
-			continue;
-		if (s > 0 && tab->row_sign[i] == isl_tab_row_pos)
-			continue;
-		tab->row_sign[i] = isl_tab_row_unknown;
-	}
-}
-
-/* Given a row number "row" and a column number "col", pivot the tableau
- * such that the associated variables are interchanged.
- * The given row in the tableau expresses
- *
- *	x_r = a_r0 + \sum_i a_ri x_i
- *
- * or
- *
- *	x_c = 1/a_rc x_r - a_r0/a_rc + sum_{i \ne r} -a_ri/a_rc
- *
- * Substituting this equality into the other rows
- *
- *	x_j = a_j0 + \sum_i a_ji x_i
- *
- * with a_jc \ne 0, we obtain
- *
- *	x_j = a_jc/a_rc x_r + a_j0 - a_jc a_r0/a_rc + sum a_ji - a_jc a_ri/a_rc 
- *
- * The tableau
- *
- *	n_rc/d_r		n_ri/d_r
- *	n_jc/d_j		n_ji/d_j
- *
- * where i is any other column and j is any other row,
- * is therefore transformed into
- *
- * s(n_rc)d_r/|n_rc|		-s(n_rc)n_ri/|n_rc|
- * s(n_rc)d_r n_jc/(|n_rc| d_j)	(n_ji |n_rc| - s(n_rc)n_jc n_ri)/(|n_rc| d_j)
- *
- * The transformation is performed along the following steps
- *
- *	d_r/n_rc		n_ri/n_rc
- *	n_jc/d_j		n_ji/d_j
- *
- *	s(n_rc)d_r/|n_rc|	-s(n_rc)n_ri/|n_rc|
- *	n_jc/d_j		n_ji/d_j
- *
- *	s(n_rc)d_r/|n_rc|	-s(n_rc)n_ri/|n_rc|
- *	n_jc/(|n_rc| d_j)	n_ji/(|n_rc| d_j)
- *
- *	s(n_rc)d_r/|n_rc|	-s(n_rc)n_ri/|n_rc|
- *	n_jc/(|n_rc| d_j)	(n_ji |n_rc|)/(|n_rc| d_j)
- *
- *	s(n_rc)d_r/|n_rc|	-s(n_rc)n_ri/|n_rc|
- *	n_jc/(|n_rc| d_j)	(n_ji |n_rc| - s(n_rc)n_jc n_ri)/(|n_rc| d_j)
- *
- * s(n_rc)d_r/|n_rc|		-s(n_rc)n_ri/|n_rc|
- * s(n_rc)d_r n_jc/(|n_rc| d_j)	(n_ji |n_rc| - s(n_rc)n_jc n_ri)/(|n_rc| d_j)
- *
- */
-int isl_tab_pivot(struct isl_tab *tab, int row, int col)
-{
-	int i, j;
-	int sgn;
-	int t;
-	struct isl_mat *mat = tab->mat;
-	struct isl_tab_var *var;
-	unsigned off = 2 + tab->M;
-
-	if (tab->mat->ctx->abort) {
-		isl_ctx_set_error(tab->mat->ctx, isl_error_abort);
-		return -1;
-	}
-
-	isl_int_swap(mat->row[row][0], mat->row[row][off + col]);
-	sgn = isl_int_sgn(mat->row[row][0]);
-	if (sgn < 0) {
-		isl_int_neg(mat->row[row][0], mat->row[row][0]);
-		isl_int_neg(mat->row[row][off + col], mat->row[row][off + col]);
-	} else
-		for (j = 0; j < off - 1 + tab->n_col; ++j) {
-			if (j == off - 1 + col)
-				continue;
-			isl_int_neg(mat->row[row][1 + j], mat->row[row][1 + j]);
-		}
-	if (!isl_int_is_one(mat->row[row][0]))
-		isl_seq_normalize(mat->ctx, mat->row[row], off + tab->n_col);
-	for (i = 0; i < tab->n_row; ++i) {
-		if (i == row)
-			continue;
-		if (isl_int_is_zero(mat->row[i][off + col]))
-			continue;
-		isl_int_mul(mat->row[i][0], mat->row[i][0], mat->row[row][0]);
-		for (j = 0; j < off - 1 + tab->n_col; ++j) {
-			if (j == off - 1 + col)
-				continue;
-			isl_int_mul(mat->row[i][1 + j],
-				    mat->row[i][1 + j], mat->row[row][0]);
-			isl_int_addmul(mat->row[i][1 + j],
-				    mat->row[i][off + col], mat->row[row][1 + j]);
-		}
-		isl_int_mul(mat->row[i][off + col],
-			    mat->row[i][off + col], mat->row[row][off + col]);
-		if (!isl_int_is_one(mat->row[i][0]))
-			isl_seq_normalize(mat->ctx, mat->row[i], off + tab->n_col);
-	}
-	t = tab->row_var[row];
-	tab->row_var[row] = tab->col_var[col];
-	tab->col_var[col] = t;
-	var = isl_tab_var_from_row(tab, row);
-	var->is_row = 1;
-	var->index = row;
-	var = var_from_col(tab, col);
-	var->is_row = 0;
-	var->index = col;
-	update_row_sign(tab, row, col, sgn);
-	if (tab->in_undo)
-		return 0;
-	for (i = tab->n_redundant; i < tab->n_row; ++i) {
-		if (isl_int_is_zero(mat->row[i][off + col]))
-			continue;
-		if (!isl_tab_var_from_row(tab, i)->frozen &&
-		    isl_tab_row_is_redundant(tab, i)) {
-			int redo = isl_tab_mark_redundant(tab, i);
-			if (redo < 0)
-				return -1;
-			if (redo)
-				--i;
-		}
-	}
-	return 0;
-}
-
-/* If "var" represents a column variable, then pivot is up (sgn > 0)
- * or down (sgn < 0) to a row.  The variable is assumed not to be
- * unbounded in the specified direction.
- * If sgn = 0, then the variable is unbounded in both directions,
- * and we pivot with any row we can find.
- */
-static int to_row(struct isl_tab *tab, struct isl_tab_var *var, int sign) WARN_UNUSED;
-static int to_row(struct isl_tab *tab, struct isl_tab_var *var, int sign)
-{
-	int r;
-	unsigned off = 2 + tab->M;
-
-	if (var->is_row)
-		return 0;
-
-	if (sign == 0) {
-		for (r = tab->n_redundant; r < tab->n_row; ++r)
-			if (!isl_int_is_zero(tab->mat->row[r][off+var->index]))
-				break;
-		isl_assert(tab->mat->ctx, r < tab->n_row, return -1);
-	} else {
-		r = pivot_row(tab, NULL, sign, var->index);
-		isl_assert(tab->mat->ctx, r >= 0, return -1);
-	}
-
-	return isl_tab_pivot(tab, r, var->index);
-}
-
-/* Check whether all variables that are marked as non-negative
- * also have a non-negative sample value.  This function is not
- * called from the current code but is useful during debugging.
- */
-static void check_table(struct isl_tab *tab) __attribute__ ((unused));
-static void check_table(struct isl_tab *tab)
-{
-	int i;
-
-	if (tab->empty)
-		return;
-	for (i = tab->n_redundant; i < tab->n_row; ++i) {
-		struct isl_tab_var *var;
-		var = isl_tab_var_from_row(tab, i);
-		if (!var->is_nonneg)
-			continue;
-		if (tab->M) {
-			isl_assert(tab->mat->ctx,
-				!isl_int_is_neg(tab->mat->row[i][2]), abort());
-			if (isl_int_is_pos(tab->mat->row[i][2]))
-				continue;
-		}
-		isl_assert(tab->mat->ctx, !isl_int_is_neg(tab->mat->row[i][1]),
-				abort());
-	}
-}
-
-/* Return the sign of the maximal value of "var".
- * If the sign is not negative, then on return from this function,
- * the sample value will also be non-negative.
- *
- * If "var" is manifestly unbounded wrt positive values, we are done.
- * Otherwise, we pivot the variable up to a row if needed
- * Then we continue pivoting down until either
- *	- no more down pivots can be performed
- *	- the sample value is positive
- *	- the variable is pivoted into a manifestly unbounded column
- */
-static int sign_of_max(struct isl_tab *tab, struct isl_tab_var *var)
-{
-	int row, col;
-
-	if (max_is_manifestly_unbounded(tab, var))
-		return 1;
-	if (to_row(tab, var, 1) < 0)
-		return -2;
-	while (!isl_int_is_pos(tab->mat->row[var->index][1])) {
-		find_pivot(tab, var, var, 1, &row, &col);
-		if (row == -1)
-			return isl_int_sgn(tab->mat->row[var->index][1]);
-		if (isl_tab_pivot(tab, row, col) < 0)
-			return -2;
-		if (!var->is_row) /* manifestly unbounded */
-			return 1;
-	}
-	return 1;
-}
-
-int isl_tab_sign_of_max(struct isl_tab *tab, int con)
-{
-	struct isl_tab_var *var;
-
-	if (!tab)
-		return -2;
-
-	var = &tab->con[con];
-	isl_assert(tab->mat->ctx, !var->is_redundant, return -2);
-	isl_assert(tab->mat->ctx, !var->is_zero, return -2);
-
-	return sign_of_max(tab, var);
-}
-
-static int row_is_neg(struct isl_tab *tab, int row)
-{
-	if (!tab->M)
-		return isl_int_is_neg(tab->mat->row[row][1]);
-	if (isl_int_is_pos(tab->mat->row[row][2]))
-		return 0;
-	if (isl_int_is_neg(tab->mat->row[row][2]))
-		return 1;
-	return isl_int_is_neg(tab->mat->row[row][1]);
-}
-
-static int row_sgn(struct isl_tab *tab, int row)
-{
-	if (!tab->M)
-		return isl_int_sgn(tab->mat->row[row][1]);
-	if (!isl_int_is_zero(tab->mat->row[row][2]))
-		return isl_int_sgn(tab->mat->row[row][2]);
-	else
-		return isl_int_sgn(tab->mat->row[row][1]);
-}
-
-/* Perform pivots until the row variable "var" has a non-negative
- * sample value or until no more upward pivots can be performed.
- * Return the sign of the sample value after the pivots have been
- * performed.
- */
-static int restore_row(struct isl_tab *tab, struct isl_tab_var *var)
-{
-	int row, col;
-
-	while (row_is_neg(tab, var->index)) {
-		find_pivot(tab, var, var, 1, &row, &col);
-		if (row == -1)
-			break;
-		if (isl_tab_pivot(tab, row, col) < 0)
-			return -2;
-		if (!var->is_row) /* manifestly unbounded */
-			return 1;
-	}
-	return row_sgn(tab, var->index);
-}
-
-/* Perform pivots until we are sure that the row variable "var"
- * can attain non-negative values.  After return from this
- * function, "var" is still a row variable, but its sample
- * value may not be non-negative, even if the function returns 1.
- */
-static int at_least_zero(struct isl_tab *tab, struct isl_tab_var *var)
-{
-	int row, col;
-
-	while (isl_int_is_neg(tab->mat->row[var->index][1])) {
-		find_pivot(tab, var, var, 1, &row, &col);
-		if (row == -1)
-			break;
-		if (row == var->index) /* manifestly unbounded */
-			return 1;
-		if (isl_tab_pivot(tab, row, col) < 0)
-			return -1;
-	}
-	return !isl_int_is_neg(tab->mat->row[var->index][1]);
-}
-
-/* Return a negative value if "var" can attain negative values.
- * Return a non-negative value otherwise.
- *
- * If "var" is manifestly unbounded wrt negative values, we are done.
- * Otherwise, if var is in a column, we can pivot it down to a row.
- * Then we continue pivoting down until either
- *	- the pivot would result in a manifestly unbounded column
- *	  => we don't perform the pivot, but simply return -1
- *	- no more down pivots can be performed
- *	- the sample value is negative
- * If the sample value becomes negative and the variable is supposed
- * to be nonnegative, then we undo the last pivot.
- * However, if the last pivot has made the pivoting variable
- * obviously redundant, then it may have moved to another row.
- * In that case we look for upward pivots until we reach a non-negative
- * value again.
- */
-static int sign_of_min(struct isl_tab *tab, struct isl_tab_var *var)
-{
-	int row, col;
-	struct isl_tab_var *pivot_var = NULL;
-
-	if (min_is_manifestly_unbounded(tab, var))
-		return -1;
-	if (!var->is_row) {
-		col = var->index;
-		row = pivot_row(tab, NULL, -1, col);
-		pivot_var = var_from_col(tab, col);
-		if (isl_tab_pivot(tab, row, col) < 0)
-			return -2;
-		if (var->is_redundant)
-			return 0;
-		if (isl_int_is_neg(tab->mat->row[var->index][1])) {
-			if (var->is_nonneg) {
-				if (!pivot_var->is_redundant &&
-				    pivot_var->index == row) {
-					if (isl_tab_pivot(tab, row, col) < 0)
-						return -2;
-				} else
-					if (restore_row(tab, var) < -1)
-						return -2;
-			}
-			return -1;
-		}
-	}
-	if (var->is_redundant)
-		return 0;
-	while (!isl_int_is_neg(tab->mat->row[var->index][1])) {
-		find_pivot(tab, var, var, -1, &row, &col);
-		if (row == var->index)
-			return -1;
-		if (row == -1)
-			return isl_int_sgn(tab->mat->row[var->index][1]);
-		pivot_var = var_from_col(tab, col);
-		if (isl_tab_pivot(tab, row, col) < 0)
-			return -2;
-		if (var->is_redundant)
-			return 0;
-	}
-	if (pivot_var && var->is_nonneg) {
-		/* pivot back to non-negative value */
-		if (!pivot_var->is_redundant && pivot_var->index == row) {
-			if (isl_tab_pivot(tab, row, col) < 0)
-				return -2;
-		} else
-			if (restore_row(tab, var) < -1)
-				return -2;
-	}
-	return -1;
-}
-
-static int row_at_most_neg_one(struct isl_tab *tab, int row)
-{
-	if (tab->M) {
-		if (isl_int_is_pos(tab->mat->row[row][2]))
-			return 0;
-		if (isl_int_is_neg(tab->mat->row[row][2]))
-			return 1;
-	}
-	return isl_int_is_neg(tab->mat->row[row][1]) &&
-	       isl_int_abs_ge(tab->mat->row[row][1],
-			      tab->mat->row[row][0]);
-}
-
-/* Return 1 if "var" can attain values <= -1.
- * Return 0 otherwise.
- *
- * The sample value of "var" is assumed to be non-negative when the
- * the function is called.  If 1 is returned then the constraint
- * is not redundant and the sample value is made non-negative again before
- * the function returns.
- */
-int isl_tab_min_at_most_neg_one(struct isl_tab *tab, struct isl_tab_var *var)
-{
-	int row, col;
-	struct isl_tab_var *pivot_var;
-
-	if (min_is_manifestly_unbounded(tab, var))
-		return 1;
-	if (!var->is_row) {
-		col = var->index;
-		row = pivot_row(tab, NULL, -1, col);
-		pivot_var = var_from_col(tab, col);
-		if (isl_tab_pivot(tab, row, col) < 0)
-			return -1;
-		if (var->is_redundant)
-			return 0;
-		if (row_at_most_neg_one(tab, var->index)) {
-			if (var->is_nonneg) {
-				if (!pivot_var->is_redundant &&
-				    pivot_var->index == row) {
-					if (isl_tab_pivot(tab, row, col) < 0)
-						return -1;
-				} else
-					if (restore_row(tab, var) < -1)
-						return -1;
-			}
-			return 1;
-		}
-	}
-	if (var->is_redundant)
-		return 0;
-	do {
-		find_pivot(tab, var, var, -1, &row, &col);
-		if (row == var->index) {
-			if (restore_row(tab, var) < -1)
-				return -1;
-			return 1;
-		}
-		if (row == -1)
-			return 0;
-		pivot_var = var_from_col(tab, col);
-		if (isl_tab_pivot(tab, row, col) < 0)
-			return -1;
-		if (var->is_redundant)
-			return 0;
-	} while (!row_at_most_neg_one(tab, var->index));
-	if (var->is_nonneg) {
-		/* pivot back to non-negative value */
-		if (!pivot_var->is_redundant && pivot_var->index == row)
-			if (isl_tab_pivot(tab, row, col) < 0)
-				return -1;
-		if (restore_row(tab, var) < -1)
-			return -1;
-	}
-	return 1;
-}
-
-/* Return 1 if "var" can attain values >= 1.
- * Return 0 otherwise.
- */
-static int at_least_one(struct isl_tab *tab, struct isl_tab_var *var)
-{
-	int row, col;
-	isl_int *r;
-
-	if (max_is_manifestly_unbounded(tab, var))
-		return 1;
-	if (to_row(tab, var, 1) < 0)
-		return -1;
-	r = tab->mat->row[var->index];
-	while (isl_int_lt(r[1], r[0])) {
-		find_pivot(tab, var, var, 1, &row, &col);
-		if (row == -1)
-			return isl_int_ge(r[1], r[0]);
-		if (row == var->index) /* manifestly unbounded */
-			return 1;
-		if (isl_tab_pivot(tab, row, col) < 0)
-			return -1;
-	}
-	return 1;
-}
-
-static void swap_cols(struct isl_tab *tab, int col1, int col2)
-{
-	int t;
-	unsigned off = 2 + tab->M;
-	t = tab->col_var[col1];
-	tab->col_var[col1] = tab->col_var[col2];
-	tab->col_var[col2] = t;
-	var_from_col(tab, col1)->index = col1;
-	var_from_col(tab, col2)->index = col2;
-	tab->mat = isl_mat_swap_cols(tab->mat, off + col1, off + col2);
-}
-
-/* Mark column with index "col" as representing a zero variable.
- * If we may need to undo the operation the column is kept,
- * but no longer considered.
- * Otherwise, the column is simply removed.
- *
- * The column may be interchanged with some other column.  If it
- * is interchanged with a later column, return 1.  Otherwise return 0.
- * If the columns are checked in order in the calling function,
- * then a return value of 1 means that the column with the given
- * column number may now contain a different column that
- * hasn't been checked yet.
- */
-int isl_tab_kill_col(struct isl_tab *tab, int col)
-{
-	var_from_col(tab, col)->is_zero = 1;
-	if (tab->need_undo) {
-		if (isl_tab_push_var(tab, isl_tab_undo_zero,
-					    var_from_col(tab, col)) < 0)
-			return -1;
-		if (col != tab->n_dead)
-			swap_cols(tab, col, tab->n_dead);
-		tab->n_dead++;
-		return 0;
-	} else {
-		if (col != tab->n_col - 1)
-			swap_cols(tab, col, tab->n_col - 1);
-		var_from_col(tab, tab->n_col - 1)->index = -1;
-		tab->n_col--;
-		return 1;
-	}
-}
-
-static int row_is_manifestly_non_integral(struct isl_tab *tab, int row)
-{
-	unsigned off = 2 + tab->M;
-
-	if (tab->M && !isl_int_eq(tab->mat->row[row][2],
-				  tab->mat->row[row][0]))
-		return 0;
-	if (isl_seq_first_non_zero(tab->mat->row[row] + off + tab->n_dead,
-				    tab->n_col - tab->n_dead) != -1)
-		return 0;
-
-	return !isl_int_is_divisible_by(tab->mat->row[row][1],
-					tab->mat->row[row][0]);
-}
-
-/* For integer tableaus, check if any of the coordinates are stuck
- * at a non-integral value.
- */
-static int tab_is_manifestly_empty(struct isl_tab *tab)
-{
-	int i;
-
-	if (tab->empty)
-		return 1;
-	if (tab->rational)
-		return 0;
-
-	for (i = 0; i < tab->n_var; ++i) {
-		if (!tab->var[i].is_row)
-			continue;
-		if (row_is_manifestly_non_integral(tab, tab->var[i].index))
-			return 1;
-	}
-
-	return 0;
-}
-
-/* Row variable "var" is non-negative and cannot attain any values
- * larger than zero.  This means that the coefficients of the unrestricted
- * column variables are zero and that the coefficients of the non-negative
- * column variables are zero or negative.
- * Each of the non-negative variables with a negative coefficient can
- * then also be written as the negative sum of non-negative variables
- * and must therefore also be zero.
- */
-static int close_row(struct isl_tab *tab, struct isl_tab_var *var) WARN_UNUSED;
-static int close_row(struct isl_tab *tab, struct isl_tab_var *var)
-{
-	int j;
-	struct isl_mat *mat = tab->mat;
-	unsigned off = 2 + tab->M;
-
-	isl_assert(tab->mat->ctx, var->is_nonneg, return -1);
-	var->is_zero = 1;
-	if (tab->need_undo)
-		if (isl_tab_push_var(tab, isl_tab_undo_zero, var) < 0)
-			return -1;
-	for (j = tab->n_dead; j < tab->n_col; ++j) {
-		int recheck;
-		if (isl_int_is_zero(mat->row[var->index][off + j]))
-			continue;
-		isl_assert(tab->mat->ctx,
-		    isl_int_is_neg(mat->row[var->index][off + j]), return -1);
-		recheck = isl_tab_kill_col(tab, j);
-		if (recheck < 0)
-			return -1;
-		if (recheck)
-			--j;
-	}
-	if (isl_tab_mark_redundant(tab, var->index) < 0)
-		return -1;
-	if (tab_is_manifestly_empty(tab) && isl_tab_mark_empty(tab) < 0)
-		return -1;
-	return 0;
-}
-
-/* Add a constraint to the tableau and allocate a row for it.
- * Return the index into the constraint array "con".
- */
-int isl_tab_allocate_con(struct isl_tab *tab)
-{
-	int r;
-
-	isl_assert(tab->mat->ctx, tab->n_row < tab->mat->n_row, return -1);
-	isl_assert(tab->mat->ctx, tab->n_con < tab->max_con, return -1);
-
-	r = tab->n_con;
-	tab->con[r].index = tab->n_row;
-	tab->con[r].is_row = 1;
-	tab->con[r].is_nonneg = 0;
-	tab->con[r].is_zero = 0;
-	tab->con[r].is_redundant = 0;
-	tab->con[r].frozen = 0;
-	tab->con[r].negated = 0;
-	tab->row_var[tab->n_row] = ~r;
-
-	tab->n_row++;
-	tab->n_con++;
-	if (isl_tab_push_var(tab, isl_tab_undo_allocate, &tab->con[r]) < 0)
-		return -1;
-
-	return r;
-}
-
-/* Add a variable to the tableau and allocate a column for it.
- * Return the index into the variable array "var".
- */
-int isl_tab_allocate_var(struct isl_tab *tab)
-{
-	int r;
-	int i;
-	unsigned off = 2 + tab->M;
-
-	isl_assert(tab->mat->ctx, tab->n_col < tab->mat->n_col, return -1);
-	isl_assert(tab->mat->ctx, tab->n_var < tab->max_var, return -1);
-
-	r = tab->n_var;
-	tab->var[r].index = tab->n_col;
-	tab->var[r].is_row = 0;
-	tab->var[r].is_nonneg = 0;
-	tab->var[r].is_zero = 0;
-	tab->var[r].is_redundant = 0;
-	tab->var[r].frozen = 0;
-	tab->var[r].negated = 0;
-	tab->col_var[tab->n_col] = r;
-
-	for (i = 0; i < tab->n_row; ++i)
-		isl_int_set_si(tab->mat->row[i][off + tab->n_col], 0);
-
-	tab->n_var++;
-	tab->n_col++;
-	if (isl_tab_push_var(tab, isl_tab_undo_allocate, &tab->var[r]) < 0)
-		return -1;
-
-	return r;
-}
-
-/* Add a row to the tableau.  The row is given as an affine combination
- * of the original variables and needs to be expressed in terms of the
- * column variables.
- *
- * We add each term in turn.
- * If r = n/d_r is the current sum and we need to add k x, then
- * 	if x is a column variable, we increase the numerator of
- *		this column by k d_r
- *	if x = f/d_x is a row variable, then the new representation of r is
- *
- *		 n    k f   d_x/g n + d_r/g k f   m/d_r n + m/d_g k f
- *		--- + --- = ------------------- = -------------------
- *		d_r   d_r        d_r d_x/g                m
- *
- *	with g the gcd of d_r and d_x and m the lcm of d_r and d_x.
- *
- * If tab->M is set, then, internally, each variable x is represented
- * as x' - M.  We then also need no subtract k d_r from the coefficient of M.
- */
-int isl_tab_add_row(struct isl_tab *tab, isl_int *line)
-{
-	int i;
-	int r;
-	isl_int *row;
-	isl_int a, b;
-	unsigned off = 2 + tab->M;
-
-	r = isl_tab_allocate_con(tab);
-	if (r < 0)
-		return -1;
-
-	isl_int_init(a);
-	isl_int_init(b);
-	row = tab->mat->row[tab->con[r].index];
-	isl_int_set_si(row[0], 1);
-	isl_int_set(row[1], line[0]);
-	isl_seq_clr(row + 2, tab->M + tab->n_col);
-	for (i = 0; i < tab->n_var; ++i) {
-		if (tab->var[i].is_zero)
-			continue;
-		if (tab->var[i].is_row) {
-			isl_int_lcm(a,
-				row[0], tab->mat->row[tab->var[i].index][0]);
-			isl_int_swap(a, row[0]);
-			isl_int_divexact(a, row[0], a);
-			isl_int_divexact(b,
-				row[0], tab->mat->row[tab->var[i].index][0]);
-			isl_int_mul(b, b, line[1 + i]);
-			isl_seq_combine(row + 1, a, row + 1,
-			    b, tab->mat->row[tab->var[i].index] + 1,
-			    1 + tab->M + tab->n_col);
-		} else
-			isl_int_addmul(row[off + tab->var[i].index],
-							line[1 + i], row[0]);
-		if (tab->M && i >= tab->n_param && i < tab->n_var - tab->n_div)
-			isl_int_submul(row[2], line[1 + i], row[0]);
-	}
-	isl_seq_normalize(tab->mat->ctx, row, off + tab->n_col);
-	isl_int_clear(a);
-	isl_int_clear(b);
-
-	if (tab->row_sign)
-		tab->row_sign[tab->con[r].index] = isl_tab_row_unknown;
-
-	return r;
-}
-
-static int drop_row(struct isl_tab *tab, int row)
-{
-	isl_assert(tab->mat->ctx, ~tab->row_var[row] == tab->n_con - 1, return -1);
-	if (row != tab->n_row - 1)
-		swap_rows(tab, row, tab->n_row - 1);
-	tab->n_row--;
-	tab->n_con--;
-	return 0;
-}
-
-static int drop_col(struct isl_tab *tab, int col)
-{
-	isl_assert(tab->mat->ctx, tab->col_var[col] == tab->n_var - 1, return -1);
-	if (col != tab->n_col - 1)
-		swap_cols(tab, col, tab->n_col - 1);
-	tab->n_col--;
-	tab->n_var--;
-	return 0;
-}
-
-/* Add inequality "ineq" and check if it conflicts with the
- * previously added constraints or if it is obviously redundant.
- */
-int isl_tab_add_ineq(struct isl_tab *tab, isl_int *ineq)
-{
-	int r;
-	int sgn;
-	isl_int cst;
-
-	if (!tab)
-		return -1;
-	if (tab->bmap) {
-		struct isl_basic_map *bmap = tab->bmap;
-
-		isl_assert(tab->mat->ctx, tab->n_eq == bmap->n_eq, return -1);
-		isl_assert(tab->mat->ctx,
-			    tab->n_con == bmap->n_eq + bmap->n_ineq, return -1);
-		tab->bmap = isl_basic_map_add_ineq(tab->bmap, ineq);
-		if (isl_tab_push(tab, isl_tab_undo_bmap_ineq) < 0)
-			return -1;
-		if (!tab->bmap)
-			return -1;
-	}
-	if (tab->cone) {
-		isl_int_init(cst);
-		isl_int_swap(ineq[0], cst);
-	}
-	r = isl_tab_add_row(tab, ineq);
-	if (tab->cone) {
-		isl_int_swap(ineq[0], cst);
-		isl_int_clear(cst);
-	}
-	if (r < 0)
-		return -1;
-	tab->con[r].is_nonneg = 1;
-	if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r]) < 0)
-		return -1;
-	if (isl_tab_row_is_redundant(tab, tab->con[r].index)) {
-		if (isl_tab_mark_redundant(tab, tab->con[r].index) < 0)
-			return -1;
-		return 0;
-	}
-
-	sgn = restore_row(tab, &tab->con[r]);
-	if (sgn < -1)
-		return -1;
-	if (sgn < 0)
-		return isl_tab_mark_empty(tab);
-	if (tab->con[r].is_row && isl_tab_row_is_redundant(tab, tab->con[r].index))
-		if (isl_tab_mark_redundant(tab, tab->con[r].index) < 0)
-			return -1;
-	return 0;
-}
-
-/* Pivot a non-negative variable down until it reaches the value zero
- * and then pivot the variable into a column position.
- */
-static int to_col(struct isl_tab *tab, struct isl_tab_var *var) WARN_UNUSED;
-static int to_col(struct isl_tab *tab, struct isl_tab_var *var)
-{
-	int i;
-	int row, col;
-	unsigned off = 2 + tab->M;
-
-	if (!var->is_row)
-		return 0;
-
-	while (isl_int_is_pos(tab->mat->row[var->index][1])) {
-		find_pivot(tab, var, NULL, -1, &row, &col);
-		isl_assert(tab->mat->ctx, row != -1, return -1);
-		if (isl_tab_pivot(tab, row, col) < 0)
-			return -1;
-		if (!var->is_row)
-			return 0;
-	}
-
-	for (i = tab->n_dead; i < tab->n_col; ++i)
-		if (!isl_int_is_zero(tab->mat->row[var->index][off + i]))
-			break;
-
-	isl_assert(tab->mat->ctx, i < tab->n_col, return -1);
-	if (isl_tab_pivot(tab, var->index, i) < 0)
-		return -1;
-
-	return 0;
-}
-
-/* We assume Gaussian elimination has been performed on the equalities.
- * The equalities can therefore never conflict.
- * Adding the equalities is currently only really useful for a later call
- * to isl_tab_ineq_type.
- */
-static struct isl_tab *add_eq(struct isl_tab *tab, isl_int *eq)
-{
-	int i;
-	int r;
-
-	if (!tab)
-		return NULL;
-	r = isl_tab_add_row(tab, eq);
-	if (r < 0)
-		goto error;
-
-	r = tab->con[r].index;
-	i = isl_seq_first_non_zero(tab->mat->row[r] + 2 + tab->M + tab->n_dead,
-					tab->n_col - tab->n_dead);
-	isl_assert(tab->mat->ctx, i >= 0, goto error);
-	i += tab->n_dead;
-	if (isl_tab_pivot(tab, r, i) < 0)
-		goto error;
-	if (isl_tab_kill_col(tab, i) < 0)
-		goto error;
-	tab->n_eq++;
-
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-static int row_is_manifestly_zero(struct isl_tab *tab, int row)
-{
-	unsigned off = 2 + tab->M;
-
-	if (!isl_int_is_zero(tab->mat->row[row][1]))
-		return 0;
-	if (tab->M && !isl_int_is_zero(tab->mat->row[row][2]))
-		return 0;
-	return isl_seq_first_non_zero(tab->mat->row[row] + off + tab->n_dead,
-					tab->n_col - tab->n_dead) == -1;
-}
-
-/* Add an equality that is known to be valid for the given tableau.
- */
-int isl_tab_add_valid_eq(struct isl_tab *tab, isl_int *eq)
-{
-	struct isl_tab_var *var;
-	int r;
-
-	if (!tab)
-		return -1;
-	r = isl_tab_add_row(tab, eq);
-	if (r < 0)
-		return -1;
-
-	var = &tab->con[r];
-	r = var->index;
-	if (row_is_manifestly_zero(tab, r)) {
-		var->is_zero = 1;
-		if (isl_tab_mark_redundant(tab, r) < 0)
-			return -1;
-		return 0;
-	}
-
-	if (isl_int_is_neg(tab->mat->row[r][1])) {
-		isl_seq_neg(tab->mat->row[r] + 1, tab->mat->row[r] + 1,
-			    1 + tab->n_col);
-		var->negated = 1;
-	}
-	var->is_nonneg = 1;
-	if (to_col(tab, var) < 0)
-		return -1;
-	var->is_nonneg = 0;
-	if (isl_tab_kill_col(tab, var->index) < 0)
-		return -1;
-
-	return 0;
-}
-
-static int add_zero_row(struct isl_tab *tab)
-{
-	int r;
-	isl_int *row;
-
-	r = isl_tab_allocate_con(tab);
-	if (r < 0)
-		return -1;
-
-	row = tab->mat->row[tab->con[r].index];
-	isl_seq_clr(row + 1, 1 + tab->M + tab->n_col);
-	isl_int_set_si(row[0], 1);
-
-	return r;
-}
-
-/* Add equality "eq" and check if it conflicts with the
- * previously added constraints or if it is obviously redundant.
- */
-int isl_tab_add_eq(struct isl_tab *tab, isl_int *eq)
-{
-	struct isl_tab_undo *snap = NULL;
-	struct isl_tab_var *var;
-	int r;
-	int row;
-	int sgn;
-	isl_int cst;
-
-	if (!tab)
-		return -1;
-	isl_assert(tab->mat->ctx, !tab->M, return -1);
-
-	if (tab->need_undo)
-		snap = isl_tab_snap(tab);
-
-	if (tab->cone) {
-		isl_int_init(cst);
-		isl_int_swap(eq[0], cst);
-	}
-	r = isl_tab_add_row(tab, eq);
-	if (tab->cone) {
-		isl_int_swap(eq[0], cst);
-		isl_int_clear(cst);
-	}
-	if (r < 0)
-		return -1;
-
-	var = &tab->con[r];
-	row = var->index;
-	if (row_is_manifestly_zero(tab, row)) {
-		if (snap) {
-			if (isl_tab_rollback(tab, snap) < 0)
-				return -1;
-		} else
-			drop_row(tab, row);
-		return 0;
-	}
-
-	if (tab->bmap) {
-		tab->bmap = isl_basic_map_add_ineq(tab->bmap, eq);
-		if (isl_tab_push(tab, isl_tab_undo_bmap_ineq) < 0)
-			return -1;
-		isl_seq_neg(eq, eq, 1 + tab->n_var);
-		tab->bmap = isl_basic_map_add_ineq(tab->bmap, eq);
-		isl_seq_neg(eq, eq, 1 + tab->n_var);
-		if (isl_tab_push(tab, isl_tab_undo_bmap_ineq) < 0)
-			return -1;
-		if (!tab->bmap)
-			return -1;
-		if (add_zero_row(tab) < 0)
-			return -1;
-	}
-
-	sgn = isl_int_sgn(tab->mat->row[row][1]);
-
-	if (sgn > 0) {
-		isl_seq_neg(tab->mat->row[row] + 1, tab->mat->row[row] + 1,
-			    1 + tab->n_col);
-		var->negated = 1;
-		sgn = -1;
-	}
-
-	if (sgn < 0) {
-		sgn = sign_of_max(tab, var);
-		if (sgn < -1)
-			return -1;
-		if (sgn < 0) {
-			if (isl_tab_mark_empty(tab) < 0)
-				return -1;
-			return 0;
-		}
-	}
-
-	var->is_nonneg = 1;
-	if (to_col(tab, var) < 0)
-		return -1;
-	var->is_nonneg = 0;
-	if (isl_tab_kill_col(tab, var->index) < 0)
-		return -1;
-
-	return 0;
-}
-
-/* Construct and return an inequality that expresses an upper bound
- * on the given div.
- * In particular, if the div is given by
- *
- *	d = floor(e/m)
- *
- * then the inequality expresses
- *
- *	m d <= e
- */
-static struct isl_vec *ineq_for_div(struct isl_basic_map *bmap, unsigned div)
-{
-	unsigned total;
-	unsigned div_pos;
-	struct isl_vec *ineq;
-
-	if (!bmap)
-		return NULL;
-
-	total = isl_basic_map_total_dim(bmap);
-	div_pos = 1 + total - bmap->n_div + div;
-
-	ineq = isl_vec_alloc(bmap->ctx, 1 + total);
-	if (!ineq)
-		return NULL;
-
-	isl_seq_cpy(ineq->el, bmap->div[div] + 1, 1 + total);
-	isl_int_neg(ineq->el[div_pos], bmap->div[div][0]);
-	return ineq;
-}
-
-/* For a div d = floor(f/m), add the constraints
- *
- *		f - m d >= 0
- *		-(f-(m-1)) + m d >= 0
- *
- * Note that the second constraint is the negation of
- *
- *		f - m d >= m
- *
- * If add_ineq is not NULL, then this function is used
- * instead of isl_tab_add_ineq to effectively add the inequalities.
- */
-static int add_div_constraints(struct isl_tab *tab, unsigned div,
-	int (*add_ineq)(void *user, isl_int *), void *user)
-{
-	unsigned total;
-	unsigned div_pos;
-	struct isl_vec *ineq;
-
-	total = isl_basic_map_total_dim(tab->bmap);
-	div_pos = 1 + total - tab->bmap->n_div + div;
-
-	ineq = ineq_for_div(tab->bmap, div);
-	if (!ineq)
-		goto error;
-
-	if (add_ineq) {
-		if (add_ineq(user, ineq->el) < 0)
-			goto error;
-	} else {
-		if (isl_tab_add_ineq(tab, ineq->el) < 0)
-			goto error;
-	}
-
-	isl_seq_neg(ineq->el, tab->bmap->div[div] + 1, 1 + total);
-	isl_int_set(ineq->el[div_pos], tab->bmap->div[div][0]);
-	isl_int_add(ineq->el[0], ineq->el[0], ineq->el[div_pos]);
-	isl_int_sub_ui(ineq->el[0], ineq->el[0], 1);
-
-	if (add_ineq) {
-		if (add_ineq(user, ineq->el) < 0)
-			goto error;
-	} else {
-		if (isl_tab_add_ineq(tab, ineq->el) < 0)
-			goto error;
-	}
-
-	isl_vec_free(ineq);
-
-	return 0;
-error:
-	isl_vec_free(ineq);
-	return -1;
-}
-
-/* Check whether the div described by "div" is obviously non-negative.
- * If we are using a big parameter, then we will encode the div
- * as div' = M + div, which is always non-negative.
- * Otherwise, we check whether div is a non-negative affine combination
- * of non-negative variables.
- */
-static int div_is_nonneg(struct isl_tab *tab, __isl_keep isl_vec *div)
-{
-	int i;
-
-	if (tab->M)
-		return 1;
-
-	if (isl_int_is_neg(div->el[1]))
-		return 0;
-
-	for (i = 0; i < tab->n_var; ++i) {
-		if (isl_int_is_neg(div->el[2 + i]))
-			return 0;
-		if (isl_int_is_zero(div->el[2 + i]))
-			continue;
-		if (!tab->var[i].is_nonneg)
-			return 0;
-	}
-
-	return 1;
-}
-
-/* Add an extra div, prescribed by "div" to the tableau and
- * the associated bmap (which is assumed to be non-NULL).
- *
- * If add_ineq is not NULL, then this function is used instead
- * of isl_tab_add_ineq to add the div constraints.
- * This complication is needed because the code in isl_tab_pip
- * wants to perform some extra processing when an inequality
- * is added to the tableau.
- */
-int isl_tab_add_div(struct isl_tab *tab, __isl_keep isl_vec *div,
-	int (*add_ineq)(void *user, isl_int *), void *user)
-{
-	int r;
-	int k;
-	int nonneg;
-
-	if (!tab || !div)
-		return -1;
-
-	isl_assert(tab->mat->ctx, tab->bmap, return -1);
-
-	nonneg = div_is_nonneg(tab, div);
-
-	if (isl_tab_extend_cons(tab, 3) < 0)
-		return -1;
-	if (isl_tab_extend_vars(tab, 1) < 0)
-		return -1;
-	r = isl_tab_allocate_var(tab);
-	if (r < 0)
-		return -1;
-
-	if (nonneg)
-		tab->var[r].is_nonneg = 1;
-
-	tab->bmap = isl_basic_map_extend_space(tab->bmap,
-		isl_basic_map_get_space(tab->bmap), 1, 0, 2);
-	k = isl_basic_map_alloc_div(tab->bmap);
-	if (k < 0)
-		return -1;
-	isl_seq_cpy(tab->bmap->div[k], div->el, div->size);
-	if (isl_tab_push(tab, isl_tab_undo_bmap_div) < 0)
-		return -1;
-
-	if (add_div_constraints(tab, k, add_ineq, user) < 0)
-		return -1;
-
-	return r;
-}
-
-struct isl_tab *isl_tab_from_basic_map(struct isl_basic_map *bmap)
-{
-	int i;
-	struct isl_tab *tab;
-
-	if (!bmap)
-		return NULL;
-	tab = isl_tab_alloc(bmap->ctx,
-			    isl_basic_map_total_dim(bmap) + bmap->n_ineq + 1,
-			    isl_basic_map_total_dim(bmap), 0);
-	if (!tab)
-		return NULL;
-	tab->rational = ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL);
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY)) {
-		if (isl_tab_mark_empty(tab) < 0)
-			goto error;
-		return tab;
-	}
-	for (i = 0; i < bmap->n_eq; ++i) {
-		tab = add_eq(tab, bmap->eq[i]);
-		if (!tab)
-			return tab;
-	}
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		if (isl_tab_add_ineq(tab, bmap->ineq[i]) < 0)
-			goto error;
-		if (tab->empty)
-			return tab;
-	}
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-struct isl_tab *isl_tab_from_basic_set(struct isl_basic_set *bset)
-{
-	return isl_tab_from_basic_map((struct isl_basic_map *)bset);
-}
-
-/* Construct a tableau corresponding to the recession cone of "bset".
- */
-struct isl_tab *isl_tab_from_recession_cone(__isl_keep isl_basic_set *bset,
-	int parametric)
-{
-	isl_int cst;
-	int i;
-	struct isl_tab *tab;
-	unsigned offset = 0;
-
-	if (!bset)
-		return NULL;
-	if (parametric)
-		offset = isl_basic_set_dim(bset, isl_dim_param);
-	tab = isl_tab_alloc(bset->ctx, bset->n_eq + bset->n_ineq,
-				isl_basic_set_total_dim(bset) - offset, 0);
-	if (!tab)
-		return NULL;
-	tab->rational = ISL_F_ISSET(bset, ISL_BASIC_SET_RATIONAL);
-	tab->cone = 1;
-
-	isl_int_init(cst);
-	for (i = 0; i < bset->n_eq; ++i) {
-		isl_int_swap(bset->eq[i][offset], cst);
-		if (offset > 0) {
-			if (isl_tab_add_eq(tab, bset->eq[i] + offset) < 0)
-				goto error;
-		} else
-			tab = add_eq(tab, bset->eq[i]);
-		isl_int_swap(bset->eq[i][offset], cst);
-		if (!tab)
-			goto done;
-	}
-	for (i = 0; i < bset->n_ineq; ++i) {
-		int r;
-		isl_int_swap(bset->ineq[i][offset], cst);
-		r = isl_tab_add_row(tab, bset->ineq[i] + offset);
-		isl_int_swap(bset->ineq[i][offset], cst);
-		if (r < 0)
-			goto error;
-		tab->con[r].is_nonneg = 1;
-		if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r]) < 0)
-			goto error;
-	}
-done:
-	isl_int_clear(cst);
-	return tab;
-error:
-	isl_int_clear(cst);
-	isl_tab_free(tab);
-	return NULL;
-}
-
-/* Assuming "tab" is the tableau of a cone, check if the cone is
- * bounded, i.e., if it is empty or only contains the origin.
- */
-int isl_tab_cone_is_bounded(struct isl_tab *tab)
-{
-	int i;
-
-	if (!tab)
-		return -1;
-	if (tab->empty)
-		return 1;
-	if (tab->n_dead == tab->n_col)
-		return 1;
-
-	for (;;) {
-		for (i = tab->n_redundant; i < tab->n_row; ++i) {
-			struct isl_tab_var *var;
-			int sgn;
-			var = isl_tab_var_from_row(tab, i);
-			if (!var->is_nonneg)
-				continue;
-			sgn = sign_of_max(tab, var);
-			if (sgn < -1)
-				return -1;
-			if (sgn != 0)
-				return 0;
-			if (close_row(tab, var) < 0)
-				return -1;
-			break;
-		}
-		if (tab->n_dead == tab->n_col)
-			return 1;
-		if (i == tab->n_row)
-			return 0;
-	}
-}
-
-int isl_tab_sample_is_integer(struct isl_tab *tab)
-{
-	int i;
-
-	if (!tab)
-		return -1;
-
-	for (i = 0; i < tab->n_var; ++i) {
-		int row;
-		if (!tab->var[i].is_row)
-			continue;
-		row = tab->var[i].index;
-		if (!isl_int_is_divisible_by(tab->mat->row[row][1],
-						tab->mat->row[row][0]))
-			return 0;
-	}
-	return 1;
-}
-
-static struct isl_vec *extract_integer_sample(struct isl_tab *tab)
-{
-	int i;
-	struct isl_vec *vec;
-
-	vec = isl_vec_alloc(tab->mat->ctx, 1 + tab->n_var);
-	if (!vec)
-		return NULL;
-
-	isl_int_set_si(vec->block.data[0], 1);
-	for (i = 0; i < tab->n_var; ++i) {
-		if (!tab->var[i].is_row)
-			isl_int_set_si(vec->block.data[1 + i], 0);
-		else {
-			int row = tab->var[i].index;
-			isl_int_divexact(vec->block.data[1 + i],
-				tab->mat->row[row][1], tab->mat->row[row][0]);
-		}
-	}
-
-	return vec;
-}
-
-struct isl_vec *isl_tab_get_sample_value(struct isl_tab *tab)
-{
-	int i;
-	struct isl_vec *vec;
-	isl_int m;
-
-	if (!tab)
-		return NULL;
-
-	vec = isl_vec_alloc(tab->mat->ctx, 1 + tab->n_var);
-	if (!vec)
-		return NULL;
-
-	isl_int_init(m);
-
-	isl_int_set_si(vec->block.data[0], 1);
-	for (i = 0; i < tab->n_var; ++i) {
-		int row;
-		if (!tab->var[i].is_row) {
-			isl_int_set_si(vec->block.data[1 + i], 0);
-			continue;
-		}
-		row = tab->var[i].index;
-		isl_int_gcd(m, vec->block.data[0], tab->mat->row[row][0]);
-		isl_int_divexact(m, tab->mat->row[row][0], m);
-		isl_seq_scale(vec->block.data, vec->block.data, m, 1 + i);
-		isl_int_divexact(m, vec->block.data[0], tab->mat->row[row][0]);
-		isl_int_mul(vec->block.data[1 + i], m, tab->mat->row[row][1]);
-	}
-	vec = isl_vec_normalize(vec);
-
-	isl_int_clear(m);
-	return vec;
-}
-
-/* Update "bmap" based on the results of the tableau "tab".
- * In particular, implicit equalities are made explicit, redundant constraints
- * are removed and if the sample value happens to be integer, it is stored
- * in "bmap" (unless "bmap" already had an integer sample).
- *
- * The tableau is assumed to have been created from "bmap" using
- * isl_tab_from_basic_map.
- */
-struct isl_basic_map *isl_basic_map_update_from_tab(struct isl_basic_map *bmap,
-	struct isl_tab *tab)
-{
-	int i;
-	unsigned n_eq;
-
-	if (!bmap)
-		return NULL;
-	if (!tab)
-		return bmap;
-
-	n_eq = tab->n_eq;
-	if (tab->empty)
-		bmap = isl_basic_map_set_to_empty(bmap);
-	else
-		for (i = bmap->n_ineq - 1; i >= 0; --i) {
-			if (isl_tab_is_equality(tab, n_eq + i))
-				isl_basic_map_inequality_to_equality(bmap, i);
-			else if (isl_tab_is_redundant(tab, n_eq + i))
-				isl_basic_map_drop_inequality(bmap, i);
-		}
-	if (bmap->n_eq != n_eq)
-		isl_basic_map_gauss(bmap, NULL);
-	if (!tab->rational &&
-	    !bmap->sample && isl_tab_sample_is_integer(tab))
-		bmap->sample = extract_integer_sample(tab);
-	return bmap;
-}
-
-struct isl_basic_set *isl_basic_set_update_from_tab(struct isl_basic_set *bset,
-	struct isl_tab *tab)
-{
-	return (struct isl_basic_set *)isl_basic_map_update_from_tab(
-		(struct isl_basic_map *)bset, tab);
-}
-
-/* Given a non-negative variable "var", add a new non-negative variable
- * that is the opposite of "var", ensuring that var can only attain the
- * value zero.
- * If var = n/d is a row variable, then the new variable = -n/d.
- * If var is a column variables, then the new variable = -var.
- * If the new variable cannot attain non-negative values, then
- * the resulting tableau is empty.
- * Otherwise, we know the value will be zero and we close the row.
- */
-static int cut_to_hyperplane(struct isl_tab *tab, struct isl_tab_var *var)
-{
-	unsigned r;
-	isl_int *row;
-	int sgn;
-	unsigned off = 2 + tab->M;
-
-	if (var->is_zero)
-		return 0;
-	isl_assert(tab->mat->ctx, !var->is_redundant, return -1);
-	isl_assert(tab->mat->ctx, var->is_nonneg, return -1);
-
-	if (isl_tab_extend_cons(tab, 1) < 0)
-		return -1;
-
-	r = tab->n_con;
-	tab->con[r].index = tab->n_row;
-	tab->con[r].is_row = 1;
-	tab->con[r].is_nonneg = 0;
-	tab->con[r].is_zero = 0;
-	tab->con[r].is_redundant = 0;
-	tab->con[r].frozen = 0;
-	tab->con[r].negated = 0;
-	tab->row_var[tab->n_row] = ~r;
-	row = tab->mat->row[tab->n_row];
-
-	if (var->is_row) {
-		isl_int_set(row[0], tab->mat->row[var->index][0]);
-		isl_seq_neg(row + 1,
-			    tab->mat->row[var->index] + 1, 1 + tab->n_col);
-	} else {
-		isl_int_set_si(row[0], 1);
-		isl_seq_clr(row + 1, 1 + tab->n_col);
-		isl_int_set_si(row[off + var->index], -1);
-	}
-
-	tab->n_row++;
-	tab->n_con++;
-	if (isl_tab_push_var(tab, isl_tab_undo_allocate, &tab->con[r]) < 0)
-		return -1;
-
-	sgn = sign_of_max(tab, &tab->con[r]);
-	if (sgn < -1)
-		return -1;
-	if (sgn < 0) {
-		if (isl_tab_mark_empty(tab) < 0)
-			return -1;
-		return 0;
-	}
-	tab->con[r].is_nonneg = 1;
-	if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r]) < 0)
-		return -1;
-	/* sgn == 0 */
-	if (close_row(tab, &tab->con[r]) < 0)
-		return -1;
-
-	return 0;
-}
-
-/* Given a tableau "tab" and an inequality constraint "con" of the tableau,
- * relax the inequality by one.  That is, the inequality r >= 0 is replaced
- * by r' = r + 1 >= 0.
- * If r is a row variable, we simply increase the constant term by one
- * (taking into account the denominator).
- * If r is a column variable, then we need to modify each row that
- * refers to r = r' - 1 by substituting this equality, effectively
- * subtracting the coefficient of the column from the constant.
- * We should only do this if the minimum is manifestly unbounded,
- * however.  Otherwise, we may end up with negative sample values
- * for non-negative variables.
- * So, if r is a column variable with a minimum that is not
- * manifestly unbounded, then we need to move it to a row.
- * However, the sample value of this row may be negative,
- * even after the relaxation, so we need to restore it.
- * We therefore prefer to pivot a column up to a row, if possible.
- */
-struct isl_tab *isl_tab_relax(struct isl_tab *tab, int con)
-{
-	struct isl_tab_var *var;
-	unsigned off = 2 + tab->M;
-
-	if (!tab)
-		return NULL;
-
-	var = &tab->con[con];
-
-	if (!var->is_row && !max_is_manifestly_unbounded(tab, var))
-		if (to_row(tab, var, 1) < 0)
-			goto error;
-	if (!var->is_row && !min_is_manifestly_unbounded(tab, var))
-		if (to_row(tab, var, -1) < 0)
-			goto error;
-
-	if (var->is_row) {
-		isl_int_add(tab->mat->row[var->index][1],
-		    tab->mat->row[var->index][1], tab->mat->row[var->index][0]);
-		if (restore_row(tab, var) < 0)
-			goto error;
-	} else {
-		int i;
-
-		for (i = 0; i < tab->n_row; ++i) {
-			if (isl_int_is_zero(tab->mat->row[i][off + var->index]))
-				continue;
-			isl_int_sub(tab->mat->row[i][1], tab->mat->row[i][1],
-			    tab->mat->row[i][off + var->index]);
-		}
-
-	}
-
-	if (isl_tab_push_var(tab, isl_tab_undo_relax, var) < 0)
-		goto error;
-
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-int isl_tab_select_facet(struct isl_tab *tab, int con)
-{
-	if (!tab)
-		return -1;
-
-	return cut_to_hyperplane(tab, &tab->con[con]);
-}
-
-static int may_be_equality(struct isl_tab *tab, int row)
-{
-	return tab->rational ? isl_int_is_zero(tab->mat->row[row][1])
-			     : isl_int_lt(tab->mat->row[row][1],
-					    tab->mat->row[row][0]);
-}
-
-/* Check for (near) equalities among the constraints.
- * A constraint is an equality if it is non-negative and if
- * its maximal value is either
- *	- zero (in case of rational tableaus), or
- *	- strictly less than 1 (in case of integer tableaus)
- *
- * We first mark all non-redundant and non-dead variables that
- * are not frozen and not obviously not an equality.
- * Then we iterate over all marked variables if they can attain
- * any values larger than zero or at least one.
- * If the maximal value is zero, we mark any column variables
- * that appear in the row as being zero and mark the row as being redundant.
- * Otherwise, if the maximal value is strictly less than one (and the
- * tableau is integer), then we restrict the value to being zero
- * by adding an opposite non-negative variable.
- */
-int isl_tab_detect_implicit_equalities(struct isl_tab *tab)
-{
-	int i;
-	unsigned n_marked;
-
-	if (!tab)
-		return -1;
-	if (tab->empty)
-		return 0;
-	if (tab->n_dead == tab->n_col)
-		return 0;
-
-	n_marked = 0;
-	for (i = tab->n_redundant; i < tab->n_row; ++i) {
-		struct isl_tab_var *var = isl_tab_var_from_row(tab, i);
-		var->marked = !var->frozen && var->is_nonneg &&
-			may_be_equality(tab, i);
-		if (var->marked)
-			n_marked++;
-	}
-	for (i = tab->n_dead; i < tab->n_col; ++i) {
-		struct isl_tab_var *var = var_from_col(tab, i);
-		var->marked = !var->frozen && var->is_nonneg;
-		if (var->marked)
-			n_marked++;
-	}
-	while (n_marked) {
-		struct isl_tab_var *var;
-		int sgn;
-		for (i = tab->n_redundant; i < tab->n_row; ++i) {
-			var = isl_tab_var_from_row(tab, i);
-			if (var->marked)
-				break;
-		}
-		if (i == tab->n_row) {
-			for (i = tab->n_dead; i < tab->n_col; ++i) {
-				var = var_from_col(tab, i);
-				if (var->marked)
-					break;
-			}
-			if (i == tab->n_col)
-				break;
-		}
-		var->marked = 0;
-		n_marked--;
-		sgn = sign_of_max(tab, var);
-		if (sgn < 0)
-			return -1;
-		if (sgn == 0) {
-			if (close_row(tab, var) < 0)
-				return -1;
-		} else if (!tab->rational && !at_least_one(tab, var)) {
-			if (cut_to_hyperplane(tab, var) < 0)
-				return -1;
-			return isl_tab_detect_implicit_equalities(tab);
-		}
-		for (i = tab->n_redundant; i < tab->n_row; ++i) {
-			var = isl_tab_var_from_row(tab, i);
-			if (!var->marked)
-				continue;
-			if (may_be_equality(tab, i))
-				continue;
-			var->marked = 0;
-			n_marked--;
-		}
-	}
-
-	return 0;
-}
-
-static int con_is_redundant(struct isl_tab *tab, struct isl_tab_var *var)
-{
-	if (!tab)
-		return -1;
-	if (tab->rational) {
-		int sgn = sign_of_min(tab, var);
-		if (sgn < -1)
-			return -1;
-		return sgn >= 0;
-	} else {
-		int irred = isl_tab_min_at_most_neg_one(tab, var);
-		if (irred < 0)
-			return -1;
-		return !irred;
-	}
-}
-
-/* Check for (near) redundant constraints.
- * A constraint is redundant if it is non-negative and if
- * its minimal value (temporarily ignoring the non-negativity) is either
- *	- zero (in case of rational tableaus), or
- *	- strictly larger than -1 (in case of integer tableaus)
- *
- * We first mark all non-redundant and non-dead variables that
- * are not frozen and not obviously negatively unbounded.
- * Then we iterate over all marked variables if they can attain
- * any values smaller than zero or at most negative one.
- * If not, we mark the row as being redundant (assuming it hasn't
- * been detected as being obviously redundant in the mean time).
- */
-int isl_tab_detect_redundant(struct isl_tab *tab)
-{
-	int i;
-	unsigned n_marked;
-
-	if (!tab)
-		return -1;
-	if (tab->empty)
-		return 0;
-	if (tab->n_redundant == tab->n_row)
-		return 0;
-
-	n_marked = 0;
-	for (i = tab->n_redundant; i < tab->n_row; ++i) {
-		struct isl_tab_var *var = isl_tab_var_from_row(tab, i);
-		var->marked = !var->frozen && var->is_nonneg;
-		if (var->marked)
-			n_marked++;
-	}
-	for (i = tab->n_dead; i < tab->n_col; ++i) {
-		struct isl_tab_var *var = var_from_col(tab, i);
-		var->marked = !var->frozen && var->is_nonneg &&
-			!min_is_manifestly_unbounded(tab, var);
-		if (var->marked)
-			n_marked++;
-	}
-	while (n_marked) {
-		struct isl_tab_var *var;
-		int red;
-		for (i = tab->n_redundant; i < tab->n_row; ++i) {
-			var = isl_tab_var_from_row(tab, i);
-			if (var->marked)
-				break;
-		}
-		if (i == tab->n_row) {
-			for (i = tab->n_dead; i < tab->n_col; ++i) {
-				var = var_from_col(tab, i);
-				if (var->marked)
-					break;
-			}
-			if (i == tab->n_col)
-				break;
-		}
-		var->marked = 0;
-		n_marked--;
-		red = con_is_redundant(tab, var);
-		if (red < 0)
-			return -1;
-		if (red && !var->is_redundant)
-			if (isl_tab_mark_redundant(tab, var->index) < 0)
-				return -1;
-		for (i = tab->n_dead; i < tab->n_col; ++i) {
-			var = var_from_col(tab, i);
-			if (!var->marked)
-				continue;
-			if (!min_is_manifestly_unbounded(tab, var))
-				continue;
-			var->marked = 0;
-			n_marked--;
-		}
-	}
-
-	return 0;
-}
-
-int isl_tab_is_equality(struct isl_tab *tab, int con)
-{
-	int row;
-	unsigned off;
-
-	if (!tab)
-		return -1;
-	if (tab->con[con].is_zero)
-		return 1;
-	if (tab->con[con].is_redundant)
-		return 0;
-	if (!tab->con[con].is_row)
-		return tab->con[con].index < tab->n_dead;
-
-	row = tab->con[con].index;
-
-	off = 2 + tab->M;
-	return isl_int_is_zero(tab->mat->row[row][1]) &&
-		(!tab->M || isl_int_is_zero(tab->mat->row[row][2])) &&
-		isl_seq_first_non_zero(tab->mat->row[row] + off + tab->n_dead,
-					tab->n_col - tab->n_dead) == -1;
-}
-
-/* Return the minimal value of the affine expression "f" with denominator
- * "denom" in *opt, *opt_denom, assuming the tableau is not empty and
- * the expression cannot attain arbitrarily small values.
- * If opt_denom is NULL, then *opt is rounded up to the nearest integer.
- * The return value reflects the nature of the result (empty, unbounded,
- * minimal value returned in *opt).
- */
-enum isl_lp_result isl_tab_min(struct isl_tab *tab,
-	isl_int *f, isl_int denom, isl_int *opt, isl_int *opt_denom,
-	unsigned flags)
-{
-	int r;
-	enum isl_lp_result res = isl_lp_ok;
-	struct isl_tab_var *var;
-	struct isl_tab_undo *snap;
-
-	if (!tab)
-		return isl_lp_error;
-
-	if (tab->empty)
-		return isl_lp_empty;
-
-	snap = isl_tab_snap(tab);
-	r = isl_tab_add_row(tab, f);
-	if (r < 0)
-		return isl_lp_error;
-	var = &tab->con[r];
-	for (;;) {
-		int row, col;
-		find_pivot(tab, var, var, -1, &row, &col);
-		if (row == var->index) {
-			res = isl_lp_unbounded;
-			break;
-		}
-		if (row == -1)
-			break;
-		if (isl_tab_pivot(tab, row, col) < 0)
-			return isl_lp_error;
-	}
-	isl_int_mul(tab->mat->row[var->index][0],
-		    tab->mat->row[var->index][0], denom);
-	if (ISL_FL_ISSET(flags, ISL_TAB_SAVE_DUAL)) {
-		int i;
-
-		isl_vec_free(tab->dual);
-		tab->dual = isl_vec_alloc(tab->mat->ctx, 1 + tab->n_con);
-		if (!tab->dual)
-			return isl_lp_error;
-		isl_int_set(tab->dual->el[0], tab->mat->row[var->index][0]);
-		for (i = 0; i < tab->n_con; ++i) {
-			int pos;
-			if (tab->con[i].is_row) {
-				isl_int_set_si(tab->dual->el[1 + i], 0);
-				continue;
-			}
-			pos = 2 + tab->M + tab->con[i].index;
-			if (tab->con[i].negated)
-				isl_int_neg(tab->dual->el[1 + i],
-					    tab->mat->row[var->index][pos]);
-			else
-				isl_int_set(tab->dual->el[1 + i],
-					    tab->mat->row[var->index][pos]);
-		}
-	}
-	if (opt && res == isl_lp_ok) {
-		if (opt_denom) {
-			isl_int_set(*opt, tab->mat->row[var->index][1]);
-			isl_int_set(*opt_denom, tab->mat->row[var->index][0]);
-		} else
-			isl_int_cdiv_q(*opt, tab->mat->row[var->index][1],
-					     tab->mat->row[var->index][0]);
-	}
-	if (isl_tab_rollback(tab, snap) < 0)
-		return isl_lp_error;
-	return res;
-}
-
-int isl_tab_is_redundant(struct isl_tab *tab, int con)
-{
-	if (!tab)
-		return -1;
-	if (tab->con[con].is_zero)
-		return 0;
-	if (tab->con[con].is_redundant)
-		return 1;
-	return tab->con[con].is_row && tab->con[con].index < tab->n_redundant;
-}
-
-/* Take a snapshot of the tableau that can be restored by s call to
- * isl_tab_rollback.
- */
-struct isl_tab_undo *isl_tab_snap(struct isl_tab *tab)
-{
-	if (!tab)
-		return NULL;
-	tab->need_undo = 1;
-	return tab->top;
-}
-
-/* Undo the operation performed by isl_tab_relax.
- */
-static int unrelax(struct isl_tab *tab, struct isl_tab_var *var) WARN_UNUSED;
-static int unrelax(struct isl_tab *tab, struct isl_tab_var *var)
-{
-	unsigned off = 2 + tab->M;
-
-	if (!var->is_row && !max_is_manifestly_unbounded(tab, var))
-		if (to_row(tab, var, 1) < 0)
-			return -1;
-
-	if (var->is_row) {
-		isl_int_sub(tab->mat->row[var->index][1],
-		    tab->mat->row[var->index][1], tab->mat->row[var->index][0]);
-		if (var->is_nonneg) {
-			int sgn = restore_row(tab, var);
-			isl_assert(tab->mat->ctx, sgn >= 0, return -1);
-		}
-	} else {
-		int i;
-
-		for (i = 0; i < tab->n_row; ++i) {
-			if (isl_int_is_zero(tab->mat->row[i][off + var->index]))
-				continue;
-			isl_int_add(tab->mat->row[i][1], tab->mat->row[i][1],
-			    tab->mat->row[i][off + var->index]);
-		}
-
-	}
-
-	return 0;
-}
-
-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)
-{
-	struct isl_tab_var *var = var_from_index(tab, undo->u.var_index);
-	switch (undo->type) {
-	case isl_tab_undo_nonneg:
-		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;
-	case isl_tab_undo_freeze:
-		var->frozen = 0;
-		break;
-	case isl_tab_undo_zero:
-		var->is_zero = 0;
-		if (!var->is_row)
-			tab->n_dead--;
-		break;
-	case isl_tab_undo_allocate:
-		if (undo->u.var_index >= 0) {
-			isl_assert(tab->mat->ctx, !var->is_row, return -1);
-			drop_col(tab, var->index);
-			break;
-		}
-		if (!var->is_row) {
-			if (!max_is_manifestly_unbounded(tab, var)) {
-				if (to_row(tab, var, 1) < 0)
-					return -1;
-			} else if (!min_is_manifestly_unbounded(tab, var)) {
-				if (to_row(tab, var, -1) < 0)
-					return -1;
-			} else
-				if (to_row(tab, var, 0) < 0)
-					return -1;
-		}
-		drop_row(tab, var->index);
-		break;
-	case isl_tab_undo_relax:
-		return unrelax(tab, var);
-	default:
-		isl_die(tab->mat->ctx, isl_error_internal,
-			"perform_undo_var called on invalid undo record",
-			return -1);
-	}
-
-	return 0;
-}
-
-/* Restore the tableau to the state where the basic variables
- * are those in "col_var".
- * We first construct a list of variables that are currently in
- * the basis, but shouldn't.  Then we iterate over all variables
- * that should be in the basis and for each one that is currently
- * not in the basis, we exchange it with one of the elements of the
- * list constructed before.
- * We can always find an appropriate variable to pivot with because
- * the current basis is mapped to the old basis by a non-singular
- * matrix and so we can never end up with a zero row.
- */
-static int restore_basis(struct isl_tab *tab, int *col_var)
-{
-	int i, j;
-	int n_extra = 0;
-	int *extra = NULL;	/* current columns that contain bad stuff */
-	unsigned off = 2 + tab->M;
-
-	extra = isl_alloc_array(tab->mat->ctx, int, tab->n_col);
-	if (!extra)
-		goto error;
-	for (i = 0; i < tab->n_col; ++i) {
-		for (j = 0; j < tab->n_col; ++j)
-			if (tab->col_var[i] == col_var[j])
-				break;
-		if (j < tab->n_col)
-			continue;
-		extra[n_extra++] = i;
-	}
-	for (i = 0; i < tab->n_col && n_extra > 0; ++i) {
-		struct isl_tab_var *var;
-		int row;
-
-		for (j = 0; j < tab->n_col; ++j)
-			if (col_var[i] == tab->col_var[j])
-				break;
-		if (j < tab->n_col)
-			continue;
-		var = var_from_index(tab, col_var[i]);
-		row = var->index;
-		for (j = 0; j < n_extra; ++j)
-			if (!isl_int_is_zero(tab->mat->row[row][off+extra[j]]))
-				break;
-		isl_assert(tab->mat->ctx, j < n_extra, goto error);
-		if (isl_tab_pivot(tab, row, extra[j]) < 0)
-			goto error;
-		extra[j] = extra[--n_extra];
-	}
-
-	free(extra);
-	return 0;
-error:
-	free(extra);
-	return -1;
-}
-
-/* Remove all samples with index n or greater, i.e., those samples
- * that were added since we saved this number of samples in
- * isl_tab_save_samples.
- */
-static void drop_samples_since(struct isl_tab *tab, int n)
-{
-	int i;
-
-	for (i = tab->n_sample - 1; i >= 0 && tab->n_sample > n; --i) {
-		if (tab->sample_index[i] < n)
-			continue;
-
-		if (i != tab->n_sample - 1) {
-			int t = tab->sample_index[tab->n_sample-1];
-			tab->sample_index[tab->n_sample-1] = tab->sample_index[i];
-			tab->sample_index[i] = t;
-			isl_mat_swap_rows(tab->samples, tab->n_sample-1, i);
-		}
-		tab->n_sample--;
-	}
-}
-
-static int perform_undo(struct isl_tab *tab, struct isl_tab_undo *undo) WARN_UNUSED;
-static int perform_undo(struct isl_tab *tab, struct isl_tab_undo *undo)
-{
-	switch (undo->type) {
-	case isl_tab_undo_empty:
-		tab->empty = 0;
-		break;
-	case isl_tab_undo_nonneg:
-	case isl_tab_undo_redundant:
-	case isl_tab_undo_freeze:
-	case isl_tab_undo_zero:
-	case isl_tab_undo_allocate:
-	case isl_tab_undo_relax:
-		return perform_undo_var(tab, undo);
-	case isl_tab_undo_bmap_eq:
-		return isl_basic_map_free_equality(tab->bmap, 1);
-	case isl_tab_undo_bmap_ineq:
-		return isl_basic_map_free_inequality(tab->bmap, 1);
-	case isl_tab_undo_bmap_div:
-		if (isl_basic_map_free_div(tab->bmap, 1) < 0)
-			return -1;
-		if (tab->samples)
-			tab->samples->n_col--;
-		break;
-	case isl_tab_undo_saved_basis:
-		if (restore_basis(tab, undo->u.col_var) < 0)
-			return -1;
-		break;
-	case isl_tab_undo_drop_sample:
-		tab->n_outside--;
-		break;
-	case isl_tab_undo_saved_samples:
-		drop_samples_since(tab, undo->u.n);
-		break;
-	case isl_tab_undo_callback:
-		return undo->u.callback->run(undo->u.callback);
-	default:
-		isl_assert(tab->mat->ctx, 0, return -1);
-	}
-	return 0;
-}
-
-/* Return the tableau to the state it was in when the snapshot "snap"
- * was taken.
- */
-int isl_tab_rollback(struct isl_tab *tab, struct isl_tab_undo *snap)
-{
-	struct isl_tab_undo *undo, *next;
-
-	if (!tab)
-		return -1;
-
-	tab->in_undo = 1;
-	for (undo = tab->top; undo && undo != &tab->bottom; undo = next) {
-		next = undo->next;
-		if (undo == snap)
-			break;
-		if (perform_undo(tab, undo) < 0) {
-			tab->top = undo;
-			free_undo(tab);
-			tab->in_undo = 0;
-			return -1;
-		}
-		free_undo_record(undo);
-	}
-	tab->in_undo = 0;
-	tab->top = undo;
-	if (!undo)
-		return -1;
-	return 0;
-}
-
-/* The given row "row" represents an inequality violated by all
- * points in the tableau.  Check for some special cases of such
- * separating constraints.
- * In particular, if the row has been reduced to the constant -1,
- * then we know the inequality is adjacent (but opposite) to
- * an equality in the tableau.
- * If the row has been reduced to r = c*(-1 -r'), with r' an inequality
- * of the tableau and c a positive constant, then the inequality
- * is adjacent (but opposite) to the inequality r'.
- */
-static enum isl_ineq_type separation_type(struct isl_tab *tab, unsigned row)
-{
-	int pos;
-	unsigned off = 2 + tab->M;
-
-	if (tab->rational)
-		return isl_ineq_separate;
-
-	if (!isl_int_is_one(tab->mat->row[row][0]))
-		return isl_ineq_separate;
-
-	pos = isl_seq_first_non_zero(tab->mat->row[row] + off + tab->n_dead,
-					tab->n_col - tab->n_dead);
-	if (pos == -1) {
-		if (isl_int_is_negone(tab->mat->row[row][1]))
-			return isl_ineq_adj_eq;
-		else
-			return isl_ineq_separate;
-	}
-
-	if (!isl_int_eq(tab->mat->row[row][1],
-			tab->mat->row[row][off + tab->n_dead + pos]))
-		return isl_ineq_separate;
-
-	pos = isl_seq_first_non_zero(
-			tab->mat->row[row] + off + tab->n_dead + pos + 1,
-			tab->n_col - tab->n_dead - pos - 1);
-
-	return pos == -1 ? isl_ineq_adj_ineq : isl_ineq_separate;
-}
-
-/* Check the effect of inequality "ineq" on the tableau "tab".
- * The result may be
- *	isl_ineq_redundant:	satisfied by all points in the tableau
- *	isl_ineq_separate:	satisfied by no point in the tableau
- *	isl_ineq_cut:		satisfied by some by not all points
- *	isl_ineq_adj_eq:	adjacent to an equality
- *	isl_ineq_adj_ineq:	adjacent to an inequality.
- */
-enum isl_ineq_type isl_tab_ineq_type(struct isl_tab *tab, isl_int *ineq)
-{
-	enum isl_ineq_type type = isl_ineq_error;
-	struct isl_tab_undo *snap = NULL;
-	int con;
-	int row;
-
-	if (!tab)
-		return isl_ineq_error;
-
-	if (isl_tab_extend_cons(tab, 1) < 0)
-		return isl_ineq_error;
-
-	snap = isl_tab_snap(tab);
-
-	con = isl_tab_add_row(tab, ineq);
-	if (con < 0)
-		goto error;
-
-	row = tab->con[con].index;
-	if (isl_tab_row_is_redundant(tab, row))
-		type = isl_ineq_redundant;
-	else if (isl_int_is_neg(tab->mat->row[row][1]) &&
-		 (tab->rational ||
-		    isl_int_abs_ge(tab->mat->row[row][1],
-				   tab->mat->row[row][0]))) {
-		int nonneg = at_least_zero(tab, &tab->con[con]);
-		if (nonneg < 0)
-			goto error;
-		if (nonneg)
-			type = isl_ineq_cut;
-		else
-			type = separation_type(tab, row);
-	} else {
-		int red = con_is_redundant(tab, &tab->con[con]);
-		if (red < 0)
-			goto error;
-		if (!red)
-			type = isl_ineq_cut;
-		else
-			type = isl_ineq_redundant;
-	}
-
-	if (isl_tab_rollback(tab, snap))
-		return isl_ineq_error;
-	return type;
-error:
-	return isl_ineq_error;
-}
-
-int isl_tab_track_bmap(struct isl_tab *tab, __isl_take isl_basic_map *bmap)
-{
-	if (!tab || !bmap)
-		goto error;
-
-	isl_assert(tab->mat->ctx, tab->n_eq == bmap->n_eq, return -1);
-	isl_assert(tab->mat->ctx,
-		    tab->n_con == bmap->n_eq + bmap->n_ineq, return -1);
-
-	tab->bmap = bmap;
-
-	return 0;
-error:
-	isl_basic_map_free(bmap);
-	return -1;
-}
-
-int isl_tab_track_bset(struct isl_tab *tab, __isl_take isl_basic_set *bset)
-{
-	return isl_tab_track_bmap(tab, (isl_basic_map *)bset);
-}
-
-__isl_keep isl_basic_set *isl_tab_peek_bset(struct isl_tab *tab)
-{
-	if (!tab)
-		return NULL;
-
-	return (isl_basic_set *)tab->bmap;
-}
-
-static void isl_tab_print_internal(__isl_keep struct isl_tab *tab,
-	FILE *out, int indent)
-{
-	unsigned r, c;
-	int i;
-
-	if (!tab) {
-		fprintf(out, "%*snull tab\n", indent, "");
-		return;
-	}
-	fprintf(out, "%*sn_redundant: %d, n_dead: %d", indent, "",
-		tab->n_redundant, tab->n_dead);
-	if (tab->rational)
-		fprintf(out, ", rational");
-	if (tab->empty)
-		fprintf(out, ", empty");
-	fprintf(out, "\n");
-	fprintf(out, "%*s[", indent, "");
-	for (i = 0; i < tab->n_var; ++i) {
-		if (i)
-			fprintf(out, (i == tab->n_param ||
-				      i == tab->n_var - tab->n_div) ? "; "
-								    : ", ");
-		fprintf(out, "%c%d%s", tab->var[i].is_row ? 'r' : 'c',
-					tab->var[i].index,
-					tab->var[i].is_zero ? " [=0]" :
-					tab->var[i].is_redundant ? " [R]" : "");
-	}
-	fprintf(out, "]\n");
-	fprintf(out, "%*s[", indent, "");
-	for (i = 0; i < tab->n_con; ++i) {
-		if (i)
-			fprintf(out, ", ");
-		fprintf(out, "%c%d%s", tab->con[i].is_row ? 'r' : 'c',
-					tab->con[i].index,
-					tab->con[i].is_zero ? " [=0]" :
-					tab->con[i].is_redundant ? " [R]" : "");
-	}
-	fprintf(out, "]\n");
-	fprintf(out, "%*s[", indent, "");
-	for (i = 0; i < tab->n_row; ++i) {
-		const char *sign = "";
-		if (i)
-			fprintf(out, ", ");
-		if (tab->row_sign) {
-			if (tab->row_sign[i] == isl_tab_row_unknown)
-				sign = "?";
-			else if (tab->row_sign[i] == isl_tab_row_neg)
-				sign = "-";
-			else if (tab->row_sign[i] == isl_tab_row_pos)
-				sign = "+";
-			else
-				sign = "+-";
-		}
-		fprintf(out, "r%d: %d%s%s", i, tab->row_var[i],
-		    isl_tab_var_from_row(tab, i)->is_nonneg ? " [>=0]" : "", sign);
-	}
-	fprintf(out, "]\n");
-	fprintf(out, "%*s[", indent, "");
-	for (i = 0; i < tab->n_col; ++i) {
-		if (i)
-			fprintf(out, ", ");
-		fprintf(out, "c%d: %d%s", i, tab->col_var[i],
-		    var_from_col(tab, i)->is_nonneg ? " [>=0]" : "");
-	}
-	fprintf(out, "]\n");
-	r = tab->mat->n_row;
-	tab->mat->n_row = tab->n_row;
-	c = tab->mat->n_col;
-	tab->mat->n_col = 2 + tab->M + tab->n_col;
-	isl_mat_print_internal(tab->mat, out, indent);
-	tab->mat->n_row = r;
-	tab->mat->n_col = c;
-	if (tab->bmap)
-		isl_basic_map_print_internal(tab->bmap, out, indent);
-}
-
-void isl_tab_dump(__isl_keep struct isl_tab *tab)
-{
-	isl_tab_print_internal(tab, stderr, 0);
-}
diff --git a/cloog-0.17.0/isl/isl_tab.h b/cloog-0.17.0/isl/isl_tab.h
deleted file mode 100644
index 3f68d85..0000000
--- a/cloog-0.17.0/isl/isl_tab.h
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#ifndef ISL_TAB_H
-#define ISL_TAB_H
-
-#include <isl/lp.h>
-#include <isl/map.h>
-#include <isl/mat.h>
-#include <isl/set.h>
-
-struct isl_tab_var {
-	int index;
-	unsigned is_row : 1;
-	unsigned is_nonneg : 1;
-	unsigned is_zero : 1;
-	unsigned is_redundant : 1;
-	unsigned marked : 1;
-	unsigned frozen : 1;
-	unsigned negated : 1;
-};
-
-enum isl_tab_undo_type {
-	isl_tab_undo_bottom,
-	isl_tab_undo_empty,
-	isl_tab_undo_nonneg,
-	isl_tab_undo_redundant,
-	isl_tab_undo_freeze,
-	isl_tab_undo_zero,
-	isl_tab_undo_allocate,
-	isl_tab_undo_relax,
-	isl_tab_undo_bmap_ineq,
-	isl_tab_undo_bmap_eq,
-	isl_tab_undo_bmap_div,
-	isl_tab_undo_saved_basis,
-	isl_tab_undo_drop_sample,
-	isl_tab_undo_saved_samples,
-	isl_tab_undo_callback,
-};
-
-struct isl_tab_callback {
-	int (*run)(struct isl_tab_callback *cb);
-};
-
-union isl_tab_undo_val {
-	int		var_index;
-	int		*col_var;
-	int		n;
-	struct isl_tab_callback	*callback;
-};
-
-struct isl_tab_undo {
-	enum isl_tab_undo_type	type;
-	union isl_tab_undo_val	u;
-	struct isl_tab_undo	*next;
-};
-
-/* The tableau maintains equality relations.
- * Each column and each row is associated to a variable or a constraint.
- * The "value" of an inequality constraint is the value of the corresponding
- * slack variable.
- * The "row_var" and "col_var" arrays map column and row indices
- * to indices in the "var" and "con" arrays.  The elements of these
- * arrays maintain extra information about the variables and the constraints.
- * Each row expresses the corresponding row variable as an affine expression
- * of the column variables.
- * The first two columns in the matrix contain the common denominator of
- * the row and the numerator of the constant term.
- * If "M" is set, then the third column represents the "big parameter".
- * The third (M = 0) or fourth (M = 1) column
- * in the matrix is called column 0 with respect to the col_var array.
- * The sample value of the tableau is the value that assigns zero
- * to all the column variables and the constant term of each affine
- * expression to the corresponding row variable.
- * The operations on the tableau maintain the property that the sample
- * value satisfies the non-negativity constraints (usually on the slack
- * variables).
- *
- * The big parameter represents an arbitrarily big (and divisible)
- * positive number.  If present, then the sign of a row is determined
- * lexicographically, with the sign of the big parameter coefficient
- * considered first.  The big parameter is only used while
- * solving PILP problems.
- *
- * The first n_dead column variables have their values fixed to zero.
- * The corresponding tab_vars are flagged "is_zero".
- * Some of the rows that have have zero coefficients in all but
- * the dead columns are also flagged "is_zero".
- *
- * The first n_redundant rows correspond to inequality constraints
- * that are always satisfied for any value satisfying the non-redundant
- * rows.  The corresponding tab_vars are flagged "is_redundant".
- * A row variable that is flagged "is_zero" is also flagged "is_redundant"
- * since the constraint has been reduced to 0 = 0 and is therefore always
- * satisfied.
- *
- * There are "n_var" variables in total.  The first "n_param" of these
- * are called parameters and the last "n_div" of these are called divs.
- * The basic tableau operations makes no distinction between different
- * kinds of variables.  These special variables are only used while
- * solving PILP problems.
- *
- * Dead columns and redundant rows are detected on the fly.
- * However, the basic operations do not ensure that all dead columns
- * or all redundant rows are detected.
- * isl_tab_detect_implicit_equalities and isl_tab_detect_redundant can be used
- * to perform and exhaustive search for dead columns and redundant rows.
- *
- * The samples matrix contains "n_sample" integer points that have at some
- * point been elements satisfying the tableau.  The first "n_outside"
- * of them no longer satisfy the tableau.  They are kept because they
- * can be reinstated during rollback when the constraint that cut them
- * out is removed.  These samples are only maintained for the context
- * tableau while solving PILP problems.
- */
-enum isl_tab_row_sign {
-	isl_tab_row_unknown = 0,
-	isl_tab_row_pos,
-	isl_tab_row_neg,
-	isl_tab_row_any,
-};
-struct isl_tab {
-	struct isl_mat *mat;
-
-	unsigned n_row;
-	unsigned n_col;
-	unsigned n_dead;
-	unsigned n_redundant;
-
-	unsigned n_var;
-	unsigned n_param;
-	unsigned n_div;
-	unsigned max_var;
-	unsigned n_con;
-	unsigned n_eq;
-	unsigned max_con;
-	struct isl_tab_var *var;
-	struct isl_tab_var *con;
-	int *row_var;	/* v >= 0 -> var v;	v < 0 -> con ~v */
-	int *col_var;	/* v >= 0 -> var v;	v < 0 -> con ~v */
-	enum isl_tab_row_sign *row_sign;
-
-	struct isl_tab_undo bottom;
-	struct isl_tab_undo *top;
-
-	struct isl_vec *dual;
-	struct isl_basic_map *bmap;
-
-	unsigned n_sample;
-	unsigned n_outside;
-	int *sample_index;
-	struct isl_mat *samples;
-
-	int n_zero;
-	int n_unbounded;
-	struct isl_mat *basis;
-
-	int (*conflict)(int con, void *user);
-	void *conflict_user;
-
-	unsigned strict_redundant : 1;
-	unsigned need_undo : 1;
-	unsigned rational : 1;
-	unsigned empty : 1;
-	unsigned in_undo : 1;
-	unsigned M : 1;
-	unsigned cone : 1;
-};
-
-struct isl_tab *isl_tab_alloc(struct isl_ctx *ctx,
-	unsigned n_row, unsigned n_var, unsigned M);
-void isl_tab_free(struct isl_tab *tab);
-
-struct isl_tab *isl_tab_from_basic_map(struct isl_basic_map *bmap);
-struct isl_tab *isl_tab_from_basic_set(struct isl_basic_set *bset);
-struct isl_tab *isl_tab_from_recession_cone(struct isl_basic_set *bset,
-	int parametric);
-int isl_tab_cone_is_bounded(struct isl_tab *tab);
-struct isl_basic_map *isl_basic_map_update_from_tab(struct isl_basic_map *bmap,
-	struct isl_tab *tab);
-struct isl_basic_set *isl_basic_set_update_from_tab(struct isl_basic_set *bset,
-	struct isl_tab *tab);
-int isl_tab_detect_implicit_equalities(struct isl_tab *tab) WARN_UNUSED;
-int isl_tab_detect_redundant(struct isl_tab *tab) WARN_UNUSED;
-#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,
-	unsigned flags) WARN_UNUSED;
-
-struct isl_tab *isl_tab_extend(struct isl_tab *tab, unsigned n_new) WARN_UNUSED;
-int isl_tab_add_ineq(struct isl_tab *tab, isl_int *ineq) WARN_UNUSED;
-int isl_tab_add_eq(struct isl_tab *tab, isl_int *eq) WARN_UNUSED;
-int isl_tab_add_valid_eq(struct isl_tab *tab, isl_int *eq) WARN_UNUSED;
-
-int isl_tab_freeze_constraint(struct isl_tab *tab, int con) WARN_UNUSED;
-
-int isl_tab_track_bmap(struct isl_tab *tab, __isl_take isl_basic_map *bmap) WARN_UNUSED;
-int isl_tab_track_bset(struct isl_tab *tab, __isl_take isl_basic_set *bset) WARN_UNUSED;
-__isl_keep isl_basic_set *isl_tab_peek_bset(struct isl_tab *tab);
-
-int isl_tab_is_equality(struct isl_tab *tab, int con);
-int isl_tab_is_redundant(struct isl_tab *tab, int con);
-
-int isl_tab_sample_is_integer(struct isl_tab *tab);
-struct isl_vec *isl_tab_get_sample_value(struct isl_tab *tab);
-
-enum isl_ineq_type {
-	isl_ineq_error = -1,
-	isl_ineq_redundant,
-	isl_ineq_separate,
-	isl_ineq_cut,
-	isl_ineq_adj_eq,
-	isl_ineq_adj_ineq,
-};
-
-enum isl_ineq_type isl_tab_ineq_type(struct isl_tab *tab, isl_int *ineq);
-
-struct isl_tab_undo *isl_tab_snap(struct isl_tab *tab);
-int isl_tab_rollback(struct isl_tab *tab, struct isl_tab_undo *snap) WARN_UNUSED;
-
-struct isl_tab *isl_tab_relax(struct isl_tab *tab, int con) WARN_UNUSED;
-int isl_tab_select_facet(struct isl_tab *tab, int con) WARN_UNUSED;
-
-void isl_tab_dump(__isl_keep struct isl_tab *tab);
-
-struct isl_map *isl_tab_basic_map_partial_lexopt(
-		struct isl_basic_map *bmap, struct isl_basic_set *dom,
-		struct isl_set **empty, int max);
-__isl_give isl_pw_multi_aff *isl_basic_map_partial_lexopt_pw_multi_aff(
-	__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty, int max);
-
-/* An isl_region represents a sequence of consecutive variables.
- * pos is the location (starting at 0) of the first variable in the sequence.
- */
-struct isl_region {
-	int pos;
-	int len;
-};
-
-__isl_give isl_vec *isl_tab_basic_set_non_trivial_lexmin(
-	__isl_take isl_basic_set *bset, int n_op, int n_region,
-	struct isl_region *region,
-	int (*conflict)(int con, void *user), void *user);
-__isl_give isl_vec *isl_tab_basic_set_non_neg_lexmin(
-	__isl_take isl_basic_set *bset);
-
-/* private */
-
-struct isl_tab_var *isl_tab_var_from_row(struct isl_tab *tab, int i);
-int isl_tab_mark_redundant(struct isl_tab *tab, int row) WARN_UNUSED;
-int isl_tab_mark_empty(struct isl_tab *tab) WARN_UNUSED;
-struct isl_tab *isl_tab_dup(struct isl_tab *tab);
-struct isl_tab *isl_tab_product(struct isl_tab *tab1, struct isl_tab *tab2);
-int isl_tab_extend_cons(struct isl_tab *tab, unsigned n_new) WARN_UNUSED;
-int isl_tab_allocate_con(struct isl_tab *tab) WARN_UNUSED;
-int isl_tab_extend_vars(struct isl_tab *tab, unsigned n_new) WARN_UNUSED;
-int isl_tab_allocate_var(struct isl_tab *tab) WARN_UNUSED;
-int isl_tab_pivot(struct isl_tab *tab, int row, int col) WARN_UNUSED;
-int isl_tab_add_row(struct isl_tab *tab, isl_int *line) WARN_UNUSED;
-int isl_tab_row_is_redundant(struct isl_tab *tab, int row);
-int isl_tab_min_at_most_neg_one(struct isl_tab *tab, struct isl_tab_var *var);
-int isl_tab_sign_of_max(struct isl_tab *tab, int con);
-int isl_tab_kill_col(struct isl_tab *tab, int col) WARN_UNUSED;
-
-int isl_tab_push(struct isl_tab *tab, enum isl_tab_undo_type type) WARN_UNUSED;
-int isl_tab_push_var(struct isl_tab *tab,
-	enum isl_tab_undo_type type, struct isl_tab_var *var) WARN_UNUSED;
-int isl_tab_push_basis(struct isl_tab *tab) WARN_UNUSED;
-
-struct isl_tab *isl_tab_init_samples(struct isl_tab *tab) WARN_UNUSED;
-struct isl_tab *isl_tab_add_sample(struct isl_tab *tab,
-	__isl_take isl_vec *sample) WARN_UNUSED;
-struct isl_tab *isl_tab_drop_sample(struct isl_tab *tab, int s);
-int isl_tab_save_samples(struct isl_tab *tab) WARN_UNUSED;
-
-struct isl_tab *isl_tab_detect_equalities(struct isl_tab *tab,
-	struct isl_tab *tab_cone) WARN_UNUSED;
-
-int isl_tab_push_callback(struct isl_tab *tab,
-	struct isl_tab_callback *callback) WARN_UNUSED;
-
-int isl_tab_add_div(struct isl_tab *tab, __isl_keep isl_vec *div,
-	int (*add_ineq)(void *user, isl_int *), void *user);
-
-#endif
diff --git a/cloog-0.17.0/isl/isl_tab_pip.c b/cloog-0.17.0/isl/isl_tab_pip.c
deleted file mode 100644
index 9759dcf..0000000
--- a/cloog-0.17.0/isl/isl_tab_pip.c
+++ /dev/null
@@ -1,5516 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
- * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France 
- */
-
-#include <isl_ctx_private.h>
-#include "isl_map_private.h"
-#include <isl/seq.h>
-#include "isl_tab.h"
-#include "isl_sample.h"
-#include <isl_mat_private.h>
-#include <isl_aff_private.h>
-#include <isl_options_private.h>
-#include <isl_config.h>
-
-/*
- * The implementation of parametric integer linear programming in this file
- * was inspired by the paper "Parametric Integer Programming" and the
- * report "Solving systems of affine (in)equalities" by Paul Feautrier
- * (and others).
- *
- * The strategy used for obtaining a feasible solution is different
- * from the one used in isl_tab.c.  In particular, in isl_tab.c,
- * upon finding a constraint that is not yet satisfied, we pivot
- * in a row that increases the constant term of the row holding the
- * constraint, making sure the sample solution remains feasible
- * for all the constraints it already satisfied.
- * Here, we always pivot in the row holding the constraint,
- * choosing a column that induces the lexicographically smallest
- * increment to the sample solution.
- *
- * By starting out from a sample value that is lexicographically
- * smaller than any integer point in the problem space, the first
- * feasible integer sample point we find will also be the lexicographically
- * smallest.  If all variables can be assumed to be non-negative,
- * then the initial sample value may be chosen equal to zero.
- * However, we will not make this assumption.  Instead, we apply
- * the "big parameter" trick.  Any variable x is then not directly
- * used in the tableau, but instead it is represented by another
- * variable x' = M + x, where M is an arbitrarily large (positive)
- * value.  x' is therefore always non-negative, whatever the value of x.
- * Taking as initial sample value x' = 0 corresponds to x = -M,
- * which is always smaller than any possible value of x.
- *
- * The big parameter trick is used in the main tableau and
- * also in the context tableau if isl_context_lex is used.
- * In this case, each tableaus has its own big parameter.
- * Before doing any real work, we check if all the parameters
- * happen to be non-negative.  If so, we drop the column corresponding
- * to M from the initial context tableau.
- * If isl_context_gbr is used, then the big parameter trick is only
- * used in the main tableau.
- */
-
-struct isl_context;
-struct isl_context_op {
-	/* detect nonnegative parameters in context and mark them in tab */
-	struct isl_tab *(*detect_nonnegative_parameters)(
-			struct isl_context *context, struct isl_tab *tab);
-	/* return temporary reference to basic set representation of context */
-	struct isl_basic_set *(*peek_basic_set)(struct isl_context *context);
-	/* return temporary reference to tableau representation of context */
-	struct isl_tab *(*peek_tab)(struct isl_context *context);
-	/* add equality; check is 1 if eq may not be valid;
-	 * update is 1 if we may want to call ineq_sign on context later.
-	 */
-	void (*add_eq)(struct isl_context *context, isl_int *eq,
-			int check, int update);
-	/* add inequality; check is 1 if ineq may not be valid;
-	 * update is 1 if we may want to call ineq_sign on context later.
-	 */
-	void (*add_ineq)(struct isl_context *context, isl_int *ineq,
-			int check, int update);
-	/* check sign of ineq based on previous information.
-	 * strict is 1 if saturation should be treated as a positive sign.
-	 */
-	enum isl_tab_row_sign (*ineq_sign)(struct isl_context *context,
-			isl_int *ineq, int strict);
-	/* check if inequality maintains feasibility */
-	int (*test_ineq)(struct isl_context *context, isl_int *ineq);
-	/* return index of a div that corresponds to "div" */
-	int (*get_div)(struct isl_context *context, struct isl_tab *tab,
-			struct isl_vec *div);
-	/* add div "div" to context and return non-negativity */
-	int (*add_div)(struct isl_context *context, struct isl_vec *div);
-	int (*detect_equalities)(struct isl_context *context,
-			struct isl_tab *tab);
-	/* return row index of "best" split */
-	int (*best_split)(struct isl_context *context, struct isl_tab *tab);
-	/* check if context has already been determined to be empty */
-	int (*is_empty)(struct isl_context *context);
-	/* check if context is still usable */
-	int (*is_ok)(struct isl_context *context);
-	/* save a copy/snapshot of context */
-	void *(*save)(struct isl_context *context);
-	/* restore saved context */
-	void (*restore)(struct isl_context *context, void *);
-	/* invalidate context */
-	void (*invalidate)(struct isl_context *context);
-	/* free context */
-	void (*free)(struct isl_context *context);
-};
-
-struct isl_context {
-	struct isl_context_op *op;
-};
-
-struct isl_context_lex {
-	struct isl_context context;
-	struct isl_tab *tab;
-};
-
-struct isl_partial_sol {
-	int level;
-	struct isl_basic_set *dom;
-	struct isl_mat *M;
-
-	struct isl_partial_sol *next;
-};
-
-struct isl_sol;
-struct isl_sol_callback {
-	struct isl_tab_callback callback;
-	struct isl_sol *sol;
-};
-
-/* isl_sol is an interface for constructing a solution to
- * a parametric integer linear programming problem.
- * Every time the algorithm reaches a state where a solution
- * can be read off from the tableau (including cases where the tableau
- * is empty), the function "add" is called on the isl_sol passed
- * to find_solutions_main.
- *
- * The context tableau is owned by isl_sol and is updated incrementally.
- *
- * There are currently two implementations of this interface,
- * isl_sol_map, which simply collects the solutions in an isl_map
- * and (optionally) the parts of the context where there is no solution
- * in an isl_set, and
- * isl_sol_for, which calls a user-defined function for each part of
- * the solution.
- */
-struct isl_sol {
-	int error;
-	int rational;
-	int level;
-	int max;
-	int n_out;
-	struct isl_context *context;
-	struct isl_partial_sol *partial;
-	void (*add)(struct isl_sol *sol,
-			    struct isl_basic_set *dom, struct isl_mat *M);
-	void (*add_empty)(struct isl_sol *sol, struct isl_basic_set *bset);
-	void (*free)(struct isl_sol *sol);
-	struct isl_sol_callback	dec_level;
-};
-
-static void sol_free(struct isl_sol *sol)
-{
-	struct isl_partial_sol *partial, *next;
-	if (!sol)
-		return;
-	for (partial = sol->partial; partial; partial = next) {
-		next = partial->next;
-		isl_basic_set_free(partial->dom);
-		isl_mat_free(partial->M);
-		free(partial);
-	}
-	sol->free(sol);
-}
-
-/* Push a partial solution represented by a domain and mapping M
- * onto the stack of partial solutions.
- */
-static void sol_push_sol(struct isl_sol *sol,
-	struct isl_basic_set *dom, struct isl_mat *M)
-{
-	struct isl_partial_sol *partial;
-
-	if (sol->error || !dom)
-		goto error;
-
-	partial = isl_alloc_type(dom->ctx, struct isl_partial_sol);
-	if (!partial)
-		goto error;
-
-	partial->level = sol->level;
-	partial->dom = dom;
-	partial->M = M;
-	partial->next = sol->partial;
-
-	sol->partial = partial;
-
-	return;
-error:
-	isl_basic_set_free(dom);
-	sol->error = 1;
-}
-
-/* Pop one partial solution from the partial solution stack and
- * pass it on to sol->add or sol->add_empty.
- */
-static void sol_pop_one(struct isl_sol *sol)
-{
-	struct isl_partial_sol *partial;
-
-	partial = sol->partial;
-	sol->partial = partial->next;
-
-	if (partial->M)
-		sol->add(sol, partial->dom, partial->M);
-	else
-		sol->add_empty(sol, partial->dom);
-	free(partial);
-}
-
-/* Return a fresh copy of the domain represented by the context tableau.
- */
-static struct isl_basic_set *sol_domain(struct isl_sol *sol)
-{
-	struct isl_basic_set *bset;
-
-	if (sol->error)
-		return NULL;
-
-	bset = isl_basic_set_dup(sol->context->op->peek_basic_set(sol->context));
-	bset = isl_basic_set_update_from_tab(bset,
-			sol->context->op->peek_tab(sol->context));
-
-	return bset;
-}
-
-/* Check whether two partial solutions have the same mapping, where n_div
- * is the number of divs that the two partial solutions have in common.
- */
-static int same_solution(struct isl_partial_sol *s1, struct isl_partial_sol *s2,
-	unsigned n_div)
-{
-	int i;
-	unsigned dim;
-
-	if (!s1->M != !s2->M)
-		return 0;
-	if (!s1->M)
-		return 1;
-
-	dim = isl_basic_set_total_dim(s1->dom) - s1->dom->n_div;
-
-	for (i = 0; i < s1->M->n_row; ++i) {
-		if (isl_seq_first_non_zero(s1->M->row[i]+1+dim+n_div,
-					    s1->M->n_col-1-dim-n_div) != -1)
-			return 0;
-		if (isl_seq_first_non_zero(s2->M->row[i]+1+dim+n_div,
-					    s2->M->n_col-1-dim-n_div) != -1)
-			return 0;
-		if (!isl_seq_eq(s1->M->row[i], s2->M->row[i], 1+dim+n_div))
-			return 0;
-	}
-	return 1;
-}
-
-/* Pop all solutions from the partial solution stack that were pushed onto
- * the stack at levels that are deeper than the current level.
- * If the two topmost elements on the stack have the same level
- * and represent the same solution, then their domains are combined.
- * This combined domain is the same as the current context domain
- * as sol_pop is called each time we move back to a higher level.
- */
-static void sol_pop(struct isl_sol *sol)
-{
-	struct isl_partial_sol *partial;
-	unsigned n_div;
-
-	if (sol->error)
-		return;
-
-	if (sol->level == 0) {
-		for (partial = sol->partial; partial; partial = sol->partial)
-			sol_pop_one(sol);
-		return;
-	}
-
-	partial = sol->partial;
-	if (!partial)
-		return;
-
-	if (partial->level <= sol->level)
-		return;
-
-	if (partial->next && partial->next->level == partial->level) {
-		n_div = isl_basic_set_dim(
-				sol->context->op->peek_basic_set(sol->context),
-				isl_dim_div);
-
-		if (!same_solution(partial, partial->next, n_div)) {
-			sol_pop_one(sol);
-			sol_pop_one(sol);
-		} else {
-			struct isl_basic_set *bset;
-
-			bset = sol_domain(sol);
-
-			isl_basic_set_free(partial->next->dom);
-			partial->next->dom = bset;
-			partial->next->level = sol->level;
-
-			sol->partial = partial->next;
-			isl_basic_set_free(partial->dom);
-			isl_mat_free(partial->M);
-			free(partial);
-		}
-	} else
-		sol_pop_one(sol);
-}
-
-static void sol_dec_level(struct isl_sol *sol)
-{
-	if (sol->error)
-		return;
-
-	sol->level--;
-
-	sol_pop(sol);
-}
-
-static int sol_dec_level_wrap(struct isl_tab_callback *cb)
-{
-	struct isl_sol_callback *callback = (struct isl_sol_callback *)cb;
-
-	sol_dec_level(callback->sol);
-
-	return callback->sol->error ? -1 : 0;
-}
-
-/* Move down to next level and push callback onto context tableau
- * to decrease the level again when it gets rolled back across
- * the current state.  That is, dec_level will be called with
- * the context tableau in the same state as it is when inc_level
- * is called.
- */
-static void sol_inc_level(struct isl_sol *sol)
-{
-	struct isl_tab *tab;
-
-	if (sol->error)
-		return;
-
-	sol->level++;
-	tab = sol->context->op->peek_tab(sol->context);
-	if (isl_tab_push_callback(tab, &sol->dec_level.callback) < 0)
-		sol->error = 1;
-}
-
-static void scale_rows(struct isl_mat *mat, isl_int m, int n_row)
-{
-	int i;
-
-	if (isl_int_is_one(m))
-		return;
-
-	for (i = 0; i < n_row; ++i)
-		isl_seq_scale(mat->row[i], mat->row[i], m, mat->n_col);
-}
-
-/* Add the solution identified by the tableau and the context tableau.
- *
- * The layout of the variables is as follows.
- *	tab->n_var is equal to the total number of variables in the input
- *			map (including divs that were copied from the context)
- *			+ the number of extra divs constructed
- *      Of these, the first tab->n_param and the last tab->n_div variables
- *	correspond to the variables in the context, i.e.,
- *		tab->n_param + tab->n_div = context_tab->n_var
- *	tab->n_param is equal to the number of parameters and input
- *			dimensions in the input map
- *	tab->n_div is equal to the number of divs in the context
- *
- * If there is no solution, then call add_empty with a basic set
- * that corresponds to the context tableau.  (If add_empty is NULL,
- * then do nothing).
- *
- * If there is a solution, then first construct a matrix that maps
- * all dimensions of the context to the output variables, i.e.,
- * the output dimensions in the input map.
- * The divs in the input map (if any) that do not correspond to any
- * div in the context do not appear in the solution.
- * The algorithm will make sure that they have an integer value,
- * but these values themselves are of no interest.
- * We have to be careful not to drop or rearrange any divs in the
- * context because that would change the meaning of the matrix.
- *
- * To extract the value of the output variables, it should be noted
- * that we always use a big parameter M in the main tableau and so
- * the variable stored in this tableau is not an output variable x itself, but
- *	x' = M + x (in case of minimization)
- * or
- *	x' = M - x (in case of maximization)
- * If x' appears in a column, then its optimal value is zero,
- * which means that the optimal value of x is an unbounded number
- * (-M for minimization and M for maximization).
- * We currently assume that the output dimensions in the original map
- * are bounded, so this cannot occur.
- * Similarly, when x' appears in a row, then the coefficient of M in that
- * row is necessarily 1.
- * If the row in the tableau represents
- *	d x' = c + d M + e(y)
- * then, in case of minimization, the corresponding row in the matrix
- * will be
- *	a c + a e(y)
- * with a d = m, the (updated) common denominator of the matrix.
- * In case of maximization, the row will be
- *	-a c - a e(y)
- */
-static void sol_add(struct isl_sol *sol, struct isl_tab *tab)
-{
-	struct isl_basic_set *bset = NULL;
-	struct isl_mat *mat = NULL;
-	unsigned off;
-	int row;
-	isl_int m;
-
-	if (sol->error || !tab)
-		goto error;
-
-	if (tab->empty && !sol->add_empty)
-		return;
-
-	bset = sol_domain(sol);
-
-	if (tab->empty) {
-		sol_push_sol(sol, bset, NULL);
-		return;
-	}
-
-	off = 2 + tab->M;
-
-	mat = isl_mat_alloc(tab->mat->ctx, 1 + sol->n_out,
-					    1 + tab->n_param + tab->n_div);
-	if (!mat)
-		goto error;
-
-	isl_int_init(m);
-
-	isl_seq_clr(mat->row[0] + 1, mat->n_col - 1);
-	isl_int_set_si(mat->row[0][0], 1);
-	for (row = 0; row < sol->n_out; ++row) {
-		int i = tab->n_param + row;
-		int r, j;
-
-		isl_seq_clr(mat->row[1 + row], mat->n_col);
-		if (!tab->var[i].is_row) {
-			if (tab->M)
-				isl_die(mat->ctx, isl_error_invalid,
-					"unbounded optimum", goto error2);
-			continue;
-		}
-
-		r = tab->var[i].index;
-		if (tab->M &&
-		    isl_int_ne(tab->mat->row[r][2], tab->mat->row[r][0]))
-			isl_die(mat->ctx, isl_error_invalid,
-				"unbounded optimum", goto error2);
-		isl_int_gcd(m, mat->row[0][0], tab->mat->row[r][0]);
-		isl_int_divexact(m, tab->mat->row[r][0], m);
-		scale_rows(mat, m, 1 + row);
-		isl_int_divexact(m, mat->row[0][0], tab->mat->row[r][0]);
-		isl_int_mul(mat->row[1 + row][0], m, tab->mat->row[r][1]);
-		for (j = 0; j < tab->n_param; ++j) {
-			int col;
-			if (tab->var[j].is_row)
-				continue;
-			col = tab->var[j].index;
-			isl_int_mul(mat->row[1 + row][1 + j], m,
-				    tab->mat->row[r][off + col]);
-		}
-		for (j = 0; j < tab->n_div; ++j) {
-			int col;
-			if (tab->var[tab->n_var - tab->n_div+j].is_row)
-				continue;
-			col = tab->var[tab->n_var - tab->n_div+j].index;
-			isl_int_mul(mat->row[1 + row][1 + tab->n_param + j], m,
-				    tab->mat->row[r][off + col]);
-		}
-		if (sol->max)
-			isl_seq_neg(mat->row[1 + row], mat->row[1 + row],
-				    mat->n_col);
-	}
-
-	isl_int_clear(m);
-
-	sol_push_sol(sol, bset, mat);
-	return;
-error2:
-	isl_int_clear(m);
-error:
-	isl_basic_set_free(bset);
-	isl_mat_free(mat);
-	sol->error = 1;
-}
-
-struct isl_sol_map {
-	struct isl_sol	sol;
-	struct isl_map	*map;
-	struct isl_set	*empty;
-};
-
-static void sol_map_free(struct isl_sol_map *sol_map)
-{
-	if (!sol_map)
-		return;
-	if (sol_map->sol.context)
-		sol_map->sol.context->op->free(sol_map->sol.context);
-	isl_map_free(sol_map->map);
-	isl_set_free(sol_map->empty);
-	free(sol_map);
-}
-
-static void sol_map_free_wrap(struct isl_sol *sol)
-{
-	sol_map_free((struct isl_sol_map *)sol);
-}
-
-/* This function is called for parts of the context where there is
- * no solution, with "bset" corresponding to the context tableau.
- * Simply add the basic set to the set "empty".
- */
-static void sol_map_add_empty(struct isl_sol_map *sol,
-	struct isl_basic_set *bset)
-{
-	if (!bset)
-		goto error;
-	isl_assert(bset->ctx, sol->empty, goto error);
-
-	sol->empty = isl_set_grow(sol->empty, 1);
-	bset = isl_basic_set_simplify(bset);
-	bset = isl_basic_set_finalize(bset);
-	sol->empty = isl_set_add_basic_set(sol->empty, isl_basic_set_copy(bset));
-	if (!sol->empty)
-		goto error;
-	isl_basic_set_free(bset);
-	return;
-error:
-	isl_basic_set_free(bset);
-	sol->sol.error = 1;
-}
-
-static void sol_map_add_empty_wrap(struct isl_sol *sol,
-	struct isl_basic_set *bset)
-{
-	sol_map_add_empty((struct isl_sol_map *)sol, bset);
-}
-
-/* Given a basic map "dom" that represents the context and an affine
- * matrix "M" that maps the dimensions of the context to the
- * output variables, construct a basic map with the same parameters
- * and divs as the context, the dimensions of the context as input
- * dimensions and a number of output dimensions that is equal to
- * the number of output dimensions in the input map.
- *
- * The constraints and divs of the context are simply copied
- * from "dom".  For each row
- *	x = c + e(y)
- * an equality
- *	c + e(y) - d x = 0
- * is added, with d the common denominator of M.
- */
-static void sol_map_add(struct isl_sol_map *sol,
-	struct isl_basic_set *dom, struct isl_mat *M)
-{
-	int i;
-	struct isl_basic_map *bmap = NULL;
-	unsigned n_eq;
-	unsigned n_ineq;
-	unsigned nparam;
-	unsigned total;
-	unsigned n_div;
-	unsigned n_out;
-
-	if (sol->sol.error || !dom || !M)
-		goto error;
-
-	n_out = sol->sol.n_out;
-	n_eq = dom->n_eq + n_out;
-	n_ineq = dom->n_ineq;
-	n_div = dom->n_div;
-	nparam = isl_basic_set_total_dim(dom) - n_div;
-	total = isl_map_dim(sol->map, isl_dim_all);
-	bmap = isl_basic_map_alloc_space(isl_map_get_space(sol->map),
-					n_div, n_eq, 2 * n_div + n_ineq);
-	if (!bmap)
-		goto error;
-	if (sol->sol.rational)
-		ISL_F_SET(bmap, ISL_BASIC_MAP_RATIONAL);
-	for (i = 0; i < dom->n_div; ++i) {
-		int k = isl_basic_map_alloc_div(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(bmap->div[k], dom->div[i], 1 + 1 + nparam);
-		isl_seq_clr(bmap->div[k] + 1 + 1 + nparam, total - nparam);
-		isl_seq_cpy(bmap->div[k] + 1 + 1 + total,
-			    dom->div[i] + 1 + 1 + nparam, i);
-	}
-	for (i = 0; i < dom->n_eq; ++i) {
-		int k = isl_basic_map_alloc_equality(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(bmap->eq[k], dom->eq[i], 1 + nparam);
-		isl_seq_clr(bmap->eq[k] + 1 + nparam, total - nparam);
-		isl_seq_cpy(bmap->eq[k] + 1 + total,
-			    dom->eq[i] + 1 + nparam, n_div);
-	}
-	for (i = 0; i < dom->n_ineq; ++i) {
-		int k = isl_basic_map_alloc_inequality(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(bmap->ineq[k], dom->ineq[i], 1 + nparam);
-		isl_seq_clr(bmap->ineq[k] + 1 + nparam, total - nparam);
-		isl_seq_cpy(bmap->ineq[k] + 1 + total,
-			dom->ineq[i] + 1 + nparam, n_div);
-	}
-	for (i = 0; i < M->n_row - 1; ++i) {
-		int k = isl_basic_map_alloc_equality(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(bmap->eq[k], M->row[1 + i], 1 + nparam);
-		isl_seq_clr(bmap->eq[k] + 1 + nparam, n_out);
-		isl_int_neg(bmap->eq[k][1 + nparam + i], M->row[0][0]);
-		isl_seq_cpy(bmap->eq[k] + 1 + nparam + n_out,
-			    M->row[1 + i] + 1 + nparam, n_div);
-	}
-	bmap = isl_basic_map_simplify(bmap);
-	bmap = isl_basic_map_finalize(bmap);
-	sol->map = isl_map_grow(sol->map, 1);
-	sol->map = isl_map_add_basic_map(sol->map, bmap);
-	isl_basic_set_free(dom);
-	isl_mat_free(M);
-	if (!sol->map)
-		sol->sol.error = 1;
-	return;
-error:
-	isl_basic_set_free(dom);
-	isl_mat_free(M);
-	isl_basic_map_free(bmap);
-	sol->sol.error = 1;
-}
-
-static void sol_map_add_wrap(struct isl_sol *sol,
-	struct isl_basic_set *dom, struct isl_mat *M)
-{
-	sol_map_add((struct isl_sol_map *)sol, dom, M);
-}
-
-
-/* Store the "parametric constant" of row "row" of tableau "tab" in "line",
- * i.e., the constant term and the coefficients of all variables that
- * appear in the context tableau.
- * Note that the coefficient of the big parameter M is NOT copied.
- * The context tableau may not have a big parameter and even when it
- * does, it is a different big parameter.
- */
-static void get_row_parameter_line(struct isl_tab *tab, int row, isl_int *line)
-{
-	int i;
-	unsigned off = 2 + tab->M;
-
-	isl_int_set(line[0], tab->mat->row[row][1]);
-	for (i = 0; i < tab->n_param; ++i) {
-		if (tab->var[i].is_row)
-			isl_int_set_si(line[1 + i], 0);
-		else {
-			int col = tab->var[i].index;
-			isl_int_set(line[1 + i], tab->mat->row[row][off + col]);
-		}
-	}
-	for (i = 0; i < tab->n_div; ++i) {
-		if (tab->var[tab->n_var - tab->n_div + i].is_row)
-			isl_int_set_si(line[1 + tab->n_param + i], 0);
-		else {
-			int col = tab->var[tab->n_var - tab->n_div + i].index;
-			isl_int_set(line[1 + tab->n_param + i],
-				    tab->mat->row[row][off + col]);
-		}
-	}
-}
-
-/* Check if rows "row1" and "row2" have identical "parametric constants",
- * as explained above.
- * In this case, we also insist that the coefficients of the big parameter
- * be the same as the values of the constants will only be the same
- * if these coefficients are also the same.
- */
-static int identical_parameter_line(struct isl_tab *tab, int row1, int row2)
-{
-	int i;
-	unsigned off = 2 + tab->M;
-
-	if (isl_int_ne(tab->mat->row[row1][1], tab->mat->row[row2][1]))
-		return 0;
-
-	if (tab->M && isl_int_ne(tab->mat->row[row1][2],
-				 tab->mat->row[row2][2]))
-		return 0;
-
-	for (i = 0; i < tab->n_param + tab->n_div; ++i) {
-		int pos = i < tab->n_param ? i :
-			tab->n_var - tab->n_div + i - tab->n_param;
-		int col;
-
-		if (tab->var[pos].is_row)
-			continue;
-		col = tab->var[pos].index;
-		if (isl_int_ne(tab->mat->row[row1][off + col],
-			       tab->mat->row[row2][off + col]))
-			return 0;
-	}
-	return 1;
-}
-
-/* Return an inequality that expresses that the "parametric constant"
- * should be non-negative.
- * This function is only called when the coefficient of the big parameter
- * is equal to zero.
- */
-static struct isl_vec *get_row_parameter_ineq(struct isl_tab *tab, int row)
-{
-	struct isl_vec *ineq;
-
-	ineq = isl_vec_alloc(tab->mat->ctx, 1 + tab->n_param + tab->n_div);
-	if (!ineq)
-		return NULL;
-
-	get_row_parameter_line(tab, row, ineq->el);
-	if (ineq)
-		ineq = isl_vec_normalize(ineq);
-
-	return ineq;
-}
-
-/* Return a integer division for use in a parametric cut based on the given row.
- * In particular, let the parametric constant of the row be
- *
- *		\sum_i a_i y_i
- *
- * where y_0 = 1, but none of the y_i corresponds to the big parameter M.
- * The div returned is equal to
- *
- *		floor(\sum_i {-a_i} y_i) = floor((\sum_i (-a_i mod d) y_i)/d)
- */
-static struct isl_vec *get_row_parameter_div(struct isl_tab *tab, int row)
-{
-	struct isl_vec *div;
-
-	div = isl_vec_alloc(tab->mat->ctx, 1 + 1 + tab->n_param + tab->n_div);
-	if (!div)
-		return NULL;
-
-	isl_int_set(div->el[0], tab->mat->row[row][0]);
-	get_row_parameter_line(tab, row, div->el + 1);
-	div = isl_vec_normalize(div);
-	isl_seq_neg(div->el + 1, div->el + 1, div->size - 1);
-	isl_seq_fdiv_r(div->el + 1, div->el + 1, div->el[0], div->size - 1);
-
-	return div;
-}
-
-/* Return a integer division for use in transferring an integrality constraint
- * to the context.
- * In particular, let the parametric constant of the row be
- *
- *		\sum_i a_i y_i
- *
- * where y_0 = 1, but none of the y_i corresponds to the big parameter M.
- * The the returned div is equal to
- *
- *		floor(\sum_i {a_i} y_i) = floor((\sum_i (a_i mod d) y_i)/d)
- */
-static struct isl_vec *get_row_split_div(struct isl_tab *tab, int row)
-{
-	struct isl_vec *div;
-
-	div = isl_vec_alloc(tab->mat->ctx, 1 + 1 + tab->n_param + tab->n_div);
-	if (!div)
-		return NULL;
-
-	isl_int_set(div->el[0], tab->mat->row[row][0]);
-	get_row_parameter_line(tab, row, div->el + 1);
-	div = isl_vec_normalize(div);
-	isl_seq_fdiv_r(div->el + 1, div->el + 1, div->el[0], div->size - 1);
-
-	return div;
-}
-
-/* Construct and return an inequality that expresses an upper bound
- * on the given div.
- * In particular, if the div is given by
- *
- *	d = floor(e/m)
- *
- * then the inequality expresses
- *
- *	m d <= e
- */
-static struct isl_vec *ineq_for_div(struct isl_basic_set *bset, unsigned div)
-{
-	unsigned total;
-	unsigned div_pos;
-	struct isl_vec *ineq;
-
-	if (!bset)
-		return NULL;
-
-	total = isl_basic_set_total_dim(bset);
-	div_pos = 1 + total - bset->n_div + div;
-
-	ineq = isl_vec_alloc(bset->ctx, 1 + total);
-	if (!ineq)
-		return NULL;
-
-	isl_seq_cpy(ineq->el, bset->div[div] + 1, 1 + total);
-	isl_int_neg(ineq->el[div_pos], bset->div[div][0]);
-	return ineq;
-}
-
-/* Given a row in the tableau and a div that was created
- * using get_row_split_div and that has been constrained to equality, i.e.,
- *
- *		d = floor(\sum_i {a_i} y_i) = \sum_i {a_i} y_i
- *
- * replace the expression "\sum_i {a_i} y_i" in the row by d,
- * i.e., we subtract "\sum_i {a_i} y_i" and add 1 d.
- * The coefficients of the non-parameters in the tableau have been
- * verified to be integral.  We can therefore simply replace coefficient b
- * by floor(b).  For the coefficients of the parameters we have
- * floor(a_i) = a_i - {a_i}, while for the other coefficients, we have
- * floor(b) = b.
- */
-static struct isl_tab *set_row_cst_to_div(struct isl_tab *tab, int row, int div)
-{
-	isl_seq_fdiv_q(tab->mat->row[row] + 1, tab->mat->row[row] + 1,
-			tab->mat->row[row][0], 1 + tab->M + tab->n_col);
-
-	isl_int_set_si(tab->mat->row[row][0], 1);
-
-	if (tab->var[tab->n_var - tab->n_div + div].is_row) {
-		int drow = tab->var[tab->n_var - tab->n_div + div].index;
-
-		isl_assert(tab->mat->ctx,
-			isl_int_is_one(tab->mat->row[drow][0]), goto error);
-		isl_seq_combine(tab->mat->row[row] + 1,
-			tab->mat->ctx->one, tab->mat->row[row] + 1,
-			tab->mat->ctx->one, tab->mat->row[drow] + 1,
-			1 + tab->M + tab->n_col);
-	} else {
-		int dcol = tab->var[tab->n_var - tab->n_div + div].index;
-
-		isl_int_add_ui(tab->mat->row[row][2 + tab->M + dcol],
-				tab->mat->row[row][2 + tab->M + dcol], 1);
-	}
-
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-/* Check if the (parametric) constant of the given row is obviously
- * negative, meaning that we don't need to consult the context tableau.
- * If there is a big parameter and its coefficient is non-zero,
- * then this coefficient determines the outcome.
- * Otherwise, we check whether the constant is negative and
- * all non-zero coefficients of parameters are negative and
- * belong to non-negative parameters.
- */
-static int is_obviously_neg(struct isl_tab *tab, int row)
-{
-	int i;
-	int col;
-	unsigned off = 2 + tab->M;
-
-	if (tab->M) {
-		if (isl_int_is_pos(tab->mat->row[row][2]))
-			return 0;
-		if (isl_int_is_neg(tab->mat->row[row][2]))
-			return 1;
-	}
-
-	if (isl_int_is_nonneg(tab->mat->row[row][1]))
-		return 0;
-	for (i = 0; i < tab->n_param; ++i) {
-		/* Eliminated parameter */
-		if (tab->var[i].is_row)
-			continue;
-		col = tab->var[i].index;
-		if (isl_int_is_zero(tab->mat->row[row][off + col]))
-			continue;
-		if (!tab->var[i].is_nonneg)
-			return 0;
-		if (isl_int_is_pos(tab->mat->row[row][off + col]))
-			return 0;
-	}
-	for (i = 0; i < tab->n_div; ++i) {
-		if (tab->var[tab->n_var - tab->n_div + i].is_row)
-			continue;
-		col = tab->var[tab->n_var - tab->n_div + i].index;
-		if (isl_int_is_zero(tab->mat->row[row][off + col]))
-			continue;
-		if (!tab->var[tab->n_var - tab->n_div + i].is_nonneg)
-			return 0;
-		if (isl_int_is_pos(tab->mat->row[row][off + col]))
-			return 0;
-	}
-	return 1;
-}
-
-/* Check if the (parametric) constant of the given row is obviously
- * non-negative, meaning that we don't need to consult the context tableau.
- * If there is a big parameter and its coefficient is non-zero,
- * then this coefficient determines the outcome.
- * Otherwise, we check whether the constant is non-negative and
- * all non-zero coefficients of parameters are positive and
- * belong to non-negative parameters.
- */
-static int is_obviously_nonneg(struct isl_tab *tab, int row)
-{
-	int i;
-	int col;
-	unsigned off = 2 + tab->M;
-
-	if (tab->M) {
-		if (isl_int_is_pos(tab->mat->row[row][2]))
-			return 1;
-		if (isl_int_is_neg(tab->mat->row[row][2]))
-			return 0;
-	}
-
-	if (isl_int_is_neg(tab->mat->row[row][1]))
-		return 0;
-	for (i = 0; i < tab->n_param; ++i) {
-		/* Eliminated parameter */
-		if (tab->var[i].is_row)
-			continue;
-		col = tab->var[i].index;
-		if (isl_int_is_zero(tab->mat->row[row][off + col]))
-			continue;
-		if (!tab->var[i].is_nonneg)
-			return 0;
-		if (isl_int_is_neg(tab->mat->row[row][off + col]))
-			return 0;
-	}
-	for (i = 0; i < tab->n_div; ++i) {
-		if (tab->var[tab->n_var - tab->n_div + i].is_row)
-			continue;
-		col = tab->var[tab->n_var - tab->n_div + i].index;
-		if (isl_int_is_zero(tab->mat->row[row][off + col]))
-			continue;
-		if (!tab->var[tab->n_var - tab->n_div + i].is_nonneg)
-			return 0;
-		if (isl_int_is_neg(tab->mat->row[row][off + col]))
-			return 0;
-	}
-	return 1;
-}
-
-/* Given a row r and two columns, return the column that would
- * lead to the lexicographically smallest increment in the sample
- * solution when leaving the basis in favor of the row.
- * Pivoting with column c will increment the sample value by a non-negative
- * constant times a_{V,c}/a_{r,c}, with a_{V,c} the elements of column c
- * corresponding to the non-parametric variables.
- * If variable v appears in a column c_v, the a_{v,c} = 1 iff c = c_v,
- * with all other entries in this virtual row equal to zero.
- * If variable v appears in a row, then a_{v,c} is the element in column c
- * of that row.
- *
- * Let v be the first variable with a_{v,c1}/a_{r,c1} != a_{v,c2}/a_{r,c2}.
- * Then if a_{v,c1}/a_{r,c1} < a_{v,c2}/a_{r,c2}, i.e.,
- * a_{v,c2} a_{r,c1} - a_{v,c1} a_{r,c2} > 0, c1 results in the minimal
- * increment.  Otherwise, it's c2.
- */
-static int lexmin_col_pair(struct isl_tab *tab,
-	int row, int col1, int col2, isl_int tmp)
-{
-	int i;
-	isl_int *tr;
-
-	tr = tab->mat->row[row] + 2 + tab->M;
-
-	for (i = tab->n_param; i < tab->n_var - tab->n_div; ++i) {
-		int s1, s2;
-		isl_int *r;
-
-		if (!tab->var[i].is_row) {
-			if (tab->var[i].index == col1)
-				return col2;
-			if (tab->var[i].index == col2)
-				return col1;
-			continue;
-		}
-
-		if (tab->var[i].index == row)
-			continue;
-
-		r = tab->mat->row[tab->var[i].index] + 2 + tab->M;
-		s1 = isl_int_sgn(r[col1]);
-		s2 = isl_int_sgn(r[col2]);
-		if (s1 == 0 && s2 == 0)
-			continue;
-		if (s1 < s2)
-			return col1;
-		if (s2 < s1)
-			return col2;
-
-		isl_int_mul(tmp, r[col2], tr[col1]);
-		isl_int_submul(tmp, r[col1], tr[col2]);
-		if (isl_int_is_pos(tmp))
-			return col1;
-		if (isl_int_is_neg(tmp))
-			return col2;
-	}
-	return -1;
-}
-
-/* Given a row in the tableau, find and return the column that would
- * result in the lexicographically smallest, but positive, increment
- * in the sample point.
- * If there is no such column, then return tab->n_col.
- * If anything goes wrong, return -1.
- */
-static int lexmin_pivot_col(struct isl_tab *tab, int row)
-{
-	int j;
-	int col = tab->n_col;
-	isl_int *tr;
-	isl_int tmp;
-
-	tr = tab->mat->row[row] + 2 + tab->M;
-
-	isl_int_init(tmp);
-
-	for (j = tab->n_dead; j < tab->n_col; ++j) {
-		if (tab->col_var[j] >= 0 &&
-		    (tab->col_var[j] < tab->n_param  ||
-		    tab->col_var[j] >= tab->n_var - tab->n_div))
-			continue;
-
-		if (!isl_int_is_pos(tr[j]))
-			continue;
-
-		if (col == tab->n_col)
-			col = j;
-		else
-			col = lexmin_col_pair(tab, row, col, j, tmp);
-		isl_assert(tab->mat->ctx, col >= 0, goto error);
-	}
-
-	isl_int_clear(tmp);
-	return col;
-error:
-	isl_int_clear(tmp);
-	return -1;
-}
-
-/* Return the first known violated constraint, i.e., a non-negative
- * constraint that currently has an either obviously negative value
- * or a previously determined to be negative value.
- *
- * If any constraint has a negative coefficient for the big parameter,
- * if any, then we return one of these first.
- */
-static int first_neg(struct isl_tab *tab)
-{
-	int row;
-
-	if (tab->M)
-		for (row = tab->n_redundant; row < tab->n_row; ++row) {
-			if (!isl_tab_var_from_row(tab, row)->is_nonneg)
-				continue;
-			if (!isl_int_is_neg(tab->mat->row[row][2]))
-				continue;
-			if (tab->row_sign)
-				tab->row_sign[row] = isl_tab_row_neg;
-			return row;
-		}
-	for (row = tab->n_redundant; row < tab->n_row; ++row) {
-		if (!isl_tab_var_from_row(tab, row)->is_nonneg)
-			continue;
-		if (tab->row_sign) {
-			if (tab->row_sign[row] == 0 &&
-			    is_obviously_neg(tab, row))
-				tab->row_sign[row] = isl_tab_row_neg;
-			if (tab->row_sign[row] != isl_tab_row_neg)
-				continue;
-		} else if (!is_obviously_neg(tab, row))
-			continue;
-		return row;
-	}
-	return -1;
-}
-
-/* Check whether the invariant that all columns are lexico-positive
- * is satisfied.  This function is not called from the current code
- * but is useful during debugging.
- */
-static void check_lexpos(struct isl_tab *tab) __attribute__ ((unused));
-static void check_lexpos(struct isl_tab *tab)
-{
-	unsigned off = 2 + tab->M;
-	int col;
-	int var;
-	int row;
-
-	for (col = tab->n_dead; col < tab->n_col; ++col) {
-		if (tab->col_var[col] >= 0 &&
-		    (tab->col_var[col] < tab->n_param ||
-		     tab->col_var[col] >= tab->n_var - tab->n_div))
-			continue;
-		for (var = tab->n_param; var < tab->n_var - tab->n_div; ++var) {
-			if (!tab->var[var].is_row) {
-				if (tab->var[var].index == col)
-					break;
-				else
-					continue;
-			}
-			row = tab->var[var].index;
-			if (isl_int_is_zero(tab->mat->row[row][off + col]))
-				continue;
-			if (isl_int_is_pos(tab->mat->row[row][off + col]))
-				break;
-			fprintf(stderr, "lexneg column %d (row %d)\n",
-				col, row);
-		}
-		if (var >= tab->n_var - tab->n_div)
-			fprintf(stderr, "zero column %d\n", col);
-	}
-}
-
-/* Report to the caller that the given constraint is part of an encountered
- * conflict.
- */
-static int report_conflicting_constraint(struct isl_tab *tab, int con)
-{
-	return tab->conflict(con, tab->conflict_user);
-}
-
-/* Given a conflicting row in the tableau, report all constraints
- * involved in the row to the caller.  That is, the row itself
- * (if represents a constraint) and all constraint columns with
- * non-zero (and therefore negative) coefficient.
- */
-static int report_conflict(struct isl_tab *tab, int row)
-{
-	int j;
-	isl_int *tr;
-
-	if (!tab->conflict)
-		return 0;
-
-	if (tab->row_var[row] < 0 &&
-	    report_conflicting_constraint(tab, ~tab->row_var[row]) < 0)
-		return -1;
-
-	tr = tab->mat->row[row] + 2 + tab->M;
-
-	for (j = tab->n_dead; j < tab->n_col; ++j) {
-		if (tab->col_var[j] >= 0 &&
-		    (tab->col_var[j] < tab->n_param  ||
-		    tab->col_var[j] >= tab->n_var - tab->n_div))
-			continue;
-
-		if (!isl_int_is_neg(tr[j]))
-			continue;
-
-		if (tab->col_var[j] < 0 &&
-		    report_conflicting_constraint(tab, ~tab->col_var[j]) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-/* Resolve all known or obviously violated constraints through pivoting.
- * In particular, as long as we can find any violated constraint, we
- * look for a pivoting column that would result in the lexicographically
- * smallest increment in the sample point.  If there is no such column
- * then the tableau is infeasible.
- */
-static int restore_lexmin(struct isl_tab *tab) WARN_UNUSED;
-static int restore_lexmin(struct isl_tab *tab)
-{
-	int row, col;
-
-	if (!tab)
-		return -1;
-	if (tab->empty)
-		return 0;
-	while ((row = first_neg(tab)) != -1) {
-		col = lexmin_pivot_col(tab, row);
-		if (col >= tab->n_col) {
-			if (report_conflict(tab, row) < 0)
-				return -1;
-			if (isl_tab_mark_empty(tab) < 0)
-				return -1;
-			return 0;
-		}
-		if (col < 0)
-			return -1;
-		if (isl_tab_pivot(tab, row, col) < 0)
-			return -1;
-	}
-	return 0;
-}
-
-/* Given a row that represents an equality, look for an appropriate
- * pivoting column.
- * In particular, if there are any non-zero coefficients among
- * the non-parameter variables, then we take the last of these
- * variables.  Eliminating this variable in terms of the other
- * variables and/or parameters does not influence the property
- * that all column in the initial tableau are lexicographically
- * positive.  The row corresponding to the eliminated variable
- * will only have non-zero entries below the diagonal of the
- * initial tableau.  That is, we transform
- *
- *		I				I
- *		  1		into		a
- *		    I				  I
- *
- * If there is no such non-parameter variable, then we are dealing with
- * pure parameter equality and we pick any parameter with coefficient 1 or -1
- * for elimination.  This will ensure that the eliminated parameter
- * always has an integer value whenever all the other parameters are integral.
- * If there is no such parameter then we return -1.
- */
-static int last_var_col_or_int_par_col(struct isl_tab *tab, int row)
-{
-	unsigned off = 2 + tab->M;
-	int i;
-
-	for (i = tab->n_var - tab->n_div - 1; i >= 0 && i >= tab->n_param; --i) {
-		int col;
-		if (tab->var[i].is_row)
-			continue;
-		col = tab->var[i].index;
-		if (col <= tab->n_dead)
-			continue;
-		if (!isl_int_is_zero(tab->mat->row[row][off + col]))
-			return col;
-	}
-	for (i = tab->n_dead; i < tab->n_col; ++i) {
-		if (isl_int_is_one(tab->mat->row[row][off + i]))
-			return i;
-		if (isl_int_is_negone(tab->mat->row[row][off + i]))
-			return i;
-	}
-	return -1;
-}
-
-/* Add an equality that is known to be valid to the tableau.
- * We first check if we can eliminate a variable or a parameter.
- * If not, we add the equality as two inequalities.
- * In this case, the equality was a pure parameter equality and there
- * is no need to resolve any constraint violations.
- */
-static struct isl_tab *add_lexmin_valid_eq(struct isl_tab *tab, isl_int *eq)
-{
-	int i;
-	int r;
-
-	if (!tab)
-		return NULL;
-	r = isl_tab_add_row(tab, eq);
-	if (r < 0)
-		goto error;
-
-	r = tab->con[r].index;
-	i = last_var_col_or_int_par_col(tab, r);
-	if (i < 0) {
-		tab->con[r].is_nonneg = 1;
-		if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r]) < 0)
-			goto error;
-		isl_seq_neg(eq, eq, 1 + tab->n_var);
-		r = isl_tab_add_row(tab, eq);
-		if (r < 0)
-			goto error;
-		tab->con[r].is_nonneg = 1;
-		if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r]) < 0)
-			goto error;
-	} else {
-		if (isl_tab_pivot(tab, r, i) < 0)
-			goto error;
-		if (isl_tab_kill_col(tab, i) < 0)
-			goto error;
-		tab->n_eq++;
-	}
-
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-/* Check if the given row is a pure constant.
- */
-static int is_constant(struct isl_tab *tab, int row)
-{
-	unsigned off = 2 + tab->M;
-
-	return isl_seq_first_non_zero(tab->mat->row[row] + off + tab->n_dead,
-					tab->n_col - tab->n_dead) == -1;
-}
-
-/* Add an equality that may or may not be valid to the tableau.
- * If the resulting row is a pure constant, then it must be zero.
- * Otherwise, the resulting tableau is empty.
- *
- * If the row is not a pure constant, then we add two inequalities,
- * each time checking that they can be satisfied.
- * In the end we try to use one of the two constraints to eliminate
- * a column.
- */
-static int add_lexmin_eq(struct isl_tab *tab, isl_int *eq) WARN_UNUSED;
-static int add_lexmin_eq(struct isl_tab *tab, isl_int *eq)
-{
-	int r1, r2;
-	int row;
-	struct isl_tab_undo *snap;
-
-	if (!tab)
-		return -1;
-	snap = isl_tab_snap(tab);
-	r1 = isl_tab_add_row(tab, eq);
-	if (r1 < 0)
-		return -1;
-	tab->con[r1].is_nonneg = 1;
-	if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r1]) < 0)
-		return -1;
-
-	row = tab->con[r1].index;
-	if (is_constant(tab, row)) {
-		if (!isl_int_is_zero(tab->mat->row[row][1]) ||
-		    (tab->M && !isl_int_is_zero(tab->mat->row[row][2]))) {
-			if (isl_tab_mark_empty(tab) < 0)
-				return -1;
-			return 0;
-		}
-		if (isl_tab_rollback(tab, snap) < 0)
-			return -1;
-		return 0;
-	}
-
-	if (restore_lexmin(tab) < 0)
-		return -1;
-	if (tab->empty)
-		return 0;
-
-	isl_seq_neg(eq, eq, 1 + tab->n_var);
-
-	r2 = isl_tab_add_row(tab, eq);
-	if (r2 < 0)
-		return -1;
-	tab->con[r2].is_nonneg = 1;
-	if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r2]) < 0)
-		return -1;
-
-	if (restore_lexmin(tab) < 0)
-		return -1;
-	if (tab->empty)
-		return 0;
-
-	if (!tab->con[r1].is_row) {
-		if (isl_tab_kill_col(tab, tab->con[r1].index) < 0)
-			return -1;
-	} else if (!tab->con[r2].is_row) {
-		if (isl_tab_kill_col(tab, tab->con[r2].index) < 0)
-			return -1;
-	}
-
-	if (tab->bmap) {
-		tab->bmap = isl_basic_map_add_ineq(tab->bmap, eq);
-		if (isl_tab_push(tab, isl_tab_undo_bmap_ineq) < 0)
-			return -1;
-		isl_seq_neg(eq, eq, 1 + tab->n_var);
-		tab->bmap = isl_basic_map_add_ineq(tab->bmap, eq);
-		isl_seq_neg(eq, eq, 1 + tab->n_var);
-		if (isl_tab_push(tab, isl_tab_undo_bmap_ineq) < 0)
-			return -1;
-		if (!tab->bmap)
-			return -1;
-	}
-
-	return 0;
-}
-
-/* Add an inequality to the tableau, resolving violations using
- * restore_lexmin.
- */
-static struct isl_tab *add_lexmin_ineq(struct isl_tab *tab, isl_int *ineq)
-{
-	int r;
-
-	if (!tab)
-		return NULL;
-	if (tab->bmap) {
-		tab->bmap = isl_basic_map_add_ineq(tab->bmap, ineq);
-		if (isl_tab_push(tab, isl_tab_undo_bmap_ineq) < 0)
-			goto error;
-		if (!tab->bmap)
-			goto error;
-	}
-	r = isl_tab_add_row(tab, ineq);
-	if (r < 0)
-		goto error;
-	tab->con[r].is_nonneg = 1;
-	if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r]) < 0)
-		goto error;
-	if (isl_tab_row_is_redundant(tab, tab->con[r].index)) {
-		if (isl_tab_mark_redundant(tab, tab->con[r].index) < 0)
-			goto error;
-		return tab;
-	}
-
-	if (restore_lexmin(tab) < 0)
-		goto error;
-	if (!tab->empty && tab->con[r].is_row &&
-		 isl_tab_row_is_redundant(tab, tab->con[r].index))
-		if (isl_tab_mark_redundant(tab, tab->con[r].index) < 0)
-			goto error;
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-/* Check if the coefficients of the parameters are all integral.
- */
-static int integer_parameter(struct isl_tab *tab, int row)
-{
-	int i;
-	int col;
-	unsigned off = 2 + tab->M;
-
-	for (i = 0; i < tab->n_param; ++i) {
-		/* Eliminated parameter */
-		if (tab->var[i].is_row)
-			continue;
-		col = tab->var[i].index;
-		if (!isl_int_is_divisible_by(tab->mat->row[row][off + col],
-						tab->mat->row[row][0]))
-			return 0;
-	}
-	for (i = 0; i < tab->n_div; ++i) {
-		if (tab->var[tab->n_var - tab->n_div + i].is_row)
-			continue;
-		col = tab->var[tab->n_var - tab->n_div + i].index;
-		if (!isl_int_is_divisible_by(tab->mat->row[row][off + col],
-						tab->mat->row[row][0]))
-			return 0;
-	}
-	return 1;
-}
-
-/* Check if the coefficients of the non-parameter variables are all integral.
- */
-static int integer_variable(struct isl_tab *tab, int row)
-{
-	int i;
-	unsigned off = 2 + tab->M;
-
-	for (i = tab->n_dead; i < tab->n_col; ++i) {
-		if (tab->col_var[i] >= 0 &&
-		    (tab->col_var[i] < tab->n_param ||
-		     tab->col_var[i] >= tab->n_var - tab->n_div))
-			continue;
-		if (!isl_int_is_divisible_by(tab->mat->row[row][off + i],
-						tab->mat->row[row][0]))
-			return 0;
-	}
-	return 1;
-}
-
-/* Check if the constant term is integral.
- */
-static int integer_constant(struct isl_tab *tab, int row)
-{
-	return isl_int_is_divisible_by(tab->mat->row[row][1],
-					tab->mat->row[row][0]);
-}
-
-#define I_CST	1 << 0
-#define I_PAR	1 << 1
-#define I_VAR	1 << 2
-
-/* Check for next (non-parameter) variable after "var" (first if var == -1)
- * that is non-integer and therefore requires a cut and return
- * the index of the variable.
- * For parametric tableaus, there are three parts in a row,
- * the constant, the coefficients of the parameters and the rest.
- * For each part, we check whether the coefficients in that part
- * are all integral and if so, set the corresponding flag in *f.
- * If the constant and the parameter part are integral, then the
- * current sample value is integral and no cut is required
- * (irrespective of whether the variable part is integral).
- */
-static int next_non_integer_var(struct isl_tab *tab, int var, int *f)
-{
-	var = var < 0 ? tab->n_param : var + 1;
-
-	for (; var < tab->n_var - tab->n_div; ++var) {
-		int flags = 0;
-		int row;
-		if (!tab->var[var].is_row)
-			continue;
-		row = tab->var[var].index;
-		if (integer_constant(tab, row))
-			ISL_FL_SET(flags, I_CST);
-		if (integer_parameter(tab, row))
-			ISL_FL_SET(flags, I_PAR);
-		if (ISL_FL_ISSET(flags, I_CST) && ISL_FL_ISSET(flags, I_PAR))
-			continue;
-		if (integer_variable(tab, row))
-			ISL_FL_SET(flags, I_VAR);
-		*f = flags;
-		return var;
-	}
-	return -1;
-}
-
-/* Check for first (non-parameter) variable that is non-integer and
- * therefore requires a cut and return the corresponding row.
- * For parametric tableaus, there are three parts in a row,
- * the constant, the coefficients of the parameters and the rest.
- * For each part, we check whether the coefficients in that part
- * are all integral and if so, set the corresponding flag in *f.
- * If the constant and the parameter part are integral, then the
- * current sample value is integral and no cut is required
- * (irrespective of whether the variable part is integral).
- */
-static int first_non_integer_row(struct isl_tab *tab, int *f)
-{
-	int var = next_non_integer_var(tab, -1, f);
-
-	return var < 0 ? -1 : tab->var[var].index;
-}
-
-/* Add a (non-parametric) cut to cut away the non-integral sample
- * value of the given row.
- *
- * If the row is given by
- *
- *	m r = f + \sum_i a_i y_i
- *
- * then the cut is
- *
- *	c = - {-f/m} + \sum_i {a_i/m} y_i >= 0
- *
- * The big parameter, if any, is ignored, since it is assumed to be big
- * enough to be divisible by any integer.
- * If the tableau is actually a parametric tableau, then this function
- * is only called when all coefficients of the parameters are integral.
- * The cut therefore has zero coefficients for the parameters.
- *
- * The current value is known to be negative, so row_sign, if it
- * exists, is set accordingly.
- *
- * Return the row of the cut or -1.
- */
-static int add_cut(struct isl_tab *tab, int row)
-{
-	int i;
-	int r;
-	isl_int *r_row;
-	unsigned off = 2 + tab->M;
-
-	if (isl_tab_extend_cons(tab, 1) < 0)
-		return -1;
-	r = isl_tab_allocate_con(tab);
-	if (r < 0)
-		return -1;
-
-	r_row = tab->mat->row[tab->con[r].index];
-	isl_int_set(r_row[0], tab->mat->row[row][0]);
-	isl_int_neg(r_row[1], tab->mat->row[row][1]);
-	isl_int_fdiv_r(r_row[1], r_row[1], tab->mat->row[row][0]);
-	isl_int_neg(r_row[1], r_row[1]);
-	if (tab->M)
-		isl_int_set_si(r_row[2], 0);
-	for (i = 0; i < tab->n_col; ++i)
-		isl_int_fdiv_r(r_row[off + i],
-			tab->mat->row[row][off + i], tab->mat->row[row][0]);
-
-	tab->con[r].is_nonneg = 1;
-	if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r]) < 0)
-		return -1;
-	if (tab->row_sign)
-		tab->row_sign[tab->con[r].index] = isl_tab_row_neg;
-
-	return tab->con[r].index;
-}
-
-/* Given a non-parametric tableau, add cuts until an integer
- * sample point is obtained or until the tableau is determined
- * to be integer infeasible.
- * As long as there is any non-integer value in the sample point,
- * we add appropriate cuts, if possible, for each of these
- * non-integer values and then resolve the violated
- * cut constraints using restore_lexmin.
- * If one of the corresponding rows is equal to an integral
- * combination of variables/constraints plus a non-integral constant,
- * then there is no way to obtain an integer point and we return
- * a tableau that is marked empty.
- */
-static struct isl_tab *cut_to_integer_lexmin(struct isl_tab *tab)
-{
-	int var;
-	int row;
-	int flags;
-
-	if (!tab)
-		return NULL;
-	if (tab->empty)
-		return tab;
-
-	while ((var = next_non_integer_var(tab, -1, &flags)) != -1) {
-		do {
-			if (ISL_FL_ISSET(flags, I_VAR)) {
-				if (isl_tab_mark_empty(tab) < 0)
-					goto error;
-				return tab;
-			}
-			row = tab->var[var].index;
-			row = add_cut(tab, row);
-			if (row < 0)
-				goto error;
-		} while ((var = next_non_integer_var(tab, var, &flags)) != -1);
-		if (restore_lexmin(tab) < 0)
-			goto error;
-		if (tab->empty)
-			break;
-	}
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-/* Check whether all the currently active samples also satisfy the inequality
- * "ineq" (treated as an equality if eq is set).
- * Remove those samples that do not.
- */
-static struct isl_tab *check_samples(struct isl_tab *tab, isl_int *ineq, int eq)
-{
-	int i;
-	isl_int v;
-
-	if (!tab)
-		return NULL;
-
-	isl_assert(tab->mat->ctx, tab->bmap, goto error);
-	isl_assert(tab->mat->ctx, tab->samples, goto error);
-	isl_assert(tab->mat->ctx, tab->samples->n_col == 1 + tab->n_var, goto error);
-
-	isl_int_init(v);
-	for (i = tab->n_outside; i < tab->n_sample; ++i) {
-		int sgn;
-		isl_seq_inner_product(ineq, tab->samples->row[i],
-					1 + tab->n_var, &v);
-		sgn = isl_int_sgn(v);
-		if (eq ? (sgn == 0) : (sgn >= 0))
-			continue;
-		tab = isl_tab_drop_sample(tab, i);
-		if (!tab)
-			break;
-	}
-	isl_int_clear(v);
-
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-/* Check whether the sample value of the tableau is finite,
- * i.e., either the tableau does not use a big parameter, or
- * all values of the variables are equal to the big parameter plus
- * some constant.  This constant is the actual sample value.
- */
-static int sample_is_finite(struct isl_tab *tab)
-{
-	int i;
-
-	if (!tab->M)
-		return 1;
-
-	for (i = 0; i < tab->n_var; ++i) {
-		int row;
-		if (!tab->var[i].is_row)
-			return 0;
-		row = tab->var[i].index;
-		if (isl_int_ne(tab->mat->row[row][0], tab->mat->row[row][2]))
-			return 0;
-	}
-	return 1;
-}
-
-/* Check if the context tableau of sol has any integer points.
- * Leave tab in empty state if no integer point can be found.
- * If an integer point can be found and if moreover it is finite,
- * then it is added to the list of sample values.
- *
- * This function is only called when none of the currently active sample
- * values satisfies the most recently added constraint.
- */
-static struct isl_tab *check_integer_feasible(struct isl_tab *tab)
-{
-	struct isl_tab_undo *snap;
-
-	if (!tab)
-		return NULL;
-
-	snap = isl_tab_snap(tab);
-	if (isl_tab_push_basis(tab) < 0)
-		goto error;
-
-	tab = cut_to_integer_lexmin(tab);
-	if (!tab)
-		goto error;
-
-	if (!tab->empty && sample_is_finite(tab)) {
-		struct isl_vec *sample;
-
-		sample = isl_tab_get_sample_value(tab);
-
-		tab = isl_tab_add_sample(tab, sample);
-	}
-
-	if (!tab->empty && isl_tab_rollback(tab, snap) < 0)
-		goto error;
-
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-/* Check if any of the currently active sample values satisfies
- * the inequality "ineq" (an equality if eq is set).
- */
-static int tab_has_valid_sample(struct isl_tab *tab, isl_int *ineq, int eq)
-{
-	int i;
-	isl_int v;
-
-	if (!tab)
-		return -1;
-
-	isl_assert(tab->mat->ctx, tab->bmap, return -1);
-	isl_assert(tab->mat->ctx, tab->samples, return -1);
-	isl_assert(tab->mat->ctx, tab->samples->n_col == 1 + tab->n_var, return -1);
-
-	isl_int_init(v);
-	for (i = tab->n_outside; i < tab->n_sample; ++i) {
-		int sgn;
-		isl_seq_inner_product(ineq, tab->samples->row[i],
-					1 + tab->n_var, &v);
-		sgn = isl_int_sgn(v);
-		if (eq ? (sgn == 0) : (sgn >= 0))
-			break;
-	}
-	isl_int_clear(v);
-
-	return i < tab->n_sample;
-}
-
-/* Add a div specified by "div" to the tableau "tab" and return
- * 1 if the div is obviously non-negative.
- */
-static int context_tab_add_div(struct isl_tab *tab, struct isl_vec *div,
-	int (*add_ineq)(void *user, isl_int *), void *user)
-{
-	int i;
-	int r;
-	struct isl_mat *samples;
-	int nonneg;
-
-	r = isl_tab_add_div(tab, div, add_ineq, user);
-	if (r < 0)
-		return -1;
-	nonneg = tab->var[r].is_nonneg;
-	tab->var[r].frozen = 1;
-
-	samples = isl_mat_extend(tab->samples,
-			tab->n_sample, 1 + tab->n_var);
-	tab->samples = samples;
-	if (!samples)
-		return -1;
-	for (i = tab->n_outside; i < samples->n_row; ++i) {
-		isl_seq_inner_product(div->el + 1, samples->row[i],
-			div->size - 1, &samples->row[i][samples->n_col - 1]);
-		isl_int_fdiv_q(samples->row[i][samples->n_col - 1],
-			       samples->row[i][samples->n_col - 1], div->el[0]);
-	}
-
-	return nonneg;
-}
-
-/* Add a div specified by "div" to both the main tableau and
- * the context tableau.  In case of the main tableau, we only
- * need to add an extra div.  In the context tableau, we also
- * need to express the meaning of the div.
- * Return the index of the div or -1 if anything went wrong.
- */
-static int add_div(struct isl_tab *tab, struct isl_context *context,
-	struct isl_vec *div)
-{
-	int r;
-	int nonneg;
-
-	if ((nonneg = context->op->add_div(context, div)) < 0)
-		goto error;
-
-	if (!context->op->is_ok(context))
-		goto error;
-
-	if (isl_tab_extend_vars(tab, 1) < 0)
-		goto error;
-	r = isl_tab_allocate_var(tab);
-	if (r < 0)
-		goto error;
-	if (nonneg)
-		tab->var[r].is_nonneg = 1;
-	tab->var[r].frozen = 1;
-	tab->n_div++;
-
-	return tab->n_div - 1;
-error:
-	context->op->invalidate(context);
-	return -1;
-}
-
-static int find_div(struct isl_tab *tab, isl_int *div, isl_int denom)
-{
-	int i;
-	unsigned total = isl_basic_map_total_dim(tab->bmap);
-
-	for (i = 0; i < tab->bmap->n_div; ++i) {
-		if (isl_int_ne(tab->bmap->div[i][0], denom))
-			continue;
-		if (!isl_seq_eq(tab->bmap->div[i] + 1, div, 1 + total))
-			continue;
-		return i;
-	}
-	return -1;
-}
-
-/* Return the index of a div that corresponds to "div".
- * We first check if we already have such a div and if not, we create one.
- */
-static int get_div(struct isl_tab *tab, struct isl_context *context,
-	struct isl_vec *div)
-{
-	int d;
-	struct isl_tab *context_tab = context->op->peek_tab(context);
-
-	if (!context_tab)
-		return -1;
-
-	d = find_div(context_tab, div->el + 1, div->el[0]);
-	if (d != -1)
-		return d;
-
-	return add_div(tab, context, div);
-}
-
-/* Add a parametric cut to cut away the non-integral sample value
- * of the give row.
- * Let a_i be the coefficients of the constant term and the parameters
- * and let b_i be the coefficients of the variables or constraints
- * in basis of the tableau.
- * Let q be the div q = floor(\sum_i {-a_i} y_i).
- *
- * The cut is expressed as
- *
- *	c = \sum_i -{-a_i} y_i + \sum_i {b_i} x_i + q >= 0
- *
- * If q did not already exist in the context tableau, then it is added first.
- * If q is in a column of the main tableau then the "+ q" can be accomplished
- * by setting the corresponding entry to the denominator of the constraint.
- * If q happens to be in a row of the main tableau, then the corresponding
- * row needs to be added instead (taking care of the denominators).
- * Note that this is very unlikely, but perhaps not entirely impossible.
- *
- * The current value of the cut is known to be negative (or at least
- * non-positive), so row_sign is set accordingly.
- *
- * Return the row of the cut or -1.
- */
-static int add_parametric_cut(struct isl_tab *tab, int row,
-	struct isl_context *context)
-{
-	struct isl_vec *div;
-	int d;
-	int i;
-	int r;
-	isl_int *r_row;
-	int col;
-	int n;
-	unsigned off = 2 + tab->M;
-
-	if (!context)
-		return -1;
-
-	div = get_row_parameter_div(tab, row);
-	if (!div)
-		return -1;
-
-	n = tab->n_div;
-	d = context->op->get_div(context, tab, div);
-	if (d < 0)
-		return -1;
-
-	if (isl_tab_extend_cons(tab, 1) < 0)
-		return -1;
-	r = isl_tab_allocate_con(tab);
-	if (r < 0)
-		return -1;
-
-	r_row = tab->mat->row[tab->con[r].index];
-	isl_int_set(r_row[0], tab->mat->row[row][0]);
-	isl_int_neg(r_row[1], tab->mat->row[row][1]);
-	isl_int_fdiv_r(r_row[1], r_row[1], tab->mat->row[row][0]);
-	isl_int_neg(r_row[1], r_row[1]);
-	if (tab->M)
-		isl_int_set_si(r_row[2], 0);
-	for (i = 0; i < tab->n_param; ++i) {
-		if (tab->var[i].is_row)
-			continue;
-		col = tab->var[i].index;
-		isl_int_neg(r_row[off + col], tab->mat->row[row][off + col]);
-		isl_int_fdiv_r(r_row[off + col], r_row[off + col],
-				tab->mat->row[row][0]);
-		isl_int_neg(r_row[off + col], r_row[off + col]);
-	}
-	for (i = 0; i < tab->n_div; ++i) {
-		if (tab->var[tab->n_var - tab->n_div + i].is_row)
-			continue;
-		col = tab->var[tab->n_var - tab->n_div + i].index;
-		isl_int_neg(r_row[off + col], tab->mat->row[row][off + col]);
-		isl_int_fdiv_r(r_row[off + col], r_row[off + col],
-				tab->mat->row[row][0]);
-		isl_int_neg(r_row[off + col], r_row[off + col]);
-	}
-	for (i = 0; i < tab->n_col; ++i) {
-		if (tab->col_var[i] >= 0 &&
-		    (tab->col_var[i] < tab->n_param ||
-		     tab->col_var[i] >= tab->n_var - tab->n_div))
-			continue;
-		isl_int_fdiv_r(r_row[off + i],
-			tab->mat->row[row][off + i], tab->mat->row[row][0]);
-	}
-	if (tab->var[tab->n_var - tab->n_div + d].is_row) {
-		isl_int gcd;
-		int d_row = tab->var[tab->n_var - tab->n_div + d].index;
-		isl_int_init(gcd);
-		isl_int_gcd(gcd, tab->mat->row[d_row][0], r_row[0]);
-		isl_int_divexact(r_row[0], r_row[0], gcd);
-		isl_int_divexact(gcd, tab->mat->row[d_row][0], gcd);
-		isl_seq_combine(r_row + 1, gcd, r_row + 1,
-				r_row[0], tab->mat->row[d_row] + 1,
-				off - 1 + tab->n_col);
-		isl_int_mul(r_row[0], r_row[0], tab->mat->row[d_row][0]);
-		isl_int_clear(gcd);
-	} else {
-		col = tab->var[tab->n_var - tab->n_div + d].index;
-		isl_int_set(r_row[off + col], tab->mat->row[row][0]);
-	}
-
-	tab->con[r].is_nonneg = 1;
-	if (isl_tab_push_var(tab, isl_tab_undo_nonneg, &tab->con[r]) < 0)
-		return -1;
-	if (tab->row_sign)
-		tab->row_sign[tab->con[r].index] = isl_tab_row_neg;
-
-	isl_vec_free(div);
-
-	row = tab->con[r].index;
-
-	if (d >= n && context->op->detect_equalities(context, tab) < 0)
-		return -1;
-
-	return row;
-}
-
-/* Construct a tableau for bmap that can be used for computing
- * the lexicographic minimum (or maximum) of bmap.
- * If not NULL, then dom is the domain where the minimum
- * should be computed.  In this case, we set up a parametric
- * tableau with row signs (initialized to "unknown").
- * If M is set, then the tableau will use a big parameter.
- * If max is set, then a maximum should be computed instead of a minimum.
- * This means that for each variable x, the tableau will contain the variable
- * x' = M - x, rather than x' = M + x.  This in turn means that the coefficient
- * of the variables in all constraints are negated prior to adding them
- * to the tableau.
- */
-static struct isl_tab *tab_for_lexmin(struct isl_basic_map *bmap,
-	struct isl_basic_set *dom, unsigned M, int max)
-{
-	int i;
-	struct isl_tab *tab;
-
-	tab = isl_tab_alloc(bmap->ctx, 2 * bmap->n_eq + bmap->n_ineq + 1,
-			    isl_basic_map_total_dim(bmap), M);
-	if (!tab)
-		return NULL;
-
-	tab->rational = ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL);
-	if (dom) {
-		tab->n_param = isl_basic_set_total_dim(dom) - dom->n_div;
-		tab->n_div = dom->n_div;
-		tab->row_sign = isl_calloc_array(bmap->ctx,
-					enum isl_tab_row_sign, tab->mat->n_row);
-		if (!tab->row_sign)
-			goto error;
-	}
-	if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_EMPTY)) {
-		if (isl_tab_mark_empty(tab) < 0)
-			goto error;
-		return tab;
-	}
-
-	for (i = tab->n_param; i < tab->n_var - tab->n_div; ++i) {
-		tab->var[i].is_nonneg = 1;
-		tab->var[i].frozen = 1;
-	}
-	for (i = 0; i < bmap->n_eq; ++i) {
-		if (max)
-			isl_seq_neg(bmap->eq[i] + 1 + tab->n_param,
-				    bmap->eq[i] + 1 + tab->n_param,
-				    tab->n_var - tab->n_param - tab->n_div);
-		tab = add_lexmin_valid_eq(tab, bmap->eq[i]);
-		if (max)
-			isl_seq_neg(bmap->eq[i] + 1 + tab->n_param,
-				    bmap->eq[i] + 1 + tab->n_param,
-				    tab->n_var - tab->n_param - tab->n_div);
-		if (!tab || tab->empty)
-			return tab;
-	}
-	if (bmap->n_eq && restore_lexmin(tab) < 0)
-		goto error;
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		if (max)
-			isl_seq_neg(bmap->ineq[i] + 1 + tab->n_param,
-				    bmap->ineq[i] + 1 + tab->n_param,
-				    tab->n_var - tab->n_param - tab->n_div);
-		tab = add_lexmin_ineq(tab, bmap->ineq[i]);
-		if (max)
-			isl_seq_neg(bmap->ineq[i] + 1 + tab->n_param,
-				    bmap->ineq[i] + 1 + tab->n_param,
-				    tab->n_var - tab->n_param - tab->n_div);
-		if (!tab || tab->empty)
-			return tab;
-	}
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-/* Given a main tableau where more than one row requires a split,
- * determine and return the "best" row to split on.
- *
- * Given two rows in the main tableau, if the inequality corresponding
- * to the first row is redundant with respect to that of the second row
- * in the current tableau, then it is better to split on the second row,
- * since in the positive part, both row will be positive.
- * (In the negative part a pivot will have to be performed and just about
- * anything can happen to the sign of the other row.)
- *
- * As a simple heuristic, we therefore select the row that makes the most
- * of the other rows redundant.
- *
- * Perhaps it would also be useful to look at the number of constraints
- * that conflict with any given constraint.
- */
-static int best_split(struct isl_tab *tab, struct isl_tab *context_tab)
-{
-	struct isl_tab_undo *snap;
-	int split;
-	int row;
-	int best = -1;
-	int best_r;
-
-	if (isl_tab_extend_cons(context_tab, 2) < 0)
-		return -1;
-
-	snap = isl_tab_snap(context_tab);
-
-	for (split = tab->n_redundant; split < tab->n_row; ++split) {
-		struct isl_tab_undo *snap2;
-		struct isl_vec *ineq = NULL;
-		int r = 0;
-		int ok;
-
-		if (!isl_tab_var_from_row(tab, split)->is_nonneg)
-			continue;
-		if (tab->row_sign[split] != isl_tab_row_any)
-			continue;
-
-		ineq = get_row_parameter_ineq(tab, split);
-		if (!ineq)
-			return -1;
-		ok = isl_tab_add_ineq(context_tab, ineq->el) >= 0;
-		isl_vec_free(ineq);
-		if (!ok)
-			return -1;
-
-		snap2 = isl_tab_snap(context_tab);
-
-		for (row = tab->n_redundant; row < tab->n_row; ++row) {
-			struct isl_tab_var *var;
-
-			if (row == split)
-				continue;
-			if (!isl_tab_var_from_row(tab, row)->is_nonneg)
-				continue;
-			if (tab->row_sign[row] != isl_tab_row_any)
-				continue;
-
-			ineq = get_row_parameter_ineq(tab, row);
-			if (!ineq)
-				return -1;
-			ok = isl_tab_add_ineq(context_tab, ineq->el) >= 0;
-			isl_vec_free(ineq);
-			if (!ok)
-				return -1;
-			var = &context_tab->con[context_tab->n_con - 1];
-			if (!context_tab->empty &&
-			    !isl_tab_min_at_most_neg_one(context_tab, var))
-				r++;
-			if (isl_tab_rollback(context_tab, snap2) < 0)
-				return -1;
-		}
-		if (best == -1 || r > best_r) {
-			best = split;
-			best_r = r;
-		}
-		if (isl_tab_rollback(context_tab, snap) < 0)
-			return -1;
-	}
-
-	return best;
-}
-
-static struct isl_basic_set *context_lex_peek_basic_set(
-	struct isl_context *context)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	if (!clex->tab)
-		return NULL;
-	return isl_tab_peek_bset(clex->tab);
-}
-
-static struct isl_tab *context_lex_peek_tab(struct isl_context *context)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	return clex->tab;
-}
-
-static void context_lex_add_eq(struct isl_context *context, isl_int *eq,
-		int check, int update)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	if (isl_tab_extend_cons(clex->tab, 2) < 0)
-		goto error;
-	if (add_lexmin_eq(clex->tab, eq) < 0)
-		goto error;
-	if (check) {
-		int v = tab_has_valid_sample(clex->tab, eq, 1);
-		if (v < 0)
-			goto error;
-		if (!v)
-			clex->tab = check_integer_feasible(clex->tab);
-	}
-	if (update)
-		clex->tab = check_samples(clex->tab, eq, 1);
-	return;
-error:
-	isl_tab_free(clex->tab);
-	clex->tab = NULL;
-}
-
-static void context_lex_add_ineq(struct isl_context *context, isl_int *ineq,
-		int check, int update)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	if (isl_tab_extend_cons(clex->tab, 1) < 0)
-		goto error;
-	clex->tab = add_lexmin_ineq(clex->tab, ineq);
-	if (check) {
-		int v = tab_has_valid_sample(clex->tab, ineq, 0);
-		if (v < 0)
-			goto error;
-		if (!v)
-			clex->tab = check_integer_feasible(clex->tab);
-	}
-	if (update)
-		clex->tab = check_samples(clex->tab, ineq, 0);
-	return;
-error:
-	isl_tab_free(clex->tab);
-	clex->tab = NULL;
-}
-
-static int context_lex_add_ineq_wrap(void *user, isl_int *ineq)
-{
-	struct isl_context *context = (struct isl_context *)user;
-	context_lex_add_ineq(context, ineq, 0, 0);
-	return context->op->is_ok(context) ? 0 : -1;
-}
-
-/* Check which signs can be obtained by "ineq" on all the currently
- * active sample values.  See row_sign for more information.
- */
-static enum isl_tab_row_sign tab_ineq_sign(struct isl_tab *tab, isl_int *ineq,
-	int strict)
-{
-	int i;
-	int sgn;
-	isl_int tmp;
-	enum isl_tab_row_sign res = isl_tab_row_unknown;
-
-	isl_assert(tab->mat->ctx, tab->samples, return isl_tab_row_unknown);
-	isl_assert(tab->mat->ctx, tab->samples->n_col == 1 + tab->n_var,
-			return isl_tab_row_unknown);
-
-	isl_int_init(tmp);
-	for (i = tab->n_outside; i < tab->n_sample; ++i) {
-		isl_seq_inner_product(tab->samples->row[i], ineq,
-					1 + tab->n_var, &tmp);
-		sgn = isl_int_sgn(tmp);
-		if (sgn > 0 || (sgn == 0 && strict)) {
-			if (res == isl_tab_row_unknown)
-				res = isl_tab_row_pos;
-			if (res == isl_tab_row_neg)
-				res = isl_tab_row_any;
-		}
-		if (sgn < 0) {
-			if (res == isl_tab_row_unknown)
-				res = isl_tab_row_neg;
-			if (res == isl_tab_row_pos)
-				res = isl_tab_row_any;
-		}
-		if (res == isl_tab_row_any)
-			break;
-	}
-	isl_int_clear(tmp);
-
-	return res;
-}
-
-static enum isl_tab_row_sign context_lex_ineq_sign(struct isl_context *context,
-			isl_int *ineq, int strict)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	return tab_ineq_sign(clex->tab, ineq, strict);
-}
-
-/* Check whether "ineq" can be added to the tableau without rendering
- * it infeasible.
- */
-static int context_lex_test_ineq(struct isl_context *context, isl_int *ineq)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	struct isl_tab_undo *snap;
-	int feasible;
-
-	if (!clex->tab)
-		return -1;
-
-	if (isl_tab_extend_cons(clex->tab, 1) < 0)
-		return -1;
-
-	snap = isl_tab_snap(clex->tab);
-	if (isl_tab_push_basis(clex->tab) < 0)
-		return -1;
-	clex->tab = add_lexmin_ineq(clex->tab, ineq);
-	clex->tab = check_integer_feasible(clex->tab);
-	if (!clex->tab)
-		return -1;
-	feasible = !clex->tab->empty;
-	if (isl_tab_rollback(clex->tab, snap) < 0)
-		return -1;
-
-	return feasible;
-}
-
-static int context_lex_get_div(struct isl_context *context, struct isl_tab *tab,
-		struct isl_vec *div)
-{
-	return get_div(tab, context, div);
-}
-
-/* Add a div specified by "div" to the context tableau and return
- * 1 if the div is obviously non-negative.
- * context_tab_add_div will always return 1, because all variables
- * in a isl_context_lex tableau are non-negative.
- * However, if we are using a big parameter in the context, then this only
- * reflects the non-negativity of the variable used to _encode_ the
- * div, i.e., div' = M + div, so we can't draw any conclusions.
- */
-static int context_lex_add_div(struct isl_context *context, struct isl_vec *div)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	int nonneg;
-	nonneg = context_tab_add_div(clex->tab, div,
-					context_lex_add_ineq_wrap, context);
-	if (nonneg < 0)
-		return -1;
-	if (clex->tab->M)
-		return 0;
-	return nonneg;
-}
-
-static int context_lex_detect_equalities(struct isl_context *context,
-		struct isl_tab *tab)
-{
-	return 0;
-}
-
-static int context_lex_best_split(struct isl_context *context,
-		struct isl_tab *tab)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	struct isl_tab_undo *snap;
-	int r;
-
-	snap = isl_tab_snap(clex->tab);
-	if (isl_tab_push_basis(clex->tab) < 0)
-		return -1;
-	r = best_split(tab, clex->tab);
-
-	if (r >= 0 && isl_tab_rollback(clex->tab, snap) < 0)
-		return -1;
-
-	return r;
-}
-
-static int context_lex_is_empty(struct isl_context *context)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	if (!clex->tab)
-		return -1;
-	return clex->tab->empty;
-}
-
-static void *context_lex_save(struct isl_context *context)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	struct isl_tab_undo *snap;
-
-	snap = isl_tab_snap(clex->tab);
-	if (isl_tab_push_basis(clex->tab) < 0)
-		return NULL;
-	if (isl_tab_save_samples(clex->tab) < 0)
-		return NULL;
-
-	return snap;
-}
-
-static void context_lex_restore(struct isl_context *context, void *save)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	if (isl_tab_rollback(clex->tab, (struct isl_tab_undo *)save) < 0) {
-		isl_tab_free(clex->tab);
-		clex->tab = NULL;
-	}
-}
-
-static int context_lex_is_ok(struct isl_context *context)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	return !!clex->tab;
-}
-
-/* For each variable in the context tableau, check if the variable can
- * only attain non-negative values.  If so, mark the parameter as non-negative
- * in the main tableau.  This allows for a more direct identification of some
- * cases of violated constraints.
- */
-static struct isl_tab *tab_detect_nonnegative_parameters(struct isl_tab *tab,
-	struct isl_tab *context_tab)
-{
-	int i;
-	struct isl_tab_undo *snap;
-	struct isl_vec *ineq = NULL;
-	struct isl_tab_var *var;
-	int n;
-
-	if (context_tab->n_var == 0)
-		return tab;
-
-	ineq = isl_vec_alloc(tab->mat->ctx, 1 + context_tab->n_var);
-	if (!ineq)
-		goto error;
-
-	if (isl_tab_extend_cons(context_tab, 1) < 0)
-		goto error;
-
-	snap = isl_tab_snap(context_tab);
-
-	n = 0;
-	isl_seq_clr(ineq->el, ineq->size);
-	for (i = 0; i < context_tab->n_var; ++i) {
-		isl_int_set_si(ineq->el[1 + i], 1);
-		if (isl_tab_add_ineq(context_tab, ineq->el) < 0)
-			goto error;
-		var = &context_tab->con[context_tab->n_con - 1];
-		if (!context_tab->empty &&
-		    !isl_tab_min_at_most_neg_one(context_tab, var)) {
-			int j = i;
-			if (i >= tab->n_param)
-				j = i - tab->n_param + tab->n_var - tab->n_div;
-			tab->var[j].is_nonneg = 1;
-			n++;
-		}
-		isl_int_set_si(ineq->el[1 + i], 0);
-		if (isl_tab_rollback(context_tab, snap) < 0)
-			goto error;
-	}
-
-	if (context_tab->M && n == context_tab->n_var) {
-		context_tab->mat = isl_mat_drop_cols(context_tab->mat, 2, 1);
-		context_tab->M = 0;
-	}
-
-	isl_vec_free(ineq);
-	return tab;
-error:
-	isl_vec_free(ineq);
-	isl_tab_free(tab);
-	return NULL;
-}
-
-static struct isl_tab *context_lex_detect_nonnegative_parameters(
-	struct isl_context *context, struct isl_tab *tab)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	struct isl_tab_undo *snap;
-
-	if (!tab)
-		return NULL;
-
-	snap = isl_tab_snap(clex->tab);
-	if (isl_tab_push_basis(clex->tab) < 0)
-		goto error;
-
-	tab = tab_detect_nonnegative_parameters(tab, clex->tab);
-
-	if (isl_tab_rollback(clex->tab, snap) < 0)
-		goto error;
-
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-static void context_lex_invalidate(struct isl_context *context)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	isl_tab_free(clex->tab);
-	clex->tab = NULL;
-}
-
-static void context_lex_free(struct isl_context *context)
-{
-	struct isl_context_lex *clex = (struct isl_context_lex *)context;
-	isl_tab_free(clex->tab);
-	free(clex);
-}
-
-struct isl_context_op isl_context_lex_op = {
-	context_lex_detect_nonnegative_parameters,
-	context_lex_peek_basic_set,
-	context_lex_peek_tab,
-	context_lex_add_eq,
-	context_lex_add_ineq,
-	context_lex_ineq_sign,
-	context_lex_test_ineq,
-	context_lex_get_div,
-	context_lex_add_div,
-	context_lex_detect_equalities,
-	context_lex_best_split,
-	context_lex_is_empty,
-	context_lex_is_ok,
-	context_lex_save,
-	context_lex_restore,
-	context_lex_invalidate,
-	context_lex_free,
-};
-
-static struct isl_tab *context_tab_for_lexmin(struct isl_basic_set *bset)
-{
-	struct isl_tab *tab;
-
-	bset = isl_basic_set_cow(bset);
-	if (!bset)
-		return NULL;
-	tab = tab_for_lexmin((struct isl_basic_map *)bset, NULL, 1, 0);
-	if (!tab)
-		goto error;
-	if (isl_tab_track_bset(tab, bset) < 0)
-		goto error;
-	tab = isl_tab_init_samples(tab);
-	return tab;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-static struct isl_context *isl_context_lex_alloc(struct isl_basic_set *dom)
-{
-	struct isl_context_lex *clex;
-
-	if (!dom)
-		return NULL;
-
-	clex = isl_alloc_type(dom->ctx, struct isl_context_lex);
-	if (!clex)
-		return NULL;
-
-	clex->context.op = &isl_context_lex_op;
-
-	clex->tab = context_tab_for_lexmin(isl_basic_set_copy(dom));
-	if (restore_lexmin(clex->tab) < 0)
-		goto error;
-	clex->tab = check_integer_feasible(clex->tab);
-	if (!clex->tab)
-		goto error;
-
-	return &clex->context;
-error:
-	clex->context.op->free(&clex->context);
-	return NULL;
-}
-
-struct isl_context_gbr {
-	struct isl_context context;
-	struct isl_tab *tab;
-	struct isl_tab *shifted;
-	struct isl_tab *cone;
-};
-
-static struct isl_tab *context_gbr_detect_nonnegative_parameters(
-	struct isl_context *context, struct isl_tab *tab)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	if (!tab)
-		return NULL;
-	return tab_detect_nonnegative_parameters(tab, cgbr->tab);
-}
-
-static struct isl_basic_set *context_gbr_peek_basic_set(
-	struct isl_context *context)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	if (!cgbr->tab)
-		return NULL;
-	return isl_tab_peek_bset(cgbr->tab);
-}
-
-static struct isl_tab *context_gbr_peek_tab(struct isl_context *context)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	return cgbr->tab;
-}
-
-/* Initialize the "shifted" tableau of the context, which
- * contains the constraints of the original tableau shifted
- * by the sum of all negative coefficients.  This ensures
- * that any rational point in the shifted tableau can
- * be rounded up to yield an integer point in the original tableau.
- */
-static void gbr_init_shifted(struct isl_context_gbr *cgbr)
-{
-	int i, j;
-	struct isl_vec *cst;
-	struct isl_basic_set *bset = isl_tab_peek_bset(cgbr->tab);
-	unsigned dim = isl_basic_set_total_dim(bset);
-
-	cst = isl_vec_alloc(cgbr->tab->mat->ctx, bset->n_ineq);
-	if (!cst)
-		return;
-
-	for (i = 0; i < bset->n_ineq; ++i) {
-		isl_int_set(cst->el[i], bset->ineq[i][0]);
-		for (j = 0; j < dim; ++j) {
-			if (!isl_int_is_neg(bset->ineq[i][1 + j]))
-				continue;
-			isl_int_add(bset->ineq[i][0], bset->ineq[i][0],
-				    bset->ineq[i][1 + j]);
-		}
-	}
-
-	cgbr->shifted = isl_tab_from_basic_set(bset);
-
-	for (i = 0; i < bset->n_ineq; ++i)
-		isl_int_set(bset->ineq[i][0], cst->el[i]);
-
-	isl_vec_free(cst);
-}
-
-/* Check if the shifted tableau is non-empty, and if so
- * use the sample point to construct an integer point
- * of the context tableau.
- */
-static struct isl_vec *gbr_get_shifted_sample(struct isl_context_gbr *cgbr)
-{
-	struct isl_vec *sample;
-
-	if (!cgbr->shifted)
-		gbr_init_shifted(cgbr);
-	if (!cgbr->shifted)
-		return NULL;
-	if (cgbr->shifted->empty)
-		return isl_vec_alloc(cgbr->tab->mat->ctx, 0);
-
-	sample = isl_tab_get_sample_value(cgbr->shifted);
-	sample = isl_vec_ceil(sample);
-
-	return sample;
-}
-
-static struct isl_basic_set *drop_constant_terms(struct isl_basic_set *bset)
-{
-	int i;
-
-	if (!bset)
-		return NULL;
-
-	for (i = 0; i < bset->n_eq; ++i)
-		isl_int_set_si(bset->eq[i][0], 0);
-
-	for (i = 0; i < bset->n_ineq; ++i)
-		isl_int_set_si(bset->ineq[i][0], 0);
-
-	return bset;
-}
-
-static int use_shifted(struct isl_context_gbr *cgbr)
-{
-	return cgbr->tab->bmap->n_eq == 0 && cgbr->tab->bmap->n_div == 0;
-}
-
-static struct isl_vec *gbr_get_sample(struct isl_context_gbr *cgbr)
-{
-	struct isl_basic_set *bset;
-	struct isl_basic_set *cone;
-
-	if (isl_tab_sample_is_integer(cgbr->tab))
-		return isl_tab_get_sample_value(cgbr->tab);
-
-	if (use_shifted(cgbr)) {
-		struct isl_vec *sample;
-
-		sample = gbr_get_shifted_sample(cgbr);
-		if (!sample || sample->size > 0)
-			return sample;
-
-		isl_vec_free(sample);
-	}
-
-	if (!cgbr->cone) {
-		bset = isl_tab_peek_bset(cgbr->tab);
-		cgbr->cone = isl_tab_from_recession_cone(bset, 0);
-		if (!cgbr->cone)
-			return NULL;
-		if (isl_tab_track_bset(cgbr->cone, isl_basic_set_dup(bset)) < 0)
-			return NULL;
-	}
-	if (isl_tab_detect_implicit_equalities(cgbr->cone) < 0)
-		return NULL;
-
-	if (cgbr->cone->n_dead == cgbr->cone->n_col) {
-		struct isl_vec *sample;
-		struct isl_tab_undo *snap;
-
-		if (cgbr->tab->basis) {
-			if (cgbr->tab->basis->n_col != 1 + cgbr->tab->n_var) {
-				isl_mat_free(cgbr->tab->basis);
-				cgbr->tab->basis = NULL;
-			}
-			cgbr->tab->n_zero = 0;
-			cgbr->tab->n_unbounded = 0;
-		}
-
-		snap = isl_tab_snap(cgbr->tab);
-
-		sample = isl_tab_sample(cgbr->tab);
-
-		if (isl_tab_rollback(cgbr->tab, snap) < 0) {
-			isl_vec_free(sample);
-			return NULL;
-		}
-
-		return sample;
-	}
-
-	cone = isl_basic_set_dup(isl_tab_peek_bset(cgbr->cone));
-	cone = drop_constant_terms(cone);
-	cone = isl_basic_set_update_from_tab(cone, cgbr->cone);
-	cone = isl_basic_set_underlying_set(cone);
-	cone = isl_basic_set_gauss(cone, NULL);
-
-	bset = isl_basic_set_dup(isl_tab_peek_bset(cgbr->tab));
-	bset = isl_basic_set_update_from_tab(bset, cgbr->tab);
-	bset = isl_basic_set_underlying_set(bset);
-	bset = isl_basic_set_gauss(bset, NULL);
-
-	return isl_basic_set_sample_with_cone(bset, cone);
-}
-
-static void check_gbr_integer_feasible(struct isl_context_gbr *cgbr)
-{
-	struct isl_vec *sample;
-
-	if (!cgbr->tab)
-		return;
-
-	if (cgbr->tab->empty)
-		return;
-
-	sample = gbr_get_sample(cgbr);
-	if (!sample)
-		goto error;
-
-	if (sample->size == 0) {
-		isl_vec_free(sample);
-		if (isl_tab_mark_empty(cgbr->tab) < 0)
-			goto error;
-		return;
-	}
-
-	cgbr->tab = isl_tab_add_sample(cgbr->tab, sample);
-
-	return;
-error:
-	isl_tab_free(cgbr->tab);
-	cgbr->tab = NULL;
-}
-
-static struct isl_tab *add_gbr_eq(struct isl_tab *tab, isl_int *eq)
-{
-	if (!tab)
-		return NULL;
-
-	if (isl_tab_extend_cons(tab, 2) < 0)
-		goto error;
-
-	if (isl_tab_add_eq(tab, eq) < 0)
-		goto error;
-
-	return tab;
-error:
-	isl_tab_free(tab);
-	return NULL;
-}
-
-static void context_gbr_add_eq(struct isl_context *context, isl_int *eq,
-		int check, int update)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-
-	cgbr->tab = add_gbr_eq(cgbr->tab, eq);
-
-	if (cgbr->cone && cgbr->cone->n_col != cgbr->cone->n_dead) {
-		if (isl_tab_extend_cons(cgbr->cone, 2) < 0)
-			goto error;
-		if (isl_tab_add_eq(cgbr->cone, eq) < 0)
-			goto error;
-	}
-
-	if (check) {
-		int v = tab_has_valid_sample(cgbr->tab, eq, 1);
-		if (v < 0)
-			goto error;
-		if (!v)
-			check_gbr_integer_feasible(cgbr);
-	}
-	if (update)
-		cgbr->tab = check_samples(cgbr->tab, eq, 1);
-	return;
-error:
-	isl_tab_free(cgbr->tab);
-	cgbr->tab = NULL;
-}
-
-static void add_gbr_ineq(struct isl_context_gbr *cgbr, isl_int *ineq)
-{
-	if (!cgbr->tab)
-		return;
-
-	if (isl_tab_extend_cons(cgbr->tab, 1) < 0)
-		goto error;
-
-	if (isl_tab_add_ineq(cgbr->tab, ineq) < 0)
-		goto error;
-
-	if (cgbr->shifted && !cgbr->shifted->empty && use_shifted(cgbr)) {
-		int i;
-		unsigned dim;
-		dim = isl_basic_map_total_dim(cgbr->tab->bmap);
-
-		if (isl_tab_extend_cons(cgbr->shifted, 1) < 0)
-			goto error;
-
-		for (i = 0; i < dim; ++i) {
-			if (!isl_int_is_neg(ineq[1 + i]))
-				continue;
-			isl_int_add(ineq[0], ineq[0], ineq[1 + i]);
-		}
-
-		if (isl_tab_add_ineq(cgbr->shifted, ineq) < 0)
-			goto error;
-
-		for (i = 0; i < dim; ++i) {
-			if (!isl_int_is_neg(ineq[1 + i]))
-				continue;
-			isl_int_sub(ineq[0], ineq[0], ineq[1 + i]);
-		}
-	}
-
-	if (cgbr->cone && cgbr->cone->n_col != cgbr->cone->n_dead) {
-		if (isl_tab_extend_cons(cgbr->cone, 1) < 0)
-			goto error;
-		if (isl_tab_add_ineq(cgbr->cone, ineq) < 0)
-			goto error;
-	}
-
-	return;
-error:
-	isl_tab_free(cgbr->tab);
-	cgbr->tab = NULL;
-}
-
-static void context_gbr_add_ineq(struct isl_context *context, isl_int *ineq,
-		int check, int update)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-
-	add_gbr_ineq(cgbr, ineq);
-	if (!cgbr->tab)
-		return;
-
-	if (check) {
-		int v = tab_has_valid_sample(cgbr->tab, ineq, 0);
-		if (v < 0)
-			goto error;
-		if (!v)
-			check_gbr_integer_feasible(cgbr);
-	}
-	if (update)
-		cgbr->tab = check_samples(cgbr->tab, ineq, 0);
-	return;
-error:
-	isl_tab_free(cgbr->tab);
-	cgbr->tab = NULL;
-}
-
-static int context_gbr_add_ineq_wrap(void *user, isl_int *ineq)
-{
-	struct isl_context *context = (struct isl_context *)user;
-	context_gbr_add_ineq(context, ineq, 0, 0);
-	return context->op->is_ok(context) ? 0 : -1;
-}
-
-static enum isl_tab_row_sign context_gbr_ineq_sign(struct isl_context *context,
-			isl_int *ineq, int strict)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	return tab_ineq_sign(cgbr->tab, ineq, strict);
-}
-
-/* Check whether "ineq" can be added to the tableau without rendering
- * it infeasible.
- */
-static int context_gbr_test_ineq(struct isl_context *context, isl_int *ineq)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	struct isl_tab_undo *snap;
-	struct isl_tab_undo *shifted_snap = NULL;
-	struct isl_tab_undo *cone_snap = NULL;
-	int feasible;
-
-	if (!cgbr->tab)
-		return -1;
-
-	if (isl_tab_extend_cons(cgbr->tab, 1) < 0)
-		return -1;
-
-	snap = isl_tab_snap(cgbr->tab);
-	if (cgbr->shifted)
-		shifted_snap = isl_tab_snap(cgbr->shifted);
-	if (cgbr->cone)
-		cone_snap = isl_tab_snap(cgbr->cone);
-	add_gbr_ineq(cgbr, ineq);
-	check_gbr_integer_feasible(cgbr);
-	if (!cgbr->tab)
-		return -1;
-	feasible = !cgbr->tab->empty;
-	if (isl_tab_rollback(cgbr->tab, snap) < 0)
-		return -1;
-	if (shifted_snap) {
-		if (isl_tab_rollback(cgbr->shifted, shifted_snap))
-			return -1;
-	} else if (cgbr->shifted) {
-		isl_tab_free(cgbr->shifted);
-		cgbr->shifted = NULL;
-	}
-	if (cone_snap) {
-		if (isl_tab_rollback(cgbr->cone, cone_snap))
-			return -1;
-	} else if (cgbr->cone) {
-		isl_tab_free(cgbr->cone);
-		cgbr->cone = NULL;
-	}
-
-	return feasible;
-}
-
-/* Return the column of the last of the variables associated to
- * a column that has a non-zero coefficient.
- * This function is called in a context where only coefficients
- * of parameters or divs can be non-zero.
- */
-static int last_non_zero_var_col(struct isl_tab *tab, isl_int *p)
-{
-	int i;
-	int col;
-
-	if (tab->n_var == 0)
-		return -1;
-
-	for (i = tab->n_var - 1; i >= 0; --i) {
-		if (i >= tab->n_param && i < tab->n_var - tab->n_div)
-			continue;
-		if (tab->var[i].is_row)
-			continue;
-		col = tab->var[i].index;
-		if (!isl_int_is_zero(p[col]))
-			return col;
-	}
-
-	return -1;
-}
-
-/* Look through all the recently added equalities in the context
- * to see if we can propagate any of them to the main tableau.
- *
- * The newly added equalities in the context are encoded as pairs
- * of inequalities starting at inequality "first".
- *
- * We tentatively add each of these equalities to the main tableau
- * and if this happens to result in a row with a final coefficient
- * that is one or negative one, we use it to kill a column
- * in the main tableau.  Otherwise, we discard the tentatively
- * added row.
- */
-static void propagate_equalities(struct isl_context_gbr *cgbr,
-	struct isl_tab *tab, unsigned first)
-{
-	int i;
-	struct isl_vec *eq = NULL;
-
-	eq = isl_vec_alloc(tab->mat->ctx, 1 + tab->n_var);
-	if (!eq)
-		goto error;
-
-	if (isl_tab_extend_cons(tab, (cgbr->tab->bmap->n_ineq - first)/2) < 0)
-		goto error;
-
-	isl_seq_clr(eq->el + 1 + tab->n_param,
-		    tab->n_var - tab->n_param - tab->n_div);
-	for (i = first; i < cgbr->tab->bmap->n_ineq; i += 2) {
-		int j;
-		int r;
-		struct isl_tab_undo *snap;
-		snap = isl_tab_snap(tab);
-
-		isl_seq_cpy(eq->el, cgbr->tab->bmap->ineq[i], 1 + tab->n_param);
-		isl_seq_cpy(eq->el + 1 + tab->n_var - tab->n_div,
-			    cgbr->tab->bmap->ineq[i] + 1 + tab->n_param,
-			    tab->n_div);
-
-		r = isl_tab_add_row(tab, eq->el);
-		if (r < 0)
-			goto error;
-		r = tab->con[r].index;
-		j = last_non_zero_var_col(tab, tab->mat->row[r] + 2 + tab->M);
-		if (j < 0 || j < tab->n_dead ||
-		    !isl_int_is_one(tab->mat->row[r][0]) ||
-		    (!isl_int_is_one(tab->mat->row[r][2 + tab->M + j]) &&
-		     !isl_int_is_negone(tab->mat->row[r][2 + tab->M + j]))) {
-			if (isl_tab_rollback(tab, snap) < 0)
-				goto error;
-			continue;
-		}
-		if (isl_tab_pivot(tab, r, j) < 0)
-			goto error;
-		if (isl_tab_kill_col(tab, j) < 0)
-			goto error;
-
-		if (restore_lexmin(tab) < 0)
-			goto error;
-	}
-
-	isl_vec_free(eq);
-
-	return;
-error:
-	isl_vec_free(eq);
-	isl_tab_free(cgbr->tab);
-	cgbr->tab = NULL;
-}
-
-static int context_gbr_detect_equalities(struct isl_context *context,
-	struct isl_tab *tab)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	struct isl_ctx *ctx;
-	unsigned n_ineq;
-
-	ctx = cgbr->tab->mat->ctx;
-
-	if (!cgbr->cone) {
-		struct isl_basic_set *bset = isl_tab_peek_bset(cgbr->tab);
-		cgbr->cone = isl_tab_from_recession_cone(bset, 0);
-		if (!cgbr->cone)
-			goto error;
-		if (isl_tab_track_bset(cgbr->cone, isl_basic_set_dup(bset)) < 0)
-			goto error;
-	}
-	if (isl_tab_detect_implicit_equalities(cgbr->cone) < 0)
-		goto error;
-
-	n_ineq = cgbr->tab->bmap->n_ineq;
-	cgbr->tab = isl_tab_detect_equalities(cgbr->tab, cgbr->cone);
-	if (cgbr->tab && cgbr->tab->bmap->n_ineq > n_ineq)
-		propagate_equalities(cgbr, tab, n_ineq);
-
-	return 0;
-error:
-	isl_tab_free(cgbr->tab);
-	cgbr->tab = NULL;
-	return -1;
-}
-
-static int context_gbr_get_div(struct isl_context *context, struct isl_tab *tab,
-		struct isl_vec *div)
-{
-	return get_div(tab, context, div);
-}
-
-static int context_gbr_add_div(struct isl_context *context, struct isl_vec *div)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	if (cgbr->cone) {
-		int k;
-
-		if (isl_tab_extend_cons(cgbr->cone, 3) < 0)
-			return -1;
-		if (isl_tab_extend_vars(cgbr->cone, 1) < 0)
-			return -1;
-		if (isl_tab_allocate_var(cgbr->cone) <0)
-			return -1;
-
-		cgbr->cone->bmap = isl_basic_map_extend_space(cgbr->cone->bmap,
-			isl_basic_map_get_space(cgbr->cone->bmap), 1, 0, 2);
-		k = isl_basic_map_alloc_div(cgbr->cone->bmap);
-		if (k < 0)
-			return -1;
-		isl_seq_cpy(cgbr->cone->bmap->div[k], div->el, div->size);
-		if (isl_tab_push(cgbr->cone, isl_tab_undo_bmap_div) < 0)
-			return -1;
-	}
-	return context_tab_add_div(cgbr->tab, div,
-					context_gbr_add_ineq_wrap, context);
-}
-
-static int context_gbr_best_split(struct isl_context *context,
-		struct isl_tab *tab)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	struct isl_tab_undo *snap;
-	int r;
-
-	snap = isl_tab_snap(cgbr->tab);
-	r = best_split(tab, cgbr->tab);
-
-	if (r >= 0 && isl_tab_rollback(cgbr->tab, snap) < 0)
-		return -1;
-
-	return r;
-}
-
-static int context_gbr_is_empty(struct isl_context *context)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	if (!cgbr->tab)
-		return -1;
-	return cgbr->tab->empty;
-}
-
-struct isl_gbr_tab_undo {
-	struct isl_tab_undo *tab_snap;
-	struct isl_tab_undo *shifted_snap;
-	struct isl_tab_undo *cone_snap;
-};
-
-static void *context_gbr_save(struct isl_context *context)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	struct isl_gbr_tab_undo *snap;
-
-	snap = isl_alloc_type(cgbr->tab->mat->ctx, struct isl_gbr_tab_undo);
-	if (!snap)
-		return NULL;
-
-	snap->tab_snap = isl_tab_snap(cgbr->tab);
-	if (isl_tab_save_samples(cgbr->tab) < 0)
-		goto error;
-
-	if (cgbr->shifted)
-		snap->shifted_snap = isl_tab_snap(cgbr->shifted);
-	else
-		snap->shifted_snap = NULL;
-
-	if (cgbr->cone)
-		snap->cone_snap = isl_tab_snap(cgbr->cone);
-	else
-		snap->cone_snap = NULL;
-
-	return snap;
-error:
-	free(snap);
-	return NULL;
-}
-
-static void context_gbr_restore(struct isl_context *context, void *save)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	struct isl_gbr_tab_undo *snap = (struct isl_gbr_tab_undo *)save;
-	if (!snap)
-		goto error;
-	if (isl_tab_rollback(cgbr->tab, snap->tab_snap) < 0) {
-		isl_tab_free(cgbr->tab);
-		cgbr->tab = NULL;
-	}
-
-	if (snap->shifted_snap) {
-		if (isl_tab_rollback(cgbr->shifted, snap->shifted_snap) < 0)
-			goto error;
-	} else if (cgbr->shifted) {
-		isl_tab_free(cgbr->shifted);
-		cgbr->shifted = NULL;
-	}
-
-	if (snap->cone_snap) {
-		if (isl_tab_rollback(cgbr->cone, snap->cone_snap) < 0)
-			goto error;
-	} else if (cgbr->cone) {
-		isl_tab_free(cgbr->cone);
-		cgbr->cone = NULL;
-	}
-
-	free(snap);
-
-	return;
-error:
-	free(snap);
-	isl_tab_free(cgbr->tab);
-	cgbr->tab = NULL;
-}
-
-static int context_gbr_is_ok(struct isl_context *context)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	return !!cgbr->tab;
-}
-
-static void context_gbr_invalidate(struct isl_context *context)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	isl_tab_free(cgbr->tab);
-	cgbr->tab = NULL;
-}
-
-static void context_gbr_free(struct isl_context *context)
-{
-	struct isl_context_gbr *cgbr = (struct isl_context_gbr *)context;
-	isl_tab_free(cgbr->tab);
-	isl_tab_free(cgbr->shifted);
-	isl_tab_free(cgbr->cone);
-	free(cgbr);
-}
-
-struct isl_context_op isl_context_gbr_op = {
-	context_gbr_detect_nonnegative_parameters,
-	context_gbr_peek_basic_set,
-	context_gbr_peek_tab,
-	context_gbr_add_eq,
-	context_gbr_add_ineq,
-	context_gbr_ineq_sign,
-	context_gbr_test_ineq,
-	context_gbr_get_div,
-	context_gbr_add_div,
-	context_gbr_detect_equalities,
-	context_gbr_best_split,
-	context_gbr_is_empty,
-	context_gbr_is_ok,
-	context_gbr_save,
-	context_gbr_restore,
-	context_gbr_invalidate,
-	context_gbr_free,
-};
-
-static struct isl_context *isl_context_gbr_alloc(struct isl_basic_set *dom)
-{
-	struct isl_context_gbr *cgbr;
-
-	if (!dom)
-		return NULL;
-
-	cgbr = isl_calloc_type(dom->ctx, struct isl_context_gbr);
-	if (!cgbr)
-		return NULL;
-
-	cgbr->context.op = &isl_context_gbr_op;
-
-	cgbr->shifted = NULL;
-	cgbr->cone = NULL;
-	cgbr->tab = isl_tab_from_basic_set(dom);
-	cgbr->tab = isl_tab_init_samples(cgbr->tab);
-	if (!cgbr->tab)
-		goto error;
-	if (isl_tab_track_bset(cgbr->tab,
-				isl_basic_set_cow(isl_basic_set_copy(dom))) < 0)
-		goto error;
-	check_gbr_integer_feasible(cgbr);
-
-	return &cgbr->context;
-error:
-	cgbr->context.op->free(&cgbr->context);
-	return NULL;
-}
-
-static struct isl_context *isl_context_alloc(struct isl_basic_set *dom)
-{
-	if (!dom)
-		return NULL;
-
-	if (dom->ctx->opt->context == ISL_CONTEXT_LEXMIN)
-		return isl_context_lex_alloc(dom);
-	else
-		return isl_context_gbr_alloc(dom);
-}
-
-/* Construct an isl_sol_map structure for accumulating the solution.
- * If track_empty is set, then we also keep track of the parts
- * of the context where there is no solution.
- * If max is set, then we are solving a maximization, rather than
- * a minimization problem, which means that the variables in the
- * tableau have value "M - x" rather than "M + x".
- */
-static struct isl_sol *sol_map_init(struct isl_basic_map *bmap,
-	struct isl_basic_set *dom, int track_empty, int max)
-{
-	struct isl_sol_map *sol_map = NULL;
-
-	if (!bmap)
-		goto error;
-
-	sol_map = isl_calloc_type(bmap->ctx, struct isl_sol_map);
-	if (!sol_map)
-		goto error;
-
-	sol_map->sol.rational = ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL);
-	sol_map->sol.dec_level.callback.run = &sol_dec_level_wrap;
-	sol_map->sol.dec_level.sol = &sol_map->sol;
-	sol_map->sol.max = max;
-	sol_map->sol.n_out = isl_basic_map_dim(bmap, isl_dim_out);
-	sol_map->sol.add = &sol_map_add_wrap;
-	sol_map->sol.add_empty = track_empty ? &sol_map_add_empty_wrap : NULL;
-	sol_map->sol.free = &sol_map_free_wrap;
-	sol_map->map = isl_map_alloc_space(isl_basic_map_get_space(bmap), 1,
-					    ISL_MAP_DISJOINT);
-	if (!sol_map->map)
-		goto error;
-
-	sol_map->sol.context = isl_context_alloc(dom);
-	if (!sol_map->sol.context)
-		goto error;
-
-	if (track_empty) {
-		sol_map->empty = isl_set_alloc_space(isl_basic_set_get_space(dom),
-							1, ISL_SET_DISJOINT);
-		if (!sol_map->empty)
-			goto error;
-	}
-
-	isl_basic_set_free(dom);
-	return &sol_map->sol;
-error:
-	isl_basic_set_free(dom);
-	sol_map_free(sol_map);
-	return NULL;
-}
-
-/* Check whether all coefficients of (non-parameter) variables
- * are non-positive, meaning that no pivots can be performed on the row.
- */
-static int is_critical(struct isl_tab *tab, int row)
-{
-	int j;
-	unsigned off = 2 + tab->M;
-
-	for (j = tab->n_dead; j < tab->n_col; ++j) {
-		if (tab->col_var[j] >= 0 &&
-		    (tab->col_var[j] < tab->n_param  ||
-		    tab->col_var[j] >= tab->n_var - tab->n_div))
-			continue;
-
-		if (isl_int_is_pos(tab->mat->row[row][off + j]))
-			return 0;
-	}
-
-	return 1;
-}
-
-/* Check whether the inequality represented by vec is strict over the integers,
- * i.e., there are no integer values satisfying the constraint with
- * equality.  This happens if the gcd of the coefficients is not a divisor
- * of the constant term.  If so, scale the constraint down by the gcd
- * of the coefficients.
- */
-static int is_strict(struct isl_vec *vec)
-{
-	isl_int gcd;
-	int strict = 0;
-
-	isl_int_init(gcd);
-	isl_seq_gcd(vec->el + 1, vec->size - 1, &gcd);
-	if (!isl_int_is_one(gcd)) {
-		strict = !isl_int_is_divisible_by(vec->el[0], gcd);
-		isl_int_fdiv_q(vec->el[0], vec->el[0], gcd);
-		isl_seq_scale_down(vec->el + 1, vec->el + 1, gcd, vec->size-1);
-	}
-	isl_int_clear(gcd);
-
-	return strict;
-}
-
-/* Determine the sign of the given row of the main tableau.
- * The result is one of
- *	isl_tab_row_pos: always non-negative; no pivot needed
- *	isl_tab_row_neg: always non-positive; pivot
- *	isl_tab_row_any: can be both positive and negative; split
- *
- * We first handle some simple cases
- *	- the row sign may be known already
- *	- the row may be obviously non-negative
- *	- the parametric constant may be equal to that of another row
- *	  for which we know the sign.  This sign will be either "pos" or
- *	  "any".  If it had been "neg" then we would have pivoted before.
- *
- * If none of these cases hold, we check the value of the row for each
- * of the currently active samples.  Based on the signs of these values
- * we make an initial determination of the sign of the row.
- *
- *	all zero			->	unk(nown)
- *	all non-negative		->	pos
- *	all non-positive		->	neg
- *	both negative and positive	->	all
- *
- * If we end up with "all", we are done.
- * Otherwise, we perform a check for positive and/or negative
- * values as follows.
- *
- *	samples	       neg	       unk	       pos
- *	<0 ?			    Y        N	    Y        N
- *					    pos    any      pos
- *	>0 ?	     Y      N	 Y     N
- *		    any    neg  any   neg
- *
- * There is no special sign for "zero", because we can usually treat zero
- * as either non-negative or non-positive, whatever works out best.
- * However, if the row is "critical", meaning that pivoting is impossible
- * then we don't want to limp zero with the non-positive case, because
- * then we we would lose the solution for those values of the parameters
- * where the value of the row is zero.  Instead, we treat 0 as non-negative
- * ensuring a split if the row can attain both zero and negative values.
- * The same happens when the original constraint was one that could not
- * be satisfied with equality by any integer values of the parameters.
- * In this case, we normalize the constraint, but then a value of zero
- * for the normalized constraint is actually a positive value for the
- * original constraint, so again we need to treat zero as non-negative.
- * In both these cases, we have the following decision tree instead:
- *
- *	all non-negative		->	pos
- *	all negative			->	neg
- *	both negative and non-negative	->	all
- *
- *	samples	       neg	          	       pos
- *	<0 ?			             	    Y        N
- *					           any      pos
- *	>=0 ?	     Y      N
- *		    any    neg
- */
-static enum isl_tab_row_sign row_sign(struct isl_tab *tab,
-	struct isl_sol *sol, int row)
-{
-	struct isl_vec *ineq = NULL;
-	enum isl_tab_row_sign res = isl_tab_row_unknown;
-	int critical;
-	int strict;
-	int row2;
-
-	if (tab->row_sign[row] != isl_tab_row_unknown)
-		return tab->row_sign[row];
-	if (is_obviously_nonneg(tab, row))
-		return isl_tab_row_pos;
-	for (row2 = tab->n_redundant; row2 < tab->n_row; ++row2) {
-		if (tab->row_sign[row2] == isl_tab_row_unknown)
-			continue;
-		if (identical_parameter_line(tab, row, row2))
-			return tab->row_sign[row2];
-	}
-
-	critical = is_critical(tab, row);
-
-	ineq = get_row_parameter_ineq(tab, row);
-	if (!ineq)
-		goto error;
-
-	strict = is_strict(ineq);
-
-	res = sol->context->op->ineq_sign(sol->context, ineq->el,
-					  critical || strict);
-
-	if (res == isl_tab_row_unknown || res == isl_tab_row_pos) {
-		/* test for negative values */
-		int feasible;
-		isl_seq_neg(ineq->el, ineq->el, ineq->size);
-		isl_int_sub_ui(ineq->el[0], ineq->el[0], 1);
-
-		feasible = sol->context->op->test_ineq(sol->context, ineq->el);
-		if (feasible < 0)
-			goto error;
-		if (!feasible)
-			res = isl_tab_row_pos;
-		else
-			res = (res == isl_tab_row_unknown) ? isl_tab_row_neg
-							   : isl_tab_row_any;
-		if (res == isl_tab_row_neg) {
-			isl_seq_neg(ineq->el, ineq->el, ineq->size);
-			isl_int_sub_ui(ineq->el[0], ineq->el[0], 1);
-		}
-	}
-
-	if (res == isl_tab_row_neg) {
-		/* test for positive values */
-		int feasible;
-		if (!critical && !strict)
-			isl_int_sub_ui(ineq->el[0], ineq->el[0], 1);
-
-		feasible = sol->context->op->test_ineq(sol->context, ineq->el);
-		if (feasible < 0)
-			goto error;
-		if (feasible)
-			res = isl_tab_row_any;
-	}
-
-	isl_vec_free(ineq);
-	return res;
-error:
-	isl_vec_free(ineq);
-	return isl_tab_row_unknown;
-}
-
-static void find_solutions(struct isl_sol *sol, struct isl_tab *tab);
-
-/* Find solutions for values of the parameters that satisfy the given
- * inequality.
- *
- * We currently take a snapshot of the context tableau that is reset
- * when we return from this function, while we make a copy of the main
- * tableau, leaving the original main tableau untouched.
- * These are fairly arbitrary choices.  Making a copy also of the context
- * tableau would obviate the need to undo any changes made to it later,
- * while taking a snapshot of the main tableau could reduce memory usage.
- * If we were to switch to taking a snapshot of the main tableau,
- * we would have to keep in mind that we need to save the row signs
- * and that we need to do this before saving the current basis
- * such that the basis has been restore before we restore the row signs.
- */
-static void find_in_pos(struct isl_sol *sol, struct isl_tab *tab, isl_int *ineq)
-{
-	void *saved;
-
-	if (!sol->context)
-		goto error;
-	saved = sol->context->op->save(sol->context);
-
-	tab = isl_tab_dup(tab);
-	if (!tab)
-		goto error;
-
-	sol->context->op->add_ineq(sol->context, ineq, 0, 1);
-
-	find_solutions(sol, tab);
-
-	if (!sol->error)
-		sol->context->op->restore(sol->context, saved);
-	return;
-error:
-	sol->error = 1;
-}
-
-/* Record the absence of solutions for those values of the parameters
- * that do not satisfy the given inequality with equality.
- */
-static void no_sol_in_strict(struct isl_sol *sol,
-	struct isl_tab *tab, struct isl_vec *ineq)
-{
-	int empty;
-	void *saved;
-
-	if (!sol->context || sol->error)
-		goto error;
-	saved = sol->context->op->save(sol->context);
-
-	isl_int_sub_ui(ineq->el[0], ineq->el[0], 1);
-
-	sol->context->op->add_ineq(sol->context, ineq->el, 1, 0);
-	if (!sol->context)
-		goto error;
-
-	empty = tab->empty;
-	tab->empty = 1;
-	sol_add(sol, tab);
-	tab->empty = empty;
-
-	isl_int_add_ui(ineq->el[0], ineq->el[0], 1);
-
-	sol->context->op->restore(sol->context, saved);
-	return;
-error:
-	sol->error = 1;
-}
-
-/* Compute the lexicographic minimum of the set represented by the main
- * tableau "tab" within the context "sol->context_tab".
- * On entry the sample value of the main tableau is lexicographically
- * less than or equal to this lexicographic minimum.
- * Pivots are performed until a feasible point is found, which is then
- * necessarily equal to the minimum, or until the tableau is found to
- * be infeasible.  Some pivots may need to be performed for only some
- * feasible values of the context tableau.  If so, the context tableau
- * is split into a part where the pivot is needed and a part where it is not.
- *
- * Whenever we enter the main loop, the main tableau is such that no
- * "obvious" pivots need to be performed on it, where "obvious" means
- * that the given row can be seen to be negative without looking at
- * the context tableau.  In particular, for non-parametric problems,
- * no pivots need to be performed on the main tableau.
- * The caller of find_solutions is responsible for making this property
- * hold prior to the first iteration of the loop, while restore_lexmin
- * is called before every other iteration.
- *
- * Inside the main loop, we first examine the signs of the rows of
- * the main tableau within the context of the context tableau.
- * If we find a row that is always non-positive for all values of
- * the parameters satisfying the context tableau and negative for at
- * least one value of the parameters, we perform the appropriate pivot
- * and start over.  An exception is the case where no pivot can be
- * performed on the row.  In this case, we require that the sign of
- * the row is negative for all values of the parameters (rather than just
- * non-positive).  This special case is handled inside row_sign, which
- * will say that the row can have any sign if it determines that it can
- * attain both negative and zero values.
- *
- * If we can't find a row that always requires a pivot, but we can find
- * one or more rows that require a pivot for some values of the parameters
- * (i.e., the row can attain both positive and negative signs), then we split
- * the context tableau into two parts, one where we force the sign to be
- * non-negative and one where we force is to be negative.
- * The non-negative part is handled by a recursive call (through find_in_pos).
- * Upon returning from this call, we continue with the negative part and
- * perform the required pivot.
- *
- * If no such rows can be found, all rows are non-negative and we have
- * found a (rational) feasible point.  If we only wanted a rational point
- * then we are done.
- * Otherwise, we check if all values of the sample point of the tableau
- * are integral for the variables.  If so, we have found the minimal
- * integral point and we are done.
- * If the sample point is not integral, then we need to make a distinction
- * based on whether the constant term is non-integral or the coefficients
- * of the parameters.  Furthermore, in order to decide how to handle
- * the non-integrality, we also need to know whether the coefficients
- * of the other columns in the tableau are integral.  This leads
- * to the following table.  The first two rows do not correspond
- * to a non-integral sample point and are only mentioned for completeness.
- *
- *	constant	parameters	other
- *
- *	int		int		int	|
- *	int		int		rat	| -> no problem
- *
- *	rat		int		int	  -> fail
- *
- *	rat		int		rat	  -> cut
- *
- *	int		rat		rat	|
- *	rat		rat		rat	| -> parametric cut
- *
- *	int		rat		int	|
- *	rat		rat		int	| -> split context
- *
- * If the parametric constant is completely integral, then there is nothing
- * to be done.  If the constant term is non-integral, but all the other
- * coefficient are integral, then there is nothing that can be done
- * and the tableau has no integral solution.
- * If, on the other hand, one or more of the other columns have rational
- * coefficients, but the parameter coefficients are all integral, then
- * we can perform a regular (non-parametric) cut.
- * Finally, if there is any parameter coefficient that is non-integral,
- * then we need to involve the context tableau.  There are two cases here.
- * If at least one other column has a rational coefficient, then we
- * can perform a parametric cut in the main tableau by adding a new
- * integer division in the context tableau.
- * If all other columns have integral coefficients, then we need to
- * enforce that the rational combination of parameters (c + \sum a_i y_i)/m
- * is always integral.  We do this by introducing an integer division
- * q = floor((c + \sum a_i y_i)/m) and stipulating that its argument should
- * always be integral in the context tableau, i.e., m q = c + \sum a_i y_i.
- * Since q is expressed in the tableau as
- *	c + \sum a_i y_i - m q >= 0
- *	-c - \sum a_i y_i + m q + m - 1 >= 0
- * it is sufficient to add the inequality
- *	-c - \sum a_i y_i + m q >= 0
- * In the part of the context where this inequality does not hold, the
- * main tableau is marked as being empty.
- */
-static void find_solutions(struct isl_sol *sol, struct isl_tab *tab)
-{
-	struct isl_context *context;
-	int r;
-
-	if (!tab || sol->error)
-		goto error;
-
-	context = sol->context;
-
-	if (tab->empty)
-		goto done;
-	if (context->op->is_empty(context))
-		goto done;
-
-	for (r = 0; r >= 0 && tab && !tab->empty; r = restore_lexmin(tab)) {
-		int flags;
-		int row;
-		enum isl_tab_row_sign sgn;
-		int split = -1;
-		int n_split = 0;
-
-		for (row = tab->n_redundant; row < tab->n_row; ++row) {
-			if (!isl_tab_var_from_row(tab, row)->is_nonneg)
-				continue;
-			sgn = row_sign(tab, sol, row);
-			if (!sgn)
-				goto error;
-			tab->row_sign[row] = sgn;
-			if (sgn == isl_tab_row_any)
-				n_split++;
-			if (sgn == isl_tab_row_any && split == -1)
-				split = row;
-			if (sgn == isl_tab_row_neg)
-				break;
-		}
-		if (row < tab->n_row)
-			continue;
-		if (split != -1) {
-			struct isl_vec *ineq;
-			if (n_split != 1)
-				split = context->op->best_split(context, tab);
-			if (split < 0)
-				goto error;
-			ineq = get_row_parameter_ineq(tab, split);
-			if (!ineq)
-				goto error;
-			is_strict(ineq);
-			for (row = tab->n_redundant; row < tab->n_row; ++row) {
-				if (!isl_tab_var_from_row(tab, row)->is_nonneg)
-					continue;
-				if (tab->row_sign[row] == isl_tab_row_any)
-					tab->row_sign[row] = isl_tab_row_unknown;
-			}
-			tab->row_sign[split] = isl_tab_row_pos;
-			sol_inc_level(sol);
-			find_in_pos(sol, tab, ineq->el);
-			tab->row_sign[split] = isl_tab_row_neg;
-			row = split;
-			isl_seq_neg(ineq->el, ineq->el, ineq->size);
-			isl_int_sub_ui(ineq->el[0], ineq->el[0], 1);
-			if (!sol->error)
-				context->op->add_ineq(context, ineq->el, 0, 1);
-			isl_vec_free(ineq);
-			if (sol->error)
-				goto error;
-			continue;
-		}
-		if (tab->rational)
-			break;
-		row = first_non_integer_row(tab, &flags);
-		if (row < 0)
-			break;
-		if (ISL_FL_ISSET(flags, I_PAR)) {
-			if (ISL_FL_ISSET(flags, I_VAR)) {
-				if (isl_tab_mark_empty(tab) < 0)
-					goto error;
-				break;
-			}
-			row = add_cut(tab, row);
-		} else if (ISL_FL_ISSET(flags, I_VAR)) {
-			struct isl_vec *div;
-			struct isl_vec *ineq;
-			int d;
-			div = get_row_split_div(tab, row);
-			if (!div)
-				goto error;
-			d = context->op->get_div(context, tab, div);
-			isl_vec_free(div);
-			if (d < 0)
-				goto error;
-			ineq = ineq_for_div(context->op->peek_basic_set(context), d);
-			if (!ineq)
-				goto error;
-			sol_inc_level(sol);
-			no_sol_in_strict(sol, tab, ineq);
-			isl_seq_neg(ineq->el, ineq->el, ineq->size);
-			context->op->add_ineq(context, ineq->el, 1, 1);
-			isl_vec_free(ineq);
-			if (sol->error || !context->op->is_ok(context))
-				goto error;
-			tab = set_row_cst_to_div(tab, row, d);
-			if (context->op->is_empty(context))
-				break;
-		} else
-			row = add_parametric_cut(tab, row, context);
-		if (row < 0)
-			goto error;
-	}
-	if (r < 0)
-		goto error;
-done:
-	sol_add(sol, tab);
-	isl_tab_free(tab);
-	return;
-error:
-	isl_tab_free(tab);
-	sol->error = 1;
-}
-
-/* Compute the lexicographic minimum of the set represented by the main
- * tableau "tab" within the context "sol->context_tab".
- *
- * As a preprocessing step, we first transfer all the purely parametric
- * equalities from the main tableau to the context tableau, i.e.,
- * parameters that have been pivoted to a row.
- * These equalities are ignored by the main algorithm, because the
- * corresponding rows may not be marked as being non-negative.
- * In parts of the context where the added equality does not hold,
- * the main tableau is marked as being empty.
- */
-static void find_solutions_main(struct isl_sol *sol, struct isl_tab *tab)
-{
-	int row;
-
-	if (!tab)
-		goto error;
-
-	sol->level = 0;
-
-	for (row = tab->n_redundant; row < tab->n_row; ++row) {
-		int p;
-		struct isl_vec *eq;
-
-		if (tab->row_var[row] < 0)
-			continue;
-		if (tab->row_var[row] >= tab->n_param &&
-		    tab->row_var[row] < tab->n_var - tab->n_div)
-			continue;
-		if (tab->row_var[row] < tab->n_param)
-			p = tab->row_var[row];
-		else
-			p = tab->row_var[row]
-				+ tab->n_param - (tab->n_var - tab->n_div);
-
-		eq = isl_vec_alloc(tab->mat->ctx, 1+tab->n_param+tab->n_div);
-		if (!eq)
-			goto error;
-		get_row_parameter_line(tab, row, eq->el);
-		isl_int_neg(eq->el[1 + p], tab->mat->row[row][0]);
-		eq = isl_vec_normalize(eq);
-
-		sol_inc_level(sol);
-		no_sol_in_strict(sol, tab, eq);
-
-		isl_seq_neg(eq->el, eq->el, eq->size);
-		sol_inc_level(sol);
-		no_sol_in_strict(sol, tab, eq);
-		isl_seq_neg(eq->el, eq->el, eq->size);
-
-		sol->context->op->add_eq(sol->context, eq->el, 1, 1);
-
-		isl_vec_free(eq);
-
-		if (isl_tab_mark_redundant(tab, row) < 0)
-			goto error;
-
-		if (sol->context->op->is_empty(sol->context))
-			break;
-
-		row = tab->n_redundant - 1;
-	}
-
-	find_solutions(sol, tab);
-
-	sol->level = 0;
-	sol_pop(sol);
-
-	return;
-error:
-	isl_tab_free(tab);
-	sol->error = 1;
-}
-
-/* Check if integer division "div" of "dom" also occurs in "bmap".
- * If so, return its position within the divs.
- * If not, return -1.
- */
-static int find_context_div(struct isl_basic_map *bmap,
-	struct isl_basic_set *dom, unsigned div)
-{
-	int i;
-	unsigned b_dim = isl_space_dim(bmap->dim, isl_dim_all);
-	unsigned d_dim = isl_space_dim(dom->dim, isl_dim_all);
-
-	if (isl_int_is_zero(dom->div[div][0]))
-		return -1;
-	if (isl_seq_first_non_zero(dom->div[div] + 2 + d_dim, dom->n_div) != -1)
-		return -1;
-
-	for (i = 0; i < bmap->n_div; ++i) {
-		if (isl_int_is_zero(bmap->div[i][0]))
-			continue;
-		if (isl_seq_first_non_zero(bmap->div[i] + 2 + d_dim,
-					   (b_dim - d_dim) + bmap->n_div) != -1)
-			continue;
-		if (isl_seq_eq(bmap->div[i], dom->div[div], 2 + d_dim))
-			return i;
-	}
-	return -1;
-}
-
-/* The correspondence between the variables in the main tableau,
- * the context tableau, and the input map and domain is as follows.
- * The first n_param and the last n_div variables of the main tableau
- * form the variables of the context tableau.
- * In the basic map, these n_param variables correspond to the
- * parameters and the input dimensions.  In the domain, they correspond
- * to the parameters and the set dimensions.
- * The n_div variables correspond to the integer divisions in the domain.
- * To ensure that everything lines up, we may need to copy some of the
- * integer divisions of the domain to the map.  These have to be placed
- * in the same order as those in the context and they have to be placed
- * after any other integer divisions that the map may have.
- * This function performs the required reordering.
- */
-static struct isl_basic_map *align_context_divs(struct isl_basic_map *bmap,
-	struct isl_basic_set *dom)
-{
-	int i;
-	int common = 0;
-	int other;
-
-	for (i = 0; i < dom->n_div; ++i)
-		if (find_context_div(bmap, dom, i) != -1)
-			common++;
-	other = bmap->n_div - common;
-	if (dom->n_div - common > 0) {
-		bmap = isl_basic_map_extend_space(bmap, isl_space_copy(bmap->dim),
-				dom->n_div - common, 0, 0);
-		if (!bmap)
-			return NULL;
-	}
-	for (i = 0; i < dom->n_div; ++i) {
-		int pos = find_context_div(bmap, dom, i);
-		if (pos < 0) {
-			pos = isl_basic_map_alloc_div(bmap);
-			if (pos < 0)
-				goto error;
-			isl_int_set_si(bmap->div[pos][0], 0);
-		}
-		if (pos != other + i)
-			isl_basic_map_swap_div(bmap, pos, other + i);
-	}
-	return bmap;
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Base case of isl_tab_basic_map_partial_lexopt, after removing
- * some obvious symmetries.
- *
- * We make sure the divs in the domain are properly ordered,
- * because they will be added one by one in the given order
- * during the construction of the solution map.
- */
-static struct isl_sol *basic_map_partial_lexopt_base(
-	__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty, int max,
-	struct isl_sol *(*init)(__isl_keep isl_basic_map *bmap,
-		    __isl_take isl_basic_set *dom, int track_empty, int max))
-{
-	struct isl_tab *tab;
-	struct isl_sol *sol = NULL;
-	struct isl_context *context;
-
-	if (dom->n_div) {
-		dom = isl_basic_set_order_divs(dom);
-		bmap = align_context_divs(bmap, dom);
-	}
-	sol = init(bmap, dom, !!empty, max);
-	if (!sol)
-		goto error;
-
-	context = sol->context;
-	if (isl_basic_set_plain_is_empty(context->op->peek_basic_set(context)))
-		/* nothing */;
-	else if (isl_basic_map_plain_is_empty(bmap)) {
-		if (sol->add_empty)
-			sol->add_empty(sol,
-		    isl_basic_set_copy(context->op->peek_basic_set(context)));
-	} else {
-		tab = tab_for_lexmin(bmap,
-				    context->op->peek_basic_set(context), 1, max);
-		tab = context->op->detect_nonnegative_parameters(context, tab);
-		find_solutions_main(sol, tab);
-	}
-	if (sol->error)
-		goto error;
-
-	isl_basic_map_free(bmap);
-	return sol;
-error:
-	sol_free(sol);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Base case of isl_tab_basic_map_partial_lexopt, after removing
- * some obvious symmetries.
- *
- * We call basic_map_partial_lexopt_base and extract the results.
- */
-static __isl_give isl_map *basic_map_partial_lexopt_base_map(
-	__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty, int max)
-{
-	isl_map *result = NULL;
-	struct isl_sol *sol;
-	struct isl_sol_map *sol_map;
-
-	sol = basic_map_partial_lexopt_base(bmap, dom, empty, max,
-					    &sol_map_init);
-	if (!sol)
-		return NULL;
-	sol_map = (struct isl_sol_map *) sol;
-
-	result = isl_map_copy(sol_map->map);
-	if (empty)
-		*empty = isl_set_copy(sol_map->empty);
-	sol_free(&sol_map->sol);
-	return result;
-}
-
-/* Structure used during detection of parallel constraints.
- * n_in: number of "input" variables: isl_dim_param + isl_dim_in
- * n_out: number of "output" variables: isl_dim_out + isl_dim_div
- * val: the coefficients of the output variables
- */
-struct isl_constraint_equal_info {
-	isl_basic_map *bmap;
-	unsigned n_in;
-	unsigned n_out;
-	isl_int *val;
-};
-
-/* Check whether the coefficients of the output variables
- * of the constraint in "entry" are equal to info->val.
- */
-static int constraint_equal(const void *entry, const void *val)
-{
-	isl_int **row = (isl_int **)entry;
-	const struct isl_constraint_equal_info *info = val;
-
-	return isl_seq_eq((*row) + 1 + info->n_in, info->val, info->n_out);
-}
-
-/* Check whether "bmap" has a pair of constraints that have
- * the same coefficients for the output variables.
- * Note that the coefficients of the existentially quantified
- * variables need to be zero since the existentially quantified
- * of the result are usually not the same as those of the input.
- * the isl_dim_out and isl_dim_div dimensions.
- * If so, return 1 and return the row indices of the two constraints
- * in *first and *second.
- */
-static int parallel_constraints(__isl_keep isl_basic_map *bmap,
-	int *first, int *second)
-{
-	int i;
-	isl_ctx *ctx = isl_basic_map_get_ctx(bmap);
-	struct isl_hash_table *table = NULL;
-	struct isl_hash_table_entry *entry;
-	struct isl_constraint_equal_info info;
-	unsigned n_out;
-	unsigned n_div;
-
-	ctx = isl_basic_map_get_ctx(bmap);
-	table = isl_hash_table_alloc(ctx, bmap->n_ineq);
-	if (!table)
-		goto error;
-
-	info.n_in = isl_basic_map_dim(bmap, isl_dim_param) +
-		    isl_basic_map_dim(bmap, isl_dim_in);
-	info.bmap = bmap;
-	n_out = isl_basic_map_dim(bmap, isl_dim_out);
-	n_div = isl_basic_map_dim(bmap, isl_dim_div);
-	info.n_out = n_out + n_div;
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		uint32_t hash;
-
-		info.val = bmap->ineq[i] + 1 + info.n_in;
-		if (isl_seq_first_non_zero(info.val, n_out) < 0)
-			continue;
-		if (isl_seq_first_non_zero(info.val + n_out, n_div) >= 0)
-			continue;
-		hash = isl_seq_get_hash(info.val, info.n_out);
-		entry = isl_hash_table_find(ctx, table, hash,
-					    constraint_equal, &info, 1);
-		if (!entry)
-			goto error;
-		if (entry->data)
-			break;
-		entry->data = &bmap->ineq[i];
-	}
-
-	if (i < bmap->n_ineq) {
-		*first = ((isl_int **)entry->data) - bmap->ineq; 
-		*second = i;
-	}
-
-	isl_hash_table_free(ctx, table);
-
-	return i < bmap->n_ineq;
-error:
-	isl_hash_table_free(ctx, table);
-	return -1;
-}
-
-/* Given a set of upper bounds in "var", add constraints to "bset"
- * that make the i-th bound smallest.
- *
- * In particular, if there are n bounds b_i, then add the constraints
- *
- *	b_i <= b_j	for j > i
- *	b_i <  b_j	for j < i
- */
-static __isl_give isl_basic_set *select_minimum(__isl_take isl_basic_set *bset,
-	__isl_keep isl_mat *var, int i)
-{
-	isl_ctx *ctx;
-	int j, k;
-
-	ctx = isl_mat_get_ctx(var);
-
-	for (j = 0; j < var->n_row; ++j) {
-		if (j == i)
-			continue;
-		k = isl_basic_set_alloc_inequality(bset);
-		if (k < 0)
-			goto error;
-		isl_seq_combine(bset->ineq[k], ctx->one, var->row[j],
-				ctx->negone, var->row[i], var->n_col);
-		isl_int_set_si(bset->ineq[k][var->n_col], 0);
-		if (j < i)
-			isl_int_sub_ui(bset->ineq[k][0], bset->ineq[k][0], 1);
-	}
-
-	bset = isl_basic_set_finalize(bset);
-
-	return bset;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-/* Given a set of upper bounds on the last "input" variable m,
- * construct a set that assigns the minimal upper bound to m, i.e.,
- * construct a set that divides the space into cells where one
- * of the upper bounds is smaller than all the others and assign
- * this upper bound to m.
- *
- * In particular, if there are n bounds b_i, then the result
- * consists of n basic sets, each one of the form
- *
- *	m = b_i
- *	b_i <= b_j	for j > i
- *	b_i <  b_j	for j < i
- */
-static __isl_give isl_set *set_minimum(__isl_take isl_space *dim,
-	__isl_take isl_mat *var)
-{
-	int i, k;
-	isl_basic_set *bset = NULL;
-	isl_ctx *ctx;
-	isl_set *set = NULL;
-
-	if (!dim || !var)
-		goto error;
-
-	ctx = isl_space_get_ctx(dim);
-	set = isl_set_alloc_space(isl_space_copy(dim),
-				var->n_row, ISL_SET_DISJOINT);
-
-	for (i = 0; i < var->n_row; ++i) {
-		bset = isl_basic_set_alloc_space(isl_space_copy(dim), 0,
-					       1, var->n_row - 1);
-		k = isl_basic_set_alloc_equality(bset);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(bset->eq[k], var->row[i], var->n_col);
-		isl_int_set_si(bset->eq[k][var->n_col], -1);
-		bset = select_minimum(bset, var, i);
-		set = isl_set_add_basic_set(set, bset);
-	}
-
-	isl_space_free(dim);
-	isl_mat_free(var);
-	return set;
-error:
-	isl_basic_set_free(bset);
-	isl_set_free(set);
-	isl_space_free(dim);
-	isl_mat_free(var);
-	return NULL;
-}
-
-/* Given that the last input variable of "bmap" represents the minimum
- * of the bounds in "cst", check whether we need to split the domain
- * based on which bound attains the minimum.
- *
- * A split is needed when the minimum appears in an integer division
- * or in an equality.  Otherwise, it is only needed if it appears in
- * an upper bound that is different from the upper bounds on which it
- * is defined.
- */
-static int need_split_basic_map(__isl_keep isl_basic_map *bmap,
-	__isl_keep isl_mat *cst)
-{
-	int i, j;
-	unsigned total;
-	unsigned pos;
-
-	pos = cst->n_col - 1;
-	total = isl_basic_map_dim(bmap, isl_dim_all);
-
-	for (i = 0; i < bmap->n_div; ++i)
-		if (!isl_int_is_zero(bmap->div[i][2 + pos]))
-			return 1;
-
-	for (i = 0; i < bmap->n_eq; ++i)
-		if (!isl_int_is_zero(bmap->eq[i][1 + pos]))
-			return 1;
-
-	for (i = 0; i < bmap->n_ineq; ++i) {
-		if (isl_int_is_nonneg(bmap->ineq[i][1 + pos]))
-			continue;
-		if (!isl_int_is_negone(bmap->ineq[i][1 + pos]))
-			return 1;
-		if (isl_seq_first_non_zero(bmap->ineq[i] + 1 + pos + 1,
-					   total - pos - 1) >= 0)
-			return 1;
-
-		for (j = 0; j < cst->n_row; ++j)
-			if (isl_seq_eq(bmap->ineq[i], cst->row[j], cst->n_col))
-				break;
-		if (j >= cst->n_row)
-			return 1;
-	}
-
-	return 0;
-}
-
-/* Given that the last set variable of "bset" represents the minimum
- * of the bounds in "cst", check whether we need to split the domain
- * based on which bound attains the minimum.
- *
- * We simply call need_split_basic_map here.  This is safe because
- * the position of the minimum is computed from "cst" and not
- * from "bmap".
- */
-static int need_split_basic_set(__isl_keep isl_basic_set *bset,
-	__isl_keep isl_mat *cst)
-{
-	return need_split_basic_map((isl_basic_map *)bset, cst);
-}
-
-/* Given that the last set variable of "set" represents the minimum
- * of the bounds in "cst", check whether we need to split the domain
- * based on which bound attains the minimum.
- */
-static int need_split_set(__isl_keep isl_set *set, __isl_keep isl_mat *cst)
-{
-	int i;
-
-	for (i = 0; i < set->n; ++i)
-		if (need_split_basic_set(set->p[i], cst))
-			return 1;
-
-	return 0;
-}
-
-/* Given a set of which the last set variable is the minimum
- * of the bounds in "cst", split each basic set in the set
- * in pieces where one of the bounds is (strictly) smaller than the others.
- * This subdivision is given in "min_expr".
- * The variable is subsequently projected out.
- *
- * We only do the split when it is needed.
- * For example if the last input variable m = min(a,b) and the only
- * constraints in the given basic set are lower bounds on m,
- * i.e., l <= m = min(a,b), then we can simply project out m
- * to obtain l <= a and l <= b, without having to split on whether
- * m is equal to a or b.
- */
-static __isl_give isl_set *split(__isl_take isl_set *empty,
-	__isl_take isl_set *min_expr, __isl_take isl_mat *cst)
-{
-	int n_in;
-	int i;
-	isl_space *dim;
-	isl_set *res;
-
-	if (!empty || !min_expr || !cst)
-		goto error;
-
-	n_in = isl_set_dim(empty, isl_dim_set);
-	dim = isl_set_get_space(empty);
-	dim = isl_space_drop_dims(dim, isl_dim_set, n_in - 1, 1);
-	res = isl_set_empty(dim);
-
-	for (i = 0; i < empty->n; ++i) {
-		isl_set *set;
-
-		set = isl_set_from_basic_set(isl_basic_set_copy(empty->p[i]));
-		if (need_split_basic_set(empty->p[i], cst))
-			set = isl_set_intersect(set, isl_set_copy(min_expr));
-		set = isl_set_remove_dims(set, isl_dim_set, n_in - 1, 1);
-
-		res = isl_set_union_disjoint(res, set);
-	}
-
-	isl_set_free(empty);
-	isl_set_free(min_expr);
-	isl_mat_free(cst);
-	return res;
-error:
-	isl_set_free(empty);
-	isl_set_free(min_expr);
-	isl_mat_free(cst);
-	return NULL;
-}
-
-/* Given a map of which the last input variable is the minimum
- * of the bounds in "cst", split each basic set in the set
- * in pieces where one of the bounds is (strictly) smaller than the others.
- * This subdivision is given in "min_expr".
- * The variable is subsequently projected out.
- *
- * The implementation is essentially the same as that of "split".
- */
-static __isl_give isl_map *split_domain(__isl_take isl_map *opt,
-	__isl_take isl_set *min_expr, __isl_take isl_mat *cst)
-{
-	int n_in;
-	int i;
-	isl_space *dim;
-	isl_map *res;
-
-	if (!opt || !min_expr || !cst)
-		goto error;
-
-	n_in = isl_map_dim(opt, isl_dim_in);
-	dim = isl_map_get_space(opt);
-	dim = isl_space_drop_dims(dim, isl_dim_in, n_in - 1, 1);
-	res = isl_map_empty(dim);
-
-	for (i = 0; i < opt->n; ++i) {
-		isl_map *map;
-
-		map = isl_map_from_basic_map(isl_basic_map_copy(opt->p[i]));
-		if (need_split_basic_map(opt->p[i], cst))
-			map = isl_map_intersect_domain(map,
-						       isl_set_copy(min_expr));
-		map = isl_map_remove_dims(map, isl_dim_in, n_in - 1, 1);
-
-		res = isl_map_union_disjoint(res, map);
-	}
-
-	isl_map_free(opt);
-	isl_set_free(min_expr);
-	isl_mat_free(cst);
-	return res;
-error:
-	isl_map_free(opt);
-	isl_set_free(min_expr);
-	isl_mat_free(cst);
-	return NULL;
-}
-
-static __isl_give isl_map *basic_map_partial_lexopt(
-	__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty, int max);
-
-union isl_lex_res {
-	void *p;
-	isl_map *map;
-	isl_pw_multi_aff *pma;
-};
-
-/* This function is called from basic_map_partial_lexopt_symm.
- * The last variable of "bmap" and "dom" corresponds to the minimum
- * of the bounds in "cst".  "map_space" is the space of the original
- * input relation (of basic_map_partial_lexopt_symm) and "set_space"
- * is the space of the original domain.
- *
- * We recursively call basic_map_partial_lexopt and then plug in
- * the definition of the minimum in the result.
- */
-static __isl_give union isl_lex_res basic_map_partial_lexopt_symm_map_core(
-	__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty, int max, __isl_take isl_mat *cst,
-	__isl_take isl_space *map_space, __isl_take isl_space *set_space)
-{
-	isl_map *opt;
-	isl_set *min_expr;
-	union isl_lex_res res;
-
-	min_expr = set_minimum(isl_basic_set_get_space(dom), isl_mat_copy(cst));
-
-	opt = basic_map_partial_lexopt(bmap, dom, empty, max);
-
-	if (empty) {
-		*empty = split(*empty,
-			       isl_set_copy(min_expr), isl_mat_copy(cst));
-		*empty = isl_set_reset_space(*empty, set_space);
-	}
-
-	opt = split_domain(opt, min_expr, cst);
-	opt = isl_map_reset_space(opt, map_space);
-
-	res.map = opt;
-	return res;
-}
-
-/* Given a basic map with at least two parallel constraints (as found
- * by the function parallel_constraints), first look for more constraints
- * parallel to the two constraint and replace the found list of parallel
- * constraints by a single constraint with as "input" part the minimum
- * of the input parts of the list of constraints.  Then, recursively call
- * basic_map_partial_lexopt (possibly finding more parallel constraints)
- * and plug in the definition of the minimum in the result.
- *
- * More specifically, given a set of constraints
- *
- *	a x + b_i(p) >= 0
- *
- * Replace this set by a single constraint
- *
- *	a x + u >= 0
- *
- * with u a new parameter with constraints
- *
- *	u <= b_i(p)
- *
- * Any solution to the new system is also a solution for the original system
- * since
- *
- *	a x >= -u >= -b_i(p)
- *
- * Moreover, m = min_i(b_i(p)) satisfies the constraints on u and can
- * therefore be plugged into the solution.
- */
-static union isl_lex_res basic_map_partial_lexopt_symm(
-	__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty, int max, int first, int second,
-	__isl_give union isl_lex_res (*core)(__isl_take isl_basic_map *bmap,
-					    __isl_take isl_basic_set *dom,
-					    __isl_give isl_set **empty,
-					    int max, __isl_take isl_mat *cst,
-					    __isl_take isl_space *map_space,
-					    __isl_take isl_space *set_space))
-{
-	int i, n, k;
-	int *list = NULL;
-	unsigned n_in, n_out, n_div;
-	isl_ctx *ctx;
-	isl_vec *var = NULL;
-	isl_mat *cst = NULL;
-	isl_space *map_space, *set_space;
-	union isl_lex_res res;
-
-	map_space = isl_basic_map_get_space(bmap);
-	set_space = empty ? isl_basic_set_get_space(dom) : NULL;
-
-	n_in = isl_basic_map_dim(bmap, isl_dim_param) +
-	       isl_basic_map_dim(bmap, isl_dim_in);
-	n_out = isl_basic_map_dim(bmap, isl_dim_all) - n_in;
-
-	ctx = isl_basic_map_get_ctx(bmap);
-	list = isl_alloc_array(ctx, int, bmap->n_ineq);
-	var = isl_vec_alloc(ctx, n_out);
-	if (!list || !var)
-		goto error;
-
-	list[0] = first;
-	list[1] = second;
-	isl_seq_cpy(var->el, bmap->ineq[first] + 1 + n_in, n_out);
-	for (i = second + 1, n = 2; i < bmap->n_ineq; ++i) {
-		if (isl_seq_eq(var->el, bmap->ineq[i] + 1 + n_in, n_out))
-			list[n++] = i;
-	}
-
-	cst = isl_mat_alloc(ctx, n, 1 + n_in);
-	if (!cst)
-		goto error;
-
-	for (i = 0; i < n; ++i)
-		isl_seq_cpy(cst->row[i], bmap->ineq[list[i]], 1 + n_in);
-
-	bmap = isl_basic_map_cow(bmap);
-	if (!bmap)
-		goto error;
-	for (i = n - 1; i >= 0; --i)
-		if (isl_basic_map_drop_inequality(bmap, list[i]) < 0)
-			goto error;
-
-	bmap = isl_basic_map_add(bmap, isl_dim_in, 1);
-	bmap = isl_basic_map_extend_constraints(bmap, 0, 1);
-	k = isl_basic_map_alloc_inequality(bmap);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(bmap->ineq[k], 1 + n_in);
-	isl_int_set_si(bmap->ineq[k][1 + n_in], 1);
-	isl_seq_cpy(bmap->ineq[k] + 1 + n_in + 1, var->el, n_out);
-	bmap = isl_basic_map_finalize(bmap);
-
-	n_div = isl_basic_set_dim(dom, isl_dim_div);
-	dom = isl_basic_set_add(dom, isl_dim_set, 1);
-	dom = isl_basic_set_extend_constraints(dom, 0, n);
-	for (i = 0; i < n; ++i) {
-		k = isl_basic_set_alloc_inequality(dom);
-		if (k < 0)
-			goto error;
-		isl_seq_cpy(dom->ineq[k], cst->row[i], 1 + n_in);
-		isl_int_set_si(dom->ineq[k][1 + n_in], -1);
-		isl_seq_clr(dom->ineq[k] + 1 + n_in + 1, n_div);
-	}
-
-	isl_vec_free(var);
-	free(list);
-
-	return core(bmap, dom, empty, max, cst, map_space, set_space);
-error:
-	isl_space_free(map_space);
-	isl_space_free(set_space);
-	isl_mat_free(cst);
-	isl_vec_free(var);
-	free(list);
-	isl_basic_set_free(dom);
-	isl_basic_map_free(bmap);
-	res.p = NULL;
-	return res;
-}
-
-static __isl_give isl_map *basic_map_partial_lexopt_symm_map(
-	__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty, int max, int first, int second)
-{
-	return basic_map_partial_lexopt_symm(bmap, dom, empty, max,
-		    first, second, &basic_map_partial_lexopt_symm_map_core).map;
-}
-
-/* Recursive part of isl_tab_basic_map_partial_lexopt, after detecting
- * equalities and removing redundant constraints.
- *
- * We first check if there are any parallel constraints (left).
- * If not, we are in the base case.
- * If there are parallel constraints, we replace them by a single
- * constraint in basic_map_partial_lexopt_symm and then call
- * this function recursively to look for more parallel constraints.
- */
-static __isl_give isl_map *basic_map_partial_lexopt(
-	__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty, int max)
-{
-	int par = 0;
-	int first, second;
-
-	if (!bmap)
-		goto error;
-
-	if (bmap->ctx->opt->pip_symmetry)
-		par = parallel_constraints(bmap, &first, &second);
-	if (par < 0)
-		goto error;
-	if (!par)
-		return basic_map_partial_lexopt_base_map(bmap, dom, empty, max);
-	
-	return basic_map_partial_lexopt_symm_map(bmap, dom, empty, max,
-						 first, second);
-error:
-	isl_basic_set_free(dom);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Compute the lexicographic minimum (or maximum if "max" is set)
- * of "bmap" over the domain "dom" and return the result as a map.
- * If "empty" is not NULL, then *empty is assigned a set that
- * contains those parts of the domain where there is no solution.
- * If "bmap" is marked as rational (ISL_BASIC_MAP_RATIONAL),
- * then we compute the rational optimum.  Otherwise, we compute
- * the integral optimum.
- *
- * We perform some preprocessing.  As the PILP solver does not
- * handle implicit equalities very well, we first make sure all
- * the equalities are explicitly available.
- *
- * We also add context constraints to the basic map and remove
- * redundant constraints.  This is only needed because of the
- * way we handle simple symmetries.  In particular, we currently look
- * for symmetries on the constraints, before we set up the main tableau.
- * It is then no good to look for symmetries on possibly redundant constraints.
- */
-struct isl_map *isl_tab_basic_map_partial_lexopt(
-		struct isl_basic_map *bmap, struct isl_basic_set *dom,
-		struct isl_set **empty, int max)
-{
-	if (empty)
-		*empty = NULL;
-	if (!bmap || !dom)
-		goto error;
-
-	isl_assert(bmap->ctx,
-	    isl_basic_map_compatible_domain(bmap, dom), goto error);
-
-	if (isl_basic_set_dim(dom, isl_dim_all) == 0)
-		return basic_map_partial_lexopt(bmap, dom, empty, max);
-
-	bmap = isl_basic_map_intersect_domain(bmap, isl_basic_set_copy(dom));
-	bmap = isl_basic_map_detect_equalities(bmap);
-	bmap = isl_basic_map_remove_redundancies(bmap);
-
-	return basic_map_partial_lexopt(bmap, dom, empty, max);
-error:
-	isl_basic_set_free(dom);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-struct isl_sol_for {
-	struct isl_sol	sol;
-	int		(*fn)(__isl_take isl_basic_set *dom,
-				__isl_take isl_aff_list *list, void *user);
-	void		*user;
-};
-
-static void sol_for_free(struct isl_sol_for *sol_for)
-{
-	if (sol_for->sol.context)
-		sol_for->sol.context->op->free(sol_for->sol.context);
-	free(sol_for);
-}
-
-static void sol_for_free_wrap(struct isl_sol *sol)
-{
-	sol_for_free((struct isl_sol_for *)sol);
-}
-
-/* Add the solution identified by the tableau and the context tableau.
- *
- * See documentation of sol_add for more details.
- *
- * Instead of constructing a basic map, this function calls a user
- * defined function with the current context as a basic set and
- * a list of affine expressions representing the relation between
- * the input and output.  The space over which the affine expressions
- * are defined is the same as that of the domain.  The number of
- * affine expressions in the list is equal to the number of output variables.
- */
-static void sol_for_add(struct isl_sol_for *sol,
-	struct isl_basic_set *dom, struct isl_mat *M)
-{
-	int i;
-	isl_ctx *ctx;
-	isl_local_space *ls;
-	isl_aff *aff;
-	isl_aff_list *list;
-
-	if (sol->sol.error || !dom || !M)
-		goto error;
-
-	ctx = isl_basic_set_get_ctx(dom);
-	ls = isl_basic_set_get_local_space(dom);
-	list = isl_aff_list_alloc(ctx, M->n_row - 1);
-	for (i = 1; i < M->n_row; ++i) {
-		aff = isl_aff_alloc(isl_local_space_copy(ls));
-		if (aff) {
-			isl_int_set(aff->v->el[0], M->row[0][0]);
-			isl_seq_cpy(aff->v->el + 1, M->row[i], M->n_col);
-		}
-		list = isl_aff_list_add(list, aff);
-	}
-	isl_local_space_free(ls);
-
-	dom = isl_basic_set_finalize(dom);
-
-	if (sol->fn(isl_basic_set_copy(dom), list, sol->user) < 0)
-		goto error;
-
-	isl_basic_set_free(dom);
-	isl_mat_free(M);
-	return;
-error:
-	isl_basic_set_free(dom);
-	isl_mat_free(M);
-	sol->sol.error = 1;
-}
-
-static void sol_for_add_wrap(struct isl_sol *sol,
-	struct isl_basic_set *dom, struct isl_mat *M)
-{
-	sol_for_add((struct isl_sol_for *)sol, dom, M);
-}
-
-static struct isl_sol_for *sol_for_init(struct isl_basic_map *bmap, int max,
-	int (*fn)(__isl_take isl_basic_set *dom, __isl_take isl_aff_list *list,
-		  void *user),
-	void *user)
-{
-	struct isl_sol_for *sol_for = NULL;
-	isl_space *dom_dim;
-	struct isl_basic_set *dom = NULL;
-
-	sol_for = isl_calloc_type(bmap->ctx, struct isl_sol_for);
-	if (!sol_for)
-		goto error;
-
-	dom_dim = isl_space_domain(isl_space_copy(bmap->dim));
-	dom = isl_basic_set_universe(dom_dim);
-
-	sol_for->sol.rational = ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL);
-	sol_for->sol.dec_level.callback.run = &sol_dec_level_wrap;
-	sol_for->sol.dec_level.sol = &sol_for->sol;
-	sol_for->fn = fn;
-	sol_for->user = user;
-	sol_for->sol.max = max;
-	sol_for->sol.n_out = isl_basic_map_dim(bmap, isl_dim_out);
-	sol_for->sol.add = &sol_for_add_wrap;
-	sol_for->sol.add_empty = NULL;
-	sol_for->sol.free = &sol_for_free_wrap;
-
-	sol_for->sol.context = isl_context_alloc(dom);
-	if (!sol_for->sol.context)
-		goto error;
-
-	isl_basic_set_free(dom);
-	return sol_for;
-error:
-	isl_basic_set_free(dom);
-	sol_for_free(sol_for);
-	return NULL;
-}
-
-static void sol_for_find_solutions(struct isl_sol_for *sol_for,
-	struct isl_tab *tab)
-{
-	find_solutions_main(&sol_for->sol, tab);
-}
-
-int isl_basic_map_foreach_lexopt(__isl_keep isl_basic_map *bmap, int max,
-	int (*fn)(__isl_take isl_basic_set *dom, __isl_take isl_aff_list *list,
-		  void *user),
-	void *user)
-{
-	struct isl_sol_for *sol_for = NULL;
-
-	bmap = isl_basic_map_copy(bmap);
-	if (!bmap)
-		return -1;
-
-	bmap = isl_basic_map_detect_equalities(bmap);
-	sol_for = sol_for_init(bmap, max, fn, user);
-
-	if (isl_basic_map_plain_is_empty(bmap))
-		/* nothing */;
-	else {
-		struct isl_tab *tab;
-		struct isl_context *context = sol_for->sol.context;
-		tab = tab_for_lexmin(bmap,
-				context->op->peek_basic_set(context), 1, max);
-		tab = context->op->detect_nonnegative_parameters(context, tab);
-		sol_for_find_solutions(sol_for, tab);
-		if (sol_for->sol.error)
-			goto error;
-	}
-
-	sol_free(&sol_for->sol);
-	isl_basic_map_free(bmap);
-	return 0;
-error:
-	sol_free(&sol_for->sol);
-	isl_basic_map_free(bmap);
-	return -1;
-}
-
-int isl_basic_set_foreach_lexopt(__isl_keep isl_basic_set *bset, int max,
-	int (*fn)(__isl_take isl_basic_set *dom, __isl_take isl_aff_list *list,
-		  void *user),
-	void *user)
-{
-	return isl_basic_map_foreach_lexopt(bset, max, fn, user);
-}
-
-/* Check if the given sequence of len variables starting at pos
- * represents a trivial (i.e., zero) solution.
- * The variables are assumed to be non-negative and to come in pairs,
- * with each pair representing a variable of unrestricted sign.
- * The solution is trivial if each such pair in the sequence consists
- * of two identical values, meaning that the variable being represented
- * has value zero.
- */
-static int region_is_trivial(struct isl_tab *tab, int pos, int len)
-{
-	int i;
-
-	if (len == 0)
-		return 0;
-
-	for (i = 0; i < len; i +=  2) {
-		int neg_row;
-		int pos_row;
-
-		neg_row = tab->var[pos + i].is_row ?
-				tab->var[pos + i].index : -1;
-		pos_row = tab->var[pos + i + 1].is_row ?
-				tab->var[pos + i + 1].index : -1;
-
-		if ((neg_row < 0 ||
-		     isl_int_is_zero(tab->mat->row[neg_row][1])) &&
-		    (pos_row < 0 ||
-		     isl_int_is_zero(tab->mat->row[pos_row][1])))
-			continue;
-
-		if (neg_row < 0 || pos_row < 0)
-			return 0;
-		if (isl_int_ne(tab->mat->row[neg_row][1],
-			       tab->mat->row[pos_row][1]))
-			return 0;
-	}
-
-	return 1;
-}
-
-/* Return the index of the first trivial region or -1 if all regions
- * are non-trivial.
- */
-static int first_trivial_region(struct isl_tab *tab,
-	int n_region, struct isl_region *region)
-{
-	int i;
-
-	for (i = 0; i < n_region; ++i) {
-		if (region_is_trivial(tab, region[i].pos, region[i].len))
-			return i;
-	}
-
-	return -1;
-}
-
-/* Check if the solution is optimal, i.e., whether the first
- * n_op entries are zero.
- */
-static int is_optimal(__isl_keep isl_vec *sol, int n_op)
-{
-	int i;
-
-	for (i = 0; i < n_op; ++i)
-		if (!isl_int_is_zero(sol->el[1 + i]))
-			return 0;
-	return 1;
-}
-
-/* Add constraints to "tab" that ensure that any solution is significantly
- * better that that represented by "sol".  That is, find the first
- * relevant (within first n_op) non-zero coefficient and force it (along
- * with all previous coefficients) to be zero.
- * If the solution is already optimal (all relevant coefficients are zero),
- * then just mark the table as empty.
- */
-static int force_better_solution(struct isl_tab *tab,
-	__isl_keep isl_vec *sol, int n_op)
-{
-	int i;
-	isl_ctx *ctx;
-	isl_vec *v = NULL;
-
-	if (!sol)
-		return -1;
-
-	for (i = 0; i < n_op; ++i)
-		if (!isl_int_is_zero(sol->el[1 + i]))
-			break;
-
-	if (i == n_op) {
-		if (isl_tab_mark_empty(tab) < 0)
-			return -1;
-		return 0;
-	}
-
-	ctx = isl_vec_get_ctx(sol);
-	v = isl_vec_alloc(ctx, 1 + tab->n_var);
-	if (!v)
-		return -1;
-
-	for (; i >= 0; --i) {
-		v = isl_vec_clr(v);
-		isl_int_set_si(v->el[1 + i], -1);
-		if (add_lexmin_eq(tab, v->el) < 0)
-			goto error;
-	}
-
-	isl_vec_free(v);
-	return 0;
-error:
-	isl_vec_free(v);
-	return -1;
-}
-
-struct isl_trivial {
-	int update;
-	int region;
-	int side;
-	struct isl_tab_undo *snap;
-};
-
-/* Return the lexicographically smallest non-trivial solution of the
- * given ILP problem.
- *
- * All variables are assumed to be non-negative.
- *
- * n_op is the number of initial coordinates to optimize.
- * That is, once a solution has been found, we will only continue looking
- * for solution that result in significantly better values for those
- * initial coordinates.  That is, we only continue looking for solutions
- * that increase the number of initial zeros in this sequence.
- *
- * A solution is non-trivial, if it is non-trivial on each of the
- * specified regions.  Each region represents a sequence of pairs
- * of variables.  A solution is non-trivial on such a region if
- * at least one of these pairs consists of different values, i.e.,
- * such that the non-negative variable represented by the pair is non-zero.
- *
- * Whenever a conflict is encountered, all constraints involved are
- * reported to the caller through a call to "conflict".
- *
- * We perform a simple branch-and-bound backtracking search.
- * Each level in the search represents initially trivial region that is forced
- * to be non-trivial.
- * At each level we consider n cases, where n is the length of the region.
- * In terms of the n/2 variables of unrestricted signs being encoded by
- * the region, we consider the cases
- *	x_0 >= 1
- *	x_0 <= -1
- *	x_0 = 0 and x_1 >= 1
- *	x_0 = 0 and x_1 <= -1
- *	x_0 = 0 and x_1 = 0 and x_2 >= 1
- *	x_0 = 0 and x_1 = 0 and x_2 <= -1
- *	...
- * The cases are considered in this order, assuming that each pair
- * x_i_a x_i_b represents the value x_i_b - x_i_a.
- * That is, x_0 >= 1 is enforced by adding the constraint
- *	x_0_b - x_0_a >= 1
- */
-__isl_give isl_vec *isl_tab_basic_set_non_trivial_lexmin(
-	__isl_take isl_basic_set *bset, int n_op, int n_region,
-	struct isl_region *region,
-	int (*conflict)(int con, void *user), void *user)
-{
-	int i, j;
-	int r;
-	isl_ctx *ctx = isl_basic_set_get_ctx(bset);
-	isl_vec *v = NULL;
-	isl_vec *sol = isl_vec_alloc(ctx, 0);
-	struct isl_tab *tab;
-	struct isl_trivial *triv = NULL;
-	int level, init;
-
-	tab = tab_for_lexmin(bset, NULL, 0, 0);
-	if (!tab)
-		goto error;
-	tab->conflict = conflict;
-	tab->conflict_user = user;
-
-	v = isl_vec_alloc(ctx, 1 + tab->n_var);
-	triv = isl_calloc_array(ctx, struct isl_trivial, n_region);
-	if (!v || !triv)
-		goto error;
-
-	level = 0;
-	init = 1;
-
-	while (level >= 0) {
-		int side, base;
-
-		if (init) {
-			tab = cut_to_integer_lexmin(tab);
-			if (!tab)
-				goto error;
-			if (tab->empty)
-				goto backtrack;
-			r = first_trivial_region(tab, n_region, region);
-			if (r < 0) {
-				for (i = 0; i < level; ++i)
-					triv[i].update = 1;
-				isl_vec_free(sol);
-				sol = isl_tab_get_sample_value(tab);
-				if (!sol)
-					goto error;
-				if (is_optimal(sol, n_op))
-					break;
-				goto backtrack;
-			}
-			if (level >= n_region)
-				isl_die(ctx, isl_error_internal,
-					"nesting level too deep", goto error);
-			if (isl_tab_extend_cons(tab,
-					    2 * region[r].len + 2 * n_op) < 0)
-				goto error;
-			triv[level].region = r;
-			triv[level].side = 0;
-		}
-
-		r = triv[level].region;
-		side = triv[level].side;
-		base = 2 * (side/2);
-
-		if (side >= region[r].len) {
-backtrack:
-			level--;
-			init = 0;
-			if (level >= 0)
-				if (isl_tab_rollback(tab, triv[level].snap) < 0)
-					goto error;
-			continue;
-		}
-
-		if (triv[level].update) {
-			if (force_better_solution(tab, sol, n_op) < 0)
-				goto error;
-			triv[level].update = 0;
-		}
-
-		if (side == base && base >= 2) {
-			for (j = base - 2; j < base; ++j) {
-				v = isl_vec_clr(v);
-				isl_int_set_si(v->el[1 + region[r].pos + j], 1);
-				if (add_lexmin_eq(tab, v->el) < 0)
-					goto error;
-			}
-		}
-
-		triv[level].snap = isl_tab_snap(tab);
-		if (isl_tab_push_basis(tab) < 0)
-			goto error;
-
-		v = isl_vec_clr(v);
-		isl_int_set_si(v->el[0], -1);
-		isl_int_set_si(v->el[1 + region[r].pos + side], -1);
-		isl_int_set_si(v->el[1 + region[r].pos + (side ^ 1)], 1);
-		tab = add_lexmin_ineq(tab, v->el);
-
-		triv[level].side++;
-		level++;
-		init = 1;
-	}
-
-	free(triv);
-	isl_vec_free(v);
-	isl_tab_free(tab);
-	isl_basic_set_free(bset);
-
-	return sol;
-error:
-	free(triv);
-	isl_vec_free(v);
-	isl_tab_free(tab);
-	isl_basic_set_free(bset);
-	isl_vec_free(sol);
-	return NULL;
-}
-
-/* Return the lexicographically smallest rational point in "bset",
- * assuming that all variables are non-negative.
- * If "bset" is empty, then return a zero-length vector.
- */
-__isl_give isl_vec *isl_tab_basic_set_non_neg_lexmin(
-	__isl_take isl_basic_set *bset)
-{
-	struct isl_tab *tab;
-	isl_ctx *ctx = isl_basic_set_get_ctx(bset);
-	isl_vec *sol;
-
-	tab = tab_for_lexmin(bset, NULL, 0, 0);
-	if (!tab)
-		goto error;
-	if (tab->empty)
-		sol = isl_vec_alloc(ctx, 0);
-	else
-		sol = isl_tab_get_sample_value(tab);
-	isl_tab_free(tab);
-	isl_basic_set_free(bset);
-	return sol;
-error:
-	isl_tab_free(tab);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-struct isl_sol_pma {
-	struct isl_sol	sol;
-	isl_pw_multi_aff *pma;
-	isl_set *empty;
-};
-
-static void sol_pma_free(struct isl_sol_pma *sol_pma)
-{
-	if (!sol_pma)
-		return;
-	if (sol_pma->sol.context)
-		sol_pma->sol.context->op->free(sol_pma->sol.context);
-	isl_pw_multi_aff_free(sol_pma->pma);
-	isl_set_free(sol_pma->empty);
-	free(sol_pma);
-}
-
-/* This function is called for parts of the context where there is
- * no solution, with "bset" corresponding to the context tableau.
- * Simply add the basic set to the set "empty".
- */
-static void sol_pma_add_empty(struct isl_sol_pma *sol,
-	__isl_take isl_basic_set *bset)
-{
-	if (!bset)
-		goto error;
-	isl_assert(bset->ctx, sol->empty, goto error);
-
-	sol->empty = isl_set_grow(sol->empty, 1);
-	bset = isl_basic_set_simplify(bset);
-	bset = isl_basic_set_finalize(bset);
-	sol->empty = isl_set_add_basic_set(sol->empty, bset);
-	if (!sol->empty)
-		sol->sol.error = 1;
-	return;
-error:
-	isl_basic_set_free(bset);
-	sol->sol.error = 1;
-}
-
-/* Given a basic map "dom" that represents the context and an affine
- * matrix "M" that maps the dimensions of the context to the
- * output variables, construct an isl_pw_multi_aff with a single
- * cell corresponding to "dom" and affine expressions copied from "M".
- */
-static void sol_pma_add(struct isl_sol_pma *sol,
-	__isl_take isl_basic_set *dom, __isl_take isl_mat *M)
-{
-	int i;
-	isl_local_space *ls;
-	isl_aff *aff;
-	isl_multi_aff *maff;
-	isl_pw_multi_aff *pma;
-
-	maff = isl_multi_aff_alloc(isl_pw_multi_aff_get_space(sol->pma));
-	ls = isl_basic_set_get_local_space(dom);
-	for (i = 1; i < M->n_row; ++i) {
-		aff = isl_aff_alloc(isl_local_space_copy(ls));
-		if (aff) {
-			isl_int_set(aff->v->el[0], M->row[0][0]);
-			isl_seq_cpy(aff->v->el + 1, M->row[i], M->n_col);
-		}
-		aff = isl_aff_normalize(aff);
-		maff = isl_multi_aff_set_aff(maff, i - 1, aff);
-	}
-	isl_local_space_free(ls);
-	isl_mat_free(M);
-	dom = isl_basic_set_simplify(dom);
-	dom = isl_basic_set_finalize(dom);
-	pma = isl_pw_multi_aff_alloc(isl_set_from_basic_set(dom), maff);
-	sol->pma = isl_pw_multi_aff_add_disjoint(sol->pma, pma);
-	if (!sol->pma)
-		sol->sol.error = 1;
-}
-
-static void sol_pma_free_wrap(struct isl_sol *sol)
-{
-	sol_pma_free((struct isl_sol_pma *)sol);
-}
-
-static void sol_pma_add_empty_wrap(struct isl_sol *sol,
-	__isl_take isl_basic_set *bset)
-{
-	sol_pma_add_empty((struct isl_sol_pma *)sol, bset);
-}
-
-static void sol_pma_add_wrap(struct isl_sol *sol,
-	__isl_take isl_basic_set *dom, __isl_take isl_mat *M)
-{
-	sol_pma_add((struct isl_sol_pma *)sol, dom, M);
-}
-
-/* Construct an isl_sol_pma structure for accumulating the solution.
- * If track_empty is set, then we also keep track of the parts
- * of the context where there is no solution.
- * If max is set, then we are solving a maximization, rather than
- * a minimization problem, which means that the variables in the
- * tableau have value "M - x" rather than "M + x".
- */
-static struct isl_sol *sol_pma_init(__isl_keep isl_basic_map *bmap,
-	__isl_take isl_basic_set *dom, int track_empty, int max)
-{
-	struct isl_sol_pma *sol_pma = NULL;
-
-	if (!bmap)
-		goto error;
-
-	sol_pma = isl_calloc_type(bmap->ctx, struct isl_sol_pma);
-	if (!sol_pma)
-		goto error;
-
-	sol_pma->sol.rational = ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL);
-	sol_pma->sol.dec_level.callback.run = &sol_dec_level_wrap;
-	sol_pma->sol.dec_level.sol = &sol_pma->sol;
-	sol_pma->sol.max = max;
-	sol_pma->sol.n_out = isl_basic_map_dim(bmap, isl_dim_out);
-	sol_pma->sol.add = &sol_pma_add_wrap;
-	sol_pma->sol.add_empty = track_empty ? &sol_pma_add_empty_wrap : NULL;
-	sol_pma->sol.free = &sol_pma_free_wrap;
-	sol_pma->pma = isl_pw_multi_aff_empty(isl_basic_map_get_space(bmap));
-	if (!sol_pma->pma)
-		goto error;
-
-	sol_pma->sol.context = isl_context_alloc(dom);
-	if (!sol_pma->sol.context)
-		goto error;
-
-	if (track_empty) {
-		sol_pma->empty = isl_set_alloc_space(isl_basic_set_get_space(dom),
-							1, ISL_SET_DISJOINT);
-		if (!sol_pma->empty)
-			goto error;
-	}
-
-	isl_basic_set_free(dom);
-	return &sol_pma->sol;
-error:
-	isl_basic_set_free(dom);
-	sol_pma_free(sol_pma);
-	return NULL;
-}
-
-/* Base case of isl_tab_basic_map_partial_lexopt, after removing
- * some obvious symmetries.
- *
- * We call basic_map_partial_lexopt_base and extract the results.
- */
-static __isl_give isl_pw_multi_aff *basic_map_partial_lexopt_base_pma(
-	__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty, int max)
-{
-	isl_pw_multi_aff *result = NULL;
-	struct isl_sol *sol;
-	struct isl_sol_pma *sol_pma;
-
-	sol = basic_map_partial_lexopt_base(bmap, dom, empty, max,
-					    &sol_pma_init);
-	if (!sol)
-		return NULL;
-	sol_pma = (struct isl_sol_pma *) sol;
-
-	result = isl_pw_multi_aff_copy(sol_pma->pma);
-	if (empty)
-		*empty = isl_set_copy(sol_pma->empty);
-	sol_free(&sol_pma->sol);
-	return result;
-}
-
-/* Given that the last input variable of "maff" represents the minimum
- * of some bounds, check whether we need to plug in the expression
- * of the minimum.
- *
- * In particular, check if the last input variable appears in any
- * of the expressions in "maff".
- */
-static int need_substitution(__isl_keep isl_multi_aff *maff)
-{
-	int i;
-	unsigned pos;
-
-	pos = isl_multi_aff_dim(maff, isl_dim_in) - 1;
-
-	for (i = 0; i < maff->n; ++i)
-		if (isl_aff_involves_dims(maff->p[i], isl_dim_in, pos, 1))
-			return 1;
-
-	return 0;
-}
-
-/* Given a set of upper bounds on the last "input" variable m,
- * construct a piecewise affine expression that selects
- * the minimal upper bound to m, i.e.,
- * divide the space into cells where one
- * of the upper bounds is smaller than all the others and select
- * this upper bound on that cell.
- *
- * In particular, if there are n bounds b_i, then the result
- * consists of n cell, each one of the form
- *
- *	b_i <= b_j	for j > i
- *	b_i <  b_j	for j < i
- *
- * The affine expression on this cell is
- *
- *	b_i
- */
-static __isl_give isl_pw_aff *set_minimum_pa(__isl_take isl_space *space,
-	__isl_take isl_mat *var)
-{
-	int i;
-	isl_aff *aff = NULL;
-	isl_basic_set *bset = NULL;
-	isl_ctx *ctx;
-	isl_pw_aff *paff = NULL;
-	isl_space *pw_space;
-	isl_local_space *ls = NULL;
-
-	if (!space || !var)
-		goto error;
-
-	ctx = isl_space_get_ctx(space);
-	ls = isl_local_space_from_space(isl_space_copy(space));
-	pw_space = isl_space_copy(space);
-	pw_space = isl_space_from_domain(pw_space);
-	pw_space = isl_space_add_dims(pw_space, isl_dim_out, 1);
-	paff = isl_pw_aff_alloc_size(pw_space, var->n_row);
-
-	for (i = 0; i < var->n_row; ++i) {
-		isl_pw_aff *paff_i;
-
-		aff = isl_aff_alloc(isl_local_space_copy(ls));
-		bset = isl_basic_set_alloc_space(isl_space_copy(space), 0,
-					       0, var->n_row - 1);
-		if (!aff || !bset)
-			goto error;
-		isl_int_set_si(aff->v->el[0], 1);
-		isl_seq_cpy(aff->v->el + 1, var->row[i], var->n_col);
-		isl_int_set_si(aff->v->el[1 + var->n_col], 0);
-		bset = select_minimum(bset, var, i);
-		paff_i = isl_pw_aff_alloc(isl_set_from_basic_set(bset), aff);
-		paff = isl_pw_aff_add_disjoint(paff, paff_i);
-	}
-
-	isl_local_space_free(ls);
-	isl_space_free(space);
-	isl_mat_free(var);
-	return paff;
-error:
-	isl_aff_free(aff);
-	isl_basic_set_free(bset);
-	isl_pw_aff_free(paff);
-	isl_local_space_free(ls);
-	isl_space_free(space);
-	isl_mat_free(var);
-	return NULL;
-}
-
-/* Given a piecewise multi-affine expression of which the last input variable
- * is the minimum of the bounds in "cst", plug in the value of the minimum.
- * This minimum expression is given in "min_expr_pa".
- * The set "min_expr" contains the same information, but in the form of a set.
- * The variable is subsequently projected out.
- *
- * The implementation is similar to those of "split" and "split_domain".
- * If the variable appears in a given expression, then minimum expression
- * is plugged in.  Otherwise, if the variable appears in the constraints
- * and a split is required, then the domain is split.  Otherwise, no split
- * is performed.
- */
-static __isl_give isl_pw_multi_aff *split_domain_pma(
-	__isl_take isl_pw_multi_aff *opt, __isl_take isl_pw_aff *min_expr_pa,
-	__isl_take isl_set *min_expr, __isl_take isl_mat *cst)
-{
-	int n_in;
-	int i;
-	isl_space *space;
-	isl_pw_multi_aff *res;
-
-	if (!opt || !min_expr || !cst)
-		goto error;
-
-	n_in = isl_pw_multi_aff_dim(opt, isl_dim_in);
-	space = isl_pw_multi_aff_get_space(opt);
-	space = isl_space_drop_dims(space, isl_dim_in, n_in - 1, 1);
-	res = isl_pw_multi_aff_empty(space);
-
-	for (i = 0; i < opt->n; ++i) {
-		isl_pw_multi_aff *pma;
-
-		pma = isl_pw_multi_aff_alloc(isl_set_copy(opt->p[i].set),
-					 isl_multi_aff_copy(opt->p[i].maff));
-		if (need_substitution(opt->p[i].maff))
-			pma = isl_pw_multi_aff_substitute(pma,
-					isl_dim_in, n_in - 1, min_expr_pa);
-		else if (need_split_set(opt->p[i].set, cst))
-			pma = isl_pw_multi_aff_intersect_domain(pma,
-						       isl_set_copy(min_expr));
-		pma = isl_pw_multi_aff_project_out(pma,
-						    isl_dim_in, n_in - 1, 1);
-
-		res = isl_pw_multi_aff_add_disjoint(res, pma);
-	}
-
-	isl_pw_multi_aff_free(opt);
-	isl_pw_aff_free(min_expr_pa);
-	isl_set_free(min_expr);
-	isl_mat_free(cst);
-	return res;
-error:
-	isl_pw_multi_aff_free(opt);
-	isl_pw_aff_free(min_expr_pa);
-	isl_set_free(min_expr);
-	isl_mat_free(cst);
-	return NULL;
-}
-
-static __isl_give isl_pw_multi_aff *basic_map_partial_lexopt_pma(
-	__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty, int max);
-
-/* This function is called from basic_map_partial_lexopt_symm.
- * The last variable of "bmap" and "dom" corresponds to the minimum
- * of the bounds in "cst".  "map_space" is the space of the original
- * input relation (of basic_map_partial_lexopt_symm) and "set_space"
- * is the space of the original domain.
- *
- * We recursively call basic_map_partial_lexopt and then plug in
- * the definition of the minimum in the result.
- */
-static __isl_give union isl_lex_res basic_map_partial_lexopt_symm_pma_core(
-	__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty, int max, __isl_take isl_mat *cst,
-	__isl_take isl_space *map_space, __isl_take isl_space *set_space)
-{
-	isl_pw_multi_aff *opt;
-	isl_pw_aff *min_expr_pa;
-	isl_set *min_expr;
-	union isl_lex_res res;
-
-	min_expr = set_minimum(isl_basic_set_get_space(dom), isl_mat_copy(cst));
-	min_expr_pa = set_minimum_pa(isl_basic_set_get_space(dom),
-					isl_mat_copy(cst));
-
-	opt = basic_map_partial_lexopt_pma(bmap, dom, empty, max);
-
-	if (empty) {
-		*empty = split(*empty,
-			       isl_set_copy(min_expr), isl_mat_copy(cst));
-		*empty = isl_set_reset_space(*empty, set_space);
-	}
-
-	opt = split_domain_pma(opt, min_expr_pa, min_expr, cst);
-	opt = isl_pw_multi_aff_reset_space(opt, map_space);
-
-	res.pma = opt;
-	return res;
-}
-
-static __isl_give isl_pw_multi_aff *basic_map_partial_lexopt_symm_pma(
-	__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty, int max, int first, int second)
-{
-	return basic_map_partial_lexopt_symm(bmap, dom, empty, max,
-		    first, second, &basic_map_partial_lexopt_symm_pma_core).pma;
-}
-
-/* Recursive part of isl_basic_map_partial_lexopt_pw_multi_aff, after detecting
- * equalities and removing redundant constraints.
- *
- * We first check if there are any parallel constraints (left).
- * If not, we are in the base case.
- * If there are parallel constraints, we replace them by a single
- * constraint in basic_map_partial_lexopt_symm_pma and then call
- * this function recursively to look for more parallel constraints.
- */
-static __isl_give isl_pw_multi_aff *basic_map_partial_lexopt_pma(
-	__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty, int max)
-{
-	int par = 0;
-	int first, second;
-
-	if (!bmap)
-		goto error;
-
-	if (bmap->ctx->opt->pip_symmetry)
-		par = parallel_constraints(bmap, &first, &second);
-	if (par < 0)
-		goto error;
-	if (!par)
-		return basic_map_partial_lexopt_base_pma(bmap, dom, empty, max);
-	
-	return basic_map_partial_lexopt_symm_pma(bmap, dom, empty, max,
-						 first, second);
-error:
-	isl_basic_set_free(dom);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Compute the lexicographic minimum (or maximum if "max" is set)
- * of "bmap" over the domain "dom" and return the result as a piecewise
- * multi-affine expression.
- * If "empty" is not NULL, then *empty is assigned a set that
- * contains those parts of the domain where there is no solution.
- * If "bmap" is marked as rational (ISL_BASIC_MAP_RATIONAL),
- * then we compute the rational optimum.  Otherwise, we compute
- * the integral optimum.
- *
- * We perform some preprocessing.  As the PILP solver does not
- * handle implicit equalities very well, we first make sure all
- * the equalities are explicitly available.
- *
- * We also add context constraints to the basic map and remove
- * redundant constraints.  This is only needed because of the
- * way we handle simple symmetries.  In particular, we currently look
- * for symmetries on the constraints, before we set up the main tableau.
- * It is then no good to look for symmetries on possibly redundant constraints.
- */
-__isl_give isl_pw_multi_aff *isl_basic_map_partial_lexopt_pw_multi_aff(
-	__isl_take isl_basic_map *bmap, __isl_take isl_basic_set *dom,
-	__isl_give isl_set **empty, int max)
-{
-	if (empty)
-		*empty = NULL;
-	if (!bmap || !dom)
-		goto error;
-
-	isl_assert(bmap->ctx,
-	    isl_basic_map_compatible_domain(bmap, dom), goto error);
-
-	if (isl_basic_set_dim(dom, isl_dim_all) == 0)
-		return basic_map_partial_lexopt_pma(bmap, dom, empty, max);
-
-	bmap = isl_basic_map_intersect_domain(bmap, isl_basic_set_copy(dom));
-	bmap = isl_basic_map_detect_equalities(bmap);
-	bmap = isl_basic_map_remove_redundancies(bmap);
-
-	return basic_map_partial_lexopt_pma(bmap, dom, empty, max);
-error:
-	isl_basic_set_free(dom);
-	isl_basic_map_free(bmap);
-	return NULL;
-}
diff --git a/cloog-0.17.0/isl/isl_test.c b/cloog-0.17.0/isl/isl_test.c
deleted file mode 100644
index 2b21331..0000000
--- a/cloog-0.17.0/isl/isl_test.c
+++ /dev/null
@@ -1,2579 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <assert.h>
-#include <stdio.h>
-#include <limits.h>
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl/aff.h>
-#include <isl/set.h>
-#include <isl/flow.h>
-#include <isl/constraint.h>
-#include <isl/polynomial.h>
-#include <isl/union_map.h>
-#include <isl_factorization.h>
-#include <isl/schedule.h>
-#include <isl_options_private.h>
-
-static char *srcdir;
-
-static char *get_filename(isl_ctx *ctx, const char *name, const char *suffix) {
-	char *filename;
-	int length;
-	char *pattern = "%s/test_inputs/%s.%s";
-
-	length = strlen(pattern) - 6 + strlen(srcdir) + strlen(name)
-		+ strlen(suffix) + 1;
-	filename = isl_alloc_array(ctx, char, length);
-
-	if (!filename)
-		return NULL;
-
-	sprintf(filename, pattern, srcdir, name, suffix);
-
-	return filename;
-}
-
-void test_parse_map(isl_ctx *ctx, const char *str)
-{
-	isl_map *map;
-
-	map = isl_map_read_from_str(ctx, str);
-	assert(map);
-	isl_map_free(map);
-}
-
-void test_parse_map_equal(isl_ctx *ctx, const char *str, const char *str2)
-{
-	isl_map *map, *map2;
-
-	map = isl_map_read_from_str(ctx, str);
-	map2 = isl_map_read_from_str(ctx, str2);
-	assert(map && map2 && isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-}
-
-void test_parse_pwqp(isl_ctx *ctx, const char *str)
-{
-	isl_pw_qpolynomial *pwqp;
-
-	pwqp = isl_pw_qpolynomial_read_from_str(ctx, str);
-	assert(pwqp);
-	isl_pw_qpolynomial_free(pwqp);
-}
-
-static void test_parse_pwaff(isl_ctx *ctx, const char *str)
-{
-	isl_pw_aff *pwaff;
-
-	pwaff = isl_pw_aff_read_from_str(ctx, str);
-	assert(pwaff);
-	isl_pw_aff_free(pwaff);
-}
-
-void test_parse(struct isl_ctx *ctx)
-{
-	isl_map *map, *map2;
-	const char *str, *str2;
-
-	str = "{ [i] -> [-i] }";
-	map = isl_map_read_from_str(ctx, str);
-	assert(map);
-	isl_map_free(map);
-
-	str = "{ A[i] -> L[([i/3])] }";
-	map = isl_map_read_from_str(ctx, str);
-	assert(map);
-	isl_map_free(map);
-
-	test_parse_map(ctx, "{[[s] -> A[i]] -> [[s+1] -> A[i]]}");
-	test_parse_map(ctx, "{ [p1, y1, y2] -> [2, y1, y2] : "
-				"p1 = 1 && (y1 <= y2 || y2 = 0) }");
-
-	str = "{ [x,y]  : [([x/2]+y)/3] >= 1 }";
-	str2 = "{ [x, y] : 2y >= 6 - x }";
-	test_parse_map_equal(ctx, str, str2);
-
-	test_parse_map_equal(ctx, "{ [x,y] : x <= min(y, 2*y+3) }",
-				  "{ [x,y] : x <= y, 2*y + 3 }");
-	str = "{ [x, y] : (y <= x and y >= -3) or (2y <= -3 + x and y <= -4) }";
-	test_parse_map_equal(ctx, "{ [x,y] : x >= min(y, 2*y+3) }", str);
-
-	str = "{[new,old] -> [new+1-2*[(new+1)/2],old+1-2*[(old+1)/2]]}";
-	map = isl_map_read_from_str(ctx, str);
-	str = "{ [new, old] -> [o0, o1] : "
-	       "exists (e0 = [(-1 - new + o0)/2], e1 = [(-1 - old + o1)/2]: "
-	       "2e0 = -1 - new + o0 and 2e1 = -1 - old + o1 and o0 >= 0 and "
-	       "o0 <= 1 and o1 >= 0 and o1 <= 1) }";
-	map2 = isl_map_read_from_str(ctx, str);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "{[new,old] -> [new+1-2*[(new+1)/2],old+1-2*[(old+1)/2]]}";
-	map = isl_map_read_from_str(ctx, str);
-	str = "{[new,old] -> [(new+1)%2,(old+1)%2]}";
-	map2 = isl_map_read_from_str(ctx, str);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "[n] -> { [c1] : c1>=0 and c1<=floord(n-4,3) }";
-	str2 = "[n] -> { [c1] : c1 >= 0 and 3c1 <= -4 + n }";
-	test_parse_map_equal(ctx, str, str2);
-
-	str = "{ [i,j] -> [i] : i < j; [i,j] -> [j] : j <= i }";
-	str2 = "{ [i,j] -> [min(i,j)] }";
-	test_parse_map_equal(ctx, str, str2);
-
-	str = "{ [i,j] : i != j }";
-	str2 = "{ [i,j] : i < j or i > j }";
-	test_parse_map_equal(ctx, str, str2);
-
-	str = "{ [i,j] : (i+1)*2 >= j }";
-	str2 = "{ [i, j] : j <= 2 + 2i }";
-	test_parse_map_equal(ctx, str, str2);
-
-	str = "{ [i] -> [i > 0 ? 4 : 5] }";
-	str2 = "{ [i] -> [5] : i <= 0; [i] -> [4] : i >= 1 }";
-	test_parse_map_equal(ctx, str, str2);
-
-	str = "[N=2,M] -> { [i=[(M+N)/4]] }";
-	str2 = "[N, M] -> { [i] : N = 2 and 4i <= 2 + M and 4i >= -1 + M }";
-	test_parse_map_equal(ctx, str, str2);
-
-	str = "{ [x] : x >= 0 }";
-	str2 = "{ [x] : x-0 >= 0 }";
-	test_parse_map_equal(ctx, str, str2);
-
-	str = "{ [i] : ((i > 10)) }";
-	str2 = "{ [i] : i >= 11 }";
-	test_parse_map_equal(ctx, str, str2);
-
-	str = "{ [i] -> [0] }";
-	str2 = "{ [i] -> [0 * i] }";
-	test_parse_map_equal(ctx, str, str2);
-
-	test_parse_pwqp(ctx, "{ [i] -> i + [ (i + [i/3])/2 ] }");
-	test_parse_map(ctx, "{ S1[i] -> [([i/10]),i%10] : 0 <= i <= 45 }");
-	test_parse_pwaff(ctx, "{ [i] -> [i + 1] : i > 0; [a] -> [a] : a < 0 }");
-}
-
-void test_read(struct isl_ctx *ctx)
-{
-	char *filename;
-	FILE *input;
-	struct isl_basic_set *bset1, *bset2;
-	const char *str = "{[y]: Exists ( alpha : 2alpha = y)}";
-
-	filename = get_filename(ctx, "set", "omega");
-	assert(filename);
-	input = fopen(filename, "r");
-	assert(input);
-
-	bset1 = isl_basic_set_read_from_file(ctx, input);
-	bset2 = isl_basic_set_read_from_str(ctx, str);
-
-	assert(isl_basic_set_is_equal(bset1, bset2) == 1);
-
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	free(filename);
-
-	fclose(input);
-}
-
-void test_bounded(struct isl_ctx *ctx)
-{
-	isl_set *set;
-	int bounded;
-
-	set = isl_set_read_from_str(ctx, "[n] -> {[i] : 0 <= i <= n }");
-	bounded = isl_set_is_bounded(set);
-	assert(bounded);
-	isl_set_free(set);
-
-	set = isl_set_read_from_str(ctx, "{[n, i] : 0 <= i <= n }");
-	bounded = isl_set_is_bounded(set);
-	assert(!bounded);
-	isl_set_free(set);
-
-	set = isl_set_read_from_str(ctx, "[n] -> {[i] : i <= n }");
-	bounded = isl_set_is_bounded(set);
-	assert(!bounded);
-	isl_set_free(set);
-}
-
-/* Construct the basic set { [i] : 5 <= i <= N } */
-void test_construction(struct isl_ctx *ctx)
-{
-	isl_int v;
-	isl_space *dim;
-	isl_local_space *ls;
-	struct isl_basic_set *bset;
-	struct isl_constraint *c;
-
-	isl_int_init(v);
-
-	dim = isl_space_set_alloc(ctx, 1, 1);
-	bset = isl_basic_set_universe(isl_space_copy(dim));
-	ls = isl_local_space_from_space(dim);
-
-	c = isl_inequality_alloc(isl_local_space_copy(ls));
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_param, 0, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	c = isl_inequality_alloc(isl_local_space_copy(ls));
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, -5);
-	isl_constraint_set_constant(c, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	isl_local_space_free(ls);
-	isl_basic_set_free(bset);
-
-	isl_int_clear(v);
-}
-
-void test_dim(struct isl_ctx *ctx)
-{
-	const char *str;
-	isl_map *map1, *map2;
-
-	map1 = isl_map_read_from_str(ctx,
-	    "[n] -> { [i] -> [j] : exists (a = [i/10] : i - 10a <= n ) }");
-	map1 = isl_map_add_dims(map1, isl_dim_in, 1);
-	map2 = isl_map_read_from_str(ctx,
-	    "[n] -> { [i,k] -> [j] : exists (a = [i/10] : i - 10a <= n ) }");
-	assert(isl_map_is_equal(map1, map2));
-	isl_map_free(map2);
-
-	map1 = isl_map_project_out(map1, isl_dim_in, 0, 1);
-	map2 = isl_map_read_from_str(ctx, "[n] -> { [i] -> [j] : n >= 0 }");
-	assert(isl_map_is_equal(map1, map2));
-
-	isl_map_free(map1);
-	isl_map_free(map2);
-
-	str = "[n] -> { [i] -> [] : exists a : 0 <= i <= n and i = 2 a }";
-	map1 = isl_map_read_from_str(ctx, str);
-	str = "{ [i] -> [j] : exists a : 0 <= i <= j and i = 2 a }";
-	map2 = isl_map_read_from_str(ctx, str);
-	map1 = isl_map_move_dims(map1, isl_dim_out, 0, isl_dim_param, 0, 1);
-	assert(isl_map_is_equal(map1, map2));
-
-	isl_map_free(map1);
-	isl_map_free(map2);
-}
-
-void test_div(struct isl_ctx *ctx)
-{
-	isl_int v;
-	isl_space *dim;
-	isl_local_space *ls;
-	struct isl_basic_set *bset;
-	struct isl_constraint *c;
-
-	isl_int_init(v);
-
-	/* test 1 */
-	dim = isl_space_set_alloc(ctx, 0, 3);
-	bset = isl_basic_set_universe(isl_space_copy(dim));
-	ls = isl_local_space_from_space(dim);
-
-	c = isl_equality_alloc(isl_local_space_copy(ls));
-	isl_int_set_si(v, -1);
-	isl_constraint_set_constant(c, v);
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	c = isl_equality_alloc(isl_local_space_copy(ls));
-	isl_int_set_si(v, 1);
-	isl_constraint_set_constant(c, v);
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 2, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 1, 2);
-
-	assert(bset && bset->n_div == 1);
-	isl_local_space_free(ls);
-	isl_basic_set_free(bset);
-
-	/* test 2 */
-	dim = isl_space_set_alloc(ctx, 0, 3);
-	bset = isl_basic_set_universe(isl_space_copy(dim));
-	ls = isl_local_space_from_space(dim);
-
-	c = isl_equality_alloc(isl_local_space_copy(ls));
-	isl_int_set_si(v, 1);
-	isl_constraint_set_constant(c, v);
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	c = isl_equality_alloc(isl_local_space_copy(ls));
-	isl_int_set_si(v, -1);
-	isl_constraint_set_constant(c, v);
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 2, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 1, 2);
-
-	assert(bset && bset->n_div == 1);
-	isl_local_space_free(ls);
-	isl_basic_set_free(bset);
-
-	/* test 3 */
-	dim = isl_space_set_alloc(ctx, 0, 3);
-	bset = isl_basic_set_universe(isl_space_copy(dim));
-	ls = isl_local_space_from_space(dim);
-
-	c = isl_equality_alloc(isl_local_space_copy(ls));
-	isl_int_set_si(v, 1);
-	isl_constraint_set_constant(c, v);
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	c = isl_equality_alloc(isl_local_space_copy(ls));
-	isl_int_set_si(v, -3);
-	isl_constraint_set_constant(c, v);
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 4);
-	isl_constraint_set_coefficient(c, isl_dim_set, 2, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 1, 2);
-
-	assert(bset && bset->n_div == 1);
-	isl_local_space_free(ls);
-	isl_basic_set_free(bset);
-
-	/* test 4 */
-	dim = isl_space_set_alloc(ctx, 0, 3);
-	bset = isl_basic_set_universe(isl_space_copy(dim));
-	ls = isl_local_space_from_space(dim);
-
-	c = isl_equality_alloc(isl_local_space_copy(ls));
-	isl_int_set_si(v, 2);
-	isl_constraint_set_constant(c, v);
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	c = isl_equality_alloc(isl_local_space_copy(ls));
-	isl_int_set_si(v, -1);
-	isl_constraint_set_constant(c, v);
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 6);
-	isl_constraint_set_coefficient(c, isl_dim_set, 2, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 1, 2);
-
-	assert(isl_basic_set_is_empty(bset));
-	isl_local_space_free(ls);
-	isl_basic_set_free(bset);
-
-	/* test 5 */
-	dim = isl_space_set_alloc(ctx, 0, 3);
-	bset = isl_basic_set_universe(isl_space_copy(dim));
-	ls = isl_local_space_from_space(dim);
-
-	c = isl_equality_alloc(isl_local_space_copy(ls));
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 2, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	c = isl_equality_alloc(isl_local_space_copy(ls));
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, -3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 2, 1);
-
-	assert(bset && bset->n_div == 0);
-	isl_basic_set_free(bset);
-	isl_local_space_free(ls);
-
-	/* test 6 */
-	dim = isl_space_set_alloc(ctx, 0, 3);
-	bset = isl_basic_set_universe(isl_space_copy(dim));
-	ls = isl_local_space_from_space(dim);
-
-	c = isl_equality_alloc(isl_local_space_copy(ls));
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 6);
-	isl_constraint_set_coefficient(c, isl_dim_set, 2, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	c = isl_equality_alloc(isl_local_space_copy(ls));
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, -3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 2, 1);
-
-	assert(bset && bset->n_div == 1);
-	isl_basic_set_free(bset);
-	isl_local_space_free(ls);
-
-	/* test 7 */
-	/* This test is a bit tricky.  We set up an equality
-	 *		a + 3b + 3c = 6 e0
-	 * Normalization of divs creates _two_ divs
-	 *		a = 3 e0
-	 *		c - b - e0 = 2 e1
-	 * Afterwards e0 is removed again because it has coefficient -1
-	 * and we end up with the original equality and div again.
-	 * Perhaps we can avoid the introduction of this temporary div.
-	 */
-	dim = isl_space_set_alloc(ctx, 0, 4);
-	bset = isl_basic_set_universe(isl_space_copy(dim));
-	ls = isl_local_space_from_space(dim);
-
-	c = isl_equality_alloc(isl_local_space_copy(ls));
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, -3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
-	isl_int_set_si(v, -3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 2, v);
-	isl_int_set_si(v, 6);
-	isl_constraint_set_coefficient(c, isl_dim_set, 3, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 3, 1);
-
-	/* Test disabled for now */
-	/*
-	assert(bset && bset->n_div == 1);
-	*/
-	isl_local_space_free(ls);
-	isl_basic_set_free(bset);
-
-	/* test 8 */
-	dim = isl_space_set_alloc(ctx, 0, 5);
-	bset = isl_basic_set_universe(isl_space_copy(dim));
-	ls = isl_local_space_from_space(dim);
-
-	c = isl_equality_alloc(isl_local_space_copy(ls));
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, -3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
-	isl_int_set_si(v, -3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 3, v);
-	isl_int_set_si(v, 6);
-	isl_constraint_set_coefficient(c, isl_dim_set, 4, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	c = isl_equality_alloc(isl_local_space_copy(ls));
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 2, v);
-	isl_int_set_si(v, 1);
-	isl_constraint_set_constant(c, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 4, 1);
-
-	/* Test disabled for now */
-	/*
-	assert(bset && bset->n_div == 1);
-	*/
-	isl_local_space_free(ls);
-	isl_basic_set_free(bset);
-
-	/* test 9 */
-	dim = isl_space_set_alloc(ctx, 0, 4);
-	bset = isl_basic_set_universe(isl_space_copy(dim));
-	ls = isl_local_space_from_space(dim);
-
-	c = isl_equality_alloc(isl_local_space_copy(ls));
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
-	isl_int_set_si(v, -2);
-	isl_constraint_set_coefficient(c, isl_dim_set, 2, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	c = isl_equality_alloc(isl_local_space_copy(ls));
-	isl_int_set_si(v, -1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, 3);
-	isl_constraint_set_coefficient(c, isl_dim_set, 3, v);
-	isl_int_set_si(v, 2);
-	isl_constraint_set_constant(c, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 2, 2);
-
-	bset = isl_basic_set_fix_si(bset, isl_dim_set, 0, 2);
-
-	assert(!isl_basic_set_is_empty(bset));
-
-	isl_local_space_free(ls);
-	isl_basic_set_free(bset);
-
-	/* test 10 */
-	dim = isl_space_set_alloc(ctx, 0, 3);
-	bset = isl_basic_set_universe(isl_space_copy(dim));
-	ls = isl_local_space_from_space(dim);
-
-	c = isl_equality_alloc(isl_local_space_copy(ls));
-	isl_int_set_si(v, 1);
-	isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
-	isl_int_set_si(v, -2);
-	isl_constraint_set_coefficient(c, isl_dim_set, 2, v);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	bset = isl_basic_set_project_out(bset, isl_dim_set, 2, 1);
-
-	bset = isl_basic_set_fix_si(bset, isl_dim_set, 0, 2);
-
-	isl_local_space_free(ls);
-	isl_basic_set_free(bset);
-
-	isl_int_clear(v);
-}
-
-void test_application_case(struct isl_ctx *ctx, const char *name)
-{
-	char *filename;
-	FILE *input;
-	struct isl_basic_set *bset1, *bset2;
-	struct isl_basic_map *bmap;
-
-	filename = get_filename(ctx, name, "omega");
-	assert(filename);
-	input = fopen(filename, "r");
-	assert(input);
-
-	bset1 = isl_basic_set_read_from_file(ctx, input);
-	bmap = isl_basic_map_read_from_file(ctx, input);
-
-	bset1 = isl_basic_set_apply(bset1, bmap);
-
-	bset2 = isl_basic_set_read_from_file(ctx, input);
-
-	assert(isl_basic_set_is_equal(bset1, bset2) == 1);
-
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	free(filename);
-
-	fclose(input);
-}
-
-void test_application(struct isl_ctx *ctx)
-{
-	test_application_case(ctx, "application");
-	test_application_case(ctx, "application2");
-}
-
-void test_affine_hull_case(struct isl_ctx *ctx, const char *name)
-{
-	char *filename;
-	FILE *input;
-	struct isl_basic_set *bset1, *bset2;
-
-	filename = get_filename(ctx, name, "polylib");
-	assert(filename);
-	input = fopen(filename, "r");
-	assert(input);
-
-	bset1 = isl_basic_set_read_from_file(ctx, input);
-	bset2 = isl_basic_set_read_from_file(ctx, input);
-
-	bset1 = isl_basic_set_affine_hull(bset1);
-
-	assert(isl_basic_set_is_equal(bset1, bset2) == 1);
-
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	free(filename);
-
-	fclose(input);
-}
-
-void test_affine_hull(struct isl_ctx *ctx)
-{
-	test_affine_hull_case(ctx, "affine2");
-	test_affine_hull_case(ctx, "affine");
-	test_affine_hull_case(ctx, "affine3");
-}
-
-void test_convex_hull_case(struct isl_ctx *ctx, const char *name)
-{
-	char *filename;
-	FILE *input;
-	struct isl_basic_set *bset1, *bset2;
-	struct isl_set *set;
-
-	filename = get_filename(ctx, name, "polylib");
-	assert(filename);
-	input = fopen(filename, "r");
-	assert(input);
-
-	bset1 = isl_basic_set_read_from_file(ctx, input);
-	bset2 = isl_basic_set_read_from_file(ctx, input);
-
-	set = isl_basic_set_union(bset1, bset2);
-	bset1 = isl_set_convex_hull(set);
-
-	bset2 = isl_basic_set_read_from_file(ctx, input);
-
-	assert(isl_basic_set_is_equal(bset1, bset2) == 1);
-
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	free(filename);
-
-	fclose(input);
-}
-
-void test_convex_hull_algo(struct isl_ctx *ctx, int convex)
-{
-	const char *str1, *str2;
-	isl_set *set1, *set2;
-	int orig_convex = ctx->opt->convex;
-	ctx->opt->convex = convex;
-
-	test_convex_hull_case(ctx, "convex0");
-	test_convex_hull_case(ctx, "convex1");
-	test_convex_hull_case(ctx, "convex2");
-	test_convex_hull_case(ctx, "convex3");
-	test_convex_hull_case(ctx, "convex4");
-	test_convex_hull_case(ctx, "convex5");
-	test_convex_hull_case(ctx, "convex6");
-	test_convex_hull_case(ctx, "convex7");
-	test_convex_hull_case(ctx, "convex8");
-	test_convex_hull_case(ctx, "convex9");
-	test_convex_hull_case(ctx, "convex10");
-	test_convex_hull_case(ctx, "convex11");
-	test_convex_hull_case(ctx, "convex12");
-	test_convex_hull_case(ctx, "convex13");
-	test_convex_hull_case(ctx, "convex14");
-	test_convex_hull_case(ctx, "convex15");
-
-	str1 = "{ [i0, i1, i2] : (i2 = 1 and i0 = 0 and i1 >= 0) or "
-	       "(i0 = 1 and i1 = 0 and i2 = 1) or "
-	       "(i0 = 0 and i1 = 0 and i2 = 0) }";
-	str2 = "{ [i0, i1, i2] : i0 >= 0 and i2 >= i0 and i2 <= 1 and i1 >= 0 }";
-	set1 = isl_set_read_from_str(ctx, str1);
-	set2 = isl_set_read_from_str(ctx, str2);
-	set1 = isl_set_from_basic_set(isl_set_convex_hull(set1));
-	assert(isl_set_is_equal(set1, set2));
-	isl_set_free(set1);
-	isl_set_free(set2);
-
-	ctx->opt->convex = orig_convex;
-}
-
-void test_convex_hull(struct isl_ctx *ctx)
-{
-	test_convex_hull_algo(ctx, ISL_CONVEX_HULL_FM);
-	test_convex_hull_algo(ctx, ISL_CONVEX_HULL_WRAP);
-}
-
-void test_gist_case(struct isl_ctx *ctx, const char *name)
-{
-	char *filename;
-	FILE *input;
-	struct isl_basic_set *bset1, *bset2;
-
-	filename = get_filename(ctx, name, "polylib");
-	assert(filename);
-	input = fopen(filename, "r");
-	assert(input);
-
-	bset1 = isl_basic_set_read_from_file(ctx, input);
-	bset2 = isl_basic_set_read_from_file(ctx, input);
-
-	bset1 = isl_basic_set_gist(bset1, bset2);
-
-	bset2 = isl_basic_set_read_from_file(ctx, input);
-
-	assert(isl_basic_set_is_equal(bset1, bset2) == 1);
-
-	isl_basic_set_free(bset1);
-	isl_basic_set_free(bset2);
-	free(filename);
-
-	fclose(input);
-}
-
-void test_gist(struct isl_ctx *ctx)
-{
-	const char *str;
-	isl_basic_set *bset1, *bset2;
-
-	test_gist_case(ctx, "gist1");
-
-	str = "[p0, p2, p3, p5, p6, p10] -> { [] : "
-	    "exists (e0 = [(15 + p0 + 15p6 + 15p10)/16], e1 = [(p5)/8], "
-	    "e2 = [(p6)/128], e3 = [(8p2 - p5)/128], "
-	    "e4 = [(128p3 - p6)/4096]: 8e1 = p5 and 128e2 = p6 and "
-	    "128e3 = 8p2 - p5 and 4096e4 = 128p3 - p6 and p2 >= 0 and "
-	    "16e0 >= 16 + 16p6 + 15p10 and  p2 <= 15 and p3 >= 0 and "
-	    "p3 <= 31 and  p6 >= 128p3 and p5 >= 8p2 and p10 >= 0 and "
-	    "16e0 <= 15 + p0 + 15p6 + 15p10 and 16e0 >= p0 + 15p6 + 15p10 and "
-	    "p10 <= 15 and p10 <= -1 + p0 - p6) }";
-	bset1 = isl_basic_set_read_from_str(ctx, str);
-	str = "[p0, p2, p3, p5, p6, p10] -> { [] : exists (e0 = [(p5)/8], "
-	    "e1 = [(p6)/128], e2 = [(8p2 - p5)/128], "
-	    "e3 = [(128p3 - p6)/4096]: 8e0 = p5 and 128e1 = p6 and "
-	    "128e2 = 8p2 - p5 and 4096e3 = 128p3 - p6 and p5 >= -7 and "
-	    "p2 >= 0 and 8p2 <= -1 + p0 and p2 <= 15 and p3 >= 0 and "
-	    "p3 <= 31 and 128p3 <= -1 + p0 and p6 >= -127 and "
-	    "p5 <= -1 + p0 and p6 <= -1 + p0 and p6 >= 128p3 and "
-	    "p0 >= 1 and p5 >= 8p2 and p10 >= 0 and p10 <= 15 ) }";
-	bset2 = isl_basic_set_read_from_str(ctx, str);
-	bset1 = isl_basic_set_gist(bset1, bset2);
-	assert(bset1 && bset1->n_div == 0);
-	isl_basic_set_free(bset1);
-}
-
-void test_coalesce_set(isl_ctx *ctx, const char *str, int check_one)
-{
-	isl_set *set, *set2;
-
-	set = isl_set_read_from_str(ctx, str);
-	set = isl_set_coalesce(set);
-	set2 = isl_set_read_from_str(ctx, str);
-	assert(isl_set_is_equal(set, set2));
-	if (check_one)
-		assert(set && set->n == 1);
-	isl_set_free(set);
-	isl_set_free(set2);
-}
-
-void test_coalesce(struct isl_ctx *ctx)
-{
-	const char *str;
-	struct isl_set *set, *set2;
-	struct isl_map *map, *map2;
-
-	set = isl_set_read_from_str(ctx,
-		"{[x,y]: x >= 0 & x <= 10 & y >= 0 & y <= 10 or "
-		       "y >= x & x >= 2 & 5 >= y }");
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 1);
-	isl_set_free(set);
-
-	set = isl_set_read_from_str(ctx,
-		"{[x,y]: y >= 0 & 2x + y <= 30 & y <= 10 & x >= 0 or "
-		       "x + y >= 10 & y <= x & x + y <= 20 & y >= 0}");
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 1);
-	isl_set_free(set);
-
-	set = isl_set_read_from_str(ctx,
-		"{[x,y]: y >= 0 & 2x + y <= 30 & y <= 10 & x >= 0 or "
-		       "x + y >= 10 & y <= x & x + y <= 19 & y >= 0}");
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 2);
-	isl_set_free(set);
-
-	set = isl_set_read_from_str(ctx,
-		"{[x,y]: y >= 0 & x <= 5 & y <= x or "
-		       "y >= 0 & x >= 6 & x <= 10 & y <= x}");
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 1);
-	isl_set_free(set);
-
-	set = isl_set_read_from_str(ctx,
-		"{[x,y]: y >= 0 & x <= 5 & y <= x or "
-		       "y >= 0 & x >= 7 & x <= 10 & y <= x}");
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 2);
-	isl_set_free(set);
-
-	set = isl_set_read_from_str(ctx,
-		"{[x,y]: y >= 0 & x <= 5 & y <= x or "
-		       "y >= 0 & x >= 6 & x <= 10 & y + 1 <= x}");
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 2);
-	isl_set_free(set);
-
-	set = isl_set_read_from_str(ctx,
-		"{[x,y]: y >= 0 & x <= 5 & y <= x or "
-		       "y >= 0 & x = 6 & y <= 6}");
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 1);
-	isl_set_free(set);
-
-	set = isl_set_read_from_str(ctx,
-		"{[x,y]: y >= 0 & x <= 5 & y <= x or "
-		       "y >= 0 & x = 7 & y <= 6}");
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 2);
-	isl_set_free(set);
-
-	set = isl_set_read_from_str(ctx,
-		"{[x,y]: y >= 0 & x <= 5 & y <= x or "
-		       "y >= 0 & x = 6 & y <= 5}");
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 1);
-	set2 = isl_set_read_from_str(ctx,
-		"{[x,y]: y >= 0 & x <= 5 & y <= x or "
-		       "y >= 0 & x = 6 & y <= 5}");
-	assert(isl_set_is_equal(set, set2));
-	isl_set_free(set);
-	isl_set_free(set2);
-
-	set = isl_set_read_from_str(ctx,
-		"{[x,y]: y >= 0 & x <= 5 & y <= x or "
-		       "y >= 0 & x = 6 & y <= 7}");
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 2);
-	isl_set_free(set);
-
-	set = isl_set_read_from_str(ctx,
-		"[n] -> { [i] : i = 1 and n >= 2 or 2 <= i and i <= n }");
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 1);
-	set2 = isl_set_read_from_str(ctx,
-		"[n] -> { [i] : i = 1 and n >= 2 or 2 <= i and i <= n }");
-	assert(isl_set_is_equal(set, set2));
-	isl_set_free(set);
-	isl_set_free(set2);
-
-	set = isl_set_read_from_str(ctx,
-		"{[x,y] : x >= 0 and y >= 0 or 0 <= y and y <= 5 and x = -1}");
-	set = isl_set_coalesce(set);
-	set2 = isl_set_read_from_str(ctx,
-		"{[x,y] : x >= 0 and y >= 0 or 0 <= y and y <= 5 and x = -1}");
-	assert(isl_set_is_equal(set, set2));
-	isl_set_free(set);
-	isl_set_free(set2);
-
-	set = isl_set_read_from_str(ctx,
-		"[n] -> { [i] : 1 <= i and i <= n - 1 or "
-				"2 <= i and i <= n }");
-	set = isl_set_coalesce(set);
-	assert(set && set->n == 1);
-	set2 = isl_set_read_from_str(ctx,
-		"[n] -> { [i] : 1 <= i and i <= n - 1 or "
-				"2 <= i and i <= n }");
-	assert(isl_set_is_equal(set, set2));
-	isl_set_free(set);
-	isl_set_free(set2);
-
-	map = isl_map_read_from_str(ctx,
-		"[n] -> { [i0] -> [o0] : exists (e0 = [(i0)/4], e1 = [(o0)/4], "
-		"e2 = [(n)/2], e3 = [(-2 + i0)/4], e4 = [(-2 + o0)/4], "
-		"e5 = [(-2n + i0)/4]: 2e2 = n and 4e3 = -2 + i0 and "
-		"4e4 = -2 + o0 and i0 >= 8 + 2n and o0 >= 2 + i0 and "
-		"o0 <= 56 + 2n and o0 <= -12 + 4n and i0 <= 57 + 2n and "
-		"i0 <= -11 + 4n and o0 >= 6 + 2n and 4e0 <= i0 and "
-		"4e0 >= -3 + i0 and 4e1 <= o0 and 4e1 >= -3 + o0 and "
-		"4e5 <= -2n + i0 and 4e5 >= -3 - 2n + i0);"
-		"[i0] -> [o0] : exists (e0 = [(i0)/4], e1 = [(o0)/4], "
-		"e2 = [(n)/2], e3 = [(-2 + i0)/4], e4 = [(-2 + o0)/4], "
-		"e5 = [(-2n + i0)/4]: 2e2 = n and 4e3 = -2 + i0 and "
-		"4e4 = -2 + o0 and 2e0 >= 3 + n and e0 <= -4 + n and "
-		"2e0 <= 27 + n and e1 <= -4 + n and 2e1 <= 27 + n and "
-		"2e1 >= 2 + n and e1 >= 1 + e0 and i0 >= 7 + 2n and "
-		"i0 <= -11 + 4n and i0 <= 57 + 2n and 4e0 <= -2 + i0 and "
-		"4e0 >= -3 + i0 and o0 >= 6 + 2n and o0 <= -11 + 4n and "
-		"o0 <= 57 + 2n and 4e1 <= -2 + o0 and 4e1 >= -3 + o0 and "
-		"4e5 <= -2n + i0 and 4e5 >= -3 - 2n + i0 ) }");
-	map = isl_map_coalesce(map);
-	map2 = isl_map_read_from_str(ctx,
-		"[n] -> { [i0] -> [o0] : exists (e0 = [(i0)/4], e1 = [(o0)/4], "
-		"e2 = [(n)/2], e3 = [(-2 + i0)/4], e4 = [(-2 + o0)/4], "
-		"e5 = [(-2n + i0)/4]: 2e2 = n and 4e3 = -2 + i0 and "
-		"4e4 = -2 + o0 and i0 >= 8 + 2n and o0 >= 2 + i0 and "
-		"o0 <= 56 + 2n and o0 <= -12 + 4n and i0 <= 57 + 2n and "
-		"i0 <= -11 + 4n and o0 >= 6 + 2n and 4e0 <= i0 and "
-		"4e0 >= -3 + i0 and 4e1 <= o0 and 4e1 >= -3 + o0 and "
-		"4e5 <= -2n + i0 and 4e5 >= -3 - 2n + i0);"
-		"[i0] -> [o0] : exists (e0 = [(i0)/4], e1 = [(o0)/4], "
-		"e2 = [(n)/2], e3 = [(-2 + i0)/4], e4 = [(-2 + o0)/4], "
-		"e5 = [(-2n + i0)/4]: 2e2 = n and 4e3 = -2 + i0 and "
-		"4e4 = -2 + o0 and 2e0 >= 3 + n and e0 <= -4 + n and "
-		"2e0 <= 27 + n and e1 <= -4 + n and 2e1 <= 27 + n and "
-		"2e1 >= 2 + n and e1 >= 1 + e0 and i0 >= 7 + 2n and "
-		"i0 <= -11 + 4n and i0 <= 57 + 2n and 4e0 <= -2 + i0 and "
-		"4e0 >= -3 + i0 and o0 >= 6 + 2n and o0 <= -11 + 4n and "
-		"o0 <= 57 + 2n and 4e1 <= -2 + o0 and 4e1 >= -3 + o0 and "
-		"4e5 <= -2n + i0 and 4e5 >= -3 - 2n + i0 ) }");
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "[n, m] -> { [] -> [o0, o2, o3] : (o3 = 1 and o0 >= 1 + m and "
-	      "o0 <= n + m and o2 <= m and o0 >= 2 + n and o2 >= 3) or "
-	      "(o0 >= 2 + n and o0 >= 1 + m and o0 <= n + m and n >= 1 and "
-	      "o3 <= -1 + o2 and o3 >= 1 - m + o2 and o3 >= 2 and o3 <= n) }";
-	map = isl_map_read_from_str(ctx, str);
-	map = isl_map_coalesce(map);
-	map2 = isl_map_read_from_str(ctx, str);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "[M, N] -> { [i0, i1, i2, i3, i4, i5, i6] -> "
-	  "[o0, o1, o2, o3, o4, o5, o6] : "
-	  "(o6 <= -4 + 2M - 2N + i0 + i1 - i2 + i6 - o0 - o1 + o2 and "
-	  "o3 <= -2 + i3 and o6 >= 2 + i0 + i3 + i6 - o0 - o3 and "
-	  "o6 >= 2 - M + N + i3 + i4 + i6 - o3 - o4 and o0 <= -1 + i0 and "
-	  "o4 >= 4 - 3M + 3N - i0 - i1 + i2 + 2i3 + i4 + o0 + o1 - o2 - 2o3 "
-	  "and o6 <= -3 + 2M - 2N + i3 + i4 - i5 + i6 - o3 - o4 + o5 and "
-	  "2o6 <= -5 + 5M - 5N + 2i0 + i1 - i2 - i5 + 2i6 - 2o0 - o1 + o2 + o5 "
-	  "and o6 >= 2i0 + i1 + i6 - 2o0 - o1 and "
-	  "3o6 <= -5 + 4M - 4N + 2i0 + i1 - i2 + 2i3 + i4 - i5 + 3i6 "
-	  "- 2o0 - o1 + o2 - 2o3 - o4 + o5) or "
-	  "(N >= 2 and o3 <= -1 + i3 and o0 <= -1 + i0 and "
-	  "o6 >= i3 + i6 - o3 and M >= 0 and "
-	  "2o6 >= 1 + i0 + i3 + 2i6 - o0 - o3 and "
-	  "o6 >= 1 - M + i0 + i6 - o0 and N >= 2M and o6 >= i0 + i6 - o0) }";
-	map = isl_map_read_from_str(ctx, str);
-	map = isl_map_coalesce(map);
-	map2 = isl_map_read_from_str(ctx, str);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "[M, N] -> { [] -> [o0] : (o0 = 0 and M >= 1 and N >= 2) or "
-		"(o0 = 0 and M >= 1 and N >= 2M and N >= 2 + M) or "
-		"(o0 = 0 and M >= 2 and N >= 3) or "
-		"(M = 0 and o0 = 0 and N >= 3) }";
-	map = isl_map_read_from_str(ctx, str);
-	map = isl_map_coalesce(map);
-	map2 = isl_map_read_from_str(ctx, str);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "{ [i0, i1, i2, i3] : (i1 = 10i0 and i0 >= 1 and 10i0 <= 100 and "
-		"i3 <= 9 + 10 i2 and i3 >= 1 + 10i2 and i3 >= 0) or "
-		"(i1 <= 9 + 10i0 and i1 >= 1 + 10i0 and i2 >= 0 and "
-		"i0 >= 0 and i1 <= 100 and i3 <= 9 + 10i2 and i3 >= 1 + 10i2) }";
-	map = isl_map_read_from_str(ctx, str);
-	map = isl_map_coalesce(map);
-	map2 = isl_map_read_from_str(ctx, str);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	test_coalesce_set(ctx,
-		"[M] -> { [i1] : (i1 >= 2 and i1 <= M) or "
-				"(i1 = M and M >= 1) }", 0);
-	test_coalesce_set(ctx,
-		"{[x,y] : x,y >= 0; [x,y] : 10 <= x <= 20 and y >= -1 }", 0);
-	test_coalesce_set(ctx,
-		"{ [x, y] : (x >= 1 and y >= 1 and x <= 2 and y <= 2) or "
-		"(y = 3 and x = 1) }", 1);
-	test_coalesce_set(ctx,
-		"[M] -> { [i0, i1, i2, i3, i4] : (i1 >= 3 and i4 >= 2 + i2 and "
-		"i2 >= 2 and i0 >= 2 and i3 >= 1 + i2 and i0 <= M and "
-		"i1 <= M and i3 <= M and i4 <= M) or "
-		"(i1 >= 2 and i4 >= 1 + i2 and i2 >= 2 and i0 >= 2 and "
-		"i3 >= 1 + i2 and i0 <= M and i1 <= -1 + M and i3 <= M and "
-		"i4 <= -1 + M) }", 1);
-	test_coalesce_set(ctx,
-		"{ [x, y] : (x >= 0 and y >= 0 and x <= 10 and y <= 10) or "
-		"(x >= 1 and y >= 1 and x <= 11 and y <= 11) }", 1);
-	test_coalesce_set(ctx,
-		"{[x,y,z] : y + 2 >= 0 and x - y + 1 >= 0 and "
-			"-x - y + 1 >= 0 and -3 <= z <= 3;"
-		"[x,y,z] : -x+z + 20 >= 0 and -x-z + 20 >= 0 and "
-			"x-z + 20 >= 0 and x+z + 20 >= 0 and -10 <= y <= 0}", 1);
-	test_coalesce_set(ctx,
-		"{[x,y] : 0 <= x,y <= 10; [5,y]: 4 <=y <= 11}", 1);
-	test_coalesce_set(ctx, "{[x,0] : x >= 0; [x,1] : x <= 20}", 0);
-	test_coalesce_set(ctx,
-		"{[x,0,0] : -5 <= x <= 5; [0,y,1] : -5 <= y <= 5 }", 1);
-	test_coalesce_set(ctx, "{ [x, 1 - x] : 0 <= x <= 1; [0,0] }", 1);
-	test_coalesce_set(ctx, "{ [0,0]; [i,i] : 1 <= i <= 10 }", 1);
-	test_coalesce_set(ctx, "{ [0,0]; [i,j] : 1 <= i,j <= 10 }", 0);
-	test_coalesce_set(ctx, "{ [0,0]; [i,2i] : 1 <= i <= 10 }", 1);
-	test_coalesce_set(ctx, "{ [0,0]; [i,2i] : 2 <= i <= 10 }", 0);
-	test_coalesce_set(ctx, "{ [1,0]; [i,2i] : 1 <= i <= 10 }", 0);
-	test_coalesce_set(ctx, "{ [0,1]; [i,2i] : 1 <= i <= 10 }", 0);
-}
-
-void test_closure(struct isl_ctx *ctx)
-{
-	const char *str;
-	isl_set *dom;
-	isl_map *up, *right;
-	isl_map *map, *map2;
-	int exact;
-
-	/* COCOA example 1 */
-	map = isl_map_read_from_str(ctx,
-		"[n] -> { [i,j] -> [i2,j2] : i2 = i + 1 and j2 = j + 1 and "
-			"1 <= i and i < n and 1 <= j and j < n or "
-			"i2 = i + 1 and j2 = j - 1 and "
-			"1 <= i and i < n and 2 <= j and j <= n }");
-	map = isl_map_power(map, &exact);
-	assert(exact);
-	isl_map_free(map);
-
-	/* COCOA example 1 */
-	map = isl_map_read_from_str(ctx,
-		"[n] -> { [i,j] -> [i2,j2] : i2 = i + 1 and j2 = j + 1 and "
-			"1 <= i and i < n and 1 <= j and j < n or "
-			"i2 = i + 1 and j2 = j - 1 and "
-			"1 <= i and i < n and 2 <= j and j <= n }");
-	map = isl_map_transitive_closure(map, &exact);
-	assert(exact);
-	map2 = isl_map_read_from_str(ctx,
-		"[n] -> { [i,j] -> [i2,j2] : exists (k1,k2,k : "
-			"1 <= i and i < n and 1 <= j and j <= n and "
-			"2 <= i2 and i2 <= n and 1 <= j2 and j2 <= n and "
-			"i2 = i + k1 + k2 and j2 = j + k1 - k2 and "
-			"k1 >= 0 and k2 >= 0 and k1 + k2 = k and k >= 1 )}");
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map2);
-	isl_map_free(map);
-
-	map = isl_map_read_from_str(ctx,
-		"[n] -> { [x] -> [y] : y = x + 1 and 0 <= x and x <= n and "
-				     " 0 <= y and y <= n }");
-	map = isl_map_transitive_closure(map, &exact);
-	map2 = isl_map_read_from_str(ctx,
-		"[n] -> { [x] -> [y] : y > x and 0 <= x and x <= n and "
-				     " 0 <= y and y <= n }");
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map2);
-	isl_map_free(map);
-
-	/* COCOA example 2 */
-	map = isl_map_read_from_str(ctx,
-		"[n] -> { [i,j] -> [i2,j2] : i2 = i + 2 and j2 = j + 2 and "
-			"1 <= i and i < n - 1 and 1 <= j and j < n - 1 or "
-			"i2 = i + 2 and j2 = j - 2 and "
-			"1 <= i and i < n - 1 and 3 <= j and j <= n }");
-	map = isl_map_transitive_closure(map, &exact);
-	assert(exact);
-	map2 = isl_map_read_from_str(ctx,
-		"[n] -> { [i,j] -> [i2,j2] : exists (k1,k2,k : "
-			"1 <= i and i < n - 1 and 1 <= j and j <= n and "
-			"3 <= i2 and i2 <= n and 1 <= j2 and j2 <= n and "
-			"i2 = i + 2 k1 + 2 k2 and j2 = j + 2 k1 - 2 k2 and "
-			"k1 >= 0 and k2 >= 0 and k1 + k2 = k and k >= 1) }");
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	/* COCOA Fig.2 left */
-	map = isl_map_read_from_str(ctx,
-		"[n] -> { [i,j] -> [i2,j2] : i2 = i + 2 and j2 = j and "
-			"i <= 2 j - 3 and i <= n - 2 and j <= 2 i - 1 and "
-			"j <= n or "
-			"i2 = i and j2 = j + 2 and i <= 2 j - 1 and i <= n and "
-			"j <= 2 i - 3 and j <= n - 2 or "
-			"i2 = i + 1 and j2 = j + 1 and i <= 2 j - 1 and "
-			"i <= n - 1 and j <= 2 i - 1 and j <= n - 1 }");
-	map = isl_map_transitive_closure(map, &exact);
-	assert(exact);
-	isl_map_free(map);
-
-	/* COCOA Fig.2 right */
-	map = isl_map_read_from_str(ctx,
-		"[n] -> { [i,j] -> [i2,j2] : i2 = i + 3 and j2 = j and "
-			"i <= 2 j - 4 and i <= n - 3 and j <= 2 i - 1 and "
-			"j <= n or "
-			"i2 = i and j2 = j + 3 and i <= 2 j - 1 and i <= n and "
-			"j <= 2 i - 4 and j <= n - 3 or "
-			"i2 = i + 1 and j2 = j + 1 and i <= 2 j - 1 and "
-			"i <= n - 1 and j <= 2 i - 1 and j <= n - 1 }");
-	map = isl_map_power(map, &exact);
-	assert(exact);
-	isl_map_free(map);
-
-	/* COCOA Fig.2 right */
-	map = isl_map_read_from_str(ctx,
-		"[n] -> { [i,j] -> [i2,j2] : i2 = i + 3 and j2 = j and "
-			"i <= 2 j - 4 and i <= n - 3 and j <= 2 i - 1 and "
-			"j <= n or "
-			"i2 = i and j2 = j + 3 and i <= 2 j - 1 and i <= n and "
-			"j <= 2 i - 4 and j <= n - 3 or "
-			"i2 = i + 1 and j2 = j + 1 and i <= 2 j - 1 and "
-			"i <= n - 1 and j <= 2 i - 1 and j <= n - 1 }");
-	map = isl_map_transitive_closure(map, &exact);
-	assert(exact);
-	map2 = isl_map_read_from_str(ctx,
-		"[n] -> { [i,j] -> [i2,j2] : exists (k1,k2,k3,k : "
-			"i <= 2 j - 1 and i <= n and j <= 2 i - 1 and "
-			"j <= n and 3 + i + 2 j <= 3 n and "
-			"3 + 2 i + j <= 3n and i2 <= 2 j2 -1 and i2 <= n and "
-			"i2 <= 3 j2 - 4 and j2 <= 2 i2 -1 and j2 <= n and "
-			"13 + 4 j2 <= 11 i2 and i2 = i + 3 k1 + k3 and "
-			"j2 = j + 3 k2 + k3 and k1 >= 0 and k2 >= 0 and "
-			"k3 >= 0 and k1 + k2 + k3 = k and k > 0) }");
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map2);
-	isl_map_free(map);
-
-	/* COCOA Fig.1 right */
-	dom = isl_set_read_from_str(ctx,
-		"{ [x,y] : x >= 0 and -2 x + 3 y >= 0 and x <= 3 and "
-			"2 x - 3 y + 3 >= 0 }");
-	right = isl_map_read_from_str(ctx,
-		"{ [x,y] -> [x2,y2] : x2 = x + 1 and y2 = y }");
-	up = isl_map_read_from_str(ctx,
-		"{ [x,y] -> [x2,y2] : x2 = x and y2 = y + 1 }");
-	right = isl_map_intersect_domain(right, isl_set_copy(dom));
-	right = isl_map_intersect_range(right, isl_set_copy(dom));
-	up = isl_map_intersect_domain(up, isl_set_copy(dom));
-	up = isl_map_intersect_range(up, dom);
-	map = isl_map_union(up, right);
-	map = isl_map_transitive_closure(map, &exact);
-	assert(exact);
-	map2 = isl_map_read_from_str(ctx,
-		"{ [0,0] -> [0,1]; [0,0] -> [1,1]; [0,1] -> [1,1]; "
-		"  [2,2] -> [3,2]; [2,2] -> [3,3]; [3,2] -> [3,3] }");
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map2);
-	isl_map_free(map);
-
-	/* COCOA Theorem 1 counter example */
-	map = isl_map_read_from_str(ctx,
-		"{ [i,j] -> [i2,j2] : i = 0 and 0 <= j and j <= 1 and "
-			"i2 = 1 and j2 = j or "
-			"i = 0 and j = 0 and i2 = 0 and j2 = 1 }");
-	map = isl_map_transitive_closure(map, &exact);
-	assert(exact);
-	isl_map_free(map);
-
-	map = isl_map_read_from_str(ctx,
-		"[m,n] -> { [i,j] -> [i2,j2] : i2 = i and j2 = j + 2 and "
-			"1 <= i,i2 <= n and 1 <= j,j2 <= m or "
-			"i2 = i + 1 and 3 <= j2 - j <= 4 and "
-			"1 <= i,i2 <= n and 1 <= j,j2 <= m }");
-	map = isl_map_transitive_closure(map, &exact);
-	assert(exact);
-	isl_map_free(map);
-
-	/* Kelly et al 1996, fig 12 */
-	map = isl_map_read_from_str(ctx,
-		"[n] -> { [i,j] -> [i2,j2] : i2 = i and j2 = j + 1 and "
-			"1 <= i,j,j+1 <= n or "
-			"j = n and j2 = 1 and i2 = i + 1 and "
-			"1 <= i,i+1 <= n }");
-	map = isl_map_transitive_closure(map, &exact);
-	assert(exact);
-	map2 = isl_map_read_from_str(ctx,
-		"[n] -> { [i,j] -> [i2,j2] : 1 <= j < j2 <= n and "
-			"1 <= i <= n and i = i2 or "
-			"1 <= i < i2 <= n and 1 <= j <= n and "
-			"1 <= j2 <= n }");
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map2);
-	isl_map_free(map);
-
-	/* Omega's closure4 */
-	map = isl_map_read_from_str(ctx,
-		"[m,n] -> { [x,y] -> [x2,y2] : x2 = x and y2 = y + 1 and "
-			"1 <= x,y <= 10 or "
-			"x2 = x + 1 and y2 = y and "
-			"1 <= x <= 20 && 5 <= y <= 15 }");
-	map = isl_map_transitive_closure(map, &exact);
-	assert(exact);
-	isl_map_free(map);
-
-	map = isl_map_read_from_str(ctx,
-		"[n] -> { [x] -> [y]: 1 <= n <= y - x <= 10 }");
-	map = isl_map_transitive_closure(map, &exact);
-	assert(!exact);
-	map2 = isl_map_read_from_str(ctx,
-		"[n] -> { [x] -> [y] : 1 <= n <= 10 and y >= n + x }");
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "[n, m] -> { [i0, i1, i2, i3] -> [o0, o1, o2, o3] : "
-	    "i3 = 1 and o0 = i0 and o1 = -1 + i1 and o2 = -1 + i2 and "
-	    "o3 = -2 + i2 and i1 <= -1 + i0 and i1 >= 1 - m + i0 and "
-	    "i1 >= 2 and i1 <= n and i2 >= 3 and i2 <= 1 + n and i2 <= m }";
-	map = isl_map_read_from_str(ctx, str);
-	map = isl_map_transitive_closure(map, &exact);
-	assert(exact);
-	map2 = isl_map_read_from_str(ctx, str);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "{[0] -> [1]; [2] -> [3]}";
-	map = isl_map_read_from_str(ctx, str);
-	map = isl_map_transitive_closure(map, &exact);
-	assert(exact);
-	map2 = isl_map_read_from_str(ctx, str);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "[n] -> { [[i0, i1, 1, 0, i0] -> [i5, 1]] -> "
-	    "[[i0, -1 + i1, 2, 0, i0] -> [-1 + i5, 2]] : "
-	    "exists (e0 = [(3 - n)/3]: i5 >= 2 and i1 >= 2 and "
-	    "3i0 <= -1 + n and i1 <= -1 + n and i5 <= -1 + n and "
-	    "3e0 >= 1 - n and 3e0 <= 2 - n and 3i0 >= -2 + n); "
-	    "[[i0, i1, 2, 0, i0] -> [i5, 1]] -> "
-	    "[[i0, i1, 1, 0, i0] -> [-1 + i5, 2]] : "
-	    "exists (e0 = [(3 - n)/3]: i5 >= 2 and i1 >= 1 and "
-	    "3i0 <= -1 + n and i1 <= -1 + n and i5 <= -1 + n and "
-	    "3e0 >= 1 - n and 3e0 <= 2 - n and 3i0 >= -2 + n); "
-	    "[[i0, i1, 1, 0, i0] -> [i5, 2]] -> "
-	    "[[i0, -1 + i1, 2, 0, i0] -> [i5, 1]] : "
-	    "exists (e0 = [(3 - n)/3]: i1 >= 2 and i5 >= 1 and "
-	    "3i0 <= -1 + n and i1 <= -1 + n and i5 <= -1 + n and "
-	    "3e0 >= 1 - n and 3e0 <= 2 - n and 3i0 >= -2 + n); "
-	    "[[i0, i1, 2, 0, i0] -> [i5, 2]] -> "
-	    "[[i0, i1, 1, 0, i0] -> [i5, 1]] : "
-	    "exists (e0 = [(3 - n)/3]: i5 >= 1 and i1 >= 1 and "
-	    "3i0 <= -1 + n and i1 <= -1 + n and i5 <= -1 + n and "
-	    "3e0 >= 1 - n and 3e0 <= 2 - n and 3i0 >= -2 + n) }";
-	map = isl_map_read_from_str(ctx, str);
-	map = isl_map_transitive_closure(map, NULL);
-	assert(map);
-	isl_map_free(map);
-}
-
-void test_lex(struct isl_ctx *ctx)
-{
-	isl_space *dim;
-	isl_map *map;
-
-	dim = isl_space_set_alloc(ctx, 0, 0);
-	map = isl_map_lex_le(dim);
-	assert(!isl_map_is_empty(map));
-	isl_map_free(map);
-}
-
-void test_lexmin(struct isl_ctx *ctx)
-{
-	const char *str;
-	isl_basic_map *bmap;
-	isl_map *map, *map2;
-	isl_set *set;
-	isl_set *set2;
-	isl_pw_multi_aff *pma;
-
-	str = "[p0, p1] -> { [] -> [] : "
-	    "exists (e0 = [(2p1)/3], e1, e2, e3 = [(3 - p1 + 3e0)/3], "
-	    "e4 = [(p1)/3], e5 = [(p1 + 3e4)/3]: "
-	    "3e0 >= -2 + 2p1 and 3e0 >= p1 and 3e3 >= 1 - p1 + 3e0 and "
-	    "3e0 <= 2p1 and 3e3 >= -2 + p1 and 3e3 <= -1 + p1 and p1 >= 3 and "
-	    "3e5 >= -2 + 2p1 and 3e5 >= p1 and 3e5 <= -1 + p1 + 3e4 and "
-	    "3e4 <= p1 and 3e4 >= -2 + p1 and e3 <= -1 + e0 and "
-	    "3e4 >= 6 - p1 + 3e1 and 3e1 >= p1 and 3e5 >= -2 + p1 + 3e4 and "
-	    "2e4 >= 3 - p1 + 2e1 and e4 <= e1 and 3e3 <= 2 - p1 + 3e0 and "
-	    "e5 >= 1 + e1 and 3e4 >= 6 - 2p1 + 3e1 and "
-	    "p0 >= 2 and p1 >= p0 and 3e2 >= p1 and 3e4 >= 6 - p1 + 3e2 and "
-	    "e2 <= e1 and e3 >= 1 and e4 <= e2) }";
-	map = isl_map_read_from_str(ctx, str);
-	map = isl_map_lexmin(map);
-	isl_map_free(map);
-
-	str = "[C] -> { [obj,a,b,c] : obj <= 38 a + 7 b + 10 c and "
-	    "a + b <= 1 and c <= 10 b and c <= C and a,b,c,C >= 0 }";
-	set = isl_set_read_from_str(ctx, str);
-	set = isl_set_lexmax(set);
-	str = "[C] -> { [obj,a,b,c] : C = 8 }";
-	set2 = isl_set_read_from_str(ctx, str);
-	set = isl_set_intersect(set, set2);
-	assert(!isl_set_is_empty(set));
-	isl_set_free(set);
-
-	str = "{ [x] -> [y] : x <= y <= 10; [x] -> [5] : -8 <= x <= 8 }";
-	map = isl_map_read_from_str(ctx, str);
-	map = isl_map_lexmin(map);
-	str = "{ [x] -> [5] : 6 <= x <= 8; "
-		"[x] -> [x] : x <= 5 or (9 <= x <= 10) }";
-	map2 = isl_map_read_from_str(ctx, str);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "{ [x] -> [y] : 4y = x or 4y = -1 + x or 4y = -2 + x }";
-	map = isl_map_read_from_str(ctx, str);
-	map2 = isl_map_copy(map);
-	map = isl_map_lexmin(map);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "{ [x] -> [y] : x = 4y; [x] -> [y] : x = 2y }";
-	map = isl_map_read_from_str(ctx, str);
-	map = isl_map_lexmin(map);
-	str = "{ [x] -> [y] : (4y = x and x >= 0) or "
-		"(exists (e0 = [(x)/4], e1 = [(-2 + x)/4]: 2y = x and "
-		"4e1 = -2 + x and 4e0 <= -1 + x and 4e0 >= -3 + x)) or "
-		"(exists (e0 = [(x)/4]: 2y = x and 4e0 = x and x <= -4)) }";
-	map2 = isl_map_read_from_str(ctx, str);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "{ [i] -> [i', j] : j = i - 8i' and i' >= 0 and i' <= 7 and "
-				" 8i' <= i and 8i' >= -7 + i }";
-	bmap = isl_basic_map_read_from_str(ctx, str);
-	pma = isl_basic_map_lexmin_pw_multi_aff(isl_basic_map_copy(bmap));
-	map2 = isl_map_from_pw_multi_aff(pma);
-	map = isl_map_from_basic_map(bmap);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-
-	str = "{ T[a] -> S[b, c] : a = 4b-2c and c >= b }";
-	map = isl_map_read_from_str(ctx, str);
-	map = isl_map_lexmin(map);
-	str = "{ T[a] -> S[b, c] : 2b = a and 2c = a }";
-	map2 = isl_map_read_from_str(ctx, str);
-	assert(isl_map_is_equal(map, map2));
-	isl_map_free(map);
-	isl_map_free(map2);
-}
-
-struct must_may {
-	isl_map *must;
-	isl_map *may;
-};
-
-static int collect_must_may(__isl_take isl_map *dep, int must,
-	void *dep_user, void *user)
-{
-	struct must_may *mm = (struct must_may *)user;
-
-	if (must)
-		mm->must = isl_map_union(mm->must, dep);
-	else
-		mm->may = isl_map_union(mm->may, dep);
-
-	return 0;
-}
-
-static int common_space(void *first, void *second)
-{
-	int depth = *(int *)first;
-	return 2 * depth;
-}
-
-static int map_is_equal(__isl_keep isl_map *map, const char *str)
-{
-	isl_map *map2;
-	int equal;
-
-	if (!map)
-		return -1;
-
-	map2 = isl_map_read_from_str(map->ctx, str);
-	equal = isl_map_is_equal(map, map2);
-	isl_map_free(map2);
-
-	return equal;
-}
-
-void test_dep(struct isl_ctx *ctx)
-{
-	const char *str;
-	isl_space *dim;
-	isl_map *map;
-	isl_access_info *ai;
-	isl_flow *flow;
-	int depth;
-	struct must_may mm;
-
-	depth = 3;
-
-	str = "{ [2,i,0] -> [i] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str);
-	ai = isl_access_info_alloc(map, &depth, &common_space, 2);
-
-	str = "{ [0,i,0] -> [i] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str);
-	ai = isl_access_info_add_source(ai, map, 1, &depth);
-
-	str = "{ [1,i,0] -> [5] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str);
-	ai = isl_access_info_add_source(ai, map, 1, &depth);
-
-	flow = isl_access_info_compute_flow(ai);
-	dim = isl_space_alloc(ctx, 0, 3, 3);
-	mm.must = isl_map_empty(isl_space_copy(dim));
-	mm.may = isl_map_empty(dim);
-
-	isl_flow_foreach(flow, collect_must_may, &mm);
-
-	str = "{ [0,i,0] -> [2,i,0] : (0 <= i <= 4) or (6 <= i <= 10); "
-	      "  [1,10,0] -> [2,5,0] }";
-	assert(map_is_equal(mm.must, str));
-	str = "{ [i,j,k] -> [l,m,n] : 1 = 0 }";
-	assert(map_is_equal(mm.may, str));
-
-	isl_map_free(mm.must);
-	isl_map_free(mm.may);
-	isl_flow_free(flow);
-
-
-	str = "{ [2,i,0] -> [i] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str);
-	ai = isl_access_info_alloc(map, &depth, &common_space, 2);
-
-	str = "{ [0,i,0] -> [i] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str);
-	ai = isl_access_info_add_source(ai, map, 1, &depth);
-
-	str = "{ [1,i,0] -> [5] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str);
-	ai = isl_access_info_add_source(ai, map, 0, &depth);
-
-	flow = isl_access_info_compute_flow(ai);
-	dim = isl_space_alloc(ctx, 0, 3, 3);
-	mm.must = isl_map_empty(isl_space_copy(dim));
-	mm.may = isl_map_empty(dim);
-
-	isl_flow_foreach(flow, collect_must_may, &mm);
-
-	str = "{ [0,i,0] -> [2,i,0] : (0 <= i <= 4) or (6 <= i <= 10) }";
-	assert(map_is_equal(mm.must, str));
-	str = "{ [0,5,0] -> [2,5,0]; [1,i,0] -> [2,5,0] : 0 <= i <= 10 }";
-	assert(map_is_equal(mm.may, str));
-
-	isl_map_free(mm.must);
-	isl_map_free(mm.may);
-	isl_flow_free(flow);
-
-
-	str = "{ [2,i,0] -> [i] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str);
-	ai = isl_access_info_alloc(map, &depth, &common_space, 2);
-
-	str = "{ [0,i,0] -> [i] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str);
-	ai = isl_access_info_add_source(ai, map, 0, &depth);
-
-	str = "{ [1,i,0] -> [5] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str);
-	ai = isl_access_info_add_source(ai, map, 0, &depth);
-
-	flow = isl_access_info_compute_flow(ai);
-	dim = isl_space_alloc(ctx, 0, 3, 3);
-	mm.must = isl_map_empty(isl_space_copy(dim));
-	mm.may = isl_map_empty(dim);
-
-	isl_flow_foreach(flow, collect_must_may, &mm);
-
-	str = "{ [0,i,0] -> [2,i,0] : 0 <= i <= 10; "
-	      "  [1,i,0] -> [2,5,0] : 0 <= i <= 10 }";
-	assert(map_is_equal(mm.may, str));
-	str = "{ [i,j,k] -> [l,m,n] : 1 = 0 }";
-	assert(map_is_equal(mm.must, str));
-
-	isl_map_free(mm.must);
-	isl_map_free(mm.may);
-	isl_flow_free(flow);
-
-
-	str = "{ [0,i,2] -> [i] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str);
-	ai = isl_access_info_alloc(map, &depth, &common_space, 2);
-
-	str = "{ [0,i,0] -> [i] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str);
-	ai = isl_access_info_add_source(ai, map, 0, &depth);
-
-	str = "{ [0,i,1] -> [5] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str);
-	ai = isl_access_info_add_source(ai, map, 0, &depth);
-
-	flow = isl_access_info_compute_flow(ai);
-	dim = isl_space_alloc(ctx, 0, 3, 3);
-	mm.must = isl_map_empty(isl_space_copy(dim));
-	mm.may = isl_map_empty(dim);
-
-	isl_flow_foreach(flow, collect_must_may, &mm);
-
-	str = "{ [0,i,0] -> [0,i,2] : 0 <= i <= 10; "
-	      "  [0,i,1] -> [0,5,2] : 0 <= i <= 5 }";
-	assert(map_is_equal(mm.may, str));
-	str = "{ [i,j,k] -> [l,m,n] : 1 = 0 }";
-	assert(map_is_equal(mm.must, str));
-
-	isl_map_free(mm.must);
-	isl_map_free(mm.may);
-	isl_flow_free(flow);
-
-
-	str = "{ [0,i,1] -> [i] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str);
-	ai = isl_access_info_alloc(map, &depth, &common_space, 2);
-
-	str = "{ [0,i,0] -> [i] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str);
-	ai = isl_access_info_add_source(ai, map, 0, &depth);
-
-	str = "{ [0,i,2] -> [5] : 0 <= i <= 10 }";
-	map = isl_map_read_from_str(ctx, str);
-	ai = isl_access_info_add_source(ai, map, 0, &depth);
-
-	flow = isl_access_info_compute_flow(ai);
-	dim = isl_space_alloc(ctx, 0, 3, 3);
-	mm.must = isl_map_empty(isl_space_copy(dim));
-	mm.may = isl_map_empty(dim);
-
-	isl_flow_foreach(flow, collect_must_may, &mm);
-
-	str = "{ [0,i,0] -> [0,i,1] : 0 <= i <= 10; "
-	      "  [0,i,2] -> [0,5,1] : 0 <= i <= 4 }";
-	assert(map_is_equal(mm.may, str));
-	str = "{ [i,j,k] -> [l,m,n] : 1 = 0 }";
-	assert(map_is_equal(mm.must, str));
-
-	isl_map_free(mm.must);
-	isl_map_free(mm.may);
-	isl_flow_free(flow);
-
-
-	depth = 5;
-
-	str = "{ [1,i,0,0,0] -> [i,j] : 0 <= i <= 10 and 0 <= j <= 10 }";
-	map = isl_map_read_from_str(ctx, str);
-	ai = isl_access_info_alloc(map, &depth, &common_space, 1);
-
-	str = "{ [0,i,0,j,0] -> [i,j] : 0 <= i <= 10 and 0 <= j <= 10 }";
-	map = isl_map_read_from_str(ctx, str);
-	ai = isl_access_info_add_source(ai, map, 1, &depth);
-
-	flow = isl_access_info_compute_flow(ai);
-	dim = isl_space_alloc(ctx, 0, 5, 5);
-	mm.must = isl_map_empty(isl_space_copy(dim));
-	mm.may = isl_map_empty(dim);
-
-	isl_flow_foreach(flow, collect_must_may, &mm);
-
-	str = "{ [0,i,0,j,0] -> [1,i,0,0,0] : 0 <= i,j <= 10 }";
-	assert(map_is_equal(mm.must, str));
-	str = "{ [0,0,0,0,0] -> [0,0,0,0,0] : 1 = 0 }";
-	assert(map_is_equal(mm.may, str));
-
-	isl_map_free(mm.must);
-	isl_map_free(mm.may);
-	isl_flow_free(flow);
-}
-
-int test_sv(isl_ctx *ctx)
-{
-	const char *str;
-	isl_map *map;
-	isl_union_map *umap;
-	int sv;
-
-	str = "[N] -> { [i] -> [f] : 0 <= i <= N and 0 <= i - 10 f <= 9 }";
-	map = isl_map_read_from_str(ctx, str);
-	sv = isl_map_is_single_valued(map);
-	isl_map_free(map);
-	if (sv < 0)
-		return -1;
-	if (!sv)
-		isl_die(ctx, isl_error_internal,
-			"map not detected as single valued", return -1);
-
-	str = "[N] -> { [i] -> [f] : 0 <= i <= N and 0 <= i - 10 f <= 10 }";
-	map = isl_map_read_from_str(ctx, str);
-	sv = isl_map_is_single_valued(map);
-	isl_map_free(map);
-	if (sv < 0)
-		return -1;
-	if (sv)
-		isl_die(ctx, isl_error_internal,
-			"map detected as single valued", return -1);
-
-	str = "{ S1[i] -> [i] : 0 <= i <= 9; S2[i] -> [i] : 0 <= i <= 9 }";
-	umap = isl_union_map_read_from_str(ctx, str);
-	sv = isl_union_map_is_single_valued(umap);
-	isl_union_map_free(umap);
-	if (sv < 0)
-		return -1;
-	if (!sv)
-		isl_die(ctx, isl_error_internal,
-			"map not detected as single valued", return -1);
-
-	str = "{ [i] -> S1[i] : 0 <= i <= 9; [i] -> S2[i] : 0 <= i <= 9 }";
-	umap = isl_union_map_read_from_str(ctx, str);
-	sv = isl_union_map_is_single_valued(umap);
-	isl_union_map_free(umap);
-	if (sv < 0)
-		return -1;
-	if (sv)
-		isl_die(ctx, isl_error_internal,
-			"map detected as single valued", return -1);
-
-	return 0;
-}
-
-void test_bijective_case(struct isl_ctx *ctx, const char *str, int bijective)
-{
-	isl_map *map;
-
-	map = isl_map_read_from_str(ctx, str);
-	if (bijective)
-		assert(isl_map_is_bijective(map));
-	else
-		assert(!isl_map_is_bijective(map));
-	isl_map_free(map);
-}
-
-void test_bijective(struct isl_ctx *ctx)
-{
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [i]}", 0);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [i] : j=i}", 1);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [i] : j=0}", 1);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [i] : j=N}", 1);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [j,i]}", 1);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [i+j]}", 0);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> []}", 0);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [i,j,N]}", 1);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [2i]}", 0);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [i,i]}", 0);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [2i,i]}", 0);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [2i,j]}", 1);
-	test_bijective_case(ctx, "[N,M]->{[i,j] -> [x,y] : 2x=i & y =j}", 1);
-}
-
-void test_pwqp(struct isl_ctx *ctx)
-{
-	const char *str;
-	isl_set *set;
-	isl_pw_qpolynomial *pwqp1, *pwqp2;
-
-	str = "{ [i,j,k] -> 1 + 9 * [i/5] + 7 * [j/11] + 4 * [k/13] }";
-	pwqp1 = isl_pw_qpolynomial_read_from_str(ctx, str);
-
-	pwqp1 = isl_pw_qpolynomial_move_dims(pwqp1, isl_dim_param, 0,
-						isl_dim_in, 1, 1);
-
-	str = "[j] -> { [i,k] -> 1 + 9 * [i/5] + 7 * [j/11] + 4 * [k/13] }";
-	pwqp2 = isl_pw_qpolynomial_read_from_str(ctx, str);
-
-	pwqp1 = isl_pw_qpolynomial_sub(pwqp1, pwqp2);
-
-	assert(isl_pw_qpolynomial_is_zero(pwqp1));
-
-	isl_pw_qpolynomial_free(pwqp1);
-
-	str = "{ [i] -> i }";
-	pwqp1 = isl_pw_qpolynomial_read_from_str(ctx, str);
-	str = "{ [k] : exists a : k = 2a }";
-	set = isl_set_read_from_str(ctx, str);
-	pwqp1 = isl_pw_qpolynomial_gist(pwqp1, set);
-	str = "{ [i] -> i }";
-	pwqp2 = isl_pw_qpolynomial_read_from_str(ctx, str);
-
-	pwqp1 = isl_pw_qpolynomial_sub(pwqp1, pwqp2);
-
-	assert(isl_pw_qpolynomial_is_zero(pwqp1));
-
-	isl_pw_qpolynomial_free(pwqp1);
-
-	str = "{ [i] -> i + [ (i + [i/3])/2 ] }";
-	pwqp1 = isl_pw_qpolynomial_read_from_str(ctx, str);
-	str = "{ [10] }";
-	set = isl_set_read_from_str(ctx, str);
-	pwqp1 = isl_pw_qpolynomial_gist(pwqp1, set);
-	str = "{ [i] -> 16 }";
-	pwqp2 = isl_pw_qpolynomial_read_from_str(ctx, str);
-
-	pwqp1 = isl_pw_qpolynomial_sub(pwqp1, pwqp2);
-
-	assert(isl_pw_qpolynomial_is_zero(pwqp1));
-
-	isl_pw_qpolynomial_free(pwqp1);
-
-	str = "{ [i] -> ([(i)/2]) }";
-	pwqp1 = isl_pw_qpolynomial_read_from_str(ctx, str);
-	str = "{ [k] : exists a : k = 2a+1 }";
-	set = isl_set_read_from_str(ctx, str);
-	pwqp1 = isl_pw_qpolynomial_gist(pwqp1, set);
-	str = "{ [i] -> -1/2 + 1/2 * i }";
-	pwqp2 = isl_pw_qpolynomial_read_from_str(ctx, str);
-
-	pwqp1 = isl_pw_qpolynomial_sub(pwqp1, pwqp2);
-
-	assert(isl_pw_qpolynomial_is_zero(pwqp1));
-
-	isl_pw_qpolynomial_free(pwqp1);
-
-	str = "{ [i] -> ([([i/2] + [i/2])/5]) }";
-	pwqp1 = isl_pw_qpolynomial_read_from_str(ctx, str);
-	str = "{ [i] -> ([(2 * [i/2])/5]) }";
-	pwqp2 = isl_pw_qpolynomial_read_from_str(ctx, str);
-
-	pwqp1 = isl_pw_qpolynomial_sub(pwqp1, pwqp2);
-
-	assert(isl_pw_qpolynomial_is_zero(pwqp1));
-
-	isl_pw_qpolynomial_free(pwqp1);
-
-	str = "{ [x] -> ([x/2] + [(x+1)/2]) }";
-	pwqp1 = isl_pw_qpolynomial_read_from_str(ctx, str);
-	str = "{ [x] -> x }";
-	pwqp2 = isl_pw_qpolynomial_read_from_str(ctx, str);
-
-	pwqp1 = isl_pw_qpolynomial_sub(pwqp1, pwqp2);
-
-	assert(isl_pw_qpolynomial_is_zero(pwqp1));
-
-	isl_pw_qpolynomial_free(pwqp1);
-
-	str = "{ [i] -> ([i/2]) : i >= 0; [i] -> ([i/3]) : i < 0 }";
-	pwqp1 = isl_pw_qpolynomial_read_from_str(ctx, str);
-	pwqp2 = isl_pw_qpolynomial_read_from_str(ctx, str);
-	pwqp1 = isl_pw_qpolynomial_coalesce(pwqp1);
-	pwqp1 = isl_pw_qpolynomial_sub(pwqp1, pwqp2);
-	assert(isl_pw_qpolynomial_is_zero(pwqp1));
-	isl_pw_qpolynomial_free(pwqp1);
-}
-
-void test_split_periods(isl_ctx *ctx)
-{
-	const char *str;
-	isl_pw_qpolynomial *pwqp;
-
-	str = "{ [U,V] -> 1/3 * U + 2/3 * V - [(U + 2V)/3] + [U/2] : "
-		"U + 2V + 3 >= 0 and - U -2V  >= 0 and - U + 10 >= 0 and "
-		"U  >= 0; [U,V] -> U^2 : U >= 100 }";
-	pwqp = isl_pw_qpolynomial_read_from_str(ctx, str);
-
-	pwqp = isl_pw_qpolynomial_split_periods(pwqp, 2);
-	assert(pwqp);
-
-	isl_pw_qpolynomial_free(pwqp);
-}
-
-void test_union(isl_ctx *ctx)
-{
-	const char *str;
-	isl_union_set *uset1, *uset2;
-	isl_union_map *umap1, *umap2;
-
-	str = "{ [i] : 0 <= i <= 1 }";
-	uset1 = isl_union_set_read_from_str(ctx, str);
-	str = "{ [1] -> [0] }";
-	umap1 = isl_union_map_read_from_str(ctx, str);
-
-	umap2 = isl_union_set_lex_gt_union_set(isl_union_set_copy(uset1), uset1);
-	assert(isl_union_map_is_equal(umap1, umap2));
-
-	isl_union_map_free(umap1);
-	isl_union_map_free(umap2);
-
-	str = "{ A[i] -> B[i]; B[i] -> C[i]; A[0] -> C[1] }";
-	umap1 = isl_union_map_read_from_str(ctx, str);
-	str = "{ A[i]; B[i] }";
-	uset1 = isl_union_set_read_from_str(ctx, str);
-
-	uset2 = isl_union_map_domain(umap1);
-
-	assert(isl_union_set_is_equal(uset1, uset2));
-
-	isl_union_set_free(uset1);
-	isl_union_set_free(uset2);
-}
-
-void test_bound(isl_ctx *ctx)
-{
-	const char *str;
-	isl_pw_qpolynomial *pwqp;
-	isl_pw_qpolynomial_fold *pwf;
-
-	str = "{ [[a, b, c, d] -> [e]] -> 0 }";
-	pwqp = isl_pw_qpolynomial_read_from_str(ctx, str);
-	pwf = isl_pw_qpolynomial_bound(pwqp, isl_fold_max, NULL);
-	assert(isl_pw_qpolynomial_fold_dim(pwf, isl_dim_in) == 4);
-	isl_pw_qpolynomial_fold_free(pwf);
-
-	str = "{ [[x]->[x]] -> 1 : exists a : x = 2 a }";
-	pwqp = isl_pw_qpolynomial_read_from_str(ctx, str);
-	pwf = isl_pw_qpolynomial_bound(pwqp, isl_fold_max, NULL);
-	assert(isl_pw_qpolynomial_fold_dim(pwf, isl_dim_in) == 1);
-	isl_pw_qpolynomial_fold_free(pwf);
-}
-
-void test_lift(isl_ctx *ctx)
-{
-	const char *str;
-	isl_basic_map *bmap;
-	isl_basic_set *bset;
-
-	str = "{ [i0] : exists e0 : i0 = 4e0 }";
-	bset = isl_basic_set_read_from_str(ctx, str);
-	bset = isl_basic_set_lift(bset);
-	bmap = isl_basic_map_from_range(bset);
-	bset = isl_basic_map_domain(bmap);
-	isl_basic_set_free(bset);
-}
-
-void test_subset(isl_ctx *ctx)
-{
-	const char *str;
-	isl_set *set1, *set2;
-
-	str = "{ [112, 0] }";
-	set1 = isl_set_read_from_str(ctx, str);
-	str = "{ [i0, i1] : exists (e0 = [(i0 - i1)/16], e1: "
-		"16e0 <= i0 - i1 and 16e0 >= -15 + i0 - i1 and "
-		"16e1 <= i1 and 16e0 >= -i1 and 16e1 >= -i0 + i1) }";
-	set2 = isl_set_read_from_str(ctx, str);
-	assert(isl_set_is_subset(set1, set2));
-	isl_set_free(set1);
-	isl_set_free(set2);
-}
-
-void test_factorize(isl_ctx *ctx)
-{
-	const char *str;
-	isl_basic_set *bset;
-	isl_factorizer *f;
-
-	str = "{ [i0, i1, i2, i3, i4, i5, i6, i7] : 3i5 <= 2 - 2i0 and "
-	    "i0 >= -2 and i6 >= 1 + i3 and i7 >= 0 and 3i5 >= -2i0 and "
-	    "2i4 <= i2 and i6 >= 1 + 2i0 + 3i1 and i4 <= -1 and "
-	    "i6 >= 1 + 2i0 + 3i5 and i6 <= 2 + 2i0 + 3i5 and "
-	    "3i5 <= 2 - 2i0 - i2 + 3i4 and i6 <= 2 + 2i0 + 3i1 and "
-	    "i0 <= -1 and i7 <= i2 + i3 - 3i4 - i6 and "
-	    "3i5 >= -2i0 - i2 + 3i4 }";
-	bset = isl_basic_set_read_from_str(ctx, str);
-	f = isl_basic_set_factorizer(bset);
-	assert(f);
-	isl_basic_set_free(bset);
-	isl_factorizer_free(f);
-
-	str = "{ [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12] : "
-	    "i12 <= 2 + i0 - i11 and 2i8 >= -i4 and i11 >= i1 and "
-	    "3i5 <= -i2 and 2i11 >= -i4 - 2i7 and i11 <= 3 + i0 + 3i9 and "
-	    "i11 <= -i4 - 2i7 and i12 >= -i10 and i2 >= -2 and "
-	    "i11 >= i1 + 3i10 and i11 >= 1 + i0 + 3i9 and "
-	    "i11 <= 1 - i4 - 2i8 and 6i6 <= 6 - i2 and 3i6 >= 1 - i2 and "
-	    "i11 <= 2 + i1 and i12 <= i4 + i11 and i12 >= i0 - i11 and "
-	    "3i5 >= -2 - i2 and i12 >= -1 + i4 + i11 and 3i3 <= 3 - i2 and "
-	    "9i6 <= 11 - i2 + 6i5 and 3i3 >= 1 - i2 and "
-	    "9i6 <= 5 - i2 + 6i3 and i12 <= -1 and i2 <= 0 }";
-	bset = isl_basic_set_read_from_str(ctx, str);
-	f = isl_basic_set_factorizer(bset);
-	assert(f);
-	isl_basic_set_free(bset);
-	isl_factorizer_free(f);
-}
-
-static int check_injective(__isl_take isl_map *map, void *user)
-{
-	int *injective = user;
-
-	*injective = isl_map_is_injective(map);
-	isl_map_free(map);
-
-	if (*injective < 0 || !*injective)
-		return -1;
-
-	return 0;
-}
-
-int test_one_schedule(isl_ctx *ctx, const char *d, const char *w,
-	const char *r, const char *s, int tilable, int parallel)
-{
-	int i;
-	isl_union_set *D;
-	isl_union_map *W, *R, *S;
-	isl_union_map *empty;
-	isl_union_map *dep_raw, *dep_war, *dep_waw, *dep;
-	isl_union_map *validity, *proximity;
-	isl_union_map *schedule;
-	isl_union_map *test;
-	isl_union_set *delta;
-	isl_union_set *domain;
-	isl_set *delta_set;
-	isl_set *slice;
-	isl_set *origin;
-	isl_schedule *sched;
-	int is_nonneg, is_parallel, is_tilable, is_injection, is_complete;
-
-	D = isl_union_set_read_from_str(ctx, d);
-	W = isl_union_map_read_from_str(ctx, w);
-	R = isl_union_map_read_from_str(ctx, r);
-	S = isl_union_map_read_from_str(ctx, s);
-
-	W = isl_union_map_intersect_domain(W, isl_union_set_copy(D));
-	R = isl_union_map_intersect_domain(R, isl_union_set_copy(D));
-
-	empty = isl_union_map_empty(isl_union_map_get_space(S));
-        isl_union_map_compute_flow(isl_union_map_copy(R),
-				   isl_union_map_copy(W), empty,
-				   isl_union_map_copy(S),
-				   &dep_raw, NULL, NULL, NULL);
-        isl_union_map_compute_flow(isl_union_map_copy(W),
-				   isl_union_map_copy(W),
-				   isl_union_map_copy(R),
-				   isl_union_map_copy(S),
-				   &dep_waw, &dep_war, NULL, NULL);
-
-	dep = isl_union_map_union(dep_waw, dep_war);
-	dep = isl_union_map_union(dep, dep_raw);
-	validity = isl_union_map_copy(dep);
-	proximity = isl_union_map_copy(dep);
-
-	sched = isl_union_set_compute_schedule(isl_union_set_copy(D),
-					       validity, proximity);
-	schedule = isl_schedule_get_map(sched);
-	isl_schedule_free(sched);
-	isl_union_map_free(W);
-	isl_union_map_free(R);
-	isl_union_map_free(S);
-
-	is_injection = 1;
-	isl_union_map_foreach_map(schedule, &check_injective, &is_injection);
-
-	domain = isl_union_map_domain(isl_union_map_copy(schedule));
-	is_complete = isl_union_set_is_subset(D, domain);
-	isl_union_set_free(D);
-	isl_union_set_free(domain);
-
-	test = isl_union_map_reverse(isl_union_map_copy(schedule));
-	test = isl_union_map_apply_range(test, dep);
-	test = isl_union_map_apply_range(test, schedule);
-
-	delta = isl_union_map_deltas(test);
-	if (isl_union_set_n_set(delta) == 0) {
-		is_tilable = 1;
-		is_parallel = 1;
-		is_nonneg = 1;
-		isl_union_set_free(delta);
-	} else {
-		delta_set = isl_set_from_union_set(delta);
-
-		slice = isl_set_universe(isl_set_get_space(delta_set));
-		for (i = 0; i < tilable; ++i)
-			slice = isl_set_lower_bound_si(slice, isl_dim_set, i, 0);
-		is_tilable = isl_set_is_subset(delta_set, slice);
-		isl_set_free(slice);
-
-		slice = isl_set_universe(isl_set_get_space(delta_set));
-		for (i = 0; i < parallel; ++i)
-			slice = isl_set_fix_si(slice, isl_dim_set, i, 0);
-		is_parallel = isl_set_is_subset(delta_set, slice);
-		isl_set_free(slice);
-
-		origin = isl_set_universe(isl_set_get_space(delta_set));
-		for (i = 0; i < isl_set_dim(origin, isl_dim_set); ++i)
-			origin = isl_set_fix_si(origin, isl_dim_set, i, 0);
-
-		delta_set = isl_set_union(delta_set, isl_set_copy(origin));
-		delta_set = isl_set_lexmin(delta_set);
-
-		is_nonneg = isl_set_is_equal(delta_set, origin);
-
-		isl_set_free(origin);
-		isl_set_free(delta_set);
-	}
-
-	if (is_nonneg < 0 || is_parallel < 0 || is_tilable < 0 ||
-	    is_injection < 0 || is_complete < 0)
-		return -1;
-	if (!is_complete)
-		isl_die(ctx, isl_error_unknown,
-			"generated schedule incomplete", return -1);
-	if (!is_injection)
-		isl_die(ctx, isl_error_unknown,
-			"generated schedule not injective on each statement",
-			return -1);
-	if (!is_nonneg)
-		isl_die(ctx, isl_error_unknown,
-			"negative dependences in generated schedule",
-			return -1);
-	if (!is_tilable)
-		isl_die(ctx, isl_error_unknown,
-			"generated schedule not as tilable as expected",
-			return -1);
-	if (!is_parallel)
-		isl_die(ctx, isl_error_unknown,
-			"generated schedule not as parallel as expected",
-			return -1);
-
-	return 0;
-}
-
-int test_special_schedule(isl_ctx *ctx)
-{
-	const char *str;
-	isl_union_set *dom;
-	isl_union_map *empty;
-	isl_union_map *dep;
-	isl_union_map *sched1, *sched2;
-	isl_schedule *schedule;
-	int equal;
-
-	str = "{ S[i,j] : 0 <= i <= 10 }";
-	dom = isl_union_set_read_from_str(ctx, str);
-	str = "{ S[i,j] -> S[i+1,j] : 0 <= i,j <= 10 }";
-	dep = isl_union_map_read_from_str(ctx, str);
-	empty = isl_union_map_read_from_str(ctx, "{}");
-	schedule = isl_union_set_compute_schedule(dom, empty, dep);
-	sched1 = isl_schedule_get_map(schedule);
-	isl_schedule_free(schedule);
-
-	str = "{ S[i, j] -> [j, i] }";
-	sched2 = isl_union_map_read_from_str(ctx, str);
-
-	equal = isl_union_map_is_equal(sched1, sched2);
-	isl_union_map_free(sched1);
-	isl_union_map_free(sched2);
-
-	if (equal < 0)
-		return -1;
-	if (!equal)
-		isl_die(ctx, isl_error_unknown, "unexpected schedule",
-			return -1);
-
-	return 0;
-}
-
-int test_schedule(isl_ctx *ctx)
-{
-	const char *D, *W, *R, *S;
-
-	/* Jacobi */
-	D = "[T,N] -> { S1[t,i] : 1 <= t <= T and 2 <= i <= N - 1 }";
-	W = "{ S1[t,i] -> a[t,i] }";
-	R = "{ S1[t,i] -> a[t-1,i]; S1[t,i] -> a[t-1,i-1]; "
-	    	"S1[t,i] -> a[t-1,i+1] }";
-	S = "{ S1[t,i] -> [t,i] }";
-	if (test_one_schedule(ctx, D, W, R, S, 2, 0) < 0)
-		return -1;
-
-	/* Fig. 5 of CC2008 */
-	D = "[N] -> { S_0[i, j] : i >= 0 and i <= -1 + N and j >= 2 and "
-				"j <= -1 + N }";
-	W = "[N] -> { S_0[i, j] -> a[i, j] : i >= 0 and i <= -1 + N and "
-				"j >= 2 and j <= -1 + N }";
-	R = "[N] -> { S_0[i, j] -> a[j, i] : i >= 0 and i <= -1 + N and "
-				"j >= 2 and j <= -1 + N; "
-		    "S_0[i, j] -> a[i, -1 + j] : i >= 0 and i <= -1 + N and "
-				"j >= 2 and j <= -1 + N }";
-	S = "[N] -> { S_0[i, j] -> [0, i, 0, j, 0] }";
-	if (test_one_schedule(ctx, D, W, R, S, 2, 0) < 0)
-		return -1;
-
-	D = "{ S1[i] : 0 <= i <= 10; S2[i] : 0 <= i <= 9 }";
-	W = "{ S1[i] -> a[i] }";
-	R = "{ S2[i] -> a[i+1] }";
-	S = "{ S1[i] -> [0,i]; S2[i] -> [1,i] }";
-	if (test_one_schedule(ctx, D, W, R, S, 1, 1) < 0)
-		return -1;
-
-	D = "{ S1[i] : 0 <= i < 10; S2[i] : 0 <= i < 10 }";
-	W = "{ S1[i] -> a[i] }";
-	R = "{ S2[i] -> a[9-i] }";
-	S = "{ S1[i] -> [0,i]; S2[i] -> [1,i] }";
-	if (test_one_schedule(ctx, D, W, R, S, 1, 1) < 0)
-		return -1;
-
-	D = "[N] -> { S1[i] : 0 <= i < N; S2[i] : 0 <= i < N }";
-	W = "{ S1[i] -> a[i] }";
-	R = "[N] -> { S2[i] -> a[N-1-i] }";
-	S = "{ S1[i] -> [0,i]; S2[i] -> [1,i] }";
-	if (test_one_schedule(ctx, D, W, R, S, 1, 1) < 0)
-		return -1;
-	
-	D = "{ S1[i] : 0 < i < 10; S2[i] : 0 <= i < 10 }";
-	W = "{ S1[i] -> a[i]; S2[i] -> b[i] }";
-	R = "{ S2[i] -> a[i]; S1[i] -> b[i-1] }";
-	S = "{ S1[i] -> [i,0]; S2[i] -> [i,1] }";
-	if (test_one_schedule(ctx, D, W, R, S, 0, 0) < 0)
-		return -1;
-
-	D = "[N] -> { S1[i] : 1 <= i <= N; S2[i,j] : 1 <= i,j <= N }";
-	W = "{ S1[i] -> a[0,i]; S2[i,j] -> a[i,j] }";
-	R = "{ S2[i,j] -> a[i-1,j] }";
-	S = "{ S1[i] -> [0,i,0]; S2[i,j] -> [1,i,j] }";
-	if (test_one_schedule(ctx, D, W, R, S, 2, 1) < 0)
-		return -1;
-
-	D = "[N] -> { S1[i] : 1 <= i <= N; S2[i,j] : 1 <= i,j <= N }";
-	W = "{ S1[i] -> a[i,0]; S2[i,j] -> a[i,j] }";
-	R = "{ S2[i,j] -> a[i,j-1] }";
-	S = "{ S1[i] -> [0,i,0]; S2[i,j] -> [1,i,j] }";
-	if (test_one_schedule(ctx, D, W, R, S, 2, 1) < 0)
-		return -1;
-
-	D = "[N] -> { S_0[]; S_1[i] : i >= 0 and i <= -1 + N; S_2[] }";
-	W = "[N] -> { S_0[] -> a[0]; S_2[] -> b[0]; "
-		    "S_1[i] -> a[1 + i] : i >= 0 and i <= -1 + N }";
-	R = "[N] -> { S_2[] -> a[N]; S_1[i] -> a[i] : i >= 0 and i <= -1 + N }";
-	S = "[N] -> { S_1[i] -> [1, i, 0]; S_2[] -> [2, 0, 1]; "
-		    "S_0[] -> [0, 0, 0] }";
-	if (test_one_schedule(ctx, D, W, R, S, 1, 0) < 0)
-		return -1;
-	ctx->opt->schedule_parametric = 0;
-	if (test_one_schedule(ctx, D, W, R, S, 0, 0) < 0)
-		return -1;
-	ctx->opt->schedule_parametric = 1;
-
-	D = "[N] -> { S1[i] : 1 <= i <= N; S2[i] : 1 <= i <= N; "
-		    "S3[i,j] : 1 <= i,j <= N; S4[i] : 1 <= i <= N }";
-	W = "{ S1[i] -> a[i,0]; S2[i] -> a[0,i]; S3[i,j] -> a[i,j] }";
-	R = "[N] -> { S3[i,j] -> a[i-1,j]; S3[i,j] -> a[i,j-1]; "
-		    "S4[i] -> a[i,N] }";
-	S = "{ S1[i] -> [0,i,0]; S2[i] -> [1,i,0]; S3[i,j] -> [2,i,j]; "
-		"S4[i] -> [4,i,0] }";
-	if (test_one_schedule(ctx, D, W, R, S, 2, 0) < 0)
-		return -1;
-
-	D = "[N] -> { S_0[i, j] : i >= 1 and i <= N and j >= 1 and j <= N }";
-	W = "[N] -> { S_0[i, j] -> s[0] : i >= 1 and i <= N and j >= 1 and "
-					"j <= N }";
-	R = "[N] -> { S_0[i, j] -> s[0] : i >= 1 and i <= N and j >= 1 and "
-					"j <= N; "
-		    "S_0[i, j] -> a[i, j] : i >= 1 and i <= N and j >= 1 and "
-					"j <= N }";
-	S = "[N] -> { S_0[i, j] -> [0, i, 0, j, 0] }";
-	if (test_one_schedule(ctx, D, W, R, S, 0, 0) < 0)
-		return -1;
-
-	D = "[N] -> { S_0[t] : t >= 0 and t <= -1 + N; "
-		    " S_2[t] : t >= 0 and t <= -1 + N; "
-		    " S_1[t, i] : t >= 0 and t <= -1 + N and i >= 0 and "
-				"i <= -1 + N }";
-	W = "[N] -> { S_0[t] -> a[t, 0] : t >= 0 and t <= -1 + N; "
-		    " S_2[t] -> b[t] : t >= 0 and t <= -1 + N; "
-		    " S_1[t, i] -> a[t, 1 + i] : t >= 0 and t <= -1 + N and "
-						"i >= 0 and i <= -1 + N }";
-	R = "[N] -> { S_1[t, i] -> a[t, i] : t >= 0 and t <= -1 + N and "
-					    "i >= 0 and i <= -1 + N; "
-		    " S_2[t] -> a[t, N] : t >= 0 and t <= -1 + N }";
-	S = "[N] -> { S_2[t] -> [0, t, 2]; S_1[t, i] -> [0, t, 1, i, 0]; "
-		    " S_0[t] -> [0, t, 0] }";
-
-	if (test_one_schedule(ctx, D, W, R, S, 2, 1) < 0)
-		return -1;
-	ctx->opt->schedule_parametric = 0;
-	if (test_one_schedule(ctx, D, W, R, S, 0, 0) < 0)
-		return -1;
-	ctx->opt->schedule_parametric = 1;
-
-	D = "[N] -> { S1[i,j] : 0 <= i,j < N; S2[i,j] : 0 <= i,j < N }";
-	S = "{ S1[i,j] -> [0,i,j]; S2[i,j] -> [1,i,j] }";
-	if (test_one_schedule(ctx, D, "{}", "{}", S, 2, 2) < 0)
-		return -1;
-
-	D = "[M, N] -> { S_1[i] : i >= 0 and i <= -1 + M; "
-	    "S_0[i, j] : i >= 0 and i <= -1 + M and j >= 0 and j <= -1 + N }";
-	W = "[M, N] -> { S_0[i, j] -> a[j] : i >= 0 and i <= -1 + M and "
-					    "j >= 0 and j <= -1 + N; "
-			"S_1[i] -> b[0] : i >= 0 and i <= -1 + M }";
-	R = "[M, N] -> { S_0[i, j] -> a[0] : i >= 0 and i <= -1 + M and "
-					    "j >= 0 and j <= -1 + N; "
-			"S_1[i] -> b[0] : i >= 0 and i <= -1 + M }";
-	S = "[M, N] -> { S_1[i] -> [1, i, 0]; S_0[i, j] -> [0, i, 0, j, 0] }";
-	if (test_one_schedule(ctx, D, W, R, S, 0, 0) < 0)
-		return -1;
-
-	D = "{ S_0[i] : i >= 0 }";
-	W = "{ S_0[i] -> a[i] : i >= 0 }";
-	R = "{ S_0[i] -> a[0] : i >= 0 }";
-	S = "{ S_0[i] -> [0, i, 0] }";
-	if (test_one_schedule(ctx, D, W, R, S, 0, 0) < 0)
-		return -1;
-
-	D = "{ S_0[i] : i >= 0; S_1[i] : i >= 0 }";
-	W = "{ S_0[i] -> a[i] : i >= 0; S_1[i] -> b[i] : i >= 0 }";
-	R = "{ S_0[i] -> b[0] : i >= 0; S_1[i] -> a[i] : i >= 0 }";
-	S = "{ S_1[i] -> [0, i, 1]; S_0[i] -> [0, i, 0] }";
-	if (test_one_schedule(ctx, D, W, R, S, 0, 0) < 0)
-		return -1;
-
-	D = "[n] -> { S_0[j, k] : j <= -1 + n and j >= 0 and "
-				"k <= -1 + n and k >= 0 }";
-	W = "[n] -> { S_0[j, k] -> B[j] : j <= -1 + n and j >= 0 and "							"k <= -1 + n and k >= 0 }";
-	R = "[n] -> { S_0[j, k] -> B[j] : j <= -1 + n and j >= 0 and "
-					"k <= -1 + n and k >= 0; "
-		    "S_0[j, k] -> B[k] : j <= -1 + n and j >= 0 and "
-					"k <= -1 + n and k >= 0; "
-		    "S_0[j, k] -> A[k] : j <= -1 + n and j >= 0 and "
-					"k <= -1 + n and k >= 0 }";
-	S = "[n] -> { S_0[j, k] -> [2, j, k] }";
-	ctx->opt->schedule_outer_zero_distance = 1;
-	if (test_one_schedule(ctx, D, W, R, S, 0, 0) < 0)
-		return -1;
-	ctx->opt->schedule_outer_zero_distance = 0;
-
-	return test_special_schedule(ctx);
-}
-
-int test_plain_injective(isl_ctx *ctx, const char *str, int injective)
-{
-	isl_union_map *umap;
-	int test;
-
-	umap = isl_union_map_read_from_str(ctx, str);
-	test = isl_union_map_plain_is_injective(umap);
-	isl_union_map_free(umap);
-	if (test < 0)
-		return -1;
-	if (test == injective)
-		return 0;
-	if (injective)
-		isl_die(ctx, isl_error_unknown,
-			"map not detected as injective", return -1);
-	else
-		isl_die(ctx, isl_error_unknown,
-			"map detected as injective", return -1);
-}
-
-int test_injective(isl_ctx *ctx)
-{
-	const char *str;
-
-	if (test_plain_injective(ctx, "{S[i,j] -> A[0]; T[i,j] -> B[1]}", 0))
-		return -1;
-	if (test_plain_injective(ctx, "{S[] -> A[0]; T[] -> B[0]}", 1))
-		return -1;
-	if (test_plain_injective(ctx, "{S[] -> A[0]; T[] -> A[1]}", 1))
-		return -1;
-	if (test_plain_injective(ctx, "{S[] -> A[0]; T[] -> A[0]}", 0))
-		return -1;
-	if (test_plain_injective(ctx, "{S[i] -> A[i,0]; T[i] -> A[i,1]}", 1))
-		return -1;
-	if (test_plain_injective(ctx, "{S[i] -> A[i]; T[i] -> A[i]}", 0))
-		return -1;
-	if (test_plain_injective(ctx, "{S[] -> A[0,0]; T[] -> A[0,1]}", 1))
-		return -1;
-	if (test_plain_injective(ctx, "{S[] -> A[0,0]; T[] -> A[1,0]}", 1))
-		return -1;
-
-	str = "{S[] -> A[0,0]; T[] -> A[0,1]; U[] -> A[1,0]}";
-	if (test_plain_injective(ctx, str, 1))
-		return -1;
-	str = "{S[] -> A[0,0]; T[] -> A[0,1]; U[] -> A[0,0]}";
-	if (test_plain_injective(ctx, str, 0))
-		return -1;
-
-	return 0;
-}
-
-int test_aff(isl_ctx *ctx)
-{
-	const char *str;
-	isl_set *set;
-	isl_space *dim;
-	isl_local_space *ls;
-	isl_aff *aff;
-	int zero;
-
-	dim = isl_space_set_alloc(ctx, 0, 1);
-	ls = isl_local_space_from_space(dim);
-	aff = isl_aff_zero_on_domain(ls);
-
-	aff = isl_aff_add_coefficient_si(aff, isl_dim_in, 0, 1);
-	aff = isl_aff_scale_down_ui(aff, 3);
-	aff = isl_aff_floor(aff);
-	aff = isl_aff_add_coefficient_si(aff, isl_dim_in, 0, 1);
-	aff = isl_aff_scale_down_ui(aff, 2);
-	aff = isl_aff_floor(aff);
-	aff = isl_aff_add_coefficient_si(aff, isl_dim_in, 0, 1);
-
-	str = "{ [10] }";
-	set = isl_set_read_from_str(ctx, str);
-	aff = isl_aff_gist(aff, set);
-
-	aff = isl_aff_add_constant_si(aff, -16);
-	zero = isl_aff_plain_is_zero(aff);
-	isl_aff_free(aff);
-
-	if (zero < 0)
-		return -1;
-	if (!zero)
-		isl_die(ctx, isl_error_unknown, "unexpected result", return -1);
-
-	return 0;
-}
-
-int test_dim_max(isl_ctx *ctx)
-{
-	int equal;
-	const char *str;
-	isl_set *set1, *set2;
-	isl_set *set;
-	isl_map *map;
-	isl_pw_aff *pwaff;
-
-	str = "[N] -> { [i] : 0 <= i <= min(N,10) }";
-	set = isl_set_read_from_str(ctx, str);
-	pwaff = isl_set_dim_max(set, 0);
-	set1 = isl_set_from_pw_aff(pwaff);
-	str = "[N] -> { [10] : N >= 10; [N] : N <= 9 and N >= 0 }";
-	set2 = isl_set_read_from_str(ctx, str);
-	equal = isl_set_is_equal(set1, set2);
-	isl_set_free(set1);
-	isl_set_free(set2);
-	if (equal < 0)
-		return -1;
-	if (!equal)
-		isl_die(ctx, isl_error_unknown, "unexpected result", return -1);
-
-	str = "[N] -> { [i] : 0 <= i <= max(2N,N+6) }";
-	set = isl_set_read_from_str(ctx, str);
-	pwaff = isl_set_dim_max(set, 0);
-	set1 = isl_set_from_pw_aff(pwaff);
-	str = "[N] -> { [6 + N] : -6 <= N <= 5; [2N] : N >= 6 }";
-	set2 = isl_set_read_from_str(ctx, str);
-	equal = isl_set_is_equal(set1, set2);
-	isl_set_free(set1);
-	isl_set_free(set2);
-	if (equal < 0)
-		return -1;
-	if (!equal)
-		isl_die(ctx, isl_error_unknown, "unexpected result", return -1);
-
-	str = "[N] -> { [i] : 0 <= i <= 2N or 0 <= i <= N+6 }";
-	set = isl_set_read_from_str(ctx, str);
-	pwaff = isl_set_dim_max(set, 0);
-	set1 = isl_set_from_pw_aff(pwaff);
-	str = "[N] -> { [6 + N] : -6 <= N <= 5; [2N] : N >= 6 }";
-	set2 = isl_set_read_from_str(ctx, str);
-	equal = isl_set_is_equal(set1, set2);
-	isl_set_free(set1);
-	isl_set_free(set2);
-	if (equal < 0)
-		return -1;
-	if (!equal)
-		isl_die(ctx, isl_error_unknown, "unexpected result", return -1);
-
-	str = "[N,M] -> { [i,j] -> [([i/16]), i%16, ([j/16]), j%16] : "
-			"0 <= i < N and 0 <= j < M }";
-	map = isl_map_read_from_str(ctx, str);
-	set = isl_map_range(map);
-
-	pwaff = isl_set_dim_max(isl_set_copy(set), 0);
-	set1 = isl_set_from_pw_aff(pwaff);
-	str = "[N,M] -> { [([(N-1)/16])] : M,N > 0 }";
-	set2 = isl_set_read_from_str(ctx, str);
-	equal = isl_set_is_equal(set1, set2);
-	isl_set_free(set1);
-	isl_set_free(set2);
-
-	pwaff = isl_set_dim_max(isl_set_copy(set), 3);
-	set1 = isl_set_from_pw_aff(pwaff);
-	str = "[N,M] -> { [t] : t = min(M-1,15) and M,N > 0 }";
-	set2 = isl_set_read_from_str(ctx, str);
-	if (equal >= 0 && equal)
-		equal = isl_set_is_equal(set1, set2);
-	isl_set_free(set1);
-	isl_set_free(set2);
-
-	isl_set_free(set);
-
-	if (equal < 0)
-		return -1;
-	if (!equal)
-		isl_die(ctx, isl_error_unknown, "unexpected result", return -1);
-
-	return 0;
-}
-
-int test_product(isl_ctx *ctx)
-{
-	const char *str;
-	isl_set *set;
-	int ok;
-
-	str = "{ A[i] }";
-	set = isl_set_read_from_str(ctx, str);
-	set = isl_set_product(set, isl_set_copy(set));
-	ok = isl_set_is_wrapping(set);
-	isl_set_free(set);
-	if (ok < 0)
-		return -1;
-	if (!ok)
-		isl_die(ctx, isl_error_unknown, "unexpected result", return -1);
-
-	return 0;
-}
-
-int test_equal(isl_ctx *ctx)
-{
-	const char *str;
-	isl_set *set, *set2;
-	int equal;
-
-	str = "{ S_6[i] }";
-	set = isl_set_read_from_str(ctx, str);
-	str = "{ S_7[i] }";
-	set2 = isl_set_read_from_str(ctx, str);
-	equal = isl_set_is_equal(set, set2);
-	isl_set_free(set);
-	isl_set_free(set2);
-	if (equal < 0)
-		return -1;
-	if (equal)
-		isl_die(ctx, isl_error_unknown, "unexpected result", return -1);
-
-	return 0;
-}
-
-static int test_plain_fixed(isl_ctx *ctx, __isl_take isl_map *map,
-	enum isl_dim_type type, unsigned pos, int fixed)
-{
-	int test;
-
-	test = isl_map_plain_is_fixed(map, type, pos, NULL);
-	isl_map_free(map);
-	if (test < 0)
-		return -1;
-	if (test == fixed)
-		return 0;
-	if (fixed)
-		isl_die(ctx, isl_error_unknown,
-			"map not detected as fixed", return -1);
-	else
-		isl_die(ctx, isl_error_unknown,
-			"map detected as fixed", return -1);
-}
-
-int test_fixed(isl_ctx *ctx)
-{
-	const char *str;
-	isl_map *map;
-
-	str = "{ [i] -> [i] }";
-	map = isl_map_read_from_str(ctx, str);
-	if (test_plain_fixed(ctx, map, isl_dim_out, 0, 0))
-		return -1;
-	str = "{ [i] -> [1] }";
-	map = isl_map_read_from_str(ctx, str);
-	if (test_plain_fixed(ctx, map, isl_dim_out, 0, 1))
-		return -1;
-	str = "{ S_1[p1] -> [o0] : o0 = -2 and p1 >= 1 and p1 <= 7 }";
-	map = isl_map_read_from_str(ctx, str);
-	if (test_plain_fixed(ctx, map, isl_dim_out, 0, 1))
-		return -1;
-	map = isl_map_read_from_str(ctx, str);
-	map = isl_map_neg(map);
-	if (test_plain_fixed(ctx, map, isl_dim_out, 0, 1))
-		return -1;
-
-	return 0;
-}
-
-int test_union_pw(isl_ctx *ctx)
-{
-	int equal;
-	const char *str;
-	isl_union_set *uset;
-	isl_union_pw_qpolynomial *upwqp1, *upwqp2;
-
-	str = "{ [x] -> x^2 }";
-	upwqp1 = isl_union_pw_qpolynomial_read_from_str(ctx, str);
-	upwqp2 = isl_union_pw_qpolynomial_copy(upwqp1);
-	uset = isl_union_pw_qpolynomial_domain(upwqp1);
-	upwqp1 = isl_union_pw_qpolynomial_copy(upwqp2);
-	upwqp1 = isl_union_pw_qpolynomial_intersect_domain(upwqp1, uset);
-	equal = isl_union_pw_qpolynomial_plain_is_equal(upwqp1, upwqp2);
-	isl_union_pw_qpolynomial_free(upwqp1);
-	isl_union_pw_qpolynomial_free(upwqp2);
-	if (equal < 0)
-		return -1;
-	if (!equal)
-		isl_die(ctx, isl_error_unknown, "unexpected result", return -1);
-
-	return 0;
-}
-
-int main()
-{
-	struct isl_ctx *ctx;
-
-	srcdir = getenv("srcdir");
-	assert(srcdir);
-
-	ctx = isl_ctx_alloc();
-	if (test_fixed(ctx) < 0)
-		goto error;
-	if (test_equal(ctx) < 0)
-		goto error;
-	if (test_product(ctx) < 0)
-		goto error;
-	if (test_dim_max(ctx) < 0)
-		goto error;
-	if (test_aff(ctx) < 0)
-		goto error;
-	if (test_injective(ctx) < 0)
-		goto error;
-	if (test_schedule(ctx) < 0)
-		goto error;
-	if (test_union_pw(ctx) < 0)
-		goto error;
-	test_factorize(ctx);
-	test_subset(ctx);
-	test_lift(ctx);
-	test_bound(ctx);
-	test_union(ctx);
-	test_split_periods(ctx);
-	test_parse(ctx);
-	test_pwqp(ctx);
-	test_lex(ctx);
-	if (test_sv(ctx) < 0)
-		goto error;
-	test_bijective(ctx);
-	test_dep(ctx);
-	test_read(ctx);
-	test_bounded(ctx);
-	test_construction(ctx);
-	test_dim(ctx);
-	test_div(ctx);
-	test_application(ctx);
-	test_affine_hull(ctx);
-	test_convex_hull(ctx);
-	test_gist(ctx);
-	test_coalesce(ctx);
-	test_closure(ctx);
-	test_lexmin(ctx);
-	isl_ctx_free(ctx);
-	return 0;
-error:
-	isl_ctx_free(ctx);
-	return -1;
-}
diff --git a/cloog-0.17.0/isl/isl_transitive_closure.c b/cloog-0.17.0/isl/isl_transitive_closure.c
deleted file mode 100644
index 20e020e..0000000
--- a/cloog-0.17.0/isl/isl_transitive_closure.c
+++ /dev/null
@@ -1,3104 +0,0 @@
-/*
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France 
- */
-
-#include <isl_ctx_private.h>
-#include <isl_map_private.h>
-#include <isl/map.h>
-#include <isl/seq.h>
-#include <isl_space_private.h>
-#include <isl/lp.h>
-#include <isl/union_map.h>
-#include <isl_mat_private.h>
-#include <isl_options_private.h>
-
-int isl_map_is_transitively_closed(__isl_keep isl_map *map)
-{
-	isl_map *map2;
-	int closed;
-
-	map2 = isl_map_apply_range(isl_map_copy(map), isl_map_copy(map));
-	closed = isl_map_is_subset(map2, map);
-	isl_map_free(map2);
-
-	return closed;
-}
-
-int isl_union_map_is_transitively_closed(__isl_keep isl_union_map *umap)
-{
-	isl_union_map *umap2;
-	int closed;
-
-	umap2 = isl_union_map_apply_range(isl_union_map_copy(umap),
-					  isl_union_map_copy(umap));
-	closed = isl_union_map_is_subset(umap2, umap);
-	isl_union_map_free(umap2);
-
-	return closed;
-}
- 
-/* Given a map that represents a path with the length of the path
- * encoded as the difference between the last output coordindate
- * and the last input coordinate, set this length to either
- * exactly "length" (if "exactly" is set) or at least "length"
- * (if "exactly" is not set).
- */
-static __isl_give isl_map *set_path_length(__isl_take isl_map *map,
-	int exactly, int length)
-{
-	isl_space *dim;
-	struct isl_basic_map *bmap;
-	unsigned d;
-	unsigned nparam;
-	int k;
-	isl_int *c;
-
-	if (!map)
-		return NULL;
-
-	dim = isl_map_get_space(map);
-	d = isl_space_dim(dim, isl_dim_in);
-	nparam = isl_space_dim(dim, isl_dim_param);
-	bmap = isl_basic_map_alloc_space(dim, 0, 1, 1);
-	if (exactly) {
-		k = isl_basic_map_alloc_equality(bmap);
-		c = bmap->eq[k];
-	} else {
-		k = isl_basic_map_alloc_inequality(bmap);
-		c = bmap->ineq[k];
-	}
-	if (k < 0)
-		goto error;
-	isl_seq_clr(c, 1 + isl_basic_map_total_dim(bmap));
-	isl_int_set_si(c[0], -length);
-	isl_int_set_si(c[1 + nparam + d - 1], -1);
-	isl_int_set_si(c[1 + nparam + d + d - 1], 1);
-
-	bmap = isl_basic_map_finalize(bmap);
-	map = isl_map_intersect(map, isl_map_from_basic_map(bmap));
-
-	return map;
-error:
-	isl_basic_map_free(bmap);
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Check whether the overapproximation of the power of "map" is exactly
- * the power of "map".  Let R be "map" and A_k the overapproximation.
- * The approximation is exact if
- *
- *	A_1 = R
- *	A_k = A_{k-1} \circ R			k >= 2
- *
- * Since A_k is known to be an overapproximation, we only need to check
- *
- *	A_1 \subset R
- *	A_k \subset A_{k-1} \circ R		k >= 2
- *
- * In practice, "app" has an extra input and output coordinate
- * to encode the length of the path.  So, we first need to add
- * this coordinate to "map" and set the length of the path to
- * one.
- */
-static int check_power_exactness(__isl_take isl_map *map,
-	__isl_take isl_map *app)
-{
-	int exact;
-	isl_map *app_1;
-	isl_map *app_2;
-
-	map = isl_map_add_dims(map, isl_dim_in, 1);
-	map = isl_map_add_dims(map, isl_dim_out, 1);
-	map = set_path_length(map, 1, 1);
-
-	app_1 = set_path_length(isl_map_copy(app), 1, 1);
-
-	exact = isl_map_is_subset(app_1, map);
-	isl_map_free(app_1);
-
-	if (!exact || exact < 0) {
-		isl_map_free(app);
-		isl_map_free(map);
-		return exact;
-	}
-
-	app_1 = set_path_length(isl_map_copy(app), 0, 1);
-	app_2 = set_path_length(app, 0, 2);
-	app_1 = isl_map_apply_range(map, app_1);
-
-	exact = isl_map_is_subset(app_2, app_1);
-
-	isl_map_free(app_1);
-	isl_map_free(app_2);
-
-	return exact;
-}
-
-/* Check whether the overapproximation of the power of "map" is exactly
- * the power of "map", possibly after projecting out the power (if "project"
- * is set).
- *
- * If "project" is set and if "steps" can only result in acyclic paths,
- * then we check
- *
- *	A = R \cup (A \circ R)
- *
- * where A is the overapproximation with the power projected out, i.e.,
- * an overapproximation of the transitive closure.
- * More specifically, since A is known to be an overapproximation, we check
- *
- *	A \subset R \cup (A \circ R)
- *
- * Otherwise, we check if the power is exact.
- *
- * Note that "app" has an extra input and output coordinate to encode
- * the length of the part.  If we are only interested in the transitive
- * closure, then we can simply project out these coordinates first.
- */
-static int check_exactness(__isl_take isl_map *map, __isl_take isl_map *app,
-	int project)
-{
-	isl_map *test;
-	int exact;
-	unsigned d;
-
-	if (!project)
-		return check_power_exactness(map, app);
-
-	d = isl_map_dim(map, isl_dim_in);
-	app = set_path_length(app, 0, 1);
-	app = isl_map_project_out(app, isl_dim_in, d, 1);
-	app = isl_map_project_out(app, isl_dim_out, d, 1);
-
-	app = isl_map_reset_space(app, isl_map_get_space(map));
-
-	test = isl_map_apply_range(isl_map_copy(map), isl_map_copy(app));
-	test = isl_map_union(test, isl_map_copy(map));
-
-	exact = isl_map_is_subset(app, test);
-
-	isl_map_free(app);
-	isl_map_free(test);
-
-	isl_map_free(map);
-
-	return exact;
-}
-
-/*
- * The transitive closure implementation is based on the paper
- * "Computing the Transitive Closure of a Union of Affine Integer
- * Tuple Relations" by Anna Beletska, Denis Barthou, Wlodzimierz Bielecki and
- * Albert Cohen.
- */
-
-/* Given a set of n offsets v_i (the rows of "steps"), construct a relation
- * of the given dimension specification (Z^{n+1} -> Z^{n+1})
- * that maps an element x to any element that can be reached
- * by taking a non-negative number of steps along any of
- * the extended offsets v'_i = [v_i 1].
- * That is, construct
- *
- * { [x] -> [y] : exists k_i >= 0, y = x + \sum_i k_i v'_i }
- *
- * For any element in this relation, the number of steps taken
- * is equal to the difference in the final coordinates.
- */
-static __isl_give isl_map *path_along_steps(__isl_take isl_space *dim,
-	__isl_keep isl_mat *steps)
-{
-	int i, j, k;
-	struct isl_basic_map *path = NULL;
-	unsigned d;
-	unsigned n;
-	unsigned nparam;
-
-	if (!dim || !steps)
-		goto error;
-
-	d = isl_space_dim(dim, isl_dim_in);
-	n = steps->n_row;
-	nparam = isl_space_dim(dim, isl_dim_param);
-
-	path = isl_basic_map_alloc_space(isl_space_copy(dim), n, d, n);
-
-	for (i = 0; i < n; ++i) {
-		k = isl_basic_map_alloc_div(path);
-		if (k < 0)
-			goto error;
-		isl_assert(steps->ctx, i == k, goto error);
-		isl_int_set_si(path->div[k][0], 0);
-	}
-
-	for (i = 0; i < d; ++i) {
-		k = isl_basic_map_alloc_equality(path);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(path->eq[k], 1 + isl_basic_map_total_dim(path));
-		isl_int_set_si(path->eq[k][1 + nparam + i], 1);
-		isl_int_set_si(path->eq[k][1 + nparam + d + i], -1);
-		if (i == d - 1)
-			for (j = 0; j < n; ++j)
-				isl_int_set_si(path->eq[k][1 + nparam + 2 * d + j], 1);
-		else
-			for (j = 0; j < n; ++j)
-				isl_int_set(path->eq[k][1 + nparam + 2 * d + j],
-					    steps->row[j][i]);
-	}
-
-	for (i = 0; i < n; ++i) {
-		k = isl_basic_map_alloc_inequality(path);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(path->ineq[k], 1 + isl_basic_map_total_dim(path));
-		isl_int_set_si(path->ineq[k][1 + nparam + 2 * d + i], 1);
-	}
-
-	isl_space_free(dim);
-
-	path = isl_basic_map_simplify(path);
-	path = isl_basic_map_finalize(path);
-	return isl_map_from_basic_map(path);
-error:
-	isl_space_free(dim);
-	isl_basic_map_free(path);
-	return NULL;
-}
-
-#define IMPURE		0
-#define PURE_PARAM	1
-#define PURE_VAR	2
-#define MIXED		3
-
-/* Check whether the parametric constant term of constraint c is never
- * positive in "bset".
- */
-static int parametric_constant_never_positive(__isl_keep isl_basic_set *bset,
-	isl_int *c, int *div_purity)
-{
-	unsigned d;
-	unsigned n_div;
-	unsigned nparam;
-	int i;
-	int k;
-	int empty;
-
-	n_div = isl_basic_set_dim(bset, isl_dim_div);
-	d = isl_basic_set_dim(bset, isl_dim_set);
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-
-	bset = isl_basic_set_copy(bset);
-	bset = isl_basic_set_cow(bset);
-	bset = isl_basic_set_extend_constraints(bset, 0, 1);
-	k = isl_basic_set_alloc_inequality(bset);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(bset->ineq[k], 1 + isl_basic_set_total_dim(bset));
-	isl_seq_cpy(bset->ineq[k], c, 1 + nparam);
-	for (i = 0; i < n_div; ++i) {
-		if (div_purity[i] != PURE_PARAM)
-			continue;
-		isl_int_set(bset->ineq[k][1 + nparam + d + i],
-			    c[1 + nparam + d + i]);
-	}
-	isl_int_sub_ui(bset->ineq[k][0], bset->ineq[k][0], 1);
-	empty = isl_basic_set_is_empty(bset);
-	isl_basic_set_free(bset);
-
-	return empty;
-error:
-	isl_basic_set_free(bset);
-	return -1;
-}
-
-/* Return PURE_PARAM if only the coefficients of the parameters are non-zero.
- * Return PURE_VAR if only the coefficients of the set variables are non-zero.
- * Return MIXED if only the coefficients of the parameters and the set
- * 	variables are non-zero and if moreover the parametric constant
- * 	can never attain positive values.
- * Return IMPURE otherwise.
- *
- * If div_purity is NULL then we are dealing with a non-parametric set
- * and so the constraint is obviously PURE_VAR.
- */
-static int purity(__isl_keep isl_basic_set *bset, isl_int *c, int *div_purity,
-	int eq)
-{
-	unsigned d;
-	unsigned n_div;
-	unsigned nparam;
-	int empty;
-	int i;
-	int p = 0, v = 0;
-
-	if (!div_purity)
-		return PURE_VAR;
-
-	n_div = isl_basic_set_dim(bset, isl_dim_div);
-	d = isl_basic_set_dim(bset, isl_dim_set);
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-
-	for (i = 0; i < n_div; ++i) {
-		if (isl_int_is_zero(c[1 + nparam + d + i]))
-			continue;
-		switch (div_purity[i]) {
-		case PURE_PARAM: p = 1; break;
-		case PURE_VAR: v = 1; break;
-		default: return IMPURE;
-		}
-	}
-	if (!p && isl_seq_first_non_zero(c + 1, nparam) == -1)
-		return PURE_VAR;
-	if (!v && isl_seq_first_non_zero(c + 1 + nparam, d) == -1)
-		return PURE_PARAM;
-
-	empty = parametric_constant_never_positive(bset, c, div_purity);
-	if (eq && empty >= 0 && !empty) {
-		isl_seq_neg(c, c, 1 + nparam + d + n_div);
-		empty = parametric_constant_never_positive(bset, c, div_purity);
-	}
-
-	return empty < 0 ? -1 : empty ? MIXED : IMPURE;
-}
-
-/* Return an array of integers indicating the type of each div in bset.
- * If the div is (recursively) defined in terms of only the parameters,
- * then the type is PURE_PARAM.
- * If the div is (recursively) defined in terms of only the set variables,
- * then the type is PURE_VAR.
- * Otherwise, the type is IMPURE.
- */
-static __isl_give int *get_div_purity(__isl_keep isl_basic_set *bset)
-{
-	int i, j;
-	int *div_purity;
-	unsigned d;
-	unsigned n_div;
-	unsigned nparam;
-
-	if (!bset)
-		return NULL;
-
-	n_div = isl_basic_set_dim(bset, isl_dim_div);
-	d = isl_basic_set_dim(bset, isl_dim_set);
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-
-	div_purity = isl_alloc_array(bset->ctx, int, n_div);
-	if (!div_purity)
-		return NULL;
-
-	for (i = 0; i < bset->n_div; ++i) {
-		int p = 0, v = 0;
-		if (isl_int_is_zero(bset->div[i][0])) {
-			div_purity[i] = IMPURE;
-			continue;
-		}
-		if (isl_seq_first_non_zero(bset->div[i] + 2, nparam) != -1)
-			p = 1;
-		if (isl_seq_first_non_zero(bset->div[i] + 2 + nparam, d) != -1)
-			v = 1;
-		for (j = 0; j < i; ++j) {
-			if (isl_int_is_zero(bset->div[i][2 + nparam + d + j]))
-				continue;
-			switch (div_purity[j]) {
-			case PURE_PARAM: p = 1; break;
-			case PURE_VAR: v = 1; break;
-			default: p = v = 1; break;
-			}
-		}
-		div_purity[i] = v ? p ? IMPURE : PURE_VAR : PURE_PARAM;
-	}
-
-	return div_purity;
-}
-
-/* Given a path with the as yet unconstrained length at position "pos",
- * check if setting the length to zero results in only the identity
- * mapping.
- */
-static int empty_path_is_identity(__isl_keep isl_basic_map *path, unsigned pos)
-{
-	isl_basic_map *test = NULL;
-	isl_basic_map *id = NULL;
-	int k;
-	int is_id;
-
-	test = isl_basic_map_copy(path);
-	test = isl_basic_map_extend_constraints(test, 1, 0);
-	k = isl_basic_map_alloc_equality(test);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(test->eq[k], 1 + isl_basic_map_total_dim(test));
-	isl_int_set_si(test->eq[k][pos], 1);
-	id = isl_basic_map_identity(isl_basic_map_get_space(path));
-	is_id = isl_basic_map_is_equal(test, id);
-	isl_basic_map_free(test);
-	isl_basic_map_free(id);
-	return is_id;
-error:
-	isl_basic_map_free(test);
-	return -1;
-}
-
-/* If any of the constraints is found to be impure then this function
- * sets *impurity to 1.
- */
-static __isl_give isl_basic_map *add_delta_constraints(
-	__isl_take isl_basic_map *path,
-	__isl_keep isl_basic_set *delta, unsigned off, unsigned nparam,
-	unsigned d, int *div_purity, int eq, int *impurity)
-{
-	int i, k;
-	int n = eq ? delta->n_eq : delta->n_ineq;
-	isl_int **delta_c = eq ? delta->eq : delta->ineq;
-	unsigned n_div;
-
-	n_div = isl_basic_set_dim(delta, isl_dim_div);
-
-	for (i = 0; i < n; ++i) {
-		isl_int *path_c;
-		int p = purity(delta, delta_c[i], div_purity, eq);
-		if (p < 0)
-			goto error;
-		if (p != PURE_VAR && p != PURE_PARAM && !*impurity)
-			*impurity = 1;
-		if (p == IMPURE)
-			continue;
-		if (eq && p != MIXED) {
-			k = isl_basic_map_alloc_equality(path);
-			path_c = path->eq[k];
-		} else {
-			k = isl_basic_map_alloc_inequality(path);
-			path_c = path->ineq[k];
-		}
-		if (k < 0)
-			goto error;
-		isl_seq_clr(path_c, 1 + isl_basic_map_total_dim(path));
-		if (p == PURE_VAR) {
-			isl_seq_cpy(path_c + off,
-				    delta_c[i] + 1 + nparam, d);
-			isl_int_set(path_c[off + d], delta_c[i][0]);
-		} else if (p == PURE_PARAM) {
-			isl_seq_cpy(path_c, delta_c[i], 1 + nparam);
-		} else {
-			isl_seq_cpy(path_c + off,
-				    delta_c[i] + 1 + nparam, d);
-			isl_seq_cpy(path_c, delta_c[i], 1 + nparam);
-		}
-		isl_seq_cpy(path_c + off - n_div,
-			    delta_c[i] + 1 + nparam + d, n_div);
-	}
-
-	return path;
-error:
-	isl_basic_map_free(path);
-	return NULL;
-}
-
-/* Given a set of offsets "delta", construct a relation of the
- * given dimension specification (Z^{n+1} -> Z^{n+1}) that
- * is an overapproximation of the relations that
- * maps an element x to any element that can be reached
- * by taking a non-negative number of steps along any of
- * the elements in "delta".
- * That is, construct an approximation of
- *
- *	{ [x] -> [y] : exists f \in \delta, k \in Z :
- *					y = x + k [f, 1] and k >= 0 }
- *
- * For any element in this relation, the number of steps taken
- * is equal to the difference in the final coordinates.
- *
- * In particular, let delta be defined as
- *
- *	\delta = [p] -> { [x] : A x + a >= 0 and B p + b >= 0 and
- *				C x + C'p + c >= 0 and
- *				D x + D'p + d >= 0 }
- *
- * where the constraints C x + C'p + c >= 0 are such that the parametric
- * constant term of each constraint j, "C_j x + C'_j p + c_j",
- * can never attain positive values, then the relation is constructed as
- *
- *	{ [x] -> [y] : exists [f, k] \in Z^{n+1} : y = x + f and
- *			A f + k a >= 0 and B p + b >= 0 and
- *			C f + C'p + c >= 0 and k >= 1 }
- *	union { [x] -> [x] }
- *
- * If the zero-length paths happen to correspond exactly to the identity
- * mapping, then we return
- *
- *	{ [x] -> [y] : exists [f, k] \in Z^{n+1} : y = x + f and
- *			A f + k a >= 0 and B p + b >= 0 and
- *			C f + C'p + c >= 0 and k >= 0 }
- *
- * instead.
- *
- * Existentially quantified variables in \delta are handled by
- * classifying them as independent of the parameters, purely
- * parameter dependent and others.  Constraints containing
- * any of the other existentially quantified variables are removed.
- * This is safe, but leads to an additional overapproximation.
- *
- * If there are any impure constraints, then we also eliminate
- * the parameters from \delta, resulting in a set
- *
- *	\delta' = { [x] : E x + e >= 0 }
- *
- * and add the constraints
- *
- *			E f + k e >= 0
- *
- * to the constructed relation.
- */
-static __isl_give isl_map *path_along_delta(__isl_take isl_space *dim,
-	__isl_take isl_basic_set *delta)
-{
-	isl_basic_map *path = NULL;
-	unsigned d;
-	unsigned n_div;
-	unsigned nparam;
-	unsigned off;
-	int i, k;
-	int is_id;
-	int *div_purity = NULL;
-	int impurity = 0;
-
-	if (!delta)
-		goto error;
-	n_div = isl_basic_set_dim(delta, isl_dim_div);
-	d = isl_basic_set_dim(delta, isl_dim_set);
-	nparam = isl_basic_set_dim(delta, isl_dim_param);
-	path = isl_basic_map_alloc_space(isl_space_copy(dim), n_div + d + 1,
-			d + 1 + delta->n_eq, delta->n_eq + delta->n_ineq + 1);
-	off = 1 + nparam + 2 * (d + 1) + n_div;
-
-	for (i = 0; i < n_div + d + 1; ++i) {
-		k = isl_basic_map_alloc_div(path);
-		if (k < 0)
-			goto error;
-		isl_int_set_si(path->div[k][0], 0);
-	}
-
-	for (i = 0; i < d + 1; ++i) {
-		k = isl_basic_map_alloc_equality(path);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(path->eq[k], 1 + isl_basic_map_total_dim(path));
-		isl_int_set_si(path->eq[k][1 + nparam + i], 1);
-		isl_int_set_si(path->eq[k][1 + nparam + d + 1 + i], -1);
-		isl_int_set_si(path->eq[k][off + i], 1);
-	}
-
-	div_purity = get_div_purity(delta);
-	if (!div_purity)
-		goto error;
-
-	path = add_delta_constraints(path, delta, off, nparam, d,
-				     div_purity, 1, &impurity);
-	path = add_delta_constraints(path, delta, off, nparam, d,
-				     div_purity, 0, &impurity);
-	if (impurity) {
-		isl_space *dim = isl_basic_set_get_space(delta);
-		delta = isl_basic_set_project_out(delta,
-						  isl_dim_param, 0, nparam);
-		delta = isl_basic_set_add(delta, isl_dim_param, nparam);
-		delta = isl_basic_set_reset_space(delta, dim);
-		if (!delta)
-			goto error;
-		path = isl_basic_map_extend_constraints(path, delta->n_eq,
-							delta->n_ineq + 1);
-		path = add_delta_constraints(path, delta, off, nparam, d,
-					     NULL, 1, &impurity);
-		path = add_delta_constraints(path, delta, off, nparam, d,
-					     NULL, 0, &impurity);
-		path = isl_basic_map_gauss(path, NULL);
-	}
-
-	is_id = empty_path_is_identity(path, off + d);
-	if (is_id < 0)
-		goto error;
-
-	k = isl_basic_map_alloc_inequality(path);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(path->ineq[k], 1 + isl_basic_map_total_dim(path));
-	if (!is_id)
-		isl_int_set_si(path->ineq[k][0], -1);
-	isl_int_set_si(path->ineq[k][off + d], 1);
-			
-	free(div_purity);
-	isl_basic_set_free(delta);
-	path = isl_basic_map_finalize(path);
-	if (is_id) {
-		isl_space_free(dim);
-		return isl_map_from_basic_map(path);
-	}
-	return isl_basic_map_union(path, isl_basic_map_identity(dim));
-error:
-	free(div_purity);
-	isl_space_free(dim);
-	isl_basic_set_free(delta);
-	isl_basic_map_free(path);
-	return NULL;
-}
-
-/* Given a dimension specification Z^{n+1} -> Z^{n+1} and a parameter "param",
- * construct a map that equates the parameter to the difference
- * in the final coordinates and imposes that this difference is positive.
- * That is, construct
- *
- *	{ [x,x_s] -> [y,y_s] : k = y_s - x_s > 0 }
- */
-static __isl_give isl_map *equate_parameter_to_length(__isl_take isl_space *dim,
-	unsigned param)
-{
-	struct isl_basic_map *bmap;
-	unsigned d;
-	unsigned nparam;
-	int k;
-
-	d = isl_space_dim(dim, isl_dim_in);
-	nparam = isl_space_dim(dim, isl_dim_param);
-	bmap = isl_basic_map_alloc_space(dim, 0, 1, 1);
-	k = isl_basic_map_alloc_equality(bmap);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(bmap->eq[k], 1 + isl_basic_map_total_dim(bmap));
-	isl_int_set_si(bmap->eq[k][1 + param], -1);
-	isl_int_set_si(bmap->eq[k][1 + nparam + d - 1], -1);
-	isl_int_set_si(bmap->eq[k][1 + nparam + d + d - 1], 1);
-
-	k = isl_basic_map_alloc_inequality(bmap);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(bmap->ineq[k], 1 + isl_basic_map_total_dim(bmap));
-	isl_int_set_si(bmap->ineq[k][1 + param], 1);
-	isl_int_set_si(bmap->ineq[k][0], -1);
-
-	bmap = isl_basic_map_finalize(bmap);
-	return isl_map_from_basic_map(bmap);
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Check whether "path" is acyclic, where the last coordinates of domain
- * and range of path encode the number of steps taken.
- * That is, check whether
- *
- *	{ d | d = y - x and (x,y) in path }
- *
- * does not contain any element with positive last coordinate (positive length)
- * and zero remaining coordinates (cycle).
- */
-static int is_acyclic(__isl_take isl_map *path)
-{
-	int i;
-	int acyclic;
-	unsigned dim;
-	struct isl_set *delta;
-
-	delta = isl_map_deltas(path);
-	dim = isl_set_dim(delta, isl_dim_set);
-	for (i = 0; i < dim; ++i) {
-		if (i == dim -1)
-			delta = isl_set_lower_bound_si(delta, isl_dim_set, i, 1);
-		else
-			delta = isl_set_fix_si(delta, isl_dim_set, i, 0);
-	}
-
-	acyclic = isl_set_is_empty(delta);
-	isl_set_free(delta);
-
-	return acyclic;
-}
-
-/* Given a union of basic maps R = \cup_i R_i \subseteq D \times D
- * and a dimension specification (Z^{n+1} -> Z^{n+1}),
- * construct a map that is an overapproximation of the map
- * that takes an element from the space D \times Z to another
- * element from the same space, such that the first n coordinates of the
- * difference between them is a sum of differences between images
- * and pre-images in one of the R_i and such that the last coordinate
- * is equal to the number of steps taken.
- * That is, let
- *
- *	\Delta_i = { y - x | (x, y) in R_i }
- *
- * then the constructed map is an overapproximation of
- *
- *	{ (x) -> (x + d) | \exists k_i >= 0, \delta_i \in \Delta_i :
- *				d = (\sum_i k_i \delta_i, \sum_i k_i) }
- *
- * The elements of the singleton \Delta_i's are collected as the
- * rows of the steps matrix.  For all these \Delta_i's together,
- * a single path is constructed.
- * For each of the other \Delta_i's, we compute an overapproximation
- * of the paths along elements of \Delta_i.
- * Since each of these paths performs an addition, composition is
- * symmetric and we can simply compose all resulting paths in any order.
- */
-static __isl_give isl_map *construct_extended_path(__isl_take isl_space *dim,
-	__isl_keep isl_map *map, int *project)
-{
-	struct isl_mat *steps = NULL;
-	struct isl_map *path = NULL;
-	unsigned d;
-	int i, j, n;
-
-	d = isl_map_dim(map, isl_dim_in);
-
-	path = isl_map_identity(isl_space_copy(dim));
-
-	steps = isl_mat_alloc(map->ctx, map->n, d);
-	if (!steps)
-		goto error;
-
-	n = 0;
-	for (i = 0; i < map->n; ++i) {
-		struct isl_basic_set *delta;
-
-		delta = isl_basic_map_deltas(isl_basic_map_copy(map->p[i]));
-
-		for (j = 0; j < d; ++j) {
-			int fixed;
-
-			fixed = isl_basic_set_plain_dim_is_fixed(delta, j,
-							    &steps->row[n][j]);
-			if (fixed < 0) {
-				isl_basic_set_free(delta);
-				goto error;
-			}
-			if (!fixed)
-				break;
-		}
-
-
-		if (j < d) {
-			path = isl_map_apply_range(path,
-				path_along_delta(isl_space_copy(dim), delta));
-			path = isl_map_coalesce(path);
-		} else {
-			isl_basic_set_free(delta);
-			++n;
-		}
-	}
-
-	if (n > 0) {
-		steps->n_row = n;
-		path = isl_map_apply_range(path,
-				path_along_steps(isl_space_copy(dim), steps));
-	}
-
-	if (project && *project) {
-		*project = is_acyclic(isl_map_copy(path));
-		if (*project < 0)
-			goto error;
-	}
-
-	isl_space_free(dim);
-	isl_mat_free(steps);
-	return path;
-error:
-	isl_space_free(dim);
-	isl_mat_free(steps);
-	isl_map_free(path);
-	return NULL;
-}
-
-static int isl_set_overlaps(__isl_keep isl_set *set1, __isl_keep isl_set *set2)
-{
-	isl_set *i;
-	int no_overlap;
-
-	if (!isl_space_tuple_match(set1->dim, isl_dim_set, set2->dim, isl_dim_set))
-		return 0;
-
-	i = isl_set_intersect(isl_set_copy(set1), isl_set_copy(set2));
-	no_overlap = isl_set_is_empty(i);
-	isl_set_free(i);
-
-	return no_overlap < 0 ? -1 : !no_overlap;
-}
-
-/* Given a union of basic maps R = \cup_i R_i \subseteq D \times D
- * and a dimension specification (Z^{n+1} -> Z^{n+1}),
- * construct a map that is an overapproximation of the map
- * that takes an element from the dom R \times Z to an
- * element from ran R \times Z, such that the first n coordinates of the
- * difference between them is a sum of differences between images
- * and pre-images in one of the R_i and such that the last coordinate
- * is equal to the number of steps taken.
- * That is, let
- *
- *	\Delta_i = { y - x | (x, y) in R_i }
- *
- * then the constructed map is an overapproximation of
- *
- *	{ (x) -> (x + d) | \exists k_i >= 0, \delta_i \in \Delta_i :
- *				d = (\sum_i k_i \delta_i, \sum_i k_i) and
- *				x in dom R and x + d in ran R and
- *				\sum_i k_i >= 1 }
- */
-static __isl_give isl_map *construct_component(__isl_take isl_space *dim,
-	__isl_keep isl_map *map, int *exact, int project)
-{
-	struct isl_set *domain = NULL;
-	struct isl_set *range = NULL;
-	struct isl_map *app = NULL;
-	struct isl_map *path = NULL;
-
-	domain = isl_map_domain(isl_map_copy(map));
-	domain = isl_set_coalesce(domain);
-	range = isl_map_range(isl_map_copy(map));
-	range = isl_set_coalesce(range);
-	if (!isl_set_overlaps(domain, range)) {
-		isl_set_free(domain);
-		isl_set_free(range);
-		isl_space_free(dim);
-
-		map = isl_map_copy(map);
-		map = isl_map_add_dims(map, isl_dim_in, 1);
-		map = isl_map_add_dims(map, isl_dim_out, 1);
-		map = set_path_length(map, 1, 1);
-		return map;
-	}
-	app = isl_map_from_domain_and_range(domain, range);
-	app = isl_map_add_dims(app, isl_dim_in, 1);
-	app = isl_map_add_dims(app, isl_dim_out, 1);
-
-	path = construct_extended_path(isl_space_copy(dim), map,
-					exact && *exact ? &project : NULL);
-	app = isl_map_intersect(app, path);
-
-	if (exact && *exact &&
-	    (*exact = check_exactness(isl_map_copy(map), isl_map_copy(app),
-				      project)) < 0)
-		goto error;
-
-	isl_space_free(dim);
-	app = set_path_length(app, 0, 1);
-	return app;
-error:
-	isl_space_free(dim);
-	isl_map_free(app);
-	return NULL;
-}
-
-/* Call construct_component and, if "project" is set, project out
- * the final coordinates.
- */
-static __isl_give isl_map *construct_projected_component(
-	__isl_take isl_space *dim,
-	__isl_keep isl_map *map, int *exact, int project)
-{
-	isl_map *app;
-	unsigned d;
-
-	if (!dim)
-		return NULL;
-	d = isl_space_dim(dim, isl_dim_in);
-
-	app = construct_component(dim, map, exact, project);
-	if (project) {
-		app = isl_map_project_out(app, isl_dim_in, d - 1, 1);
-		app = isl_map_project_out(app, isl_dim_out, d - 1, 1);
-	}
-	return app;
-}
-
-/* Compute an extended version, i.e., with path lengths, of
- * an overapproximation of the transitive closure of "bmap"
- * with path lengths greater than or equal to zero and with
- * domain and range equal to "dom".
- */
-static __isl_give isl_map *q_closure(__isl_take isl_space *dim,
-	__isl_take isl_set *dom, __isl_keep isl_basic_map *bmap, int *exact)
-{
-	int project = 1;
-	isl_map *path;
-	isl_map *map;
-	isl_map *app;
-
-	dom = isl_set_add_dims(dom, isl_dim_set, 1);
-	app = isl_map_from_domain_and_range(dom, isl_set_copy(dom));
-	map = isl_map_from_basic_map(isl_basic_map_copy(bmap));
-	path = construct_extended_path(dim, map, &project);
-	app = isl_map_intersect(app, path);
-
-	if ((*exact = check_exactness(map, isl_map_copy(app), project)) < 0)
-		goto error;
-
-	return app;
-error:
-	isl_map_free(app);
-	return NULL;
-}
-
-/* Check whether qc has any elements of length at least one
- * with domain and/or range outside of dom and ran.
- */
-static int has_spurious_elements(__isl_keep isl_map *qc,
-	__isl_keep isl_set *dom, __isl_keep isl_set *ran)
-{
-	isl_set *s;
-	int subset;
-	unsigned d;
-
-	if (!qc || !dom || !ran)
-		return -1;
-
-	d = isl_map_dim(qc, isl_dim_in);
-
-	qc = isl_map_copy(qc);
-	qc = set_path_length(qc, 0, 1);
-	qc = isl_map_project_out(qc, isl_dim_in, d - 1, 1);
-	qc = isl_map_project_out(qc, isl_dim_out, d - 1, 1);
-
-	s = isl_map_domain(isl_map_copy(qc));
-	subset = isl_set_is_subset(s, dom);
-	isl_set_free(s);
-	if (subset < 0)
-		goto error;
-	if (!subset) {
-		isl_map_free(qc);
-		return 1;
-	}
-
-	s = isl_map_range(qc);
-	subset = isl_set_is_subset(s, ran);
-	isl_set_free(s);
-
-	return subset < 0 ? -1 : !subset;
-error:
-	isl_map_free(qc);
-	return -1;
-}
-
-#define LEFT	2
-#define RIGHT	1
-
-/* For each basic map in "map", except i, check whether it combines
- * with the transitive closure that is reflexive on C combines
- * to the left and to the right.
- *
- * In particular, if
- *
- *	dom map_j \subseteq C
- *
- * then right[j] is set to 1.  Otherwise, if
- *
- *	ran map_i \cap dom map_j = \emptyset
- *
- * then right[j] is set to 0.  Otherwise, composing to the right
- * is impossible.
- *
- * Similar, for composing to the left, we have if
- *
- *	ran map_j \subseteq C
- *
- * then left[j] is set to 1.  Otherwise, if
- *
- *	dom map_i \cap ran map_j = \emptyset
- *
- * then left[j] is set to 0.  Otherwise, composing to the left
- * is impossible.
- *
- * The return value is or'd with LEFT if composing to the left
- * is possible and with RIGHT if composing to the right is possible.
- */
-static int composability(__isl_keep isl_set *C, int i,
-	isl_set **dom, isl_set **ran, int *left, int *right,
-	__isl_keep isl_map *map)
-{
-	int j;
-	int ok;
-
-	ok = LEFT | RIGHT;
-	for (j = 0; j < map->n && ok; ++j) {
-		int overlaps, subset;
-		if (j == i)
-			continue;
-
-		if (ok & RIGHT) {
-			if (!dom[j])
-				dom[j] = isl_set_from_basic_set(
-					isl_basic_map_domain(
-						isl_basic_map_copy(map->p[j])));
-			if (!dom[j])
-				return -1;
-			overlaps = isl_set_overlaps(ran[i], dom[j]);
-			if (overlaps < 0)
-				return -1;
-			if (!overlaps)
-				right[j] = 0;
-			else {
-				subset = isl_set_is_subset(dom[j], C);
-				if (subset < 0)
-					return -1;
-				if (subset)
-					right[j] = 1;
-				else
-					ok &= ~RIGHT;
-			}
-		}
-
-		if (ok & LEFT) {
-			if (!ran[j])
-				ran[j] = isl_set_from_basic_set(
-					isl_basic_map_range(
-						isl_basic_map_copy(map->p[j])));
-			if (!ran[j])
-				return -1;
-			overlaps = isl_set_overlaps(dom[i], ran[j]);
-			if (overlaps < 0)
-				return -1;
-			if (!overlaps)
-				left[j] = 0;
-			else {
-				subset = isl_set_is_subset(ran[j], C);
-				if (subset < 0)
-					return -1;
-				if (subset)
-					left[j] = 1;
-				else
-					ok &= ~LEFT;
-			}
-		}
-	}
-
-	return ok;
-}
-
-static __isl_give isl_map *anonymize(__isl_take isl_map *map)
-{
-	map = isl_map_reset(map, isl_dim_in);
-	map = isl_map_reset(map, isl_dim_out);
-	return map;
-}
-
-/* Return a map that is a union of the basic maps in "map", except i,
- * composed to left and right with qc based on the entries of "left"
- * and "right".
- */
-static __isl_give isl_map *compose(__isl_keep isl_map *map, int i,
-	__isl_take isl_map *qc, int *left, int *right)
-{
-	int j;
-	isl_map *comp;
-
-	comp = isl_map_empty(isl_map_get_space(map));
-	for (j = 0; j < map->n; ++j) {
-		isl_map *map_j;
-
-		if (j == i)
-			continue;
-
-		map_j = isl_map_from_basic_map(isl_basic_map_copy(map->p[j]));
-		map_j = anonymize(map_j);
-		if (left && left[j])
-			map_j = isl_map_apply_range(map_j, isl_map_copy(qc));
-		if (right && right[j])
-			map_j = isl_map_apply_range(isl_map_copy(qc), map_j);
-		comp = isl_map_union(comp, map_j);
-	}
-
-	comp = isl_map_compute_divs(comp);
-	comp = isl_map_coalesce(comp);
-
-	isl_map_free(qc);
-
-	return comp;
-}
-
-/* Compute the transitive closure of "map" incrementally by
- * computing
- *
- *	map_i^+ \cup qc^+
- *
- * or
- *
- *	map_i^+ \cup ((id \cup map_i^) \circ qc^+)
- *
- * or
- *
- *	map_i^+ \cup (qc^+ \circ (id \cup map_i^))
- *
- * depending on whether left or right are NULL.
- */
-static __isl_give isl_map *compute_incremental(
-	__isl_take isl_space *dim, __isl_keep isl_map *map,
-	int i, __isl_take isl_map *qc, int *left, int *right, int *exact)
-{
-	isl_map *map_i;
-	isl_map *tc;
-	isl_map *rtc = NULL;
-
-	if (!map)
-		goto error;
-	isl_assert(map->ctx, left || right, goto error);
-
-	map_i = isl_map_from_basic_map(isl_basic_map_copy(map->p[i]));
-	tc = construct_projected_component(isl_space_copy(dim), map_i,
-						exact, 1);
-	isl_map_free(map_i);
-
-	if (*exact)
-		qc = isl_map_transitive_closure(qc, exact);
-
-	if (!*exact) {
-		isl_space_free(dim);
-		isl_map_free(tc);
-		isl_map_free(qc);
-		return isl_map_universe(isl_map_get_space(map));
-	}
-
-	if (!left || !right)
-		rtc = isl_map_union(isl_map_copy(tc),
-				    isl_map_identity(isl_map_get_space(tc)));
-	if (!right)
-		qc = isl_map_apply_range(rtc, qc);
-	if (!left)
-		qc = isl_map_apply_range(qc, rtc);
-	qc = isl_map_union(tc, qc);
-
-	isl_space_free(dim);
-
-	return qc;
-error:
-	isl_space_free(dim);
-	isl_map_free(qc);
-	return NULL;
-}
-
-/* Given a map "map", try to find a basic map such that
- * map^+ can be computed as
- *
- * map^+ = map_i^+ \cup
- *    \bigcup_j ((map_i^+ \cup Id_C)^+ \circ map_j \circ (map_i^+ \cup Id_C))^+
- *
- * with C the simple hull of the domain and range of the input map.
- * map_i^ \cup Id_C is computed by allowing the path lengths to be zero
- * and by intersecting domain and range with C.
- * Of course, we need to check that this is actually equal to map_i^ \cup Id_C.
- * Also, we only use the incremental computation if all the transitive
- * closures are exact and if the number of basic maps in the union,
- * after computing the integer divisions, is smaller than the number
- * of basic maps in the input map.
- */
-static int incemental_on_entire_domain(__isl_keep isl_space *dim,
-	__isl_keep isl_map *map,
-	isl_set **dom, isl_set **ran, int *left, int *right,
-	__isl_give isl_map **res)
-{
-	int i;
-	isl_set *C;
-	unsigned d;
-
-	*res = NULL;
-
-	C = isl_set_union(isl_map_domain(isl_map_copy(map)),
-			  isl_map_range(isl_map_copy(map)));
-	C = isl_set_from_basic_set(isl_set_simple_hull(C));
-	if (!C)
-		return -1;
-	if (C->n != 1) {
-		isl_set_free(C);
-		return 0;
-	}
-
-	d = isl_map_dim(map, isl_dim_in);
-
-	for (i = 0; i < map->n; ++i) {
-		isl_map *qc;
-		int exact_i, spurious;
-		int j;
-		dom[i] = isl_set_from_basic_set(isl_basic_map_domain(
-					isl_basic_map_copy(map->p[i])));
-		ran[i] = isl_set_from_basic_set(isl_basic_map_range(
-					isl_basic_map_copy(map->p[i])));
-		qc = q_closure(isl_space_copy(dim), isl_set_copy(C),
-				map->p[i], &exact_i);
-		if (!qc)
-			goto error;
-		if (!exact_i) {
-			isl_map_free(qc);
-			continue;
-		}
-		spurious = has_spurious_elements(qc, dom[i], ran[i]);
-		if (spurious) {
-			isl_map_free(qc);
-			if (spurious < 0)
-				goto error;
-			continue;
-		}
-		qc = isl_map_project_out(qc, isl_dim_in, d, 1);
-		qc = isl_map_project_out(qc, isl_dim_out, d, 1);
-		qc = isl_map_compute_divs(qc);
-		for (j = 0; j < map->n; ++j)
-			left[j] = right[j] = 1;
-		qc = compose(map, i, qc, left, right);
-		if (!qc)
-			goto error;
-		if (qc->n >= map->n) {
-			isl_map_free(qc);
-			continue;
-		}
-		*res = compute_incremental(isl_space_copy(dim), map, i, qc,
-				left, right, &exact_i);
-		if (!*res)
-			goto error;
-		if (exact_i)
-			break;
-		isl_map_free(*res);
-		*res = NULL;
-	}
-
-	isl_set_free(C);
-
-	return *res != NULL;
-error:
-	isl_set_free(C);
-	return -1;
-}
-
-/* Try and compute the transitive closure of "map" as
- *
- * map^+ = map_i^+ \cup
- *    \bigcup_j ((map_i^+ \cup Id_C)^+ \circ map_j \circ (map_i^+ \cup Id_C))^+
- *
- * with C either the simple hull of the domain and range of the entire
- * map or the simple hull of domain and range of map_i.
- */
-static __isl_give isl_map *incremental_closure(__isl_take isl_space *dim,
-	__isl_keep isl_map *map, int *exact, int project)
-{
-	int i;
-	isl_set **dom = NULL;
-	isl_set **ran = NULL;
-	int *left = NULL;
-	int *right = NULL;
-	isl_set *C;
-	unsigned d;
-	isl_map *res = NULL;
-
-	if (!project)
-		return construct_projected_component(dim, map, exact, project);
-
-	if (!map)
-		goto error;
-	if (map->n <= 1)
-		return construct_projected_component(dim, map, exact, project);
-
-	d = isl_map_dim(map, isl_dim_in);
-
-	dom = isl_calloc_array(map->ctx, isl_set *, map->n);
-	ran = isl_calloc_array(map->ctx, isl_set *, map->n);
-	left = isl_calloc_array(map->ctx, int, map->n);
-	right = isl_calloc_array(map->ctx, int, map->n);
-	if (!ran || !dom || !left || !right)
-		goto error;
-
-	if (incemental_on_entire_domain(dim, map, dom, ran, left, right, &res) < 0)
-		goto error;
-
-	for (i = 0; !res && i < map->n; ++i) {
-		isl_map *qc;
-		int exact_i, spurious, comp;
-		if (!dom[i])
-			dom[i] = isl_set_from_basic_set(
-					isl_basic_map_domain(
-						isl_basic_map_copy(map->p[i])));
-		if (!dom[i])
-			goto error;
-		if (!ran[i])
-			ran[i] = isl_set_from_basic_set(
-					isl_basic_map_range(
-						isl_basic_map_copy(map->p[i])));
-		if (!ran[i])
-			goto error;
-		C = isl_set_union(isl_set_copy(dom[i]),
-				      isl_set_copy(ran[i]));
-		C = isl_set_from_basic_set(isl_set_simple_hull(C));
-		if (!C)
-			goto error;
-		if (C->n != 1) {
-			isl_set_free(C);
-			continue;
-		}
-		comp = composability(C, i, dom, ran, left, right, map);
-		if (!comp || comp < 0) {
-			isl_set_free(C);
-			if (comp < 0)
-				goto error;
-			continue;
-		}
-		qc = q_closure(isl_space_copy(dim), C, map->p[i], &exact_i);
-		if (!qc)
-			goto error;
-		if (!exact_i) {
-			isl_map_free(qc);
-			continue;
-		}
-		spurious = has_spurious_elements(qc, dom[i], ran[i]);
-		if (spurious) {
-			isl_map_free(qc);
-			if (spurious < 0)
-				goto error;
-			continue;
-		}
-		qc = isl_map_project_out(qc, isl_dim_in, d, 1);
-		qc = isl_map_project_out(qc, isl_dim_out, d, 1);
-		qc = isl_map_compute_divs(qc);
-		qc = compose(map, i, qc, (comp & LEFT) ? left : NULL,
-				(comp & RIGHT) ? right : NULL);
-		if (!qc)
-			goto error;
-		if (qc->n >= map->n) {
-			isl_map_free(qc);
-			continue;
-		}
-		res = compute_incremental(isl_space_copy(dim), map, i, qc,
-				(comp & LEFT) ? left : NULL,
-				(comp & RIGHT) ? right : NULL, &exact_i);
-		if (!res)
-			goto error;
-		if (exact_i)
-			break;
-		isl_map_free(res);
-		res = NULL;
-	}
-
-	for (i = 0; i < map->n; ++i) {
-		isl_set_free(dom[i]);
-		isl_set_free(ran[i]);
-	}
-	free(dom);
-	free(ran);
-	free(left);
-	free(right);
-
-	if (res) {
-		isl_space_free(dim);
-		return res;
-	}
-
-	return construct_projected_component(dim, map, exact, project);
-error:
-	if (dom)
-		for (i = 0; i < map->n; ++i)
-			isl_set_free(dom[i]);
-	free(dom);
-	if (ran)
-		for (i = 0; i < map->n; ++i)
-			isl_set_free(ran[i]);
-	free(ran);
-	free(left);
-	free(right);
-	isl_space_free(dim);
-	return NULL;
-}
-
-/* Given an array of sets "set", add "dom" at position "pos"
- * and search for elements at earlier positions that overlap with "dom".
- * If any can be found, then merge all of them, together with "dom", into
- * a single set and assign the union to the first in the array,
- * which becomes the new group leader for all groups involved in the merge.
- * During the search, we only consider group leaders, i.e., those with
- * group[i] = i, as the other sets have already been combined
- * with one of the group leaders.
- */
-static int merge(isl_set **set, int *group, __isl_take isl_set *dom, int pos)
-{
-	int i;
-
-	group[pos] = pos;
-	set[pos] = isl_set_copy(dom);
-
-	for (i = pos - 1; i >= 0; --i) {
-		int o;
-
-		if (group[i] != i)
-			continue;
-
-		o = isl_set_overlaps(set[i], dom);
-		if (o < 0)
-			goto error;
-		if (!o)
-			continue;
-
-		set[i] = isl_set_union(set[i], set[group[pos]]);
-		set[group[pos]] = NULL;
-		if (!set[i])
-			goto error;
-		group[group[pos]] = i;
-		group[pos] = i;
-	}
-
-	isl_set_free(dom);
-	return 0;
-error:
-	isl_set_free(dom);
-	return -1;
-}
-
-/* Replace each entry in the n by n grid of maps by the cross product
- * with the relation { [i] -> [i + 1] }.
- */
-static int add_length(__isl_keep isl_map *map, isl_map ***grid, int n)
-{
-	int i, j, k;
-	isl_space *dim;
-	isl_basic_map *bstep;
-	isl_map *step;
-	unsigned nparam;
-
-	if (!map)
-		return -1;
-
-	dim = isl_map_get_space(map);
-	nparam = isl_space_dim(dim, isl_dim_param);
-	dim = isl_space_drop_dims(dim, isl_dim_in, 0, isl_space_dim(dim, isl_dim_in));
-	dim = isl_space_drop_dims(dim, isl_dim_out, 0, isl_space_dim(dim, isl_dim_out));
-	dim = isl_space_add_dims(dim, isl_dim_in, 1);
-	dim = isl_space_add_dims(dim, isl_dim_out, 1);
-	bstep = isl_basic_map_alloc_space(dim, 0, 1, 0);
-	k = isl_basic_map_alloc_equality(bstep);
-	if (k < 0) {
-		isl_basic_map_free(bstep);
-		return -1;
-	}
-	isl_seq_clr(bstep->eq[k], 1 + isl_basic_map_total_dim(bstep));
-	isl_int_set_si(bstep->eq[k][0], 1);
-	isl_int_set_si(bstep->eq[k][1 + nparam], 1);
-	isl_int_set_si(bstep->eq[k][1 + nparam + 1], -1);
-	bstep = isl_basic_map_finalize(bstep);
-	step = isl_map_from_basic_map(bstep);
-
-	for (i = 0; i < n; ++i)
-		for (j = 0; j < n; ++j)
-			grid[i][j] = isl_map_product(grid[i][j],
-						     isl_map_copy(step));
-
-	isl_map_free(step);
-
-	return 0;
-}
-
-/* The core of the Floyd-Warshall algorithm.
- * Updates the given n x x matrix of relations in place.
- *
- * The algorithm iterates over all vertices.  In each step, the whole
- * matrix is updated to include all paths that go to the current vertex,
- * possibly stay there a while (including passing through earlier vertices)
- * and then come back.  At the start of each iteration, the diagonal
- * element corresponding to the current vertex is replaced by its
- * transitive closure to account for all indirect paths that stay
- * in the current vertex.
- */
-static void floyd_warshall_iterate(isl_map ***grid, int n, int *exact)
-{
-	int r, p, q;
-
-	for (r = 0; r < n; ++r) {
-		int r_exact;
-		grid[r][r] = isl_map_transitive_closure(grid[r][r],
-				(exact && *exact) ? &r_exact : NULL);
-		if (exact && *exact && !r_exact)
-			*exact = 0;
-
-		for (p = 0; p < n; ++p)
-			for (q = 0; q < n; ++q) {
-				isl_map *loop;
-				if (p == r && q == r)
-					continue;
-				loop = isl_map_apply_range(
-						isl_map_copy(grid[p][r]),
-						isl_map_copy(grid[r][q]));
-				grid[p][q] = isl_map_union(grid[p][q], loop);
-				loop = isl_map_apply_range(
-						isl_map_copy(grid[p][r]),
-					isl_map_apply_range(
-						isl_map_copy(grid[r][r]),
-						isl_map_copy(grid[r][q])));
-				grid[p][q] = isl_map_union(grid[p][q], loop);
-				grid[p][q] = isl_map_coalesce(grid[p][q]);
-			}
-	}
-}
-
-/* Given a partition of the domains and ranges of the basic maps in "map",
- * apply the Floyd-Warshall algorithm with the elements in the partition
- * as vertices.
- *
- * In particular, there are "n" elements in the partition and "group" is
- * an array of length 2 * map->n with entries in [0,n-1].
- *
- * We first construct a matrix of relations based on the partition information,
- * apply Floyd-Warshall on this matrix of relations and then take the
- * union of all entries in the matrix as the final result.
- *
- * If we are actually computing the power instead of the transitive closure,
- * i.e., when "project" is not set, then the result should have the
- * path lengths encoded as the difference between an extra pair of
- * coordinates.  We therefore apply the nested transitive closures
- * to relations that include these lengths.  In particular, we replace
- * the input relation by the cross product with the unit length relation
- * { [i] -> [i + 1] }.
- */
-static __isl_give isl_map *floyd_warshall_with_groups(__isl_take isl_space *dim,
-	__isl_keep isl_map *map, int *exact, int project, int *group, int n)
-{
-	int i, j, k;
-	isl_map ***grid = NULL;
-	isl_map *app;
-
-	if (!map)
-		goto error;
-
-	if (n == 1) {
-		free(group);
-		return incremental_closure(dim, map, exact, project);
-	}
-
-	grid = isl_calloc_array(map->ctx, isl_map **, n);
-	if (!grid)
-		goto error;
-	for (i = 0; i < n; ++i) {
-		grid[i] = isl_calloc_array(map->ctx, isl_map *, n);
-		if (!grid[i])
-			goto error;
-		for (j = 0; j < n; ++j)
-			grid[i][j] = isl_map_empty(isl_map_get_space(map));
-	}
-
-	for (k = 0; k < map->n; ++k) {
-		i = group[2 * k];
-		j = group[2 * k + 1];
-		grid[i][j] = isl_map_union(grid[i][j],
-				isl_map_from_basic_map(
-					isl_basic_map_copy(map->p[k])));
-	}
-
-	if (!project && add_length(map, grid, n) < 0)
-		goto error;
-
-	floyd_warshall_iterate(grid, n, exact);
-
-	app = isl_map_empty(isl_map_get_space(map));
-
-	for (i = 0; i < n; ++i) {
-		for (j = 0; j < n; ++j)
-			app = isl_map_union(app, grid[i][j]);
-		free(grid[i]);
-	}
-	free(grid);
-
-	free(group);
-	isl_space_free(dim);
-
-	return app;
-error:
-	if (grid)
-		for (i = 0; i < n; ++i) {
-			if (!grid[i])
-				continue;
-			for (j = 0; j < n; ++j)
-				isl_map_free(grid[i][j]);
-			free(grid[i]);
-		}
-	free(grid);
-	free(group);
-	isl_space_free(dim);
-	return NULL;
-}
-
-/* Partition the domains and ranges of the n basic relations in list
- * into disjoint cells.
- *
- * To find the partition, we simply consider all of the domains
- * and ranges in turn and combine those that overlap.
- * "set" contains the partition elements and "group" indicates
- * to which partition element a given domain or range belongs.
- * The domain of basic map i corresponds to element 2 * i in these arrays,
- * while the domain corresponds to element 2 * i + 1.
- * During the construction group[k] is either equal to k,
- * in which case set[k] contains the union of all the domains and
- * ranges in the corresponding group, or is equal to some l < k,
- * with l another domain or range in the same group.
- */
-static int *setup_groups(isl_ctx *ctx, __isl_keep isl_basic_map **list, int n,
-	isl_set ***set, int *n_group)
-{
-	int i;
-	int *group = NULL;
-	int g;
-
-	*set = isl_calloc_array(ctx, isl_set *, 2 * n);
-	group = isl_alloc_array(ctx, int, 2 * n);
-
-	if (!*set || !group)
-		goto error;
-
-	for (i = 0; i < n; ++i) {
-		isl_set *dom;
-		dom = isl_set_from_basic_set(isl_basic_map_domain(
-				isl_basic_map_copy(list[i])));
-		if (merge(*set, group, dom, 2 * i) < 0)
-			goto error;
-		dom = isl_set_from_basic_set(isl_basic_map_range(
-				isl_basic_map_copy(list[i])));
-		if (merge(*set, group, dom, 2 * i + 1) < 0)
-			goto error;
-	}
-
-	g = 0;
-	for (i = 0; i < 2 * n; ++i)
-		if (group[i] == i) {
-			if (g != i) {
-				(*set)[g] = (*set)[i];
-				(*set)[i] = NULL;
-			}
-			group[i] = g++;
-		} else
-			group[i] = group[group[i]];
-
-	*n_group = g;
-
-	return group;
-error:
-	if (*set) {
-		for (i = 0; i < 2 * n; ++i)
-			isl_set_free((*set)[i]);
-		free(*set);
-		*set = NULL;
-	}
-	free(group);
-	return NULL;
-}
-
-/* Check if the domains and ranges of the basic maps in "map" can
- * be partitioned, and if so, apply Floyd-Warshall on the elements
- * of the partition.  Note that we also apply this algorithm
- * if we want to compute the power, i.e., when "project" is not set.
- * However, the results are unlikely to be exact since the recursive
- * calls inside the Floyd-Warshall algorithm typically result in
- * non-linear path lengths quite quickly.
- */
-static __isl_give isl_map *floyd_warshall(__isl_take isl_space *dim,
-	__isl_keep isl_map *map, int *exact, int project)
-{
-	int i;
-	isl_set **set = NULL;
-	int *group = NULL;
-	int n;
-
-	if (!map)
-		goto error;
-	if (map->n <= 1)
-		return incremental_closure(dim, map, exact, project);
-
-	group = setup_groups(map->ctx, map->p, map->n, &set, &n);
-	if (!group)
-		goto error;
-
-	for (i = 0; i < 2 * map->n; ++i)
-		isl_set_free(set[i]);
-
-	free(set);
-
-	return floyd_warshall_with_groups(dim, map, exact, project, group, n);
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-/* Structure for representing the nodes in the graph being traversed
- * using Tarjan's algorithm.
- * index represents the order in which nodes are visited.
- * min_index is the index of the root of a (sub)component.
- * on_stack indicates whether the node is currently on the stack.
- */
-struct basic_map_sort_node {
-	int index;
-	int min_index;
-	int on_stack;
-};
-/* Structure for representing the graph being traversed
- * using Tarjan's algorithm.
- * len is the number of nodes
- * node is an array of nodes
- * stack contains the nodes on the path from the root to the current node
- * sp is the stack pointer
- * index is the index of the last node visited
- * order contains the elements of the components separated by -1
- * op represents the current position in order
- *
- * check_closed is set if we may have used the fact that
- * a pair of basic maps can be interchanged
- */
-struct basic_map_sort {
-	int len;
-	struct basic_map_sort_node *node;
-	int *stack;
-	int sp;
-	int index;
-	int *order;
-	int op;
-	int check_closed;
-};
-
-static void basic_map_sort_free(struct basic_map_sort *s)
-{
-	if (!s)
-		return;
-	free(s->node);
-	free(s->stack);
-	free(s->order);
-	free(s);
-}
-
-static struct basic_map_sort *basic_map_sort_alloc(struct isl_ctx *ctx, int len)
-{
-	struct basic_map_sort *s;
-	int i;
-
-	s = isl_calloc_type(ctx, struct basic_map_sort);
-	if (!s)
-		return NULL;
-	s->len = len;
-	s->node = isl_alloc_array(ctx, struct basic_map_sort_node, len);
-	if (!s->node)
-		goto error;
-	for (i = 0; i < len; ++i)
-		s->node[i].index = -1;
-	s->stack = isl_alloc_array(ctx, int, len);
-	if (!s->stack)
-		goto error;
-	s->order = isl_alloc_array(ctx, int, 2 * len);
-	if (!s->order)
-		goto error;
-
-	s->sp = 0;
-	s->index = 0;
-	s->op = 0;
-
-	s->check_closed = 0;
-
-	return s;
-error:
-	basic_map_sort_free(s);
-	return NULL;
-}
-
-/* Check whether in the computation of the transitive closure
- * "bmap1" (R_1) should follow (or be part of the same component as)
- * "bmap2" (R_2).
- *
- * That is check whether
- *
- *	R_1 \circ R_2
- *
- * is a subset of
- *
- *	R_2 \circ R_1
- *
- * If so, then there is no reason for R_1 to immediately follow R_2
- * in any path.
- *
- * *check_closed is set if the subset relation holds while
- * R_1 \circ R_2 is not empty.
- */
-static int basic_map_follows(__isl_keep isl_basic_map *bmap1,
-	__isl_keep isl_basic_map *bmap2, int *check_closed)
-{
-	struct isl_map *map12 = NULL;
-	struct isl_map *map21 = NULL;
-	int subset;
-
-	if (!isl_space_tuple_match(bmap1->dim, isl_dim_in, bmap2->dim, isl_dim_out))
-		return 0;
-
-	map21 = isl_map_from_basic_map(
-			isl_basic_map_apply_range(
-				isl_basic_map_copy(bmap2),
-				isl_basic_map_copy(bmap1)));
-	subset = isl_map_is_empty(map21);
-	if (subset < 0)
-		goto error;
-	if (subset) {
-		isl_map_free(map21);
-		return 0;
-	}
-
-	if (!isl_space_tuple_match(bmap1->dim, isl_dim_in, bmap1->dim, isl_dim_out) ||
-	    !isl_space_tuple_match(bmap2->dim, isl_dim_in, bmap2->dim, isl_dim_out)) {
-		isl_map_free(map21);
-		return 1;
-	}
-
-	map12 = isl_map_from_basic_map(
-			isl_basic_map_apply_range(
-				isl_basic_map_copy(bmap1),
-				isl_basic_map_copy(bmap2)));
-
-	subset = isl_map_is_subset(map21, map12);
-
-	isl_map_free(map12);
-	isl_map_free(map21);
-
-	if (subset)
-		*check_closed = 1;
-
-	return subset < 0 ? -1 : !subset;
-error:
-	isl_map_free(map21);
-	return -1;
-}
-
-/* Perform Tarjan's algorithm for computing the strongly connected components
- * in the graph with the disjuncts of "map" as vertices and with an
- * edge between any pair of disjuncts such that the first has
- * to be applied after the second.
- */
-static int power_components_tarjan(struct basic_map_sort *s,
-	__isl_keep isl_basic_map **list, int i)
-{
-	int j;
-
-	s->node[i].index = s->index;
-	s->node[i].min_index = s->index;
-	s->node[i].on_stack = 1;
-	s->index++;
-	s->stack[s->sp++] = i;
-
-	for (j = s->len - 1; j >= 0; --j) {
-		int f;
-
-		if (j == i)
-			continue;
-		if (s->node[j].index >= 0 &&
-			(!s->node[j].on_stack ||
-			 s->node[j].index > s->node[i].min_index))
-			continue;
-
-		f = basic_map_follows(list[i], list[j], &s->check_closed);
-		if (f < 0)
-			return -1;
-		if (!f)
-			continue;
-
-		if (s->node[j].index < 0) {
-			power_components_tarjan(s, list, j);
-			if (s->node[j].min_index < s->node[i].min_index)
-				s->node[i].min_index = s->node[j].min_index;
-		} else if (s->node[j].index < s->node[i].min_index)
-			s->node[i].min_index = s->node[j].index;
-	}
-
-	if (s->node[i].index != s->node[i].min_index)
-		return 0;
-
-	do {
-		j = s->stack[--s->sp];
-		s->node[j].on_stack = 0;
-		s->order[s->op++] = j;
-	} while (j != i);
-	s->order[s->op++] = -1;
-
-	return 0;
-}
-
-/* Decompose the "len" basic relations in "list" into strongly connected
- * components.
- */
-static struct basic_map_sort *basic_map_sort_init(isl_ctx *ctx, int len,
-	__isl_keep isl_basic_map **list)
-{
-	int i;
-	struct basic_map_sort *s = NULL;
-
-	s = basic_map_sort_alloc(ctx, len);
-	if (!s)
-		return NULL;
-	for (i = len - 1; i >= 0; --i) {
-		if (s->node[i].index >= 0)
-			continue;
-		if (power_components_tarjan(s, list, i) < 0)
-			goto error;
-	}
-
-	return s;
-error:
-	basic_map_sort_free(s);
-	return NULL;
-}
-
-/* Given a union of basic maps R = \cup_i R_i \subseteq D \times D
- * and a dimension specification (Z^{n+1} -> Z^{n+1}),
- * construct a map that is an overapproximation of the map
- * that takes an element from the dom R \times Z to an
- * element from ran R \times Z, such that the first n coordinates of the
- * difference between them is a sum of differences between images
- * and pre-images in one of the R_i and such that the last coordinate
- * is equal to the number of steps taken.
- * If "project" is set, then these final coordinates are not included,
- * i.e., a relation of type Z^n -> Z^n is returned.
- * That is, let
- *
- *	\Delta_i = { y - x | (x, y) in R_i }
- *
- * then the constructed map is an overapproximation of
- *
- *	{ (x) -> (x + d) | \exists k_i >= 0, \delta_i \in \Delta_i :
- *				d = (\sum_i k_i \delta_i, \sum_i k_i) and
- *				x in dom R and x + d in ran R }
- *
- * or
- *
- *	{ (x) -> (x + d) | \exists k_i >= 0, \delta_i \in \Delta_i :
- *				d = (\sum_i k_i \delta_i) and
- *				x in dom R and x + d in ran R }
- *
- * if "project" is set.
- *
- * We first split the map into strongly connected components, perform
- * the above on each component and then join the results in the correct
- * order, at each join also taking in the union of both arguments
- * to allow for paths that do not go through one of the two arguments.
- */
-static __isl_give isl_map *construct_power_components(__isl_take isl_space *dim,
-	__isl_keep isl_map *map, int *exact, int project)
-{
-	int i, n, c;
-	struct isl_map *path = NULL;
-	struct basic_map_sort *s = NULL;
-	int *orig_exact;
-	int local_exact;
-
-	if (!map)
-		goto error;
-	if (map->n <= 1)
-		return floyd_warshall(dim, map, exact, project);
-
-	s = basic_map_sort_init(map->ctx, map->n, map->p);
-	if (!s)
-		goto error;
-
-	orig_exact = exact;
-	if (s->check_closed && !exact)
-		exact = &local_exact;
-
-	c = 0;
-	i = 0;
-	n = map->n;
-	if (project)
-		path = isl_map_empty(isl_map_get_space(map));
-	else
-		path = isl_map_empty(isl_space_copy(dim));
-	path = anonymize(path);
-	while (n) {
-		struct isl_map *comp;
-		isl_map *path_comp, *path_comb;
-		comp = isl_map_alloc_space(isl_map_get_space(map), n, 0);
-		while (s->order[i] != -1) {
-			comp = isl_map_add_basic_map(comp,
-				    isl_basic_map_copy(map->p[s->order[i]]));
-			--n;
-			++i;
-		}
-		path_comp = floyd_warshall(isl_space_copy(dim),
-						comp, exact, project);
-		path_comp = anonymize(path_comp);
-		path_comb = isl_map_apply_range(isl_map_copy(path),
-						isl_map_copy(path_comp));
-		path = isl_map_union(path, path_comp);
-		path = isl_map_union(path, path_comb);
-		isl_map_free(comp);
-		++i;
-		++c;
-	}
-
-	if (c > 1 && s->check_closed && !*exact) {
-		int closed;
-
-		closed = isl_map_is_transitively_closed(path);
-		if (closed < 0)
-			goto error;
-		if (!closed) {
-			basic_map_sort_free(s);
-			isl_map_free(path);
-			return floyd_warshall(dim, map, orig_exact, project);
-		}
-	}
-
-	basic_map_sort_free(s);
-	isl_space_free(dim);
-
-	return path;
-error:
-	basic_map_sort_free(s);
-	isl_space_free(dim);
-	isl_map_free(path);
-	return NULL;
-}
-
-/* Given a union of basic maps R = \cup_i R_i \subseteq D \times D,
- * construct a map that is an overapproximation of the map
- * that takes an element from the space D to another
- * element from the same space, such that the difference between
- * them is a strictly positive sum of differences between images
- * and pre-images in one of the R_i.
- * The number of differences in the sum is equated to parameter "param".
- * That is, let
- *
- *	\Delta_i = { y - x | (x, y) in R_i }
- *
- * then the constructed map is an overapproximation of
- *
- *	{ (x) -> (x + d) | \exists k_i >= 0, \delta_i \in \Delta_i :
- *				d = \sum_i k_i \delta_i and k = \sum_i k_i > 0 }
- * or
- *
- *	{ (x) -> (x + d) | \exists k_i >= 0, \delta_i \in \Delta_i :
- *				d = \sum_i k_i \delta_i and \sum_i k_i > 0 }
- *
- * if "project" is set.
- *
- * If "project" is not set, then
- * we construct an extended mapping with an extra coordinate
- * that indicates the number of steps taken.  In particular,
- * the difference in the last coordinate is equal to the number
- * of steps taken to move from a domain element to the corresponding
- * image element(s).
- */
-static __isl_give isl_map *construct_power(__isl_keep isl_map *map,
-	int *exact, int project)
-{
-	struct isl_map *app = NULL;
-	isl_space *dim = NULL;
-	unsigned d;
-
-	if (!map)
-		return NULL;
-
-	dim = isl_map_get_space(map);
-
-	d = isl_space_dim(dim, isl_dim_in);
-	dim = isl_space_add_dims(dim, isl_dim_in, 1);
-	dim = isl_space_add_dims(dim, isl_dim_out, 1);
-
-	app = construct_power_components(isl_space_copy(dim), map,
-					exact, project);
-
-	isl_space_free(dim);
-
-	return app;
-}
-
-/* Compute the positive powers of "map", or an overapproximation.
- * If the result is exact, then *exact is set to 1.
- *
- * If project is set, then we are actually interested in the transitive
- * closure, so we can use a more relaxed exactness check.
- * The lengths of the paths are also projected out instead of being
- * encoded as the difference between an extra pair of final coordinates.
- */
-static __isl_give isl_map *map_power(__isl_take isl_map *map,
-	int *exact, int project)
-{
-	struct isl_map *app = NULL;
-
-	if (exact)
-		*exact = 1;
-
-	if (!map)
-		return NULL;
-
-	isl_assert(map->ctx,
-		isl_map_dim(map, isl_dim_in) == isl_map_dim(map, isl_dim_out),
-		goto error);
-
-	app = construct_power(map, exact, project);
-
-	isl_map_free(map);
-	return app;
-error:
-	isl_map_free(map);
-	isl_map_free(app);
-	return NULL;
-}
-
-/* Compute the positive powers of "map", or an overapproximation.
- * The result maps the exponent to a nested copy of the corresponding power.
- * If the result is exact, then *exact is set to 1.
- * map_power constructs an extended relation with the path lengths
- * encoded as the difference between the final coordinates.
- * In the final step, this difference is equated to an extra parameter
- * and made positive.  The extra coordinates are subsequently projected out
- * and the parameter is turned into the domain of the result.
- */
-__isl_give isl_map *isl_map_power(__isl_take isl_map *map, int *exact)
-{
-	isl_space *target_dim;
-	isl_space *dim;
-	isl_map *diff;
-	unsigned d;
-	unsigned param;
-
-	if (!map)
-		return NULL;
-
-	d = isl_map_dim(map, isl_dim_in);
-	param = isl_map_dim(map, isl_dim_param);
-
-	map = isl_map_compute_divs(map);
-	map = isl_map_coalesce(map);
-
-	if (isl_map_plain_is_empty(map)) {
-		map = isl_map_from_range(isl_map_wrap(map));
-		map = isl_map_add_dims(map, isl_dim_in, 1);
-		map = isl_map_set_dim_name(map, isl_dim_in, 0, "k");
-		return map;
-	}
-
-	target_dim = isl_map_get_space(map);
-	target_dim = isl_space_from_range(isl_space_wrap(target_dim));
-	target_dim = isl_space_add_dims(target_dim, isl_dim_in, 1);
-	target_dim = isl_space_set_dim_name(target_dim, isl_dim_in, 0, "k");
-
-	map = map_power(map, exact, 0);
-
-	map = isl_map_add_dims(map, isl_dim_param, 1);
-	dim = isl_map_get_space(map);
-	diff = equate_parameter_to_length(dim, param);
-	map = isl_map_intersect(map, diff);
-	map = isl_map_project_out(map, isl_dim_in, d, 1);
-	map = isl_map_project_out(map, isl_dim_out, d, 1);
-	map = isl_map_from_range(isl_map_wrap(map));
-	map = isl_map_move_dims(map, isl_dim_in, 0, isl_dim_param, param, 1);
-
-	map = isl_map_reset_space(map, target_dim);
-
-	return map;
-}
-
-/* Compute a relation that maps each element in the range of the input
- * relation to the lengths of all paths composed of edges in the input
- * relation that end up in the given range element.
- * The result may be an overapproximation, in which case *exact is set to 0.
- * The resulting relation is very similar to the power relation.
- * The difference are that the domain has been projected out, the
- * range has become the domain and the exponent is the range instead
- * of a parameter.
- */
-__isl_give isl_map *isl_map_reaching_path_lengths(__isl_take isl_map *map,
-	int *exact)
-{
-	isl_space *dim;
-	isl_map *diff;
-	unsigned d;
-	unsigned param;
-
-	if (!map)
-		return NULL;
-
-	d = isl_map_dim(map, isl_dim_in);
-	param = isl_map_dim(map, isl_dim_param);
-
-	map = isl_map_compute_divs(map);
-	map = isl_map_coalesce(map);
-
-	if (isl_map_plain_is_empty(map)) {
-		if (exact)
-			*exact = 1;
-		map = isl_map_project_out(map, isl_dim_out, 0, d);
-		map = isl_map_add_dims(map, isl_dim_out, 1);
-		return map;
-	}
-
-	map = map_power(map, exact, 0);
-
-	map = isl_map_add_dims(map, isl_dim_param, 1);
-	dim = isl_map_get_space(map);
-	diff = equate_parameter_to_length(dim, param);
-	map = isl_map_intersect(map, diff);
-	map = isl_map_project_out(map, isl_dim_in, 0, d + 1);
-	map = isl_map_project_out(map, isl_dim_out, d, 1);
-	map = isl_map_reverse(map);
-	map = isl_map_move_dims(map, isl_dim_out, 0, isl_dim_param, param, 1);
-
-	return map;
-}
-
-/* Check whether equality i of bset is a pure stride constraint
- * on a single dimensions, i.e., of the form
- *
- *	v = k e
- *
- * with k a constant and e an existentially quantified variable.
- */
-static int is_eq_stride(__isl_keep isl_basic_set *bset, int i)
-{
-	unsigned nparam;
-	unsigned d;
-	unsigned n_div;
-	int pos1;
-	int pos2;
-
-	if (!bset)
-		return -1;
-
-	if (!isl_int_is_zero(bset->eq[i][0]))
-		return 0;
-
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-	d = isl_basic_set_dim(bset, isl_dim_set);
-	n_div = isl_basic_set_dim(bset, isl_dim_div);
-
-	if (isl_seq_first_non_zero(bset->eq[i] + 1, nparam) != -1)
-		return 0;
-	pos1 = isl_seq_first_non_zero(bset->eq[i] + 1 + nparam, d);
-	if (pos1 == -1)
-		return 0;
-	if (isl_seq_first_non_zero(bset->eq[i] + 1 + nparam + pos1 + 1, 
-					d - pos1 - 1) != -1)
-		return 0;
-
-	pos2 = isl_seq_first_non_zero(bset->eq[i] + 1 + nparam + d, n_div);
-	if (pos2 == -1)
-		return 0;
-	if (isl_seq_first_non_zero(bset->eq[i] + 1 + nparam + d  + pos2 + 1,
-				   n_div - pos2 - 1) != -1)
-		return 0;
-	if (!isl_int_is_one(bset->eq[i][1 + nparam + pos1]) &&
-	    !isl_int_is_negone(bset->eq[i][1 + nparam + pos1]))
-		return 0;
-
-	return 1;
-}
-
-/* Given a map, compute the smallest superset of this map that is of the form
- *
- *	{ i -> j : L <= j - i <= U and exists a_p: j_p - i_p = M_p a_p }
- *
- * (where p ranges over the (non-parametric) dimensions),
- * compute the transitive closure of this map, i.e.,
- *
- *	{ i -> j : exists k > 0:
- *		k L <= j - i <= k U and exists a: j_p - i_p = M_p a_p }
- *
- * and intersect domain and range of this transitive closure with
- * the given domain and range.
- *
- * If with_id is set, then try to include as much of the identity mapping
- * as possible, by computing
- *
- *	{ i -> j : exists k >= 0:
- *		k L <= j - i <= k U and exists a: j_p - i_p = M_p a_p }
- *
- * instead (i.e., allow k = 0).
- *
- * In practice, we compute the difference set
- *
- *	delta  = { j - i | i -> j in map },
- *
- * look for stride constraint on the individual dimensions and compute
- * (constant) lower and upper bounds for each individual dimension,
- * adding a constraint for each bound not equal to infinity.
- */
-static __isl_give isl_map *box_closure_on_domain(__isl_take isl_map *map,
-	__isl_take isl_set *dom, __isl_take isl_set *ran, int with_id)
-{
-	int i;
-	int k;
-	unsigned d;
-	unsigned nparam;
-	unsigned total;
-	isl_space *dim;
-	isl_set *delta;
-	isl_map *app = NULL;
-	isl_basic_set *aff = NULL;
-	isl_basic_map *bmap = NULL;
-	isl_vec *obj = NULL;
-	isl_int opt;
-
-	isl_int_init(opt);
-
-	delta = isl_map_deltas(isl_map_copy(map));
-
-	aff = isl_set_affine_hull(isl_set_copy(delta));
-	if (!aff)
-		goto error;
-	dim = isl_map_get_space(map);
-	d = isl_space_dim(dim, isl_dim_in);
-	nparam = isl_space_dim(dim, isl_dim_param);
-	total = isl_space_dim(dim, isl_dim_all);
-	bmap = isl_basic_map_alloc_space(dim,
-					aff->n_div + 1, aff->n_div, 2 * d + 1);
-	for (i = 0; i < aff->n_div + 1; ++i) {
-		k = isl_basic_map_alloc_div(bmap);
-		if (k < 0)
-			goto error;
-		isl_int_set_si(bmap->div[k][0], 0);
-	}
-	for (i = 0; i < aff->n_eq; ++i) {
-		if (!is_eq_stride(aff, i))
-			continue;
-		k = isl_basic_map_alloc_equality(bmap);
-		if (k < 0)
-			goto error;
-		isl_seq_clr(bmap->eq[k], 1 + nparam);
-		isl_seq_cpy(bmap->eq[k] + 1 + nparam + d,
-				aff->eq[i] + 1 + nparam, d);
-		isl_seq_neg(bmap->eq[k] + 1 + nparam,
-				aff->eq[i] + 1 + nparam, d);
-		isl_seq_cpy(bmap->eq[k] + 1 + nparam + 2 * d,
-				aff->eq[i] + 1 + nparam + d, aff->n_div);
-		isl_int_set_si(bmap->eq[k][1 + total + aff->n_div], 0);
-	}
-	obj = isl_vec_alloc(map->ctx, 1 + nparam + d);
-	if (!obj)
-		goto error;
-	isl_seq_clr(obj->el, 1 + nparam + d);
-	for (i = 0; i < d; ++ i) {
-		enum isl_lp_result res;
-
-		isl_int_set_si(obj->el[1 + nparam + i], 1);
-
-		res = isl_set_solve_lp(delta, 0, obj->el, map->ctx->one, &opt,
-					NULL, NULL);
-		if (res == isl_lp_error)
-			goto error;
-		if (res == isl_lp_ok) {
-			k = isl_basic_map_alloc_inequality(bmap);
-			if (k < 0)
-				goto error;
-			isl_seq_clr(bmap->ineq[k],
-					1 + nparam + 2 * d + bmap->n_div);
-			isl_int_set_si(bmap->ineq[k][1 + nparam + i], -1);
-			isl_int_set_si(bmap->ineq[k][1 + nparam + d + i], 1);
-			isl_int_neg(bmap->ineq[k][1 + nparam + 2 * d + aff->n_div], opt);
-		}
-
-		res = isl_set_solve_lp(delta, 1, obj->el, map->ctx->one, &opt,
-					NULL, NULL);
-		if (res == isl_lp_error)
-			goto error;
-		if (res == isl_lp_ok) {
-			k = isl_basic_map_alloc_inequality(bmap);
-			if (k < 0)
-				goto error;
-			isl_seq_clr(bmap->ineq[k],
-					1 + nparam + 2 * d + bmap->n_div);
-			isl_int_set_si(bmap->ineq[k][1 + nparam + i], 1);
-			isl_int_set_si(bmap->ineq[k][1 + nparam + d + i], -1);
-			isl_int_set(bmap->ineq[k][1 + nparam + 2 * d + aff->n_div], opt);
-		}
-
-		isl_int_set_si(obj->el[1 + nparam + i], 0);
-	}
-	k = isl_basic_map_alloc_inequality(bmap);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(bmap->ineq[k],
-			1 + nparam + 2 * d + bmap->n_div);
-	if (!with_id)
-		isl_int_set_si(bmap->ineq[k][0], -1);
-	isl_int_set_si(bmap->ineq[k][1 + nparam + 2 * d + aff->n_div], 1);
-
-	app = isl_map_from_domain_and_range(dom, ran);
-
-	isl_vec_free(obj);
-	isl_basic_set_free(aff);
-	isl_map_free(map);
-	bmap = isl_basic_map_finalize(bmap);
-	isl_set_free(delta);
-	isl_int_clear(opt);
-
-	map = isl_map_from_basic_map(bmap);
-	map = isl_map_intersect(map, app);
-
-	return map;
-error:
-	isl_vec_free(obj);
-	isl_basic_map_free(bmap);
-	isl_basic_set_free(aff);
-	isl_set_free(dom);
-	isl_set_free(ran);
-	isl_map_free(map);
-	isl_set_free(delta);
-	isl_int_clear(opt);
-	return NULL;
-}
-
-/* Given a map, compute the smallest superset of this map that is of the form
- *
- *	{ i -> j : L <= j - i <= U and exists a_p: j_p - i_p = M_p a_p }
- *
- * (where p ranges over the (non-parametric) dimensions),
- * compute the transitive closure of this map, i.e.,
- *
- *	{ i -> j : exists k > 0:
- *		k L <= j - i <= k U and exists a: j_p - i_p = M_p a_p }
- *
- * and intersect domain and range of this transitive closure with
- * domain and range of the original map.
- */
-static __isl_give isl_map *box_closure(__isl_take isl_map *map)
-{
-	isl_set *domain;
-	isl_set *range;
-
-	domain = isl_map_domain(isl_map_copy(map));
-	domain = isl_set_coalesce(domain);
-	range = isl_map_range(isl_map_copy(map));
-	range = isl_set_coalesce(range);
-
-	return box_closure_on_domain(map, domain, range, 0);
-}
-
-/* Given a map, compute the smallest superset of this map that is of the form
- *
- *	{ i -> j : L <= j - i <= U and exists a_p: j_p - i_p = M_p a_p }
- *
- * (where p ranges over the (non-parametric) dimensions),
- * compute the transitive and partially reflexive closure of this map, i.e.,
- *
- *	{ i -> j : exists k >= 0:
- *		k L <= j - i <= k U and exists a: j_p - i_p = M_p a_p }
- *
- * and intersect domain and range of this transitive closure with
- * the given domain.
- */
-static __isl_give isl_map *box_closure_with_identity(__isl_take isl_map *map,
-	__isl_take isl_set *dom)
-{
-	return box_closure_on_domain(map, dom, isl_set_copy(dom), 1);
-}
-
-/* Check whether app is the transitive closure of map.
- * In particular, check that app is acyclic and, if so,
- * check that
- *
- *	app \subset (map \cup (map \circ app))
- */
-static int check_exactness_omega(__isl_keep isl_map *map,
-	__isl_keep isl_map *app)
-{
-	isl_set *delta;
-	int i;
-	int is_empty, is_exact;
-	unsigned d;
-	isl_map *test;
-
-	delta = isl_map_deltas(isl_map_copy(app));
-	d = isl_set_dim(delta, isl_dim_set);
-	for (i = 0; i < d; ++i)
-		delta = isl_set_fix_si(delta, isl_dim_set, i, 0);
-	is_empty = isl_set_is_empty(delta);
-	isl_set_free(delta);
-	if (is_empty < 0)
-		return -1;
-	if (!is_empty)
-		return 0;
-
-	test = isl_map_apply_range(isl_map_copy(app), isl_map_copy(map));
-	test = isl_map_union(test, isl_map_copy(map));
-	is_exact = isl_map_is_subset(app, test);
-	isl_map_free(test);
-
-	return is_exact;
-}
-
-/* Check if basic map M_i can be combined with all the other
- * basic maps such that
- *
- *	(\cup_j M_j)^+
- *
- * can be computed as
- *
- *	M_i \cup (\cup_{j \ne i} M_i^* \circ M_j \circ M_i^*)^+
- *
- * In particular, check if we can compute a compact representation
- * of
- *
- *		M_i^* \circ M_j \circ M_i^*
- *
- * for each j != i.
- * Let M_i^? be an extension of M_i^+ that allows paths
- * of length zero, i.e., the result of box_closure(., 1).
- * The criterion, as proposed by Kelly et al., is that
- * id = M_i^? - M_i^+ can be represented as a basic map
- * and that
- *
- *	id \circ M_j \circ id = M_j
- *
- * for each j != i.
- *
- * If this function returns 1, then tc and qc are set to
- * M_i^+ and M_i^?, respectively.
- */
-static int can_be_split_off(__isl_keep isl_map *map, int i,
-	__isl_give isl_map **tc, __isl_give isl_map **qc)
-{
-	isl_map *map_i, *id = NULL;
-	int j = -1;
-	isl_set *C;
-
-	*tc = NULL;
-	*qc = NULL;
-
-	C = isl_set_union(isl_map_domain(isl_map_copy(map)),
-			  isl_map_range(isl_map_copy(map)));
-	C = isl_set_from_basic_set(isl_set_simple_hull(C));
-	if (!C)
-		goto error;
-
-	map_i = isl_map_from_basic_map(isl_basic_map_copy(map->p[i]));
-	*tc = box_closure(isl_map_copy(map_i));
-	*qc = box_closure_with_identity(map_i, C);
-	id = isl_map_subtract(isl_map_copy(*qc), isl_map_copy(*tc));
-
-	if (!id || !*qc)
-		goto error;
-	if (id->n != 1 || (*qc)->n != 1)
-		goto done;
-
-	for (j = 0; j < map->n; ++j) {
-		isl_map *map_j, *test;
-		int is_ok;
-
-		if (i == j)
-			continue;
-		map_j = isl_map_from_basic_map(
-					isl_basic_map_copy(map->p[j]));
-		test = isl_map_apply_range(isl_map_copy(id),
-						isl_map_copy(map_j));
-		test = isl_map_apply_range(test, isl_map_copy(id));
-		is_ok = isl_map_is_equal(test, map_j);
-		isl_map_free(map_j);
-		isl_map_free(test);
-		if (is_ok < 0)
-			goto error;
-		if (!is_ok)
-			break;
-	}
-
-done:
-	isl_map_free(id);
-	if (j == map->n)
-		return 1;
-
-	isl_map_free(*qc);
-	isl_map_free(*tc);
-	*qc = NULL;
-	*tc = NULL;
-
-	return 0;
-error:
-	isl_map_free(id);
-	isl_map_free(*qc);
-	isl_map_free(*tc);
-	*qc = NULL;
-	*tc = NULL;
-	return -1;
-}
-
-static __isl_give isl_map *box_closure_with_check(__isl_take isl_map *map,
-	int *exact)
-{
-	isl_map *app;
-
-	app = box_closure(isl_map_copy(map));
-	if (exact)
-		*exact = check_exactness_omega(map, app);
-
-	isl_map_free(map);
-	return app;
-}
-
-/* Compute an overapproximation of the transitive closure of "map"
- * using a variation of the algorithm from
- * "Transitive Closure of Infinite Graphs and its Applications"
- * by Kelly et al.
- *
- * We first check whether we can can split of any basic map M_i and
- * compute
- *
- *	(\cup_j M_j)^+
- *
- * as
- *
- *	M_i \cup (\cup_{j \ne i} M_i^* \circ M_j \circ M_i^*)^+
- *
- * using a recursive call on the remaining map.
- *
- * If not, we simply call box_closure on the whole map.
- */
-static __isl_give isl_map *transitive_closure_omega(__isl_take isl_map *map,
-	int *exact)
-{
-	int i, j;
-	int exact_i;
-	isl_map *app;
-
-	if (!map)
-		return NULL;
-	if (map->n == 1)
-		return box_closure_with_check(map, exact);
-
-	for (i = 0; i < map->n; ++i) {
-		int ok;
-		isl_map *qc, *tc;
-		ok = can_be_split_off(map, i, &tc, &qc);
-		if (ok < 0)
-			goto error;
-		if (!ok)
-			continue;
-
-		app = isl_map_alloc_space(isl_map_get_space(map), map->n - 1, 0);
-
-		for (j = 0; j < map->n; ++j) {
-			if (j == i)
-				continue;
-			app = isl_map_add_basic_map(app,
-						isl_basic_map_copy(map->p[j]));
-		}
-
-		app = isl_map_apply_range(isl_map_copy(qc), app);
-		app = isl_map_apply_range(app, qc);
-
-		app = isl_map_union(tc, transitive_closure_omega(app, NULL));
-		exact_i = check_exactness_omega(map, app);
-		if (exact_i == 1) {
-			if (exact)
-				*exact = exact_i;
-			isl_map_free(map);
-			return app;
-		}
-		isl_map_free(app);
-		if (exact_i < 0)
-			goto error;
-	}
-
-	return box_closure_with_check(map, exact);
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-/* Compute the transitive closure  of "map", or an overapproximation.
- * If the result is exact, then *exact is set to 1.
- * Simply use map_power to compute the powers of map, but tell
- * it to project out the lengths of the paths instead of equating
- * the length to a parameter.
- */
-__isl_give isl_map *isl_map_transitive_closure(__isl_take isl_map *map,
-	int *exact)
-{
-	isl_space *target_dim;
-	int closed;
-
-	if (!map)
-		goto error;
-
-	if (map->ctx->opt->closure == ISL_CLOSURE_BOX)
-		return transitive_closure_omega(map, exact);
-
-	map = isl_map_compute_divs(map);
-	map = isl_map_coalesce(map);
-	closed = isl_map_is_transitively_closed(map);
-	if (closed < 0)
-		goto error;
-	if (closed) {
-		if (exact)
-			*exact = 1;
-		return map;
-	}
-
-	target_dim = isl_map_get_space(map);
-	map = map_power(map, exact, 1);
-	map = isl_map_reset_space(map, target_dim);
-
-	return map;
-error:
-	isl_map_free(map);
-	return NULL;
-}
-
-static int inc_count(__isl_take isl_map *map, void *user)
-{
-	int *n = user;
-
-	*n += map->n;
-
-	isl_map_free(map);
-
-	return 0;
-}
-
-static int collect_basic_map(__isl_take isl_map *map, void *user)
-{
-	int i;
-	isl_basic_map ***next = user;
-
-	for (i = 0; i < map->n; ++i) {
-		**next = isl_basic_map_copy(map->p[i]);
-		if (!**next)
-			goto error;
-		(*next)++;
-	}
-
-	isl_map_free(map);
-	return 0;
-error:
-	isl_map_free(map);
-	return -1;
-}
-
-/* Perform Floyd-Warshall on the given list of basic relations.
- * The basic relations may live in different dimensions,
- * but basic relations that get assigned to the diagonal of the
- * grid have domains and ranges of the same dimension and so
- * the standard algorithm can be used because the nested transitive
- * closures are only applied to diagonal elements and because all
- * compositions are peformed on relations with compatible domains and ranges.
- */
-static __isl_give isl_union_map *union_floyd_warshall_on_list(isl_ctx *ctx,
-	__isl_keep isl_basic_map **list, int n, int *exact)
-{
-	int i, j, k;
-	int n_group;
-	int *group = NULL;
-	isl_set **set = NULL;
-	isl_map ***grid = NULL;
-	isl_union_map *app;
-
-	group = setup_groups(ctx, list, n, &set, &n_group);
-	if (!group)
-		goto error;
-
-	grid = isl_calloc_array(ctx, isl_map **, n_group);
-	if (!grid)
-		goto error;
-	for (i = 0; i < n_group; ++i) {
-		grid[i] = isl_calloc_array(ctx, isl_map *, n_group);
-		if (!grid[i])
-			goto error;
-		for (j = 0; j < n_group; ++j) {
-			isl_space *dim1, *dim2, *dim;
-			dim1 = isl_space_reverse(isl_set_get_space(set[i]));
-			dim2 = isl_set_get_space(set[j]);
-			dim = isl_space_join(dim1, dim2);
-			grid[i][j] = isl_map_empty(dim);
-		}
-	}
-
-	for (k = 0; k < n; ++k) {
-		i = group[2 * k];
-		j = group[2 * k + 1];
-		grid[i][j] = isl_map_union(grid[i][j],
-				isl_map_from_basic_map(
-					isl_basic_map_copy(list[k])));
-	}
-	
-	floyd_warshall_iterate(grid, n_group, exact);
-
-	app = isl_union_map_empty(isl_map_get_space(grid[0][0]));
-
-	for (i = 0; i < n_group; ++i) {
-		for (j = 0; j < n_group; ++j)
-			app = isl_union_map_add_map(app, grid[i][j]);
-		free(grid[i]);
-	}
-	free(grid);
-
-	for (i = 0; i < 2 * n; ++i)
-		isl_set_free(set[i]);
-	free(set);
-
-	free(group);
-	return app;
-error:
-	if (grid)
-		for (i = 0; i < n_group; ++i) {
-			if (!grid[i])
-				continue;
-			for (j = 0; j < n_group; ++j)
-				isl_map_free(grid[i][j]);
-			free(grid[i]);
-		}
-	free(grid);
-	if (set) {
-		for (i = 0; i < 2 * n; ++i)
-			isl_set_free(set[i]);
-		free(set);
-	}
-	free(group);
-	return NULL;
-}
-
-/* Perform Floyd-Warshall on the given union relation.
- * The implementation is very similar to that for non-unions.
- * The main difference is that it is applied unconditionally.
- * We first extract a list of basic maps from the union map
- * and then perform the algorithm on this list.
- */
-static __isl_give isl_union_map *union_floyd_warshall(
-	__isl_take isl_union_map *umap, int *exact)
-{
-	int i, n;
-	isl_ctx *ctx;
-	isl_basic_map **list = NULL;
-	isl_basic_map **next;
-	isl_union_map *res;
-
-	n = 0;
-	if (isl_union_map_foreach_map(umap, inc_count, &n) < 0)
-		goto error;
-
-	ctx = isl_union_map_get_ctx(umap);
-	list = isl_calloc_array(ctx, isl_basic_map *, n);
-	if (!list)
-		goto error;
-
-	next = list;
-	if (isl_union_map_foreach_map(umap, collect_basic_map, &next) < 0)
-		goto error;
-
-	res = union_floyd_warshall_on_list(ctx, list, n, exact);
-
-	if (list) {
-		for (i = 0; i < n; ++i)
-			isl_basic_map_free(list[i]);
-		free(list);
-	}
-
-	isl_union_map_free(umap);
-	return res;
-error:
-	if (list) {
-		for (i = 0; i < n; ++i)
-			isl_basic_map_free(list[i]);
-		free(list);
-	}
-	isl_union_map_free(umap);
-	return NULL;
-}
-
-/* Decompose the give union relation into strongly connected components.
- * The implementation is essentially the same as that of
- * construct_power_components with the major difference that all
- * operations are performed on union maps.
- */
-static __isl_give isl_union_map *union_components(
-	__isl_take isl_union_map *umap, int *exact)
-{
-	int i;
-	int n;
-	isl_ctx *ctx;
-	isl_basic_map **list;
-	isl_basic_map **next;
-	isl_union_map *path = NULL;
-	struct basic_map_sort *s = NULL;
-	int c, l;
-	int recheck = 0;
-
-	n = 0;
-	if (isl_union_map_foreach_map(umap, inc_count, &n) < 0)
-		goto error;
-
-	if (n <= 1)
-		return union_floyd_warshall(umap, exact);
-
-	ctx = isl_union_map_get_ctx(umap);
-	list = isl_calloc_array(ctx, isl_basic_map *, n);
-	if (!list)
-		goto error;
-
-	next = list;
-	if (isl_union_map_foreach_map(umap, collect_basic_map, &next) < 0)
-		goto error;
-
-	s = basic_map_sort_init(ctx, n, list);
-	if (!s)
-		goto error;
-
-	c = 0;
-	i = 0;
-	l = n;
-	path = isl_union_map_empty(isl_union_map_get_space(umap));
-	while (l) {
-		isl_union_map *comp;
-		isl_union_map *path_comp, *path_comb;
-		comp = isl_union_map_empty(isl_union_map_get_space(umap));
-		while (s->order[i] != -1) {
-			comp = isl_union_map_add_map(comp,
-				    isl_map_from_basic_map(
-					isl_basic_map_copy(list[s->order[i]])));
-			--l;
-			++i;
-		}
-		path_comp = union_floyd_warshall(comp, exact);
-		path_comb = isl_union_map_apply_range(isl_union_map_copy(path),
-						isl_union_map_copy(path_comp));
-		path = isl_union_map_union(path, path_comp);
-		path = isl_union_map_union(path, path_comb);
-		++i;
-		++c;
-	}
-
-	if (c > 1 && s->check_closed && !*exact) {
-		int closed;
-
-		closed = isl_union_map_is_transitively_closed(path);
-		if (closed < 0)
-			goto error;
-		recheck = !closed;
-	}
-
-	basic_map_sort_free(s);
-
-	for (i = 0; i < n; ++i)
-		isl_basic_map_free(list[i]);
-	free(list);
-
-	if (recheck) {
-		isl_union_map_free(path);
-		return union_floyd_warshall(umap, exact);
-	}
-
-	isl_union_map_free(umap);
-
-	return path;
-error:
-	basic_map_sort_free(s);
-	if (list) {
-		for (i = 0; i < n; ++i)
-			isl_basic_map_free(list[i]);
-		free(list);
-	}
-	isl_union_map_free(umap);
-	isl_union_map_free(path);
-	return NULL;
-}
-
-/* Compute the transitive closure  of "umap", or an overapproximation.
- * If the result is exact, then *exact is set to 1.
- */
-__isl_give isl_union_map *isl_union_map_transitive_closure(
-	__isl_take isl_union_map *umap, int *exact)
-{
-	int closed;
-
-	if (!umap)
-		return NULL;
-
-	if (exact)
-		*exact = 1;
-
-	umap = isl_union_map_compute_divs(umap);
-	umap = isl_union_map_coalesce(umap);
-	closed = isl_union_map_is_transitively_closed(umap);
-	if (closed < 0)
-		goto error;
-	if (closed)
-		return umap;
-	umap = union_components(umap, exact);
-	return umap;
-error:
-	isl_union_map_free(umap);
-	return NULL;
-}
-
-struct isl_union_power {
-	isl_union_map *pow;
-	int *exact;
-};
-
-static int power(__isl_take isl_map *map, void *user)
-{
-	struct isl_union_power *up = user;
-
-	map = isl_map_power(map, up->exact);
-	up->pow = isl_union_map_from_map(map);
-
-	return -1;
-}
-
-/* Construct a map [x] -> [x+1], with parameters prescribed by "dim".
- */
-static __isl_give isl_union_map *increment(__isl_take isl_space *dim)
-{
-	int k;
-	isl_basic_map *bmap;
-
-	dim = isl_space_add_dims(dim, isl_dim_in, 1);
-	dim = isl_space_add_dims(dim, isl_dim_out, 1);
-	bmap = isl_basic_map_alloc_space(dim, 0, 1, 0);
-	k = isl_basic_map_alloc_equality(bmap);
-	if (k < 0)
-		goto error;
-	isl_seq_clr(bmap->eq[k], isl_basic_map_total_dim(bmap));
-	isl_int_set_si(bmap->eq[k][0], 1);
-	isl_int_set_si(bmap->eq[k][isl_basic_map_offset(bmap, isl_dim_in)], 1);
-	isl_int_set_si(bmap->eq[k][isl_basic_map_offset(bmap, isl_dim_out)], -1);
-	return isl_union_map_from_map(isl_map_from_basic_map(bmap));
-error:
-	isl_basic_map_free(bmap);
-	return NULL;
-}
-
-/* Construct a map [[x]->[y]] -> [y-x], with parameters prescribed by "dim".
- */
-static __isl_give isl_union_map *deltas_map(__isl_take isl_space *dim)
-{
-	isl_basic_map *bmap;
-
-	dim = isl_space_add_dims(dim, isl_dim_in, 1);
-	dim = isl_space_add_dims(dim, isl_dim_out, 1);
-	bmap = isl_basic_map_universe(dim);
-	bmap = isl_basic_map_deltas_map(bmap);
-
-	return isl_union_map_from_map(isl_map_from_basic_map(bmap));
-}
-
-/* Compute the positive powers of "map", or an overapproximation.
- * The result maps the exponent to a nested copy of the corresponding power.
- * If the result is exact, then *exact is set to 1.
- */
-__isl_give isl_union_map *isl_union_map_power(__isl_take isl_union_map *umap,
-	int *exact)
-{
-	int n;
-	isl_union_map *inc;
-	isl_union_map *dm;
-
-	if (!umap)
-		return NULL;
-	n = isl_union_map_n_map(umap);
-	if (n == 0)
-		return umap;
-	if (n == 1) {
-		struct isl_union_power up = { NULL, exact };
-		isl_union_map_foreach_map(umap, &power, &up);
-		isl_union_map_free(umap);
-		return up.pow;
-	}
-	inc = increment(isl_union_map_get_space(umap));
-	umap = isl_union_map_product(inc, umap);
-	umap = isl_union_map_transitive_closure(umap, exact);
-	umap = isl_union_map_zip(umap);
-	dm = deltas_map(isl_union_map_get_space(umap));
-	umap = isl_union_map_apply_domain(umap, dm);
-	
-	return umap;
-}
diff --git a/cloog-0.17.0/isl/isl_union_map.c b/cloog-0.17.0/isl/isl_union_map.c
deleted file mode 100644
index 445d4fe..0000000
--- a/cloog-0.17.0/isl/isl_union_map.c
+++ /dev/null
@@ -1,2289 +0,0 @@
-/*
- * Copyright 2010-2011 INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France 
- */
-
-#define ISL_DIM_H
-#include <isl_map_private.h>
-#include <isl/ctx.h>
-#include <isl/hash.h>
-#include <isl/map.h>
-#include <isl/set.h>
-#include <isl_space_private.h>
-#include <isl_union_map_private.h>
-#include <isl/union_set.h>
-
-/* Is this union set a parameter domain?
- */
-int isl_union_set_is_params(__isl_keep isl_union_set *uset)
-{
-	isl_set *set;
-	int params;
-
-	if (!uset)
-		return -1;
-	if (uset->table.n != 1)
-		return 0;
-
-	set = isl_set_from_union_set(isl_union_set_copy(uset));
-	params = isl_set_is_params(set);
-	isl_set_free(set);
-	return params;
-}
-
-static __isl_give isl_union_map *isl_union_map_alloc(__isl_take isl_space *dim,
-	int size)
-{
-	isl_union_map *umap;
-
-	if (!dim)
-		return NULL;
-
-	umap = isl_calloc_type(dim->ctx, isl_union_map);
-	if (!umap)
-		return NULL;
-
-	umap->ref = 1;
-	umap->dim = dim;
-	if (isl_hash_table_init(dim->ctx, &umap->table, size) < 0)
-		goto error;
-
-	return umap;
-error:
-	isl_space_free(dim);
-	isl_union_map_free(umap);
-	return NULL;
-}
-
-__isl_give isl_union_map *isl_union_map_empty(__isl_take isl_space *dim)
-{
-	return isl_union_map_alloc(dim, 16);
-}
-
-__isl_give isl_union_set *isl_union_set_empty(__isl_take isl_space *dim)
-{
-	return isl_union_map_empty(dim);
-}
-
-isl_ctx *isl_union_map_get_ctx(__isl_keep isl_union_map *umap)
-{
-	return umap ? umap->dim->ctx : NULL;
-}
-
-isl_ctx *isl_union_set_get_ctx(__isl_keep isl_union_set *uset)
-{
-	return uset ? uset->dim->ctx : NULL;
-}
-
-__isl_give isl_space *isl_union_map_get_space(__isl_keep isl_union_map *umap)
-{
-	if (!umap)
-		return NULL;
-	return isl_space_copy(umap->dim);
-}
-
-__isl_give isl_space *isl_union_set_get_space(__isl_keep isl_union_set *uset)
-{
-	return isl_union_map_get_space(uset);
-}
-
-static int free_umap_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_map_free(map);
-	return 0;
-}
-
-static int add_map(__isl_take isl_map *map, void *user)
-{
-	isl_union_map **umap = (isl_union_map **)user;
-
-	*umap = isl_union_map_add_map(*umap, map);
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_dup(__isl_keep isl_union_map *umap)
-{
-	isl_union_map *dup;
-
-	if (!umap)
-		return NULL;
-
-	dup = isl_union_map_empty(isl_space_copy(umap->dim));
-	if (isl_union_map_foreach_map(umap, &add_map, &dup) < 0)
-		goto error;
-	return dup;
-error:
-	isl_union_map_free(dup);
-	return NULL;
-}
-
-__isl_give isl_union_map *isl_union_map_cow(__isl_take isl_union_map *umap)
-{
-	if (!umap)
-		return NULL;
-
-	if (umap->ref == 1)
-		return umap;
-	umap->ref--;
-	return isl_union_map_dup(umap);
-}
-
-struct isl_union_align {
-	isl_reordering *exp;
-	isl_union_map *res;
-};
-
-static int align_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_reordering *exp;
-	struct isl_union_align *data = user;
-
-	exp = isl_reordering_extend_space(isl_reordering_copy(data->exp),
-				    isl_map_get_space(map));
-
-	data->res = isl_union_map_add_map(data->res,
-					isl_map_realign(isl_map_copy(map), exp));
-
-	return 0;
-}
-
-/* Align the parameters of umap along those of model.
- * The result has the parameters of model first, in the same order
- * as they appear in model, followed by any remaining parameters of
- * umap that do not appear in model.
- */
-__isl_give isl_union_map *isl_union_map_align_params(
-	__isl_take isl_union_map *umap, __isl_take isl_space *model)
-{
-	struct isl_union_align data = { NULL, NULL };
-
-	if (!umap || !model)
-		goto error;
-
-	if (isl_space_match(umap->dim, isl_dim_param, model, isl_dim_param)) {
-		isl_space_free(model);
-		return umap;
-	}
-
-	model = isl_space_params(model);
-	data.exp = isl_parameter_alignment_reordering(umap->dim, model);
-	if (!data.exp)
-		goto error;
-
-	data.res = isl_union_map_alloc(isl_space_copy(data.exp->dim),
-					umap->table.n);
-	if (isl_hash_table_foreach(umap->dim->ctx, &umap->table,
-					&align_entry, &data) < 0)
-		goto error;
-
-	isl_reordering_free(data.exp);
-	isl_union_map_free(umap);
-	isl_space_free(model);
-	return data.res;
-error:
-	isl_reordering_free(data.exp);
-	isl_union_map_free(umap);
-	isl_union_map_free(data.res);
-	isl_space_free(model);
-	return NULL;
-}
-
-__isl_give isl_union_set *isl_union_set_align_params(
-	__isl_take isl_union_set *uset, __isl_take isl_space *model)
-{
-	return isl_union_map_align_params(uset, model);
-}
-
-__isl_give isl_union_map *isl_union_map_union(__isl_take isl_union_map *umap1,
-	__isl_take isl_union_map *umap2)
-{
-	umap1 = isl_union_map_align_params(umap1, isl_union_map_get_space(umap2));
-	umap2 = isl_union_map_align_params(umap2, isl_union_map_get_space(umap1));
-
-	umap1 = isl_union_map_cow(umap1);
-
-	if (!umap1 || !umap2)
-		goto error;
-
-	if (isl_union_map_foreach_map(umap2, &add_map, &umap1) < 0)
-		goto error;
-
-	isl_union_map_free(umap2);
-
-	return umap1;
-error:
-	isl_union_map_free(umap1);
-	isl_union_map_free(umap2);
-	return NULL;
-}
-
-__isl_give isl_union_set *isl_union_set_union(__isl_take isl_union_set *uset1,
-	__isl_take isl_union_set *uset2)
-{
-	return isl_union_map_union(uset1, uset2);
-}
-
-__isl_give isl_union_map *isl_union_map_copy(__isl_keep isl_union_map *umap)
-{
-	if (!umap)
-		return NULL;
-
-	umap->ref++;
-	return umap;
-}
-
-__isl_give isl_union_set *isl_union_set_copy(__isl_keep isl_union_set *uset)
-{
-	return isl_union_map_copy(uset);
-}
-
-void *isl_union_map_free(__isl_take isl_union_map *umap)
-{
-	if (!umap)
-		return NULL;
-
-	if (--umap->ref > 0)
-		return NULL;
-
-	isl_hash_table_foreach(umap->dim->ctx, &umap->table,
-			       &free_umap_entry, NULL);
-	isl_hash_table_clear(&umap->table);
-	isl_space_free(umap->dim);
-	free(umap);
-	return NULL;
-}
-
-void *isl_union_set_free(__isl_take isl_union_set *uset)
-{
-	return isl_union_map_free(uset);
-}
-
-static int has_dim(const void *entry, const void *val)
-{
-	isl_map *map = (isl_map *)entry;
-	isl_space *dim = (isl_space *)val;
-
-	return isl_space_is_equal(map->dim, dim);
-}
-
-__isl_give isl_union_map *isl_union_map_add_map(__isl_take isl_union_map *umap,
-	__isl_take isl_map *map)
-{
-	uint32_t hash;
-	struct isl_hash_table_entry *entry;
-
-	if (!map || !umap)
-		goto error;
-
-	if (isl_map_plain_is_empty(map)) {
-		isl_map_free(map);
-		return umap;
-	}
-
-	if (!isl_space_match(map->dim, isl_dim_param, umap->dim, isl_dim_param)) {
-		umap = isl_union_map_align_params(umap, isl_map_get_space(map));
-		map = isl_map_align_params(map, isl_union_map_get_space(umap));
-	}
-
-	umap = isl_union_map_cow(umap);
-
-	if (!map || !umap)
-		goto error;
-
-	hash = isl_space_get_hash(map->dim);
-	entry = isl_hash_table_find(umap->dim->ctx, &umap->table, hash,
-				    &has_dim, map->dim, 1);
-	if (!entry)
-		goto error;
-
-	if (!entry->data)
-		entry->data = map;
-	else {
-		entry->data = isl_map_union(entry->data, isl_map_copy(map));
-		if (!entry->data)
-			goto error;
-		isl_map_free(map);
-	}
-
-	return umap;
-error:
-	isl_map_free(map);
-	isl_union_map_free(umap);
-	return NULL;
-}
-
-__isl_give isl_union_set *isl_union_set_add_set(__isl_take isl_union_set *uset,
-	__isl_take isl_set *set)
-{
-	return isl_union_map_add_map(uset, (isl_map *)set);
-}
-
-__isl_give isl_union_map *isl_union_map_from_map(__isl_take isl_map *map)
-{
-	isl_space *dim;
-	isl_union_map *umap;
-
-	if (!map)
-		return NULL;
-
-	dim = isl_map_get_space(map);
-	dim = isl_space_params(dim);
-	umap = isl_union_map_empty(dim);
-	umap = isl_union_map_add_map(umap, map);
-
-	return umap;
-}
-
-__isl_give isl_union_set *isl_union_set_from_set(__isl_take isl_set *set)
-{
-	return isl_union_map_from_map((isl_map *)set);
-}
-
-struct isl_union_map_foreach_data
-{
-	int (*fn)(__isl_take isl_map *map, void *user);
-	void *user;
-};
-
-static int call_on_copy(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	struct isl_union_map_foreach_data *data;
-	data = (struct isl_union_map_foreach_data *)user;
-
-	return data->fn(isl_map_copy(map), data->user);
-}
-
-int isl_union_map_n_map(__isl_keep isl_union_map *umap)
-{
-	return umap ? umap->table.n : 0;
-}
-
-int isl_union_set_n_set(__isl_keep isl_union_set *uset)
-{
-	return uset ? uset->table.n : 0;
-}
-
-int isl_union_map_foreach_map(__isl_keep isl_union_map *umap,
-	int (*fn)(__isl_take isl_map *map, void *user), void *user)
-{
-	struct isl_union_map_foreach_data data = { fn, user };
-
-	if (!umap)
-		return -1;
-
-	return isl_hash_table_foreach(umap->dim->ctx, &umap->table,
-				      &call_on_copy, &data);
-}
-
-static int copy_map(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_map **map_p = user;
-
-	*map_p = isl_map_copy(map);
-
-	return -1;
-}
-
-__isl_give isl_map *isl_map_from_union_map(__isl_take isl_union_map *umap)
-{
-	isl_ctx *ctx;
-	isl_map *map = NULL;
-
-	if (!umap)
-		return NULL;
-	ctx = isl_union_map_get_ctx(umap);
-	if (umap->table.n != 1)
-		isl_die(ctx, isl_error_invalid,
-			"union map needs to contain elements in exactly "
-			"one space", return isl_union_map_free(umap));
-
-	isl_hash_table_foreach(ctx, &umap->table, &copy_map, &map);
-
-	isl_union_map_free(umap);
-
-	return map;
-}
-
-__isl_give isl_set *isl_set_from_union_set(__isl_take isl_union_set *uset)
-{
-	return isl_map_from_union_map(uset);
-}
-
-__isl_give isl_map *isl_union_map_extract_map(__isl_keep isl_union_map *umap,
-	__isl_take isl_space *dim)
-{
-	uint32_t hash;
-	struct isl_hash_table_entry *entry;
-
-	if (!umap || !dim)
-		goto error;
-
-	hash = isl_space_get_hash(dim);
-	entry = isl_hash_table_find(umap->dim->ctx, &umap->table, hash,
-				    &has_dim, dim, 0);
-	if (!entry)
-		return isl_map_empty(dim);
-	isl_space_free(dim);
-	return isl_map_copy(entry->data);
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-__isl_give isl_set *isl_union_set_extract_set(__isl_keep isl_union_set *uset,
-	__isl_take isl_space *dim)
-{
-	return (isl_set *)isl_union_map_extract_map(uset, dim);
-}
-
-/* Check if umap contains a map in the given space.
- */
-__isl_give int isl_union_map_contains(__isl_keep isl_union_map *umap,
-	__isl_keep isl_space *dim)
-{
-	uint32_t hash;
-	struct isl_hash_table_entry *entry;
-
-	if (!umap || !dim)
-		return -1;
-
-	hash = isl_space_get_hash(dim);
-	entry = isl_hash_table_find(umap->dim->ctx, &umap->table, hash,
-				    &has_dim, dim, 0);
-	return !!entry;
-}
-
-__isl_give int isl_union_set_contains(__isl_keep isl_union_set *uset,
-	__isl_keep isl_space *dim)
-{
-	return isl_union_map_contains(uset, dim);
-}
-
-int isl_union_set_foreach_set(__isl_keep isl_union_set *uset,
-	int (*fn)(__isl_take isl_set *set, void *user), void *user)
-{
-	return isl_union_map_foreach_map(uset,
-		(int(*)(__isl_take isl_map *, void*))fn, user);
-}
-
-struct isl_union_set_foreach_point_data {
-	int (*fn)(__isl_take isl_point *pnt, void *user);
-	void *user;
-};
-
-static int foreach_point(__isl_take isl_set *set, void *user)
-{
-	struct isl_union_set_foreach_point_data *data = user;
-	int r;
-
-	r = isl_set_foreach_point(set, data->fn, data->user);
-	isl_set_free(set);
-
-	return r;
-}
-
-int isl_union_set_foreach_point(__isl_keep isl_union_set *uset,
-	int (*fn)(__isl_take isl_point *pnt, void *user), void *user)
-{
-	struct isl_union_set_foreach_point_data data = { fn, user };
-	return isl_union_set_foreach_set(uset, &foreach_point, &data);
-}
-
-struct isl_union_map_gen_bin_data {
-	isl_union_map *umap2;
-	isl_union_map *res;
-};
-
-static int subtract_entry(void **entry, void *user)
-{
-	struct isl_union_map_gen_bin_data *data = user;
-	uint32_t hash;
-	struct isl_hash_table_entry *entry2;
-	isl_map *map = *entry;
-
-	hash = isl_space_get_hash(map->dim);
-	entry2 = isl_hash_table_find(data->umap2->dim->ctx, &data->umap2->table,
-				     hash, &has_dim, map->dim, 0);
-	map = isl_map_copy(map);
-	if (entry2) {
-		int empty;
-		map = isl_map_subtract(map, isl_map_copy(entry2->data));
-
-		empty = isl_map_is_empty(map);
-		if (empty < 0) {
-			isl_map_free(map);
-			return -1;
-		}
-		if (empty) {
-			isl_map_free(map);
-			return 0;
-		}
-	}
-	data->res = isl_union_map_add_map(data->res, map);
-
-	return 0;
-}
-
-static __isl_give isl_union_map *gen_bin_op(__isl_take isl_union_map *umap1,
-	__isl_take isl_union_map *umap2, int (*fn)(void **, void *))
-{
-	struct isl_union_map_gen_bin_data data = { NULL, NULL };
-
-	umap1 = isl_union_map_align_params(umap1, isl_union_map_get_space(umap2));
-	umap2 = isl_union_map_align_params(umap2, isl_union_map_get_space(umap1));
-
-	if (!umap1 || !umap2)
-		goto error;
-
-	data.umap2 = umap2;
-	data.res = isl_union_map_alloc(isl_space_copy(umap1->dim),
-				       umap1->table.n);
-	if (isl_hash_table_foreach(umap1->dim->ctx, &umap1->table,
-				   fn, &data) < 0)
-		goto error;
-
-	isl_union_map_free(umap1);
-	isl_union_map_free(umap2);
-	return data.res;
-error:
-	isl_union_map_free(umap1);
-	isl_union_map_free(umap2);
-	isl_union_map_free(data.res);
-	return NULL;
-}
-
-__isl_give isl_union_map *isl_union_map_subtract(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
-{
-	return gen_bin_op(umap1, umap2, &subtract_entry);
-}
-
-__isl_give isl_union_set *isl_union_set_subtract(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2)
-{
-	return isl_union_map_subtract(uset1, uset2);
-}
-
-struct isl_union_map_gen_bin_set_data {
-	isl_set *set;
-	isl_union_map *res;
-};
-
-static int intersect_params_entry(void **entry, void *user)
-{
-	struct isl_union_map_gen_bin_set_data *data = user;
-	isl_map *map = *entry;
-	int empty;
-
-	map = isl_map_copy(map);
-	map = isl_map_intersect_params(map, isl_set_copy(data->set));
-
-	empty = isl_map_is_empty(map);
-	if (empty < 0) {
-		isl_map_free(map);
-		return -1;
-	}
-
-	data->res = isl_union_map_add_map(data->res, map);
-
-	return 0;
-}
-
-static __isl_give isl_union_map *gen_bin_set_op(__isl_take isl_union_map *umap,
-	__isl_take isl_set *set, int (*fn)(void **, void *))
-{
-	struct isl_union_map_gen_bin_set_data data = { NULL, NULL };
-
-	umap = isl_union_map_align_params(umap, isl_set_get_space(set));
-	set = isl_set_align_params(set, isl_union_map_get_space(umap));
-
-	if (!umap || !set)
-		goto error;
-
-	data.set = set;
-	data.res = isl_union_map_alloc(isl_space_copy(umap->dim),
-				       umap->table.n);
-	if (isl_hash_table_foreach(umap->dim->ctx, &umap->table,
-				   fn, &data) < 0)
-		goto error;
-
-	isl_union_map_free(umap);
-	isl_set_free(set);
-	return data.res;
-error:
-	isl_union_map_free(umap);
-	isl_set_free(set);
-	isl_union_map_free(data.res);
-	return NULL;
-}
-
-__isl_give isl_union_map *isl_union_map_intersect_params(
-	__isl_take isl_union_map *umap, __isl_take isl_set *set)
-{
-	return gen_bin_set_op(umap, set, &intersect_params_entry);
-}
-
-__isl_give isl_union_set *isl_union_set_intersect_params(
-	__isl_take isl_union_set *uset, __isl_take isl_set *set)
-{
-	return isl_union_map_intersect_params(uset, set);
-}
-
-static __isl_give isl_union_map *union_map_intersect_params(
-	__isl_take isl_union_map *umap, __isl_take isl_union_set *uset)
-{
-	return isl_union_map_intersect_params(umap,
-						isl_set_from_union_set(uset));
-}
-
-static __isl_give isl_union_map *union_map_gist_params(
-	__isl_take isl_union_map *umap, __isl_take isl_union_set *uset)
-{
-	return isl_union_map_gist_params(umap, isl_set_from_union_set(uset));
-}
-
-struct isl_union_map_match_bin_data {
-	isl_union_map *umap2;
-	isl_union_map *res;
-	__isl_give isl_map *(*fn)(__isl_take isl_map*, __isl_take isl_map*);
-};
-
-static int match_bin_entry(void **entry, void *user)
-{
-	struct isl_union_map_match_bin_data *data = user;
-	uint32_t hash;
-	struct isl_hash_table_entry *entry2;
-	isl_map *map = *entry;
-	int empty;
-
-	hash = isl_space_get_hash(map->dim);
-	entry2 = isl_hash_table_find(data->umap2->dim->ctx, &data->umap2->table,
-				     hash, &has_dim, map->dim, 0);
-	if (!entry2)
-		return 0;
-
-	map = isl_map_copy(map);
-	map = data->fn(map, isl_map_copy(entry2->data));
-
-	empty = isl_map_is_empty(map);
-	if (empty < 0) {
-		isl_map_free(map);
-		return -1;
-	}
-	if (empty) {
-		isl_map_free(map);
-		return 0;
-	}
-
-	data->res = isl_union_map_add_map(data->res, map);
-
-	return 0;
-}
-
-static __isl_give isl_union_map *match_bin_op(__isl_take isl_union_map *umap1,
-	__isl_take isl_union_map *umap2,
-	__isl_give isl_map *(*fn)(__isl_take isl_map*, __isl_take isl_map*))
-{
-	struct isl_union_map_match_bin_data data = { NULL, NULL, fn };
-
-	umap1 = isl_union_map_align_params(umap1, isl_union_map_get_space(umap2));
-	umap2 = isl_union_map_align_params(umap2, isl_union_map_get_space(umap1));
-
-	if (!umap1 || !umap2)
-		goto error;
-
-	data.umap2 = umap2;
-	data.res = isl_union_map_alloc(isl_space_copy(umap1->dim),
-				       umap1->table.n);
-	if (isl_hash_table_foreach(umap1->dim->ctx, &umap1->table,
-				   &match_bin_entry, &data) < 0)
-		goto error;
-
-	isl_union_map_free(umap1);
-	isl_union_map_free(umap2);
-	return data.res;
-error:
-	isl_union_map_free(umap1);
-	isl_union_map_free(umap2);
-	isl_union_map_free(data.res);
-	return NULL;
-}
-
-__isl_give isl_union_map *isl_union_map_intersect(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
-{
-	return match_bin_op(umap1, umap2, &isl_map_intersect);
-}
-
-/* Compute the intersection of the two union_sets.
- * As a special case, if exactly one of the two union_sets
- * is a parameter domain, then intersect the parameter domain
- * of the other one with this set.
- */
-__isl_give isl_union_set *isl_union_set_intersect(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2)
-{
-	int p1, p2;
-
-	p1 = isl_union_set_is_params(uset1);
-	p2 = isl_union_set_is_params(uset2);
-	if (p1 < 0 || p2 < 0)
-		goto error;
-	if (!p1 && p2)
-		return union_map_intersect_params(uset1, uset2);
-	if (p1 && !p2)
-		return union_map_intersect_params(uset2, uset1);
-	return isl_union_map_intersect(uset1, uset2);
-error:
-	isl_union_set_free(uset1);
-	isl_union_set_free(uset2);
-	return NULL;
-}
-
-static int gist_params_entry(void **entry, void *user)
-{
-	struct isl_union_map_gen_bin_set_data *data = user;
-	isl_map *map = *entry;
-	int empty;
-
-	map = isl_map_copy(map);
-	map = isl_map_gist_params(map, isl_set_copy(data->set));
-
-	empty = isl_map_is_empty(map);
-	if (empty < 0) {
-		isl_map_free(map);
-		return -1;
-	}
-
-	data->res = isl_union_map_add_map(data->res, map);
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_gist_params(
-	__isl_take isl_union_map *umap, __isl_take isl_set *set)
-{
-	return gen_bin_set_op(umap, set, &gist_params_entry);
-}
-
-__isl_give isl_union_set *isl_union_set_gist_params(
-	__isl_take isl_union_set *uset, __isl_take isl_set *set)
-{
-	return isl_union_map_gist_params(uset, set);
-}
-
-__isl_give isl_union_map *isl_union_map_gist(__isl_take isl_union_map *umap,
-	__isl_take isl_union_map *context)
-{
-	return match_bin_op(umap, context, &isl_map_gist);
-}
-
-__isl_give isl_union_set *isl_union_set_gist(__isl_take isl_union_set *uset,
-	__isl_take isl_union_set *context)
-{
-	if (isl_union_set_is_params(context))
-		return union_map_gist_params(uset, context);
-	return isl_union_map_gist(uset, context);
-}
-
-static __isl_give isl_map *lex_le_set(__isl_take isl_map *set1,
-	__isl_take isl_map *set2)
-{
-	return isl_set_lex_le_set((isl_set *)set1, (isl_set *)set2);
-}
-
-static __isl_give isl_map *lex_lt_set(__isl_take isl_map *set1,
-	__isl_take isl_map *set2)
-{
-	return isl_set_lex_lt_set((isl_set *)set1, (isl_set *)set2);
-}
-
-__isl_give isl_union_map *isl_union_set_lex_lt_union_set(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2)
-{
-	return match_bin_op(uset1, uset2, &lex_lt_set);
-}
-
-__isl_give isl_union_map *isl_union_set_lex_le_union_set(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2)
-{
-	return match_bin_op(uset1, uset2, &lex_le_set);
-}
-
-__isl_give isl_union_map *isl_union_set_lex_gt_union_set(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2)
-{
-	return isl_union_map_reverse(isl_union_set_lex_lt_union_set(uset2, uset1));
-}
-
-__isl_give isl_union_map *isl_union_set_lex_ge_union_set(
-	__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2)
-{
-	return isl_union_map_reverse(isl_union_set_lex_le_union_set(uset2, uset1));
-}
-
-__isl_give isl_union_map *isl_union_map_lex_gt_union_map(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
-{
-	return isl_union_map_reverse(isl_union_map_lex_lt_union_map(umap2, umap1));
-}
-
-__isl_give isl_union_map *isl_union_map_lex_ge_union_map(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
-{
-	return isl_union_map_reverse(isl_union_map_lex_le_union_map(umap2, umap1));
-}
-
-static int intersect_domain_entry(void **entry, void *user)
-{
-	struct isl_union_map_gen_bin_data *data = user;
-	uint32_t hash;
-	struct isl_hash_table_entry *entry2;
-	isl_space *dim;
-	isl_map *map = *entry;
-	int empty;
-
-	dim = isl_map_get_space(map);
-	dim = isl_space_domain(dim);
-	hash = isl_space_get_hash(dim);
-	entry2 = isl_hash_table_find(data->umap2->dim->ctx, &data->umap2->table,
-				     hash, &has_dim, dim, 0);
-	isl_space_free(dim);
-	if (!entry2)
-		return 0;
-
-	map = isl_map_copy(map);
-	map = isl_map_intersect_domain(map, isl_set_copy(entry2->data));
-
-	empty = isl_map_is_empty(map);
-	if (empty < 0) {
-		isl_map_free(map);
-		return -1;
-	}
-	if (empty) {
-		isl_map_free(map);
-		return 0;
-	}
-
-	data->res = isl_union_map_add_map(data->res, map);
-
-	return 0;
-}
-
-/* Intersect the domain of "umap" with "uset".
- * If "uset" is a parameters domain, then intersect the parameter
- * domain of "umap" with this set.
- */
-__isl_give isl_union_map *isl_union_map_intersect_domain(
-	__isl_take isl_union_map *umap, __isl_take isl_union_set *uset)
-{
-	if (isl_union_set_is_params(uset))
-		return union_map_intersect_params(umap, uset);
-	return gen_bin_op(umap, uset, &intersect_domain_entry);
-}
-
-static int gist_domain_entry(void **entry, void *user)
-{
-	struct isl_union_map_gen_bin_data *data = user;
-	uint32_t hash;
-	struct isl_hash_table_entry *entry2;
-	isl_space *dim;
-	isl_map *map = *entry;
-	int empty;
-
-	dim = isl_map_get_space(map);
-	dim = isl_space_domain(dim);
-	hash = isl_space_get_hash(dim);
-	entry2 = isl_hash_table_find(data->umap2->dim->ctx, &data->umap2->table,
-				     hash, &has_dim, dim, 0);
-	isl_space_free(dim);
-	if (!entry2)
-		return 0;
-
-	map = isl_map_copy(map);
-	map = isl_map_gist_domain(map, isl_set_copy(entry2->data));
-
-	empty = isl_map_is_empty(map);
-	if (empty < 0) {
-		isl_map_free(map);
-		return -1;
-	}
-
-	data->res = isl_union_map_add_map(data->res, map);
-
-	return 0;
-}
-
-/* Compute the gist of "umap" with respect to the domain "uset".
- * If "uset" is a parameters domain, then compute the gist
- * with respect to this parameter domain.
- */
-__isl_give isl_union_map *isl_union_map_gist_domain(
-	__isl_take isl_union_map *umap, __isl_take isl_union_set *uset)
-{
-	if (isl_union_set_is_params(uset))
-		return union_map_gist_params(umap, uset);
-	return gen_bin_op(umap, uset, &gist_domain_entry);
-}
-
-static int intersect_range_entry(void **entry, void *user)
-{
-	struct isl_union_map_gen_bin_data *data = user;
-	uint32_t hash;
-	struct isl_hash_table_entry *entry2;
-	isl_space *dim;
-	isl_map *map = *entry;
-	int empty;
-
-	dim = isl_map_get_space(map);
-	dim = isl_space_range(dim);
-	hash = isl_space_get_hash(dim);
-	entry2 = isl_hash_table_find(data->umap2->dim->ctx, &data->umap2->table,
-				     hash, &has_dim, dim, 0);
-	isl_space_free(dim);
-	if (!entry2)
-		return 0;
-
-	map = isl_map_copy(map);
-	map = isl_map_intersect_range(map, isl_set_copy(entry2->data));
-
-	empty = isl_map_is_empty(map);
-	if (empty < 0) {
-		isl_map_free(map);
-		return -1;
-	}
-	if (empty) {
-		isl_map_free(map);
-		return 0;
-	}
-
-	data->res = isl_union_map_add_map(data->res, map);
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_intersect_range(
-	__isl_take isl_union_map *umap, __isl_take isl_union_set *uset)
-{
-	return gen_bin_op(umap, uset, &intersect_range_entry);
-}
-
-struct isl_union_map_bin_data {
-	isl_union_map *umap2;
-	isl_union_map *res;
-	isl_map *map;
-	int (*fn)(void **entry, void *user);
-};
-
-static int apply_range_entry(void **entry, void *user)
-{
-	struct isl_union_map_bin_data *data = user;
-	isl_map *map2 = *entry;
-	int empty;
-
-	if (!isl_space_tuple_match(data->map->dim, isl_dim_out,
-				 map2->dim, isl_dim_in))
-		return 0;
-
-	map2 = isl_map_apply_range(isl_map_copy(data->map), isl_map_copy(map2));
-
-	empty = isl_map_is_empty(map2);
-	if (empty < 0) {
-		isl_map_free(map2);
-		return -1;
-	}
-	if (empty) {
-		isl_map_free(map2);
-		return 0;
-	}
-
-	data->res = isl_union_map_add_map(data->res, map2);
-
-	return 0;
-}
-
-static int bin_entry(void **entry, void *user)
-{
-	struct isl_union_map_bin_data *data = user;
-	isl_map *map = *entry;
-
-	data->map = map;
-	if (isl_hash_table_foreach(data->umap2->dim->ctx, &data->umap2->table,
-				   data->fn, data) < 0)
-		return -1;
-
-	return 0;
-}
-
-static __isl_give isl_union_map *bin_op(__isl_take isl_union_map *umap1,
-	__isl_take isl_union_map *umap2, int (*fn)(void **entry, void *user))
-{
-	struct isl_union_map_bin_data data = { NULL, NULL, NULL, fn };
-
-	umap1 = isl_union_map_align_params(umap1, isl_union_map_get_space(umap2));
-	umap2 = isl_union_map_align_params(umap2, isl_union_map_get_space(umap1));
-
-	if (!umap1 || !umap2)
-		goto error;
-
-	data.umap2 = umap2;
-	data.res = isl_union_map_alloc(isl_space_copy(umap1->dim),
-				       umap1->table.n);
-	if (isl_hash_table_foreach(umap1->dim->ctx, &umap1->table,
-				   &bin_entry, &data) < 0)
-		goto error;
-
-	isl_union_map_free(umap1);
-	isl_union_map_free(umap2);
-	return data.res;
-error:
-	isl_union_map_free(umap1);
-	isl_union_map_free(umap2);
-	isl_union_map_free(data.res);
-	return NULL;
-}
-
-__isl_give isl_union_map *isl_union_map_apply_range(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
-{
-	return bin_op(umap1, umap2, &apply_range_entry);
-}
-
-__isl_give isl_union_map *isl_union_map_apply_domain(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
-{
-	umap1 = isl_union_map_reverse(umap1);
-	umap1 = isl_union_map_apply_range(umap1, umap2);
-	return isl_union_map_reverse(umap1);
-}
-
-__isl_give isl_union_set *isl_union_set_apply(
-	__isl_take isl_union_set *uset, __isl_take isl_union_map *umap)
-{
-	return isl_union_map_apply_range(uset, umap);
-}
-
-static int map_lex_lt_entry(void **entry, void *user)
-{
-	struct isl_union_map_bin_data *data = user;
-	isl_map *map2 = *entry;
-
-	if (!isl_space_tuple_match(data->map->dim, isl_dim_out,
-				 map2->dim, isl_dim_out))
-		return 0;
-
-	map2 = isl_map_lex_lt_map(isl_map_copy(data->map), isl_map_copy(map2));
-
-	data->res = isl_union_map_add_map(data->res, map2);
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_lex_lt_union_map(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
-{
-	return bin_op(umap1, umap2, &map_lex_lt_entry);
-}
-
-static int map_lex_le_entry(void **entry, void *user)
-{
-	struct isl_union_map_bin_data *data = user;
-	isl_map *map2 = *entry;
-
-	if (!isl_space_tuple_match(data->map->dim, isl_dim_out,
-				 map2->dim, isl_dim_out))
-		return 0;
-
-	map2 = isl_map_lex_le_map(isl_map_copy(data->map), isl_map_copy(map2));
-
-	data->res = isl_union_map_add_map(data->res, map2);
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_lex_le_union_map(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
-{
-	return bin_op(umap1, umap2, &map_lex_le_entry);
-}
-
-static int product_entry(void **entry, void *user)
-{
-	struct isl_union_map_bin_data *data = user;
-	isl_map *map2 = *entry;
-
-	map2 = isl_map_product(isl_map_copy(data->map), isl_map_copy(map2));
-
-	data->res = isl_union_map_add_map(data->res, map2);
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_product(__isl_take isl_union_map *umap1,
-	__isl_take isl_union_map *umap2)
-{
-	return bin_op(umap1, umap2, &product_entry);
-}
-
-__isl_give isl_union_set *isl_union_set_product(__isl_take isl_union_set *uset1,
-	__isl_take isl_union_set *uset2)
-{
-	return isl_union_map_product(uset1, uset2);
-}
-
-static int range_product_entry(void **entry, void *user)
-{
-	struct isl_union_map_bin_data *data = user;
-	isl_map *map2 = *entry;
-
-	if (!isl_space_tuple_match(data->map->dim, isl_dim_in,
-				 map2->dim, isl_dim_in))
-		return 0;
-
-	map2 = isl_map_range_product(isl_map_copy(data->map),
-				     isl_map_copy(map2));
-
-	data->res = isl_union_map_add_map(data->res, map2);
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_range_product(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
-{
-	return bin_op(umap1, umap2, &range_product_entry);
-}
-
-static int flat_range_product_entry(void **entry, void *user)
-{
-	struct isl_union_map_bin_data *data = user;
-	isl_map *map2 = *entry;
-
-	if (!isl_space_tuple_match(data->map->dim, isl_dim_in,
-				 map2->dim, isl_dim_in))
-		return 0;
-
-	map2 = isl_map_flat_range_product(isl_map_copy(data->map),
-					  isl_map_copy(map2));
-
-	data->res = isl_union_map_add_map(data->res, map2);
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_flat_range_product(
-	__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2)
-{
-	return bin_op(umap1, umap2, &flat_range_product_entry);
-}
-
-static __isl_give isl_union_set *cond_un_op(__isl_take isl_union_map *umap,
-	int (*fn)(void **, void *))
-{
-	isl_union_set *res;
-
-	if (!umap)
-		return NULL;
-
-	res = isl_union_map_alloc(isl_space_copy(umap->dim), umap->table.n);
-	if (isl_hash_table_foreach(umap->dim->ctx, &umap->table, fn, &res) < 0)
-		goto error;
-
-	isl_union_map_free(umap);
-	return res;
-error:
-	isl_union_map_free(umap);
-	isl_union_set_free(res);
-	return NULL;
-}
-
-static int from_range_entry(void **entry, void *user)
-{
-	isl_map *set = *entry;
-	isl_union_set **res = user;
-
-	*res = isl_union_map_add_map(*res,
-					isl_map_from_range(isl_set_copy(set)));
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_from_range(
-	__isl_take isl_union_set *uset)
-{
-	return cond_un_op(uset, &from_range_entry);
-}
-
-__isl_give isl_union_map *isl_union_map_from_domain(
-	__isl_take isl_union_set *uset)
-{
-	return isl_union_map_reverse(isl_union_map_from_range(uset));
-}
-
-__isl_give isl_union_map *isl_union_map_from_domain_and_range(
-	__isl_take isl_union_set *domain, __isl_take isl_union_set *range)
-{
-	return isl_union_map_apply_range(isl_union_map_from_domain(domain),
-				         isl_union_map_from_range(range));
-}
-
-static __isl_give isl_union_map *un_op(__isl_take isl_union_map *umap,
-	int (*fn)(void **, void *))
-{
-	umap = isl_union_map_cow(umap);
-	if (!umap)
-		return NULL;
-
-	if (isl_hash_table_foreach(umap->dim->ctx, &umap->table, fn, NULL) < 0)
-		goto error;
-
-	return umap;
-error:
-	isl_union_map_free(umap);
-	return NULL;
-}
-
-static int affine_entry(void **entry, void *user)
-{
-	isl_map **map = (isl_map **)entry;
-
-	*map = isl_map_from_basic_map(isl_map_affine_hull(*map));
-
-	return *map ? 0 : -1;
-}
-
-__isl_give isl_union_map *isl_union_map_affine_hull(
-	__isl_take isl_union_map *umap)
-{
-	return un_op(umap, &affine_entry);
-}
-
-__isl_give isl_union_set *isl_union_set_affine_hull(
-	__isl_take isl_union_set *uset)
-{
-	return isl_union_map_affine_hull(uset);
-}
-
-static int polyhedral_entry(void **entry, void *user)
-{
-	isl_map **map = (isl_map **)entry;
-
-	*map = isl_map_from_basic_map(isl_map_polyhedral_hull(*map));
-
-	return *map ? 0 : -1;
-}
-
-__isl_give isl_union_map *isl_union_map_polyhedral_hull(
-	__isl_take isl_union_map *umap)
-{
-	return un_op(umap, &polyhedral_entry);
-}
-
-__isl_give isl_union_set *isl_union_set_polyhedral_hull(
-	__isl_take isl_union_set *uset)
-{
-	return isl_union_map_polyhedral_hull(uset);
-}
-
-static int simple_entry(void **entry, void *user)
-{
-	isl_map **map = (isl_map **)entry;
-
-	*map = isl_map_from_basic_map(isl_map_simple_hull(*map));
-
-	return *map ? 0 : -1;
-}
-
-__isl_give isl_union_map *isl_union_map_simple_hull(
-	__isl_take isl_union_map *umap)
-{
-	return un_op(umap, &simple_entry);
-}
-
-__isl_give isl_union_set *isl_union_set_simple_hull(
-	__isl_take isl_union_set *uset)
-{
-	return isl_union_map_simple_hull(uset);
-}
-
-static int inplace_entry(void **entry, void *user)
-{
-	__isl_give isl_map *(*fn)(__isl_take isl_map *);
-	isl_map **map = (isl_map **)entry;
-	isl_map *copy;
-
-	fn = *(__isl_give isl_map *(**)(__isl_take isl_map *)) user;
-	copy = fn(isl_map_copy(*map));
-	if (!copy)
-		return -1;
-
-	isl_map_free(*map);
-	*map = copy;
-
-	return 0;
-}
-
-static __isl_give isl_union_map *inplace(__isl_take isl_union_map *umap,
-	__isl_give isl_map *(*fn)(__isl_take isl_map *))
-{
-	if (!umap)
-		return NULL;
-
-	if (isl_hash_table_foreach(umap->dim->ctx, &umap->table,
-				    &inplace_entry, &fn) < 0)
-		goto error;
-
-	return umap;
-error:
-	isl_union_map_free(umap);
-	return NULL;
-}
-
-__isl_give isl_union_map *isl_union_map_coalesce(
-	__isl_take isl_union_map *umap)
-{
-	return inplace(umap, &isl_map_coalesce);
-}
-
-__isl_give isl_union_set *isl_union_set_coalesce(
-	__isl_take isl_union_set *uset)
-{
-	return isl_union_map_coalesce(uset);
-}
-
-__isl_give isl_union_map *isl_union_map_detect_equalities(
-	__isl_take isl_union_map *umap)
-{
-	return inplace(umap, &isl_map_detect_equalities);
-}
-
-__isl_give isl_union_set *isl_union_set_detect_equalities(
-	__isl_take isl_union_set *uset)
-{
-	return isl_union_map_detect_equalities(uset);
-}
-
-__isl_give isl_union_map *isl_union_map_compute_divs(
-	__isl_take isl_union_map *umap)
-{
-	return inplace(umap, &isl_map_compute_divs);
-}
-
-__isl_give isl_union_set *isl_union_set_compute_divs(
-	__isl_take isl_union_set *uset)
-{
-	return isl_union_map_compute_divs(uset);
-}
-
-static int lexmin_entry(void **entry, void *user)
-{
-	isl_map **map = (isl_map **)entry;
-
-	*map = isl_map_lexmin(*map);
-
-	return *map ? 0 : -1;
-}
-
-__isl_give isl_union_map *isl_union_map_lexmin(
-	__isl_take isl_union_map *umap)
-{
-	return un_op(umap, &lexmin_entry);
-}
-
-__isl_give isl_union_set *isl_union_set_lexmin(
-	__isl_take isl_union_set *uset)
-{
-	return isl_union_map_lexmin(uset);
-}
-
-static int lexmax_entry(void **entry, void *user)
-{
-	isl_map **map = (isl_map **)entry;
-
-	*map = isl_map_lexmax(*map);
-
-	return *map ? 0 : -1;
-}
-
-__isl_give isl_union_map *isl_union_map_lexmax(
-	__isl_take isl_union_map *umap)
-{
-	return un_op(umap, &lexmax_entry);
-}
-
-__isl_give isl_union_set *isl_union_set_lexmax(
-	__isl_take isl_union_set *uset)
-{
-	return isl_union_map_lexmax(uset);
-}
-
-static int universe_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_union_map **res = user;
-
-	map = isl_map_universe(isl_map_get_space(map));
-	*res = isl_union_map_add_map(*res, map);
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_universe(__isl_take isl_union_map *umap)
-{
-	return cond_un_op(umap, &universe_entry);
-}
-
-__isl_give isl_union_set *isl_union_set_universe(__isl_take isl_union_set *uset)
-{
-	return isl_union_map_universe(uset);
-}
-
-static int reverse_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_union_map **res = user;
-
-	*res = isl_union_map_add_map(*res, isl_map_reverse(isl_map_copy(map)));
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_reverse(__isl_take isl_union_map *umap)
-{
-	return cond_un_op(umap, &reverse_entry);
-}
-
-static int params_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_union_set **res = user;
-
-	*res = isl_union_set_add_set(*res, isl_map_params(isl_map_copy(map)));
-
-	return 0;
-}
-
-/* Compute the parameter domain of the given union map.
- */
-__isl_give isl_set *isl_union_map_params(__isl_take isl_union_map *umap)
-{
-	int empty;
-
-	empty = isl_union_map_is_empty(umap);
-	if (empty < 0)
-		return isl_union_map_free(umap);
-	if (empty)
-		return isl_set_empty(isl_union_map_get_space(umap));
-	return isl_set_from_union_set(cond_un_op(umap, &params_entry));
-}
-
-/* Compute the parameter domain of the given union set.
- */
-__isl_give isl_set *isl_union_set_params(__isl_take isl_union_set *uset)
-{
-	return isl_union_map_params(uset);
-}
-
-static int domain_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_union_set **res = user;
-
-	*res = isl_union_set_add_set(*res, isl_map_domain(isl_map_copy(map)));
-
-	return 0;
-}
-
-__isl_give isl_union_set *isl_union_map_domain(__isl_take isl_union_map *umap)
-{
-	return cond_un_op(umap, &domain_entry);
-}
-
-static int range_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_union_set **res = user;
-
-	*res = isl_union_set_add_set(*res, isl_map_range(isl_map_copy(map)));
-
-	return 0;
-}
-
-__isl_give isl_union_set *isl_union_map_range(__isl_take isl_union_map *umap)
-{
-	return cond_un_op(umap, &range_entry);
-}
-
-static int domain_map_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_union_set **res = user;
-
-	*res = isl_union_map_add_map(*res,
-					isl_map_domain_map(isl_map_copy(map)));
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_domain_map(
-	__isl_take isl_union_map *umap)
-{
-	return cond_un_op(umap, &domain_map_entry);
-}
-
-static int range_map_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_union_set **res = user;
-
-	*res = isl_union_map_add_map(*res,
-					isl_map_range_map(isl_map_copy(map)));
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_range_map(
-	__isl_take isl_union_map *umap)
-{
-	return cond_un_op(umap, &range_map_entry);
-}
-
-static int deltas_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_union_set **res = user;
-
-	if (!isl_space_tuple_match(map->dim, isl_dim_in, map->dim, isl_dim_out))
-		return 0;
-
-	*res = isl_union_set_add_set(*res, isl_map_deltas(isl_map_copy(map)));
-
-	return 0;
-}
-
-__isl_give isl_union_set *isl_union_map_deltas(__isl_take isl_union_map *umap)
-{
-	return cond_un_op(umap, &deltas_entry);
-}
-
-static int deltas_map_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_union_map **res = user;
-
-	if (!isl_space_tuple_match(map->dim, isl_dim_in, map->dim, isl_dim_out))
-		return 0;
-
-	*res = isl_union_map_add_map(*res,
-				     isl_map_deltas_map(isl_map_copy(map)));
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_deltas_map(
-	__isl_take isl_union_map *umap)
-{
-	return cond_un_op(umap, &deltas_map_entry);
-}
-
-static int identity_entry(void **entry, void *user)
-{
-	isl_set *set = *entry;
-	isl_union_map **res = user;
-
-	*res = isl_union_map_add_map(*res, isl_set_identity(isl_set_copy(set)));
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_set_identity(__isl_take isl_union_set *uset)
-{
-	return cond_un_op(uset, &identity_entry);
-}
-
-static int unwrap_entry(void **entry, void *user)
-{
-	isl_set *set = *entry;
-	isl_union_set **res = user;
-
-	if (!isl_set_is_wrapping(set))
-		return 0;
-
-	*res = isl_union_map_add_map(*res, isl_set_unwrap(isl_set_copy(set)));
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_set_unwrap(__isl_take isl_union_set *uset)
-{
-	return cond_un_op(uset, &unwrap_entry);
-}
-
-static int wrap_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_union_set **res = user;
-
-	*res = isl_union_set_add_set(*res, isl_map_wrap(isl_map_copy(map)));
-
-	return 0;
-}
-
-__isl_give isl_union_set *isl_union_map_wrap(__isl_take isl_union_map *umap)
-{
-	return cond_un_op(umap, &wrap_entry);
-}
-
-struct isl_union_map_is_subset_data {
-	isl_union_map *umap2;
-	int is_subset;
-};
-
-static int is_subset_entry(void **entry, void *user)
-{
-	struct isl_union_map_is_subset_data *data = user;
-	uint32_t hash;
-	struct isl_hash_table_entry *entry2;
-	isl_map *map = *entry;
-
-	hash = isl_space_get_hash(map->dim);
-	entry2 = isl_hash_table_find(data->umap2->dim->ctx, &data->umap2->table,
-				     hash, &has_dim, map->dim, 0);
-	if (!entry2) {
-		data->is_subset = 0;
-		return -1;
-	}
-
-	data->is_subset = isl_map_is_subset(map, entry2->data);
-	if (data->is_subset < 0 || !data->is_subset)
-		return -1;
-
-	return 0;
-}
-
-int isl_union_map_is_subset(__isl_keep isl_union_map *umap1,
-	__isl_keep isl_union_map *umap2)
-{
-	struct isl_union_map_is_subset_data data = { NULL, 1 };
-
-	umap1 = isl_union_map_copy(umap1);
-	umap2 = isl_union_map_copy(umap2);
-	umap1 = isl_union_map_align_params(umap1, isl_union_map_get_space(umap2));
-	umap2 = isl_union_map_align_params(umap2, isl_union_map_get_space(umap1));
-
-	if (!umap1 || !umap2)
-		goto error;
-
-	data.umap2 = umap2;
-	if (isl_hash_table_foreach(umap1->dim->ctx, &umap1->table,
-				   &is_subset_entry, &data) < 0 &&
-	    data.is_subset)
-		goto error;
-
-	isl_union_map_free(umap1);
-	isl_union_map_free(umap2);
-
-	return data.is_subset;
-error:
-	isl_union_map_free(umap1);
-	isl_union_map_free(umap2);
-	return -1;
-}
-
-int isl_union_set_is_subset(__isl_keep isl_union_set *uset1,
-	__isl_keep isl_union_set *uset2)
-{
-	return isl_union_map_is_subset(uset1, uset2);
-}
-
-int isl_union_map_is_equal(__isl_keep isl_union_map *umap1,
-	__isl_keep isl_union_map *umap2)
-{
-	int is_subset;
-
-	if (!umap1 || !umap2)
-		return -1;
-	is_subset = isl_union_map_is_subset(umap1, umap2);
-	if (is_subset != 1)
-		return is_subset;
-	is_subset = isl_union_map_is_subset(umap2, umap1);
-	return is_subset;
-}
-
-int isl_union_set_is_equal(__isl_keep isl_union_set *uset1,
-	__isl_keep isl_union_set *uset2)
-{
-	return isl_union_map_is_equal(uset1, uset2);
-}
-
-int isl_union_map_is_strict_subset(__isl_keep isl_union_map *umap1,
-	__isl_keep isl_union_map *umap2)
-{
-	int is_subset;
-
-	if (!umap1 || !umap2)
-		return -1;
-	is_subset = isl_union_map_is_subset(umap1, umap2);
-	if (is_subset != 1)
-		return is_subset;
-	is_subset = isl_union_map_is_subset(umap2, umap1);
-	if (is_subset == -1)
-		return is_subset;
-	return !is_subset;
-}
-
-int isl_union_set_is_strict_subset(__isl_keep isl_union_set *uset1,
-	__isl_keep isl_union_set *uset2)
-{
-	return isl_union_map_is_strict_subset(uset1, uset2);
-}
-
-static int sample_entry(void **entry, void *user)
-{
-	isl_basic_map **sample = (isl_basic_map **)user;
-	isl_map *map = *entry;
-
-	*sample = isl_map_sample(isl_map_copy(map));
-	if (!*sample)
-		return -1;
-	if (!isl_basic_map_plain_is_empty(*sample))
-		return -1;
-	return 0;
-}
-
-__isl_give isl_basic_map *isl_union_map_sample(__isl_take isl_union_map *umap)
-{
-	isl_basic_map *sample = NULL;
-
-	if (!umap)
-		return NULL;
-
-	if (isl_hash_table_foreach(umap->dim->ctx, &umap->table,
-				   &sample_entry, &sample) < 0 &&
-	    !sample)
-		goto error;
-
-	if (!sample)
-		sample = isl_basic_map_empty(isl_union_map_get_space(umap));
-
-	isl_union_map_free(umap);
-
-	return sample;
-error:
-	isl_union_map_free(umap);
-	return NULL;
-}
-
-__isl_give isl_basic_set *isl_union_set_sample(__isl_take isl_union_set *uset)
-{
-	return (isl_basic_set *)isl_union_map_sample(uset);
-}
-
-struct isl_forall_data {
-	int res;
-	int (*fn)(__isl_keep isl_map *map);
-};
-
-static int forall_entry(void **entry, void *user)
-{
-	struct isl_forall_data *data = user;
-	isl_map *map = *entry;
-
-	data->res = data->fn(map);
-	if (data->res < 0)
-		return -1;
-
-	if (!data->res)
-		return -1;
-
-	return 0;
-}
-
-static int union_map_forall(__isl_keep isl_union_map *umap,
-	int (*fn)(__isl_keep isl_map *map))
-{
-	struct isl_forall_data data = { 1, fn };
-
-	if (!umap)
-		return -1;
-
-	if (isl_hash_table_foreach(umap->dim->ctx, &umap->table,
-				   &forall_entry, &data) < 0 && data.res)
-		return -1;
-
-	return data.res;
-}
-
-struct isl_forall_user_data {
-	int res;
-	int (*fn)(__isl_keep isl_map *map, void *user);
-	void *user;
-};
-
-static int forall_user_entry(void **entry, void *user)
-{
-	struct isl_forall_user_data *data = user;
-	isl_map *map = *entry;
-
-	data->res = data->fn(map, data->user);
-	if (data->res < 0)
-		return -1;
-
-	if (!data->res)
-		return -1;
-
-	return 0;
-}
-
-/* Check if fn(map, user) returns true for all maps "map" in umap.
- */
-static int union_map_forall_user(__isl_keep isl_union_map *umap,
-	int (*fn)(__isl_keep isl_map *map, void *user), void *user)
-{
-	struct isl_forall_user_data data = { 1, fn, user };
-
-	if (!umap)
-		return -1;
-
-	if (isl_hash_table_foreach(umap->dim->ctx, &umap->table,
-				   &forall_user_entry, &data) < 0 && data.res)
-		return -1;
-
-	return data.res;
-}
-
-int isl_union_map_is_empty(__isl_keep isl_union_map *umap)
-{
-	return union_map_forall(umap, &isl_map_is_empty);
-}
-
-int isl_union_set_is_empty(__isl_keep isl_union_set *uset)
-{
-	return isl_union_map_is_empty(uset);
-}
-
-static int is_subset_of_identity(__isl_keep isl_map *map)
-{
-	int is_subset;
-	isl_space *dim;
-	isl_map *id;
-
-	if (!map)
-		return -1;
-
-	if (!isl_space_tuple_match(map->dim, isl_dim_in, map->dim, isl_dim_out))
-		return 0;
-
-	dim = isl_map_get_space(map);
-	id = isl_map_identity(dim);
-
-	is_subset = isl_map_is_subset(map, id);
-
-	isl_map_free(id);
-
-	return is_subset;
-}
-
-/* Check if the given map is single-valued.
- * We simply compute
- *
- *	M \circ M^-1
- *
- * and check if the result is a subset of the identity mapping.
- */
-int isl_union_map_is_single_valued(__isl_keep isl_union_map *umap)
-{
-	isl_union_map *test;
-	int sv;
-
-	if (isl_union_map_n_map(umap) == 1) {
-		isl_map *map;
-		umap = isl_union_map_copy(umap);
-		map = isl_map_from_union_map(umap);
-		sv = isl_map_is_single_valued(map);
-		isl_map_free(map);
-		return sv;
-	}
-
-	test = isl_union_map_reverse(isl_union_map_copy(umap));
-	test = isl_union_map_apply_range(test, isl_union_map_copy(umap));
-
-	sv = union_map_forall(test, &is_subset_of_identity);
-
-	isl_union_map_free(test);
-
-	return sv;
-}
-
-int isl_union_map_is_injective(__isl_keep isl_union_map *umap)
-{
-	int in;
-
-	umap = isl_union_map_copy(umap);
-	umap = isl_union_map_reverse(umap);
-	in = isl_union_map_is_single_valued(umap);
-	isl_union_map_free(umap);
-
-	return in;
-}
-
-/* Represents a map that has a fixed value (v) for one of its
- * range dimensions.
- * The map in this structure is not reference counted, so it
- * is only valid while the isl_union_map from which it was
- * obtained is still alive.
- */
-struct isl_fixed_map {
-	isl_int v;
-	isl_map *map;
-};
-
-static struct isl_fixed_map *alloc_isl_fixed_map_array(isl_ctx *ctx,
-	int n)
-{
-	int i;
-	struct isl_fixed_map *v;
-
-	v = isl_calloc_array(ctx, struct isl_fixed_map, n);
-	if (!v)
-		return NULL;
-	for (i = 0; i < n; ++i)
-		isl_int_init(v[i].v);
-	return v;
-}
-
-static void free_isl_fixed_map_array(struct isl_fixed_map *v, int n)
-{
-	int i;
-
-	if (!v)
-		return;
-	for (i = 0; i < n; ++i)
-		isl_int_clear(v[i].v);
-	free(v);
-}
-
-/* Compare the "v" field of two isl_fixed_map structs.
- */
-static int qsort_fixed_map_cmp(const void *p1, const void *p2)
-{
-	const struct isl_fixed_map *e1 = (const struct isl_fixed_map *) p1;
-	const struct isl_fixed_map *e2 = (const struct isl_fixed_map *) p2;
-
-	return isl_int_cmp(e1->v, e2->v);
-}
-
-/* Internal data structure used while checking whether all maps
- * in a union_map have a fixed value for a given output dimension.
- * v is the list of maps, with the fixed value for the dimension
- * n is the number of maps considered so far
- * pos is the output dimension under investigation
- */
-struct isl_fixed_dim_data {
-	struct isl_fixed_map *v;
-	int n;
-	int pos;
-};
-
-static int fixed_at_pos(__isl_keep isl_map *map, void *user)
-{
-	struct isl_fixed_dim_data *data = user;
-
-	data->v[data->n].map = map;
-	return isl_map_plain_is_fixed(map, isl_dim_out, data->pos,
-				      &data->v[data->n++].v);
-}
-
-static int plain_injective_on_range(__isl_take isl_union_map *umap,
-	int first, int n_range);
-
-/* Given a list of the maps, with their fixed values at output dimension "pos",
- * check whether the ranges of the maps form an obvious partition.
- *
- * We first sort the maps according to their fixed values.
- * If all maps have a different value, then we know the ranges form
- * a partition.
- * Otherwise, we collect the maps with the same fixed value and
- * check whether each such collection is obviously injective
- * based on later dimensions.
- */
-static int separates(struct isl_fixed_map *v, int n,
-	__isl_take isl_space *dim, int pos, int n_range)
-{
-	int i;
-
-	if (!v)
-		goto error;
-
-	qsort(v, n, sizeof(*v), &qsort_fixed_map_cmp);
-
-	for (i = 0; i + 1 < n; ++i) {
-		int j, k;
-		isl_union_map *part;
-		int injective;
-
-		for (j = i + 1; j < n; ++j)
-			if (isl_int_ne(v[i].v, v[j].v))
-				break;
-
-		if (j == i + 1)
-			continue;
-
-		part = isl_union_map_alloc(isl_space_copy(dim), j - i);
-		for (k = i; k < j; ++k)
-			part = isl_union_map_add_map(part,
-						     isl_map_copy(v[k].map));
-
-		injective = plain_injective_on_range(part, pos + 1, n_range);
-		if (injective < 0)
-			goto error;
-		if (!injective)
-			break;
-
-		i = j - 1;
-	}
-
-	isl_space_free(dim);
-	free_isl_fixed_map_array(v, n);
-	return i + 1 >= n;
-error:
-	isl_space_free(dim);
-	free_isl_fixed_map_array(v, n);
-	return -1;
-}
-
-/* Check whether the maps in umap have obviously distinct ranges.
- * In particular, check for an output dimension in the range
- * [first,n_range) for which all maps have a fixed value
- * and then check if these values, possibly along with fixed values
- * at later dimensions, entail distinct ranges.
- */
-static int plain_injective_on_range(__isl_take isl_union_map *umap,
-	int first, int n_range)
-{
-	isl_ctx *ctx;
-	int n;
-	struct isl_fixed_dim_data data = { NULL };
-
-	ctx = isl_union_map_get_ctx(umap);
-
-	if (!umap)
-		goto error;
-
-	n = isl_union_map_n_map(umap);
-	if (n <= 1) {
-		isl_union_map_free(umap);
-		return 1;
-	}
-
-	if (first >= n_range) {
-		isl_union_map_free(umap);
-		return 0;
-	}
-
-	data.v = alloc_isl_fixed_map_array(ctx, n);
-	if (!data.v)
-		goto error;
-
-	for (data.pos = first; data.pos < n_range; ++data.pos) {
-		int fixed;
-		int injective;
-		isl_space *dim;
-
-		data.n = 0;
-		fixed = union_map_forall_user(umap, &fixed_at_pos, &data);
-		if (fixed < 0)
-			goto error;
-		if (!fixed)
-			continue;
-		dim = isl_union_map_get_space(umap);
-		injective = separates(data.v, n, dim, data.pos, n_range);
-		isl_union_map_free(umap);
-		return injective;
-	}
-
-	free_isl_fixed_map_array(data.v, n);
-	isl_union_map_free(umap);
-
-	return 0;
-error:
-	free_isl_fixed_map_array(data.v, n);
-	isl_union_map_free(umap);
-	return -1;
-}
-
-/* Check whether the maps in umap that map to subsets of "ran"
- * have obviously distinct ranges.
- */
-static int plain_injective_on_range_wrap(__isl_keep isl_set *ran, void *user)
-{
-	isl_union_map *umap = user;
-
-	umap = isl_union_map_copy(umap);
-	umap = isl_union_map_intersect_range(umap,
-			isl_union_set_from_set(isl_set_copy(ran)));
-	return plain_injective_on_range(umap, 0, isl_set_dim(ran, isl_dim_set));
-}
-
-/* Check if the given union_map is obviously injective.
- *
- * In particular, we first check if all individual maps are obviously
- * injective and then check if all the ranges of these maps are
- * obviously disjoint.
- */
-int isl_union_map_plain_is_injective(__isl_keep isl_union_map *umap)
-{
-	int in;
-	isl_union_map *univ;
-	isl_union_set *ran;
-
-	in = union_map_forall(umap, &isl_map_plain_is_injective);
-	if (in < 0)
-		return -1;
-	if (!in)
-		return 0;
-
-	univ = isl_union_map_universe(isl_union_map_copy(umap));
-	ran = isl_union_map_range(univ);
-
-	in = union_map_forall_user(ran, &plain_injective_on_range_wrap, umap);
-
-	isl_union_set_free(ran);
-
-	return in;
-}
-
-int isl_union_map_is_bijective(__isl_keep isl_union_map *umap)
-{
-	int sv;
-
-	sv = isl_union_map_is_single_valued(umap);
-	if (sv < 0 || !sv)
-		return sv;
-
-	return isl_union_map_is_injective(umap);
-}
-
-static int zip_entry(void **entry, void *user)
-{
-	isl_map *map = *entry;
-	isl_union_map **res = user;
-
-	if (!isl_map_can_zip(map))
-		return 0;
-
-	*res = isl_union_map_add_map(*res, isl_map_zip(isl_map_copy(map)));
-
-	return 0;
-}
-
-__isl_give isl_union_map *isl_union_map_zip(__isl_take isl_union_map *umap)
-{
-	return cond_un_op(umap, &zip_entry);
-}
-
-static int lift_entry(void **entry, void *user)
-{
-	isl_set *set = *entry;
-	isl_union_set **res = user;
-
-	*res = isl_union_set_add_set(*res, isl_set_lift(isl_set_copy(set)));
-
-	return 0;
-}
-
-__isl_give isl_union_set *isl_union_set_lift(__isl_take isl_union_set *uset)
-{
-	return cond_un_op(uset, &lift_entry);
-}
-
-static int coefficients_entry(void **entry, void *user)
-{
-	isl_set *set = *entry;
-	isl_union_set **res = user;
-
-	set = isl_set_copy(set);
-	set = isl_set_from_basic_set(isl_set_coefficients(set));
-	*res = isl_union_set_add_set(*res, set);
-
-	return 0;
-}
-
-__isl_give isl_union_set *isl_union_set_coefficients(
-	__isl_take isl_union_set *uset)
-{
-	isl_ctx *ctx;
-	isl_space *dim;
-	isl_union_set *res;
-
-	if (!uset)
-		return NULL;
-
-	ctx = isl_union_set_get_ctx(uset);
-	dim = isl_space_set_alloc(ctx, 0, 0);
-	res = isl_union_map_alloc(dim, uset->table.n);
-	if (isl_hash_table_foreach(uset->dim->ctx, &uset->table,
-				   &coefficients_entry, &res) < 0)
-		goto error;
-
-	isl_union_set_free(uset);
-	return res;
-error:
-	isl_union_set_free(uset);
-	isl_union_set_free(res);
-	return NULL;
-}
-
-static int solutions_entry(void **entry, void *user)
-{
-	isl_set *set = *entry;
-	isl_union_set **res = user;
-
-	set = isl_set_copy(set);
-	set = isl_set_from_basic_set(isl_set_solutions(set));
-	if (!*res)
-		*res = isl_union_set_from_set(set);
-	else
-		*res = isl_union_set_add_set(*res, set);
-
-	if (!*res)
-		return -1;
-
-	return 0;
-}
-
-__isl_give isl_union_set *isl_union_set_solutions(
-	__isl_take isl_union_set *uset)
-{
-	isl_union_set *res = NULL;
-
-	if (!uset)
-		return NULL;
-
-	if (uset->table.n == 0) {
-		res = isl_union_set_empty(isl_union_set_get_space(uset));
-		isl_union_set_free(uset);
-		return res;
-	}
-
-	if (isl_hash_table_foreach(uset->dim->ctx, &uset->table,
-				   &solutions_entry, &res) < 0)
-		goto error;
-
-	isl_union_set_free(uset);
-	return res;
-error:
-	isl_union_set_free(uset);
-	isl_union_set_free(res);
-	return NULL;
-}
diff --git a/cloog-0.17.0/isl/isl_union_map_private.h b/cloog-0.17.0/isl/isl_union_map_private.h
deleted file mode 100644
index c0266c0..0000000
--- a/cloog-0.17.0/isl/isl_union_map_private.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#define isl_union_set	isl_union_map
-#include <isl/union_map.h>
-
-struct isl_union_map {
-	int ref;
-	isl_space *dim;
-
-	struct isl_hash_table	table;
-};
diff --git a/cloog-0.17.0/isl/isl_union_templ.c b/cloog-0.17.0/isl/isl_union_templ.c
deleted file mode 100644
index 498badf..0000000
--- a/cloog-0.17.0/isl/isl_union_templ.c
+++ /dev/null
@@ -1,801 +0,0 @@
-/*
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France 
- */
-
-#define xFN(TYPE,NAME) TYPE ## _ ## NAME
-#define FN(TYPE,NAME) xFN(TYPE,NAME)
-#define xS(TYPE,NAME) struct TYPE ## _ ## NAME
-#define S(TYPE,NAME) xS(TYPE,NAME)
-
-struct UNION {
-	int ref;
-#ifdef HAS_TYPE
-	enum isl_fold type;
-#endif
-	isl_space *dim;
-
-	struct isl_hash_table	table;
-};
-
-__isl_give UNION *FN(UNION,cow)(__isl_take UNION *u);
-
-isl_ctx *FN(UNION,get_ctx)(__isl_keep UNION *u)
-{
-	return u ? u->dim->ctx : NULL;
-}
-
-__isl_give isl_space *FN(UNION,get_space)(__isl_keep UNION *u)
-{
-	if (!u)
-		return NULL;
-	return isl_space_copy(u->dim);
-}
-
-#ifdef HAS_TYPE
-static __isl_give UNION *FN(UNION,alloc)(__isl_take isl_space *dim,
-	enum isl_fold type, int size)
-#else
-static __isl_give UNION *FN(UNION,alloc)(__isl_take isl_space *dim, int size)
-#endif
-{
-	UNION *u;
-
-	dim = isl_space_params(dim);
-	if (!dim)
-		return NULL;
-
-	u = isl_calloc_type(dim->ctx, UNION);
-	if (!u)
-		return NULL;
-
-	u->ref = 1;
-#ifdef HAS_TYPE
-	u->type = type;
-#endif
-	u->dim = dim;
-	if (isl_hash_table_init(dim->ctx, &u->table, size) < 0)
-		goto error;
-
-	return u;
-error:
-	isl_space_free(dim);
-	FN(UNION,free)(u);
-	return NULL;
-}
-
-#ifdef HAS_TYPE
-__isl_give UNION *FN(UNION,zero)(__isl_take isl_space *dim, enum isl_fold type)
-{
-	return FN(UNION,alloc)(dim, type, 16);
-}
-#else
-__isl_give UNION *FN(UNION,zero)(__isl_take isl_space *dim)
-{
-	return FN(UNION,alloc)(dim, 16);
-}
-#endif
-
-__isl_give UNION *FN(UNION,copy)(__isl_keep UNION *u)
-{
-	if (!u)
-		return NULL;
-
-	u->ref++;
-	return u;
-}
-
-S(UNION,foreach_data)
-{
-	int (*fn)(__isl_take PART *part, void *user);
-	void *user;
-};
-
-static int call_on_copy(void **entry, void *user)
-{
-	PART *part = *entry;
-	S(UNION,foreach_data) *data = (S(UNION,foreach_data) *)user;
-
-	return data->fn(FN(PART,copy)(part), data->user);
-}
-
-int FN(FN(UNION,foreach),PARTS)(__isl_keep UNION *u,
-	int (*fn)(__isl_take PART *part, void *user), void *user)
-{
-	S(UNION,foreach_data) data = { fn, user };
-
-	if (!u)
-		return -1;
-
-	return isl_hash_table_foreach(u->dim->ctx, &u->table,
-				      &call_on_copy, &data);
-}
-
-static int has_dim(const void *entry, const void *val)
-{
-	PART *part = (PART *)entry;
-	isl_space *dim = (isl_space *)val;
-
-	return isl_space_is_equal(part->dim, dim);
-}
-
-__isl_give PART *FN(FN(UNION,extract),PARTS)(__isl_keep UNION *u,
-	__isl_take isl_space *dim)
-{
-	uint32_t hash;
-	struct isl_hash_table_entry *entry;
-
-	if (!u || !dim)
-		goto error;
-
-	hash = isl_space_get_hash(dim);
-	entry = isl_hash_table_find(u->dim->ctx, &u->table, hash,
-				    &has_dim, dim, 0);
-	if (!entry)
-#ifdef HAS_TYPE
-		return FN(PART,zero)(dim, u->type);
-#else
-		return FN(PART,zero)(dim);
-#endif
-	isl_space_free(dim);
-	return FN(PART,copy)(entry->data);
-error:
-	isl_space_free(dim);
-	return NULL;
-}
-
-__isl_give UNION *FN(FN(UNION,add),PARTS)(__isl_take UNION *u,
-	__isl_take PART *part)
-{
-	uint32_t hash;
-	struct isl_hash_table_entry *entry;
-
-	if (!part)
-		goto error;
-
-	if (FN(PART,is_zero)(part)) {
-		FN(PART,free)(part);
-		return u;
-	}
-
-	u = FN(UNION,cow)(u);
-
-	if (!u)
-		goto error;
-
-	isl_assert(u->dim->ctx, isl_space_match(part->dim, isl_dim_param, u->dim,
-					      isl_dim_param), goto error);
-
-	hash = isl_space_get_hash(part->dim);
-	entry = isl_hash_table_find(u->dim->ctx, &u->table, hash,
-				    &has_dim, part->dim, 1);
-	if (!entry)
-		goto error;
-
-	if (!entry->data)
-		entry->data = part;
-	else {
-		entry->data = FN(PART,add)(entry->data, FN(PART,copy)(part));
-		if (!entry->data)
-			goto error;
-		FN(PART,free)(part);
-		if (FN(PART,is_zero)(entry->data)) {
-			FN(PART,free)(entry->data);
-			isl_hash_table_remove(u->dim->ctx, &u->table, entry);
-		}
-	}
-
-	return u;
-error:
-	FN(PART,free)(part);
-	FN(UNION,free)(u);
-	return NULL;
-}
-
-static int add_part(__isl_take PART *part, void *user)
-{
-	UNION **u = (UNION **)user;
-
-	*u = FN(FN(UNION,add),PARTS)(*u, part);
-
-	return 0;
-}
-
-__isl_give UNION *FN(UNION,dup)(__isl_keep UNION *u)
-{
-	UNION *dup;
-
-	if (!u)
-		return NULL;
-
-#ifdef HAS_TYPE
-	dup = FN(UNION,zero)(isl_space_copy(u->dim), u->type);
-#else
-	dup = FN(UNION,zero)(isl_space_copy(u->dim));
-#endif
-	if (FN(FN(UNION,foreach),PARTS)(u, &add_part, &dup) < 0)
-		goto error;
-	return dup;
-error:
-	FN(UNION,free)(dup);
-	return NULL;
-}
-
-__isl_give UNION *FN(UNION,cow)(__isl_take UNION *u)
-{
-	if (!u)
-		return NULL;
-
-	if (u->ref == 1)
-		return u;
-	u->ref--;
-	return FN(UNION,dup)(u);
-}
-
-static int free_u_entry(void **entry, void *user)
-{
-	PART *part = *entry;
-	FN(PART,free)(part);
-	return 0;
-}
-
-void FN(UNION,free)(__isl_take UNION *u)
-{
-	if (!u)
-		return;
-
-	if (--u->ref > 0)
-		return;
-
-	isl_hash_table_foreach(u->dim->ctx, &u->table, &free_u_entry, NULL);
-	isl_hash_table_clear(&u->table);
-	isl_space_free(u->dim);
-	free(u);
-}
-
-S(UNION,align) {
-	isl_reordering *exp;
-	UNION *res;
-};
-
-#ifdef ALIGN_DOMAIN
-static int align_entry(__isl_take PART *part, void *user)
-{
-	isl_reordering *exp;
-	S(UNION,align) *data = user;
-
-	exp = isl_reordering_extend_space(isl_reordering_copy(data->exp),
-				    FN(PART,get_domain_space)(part));
-
-	data->res = FN(FN(UNION,add),PARTS)(data->res,
-					    FN(PART,realign_domain)(part, exp));
-
-	return 0;
-}
-#else
-static int align_entry(__isl_take PART *part, void *user)
-{
-	isl_reordering *exp;
-	S(UNION,align) *data = user;
-
-	exp = isl_reordering_extend_space(isl_reordering_copy(data->exp),
-				    FN(PART,get_space)(part));
-
-	data->res = FN(FN(UNION,add),PARTS)(data->res,
-					    FN(PART,realign)(part, exp));
-
-	return 0;
-}
-#endif
-
-__isl_give UNION *FN(UNION,align_params)(__isl_take UNION *u,
-	__isl_take isl_space *model)
-{
-	S(UNION,align) data = { NULL, NULL };
-
-	if (!u || !model)
-		goto error;
-
-	if (isl_space_match(u->dim, isl_dim_param, model, isl_dim_param)) {
-		isl_space_free(model);
-		return u;
-	}
-
-	data.exp = isl_parameter_alignment_reordering(u->dim, model);
-	if (!data.exp)
-		goto error;
-
-#ifdef HAS_TYPE
-	data.res = FN(UNION,alloc)(isl_space_copy(data.exp->dim),
-						u->type, u->table.n);
-#else
-	data.res = FN(UNION,alloc)(isl_space_copy(data.exp->dim), u->table.n);
-#endif
-	if (FN(FN(UNION,foreach),PARTS)(u, &align_entry, &data) < 0)
-		goto error;
-
-	isl_reordering_free(data.exp);
-	FN(UNION,free)(u);
-	isl_space_free(model);
-	return data.res;
-error:
-	isl_reordering_free(data.exp);
-	FN(UNION,free)(u);
-	FN(UNION,free)(data.res);
-	isl_space_free(model);
-	return NULL;
-}
-
-__isl_give UNION *FN(UNION,add)(__isl_take UNION *u1, __isl_take UNION *u2)
-{
-	u1 = FN(UNION,align_params)(u1, FN(UNION,get_space)(u2));
-	u2 = FN(UNION,align_params)(u2, FN(UNION,get_space)(u1));
-
-	u1 = FN(UNION,cow)(u1);
-
-	if (!u1 || !u2)
-		goto error;
-
-	if (FN(FN(UNION,foreach),PARTS)(u2, &add_part, &u1) < 0)
-		goto error;
-
-	FN(UNION,free)(u2);
-
-	return u1;
-error:
-	FN(UNION,free)(u1);
-	FN(UNION,free)(u2);
-	return NULL;
-}
-
-__isl_give UNION *FN(FN(UNION,from),PARTS)(__isl_take PART *part)
-{
-	isl_space *dim;
-	UNION *u;
-
-	if (!part)
-		return NULL;
-
-	dim = FN(PART,get_space)(part);
-	dim = isl_space_drop_dims(dim, isl_dim_in, 0, isl_space_dim(dim, isl_dim_in));
-	dim = isl_space_drop_dims(dim, isl_dim_out, 0, isl_space_dim(dim, isl_dim_out));
-#ifdef HAS_TYPE
-	u = FN(UNION,zero)(dim, part->type);
-#else
-	u = FN(UNION,zero)(dim);
-#endif
-	u = FN(FN(UNION,add),PARTS)(u, part);
-
-	return u;
-}
-
-S(UNION,match_bin_data) {
-	UNION *u2;
-	UNION *res;
-};
-
-/* This function is currently only used from isl_polynomial.c
- * and not from isl_fold.c.
- */
-static __isl_give UNION *match_bin_op(__isl_take UNION *u1,
-	__isl_take UNION *u2,
-	int (*fn)(void **, void *)) __attribute__ ((unused));
-static __isl_give UNION *match_bin_op(__isl_take UNION *u1,
-	__isl_take UNION *u2, int (*fn)(void **, void *))
-{
-	S(UNION,match_bin_data) data = { NULL, NULL };
-
-	u1 = FN(UNION,align_params)(u1, FN(UNION,get_space)(u2));
-	u2 = FN(UNION,align_params)(u2, FN(UNION,get_space)(u1));
-
-	if (!u1 || !u2)
-		goto error;
-
-	data.u2 = u2;
-#ifdef HAS_TYPE
-	data.res = FN(UNION,alloc)(isl_space_copy(u1->dim), u1->type, u1->table.n);
-#else
-	data.res = FN(UNION,alloc)(isl_space_copy(u1->dim), u1->table.n);
-#endif
-	if (isl_hash_table_foreach(u1->dim->ctx, &u1->table, fn, &data) < 0)
-		goto error;
-
-	FN(UNION,free)(u1);
-	FN(UNION,free)(u2);
-	return data.res;
-error:
-	FN(UNION,free)(u1);
-	FN(UNION,free)(u2);
-	FN(UNION,free)(data.res);
-	return NULL;
-}
-
-S(UNION,any_set_data) {
-	isl_set *set;
-	UNION *res;
-	__isl_give PW *(*fn)(__isl_take PW*, __isl_take isl_set*);
-};
-
-static int any_set_entry(void **entry, void *user)
-{
-	S(UNION,any_set_data) *data = user;
-	PW *pw = *entry;
-	int empty;
-
-	pw = FN(PW,copy)(pw);
-	pw = data->fn(pw, isl_set_copy(data->set));
-
-	empty = FN(PW,is_zero)(pw);
-	if (empty < 0) {
-		FN(PW,free)(pw);
-		return -1;
-	}
-	if (empty) {
-		FN(PW,free)(pw);
-		return 0;
-	}
-
-	data->res = FN(FN(UNION,add),PARTS)(data->res, pw);
-
-	return 0;
-}
-
-/* Update each element of "u" by calling "fn" on the element and "set".
- */
-static __isl_give UNION *any_set_op(__isl_take UNION *u,
-	__isl_take isl_set *set,
-	__isl_give PW *(*fn)(__isl_take PW*, __isl_take isl_set*))
-{
-	S(UNION,any_set_data) data = { NULL, NULL, fn };
-
-	u = FN(UNION,align_params)(u, isl_set_get_space(set));
-	set = isl_set_align_params(set, FN(UNION,get_space)(u));
-
-	if (!u || !set)
-		goto error;
-
-	data.set = set;
-#ifdef HAS_TYPE
-	data.res = FN(UNION,alloc)(isl_space_copy(u->dim), u->type, u->table.n);
-#else
-	data.res = FN(UNION,alloc)(isl_space_copy(u->dim), u->table.n);
-#endif
-	if (isl_hash_table_foreach(u->dim->ctx, &u->table,
-				   &any_set_entry, &data) < 0)
-		goto error;
-
-	FN(UNION,free)(u);
-	isl_set_free(set);
-	return data.res;
-error:
-	FN(UNION,free)(u);
-	isl_set_free(set);
-	FN(UNION,free)(data.res);
-	return NULL;
-}
-
-/* Intersect the domain of "u" with the parameter domain "context".
- */
-__isl_give UNION *FN(UNION,intersect_params)(__isl_take UNION *u,
-	__isl_take isl_set *set)
-{
-	return any_set_op(u, set, &FN(PW,intersect_params));
-}
-
-/* Compute the gist of the domain of "u" with respect to
- * the parameter domain "context".
- */
-__isl_give UNION *FN(UNION,gist_params)(__isl_take UNION *u,
-	__isl_take isl_set *set)
-{
-	return any_set_op(u, set, &FN(PW,gist_params));
-}
-
-S(UNION,match_domain_data) {
-	isl_union_set *uset;
-	UNION *res;
-	__isl_give PW *(*fn)(__isl_take PW*, __isl_take isl_set*);
-};
-
-static int set_has_dim(const void *entry, const void *val)
-{
-	isl_set *set = (isl_set *)entry;
-	isl_space *dim = (isl_space *)val;
-
-	return isl_space_is_equal(set->dim, dim);
-}
-
-/* Find the set in data->uset that live in the same space as the domain
- * of *entry, apply data->fn to *entry and this set (if any), and add
- * the result to data->res.
- */
-static int match_domain_entry(void **entry, void *user)
-{
-	S(UNION,match_domain_data) *data = user;
-	uint32_t hash;
-	struct isl_hash_table_entry *entry2;
-	PW *pw = *entry;
-	isl_space *space;
-	int empty;
-
-	space = FN(PW,get_domain_space)(pw);
-	hash = isl_space_get_hash(space);
-	entry2 = isl_hash_table_find(data->uset->dim->ctx, &data->uset->table,
-				     hash, &set_has_dim, space, 0);
-	isl_space_free(space);
-	if (!entry2)
-		return 0;
-
-	pw = FN(PW,copy)(pw);
-	pw = data->fn(pw, isl_set_copy(entry2->data));
-
-	empty = FN(PW,is_zero)(pw);
-	if (empty < 0) {
-		FN(PW,free)(pw);
-		return -1;
-	}
-	if (empty) {
-		FN(PW,free)(pw);
-		return 0;
-	}
-
-	data->res = FN(FN(UNION,add),PARTS)(data->res, pw);
-
-	return 0;
-}
-
-/* Apply fn to each pair of PW in u and set in uset such that
- * the set lives in the same space as the domain of PW
- * and collect the results.
- */
-static __isl_give UNION *match_domain_op(__isl_take UNION *u,
-	__isl_take isl_union_set *uset,
-	__isl_give PW *(*fn)(__isl_take PW*, __isl_take isl_set*))
-{
-	S(UNION,match_domain_data) data = { NULL, NULL, fn };
-
-	u = FN(UNION,align_params)(u, isl_union_set_get_space(uset));
-	uset = isl_union_set_align_params(uset, FN(UNION,get_space)(u));
-
-	if (!u || !uset)
-		goto error;
-
-	data.uset = uset;
-#ifdef HAS_TYPE
-	data.res = FN(UNION,alloc)(isl_space_copy(u->dim), u->type, u->table.n);
-#else
-	data.res = FN(UNION,alloc)(isl_space_copy(u->dim), u->table.n);
-#endif
-	if (isl_hash_table_foreach(u->dim->ctx, &u->table,
-				   &match_domain_entry, &data) < 0)
-		goto error;
-
-	FN(UNION,free)(u);
-	isl_union_set_free(uset);
-	return data.res;
-error:
-	FN(UNION,free)(u);
-	isl_union_set_free(uset);
-	FN(UNION,free)(data.res);
-	return NULL;
-}
-
-/* Intersect the domain of "u" with "uset".
- * If "uset" is a parameters domain, then intersect the parameter
- * domain of "u" with this set.
- */
-__isl_give UNION *FN(UNION,intersect_domain)(__isl_take UNION *u,
-	__isl_take isl_union_set *uset)
-{
-	if (isl_union_set_is_params(uset))
-		return FN(UNION,intersect_params)(u,
-						isl_set_from_union_set(uset));
-	return match_domain_op(u, uset, &FN(PW,intersect_domain));
-}
-
-__isl_give UNION *FN(UNION,gist)(__isl_take UNION *u,
-	__isl_take isl_union_set *uset)
-{
-	if (isl_union_set_is_params(uset))
-		return FN(UNION,gist_params)(u, isl_set_from_union_set(uset));
-	return match_domain_op(u, uset, &FN(PW,gist));
-}
-
-__isl_give isl_qpolynomial *FN(UNION,eval)(__isl_take UNION *u,
-	__isl_take isl_point *pnt)
-{
-	uint32_t hash;
-	struct isl_hash_table_entry *entry;
-	isl_space *space;
-	isl_qpolynomial *qp;
-
-	if (!u || !pnt)
-		goto error;
-
-	space = isl_space_copy(pnt->dim);
-	space = isl_space_from_domain(space);
-	space = isl_space_add_dims(space, isl_dim_out, 1);
-	if (!space)
-		goto error;
-	hash = isl_space_get_hash(space);
-	entry = isl_hash_table_find(u->dim->ctx, &u->table,
-				    hash, &has_dim, space, 0);
-	isl_space_free(space);
-	if (!entry) {
-		qp = isl_qpolynomial_zero_on_domain(isl_space_copy(pnt->dim));
-		isl_point_free(pnt);
-	} else {
-		qp = FN(PART,eval)(FN(PART,copy)(entry->data), pnt);
-	}
-	FN(UNION,free)(u);
-	return qp;
-error:
-	FN(UNION,free)(u);
-	isl_point_free(pnt);
-	return NULL;
-}
-
-static int coalesce_entry(void **entry, void *user)
-{
-	PW **pw = (PW **)entry;
-
-	*pw = FN(PW,coalesce)(*pw);
-	if (!*pw)
-		return -1;
-
-	return 0;
-}
-
-__isl_give UNION *FN(UNION,coalesce)(__isl_take UNION *u)
-{
-	if (!u)
-		return NULL;
-
-	if (isl_hash_table_foreach(u->dim->ctx, &u->table,
-				   &coalesce_entry, NULL) < 0)
-		goto error;
-
-	return u;
-error:
-	FN(UNION,free)(u);
-	return NULL;
-}
-
-static int domain(__isl_take PART *part, void *user)
-{
-	isl_union_set **uset = (isl_union_set **)user;
-
-	*uset = isl_union_set_add_set(*uset, FN(PART,domain)(part));
-
-	return 0;
-}
-
-__isl_give isl_union_set *FN(UNION,domain)(__isl_take UNION *u)
-{
-	isl_union_set *uset;
-
-	uset = isl_union_set_empty(FN(UNION,get_space)(u));
-	if (FN(FN(UNION,foreach),PARTS)(u, &domain, &uset) < 0)
-		goto error;
-
-	FN(UNION,free)(u);
-	
-	return uset;
-error:
-	isl_union_set_free(uset);
-	FN(UNION,free)(u);
-	return NULL;
-}
-
-static int mul_isl_int(void **entry, void *user)
-{
-	PW **pw = (PW **)entry;
-	isl_int *v = user;
-
-	*pw = FN(PW,mul_isl_int)(*pw, *v);
-	if (!*pw)
-		return -1;
-
-	return 0;
-}
-
-__isl_give UNION *FN(UNION,mul_isl_int)(__isl_take UNION *u, isl_int v)
-{
-	if (isl_int_is_one(v))
-		return u;
-
-	if (u && isl_int_is_zero(v)) {
-		UNION *zero;
-		isl_space *dim = FN(UNION,get_space)(u);
-#ifdef HAS_TYPE
-		zero = FN(UNION,zero)(dim, u->type);
-#else
-		zero = FN(UNION,zero)(dim);
-#endif
-		FN(UNION,free)(u);
-		return zero;
-	}
-
-	u = FN(UNION,cow)(u);
-	if (!u)
-		return NULL;
-
-#ifdef HAS_TYPE
-	if (isl_int_is_neg(v))
-		u->type = isl_fold_type_negate(u->type);
-#endif
-	if (isl_hash_table_foreach(u->dim->ctx, &u->table, &mul_isl_int, v) < 0)
-		goto error;
-
-	return u;
-error:
-	FN(UNION,free)(u);
-	return NULL;
-}
-
-S(UNION,plain_is_equal_data)
-{
-	UNION *u2;
-	int is_equal;
-};
-
-static int plain_is_equal_entry(void **entry, void *user)
-{
-	S(UNION,plain_is_equal_data) *data = user;
-	uint32_t hash;
-	struct isl_hash_table_entry *entry2;
-	PW *pw = *entry;
-
-	hash = isl_space_get_hash(pw->dim);
-	entry2 = isl_hash_table_find(data->u2->dim->ctx, &data->u2->table,
-				     hash, &has_dim, pw->dim, 0);
-	if (!entry2) {
-		data->is_equal = 0;
-		return -1;
-	}
-
-	data->is_equal = FN(PW,plain_is_equal)(pw, entry2->data);
-	if (data->is_equal < 0 || !data->is_equal)
-		return -1;
-
-	return 0;
-}
-
-int FN(UNION,plain_is_equal)(__isl_keep UNION *u1, __isl_keep UNION *u2)
-{
-	S(UNION,plain_is_equal_data) data = { NULL, 1 };
-
-	if (!u1 || !u2)
-		return -1;
-	if (u1 == u2)
-		return 1;
-	if (u1->table.n != u2->table.n)
-		return 0;
-
-	u1 = FN(UNION,copy)(u1);
-	u2 = FN(UNION,copy)(u2);
-	u1 = FN(UNION,align_params)(u1, FN(UNION,get_space)(u2));
-	u2 = FN(UNION,align_params)(u2, FN(UNION,get_space)(u1));
-	if (!u1 || !u2)
-		goto error;
-
-	data.u2 = u2;
-	if (isl_hash_table_foreach(u1->dim->ctx, &u1->table,
-				   &plain_is_equal_entry, &data) < 0 &&
-	    data.is_equal)
-		goto error;
-
-	FN(UNION,free)(u1);
-	FN(UNION,free)(u2);
-
-	return data.is_equal;
-error:
-	FN(UNION,free)(u1);
-	FN(UNION,free)(u2);
-	return -1;
-}
diff --git a/cloog-0.17.0/isl/isl_vec.c b/cloog-0.17.0/isl/isl_vec.c
deleted file mode 100644
index 61bd57f..0000000
--- a/cloog-0.17.0/isl/isl_vec.c
+++ /dev/null
@@ -1,344 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl_ctx_private.h>
-#include <isl/seq.h>
-#include <isl/vec.h>
-
-isl_ctx *isl_vec_get_ctx(__isl_keep isl_vec *vec)
-{
-	return vec ? vec->ctx : NULL;
-}
-
-struct isl_vec *isl_vec_alloc(struct isl_ctx *ctx, unsigned size)
-{
-	struct isl_vec *vec;
-
-	vec = isl_alloc_type(ctx, struct isl_vec);
-	if (!vec)
-		return NULL;
-
-	vec->block = isl_blk_alloc(ctx, size);
-	if (isl_blk_is_error(vec->block))
-		goto error;
-
-	vec->ctx = ctx;
-	isl_ctx_ref(ctx);
-	vec->ref = 1;
-	vec->size = size;
-	vec->el = vec->block.data;
-
-	return vec;
-error:
-	isl_blk_free(ctx, vec->block);
-	return NULL;
-}
-
-__isl_give isl_vec *isl_vec_extend(__isl_take isl_vec *vec, unsigned size)
-{
-	if (!vec)
-		return NULL;
-	if (size <= vec->size)
-		return vec;
-
-	vec = isl_vec_cow(vec);
-	if (!vec)
-		return NULL;
-
-	vec->block = isl_blk_extend(vec->ctx, vec->block, size);
-	if (!vec->block.data)
-		goto error;
-
-	vec->size = size;
-	vec->el = vec->block.data;
-
-	return vec;
-error:
-	isl_vec_free(vec);
-	return NULL;
-}
-
-__isl_give isl_vec *isl_vec_zero_extend(__isl_take isl_vec *vec, unsigned size)
-{
-	int extra;
-
-	if (!vec)
-		return NULL;
-	if (size <= vec->size)
-		return vec;
-
-	vec = isl_vec_cow(vec);
-	if (!vec)
-		return NULL;
-
-	extra = size - vec->size;
-	vec = isl_vec_extend(vec, size);
-	if (!vec)
-		return NULL;
-
-	isl_seq_clr(vec->el + size - extra, extra);
-
-	return vec;
-}
-
-struct isl_vec *isl_vec_copy(struct isl_vec *vec)
-{
-	if (!vec)
-		return NULL;
-
-	vec->ref++;
-	return vec;
-}
-
-struct isl_vec *isl_vec_dup(struct isl_vec *vec)
-{
-	struct isl_vec *vec2;
-
-	if (!vec)
-		return NULL;
-	vec2 = isl_vec_alloc(vec->ctx, vec->size);
-	isl_seq_cpy(vec2->el, vec->el, vec->size);
-	return vec2;
-}
-
-struct isl_vec *isl_vec_cow(struct isl_vec *vec)
-{
-	struct isl_vec *vec2;
-	if (!vec)
-		return NULL;
-
-	if (vec->ref == 1)
-		return vec;
-
-	vec2 = isl_vec_dup(vec);
-	isl_vec_free(vec);
-	return vec2;
-}
-
-void isl_vec_free(struct isl_vec *vec)
-{
-	if (!vec)
-		return;
-
-	if (--vec->ref > 0)
-		return;
-
-	isl_ctx_deref(vec->ctx);
-	isl_blk_free(vec->ctx, vec->block);
-	free(vec);
-}
-
-int isl_vec_is_equal(__isl_keep isl_vec *vec1, __isl_keep isl_vec *vec2)
-{
-	if (!vec1 || !vec2)
-		return -1;
-
-	if (vec1->size != vec2->size)
-		return 0;
-
-	return isl_seq_eq(vec1->el, vec2->el, vec1->size);
-}
-
-__isl_give isl_printer *isl_printer_print_vec(__isl_take isl_printer *printer,
-	__isl_keep isl_vec *vec)
-{
-	int i;
-
-	if (!printer || !vec)
-		goto error;
-
-	printer = isl_printer_print_str(printer, "[");
-	for (i = 0; i < vec->size; ++i) {
-		if (i)
-			printer = isl_printer_print_str(printer, ",");
-		printer = isl_printer_print_isl_int(printer, vec->el[i]);
-	}
-	printer = isl_printer_print_str(printer, "]");
-
-	return printer;
-error:
-	isl_printer_free(printer);
-	return NULL;
-}
-
-void isl_vec_dump(struct isl_vec *vec)
-{
-	isl_printer *printer;
-
-	if (!vec)
-		return;
-
-	printer = isl_printer_to_file(vec->ctx, stderr);
-	printer = isl_printer_print_vec(printer, vec);
-	printer = isl_printer_end_line(printer);
-
-	isl_printer_free(printer);
-}
-
-__isl_give isl_vec *isl_vec_clr(__isl_take isl_vec *vec)
-{
-	vec = isl_vec_cow(vec);
-	if (!vec)
-		return NULL;
-	isl_seq_clr(vec->el, vec->size);
-	return vec;
-}
-
-void isl_vec_lcm(struct isl_vec *vec, isl_int *lcm)
-{
-	isl_seq_lcm(vec->block.data, vec->size, lcm);
-}
-
-/* Given a rational vector, with the denominator in the first element
- * of the vector, round up all coordinates.
- */
-struct isl_vec *isl_vec_ceil(struct isl_vec *vec)
-{
-	vec = isl_vec_cow(vec);
-	if (!vec)
-		return NULL;
-
-	isl_seq_cdiv_q(vec->el + 1, vec->el + 1, vec->el[0], vec->size - 1);
-
-	isl_int_set_si(vec->el[0], 1);
-
-	return vec;
-}
-
-struct isl_vec *isl_vec_normalize(struct isl_vec *vec)
-{
-	if (!vec)
-		return NULL;
-	isl_seq_normalize(vec->ctx, vec->el, vec->size);
-	return vec;
-}
-
-__isl_give isl_vec *isl_vec_neg(__isl_take isl_vec *vec)
-{
-	vec = isl_vec_cow(vec);
-	if (!vec)
-		return NULL;
-	isl_seq_neg(vec->el, vec->el, vec->size);
-	return vec;
-}
-
-__isl_give isl_vec *isl_vec_scale(__isl_take isl_vec *vec, isl_int m)
-{
-	if (isl_int_is_one(m))
-		return vec;
-	vec = isl_vec_cow(vec);
-	if (!vec)
-		return NULL;
-	isl_seq_scale(vec->el, vec->el, m, vec->size);
-	return vec;
-}
-
-__isl_give isl_vec *isl_vec_add(__isl_take isl_vec *vec1,
-	__isl_take isl_vec *vec2)
-{
-	vec1 = isl_vec_cow(vec1);
-	if (!vec1 || !vec2)
-		goto error;
-
-	isl_assert(vec1->ctx, vec1->size == vec2->size, goto error);
-
-	isl_seq_combine(vec1->el, vec1->ctx->one, vec1->el,
-			vec1->ctx->one, vec2->el, vec1->size);
-	
-	isl_vec_free(vec2);
-	return vec1;
-error:
-	isl_vec_free(vec1);
-	isl_vec_free(vec2);
-	return NULL;
-}
-
-static int qsort_int_cmp(const void *p1, const void *p2)
-{
-	const isl_int *i1 = (const isl_int *) p1;
-	const isl_int *i2 = (const isl_int *) p2;
-
-	return isl_int_cmp(*i1, *i2);
-}
-
-__isl_give isl_vec *isl_vec_sort(__isl_take isl_vec *vec)
-{
-	if (!vec)
-		return NULL;
-	
-	qsort(vec->el, vec->size, sizeof(*vec->el), &qsort_int_cmp);
-
-	return vec;
-}
-
-__isl_give isl_vec *isl_vec_drop_els(__isl_take isl_vec *vec,
-	unsigned pos, unsigned n)
-{
-	if (n == 0)
-		return vec;
-	vec = isl_vec_cow(vec);
-	if (!vec)
-		return NULL;
-
-	if (pos + n > vec->size)
-		isl_die(vec->ctx, isl_error_invalid,
-			"range out of bounds", goto error);
-
-	if (pos + n != vec->size)
-		isl_seq_cpy(vec->el + pos, vec->el + pos + n,
-			    vec->size - pos - n);
-
-	vec->size -= n;
-	
-	return vec;
-error:
-	isl_vec_free(vec);
-	return NULL;
-}
-
-__isl_give isl_vec *isl_vec_insert_els(__isl_take isl_vec *vec,
-	unsigned pos, unsigned n)
-{
-	isl_vec *ext = NULL;
-
-	if (n == 0)
-		return vec;
-	if (!vec)
-		return NULL;
-
-	if (pos > vec->size)
-		isl_die(vec->ctx, isl_error_invalid,
-			"position out of bounds", goto error);
-
-	ext =  isl_vec_alloc(vec->ctx, vec->size + n);
-	if (!ext)
-		goto error;
-
-	isl_seq_cpy(ext->el, vec->el, pos);
-	isl_seq_cpy(ext->el + pos + n, vec->el + pos, vec->size - pos);
-
-	isl_vec_free(vec);
-	return ext;
-error:
-	isl_vec_free(vec);
-	isl_vec_free(ext);
-	return NULL;
-}
-
-__isl_give isl_vec *isl_vec_insert_zero_els(__isl_take isl_vec *vec,
-	unsigned pos, unsigned n)
-{
-	vec = isl_vec_insert_els(vec, pos, n);
-	if (!vec)
-		return NULL;
-
-	isl_seq_clr(vec->el + pos, n);
-
-	return vec;
-}
diff --git a/cloog-0.17.0/isl/isl_version.c b/cloog-0.17.0/isl/isl_version.c
deleted file mode 100644
index 1a59f55..0000000
--- a/cloog-0.17.0/isl/isl_version.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include "gitversion.h"
-
-const char *isl_version(void)
-{
-	return GIT_HEAD_ID"\n";
-}
diff --git a/cloog-0.17.0/isl/isl_vertices.c b/cloog-0.17.0/isl/isl_vertices.c
deleted file mode 100644
index e7d849e..0000000
--- a/cloog-0.17.0/isl/isl_vertices.c
+++ /dev/null
@@ -1,1569 +0,0 @@
-/*
- * Copyright 2010      INRIA Saclay
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
- * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
- * 91893 Orsay, France 
- */
-
-#include <isl_map_private.h>
-#include <isl/set.h>
-#include <isl/seq.h>
-#include <isl_tab.h>
-#include <isl_space_private.h>
-#include <isl_morph.h>
-#include <isl_vertices_private.h>
-#include <isl_mat_private.h>
-
-#define SELECTED	1
-#define DESELECTED	-1
-#define UNSELECTED	0
-
-static __isl_give isl_vertices *compute_chambers(__isl_take isl_basic_set *bset,
-	__isl_take isl_vertices *vertices);
-
-__isl_give isl_vertices *isl_vertices_copy(__isl_keep isl_vertices *vertices)
-{
-	if (!vertices)
-		return NULL;
-
-	vertices->ref++;
-	return vertices;
-}
-
-void isl_vertices_free(__isl_take isl_vertices *vertices)
-{
-	int i;
-
-	if (!vertices)
-		return;
-
-	if (--vertices->ref > 0)
-		return;
-
-	for (i = 0; i < vertices->n_vertices; ++i) {
-		isl_basic_set_free(vertices->v[i].vertex);
-		isl_basic_set_free(vertices->v[i].dom);
-	}
-	free(vertices->v);
-
-	for (i = 0; i < vertices->n_chambers; ++i) {
-		free(vertices->c[i].vertices);
-		isl_basic_set_free(vertices->c[i].dom);
-	}
-	free(vertices->c);
-
-	isl_basic_set_free(vertices->bset);
-	free(vertices);
-}
-
-struct isl_vertex_list {
-	struct isl_vertex v;
-	struct isl_vertex_list *next;
-};
-
-static void free_vertex_list(struct isl_vertex_list *list)
-{
-	struct isl_vertex_list *next;
-
-	for (; list; list = next) {
-		next = list->next;
-		isl_basic_set_free(list->v.vertex);
-		isl_basic_set_free(list->v.dom);
-		free(list);
-	}
-}
-
-static __isl_give isl_vertices *vertices_from_list(__isl_keep isl_basic_set *bset,
-	int n_vertices, struct isl_vertex_list *list)
-{
-	int i;
-	struct isl_vertex_list *next;
-	isl_vertices *vertices;
-
-	vertices = isl_calloc_type(bset->ctx, isl_vertices);
-	if (!vertices)
-		goto error;
-	vertices->ref = 1;
-	vertices->bset = isl_basic_set_copy(bset);
-	vertices->v = isl_alloc_array(bset->ctx, struct isl_vertex, n_vertices);
-	if (!vertices->v)
-		goto error;
-	vertices->n_vertices = n_vertices;
-
-	for (i = 0; list; list = next, i++) {
-		next = list->next;
-		vertices->v[i] = list->v;
-		free(list);
-	}
-
-	return vertices;
-error:
-	free(vertices);
-	free_vertex_list(list);
-	return NULL;
-}
-
-/* Prepend a vertex to the linked list "list" based on the equalities in "tab".
- */
-static int add_vertex(struct isl_vertex_list **list,
-	__isl_keep isl_basic_set *bset, struct isl_tab *tab)
-{
-	unsigned nvar;
-	unsigned nparam;
-	struct isl_vertex_list *v = NULL;
-
-	if (isl_tab_detect_implicit_equalities(tab) < 0)
-		return -1;
-
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-
-	v = isl_calloc_type(tab->mat->ctx, struct isl_vertex_list);
-	if (!v)
-		goto error;
-
-	v->v.vertex = isl_basic_set_copy(bset);
-	v->v.vertex = isl_basic_set_cow(v->v.vertex);
-	v->v.vertex = isl_basic_set_update_from_tab(v->v.vertex, tab);
-	v->v.vertex = isl_basic_set_simplify(v->v.vertex);
-	v->v.vertex = isl_basic_set_finalize(v->v.vertex);
-	if (!v->v.vertex)
-		goto error;
-	isl_assert(bset->ctx, v->v.vertex->n_eq >= nvar, goto error);
-	v->v.dom = isl_basic_set_copy(v->v.vertex);
-	v->v.dom = isl_basic_set_project_out(v->v.dom, isl_dim_set, 0, nvar);
-	if (!v->v.dom)
-		goto error;
-
-	v->next = *list;
-	*list = v;
-
-	return 0;
-error:
-	free_vertex_list(v);
-	return -1;
-}
-
-/* Compute the parametric vertices and the chamber decomposition
- * of an empty parametric polytope.
- */
-static __isl_give isl_vertices *vertices_empty(__isl_keep isl_basic_set *bset)
-{
-	isl_vertices *vertices;
-	unsigned nparam;
-
-	if (!bset)
-		return NULL;
-
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-
-	vertices = isl_calloc_type(bset->ctx, isl_vertices);
-	if (!vertices)
-		return NULL;
-	vertices->bset = isl_basic_set_copy(bset);
-	vertices->ref = 1;
-
-	vertices->n_vertices = 0;
-	vertices->n_chambers = 0;
-
-	return vertices;
-}
-
-/* Compute the parametric vertices and the chamber decomposition
- * of the parametric polytope defined using the same constraints
- * as "bset" in the 0D case.
- * There is exactly one 0D vertex and a single chamber containing
- * the vertex.
- */
-static __isl_give isl_vertices *vertices_0D(__isl_keep isl_basic_set *bset)
-{
-	isl_vertices *vertices;
-	unsigned nparam;
-
-	if (!bset)
-		return NULL;
-
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-
-	vertices = isl_calloc_type(bset->ctx, isl_vertices);
-	if (!vertices)
-		return NULL;
-	vertices->ref = 1;
-	vertices->bset = isl_basic_set_copy(bset);
-
-	vertices->v = isl_calloc_array(bset->ctx, struct isl_vertex, 1);
-	if (!vertices->v)
-		goto error;
-	vertices->n_vertices = 1;
-	vertices->v[0].vertex = isl_basic_set_copy(bset);
-	if (!vertices->v[0].vertex)
-		goto error;
-
-	vertices->c = isl_calloc_array(bset->ctx, struct isl_chamber, 1);
-	if (!vertices->c)
-		goto error;
-	vertices->n_chambers = 1;
-	vertices->c[0].n_vertices = 1;
-	vertices->c[0].vertices = isl_calloc_array(bset->ctx, int, 1);
-	if (!vertices->c[0].vertices)
-		goto error;
-	vertices->c[0].dom = isl_basic_set_params(isl_basic_set_copy(bset));
-	if (!vertices->c[0].dom)
-		goto error;
-
-	return vertices;
-error:
-	isl_vertices_free(vertices);
-	return NULL;
-}
-
-static int isl_mat_rank(__isl_keep isl_mat *mat)
-{
-	int row, col;
-	isl_mat *H;
-
-	H = isl_mat_left_hermite(isl_mat_copy(mat), 0, NULL, NULL);
-	if (!H)
-		return -1;
-
-	for (col = 0; col < H->n_col; ++col) {
-		for (row = 0; row < H->n_row; ++row)
-			if (!isl_int_is_zero(H->row[row][col]))
-				break;
-		if (row == H->n_row)
-			break;
-	}
-
-	isl_mat_free(H);
-
-	return col;
-}
-
-/* Is the row pointed to by "f" linearly independent of the "n" first
- * rows in "facets"?
- */
-static int is_independent(__isl_keep isl_mat *facets, int n, isl_int *f)
-{
-	int rank;
-
-	if (isl_seq_first_non_zero(f, facets->n_col) < 0)
-		return 0;
-
-	isl_seq_cpy(facets->row[n], f, facets->n_col);
-	facets->n_row = n + 1;
-	rank = isl_mat_rank(facets);
-	if (rank < 0)
-		return -1;
-
-	return rank == n + 1;
-}
-
-/* Check whether we can select constraint "level", given the current selection
- * reflected by facets in "tab", the rows of "facets" and the earlier
- * "selected" elements of "selection".
- *
- * If the constraint is (strictly) redundant in the tableau, selecting it would
- * result in an empty tableau, so it can't be selected.
- * If the set variable part of the constraint is not linearly indepedent
- * of the set variable parts of the already selected constraints,
- * the constraint cannot be selected.
- * If selecting the constraint results in an empty tableau, the constraint
- * cannot be selected.
- * Finally, if selecting the constraint results in some explicitly
- * deselected constraints turning into equalities, then the corresponding
- * vertices have already been generated, so the constraint cannot be selected.
- */
-static int can_select(__isl_keep isl_basic_set *bset, int level,
-	struct isl_tab *tab, __isl_keep isl_mat *facets, int selected,
-	int *selection)
-{
-	int i;
-	int indep;
-	unsigned ovar;
-	struct isl_tab_undo *snap;
-
-	if (isl_tab_is_redundant(tab, level))
-		return 0;
-
-	ovar = isl_space_offset(bset->dim, isl_dim_set);
-
-	indep = is_independent(facets, selected, bset->ineq[level] + 1 + ovar);
-	if (indep < 0)
-		return -1;
-	if (!indep)
-		return 0;
-
-	snap = isl_tab_snap(tab);
-	if (isl_tab_select_facet(tab, level) < 0)
-		return -1;
-
-	if (tab->empty) {
-		if (isl_tab_rollback(tab, snap) < 0)
-			return -1;
-		return 0;
-	}
-
-	for (i = 0; i < level; ++i) {
-		int sgn;
-
-		if (selection[i] != DESELECTED)
-			continue;
-
-		if (isl_tab_is_equality(tab, i))
-			sgn = 0;
-		else if (isl_tab_is_redundant(tab, i))
-			sgn = 1;
-		else
-			sgn = isl_tab_sign_of_max(tab, i);
-		if (sgn < -1)
-			return -1;
-		if (sgn <= 0) {
-			if (isl_tab_rollback(tab, snap) < 0)
-				return -1;
-			return 0;
-		}
-	}
-
-	return 1;
-}
-
-/* Compute the parametric vertices and the chamber decomposition
- * of a parametric polytope that is not full-dimensional.
- *
- * Simply map the parametric polytope to a lower dimensional space
- * and map the resulting vertices back.
- */
-static __isl_give isl_vertices *lower_dim_vertices(
-	__isl_keep isl_basic_set *bset)
-{
-	isl_morph *morph;
-	isl_vertices *vertices;
-
-	bset = isl_basic_set_copy(bset);
-	morph = isl_basic_set_full_compression(bset);
-	bset = isl_morph_basic_set(isl_morph_copy(morph), bset);
-
-	vertices = isl_basic_set_compute_vertices(bset);
-	isl_basic_set_free(bset);
-
-	morph = isl_morph_inverse(morph);
-
-	vertices = isl_morph_vertices(morph, vertices);
-
-	return vertices;
-}
-
-/* Compute the parametric vertices and the chamber decomposition
- * of the parametric polytope defined using the same constraints
- * as "bset".  "bset" is assumed to have no existentially quantified
- * variables.
- *
- * The vertices themselves are computed in a fairly simplistic way.
- * We simply run through all combinations of d constraints,
- * with d the number of set variables, and check if those d constraints
- * define a vertex.  To avoid the generation of duplicate vertices,
- * which we may happen if a vertex is defined by more that d constraints,
- * we make sure we only generate the vertex for the d constraints with
- * smallest index.
- *
- * We set up a tableau and keep track of which facets have been
- * selected.  The tableau is marked strict_redundant so that we can be
- * sure that any constraint that is marked redundant (and that is not
- * also marked zero) is not an equality.
- * If a constraint is marked DESELECTED, it means the constraint was
- * SELECTED before (in combination with the same selection of earlier
- * constraints).  If such a deselected constraint turns out to be an
- * equality, then any vertex that may still be found with the current
- * selection has already been generated when the constraint was selected.
- * A constraint is marked UNSELECTED when there is no way selecting
- * the constraint could lead to a vertex (in combination with the current
- * selection of earlier constraints).
- *
- * The set variable coefficients of the selected constraints are stored
- * in the facets matrix.
- */
-__isl_give isl_vertices *isl_basic_set_compute_vertices(
-	__isl_keep isl_basic_set *bset)
-{
-	struct isl_tab *tab;
-	int level;
-	int init;
-	unsigned nvar;
-	int *selection = NULL;
-	int selected;
-	struct isl_tab_undo **snap = NULL;
-	isl_mat *facets = NULL;
-	struct isl_vertex_list *list = NULL;
-	int n_vertices = 0;
-	isl_vertices *vertices;
-
-	if (!bset)
-		return NULL;
-
-	if (isl_basic_set_plain_is_empty(bset))
-		return vertices_empty(bset);
-
-	if (bset->n_eq != 0)
-		return lower_dim_vertices(bset);
-
-	isl_assert(bset->ctx, isl_basic_set_dim(bset, isl_dim_div) == 0,
-		return NULL);
-
-	if (isl_basic_set_dim(bset, isl_dim_set) == 0)
-		return vertices_0D(bset);
-
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-
-	bset = isl_basic_set_copy(bset);
-	bset = isl_basic_set_set_rational(bset);
-	if (!bset)
-		return NULL;
-
-	tab = isl_tab_from_basic_set(bset);
-	if (!tab)
-		goto error;
-	tab->strict_redundant = 1;
-
-	if (tab->empty)	{
-		vertices = vertices_empty(bset);
-		isl_basic_set_free(bset);
-		isl_tab_free(tab);
-		return vertices;
-	}
-
-	selection = isl_alloc_array(bset->ctx, int, bset->n_ineq);
-	snap = isl_alloc_array(bset->ctx, struct isl_tab_undo *, bset->n_ineq);
-	facets = isl_mat_alloc(bset->ctx, nvar, nvar);
-	if (!selection || !snap || !facets)
-		goto error;
-
-	level = 0;
-	init = 1;
-	selected = 0;
-
-	while (level >= 0) {
-		if (level >= bset->n_ineq ||
-		    (!init && selection[level] != SELECTED)) {
-			--level;
-			init = 0;
-			continue;
-		}
-		if (init) {
-			int ok;
-			snap[level] = isl_tab_snap(tab);
-			ok = can_select(bset, level, tab, facets, selected,
-					selection);
-			if (ok < 0)
-				goto error;
-			if (ok) {
-				selection[level] = SELECTED;
-				selected++;
-			} else
-				selection[level] = UNSELECTED;
-		} else {
-			selection[level] = DESELECTED;
-			selected--;
-			if (isl_tab_rollback(tab, snap[level]) < 0)
-				goto error;
-		}
-		if (selected == nvar) {
-			if (tab->n_dead == nvar) {
-				if (add_vertex(&list, bset, tab) < 0)
-					goto error;
-				n_vertices++;
-			}
-			init = 0;
-			continue;
-		}
-		++level;
-		init = 1;
-	}
-
-	isl_mat_free(facets);
-	free(selection);
-	free(snap);
-
-	isl_tab_free(tab);
-
-	vertices = vertices_from_list(bset, n_vertices, list);
-
-	vertices = compute_chambers(bset, vertices);
-
-	return vertices;
-error:
-	isl_mat_free(facets);
-	free(selection);
-	free(snap);
-	isl_tab_free(tab);
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-struct isl_chamber_list {
-	struct isl_chamber c;
-	struct isl_chamber_list *next;
-};
-
-static void free_chamber_list(struct isl_chamber_list *list)
-{
-	struct isl_chamber_list *next;
-
-	for (; list; list = next) {
-		next = list->next;
-		isl_basic_set_free(list->c.dom);
-		free(list->c.vertices);
-		free(list);
-	}
-}
-
-/* Check whether the basic set "bset" is a superset of the basic set described
- * by "tab", i.e., check whether all constraints of "bset" are redundant.
- */
-static int bset_covers_tab(__isl_keep isl_basic_set *bset, struct isl_tab *tab)
-{
-	int i;
-
-	if (!bset || !tab)
-		return -1;
-
-	for (i = 0; i < bset->n_ineq; ++i) {
-		enum isl_ineq_type type = isl_tab_ineq_type(tab, bset->ineq[i]);
-		switch (type) {
-		case isl_ineq_error:		return -1;
-		case isl_ineq_redundant:	continue;
-		default:			return 0;
-		}
-	}
-
-	return 1;
-}
-
-static __isl_give isl_vertices *vertices_add_chambers(
-	__isl_take isl_vertices *vertices, int n_chambers,
-	struct isl_chamber_list *list)
-{
-	int i;
-	isl_ctx *ctx;
-	struct isl_chamber_list *next;
-
-	ctx = isl_vertices_get_ctx(vertices);
-	vertices->c = isl_alloc_array(ctx, struct isl_chamber, n_chambers);
-	if (!vertices->c)
-		goto error;
-	vertices->n_chambers = n_chambers;
-
-	for (i = 0; list; list = next, i++) {
-		next = list->next;
-		vertices->c[i] = list->c;
-		free(list);
-	}
-
-	return vertices;
-error:
-	isl_vertices_free(vertices);
-	free_chamber_list(list);
-	return NULL;
-}
-
-/* Can "tab" be intersected with "bset" without resulting in
- * a lower-dimensional set.
- */
-static int can_intersect(struct isl_tab *tab, __isl_keep isl_basic_set *bset)
-{
-	int i;
-	struct isl_tab_undo *snap;
-
-	if (isl_tab_extend_cons(tab, bset->n_ineq) < 0)
-		return -1;
-
-	snap = isl_tab_snap(tab);
-
-	for (i = 0; i < bset->n_ineq; ++i) {
-		if (isl_tab_ineq_type(tab, bset->ineq[i]) == isl_ineq_redundant)
-			continue;
-		if (isl_tab_add_ineq(tab, bset->ineq[i]) < 0)
-			return -1;
-	}
-
-	if (isl_tab_detect_implicit_equalities(tab) < 0)
-		return -1;
-	if (tab->n_dead) {
-		if (isl_tab_rollback(tab, snap) < 0)
-			return -1;
-		return 0;
-	}
-
-	return 1;
-}
-
-static int add_chamber(struct isl_chamber_list **list,
-	__isl_keep isl_vertices *vertices, struct isl_tab *tab, int *selection)
-{
-	int n_frozen;
-	int i, j;
-	int n_vertices = 0;
-	struct isl_tab_undo *snap;
-	struct isl_chamber_list *c = NULL;
-
-	for (i = 0; i < vertices->n_vertices; ++i)
-		if (selection[i])
-			n_vertices++;
-
-	snap = isl_tab_snap(tab);
-
-	for (i = 0; i < tab->n_con && tab->con[i].frozen; ++i)
-		tab->con[i].frozen = 0;
-	n_frozen = i;
-
-	if (isl_tab_detect_redundant(tab) < 0)
-		return -1;
-
-	c = isl_calloc_type(tab->mat->ctx, struct isl_chamber_list);
-	if (!c)
-		goto error;
-	c->c.vertices = isl_alloc_array(tab->mat->ctx, int, n_vertices);
-	if (!c->c.vertices)
-		goto error;
-	c->c.dom = isl_basic_set_from_basic_map(isl_basic_map_copy(tab->bmap));
-	c->c.dom = isl_basic_set_set_rational(c->c.dom);
-	c->c.dom = isl_basic_set_cow(c->c.dom);
-	c->c.dom = isl_basic_set_update_from_tab(c->c.dom, tab);
-	c->c.dom = isl_basic_set_simplify(c->c.dom);
-	c->c.dom = isl_basic_set_finalize(c->c.dom);
-	if (!c->c.dom)
-		goto error;
-
-	c->c.n_vertices = n_vertices;
-
-	for (i = 0, j = 0; i < vertices->n_vertices; ++i)
-		if (selection[i]) {
-			c->c.vertices[j] = i;
-			j++;
-		}
-
-	c->next = *list;
-	*list = c;
-
-	for (i = 0; i < n_frozen; ++i)
-		tab->con[i].frozen = 1;
-
-	if (isl_tab_rollback(tab, snap) < 0)
-		return -1;
-
-	return 0;
-error:
-	free_chamber_list(c);
-	return -1;
-}
-
-struct isl_facet_todo {
-	struct isl_tab *tab;	/* A tableau representation of the facet */
-	isl_basic_set *bset;    /* A normalized basic set representation */
-	isl_vec *constraint;	/* Constraint pointing to the other side */
-	struct isl_facet_todo *next;
-};
-
-static void free_todo(struct isl_facet_todo *todo)
-{
-	while (todo) {
-		struct isl_facet_todo *next = todo->next;
-
-		isl_tab_free(todo->tab);
-		isl_basic_set_free(todo->bset);
-		isl_vec_free(todo->constraint);
-		free(todo);
-
-		todo = next;
-	}
-}
-
-static struct isl_facet_todo *create_todo(struct isl_tab *tab, int con)
-{
-	int i;
-	int n_frozen;
-	struct isl_tab_undo *snap;
-	struct isl_facet_todo *todo;
-
-	snap = isl_tab_snap(tab);
-
-	for (i = 0; i < tab->n_con && tab->con[i].frozen; ++i)
-		tab->con[i].frozen = 0;
-	n_frozen = i;
-
-	if (isl_tab_detect_redundant(tab) < 0)
-		return NULL;
-
-	todo = isl_calloc_type(tab->mat->ctx, struct isl_facet_todo);
-	if (!todo)
-		return NULL;
-
-	todo->constraint = isl_vec_alloc(tab->mat->ctx, 1 + tab->n_var);
-	if (!todo->constraint)
-		goto error;
-	isl_seq_neg(todo->constraint->el, tab->bmap->ineq[con], 1 + tab->n_var);
-	todo->bset = isl_basic_set_from_basic_map(isl_basic_map_copy(tab->bmap));
-	todo->bset = isl_basic_set_set_rational(todo->bset);
-	todo->bset = isl_basic_set_cow(todo->bset);
-	todo->bset = isl_basic_set_update_from_tab(todo->bset, tab);
-	todo->bset = isl_basic_set_simplify(todo->bset);
-	todo->bset = isl_basic_set_sort_constraints(todo->bset);
-	if (!todo->bset)
-		goto error;
-	ISL_F_SET(todo->bset, ISL_BASIC_SET_NORMALIZED);
-	todo->tab = isl_tab_dup(tab);
-	if (!todo->tab)
-		goto error;
-
-	for (i = 0; i < n_frozen; ++i)
-		tab->con[i].frozen = 1;
-
-	if (isl_tab_rollback(tab, snap) < 0)
-		goto error;
-
-	return todo;
-error:
-	free_todo(todo);
-	return NULL;
-}
-
-/* Create todo items for all interior facets of the chamber represented
- * by "tab" and collect them in "next".
- */
-static int init_todo(struct isl_facet_todo **next, struct isl_tab *tab)
-{
-	int i;
-	struct isl_tab_undo *snap;
-	struct isl_facet_todo *todo;
-
-	snap = isl_tab_snap(tab);
-
-	for (i = 0; i < tab->n_con; ++i) {
-		if (tab->con[i].frozen)
-			continue;
-		if (tab->con[i].is_redundant)
-			continue;
-
-		if (isl_tab_select_facet(tab, i) < 0)
-			return -1;
-
-		todo = create_todo(tab, i);
-		if (!todo)
-			return -1;
-
-		todo->next = *next;
-		*next = todo;
-
-		if (isl_tab_rollback(tab, snap) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-/* Does the linked list contain a todo item that is the opposite of "todo".
- * If so, return 1 and remove the opposite todo item.
- */
-static int has_opposite(struct isl_facet_todo *todo,
-	struct isl_facet_todo **list)
-{
-	for (; *list; list = &(*list)->next) {
-		int eq;
-		eq = isl_basic_set_plain_is_equal(todo->bset, (*list)->bset);
-		if (eq < 0)
-			return -1;
-		if (!eq)
-			continue;
-		todo = *list;
-		*list = todo->next;
-		todo->next = NULL;
-		free_todo(todo);
-		return 1;
-	}
-
-	return 0;
-}
-
-/* Create todo items for all interior facets of the chamber represented
- * by "tab" and collect them in first->next, taking care to cancel
- * opposite todo items.
- */
-static int update_todo(struct isl_facet_todo *first, struct isl_tab *tab)
-{
-	int i;
-	struct isl_tab_undo *snap;
-	struct isl_facet_todo *todo;
-
-	snap = isl_tab_snap(tab);
-
-	for (i = 0; i < tab->n_con; ++i) {
-		int drop;
-
-		if (tab->con[i].frozen)
-			continue;
-		if (tab->con[i].is_redundant)
-			continue;
-
-		if (isl_tab_select_facet(tab, i) < 0)
-			return -1;
-
-		todo = create_todo(tab, i);
-		if (!todo)
-			return -1;
-
-		drop = has_opposite(todo, &first->next);
-		if (drop < 0)
-			return -1;
-
-		if (drop)
-			free_todo(todo);
-		else {
-			todo->next = first->next;
-			first->next = todo;
-		}
-
-		if (isl_tab_rollback(tab, snap) < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-/* Compute the chamber decomposition of the parametric polytope respresented
- * by "bset" given the parametric vertices and their activity domains.
- *
- * We are only interested in full-dimensional chambers.
- * Each of these chambers is the intersection of the activity domains of
- * one or more vertices and the union of all chambers is equal to the
- * projection of the entire parametric polytope onto the parameter space.
- *
- * We first create an initial chamber by intersecting as many activity
- * domains as possible without ending up with an empty or lower-dimensional
- * set.  As a minor optimization, we only consider those activity domains
- * that contain some arbitrary point.
- *
- * For each of interior facets of the chamber, we construct a todo item,
- * containing the facet and a constraint containing the other side of the facet,
- * for constructing the chamber on the other side.
- * While their are any todo items left, we pick a todo item and
- * create the required chamber by intersecting all activity domains
- * that contain the facet and have a full-dimensional intersection with
- * the other side of the facet.  For each of the interior facets, we
- * again create todo items, taking care to cancel opposite todo items.
- */
-static __isl_give isl_vertices *compute_chambers(__isl_take isl_basic_set *bset,
-	__isl_take isl_vertices *vertices)
-{
-	int i;
-	isl_ctx *ctx;
-	isl_vec *sample = NULL;
-	struct isl_tab *tab = NULL;
-	struct isl_tab_undo *snap;
-	int *selection = NULL;
-	int n_chambers = 0;
-	struct isl_chamber_list *list = NULL;
-	struct isl_facet_todo *todo = NULL;
-
-	if (!bset || !vertices)
-		goto error;
-
-	ctx = isl_vertices_get_ctx(vertices);
-	selection = isl_alloc_array(ctx, int, vertices->n_vertices);
-	if (!selection)
-		goto error;
-
-	bset = isl_basic_set_params(bset);
-
-	tab = isl_tab_from_basic_set(bset);
-	for (i = 0; i < bset->n_ineq; ++i)
-		if (isl_tab_freeze_constraint(tab, i) < 0)
-			goto error;
-	if (isl_tab_track_bset(tab, bset) < 0)
-		goto error;
-
-	snap = isl_tab_snap(tab);
-
-	sample = isl_tab_get_sample_value(tab);
-
-	for (i = 0; i < vertices->n_vertices; ++i) {
-		selection[i] = isl_basic_set_contains(vertices->v[i].dom, sample);
-		if (selection[i] < 0)
-			goto error;
-		if (!selection[i])
-			continue;
-		selection[i] = can_intersect(tab, vertices->v[i].dom);
-		if (selection[i] < 0)
-			goto error;
-	}
-
-	if (isl_tab_detect_redundant(tab) < 0)
-		goto error;
-
-	if (add_chamber(&list, vertices, tab, selection) < 0)
-		goto error;
-	n_chambers++;
-
-	if (init_todo(&todo, tab) < 0)
-		goto error;
-
-	while (todo) {
-		struct isl_facet_todo *next;
-
-		if (isl_tab_rollback(tab, snap) < 0)
-			goto error;
-
-		if (isl_tab_add_ineq(tab, todo->constraint->el) < 0)
-			goto error;
-		if (isl_tab_freeze_constraint(tab, tab->n_con - 1) < 0)
-			goto error;
-
-		for (i = 0; i < vertices->n_vertices; ++i) {
-			selection[i] = bset_covers_tab(vertices->v[i].dom,
-							todo->tab);
-			if (selection[i] < 0)
-				goto error;
-			if (!selection[i])
-				continue;
-			selection[i] = can_intersect(tab, vertices->v[i].dom);
-			if (selection[i] < 0)
-				goto error;
-		}
-
-		if (isl_tab_detect_redundant(tab) < 0)
-			goto error;
-
-		if (add_chamber(&list, vertices, tab, selection) < 0)
-			goto error;
-		n_chambers++;
-
-		if (update_todo(todo, tab) < 0)
-			goto error;
-
-		next = todo->next;
-		todo->next = NULL;
-		free_todo(todo);
-		todo = next;
-	}
-
-	isl_vec_free(sample);
-
-	isl_tab_free(tab);
-	free(selection);
-
-	vertices = vertices_add_chambers(vertices, n_chambers, list);
-
-	for (i = 0; vertices && i < vertices->n_vertices; ++i) {
-		isl_basic_set_free(vertices->v[i].dom);
-		vertices->v[i].dom = NULL;
-	}
-
-	return vertices;
-error:
-	free_chamber_list(list);
-	free_todo(todo);
-	isl_vec_free(sample);
-	isl_tab_free(tab);
-	free(selection);
-	if (!tab)
-		isl_basic_set_free(bset);
-	isl_vertices_free(vertices);
-	return NULL;
-}
-
-isl_ctx *isl_vertex_get_ctx(__isl_keep isl_vertex *vertex)
-{
-	return vertex ? isl_vertices_get_ctx(vertex->vertices) : NULL;
-}
-
-int isl_vertex_get_id(__isl_keep isl_vertex *vertex)
-{
-	return vertex ? vertex->id : -1;
-}
-
-__isl_give isl_basic_set *isl_vertex_get_domain(__isl_keep isl_vertex *vertex)
-{
-	struct isl_vertex *v;
-
-	if (!vertex)
-		return NULL;
-
-	v = &vertex->vertices->v[vertex->id];
-	if (!v->dom) {
-		unsigned nvar;
-		nvar = isl_basic_set_dim(v->vertex, isl_dim_set);
-		v->dom = isl_basic_set_copy(v->vertex);
-		v->dom = isl_basic_set_project_out(v->dom, isl_dim_set, 0, nvar);
-	}
-
-	return isl_basic_set_copy(v->dom);
-}
-
-__isl_give isl_basic_set *isl_vertex_get_expr(__isl_keep isl_vertex *vertex)
-{
-	struct isl_vertex *v;
-
-	if (!vertex)
-		return NULL;
-
-	v = &vertex->vertices->v[vertex->id];
-
-	return isl_basic_set_copy(v->vertex);
-}
-
-static __isl_give isl_vertex *isl_vertex_alloc(__isl_take isl_vertices *vertices,
-	int id)
-{
-	isl_ctx *ctx;
-	isl_vertex *vertex;
-
-	if (!vertices)
-		return NULL;
-
-	ctx = isl_vertices_get_ctx(vertices);
-	vertex = isl_alloc_type(ctx, isl_vertex);
-	if (!vertex)
-		goto error;
-
-	vertex->vertices = vertices;
-	vertex->id = id;
-
-	return vertex;
-error:
-	isl_vertices_free(vertices);
-	return NULL;
-}
-
-void isl_vertex_free(__isl_take isl_vertex *vertex)
-{
-	if (!vertex)
-		return;
-	isl_vertices_free(vertex->vertices);
-	free(vertex);
-}
-
-__isl_give isl_basic_set *isl_basic_set_set_integral(__isl_take isl_basic_set *bset)
-{
-	if (!bset)
-		return NULL;
-
-	if (!ISL_F_ISSET(bset, ISL_BASIC_MAP_RATIONAL))
-		return bset;
-
-	bset = isl_basic_set_cow(bset);
-	if (!bset)
-		return NULL;
-
-	ISL_F_CLR(bset, ISL_BASIC_MAP_RATIONAL);
-
-	return isl_basic_set_finalize(bset);
-}
-
-isl_ctx *isl_cell_get_ctx(__isl_keep isl_cell *cell)
-{
-	return cell ? cell->dom->ctx : NULL;
-}
-
-__isl_give isl_basic_set *isl_cell_get_domain(__isl_keep isl_cell *cell)
-{
-	return cell ? isl_basic_set_copy(cell->dom) : NULL;
-}
-
-static __isl_give isl_cell *isl_cell_alloc(__isl_take isl_vertices *vertices,
-	__isl_take isl_basic_set *dom, int id)
-{
-	int i;
-	isl_cell *cell = NULL;
-
-	if (!vertices || !dom)
-		goto error;
-
-	cell = isl_calloc_type(dom->ctx, isl_cell);
-	if (!cell)
-		goto error;
-
-	cell->n_vertices = vertices->c[id].n_vertices;
-	cell->ids = isl_alloc_array(dom->ctx, int, cell->n_vertices);
-	if (!cell->ids)
-		goto error;
-	for (i = 0; i < cell->n_vertices; ++i)
-		cell->ids[i] = vertices->c[id].vertices[i];
-	cell->vertices = vertices;
-	cell->dom = dom;
-
-	return cell;
-error:
-	isl_cell_free(cell);
-	isl_vertices_free(vertices);
-	isl_basic_set_free(dom);
-	return NULL;
-}
-
-void isl_cell_free(__isl_take isl_cell *cell)
-{
-	if (!cell)
-		return;
-
-	isl_vertices_free(cell->vertices);
-	free(cell->ids);
-	isl_basic_set_free(cell->dom);
-	free(cell);
-}
-
-/* Create a tableau of the cone obtained by first homogenizing the given
- * polytope and then making all inequalities strict by setting the
- * constant term to -1.
- */
-static struct isl_tab *tab_for_shifted_cone(__isl_keep isl_basic_set *bset)
-{
-	int i;
-	isl_vec *c = NULL;
-	struct isl_tab *tab;
-
-	if (!bset)
-		return NULL;
-	tab = isl_tab_alloc(bset->ctx, bset->n_ineq + 1,
-			    1 + isl_basic_set_total_dim(bset), 0);
-	if (!tab)
-		return NULL;
-	tab->rational = ISL_F_ISSET(bset, ISL_BASIC_SET_RATIONAL);
-	if (ISL_F_ISSET(bset, ISL_BASIC_MAP_EMPTY)) {
-		if (isl_tab_mark_empty(tab) < 0)
-			goto error;
-		return tab;
-	}
-
-	c = isl_vec_alloc(bset->ctx, 1 + 1 + isl_basic_set_total_dim(bset));
-	if (!c)
-		goto error;
-
-	isl_int_set_si(c->el[0], 0);
-	for (i = 0; i < bset->n_eq; ++i) {
-		isl_seq_cpy(c->el + 1, bset->eq[i], c->size - 1);
-		if (isl_tab_add_eq(tab, c->el) < 0)
-			goto error;
-	}
-
-	isl_int_set_si(c->el[0], -1);
-	for (i = 0; i < bset->n_ineq; ++i) {
-		isl_seq_cpy(c->el + 1, bset->ineq[i], c->size - 1);
-		if (isl_tab_add_ineq(tab, c->el) < 0)
-			goto error;
-		if (tab->empty) {
-			isl_vec_free(c);
-			return tab;
-		}
-	}
-
-	isl_seq_clr(c->el + 1, c->size - 1);
-	isl_int_set_si(c->el[1], 1);
-	if (isl_tab_add_ineq(tab, c->el) < 0)
-		goto error;
-
-	isl_vec_free(c);
-	return tab;
-error:
-	isl_vec_free(c);
-	isl_tab_free(tab);
-	return NULL;
-}
-
-/* Compute an interior point of "bset" by selecting an interior
- * point in homogeneous space and projecting the point back down.
- */
-static __isl_give isl_vec *isl_basic_set_interior_point(
-	__isl_keep isl_basic_set *bset)
-{
-	isl_vec *vec;
-	struct isl_tab *tab;
-
-	tab = tab_for_shifted_cone(bset);
-	vec = isl_tab_get_sample_value(tab);
-	isl_tab_free(tab);
-	if (!vec)
-		return NULL;
-
-	isl_seq_cpy(vec->el, vec->el + 1, vec->size - 1);
-	vec->size--;
-
-	return vec;
-}
-
-/* Call "fn" on all chambers of the parametric polytope with the shared
- * facets of neighboring chambers only appearing in one of the chambers.
- *
- * We pick an interior point from one of the chambers and then make
- * all constraints that do not satisfy this point strict.
- */
-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;
-	isl_vec *vec;
-	isl_int v;
-	isl_cell *cell;
-
-	if (!vertices)
-		return -1;
-
-	if (vertices->n_chambers == 0)
-		return 0;
-
-	if (vertices->n_chambers == 1) {
-		isl_basic_set *dom = isl_basic_set_copy(vertices->c[0].dom);
-		dom = isl_basic_set_set_integral(dom);
-		cell = isl_cell_alloc(isl_vertices_copy(vertices), dom, 0);
-		if (!cell)
-			return -1;
-		return fn(cell, user);
-	}
-
-	vec = isl_basic_set_interior_point(vertices->c[0].dom);
-	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);
-		}
-		dom = isl_basic_set_set_integral(dom);
-		cell = isl_cell_alloc(isl_vertices_copy(vertices), dom, i);
-		if (!cell)
-			goto error;
-		r = fn(cell, user);
-		if (r < 0)
-			goto error;
-	}
-
-	isl_int_clear(v);
-	isl_vec_free(vec);
-
-	return 0;
-error:
-	isl_int_clear(v);
-	isl_vec_free(vec);
-	return -1;
-}
-
-int isl_vertices_foreach_cell(__isl_keep isl_vertices *vertices,
-	int (*fn)(__isl_take isl_cell *cell, void *user), void *user)
-{
-	int i;
-	isl_cell *cell;
-
-	if (!vertices)
-		return -1;
-
-	if (vertices->n_chambers == 0)
-		return 0;
-
-	for (i = 0; i < vertices->n_chambers; ++i) {
-		int r;
-		isl_basic_set *dom = isl_basic_set_copy(vertices->c[i].dom);
-
-		cell = isl_cell_alloc(isl_vertices_copy(vertices), dom, i);
-		if (!cell)
-			return -1;
-
-		r = fn(cell, user);
-		if (r < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-int isl_vertices_foreach_vertex(__isl_keep isl_vertices *vertices,
-	int (*fn)(__isl_take isl_vertex *vertex, void *user), void *user)
-{
-	int i;
-	isl_vertex *vertex;
-
-	if (!vertices)
-		return -1;
-
-	if (vertices->n_vertices == 0)
-		return 0;
-
-	for (i = 0; i < vertices->n_vertices; ++i) {
-		int r;
-
-		vertex = isl_vertex_alloc(isl_vertices_copy(vertices), i);
-		if (!vertex)
-			return -1;
-
-		r = fn(vertex, user);
-		if (r < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-int isl_cell_foreach_vertex(__isl_keep isl_cell *cell,
-	int (*fn)(__isl_take isl_vertex *vertex, void *user), void *user)
-{
-	int i;
-	isl_vertex *vertex;
-
-	if (!cell)
-		return -1;
-
-	if (cell->n_vertices == 0)
-		return 0;
-
-	for (i = 0; i < cell->n_vertices; ++i) {
-		int r;
-
-		vertex = isl_vertex_alloc(isl_vertices_copy(cell->vertices),
-					  cell->ids[i]);
-		if (!vertex)
-			return -1;
-
-		r = fn(vertex, user);
-		if (r < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-isl_ctx *isl_vertices_get_ctx(__isl_keep isl_vertices *vertices)
-{
-	return vertices ? vertices->bset->ctx : NULL;
-}
-
-int isl_vertices_get_n_vertices(__isl_keep isl_vertices *vertices)
-{
-	return vertices ? vertices->n_vertices : -1;
-}
-
-__isl_give isl_vertices *isl_morph_vertices(__isl_take isl_morph *morph,
-	__isl_take isl_vertices *vertices)
-{
-	int i;
-	isl_morph *param_morph = NULL;
-
-	if (!morph || !vertices)
-		goto error;
-
-	isl_assert(vertices->bset->ctx, vertices->ref == 1, goto error);
-
-	param_morph = isl_morph_copy(morph);
-	param_morph = isl_morph_remove_dom_dims(param_morph, isl_dim_set,
-				    0, isl_morph_dom_dim(morph, isl_dim_set));
-	param_morph = isl_morph_remove_ran_dims(param_morph, isl_dim_set,
-				    0, isl_morph_ran_dim(morph, isl_dim_set));
-
-	for (i = 0; i < vertices->n_vertices; ++i) {
-		vertices->v[i].dom = isl_morph_basic_set(
-			isl_morph_copy(param_morph), vertices->v[i].dom);
-		vertices->v[i].vertex = isl_morph_basic_set(
-			isl_morph_copy(morph), vertices->v[i].vertex);
-		if (!vertices->v[i].vertex)
-			goto error;
-	}
-
-	for (i = 0; i < vertices->n_chambers; ++i) {
-		vertices->c[i].dom = isl_morph_basic_set(
-			isl_morph_copy(param_morph), vertices->c[i].dom);
-		if (!vertices->c[i].dom)
-			goto error;
-	}
-
-	isl_morph_free(param_morph);
-	isl_morph_free(morph);
-	return vertices;
-error:
-	isl_morph_free(param_morph);
-	isl_morph_free(morph);
-	isl_vertices_free(vertices);
-	return NULL;
-}
-
-/* Construct a simplex isl_cell spanned by the vertices with indices in
- * "simplex_ids" and "other_ids" and call "fn" on this isl_cell.
- */
-static int call_on_simplex(__isl_keep isl_cell *cell,
-	int *simplex_ids, int n_simplex, int *other_ids, int n_other,
-	int (*fn)(__isl_take isl_cell *simplex, void *user), void *user)
-{
-	int i;
-	isl_ctx *ctx;
-	struct isl_cell *simplex;
-
-	ctx = isl_cell_get_ctx(cell);
-
-	simplex = isl_calloc_type(ctx, struct isl_cell);
-	if (!simplex)
-		return -1;
-	simplex->vertices = isl_vertices_copy(cell->vertices);
-	if (!simplex->vertices)
-		goto error;
-	simplex->dom = isl_basic_set_copy(cell->dom);
-	if (!simplex->dom)
-		goto error;
-	simplex->n_vertices = n_simplex + n_other;
-	simplex->ids = isl_alloc_array(ctx, int, simplex->n_vertices);
-	if (!simplex->ids)
-		goto error;
-
-	for (i = 0; i < n_simplex; ++i)
-		simplex->ids[i] = simplex_ids[i];
-	for (i = 0; i < n_other; ++i)
-		simplex->ids[n_simplex + i] = other_ids[i];
-
-	return fn(simplex, user);
-error:
-	isl_cell_free(simplex);
-	return -1;
-}
-
-/* Check whether the parametric vertex described by "vertex"
- * lies on the facet corresponding to constraint "facet" of "bset".
- * The isl_vec "v" is a temporary vector than can be used by this function.
- *
- * We eliminate the variables from the facet constraint using the
- * equalities defining the vertex and check if the result is identical
- * to zero.
- *
- * It would probably be better to keep track of the constraints defining
- * a vertex during the vertex construction so that we could simply look
- * it up here.
- */
-static int vertex_on_facet(__isl_keep isl_basic_set *vertex,
-	__isl_keep isl_basic_set *bset, int facet, __isl_keep isl_vec *v)
-{
-	int i;
-	isl_int m;
-
-	isl_seq_cpy(v->el, bset->ineq[facet], v->size);
-
-	isl_int_init(m);
-	for (i = 0; i < vertex->n_eq; ++i) {
-		int k = isl_seq_last_non_zero(vertex->eq[i], v->size);
-		isl_seq_elim(v->el, vertex->eq[i], k, v->size, &m);
-	}
-	isl_int_clear(m);
-
-	return isl_seq_first_non_zero(v->el, v->size) == -1;
-}
-
-/* Triangulate the polytope spanned by the vertices with ids
- * in "simplex_ids" and "other_ids" and call "fn" on each of
- * the resulting simplices.
- * If the input polytope is already a simplex, we simply call "fn".
- * Otherwise, we pick a point from "other_ids" and add it to "simplex_ids".
- * Then we consider each facet of "bset" that does not contain the point
- * we just picked, but does contain some of the other points in "other_ids"
- * and call ourselves recursively on the polytope spanned by the new
- * "simplex_ids" and those points in "other_ids" that lie on the facet.
- */
-static int triangulate(__isl_keep isl_cell *cell, __isl_keep isl_vec *v,
-	int *simplex_ids, int n_simplex, int *other_ids, int n_other,
-	int (*fn)(__isl_take isl_cell *simplex, void *user), void *user)
-{
-	int i, j, k;
-	int d, nparam;
-	int *ids;
-	isl_ctx *ctx;
-	isl_basic_set *vertex;
-	isl_basic_set *bset;
-
-	ctx = isl_cell_get_ctx(cell);
-	d = isl_basic_set_dim(cell->vertices->bset, isl_dim_set);
-	nparam = isl_basic_set_dim(cell->vertices->bset, isl_dim_param);
-
-	if (n_simplex + n_other == d + 1)
-		return call_on_simplex(cell, simplex_ids, n_simplex,
-				       other_ids, n_other, fn, user);
-
-	simplex_ids[n_simplex] = other_ids[0];
-	vertex = cell->vertices->v[other_ids[0]].vertex;
-	bset = cell->vertices->bset;
-
-	ids = isl_alloc_array(ctx, int, n_other - 1);
-	for (i = 0; i < bset->n_ineq; ++i) {
-		if (isl_seq_first_non_zero(bset->ineq[i] + 1 + nparam, d) == -1)
-			continue;
-		if (vertex_on_facet(vertex, bset, i, v))
-			continue;
-
-		for (j = 1, k = 0; j < n_other; ++j) {
-			isl_basic_set *ov;
-			ov = cell->vertices->v[other_ids[j]].vertex;
-			if (vertex_on_facet(ov, bset, i, v))
-				ids[k++] = other_ids[j];
-		}
-		if (k == 0)
-			continue;
-
-		if (triangulate(cell, v, simplex_ids, n_simplex + 1,
-				ids, k, fn, user) < 0)
-			goto error;
-	}
-	free(ids);
-
-	return 0;
-error:
-	free(ids);
-	return -1;
-}
-
-/* Triangulate the given cell and call "fn" on each of the resulting
- * simplices.
- */
-int isl_cell_foreach_simplex(__isl_take isl_cell *cell,
-	int (*fn)(__isl_take isl_cell *simplex, void *user), void *user)
-{
-	int d, total;
-	int r;
-	isl_ctx *ctx;
-	isl_vec *v = NULL;
-	int *simplex_ids = NULL;
-
-	if (!cell)
-		return -1;
-
-	d = isl_basic_set_dim(cell->vertices->bset, isl_dim_set);
-	total = isl_basic_set_total_dim(cell->vertices->bset);
-
-	if (cell->n_vertices == d + 1)
-		return fn(cell, user);
-
-	ctx = isl_cell_get_ctx(cell);
-	simplex_ids = isl_alloc_array(ctx, int, d + 1);
-	if (!simplex_ids)
-		goto error;
-
-	v = isl_vec_alloc(ctx, 1 + total);
-	if (!v)
-		goto error;
-
-	r = triangulate(cell, v, simplex_ids, 0,
-			cell->ids, cell->n_vertices, fn, user);
-
-	isl_vec_free(v);
-	free(simplex_ids);
-
-	isl_cell_free(cell);
-
-	return r;
-error:
-	free(simplex_ids);
-	isl_vec_free(v);
-	isl_cell_free(cell);
-	return -1;
-}
diff --git a/cloog-0.17.0/isl/isl_vertices_private.h b/cloog-0.17.0/isl/isl_vertices_private.h
deleted file mode 100644
index 7c707fd..0000000
--- a/cloog-0.17.0/isl/isl_vertices_private.h
+++ /dev/null
@@ -1,64 +0,0 @@
-#include <isl/set.h>
-#include <isl/vertices.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-struct isl_morph;
-
-/* A parametric vertex.  "vertex" contains the actual description
- * of the vertex as a singleton parametric set.  "dom" is the projection
- * of "vertex" onto the parameter space, i.e., the activity domain
- * of the vertex.
- */
-struct isl_vertex {
-	isl_basic_set *dom;
-	isl_basic_set *vertex;
-};
-
-/* A chamber in the chamber decomposition.  The indices of the "n_vertices"
- * active vertices are stored in "vertices".
- */
-struct isl_chamber {
-	int n_vertices;
-	int *vertices;
-	isl_basic_set *dom;
-};
-
-struct isl_vertices {
-	int ref;
-
-	/* The rational basic set spanned by the vertices. */
-	isl_basic_set *bset;
-
-	int n_vertices;
-	struct isl_vertex *v;
-
-	int n_chambers;
-	struct isl_chamber *c;
-};
-
-struct isl_cell {
-	int n_vertices;
-	int *ids;
-	isl_vertices *vertices;
-	isl_basic_set *dom;
-};
-
-struct isl_external_vertex {
-	isl_vertices *vertices;
-	int id;
-};
-
-int isl_vertices_foreach_disjoint_cell(__isl_keep isl_vertices *vertices,
-	int (*fn)(__isl_take isl_cell *cell, void *user), void *user);
-int isl_cell_foreach_simplex(__isl_take isl_cell *cell,
-	int (*fn)(__isl_take isl_cell *simplex, void *user), void *user);
-
-__isl_give isl_vertices *isl_morph_vertices(__isl_take struct isl_morph *morph,
-	__isl_take isl_vertices *vertices);
-
-#if defined(__cplusplus)
-}
-#endif
diff --git a/cloog-0.17.0/isl/ltmain.sh b/cloog-0.17.0/isl/ltmain.sh
deleted file mode 100755
index fa4b1e1..0000000
--- a/cloog-0.17.0/isl/ltmain.sh
+++ /dev/null
@@ -1,8413 +0,0 @@
-# Generated from ltmain.m4sh.
-
-# ltmain.sh (GNU libtool) 2.2.6b
-# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 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.
-
-# GNU Libtool is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html,
-# or obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-# Usage: $progname [OPTION]... [MODE-ARG]...
-#
-# Provide generalized library-building support services.
-#
-#     --config             show all configuration variables
-#     --debug              enable verbose shell tracing
-# -n, --dry-run            display commands without modifying any files
-#     --features           display basic configuration information and exit
-#     --mode=MODE          use operation mode MODE
-#     --preserve-dup-deps  don't remove duplicate dependency libraries
-#     --quiet, --silent    don't print informational messages
-#     --tag=TAG            use configuration variables from tag TAG
-# -v, --verbose            print informational messages (default)
-#     --version            print version information
-# -h, --help               print short or long help message
-#
-# MODE must be one of the following:
-#
-#       clean              remove files from the build directory
-#       compile            compile a source file into a libtool object
-#       execute            automatically set library path, then run a program
-#       finish             complete the installation of libtool libraries
-#       install            install libraries or executables
-#       link               create a library or an executable
-#       uninstall          remove libraries from an installed directory
-#
-# MODE-ARGS vary depending on the MODE.
-# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
-#
-# When reporting a bug, please describe a test case to reproduce it and
-# include the following information:
-#
-#       host-triplet:	$host
-#       shell:		$SHELL
-#       compiler:		$LTCC
-#       compiler flags:		$LTCFLAGS
-#       linker:		$LD (gnu? $with_gnu_ld)
-#       $progname:		(GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu3
-#       automake:		$automake_version
-#       autoconf:		$autoconf_version
-#
-# Report bugs to <bug-libtool@gnu.org>.
-
-PROGRAM=ltmain.sh
-PACKAGE=libtool
-VERSION="2.2.6b Debian-2.2.6b-2ubuntu3"
-TIMESTAMP=""
-package_revision=1.3017
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# NLS nuisances: We save the old values to restore during execute mode.
-# Only set LANG and LC_ALL to C if already set.
-# These must not be set unconditionally because not all systems understand
-# e.g. LANG=C (notably SCO).
-lt_user_locale=
-lt_safe_locale=
-for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-do
-  eval "if test \"\${$lt_var+set}\" = set; then
-          save_$lt_var=\$$lt_var
-          $lt_var=C
-	  export $lt_var
-	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
-	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
-	fi"
-done
-
-$lt_unset CDPATH
-
-
-
-
-
-: ${CP="cp -f"}
-: ${ECHO="echo"}
-: ${EGREP="/bin/grep -E"}
-: ${FGREP="/bin/grep -F"}
-: ${GREP="/bin/grep"}
-: ${LN_S="ln -s"}
-: ${MAKE="make"}
-: ${MKDIR="mkdir"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-: ${SED="/bin/sed"}
-: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
-: ${Xsed="$SED -e 1s/^X//"}
-
-# Global variables:
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
-EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
-
-exit_status=$EXIT_SUCCESS
-
-# Make sure IFS has a sensible default
-lt_nl='
-'
-IFS=" 	$lt_nl"
-
-dirname="s,/[^/]*$,,"
-basename="s,^.*/,,"
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
-}
-
-# Generated shell functions inserted here.
-
-# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
-# is ksh but when the shell is invoked as "sh" and the current value of
-# the _XPG environment variable is not equal to 1 (one), the special
-# positional parameter $0, within a function call, is the name of the
-# function.
-progpath="$0"
-
-# The name of this program:
-# In the unlikely event $progname began with a '-', it would play havoc with
-# func_echo (imagine progname=-n), so we prepend ./ in that case:
-func_dirname_and_basename "$progpath"
-progname=$func_basename_result
-case $progname in
-  -*) progname=./$progname ;;
-esac
-
-# Make sure we have an absolute path for reexecution:
-case $progpath in
-  [\\/]*|[A-Za-z]:\\*) ;;
-  *[\\/]*)
-     progdir=$func_dirname_result
-     progdir=`cd "$progdir" && pwd`
-     progpath="$progdir/$progname"
-     ;;
-  *)
-     save_IFS="$IFS"
-     IFS=:
-     for progdir in $PATH; do
-       IFS="$save_IFS"
-       test -x "$progdir/$progname" && break
-     done
-     IFS="$save_IFS"
-     test -n "$progdir" || progdir=`pwd`
-     progpath="$progdir/$progname"
-     ;;
-esac
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed="${SED}"' -e 1s/^X//'
-sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Re-`\' parameter expansions in output of double_quote_subst that were
-# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
-# in input to double_quote_subst, that '$' was protected from expansion.
-# Since each input `\' is now two `\'s, look for any number of runs of
-# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
-bs='\\'
-bs2='\\\\'
-bs4='\\\\\\\\'
-dollar='\$'
-sed_double_backslash="\
-  s/$bs4/&\\
-/g
-  s/^$bs2$dollar/$bs&/
-  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
-  s/\n//g"
-
-# Standard options:
-opt_dry_run=false
-opt_help=false
-opt_quiet=false
-opt_verbose=false
-opt_warning=:
-
-# func_echo arg...
-# Echo program name prefixed message, along with the current mode
-# name if it has been set yet.
-func_echo ()
-{
-    $ECHO "$progname${mode+: }$mode: $*"
-}
-
-# func_verbose arg...
-# Echo program name prefixed message in verbose mode only.
-func_verbose ()
-{
-    $opt_verbose && func_echo ${1+"$@"}
-
-    # A bug in bash halts the script if the last line of a function
-    # fails when set -e is in force, so we need another command to
-    # work around that:
-    :
-}
-
-# func_error arg...
-# Echo program name prefixed message to standard error.
-func_error ()
-{
-    $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2
-}
-
-# func_warning arg...
-# Echo program name prefixed warning message to standard error.
-func_warning ()
-{
-    $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2
-
-    # bash bug again:
-    :
-}
-
-# func_fatal_error arg...
-# Echo program name prefixed message to standard error, and exit.
-func_fatal_error ()
-{
-    func_error ${1+"$@"}
-    exit $EXIT_FAILURE
-}
-
-# func_fatal_help arg...
-# Echo program name prefixed message to standard error, followed by
-# a help hint, and exit.
-func_fatal_help ()
-{
-    func_error ${1+"$@"}
-    func_fatal_error "$help"
-}
-help="Try \`$progname --help' for more information."  ## default
-
-
-# func_grep expression filename
-# Check whether EXPRESSION matches any line of FILENAME, without output.
-func_grep ()
-{
-    $GREP "$1" "$2" >/dev/null 2>&1
-}
-
-
-# func_mkdir_p directory-path
-# Make sure the entire path to DIRECTORY-PATH is available.
-func_mkdir_p ()
-{
-    my_directory_path="$1"
-    my_dir_list=
-
-    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
-
-      # Protect directory names starting with `-'
-      case $my_directory_path in
-        -*) my_directory_path="./$my_directory_path" ;;
-      esac
-
-      # While some portion of DIR does not yet exist...
-      while test ! -d "$my_directory_path"; do
-        # ...make a list in topmost first order.  Use a colon delimited
-	# list incase some portion of path contains whitespace.
-        my_dir_list="$my_directory_path:$my_dir_list"
-
-        # If the last portion added has no slash in it, the list is done
-        case $my_directory_path in */*) ;; *) break ;; esac
-
-        # ...otherwise throw away the child directory and loop
-        my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"`
-      done
-      my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'`
-
-      save_mkdir_p_IFS="$IFS"; IFS=':'
-      for my_dir in $my_dir_list; do
-	IFS="$save_mkdir_p_IFS"
-        # mkdir can fail with a `File exist' error if two processes
-        # try to create one of the directories concurrently.  Don't
-        # stop in that case!
-        $MKDIR "$my_dir" 2>/dev/null || :
-      done
-      IFS="$save_mkdir_p_IFS"
-
-      # Bail out if we (or some other process) failed to create a directory.
-      test -d "$my_directory_path" || \
-        func_fatal_error "Failed to create \`$1'"
-    fi
-}
-
-
-# func_mktempdir [string]
-# Make a temporary directory that won't clash with other running
-# libtool processes, and avoids race conditions if possible.  If
-# given, STRING is the basename for that directory.
-func_mktempdir ()
-{
-    my_template="${TMPDIR-/tmp}/${1-$progname}"
-
-    if test "$opt_dry_run" = ":"; then
-      # Return a directory name, but don't create it in dry-run mode
-      my_tmpdir="${my_template}-$$"
-    else
-
-      # If mktemp works, use that first and foremost
-      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
-
-      if test ! -d "$my_tmpdir"; then
-        # Failing that, at least try and use $RANDOM to avoid a race
-        my_tmpdir="${my_template}-${RANDOM-0}$$"
-
-        save_mktempdir_umask=`umask`
-        umask 0077
-        $MKDIR "$my_tmpdir"
-        umask $save_mktempdir_umask
-      fi
-
-      # If we're not in dry-run mode, bomb out on failure
-      test -d "$my_tmpdir" || \
-        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
-    fi
-
-    $ECHO "X$my_tmpdir" | $Xsed
-}
-
-
-# func_quote_for_eval arg
-# Aesthetically quote ARG to be evaled later.
-# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
-# is double-quoted, suitable for a subsequent eval, whereas
-# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
-# which are still active within double quotes backslashified.
-func_quote_for_eval ()
-{
-    case $1 in
-      *[\\\`\"\$]*)
-	func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;;
-      *)
-        func_quote_for_eval_unquoted_result="$1" ;;
-    esac
-
-    case $func_quote_for_eval_unquoted_result in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting, command substitution and and variable
-      # expansion for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
-        ;;
-      *)
-        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
-    esac
-}
-
-
-# func_quote_for_expand arg
-# Aesthetically quote ARG to be evaled later; same as above,
-# but do not quote variable references.
-func_quote_for_expand ()
-{
-    case $1 in
-      *[\\\`\"]*)
-	my_arg=`$ECHO "X$1" | $Xsed \
-	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
-      *)
-        my_arg="$1" ;;
-    esac
-
-    case $my_arg in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting and command substitution for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        my_arg="\"$my_arg\""
-        ;;
-    esac
-
-    func_quote_for_expand_result="$my_arg"
-}
-
-
-# func_show_eval cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.
-func_show_eval ()
-{
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
-
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
-
-    if ${opt_dry_run-false}; then :; else
-      eval "$my_cmd"
-      my_status=$?
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
-}
-
-
-# func_show_eval_locale cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.  Use the saved locale for evaluation.
-func_show_eval_locale ()
-{
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
-
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
-
-    if ${opt_dry_run-false}; then :; else
-      eval "$lt_user_locale
-	    $my_cmd"
-      my_status=$?
-      eval "$lt_safe_locale"
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
-}
-
-
-
-
-
-# func_version
-# Echo version message to standard output and exit.
-func_version ()
-{
-    $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / {
-        s/^# //
-	s/^# *$//
-        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
-        p
-     }' < "$progpath"
-     exit $?
-}
-
-# func_usage
-# Echo short help message to standard output and exit.
-func_usage ()
-{
-    $SED -n '/^# Usage:/,/# -h/ {
-        s/^# //
-	s/^# *$//
-	s/\$progname/'$progname'/
-	p
-    }' < "$progpath"
-    $ECHO
-    $ECHO "run \`$progname --help | more' for full usage"
-    exit $?
-}
-
-# func_help
-# Echo long help message to standard output and exit.
-func_help ()
-{
-    $SED -n '/^# Usage:/,/# Report bugs to/ {
-        s/^# //
-	s/^# *$//
-	s*\$progname*'$progname'*
-	s*\$host*'"$host"'*
-	s*\$SHELL*'"$SHELL"'*
-	s*\$LTCC*'"$LTCC"'*
-	s*\$LTCFLAGS*'"$LTCFLAGS"'*
-	s*\$LD*'"$LD"'*
-	s/\$with_gnu_ld/'"$with_gnu_ld"'/
-	s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/
-	s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/
-	p
-     }' < "$progpath"
-    exit $?
-}
-
-# func_missing_arg argname
-# Echo program name prefixed message to standard error and set global
-# exit_cmd.
-func_missing_arg ()
-{
-    func_error "missing argument for $1"
-    exit_cmd=exit
-}
-
-exit_cmd=:
-
-
-
-
-
-# Check that we have a working $ECHO.
-if test "X$1" = X--no-reexec; then
-  # Discard the --no-reexec flag, and continue.
-  shift
-elif test "X$1" = X--fallback-echo; then
-  # Avoid inline document here, it may be left over
-  :
-elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then
-  # Yippee, $ECHO works!
-  :
-else
-  # Restart under the correct shell, and then maybe $ECHO will work.
-  exec $SHELL "$progpath" --no-reexec ${1+"$@"}
-fi
-
-if test "X$1" = X--fallback-echo; then
-  # used as fallback echo
-  shift
-  cat <<EOF
-$*
-EOF
-  exit $EXIT_SUCCESS
-fi
-
-magic="%%%MAGIC variable%%%"
-magic_exe="%%%MAGIC EXE variable%%%"
-
-# Global variables.
-# $mode is unset
-nonopt=
-execute_dlfiles=
-preserve_args=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
-extracted_archives=
-extracted_serial=0
-
-opt_dry_run=false
-opt_duplicate_deps=false
-opt_silent=false
-opt_debug=:
-
-# If this variable is set in any of the actions, the command in it
-# will be execed at the end.  This prevents here-documents from being
-# left over by shells.
-exec_cmd=
-
-# func_fatal_configuration arg...
-# Echo program name prefixed message to standard error, followed by
-# a configuration failure hint, and exit.
-func_fatal_configuration ()
-{
-    func_error ${1+"$@"}
-    func_error "See the $PACKAGE documentation for more information."
-    func_fatal_error "Fatal configuration error."
-}
-
-
-# func_config
-# Display the configuration for all the tags in this script.
-func_config ()
-{
-    re_begincf='^# ### BEGIN LIBTOOL'
-    re_endcf='^# ### END LIBTOOL'
-
-    # Default configuration.
-    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
-
-    # Now print the configurations for the tags.
-    for tagname in $taglist; do
-      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
-    done
-
-    exit $?
-}
-
-# func_features
-# Display the features supported by this script.
-func_features ()
-{
-    $ECHO "host: $host"
-    if test "$build_libtool_libs" = yes; then
-      $ECHO "enable shared libraries"
-    else
-      $ECHO "disable shared libraries"
-    fi
-    if test "$build_old_libs" = yes; then
-      $ECHO "enable static libraries"
-    else
-      $ECHO "disable static libraries"
-    fi
-
-    exit $?
-}
-
-# func_enable_tag tagname
-# Verify that TAGNAME is valid, and either flag an error and exit, or
-# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
-# variable here.
-func_enable_tag ()
-{
-  # Global variable:
-  tagname="$1"
-
-  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
-  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
-  sed_extractcf="/$re_begincf/,/$re_endcf/p"
-
-  # Validate tagname.
-  case $tagname in
-    *[!-_A-Za-z0-9,/]*)
-      func_fatal_error "invalid tag name: $tagname"
-      ;;
-  esac
-
-  # Don't test for the "default" C tag, as we know it's
-  # there but not specially marked.
-  case $tagname in
-    CC) ;;
-    *)
-      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
-	taglist="$taglist $tagname"
-
-	# Evaluate the configuration.  Be careful to quote the path
-	# and the sed script, to avoid splitting on whitespace, but
-	# also don't use non-portable quotes within backquotes within
-	# quotes we have to do it in 2 steps:
-	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
-	eval "$extractedcf"
-      else
-	func_error "ignoring unknown tag $tagname"
-      fi
-      ;;
-  esac
-}
-
-# Parse options once, thoroughly.  This comes as soon as possible in
-# the script to make things like `libtool --version' happen quickly.
-{
-
-  # Shorthand for --mode=foo, only valid as the first argument
-  case $1 in
-  clean|clea|cle|cl)
-    shift; set dummy --mode clean ${1+"$@"}; shift
-    ;;
-  compile|compil|compi|comp|com|co|c)
-    shift; set dummy --mode compile ${1+"$@"}; shift
-    ;;
-  execute|execut|execu|exec|exe|ex|e)
-    shift; set dummy --mode execute ${1+"$@"}; shift
-    ;;
-  finish|finis|fini|fin|fi|f)
-    shift; set dummy --mode finish ${1+"$@"}; shift
-    ;;
-  install|instal|insta|inst|ins|in|i)
-    shift; set dummy --mode install ${1+"$@"}; shift
-    ;;
-  link|lin|li|l)
-    shift; set dummy --mode link ${1+"$@"}; shift
-    ;;
-  uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
-    shift; set dummy --mode uninstall ${1+"$@"}; shift
-    ;;
-  esac
-
-  # Parse non-mode specific arguments:
-  while test "$#" -gt 0; do
-    opt="$1"
-    shift
-
-    case $opt in
-      --config)		func_config					;;
-
-      --debug)		preserve_args="$preserve_args $opt"
-			func_echo "enabling shell trace mode"
-			opt_debug='set -x'
-			$opt_debug
-			;;
-
-      -dlopen)		test "$#" -eq 0 && func_missing_arg "$opt" && break
-			execute_dlfiles="$execute_dlfiles $1"
-			shift
-			;;
-
-      --dry-run | -n)	opt_dry_run=:					;;
-      --features)       func_features					;;
-      --finish)		mode="finish"					;;
-
-      --mode)		test "$#" -eq 0 && func_missing_arg "$opt" && break
-			case $1 in
-			  # Valid mode arguments:
-			  clean)	;;
-			  compile)	;;
-			  execute)	;;
-			  finish)	;;
-			  install)	;;
-			  link)		;;
-			  relink)	;;
-			  uninstall)	;;
-
-			  # Catch anything else as an error
-			  *) func_error "invalid argument for $opt"
-			     exit_cmd=exit
-			     break
-			     ;;
-		        esac
-
-			mode="$1"
-			shift
-			;;
-
-      --preserve-dup-deps)
-			opt_duplicate_deps=:				;;
-
-      --quiet|--silent)	preserve_args="$preserve_args $opt"
-			opt_silent=:
-			;;
-
-      --verbose| -v)	preserve_args="$preserve_args $opt"
-			opt_silent=false
-			;;
-
-      --tag)		test "$#" -eq 0 && func_missing_arg "$opt" && break
-			preserve_args="$preserve_args $opt $1"
-			func_enable_tag "$1"	# tagname is set here
-			shift
-			;;
-
-      # Separate optargs to long options:
-      -dlopen=*|--mode=*|--tag=*)
-			func_opt_split "$opt"
-			set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"}
-			shift
-			;;
-
-      -\?|-h)		func_usage					;;
-      --help)		opt_help=:					;;
-      --version)	func_version					;;
-
-      -*)		func_fatal_help "unrecognized option \`$opt'"	;;
-
-      *)		nonopt="$opt"
-			break
-			;;
-    esac
-  done
-
-
-  case $host in
-    *cygwin* | *mingw* | *pw32* | *cegcc*)
-      # don't eliminate duplications in $postdeps and $predeps
-      opt_duplicate_compiler_generated_deps=:
-      ;;
-    *)
-      opt_duplicate_compiler_generated_deps=$opt_duplicate_deps
-      ;;
-  esac
-
-  # Having warned about all mis-specified options, bail out if
-  # anything was wrong.
-  $exit_cmd $EXIT_FAILURE
-}
-
-# func_check_version_match
-# Ensure that we are using m4 macros, and libtool script from the same
-# release of libtool.
-func_check_version_match ()
-{
-  if test "$package_revision" != "$macro_revision"; then
-    if test "$VERSION" != "$macro_version"; then
-      if test -z "$macro_version"; then
-        cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from an older release.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
-      else
-        cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
-      fi
-    else
-      cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
-$progname: but the definition of this LT_INIT comes from revision $macro_revision.
-$progname: You should recreate aclocal.m4 with macros from revision $package_revision
-$progname: of $PACKAGE $VERSION and run autoconf again.
-_LT_EOF
-    fi
-
-    exit $EXIT_MISMATCH
-  fi
-}
-
-
-## ----------- ##
-##    Main.    ##
-## ----------- ##
-
-$opt_help || {
-  # Sanity checks first:
-  func_check_version_match
-
-  if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
-    func_fatal_configuration "not configured to build any kind of library"
-  fi
-
-  test -z "$mode" && func_fatal_error "error: you must specify a MODE."
-
-
-  # Darwin sucks
-  eval std_shrext=\"$shrext_cmds\"
-
-
-  # Only execute mode is allowed to have -dlopen flags.
-  if test -n "$execute_dlfiles" && test "$mode" != execute; then
-    func_error "unrecognized option \`-dlopen'"
-    $ECHO "$help" 1>&2
-    exit $EXIT_FAILURE
-  fi
-
-  # Change the help message to a mode-specific one.
-  generic_help="$help"
-  help="Try \`$progname --help --mode=$mode' for more information."
-}
-
-
-# func_lalib_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_lalib_p ()
-{
-    test -f "$1" &&
-      $SED -e 4q "$1" 2>/dev/null \
-        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
-}
-
-# func_lalib_unsafe_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
-# This function implements the same check as func_lalib_p without
-# resorting to external programs.  To this end, it redirects stdin and
-# closes it afterwards, without saving the original file descriptor.
-# As a safety measure, use it only where a negative result would be
-# fatal anyway.  Works if `file' does not exist.
-func_lalib_unsafe_p ()
-{
-    lalib_p=no
-    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
-	for lalib_p_l in 1 2 3 4
-	do
-	    read lalib_p_line
-	    case "$lalib_p_line" in
-		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
-	    esac
-	done
-	exec 0<&5 5<&-
-    fi
-    test "$lalib_p" = yes
-}
-
-# func_ltwrapper_script_p file
-# True iff FILE is a libtool wrapper script
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_script_p ()
-{
-    func_lalib_p "$1"
-}
-
-# func_ltwrapper_executable_p file
-# True iff FILE is a libtool wrapper executable
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_executable_p ()
-{
-    func_ltwrapper_exec_suffix=
-    case $1 in
-    *.exe) ;;
-    *) func_ltwrapper_exec_suffix=.exe ;;
-    esac
-    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
-}
-
-# func_ltwrapper_scriptname file
-# Assumes file is an ltwrapper_executable
-# uses $file to determine the appropriate filename for a
-# temporary ltwrapper_script.
-func_ltwrapper_scriptname ()
-{
-    func_ltwrapper_scriptname_result=""
-    if func_ltwrapper_executable_p "$1"; then
-	func_dirname_and_basename "$1" "" "."
-	func_stripname '' '.exe' "$func_basename_result"
-	func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
-    fi
-}
-
-# func_ltwrapper_p file
-# True iff FILE is a libtool wrapper script or wrapper executable
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_p ()
-{
-    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
-}
-
-
-# func_execute_cmds commands fail_cmd
-# Execute tilde-delimited COMMANDS.
-# If FAIL_CMD is given, eval that upon failure.
-# FAIL_CMD may read-access the current command in variable CMD!
-func_execute_cmds ()
-{
-    $opt_debug
-    save_ifs=$IFS; IFS='~'
-    for cmd in $1; do
-      IFS=$save_ifs
-      eval cmd=\"$cmd\"
-      func_show_eval "$cmd" "${2-:}"
-    done
-    IFS=$save_ifs
-}
-
-
-# func_source file
-# Source FILE, adding directory component if necessary.
-# Note that it is not necessary on cygwin/mingw to append a dot to
-# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
-# behavior happens only for exec(3), not for open(2)!  Also, sourcing
-# `FILE.' does not work on cygwin managed mounts.
-func_source ()
-{
-    $opt_debug
-    case $1 in
-    */* | *\\*)	. "$1" ;;
-    *)		. "./$1" ;;
-    esac
-}
-
-
-# func_infer_tag arg
-# Infer tagged configuration to use if any are available and
-# if one wasn't chosen via the "--tag" command line option.
-# Only attempt this if the compiler in the base compile
-# command doesn't match the default compiler.
-# arg is usually of the form 'gcc ...'
-func_infer_tag ()
-{
-    $opt_debug
-    if test -n "$available_tags" && test -z "$tagname"; then
-      CC_quoted=
-      for arg in $CC; do
-        func_quote_for_eval "$arg"
-	CC_quoted="$CC_quoted $func_quote_for_eval_result"
-      done
-      case $@ in
-      # Blanks in the command may have been stripped by the calling shell,
-      # but not from the CC environment variable when configure was run.
-      " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;;
-      # Blanks at the start of $base_compile will cause this to fail
-      # if we don't check for them as well.
-      *)
-	for z in $available_tags; do
-	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
-	    # Evaluate the configuration.
-	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
-	    CC_quoted=
-	    for arg in $CC; do
-	      # Double-quote args containing other shell metacharacters.
-	      func_quote_for_eval "$arg"
-	      CC_quoted="$CC_quoted $func_quote_for_eval_result"
-	    done
-	    case "$@ " in
-	      " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*)
-	      # The compiler in the base compile command matches
-	      # the one in the tagged configuration.
-	      # Assume this is the tagged configuration we want.
-	      tagname=$z
-	      break
-	      ;;
-	    esac
-	  fi
-	done
-	# If $tagname still isn't set, then no tagged configuration
-	# was found and let the user know that the "--tag" command
-	# line option must be used.
-	if test -z "$tagname"; then
-	  func_echo "unable to infer tagged configuration"
-	  func_fatal_error "specify a tag with \`--tag'"
-#	else
-#	  func_verbose "using $tagname tagged configuration"
-	fi
-	;;
-      esac
-    fi
-}
-
-
-
-# func_write_libtool_object output_name pic_name nonpic_name
-# Create a libtool object file (analogous to a ".la" file),
-# but don't create it if we're doing a dry run.
-func_write_libtool_object ()
-{
-    write_libobj=${1}
-    if test "$build_libtool_libs" = yes; then
-      write_lobj=\'${2}\'
-    else
-      write_lobj=none
-    fi
-
-    if test "$build_old_libs" = yes; then
-      write_oldobj=\'${3}\'
-    else
-      write_oldobj=none
-    fi
-
-    $opt_dry_run || {
-      cat >${write_libobj}T <<EOF
-# $write_libobj - a libtool object file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# Name of the PIC object.
-pic_object=$write_lobj
-
-# Name of the non-PIC object
-non_pic_object=$write_oldobj
-
-EOF
-      $MV "${write_libobj}T" "${write_libobj}"
-    }
-}
-
-# func_mode_compile arg...
-func_mode_compile ()
-{
-    $opt_debug
-    # Get the compilation command and the source file.
-    base_compile=
-    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
-    suppress_opt=yes
-    suppress_output=
-    arg_mode=normal
-    libobj=
-    later=
-    pie_flag=
-
-    for arg
-    do
-      case $arg_mode in
-      arg  )
-	# do not "continue".  Instead, add this to base_compile
-	lastarg="$arg"
-	arg_mode=normal
-	;;
-
-      target )
-	libobj="$arg"
-	arg_mode=normal
-	continue
-	;;
-
-      normal )
-	# Accept any command-line options.
-	case $arg in
-	-o)
-	  test -n "$libobj" && \
-	    func_fatal_error "you cannot specify \`-o' more than once"
-	  arg_mode=target
-	  continue
-	  ;;
-
-	-pie | -fpie | -fPIE)
-          pie_flag="$pie_flag $arg"
-	  continue
-	  ;;
-
-	-shared | -static | -prefer-pic | -prefer-non-pic)
-	  later="$later $arg"
-	  continue
-	  ;;
-
-	-no-suppress)
-	  suppress_opt=no
-	  continue
-	  ;;
-
-	-Xcompiler)
-	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
-	  continue      #  The current "srcfile" will either be retained or
-	  ;;            #  replaced later.  I would guess that would be a bug.
-
-	-Wc,*)
-	  func_stripname '-Wc,' '' "$arg"
-	  args=$func_stripname_result
-	  lastarg=
-	  save_ifs="$IFS"; IFS=','
-	  for arg in $args; do
-	    IFS="$save_ifs"
-	    func_quote_for_eval "$arg"
-	    lastarg="$lastarg $func_quote_for_eval_result"
-	  done
-	  IFS="$save_ifs"
-	  func_stripname ' ' '' "$lastarg"
-	  lastarg=$func_stripname_result
-
-	  # Add the arguments to base_compile.
-	  base_compile="$base_compile $lastarg"
-	  continue
-	  ;;
-
-	*)
-	  # Accept the current argument as the source file.
-	  # The previous "srcfile" becomes the current argument.
-	  #
-	  lastarg="$srcfile"
-	  srcfile="$arg"
-	  ;;
-	esac  #  case $arg
-	;;
-      esac    #  case $arg_mode
-
-      # Aesthetically quote the previous argument.
-      func_quote_for_eval "$lastarg"
-      base_compile="$base_compile $func_quote_for_eval_result"
-    done # for arg
-
-    case $arg_mode in
-    arg)
-      func_fatal_error "you must specify an argument for -Xcompile"
-      ;;
-    target)
-      func_fatal_error "you must specify a target with \`-o'"
-      ;;
-    *)
-      # Get the name of the library object.
-      test -z "$libobj" && {
-	func_basename "$srcfile"
-	libobj="$func_basename_result"
-      }
-      ;;
-    esac
-
-    # Recognize several different file suffixes.
-    # If the user specifies -o file.o, it is replaced with file.lo
-    case $libobj in
-    *.[cCFSifmso] | \
-    *.ada | *.adb | *.ads | *.asm | \
-    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
-    *.[fF][09]? | *.for | *.java | *.obj | *.sx)
-      func_xform "$libobj"
-      libobj=$func_xform_result
-      ;;
-    esac
-
-    case $libobj in
-    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
-    *)
-      func_fatal_error "cannot determine name of library object from \`$libobj'"
-      ;;
-    esac
-
-    func_infer_tag $base_compile
-
-    for arg in $later; do
-      case $arg in
-      -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
-	build_old_libs=no
-	continue
-	;;
-
-      -static)
-	build_libtool_libs=no
-	build_old_libs=yes
-	continue
-	;;
-
-      -prefer-pic)
-	pic_mode=yes
-	continue
-	;;
-
-      -prefer-non-pic)
-	pic_mode=no
-	continue
-	;;
-      esac
-    done
-
-    func_quote_for_eval "$libobj"
-    test "X$libobj" != "X$func_quote_for_eval_result" \
-      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
-      && func_warning "libobj name \`$libobj' may not contain shell special characters."
-    func_dirname_and_basename "$obj" "/" ""
-    objname="$func_basename_result"
-    xdir="$func_dirname_result"
-    lobj=${xdir}$objdir/$objname
-
-    test -z "$base_compile" && \
-      func_fatal_help "you must specify a compilation command"
-
-    # Delete any leftover library objects.
-    if test "$build_old_libs" = yes; then
-      removelist="$obj $lobj $libobj ${libobj}T"
-    else
-      removelist="$lobj $libobj ${libobj}T"
-    fi
-
-    # On Cygwin there's no "real" PIC flag so we must build both object types
-    case $host_os in
-    cygwin* | mingw* | pw32* | os2* | cegcc*)
-      pic_mode=default
-      ;;
-    esac
-    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
-      # non-PIC code in shared libraries is not supported
-      pic_mode=default
-    fi
-
-    # Calculate the filename of the output object if compiler does
-    # not support -o with -c
-    if test "$compiler_c_o" = no; then
-      output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
-      lockfile="$output_obj.lock"
-    else
-      output_obj=
-      need_locks=no
-      lockfile=
-    fi
-
-    # Lock this critical section if it is needed
-    # We use this script file to make the link, it avoids creating a new file
-    if test "$need_locks" = yes; then
-      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
-	func_echo "Waiting for $lockfile to be removed"
-	sleep 2
-      done
-    elif test "$need_locks" = warn; then
-      if test -f "$lockfile"; then
-	$ECHO "\
-*** ERROR, $lockfile exists and contains:
-`cat $lockfile 2>/dev/null`
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-      removelist="$removelist $output_obj"
-      $ECHO "$srcfile" > "$lockfile"
-    fi
-
-    $opt_dry_run || $RM $removelist
-    removelist="$removelist $lockfile"
-    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
-
-    if test -n "$fix_srcfile_path"; then
-      eval srcfile=\"$fix_srcfile_path\"
-    fi
-    func_quote_for_eval "$srcfile"
-    qsrcfile=$func_quote_for_eval_result
-
-    # Only build a PIC object if we are building libtool libraries.
-    if test "$build_libtool_libs" = yes; then
-      # Without this assignment, base_compile gets emptied.
-      fbsd_hideous_sh_bug=$base_compile
-
-      if test "$pic_mode" != no; then
-	command="$base_compile $qsrcfile $pic_flag"
-      else
-	# Don't build PIC code
-	command="$base_compile $qsrcfile"
-      fi
-
-      func_mkdir_p "$xdir$objdir"
-
-      if test -z "$output_obj"; then
-	# Place PIC objects in $objdir
-	command="$command -o $lobj"
-      fi
-
-      func_show_eval_locale "$command"	\
-          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
-
-      if test "$need_locks" = warn &&
-	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$ECHO "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-
-      # Just move the object if needed, then go on to compile the next one
-      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
-	func_show_eval '$MV "$output_obj" "$lobj"' \
-	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
-      fi
-
-      # Allow error messages only from the first compilation.
-      if test "$suppress_opt" = yes; then
-	suppress_output=' >/dev/null 2>&1'
-      fi
-    fi
-
-    # Only build a position-dependent object if we build old libraries.
-    if test "$build_old_libs" = yes; then
-      if test "$pic_mode" != yes; then
-	# Don't build PIC code
-	command="$base_compile $qsrcfile$pie_flag"
-      else
-	command="$base_compile $qsrcfile $pic_flag"
-      fi
-      if test "$compiler_c_o" = yes; then
-	command="$command -o $obj"
-      fi
-
-      # Suppress compiler output if we already did a PIC compilation.
-      command="$command$suppress_output"
-      func_show_eval_locale "$command" \
-        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
-
-      if test "$need_locks" = warn &&
-	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$ECHO "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-
-      # Just move the object if needed
-      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
-	func_show_eval '$MV "$output_obj" "$obj"' \
-	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
-      fi
-    fi
-
-    $opt_dry_run || {
-      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
-
-      # Unlock the critical section if it was locked
-      if test "$need_locks" != no; then
-	removelist=$lockfile
-        $RM "$lockfile"
-      fi
-    }
-
-    exit $EXIT_SUCCESS
-}
-
-$opt_help || {
-test "$mode" = compile && func_mode_compile ${1+"$@"}
-}
-
-func_mode_help ()
-{
-    # We need to display help for each of the modes.
-    case $mode in
-      "")
-        # Generic help is extracted from the usage comments
-        # at the start of this file.
-        func_help
-        ;;
-
-      clean)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
-
-Remove files from the build directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, object or program, all the files associated
-with it are deleted. Otherwise, only FILE itself is deleted using RM."
-        ;;
-
-      compile)
-      $ECHO \
-"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
-
-Compile a source file into a libtool library object.
-
-This mode accepts the following additional options:
-
-  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
-  -no-suppress      do not suppress compiler output for multiple passes
-  -prefer-pic       try to building PIC objects only
-  -prefer-non-pic   try to building non-PIC objects only
-  -shared           do not build a \`.o' file suitable for static linking
-  -static           only build a \`.o' file suitable for static linking
-
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
-from the given SOURCEFILE.
-
-The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
-        ;;
-
-      execute)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
-
-Automatically set library path, then run a program.
-
-This mode accepts the following additional options:
-
-  -dlopen FILE      add the directory containing FILE to the library path
-
-This mode sets the library path environment variable according to \`-dlopen'
-flags.
-
-If any of the ARGS are libtool executable wrappers, then they are translated
-into their corresponding uninstalled binary, and any of their required library
-directories are added to the library path.
-
-Then, COMMAND is executed, with ARGS as arguments."
-        ;;
-
-      finish)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
-
-Complete the installation of libtool libraries.
-
-Each LIBDIR is a directory that contains libtool libraries.
-
-The commands that this mode executes may require superuser privileges.  Use
-the \`--dry-run' option if you just want to see what would be executed."
-        ;;
-
-      install)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
-
-Install executables or libraries.
-
-INSTALL-COMMAND is the installation command.  The first component should be
-either the \`install' or \`cp' program.
-
-The following components of INSTALL-COMMAND are treated specially:
-
-  -inst-prefix PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
-
-The rest of the components are interpreted as arguments to that command (only
-BSD-compatible install options are recognized)."
-        ;;
-
-      link)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
-
-Link object files or libraries together to form another library, or to
-create an executable program.
-
-LINK-COMMAND is a command using the C compiler that you would use to create
-a program from several object files.
-
-The following components of LINK-COMMAND are treated specially:
-
-  -all-static       do not do any dynamic linking at all
-  -avoid-version    do not add a version suffix if possible
-  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
-  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
-  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
-  -export-symbols SYMFILE
-                    try to export only the symbols listed in SYMFILE
-  -export-symbols-regex REGEX
-                    try to export only the symbols matching REGEX
-  -LLIBDIR          search LIBDIR for required installed libraries
-  -lNAME            OUTPUT-FILE requires the installed library libNAME
-  -module           build a library that can dlopened
-  -no-fast-install  disable the fast-install mode
-  -no-install       link a not-installable executable
-  -no-undefined     declare that a library does not refer to external symbols
-  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
-  -objectlist FILE  Use a list of object files found in FILE to specify objects
-  -precious-files-regex REGEX
-                    don't remove output files matching REGEX
-  -release RELEASE  specify package release information
-  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
-  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
-  -shared           only do dynamic linking of libtool libraries
-  -shrext SUFFIX    override the standard shared library file extension
-  -static           do not do any dynamic linking of uninstalled libtool libraries
-  -static-libtool-libs
-                    do not do any dynamic linking of libtool libraries
-  -version-info CURRENT[:REVISION[:AGE]]
-                    specify library version info [each variable defaults to 0]
-  -weak LIBNAME     declare that the target provides the LIBNAME interface
-
-All other options (arguments beginning with \`-') are ignored.
-
-Every other argument is treated as a filename.  Files ending in \`.la' are
-treated as uninstalled libtool libraries, other files are standard or library
-object files.
-
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
-required, except when creating a convenience library.
-
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
-
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
-is created, otherwise an executable program is created."
-        ;;
-
-      uninstall)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
-
-Remove libraries from an installation directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, all the files associated with it are deleted.
-Otherwise, only FILE itself is deleted using RM."
-        ;;
-
-      *)
-        func_fatal_help "invalid operation mode \`$mode'"
-        ;;
-    esac
-
-    $ECHO
-    $ECHO "Try \`$progname --help' for more information about other modes."
-
-    exit $?
-}
-
-  # Now that we've collected a possible --mode arg, show help if necessary
-  $opt_help && func_mode_help
-
-
-# func_mode_execute arg...
-func_mode_execute ()
-{
-    $opt_debug
-    # The first argument is the command name.
-    cmd="$nonopt"
-    test -z "$cmd" && \
-      func_fatal_help "you must specify a COMMAND"
-
-    # Handle -dlopen flags immediately.
-    for file in $execute_dlfiles; do
-      test -f "$file" \
-	|| func_fatal_help "\`$file' is not a file"
-
-      dir=
-      case $file in
-      *.la)
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$lib' is not a valid libtool archive"
-
-	# Read the libtool library.
-	dlname=
-	library_names=
-	func_source "$file"
-
-	# Skip this library if it cannot be dlopened.
-	if test -z "$dlname"; then
-	  # Warn if it was a shared library.
-	  test -n "$library_names" && \
-	    func_warning "\`$file' was not linked with \`-export-dynamic'"
-	  continue
-	fi
-
-	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
-
-	if test -f "$dir/$objdir/$dlname"; then
-	  dir="$dir/$objdir"
-	else
-	  if test ! -f "$dir/$dlname"; then
-	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
-	  fi
-	fi
-	;;
-
-      *.lo)
-	# Just add the directory containing the .lo file.
-	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
-	;;
-
-      *)
-	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
-	continue
-	;;
-      esac
-
-      # Get the absolute pathname.
-      absdir=`cd "$dir" && pwd`
-      test -n "$absdir" && dir="$absdir"
-
-      # Now add the directory to shlibpath_var.
-      if eval "test -z \"\$$shlibpath_var\""; then
-	eval "$shlibpath_var=\"\$dir\""
-      else
-	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
-      fi
-    done
-
-    # This variable tells wrapper scripts just to set shlibpath_var
-    # rather than running their programs.
-    libtool_execute_magic="$magic"
-
-    # Check if any of the arguments is a wrapper script.
-    args=
-    for file
-    do
-      case $file in
-      -*) ;;
-      *)
-	# Do a test to see if this is really a libtool program.
-	if func_ltwrapper_script_p "$file"; then
-	  func_source "$file"
-	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
-	elif func_ltwrapper_executable_p "$file"; then
-	  func_ltwrapper_scriptname "$file"
-	  func_source "$func_ltwrapper_scriptname_result"
-	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
-	fi
-	;;
-      esac
-      # Quote arguments (to preserve shell metacharacters).
-      func_quote_for_eval "$file"
-      args="$args $func_quote_for_eval_result"
-    done
-
-    if test "X$opt_dry_run" = Xfalse; then
-      if test -n "$shlibpath_var"; then
-	# Export the shlibpath_var.
-	eval "export $shlibpath_var"
-      fi
-
-      # Restore saved environment variables
-      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-      do
-	eval "if test \"\${save_$lt_var+set}\" = set; then
-                $lt_var=\$save_$lt_var; export $lt_var
-	      else
-		$lt_unset $lt_var
-	      fi"
-      done
-
-      # Now prepare to actually exec the command.
-      exec_cmd="\$cmd$args"
-    else
-      # Display what would be done.
-      if test -n "$shlibpath_var"; then
-	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
-	$ECHO "export $shlibpath_var"
-      fi
-      $ECHO "$cmd$args"
-      exit $EXIT_SUCCESS
-    fi
-}
-
-test "$mode" = execute && func_mode_execute ${1+"$@"}
-
-
-# func_mode_finish arg...
-func_mode_finish ()
-{
-    $opt_debug
-    libdirs="$nonopt"
-    admincmds=
-
-    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
-      for dir
-      do
-	libdirs="$libdirs $dir"
-      done
-
-      for libdir in $libdirs; do
-	if test -n "$finish_cmds"; then
-	  # Do each command in the finish commands.
-	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
-'"$cmd"'"'
-	fi
-	if test -n "$finish_eval"; then
-	  # Do the single finish_eval.
-	  eval cmds=\"$finish_eval\"
-	  $opt_dry_run || eval "$cmds" || admincmds="$admincmds
-       $cmds"
-	fi
-      done
-    fi
-
-    # Exit here if they wanted silent mode.
-    $opt_silent && exit $EXIT_SUCCESS
-
-    $ECHO "X----------------------------------------------------------------------" | $Xsed
-    $ECHO "Libraries have been installed in:"
-    for libdir in $libdirs; do
-      $ECHO "   $libdir"
-    done
-    $ECHO
-    $ECHO "If you ever happen to want to link against installed libraries"
-    $ECHO "in a given directory, LIBDIR, you must either use libtool, and"
-    $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'"
-    $ECHO "flag during linking and do at least one of the following:"
-    if test -n "$shlibpath_var"; then
-      $ECHO "   - add LIBDIR to the \`$shlibpath_var' environment variable"
-      $ECHO "     during execution"
-    fi
-    if test -n "$runpath_var"; then
-      $ECHO "   - add LIBDIR to the \`$runpath_var' environment variable"
-      $ECHO "     during linking"
-    fi
-    if test -n "$hardcode_libdir_flag_spec"; then
-      libdir=LIBDIR
-      eval flag=\"$hardcode_libdir_flag_spec\"
-
-      $ECHO "   - use the \`$flag' linker flag"
-    fi
-    if test -n "$admincmds"; then
-      $ECHO "   - have your system administrator run these commands:$admincmds"
-    fi
-    if test -f /etc/ld.so.conf; then
-      $ECHO "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
-    fi
-    $ECHO
-
-    $ECHO "See any operating system documentation about shared libraries for"
-    case $host in
-      solaris2.[6789]|solaris2.1[0-9])
-        $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual"
-	$ECHO "pages."
-	;;
-      *)
-        $ECHO "more information, such as the ld(1) and ld.so(8) manual pages."
-        ;;
-    esac
-    $ECHO "X----------------------------------------------------------------------" | $Xsed
-    exit $EXIT_SUCCESS
-}
-
-test "$mode" = finish && func_mode_finish ${1+"$@"}
-
-
-# func_mode_install arg...
-func_mode_install ()
-{
-    $opt_debug
-    # There may be an optional sh(1) argument at the beginning of
-    # install_prog (especially on Windows NT).
-    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
-       # Allow the use of GNU shtool's install command.
-       $ECHO "X$nonopt" | $GREP shtool >/dev/null; then
-      # Aesthetically quote it.
-      func_quote_for_eval "$nonopt"
-      install_prog="$func_quote_for_eval_result "
-      arg=$1
-      shift
-    else
-      install_prog=
-      arg=$nonopt
-    fi
-
-    # The real first argument should be the name of the installation program.
-    # Aesthetically quote it.
-    func_quote_for_eval "$arg"
-    install_prog="$install_prog$func_quote_for_eval_result"
-
-    # We need to accept at least all the BSD install flags.
-    dest=
-    files=
-    opts=
-    prev=
-    install_type=
-    isdir=no
-    stripme=
-    for arg
-    do
-      if test -n "$dest"; then
-	files="$files $dest"
-	dest=$arg
-	continue
-      fi
-
-      case $arg in
-      -d) isdir=yes ;;
-      -f)
-	case " $install_prog " in
-	*[\\\ /]cp\ *) ;;
-	*) prev=$arg ;;
-	esac
-	;;
-      -g | -m | -o)
-	prev=$arg
-	;;
-      -s)
-	stripme=" -s"
-	continue
-	;;
-      -*)
-	;;
-      *)
-	# If the previous option needed an argument, then skip it.
-	if test -n "$prev"; then
-	  prev=
-	else
-	  dest=$arg
-	  continue
-	fi
-	;;
-      esac
-
-      # Aesthetically quote the argument.
-      func_quote_for_eval "$arg"
-      install_prog="$install_prog $func_quote_for_eval_result"
-    done
-
-    test -z "$install_prog" && \
-      func_fatal_help "you must specify an install program"
-
-    test -n "$prev" && \
-      func_fatal_help "the \`$prev' option requires an argument"
-
-    if test -z "$files"; then
-      if test -z "$dest"; then
-	func_fatal_help "no file or destination specified"
-      else
-	func_fatal_help "you must specify a destination"
-      fi
-    fi
-
-    # Strip any trailing slash from the destination.
-    func_stripname '' '/' "$dest"
-    dest=$func_stripname_result
-
-    # Check to see that the destination is a directory.
-    test -d "$dest" && isdir=yes
-    if test "$isdir" = yes; then
-      destdir="$dest"
-      destname=
-    else
-      func_dirname_and_basename "$dest" "" "."
-      destdir="$func_dirname_result"
-      destname="$func_basename_result"
-
-      # Not a directory, so check to see that there is only one file specified.
-      set dummy $files; shift
-      test "$#" -gt 1 && \
-	func_fatal_help "\`$dest' is not a directory"
-    fi
-    case $destdir in
-    [\\/]* | [A-Za-z]:[\\/]*) ;;
-    *)
-      for file in $files; do
-	case $file in
-	*.lo) ;;
-	*)
-	  func_fatal_help "\`$destdir' must be an absolute directory name"
-	  ;;
-	esac
-      done
-      ;;
-    esac
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    staticlibs=
-    future_libdirs=
-    current_libdirs=
-    for file in $files; do
-
-      # Do each installation.
-      case $file in
-      *.$libext)
-	# Do the static libraries later.
-	staticlibs="$staticlibs $file"
-	;;
-
-      *.la)
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$file' is not a valid libtool archive"
-
-	library_names=
-	old_library=
-	relink_command=
-	func_source "$file"
-
-	# Add the libdir to current_libdirs if it is the destination.
-	if test "X$destdir" = "X$libdir"; then
-	  case "$current_libdirs " in
-	  *" $libdir "*) ;;
-	  *) current_libdirs="$current_libdirs $libdir" ;;
-	  esac
-	else
-	  # Note the libdir as a future libdir.
-	  case "$future_libdirs " in
-	  *" $libdir "*) ;;
-	  *) future_libdirs="$future_libdirs $libdir" ;;
-	  esac
-	fi
-
-	func_dirname "$file" "/" ""
-	dir="$func_dirname_result"
-	dir="$dir$objdir"
-
-	if test -n "$relink_command"; then
-	  # Determine the prefix the user has applied to our future dir.
-	  inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"`
-
-	  # Don't allow the user to place us outside of our expected
-	  # location b/c this prevents finding dependent libraries that
-	  # are installed to the same prefix.
-	  # At present, this check doesn't affect windows .dll's that
-	  # are installed into $libdir/../bin (currently, that works fine)
-	  # but it's something to keep an eye on.
-	  test "$inst_prefix_dir" = "$destdir" && \
-	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
-
-	  if test -n "$inst_prefix_dir"; then
-	    # Stick the inst_prefix_dir data into the link command.
-	    relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
-	  else
-	    relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"`
-	  fi
-
-	  func_warning "relinking \`$file'"
-	  func_show_eval "$relink_command" \
-	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
-	fi
-
-	# See the names of the shared library.
-	set dummy $library_names; shift
-	if test -n "$1"; then
-	  realname="$1"
-	  shift
-
-	  srcname="$realname"
-	  test -n "$relink_command" && srcname="$realname"T
-
-	  # Install the shared library and build the symlinks.
-	  func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \
-	      'exit $?'
-	  tstripme="$stripme"
-	  case $host_os in
-	  cygwin* | mingw* | pw32* | cegcc*)
-	    case $realname in
-	    *.dll.a)
-	      tstripme=""
-	      ;;
-	    esac
-	    ;;
-	  esac
-	  if test -n "$tstripme" && test -n "$striplib"; then
-	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
-	  fi
-
-	  if test "$#" -gt 0; then
-	    # Delete the old symlinks, and create new ones.
-	    # Try `ln -sf' first, because the `ln' binary might depend on
-	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
-	    # so we also need to try rm && ln -s.
-	    for linkname
-	    do
-	      test "$linkname" != "$realname" \
-		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
-	    done
-	  fi
-
-	  # Do each command in the postinstall commands.
-	  lib="$destdir/$realname"
-	  func_execute_cmds "$postinstall_cmds" 'exit $?'
-	fi
-
-	# Install the pseudo-library for information purposes.
-	func_basename "$file"
-	name="$func_basename_result"
-	instname="$dir/$name"i
-	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
-
-	# Maybe install the static library, too.
-	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
-	;;
-
-      *.lo)
-	# Install (i.e. copy) a libtool object.
-
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
-	else
-	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
-	fi
-
-	# Deduce the name of the destination old-style object file.
-	case $destfile in
-	*.lo)
-	  func_lo2o "$destfile"
-	  staticdest=$func_lo2o_result
-	  ;;
-	*.$objext)
-	  staticdest="$destfile"
-	  destfile=
-	  ;;
-	*)
-	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
-	  ;;
-	esac
-
-	# Install the libtool object if requested.
-	test -n "$destfile" && \
-	  func_show_eval "$install_prog $file $destfile" 'exit $?'
-
-	# Install the old object if enabled.
-	if test "$build_old_libs" = yes; then
-	  # Deduce the name of the old-style object file.
-	  func_lo2o "$file"
-	  staticobj=$func_lo2o_result
-	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
-	fi
-	exit $EXIT_SUCCESS
-	;;
-
-      *)
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
-	else
-	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
-	fi
-
-	# If the file is missing, and there is a .exe on the end, strip it
-	# because it is most likely a libtool script we actually want to
-	# install
-	stripped_ext=""
-	case $file in
-	  *.exe)
-	    if test ! -f "$file"; then
-	      func_stripname '' '.exe' "$file"
-	      file=$func_stripname_result
-	      stripped_ext=".exe"
-	    fi
-	    ;;
-	esac
-
-	# Do a test to see if this is really a libtool program.
-	case $host in
-	*cygwin* | *mingw*)
-	    if func_ltwrapper_executable_p "$file"; then
-	      func_ltwrapper_scriptname "$file"
-	      wrapper=$func_ltwrapper_scriptname_result
-	    else
-	      func_stripname '' '.exe' "$file"
-	      wrapper=$func_stripname_result
-	    fi
-	    ;;
-	*)
-	    wrapper=$file
-	    ;;
-	esac
-	if func_ltwrapper_script_p "$wrapper"; then
-	  notinst_deplibs=
-	  relink_command=
-
-	  func_source "$wrapper"
-
-	  # Check the variables that should have been set.
-	  test -z "$generated_by_libtool_version" && \
-	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
-
-	  finalize=yes
-	  for lib in $notinst_deplibs; do
-	    # Check to see that each library is installed.
-	    libdir=
-	    if test -f "$lib"; then
-	      func_source "$lib"
-	    fi
-	    libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
-	    if test -n "$libdir" && test ! -f "$libfile"; then
-	      func_warning "\`$lib' has not been installed in \`$libdir'"
-	      finalize=no
-	    fi
-	  done
-
-	  relink_command=
-	  func_source "$wrapper"
-
-	  outputname=
-	  if test "$fast_install" = no && test -n "$relink_command"; then
-	    $opt_dry_run || {
-	      if test "$finalize" = yes; then
-	        tmpdir=`func_mktempdir`
-		func_basename "$file$stripped_ext"
-		file="$func_basename_result"
-	        outputname="$tmpdir/$file"
-	        # Replace the output file specification.
-	        relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
-
-	        $opt_silent || {
-	          func_quote_for_expand "$relink_command"
-		  eval "func_echo $func_quote_for_expand_result"
-	        }
-	        if eval "$relink_command"; then :
-	          else
-		  func_error "error: relink \`$file' with the above command before installing it"
-		  $opt_dry_run || ${RM}r "$tmpdir"
-		  continue
-	        fi
-	        file="$outputname"
-	      else
-	        func_warning "cannot relink \`$file'"
-	      fi
-	    }
-	  else
-	    # Install the binary that we compiled earlier.
-	    file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
-	  fi
-	fi
-
-	# remove .exe since cygwin /usr/bin/install will append another
-	# one anyway
-	case $install_prog,$host in
-	*/usr/bin/install*,*cygwin*)
-	  case $file:$destfile in
-	  *.exe:*.exe)
-	    # this is ok
-	    ;;
-	  *.exe:*)
-	    destfile=$destfile.exe
-	    ;;
-	  *:*.exe)
-	    func_stripname '' '.exe' "$destfile"
-	    destfile=$func_stripname_result
-	    ;;
-	  esac
-	  ;;
-	esac
-	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
-	$opt_dry_run || if test -n "$outputname"; then
-	  ${RM}r "$tmpdir"
-	fi
-	;;
-      esac
-    done
-
-    for file in $staticlibs; do
-      func_basename "$file"
-      name="$func_basename_result"
-
-      # Set up the ranlib parameters.
-      oldlib="$destdir/$name"
-
-      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
-
-      if test -n "$stripme" && test -n "$old_striplib"; then
-	func_show_eval "$old_striplib $oldlib" 'exit $?'
-      fi
-
-      # Do each command in the postinstall commands.
-      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
-    done
-
-    test -n "$future_libdirs" && \
-      func_warning "remember to run \`$progname --finish$future_libdirs'"
-
-    if test -n "$current_libdirs"; then
-      # Maybe just do a dry run.
-      $opt_dry_run && current_libdirs=" -n$current_libdirs"
-      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
-    else
-      exit $EXIT_SUCCESS
-    fi
-}
-
-test "$mode" = install && func_mode_install ${1+"$@"}
-
-
-# func_generate_dlsyms outputname originator pic_p
-# Extract symbols from dlprefiles and create ${outputname}S.o with
-# a dlpreopen symbol table.
-func_generate_dlsyms ()
-{
-    $opt_debug
-    my_outputname="$1"
-    my_originator="$2"
-    my_pic_p="${3-no}"
-    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
-    my_dlsyms=
-
-    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-      if test -n "$NM" && test -n "$global_symbol_pipe"; then
-	my_dlsyms="${my_outputname}S.c"
-      else
-	func_error "not configured to extract global symbols from dlpreopened files"
-      fi
-    fi
-
-    if test -n "$my_dlsyms"; then
-      case $my_dlsyms in
-      "") ;;
-      *.c)
-	# Discover the nlist of each of the dlfiles.
-	nlist="$output_objdir/${my_outputname}.nm"
-
-	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
-
-	# Parse the name list into a source file.
-	func_verbose "creating $output_objdir/$my_dlsyms"
-
-	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
-/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
-/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
-
-#ifdef __cplusplus
-extern \"C\" {
-#endif
-
-/* External symbol declarations for the compiler. */\
-"
-
-	if test "$dlself" = yes; then
-	  func_verbose "generating symbol list for \`$output'"
-
-	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
-
-	  # Add our own program objects to the symbol list.
-	  progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-	  for progfile in $progfiles; do
-	    func_verbose "extracting global C symbols from \`$progfile'"
-	    $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'"
-	  done
-
-	  if test -n "$exclude_expsyms"; then
-	    $opt_dry_run || {
-	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
-	      eval '$MV "$nlist"T "$nlist"'
-	    }
-	  fi
-
-	  if test -n "$export_symbols_regex"; then
-	    $opt_dry_run || {
-	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
-	      eval '$MV "$nlist"T "$nlist"'
-	    }
-	  fi
-
-	  # Prepare the list of exported symbols
-	  if test -z "$export_symbols"; then
-	    export_symbols="$output_objdir/$outputname.exp"
-	    $opt_dry_run || {
-	      $RM $export_symbols
-	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
-	      case $host in
-	      *cygwin* | *mingw* | *cegcc* )
-                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
-                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
-	        ;;
-	      esac
-	    }
-	  else
-	    $opt_dry_run || {
-	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
-	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
-	      eval '$MV "$nlist"T "$nlist"'
-	      case $host in
-	        *cygwin | *mingw* | *cegcc* )
-	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
-	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
-	          ;;
-	      esac
-	    }
-	  fi
-	fi
-
-	for dlprefile in $dlprefiles; do
-	  func_verbose "extracting global C symbols from \`$dlprefile'"
-	  func_basename "$dlprefile"
-	  name="$func_basename_result"
-	  $opt_dry_run || {
-	    eval '$ECHO ": $name " >> "$nlist"'
-	    eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'"
-	  }
-	done
-
-	$opt_dry_run || {
-	  # Make sure we have at least an empty file.
-	  test -f "$nlist" || : > "$nlist"
-
-	  if test -n "$exclude_expsyms"; then
-	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
-	    $MV "$nlist"T "$nlist"
-	  fi
-
-	  # Try sorting and uniquifying the output.
-	  if $GREP -v "^: " < "$nlist" |
-	      if sort -k 3 </dev/null >/dev/null 2>&1; then
-		sort -k 3
-	      else
-		sort +2
-	      fi |
-	      uniq > "$nlist"S; then
-	    :
-	  else
-	    $GREP -v "^: " < "$nlist" > "$nlist"S
-	  fi
-
-	  if test -f "$nlist"S; then
-	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
-	  else
-	    $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms"
-	  fi
-
-	  $ECHO >> "$output_objdir/$my_dlsyms" "\
-
-/* The mapping between symbol names and symbols.  */
-typedef struct {
-  const char *name;
-  void *address;
-} lt_dlsymlist;
-"
-	  case $host in
-	  *cygwin* | *mingw* | *cegcc* )
-	    $ECHO >> "$output_objdir/$my_dlsyms" "\
-/* DATA imports from DLLs on WIN32 con't be const, because
-   runtime relocations are performed -- see ld's documentation
-   on pseudo-relocs.  */"
-	    lt_dlsym_const= ;;
-	  *osf5*)
-	    echo >> "$output_objdir/$my_dlsyms" "\
-/* This system does not cope well with relocations in const data */"
-	    lt_dlsym_const= ;;
-	  *)
-	    lt_dlsym_const=const ;;
-	  esac
-
-	  $ECHO >> "$output_objdir/$my_dlsyms" "\
-extern $lt_dlsym_const lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[];
-$lt_dlsym_const lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[] =
-{\
-  { \"$my_originator\", (void *) 0 },"
-
-	  case $need_lib_prefix in
-	  no)
-	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
-	    ;;
-	  *)
-	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
-	    ;;
-	  esac
-	  $ECHO >> "$output_objdir/$my_dlsyms" "\
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt_${my_prefix}_LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif\
-"
-	} # !$opt_dry_run
-
-	pic_flag_for_symtable=
-	case "$compile_command " in
-	*" -static "*) ;;
-	*)
-	  case $host in
-	  # compiling the symbol table file with pic_flag works around
-	  # a FreeBSD bug that causes programs to crash when -lm is
-	  # linked before any other PIC object.  But we must not use
-	  # pic_flag when linking with -static.  The problem exists in
-	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
-	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
-	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
-	  *-*-hpux*)
-	    pic_flag_for_symtable=" $pic_flag"  ;;
-	  *)
-	    if test "X$my_pic_p" != Xno; then
-	      pic_flag_for_symtable=" $pic_flag"
-	    fi
-	    ;;
-	  esac
-	  ;;
-	esac
-	symtab_cflags=
-	for arg in $LTCFLAGS; do
-	  case $arg in
-	  -pie | -fpie | -fPIE) ;;
-	  *) symtab_cflags="$symtab_cflags $arg" ;;
-	  esac
-	done
-
-	# Now compile the dynamic symbol file.
-	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
-
-	# Clean up the generated files.
-	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
-
-	# Transform the symbol file into the correct name.
-	symfileobj="$output_objdir/${my_outputname}S.$objext"
-	case $host in
-	*cygwin* | *mingw* | *cegcc* )
-	  if test -f "$output_objdir/$my_outputname.def"; then
-	    compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
-	    finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
-	  else
-	    compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
-	    finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
-	  fi
-	  ;;
-	*)
-	  compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
-	  finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
-	  ;;
-	esac
-	;;
-      *)
-	func_fatal_error "unknown suffix for \`$my_dlsyms'"
-	;;
-      esac
-    else
-      # We keep going just in case the user didn't refer to
-      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
-      # really was required.
-
-      # Nullify the symbol file.
-      compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
-      finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
-    fi
-}
-
-# func_win32_libid arg
-# return the library type of file 'arg'
-#
-# Need a lot of goo to handle *both* DLLs and import libs
-# Has to be a shell function in order to 'eat' the argument
-# that is supplied when $file_magic_command is called.
-func_win32_libid ()
-{
-  $opt_debug
-  win32_libid_type="unknown"
-  win32_fileres=`file -L $1 2>/dev/null`
-  case $win32_fileres in
-  *ar\ archive\ import\ library*) # definitely import
-    win32_libid_type="x86 archive import"
-    ;;
-  *ar\ archive*) # could be an import, or static
-    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
-       $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
-      win32_nmres=`eval $NM -f posix -A $1 |
-	$SED -n -e '
-	    1,100{
-		/ I /{
-		    s,.*,import,
-		    p
-		    q
-		}
-	    }'`
-      case $win32_nmres in
-      import*)  win32_libid_type="x86 archive import";;
-      *)        win32_libid_type="x86 archive static";;
-      esac
-    fi
-    ;;
-  *DLL*)
-    win32_libid_type="x86 DLL"
-    ;;
-  *executable*) # but shell scripts are "executable" too...
-    case $win32_fileres in
-    *MS\ Windows\ PE\ Intel*)
-      win32_libid_type="x86 DLL"
-      ;;
-    esac
-    ;;
-  esac
-  $ECHO "$win32_libid_type"
-}
-
-
-
-# func_extract_an_archive dir oldlib
-func_extract_an_archive ()
-{
-    $opt_debug
-    f_ex_an_ar_dir="$1"; shift
-    f_ex_an_ar_oldlib="$1"
-    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?'
-    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
-     :
-    else
-      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
-    fi
-}
-
-
-# func_extract_archives gentop oldlib ...
-func_extract_archives ()
-{
-    $opt_debug
-    my_gentop="$1"; shift
-    my_oldlibs=${1+"$@"}
-    my_oldobjs=""
-    my_xlib=""
-    my_xabs=""
-    my_xdir=""
-
-    for my_xlib in $my_oldlibs; do
-      # Extract the objects.
-      case $my_xlib in
-	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
-	*) my_xabs=`pwd`"/$my_xlib" ;;
-      esac
-      func_basename "$my_xlib"
-      my_xlib="$func_basename_result"
-      my_xlib_u=$my_xlib
-      while :; do
-        case " $extracted_archives " in
-	*" $my_xlib_u "*)
-	  func_arith $extracted_serial + 1
-	  extracted_serial=$func_arith_result
-	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
-	*) break ;;
-	esac
-      done
-      extracted_archives="$extracted_archives $my_xlib_u"
-      my_xdir="$my_gentop/$my_xlib_u"
-
-      func_mkdir_p "$my_xdir"
-
-      case $host in
-      *-darwin*)
-	func_verbose "Extracting $my_xabs"
-	# Do not bother doing anything if just a dry run
-	$opt_dry_run || {
-	  darwin_orig_dir=`pwd`
-	  cd $my_xdir || exit $?
-	  darwin_archive=$my_xabs
-	  darwin_curdir=`pwd`
-	  darwin_base_archive=`basename "$darwin_archive"`
-	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
-	  if test -n "$darwin_arches"; then
-	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
-	    darwin_arch=
-	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
-	    for darwin_arch in  $darwin_arches ; do
-	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
-	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
-	      cd "$darwin_curdir"
-	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
-	    done # $darwin_arches
-            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
-	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
-	    darwin_file=
-	    darwin_files=
-	    for darwin_file in $darwin_filelist; do
-	      darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
-	      $LIPO -create -output "$darwin_file" $darwin_files
-	    done # $darwin_filelist
-	    $RM -rf unfat-$$
-	    cd "$darwin_orig_dir"
-	  else
-	    cd $darwin_orig_dir
-	    func_extract_an_archive "$my_xdir" "$my_xabs"
-	  fi # $darwin_arches
-	} # !$opt_dry_run
-	;;
-      *)
-        func_extract_an_archive "$my_xdir" "$my_xabs"
-	;;
-      esac
-      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
-    done
-
-    func_extract_archives_result="$my_oldobjs"
-}
-
-
-
-# func_emit_wrapper_part1 [arg=no]
-#
-# Emit the first part of a libtool wrapper script on stdout.
-# For more information, see the description associated with
-# func_emit_wrapper(), below.
-func_emit_wrapper_part1 ()
-{
-	func_emit_wrapper_part1_arg1=no
-	if test -n "$1" ; then
-	  func_emit_wrapper_part1_arg1=$1
-	fi
-
-	$ECHO "\
-#! $SHELL
-
-# $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# The $output program cannot be directly executed until all the libtool
-# libraries that it depends on are installed.
-#
-# This wrapper script should never be moved out of the build directory.
-# If it is, it will not operate correctly.
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='${SED} -e 1s/^X//'
-sed_quote_subst='$sed_quote_subst'
-
-# Be Bourne compatible
-if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '\${1+\"\$@\"}'='\"\$@\"'
-  setopt NO_GLOB_SUBST
-else
-  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-relink_command=\"$relink_command\"
-
-# This environment variable determines our operation mode.
-if test \"\$libtool_install_magic\" = \"$magic\"; then
-  # install mode needs the following variables:
-  generated_by_libtool_version='$macro_version'
-  notinst_deplibs='$notinst_deplibs'
-else
-  # When we are sourced in execute mode, \$file and \$ECHO are already set.
-  if test \"\$libtool_execute_magic\" != \"$magic\"; then
-    ECHO=\"$qecho\"
-    file=\"\$0\"
-    # Make sure echo works.
-    if test \"X\$1\" = X--no-reexec; then
-      # Discard the --no-reexec flag, and continue.
-      shift
-    elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then
-      # Yippee, \$ECHO works!
-      :
-    else
-      # Restart under the correct shell, and then maybe \$ECHO will work.
-      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
-    fi
-  fi\
-"
-	$ECHO "\
-
-  # Find the directory that this script lives in.
-  thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
-  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
-
-  # Follow symbolic links until we get to the real thisdir.
-  file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
-  while test -n \"\$file\"; do
-    destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
-
-    # If there was a directory component, then change thisdir.
-    if test \"x\$destdir\" != \"x\$file\"; then
-      case \"\$destdir\" in
-      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
-      *) thisdir=\"\$thisdir/\$destdir\" ;;
-      esac
-    fi
-
-    file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
-    file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
-  done
-"
-}
-# end: func_emit_wrapper_part1
-
-# func_emit_wrapper_part2 [arg=no]
-#
-# Emit the second part of a libtool wrapper script on stdout.
-# For more information, see the description associated with
-# func_emit_wrapper(), below.
-func_emit_wrapper_part2 ()
-{
-	func_emit_wrapper_part2_arg1=no
-	if test -n "$1" ; then
-	  func_emit_wrapper_part2_arg1=$1
-	fi
-
-	$ECHO "\
-
-  # Usually 'no', except on cygwin/mingw when embedded into
-  # the cwrapper.
-  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1
-  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
-    # special case for '.'
-    if test \"\$thisdir\" = \".\"; then
-      thisdir=\`pwd\`
-    fi
-    # remove .libs from thisdir
-    case \"\$thisdir\" in
-    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;;
-    $objdir )   thisdir=. ;;
-    esac
-  fi
-
-  # Try to get the absolute directory name.
-  absdir=\`cd \"\$thisdir\" && pwd\`
-  test -n \"\$absdir\" && thisdir=\"\$absdir\"
-"
-
-	if test "$fast_install" = yes; then
-	  $ECHO "\
-  program=lt-'$outputname'$exeext
-  progdir=\"\$thisdir/$objdir\"
-
-  if test ! -f \"\$progdir/\$program\" ||
-     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
-       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
-
-    file=\"\$\$-\$program\"
-
-    if test ! -d \"\$progdir\"; then
-      $MKDIR \"\$progdir\"
-    else
-      $RM \"\$progdir/\$file\"
-    fi"
-
-	  $ECHO "\
-
-    # relink executable if necessary
-    if test -n \"\$relink_command\"; then
-      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
-      else
-	$ECHO \"\$relink_command_output\" >&2
-	$RM \"\$progdir/\$file\"
-	exit 1
-      fi
-    fi
-
-    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
-    { $RM \"\$progdir/\$program\";
-      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
-    $RM \"\$progdir/\$file\"
-  fi"
-	else
-	  $ECHO "\
-  program='$outputname'
-  progdir=\"\$thisdir/$objdir\"
-"
-	fi
-
-	$ECHO "\
-
-  if test -f \"\$progdir/\$program\"; then"
-
-	# Export our shlibpath_var if we have one.
-	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-	  $ECHO "\
-    # Add our own library path to $shlibpath_var
-    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
-
-    # Some systems cannot cope with colon-terminated $shlibpath_var
-    # The second colon is a workaround for a bug in BeOS R4 sed
-    $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
-
-    export $shlibpath_var
-"
-	fi
-
-	# fixup the dll searchpath if we need to.
-	if test -n "$dllsearchpath"; then
-	  $ECHO "\
-    # Add the dll search path components to the executable PATH
-    PATH=$dllsearchpath:\$PATH
-"
-	fi
-
-	$ECHO "\
-    if test \"\$libtool_execute_magic\" != \"$magic\"; then
-      # Run the actual program with our arguments.
-"
-	case $host in
-	# Backslashes separate directories on plain windows
-	*-*-mingw | *-*-os2* | *-cegcc*)
-	  $ECHO "\
-      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
-"
-	  ;;
-
-	*)
-	  $ECHO "\
-      exec \"\$progdir/\$program\" \${1+\"\$@\"}
-"
-	  ;;
-	esac
-	$ECHO "\
-      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
-      exit 1
-    fi
-  else
-    # The program doesn't exist.
-    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
-    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
-    $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
-    exit 1
-  fi
-fi\
-"
-}
-# end: func_emit_wrapper_part2
-
-
-# func_emit_wrapper [arg=no]
-#
-# Emit a libtool wrapper script on stdout.
-# Don't directly open a file because we may want to
-# incorporate the script contents within a cygwin/mingw
-# wrapper executable.  Must ONLY be called from within
-# func_mode_link because it depends on a number of variables
-# set therein.
-#
-# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
-# variable will take.  If 'yes', then the emitted script
-# will assume that the directory in which it is stored is
-# the $objdir directory.  This is a cygwin/mingw-specific
-# behavior.
-func_emit_wrapper ()
-{
-	func_emit_wrapper_arg1=no
-	if test -n "$1" ; then
-	  func_emit_wrapper_arg1=$1
-	fi
-
-	# split this up so that func_emit_cwrapperexe_src
-	# can call each part independently.
-	func_emit_wrapper_part1 "${func_emit_wrapper_arg1}"
-	func_emit_wrapper_part2 "${func_emit_wrapper_arg1}"
-}
-
-
-# func_to_host_path arg
-#
-# Convert paths to host format when used with build tools.
-# Intended for use with "native" mingw (where libtool itself
-# is running under the msys shell), or in the following cross-
-# build environments:
-#    $build          $host
-#    mingw (msys)    mingw  [e.g. native]
-#    cygwin          mingw
-#    *nix + wine     mingw
-# where wine is equipped with the `winepath' executable.
-# In the native mingw case, the (msys) shell automatically
-# converts paths for any non-msys applications it launches,
-# but that facility isn't available from inside the cwrapper.
-# Similar accommodations are necessary for $host mingw and
-# $build cygwin.  Calling this function does no harm for other
-# $host/$build combinations not listed above.
-#
-# ARG is the path (on $build) that should be converted to
-# the proper representation for $host. The result is stored
-# in $func_to_host_path_result.
-func_to_host_path ()
-{
-  func_to_host_path_result="$1"
-  if test -n "$1" ; then
-    case $host in
-      *mingw* )
-        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-        case $build in
-          *mingw* ) # actually, msys
-            # awkward: cmd appends spaces to result
-            lt_sed_strip_trailing_spaces="s/[ ]*\$//"
-            func_to_host_path_tmp1=`( cmd //c echo "$1" |\
-              $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
-            func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
-              $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          *cygwin* )
-            func_to_host_path_tmp1=`cygpath -w "$1"`
-            func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
-              $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          * )
-            # Unfortunately, winepath does not exit with a non-zero
-            # error code, so we are forced to check the contents of
-            # stdout. On the other hand, if the command is not
-            # found, the shell will set an exit code of 127 and print
-            # *an error message* to stdout. So we must check for both
-            # error code of zero AND non-empty stdout, which explains
-            # the odd construction:
-            func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null`
-            if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then
-              func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
-                $SED -e "$lt_sed_naive_backslashify"`
-            else
-              # Allow warning below.
-              func_to_host_path_result=""
-            fi
-            ;;
-        esac
-        if test -z "$func_to_host_path_result" ; then
-          func_error "Could not determine host path corresponding to"
-          func_error "  '$1'"
-          func_error "Continuing, but uninstalled executables may not work."
-          # Fallback:
-          func_to_host_path_result="$1"
-        fi
-        ;;
-    esac
-  fi
-}
-# end: func_to_host_path
-
-# func_to_host_pathlist arg
-#
-# Convert pathlists to host format when used with build tools.
-# See func_to_host_path(), above. This function supports the
-# following $build/$host combinations (but does no harm for
-# combinations not listed here):
-#    $build          $host
-#    mingw (msys)    mingw  [e.g. native]
-#    cygwin          mingw
-#    *nix + wine     mingw
-#
-# Path separators are also converted from $build format to
-# $host format. If ARG begins or ends with a path separator
-# character, it is preserved (but converted to $host format)
-# on output.
-#
-# ARG is a pathlist (on $build) that should be converted to
-# the proper representation on $host. The result is stored
-# in $func_to_host_pathlist_result.
-func_to_host_pathlist ()
-{
-  func_to_host_pathlist_result="$1"
-  if test -n "$1" ; then
-    case $host in
-      *mingw* )
-        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-        # Remove leading and trailing path separator characters from
-        # ARG. msys behavior is inconsistent here, cygpath turns them
-        # into '.;' and ';.', and winepath ignores them completely.
-        func_to_host_pathlist_tmp2="$1"
-        # Once set for this call, this variable should not be
-        # reassigned. It is used in tha fallback case.
-        func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\
-          $SED -e 's|^:*||' -e 's|:*$||'`
-        case $build in
-          *mingw* ) # Actually, msys.
-            # Awkward: cmd appends spaces to result.
-            lt_sed_strip_trailing_spaces="s/[ ]*\$//"
-            func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\
-              $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
-            func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
-              $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          *cygwin* )
-            func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"`
-            func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
-              $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          * )
-            # unfortunately, winepath doesn't convert pathlists
-            func_to_host_pathlist_result=""
-            func_to_host_pathlist_oldIFS=$IFS
-            IFS=:
-            for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do
-              IFS=$func_to_host_pathlist_oldIFS
-              if test -n "$func_to_host_pathlist_f" ; then
-                func_to_host_path "$func_to_host_pathlist_f"
-                if test -n "$func_to_host_path_result" ; then
-                  if test -z "$func_to_host_pathlist_result" ; then
-                    func_to_host_pathlist_result="$func_to_host_path_result"
-                  else
-                    func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result"
-                  fi
-                fi
-              fi
-              IFS=:
-            done
-            IFS=$func_to_host_pathlist_oldIFS
-            ;;
-        esac
-        if test -z "$func_to_host_pathlist_result" ; then
-          func_error "Could not determine the host path(s) corresponding to"
-          func_error "  '$1'"
-          func_error "Continuing, but uninstalled executables may not work."
-          # Fallback. This may break if $1 contains DOS-style drive
-          # specifications. The fix is not to complicate the expression
-          # below, but for the user to provide a working wine installation
-          # with winepath so that path translation in the cross-to-mingw
-          # case works properly.
-          lt_replace_pathsep_nix_to_dos="s|:|;|g"
-          func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\
-            $SED -e "$lt_replace_pathsep_nix_to_dos"`
-        fi
-        # Now, add the leading and trailing path separators back
-        case "$1" in
-          :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result"
-            ;;
-        esac
-        case "$1" in
-          *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;"
-            ;;
-        esac
-        ;;
-    esac
-  fi
-}
-# end: func_to_host_pathlist
-
-# func_emit_cwrapperexe_src
-# emit the source code for a wrapper executable on stdout
-# Must ONLY be called from within func_mode_link because
-# it depends on a number of variable set therein.
-func_emit_cwrapperexe_src ()
-{
-	cat <<EOF
-
-/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
-   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-
-   The $output program cannot be directly executed until all the libtool
-   libraries that it depends on are installed.
-
-   This wrapper executable should never be moved out of the build directory.
-   If it is, it will not operate correctly.
-
-   Currently, it simply execs the wrapper *script* "$SHELL $output",
-   but could eventually absorb all of the scripts functionality and
-   exec $objdir/$outputname directly.
-*/
-EOF
-	    cat <<"EOF"
-#include <stdio.h>
-#include <stdlib.h>
-#ifdef _MSC_VER
-# include <direct.h>
-# include <process.h>
-# include <io.h>
-# define setmode _setmode
-#else
-# include <unistd.h>
-# include <stdint.h>
-# ifdef __CYGWIN__
-#  include <io.h>
-#  define HAVE_SETENV
-#  ifdef __STRICT_ANSI__
-char *realpath (const char *, char *);
-int putenv (char *);
-int setenv (const char *, const char *, int);
-#  endif
-# endif
-#endif
-#include <malloc.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-
-#if defined(PATH_MAX)
-# define LT_PATHMAX PATH_MAX
-#elif defined(MAXPATHLEN)
-# define LT_PATHMAX MAXPATHLEN
-#else
-# define LT_PATHMAX 1024
-#endif
-
-#ifndef S_IXOTH
-# define S_IXOTH 0
-#endif
-#ifndef S_IXGRP
-# define S_IXGRP 0
-#endif
-
-#ifdef _MSC_VER
-# define S_IXUSR _S_IEXEC
-# define stat _stat
-# ifndef _INTPTR_T_DEFINED
-#  define intptr_t int
-# endif
-#endif
-
-#ifndef DIR_SEPARATOR
-# define DIR_SEPARATOR '/'
-# define PATH_SEPARATOR ':'
-#endif
-
-#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
-  defined (__OS2__)
-# define HAVE_DOS_BASED_FILE_SYSTEM
-# define FOPEN_WB "wb"
-# ifndef DIR_SEPARATOR_2
-#  define DIR_SEPARATOR_2 '\\'
-# endif
-# ifndef PATH_SEPARATOR_2
-#  define PATH_SEPARATOR_2 ';'
-# endif
-#endif
-
-#ifndef DIR_SEPARATOR_2
-# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
-#else /* DIR_SEPARATOR_2 */
-# define IS_DIR_SEPARATOR(ch) \
-	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
-#endif /* DIR_SEPARATOR_2 */
-
-#ifndef PATH_SEPARATOR_2
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
-#else /* PATH_SEPARATOR_2 */
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
-#endif /* PATH_SEPARATOR_2 */
-
-#ifdef __CYGWIN__
-# define FOPEN_WB "wb"
-#endif
-
-#ifndef FOPEN_WB
-# define FOPEN_WB "w"
-#endif
-#ifndef _O_BINARY
-# define _O_BINARY 0
-#endif
-
-#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
-#define XFREE(stale) do { \
-  if (stale) { free ((void *) stale); stale = 0; } \
-} while (0)
-
-#undef LTWRAPPER_DEBUGPRINTF
-#if defined DEBUGWRAPPER
-# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args
-static void
-ltwrapper_debugprintf (const char *fmt, ...)
-{
-    va_list args;
-    va_start (args, fmt);
-    (void) vfprintf (stderr, fmt, args);
-    va_end (args);
-}
-#else
-# define LTWRAPPER_DEBUGPRINTF(args)
-#endif
-
-const char *program_name = NULL;
-
-void *xmalloc (size_t num);
-char *xstrdup (const char *string);
-const char *base_name (const char *name);
-char *find_executable (const char *wrapper);
-char *chase_symlinks (const char *pathspec);
-int make_executable (const char *path);
-int check_executable (const char *path);
-char *strendzap (char *str, const char *pat);
-void lt_fatal (const char *message, ...);
-void lt_setenv (const char *name, const char *value);
-char *lt_extend_str (const char *orig_value, const char *add, int to_end);
-void lt_opt_process_env_set (const char *arg);
-void lt_opt_process_env_prepend (const char *arg);
-void lt_opt_process_env_append (const char *arg);
-int lt_split_name_value (const char *arg, char** name, char** value);
-void lt_update_exe_path (const char *name, const char *value);
-void lt_update_lib_path (const char *name, const char *value);
-
-static const char *script_text_part1 =
-EOF
-
-	    func_emit_wrapper_part1 yes |
-	        $SED -e 's/\([\\"]\)/\\\1/g' \
-	             -e 's/^/  "/' -e 's/$/\\n"/'
-	    echo ";"
-	    cat <<EOF
-
-static const char *script_text_part2 =
-EOF
-	    func_emit_wrapper_part2 yes |
-	        $SED -e 's/\([\\"]\)/\\\1/g' \
-	             -e 's/^/  "/' -e 's/$/\\n"/'
-	    echo ";"
-
-	    cat <<EOF
-const char * MAGIC_EXE = "$magic_exe";
-const char * LIB_PATH_VARNAME = "$shlibpath_var";
-EOF
-
-	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-              func_to_host_pathlist "$temp_rpath"
-	      cat <<EOF
-const char * LIB_PATH_VALUE   = "$func_to_host_pathlist_result";
-EOF
-	    else
-	      cat <<"EOF"
-const char * LIB_PATH_VALUE   = "";
-EOF
-	    fi
-
-	    if test -n "$dllsearchpath"; then
-              func_to_host_pathlist "$dllsearchpath:"
-	      cat <<EOF
-const char * EXE_PATH_VARNAME = "PATH";
-const char * EXE_PATH_VALUE   = "$func_to_host_pathlist_result";
-EOF
-	    else
-	      cat <<"EOF"
-const char * EXE_PATH_VARNAME = "";
-const char * EXE_PATH_VALUE   = "";
-EOF
-	    fi
-
-	    if test "$fast_install" = yes; then
-	      cat <<EOF
-const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
-EOF
-	    else
-	      cat <<EOF
-const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
-EOF
-	    fi
-
-
-	    cat <<"EOF"
-
-#define LTWRAPPER_OPTION_PREFIX         "--lt-"
-#define LTWRAPPER_OPTION_PREFIX_LENGTH  5
-
-static const size_t opt_prefix_len         = LTWRAPPER_OPTION_PREFIX_LENGTH;
-static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
-
-static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
-
-static const size_t env_set_opt_len     = LTWRAPPER_OPTION_PREFIX_LENGTH + 7;
-static const char *env_set_opt          = LTWRAPPER_OPTION_PREFIX "env-set";
-  /* argument is putenv-style "foo=bar", value of foo is set to bar */
-
-static const size_t env_prepend_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 11;
-static const char *env_prepend_opt      = LTWRAPPER_OPTION_PREFIX "env-prepend";
-  /* argument is putenv-style "foo=bar", new value of foo is bar${foo} */
-
-static const size_t env_append_opt_len  = LTWRAPPER_OPTION_PREFIX_LENGTH + 10;
-static const char *env_append_opt       = LTWRAPPER_OPTION_PREFIX "env-append";
-  /* argument is putenv-style "foo=bar", new value of foo is ${foo}bar */
-
-int
-main (int argc, char *argv[])
-{
-  char **newargz;
-  int  newargc;
-  char *tmp_pathspec;
-  char *actual_cwrapper_path;
-  char *actual_cwrapper_name;
-  char *target_name;
-  char *lt_argv_zero;
-  intptr_t rval = 127;
-
-  int i;
-
-  program_name = (char *) xstrdup (base_name (argv[0]));
-  LTWRAPPER_DEBUGPRINTF (("(main) argv[0]      : %s\n", argv[0]));
-  LTWRAPPER_DEBUGPRINTF (("(main) program_name : %s\n", program_name));
-
-  /* very simple arg parsing; don't want to rely on getopt */
-  for (i = 1; i < argc; i++)
-    {
-      if (strcmp (argv[i], dumpscript_opt) == 0)
-	{
-EOF
-	    case "$host" in
-	      *mingw* | *cygwin* )
-		# make stdout use "unix" line endings
-		echo "          setmode(1,_O_BINARY);"
-		;;
-	      esac
-
-	    cat <<"EOF"
-	  printf ("%s", script_text_part1);
-	  printf ("%s", script_text_part2);
-	  return 0;
-	}
-    }
-
-  newargz = XMALLOC (char *, argc + 1);
-  tmp_pathspec = find_executable (argv[0]);
-  if (tmp_pathspec == NULL)
-    lt_fatal ("Couldn't find %s", argv[0]);
-  LTWRAPPER_DEBUGPRINTF (("(main) found exe (before symlink chase) at : %s\n",
-			  tmp_pathspec));
-
-  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
-  LTWRAPPER_DEBUGPRINTF (("(main) found exe (after symlink chase) at : %s\n",
-			  actual_cwrapper_path));
-  XFREE (tmp_pathspec);
-
-  actual_cwrapper_name = xstrdup( base_name (actual_cwrapper_path));
-  strendzap (actual_cwrapper_path, actual_cwrapper_name);
-
-  /* wrapper name transforms */
-  strendzap (actual_cwrapper_name, ".exe");
-  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
-  XFREE (actual_cwrapper_name);
-  actual_cwrapper_name = tmp_pathspec;
-  tmp_pathspec = 0;
-
-  /* target_name transforms -- use actual target program name; might have lt- prefix */
-  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
-  strendzap (target_name, ".exe");
-  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
-  XFREE (target_name);
-  target_name = tmp_pathspec;
-  tmp_pathspec = 0;
-
-  LTWRAPPER_DEBUGPRINTF (("(main) libtool target name: %s\n",
-			  target_name));
-EOF
-
-	    cat <<EOF
-  newargz[0] =
-    XMALLOC (char, (strlen (actual_cwrapper_path) +
-		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
-  strcpy (newargz[0], actual_cwrapper_path);
-  strcat (newargz[0], "$objdir");
-  strcat (newargz[0], "/");
-EOF
-
-	    cat <<"EOF"
-  /* stop here, and copy so we don't have to do this twice */
-  tmp_pathspec = xstrdup (newargz[0]);
-
-  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
-  strcat (newargz[0], actual_cwrapper_name);
-
-  /* DO want the lt- prefix here if it exists, so use target_name */
-  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
-  XFREE (tmp_pathspec);
-  tmp_pathspec = NULL;
-EOF
-
-	    case $host_os in
-	      mingw*)
-	    cat <<"EOF"
-  {
-    char* p;
-    while ((p = strchr (newargz[0], '\\')) != NULL)
-      {
-	*p = '/';
-      }
-    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
-      {
-	*p = '/';
-      }
-  }
-EOF
-	    ;;
-	    esac
-
-	    cat <<"EOF"
-  XFREE (target_name);
-  XFREE (actual_cwrapper_path);
-  XFREE (actual_cwrapper_name);
-
-  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
-  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
-  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
-  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
-
-  newargc=0;
-  for (i = 1; i < argc; i++)
-    {
-      if (strncmp (argv[i], env_set_opt, env_set_opt_len) == 0)
-        {
-          if (argv[i][env_set_opt_len] == '=')
-            {
-              const char *p = argv[i] + env_set_opt_len + 1;
-              lt_opt_process_env_set (p);
-            }
-          else if (argv[i][env_set_opt_len] == '\0' && i + 1 < argc)
-            {
-              lt_opt_process_env_set (argv[++i]); /* don't copy */
-            }
-          else
-            lt_fatal ("%s missing required argument", env_set_opt);
-          continue;
-        }
-      if (strncmp (argv[i], env_prepend_opt, env_prepend_opt_len) == 0)
-        {
-          if (argv[i][env_prepend_opt_len] == '=')
-            {
-              const char *p = argv[i] + env_prepend_opt_len + 1;
-              lt_opt_process_env_prepend (p);
-            }
-          else if (argv[i][env_prepend_opt_len] == '\0' && i + 1 < argc)
-            {
-              lt_opt_process_env_prepend (argv[++i]); /* don't copy */
-            }
-          else
-            lt_fatal ("%s missing required argument", env_prepend_opt);
-          continue;
-        }
-      if (strncmp (argv[i], env_append_opt, env_append_opt_len) == 0)
-        {
-          if (argv[i][env_append_opt_len] == '=')
-            {
-              const char *p = argv[i] + env_append_opt_len + 1;
-              lt_opt_process_env_append (p);
-            }
-          else if (argv[i][env_append_opt_len] == '\0' && i + 1 < argc)
-            {
-              lt_opt_process_env_append (argv[++i]); /* don't copy */
-            }
-          else
-            lt_fatal ("%s missing required argument", env_append_opt);
-          continue;
-        }
-      if (strncmp (argv[i], ltwrapper_option_prefix, opt_prefix_len) == 0)
-        {
-          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
-             namespace, but it is not one of the ones we know about and
-             have already dealt with, above (inluding dump-script), then
-             report an error. Otherwise, targets might begin to believe
-             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
-             namespace. The first time any user complains about this, we'll
-             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
-             or a configure.ac-settable value.
-           */
-          lt_fatal ("Unrecognized option in %s namespace: '%s'",
-                    ltwrapper_option_prefix, argv[i]);
-        }
-      /* otherwise ... */
-      newargz[++newargc] = xstrdup (argv[i]);
-    }
-  newargz[++newargc] = NULL;
-
-  LTWRAPPER_DEBUGPRINTF     (("(main) lt_argv_zero : %s\n", (lt_argv_zero ? lt_argv_zero : "<NULL>")));
-  for (i = 0; i < newargc; i++)
-    {
-      LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d]   : %s\n", i, (newargz[i] ? newargz[i] : "<NULL>")));
-    }
-
-EOF
-
-	    case $host_os in
-	      mingw*)
-		cat <<"EOF"
-  /* execv doesn't actually work on mingw as expected on unix */
-  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
-  if (rval == -1)
-    {
-      /* failed to start process */
-      LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno));
-      return 127;
-    }
-  return rval;
-EOF
-		;;
-	      *)
-		cat <<"EOF"
-  execv (lt_argv_zero, newargz);
-  return rval; /* =127, but avoids unused variable warning */
-EOF
-		;;
-	    esac
-
-	    cat <<"EOF"
-}
-
-void *
-xmalloc (size_t num)
-{
-  void *p = (void *) malloc (num);
-  if (!p)
-    lt_fatal ("Memory exhausted");
-
-  return p;
-}
-
-char *
-xstrdup (const char *string)
-{
-  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
-			  string) : NULL;
-}
-
-const char *
-base_name (const char *name)
-{
-  const char *base;
-
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  /* Skip over the disk name in MSDOS pathnames. */
-  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
-    name += 2;
-#endif
-
-  for (base = name; *name; name++)
-    if (IS_DIR_SEPARATOR (*name))
-      base = name + 1;
-  return base;
-}
-
-int
-check_executable (const char *path)
-{
-  struct stat st;
-
-  LTWRAPPER_DEBUGPRINTF (("(check_executable)  : %s\n",
-			  path ? (*path ? path : "EMPTY!") : "NULL!"));
-  if ((!path) || (!*path))
-    return 0;
-
-  if ((stat (path, &st) >= 0)
-      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
-    return 1;
-  else
-    return 0;
-}
-
-int
-make_executable (const char *path)
-{
-  int rval = 0;
-  struct stat st;
-
-  LTWRAPPER_DEBUGPRINTF (("(make_executable)   : %s\n",
-			  path ? (*path ? path : "EMPTY!") : "NULL!"));
-  if ((!path) || (!*path))
-    return 0;
-
-  if (stat (path, &st) >= 0)
-    {
-      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
-    }
-  return rval;
-}
-
-/* Searches for the full path of the wrapper.  Returns
-   newly allocated full path name if found, NULL otherwise
-   Does not chase symlinks, even on platforms that support them.
-*/
-char *
-find_executable (const char *wrapper)
-{
-  int has_slash = 0;
-  const char *p;
-  const char *p_next;
-  /* static buffer for getcwd */
-  char tmp[LT_PATHMAX + 1];
-  int tmp_len;
-  char *concat_name;
-
-  LTWRAPPER_DEBUGPRINTF (("(find_executable)   : %s\n",
-			  wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"));
-
-  if ((wrapper == NULL) || (*wrapper == '\0'))
-    return NULL;
-
-  /* Absolute path? */
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
-    {
-      concat_name = xstrdup (wrapper);
-      if (check_executable (concat_name))
-	return concat_name;
-      XFREE (concat_name);
-    }
-  else
-    {
-#endif
-      if (IS_DIR_SEPARATOR (wrapper[0]))
-	{
-	  concat_name = xstrdup (wrapper);
-	  if (check_executable (concat_name))
-	    return concat_name;
-	  XFREE (concat_name);
-	}
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-    }
-#endif
-
-  for (p = wrapper; *p; p++)
-    if (*p == '/')
-      {
-	has_slash = 1;
-	break;
-      }
-  if (!has_slash)
-    {
-      /* no slashes; search PATH */
-      const char *path = getenv ("PATH");
-      if (path != NULL)
-	{
-	  for (p = path; *p; p = p_next)
-	    {
-	      const char *q;
-	      size_t p_len;
-	      for (q = p; *q; q++)
-		if (IS_PATH_SEPARATOR (*q))
-		  break;
-	      p_len = q - p;
-	      p_next = (*q == '\0' ? q : q + 1);
-	      if (p_len == 0)
-		{
-		  /* empty path: current directory */
-		  if (getcwd (tmp, LT_PATHMAX) == NULL)
-		    lt_fatal ("getcwd failed");
-		  tmp_len = strlen (tmp);
-		  concat_name =
-		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
-		  memcpy (concat_name, tmp, tmp_len);
-		  concat_name[tmp_len] = '/';
-		  strcpy (concat_name + tmp_len + 1, wrapper);
-		}
-	      else
-		{
-		  concat_name =
-		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
-		  memcpy (concat_name, p, p_len);
-		  concat_name[p_len] = '/';
-		  strcpy (concat_name + p_len + 1, wrapper);
-		}
-	      if (check_executable (concat_name))
-		return concat_name;
-	      XFREE (concat_name);
-	    }
-	}
-      /* not found in PATH; assume curdir */
-    }
-  /* Relative path | not found in path: prepend cwd */
-  if (getcwd (tmp, LT_PATHMAX) == NULL)
-    lt_fatal ("getcwd failed");
-  tmp_len = strlen (tmp);
-  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
-  memcpy (concat_name, tmp, tmp_len);
-  concat_name[tmp_len] = '/';
-  strcpy (concat_name + tmp_len + 1, wrapper);
-
-  if (check_executable (concat_name))
-    return concat_name;
-  XFREE (concat_name);
-  return NULL;
-}
-
-char *
-chase_symlinks (const char *pathspec)
-{
-#ifndef S_ISLNK
-  return xstrdup (pathspec);
-#else
-  char buf[LT_PATHMAX];
-  struct stat s;
-  char *tmp_pathspec = xstrdup (pathspec);
-  char *p;
-  int has_symlinks = 0;
-  while (strlen (tmp_pathspec) && !has_symlinks)
-    {
-      LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n",
-			      tmp_pathspec));
-      if (lstat (tmp_pathspec, &s) == 0)
-	{
-	  if (S_ISLNK (s.st_mode) != 0)
-	    {
-	      has_symlinks = 1;
-	      break;
-	    }
-
-	  /* search backwards for last DIR_SEPARATOR */
-	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
-	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
-	    p--;
-	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
-	    {
-	      /* no more DIR_SEPARATORS left */
-	      break;
-	    }
-	  *p = '\0';
-	}
-      else
-	{
-	  char *errstr = strerror (errno);
-	  lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr);
-	}
-    }
-  XFREE (tmp_pathspec);
-
-  if (!has_symlinks)
-    {
-      return xstrdup (pathspec);
-    }
-
-  tmp_pathspec = realpath (pathspec, buf);
-  if (tmp_pathspec == 0)
-    {
-      lt_fatal ("Could not follow symlinks for %s", pathspec);
-    }
-  return xstrdup (tmp_pathspec);
-#endif
-}
-
-char *
-strendzap (char *str, const char *pat)
-{
-  size_t len, patlen;
-
-  assert (str != NULL);
-  assert (pat != NULL);
-
-  len = strlen (str);
-  patlen = strlen (pat);
-
-  if (patlen <= len)
-    {
-      str += len - patlen;
-      if (strcmp (str, pat) == 0)
-	*str = '\0';
-    }
-  return str;
-}
-
-static void
-lt_error_core (int exit_status, const char *mode,
-	       const char *message, va_list ap)
-{
-  fprintf (stderr, "%s: %s: ", program_name, mode);
-  vfprintf (stderr, message, ap);
-  fprintf (stderr, ".\n");
-
-  if (exit_status >= 0)
-    exit (exit_status);
-}
-
-void
-lt_fatal (const char *message, ...)
-{
-  va_list ap;
-  va_start (ap, message);
-  lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
-  va_end (ap);
-}
-
-void
-lt_setenv (const char *name, const char *value)
-{
-  LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n",
-                          (name ? name : "<NULL>"),
-                          (value ? value : "<NULL>")));
-  {
-#ifdef HAVE_SETENV
-    /* always make a copy, for consistency with !HAVE_SETENV */
-    char *str = xstrdup (value);
-    setenv (name, str, 1);
-#else
-    int len = strlen (name) + 1 + strlen (value) + 1;
-    char *str = XMALLOC (char, len);
-    sprintf (str, "%s=%s", name, value);
-    if (putenv (str) != EXIT_SUCCESS)
-      {
-        XFREE (str);
-      }
-#endif
-  }
-}
-
-char *
-lt_extend_str (const char *orig_value, const char *add, int to_end)
-{
-  char *new_value;
-  if (orig_value && *orig_value)
-    {
-      int orig_value_len = strlen (orig_value);
-      int add_len = strlen (add);
-      new_value = XMALLOC (char, add_len + orig_value_len + 1);
-      if (to_end)
-        {
-          strcpy (new_value, orig_value);
-          strcpy (new_value + orig_value_len, add);
-        }
-      else
-        {
-          strcpy (new_value, add);
-          strcpy (new_value + add_len, orig_value);
-        }
-    }
-  else
-    {
-      new_value = xstrdup (add);
-    }
-  return new_value;
-}
-
-int
-lt_split_name_value (const char *arg, char** name, char** value)
-{
-  const char *p;
-  int len;
-  if (!arg || !*arg)
-    return 1;
-
-  p = strchr (arg, (int)'=');
-
-  if (!p)
-    return 1;
-
-  *value = xstrdup (++p);
-
-  len = strlen (arg) - strlen (*value);
-  *name = XMALLOC (char, len);
-  strncpy (*name, arg, len-1);
-  (*name)[len - 1] = '\0';
-
-  return 0;
-}
-
-void
-lt_opt_process_env_set (const char *arg)
-{
-  char *name = NULL;
-  char *value = NULL;
-
-  if (lt_split_name_value (arg, &name, &value) != 0)
-    {
-      XFREE (name);
-      XFREE (value);
-      lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg);
-    }
-
-  lt_setenv (name, value);
-  XFREE (name);
-  XFREE (value);
-}
-
-void
-lt_opt_process_env_prepend (const char *arg)
-{
-  char *name = NULL;
-  char *value = NULL;
-  char *new_value = NULL;
-
-  if (lt_split_name_value (arg, &name, &value) != 0)
-    {
-      XFREE (name);
-      XFREE (value);
-      lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg);
-    }
-
-  new_value = lt_extend_str (getenv (name), value, 0);
-  lt_setenv (name, new_value);
-  XFREE (new_value);
-  XFREE (name);
-  XFREE (value);
-}
-
-void
-lt_opt_process_env_append (const char *arg)
-{
-  char *name = NULL;
-  char *value = NULL;
-  char *new_value = NULL;
-
-  if (lt_split_name_value (arg, &name, &value) != 0)
-    {
-      XFREE (name);
-      XFREE (value);
-      lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg);
-    }
-
-  new_value = lt_extend_str (getenv (name), value, 1);
-  lt_setenv (name, new_value);
-  XFREE (new_value);
-  XFREE (name);
-  XFREE (value);
-}
-
-void
-lt_update_exe_path (const char *name, const char *value)
-{
-  LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
-                          (name ? name : "<NULL>"),
-                          (value ? value : "<NULL>")));
-
-  if (name && *name && value && *value)
-    {
-      char *new_value = lt_extend_str (getenv (name), value, 0);
-      /* some systems can't cope with a ':'-terminated path #' */
-      int len = strlen (new_value);
-      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
-        {
-          new_value[len-1] = '\0';
-        }
-      lt_setenv (name, new_value);
-      XFREE (new_value);
-    }
-}
-
-void
-lt_update_lib_path (const char *name, const char *value)
-{
-  LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
-                          (name ? name : "<NULL>"),
-                          (value ? value : "<NULL>")));
-
-  if (name && *name && value && *value)
-    {
-      char *new_value = lt_extend_str (getenv (name), value, 0);
-      lt_setenv (name, new_value);
-      XFREE (new_value);
-    }
-}
-
-
-EOF
-}
-# end: func_emit_cwrapperexe_src
-
-# func_mode_link arg...
-func_mode_link ()
-{
-    $opt_debug
-    case $host in
-    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-      # It is impossible to link a dll without this setting, and
-      # we shouldn't force the makefile maintainer to figure out
-      # which system we are compiling for in order to pass an extra
-      # flag for every libtool invocation.
-      # allow_undefined=no
-
-      # FIXME: Unfortunately, there are problems with the above when trying
-      # to make a dll which has undefined symbols, in which case not
-      # even a static library is built.  For now, we need to specify
-      # -no-undefined on the libtool link line when we can be certain
-      # that all symbols are satisfied, otherwise we get a static library.
-      allow_undefined=yes
-      ;;
-    *)
-      allow_undefined=yes
-      ;;
-    esac
-    libtool_args=$nonopt
-    base_compile="$nonopt $@"
-    compile_command=$nonopt
-    finalize_command=$nonopt
-
-    compile_rpath=
-    finalize_rpath=
-    compile_shlibpath=
-    finalize_shlibpath=
-    convenience=
-    old_convenience=
-    deplibs=
-    old_deplibs=
-    compiler_flags=
-    linker_flags=
-    dllsearchpath=
-    lib_search_path=`pwd`
-    inst_prefix_dir=
-    new_inherited_linker_flags=
-
-    avoid_version=no
-    dlfiles=
-    dlprefiles=
-    dlself=no
-    export_dynamic=no
-    export_symbols=
-    export_symbols_regex=
-    generated=
-    libobjs=
-    ltlibs=
-    module=no
-    no_install=no
-    objs=
-    non_pic_objects=
-    precious_files_regex=
-    prefer_static_libs=no
-    preload=no
-    prev=
-    prevarg=
-    release=
-    rpath=
-    xrpath=
-    perm_rpath=
-    temp_rpath=
-    thread_safe=no
-    vinfo=
-    vinfo_number=no
-    weak_libs=
-    single_module="${wl}-single_module"
-    func_infer_tag $base_compile
-
-    # We need to know -static, to get the right output filenames.
-    for arg
-    do
-      case $arg in
-      -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
-	build_old_libs=no
-	break
-	;;
-      -all-static | -static | -static-libtool-libs)
-	case $arg in
-	-all-static)
-	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
-	    func_warning "complete static linking is impossible in this configuration"
-	  fi
-	  if test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=yes
-	  ;;
-	-static)
-	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=built
-	  ;;
-	-static-libtool-libs)
-	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=yes
-	  ;;
-	esac
-	build_libtool_libs=no
-	build_old_libs=yes
-	break
-	;;
-      esac
-    done
-
-    # See if our shared archives depend on static archives.
-    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
-
-    # Go through the arguments, transforming them on the way.
-    while test "$#" -gt 0; do
-      arg="$1"
-      shift
-      func_quote_for_eval "$arg"
-      qarg=$func_quote_for_eval_unquoted_result
-      func_append libtool_args " $func_quote_for_eval_result"
-
-      # If the previous option needs an argument, assign it.
-      if test -n "$prev"; then
-	case $prev in
-	output)
-	  func_append compile_command " @OUTPUT@"
-	  func_append finalize_command " @OUTPUT@"
-	  ;;
-	esac
-
-	case $prev in
-	dlfiles|dlprefiles)
-	  if test "$preload" = no; then
-	    # Add the symbol object into the linking commands.
-	    func_append compile_command " @SYMFILE@"
-	    func_append finalize_command " @SYMFILE@"
-	    preload=yes
-	  fi
-	  case $arg in
-	  *.la | *.lo) ;;  # We handle these cases below.
-	  force)
-	    if test "$dlself" = no; then
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  self)
-	    if test "$prev" = dlprefiles; then
-	      dlself=yes
-	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
-	      dlself=yes
-	    else
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  *)
-	    if test "$prev" = dlfiles; then
-	      dlfiles="$dlfiles $arg"
-	    else
-	      dlprefiles="$dlprefiles $arg"
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  esac
-	  ;;
-	expsyms)
-	  export_symbols="$arg"
-	  test -f "$arg" \
-	    || func_fatal_error "symbol file \`$arg' does not exist"
-	  prev=
-	  continue
-	  ;;
-	expsyms_regex)
-	  export_symbols_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	framework)
-	  case $host in
-	    *-*-darwin*)
-	      case "$deplibs " in
-		*" $qarg.ltframework "*) ;;
-		*) deplibs="$deplibs $qarg.ltframework" # this is fixed later
-		   ;;
-	      esac
-	      ;;
-	  esac
-	  prev=
-	  continue
-	  ;;
-	inst_prefix)
-	  inst_prefix_dir="$arg"
-	  prev=
-	  continue
-	  ;;
-	objectlist)
-	  if test -f "$arg"; then
-	    save_arg=$arg
-	    moreargs=
-	    for fil in `cat "$save_arg"`
-	    do
-#	      moreargs="$moreargs $fil"
-	      arg=$fil
-	      # A libtool-controlled object.
-
-	      # Check to see that this really is a libtool object.
-	      if func_lalib_unsafe_p "$arg"; then
-		pic_object=
-		non_pic_object=
-
-		# Read the .lo file
-		func_source "$arg"
-
-		if test -z "$pic_object" ||
-		   test -z "$non_pic_object" ||
-		   test "$pic_object" = none &&
-		   test "$non_pic_object" = none; then
-		  func_fatal_error "cannot find name of object for \`$arg'"
-		fi
-
-		# Extract subdirectory from the argument.
-		func_dirname "$arg" "/" ""
-		xdir="$func_dirname_result"
-
-		if test "$pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  pic_object="$xdir$pic_object"
-
-		  if test "$prev" = dlfiles; then
-		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		      dlfiles="$dlfiles $pic_object"
-		      prev=
-		      continue
-		    else
-		      # If libtool objects are unsupported, then we need to preload.
-		      prev=dlprefiles
-		    fi
-		  fi
-
-		  # CHECK ME:  I think I busted this.  -Ossama
-		  if test "$prev" = dlprefiles; then
-		    # Preload the old-style object.
-		    dlprefiles="$dlprefiles $pic_object"
-		    prev=
-		  fi
-
-		  # A PIC object.
-		  func_append libobjs " $pic_object"
-		  arg="$pic_object"
-		fi
-
-		# Non-PIC object.
-		if test "$non_pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  non_pic_object="$xdir$non_pic_object"
-
-		  # A standard non-PIC object
-		  func_append non_pic_objects " $non_pic_object"
-		  if test -z "$pic_object" || test "$pic_object" = none ; then
-		    arg="$non_pic_object"
-		  fi
-		else
-		  # If the PIC object exists, use it instead.
-		  # $xdir was prepended to $pic_object above.
-		  non_pic_object="$pic_object"
-		  func_append non_pic_objects " $non_pic_object"
-		fi
-	      else
-		# Only an error if not doing a dry-run.
-		if $opt_dry_run; then
-		  # Extract subdirectory from the argument.
-		  func_dirname "$arg" "/" ""
-		  xdir="$func_dirname_result"
-
-		  func_lo2o "$arg"
-		  pic_object=$xdir$objdir/$func_lo2o_result
-		  non_pic_object=$xdir$func_lo2o_result
-		  func_append libobjs " $pic_object"
-		  func_append non_pic_objects " $non_pic_object"
-	        else
-		  func_fatal_error "\`$arg' is not a valid libtool object"
-		fi
-	      fi
-	    done
-	  else
-	    func_fatal_error "link input file \`$arg' does not exist"
-	  fi
-	  arg=$save_arg
-	  prev=
-	  continue
-	  ;;
-	precious_regex)
-	  precious_files_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	release)
-	  release="-$arg"
-	  prev=
-	  continue
-	  ;;
-	rpath | xrpath)
-	  # We need an absolute path.
-	  case $arg in
-	  [\\/]* | [A-Za-z]:[\\/]*) ;;
-	  *)
-	    func_fatal_error "only absolute run-paths are allowed"
-	    ;;
-	  esac
-	  if test "$prev" = rpath; then
-	    case "$rpath " in
-	    *" $arg "*) ;;
-	    *) rpath="$rpath $arg" ;;
-	    esac
-	  else
-	    case "$xrpath " in
-	    *" $arg "*) ;;
-	    *) xrpath="$xrpath $arg" ;;
-	    esac
-	  fi
-	  prev=
-	  continue
-	  ;;
-	shrext)
-	  shrext_cmds="$arg"
-	  prev=
-	  continue
-	  ;;
-	weak)
-	  weak_libs="$weak_libs $arg"
-	  prev=
-	  continue
-	  ;;
-	xcclinker)
-	  linker_flags="$linker_flags $qarg"
-	  compiler_flags="$compiler_flags $qarg"
-	  prev=
-	  func_append compile_command " $qarg"
-	  func_append finalize_command " $qarg"
-	  continue
-	  ;;
-	xcompiler)
-	  compiler_flags="$compiler_flags $qarg"
-	  prev=
-	  func_append compile_command " $qarg"
-	  func_append finalize_command " $qarg"
-	  continue
-	  ;;
-	xlinker)
-	  linker_flags="$linker_flags $qarg"
-	  compiler_flags="$compiler_flags $wl$qarg"
-	  prev=
-	  func_append compile_command " $wl$qarg"
-	  func_append finalize_command " $wl$qarg"
-	  continue
-	  ;;
-	*)
-	  eval "$prev=\"\$arg\""
-	  prev=
-	  continue
-	  ;;
-	esac
-      fi # test -n "$prev"
-
-      prevarg="$arg"
-
-      case $arg in
-      -all-static)
-	if test -n "$link_static_flag"; then
-	  # See comment for -static flag below, for more details.
-	  func_append compile_command " $link_static_flag"
-	  func_append finalize_command " $link_static_flag"
-	fi
-	continue
-	;;
-
-      -allow-undefined)
-	# FIXME: remove this flag sometime in the future.
-	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
-	;;
-
-      -avoid-version)
-	avoid_version=yes
-	continue
-	;;
-
-      -dlopen)
-	prev=dlfiles
-	continue
-	;;
-
-      -dlpreopen)
-	prev=dlprefiles
-	continue
-	;;
-
-      -export-dynamic)
-	export_dynamic=yes
-	continue
-	;;
-
-      -export-symbols | -export-symbols-regex)
-	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
-	  func_fatal_error "more than one -exported-symbols argument is not allowed"
-	fi
-	if test "X$arg" = "X-export-symbols"; then
-	  prev=expsyms
-	else
-	  prev=expsyms_regex
-	fi
-	continue
-	;;
-
-      -framework)
-	prev=framework
-	continue
-	;;
-
-      -inst-prefix-dir)
-	prev=inst_prefix
-	continue
-	;;
-
-      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
-      # so, if we see these flags be careful not to treat them like -L
-      -L[A-Z][A-Z]*:*)
-	case $with_gcc/$host in
-	no/*-*-irix* | /*-*-irix*)
-	  func_append compile_command " $arg"
-	  func_append finalize_command " $arg"
-	  ;;
-	esac
-	continue
-	;;
-
-      -L*)
-	func_stripname '-L' '' "$arg"
-	dir=$func_stripname_result
-	if test -z "$dir"; then
-	  if test "$#" -gt 0; then
-	    func_fatal_error "require no space between \`-L' and \`$1'"
-	  else
-	    func_fatal_error "need path for \`-L' option"
-	  fi
-	fi
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	*)
-	  absdir=`cd "$dir" && pwd`
-	  test -z "$absdir" && \
-	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
-	  dir="$absdir"
-	  ;;
-	esac
-	case "$deplibs " in
-	*" -L$dir "*) ;;
-	*)
-	  deplibs="$deplibs -L$dir"
-	  lib_search_path="$lib_search_path $dir"
-	  ;;
-	esac
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-	  testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$dir:"*) ;;
-	  ::) dllsearchpath=$dir;;
-	  *) dllsearchpath="$dllsearchpath:$dir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  ::) dllsearchpath=$testbindir;;
-	  *) dllsearchpath="$dllsearchpath:$testbindir";;
-	  esac
-	  ;;
-	esac
-	continue
-	;;
-
-      -l*)
-	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*)
-	    # These systems don't actually have a C or math library (as such)
-	    continue
-	    ;;
-	  *-*-os2*)
-	    # These systems don't actually have a C library (as such)
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C and math libraries are in the System framework
-	    deplibs="$deplibs System.ltframework"
-	    continue
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  esac
-	elif test "X$arg" = "X-lc_r"; then
-	 case $host in
-	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	   # Do not include libc_r directly, use -pthread flag.
-	   continue
-	   ;;
-	 esac
-	fi
-	deplibs="$deplibs $arg"
-	continue
-	;;
-
-      -module)
-	module=yes
-	continue
-	;;
-
-      # Tru64 UNIX uses -model [arg] to determine the layout of C++
-      # classes, name mangling, and exception handling.
-      # Darwin uses the -arch flag to determine output architecture.
-      -model|-arch|-isysroot)
-	compiler_flags="$compiler_flags $arg"
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-	prev=xcompiler
-	continue
-	;;
-
-      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
-	compiler_flags="$compiler_flags $arg"
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-	case "$new_inherited_linker_flags " in
-	    *" $arg "*) ;;
-	    * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;;
-	esac
-	continue
-	;;
-
-      -multi_module)
-	single_module="${wl}-multi_module"
-	continue
-	;;
-
-      -no-fast-install)
-	fast_install=no
-	continue
-	;;
-
-      -no-install)
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
-	  # The PATH hackery in wrapper scripts is required on Windows
-	  # and Darwin in order for the loader to find any dlls it needs.
-	  func_warning "\`-no-install' is ignored for $host"
-	  func_warning "assuming \`-no-fast-install' instead"
-	  fast_install=no
-	  ;;
-	*) no_install=yes ;;
-	esac
-	continue
-	;;
-
-      -no-undefined)
-	allow_undefined=no
-	continue
-	;;
-
-      -objectlist)
-	prev=objectlist
-	continue
-	;;
-
-      -o) prev=output ;;
-
-      -precious-files-regex)
-	prev=precious_regex
-	continue
-	;;
-
-      -release)
-	prev=release
-	continue
-	;;
-
-      -rpath)
-	prev=rpath
-	continue
-	;;
-
-      -R)
-	prev=xrpath
-	continue
-	;;
-
-      -R*)
-	func_stripname '-R' '' "$arg"
-	dir=$func_stripname_result
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	*)
-	  func_fatal_error "only absolute run-paths are allowed"
-	  ;;
-	esac
-	case "$xrpath " in
-	*" $dir "*) ;;
-	*) xrpath="$xrpath $dir" ;;
-	esac
-	continue
-	;;
-
-      -shared)
-	# The effects of -shared are defined in a previous loop.
-	continue
-	;;
-
-      -shrext)
-	prev=shrext
-	continue
-	;;
-
-      -static | -static-libtool-libs)
-	# The effects of -static are defined in a previous loop.
-	# We used to do the same as -all-static on platforms that
-	# didn't have a PIC flag, but the assumption that the effects
-	# would be equivalent was wrong.  It would break on at least
-	# Digital Unix and AIX.
-	continue
-	;;
-
-      -thread-safe)
-	thread_safe=yes
-	continue
-	;;
-
-      -version-info)
-	prev=vinfo
-	continue
-	;;
-
-      -version-number)
-	prev=vinfo
-	vinfo_number=yes
-	continue
-	;;
-
-      -weak)
-        prev=weak
-	continue
-	;;
-
-      -Wc,*)
-	func_stripname '-Wc,' '' "$arg"
-	args=$func_stripname_result
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-          func_quote_for_eval "$flag"
-	  arg="$arg $wl$func_quote_for_eval_result"
-	  compiler_flags="$compiler_flags $func_quote_for_eval_result"
-	done
-	IFS="$save_ifs"
-	func_stripname ' ' '' "$arg"
-	arg=$func_stripname_result
-	;;
-
-      -Wl,*)
-	func_stripname '-Wl,' '' "$arg"
-	args=$func_stripname_result
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-          func_quote_for_eval "$flag"
-	  arg="$arg $wl$func_quote_for_eval_result"
-	  compiler_flags="$compiler_flags $wl$func_quote_for_eval_result"
-	  linker_flags="$linker_flags $func_quote_for_eval_result"
-	done
-	IFS="$save_ifs"
-	func_stripname ' ' '' "$arg"
-	arg=$func_stripname_result
-	;;
-
-      -Xcompiler)
-	prev=xcompiler
-	continue
-	;;
-
-      -Xlinker)
-	prev=xlinker
-	continue
-	;;
-
-      -XCClinker)
-	prev=xcclinker
-	continue
-	;;
-
-      # -msg_* for osf cc
-      -msg_*)
-	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-
-      # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
-      # -r[0-9][0-9]* specifies the processor on the SGI compiler
-      # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
-      # +DA*, +DD* enable 64-bit mode on the HP compiler
-      # -q* pass through compiler args for the IBM compiler
-      # -m*, -t[45]*, -txscale* pass through architecture-specific
-      # compiler args for GCC
-      # -F/path gives path to uninstalled frameworks, gcc on darwin
-      # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC
-      # @file GCC response files
-      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*)
-        func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-        func_append compile_command " $arg"
-        func_append finalize_command " $arg"
-        compiler_flags="$compiler_flags $arg"
-        continue
-        ;;
-
-      # Some other compiler flag.
-      -* | +*)
-        func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-
-      *.$objext)
-	# A standard object.
-	objs="$objs $arg"
-	;;
-
-      *.lo)
-	# A libtool-controlled object.
-
-	# Check to see that this really is a libtool object.
-	if func_lalib_unsafe_p "$arg"; then
-	  pic_object=
-	  non_pic_object=
-
-	  # Read the .lo file
-	  func_source "$arg"
-
-	  if test -z "$pic_object" ||
-	     test -z "$non_pic_object" ||
-	     test "$pic_object" = none &&
-	     test "$non_pic_object" = none; then
-	    func_fatal_error "cannot find name of object for \`$arg'"
-	  fi
-
-	  # Extract subdirectory from the argument.
-	  func_dirname "$arg" "/" ""
-	  xdir="$func_dirname_result"
-
-	  if test "$pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    pic_object="$xdir$pic_object"
-
-	    if test "$prev" = dlfiles; then
-	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		dlfiles="$dlfiles $pic_object"
-		prev=
-		continue
-	      else
-		# If libtool objects are unsupported, then we need to preload.
-		prev=dlprefiles
-	      fi
-	    fi
-
-	    # CHECK ME:  I think I busted this.  -Ossama
-	    if test "$prev" = dlprefiles; then
-	      # Preload the old-style object.
-	      dlprefiles="$dlprefiles $pic_object"
-	      prev=
-	    fi
-
-	    # A PIC object.
-	    func_append libobjs " $pic_object"
-	    arg="$pic_object"
-	  fi
-
-	  # Non-PIC object.
-	  if test "$non_pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    non_pic_object="$xdir$non_pic_object"
-
-	    # A standard non-PIC object
-	    func_append non_pic_objects " $non_pic_object"
-	    if test -z "$pic_object" || test "$pic_object" = none ; then
-	      arg="$non_pic_object"
-	    fi
-	  else
-	    # If the PIC object exists, use it instead.
-	    # $xdir was prepended to $pic_object above.
-	    non_pic_object="$pic_object"
-	    func_append non_pic_objects " $non_pic_object"
-	  fi
-	else
-	  # Only an error if not doing a dry-run.
-	  if $opt_dry_run; then
-	    # Extract subdirectory from the argument.
-	    func_dirname "$arg" "/" ""
-	    xdir="$func_dirname_result"
-
-	    func_lo2o "$arg"
-	    pic_object=$xdir$objdir/$func_lo2o_result
-	    non_pic_object=$xdir$func_lo2o_result
-	    func_append libobjs " $pic_object"
-	    func_append non_pic_objects " $non_pic_object"
-	  else
-	    func_fatal_error "\`$arg' is not a valid libtool object"
-	  fi
-	fi
-	;;
-
-      *.$libext)
-	# An archive.
-	deplibs="$deplibs $arg"
-	old_deplibs="$old_deplibs $arg"
-	continue
-	;;
-
-      *.la)
-	# A libtool-controlled library.
-
-	if test "$prev" = dlfiles; then
-	  # This library was specified with -dlopen.
-	  dlfiles="$dlfiles $arg"
-	  prev=
-	elif test "$prev" = dlprefiles; then
-	  # The library was specified with -dlpreopen.
-	  dlprefiles="$dlprefiles $arg"
-	  prev=
-	else
-	  deplibs="$deplibs $arg"
-	fi
-	continue
-	;;
-
-      # Some other compiler argument.
-      *)
-	# Unknown arguments in both finalize_command and compile_command need
-	# to be aesthetically quoted because they are evaled later.
-	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-      esac # arg
-
-      # Now actually substitute the argument into the commands.
-      if test -n "$arg"; then
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-      fi
-    done # argument parsing loop
-
-    test -n "$prev" && \
-      func_fatal_help "the \`$prevarg' option requires an argument"
-
-    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
-      eval arg=\"$export_dynamic_flag_spec\"
-      func_append compile_command " $arg"
-      func_append finalize_command " $arg"
-    fi
-
-    oldlibs=
-    # calculate the name of the file, without its directory
-    func_basename "$output"
-    outputname="$func_basename_result"
-    libobjs_save="$libobjs"
-
-    if test -n "$shlibpath_var"; then
-      # get the directories listed in $shlibpath_var
-      eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
-    else
-      shlib_search_path=
-    fi
-    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
-    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
-
-    func_dirname "$output" "/" ""
-    output_objdir="$func_dirname_result$objdir"
-    # Create the object directory.
-    func_mkdir_p "$output_objdir"
-
-    # Determine the type of output
-    case $output in
-    "")
-      func_fatal_help "you must specify an output file"
-      ;;
-    *.$libext) linkmode=oldlib ;;
-    *.lo | *.$objext) linkmode=obj ;;
-    *.la) linkmode=lib ;;
-    *) linkmode=prog ;; # Anything else should be a program.
-    esac
-
-    specialdeplibs=
-
-    libs=
-    # Find all interdependent deplibs by searching for libraries
-    # that are linked more than once (e.g. -la -lb -la)
-    for deplib in $deplibs; do
-      if $opt_duplicate_deps ; then
-	case "$libs " in
-	*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	esac
-      fi
-      libs="$libs $deplib"
-    done
-
-    if test "$linkmode" = lib; then
-      libs="$predeps $libs $compiler_lib_search_path $postdeps"
-
-      # Compute libraries that are listed more than once in $predeps
-      # $postdeps and mark them as special (i.e., whose duplicates are
-      # not to be eliminated).
-      pre_post_deps=
-      if $opt_duplicate_compiler_generated_deps; then
-	for pre_post_dep in $predeps $postdeps; do
-	  case "$pre_post_deps " in
-	  *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
-	  esac
-	  pre_post_deps="$pre_post_deps $pre_post_dep"
-	done
-      fi
-      pre_post_deps=
-    fi
-
-    deplibs=
-    newdependency_libs=
-    newlib_search_path=
-    need_relink=no # whether we're linking any uninstalled libtool libraries
-    notinst_deplibs= # not-installed libtool libraries
-    notinst_path= # paths that contain not-installed libtool libraries
-
-    case $linkmode in
-    lib)
-	passes="conv dlpreopen link"
-	for file in $dlfiles $dlprefiles; do
-	  case $file in
-	  *.la) ;;
-	  *)
-	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
-	    ;;
-	  esac
-	done
-	;;
-    prog)
-	compile_deplibs=
-	finalize_deplibs=
-	alldeplibs=no
-	newdlfiles=
-	newdlprefiles=
-	passes="conv scan dlopen dlpreopen link"
-	;;
-    *)  passes="conv"
-	;;
-    esac
-
-    for pass in $passes; do
-      # The preopen pass in lib mode reverses $deplibs; put it back here
-      # so that -L comes before libs that need it for instance...
-      if test "$linkmode,$pass" = "lib,link"; then
-	## FIXME: Find the place where the list is rebuilt in the wrong
-	##        order, and fix it there properly
-        tmp_deplibs=
-	for deplib in $deplibs; do
-	  tmp_deplibs="$deplib $tmp_deplibs"
-	done
-	deplibs="$tmp_deplibs"
-      fi
-
-      if test "$linkmode,$pass" = "lib,link" ||
-	 test "$linkmode,$pass" = "prog,scan"; then
-	libs="$deplibs"
-	deplibs=
-      fi
-      if test "$linkmode" = prog; then
-	case $pass in
-	dlopen) libs="$dlfiles" ;;
-	dlpreopen) libs="$dlprefiles" ;;
-	link)
-	  libs="$deplibs %DEPLIBS%"
-	  test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
-	  ;;
-	esac
-      fi
-      if test "$linkmode,$pass" = "lib,dlpreopen"; then
-	# Collect and forward deplibs of preopened libtool libs
-	for lib in $dlprefiles; do
-	  # Ignore non-libtool-libs
-	  dependency_libs=
-	  case $lib in
-	  *.la)	func_source "$lib" ;;
-	  esac
-
-	  # Collect preopened libtool deplibs, except any this library
-	  # has declared as weak libs
-	  for deplib in $dependency_libs; do
-            deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"`
-	    case " $weak_libs " in
-	    *" $deplib_base "*) ;;
-	    *) deplibs="$deplibs $deplib" ;;
-	    esac
-	  done
-	done
-	libs="$dlprefiles"
-      fi
-      if test "$pass" = dlopen; then
-	# Collect dlpreopened libraries
-	save_deplibs="$deplibs"
-	deplibs=
-      fi
-
-      for deplib in $libs; do
-	lib=
-	found=no
-	case $deplib in
-	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
-	  if test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$deplib $compile_deplibs"
-	    finalize_deplibs="$deplib $finalize_deplibs"
-	  else
-	    compiler_flags="$compiler_flags $deplib"
-	    if test "$linkmode" = lib ; then
-		case "$new_inherited_linker_flags " in
-		    *" $deplib "*) ;;
-		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
-		esac
-	    fi
-	  fi
-	  continue
-	  ;;
-	-l*)
-	  if test "$linkmode" != lib && test "$linkmode" != prog; then
-	    func_warning "\`-l' is ignored for archives/objects"
-	    continue
-	  fi
-	  func_stripname '-l' '' "$deplib"
-	  name=$func_stripname_result
-	  if test "$linkmode" = lib; then
-	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
-	  else
-	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
-	  fi
-	  for searchdir in $searchdirs; do
-	    for search_ext in .la $std_shrext .so .a; do
-	      # Search the libtool library
-	      lib="$searchdir/lib${name}${search_ext}"
-	      if test -f "$lib"; then
-		if test "$search_ext" = ".la"; then
-		  found=yes
-		else
-		  found=no
-		fi
-		break 2
-	      fi
-	    done
-	  done
-	  if test "$found" != yes; then
-	    # deplib doesn't seem to be a libtool library
-	    if test "$linkmode,$pass" = "prog,link"; then
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      deplibs="$deplib $deplibs"
-	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    continue
-	  else # deplib is a libtool library
-	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
-	    # We need to do some special things here, and not later.
-	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	      case " $predeps $postdeps " in
-	      *" $deplib "*)
-		if func_lalib_p "$lib"; then
-		  library_names=
-		  old_library=
-		  func_source "$lib"
-		  for l in $old_library $library_names; do
-		    ll="$l"
-		  done
-		  if test "X$ll" = "X$old_library" ; then # only static version available
-		    found=no
-		    func_dirname "$lib" "" "."
-		    ladir="$func_dirname_result"
-		    lib=$ladir/$old_library
-		    if test "$linkmode,$pass" = "prog,link"; then
-		      compile_deplibs="$deplib $compile_deplibs"
-		      finalize_deplibs="$deplib $finalize_deplibs"
-		    else
-		      deplibs="$deplib $deplibs"
-		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-		    fi
-		    continue
-		  fi
-		fi
-		;;
-	      *) ;;
-	      esac
-	    fi
-	  fi
-	  ;; # -l
-	*.ltframework)
-	  if test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$deplib $compile_deplibs"
-	    finalize_deplibs="$deplib $finalize_deplibs"
-	  else
-	    deplibs="$deplib $deplibs"
-	    if test "$linkmode" = lib ; then
-		case "$new_inherited_linker_flags " in
-		    *" $deplib "*) ;;
-		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
-		esac
-	    fi
-	  fi
-	  continue
-	  ;;
-	-L*)
-	  case $linkmode in
-	  lib)
-	    deplibs="$deplib $deplibs"
-	    test "$pass" = conv && continue
-	    newdependency_libs="$deplib $newdependency_libs"
-	    func_stripname '-L' '' "$deplib"
-	    newlib_search_path="$newlib_search_path $func_stripname_result"
-	    ;;
-	  prog)
-	    if test "$pass" = conv; then
-	      deplibs="$deplib $deplibs"
-	      continue
-	    fi
-	    if test "$pass" = scan; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    func_stripname '-L' '' "$deplib"
-	    newlib_search_path="$newlib_search_path $func_stripname_result"
-	    ;;
-	  *)
-	    func_warning "\`-L' is ignored for archives/objects"
-	    ;;
-	  esac # linkmode
-	  continue
-	  ;; # -L
-	-R*)
-	  if test "$pass" = link; then
-	    func_stripname '-R' '' "$deplib"
-	    dir=$func_stripname_result
-	    # Make sure the xrpath contains only unique directories.
-	    case "$xrpath " in
-	    *" $dir "*) ;;
-	    *) xrpath="$xrpath $dir" ;;
-	    esac
-	  fi
-	  deplibs="$deplib $deplibs"
-	  continue
-	  ;;
-	*.la) lib="$deplib" ;;
-	*.$libext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	    continue
-	  fi
-	  case $linkmode in
-	  lib)
-	    # Linking convenience modules into shared libraries is allowed,
-	    # but linking other static libraries is non-portable.
-	    case " $dlpreconveniencelibs " in
-	    *" $deplib "*) ;;
-	    *)
-	      valid_a_lib=no
-	      case $deplibs_check_method in
-		match_pattern*)
-		  set dummy $deplibs_check_method; shift
-		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-		  if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \
-		    | $EGREP "$match_pattern_regex" > /dev/null; then
-		    valid_a_lib=yes
-		  fi
-		;;
-		pass_all)
-		  valid_a_lib=yes
-		;;
-	      esac
-	      if test "$valid_a_lib" != yes; then
-		$ECHO
-		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
-		$ECHO "*** I have the capability to make that library automatically link in when"
-		$ECHO "*** you link to this library.  But I can only do this if you have a"
-		$ECHO "*** shared version of the library, which you do not appear to have"
-		$ECHO "*** because the file extensions .$libext of this argument makes me believe"
-		$ECHO "*** that it is just a static archive that I should not use here."
-	      else
-		$ECHO
-		$ECHO "*** Warning: Linking the shared library $output against the"
-		$ECHO "*** static library $deplib is not portable!"
-		deplibs="$deplib $deplibs"
-	      fi
-	      ;;
-	    esac
-	    continue
-	    ;;
-	  prog)
-	    if test "$pass" != link; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    continue
-	    ;;
-	  esac # linkmode
-	  ;; # *.$libext
-	*.lo | *.$objext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	  elif test "$linkmode" = prog; then
-	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
-	      # If there is no dlopen support or we're linking statically,
-	      # we need to preload.
-	      newdlprefiles="$newdlprefiles $deplib"
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      newdlfiles="$newdlfiles $deplib"
-	    fi
-	  fi
-	  continue
-	  ;;
-	%DEPLIBS%)
-	  alldeplibs=yes
-	  continue
-	  ;;
-	esac # case $deplib
-
-	if test "$found" = yes || test -f "$lib"; then :
-	else
-	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
-	fi
-
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$lib" \
-	  || func_fatal_error "\`$lib' is not a valid libtool archive"
-
-	func_dirname "$lib" "" "."
-	ladir="$func_dirname_result"
-
-	dlname=
-	dlopen=
-	dlpreopen=
-	libdir=
-	library_names=
-	old_library=
-	inherited_linker_flags=
-	# If the library was installed with an old release of libtool,
-	# it will not redefine variables installed, or shouldnotlink
-	installed=yes
-	shouldnotlink=no
-	avoidtemprpath=
-
-
-	# Read the .la file
-	func_source "$lib"
-
-	# Convert "-framework foo" to "foo.ltframework"
-	if test -n "$inherited_linker_flags"; then
-	  tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'`
-	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
-	    case " $new_inherited_linker_flags " in
-	      *" $tmp_inherited_linker_flag "*) ;;
-	      *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";;
-	    esac
-	  done
-	fi
-	dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-	if test "$linkmode,$pass" = "lib,link" ||
-	   test "$linkmode,$pass" = "prog,scan" ||
-	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
-	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
-	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
-	fi
-
-	if test "$pass" = conv; then
-	  # Only check for convenience libraries
-	  deplibs="$lib $deplibs"
-	  if test -z "$libdir"; then
-	    if test -z "$old_library"; then
-	      func_fatal_error "cannot find name of link library for \`$lib'"
-	    fi
-	    # It is a libtool convenience library, so add in its objects.
-	    convenience="$convenience $ladir/$objdir/$old_library"
-	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
-	    tmp_libs=
-	    for deplib in $dependency_libs; do
-	      deplibs="$deplib $deplibs"
-	      if $opt_duplicate_deps ; then
-		case "$tmp_libs " in
-		*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-		esac
-	      fi
-	      tmp_libs="$tmp_libs $deplib"
-	    done
-	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
-	    func_fatal_error "\`$lib' is not a convenience library"
-	  fi
-	  continue
-	fi # $pass = conv
-
-
-	# Get the name of the library we link against.
-	linklib=
-	for l in $old_library $library_names; do
-	  linklib="$l"
-	done
-	if test -z "$linklib"; then
-	  func_fatal_error "cannot find name of link library for \`$lib'"
-	fi
-
-	# This library was specified with -dlopen.
-	if test "$pass" = dlopen; then
-	  if test -z "$libdir"; then
-	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
-	  fi
-	  if test -z "$dlname" ||
-	     test "$dlopen_support" != yes ||
-	     test "$build_libtool_libs" = no; then
-	    # If there is no dlname, no dlopen support or we're linking
-	    # statically, we need to preload.  We also need to preload any
-	    # dependent libraries so libltdl's deplib preloader doesn't
-	    # bomb out in the load deplibs phase.
-	    dlprefiles="$dlprefiles $lib $dependency_libs"
-	  else
-	    newdlfiles="$newdlfiles $lib"
-	  fi
-	  continue
-	fi # $pass = dlopen
-
-	# We need an absolute path.
-	case $ladir in
-	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
-	*)
-	  abs_ladir=`cd "$ladir" && pwd`
-	  if test -z "$abs_ladir"; then
-	    func_warning "cannot determine absolute directory name of \`$ladir'"
-	    func_warning "passing it literally to the linker, although it might fail"
-	    abs_ladir="$ladir"
-	  fi
-	  ;;
-	esac
-	func_basename "$lib"
-	laname="$func_basename_result"
-
-	# Find the relevant object directory and library name.
-	if test "X$installed" = Xyes; then
-	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    func_warning "library \`$lib' was moved."
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    libdir="$abs_ladir"
-	  else
-	    dir="$libdir"
-	    absdir="$libdir"
-	  fi
-	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
-	else
-	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    # Remove this search path later
-	    notinst_path="$notinst_path $abs_ladir"
-	  else
-	    dir="$ladir/$objdir"
-	    absdir="$abs_ladir/$objdir"
-	    # Remove this search path later
-	    notinst_path="$notinst_path $abs_ladir"
-	  fi
-	fi # $installed = yes
-	func_stripname 'lib' '.la' "$laname"
-	name=$func_stripname_result
-
-	# This library was specified with -dlpreopen.
-	if test "$pass" = dlpreopen; then
-	  if test -z "$libdir" && test "$linkmode" = prog; then
-	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
-	  fi
-	  # Prefer using a static library (so that no silly _DYNAMIC symbols
-	  # are required to link).
-	  if test -n "$old_library"; then
-	    newdlprefiles="$newdlprefiles $dir/$old_library"
-	    # Keep a list of preopened convenience libraries to check
-	    # that they are being used correctly in the link pass.
-	    test -z "$libdir" && \
-		dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library"
-	  # Otherwise, use the dlname, so that lt_dlopen finds it.
-	  elif test -n "$dlname"; then
-	    newdlprefiles="$newdlprefiles $dir/$dlname"
-	  else
-	    newdlprefiles="$newdlprefiles $dir/$linklib"
-	  fi
-	fi # $pass = dlpreopen
-
-	if test -z "$libdir"; then
-	  # Link the convenience library
-	  if test "$linkmode" = lib; then
-	    deplibs="$dir/$old_library $deplibs"
-	  elif test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$dir/$old_library $compile_deplibs"
-	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
-	  else
-	    deplibs="$lib $deplibs" # used for prog,scan pass
-	  fi
-	  continue
-	fi
-
-
-	if test "$linkmode" = prog && test "$pass" != link; then
-	  newlib_search_path="$newlib_search_path $ladir"
-	  deplibs="$lib $deplibs"
-
-	  linkalldeplibs=no
-	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
-	     test "$build_libtool_libs" = no; then
-	    linkalldeplibs=yes
-	  fi
-
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    case $deplib in
-	    -L*) func_stripname '-L' '' "$deplib"
-	         newlib_search_path="$newlib_search_path $func_stripname_result"
-		 ;;
-	    esac
-	    # Need to link against all dependency_libs?
-	    if test "$linkalldeplibs" = yes; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      # Need to hardcode shared library paths
-	      # or/and link against static libraries
-	      newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    if $opt_duplicate_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
-	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done # for deplib
-	  continue
-	fi # $linkmode = prog...
-
-	if test "$linkmode,$pass" = "prog,link"; then
-	  if test -n "$library_names" &&
-	     { { test "$prefer_static_libs" = no ||
-	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
-	       test -z "$old_library"; }; then
-	    # We need to hardcode the library path
-	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
-	      # Make sure the rpath contains only unique directories.
-	      case "$temp_rpath:" in
-	      *"$absdir:"*) ;;
-	      *) temp_rpath="$temp_rpath$absdir:" ;;
-	      esac
-	    fi
-
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) compile_rpath="$compile_rpath $absdir"
-	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) finalize_rpath="$finalize_rpath $libdir"
-	      esac
-	      ;;
-	    esac
-	  fi # $linkmode,$pass = prog,link...
-
-	  if test "$alldeplibs" = yes &&
-	     { test "$deplibs_check_method" = pass_all ||
-	       { test "$build_libtool_libs" = yes &&
-		 test -n "$library_names"; }; }; then
-	    # We only need to search for static libraries
-	    continue
-	  fi
-	fi
-
-	link_static=no # Whether the deplib will be linked statically
-	use_static_libs=$prefer_static_libs
-	if test "$use_static_libs" = built && test "$installed" = yes; then
-	  use_static_libs=no
-	fi
-	if test -n "$library_names" &&
-	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
-	  case $host in
-	  *cygwin* | *mingw* | *cegcc*)
-	      # No point in relinking DLLs because paths are not encoded
-	      notinst_deplibs="$notinst_deplibs $lib"
-	      need_relink=no
-	    ;;
-	  *)
-	    if test "$installed" = no; then
-	      notinst_deplibs="$notinst_deplibs $lib"
-	      need_relink=yes
-	    fi
-	    ;;
-	  esac
-	  # This is a shared library
-
-	  # Warn about portability, can't link against -module's on some
-	  # systems (darwin).  Don't bleat about dlopened modules though!
-	  dlopenmodule=""
-	  for dlpremoduletest in $dlprefiles; do
-	    if test "X$dlpremoduletest" = "X$lib"; then
-	      dlopenmodule="$dlpremoduletest"
-	      break
-	    fi
-	  done
-	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
-	    $ECHO
-	    if test "$linkmode" = prog; then
-	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
-	    else
-	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
-	    fi
-	    $ECHO "*** $linklib is not portable!"
-	  fi
-	  if test "$linkmode" = lib &&
-	     test "$hardcode_into_libs" = yes; then
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) compile_rpath="$compile_rpath $absdir"
-	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) finalize_rpath="$finalize_rpath $libdir"
-	      esac
-	      ;;
-	    esac
-	  fi
-
-	  if test -n "$old_archive_from_expsyms_cmds"; then
-	    # figure out the soname
-	    set dummy $library_names
-	    shift
-	    realname="$1"
-	    shift
-	    libname=`eval "\\$ECHO \"$libname_spec\""`
-	    # use dlname if we got it. it's perfectly good, no?
-	    if test -n "$dlname"; then
-	      soname="$dlname"
-	    elif test -n "$soname_spec"; then
-	      # bleh windows
-	      case $host in
-	      *cygwin* | mingw* | *cegcc*)
-	        func_arith $current - $age
-		major=$func_arith_result
-		versuffix="-$major"
-		;;
-	      esac
-	      eval soname=\"$soname_spec\"
-	    else
-	      soname="$realname"
-	    fi
-
-	    # Make a new name for the extract_expsyms_cmds to use
-	    soroot="$soname"
-	    func_basename "$soroot"
-	    soname="$func_basename_result"
-	    func_stripname 'lib' '.dll' "$soname"
-	    newlib=libimp-$func_stripname_result.a
-
-	    # If the library has no export list, then create one now
-	    if test -f "$output_objdir/$soname-def"; then :
-	    else
-	      func_verbose "extracting exported symbol list from \`$soname'"
-	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
-	    fi
-
-	    # Create $newlib
-	    if test -f "$output_objdir/$newlib"; then :; else
-	      func_verbose "generating import library for \`$soname'"
-	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
-	    fi
-	    # make sure the library variables are pointing to the new library
-	    dir=$output_objdir
-	    linklib=$newlib
-	  fi # test -n "$old_archive_from_expsyms_cmds"
-
-	  if test "$linkmode" = prog || test "$mode" != relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    lib_linked=yes
-	    case $hardcode_action in
-	    immediate | unsupported)
-	      if test "$hardcode_direct" = no; then
-		add="$dir/$linklib"
-		case $host in
-		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
-		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
-		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
-		    *-*-unixware7*) add_dir="-L$dir" ;;
-		  *-*-darwin* )
-		    # if the lib is a (non-dlopened) module then we can not
-		    # link against it, someone is ignoring the earlier warnings
-		    if /usr/bin/file -L $add 2> /dev/null |
-			 $GREP ": [^:]* bundle" >/dev/null ; then
-		      if test "X$dlopenmodule" != "X$lib"; then
-			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
-			if test -z "$old_library" ; then
-			  $ECHO
-			  $ECHO "*** And there doesn't seem to be a static archive available"
-			  $ECHO "*** The link will probably fail, sorry"
-			else
-			  add="$dir/$old_library"
-			fi
-		      elif test -n "$old_library"; then
-			add="$dir/$old_library"
-		      fi
-		    fi
-		esac
-	      elif test "$hardcode_minus_L" = no; then
-		case $host in
-		*-*-sunos*) add_shlibpath="$dir" ;;
-		esac
-		add_dir="-L$dir"
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = no; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    relink)
-	      if test "$hardcode_direct" = yes &&
-	         test "$hardcode_direct_absolute" = no; then
-		add="$dir/$linklib"
-	      elif test "$hardcode_minus_L" = yes; then
-		add_dir="-L$dir"
-		# Try looking first in the location we're being installed to.
-		if test -n "$inst_prefix_dir"; then
-		  case $libdir in
-		    [\\/]*)
-		      add_dir="$add_dir -L$inst_prefix_dir$libdir"
-		      ;;
-		  esac
-		fi
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = yes; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    *) lib_linked=no ;;
-	    esac
-
-	    if test "$lib_linked" != yes; then
-	      func_fatal_configuration "unsupported hardcode properties"
-	    fi
-
-	    if test -n "$add_shlibpath"; then
-	      case :$compile_shlibpath: in
-	      *":$add_shlibpath:"*) ;;
-	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
-	      esac
-	    fi
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
-	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	      if test "$hardcode_direct" != yes &&
-		 test "$hardcode_minus_L" != yes &&
-		 test "$hardcode_shlibpath_var" = yes; then
-		case :$finalize_shlibpath: in
-		*":$libdir:"*) ;;
-		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
-		esac
-	      fi
-	    fi
-	  fi
-
-	  if test "$linkmode" = prog || test "$mode" = relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    # Finalize command for both is simple: just hardcode it.
-	    if test "$hardcode_direct" = yes &&
-	       test "$hardcode_direct_absolute" = no; then
-	      add="$libdir/$linklib"
-	    elif test "$hardcode_minus_L" = yes; then
-	      add_dir="-L$libdir"
-	      add="-l$name"
-	    elif test "$hardcode_shlibpath_var" = yes; then
-	      case :$finalize_shlibpath: in
-	      *":$libdir:"*) ;;
-	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
-	      esac
-	      add="-l$name"
-	    elif test "$hardcode_automatic" = yes; then
-	      if test -n "$inst_prefix_dir" &&
-		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
-		add="$inst_prefix_dir$libdir/$linklib"
-	      else
-		add="$libdir/$linklib"
-	      fi
-	    else
-	      # We cannot seem to hardcode it, guess we'll fake it.
-	      add_dir="-L$libdir"
-	      # Try looking first in the location we're being installed to.
-	      if test -n "$inst_prefix_dir"; then
-		case $libdir in
-		  [\\/]*)
-		    add_dir="$add_dir -L$inst_prefix_dir$libdir"
-		    ;;
-		esac
-	      fi
-	      add="-l$name"
-	    fi
-
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
-	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	    fi
-	  fi
-	elif test "$linkmode" = prog; then
-	  # Here we assume that one of hardcode_direct or hardcode_minus_L
-	  # is not unsupported.  This is valid on all known static and
-	  # shared platforms.
-	  if test "$hardcode_direct" != unsupported; then
-	    test -n "$old_library" && linklib="$old_library"
-	    compile_deplibs="$dir/$linklib $compile_deplibs"
-	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
-	  else
-	    compile_deplibs="-l$name -L$dir $compile_deplibs"
-	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
-	  fi
-	elif test "$build_libtool_libs" = yes; then
-	  # Not a shared library
-	  if test "$deplibs_check_method" != pass_all; then
-	    # We're trying link a shared library against a static one
-	    # but the system doesn't support it.
-
-	    # Just print a warning and add the library to dependency_libs so
-	    # that the program can be linked against the static library.
-	    $ECHO
-	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
-	    $ECHO "*** I have the capability to make that library automatically link in when"
-	    $ECHO "*** you link to this library.  But I can only do this if you have a"
-	    $ECHO "*** shared version of the library, which you do not appear to have."
-	    if test "$module" = yes; then
-	      $ECHO "*** But as you try to build a module library, libtool will still create "
-	      $ECHO "*** a static module, that should work as long as the dlopening application"
-	      $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime."
-	      if test -z "$global_symbol_pipe"; then
-		$ECHO
-		$ECHO "*** However, this would only work if libtool was able to extract symbol"
-		$ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
-		$ECHO "*** not find such a program.  So, this module is probably useless."
-		$ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
-	      fi
-	      if test "$build_old_libs" = no; then
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
-	  else
-	    deplibs="$dir/$old_library $deplibs"
-	    link_static=yes
-	  fi
-	fi # link shared/static library?
-
-	if test "$linkmode" = lib; then
-	  if test -n "$dependency_libs" &&
-	     { test "$hardcode_into_libs" != yes ||
-	       test "$build_old_libs" = yes ||
-	       test "$link_static" = yes; }; then
-	    # Extract -R from dependency_libs
-	    temp_deplibs=
-	    for libdir in $dependency_libs; do
-	      case $libdir in
-	      -R*) func_stripname '-R' '' "$libdir"
-	           temp_xrpath=$func_stripname_result
-		   case " $xrpath " in
-		   *" $temp_xrpath "*) ;;
-		   *) xrpath="$xrpath $temp_xrpath";;
-		   esac;;
-	      *) temp_deplibs="$temp_deplibs $libdir";;
-	      esac
-	    done
-	    dependency_libs="$temp_deplibs"
-	  fi
-
-	  newlib_search_path="$newlib_search_path $absdir"
-	  # Link against this library
-	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
-	  # ... and its dependency_libs
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    newdependency_libs="$deplib $newdependency_libs"
-	    if $opt_duplicate_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
-	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done
-
-	  if test "$link_all_deplibs" != no; then
-	    # Add the search paths of all dependency libraries
-	    for deplib in $dependency_libs; do
-	      path=
-	      case $deplib in
-	      -L*) path="$deplib" ;;
-	      *.la)
-	        func_dirname "$deplib" "" "."
-		dir="$func_dirname_result"
-		# We need an absolute path.
-		case $dir in
-		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
-		*)
-		  absdir=`cd "$dir" && pwd`
-		  if test -z "$absdir"; then
-		    func_warning "cannot determine absolute directory name of \`$dir'"
-		    absdir="$dir"
-		  fi
-		  ;;
-		esac
-		if $GREP "^installed=no" $deplib > /dev/null; then
-		case $host in
-		*-*-darwin*)
-		  depdepl=
-		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
-		  if test -n "$deplibrary_names" ; then
-		    for tmp in $deplibrary_names ; do
-		      depdepl=$tmp
-		    done
-		    if test -f "$absdir/$objdir/$depdepl" ; then
-		      depdepl="$absdir/$objdir/$depdepl"
-		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
-                      if test -z "$darwin_install_name"; then
-                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
-                      fi
-		      compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
-		      linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}"
-		      path=
-		    fi
-		  fi
-		  ;;
-		*)
-		  path="-L$absdir/$objdir"
-		  ;;
-		esac
-		else
-		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		  test -z "$libdir" && \
-		    func_fatal_error "\`$deplib' is not a valid libtool archive"
-		  test "$absdir" != "$libdir" && \
-		    func_warning "\`$deplib' seems to be moved"
-
-		  path="-L$absdir"
-		fi
-		;;
-	      esac
-	      case " $deplibs " in
-	      *" $path "*) ;;
-	      *) deplibs="$path $deplibs" ;;
-	      esac
-	    done
-	  fi # link_all_deplibs != no
-	fi # linkmode = lib
-      done # for deplib in $libs
-      if test "$pass" = link; then
-	if test "$linkmode" = "prog"; then
-	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
-	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
-	else
-	  compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-	fi
-      fi
-      dependency_libs="$newdependency_libs"
-      if test "$pass" = dlpreopen; then
-	# Link the dlpreopened libraries before other libraries
-	for deplib in $save_deplibs; do
-	  deplibs="$deplib $deplibs"
-	done
-      fi
-      if test "$pass" != dlopen; then
-	if test "$pass" != conv; then
-	  # Make sure lib_search_path contains only unique directories.
-	  lib_search_path=
-	  for dir in $newlib_search_path; do
-	    case "$lib_search_path " in
-	    *" $dir "*) ;;
-	    *) lib_search_path="$lib_search_path $dir" ;;
-	    esac
-	  done
-	  newlib_search_path=
-	fi
-
-	if test "$linkmode,$pass" != "prog,link"; then
-	  vars="deplibs"
-	else
-	  vars="compile_deplibs finalize_deplibs"
-	fi
-	for var in $vars dependency_libs; do
-	  # Add libraries to $var in reverse order
-	  eval tmp_libs=\"\$$var\"
-	  new_libs=
-	  for deplib in $tmp_libs; do
-	    # FIXME: Pedantically, this is the right thing to do, so
-	    #        that some nasty dependency loop isn't accidentally
-	    #        broken:
-	    #new_libs="$deplib $new_libs"
-	    # Pragmatically, this seems to cause very few problems in
-	    # practice:
-	    case $deplib in
-	    -L*) new_libs="$deplib $new_libs" ;;
-	    -R*) ;;
-	    *)
-	      # And here is the reason: when a library appears more
-	      # than once as an explicit dependence of a library, or
-	      # is implicitly linked in more than once by the
-	      # compiler, it is considered special, and multiple
-	      # occurrences thereof are not removed.  Compare this
-	      # with having the same library being listed as a
-	      # dependency of multiple other libraries: in this case,
-	      # we know (pedantically, we assume) the library does not
-	      # need to be listed more than once, so we keep only the
-	      # last copy.  This is not always right, but it is rare
-	      # enough that we require users that really mean to play
-	      # such unportable linking tricks to link the library
-	      # using -Wl,-lname, so that libtool does not consider it
-	      # for duplicate removal.
-	      case " $specialdeplibs " in
-	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
-	      *)
-		case " $new_libs " in
-		*" $deplib "*) ;;
-		*) new_libs="$deplib $new_libs" ;;
-		esac
-		;;
-	      esac
-	      ;;
-	    esac
-	  done
-	  tmp_libs=
-	  for deplib in $new_libs; do
-	    case $deplib in
-	    -L*)
-	      case " $tmp_libs " in
-	      *" $deplib "*) ;;
-	      *) tmp_libs="$tmp_libs $deplib" ;;
-	      esac
-	      ;;
-	    *) tmp_libs="$tmp_libs $deplib" ;;
-	    esac
-	  done
-	  eval $var=\"$tmp_libs\"
-	done # for var
-      fi
-      # Last step: remove runtime libs from dependency_libs
-      # (they stay in deplibs)
-      tmp_libs=
-      for i in $dependency_libs ; do
-	case " $predeps $postdeps $compiler_lib_search_path " in
-	*" $i "*)
-	  i=""
-	  ;;
-	esac
-	if test -n "$i" ; then
-	  tmp_libs="$tmp_libs $i"
-	fi
-      done
-      dependency_libs=$tmp_libs
-    done # for pass
-    if test "$linkmode" = prog; then
-      dlfiles="$newdlfiles"
-    fi
-    if test "$linkmode" = prog || test "$linkmode" = lib; then
-      dlprefiles="$newdlprefiles"
-    fi
-
-    case $linkmode in
-    oldlib)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for archives"
-      fi
-
-      case " $deplibs" in
-      *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for archives" ;;
-      esac
-
-      test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for archives"
-
-      test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for archives"
-
-      test -n "$vinfo" && \
-	func_warning "\`-version-info/-version-number' is ignored for archives"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for archives"
-
-      test -n "$export_symbols$export_symbols_regex" && \
-	func_warning "\`-export-symbols' is ignored for archives"
-
-      # Now set the variables for building old libraries.
-      build_libtool_libs=no
-      oldlibs="$output"
-      objs="$objs$old_deplibs"
-      ;;
-
-    lib)
-      # Make sure we only generate libraries of the form `libNAME.la'.
-      case $outputname in
-      lib*)
-	func_stripname 'lib' '.la' "$outputname"
-	name=$func_stripname_result
-	eval shared_ext=\"$shrext_cmds\"
-	eval libname=\"$libname_spec\"
-	;;
-      *)
-	test "$module" = no && \
-	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
-
-	if test "$need_lib_prefix" != no; then
-	  # Add the "lib" prefix for modules if required
-	  func_stripname '' '.la' "$outputname"
-	  name=$func_stripname_result
-	  eval shared_ext=\"$shrext_cmds\"
-	  eval libname=\"$libname_spec\"
-	else
-	  func_stripname '' '.la' "$outputname"
-	  libname=$func_stripname_result
-	fi
-	;;
-      esac
-
-      if test -n "$objs"; then
-	if test "$deplibs_check_method" != pass_all; then
-	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
-	else
-	  $ECHO
-	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
-	  $ECHO "*** objects $objs is not portable!"
-	  libobjs="$libobjs $objs"
-	fi
-      fi
-
-      test "$dlself" != no && \
-	func_warning "\`-dlopen self' is ignored for libtool libraries"
-
-      set dummy $rpath
-      shift
-      test "$#" -gt 1 && \
-	func_warning "ignoring multiple \`-rpath's for a libtool library"
-
-      install_libdir="$1"
-
-      oldlibs=
-      if test -z "$rpath"; then
-	if test "$build_libtool_libs" = yes; then
-	  # Building a libtool convenience library.
-	  # Some compilers have problems with a `.al' extension so
-	  # convenience libraries should have the same extension an
-	  # archive normally would.
-	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
-	  build_libtool_libs=convenience
-	  build_old_libs=yes
-	fi
-
-	test -n "$vinfo" && \
-	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
-
-	test -n "$release" && \
-	  func_warning "\`-release' is ignored for convenience libraries"
-      else
-
-	# Parse the version information argument.
-	save_ifs="$IFS"; IFS=':'
-	set dummy $vinfo 0 0 0
-	shift
-	IFS="$save_ifs"
-
-	test -n "$7" && \
-	  func_fatal_help "too many parameters to \`-version-info'"
-
-	# convert absolute version numbers to libtool ages
-	# this retains compatibility with .la files and attempts
-	# to make the code below a bit more comprehensible
-
-	case $vinfo_number in
-	yes)
-	  number_major="$1"
-	  number_minor="$2"
-	  number_revision="$3"
-	  #
-	  # There are really only two kinds -- those that
-	  # use the current revision as the major version
-	  # and those that subtract age and use age as
-	  # a minor version.  But, then there is irix
-	  # which has an extra 1 added just for fun
-	  #
-	  case $version_type in
-	  darwin|linux|osf|windows|none)
-	    func_arith $number_major + $number_minor
-	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_revision"
-	    ;;
-	  freebsd-aout|freebsd-elf|sunos)
-	    current="$number_major"
-	    revision="$number_minor"
-	    age="0"
-	    ;;
-	  irix|nonstopux)
-	    func_arith $number_major + $number_minor
-	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_minor"
-	    lt_irix_increment=no
-	    ;;
-	  *)
-	    func_fatal_configuration "$modename: unknown library version type \`$version_type'"
-	    ;;
-	  esac
-	  ;;
-	no)
-	  current="$1"
-	  revision="$2"
-	  age="$3"
-	  ;;
-	esac
-
-	# Check that each of the things are valid numbers.
-	case $current in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "CURRENT \`$current' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	case $revision in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "REVISION \`$revision' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	case $age in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "AGE \`$age' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	if test "$age" -gt "$current"; then
-	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	fi
-
-	# Calculate the version variables.
-	major=
-	versuffix=
-	verstring=
-	case $version_type in
-	none) ;;
-
-	darwin)
-	  # Like Linux, but with the current version available in
-	  # verstring for coding it into the library header
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
-	  # Darwin ld doesn't like 0 for these options...
-	  func_arith $current + 1
-	  minor_current=$func_arith_result
-	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
-	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
-	  ;;
-
-	freebsd-aout)
-	  major=".$current"
-	  versuffix=".$current.$revision";
-	  ;;
-
-	freebsd-elf)
-	  major=".$current"
-	  versuffix=".$current"
-	  ;;
-
-	irix | nonstopux)
-	  if test "X$lt_irix_increment" = "Xno"; then
-	    func_arith $current - $age
-	  else
-	    func_arith $current - $age + 1
-	  fi
-	  major=$func_arith_result
-
-	  case $version_type in
-	    nonstopux) verstring_prefix=nonstopux ;;
-	    *)         verstring_prefix=sgi ;;
-	  esac
-	  verstring="$verstring_prefix$major.$revision"
-
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$revision
-	  while test "$loop" -ne 0; do
-	    func_arith $revision - $loop
-	    iface=$func_arith_result
-	    func_arith $loop - 1
-	    loop=$func_arith_result
-	    verstring="$verstring_prefix$major.$iface:$verstring"
-	  done
-
-	  # Before this point, $major must not contain `.'.
-	  major=.$major
-	  versuffix="$major.$revision"
-	  ;;
-
-	linux)
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
-	  ;;
-
-	osf)
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix=".$current.$age.$revision"
-	  verstring="$current.$age.$revision"
-
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$age
-	  while test "$loop" -ne 0; do
-	    func_arith $current - $loop
-	    iface=$func_arith_result
-	    func_arith $loop - 1
-	    loop=$func_arith_result
-	    verstring="$verstring:${iface}.0"
-	  done
-
-	  # Make executables depend on our current version.
-	  verstring="$verstring:${current}.0"
-	  ;;
-
-	qnx)
-	  major=".$current"
-	  versuffix=".$current"
-	  ;;
-
-	sunos)
-	  major=".$current"
-	  versuffix=".$current.$revision"
-	  ;;
-
-	windows)
-	  # Use '-' rather than '.', since we only want one
-	  # extension on DOS 8.3 filesystems.
-	  func_arith $current - $age
-	  major=$func_arith_result
-	  versuffix="-$major"
-	  ;;
-
-	*)
-	  func_fatal_configuration "unknown library version type \`$version_type'"
-	  ;;
-	esac
-
-	# Clear the version info if we defaulted, and they specified a release.
-	if test -z "$vinfo" && test -n "$release"; then
-	  major=
-	  case $version_type in
-	  darwin)
-	    # we can't check for "0.0" in archive_cmds due to quoting
-	    # problems, so we reset it completely
-	    verstring=
-	    ;;
-	  *)
-	    verstring="0.0"
-	    ;;
-	  esac
-	  if test "$need_version" = no; then
-	    versuffix=
-	  else
-	    versuffix=".0.0"
-	  fi
-	fi
-
-	# Remove version info from name if versioning should be avoided
-	if test "$avoid_version" = yes && test "$need_version" = no; then
-	  major=
-	  versuffix=
-	  verstring=""
-	fi
-
-	# Check to see if the archive will have undefined symbols.
-	if test "$allow_undefined" = yes; then
-	  if test "$allow_undefined_flag" = unsupported; then
-	    func_warning "undefined symbols not allowed in $host shared libraries"
-	    build_libtool_libs=no
-	    build_old_libs=yes
-	  fi
-	else
-	  # Don't allow undefined symbols.
-	  allow_undefined_flag="$no_undefined_flag"
-	fi
-
-      fi
-
-      func_generate_dlsyms "$libname" "$libname" "yes"
-      libobjs="$libobjs $symfileobj"
-      test "X$libobjs" = "X " && libobjs=
-
-      if test "$mode" != relink; then
-	# Remove our outputs, but don't remove object files since they
-	# may have been created when compiling PIC objects.
-	removelist=
-	tempremovelist=`$ECHO "$output_objdir/*"`
-	for p in $tempremovelist; do
-	  case $p in
-	    *.$objext | *.gcno)
-	       ;;
-	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
-	       if test "X$precious_files_regex" != "X"; then
-		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
-		 then
-		   continue
-		 fi
-	       fi
-	       removelist="$removelist $p"
-	       ;;
-	    *) ;;
-	  esac
-	done
-	test -n "$removelist" && \
-	  func_show_eval "${RM}r \$removelist"
-      fi
-
-      # Now set the variables for building old libraries.
-      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
-	oldlibs="$oldlibs $output_objdir/$libname.$libext"
-
-	# Transform .lo files to .o files.
-	oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
-      fi
-
-      # Eliminate all temporary directories.
-      #for path in $notinst_path; do
-      #	lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"`
-      #	deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"`
-      #	dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"`
-      #done
-
-      if test -n "$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	temp_xrpath=
-	for libdir in $xrpath; do
-	  temp_xrpath="$temp_xrpath -R$libdir"
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_rpath="$finalize_rpath $libdir" ;;
-	  esac
-	done
-	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
-	  dependency_libs="$temp_xrpath $dependency_libs"
-	fi
-      fi
-
-      # Make sure dlfiles contains only unique files that won't be dlpreopened
-      old_dlfiles="$dlfiles"
-      dlfiles=
-      for lib in $old_dlfiles; do
-	case " $dlprefiles $dlfiles " in
-	*" $lib "*) ;;
-	*) dlfiles="$dlfiles $lib" ;;
-	esac
-      done
-
-      # Make sure dlprefiles contains only unique files
-      old_dlprefiles="$dlprefiles"
-      dlprefiles=
-      for lib in $old_dlprefiles; do
-	case "$dlprefiles " in
-	*" $lib "*) ;;
-	*) dlprefiles="$dlprefiles $lib" ;;
-	esac
-      done
-
-      if test "$build_libtool_libs" = yes; then
-	if test -n "$rpath"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*)
-	    # these systems don't actually have a c library (as such)!
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C library is in the System framework
-	    deplibs="$deplibs System.ltframework"
-	    ;;
-	  *-*-netbsd*)
-	    # Don't link with libc until the a.out ld.so is fixed.
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    ;;
-	  *)
-	    # Add libc to deplibs on all other systems if necessary.
-	    if test "$build_libtool_need_lc" = "yes"; then
-	      deplibs="$deplibs -lc"
-	    fi
-	    ;;
-	  esac
-	fi
-
-	# Transform deplibs into only deplibs that can be linked in shared.
-	name_save=$name
-	libname_save=$libname
-	release_save=$release
-	versuffix_save=$versuffix
-	major_save=$major
-	# I'm not sure if I'm treating the release correctly.  I think
-	# release should show up in the -l (ie -lgmp5) so we don't want to
-	# add it in twice.  Is that correct?
-	release=""
-	versuffix=""
-	major=""
-	newdeplibs=
-	droppeddeps=no
-	case $deplibs_check_method in
-	pass_all)
-	  # Don't check for shared/static.  Everything works.
-	  # This might be a little naive.  We might want to check
-	  # whether the library exists or not.  But this is on
-	  # osf3 & osf4 and I'm not really sure... Just
-	  # implementing what was already the behavior.
-	  newdeplibs=$deplibs
-	  ;;
-	test_compile)
-	  # This code stresses the "libraries are programs" paradigm to its
-	  # limits. Maybe even breaks it.  We compile a program, linking it
-	  # against the deplibs as a proxy for the library.  Then we can check
-	  # whether they linked in statically or dynamically with ldd.
-	  $opt_dry_run || $RM conftest.c
-	  cat > conftest.c <<EOF
-	  int main() { return 0; }
-EOF
-	  $opt_dry_run || $RM conftest
-	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
-	    ldd_output=`ldd conftest`
-	    for i in $deplibs; do
-	      case $i in
-	      -l*)
-		func_stripname -l '' "$i"
-		name=$func_stripname_result
-		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		  case " $predeps $postdeps " in
-		  *" $i "*)
-		    newdeplibs="$newdeplibs $i"
-		    i=""
-		    ;;
-		  esac
-		fi
-		if test -n "$i" ; then
-		  libname=`eval "\\$ECHO \"$libname_spec\""`
-		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
-		  set dummy $deplib_matches; shift
-		  deplib_match=$1
-		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		    newdeplibs="$newdeplibs $i"
-		  else
-		    droppeddeps=yes
-		    $ECHO
-		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
-		    $ECHO "*** I have the capability to make that library automatically link in when"
-		    $ECHO "*** you link to this library.  But I can only do this if you have a"
-		    $ECHO "*** shared version of the library, which I believe you do not have"
-		    $ECHO "*** because a test_compile did reveal that the linker did not use it for"
-		    $ECHO "*** its dynamic dependency list that programs get resolved with at runtime."
-		  fi
-		fi
-		;;
-	      *)
-		newdeplibs="$newdeplibs $i"
-		;;
-	      esac
-	    done
-	  else
-	    # Error occurred in the first compile.  Let's try to salvage
-	    # the situation: Compile a separate program for each library.
-	    for i in $deplibs; do
-	      case $i in
-	      -l*)
-		func_stripname -l '' "$i"
-		name=$func_stripname_result
-		$opt_dry_run || $RM conftest
-		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
-		  ldd_output=`ldd conftest`
-		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		    case " $predeps $postdeps " in
-		    *" $i "*)
-		      newdeplibs="$newdeplibs $i"
-		      i=""
-		      ;;
-		    esac
-		  fi
-		  if test -n "$i" ; then
-		    libname=`eval "\\$ECHO \"$libname_spec\""`
-		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
-		    set dummy $deplib_matches; shift
-		    deplib_match=$1
-		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		      newdeplibs="$newdeplibs $i"
-		    else
-		      droppeddeps=yes
-		      $ECHO
-		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
-		      $ECHO "*** I have the capability to make that library automatically link in when"
-		      $ECHO "*** you link to this library.  But I can only do this if you have a"
-		      $ECHO "*** shared version of the library, which you do not appear to have"
-		      $ECHO "*** because a test_compile did reveal that the linker did not use this one"
-		      $ECHO "*** as a dynamic dependency that programs can get resolved with at runtime."
-		    fi
-		  fi
-		else
-		  droppeddeps=yes
-		  $ECHO
-		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
-		  $ECHO "*** make it link in!  You will probably need to install it or some"
-		  $ECHO "*** library that it depends on before this library will be fully"
-		  $ECHO "*** functional.  Installing it before continuing would be even better."
-		fi
-		;;
-	      *)
-		newdeplibs="$newdeplibs $i"
-		;;
-	      esac
-	    done
-	  fi
-	  ;;
-	file_magic*)
-	  set dummy $deplibs_check_method; shift
-	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    case $a_deplib in
-	    -l*)
-	      func_stripname -l '' "$a_deplib"
-	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  newdeplibs="$newdeplibs $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		libname=`eval "\\$ECHO \"$libname_spec\""`
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-		  for potent_lib in $potential_libs; do
-		      # Follow soft links.
-		      if ls -lLd "$potent_lib" 2>/dev/null |
-			 $GREP " -> " >/dev/null; then
-			continue
-		      fi
-		      # The statement above tries to avoid entering an
-		      # endless loop below, in case of cyclic links.
-		      # We might still enter an endless loop, since a link
-		      # loop can be closed while we follow links,
-		      # but so what?
-		      potlib="$potent_lib"
-		      while test -h "$potlib" 2>/dev/null; do
-			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
-			case $potliblink in
-			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
-			*) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
-			esac
-		      done
-		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
-			 $SED -e 10q |
-			 $EGREP "$file_magic_regex" > /dev/null; then
-			newdeplibs="$newdeplibs $a_deplib"
-			a_deplib=""
-			break 2
-		      fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		$ECHO
-		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
-		$ECHO "*** I have the capability to make that library automatically link in when"
-		$ECHO "*** you link to this library.  But I can only do this if you have a"
-		$ECHO "*** shared version of the library, which you do not appear to have"
-		$ECHO "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
-		else
-		  $ECHO "*** with $libname and none of the candidates passed a file format test"
-		  $ECHO "*** using a file magic. Last file checked: $potlib"
-		fi
-	      fi
-	      ;;
-	    *)
-	      # Add a -L argument.
-	      newdeplibs="$newdeplibs $a_deplib"
-	      ;;
-	    esac
-	  done # Gone through all deplibs.
-	  ;;
-	match_pattern*)
-	  set dummy $deplibs_check_method; shift
-	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    case $a_deplib in
-	    -l*)
-	      func_stripname -l '' "$a_deplib"
-	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  newdeplibs="$newdeplibs $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		libname=`eval "\\$ECHO \"$libname_spec\""`
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-		  for potent_lib in $potential_libs; do
-		    potlib="$potent_lib" # see symlink-check above in file_magic test
-		    if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \
-		       $EGREP "$match_pattern_regex" > /dev/null; then
-		      newdeplibs="$newdeplibs $a_deplib"
-		      a_deplib=""
-		      break 2
-		    fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		$ECHO
-		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
-		$ECHO "*** I have the capability to make that library automatically link in when"
-		$ECHO "*** you link to this library.  But I can only do this if you have a"
-		$ECHO "*** shared version of the library, which you do not appear to have"
-		$ECHO "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
-		else
-		  $ECHO "*** with $libname and none of the candidates passed a file format test"
-		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
-		fi
-	      fi
-	      ;;
-	    *)
-	      # Add a -L argument.
-	      newdeplibs="$newdeplibs $a_deplib"
-	      ;;
-	    esac
-	  done # Gone through all deplibs.
-	  ;;
-	none | unknown | *)
-	  newdeplibs=""
-	  tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \
-	      -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'`
-	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	    for i in $predeps $postdeps ; do
-	      # can't use Xsed below, because $i might contain '/'
-	      tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"`
-	    done
-	  fi
-	  if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[	 ]//g' |
-	     $GREP . >/dev/null; then
-	    $ECHO
-	    if test "X$deplibs_check_method" = "Xnone"; then
-	      $ECHO "*** Warning: inter-library dependencies are not supported in this platform."
-	    else
-	      $ECHO "*** Warning: inter-library dependencies are not known to be supported."
-	    fi
-	    $ECHO "*** All declared inter-library dependencies are being dropped."
-	    droppeddeps=yes
-	  fi
-	  ;;
-	esac
-	versuffix=$versuffix_save
-	major=$major_save
-	release=$release_save
-	libname=$libname_save
-	name=$name_save
-
-	case $host in
-	*-*-rhapsody* | *-*-darwin1.[012])
-	  # On Rhapsody replace the C library with the System framework
-	  newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
-	  ;;
-	esac
-
-	if test "$droppeddeps" = yes; then
-	  if test "$module" = yes; then
-	    $ECHO
-	    $ECHO "*** Warning: libtool could not satisfy all declared inter-library"
-	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
-	    $ECHO "*** a static module, that should work as long as the dlopening"
-	    $ECHO "*** application is linked with the -dlopen flag."
-	    if test -z "$global_symbol_pipe"; then
-	      $ECHO
-	      $ECHO "*** However, this would only work if libtool was able to extract symbol"
-	      $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
-	      $ECHO "*** not find such a program.  So, this module is probably useless."
-	      $ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
-	    fi
-	    if test "$build_old_libs" = no; then
-	      oldlibs="$output_objdir/$libname.$libext"
-	      build_libtool_libs=module
-	      build_old_libs=yes
-	    else
-	      build_libtool_libs=no
-	    fi
-	  else
-	    $ECHO "*** The inter-library dependencies that have been dropped here will be"
-	    $ECHO "*** automatically added whenever a program is linked with this library"
-	    $ECHO "*** or is declared to -dlopen it."
-
-	    if test "$allow_undefined" = no; then
-	      $ECHO
-	      $ECHO "*** Since this library must not contain undefined symbols,"
-	      $ECHO "*** because either the platform does not support them or"
-	      $ECHO "*** it was explicitly requested with -no-undefined,"
-	      $ECHO "*** libtool will only create a static version of it."
-	      if test "$build_old_libs" = no; then
-		oldlibs="$output_objdir/$libname.$libext"
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
-	  fi
-	fi
-	# Done checking deplibs!
-	deplibs=$newdeplibs
-      fi
-      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
-      case $host in
-	*-*-darwin*)
-	  newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  ;;
-      esac
-
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $deplibs " in
-	  *" -L$path/$objdir "*)
-	    new_libs="$new_libs -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) new_libs="$new_libs $deplib" ;;
-	  esac
-	  ;;
-	*) new_libs="$new_libs $deplib" ;;
-	esac
-      done
-      deplibs="$new_libs"
-
-      # All the library-specific variables (install_libdir is set above).
-      library_names=
-      old_library=
-      dlname=
-
-      # Test again, we may have decided not to build it any more
-      if test "$build_libtool_libs" = yes; then
-	if test "$hardcode_into_libs" = yes; then
-	  # Hardcode the library paths
-	  hardcode_libdirs=
-	  dep_rpath=
-	  rpath="$finalize_rpath"
-	  test "$mode" != relink && rpath="$compile_rpath$rpath"
-	  for libdir in $rpath; do
-	    if test -n "$hardcode_libdir_flag_spec"; then
-	      if test -n "$hardcode_libdir_separator"; then
-		if test -z "$hardcode_libdirs"; then
-		  hardcode_libdirs="$libdir"
-		else
-		  # Just accumulate the unique libdirs.
-		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		    ;;
-		  *)
-		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		    ;;
-		  esac
-		fi
-	      else
-		eval flag=\"$hardcode_libdir_flag_spec\"
-		dep_rpath="$dep_rpath $flag"
-	      fi
-	    elif test -n "$runpath_var"; then
-	      case "$perm_rpath " in
-	      *" $libdir "*) ;;
-	      *) perm_rpath="$perm_rpath $libdir" ;;
-	      esac
-	    fi
-	  done
-	  # Substitute the hardcoded libdirs into the rpath.
-	  if test -n "$hardcode_libdir_separator" &&
-	     test -n "$hardcode_libdirs"; then
-	    libdir="$hardcode_libdirs"
-	    if test -n "$hardcode_libdir_flag_spec_ld"; then
-	      eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
-	    else
-	      eval dep_rpath=\"$hardcode_libdir_flag_spec\"
-	    fi
-	  fi
-	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
-	    # We should set the runpath_var.
-	    rpath=
-	    for dir in $perm_rpath; do
-	      rpath="$rpath$dir:"
-	    done
-	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
-	  fi
-	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
-	fi
-
-	shlibpath="$finalize_shlibpath"
-	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
-	if test -n "$shlibpath"; then
-	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
-	fi
-
-	# Get the real and link names of the library.
-	eval shared_ext=\"$shrext_cmds\"
-	eval library_names=\"$library_names_spec\"
-	set dummy $library_names
-	shift
-	realname="$1"
-	shift
-
-	if test -n "$soname_spec"; then
-	  eval soname=\"$soname_spec\"
-	else
-	  soname="$realname"
-	fi
-	if test -z "$dlname"; then
-	  dlname=$soname
-	fi
-
-	lib="$output_objdir/$realname"
-	linknames=
-	for link
-	do
-	  linknames="$linknames $link"
-	done
-
-	# Use standard objects if they are pic
-	test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-	test "X$libobjs" = "X " && libobjs=
-
-	delfiles=
-	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
-	  export_symbols="$output_objdir/$libname.uexp"
-	  delfiles="$delfiles $export_symbols"
-	fi
-
-	orig_export_symbols=
-	case $host_os in
-	cygwin* | mingw* | cegcc*)
-	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
-	    # exporting using user supplied symfile
-	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
-	      # and it's NOT already a .def file. Must figure out
-	      # which of the given symbols are data symbols and tag
-	      # them as such. So, trigger use of export_symbols_cmds.
-	      # export_symbols gets reassigned inside the "prepare
-	      # the list of exported symbols" if statement, so the
-	      # include_expsyms logic still works.
-	      orig_export_symbols="$export_symbols"
-	      export_symbols=
-	      always_export_symbols=yes
-	    fi
-	  fi
-	  ;;
-	esac
-
-	# Prepare the list of exported symbols
-	if test -z "$export_symbols"; then
-	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
-	    func_verbose "generating symbol list for \`$libname.la'"
-	    export_symbols="$output_objdir/$libname.exp"
-	    $opt_dry_run || $RM $export_symbols
-	    cmds=$export_symbols_cmds
-	    save_ifs="$IFS"; IFS='~'
-	    for cmd in $cmds; do
-	      IFS="$save_ifs"
-	      eval cmd=\"$cmd\"
-	      func_len " $cmd"
-	      len=$func_len_result
-	      if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-		func_show_eval "$cmd" 'exit $?'
-		skipped_export=false
-	      else
-		# The command line is too long to execute in one step.
-		func_verbose "using reloadable object file for export list..."
-		skipped_export=:
-		# Break out early, otherwise skipped_export may be
-		# set to false by a later but shorter cmd.
-		break
-	      fi
-	    done
-	    IFS="$save_ifs"
-	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
-	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
-	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
-	    fi
-	  fi
-	fi
-
-	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  tmp_export_symbols="$export_symbols"
-	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
-	  $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
-	fi
-
-	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
-	  # The given exports_symbols file has to be filtered, so filter it.
-	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
-	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	  # 's' commands which not all seds can handle. GNU sed should be fine
-	  # though. Also, the filter scales superlinearly with the number of
-	  # global variables. join(1) would be nice here, but unfortunately
-	  # isn't a blessed tool.
-	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
-	  delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
-	  export_symbols=$output_objdir/$libname.def
-	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
-	fi
-
-	tmp_deplibs=
-	for test_deplib in $deplibs; do
-	  case " $convenience " in
-	  *" $test_deplib "*) ;;
-	  *)
-	    tmp_deplibs="$tmp_deplibs $test_deplib"
-	    ;;
-	  esac
-	done
-	deplibs="$tmp_deplibs"
-
-	if test -n "$convenience"; then
-	  if test -n "$whole_archive_flag_spec" &&
-	    test "$compiler_needs_object" = yes &&
-	    test -z "$libobjs"; then
-	    # extract the archives, so we have objects to list.
-	    # TODO: could optimize this to just extract one archive.
-	    whole_archive_flag_spec=
-	  fi
-	  if test -n "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
-	    test "X$libobjs" = "X " && libobjs=
-	  else
-	    gentop="$output_objdir/${outputname}x"
-	    generated="$generated $gentop"
-
-	    func_extract_archives $gentop $convenience
-	    libobjs="$libobjs $func_extract_archives_result"
-	    test "X$libobjs" = "X " && libobjs=
-	  fi
-	fi
-
-	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
-	  eval flag=\"$thread_safe_flag_spec\"
-	  linker_flags="$linker_flags $flag"
-	fi
-
-	# Make a backup of the uninstalled library when relinking
-	if test "$mode" = relink; then
-	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
-	fi
-
-	# Do each of the archive commands.
-	if test "$module" = yes && test -n "$module_cmds" ; then
-	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	    eval test_cmds=\"$module_expsym_cmds\"
-	    cmds=$module_expsym_cmds
-	  else
-	    eval test_cmds=\"$module_cmds\"
-	    cmds=$module_cmds
-	  fi
-	else
-	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	    eval test_cmds=\"$archive_expsym_cmds\"
-	    cmds=$archive_expsym_cmds
-	  else
-	    eval test_cmds=\"$archive_cmds\"
-	    cmds=$archive_cmds
-	  fi
-	fi
-
-	if test "X$skipped_export" != "X:" &&
-	   func_len " $test_cmds" &&
-	   len=$func_len_result &&
-	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  :
-	else
-	  # The command line is too long to link in one step, link piecewise
-	  # or, if using GNU ld and skipped_export is not :, use a linker
-	  # script.
-
-	  # Save the value of $output and $libobjs because we want to
-	  # use them later.  If we have whole_archive_flag_spec, we
-	  # want to use save_libobjs as it was before
-	  # whole_archive_flag_spec was expanded, because we can't
-	  # assume the linker understands whole_archive_flag_spec.
-	  # This may have to be revisited, in case too many
-	  # convenience libraries get linked in and end up exceeding
-	  # the spec.
-	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	  fi
-	  save_output=$output
-	  output_la=`$ECHO "X$output" | $Xsed -e "$basename"`
-
-	  # Clear the reloadable object creation command queue and
-	  # initialize k to one.
-	  test_cmds=
-	  concat_cmds=
-	  objlist=
-	  last_robj=
-	  k=1
-
-	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
-	    output=${output_objdir}/${output_la}.lnkscript
-	    func_verbose "creating GNU ld script: $output"
-	    $ECHO 'INPUT (' > $output
-	    for obj in $save_libobjs
-	    do
-	      $ECHO "$obj" >> $output
-	    done
-	    $ECHO ')' >> $output
-	    delfiles="$delfiles $output"
-	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
-	    output=${output_objdir}/${output_la}.lnk
-	    func_verbose "creating linker input file list: $output"
-	    : > $output
-	    set x $save_libobjs
-	    shift
-	    firstobj=
-	    if test "$compiler_needs_object" = yes; then
-	      firstobj="$1 "
-	      shift
-	    fi
-	    for obj
-	    do
-	      $ECHO "$obj" >> $output
-	    done
-	    delfiles="$delfiles $output"
-	    output=$firstobj\"$file_list_spec$output\"
-	  else
-	    if test -n "$save_libobjs"; then
-	      func_verbose "creating reloadable object files..."
-	      output=$output_objdir/$output_la-${k}.$objext
-	      eval test_cmds=\"$reload_cmds\"
-	      func_len " $test_cmds"
-	      len0=$func_len_result
-	      len=$len0
-
-	      # Loop over the list of objects to be linked.
-	      for obj in $save_libobjs
-	      do
-		func_len " $obj"
-		func_arith $len + $func_len_result
-		len=$func_arith_result
-		if test "X$objlist" = X ||
-		   test "$len" -lt "$max_cmd_len"; then
-		  func_append objlist " $obj"
-		else
-		  # The command $test_cmds is almost too long, add a
-		  # command to the queue.
-		  if test "$k" -eq 1 ; then
-		    # The first file doesn't have a previous command to add.
-		    eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
-		  else
-		    # All subsequent reloadable object files will link in
-		    # the last one created.
-		    eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\"
-		  fi
-		  last_robj=$output_objdir/$output_la-${k}.$objext
-		  func_arith $k + 1
-		  k=$func_arith_result
-		  output=$output_objdir/$output_la-${k}.$objext
-		  objlist=$obj
-		  func_len " $last_robj"
-		  func_arith $len0 + $func_len_result
-		  len=$func_arith_result
-		fi
-	      done
-	      # Handle the remaining objects by creating one last
-	      # reloadable object file.  All subsequent reloadable object
-	      # files will link in the last one created.
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
-	      if test -n "$last_robj"; then
-	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
-	      fi
-	      delfiles="$delfiles $output"
-
-	    else
-	      output=
-	    fi
-
-	    if ${skipped_export-false}; then
-	      func_verbose "generating symbol list for \`$libname.la'"
-	      export_symbols="$output_objdir/$libname.exp"
-	      $opt_dry_run || $RM $export_symbols
-	      libobjs=$output
-	      # Append the command to create the export file.
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
-	      if test -n "$last_robj"; then
-		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
-	      fi
-	    fi
-
-	    test -n "$save_libobjs" &&
-	      func_verbose "creating a temporary reloadable object file: $output"
-
-	    # Loop through the commands generated above and execute them.
-	    save_ifs="$IFS"; IFS='~'
-	    for cmd in $concat_cmds; do
-	      IFS="$save_ifs"
-	      $opt_silent || {
-		  func_quote_for_expand "$cmd"
-		  eval "func_echo $func_quote_for_expand_result"
-	      }
-	      $opt_dry_run || eval "$cmd" || {
-		lt_exit=$?
-
-		# Restore the uninstalled library and exit
-		if test "$mode" = relink; then
-		  ( cd "$output_objdir" && \
-		    $RM "${realname}T" && \
-		    $MV "${realname}U" "$realname" )
-		fi
-
-		exit $lt_exit
-	      }
-	    done
-	    IFS="$save_ifs"
-
-	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
-	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
-	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
-	    fi
-	  fi
-
-          if ${skipped_export-false}; then
-	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	      tmp_export_symbols="$export_symbols"
-	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
-	      $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
-	    fi
-
-	    if test -n "$orig_export_symbols"; then
-	      # The given exports_symbols file has to be filtered, so filter it.
-	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
-	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	      # 's' commands which not all seds can handle. GNU sed should be fine
-	      # though. Also, the filter scales superlinearly with the number of
-	      # global variables. join(1) would be nice here, but unfortunately
-	      # isn't a blessed tool.
-	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
-	      delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
-	      export_symbols=$output_objdir/$libname.def
-	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
-	    fi
-	  fi
-
-	  libobjs=$output
-	  # Restore the value of output.
-	  output=$save_output
-
-	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
-	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
-	    test "X$libobjs" = "X " && libobjs=
-	  fi
-	  # Expand the library linking commands again to reset the
-	  # value of $libobjs for piecewise linking.
-
-	  # Do each of the archive commands.
-	  if test "$module" = yes && test -n "$module_cmds" ; then
-	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	      cmds=$module_expsym_cmds
-	    else
-	      cmds=$module_cmds
-	    fi
-	  else
-	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	      cmds=$archive_expsym_cmds
-	    else
-	      cmds=$archive_cmds
-	    fi
-	  fi
-	fi
-
-	if test -n "$delfiles"; then
-	  # Append the command to remove temporary files to $cmds.
-	  eval cmds=\"\$cmds~\$RM $delfiles\"
-	fi
-
-	# Add any objects from preloaded convenience libraries
-	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
-	  generated="$generated $gentop"
-
-	  func_extract_archives $gentop $dlprefiles
-	  libobjs="$libobjs $func_extract_archives_result"
-	  test "X$libobjs" = "X " && libobjs=
-	fi
-
-	save_ifs="$IFS"; IFS='~'
-	for cmd in $cmds; do
-	  IFS="$save_ifs"
-	  eval cmd=\"$cmd\"
-	  $opt_silent || {
-	    func_quote_for_expand "$cmd"
-	    eval "func_echo $func_quote_for_expand_result"
-	  }
-	  $opt_dry_run || eval "$cmd" || {
-	    lt_exit=$?
-
-	    # Restore the uninstalled library and exit
-	    if test "$mode" = relink; then
-	      ( cd "$output_objdir" && \
-	        $RM "${realname}T" && \
-		$MV "${realname}U" "$realname" )
-	    fi
-
-	    exit $lt_exit
-	  }
-	done
-	IFS="$save_ifs"
-
-	# Restore the uninstalled library and exit
-	if test "$mode" = relink; then
-	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
-
-	  if test -n "$convenience"; then
-	    if test -z "$whole_archive_flag_spec"; then
-	      func_show_eval '${RM}r "$gentop"'
-	    fi
-	  fi
-
-	  exit $EXIT_SUCCESS
-	fi
-
-	# Create links to the real library.
-	for linkname in $linknames; do
-	  if test "$realname" != "$linkname"; then
-	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
-	  fi
-	done
-
-	# If -module or -export-dynamic was specified, set the dlname.
-	if test "$module" = yes || test "$export_dynamic" = yes; then
-	  # On all known operating systems, these are identical.
-	  dlname="$soname"
-	fi
-      fi
-      ;;
-
-    obj)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for objects"
-      fi
-
-      case " $deplibs" in
-      *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for objects" ;;
-      esac
-
-      test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for objects"
-
-      test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for objects"
-
-      test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for objects"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for objects"
-
-      case $output in
-      *.lo)
-	test -n "$objs$old_deplibs" && \
-	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
-
-	libobj=$output
-	func_lo2o "$libobj"
-	obj=$func_lo2o_result
-	;;
-      *)
-	libobj=
-	obj="$output"
-	;;
-      esac
-
-      # Delete the old objects.
-      $opt_dry_run || $RM $obj $libobj
-
-      # Objects from convenience libraries.  This assumes
-      # single-version convenience libraries.  Whenever we create
-      # different ones for PIC/non-PIC, this we'll have to duplicate
-      # the extraction.
-      reload_conv_objs=
-      gentop=
-      # reload_cmds runs $LD directly, so let us get rid of
-      # -Wl from whole_archive_flag_spec and hope we can get by with
-      # turning comma into space..
-      wl=
-
-      if test -n "$convenience"; then
-	if test -n "$whole_archive_flag_spec"; then
-	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
-	  reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'`
-	else
-	  gentop="$output_objdir/${obj}x"
-	  generated="$generated $gentop"
-
-	  func_extract_archives $gentop $convenience
-	  reload_conv_objs="$reload_objs $func_extract_archives_result"
-	fi
-      fi
-
-      # Create the old-style object.
-      reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
-
-      output="$obj"
-      func_execute_cmds "$reload_cmds" 'exit $?'
-
-      # Exit if we aren't doing a library object file.
-      if test -z "$libobj"; then
-	if test -n "$gentop"; then
-	  func_show_eval '${RM}r "$gentop"'
-	fi
-
-	exit $EXIT_SUCCESS
-      fi
-
-      if test "$build_libtool_libs" != yes; then
-	if test -n "$gentop"; then
-	  func_show_eval '${RM}r "$gentop"'
-	fi
-
-	# Create an invalid libtool object if no PIC, so that we don't
-	# accidentally link it into a program.
-	# $show "echo timestamp > $libobj"
-	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
-	exit $EXIT_SUCCESS
-      fi
-
-      if test -n "$pic_flag" || test "$pic_mode" != default; then
-	# Only do commands if we really have different PIC objects.
-	reload_objs="$libobjs $reload_conv_objs"
-	output="$libobj"
-	func_execute_cmds "$reload_cmds" 'exit $?'
-      fi
-
-      if test -n "$gentop"; then
-	func_show_eval '${RM}r "$gentop"'
-      fi
-
-      exit $EXIT_SUCCESS
-      ;;
-
-    prog)
-      case $host in
-	*cygwin*) func_stripname '' '.exe' "$output"
-	          output=$func_stripname_result.exe;;
-      esac
-      test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for programs"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for programs"
-
-      test "$preload" = yes \
-        && test "$dlopen_support" = unknown \
-	&& test "$dlopen_self" = unknown \
-	&& test "$dlopen_self_static" = unknown && \
-	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
-
-      case $host in
-      *-*-rhapsody* | *-*-darwin1.[012])
-	# On Rhapsody replace the C library is the System framework
-	compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
-	finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
-	;;
-      esac
-
-      case $host in
-      *-*-darwin*)
-	# Don't allow lazy linking, it breaks C++ global constructors
-	# But is supposedly fixed on 10.4 or later (yay!).
-	if test "$tagname" = CXX ; then
-	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
-	    10.[0123])
-	      compile_command="$compile_command ${wl}-bind_at_load"
-	      finalize_command="$finalize_command ${wl}-bind_at_load"
-	    ;;
-	  esac
-	fi
-	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
-	compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-	finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-	;;
-      esac
-
-
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $compile_deplibs " in
-	  *" -L$path/$objdir "*)
-	    new_libs="$new_libs -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $compile_deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) new_libs="$new_libs $deplib" ;;
-	  esac
-	  ;;
-	*) new_libs="$new_libs $deplib" ;;
-	esac
-      done
-      compile_deplibs="$new_libs"
-
-
-      compile_command="$compile_command $compile_deplibs"
-      finalize_command="$finalize_command $finalize_deplibs"
-
-      if test -n "$rpath$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	for libdir in $rpath $xrpath; do
-	  # This is the magic to use -rpath.
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_rpath="$finalize_rpath $libdir" ;;
-	  esac
-	done
-      fi
-
-      # Now hardcode the library paths
-      rpath=
-      hardcode_libdirs=
-      for libdir in $compile_rpath $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval flag=\"$hardcode_libdir_flag_spec\"
-	    rpath="$rpath $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) perm_rpath="$perm_rpath $libdir" ;;
-	  esac
-	fi
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$libdir:"*) ;;
-	  ::) dllsearchpath=$libdir;;
-	  *) dllsearchpath="$dllsearchpath:$libdir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  ::) dllsearchpath=$testbindir;;
-	  *) dllsearchpath="$dllsearchpath:$testbindir";;
-	  esac
-	  ;;
-	esac
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval rpath=\" $hardcode_libdir_flag_spec\"
-      fi
-      compile_rpath="$rpath"
-
-      rpath=
-      hardcode_libdirs=
-      for libdir in $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval flag=\"$hardcode_libdir_flag_spec\"
-	    rpath="$rpath $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$finalize_perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
-	  esac
-	fi
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval rpath=\" $hardcode_libdir_flag_spec\"
-      fi
-      finalize_rpath="$rpath"
-
-      if test -n "$libobjs" && test "$build_old_libs" = yes; then
-	# Transform all the library objects into standard objects.
-	compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-	finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-      fi
-
-      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
-
-      # template prelinking step
-      if test -n "$prelink_cmds"; then
-	func_execute_cmds "$prelink_cmds" 'exit $?'
-      fi
-
-      wrappers_required=yes
-      case $host in
-      *cygwin* | *mingw* )
-        if test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
-        ;;
-      *cegcc)
-        # Disable wrappers for cegcc, we are cross compiling anyway.
-        wrappers_required=no
-        ;;
-      *)
-        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
-        ;;
-      esac
-      if test "$wrappers_required" = no; then
-	# Replace the output file specification.
-	compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
-	link_command="$compile_command$compile_rpath"
-
-	# We have no uninstalled library dependencies, so finalize right now.
-	exit_status=0
-	func_show_eval "$link_command" 'exit_status=$?'
-
-	# Delete the generated files.
-	if test -f "$output_objdir/${outputname}S.${objext}"; then
-	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
-	fi
-
-	exit $exit_status
-      fi
-
-      if test -n "$compile_shlibpath$finalize_shlibpath"; then
-	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
-      fi
-      if test -n "$finalize_shlibpath"; then
-	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
-      fi
-
-      compile_var=
-      finalize_var=
-      if test -n "$runpath_var"; then
-	if test -n "$perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $perm_rpath; do
-	    rpath="$rpath$dir:"
-	  done
-	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-	if test -n "$finalize_perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $finalize_perm_rpath; do
-	    rpath="$rpath$dir:"
-	  done
-	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-      fi
-
-      if test "$no_install" = yes; then
-	# We don't need to create a wrapper script.
-	link_command="$compile_var$compile_command$compile_rpath"
-	# Replace the output file specification.
-	link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
-	# Delete the old output file.
-	$opt_dry_run || $RM $output
-	# Link the executable and exit
-	func_show_eval "$link_command" 'exit $?'
-	exit $EXIT_SUCCESS
-      fi
-
-      if test "$hardcode_action" = relink; then
-	# Fast installation is not supported
-	link_command="$compile_var$compile_command$compile_rpath"
-	relink_command="$finalize_var$finalize_command$finalize_rpath"
-
-	func_warning "this platform does not like uninstalled shared libraries"
-	func_warning "\`$output' will be relinked during installation"
-      else
-	if test "$fast_install" != no; then
-	  link_command="$finalize_var$compile_command$finalize_rpath"
-	  if test "$fast_install" = yes; then
-	    relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
-	  else
-	    # fast_install is set to needless
-	    relink_command=
-	  fi
-	else
-	  link_command="$compile_var$compile_command$compile_rpath"
-	  relink_command="$finalize_var$finalize_command$finalize_rpath"
-	fi
-      fi
-
-      # Replace the output file specification.
-      link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
-
-      # Delete the old output files.
-      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
-
-      func_show_eval "$link_command" 'exit $?'
-
-      # Now create the wrapper script.
-      func_verbose "creating $output"
-
-      # Quote the relink command for shipping.
-      if test -n "$relink_command"; then
-	# Preserve any variables that may affect compiler behavior
-	for var in $variables_saved_for_relink; do
-	  if eval test -z \"\${$var+set}\"; then
-	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
-	  elif eval var_value=\$$var; test -z "$var_value"; then
-	    relink_command="$var=; export $var; $relink_command"
-	  else
-	    func_quote_for_eval "$var_value"
-	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
-	  fi
-	done
-	relink_command="(cd `pwd`; $relink_command)"
-	relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
-      fi
-
-      # Quote $ECHO for shipping.
-      if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then
-	case $progpath in
-	[\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
-	*) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
-	esac
-	qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"`
-      else
-	qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"`
-      fi
-
-      # Only actually do things if not in dry run mode.
-      $opt_dry_run || {
-	# win32 will think the script is a binary if it has
-	# a .exe suffix, so we strip it off here.
-	case $output in
-	  *.exe) func_stripname '' '.exe' "$output"
-	         output=$func_stripname_result ;;
-	esac
-	# test for cygwin because mv fails w/o .exe extensions
-	case $host in
-	  *cygwin*)
-	    exeext=.exe
-	    func_stripname '' '.exe' "$outputname"
-	    outputname=$func_stripname_result ;;
-	  *) exeext= ;;
-	esac
-	case $host in
-	  *cygwin* | *mingw* )
-	    func_dirname_and_basename "$output" "" "."
-	    output_name=$func_basename_result
-	    output_path=$func_dirname_result
-	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
-	    cwrapper="$output_path/$output_name.exe"
-	    $RM $cwrappersource $cwrapper
-	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
-
-	    func_emit_cwrapperexe_src > $cwrappersource
-
-	    # The wrapper executable is built using the $host compiler,
-	    # because it contains $host paths and files. If cross-
-	    # compiling, it, like the target executable, must be
-	    # executed on the $host or under an emulation environment.
-	    $opt_dry_run || {
-	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
-	      $STRIP $cwrapper
-	    }
-
-	    # Now, create the wrapper script for func_source use:
-	    func_ltwrapper_scriptname $cwrapper
-	    $RM $func_ltwrapper_scriptname_result
-	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
-	    $opt_dry_run || {
-	      # note: this script will not be executed, so do not chmod.
-	      if test "x$build" = "x$host" ; then
-		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
-	      else
-		func_emit_wrapper no > $func_ltwrapper_scriptname_result
-	      fi
-	    }
-	  ;;
-	  * )
-	    $RM $output
-	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
-
-	    func_emit_wrapper no > $output
-	    chmod +x $output
-	  ;;
-	esac
-      }
-      exit $EXIT_SUCCESS
-      ;;
-    esac
-
-    # See if we need to build an old-fashioned archive.
-    for oldlib in $oldlibs; do
-
-      if test "$build_libtool_libs" = convenience; then
-	oldobjs="$libobjs_save $symfileobj"
-	addlibs="$convenience"
-	build_libtool_libs=no
-      else
-	if test "$build_libtool_libs" = module; then
-	  oldobjs="$libobjs_save"
-	  build_libtool_libs=no
-	else
-	  oldobjs="$old_deplibs $non_pic_objects"
-	  if test "$preload" = yes && test -f "$symfileobj"; then
-	    oldobjs="$oldobjs $symfileobj"
-	  fi
-	fi
-	addlibs="$old_convenience"
-      fi
-
-      if test -n "$addlibs"; then
-	gentop="$output_objdir/${outputname}x"
-	generated="$generated $gentop"
-
-	func_extract_archives $gentop $addlibs
-	oldobjs="$oldobjs $func_extract_archives_result"
-      fi
-
-      # Do each command in the archive commands.
-      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
-	cmds=$old_archive_from_new_cmds
-      else
-
-	# Add any objects from preloaded convenience libraries
-	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
-	  generated="$generated $gentop"
-
-	  func_extract_archives $gentop $dlprefiles
-	  oldobjs="$oldobjs $func_extract_archives_result"
-	fi
-
-	# POSIX demands no paths to be encoded in archives.  We have
-	# to avoid creating archives with duplicate basenames if we
-	# might have to extract them afterwards, e.g., when creating a
-	# static archive out of a convenience library, or when linking
-	# the entirety of a libtool archive into another (currently
-	# not supported by libtool).
-	if (for obj in $oldobjs
-	    do
-	      func_basename "$obj"
-	      $ECHO "$func_basename_result"
-	    done | sort | sort -uc >/dev/null 2>&1); then
-	  :
-	else
-	  $ECHO "copying selected object files to avoid basename conflicts..."
-	  gentop="$output_objdir/${outputname}x"
-	  generated="$generated $gentop"
-	  func_mkdir_p "$gentop"
-	  save_oldobjs=$oldobjs
-	  oldobjs=
-	  counter=1
-	  for obj in $save_oldobjs
-	  do
-	    func_basename "$obj"
-	    objbase="$func_basename_result"
-	    case " $oldobjs " in
-	    " ") oldobjs=$obj ;;
-	    *[\ /]"$objbase "*)
-	      while :; do
-		# Make sure we don't pick an alternate name that also
-		# overlaps.
-		newobj=lt$counter-$objbase
-		func_arith $counter + 1
-		counter=$func_arith_result
-		case " $oldobjs " in
-		*[\ /]"$newobj "*) ;;
-		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
-		esac
-	      done
-	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
-	      oldobjs="$oldobjs $gentop/$newobj"
-	      ;;
-	    *) oldobjs="$oldobjs $obj" ;;
-	    esac
-	  done
-	fi
-	eval cmds=\"$old_archive_cmds\"
-
-	func_len " $cmds"
-	len=$func_len_result
-	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  cmds=$old_archive_cmds
-	else
-	  # the command line is too long to link in one step, link in parts
-	  func_verbose "using piecewise archive linking..."
-	  save_RANLIB=$RANLIB
-	  RANLIB=:
-	  objlist=
-	  concat_cmds=
-	  save_oldobjs=$oldobjs
-	  oldobjs=
-	  # Is there a better way of finding the last object in the list?
-	  for obj in $save_oldobjs
-	  do
-	    last_oldobj=$obj
-	  done
-	  eval test_cmds=\"$old_archive_cmds\"
-	  func_len " $test_cmds"
-	  len0=$func_len_result
-	  len=$len0
-	  for obj in $save_oldobjs
-	  do
-	    func_len " $obj"
-	    func_arith $len + $func_len_result
-	    len=$func_arith_result
-	    func_append objlist " $obj"
-	    if test "$len" -lt "$max_cmd_len"; then
-	      :
-	    else
-	      # the above command should be used before it gets too long
-	      oldobjs=$objlist
-	      if test "$obj" = "$last_oldobj" ; then
-		RANLIB=$save_RANLIB
-	      fi
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
-	      objlist=
-	      len=$len0
-	    fi
-	  done
-	  RANLIB=$save_RANLIB
-	  oldobjs=$objlist
-	  if test "X$oldobjs" = "X" ; then
-	    eval cmds=\"\$concat_cmds\"
-	  else
-	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
-	  fi
-	fi
-      fi
-      func_execute_cmds "$cmds" 'exit $?'
-    done
-
-    test -n "$generated" && \
-      func_show_eval "${RM}r$generated"
-
-    # Now create the libtool archive.
-    case $output in
-    *.la)
-      old_library=
-      test "$build_old_libs" = yes && old_library="$libname.$libext"
-      func_verbose "creating $output"
-
-      # Preserve any variables that may affect compiler behavior
-      for var in $variables_saved_for_relink; do
-	if eval test -z \"\${$var+set}\"; then
-	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
-	elif eval var_value=\$$var; test -z "$var_value"; then
-	  relink_command="$var=; export $var; $relink_command"
-	else
-	  func_quote_for_eval "$var_value"
-	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
-	fi
-      done
-      # Quote the link command for shipping.
-      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
-      relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
-      if test "$hardcode_automatic" = yes ; then
-	relink_command=
-      fi
-
-      # Only create the output if not a dry run.
-      $opt_dry_run || {
-	for installed in no yes; do
-	  if test "$installed" = yes; then
-	    if test -z "$install_libdir"; then
-	      break
-	    fi
-	    output="$output_objdir/$outputname"i
-	    # Replace all uninstalled libtool libraries with the installed ones
-	    newdependency_libs=
-	    for deplib in $dependency_libs; do
-	      case $deplib in
-	      *.la)
-		func_basename "$deplib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$deplib' is not a valid libtool archive"
-		newdependency_libs="$newdependency_libs $libdir/$name"
-		;;
-	      *) newdependency_libs="$newdependency_libs $deplib" ;;
-	      esac
-	    done
-	    dependency_libs="$newdependency_libs"
-	    newdlfiles=
-
-	    for lib in $dlfiles; do
-	      case $lib in
-	      *.la)
-	        func_basename "$lib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
-		newdlfiles="$newdlfiles $libdir/$name"
-		;;
-	      *) newdlfiles="$newdlfiles $lib" ;;
-	      esac
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      case $lib in
-	      *.la)
-		# Only pass preopened files to the pseudo-archive (for
-		# eventual linking with the app. that links it) if we
-		# didn't already link the preopened objects directly into
-		# the library:
-		func_basename "$lib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
-		newdlprefiles="$newdlprefiles $libdir/$name"
-		;;
-	      esac
-	    done
-	    dlprefiles="$newdlprefiles"
-	  else
-	    newdlfiles=
-	    for lib in $dlfiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      newdlfiles="$newdlfiles $abs"
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      newdlprefiles="$newdlprefiles $abs"
-	    done
-	    dlprefiles="$newdlprefiles"
-	  fi
-	  $RM $output
-	  # place dlname in correct position for cygwin
-	  tdlname=$dlname
-	  case $host,$output,$installed,$module,$dlname in
-	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
-	  esac
-	  $ECHO > $output "\
-# $outputname - a libtool library file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# The name that we can dlopen(3).
-dlname='$tdlname'
-
-# Names of this library.
-library_names='$library_names'
-
-# The name of the static archive.
-old_library='$old_library'
-
-# Linker flags that can not go in dependency_libs.
-inherited_linker_flags='$new_inherited_linker_flags'
-
-# Libraries that this one depends upon.
-dependency_libs='$dependency_libs'
-
-# Names of additional weak libraries provided by this library
-weak_library_names='$weak_libs'
-
-# Version information for $libname.
-current=$current
-age=$age
-revision=$revision
-
-# Is this an already installed library?
-installed=$installed
-
-# Should we warn about portability when linking against -modules?
-shouldnotlink=$module
-
-# Files to dlopen/dlpreopen
-dlopen='$dlfiles'
-dlpreopen='$dlprefiles'
-
-# Directory that this library needs to be installed in:
-libdir='$install_libdir'"
-	  if test "$installed" = no && test "$need_relink" = yes; then
-	    $ECHO >> $output "\
-relink_command=\"$relink_command\""
-	  fi
-	done
-      }
-
-      # Do a symbolic link so that the libtool archive can be found in
-      # LD_LIBRARY_PATH before the program is installed.
-      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
-      ;;
-    esac
-    exit $EXIT_SUCCESS
-}
-
-{ test "$mode" = link || test "$mode" = relink; } &&
-    func_mode_link ${1+"$@"}
-
-
-# func_mode_uninstall arg...
-func_mode_uninstall ()
-{
-    $opt_debug
-    RM="$nonopt"
-    files=
-    rmforce=
-    exit_status=0
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    for arg
-    do
-      case $arg in
-      -f) RM="$RM $arg"; rmforce=yes ;;
-      -*) RM="$RM $arg" ;;
-      *) files="$files $arg" ;;
-      esac
-    done
-
-    test -z "$RM" && \
-      func_fatal_help "you must specify an RM program"
-
-    rmdirs=
-
-    origobjdir="$objdir"
-    for file in $files; do
-      func_dirname "$file" "" "."
-      dir="$func_dirname_result"
-      if test "X$dir" = X.; then
-	objdir="$origobjdir"
-      else
-	objdir="$dir/$origobjdir"
-      fi
-      func_basename "$file"
-      name="$func_basename_result"
-      test "$mode" = uninstall && objdir="$dir"
-
-      # Remember objdir for removal later, being careful to avoid duplicates
-      if test "$mode" = clean; then
-	case " $rmdirs " in
-	  *" $objdir "*) ;;
-	  *) rmdirs="$rmdirs $objdir" ;;
-	esac
-      fi
-
-      # Don't error if the file doesn't exist and rm -f was used.
-      if { test -L "$file"; } >/dev/null 2>&1 ||
-	 { test -h "$file"; } >/dev/null 2>&1 ||
-	 test -f "$file"; then
-	:
-      elif test -d "$file"; then
-	exit_status=1
-	continue
-      elif test "$rmforce" = yes; then
-	continue
-      fi
-
-      rmfiles="$file"
-
-      case $name in
-      *.la)
-	# Possibly a libtool archive, so verify it.
-	if func_lalib_p "$file"; then
-	  func_source $dir/$name
-
-	  # Delete the libtool libraries and symlinks.
-	  for n in $library_names; do
-	    rmfiles="$rmfiles $objdir/$n"
-	  done
-	  test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
-
-	  case "$mode" in
-	  clean)
-	    case "  $library_names " in
-	    # "  " in the beginning catches empty $dlname
-	    *" $dlname "*) ;;
-	    *) rmfiles="$rmfiles $objdir/$dlname" ;;
-	    esac
-	    test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
-	    ;;
-	  uninstall)
-	    if test -n "$library_names"; then
-	      # Do each command in the postuninstall commands.
-	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
-	    fi
-
-	    if test -n "$old_library"; then
-	      # Do each command in the old_postuninstall commands.
-	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
-	    fi
-	    # FIXME: should reinstall the best remaining shared library.
-	    ;;
-	  esac
-	fi
-	;;
-
-      *.lo)
-	# Possibly a libtool object, so verify it.
-	if func_lalib_p "$file"; then
-
-	  # Read the .lo file
-	  func_source $dir/$name
-
-	  # Add PIC object to the list of files to remove.
-	  if test -n "$pic_object" &&
-	     test "$pic_object" != none; then
-	    rmfiles="$rmfiles $dir/$pic_object"
-	  fi
-
-	  # Add non-PIC object to the list of files to remove.
-	  if test -n "$non_pic_object" &&
-	     test "$non_pic_object" != none; then
-	    rmfiles="$rmfiles $dir/$non_pic_object"
-	  fi
-	fi
-	;;
-
-      *)
-	if test "$mode" = clean ; then
-	  noexename=$name
-	  case $file in
-	  *.exe)
-	    func_stripname '' '.exe' "$file"
-	    file=$func_stripname_result
-	    func_stripname '' '.exe' "$name"
-	    noexename=$func_stripname_result
-	    # $file with .exe has already been added to rmfiles,
-	    # add $file without .exe
-	    rmfiles="$rmfiles $file"
-	    ;;
-	  esac
-	  # Do a test to see if this is a libtool program.
-	  if func_ltwrapper_p "$file"; then
-	    if func_ltwrapper_executable_p "$file"; then
-	      func_ltwrapper_scriptname "$file"
-	      relink_command=
-	      func_source $func_ltwrapper_scriptname_result
-	      rmfiles="$rmfiles $func_ltwrapper_scriptname_result"
-	    else
-	      relink_command=
-	      func_source $dir/$noexename
-	    fi
-
-	    # note $name still contains .exe if it was in $file originally
-	    # as does the version of $file that was added into $rmfiles
-	    rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
-	    if test "$fast_install" = yes && test -n "$relink_command"; then
-	      rmfiles="$rmfiles $objdir/lt-$name"
-	    fi
-	    if test "X$noexename" != "X$name" ; then
-	      rmfiles="$rmfiles $objdir/lt-${noexename}.c"
-	    fi
-	  fi
-	fi
-	;;
-      esac
-      func_show_eval "$RM $rmfiles" 'exit_status=1'
-    done
-    objdir="$origobjdir"
-
-    # Try to remove the ${objdir}s in the directories where we deleted files
-    for dir in $rmdirs; do
-      if test -d "$dir"; then
-	func_show_eval "rmdir $dir >/dev/null 2>&1"
-      fi
-    done
-
-    exit $exit_status
-}
-
-{ test "$mode" = uninstall || test "$mode" = clean; } &&
-    func_mode_uninstall ${1+"$@"}
-
-test -z "$mode" && {
-  help="$generic_help"
-  func_fatal_help "you must specify a MODE"
-}
-
-test -z "$exec_cmd" && \
-  func_fatal_help "invalid operation mode \`$mode'"
-
-if test -n "$exec_cmd"; then
-  eval exec "$exec_cmd"
-  exit $EXIT_FAILURE
-fi
-
-exit $exit_status
-
-
-# The TAGs below are defined such that we never get into a situation
-# in which we disable both kinds of libraries.  Given conflicting
-# choices, we go for a static library, that is the most portable,
-# since we can't tell whether shared libraries were disabled because
-# the user asked for that or because the platform doesn't support
-# them.  This is particularly important on AIX, because we don't
-# support having both static and shared libraries enabled at the same
-# time on that platform, so we default to a shared-only configuration.
-# If a disable-shared tag is given, we'll fallback to a static-only
-# configuration.  But we'll never go from static-only to shared-only.
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
-build_libtool_libs=no
-build_old_libs=yes
-# ### END LIBTOOL TAG CONFIG: disable-shared
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-static
-build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
-# ### END LIBTOOL TAG CONFIG: disable-static
-
-# Local Variables:
-# mode:shell-script
-# sh-indentation:2
-# End:
-# vi:sw=2
-
diff --git a/cloog-0.17.0/isl/m4/ax_c___attribute__.m4 b/cloog-0.17.0/isl/m4/ax_c___attribute__.m4
deleted file mode 100644
index cf3d62b..0000000
--- a/cloog-0.17.0/isl/m4/ax_c___attribute__.m4
+++ /dev/null
@@ -1,66 +0,0 @@
-# ===========================================================================
-#    http://www.gnu.org/software/autoconf-archive/ax_c___attribute__.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_C___ATTRIBUTE__
-#
-# DESCRIPTION
-#
-#   Provides a test for the compiler support of __attribute__ extensions.
-#   Defines HAVE___ATTRIBUTE__ if it is found.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Stepan Kasal <skasal@redhat.com>
-#   Copyright (c) 2008 Christian Haggstrom
-#   Copyright (c) 2008 Ryan McCabe <ryan@numb.org>
-#
-#   This program is free software; you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation; either version 2 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-#serial 8
-
-AC_DEFUN([AX_C___ATTRIBUTE__], [
-  AC_CACHE_CHECK([for __attribute__], [ax_cv___attribute__],
-    [AC_COMPILE_IFELSE(
-      [AC_LANG_PROGRAM(
-	[[#include <stdlib.h>
-	  static void foo(void) __attribute__ ((unused));
-	  static void
-	  foo(void) {
-	      exit(1);
-	  }
-        ]], [])],
-      [ax_cv___attribute__=yes],
-      [ax_cv___attribute__=no]
-    )
-  ])
-  if test "$ax_cv___attribute__" = "yes"; then
-    AC_DEFINE([HAVE___ATTRIBUTE__], 1, [define if your compiler has __attribute__])
-  fi
-])
diff --git a/cloog-0.17.0/isl/m4/ax_cc_maxopt.m4 b/cloog-0.17.0/isl/m4/ax_cc_maxopt.m4
deleted file mode 100644
index 92d522d..0000000
--- a/cloog-0.17.0/isl/m4/ax_cc_maxopt.m4
+++ /dev/null
@@ -1,188 +0,0 @@
-# ===========================================================================
-#          http://www.nongnu.org/autoconf-archive/ax_cc_maxopt.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_CC_MAXOPT
-#
-# DESCRIPTION
-#
-#   Try to turn on "good" C optimization flags for various compilers and
-#   architectures, for some definition of "good". (In our case, good for
-#   FFTW and hopefully for other scientific codes. Modify as needed.)
-#
-#   The user can override the flags by setting the CFLAGS environment
-#   variable. The user can also specify --enable-portable-binary in order to
-#   disable any optimization flags that might result in a binary that only
-#   runs on the host architecture.
-#
-#   Note also that the flags assume that ANSI C aliasing rules are followed
-#   by the code (e.g. for gcc's -fstrict-aliasing), and that floating-point
-#   computations can be re-ordered as needed.
-#
-#   Requires macros: AX_CHECK_COMPILER_FLAGS, AX_COMPILER_VENDOR,
-#   AX_GCC_ARCHFLAG, AX_GCC_X86_CPUID.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
-#   Copyright (c) 2008 Matteo Frigo
-#
-#   This program is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation, either version 3 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_CC_MAXOPT],
-[
-AC_REQUIRE([AC_PROG_CC])
-AC_REQUIRE([AX_COMPILER_VENDOR])
-AC_REQUIRE([AC_CANONICAL_HOST])
-
-AC_ARG_ENABLE(portable-binary, [AC_HELP_STRING([--enable-portable-binary], [disable compiler optimizations that would produce unportable binaries])],
-	acx_maxopt_portable=$withval, acx_maxopt_portable=no)
-
-# Try to determine "good" native compiler flags if none specified via CFLAGS
-if test "$ac_test_CFLAGS" != "set"; then
-  CFLAGS=""
-  case $ax_cv_c_compiler_vendor in
-    dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host"
-	 if test "x$acx_maxopt_portable" = xno; then
-           CFLAGS="$CFLAGS -arch host"
-         fi;;
-
-    sun) CFLAGS="-native -fast -xO5 -dalign"
-	 if test "x$acx_maxopt_portable" = xyes; then
-	   CFLAGS="$CFLAGS -xarch=generic"
-         fi;;
-
-    hp)  CFLAGS="+Oall +Optrs_ansi +DSnative"
-	 if test "x$acx_maxopt_portable" = xyes; then
-	   CFLAGS="$CFLAGS +DAportable"
-	 fi;;
-
-    ibm) if test "x$acx_maxopt_portable" = xno; then
-           xlc_opt="-qarch=auto -qtune=auto"
-	 else
-           xlc_opt="-qtune=auto"
-	 fi
-         AX_CHECK_COMPILER_FLAGS($xlc_opt,
-         	CFLAGS="-O3 -qansialias -w $xlc_opt",
-               [CFLAGS="-O3 -qansialias -w"
-                echo "******************************************************"
-                echo "*  You seem to have the IBM  C compiler.  It is      *"
-                echo "*  recommended for best performance that you use:    *"
-                echo "*                                                    *"
-                echo "*    CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *"
-                echo "*                      ^^^        ^^^                *"
-                echo "*  where xxx is pwr2, pwr3, 604, or whatever kind of *"
-                echo "*  CPU you have.  (Set the CFLAGS environment var.   *"
-                echo "*  and re-run configure.)  For more info, man cc.    *"
-                echo "******************************************************"])
-         ;;
-
-    intel) CFLAGS="-O3 -ansi_alias"
-	if test "x$acx_maxopt_portable" = xno; then
-	  icc_archflag=unknown
-	  icc_flags=""
-	  case $host_cpu in
-	    i686*|x86_64*)
-              # icc accepts gcc assembly syntax, so these should work:
-	      AX_GCC_X86_CPUID(0)
-              AX_GCC_X86_CPUID(1)
-	      case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG
-                *:756e6547:*:*) # Intel
-                  case $ax_cv_gcc_x86_cpuid_1 in
-                    *6a?:*[[234]]:*:*|*6[[789b]]?:*:*:*) icc_flags="-xK";;
-                    *f3[[347]]:*:*:*|*f4[1347]:*:*:*) icc_flags="-xP -xN -xW -xK";;
-                    *f??:*:*:*) icc_flags="-xN -xW -xK";;
-                  esac ;;
-              esac ;;
-          esac
-          if test "x$icc_flags" != x; then
-            for flag in $icc_flags; do
-              AX_CHECK_COMPILER_FLAGS($flag, [icc_archflag=$flag; break])
-            done
-          fi
-          AC_MSG_CHECKING([for icc architecture flag])
-	  AC_MSG_RESULT($icc_archflag)
-          if test "x$icc_archflag" != xunknown; then
-            CFLAGS="$CFLAGS $icc_archflag"
-          fi
-        fi
-	;;
-
-    gnu)
-     # default optimization flags for gcc on all systems
-     CFLAGS="-O3 -fomit-frame-pointer"
-
-     # -malign-double for x86 systems
-     AX_CHECK_COMPILER_FLAGS(-malign-double, CFLAGS="$CFLAGS -malign-double")
-
-     #  -fstrict-aliasing for gcc-2.95+
-     AX_CHECK_COMPILER_FLAGS(-fstrict-aliasing,
-	CFLAGS="$CFLAGS -fstrict-aliasing")
-
-     # note that we enable "unsafe" fp optimization with other compilers, too
-     AX_CHECK_COMPILER_FLAGS(-ffast-math, CFLAGS="$CFLAGS -ffast-math")
-
-     AX_GCC_ARCHFLAG($acx_maxopt_portable)
-
-     # drop to -O1 for gcc 4.2
-     $CC --version |
-	sed -e 's/.* \(@<:@0-9@:>@@<:@0-9@:>@*\)\.\(@<:@0-9@:>@@<:@0-9@:>@*\).*/\1 \2/' |
-	(read major minor
-	    if test $major -eq 4 -a $minor -eq 2; then
-				exit 0
-	    fi
-	    exit 1
-	) && CFLAGS="-O1"
-     ;;
-  esac
-
-  if test -z "$CFLAGS"; then
-	echo ""
-	echo "********************************************************"
-        echo "* WARNING: Don't know the best CFLAGS for this system  *"
-        echo "* Use ./configure CFLAGS=... to specify your own flags *"
-	echo "* (otherwise, a default of CFLAGS=-O3 will be used)    *"
-	echo "********************************************************"
-	echo ""
-        CFLAGS="-O3"
-  fi
-
-  AX_CHECK_COMPILER_FLAGS($CFLAGS, [], [
-	echo ""
-        echo "********************************************************"
-        echo "* WARNING: The guessed CFLAGS don't seem to work with  *"
-        echo "* your compiler.                                       *"
-        echo "* Use ./configure CFLAGS=... to specify your own flags *"
-        echo "********************************************************"
-        echo ""
-        CFLAGS=""
-  ])
-
-fi
-])
diff --git a/cloog-0.17.0/isl/m4/ax_check_compiler_flags.m4 b/cloog-0.17.0/isl/m4/ax_check_compiler_flags.m4
deleted file mode 100644
index 7da8324..0000000
--- a/cloog-0.17.0/isl/m4/ax_check_compiler_flags.m4
+++ /dev/null
@@ -1,74 +0,0 @@
-# ===========================================================================
-#     http://www.nongnu.org/autoconf-archive/ax_check_compiler_flags.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_CHECK_COMPILER_FLAGS(FLAGS, [ACTION-SUCCESS], [ACTION-FAILURE])
-#
-# DESCRIPTION
-#
-#   Check whether the given compiler FLAGS work with the current language's
-#   compiler, or whether they give an error. (Warnings, however, are
-#   ignored.)
-#
-#   ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
-#   success/failure.
-#
-# LICENSE
-#
-#   Copyright (c) 2009 Steven G. Johnson <stevenj@alum.mit.edu>
-#   Copyright (c) 2009 Matteo Frigo
-#
-#   This program is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation, either version 3 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_CHECK_COMPILER_FLAGS],
-[AC_PREREQ(2.59) dnl for _AC_LANG_PREFIX
-AC_MSG_CHECKING([whether _AC_LANG compiler accepts $1])
-dnl Some hackery here since AC_CACHE_VAL can't handle a non-literal varname:
-AS_LITERAL_IF([$1],
-  [AC_CACHE_VAL(AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1]), [
-      ax_save_FLAGS=$[]_AC_LANG_PREFIX[]FLAGS
-      _AC_LANG_PREFIX[]FLAGS="$1"
-      AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
-        AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=yes,
-        AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=no)
-      _AC_LANG_PREFIX[]FLAGS=$ax_save_FLAGS])],
-  [ax_save_FLAGS=$[]_AC_LANG_PREFIX[]FLAGS
-   _AC_LANG_PREFIX[]FLAGS="$1"
-   AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
-     eval AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=yes,
-     eval AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=no)
-   _AC_LANG_PREFIX[]FLAGS=$ax_save_FLAGS])
-eval ax_check_compiler_flags=$AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])
-AC_MSG_RESULT($ax_check_compiler_flags)
-if test "x$ax_check_compiler_flags" = xyes; then
-	m4_default([$2], :)
-else
-	m4_default([$3], :)
-fi
-])dnl AX_CHECK_COMPILER_FLAGS
diff --git a/cloog-0.17.0/isl/m4/ax_compiler_vendor.m4 b/cloog-0.17.0/isl/m4/ax_compiler_vendor.m4
deleted file mode 100644
index 3214706..0000000
--- a/cloog-0.17.0/isl/m4/ax_compiler_vendor.m4
+++ /dev/null
@@ -1,63 +0,0 @@
-# ===========================================================================
-#    http://www.gnu.org/software/autoconf-archive/ax_compiler_vendor.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_COMPILER_VENDOR
-#
-# DESCRIPTION
-#
-#   Determine the vendor of the C/C++ compiler, e.g., gnu, intel, ibm, sun,
-#   hp, borland, comeau, dec, cray, kai, lcc, metrowerks, sgi, microsoft,
-#   watcom, etc. The vendor is returned in the cache variable
-#   $ax_cv_c_compiler_vendor for C and $ax_cv_cxx_compiler_vendor for C++.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
-#   Copyright (c) 2008 Matteo Frigo
-#
-#   This program is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation, either version 3 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-#serial 9
-
-AC_DEFUN([AX_COMPILER_VENDOR],
-[
-AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor,
- [ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=unknown
-  # note: don't check for gcc first since some other compilers define __GNUC__
-  for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale:__PATHCC__,__PATHSCALE__ clang:__clang__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do
-    vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")"
-    AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[
-#if !($vencpp)
-      thisisanerror;
-#endif
-])], [ax_cv_]_AC_LANG_ABBREV[_compiler_vendor=`echo $ventest | cut -d: -f1`; break])
-  done
- ])
-])
diff --git a/cloog-0.17.0/isl/m4/ax_create_pkgconfig_info.m4 b/cloog-0.17.0/isl/m4/ax_create_pkgconfig_info.m4
deleted file mode 100644
index 60ac548..0000000
--- a/cloog-0.17.0/isl/m4/ax_create_pkgconfig_info.m4
+++ /dev/null
@@ -1,349 +0,0 @@
-# ===========================================================================
-#    http://www.nongnu.org/autoconf-archive/ax_create_pkgconfig_info.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_CREATE_PKGCONFIG_INFO [(outputfile, [requires [,libs [,summary [,cflags [, ldflags]]]]])]
-#
-# DESCRIPTION
-#
-#   Defaults:
-#
-#     $1 = $PACKAGE_NAME.pc
-#     $2 = (empty)
-#     $3 = $PACKAGE_LIBS $LIBS (as set at that point in configure.ac)
-#     $4 = $PACKAGE_SUMMARY (or $1 Library)
-#     $5 = $CPPFLAGS $PACKAGE_CFLAGS (as set at the point in configure.ac)
-#     $6 = $LDFLAGS $PACKAGE_LDFLAGS (as set at the point in configure.ac)
-#
-#     PACKAGE_NAME defaults to $PACKAGE if not set.
-#     PACKAGE_LIBS defaults to -l$PACKAGE_NAME if not set.
-#
-#   The resulting file is called $PACKAGE.pc.in / $PACKAGE.pc
-#
-#   You will find this macro most useful in conjunction with
-#   ax_spec_defaults that can read good initializers from the .spec file. In
-#   consequencd, most of the generatable installable stuff can be made from
-#   information being updated in a single place for the whole project.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
-#   Copyright (c) 2008 Sven Verdoolaege <skimo@kotnet.org>
-#
-#   This program is free software; you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation; either version 2 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_CREATE_PKGCONFIG_INFO],[dnl
-AS_VAR_PUSHDEF([PKGCONFIG_suffix],[ax_create_pkgconfig_suffix])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_libdir],[ax_create_pkgconfig_libdir])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_libfile],[ax_create_pkgconfig_libfile])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_libname],[ax_create_pkgconfig_libname])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_version],[ax_create_pkgconfig_version])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_description],[ax_create_pkgconfig_description])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_requires],[ax_create_pkgconfig_requires])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_pkglibs],[ax_create_pkgconfig_pkglibs])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_libs],[ax_create_pkgconfig_libs])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_ldflags],[ax_create_pkgconfig_ldflags])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_cppflags],[ax_create_pkgconfig_cppflags])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_generate],[ax_create_pkgconfig_generate])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_src_libdir],[ax_create_pkgconfig_src_libdir])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_src_headers],[ax_create_pkgconfig_src_headers])dnl
-
-# we need the expanded forms...
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-AC_MSG_CHECKING(our pkgconfig libname)
-test ".$PKGCONFIG_libname" != "." || \
-PKGCONFIG_libname="ifelse($1,,${PACKAGE_NAME},`basename $1 .pc`)"
-test ".$PKGCONFIG_libname" != "." || \
-PKGCONFIG_libname="$PACKAGE"
-PKGCONFIG_libname=`eval echo "$PKGCONFIG_libname"`
-PKGCONFIG_libname=`eval echo "$PKGCONFIG_libname"`
-AC_MSG_RESULT($PKGCONFIG_libname)
-
-AC_MSG_CHECKING(our pkgconfig version)
-test ".$PKGCONFIG_version" != "." || \
-PKGCONFIG_version="${PACKAGE_VERSION}"
-test ".$PKGCONFIG_version" != "." || \
-PKGCONFIG_version="$VERSION"
-PKGCONFIG_version=`eval echo "$PKGCONFIG_version"`
-PKGCONFIG_version=`eval echo "$PKGCONFIG_version"`
-AC_MSG_RESULT($PKGCONFIG_version)
-
-AC_MSG_CHECKING(our pkgconfig_libdir)
-test ".$pkgconfig_libdir" = "." && \
-pkgconfig_libdir='${libdir}/pkgconfig'
-PKGCONFIG_libdir=`eval echo "$pkgconfig_libdir"`
-PKGCONFIG_libdir=`eval echo "$PKGCONFIG_libdir"`
-PKGCONFIG_libdir=`eval echo "$PKGCONFIG_libdir"`
-AC_MSG_RESULT($pkgconfig_libdir)
-test "$pkgconfig_libdir" != "$PKGCONFIG_libdir" && (
-AC_MSG_RESULT(expanded our pkgconfig_libdir... $PKGCONFIG_libdir))
-AC_SUBST([pkgconfig_libdir])
-
-AC_MSG_CHECKING(our pkgconfig_libfile)
-test ".$pkgconfig_libfile" != "." || \
-pkgconfig_libfile="ifelse($1,,$PKGCONFIG_libname.pc,`basename $1`)"
-PKGCONFIG_libfile=`eval echo "$pkgconfig_libfile"`
-PKGCONFIG_libfile=`eval echo "$PKGCONFIG_libfile"`
-AC_MSG_RESULT($pkgconfig_libfile)
-test "$pkgconfig_libfile" != "$PKGCONFIG_libfile" && (
-AC_MSG_RESULT(expanded our pkgconfig_libfile... $PKGCONFIG_libfile))
-AC_SUBST([pkgconfig_libfile])
-
-AC_MSG_CHECKING(our package / suffix)
-PKGCONFIG_suffix="$program_suffix"
-test ".$PKGCONFIG_suffix" != .NONE || PKGCONFIG_suffix=""
-AC_MSG_RESULT(${PACKAGE_NAME} / ${PKGCONFIG_suffix})
-
-AC_MSG_CHECKING(our pkgconfig description)
-PKGCONFIG_description="ifelse($4,,$PACKAGE_SUMMARY,$4)"
-test ".$PKGCONFIG_description" != "." || \
-PKGCONFIG_description="$PKGCONFIG_libname Library"
-PKGCONFIG_description=`eval echo "$PKGCONFIG_description"`
-PKGCONFIG_description=`eval echo "$PKGCONFIG_description"`
-AC_MSG_RESULT($PKGCONFIG_description)
-
-AC_MSG_CHECKING(our pkgconfig requires)
-PKGCONFIG_requires="ifelse($2,,$PACKAGE_REQUIRES,$2)"
-PKGCONFIG_requires=`eval echo "$PKGCONFIG_requires"`
-PKGCONFIG_requires=`eval echo "$PKGCONFIG_requires"`
-AC_MSG_RESULT($PKGCONFIG_requires)
-
-AC_MSG_CHECKING(our pkgconfig ext libs)
-PKGCONFIG_pkglibs="$PACKAGE_LIBS"
-test ".$PKGCONFIG_pkglibs" != "." || PKGCONFIG_pkglibs="-l$PKGCONFIG_libname"
-PKGCONFIG_libs="ifelse($3,,$PKGCONFIG_pkglibs $LIBS,$3)"
-PKGCONFIG_libs=`eval echo "$PKGCONFIG_libs"`
-PKGCONFIG_libs=`eval echo "$PKGCONFIG_libs"`
-AC_MSG_RESULT($PKGCONFIG_libs)
-
-AC_MSG_CHECKING(our pkgconfig cppflags)
-PKGCONFIG_cppflags="ifelse($5,,$CPPFLAGS $PACKAGE_CFLAGS,$5)"
-PKGCONFIG_cppflags=`eval echo "$PKGCONFIG_cppflags"`
-PKGCONFIG_cppflags=`eval echo "$PKGCONFIG_cppflags"`
-AC_MSG_RESULT($PKGCONFIG_cppflags)
-
-AC_MSG_CHECKING(our pkgconfig ldflags)
-PKGCONFIG_ldflags="ifelse($6,,$LDFLAGS $PACKAGE_LDFLAGS,$5)"
-PKGCONFIG_ldflags=`eval echo "$PKGCONFIG_ldflags"`
-PKGCONFIG_ldflags=`eval echo "$PKGCONFIG_ldflags"`
-AC_MSG_RESULT($PKGCONFIG_ldflags)
-
-test ".$PKGCONFIG_generate" != "." || \
-PKGCONFIG_generate="ifelse($1,,$PKGCONFIG_libname.pc,$1)"
-PKGCONFIG_generate=`eval echo "$PKGCONFIG_generate"`
-PKGCONFIG_generate=`eval echo "$PKGCONFIG_generate"`
-test "$pkgconfig_libfile" != "$PKGCONFIG_generate" && (
-AC_MSG_RESULT(generate the pkgconfig later... $PKGCONFIG_generate))
-
-if test ".$PKGCONFIG_src_libdir" = "." ; then
-PKGCONFIG_src_libdir=`pwd`
-PKGCONFIG_src_libdir=`AS_DIRNAME("$PKGCONFIG_src_libdir/$PKGCONFIG_generate")`
-test ! -d $PKGCONFIG_src_libdir/src || \
-PKGCONFIG_src_libdir="$PKGCONFIG_src_libdir/src"
-case ".$objdir" in
-*libs) PKGCONFIG_src_libdir="$PKGCONFIG_src_libdir/$objdir" ;; esac
-AC_MSG_RESULT(noninstalled pkgconfig -L $PKGCONFIG_src_libdir)
-fi
-
-if test ".$PKGCONFIG_src_headers" = "." ; then
-PKGCONFIG_src_headers=`pwd`
-v="$ac_top_srcdir" ;
-test ".$v" != "." || v="$ax_spec_dir"
-test ".$v" != "." || v="$srcdir"
-case "$v" in /*) PKGCONFIG_src_headers="" ;; esac
-PKGCONFIG_src_headers=`AS_DIRNAME("$PKGCONFIG_src_headers/$v/x")`
-test ! -d $PKGCONFIG_src_headers/incl[]ude || \
-PKGCONFIG_src_headers="$PKGCONFIG_src_headers/incl[]ude"
-AC_MSG_RESULT(noninstalled pkgconfig -I $PKGCONFIG_src_headers)
-fi
-
-
-dnl AC_CONFIG_COMMANDS crap disallows to use $PKGCONFIG_libfile here...
-AC_CONFIG_COMMANDS([$ax_create_pkgconfig_generate],[
-pkgconfig_generate="$ax_create_pkgconfig_generate"
-if test ! -f "$pkgconfig_generate.in"
-then generate="true"
-elif grep ' generated by configure ' $pkgconfig_generate.in >/dev/null
-then generate="true"
-else generate="false";
-fi
-if $generate ; then
-AC_MSG_NOTICE(creating $pkgconfig_generate.in)
-cat > $pkgconfig_generate.in <<AXEOF
-# generated by configure / remove this line to disable regeneration
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-bindir=@bindir@
-libdir=@libdir@
-datarootdir=@datarootdir@
-datadir=@datadir@
-sysconfdir=@sysconfdir@
-includedir=@includedir@
-package=@PACKAGE@
-suffix=@suffix@
-
-Name: @PACKAGE_NAME@
-Description: @PACKAGE_DESCRIPTION@
-Version: @PACKAGE_VERSION@
-Requires: @PACKAGE_REQUIRES@
-Libs: -L\${libdir} @LDFLAGS@ @LIBS@
-Cflags: -I\${includedir} @CPPFLAGS@
-AXEOF
-fi # DONE generate $pkgconfig_generate.in
-AC_MSG_NOTICE(creating $pkgconfig_generate)
-cat >conftest.sed <<AXEOF
-s|@prefix@|${pkgconfig_prefix}|
-s|@exec_prefix@|${pkgconfig_execprefix}|
-s|@bindir@|${pkgconfig_bindir}|
-s|@libdir@|${pkgconfig_libdir}|
-s|@datarootdir@|${pkgconfig_datarootdir}|
-s|@datadir@|${pkgconfig_datadir}|
-s|@sysconfdir@|${pkgconfig_sysconfdir}|
-s|@includedir@|${pkgconfig_includedir}|
-s|@suffix@|${pkgconfig_suffix}|
-s|@PACKAGE@|${pkgconfig_package}|
-s|@PACKAGE_NAME@|${pkgconfig_libname}|
-s|@PACKAGE_DESCRIPTION@|${pkgconfig_description}|
-s|@PACKAGE_VERSION@|${pkgconfig_version}|
-s|@PACKAGE_REQUIRES@|${pkgconfig_requires}|
-s|@LIBS@|${pkgconfig_libs}|
-s|@LDFLAGS@|${pkgconfig_ldflags}|
-s|@CPPFLAGS@|${pkgconfig_cppflags}|
-AXEOF
-sed -f conftest.sed  $pkgconfig_generate.in > $pkgconfig_generate
-if test ! -s $pkgconfig_generate ; then
-    AC_MSG_ERROR([$pkgconfig_generate is empty])
-fi ; rm conftest.sed # DONE generate $pkgconfig_generate
-pkgconfig_uninstalled=`echo $pkgconfig_generate |sed 's/.pc$/-uninstalled.pc/'`
-AC_MSG_NOTICE(creating $pkgconfig_uninstalled)
-cat >conftest.sed <<AXEOF
-s|@prefix@|${pkgconfig_prefix}|
-s|@exec_prefix@|${pkgconfig_execprefix}|
-s|@bindir@|${pkgconfig_bindir}|
-s|@libdir@|${pkgconfig_src_libdir}|
-s|@datarootdir@|${pkgconfig_datarootdir}|
-s|@datadir@|${pkgconfig_datadir}|
-s|@sysconfdir@|${pkgconfig_sysconfdir}|
-s|@includedir@|${pkgconfig_src_headers}|
-s|@suffix@|${pkgconfig_suffix}|
-s|@PACKAGE@|${pkgconfig_package}|
-s|@PACKAGE_NAME@|${pkgconfig_libname}|
-s|@PACKAGE_DESCRIPTION@|${pkgconfig_description}|
-s|@PACKAGE_VERSION@|${pkgconfig_version}|
-s|@PACKAGE_REQUIRES@|${pkgconfig_requires}|
-s|@LIBS@|${pkgconfig_libs}|
-s|@LDFLAGS@|${pkgconfig_ldflags}|
-s|@CPPFLAGS@|${pkgconfig_cppflags}|
-AXEOF
-sed -f conftest.sed $pkgconfig_generate.in > $pkgconfig_uninstalled
-if test ! -s $pkgconfig_uninstalled ; then
-    AC_MSG_ERROR([$pkgconfig_uninstalled is empty])
-fi ; rm conftest.sed # DONE generate $pkgconfig_uninstalled
-           pkgconfig_requires_add=`echo ${pkgconfig_requires}`
-if test ".$pkgconfig_requires_add" != "." ; then
-           pkgconfig_requires_add="pkg-config $pkgconfig_requires_add"
-    else   pkgconfig_requires_add=":" ; fi
-pkgconfig_uninstalled=`echo $pkgconfig_generate |sed 's/.pc$/-uninstalled.sh/'`
-AC_MSG_NOTICE(creating $pkgconfig_uninstalled)
-cat >conftest.sed <<AXEOF
-s|@prefix@|\"${pkgconfig_prefix}\"|
-s|@exec_prefix@|\"${pkgconfig_execprefix}\"|
-s|@bindir@|\"${pkgconfig_bindir}\"|
-s|@libdir@|\"${pkgconfig_src_libdir}\"|
-s|@datarootdir@|\"${pkgconfig_datarootdir}\"|
-s|@datadir@|\"${pkgconfig_datadir}\"|
-s|@sysconfdir@|\"${pkgconfig_sysconfdir}\"|
-s|@includedir@|\"${pkgconfig_src_headers}\"|
-s|@suffix@|\"${pkgconfig_suffix}\"|
-s|@PACKAGE@|\"${pkgconfig_package}\"|
-s|@PACKAGE_NAME@|\"${pkgconfig_libname}\"|
-s|@PACKAGE_DESCRIPTION@|\"${pkgconfig_description}\"|
-s|@PACKAGE_VERSION@|\"${pkgconfig_version}\"|
-s|@PACKAGE_REQUIRES@|\"${pkgconfig_requires}\"|
-s|@LIBS@|\"${pkgconfig_libs}\"|
-s|@LDFLAGS@|\"${pkgconfig_ldflags}\"|
-s|@CPPFLAGS@|\"${pkgconfig_cppflags}\"|
-s>Name:>for option\\; do case \"\$option\" in --list-all|--name) echo >
-s>Description: *>\\;\\; --help) pkg-config --help \\; echo Buildscript Of >
-s>Version: *>\\;\\; --modversion|--version) echo >
-s>Requires:>\\;\\; --requires) echo $pkgconfig_requires_add>
-s>Libs: *>\\;\\; --libs) echo >
-s>Cflags: *>\\;\\; --cflags) echo >
-/--libs)/a\\
-       $pkgconfig_requires_add
-/--cflags)/a\\
-       $pkgconfig_requires_add\\
-;; --variable=*) eval echo '\$'\`echo \$option | sed -e 's/.*=//'\`\\
-;; --uninstalled) exit 0 \\
-;; *) ;; esac done
-AXEOF
-sed -f conftest.sed  $pkgconfig_generate.in > $pkgconfig_uninstalled
-if test ! -s $pkgconfig_uninstalled ; then
-    AC_MSG_ERROR([$pkgconfig_uninstalled is empty])
-fi ; rm conftest.sed # DONE generate $pkgconfig_uninstalled
-],[
-dnl AC_CONFIG_COMMANDS crap, the AS_PUSHVAR defines are invalid here...
-ax_create_pkgconfig_generate="$ax_create_pkgconfig_generate"
-pkgconfig_prefix='$prefix'
-pkgconfig_execprefix='$exec_prefix'
-pkgconfig_bindir='$bindir'
-pkgconfig_libdir='$libdir'
-pkgconfig_includedir='$includedir'
-pkgconfig_datarootdir='$datarootdir'
-pkgconfig_datadir='$datadir'
-pkgconfig_sysconfdir='$sysconfdir'
-pkgconfig_suffix='$ax_create_pkgconfig_suffix'
-pkgconfig_package='$PACKAGE_NAME'
-pkgconfig_libname='$ax_create_pkgconfig_libname'
-pkgconfig_description='$ax_create_pkgconfig_description'
-pkgconfig_version='$ax_create_pkgconfig_version'
-pkgconfig_requires='$ax_create_pkgconfig_requires'
-pkgconfig_libs='$ax_create_pkgconfig_libs'
-pkgconfig_ldflags='$ax_create_pkgconfig_ldflags'
-pkgconfig_cppflags='$ax_create_pkgconfig_cppflags'
-pkgconfig_src_libdir='$ax_create_pkgconfig_src_libdir'
-pkgconfig_src_headers='$ax_create_pkgconfig_src_headers'
-])dnl
-AS_VAR_POPDEF([PKGCONFIG_suffix])dnl
-AS_VAR_POPDEF([PKGCONFIG_libdir])dnl
-AS_VAR_POPDEF([PKGCONFIG_libfile])dnl
-AS_VAR_POPDEF([PKGCONFIG_libname])dnl
-AS_VAR_POPDEF([PKGCONFIG_version])dnl
-AS_VAR_POPDEF([PKGCONFIG_description])dnl
-AS_VAR_POPDEF([PKGCONFIG_requires])dnl
-AS_VAR_POPDEF([PKGCONFIG_pkglibs])dnl
-AS_VAR_POPDEF([PKGCONFIG_libs])dnl
-AS_VAR_POPDEF([PKGCONFIG_ldflags])dnl
-AS_VAR_POPDEF([PKGCONFIG_cppflags])dnl
-AS_VAR_POPDEF([PKGCONFIG_generate])dnl
-AS_VAR_POPDEF([PKGCONFIG_src_libdir])dnl
-AS_VAR_POPDEF([PKGCONFIG_src_headers])dnl
-])
diff --git a/cloog-0.17.0/isl/m4/ax_create_stdint_h.m4 b/cloog-0.17.0/isl/m4/ax_create_stdint_h.m4
deleted file mode 100644
index 7b82165..0000000
--- a/cloog-0.17.0/isl/m4/ax_create_stdint_h.m4
+++ /dev/null
@@ -1,739 +0,0 @@
-# ===========================================================================
-#           http://autoconf-archive.cryp.to/ax_create_stdint_h.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_CREATE_STDINT_H [( HEADER-TO-GENERATE [, HEDERS-TO-CHECK])]
-#
-# DESCRIPTION
-#
-#   the "ISO C9X: 7.18 Integer types <stdint.h>" section requires the
-#   existence of an include file <stdint.h> that defines a set of typedefs,
-#   especially uint8_t,int32_t,uintptr_t. Many older installations will not
-#   provide this file, but some will have the very same definitions in
-#   <inttypes.h>. In other enviroments we can use the inet-types in
-#   <sys/types.h> which would define the typedefs int8_t and u_int8_t
-#   respectivly.
-#
-#   This macros will create a local "_stdint.h" or the headerfile given as
-#   an argument. In many cases that file will just "#include <stdint.h>" or
-#   "#include <inttypes.h>", while in other environments it will provide the
-#   set of basic 'stdint's definitions/typedefs:
-#
-#     int8_t,uint8_t,int16_t,uint16_t,int32_t,uint32_t,intptr_t,uintptr_t
-#     int_least32_t.. int_fast32_t.. intmax_t
-#
-#   which may or may not rely on the definitions of other files, or using
-#   the AC_CHECK_SIZEOF macro to determine the actual sizeof each type.
-#
-#   if your header files require the stdint-types you will want to create an
-#   installable file mylib-int.h that all your other installable header may
-#   include. So if you have a library package named "mylib", just use
-#
-#        AX_CREATE_STDINT_H(mylib-int.h)
-#
-#   in configure.ac and go to install that very header file in Makefile.am
-#   along with the other headers (mylib.h) - and the mylib-specific headers
-#   can simply use "#include <mylib-int.h>" to obtain the stdint-types.
-#
-#   Remember, if the system already had a valid <stdint.h>, the generated
-#   file will include it directly. No need for fuzzy HAVE_STDINT_H things...
-#   (oops, GCC 4.2.x has deliberatly disabled its stdint.h for non-c99
-#   compilation and the c99-mode is not the default. Therefore this macro
-#   will not use the compiler's stdint.h - please complain to the GCC
-#   developers).
-#
-# LAST MODIFICATION
-#
-#   2008-04-12
-#
-# COPYLEFT
-#
-#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
-#
-#   This program is free software; you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation; either version 2 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Macro Archive. When you make and
-#   distribute a modified version of the Autoconf Macro, you may extend this
-#   special exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_CHECK_DATA_MODEL],[
-   AC_CHECK_SIZEOF(char)
-   AC_CHECK_SIZEOF(short)
-   AC_CHECK_SIZEOF(int)
-   AC_CHECK_SIZEOF(long)
-   AC_CHECK_SIZEOF(void*)
-   ac_cv_char_data_model=""
-   ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_char"
-   ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_short"
-   ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_int"
-   ac_cv_long_data_model=""
-   ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_int"
-   ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_long"
-   ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_voidp"
-   AC_MSG_CHECKING([data model])
-   case "$ac_cv_char_data_model/$ac_cv_long_data_model" in
-    122/242)     ac_cv_data_model="IP16"  ; n="standard 16bit machine" ;;
-    122/244)     ac_cv_data_model="LP32"  ; n="standard 32bit machine" ;;
-    122/*)       ac_cv_data_model="i16"   ; n="unusual int16 model" ;;
-    124/444)     ac_cv_data_model="ILP32" ; n="standard 32bit unixish" ;;
-    124/488)     ac_cv_data_model="LP64"  ; n="standard 64bit unixish" ;;
-    124/448)     ac_cv_data_model="LLP64" ; n="unusual 64bit unixish" ;;
-    124/*)       ac_cv_data_model="i32"   ; n="unusual int32 model" ;;
-    128/888)     ac_cv_data_model="ILP64" ; n="unusual 64bit numeric" ;;
-    128/*)       ac_cv_data_model="i64"   ; n="unusual int64 model" ;;
-    222/*2)      ac_cv_data_model="DSP16" ; n="strict 16bit dsptype" ;;
-    333/*3)      ac_cv_data_model="DSP24" ; n="strict 24bit dsptype" ;;
-    444/*4)      ac_cv_data_model="DSP32" ; n="strict 32bit dsptype" ;;
-    666/*6)      ac_cv_data_model="DSP48" ; n="strict 48bit dsptype" ;;
-    888/*8)      ac_cv_data_model="DSP64" ; n="strict 64bit dsptype" ;;
-    222/*|333/*|444/*|666/*|888/*) :
-                 ac_cv_data_model="iDSP"  ; n="unusual dsptype" ;;
-     *)          ac_cv_data_model="none"  ; n="very unusual model" ;;
-   esac
-   AC_MSG_RESULT([$ac_cv_data_model ($ac_cv_long_data_model, $n)])
-])
-
-dnl AX_CHECK_HEADER_STDINT_X([HEADERLIST][,ACTION-IF])
-AC_DEFUN([AX_CHECK_HEADER_STDINT_X],[
-AC_CACHE_CHECK([for stdint uintptr_t], [ac_cv_header_stdint_x],[
- ac_cv_header_stdint_x="" # the 1997 typedefs (inttypes.h)
-  AC_MSG_RESULT([(..)])
-  for i in m4_ifval([$1],[$1],[stdint.h inttypes.h sys/inttypes.h sys/types.h])
-  do
-   unset ac_cv_type_uintptr_t
-   unset ac_cv_type_uint64_t
-   AC_CHECK_TYPE(uintptr_t,[ac_cv_header_stdint_x=$i],continue,[#include <$i>])
-   AC_CHECK_TYPE(uint64_t,[and64="/uint64_t"],[and64=""],[#include<$i>])
-   m4_ifvaln([$2],[$2]) break
-  done
-  AC_MSG_CHECKING([for stdint uintptr_t])
- ])
-])
-
-AC_DEFUN([AX_CHECK_HEADER_STDINT_O],[
-AC_CACHE_CHECK([for stdint uint32_t], [ac_cv_header_stdint_o],[
- ac_cv_header_stdint_o="" # the 1995 typedefs (sys/inttypes.h)
-  AC_MSG_RESULT([(..)])
-  for i in m4_ifval([$1],[$1],[inttypes.h sys/inttypes.h sys/types.h stdint.h])
-  do
-   unset ac_cv_type_uint32_t
-   unset ac_cv_type_uint64_t
-   AC_CHECK_TYPE(uint32_t,[ac_cv_header_stdint_o=$i],continue,[#include <$i>])
-   AC_CHECK_TYPE(uint64_t,[and64="/uint64_t"],[and64=""],[#include<$i>])
-   m4_ifvaln([$2],[$2]) break
-   break;
-  done
-  AC_MSG_CHECKING([for stdint uint32_t])
- ])
-])
-
-AC_DEFUN([AX_CHECK_HEADER_STDINT_U],[
-AC_CACHE_CHECK([for stdint u_int32_t], [ac_cv_header_stdint_u],[
- ac_cv_header_stdint_u="" # the BSD typedefs (sys/types.h)
-  AC_MSG_RESULT([(..)])
-  for i in m4_ifval([$1],[$1],[sys/types.h inttypes.h sys/inttypes.h]) ; do
-   unset ac_cv_type_u_int32_t
-   unset ac_cv_type_u_int64_t
-   AC_CHECK_TYPE(u_int32_t,[ac_cv_header_stdint_u=$i],continue,[#include <$i>])
-   AC_CHECK_TYPE(u_int64_t,[and64="/u_int64_t"],[and64=""],[#include<$i>])
-   m4_ifvaln([$2],[$2]) break
-   break;
-  done
-  AC_MSG_CHECKING([for stdint u_int32_t])
- ])
-])
-
-AC_DEFUN([AX_CREATE_STDINT_H],
-[# ------ AX CREATE STDINT H -------------------------------------
-AC_MSG_CHECKING([for stdint types])
-ac_stdint_h=`echo ifelse($1, , _stdint.h, $1)`
-# try to shortcircuit - if the default include path of the compiler
-# can find a "stdint.h" header then we assume that all compilers can.
-AC_CACHE_VAL([ac_cv_header_stdint_t],[
-old_CXXFLAGS="$CXXFLAGS" ; CXXFLAGS=""
-old_CPPFLAGS="$CPPFLAGS" ; CPPFLAGS=""
-old_CFLAGS="$CFLAGS"     ; CFLAGS=""
-AC_TRY_COMPILE([#include <stdint.h>],[int_least32_t v = 0;],
-[ac_cv_stdint_result="(assuming C99 compatible system)"
- ac_cv_header_stdint_t="stdint.h"; ],
-[ac_cv_header_stdint_t=""])
-if test "$GCC" = "yes" && test ".$ac_cv_header_stdint_t" = "."; then
-CFLAGS="-std=c99"
-AC_TRY_COMPILE([#include <stdint.h>],[int_least32_t v = 0;],
-[AC_MSG_WARN(your GCC compiler has a defunct stdint.h for its default-mode)])
-fi
-CXXFLAGS="$old_CXXFLAGS"
-CPPFLAGS="$old_CPPFLAGS"
-CFLAGS="$old_CFLAGS" ])
-
-v="... $ac_cv_header_stdint_h"
-if test "$ac_stdint_h" = "stdint.h" ; then
- AC_MSG_RESULT([(are you sure you want them in ./stdint.h?)])
-elif test "$ac_stdint_h" = "inttypes.h" ; then
- AC_MSG_RESULT([(are you sure you want them in ./inttypes.h?)])
-elif test "_$ac_cv_header_stdint_t" = "_" ; then
- AC_MSG_RESULT([(putting them into $ac_stdint_h)$v])
-else
- ac_cv_header_stdint="$ac_cv_header_stdint_t"
- AC_MSG_RESULT([$ac_cv_header_stdint (shortcircuit)])
-fi
-
-if test "_$ac_cv_header_stdint_t" = "_" ; then # can not shortcircuit..
-
-dnl .....intro message done, now do a few system checks.....
-dnl btw, all old CHECK_TYPE macros do automatically "DEFINE" a type,
-dnl therefore we use the autoconf implementation detail CHECK_TYPE_NEW
-dnl instead that is triggered with 3 or more arguments (see types.m4)
-
-inttype_headers=`echo $2 | sed -e 's/,/ /g'`
-
-ac_cv_stdint_result="(no helpful system typedefs seen)"
-AX_CHECK_HEADER_STDINT_X(dnl
-   stdint.h inttypes.h sys/inttypes.h $inttype_headers,
-   ac_cv_stdint_result="(seen uintptr_t$and64 in $i)")
-
-if test "_$ac_cv_header_stdint_x" = "_" ; then
-AX_CHECK_HEADER_STDINT_O(dnl,
-   inttypes.h sys/inttypes.h stdint.h $inttype_headers,
-   ac_cv_stdint_result="(seen uint32_t$and64 in $i)")
-fi
-
-if test "_$ac_cv_header_stdint_x" = "_" ; then
-if test "_$ac_cv_header_stdint_o" = "_" ; then
-AX_CHECK_HEADER_STDINT_U(dnl,
-   sys/types.h inttypes.h sys/inttypes.h $inttype_headers,
-   ac_cv_stdint_result="(seen u_int32_t$and64 in $i)")
-fi fi
-
-dnl if there was no good C99 header file, do some typedef checks...
-if test "_$ac_cv_header_stdint_x" = "_" ; then
-   AC_MSG_CHECKING([for stdint datatype model])
-   AC_MSG_RESULT([(..)])
-   AX_CHECK_DATA_MODEL
-fi
-
-if test "_$ac_cv_header_stdint_x" != "_" ; then
-   ac_cv_header_stdint="$ac_cv_header_stdint_x"
-elif  test "_$ac_cv_header_stdint_o" != "_" ; then
-   ac_cv_header_stdint="$ac_cv_header_stdint_o"
-elif  test "_$ac_cv_header_stdint_u" != "_" ; then
-   ac_cv_header_stdint="$ac_cv_header_stdint_u"
-else
-   ac_cv_header_stdint="stddef.h"
-fi
-
-AC_MSG_CHECKING([for extra inttypes in chosen header])
-AC_MSG_RESULT([($ac_cv_header_stdint)])
-dnl see if int_least and int_fast types are present in _this_ header.
-unset ac_cv_type_int_least32_t
-unset ac_cv_type_int_fast32_t
-AC_CHECK_TYPE(int_least32_t,,,[#include <$ac_cv_header_stdint>])
-AC_CHECK_TYPE(int_fast32_t,,,[#include<$ac_cv_header_stdint>])
-AC_CHECK_TYPE(intmax_t,,,[#include <$ac_cv_header_stdint>])
-
-fi # shortcircut to system "stdint.h"
-# ------------------ PREPARE VARIABLES ------------------------------
-if test "$GCC" = "yes" ; then
-ac_cv_stdint_message="using gnu compiler "`$CC --version | head -1`
-else
-ac_cv_stdint_message="using $CC"
-fi
-
-AC_MSG_RESULT([make use of $ac_cv_header_stdint in $ac_stdint_h dnl
-$ac_cv_stdint_result])
-
-dnl -----------------------------------------------------------------
-# ----------------- DONE inttypes.h checks START header -------------
-AC_CONFIG_COMMANDS([$ac_stdint_h],[
-AC_MSG_NOTICE(creating $ac_stdint_h : $_ac_stdint_h)
-ac_stdint=$tmp/_stdint.h
-
-echo "#ifndef" $_ac_stdint_h >$ac_stdint
-echo "#define" $_ac_stdint_h "1" >>$ac_stdint
-echo "#ifndef" _GENERATED_STDINT_H >>$ac_stdint
-echo "#define" _GENERATED_STDINT_H '"'$PACKAGE $VERSION'"' >>$ac_stdint
-echo "/* generated $ac_cv_stdint_message */" >>$ac_stdint
-if test "_$ac_cv_header_stdint_t" != "_" ; then
-echo "#define _STDINT_HAVE_STDINT_H" "1" >>$ac_stdint
-echo "#include <stdint.h>" >>$ac_stdint
-echo "#endif" >>$ac_stdint
-echo "#endif" >>$ac_stdint
-else
-
-cat >>$ac_stdint <<STDINT_EOF
-
-/* ................... shortcircuit part ........................... */
-
-#if defined HAVE_STDINT_H || defined _STDINT_HAVE_STDINT_H
-#include <stdint.h>
-#else
-#include <stddef.h>
-
-/* .................... configured part ............................ */
-
-STDINT_EOF
-
-echo "/* whether we have a C99 compatible stdint header file */" >>$ac_stdint
-if test "_$ac_cv_header_stdint_x" != "_" ; then
-  ac_header="$ac_cv_header_stdint_x"
-  echo "#define _STDINT_HEADER_INTPTR" '"'"$ac_header"'"' >>$ac_stdint
-else
-  echo "/* #undef _STDINT_HEADER_INTPTR */" >>$ac_stdint
-fi
-
-echo "/* whether we have a C96 compatible inttypes header file */" >>$ac_stdint
-if  test "_$ac_cv_header_stdint_o" != "_" ; then
-  ac_header="$ac_cv_header_stdint_o"
-  echo "#define _STDINT_HEADER_UINT32" '"'"$ac_header"'"' >>$ac_stdint
-else
-  echo "/* #undef _STDINT_HEADER_UINT32 */" >>$ac_stdint
-fi
-
-echo "/* whether we have a BSD compatible inet types header */" >>$ac_stdint
-if  test "_$ac_cv_header_stdint_u" != "_" ; then
-  ac_header="$ac_cv_header_stdint_u"
-  echo "#define _STDINT_HEADER_U_INT32" '"'"$ac_header"'"' >>$ac_stdint
-else
-  echo "/* #undef _STDINT_HEADER_U_INT32 */" >>$ac_stdint
-fi
-
-echo "" >>$ac_stdint
-
-if test "_$ac_header" != "_" ; then if test "$ac_header" != "stddef.h" ; then
-  echo "#include <$ac_header>" >>$ac_stdint
-  echo "" >>$ac_stdint
-fi fi
-
-echo "/* which 64bit typedef has been found */" >>$ac_stdint
-if test "$ac_cv_type_uint64_t" = "yes" ; then
-echo "#define   _STDINT_HAVE_UINT64_T" "1"  >>$ac_stdint
-else
-echo "/* #undef _STDINT_HAVE_UINT64_T */" >>$ac_stdint
-fi
-if test "$ac_cv_type_u_int64_t" = "yes" ; then
-echo "#define   _STDINT_HAVE_U_INT64_T" "1"  >>$ac_stdint
-else
-echo "/* #undef _STDINT_HAVE_U_INT64_T */" >>$ac_stdint
-fi
-echo "" >>$ac_stdint
-
-echo "/* which type model has been detected */" >>$ac_stdint
-if test "_$ac_cv_char_data_model" != "_" ; then
-echo "#define   _STDINT_CHAR_MODEL" "$ac_cv_char_data_model" >>$ac_stdint
-echo "#define   _STDINT_LONG_MODEL" "$ac_cv_long_data_model" >>$ac_stdint
-else
-echo "/* #undef _STDINT_CHAR_MODEL // skipped */" >>$ac_stdint
-echo "/* #undef _STDINT_LONG_MODEL // skipped */" >>$ac_stdint
-fi
-echo "" >>$ac_stdint
-
-echo "/* whether int_least types were detected */" >>$ac_stdint
-if test "$ac_cv_type_int_least32_t" = "yes"; then
-echo "#define   _STDINT_HAVE_INT_LEAST32_T" "1"  >>$ac_stdint
-else
-echo "/* #undef _STDINT_HAVE_INT_LEAST32_T */" >>$ac_stdint
-fi
-echo "/* whether int_fast types were detected */" >>$ac_stdint
-if test "$ac_cv_type_int_fast32_t" = "yes"; then
-echo "#define   _STDINT_HAVE_INT_FAST32_T" "1" >>$ac_stdint
-else
-echo "/* #undef _STDINT_HAVE_INT_FAST32_T */" >>$ac_stdint
-fi
-echo "/* whether intmax_t type was detected */" >>$ac_stdint
-if test "$ac_cv_type_intmax_t" = "yes"; then
-echo "#define   _STDINT_HAVE_INTMAX_T" "1" >>$ac_stdint
-else
-echo "/* #undef _STDINT_HAVE_INTMAX_T */" >>$ac_stdint
-fi
-echo "" >>$ac_stdint
-
-  cat >>$ac_stdint <<STDINT_EOF
-/* .................... detections part ............................ */
-
-/* whether we need to define bitspecific types from compiler base types */
-#ifndef _STDINT_HEADER_INTPTR
-#ifndef _STDINT_HEADER_UINT32
-#ifndef _STDINT_HEADER_U_INT32
-#define _STDINT_NEED_INT_MODEL_T
-#else
-#define _STDINT_HAVE_U_INT_TYPES
-#endif
-#endif
-#endif
-
-#ifdef _STDINT_HAVE_U_INT_TYPES
-#undef _STDINT_NEED_INT_MODEL_T
-#endif
-
-#ifdef  _STDINT_CHAR_MODEL
-#if     _STDINT_CHAR_MODEL+0 == 122 || _STDINT_CHAR_MODEL+0 == 124
-#ifndef _STDINT_BYTE_MODEL
-#define _STDINT_BYTE_MODEL 12
-#endif
-#endif
-#endif
-
-#ifndef _STDINT_HAVE_INT_LEAST32_T
-#define _STDINT_NEED_INT_LEAST_T
-#endif
-
-#ifndef _STDINT_HAVE_INT_FAST32_T
-#define _STDINT_NEED_INT_FAST_T
-#endif
-
-#ifndef _STDINT_HEADER_INTPTR
-#define _STDINT_NEED_INTPTR_T
-#ifndef _STDINT_HAVE_INTMAX_T
-#define _STDINT_NEED_INTMAX_T
-#endif
-#endif
-
-
-/* .................... definition part ............................ */
-
-/* some system headers have good uint64_t */
-#ifndef _HAVE_UINT64_T
-#if     defined _STDINT_HAVE_UINT64_T  || defined HAVE_UINT64_T
-#define _HAVE_UINT64_T
-#elif   defined _STDINT_HAVE_U_INT64_T || defined HAVE_U_INT64_T
-#define _HAVE_UINT64_T
-typedef u_int64_t uint64_t;
-#endif
-#endif
-
-#ifndef _HAVE_UINT64_T
-/* .. here are some common heuristics using compiler runtime specifics */
-#if defined __STDC_VERSION__ && defined __STDC_VERSION__ >= 199901L
-#define _HAVE_UINT64_T
-#define _HAVE_LONGLONG_UINT64_T
-typedef long long int64_t;
-typedef unsigned long long uint64_t;
-
-#elif !defined __STRICT_ANSI__
-#if defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__
-#define _HAVE_UINT64_T
-typedef __int64 int64_t;
-typedef unsigned __int64 uint64_t;
-
-#elif defined __GNUC__ || defined __MWERKS__ || defined __ELF__
-/* note: all ELF-systems seem to have loff-support which needs 64-bit */
-#if !defined _NO_LONGLONG
-#define _HAVE_UINT64_T
-#define _HAVE_LONGLONG_UINT64_T
-typedef long long int64_t;
-typedef unsigned long long uint64_t;
-#endif
-
-#elif defined __alpha || (defined __mips && defined _ABIN32)
-#if !defined _NO_LONGLONG
-typedef long int64_t;
-typedef unsigned long uint64_t;
-#endif
-  /* compiler/cpu type to define int64_t */
-#endif
-#endif
-#endif
-
-#if defined _STDINT_HAVE_U_INT_TYPES
-/* int8_t int16_t int32_t defined by inet code, redeclare the u_intXX types */
-typedef u_int8_t uint8_t;
-typedef u_int16_t uint16_t;
-typedef u_int32_t uint32_t;
-
-/* glibc compatibility */
-#ifndef __int8_t_defined
-#define __int8_t_defined
-#endif
-#endif
-
-#ifdef _STDINT_NEED_INT_MODEL_T
-/* we must guess all the basic types. Apart from byte-adressable system, */
-/* there a few 32-bit-only dsp-systems that we guard with BYTE_MODEL 8-} */
-/* (btw, those nibble-addressable systems are way off, or so we assume) */
-
-dnl   /* have a look at "64bit and data size neutrality" at */
-dnl   /* http://unix.org/version2/whatsnew/login_64bit.html */
-dnl   /* (the shorthand "ILP" types always have a "P" part) */
-
-#if defined _STDINT_BYTE_MODEL
-#if _STDINT_LONG_MODEL+0 == 242
-/* 2:4:2 =  IP16 = a normal 16-bit system                */
-typedef unsigned char   uint8_t;
-typedef unsigned short  uint16_t;
-typedef unsigned long   uint32_t;
-#ifndef __int8_t_defined
-#define __int8_t_defined
-typedef          char    int8_t;
-typedef          short   int16_t;
-typedef          long    int32_t;
-#endif
-#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL == 444
-/* 2:4:4 =  LP32 = a 32-bit system derived from a 16-bit */
-/* 4:4:4 = ILP32 = a normal 32-bit system                */
-typedef unsigned char   uint8_t;
-typedef unsigned short  uint16_t;
-typedef unsigned int    uint32_t;
-#ifndef __int8_t_defined
-#define __int8_t_defined
-typedef          char    int8_t;
-typedef          short   int16_t;
-typedef          int     int32_t;
-#endif
-#elif _STDINT_LONG_MODEL+0 == 484 || _STDINT_LONG_MODEL+0 == 488
-/* 4:8:4 =  IP32 = a 32-bit system prepared for 64-bit    */
-/* 4:8:8 =  LP64 = a normal 64-bit system                 */
-typedef unsigned char   uint8_t;
-typedef unsigned short  uint16_t;
-typedef unsigned int    uint32_t;
-#ifndef __int8_t_defined
-#define __int8_t_defined
-typedef          char    int8_t;
-typedef          short   int16_t;
-typedef          int     int32_t;
-#endif
-/* this system has a "long" of 64bit */
-#ifndef _HAVE_UINT64_T
-#define _HAVE_UINT64_T
-typedef unsigned long   uint64_t;
-typedef          long    int64_t;
-#endif
-#elif _STDINT_LONG_MODEL+0 == 448
-/*      LLP64   a 64-bit system derived from a 32-bit system */
-typedef unsigned char   uint8_t;
-typedef unsigned short  uint16_t;
-typedef unsigned int    uint32_t;
-#ifndef __int8_t_defined
-#define __int8_t_defined
-typedef          char    int8_t;
-typedef          short   int16_t;
-typedef          int     int32_t;
-#endif
-/* assuming the system has a "long long" */
-#ifndef _HAVE_UINT64_T
-#define _HAVE_UINT64_T
-#define _HAVE_LONGLONG_UINT64_T
-typedef unsigned long long uint64_t;
-typedef          long long  int64_t;
-#endif
-#else
-#define _STDINT_NO_INT32_T
-#endif
-#else
-#define _STDINT_NO_INT8_T
-#define _STDINT_NO_INT32_T
-#endif
-#endif
-
-/*
- * quote from SunOS-5.8 sys/inttypes.h:
- * Use at your own risk.  As of February 1996, the committee is squarely
- * behind the fixed sized types; the "least" and "fast" types are still being
- * discussed.  The probability that the "fast" types may be removed before
- * the standard is finalized is high enough that they are not currently
- * implemented.
- */
-
-#if defined _STDINT_NEED_INT_LEAST_T
-typedef  int8_t    int_least8_t;
-typedef  int16_t   int_least16_t;
-typedef  int32_t   int_least32_t;
-#ifdef _HAVE_UINT64_T
-typedef  int64_t   int_least64_t;
-#endif
-
-typedef uint8_t   uint_least8_t;
-typedef uint16_t  uint_least16_t;
-typedef uint32_t  uint_least32_t;
-#ifdef _HAVE_UINT64_T
-typedef uint64_t  uint_least64_t;
-#endif
-  /* least types */
-#endif
-
-#if defined _STDINT_NEED_INT_FAST_T
-typedef  int8_t    int_fast8_t;
-typedef  int       int_fast16_t;
-typedef  int32_t   int_fast32_t;
-#ifdef _HAVE_UINT64_T
-typedef  int64_t   int_fast64_t;
-#endif
-
-typedef uint8_t   uint_fast8_t;
-typedef unsigned  uint_fast16_t;
-typedef uint32_t  uint_fast32_t;
-#ifdef _HAVE_UINT64_T
-typedef uint64_t  uint_fast64_t;
-#endif
-  /* fast types */
-#endif
-
-#ifdef _STDINT_NEED_INTMAX_T
-#ifdef _HAVE_UINT64_T
-typedef  int64_t       intmax_t;
-typedef uint64_t      uintmax_t;
-#else
-typedef          long  intmax_t;
-typedef unsigned long uintmax_t;
-#endif
-#endif
-
-#ifdef _STDINT_NEED_INTPTR_T
-#ifndef __intptr_t_defined
-#define __intptr_t_defined
-/* we encourage using "long" to store pointer values, never use "int" ! */
-#if   _STDINT_LONG_MODEL+0 == 242 || _STDINT_LONG_MODEL+0 == 484
-typedef  unsigned int   uintptr_t;
-typedef           int    intptr_t;
-#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL+0 == 444
-typedef  unsigned long  uintptr_t;
-typedef           long   intptr_t;
-#elif _STDINT_LONG_MODEL+0 == 448 && defined _HAVE_UINT64_T
-typedef        uint64_t uintptr_t;
-typedef         int64_t  intptr_t;
-#else /* matches typical system types ILP32 and LP64 - but not IP16 or LLP64 */
-typedef  unsigned long  uintptr_t;
-typedef           long   intptr_t;
-#endif
-#endif
-#endif
-
-/* The ISO C99 standard specifies that in C++ implementations these
-   should only be defined if explicitly requested.  */
-#if !defined __cplusplus || defined __STDC_CONSTANT_MACROS
-#ifndef UINT32_C
-
-/* Signed.  */
-# define INT8_C(c)      c
-# define INT16_C(c)     c
-# define INT32_C(c)     c
-# ifdef _HAVE_LONGLONG_UINT64_T
-#  define INT64_C(c)    c ## L
-# else
-#  define INT64_C(c)    c ## LL
-# endif
-
-/* Unsigned.  */
-# define UINT8_C(c)     c ## U
-# define UINT16_C(c)    c ## U
-# define UINT32_C(c)    c ## U
-# ifdef _HAVE_LONGLONG_UINT64_T
-#  define UINT64_C(c)   c ## UL
-# else
-#  define UINT64_C(c)   c ## ULL
-# endif
-
-/* Maximal type.  */
-# ifdef _HAVE_LONGLONG_UINT64_T
-#  define INTMAX_C(c)   c ## L
-#  define UINTMAX_C(c)  c ## UL
-# else
-#  define INTMAX_C(c)   c ## LL
-#  define UINTMAX_C(c)  c ## ULL
-# endif
-
-  /* literalnumbers */
-#endif
-#endif
-
-/* These limits are merily those of a two complement byte-oriented system */
-
-/* Minimum of signed integral types.  */
-# define INT8_MIN               (-128)
-# define INT16_MIN              (-32767-1)
-# define INT32_MIN              (-2147483647-1)
-#ifndef INT64_MIN
-# define INT64_MIN              (-__INT64_C(9223372036854775807)-1)
-#endif
-/* Maximum of signed integral types.  */
-# define INT8_MAX               (127)
-# define INT16_MAX              (32767)
-# define INT32_MAX              (2147483647)
-#ifndef INT64_MAX
-# define INT64_MAX              (__INT64_C(9223372036854775807))
-#endif
-
-/* Maximum of unsigned integral types.  */
-#ifndef UINT8_MAX
-# define UINT8_MAX              (255)
-#endif
-#ifndef UINT16_MAX
-# define UINT16_MAX             (65535)
-#endif
-# define UINT32_MAX             (4294967295U)
-#ifndef UINT64_MAX
-# define UINT64_MAX             (__UINT64_C(18446744073709551615))
-#endif
-
-/* Minimum of signed integral types having a minimum size.  */
-# define INT_LEAST8_MIN         INT8_MIN
-# define INT_LEAST16_MIN        INT16_MIN
-# define INT_LEAST32_MIN        INT32_MIN
-# define INT_LEAST64_MIN        INT64_MIN
-/* Maximum of signed integral types having a minimum size.  */
-# define INT_LEAST8_MAX         INT8_MAX
-# define INT_LEAST16_MAX        INT16_MAX
-# define INT_LEAST32_MAX        INT32_MAX
-# define INT_LEAST64_MAX        INT64_MAX
-
-/* Maximum of unsigned integral types having a minimum size.  */
-# define UINT_LEAST8_MAX        UINT8_MAX
-# define UINT_LEAST16_MAX       UINT16_MAX
-# define UINT_LEAST32_MAX       UINT32_MAX
-# define UINT_LEAST64_MAX       UINT64_MAX
-
-  /* shortcircuit*/
-#endif
-  /* once */
-#endif
-#endif
-STDINT_EOF
-fi
-    if cmp -s $ac_stdint_h $ac_stdint 2>/dev/null; then
-      AC_MSG_NOTICE([$ac_stdint_h is unchanged])
-    else
-      ac_dir=`AS_DIRNAME(["$ac_stdint_h"])`
-      AS_MKDIR_P(["$ac_dir"])
-      rm -f $ac_stdint_h
-      mv $ac_stdint $ac_stdint_h
-    fi
-],[# variables for create stdint.h replacement
-PACKAGE="$PACKAGE"
-VERSION="$VERSION"
-ac_stdint_h="$ac_stdint_h"
-_ac_stdint_h=AS_TR_CPP(_$PACKAGE-$ac_stdint_h)
-ac_cv_stdint_message="$ac_cv_stdint_message"
-ac_cv_header_stdint_t="$ac_cv_header_stdint_t"
-ac_cv_header_stdint_x="$ac_cv_header_stdint_x"
-ac_cv_header_stdint_o="$ac_cv_header_stdint_o"
-ac_cv_header_stdint_u="$ac_cv_header_stdint_u"
-ac_cv_type_uint64_t="$ac_cv_type_uint64_t"
-ac_cv_type_u_int64_t="$ac_cv_type_u_int64_t"
-ac_cv_char_data_model="$ac_cv_char_data_model"
-ac_cv_long_data_model="$ac_cv_long_data_model"
-ac_cv_type_int_least32_t="$ac_cv_type_int_least32_t"
-ac_cv_type_int_fast32_t="$ac_cv_type_int_fast32_t"
-ac_cv_type_intmax_t="$ac_cv_type_intmax_t"
-])
-])
diff --git a/cloog-0.17.0/isl/m4/ax_detect_git_head.m4 b/cloog-0.17.0/isl/m4/ax_detect_git_head.m4
deleted file mode 100644
index d585983..0000000
--- a/cloog-0.17.0/isl/m4/ax_detect_git_head.m4
+++ /dev/null
@@ -1,27 +0,0 @@
-AC_DEFUN([AX_DETECT_GIT_HEAD], [
-	AC_SUBST(GIT_HEAD_ID)
-	AC_SUBST(GIT_HEAD)
-	AC_SUBST(GIT_HEAD_VERSION)
-	if test -f $srcdir/.git/HEAD; then
-		GIT_HEAD="$srcdir/.git/index"
-		GIT_REPO="$srcdir/.git"
-		GIT_HEAD_ID=`GIT_DIR=$GIT_REPO git describe`
-	elif test -f $srcdir/GIT_HEAD_ID; then
-		GIT_HEAD_ID=`cat $srcdir/GIT_HEAD_ID`
-	else
-		mysrcdir=`(cd $srcdir; pwd)`
-		head=`basename $mysrcdir | sed -e 's/.*-//'`
-		head2=`echo $head | sed -e 's/[^0-9a-f]//'`
-		head3=`echo $head2 | sed -e 's/........................................//'`
-		if test "x$head3" = "x" -a "x$head" = "x$head2"; then
-			GIT_HEAD_ID="$head"
-		else
-			GIT_HEAD_ID="UNKNOWN"
-		fi
-	fi
-	if test -z "$GIT_REPO" ; then
-		GIT_HEAD_VERSION="$GIT_HEAD_ID"
-	else
-	    GIT_HEAD_VERSION="\`GIT_DIR=$GIT_REPO git describe\`"
-	fi
-])
diff --git a/cloog-0.17.0/isl/m4/ax_gcc_archflag.m4 b/cloog-0.17.0/isl/m4/ax_gcc_archflag.m4
deleted file mode 100644
index dedeef4..0000000
--- a/cloog-0.17.0/isl/m4/ax_gcc_archflag.m4
+++ /dev/null
@@ -1,213 +0,0 @@
-# ===========================================================================
-#         http://www.nongnu.org/autoconf-archive/ax_gcc_archflag.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_GCC_ARCHFLAG([PORTABLE?], [ACTION-SUCCESS], [ACTION-FAILURE])
-#
-# DESCRIPTION
-#
-#   This macro tries to guess the "native" arch corresponding to the target
-#   architecture for use with gcc's -march=arch or -mtune=arch flags. If
-#   found, the cache variable $ax_cv_gcc_archflag is set to this flag and
-#   ACTION-SUCCESS is executed; otherwise $ax_cv_gcc_archflag is is set to
-#   "unknown" and ACTION-FAILURE is executed. The default ACTION-SUCCESS is
-#   to add $ax_cv_gcc_archflag to the end of $CFLAGS.
-#
-#   PORTABLE? should be either [yes] (default) or [no]. In the former case,
-#   the flag is set to -mtune (or equivalent) so that the architecture is
-#   only used for tuning, but the instruction set used is still portable. In
-#   the latter case, the flag is set to -march (or equivalent) so that
-#   architecture-specific instructions are enabled.
-#
-#   The user can specify --with-gcc-arch=<arch> in order to override the
-#   macro's choice of architecture, or --without-gcc-arch to disable this.
-#
-#   When cross-compiling, or if $CC is not gcc, then ACTION-FAILURE is
-#   called unless the user specified --with-gcc-arch manually.
-#
-#   Requires macros: AX_CHECK_COMPILER_FLAGS, AX_GCC_X86_CPUID
-#
-#   (The main emphasis here is on recent CPUs, on the principle that doing
-#   high-performance computing on old hardware is uncommon.)
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
-#   Copyright (c) 2008 Matteo Frigo
-#
-#   This program is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation, either version 3 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_GCC_ARCHFLAG],
-[AC_REQUIRE([AC_PROG_CC])
-AC_REQUIRE([AC_CANONICAL_HOST])
-
-AC_ARG_WITH(gcc-arch, [AC_HELP_STRING([--with-gcc-arch=<arch>], [use architecture <arch> for gcc -march/-mtune, instead of guessing])],
-	ax_gcc_arch=$withval, ax_gcc_arch=yes)
-
-AC_MSG_CHECKING([for gcc architecture flag])
-AC_MSG_RESULT([])
-AC_CACHE_VAL(ax_cv_gcc_archflag,
-[
-ax_cv_gcc_archflag="unknown"
-
-if test "$GCC" = yes; then
-
-if test "x$ax_gcc_arch" = xyes; then
-ax_gcc_arch=""
-if test "$cross_compiling" = no; then
-case $host_cpu in
-  i[[3456]]86*|x86_64*) # use cpuid codes, in part from x86info-1.7 by D. Jones
-     AX_GCC_X86_CPUID(0)
-     AX_GCC_X86_CPUID(1)
-     case $ax_cv_gcc_x86_cpuid_0 in
-       *:756e6547:*:*) # Intel
-          case $ax_cv_gcc_x86_cpuid_1 in
-	    *5[[48]]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;;
-	    *5??:*:*:*) ax_gcc_arch=pentium ;;
-	    *6[[3456]]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
-	    *6a?:*[[01]]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
-	    *6a?:*[[234]]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
-	    *6[[9d]]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;;
-	    *6[[78b]]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
-	    *6??:*:*:*) ax_gcc_arch=pentiumpro ;;
-            *f3[[347]]:*:*:*|*f4[1347]:*:*:*)
-		case $host_cpu in
-                  x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;;
-                  *) ax_gcc_arch="prescott pentium4 pentiumpro" ;;
-                esac ;;
-            *f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";;
-          esac ;;
-       *:68747541:*:*) # AMD
-          case $ax_cv_gcc_x86_cpuid_1 in
-	    *5[[67]]?:*:*:*) ax_gcc_arch=k6 ;;
-	    *5[[8d]]?:*:*:*) ax_gcc_arch="k6-2 k6" ;;
-	    *5[[9]]?:*:*:*) ax_gcc_arch="k6-3 k6" ;;
-	    *60?:*:*:*) ax_gcc_arch=k7 ;;
-	    *6[[12]]?:*:*:*) ax_gcc_arch="athlon k7" ;;
-	    *6[[34]]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;;
-	    *67?:*:*:*) ax_gcc_arch="athlon-4 athlon k7" ;;
-	    *6[[68a]]?:*:*:*)
-	       AX_GCC_X86_CPUID(0x80000006) # L2 cache size
-	       case $ax_cv_gcc_x86_cpuid_0x80000006 in
-                 *:*:*[[1-9a-f]]??????:*) # (L2 = ecx >> 16) >= 256
-			ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;;
-                 *) ax_gcc_arch="athlon-4 athlon k7" ;;
-	       esac ;;
-	    *f[[4cef8b]]?:*:*:*) ax_gcc_arch="athlon64 k8" ;;
-	    *f5?:*:*:*) ax_gcc_arch="opteron k8" ;;
-	    *f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;;
-	    *f??:*:*:*) ax_gcc_arch="k8" ;;
-          esac ;;
-	*:746e6543:*:*) # IDT
-	   case $ax_cv_gcc_x86_cpuid_1 in
-	     *54?:*:*:*) ax_gcc_arch=winchip-c6 ;;
-	     *58?:*:*:*) ax_gcc_arch=winchip2 ;;
-	     *6[[78]]?:*:*:*) ax_gcc_arch=c3 ;;
-	     *69?:*:*:*) ax_gcc_arch="c3-2 c3" ;;
-	   esac ;;
-     esac
-     if test x"$ax_gcc_arch" = x; then # fallback
-	case $host_cpu in
-	  i586*) ax_gcc_arch=pentium ;;
-	  i686*) ax_gcc_arch=pentiumpro ;;
-        esac
-     fi
-     ;;
-
-  sparc*)
-     AC_PATH_PROG([PRTDIAG], [prtdiag], [prtdiag], [$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/])
-     cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null`
-     cputype=`echo "$cputype" | tr -d ' -' |tr $as_cr_LETTERS $as_cr_letters`
-     case $cputype in
-         *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;;
-         *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;;
-         *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;;
-         *supersparc*|*tms390z5[[05]]*) ax_gcc_arch="supersparc v8" ;;
-         *hypersparc*|*rt62[[056]]*) ax_gcc_arch="hypersparc v8" ;;
-         *cypress*) ax_gcc_arch=cypress ;;
-     esac ;;
-
-  alphaev5) ax_gcc_arch=ev5 ;;
-  alphaev56) ax_gcc_arch=ev56 ;;
-  alphapca56) ax_gcc_arch="pca56 ev56" ;;
-  alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;;
-  alphaev6) ax_gcc_arch=ev6 ;;
-  alphaev67) ax_gcc_arch=ev67 ;;
-  alphaev68) ax_gcc_arch="ev68 ev67" ;;
-  alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;;
-  alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;;
-  alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;;
-
-  powerpc*)
-     cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null`
-     cputype=`echo $cputype | sed -e 's/ppc//g;s/ *//g'`
-     case $cputype in
-       *750*) ax_gcc_arch="750 G3" ;;
-       *740[[0-9]]*) ax_gcc_arch="$cputype 7400 G4" ;;
-       *74[[4-5]][[0-9]]*) ax_gcc_arch="$cputype 7450 G4" ;;
-       *74[[0-9]][[0-9]]*) ax_gcc_arch="$cputype G4" ;;
-       *970*) ax_gcc_arch="970 G5 power4";;
-       *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";;
-       *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";;
-       603ev|8240) ax_gcc_arch="$cputype 603e 603";;
-       *) ax_gcc_arch=$cputype ;;
-     esac
-     ax_gcc_arch="$ax_gcc_arch powerpc"
-     ;;
-esac
-fi # not cross-compiling
-fi # guess arch
-
-if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then
-for arch in $ax_gcc_arch; do
-  if test "x[]m4_default([$1],yes)" = xyes; then # if we require portable code
-    flags="-mtune=$arch"
-    # -mcpu=$arch and m$arch generate nonportable code on every arch except
-    # x86.  And some other arches (e.g. Alpha) don't accept -mtune.  Grrr.
-    case $host_cpu in i*86|x86_64*) flags="$flags -mcpu=$arch -m$arch";; esac
-  else
-    flags="-march=$arch -mcpu=$arch -m$arch"
-  fi
-  for flag in $flags; do
-    AX_CHECK_COMPILER_FLAGS($flag, [ax_cv_gcc_archflag=$flag; break])
-  done
-  test "x$ax_cv_gcc_archflag" = xunknown || break
-done
-fi
-
-fi # $GCC=yes
-])
-AC_MSG_CHECKING([for gcc architecture flag])
-AC_MSG_RESULT($ax_cv_gcc_archflag)
-if test "x$ax_cv_gcc_archflag" = xunknown; then
-  m4_default([$3],:)
-else
-  m4_default([$2], [CFLAGS="$CFLAGS $ax_cv_gcc_archflag"])
-fi
-])
diff --git a/cloog-0.17.0/isl/m4/ax_gcc_warn_unused_result.m4 b/cloog-0.17.0/isl/m4/ax_gcc_warn_unused_result.m4
deleted file mode 100644
index a957f8f..0000000
--- a/cloog-0.17.0/isl/m4/ax_gcc_warn_unused_result.m4
+++ /dev/null
@@ -1,56 +0,0 @@
-# ===========================================================================
-#    http://www.nongnu.org/autoconf-archive/ax_gcc_warn_unused_result.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_GCC_WARN_UNUSED_RESULT
-#
-# DESCRIPTION
-#
-#   The macro will compile a test program to see whether the compiler does
-#   understand the per-function postfix pragma.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
-#
-#   This program is free software; you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation; either version 2 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_GCC_WARN_UNUSED_RESULT],[dnl
-AC_CACHE_CHECK(
- [whether the compiler supports function __attribute__((__warn_unused_result__))],
- ax_cv_gcc_warn_unused_result,[
- AC_TRY_COMPILE([__attribute__((__warn_unused_result__))
- int f(int i) { return i; }],
- [],
- ax_cv_gcc_warn_unused_result=yes, ax_cv_gcc_warn_unused_result=no)])
- if test "$ax_cv_gcc_warn_unused_result" = yes; then
-   AC_DEFINE([GCC_WARN_UNUSED_RESULT],[__attribute__((__warn_unused_result__))],
-    [most gcc compilers know a function __attribute__((__warn_unused_result__))])
- fi
-])
diff --git a/cloog-0.17.0/isl/m4/ax_gcc_x86_cpuid.m4 b/cloog-0.17.0/isl/m4/ax_gcc_x86_cpuid.m4
deleted file mode 100644
index 5420b09..0000000
--- a/cloog-0.17.0/isl/m4/ax_gcc_x86_cpuid.m4
+++ /dev/null
@@ -1,77 +0,0 @@
-# ===========================================================================
-#        http://www.nongnu.org/autoconf-archive/ax_gcc_x86_cpuid.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_GCC_X86_CPUID(OP)
-#
-# DESCRIPTION
-#
-#   On Pentium and later x86 processors, with gcc or a compiler that has a
-#   compatible syntax for inline assembly instructions, run a small program
-#   that executes the cpuid instruction with input OP. This can be used to
-#   detect the CPU type.
-#
-#   On output, the values of the eax, ebx, ecx, and edx registers are stored
-#   as hexadecimal strings as "eax:ebx:ecx:edx" in the cache variable
-#   ax_cv_gcc_x86_cpuid_OP.
-#
-#   If the cpuid instruction fails (because you are running a
-#   cross-compiler, or because you are not using gcc, or because you are on
-#   a processor that doesn't have this instruction), ax_cv_gcc_x86_cpuid_OP
-#   is set to the string "unknown".
-#
-#   This macro mainly exists to be used in AX_GCC_ARCHFLAG.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
-#   Copyright (c) 2008 Matteo Frigo
-#
-#   This program is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation, either version 3 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_GCC_X86_CPUID],
-[AC_REQUIRE([AC_PROG_CC])
-AC_LANG_PUSH([C])
-AC_CACHE_CHECK(for x86 cpuid $1 output, ax_cv_gcc_x86_cpuid_$1,
- [AC_RUN_IFELSE([AC_LANG_PROGRAM([#include <stdio.h>], [
-     int op = $1, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-])],
-     [ax_cv_gcc_x86_cpuid_$1=`cat conftest_cpuid`; rm -f conftest_cpuid],
-     [ax_cv_gcc_x86_cpuid_$1=unknown; rm -f conftest_cpuid],
-     [ax_cv_gcc_x86_cpuid_$1=unknown])])
-AC_LANG_POP([C])
-])
diff --git a/cloog-0.17.0/isl/m4/ax_set_warning_flags.m4 b/cloog-0.17.0/isl/m4/ax_set_warning_flags.m4
deleted file mode 100644
index c64ad7d..0000000
--- a/cloog-0.17.0/isl/m4/ax_set_warning_flags.m4
+++ /dev/null
@@ -1,17 +0,0 @@
-dnl Add a set of flags to WARNING_FLAGS, that enable compiler warnings for
-dnl isl. The warnings that are enabled vary with the compiler and only include
-dnl warnings that did not trigger at the time of adding these flags.
-AC_DEFUN([AX_SET_WARNING_FLAGS],[dnl
-	AX_COMPILER_VENDOR
-
-	WARNING_FLAGS=""
-
-	if test "${ax_cv_c_compiler_vendor}" = "clang"; then
-		dnl isl is at the moment clean of -Wall warnings.  If clang adds
-		dnl new warnings to -Wall which cause false positives, the
-		dnl specific warning types will be disabled explicitally (by
-		dnl adding for example -Wno-return-type). To temporarily disable
-		dnl all warnings run configure with CFLAGS=-Wno-all.
-		WARNING_FLAGS="-Wall"
-	fi
-])
diff --git a/cloog-0.17.0/isl/m4/ax_submodule.m4 b/cloog-0.17.0/isl/m4/ax_submodule.m4
deleted file mode 100644
index 7cf8995..0000000
--- a/cloog-0.17.0/isl/m4/ax_submodule.m4
+++ /dev/null
@@ -1,71 +0,0 @@
-AC_DEFUN([AX_SUBMODULE],
-[
-
-m4_if(m4_bregexp($2,|,choice),choice,
-	[AC_ARG_WITH($1,
-		[AS_HELP_STRING([--with-$1=$2],
-				[Which $1 to use [default=$3]])])])
-case "system" in
-$2)
-	AC_ARG_WITH($1_prefix,
-		    [AS_HELP_STRING([--with-$1-prefix=DIR],
-				    [Prefix of $1 installation])])
-	AC_ARG_WITH($1_exec_prefix,
-		    [AS_HELP_STRING([--with-$1-exec-prefix=DIR],
-				    [Exec prefix of $1 installation])])
-esac
-m4_if(m4_bregexp($2,build,build),build,
-	[AC_ARG_WITH($1_builddir,
-		[AS_HELP_STRING([--with-$1-builddir=DIR],
-				[Location of $1 builddir])])])
-if test "x$with_$1_prefix" != "x" -a "x$with_$1_exec_prefix" = "x"; then
-	with_$1_exec_prefix=$with_$1_prefix
-fi
-if test "x$with_$1_prefix" != "x" -o "x$with_$1_exec_prefix" != "x"; then
-	if test "x$with_$1" != "x" -a "x$with_$1" != "xyes" -a "x$with_$1" != "xsystem"; then
-		AC_MSG_ERROR([Setting $with_$1_prefix implies use of system $1])
-	fi
-	with_$1="system"
-fi
-if test "x$with_$1_builddir" != "x"; then
-	if test "x$with_$1" != "x" -a "x$with_$1" != "xyes" -a "x$with_$1" != "xbuild"; then
-		AC_MSG_ERROR([Setting $with_$1_builddir implies use of build $1])
-	fi
-	with_$1="build"
-	$1_srcdir=`echo @abs_srcdir@ | $with_$1_builddir/config.status --file=-`
-	AC_MSG_NOTICE($1 sources in $$1_srcdir)
-fi
-if test "x$with_$1_exec_prefix" != "x"; then
-	export PKG_CONFIG_PATH="$with_$1_exec_prefix/lib/pkgconfig${PKG_CONFIG_PATH+:$PKG_CONFIG_PATH}"
-fi
-case "$with_$1" in
-$2)
-	;;
-*)
-	case "$3" in
-	bundled)
-		if test -d $srcdir/.git -a \
-			-d $srcdir/$1 -a \
-			! -d $srcdir/$1/.git; then
-			AC_MSG_WARN([git repo detected, but submodule $1 not initialized])
-			AC_MSG_WARN([You may want to run])
-			AC_MSG_WARN([	git submodule init])
-			AC_MSG_WARN([	git submodule update])
-			AC_MSG_WARN([	sh autogen.sh])
-		fi
-		if test -f $srcdir/$1/configure; then
-			with_$1="bundled"
-		else
-			with_$1="no"
-		fi
-		;;
-	*)
-		with_$1="$3"
-		;;
-	esac
-	;;
-esac
-AC_MSG_CHECKING([which $1 to use])
-AC_MSG_RESULT($with_$1)
-
-])
diff --git a/cloog-0.17.0/isl/m4/libtool.m4 b/cloog-0.17.0/isl/m4/libtool.m4
deleted file mode 100644
index a3fee53..0000000
--- a/cloog-0.17.0/isl/m4/libtool.m4
+++ /dev/null
@@ -1,7377 +0,0 @@
-# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
-#
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008 Free Software Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-m4_define([_LT_COPYING], [dnl
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008 Free Software Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-])
-
-# serial 56 LT_INIT
-
-
-# LT_PREREQ(VERSION)
-# ------------------
-# Complain and exit if this libtool version is less that VERSION.
-m4_defun([LT_PREREQ],
-[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
-       [m4_default([$3],
-		   [m4_fatal([Libtool version $1 or higher is required],
-		             63)])],
-       [$2])])
-
-
-# _LT_CHECK_BUILDDIR
-# ------------------
-# Complain if the absolute build directory name contains unusual characters
-m4_defun([_LT_CHECK_BUILDDIR],
-[case `pwd` in
-  *\ * | *\	*)
-    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
-esac
-])
-
-
-# LT_INIT([OPTIONS])
-# ------------------
-AC_DEFUN([LT_INIT],
-[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
-AC_BEFORE([$0], [LT_LANG])dnl
-AC_BEFORE([$0], [LT_OUTPUT])dnl
-AC_BEFORE([$0], [LTDL_INIT])dnl
-m4_require([_LT_CHECK_BUILDDIR])dnl
-
-dnl Autoconf doesn't catch unexpanded LT_ macros by default:
-m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
-m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
-dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
-dnl unless we require an AC_DEFUNed macro:
-AC_REQUIRE([LTOPTIONS_VERSION])dnl
-AC_REQUIRE([LTSUGAR_VERSION])dnl
-AC_REQUIRE([LTVERSION_VERSION])dnl
-AC_REQUIRE([LTOBSOLETE_VERSION])dnl
-m4_require([_LT_PROG_LTMAIN])dnl
-
-dnl Parse OPTIONS
-_LT_SET_OPTIONS([$0], [$1])
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-AC_SUBST(LIBTOOL)dnl
-
-_LT_SETUP
-
-# Only expand once:
-m4_define([LT_INIT])
-])# LT_INIT
-
-# Old names:
-AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
-AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
-dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
-
-
-# _LT_CC_BASENAME(CC)
-# -------------------
-# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
-m4_defun([_LT_CC_BASENAME],
-[for cc_temp in $1""; do
-  case $cc_temp in
-    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
-    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
-])
-
-
-# _LT_FILEUTILS_DEFAULTS
-# ----------------------
-# It is okay to use these file commands and assume they have been set
-# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
-m4_defun([_LT_FILEUTILS_DEFAULTS],
-[: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-])# _LT_FILEUTILS_DEFAULTS
-
-
-# _LT_SETUP
-# ---------
-m4_defun([_LT_SETUP],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-_LT_DECL([], [host_alias], [0], [The host system])dnl
-_LT_DECL([], [host], [0])dnl
-_LT_DECL([], [host_os], [0])dnl
-dnl
-_LT_DECL([], [build_alias], [0], [The build system])dnl
-_LT_DECL([], [build], [0])dnl
-_LT_DECL([], [build_os], [0])dnl
-dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([LT_PATH_LD])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-dnl
-AC_REQUIRE([AC_PROG_LN_S])dnl
-test -z "$LN_S" && LN_S="ln -s"
-_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
-dnl
-AC_REQUIRE([LT_CMD_MAX_LEN])dnl
-_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
-_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
-dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_CHECK_SHELL_FEATURES])dnl
-m4_require([_LT_CMD_RELOAD])dnl
-m4_require([_LT_CHECK_MAGIC_METHOD])dnl
-m4_require([_LT_CMD_OLD_ARCHIVE])dnl
-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-
-_LT_CONFIG_LIBTOOL_INIT([
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-])
-if test -n "${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-_LT_CHECK_OBJDIR
-
-m4_require([_LT_TAG_COMPILER])dnl
-_LT_PROG_ECHO_BACKSLASH
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\([["`\\]]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-_LT_CC_BASENAME([$compiler])
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    _LT_PATH_MAGIC
-  fi
-  ;;
-esac
-
-# Use C for the default configuration in the libtool script
-LT_SUPPORTED_TAG([CC])
-_LT_LANG_C_CONFIG
-_LT_LANG_DEFAULT_CONFIG
-_LT_CONFIG_COMMANDS
-])# _LT_SETUP
-
-
-# _LT_PROG_LTMAIN
-# ---------------
-# Note that this code is called both from `configure', and `config.status'
-# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
-# `config.status' has no value for ac_aux_dir unless we are using Automake,
-# so we pass a copy along to make sure it has a sensible value anyway.
-m4_defun([_LT_PROG_LTMAIN],
-[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
-_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
-ltmain="$ac_aux_dir/ltmain.sh"
-])# _LT_PROG_LTMAIN
-
-
-## ------------------------------------- ##
-## Accumulate code for creating libtool. ##
-## ------------------------------------- ##
-
-# So that we can recreate a full libtool script including additional
-# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
-# in macros and then make a single call at the end using the `libtool'
-# label.
-
-
-# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
-# ----------------------------------------
-# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-m4_define([_LT_CONFIG_LIBTOOL_INIT],
-[m4_ifval([$1],
-          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
-                     [$1
-])])])
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_INIT])
-
-
-# _LT_CONFIG_LIBTOOL([COMMANDS])
-# ------------------------------
-# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-m4_define([_LT_CONFIG_LIBTOOL],
-[m4_ifval([$1],
-          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
-                     [$1
-])])])
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
-
-
-# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
-# -----------------------------------------------------
-m4_defun([_LT_CONFIG_SAVE_COMMANDS],
-[_LT_CONFIG_LIBTOOL([$1])
-_LT_CONFIG_LIBTOOL_INIT([$2])
-])
-
-
-# _LT_FORMAT_COMMENT([COMMENT])
-# -----------------------------
-# Add leading comment marks to the start of each line, and a trailing
-# full-stop to the whole comment if one is not present already.
-m4_define([_LT_FORMAT_COMMENT],
-[m4_ifval([$1], [
-m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
-              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
-)])
-
-
-
-## ------------------------ ##
-## FIXME: Eliminate VARNAME ##
-## ------------------------ ##
-
-
-# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
-# -------------------------------------------------------------------
-# CONFIGNAME is the name given to the value in the libtool script.
-# VARNAME is the (base) name used in the configure script.
-# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
-# VARNAME.  Any other value will be used directly.
-m4_define([_LT_DECL],
-[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
-    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
-	[m4_ifval([$1], [$1], [$2])])
-    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
-    m4_ifval([$4],
-	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
-    lt_dict_add_subkey([lt_decl_dict], [$2],
-	[tagged?], [m4_ifval([$5], [yes], [no])])])
-])
-
-
-# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
-# --------------------------------------------------------
-m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
-
-
-# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
-# ------------------------------------------------
-m4_define([lt_decl_tag_varnames],
-[_lt_decl_filter([tagged?], [yes], $@)])
-
-
-# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
-# ---------------------------------------------------------
-m4_define([_lt_decl_filter],
-[m4_case([$#],
-  [0], [m4_fatal([$0: too few arguments: $#])],
-  [1], [m4_fatal([$0: too few arguments: $#: $1])],
-  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
-  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
-  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
-])
-
-
-# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
-# --------------------------------------------------
-m4_define([lt_decl_quote_varnames],
-[_lt_decl_filter([value], [1], $@)])
-
-
-# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
-# ---------------------------------------------------
-m4_define([lt_decl_dquote_varnames],
-[_lt_decl_filter([value], [2], $@)])
-
-
-# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
-# ---------------------------------------------------
-m4_define([lt_decl_varnames_tagged],
-[m4_assert([$# <= 2])dnl
-_$0(m4_quote(m4_default([$1], [[, ]])),
-    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
-    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
-m4_define([_lt_decl_varnames_tagged],
-[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
-
-
-# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
-# ------------------------------------------------
-m4_define([lt_decl_all_varnames],
-[_$0(m4_quote(m4_default([$1], [[, ]])),
-     m4_if([$2], [],
-	   m4_quote(lt_decl_varnames),
-	m4_quote(m4_shift($@))))[]dnl
-])
-m4_define([_lt_decl_all_varnames],
-[lt_join($@, lt_decl_varnames_tagged([$1],
-			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
-])
-
-
-# _LT_CONFIG_STATUS_DECLARE([VARNAME])
-# ------------------------------------
-# Quote a variable value, and forward it to `config.status' so that its
-# declaration there will have the same value as in `configure'.  VARNAME
-# must have a single quote delimited value for this to work.
-m4_define([_LT_CONFIG_STATUS_DECLARE],
-[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`'])
-
-
-# _LT_CONFIG_STATUS_DECLARATIONS
-# ------------------------------
-# We delimit libtool config variables with single quotes, so when
-# we write them to config.status, we have to be sure to quote all
-# embedded single quotes properly.  In configure, this macro expands
-# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
-#
-#    <var>='`$ECHO "X$<var>" | $Xsed -e "$delay_single_quote_subst"`'
-m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
-[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
-    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
-
-
-# _LT_LIBTOOL_TAGS
-# ----------------
-# Output comment and list of tags supported by the script
-m4_defun([_LT_LIBTOOL_TAGS],
-[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
-available_tags="_LT_TAGS"dnl
-])
-
-
-# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
-# -----------------------------------
-# Extract the dictionary values for VARNAME (optionally with TAG) and
-# expand to a commented shell variable setting:
-#
-#    # Some comment about what VAR is for.
-#    visible_name=$lt_internal_name
-m4_define([_LT_LIBTOOL_DECLARE],
-[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
-					   [description])))[]dnl
-m4_pushdef([_libtool_name],
-    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
-m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
-    [0], [_libtool_name=[$]$1],
-    [1], [_libtool_name=$lt_[]$1],
-    [2], [_libtool_name=$lt_[]$1],
-    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
-m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
-])
-
-
-# _LT_LIBTOOL_CONFIG_VARS
-# -----------------------
-# Produce commented declarations of non-tagged libtool config variables
-# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
-# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
-# section) are produced by _LT_LIBTOOL_TAG_VARS.
-m4_defun([_LT_LIBTOOL_CONFIG_VARS],
-[m4_foreach([_lt_var],
-    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
-    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
-
-
-# _LT_LIBTOOL_TAG_VARS(TAG)
-# -------------------------
-m4_define([_LT_LIBTOOL_TAG_VARS],
-[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
-    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
-
-
-# _LT_TAGVAR(VARNAME, [TAGNAME])
-# ------------------------------
-m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
-
-
-# _LT_CONFIG_COMMANDS
-# -------------------
-# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
-# variables for single and double quote escaping we saved from calls
-# to _LT_DECL, we can put quote escaped variables declarations
-# into `config.status', and then the shell code to quote escape them in
-# for loops in `config.status'.  Finally, any additional code accumulated
-# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
-m4_defun([_LT_CONFIG_COMMANDS],
-[AC_PROVIDE_IFELSE([LT_OUTPUT],
-	dnl If the libtool generation code has been placed in $CONFIG_LT,
-	dnl instead of duplicating it all over again into config.status,
-	dnl then we will have config.status run $CONFIG_LT later, so it
-	dnl needs to know what name is stored there:
-        [AC_CONFIG_COMMANDS([libtool],
-            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
-    dnl If the libtool generation code is destined for config.status,
-    dnl expand the accumulated commands and init code now:
-    [AC_CONFIG_COMMANDS([libtool],
-        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
-])#_LT_CONFIG_COMMANDS
-
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
-[
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-_LT_CONFIG_STATUS_DECLARATIONS
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# Quote evaled strings.
-for var in lt_decl_all_varnames([[ \
-]], lt_decl_quote_varnames); do
-    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
-    *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Double-quote double-evaled strings.
-for var in lt_decl_all_varnames([[ \
-]], lt_decl_dquote_varnames); do
-    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
-    *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Fix-up fallback echo if it was mangled by the above quoting rules.
-case \$lt_ECHO in
-*'\\\[$]0 --fallback-echo"')dnl "
-  lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\`
-  ;;
-esac
-
-_LT_OUTPUT_LIBTOOL_INIT
-])
-
-
-# LT_OUTPUT
-# ---------
-# This macro allows early generation of the libtool script (before
-# AC_OUTPUT is called), incase it is used in configure for compilation
-# tests.
-AC_DEFUN([LT_OUTPUT],
-[: ${CONFIG_LT=./config.lt}
-AC_MSG_NOTICE([creating $CONFIG_LT])
-cat >"$CONFIG_LT" <<_LTEOF
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate a libtool stub with the current configuration.
-
-lt_cl_silent=false
-SHELL=\${CONFIG_SHELL-$SHELL}
-_LTEOF
-
-cat >>"$CONFIG_LT" <<\_LTEOF
-AS_SHELL_SANITIZE
-_AS_PREPARE
-
-exec AS_MESSAGE_FD>&1
-exec AS_MESSAGE_LOG_FD>>config.log
-{
-  echo
-  AS_BOX([Running $as_me.])
-} >&AS_MESSAGE_LOG_FD
-
-lt_cl_help="\
-\`$as_me' creates a local libtool stub from the current configuration,
-for use in further configure time tests before the real libtool is
-generated.
-
-Usage: $[0] [[OPTIONS]]
-
-  -h, --help      print this help, then exit
-  -V, --version   print version number, then exit
-  -q, --quiet     do not print progress messages
-  -d, --debug     don't remove temporary files
-
-Report bugs to <bug-libtool@gnu.org>."
-
-lt_cl_version="\
-m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
-m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
-configured by $[0], generated by m4_PACKAGE_STRING.
-
-Copyright (C) 2008 Free Software Foundation, Inc.
-This config.lt script is free software; the Free Software Foundation
-gives unlimited permision to copy, distribute and modify it."
-
-while test $[#] != 0
-do
-  case $[1] in
-    --version | --v* | -V )
-      echo "$lt_cl_version"; exit 0 ;;
-    --help | --h* | -h )
-      echo "$lt_cl_help"; exit 0 ;;
-    --debug | --d* | -d )
-      debug=: ;;
-    --quiet | --q* | --silent | --s* | -q )
-      lt_cl_silent=: ;;
-
-    -*) AC_MSG_ERROR([unrecognized option: $[1]
-Try \`$[0] --help' for more information.]) ;;
-
-    *) AC_MSG_ERROR([unrecognized argument: $[1]
-Try \`$[0] --help' for more information.]) ;;
-  esac
-  shift
-done
-
-if $lt_cl_silent; then
-  exec AS_MESSAGE_FD>/dev/null
-fi
-_LTEOF
-
-cat >>"$CONFIG_LT" <<_LTEOF
-_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
-_LTEOF
-
-cat >>"$CONFIG_LT" <<\_LTEOF
-AC_MSG_NOTICE([creating $ofile])
-_LT_OUTPUT_LIBTOOL_COMMANDS
-AS_EXIT(0)
-_LTEOF
-chmod +x "$CONFIG_LT"
-
-# configure is writing to config.log, but config.lt does its own redirection,
-# appending to config.log, which fails on DOS, as config.log is still kept
-# open by configure.  Here we exec the FD to /dev/null, effectively closing
-# config.log, so it can be properly (re)opened and appended to by config.lt.
-if test "$no_create" != yes; then
-  lt_cl_success=:
-  test "$silent" = yes &&
-    lt_config_lt_args="$lt_config_lt_args --quiet"
-  exec AS_MESSAGE_LOG_FD>/dev/null
-  $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
-  exec AS_MESSAGE_LOG_FD>>config.log
-  $lt_cl_success || AS_EXIT(1)
-fi
-])# LT_OUTPUT
-
-
-# _LT_CONFIG(TAG)
-# ---------------
-# If TAG is the built-in tag, create an initial libtool script with a
-# default configuration from the untagged config vars.  Otherwise add code
-# to config.status for appending the configuration named by TAG from the
-# matching tagged config vars.
-m4_defun([_LT_CONFIG],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-_LT_CONFIG_SAVE_COMMANDS([
-  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
-  m4_if(_LT_TAG, [C], [
-    # See if we are running on zsh, and set the options which allow our
-    # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
-      setopt NO_GLOB_SUBST
-    fi
-
-    cfgfile="${ofile}T"
-    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
-    $RM "$cfgfile"
-
-    cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $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.
-#
-_LT_COPYING
-_LT_LIBTOOL_TAGS
-
-# ### BEGIN LIBTOOL CONFIG
-_LT_LIBTOOL_CONFIG_VARS
-_LT_LIBTOOL_TAG_VARS
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
-  case $host_os in
-  aix3*)
-    cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-_LT_EOF
-    ;;
-  esac
-
-  _LT_PROG_LTMAIN
-
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  _LT_PROG_XSI_SHELLFNS
-
-  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  mv -f "$cfgfile" "$ofile" ||
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
-],
-[cat <<_LT_EOF >> "$ofile"
-
-dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
-dnl in a comment (ie after a #).
-# ### BEGIN LIBTOOL TAG CONFIG: $1
-_LT_LIBTOOL_TAG_VARS(_LT_TAG)
-# ### END LIBTOOL TAG CONFIG: $1
-_LT_EOF
-])dnl /m4_if
-],
-[m4_if([$1], [], [
-    PACKAGE='$PACKAGE'
-    VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
-    RM='$RM'
-    ofile='$ofile'], [])
-])dnl /_LT_CONFIG_SAVE_COMMANDS
-])# _LT_CONFIG
-
-
-# LT_SUPPORTED_TAG(TAG)
-# ---------------------
-# Trace this macro to discover what tags are supported by the libtool
-# --tag option, using:
-#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
-AC_DEFUN([LT_SUPPORTED_TAG], [])
-
-
-# C support is built-in for now
-m4_define([_LT_LANG_C_enabled], [])
-m4_define([_LT_TAGS], [])
-
-
-# LT_LANG(LANG)
-# -------------
-# Enable libtool support for the given language if not already enabled.
-AC_DEFUN([LT_LANG],
-[AC_BEFORE([$0], [LT_OUTPUT])dnl
-m4_case([$1],
-  [C],			[_LT_LANG(C)],
-  [C++],		[_LT_LANG(CXX)],
-  [Java],		[_LT_LANG(GCJ)],
-  [Fortran 77],		[_LT_LANG(F77)],
-  [Fortran],		[_LT_LANG(FC)],
-  [Windows Resource],	[_LT_LANG(RC)],
-  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
-    [_LT_LANG($1)],
-    [m4_fatal([$0: unsupported language: "$1"])])])dnl
-])# LT_LANG
-
-
-# _LT_LANG(LANGNAME)
-# ------------------
-m4_defun([_LT_LANG],
-[m4_ifdef([_LT_LANG_]$1[_enabled], [],
-  [LT_SUPPORTED_TAG([$1])dnl
-  m4_append([_LT_TAGS], [$1 ])dnl
-  m4_define([_LT_LANG_]$1[_enabled], [])dnl
-  _LT_LANG_$1_CONFIG($1)])dnl
-])# _LT_LANG
-
-
-# _LT_LANG_DEFAULT_CONFIG
-# -----------------------
-m4_defun([_LT_LANG_DEFAULT_CONFIG],
-[AC_PROVIDE_IFELSE([AC_PROG_CXX],
-  [LT_LANG(CXX)],
-  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
-
-AC_PROVIDE_IFELSE([AC_PROG_F77],
-  [LT_LANG(F77)],
-  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
-
-AC_PROVIDE_IFELSE([AC_PROG_FC],
-  [LT_LANG(FC)],
-  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
-
-dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
-dnl pulling things in needlessly.
-AC_PROVIDE_IFELSE([AC_PROG_GCJ],
-  [LT_LANG(GCJ)],
-  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
-    [LT_LANG(GCJ)],
-    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
-      [LT_LANG(GCJ)],
-      [m4_ifdef([AC_PROG_GCJ],
-	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
-       m4_ifdef([A][M_PROG_GCJ],
-	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
-       m4_ifdef([LT_PROG_GCJ],
-	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
-
-AC_PROVIDE_IFELSE([LT_PROG_RC],
-  [LT_LANG(RC)],
-  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
-])# _LT_LANG_DEFAULT_CONFIG
-
-# Obsolete macros:
-AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
-AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
-AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
-AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
-dnl AC_DEFUN([AC_LIBTOOL_F77], [])
-dnl AC_DEFUN([AC_LIBTOOL_FC], [])
-dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
-
-
-# _LT_TAG_COMPILER
-# ----------------
-m4_defun([_LT_TAG_COMPILER],
-[AC_REQUIRE([AC_PROG_CC])dnl
-
-_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
-_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
-_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
-_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-])# _LT_TAG_COMPILER
-
-
-# _LT_COMPILER_BOILERPLATE
-# ------------------------
-# Check for compiler boilerplate output or warnings with
-# the simple compiler test code.
-m4_defun([_LT_COMPILER_BOILERPLATE],
-[m4_require([_LT_DECL_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-])# _LT_COMPILER_BOILERPLATE
-
-
-# _LT_LINKER_BOILERPLATE
-# ----------------------
-# Check for linker boilerplate output or warnings with
-# the simple link test code.
-m4_defun([_LT_LINKER_BOILERPLATE],
-[m4_require([_LT_DECL_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-])# _LT_LINKER_BOILERPLATE
-
-# _LT_REQUIRED_DARWIN_CHECKS
-# -------------------------
-m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
-  case $host_os in
-    rhapsody* | darwin*)
-    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
-    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
-    AC_CHECK_TOOL([LIPO], [lipo], [:])
-    AC_CHECK_TOOL([OTOOL], [otool], [:])
-    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
-    _LT_DECL([], [DSYMUTIL], [1],
-      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
-    _LT_DECL([], [NMEDIT], [1],
-      [Tool to change global to local symbols on Mac OS X])
-    _LT_DECL([], [LIPO], [1],
-      [Tool to manipulate fat objects and archives on Mac OS X])
-    _LT_DECL([], [OTOOL], [1],
-      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
-    _LT_DECL([], [OTOOL64], [1],
-      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
-
-    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
-      [lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
-	# By default we will add the -single_module flag. You can override
-	# by either setting the environment variable LT_MULTI_MODULE
-	# non-empty at configure time, or by adding -multi_module to the
-	# link flags.
-	rm -rf libconftest.dylib*
-	echo "int foo(void){return 1;}" > conftest.c
-	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
-	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
-        _lt_result=$?
-	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
-	  lt_cv_apple_cc_single_mod=yes
-	else
-	  cat conftest.err >&AS_MESSAGE_LOG_FD
-	fi
-	rm -rf libconftest.dylib*
-	rm -f conftest.*
-      fi])
-    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
-      [lt_cv_ld_exported_symbols_list],
-      [lt_cv_ld_exported_symbols_list=no
-      save_LDFLAGS=$LDFLAGS
-      echo "_main" > conftest.sym
-      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
-	[lt_cv_ld_exported_symbols_list=yes],
-	[lt_cv_ld_exported_symbols_list=no])
-	LDFLAGS="$save_LDFLAGS"
-    ])
-    case $host_os in
-    rhapsody* | darwin1.[[012]])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-    darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-    darwin*) # darwin 5.x on
-      # if running on 10.5 or later, the deployment target defaults
-      # to the OS version, if on x86, and 10.4, the deployment
-      # target defaults to 10.4. Don't you love it?
-      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[[012]]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-      esac
-    ;;
-  esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-      _lt_dar_single_mod='$single_module'
-    fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-    else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    fi
-    if test "$DSYMUTIL" != ":"; then
-      _lt_dsymutil='~$DSYMUTIL $lib || :'
-    else
-      _lt_dsymutil=
-    fi
-    ;;
-  esac
-])
-
-
-# _LT_DARWIN_LINKER_FEATURES
-# --------------------------
-# Checks for linker and compiler features on darwin
-m4_defun([_LT_DARWIN_LINKER_FEATURES],
-[
-  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
-  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-  _LT_TAGVAR(hardcode_direct, $1)=no
-  _LT_TAGVAR(hardcode_automatic, $1)=yes
-  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  _LT_TAGVAR(whole_archive_flag_spec, $1)=''
-  _LT_TAGVAR(link_all_deplibs, $1)=yes
-  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=echo
-    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-    m4_if([$1], [CXX],
-[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
-    fi
-],[])
-  else
-  _LT_TAGVAR(ld_shlibs, $1)=no
-  fi
-])
-
-# _LT_SYS_MODULE_PATH_AIX
-# -----------------------
-# Links a minimal program and checks the executable
-# for the system default hardcoded library path. In most cases,
-# this is /usr/lib:/lib, but when the MPI compilers are used
-# the location of the communication and MPI libs are included too.
-# If we don't find anything, use the default library path according
-# to the aix ld manual.
-m4_defun([_LT_SYS_MODULE_PATH_AIX],
-[m4_require([_LT_DECL_SED])dnl
-AC_LINK_IFELSE(AC_LANG_PROGRAM,[
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi],[])
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-])# _LT_SYS_MODULE_PATH_AIX
-
-
-# _LT_SHELL_INIT(ARG)
-# -------------------
-m4_define([_LT_SHELL_INIT],
-[ifdef([AC_DIVERSION_NOTICE],
-	     [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
-	 [AC_DIVERT_PUSH(NOTICE)])
-$1
-AC_DIVERT_POP
-])# _LT_SHELL_INIT
-
-
-# _LT_PROG_ECHO_BACKSLASH
-# -----------------------
-# Add some code to the start of the generated configure script which
-# will find an echo command which doesn't interpret backslashes.
-m4_defun([_LT_PROG_ECHO_BACKSLASH],
-[_LT_SHELL_INIT([
-# Check that we are running under the correct shell.
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-case X$lt_ECHO in
-X*--fallback-echo)
-  # Remove one level of quotation (which was required for Make).
-  ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
-  ;;
-esac
-
-ECHO=${lt_ECHO-echo}
-if test "X[$]1" = X--no-reexec; then
-  # Discard the --no-reexec flag, and continue.
-  shift
-elif test "X[$]1" = X--fallback-echo; then
-  # Avoid inline document here, it may be left over
-  :
-elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
-  # Yippee, $ECHO works!
-  :
-else
-  # Restart under the correct shell.
-  exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
-fi
-
-if test "X[$]1" = X--fallback-echo; then
-  # used as fallback echo
-  shift
-  cat <<_LT_EOF
-[$]*
-_LT_EOF
-  exit 0
-fi
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test -z "$lt_ECHO"; then
-  if test "X${echo_test_string+set}" != Xset; then
-    # find a string as large as possible, as long as the shell can cope with it
-    for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
-      # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
-      if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
-	 { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
-      then
-        break
-      fi
-    done
-  fi
-
-  if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
-     echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
-     test "X$echo_testing_string" = "X$echo_test_string"; then
-    :
-  else
-    # The Solaris, AIX, and Digital Unix default echo programs unquote
-    # backslashes.  This makes it impossible to quote backslashes using
-    #   echo "$something" | sed 's/\\/\\\\/g'
-    #
-    # So, first we look for a working echo in the user's PATH.
-
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for dir in $PATH /usr/ucb; do
-      IFS="$lt_save_ifs"
-      if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
-         test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
-         echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
-         test "X$echo_testing_string" = "X$echo_test_string"; then
-        ECHO="$dir/echo"
-        break
-      fi
-    done
-    IFS="$lt_save_ifs"
-
-    if test "X$ECHO" = Xecho; then
-      # We didn't find a better echo, so look for alternatives.
-      if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
-         echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
-         test "X$echo_testing_string" = "X$echo_test_string"; then
-        # This shell has a builtin print -r that does the trick.
-        ECHO='print -r'
-      elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
-	   test "X$CONFIG_SHELL" != X/bin/ksh; then
-        # If we have ksh, try running configure again with it.
-        ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
-        export ORIGINAL_CONFIG_SHELL
-        CONFIG_SHELL=/bin/ksh
-        export CONFIG_SHELL
-        exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
-      else
-        # Try using printf.
-        ECHO='printf %s\n'
-        if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
-	   echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
-	   test "X$echo_testing_string" = "X$echo_test_string"; then
-	  # Cool, printf works
-	  :
-        elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
-	     test "X$echo_testing_string" = 'X\t' &&
-	     echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-	     test "X$echo_testing_string" = "X$echo_test_string"; then
-	  CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
-	  export CONFIG_SHELL
-	  SHELL="$CONFIG_SHELL"
-	  export SHELL
-	  ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
-        elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
-	     test "X$echo_testing_string" = 'X\t' &&
-	     echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-	     test "X$echo_testing_string" = "X$echo_test_string"; then
-	  ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
-        else
-	  # maybe with a smaller string...
-	  prev=:
-
-	  for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
-	    if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
-	    then
-	      break
-	    fi
-	    prev="$cmd"
-	  done
-
-	  if test "$prev" != 'sed 50q "[$]0"'; then
-	    echo_test_string=`eval $prev`
-	    export echo_test_string
-	    exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
-	  else
-	    # Oops.  We lost completely, so just stick with echo.
-	    ECHO=echo
-	  fi
-        fi
-      fi
-    fi
-  fi
-fi
-
-# Copy echo and quote the copy suitably for passing to libtool from
-# the Makefile, instead of quoting the original, which is used later.
-lt_ECHO=$ECHO
-if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
-   lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
-fi
-
-AC_SUBST(lt_ECHO)
-])
-_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
-_LT_DECL([], [ECHO], [1],
-    [An echo program that does not interpret backslashes])
-])# _LT_PROG_ECHO_BACKSLASH
-
-
-# _LT_ENABLE_LOCK
-# ---------------
-m4_defun([_LT_ENABLE_LOCK],
-[AC_ARG_ENABLE([libtool-lock],
-  [AS_HELP_STRING([--disable-libtool-lock],
-    [avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.$ac_objext` in
-      *ELF-32*)
-	HPUX_IA64_MODE="32"
-	;;
-      *ELF-64*)
-	HPUX_IA64_MODE="64"
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '[#]line __oline__ "configure"' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -melf32bsmip"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -melf32bmipn32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -melf64bmip"
-	;;
-      esac
-    else
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -32"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -n32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -64"
-	  ;;
-      esac
-    fi
-  fi
-  rm -rf conftest*
-  ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-      *32-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_i386_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_i386"
-	    ;;
-	  ppc64-*linux*|powerpc64-*linux*)
-	    LD="${LD-ld} -m elf32ppclinux"
-	    ;;
-	  s390x-*linux*)
-	    LD="${LD-ld} -m elf_s390"
-	    ;;
-	  sparc64-*linux*)
-	    LD="${LD-ld} -m elf32_sparc"
-	    ;;
-	esac
-	;;
-      *64-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_x86_64_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_x86_64"
-	    ;;
-	  ppc*-*linux*|powerpc*-*linux*)
-	    LD="${LD-ld} -m elf64ppc"
-	    ;;
-	  s390*-*linux*|s390*-*tpf*)
-	    LD="${LD-ld} -m elf64_s390"
-	    ;;
-	  sparc*-*linux*)
-	    LD="${LD-ld} -m elf64_sparc"
-	    ;;
-	esac
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
-    [AC_LANG_PUSH(C)
-     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
-     AC_LANG_POP])
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-sparc*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
-      *)
-	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
-	  LD="${LD-ld} -64"
-	fi
-	;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-esac
-
-need_locks="$enable_libtool_lock"
-])# _LT_ENABLE_LOCK
-
-
-# _LT_CMD_OLD_ARCHIVE
-# -------------------
-m4_defun([_LT_CMD_OLD_ARCHIVE],
-[AC_CHECK_TOOL(AR, ar, false)
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-_LT_DECL([], [AR], [1], [The archiver])
-_LT_DECL([], [AR_FLAGS], [1])
-
-AC_CHECK_TOOL(STRIP, strip, :)
-test -z "$STRIP" && STRIP=:
-_LT_DECL([], [STRIP], [1], [A symbol stripping program])
-
-AC_CHECK_TOOL(RANLIB, ranlib, :)
-test -z "$RANLIB" && RANLIB=:
-_LT_DECL([], [RANLIB], [1],
-    [Commands used to install an old-style archive])
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
-fi
-_LT_DECL([], [old_postinstall_cmds], [2])
-_LT_DECL([], [old_postuninstall_cmds], [2])
-_LT_TAGDECL([], [old_archive_cmds], [2],
-    [Commands used to build an old-style archive])
-])# _LT_CMD_OLD_ARCHIVE
-
-
-# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------------------
-# Check whether the given compiler option works
-AC_DEFUN([_LT_COMPILER_OPTION],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$3"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       $2=yes
-     fi
-   fi
-   $RM conftest*
-])
-
-if test x"[$]$2" = xyes; then
-    m4_if([$5], , :, [$5])
-else
-    m4_if([$6], , :, [$6])
-fi
-])# _LT_COMPILER_OPTION
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
-
-
-# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#                  [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------
-# Check whether the given linker option works
-AC_DEFUN([_LT_LINKER_OPTION],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $3"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&AS_MESSAGE_LOG_FD
-       $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         $2=yes
-       fi
-     else
-       $2=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-])
-
-if test x"[$]$2" = xyes; then
-    m4_if([$4], , :, [$4])
-else
-    m4_if([$5], , :, [$5])
-fi
-])# _LT_LINKER_OPTION
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
-
-
-# LT_CMD_MAX_LEN
-#---------------
-AC_DEFUN([LT_CMD_MAX_LEN],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-# find the maximum length of command line arguments
-AC_MSG_CHECKING([the maximum length of command line arguments])
-AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
-  i=0
-  teststring="ABCD"
-
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
-
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
-
-  cygwin* | mingw* | cegcc*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
-
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
-
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    else
-      # Make teststring a little bigger before we do anything with it.
-      # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
-        teststring=$teststring$teststring
-      done
-      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-      # If test is not a shell built-in, we'll probably end up computing a
-      # maximum length that is only half of the actual maximum length, but
-      # we can't tell.
-      while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
-	         = "XX$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
-      do
-        i=`expr $i + 1`
-        teststring=$teststring$teststring
-      done
-      # Only check the string length outside the loop.
-      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
-      teststring=
-      # Add a significant safety factor because C++ compilers can tack on
-      # massive amounts of additional arguments before passing them to the
-      # linker.  It appears as though 1/2 is a usable value.
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    fi
-    ;;
-  esac
-])
-if test -n $lt_cv_sys_max_cmd_len ; then
-  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
-else
-  AC_MSG_RESULT(none)
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-_LT_DECL([], [max_cmd_len], [0],
-    [What is the maximum length of a command?])
-])# LT_CMD_MAX_LEN
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
-
-
-# _LT_HEADER_DLFCN
-# ----------------
-m4_defun([_LT_HEADER_DLFCN],
-[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
-])# _LT_HEADER_DLFCN
-
-
-# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
-#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
-# ----------------------------------------------------------------
-m4_defun([_LT_TRY_DLOPEN_SELF],
-[m4_require([_LT_HEADER_DLFCN])dnl
-if test "$cross_compiling" = yes; then :
-  [$4]
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-[#line __oline__ "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-void fnord() { int i=42;}
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}]
-_LT_EOF
-  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) $1 ;;
-      x$lt_dlneed_uscore) $2 ;;
-      x$lt_dlunknown|x*) $3 ;;
-    esac
-  else :
-    # compilation failed
-    $3
-  fi
-fi
-rm -fr conftest*
-])# _LT_TRY_DLOPEN_SELF
-
-
-# LT_SYS_DLOPEN_SELF
-# ------------------
-AC_DEFUN([LT_SYS_DLOPEN_SELF],
-[m4_require([_LT_HEADER_DLFCN])dnl
-if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-    ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-    ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ])
-    ;;
-
-  *)
-    AC_CHECK_FUNC([shl_load],
-	  [lt_cv_dlopen="shl_load"],
-      [AC_CHECK_LIB([dld], [shl_load],
-	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
-	[AC_CHECK_FUNC([dlopen],
-	      [lt_cv_dlopen="dlopen"],
-	  [AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
-	    [AC_CHECK_LIB([svld], [dlopen],
-		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
-	      [AC_CHECK_LIB([dld], [dld_link],
-		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
-	      ])
-	    ])
-	  ])
-	])
-      ])
-    ;;
-  esac
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    AC_CACHE_CHECK([whether a program can dlopen itself],
-	  lt_cv_dlopen_self, [dnl
-	  _LT_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
-	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
-    ])
-
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
-	  lt_cv_dlopen_self_static, [dnl
-	  _LT_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
-	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
-      ])
-    fi
-
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
-
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-_LT_DECL([dlopen_support], [enable_dlopen], [0],
-	 [Whether dlopen is supported])
-_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
-	 [Whether dlopen of programs is supported])
-_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
-	 [Whether dlopen of statically linked programs is supported])
-])# LT_SYS_DLOPEN_SELF
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
-
-
-# _LT_COMPILER_C_O([TAGNAME])
-# ---------------------------
-# Check to see if options -c and -o are simultaneously supported by compiler.
-# This macro does not hard code the compiler like AC_PROG_CC_C_O.
-m4_defun([_LT_COMPILER_C_O],
-[m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
-  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
-  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-     fi
-   fi
-   chmod u+w . 2>&AS_MESSAGE_LOG_FD
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-])
-_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
-	[Does compiler simultaneously support -c and -o options?])
-])# _LT_COMPILER_C_O
-
-
-# _LT_COMPILER_FILE_LOCKS([TAGNAME])
-# ----------------------------------
-# Check to see if we can do hard links to lock some files if needed
-m4_defun([_LT_COMPILER_FILE_LOCKS],
-[m4_require([_LT_ENABLE_LOCK])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-_LT_COMPILER_C_O([$1])
-
-hard_links="nottested"
-if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  AC_MSG_CHECKING([if we can lock with hard links])
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  AC_MSG_RESULT([$hard_links])
-  if test "$hard_links" = no; then
-    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
-])# _LT_COMPILER_FILE_LOCKS
-
-
-# _LT_CHECK_OBJDIR
-# ----------------
-m4_defun([_LT_CHECK_OBJDIR],
-[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
-[rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null])
-objdir=$lt_cv_objdir
-_LT_DECL([], [objdir], [0],
-         [The name of the directory that contains temporary libtool files])dnl
-m4_pattern_allow([LT_OBJDIR])dnl
-AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
-  [Define to the sub-directory in which libtool stores uninstalled libraries.])
-])# _LT_CHECK_OBJDIR
-
-
-# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
-# --------------------------------------
-# Check hardcoding attributes.
-m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
-[AC_MSG_CHECKING([how to hardcode library paths into programs])
-_LT_TAGVAR(hardcode_action, $1)=
-if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
-   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
-   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
-     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
-    # Linking always hardcodes the temporary library directory.
-    _LT_TAGVAR(hardcode_action, $1)=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    _LT_TAGVAR(hardcode_action, $1)=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  _LT_TAGVAR(hardcode_action, $1)=unsupported
-fi
-AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
-
-if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
-   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-_LT_TAGDECL([], [hardcode_action], [0],
-    [How to hardcode a shared library path into an executable])
-])# _LT_LINKER_HARDCODE_LIBPATH
-
-
-# _LT_CMD_STRIPLIB
-# ----------------
-m4_defun([_LT_CMD_STRIPLIB],
-[m4_require([_LT_DECL_EGREP])
-striplib=
-old_striplib=
-AC_MSG_CHECKING([whether stripping libraries is possible])
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  AC_MSG_RESULT([yes])
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-  darwin*)
-    if test -n "$STRIP" ; then
-      striplib="$STRIP -x"
-      old_striplib="$STRIP -S"
-      AC_MSG_RESULT([yes])
-    else
-      AC_MSG_RESULT([no])
-    fi
-    ;;
-  *)
-    AC_MSG_RESULT([no])
-    ;;
-  esac
-fi
-_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
-_LT_DECL([], [striplib], [1])
-])# _LT_CMD_STRIPLIB
-
-
-# _LT_SYS_DYNAMIC_LINKER([TAG])
-# -----------------------------
-# PORTME Fill in your ld.so characteristics
-m4_defun([_LT_SYS_DYNAMIC_LINKER],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_OBJDUMP])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_MSG_CHECKING([dynamic linker characteristics])
-m4_if([$1],
-	[], [
-if test "$GCC" = yes; then
-  case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
-  esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-  if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'`
-  else
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-  fi
-  # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
-  lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
-  for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
-      test -d "$lt_sys_path" && \
-	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
-    fi
-  done
-  lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
-  for (lt_i = NF; lt_i > 0; lt_i--) {
-    if ($lt_i != "" && $lt_i != ".") {
-      if ($lt_i == "..") {
-        lt_count++;
-      } else {
-        if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
-        } else {
-          lt_count--;
-        }
-      }
-    }
-  }
-  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
-  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
-}'`
-  sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi])
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[[4-9]]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[[01]] | aix4.[[01]].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[[45]]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
-        # It is most probably a Windows format PATH printed by
-        # mingw gcc, but we are running on Cygwin. Gcc prints its search
-        # path with ; separators, and with drive letters. We can handle the
-        # drive letters (cygwin fileutils understands them), so leave them,
-        # especially as we might pass files found there to a mingw objdump,
-        # which wouldn't understand a cygwinified path. Ahh.
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
-
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-m4_if([$1], [],[
-  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd1*)
-  dynamic_linker=no
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[[123]]*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
-  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555.
-  postinstall_cmds='chmod 555 $lib'
-  ;;
-
-interix[[3-9]]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  # Some binutils ld are patched to set DT_RUNPATH
-  save_LDFLAGS=$LDFLAGS
-  save_libdir=$libdir
-  eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
-       LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
-  AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
-    [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
-       [shlibpath_overrides_runpath=yes])])
-  LDFLAGS=$save_LDFLAGS
-  libdir=$save_libdir
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsdelf*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='NetBSD ld.elf_so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[[89]] | openbsd2.[[89]].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-AC_MSG_RESULT([$dynamic_linker])
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-_LT_DECL([], [variables_saved_for_relink], [1],
-    [Variables whose values should be saved in libtool wrapper scripts and
-    restored at link time])
-_LT_DECL([], [need_lib_prefix], [0],
-    [Do we need the "lib" prefix for modules?])
-_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
-_LT_DECL([], [version_type], [0], [Library versioning type])
-_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
-_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
-_LT_DECL([], [shlibpath_overrides_runpath], [0],
-    [Is shlibpath searched before the hard-coded library search path?])
-_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
-_LT_DECL([], [library_names_spec], [1],
-    [[List of archive names.  First name is the real one, the rest are links.
-    The last name is the one that the linker finds with -lNAME]])
-_LT_DECL([], [soname_spec], [1],
-    [[The coded name of the library, if different from the real name]])
-_LT_DECL([], [postinstall_cmds], [2],
-    [Command to use after installation of a shared archive])
-_LT_DECL([], [postuninstall_cmds], [2],
-    [Command to use after uninstallation of a shared archive])
-_LT_DECL([], [finish_cmds], [2],
-    [Commands used to finish a libtool library installation in a directory])
-_LT_DECL([], [finish_eval], [1],
-    [[As "finish_cmds", except a single script fragment to be evaled but
-    not shown]])
-_LT_DECL([], [hardcode_into_libs], [0],
-    [Whether we should hardcode library paths into libraries])
-_LT_DECL([], [sys_lib_search_path_spec], [2],
-    [Compile-time system search path for libraries])
-_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
-    [Run-time system search path for libraries])
-])# _LT_SYS_DYNAMIC_LINKER
-
-
-# _LT_PATH_TOOL_PREFIX(TOOL)
-# --------------------------
-# find a file program which can recognize shared library
-AC_DEFUN([_LT_PATH_TOOL_PREFIX],
-[m4_require([_LT_DECL_EGREP])dnl
-AC_MSG_CHECKING([for $1])
-AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
-[case $MAGIC_CMD in
-[[\\/*] |  ?:[\\/]*])
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-dnl $ac_dummy forces splitting on constant user-supplied paths.
-dnl POSIX.2 word splitting is done only on the output of word expansions,
-dnl not every word.  This closes a longstanding sh security hole.
-  ac_dummy="m4_if([$2], , $PATH, [$2])"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$1; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac])
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  AC_MSG_RESULT($MAGIC_CMD)
-else
-  AC_MSG_RESULT(no)
-fi
-_LT_DECL([], [MAGIC_CMD], [0],
-	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
-])# _LT_PATH_TOOL_PREFIX
-
-# Old name:
-AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
-
-
-# _LT_PATH_MAGIC
-# --------------
-# find a file program which can recognize a shared library
-m4_defun([_LT_PATH_MAGIC],
-[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
-  else
-    MAGIC_CMD=:
-  fi
-fi
-])# _LT_PATH_MAGIC
-
-
-# LT_PATH_LD
-# ----------
-# find the pathname to the GNU or non-GNU linker
-AC_DEFUN([LT_PATH_LD],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_DECL_EGREP])dnl
-
-AC_ARG_WITH([gnu-ld],
-    [AS_HELP_STRING([--with-gnu-ld],
-	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
-    [test "$withval" = no || with_gnu_ld=yes],
-    [with_gnu_ld=no])dnl
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  AC_MSG_CHECKING([for ld used by $CC])
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [[\\/]]* | ?:[[\\/]]*)
-      re_direlt='/[[^/]][[^/]]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  AC_MSG_CHECKING([for GNU ld])
-else
-  AC_MSG_CHECKING([for non-GNU ld])
-fi
-AC_CACHE_VAL(lt_cv_path_LD,
-[if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi])
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  AC_MSG_RESULT($LD)
-else
-  AC_MSG_RESULT(no)
-fi
-test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
-_LT_PATH_LD_GNU
-AC_SUBST([LD])
-
-_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
-])# LT_PATH_LD
-
-# Old names:
-AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
-AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_PROG_LD], [])
-dnl AC_DEFUN([AC_PROG_LD], [])
-
-
-# _LT_PATH_LD_GNU
-#- --------------
-m4_defun([_LT_PATH_LD_GNU],
-[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
-[# I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac])
-with_gnu_ld=$lt_cv_prog_gnu_ld
-])# _LT_PATH_LD_GNU
-
-
-# _LT_CMD_RELOAD
-# --------------
-# find reload flag for linker
-#   -- PORTME Some linkers may need a different reload flag.
-m4_defun([_LT_CMD_RELOAD],
-[AC_CACHE_CHECK([for $LD option to reload object files],
-  lt_cv_ld_reload_flag,
-  [lt_cv_ld_reload_flag='-r'])
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
-_LT_DECL([], [reload_flag], [1], [How to create reloadable object files])dnl
-_LT_DECL([], [reload_cmds], [2])dnl
-])# _LT_CMD_RELOAD
-
-
-# _LT_CHECK_MAGIC_METHOD
-# ----------------------
-# how to check for library dependencies
-#  -- PORTME fill in with the dynamic library characteristics
-m4_defun([_LT_CHECK_MAGIC_METHOD],
-[m4_require([_LT_DECL_EGREP])
-m4_require([_LT_DECL_OBJDUMP])
-AC_CACHE_CHECK([how to recognize dependent libraries],
-lt_cv_deplibs_check_method,
-[lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[[4-9]]*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[[45]]*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump',
-  # unless we find 'file', for example because we are cross-compiling.
-  if ( file / ) >/dev/null 2>&1; then
-    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-    lt_cv_file_magic_cmd='func_win32_libid'
-  else
-    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
-    lt_cv_file_magic_cmd='$OBJDUMP -f'
-  fi
-  ;;
-
-cegcc)
-  # use the weaker test based on 'objdump'. See mingw*.
-  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
-
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-freebsd* | dragonfly*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
-
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
-
-interix[[3-9]]*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd* | netbsdelf*-gnu)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
-  fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-*nto* | *qnx*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-rdos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-tpf*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-])
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-_LT_DECL([], [deplibs_check_method], [1],
-    [Method to check whether dependent libraries are shared objects])
-_LT_DECL([], [file_magic_cmd], [1],
-    [Command to use when deplibs_check_method == "file_magic"])
-])# _LT_CHECK_MAGIC_METHOD
-
-
-# LT_PATH_NM
-# ----------
-# find the pathname to a BSD- or MS-compatible name lister
-AC_DEFUN([LT_PATH_NM],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
-[if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  : ${lt_cv_path_NM=no}
-fi])
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
-else
-  # Didn't find any BSD compatible name lister, look for dumpbin.
-  AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :)
-  AC_SUBST([DUMPBIN])
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
-  fi
-fi
-test -z "$NM" && NM=nm
-AC_SUBST([NM])
-_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
-
-AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
-  [lt_cv_nm_interface="BSD nm"
-  echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
-  (eval "$ac_compile" 2>conftest.err)
-  cat conftest.err >&AS_MESSAGE_LOG_FD
-  (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
-  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
-  cat conftest.err >&AS_MESSAGE_LOG_FD
-  (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD)
-  cat conftest.out >&AS_MESSAGE_LOG_FD
-  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
-    lt_cv_nm_interface="MS dumpbin"
-  fi
-  rm -f conftest*])
-])# LT_PATH_NM
-
-# Old names:
-AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
-AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_PROG_NM], [])
-dnl AC_DEFUN([AC_PROG_NM], [])
-
-
-# LT_LIB_M
-# --------
-# check for math library
-AC_DEFUN([LT_LIB_M],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-LIBM=
-case $host in
-*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
-  # These system don't have libm, or don't need it
-  ;;
-*-ncr-sysv4.3*)
-  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
-  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
-  ;;
-*)
-  AC_CHECK_LIB(m, cos, LIBM="-lm")
-  ;;
-esac
-AC_SUBST([LIBM])
-])# LT_LIB_M
-
-# Old name:
-AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_CHECK_LIBM], [])
-
-
-# _LT_COMPILER_NO_RTTI([TAGNAME])
-# -------------------------------
-m4_defun([_LT_COMPILER_NO_RTTI],
-[m4_require([_LT_TAG_COMPILER])dnl
-
-_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-
-if test "$GCC" = yes; then
-  _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
-
-  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
-    lt_cv_prog_compiler_rtti_exceptions,
-    [-fno-rtti -fno-exceptions], [],
-    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
-fi
-_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
-	[Compiler flag to turn off builtin functions])
-])# _LT_COMPILER_NO_RTTI
-
-
-# _LT_CMD_GLOBAL_SYMBOLS
-# ----------------------
-m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-AC_REQUIRE([LT_PATH_LD])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-AC_MSG_CHECKING([command to parse $NM output from $compiler object])
-AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
-[
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[[BCDEGRST]]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[[BCDT]]'
-  ;;
-cygwin* | mingw* | pw32* | cegcc*)
-  symcode='[[ABCDGISTW]]'
-  ;;
-hpux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[[ABCDEGRST]]'
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[[BCDEGRST]]'
-  ;;
-osf*)
-  symcode='[[BCDEGQRST]]'
-  ;;
-solaris*)
-  symcode='[[BDRT]]'
-  ;;
-sco3.2v5*)
-  symcode='[[DT]]'
-  ;;
-sysv4.2uw2*)
-  symcode='[[DT]]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[[ABDT]]'
-  ;;
-sysv4)
-  symcode='[[DFNSTU]]'
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[[ABCDGIRSTW]]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
-    # Also find C++ and __fastcall symbols from MSVC++,
-    # which start with @ or ?.
-    lt_cv_sys_global_symbol_pipe="$AWK ['"\
-"     {last_section=section; section=\$ 3};"\
-"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-"     \$ 0!~/External *\|/{next};"\
-"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-"     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-"     ' prfx=^$ac_symprfx]"
-  else
-    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-  fi
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
-  if AC_TRY_EVAL(ac_compile); then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
-	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<_LT_EOF > conftest.$ac_ext
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
-	  cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols.  */
-const struct {
-  const char *name;
-  void       *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[[]] =
-{
-  { "@PROGRAM@", (void *) 0 },
-_LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
-	  cat <<\_LT_EOF >> conftest.$ac_ext
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_save_LIBS="$LIBS"
-	  lt_save_CFLAGS="$CFLAGS"
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
-	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS="$lt_save_LIBS"
-	  CFLAGS="$lt_save_CFLAGS"
-	else
-	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
-    fi
-  else
-    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
-    cat conftest.$ac_ext >&5
-  fi
-  rm -rf conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-])
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  AC_MSG_RESULT(failed)
-else
-  AC_MSG_RESULT(ok)
-fi
-
-_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
-    [Take the output of nm and produce a listing of raw symbols and C names])
-_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
-    [Transform the output of nm in a proper C declaration])
-_LT_DECL([global_symbol_to_c_name_address],
-    [lt_cv_sys_global_symbol_to_c_name_address], [1],
-    [Transform the output of nm in a C name address pair])
-_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
-    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
-    [Transform the output of nm in a C name address pair when lib prefix is needed])
-]) # _LT_CMD_GLOBAL_SYMBOLS
-
-
-# _LT_COMPILER_PIC([TAGNAME])
-# ---------------------------
-m4_defun([_LT_COMPILER_PIC],
-[m4_require([_LT_TAG_COMPILER])dnl
-_LT_TAGVAR(lt_prog_compiler_wl, $1)=
-_LT_TAGVAR(lt_prog_compiler_pic, $1)=
-_LT_TAGVAR(lt_prog_compiler_static, $1)=
-
-AC_MSG_CHECKING([for $compiler option to produce PIC])
-m4_if([$1], [CXX], [
-  # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
-    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-    aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-    mingw* | cygwin* | os2* | pw32* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-    *djgpp*)
-      # DJGPP does not support shared libraries at all
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-      ;;
-    interix[[3-9]]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-    *qnx* | *nto*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-    *)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-  else
-    case $host_os in
-      aix[[4-9]]*)
-	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
-	  # AIX 5 now supports IA64 processor
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	else
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-	fi
-	;;
-      chorus*)
-	case $cc_basename in
-	cxch68*)
-	  # Green Hills C++ Compiler
-	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
-	  ;;
-	esac
-	;;
-      dgux*)
-	case $cc_basename in
-	  ec++*)
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  ghcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      freebsd* | dragonfly*)
-	# FreeBSD uses GNU C++
-	;;
-      hpux9* | hpux10* | hpux11*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	    fi
-	    ;;
-	  aCC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    case $host_cpu in
-	    hppa*64*|ia64*)
-	      # +Z the default
-	      ;;
-	    *)
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	      ;;
-	    esac
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      interix*)
-	# This is c89, which is MS Visual C++ (no shared libs)
-	# Anyone wants to do a port?
-	;;
-      irix5* | irix6* | nonstopux*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    # CC pic flag -KPIC is the default.
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-	case $cc_basename in
-	  KCC*)
-	    # KAI C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	    ;;
-	  ecpc* )
-	    # old Intel C++ for x86_64 which still supported -KPIC.
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	    ;;
-	  icpc* )
-	    # Intel C++, used to be incompatible with GCC.
-	    # ICC 10 doesn't accept -KPIC any more.
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	    ;;
-	  pgCC* | pgcpp*)
-	    # Portland Group C++ compiler
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  cxx*)
-	    # Compaq C++
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  xlc* | xlC*)
-	    # IBM XL 8.0 on PPC
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-      lynxos*)
-	;;
-      m88k*)
-	;;
-      mvs*)
-	case $cc_basename in
-	  cxx*)
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      netbsd* | netbsdelf*-gnu)
-	;;
-      *qnx* | *nto*)
-        # QNX uses GNU C++, but need to define -shared option too, otherwise
-        # it will coredump.
-        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-        ;;
-      osf3* | osf4* | osf5*)
-	case $cc_basename in
-	  KCC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    ;;
-	  RCC*)
-	    # Rational C++ 2.4.1
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  cxx*)
-	    # Digital/Compaq C++
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      psos*)
-	;;
-      solaris*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	    ;;
-	  gcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sunos4*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.x
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  lcc*)
-	    # Lucid
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	esac
-	;;
-      tandem*)
-	case $cc_basename in
-	  NCC*)
-	    # NonStop-UX NCC 3.20
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      vxworks*)
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-	;;
-    esac
-  fi
-],
-[
-  if test "$GCC" = yes; then
-    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	# +Z the default
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-
-    interix[[3-9]]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      enable_shared=no
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-
-    *)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      else
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC (with -KPIC) is the default.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
-      case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
-      ecc*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-        ;;
-      # icc used to be incompatible with GCC.
-      # ICC 10 doesn't accept -KPIC any more.
-      icc* | ifort*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-        ;;
-      # Lahey Fortran 8.1.
-      lf95*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
-	;;
-      pgcc* | pgf77* | pgf90* | pgf95*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-        ;;
-      ccc*)
-        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-        # All Alpha code is PIC.
-        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-        ;;
-      xl*)
-	# IBM XL C 8.0/Fortran 10.1 on PPC
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
-	;;
-      *)
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)
-	  # Sun C 5.9
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	  ;;
-	*Sun\ F*)
-	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
-	  ;;
-	esac
-	;;
-      esac
-      ;;
-
-    newsos6)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-
-    osf3* | osf4* | osf5*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # All OSF/1 code is PIC.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    rdos*)
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    solaris*)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    unicos*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-
-    uts4*)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    *)
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-    esac
-  fi
-])
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-    ;;
-  *)
-    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
-    ;;
-esac
-AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
-_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
-	[How to pass a linker flag through the compiler])
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
-  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
-    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
-    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
-    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
-     "" | " "*) ;;
-     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
-     esac],
-    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
-     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
-fi
-_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
-	[Additional compiler flags for building library objects])
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
-_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
-  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
-  $lt_tmp_static_flag,
-  [],
-  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
-_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
-	[Compiler flag to prevent dynamic linking])
-])# _LT_COMPILER_PIC
-
-
-# _LT_LINKER_SHLIBS([TAGNAME])
-# ----------------------------
-# See if the linker supports building shared libraries.
-m4_defun([_LT_LINKER_SHLIBS],
-[AC_REQUIRE([LT_PATH_LD])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-m4_if([$1], [CXX], [
-  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  case $host_os in
-  aix[[4-9]]*)
-    # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    else
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    fi
-    ;;
-  pw32*)
-    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
-  ;;
-  cygwin* | mingw* | cegcc*)
-    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  linux* | k*bsd*-gnu)
-    _LT_TAGVAR(link_all_deplibs, $1)=no
-  ;;
-  *)
-    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  esac
-  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
-], [
-  runpath_var=
-  _LT_TAGVAR(allow_undefined_flag, $1)=
-  _LT_TAGVAR(always_export_symbols, $1)=no
-  _LT_TAGVAR(archive_cmds, $1)=
-  _LT_TAGVAR(archive_expsym_cmds, $1)=
-  _LT_TAGVAR(compiler_needs_object, $1)=no
-  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
-  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  _LT_TAGVAR(hardcode_automatic, $1)=no
-  _LT_TAGVAR(hardcode_direct, $1)=no
-  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
-  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-  _LT_TAGVAR(hardcode_libdir_separator, $1)=
-  _LT_TAGVAR(hardcode_minus_L, $1)=no
-  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  _LT_TAGVAR(inherit_rpath, $1)=no
-  _LT_TAGVAR(link_all_deplibs, $1)=unknown
-  _LT_TAGVAR(module_cmds, $1)=
-  _LT_TAGVAR(module_expsym_cmds, $1)=
-  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
-  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
-  _LT_TAGVAR(thread_safe_flag_spec, $1)=
-  _LT_TAGVAR(whole_archive_flag_spec, $1)=
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  _LT_TAGVAR(include_expsyms, $1)=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  # Exclude shared library initialization/finalization symbols.
-dnl Note also adjust exclude_expsyms for C++ above.
-  extract_expsyms_cmds=
-
-  case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  linux* | k*bsd*-gnu)
-    _LT_TAGVAR(link_all_deplibs, $1)=no
-    ;;
-  esac
-
-  _LT_TAGVAR(ld_shlibs, $1)=yes
-  if test "$with_gnu_ld" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      _LT_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>&1` in
-      *GNU\ gold*) supports_anon_versioning=yes ;;
-      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[[3-9]]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
-
-_LT_EOF
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            _LT_TAGVAR(archive_expsym_cmds, $1)=''
-        ;;
-      m68k)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes
-        ;;
-      esac
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-      # as there is no search path for DLLs.
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(always_export_symbols, $1)=no
-      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
-
-      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    interix[[3-9]]*)
-      _LT_TAGVAR(hardcode_direct, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
-	case $cc_basename in
-	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
-	esac
-      fi
-      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
-      then
-	tmp_addflag=
-	tmp_sharedflag='-shared'
-	case $cc_basename,$host_cpu in
-        pgcc*)				# Portland Group C compiler
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	lf95*)				# Lahey Fortran 8.1
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
-	  tmp_sharedflag='--shared' ;;
-	xl[[cC]]*)			# IBM XL C 8.0 on PPC (deal with xlf below)
-	  tmp_sharedflag='-qmkshrobj'
-	  tmp_addflag= ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-	  _LT_TAGVAR(compiler_needs_object, $1)=yes
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	esac
-	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-        if test "x$supports_anon_versioning" = xyes; then
-          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-        fi
-
-	case $cc_basename in
-	xlf*)
-	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-	  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
-	  fi
-	  ;;
-	esac
-      else
-        _LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    netbsd* | netbsdelf*-gnu)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  # For security reasons, it is highly recommended that you always
-	  # use absolute paths for naming shared libraries, and exclude the
-	  # DT_RUNPATH tag from executables and libraries.  But doing so
-	  # requires that you compile everything twice, which is a pain.
-	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  else
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-    esac
-
-    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
-      runpath_var=
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
-      _LT_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(always_export_symbols, $1)=yes
-      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	_LT_TAGVAR(hardcode_direct, $1)=unsupported
-      fi
-      ;;
-
-    aix[[4-9]]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	else
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
-	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-	    aix_use_runtimelinking=yes
-	    break
-	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      _LT_TAGVAR(archive_cmds, $1)=''
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[[012]]|aix4.[[012]].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	  # We have reworked collect2
-	  :
-	  else
-	  # We have old collect2
-	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-	_LT_TAGVAR(link_all_deplibs, $1)=no
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      _LT_TAGVAR(always_export_symbols, $1)=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
-        # Determine the default libpath from the value encoded in an
-        # empty executable.
-        _LT_SYS_MODULE_PATH_AIX
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-      else
-	if test "$host_cpu" = ia64; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an
-	 # empty executable.
-	 _LT_SYS_MODULE_PATH_AIX
-	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	  # Exported symbols can be pulled into shared objects from archives
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            _LT_TAGVAR(archive_expsym_cmds, $1)=''
-        ;;
-      m68k)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes
-        ;;
-      esac
-      ;;
-
-    bsdi[[45]]*)
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
-      # FIXME: Should let the user specify the lib program.
-      _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
-      _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
-      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      ;;
-
-    darwin* | rhapsody*)
-      _LT_DARWIN_LINKER_FEATURES($1)
-      ;;
-
-    dgux*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    freebsd1*)
-      _LT_TAGVAR(ld_shlibs, $1)=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
-	_LT_TAGVAR(hardcode_direct, $1)=yes
-	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	_LT_TAGVAR(hardcode_minus_L, $1)=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  _LT_TAGVAR(hardcode_direct, $1)=no
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	  ;;
-	*)
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	# Try to use the -exported_symbol ld option, if it does not
-	# work, assume that -exports_file does not work either and
-	# implicitly export all symbols.
-        save_LDFLAGS="$LDFLAGS"
-        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-        AC_LINK_IFELSE(int foo(void) {},
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-        )
-        LDFLAGS="$save_LDFLAGS"
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(inherit_rpath, $1)=yes
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    netbsd* | netbsdelf*-gnu)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    newsos6)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *nto* | *qnx*)
-      ;;
-
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	_LT_TAGVAR(hardcode_direct, $1)=yes
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	else
-	  case $host_os in
-	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
-	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	     ;;
-	   *)
-	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-	fi
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    os2*)
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      else
-	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    solaris*)
-      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-      else
-	case `$CC -V 2>&1` in
-	*"Compilers 5.0"*)
-	  wlarc=''
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
-	  ;;
-	*)
-	  wlarc='${wl}'
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-	  ;;
-	esac
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      case $host_os in
-      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
-	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
-	  _LT_TAGVAR(hardcode_direct, $1)=no
-        ;;
-	motorola)
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4.3*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	_LT_TAGVAR(ld_shlibs, $1)=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      _LT_TAGVAR(ld_shlibs, $1)=no
-      ;;
-    esac
-
-    if test x$host_vendor = xsni; then
-      case $host in
-      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
-	;;
-      esac
-    fi
-  fi
-])
-AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
-
-_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
-_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
-_LT_DECL([], [extract_expsyms_cmds], [2],
-    [The commands to extract the exported symbol list from a shared archive])
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
-x|xyes)
-  # Assume -lc should be added
-  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $_LT_TAGVAR(archive_cmds, $1) in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      AC_MSG_CHECKING([whether -lc should be explicitly linked in])
-      $RM conftest*
-      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-      if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
-        soname=conftest
-        lib=conftest
-        libobjs=conftest.$ac_objext
-        deplibs=
-        wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
-	pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
-        compiler_flags=-v
-        linker_flags=-v
-        verstring=
-        output_objdir=.
-        libname=conftest
-        lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
-        _LT_TAGVAR(allow_undefined_flag, $1)=
-        if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
-        then
-	  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-        else
-	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-        fi
-        _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
-      else
-        cat conftest.err 1>&5
-      fi
-      $RM conftest*
-      AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)])
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
-    [Whether or not to add -lc for building shared libraries])
-_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
-    [enable_shared_with_static_runtimes], [0],
-    [Whether or not to disallow shared libs when runtime libs are static])
-_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
-    [Compiler flag to allow reflexive dlopens])
-_LT_TAGDECL([], [whole_archive_flag_spec], [1],
-    [Compiler flag to generate shared objects directly from archives])
-_LT_TAGDECL([], [compiler_needs_object], [1],
-    [Whether the compiler copes with passing no objects directly])
-_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
-    [Create an old-style archive from a shared archive])
-_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
-    [Create a temporary old-style archive to link instead of a shared archive])
-_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
-_LT_TAGDECL([], [archive_expsym_cmds], [2])
-_LT_TAGDECL([], [module_cmds], [2],
-    [Commands used to build a loadable module if different from building
-    a shared archive.])
-_LT_TAGDECL([], [module_expsym_cmds], [2])
-_LT_TAGDECL([], [with_gnu_ld], [1],
-    [Whether we are building with GNU ld or not])
-_LT_TAGDECL([], [allow_undefined_flag], [1],
-    [Flag that allows shared libraries with undefined symbols to be built])
-_LT_TAGDECL([], [no_undefined_flag], [1],
-    [Flag that enforces no undefined symbols])
-_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
-    [Flag to hardcode $libdir into a binary during linking.
-    This must work even if $libdir does not exist])
-_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1],
-    [[If ld is used when linking, flag to hardcode $libdir into a binary
-    during linking.  This must work even if $libdir does not exist]])
-_LT_TAGDECL([], [hardcode_libdir_separator], [1],
-    [Whether we need a single "-rpath" flag with a separated argument])
-_LT_TAGDECL([], [hardcode_direct], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
-    DIR into the resulting binary])
-_LT_TAGDECL([], [hardcode_direct_absolute], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
-    DIR into the resulting binary and the resulting library dependency is
-    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
-    library is relocated])
-_LT_TAGDECL([], [hardcode_minus_L], [0],
-    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-    into the resulting binary])
-_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
-    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-    into the resulting binary])
-_LT_TAGDECL([], [hardcode_automatic], [0],
-    [Set to "yes" if building a shared library automatically hardcodes DIR
-    into the library and all subsequent libraries and executables linked
-    against it])
-_LT_TAGDECL([], [inherit_rpath], [0],
-    [Set to yes if linker adds runtime paths of dependent libraries
-    to runtime path list])
-_LT_TAGDECL([], [link_all_deplibs], [0],
-    [Whether libtool must link a program against all its dependency libraries])
-_LT_TAGDECL([], [fix_srcfile_path], [1],
-    [Fix the shell variable $srcfile for the compiler])
-_LT_TAGDECL([], [always_export_symbols], [0],
-    [Set to "yes" if exported symbols are required])
-_LT_TAGDECL([], [export_symbols_cmds], [2],
-    [The commands to list exported symbols])
-_LT_TAGDECL([], [exclude_expsyms], [1],
-    [Symbols that should not be listed in the preloaded symbols])
-_LT_TAGDECL([], [include_expsyms], [1],
-    [Symbols that must always be exported])
-_LT_TAGDECL([], [prelink_cmds], [2],
-    [Commands necessary for linking programs (against libraries) with templates])
-_LT_TAGDECL([], [file_list_spec], [1],
-    [Specify filename containing input files])
-dnl FIXME: Not yet implemented
-dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
-dnl    [Compiler flag to generate thread safe objects])
-])# _LT_LINKER_SHLIBS
-
-
-# _LT_LANG_C_CONFIG([TAG])
-# ------------------------
-# Ensure that the configuration variables for a C compiler are suitably
-# defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_C_CONFIG],
-[m4_require([_LT_DECL_EGREP])dnl
-lt_save_CC="$CC"
-AC_LANG_PUSH(C)
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-_LT_TAG_COMPILER
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-  _LT_COMPILER_NO_RTTI($1)
-  _LT_COMPILER_PIC($1)
-  _LT_COMPILER_C_O($1)
-  _LT_COMPILER_FILE_LOCKS($1)
-  _LT_LINKER_SHLIBS($1)
-  _LT_SYS_DYNAMIC_LINKER($1)
-  _LT_LINKER_HARDCODE_LIBPATH($1)
-  LT_SYS_DLOPEN_SELF
-  _LT_CMD_STRIPLIB
-
-  # Report which library types will actually be built
-  AC_MSG_CHECKING([if libtool supports shared libraries])
-  AC_MSG_RESULT([$can_build_shared])
-
-  AC_MSG_CHECKING([whether to build shared libraries])
-  test "$can_build_shared" = "no" && enable_shared=no
-
-  # On AIX, shared libraries and static libraries use the same namespace, and
-  # are all built from PIC.
-  case $host_os in
-  aix3*)
-    test "$enable_shared" = yes && enable_static=no
-    if test -n "$RANLIB"; then
-      archive_cmds="$archive_cmds~\$RANLIB \$lib"
-      postinstall_cmds='$RANLIB $lib'
-    fi
-    ;;
-
-  aix[[4-9]]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
-    fi
-    ;;
-  esac
-  AC_MSG_RESULT([$enable_shared])
-
-  AC_MSG_CHECKING([whether to build static libraries])
-  # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
-  AC_MSG_RESULT([$enable_static])
-
-  _LT_CONFIG($1)
-fi
-AC_LANG_POP
-CC="$lt_save_CC"
-])# _LT_LANG_C_CONFIG
-
-
-# _LT_PROG_CXX
-# ------------
-# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++
-# compiler, we have our own version here.
-m4_defun([_LT_PROG_CXX],
-[
-pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes])
-AC_PROG_CXX
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
-  AC_PROG_CXXCPP
-else
-  _lt_caught_CXX_error=yes
-fi
-popdef([AC_MSG_ERROR])
-])# _LT_PROG_CXX
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([_LT_PROG_CXX], [])
-
-
-# _LT_LANG_CXX_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for a C++ compiler are suitably
-# defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_CXX_CONFIG],
-[AC_REQUIRE([_LT_PROG_CXX])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_EGREP])dnl
-
-AC_LANG_PUSH(C++)
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(compiler_needs_object, $1)=no
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for C++ test sources.
-ac_ext=cpp
-
-# Object file extension for compiled C++ test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the CXX compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="int some_variable = 0;"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC=$CC
-  lt_save_LD=$LD
-  lt_save_GCC=$GCC
-  GCC=$GXX
-  lt_save_with_gnu_ld=$with_gnu_ld
-  lt_save_path_LD=$lt_cv_path_LD
-  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
-    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
-  else
-    $as_unset lt_cv_prog_gnu_ld
-  fi
-  if test -n "${lt_cv_path_LDCXX+set}"; then
-    lt_cv_path_LD=$lt_cv_path_LDCXX
-  else
-    $as_unset lt_cv_path_LD
-  fi
-  test -z "${LDCXX+set}" || LD=$LDCXX
-  CC=${CXX-"c++"}
-  compiler=$CC
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-
-  if test -n "$compiler"; then
-    # We don't want -fno-exception when compiling C++ code, so set the
-    # no_builtin_flag separately
-    if test "$GXX" = yes; then
-      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
-    else
-      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-    fi
-
-    if test "$GXX" = yes; then
-      # Set up default GNU C++ configuration
-
-      LT_PATH_LD
-
-      # Check if GNU C++ uses GNU ld as the underlying linker, since the
-      # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-        # If archive_cmds runs LD, not CC, wlarc should be empty
-        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
-        #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
-
-        # ancient GNU ld didn't support --whole-archive et. al.
-        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
-	  $GREP 'no-whole-archive' > /dev/null; then
-          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-        else
-          _LT_TAGVAR(whole_archive_flag_spec, $1)=
-        fi
-      else
-        with_gnu_ld=no
-        wlarc=
-
-        # A generic and very simple default shared library creation
-        # command for GNU C++ for the case where it uses the native
-        # linker, instead of GNU ld.  If possible, this setting should
-        # overridden to take advantage of the native linker features on
-        # the platform it is being used on.
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-      fi
-
-      # Commands to make compiler produce verbose output that lists
-      # what "hidden" libraries, object files and flags are used when
-      # linking a shared library.
-      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
-
-    else
-      GXX=no
-      with_gnu_ld=no
-      wlarc=
-    fi
-
-    # PORTME: fill in a description of your system's C++ link characteristics
-    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-    _LT_TAGVAR(ld_shlibs, $1)=yes
-    case $host_os in
-      aix3*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-      aix[[4-9]]*)
-        if test "$host_cpu" = ia64; then
-          # On IA64, the linker does run time linking by default, so we don't
-          # have to do anything special.
-          aix_use_runtimelinking=no
-          exp_sym_flag='-Bexport'
-          no_entry_flag=""
-        else
-          aix_use_runtimelinking=no
-
-          # Test if we are trying to use run time linking or normal
-          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
-          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
-	    for ld_flag in $LDFLAGS; do
-	      case $ld_flag in
-	      *-brtl*)
-	        aix_use_runtimelinking=yes
-	        break
-	        ;;
-	      esac
-	    done
-	    ;;
-          esac
-
-          exp_sym_flag='-bexport'
-          no_entry_flag='-bnoentry'
-        fi
-
-        # When large executables or shared objects are built, AIX ld can
-        # have problems creating the table of contents.  If linking a library
-        # or program results in "error TOC overflow" add -mminimal-toc to
-        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-        _LT_TAGVAR(archive_cmds, $1)=''
-        _LT_TAGVAR(hardcode_direct, $1)=yes
-        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-        _LT_TAGVAR(link_all_deplibs, $1)=yes
-        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
-
-        if test "$GXX" = yes; then
-          case $host_os in aix4.[[012]]|aix4.[[012]].*)
-          # We only want to do this on AIX 4.2 and lower, the check
-          # below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	    # We have reworked collect2
-	    :
-	  else
-	    # We have old collect2
-	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
-	    # It fails to find uninstalled libraries when the uninstalled
-	    # path is not listed in the libpath.  Setting hardcode_minus_L
-	    # to unsupported forces relinking
-	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
-	  fi
-          esac
-          shared_flag='-shared'
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag="$shared_flag "'${wl}-G'
-	  fi
-        else
-          # not using gcc
-          if test "$host_cpu" = ia64; then
-	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	  # chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-          else
-	    if test "$aix_use_runtimelinking" = yes; then
-	      shared_flag='${wl}-G'
-	    else
-	      shared_flag='${wl}-bM:SRE'
-	    fi
-          fi
-        fi
-
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
-        # It seems that -bexpall does not export symbols beginning with
-        # underscore (_), so it is better to generate a list of symbols to
-	# export.
-        _LT_TAGVAR(always_export_symbols, $1)=yes
-        if test "$aix_use_runtimelinking" = yes; then
-          # Warning - without using the other runtime loading flags (-brtl),
-          # -berok will link without error, but may produce a broken library.
-          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
-          # Determine the default libpath from the value encoded in an empty
-          # executable.
-          _LT_SYS_MODULE_PATH_AIX
-          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-        else
-          if test "$host_cpu" = ia64; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-          else
-	    # Determine the default libpath from the value encoded in an
-	    # empty executable.
-	    _LT_SYS_MODULE_PATH_AIX
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	    # Warning - without using the other run time loading flags,
-	    # -berok will link without error, but may produce a broken library.
-	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	    # Exported symbols can be pulled into shared objects from archives
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	    # This is similar to how AIX traditionally builds its shared
-	    # libraries.
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-          fi
-        fi
-        ;;
-
-      beos*)
-	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	  # support --undefined.  This deserves some investigation.  FIXME
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	else
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-
-      chorus*)
-        case $cc_basename in
-          *)
-	  # FIXME: insert proper C++ library support
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	  ;;
-        esac
-        ;;
-
-      cygwin* | mingw* | pw32* | cegcc*)
-        # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-        # as there is no search path for DLLs.
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-        _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-        _LT_TAGVAR(always_export_symbols, $1)=no
-        _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-
-        if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-          # If the export-symbols file already is a .def file (1st line
-          # is EXPORTS), use it as is; otherwise, prepend...
-          _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    cp $export_symbols $output_objdir/$soname.def;
-          else
-	    echo EXPORTS > $output_objdir/$soname.def;
-	    cat $export_symbols >> $output_objdir/$soname.def;
-          fi~
-          $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-        else
-          _LT_TAGVAR(ld_shlibs, $1)=no
-        fi
-        ;;
-      darwin* | rhapsody*)
-        _LT_DARWIN_LINKER_FEATURES($1)
-	;;
-
-      dgux*)
-        case $cc_basename in
-          ec++*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          ghcx*)
-	    # Green Hills C++ Compiler
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      freebsd[[12]]*)
-        # C++ shared libraries reported to be fairly broken before
-	# switch to ELF
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      freebsd-elf*)
-        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-        ;;
-
-      freebsd* | dragonfly*)
-        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
-        # conventions
-        _LT_TAGVAR(ld_shlibs, $1)=yes
-        ;;
-
-      gnu*)
-        ;;
-
-      hpux9*)
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-        _LT_TAGVAR(hardcode_direct, $1)=yes
-        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-				             # but as the default
-				             # location of the library.
-
-        case $cc_basename in
-          CC*)
-            # FIXME: insert proper C++ library support
-            _LT_TAGVAR(ld_shlibs, $1)=no
-            ;;
-          aCC*)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            # Commands to make compiler produce verbose output that lists
-            # what "hidden" libraries, object files and flags are used when
-            # linking a shared library.
-            #
-            # There doesn't appear to be a way to prevent this compiler from
-            # explicitly linking system object files so we need to strip them
-            # from the output so that they don't get included in the library
-            # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
-            ;;
-          *)
-            if test "$GXX" = yes; then
-              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            else
-              # FIXME: insert proper C++ library support
-              _LT_TAGVAR(ld_shlibs, $1)=no
-            fi
-            ;;
-        esac
-        ;;
-
-      hpux10*|hpux11*)
-        if test $with_gnu_ld = no; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-          case $host_cpu in
-            hppa*64*|ia64*)
-              ;;
-            *)
-	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-              ;;
-          esac
-        fi
-        case $host_cpu in
-          hppa*64*|ia64*)
-            _LT_TAGVAR(hardcode_direct, $1)=no
-            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-            ;;
-          *)
-            _LT_TAGVAR(hardcode_direct, $1)=yes
-            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-					         # but as the default
-					         # location of the library.
-            ;;
-        esac
-
-        case $cc_basename in
-          CC*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          aCC*)
-	    case $host_cpu in
-	      hppa*64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      ia64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      *)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	    esac
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test $with_gnu_ld = no; then
-	        case $host_cpu in
-	          hppa*64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          ia64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          *)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	        esac
-	      fi
-	    else
-	      # FIXME: insert proper C++ library support
-	      _LT_TAGVAR(ld_shlibs, $1)=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      interix[[3-9]]*)
-	_LT_TAGVAR(hardcode_direct, $1)=no
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-	# Instead, shared libraries are loaded at an image base (0x10000000 by
-	# default) and relocated if they conflict, which is a slow very memory
-	# consuming and fragmenting process.  To avoid this, we pick a random,
-	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	;;
-      irix5* | irix6*)
-        case $cc_basename in
-          CC*)
-	    # SGI C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test "$with_gnu_ld" = no; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	      else
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib'
-	      fi
-	    fi
-	    _LT_TAGVAR(link_all_deplibs, $1)=yes
-	    ;;
-        esac
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(inherit_rpath, $1)=yes
-        ;;
-
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
-	    ;;
-	  icpc* | ecpc* )
-	    # Intel C++
-	    with_gnu_ld=yes
-	    # version 8.0 and above of icpc choke on multiply defined symbols
-	    # if we add $predep_objects and $postdep_objects, however 7.1 and
-	    # earlier do not add the objects themselves.
-	    case `$CC -V 2>&1` in
-	      *"Version 7."*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	      *)  # Version 8.0 or newer
-	        tmp_idyn=
-	        case $host_cpu in
-		  ia64*) tmp_idyn=' -i_dynamic';;
-		esac
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	    esac
-	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    ;;
-          pgCC* | pgcpp*)
-            # Portland Group C++ compiler
-	    case `$CC -V` in
-	    *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*)
-	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-		compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"'
-	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~
-		$RANLIB $oldlib'
-	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    *) # Version 6 will use weak symbols
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    esac
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-            ;;
-	  cxx*)
-	    # Compaq C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
-
-	    runpath_var=LD_RUN_PATH
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
-	    ;;
-	  xl*)
-	    # IBM XL 8.0 on PPC, with GNU ld
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    if test "x$supports_anon_versioning" = xyes; then
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-		echo "local: *; };" >> $output_objdir/$libname.ver~
-		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-	    fi
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-	      _LT_TAGVAR(compiler_needs_object, $1)=yes
-
-	      # Not sure whether something based on
-	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
-	      # would be better.
-	      output_verbose_link_cmd='echo'
-
-	      # Archives containing C++ object files must be created using
-	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	      # necessary to make sure instantiated templates are included
-	      # in the archive.
-	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-
-      lynxos*)
-        # FIXME: insert proper C++ library support
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      m88k*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      mvs*)
-        case $cc_basename in
-          cxx*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-	  *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-	esac
-	;;
-
-      netbsd*)
-        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
-	  wlarc=
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	fi
-	# Workaround some broken pre-1.5 toolchains
-	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
-	;;
-
-      *nto* | *qnx*)
-        _LT_TAGVAR(ld_shlibs, $1)=yes
-	;;
-
-      openbsd2*)
-        # C++ shared libraries are fairly broken
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      openbsd*)
-	if test -f /usr/libexec/ld.so; then
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-	  fi
-	  output_verbose_link_cmd=echo
-	else
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-
-      osf3* | osf4* | osf5*)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Archives containing C++ object files must be created using
-	    # the KAI C++ compiler.
-	    case $host in
-	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
-	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
-	    esac
-	    ;;
-          RCC*)
-	    # Rational C++ 2.4.1
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          cxx*)
-	    case $host in
-	      osf3*)
-	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-		;;
-	      *)
-	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	          echo "-hidden">> $lib.exp~
-	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~
-	          $RM $lib.exp'
-	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-		;;
-	    esac
-
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
-	    ;;
-	  *)
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	      case $host in
-	        osf3*)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	        *)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	      esac
-
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	      # Commands to make compiler produce verbose output that lists
-	      # what "hidden" libraries, object files and flags are used when
-	      # linking a shared library.
-	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
-
-	    else
-	      # FIXME: insert proper C++ library support
-	      _LT_TAGVAR(ld_shlibs, $1)=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      psos*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      sunos4*)
-        case $cc_basename in
-          CC*)
-	    # Sun C++ 4.x
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          lcc*)
-	    # Lucid
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      solaris*)
-        case $cc_basename in
-          CC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
-	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	    case $host_os in
-	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-	      *)
-		# The compiler driver will combine and reorder linker options,
-		# but understands `-z linker_flag'.
-	        # Supported since Solaris 2.6 (maybe 2.5.1?)
-		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
-	        ;;
-	    esac
-	    _LT_TAGVAR(link_all_deplibs, $1)=yes
-
-	    output_verbose_link_cmd='echo'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
-	    ;;
-          gcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-
-	    # The C++ compiler must be used to create the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    # GNU C++ compiler with Solaris linker
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
-	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
-	      else
-	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
-	        # platform.
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
-	      fi
-
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
-	      case $host_os in
-		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-		*)
-		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-		  ;;
-	      esac
-	    fi
-	    ;;
-        esac
-        ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      runpath_var='LD_RUN_PATH'
-
-      case $cc_basename in
-        CC*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-      esac
-      ;;
-
-      sysv5* | sco3.2v5* | sco5v6*)
-	# Note: We can NOT use -z defs as we might desire, because we do not
-	# link with -lc, and that would cause any symbols used from libc to
-	# always be unresolved, which means just about no library would
-	# ever link correctly.  If we're not using GNU ld we use -z text
-	# though, which does catch some bad symbols but isn't as heavy-handed
-	# as -z defs.
-	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-	_LT_TAGVAR(link_all_deplibs, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-	runpath_var='LD_RUN_PATH'
-
-	case $cc_basename in
-          CC*)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    ;;
-	  *)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    ;;
-	esac
-      ;;
-
-      tandem*)
-        case $cc_basename in
-          NCC*)
-	    # NonStop-UX NCC 3.20
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      vxworks*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      *)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-    esac
-
-    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-    _LT_TAGVAR(GCC, $1)="$GXX"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_SYS_HIDDEN_LIBDEPS($1)
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  CC=$lt_save_CC
-  LDCXX=$LD
-  LD=$lt_save_LD
-  GCC=$lt_save_GCC
-  with_gnu_ld=$lt_save_with_gnu_ld
-  lt_cv_path_LDCXX=$lt_cv_path_LD
-  lt_cv_path_LD=$lt_save_path_LD
-  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
-  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
-
-AC_LANG_POP
-])# _LT_LANG_CXX_CONFIG
-
-
-# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
-# ---------------------------------
-# Figure out "hidden" library dependencies from verbose
-# compiler output when linking a shared library.
-# Parse the compiler output and extract the necessary
-# objects, libraries and library flags.
-m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-# Dependencies to place before and after the object being linked:
-_LT_TAGVAR(predep_objects, $1)=
-_LT_TAGVAR(postdep_objects, $1)=
-_LT_TAGVAR(predeps, $1)=
-_LT_TAGVAR(postdeps, $1)=
-_LT_TAGVAR(compiler_lib_search_path, $1)=
-
-dnl we can't use the lt_simple_compile_test_code here,
-dnl because it contains code intended for an executable,
-dnl not a library.  It's possible we should let each
-dnl tag define a new lt_????_link_test_code variable,
-dnl but it's only used here...
-m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
-int a;
-void foo (void) { a = 0; }
-_LT_EOF
-], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
-class Foo
-{
-public:
-  Foo (void) { a = 0; }
-private:
-  int a;
-};
-_LT_EOF
-], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
-      subroutine foo
-      implicit none
-      integer*4 a
-      a=0
-      return
-      end
-_LT_EOF
-], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
-      subroutine foo
-      implicit none
-      integer a
-      a=0
-      return
-      end
-_LT_EOF
-], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
-public class foo {
-  private int a;
-  public void bar (void) {
-    a = 0;
-  }
-};
-_LT_EOF
-])
-dnl Parse the compiler output and extract the necessary
-dnl objects, libraries and library flags.
-if AC_TRY_EVAL(ac_compile); then
-  # Parse the compiler output and extract the necessary
-  # objects, libraries and library flags.
-
-  # Sentinel used to keep track of whether or not we are before
-  # the conftest object file.
-  pre_test_object_deps_done=no
-
-  for p in `eval "$output_verbose_link_cmd"`; do
-    case $p in
-
-    -L* | -R* | -l*)
-       # Some compilers place space between "-{L,R}" and the path.
-       # Remove the space.
-       if test $p = "-L" ||
-          test $p = "-R"; then
-	 prev=$p
-	 continue
-       else
-	 prev=
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 case $p in
-	 -L* | -R*)
-	   # Internal compiler library paths should come after those
-	   # provided the user.  The postdeps already come after the
-	   # user supplied libs so there is no need to process them.
-	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
-	   else
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
-	   fi
-	   ;;
-	 # The "-l" case would never come before the object being
-	 # linked, so don't bother handling this case.
-	 esac
-       else
-	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
-	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
-	 else
-	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
-	 fi
-       fi
-       ;;
-
-    *.$objext)
-       # This assumes that the test object file only shows up
-       # once in the compiler output.
-       if test "$p" = "conftest.$objext"; then
-	 pre_test_object_deps_done=yes
-	 continue
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
-	   _LT_TAGVAR(predep_objects, $1)="$p"
-	 else
-	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
-	 fi
-       else
-	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
-	   _LT_TAGVAR(postdep_objects, $1)="$p"
-	 else
-	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
-	 fi
-       fi
-       ;;
-
-    *) ;; # Ignore the rest.
-
-    esac
-  done
-
-  # Clean up.
-  rm -f a.out a.exe
-else
-  echo "libtool.m4: error: problem compiling $1 test program"
-fi
-
-$RM -f confest.$objext
-
-# PORTME: override above test on systems where it is broken
-m4_if([$1], [CXX],
-[case $host_os in
-interix[[3-9]]*)
-  # Interix 3.5 installs completely hosed .la files for C++, so rather than
-  # hack all around it, let's just trust "g++" to DTRT.
-  _LT_TAGVAR(predep_objects,$1)=
-  _LT_TAGVAR(postdep_objects,$1)=
-  _LT_TAGVAR(postdeps,$1)=
-  ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-esac
-])
-
-case " $_LT_TAGVAR(postdeps, $1) " in
-*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
-esac
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=
-if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
-fi
-_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
-    [The directories searched by this compiler when creating a shared library])
-_LT_TAGDECL([], [predep_objects], [1],
-    [Dependencies to place before and after the objects being linked to
-    create a shared library])
-_LT_TAGDECL([], [postdep_objects], [1])
-_LT_TAGDECL([], [predeps], [1])
-_LT_TAGDECL([], [postdeps], [1])
-_LT_TAGDECL([], [compiler_lib_search_path], [1],
-    [The library search path used internally by the compiler when linking
-    a shared library])
-])# _LT_SYS_HIDDEN_LIBDEPS
-
-
-# _LT_PROG_F77
-# ------------
-# Since AC_PROG_F77 is broken, in that it returns the empty string
-# if there is no fortran compiler, we have our own version here.
-m4_defun([_LT_PROG_F77],
-[
-pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes])
-AC_PROG_F77
-if test -z "$F77" || test "X$F77" = "Xno"; then
-  _lt_disable_F77=yes
-fi
-popdef([AC_MSG_ERROR])
-])# _LT_PROG_F77
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([_LT_PROG_F77], [])
-
-
-# _LT_LANG_F77_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for a Fortran 77 compiler are
-# suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_F77_CONFIG],
-[AC_REQUIRE([_LT_PROG_F77])dnl
-AC_LANG_PUSH(Fortran 77)
-
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for f77 test sources.
-ac_ext=f
-
-# Object file extension for compiled f77 test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the F77 compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_F77" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="\
-      subroutine t
-      return
-      end
-"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code="\
-      program t
-      end
-"
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
-  lt_save_GCC=$GCC
-  CC=${F77-"f77"}
-  compiler=$CC
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-  GCC=$G77
-  if test -n "$compiler"; then
-    AC_MSG_CHECKING([if libtool supports shared libraries])
-    AC_MSG_RESULT([$can_build_shared])
-
-    AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
-
-    # On AIX, shared libraries and static libraries use the same namespace, and
-    # are all built from PIC.
-    case $host_os in
-      aix3*)
-        test "$enable_shared" = yes && enable_static=no
-        if test -n "$RANLIB"; then
-          archive_cmds="$archive_cmds~\$RANLIB \$lib"
-          postinstall_cmds='$RANLIB $lib'
-        fi
-        ;;
-      aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
-	fi
-        ;;
-    esac
-    AC_MSG_RESULT([$enable_shared])
-
-    AC_MSG_CHECKING([whether to build static libraries])
-    # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
-    AC_MSG_RESULT([$enable_static])
-
-    _LT_TAGVAR(GCC, $1)="$G77"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  GCC=$lt_save_GCC
-  CC="$lt_save_CC"
-fi # test "$_lt_disable_F77" != yes
-
-AC_LANG_POP
-])# _LT_LANG_F77_CONFIG
-
-
-# _LT_PROG_FC
-# -----------
-# Since AC_PROG_FC is broken, in that it returns the empty string
-# if there is no fortran compiler, we have our own version here.
-m4_defun([_LT_PROG_FC],
-[
-pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes])
-AC_PROG_FC
-if test -z "$FC" || test "X$FC" = "Xno"; then
-  _lt_disable_FC=yes
-fi
-popdef([AC_MSG_ERROR])
-])# _LT_PROG_FC
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([_LT_PROG_FC], [])
-
-
-# _LT_LANG_FC_CONFIG([TAG])
-# -------------------------
-# Ensure that the configuration variables for a Fortran compiler are
-# suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_FC_CONFIG],
-[AC_REQUIRE([_LT_PROG_FC])dnl
-AC_LANG_PUSH(Fortran)
-
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for fc test sources.
-ac_ext=${ac_fc_srcext-f}
-
-# Object file extension for compiled fc test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the FC compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_FC" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="\
-      subroutine t
-      return
-      end
-"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code="\
-      program t
-      end
-"
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
-  lt_save_GCC=$GCC
-  CC=${FC-"f95"}
-  compiler=$CC
-  GCC=$ac_cv_fc_compiler_gnu
-
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-
-  if test -n "$compiler"; then
-    AC_MSG_CHECKING([if libtool supports shared libraries])
-    AC_MSG_RESULT([$can_build_shared])
-
-    AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
-
-    # On AIX, shared libraries and static libraries use the same namespace, and
-    # are all built from PIC.
-    case $host_os in
-      aix3*)
-        test "$enable_shared" = yes && enable_static=no
-        if test -n "$RANLIB"; then
-          archive_cmds="$archive_cmds~\$RANLIB \$lib"
-          postinstall_cmds='$RANLIB $lib'
-        fi
-        ;;
-      aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
-	fi
-        ;;
-    esac
-    AC_MSG_RESULT([$enable_shared])
-
-    AC_MSG_CHECKING([whether to build static libraries])
-    # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
-    AC_MSG_RESULT([$enable_static])
-
-    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_SYS_HIDDEN_LIBDEPS($1)
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  GCC=$lt_save_GCC
-  CC="$lt_save_CC"
-fi # test "$_lt_disable_FC" != yes
-
-AC_LANG_POP
-])# _LT_LANG_FC_CONFIG
-
-
-# _LT_LANG_GCJ_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for the GNU Java Compiler compiler
-# are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_GCJ_CONFIG],
-[AC_REQUIRE([LT_PROG_GCJ])dnl
-AC_LANG_SAVE
-
-# Source file extension for Java test sources.
-ac_ext=java
-
-# Object file extension for compiled Java test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="class foo {}"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-lt_save_GCC=$GCC
-GCC=yes
-CC=${GCJ-"gcj"}
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
-_LT_CC_BASENAME([$compiler])
-
-# GCJ did not exist at the time GCC didn't implicitly link libc in.
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-  _LT_COMPILER_NO_RTTI($1)
-  _LT_COMPILER_PIC($1)
-  _LT_COMPILER_C_O($1)
-  _LT_COMPILER_FILE_LOCKS($1)
-  _LT_LINKER_SHLIBS($1)
-  _LT_LINKER_HARDCODE_LIBPATH($1)
-
-  _LT_CONFIG($1)
-fi
-
-AC_LANG_RESTORE
-
-GCC=$lt_save_GCC
-CC="$lt_save_CC"
-])# _LT_LANG_GCJ_CONFIG
-
-
-# _LT_LANG_RC_CONFIG([TAG])
-# -------------------------
-# Ensure that the configuration variables for the Windows resource compiler
-# are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_RC_CONFIG],
-[AC_REQUIRE([LT_PROG_RC])dnl
-AC_LANG_SAVE
-
-# Source file extension for RC test sources.
-ac_ext=rc
-
-# Object file extension for compiled RC test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
-
-# Code to be used in simple link tests
-lt_simple_link_test_code="$lt_simple_compile_test_code"
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-lt_save_GCC=$GCC
-GCC=
-CC=${RC-"windres"}
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-
-if test -n "$compiler"; then
-  :
-  _LT_CONFIG($1)
-fi
-
-GCC=$lt_save_GCC
-AC_LANG_RESTORE
-CC="$lt_save_CC"
-])# _LT_LANG_RC_CONFIG
-
-
-# LT_PROG_GCJ
-# -----------
-AC_DEFUN([LT_PROG_GCJ],
-[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
-  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
-    [AC_CHECK_TOOL(GCJ, gcj,)
-      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
-      AC_SUBST(GCJFLAGS)])])[]dnl
-])
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
-
-
-# LT_PROG_RC
-# ----------
-AC_DEFUN([LT_PROG_RC],
-[AC_CHECK_TOOL(RC, windres,)
-])
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_RC], [])
-
-
-# _LT_DECL_EGREP
-# --------------
-# If we don't have a new enough Autoconf to choose the best grep
-# available, choose the one first in the user's PATH.
-m4_defun([_LT_DECL_EGREP],
-[AC_REQUIRE([AC_PROG_EGREP])dnl
-AC_REQUIRE([AC_PROG_FGREP])dnl
-test -z "$GREP" && GREP=grep
-_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
-_LT_DECL([], [EGREP], [1], [An ERE matcher])
-_LT_DECL([], [FGREP], [1], [A literal string matcher])
-dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
-AC_SUBST([GREP])
-])
-
-
-# _LT_DECL_OBJDUMP
-# --------------
-# If we don't have a new enough Autoconf to choose the best objdump
-# available, choose the one first in the user's PATH.
-m4_defun([_LT_DECL_OBJDUMP],
-[AC_CHECK_TOOL(OBJDUMP, objdump, false)
-test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
-AC_SUBST([OBJDUMP])
-])
-
-
-# _LT_DECL_SED
-# ------------
-# Check for a fully-functional sed program, that truncates
-# as few characters as possible.  Prefer GNU sed if found.
-m4_defun([_LT_DECL_SED],
-[AC_PROG_SED
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
-_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
-    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
-])# _LT_DECL_SED
-
-m4_ifndef([AC_PROG_SED], [
-############################################################
-# NOTE: This macro has been submitted for inclusion into   #
-#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
-#  a released version of Autoconf we should remove this    #
-#  macro and use it instead.                               #
-############################################################
-
-m4_defun([AC_PROG_SED],
-[AC_MSG_CHECKING([for a sed that does not truncate output])
-AC_CACHE_VAL(lt_cv_path_SED,
-[# Loop through the user's path and test for sed and gsed.
-# Then use that list of sed's as ones to test for truncation.
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for lt_ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
-        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
-      fi
-    done
-  done
-done
-IFS=$as_save_IFS
-lt_ac_max=0
-lt_ac_count=0
-# Add /usr/xpg4/bin/sed as it is typically found on Solaris
-# along with /bin/sed that truncates output.
-for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
-  test ! -f $lt_ac_sed && continue
-  cat /dev/null > conftest.in
-  lt_ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
-  # Check for GNU sed and select it if it is found.
-  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
-    lt_cv_path_SED=$lt_ac_sed
-    break
-  fi
-  while true; do
-    cat conftest.in conftest.in >conftest.tmp
-    mv conftest.tmp conftest.in
-    cp conftest.in conftest.nl
-    echo >>conftest.nl
-    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
-    cmp -s conftest.out conftest.nl || break
-    # 10000 chars as input seems more than enough
-    test $lt_ac_count -gt 10 && break
-    lt_ac_count=`expr $lt_ac_count + 1`
-    if test $lt_ac_count -gt $lt_ac_max; then
-      lt_ac_max=$lt_ac_count
-      lt_cv_path_SED=$lt_ac_sed
-    fi
-  done
-done
-])
-SED=$lt_cv_path_SED
-AC_SUBST([SED])
-AC_MSG_RESULT([$SED])
-])#AC_PROG_SED
-])#m4_ifndef
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_SED], [])
-
-
-# _LT_CHECK_SHELL_FEATURES
-# ------------------------
-# Find out whether the shell is Bourne or XSI compatible,
-# or has some other useful features.
-m4_defun([_LT_CHECK_SHELL_FEATURES],
-[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-AC_MSG_RESULT([$xsi_shell])
-_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
-
-AC_MSG_CHECKING([whether the shell understands "+="])
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-AC_MSG_RESULT([$lt_shell_append])
-_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  lt_unset=unset
-else
-  lt_unset=false
-fi
-_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  lt_SP2NL='tr \040 \012'
-  lt_NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  lt_SP2NL='tr \100 \n'
-  lt_NL2SP='tr \r\n \100\100'
-  ;;
-esac
-_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
-_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
-])# _LT_CHECK_SHELL_FEATURES
-
-
-# _LT_PROG_XSI_SHELLFNS
-# ---------------------
-# Bourne and XSI compatible variants of some useful shell functions.
-m4_defun([_LT_PROG_XSI_SHELLFNS],
-[case $xsi_shell in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result="${1##*/}"
-}
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-  func_basename_result="${1##*/}"
-}
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-func_stripname ()
-{
-  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-  # positional parameters, so assign one to ordinary parameter first.
-  func_stripname_result=${3}
-  func_stripname_result=${func_stripname_result#"${1}"}
-  func_stripname_result=${func_stripname_result%"${2}"}
-}
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=${1%%=*}
-  func_opt_split_arg=${1#*=}
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  case ${1} in
-    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-    *)    func_lo2o_result=${1} ;;
-  esac
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=${1%.*}.lo
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=$(( $[*] ))
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=${#1}
-}
-
-_LT_EOF
-    ;;
-  *) # Bourne compatible functions.
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
-}
-
-dnl func_dirname_and_basename
-dnl A portable version of this function is already defined in general.m4sh
-dnl so there is no need for it here.
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-  case ${2} in
-    .*) func_stripname_result=`$ECHO "X${3}" \
-           | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
-    *)  func_stripname_result=`$ECHO "X${3}" \
-           | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
-  esac
-}
-
-# sed scripts:
-my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q'
-my_sed_long_arg='1s/^-[[^=]]*=//'
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
-  func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'`
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=`expr "$[@]"`
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len`
-}
-
-_LT_EOF
-esac
-
-case $lt_shell_append in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$[1]+=\$[2]"
-}
-_LT_EOF
-    ;;
-  *)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$[1]=\$$[1]\$[2]"
-}
-
-_LT_EOF
-    ;;
-  esac
-])
diff --git a/cloog-0.17.0/isl/m4/ltoptions.m4 b/cloog-0.17.0/isl/m4/ltoptions.m4
deleted file mode 100644
index 34151a3..0000000
--- a/cloog-0.17.0/isl/m4/ltoptions.m4
+++ /dev/null
@@ -1,368 +0,0 @@
-# Helper functions for option handling.                    -*- Autoconf -*-
-#
-#   Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
-#   Written by Gary V. Vaughan, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 6 ltoptions.m4
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
-
-
-# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
-# ------------------------------------------
-m4_define([_LT_MANGLE_OPTION],
-[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
-
-
-# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
-# ---------------------------------------
-# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
-# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
-# saved as a flag.
-m4_define([_LT_SET_OPTION],
-[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
-m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
-        _LT_MANGLE_DEFUN([$1], [$2]),
-    [m4_warning([Unknown $1 option `$2'])])[]dnl
-])
-
-
-# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
-# ------------------------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-m4_define([_LT_IF_OPTION],
-[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
-
-
-# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
-# -------------------------------------------------------
-# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
-# are set.
-m4_define([_LT_UNLESS_OPTIONS],
-[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
-	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
-		      [m4_define([$0_found])])])[]dnl
-m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
-])[]dnl
-])
-
-
-# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
-# ----------------------------------------
-# OPTION-LIST is a space-separated list of Libtool options associated
-# with MACRO-NAME.  If any OPTION has a matching handler declared with
-# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
-# the unknown option and exit.
-m4_defun([_LT_SET_OPTIONS],
-[# Set options
-m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
-    [_LT_SET_OPTION([$1], _LT_Option)])
-
-m4_if([$1],[LT_INIT],[
-  dnl
-  dnl Simply set some default values (i.e off) if boolean options were not
-  dnl specified:
-  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
-  ])
-  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
-  ])
-  dnl
-  dnl If no reference was made to various pairs of opposing options, then
-  dnl we run the default mode handler for the pair.  For example, if neither
-  dnl `shared' nor `disable-shared' was passed, we enable building of shared
-  dnl archives by default:
-  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
-  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
-  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
-  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
-  		   [_LT_ENABLE_FAST_INSTALL])
-  ])
-])# _LT_SET_OPTIONS
-
-
-## --------------------------------- ##
-## Macros to handle LT_INIT options. ##
-## --------------------------------- ##
-
-# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
-# -----------------------------------------
-m4_define([_LT_MANGLE_DEFUN],
-[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
-
-
-# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
-# -----------------------------------------------
-m4_define([LT_OPTION_DEFINE],
-[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
-])# LT_OPTION_DEFINE
-
-
-# dlopen
-# ------
-LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
-])
-
-AU_DEFUN([AC_LIBTOOL_DLOPEN],
-[_LT_SET_OPTION([LT_INIT], [dlopen])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `dlopen' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
-
-
-# win32-dll
-# ---------
-# Declare package support for building win32 dll's.
-LT_OPTION_DEFINE([LT_INIT], [win32-dll],
-[enable_win32_dll=yes
-
-case $host in
-*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*)
-  AC_CHECK_TOOL(AS, as, false)
-  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
-  AC_CHECK_TOOL(OBJDUMP, objdump, false)
-  ;;
-esac
-
-test -z "$AS" && AS=as
-_LT_DECL([], [AS],      [0], [Assembler program])dnl
-
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl
-])# win32-dll
-
-AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-_LT_SET_OPTION([LT_INIT], [win32-dll])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `win32-dll' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
-
-
-# _LT_ENABLE_SHARED([DEFAULT])
-# ----------------------------
-# implement the --enable-shared flag, and supports the `shared' and
-# `disable-shared' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_SHARED],
-[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([shared],
-    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
-	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
-
-    _LT_DECL([build_libtool_libs], [enable_shared], [0],
-	[Whether or not to build shared libraries])
-])# _LT_ENABLE_SHARED
-
-LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
-
-# Old names:
-AC_DEFUN([AC_ENABLE_SHARED],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
-])
-
-AC_DEFUN([AC_DISABLE_SHARED],
-[_LT_SET_OPTION([LT_INIT], [disable-shared])
-])
-
-AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
-AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_ENABLE_SHARED], [])
-dnl AC_DEFUN([AM_DISABLE_SHARED], [])
-
-
-
-# _LT_ENABLE_STATIC([DEFAULT])
-# ----------------------------
-# implement the --enable-static flag, and support the `static' and
-# `disable-static' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_STATIC],
-[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([static],
-    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
-	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
-
-    _LT_DECL([build_old_libs], [enable_static], [0],
-	[Whether or not to build static libraries])
-])# _LT_ENABLE_STATIC
-
-LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
-
-# Old names:
-AC_DEFUN([AC_ENABLE_STATIC],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
-])
-
-AC_DEFUN([AC_DISABLE_STATIC],
-[_LT_SET_OPTION([LT_INIT], [disable-static])
-])
-
-AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
-AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_ENABLE_STATIC], [])
-dnl AC_DEFUN([AM_DISABLE_STATIC], [])
-
-
-
-# _LT_ENABLE_FAST_INSTALL([DEFAULT])
-# ----------------------------------
-# implement the --enable-fast-install flag, and support the `fast-install'
-# and `disable-fast-install' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_FAST_INSTALL],
-[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([fast-install],
-    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
-    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
-
-_LT_DECL([fast_install], [enable_fast_install], [0],
-	 [Whether or not to optimize for fast installation])dnl
-])# _LT_ENABLE_FAST_INSTALL
-
-LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
-
-# Old names:
-AU_DEFUN([AC_ENABLE_FAST_INSTALL],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `fast-install' option into LT_INIT's first parameter.])
-])
-
-AU_DEFUN([AC_DISABLE_FAST_INSTALL],
-[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `disable-fast-install' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
-dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
-
-
-# _LT_WITH_PIC([MODE])
-# --------------------
-# implement the --with-pic flag, and support the `pic-only' and `no-pic'
-# LT_INIT options.
-# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
-m4_define([_LT_WITH_PIC],
-[AC_ARG_WITH([pic],
-    [AS_HELP_STRING([--with-pic],
-	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
-    [pic_mode="$withval"],
-    [pic_mode=default])
-
-test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
-
-_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
-])# _LT_WITH_PIC
-
-LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
-LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
-
-# Old name:
-AU_DEFUN([AC_LIBTOOL_PICMODE],
-[_LT_SET_OPTION([LT_INIT], [pic-only])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `pic-only' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
-
-## ----------------- ##
-## LTDL_INIT Options ##
-## ----------------- ##
-
-m4_define([_LTDL_MODE], [])
-LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
-		 [m4_define([_LTDL_MODE], [nonrecursive])])
-LT_OPTION_DEFINE([LTDL_INIT], [recursive],
-		 [m4_define([_LTDL_MODE], [recursive])])
-LT_OPTION_DEFINE([LTDL_INIT], [subproject],
-		 [m4_define([_LTDL_MODE], [subproject])])
-
-m4_define([_LTDL_TYPE], [])
-LT_OPTION_DEFINE([LTDL_INIT], [installable],
-		 [m4_define([_LTDL_TYPE], [installable])])
-LT_OPTION_DEFINE([LTDL_INIT], [convenience],
-		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/cloog-0.17.0/isl/m4/ltsugar.m4 b/cloog-0.17.0/isl/m4/ltsugar.m4
deleted file mode 100644
index 9000a05..0000000
--- a/cloog-0.17.0/isl/m4/ltsugar.m4
+++ /dev/null
@@ -1,123 +0,0 @@
-# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
-#
-# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
-# Written by Gary V. Vaughan, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 6 ltsugar.m4
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
-
-
-# lt_join(SEP, ARG1, [ARG2...])
-# -----------------------------
-# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
-# associated separator.
-# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
-# versions in m4sugar had bugs.
-m4_define([lt_join],
-[m4_if([$#], [1], [],
-       [$#], [2], [[$2]],
-       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
-m4_define([_lt_join],
-[m4_if([$#$2], [2], [],
-       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
-
-
-# lt_car(LIST)
-# lt_cdr(LIST)
-# ------------
-# Manipulate m4 lists.
-# These macros are necessary as long as will still need to support
-# Autoconf-2.59 which quotes differently.
-m4_define([lt_car], [[$1]])
-m4_define([lt_cdr],
-[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
-       [$#], 1, [],
-       [m4_dquote(m4_shift($@))])])
-m4_define([lt_unquote], $1)
-
-
-# lt_append(MACRO-NAME, STRING, [SEPARATOR])
-# ------------------------------------------
-# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
-# Note that neither SEPARATOR nor STRING are expanded; they are appended
-# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
-# No SEPARATOR is output if MACRO-NAME was previously undefined (different
-# than defined and empty).
-#
-# This macro is needed until we can rely on Autoconf 2.62, since earlier
-# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
-m4_define([lt_append],
-[m4_define([$1],
-	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
-
-
-
-# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
-# ----------------------------------------------------------
-# Produce a SEP delimited list of all paired combinations of elements of
-# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
-# has the form PREFIXmINFIXSUFFIXn.
-# Needed until we can rely on m4_combine added in Autoconf 2.62.
-m4_define([lt_combine],
-[m4_if(m4_eval([$# > 3]), [1],
-       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
-[[m4_foreach([_Lt_prefix], [$2],
-	     [m4_foreach([_Lt_suffix],
-		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
-	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
-
-
-# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
-# -----------------------------------------------------------------------
-# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
-# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
-m4_define([lt_if_append_uniq],
-[m4_ifdef([$1],
-	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
-		 [lt_append([$1], [$2], [$3])$4],
-		 [$5])],
-	  [lt_append([$1], [$2], [$3])$4])])
-
-
-# lt_dict_add(DICT, KEY, VALUE)
-# -----------------------------
-m4_define([lt_dict_add],
-[m4_define([$1($2)], [$3])])
-
-
-# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
-# --------------------------------------------
-m4_define([lt_dict_add_subkey],
-[m4_define([$1($2:$3)], [$4])])
-
-
-# lt_dict_fetch(DICT, KEY, [SUBKEY])
-# ----------------------------------
-m4_define([lt_dict_fetch],
-[m4_ifval([$3],
-	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
-    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
-
-
-# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
-# -----------------------------------------------------------------
-m4_define([lt_if_dict_fetch],
-[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
-	[$5],
-    [$6])])
-
-
-# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
-# --------------------------------------------------------------
-m4_define([lt_dict_filter],
-[m4_if([$5], [], [],
-  [lt_join(m4_quote(m4_default([$4], [[, ]])),
-           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
-		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
-])
diff --git a/cloog-0.17.0/isl/m4/ltversion.m4 b/cloog-0.17.0/isl/m4/ltversion.m4
deleted file mode 100644
index f3c5309..0000000
--- a/cloog-0.17.0/isl/m4/ltversion.m4
+++ /dev/null
@@ -1,23 +0,0 @@
-# ltversion.m4 -- version numbers			-*- Autoconf -*-
-#
-#   Copyright (C) 2004 Free Software Foundation, Inc.
-#   Written by Scott James Remnant, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# Generated from ltversion.in.
-
-# serial 3017 ltversion.m4
-# This file is part of GNU Libtool
-
-m4_define([LT_PACKAGE_VERSION], [2.2.6b])
-m4_define([LT_PACKAGE_REVISION], [1.3017])
-
-AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.2.6b'
-macro_revision='1.3017'
-_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
-_LT_DECL(, macro_revision, 0)
-])
diff --git a/cloog-0.17.0/isl/m4/lt~obsolete.m4 b/cloog-0.17.0/isl/m4/lt~obsolete.m4
deleted file mode 100644
index 637bb20..0000000
--- a/cloog-0.17.0/isl/m4/lt~obsolete.m4
+++ /dev/null
@@ -1,92 +0,0 @@
-# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
-#
-#   Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
-#   Written by Scott James Remnant, 2004.
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 4 lt~obsolete.m4
-
-# These exist entirely to fool aclocal when bootstrapping libtool.
-#
-# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
-# which have later been changed to m4_define as they aren't part of the
-# exported API, or moved to Autoconf or Automake where they belong.
-#
-# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
-# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
-# using a macro with the same name in our local m4/libtool.m4 it'll
-# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
-# and doesn't know about Autoconf macros at all.)
-#
-# So we provide this file, which has a silly filename so it's always
-# included after everything else.  This provides aclocal with the
-# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
-# because those macros already exist, or will be overwritten later.
-# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
-#
-# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
-# Yes, that means every name once taken will need to remain here until
-# we give up compatibility with versions before 1.7, at which point
-# we need to keep only those names which we still refer to.
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
-
-m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
-m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
-m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
-m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
-m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
-m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
-m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
-m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
-m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
-m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
-m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
-m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
-m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
-m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
-m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
-m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
-m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
-m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
-m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
-m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
-m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
-m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
-m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
-m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
-m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
-m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
-m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
-m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
-m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
-m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
-m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
-m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
-m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
-m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
-m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
-m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
-m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
-m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
-m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
-m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
-m4_ifndef([AC_LIBTOOL_RC],		[AC_DEFUN([AC_LIBTOOL_RC])])
-m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
-m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
-m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
-m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
-m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
-m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
-m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
-m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
diff --git a/cloog-0.17.0/isl/missing b/cloog-0.17.0/isl/missing
deleted file mode 100755
index 28055d2..0000000
--- a/cloog-0.17.0/isl/missing
+++ /dev/null
@@ -1,376 +0,0 @@
-#! /bin/sh
-# Common stub for a few missing GNU programs while installing.
-
-scriptversion=2009-04-28.21; # UTC
-
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
-# 2008, 2009 Free Software Foundation, Inc.
-# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-if test $# -eq 0; then
-  echo 1>&2 "Try \`$0 --help' for more information"
-  exit 1
-fi
-
-run=:
-sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
-sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
-
-# In the cases where this matters, `missing' is being run in the
-# srcdir already.
-if test -f configure.ac; then
-  configure_ac=configure.ac
-else
-  configure_ac=configure.in
-fi
-
-msg="missing on your system"
-
-case $1 in
---run)
-  # Try to run requested program, and just exit if it succeeds.
-  run=
-  shift
-  "$@" && exit 0
-  # Exit code 63 means version mismatch.  This often happens
-  # when the user try to use an ancient version of a tool on
-  # a file that requires a minimum version.  In this case we
-  # we should proceed has if the program had been absent, or
-  # if --run hadn't been passed.
-  if test $? = 63; then
-    run=:
-    msg="probably too old"
-  fi
-  ;;
-
-  -h|--h|--he|--hel|--help)
-    echo "\
-$0 [OPTION]... PROGRAM [ARGUMENT]...
-
-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
-error status if there is no known handling for PROGRAM.
-
-Options:
-  -h, --help      display this help and exit
-  -v, --version   output version information and exit
-  --run           try to run the given command, and emulate it if it fails
-
-Supported PROGRAM values:
-  aclocal      touch file \`aclocal.m4'
-  autoconf     touch file \`configure'
-  autoheader   touch file \`config.h.in'
-  autom4te     touch the output file, or create a stub one
-  automake     touch all \`Makefile.in' files
-  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
-  flex         create \`lex.yy.c', if possible, from existing .c
-  help2man     touch the output file
-  lex          create \`lex.yy.c', if possible, from existing .c
-  makeinfo     touch the output file
-  tar          try tar, gnutar, gtar, then tar without non-portable flags
-  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
-
-Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
-\`g' are ignored when checking the name.
-
-Send bug reports to <bug-automake@gnu.org>."
-    exit $?
-    ;;
-
-  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
-    echo "missing $scriptversion (GNU Automake)"
-    exit $?
-    ;;
-
-  -*)
-    echo 1>&2 "$0: Unknown \`$1' option"
-    echo 1>&2 "Try \`$0 --help' for more information"
-    exit 1
-    ;;
-
-esac
-
-# normalize program name to check for.
-program=`echo "$1" | sed '
-  s/^gnu-//; t
-  s/^gnu//; t
-  s/^g//; t'`
-
-# Now exit if we have it, but it failed.  Also exit now if we
-# don't have it and --version was passed (most likely to detect
-# the program).  This is about non-GNU programs, so use $1 not
-# $program.
-case $1 in
-  lex*|yacc*)
-    # Not GNU programs, they don't have --version.
-    ;;
-
-  tar*)
-    if test -n "$run"; then
-       echo 1>&2 "ERROR: \`tar' requires --run"
-       exit 1
-    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
-       exit 1
-    fi
-    ;;
-
-  *)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
-       # Could not run --version or --help.  This is probably someone
-       # running `$TOOL --version' or `$TOOL --help' to check whether
-       # $TOOL exists and not knowing $TOOL uses missing.
-       exit 1
-    fi
-    ;;
-esac
-
-# If it does not exist, or fails to run (possibly an outdated version),
-# try to emulate it.
-case $program in
-  aclocal*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
-         to install the \`Automake' and \`Perl' packages.  Grab them from
-         any GNU archive site."
-    touch aclocal.m4
-    ;;
-
-  autoconf*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`${configure_ac}'.  You might want to install the
-         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
-         archive site."
-    touch configure
-    ;;
-
-  autoheader*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
-         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
-         from any GNU archive site."
-    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
-    test -z "$files" && files="config.h"
-    touch_files=
-    for f in $files; do
-      case $f in
-      *:*) touch_files="$touch_files "`echo "$f" |
-				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
-      *) touch_files="$touch_files $f.in";;
-      esac
-    done
-    touch $touch_files
-    ;;
-
-  automake*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
-         You might want to install the \`Automake' and \`Perl' packages.
-         Grab them from any GNU archive site."
-    find . -type f -name Makefile.am -print |
-	   sed 's/\.am$/.in/' |
-	   while read f; do touch "$f"; done
-    ;;
-
-  autom4te*)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, but is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.
-         You can get \`$1' as part of \`Autoconf' from any GNU
-         archive site."
-
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -f "$file"; then
-	touch $file
-    else
-	test -z "$file" || exec >$file
-	echo "#! /bin/sh"
-	echo "# Created by GNU Automake missing as a replacement of"
-	echo "#  $ $@"
-	echo "exit 0"
-	chmod +x $file
-	exit 1
-    fi
-    ;;
-
-  bison*|yacc*)
-    echo 1>&2 "\
-WARNING: \`$1' $msg.  You should only need it if
-         you modified a \`.y' file.  You may need the \`Bison' package
-         in order for those modifications to take effect.  You can get
-         \`Bison' from any GNU archive site."
-    rm -f y.tab.c y.tab.h
-    if test $# -ne 1; then
-        eval LASTARG="\${$#}"
-	case $LASTARG in
-	*.y)
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" y.tab.c
-	    fi
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" y.tab.h
-	    fi
-	  ;;
-	esac
-    fi
-    if test ! -f y.tab.h; then
-	echo >y.tab.h
-    fi
-    if test ! -f y.tab.c; then
-	echo 'main() { return 0; }' >y.tab.c
-    fi
-    ;;
-
-  lex*|flex*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.l' file.  You may need the \`Flex' package
-         in order for those modifications to take effect.  You can get
-         \`Flex' from any GNU archive site."
-    rm -f lex.yy.c
-    if test $# -ne 1; then
-        eval LASTARG="\${$#}"
-	case $LASTARG in
-	*.l)
-	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" lex.yy.c
-	    fi
-	  ;;
-	esac
-    fi
-    if test ! -f lex.yy.c; then
-	echo 'main() { return 0; }' >lex.yy.c
-    fi
-    ;;
-
-  help2man*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-	 you modified a dependency of a manual page.  You may need the
-	 \`Help2man' package in order for those modifications to take
-	 effect.  You can get \`Help2man' from any GNU archive site."
-
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -f "$file"; then
-	touch $file
-    else
-	test -z "$file" || exec >$file
-	echo ".ab help2man is required to generate this page"
-	exit $?
-    fi
-    ;;
-
-  makeinfo*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.texi' or \`.texinfo' file, or any other file
-         indirectly affecting the aspect of the manual.  The spurious
-         call might also be the consequence of using a buggy \`make' (AIX,
-         DU, IRIX).  You might want to install the \`Texinfo' package or
-         the \`GNU make' package.  Grab either from any GNU archive site."
-    # The file to touch is that specified with -o ...
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -z "$file"; then
-      # ... or it is the one specified with @setfilename ...
-      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
-      file=`sed -n '
-	/^@setfilename/{
-	  s/.* \([^ ]*\) *$/\1/
-	  p
-	  q
-	}' $infile`
-      # ... or it is derived from the source name (dir/f.texi becomes f.info)
-      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
-    fi
-    # If the file does not exist, the user really needs makeinfo;
-    # let's fail without touching anything.
-    test -f $file || exit 1
-    touch $file
-    ;;
-
-  tar*)
-    shift
-
-    # We have already tried tar in the generic part.
-    # Look for gnutar/gtar before invocation to avoid ugly error
-    # messages.
-    if (gnutar --version > /dev/null 2>&1); then
-       gnutar "$@" && exit 0
-    fi
-    if (gtar --version > /dev/null 2>&1); then
-       gtar "$@" && exit 0
-    fi
-    firstarg="$1"
-    if shift; then
-	case $firstarg in
-	*o*)
-	    firstarg=`echo "$firstarg" | sed s/o//`
-	    tar "$firstarg" "$@" && exit 0
-	    ;;
-	esac
-	case $firstarg in
-	*h*)
-	    firstarg=`echo "$firstarg" | sed s/h//`
-	    tar "$firstarg" "$@" && exit 0
-	    ;;
-	esac
-    fi
-
-    echo 1>&2 "\
-WARNING: I can't seem to be able to run \`tar' with the given arguments.
-         You may want to install GNU tar or Free paxutils, or check the
-         command line arguments."
-    exit 1
-    ;;
-
-  *)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, and is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.  Check the \`README' file,
-         it often tells you about the needed prerequisites for installing
-         this package.  You may also peek at any GNU archive site, in case
-         some other package would contain this missing \`$1' program."
-    exit 1
-    ;;
-esac
-
-exit 0
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/cloog-0.17.0/isl/mp_get_memory_functions.c b/cloog-0.17.0/isl/mp_get_memory_functions.c
deleted file mode 100644
index e14e336..0000000
--- a/cloog-0.17.0/isl/mp_get_memory_functions.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <gmp.h>
-
-void mp_get_memory_functions(
-		void *(**alloc_func_ptr) (size_t),
-		void *(**realloc_func_ptr) (void *, size_t, size_t),
-		void (**free_func_ptr) (void *, size_t))
-{
-	if (alloc_func_ptr)
-		*alloc_func_ptr = __gmp_allocate_func;
-	if (realloc_func_ptr)
-		*realloc_func_ptr = __gmp_reallocate_func;
-	if (free_func_ptr)
-		*free_func_ptr = __gmp_free_func;
-}
diff --git a/cloog-0.17.0/isl/pip.c b/cloog-0.17.0/isl/pip.c
deleted file mode 100644
index 2baf9e2..0000000
--- a/cloog-0.17.0/isl/pip.c
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <assert.h>
-#include <string.h>
-#include <strings.h>
-#include <isl_map_private.h>
-#include <isl/aff.h>
-#include <isl/set.h>
-#include "isl_tab.h"
-#include "isl_sample.h"
-#include "isl_scan.h"
-#include <isl/seq.h>
-#include <isl/ilp.h>
-#include <isl/printer.h>
-#include <isl_point_private.h>
-#include <isl/options.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"
- * should always be -1.
- *
- * Context constraints in PolyLib format
- * -1
- * Problem constraints in PolyLib format
- * Optional list of options
- *
- * The options are
- *	Maximize	compute maximum instead of minimum
- *	Rational	compute rational optimum instead of integer optimum
- *	Urs_parms	don't assume parameters are non-negative
- *	Urs_unknowns	don't assume unknowns are non-negative
- */
-
-struct options {
-	struct isl_options	*isl;
-	unsigned		 verify;
-	unsigned		 format;
-};
-
-#define FORMAT_SET	0
-#define FORMAT_AFF	1
-
-struct isl_arg_choice pip_format[] = {
-	{"set",		FORMAT_SET},
-	{"affine",	FORMAT_AFF},
-	{0}
-};
-
-ISL_ARGS_START(struct options, options_args)
-ISL_ARG_CHILD(struct options, isl, "isl", &isl_options_args, "isl options")
-ISL_ARG_BOOL(struct options, verify, 'T', "verify", 0, NULL)
-ISL_ARG_CHOICE(struct options, format, 0, "format",
-	pip_format, FORMAT_SET, "output format")
-ISL_ARGS_END
-
-ISL_ARG_DEF(options, struct options, options_args)
-
-static __isl_give isl_basic_set *set_bounds(__isl_take isl_basic_set *bset)
-{
-	unsigned nparam;
-	int i, r;
-	isl_point *pt, *pt2;
-	isl_basic_set *box;
-
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-	r = nparam >= 8 ? 4 : nparam >= 5 ? 6 : 30;
-
-	pt = isl_basic_set_sample_point(isl_basic_set_copy(bset));
-	pt2 = isl_point_copy(pt);
-
-	for (i = 0; i < nparam; ++i) {
-		pt = isl_point_add_ui(pt, isl_dim_param, i, r);
-		pt2 = isl_point_sub_ui(pt2, isl_dim_param, i, r);
-	}
-
-	box = isl_basic_set_box_from_points(pt, pt2);
-
-	return isl_basic_set_intersect(bset, box);
-}
-
-static struct isl_basic_set *to_parameter_domain(struct isl_basic_set *context)
-{
-	context = isl_basic_set_move_dims(context, isl_dim_param, 0,
-		    isl_dim_set, 0, isl_basic_set_dim(context, isl_dim_set));
-	context = isl_basic_set_params(context);
-	return context;
-}
-
-isl_basic_set *plug_in_parameters(isl_basic_set *bset, struct isl_vec *params)
-{
-	int i;
-
-	for (i = 0; i < params->size - 1; ++i)
-		bset = isl_basic_set_fix(bset,
-					 isl_dim_param, i, params->el[1 + i]);
-
-	bset = isl_basic_set_remove_dims(bset,
-					 isl_dim_param, 0, params->size - 1);
-
-	isl_vec_free(params);
-
-	return bset;
-}
-
-isl_set *set_plug_in_parameters(isl_set *set, struct isl_vec *params)
-{
-	int i;
-
-	for (i = 0; i < params->size - 1; ++i)
-		set = isl_set_fix(set, isl_dim_param, i, params->el[1 + i]);
-
-	set = isl_set_remove_dims(set, isl_dim_param, 0, params->size - 1);
-
-	isl_vec_free(params);
-
-	return set;
-}
-
-/* Compute the lexicographically minimal (or maximal if max is set)
- * element of bset for the given values of the parameters, by
- * successively solving an ilp problem in each direction.
- */
-struct isl_vec *opt_at(struct isl_basic_set *bset,
-	struct isl_vec *params, int max)
-{
-	unsigned dim;
-	struct isl_vec *opt;
-	struct isl_vec *obj;
-	int i;
-
-	dim = isl_basic_set_dim(bset, isl_dim_set);
-
-	bset = plug_in_parameters(bset, params);
-
-	if (isl_basic_set_plain_is_empty(bset)) {
-		opt = isl_vec_alloc(bset->ctx, 0);
-		isl_basic_set_free(bset);
-		return opt;
-	}
-
-	opt = isl_vec_alloc(bset->ctx, 1 + dim);
-	assert(opt);
-
-	obj = isl_vec_alloc(bset->ctx, 1 + dim);
-	assert(obj);
-
-	isl_int_set_si(opt->el[0], 1);
-	isl_int_set_si(obj->el[0], 0);
-
-	for (i = 0; i < dim; ++i) {
-		enum isl_lp_result res;
-
-		isl_seq_clr(obj->el + 1, dim);
-		isl_int_set_si(obj->el[1 + i], 1);
-		res = isl_basic_set_solve_ilp(bset, max, obj->el,
-						&opt->el[1 + i], NULL);
-		if (res == isl_lp_empty)
-			goto empty;
-		assert(res == isl_lp_ok);
-		bset = isl_basic_set_fix(bset, isl_dim_set, i, opt->el[1 + i]);
-	}
-
-	isl_basic_set_free(bset);
-	isl_vec_free(obj);
-
-	return opt;
-empty:
-	isl_vec_free(opt);
-	opt = isl_vec_alloc(bset->ctx, 0);
-	isl_basic_set_free(bset);
-	isl_vec_free(obj);
-
-	return opt;
-}
-
-struct isl_scan_pip {
-	struct isl_scan_callback callback;
-	isl_basic_set *bset;
-	isl_set *sol;
-	isl_set *empty;
-	int stride;
-	int n;
-	int max;
-};
-
-/* Check if the "manually" computed optimum of bset at the "sample"
- * values of the parameters agrees with the solution of pilp problem
- * represented by the pair (sol, empty).
- * In particular, if there is no solution for this value of the parameters,
- * then it should be an element of the parameter domain "empty".
- * Otherwise, the optimal solution, should be equal to the result of
- * plugging in the value of the parameters in "sol".
- */
-static int scan_one(struct isl_scan_callback *callback,
-	__isl_take isl_vec *sample)
-{
-	struct isl_scan_pip *sp = (struct isl_scan_pip *)callback;
-	struct isl_vec *opt;
-
-	sp->n--;
-
-	opt = opt_at(isl_basic_set_copy(sp->bset), isl_vec_copy(sample), sp->max);
-	assert(opt);
-
-	if (opt->size == 0) {
-		isl_point *sample_pnt;
-		sample_pnt = isl_point_alloc(isl_set_get_space(sp->empty), sample);
-		assert(isl_set_contains_point(sp->empty, sample_pnt));
-		isl_point_free(sample_pnt);
-		isl_vec_free(opt);
-	} else {
-		isl_set *sol;
-		isl_set *opt_set;
-		opt_set = isl_set_from_basic_set(isl_basic_set_from_vec(opt));
-		sol = set_plug_in_parameters(isl_set_copy(sp->sol), sample);
-		assert(isl_set_is_equal(opt_set, sol));
-		isl_set_free(sol);
-		isl_set_free(opt_set);
-	}
-
-	if (!(sp->n % sp->stride)) {
-		printf("o");
-		fflush(stdout);
-	}
-
-	return sp->n >= 1 ? 0 : -1;
-}
-
-static void check_solution(isl_basic_set *bset, isl_basic_set *context,
-	isl_set *sol, isl_set *empty, int max)
-{
-	struct isl_scan_pip sp;
-	isl_int count, count_max;
-	int i, n;
-	int r;
-
-	context = set_bounds(context);
-	context = isl_basic_set_underlying_set(context);
-
-	isl_int_init(count);
-	isl_int_init(count_max);
-
-	isl_int_set_si(count_max, 2000);
-	r = isl_basic_set_count_upto(context, count_max, &count);
-	assert(r >= 0);
-	n = isl_int_get_si(count);
-
-	isl_int_clear(count_max);
-	isl_int_clear(count);
-
-	sp.callback.add = scan_one;
-	sp.bset = bset;
-	sp.sol = sol;
-	sp.empty = empty;
-	sp.n = n;
-	sp.stride = n > 70 ? 1 + (n + 1)/70 : 1;
-	sp.max = max;
-
-	for (i = 0; i < n; i += sp.stride)
-		printf(".");
-	printf("\r");
-	fflush(stdout);
-
-	isl_basic_set_scan(context, &sp.callback);
-
-	printf("\n");
-
-	isl_basic_set_free(bset);
-}
-
-int main(int argc, char **argv)
-{
-	struct isl_ctx *ctx;
-	struct isl_basic_set *context, *bset, *copy, *context_copy;
-	struct isl_set *set = NULL;
-	struct isl_set *empty;
-	isl_pw_multi_aff *pma = NULL;
-	int neg_one;
-	char s[1024];
-	int urs_parms = 0;
-	int urs_unknowns = 0;
-	int max = 0;
-	int rational = 0;
-	int n;
-	int nparam;
-	struct options *options;
-
-	options = options_new_with_defaults();
-	assert(options);
-	argc = options_parse(options, argc, argv, ISL_ARG_ALL);
-
-	ctx = isl_ctx_alloc_with_options(&options_args, options);
-
-	context = isl_basic_set_read_from_file(ctx, stdin);
-	assert(context);
-	n = fscanf(stdin, "%d", &neg_one);
-	assert(n == 1);
-	assert(neg_one == -1);
-	bset = isl_basic_set_read_from_file(ctx, stdin);
-
-	while (fgets(s, sizeof(s), stdin)) {
-		if (strncasecmp(s, "Maximize", 8) == 0)
-			max = 1;
-		if (strncasecmp(s, "Rational", 8) == 0) {
-			rational = 1;
-			bset = isl_basic_set_set_rational(bset);
-		}
-		if (strncasecmp(s, "Urs_parms", 9) == 0)
-			urs_parms = 1;
-		if (strncasecmp(s, "Urs_unknowns", 12) == 0)
-			urs_unknowns = 1;
-	}
-	if (!urs_parms)
-		context = isl_basic_set_intersect(context,
-		isl_basic_set_positive_orthant(isl_basic_set_get_space(context)));
-	context = to_parameter_domain(context);
-	nparam = isl_basic_set_dim(context, isl_dim_param);
-	if (nparam != isl_basic_set_dim(bset, isl_dim_param)) {
-		int dim = isl_basic_set_dim(bset, isl_dim_set);
-		bset = isl_basic_set_move_dims(bset, isl_dim_param, 0,
-					    isl_dim_set, dim - nparam, nparam);
-	}
-	if (!urs_unknowns)
-		bset = isl_basic_set_intersect(bset,
-		isl_basic_set_positive_orthant(isl_basic_set_get_space(bset)));
-
-	if (options->verify) {
-		copy = isl_basic_set_copy(bset);
-		context_copy = isl_basic_set_copy(context);
-	}
-
-	if (options->format == FORMAT_AFF) {
-		if (max)
-			pma = isl_basic_set_partial_lexmax_pw_multi_aff(bset,
-								context, &empty);
-		else
-			pma = isl_basic_set_partial_lexmin_pw_multi_aff(bset,
-								context, &empty);
-	} else {
-		if (max)
-			set = isl_basic_set_partial_lexmax(bset,
-								context, &empty);
-		else
-			set = isl_basic_set_partial_lexmin(bset,
-								context, &empty);
-	}
-
-	if (options->verify) {
-		assert(!rational);
-		if (options->format == FORMAT_AFF)
-			set = isl_set_from_pw_multi_aff(pma);
-		check_solution(copy, context_copy, set, empty, max);
-		isl_set_free(set);
-	} else {
-		isl_printer *p;
-		p = isl_printer_to_file(ctx, stdout);
-		if (options->format == FORMAT_AFF)
-			p = isl_printer_print_pw_multi_aff(p, pma);
-		else
-			p = isl_printer_print_set(p, set);
-		p = isl_printer_end_line(p);
-		p = isl_printer_print_str(p, "no solution: ");
-		p = isl_printer_print_set(p, empty);
-		p = isl_printer_end_line(p);
-		isl_printer_free(p);
-		isl_set_free(set);
-		isl_pw_multi_aff_free(pma);
-	}
-
-	isl_set_free(empty);
-	isl_ctx_free(ctx);
-
-	return 0;
-}
diff --git a/cloog-0.17.0/isl/pip_test.sh.in b/cloog-0.17.0/isl/pip_test.sh.in
deleted file mode 100755
index 28ad1ef..0000000
--- a/cloog-0.17.0/isl/pip_test.sh.in
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/sh
-
-EXEEXT=@EXEEXT@
-
-PIP_TESTS="\
-	boulet.pip \
-	brisebarre.pip \
-	cg1.pip \
-	esced.pip \
-	ex2.pip \
-	ex.pip \
-	fimmel.pip \
-	max.pip \
-	negative.pip \
-	seghir-vd.pip \
-	small.pip \
-	sor1d.pip \
-	square.pip \
-	sven.pip \
-	tobi.pip"
-
-for i in $PIP_TESTS; do
-	echo $i;
-	./isl_pip$EXEEXT --format=set --context=gbr -T < $srcdir/test_inputs/$i || exit
-	./isl_pip$EXEEXT --format=set --context=lexmin -T < $srcdir/test_inputs/$i || exit
-	./isl_pip$EXEEXT --format=affine --context=gbr -T < $srcdir/test_inputs/$i || exit
-	./isl_pip$EXEEXT --format=affine --context=lexmin -T < $srcdir/test_inputs/$i || exit
-done
diff --git a/cloog-0.17.0/isl/polyhedron_detect_equalities.c b/cloog-0.17.0/isl/polyhedron_detect_equalities.c
deleted file mode 100644
index f66d08f..0000000
--- a/cloog-0.17.0/isl/polyhedron_detect_equalities.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <isl/set.h>
-
-int main(int argc, char **argv)
-{
-	struct isl_ctx *ctx = isl_ctx_alloc();
-	struct isl_basic_set *bset;
-
-	bset = isl_basic_set_read_from_file(ctx, stdin);
-	bset = isl_basic_set_detect_equalities(bset);
-	isl_basic_set_print(bset, stdout, 0, "", "", ISL_FORMAT_POLYLIB);
-	isl_basic_set_free(bset);
-	isl_ctx_free(ctx);
-
-	return 0;
-}
diff --git a/cloog-0.17.0/isl/polyhedron_minimize.c b/cloog-0.17.0/isl/polyhedron_minimize.c
deleted file mode 100644
index 99c3f98..0000000
--- a/cloog-0.17.0/isl/polyhedron_minimize.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <assert.h>
-#include <isl/set.h>
-#include <isl/vec.h>
-#include <isl/ilp.h>
-#include <isl/seq.h>
-
-/* The input of this program is the same as that of the "polytope_minimize"
- * program from the barvinok distribution.
- *
- * Constraints of set is PolyLib format.
- * Linear or affine objective function in PolyLib format.
- */
-
-static struct isl_vec *isl_vec_lin_to_aff(struct isl_vec *vec)
-{
-	struct isl_vec *aff;
-
-	if (!vec)
-		return NULL;
-	aff = isl_vec_alloc(vec->ctx, 1 + vec->size);
-	if (!aff)
-		goto error;
-	isl_int_set_si(aff->el[0], 0);
-	isl_seq_cpy(aff->el + 1, vec->el, vec->size);
-	isl_vec_free(vec);
-	return aff;
-error:
-	isl_vec_free(vec);
-	return NULL;
-}
-
-/* Rotate elements of vector right.
- * In particular, move the constant term from the end of the
- * vector to the start of the vector.
- */
-static struct isl_vec *vec_ror(struct isl_vec *vec)
-{
-	int i;
-
-	if (!vec)
-		return NULL;
-	for (i = vec->size - 2; i >= 0; --i)
-		isl_int_swap(vec->el[i], vec->el[i + 1]);
-	return vec;
-}
-
-int main(int argc, char **argv)
-{
-	struct isl_ctx *ctx = isl_ctx_alloc();
-	struct isl_basic_set *bset;
-	struct isl_vec *obj;
-	struct isl_vec *sol;
-	isl_int opt;
-	unsigned dim;
-	enum isl_lp_result res;
-	isl_printer *p;
-
-	isl_int_init(opt);
-	bset = isl_basic_set_read_from_file(ctx, stdin);
-	assert(bset);
-	obj = isl_vec_read_from_file(ctx, stdin);
-	assert(obj);
-	dim = isl_basic_set_total_dim(bset);
-	assert(obj->size >= dim && obj->size <= dim + 1);
-	if (obj->size != dim + 1)
-		obj = isl_vec_lin_to_aff(obj);
-	else
-		obj = vec_ror(obj);
-	res = isl_basic_set_solve_ilp(bset, 0, obj->el, &opt, &sol);
-	switch (res) {
-	case isl_lp_error:
-		fprintf(stderr, "error\n");
-		return -1;
-	case isl_lp_empty:
-		fprintf(stdout, "empty\n");
-		break;
-	case isl_lp_unbounded:
-		fprintf(stdout, "unbounded\n");
-		break;
-	case isl_lp_ok:
-		p = isl_printer_to_file(ctx, stdout);
-		p = isl_printer_print_vec(p, sol);
-		p = isl_printer_end_line(p);
-		p = isl_printer_print_isl_int(p, opt);
-		p = isl_printer_end_line(p);
-		isl_printer_free(p);
-	}
-	isl_basic_set_free(bset);
-	isl_vec_free(obj);
-	isl_vec_free(sol);
-	isl_ctx_free(ctx);
-	isl_int_clear(opt);
-
-	return 0;
-}
diff --git a/cloog-0.17.0/isl/polyhedron_sample.c b/cloog-0.17.0/isl/polyhedron_sample.c
deleted file mode 100644
index f0e1af7..0000000
--- a/cloog-0.17.0/isl/polyhedron_sample.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <assert.h>
-#include <isl_map_private.h>
-#include "isl_sample.h"
-#include <isl/vec.h>
-
-int main(int argc, char **argv)
-{
-	struct isl_ctx *ctx = isl_ctx_alloc();
-	struct isl_basic_set *bset;
-	struct isl_vec *sample;
-	isl_printer *p;
-
-	bset = isl_basic_set_read_from_file(ctx, stdin);
-	sample = isl_basic_set_sample_vec(isl_basic_set_copy(bset));
-	p = isl_printer_to_file(ctx, stdout);
-	p = isl_printer_print_vec(p, sample);
-	p = isl_printer_end_line(p);
-	isl_printer_free(p);
-	assert(sample);
-	if (sample->size > 0)
-		assert(isl_basic_set_contains(bset, sample));
-	isl_basic_set_free(bset);
-	isl_vec_free(sample);
-	isl_ctx_free(ctx);
-
-	return 0;
-}
diff --git a/cloog-0.17.0/isl/polytope_scan.c b/cloog-0.17.0/isl/polytope_scan.c
deleted file mode 100644
index 2e7adc6..0000000
--- a/cloog-0.17.0/isl/polytope_scan.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright 2008-2009 Katholieke Universiteit Leuven
- *
- * Use of this software is governed by the GNU LGPLv2.1 license
- *
- * Written by Sven Verdoolaege, K.U.Leuven, Departement
- * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
- */
-
-#include <assert.h>
-#include <isl_map_private.h>
-#include "isl_equalities.h"
-#include <isl/seq.h>
-#include "isl_scan.h"
-#include <isl_mat_private.h>
-
-/* The input of this program is the same as that of the "polytope_scan"
- * program from the barvinok distribution.
- *
- * Constraints of set is PolyLib format.
- *
- * The input set is assumed to be bounded.
- */
-
-struct scan_samples {
-	struct isl_scan_callback callback;
-	struct isl_mat *samples;
-};
-
-static int scan_samples_add_sample(struct isl_scan_callback *cb,
-	__isl_take isl_vec *sample)
-{
-	struct scan_samples *ss = (struct scan_samples *)cb;
-
-	ss->samples = isl_mat_extend(ss->samples, ss->samples->n_row + 1,
-						  ss->samples->n_col);
-	if (!ss->samples)
-		goto error;
-
-	isl_seq_cpy(ss->samples->row[ss->samples->n_row - 1],
-		    sample->el, sample->size);
-
-	isl_vec_free(sample);
-	return 0;
-error:
-	isl_vec_free(sample);
-	return -1;
-}
-
-static struct isl_mat *isl_basic_set_scan_samples(struct isl_basic_set *bset)
-{
-	isl_ctx *ctx;
-	unsigned dim;
-	struct scan_samples ss;
-
-	ctx = isl_basic_set_get_ctx(bset);
-	dim = isl_basic_set_total_dim(bset);
-	ss.callback.add = scan_samples_add_sample;
-	ss.samples = isl_mat_alloc(ctx, 0, 1 + dim);
-	if (!ss.samples)
-		goto error;
-
-	if (isl_basic_set_scan(bset, &ss.callback) < 0) {
-		isl_mat_free(ss.samples);
-		return NULL;
-	}
-
-	return ss.samples;
-error:
-	isl_basic_set_free(bset);
-	return NULL;
-}
-
-static struct isl_mat *isl_basic_set_samples(struct isl_basic_set *bset)
-{
-	struct isl_mat *T;
-	struct isl_mat *samples;
-
-	if (!bset)
-		return NULL;
-
-	if (bset->n_eq == 0)
-		return isl_basic_set_scan_samples(bset);
-
-	bset = isl_basic_set_remove_equalities(bset, &T, NULL);
-	samples = isl_basic_set_scan_samples(bset);
-	return isl_mat_product(samples, isl_mat_transpose(T));
-}
-
-int main(int argc, char **argv)
-{
-	struct isl_ctx *ctx = isl_ctx_alloc();
-	struct isl_basic_set *bset;
-	struct isl_mat *samples;
-
-	bset = isl_basic_set_read_from_file(ctx, stdin);
-	samples = isl_basic_set_samples(bset);
-	isl_mat_print_internal(samples, stdout, 0);
-	isl_mat_free(samples);
-	isl_ctx_free(ctx);
-
-	return 0;
-}
diff --git a/cloog-0.17.0/isl/print.c b/cloog-0.17.0/isl/print.c
deleted file mode 100644
index 4e0aecd..0000000
--- a/cloog-0.17.0/isl/print.c
+++ /dev/null
@@ -1,77 +0,0 @@
-#include <isl/ctx.h>
-#include <isl/id.h>
-#include <isl/space.h>
-#include <isl/local_space.h>
-#include <isl/set.h>
-#include <isl/map.h>
-#include <isl/union_set.h>
-#include <isl/union_map.h>
-#include <isl/polynomial.h>
-#include <isl/band.h>
-#include <isl/constraint.h>
-#include <isl/aff.h>
-#include <isl/printer.h>
-
-#undef BASE
-#define BASE id
-#include <print_templ.c>
-#undef BASE
-#define BASE space
-#include <print_templ.c>
-#undef BASE
-#define BASE local_space
-#include <print_templ.c>
-#undef BASE
-#define BASE basic_set
-#include <print_templ.c>
-#undef BASE
-#define BASE basic_map
-#include <print_templ.c>
-#undef BASE
-#define BASE set
-#include <print_templ.c>
-#undef BASE
-#define BASE map
-#include <print_templ.c>
-#undef BASE
-#define BASE union_set
-#include <print_templ.c>
-#undef BASE
-#define BASE union_map
-#include <print_templ.c>
-#undef BASE
-#define BASE qpolynomial
-#include <print_templ.c>
-#undef BASE
-#define BASE qpolynomial_fold
-#include <print_templ.c>
-#undef BASE
-#define BASE pw_qpolynomial
-#include <print_templ.c>
-#undef BASE
-#define BASE pw_qpolynomial_fold
-#include <print_templ.c>
-#undef BASE
-#define BASE union_pw_qpolynomial
-#include <print_templ.c>
-#undef BASE
-#define BASE union_pw_qpolynomial_fold
-#include <print_templ.c>
-#undef BASE
-#define BASE band
-#include <print_templ.c>
-#undef BASE
-#define BASE constraint
-#include <print_templ.c>
-#undef BASE
-#define BASE aff
-#include <print_templ.c>
-#undef BASE
-#define BASE pw_aff
-#include <print_templ.c>
-#undef BASE
-#define BASE multi_aff
-#include <print_templ.c>
-#undef BASE
-#define BASE pw_multi_aff
-#include <print_templ.c>
diff --git a/cloog-0.17.0/isl/print_templ.c b/cloog-0.17.0/isl/print_templ.c
deleted file mode 100644
index f147fdc..0000000
--- a/cloog-0.17.0/isl/print_templ.c
+++ /dev/null
@@ -1,33 +0,0 @@
-#define xCAT(A,B) A ## B
-#define CAT(A,B) xCAT(A,B)
-#undef TYPE
-#define TYPE CAT(isl_,BASE)
-#define xFN(TYPE,NAME) TYPE ## _ ## NAME
-#define FN(TYPE,NAME) xFN(TYPE,NAME)
-
-void FN(TYPE,dump)(__isl_keep TYPE *obj)
-{
-	isl_printer *p;
-
-	if (!obj)
-		return;
-	p = isl_printer_to_file(FN(TYPE,get_ctx)(obj), stderr);
-	p = FN(isl_printer_print,BASE)(p, obj);
-	p = isl_printer_end_line(p);
-	isl_printer_free(p);
-}
-
-__isl_give char *FN(TYPE,to_str)(__isl_keep TYPE *obj)
-{
-	isl_printer *p;
-	char *s;
-
-	if (!obj)
-		return NULL;
-	p = isl_printer_to_str(FN(TYPE,get_ctx)(obj));
-	p = FN(isl_printer_print,BASE)(p, obj);
-	s = isl_printer_get_str(p);
-	isl_printer_free(p);
-
-	return s;
-}
diff --git a/cloog-0.17.0/isl/test_inputs/affine.polylib b/cloog-0.17.0/isl/test_inputs/affine.polylib
deleted file mode 100644
index f14720c..0000000
--- a/cloog-0.17.0/isl/test_inputs/affine.polylib
+++ /dev/null
@@ -1,9 +0,0 @@
-# the affine hull of {[a,b] : a=b && 1 <= a <= 163} ...
-3 4
-0 1 -1 0
-1 1  0 -1
-1 -1 0 163
-
-# ... is {[a,b] : a=b} (and not {[In_1,In_2]}, as Omega 1.2 claims)
-1 4
-0 1 -1 0
diff --git a/cloog-0.17.0/isl/test_inputs/affine2.polylib b/cloog-0.17.0/isl/test_inputs/affine2.polylib
deleted file mode 100644
index c67db77..0000000
--- a/cloog-0.17.0/isl/test_inputs/affine2.polylib
+++ /dev/null
@@ -1,9 +0,0 @@
-5 5
-1 -2 0 1 0
-1 2 0 -1 1
-1 0 -2 1 0
-1 0 2 -1 1
-1 0 0 1 -1
-
-1 5
-0 1 -1 0 0
diff --git a/cloog-0.17.0/isl/test_inputs/affine3.polylib b/cloog-0.17.0/isl/test_inputs/affine3.polylib
deleted file mode 100644
index f2bc9a2..0000000
--- a/cloog-0.17.0/isl/test_inputs/affine3.polylib
+++ /dev/null
@@ -1,7 +0,0 @@
-3 4
-1 1 0 0
-1 -7 4 2
-1 5 -4 2
-
-1 4
-0 3 -2 0
diff --git a/cloog-0.17.0/isl/test_inputs/application.omega b/cloog-0.17.0/isl/test_inputs/application.omega
deleted file mode 100644
index 8f4fd1d..0000000
--- a/cloog-0.17.0/isl/test_inputs/application.omega
+++ /dev/null
@@ -1,3 +0,0 @@
-{[x]}
-{[x] -> [y] : y = 2x}
-{[y]: Exists ( alpha : 2alpha = y)}
diff --git a/cloog-0.17.0/isl/test_inputs/application2.omega b/cloog-0.17.0/isl/test_inputs/application2.omega
deleted file mode 100644
index f2af1e8..0000000
--- a/cloog-0.17.0/isl/test_inputs/application2.omega
+++ /dev/null
@@ -1,3 +0,0 @@
-{[x] : x >= 0 && x <= 20 }
-{[x] -> [y] : y = 2x}
-{[y]: Exists ( alpha : 2alpha = y && 0 <= y && y <= 40)}
diff --git a/cloog-0.17.0/isl/test_inputs/basicLinear.pwqp b/cloog-0.17.0/isl/test_inputs/basicLinear.pwqp
deleted file mode 100644
index 0af7fab..0000000
--- a/cloog-0.17.0/isl/test_inputs/basicLinear.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[P, Q] -> { [n, m] -> n : n >= 1 and m >= n and m <= P and m <= Q }
diff --git a/cloog-0.17.0/isl/test_inputs/basicLinear2.pwqp b/cloog-0.17.0/isl/test_inputs/basicLinear2.pwqp
deleted file mode 100644
index d411a36..0000000
--- a/cloog-0.17.0/isl/test_inputs/basicLinear2.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[P, Q] -> { [n, m] -> n : n >= 1 and m >= n and m <= P and n >= -1 + Q }
diff --git a/cloog-0.17.0/isl/test_inputs/basicTest.pwqp b/cloog-0.17.0/isl/test_inputs/basicTest.pwqp
deleted file mode 100644
index 52e7fc8..0000000
--- a/cloog-0.17.0/isl/test_inputs/basicTest.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[p] -> { [n, m] -> (n + n^2) : n >= 1 and m >= n and m <= p }
diff --git a/cloog-0.17.0/isl/test_inputs/basicTestParameterPosNeg.pwqp b/cloog-0.17.0/isl/test_inputs/basicTestParameterPosNeg.pwqp
deleted file mode 100644
index 6cb4490..0000000
--- a/cloog-0.17.0/isl/test_inputs/basicTestParameterPosNeg.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[p] -> { [n, m] -> (n + n^3) : n >= -1 and m >= n and m <= p }
diff --git a/cloog-0.17.0/isl/test_inputs/boulet.pip b/cloog-0.17.0/isl/test_inputs/boulet.pip
deleted file mode 100644
index 78e90dd..0000000
--- a/cloog-0.17.0/isl/test_inputs/boulet.pip
+++ /dev/null
@@ -1,13 +0,0 @@
-0 3
-
--1
-
-5 6
-1 1 -1  2 0 0
-1 0  1  1 4 20
-1 0 -1 -1 0 0
-1 0  1 -1 2 10
-1 0 -1  1 2 10
-
-Urs_parms
-Urs_unknowns
diff --git a/cloog-0.17.0/isl/test_inputs/brisebarre.pip b/cloog-0.17.0/isl/test_inputs/brisebarre.pip
deleted file mode 100644
index 5d25dae..0000000
--- a/cloog-0.17.0/isl/test_inputs/brisebarre.pip
+++ /dev/null
@@ -1,34 +0,0 @@
-# ---------------------- CONTEXT ----------------------
-1 2
-1    0
-
--1
-
-# ----------------------- DOMAIN ----------------------
-26 6
-1    3    0    0     0    -98300
-1   -3    0    0     0     98308
-1  432   36    6     1 -14757611
-1 -432  -36   -6    -1  14758510
-1   54    9    3     1  -1923190
-1  -54   -9   -3    -1   1923303
-1   48   12    6     3  -1782238
-1  -48  -12   -6    -3   1782339
-1   27    9    6     4  -1045164
-1  -27   -9   -6    -4   1045221
-1  432  180  150   125 -17434139
-1 -432 -180 -150  -125  17435038
-1    6    3    3     3   -252443
-1   -6   -3   -3    -3    252456
-1  432  252  294   343 -18949275
-1 -432 -252 -294  -343  18950174
-1   27   18   24    32  -1234720
-1  -27  -18  -24   -32   1234777
-1   48   36   54    81  -2288453
-1  -48  -36  -54   -81   2288554
-1   54   45   75   125  -2684050
-1  -54  -45  -75  -125   2684163
-1  432  396  726  1331 -22386005
-1 -432 -396 -726 -1331  22386904
-1    3    3    6    12   -162072
-1   -3   -3   -6   -12    162080
diff --git a/cloog-0.17.0/isl/test_inputs/cg1.pip b/cloog-0.17.0/isl/test_inputs/cg1.pip
deleted file mode 100644
index 78e31f1..0000000
--- a/cloog-0.17.0/isl/test_inputs/cg1.pip
+++ /dev/null
@@ -1,15 +0,0 @@
-2 4
-  1  1  0 -1
-  1 -1  1  0
-
--1
-
-8 7
-  1  0  1  0 -1  0  0
-  1  0 -1  0  1  0  0
-  1  1  0  0  0 -1  0
-  1 -1  0  0  0  1  0
-  1  0  1  0  0  0 -1
-  1  0 -1  0  0  1  0
-  1  0 -1  1  0  0 -1
-  1  0  0 -1  0  1  0
diff --git a/cloog-0.17.0/isl/test_inputs/convex0.polylib b/cloog-0.17.0/isl/test_inputs/convex0.polylib
deleted file mode 100644
index cbc4d3b..0000000
--- a/cloog-0.17.0/isl/test_inputs/convex0.polylib
+++ /dev/null
@@ -1,11 +0,0 @@
-2 3
-1 1 0
-1 -1 1
-
-2 3
-1 1 -1
-1 -1 2
-
-2 3
-1 1 0
-1 -1 2
diff --git a/cloog-0.17.0/isl/test_inputs/convex1.polylib b/cloog-0.17.0/isl/test_inputs/convex1.polylib
deleted file mode 100644
index b563d8d..0000000
--- a/cloog-0.17.0/isl/test_inputs/convex1.polylib
+++ /dev/null
@@ -1,17 +0,0 @@
-# {j,N | 0<=j<=N-1; 2<=N}
-4 4
-1   1  0   0
-1  -1  1  -1
-1   0  1  -2
-1   0  0   1
-# {j, N | 1<=j<=N; 1<=N}
-4 4
-1  1  0  -1
-1 -1  1   0
-1  0  1  -1
-1  0  0   1
-# {j,N | 0<=j<=N; 2<=j+N}
-3 4
-   1    1    1   -2
-   1    1    0    0
-   1   -1    1    0
diff --git a/cloog-0.17.0/isl/test_inputs/convex10.polylib b/cloog-0.17.0/isl/test_inputs/convex10.polylib
deleted file mode 100644
index 3d58cbf..0000000
--- a/cloog-0.17.0/isl/test_inputs/convex10.polylib
+++ /dev/null
@@ -1,17 +0,0 @@
-3 4
-1 54 1 -4
-1 2 -1 58
-1 0 -1 6
-
-4 4
-1 54 1 -4
-1 2 -1 58
-1 0 1 -7
-1 -4 1 0
-
-4 4
-1  54    1   -4
-1   2   -1   58
-1   0   -1  116
-1   0    0    1
-
diff --git a/cloog-0.17.0/isl/test_inputs/convex11.polylib b/cloog-0.17.0/isl/test_inputs/convex11.polylib
deleted file mode 100644
index f664114..0000000
--- a/cloog-0.17.0/isl/test_inputs/convex11.polylib
+++ /dev/null
@@ -1,14 +0,0 @@
-3 4
-1 0 -1 6
-1 -1 1 1
-1 1 1 -10
-
-3 4
-1 1 0 -4
-1 -1 -1 8
-1 -1 1 1
-
-3 4
-1 0 -1 6
-1 1 0 -4
-1 -1 1 1
diff --git a/cloog-0.17.0/isl/test_inputs/convex12.polylib b/cloog-0.17.0/isl/test_inputs/convex12.polylib
deleted file mode 100644
index e476630..0000000
--- a/cloog-0.17.0/isl/test_inputs/convex12.polylib
+++ /dev/null
@@ -1,12 +0,0 @@
-3 5
-1   0    0    1    1
-1   0    1    0    1
-1  -1   -1    0   -2
-
-3 5
-1   0    0    1    2
-1   1   -1    0    0
-1   1    0    0   -1
-
-1 5
-1   0    0    1    2
diff --git a/cloog-0.17.0/isl/test_inputs/convex13.polylib b/cloog-0.17.0/isl/test_inputs/convex13.polylib
deleted file mode 100644
index 1b35912..0000000
--- a/cloog-0.17.0/isl/test_inputs/convex13.polylib
+++ /dev/null
@@ -1,17 +0,0 @@
-3 5
-1   0    0   -1    3
-1   0   -1    0    2
-1   1    1    1   -4
-
-3 5
-1   0    0    1    0
-1   1    0    0   -1
-1   1    2    0    1
-
-6 5
-1   3    2    0   -1
-1   3    0    2   -3
-1   1    0    1   -1
-1   1    1    1    0
-1   1    1    0    0
-1   1    0    0    1
diff --git a/cloog-0.17.0/isl/test_inputs/convex14.polylib b/cloog-0.17.0/isl/test_inputs/convex14.polylib
deleted file mode 100644
index caaa8f5..0000000
--- a/cloog-0.17.0/isl/test_inputs/convex14.polylib
+++ /dev/null
@@ -1,14 +0,0 @@
-3 4
-0 1 0 2
-1 0 1 0
-1 0 -1 2
-
-3 4
-1 1 0 0
-1 0 1 0
-1 0 -1 2
-
-3 4
-1 1 0 2
-1 0 1 0
-1 0 -1 2
diff --git a/cloog-0.17.0/isl/test_inputs/convex15.polylib b/cloog-0.17.0/isl/test_inputs/convex15.polylib
deleted file mode 100644
index 0118fa8..0000000
--- a/cloog-0.17.0/isl/test_inputs/convex15.polylib
+++ /dev/null
@@ -1,66 +0,0 @@
-17 8
-1    -1    -8     0    16     0     0    37
-1     1     0   -48     0     2     0    -3
-1     0   -16   -32    16     1     0    14
-1    -1    24     0     0     1     0    18
-1    -1     8    16     0     0     1    21
-1     0     0   -16     0     1     1    -2
-1     1    32    16   -32     0     0    -1
-1    -1    16    16     0     0     0    28
-1     1    -8   -32     0     1     0    -1
-1     0     0     0     0     1     0    -1
-1     0    16    16   -16     0     1    -1
-1     1     8     0   -16     0     0     0
-1     0     3     2    -2     0     0     0
-1     0     1     2    -1     0     0     0
-1     0    -1    -1     1     0     0     0
-1    -1     8     0     0     1     2     4
-1    -1   -24   -32    32     1     0    36
-
-13 8
-1    -1     0     0     0     1     3    -4
-1     1     0   -48     0     2     0    -2
-1     0     0     0     0     1     0    -1
-1     0    -8     0     0     0     1    -1
-1     0     3     2    -2     0     0     0
-1     1   -16   -16     0     0     0     0
-1     1   -24     0     0     0     0     0
-1     0     1     0     0     0     0     0
-1     0    -3    -2     2     0     0     1
-1    -1     0    16     0     0     2    13
-1    -1    24     0     0     1     0    20
-1    -1    16    16     0     0     0    29
-1    -1     0    48     0     0     0    45
-
-31 8
-   1    0    1    0    0    0    0    0 
-   1    0    0  -16    0    1    1   -2 
-   1    0    0    0    0    1    0   -1 
-   1   -1    8    0    0    1    2    4 
-   1    0    3    2   -2    0    0    0 
-   1   -1   24    0    0    1    0   20 
-   1    1    0  -48    0    2    0   -2 
-   1   -1  -24  -32   32    1    0   36 
-   1    0    0    0    0    0    1   -1 
-   1   -1   24   64  -16    0    0   45 
-   1  -15  120  112    0   15   38   52 
-   1    1   24   32  -32    0    0    0 
-   1    0   -2   -2    2    0    0    1 
-   1   -1    8   16    0    0    1   21 
-   1  -15  120  352    0    0   23  307 
-   1    1   -8  -32    0    1    0   -1 
-   1    1   -8    0    0    0    0    0 
-   1    1   -8  -16    0    0    0    0 
-   1    0   16   16  -16    0    1   -1 
-   1   -1   16   16    0    0    0   29 
-   1   -1   -8    0   16    0    0   37 
-   1   -1    8   32    0    0    0   37 
-   1    1    8    0  -16    0    0    0 
-   1  -15  360  592 -240    0   23  307 
-   1   -1   -6    2   14    0    2   20 
-   1  -15  360  352 -240   15   38   52 
-   1   -1    8   48    0    0    0   45 
-   1    0  -16  -32   16    1    0   14 
-   1   -1   -6  -14   14    1    3    3 
-   1    1  -38  -78   30    2    0   13 
-   1    1   -3  -50    2    2    0   -1 
diff --git a/cloog-0.17.0/isl/test_inputs/convex2.polylib b/cloog-0.17.0/isl/test_inputs/convex2.polylib
deleted file mode 100644
index 0bfd737..0000000
--- a/cloog-0.17.0/isl/test_inputs/convex2.polylib
+++ /dev/null
@@ -1,24 +0,0 @@
-# {i,j,N | 1<=i<=N; 0<=j<=N-1; 2<=N}
-6 5
-1  1  0  0 -1
-1 -1  0  1  0
-1  0  1  0  0
-1  0 -1  1 -1 
-1  0  0  1 -2
-1  0  0  0  1
-# {i,j,N | 1<=i<=N; 1<=j<=N; 2<=N}
-6 5
-1  1  0  0 -1
-1 -1  0  1  0
-1  0  1  0 -1
-1  0 -1  1  0
-1  0  0  1 -2
-1  0  0  0  1
-# {i,j,N | 1<=i<=N; 0<=j<=N; 2<=N}
-6 5
-   1    0    0    1   -2
-   1   -1    0    1    0
-   1    0   -1    1    0
-   1    1    0    0   -1
-   1    0    1    0    0
-   1    0    0    0    1
diff --git a/cloog-0.17.0/isl/test_inputs/convex3.polylib b/cloog-0.17.0/isl/test_inputs/convex3.polylib
deleted file mode 100644
index ea612c6..0000000
--- a/cloog-0.17.0/isl/test_inputs/convex3.polylib
+++ /dev/null
@@ -1,10 +0,0 @@
-1 4
-1 1 1 -6
-
-3 4
-1 1 1 -3
-1 1 0 -5
-1 -1 0 10
-
-1 4
-1 1 1 -3
diff --git a/cloog-0.17.0/isl/test_inputs/convex4.polylib b/cloog-0.17.0/isl/test_inputs/convex4.polylib
deleted file mode 100644
index 0c08653..0000000
--- a/cloog-0.17.0/isl/test_inputs/convex4.polylib
+++ /dev/null
@@ -1,9 +0,0 @@
-1 4
-1 1 1 -6
-
-2 4
-0 1 0 -1
-0 0 1 -4
-
-1 4
-1 1 1 -5
diff --git a/cloog-0.17.0/isl/test_inputs/convex5.polylib b/cloog-0.17.0/isl/test_inputs/convex5.polylib
deleted file mode 100644
index 3aae7c2..0000000
--- a/cloog-0.17.0/isl/test_inputs/convex5.polylib
+++ /dev/null
@@ -1,12 +0,0 @@
-2 4
-0 1 0 -2
-0 0 1 -6
-
-2 4
-0 1 0 -1
-0 0 1 -4
-
-3 4
-0 -2 1 -2
-1  1 0 -1
-1 -1 0  2
diff --git a/cloog-0.17.0/isl/test_inputs/convex6.polylib b/cloog-0.17.0/isl/test_inputs/convex6.polylib
deleted file mode 100644
index 1bdb4e1..0000000
--- a/cloog-0.17.0/isl/test_inputs/convex6.polylib
+++ /dev/null
@@ -1,17 +0,0 @@
-3 4
-1   1    1   -2
-1  -1    1    2
-1   0   -1    2
-
-3 4
-1   0    1   -1
-1   1   -1    1
-1  -1   -1    5
-
-6 4
-1  -1    0    4
-1   1    0    0
-1   1    2   -2
-1  -1    2    2
-1   1   -2    4
-1  -1   -2    8
diff --git a/cloog-0.17.0/isl/test_inputs/convex7.polylib b/cloog-0.17.0/isl/test_inputs/convex7.polylib
deleted file mode 100644
index 70eb483..0000000
--- a/cloog-0.17.0/isl/test_inputs/convex7.polylib
+++ /dev/null
@@ -1,9 +0,0 @@
-1 4
-0 0 1 0
-
-2 4
-1 1 -1 1
-1 -1 -1 1
-
-1 4
-1 0 -1 1
diff --git a/cloog-0.17.0/isl/test_inputs/convex8.polylib b/cloog-0.17.0/isl/test_inputs/convex8.polylib
deleted file mode 100644
index ea1b757..0000000
--- a/cloog-0.17.0/isl/test_inputs/convex8.polylib
+++ /dev/null
@@ -1,24 +0,0 @@
-4 5
-1   1    1    1    0
-1   0   -1    0    0
-1  -1    0    0    2
-1   1    1   -1    0
-
-4 5
-1  -1    1    0    2
-1   1   -2   -2   -1
-1  -1    0    2    3
-1   1    0    0   -1
-
-10 5
-1   1    0    1    0
-1   1    1    0    0
-1   0    1    1    2
-1  -3    1   -1    8
-1  -3    1    1    8
-1   0    1   -1    2
-1   1    0   -1    0
-1   1   -2   -1    0
-1  -1   -3    2    6
-1   1   -5   -2    2
-
diff --git a/cloog-0.17.0/isl/test_inputs/convex9.polylib b/cloog-0.17.0/isl/test_inputs/convex9.polylib
deleted file mode 100644
index f68fca0..0000000
--- a/cloog-0.17.0/isl/test_inputs/convex9.polylib
+++ /dev/null
@@ -1,14 +0,0 @@
-4 4
-1 1 0 0
-1 -1 0 1
-1 0 1 0
-1 0 -1 10
-
-2 4
-1 1 0 -10
-0 0 -1 5
-
-3 4
-1 1 0 0
-1 0 1 0
-1 0 -1 10
diff --git a/cloog-0.17.0/isl/test_inputs/devos.pwqp b/cloog-0.17.0/isl/test_inputs/devos.pwqp
deleted file mode 100644
index b452544..0000000
--- a/cloog-0.17.0/isl/test_inputs/devos.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[U] -> { [i0] -> ((1/3 * U + 2/3 * i0) - [(U + 2i0)/3]) : 2i0 >= -3 - U and 2i0 <= -U and U >= 0 and U <= 10 }
diff --git a/cloog-0.17.0/isl/test_inputs/equality1.pwqp b/cloog-0.17.0/isl/test_inputs/equality1.pwqp
deleted file mode 100644
index eb16a4b..0000000
--- a/cloog-0.17.0/isl/test_inputs/equality1.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[n] -> { [x] -> 1 + [(x+1)/3] : exists a : x = 3a +1 && 0 <= x <= n }
diff --git a/cloog-0.17.0/isl/test_inputs/equality2.pwqp b/cloog-0.17.0/isl/test_inputs/equality2.pwqp
deleted file mode 100644
index 1629a65..0000000
--- a/cloog-0.17.0/isl/test_inputs/equality2.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[n] -> { [x,y] -> x^2 * y : n = 2x + 4y and 0 <= x,y <= 10 }
diff --git a/cloog-0.17.0/isl/test_inputs/equality3.pwqp b/cloog-0.17.0/isl/test_inputs/equality3.pwqp
deleted file mode 100644
index c6f8c3a..0000000
--- a/cloog-0.17.0/isl/test_inputs/equality3.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[m,n] -> { [x,y] -> x^2 * y : n = 2x + 4y and 0 <= x,y <= 10 and 3 n = 5 m }
diff --git a/cloog-0.17.0/isl/test_inputs/equality4.pwqp b/cloog-0.17.0/isl/test_inputs/equality4.pwqp
deleted file mode 100644
index 49da2e7..0000000
--- a/cloog-0.17.0/isl/test_inputs/equality4.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[m,n] -> { [x,y] -> x^2 * y + m + 13 * n: n = 2x + 4y and 0 <= x,y <= 10 and 3 n = 5 m }
diff --git a/cloog-0.17.0/isl/test_inputs/equality5.pwqp b/cloog-0.17.0/isl/test_inputs/equality5.pwqp
deleted file mode 100644
index 09cb752..0000000
--- a/cloog-0.17.0/isl/test_inputs/equality5.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[m,n] -> { [x,y,z] -> x^2 * y + z + m + 13 * n: n = 2x + 4y and 0 <= x,y <= 10 and 3 n = 5 m and z = x + y }
diff --git a/cloog-0.17.0/isl/test_inputs/esced.pip b/cloog-0.17.0/isl/test_inputs/esced.pip
deleted file mode 100644
index dbf56ff..0000000
--- a/cloog-0.17.0/isl/test_inputs/esced.pip
+++ /dev/null
@@ -1,27 +0,0 @@
-0 2
-
--1
-
-16 18
-1 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 0 0 0
-1 0 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 0 0
-1 0 0 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 0
-1 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0
-1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
-1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
-
-
-0 0 0 0 -1 0 0 0 0 1 -1 0 0 0 0 0 0 0
-0 0 0 0 0 -1 0 0 0 0 0 1 0 0 0 0 0 0
-
-0 -1 0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 0
-
-0 0 0 0 0 0 -1 0 0 0 0 0 1 -1 0 -1 0 0
-0 0 0 0 0 0 0 -1 0 0 0 0 0 0 1 0 0 0
-0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 1 0
-
-0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0
-0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0
-
-1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1
-1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 -1
diff --git a/cloog-0.17.0/isl/test_inputs/ex.pip b/cloog-0.17.0/isl/test_inputs/ex.pip
deleted file mode 100644
index a405450..0000000
--- a/cloog-0.17.0/isl/test_inputs/ex.pip
+++ /dev/null
@@ -1,9 +0,0 @@
-1 5
-1 -1  1  1  0 
-
--1
-
-3 7
-1  0 -1  0  1  0  0 
-1 -1  0  0  0  1  0 
-1  1  1 -1  0  0  0 
diff --git a/cloog-0.17.0/isl/test_inputs/ex2.pip b/cloog-0.17.0/isl/test_inputs/ex2.pip
deleted file mode 100644
index bb59848..0000000
--- a/cloog-0.17.0/isl/test_inputs/ex2.pip
+++ /dev/null
@@ -1,9 +0,0 @@
-1 5
-1 -1 1 1 0
-
--1
-
-3 7
-1 0 -1 0 1 0 0
-1 -1 0 0 0 1 0
-1 1 1 -1 0 0 0
diff --git a/cloog-0.17.0/isl/test_inputs/faddeev.pwqp b/cloog-0.17.0/isl/test_inputs/faddeev.pwqp
deleted file mode 100644
index e7db61d..0000000
--- a/cloog-0.17.0/isl/test_inputs/faddeev.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[N] -> { [i, j, k] -> (((4 + 6 * N + 2 * N^2) + (-2 - 2 * N) * j) + ((-2 - N) + j) * k) : j = 1 + i and k = 1 + i and i >= 3 and N <= 100 and i <= N and N >= 10 }
diff --git a/cloog-0.17.0/isl/test_inputs/fimmel.pip b/cloog-0.17.0/isl/test_inputs/fimmel.pip
deleted file mode 100644
index a6dee41..0000000
--- a/cloog-0.17.0/isl/test_inputs/fimmel.pip
+++ /dev/null
@@ -1,12 +0,0 @@
-0 4
-
--1
-
-7 6
-1 2  6 0 0 -9
-1 5 -3 0 0 0
-1 2 -10 0 0 15
-1 -2 6 0 0 -3
-1 -2 -6 0 0 17
-1 0 1 -1 0 0
-1 1 0 0 -1 0
diff --git a/cloog-0.17.0/isl/test_inputs/gist1.polylib b/cloog-0.17.0/isl/test_inputs/gist1.polylib
deleted file mode 100644
index 802a4eb..0000000
--- a/cloog-0.17.0/isl/test_inputs/gist1.polylib
+++ /dev/null
@@ -1,14 +0,0 @@
-4 5
-0 1 0 0 -1
-0 0 1 0 1
-0 0 0 1 -3
-1 0 0 0 1
-
-4 5
-0 1 0 0 -1
-0 0 1 1 -2
-1 0 0 1 0
-1 0 0 -1 3
-
-1 5
-0 0 1 0 1
diff --git a/cloog-0.17.0/isl/test_inputs/linearExample.pwqp b/cloog-0.17.0/isl/test_inputs/linearExample.pwqp
deleted file mode 100644
index 24c5394..0000000
--- a/cloog-0.17.0/isl/test_inputs/linearExample.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[N, M, L] -> { [i, j, k] -> ((1/2 * i + 5 * j) + 1/7 * k) : i >= 0 and k >= -N + i and k >= -M - j and j <= L + i and L >= 0 and L >= -M }
diff --git a/cloog-0.17.0/isl/test_inputs/max.pip b/cloog-0.17.0/isl/test_inputs/max.pip
deleted file mode 100644
index e8af57b..0000000
--- a/cloog-0.17.0/isl/test_inputs/max.pip
+++ /dev/null
@@ -1,9 +0,0 @@
-0 3
-
--1
-
-4 5
-1 -1  0  1  0
-1  0 -1  1  0
-1 -1  3 -2 12
-1  2 -1 -1  3
diff --git a/cloog-0.17.0/isl/test_inputs/neg.pwqp b/cloog-0.17.0/isl/test_inputs/neg.pwqp
deleted file mode 100644
index 596a7d7..0000000
--- a/cloog-0.17.0/isl/test_inputs/neg.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[n] -> { [i0] -> i0^2 : i0 >= -20 - n and i0 <= n and i0 <= -1 and n >= 0 }
diff --git a/cloog-0.17.0/isl/test_inputs/negative.pip b/cloog-0.17.0/isl/test_inputs/negative.pip
deleted file mode 100644
index 45090a5..0000000
--- a/cloog-0.17.0/isl/test_inputs/negative.pip
+++ /dev/null
@@ -1,9 +0,0 @@
-1 3
-#  n  1
-1  1 -1 # n >= 1
--1
-
-2 4
-#  i  n  1
-1  1  0  1 # i >= -1
-1 -1  1  0 # i <= n
diff --git a/cloog-0.17.0/isl/test_inputs/philippe.pwqp b/cloog-0.17.0/isl/test_inputs/philippe.pwqp
deleted file mode 100644
index 1c56e7a..0000000
--- a/cloog-0.17.0/isl/test_inputs/philippe.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[N] -> { [i, j] -> ((1/2 * i + 1/2 * i^2) + j) : i <= N and j >= 0 and j <= i }
diff --git a/cloog-0.17.0/isl/test_inputs/philippe3vars.pwqp b/cloog-0.17.0/isl/test_inputs/philippe3vars.pwqp
deleted file mode 100644
index 8d07496..0000000
--- a/cloog-0.17.0/isl/test_inputs/philippe3vars.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[N] -> { [i, j, k] -> (((1/2 * i + 1/2 * i^2) + j) + k^3) : i >= 0 and k >= -N + i and k >= -j and j <= i }
diff --git a/cloog-0.17.0/isl/test_inputs/philippe3vars3pars.pwqp b/cloog-0.17.0/isl/test_inputs/philippe3vars3pars.pwqp
deleted file mode 100644
index f81b8cc..0000000
--- a/cloog-0.17.0/isl/test_inputs/philippe3vars3pars.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[N, M, L] -> { [i, j, k] -> (((1/2 * i + 1/2 * i^2) + j) + k^3) : i >= 0 and k >= -N + i and k >= -M - j and j <= L + i and L >= 0 and L >= -M }
diff --git a/cloog-0.17.0/isl/test_inputs/philippeNeg.pwqp b/cloog-0.17.0/isl/test_inputs/philippeNeg.pwqp
deleted file mode 100644
index 24dc805..0000000
--- a/cloog-0.17.0/isl/test_inputs/philippeNeg.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[N] -> { [i, j] -> ((1/2 * i + 1/2 * i^2) + j) : i <= N and j >= -1 and j <= i }
diff --git a/cloog-0.17.0/isl/test_inputs/philippePolynomialCoeff.pwqp b/cloog-0.17.0/isl/test_inputs/philippePolynomialCoeff.pwqp
deleted file mode 100644
index e6327c7..0000000
--- a/cloog-0.17.0/isl/test_inputs/philippePolynomialCoeff.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[N, M] -> { [i, j] -> ((N * i + (1/5 * N + N^2) * i^2) + 5 * j) : i <= N and j >= 0 and j <= i and M >= 0 }
diff --git a/cloog-0.17.0/isl/test_inputs/philippePolynomialCoeff1P.pwqp b/cloog-0.17.0/isl/test_inputs/philippePolynomialCoeff1P.pwqp
deleted file mode 100644
index ae01d2f..0000000
--- a/cloog-0.17.0/isl/test_inputs/philippePolynomialCoeff1P.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[N] -> { [i, j] -> ((N * i + (1/5 * N + N^2) * i^2) + 5 * j) : i <= N and j >= 0 and j <= i }
diff --git a/cloog-0.17.0/isl/test_inputs/product.pwqp b/cloog-0.17.0/isl/test_inputs/product.pwqp
deleted file mode 100644
index ee48b85..0000000
--- a/cloog-0.17.0/isl/test_inputs/product.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[N] -> { [i0, i1, i2] -> (i0^3 * i1^2 + N * i1 * i2) : i0 >= 0 and i0 <= N and i1 >= 0 and i1 <= N and i2 >= 0 and i2 <= N }
diff --git a/cloog-0.17.0/isl/test_inputs/seghir-vd.pip b/cloog-0.17.0/isl/test_inputs/seghir-vd.pip
deleted file mode 100644
index b5395fb..0000000
--- a/cloog-0.17.0/isl/test_inputs/seghir-vd.pip
+++ /dev/null
@@ -1,17 +0,0 @@
-0 6
-
--1
-
-9 8
- 0 0 0 1 1 0 0 2
- 1 2 1 0 0 1 0 0
- 1 0 1 0 -1 0 0 -1
- 1 -2 -1 0 0 0 0 -1
- 1 7 3 0 0 0 0 -1
- 1 -6 -4 0 1 0 3 1
- 1 -7 -3 0 0 1 6 4
- 1 0 0 0 0 0 1 0
- 1 0 0 0 0 0 0 1
-
-Urs_parms
-Urs_unknowns
diff --git a/cloog-0.17.0/isl/test_inputs/set.omega b/cloog-0.17.0/isl/test_inputs/set.omega
deleted file mode 100644
index ac8485f..0000000
--- a/cloog-0.17.0/isl/test_inputs/set.omega
+++ /dev/null
@@ -1 +0,0 @@
-{[y]: Exists ( alpha : 2alpha = y)}
diff --git a/cloog-0.17.0/isl/test_inputs/small.pip b/cloog-0.17.0/isl/test_inputs/small.pip
deleted file mode 100644
index 59557d2..0000000
--- a/cloog-0.17.0/isl/test_inputs/small.pip
+++ /dev/null
@@ -1,9 +0,0 @@
-0 2
-
--1
-
-4 4
-1  1  0  0
-1  0  1  0
-1  1 -3 12
-1 -2  1  3
diff --git a/cloog-0.17.0/isl/test_inputs/sor1d.pip b/cloog-0.17.0/isl/test_inputs/sor1d.pip
deleted file mode 100644
index 1bef89e..0000000
--- a/cloog-0.17.0/isl/test_inputs/sor1d.pip
+++ /dev/null
@@ -1,28 +0,0 @@
-2 4
- 1	1	0	0
- 1	0	1	0
-
--1
-
-20 8
- 
- 0	-1	0	0	0	0	0	2
- 0	0	-1	0	0	0	0	1
- 0	0	0	-1	0	0	0	2
- 0	0	0	0	-1	0	0	4
- 1	0	0	0	1	0	0	-2
- 1	-2	0	2	1	0	0	-4
- 1	0	0	0	-1	0	1	-1
- 1	2	0	-2	-1	0	0	5
- 1	0	0	1	0	0	0	-1
- 1	0	-2	1	0	0	0	0
- 1	-2	0	2	0	0	1	-5
- 1	0	0	-1	0	1	0	0
- 1	0	2	-1	0	0	0	1
- 1	2	0	-2	0	0	0	3
- 1	0	1	0	0	0	0	0
- 1	-2	4	0	0	0	1	-3
- 1	0	-2	0	0	1	0	0
- 1	2	-4	0	0	0	0	3
- 1	2	0	0	0	0	0	1
- 1	-2	0	0	0	2	1	-5
diff --git a/cloog-0.17.0/isl/test_inputs/split.pwqp b/cloog-0.17.0/isl/test_inputs/split.pwqp
deleted file mode 100644
index 1804563..0000000
--- a/cloog-0.17.0/isl/test_inputs/split.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[n] -> { [x] -> -1 + [(x+5)/7] : -n - 20 <= x <= n }
diff --git a/cloog-0.17.0/isl/test_inputs/square.pip b/cloog-0.17.0/isl/test_inputs/square.pip
deleted file mode 100644
index 7bb3f0c..0000000
--- a/cloog-0.17.0/isl/test_inputs/square.pip
+++ /dev/null
@@ -1,9 +0,0 @@
-0 3
-
--1
-
-4 5
-1  1  0  0  0
-1 -1  0  1  0
-1  0  1  0  0
-1  0 -1  1  0
diff --git a/cloog-0.17.0/isl/test_inputs/sven.pip b/cloog-0.17.0/isl/test_inputs/sven.pip
deleted file mode 100644
index 8602769..0000000
--- a/cloog-0.17.0/isl/test_inputs/sven.pip
+++ /dev/null
@@ -1,7 +0,0 @@
-0 3
-
--1
-
-2 3
-1  1 -4
-1 -1 10
diff --git a/cloog-0.17.0/isl/test_inputs/test3Deg3Var.pwqp b/cloog-0.17.0/isl/test_inputs/test3Deg3Var.pwqp
deleted file mode 100644
index d9a9ea9..0000000
--- a/cloog-0.17.0/isl/test_inputs/test3Deg3Var.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[p] -> { [n, m] -> (n + n^3) : n >= 1 and m >= n and m <= p }
diff --git a/cloog-0.17.0/isl/test_inputs/tobi.pip b/cloog-0.17.0/isl/test_inputs/tobi.pip
deleted file mode 100644
index c31beae..0000000
--- a/cloog-0.17.0/isl/test_inputs/tobi.pip
+++ /dev/null
@@ -1,15 +0,0 @@
-2 3
-1 1 -281
-1 -1 14000
-
--1
-
-6 6
-0  -392     0     8    -1     0
-0   392     8     0     1     0
-1    -1     0     0     0     0
-1     1     0     0     0    35
-1   392     0     0     1     0
-1  -392     0     0    -1   280
-
-Urs_unknowns
diff --git a/cloog-0.17.0/isl/test_inputs/toplas.pwqp b/cloog-0.17.0/isl/test_inputs/toplas.pwqp
deleted file mode 100644
index 9c09995..0000000
--- a/cloog-0.17.0/isl/test_inputs/toplas.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-[n] -> { [i0, i1] -> (((4 * n - n^2) + (-3/2 + 2 * n) * i0 - 1/2 * i0^2) - i1) : i1 >= -1 + 3n - i0 and i1 >= -1 + 2n - i0 and i0 >= 0 and i1 <= -2 + 4n - i0 and i0 <= -2 + 4n and i0 <= -1 + 3n and i1 >= 0 and i1 <= -1 + n }
diff --git a/cloog-0.17.0/isl/test_inputs/unexpanded.pwqp b/cloog-0.17.0/isl/test_inputs/unexpanded.pwqp
deleted file mode 100644
index 5626d3b..0000000
--- a/cloog-0.17.0/isl/test_inputs/unexpanded.pwqp
+++ /dev/null
@@ -1 +0,0 @@
-{ [x, y] -> ((x - x^2) * y + (-x + x^2) * y^2) : x >= 0 and x <= 2 and y >= 0 and y <= 2 }
diff --git a/cloog-0.17.0/m4/ax_cc_maxopt.m4 b/cloog-0.17.0/m4/ax_cc_maxopt.m4
deleted file mode 100644
index da415be..0000000
--- a/cloog-0.17.0/m4/ax_cc_maxopt.m4
+++ /dev/null
@@ -1,178 +0,0 @@
-# ===========================================================================
-#          http://www.nongnu.org/autoconf-archive/ax_cc_maxopt.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_CC_MAXOPT
-#
-# DESCRIPTION
-#
-#   Try to turn on "good" C optimization flags for various compilers and
-#   architectures, for some definition of "good". (In our case, good for
-#   FFTW and hopefully for other scientific codes. Modify as needed.)
-#
-#   The user can override the flags by setting the CFLAGS environment
-#   variable. The user can also specify --enable-portable-binary in order to
-#   disable any optimization flags that might result in a binary that only
-#   runs on the host architecture.
-#
-#   Note also that the flags assume that ANSI C aliasing rules are followed
-#   by the code (e.g. for gcc's -fstrict-aliasing), and that floating-point
-#   computations can be re-ordered as needed.
-#
-#   Requires macros: AX_CHECK_COMPILER_FLAGS, AX_COMPILER_VENDOR,
-#   AX_GCC_ARCHFLAG, AX_GCC_X86_CPUID.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
-#   Copyright (c) 2008 Matteo Frigo
-#
-#   This program is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation, either version 3 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_CC_MAXOPT],
-[
-AC_REQUIRE([AC_PROG_CC])
-AC_REQUIRE([AX_COMPILER_VENDOR])
-AC_REQUIRE([AC_CANONICAL_HOST])
-
-AC_ARG_ENABLE(portable-binary, [AC_HELP_STRING([--enable-portable-binary], [disable compiler optimizations that would produce unportable binaries])],
-	acx_maxopt_portable=$withval, acx_maxopt_portable=no)
-
-# Try to determine "good" native compiler flags if none specified via CFLAGS
-if test "$ac_test_CFLAGS" != "set"; then
-  CFLAGS=""
-  case $ax_cv_c_compiler_vendor in
-    dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host"
-	 if test "x$acx_maxopt_portable" = xno; then
-           CFLAGS="$CFLAGS -arch host"
-         fi;;
-
-    sun) CFLAGS="-native -fast -xO5 -dalign"
-	 if test "x$acx_maxopt_portable" = xyes; then
-	   CFLAGS="$CFLAGS -xarch=generic"
-         fi;;
-
-    hp)  CFLAGS="+Oall +Optrs_ansi +DSnative"
-	 if test "x$acx_maxopt_portable" = xyes; then
-	   CFLAGS="$CFLAGS +DAportable"
-	 fi;;
-
-    ibm) if test "x$acx_maxopt_portable" = xno; then
-           xlc_opt="-qarch=auto -qtune=auto"
-	 else
-           xlc_opt="-qtune=auto"
-	 fi
-         AX_CHECK_COMPILER_FLAGS($xlc_opt,
-         	CFLAGS="-O3 -qansialias -w $xlc_opt",
-               [CFLAGS="-O3 -qansialias -w"
-                echo "******************************************************"
-                echo "*  You seem to have the IBM  C compiler.  It is      *"
-                echo "*  recommended for best performance that you use:    *"
-                echo "*                                                    *"
-                echo "*    CFLAGS=-O3 -qarch=xxx -qtune=xxx -qansialias -w *"
-                echo "*                      ^^^        ^^^                *"
-                echo "*  where xxx is pwr2, pwr3, 604, or whatever kind of *"
-                echo "*  CPU you have.  (Set the CFLAGS environment var.   *"
-                echo "*  and re-run configure.)  For more info, man cc.    *"
-                echo "******************************************************"])
-         ;;
-
-    intel) CFLAGS="-O3 -ansi_alias"
-	if test "x$acx_maxopt_portable" = xno; then
-	  icc_archflag=unknown
-	  icc_flags=""
-	  case $host_cpu in
-	    i686*|x86_64*)
-              # icc accepts gcc assembly syntax, so these should work:
-	      AX_GCC_X86_CPUID(0)
-              AX_GCC_X86_CPUID(1)
-	      case $ax_cv_gcc_x86_cpuid_0 in # see AX_GCC_ARCHFLAG
-                *:756e6547:*:*) # Intel
-                  case $ax_cv_gcc_x86_cpuid_1 in
-                    *6a?:*[[234]]:*:*|*6[[789b]]?:*:*:*) icc_flags="-xK";;
-                    *f3[[347]]:*:*:*|*f4[1347]:*:*:*) icc_flags="-xP -xN -xW -xK";;
-                    *f??:*:*:*) icc_flags="-xN -xW -xK";;
-                  esac ;;
-              esac ;;
-          esac
-          if test "x$icc_flags" != x; then
-            for flag in $icc_flags; do
-              AX_CHECK_COMPILER_FLAGS($flag, [icc_archflag=$flag; break])
-            done
-          fi
-          AC_MSG_CHECKING([for icc architecture flag])
-	  AC_MSG_RESULT($icc_archflag)
-          if test "x$icc_archflag" != xunknown; then
-            CFLAGS="$CFLAGS $icc_archflag"
-          fi
-        fi
-	;;
-
-    gnu)
-     # default optimization flags for gcc on all systems
-     CFLAGS="-O3 -fomit-frame-pointer"
-
-     # -malign-double for x86 systems
-     AX_CHECK_COMPILER_FLAGS(-malign-double, CFLAGS="$CFLAGS -malign-double")
-
-     #  -fstrict-aliasing for gcc-2.95+
-     AX_CHECK_COMPILER_FLAGS(-fstrict-aliasing,
-	CFLAGS="$CFLAGS -fstrict-aliasing")
-
-     # note that we enable "unsafe" fp optimization with other compilers, too
-     AX_CHECK_COMPILER_FLAGS(-ffast-math, CFLAGS="$CFLAGS -ffast-math")
-
-     AX_GCC_ARCHFLAG($acx_maxopt_portable)
-     ;;
-  esac
-
-  if test -z "$CFLAGS"; then
-	echo ""
-	echo "********************************************************"
-        echo "* WARNING: Don't know the best CFLAGS for this system  *"
-        echo "* Use ./configure CFLAGS=... to specify your own flags *"
-	echo "* (otherwise, a default of CFLAGS=-O3 will be used)    *"
-	echo "********************************************************"
-	echo ""
-        CFLAGS="-O3"
-  fi
-
-  AX_CHECK_COMPILER_FLAGS($CFLAGS, [], [
-	echo ""
-        echo "********************************************************"
-        echo "* WARNING: The guessed CFLAGS don't seem to work with  *"
-        echo "* your compiler.                                       *"
-        echo "* Use ./configure CFLAGS=... to specify your own flags *"
-        echo "********************************************************"
-        echo ""
-        CFLAGS=""
-  ])
-
-fi
-])
diff --git a/cloog-0.17.0/m4/ax_cflags_warn_all.m4 b/cloog-0.17.0/m4/ax_cflags_warn_all.m4
deleted file mode 100644
index 026c6e9..0000000
--- a/cloog-0.17.0/m4/ax_cflags_warn_all.m4
+++ /dev/null
@@ -1,149 +0,0 @@
-# ===========================================================================
-#       http://www.nongnu.org/autoconf-archive/ax_cflags_warn_all.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])]
-#
-# DESCRIPTION
-#
-#   Try to find a compiler option that enables most reasonable warnings.
-#
-#   For the GNU CC compiler it will be -Wall (and -ansi -pedantic) The
-#   result is added to the shellvar being CFLAGS by default.
-#
-#   Currently this macro knows about GCC, Solaris C compiler, Digital Unix C
-#   compiler, C for AIX Compiler, HP-UX C compiler, IRIX C compiler, NEC
-#   SX-5 (Super-UX 10) C compiler, and Cray J90 (Unicos 10.0.0.8) C
-#   compiler.
-#
-#    - $1 shell-variable-to-add-to : CFLAGS
-#    - $2 add-value-if-not-found : nothing
-#    - $3 action-if-found : add value to shellvariable
-#    - $4 action-if-not-found : nothing
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
-#
-#   This program is free software; you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation; either version 2 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl
-AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl
-AS_VAR_PUSHDEF([VAR],[ac_cv_cflags_warn_all])dnl
-AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings],
-VAR,[VAR="no, unknown"
- AC_LANG_SAVE
- AC_LANG_C
- ac_save_[]FLAGS="$[]FLAGS"
-for ac_arg dnl
-in "-pedantic  % -Wall"       dnl   GCC
-   "-xstrconst % -v"          dnl Solaris C
-   "-std1      % -verbose -w0 -warnprotos" dnl Digital Unix
-   "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX
-   "-ansi -ansiE % -fullwarn" dnl IRIX
-   "+ESlit     % +w1"         dnl HP-UX C
-   "-Xc        % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10)
-   "-h conform % -h msglevel 2" dnl Cray C (Unicos)
-   #
-do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
-   AC_TRY_COMPILE([],[return 0;],
-   [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
-done
- FLAGS="$ac_save_[]FLAGS"
- AC_LANG_RESTORE
-])
-case ".$VAR" in
-     .ok|.ok,*) m4_ifvaln($3,$3) ;;
-   .|.no|.no,*) m4_ifvaln($4,$4,[m4_ifval($2,[
-        AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])
-                      m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])]) ;;
-   *) m4_ifvaln($3,$3,[
-   if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
-   then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR])
-   else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"])
-                      m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"
-   fi ]) ;;
-esac
-AS_VAR_POPDEF([VAR])dnl
-AS_VAR_POPDEF([FLAGS])dnl
-])
-
-dnl the only difference - the LANG selection... and the default FLAGS
-
-AC_DEFUN([AX_CXXFLAGS_WARN_ALL],[dnl
-AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl
-AS_VAR_PUSHDEF([VAR],[ax_cv_cxxflags_warn_all])dnl
-AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings],
-VAR,[VAR="no, unknown"
- AC_LANG_SAVE
- AC_LANG_CPLUSPLUS
- ac_save_[]FLAGS="$[]FLAGS"
-for ac_arg dnl
-in "-pedantic  % -Wall"       dnl   GCC
-   "-xstrconst % -v"          dnl Solaris C
-   "-std1      % -verbose -w0 -warnprotos" dnl Digital Unix
-   "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX
-   "-ansi -ansiE % -fullwarn" dnl IRIX
-   "+ESlit     % +w1"         dnl HP-UX C
-   "-Xc        % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10)
-   "-h conform % -h msglevel 2" dnl Cray C (Unicos)
-   #
-do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
-   AC_TRY_COMPILE([],[return 0;],
-   [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
-done
- FLAGS="$ac_save_[]FLAGS"
- AC_LANG_RESTORE
-])
-case ".$VAR" in
-     .ok|.ok,*) m4_ifvaln($3,$3) ;;
-   .|.no|.no,*) m4_ifvaln($4,$4,[m4_ifval($2,[
-        AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])
-                      m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])]) ;;
-   *) m4_ifvaln($3,$3,[
-   if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
-   then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR])
-   else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"])
-                      m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"
-   fi ]) ;;
-esac
-AS_VAR_POPDEF([VAR])dnl
-AS_VAR_POPDEF([FLAGS])dnl
-])
-
-dnl  implementation tactics:
-dnl   the for-argument contains a list of options. The first part of
-dnl   these does only exist to detect the compiler - usually it is
-dnl   a global option to enable -ansi or -extrawarnings. All other
-dnl   compilers will fail about it. That was needed since a lot of
-dnl   compilers will give false positives for some option-syntax
-dnl   like -Woption or -Xoption as they think of it is a pass-through
-dnl   to later compile stages or something. The "%" is used as a
-dnl   delimimiter. A non-option comment can be given after "%%" marks
-dnl   which will be shown but not added to the respective C/CXXFLAGS.
diff --git a/cloog-0.17.0/m4/ax_check_compiler_flags.m4 b/cloog-0.17.0/m4/ax_check_compiler_flags.m4
deleted file mode 100644
index 7da8324..0000000
--- a/cloog-0.17.0/m4/ax_check_compiler_flags.m4
+++ /dev/null
@@ -1,74 +0,0 @@
-# ===========================================================================
-#     http://www.nongnu.org/autoconf-archive/ax_check_compiler_flags.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_CHECK_COMPILER_FLAGS(FLAGS, [ACTION-SUCCESS], [ACTION-FAILURE])
-#
-# DESCRIPTION
-#
-#   Check whether the given compiler FLAGS work with the current language's
-#   compiler, or whether they give an error. (Warnings, however, are
-#   ignored.)
-#
-#   ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
-#   success/failure.
-#
-# LICENSE
-#
-#   Copyright (c) 2009 Steven G. Johnson <stevenj@alum.mit.edu>
-#   Copyright (c) 2009 Matteo Frigo
-#
-#   This program is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation, either version 3 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_CHECK_COMPILER_FLAGS],
-[AC_PREREQ(2.59) dnl for _AC_LANG_PREFIX
-AC_MSG_CHECKING([whether _AC_LANG compiler accepts $1])
-dnl Some hackery here since AC_CACHE_VAL can't handle a non-literal varname:
-AS_LITERAL_IF([$1],
-  [AC_CACHE_VAL(AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1]), [
-      ax_save_FLAGS=$[]_AC_LANG_PREFIX[]FLAGS
-      _AC_LANG_PREFIX[]FLAGS="$1"
-      AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
-        AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=yes,
-        AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=no)
-      _AC_LANG_PREFIX[]FLAGS=$ax_save_FLAGS])],
-  [ax_save_FLAGS=$[]_AC_LANG_PREFIX[]FLAGS
-   _AC_LANG_PREFIX[]FLAGS="$1"
-   AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
-     eval AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=yes,
-     eval AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])=no)
-   _AC_LANG_PREFIX[]FLAGS=$ax_save_FLAGS])
-eval ax_check_compiler_flags=$AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_[$1])
-AC_MSG_RESULT($ax_check_compiler_flags)
-if test "x$ax_check_compiler_flags" = xyes; then
-	m4_default([$2], :)
-else
-	m4_default([$3], :)
-fi
-])dnl AX_CHECK_COMPILER_FLAGS
diff --git a/cloog-0.17.0/m4/ax_compiler_vendor.m4 b/cloog-0.17.0/m4/ax_compiler_vendor.m4
deleted file mode 100644
index b074260..0000000
--- a/cloog-0.17.0/m4/ax_compiler_vendor.m4
+++ /dev/null
@@ -1,61 +0,0 @@
-# ===========================================================================
-#       http://www.nongnu.org/autoconf-archive/ax_compiler_vendor.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_COMPILER_VENDOR
-#
-# DESCRIPTION
-#
-#   Determine the vendor of the C/C++ compiler, e.g., gnu, intel, ibm, sun,
-#   hp, borland, comeau, dec, cray, kai, lcc, metrowerks, sgi, microsoft,
-#   watcom, etc. The vendor is returned in the cache variable
-#   $ax_cv_c_compiler_vendor for C and $ax_cv_cxx_compiler_vendor for C++.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
-#   Copyright (c) 2008 Matteo Frigo
-#
-#   This program is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation, either version 3 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_COMPILER_VENDOR],
-[
-AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor,
- [ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=unknown
-  # note: don't check for gcc first since some other compilers define __GNUC__
-  for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale:__PATHCC__,__PATHSCALE__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do
-    vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")"
-    AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[
-#if !($vencpp)
-      thisisanerror;
-#endif
-])], [ax_cv_]_AC_LANG_ABBREV[_compiler_vendor=`echo $ventest | cut -d: -f1`; break])
-  done
- ])
-])
diff --git a/cloog-0.17.0/m4/ax_create_pkgconfig_info.m4 b/cloog-0.17.0/m4/ax_create_pkgconfig_info.m4
deleted file mode 100644
index 60ac548..0000000
--- a/cloog-0.17.0/m4/ax_create_pkgconfig_info.m4
+++ /dev/null
@@ -1,349 +0,0 @@
-# ===========================================================================
-#    http://www.nongnu.org/autoconf-archive/ax_create_pkgconfig_info.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_CREATE_PKGCONFIG_INFO [(outputfile, [requires [,libs [,summary [,cflags [, ldflags]]]]])]
-#
-# DESCRIPTION
-#
-#   Defaults:
-#
-#     $1 = $PACKAGE_NAME.pc
-#     $2 = (empty)
-#     $3 = $PACKAGE_LIBS $LIBS (as set at that point in configure.ac)
-#     $4 = $PACKAGE_SUMMARY (or $1 Library)
-#     $5 = $CPPFLAGS $PACKAGE_CFLAGS (as set at the point in configure.ac)
-#     $6 = $LDFLAGS $PACKAGE_LDFLAGS (as set at the point in configure.ac)
-#
-#     PACKAGE_NAME defaults to $PACKAGE if not set.
-#     PACKAGE_LIBS defaults to -l$PACKAGE_NAME if not set.
-#
-#   The resulting file is called $PACKAGE.pc.in / $PACKAGE.pc
-#
-#   You will find this macro most useful in conjunction with
-#   ax_spec_defaults that can read good initializers from the .spec file. In
-#   consequencd, most of the generatable installable stuff can be made from
-#   information being updated in a single place for the whole project.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
-#   Copyright (c) 2008 Sven Verdoolaege <skimo@kotnet.org>
-#
-#   This program is free software; you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation; either version 2 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_CREATE_PKGCONFIG_INFO],[dnl
-AS_VAR_PUSHDEF([PKGCONFIG_suffix],[ax_create_pkgconfig_suffix])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_libdir],[ax_create_pkgconfig_libdir])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_libfile],[ax_create_pkgconfig_libfile])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_libname],[ax_create_pkgconfig_libname])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_version],[ax_create_pkgconfig_version])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_description],[ax_create_pkgconfig_description])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_requires],[ax_create_pkgconfig_requires])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_pkglibs],[ax_create_pkgconfig_pkglibs])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_libs],[ax_create_pkgconfig_libs])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_ldflags],[ax_create_pkgconfig_ldflags])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_cppflags],[ax_create_pkgconfig_cppflags])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_generate],[ax_create_pkgconfig_generate])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_src_libdir],[ax_create_pkgconfig_src_libdir])dnl
-AS_VAR_PUSHDEF([PKGCONFIG_src_headers],[ax_create_pkgconfig_src_headers])dnl
-
-# we need the expanded forms...
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-AC_MSG_CHECKING(our pkgconfig libname)
-test ".$PKGCONFIG_libname" != "." || \
-PKGCONFIG_libname="ifelse($1,,${PACKAGE_NAME},`basename $1 .pc`)"
-test ".$PKGCONFIG_libname" != "." || \
-PKGCONFIG_libname="$PACKAGE"
-PKGCONFIG_libname=`eval echo "$PKGCONFIG_libname"`
-PKGCONFIG_libname=`eval echo "$PKGCONFIG_libname"`
-AC_MSG_RESULT($PKGCONFIG_libname)
-
-AC_MSG_CHECKING(our pkgconfig version)
-test ".$PKGCONFIG_version" != "." || \
-PKGCONFIG_version="${PACKAGE_VERSION}"
-test ".$PKGCONFIG_version" != "." || \
-PKGCONFIG_version="$VERSION"
-PKGCONFIG_version=`eval echo "$PKGCONFIG_version"`
-PKGCONFIG_version=`eval echo "$PKGCONFIG_version"`
-AC_MSG_RESULT($PKGCONFIG_version)
-
-AC_MSG_CHECKING(our pkgconfig_libdir)
-test ".$pkgconfig_libdir" = "." && \
-pkgconfig_libdir='${libdir}/pkgconfig'
-PKGCONFIG_libdir=`eval echo "$pkgconfig_libdir"`
-PKGCONFIG_libdir=`eval echo "$PKGCONFIG_libdir"`
-PKGCONFIG_libdir=`eval echo "$PKGCONFIG_libdir"`
-AC_MSG_RESULT($pkgconfig_libdir)
-test "$pkgconfig_libdir" != "$PKGCONFIG_libdir" && (
-AC_MSG_RESULT(expanded our pkgconfig_libdir... $PKGCONFIG_libdir))
-AC_SUBST([pkgconfig_libdir])
-
-AC_MSG_CHECKING(our pkgconfig_libfile)
-test ".$pkgconfig_libfile" != "." || \
-pkgconfig_libfile="ifelse($1,,$PKGCONFIG_libname.pc,`basename $1`)"
-PKGCONFIG_libfile=`eval echo "$pkgconfig_libfile"`
-PKGCONFIG_libfile=`eval echo "$PKGCONFIG_libfile"`
-AC_MSG_RESULT($pkgconfig_libfile)
-test "$pkgconfig_libfile" != "$PKGCONFIG_libfile" && (
-AC_MSG_RESULT(expanded our pkgconfig_libfile... $PKGCONFIG_libfile))
-AC_SUBST([pkgconfig_libfile])
-
-AC_MSG_CHECKING(our package / suffix)
-PKGCONFIG_suffix="$program_suffix"
-test ".$PKGCONFIG_suffix" != .NONE || PKGCONFIG_suffix=""
-AC_MSG_RESULT(${PACKAGE_NAME} / ${PKGCONFIG_suffix})
-
-AC_MSG_CHECKING(our pkgconfig description)
-PKGCONFIG_description="ifelse($4,,$PACKAGE_SUMMARY,$4)"
-test ".$PKGCONFIG_description" != "." || \
-PKGCONFIG_description="$PKGCONFIG_libname Library"
-PKGCONFIG_description=`eval echo "$PKGCONFIG_description"`
-PKGCONFIG_description=`eval echo "$PKGCONFIG_description"`
-AC_MSG_RESULT($PKGCONFIG_description)
-
-AC_MSG_CHECKING(our pkgconfig requires)
-PKGCONFIG_requires="ifelse($2,,$PACKAGE_REQUIRES,$2)"
-PKGCONFIG_requires=`eval echo "$PKGCONFIG_requires"`
-PKGCONFIG_requires=`eval echo "$PKGCONFIG_requires"`
-AC_MSG_RESULT($PKGCONFIG_requires)
-
-AC_MSG_CHECKING(our pkgconfig ext libs)
-PKGCONFIG_pkglibs="$PACKAGE_LIBS"
-test ".$PKGCONFIG_pkglibs" != "." || PKGCONFIG_pkglibs="-l$PKGCONFIG_libname"
-PKGCONFIG_libs="ifelse($3,,$PKGCONFIG_pkglibs $LIBS,$3)"
-PKGCONFIG_libs=`eval echo "$PKGCONFIG_libs"`
-PKGCONFIG_libs=`eval echo "$PKGCONFIG_libs"`
-AC_MSG_RESULT($PKGCONFIG_libs)
-
-AC_MSG_CHECKING(our pkgconfig cppflags)
-PKGCONFIG_cppflags="ifelse($5,,$CPPFLAGS $PACKAGE_CFLAGS,$5)"
-PKGCONFIG_cppflags=`eval echo "$PKGCONFIG_cppflags"`
-PKGCONFIG_cppflags=`eval echo "$PKGCONFIG_cppflags"`
-AC_MSG_RESULT($PKGCONFIG_cppflags)
-
-AC_MSG_CHECKING(our pkgconfig ldflags)
-PKGCONFIG_ldflags="ifelse($6,,$LDFLAGS $PACKAGE_LDFLAGS,$5)"
-PKGCONFIG_ldflags=`eval echo "$PKGCONFIG_ldflags"`
-PKGCONFIG_ldflags=`eval echo "$PKGCONFIG_ldflags"`
-AC_MSG_RESULT($PKGCONFIG_ldflags)
-
-test ".$PKGCONFIG_generate" != "." || \
-PKGCONFIG_generate="ifelse($1,,$PKGCONFIG_libname.pc,$1)"
-PKGCONFIG_generate=`eval echo "$PKGCONFIG_generate"`
-PKGCONFIG_generate=`eval echo "$PKGCONFIG_generate"`
-test "$pkgconfig_libfile" != "$PKGCONFIG_generate" && (
-AC_MSG_RESULT(generate the pkgconfig later... $PKGCONFIG_generate))
-
-if test ".$PKGCONFIG_src_libdir" = "." ; then
-PKGCONFIG_src_libdir=`pwd`
-PKGCONFIG_src_libdir=`AS_DIRNAME("$PKGCONFIG_src_libdir/$PKGCONFIG_generate")`
-test ! -d $PKGCONFIG_src_libdir/src || \
-PKGCONFIG_src_libdir="$PKGCONFIG_src_libdir/src"
-case ".$objdir" in
-*libs) PKGCONFIG_src_libdir="$PKGCONFIG_src_libdir/$objdir" ;; esac
-AC_MSG_RESULT(noninstalled pkgconfig -L $PKGCONFIG_src_libdir)
-fi
-
-if test ".$PKGCONFIG_src_headers" = "." ; then
-PKGCONFIG_src_headers=`pwd`
-v="$ac_top_srcdir" ;
-test ".$v" != "." || v="$ax_spec_dir"
-test ".$v" != "." || v="$srcdir"
-case "$v" in /*) PKGCONFIG_src_headers="" ;; esac
-PKGCONFIG_src_headers=`AS_DIRNAME("$PKGCONFIG_src_headers/$v/x")`
-test ! -d $PKGCONFIG_src_headers/incl[]ude || \
-PKGCONFIG_src_headers="$PKGCONFIG_src_headers/incl[]ude"
-AC_MSG_RESULT(noninstalled pkgconfig -I $PKGCONFIG_src_headers)
-fi
-
-
-dnl AC_CONFIG_COMMANDS crap disallows to use $PKGCONFIG_libfile here...
-AC_CONFIG_COMMANDS([$ax_create_pkgconfig_generate],[
-pkgconfig_generate="$ax_create_pkgconfig_generate"
-if test ! -f "$pkgconfig_generate.in"
-then generate="true"
-elif grep ' generated by configure ' $pkgconfig_generate.in >/dev/null
-then generate="true"
-else generate="false";
-fi
-if $generate ; then
-AC_MSG_NOTICE(creating $pkgconfig_generate.in)
-cat > $pkgconfig_generate.in <<AXEOF
-# generated by configure / remove this line to disable regeneration
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-bindir=@bindir@
-libdir=@libdir@
-datarootdir=@datarootdir@
-datadir=@datadir@
-sysconfdir=@sysconfdir@
-includedir=@includedir@
-package=@PACKAGE@
-suffix=@suffix@
-
-Name: @PACKAGE_NAME@
-Description: @PACKAGE_DESCRIPTION@
-Version: @PACKAGE_VERSION@
-Requires: @PACKAGE_REQUIRES@
-Libs: -L\${libdir} @LDFLAGS@ @LIBS@
-Cflags: -I\${includedir} @CPPFLAGS@
-AXEOF
-fi # DONE generate $pkgconfig_generate.in
-AC_MSG_NOTICE(creating $pkgconfig_generate)
-cat >conftest.sed <<AXEOF
-s|@prefix@|${pkgconfig_prefix}|
-s|@exec_prefix@|${pkgconfig_execprefix}|
-s|@bindir@|${pkgconfig_bindir}|
-s|@libdir@|${pkgconfig_libdir}|
-s|@datarootdir@|${pkgconfig_datarootdir}|
-s|@datadir@|${pkgconfig_datadir}|
-s|@sysconfdir@|${pkgconfig_sysconfdir}|
-s|@includedir@|${pkgconfig_includedir}|
-s|@suffix@|${pkgconfig_suffix}|
-s|@PACKAGE@|${pkgconfig_package}|
-s|@PACKAGE_NAME@|${pkgconfig_libname}|
-s|@PACKAGE_DESCRIPTION@|${pkgconfig_description}|
-s|@PACKAGE_VERSION@|${pkgconfig_version}|
-s|@PACKAGE_REQUIRES@|${pkgconfig_requires}|
-s|@LIBS@|${pkgconfig_libs}|
-s|@LDFLAGS@|${pkgconfig_ldflags}|
-s|@CPPFLAGS@|${pkgconfig_cppflags}|
-AXEOF
-sed -f conftest.sed  $pkgconfig_generate.in > $pkgconfig_generate
-if test ! -s $pkgconfig_generate ; then
-    AC_MSG_ERROR([$pkgconfig_generate is empty])
-fi ; rm conftest.sed # DONE generate $pkgconfig_generate
-pkgconfig_uninstalled=`echo $pkgconfig_generate |sed 's/.pc$/-uninstalled.pc/'`
-AC_MSG_NOTICE(creating $pkgconfig_uninstalled)
-cat >conftest.sed <<AXEOF
-s|@prefix@|${pkgconfig_prefix}|
-s|@exec_prefix@|${pkgconfig_execprefix}|
-s|@bindir@|${pkgconfig_bindir}|
-s|@libdir@|${pkgconfig_src_libdir}|
-s|@datarootdir@|${pkgconfig_datarootdir}|
-s|@datadir@|${pkgconfig_datadir}|
-s|@sysconfdir@|${pkgconfig_sysconfdir}|
-s|@includedir@|${pkgconfig_src_headers}|
-s|@suffix@|${pkgconfig_suffix}|
-s|@PACKAGE@|${pkgconfig_package}|
-s|@PACKAGE_NAME@|${pkgconfig_libname}|
-s|@PACKAGE_DESCRIPTION@|${pkgconfig_description}|
-s|@PACKAGE_VERSION@|${pkgconfig_version}|
-s|@PACKAGE_REQUIRES@|${pkgconfig_requires}|
-s|@LIBS@|${pkgconfig_libs}|
-s|@LDFLAGS@|${pkgconfig_ldflags}|
-s|@CPPFLAGS@|${pkgconfig_cppflags}|
-AXEOF
-sed -f conftest.sed $pkgconfig_generate.in > $pkgconfig_uninstalled
-if test ! -s $pkgconfig_uninstalled ; then
-    AC_MSG_ERROR([$pkgconfig_uninstalled is empty])
-fi ; rm conftest.sed # DONE generate $pkgconfig_uninstalled
-           pkgconfig_requires_add=`echo ${pkgconfig_requires}`
-if test ".$pkgconfig_requires_add" != "." ; then
-           pkgconfig_requires_add="pkg-config $pkgconfig_requires_add"
-    else   pkgconfig_requires_add=":" ; fi
-pkgconfig_uninstalled=`echo $pkgconfig_generate |sed 's/.pc$/-uninstalled.sh/'`
-AC_MSG_NOTICE(creating $pkgconfig_uninstalled)
-cat >conftest.sed <<AXEOF
-s|@prefix@|\"${pkgconfig_prefix}\"|
-s|@exec_prefix@|\"${pkgconfig_execprefix}\"|
-s|@bindir@|\"${pkgconfig_bindir}\"|
-s|@libdir@|\"${pkgconfig_src_libdir}\"|
-s|@datarootdir@|\"${pkgconfig_datarootdir}\"|
-s|@datadir@|\"${pkgconfig_datadir}\"|
-s|@sysconfdir@|\"${pkgconfig_sysconfdir}\"|
-s|@includedir@|\"${pkgconfig_src_headers}\"|
-s|@suffix@|\"${pkgconfig_suffix}\"|
-s|@PACKAGE@|\"${pkgconfig_package}\"|
-s|@PACKAGE_NAME@|\"${pkgconfig_libname}\"|
-s|@PACKAGE_DESCRIPTION@|\"${pkgconfig_description}\"|
-s|@PACKAGE_VERSION@|\"${pkgconfig_version}\"|
-s|@PACKAGE_REQUIRES@|\"${pkgconfig_requires}\"|
-s|@LIBS@|\"${pkgconfig_libs}\"|
-s|@LDFLAGS@|\"${pkgconfig_ldflags}\"|
-s|@CPPFLAGS@|\"${pkgconfig_cppflags}\"|
-s>Name:>for option\\; do case \"\$option\" in --list-all|--name) echo >
-s>Description: *>\\;\\; --help) pkg-config --help \\; echo Buildscript Of >
-s>Version: *>\\;\\; --modversion|--version) echo >
-s>Requires:>\\;\\; --requires) echo $pkgconfig_requires_add>
-s>Libs: *>\\;\\; --libs) echo >
-s>Cflags: *>\\;\\; --cflags) echo >
-/--libs)/a\\
-       $pkgconfig_requires_add
-/--cflags)/a\\
-       $pkgconfig_requires_add\\
-;; --variable=*) eval echo '\$'\`echo \$option | sed -e 's/.*=//'\`\\
-;; --uninstalled) exit 0 \\
-;; *) ;; esac done
-AXEOF
-sed -f conftest.sed  $pkgconfig_generate.in > $pkgconfig_uninstalled
-if test ! -s $pkgconfig_uninstalled ; then
-    AC_MSG_ERROR([$pkgconfig_uninstalled is empty])
-fi ; rm conftest.sed # DONE generate $pkgconfig_uninstalled
-],[
-dnl AC_CONFIG_COMMANDS crap, the AS_PUSHVAR defines are invalid here...
-ax_create_pkgconfig_generate="$ax_create_pkgconfig_generate"
-pkgconfig_prefix='$prefix'
-pkgconfig_execprefix='$exec_prefix'
-pkgconfig_bindir='$bindir'
-pkgconfig_libdir='$libdir'
-pkgconfig_includedir='$includedir'
-pkgconfig_datarootdir='$datarootdir'
-pkgconfig_datadir='$datadir'
-pkgconfig_sysconfdir='$sysconfdir'
-pkgconfig_suffix='$ax_create_pkgconfig_suffix'
-pkgconfig_package='$PACKAGE_NAME'
-pkgconfig_libname='$ax_create_pkgconfig_libname'
-pkgconfig_description='$ax_create_pkgconfig_description'
-pkgconfig_version='$ax_create_pkgconfig_version'
-pkgconfig_requires='$ax_create_pkgconfig_requires'
-pkgconfig_libs='$ax_create_pkgconfig_libs'
-pkgconfig_ldflags='$ax_create_pkgconfig_ldflags'
-pkgconfig_cppflags='$ax_create_pkgconfig_cppflags'
-pkgconfig_src_libdir='$ax_create_pkgconfig_src_libdir'
-pkgconfig_src_headers='$ax_create_pkgconfig_src_headers'
-])dnl
-AS_VAR_POPDEF([PKGCONFIG_suffix])dnl
-AS_VAR_POPDEF([PKGCONFIG_libdir])dnl
-AS_VAR_POPDEF([PKGCONFIG_libfile])dnl
-AS_VAR_POPDEF([PKGCONFIG_libname])dnl
-AS_VAR_POPDEF([PKGCONFIG_version])dnl
-AS_VAR_POPDEF([PKGCONFIG_description])dnl
-AS_VAR_POPDEF([PKGCONFIG_requires])dnl
-AS_VAR_POPDEF([PKGCONFIG_pkglibs])dnl
-AS_VAR_POPDEF([PKGCONFIG_libs])dnl
-AS_VAR_POPDEF([PKGCONFIG_ldflags])dnl
-AS_VAR_POPDEF([PKGCONFIG_cppflags])dnl
-AS_VAR_POPDEF([PKGCONFIG_generate])dnl
-AS_VAR_POPDEF([PKGCONFIG_src_libdir])dnl
-AS_VAR_POPDEF([PKGCONFIG_src_headers])dnl
-])
diff --git a/cloog-0.17.0/m4/ax_gcc_archflag.m4 b/cloog-0.17.0/m4/ax_gcc_archflag.m4
deleted file mode 100644
index dedeef4..0000000
--- a/cloog-0.17.0/m4/ax_gcc_archflag.m4
+++ /dev/null
@@ -1,213 +0,0 @@
-# ===========================================================================
-#         http://www.nongnu.org/autoconf-archive/ax_gcc_archflag.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_GCC_ARCHFLAG([PORTABLE?], [ACTION-SUCCESS], [ACTION-FAILURE])
-#
-# DESCRIPTION
-#
-#   This macro tries to guess the "native" arch corresponding to the target
-#   architecture for use with gcc's -march=arch or -mtune=arch flags. If
-#   found, the cache variable $ax_cv_gcc_archflag is set to this flag and
-#   ACTION-SUCCESS is executed; otherwise $ax_cv_gcc_archflag is is set to
-#   "unknown" and ACTION-FAILURE is executed. The default ACTION-SUCCESS is
-#   to add $ax_cv_gcc_archflag to the end of $CFLAGS.
-#
-#   PORTABLE? should be either [yes] (default) or [no]. In the former case,
-#   the flag is set to -mtune (or equivalent) so that the architecture is
-#   only used for tuning, but the instruction set used is still portable. In
-#   the latter case, the flag is set to -march (or equivalent) so that
-#   architecture-specific instructions are enabled.
-#
-#   The user can specify --with-gcc-arch=<arch> in order to override the
-#   macro's choice of architecture, or --without-gcc-arch to disable this.
-#
-#   When cross-compiling, or if $CC is not gcc, then ACTION-FAILURE is
-#   called unless the user specified --with-gcc-arch manually.
-#
-#   Requires macros: AX_CHECK_COMPILER_FLAGS, AX_GCC_X86_CPUID
-#
-#   (The main emphasis here is on recent CPUs, on the principle that doing
-#   high-performance computing on old hardware is uncommon.)
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
-#   Copyright (c) 2008 Matteo Frigo
-#
-#   This program is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation, either version 3 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_GCC_ARCHFLAG],
-[AC_REQUIRE([AC_PROG_CC])
-AC_REQUIRE([AC_CANONICAL_HOST])
-
-AC_ARG_WITH(gcc-arch, [AC_HELP_STRING([--with-gcc-arch=<arch>], [use architecture <arch> for gcc -march/-mtune, instead of guessing])],
-	ax_gcc_arch=$withval, ax_gcc_arch=yes)
-
-AC_MSG_CHECKING([for gcc architecture flag])
-AC_MSG_RESULT([])
-AC_CACHE_VAL(ax_cv_gcc_archflag,
-[
-ax_cv_gcc_archflag="unknown"
-
-if test "$GCC" = yes; then
-
-if test "x$ax_gcc_arch" = xyes; then
-ax_gcc_arch=""
-if test "$cross_compiling" = no; then
-case $host_cpu in
-  i[[3456]]86*|x86_64*) # use cpuid codes, in part from x86info-1.7 by D. Jones
-     AX_GCC_X86_CPUID(0)
-     AX_GCC_X86_CPUID(1)
-     case $ax_cv_gcc_x86_cpuid_0 in
-       *:756e6547:*:*) # Intel
-          case $ax_cv_gcc_x86_cpuid_1 in
-	    *5[[48]]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;;
-	    *5??:*:*:*) ax_gcc_arch=pentium ;;
-	    *6[[3456]]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
-	    *6a?:*[[01]]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
-	    *6a?:*[[234]]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
-	    *6[[9d]]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;;
-	    *6[[78b]]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
-	    *6??:*:*:*) ax_gcc_arch=pentiumpro ;;
-            *f3[[347]]:*:*:*|*f4[1347]:*:*:*)
-		case $host_cpu in
-                  x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;;
-                  *) ax_gcc_arch="prescott pentium4 pentiumpro" ;;
-                esac ;;
-            *f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";;
-          esac ;;
-       *:68747541:*:*) # AMD
-          case $ax_cv_gcc_x86_cpuid_1 in
-	    *5[[67]]?:*:*:*) ax_gcc_arch=k6 ;;
-	    *5[[8d]]?:*:*:*) ax_gcc_arch="k6-2 k6" ;;
-	    *5[[9]]?:*:*:*) ax_gcc_arch="k6-3 k6" ;;
-	    *60?:*:*:*) ax_gcc_arch=k7 ;;
-	    *6[[12]]?:*:*:*) ax_gcc_arch="athlon k7" ;;
-	    *6[[34]]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;;
-	    *67?:*:*:*) ax_gcc_arch="athlon-4 athlon k7" ;;
-	    *6[[68a]]?:*:*:*)
-	       AX_GCC_X86_CPUID(0x80000006) # L2 cache size
-	       case $ax_cv_gcc_x86_cpuid_0x80000006 in
-                 *:*:*[[1-9a-f]]??????:*) # (L2 = ecx >> 16) >= 256
-			ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;;
-                 *) ax_gcc_arch="athlon-4 athlon k7" ;;
-	       esac ;;
-	    *f[[4cef8b]]?:*:*:*) ax_gcc_arch="athlon64 k8" ;;
-	    *f5?:*:*:*) ax_gcc_arch="opteron k8" ;;
-	    *f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;;
-	    *f??:*:*:*) ax_gcc_arch="k8" ;;
-          esac ;;
-	*:746e6543:*:*) # IDT
-	   case $ax_cv_gcc_x86_cpuid_1 in
-	     *54?:*:*:*) ax_gcc_arch=winchip-c6 ;;
-	     *58?:*:*:*) ax_gcc_arch=winchip2 ;;
-	     *6[[78]]?:*:*:*) ax_gcc_arch=c3 ;;
-	     *69?:*:*:*) ax_gcc_arch="c3-2 c3" ;;
-	   esac ;;
-     esac
-     if test x"$ax_gcc_arch" = x; then # fallback
-	case $host_cpu in
-	  i586*) ax_gcc_arch=pentium ;;
-	  i686*) ax_gcc_arch=pentiumpro ;;
-        esac
-     fi
-     ;;
-
-  sparc*)
-     AC_PATH_PROG([PRTDIAG], [prtdiag], [prtdiag], [$PATH:/usr/platform/`uname -i`/sbin/:/usr/platform/`uname -m`/sbin/])
-     cputype=`(((grep cpu /proc/cpuinfo | cut -d: -f2) ; ($PRTDIAG -v |grep -i sparc) ; grep -i cpu /var/run/dmesg.boot ) | head -n 1) 2> /dev/null`
-     cputype=`echo "$cputype" | tr -d ' -' |tr $as_cr_LETTERS $as_cr_letters`
-     case $cputype in
-         *ultrasparciv*) ax_gcc_arch="ultrasparc4 ultrasparc3 ultrasparc v9" ;;
-         *ultrasparciii*) ax_gcc_arch="ultrasparc3 ultrasparc v9" ;;
-         *ultrasparc*) ax_gcc_arch="ultrasparc v9" ;;
-         *supersparc*|*tms390z5[[05]]*) ax_gcc_arch="supersparc v8" ;;
-         *hypersparc*|*rt62[[056]]*) ax_gcc_arch="hypersparc v8" ;;
-         *cypress*) ax_gcc_arch=cypress ;;
-     esac ;;
-
-  alphaev5) ax_gcc_arch=ev5 ;;
-  alphaev56) ax_gcc_arch=ev56 ;;
-  alphapca56) ax_gcc_arch="pca56 ev56" ;;
-  alphapca57) ax_gcc_arch="pca57 pca56 ev56" ;;
-  alphaev6) ax_gcc_arch=ev6 ;;
-  alphaev67) ax_gcc_arch=ev67 ;;
-  alphaev68) ax_gcc_arch="ev68 ev67" ;;
-  alphaev69) ax_gcc_arch="ev69 ev68 ev67" ;;
-  alphaev7) ax_gcc_arch="ev7 ev69 ev68 ev67" ;;
-  alphaev79) ax_gcc_arch="ev79 ev7 ev69 ev68 ev67" ;;
-
-  powerpc*)
-     cputype=`((grep cpu /proc/cpuinfo | head -n 1 | cut -d: -f2 | cut -d, -f1 | sed 's/ //g') ; /usr/bin/machine ; /bin/machine; grep CPU /var/run/dmesg.boot | head -n 1 | cut -d" " -f2) 2> /dev/null`
-     cputype=`echo $cputype | sed -e 's/ppc//g;s/ *//g'`
-     case $cputype in
-       *750*) ax_gcc_arch="750 G3" ;;
-       *740[[0-9]]*) ax_gcc_arch="$cputype 7400 G4" ;;
-       *74[[4-5]][[0-9]]*) ax_gcc_arch="$cputype 7450 G4" ;;
-       *74[[0-9]][[0-9]]*) ax_gcc_arch="$cputype G4" ;;
-       *970*) ax_gcc_arch="970 G5 power4";;
-       *POWER4*|*power4*|*gq*) ax_gcc_arch="power4 970";;
-       *POWER5*|*power5*|*gr*|*gs*) ax_gcc_arch="power5 power4 970";;
-       603ev|8240) ax_gcc_arch="$cputype 603e 603";;
-       *) ax_gcc_arch=$cputype ;;
-     esac
-     ax_gcc_arch="$ax_gcc_arch powerpc"
-     ;;
-esac
-fi # not cross-compiling
-fi # guess arch
-
-if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then
-for arch in $ax_gcc_arch; do
-  if test "x[]m4_default([$1],yes)" = xyes; then # if we require portable code
-    flags="-mtune=$arch"
-    # -mcpu=$arch and m$arch generate nonportable code on every arch except
-    # x86.  And some other arches (e.g. Alpha) don't accept -mtune.  Grrr.
-    case $host_cpu in i*86|x86_64*) flags="$flags -mcpu=$arch -m$arch";; esac
-  else
-    flags="-march=$arch -mcpu=$arch -m$arch"
-  fi
-  for flag in $flags; do
-    AX_CHECK_COMPILER_FLAGS($flag, [ax_cv_gcc_archflag=$flag; break])
-  done
-  test "x$ax_cv_gcc_archflag" = xunknown || break
-done
-fi
-
-fi # $GCC=yes
-])
-AC_MSG_CHECKING([for gcc architecture flag])
-AC_MSG_RESULT($ax_cv_gcc_archflag)
-if test "x$ax_cv_gcc_archflag" = xunknown; then
-  m4_default([$3],:)
-else
-  m4_default([$2], [CFLAGS="$CFLAGS $ax_cv_gcc_archflag"])
-fi
-])
diff --git a/cloog-0.17.0/m4/ax_gcc_x86_cpuid.m4 b/cloog-0.17.0/m4/ax_gcc_x86_cpuid.m4
deleted file mode 100644
index 5420b09..0000000
--- a/cloog-0.17.0/m4/ax_gcc_x86_cpuid.m4
+++ /dev/null
@@ -1,77 +0,0 @@
-# ===========================================================================
-#        http://www.nongnu.org/autoconf-archive/ax_gcc_x86_cpuid.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_GCC_X86_CPUID(OP)
-#
-# DESCRIPTION
-#
-#   On Pentium and later x86 processors, with gcc or a compiler that has a
-#   compatible syntax for inline assembly instructions, run a small program
-#   that executes the cpuid instruction with input OP. This can be used to
-#   detect the CPU type.
-#
-#   On output, the values of the eax, ebx, ecx, and edx registers are stored
-#   as hexadecimal strings as "eax:ebx:ecx:edx" in the cache variable
-#   ax_cv_gcc_x86_cpuid_OP.
-#
-#   If the cpuid instruction fails (because you are running a
-#   cross-compiler, or because you are not using gcc, or because you are on
-#   a processor that doesn't have this instruction), ax_cv_gcc_x86_cpuid_OP
-#   is set to the string "unknown".
-#
-#   This macro mainly exists to be used in AX_GCC_ARCHFLAG.
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
-#   Copyright (c) 2008 Matteo Frigo
-#
-#   This program is free software: you can redistribute it and/or modify it
-#   under the terms of the GNU General Public License as published by the
-#   Free Software Foundation, either version 3 of the License, or (at your
-#   option) any later version.
-#
-#   This program is distributed in the hope that it will be useful, but
-#   WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-#   Public License for more details.
-#
-#   You should have received a copy of the GNU General Public License along
-#   with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-#   As a special exception, the respective Autoconf Macro's copyright owner
-#   gives unlimited permission to copy, distribute and modify the configure
-#   scripts that are the output of Autoconf when processing the Macro. You
-#   need not follow the terms of the GNU General Public License when using
-#   or distributing such scripts, even though portions of the text of the
-#   Macro appear in them. The GNU General Public License (GPL) does govern
-#   all other use of the material that constitutes the Autoconf Macro.
-#
-#   This special exception to the GPL applies to versions of the Autoconf
-#   Macro released by the Autoconf Archive. When you make and distribute a
-#   modified version of the Autoconf Macro, you may extend this special
-#   exception to the GPL to apply to your modified version as well.
-
-AC_DEFUN([AX_GCC_X86_CPUID],
-[AC_REQUIRE([AC_PROG_CC])
-AC_LANG_PUSH([C])
-AC_CACHE_CHECK(for x86 cpuid $1 output, ax_cv_gcc_x86_cpuid_$1,
- [AC_RUN_IFELSE([AC_LANG_PROGRAM([#include <stdio.h>], [
-     int op = $1, eax, ebx, ecx, edx;
-     FILE *f;
-      __asm__("cpuid"
-        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
-        : "a" (op));
-     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
-     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
-     fclose(f);
-     return 0;
-])],
-     [ax_cv_gcc_x86_cpuid_$1=`cat conftest_cpuid`; rm -f conftest_cpuid],
-     [ax_cv_gcc_x86_cpuid_$1=unknown; rm -f conftest_cpuid],
-     [ax_cv_gcc_x86_cpuid_$1=unknown])])
-AC_LANG_POP([C])
-])
diff --git a/cloog-0.17.0/m4/ax_submodule.m4 b/cloog-0.17.0/m4/ax_submodule.m4
deleted file mode 100644
index 57e3a56..0000000
--- a/cloog-0.17.0/m4/ax_submodule.m4
+++ /dev/null
@@ -1,63 +0,0 @@
-AC_DEFUN([AX_SUBMODULE],
-[
-
-AC_ARG_WITH($1,
-	[AS_HELP_STRING([--with-$1=$2],
-			[Which $1 to use])])
-case "system" in
-$2)
-	AC_ARG_WITH($1_prefix,
-		    [AS_HELP_STRING([--with-$1-prefix=DIR],
-				    [Prefix of $1 installation])])
-	AC_ARG_WITH($1_exec_prefix,
-		    [AS_HELP_STRING([--with-$1-exec-prefix=DIR],
-				    [Exec prefix of $1 installation])])
-esac
-case "build" in
-$2)
-	AC_ARG_WITH($1_builddir,
-		    [AS_HELP_STRING([--with-$1-builddir=DIR],
-				    [Location of $1 builddir])])
-esac
-if test "x$with_$1_prefix" != "x" -a "x$with_$1_exec_prefix" = "x"; then
-	with_$1_exec_prefix=$with_$1_prefix
-fi
-if test "x$with_$1_prefix" != "x" -o "x$with_$1_exec_prefix" != "x"; then
-	if test "x$with_$1" != "x" -a "x$with_$1" != "xsystem"; then
-		AC_MSG_ERROR([Setting $with_$1_prefix implies use of system $1])
-	fi
-	with_$1="system"
-fi
-if test "x$with_$1_builddir" != "x"; then
-	if test "x$with_$1" != "x" -a "x$with_$1" != "xbuild"; then
-		AC_MSG_ERROR([Setting $with_$1_builddir implies use of build $1])
-	fi
-	with_$1="build"
-	$1_srcdir=`echo @abs_srcdir@ | $with_$1_builddir/config.status --file=-`
-	AC_MSG_NOTICE($1 sources in $$1_srcdir)
-fi
-case "$with_$1" in
-$2)
-	;;
-*)
-	if test -d $srcdir/.git -a \
-		-d $srcdir/$1 -a \
-		! -d $srcdir/$1/.git; then
-		AC_MSG_WARN(
-[git repo detected, but submodule $1 not initialized])
-		AC_MSG_WARN([You may want to run])
-		AC_MSG_WARN([	git submodule init])
-		AC_MSG_WARN([	git submodule update])
-		AC_MSG_WARN([	sh autogen.sh])
-	fi
-	if test -f $srcdir/$1/configure -a "$3" != "no"; then
-		with_$1="bundled"
-	else
-		with_$1="$3"
-	fi
-	;;
-esac
-AC_MSG_CHECKING([which $1 to use])
-AC_MSG_RESULT($with_$1)
-
-])
diff --git a/cloog-0.17.0/m4/libtool.m4 b/cloog-0.17.0/m4/libtool.m4
deleted file mode 100644
index a3fee53..0000000
--- a/cloog-0.17.0/m4/libtool.m4
+++ /dev/null
@@ -1,7377 +0,0 @@
-# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
-#
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008 Free Software Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-m4_define([_LT_COPYING], [dnl
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008 Free Software Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-])
-
-# serial 56 LT_INIT
-
-
-# LT_PREREQ(VERSION)
-# ------------------
-# Complain and exit if this libtool version is less that VERSION.
-m4_defun([LT_PREREQ],
-[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
-       [m4_default([$3],
-		   [m4_fatal([Libtool version $1 or higher is required],
-		             63)])],
-       [$2])])
-
-
-# _LT_CHECK_BUILDDIR
-# ------------------
-# Complain if the absolute build directory name contains unusual characters
-m4_defun([_LT_CHECK_BUILDDIR],
-[case `pwd` in
-  *\ * | *\	*)
-    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
-esac
-])
-
-
-# LT_INIT([OPTIONS])
-# ------------------
-AC_DEFUN([LT_INIT],
-[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
-AC_BEFORE([$0], [LT_LANG])dnl
-AC_BEFORE([$0], [LT_OUTPUT])dnl
-AC_BEFORE([$0], [LTDL_INIT])dnl
-m4_require([_LT_CHECK_BUILDDIR])dnl
-
-dnl Autoconf doesn't catch unexpanded LT_ macros by default:
-m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
-m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
-dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
-dnl unless we require an AC_DEFUNed macro:
-AC_REQUIRE([LTOPTIONS_VERSION])dnl
-AC_REQUIRE([LTSUGAR_VERSION])dnl
-AC_REQUIRE([LTVERSION_VERSION])dnl
-AC_REQUIRE([LTOBSOLETE_VERSION])dnl
-m4_require([_LT_PROG_LTMAIN])dnl
-
-dnl Parse OPTIONS
-_LT_SET_OPTIONS([$0], [$1])
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-AC_SUBST(LIBTOOL)dnl
-
-_LT_SETUP
-
-# Only expand once:
-m4_define([LT_INIT])
-])# LT_INIT
-
-# Old names:
-AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
-AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
-dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
-
-
-# _LT_CC_BASENAME(CC)
-# -------------------
-# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
-m4_defun([_LT_CC_BASENAME],
-[for cc_temp in $1""; do
-  case $cc_temp in
-    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
-    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
-])
-
-
-# _LT_FILEUTILS_DEFAULTS
-# ----------------------
-# It is okay to use these file commands and assume they have been set
-# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
-m4_defun([_LT_FILEUTILS_DEFAULTS],
-[: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-])# _LT_FILEUTILS_DEFAULTS
-
-
-# _LT_SETUP
-# ---------
-m4_defun([_LT_SETUP],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-_LT_DECL([], [host_alias], [0], [The host system])dnl
-_LT_DECL([], [host], [0])dnl
-_LT_DECL([], [host_os], [0])dnl
-dnl
-_LT_DECL([], [build_alias], [0], [The build system])dnl
-_LT_DECL([], [build], [0])dnl
-_LT_DECL([], [build_os], [0])dnl
-dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([LT_PATH_LD])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-dnl
-AC_REQUIRE([AC_PROG_LN_S])dnl
-test -z "$LN_S" && LN_S="ln -s"
-_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
-dnl
-AC_REQUIRE([LT_CMD_MAX_LEN])dnl
-_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
-_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
-dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_CHECK_SHELL_FEATURES])dnl
-m4_require([_LT_CMD_RELOAD])dnl
-m4_require([_LT_CHECK_MAGIC_METHOD])dnl
-m4_require([_LT_CMD_OLD_ARCHIVE])dnl
-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-
-_LT_CONFIG_LIBTOOL_INIT([
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-])
-if test -n "${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-_LT_CHECK_OBJDIR
-
-m4_require([_LT_TAG_COMPILER])dnl
-_LT_PROG_ECHO_BACKSLASH
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\([["`\\]]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-_LT_CC_BASENAME([$compiler])
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    _LT_PATH_MAGIC
-  fi
-  ;;
-esac
-
-# Use C for the default configuration in the libtool script
-LT_SUPPORTED_TAG([CC])
-_LT_LANG_C_CONFIG
-_LT_LANG_DEFAULT_CONFIG
-_LT_CONFIG_COMMANDS
-])# _LT_SETUP
-
-
-# _LT_PROG_LTMAIN
-# ---------------
-# Note that this code is called both from `configure', and `config.status'
-# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
-# `config.status' has no value for ac_aux_dir unless we are using Automake,
-# so we pass a copy along to make sure it has a sensible value anyway.
-m4_defun([_LT_PROG_LTMAIN],
-[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
-_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
-ltmain="$ac_aux_dir/ltmain.sh"
-])# _LT_PROG_LTMAIN
-
-
-## ------------------------------------- ##
-## Accumulate code for creating libtool. ##
-## ------------------------------------- ##
-
-# So that we can recreate a full libtool script including additional
-# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
-# in macros and then make a single call at the end using the `libtool'
-# label.
-
-
-# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
-# ----------------------------------------
-# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-m4_define([_LT_CONFIG_LIBTOOL_INIT],
-[m4_ifval([$1],
-          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
-                     [$1
-])])])
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_INIT])
-
-
-# _LT_CONFIG_LIBTOOL([COMMANDS])
-# ------------------------------
-# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-m4_define([_LT_CONFIG_LIBTOOL],
-[m4_ifval([$1],
-          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
-                     [$1
-])])])
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
-
-
-# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
-# -----------------------------------------------------
-m4_defun([_LT_CONFIG_SAVE_COMMANDS],
-[_LT_CONFIG_LIBTOOL([$1])
-_LT_CONFIG_LIBTOOL_INIT([$2])
-])
-
-
-# _LT_FORMAT_COMMENT([COMMENT])
-# -----------------------------
-# Add leading comment marks to the start of each line, and a trailing
-# full-stop to the whole comment if one is not present already.
-m4_define([_LT_FORMAT_COMMENT],
-[m4_ifval([$1], [
-m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
-              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
-)])
-
-
-
-## ------------------------ ##
-## FIXME: Eliminate VARNAME ##
-## ------------------------ ##
-
-
-# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
-# -------------------------------------------------------------------
-# CONFIGNAME is the name given to the value in the libtool script.
-# VARNAME is the (base) name used in the configure script.
-# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
-# VARNAME.  Any other value will be used directly.
-m4_define([_LT_DECL],
-[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
-    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
-	[m4_ifval([$1], [$1], [$2])])
-    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
-    m4_ifval([$4],
-	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
-    lt_dict_add_subkey([lt_decl_dict], [$2],
-	[tagged?], [m4_ifval([$5], [yes], [no])])])
-])
-
-
-# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
-# --------------------------------------------------------
-m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
-
-
-# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
-# ------------------------------------------------
-m4_define([lt_decl_tag_varnames],
-[_lt_decl_filter([tagged?], [yes], $@)])
-
-
-# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
-# ---------------------------------------------------------
-m4_define([_lt_decl_filter],
-[m4_case([$#],
-  [0], [m4_fatal([$0: too few arguments: $#])],
-  [1], [m4_fatal([$0: too few arguments: $#: $1])],
-  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
-  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
-  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
-])
-
-
-# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
-# --------------------------------------------------
-m4_define([lt_decl_quote_varnames],
-[_lt_decl_filter([value], [1], $@)])
-
-
-# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
-# ---------------------------------------------------
-m4_define([lt_decl_dquote_varnames],
-[_lt_decl_filter([value], [2], $@)])
-
-
-# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
-# ---------------------------------------------------
-m4_define([lt_decl_varnames_tagged],
-[m4_assert([$# <= 2])dnl
-_$0(m4_quote(m4_default([$1], [[, ]])),
-    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
-    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
-m4_define([_lt_decl_varnames_tagged],
-[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
-
-
-# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
-# ------------------------------------------------
-m4_define([lt_decl_all_varnames],
-[_$0(m4_quote(m4_default([$1], [[, ]])),
-     m4_if([$2], [],
-	   m4_quote(lt_decl_varnames),
-	m4_quote(m4_shift($@))))[]dnl
-])
-m4_define([_lt_decl_all_varnames],
-[lt_join($@, lt_decl_varnames_tagged([$1],
-			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
-])
-
-
-# _LT_CONFIG_STATUS_DECLARE([VARNAME])
-# ------------------------------------
-# Quote a variable value, and forward it to `config.status' so that its
-# declaration there will have the same value as in `configure'.  VARNAME
-# must have a single quote delimited value for this to work.
-m4_define([_LT_CONFIG_STATUS_DECLARE],
-[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`'])
-
-
-# _LT_CONFIG_STATUS_DECLARATIONS
-# ------------------------------
-# We delimit libtool config variables with single quotes, so when
-# we write them to config.status, we have to be sure to quote all
-# embedded single quotes properly.  In configure, this macro expands
-# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
-#
-#    <var>='`$ECHO "X$<var>" | $Xsed -e "$delay_single_quote_subst"`'
-m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
-[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
-    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
-
-
-# _LT_LIBTOOL_TAGS
-# ----------------
-# Output comment and list of tags supported by the script
-m4_defun([_LT_LIBTOOL_TAGS],
-[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
-available_tags="_LT_TAGS"dnl
-])
-
-
-# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
-# -----------------------------------
-# Extract the dictionary values for VARNAME (optionally with TAG) and
-# expand to a commented shell variable setting:
-#
-#    # Some comment about what VAR is for.
-#    visible_name=$lt_internal_name
-m4_define([_LT_LIBTOOL_DECLARE],
-[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
-					   [description])))[]dnl
-m4_pushdef([_libtool_name],
-    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
-m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
-    [0], [_libtool_name=[$]$1],
-    [1], [_libtool_name=$lt_[]$1],
-    [2], [_libtool_name=$lt_[]$1],
-    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
-m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
-])
-
-
-# _LT_LIBTOOL_CONFIG_VARS
-# -----------------------
-# Produce commented declarations of non-tagged libtool config variables
-# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
-# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
-# section) are produced by _LT_LIBTOOL_TAG_VARS.
-m4_defun([_LT_LIBTOOL_CONFIG_VARS],
-[m4_foreach([_lt_var],
-    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
-    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
-
-
-# _LT_LIBTOOL_TAG_VARS(TAG)
-# -------------------------
-m4_define([_LT_LIBTOOL_TAG_VARS],
-[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
-    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
-
-
-# _LT_TAGVAR(VARNAME, [TAGNAME])
-# ------------------------------
-m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
-
-
-# _LT_CONFIG_COMMANDS
-# -------------------
-# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
-# variables for single and double quote escaping we saved from calls
-# to _LT_DECL, we can put quote escaped variables declarations
-# into `config.status', and then the shell code to quote escape them in
-# for loops in `config.status'.  Finally, any additional code accumulated
-# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
-m4_defun([_LT_CONFIG_COMMANDS],
-[AC_PROVIDE_IFELSE([LT_OUTPUT],
-	dnl If the libtool generation code has been placed in $CONFIG_LT,
-	dnl instead of duplicating it all over again into config.status,
-	dnl then we will have config.status run $CONFIG_LT later, so it
-	dnl needs to know what name is stored there:
-        [AC_CONFIG_COMMANDS([libtool],
-            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
-    dnl If the libtool generation code is destined for config.status,
-    dnl expand the accumulated commands and init code now:
-    [AC_CONFIG_COMMANDS([libtool],
-        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
-])#_LT_CONFIG_COMMANDS
-
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
-[
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-_LT_CONFIG_STATUS_DECLARATIONS
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# Quote evaled strings.
-for var in lt_decl_all_varnames([[ \
-]], lt_decl_quote_varnames); do
-    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
-    *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Double-quote double-evaled strings.
-for var in lt_decl_all_varnames([[ \
-]], lt_decl_dquote_varnames); do
-    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
-    *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Fix-up fallback echo if it was mangled by the above quoting rules.
-case \$lt_ECHO in
-*'\\\[$]0 --fallback-echo"')dnl "
-  lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\`
-  ;;
-esac
-
-_LT_OUTPUT_LIBTOOL_INIT
-])
-
-
-# LT_OUTPUT
-# ---------
-# This macro allows early generation of the libtool script (before
-# AC_OUTPUT is called), incase it is used in configure for compilation
-# tests.
-AC_DEFUN([LT_OUTPUT],
-[: ${CONFIG_LT=./config.lt}
-AC_MSG_NOTICE([creating $CONFIG_LT])
-cat >"$CONFIG_LT" <<_LTEOF
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate a libtool stub with the current configuration.
-
-lt_cl_silent=false
-SHELL=\${CONFIG_SHELL-$SHELL}
-_LTEOF
-
-cat >>"$CONFIG_LT" <<\_LTEOF
-AS_SHELL_SANITIZE
-_AS_PREPARE
-
-exec AS_MESSAGE_FD>&1
-exec AS_MESSAGE_LOG_FD>>config.log
-{
-  echo
-  AS_BOX([Running $as_me.])
-} >&AS_MESSAGE_LOG_FD
-
-lt_cl_help="\
-\`$as_me' creates a local libtool stub from the current configuration,
-for use in further configure time tests before the real libtool is
-generated.
-
-Usage: $[0] [[OPTIONS]]
-
-  -h, --help      print this help, then exit
-  -V, --version   print version number, then exit
-  -q, --quiet     do not print progress messages
-  -d, --debug     don't remove temporary files
-
-Report bugs to <bug-libtool@gnu.org>."
-
-lt_cl_version="\
-m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
-m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
-configured by $[0], generated by m4_PACKAGE_STRING.
-
-Copyright (C) 2008 Free Software Foundation, Inc.
-This config.lt script is free software; the Free Software Foundation
-gives unlimited permision to copy, distribute and modify it."
-
-while test $[#] != 0
-do
-  case $[1] in
-    --version | --v* | -V )
-      echo "$lt_cl_version"; exit 0 ;;
-    --help | --h* | -h )
-      echo "$lt_cl_help"; exit 0 ;;
-    --debug | --d* | -d )
-      debug=: ;;
-    --quiet | --q* | --silent | --s* | -q )
-      lt_cl_silent=: ;;
-
-    -*) AC_MSG_ERROR([unrecognized option: $[1]
-Try \`$[0] --help' for more information.]) ;;
-
-    *) AC_MSG_ERROR([unrecognized argument: $[1]
-Try \`$[0] --help' for more information.]) ;;
-  esac
-  shift
-done
-
-if $lt_cl_silent; then
-  exec AS_MESSAGE_FD>/dev/null
-fi
-_LTEOF
-
-cat >>"$CONFIG_LT" <<_LTEOF
-_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
-_LTEOF
-
-cat >>"$CONFIG_LT" <<\_LTEOF
-AC_MSG_NOTICE([creating $ofile])
-_LT_OUTPUT_LIBTOOL_COMMANDS
-AS_EXIT(0)
-_LTEOF
-chmod +x "$CONFIG_LT"
-
-# configure is writing to config.log, but config.lt does its own redirection,
-# appending to config.log, which fails on DOS, as config.log is still kept
-# open by configure.  Here we exec the FD to /dev/null, effectively closing
-# config.log, so it can be properly (re)opened and appended to by config.lt.
-if test "$no_create" != yes; then
-  lt_cl_success=:
-  test "$silent" = yes &&
-    lt_config_lt_args="$lt_config_lt_args --quiet"
-  exec AS_MESSAGE_LOG_FD>/dev/null
-  $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
-  exec AS_MESSAGE_LOG_FD>>config.log
-  $lt_cl_success || AS_EXIT(1)
-fi
-])# LT_OUTPUT
-
-
-# _LT_CONFIG(TAG)
-# ---------------
-# If TAG is the built-in tag, create an initial libtool script with a
-# default configuration from the untagged config vars.  Otherwise add code
-# to config.status for appending the configuration named by TAG from the
-# matching tagged config vars.
-m4_defun([_LT_CONFIG],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-_LT_CONFIG_SAVE_COMMANDS([
-  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
-  m4_if(_LT_TAG, [C], [
-    # See if we are running on zsh, and set the options which allow our
-    # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
-      setopt NO_GLOB_SUBST
-    fi
-
-    cfgfile="${ofile}T"
-    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
-    $RM "$cfgfile"
-
-    cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $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.
-#
-_LT_COPYING
-_LT_LIBTOOL_TAGS
-
-# ### BEGIN LIBTOOL CONFIG
-_LT_LIBTOOL_CONFIG_VARS
-_LT_LIBTOOL_TAG_VARS
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
-  case $host_os in
-  aix3*)
-    cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-_LT_EOF
-    ;;
-  esac
-
-  _LT_PROG_LTMAIN
-
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  _LT_PROG_XSI_SHELLFNS
-
-  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  mv -f "$cfgfile" "$ofile" ||
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
-],
-[cat <<_LT_EOF >> "$ofile"
-
-dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
-dnl in a comment (ie after a #).
-# ### BEGIN LIBTOOL TAG CONFIG: $1
-_LT_LIBTOOL_TAG_VARS(_LT_TAG)
-# ### END LIBTOOL TAG CONFIG: $1
-_LT_EOF
-])dnl /m4_if
-],
-[m4_if([$1], [], [
-    PACKAGE='$PACKAGE'
-    VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
-    RM='$RM'
-    ofile='$ofile'], [])
-])dnl /_LT_CONFIG_SAVE_COMMANDS
-])# _LT_CONFIG
-
-
-# LT_SUPPORTED_TAG(TAG)
-# ---------------------
-# Trace this macro to discover what tags are supported by the libtool
-# --tag option, using:
-#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
-AC_DEFUN([LT_SUPPORTED_TAG], [])
-
-
-# C support is built-in for now
-m4_define([_LT_LANG_C_enabled], [])
-m4_define([_LT_TAGS], [])
-
-
-# LT_LANG(LANG)
-# -------------
-# Enable libtool support for the given language if not already enabled.
-AC_DEFUN([LT_LANG],
-[AC_BEFORE([$0], [LT_OUTPUT])dnl
-m4_case([$1],
-  [C],			[_LT_LANG(C)],
-  [C++],		[_LT_LANG(CXX)],
-  [Java],		[_LT_LANG(GCJ)],
-  [Fortran 77],		[_LT_LANG(F77)],
-  [Fortran],		[_LT_LANG(FC)],
-  [Windows Resource],	[_LT_LANG(RC)],
-  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
-    [_LT_LANG($1)],
-    [m4_fatal([$0: unsupported language: "$1"])])])dnl
-])# LT_LANG
-
-
-# _LT_LANG(LANGNAME)
-# ------------------
-m4_defun([_LT_LANG],
-[m4_ifdef([_LT_LANG_]$1[_enabled], [],
-  [LT_SUPPORTED_TAG([$1])dnl
-  m4_append([_LT_TAGS], [$1 ])dnl
-  m4_define([_LT_LANG_]$1[_enabled], [])dnl
-  _LT_LANG_$1_CONFIG($1)])dnl
-])# _LT_LANG
-
-
-# _LT_LANG_DEFAULT_CONFIG
-# -----------------------
-m4_defun([_LT_LANG_DEFAULT_CONFIG],
-[AC_PROVIDE_IFELSE([AC_PROG_CXX],
-  [LT_LANG(CXX)],
-  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
-
-AC_PROVIDE_IFELSE([AC_PROG_F77],
-  [LT_LANG(F77)],
-  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
-
-AC_PROVIDE_IFELSE([AC_PROG_FC],
-  [LT_LANG(FC)],
-  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
-
-dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
-dnl pulling things in needlessly.
-AC_PROVIDE_IFELSE([AC_PROG_GCJ],
-  [LT_LANG(GCJ)],
-  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
-    [LT_LANG(GCJ)],
-    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
-      [LT_LANG(GCJ)],
-      [m4_ifdef([AC_PROG_GCJ],
-	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
-       m4_ifdef([A][M_PROG_GCJ],
-	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
-       m4_ifdef([LT_PROG_GCJ],
-	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
-
-AC_PROVIDE_IFELSE([LT_PROG_RC],
-  [LT_LANG(RC)],
-  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
-])# _LT_LANG_DEFAULT_CONFIG
-
-# Obsolete macros:
-AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
-AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
-AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
-AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
-dnl AC_DEFUN([AC_LIBTOOL_F77], [])
-dnl AC_DEFUN([AC_LIBTOOL_FC], [])
-dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
-
-
-# _LT_TAG_COMPILER
-# ----------------
-m4_defun([_LT_TAG_COMPILER],
-[AC_REQUIRE([AC_PROG_CC])dnl
-
-_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
-_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
-_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
-_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-])# _LT_TAG_COMPILER
-
-
-# _LT_COMPILER_BOILERPLATE
-# ------------------------
-# Check for compiler boilerplate output or warnings with
-# the simple compiler test code.
-m4_defun([_LT_COMPILER_BOILERPLATE],
-[m4_require([_LT_DECL_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-])# _LT_COMPILER_BOILERPLATE
-
-
-# _LT_LINKER_BOILERPLATE
-# ----------------------
-# Check for linker boilerplate output or warnings with
-# the simple link test code.
-m4_defun([_LT_LINKER_BOILERPLATE],
-[m4_require([_LT_DECL_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-])# _LT_LINKER_BOILERPLATE
-
-# _LT_REQUIRED_DARWIN_CHECKS
-# -------------------------
-m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
-  case $host_os in
-    rhapsody* | darwin*)
-    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
-    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
-    AC_CHECK_TOOL([LIPO], [lipo], [:])
-    AC_CHECK_TOOL([OTOOL], [otool], [:])
-    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
-    _LT_DECL([], [DSYMUTIL], [1],
-      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
-    _LT_DECL([], [NMEDIT], [1],
-      [Tool to change global to local symbols on Mac OS X])
-    _LT_DECL([], [LIPO], [1],
-      [Tool to manipulate fat objects and archives on Mac OS X])
-    _LT_DECL([], [OTOOL], [1],
-      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
-    _LT_DECL([], [OTOOL64], [1],
-      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
-
-    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
-      [lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
-	# By default we will add the -single_module flag. You can override
-	# by either setting the environment variable LT_MULTI_MODULE
-	# non-empty at configure time, or by adding -multi_module to the
-	# link flags.
-	rm -rf libconftest.dylib*
-	echo "int foo(void){return 1;}" > conftest.c
-	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
-	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
-        _lt_result=$?
-	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
-	  lt_cv_apple_cc_single_mod=yes
-	else
-	  cat conftest.err >&AS_MESSAGE_LOG_FD
-	fi
-	rm -rf libconftest.dylib*
-	rm -f conftest.*
-      fi])
-    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
-      [lt_cv_ld_exported_symbols_list],
-      [lt_cv_ld_exported_symbols_list=no
-      save_LDFLAGS=$LDFLAGS
-      echo "_main" > conftest.sym
-      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
-	[lt_cv_ld_exported_symbols_list=yes],
-	[lt_cv_ld_exported_symbols_list=no])
-	LDFLAGS="$save_LDFLAGS"
-    ])
-    case $host_os in
-    rhapsody* | darwin1.[[012]])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-    darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-    darwin*) # darwin 5.x on
-      # if running on 10.5 or later, the deployment target defaults
-      # to the OS version, if on x86, and 10.4, the deployment
-      # target defaults to 10.4. Don't you love it?
-      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[[012]]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-      esac
-    ;;
-  esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-      _lt_dar_single_mod='$single_module'
-    fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-    else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    fi
-    if test "$DSYMUTIL" != ":"; then
-      _lt_dsymutil='~$DSYMUTIL $lib || :'
-    else
-      _lt_dsymutil=
-    fi
-    ;;
-  esac
-])
-
-
-# _LT_DARWIN_LINKER_FEATURES
-# --------------------------
-# Checks for linker and compiler features on darwin
-m4_defun([_LT_DARWIN_LINKER_FEATURES],
-[
-  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
-  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-  _LT_TAGVAR(hardcode_direct, $1)=no
-  _LT_TAGVAR(hardcode_automatic, $1)=yes
-  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  _LT_TAGVAR(whole_archive_flag_spec, $1)=''
-  _LT_TAGVAR(link_all_deplibs, $1)=yes
-  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=echo
-    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-    m4_if([$1], [CXX],
-[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
-    fi
-],[])
-  else
-  _LT_TAGVAR(ld_shlibs, $1)=no
-  fi
-])
-
-# _LT_SYS_MODULE_PATH_AIX
-# -----------------------
-# Links a minimal program and checks the executable
-# for the system default hardcoded library path. In most cases,
-# this is /usr/lib:/lib, but when the MPI compilers are used
-# the location of the communication and MPI libs are included too.
-# If we don't find anything, use the default library path according
-# to the aix ld manual.
-m4_defun([_LT_SYS_MODULE_PATH_AIX],
-[m4_require([_LT_DECL_SED])dnl
-AC_LINK_IFELSE(AC_LANG_PROGRAM,[
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi],[])
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-])# _LT_SYS_MODULE_PATH_AIX
-
-
-# _LT_SHELL_INIT(ARG)
-# -------------------
-m4_define([_LT_SHELL_INIT],
-[ifdef([AC_DIVERSION_NOTICE],
-	     [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
-	 [AC_DIVERT_PUSH(NOTICE)])
-$1
-AC_DIVERT_POP
-])# _LT_SHELL_INIT
-
-
-# _LT_PROG_ECHO_BACKSLASH
-# -----------------------
-# Add some code to the start of the generated configure script which
-# will find an echo command which doesn't interpret backslashes.
-m4_defun([_LT_PROG_ECHO_BACKSLASH],
-[_LT_SHELL_INIT([
-# Check that we are running under the correct shell.
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-case X$lt_ECHO in
-X*--fallback-echo)
-  # Remove one level of quotation (which was required for Make).
-  ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
-  ;;
-esac
-
-ECHO=${lt_ECHO-echo}
-if test "X[$]1" = X--no-reexec; then
-  # Discard the --no-reexec flag, and continue.
-  shift
-elif test "X[$]1" = X--fallback-echo; then
-  # Avoid inline document here, it may be left over
-  :
-elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
-  # Yippee, $ECHO works!
-  :
-else
-  # Restart under the correct shell.
-  exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
-fi
-
-if test "X[$]1" = X--fallback-echo; then
-  # used as fallback echo
-  shift
-  cat <<_LT_EOF
-[$]*
-_LT_EOF
-  exit 0
-fi
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test -z "$lt_ECHO"; then
-  if test "X${echo_test_string+set}" != Xset; then
-    # find a string as large as possible, as long as the shell can cope with it
-    for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
-      # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
-      if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
-	 { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
-      then
-        break
-      fi
-    done
-  fi
-
-  if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
-     echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
-     test "X$echo_testing_string" = "X$echo_test_string"; then
-    :
-  else
-    # The Solaris, AIX, and Digital Unix default echo programs unquote
-    # backslashes.  This makes it impossible to quote backslashes using
-    #   echo "$something" | sed 's/\\/\\\\/g'
-    #
-    # So, first we look for a working echo in the user's PATH.
-
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for dir in $PATH /usr/ucb; do
-      IFS="$lt_save_ifs"
-      if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
-         test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
-         echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
-         test "X$echo_testing_string" = "X$echo_test_string"; then
-        ECHO="$dir/echo"
-        break
-      fi
-    done
-    IFS="$lt_save_ifs"
-
-    if test "X$ECHO" = Xecho; then
-      # We didn't find a better echo, so look for alternatives.
-      if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
-         echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
-         test "X$echo_testing_string" = "X$echo_test_string"; then
-        # This shell has a builtin print -r that does the trick.
-        ECHO='print -r'
-      elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
-	   test "X$CONFIG_SHELL" != X/bin/ksh; then
-        # If we have ksh, try running configure again with it.
-        ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
-        export ORIGINAL_CONFIG_SHELL
-        CONFIG_SHELL=/bin/ksh
-        export CONFIG_SHELL
-        exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
-      else
-        # Try using printf.
-        ECHO='printf %s\n'
-        if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
-	   echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
-	   test "X$echo_testing_string" = "X$echo_test_string"; then
-	  # Cool, printf works
-	  :
-        elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
-	     test "X$echo_testing_string" = 'X\t' &&
-	     echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-	     test "X$echo_testing_string" = "X$echo_test_string"; then
-	  CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
-	  export CONFIG_SHELL
-	  SHELL="$CONFIG_SHELL"
-	  export SHELL
-	  ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
-        elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
-	     test "X$echo_testing_string" = 'X\t' &&
-	     echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-	     test "X$echo_testing_string" = "X$echo_test_string"; then
-	  ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
-        else
-	  # maybe with a smaller string...
-	  prev=:
-
-	  for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
-	    if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
-	    then
-	      break
-	    fi
-	    prev="$cmd"
-	  done
-
-	  if test "$prev" != 'sed 50q "[$]0"'; then
-	    echo_test_string=`eval $prev`
-	    export echo_test_string
-	    exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
-	  else
-	    # Oops.  We lost completely, so just stick with echo.
-	    ECHO=echo
-	  fi
-        fi
-      fi
-    fi
-  fi
-fi
-
-# Copy echo and quote the copy suitably for passing to libtool from
-# the Makefile, instead of quoting the original, which is used later.
-lt_ECHO=$ECHO
-if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
-   lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
-fi
-
-AC_SUBST(lt_ECHO)
-])
-_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
-_LT_DECL([], [ECHO], [1],
-    [An echo program that does not interpret backslashes])
-])# _LT_PROG_ECHO_BACKSLASH
-
-
-# _LT_ENABLE_LOCK
-# ---------------
-m4_defun([_LT_ENABLE_LOCK],
-[AC_ARG_ENABLE([libtool-lock],
-  [AS_HELP_STRING([--disable-libtool-lock],
-    [avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.$ac_objext` in
-      *ELF-32*)
-	HPUX_IA64_MODE="32"
-	;;
-      *ELF-64*)
-	HPUX_IA64_MODE="64"
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '[#]line __oline__ "configure"' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -melf32bsmip"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -melf32bmipn32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -melf64bmip"
-	;;
-      esac
-    else
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -32"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -n32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -64"
-	  ;;
-      esac
-    fi
-  fi
-  rm -rf conftest*
-  ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-      *32-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_i386_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_i386"
-	    ;;
-	  ppc64-*linux*|powerpc64-*linux*)
-	    LD="${LD-ld} -m elf32ppclinux"
-	    ;;
-	  s390x-*linux*)
-	    LD="${LD-ld} -m elf_s390"
-	    ;;
-	  sparc64-*linux*)
-	    LD="${LD-ld} -m elf32_sparc"
-	    ;;
-	esac
-	;;
-      *64-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_x86_64_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_x86_64"
-	    ;;
-	  ppc*-*linux*|powerpc*-*linux*)
-	    LD="${LD-ld} -m elf64ppc"
-	    ;;
-	  s390*-*linux*|s390*-*tpf*)
-	    LD="${LD-ld} -m elf64_s390"
-	    ;;
-	  sparc*-*linux*)
-	    LD="${LD-ld} -m elf64_sparc"
-	    ;;
-	esac
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
-    [AC_LANG_PUSH(C)
-     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
-     AC_LANG_POP])
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-sparc*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
-      *)
-	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
-	  LD="${LD-ld} -64"
-	fi
-	;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-esac
-
-need_locks="$enable_libtool_lock"
-])# _LT_ENABLE_LOCK
-
-
-# _LT_CMD_OLD_ARCHIVE
-# -------------------
-m4_defun([_LT_CMD_OLD_ARCHIVE],
-[AC_CHECK_TOOL(AR, ar, false)
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-_LT_DECL([], [AR], [1], [The archiver])
-_LT_DECL([], [AR_FLAGS], [1])
-
-AC_CHECK_TOOL(STRIP, strip, :)
-test -z "$STRIP" && STRIP=:
-_LT_DECL([], [STRIP], [1], [A symbol stripping program])
-
-AC_CHECK_TOOL(RANLIB, ranlib, :)
-test -z "$RANLIB" && RANLIB=:
-_LT_DECL([], [RANLIB], [1],
-    [Commands used to install an old-style archive])
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
-fi
-_LT_DECL([], [old_postinstall_cmds], [2])
-_LT_DECL([], [old_postuninstall_cmds], [2])
-_LT_TAGDECL([], [old_archive_cmds], [2],
-    [Commands used to build an old-style archive])
-])# _LT_CMD_OLD_ARCHIVE
-
-
-# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------------------
-# Check whether the given compiler option works
-AC_DEFUN([_LT_COMPILER_OPTION],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$3"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       $2=yes
-     fi
-   fi
-   $RM conftest*
-])
-
-if test x"[$]$2" = xyes; then
-    m4_if([$5], , :, [$5])
-else
-    m4_if([$6], , :, [$6])
-fi
-])# _LT_COMPILER_OPTION
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
-
-
-# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#                  [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------
-# Check whether the given linker option works
-AC_DEFUN([_LT_LINKER_OPTION],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $3"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&AS_MESSAGE_LOG_FD
-       $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         $2=yes
-       fi
-     else
-       $2=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-])
-
-if test x"[$]$2" = xyes; then
-    m4_if([$4], , :, [$4])
-else
-    m4_if([$5], , :, [$5])
-fi
-])# _LT_LINKER_OPTION
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
-
-
-# LT_CMD_MAX_LEN
-#---------------
-AC_DEFUN([LT_CMD_MAX_LEN],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-# find the maximum length of command line arguments
-AC_MSG_CHECKING([the maximum length of command line arguments])
-AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
-  i=0
-  teststring="ABCD"
-
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
-
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
-
-  cygwin* | mingw* | cegcc*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
-
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
-
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    else
-      # Make teststring a little bigger before we do anything with it.
-      # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
-        teststring=$teststring$teststring
-      done
-      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-      # If test is not a shell built-in, we'll probably end up computing a
-      # maximum length that is only half of the actual maximum length, but
-      # we can't tell.
-      while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
-	         = "XX$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
-      do
-        i=`expr $i + 1`
-        teststring=$teststring$teststring
-      done
-      # Only check the string length outside the loop.
-      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
-      teststring=
-      # Add a significant safety factor because C++ compilers can tack on
-      # massive amounts of additional arguments before passing them to the
-      # linker.  It appears as though 1/2 is a usable value.
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    fi
-    ;;
-  esac
-])
-if test -n $lt_cv_sys_max_cmd_len ; then
-  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
-else
-  AC_MSG_RESULT(none)
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-_LT_DECL([], [max_cmd_len], [0],
-    [What is the maximum length of a command?])
-])# LT_CMD_MAX_LEN
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
-
-
-# _LT_HEADER_DLFCN
-# ----------------
-m4_defun([_LT_HEADER_DLFCN],
-[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
-])# _LT_HEADER_DLFCN
-
-
-# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
-#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
-# ----------------------------------------------------------------
-m4_defun([_LT_TRY_DLOPEN_SELF],
-[m4_require([_LT_HEADER_DLFCN])dnl
-if test "$cross_compiling" = yes; then :
-  [$4]
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-[#line __oline__ "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-void fnord() { int i=42;}
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}]
-_LT_EOF
-  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) $1 ;;
-      x$lt_dlneed_uscore) $2 ;;
-      x$lt_dlunknown|x*) $3 ;;
-    esac
-  else :
-    # compilation failed
-    $3
-  fi
-fi
-rm -fr conftest*
-])# _LT_TRY_DLOPEN_SELF
-
-
-# LT_SYS_DLOPEN_SELF
-# ------------------
-AC_DEFUN([LT_SYS_DLOPEN_SELF],
-[m4_require([_LT_HEADER_DLFCN])dnl
-if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-    ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-    ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ])
-    ;;
-
-  *)
-    AC_CHECK_FUNC([shl_load],
-	  [lt_cv_dlopen="shl_load"],
-      [AC_CHECK_LIB([dld], [shl_load],
-	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
-	[AC_CHECK_FUNC([dlopen],
-	      [lt_cv_dlopen="dlopen"],
-	  [AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
-	    [AC_CHECK_LIB([svld], [dlopen],
-		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
-	      [AC_CHECK_LIB([dld], [dld_link],
-		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
-	      ])
-	    ])
-	  ])
-	])
-      ])
-    ;;
-  esac
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    AC_CACHE_CHECK([whether a program can dlopen itself],
-	  lt_cv_dlopen_self, [dnl
-	  _LT_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
-	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
-    ])
-
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
-	  lt_cv_dlopen_self_static, [dnl
-	  _LT_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
-	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
-      ])
-    fi
-
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
-
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-_LT_DECL([dlopen_support], [enable_dlopen], [0],
-	 [Whether dlopen is supported])
-_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
-	 [Whether dlopen of programs is supported])
-_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
-	 [Whether dlopen of statically linked programs is supported])
-])# LT_SYS_DLOPEN_SELF
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
-
-
-# _LT_COMPILER_C_O([TAGNAME])
-# ---------------------------
-# Check to see if options -c and -o are simultaneously supported by compiler.
-# This macro does not hard code the compiler like AC_PROG_CC_C_O.
-m4_defun([_LT_COMPILER_C_O],
-[m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
-  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
-  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-     fi
-   fi
-   chmod u+w . 2>&AS_MESSAGE_LOG_FD
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-])
-_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
-	[Does compiler simultaneously support -c and -o options?])
-])# _LT_COMPILER_C_O
-
-
-# _LT_COMPILER_FILE_LOCKS([TAGNAME])
-# ----------------------------------
-# Check to see if we can do hard links to lock some files if needed
-m4_defun([_LT_COMPILER_FILE_LOCKS],
-[m4_require([_LT_ENABLE_LOCK])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-_LT_COMPILER_C_O([$1])
-
-hard_links="nottested"
-if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  AC_MSG_CHECKING([if we can lock with hard links])
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  AC_MSG_RESULT([$hard_links])
-  if test "$hard_links" = no; then
-    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
-])# _LT_COMPILER_FILE_LOCKS
-
-
-# _LT_CHECK_OBJDIR
-# ----------------
-m4_defun([_LT_CHECK_OBJDIR],
-[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
-[rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null])
-objdir=$lt_cv_objdir
-_LT_DECL([], [objdir], [0],
-         [The name of the directory that contains temporary libtool files])dnl
-m4_pattern_allow([LT_OBJDIR])dnl
-AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
-  [Define to the sub-directory in which libtool stores uninstalled libraries.])
-])# _LT_CHECK_OBJDIR
-
-
-# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
-# --------------------------------------
-# Check hardcoding attributes.
-m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
-[AC_MSG_CHECKING([how to hardcode library paths into programs])
-_LT_TAGVAR(hardcode_action, $1)=
-if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
-   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
-   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
-     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
-    # Linking always hardcodes the temporary library directory.
-    _LT_TAGVAR(hardcode_action, $1)=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    _LT_TAGVAR(hardcode_action, $1)=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  _LT_TAGVAR(hardcode_action, $1)=unsupported
-fi
-AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
-
-if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
-   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-_LT_TAGDECL([], [hardcode_action], [0],
-    [How to hardcode a shared library path into an executable])
-])# _LT_LINKER_HARDCODE_LIBPATH
-
-
-# _LT_CMD_STRIPLIB
-# ----------------
-m4_defun([_LT_CMD_STRIPLIB],
-[m4_require([_LT_DECL_EGREP])
-striplib=
-old_striplib=
-AC_MSG_CHECKING([whether stripping libraries is possible])
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  AC_MSG_RESULT([yes])
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-  darwin*)
-    if test -n "$STRIP" ; then
-      striplib="$STRIP -x"
-      old_striplib="$STRIP -S"
-      AC_MSG_RESULT([yes])
-    else
-      AC_MSG_RESULT([no])
-    fi
-    ;;
-  *)
-    AC_MSG_RESULT([no])
-    ;;
-  esac
-fi
-_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
-_LT_DECL([], [striplib], [1])
-])# _LT_CMD_STRIPLIB
-
-
-# _LT_SYS_DYNAMIC_LINKER([TAG])
-# -----------------------------
-# PORTME Fill in your ld.so characteristics
-m4_defun([_LT_SYS_DYNAMIC_LINKER],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_OBJDUMP])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_MSG_CHECKING([dynamic linker characteristics])
-m4_if([$1],
-	[], [
-if test "$GCC" = yes; then
-  case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
-  esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-  if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'`
-  else
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-  fi
-  # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
-  lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
-  for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
-      test -d "$lt_sys_path" && \
-	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
-    fi
-  done
-  lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
-  for (lt_i = NF; lt_i > 0; lt_i--) {
-    if ($lt_i != "" && $lt_i != ".") {
-      if ($lt_i == "..") {
-        lt_count++;
-      } else {
-        if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
-        } else {
-          lt_count--;
-        }
-      }
-    }
-  }
-  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
-  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
-}'`
-  sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi])
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[[4-9]]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[[01]] | aix4.[[01]].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[[45]]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
-        # It is most probably a Windows format PATH printed by
-        # mingw gcc, but we are running on Cygwin. Gcc prints its search
-        # path with ; separators, and with drive letters. We can handle the
-        # drive letters (cygwin fileutils understands them), so leave them,
-        # especially as we might pass files found there to a mingw objdump,
-        # which wouldn't understand a cygwinified path. Ahh.
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
-
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-m4_if([$1], [],[
-  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd1*)
-  dynamic_linker=no
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[[123]]*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
-  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555.
-  postinstall_cmds='chmod 555 $lib'
-  ;;
-
-interix[[3-9]]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  # Some binutils ld are patched to set DT_RUNPATH
-  save_LDFLAGS=$LDFLAGS
-  save_libdir=$libdir
-  eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
-       LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
-  AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
-    [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
-       [shlibpath_overrides_runpath=yes])])
-  LDFLAGS=$save_LDFLAGS
-  libdir=$save_libdir
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsdelf*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='NetBSD ld.elf_so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[[89]] | openbsd2.[[89]].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-AC_MSG_RESULT([$dynamic_linker])
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-_LT_DECL([], [variables_saved_for_relink], [1],
-    [Variables whose values should be saved in libtool wrapper scripts and
-    restored at link time])
-_LT_DECL([], [need_lib_prefix], [0],
-    [Do we need the "lib" prefix for modules?])
-_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
-_LT_DECL([], [version_type], [0], [Library versioning type])
-_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
-_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
-_LT_DECL([], [shlibpath_overrides_runpath], [0],
-    [Is shlibpath searched before the hard-coded library search path?])
-_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
-_LT_DECL([], [library_names_spec], [1],
-    [[List of archive names.  First name is the real one, the rest are links.
-    The last name is the one that the linker finds with -lNAME]])
-_LT_DECL([], [soname_spec], [1],
-    [[The coded name of the library, if different from the real name]])
-_LT_DECL([], [postinstall_cmds], [2],
-    [Command to use after installation of a shared archive])
-_LT_DECL([], [postuninstall_cmds], [2],
-    [Command to use after uninstallation of a shared archive])
-_LT_DECL([], [finish_cmds], [2],
-    [Commands used to finish a libtool library installation in a directory])
-_LT_DECL([], [finish_eval], [1],
-    [[As "finish_cmds", except a single script fragment to be evaled but
-    not shown]])
-_LT_DECL([], [hardcode_into_libs], [0],
-    [Whether we should hardcode library paths into libraries])
-_LT_DECL([], [sys_lib_search_path_spec], [2],
-    [Compile-time system search path for libraries])
-_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
-    [Run-time system search path for libraries])
-])# _LT_SYS_DYNAMIC_LINKER
-
-
-# _LT_PATH_TOOL_PREFIX(TOOL)
-# --------------------------
-# find a file program which can recognize shared library
-AC_DEFUN([_LT_PATH_TOOL_PREFIX],
-[m4_require([_LT_DECL_EGREP])dnl
-AC_MSG_CHECKING([for $1])
-AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
-[case $MAGIC_CMD in
-[[\\/*] |  ?:[\\/]*])
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-dnl $ac_dummy forces splitting on constant user-supplied paths.
-dnl POSIX.2 word splitting is done only on the output of word expansions,
-dnl not every word.  This closes a longstanding sh security hole.
-  ac_dummy="m4_if([$2], , $PATH, [$2])"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$1; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac])
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  AC_MSG_RESULT($MAGIC_CMD)
-else
-  AC_MSG_RESULT(no)
-fi
-_LT_DECL([], [MAGIC_CMD], [0],
-	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
-])# _LT_PATH_TOOL_PREFIX
-
-# Old name:
-AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
-
-
-# _LT_PATH_MAGIC
-# --------------
-# find a file program which can recognize a shared library
-m4_defun([_LT_PATH_MAGIC],
-[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
-  else
-    MAGIC_CMD=:
-  fi
-fi
-])# _LT_PATH_MAGIC
-
-
-# LT_PATH_LD
-# ----------
-# find the pathname to the GNU or non-GNU linker
-AC_DEFUN([LT_PATH_LD],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_DECL_EGREP])dnl
-
-AC_ARG_WITH([gnu-ld],
-    [AS_HELP_STRING([--with-gnu-ld],
-	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
-    [test "$withval" = no || with_gnu_ld=yes],
-    [with_gnu_ld=no])dnl
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  AC_MSG_CHECKING([for ld used by $CC])
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [[\\/]]* | ?:[[\\/]]*)
-      re_direlt='/[[^/]][[^/]]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  AC_MSG_CHECKING([for GNU ld])
-else
-  AC_MSG_CHECKING([for non-GNU ld])
-fi
-AC_CACHE_VAL(lt_cv_path_LD,
-[if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi])
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  AC_MSG_RESULT($LD)
-else
-  AC_MSG_RESULT(no)
-fi
-test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
-_LT_PATH_LD_GNU
-AC_SUBST([LD])
-
-_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
-])# LT_PATH_LD
-
-# Old names:
-AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
-AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_PROG_LD], [])
-dnl AC_DEFUN([AC_PROG_LD], [])
-
-
-# _LT_PATH_LD_GNU
-#- --------------
-m4_defun([_LT_PATH_LD_GNU],
-[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
-[# I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac])
-with_gnu_ld=$lt_cv_prog_gnu_ld
-])# _LT_PATH_LD_GNU
-
-
-# _LT_CMD_RELOAD
-# --------------
-# find reload flag for linker
-#   -- PORTME Some linkers may need a different reload flag.
-m4_defun([_LT_CMD_RELOAD],
-[AC_CACHE_CHECK([for $LD option to reload object files],
-  lt_cv_ld_reload_flag,
-  [lt_cv_ld_reload_flag='-r'])
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
-_LT_DECL([], [reload_flag], [1], [How to create reloadable object files])dnl
-_LT_DECL([], [reload_cmds], [2])dnl
-])# _LT_CMD_RELOAD
-
-
-# _LT_CHECK_MAGIC_METHOD
-# ----------------------
-# how to check for library dependencies
-#  -- PORTME fill in with the dynamic library characteristics
-m4_defun([_LT_CHECK_MAGIC_METHOD],
-[m4_require([_LT_DECL_EGREP])
-m4_require([_LT_DECL_OBJDUMP])
-AC_CACHE_CHECK([how to recognize dependent libraries],
-lt_cv_deplibs_check_method,
-[lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[[4-9]]*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[[45]]*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump',
-  # unless we find 'file', for example because we are cross-compiling.
-  if ( file / ) >/dev/null 2>&1; then
-    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-    lt_cv_file_magic_cmd='func_win32_libid'
-  else
-    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
-    lt_cv_file_magic_cmd='$OBJDUMP -f'
-  fi
-  ;;
-
-cegcc)
-  # use the weaker test based on 'objdump'. See mingw*.
-  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
-
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-freebsd* | dragonfly*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
-
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
-
-interix[[3-9]]*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd* | netbsdelf*-gnu)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
-  fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-*nto* | *qnx*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-rdos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-tpf*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-])
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-_LT_DECL([], [deplibs_check_method], [1],
-    [Method to check whether dependent libraries are shared objects])
-_LT_DECL([], [file_magic_cmd], [1],
-    [Command to use when deplibs_check_method == "file_magic"])
-])# _LT_CHECK_MAGIC_METHOD
-
-
-# LT_PATH_NM
-# ----------
-# find the pathname to a BSD- or MS-compatible name lister
-AC_DEFUN([LT_PATH_NM],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
-[if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  : ${lt_cv_path_NM=no}
-fi])
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
-else
-  # Didn't find any BSD compatible name lister, look for dumpbin.
-  AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :)
-  AC_SUBST([DUMPBIN])
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
-  fi
-fi
-test -z "$NM" && NM=nm
-AC_SUBST([NM])
-_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
-
-AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
-  [lt_cv_nm_interface="BSD nm"
-  echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
-  (eval "$ac_compile" 2>conftest.err)
-  cat conftest.err >&AS_MESSAGE_LOG_FD
-  (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
-  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
-  cat conftest.err >&AS_MESSAGE_LOG_FD
-  (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD)
-  cat conftest.out >&AS_MESSAGE_LOG_FD
-  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
-    lt_cv_nm_interface="MS dumpbin"
-  fi
-  rm -f conftest*])
-])# LT_PATH_NM
-
-# Old names:
-AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
-AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_PROG_NM], [])
-dnl AC_DEFUN([AC_PROG_NM], [])
-
-
-# LT_LIB_M
-# --------
-# check for math library
-AC_DEFUN([LT_LIB_M],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-LIBM=
-case $host in
-*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
-  # These system don't have libm, or don't need it
-  ;;
-*-ncr-sysv4.3*)
-  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
-  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
-  ;;
-*)
-  AC_CHECK_LIB(m, cos, LIBM="-lm")
-  ;;
-esac
-AC_SUBST([LIBM])
-])# LT_LIB_M
-
-# Old name:
-AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_CHECK_LIBM], [])
-
-
-# _LT_COMPILER_NO_RTTI([TAGNAME])
-# -------------------------------
-m4_defun([_LT_COMPILER_NO_RTTI],
-[m4_require([_LT_TAG_COMPILER])dnl
-
-_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-
-if test "$GCC" = yes; then
-  _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
-
-  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
-    lt_cv_prog_compiler_rtti_exceptions,
-    [-fno-rtti -fno-exceptions], [],
-    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
-fi
-_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
-	[Compiler flag to turn off builtin functions])
-])# _LT_COMPILER_NO_RTTI
-
-
-# _LT_CMD_GLOBAL_SYMBOLS
-# ----------------------
-m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-AC_REQUIRE([LT_PATH_LD])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-AC_MSG_CHECKING([command to parse $NM output from $compiler object])
-AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
-[
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[[BCDEGRST]]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[[BCDT]]'
-  ;;
-cygwin* | mingw* | pw32* | cegcc*)
-  symcode='[[ABCDGISTW]]'
-  ;;
-hpux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[[ABCDEGRST]]'
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[[BCDEGRST]]'
-  ;;
-osf*)
-  symcode='[[BCDEGQRST]]'
-  ;;
-solaris*)
-  symcode='[[BDRT]]'
-  ;;
-sco3.2v5*)
-  symcode='[[DT]]'
-  ;;
-sysv4.2uw2*)
-  symcode='[[DT]]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[[ABDT]]'
-  ;;
-sysv4)
-  symcode='[[DFNSTU]]'
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[[ABCDGIRSTW]]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
-    # Also find C++ and __fastcall symbols from MSVC++,
-    # which start with @ or ?.
-    lt_cv_sys_global_symbol_pipe="$AWK ['"\
-"     {last_section=section; section=\$ 3};"\
-"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-"     \$ 0!~/External *\|/{next};"\
-"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-"     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-"     ' prfx=^$ac_symprfx]"
-  else
-    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-  fi
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
-  if AC_TRY_EVAL(ac_compile); then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
-	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<_LT_EOF > conftest.$ac_ext
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
-	  cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols.  */
-const struct {
-  const char *name;
-  void       *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[[]] =
-{
-  { "@PROGRAM@", (void *) 0 },
-_LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
-	  cat <<\_LT_EOF >> conftest.$ac_ext
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_save_LIBS="$LIBS"
-	  lt_save_CFLAGS="$CFLAGS"
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
-	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS="$lt_save_LIBS"
-	  CFLAGS="$lt_save_CFLAGS"
-	else
-	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
-    fi
-  else
-    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
-    cat conftest.$ac_ext >&5
-  fi
-  rm -rf conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-])
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  AC_MSG_RESULT(failed)
-else
-  AC_MSG_RESULT(ok)
-fi
-
-_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
-    [Take the output of nm and produce a listing of raw symbols and C names])
-_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
-    [Transform the output of nm in a proper C declaration])
-_LT_DECL([global_symbol_to_c_name_address],
-    [lt_cv_sys_global_symbol_to_c_name_address], [1],
-    [Transform the output of nm in a C name address pair])
-_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
-    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
-    [Transform the output of nm in a C name address pair when lib prefix is needed])
-]) # _LT_CMD_GLOBAL_SYMBOLS
-
-
-# _LT_COMPILER_PIC([TAGNAME])
-# ---------------------------
-m4_defun([_LT_COMPILER_PIC],
-[m4_require([_LT_TAG_COMPILER])dnl
-_LT_TAGVAR(lt_prog_compiler_wl, $1)=
-_LT_TAGVAR(lt_prog_compiler_pic, $1)=
-_LT_TAGVAR(lt_prog_compiler_static, $1)=
-
-AC_MSG_CHECKING([for $compiler option to produce PIC])
-m4_if([$1], [CXX], [
-  # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
-    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-    aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-    mingw* | cygwin* | os2* | pw32* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-    *djgpp*)
-      # DJGPP does not support shared libraries at all
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-      ;;
-    interix[[3-9]]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-    *qnx* | *nto*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-    *)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-  else
-    case $host_os in
-      aix[[4-9]]*)
-	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
-	  # AIX 5 now supports IA64 processor
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	else
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-	fi
-	;;
-      chorus*)
-	case $cc_basename in
-	cxch68*)
-	  # Green Hills C++ Compiler
-	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
-	  ;;
-	esac
-	;;
-      dgux*)
-	case $cc_basename in
-	  ec++*)
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  ghcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      freebsd* | dragonfly*)
-	# FreeBSD uses GNU C++
-	;;
-      hpux9* | hpux10* | hpux11*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	    fi
-	    ;;
-	  aCC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    case $host_cpu in
-	    hppa*64*|ia64*)
-	      # +Z the default
-	      ;;
-	    *)
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	      ;;
-	    esac
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      interix*)
-	# This is c89, which is MS Visual C++ (no shared libs)
-	# Anyone wants to do a port?
-	;;
-      irix5* | irix6* | nonstopux*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    # CC pic flag -KPIC is the default.
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-	case $cc_basename in
-	  KCC*)
-	    # KAI C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	    ;;
-	  ecpc* )
-	    # old Intel C++ for x86_64 which still supported -KPIC.
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	    ;;
-	  icpc* )
-	    # Intel C++, used to be incompatible with GCC.
-	    # ICC 10 doesn't accept -KPIC any more.
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	    ;;
-	  pgCC* | pgcpp*)
-	    # Portland Group C++ compiler
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  cxx*)
-	    # Compaq C++
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  xlc* | xlC*)
-	    # IBM XL 8.0 on PPC
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-      lynxos*)
-	;;
-      m88k*)
-	;;
-      mvs*)
-	case $cc_basename in
-	  cxx*)
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      netbsd* | netbsdelf*-gnu)
-	;;
-      *qnx* | *nto*)
-        # QNX uses GNU C++, but need to define -shared option too, otherwise
-        # it will coredump.
-        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-        ;;
-      osf3* | osf4* | osf5*)
-	case $cc_basename in
-	  KCC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    ;;
-	  RCC*)
-	    # Rational C++ 2.4.1
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  cxx*)
-	    # Digital/Compaq C++
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      psos*)
-	;;
-      solaris*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	    ;;
-	  gcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sunos4*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.x
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  lcc*)
-	    # Lucid
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	esac
-	;;
-      tandem*)
-	case $cc_basename in
-	  NCC*)
-	    # NonStop-UX NCC 3.20
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      vxworks*)
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-	;;
-    esac
-  fi
-],
-[
-  if test "$GCC" = yes; then
-    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	# +Z the default
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-
-    interix[[3-9]]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      enable_shared=no
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-
-    *)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      else
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC (with -KPIC) is the default.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
-      case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
-      ecc*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-        ;;
-      # icc used to be incompatible with GCC.
-      # ICC 10 doesn't accept -KPIC any more.
-      icc* | ifort*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-        ;;
-      # Lahey Fortran 8.1.
-      lf95*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
-	;;
-      pgcc* | pgf77* | pgf90* | pgf95*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-        ;;
-      ccc*)
-        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-        # All Alpha code is PIC.
-        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-        ;;
-      xl*)
-	# IBM XL C 8.0/Fortran 10.1 on PPC
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
-	;;
-      *)
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)
-	  # Sun C 5.9
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	  ;;
-	*Sun\ F*)
-	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
-	  ;;
-	esac
-	;;
-      esac
-      ;;
-
-    newsos6)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-
-    osf3* | osf4* | osf5*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # All OSF/1 code is PIC.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    rdos*)
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    solaris*)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    unicos*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-
-    uts4*)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    *)
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-    esac
-  fi
-])
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-    ;;
-  *)
-    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
-    ;;
-esac
-AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
-_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
-	[How to pass a linker flag through the compiler])
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
-  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
-    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
-    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
-    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
-     "" | " "*) ;;
-     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
-     esac],
-    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
-     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
-fi
-_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
-	[Additional compiler flags for building library objects])
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
-_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
-  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
-  $lt_tmp_static_flag,
-  [],
-  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
-_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
-	[Compiler flag to prevent dynamic linking])
-])# _LT_COMPILER_PIC
-
-
-# _LT_LINKER_SHLIBS([TAGNAME])
-# ----------------------------
-# See if the linker supports building shared libraries.
-m4_defun([_LT_LINKER_SHLIBS],
-[AC_REQUIRE([LT_PATH_LD])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-m4_if([$1], [CXX], [
-  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  case $host_os in
-  aix[[4-9]]*)
-    # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    else
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    fi
-    ;;
-  pw32*)
-    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
-  ;;
-  cygwin* | mingw* | cegcc*)
-    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  linux* | k*bsd*-gnu)
-    _LT_TAGVAR(link_all_deplibs, $1)=no
-  ;;
-  *)
-    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  esac
-  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
-], [
-  runpath_var=
-  _LT_TAGVAR(allow_undefined_flag, $1)=
-  _LT_TAGVAR(always_export_symbols, $1)=no
-  _LT_TAGVAR(archive_cmds, $1)=
-  _LT_TAGVAR(archive_expsym_cmds, $1)=
-  _LT_TAGVAR(compiler_needs_object, $1)=no
-  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
-  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  _LT_TAGVAR(hardcode_automatic, $1)=no
-  _LT_TAGVAR(hardcode_direct, $1)=no
-  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
-  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-  _LT_TAGVAR(hardcode_libdir_separator, $1)=
-  _LT_TAGVAR(hardcode_minus_L, $1)=no
-  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  _LT_TAGVAR(inherit_rpath, $1)=no
-  _LT_TAGVAR(link_all_deplibs, $1)=unknown
-  _LT_TAGVAR(module_cmds, $1)=
-  _LT_TAGVAR(module_expsym_cmds, $1)=
-  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
-  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
-  _LT_TAGVAR(thread_safe_flag_spec, $1)=
-  _LT_TAGVAR(whole_archive_flag_spec, $1)=
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  _LT_TAGVAR(include_expsyms, $1)=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  # Exclude shared library initialization/finalization symbols.
-dnl Note also adjust exclude_expsyms for C++ above.
-  extract_expsyms_cmds=
-
-  case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  linux* | k*bsd*-gnu)
-    _LT_TAGVAR(link_all_deplibs, $1)=no
-    ;;
-  esac
-
-  _LT_TAGVAR(ld_shlibs, $1)=yes
-  if test "$with_gnu_ld" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      _LT_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>&1` in
-      *GNU\ gold*) supports_anon_versioning=yes ;;
-      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[[3-9]]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
-
-_LT_EOF
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            _LT_TAGVAR(archive_expsym_cmds, $1)=''
-        ;;
-      m68k)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes
-        ;;
-      esac
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-      # as there is no search path for DLLs.
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(always_export_symbols, $1)=no
-      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
-
-      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    interix[[3-9]]*)
-      _LT_TAGVAR(hardcode_direct, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
-	case $cc_basename in
-	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
-	esac
-      fi
-      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
-      then
-	tmp_addflag=
-	tmp_sharedflag='-shared'
-	case $cc_basename,$host_cpu in
-        pgcc*)				# Portland Group C compiler
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	lf95*)				# Lahey Fortran 8.1
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
-	  tmp_sharedflag='--shared' ;;
-	xl[[cC]]*)			# IBM XL C 8.0 on PPC (deal with xlf below)
-	  tmp_sharedflag='-qmkshrobj'
-	  tmp_addflag= ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-	  _LT_TAGVAR(compiler_needs_object, $1)=yes
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	esac
-	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-        if test "x$supports_anon_versioning" = xyes; then
-          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-        fi
-
-	case $cc_basename in
-	xlf*)
-	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-	  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
-	  fi
-	  ;;
-	esac
-      else
-        _LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    netbsd* | netbsdelf*-gnu)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  # For security reasons, it is highly recommended that you always
-	  # use absolute paths for naming shared libraries, and exclude the
-	  # DT_RUNPATH tag from executables and libraries.  But doing so
-	  # requires that you compile everything twice, which is a pain.
-	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  else
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-    esac
-
-    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
-      runpath_var=
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
-      _LT_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(always_export_symbols, $1)=yes
-      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	_LT_TAGVAR(hardcode_direct, $1)=unsupported
-      fi
-      ;;
-
-    aix[[4-9]]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	else
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
-	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-	    aix_use_runtimelinking=yes
-	    break
-	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      _LT_TAGVAR(archive_cmds, $1)=''
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[[012]]|aix4.[[012]].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	  # We have reworked collect2
-	  :
-	  else
-	  # We have old collect2
-	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-	_LT_TAGVAR(link_all_deplibs, $1)=no
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      _LT_TAGVAR(always_export_symbols, $1)=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
-        # Determine the default libpath from the value encoded in an
-        # empty executable.
-        _LT_SYS_MODULE_PATH_AIX
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-      else
-	if test "$host_cpu" = ia64; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an
-	 # empty executable.
-	 _LT_SYS_MODULE_PATH_AIX
-	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	  # Exported symbols can be pulled into shared objects from archives
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            _LT_TAGVAR(archive_expsym_cmds, $1)=''
-        ;;
-      m68k)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes
-        ;;
-      esac
-      ;;
-
-    bsdi[[45]]*)
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
-      # FIXME: Should let the user specify the lib program.
-      _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
-      _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
-      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      ;;
-
-    darwin* | rhapsody*)
-      _LT_DARWIN_LINKER_FEATURES($1)
-      ;;
-
-    dgux*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    freebsd1*)
-      _LT_TAGVAR(ld_shlibs, $1)=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
-	_LT_TAGVAR(hardcode_direct, $1)=yes
-	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	_LT_TAGVAR(hardcode_minus_L, $1)=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  _LT_TAGVAR(hardcode_direct, $1)=no
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	  ;;
-	*)
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	# Try to use the -exported_symbol ld option, if it does not
-	# work, assume that -exports_file does not work either and
-	# implicitly export all symbols.
-        save_LDFLAGS="$LDFLAGS"
-        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-        AC_LINK_IFELSE(int foo(void) {},
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-        )
-        LDFLAGS="$save_LDFLAGS"
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(inherit_rpath, $1)=yes
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    netbsd* | netbsdelf*-gnu)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    newsos6)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *nto* | *qnx*)
-      ;;
-
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	_LT_TAGVAR(hardcode_direct, $1)=yes
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	else
-	  case $host_os in
-	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
-	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	     ;;
-	   *)
-	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-	fi
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    os2*)
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      else
-	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    solaris*)
-      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-      else
-	case `$CC -V 2>&1` in
-	*"Compilers 5.0"*)
-	  wlarc=''
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
-	  ;;
-	*)
-	  wlarc='${wl}'
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-	  ;;
-	esac
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      case $host_os in
-      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
-	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
-	  _LT_TAGVAR(hardcode_direct, $1)=no
-        ;;
-	motorola)
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4.3*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	_LT_TAGVAR(ld_shlibs, $1)=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      _LT_TAGVAR(ld_shlibs, $1)=no
-      ;;
-    esac
-
-    if test x$host_vendor = xsni; then
-      case $host in
-      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
-	;;
-      esac
-    fi
-  fi
-])
-AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
-
-_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
-_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
-_LT_DECL([], [extract_expsyms_cmds], [2],
-    [The commands to extract the exported symbol list from a shared archive])
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
-x|xyes)
-  # Assume -lc should be added
-  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $_LT_TAGVAR(archive_cmds, $1) in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      AC_MSG_CHECKING([whether -lc should be explicitly linked in])
-      $RM conftest*
-      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-      if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
-        soname=conftest
-        lib=conftest
-        libobjs=conftest.$ac_objext
-        deplibs=
-        wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
-	pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
-        compiler_flags=-v
-        linker_flags=-v
-        verstring=
-        output_objdir=.
-        libname=conftest
-        lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
-        _LT_TAGVAR(allow_undefined_flag, $1)=
-        if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
-        then
-	  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-        else
-	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-        fi
-        _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
-      else
-        cat conftest.err 1>&5
-      fi
-      $RM conftest*
-      AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)])
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
-    [Whether or not to add -lc for building shared libraries])
-_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
-    [enable_shared_with_static_runtimes], [0],
-    [Whether or not to disallow shared libs when runtime libs are static])
-_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
-    [Compiler flag to allow reflexive dlopens])
-_LT_TAGDECL([], [whole_archive_flag_spec], [1],
-    [Compiler flag to generate shared objects directly from archives])
-_LT_TAGDECL([], [compiler_needs_object], [1],
-    [Whether the compiler copes with passing no objects directly])
-_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
-    [Create an old-style archive from a shared archive])
-_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
-    [Create a temporary old-style archive to link instead of a shared archive])
-_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
-_LT_TAGDECL([], [archive_expsym_cmds], [2])
-_LT_TAGDECL([], [module_cmds], [2],
-    [Commands used to build a loadable module if different from building
-    a shared archive.])
-_LT_TAGDECL([], [module_expsym_cmds], [2])
-_LT_TAGDECL([], [with_gnu_ld], [1],
-    [Whether we are building with GNU ld or not])
-_LT_TAGDECL([], [allow_undefined_flag], [1],
-    [Flag that allows shared libraries with undefined symbols to be built])
-_LT_TAGDECL([], [no_undefined_flag], [1],
-    [Flag that enforces no undefined symbols])
-_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
-    [Flag to hardcode $libdir into a binary during linking.
-    This must work even if $libdir does not exist])
-_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1],
-    [[If ld is used when linking, flag to hardcode $libdir into a binary
-    during linking.  This must work even if $libdir does not exist]])
-_LT_TAGDECL([], [hardcode_libdir_separator], [1],
-    [Whether we need a single "-rpath" flag with a separated argument])
-_LT_TAGDECL([], [hardcode_direct], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
-    DIR into the resulting binary])
-_LT_TAGDECL([], [hardcode_direct_absolute], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
-    DIR into the resulting binary and the resulting library dependency is
-    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
-    library is relocated])
-_LT_TAGDECL([], [hardcode_minus_L], [0],
-    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-    into the resulting binary])
-_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
-    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-    into the resulting binary])
-_LT_TAGDECL([], [hardcode_automatic], [0],
-    [Set to "yes" if building a shared library automatically hardcodes DIR
-    into the library and all subsequent libraries and executables linked
-    against it])
-_LT_TAGDECL([], [inherit_rpath], [0],
-    [Set to yes if linker adds runtime paths of dependent libraries
-    to runtime path list])
-_LT_TAGDECL([], [link_all_deplibs], [0],
-    [Whether libtool must link a program against all its dependency libraries])
-_LT_TAGDECL([], [fix_srcfile_path], [1],
-    [Fix the shell variable $srcfile for the compiler])
-_LT_TAGDECL([], [always_export_symbols], [0],
-    [Set to "yes" if exported symbols are required])
-_LT_TAGDECL([], [export_symbols_cmds], [2],
-    [The commands to list exported symbols])
-_LT_TAGDECL([], [exclude_expsyms], [1],
-    [Symbols that should not be listed in the preloaded symbols])
-_LT_TAGDECL([], [include_expsyms], [1],
-    [Symbols that must always be exported])
-_LT_TAGDECL([], [prelink_cmds], [2],
-    [Commands necessary for linking programs (against libraries) with templates])
-_LT_TAGDECL([], [file_list_spec], [1],
-    [Specify filename containing input files])
-dnl FIXME: Not yet implemented
-dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
-dnl    [Compiler flag to generate thread safe objects])
-])# _LT_LINKER_SHLIBS
-
-
-# _LT_LANG_C_CONFIG([TAG])
-# ------------------------
-# Ensure that the configuration variables for a C compiler are suitably
-# defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_C_CONFIG],
-[m4_require([_LT_DECL_EGREP])dnl
-lt_save_CC="$CC"
-AC_LANG_PUSH(C)
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-_LT_TAG_COMPILER
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-  _LT_COMPILER_NO_RTTI($1)
-  _LT_COMPILER_PIC($1)
-  _LT_COMPILER_C_O($1)
-  _LT_COMPILER_FILE_LOCKS($1)
-  _LT_LINKER_SHLIBS($1)
-  _LT_SYS_DYNAMIC_LINKER($1)
-  _LT_LINKER_HARDCODE_LIBPATH($1)
-  LT_SYS_DLOPEN_SELF
-  _LT_CMD_STRIPLIB
-
-  # Report which library types will actually be built
-  AC_MSG_CHECKING([if libtool supports shared libraries])
-  AC_MSG_RESULT([$can_build_shared])
-
-  AC_MSG_CHECKING([whether to build shared libraries])
-  test "$can_build_shared" = "no" && enable_shared=no
-
-  # On AIX, shared libraries and static libraries use the same namespace, and
-  # are all built from PIC.
-  case $host_os in
-  aix3*)
-    test "$enable_shared" = yes && enable_static=no
-    if test -n "$RANLIB"; then
-      archive_cmds="$archive_cmds~\$RANLIB \$lib"
-      postinstall_cmds='$RANLIB $lib'
-    fi
-    ;;
-
-  aix[[4-9]]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
-    fi
-    ;;
-  esac
-  AC_MSG_RESULT([$enable_shared])
-
-  AC_MSG_CHECKING([whether to build static libraries])
-  # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
-  AC_MSG_RESULT([$enable_static])
-
-  _LT_CONFIG($1)
-fi
-AC_LANG_POP
-CC="$lt_save_CC"
-])# _LT_LANG_C_CONFIG
-
-
-# _LT_PROG_CXX
-# ------------
-# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++
-# compiler, we have our own version here.
-m4_defun([_LT_PROG_CXX],
-[
-pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes])
-AC_PROG_CXX
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
-  AC_PROG_CXXCPP
-else
-  _lt_caught_CXX_error=yes
-fi
-popdef([AC_MSG_ERROR])
-])# _LT_PROG_CXX
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([_LT_PROG_CXX], [])
-
-
-# _LT_LANG_CXX_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for a C++ compiler are suitably
-# defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_CXX_CONFIG],
-[AC_REQUIRE([_LT_PROG_CXX])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_EGREP])dnl
-
-AC_LANG_PUSH(C++)
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(compiler_needs_object, $1)=no
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for C++ test sources.
-ac_ext=cpp
-
-# Object file extension for compiled C++ test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the CXX compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="int some_variable = 0;"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC=$CC
-  lt_save_LD=$LD
-  lt_save_GCC=$GCC
-  GCC=$GXX
-  lt_save_with_gnu_ld=$with_gnu_ld
-  lt_save_path_LD=$lt_cv_path_LD
-  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
-    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
-  else
-    $as_unset lt_cv_prog_gnu_ld
-  fi
-  if test -n "${lt_cv_path_LDCXX+set}"; then
-    lt_cv_path_LD=$lt_cv_path_LDCXX
-  else
-    $as_unset lt_cv_path_LD
-  fi
-  test -z "${LDCXX+set}" || LD=$LDCXX
-  CC=${CXX-"c++"}
-  compiler=$CC
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-
-  if test -n "$compiler"; then
-    # We don't want -fno-exception when compiling C++ code, so set the
-    # no_builtin_flag separately
-    if test "$GXX" = yes; then
-      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
-    else
-      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-    fi
-
-    if test "$GXX" = yes; then
-      # Set up default GNU C++ configuration
-
-      LT_PATH_LD
-
-      # Check if GNU C++ uses GNU ld as the underlying linker, since the
-      # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-        # If archive_cmds runs LD, not CC, wlarc should be empty
-        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
-        #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
-
-        # ancient GNU ld didn't support --whole-archive et. al.
-        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
-	  $GREP 'no-whole-archive' > /dev/null; then
-          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-        else
-          _LT_TAGVAR(whole_archive_flag_spec, $1)=
-        fi
-      else
-        with_gnu_ld=no
-        wlarc=
-
-        # A generic and very simple default shared library creation
-        # command for GNU C++ for the case where it uses the native
-        # linker, instead of GNU ld.  If possible, this setting should
-        # overridden to take advantage of the native linker features on
-        # the platform it is being used on.
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-      fi
-
-      # Commands to make compiler produce verbose output that lists
-      # what "hidden" libraries, object files and flags are used when
-      # linking a shared library.
-      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
-
-    else
-      GXX=no
-      with_gnu_ld=no
-      wlarc=
-    fi
-
-    # PORTME: fill in a description of your system's C++ link characteristics
-    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-    _LT_TAGVAR(ld_shlibs, $1)=yes
-    case $host_os in
-      aix3*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-      aix[[4-9]]*)
-        if test "$host_cpu" = ia64; then
-          # On IA64, the linker does run time linking by default, so we don't
-          # have to do anything special.
-          aix_use_runtimelinking=no
-          exp_sym_flag='-Bexport'
-          no_entry_flag=""
-        else
-          aix_use_runtimelinking=no
-
-          # Test if we are trying to use run time linking or normal
-          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
-          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
-	    for ld_flag in $LDFLAGS; do
-	      case $ld_flag in
-	      *-brtl*)
-	        aix_use_runtimelinking=yes
-	        break
-	        ;;
-	      esac
-	    done
-	    ;;
-          esac
-
-          exp_sym_flag='-bexport'
-          no_entry_flag='-bnoentry'
-        fi
-
-        # When large executables or shared objects are built, AIX ld can
-        # have problems creating the table of contents.  If linking a library
-        # or program results in "error TOC overflow" add -mminimal-toc to
-        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-        _LT_TAGVAR(archive_cmds, $1)=''
-        _LT_TAGVAR(hardcode_direct, $1)=yes
-        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-        _LT_TAGVAR(link_all_deplibs, $1)=yes
-        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
-
-        if test "$GXX" = yes; then
-          case $host_os in aix4.[[012]]|aix4.[[012]].*)
-          # We only want to do this on AIX 4.2 and lower, the check
-          # below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	    # We have reworked collect2
-	    :
-	  else
-	    # We have old collect2
-	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
-	    # It fails to find uninstalled libraries when the uninstalled
-	    # path is not listed in the libpath.  Setting hardcode_minus_L
-	    # to unsupported forces relinking
-	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
-	  fi
-          esac
-          shared_flag='-shared'
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag="$shared_flag "'${wl}-G'
-	  fi
-        else
-          # not using gcc
-          if test "$host_cpu" = ia64; then
-	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	  # chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-          else
-	    if test "$aix_use_runtimelinking" = yes; then
-	      shared_flag='${wl}-G'
-	    else
-	      shared_flag='${wl}-bM:SRE'
-	    fi
-          fi
-        fi
-
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
-        # It seems that -bexpall does not export symbols beginning with
-        # underscore (_), so it is better to generate a list of symbols to
-	# export.
-        _LT_TAGVAR(always_export_symbols, $1)=yes
-        if test "$aix_use_runtimelinking" = yes; then
-          # Warning - without using the other runtime loading flags (-brtl),
-          # -berok will link without error, but may produce a broken library.
-          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
-          # Determine the default libpath from the value encoded in an empty
-          # executable.
-          _LT_SYS_MODULE_PATH_AIX
-          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-        else
-          if test "$host_cpu" = ia64; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-          else
-	    # Determine the default libpath from the value encoded in an
-	    # empty executable.
-	    _LT_SYS_MODULE_PATH_AIX
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	    # Warning - without using the other run time loading flags,
-	    # -berok will link without error, but may produce a broken library.
-	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	    # Exported symbols can be pulled into shared objects from archives
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	    # This is similar to how AIX traditionally builds its shared
-	    # libraries.
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-          fi
-        fi
-        ;;
-
-      beos*)
-	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	  # support --undefined.  This deserves some investigation.  FIXME
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	else
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-
-      chorus*)
-        case $cc_basename in
-          *)
-	  # FIXME: insert proper C++ library support
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	  ;;
-        esac
-        ;;
-
-      cygwin* | mingw* | pw32* | cegcc*)
-        # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-        # as there is no search path for DLLs.
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-        _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-        _LT_TAGVAR(always_export_symbols, $1)=no
-        _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-
-        if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-          # If the export-symbols file already is a .def file (1st line
-          # is EXPORTS), use it as is; otherwise, prepend...
-          _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    cp $export_symbols $output_objdir/$soname.def;
-          else
-	    echo EXPORTS > $output_objdir/$soname.def;
-	    cat $export_symbols >> $output_objdir/$soname.def;
-          fi~
-          $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-        else
-          _LT_TAGVAR(ld_shlibs, $1)=no
-        fi
-        ;;
-      darwin* | rhapsody*)
-        _LT_DARWIN_LINKER_FEATURES($1)
-	;;
-
-      dgux*)
-        case $cc_basename in
-          ec++*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          ghcx*)
-	    # Green Hills C++ Compiler
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      freebsd[[12]]*)
-        # C++ shared libraries reported to be fairly broken before
-	# switch to ELF
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      freebsd-elf*)
-        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-        ;;
-
-      freebsd* | dragonfly*)
-        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
-        # conventions
-        _LT_TAGVAR(ld_shlibs, $1)=yes
-        ;;
-
-      gnu*)
-        ;;
-
-      hpux9*)
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-        _LT_TAGVAR(hardcode_direct, $1)=yes
-        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-				             # but as the default
-				             # location of the library.
-
-        case $cc_basename in
-          CC*)
-            # FIXME: insert proper C++ library support
-            _LT_TAGVAR(ld_shlibs, $1)=no
-            ;;
-          aCC*)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            # Commands to make compiler produce verbose output that lists
-            # what "hidden" libraries, object files and flags are used when
-            # linking a shared library.
-            #
-            # There doesn't appear to be a way to prevent this compiler from
-            # explicitly linking system object files so we need to strip them
-            # from the output so that they don't get included in the library
-            # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
-            ;;
-          *)
-            if test "$GXX" = yes; then
-              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            else
-              # FIXME: insert proper C++ library support
-              _LT_TAGVAR(ld_shlibs, $1)=no
-            fi
-            ;;
-        esac
-        ;;
-
-      hpux10*|hpux11*)
-        if test $with_gnu_ld = no; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-          case $host_cpu in
-            hppa*64*|ia64*)
-              ;;
-            *)
-	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-              ;;
-          esac
-        fi
-        case $host_cpu in
-          hppa*64*|ia64*)
-            _LT_TAGVAR(hardcode_direct, $1)=no
-            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-            ;;
-          *)
-            _LT_TAGVAR(hardcode_direct, $1)=yes
-            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-					         # but as the default
-					         # location of the library.
-            ;;
-        esac
-
-        case $cc_basename in
-          CC*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          aCC*)
-	    case $host_cpu in
-	      hppa*64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      ia64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      *)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	    esac
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test $with_gnu_ld = no; then
-	        case $host_cpu in
-	          hppa*64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          ia64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          *)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	        esac
-	      fi
-	    else
-	      # FIXME: insert proper C++ library support
-	      _LT_TAGVAR(ld_shlibs, $1)=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      interix[[3-9]]*)
-	_LT_TAGVAR(hardcode_direct, $1)=no
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-	# Instead, shared libraries are loaded at an image base (0x10000000 by
-	# default) and relocated if they conflict, which is a slow very memory
-	# consuming and fragmenting process.  To avoid this, we pick a random,
-	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	;;
-      irix5* | irix6*)
-        case $cc_basename in
-          CC*)
-	    # SGI C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test "$with_gnu_ld" = no; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	      else
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib'
-	      fi
-	    fi
-	    _LT_TAGVAR(link_all_deplibs, $1)=yes
-	    ;;
-        esac
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(inherit_rpath, $1)=yes
-        ;;
-
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
-	    ;;
-	  icpc* | ecpc* )
-	    # Intel C++
-	    with_gnu_ld=yes
-	    # version 8.0 and above of icpc choke on multiply defined symbols
-	    # if we add $predep_objects and $postdep_objects, however 7.1 and
-	    # earlier do not add the objects themselves.
-	    case `$CC -V 2>&1` in
-	      *"Version 7."*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	      *)  # Version 8.0 or newer
-	        tmp_idyn=
-	        case $host_cpu in
-		  ia64*) tmp_idyn=' -i_dynamic';;
-		esac
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	    esac
-	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    ;;
-          pgCC* | pgcpp*)
-            # Portland Group C++ compiler
-	    case `$CC -V` in
-	    *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*)
-	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-		compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"'
-	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~
-		$RANLIB $oldlib'
-	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    *) # Version 6 will use weak symbols
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    esac
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-            ;;
-	  cxx*)
-	    # Compaq C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
-
-	    runpath_var=LD_RUN_PATH
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
-	    ;;
-	  xl*)
-	    # IBM XL 8.0 on PPC, with GNU ld
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    if test "x$supports_anon_versioning" = xyes; then
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-		echo "local: *; };" >> $output_objdir/$libname.ver~
-		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-	    fi
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-	      _LT_TAGVAR(compiler_needs_object, $1)=yes
-
-	      # Not sure whether something based on
-	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
-	      # would be better.
-	      output_verbose_link_cmd='echo'
-
-	      # Archives containing C++ object files must be created using
-	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	      # necessary to make sure instantiated templates are included
-	      # in the archive.
-	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-
-      lynxos*)
-        # FIXME: insert proper C++ library support
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      m88k*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      mvs*)
-        case $cc_basename in
-          cxx*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-	  *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-	esac
-	;;
-
-      netbsd*)
-        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
-	  wlarc=
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	fi
-	# Workaround some broken pre-1.5 toolchains
-	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
-	;;
-
-      *nto* | *qnx*)
-        _LT_TAGVAR(ld_shlibs, $1)=yes
-	;;
-
-      openbsd2*)
-        # C++ shared libraries are fairly broken
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      openbsd*)
-	if test -f /usr/libexec/ld.so; then
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-	  fi
-	  output_verbose_link_cmd=echo
-	else
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-
-      osf3* | osf4* | osf5*)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Archives containing C++ object files must be created using
-	    # the KAI C++ compiler.
-	    case $host in
-	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
-	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
-	    esac
-	    ;;
-          RCC*)
-	    # Rational C++ 2.4.1
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          cxx*)
-	    case $host in
-	      osf3*)
-	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-		;;
-	      *)
-	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	          echo "-hidden">> $lib.exp~
-	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~
-	          $RM $lib.exp'
-	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-		;;
-	    esac
-
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
-	    ;;
-	  *)
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	      case $host in
-	        osf3*)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	        *)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	      esac
-
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	      # Commands to make compiler produce verbose output that lists
-	      # what "hidden" libraries, object files and flags are used when
-	      # linking a shared library.
-	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
-
-	    else
-	      # FIXME: insert proper C++ library support
-	      _LT_TAGVAR(ld_shlibs, $1)=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      psos*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      sunos4*)
-        case $cc_basename in
-          CC*)
-	    # Sun C++ 4.x
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          lcc*)
-	    # Lucid
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      solaris*)
-        case $cc_basename in
-          CC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
-	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	    case $host_os in
-	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-	      *)
-		# The compiler driver will combine and reorder linker options,
-		# but understands `-z linker_flag'.
-	        # Supported since Solaris 2.6 (maybe 2.5.1?)
-		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
-	        ;;
-	    esac
-	    _LT_TAGVAR(link_all_deplibs, $1)=yes
-
-	    output_verbose_link_cmd='echo'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
-	    ;;
-          gcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-
-	    # The C++ compiler must be used to create the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    # GNU C++ compiler with Solaris linker
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
-	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
-	      else
-	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
-	        # platform.
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
-	      fi
-
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
-	      case $host_os in
-		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-		*)
-		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-		  ;;
-	      esac
-	    fi
-	    ;;
-        esac
-        ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      runpath_var='LD_RUN_PATH'
-
-      case $cc_basename in
-        CC*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-      esac
-      ;;
-
-      sysv5* | sco3.2v5* | sco5v6*)
-	# Note: We can NOT use -z defs as we might desire, because we do not
-	# link with -lc, and that would cause any symbols used from libc to
-	# always be unresolved, which means just about no library would
-	# ever link correctly.  If we're not using GNU ld we use -z text
-	# though, which does catch some bad symbols but isn't as heavy-handed
-	# as -z defs.
-	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-	_LT_TAGVAR(link_all_deplibs, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-	runpath_var='LD_RUN_PATH'
-
-	case $cc_basename in
-          CC*)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    ;;
-	  *)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    ;;
-	esac
-      ;;
-
-      tandem*)
-        case $cc_basename in
-          NCC*)
-	    # NonStop-UX NCC 3.20
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      vxworks*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      *)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-    esac
-
-    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-    _LT_TAGVAR(GCC, $1)="$GXX"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_SYS_HIDDEN_LIBDEPS($1)
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  CC=$lt_save_CC
-  LDCXX=$LD
-  LD=$lt_save_LD
-  GCC=$lt_save_GCC
-  with_gnu_ld=$lt_save_with_gnu_ld
-  lt_cv_path_LDCXX=$lt_cv_path_LD
-  lt_cv_path_LD=$lt_save_path_LD
-  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
-  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
-
-AC_LANG_POP
-])# _LT_LANG_CXX_CONFIG
-
-
-# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
-# ---------------------------------
-# Figure out "hidden" library dependencies from verbose
-# compiler output when linking a shared library.
-# Parse the compiler output and extract the necessary
-# objects, libraries and library flags.
-m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-# Dependencies to place before and after the object being linked:
-_LT_TAGVAR(predep_objects, $1)=
-_LT_TAGVAR(postdep_objects, $1)=
-_LT_TAGVAR(predeps, $1)=
-_LT_TAGVAR(postdeps, $1)=
-_LT_TAGVAR(compiler_lib_search_path, $1)=
-
-dnl we can't use the lt_simple_compile_test_code here,
-dnl because it contains code intended for an executable,
-dnl not a library.  It's possible we should let each
-dnl tag define a new lt_????_link_test_code variable,
-dnl but it's only used here...
-m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
-int a;
-void foo (void) { a = 0; }
-_LT_EOF
-], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
-class Foo
-{
-public:
-  Foo (void) { a = 0; }
-private:
-  int a;
-};
-_LT_EOF
-], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
-      subroutine foo
-      implicit none
-      integer*4 a
-      a=0
-      return
-      end
-_LT_EOF
-], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
-      subroutine foo
-      implicit none
-      integer a
-      a=0
-      return
-      end
-_LT_EOF
-], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
-public class foo {
-  private int a;
-  public void bar (void) {
-    a = 0;
-  }
-};
-_LT_EOF
-])
-dnl Parse the compiler output and extract the necessary
-dnl objects, libraries and library flags.
-if AC_TRY_EVAL(ac_compile); then
-  # Parse the compiler output and extract the necessary
-  # objects, libraries and library flags.
-
-  # Sentinel used to keep track of whether or not we are before
-  # the conftest object file.
-  pre_test_object_deps_done=no
-
-  for p in `eval "$output_verbose_link_cmd"`; do
-    case $p in
-
-    -L* | -R* | -l*)
-       # Some compilers place space between "-{L,R}" and the path.
-       # Remove the space.
-       if test $p = "-L" ||
-          test $p = "-R"; then
-	 prev=$p
-	 continue
-       else
-	 prev=
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 case $p in
-	 -L* | -R*)
-	   # Internal compiler library paths should come after those
-	   # provided the user.  The postdeps already come after the
-	   # user supplied libs so there is no need to process them.
-	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
-	   else
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
-	   fi
-	   ;;
-	 # The "-l" case would never come before the object being
-	 # linked, so don't bother handling this case.
-	 esac
-       else
-	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
-	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
-	 else
-	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
-	 fi
-       fi
-       ;;
-
-    *.$objext)
-       # This assumes that the test object file only shows up
-       # once in the compiler output.
-       if test "$p" = "conftest.$objext"; then
-	 pre_test_object_deps_done=yes
-	 continue
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
-	   _LT_TAGVAR(predep_objects, $1)="$p"
-	 else
-	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
-	 fi
-       else
-	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
-	   _LT_TAGVAR(postdep_objects, $1)="$p"
-	 else
-	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
-	 fi
-       fi
-       ;;
-
-    *) ;; # Ignore the rest.
-
-    esac
-  done
-
-  # Clean up.
-  rm -f a.out a.exe
-else
-  echo "libtool.m4: error: problem compiling $1 test program"
-fi
-
-$RM -f confest.$objext
-
-# PORTME: override above test on systems where it is broken
-m4_if([$1], [CXX],
-[case $host_os in
-interix[[3-9]]*)
-  # Interix 3.5 installs completely hosed .la files for C++, so rather than
-  # hack all around it, let's just trust "g++" to DTRT.
-  _LT_TAGVAR(predep_objects,$1)=
-  _LT_TAGVAR(postdep_objects,$1)=
-  _LT_TAGVAR(postdeps,$1)=
-  ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-esac
-])
-
-case " $_LT_TAGVAR(postdeps, $1) " in
-*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
-esac
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=
-if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
-fi
-_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
-    [The directories searched by this compiler when creating a shared library])
-_LT_TAGDECL([], [predep_objects], [1],
-    [Dependencies to place before and after the objects being linked to
-    create a shared library])
-_LT_TAGDECL([], [postdep_objects], [1])
-_LT_TAGDECL([], [predeps], [1])
-_LT_TAGDECL([], [postdeps], [1])
-_LT_TAGDECL([], [compiler_lib_search_path], [1],
-    [The library search path used internally by the compiler when linking
-    a shared library])
-])# _LT_SYS_HIDDEN_LIBDEPS
-
-
-# _LT_PROG_F77
-# ------------
-# Since AC_PROG_F77 is broken, in that it returns the empty string
-# if there is no fortran compiler, we have our own version here.
-m4_defun([_LT_PROG_F77],
-[
-pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes])
-AC_PROG_F77
-if test -z "$F77" || test "X$F77" = "Xno"; then
-  _lt_disable_F77=yes
-fi
-popdef([AC_MSG_ERROR])
-])# _LT_PROG_F77
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([_LT_PROG_F77], [])
-
-
-# _LT_LANG_F77_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for a Fortran 77 compiler are
-# suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_F77_CONFIG],
-[AC_REQUIRE([_LT_PROG_F77])dnl
-AC_LANG_PUSH(Fortran 77)
-
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for f77 test sources.
-ac_ext=f
-
-# Object file extension for compiled f77 test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the F77 compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_F77" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="\
-      subroutine t
-      return
-      end
-"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code="\
-      program t
-      end
-"
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
-  lt_save_GCC=$GCC
-  CC=${F77-"f77"}
-  compiler=$CC
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-  GCC=$G77
-  if test -n "$compiler"; then
-    AC_MSG_CHECKING([if libtool supports shared libraries])
-    AC_MSG_RESULT([$can_build_shared])
-
-    AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
-
-    # On AIX, shared libraries and static libraries use the same namespace, and
-    # are all built from PIC.
-    case $host_os in
-      aix3*)
-        test "$enable_shared" = yes && enable_static=no
-        if test -n "$RANLIB"; then
-          archive_cmds="$archive_cmds~\$RANLIB \$lib"
-          postinstall_cmds='$RANLIB $lib'
-        fi
-        ;;
-      aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
-	fi
-        ;;
-    esac
-    AC_MSG_RESULT([$enable_shared])
-
-    AC_MSG_CHECKING([whether to build static libraries])
-    # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
-    AC_MSG_RESULT([$enable_static])
-
-    _LT_TAGVAR(GCC, $1)="$G77"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  GCC=$lt_save_GCC
-  CC="$lt_save_CC"
-fi # test "$_lt_disable_F77" != yes
-
-AC_LANG_POP
-])# _LT_LANG_F77_CONFIG
-
-
-# _LT_PROG_FC
-# -----------
-# Since AC_PROG_FC is broken, in that it returns the empty string
-# if there is no fortran compiler, we have our own version here.
-m4_defun([_LT_PROG_FC],
-[
-pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes])
-AC_PROG_FC
-if test -z "$FC" || test "X$FC" = "Xno"; then
-  _lt_disable_FC=yes
-fi
-popdef([AC_MSG_ERROR])
-])# _LT_PROG_FC
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([_LT_PROG_FC], [])
-
-
-# _LT_LANG_FC_CONFIG([TAG])
-# -------------------------
-# Ensure that the configuration variables for a Fortran compiler are
-# suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_FC_CONFIG],
-[AC_REQUIRE([_LT_PROG_FC])dnl
-AC_LANG_PUSH(Fortran)
-
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for fc test sources.
-ac_ext=${ac_fc_srcext-f}
-
-# Object file extension for compiled fc test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the FC compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_FC" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="\
-      subroutine t
-      return
-      end
-"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code="\
-      program t
-      end
-"
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
-  lt_save_GCC=$GCC
-  CC=${FC-"f95"}
-  compiler=$CC
-  GCC=$ac_cv_fc_compiler_gnu
-
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-
-  if test -n "$compiler"; then
-    AC_MSG_CHECKING([if libtool supports shared libraries])
-    AC_MSG_RESULT([$can_build_shared])
-
-    AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
-
-    # On AIX, shared libraries and static libraries use the same namespace, and
-    # are all built from PIC.
-    case $host_os in
-      aix3*)
-        test "$enable_shared" = yes && enable_static=no
-        if test -n "$RANLIB"; then
-          archive_cmds="$archive_cmds~\$RANLIB \$lib"
-          postinstall_cmds='$RANLIB $lib'
-        fi
-        ;;
-      aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
-	fi
-        ;;
-    esac
-    AC_MSG_RESULT([$enable_shared])
-
-    AC_MSG_CHECKING([whether to build static libraries])
-    # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
-    AC_MSG_RESULT([$enable_static])
-
-    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_SYS_HIDDEN_LIBDEPS($1)
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  GCC=$lt_save_GCC
-  CC="$lt_save_CC"
-fi # test "$_lt_disable_FC" != yes
-
-AC_LANG_POP
-])# _LT_LANG_FC_CONFIG
-
-
-# _LT_LANG_GCJ_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for the GNU Java Compiler compiler
-# are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_GCJ_CONFIG],
-[AC_REQUIRE([LT_PROG_GCJ])dnl
-AC_LANG_SAVE
-
-# Source file extension for Java test sources.
-ac_ext=java
-
-# Object file extension for compiled Java test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="class foo {}"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-lt_save_GCC=$GCC
-GCC=yes
-CC=${GCJ-"gcj"}
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
-_LT_CC_BASENAME([$compiler])
-
-# GCJ did not exist at the time GCC didn't implicitly link libc in.
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-  _LT_COMPILER_NO_RTTI($1)
-  _LT_COMPILER_PIC($1)
-  _LT_COMPILER_C_O($1)
-  _LT_COMPILER_FILE_LOCKS($1)
-  _LT_LINKER_SHLIBS($1)
-  _LT_LINKER_HARDCODE_LIBPATH($1)
-
-  _LT_CONFIG($1)
-fi
-
-AC_LANG_RESTORE
-
-GCC=$lt_save_GCC
-CC="$lt_save_CC"
-])# _LT_LANG_GCJ_CONFIG
-
-
-# _LT_LANG_RC_CONFIG([TAG])
-# -------------------------
-# Ensure that the configuration variables for the Windows resource compiler
-# are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_RC_CONFIG],
-[AC_REQUIRE([LT_PROG_RC])dnl
-AC_LANG_SAVE
-
-# Source file extension for RC test sources.
-ac_ext=rc
-
-# Object file extension for compiled RC test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
-
-# Code to be used in simple link tests
-lt_simple_link_test_code="$lt_simple_compile_test_code"
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-lt_save_GCC=$GCC
-GCC=
-CC=${RC-"windres"}
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-
-if test -n "$compiler"; then
-  :
-  _LT_CONFIG($1)
-fi
-
-GCC=$lt_save_GCC
-AC_LANG_RESTORE
-CC="$lt_save_CC"
-])# _LT_LANG_RC_CONFIG
-
-
-# LT_PROG_GCJ
-# -----------
-AC_DEFUN([LT_PROG_GCJ],
-[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
-  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
-    [AC_CHECK_TOOL(GCJ, gcj,)
-      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
-      AC_SUBST(GCJFLAGS)])])[]dnl
-])
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
-
-
-# LT_PROG_RC
-# ----------
-AC_DEFUN([LT_PROG_RC],
-[AC_CHECK_TOOL(RC, windres,)
-])
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_RC], [])
-
-
-# _LT_DECL_EGREP
-# --------------
-# If we don't have a new enough Autoconf to choose the best grep
-# available, choose the one first in the user's PATH.
-m4_defun([_LT_DECL_EGREP],
-[AC_REQUIRE([AC_PROG_EGREP])dnl
-AC_REQUIRE([AC_PROG_FGREP])dnl
-test -z "$GREP" && GREP=grep
-_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
-_LT_DECL([], [EGREP], [1], [An ERE matcher])
-_LT_DECL([], [FGREP], [1], [A literal string matcher])
-dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
-AC_SUBST([GREP])
-])
-
-
-# _LT_DECL_OBJDUMP
-# --------------
-# If we don't have a new enough Autoconf to choose the best objdump
-# available, choose the one first in the user's PATH.
-m4_defun([_LT_DECL_OBJDUMP],
-[AC_CHECK_TOOL(OBJDUMP, objdump, false)
-test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
-AC_SUBST([OBJDUMP])
-])
-
-
-# _LT_DECL_SED
-# ------------
-# Check for a fully-functional sed program, that truncates
-# as few characters as possible.  Prefer GNU sed if found.
-m4_defun([_LT_DECL_SED],
-[AC_PROG_SED
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
-_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
-    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
-])# _LT_DECL_SED
-
-m4_ifndef([AC_PROG_SED], [
-############################################################
-# NOTE: This macro has been submitted for inclusion into   #
-#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
-#  a released version of Autoconf we should remove this    #
-#  macro and use it instead.                               #
-############################################################
-
-m4_defun([AC_PROG_SED],
-[AC_MSG_CHECKING([for a sed that does not truncate output])
-AC_CACHE_VAL(lt_cv_path_SED,
-[# Loop through the user's path and test for sed and gsed.
-# Then use that list of sed's as ones to test for truncation.
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for lt_ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
-        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
-      fi
-    done
-  done
-done
-IFS=$as_save_IFS
-lt_ac_max=0
-lt_ac_count=0
-# Add /usr/xpg4/bin/sed as it is typically found on Solaris
-# along with /bin/sed that truncates output.
-for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
-  test ! -f $lt_ac_sed && continue
-  cat /dev/null > conftest.in
-  lt_ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
-  # Check for GNU sed and select it if it is found.
-  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
-    lt_cv_path_SED=$lt_ac_sed
-    break
-  fi
-  while true; do
-    cat conftest.in conftest.in >conftest.tmp
-    mv conftest.tmp conftest.in
-    cp conftest.in conftest.nl
-    echo >>conftest.nl
-    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
-    cmp -s conftest.out conftest.nl || break
-    # 10000 chars as input seems more than enough
-    test $lt_ac_count -gt 10 && break
-    lt_ac_count=`expr $lt_ac_count + 1`
-    if test $lt_ac_count -gt $lt_ac_max; then
-      lt_ac_max=$lt_ac_count
-      lt_cv_path_SED=$lt_ac_sed
-    fi
-  done
-done
-])
-SED=$lt_cv_path_SED
-AC_SUBST([SED])
-AC_MSG_RESULT([$SED])
-])#AC_PROG_SED
-])#m4_ifndef
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_SED], [])
-
-
-# _LT_CHECK_SHELL_FEATURES
-# ------------------------
-# Find out whether the shell is Bourne or XSI compatible,
-# or has some other useful features.
-m4_defun([_LT_CHECK_SHELL_FEATURES],
-[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-AC_MSG_RESULT([$xsi_shell])
-_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
-
-AC_MSG_CHECKING([whether the shell understands "+="])
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-AC_MSG_RESULT([$lt_shell_append])
-_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  lt_unset=unset
-else
-  lt_unset=false
-fi
-_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  lt_SP2NL='tr \040 \012'
-  lt_NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  lt_SP2NL='tr \100 \n'
-  lt_NL2SP='tr \r\n \100\100'
-  ;;
-esac
-_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
-_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
-])# _LT_CHECK_SHELL_FEATURES
-
-
-# _LT_PROG_XSI_SHELLFNS
-# ---------------------
-# Bourne and XSI compatible variants of some useful shell functions.
-m4_defun([_LT_PROG_XSI_SHELLFNS],
-[case $xsi_shell in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result="${1##*/}"
-}
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-  func_basename_result="${1##*/}"
-}
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-func_stripname ()
-{
-  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-  # positional parameters, so assign one to ordinary parameter first.
-  func_stripname_result=${3}
-  func_stripname_result=${func_stripname_result#"${1}"}
-  func_stripname_result=${func_stripname_result%"${2}"}
-}
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=${1%%=*}
-  func_opt_split_arg=${1#*=}
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  case ${1} in
-    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-    *)    func_lo2o_result=${1} ;;
-  esac
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=${1%.*}.lo
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=$(( $[*] ))
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=${#1}
-}
-
-_LT_EOF
-    ;;
-  *) # Bourne compatible functions.
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
-}
-
-dnl func_dirname_and_basename
-dnl A portable version of this function is already defined in general.m4sh
-dnl so there is no need for it here.
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-  case ${2} in
-    .*) func_stripname_result=`$ECHO "X${3}" \
-           | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
-    *)  func_stripname_result=`$ECHO "X${3}" \
-           | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
-  esac
-}
-
-# sed scripts:
-my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q'
-my_sed_long_arg='1s/^-[[^=]]*=//'
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
-  func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'`
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=`expr "$[@]"`
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len`
-}
-
-_LT_EOF
-esac
-
-case $lt_shell_append in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$[1]+=\$[2]"
-}
-_LT_EOF
-    ;;
-  *)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$[1]=\$$[1]\$[2]"
-}
-
-_LT_EOF
-    ;;
-  esac
-])
diff --git a/cloog-0.17.0/m4/ltoptions.m4 b/cloog-0.17.0/m4/ltoptions.m4
deleted file mode 100644
index 34151a3..0000000
--- a/cloog-0.17.0/m4/ltoptions.m4
+++ /dev/null
@@ -1,368 +0,0 @@
-# Helper functions for option handling.                    -*- Autoconf -*-
-#
-#   Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
-#   Written by Gary V. Vaughan, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 6 ltoptions.m4
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
-
-
-# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
-# ------------------------------------------
-m4_define([_LT_MANGLE_OPTION],
-[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
-
-
-# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
-# ---------------------------------------
-# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
-# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
-# saved as a flag.
-m4_define([_LT_SET_OPTION],
-[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
-m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
-        _LT_MANGLE_DEFUN([$1], [$2]),
-    [m4_warning([Unknown $1 option `$2'])])[]dnl
-])
-
-
-# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
-# ------------------------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-m4_define([_LT_IF_OPTION],
-[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
-
-
-# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
-# -------------------------------------------------------
-# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
-# are set.
-m4_define([_LT_UNLESS_OPTIONS],
-[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
-	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
-		      [m4_define([$0_found])])])[]dnl
-m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
-])[]dnl
-])
-
-
-# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
-# ----------------------------------------
-# OPTION-LIST is a space-separated list of Libtool options associated
-# with MACRO-NAME.  If any OPTION has a matching handler declared with
-# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
-# the unknown option and exit.
-m4_defun([_LT_SET_OPTIONS],
-[# Set options
-m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
-    [_LT_SET_OPTION([$1], _LT_Option)])
-
-m4_if([$1],[LT_INIT],[
-  dnl
-  dnl Simply set some default values (i.e off) if boolean options were not
-  dnl specified:
-  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
-  ])
-  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
-  ])
-  dnl
-  dnl If no reference was made to various pairs of opposing options, then
-  dnl we run the default mode handler for the pair.  For example, if neither
-  dnl `shared' nor `disable-shared' was passed, we enable building of shared
-  dnl archives by default:
-  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
-  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
-  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
-  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
-  		   [_LT_ENABLE_FAST_INSTALL])
-  ])
-])# _LT_SET_OPTIONS
-
-
-## --------------------------------- ##
-## Macros to handle LT_INIT options. ##
-## --------------------------------- ##
-
-# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
-# -----------------------------------------
-m4_define([_LT_MANGLE_DEFUN],
-[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
-
-
-# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
-# -----------------------------------------------
-m4_define([LT_OPTION_DEFINE],
-[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
-])# LT_OPTION_DEFINE
-
-
-# dlopen
-# ------
-LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
-])
-
-AU_DEFUN([AC_LIBTOOL_DLOPEN],
-[_LT_SET_OPTION([LT_INIT], [dlopen])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `dlopen' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
-
-
-# win32-dll
-# ---------
-# Declare package support for building win32 dll's.
-LT_OPTION_DEFINE([LT_INIT], [win32-dll],
-[enable_win32_dll=yes
-
-case $host in
-*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*)
-  AC_CHECK_TOOL(AS, as, false)
-  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
-  AC_CHECK_TOOL(OBJDUMP, objdump, false)
-  ;;
-esac
-
-test -z "$AS" && AS=as
-_LT_DECL([], [AS],      [0], [Assembler program])dnl
-
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl
-])# win32-dll
-
-AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-_LT_SET_OPTION([LT_INIT], [win32-dll])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `win32-dll' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
-
-
-# _LT_ENABLE_SHARED([DEFAULT])
-# ----------------------------
-# implement the --enable-shared flag, and supports the `shared' and
-# `disable-shared' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_SHARED],
-[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([shared],
-    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
-	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
-
-    _LT_DECL([build_libtool_libs], [enable_shared], [0],
-	[Whether or not to build shared libraries])
-])# _LT_ENABLE_SHARED
-
-LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
-
-# Old names:
-AC_DEFUN([AC_ENABLE_SHARED],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
-])
-
-AC_DEFUN([AC_DISABLE_SHARED],
-[_LT_SET_OPTION([LT_INIT], [disable-shared])
-])
-
-AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
-AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_ENABLE_SHARED], [])
-dnl AC_DEFUN([AM_DISABLE_SHARED], [])
-
-
-
-# _LT_ENABLE_STATIC([DEFAULT])
-# ----------------------------
-# implement the --enable-static flag, and support the `static' and
-# `disable-static' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_STATIC],
-[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([static],
-    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
-	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
-
-    _LT_DECL([build_old_libs], [enable_static], [0],
-	[Whether or not to build static libraries])
-])# _LT_ENABLE_STATIC
-
-LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
-
-# Old names:
-AC_DEFUN([AC_ENABLE_STATIC],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
-])
-
-AC_DEFUN([AC_DISABLE_STATIC],
-[_LT_SET_OPTION([LT_INIT], [disable-static])
-])
-
-AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
-AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_ENABLE_STATIC], [])
-dnl AC_DEFUN([AM_DISABLE_STATIC], [])
-
-
-
-# _LT_ENABLE_FAST_INSTALL([DEFAULT])
-# ----------------------------------
-# implement the --enable-fast-install flag, and support the `fast-install'
-# and `disable-fast-install' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_FAST_INSTALL],
-[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([fast-install],
-    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
-    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
-
-_LT_DECL([fast_install], [enable_fast_install], [0],
-	 [Whether or not to optimize for fast installation])dnl
-])# _LT_ENABLE_FAST_INSTALL
-
-LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
-
-# Old names:
-AU_DEFUN([AC_ENABLE_FAST_INSTALL],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `fast-install' option into LT_INIT's first parameter.])
-])
-
-AU_DEFUN([AC_DISABLE_FAST_INSTALL],
-[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `disable-fast-install' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
-dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
-
-
-# _LT_WITH_PIC([MODE])
-# --------------------
-# implement the --with-pic flag, and support the `pic-only' and `no-pic'
-# LT_INIT options.
-# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
-m4_define([_LT_WITH_PIC],
-[AC_ARG_WITH([pic],
-    [AS_HELP_STRING([--with-pic],
-	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
-    [pic_mode="$withval"],
-    [pic_mode=default])
-
-test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
-
-_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
-])# _LT_WITH_PIC
-
-LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
-LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
-
-# Old name:
-AU_DEFUN([AC_LIBTOOL_PICMODE],
-[_LT_SET_OPTION([LT_INIT], [pic-only])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `pic-only' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
-
-## ----------------- ##
-## LTDL_INIT Options ##
-## ----------------- ##
-
-m4_define([_LTDL_MODE], [])
-LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
-		 [m4_define([_LTDL_MODE], [nonrecursive])])
-LT_OPTION_DEFINE([LTDL_INIT], [recursive],
-		 [m4_define([_LTDL_MODE], [recursive])])
-LT_OPTION_DEFINE([LTDL_INIT], [subproject],
-		 [m4_define([_LTDL_MODE], [subproject])])
-
-m4_define([_LTDL_TYPE], [])
-LT_OPTION_DEFINE([LTDL_INIT], [installable],
-		 [m4_define([_LTDL_TYPE], [installable])])
-LT_OPTION_DEFINE([LTDL_INIT], [convenience],
-		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/cloog-0.17.0/m4/ltsugar.m4 b/cloog-0.17.0/m4/ltsugar.m4
deleted file mode 100644
index 9000a05..0000000
--- a/cloog-0.17.0/m4/ltsugar.m4
+++ /dev/null
@@ -1,123 +0,0 @@
-# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
-#
-# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
-# Written by Gary V. Vaughan, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 6 ltsugar.m4
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
-
-
-# lt_join(SEP, ARG1, [ARG2...])
-# -----------------------------
-# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
-# associated separator.
-# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
-# versions in m4sugar had bugs.
-m4_define([lt_join],
-[m4_if([$#], [1], [],
-       [$#], [2], [[$2]],
-       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
-m4_define([_lt_join],
-[m4_if([$#$2], [2], [],
-       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
-
-
-# lt_car(LIST)
-# lt_cdr(LIST)
-# ------------
-# Manipulate m4 lists.
-# These macros are necessary as long as will still need to support
-# Autoconf-2.59 which quotes differently.
-m4_define([lt_car], [[$1]])
-m4_define([lt_cdr],
-[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
-       [$#], 1, [],
-       [m4_dquote(m4_shift($@))])])
-m4_define([lt_unquote], $1)
-
-
-# lt_append(MACRO-NAME, STRING, [SEPARATOR])
-# ------------------------------------------
-# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
-# Note that neither SEPARATOR nor STRING are expanded; they are appended
-# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
-# No SEPARATOR is output if MACRO-NAME was previously undefined (different
-# than defined and empty).
-#
-# This macro is needed until we can rely on Autoconf 2.62, since earlier
-# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
-m4_define([lt_append],
-[m4_define([$1],
-	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
-
-
-
-# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
-# ----------------------------------------------------------
-# Produce a SEP delimited list of all paired combinations of elements of
-# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
-# has the form PREFIXmINFIXSUFFIXn.
-# Needed until we can rely on m4_combine added in Autoconf 2.62.
-m4_define([lt_combine],
-[m4_if(m4_eval([$# > 3]), [1],
-       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
-[[m4_foreach([_Lt_prefix], [$2],
-	     [m4_foreach([_Lt_suffix],
-		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
-	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
-
-
-# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
-# -----------------------------------------------------------------------
-# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
-# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
-m4_define([lt_if_append_uniq],
-[m4_ifdef([$1],
-	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
-		 [lt_append([$1], [$2], [$3])$4],
-		 [$5])],
-	  [lt_append([$1], [$2], [$3])$4])])
-
-
-# lt_dict_add(DICT, KEY, VALUE)
-# -----------------------------
-m4_define([lt_dict_add],
-[m4_define([$1($2)], [$3])])
-
-
-# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
-# --------------------------------------------
-m4_define([lt_dict_add_subkey],
-[m4_define([$1($2:$3)], [$4])])
-
-
-# lt_dict_fetch(DICT, KEY, [SUBKEY])
-# ----------------------------------
-m4_define([lt_dict_fetch],
-[m4_ifval([$3],
-	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
-    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
-
-
-# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
-# -----------------------------------------------------------------
-m4_define([lt_if_dict_fetch],
-[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
-	[$5],
-    [$6])])
-
-
-# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
-# --------------------------------------------------------------
-m4_define([lt_dict_filter],
-[m4_if([$5], [], [],
-  [lt_join(m4_quote(m4_default([$4], [[, ]])),
-           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
-		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
-])
diff --git a/cloog-0.17.0/m4/ltversion.m4 b/cloog-0.17.0/m4/ltversion.m4
deleted file mode 100644
index f3c5309..0000000
--- a/cloog-0.17.0/m4/ltversion.m4
+++ /dev/null
@@ -1,23 +0,0 @@
-# ltversion.m4 -- version numbers			-*- Autoconf -*-
-#
-#   Copyright (C) 2004 Free Software Foundation, Inc.
-#   Written by Scott James Remnant, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# Generated from ltversion.in.
-
-# serial 3017 ltversion.m4
-# This file is part of GNU Libtool
-
-m4_define([LT_PACKAGE_VERSION], [2.2.6b])
-m4_define([LT_PACKAGE_REVISION], [1.3017])
-
-AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.2.6b'
-macro_revision='1.3017'
-_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
-_LT_DECL(, macro_revision, 0)
-])
diff --git a/cloog-0.17.0/m4/lt~obsolete.m4 b/cloog-0.17.0/m4/lt~obsolete.m4
deleted file mode 100644
index 637bb20..0000000
--- a/cloog-0.17.0/m4/lt~obsolete.m4
+++ /dev/null
@@ -1,92 +0,0 @@
-# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
-#
-#   Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
-#   Written by Scott James Remnant, 2004.
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 4 lt~obsolete.m4
-
-# These exist entirely to fool aclocal when bootstrapping libtool.
-#
-# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
-# which have later been changed to m4_define as they aren't part of the
-# exported API, or moved to Autoconf or Automake where they belong.
-#
-# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
-# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
-# using a macro with the same name in our local m4/libtool.m4 it'll
-# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
-# and doesn't know about Autoconf macros at all.)
-#
-# So we provide this file, which has a silly filename so it's always
-# included after everything else.  This provides aclocal with the
-# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
-# because those macros already exist, or will be overwritten later.
-# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
-#
-# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
-# Yes, that means every name once taken will need to remain here until
-# we give up compatibility with versions before 1.7, at which point
-# we need to keep only those names which we still refer to.
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
-
-m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
-m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
-m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
-m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
-m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
-m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
-m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
-m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
-m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
-m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
-m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
-m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
-m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
-m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
-m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
-m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
-m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
-m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
-m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
-m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
-m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
-m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
-m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
-m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
-m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
-m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
-m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
-m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
-m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
-m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
-m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
-m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
-m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
-m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
-m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
-m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
-m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
-m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
-m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
-m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
-m4_ifndef([AC_LIBTOOL_RC],		[AC_DEFUN([AC_LIBTOOL_RC])])
-m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
-m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
-m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
-m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
-m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
-m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
-m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
-m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
diff --git a/cloog-0.17.0/osl/AUTHORS b/cloog-0.17.0/osl/AUTHORS
deleted file mode 100644
index 863a338..0000000
--- a/cloog-0.17.0/osl/AUTHORS
+++ /dev/null
@@ -1,12 +0,0 @@
-* * * * * * * * * * * * * *
-* OpenScop Library  0.5.0 * 
-* * * * * * * * * * * * * *
-
-Version 0.5.0
-
-Current maintainer: 
-* Cedric Bastoul <cedric.bastoul@u-psud.fr>
-
-Authors of the OpenScop Library: 
-* Cedric Bastoul <cedric.bastoul@u-psud.fr>
-* Louis-Noel Pouchet <pouchet@cse.ohio-state.edu>
diff --git a/cloog-0.17.0/osl/ChangeLog b/cloog-0.17.0/osl/ChangeLog
deleted file mode 100644
index b2fa4f1..0000000
--- a/cloog-0.17.0/osl/ChangeLog
+++ /dev/null
@@ -1,107 +0,0 @@
-2010-03-08  Louis-Noel Pouchet  <pouchet@cse.ohio-state.edu>
-
-	* configure.in: Bump to ScopLib 0.2.0.
-	* README: Update with build information.
-
-2010-02-05  Louis-Noel Pouchet  <pouchet@cse.ohio-state.edu>
-
-	* include/scoplib/matrix.h,
-	* source/matrix.c: Add function scoplib_matrix_equal.
-
-2010-01-26  Louis-Noel Pouchet  <louis-noel.pouchet@inria.fr>
-
-	* include/macros.h: Add SCOPVAL_multo macro.
-
-2009-09-21  Louis-Noel Pouchet  <louis-noel.pouchet@inria.fr>
-
-	* source/vector.c,
-	* source/matrix.c,
-	* source/scop.c,
-	* source/statement.c,
-	* source/Makefile.am,
-	* include/Makefile.am,
-	* include/scoplib/scop.h.in,
-	* include/scoplib/vector.h,
-	* include/scoplib/macros.h,
-	* include/scoplib/matrix.h,
-	* include/scoplib/statement.h,
-	* COPYING.LESSER,
-	* configure.in,
-	* Makefile.am,
-	* README: Downgrade license from LGPL3+ to LGPL2.1+, to be
-	compatible with CLooG's license.
-
-2009-06-24  Louis-Noel Pouchet  <louis-noel.pouchet@inria.fr>
-
-	* source/scop.c,
-	* source/statement.c,
-	* include/scoplib/statement.h: Add support for control and exit
-	predicates as statement attributes. Needed for non-static control
-	code support.
-
-2009-05-02  Louis-Noel Pouchet  <louis-noel.pouchet@inria.fr>
-
-	* source/matrix.c,
-	* include/scoplib/macros.h,
-	* include/scoplib/matrix.h,
-	* configure.in: Fix a few minor problems.
-
-2009-05-02  Louis-Noel Pouchet  <louis-noel.pouchet@inria.fr>
-	This is the initial checkin of ScopLib, a fork of Clan which
-	contains only the functions related to the .scop format, and the
-	main scop/statement/matrix/vector functions.
-
-	clan_*_p types have been renamed scoplib_*_p, similarely for
-	function calls.
-
-	* AUTHORS,
-	* autoconf,
-	* autogen.sh,
-	* configure.in,
-	* COPYING.LESSER,
-	* doc,
-	* doc/ascii-art.txt,
-	* doc/clan.texi,
-	* doc/Doxyfile.in,
-	* doc/images,
-	* doc/images/basic.eps,
-	* doc/images/basic.fig,
-	* doc/images/basic.jpg,
-	* doc/images/basic.pdf,
-	* doc/images/basic.txt,
-	* doc/images/basic1.eps,
-	* doc/images/basic1.fig,
-	* doc/images/basic1.jpg,
-	* doc/images/basic1.pdf,
-	* doc/images/basic1.txt,
-	* doc/images/basic2.eps,
-	* doc/images/basic2.fig,
-	* doc/images/basic2.jpg,
-	* doc/images/basic2.pdf,
-	* doc/images/basic2.txt,
-	* doc/images/tree.eps,
-	* doc/images/tree.fig,
-	* doc/images/tree.jpg,
-	* doc/images/tree.pdf,
-	* doc/images/tree.txt,
-	* doc/Makefile.am,
-	* doc/S4.cloog,
-	* include,
-	* include/Makefile.am,
-	* include/scoplib,
-	* include/scoplib/macros.h,
-	* include/scoplib/matrix.h,
-	* include/scoplib/scop.h.in,
-	* include/scoplib/statement.h,
-	* include/scoplib/vector.h,
-	* Makefile.am,
-	* NEWS,
-	* README,
-	* source,
-	* source/Makefile.am,
-	* source/matrix.c,
-	* source/scop.c,
-	* source/statement.c,
-	* source/vector.c,
-	* THANKS: Initial checkin of the project.
-
diff --git a/cloog-0.17.0/osl/Makefile.am b/cloog-0.17.0/osl/Makefile.am
deleted file mode 100644
index 5a7b87f..0000000
--- a/cloog-0.17.0/osl/Makefile.am
+++ /dev/null
@@ -1,92 +0,0 @@
-#
-#   /*+------------------------------------------------------------------**
-#    **                       OpenScop Library                           **
-#    **------------------------------------------------------------------**
-#    **                         makefile.am                              **
-#    **------------------------------------------------------------------**
-#    **                   First version: 30/04/2008                      **
-#    **------------------------------------------------------------------**
-#
-#   
-# ***************************************************************************
-# * OpenScop: Structures and formats for polyhedral tools to talk together  *
-# ***************************************************************************
-# *   ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,               *
-# *   /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,            *
-# *  /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\            *
-# * |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \           *
-# * | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\          *
-# * | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\         *
-# * | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \        *
-# * | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \       *
-# * | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \      *
-# * | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \     *
-# * | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \    *
-# * | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \   *
-# * | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \  *
-# * | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /  *
-# * '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'   *
-# *                                                                         *
-# * Copyright (C) 2008 University Paris-Sud 11 and INRIA                    *
-# *                                                                         *
-# * (3-clause BSD license)                                                  *
-# * Redistribution and use in source  and binary forms, with or without     *
-# * modification, are permitted provided that the following conditions      *
-# * are met:                                                                *
-# *                                                                         *
-# * 1. Redistributions of source code must retain the above copyright       *
-# *    notice, this list of conditions and the following disclaimer.        *
-# * 2. Redistributions in binary form must reproduce the above copyright    *
-# *    notice, this list of conditions and the following disclaimer in the  *
-# *    documentation and/or other materials provided with the distribution. *
-# * 3. The name of the author may not be used to endorse or promote         *
-# *    products derived from this software without specific prior written   *
-# *    permission.                                                          *
-# *                                                                         *
-# * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR    *
-# * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED          *
-# * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  *
-# * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,      *
-# * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES      *
-# * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR      *
-# * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)      *
-# * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,     *
-# * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING   *
-# * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE      *
-# * POSSIBILITY OF SUCH DAMAGE.                                             *
-# *                                                                         *
-# * OpenScop Library, a library to manipulate OpenScop formats and data     *
-# * structures. Written by:                                                 *
-# * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                       *
-# * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                        *
-# *                                                                         *
-# ***************************************************************************/
-#
-# Makefile.am (or makefile if generated) of the OpenScop Library.
-# Makefile.am is not a makefile, you must run the 'autogen.sh' THEN the
-# configure shellscript to generate the Makefile thanks to this file.
-
-
-#############################################################################
-SUBDIRS 		= doc source include tests
-
-
-#############################################################################
-ACLOCAL_AMFLAGS		= -I autoconf
-
-m4datadir		= $(datadir)/aclocal
-
-
-MAINTAINERCLEANFILES 	=			\
-	autoconf/texinfo.tex			\
-	Makefile.in				\
-	aclocal.m4				\
-	configure				\
-	source/stamp-h.in			\
-	$(AUX_DIST)
-
-
-#############################################################################
-ctags:
-	ctags -R --c++-kinds=+p --fields=+iaS --extra=+q -f$(HOME)/.ctags .
-#############################################################################
diff --git a/cloog-0.17.0/osl/Makefile.in b/cloog-0.17.0/osl/Makefile.in
deleted file mode 100644
index c422be3..0000000
--- a/cloog-0.17.0/osl/Makefile.in
+++ /dev/null
@@ -1,793 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-#
-#   /*+------------------------------------------------------------------**
-#    **                       OpenScop Library                           **
-#    **------------------------------------------------------------------**
-#    **                         makefile.am                              **
-#    **------------------------------------------------------------------**
-#    **                   First version: 30/04/2008                      **
-#    **------------------------------------------------------------------**
-#
-#   
-# ***************************************************************************
-# * OpenScop: Structures and formats for polyhedral tools to talk together  *
-# ***************************************************************************
-# *   ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,               *
-# *   /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,            *
-# *  /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\            *
-# * |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \           *
-# * | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\          *
-# * | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\         *
-# * | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \        *
-# * | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \       *
-# * | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \      *
-# * | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \     *
-# * | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \    *
-# * | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \   *
-# * | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \  *
-# * | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /  *
-# * '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'   *
-# *                                                                         *
-# * Copyright (C) 2008 University Paris-Sud 11 and INRIA                    *
-# *                                                                         *
-# * (3-clause BSD license)                                                  *
-# * Redistribution and use in source  and binary forms, with or without     *
-# * modification, are permitted provided that the following conditions      *
-# * are met:                                                                *
-# *                                                                         *
-# * 1. Redistributions of source code must retain the above copyright       *
-# *    notice, this list of conditions and the following disclaimer.        *
-# * 2. Redistributions in binary form must reproduce the above copyright    *
-# *    notice, this list of conditions and the following disclaimer in the  *
-# *    documentation and/or other materials provided with the distribution. *
-# * 3. The name of the author may not be used to endorse or promote         *
-# *    products derived from this software without specific prior written   *
-# *    permission.                                                          *
-# *                                                                         *
-# * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR    *
-# * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED          *
-# * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  *
-# * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,      *
-# * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES      *
-# * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR      *
-# * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)      *
-# * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,     *
-# * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING   *
-# * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE      *
-# * POSSIBILITY OF SUCH DAMAGE.                                             *
-# *                                                                         *
-# * OpenScop Library, a library to manipulate OpenScop formats and data     *
-# * structures. Written by:                                                 *
-# * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                       *
-# * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                        *
-# *                                                                         *
-# ***************************************************************************/
-#
-# Makefile.am (or makefile if generated) of the OpenScop Library.
-# Makefile.am is not a makefile, you must run the 'autogen.sh' THEN the
-# configure shellscript to generate the Makefile thanks to this file.
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = .
-DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in $(top_srcdir)/configure \
-	$(top_srcdir)/include/osl/scop.h.in AUTHORS ChangeLog NEWS \
-	THANKS autoconf/config.guess autoconf/config.sub \
-	autoconf/depcomp autoconf/install-sh autoconf/ltmain.sh \
-	autoconf/missing autoconf/texinfo.tex
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/autoconf/libtool.m4 \
-	$(top_srcdir)/autoconf/ltoptions.m4 \
-	$(top_srcdir)/autoconf/ltsugar.m4 \
-	$(top_srcdir)/autoconf/ltversion.m4 \
-	$(top_srcdir)/autoconf/lt~obsolete.m4 \
-	$(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno config.status.lineno
-mkinstalldirs = $(install_sh) -d
-CONFIG_CLEAN_FILES = include/osl/scop.h
-CONFIG_CLEAN_VPATH_FILES =
-SOURCES =
-DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-dvi-recursive install-exec-recursive \
-	install-html-recursive install-info-recursive \
-	install-pdf-recursive install-ps-recursive install-recursive \
-	installcheck-recursive installdirs-recursive pdf-recursive \
-	ps-recursive uninstall-recursive
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
-  distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
-	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
-	distdir dist dist-all distcheck
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-distdir = $(PACKAGE)-$(VERSION)
-top_distdir = $(distdir)
-am__remove_distdir = \
-  { test ! -d "$(distdir)" \
-    || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
-         && rm -fr "$(distdir)"; }; }
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2
-GZIP_ENV = --best
-distuninstallcheck_listfiles = find . -type f -print
-distcleancheck_listfiles = find . -type f -print
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CD = @CD@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DOXYGEN = @DOXYGEN@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_aux_dir = @ac_aux_dir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-
-#############################################################################
-SUBDIRS = doc source include tests
-
-#############################################################################
-ACLOCAL_AMFLAGS = -I autoconf
-m4datadir = $(datadir)/aclocal
-MAINTAINERCLEANFILES = \
-	autoconf/texinfo.tex			\
-	Makefile.in				\
-	aclocal.m4				\
-	configure				\
-	source/stamp-h.in			\
-	$(AUX_DIST)
-
-all: all-recursive
-
-.SUFFIXES:
-am--refresh:
-	@:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
-	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    echo ' $(SHELL) ./config.status'; \
-	    $(SHELL) ./config.status;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	$(SHELL) ./config.status --recheck
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	$(am__cd) $(srcdir) && $(AUTOCONF)
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
-$(am__aclocal_m4_deps):
-include/osl/scop.h: $(top_builddir)/config.status $(top_srcdir)/include/osl/scop.h.in
-	cd $(top_builddir) && $(SHELL) ./config.status $@
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool config.lt
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	$(am__remove_distdir)
-	test -d "$(distdir)" || mkdir "$(distdir)"
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test -d "$(distdir)/$$subdir" \
-	    || $(MKDIR_P) "$(distdir)/$$subdir" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-	    $(am__relativize); \
-	    new_distdir=$$reldir; \
-	    dir1=$$subdir; dir2="$(top_distdir)"; \
-	    $(am__relativize); \
-	    new_top_distdir=$$reldir; \
-	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-	    ($(am__cd) $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$new_top_distdir" \
-	        distdir="$$new_distdir" \
-		am__remove_distdir=: \
-		am__skip_length_check=: \
-		am__skip_mode_fix=: \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-	-test -n "$(am__skip_mode_fix)" \
-	|| find "$(distdir)" -type d ! -perm -755 \
-		-exec chmod u+rwx,go+rx {} \; -o \
-	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
-	|| chmod -R a+r "$(distdir)"
-dist-gzip: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__remove_distdir)
-dist-bzip2: distdir
-	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
-	$(am__remove_distdir)
-
-dist-lzma: distdir
-	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
-	$(am__remove_distdir)
-
-dist-xz: distdir
-	tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
-	$(am__remove_distdir)
-
-dist-tarZ: distdir
-	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
-	$(am__remove_distdir)
-
-dist-shar: distdir
-	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
-	$(am__remove_distdir)
-
-dist-zip: distdir
-	-rm -f $(distdir).zip
-	zip -rq $(distdir).zip $(distdir)
-	$(am__remove_distdir)
-
-dist dist-all: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
-	$(am__remove_distdir)
-
-# This target untars the dist file and tries a VPATH configuration.  Then
-# it guarantees that the distribution is self-contained by making another
-# tarfile.
-distcheck: dist
-	case '$(DIST_ARCHIVES)' in \
-	*.tar.gz*) \
-	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
-	*.tar.bz2*) \
-	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
-	*.tar.lzma*) \
-	  lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
-	*.tar.xz*) \
-	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
-	*.tar.Z*) \
-	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
-	*.shar.gz*) \
-	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
-	*.zip*) \
-	  unzip $(distdir).zip ;;\
-	esac
-	chmod -R a-w $(distdir); chmod a+w $(distdir)
-	mkdir $(distdir)/_build
-	mkdir $(distdir)/_inst
-	chmod a-w $(distdir)
-	test -d $(distdir)/_build || exit 0; \
-	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
-	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
-	  && am__cwd=`pwd` \
-	  && $(am__cd) $(distdir)/_build \
-	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
-	    $(DISTCHECK_CONFIGURE_FLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
-	  && $(MAKE) $(AM_MAKEFLAGS) check \
-	  && $(MAKE) $(AM_MAKEFLAGS) install \
-	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
-	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
-	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
-	        distuninstallcheck \
-	  && chmod -R a-w "$$dc_install_base" \
-	  && ({ \
-	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
-	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
-	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
-	  && rm -rf "$$dc_destdir" \
-	  && $(MAKE) $(AM_MAKEFLAGS) dist \
-	  && rm -rf $(DIST_ARCHIVES) \
-	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
-	  && cd "$$am__cwd" \
-	  || exit 1
-	$(am__remove_distdir)
-	@(echo "$(distdir) archives ready for distribution: "; \
-	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
-	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
-distuninstallcheck:
-	@$(am__cd) '$(distuninstallcheck_dir)' \
-	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
-	   || { echo "ERROR: files left after uninstall:" ; \
-	        if test -n "$(DESTDIR)"; then \
-	          echo "  (check DESTDIR support)"; \
-	        fi ; \
-	        $(distuninstallcheck_listfiles) ; \
-	        exit 1; } >&2
-distcleancheck: distclean
-	@if test '$(srcdir)' = . ; then \
-	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
-	  exit 1 ; \
-	fi
-	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
-	  || { echo "ERROR: files left in build directory after distclean:" ; \
-	       $(distcleancheck_listfiles) ; \
-	       exit 1; } >&2
-check-am: all-am
-check: check-recursive
-all-am: Makefile
-installdirs: installdirs-recursive
-installdirs-am:
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-libtool \
-	distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf $(top_srcdir)/autom4te.cache
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
-	install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-	all all-am am--refresh check check-am clean clean-generic \
-	clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \
-	dist-gzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \
-	distcheck distclean distclean-generic distclean-libtool \
-	distclean-tags distcleancheck distdir distuninstallcheck dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-man install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs installdirs-am \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags tags-recursive uninstall uninstall-am
-
-
-#############################################################################
-ctags:
-	ctags -R --c++-kinds=+p --fields=+iaS --extra=+q -f$(HOME)/.ctags .
-#############################################################################
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/cloog-0.17.0/osl/NEWS b/cloog-0.17.0/osl/NEWS
deleted file mode 100644
index 75daa9c..0000000
--- a/cloog-0.17.0/osl/NEWS
+++ /dev/null
@@ -1,2 +0,0 @@
-Some news...
-
diff --git a/cloog-0.17.0/osl/README b/cloog-0.17.0/osl/README
deleted file mode 100644
index c1a58d0..0000000
--- a/cloog-0.17.0/osl/README
+++ /dev/null
@@ -1,18 +0,0 @@
-* * * * * * * * * * * * * *
-* OpenScop Library  0.5.0 *
-* * * * * * * * * * * * * *
-
-Install
--------
-
-$> ./autogen.sh
-$> ./configure
-$> make 
-$> make install
-
-Support
--------
-
-Please contact:
-openscop-development@googlegroups.com
-
diff --git a/cloog-0.17.0/osl/THANKS b/cloog-0.17.0/osl/THANKS
deleted file mode 100644
index d12c4ad..0000000
--- a/cloog-0.17.0/osl/THANKS
+++ /dev/null
@@ -1,12 +0,0 @@
-THANKS
-======
-
-The authors would like to gratefully thank the people that have
-been involved in the (lively) discussions for the definition of
-the OpenScop formats and data structures, in particular:
-
-Uday Bondhugula
-Albert Cohen
-Tobias Grosser
-Sebastian Pop
-Sven Verdoolaege
diff --git a/cloog-0.17.0/osl/aclocal.m4 b/cloog-0.17.0/osl/aclocal.m4
deleted file mode 100644
index 4cc55dc..0000000
--- a/cloog-0.17.0/osl/aclocal.m4
+++ /dev/null
@@ -1,973 +0,0 @@
-# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-m4_ifndef([AC_AUTOCONF_VERSION],
-  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.67],,
-[m4_warning([this file was generated for autoconf 2.67.
-You have another version of autoconf.  It may work, but is not guaranteed to.
-If you have problems, you may need to regenerate the build system entirely.
-To do so, use the procedure documented by the package, typically `autoreconf'.])])
-
-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_AUTOMAKE_VERSION(VERSION)
-# ----------------------------
-# Automake X.Y traces this macro to ensure aclocal.m4 has been
-# generated from the m4 files accompanying Automake X.Y.
-# (This private macro should not be called outside this file.)
-AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.11'
-dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
-dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.11.1], [],
-      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
-])
-
-# _AM_AUTOCONF_VERSION(VERSION)
-# -----------------------------
-# aclocal traces this macro to find the Autoconf version.
-# This is a private macro too.  Using m4_define simplifies
-# the logic in aclocal, which can simply ignore this definition.
-m4_define([_AM_AUTOCONF_VERSION], [])
-
-# AM_SET_CURRENT_AUTOMAKE_VERSION
-# -------------------------------
-# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
-# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
-AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.1])dnl
-m4_ifndef([AC_AUTOCONF_VERSION],
-  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
-
-# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
-# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
-#
-# Of course, Automake must honor this variable whenever it calls a
-# tool from the auxiliary directory.  The problem is that $srcdir (and
-# therefore $ac_aux_dir as well) can be either absolute or relative,
-# depending on how configure is run.  This is pretty annoying, since
-# it makes $ac_aux_dir quite unusable in subdirectories: in the top
-# source directory, any form will work fine, but in subdirectories a
-# relative path needs to be adjusted first.
-#
-# $ac_aux_dir/missing
-#    fails when called from a subdirectory if $ac_aux_dir is relative
-# $top_srcdir/$ac_aux_dir/missing
-#    fails if $ac_aux_dir is absolute,
-#    fails when called from a subdirectory in a VPATH build with
-#          a relative $ac_aux_dir
-#
-# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
-# are both prefixed by $srcdir.  In an in-source build this is usually
-# harmless because $srcdir is `.', but things will broke when you
-# start a VPATH build or use an absolute $srcdir.
-#
-# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
-# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
-#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
-# and then we would define $MISSING as
-#   MISSING="\${SHELL} $am_aux_dir/missing"
-# This will work as long as MISSING is not called from configure, because
-# unfortunately $(top_srcdir) has no meaning in configure.
-# However there are other variables, like CC, which are often used in
-# configure, and could therefore not use this "fixed" $ac_aux_dir.
-#
-# Another solution, used here, is to always expand $ac_aux_dir to an
-# absolute PATH.  The drawback is that using absolute paths prevent a
-# configured tree to be moved without reconfiguration.
-
-AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-])
-
-# AM_CONDITIONAL                                            -*- Autoconf -*-
-
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 9
-
-# AM_CONDITIONAL(NAME, SHELL-CONDITION)
-# -------------------------------------
-# Define a conditional.
-AC_DEFUN([AM_CONDITIONAL],
-[AC_PREREQ(2.52)dnl
- ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
-	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
-AC_SUBST([$1_TRUE])dnl
-AC_SUBST([$1_FALSE])dnl
-_AM_SUBST_NOTMAKE([$1_TRUE])dnl
-_AM_SUBST_NOTMAKE([$1_FALSE])dnl
-m4_define([_AM_COND_VALUE_$1], [$2])dnl
-if $2; then
-  $1_TRUE=
-  $1_FALSE='#'
-else
-  $1_TRUE='#'
-  $1_FALSE=
-fi
-AC_CONFIG_COMMANDS_PRE(
-[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
-  AC_MSG_ERROR([[conditional "$1" was never defined.
-Usually this means the macro was only invoked conditionally.]])
-fi])])
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 10
-
-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
-# written in clear, in which case automake, when reading aclocal.m4,
-# will think it sees a *use*, and therefore will trigger all it's
-# C support machinery.  Also note that it means that autoscan, seeing
-# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
-
-
-# _AM_DEPENDENCIES(NAME)
-# ----------------------
-# See how the compiler implements dependency checking.
-# NAME is "CC", "CXX", "GCJ", or "OBJC".
-# We try a few techniques and use that to set a single cache variable.
-#
-# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
-# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
-# dependency, and given that the user is not expected to run this macro,
-# just rely on AC_PROG_CC.
-AC_DEFUN([_AM_DEPENDENCIES],
-[AC_REQUIRE([AM_SET_DEPDIR])dnl
-AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
-AC_REQUIRE([AM_MAKE_INCLUDE])dnl
-AC_REQUIRE([AM_DEP_TRACK])dnl
-
-ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
-       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
-       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
-       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
-       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
-                   [depcc="$$1"   am_compiler_list=])
-
-AC_CACHE_CHECK([dependency style of $depcc],
-               [am_cv_$1_dependencies_compiler_type],
-[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_$1_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
-  fi
-  am__universal=false
-  m4_case([$1], [CC],
-    [case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac],
-    [CXX],
-    [case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac])
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_$1_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_$1_dependencies_compiler_type=none
-fi
-])
-AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
-AM_CONDITIONAL([am__fastdep$1], [
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
-])
-
-
-# AM_SET_DEPDIR
-# -------------
-# Choose a directory name for dependency files.
-# This macro is AC_REQUIREd in _AM_DEPENDENCIES
-AC_DEFUN([AM_SET_DEPDIR],
-[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
-])
-
-
-# AM_DEP_TRACK
-# ------------
-AC_DEFUN([AM_DEP_TRACK],
-[AC_ARG_ENABLE(dependency-tracking,
-[  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors])
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-fi
-AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
-AC_SUBST([AMDEPBACKSLASH])dnl
-_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
-])
-
-# Generate code to set up dependency tracking.              -*- Autoconf -*-
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-#serial 5
-
-# _AM_OUTPUT_DEPENDENCY_COMMANDS
-# ------------------------------
-AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
-[{
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
-  # are listed without --file.  Let's play safe and only enable the eval
-  # if we detect the quoting.
-  case $CONFIG_FILES in
-  *\'*) eval set x "$CONFIG_FILES" ;;
-  *)   set x $CONFIG_FILES ;;
-  esac
-  shift
-  for mf
-  do
-    # Strip MF so we end up with the name of the file.
-    mf=`echo "$mf" | sed -e 's/:.*$//'`
-    # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
-    # some people rename them; so instead we look at the file content.
-    # Grep'ing the first line is not enough: some people post-process
-    # each Makefile.in and add a new line on top of each file to say so.
-    # Grep'ing the whole file is not good either: AIX grep has a line
-    # limit of 2048, but all sed's we know have understand at least 4000.
-    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-      dirpart=`AS_DIRNAME("$mf")`
-    else
-      continue
-    fi
-    # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
-    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-    test -z "$DEPDIR" && continue
-    am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
-    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
-    # Find all dependency output files, they are included files with
-    # $(DEPDIR) in their names.  We invoke sed twice because it is the
-    # simplest approach to changing $(DEPDIR) to its actual value in the
-    # expansion.
-    for file in `sed -n "
-      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-      # Make sure the directory exists.
-      test -f "$dirpart/$file" && continue
-      fdir=`AS_DIRNAME(["$file"])`
-      AS_MKDIR_P([$dirpart/$fdir])
-      # echo "creating $dirpart/$file"
-      echo '# dummy' > "$dirpart/$file"
-    done
-  done
-}
-])# _AM_OUTPUT_DEPENDENCY_COMMANDS
-
-
-# AM_OUTPUT_DEPENDENCY_COMMANDS
-# -----------------------------
-# This macro should only be invoked once -- use via AC_REQUIRE.
-#
-# This code is only required when automatic dependency tracking
-# is enabled.  FIXME.  This creates each `.P' file that we will
-# need in order to bootstrap the dependency handling code.
-AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
-[AC_CONFIG_COMMANDS([depfiles],
-     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
-     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
-])
-
-# Do all the work for Automake.                             -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 16
-
-# This macro actually does too much.  Some checks are only needed if
-# your package does certain things.  But this isn't really a big deal.
-
-# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
-# AM_INIT_AUTOMAKE([OPTIONS])
-# -----------------------------------------------
-# The call with PACKAGE and VERSION arguments is the old style
-# call (pre autoconf-2.50), which is being phased out.  PACKAGE
-# and VERSION should now be passed to AC_INIT and removed from
-# the call to AM_INIT_AUTOMAKE.
-# We support both call styles for the transition.  After
-# the next Automake release, Autoconf can make the AC_INIT
-# arguments mandatory, and then we can depend on a new Autoconf
-# release and drop the old call support.
-AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.62])dnl
-dnl Autoconf wants to disallow AM_ names.  We explicitly allow
-dnl the ones we care about.
-m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
-AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
-AC_REQUIRE([AC_PROG_INSTALL])dnl
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-AC_SUBST([CYGPATH_W])
-
-# Define the identity of the package.
-dnl Distinguish between old-style and new-style calls.
-m4_ifval([$2],
-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
- AC_SUBST([PACKAGE], [$1])dnl
- AC_SUBST([VERSION], [$2])],
-[_AM_SET_OPTIONS([$1])dnl
-dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
-m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
-  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
-
-_AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
-
-# Some tools Automake needs.
-AC_REQUIRE([AM_SANITY_CHECK])dnl
-AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
-AM_MISSING_PROG(AUTOCONF, autoconf)
-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
-AM_MISSING_PROG(AUTOHEADER, autoheader)
-AM_MISSING_PROG(MAKEINFO, makeinfo)
-AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
-AC_REQUIRE([AM_PROG_MKDIR_P])dnl
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([AC_PROG_MAKE_SET])dnl
-AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
-	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
-			     [_AM_PROG_TAR([v7])])])
-_AM_IF_OPTION([no-dependencies],,
-[AC_PROVIDE_IFELSE([AC_PROG_CC],
-		  [_AM_DEPENDENCIES(CC)],
-		  [define([AC_PROG_CC],
-			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_CXX],
-		  [_AM_DEPENDENCIES(CXX)],
-		  [define([AC_PROG_CXX],
-			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_OBJC],
-		  [_AM_DEPENDENCIES(OBJC)],
-		  [define([AC_PROG_OBJC],
-			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
-])
-_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
-dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
-dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
-dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
-AC_CONFIG_COMMANDS_PRE(dnl
-[m4_provide_if([_AM_COMPILER_EXEEXT],
-  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
-])
-
-dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
-dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
-dnl mangled by Autoconf and run in a shell conditional statement.
-m4_define([_AC_COMPILER_EXEEXT],
-m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
-
-
-# When config.status generates a header, we must update the stamp-h file.
-# This file resides in the same directory as the config header
-# that is generated.  The stamp files are numbered to have different names.
-
-# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
-# loop where config.status creates the headers, so we can generate
-# our stamp files there.
-AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
-[# Compute $1's index in $config_headers.
-_am_arg=$1
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $_am_arg | $_am_arg:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
-
-# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_INSTALL_SH
-# ------------------
-# Define $install_sh.
-AC_DEFUN([AM_PROG_INSTALL_SH],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-if test x"${install_sh}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
-  *)
-    install_sh="\${SHELL} $am_aux_dir/install-sh"
-  esac
-fi
-AC_SUBST(install_sh)])
-
-# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# Check whether the underlying file-system supports filenames
-# with a leading dot.  For instance MS-DOS doesn't.
-AC_DEFUN([AM_SET_LEADING_DOT],
-[rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
-else
-  am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-AC_SUBST([am__leading_dot])])
-
-# Check to see how 'make' treats includes.	            -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 4
-
-# AM_MAKE_INCLUDE()
-# -----------------
-# Check to see how make treats includes.
-AC_DEFUN([AM_MAKE_INCLUDE],
-[am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-	@echo this is the am__doit target
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-AC_MSG_CHECKING([for style of include used by $am_make])
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
-  am__include=include
-  am__quote=
-  _am_result=GNU
-  ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   case `$am_make -s -f confmf 2> /dev/null` in #(
-   *the\ am__doit\ target*)
-     am__include=.include
-     am__quote="\""
-     _am_result=BSD
-     ;;
-   esac
-fi
-AC_SUBST([am__include])
-AC_SUBST([am__quote])
-AC_MSG_RESULT([$_am_result])
-rm -f confinc confmf
-])
-
-# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
-
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 6
-
-# AM_MISSING_PROG(NAME, PROGRAM)
-# ------------------------------
-AC_DEFUN([AM_MISSING_PROG],
-[AC_REQUIRE([AM_MISSING_HAS_RUN])
-$1=${$1-"${am_missing_run}$2"}
-AC_SUBST($1)])
-
-
-# AM_MISSING_HAS_RUN
-# ------------------
-# Define MISSING if not defined so far and test if it supports --run.
-# If it does, set am_missing_run to use it, otherwise, to nothing.
-AC_DEFUN([AM_MISSING_HAS_RUN],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([missing])dnl
-if test x"${MISSING+set}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
-  *)
-    MISSING="\${SHELL} $am_aux_dir/missing" ;;
-  esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  AC_MSG_WARN([`missing' script is too old or missing])
-fi
-])
-
-# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_MKDIR_P
-# ---------------
-# Check for `mkdir -p'.
-AC_DEFUN([AM_PROG_MKDIR_P],
-[AC_PREREQ([2.60])dnl
-AC_REQUIRE([AC_PROG_MKDIR_P])dnl
-dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
-dnl while keeping a definition of mkdir_p for backward compatibility.
-dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
-dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
-dnl Makefile.ins that do not define MKDIR_P, so we do our own
-dnl adjustment using top_builddir (which is defined more often than
-dnl MKDIR_P).
-AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
-case $mkdir_p in
-  [[\\/$]]* | ?:[[\\/]]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-])
-
-# Helper functions for option handling.                     -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 4
-
-# _AM_MANGLE_OPTION(NAME)
-# -----------------------
-AC_DEFUN([_AM_MANGLE_OPTION],
-[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
-
-# _AM_SET_OPTION(NAME)
-# ------------------------------
-# Set option NAME.  Presently that only means defining a flag for this option.
-AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
-
-# _AM_SET_OPTIONS(OPTIONS)
-# ----------------------------------
-# OPTIONS is a space-separated list of Automake options.
-AC_DEFUN([_AM_SET_OPTIONS],
-[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
-
-# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
-# -------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-AC_DEFUN([_AM_IF_OPTION],
-[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_RUN_LOG(COMMAND)
-# -------------------
-# Run COMMAND, save the exit status in ac_status, and log it.
-# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
-AC_DEFUN([AM_RUN_LOG],
-[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
-   ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
-   ac_status=$?
-   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   (exit $ac_status); }])
-
-# Check to make sure that the build environment is sane.    -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# AM_SANITY_CHECK
-# ---------------
-AC_DEFUN([AM_SANITY_CHECK],
-[AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name.  Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
-  *[[\\\"\#\$\&\'\`$am_lf]]*)
-    AC_MSG_ERROR([unsafe absolute working directory name]);;
-esac
-case $srcdir in
-  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
-    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$[*]" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$[*]" != "X $srcdir/configure conftest.file" \
-      && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
-alias in your environment])
-   fi
-
-   test "$[2]" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   AC_MSG_ERROR([newly created file is older than distributed files!
-Check your system clock])
-fi
-AC_MSG_RESULT(yes)])
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_INSTALL_STRIP
-# ---------------------
-# One issue with vendor `install' (even GNU) is that you can't
-# specify the program used to strip binaries.  This is especially
-# annoying in cross-compiling environments, where the build's strip
-# is unlikely to handle the host's binaries.
-# Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in `make install-strip', and initialize
-# STRIPPROG with the value of the STRIP variable (set by the user).
-AC_DEFUN([AM_PROG_INSTALL_STRIP],
-[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
-if test "$cross_compiling" != no; then
-  AC_CHECK_TOOL([STRIP], [strip], :)
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-AC_SUBST([INSTALL_STRIP_PROGRAM])])
-
-# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# _AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
-# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
-# This macro is traced by Automake.
-AC_DEFUN([_AM_SUBST_NOTMAKE])
-
-# AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
-# Public sister of _AM_SUBST_NOTMAKE.
-AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
-
-# Check how to create a tarball.                            -*- Autoconf -*-
-
-# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# _AM_PROG_TAR(FORMAT)
-# --------------------
-# Check how to create a tarball in format FORMAT.
-# FORMAT should be one of `v7', `ustar', or `pax'.
-#
-# Substitute a variable $(am__tar) that is a command
-# writing to stdout a FORMAT-tarball containing the directory
-# $tardir.
-#     tardir=directory && $(am__tar) > result.tar
-#
-# Substitute a variable $(am__untar) that extract such
-# a tarball read from stdin.
-#     $(am__untar) < result.tar
-AC_DEFUN([_AM_PROG_TAR],
-[# Always define AMTAR for backward compatibility.
-AM_MISSING_PROG([AMTAR], [tar])
-m4_if([$1], [v7],
-     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
-     [m4_case([$1], [ustar],, [pax],,
-              [m4_fatal([Unknown tar format])])
-AC_MSG_CHECKING([how to create a $1 tar archive])
-# Loop over all known methods to create a tar archive until one works.
-_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
-_am_tools=${am_cv_prog_tar_$1-$_am_tools}
-# Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of `-'.
-for _am_tool in $_am_tools
-do
-  case $_am_tool in
-  gnutar)
-    for _am_tar in tar gnutar gtar;
-    do
-      AM_RUN_LOG([$_am_tar --version]) && break
-    done
-    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
-    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
-    am__untar="$_am_tar -xf -"
-    ;;
-  plaintar)
-    # Must skip GNU tar: if it does not support --format= it doesn't create
-    # ustar tarball either.
-    (tar --version) >/dev/null 2>&1 && continue
-    am__tar='tar chf - "$$tardir"'
-    am__tar_='tar chf - "$tardir"'
-    am__untar='tar xf -'
-    ;;
-  pax)
-    am__tar='pax -L -x $1 -w "$$tardir"'
-    am__tar_='pax -L -x $1 -w "$tardir"'
-    am__untar='pax -r'
-    ;;
-  cpio)
-    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
-    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
-    am__untar='cpio -i -H $1 -d'
-    ;;
-  none)
-    am__tar=false
-    am__tar_=false
-    am__untar=false
-    ;;
-  esac
-
-  # If the value was cached, stop now.  We just wanted to have am__tar
-  # and am__untar set.
-  test -n "${am_cv_prog_tar_$1}" && break
-
-  # tar/untar a dummy directory, and stop if the command works
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  echo GrepMe > conftest.dir/file
-  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
-  rm -rf conftest.dir
-  if test -s conftest.tar; then
-    AM_RUN_LOG([$am__untar <conftest.tar])
-    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
-  fi
-done
-rm -rf conftest.dir
-
-AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
-AC_MSG_RESULT([$am_cv_prog_tar_$1])])
-AC_SUBST([am__tar])
-AC_SUBST([am__untar])
-]) # _AM_PROG_TAR
-
-m4_include([autoconf/libtool.m4])
-m4_include([autoconf/ltoptions.m4])
-m4_include([autoconf/ltsugar.m4])
-m4_include([autoconf/ltversion.m4])
-m4_include([autoconf/lt~obsolete.m4])
diff --git a/cloog-0.17.0/osl/autoconf/config.guess b/cloog-0.17.0/osl/autoconf/config.guess
deleted file mode 100755
index c2246a4..0000000
--- a/cloog-0.17.0/osl/autoconf/config.guess
+++ /dev/null
@@ -1,1502 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-#   Free Software Foundation, Inc.
-
-timestamp='2009-12-30'
-
-# 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
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner.  Please send patches (context
-# diff format) to <config-patches@gnu.org> and include a ChangeLog
-# entry.
-#
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
-#
-# 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
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help" >&2
-       exit 1 ;;
-    * )
-       break ;;
-  esac
-done
-
-if test $# != 0; then
-  echo "$me: too many arguments$help" >&2
-  exit 1
-fi
-
-trap 'exit 1' 1 2 15
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
-
-set_cc_for_build='
-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
-: ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
-dummy=$tmp/dummy ;
-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
-case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,)    echo "int x;" > $dummy.c ;
-	for c in cc gcc c89 c99 ; do
-	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
-	     CC_FOR_BUILD="$c"; break ;
-	  fi ;
-	done ;
-	if test x"$CC_FOR_BUILD" = x ; then
-	  CC_FOR_BUILD=no_compiler_found ;
-	fi
-	;;
- ,,*)   CC_FOR_BUILD=$CC ;;
- ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
-esac ; set_cc_for_build= ;'
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
-	PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
-    *:NetBSD:*:*)
-	# NetBSD (nbsd) targets should (where applicable) match one or
-	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
-	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
-	# switched to ELF, *-*-netbsd* would select the old
-	# object file format.  This provides both forward
-	# compatibility and a consistent mechanism for selecting the
-	# object file format.
-	#
-	# Note: NetBSD doesn't particularly care about the vendor
-	# portion of the name.  We always set it to "unknown".
-	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
-	case "${UNAME_MACHINE_ARCH}" in
-	    armeb) machine=armeb-unknown ;;
-	    arm*) machine=arm-unknown ;;
-	    sh3el) machine=shl-unknown ;;
-	    sh3eb) machine=sh-unknown ;;
-	    sh5el) machine=sh5le-unknown ;;
-	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
-	esac
-	# The Operating System including object format, if it has switched
-	# to ELF recently, or will in the future.
-	case "${UNAME_MACHINE_ARCH}" in
-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
-		eval $set_cc_for_build
-		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
-			| grep -q __ELF__
-		then
-		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
-		    # Return netbsd for either.  FIX?
-		    os=netbsd
-		else
-		    os=netbsdelf
-		fi
-		;;
-	    *)
-	        os=netbsd
-		;;
-	esac
-	# The OS release
-	# Debian GNU/NetBSD machines have a different userland, and
-	# thus, need a distinct triplet. However, they do not need
-	# kernel version information, so it can be replaced with a
-	# suitable tag, in the style of linux-gnu.
-	case "${UNAME_VERSION}" in
-	    Debian*)
-		release='-gnu'
-		;;
-	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
-		;;
-	esac
-	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
-	# contains redundant information, the shorter form:
-	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
-	exit ;;
-    *:OpenBSD:*:*)
-	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
-	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
-	exit ;;
-    *:ekkoBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
-	exit ;;
-    *:SolidBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
-	exit ;;
-    macppc:MirBSD:*:*)
-	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    *:MirBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    alpha:OSF1:*:*)
-	case $UNAME_RELEASE in
-	*4.0)
-		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
-		;;
-	*5.*)
-	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
-		;;
-	esac
-	# According to Compaq, /usr/sbin/psrinfo has been available on
-	# OSF/1 and Tru64 systems produced since 1995.  I hope that
-	# covers most systems running today.  This code pipes the CPU
-	# types through head -n 1, so we only detect the type of CPU 0.
-	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" ;;
-	    "EV4.5 (21064)")
-		UNAME_MACHINE="alpha" ;;
-	    "LCA4 (21066/21068)")
-		UNAME_MACHINE="alpha" ;;
-	    "EV5 (21164)")
-		UNAME_MACHINE="alphaev5" ;;
-	    "EV5.6 (21164A)")
-		UNAME_MACHINE="alphaev56" ;;
-	    "EV5.6 (21164PC)")
-		UNAME_MACHINE="alphapca56" ;;
-	    "EV5.7 (21164PC)")
-		UNAME_MACHINE="alphapca57" ;;
-	    "EV6 (21264)")
-		UNAME_MACHINE="alphaev6" ;;
-	    "EV6.7 (21264A)")
-		UNAME_MACHINE="alphaev67" ;;
-	    "EV6.8CB (21264C)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8AL (21264B)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8CX (21264D)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.9A (21264/EV69A)")
-		UNAME_MACHINE="alphaev69" ;;
-	    "EV7 (21364)")
-		UNAME_MACHINE="alphaev7" ;;
-	    "EV7.9 (21364A)")
-		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'`
-	exit ;;
-    Alpha\ *:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# Should we change UNAME_MACHINE based on the output of uname instead
-	# of the specific Alpha model?
-	echo alpha-pc-interix
-	exit ;;
-    21064:Windows_NT:50:3)
-	echo alpha-dec-winnt3.5
-	exit ;;
-    Amiga*:UNIX_System_V:4.0:*)
-	echo m68k-unknown-sysv4
-	exit ;;
-    *:[Aa]miga[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-amigaos
-	exit ;;
-    *:[Mm]orph[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-morphos
-	exit ;;
-    *:OS/390:*:*)
-	echo i370-ibm-openedition
-	exit ;;
-    *:z/VM:*:*)
-	echo s390-ibm-zvmoe
-	exit ;;
-    *:OS400:*:*)
-        echo powerpc-ibm-os400
-	exit ;;
-    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
-	echo arm-acorn-riscix${UNAME_RELEASE}
-	exit ;;
-    arm:riscos:*:*|arm:RISCOS:*:*)
-	echo arm-unknown-riscos
-	exit ;;
-    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
-	echo hppa1.1-hitachi-hiuxmpp
-	exit ;;
-    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
-	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
-	if test "`(/bin/universe) 2>/dev/null`" = att ; then
-		echo pyramid-pyramid-sysv3
-	else
-		echo pyramid-pyramid-bsd
-	fi
-	exit ;;
-    NILE*:*:*:dcosx)
-	echo pyramid-pyramid-svr4
-	exit ;;
-    DRS?6000:unix:4.0:6*)
-	echo sparc-icl-nx6
-	exit ;;
-    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
-	case `/usr/bin/uname -p` in
-	    sparc) echo sparc-icl-nx7; exit ;;
-	esac ;;
-    s390x:SunOS:*:*)
-	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4H:SunOS:5.*:*)
-	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
-	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
-	echo i386-pc-auroraux${UNAME_RELEASE}
-	exit ;;
-    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
-	eval $set_cc_for_build
-	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 (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
-		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		grep IS_64BIT_ARCH >/dev/null
-	    then
-		SUN_ARCH="x86_64"
-	    fi
-	fi
-	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:6*:*)
-	# According to config.sub, this is the proper way to canonicalize
-	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
-	# it's likely to be more like Solaris than SunOS4.
-	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:*:*)
-	case "`/usr/bin/arch -k`" in
-	    Series*|S4*)
-		UNAME_RELEASE=`uname -v`
-		;;
-	esac
-	# Japanese Language versions have a version number like `4.1.3-JL'.
-	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
-	exit ;;
-    sun3*:SunOS:*:*)
-	echo m68k-sun-sunos${UNAME_RELEASE}
-	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
-	case "`/bin/arch`" in
-	    sun3)
-		echo m68k-sun-sunos${UNAME_RELEASE}
-		;;
-	    sun4)
-		echo sparc-sun-sunos${UNAME_RELEASE}
-		;;
-	esac
-	exit ;;
-    aushp:SunOS:*:*)
-	echo sparc-auspex-sunos${UNAME_RELEASE}
-	exit ;;
-    # The situation for MiNT is a little confusing.  The machine name
-    # can be virtually everything (everything which is not
-    # "atarist" or "atariste" at least should have a processor
-    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
-    # to the lowercase version "mint" (or "freemint").  Finally
-    # the system name "TOS" denotes a system which is actually not
-    # MiNT.  But MiNT is downward compatible to TOS, so this should
-    # be no problem.
-    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
-	echo m68k-atari-mint${UNAME_RELEASE}
-        exit ;;
-    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-        echo m68k-milan-mint${UNAME_RELEASE}
-        exit ;;
-    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-        echo m68k-hades-mint${UNAME_RELEASE}
-        exit ;;
-    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-        echo m68k-unknown-mint${UNAME_RELEASE}
-        exit ;;
-    m68k:machten:*:*)
-	echo m68k-apple-machten${UNAME_RELEASE}
-	exit ;;
-    powerpc:machten:*:*)
-	echo powerpc-apple-machten${UNAME_RELEASE}
-	exit ;;
-    RISC*:Mach:*:*)
-	echo mips-dec-mach_bsd4.3
-	exit ;;
-    RISC*:ULTRIX:*:*)
-	echo mips-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    VAX*:ULTRIX*:*:*)
-	echo vax-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    2020:CLIX:*:* | 2430:CLIX:*:*)
-	echo clipper-intergraph-clix${UNAME_RELEASE}
-	exit ;;
-    mips:*:*:UMIPS | mips:*:*:RISCos)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-#ifdef __cplusplus
-#include <stdio.h>  /* for printf() prototype */
-	int main (int argc, char *argv[]) {
-#else
-	int main (argc, argv) int argc; char *argv[]; {
-#endif
-	#if defined (host_mips) && defined (MIPSEB)
-	#if defined (SYSTYPE_SYSV)
-	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_SVR4)
-	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
-	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
-	#endif
-	#endif
-	  exit (-1);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c &&
-	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
-	  SYSTEM_NAME=`$dummy $dummyarg` &&
-	    { echo "$SYSTEM_NAME"; exit; }
-	echo mips-mips-riscos${UNAME_RELEASE}
-	exit ;;
-    Motorola:PowerMAX_OS:*:*)
-	echo powerpc-motorola-powermax
-	exit ;;
-    Motorola:*:4.3:PL8-*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:Power_UNIX:*:*)
-	echo powerpc-harris-powerunix
-	exit ;;
-    m88k:CX/UX:7*:*)
-	echo m88k-harris-cxux7
-	exit ;;
-    m88k:*:4*:R4*)
-	echo m88k-motorola-sysv4
-	exit ;;
-    m88k:*:3*:R3*)
-	echo m88k-motorola-sysv3
-	exit ;;
-    AViiON:dgux:*:*)
-        # DG/UX returns AViiON for all architectures
-        UNAME_PROCESSOR=`/usr/bin/uname -p`
-	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
-	then
-	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
-	       [ ${TARGET_BINARY_INTERFACE}x = x ]
-	    then
-		echo m88k-dg-dgux${UNAME_RELEASE}
-	    else
-		echo m88k-dg-dguxbcs${UNAME_RELEASE}
-	    fi
-	else
-	    echo i586-dg-dgux${UNAME_RELEASE}
-	fi
- 	exit ;;
-    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
-	echo m88k-dolphin-sysv3
-	exit ;;
-    M88*:*:R3*:*)
-	# Delta 88k system running SVR3
-	echo m88k-motorola-sysv3
-	exit ;;
-    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
-	echo m88k-tektronix-sysv3
-	exit ;;
-    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
-	echo m68k-tektronix-bsd
-	exit ;;
-    *:IRIX*:*:*)
-	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
-	exit ;;
-    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
-	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
-    i*86:AIX:*:*)
-	echo i386-ibm-aix
-	exit ;;
-    ia64:AIX:*:*)
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:2:3)
-	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
-		eval $set_cc_for_build
-		sed 's/^		//' << EOF >$dummy.c
-		#include <sys/systemcfg.h>
-
-		main()
-			{
-			if (!__power_pc())
-				exit(1);
-			puts("powerpc-ibm-aix3.2.5");
-			exit(0);
-			}
-EOF
-		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
-		then
-			echo "$SYSTEM_NAME"
-		else
-			echo rs6000-ibm-aix3.2.5
-		fi
-	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
-		echo rs6000-ibm-aix3.2.4
-	else
-		echo rs6000-ibm-aix3.2
-	fi
-	exit ;;
-    *:AIX:*:[456])
-	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
-	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
-		IBM_ARCH=rs6000
-	else
-		IBM_ARCH=powerpc
-	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:*:*)
-	echo rs6000-ibm-aix
-	exit ;;
-    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
-	echo romp-ibm-bsd4.4
-	exit ;;
-    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
-	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
-	exit ;;                             # report: romp-ibm BSD 4.3
-    *:BOSX:*:*)
-	echo rs6000-bull-bosx
-	exit ;;
-    DPX/2?00:B.O.S.:*:*)
-	echo m68k-bull-sysv3
-	exit ;;
-    9000/[34]??:4.3bsd:1.*:*)
-	echo m68k-hp-bsd
-	exit ;;
-    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
-	echo m68k-hp-bsd4.4
-	exit ;;
-    9000/[34678]??:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	case "${UNAME_MACHINE}" in
-	    9000/31? )            HP_ARCH=m68000 ;;
-	    9000/[34]?? )         HP_ARCH=m68k ;;
-	    9000/[678][0-9][0-9])
-		if [ -x /usr/bin/getconf ]; then
-		    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
-                      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
-                        esac ;;
-                    esac
-		fi
-		if [ "${HP_ARCH}" = "" ]; then
-		    eval $set_cc_for_build
-		    sed 's/^              //' << EOF >$dummy.c
-
-              #define _HPUX_SOURCE
-              #include <stdlib.h>
-              #include <unistd.h>
-
-              int main ()
-              {
-              #if defined(_SC_KERNEL_BITS)
-                  long bits = sysconf(_SC_KERNEL_BITS);
-              #endif
-                  long cpu  = sysconf (_SC_CPU_VERSION);
-
-                  switch (cpu)
-              	{
-              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-              	case CPU_PA_RISC2_0:
-              #if defined(_SC_KERNEL_BITS)
-              	    switch (bits)
-              		{
-              		case 64: puts ("hppa2.0w"); break;
-              		case 32: puts ("hppa2.0n"); break;
-              		default: puts ("hppa2.0"); break;
-              		} break;
-              #else  /* !defined(_SC_KERNEL_BITS) */
-              	    puts ("hppa2.0"); break;
-              #endif
-              	default: puts ("hppa1.0"); break;
-              	}
-                  exit (0);
-              }
-EOF
-		    (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" ]
-	then
-	    eval $set_cc_for_build
-
-	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
-	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
-	    # generating 64-bit code.  GNU and HP use different nomenclature:
-	    #
-	    # $ CC_FOR_BUILD=cc ./config.guess
-	    # => hppa2.0w-hp-hpux11.23
-	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
-	    # => hppa64-hp-hpux11.23
-
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
-		grep -q __LP64__
-	    then
-		HP_ARCH="hppa2.0w"
-	    else
-		HP_ARCH="hppa64"
-	    fi
-	fi
-	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
-	exit ;;
-    ia64:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	echo ia64-hp-hpux${HPUX_REV}
-	exit ;;
-    3050*:HI-UX:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <unistd.h>
-	int
-	main ()
-	{
-	  long cpu = sysconf (_SC_CPU_VERSION);
-	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
-	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
-	     results, however.  */
-	  if (CPU_IS_PA_RISC (cpu))
-	    {
-	      switch (cpu)
-		{
-		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
-		  default: puts ("hppa-hitachi-hiuxwe2"); break;
-		}
-	    }
-	  else if (CPU_IS_HP_MC68K (cpu))
-	    puts ("m68k-hitachi-hiuxwe2");
-	  else puts ("unknown-hitachi-hiuxwe2");
-	  exit (0);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
-		{ echo "$SYSTEM_NAME"; exit; }
-	echo unknown-hitachi-hiuxwe2
-	exit ;;
-    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
-	echo hppa1.1-hp-bsd
-	exit ;;
-    9000/8??:4.3bsd:*:*)
-	echo hppa1.0-hp-bsd
-	exit ;;
-    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
-	echo hppa1.0-hp-mpeix
-	exit ;;
-    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
-	echo hppa1.1-hp-osf
-	exit ;;
-    hp8??:OSF1:*:*)
-	echo hppa1.0-hp-osf
-	exit ;;
-    i*86:OSF1:*:*)
-	if [ -x /usr/sbin/sysversion ] ; then
-	    echo ${UNAME_MACHINE}-unknown-osf1mk
-	else
-	    echo ${UNAME_MACHINE}-unknown-osf1
-	fi
-	exit ;;
-    parisc*:Lites*:*:*)
-	echo hppa1.1-hp-lites
-	exit ;;
-    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
-	echo c1-convex-bsd
-        exit ;;
-    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-        exit ;;
-    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
-	echo c34-convex-bsd
-        exit ;;
-    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
-	echo c38-convex-bsd
-        exit ;;
-    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
-	echo c4-convex-bsd
-        exit ;;
-    CRAY*Y-MP:*:*:*)
-	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*[A-Z]90:*:*:*)
-	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
-	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
-	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
-	      -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*TS:*:*:*)
-	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*T3E:*:*:*)
-	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*SV1:*:*:*)
-	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    *:UNICOS/mp:*:*)
-	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_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/ /_/'`
-        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-	exit ;;
-    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
-	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
-	exit ;;
-    sparc*:BSD/OS:*:*)
-	echo sparc-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:BSD/OS:*:*)
-	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:FreeBSD:*:*)
-	case ${UNAME_MACHINE} in
-	    pc98)
-		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    amd64)
-		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    *)
-		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	esac
-	exit ;;
-    i*:CYGWIN*:*)
-	echo ${UNAME_MACHINE}-pc-cygwin
-	exit ;;
-    *:MINGW*:*)
-	echo ${UNAME_MACHINE}-pc-mingw32
-	exit ;;
-    i*:windows32*:*)
-    	# uname -m includes "-pc" on this system.
-    	echo ${UNAME_MACHINE}-mingw32
-	exit ;;
-    i*:PW*:*)
-	echo ${UNAME_MACHINE}-pc-pw32
-	exit ;;
-    *:Interix*:*)
-    	case ${UNAME_MACHINE} in
-	    x86)
-		echo i586-pc-interix${UNAME_RELEASE}
-		exit ;;
-	    authenticamd | genuineintel | EM64T)
-		echo x86_64-unknown-interix${UNAME_RELEASE}
-		exit ;;
-	    IA64)
-		echo ia64-unknown-interix${UNAME_RELEASE}
-		exit ;;
-	esac ;;
-    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
-	echo i${UNAME_MACHINE}-pc-mks
-	exit ;;
-    8664:Windows_NT:*)
-	echo x86_64-pc-mks
-	exit ;;
-    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
-	# UNAME_MACHINE based on the output of uname instead of i386?
-	echo i586-pc-interix
-	exit ;;
-    i*:UWIN*:*)
-	echo ${UNAME_MACHINE}-pc-uwin
-	exit ;;
-    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
-	echo x86_64-unknown-cygwin
-	exit ;;
-    p*:CYGWIN*:*)
-	echo powerpcle-unknown-cygwin
-	exit ;;
-    prep*:SunOS:5.*:*)
-	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    *:GNU:*:*)
-	# the GNU system
-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-	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/[-(].*//'`-gnu
-	exit ;;
-    i*86:Minix:*:*)
-	echo ${UNAME_MACHINE}-pc-minix
-	exit ;;
-    alpha:Linux:*:*)
-	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
-	  EV5)   UNAME_MACHINE=alphaev5 ;;
-	  EV56)  UNAME_MACHINE=alphaev56 ;;
-	  PCA56) UNAME_MACHINE=alphapca56 ;;
-	  PCA57) UNAME_MACHINE=alphapca56 ;;
-	  EV6)   UNAME_MACHINE=alphaev6 ;;
-	  EV67)  UNAME_MACHINE=alphaev67 ;;
-	  EV68*) UNAME_MACHINE=alphaev68 ;;
-        esac
-	objdump --private-headers /bin/sh | grep -q ld.so.1
-	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
-	exit ;;
-    arm*:Linux:*:*)
-	eval $set_cc_for_build
-	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
-	    | grep -q __ARM_EABI__
-	then
-	    echo ${UNAME_MACHINE}-unknown-linux-gnu
-	else
-	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
-	fi
-	exit ;;
-    avr32*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    cris:Linux:*:*)
-	echo cris-axis-linux-gnu
-	exit ;;
-    crisv32:Linux:*:*)
-	echo crisv32-axis-linux-gnu
-	exit ;;
-    frv:Linux:*:*)
-    	echo frv-unknown-linux-gnu
-	exit ;;
-    i*86:Linux:*:*)
-	LIBC=gnu
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#ifdef __dietlibc__
-	LIBC=dietlibc
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
-	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
-	exit ;;
-    ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m32r*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    mips:Linux:*:* | mips64:Linux:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#undef CPU
-	#undef ${UNAME_MACHINE}
-	#undef ${UNAME_MACHINE}el
-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=${UNAME_MACHINE}el
-	#else
-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=${UNAME_MACHINE}
-	#else
-	CPU=
-	#endif
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
-	;;
-    or32:Linux:*:*)
-	echo or32-unknown-linux-gnu
-	exit ;;
-    padre:Linux:*:*)
-	echo sparc-unknown-linux-gnu
-	exit ;;
-    parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-gnu
-	exit ;;
-    parisc:Linux:*:* | hppa:Linux:*:*)
-	# Look for CPU level
-	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
-	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
-	  *)    echo hppa-unknown-linux-gnu ;;
-	esac
-	exit ;;
-    ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-gnu
-	exit ;;
-    ppc:Linux:*:*)
-	echo powerpc-unknown-linux-gnu
-	exit ;;
-    s390:Linux:*:* | s390x:Linux:*:*)
-	echo ${UNAME_MACHINE}-ibm-linux
-	exit ;;
-    sh64*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sh*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    vax:Linux:*:*)
-	echo ${UNAME_MACHINE}-dec-linux-gnu
-	exit ;;
-    x86_64:Linux:*:*)
-	echo x86_64-unknown-linux-gnu
-	exit ;;
-    xtensa*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    i*86:DYNIX/ptx:4*:*)
-	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
-	# earlier versions are messed up and put the nodename in both
-	# sysname and nodename.
-	echo i386-sequent-sysv4
-	exit ;;
-    i*86:UNIX_SV:4.2MP:2.*)
-        # Unixware is an offshoot of SVR4, but it has its own version
-        # number series starting with 2...
-        # I am not positive that other SVR4 systems won't match this,
-	# I just have to hope.  -- rms.
-        # Use sysv4.2uw... so that sysv4* matches it.
-	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
-	exit ;;
-    i*86:OS/2:*:*)
-	# If we were able to find `uname', then EMX Unix compatibility
-	# is probably installed.
-	echo ${UNAME_MACHINE}-pc-os2-emx
-	exit ;;
-    i*86:XTS-300:*:STOP)
-	echo ${UNAME_MACHINE}-unknown-stop
-	exit ;;
-    i*86:atheos:*:*)
-	echo ${UNAME_MACHINE}-unknown-atheos
-	exit ;;
-    i*86:syllable:*:*)
-	echo ${UNAME_MACHINE}-pc-syllable
-	exit ;;
-    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
-	echo i386-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    i*86:*DOS:*:*)
-	echo ${UNAME_MACHINE}-pc-msdosdjgpp
-	exit ;;
-    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
-	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
-	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
-		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
-	else
-		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
-	fi
-	exit ;;
-    i*86:*:5:[678]*)
-    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
-	case `/bin/uname -X | grep "^Machine"` in
-	    *486*)	     UNAME_MACHINE=i486 ;;
-	    *Pentium)	     UNAME_MACHINE=i586 ;;
-	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
-	esac
-	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
-	exit ;;
-    i*86:*:3.2:*)
-	if test -f /usr/options/cb.name; then
-		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
-		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
-	elif /bin/uname -X 2>/dev/null >/dev/null ; then
-		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
-		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
-		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
-			&& UNAME_MACHINE=i586
-		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
-	else
-		echo ${UNAME_MACHINE}-pc-sysv32
-	fi
-	exit ;;
-    pc:*:*:*)
-	# Left here for compatibility:
-        # 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
-	# this is a cross-build.
-	echo i586-pc-msdosdjgpp
-        exit ;;
-    Intel:Mach:3*:*)
-	echo i386-pc-mach3
-	exit ;;
-    paragon:*:*:*)
-	echo i860-intel-osf1
-	exit ;;
-    i860:*:4.*:*) # i860-SVR4
-	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
-	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
-	else # Add other i860-SVR4 vendors below as they are discovered.
-	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
-	fi
-	exit ;;
-    mini*:CTIX:SYS*5:*)
-	# "miniframe"
-	echo m68010-convergent-sysv
-	exit ;;
-    mc68k:UNIX:SYSTEM5:3.51m)
-	echo m68k-convergent-sysv
-	exit ;;
-    M680?0:D-NIX:5.3:*)
-	echo m68k-diab-dnix
-	exit ;;
-    M68*:*:R3V[5678]*:*)
-	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
-    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
-	OS_REL=''
-	test -r /etc/.relid \
-	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-          && { echo i486-ncr-sysv4; exit; } ;;
-    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
-	OS_REL='.3'
-	test -r /etc/.relid \
-	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
-	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
-	echo m68k-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    mc68030:UNIX_System_V:4.*:*)
-	echo m68k-atari-sysv4
-	exit ;;
-    TSUNAMI:LynxOS:2.*:*)
-	echo sparc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    rs6000:LynxOS:2.*:*)
-	echo rs6000-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
-	echo powerpc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    SM[BE]S:UNIX_SV:*:*)
-	echo mips-dde-sysv${UNAME_RELEASE}
-	exit ;;
-    RM*:ReliantUNIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    RM*:SINIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    *:SINIX-*:*:*)
-	if uname -p 2>/dev/null >/dev/null ; then
-		UNAME_MACHINE=`(uname -p) 2>/dev/null`
-		echo ${UNAME_MACHINE}-sni-sysv4
-	else
-		echo ns32k-sni-sysv
-	fi
-	exit ;;
-    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-                      # says <Richard.M.Bartel@ccMail.Census.GOV>
-        echo i586-unisys-sysv4
-        exit ;;
-    *:UNIX_System_V:4*:FTX*)
-	# From Gerald Hewes <hewes@openmarket.com>.
-	# How about differentiating between stratus architectures? -djm
-	echo hppa1.1-stratus-sysv4
-	exit ;;
-    *:*:*:FTX*)
-	# From seanf@swdc.stratus.com.
-	echo i860-stratus-sysv4
-	exit ;;
-    i*86:VOS:*:*)
-	# From Paul.Green@stratus.com.
-	echo ${UNAME_MACHINE}-stratus-vos
-	exit ;;
-    *:VOS:*:*)
-	# From Paul.Green@stratus.com.
-	echo hppa1.1-stratus-vos
-	exit ;;
-    mc68*:A/UX:*:*)
-	echo m68k-apple-aux${UNAME_RELEASE}
-	exit ;;
-    news*:NEWS-OS:6*:*)
-	echo mips-sony-newsos6
-	exit ;;
-    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
-	if [ -d /usr/nec ]; then
-	        echo mips-nec-sysv${UNAME_RELEASE}
-	else
-	        echo mips-unknown-sysv${UNAME_RELEASE}
-	fi
-        exit ;;
-    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
-	echo powerpc-be-beos
-	exit ;;
-    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
-	echo powerpc-apple-beos
-	exit ;;
-    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
-	echo i586-pc-beos
-	exit ;;
-    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
-	echo i586-pc-haiku
-	exit ;;
-    SX-4:SUPER-UX:*:*)
-	echo sx4-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-5:SUPER-UX:*:*)
-	echo sx5-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-6:SUPER-UX:*:*)
-	echo sx6-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-7:SUPER-UX:*:*)
-	echo sx7-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-8:SUPER-UX:*:*)
-	echo sx8-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-8R:SUPER-UX:*:*)
-	echo sx8r-nec-superux${UNAME_RELEASE}
-	exit ;;
-    Power*:Rhapsody:*:*)
-	echo powerpc-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Rhapsody:*:*)
-	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Darwin:*:*)
-	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-	case $UNAME_PROCESSOR in
-	    i386)
-		eval $set_cc_for_build
-		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) | \
-		      grep IS_64BIT_ARCH >/dev/null
-		  then
-		      UNAME_PROCESSOR="x86_64"
-		  fi
-		fi ;;
-	    unknown) UNAME_PROCESSOR=powerpc ;;
-	esac
-	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
-	exit ;;
-    *:procnto*:*:* | *:QNX:[0123456789]*:*)
-	UNAME_PROCESSOR=`uname -p`
-	if test "$UNAME_PROCESSOR" = "x86"; then
-		UNAME_PROCESSOR=i386
-		UNAME_MACHINE=pc
-	fi
-	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
-	exit ;;
-    *:QNX:*:4*)
-	echo i386-pc-qnx
-	exit ;;
-    NSE-?:NONSTOP_KERNEL:*:*)
-	echo nse-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    NSR-?:NONSTOP_KERNEL:*:*)
-	echo nsr-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    *:NonStop-UX:*:*)
-	echo mips-compaq-nonstopux
-	exit ;;
-    BS2000:POSIX*:*:*)
-	echo bs2000-siemens-sysv
-	exit ;;
-    DS/*:UNIX_System_V:*:*)
-	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
-	exit ;;
-    *:Plan9:*:*)
-	# "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
-	    UNAME_MACHINE=i386
-	else
-	    UNAME_MACHINE="$cputype"
-	fi
-	echo ${UNAME_MACHINE}-unknown-plan9
-	exit ;;
-    *:TOPS-10:*:*)
-	echo pdp10-unknown-tops10
-	exit ;;
-    *:TENEX:*:*)
-	echo pdp10-unknown-tenex
-	exit ;;
-    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
-	echo pdp10-dec-tops20
-	exit ;;
-    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
-	echo pdp10-xkl-tops20
-	exit ;;
-    *:TOPS-20:*:*)
-	echo pdp10-unknown-tops20
-	exit ;;
-    *:ITS:*:*)
-	echo pdp10-unknown-its
-	exit ;;
-    SEI:*:*:SEIUX)
-        echo mips-sei-seiux${UNAME_RELEASE}
-	exit ;;
-    *:DragonFly:*:*)
-	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
-	exit ;;
-    *:*VMS:*:*)
-    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
-	case "${UNAME_MACHINE}" in
-	    A*) echo alpha-dec-vms ; exit ;;
-	    I*) echo ia64-dec-vms ; exit ;;
-	    V*) echo vax-dec-vms ; exit ;;
-	esac ;;
-    *:XENIX:*:SysV)
-	echo i386-pc-xenix
-	exit ;;
-    i*86:skyos:*:*)
-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
-	exit ;;
-    i*86:rdos:*:*)
-	echo ${UNAME_MACHINE}-pc-rdos
-	exit ;;
-    i*86:AROS:*:*)
-	echo ${UNAME_MACHINE}-pc-aros
-	exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-          "4"
-#else
-	  ""
-#endif
-         ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
-	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    c34*)
-	echo c34-convex-bsd
-	exit ;;
-    c38*)
-	echo c38-convex-bsd
-	exit ;;
-    c4*)
-	echo c4-convex-bsd
-	exit ;;
-    esac
-fi
-
-cat >&2 <<EOF
-$0: unable to guess system type
-
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
-
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
-and
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches@gnu.org> in order to provide the needed
-information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
-
-hostinfo               = `(hostinfo) 2>/dev/null`
-/bin/universe          = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch              = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
-
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM  = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
-EOF
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/cloog-0.17.0/osl/autoconf/config.sub b/cloog-0.17.0/osl/autoconf/config.sub
deleted file mode 100755
index c2d1257..0000000
--- a/cloog-0.17.0/osl/autoconf/config.sub
+++ /dev/null
@@ -1,1714 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-#   Free Software Foundation, Inc.
-
-timestamp='2010-01-22'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# 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
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted GNU ChangeLog entry.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support.  The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help"
-       exit 1 ;;
-
-    *local*)
-       # First pass through any local machine types.
-       echo $1
-       exit ;;
-
-    * )
-       break ;;
-  esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
-    exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
-    exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
-  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
-  kopensolaris*-gnu* | \
-  storm-chaos* | os2-emx* | rtmk-nova*)
-    os=-$maybe_os
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
-    ;;
-  *)
-    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
-    if [ $basic_machine != $1 ]
-    then os=`echo $1 | sed 's/.*-/-/'`
-    else os=; fi
-    ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work.  We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
-	-sun*os*)
-		# Prevent following clause from handling this invalid input.
-		;;
-	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis | -knuth | -cray | -microblaze)
-		os=
-		basic_machine=$1
-		;;
-        -bluegene*)
-	        os=-cnk
-		;;
-	-sim | -cisco | -oki | -wec | -winbond)
-		os=
-		basic_machine=$1
-		;;
-	-scout)
-		;;
-	-wrs)
-		os=-vxworks
-		basic_machine=$1
-		;;
-	-chorusos*)
-		os=-chorusos
-		basic_machine=$1
-		;;
- 	-chorusrdb)
- 		os=-chorusrdb
-		basic_machine=$1
- 		;;
-	-hiux*)
-		os=-hiuxwe2
-		;;
-	-sco6)
-		os=-sco5v6
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5)
-		os=-sco3.2v5
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco4)
-		os=-sco3.2v4
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2.[4-9]*)
-		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2v[4-9]*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5v6*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco*)
-		os=-sco3.2v2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-udk*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-isc)
-		os=-isc2.2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-clix*)
-		basic_machine=clipper-intergraph
-		;;
-	-isc*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-lynx*)
-		os=-lynxos
-		;;
-	-ptx*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
-		;;
-	-windowsnt*)
-		os=`echo $os | sed -e 's/windowsnt/winnt/'`
-		;;
-	-psos*)
-		os=-psos
-		;;
-	-mint | -mint[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
-	# Recognize the basic CPU types without company name.
-	# Some are omitted here because they have special meanings below.
-	1750a | 580 \
-	| a29k \
-	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
-	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
-	| am33_2.0 \
-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
-	| bfin \
-	| c4x | clipper \
-	| d10v | d30v | dlx | dsp16xx \
-	| fido | fr30 | frv \
-	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
-	| i370 | i860 | i960 | ia64 \
-	| ip2k | iq2000 \
-	| lm32 \
-	| m32c | m32r | m32rle | m68000 | m68k | m88k \
-	| maxq | mb | microblaze | mcore | mep | metag \
-	| mips | mipsbe | mipseb | mipsel | mipsle \
-	| mips16 \
-	| mips64 | mips64el \
-	| mips64octeon | mips64octeonel \
-	| mips64orion | mips64orionel \
-	| mips64r5900 | mips64r5900el \
-	| mips64vr | mips64vrel \
-	| mips64vr4100 | mips64vr4100el \
-	| mips64vr4300 | mips64vr4300el \
-	| mips64vr5000 | mips64vr5000el \
-	| mips64vr5900 | mips64vr5900el \
-	| mipsisa32 | mipsisa32el \
-	| mipsisa32r2 | mipsisa32r2el \
-	| mipsisa64 | mipsisa64el \
-	| mipsisa64r2 | mipsisa64r2el \
-	| mipsisa64sb1 | mipsisa64sb1el \
-	| mipsisa64sr71k | mipsisa64sr71kel \
-	| mipstx39 | mipstx39el \
-	| mn10200 | mn10300 \
-	| moxie \
-	| mt \
-	| msp430 \
-	| nios | nios2 \
-	| ns16k | ns32k \
-	| or32 \
-	| pdp10 | pdp11 | pj | pjl \
-	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
-	| pyramid \
-	| rx \
-	| score \
-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
-	| sh64 | sh64le \
-	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
-	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-	| spu | strongarm \
-	| tahoe | thumb | tic4x | tic80 | tron \
-	| ubicom32 \
-	| v850 | v850e \
-	| we32k \
-	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
-	| z8k | z80)
-		basic_machine=$basic_machine-unknown
-		;;
-	m6811 | m68hc11 | m6812 | m68hc12 | picochip)
-		# Motorola 68HC11/12.
-		basic_machine=$basic_machine-unknown
-		os=-none
-		;;
-	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
-		;;
-	ms1)
-		basic_machine=mt-unknown
-		;;
-
-	# We use `pc' rather than `unknown'
-	# because (1) that's what they normally are, and
-	# (2) the word "unknown" tends to confuse beginning users.
-	i*86 | x86_64)
-	  basic_machine=$basic_machine-pc
-	  ;;
-	# Object if more than one company name word.
-	*-*-*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-	# Recognize the basic CPU types with company name.
-	580-* \
-	| a29k-* \
-	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
-	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
-	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
-	| avr-* | avr32-* \
-	| bfin-* | bs2000-* \
-	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
-	| clipper-* | craynv-* | cydra-* \
-	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
-	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
-	| h8300-* | h8500-* \
-	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
-	| i*86-* | i860-* | i960-* | ia64-* \
-	| ip2k-* | iq2000-* \
-	| lm32-* \
-	| m32c-* | m32r-* | m32rle-* \
-	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
-	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
-	| mips16-* \
-	| mips64-* | mips64el-* \
-	| mips64octeon-* | mips64octeonel-* \
-	| mips64orion-* | mips64orionel-* \
-	| mips64r5900-* | mips64r5900el-* \
-	| mips64vr-* | mips64vrel-* \
-	| mips64vr4100-* | mips64vr4100el-* \
-	| mips64vr4300-* | mips64vr4300el-* \
-	| mips64vr5000-* | mips64vr5000el-* \
-	| mips64vr5900-* | mips64vr5900el-* \
-	| mipsisa32-* | mipsisa32el-* \
-	| mipsisa32r2-* | mipsisa32r2el-* \
-	| mipsisa64-* | mipsisa64el-* \
-	| mipsisa64r2-* | mipsisa64r2el-* \
-	| mipsisa64sb1-* | mipsisa64sb1el-* \
-	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
-	| mipstx39-* | mipstx39el-* \
-	| mmix-* \
-	| mt-* \
-	| msp430-* \
-	| nios-* | nios2-* \
-	| none-* | np1-* | ns16k-* | ns32k-* \
-	| orion-* \
-	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
-	| pyramid-* \
-	| romp-* | rs6000-* | rx-* \
-	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
-	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
-	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
-	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
-	| tahoe-* | thumb-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
-	| tile-* | tilegx-* \
-	| tron-* \
-	| ubicom32-* \
-	| v850-* | v850e-* | vax-* \
-	| we32k-* \
-	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
-	| xstormy16-* | xtensa*-* \
-	| ymp-* \
-	| z8k-* | z80-*)
-		;;
-	# Recognize the basic CPU types without company name, with glob match.
-	xtensa*)
-		basic_machine=$basic_machine-unknown
-		;;
-	# Recognize the various machine names and aliases which stand
-	# for a CPU type and a company and sometimes even an OS.
-	386bsd)
-		basic_machine=i386-unknown
-		os=-bsd
-		;;
-	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
-		basic_machine=m68000-att
-		;;
-	3b*)
-		basic_machine=we32k-att
-		;;
-	a29khif)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-    	abacus)
-		basic_machine=abacus-unknown
-		;;
-	adobe68k)
-		basic_machine=m68010-adobe
-		os=-scout
-		;;
-	alliant | fx80)
-		basic_machine=fx80-alliant
-		;;
-	altos | altos3068)
-		basic_machine=m68k-altos
-		;;
-	am29k)
-		basic_machine=a29k-none
-		os=-bsd
-		;;
-	amd64)
-		basic_machine=x86_64-pc
-		;;
-	amd64-*)
-		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	amdahl)
-		basic_machine=580-amdahl
-		os=-sysv
-		;;
-	amiga | amiga-*)
-		basic_machine=m68k-unknown
-		;;
-	amigaos | amigados)
-		basic_machine=m68k-unknown
-		os=-amigaos
-		;;
-	amigaunix | amix)
-		basic_machine=m68k-unknown
-		os=-sysv4
-		;;
-	apollo68)
-		basic_machine=m68k-apollo
-		os=-sysv
-		;;
-	apollo68bsd)
-		basic_machine=m68k-apollo
-		os=-bsd
-		;;
-	aros)
-		basic_machine=i386-pc
-		os=-aros
-		;;
-	aux)
-		basic_machine=m68k-apple
-		os=-aux
-		;;
-	balance)
-		basic_machine=ns32k-sequent
-		os=-dynix
-		;;
-	blackfin)
-		basic_machine=bfin-unknown
-		os=-linux
-		;;
-	blackfin-*)
-		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	bluegene*)
-		basic_machine=powerpc-ibm
-		os=-cnk
-		;;
-	c90)
-		basic_machine=c90-cray
-		os=-unicos
-		;;
-        cegcc)
-		basic_machine=arm-unknown
-		os=-cegcc
-		;;
-	convex-c1)
-		basic_machine=c1-convex
-		os=-bsd
-		;;
-	convex-c2)
-		basic_machine=c2-convex
-		os=-bsd
-		;;
-	convex-c32)
-		basic_machine=c32-convex
-		os=-bsd
-		;;
-	convex-c34)
-		basic_machine=c34-convex
-		os=-bsd
-		;;
-	convex-c38)
-		basic_machine=c38-convex
-		os=-bsd
-		;;
-	cray | j90)
-		basic_machine=j90-cray
-		os=-unicos
-		;;
-	craynv)
-		basic_machine=craynv-cray
-		os=-unicosmp
-		;;
-	cr16)
-		basic_machine=cr16-unknown
-		os=-elf
-		;;
-	crds | unos)
-		basic_machine=m68k-crds
-		;;
-	crisv32 | crisv32-* | etraxfs*)
-		basic_machine=crisv32-axis
-		;;
-	cris | cris-* | etrax*)
-		basic_machine=cris-axis
-		;;
-	crx)
-		basic_machine=crx-unknown
-		os=-elf
-		;;
-	da30 | da30-*)
-		basic_machine=m68k-da30
-		;;
-	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
-		basic_machine=mips-dec
-		;;
-	decsystem10* | dec10*)
-		basic_machine=pdp10-dec
-		os=-tops10
-		;;
-	decsystem20* | dec20*)
-		basic_machine=pdp10-dec
-		os=-tops20
-		;;
-	delta | 3300 | motorola-3300 | motorola-delta \
-	      | 3300-motorola | delta-motorola)
-		basic_machine=m68k-motorola
-		;;
-	delta88)
-		basic_machine=m88k-motorola
-		os=-sysv3
-		;;
-	dicos)
-		basic_machine=i686-pc
-		os=-dicos
-		;;
-	djgpp)
-		basic_machine=i586-pc
-		os=-msdosdjgpp
-		;;
-	dpx20 | dpx20-*)
-		basic_machine=rs6000-bull
-		os=-bosx
-		;;
-	dpx2* | dpx2*-bull)
-		basic_machine=m68k-bull
-		os=-sysv3
-		;;
-	ebmon29k)
-		basic_machine=a29k-amd
-		os=-ebmon
-		;;
-	elxsi)
-		basic_machine=elxsi-elxsi
-		os=-bsd
-		;;
-	encore | umax | mmax)
-		basic_machine=ns32k-encore
-		;;
-	es1800 | OSE68k | ose68k | ose | OSE)
-		basic_machine=m68k-ericsson
-		os=-ose
-		;;
-	fx2800)
-		basic_machine=i860-alliant
-		;;
-	genix)
-		basic_machine=ns32k-ns
-		;;
-	gmicro)
-		basic_machine=tron-gmicro
-		os=-sysv
-		;;
-	go32)
-		basic_machine=i386-pc
-		os=-go32
-		;;
-	h3050r* | hiux*)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	h8300hms)
-		basic_machine=h8300-hitachi
-		os=-hms
-		;;
-	h8300xray)
-		basic_machine=h8300-hitachi
-		os=-xray
-		;;
-	h8500hms)
-		basic_machine=h8500-hitachi
-		os=-hms
-		;;
-	harris)
-		basic_machine=m88k-harris
-		os=-sysv3
-		;;
-	hp300-*)
-		basic_machine=m68k-hp
-		;;
-	hp300bsd)
-		basic_machine=m68k-hp
-		os=-bsd
-		;;
-	hp300hpux)
-		basic_machine=m68k-hp
-		os=-hpux
-		;;
-	hp3k9[0-9][0-9] | hp9[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k2[0-9][0-9] | hp9k31[0-9])
-		basic_machine=m68000-hp
-		;;
-	hp9k3[2-9][0-9])
-		basic_machine=m68k-hp
-		;;
-	hp9k6[0-9][0-9] | hp6[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k7[0-79][0-9] | hp7[0-79][0-9])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k78[0-9] | hp78[0-9])
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][13679] | hp8[0-9][13679])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][0-9] | hp8[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hppa-next)
-		os=-nextstep3
-		;;
-	hppaosf)
-		basic_machine=hppa1.1-hp
-		os=-osf
-		;;
-	hppro)
-		basic_machine=hppa1.1-hp
-		os=-proelf
-		;;
-	i370-ibm* | ibm*)
-		basic_machine=i370-ibm
-		;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
-	i*86v32)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv32
-		;;
-	i*86v4*)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv4
-		;;
-	i*86v)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv
-		;;
-	i*86sol2)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-solaris2
-		;;
-	i386mach)
-		basic_machine=i386-mach
-		os=-mach
-		;;
-	i386-vsta | vsta)
-		basic_machine=i386-unknown
-		os=-vsta
-		;;
-	iris | iris4d)
-		basic_machine=mips-sgi
-		case $os in
-		    -irix*)
-			;;
-		    *)
-			os=-irix4
-			;;
-		esac
-		;;
-	isi68 | isi)
-		basic_machine=m68k-isi
-		os=-sysv
-		;;
-	m68knommu)
-		basic_machine=m68k-unknown
-		os=-linux
-		;;
-	m68knommu-*)
-		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	m88k-omron*)
-		basic_machine=m88k-omron
-		;;
-	magnum | m3230)
-		basic_machine=mips-mips
-		os=-sysv
-		;;
-	merlin)
-		basic_machine=ns32k-utek
-		os=-sysv
-		;;
-        microblaze)
-		basic_machine=microblaze-xilinx
-		;;
-	mingw32)
-		basic_machine=i386-pc
-		os=-mingw32
-		;;
-	mingw32ce)
-		basic_machine=arm-unknown
-		os=-mingw32ce
-		;;
-	miniframe)
-		basic_machine=m68000-convergent
-		;;
-	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-	mips3*-*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
-		;;
-	mips3*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
-		;;
-	monitor)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	morphos)
-		basic_machine=powerpc-unknown
-		os=-morphos
-		;;
-	msdos)
-		basic_machine=i386-pc
-		os=-msdos
-		;;
-	ms1-*)
-		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
-		;;
-	mvs)
-		basic_machine=i370-ibm
-		os=-mvs
-		;;
-	ncr3000)
-		basic_machine=i486-ncr
-		os=-sysv4
-		;;
-	netbsd386)
-		basic_machine=i386-unknown
-		os=-netbsd
-		;;
-	netwinder)
-		basic_machine=armv4l-rebel
-		os=-linux
-		;;
-	news | news700 | news800 | news900)
-		basic_machine=m68k-sony
-		os=-newsos
-		;;
-	news1000)
-		basic_machine=m68030-sony
-		os=-newsos
-		;;
-	news-3600 | risc-news)
-		basic_machine=mips-sony
-		os=-newsos
-		;;
-	necv70)
-		basic_machine=v70-nec
-		os=-sysv
-		;;
-	next | m*-next )
-		basic_machine=m68k-next
-		case $os in
-		    -nextstep* )
-			;;
-		    -ns2*)
-		      os=-nextstep2
-			;;
-		    *)
-		      os=-nextstep3
-			;;
-		esac
-		;;
-	nh3000)
-		basic_machine=m68k-harris
-		os=-cxux
-		;;
-	nh[45]000)
-		basic_machine=m88k-harris
-		os=-cxux
-		;;
-	nindy960)
-		basic_machine=i960-intel
-		os=-nindy
-		;;
-	mon960)
-		basic_machine=i960-intel
-		os=-mon960
-		;;
-	nonstopux)
-		basic_machine=mips-compaq
-		os=-nonstopux
-		;;
-	np1)
-		basic_machine=np1-gould
-		;;
-	nsr-tandem)
-		basic_machine=nsr-tandem
-		;;
-	op50n-* | op60c-*)
-		basic_machine=hppa1.1-oki
-		os=-proelf
-		;;
-	openrisc | openrisc-*)
-		basic_machine=or32-unknown
-		;;
-	os400)
-		basic_machine=powerpc-ibm
-		os=-os400
-		;;
-	OSE68000 | ose68000)
-		basic_machine=m68000-ericsson
-		os=-ose
-		;;
-	os68k)
-		basic_machine=m68k-none
-		os=-os68k
-		;;
-	pa-hitachi)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	paragon)
-		basic_machine=i860-intel
-		os=-osf
-		;;
-	parisc)
-		basic_machine=hppa-unknown
-		os=-linux
-		;;
-	parisc-*)
-		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	pbd)
-		basic_machine=sparc-tti
-		;;
-	pbb)
-		basic_machine=m68k-tti
-		;;
-	pc532 | pc532-*)
-		basic_machine=ns32k-pc532
-		;;
-	pc98)
-		basic_machine=i386-pc
-		;;
-	pc98-*)
-		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium | p5 | k5 | k6 | nexgen | viac3)
-		basic_machine=i586-pc
-		;;
-	pentiumpro | p6 | 6x86 | athlon | athlon_*)
-		basic_machine=i686-pc
-		;;
-	pentiumii | pentium2 | pentiumiii | pentium3)
-		basic_machine=i686-pc
-		;;
-	pentium4)
-		basic_machine=i786-pc
-		;;
-	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
-		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumpro-* | p6-* | 6x86-* | athlon-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium4-*)
-		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pn)
-		basic_machine=pn-gould
-		;;
-	power)	basic_machine=power-ibm
-		;;
-	ppc)	basic_machine=powerpc-unknown
-		;;
-	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppcle | powerpclittle | ppc-le | powerpc-little)
-		basic_machine=powerpcle-unknown
-		;;
-	ppcle-* | powerpclittle-*)
-		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64)	basic_machine=powerpc64-unknown
-		;;
-	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
-		basic_machine=powerpc64le-unknown
-		;;
-	ppc64le-* | powerpc64little-*)
-		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ps2)
-		basic_machine=i386-ibm
-		;;
-	pw32)
-		basic_machine=i586-unknown
-		os=-pw32
-		;;
-	rdos)
-		basic_machine=i386-pc
-		os=-rdos
-		;;
-	rom68k)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	rm[46]00)
-		basic_machine=mips-siemens
-		;;
-	rtpc | rtpc-*)
-		basic_machine=romp-ibm
-		;;
-	s390 | s390-*)
-		basic_machine=s390-ibm
-		;;
-	s390x | s390x-*)
-		basic_machine=s390x-ibm
-		;;
-	sa29200)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	sb1)
-		basic_machine=mipsisa64sb1-unknown
-		;;
-	sb1el)
-		basic_machine=mipsisa64sb1el-unknown
-		;;
-	sde)
-		basic_machine=mipsisa32-sde
-		os=-elf
-		;;
-	sei)
-		basic_machine=mips-sei
-		os=-seiux
-		;;
-	sequent)
-		basic_machine=i386-sequent
-		;;
-	sh)
-		basic_machine=sh-hitachi
-		os=-hms
-		;;
-	sh5el)
-		basic_machine=sh5le-unknown
-		;;
-	sh64)
-		basic_machine=sh64-unknown
-		;;
-	sparclite-wrs | simso-wrs)
-		basic_machine=sparclite-wrs
-		os=-vxworks
-		;;
-	sps7)
-		basic_machine=m68k-bull
-		os=-sysv2
-		;;
-	spur)
-		basic_machine=spur-unknown
-		;;
-	st2000)
-		basic_machine=m68k-tandem
-		;;
-	stratus)
-		basic_machine=i860-stratus
-		os=-sysv4
-		;;
-	sun2)
-		basic_machine=m68000-sun
-		;;
-	sun2os3)
-		basic_machine=m68000-sun
-		os=-sunos3
-		;;
-	sun2os4)
-		basic_machine=m68000-sun
-		os=-sunos4
-		;;
-	sun3os3)
-		basic_machine=m68k-sun
-		os=-sunos3
-		;;
-	sun3os4)
-		basic_machine=m68k-sun
-		os=-sunos4
-		;;
-	sun4os3)
-		basic_machine=sparc-sun
-		os=-sunos3
-		;;
-	sun4os4)
-		basic_machine=sparc-sun
-		os=-sunos4
-		;;
-	sun4sol2)
-		basic_machine=sparc-sun
-		os=-solaris2
-		;;
-	sun3 | sun3-*)
-		basic_machine=m68k-sun
-		;;
-	sun4)
-		basic_machine=sparc-sun
-		;;
-	sun386 | sun386i | roadrunner)
-		basic_machine=i386-sun
-		;;
-	sv1)
-		basic_machine=sv1-cray
-		os=-unicos
-		;;
-	symmetry)
-		basic_machine=i386-sequent
-		os=-dynix
-		;;
-	t3e)
-		basic_machine=alphaev5-cray
-		os=-unicos
-		;;
-	t90)
-		basic_machine=t90-cray
-		os=-unicos
-		;;
-	tic54x | c54x*)
-		basic_machine=tic54x-unknown
-		os=-coff
-		;;
-	tic55x | c55x*)
-		basic_machine=tic55x-unknown
-		os=-coff
-		;;
-	tic6x | c6x*)
-		basic_machine=tic6x-unknown
-		os=-coff
-		;;
-        # This must be matched before tile*.
-        tilegx*)
-		basic_machine=tilegx-unknown
-		os=-linux-gnu
-		;;
-	tile*)
-		basic_machine=tile-unknown
-		os=-linux-gnu
-		;;
-	tx39)
-		basic_machine=mipstx39-unknown
-		;;
-	tx39el)
-		basic_machine=mipstx39el-unknown
-		;;
-	toad1)
-		basic_machine=pdp10-xkl
-		os=-tops20
-		;;
-	tower | tower-32)
-		basic_machine=m68k-ncr
-		;;
-	tpf)
-		basic_machine=s390x-ibm
-		os=-tpf
-		;;
-	udi29k)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	ultra3)
-		basic_machine=a29k-nyu
-		os=-sym1
-		;;
-	v810 | necv810)
-		basic_machine=v810-nec
-		os=-none
-		;;
-	vaxv)
-		basic_machine=vax-dec
-		os=-sysv
-		;;
-	vms)
-		basic_machine=vax-dec
-		os=-vms
-		;;
-	vpp*|vx|vx-*)
-		basic_machine=f301-fujitsu
-		;;
-	vxworks960)
-		basic_machine=i960-wrs
-		os=-vxworks
-		;;
-	vxworks68)
-		basic_machine=m68k-wrs
-		os=-vxworks
-		;;
-	vxworks29k)
-		basic_machine=a29k-wrs
-		os=-vxworks
-		;;
-	w65*)
-		basic_machine=w65-wdc
-		os=-none
-		;;
-	w89k-*)
-		basic_machine=hppa1.1-winbond
-		os=-proelf
-		;;
-	xbox)
-		basic_machine=i686-pc
-		os=-mingw32
-		;;
-	xps | xps100)
-		basic_machine=xps100-honeywell
-		;;
-	ymp)
-		basic_machine=ymp-cray
-		os=-unicos
-		;;
-	z8k-*-coff)
-		basic_machine=z8k-unknown
-		os=-sim
-		;;
-	z80-*-coff)
-		basic_machine=z80-unknown
-		os=-sim
-		;;
-	none)
-		basic_machine=none-none
-		os=-none
-		;;
-
-# Here we handle the default manufacturer of certain CPU types.  It is in
-# some cases the only manufacturer, in others, it is the most popular.
-	w89k)
-		basic_machine=hppa1.1-winbond
-		;;
-	op50n)
-		basic_machine=hppa1.1-oki
-		;;
-	op60c)
-		basic_machine=hppa1.1-oki
-		;;
-	romp)
-		basic_machine=romp-ibm
-		;;
-	mmix)
-		basic_machine=mmix-knuth
-		;;
-	rs6000)
-		basic_machine=rs6000-ibm
-		;;
-	vax)
-		basic_machine=vax-dec
-		;;
-	pdp10)
-		# there are many clones, so DEC is not a safe bet
-		basic_machine=pdp10-unknown
-		;;
-	pdp11)
-		basic_machine=pdp11-dec
-		;;
-	we32k)
-		basic_machine=we32k-att
-		;;
-	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
-		basic_machine=sh-unknown
-		;;
-	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
-		basic_machine=sparc-sun
-		;;
-	cydra)
-		basic_machine=cydra-cydrome
-		;;
-	orion)
-		basic_machine=orion-highlevel
-		;;
-	orion105)
-		basic_machine=clipper-highlevel
-		;;
-	mac | mpw | mac-mpw)
-		basic_machine=m68k-apple
-		;;
-	pmac | pmac-mpw)
-		basic_machine=powerpc-apple
-		;;
-	*-unknown)
-		# Make sure to match an already-canonicalized machine name.
-		;;
-	*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
-	*-digital*)
-		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
-		;;
-	*-commodore*)
-		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
-		;;
-	*)
-		;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
-        # First match some system type aliases
-        # that might get confused with valid system types.
-	# -solaris* is a basic system type, with this one exception.
-        -auroraux)
-	        os=-auroraux
-		;;
-	-solaris1 | -solaris1.*)
-		os=`echo $os | sed -e 's|solaris1|sunos4|'`
-		;;
-	-solaris)
-		os=-solaris2
-		;;
-	-svr4*)
-		os=-sysv4
-		;;
-	-unixware*)
-		os=-sysv4.2uw
-		;;
-	-gnu/linux*)
-		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
-		;;
-	# First accept the basic system types.
-	# The portable systems comes first.
-	# Each alternative MUST END IN A *, to match a version number.
-	# -sysv* is not here because it comes later, after sysvr4.
-	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
-	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
-	      | -sym* | -kopensolaris* \
-	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* | -aros* \
-	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
-	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
-	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -openbsd* | -solidbsd* \
-	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
-	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
-	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
-	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-	      | -chorusos* | -chorusrdb* | -cegcc* \
-	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
-	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
-	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
-	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
-	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
-	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
-	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
-	# Remember, each alternative MUST END IN *, to match a version number.
-		;;
-	-qnx*)
-		case $basic_machine in
-		    x86-* | i*86-*)
-			;;
-		    *)
-			os=-nto$os
-			;;
-		esac
-		;;
-	-nto-qnx*)
-		;;
-	-nto*)
-		os=`echo $os | sed -e 's|nto|nto-qnx|'`
-		;;
-	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
-	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
-	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
-		;;
-	-mac*)
-		os=`echo $os | sed -e 's|mac|macos|'`
-		;;
-	-linux-dietlibc)
-		os=-linux-dietlibc
-		;;
-	-linux*)
-		os=`echo $os | sed -e 's|linux|linux-gnu|'`
-		;;
-	-sunos5*)
-		os=`echo $os | sed -e 's|sunos5|solaris2|'`
-		;;
-	-sunos6*)
-		os=`echo $os | sed -e 's|sunos6|solaris3|'`
-		;;
-	-opened*)
-		os=-openedition
-		;;
-        -os400*)
-		os=-os400
-		;;
-	-wince*)
-		os=-wince
-		;;
-	-osfrose*)
-		os=-osfrose
-		;;
-	-osf*)
-		os=-osf
-		;;
-	-utek*)
-		os=-bsd
-		;;
-	-dynix*)
-		os=-bsd
-		;;
-	-acis*)
-		os=-aos
-		;;
-	-atheos*)
-		os=-atheos
-		;;
-	-syllable*)
-		os=-syllable
-		;;
-	-386bsd)
-		os=-bsd
-		;;
-	-ctix* | -uts*)
-		os=-sysv
-		;;
-	-nova*)
-		os=-rtmk-nova
-		;;
-	-ns2 )
-		os=-nextstep2
-		;;
-	-nsk*)
-		os=-nsk
-		;;
-	# Preserve the version number of sinix5.
-	-sinix5.*)
-		os=`echo $os | sed -e 's|sinix|sysv|'`
-		;;
-	-sinix*)
-		os=-sysv4
-		;;
-        -tpf*)
-		os=-tpf
-		;;
-	-triton*)
-		os=-sysv3
-		;;
-	-oss*)
-		os=-sysv3
-		;;
-	-svr4)
-		os=-sysv4
-		;;
-	-svr3)
-		os=-sysv3
-		;;
-	-sysvr4)
-		os=-sysv4
-		;;
-	# This must come after -sysvr4.
-	-sysv*)
-		;;
-	-ose*)
-		os=-ose
-		;;
-	-es1800*)
-		os=-ose
-		;;
-	-xenix)
-		os=-xenix
-		;;
-	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-		os=-mint
-		;;
-	-aros*)
-		os=-aros
-		;;
-	-kaos*)
-		os=-kaos
-		;;
-	-zvmoe)
-		os=-zvmoe
-		;;
-	-dicos*)
-		os=-dicos
-		;;
-        -nacl*)
-	        ;;
-	-none)
-		;;
-	*)
-		# Get rid of the `-' at the beginning of $os.
-		os=`echo $os | sed 's/[^-]*-//'`
-		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
-		exit 1
-		;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system.  Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
-        score-*)
-		os=-elf
-		;;
-        spu-*)
-		os=-elf
-		;;
-	*-acorn)
-		os=-riscix1.2
-		;;
-	arm*-rebel)
-		os=-linux
-		;;
-	arm*-semi)
-		os=-aout
-		;;
-        c4x-* | tic4x-*)
-        	os=-coff
-		;;
-	# This must come before the *-dec entry.
-	pdp10-*)
-		os=-tops20
-		;;
-	pdp11-*)
-		os=-none
-		;;
-	*-dec | vax-*)
-		os=-ultrix4.2
-		;;
-	m68*-apollo)
-		os=-domain
-		;;
-	i386-sun)
-		os=-sunos4.0.2
-		;;
-	m68000-sun)
-		os=-sunos3
-		# This also exists in the configure program, but was not the
-		# default.
-		# os=-sunos4
-		;;
-	m68*-cisco)
-		os=-aout
-		;;
-        mep-*)
-		os=-elf
-		;;
-	mips*-cisco)
-		os=-elf
-		;;
-	mips*-*)
-		os=-elf
-		;;
-	or32-*)
-		os=-coff
-		;;
-	*-tti)	# must be before sparc entry or we get the wrong os.
-		os=-sysv3
-		;;
-	sparc-* | *-sun)
-		os=-sunos4.1.1
-		;;
-	*-be)
-		os=-beos
-		;;
-	*-haiku)
-		os=-haiku
-		;;
-	*-ibm)
-		os=-aix
-		;;
-    	*-knuth)
-		os=-mmixware
-		;;
-	*-wec)
-		os=-proelf
-		;;
-	*-winbond)
-		os=-proelf
-		;;
-	*-oki)
-		os=-proelf
-		;;
-	*-hp)
-		os=-hpux
-		;;
-	*-hitachi)
-		os=-hiux
-		;;
-	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
-		os=-sysv
-		;;
-	*-cbm)
-		os=-amigaos
-		;;
-	*-dg)
-		os=-dgux
-		;;
-	*-dolphin)
-		os=-sysv3
-		;;
-	m68k-ccur)
-		os=-rtu
-		;;
-	m88k-omron*)
-		os=-luna
-		;;
-	*-next )
-		os=-nextstep
-		;;
-	*-sequent)
-		os=-ptx
-		;;
-	*-crds)
-		os=-unos
-		;;
-	*-ns)
-		os=-genix
-		;;
-	i370-*)
-		os=-mvs
-		;;
-	*-next)
-		os=-nextstep3
-		;;
-	*-gould)
-		os=-sysv
-		;;
-	*-highlevel)
-		os=-bsd
-		;;
-	*-encore)
-		os=-bsd
-		;;
-	*-sgi)
-		os=-irix
-		;;
-	*-siemens)
-		os=-sysv4
-		;;
-	*-masscomp)
-		os=-rtu
-		;;
-	f30[01]-fujitsu | f700-fujitsu)
-		os=-uxpv
-		;;
-	*-rom68k)
-		os=-coff
-		;;
-	*-*bug)
-		os=-coff
-		;;
-	*-apple)
-		os=-macos
-		;;
-	*-atari*)
-		os=-mint
-		;;
-	*)
-		os=-none
-		;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer.  We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
-	*-unknown)
-		case $os in
-			-riscix*)
-				vendor=acorn
-				;;
-			-sunos*)
-				vendor=sun
-				;;
-			-cnk*|-aix*)
-				vendor=ibm
-				;;
-			-beos*)
-				vendor=be
-				;;
-			-hpux*)
-				vendor=hp
-				;;
-			-mpeix*)
-				vendor=hp
-				;;
-			-hiux*)
-				vendor=hitachi
-				;;
-			-unos*)
-				vendor=crds
-				;;
-			-dgux*)
-				vendor=dg
-				;;
-			-luna*)
-				vendor=omron
-				;;
-			-genix*)
-				vendor=ns
-				;;
-			-mvs* | -opened*)
-				vendor=ibm
-				;;
-			-os400*)
-				vendor=ibm
-				;;
-			-ptx*)
-				vendor=sequent
-				;;
-			-tpf*)
-				vendor=ibm
-				;;
-			-vxsim* | -vxworks* | -windiss*)
-				vendor=wrs
-				;;
-			-aux*)
-				vendor=apple
-				;;
-			-hms*)
-				vendor=hitachi
-				;;
-			-mpw* | -macos*)
-				vendor=apple
-				;;
-			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-				vendor=atari
-				;;
-			-vos*)
-				vendor=stratus
-				;;
-		esac
-		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
-		;;
-esac
-
-echo $basic_machine$os
-exit
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/cloog-0.17.0/osl/autoconf/depcomp b/cloog-0.17.0/osl/autoconf/depcomp
deleted file mode 100755
index df8eea7..0000000
--- a/cloog-0.17.0/osl/autoconf/depcomp
+++ /dev/null
@@ -1,630 +0,0 @@
-#! /bin/sh
-# depcomp - compile a program generating dependencies as side-effects
-
-scriptversion=2009-04-28.21; # UTC
-
-# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
-# Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
-
-case $1 in
-  '')
-     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
-     exit 1;
-     ;;
-  -h | --h*)
-    cat <<\EOF
-Usage: depcomp [--help] [--version] PROGRAM [ARGS]
-
-Run PROGRAMS ARGS to compile a file, generating dependencies
-as side-effects.
-
-Environment variables:
-  depmode     Dependency tracking mode.
-  source      Source file read by `PROGRAMS ARGS'.
-  object      Object file output by `PROGRAMS ARGS'.
-  DEPDIR      directory where to store dependencies.
-  depfile     Dependency file to output.
-  tmpdepfile  Temporary file to use when outputing dependencies.
-  libtool     Whether libtool is used (yes/no).
-
-Report bugs to <bug-automake@gnu.org>.
-EOF
-    exit $?
-    ;;
-  -v | --v*)
-    echo "depcomp $scriptversion"
-    exit $?
-    ;;
-esac
-
-if test -z "$depmode" || test -z "$source" || test -z "$object"; then
-  echo "depcomp: Variables source, object and depmode must be set" 1>&2
-  exit 1
-fi
-
-# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
-depfile=${depfile-`echo "$object" |
-  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
-tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
-
-rm -f "$tmpdepfile"
-
-# Some modes work just like other modes, but use different flags.  We
-# parameterize here, but still list the modes in the big case below,
-# to make depend.m4 easier to write.  Note that we *cannot* use a case
-# here, because this file can only contain one case statement.
-if test "$depmode" = hp; then
-  # HP compiler uses -M and no extra arg.
-  gccflag=-M
-  depmode=gcc
-fi
-
-if test "$depmode" = dashXmstdout; then
-   # This is just like dashmstdout with a different argument.
-   dashmflag=-xM
-   depmode=dashmstdout
-fi
-
-cygpath_u="cygpath -u -f -"
-if test "$depmode" = msvcmsys; then
-   # This is just like msvisualcpp but w/o cygpath translation.
-   # Just convert the backslash-escaped backslashes to single forward
-   # slashes to satisfy depend.m4
-   cygpath_u="sed s,\\\\\\\\,/,g"
-   depmode=msvisualcpp
-fi
-
-case "$depmode" in
-gcc3)
-## gcc 3 implements dependency tracking that does exactly what
-## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
-## it if -MD -MP comes after the -MF stuff.  Hmm.
-## Unfortunately, FreeBSD c89 acceptance of flags depends upon
-## the command line argument order; so add the flags where they
-## appear in depend2.am.  Note that the slowdown incurred here
-## affects only configure: in makefiles, %FASTDEP% shortcuts this.
-  for arg
-  do
-    case $arg in
-    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
-    *)  set fnord "$@" "$arg" ;;
-    esac
-    shift # fnord
-    shift # $arg
-  done
-  "$@"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  mv "$tmpdepfile" "$depfile"
-  ;;
-
-gcc)
-## There are various ways to get dependency output from gcc.  Here's
-## why we pick this rather obscure method:
-## - Don't want to use -MD because we'd like the dependencies to end
-##   up in a subdir.  Having to rename by hand is ugly.
-##   (We might end up doing this anyway to support other compilers.)
-## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
-##   -MM, not -M (despite what the docs say).
-## - Using -M directly means running the compiler twice (even worse
-##   than renaming).
-  if test -z "$gccflag"; then
-    gccflag=-MD,
-  fi
-  "$@" -Wp,"$gccflag$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
-## The second -e expression handles DOS-style file names with drive letters.
-  sed -e 's/^[^:]*: / /' \
-      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the `deleted header file' problem.
-## The problem is that when a header file which appears in a .P file
-## is deleted, the dependency causes make to die (because there is
-## typically no way to rebuild the header).  We avoid this by adding
-## dummy dependencies for each header file.  Too bad gcc doesn't do
-## this for us directly.
-  tr ' ' '
-' < "$tmpdepfile" |
-## Some versions of gcc put a space before the `:'.  On the theory
-## that the space means something, we add a space to the output as
-## well.
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-hp)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-sgi)
-  if test "$libtool" = yes; then
-    "$@" "-Wp,-MDupdate,$tmpdepfile"
-  else
-    "$@" -MDupdate "$tmpdepfile"
-  fi
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-
-  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
-    echo "$object : \\" > "$depfile"
-
-    # Clip off the initial element (the dependent).  Don't try to be
-    # clever and replace this with sed code, as IRIX sed won't handle
-    # lines with more than a fixed number of characters (4096 in
-    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
-    # the IRIX cc adds comments like `#:fec' to the end of the
-    # dependency line.
-    tr ' ' '
-' < "$tmpdepfile" \
-    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
-    tr '
-' ' ' >> "$depfile"
-    echo >> "$depfile"
-
-    # The second pass generates a dummy entry for each header file.
-    tr ' ' '
-' < "$tmpdepfile" \
-   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
-   >> "$depfile"
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile"
-  ;;
-
-aix)
-  # The C for AIX Compiler uses -M and outputs the dependencies
-  # in a .u file.  In older versions, this file always lives in the
-  # current directory.  Also, the AIX compiler puts `$object:' at the
-  # start of each line; $object doesn't have directory information.
-  # Version 6 uses the directory in both cases.
-  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-  test "x$dir" = "x$object" && dir=
-  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-  if test "$libtool" = yes; then
-    tmpdepfile1=$dir$base.u
-    tmpdepfile2=$base.u
-    tmpdepfile3=$dir.libs/$base.u
-    "$@" -Wc,-M
-  else
-    tmpdepfile1=$dir$base.u
-    tmpdepfile2=$dir$base.u
-    tmpdepfile3=$dir$base.u
-    "$@" -M
-  fi
-  stat=$?
-
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
-    exit $stat
-  fi
-
-  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
-  do
-    test -f "$tmpdepfile" && break
-  done
-  if test -f "$tmpdepfile"; then
-    # Each line is of the form `foo.o: dependent.h'.
-    # Do two passes, one to just change these to
-    # `$object: dependent.h' and one to simply `dependent.h:'.
-    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-    # That's a tab and a space in the [].
-    sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile"
-  ;;
-
-icc)
-  # Intel's C compiler understands `-MD -MF file'.  However on
-  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
-  # ICC 7.0 will fill foo.d with something like
-  #    foo.o: sub/foo.c
-  #    foo.o: sub/foo.h
-  # which is wrong.  We want:
-  #    sub/foo.o: sub/foo.c
-  #    sub/foo.o: sub/foo.h
-  #    sub/foo.c:
-  #    sub/foo.h:
-  # ICC 7.1 will output
-  #    foo.o: sub/foo.c sub/foo.h
-  # and will wrap long lines using \ :
-  #    foo.o: sub/foo.c ... \
-  #     sub/foo.h ... \
-  #     ...
-
-  "$@" -MD -MF "$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  # Each line is of the form `foo.o: dependent.h',
-  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
-  # Do two passes, one to just change these to
-  # `$object: dependent.h' and one to simply `dependent.h:'.
-  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
-  # Some versions of the HPUX 10.20 sed can't process this invocation
-  # correctly.  Breaking it into two sed invocations is a workaround.
-  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
-    sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-hp2)
-  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
-  # compilers, which have integrated preprocessors.  The correct option
-  # to use with these is +Maked; it writes dependencies to a file named
-  # 'foo.d', which lands next to the object file, wherever that
-  # happens to be.
-  # Much of this is similar to the tru64 case; see comments there.
-  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-  test "x$dir" = "x$object" && dir=
-  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-  if test "$libtool" = yes; then
-    tmpdepfile1=$dir$base.d
-    tmpdepfile2=$dir.libs/$base.d
-    "$@" -Wc,+Maked
-  else
-    tmpdepfile1=$dir$base.d
-    tmpdepfile2=$dir$base.d
-    "$@" +Maked
-  fi
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-     rm -f "$tmpdepfile1" "$tmpdepfile2"
-     exit $stat
-  fi
-
-  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
-  do
-    test -f "$tmpdepfile" && break
-  done
-  if test -f "$tmpdepfile"; then
-    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
-    # Add `dependent.h:' lines.
-    sed -ne '2,${
-	       s/^ *//
-	       s/ \\*$//
-	       s/$/:/
-	       p
-	     }' "$tmpdepfile" >> "$depfile"
-  else
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile" "$tmpdepfile2"
-  ;;
-
-tru64)
-   # The Tru64 compiler uses -MD to generate dependencies as a side
-   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
-   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
-   # dependencies in `foo.d' instead, so we check for that too.
-   # Subdirectories are respected.
-   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-   test "x$dir" = "x$object" && dir=
-   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-
-   if test "$libtool" = yes; then
-      # With Tru64 cc, shared objects can also be used to make a
-      # static library.  This mechanism is used in libtool 1.4 series to
-      # handle both shared and static libraries in a single compilation.
-      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
-      #
-      # With libtool 1.5 this exception was removed, and libtool now
-      # generates 2 separate objects for the 2 libraries.  These two
-      # compilations output dependencies in $dir.libs/$base.o.d and
-      # in $dir$base.o.d.  We have to check for both files, because
-      # one of the two compilations can be disabled.  We should prefer
-      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
-      # automatically cleaned when .libs/ is deleted, while ignoring
-      # the former would cause a distcleancheck panic.
-      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
-      tmpdepfile2=$dir$base.o.d          # libtool 1.5
-      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
-      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
-      "$@" -Wc,-MD
-   else
-      tmpdepfile1=$dir$base.o.d
-      tmpdepfile2=$dir$base.d
-      tmpdepfile3=$dir$base.d
-      tmpdepfile4=$dir$base.d
-      "$@" -MD
-   fi
-
-   stat=$?
-   if test $stat -eq 0; then :
-   else
-      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-      exit $stat
-   fi
-
-   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-   do
-     test -f "$tmpdepfile" && break
-   done
-   if test -f "$tmpdepfile"; then
-      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-      # That's a tab and a space in the [].
-      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-   else
-      echo "#dummy" > "$depfile"
-   fi
-   rm -f "$tmpdepfile"
-   ;;
-
-#nosideeffect)
-  # This comment above is used by automake to tell side-effect
-  # dependency tracking mechanisms from slower ones.
-
-dashmstdout)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout, regardless of -o.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove `-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  test -z "$dashmflag" && dashmflag=-M
-  # Require at least two characters before searching for `:'
-  # in the target name.  This is to cope with DOS-style filenames:
-  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
-  "$@" $dashmflag |
-    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
-  rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  tr ' ' '
-' < "$tmpdepfile" | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-dashXmstdout)
-  # This case only exists to satisfy depend.m4.  It is never actually
-  # run, as this mode is specially recognized in the preamble.
-  exit 1
-  ;;
-
-makedepend)
-  "$@" || exit $?
-  # Remove any Libtool call
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-  # X makedepend
-  shift
-  cleared=no eat=no
-  for arg
-  do
-    case $cleared in
-    no)
-      set ""; shift
-      cleared=yes ;;
-    esac
-    if test $eat = yes; then
-      eat=no
-      continue
-    fi
-    case "$arg" in
-    -D*|-I*)
-      set fnord "$@" "$arg"; shift ;;
-    # Strip any option that makedepend may not understand.  Remove
-    # the object too, otherwise makedepend will parse it as a source file.
-    -arch)
-      eat=yes ;;
-    -*|$object)
-      ;;
-    *)
-      set fnord "$@" "$arg"; shift ;;
-    esac
-  done
-  obj_suffix=`echo "$object" | sed 's/^.*\././'`
-  touch "$tmpdepfile"
-  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
-  rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  sed '1,2d' "$tmpdepfile" | tr ' ' '
-' | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile" "$tmpdepfile".bak
-  ;;
-
-cpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove `-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  "$@" -E |
-    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
-       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
-    sed '$ s: \\$::' > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  cat < "$tmpdepfile" >> "$depfile"
-  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-msvisualcpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  IFS=" "
-  for arg
-  do
-    case "$arg" in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
-	set fnord "$@"
-	shift
-	shift
-	;;
-    *)
-	set fnord "$@" "$arg"
-	shift
-	shift
-	;;
-    esac
-  done
-  "$@" -E 2>/dev/null |
-  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
-  echo "	" >> "$depfile"
-  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-msvcmsys)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-none)
-  exec "$@"
-  ;;
-
-*)
-  echo "Unknown depmode $depmode" 1>&2
-  exit 1
-  ;;
-esac
-
-exit 0
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/cloog-0.17.0/osl/autoconf/install-sh b/cloog-0.17.0/osl/autoconf/install-sh
deleted file mode 100755
index 6781b98..0000000
--- a/cloog-0.17.0/osl/autoconf/install-sh
+++ /dev/null
@@ -1,520 +0,0 @@
-#!/bin/sh
-# install - install a program, script, or datafile
-
-scriptversion=2009-04-28.21; # UTC
-
-# This originates from X11R5 (mit/util/scripts/install.sh), which was
-# later released in X11R6 (xc/config/util/install.sh) with the
-# following copyright and license.
-#
-# Copyright (C) 1994 X Consortium
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
-# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-# Except as contained in this notice, the name of the X Consortium shall not
-# be used in advertising or otherwise to promote the sale, use or other deal-
-# ings in this Software without prior written authorization from the X Consor-
-# tium.
-#
-#
-# FSF changes to this file are in the public domain.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.
-
-nl='
-'
-IFS=" ""	$nl"
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit=${DOITPROG-}
-if test -z "$doit"; then
-  doit_exec=exec
-else
-  doit_exec=$doit
-fi
-
-# Put in absolute file names if you don't have them in your path;
-# or use environment vars.
-
-chgrpprog=${CHGRPPROG-chgrp}
-chmodprog=${CHMODPROG-chmod}
-chownprog=${CHOWNPROG-chown}
-cmpprog=${CMPPROG-cmp}
-cpprog=${CPPROG-cp}
-mkdirprog=${MKDIRPROG-mkdir}
-mvprog=${MVPROG-mv}
-rmprog=${RMPROG-rm}
-stripprog=${STRIPPROG-strip}
-
-posix_glob='?'
-initialize_posix_glob='
-  test "$posix_glob" != "?" || {
-    if (set -f) 2>/dev/null; then
-      posix_glob=
-    else
-      posix_glob=:
-    fi
-  }
-'
-
-posix_mkdir=
-
-# Desired mode of installed file.
-mode=0755
-
-chgrpcmd=
-chmodcmd=$chmodprog
-chowncmd=
-mvcmd=$mvprog
-rmcmd="$rmprog -f"
-stripcmd=
-
-src=
-dst=
-dir_arg=
-dst_arg=
-
-copy_on_change=false
-no_target_directory=
-
-usage="\
-Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
-   or: $0 [OPTION]... SRCFILES... DIRECTORY
-   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
-   or: $0 [OPTION]... -d DIRECTORIES...
-
-In the 1st form, copy SRCFILE to DSTFILE.
-In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
-In the 4th, create DIRECTORIES.
-
-Options:
-     --help     display this help and exit.
-     --version  display version info and exit.
-
-  -c            (ignored)
-  -C            install only if different (preserve the last data modification time)
-  -d            create directories instead of installing files.
-  -g GROUP      $chgrpprog installed files to GROUP.
-  -m MODE       $chmodprog installed files to MODE.
-  -o USER       $chownprog installed files to USER.
-  -s            $stripprog installed files.
-  -t DIRECTORY  install into DIRECTORY.
-  -T            report an error if DSTFILE is a directory.
-
-Environment variables override the default commands:
-  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
-  RMPROG STRIPPROG
-"
-
-while test $# -ne 0; do
-  case $1 in
-    -c) ;;
-
-    -C) copy_on_change=true;;
-
-    -d) dir_arg=true;;
-
-    -g) chgrpcmd="$chgrpprog $2"
-	shift;;
-
-    --help) echo "$usage"; exit $?;;
-
-    -m) mode=$2
-	case $mode in
-	  *' '* | *'	'* | *'
-'*	  | *'*'* | *'?'* | *'['*)
-	    echo "$0: invalid mode: $mode" >&2
-	    exit 1;;
-	esac
-	shift;;
-
-    -o) chowncmd="$chownprog $2"
-	shift;;
-
-    -s) stripcmd=$stripprog;;
-
-    -t) dst_arg=$2
-	shift;;
-
-    -T) no_target_directory=true;;
-
-    --version) echo "$0 $scriptversion"; exit $?;;
-
-    --)	shift
-	break;;
-
-    -*)	echo "$0: invalid option: $1" >&2
-	exit 1;;
-
-    *)  break;;
-  esac
-  shift
-done
-
-if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
-  # When -d is used, all remaining arguments are directories to create.
-  # When -t is used, the destination is already specified.
-  # Otherwise, the last argument is the destination.  Remove it from $@.
-  for arg
-  do
-    if test -n "$dst_arg"; then
-      # $@ is not empty: it contains at least $arg.
-      set fnord "$@" "$dst_arg"
-      shift # fnord
-    fi
-    shift # arg
-    dst_arg=$arg
-  done
-fi
-
-if test $# -eq 0; then
-  if test -z "$dir_arg"; then
-    echo "$0: no input file specified." >&2
-    exit 1
-  fi
-  # It's OK to call `install-sh -d' without argument.
-  # This can happen when creating conditional directories.
-  exit 0
-fi
-
-if test -z "$dir_arg"; then
-  trap '(exit $?); exit' 1 2 13 15
-
-  # Set umask so as not to create temps with too-generous modes.
-  # However, 'strip' requires both read and write access to temps.
-  case $mode in
-    # Optimize common cases.
-    *644) cp_umask=133;;
-    *755) cp_umask=22;;
-
-    *[0-7])
-      if test -z "$stripcmd"; then
-	u_plus_rw=
-      else
-	u_plus_rw='% 200'
-      fi
-      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
-    *)
-      if test -z "$stripcmd"; then
-	u_plus_rw=
-      else
-	u_plus_rw=,u+rw
-      fi
-      cp_umask=$mode$u_plus_rw;;
-  esac
-fi
-
-for src
-do
-  # Protect names starting with `-'.
-  case $src in
-    -*) src=./$src;;
-  esac
-
-  if test -n "$dir_arg"; then
-    dst=$src
-    dstdir=$dst
-    test -d "$dstdir"
-    dstdir_status=$?
-  else
-
-    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
-    # might cause directories to be created, which would be especially bad
-    # if $src (and thus $dsttmp) contains '*'.
-    if test ! -f "$src" && test ! -d "$src"; then
-      echo "$0: $src does not exist." >&2
-      exit 1
-    fi
-
-    if test -z "$dst_arg"; then
-      echo "$0: no destination specified." >&2
-      exit 1
-    fi
-
-    dst=$dst_arg
-    # Protect names starting with `-'.
-    case $dst in
-      -*) dst=./$dst;;
-    esac
-
-    # If destination is a directory, append the input filename; won't work
-    # if double slashes aren't ignored.
-    if test -d "$dst"; then
-      if test -n "$no_target_directory"; then
-	echo "$0: $dst_arg: Is a directory" >&2
-	exit 1
-      fi
-      dstdir=$dst
-      dst=$dstdir/`basename "$src"`
-      dstdir_status=0
-    else
-      # Prefer dirname, but fall back on a substitute if dirname fails.
-      dstdir=`
-	(dirname "$dst") 2>/dev/null ||
-	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	     X"$dst" : 'X\(//\)[^/]' \| \
-	     X"$dst" : 'X\(//\)$' \| \
-	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
-	echo X"$dst" |
-	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)[^/].*/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\).*/{
-		   s//\1/
-		   q
-		 }
-		 s/.*/./; q'
-      `
-
-      test -d "$dstdir"
-      dstdir_status=$?
-    fi
-  fi
-
-  obsolete_mkdir_used=false
-
-  if test $dstdir_status != 0; then
-    case $posix_mkdir in
-      '')
-	# Create intermediate dirs using mode 755 as modified by the umask.
-	# This is like FreeBSD 'install' as of 1997-10-28.
-	umask=`umask`
-	case $stripcmd.$umask in
-	  # Optimize common cases.
-	  *[2367][2367]) mkdir_umask=$umask;;
-	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
-	  *[0-7])
-	    mkdir_umask=`expr $umask + 22 \
-	      - $umask % 100 % 40 + $umask % 20 \
-	      - $umask % 10 % 4 + $umask % 2
-	    `;;
-	  *) mkdir_umask=$umask,go-w;;
-	esac
-
-	# With -d, create the new directory with the user-specified mode.
-	# Otherwise, rely on $mkdir_umask.
-	if test -n "$dir_arg"; then
-	  mkdir_mode=-m$mode
-	else
-	  mkdir_mode=
-	fi
-
-	posix_mkdir=false
-	case $umask in
-	  *[123567][0-7][0-7])
-	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
-	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-	    ;;
-	  *)
-	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-	    if (umask $mkdir_umask &&
-		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
-	    then
-	      if test -z "$dir_arg" || {
-		   # Check for POSIX incompatibilities with -m.
-		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-		   # other-writeable bit of parent directory when it shouldn't.
-		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
-		   case $ls_ld_tmpdir in
-		     d????-?r-*) different_mode=700;;
-		     d????-?--*) different_mode=755;;
-		     *) false;;
-		   esac &&
-		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
-		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
-		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-		   }
-		 }
-	      then posix_mkdir=:
-	      fi
-	      rmdir "$tmpdir/d" "$tmpdir"
-	    else
-	      # Remove any dirs left behind by ancient mkdir implementations.
-	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
-	    fi
-	    trap '' 0;;
-	esac;;
-    esac
-
-    if
-      $posix_mkdir && (
-	umask $mkdir_umask &&
-	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
-      )
-    then :
-    else
-
-      # The umask is ridiculous, or mkdir does not conform to POSIX,
-      # or it failed possibly due to a race condition.  Create the
-      # directory the slow way, step by step, checking for races as we go.
-
-      case $dstdir in
-	/*) prefix='/';;
-	-*) prefix='./';;
-	*)  prefix='';;
-      esac
-
-      eval "$initialize_posix_glob"
-
-      oIFS=$IFS
-      IFS=/
-      $posix_glob set -f
-      set fnord $dstdir
-      shift
-      $posix_glob set +f
-      IFS=$oIFS
-
-      prefixes=
-
-      for d
-      do
-	test -z "$d" && continue
-
-	prefix=$prefix$d
-	if test -d "$prefix"; then
-	  prefixes=
-	else
-	  if $posix_mkdir; then
-	    (umask=$mkdir_umask &&
-	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-	    # Don't fail if two instances are running concurrently.
-	    test -d "$prefix" || exit 1
-	  else
-	    case $prefix in
-	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-	      *) qprefix=$prefix;;
-	    esac
-	    prefixes="$prefixes '$qprefix'"
-	  fi
-	fi
-	prefix=$prefix/
-      done
-
-      if test -n "$prefixes"; then
-	# Don't fail if two instances are running concurrently.
-	(umask $mkdir_umask &&
-	 eval "\$doit_exec \$mkdirprog $prefixes") ||
-	  test -d "$dstdir" || exit 1
-	obsolete_mkdir_used=true
-      fi
-    fi
-  fi
-
-  if test -n "$dir_arg"; then
-    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
-    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
-      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
-  else
-
-    # Make a couple of temp file names in the proper directory.
-    dsttmp=$dstdir/_inst.$$_
-    rmtmp=$dstdir/_rm.$$_
-
-    # Trap to clean up those temp files at exit.
-    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
-
-    # Copy the file name to the temp name.
-    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
-
-    # and set any options; do chmod last to preserve setuid bits.
-    #
-    # If any of these fail, we abort the whole thing.  If we want to
-    # ignore errors from any of these, just make sure not to ignore
-    # errors from the above "$doit $cpprog $src $dsttmp" command.
-    #
-    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
-    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
-    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
-
-    # If -C, don't bother to copy if it wouldn't change the file.
-    if $copy_on_change &&
-       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
-       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
-
-       eval "$initialize_posix_glob" &&
-       $posix_glob set -f &&
-       set X $old && old=:$2:$4:$5:$6 &&
-       set X $new && new=:$2:$4:$5:$6 &&
-       $posix_glob set +f &&
-
-       test "$old" = "$new" &&
-       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
-    then
-      rm -f "$dsttmp"
-    else
-      # Rename the file to the real destination.
-      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
-
-      # The rename failed, perhaps because mv can't rename something else
-      # to itself, or perhaps because mv is so ancient that it does not
-      # support -f.
-      {
-	# Now remove or move aside any old file at destination location.
-	# We try this two ways since rm can't unlink itself on some
-	# systems and the destination file might be busy for other
-	# reasons.  In this case, the final cleanup might fail but the new
-	# file should still install successfully.
-	{
-	  test ! -f "$dst" ||
-	  $doit $rmcmd -f "$dst" 2>/dev/null ||
-	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
-	  } ||
-	  { echo "$0: cannot unlink or rename $dst" >&2
-	    (exit 1); exit 1
-	  }
-	} &&
-
-	# Now rename the file to the real destination.
-	$doit $mvcmd "$dsttmp" "$dst"
-      }
-    fi || exit 1
-
-    trap '' 0
-  fi
-done
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/cloog-0.17.0/osl/autoconf/libtool.m4 b/cloog-0.17.0/osl/autoconf/libtool.m4
deleted file mode 100644
index a3fee53..0000000
--- a/cloog-0.17.0/osl/autoconf/libtool.m4
+++ /dev/null
@@ -1,7377 +0,0 @@
-# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
-#
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008 Free Software Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-m4_define([_LT_COPYING], [dnl
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008 Free Software Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-])
-
-# serial 56 LT_INIT
-
-
-# LT_PREREQ(VERSION)
-# ------------------
-# Complain and exit if this libtool version is less that VERSION.
-m4_defun([LT_PREREQ],
-[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
-       [m4_default([$3],
-		   [m4_fatal([Libtool version $1 or higher is required],
-		             63)])],
-       [$2])])
-
-
-# _LT_CHECK_BUILDDIR
-# ------------------
-# Complain if the absolute build directory name contains unusual characters
-m4_defun([_LT_CHECK_BUILDDIR],
-[case `pwd` in
-  *\ * | *\	*)
-    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
-esac
-])
-
-
-# LT_INIT([OPTIONS])
-# ------------------
-AC_DEFUN([LT_INIT],
-[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
-AC_BEFORE([$0], [LT_LANG])dnl
-AC_BEFORE([$0], [LT_OUTPUT])dnl
-AC_BEFORE([$0], [LTDL_INIT])dnl
-m4_require([_LT_CHECK_BUILDDIR])dnl
-
-dnl Autoconf doesn't catch unexpanded LT_ macros by default:
-m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
-m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
-dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
-dnl unless we require an AC_DEFUNed macro:
-AC_REQUIRE([LTOPTIONS_VERSION])dnl
-AC_REQUIRE([LTSUGAR_VERSION])dnl
-AC_REQUIRE([LTVERSION_VERSION])dnl
-AC_REQUIRE([LTOBSOLETE_VERSION])dnl
-m4_require([_LT_PROG_LTMAIN])dnl
-
-dnl Parse OPTIONS
-_LT_SET_OPTIONS([$0], [$1])
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-AC_SUBST(LIBTOOL)dnl
-
-_LT_SETUP
-
-# Only expand once:
-m4_define([LT_INIT])
-])# LT_INIT
-
-# Old names:
-AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
-AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
-dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
-
-
-# _LT_CC_BASENAME(CC)
-# -------------------
-# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
-m4_defun([_LT_CC_BASENAME],
-[for cc_temp in $1""; do
-  case $cc_temp in
-    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
-    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
-])
-
-
-# _LT_FILEUTILS_DEFAULTS
-# ----------------------
-# It is okay to use these file commands and assume they have been set
-# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
-m4_defun([_LT_FILEUTILS_DEFAULTS],
-[: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-])# _LT_FILEUTILS_DEFAULTS
-
-
-# _LT_SETUP
-# ---------
-m4_defun([_LT_SETUP],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-_LT_DECL([], [host_alias], [0], [The host system])dnl
-_LT_DECL([], [host], [0])dnl
-_LT_DECL([], [host_os], [0])dnl
-dnl
-_LT_DECL([], [build_alias], [0], [The build system])dnl
-_LT_DECL([], [build], [0])dnl
-_LT_DECL([], [build_os], [0])dnl
-dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([LT_PATH_LD])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-dnl
-AC_REQUIRE([AC_PROG_LN_S])dnl
-test -z "$LN_S" && LN_S="ln -s"
-_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
-dnl
-AC_REQUIRE([LT_CMD_MAX_LEN])dnl
-_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
-_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
-dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_CHECK_SHELL_FEATURES])dnl
-m4_require([_LT_CMD_RELOAD])dnl
-m4_require([_LT_CHECK_MAGIC_METHOD])dnl
-m4_require([_LT_CMD_OLD_ARCHIVE])dnl
-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-
-_LT_CONFIG_LIBTOOL_INIT([
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-])
-if test -n "${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-_LT_CHECK_OBJDIR
-
-m4_require([_LT_TAG_COMPILER])dnl
-_LT_PROG_ECHO_BACKSLASH
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\([["`\\]]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-_LT_CC_BASENAME([$compiler])
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    _LT_PATH_MAGIC
-  fi
-  ;;
-esac
-
-# Use C for the default configuration in the libtool script
-LT_SUPPORTED_TAG([CC])
-_LT_LANG_C_CONFIG
-_LT_LANG_DEFAULT_CONFIG
-_LT_CONFIG_COMMANDS
-])# _LT_SETUP
-
-
-# _LT_PROG_LTMAIN
-# ---------------
-# Note that this code is called both from `configure', and `config.status'
-# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
-# `config.status' has no value for ac_aux_dir unless we are using Automake,
-# so we pass a copy along to make sure it has a sensible value anyway.
-m4_defun([_LT_PROG_LTMAIN],
-[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
-_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
-ltmain="$ac_aux_dir/ltmain.sh"
-])# _LT_PROG_LTMAIN
-
-
-## ------------------------------------- ##
-## Accumulate code for creating libtool. ##
-## ------------------------------------- ##
-
-# So that we can recreate a full libtool script including additional
-# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
-# in macros and then make a single call at the end using the `libtool'
-# label.
-
-
-# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
-# ----------------------------------------
-# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-m4_define([_LT_CONFIG_LIBTOOL_INIT],
-[m4_ifval([$1],
-          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
-                     [$1
-])])])
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_INIT])
-
-
-# _LT_CONFIG_LIBTOOL([COMMANDS])
-# ------------------------------
-# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-m4_define([_LT_CONFIG_LIBTOOL],
-[m4_ifval([$1],
-          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
-                     [$1
-])])])
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
-
-
-# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
-# -----------------------------------------------------
-m4_defun([_LT_CONFIG_SAVE_COMMANDS],
-[_LT_CONFIG_LIBTOOL([$1])
-_LT_CONFIG_LIBTOOL_INIT([$2])
-])
-
-
-# _LT_FORMAT_COMMENT([COMMENT])
-# -----------------------------
-# Add leading comment marks to the start of each line, and a trailing
-# full-stop to the whole comment if one is not present already.
-m4_define([_LT_FORMAT_COMMENT],
-[m4_ifval([$1], [
-m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
-              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
-)])
-
-
-
-## ------------------------ ##
-## FIXME: Eliminate VARNAME ##
-## ------------------------ ##
-
-
-# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
-# -------------------------------------------------------------------
-# CONFIGNAME is the name given to the value in the libtool script.
-# VARNAME is the (base) name used in the configure script.
-# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
-# VARNAME.  Any other value will be used directly.
-m4_define([_LT_DECL],
-[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
-    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
-	[m4_ifval([$1], [$1], [$2])])
-    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
-    m4_ifval([$4],
-	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
-    lt_dict_add_subkey([lt_decl_dict], [$2],
-	[tagged?], [m4_ifval([$5], [yes], [no])])])
-])
-
-
-# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
-# --------------------------------------------------------
-m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
-
-
-# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
-# ------------------------------------------------
-m4_define([lt_decl_tag_varnames],
-[_lt_decl_filter([tagged?], [yes], $@)])
-
-
-# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
-# ---------------------------------------------------------
-m4_define([_lt_decl_filter],
-[m4_case([$#],
-  [0], [m4_fatal([$0: too few arguments: $#])],
-  [1], [m4_fatal([$0: too few arguments: $#: $1])],
-  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
-  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
-  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
-])
-
-
-# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
-# --------------------------------------------------
-m4_define([lt_decl_quote_varnames],
-[_lt_decl_filter([value], [1], $@)])
-
-
-# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
-# ---------------------------------------------------
-m4_define([lt_decl_dquote_varnames],
-[_lt_decl_filter([value], [2], $@)])
-
-
-# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
-# ---------------------------------------------------
-m4_define([lt_decl_varnames_tagged],
-[m4_assert([$# <= 2])dnl
-_$0(m4_quote(m4_default([$1], [[, ]])),
-    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
-    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
-m4_define([_lt_decl_varnames_tagged],
-[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
-
-
-# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
-# ------------------------------------------------
-m4_define([lt_decl_all_varnames],
-[_$0(m4_quote(m4_default([$1], [[, ]])),
-     m4_if([$2], [],
-	   m4_quote(lt_decl_varnames),
-	m4_quote(m4_shift($@))))[]dnl
-])
-m4_define([_lt_decl_all_varnames],
-[lt_join($@, lt_decl_varnames_tagged([$1],
-			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
-])
-
-
-# _LT_CONFIG_STATUS_DECLARE([VARNAME])
-# ------------------------------------
-# Quote a variable value, and forward it to `config.status' so that its
-# declaration there will have the same value as in `configure'.  VARNAME
-# must have a single quote delimited value for this to work.
-m4_define([_LT_CONFIG_STATUS_DECLARE],
-[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`'])
-
-
-# _LT_CONFIG_STATUS_DECLARATIONS
-# ------------------------------
-# We delimit libtool config variables with single quotes, so when
-# we write them to config.status, we have to be sure to quote all
-# embedded single quotes properly.  In configure, this macro expands
-# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
-#
-#    <var>='`$ECHO "X$<var>" | $Xsed -e "$delay_single_quote_subst"`'
-m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
-[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
-    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
-
-
-# _LT_LIBTOOL_TAGS
-# ----------------
-# Output comment and list of tags supported by the script
-m4_defun([_LT_LIBTOOL_TAGS],
-[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
-available_tags="_LT_TAGS"dnl
-])
-
-
-# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
-# -----------------------------------
-# Extract the dictionary values for VARNAME (optionally with TAG) and
-# expand to a commented shell variable setting:
-#
-#    # Some comment about what VAR is for.
-#    visible_name=$lt_internal_name
-m4_define([_LT_LIBTOOL_DECLARE],
-[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
-					   [description])))[]dnl
-m4_pushdef([_libtool_name],
-    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
-m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
-    [0], [_libtool_name=[$]$1],
-    [1], [_libtool_name=$lt_[]$1],
-    [2], [_libtool_name=$lt_[]$1],
-    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
-m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
-])
-
-
-# _LT_LIBTOOL_CONFIG_VARS
-# -----------------------
-# Produce commented declarations of non-tagged libtool config variables
-# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
-# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
-# section) are produced by _LT_LIBTOOL_TAG_VARS.
-m4_defun([_LT_LIBTOOL_CONFIG_VARS],
-[m4_foreach([_lt_var],
-    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
-    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
-
-
-# _LT_LIBTOOL_TAG_VARS(TAG)
-# -------------------------
-m4_define([_LT_LIBTOOL_TAG_VARS],
-[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
-    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
-
-
-# _LT_TAGVAR(VARNAME, [TAGNAME])
-# ------------------------------
-m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
-
-
-# _LT_CONFIG_COMMANDS
-# -------------------
-# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
-# variables for single and double quote escaping we saved from calls
-# to _LT_DECL, we can put quote escaped variables declarations
-# into `config.status', and then the shell code to quote escape them in
-# for loops in `config.status'.  Finally, any additional code accumulated
-# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
-m4_defun([_LT_CONFIG_COMMANDS],
-[AC_PROVIDE_IFELSE([LT_OUTPUT],
-	dnl If the libtool generation code has been placed in $CONFIG_LT,
-	dnl instead of duplicating it all over again into config.status,
-	dnl then we will have config.status run $CONFIG_LT later, so it
-	dnl needs to know what name is stored there:
-        [AC_CONFIG_COMMANDS([libtool],
-            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
-    dnl If the libtool generation code is destined for config.status,
-    dnl expand the accumulated commands and init code now:
-    [AC_CONFIG_COMMANDS([libtool],
-        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
-])#_LT_CONFIG_COMMANDS
-
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
-[
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-_LT_CONFIG_STATUS_DECLARATIONS
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# Quote evaled strings.
-for var in lt_decl_all_varnames([[ \
-]], lt_decl_quote_varnames); do
-    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
-    *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Double-quote double-evaled strings.
-for var in lt_decl_all_varnames([[ \
-]], lt_decl_dquote_varnames); do
-    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
-    *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Fix-up fallback echo if it was mangled by the above quoting rules.
-case \$lt_ECHO in
-*'\\\[$]0 --fallback-echo"')dnl "
-  lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\`
-  ;;
-esac
-
-_LT_OUTPUT_LIBTOOL_INIT
-])
-
-
-# LT_OUTPUT
-# ---------
-# This macro allows early generation of the libtool script (before
-# AC_OUTPUT is called), incase it is used in configure for compilation
-# tests.
-AC_DEFUN([LT_OUTPUT],
-[: ${CONFIG_LT=./config.lt}
-AC_MSG_NOTICE([creating $CONFIG_LT])
-cat >"$CONFIG_LT" <<_LTEOF
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate a libtool stub with the current configuration.
-
-lt_cl_silent=false
-SHELL=\${CONFIG_SHELL-$SHELL}
-_LTEOF
-
-cat >>"$CONFIG_LT" <<\_LTEOF
-AS_SHELL_SANITIZE
-_AS_PREPARE
-
-exec AS_MESSAGE_FD>&1
-exec AS_MESSAGE_LOG_FD>>config.log
-{
-  echo
-  AS_BOX([Running $as_me.])
-} >&AS_MESSAGE_LOG_FD
-
-lt_cl_help="\
-\`$as_me' creates a local libtool stub from the current configuration,
-for use in further configure time tests before the real libtool is
-generated.
-
-Usage: $[0] [[OPTIONS]]
-
-  -h, --help      print this help, then exit
-  -V, --version   print version number, then exit
-  -q, --quiet     do not print progress messages
-  -d, --debug     don't remove temporary files
-
-Report bugs to <bug-libtool@gnu.org>."
-
-lt_cl_version="\
-m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
-m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
-configured by $[0], generated by m4_PACKAGE_STRING.
-
-Copyright (C) 2008 Free Software Foundation, Inc.
-This config.lt script is free software; the Free Software Foundation
-gives unlimited permision to copy, distribute and modify it."
-
-while test $[#] != 0
-do
-  case $[1] in
-    --version | --v* | -V )
-      echo "$lt_cl_version"; exit 0 ;;
-    --help | --h* | -h )
-      echo "$lt_cl_help"; exit 0 ;;
-    --debug | --d* | -d )
-      debug=: ;;
-    --quiet | --q* | --silent | --s* | -q )
-      lt_cl_silent=: ;;
-
-    -*) AC_MSG_ERROR([unrecognized option: $[1]
-Try \`$[0] --help' for more information.]) ;;
-
-    *) AC_MSG_ERROR([unrecognized argument: $[1]
-Try \`$[0] --help' for more information.]) ;;
-  esac
-  shift
-done
-
-if $lt_cl_silent; then
-  exec AS_MESSAGE_FD>/dev/null
-fi
-_LTEOF
-
-cat >>"$CONFIG_LT" <<_LTEOF
-_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
-_LTEOF
-
-cat >>"$CONFIG_LT" <<\_LTEOF
-AC_MSG_NOTICE([creating $ofile])
-_LT_OUTPUT_LIBTOOL_COMMANDS
-AS_EXIT(0)
-_LTEOF
-chmod +x "$CONFIG_LT"
-
-# configure is writing to config.log, but config.lt does its own redirection,
-# appending to config.log, which fails on DOS, as config.log is still kept
-# open by configure.  Here we exec the FD to /dev/null, effectively closing
-# config.log, so it can be properly (re)opened and appended to by config.lt.
-if test "$no_create" != yes; then
-  lt_cl_success=:
-  test "$silent" = yes &&
-    lt_config_lt_args="$lt_config_lt_args --quiet"
-  exec AS_MESSAGE_LOG_FD>/dev/null
-  $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
-  exec AS_MESSAGE_LOG_FD>>config.log
-  $lt_cl_success || AS_EXIT(1)
-fi
-])# LT_OUTPUT
-
-
-# _LT_CONFIG(TAG)
-# ---------------
-# If TAG is the built-in tag, create an initial libtool script with a
-# default configuration from the untagged config vars.  Otherwise add code
-# to config.status for appending the configuration named by TAG from the
-# matching tagged config vars.
-m4_defun([_LT_CONFIG],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-_LT_CONFIG_SAVE_COMMANDS([
-  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
-  m4_if(_LT_TAG, [C], [
-    # See if we are running on zsh, and set the options which allow our
-    # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
-      setopt NO_GLOB_SUBST
-    fi
-
-    cfgfile="${ofile}T"
-    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
-    $RM "$cfgfile"
-
-    cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $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.
-#
-_LT_COPYING
-_LT_LIBTOOL_TAGS
-
-# ### BEGIN LIBTOOL CONFIG
-_LT_LIBTOOL_CONFIG_VARS
-_LT_LIBTOOL_TAG_VARS
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
-  case $host_os in
-  aix3*)
-    cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-_LT_EOF
-    ;;
-  esac
-
-  _LT_PROG_LTMAIN
-
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  _LT_PROG_XSI_SHELLFNS
-
-  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  mv -f "$cfgfile" "$ofile" ||
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
-],
-[cat <<_LT_EOF >> "$ofile"
-
-dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
-dnl in a comment (ie after a #).
-# ### BEGIN LIBTOOL TAG CONFIG: $1
-_LT_LIBTOOL_TAG_VARS(_LT_TAG)
-# ### END LIBTOOL TAG CONFIG: $1
-_LT_EOF
-])dnl /m4_if
-],
-[m4_if([$1], [], [
-    PACKAGE='$PACKAGE'
-    VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
-    RM='$RM'
-    ofile='$ofile'], [])
-])dnl /_LT_CONFIG_SAVE_COMMANDS
-])# _LT_CONFIG
-
-
-# LT_SUPPORTED_TAG(TAG)
-# ---------------------
-# Trace this macro to discover what tags are supported by the libtool
-# --tag option, using:
-#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
-AC_DEFUN([LT_SUPPORTED_TAG], [])
-
-
-# C support is built-in for now
-m4_define([_LT_LANG_C_enabled], [])
-m4_define([_LT_TAGS], [])
-
-
-# LT_LANG(LANG)
-# -------------
-# Enable libtool support for the given language if not already enabled.
-AC_DEFUN([LT_LANG],
-[AC_BEFORE([$0], [LT_OUTPUT])dnl
-m4_case([$1],
-  [C],			[_LT_LANG(C)],
-  [C++],		[_LT_LANG(CXX)],
-  [Java],		[_LT_LANG(GCJ)],
-  [Fortran 77],		[_LT_LANG(F77)],
-  [Fortran],		[_LT_LANG(FC)],
-  [Windows Resource],	[_LT_LANG(RC)],
-  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
-    [_LT_LANG($1)],
-    [m4_fatal([$0: unsupported language: "$1"])])])dnl
-])# LT_LANG
-
-
-# _LT_LANG(LANGNAME)
-# ------------------
-m4_defun([_LT_LANG],
-[m4_ifdef([_LT_LANG_]$1[_enabled], [],
-  [LT_SUPPORTED_TAG([$1])dnl
-  m4_append([_LT_TAGS], [$1 ])dnl
-  m4_define([_LT_LANG_]$1[_enabled], [])dnl
-  _LT_LANG_$1_CONFIG($1)])dnl
-])# _LT_LANG
-
-
-# _LT_LANG_DEFAULT_CONFIG
-# -----------------------
-m4_defun([_LT_LANG_DEFAULT_CONFIG],
-[AC_PROVIDE_IFELSE([AC_PROG_CXX],
-  [LT_LANG(CXX)],
-  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
-
-AC_PROVIDE_IFELSE([AC_PROG_F77],
-  [LT_LANG(F77)],
-  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
-
-AC_PROVIDE_IFELSE([AC_PROG_FC],
-  [LT_LANG(FC)],
-  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
-
-dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
-dnl pulling things in needlessly.
-AC_PROVIDE_IFELSE([AC_PROG_GCJ],
-  [LT_LANG(GCJ)],
-  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
-    [LT_LANG(GCJ)],
-    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
-      [LT_LANG(GCJ)],
-      [m4_ifdef([AC_PROG_GCJ],
-	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
-       m4_ifdef([A][M_PROG_GCJ],
-	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
-       m4_ifdef([LT_PROG_GCJ],
-	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
-
-AC_PROVIDE_IFELSE([LT_PROG_RC],
-  [LT_LANG(RC)],
-  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
-])# _LT_LANG_DEFAULT_CONFIG
-
-# Obsolete macros:
-AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
-AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
-AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
-AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
-dnl AC_DEFUN([AC_LIBTOOL_F77], [])
-dnl AC_DEFUN([AC_LIBTOOL_FC], [])
-dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
-
-
-# _LT_TAG_COMPILER
-# ----------------
-m4_defun([_LT_TAG_COMPILER],
-[AC_REQUIRE([AC_PROG_CC])dnl
-
-_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
-_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
-_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
-_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-])# _LT_TAG_COMPILER
-
-
-# _LT_COMPILER_BOILERPLATE
-# ------------------------
-# Check for compiler boilerplate output or warnings with
-# the simple compiler test code.
-m4_defun([_LT_COMPILER_BOILERPLATE],
-[m4_require([_LT_DECL_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-])# _LT_COMPILER_BOILERPLATE
-
-
-# _LT_LINKER_BOILERPLATE
-# ----------------------
-# Check for linker boilerplate output or warnings with
-# the simple link test code.
-m4_defun([_LT_LINKER_BOILERPLATE],
-[m4_require([_LT_DECL_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-])# _LT_LINKER_BOILERPLATE
-
-# _LT_REQUIRED_DARWIN_CHECKS
-# -------------------------
-m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
-  case $host_os in
-    rhapsody* | darwin*)
-    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
-    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
-    AC_CHECK_TOOL([LIPO], [lipo], [:])
-    AC_CHECK_TOOL([OTOOL], [otool], [:])
-    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
-    _LT_DECL([], [DSYMUTIL], [1],
-      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
-    _LT_DECL([], [NMEDIT], [1],
-      [Tool to change global to local symbols on Mac OS X])
-    _LT_DECL([], [LIPO], [1],
-      [Tool to manipulate fat objects and archives on Mac OS X])
-    _LT_DECL([], [OTOOL], [1],
-      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
-    _LT_DECL([], [OTOOL64], [1],
-      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
-
-    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
-      [lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
-	# By default we will add the -single_module flag. You can override
-	# by either setting the environment variable LT_MULTI_MODULE
-	# non-empty at configure time, or by adding -multi_module to the
-	# link flags.
-	rm -rf libconftest.dylib*
-	echo "int foo(void){return 1;}" > conftest.c
-	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
-	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
-        _lt_result=$?
-	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
-	  lt_cv_apple_cc_single_mod=yes
-	else
-	  cat conftest.err >&AS_MESSAGE_LOG_FD
-	fi
-	rm -rf libconftest.dylib*
-	rm -f conftest.*
-      fi])
-    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
-      [lt_cv_ld_exported_symbols_list],
-      [lt_cv_ld_exported_symbols_list=no
-      save_LDFLAGS=$LDFLAGS
-      echo "_main" > conftest.sym
-      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
-	[lt_cv_ld_exported_symbols_list=yes],
-	[lt_cv_ld_exported_symbols_list=no])
-	LDFLAGS="$save_LDFLAGS"
-    ])
-    case $host_os in
-    rhapsody* | darwin1.[[012]])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-    darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-    darwin*) # darwin 5.x on
-      # if running on 10.5 or later, the deployment target defaults
-      # to the OS version, if on x86, and 10.4, the deployment
-      # target defaults to 10.4. Don't you love it?
-      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[[012]]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-      esac
-    ;;
-  esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-      _lt_dar_single_mod='$single_module'
-    fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-    else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    fi
-    if test "$DSYMUTIL" != ":"; then
-      _lt_dsymutil='~$DSYMUTIL $lib || :'
-    else
-      _lt_dsymutil=
-    fi
-    ;;
-  esac
-])
-
-
-# _LT_DARWIN_LINKER_FEATURES
-# --------------------------
-# Checks for linker and compiler features on darwin
-m4_defun([_LT_DARWIN_LINKER_FEATURES],
-[
-  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
-  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-  _LT_TAGVAR(hardcode_direct, $1)=no
-  _LT_TAGVAR(hardcode_automatic, $1)=yes
-  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  _LT_TAGVAR(whole_archive_flag_spec, $1)=''
-  _LT_TAGVAR(link_all_deplibs, $1)=yes
-  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=echo
-    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-    m4_if([$1], [CXX],
-[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
-    fi
-],[])
-  else
-  _LT_TAGVAR(ld_shlibs, $1)=no
-  fi
-])
-
-# _LT_SYS_MODULE_PATH_AIX
-# -----------------------
-# Links a minimal program and checks the executable
-# for the system default hardcoded library path. In most cases,
-# this is /usr/lib:/lib, but when the MPI compilers are used
-# the location of the communication and MPI libs are included too.
-# If we don't find anything, use the default library path according
-# to the aix ld manual.
-m4_defun([_LT_SYS_MODULE_PATH_AIX],
-[m4_require([_LT_DECL_SED])dnl
-AC_LINK_IFELSE(AC_LANG_PROGRAM,[
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi],[])
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-])# _LT_SYS_MODULE_PATH_AIX
-
-
-# _LT_SHELL_INIT(ARG)
-# -------------------
-m4_define([_LT_SHELL_INIT],
-[ifdef([AC_DIVERSION_NOTICE],
-	     [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
-	 [AC_DIVERT_PUSH(NOTICE)])
-$1
-AC_DIVERT_POP
-])# _LT_SHELL_INIT
-
-
-# _LT_PROG_ECHO_BACKSLASH
-# -----------------------
-# Add some code to the start of the generated configure script which
-# will find an echo command which doesn't interpret backslashes.
-m4_defun([_LT_PROG_ECHO_BACKSLASH],
-[_LT_SHELL_INIT([
-# Check that we are running under the correct shell.
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-case X$lt_ECHO in
-X*--fallback-echo)
-  # Remove one level of quotation (which was required for Make).
-  ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
-  ;;
-esac
-
-ECHO=${lt_ECHO-echo}
-if test "X[$]1" = X--no-reexec; then
-  # Discard the --no-reexec flag, and continue.
-  shift
-elif test "X[$]1" = X--fallback-echo; then
-  # Avoid inline document here, it may be left over
-  :
-elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
-  # Yippee, $ECHO works!
-  :
-else
-  # Restart under the correct shell.
-  exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
-fi
-
-if test "X[$]1" = X--fallback-echo; then
-  # used as fallback echo
-  shift
-  cat <<_LT_EOF
-[$]*
-_LT_EOF
-  exit 0
-fi
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test -z "$lt_ECHO"; then
-  if test "X${echo_test_string+set}" != Xset; then
-    # find a string as large as possible, as long as the shell can cope with it
-    for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
-      # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
-      if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
-	 { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
-      then
-        break
-      fi
-    done
-  fi
-
-  if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
-     echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
-     test "X$echo_testing_string" = "X$echo_test_string"; then
-    :
-  else
-    # The Solaris, AIX, and Digital Unix default echo programs unquote
-    # backslashes.  This makes it impossible to quote backslashes using
-    #   echo "$something" | sed 's/\\/\\\\/g'
-    #
-    # So, first we look for a working echo in the user's PATH.
-
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for dir in $PATH /usr/ucb; do
-      IFS="$lt_save_ifs"
-      if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
-         test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
-         echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
-         test "X$echo_testing_string" = "X$echo_test_string"; then
-        ECHO="$dir/echo"
-        break
-      fi
-    done
-    IFS="$lt_save_ifs"
-
-    if test "X$ECHO" = Xecho; then
-      # We didn't find a better echo, so look for alternatives.
-      if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
-         echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
-         test "X$echo_testing_string" = "X$echo_test_string"; then
-        # This shell has a builtin print -r that does the trick.
-        ECHO='print -r'
-      elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
-	   test "X$CONFIG_SHELL" != X/bin/ksh; then
-        # If we have ksh, try running configure again with it.
-        ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
-        export ORIGINAL_CONFIG_SHELL
-        CONFIG_SHELL=/bin/ksh
-        export CONFIG_SHELL
-        exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
-      else
-        # Try using printf.
-        ECHO='printf %s\n'
-        if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
-	   echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
-	   test "X$echo_testing_string" = "X$echo_test_string"; then
-	  # Cool, printf works
-	  :
-        elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
-	     test "X$echo_testing_string" = 'X\t' &&
-	     echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-	     test "X$echo_testing_string" = "X$echo_test_string"; then
-	  CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
-	  export CONFIG_SHELL
-	  SHELL="$CONFIG_SHELL"
-	  export SHELL
-	  ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
-        elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
-	     test "X$echo_testing_string" = 'X\t' &&
-	     echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-	     test "X$echo_testing_string" = "X$echo_test_string"; then
-	  ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
-        else
-	  # maybe with a smaller string...
-	  prev=:
-
-	  for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
-	    if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
-	    then
-	      break
-	    fi
-	    prev="$cmd"
-	  done
-
-	  if test "$prev" != 'sed 50q "[$]0"'; then
-	    echo_test_string=`eval $prev`
-	    export echo_test_string
-	    exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
-	  else
-	    # Oops.  We lost completely, so just stick with echo.
-	    ECHO=echo
-	  fi
-        fi
-      fi
-    fi
-  fi
-fi
-
-# Copy echo and quote the copy suitably for passing to libtool from
-# the Makefile, instead of quoting the original, which is used later.
-lt_ECHO=$ECHO
-if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
-   lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
-fi
-
-AC_SUBST(lt_ECHO)
-])
-_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
-_LT_DECL([], [ECHO], [1],
-    [An echo program that does not interpret backslashes])
-])# _LT_PROG_ECHO_BACKSLASH
-
-
-# _LT_ENABLE_LOCK
-# ---------------
-m4_defun([_LT_ENABLE_LOCK],
-[AC_ARG_ENABLE([libtool-lock],
-  [AS_HELP_STRING([--disable-libtool-lock],
-    [avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.$ac_objext` in
-      *ELF-32*)
-	HPUX_IA64_MODE="32"
-	;;
-      *ELF-64*)
-	HPUX_IA64_MODE="64"
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '[#]line __oline__ "configure"' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -melf32bsmip"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -melf32bmipn32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -melf64bmip"
-	;;
-      esac
-    else
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -32"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -n32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -64"
-	  ;;
-      esac
-    fi
-  fi
-  rm -rf conftest*
-  ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-      *32-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_i386_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_i386"
-	    ;;
-	  ppc64-*linux*|powerpc64-*linux*)
-	    LD="${LD-ld} -m elf32ppclinux"
-	    ;;
-	  s390x-*linux*)
-	    LD="${LD-ld} -m elf_s390"
-	    ;;
-	  sparc64-*linux*)
-	    LD="${LD-ld} -m elf32_sparc"
-	    ;;
-	esac
-	;;
-      *64-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_x86_64_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_x86_64"
-	    ;;
-	  ppc*-*linux*|powerpc*-*linux*)
-	    LD="${LD-ld} -m elf64ppc"
-	    ;;
-	  s390*-*linux*|s390*-*tpf*)
-	    LD="${LD-ld} -m elf64_s390"
-	    ;;
-	  sparc*-*linux*)
-	    LD="${LD-ld} -m elf64_sparc"
-	    ;;
-	esac
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
-    [AC_LANG_PUSH(C)
-     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
-     AC_LANG_POP])
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-sparc*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
-      *)
-	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
-	  LD="${LD-ld} -64"
-	fi
-	;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-esac
-
-need_locks="$enable_libtool_lock"
-])# _LT_ENABLE_LOCK
-
-
-# _LT_CMD_OLD_ARCHIVE
-# -------------------
-m4_defun([_LT_CMD_OLD_ARCHIVE],
-[AC_CHECK_TOOL(AR, ar, false)
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-_LT_DECL([], [AR], [1], [The archiver])
-_LT_DECL([], [AR_FLAGS], [1])
-
-AC_CHECK_TOOL(STRIP, strip, :)
-test -z "$STRIP" && STRIP=:
-_LT_DECL([], [STRIP], [1], [A symbol stripping program])
-
-AC_CHECK_TOOL(RANLIB, ranlib, :)
-test -z "$RANLIB" && RANLIB=:
-_LT_DECL([], [RANLIB], [1],
-    [Commands used to install an old-style archive])
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
-fi
-_LT_DECL([], [old_postinstall_cmds], [2])
-_LT_DECL([], [old_postuninstall_cmds], [2])
-_LT_TAGDECL([], [old_archive_cmds], [2],
-    [Commands used to build an old-style archive])
-])# _LT_CMD_OLD_ARCHIVE
-
-
-# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------------------
-# Check whether the given compiler option works
-AC_DEFUN([_LT_COMPILER_OPTION],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$3"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       $2=yes
-     fi
-   fi
-   $RM conftest*
-])
-
-if test x"[$]$2" = xyes; then
-    m4_if([$5], , :, [$5])
-else
-    m4_if([$6], , :, [$6])
-fi
-])# _LT_COMPILER_OPTION
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
-
-
-# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#                  [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------
-# Check whether the given linker option works
-AC_DEFUN([_LT_LINKER_OPTION],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $3"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&AS_MESSAGE_LOG_FD
-       $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         $2=yes
-       fi
-     else
-       $2=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-])
-
-if test x"[$]$2" = xyes; then
-    m4_if([$4], , :, [$4])
-else
-    m4_if([$5], , :, [$5])
-fi
-])# _LT_LINKER_OPTION
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
-
-
-# LT_CMD_MAX_LEN
-#---------------
-AC_DEFUN([LT_CMD_MAX_LEN],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-# find the maximum length of command line arguments
-AC_MSG_CHECKING([the maximum length of command line arguments])
-AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
-  i=0
-  teststring="ABCD"
-
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
-
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
-
-  cygwin* | mingw* | cegcc*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
-
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
-
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    else
-      # Make teststring a little bigger before we do anything with it.
-      # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
-        teststring=$teststring$teststring
-      done
-      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-      # If test is not a shell built-in, we'll probably end up computing a
-      # maximum length that is only half of the actual maximum length, but
-      # we can't tell.
-      while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
-	         = "XX$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
-      do
-        i=`expr $i + 1`
-        teststring=$teststring$teststring
-      done
-      # Only check the string length outside the loop.
-      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
-      teststring=
-      # Add a significant safety factor because C++ compilers can tack on
-      # massive amounts of additional arguments before passing them to the
-      # linker.  It appears as though 1/2 is a usable value.
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    fi
-    ;;
-  esac
-])
-if test -n $lt_cv_sys_max_cmd_len ; then
-  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
-else
-  AC_MSG_RESULT(none)
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-_LT_DECL([], [max_cmd_len], [0],
-    [What is the maximum length of a command?])
-])# LT_CMD_MAX_LEN
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
-
-
-# _LT_HEADER_DLFCN
-# ----------------
-m4_defun([_LT_HEADER_DLFCN],
-[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
-])# _LT_HEADER_DLFCN
-
-
-# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
-#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
-# ----------------------------------------------------------------
-m4_defun([_LT_TRY_DLOPEN_SELF],
-[m4_require([_LT_HEADER_DLFCN])dnl
-if test "$cross_compiling" = yes; then :
-  [$4]
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-[#line __oline__ "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-void fnord() { int i=42;}
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}]
-_LT_EOF
-  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) $1 ;;
-      x$lt_dlneed_uscore) $2 ;;
-      x$lt_dlunknown|x*) $3 ;;
-    esac
-  else :
-    # compilation failed
-    $3
-  fi
-fi
-rm -fr conftest*
-])# _LT_TRY_DLOPEN_SELF
-
-
-# LT_SYS_DLOPEN_SELF
-# ------------------
-AC_DEFUN([LT_SYS_DLOPEN_SELF],
-[m4_require([_LT_HEADER_DLFCN])dnl
-if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-    ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-    ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ])
-    ;;
-
-  *)
-    AC_CHECK_FUNC([shl_load],
-	  [lt_cv_dlopen="shl_load"],
-      [AC_CHECK_LIB([dld], [shl_load],
-	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
-	[AC_CHECK_FUNC([dlopen],
-	      [lt_cv_dlopen="dlopen"],
-	  [AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
-	    [AC_CHECK_LIB([svld], [dlopen],
-		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
-	      [AC_CHECK_LIB([dld], [dld_link],
-		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
-	      ])
-	    ])
-	  ])
-	])
-      ])
-    ;;
-  esac
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    AC_CACHE_CHECK([whether a program can dlopen itself],
-	  lt_cv_dlopen_self, [dnl
-	  _LT_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
-	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
-    ])
-
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
-	  lt_cv_dlopen_self_static, [dnl
-	  _LT_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
-	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
-      ])
-    fi
-
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
-
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-_LT_DECL([dlopen_support], [enable_dlopen], [0],
-	 [Whether dlopen is supported])
-_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
-	 [Whether dlopen of programs is supported])
-_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
-	 [Whether dlopen of statically linked programs is supported])
-])# LT_SYS_DLOPEN_SELF
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
-
-
-# _LT_COMPILER_C_O([TAGNAME])
-# ---------------------------
-# Check to see if options -c and -o are simultaneously supported by compiler.
-# This macro does not hard code the compiler like AC_PROG_CC_C_O.
-m4_defun([_LT_COMPILER_C_O],
-[m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
-  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
-  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-     fi
-   fi
-   chmod u+w . 2>&AS_MESSAGE_LOG_FD
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-])
-_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
-	[Does compiler simultaneously support -c and -o options?])
-])# _LT_COMPILER_C_O
-
-
-# _LT_COMPILER_FILE_LOCKS([TAGNAME])
-# ----------------------------------
-# Check to see if we can do hard links to lock some files if needed
-m4_defun([_LT_COMPILER_FILE_LOCKS],
-[m4_require([_LT_ENABLE_LOCK])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-_LT_COMPILER_C_O([$1])
-
-hard_links="nottested"
-if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  AC_MSG_CHECKING([if we can lock with hard links])
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  AC_MSG_RESULT([$hard_links])
-  if test "$hard_links" = no; then
-    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
-])# _LT_COMPILER_FILE_LOCKS
-
-
-# _LT_CHECK_OBJDIR
-# ----------------
-m4_defun([_LT_CHECK_OBJDIR],
-[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
-[rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null])
-objdir=$lt_cv_objdir
-_LT_DECL([], [objdir], [0],
-         [The name of the directory that contains temporary libtool files])dnl
-m4_pattern_allow([LT_OBJDIR])dnl
-AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
-  [Define to the sub-directory in which libtool stores uninstalled libraries.])
-])# _LT_CHECK_OBJDIR
-
-
-# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
-# --------------------------------------
-# Check hardcoding attributes.
-m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
-[AC_MSG_CHECKING([how to hardcode library paths into programs])
-_LT_TAGVAR(hardcode_action, $1)=
-if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
-   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
-   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
-     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
-    # Linking always hardcodes the temporary library directory.
-    _LT_TAGVAR(hardcode_action, $1)=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    _LT_TAGVAR(hardcode_action, $1)=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  _LT_TAGVAR(hardcode_action, $1)=unsupported
-fi
-AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
-
-if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
-   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-_LT_TAGDECL([], [hardcode_action], [0],
-    [How to hardcode a shared library path into an executable])
-])# _LT_LINKER_HARDCODE_LIBPATH
-
-
-# _LT_CMD_STRIPLIB
-# ----------------
-m4_defun([_LT_CMD_STRIPLIB],
-[m4_require([_LT_DECL_EGREP])
-striplib=
-old_striplib=
-AC_MSG_CHECKING([whether stripping libraries is possible])
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  AC_MSG_RESULT([yes])
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-  darwin*)
-    if test -n "$STRIP" ; then
-      striplib="$STRIP -x"
-      old_striplib="$STRIP -S"
-      AC_MSG_RESULT([yes])
-    else
-      AC_MSG_RESULT([no])
-    fi
-    ;;
-  *)
-    AC_MSG_RESULT([no])
-    ;;
-  esac
-fi
-_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
-_LT_DECL([], [striplib], [1])
-])# _LT_CMD_STRIPLIB
-
-
-# _LT_SYS_DYNAMIC_LINKER([TAG])
-# -----------------------------
-# PORTME Fill in your ld.so characteristics
-m4_defun([_LT_SYS_DYNAMIC_LINKER],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_OBJDUMP])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_MSG_CHECKING([dynamic linker characteristics])
-m4_if([$1],
-	[], [
-if test "$GCC" = yes; then
-  case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
-  esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-  if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'`
-  else
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-  fi
-  # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
-  lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
-  for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
-      test -d "$lt_sys_path" && \
-	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
-    fi
-  done
-  lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
-  for (lt_i = NF; lt_i > 0; lt_i--) {
-    if ($lt_i != "" && $lt_i != ".") {
-      if ($lt_i == "..") {
-        lt_count++;
-      } else {
-        if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
-        } else {
-          lt_count--;
-        }
-      }
-    }
-  }
-  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
-  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
-}'`
-  sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi])
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[[4-9]]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[[01]] | aix4.[[01]].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[[45]]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
-        # It is most probably a Windows format PATH printed by
-        # mingw gcc, but we are running on Cygwin. Gcc prints its search
-        # path with ; separators, and with drive letters. We can handle the
-        # drive letters (cygwin fileutils understands them), so leave them,
-        # especially as we might pass files found there to a mingw objdump,
-        # which wouldn't understand a cygwinified path. Ahh.
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
-
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-m4_if([$1], [],[
-  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd1*)
-  dynamic_linker=no
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[[123]]*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
-  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555.
-  postinstall_cmds='chmod 555 $lib'
-  ;;
-
-interix[[3-9]]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  # Some binutils ld are patched to set DT_RUNPATH
-  save_LDFLAGS=$LDFLAGS
-  save_libdir=$libdir
-  eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
-       LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
-  AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
-    [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
-       [shlibpath_overrides_runpath=yes])])
-  LDFLAGS=$save_LDFLAGS
-  libdir=$save_libdir
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsdelf*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='NetBSD ld.elf_so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[[89]] | openbsd2.[[89]].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-AC_MSG_RESULT([$dynamic_linker])
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-_LT_DECL([], [variables_saved_for_relink], [1],
-    [Variables whose values should be saved in libtool wrapper scripts and
-    restored at link time])
-_LT_DECL([], [need_lib_prefix], [0],
-    [Do we need the "lib" prefix for modules?])
-_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
-_LT_DECL([], [version_type], [0], [Library versioning type])
-_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
-_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
-_LT_DECL([], [shlibpath_overrides_runpath], [0],
-    [Is shlibpath searched before the hard-coded library search path?])
-_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
-_LT_DECL([], [library_names_spec], [1],
-    [[List of archive names.  First name is the real one, the rest are links.
-    The last name is the one that the linker finds with -lNAME]])
-_LT_DECL([], [soname_spec], [1],
-    [[The coded name of the library, if different from the real name]])
-_LT_DECL([], [postinstall_cmds], [2],
-    [Command to use after installation of a shared archive])
-_LT_DECL([], [postuninstall_cmds], [2],
-    [Command to use after uninstallation of a shared archive])
-_LT_DECL([], [finish_cmds], [2],
-    [Commands used to finish a libtool library installation in a directory])
-_LT_DECL([], [finish_eval], [1],
-    [[As "finish_cmds", except a single script fragment to be evaled but
-    not shown]])
-_LT_DECL([], [hardcode_into_libs], [0],
-    [Whether we should hardcode library paths into libraries])
-_LT_DECL([], [sys_lib_search_path_spec], [2],
-    [Compile-time system search path for libraries])
-_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
-    [Run-time system search path for libraries])
-])# _LT_SYS_DYNAMIC_LINKER
-
-
-# _LT_PATH_TOOL_PREFIX(TOOL)
-# --------------------------
-# find a file program which can recognize shared library
-AC_DEFUN([_LT_PATH_TOOL_PREFIX],
-[m4_require([_LT_DECL_EGREP])dnl
-AC_MSG_CHECKING([for $1])
-AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
-[case $MAGIC_CMD in
-[[\\/*] |  ?:[\\/]*])
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-dnl $ac_dummy forces splitting on constant user-supplied paths.
-dnl POSIX.2 word splitting is done only on the output of word expansions,
-dnl not every word.  This closes a longstanding sh security hole.
-  ac_dummy="m4_if([$2], , $PATH, [$2])"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$1; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac])
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  AC_MSG_RESULT($MAGIC_CMD)
-else
-  AC_MSG_RESULT(no)
-fi
-_LT_DECL([], [MAGIC_CMD], [0],
-	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
-])# _LT_PATH_TOOL_PREFIX
-
-# Old name:
-AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
-
-
-# _LT_PATH_MAGIC
-# --------------
-# find a file program which can recognize a shared library
-m4_defun([_LT_PATH_MAGIC],
-[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
-  else
-    MAGIC_CMD=:
-  fi
-fi
-])# _LT_PATH_MAGIC
-
-
-# LT_PATH_LD
-# ----------
-# find the pathname to the GNU or non-GNU linker
-AC_DEFUN([LT_PATH_LD],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_DECL_EGREP])dnl
-
-AC_ARG_WITH([gnu-ld],
-    [AS_HELP_STRING([--with-gnu-ld],
-	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
-    [test "$withval" = no || with_gnu_ld=yes],
-    [with_gnu_ld=no])dnl
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  AC_MSG_CHECKING([for ld used by $CC])
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [[\\/]]* | ?:[[\\/]]*)
-      re_direlt='/[[^/]][[^/]]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  AC_MSG_CHECKING([for GNU ld])
-else
-  AC_MSG_CHECKING([for non-GNU ld])
-fi
-AC_CACHE_VAL(lt_cv_path_LD,
-[if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi])
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  AC_MSG_RESULT($LD)
-else
-  AC_MSG_RESULT(no)
-fi
-test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
-_LT_PATH_LD_GNU
-AC_SUBST([LD])
-
-_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
-])# LT_PATH_LD
-
-# Old names:
-AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
-AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_PROG_LD], [])
-dnl AC_DEFUN([AC_PROG_LD], [])
-
-
-# _LT_PATH_LD_GNU
-#- --------------
-m4_defun([_LT_PATH_LD_GNU],
-[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
-[# I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac])
-with_gnu_ld=$lt_cv_prog_gnu_ld
-])# _LT_PATH_LD_GNU
-
-
-# _LT_CMD_RELOAD
-# --------------
-# find reload flag for linker
-#   -- PORTME Some linkers may need a different reload flag.
-m4_defun([_LT_CMD_RELOAD],
-[AC_CACHE_CHECK([for $LD option to reload object files],
-  lt_cv_ld_reload_flag,
-  [lt_cv_ld_reload_flag='-r'])
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
-_LT_DECL([], [reload_flag], [1], [How to create reloadable object files])dnl
-_LT_DECL([], [reload_cmds], [2])dnl
-])# _LT_CMD_RELOAD
-
-
-# _LT_CHECK_MAGIC_METHOD
-# ----------------------
-# how to check for library dependencies
-#  -- PORTME fill in with the dynamic library characteristics
-m4_defun([_LT_CHECK_MAGIC_METHOD],
-[m4_require([_LT_DECL_EGREP])
-m4_require([_LT_DECL_OBJDUMP])
-AC_CACHE_CHECK([how to recognize dependent libraries],
-lt_cv_deplibs_check_method,
-[lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[[4-9]]*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[[45]]*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump',
-  # unless we find 'file', for example because we are cross-compiling.
-  if ( file / ) >/dev/null 2>&1; then
-    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-    lt_cv_file_magic_cmd='func_win32_libid'
-  else
-    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
-    lt_cv_file_magic_cmd='$OBJDUMP -f'
-  fi
-  ;;
-
-cegcc)
-  # use the weaker test based on 'objdump'. See mingw*.
-  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
-
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-freebsd* | dragonfly*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
-
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
-
-interix[[3-9]]*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd* | netbsdelf*-gnu)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
-  fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-*nto* | *qnx*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-rdos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-tpf*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-])
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-_LT_DECL([], [deplibs_check_method], [1],
-    [Method to check whether dependent libraries are shared objects])
-_LT_DECL([], [file_magic_cmd], [1],
-    [Command to use when deplibs_check_method == "file_magic"])
-])# _LT_CHECK_MAGIC_METHOD
-
-
-# LT_PATH_NM
-# ----------
-# find the pathname to a BSD- or MS-compatible name lister
-AC_DEFUN([LT_PATH_NM],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
-[if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  : ${lt_cv_path_NM=no}
-fi])
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
-else
-  # Didn't find any BSD compatible name lister, look for dumpbin.
-  AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :)
-  AC_SUBST([DUMPBIN])
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
-  fi
-fi
-test -z "$NM" && NM=nm
-AC_SUBST([NM])
-_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
-
-AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
-  [lt_cv_nm_interface="BSD nm"
-  echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
-  (eval "$ac_compile" 2>conftest.err)
-  cat conftest.err >&AS_MESSAGE_LOG_FD
-  (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
-  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
-  cat conftest.err >&AS_MESSAGE_LOG_FD
-  (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD)
-  cat conftest.out >&AS_MESSAGE_LOG_FD
-  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
-    lt_cv_nm_interface="MS dumpbin"
-  fi
-  rm -f conftest*])
-])# LT_PATH_NM
-
-# Old names:
-AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
-AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_PROG_NM], [])
-dnl AC_DEFUN([AC_PROG_NM], [])
-
-
-# LT_LIB_M
-# --------
-# check for math library
-AC_DEFUN([LT_LIB_M],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-LIBM=
-case $host in
-*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
-  # These system don't have libm, or don't need it
-  ;;
-*-ncr-sysv4.3*)
-  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
-  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
-  ;;
-*)
-  AC_CHECK_LIB(m, cos, LIBM="-lm")
-  ;;
-esac
-AC_SUBST([LIBM])
-])# LT_LIB_M
-
-# Old name:
-AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_CHECK_LIBM], [])
-
-
-# _LT_COMPILER_NO_RTTI([TAGNAME])
-# -------------------------------
-m4_defun([_LT_COMPILER_NO_RTTI],
-[m4_require([_LT_TAG_COMPILER])dnl
-
-_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-
-if test "$GCC" = yes; then
-  _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
-
-  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
-    lt_cv_prog_compiler_rtti_exceptions,
-    [-fno-rtti -fno-exceptions], [],
-    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
-fi
-_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
-	[Compiler flag to turn off builtin functions])
-])# _LT_COMPILER_NO_RTTI
-
-
-# _LT_CMD_GLOBAL_SYMBOLS
-# ----------------------
-m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-AC_REQUIRE([LT_PATH_LD])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-AC_MSG_CHECKING([command to parse $NM output from $compiler object])
-AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
-[
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[[BCDEGRST]]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[[BCDT]]'
-  ;;
-cygwin* | mingw* | pw32* | cegcc*)
-  symcode='[[ABCDGISTW]]'
-  ;;
-hpux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[[ABCDEGRST]]'
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[[BCDEGRST]]'
-  ;;
-osf*)
-  symcode='[[BCDEGQRST]]'
-  ;;
-solaris*)
-  symcode='[[BDRT]]'
-  ;;
-sco3.2v5*)
-  symcode='[[DT]]'
-  ;;
-sysv4.2uw2*)
-  symcode='[[DT]]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[[ABDT]]'
-  ;;
-sysv4)
-  symcode='[[DFNSTU]]'
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[[ABCDGIRSTW]]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
-    # Also find C++ and __fastcall symbols from MSVC++,
-    # which start with @ or ?.
-    lt_cv_sys_global_symbol_pipe="$AWK ['"\
-"     {last_section=section; section=\$ 3};"\
-"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-"     \$ 0!~/External *\|/{next};"\
-"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-"     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-"     ' prfx=^$ac_symprfx]"
-  else
-    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-  fi
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
-  if AC_TRY_EVAL(ac_compile); then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
-	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<_LT_EOF > conftest.$ac_ext
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
-	  cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols.  */
-const struct {
-  const char *name;
-  void       *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[[]] =
-{
-  { "@PROGRAM@", (void *) 0 },
-_LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
-	  cat <<\_LT_EOF >> conftest.$ac_ext
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_save_LIBS="$LIBS"
-	  lt_save_CFLAGS="$CFLAGS"
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
-	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS="$lt_save_LIBS"
-	  CFLAGS="$lt_save_CFLAGS"
-	else
-	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
-    fi
-  else
-    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
-    cat conftest.$ac_ext >&5
-  fi
-  rm -rf conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-])
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  AC_MSG_RESULT(failed)
-else
-  AC_MSG_RESULT(ok)
-fi
-
-_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
-    [Take the output of nm and produce a listing of raw symbols and C names])
-_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
-    [Transform the output of nm in a proper C declaration])
-_LT_DECL([global_symbol_to_c_name_address],
-    [lt_cv_sys_global_symbol_to_c_name_address], [1],
-    [Transform the output of nm in a C name address pair])
-_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
-    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
-    [Transform the output of nm in a C name address pair when lib prefix is needed])
-]) # _LT_CMD_GLOBAL_SYMBOLS
-
-
-# _LT_COMPILER_PIC([TAGNAME])
-# ---------------------------
-m4_defun([_LT_COMPILER_PIC],
-[m4_require([_LT_TAG_COMPILER])dnl
-_LT_TAGVAR(lt_prog_compiler_wl, $1)=
-_LT_TAGVAR(lt_prog_compiler_pic, $1)=
-_LT_TAGVAR(lt_prog_compiler_static, $1)=
-
-AC_MSG_CHECKING([for $compiler option to produce PIC])
-m4_if([$1], [CXX], [
-  # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
-    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-    aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-    mingw* | cygwin* | os2* | pw32* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-    *djgpp*)
-      # DJGPP does not support shared libraries at all
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-      ;;
-    interix[[3-9]]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-    *qnx* | *nto*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-    *)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-  else
-    case $host_os in
-      aix[[4-9]]*)
-	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
-	  # AIX 5 now supports IA64 processor
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	else
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-	fi
-	;;
-      chorus*)
-	case $cc_basename in
-	cxch68*)
-	  # Green Hills C++ Compiler
-	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
-	  ;;
-	esac
-	;;
-      dgux*)
-	case $cc_basename in
-	  ec++*)
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  ghcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      freebsd* | dragonfly*)
-	# FreeBSD uses GNU C++
-	;;
-      hpux9* | hpux10* | hpux11*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	    fi
-	    ;;
-	  aCC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    case $host_cpu in
-	    hppa*64*|ia64*)
-	      # +Z the default
-	      ;;
-	    *)
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	      ;;
-	    esac
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      interix*)
-	# This is c89, which is MS Visual C++ (no shared libs)
-	# Anyone wants to do a port?
-	;;
-      irix5* | irix6* | nonstopux*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    # CC pic flag -KPIC is the default.
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-	case $cc_basename in
-	  KCC*)
-	    # KAI C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	    ;;
-	  ecpc* )
-	    # old Intel C++ for x86_64 which still supported -KPIC.
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	    ;;
-	  icpc* )
-	    # Intel C++, used to be incompatible with GCC.
-	    # ICC 10 doesn't accept -KPIC any more.
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	    ;;
-	  pgCC* | pgcpp*)
-	    # Portland Group C++ compiler
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  cxx*)
-	    # Compaq C++
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  xlc* | xlC*)
-	    # IBM XL 8.0 on PPC
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-      lynxos*)
-	;;
-      m88k*)
-	;;
-      mvs*)
-	case $cc_basename in
-	  cxx*)
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      netbsd* | netbsdelf*-gnu)
-	;;
-      *qnx* | *nto*)
-        # QNX uses GNU C++, but need to define -shared option too, otherwise
-        # it will coredump.
-        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-        ;;
-      osf3* | osf4* | osf5*)
-	case $cc_basename in
-	  KCC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    ;;
-	  RCC*)
-	    # Rational C++ 2.4.1
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  cxx*)
-	    # Digital/Compaq C++
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      psos*)
-	;;
-      solaris*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	    ;;
-	  gcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sunos4*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.x
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  lcc*)
-	    # Lucid
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	esac
-	;;
-      tandem*)
-	case $cc_basename in
-	  NCC*)
-	    # NonStop-UX NCC 3.20
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      vxworks*)
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-	;;
-    esac
-  fi
-],
-[
-  if test "$GCC" = yes; then
-    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	# +Z the default
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-
-    interix[[3-9]]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      enable_shared=no
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-
-    *)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      else
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC (with -KPIC) is the default.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
-      case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
-      ecc*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-        ;;
-      # icc used to be incompatible with GCC.
-      # ICC 10 doesn't accept -KPIC any more.
-      icc* | ifort*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-        ;;
-      # Lahey Fortran 8.1.
-      lf95*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
-	;;
-      pgcc* | pgf77* | pgf90* | pgf95*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-        ;;
-      ccc*)
-        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-        # All Alpha code is PIC.
-        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-        ;;
-      xl*)
-	# IBM XL C 8.0/Fortran 10.1 on PPC
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
-	;;
-      *)
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)
-	  # Sun C 5.9
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	  ;;
-	*Sun\ F*)
-	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
-	  ;;
-	esac
-	;;
-      esac
-      ;;
-
-    newsos6)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-
-    osf3* | osf4* | osf5*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # All OSF/1 code is PIC.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    rdos*)
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    solaris*)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    unicos*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-
-    uts4*)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    *)
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-    esac
-  fi
-])
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-    ;;
-  *)
-    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
-    ;;
-esac
-AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
-_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
-	[How to pass a linker flag through the compiler])
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
-  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
-    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
-    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
-    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
-     "" | " "*) ;;
-     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
-     esac],
-    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
-     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
-fi
-_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
-	[Additional compiler flags for building library objects])
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
-_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
-  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
-  $lt_tmp_static_flag,
-  [],
-  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
-_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
-	[Compiler flag to prevent dynamic linking])
-])# _LT_COMPILER_PIC
-
-
-# _LT_LINKER_SHLIBS([TAGNAME])
-# ----------------------------
-# See if the linker supports building shared libraries.
-m4_defun([_LT_LINKER_SHLIBS],
-[AC_REQUIRE([LT_PATH_LD])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-m4_if([$1], [CXX], [
-  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  case $host_os in
-  aix[[4-9]]*)
-    # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    else
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    fi
-    ;;
-  pw32*)
-    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
-  ;;
-  cygwin* | mingw* | cegcc*)
-    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  linux* | k*bsd*-gnu)
-    _LT_TAGVAR(link_all_deplibs, $1)=no
-  ;;
-  *)
-    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  ;;
-  esac
-  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
-], [
-  runpath_var=
-  _LT_TAGVAR(allow_undefined_flag, $1)=
-  _LT_TAGVAR(always_export_symbols, $1)=no
-  _LT_TAGVAR(archive_cmds, $1)=
-  _LT_TAGVAR(archive_expsym_cmds, $1)=
-  _LT_TAGVAR(compiler_needs_object, $1)=no
-  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
-  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  _LT_TAGVAR(hardcode_automatic, $1)=no
-  _LT_TAGVAR(hardcode_direct, $1)=no
-  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
-  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-  _LT_TAGVAR(hardcode_libdir_separator, $1)=
-  _LT_TAGVAR(hardcode_minus_L, $1)=no
-  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  _LT_TAGVAR(inherit_rpath, $1)=no
-  _LT_TAGVAR(link_all_deplibs, $1)=unknown
-  _LT_TAGVAR(module_cmds, $1)=
-  _LT_TAGVAR(module_expsym_cmds, $1)=
-  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
-  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
-  _LT_TAGVAR(thread_safe_flag_spec, $1)=
-  _LT_TAGVAR(whole_archive_flag_spec, $1)=
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  _LT_TAGVAR(include_expsyms, $1)=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  # Exclude shared library initialization/finalization symbols.
-dnl Note also adjust exclude_expsyms for C++ above.
-  extract_expsyms_cmds=
-
-  case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  linux* | k*bsd*-gnu)
-    _LT_TAGVAR(link_all_deplibs, $1)=no
-    ;;
-  esac
-
-  _LT_TAGVAR(ld_shlibs, $1)=yes
-  if test "$with_gnu_ld" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      _LT_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>&1` in
-      *GNU\ gold*) supports_anon_versioning=yes ;;
-      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[[3-9]]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
-
-_LT_EOF
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            _LT_TAGVAR(archive_expsym_cmds, $1)=''
-        ;;
-      m68k)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes
-        ;;
-      esac
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-      # as there is no search path for DLLs.
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(always_export_symbols, $1)=no
-      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
-
-      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    interix[[3-9]]*)
-      _LT_TAGVAR(hardcode_direct, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
-	case $cc_basename in
-	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
-	esac
-      fi
-      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
-      then
-	tmp_addflag=
-	tmp_sharedflag='-shared'
-	case $cc_basename,$host_cpu in
-        pgcc*)				# Portland Group C compiler
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	lf95*)				# Lahey Fortran 8.1
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
-	  tmp_sharedflag='--shared' ;;
-	xl[[cC]]*)			# IBM XL C 8.0 on PPC (deal with xlf below)
-	  tmp_sharedflag='-qmkshrobj'
-	  tmp_addflag= ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-	  _LT_TAGVAR(compiler_needs_object, $1)=yes
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	esac
-	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-        if test "x$supports_anon_versioning" = xyes; then
-          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-        fi
-
-	case $cc_basename in
-	xlf*)
-	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-	  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
-	  fi
-	  ;;
-	esac
-      else
-        _LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    netbsd* | netbsdelf*-gnu)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  # For security reasons, it is highly recommended that you always
-	  # use absolute paths for naming shared libraries, and exclude the
-	  # DT_RUNPATH tag from executables and libraries.  But doing so
-	  # requires that you compile everything twice, which is a pain.
-	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  else
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-    esac
-
-    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
-      runpath_var=
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
-      _LT_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(always_export_symbols, $1)=yes
-      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	_LT_TAGVAR(hardcode_direct, $1)=unsupported
-      fi
-      ;;
-
-    aix[[4-9]]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	else
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
-	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-	    aix_use_runtimelinking=yes
-	    break
-	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      _LT_TAGVAR(archive_cmds, $1)=''
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[[012]]|aix4.[[012]].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	  # We have reworked collect2
-	  :
-	  else
-	  # We have old collect2
-	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-	_LT_TAGVAR(link_all_deplibs, $1)=no
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      _LT_TAGVAR(always_export_symbols, $1)=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
-        # Determine the default libpath from the value encoded in an
-        # empty executable.
-        _LT_SYS_MODULE_PATH_AIX
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-      else
-	if test "$host_cpu" = ia64; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an
-	 # empty executable.
-	 _LT_SYS_MODULE_PATH_AIX
-	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	  # Exported symbols can be pulled into shared objects from archives
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            _LT_TAGVAR(archive_expsym_cmds, $1)=''
-        ;;
-      m68k)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes
-        ;;
-      esac
-      ;;
-
-    bsdi[[45]]*)
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
-      # FIXME: Should let the user specify the lib program.
-      _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
-      _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
-      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      ;;
-
-    darwin* | rhapsody*)
-      _LT_DARWIN_LINKER_FEATURES($1)
-      ;;
-
-    dgux*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    freebsd1*)
-      _LT_TAGVAR(ld_shlibs, $1)=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
-	_LT_TAGVAR(hardcode_direct, $1)=yes
-	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	_LT_TAGVAR(hardcode_minus_L, $1)=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  _LT_TAGVAR(hardcode_direct, $1)=no
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	  ;;
-	*)
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	# Try to use the -exported_symbol ld option, if it does not
-	# work, assume that -exports_file does not work either and
-	# implicitly export all symbols.
-        save_LDFLAGS="$LDFLAGS"
-        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-        AC_LINK_IFELSE(int foo(void) {},
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-        )
-        LDFLAGS="$save_LDFLAGS"
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(inherit_rpath, $1)=yes
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    netbsd* | netbsdelf*-gnu)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    newsos6)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *nto* | *qnx*)
-      ;;
-
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	_LT_TAGVAR(hardcode_direct, $1)=yes
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	else
-	  case $host_os in
-	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
-	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	     ;;
-	   *)
-	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-	fi
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    os2*)
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      else
-	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    solaris*)
-      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-      else
-	case `$CC -V 2>&1` in
-	*"Compilers 5.0"*)
-	  wlarc=''
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
-	  ;;
-	*)
-	  wlarc='${wl}'
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-	  ;;
-	esac
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      case $host_os in
-      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
-	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
-	  _LT_TAGVAR(hardcode_direct, $1)=no
-        ;;
-	motorola)
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4.3*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	_LT_TAGVAR(ld_shlibs, $1)=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      _LT_TAGVAR(ld_shlibs, $1)=no
-      ;;
-    esac
-
-    if test x$host_vendor = xsni; then
-      case $host in
-      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
-	;;
-      esac
-    fi
-  fi
-])
-AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
-
-_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
-_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
-_LT_DECL([], [extract_expsyms_cmds], [2],
-    [The commands to extract the exported symbol list from a shared archive])
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
-x|xyes)
-  # Assume -lc should be added
-  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $_LT_TAGVAR(archive_cmds, $1) in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      AC_MSG_CHECKING([whether -lc should be explicitly linked in])
-      $RM conftest*
-      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-      if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
-        soname=conftest
-        lib=conftest
-        libobjs=conftest.$ac_objext
-        deplibs=
-        wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
-	pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
-        compiler_flags=-v
-        linker_flags=-v
-        verstring=
-        output_objdir=.
-        libname=conftest
-        lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
-        _LT_TAGVAR(allow_undefined_flag, $1)=
-        if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
-        then
-	  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-        else
-	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-        fi
-        _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
-      else
-        cat conftest.err 1>&5
-      fi
-      $RM conftest*
-      AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)])
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
-    [Whether or not to add -lc for building shared libraries])
-_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
-    [enable_shared_with_static_runtimes], [0],
-    [Whether or not to disallow shared libs when runtime libs are static])
-_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
-    [Compiler flag to allow reflexive dlopens])
-_LT_TAGDECL([], [whole_archive_flag_spec], [1],
-    [Compiler flag to generate shared objects directly from archives])
-_LT_TAGDECL([], [compiler_needs_object], [1],
-    [Whether the compiler copes with passing no objects directly])
-_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
-    [Create an old-style archive from a shared archive])
-_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
-    [Create a temporary old-style archive to link instead of a shared archive])
-_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
-_LT_TAGDECL([], [archive_expsym_cmds], [2])
-_LT_TAGDECL([], [module_cmds], [2],
-    [Commands used to build a loadable module if different from building
-    a shared archive.])
-_LT_TAGDECL([], [module_expsym_cmds], [2])
-_LT_TAGDECL([], [with_gnu_ld], [1],
-    [Whether we are building with GNU ld or not])
-_LT_TAGDECL([], [allow_undefined_flag], [1],
-    [Flag that allows shared libraries with undefined symbols to be built])
-_LT_TAGDECL([], [no_undefined_flag], [1],
-    [Flag that enforces no undefined symbols])
-_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
-    [Flag to hardcode $libdir into a binary during linking.
-    This must work even if $libdir does not exist])
-_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1],
-    [[If ld is used when linking, flag to hardcode $libdir into a binary
-    during linking.  This must work even if $libdir does not exist]])
-_LT_TAGDECL([], [hardcode_libdir_separator], [1],
-    [Whether we need a single "-rpath" flag with a separated argument])
-_LT_TAGDECL([], [hardcode_direct], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
-    DIR into the resulting binary])
-_LT_TAGDECL([], [hardcode_direct_absolute], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
-    DIR into the resulting binary and the resulting library dependency is
-    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
-    library is relocated])
-_LT_TAGDECL([], [hardcode_minus_L], [0],
-    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-    into the resulting binary])
-_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
-    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-    into the resulting binary])
-_LT_TAGDECL([], [hardcode_automatic], [0],
-    [Set to "yes" if building a shared library automatically hardcodes DIR
-    into the library and all subsequent libraries and executables linked
-    against it])
-_LT_TAGDECL([], [inherit_rpath], [0],
-    [Set to yes if linker adds runtime paths of dependent libraries
-    to runtime path list])
-_LT_TAGDECL([], [link_all_deplibs], [0],
-    [Whether libtool must link a program against all its dependency libraries])
-_LT_TAGDECL([], [fix_srcfile_path], [1],
-    [Fix the shell variable $srcfile for the compiler])
-_LT_TAGDECL([], [always_export_symbols], [0],
-    [Set to "yes" if exported symbols are required])
-_LT_TAGDECL([], [export_symbols_cmds], [2],
-    [The commands to list exported symbols])
-_LT_TAGDECL([], [exclude_expsyms], [1],
-    [Symbols that should not be listed in the preloaded symbols])
-_LT_TAGDECL([], [include_expsyms], [1],
-    [Symbols that must always be exported])
-_LT_TAGDECL([], [prelink_cmds], [2],
-    [Commands necessary for linking programs (against libraries) with templates])
-_LT_TAGDECL([], [file_list_spec], [1],
-    [Specify filename containing input files])
-dnl FIXME: Not yet implemented
-dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
-dnl    [Compiler flag to generate thread safe objects])
-])# _LT_LINKER_SHLIBS
-
-
-# _LT_LANG_C_CONFIG([TAG])
-# ------------------------
-# Ensure that the configuration variables for a C compiler are suitably
-# defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_C_CONFIG],
-[m4_require([_LT_DECL_EGREP])dnl
-lt_save_CC="$CC"
-AC_LANG_PUSH(C)
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-_LT_TAG_COMPILER
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-  _LT_COMPILER_NO_RTTI($1)
-  _LT_COMPILER_PIC($1)
-  _LT_COMPILER_C_O($1)
-  _LT_COMPILER_FILE_LOCKS($1)
-  _LT_LINKER_SHLIBS($1)
-  _LT_SYS_DYNAMIC_LINKER($1)
-  _LT_LINKER_HARDCODE_LIBPATH($1)
-  LT_SYS_DLOPEN_SELF
-  _LT_CMD_STRIPLIB
-
-  # Report which library types will actually be built
-  AC_MSG_CHECKING([if libtool supports shared libraries])
-  AC_MSG_RESULT([$can_build_shared])
-
-  AC_MSG_CHECKING([whether to build shared libraries])
-  test "$can_build_shared" = "no" && enable_shared=no
-
-  # On AIX, shared libraries and static libraries use the same namespace, and
-  # are all built from PIC.
-  case $host_os in
-  aix3*)
-    test "$enable_shared" = yes && enable_static=no
-    if test -n "$RANLIB"; then
-      archive_cmds="$archive_cmds~\$RANLIB \$lib"
-      postinstall_cmds='$RANLIB $lib'
-    fi
-    ;;
-
-  aix[[4-9]]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
-    fi
-    ;;
-  esac
-  AC_MSG_RESULT([$enable_shared])
-
-  AC_MSG_CHECKING([whether to build static libraries])
-  # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
-  AC_MSG_RESULT([$enable_static])
-
-  _LT_CONFIG($1)
-fi
-AC_LANG_POP
-CC="$lt_save_CC"
-])# _LT_LANG_C_CONFIG
-
-
-# _LT_PROG_CXX
-# ------------
-# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++
-# compiler, we have our own version here.
-m4_defun([_LT_PROG_CXX],
-[
-pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes])
-AC_PROG_CXX
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
-  AC_PROG_CXXCPP
-else
-  _lt_caught_CXX_error=yes
-fi
-popdef([AC_MSG_ERROR])
-])# _LT_PROG_CXX
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([_LT_PROG_CXX], [])
-
-
-# _LT_LANG_CXX_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for a C++ compiler are suitably
-# defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_CXX_CONFIG],
-[AC_REQUIRE([_LT_PROG_CXX])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_EGREP])dnl
-
-AC_LANG_PUSH(C++)
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(compiler_needs_object, $1)=no
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for C++ test sources.
-ac_ext=cpp
-
-# Object file extension for compiled C++ test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the CXX compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="int some_variable = 0;"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC=$CC
-  lt_save_LD=$LD
-  lt_save_GCC=$GCC
-  GCC=$GXX
-  lt_save_with_gnu_ld=$with_gnu_ld
-  lt_save_path_LD=$lt_cv_path_LD
-  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
-    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
-  else
-    $as_unset lt_cv_prog_gnu_ld
-  fi
-  if test -n "${lt_cv_path_LDCXX+set}"; then
-    lt_cv_path_LD=$lt_cv_path_LDCXX
-  else
-    $as_unset lt_cv_path_LD
-  fi
-  test -z "${LDCXX+set}" || LD=$LDCXX
-  CC=${CXX-"c++"}
-  compiler=$CC
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-
-  if test -n "$compiler"; then
-    # We don't want -fno-exception when compiling C++ code, so set the
-    # no_builtin_flag separately
-    if test "$GXX" = yes; then
-      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
-    else
-      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-    fi
-
-    if test "$GXX" = yes; then
-      # Set up default GNU C++ configuration
-
-      LT_PATH_LD
-
-      # Check if GNU C++ uses GNU ld as the underlying linker, since the
-      # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-        # If archive_cmds runs LD, not CC, wlarc should be empty
-        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
-        #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
-
-        # ancient GNU ld didn't support --whole-archive et. al.
-        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
-	  $GREP 'no-whole-archive' > /dev/null; then
-          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-        else
-          _LT_TAGVAR(whole_archive_flag_spec, $1)=
-        fi
-      else
-        with_gnu_ld=no
-        wlarc=
-
-        # A generic and very simple default shared library creation
-        # command for GNU C++ for the case where it uses the native
-        # linker, instead of GNU ld.  If possible, this setting should
-        # overridden to take advantage of the native linker features on
-        # the platform it is being used on.
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-      fi
-
-      # Commands to make compiler produce verbose output that lists
-      # what "hidden" libraries, object files and flags are used when
-      # linking a shared library.
-      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
-
-    else
-      GXX=no
-      with_gnu_ld=no
-      wlarc=
-    fi
-
-    # PORTME: fill in a description of your system's C++ link characteristics
-    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-    _LT_TAGVAR(ld_shlibs, $1)=yes
-    case $host_os in
-      aix3*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-      aix[[4-9]]*)
-        if test "$host_cpu" = ia64; then
-          # On IA64, the linker does run time linking by default, so we don't
-          # have to do anything special.
-          aix_use_runtimelinking=no
-          exp_sym_flag='-Bexport'
-          no_entry_flag=""
-        else
-          aix_use_runtimelinking=no
-
-          # Test if we are trying to use run time linking or normal
-          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
-          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
-	    for ld_flag in $LDFLAGS; do
-	      case $ld_flag in
-	      *-brtl*)
-	        aix_use_runtimelinking=yes
-	        break
-	        ;;
-	      esac
-	    done
-	    ;;
-          esac
-
-          exp_sym_flag='-bexport'
-          no_entry_flag='-bnoentry'
-        fi
-
-        # When large executables or shared objects are built, AIX ld can
-        # have problems creating the table of contents.  If linking a library
-        # or program results in "error TOC overflow" add -mminimal-toc to
-        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-        _LT_TAGVAR(archive_cmds, $1)=''
-        _LT_TAGVAR(hardcode_direct, $1)=yes
-        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-        _LT_TAGVAR(link_all_deplibs, $1)=yes
-        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
-
-        if test "$GXX" = yes; then
-          case $host_os in aix4.[[012]]|aix4.[[012]].*)
-          # We only want to do this on AIX 4.2 and lower, the check
-          # below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	    # We have reworked collect2
-	    :
-	  else
-	    # We have old collect2
-	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
-	    # It fails to find uninstalled libraries when the uninstalled
-	    # path is not listed in the libpath.  Setting hardcode_minus_L
-	    # to unsupported forces relinking
-	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
-	  fi
-          esac
-          shared_flag='-shared'
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag="$shared_flag "'${wl}-G'
-	  fi
-        else
-          # not using gcc
-          if test "$host_cpu" = ia64; then
-	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	  # chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-          else
-	    if test "$aix_use_runtimelinking" = yes; then
-	      shared_flag='${wl}-G'
-	    else
-	      shared_flag='${wl}-bM:SRE'
-	    fi
-          fi
-        fi
-
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
-        # It seems that -bexpall does not export symbols beginning with
-        # underscore (_), so it is better to generate a list of symbols to
-	# export.
-        _LT_TAGVAR(always_export_symbols, $1)=yes
-        if test "$aix_use_runtimelinking" = yes; then
-          # Warning - without using the other runtime loading flags (-brtl),
-          # -berok will link without error, but may produce a broken library.
-          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
-          # Determine the default libpath from the value encoded in an empty
-          # executable.
-          _LT_SYS_MODULE_PATH_AIX
-          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-        else
-          if test "$host_cpu" = ia64; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-          else
-	    # Determine the default libpath from the value encoded in an
-	    # empty executable.
-	    _LT_SYS_MODULE_PATH_AIX
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	    # Warning - without using the other run time loading flags,
-	    # -berok will link without error, but may produce a broken library.
-	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	    # Exported symbols can be pulled into shared objects from archives
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	    # This is similar to how AIX traditionally builds its shared
-	    # libraries.
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-          fi
-        fi
-        ;;
-
-      beos*)
-	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	  # support --undefined.  This deserves some investigation.  FIXME
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	else
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-
-      chorus*)
-        case $cc_basename in
-          *)
-	  # FIXME: insert proper C++ library support
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	  ;;
-        esac
-        ;;
-
-      cygwin* | mingw* | pw32* | cegcc*)
-        # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-        # as there is no search path for DLLs.
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-        _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-        _LT_TAGVAR(always_export_symbols, $1)=no
-        _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-
-        if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-          # If the export-symbols file already is a .def file (1st line
-          # is EXPORTS), use it as is; otherwise, prepend...
-          _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    cp $export_symbols $output_objdir/$soname.def;
-          else
-	    echo EXPORTS > $output_objdir/$soname.def;
-	    cat $export_symbols >> $output_objdir/$soname.def;
-          fi~
-          $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-        else
-          _LT_TAGVAR(ld_shlibs, $1)=no
-        fi
-        ;;
-      darwin* | rhapsody*)
-        _LT_DARWIN_LINKER_FEATURES($1)
-	;;
-
-      dgux*)
-        case $cc_basename in
-          ec++*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          ghcx*)
-	    # Green Hills C++ Compiler
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      freebsd[[12]]*)
-        # C++ shared libraries reported to be fairly broken before
-	# switch to ELF
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      freebsd-elf*)
-        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-        ;;
-
-      freebsd* | dragonfly*)
-        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
-        # conventions
-        _LT_TAGVAR(ld_shlibs, $1)=yes
-        ;;
-
-      gnu*)
-        ;;
-
-      hpux9*)
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-        _LT_TAGVAR(hardcode_direct, $1)=yes
-        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-				             # but as the default
-				             # location of the library.
-
-        case $cc_basename in
-          CC*)
-            # FIXME: insert proper C++ library support
-            _LT_TAGVAR(ld_shlibs, $1)=no
-            ;;
-          aCC*)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            # Commands to make compiler produce verbose output that lists
-            # what "hidden" libraries, object files and flags are used when
-            # linking a shared library.
-            #
-            # There doesn't appear to be a way to prevent this compiler from
-            # explicitly linking system object files so we need to strip them
-            # from the output so that they don't get included in the library
-            # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
-            ;;
-          *)
-            if test "$GXX" = yes; then
-              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            else
-              # FIXME: insert proper C++ library support
-              _LT_TAGVAR(ld_shlibs, $1)=no
-            fi
-            ;;
-        esac
-        ;;
-
-      hpux10*|hpux11*)
-        if test $with_gnu_ld = no; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-          case $host_cpu in
-            hppa*64*|ia64*)
-              ;;
-            *)
-	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-              ;;
-          esac
-        fi
-        case $host_cpu in
-          hppa*64*|ia64*)
-            _LT_TAGVAR(hardcode_direct, $1)=no
-            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-            ;;
-          *)
-            _LT_TAGVAR(hardcode_direct, $1)=yes
-            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-					         # but as the default
-					         # location of the library.
-            ;;
-        esac
-
-        case $cc_basename in
-          CC*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          aCC*)
-	    case $host_cpu in
-	      hppa*64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      ia64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      *)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	    esac
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test $with_gnu_ld = no; then
-	        case $host_cpu in
-	          hppa*64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          ia64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          *)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	        esac
-	      fi
-	    else
-	      # FIXME: insert proper C++ library support
-	      _LT_TAGVAR(ld_shlibs, $1)=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      interix[[3-9]]*)
-	_LT_TAGVAR(hardcode_direct, $1)=no
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-	# Instead, shared libraries are loaded at an image base (0x10000000 by
-	# default) and relocated if they conflict, which is a slow very memory
-	# consuming and fragmenting process.  To avoid this, we pick a random,
-	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	;;
-      irix5* | irix6*)
-        case $cc_basename in
-          CC*)
-	    # SGI C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test "$with_gnu_ld" = no; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	      else
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib'
-	      fi
-	    fi
-	    _LT_TAGVAR(link_all_deplibs, $1)=yes
-	    ;;
-        esac
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(inherit_rpath, $1)=yes
-        ;;
-
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
-	    ;;
-	  icpc* | ecpc* )
-	    # Intel C++
-	    with_gnu_ld=yes
-	    # version 8.0 and above of icpc choke on multiply defined symbols
-	    # if we add $predep_objects and $postdep_objects, however 7.1 and
-	    # earlier do not add the objects themselves.
-	    case `$CC -V 2>&1` in
-	      *"Version 7."*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	      *)  # Version 8.0 or newer
-	        tmp_idyn=
-	        case $host_cpu in
-		  ia64*) tmp_idyn=' -i_dynamic';;
-		esac
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	    esac
-	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    ;;
-          pgCC* | pgcpp*)
-            # Portland Group C++ compiler
-	    case `$CC -V` in
-	    *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*)
-	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-		compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"'
-	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~
-		$RANLIB $oldlib'
-	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    *) # Version 6 will use weak symbols
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    esac
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-            ;;
-	  cxx*)
-	    # Compaq C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
-
-	    runpath_var=LD_RUN_PATH
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
-	    ;;
-	  xl*)
-	    # IBM XL 8.0 on PPC, with GNU ld
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    if test "x$supports_anon_versioning" = xyes; then
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-		echo "local: *; };" >> $output_objdir/$libname.ver~
-		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-	    fi
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-	      _LT_TAGVAR(compiler_needs_object, $1)=yes
-
-	      # Not sure whether something based on
-	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
-	      # would be better.
-	      output_verbose_link_cmd='echo'
-
-	      # Archives containing C++ object files must be created using
-	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	      # necessary to make sure instantiated templates are included
-	      # in the archive.
-	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-
-      lynxos*)
-        # FIXME: insert proper C++ library support
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      m88k*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      mvs*)
-        case $cc_basename in
-          cxx*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-	  *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-	esac
-	;;
-
-      netbsd*)
-        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
-	  wlarc=
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	fi
-	# Workaround some broken pre-1.5 toolchains
-	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
-	;;
-
-      *nto* | *qnx*)
-        _LT_TAGVAR(ld_shlibs, $1)=yes
-	;;
-
-      openbsd2*)
-        # C++ shared libraries are fairly broken
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      openbsd*)
-	if test -f /usr/libexec/ld.so; then
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-	  fi
-	  output_verbose_link_cmd=echo
-	else
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-
-      osf3* | osf4* | osf5*)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Archives containing C++ object files must be created using
-	    # the KAI C++ compiler.
-	    case $host in
-	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
-	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
-	    esac
-	    ;;
-          RCC*)
-	    # Rational C++ 2.4.1
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          cxx*)
-	    case $host in
-	      osf3*)
-	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-		;;
-	      *)
-	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	          echo "-hidden">> $lib.exp~
-	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~
-	          $RM $lib.exp'
-	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-		;;
-	    esac
-
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed'
-	    ;;
-	  *)
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	      case $host in
-	        osf3*)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	        *)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	      esac
-
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	      # Commands to make compiler produce verbose output that lists
-	      # what "hidden" libraries, object files and flags are used when
-	      # linking a shared library.
-	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
-
-	    else
-	      # FIXME: insert proper C++ library support
-	      _LT_TAGVAR(ld_shlibs, $1)=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      psos*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      sunos4*)
-        case $cc_basename in
-          CC*)
-	    # Sun C++ 4.x
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          lcc*)
-	    # Lucid
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      solaris*)
-        case $cc_basename in
-          CC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
-	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	    case $host_os in
-	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-	      *)
-		# The compiler driver will combine and reorder linker options,
-		# but understands `-z linker_flag'.
-	        # Supported since Solaris 2.6 (maybe 2.5.1?)
-		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
-	        ;;
-	    esac
-	    _LT_TAGVAR(link_all_deplibs, $1)=yes
-
-	    output_verbose_link_cmd='echo'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
-	    ;;
-          gcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-
-	    # The C++ compiler must be used to create the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    # GNU C++ compiler with Solaris linker
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
-	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
-	      else
-	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
-	        # platform.
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"'
-	      fi
-
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
-	      case $host_os in
-		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-		*)
-		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-		  ;;
-	      esac
-	    fi
-	    ;;
-        esac
-        ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      runpath_var='LD_RUN_PATH'
-
-      case $cc_basename in
-        CC*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-      esac
-      ;;
-
-      sysv5* | sco3.2v5* | sco5v6*)
-	# Note: We can NOT use -z defs as we might desire, because we do not
-	# link with -lc, and that would cause any symbols used from libc to
-	# always be unresolved, which means just about no library would
-	# ever link correctly.  If we're not using GNU ld we use -z text
-	# though, which does catch some bad symbols but isn't as heavy-handed
-	# as -z defs.
-	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-	_LT_TAGVAR(link_all_deplibs, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-	runpath_var='LD_RUN_PATH'
-
-	case $cc_basename in
-          CC*)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    ;;
-	  *)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    ;;
-	esac
-      ;;
-
-      tandem*)
-        case $cc_basename in
-          NCC*)
-	    # NonStop-UX NCC 3.20
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      vxworks*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      *)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-    esac
-
-    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-    _LT_TAGVAR(GCC, $1)="$GXX"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_SYS_HIDDEN_LIBDEPS($1)
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  CC=$lt_save_CC
-  LDCXX=$LD
-  LD=$lt_save_LD
-  GCC=$lt_save_GCC
-  with_gnu_ld=$lt_save_with_gnu_ld
-  lt_cv_path_LDCXX=$lt_cv_path_LD
-  lt_cv_path_LD=$lt_save_path_LD
-  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
-  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
-
-AC_LANG_POP
-])# _LT_LANG_CXX_CONFIG
-
-
-# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
-# ---------------------------------
-# Figure out "hidden" library dependencies from verbose
-# compiler output when linking a shared library.
-# Parse the compiler output and extract the necessary
-# objects, libraries and library flags.
-m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-# Dependencies to place before and after the object being linked:
-_LT_TAGVAR(predep_objects, $1)=
-_LT_TAGVAR(postdep_objects, $1)=
-_LT_TAGVAR(predeps, $1)=
-_LT_TAGVAR(postdeps, $1)=
-_LT_TAGVAR(compiler_lib_search_path, $1)=
-
-dnl we can't use the lt_simple_compile_test_code here,
-dnl because it contains code intended for an executable,
-dnl not a library.  It's possible we should let each
-dnl tag define a new lt_????_link_test_code variable,
-dnl but it's only used here...
-m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
-int a;
-void foo (void) { a = 0; }
-_LT_EOF
-], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
-class Foo
-{
-public:
-  Foo (void) { a = 0; }
-private:
-  int a;
-};
-_LT_EOF
-], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
-      subroutine foo
-      implicit none
-      integer*4 a
-      a=0
-      return
-      end
-_LT_EOF
-], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
-      subroutine foo
-      implicit none
-      integer a
-      a=0
-      return
-      end
-_LT_EOF
-], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
-public class foo {
-  private int a;
-  public void bar (void) {
-    a = 0;
-  }
-};
-_LT_EOF
-])
-dnl Parse the compiler output and extract the necessary
-dnl objects, libraries and library flags.
-if AC_TRY_EVAL(ac_compile); then
-  # Parse the compiler output and extract the necessary
-  # objects, libraries and library flags.
-
-  # Sentinel used to keep track of whether or not we are before
-  # the conftest object file.
-  pre_test_object_deps_done=no
-
-  for p in `eval "$output_verbose_link_cmd"`; do
-    case $p in
-
-    -L* | -R* | -l*)
-       # Some compilers place space between "-{L,R}" and the path.
-       # Remove the space.
-       if test $p = "-L" ||
-          test $p = "-R"; then
-	 prev=$p
-	 continue
-       else
-	 prev=
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 case $p in
-	 -L* | -R*)
-	   # Internal compiler library paths should come after those
-	   # provided the user.  The postdeps already come after the
-	   # user supplied libs so there is no need to process them.
-	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
-	   else
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
-	   fi
-	   ;;
-	 # The "-l" case would never come before the object being
-	 # linked, so don't bother handling this case.
-	 esac
-       else
-	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
-	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
-	 else
-	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
-	 fi
-       fi
-       ;;
-
-    *.$objext)
-       # This assumes that the test object file only shows up
-       # once in the compiler output.
-       if test "$p" = "conftest.$objext"; then
-	 pre_test_object_deps_done=yes
-	 continue
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
-	   _LT_TAGVAR(predep_objects, $1)="$p"
-	 else
-	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
-	 fi
-       else
-	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
-	   _LT_TAGVAR(postdep_objects, $1)="$p"
-	 else
-	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
-	 fi
-       fi
-       ;;
-
-    *) ;; # Ignore the rest.
-
-    esac
-  done
-
-  # Clean up.
-  rm -f a.out a.exe
-else
-  echo "libtool.m4: error: problem compiling $1 test program"
-fi
-
-$RM -f confest.$objext
-
-# PORTME: override above test on systems where it is broken
-m4_if([$1], [CXX],
-[case $host_os in
-interix[[3-9]]*)
-  # Interix 3.5 installs completely hosed .la files for C++, so rather than
-  # hack all around it, let's just trust "g++" to DTRT.
-  _LT_TAGVAR(predep_objects,$1)=
-  _LT_TAGVAR(postdep_objects,$1)=
-  _LT_TAGVAR(postdeps,$1)=
-  ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-esac
-])
-
-case " $_LT_TAGVAR(postdeps, $1) " in
-*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
-esac
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=
-if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
-fi
-_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
-    [The directories searched by this compiler when creating a shared library])
-_LT_TAGDECL([], [predep_objects], [1],
-    [Dependencies to place before and after the objects being linked to
-    create a shared library])
-_LT_TAGDECL([], [postdep_objects], [1])
-_LT_TAGDECL([], [predeps], [1])
-_LT_TAGDECL([], [postdeps], [1])
-_LT_TAGDECL([], [compiler_lib_search_path], [1],
-    [The library search path used internally by the compiler when linking
-    a shared library])
-])# _LT_SYS_HIDDEN_LIBDEPS
-
-
-# _LT_PROG_F77
-# ------------
-# Since AC_PROG_F77 is broken, in that it returns the empty string
-# if there is no fortran compiler, we have our own version here.
-m4_defun([_LT_PROG_F77],
-[
-pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes])
-AC_PROG_F77
-if test -z "$F77" || test "X$F77" = "Xno"; then
-  _lt_disable_F77=yes
-fi
-popdef([AC_MSG_ERROR])
-])# _LT_PROG_F77
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([_LT_PROG_F77], [])
-
-
-# _LT_LANG_F77_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for a Fortran 77 compiler are
-# suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_F77_CONFIG],
-[AC_REQUIRE([_LT_PROG_F77])dnl
-AC_LANG_PUSH(Fortran 77)
-
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for f77 test sources.
-ac_ext=f
-
-# Object file extension for compiled f77 test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the F77 compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_F77" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="\
-      subroutine t
-      return
-      end
-"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code="\
-      program t
-      end
-"
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
-  lt_save_GCC=$GCC
-  CC=${F77-"f77"}
-  compiler=$CC
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-  GCC=$G77
-  if test -n "$compiler"; then
-    AC_MSG_CHECKING([if libtool supports shared libraries])
-    AC_MSG_RESULT([$can_build_shared])
-
-    AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
-
-    # On AIX, shared libraries and static libraries use the same namespace, and
-    # are all built from PIC.
-    case $host_os in
-      aix3*)
-        test "$enable_shared" = yes && enable_static=no
-        if test -n "$RANLIB"; then
-          archive_cmds="$archive_cmds~\$RANLIB \$lib"
-          postinstall_cmds='$RANLIB $lib'
-        fi
-        ;;
-      aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
-	fi
-        ;;
-    esac
-    AC_MSG_RESULT([$enable_shared])
-
-    AC_MSG_CHECKING([whether to build static libraries])
-    # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
-    AC_MSG_RESULT([$enable_static])
-
-    _LT_TAGVAR(GCC, $1)="$G77"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  GCC=$lt_save_GCC
-  CC="$lt_save_CC"
-fi # test "$_lt_disable_F77" != yes
-
-AC_LANG_POP
-])# _LT_LANG_F77_CONFIG
-
-
-# _LT_PROG_FC
-# -----------
-# Since AC_PROG_FC is broken, in that it returns the empty string
-# if there is no fortran compiler, we have our own version here.
-m4_defun([_LT_PROG_FC],
-[
-pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes])
-AC_PROG_FC
-if test -z "$FC" || test "X$FC" = "Xno"; then
-  _lt_disable_FC=yes
-fi
-popdef([AC_MSG_ERROR])
-])# _LT_PROG_FC
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([_LT_PROG_FC], [])
-
-
-# _LT_LANG_FC_CONFIG([TAG])
-# -------------------------
-# Ensure that the configuration variables for a Fortran compiler are
-# suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_FC_CONFIG],
-[AC_REQUIRE([_LT_PROG_FC])dnl
-AC_LANG_PUSH(Fortran)
-
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for fc test sources.
-ac_ext=${ac_fc_srcext-f}
-
-# Object file extension for compiled fc test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the FC compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_FC" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="\
-      subroutine t
-      return
-      end
-"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code="\
-      program t
-      end
-"
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
-  lt_save_GCC=$GCC
-  CC=${FC-"f95"}
-  compiler=$CC
-  GCC=$ac_cv_fc_compiler_gnu
-
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-
-  if test -n "$compiler"; then
-    AC_MSG_CHECKING([if libtool supports shared libraries])
-    AC_MSG_RESULT([$can_build_shared])
-
-    AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
-
-    # On AIX, shared libraries and static libraries use the same namespace, and
-    # are all built from PIC.
-    case $host_os in
-      aix3*)
-        test "$enable_shared" = yes && enable_static=no
-        if test -n "$RANLIB"; then
-          archive_cmds="$archive_cmds~\$RANLIB \$lib"
-          postinstall_cmds='$RANLIB $lib'
-        fi
-        ;;
-      aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
-	fi
-        ;;
-    esac
-    AC_MSG_RESULT([$enable_shared])
-
-    AC_MSG_CHECKING([whether to build static libraries])
-    # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
-    AC_MSG_RESULT([$enable_static])
-
-    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_SYS_HIDDEN_LIBDEPS($1)
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  GCC=$lt_save_GCC
-  CC="$lt_save_CC"
-fi # test "$_lt_disable_FC" != yes
-
-AC_LANG_POP
-])# _LT_LANG_FC_CONFIG
-
-
-# _LT_LANG_GCJ_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for the GNU Java Compiler compiler
-# are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_GCJ_CONFIG],
-[AC_REQUIRE([LT_PROG_GCJ])dnl
-AC_LANG_SAVE
-
-# Source file extension for Java test sources.
-ac_ext=java
-
-# Object file extension for compiled Java test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="class foo {}"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-lt_save_GCC=$GCC
-GCC=yes
-CC=${GCJ-"gcj"}
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
-_LT_CC_BASENAME([$compiler])
-
-# GCJ did not exist at the time GCC didn't implicitly link libc in.
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-  _LT_COMPILER_NO_RTTI($1)
-  _LT_COMPILER_PIC($1)
-  _LT_COMPILER_C_O($1)
-  _LT_COMPILER_FILE_LOCKS($1)
-  _LT_LINKER_SHLIBS($1)
-  _LT_LINKER_HARDCODE_LIBPATH($1)
-
-  _LT_CONFIG($1)
-fi
-
-AC_LANG_RESTORE
-
-GCC=$lt_save_GCC
-CC="$lt_save_CC"
-])# _LT_LANG_GCJ_CONFIG
-
-
-# _LT_LANG_RC_CONFIG([TAG])
-# -------------------------
-# Ensure that the configuration variables for the Windows resource compiler
-# are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_RC_CONFIG],
-[AC_REQUIRE([LT_PROG_RC])dnl
-AC_LANG_SAVE
-
-# Source file extension for RC test sources.
-ac_ext=rc
-
-# Object file extension for compiled RC test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
-
-# Code to be used in simple link tests
-lt_simple_link_test_code="$lt_simple_compile_test_code"
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-lt_save_GCC=$GCC
-GCC=
-CC=${RC-"windres"}
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-
-if test -n "$compiler"; then
-  :
-  _LT_CONFIG($1)
-fi
-
-GCC=$lt_save_GCC
-AC_LANG_RESTORE
-CC="$lt_save_CC"
-])# _LT_LANG_RC_CONFIG
-
-
-# LT_PROG_GCJ
-# -----------
-AC_DEFUN([LT_PROG_GCJ],
-[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
-  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
-    [AC_CHECK_TOOL(GCJ, gcj,)
-      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
-      AC_SUBST(GCJFLAGS)])])[]dnl
-])
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
-
-
-# LT_PROG_RC
-# ----------
-AC_DEFUN([LT_PROG_RC],
-[AC_CHECK_TOOL(RC, windres,)
-])
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_RC], [])
-
-
-# _LT_DECL_EGREP
-# --------------
-# If we don't have a new enough Autoconf to choose the best grep
-# available, choose the one first in the user's PATH.
-m4_defun([_LT_DECL_EGREP],
-[AC_REQUIRE([AC_PROG_EGREP])dnl
-AC_REQUIRE([AC_PROG_FGREP])dnl
-test -z "$GREP" && GREP=grep
-_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
-_LT_DECL([], [EGREP], [1], [An ERE matcher])
-_LT_DECL([], [FGREP], [1], [A literal string matcher])
-dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
-AC_SUBST([GREP])
-])
-
-
-# _LT_DECL_OBJDUMP
-# --------------
-# If we don't have a new enough Autoconf to choose the best objdump
-# available, choose the one first in the user's PATH.
-m4_defun([_LT_DECL_OBJDUMP],
-[AC_CHECK_TOOL(OBJDUMP, objdump, false)
-test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
-AC_SUBST([OBJDUMP])
-])
-
-
-# _LT_DECL_SED
-# ------------
-# Check for a fully-functional sed program, that truncates
-# as few characters as possible.  Prefer GNU sed if found.
-m4_defun([_LT_DECL_SED],
-[AC_PROG_SED
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
-_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
-    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
-])# _LT_DECL_SED
-
-m4_ifndef([AC_PROG_SED], [
-############################################################
-# NOTE: This macro has been submitted for inclusion into   #
-#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
-#  a released version of Autoconf we should remove this    #
-#  macro and use it instead.                               #
-############################################################
-
-m4_defun([AC_PROG_SED],
-[AC_MSG_CHECKING([for a sed that does not truncate output])
-AC_CACHE_VAL(lt_cv_path_SED,
-[# Loop through the user's path and test for sed and gsed.
-# Then use that list of sed's as ones to test for truncation.
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for lt_ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
-        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
-      fi
-    done
-  done
-done
-IFS=$as_save_IFS
-lt_ac_max=0
-lt_ac_count=0
-# Add /usr/xpg4/bin/sed as it is typically found on Solaris
-# along with /bin/sed that truncates output.
-for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
-  test ! -f $lt_ac_sed && continue
-  cat /dev/null > conftest.in
-  lt_ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
-  # Check for GNU sed and select it if it is found.
-  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
-    lt_cv_path_SED=$lt_ac_sed
-    break
-  fi
-  while true; do
-    cat conftest.in conftest.in >conftest.tmp
-    mv conftest.tmp conftest.in
-    cp conftest.in conftest.nl
-    echo >>conftest.nl
-    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
-    cmp -s conftest.out conftest.nl || break
-    # 10000 chars as input seems more than enough
-    test $lt_ac_count -gt 10 && break
-    lt_ac_count=`expr $lt_ac_count + 1`
-    if test $lt_ac_count -gt $lt_ac_max; then
-      lt_ac_max=$lt_ac_count
-      lt_cv_path_SED=$lt_ac_sed
-    fi
-  done
-done
-])
-SED=$lt_cv_path_SED
-AC_SUBST([SED])
-AC_MSG_RESULT([$SED])
-])#AC_PROG_SED
-])#m4_ifndef
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_SED], [])
-
-
-# _LT_CHECK_SHELL_FEATURES
-# ------------------------
-# Find out whether the shell is Bourne or XSI compatible,
-# or has some other useful features.
-m4_defun([_LT_CHECK_SHELL_FEATURES],
-[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-AC_MSG_RESULT([$xsi_shell])
-_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
-
-AC_MSG_CHECKING([whether the shell understands "+="])
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-AC_MSG_RESULT([$lt_shell_append])
-_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  lt_unset=unset
-else
-  lt_unset=false
-fi
-_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  lt_SP2NL='tr \040 \012'
-  lt_NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  lt_SP2NL='tr \100 \n'
-  lt_NL2SP='tr \r\n \100\100'
-  ;;
-esac
-_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
-_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
-])# _LT_CHECK_SHELL_FEATURES
-
-
-# _LT_PROG_XSI_SHELLFNS
-# ---------------------
-# Bourne and XSI compatible variants of some useful shell functions.
-m4_defun([_LT_PROG_XSI_SHELLFNS],
-[case $xsi_shell in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result="${1##*/}"
-}
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-  func_basename_result="${1##*/}"
-}
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-func_stripname ()
-{
-  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-  # positional parameters, so assign one to ordinary parameter first.
-  func_stripname_result=${3}
-  func_stripname_result=${func_stripname_result#"${1}"}
-  func_stripname_result=${func_stripname_result%"${2}"}
-}
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=${1%%=*}
-  func_opt_split_arg=${1#*=}
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  case ${1} in
-    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-    *)    func_lo2o_result=${1} ;;
-  esac
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=${1%.*}.lo
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=$(( $[*] ))
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=${#1}
-}
-
-_LT_EOF
-    ;;
-  *) # Bourne compatible functions.
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
-}
-
-dnl func_dirname_and_basename
-dnl A portable version of this function is already defined in general.m4sh
-dnl so there is no need for it here.
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-  case ${2} in
-    .*) func_stripname_result=`$ECHO "X${3}" \
-           | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
-    *)  func_stripname_result=`$ECHO "X${3}" \
-           | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
-  esac
-}
-
-# sed scripts:
-my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q'
-my_sed_long_arg='1s/^-[[^=]]*=//'
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
-  func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'`
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=`expr "$[@]"`
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len`
-}
-
-_LT_EOF
-esac
-
-case $lt_shell_append in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$[1]+=\$[2]"
-}
-_LT_EOF
-    ;;
-  *)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$[1]=\$$[1]\$[2]"
-}
-
-_LT_EOF
-    ;;
-  esac
-])
diff --git a/cloog-0.17.0/osl/autoconf/ltmain.sh b/cloog-0.17.0/osl/autoconf/ltmain.sh
deleted file mode 100755
index fa4b1e1..0000000
--- a/cloog-0.17.0/osl/autoconf/ltmain.sh
+++ /dev/null
@@ -1,8413 +0,0 @@
-# Generated from ltmain.m4sh.
-
-# ltmain.sh (GNU libtool) 2.2.6b
-# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 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.
-
-# GNU Libtool is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html,
-# or obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-# Usage: $progname [OPTION]... [MODE-ARG]...
-#
-# Provide generalized library-building support services.
-#
-#     --config             show all configuration variables
-#     --debug              enable verbose shell tracing
-# -n, --dry-run            display commands without modifying any files
-#     --features           display basic configuration information and exit
-#     --mode=MODE          use operation mode MODE
-#     --preserve-dup-deps  don't remove duplicate dependency libraries
-#     --quiet, --silent    don't print informational messages
-#     --tag=TAG            use configuration variables from tag TAG
-# -v, --verbose            print informational messages (default)
-#     --version            print version information
-# -h, --help               print short or long help message
-#
-# MODE must be one of the following:
-#
-#       clean              remove files from the build directory
-#       compile            compile a source file into a libtool object
-#       execute            automatically set library path, then run a program
-#       finish             complete the installation of libtool libraries
-#       install            install libraries or executables
-#       link               create a library or an executable
-#       uninstall          remove libraries from an installed directory
-#
-# MODE-ARGS vary depending on the MODE.
-# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
-#
-# When reporting a bug, please describe a test case to reproduce it and
-# include the following information:
-#
-#       host-triplet:	$host
-#       shell:		$SHELL
-#       compiler:		$LTCC
-#       compiler flags:		$LTCFLAGS
-#       linker:		$LD (gnu? $with_gnu_ld)
-#       $progname:		(GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu3
-#       automake:		$automake_version
-#       autoconf:		$autoconf_version
-#
-# Report bugs to <bug-libtool@gnu.org>.
-
-PROGRAM=ltmain.sh
-PACKAGE=libtool
-VERSION="2.2.6b Debian-2.2.6b-2ubuntu3"
-TIMESTAMP=""
-package_revision=1.3017
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# NLS nuisances: We save the old values to restore during execute mode.
-# Only set LANG and LC_ALL to C if already set.
-# These must not be set unconditionally because not all systems understand
-# e.g. LANG=C (notably SCO).
-lt_user_locale=
-lt_safe_locale=
-for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-do
-  eval "if test \"\${$lt_var+set}\" = set; then
-          save_$lt_var=\$$lt_var
-          $lt_var=C
-	  export $lt_var
-	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
-	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
-	fi"
-done
-
-$lt_unset CDPATH
-
-
-
-
-
-: ${CP="cp -f"}
-: ${ECHO="echo"}
-: ${EGREP="/bin/grep -E"}
-: ${FGREP="/bin/grep -F"}
-: ${GREP="/bin/grep"}
-: ${LN_S="ln -s"}
-: ${MAKE="make"}
-: ${MKDIR="mkdir"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-: ${SED="/bin/sed"}
-: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
-: ${Xsed="$SED -e 1s/^X//"}
-
-# Global variables:
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
-EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
-
-exit_status=$EXIT_SUCCESS
-
-# Make sure IFS has a sensible default
-lt_nl='
-'
-IFS=" 	$lt_nl"
-
-dirname="s,/[^/]*$,,"
-basename="s,^.*/,,"
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
-}
-
-# Generated shell functions inserted here.
-
-# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
-# is ksh but when the shell is invoked as "sh" and the current value of
-# the _XPG environment variable is not equal to 1 (one), the special
-# positional parameter $0, within a function call, is the name of the
-# function.
-progpath="$0"
-
-# The name of this program:
-# In the unlikely event $progname began with a '-', it would play havoc with
-# func_echo (imagine progname=-n), so we prepend ./ in that case:
-func_dirname_and_basename "$progpath"
-progname=$func_basename_result
-case $progname in
-  -*) progname=./$progname ;;
-esac
-
-# Make sure we have an absolute path for reexecution:
-case $progpath in
-  [\\/]*|[A-Za-z]:\\*) ;;
-  *[\\/]*)
-     progdir=$func_dirname_result
-     progdir=`cd "$progdir" && pwd`
-     progpath="$progdir/$progname"
-     ;;
-  *)
-     save_IFS="$IFS"
-     IFS=:
-     for progdir in $PATH; do
-       IFS="$save_IFS"
-       test -x "$progdir/$progname" && break
-     done
-     IFS="$save_IFS"
-     test -n "$progdir" || progdir=`pwd`
-     progpath="$progdir/$progname"
-     ;;
-esac
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed="${SED}"' -e 1s/^X//'
-sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Re-`\' parameter expansions in output of double_quote_subst that were
-# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
-# in input to double_quote_subst, that '$' was protected from expansion.
-# Since each input `\' is now two `\'s, look for any number of runs of
-# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
-bs='\\'
-bs2='\\\\'
-bs4='\\\\\\\\'
-dollar='\$'
-sed_double_backslash="\
-  s/$bs4/&\\
-/g
-  s/^$bs2$dollar/$bs&/
-  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
-  s/\n//g"
-
-# Standard options:
-opt_dry_run=false
-opt_help=false
-opt_quiet=false
-opt_verbose=false
-opt_warning=:
-
-# func_echo arg...
-# Echo program name prefixed message, along with the current mode
-# name if it has been set yet.
-func_echo ()
-{
-    $ECHO "$progname${mode+: }$mode: $*"
-}
-
-# func_verbose arg...
-# Echo program name prefixed message in verbose mode only.
-func_verbose ()
-{
-    $opt_verbose && func_echo ${1+"$@"}
-
-    # A bug in bash halts the script if the last line of a function
-    # fails when set -e is in force, so we need another command to
-    # work around that:
-    :
-}
-
-# func_error arg...
-# Echo program name prefixed message to standard error.
-func_error ()
-{
-    $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2
-}
-
-# func_warning arg...
-# Echo program name prefixed warning message to standard error.
-func_warning ()
-{
-    $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2
-
-    # bash bug again:
-    :
-}
-
-# func_fatal_error arg...
-# Echo program name prefixed message to standard error, and exit.
-func_fatal_error ()
-{
-    func_error ${1+"$@"}
-    exit $EXIT_FAILURE
-}
-
-# func_fatal_help arg...
-# Echo program name prefixed message to standard error, followed by
-# a help hint, and exit.
-func_fatal_help ()
-{
-    func_error ${1+"$@"}
-    func_fatal_error "$help"
-}
-help="Try \`$progname --help' for more information."  ## default
-
-
-# func_grep expression filename
-# Check whether EXPRESSION matches any line of FILENAME, without output.
-func_grep ()
-{
-    $GREP "$1" "$2" >/dev/null 2>&1
-}
-
-
-# func_mkdir_p directory-path
-# Make sure the entire path to DIRECTORY-PATH is available.
-func_mkdir_p ()
-{
-    my_directory_path="$1"
-    my_dir_list=
-
-    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
-
-      # Protect directory names starting with `-'
-      case $my_directory_path in
-        -*) my_directory_path="./$my_directory_path" ;;
-      esac
-
-      # While some portion of DIR does not yet exist...
-      while test ! -d "$my_directory_path"; do
-        # ...make a list in topmost first order.  Use a colon delimited
-	# list incase some portion of path contains whitespace.
-        my_dir_list="$my_directory_path:$my_dir_list"
-
-        # If the last portion added has no slash in it, the list is done
-        case $my_directory_path in */*) ;; *) break ;; esac
-
-        # ...otherwise throw away the child directory and loop
-        my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"`
-      done
-      my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'`
-
-      save_mkdir_p_IFS="$IFS"; IFS=':'
-      for my_dir in $my_dir_list; do
-	IFS="$save_mkdir_p_IFS"
-        # mkdir can fail with a `File exist' error if two processes
-        # try to create one of the directories concurrently.  Don't
-        # stop in that case!
-        $MKDIR "$my_dir" 2>/dev/null || :
-      done
-      IFS="$save_mkdir_p_IFS"
-
-      # Bail out if we (or some other process) failed to create a directory.
-      test -d "$my_directory_path" || \
-        func_fatal_error "Failed to create \`$1'"
-    fi
-}
-
-
-# func_mktempdir [string]
-# Make a temporary directory that won't clash with other running
-# libtool processes, and avoids race conditions if possible.  If
-# given, STRING is the basename for that directory.
-func_mktempdir ()
-{
-    my_template="${TMPDIR-/tmp}/${1-$progname}"
-
-    if test "$opt_dry_run" = ":"; then
-      # Return a directory name, but don't create it in dry-run mode
-      my_tmpdir="${my_template}-$$"
-    else
-
-      # If mktemp works, use that first and foremost
-      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
-
-      if test ! -d "$my_tmpdir"; then
-        # Failing that, at least try and use $RANDOM to avoid a race
-        my_tmpdir="${my_template}-${RANDOM-0}$$"
-
-        save_mktempdir_umask=`umask`
-        umask 0077
-        $MKDIR "$my_tmpdir"
-        umask $save_mktempdir_umask
-      fi
-
-      # If we're not in dry-run mode, bomb out on failure
-      test -d "$my_tmpdir" || \
-        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
-    fi
-
-    $ECHO "X$my_tmpdir" | $Xsed
-}
-
-
-# func_quote_for_eval arg
-# Aesthetically quote ARG to be evaled later.
-# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
-# is double-quoted, suitable for a subsequent eval, whereas
-# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
-# which are still active within double quotes backslashified.
-func_quote_for_eval ()
-{
-    case $1 in
-      *[\\\`\"\$]*)
-	func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;;
-      *)
-        func_quote_for_eval_unquoted_result="$1" ;;
-    esac
-
-    case $func_quote_for_eval_unquoted_result in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting, command substitution and and variable
-      # expansion for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
-        ;;
-      *)
-        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
-    esac
-}
-
-
-# func_quote_for_expand arg
-# Aesthetically quote ARG to be evaled later; same as above,
-# but do not quote variable references.
-func_quote_for_expand ()
-{
-    case $1 in
-      *[\\\`\"]*)
-	my_arg=`$ECHO "X$1" | $Xsed \
-	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
-      *)
-        my_arg="$1" ;;
-    esac
-
-    case $my_arg in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting and command substitution for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        my_arg="\"$my_arg\""
-        ;;
-    esac
-
-    func_quote_for_expand_result="$my_arg"
-}
-
-
-# func_show_eval cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.
-func_show_eval ()
-{
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
-
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
-
-    if ${opt_dry_run-false}; then :; else
-      eval "$my_cmd"
-      my_status=$?
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
-}
-
-
-# func_show_eval_locale cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.  Use the saved locale for evaluation.
-func_show_eval_locale ()
-{
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
-
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
-
-    if ${opt_dry_run-false}; then :; else
-      eval "$lt_user_locale
-	    $my_cmd"
-      my_status=$?
-      eval "$lt_safe_locale"
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
-}
-
-
-
-
-
-# func_version
-# Echo version message to standard output and exit.
-func_version ()
-{
-    $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / {
-        s/^# //
-	s/^# *$//
-        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
-        p
-     }' < "$progpath"
-     exit $?
-}
-
-# func_usage
-# Echo short help message to standard output and exit.
-func_usage ()
-{
-    $SED -n '/^# Usage:/,/# -h/ {
-        s/^# //
-	s/^# *$//
-	s/\$progname/'$progname'/
-	p
-    }' < "$progpath"
-    $ECHO
-    $ECHO "run \`$progname --help | more' for full usage"
-    exit $?
-}
-
-# func_help
-# Echo long help message to standard output and exit.
-func_help ()
-{
-    $SED -n '/^# Usage:/,/# Report bugs to/ {
-        s/^# //
-	s/^# *$//
-	s*\$progname*'$progname'*
-	s*\$host*'"$host"'*
-	s*\$SHELL*'"$SHELL"'*
-	s*\$LTCC*'"$LTCC"'*
-	s*\$LTCFLAGS*'"$LTCFLAGS"'*
-	s*\$LD*'"$LD"'*
-	s/\$with_gnu_ld/'"$with_gnu_ld"'/
-	s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/
-	s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/
-	p
-     }' < "$progpath"
-    exit $?
-}
-
-# func_missing_arg argname
-# Echo program name prefixed message to standard error and set global
-# exit_cmd.
-func_missing_arg ()
-{
-    func_error "missing argument for $1"
-    exit_cmd=exit
-}
-
-exit_cmd=:
-
-
-
-
-
-# Check that we have a working $ECHO.
-if test "X$1" = X--no-reexec; then
-  # Discard the --no-reexec flag, and continue.
-  shift
-elif test "X$1" = X--fallback-echo; then
-  # Avoid inline document here, it may be left over
-  :
-elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then
-  # Yippee, $ECHO works!
-  :
-else
-  # Restart under the correct shell, and then maybe $ECHO will work.
-  exec $SHELL "$progpath" --no-reexec ${1+"$@"}
-fi
-
-if test "X$1" = X--fallback-echo; then
-  # used as fallback echo
-  shift
-  cat <<EOF
-$*
-EOF
-  exit $EXIT_SUCCESS
-fi
-
-magic="%%%MAGIC variable%%%"
-magic_exe="%%%MAGIC EXE variable%%%"
-
-# Global variables.
-# $mode is unset
-nonopt=
-execute_dlfiles=
-preserve_args=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
-extracted_archives=
-extracted_serial=0
-
-opt_dry_run=false
-opt_duplicate_deps=false
-opt_silent=false
-opt_debug=:
-
-# If this variable is set in any of the actions, the command in it
-# will be execed at the end.  This prevents here-documents from being
-# left over by shells.
-exec_cmd=
-
-# func_fatal_configuration arg...
-# Echo program name prefixed message to standard error, followed by
-# a configuration failure hint, and exit.
-func_fatal_configuration ()
-{
-    func_error ${1+"$@"}
-    func_error "See the $PACKAGE documentation for more information."
-    func_fatal_error "Fatal configuration error."
-}
-
-
-# func_config
-# Display the configuration for all the tags in this script.
-func_config ()
-{
-    re_begincf='^# ### BEGIN LIBTOOL'
-    re_endcf='^# ### END LIBTOOL'
-
-    # Default configuration.
-    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
-
-    # Now print the configurations for the tags.
-    for tagname in $taglist; do
-      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
-    done
-
-    exit $?
-}
-
-# func_features
-# Display the features supported by this script.
-func_features ()
-{
-    $ECHO "host: $host"
-    if test "$build_libtool_libs" = yes; then
-      $ECHO "enable shared libraries"
-    else
-      $ECHO "disable shared libraries"
-    fi
-    if test "$build_old_libs" = yes; then
-      $ECHO "enable static libraries"
-    else
-      $ECHO "disable static libraries"
-    fi
-
-    exit $?
-}
-
-# func_enable_tag tagname
-# Verify that TAGNAME is valid, and either flag an error and exit, or
-# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
-# variable here.
-func_enable_tag ()
-{
-  # Global variable:
-  tagname="$1"
-
-  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
-  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
-  sed_extractcf="/$re_begincf/,/$re_endcf/p"
-
-  # Validate tagname.
-  case $tagname in
-    *[!-_A-Za-z0-9,/]*)
-      func_fatal_error "invalid tag name: $tagname"
-      ;;
-  esac
-
-  # Don't test for the "default" C tag, as we know it's
-  # there but not specially marked.
-  case $tagname in
-    CC) ;;
-    *)
-      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
-	taglist="$taglist $tagname"
-
-	# Evaluate the configuration.  Be careful to quote the path
-	# and the sed script, to avoid splitting on whitespace, but
-	# also don't use non-portable quotes within backquotes within
-	# quotes we have to do it in 2 steps:
-	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
-	eval "$extractedcf"
-      else
-	func_error "ignoring unknown tag $tagname"
-      fi
-      ;;
-  esac
-}
-
-# Parse options once, thoroughly.  This comes as soon as possible in
-# the script to make things like `libtool --version' happen quickly.
-{
-
-  # Shorthand for --mode=foo, only valid as the first argument
-  case $1 in
-  clean|clea|cle|cl)
-    shift; set dummy --mode clean ${1+"$@"}; shift
-    ;;
-  compile|compil|compi|comp|com|co|c)
-    shift; set dummy --mode compile ${1+"$@"}; shift
-    ;;
-  execute|execut|execu|exec|exe|ex|e)
-    shift; set dummy --mode execute ${1+"$@"}; shift
-    ;;
-  finish|finis|fini|fin|fi|f)
-    shift; set dummy --mode finish ${1+"$@"}; shift
-    ;;
-  install|instal|insta|inst|ins|in|i)
-    shift; set dummy --mode install ${1+"$@"}; shift
-    ;;
-  link|lin|li|l)
-    shift; set dummy --mode link ${1+"$@"}; shift
-    ;;
-  uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
-    shift; set dummy --mode uninstall ${1+"$@"}; shift
-    ;;
-  esac
-
-  # Parse non-mode specific arguments:
-  while test "$#" -gt 0; do
-    opt="$1"
-    shift
-
-    case $opt in
-      --config)		func_config					;;
-
-      --debug)		preserve_args="$preserve_args $opt"
-			func_echo "enabling shell trace mode"
-			opt_debug='set -x'
-			$opt_debug
-			;;
-
-      -dlopen)		test "$#" -eq 0 && func_missing_arg "$opt" && break
-			execute_dlfiles="$execute_dlfiles $1"
-			shift
-			;;
-
-      --dry-run | -n)	opt_dry_run=:					;;
-      --features)       func_features					;;
-      --finish)		mode="finish"					;;
-
-      --mode)		test "$#" -eq 0 && func_missing_arg "$opt" && break
-			case $1 in
-			  # Valid mode arguments:
-			  clean)	;;
-			  compile)	;;
-			  execute)	;;
-			  finish)	;;
-			  install)	;;
-			  link)		;;
-			  relink)	;;
-			  uninstall)	;;
-
-			  # Catch anything else as an error
-			  *) func_error "invalid argument for $opt"
-			     exit_cmd=exit
-			     break
-			     ;;
-		        esac
-
-			mode="$1"
-			shift
-			;;
-
-      --preserve-dup-deps)
-			opt_duplicate_deps=:				;;
-
-      --quiet|--silent)	preserve_args="$preserve_args $opt"
-			opt_silent=:
-			;;
-
-      --verbose| -v)	preserve_args="$preserve_args $opt"
-			opt_silent=false
-			;;
-
-      --tag)		test "$#" -eq 0 && func_missing_arg "$opt" && break
-			preserve_args="$preserve_args $opt $1"
-			func_enable_tag "$1"	# tagname is set here
-			shift
-			;;
-
-      # Separate optargs to long options:
-      -dlopen=*|--mode=*|--tag=*)
-			func_opt_split "$opt"
-			set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"}
-			shift
-			;;
-
-      -\?|-h)		func_usage					;;
-      --help)		opt_help=:					;;
-      --version)	func_version					;;
-
-      -*)		func_fatal_help "unrecognized option \`$opt'"	;;
-
-      *)		nonopt="$opt"
-			break
-			;;
-    esac
-  done
-
-
-  case $host in
-    *cygwin* | *mingw* | *pw32* | *cegcc*)
-      # don't eliminate duplications in $postdeps and $predeps
-      opt_duplicate_compiler_generated_deps=:
-      ;;
-    *)
-      opt_duplicate_compiler_generated_deps=$opt_duplicate_deps
-      ;;
-  esac
-
-  # Having warned about all mis-specified options, bail out if
-  # anything was wrong.
-  $exit_cmd $EXIT_FAILURE
-}
-
-# func_check_version_match
-# Ensure that we are using m4 macros, and libtool script from the same
-# release of libtool.
-func_check_version_match ()
-{
-  if test "$package_revision" != "$macro_revision"; then
-    if test "$VERSION" != "$macro_version"; then
-      if test -z "$macro_version"; then
-        cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from an older release.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
-      else
-        cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
-$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
-$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
-$progname: and run autoconf again.
-_LT_EOF
-      fi
-    else
-      cat >&2 <<_LT_EOF
-$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
-$progname: but the definition of this LT_INIT comes from revision $macro_revision.
-$progname: You should recreate aclocal.m4 with macros from revision $package_revision
-$progname: of $PACKAGE $VERSION and run autoconf again.
-_LT_EOF
-    fi
-
-    exit $EXIT_MISMATCH
-  fi
-}
-
-
-## ----------- ##
-##    Main.    ##
-## ----------- ##
-
-$opt_help || {
-  # Sanity checks first:
-  func_check_version_match
-
-  if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
-    func_fatal_configuration "not configured to build any kind of library"
-  fi
-
-  test -z "$mode" && func_fatal_error "error: you must specify a MODE."
-
-
-  # Darwin sucks
-  eval std_shrext=\"$shrext_cmds\"
-
-
-  # Only execute mode is allowed to have -dlopen flags.
-  if test -n "$execute_dlfiles" && test "$mode" != execute; then
-    func_error "unrecognized option \`-dlopen'"
-    $ECHO "$help" 1>&2
-    exit $EXIT_FAILURE
-  fi
-
-  # Change the help message to a mode-specific one.
-  generic_help="$help"
-  help="Try \`$progname --help --mode=$mode' for more information."
-}
-
-
-# func_lalib_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_lalib_p ()
-{
-    test -f "$1" &&
-      $SED -e 4q "$1" 2>/dev/null \
-        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
-}
-
-# func_lalib_unsafe_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
-# This function implements the same check as func_lalib_p without
-# resorting to external programs.  To this end, it redirects stdin and
-# closes it afterwards, without saving the original file descriptor.
-# As a safety measure, use it only where a negative result would be
-# fatal anyway.  Works if `file' does not exist.
-func_lalib_unsafe_p ()
-{
-    lalib_p=no
-    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
-	for lalib_p_l in 1 2 3 4
-	do
-	    read lalib_p_line
-	    case "$lalib_p_line" in
-		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
-	    esac
-	done
-	exec 0<&5 5<&-
-    fi
-    test "$lalib_p" = yes
-}
-
-# func_ltwrapper_script_p file
-# True iff FILE is a libtool wrapper script
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_script_p ()
-{
-    func_lalib_p "$1"
-}
-
-# func_ltwrapper_executable_p file
-# True iff FILE is a libtool wrapper executable
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_executable_p ()
-{
-    func_ltwrapper_exec_suffix=
-    case $1 in
-    *.exe) ;;
-    *) func_ltwrapper_exec_suffix=.exe ;;
-    esac
-    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
-}
-
-# func_ltwrapper_scriptname file
-# Assumes file is an ltwrapper_executable
-# uses $file to determine the appropriate filename for a
-# temporary ltwrapper_script.
-func_ltwrapper_scriptname ()
-{
-    func_ltwrapper_scriptname_result=""
-    if func_ltwrapper_executable_p "$1"; then
-	func_dirname_and_basename "$1" "" "."
-	func_stripname '' '.exe' "$func_basename_result"
-	func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
-    fi
-}
-
-# func_ltwrapper_p file
-# True iff FILE is a libtool wrapper script or wrapper executable
-# This function is only a basic sanity check; it will hardly flush out
-# determined imposters.
-func_ltwrapper_p ()
-{
-    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
-}
-
-
-# func_execute_cmds commands fail_cmd
-# Execute tilde-delimited COMMANDS.
-# If FAIL_CMD is given, eval that upon failure.
-# FAIL_CMD may read-access the current command in variable CMD!
-func_execute_cmds ()
-{
-    $opt_debug
-    save_ifs=$IFS; IFS='~'
-    for cmd in $1; do
-      IFS=$save_ifs
-      eval cmd=\"$cmd\"
-      func_show_eval "$cmd" "${2-:}"
-    done
-    IFS=$save_ifs
-}
-
-
-# func_source file
-# Source FILE, adding directory component if necessary.
-# Note that it is not necessary on cygwin/mingw to append a dot to
-# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
-# behavior happens only for exec(3), not for open(2)!  Also, sourcing
-# `FILE.' does not work on cygwin managed mounts.
-func_source ()
-{
-    $opt_debug
-    case $1 in
-    */* | *\\*)	. "$1" ;;
-    *)		. "./$1" ;;
-    esac
-}
-
-
-# func_infer_tag arg
-# Infer tagged configuration to use if any are available and
-# if one wasn't chosen via the "--tag" command line option.
-# Only attempt this if the compiler in the base compile
-# command doesn't match the default compiler.
-# arg is usually of the form 'gcc ...'
-func_infer_tag ()
-{
-    $opt_debug
-    if test -n "$available_tags" && test -z "$tagname"; then
-      CC_quoted=
-      for arg in $CC; do
-        func_quote_for_eval "$arg"
-	CC_quoted="$CC_quoted $func_quote_for_eval_result"
-      done
-      case $@ in
-      # Blanks in the command may have been stripped by the calling shell,
-      # but not from the CC environment variable when configure was run.
-      " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;;
-      # Blanks at the start of $base_compile will cause this to fail
-      # if we don't check for them as well.
-      *)
-	for z in $available_tags; do
-	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
-	    # Evaluate the configuration.
-	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
-	    CC_quoted=
-	    for arg in $CC; do
-	      # Double-quote args containing other shell metacharacters.
-	      func_quote_for_eval "$arg"
-	      CC_quoted="$CC_quoted $func_quote_for_eval_result"
-	    done
-	    case "$@ " in
-	      " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*)
-	      # The compiler in the base compile command matches
-	      # the one in the tagged configuration.
-	      # Assume this is the tagged configuration we want.
-	      tagname=$z
-	      break
-	      ;;
-	    esac
-	  fi
-	done
-	# If $tagname still isn't set, then no tagged configuration
-	# was found and let the user know that the "--tag" command
-	# line option must be used.
-	if test -z "$tagname"; then
-	  func_echo "unable to infer tagged configuration"
-	  func_fatal_error "specify a tag with \`--tag'"
-#	else
-#	  func_verbose "using $tagname tagged configuration"
-	fi
-	;;
-      esac
-    fi
-}
-
-
-
-# func_write_libtool_object output_name pic_name nonpic_name
-# Create a libtool object file (analogous to a ".la" file),
-# but don't create it if we're doing a dry run.
-func_write_libtool_object ()
-{
-    write_libobj=${1}
-    if test "$build_libtool_libs" = yes; then
-      write_lobj=\'${2}\'
-    else
-      write_lobj=none
-    fi
-
-    if test "$build_old_libs" = yes; then
-      write_oldobj=\'${3}\'
-    else
-      write_oldobj=none
-    fi
-
-    $opt_dry_run || {
-      cat >${write_libobj}T <<EOF
-# $write_libobj - a libtool object file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# Name of the PIC object.
-pic_object=$write_lobj
-
-# Name of the non-PIC object
-non_pic_object=$write_oldobj
-
-EOF
-      $MV "${write_libobj}T" "${write_libobj}"
-    }
-}
-
-# func_mode_compile arg...
-func_mode_compile ()
-{
-    $opt_debug
-    # Get the compilation command and the source file.
-    base_compile=
-    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
-    suppress_opt=yes
-    suppress_output=
-    arg_mode=normal
-    libobj=
-    later=
-    pie_flag=
-
-    for arg
-    do
-      case $arg_mode in
-      arg  )
-	# do not "continue".  Instead, add this to base_compile
-	lastarg="$arg"
-	arg_mode=normal
-	;;
-
-      target )
-	libobj="$arg"
-	arg_mode=normal
-	continue
-	;;
-
-      normal )
-	# Accept any command-line options.
-	case $arg in
-	-o)
-	  test -n "$libobj" && \
-	    func_fatal_error "you cannot specify \`-o' more than once"
-	  arg_mode=target
-	  continue
-	  ;;
-
-	-pie | -fpie | -fPIE)
-          pie_flag="$pie_flag $arg"
-	  continue
-	  ;;
-
-	-shared | -static | -prefer-pic | -prefer-non-pic)
-	  later="$later $arg"
-	  continue
-	  ;;
-
-	-no-suppress)
-	  suppress_opt=no
-	  continue
-	  ;;
-
-	-Xcompiler)
-	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
-	  continue      #  The current "srcfile" will either be retained or
-	  ;;            #  replaced later.  I would guess that would be a bug.
-
-	-Wc,*)
-	  func_stripname '-Wc,' '' "$arg"
-	  args=$func_stripname_result
-	  lastarg=
-	  save_ifs="$IFS"; IFS=','
-	  for arg in $args; do
-	    IFS="$save_ifs"
-	    func_quote_for_eval "$arg"
-	    lastarg="$lastarg $func_quote_for_eval_result"
-	  done
-	  IFS="$save_ifs"
-	  func_stripname ' ' '' "$lastarg"
-	  lastarg=$func_stripname_result
-
-	  # Add the arguments to base_compile.
-	  base_compile="$base_compile $lastarg"
-	  continue
-	  ;;
-
-	*)
-	  # Accept the current argument as the source file.
-	  # The previous "srcfile" becomes the current argument.
-	  #
-	  lastarg="$srcfile"
-	  srcfile="$arg"
-	  ;;
-	esac  #  case $arg
-	;;
-      esac    #  case $arg_mode
-
-      # Aesthetically quote the previous argument.
-      func_quote_for_eval "$lastarg"
-      base_compile="$base_compile $func_quote_for_eval_result"
-    done # for arg
-
-    case $arg_mode in
-    arg)
-      func_fatal_error "you must specify an argument for -Xcompile"
-      ;;
-    target)
-      func_fatal_error "you must specify a target with \`-o'"
-      ;;
-    *)
-      # Get the name of the library object.
-      test -z "$libobj" && {
-	func_basename "$srcfile"
-	libobj="$func_basename_result"
-      }
-      ;;
-    esac
-
-    # Recognize several different file suffixes.
-    # If the user specifies -o file.o, it is replaced with file.lo
-    case $libobj in
-    *.[cCFSifmso] | \
-    *.ada | *.adb | *.ads | *.asm | \
-    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
-    *.[fF][09]? | *.for | *.java | *.obj | *.sx)
-      func_xform "$libobj"
-      libobj=$func_xform_result
-      ;;
-    esac
-
-    case $libobj in
-    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
-    *)
-      func_fatal_error "cannot determine name of library object from \`$libobj'"
-      ;;
-    esac
-
-    func_infer_tag $base_compile
-
-    for arg in $later; do
-      case $arg in
-      -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
-	build_old_libs=no
-	continue
-	;;
-
-      -static)
-	build_libtool_libs=no
-	build_old_libs=yes
-	continue
-	;;
-
-      -prefer-pic)
-	pic_mode=yes
-	continue
-	;;
-
-      -prefer-non-pic)
-	pic_mode=no
-	continue
-	;;
-      esac
-    done
-
-    func_quote_for_eval "$libobj"
-    test "X$libobj" != "X$func_quote_for_eval_result" \
-      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
-      && func_warning "libobj name \`$libobj' may not contain shell special characters."
-    func_dirname_and_basename "$obj" "/" ""
-    objname="$func_basename_result"
-    xdir="$func_dirname_result"
-    lobj=${xdir}$objdir/$objname
-
-    test -z "$base_compile" && \
-      func_fatal_help "you must specify a compilation command"
-
-    # Delete any leftover library objects.
-    if test "$build_old_libs" = yes; then
-      removelist="$obj $lobj $libobj ${libobj}T"
-    else
-      removelist="$lobj $libobj ${libobj}T"
-    fi
-
-    # On Cygwin there's no "real" PIC flag so we must build both object types
-    case $host_os in
-    cygwin* | mingw* | pw32* | os2* | cegcc*)
-      pic_mode=default
-      ;;
-    esac
-    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
-      # non-PIC code in shared libraries is not supported
-      pic_mode=default
-    fi
-
-    # Calculate the filename of the output object if compiler does
-    # not support -o with -c
-    if test "$compiler_c_o" = no; then
-      output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
-      lockfile="$output_obj.lock"
-    else
-      output_obj=
-      need_locks=no
-      lockfile=
-    fi
-
-    # Lock this critical section if it is needed
-    # We use this script file to make the link, it avoids creating a new file
-    if test "$need_locks" = yes; then
-      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
-	func_echo "Waiting for $lockfile to be removed"
-	sleep 2
-      done
-    elif test "$need_locks" = warn; then
-      if test -f "$lockfile"; then
-	$ECHO "\
-*** ERROR, $lockfile exists and contains:
-`cat $lockfile 2>/dev/null`
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-      removelist="$removelist $output_obj"
-      $ECHO "$srcfile" > "$lockfile"
-    fi
-
-    $opt_dry_run || $RM $removelist
-    removelist="$removelist $lockfile"
-    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
-
-    if test -n "$fix_srcfile_path"; then
-      eval srcfile=\"$fix_srcfile_path\"
-    fi
-    func_quote_for_eval "$srcfile"
-    qsrcfile=$func_quote_for_eval_result
-
-    # Only build a PIC object if we are building libtool libraries.
-    if test "$build_libtool_libs" = yes; then
-      # Without this assignment, base_compile gets emptied.
-      fbsd_hideous_sh_bug=$base_compile
-
-      if test "$pic_mode" != no; then
-	command="$base_compile $qsrcfile $pic_flag"
-      else
-	# Don't build PIC code
-	command="$base_compile $qsrcfile"
-      fi
-
-      func_mkdir_p "$xdir$objdir"
-
-      if test -z "$output_obj"; then
-	# Place PIC objects in $objdir
-	command="$command -o $lobj"
-      fi
-
-      func_show_eval_locale "$command"	\
-          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
-
-      if test "$need_locks" = warn &&
-	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$ECHO "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-
-      # Just move the object if needed, then go on to compile the next one
-      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
-	func_show_eval '$MV "$output_obj" "$lobj"' \
-	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
-      fi
-
-      # Allow error messages only from the first compilation.
-      if test "$suppress_opt" = yes; then
-	suppress_output=' >/dev/null 2>&1'
-      fi
-    fi
-
-    # Only build a position-dependent object if we build old libraries.
-    if test "$build_old_libs" = yes; then
-      if test "$pic_mode" != yes; then
-	# Don't build PIC code
-	command="$base_compile $qsrcfile$pie_flag"
-      else
-	command="$base_compile $qsrcfile $pic_flag"
-      fi
-      if test "$compiler_c_o" = yes; then
-	command="$command -o $obj"
-      fi
-
-      # Suppress compiler output if we already did a PIC compilation.
-      command="$command$suppress_output"
-      func_show_eval_locale "$command" \
-        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
-
-      if test "$need_locks" = warn &&
-	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
-	$ECHO "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
-	$opt_dry_run || $RM $removelist
-	exit $EXIT_FAILURE
-      fi
-
-      # Just move the object if needed
-      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
-	func_show_eval '$MV "$output_obj" "$obj"' \
-	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
-      fi
-    fi
-
-    $opt_dry_run || {
-      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
-
-      # Unlock the critical section if it was locked
-      if test "$need_locks" != no; then
-	removelist=$lockfile
-        $RM "$lockfile"
-      fi
-    }
-
-    exit $EXIT_SUCCESS
-}
-
-$opt_help || {
-test "$mode" = compile && func_mode_compile ${1+"$@"}
-}
-
-func_mode_help ()
-{
-    # We need to display help for each of the modes.
-    case $mode in
-      "")
-        # Generic help is extracted from the usage comments
-        # at the start of this file.
-        func_help
-        ;;
-
-      clean)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
-
-Remove files from the build directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, object or program, all the files associated
-with it are deleted. Otherwise, only FILE itself is deleted using RM."
-        ;;
-
-      compile)
-      $ECHO \
-"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
-
-Compile a source file into a libtool library object.
-
-This mode accepts the following additional options:
-
-  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
-  -no-suppress      do not suppress compiler output for multiple passes
-  -prefer-pic       try to building PIC objects only
-  -prefer-non-pic   try to building non-PIC objects only
-  -shared           do not build a \`.o' file suitable for static linking
-  -static           only build a \`.o' file suitable for static linking
-
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
-from the given SOURCEFILE.
-
-The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
-        ;;
-
-      execute)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
-
-Automatically set library path, then run a program.
-
-This mode accepts the following additional options:
-
-  -dlopen FILE      add the directory containing FILE to the library path
-
-This mode sets the library path environment variable according to \`-dlopen'
-flags.
-
-If any of the ARGS are libtool executable wrappers, then they are translated
-into their corresponding uninstalled binary, and any of their required library
-directories are added to the library path.
-
-Then, COMMAND is executed, with ARGS as arguments."
-        ;;
-
-      finish)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
-
-Complete the installation of libtool libraries.
-
-Each LIBDIR is a directory that contains libtool libraries.
-
-The commands that this mode executes may require superuser privileges.  Use
-the \`--dry-run' option if you just want to see what would be executed."
-        ;;
-
-      install)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
-
-Install executables or libraries.
-
-INSTALL-COMMAND is the installation command.  The first component should be
-either the \`install' or \`cp' program.
-
-The following components of INSTALL-COMMAND are treated specially:
-
-  -inst-prefix PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
-
-The rest of the components are interpreted as arguments to that command (only
-BSD-compatible install options are recognized)."
-        ;;
-
-      link)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
-
-Link object files or libraries together to form another library, or to
-create an executable program.
-
-LINK-COMMAND is a command using the C compiler that you would use to create
-a program from several object files.
-
-The following components of LINK-COMMAND are treated specially:
-
-  -all-static       do not do any dynamic linking at all
-  -avoid-version    do not add a version suffix if possible
-  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
-  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
-  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
-  -export-symbols SYMFILE
-                    try to export only the symbols listed in SYMFILE
-  -export-symbols-regex REGEX
-                    try to export only the symbols matching REGEX
-  -LLIBDIR          search LIBDIR for required installed libraries
-  -lNAME            OUTPUT-FILE requires the installed library libNAME
-  -module           build a library that can dlopened
-  -no-fast-install  disable the fast-install mode
-  -no-install       link a not-installable executable
-  -no-undefined     declare that a library does not refer to external symbols
-  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
-  -objectlist FILE  Use a list of object files found in FILE to specify objects
-  -precious-files-regex REGEX
-                    don't remove output files matching REGEX
-  -release RELEASE  specify package release information
-  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
-  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
-  -shared           only do dynamic linking of libtool libraries
-  -shrext SUFFIX    override the standard shared library file extension
-  -static           do not do any dynamic linking of uninstalled libtool libraries
-  -static-libtool-libs
-                    do not do any dynamic linking of libtool libraries
-  -version-info CURRENT[:REVISION[:AGE]]
-                    specify library version info [each variable defaults to 0]
-  -weak LIBNAME     declare that the target provides the LIBNAME interface
-
-All other options (arguments beginning with \`-') are ignored.
-
-Every other argument is treated as a filename.  Files ending in \`.la' are
-treated as uninstalled libtool libraries, other files are standard or library
-object files.
-
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
-required, except when creating a convenience library.
-
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
-
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
-is created, otherwise an executable program is created."
-        ;;
-
-      uninstall)
-        $ECHO \
-"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
-
-Remove libraries from an installation directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, all the files associated with it are deleted.
-Otherwise, only FILE itself is deleted using RM."
-        ;;
-
-      *)
-        func_fatal_help "invalid operation mode \`$mode'"
-        ;;
-    esac
-
-    $ECHO
-    $ECHO "Try \`$progname --help' for more information about other modes."
-
-    exit $?
-}
-
-  # Now that we've collected a possible --mode arg, show help if necessary
-  $opt_help && func_mode_help
-
-
-# func_mode_execute arg...
-func_mode_execute ()
-{
-    $opt_debug
-    # The first argument is the command name.
-    cmd="$nonopt"
-    test -z "$cmd" && \
-      func_fatal_help "you must specify a COMMAND"
-
-    # Handle -dlopen flags immediately.
-    for file in $execute_dlfiles; do
-      test -f "$file" \
-	|| func_fatal_help "\`$file' is not a file"
-
-      dir=
-      case $file in
-      *.la)
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$lib' is not a valid libtool archive"
-
-	# Read the libtool library.
-	dlname=
-	library_names=
-	func_source "$file"
-
-	# Skip this library if it cannot be dlopened.
-	if test -z "$dlname"; then
-	  # Warn if it was a shared library.
-	  test -n "$library_names" && \
-	    func_warning "\`$file' was not linked with \`-export-dynamic'"
-	  continue
-	fi
-
-	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
-
-	if test -f "$dir/$objdir/$dlname"; then
-	  dir="$dir/$objdir"
-	else
-	  if test ! -f "$dir/$dlname"; then
-	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
-	  fi
-	fi
-	;;
-
-      *.lo)
-	# Just add the directory containing the .lo file.
-	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
-	;;
-
-      *)
-	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
-	continue
-	;;
-      esac
-
-      # Get the absolute pathname.
-      absdir=`cd "$dir" && pwd`
-      test -n "$absdir" && dir="$absdir"
-
-      # Now add the directory to shlibpath_var.
-      if eval "test -z \"\$$shlibpath_var\""; then
-	eval "$shlibpath_var=\"\$dir\""
-      else
-	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
-      fi
-    done
-
-    # This variable tells wrapper scripts just to set shlibpath_var
-    # rather than running their programs.
-    libtool_execute_magic="$magic"
-
-    # Check if any of the arguments is a wrapper script.
-    args=
-    for file
-    do
-      case $file in
-      -*) ;;
-      *)
-	# Do a test to see if this is really a libtool program.
-	if func_ltwrapper_script_p "$file"; then
-	  func_source "$file"
-	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
-	elif func_ltwrapper_executable_p "$file"; then
-	  func_ltwrapper_scriptname "$file"
-	  func_source "$func_ltwrapper_scriptname_result"
-	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
-	fi
-	;;
-      esac
-      # Quote arguments (to preserve shell metacharacters).
-      func_quote_for_eval "$file"
-      args="$args $func_quote_for_eval_result"
-    done
-
-    if test "X$opt_dry_run" = Xfalse; then
-      if test -n "$shlibpath_var"; then
-	# Export the shlibpath_var.
-	eval "export $shlibpath_var"
-      fi
-
-      # Restore saved environment variables
-      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-      do
-	eval "if test \"\${save_$lt_var+set}\" = set; then
-                $lt_var=\$save_$lt_var; export $lt_var
-	      else
-		$lt_unset $lt_var
-	      fi"
-      done
-
-      # Now prepare to actually exec the command.
-      exec_cmd="\$cmd$args"
-    else
-      # Display what would be done.
-      if test -n "$shlibpath_var"; then
-	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
-	$ECHO "export $shlibpath_var"
-      fi
-      $ECHO "$cmd$args"
-      exit $EXIT_SUCCESS
-    fi
-}
-
-test "$mode" = execute && func_mode_execute ${1+"$@"}
-
-
-# func_mode_finish arg...
-func_mode_finish ()
-{
-    $opt_debug
-    libdirs="$nonopt"
-    admincmds=
-
-    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
-      for dir
-      do
-	libdirs="$libdirs $dir"
-      done
-
-      for libdir in $libdirs; do
-	if test -n "$finish_cmds"; then
-	  # Do each command in the finish commands.
-	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
-'"$cmd"'"'
-	fi
-	if test -n "$finish_eval"; then
-	  # Do the single finish_eval.
-	  eval cmds=\"$finish_eval\"
-	  $opt_dry_run || eval "$cmds" || admincmds="$admincmds
-       $cmds"
-	fi
-      done
-    fi
-
-    # Exit here if they wanted silent mode.
-    $opt_silent && exit $EXIT_SUCCESS
-
-    $ECHO "X----------------------------------------------------------------------" | $Xsed
-    $ECHO "Libraries have been installed in:"
-    for libdir in $libdirs; do
-      $ECHO "   $libdir"
-    done
-    $ECHO
-    $ECHO "If you ever happen to want to link against installed libraries"
-    $ECHO "in a given directory, LIBDIR, you must either use libtool, and"
-    $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'"
-    $ECHO "flag during linking and do at least one of the following:"
-    if test -n "$shlibpath_var"; then
-      $ECHO "   - add LIBDIR to the \`$shlibpath_var' environment variable"
-      $ECHO "     during execution"
-    fi
-    if test -n "$runpath_var"; then
-      $ECHO "   - add LIBDIR to the \`$runpath_var' environment variable"
-      $ECHO "     during linking"
-    fi
-    if test -n "$hardcode_libdir_flag_spec"; then
-      libdir=LIBDIR
-      eval flag=\"$hardcode_libdir_flag_spec\"
-
-      $ECHO "   - use the \`$flag' linker flag"
-    fi
-    if test -n "$admincmds"; then
-      $ECHO "   - have your system administrator run these commands:$admincmds"
-    fi
-    if test -f /etc/ld.so.conf; then
-      $ECHO "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
-    fi
-    $ECHO
-
-    $ECHO "See any operating system documentation about shared libraries for"
-    case $host in
-      solaris2.[6789]|solaris2.1[0-9])
-        $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual"
-	$ECHO "pages."
-	;;
-      *)
-        $ECHO "more information, such as the ld(1) and ld.so(8) manual pages."
-        ;;
-    esac
-    $ECHO "X----------------------------------------------------------------------" | $Xsed
-    exit $EXIT_SUCCESS
-}
-
-test "$mode" = finish && func_mode_finish ${1+"$@"}
-
-
-# func_mode_install arg...
-func_mode_install ()
-{
-    $opt_debug
-    # There may be an optional sh(1) argument at the beginning of
-    # install_prog (especially on Windows NT).
-    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
-       # Allow the use of GNU shtool's install command.
-       $ECHO "X$nonopt" | $GREP shtool >/dev/null; then
-      # Aesthetically quote it.
-      func_quote_for_eval "$nonopt"
-      install_prog="$func_quote_for_eval_result "
-      arg=$1
-      shift
-    else
-      install_prog=
-      arg=$nonopt
-    fi
-
-    # The real first argument should be the name of the installation program.
-    # Aesthetically quote it.
-    func_quote_for_eval "$arg"
-    install_prog="$install_prog$func_quote_for_eval_result"
-
-    # We need to accept at least all the BSD install flags.
-    dest=
-    files=
-    opts=
-    prev=
-    install_type=
-    isdir=no
-    stripme=
-    for arg
-    do
-      if test -n "$dest"; then
-	files="$files $dest"
-	dest=$arg
-	continue
-      fi
-
-      case $arg in
-      -d) isdir=yes ;;
-      -f)
-	case " $install_prog " in
-	*[\\\ /]cp\ *) ;;
-	*) prev=$arg ;;
-	esac
-	;;
-      -g | -m | -o)
-	prev=$arg
-	;;
-      -s)
-	stripme=" -s"
-	continue
-	;;
-      -*)
-	;;
-      *)
-	# If the previous option needed an argument, then skip it.
-	if test -n "$prev"; then
-	  prev=
-	else
-	  dest=$arg
-	  continue
-	fi
-	;;
-      esac
-
-      # Aesthetically quote the argument.
-      func_quote_for_eval "$arg"
-      install_prog="$install_prog $func_quote_for_eval_result"
-    done
-
-    test -z "$install_prog" && \
-      func_fatal_help "you must specify an install program"
-
-    test -n "$prev" && \
-      func_fatal_help "the \`$prev' option requires an argument"
-
-    if test -z "$files"; then
-      if test -z "$dest"; then
-	func_fatal_help "no file or destination specified"
-      else
-	func_fatal_help "you must specify a destination"
-      fi
-    fi
-
-    # Strip any trailing slash from the destination.
-    func_stripname '' '/' "$dest"
-    dest=$func_stripname_result
-
-    # Check to see that the destination is a directory.
-    test -d "$dest" && isdir=yes
-    if test "$isdir" = yes; then
-      destdir="$dest"
-      destname=
-    else
-      func_dirname_and_basename "$dest" "" "."
-      destdir="$func_dirname_result"
-      destname="$func_basename_result"
-
-      # Not a directory, so check to see that there is only one file specified.
-      set dummy $files; shift
-      test "$#" -gt 1 && \
-	func_fatal_help "\`$dest' is not a directory"
-    fi
-    case $destdir in
-    [\\/]* | [A-Za-z]:[\\/]*) ;;
-    *)
-      for file in $files; do
-	case $file in
-	*.lo) ;;
-	*)
-	  func_fatal_help "\`$destdir' must be an absolute directory name"
-	  ;;
-	esac
-      done
-      ;;
-    esac
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    staticlibs=
-    future_libdirs=
-    current_libdirs=
-    for file in $files; do
-
-      # Do each installation.
-      case $file in
-      *.$libext)
-	# Do the static libraries later.
-	staticlibs="$staticlibs $file"
-	;;
-
-      *.la)
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$file' is not a valid libtool archive"
-
-	library_names=
-	old_library=
-	relink_command=
-	func_source "$file"
-
-	# Add the libdir to current_libdirs if it is the destination.
-	if test "X$destdir" = "X$libdir"; then
-	  case "$current_libdirs " in
-	  *" $libdir "*) ;;
-	  *) current_libdirs="$current_libdirs $libdir" ;;
-	  esac
-	else
-	  # Note the libdir as a future libdir.
-	  case "$future_libdirs " in
-	  *" $libdir "*) ;;
-	  *) future_libdirs="$future_libdirs $libdir" ;;
-	  esac
-	fi
-
-	func_dirname "$file" "/" ""
-	dir="$func_dirname_result"
-	dir="$dir$objdir"
-
-	if test -n "$relink_command"; then
-	  # Determine the prefix the user has applied to our future dir.
-	  inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"`
-
-	  # Don't allow the user to place us outside of our expected
-	  # location b/c this prevents finding dependent libraries that
-	  # are installed to the same prefix.
-	  # At present, this check doesn't affect windows .dll's that
-	  # are installed into $libdir/../bin (currently, that works fine)
-	  # but it's something to keep an eye on.
-	  test "$inst_prefix_dir" = "$destdir" && \
-	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
-
-	  if test -n "$inst_prefix_dir"; then
-	    # Stick the inst_prefix_dir data into the link command.
-	    relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
-	  else
-	    relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"`
-	  fi
-
-	  func_warning "relinking \`$file'"
-	  func_show_eval "$relink_command" \
-	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
-	fi
-
-	# See the names of the shared library.
-	set dummy $library_names; shift
-	if test -n "$1"; then
-	  realname="$1"
-	  shift
-
-	  srcname="$realname"
-	  test -n "$relink_command" && srcname="$realname"T
-
-	  # Install the shared library and build the symlinks.
-	  func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \
-	      'exit $?'
-	  tstripme="$stripme"
-	  case $host_os in
-	  cygwin* | mingw* | pw32* | cegcc*)
-	    case $realname in
-	    *.dll.a)
-	      tstripme=""
-	      ;;
-	    esac
-	    ;;
-	  esac
-	  if test -n "$tstripme" && test -n "$striplib"; then
-	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
-	  fi
-
-	  if test "$#" -gt 0; then
-	    # Delete the old symlinks, and create new ones.
-	    # Try `ln -sf' first, because the `ln' binary might depend on
-	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
-	    # so we also need to try rm && ln -s.
-	    for linkname
-	    do
-	      test "$linkname" != "$realname" \
-		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
-	    done
-	  fi
-
-	  # Do each command in the postinstall commands.
-	  lib="$destdir/$realname"
-	  func_execute_cmds "$postinstall_cmds" 'exit $?'
-	fi
-
-	# Install the pseudo-library for information purposes.
-	func_basename "$file"
-	name="$func_basename_result"
-	instname="$dir/$name"i
-	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
-
-	# Maybe install the static library, too.
-	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
-	;;
-
-      *.lo)
-	# Install (i.e. copy) a libtool object.
-
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
-	else
-	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
-	fi
-
-	# Deduce the name of the destination old-style object file.
-	case $destfile in
-	*.lo)
-	  func_lo2o "$destfile"
-	  staticdest=$func_lo2o_result
-	  ;;
-	*.$objext)
-	  staticdest="$destfile"
-	  destfile=
-	  ;;
-	*)
-	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
-	  ;;
-	esac
-
-	# Install the libtool object if requested.
-	test -n "$destfile" && \
-	  func_show_eval "$install_prog $file $destfile" 'exit $?'
-
-	# Install the old object if enabled.
-	if test "$build_old_libs" = yes; then
-	  # Deduce the name of the old-style object file.
-	  func_lo2o "$file"
-	  staticobj=$func_lo2o_result
-	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
-	fi
-	exit $EXIT_SUCCESS
-	;;
-
-      *)
-	# Figure out destination file name, if it wasn't already specified.
-	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
-	else
-	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
-	fi
-
-	# If the file is missing, and there is a .exe on the end, strip it
-	# because it is most likely a libtool script we actually want to
-	# install
-	stripped_ext=""
-	case $file in
-	  *.exe)
-	    if test ! -f "$file"; then
-	      func_stripname '' '.exe' "$file"
-	      file=$func_stripname_result
-	      stripped_ext=".exe"
-	    fi
-	    ;;
-	esac
-
-	# Do a test to see if this is really a libtool program.
-	case $host in
-	*cygwin* | *mingw*)
-	    if func_ltwrapper_executable_p "$file"; then
-	      func_ltwrapper_scriptname "$file"
-	      wrapper=$func_ltwrapper_scriptname_result
-	    else
-	      func_stripname '' '.exe' "$file"
-	      wrapper=$func_stripname_result
-	    fi
-	    ;;
-	*)
-	    wrapper=$file
-	    ;;
-	esac
-	if func_ltwrapper_script_p "$wrapper"; then
-	  notinst_deplibs=
-	  relink_command=
-
-	  func_source "$wrapper"
-
-	  # Check the variables that should have been set.
-	  test -z "$generated_by_libtool_version" && \
-	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
-
-	  finalize=yes
-	  for lib in $notinst_deplibs; do
-	    # Check to see that each library is installed.
-	    libdir=
-	    if test -f "$lib"; then
-	      func_source "$lib"
-	    fi
-	    libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
-	    if test -n "$libdir" && test ! -f "$libfile"; then
-	      func_warning "\`$lib' has not been installed in \`$libdir'"
-	      finalize=no
-	    fi
-	  done
-
-	  relink_command=
-	  func_source "$wrapper"
-
-	  outputname=
-	  if test "$fast_install" = no && test -n "$relink_command"; then
-	    $opt_dry_run || {
-	      if test "$finalize" = yes; then
-	        tmpdir=`func_mktempdir`
-		func_basename "$file$stripped_ext"
-		file="$func_basename_result"
-	        outputname="$tmpdir/$file"
-	        # Replace the output file specification.
-	        relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
-
-	        $opt_silent || {
-	          func_quote_for_expand "$relink_command"
-		  eval "func_echo $func_quote_for_expand_result"
-	        }
-	        if eval "$relink_command"; then :
-	          else
-		  func_error "error: relink \`$file' with the above command before installing it"
-		  $opt_dry_run || ${RM}r "$tmpdir"
-		  continue
-	        fi
-	        file="$outputname"
-	      else
-	        func_warning "cannot relink \`$file'"
-	      fi
-	    }
-	  else
-	    # Install the binary that we compiled earlier.
-	    file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
-	  fi
-	fi
-
-	# remove .exe since cygwin /usr/bin/install will append another
-	# one anyway
-	case $install_prog,$host in
-	*/usr/bin/install*,*cygwin*)
-	  case $file:$destfile in
-	  *.exe:*.exe)
-	    # this is ok
-	    ;;
-	  *.exe:*)
-	    destfile=$destfile.exe
-	    ;;
-	  *:*.exe)
-	    func_stripname '' '.exe' "$destfile"
-	    destfile=$func_stripname_result
-	    ;;
-	  esac
-	  ;;
-	esac
-	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
-	$opt_dry_run || if test -n "$outputname"; then
-	  ${RM}r "$tmpdir"
-	fi
-	;;
-      esac
-    done
-
-    for file in $staticlibs; do
-      func_basename "$file"
-      name="$func_basename_result"
-
-      # Set up the ranlib parameters.
-      oldlib="$destdir/$name"
-
-      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
-
-      if test -n "$stripme" && test -n "$old_striplib"; then
-	func_show_eval "$old_striplib $oldlib" 'exit $?'
-      fi
-
-      # Do each command in the postinstall commands.
-      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
-    done
-
-    test -n "$future_libdirs" && \
-      func_warning "remember to run \`$progname --finish$future_libdirs'"
-
-    if test -n "$current_libdirs"; then
-      # Maybe just do a dry run.
-      $opt_dry_run && current_libdirs=" -n$current_libdirs"
-      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
-    else
-      exit $EXIT_SUCCESS
-    fi
-}
-
-test "$mode" = install && func_mode_install ${1+"$@"}
-
-
-# func_generate_dlsyms outputname originator pic_p
-# Extract symbols from dlprefiles and create ${outputname}S.o with
-# a dlpreopen symbol table.
-func_generate_dlsyms ()
-{
-    $opt_debug
-    my_outputname="$1"
-    my_originator="$2"
-    my_pic_p="${3-no}"
-    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
-    my_dlsyms=
-
-    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-      if test -n "$NM" && test -n "$global_symbol_pipe"; then
-	my_dlsyms="${my_outputname}S.c"
-      else
-	func_error "not configured to extract global symbols from dlpreopened files"
-      fi
-    fi
-
-    if test -n "$my_dlsyms"; then
-      case $my_dlsyms in
-      "") ;;
-      *.c)
-	# Discover the nlist of each of the dlfiles.
-	nlist="$output_objdir/${my_outputname}.nm"
-
-	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
-
-	# Parse the name list into a source file.
-	func_verbose "creating $output_objdir/$my_dlsyms"
-
-	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
-/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
-/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
-
-#ifdef __cplusplus
-extern \"C\" {
-#endif
-
-/* External symbol declarations for the compiler. */\
-"
-
-	if test "$dlself" = yes; then
-	  func_verbose "generating symbol list for \`$output'"
-
-	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
-
-	  # Add our own program objects to the symbol list.
-	  progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-	  for progfile in $progfiles; do
-	    func_verbose "extracting global C symbols from \`$progfile'"
-	    $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'"
-	  done
-
-	  if test -n "$exclude_expsyms"; then
-	    $opt_dry_run || {
-	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
-	      eval '$MV "$nlist"T "$nlist"'
-	    }
-	  fi
-
-	  if test -n "$export_symbols_regex"; then
-	    $opt_dry_run || {
-	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
-	      eval '$MV "$nlist"T "$nlist"'
-	    }
-	  fi
-
-	  # Prepare the list of exported symbols
-	  if test -z "$export_symbols"; then
-	    export_symbols="$output_objdir/$outputname.exp"
-	    $opt_dry_run || {
-	      $RM $export_symbols
-	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
-	      case $host in
-	      *cygwin* | *mingw* | *cegcc* )
-                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
-                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
-	        ;;
-	      esac
-	    }
-	  else
-	    $opt_dry_run || {
-	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
-	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
-	      eval '$MV "$nlist"T "$nlist"'
-	      case $host in
-	        *cygwin | *mingw* | *cegcc* )
-	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
-	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
-	          ;;
-	      esac
-	    }
-	  fi
-	fi
-
-	for dlprefile in $dlprefiles; do
-	  func_verbose "extracting global C symbols from \`$dlprefile'"
-	  func_basename "$dlprefile"
-	  name="$func_basename_result"
-	  $opt_dry_run || {
-	    eval '$ECHO ": $name " >> "$nlist"'
-	    eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'"
-	  }
-	done
-
-	$opt_dry_run || {
-	  # Make sure we have at least an empty file.
-	  test -f "$nlist" || : > "$nlist"
-
-	  if test -n "$exclude_expsyms"; then
-	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
-	    $MV "$nlist"T "$nlist"
-	  fi
-
-	  # Try sorting and uniquifying the output.
-	  if $GREP -v "^: " < "$nlist" |
-	      if sort -k 3 </dev/null >/dev/null 2>&1; then
-		sort -k 3
-	      else
-		sort +2
-	      fi |
-	      uniq > "$nlist"S; then
-	    :
-	  else
-	    $GREP -v "^: " < "$nlist" > "$nlist"S
-	  fi
-
-	  if test -f "$nlist"S; then
-	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
-	  else
-	    $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms"
-	  fi
-
-	  $ECHO >> "$output_objdir/$my_dlsyms" "\
-
-/* The mapping between symbol names and symbols.  */
-typedef struct {
-  const char *name;
-  void *address;
-} lt_dlsymlist;
-"
-	  case $host in
-	  *cygwin* | *mingw* | *cegcc* )
-	    $ECHO >> "$output_objdir/$my_dlsyms" "\
-/* DATA imports from DLLs on WIN32 con't be const, because
-   runtime relocations are performed -- see ld's documentation
-   on pseudo-relocs.  */"
-	    lt_dlsym_const= ;;
-	  *osf5*)
-	    echo >> "$output_objdir/$my_dlsyms" "\
-/* This system does not cope well with relocations in const data */"
-	    lt_dlsym_const= ;;
-	  *)
-	    lt_dlsym_const=const ;;
-	  esac
-
-	  $ECHO >> "$output_objdir/$my_dlsyms" "\
-extern $lt_dlsym_const lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[];
-$lt_dlsym_const lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[] =
-{\
-  { \"$my_originator\", (void *) 0 },"
-
-	  case $need_lib_prefix in
-	  no)
-	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
-	    ;;
-	  *)
-	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
-	    ;;
-	  esac
-	  $ECHO >> "$output_objdir/$my_dlsyms" "\
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt_${my_prefix}_LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif\
-"
-	} # !$opt_dry_run
-
-	pic_flag_for_symtable=
-	case "$compile_command " in
-	*" -static "*) ;;
-	*)
-	  case $host in
-	  # compiling the symbol table file with pic_flag works around
-	  # a FreeBSD bug that causes programs to crash when -lm is
-	  # linked before any other PIC object.  But we must not use
-	  # pic_flag when linking with -static.  The problem exists in
-	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
-	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
-	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
-	  *-*-hpux*)
-	    pic_flag_for_symtable=" $pic_flag"  ;;
-	  *)
-	    if test "X$my_pic_p" != Xno; then
-	      pic_flag_for_symtable=" $pic_flag"
-	    fi
-	    ;;
-	  esac
-	  ;;
-	esac
-	symtab_cflags=
-	for arg in $LTCFLAGS; do
-	  case $arg in
-	  -pie | -fpie | -fPIE) ;;
-	  *) symtab_cflags="$symtab_cflags $arg" ;;
-	  esac
-	done
-
-	# Now compile the dynamic symbol file.
-	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
-
-	# Clean up the generated files.
-	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
-
-	# Transform the symbol file into the correct name.
-	symfileobj="$output_objdir/${my_outputname}S.$objext"
-	case $host in
-	*cygwin* | *mingw* | *cegcc* )
-	  if test -f "$output_objdir/$my_outputname.def"; then
-	    compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
-	    finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
-	  else
-	    compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
-	    finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
-	  fi
-	  ;;
-	*)
-	  compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
-	  finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
-	  ;;
-	esac
-	;;
-      *)
-	func_fatal_error "unknown suffix for \`$my_dlsyms'"
-	;;
-      esac
-    else
-      # We keep going just in case the user didn't refer to
-      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
-      # really was required.
-
-      # Nullify the symbol file.
-      compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
-      finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
-    fi
-}
-
-# func_win32_libid arg
-# return the library type of file 'arg'
-#
-# Need a lot of goo to handle *both* DLLs and import libs
-# Has to be a shell function in order to 'eat' the argument
-# that is supplied when $file_magic_command is called.
-func_win32_libid ()
-{
-  $opt_debug
-  win32_libid_type="unknown"
-  win32_fileres=`file -L $1 2>/dev/null`
-  case $win32_fileres in
-  *ar\ archive\ import\ library*) # definitely import
-    win32_libid_type="x86 archive import"
-    ;;
-  *ar\ archive*) # could be an import, or static
-    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
-       $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
-      win32_nmres=`eval $NM -f posix -A $1 |
-	$SED -n -e '
-	    1,100{
-		/ I /{
-		    s,.*,import,
-		    p
-		    q
-		}
-	    }'`
-      case $win32_nmres in
-      import*)  win32_libid_type="x86 archive import";;
-      *)        win32_libid_type="x86 archive static";;
-      esac
-    fi
-    ;;
-  *DLL*)
-    win32_libid_type="x86 DLL"
-    ;;
-  *executable*) # but shell scripts are "executable" too...
-    case $win32_fileres in
-    *MS\ Windows\ PE\ Intel*)
-      win32_libid_type="x86 DLL"
-      ;;
-    esac
-    ;;
-  esac
-  $ECHO "$win32_libid_type"
-}
-
-
-
-# func_extract_an_archive dir oldlib
-func_extract_an_archive ()
-{
-    $opt_debug
-    f_ex_an_ar_dir="$1"; shift
-    f_ex_an_ar_oldlib="$1"
-    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?'
-    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
-     :
-    else
-      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
-    fi
-}
-
-
-# func_extract_archives gentop oldlib ...
-func_extract_archives ()
-{
-    $opt_debug
-    my_gentop="$1"; shift
-    my_oldlibs=${1+"$@"}
-    my_oldobjs=""
-    my_xlib=""
-    my_xabs=""
-    my_xdir=""
-
-    for my_xlib in $my_oldlibs; do
-      # Extract the objects.
-      case $my_xlib in
-	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
-	*) my_xabs=`pwd`"/$my_xlib" ;;
-      esac
-      func_basename "$my_xlib"
-      my_xlib="$func_basename_result"
-      my_xlib_u=$my_xlib
-      while :; do
-        case " $extracted_archives " in
-	*" $my_xlib_u "*)
-	  func_arith $extracted_serial + 1
-	  extracted_serial=$func_arith_result
-	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
-	*) break ;;
-	esac
-      done
-      extracted_archives="$extracted_archives $my_xlib_u"
-      my_xdir="$my_gentop/$my_xlib_u"
-
-      func_mkdir_p "$my_xdir"
-
-      case $host in
-      *-darwin*)
-	func_verbose "Extracting $my_xabs"
-	# Do not bother doing anything if just a dry run
-	$opt_dry_run || {
-	  darwin_orig_dir=`pwd`
-	  cd $my_xdir || exit $?
-	  darwin_archive=$my_xabs
-	  darwin_curdir=`pwd`
-	  darwin_base_archive=`basename "$darwin_archive"`
-	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
-	  if test -n "$darwin_arches"; then
-	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
-	    darwin_arch=
-	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
-	    for darwin_arch in  $darwin_arches ; do
-	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
-	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
-	      cd "$darwin_curdir"
-	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
-	    done # $darwin_arches
-            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
-	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
-	    darwin_file=
-	    darwin_files=
-	    for darwin_file in $darwin_filelist; do
-	      darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
-	      $LIPO -create -output "$darwin_file" $darwin_files
-	    done # $darwin_filelist
-	    $RM -rf unfat-$$
-	    cd "$darwin_orig_dir"
-	  else
-	    cd $darwin_orig_dir
-	    func_extract_an_archive "$my_xdir" "$my_xabs"
-	  fi # $darwin_arches
-	} # !$opt_dry_run
-	;;
-      *)
-        func_extract_an_archive "$my_xdir" "$my_xabs"
-	;;
-      esac
-      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
-    done
-
-    func_extract_archives_result="$my_oldobjs"
-}
-
-
-
-# func_emit_wrapper_part1 [arg=no]
-#
-# Emit the first part of a libtool wrapper script on stdout.
-# For more information, see the description associated with
-# func_emit_wrapper(), below.
-func_emit_wrapper_part1 ()
-{
-	func_emit_wrapper_part1_arg1=no
-	if test -n "$1" ; then
-	  func_emit_wrapper_part1_arg1=$1
-	fi
-
-	$ECHO "\
-#! $SHELL
-
-# $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# The $output program cannot be directly executed until all the libtool
-# libraries that it depends on are installed.
-#
-# This wrapper script should never be moved out of the build directory.
-# If it is, it will not operate correctly.
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='${SED} -e 1s/^X//'
-sed_quote_subst='$sed_quote_subst'
-
-# Be Bourne compatible
-if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '\${1+\"\$@\"}'='\"\$@\"'
-  setopt NO_GLOB_SUBST
-else
-  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
-fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-relink_command=\"$relink_command\"
-
-# This environment variable determines our operation mode.
-if test \"\$libtool_install_magic\" = \"$magic\"; then
-  # install mode needs the following variables:
-  generated_by_libtool_version='$macro_version'
-  notinst_deplibs='$notinst_deplibs'
-else
-  # When we are sourced in execute mode, \$file and \$ECHO are already set.
-  if test \"\$libtool_execute_magic\" != \"$magic\"; then
-    ECHO=\"$qecho\"
-    file=\"\$0\"
-    # Make sure echo works.
-    if test \"X\$1\" = X--no-reexec; then
-      # Discard the --no-reexec flag, and continue.
-      shift
-    elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then
-      # Yippee, \$ECHO works!
-      :
-    else
-      # Restart under the correct shell, and then maybe \$ECHO will work.
-      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
-    fi
-  fi\
-"
-	$ECHO "\
-
-  # Find the directory that this script lives in.
-  thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
-  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
-
-  # Follow symbolic links until we get to the real thisdir.
-  file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
-  while test -n \"\$file\"; do
-    destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
-
-    # If there was a directory component, then change thisdir.
-    if test \"x\$destdir\" != \"x\$file\"; then
-      case \"\$destdir\" in
-      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
-      *) thisdir=\"\$thisdir/\$destdir\" ;;
-      esac
-    fi
-
-    file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
-    file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
-  done
-"
-}
-# end: func_emit_wrapper_part1
-
-# func_emit_wrapper_part2 [arg=no]
-#
-# Emit the second part of a libtool wrapper script on stdout.
-# For more information, see the description associated with
-# func_emit_wrapper(), below.
-func_emit_wrapper_part2 ()
-{
-	func_emit_wrapper_part2_arg1=no
-	if test -n "$1" ; then
-	  func_emit_wrapper_part2_arg1=$1
-	fi
-
-	$ECHO "\
-
-  # Usually 'no', except on cygwin/mingw when embedded into
-  # the cwrapper.
-  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1
-  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
-    # special case for '.'
-    if test \"\$thisdir\" = \".\"; then
-      thisdir=\`pwd\`
-    fi
-    # remove .libs from thisdir
-    case \"\$thisdir\" in
-    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;;
-    $objdir )   thisdir=. ;;
-    esac
-  fi
-
-  # Try to get the absolute directory name.
-  absdir=\`cd \"\$thisdir\" && pwd\`
-  test -n \"\$absdir\" && thisdir=\"\$absdir\"
-"
-
-	if test "$fast_install" = yes; then
-	  $ECHO "\
-  program=lt-'$outputname'$exeext
-  progdir=\"\$thisdir/$objdir\"
-
-  if test ! -f \"\$progdir/\$program\" ||
-     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
-       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
-
-    file=\"\$\$-\$program\"
-
-    if test ! -d \"\$progdir\"; then
-      $MKDIR \"\$progdir\"
-    else
-      $RM \"\$progdir/\$file\"
-    fi"
-
-	  $ECHO "\
-
-    # relink executable if necessary
-    if test -n \"\$relink_command\"; then
-      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
-      else
-	$ECHO \"\$relink_command_output\" >&2
-	$RM \"\$progdir/\$file\"
-	exit 1
-      fi
-    fi
-
-    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
-    { $RM \"\$progdir/\$program\";
-      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
-    $RM \"\$progdir/\$file\"
-  fi"
-	else
-	  $ECHO "\
-  program='$outputname'
-  progdir=\"\$thisdir/$objdir\"
-"
-	fi
-
-	$ECHO "\
-
-  if test -f \"\$progdir/\$program\"; then"
-
-	# Export our shlibpath_var if we have one.
-	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-	  $ECHO "\
-    # Add our own library path to $shlibpath_var
-    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
-
-    # Some systems cannot cope with colon-terminated $shlibpath_var
-    # The second colon is a workaround for a bug in BeOS R4 sed
-    $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
-
-    export $shlibpath_var
-"
-	fi
-
-	# fixup the dll searchpath if we need to.
-	if test -n "$dllsearchpath"; then
-	  $ECHO "\
-    # Add the dll search path components to the executable PATH
-    PATH=$dllsearchpath:\$PATH
-"
-	fi
-
-	$ECHO "\
-    if test \"\$libtool_execute_magic\" != \"$magic\"; then
-      # Run the actual program with our arguments.
-"
-	case $host in
-	# Backslashes separate directories on plain windows
-	*-*-mingw | *-*-os2* | *-cegcc*)
-	  $ECHO "\
-      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
-"
-	  ;;
-
-	*)
-	  $ECHO "\
-      exec \"\$progdir/\$program\" \${1+\"\$@\"}
-"
-	  ;;
-	esac
-	$ECHO "\
-      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
-      exit 1
-    fi
-  else
-    # The program doesn't exist.
-    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
-    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
-    $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
-    exit 1
-  fi
-fi\
-"
-}
-# end: func_emit_wrapper_part2
-
-
-# func_emit_wrapper [arg=no]
-#
-# Emit a libtool wrapper script on stdout.
-# Don't directly open a file because we may want to
-# incorporate the script contents within a cygwin/mingw
-# wrapper executable.  Must ONLY be called from within
-# func_mode_link because it depends on a number of variables
-# set therein.
-#
-# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
-# variable will take.  If 'yes', then the emitted script
-# will assume that the directory in which it is stored is
-# the $objdir directory.  This is a cygwin/mingw-specific
-# behavior.
-func_emit_wrapper ()
-{
-	func_emit_wrapper_arg1=no
-	if test -n "$1" ; then
-	  func_emit_wrapper_arg1=$1
-	fi
-
-	# split this up so that func_emit_cwrapperexe_src
-	# can call each part independently.
-	func_emit_wrapper_part1 "${func_emit_wrapper_arg1}"
-	func_emit_wrapper_part2 "${func_emit_wrapper_arg1}"
-}
-
-
-# func_to_host_path arg
-#
-# Convert paths to host format when used with build tools.
-# Intended for use with "native" mingw (where libtool itself
-# is running under the msys shell), or in the following cross-
-# build environments:
-#    $build          $host
-#    mingw (msys)    mingw  [e.g. native]
-#    cygwin          mingw
-#    *nix + wine     mingw
-# where wine is equipped with the `winepath' executable.
-# In the native mingw case, the (msys) shell automatically
-# converts paths for any non-msys applications it launches,
-# but that facility isn't available from inside the cwrapper.
-# Similar accommodations are necessary for $host mingw and
-# $build cygwin.  Calling this function does no harm for other
-# $host/$build combinations not listed above.
-#
-# ARG is the path (on $build) that should be converted to
-# the proper representation for $host. The result is stored
-# in $func_to_host_path_result.
-func_to_host_path ()
-{
-  func_to_host_path_result="$1"
-  if test -n "$1" ; then
-    case $host in
-      *mingw* )
-        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-        case $build in
-          *mingw* ) # actually, msys
-            # awkward: cmd appends spaces to result
-            lt_sed_strip_trailing_spaces="s/[ ]*\$//"
-            func_to_host_path_tmp1=`( cmd //c echo "$1" |\
-              $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
-            func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
-              $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          *cygwin* )
-            func_to_host_path_tmp1=`cygpath -w "$1"`
-            func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
-              $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          * )
-            # Unfortunately, winepath does not exit with a non-zero
-            # error code, so we are forced to check the contents of
-            # stdout. On the other hand, if the command is not
-            # found, the shell will set an exit code of 127 and print
-            # *an error message* to stdout. So we must check for both
-            # error code of zero AND non-empty stdout, which explains
-            # the odd construction:
-            func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null`
-            if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then
-              func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
-                $SED -e "$lt_sed_naive_backslashify"`
-            else
-              # Allow warning below.
-              func_to_host_path_result=""
-            fi
-            ;;
-        esac
-        if test -z "$func_to_host_path_result" ; then
-          func_error "Could not determine host path corresponding to"
-          func_error "  '$1'"
-          func_error "Continuing, but uninstalled executables may not work."
-          # Fallback:
-          func_to_host_path_result="$1"
-        fi
-        ;;
-    esac
-  fi
-}
-# end: func_to_host_path
-
-# func_to_host_pathlist arg
-#
-# Convert pathlists to host format when used with build tools.
-# See func_to_host_path(), above. This function supports the
-# following $build/$host combinations (but does no harm for
-# combinations not listed here):
-#    $build          $host
-#    mingw (msys)    mingw  [e.g. native]
-#    cygwin          mingw
-#    *nix + wine     mingw
-#
-# Path separators are also converted from $build format to
-# $host format. If ARG begins or ends with a path separator
-# character, it is preserved (but converted to $host format)
-# on output.
-#
-# ARG is a pathlist (on $build) that should be converted to
-# the proper representation on $host. The result is stored
-# in $func_to_host_pathlist_result.
-func_to_host_pathlist ()
-{
-  func_to_host_pathlist_result="$1"
-  if test -n "$1" ; then
-    case $host in
-      *mingw* )
-        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-        # Remove leading and trailing path separator characters from
-        # ARG. msys behavior is inconsistent here, cygpath turns them
-        # into '.;' and ';.', and winepath ignores them completely.
-        func_to_host_pathlist_tmp2="$1"
-        # Once set for this call, this variable should not be
-        # reassigned. It is used in tha fallback case.
-        func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\
-          $SED -e 's|^:*||' -e 's|:*$||'`
-        case $build in
-          *mingw* ) # Actually, msys.
-            # Awkward: cmd appends spaces to result.
-            lt_sed_strip_trailing_spaces="s/[ ]*\$//"
-            func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\
-              $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
-            func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
-              $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          *cygwin* )
-            func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"`
-            func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
-              $SED -e "$lt_sed_naive_backslashify"`
-            ;;
-          * )
-            # unfortunately, winepath doesn't convert pathlists
-            func_to_host_pathlist_result=""
-            func_to_host_pathlist_oldIFS=$IFS
-            IFS=:
-            for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do
-              IFS=$func_to_host_pathlist_oldIFS
-              if test -n "$func_to_host_pathlist_f" ; then
-                func_to_host_path "$func_to_host_pathlist_f"
-                if test -n "$func_to_host_path_result" ; then
-                  if test -z "$func_to_host_pathlist_result" ; then
-                    func_to_host_pathlist_result="$func_to_host_path_result"
-                  else
-                    func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result"
-                  fi
-                fi
-              fi
-              IFS=:
-            done
-            IFS=$func_to_host_pathlist_oldIFS
-            ;;
-        esac
-        if test -z "$func_to_host_pathlist_result" ; then
-          func_error "Could not determine the host path(s) corresponding to"
-          func_error "  '$1'"
-          func_error "Continuing, but uninstalled executables may not work."
-          # Fallback. This may break if $1 contains DOS-style drive
-          # specifications. The fix is not to complicate the expression
-          # below, but for the user to provide a working wine installation
-          # with winepath so that path translation in the cross-to-mingw
-          # case works properly.
-          lt_replace_pathsep_nix_to_dos="s|:|;|g"
-          func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\
-            $SED -e "$lt_replace_pathsep_nix_to_dos"`
-        fi
-        # Now, add the leading and trailing path separators back
-        case "$1" in
-          :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result"
-            ;;
-        esac
-        case "$1" in
-          *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;"
-            ;;
-        esac
-        ;;
-    esac
-  fi
-}
-# end: func_to_host_pathlist
-
-# func_emit_cwrapperexe_src
-# emit the source code for a wrapper executable on stdout
-# Must ONLY be called from within func_mode_link because
-# it depends on a number of variable set therein.
-func_emit_cwrapperexe_src ()
-{
-	cat <<EOF
-
-/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
-   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-
-   The $output program cannot be directly executed until all the libtool
-   libraries that it depends on are installed.
-
-   This wrapper executable should never be moved out of the build directory.
-   If it is, it will not operate correctly.
-
-   Currently, it simply execs the wrapper *script* "$SHELL $output",
-   but could eventually absorb all of the scripts functionality and
-   exec $objdir/$outputname directly.
-*/
-EOF
-	    cat <<"EOF"
-#include <stdio.h>
-#include <stdlib.h>
-#ifdef _MSC_VER
-# include <direct.h>
-# include <process.h>
-# include <io.h>
-# define setmode _setmode
-#else
-# include <unistd.h>
-# include <stdint.h>
-# ifdef __CYGWIN__
-#  include <io.h>
-#  define HAVE_SETENV
-#  ifdef __STRICT_ANSI__
-char *realpath (const char *, char *);
-int putenv (char *);
-int setenv (const char *, const char *, int);
-#  endif
-# endif
-#endif
-#include <malloc.h>
-#include <stdarg.h>
-#include <assert.h>
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-
-#if defined(PATH_MAX)
-# define LT_PATHMAX PATH_MAX
-#elif defined(MAXPATHLEN)
-# define LT_PATHMAX MAXPATHLEN
-#else
-# define LT_PATHMAX 1024
-#endif
-
-#ifndef S_IXOTH
-# define S_IXOTH 0
-#endif
-#ifndef S_IXGRP
-# define S_IXGRP 0
-#endif
-
-#ifdef _MSC_VER
-# define S_IXUSR _S_IEXEC
-# define stat _stat
-# ifndef _INTPTR_T_DEFINED
-#  define intptr_t int
-# endif
-#endif
-
-#ifndef DIR_SEPARATOR
-# define DIR_SEPARATOR '/'
-# define PATH_SEPARATOR ':'
-#endif
-
-#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
-  defined (__OS2__)
-# define HAVE_DOS_BASED_FILE_SYSTEM
-# define FOPEN_WB "wb"
-# ifndef DIR_SEPARATOR_2
-#  define DIR_SEPARATOR_2 '\\'
-# endif
-# ifndef PATH_SEPARATOR_2
-#  define PATH_SEPARATOR_2 ';'
-# endif
-#endif
-
-#ifndef DIR_SEPARATOR_2
-# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
-#else /* DIR_SEPARATOR_2 */
-# define IS_DIR_SEPARATOR(ch) \
-	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
-#endif /* DIR_SEPARATOR_2 */
-
-#ifndef PATH_SEPARATOR_2
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
-#else /* PATH_SEPARATOR_2 */
-# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
-#endif /* PATH_SEPARATOR_2 */
-
-#ifdef __CYGWIN__
-# define FOPEN_WB "wb"
-#endif
-
-#ifndef FOPEN_WB
-# define FOPEN_WB "w"
-#endif
-#ifndef _O_BINARY
-# define _O_BINARY 0
-#endif
-
-#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
-#define XFREE(stale) do { \
-  if (stale) { free ((void *) stale); stale = 0; } \
-} while (0)
-
-#undef LTWRAPPER_DEBUGPRINTF
-#if defined DEBUGWRAPPER
-# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args
-static void
-ltwrapper_debugprintf (const char *fmt, ...)
-{
-    va_list args;
-    va_start (args, fmt);
-    (void) vfprintf (stderr, fmt, args);
-    va_end (args);
-}
-#else
-# define LTWRAPPER_DEBUGPRINTF(args)
-#endif
-
-const char *program_name = NULL;
-
-void *xmalloc (size_t num);
-char *xstrdup (const char *string);
-const char *base_name (const char *name);
-char *find_executable (const char *wrapper);
-char *chase_symlinks (const char *pathspec);
-int make_executable (const char *path);
-int check_executable (const char *path);
-char *strendzap (char *str, const char *pat);
-void lt_fatal (const char *message, ...);
-void lt_setenv (const char *name, const char *value);
-char *lt_extend_str (const char *orig_value, const char *add, int to_end);
-void lt_opt_process_env_set (const char *arg);
-void lt_opt_process_env_prepend (const char *arg);
-void lt_opt_process_env_append (const char *arg);
-int lt_split_name_value (const char *arg, char** name, char** value);
-void lt_update_exe_path (const char *name, const char *value);
-void lt_update_lib_path (const char *name, const char *value);
-
-static const char *script_text_part1 =
-EOF
-
-	    func_emit_wrapper_part1 yes |
-	        $SED -e 's/\([\\"]\)/\\\1/g' \
-	             -e 's/^/  "/' -e 's/$/\\n"/'
-	    echo ";"
-	    cat <<EOF
-
-static const char *script_text_part2 =
-EOF
-	    func_emit_wrapper_part2 yes |
-	        $SED -e 's/\([\\"]\)/\\\1/g' \
-	             -e 's/^/  "/' -e 's/$/\\n"/'
-	    echo ";"
-
-	    cat <<EOF
-const char * MAGIC_EXE = "$magic_exe";
-const char * LIB_PATH_VARNAME = "$shlibpath_var";
-EOF
-
-	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
-              func_to_host_pathlist "$temp_rpath"
-	      cat <<EOF
-const char * LIB_PATH_VALUE   = "$func_to_host_pathlist_result";
-EOF
-	    else
-	      cat <<"EOF"
-const char * LIB_PATH_VALUE   = "";
-EOF
-	    fi
-
-	    if test -n "$dllsearchpath"; then
-              func_to_host_pathlist "$dllsearchpath:"
-	      cat <<EOF
-const char * EXE_PATH_VARNAME = "PATH";
-const char * EXE_PATH_VALUE   = "$func_to_host_pathlist_result";
-EOF
-	    else
-	      cat <<"EOF"
-const char * EXE_PATH_VARNAME = "";
-const char * EXE_PATH_VALUE   = "";
-EOF
-	    fi
-
-	    if test "$fast_install" = yes; then
-	      cat <<EOF
-const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
-EOF
-	    else
-	      cat <<EOF
-const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
-EOF
-	    fi
-
-
-	    cat <<"EOF"
-
-#define LTWRAPPER_OPTION_PREFIX         "--lt-"
-#define LTWRAPPER_OPTION_PREFIX_LENGTH  5
-
-static const size_t opt_prefix_len         = LTWRAPPER_OPTION_PREFIX_LENGTH;
-static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
-
-static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
-
-static const size_t env_set_opt_len     = LTWRAPPER_OPTION_PREFIX_LENGTH + 7;
-static const char *env_set_opt          = LTWRAPPER_OPTION_PREFIX "env-set";
-  /* argument is putenv-style "foo=bar", value of foo is set to bar */
-
-static const size_t env_prepend_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 11;
-static const char *env_prepend_opt      = LTWRAPPER_OPTION_PREFIX "env-prepend";
-  /* argument is putenv-style "foo=bar", new value of foo is bar${foo} */
-
-static const size_t env_append_opt_len  = LTWRAPPER_OPTION_PREFIX_LENGTH + 10;
-static const char *env_append_opt       = LTWRAPPER_OPTION_PREFIX "env-append";
-  /* argument is putenv-style "foo=bar", new value of foo is ${foo}bar */
-
-int
-main (int argc, char *argv[])
-{
-  char **newargz;
-  int  newargc;
-  char *tmp_pathspec;
-  char *actual_cwrapper_path;
-  char *actual_cwrapper_name;
-  char *target_name;
-  char *lt_argv_zero;
-  intptr_t rval = 127;
-
-  int i;
-
-  program_name = (char *) xstrdup (base_name (argv[0]));
-  LTWRAPPER_DEBUGPRINTF (("(main) argv[0]      : %s\n", argv[0]));
-  LTWRAPPER_DEBUGPRINTF (("(main) program_name : %s\n", program_name));
-
-  /* very simple arg parsing; don't want to rely on getopt */
-  for (i = 1; i < argc; i++)
-    {
-      if (strcmp (argv[i], dumpscript_opt) == 0)
-	{
-EOF
-	    case "$host" in
-	      *mingw* | *cygwin* )
-		# make stdout use "unix" line endings
-		echo "          setmode(1,_O_BINARY);"
-		;;
-	      esac
-
-	    cat <<"EOF"
-	  printf ("%s", script_text_part1);
-	  printf ("%s", script_text_part2);
-	  return 0;
-	}
-    }
-
-  newargz = XMALLOC (char *, argc + 1);
-  tmp_pathspec = find_executable (argv[0]);
-  if (tmp_pathspec == NULL)
-    lt_fatal ("Couldn't find %s", argv[0]);
-  LTWRAPPER_DEBUGPRINTF (("(main) found exe (before symlink chase) at : %s\n",
-			  tmp_pathspec));
-
-  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
-  LTWRAPPER_DEBUGPRINTF (("(main) found exe (after symlink chase) at : %s\n",
-			  actual_cwrapper_path));
-  XFREE (tmp_pathspec);
-
-  actual_cwrapper_name = xstrdup( base_name (actual_cwrapper_path));
-  strendzap (actual_cwrapper_path, actual_cwrapper_name);
-
-  /* wrapper name transforms */
-  strendzap (actual_cwrapper_name, ".exe");
-  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
-  XFREE (actual_cwrapper_name);
-  actual_cwrapper_name = tmp_pathspec;
-  tmp_pathspec = 0;
-
-  /* target_name transforms -- use actual target program name; might have lt- prefix */
-  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
-  strendzap (target_name, ".exe");
-  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
-  XFREE (target_name);
-  target_name = tmp_pathspec;
-  tmp_pathspec = 0;
-
-  LTWRAPPER_DEBUGPRINTF (("(main) libtool target name: %s\n",
-			  target_name));
-EOF
-
-	    cat <<EOF
-  newargz[0] =
-    XMALLOC (char, (strlen (actual_cwrapper_path) +
-		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
-  strcpy (newargz[0], actual_cwrapper_path);
-  strcat (newargz[0], "$objdir");
-  strcat (newargz[0], "/");
-EOF
-
-	    cat <<"EOF"
-  /* stop here, and copy so we don't have to do this twice */
-  tmp_pathspec = xstrdup (newargz[0]);
-
-  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
-  strcat (newargz[0], actual_cwrapper_name);
-
-  /* DO want the lt- prefix here if it exists, so use target_name */
-  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
-  XFREE (tmp_pathspec);
-  tmp_pathspec = NULL;
-EOF
-
-	    case $host_os in
-	      mingw*)
-	    cat <<"EOF"
-  {
-    char* p;
-    while ((p = strchr (newargz[0], '\\')) != NULL)
-      {
-	*p = '/';
-      }
-    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
-      {
-	*p = '/';
-      }
-  }
-EOF
-	    ;;
-	    esac
-
-	    cat <<"EOF"
-  XFREE (target_name);
-  XFREE (actual_cwrapper_path);
-  XFREE (actual_cwrapper_name);
-
-  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
-  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
-  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
-  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
-
-  newargc=0;
-  for (i = 1; i < argc; i++)
-    {
-      if (strncmp (argv[i], env_set_opt, env_set_opt_len) == 0)
-        {
-          if (argv[i][env_set_opt_len] == '=')
-            {
-              const char *p = argv[i] + env_set_opt_len + 1;
-              lt_opt_process_env_set (p);
-            }
-          else if (argv[i][env_set_opt_len] == '\0' && i + 1 < argc)
-            {
-              lt_opt_process_env_set (argv[++i]); /* don't copy */
-            }
-          else
-            lt_fatal ("%s missing required argument", env_set_opt);
-          continue;
-        }
-      if (strncmp (argv[i], env_prepend_opt, env_prepend_opt_len) == 0)
-        {
-          if (argv[i][env_prepend_opt_len] == '=')
-            {
-              const char *p = argv[i] + env_prepend_opt_len + 1;
-              lt_opt_process_env_prepend (p);
-            }
-          else if (argv[i][env_prepend_opt_len] == '\0' && i + 1 < argc)
-            {
-              lt_opt_process_env_prepend (argv[++i]); /* don't copy */
-            }
-          else
-            lt_fatal ("%s missing required argument", env_prepend_opt);
-          continue;
-        }
-      if (strncmp (argv[i], env_append_opt, env_append_opt_len) == 0)
-        {
-          if (argv[i][env_append_opt_len] == '=')
-            {
-              const char *p = argv[i] + env_append_opt_len + 1;
-              lt_opt_process_env_append (p);
-            }
-          else if (argv[i][env_append_opt_len] == '\0' && i + 1 < argc)
-            {
-              lt_opt_process_env_append (argv[++i]); /* don't copy */
-            }
-          else
-            lt_fatal ("%s missing required argument", env_append_opt);
-          continue;
-        }
-      if (strncmp (argv[i], ltwrapper_option_prefix, opt_prefix_len) == 0)
-        {
-          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
-             namespace, but it is not one of the ones we know about and
-             have already dealt with, above (inluding dump-script), then
-             report an error. Otherwise, targets might begin to believe
-             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
-             namespace. The first time any user complains about this, we'll
-             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
-             or a configure.ac-settable value.
-           */
-          lt_fatal ("Unrecognized option in %s namespace: '%s'",
-                    ltwrapper_option_prefix, argv[i]);
-        }
-      /* otherwise ... */
-      newargz[++newargc] = xstrdup (argv[i]);
-    }
-  newargz[++newargc] = NULL;
-
-  LTWRAPPER_DEBUGPRINTF     (("(main) lt_argv_zero : %s\n", (lt_argv_zero ? lt_argv_zero : "<NULL>")));
-  for (i = 0; i < newargc; i++)
-    {
-      LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d]   : %s\n", i, (newargz[i] ? newargz[i] : "<NULL>")));
-    }
-
-EOF
-
-	    case $host_os in
-	      mingw*)
-		cat <<"EOF"
-  /* execv doesn't actually work on mingw as expected on unix */
-  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
-  if (rval == -1)
-    {
-      /* failed to start process */
-      LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno));
-      return 127;
-    }
-  return rval;
-EOF
-		;;
-	      *)
-		cat <<"EOF"
-  execv (lt_argv_zero, newargz);
-  return rval; /* =127, but avoids unused variable warning */
-EOF
-		;;
-	    esac
-
-	    cat <<"EOF"
-}
-
-void *
-xmalloc (size_t num)
-{
-  void *p = (void *) malloc (num);
-  if (!p)
-    lt_fatal ("Memory exhausted");
-
-  return p;
-}
-
-char *
-xstrdup (const char *string)
-{
-  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
-			  string) : NULL;
-}
-
-const char *
-base_name (const char *name)
-{
-  const char *base;
-
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  /* Skip over the disk name in MSDOS pathnames. */
-  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
-    name += 2;
-#endif
-
-  for (base = name; *name; name++)
-    if (IS_DIR_SEPARATOR (*name))
-      base = name + 1;
-  return base;
-}
-
-int
-check_executable (const char *path)
-{
-  struct stat st;
-
-  LTWRAPPER_DEBUGPRINTF (("(check_executable)  : %s\n",
-			  path ? (*path ? path : "EMPTY!") : "NULL!"));
-  if ((!path) || (!*path))
-    return 0;
-
-  if ((stat (path, &st) >= 0)
-      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
-    return 1;
-  else
-    return 0;
-}
-
-int
-make_executable (const char *path)
-{
-  int rval = 0;
-  struct stat st;
-
-  LTWRAPPER_DEBUGPRINTF (("(make_executable)   : %s\n",
-			  path ? (*path ? path : "EMPTY!") : "NULL!"));
-  if ((!path) || (!*path))
-    return 0;
-
-  if (stat (path, &st) >= 0)
-    {
-      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
-    }
-  return rval;
-}
-
-/* Searches for the full path of the wrapper.  Returns
-   newly allocated full path name if found, NULL otherwise
-   Does not chase symlinks, even on platforms that support them.
-*/
-char *
-find_executable (const char *wrapper)
-{
-  int has_slash = 0;
-  const char *p;
-  const char *p_next;
-  /* static buffer for getcwd */
-  char tmp[LT_PATHMAX + 1];
-  int tmp_len;
-  char *concat_name;
-
-  LTWRAPPER_DEBUGPRINTF (("(find_executable)   : %s\n",
-			  wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"));
-
-  if ((wrapper == NULL) || (*wrapper == '\0'))
-    return NULL;
-
-  /* Absolute path? */
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
-    {
-      concat_name = xstrdup (wrapper);
-      if (check_executable (concat_name))
-	return concat_name;
-      XFREE (concat_name);
-    }
-  else
-    {
-#endif
-      if (IS_DIR_SEPARATOR (wrapper[0]))
-	{
-	  concat_name = xstrdup (wrapper);
-	  if (check_executable (concat_name))
-	    return concat_name;
-	  XFREE (concat_name);
-	}
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
-    }
-#endif
-
-  for (p = wrapper; *p; p++)
-    if (*p == '/')
-      {
-	has_slash = 1;
-	break;
-      }
-  if (!has_slash)
-    {
-      /* no slashes; search PATH */
-      const char *path = getenv ("PATH");
-      if (path != NULL)
-	{
-	  for (p = path; *p; p = p_next)
-	    {
-	      const char *q;
-	      size_t p_len;
-	      for (q = p; *q; q++)
-		if (IS_PATH_SEPARATOR (*q))
-		  break;
-	      p_len = q - p;
-	      p_next = (*q == '\0' ? q : q + 1);
-	      if (p_len == 0)
-		{
-		  /* empty path: current directory */
-		  if (getcwd (tmp, LT_PATHMAX) == NULL)
-		    lt_fatal ("getcwd failed");
-		  tmp_len = strlen (tmp);
-		  concat_name =
-		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
-		  memcpy (concat_name, tmp, tmp_len);
-		  concat_name[tmp_len] = '/';
-		  strcpy (concat_name + tmp_len + 1, wrapper);
-		}
-	      else
-		{
-		  concat_name =
-		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
-		  memcpy (concat_name, p, p_len);
-		  concat_name[p_len] = '/';
-		  strcpy (concat_name + p_len + 1, wrapper);
-		}
-	      if (check_executable (concat_name))
-		return concat_name;
-	      XFREE (concat_name);
-	    }
-	}
-      /* not found in PATH; assume curdir */
-    }
-  /* Relative path | not found in path: prepend cwd */
-  if (getcwd (tmp, LT_PATHMAX) == NULL)
-    lt_fatal ("getcwd failed");
-  tmp_len = strlen (tmp);
-  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
-  memcpy (concat_name, tmp, tmp_len);
-  concat_name[tmp_len] = '/';
-  strcpy (concat_name + tmp_len + 1, wrapper);
-
-  if (check_executable (concat_name))
-    return concat_name;
-  XFREE (concat_name);
-  return NULL;
-}
-
-char *
-chase_symlinks (const char *pathspec)
-{
-#ifndef S_ISLNK
-  return xstrdup (pathspec);
-#else
-  char buf[LT_PATHMAX];
-  struct stat s;
-  char *tmp_pathspec = xstrdup (pathspec);
-  char *p;
-  int has_symlinks = 0;
-  while (strlen (tmp_pathspec) && !has_symlinks)
-    {
-      LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n",
-			      tmp_pathspec));
-      if (lstat (tmp_pathspec, &s) == 0)
-	{
-	  if (S_ISLNK (s.st_mode) != 0)
-	    {
-	      has_symlinks = 1;
-	      break;
-	    }
-
-	  /* search backwards for last DIR_SEPARATOR */
-	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
-	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
-	    p--;
-	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
-	    {
-	      /* no more DIR_SEPARATORS left */
-	      break;
-	    }
-	  *p = '\0';
-	}
-      else
-	{
-	  char *errstr = strerror (errno);
-	  lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr);
-	}
-    }
-  XFREE (tmp_pathspec);
-
-  if (!has_symlinks)
-    {
-      return xstrdup (pathspec);
-    }
-
-  tmp_pathspec = realpath (pathspec, buf);
-  if (tmp_pathspec == 0)
-    {
-      lt_fatal ("Could not follow symlinks for %s", pathspec);
-    }
-  return xstrdup (tmp_pathspec);
-#endif
-}
-
-char *
-strendzap (char *str, const char *pat)
-{
-  size_t len, patlen;
-
-  assert (str != NULL);
-  assert (pat != NULL);
-
-  len = strlen (str);
-  patlen = strlen (pat);
-
-  if (patlen <= len)
-    {
-      str += len - patlen;
-      if (strcmp (str, pat) == 0)
-	*str = '\0';
-    }
-  return str;
-}
-
-static void
-lt_error_core (int exit_status, const char *mode,
-	       const char *message, va_list ap)
-{
-  fprintf (stderr, "%s: %s: ", program_name, mode);
-  vfprintf (stderr, message, ap);
-  fprintf (stderr, ".\n");
-
-  if (exit_status >= 0)
-    exit (exit_status);
-}
-
-void
-lt_fatal (const char *message, ...)
-{
-  va_list ap;
-  va_start (ap, message);
-  lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
-  va_end (ap);
-}
-
-void
-lt_setenv (const char *name, const char *value)
-{
-  LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n",
-                          (name ? name : "<NULL>"),
-                          (value ? value : "<NULL>")));
-  {
-#ifdef HAVE_SETENV
-    /* always make a copy, for consistency with !HAVE_SETENV */
-    char *str = xstrdup (value);
-    setenv (name, str, 1);
-#else
-    int len = strlen (name) + 1 + strlen (value) + 1;
-    char *str = XMALLOC (char, len);
-    sprintf (str, "%s=%s", name, value);
-    if (putenv (str) != EXIT_SUCCESS)
-      {
-        XFREE (str);
-      }
-#endif
-  }
-}
-
-char *
-lt_extend_str (const char *orig_value, const char *add, int to_end)
-{
-  char *new_value;
-  if (orig_value && *orig_value)
-    {
-      int orig_value_len = strlen (orig_value);
-      int add_len = strlen (add);
-      new_value = XMALLOC (char, add_len + orig_value_len + 1);
-      if (to_end)
-        {
-          strcpy (new_value, orig_value);
-          strcpy (new_value + orig_value_len, add);
-        }
-      else
-        {
-          strcpy (new_value, add);
-          strcpy (new_value + add_len, orig_value);
-        }
-    }
-  else
-    {
-      new_value = xstrdup (add);
-    }
-  return new_value;
-}
-
-int
-lt_split_name_value (const char *arg, char** name, char** value)
-{
-  const char *p;
-  int len;
-  if (!arg || !*arg)
-    return 1;
-
-  p = strchr (arg, (int)'=');
-
-  if (!p)
-    return 1;
-
-  *value = xstrdup (++p);
-
-  len = strlen (arg) - strlen (*value);
-  *name = XMALLOC (char, len);
-  strncpy (*name, arg, len-1);
-  (*name)[len - 1] = '\0';
-
-  return 0;
-}
-
-void
-lt_opt_process_env_set (const char *arg)
-{
-  char *name = NULL;
-  char *value = NULL;
-
-  if (lt_split_name_value (arg, &name, &value) != 0)
-    {
-      XFREE (name);
-      XFREE (value);
-      lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg);
-    }
-
-  lt_setenv (name, value);
-  XFREE (name);
-  XFREE (value);
-}
-
-void
-lt_opt_process_env_prepend (const char *arg)
-{
-  char *name = NULL;
-  char *value = NULL;
-  char *new_value = NULL;
-
-  if (lt_split_name_value (arg, &name, &value) != 0)
-    {
-      XFREE (name);
-      XFREE (value);
-      lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg);
-    }
-
-  new_value = lt_extend_str (getenv (name), value, 0);
-  lt_setenv (name, new_value);
-  XFREE (new_value);
-  XFREE (name);
-  XFREE (value);
-}
-
-void
-lt_opt_process_env_append (const char *arg)
-{
-  char *name = NULL;
-  char *value = NULL;
-  char *new_value = NULL;
-
-  if (lt_split_name_value (arg, &name, &value) != 0)
-    {
-      XFREE (name);
-      XFREE (value);
-      lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg);
-    }
-
-  new_value = lt_extend_str (getenv (name), value, 1);
-  lt_setenv (name, new_value);
-  XFREE (new_value);
-  XFREE (name);
-  XFREE (value);
-}
-
-void
-lt_update_exe_path (const char *name, const char *value)
-{
-  LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
-                          (name ? name : "<NULL>"),
-                          (value ? value : "<NULL>")));
-
-  if (name && *name && value && *value)
-    {
-      char *new_value = lt_extend_str (getenv (name), value, 0);
-      /* some systems can't cope with a ':'-terminated path #' */
-      int len = strlen (new_value);
-      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
-        {
-          new_value[len-1] = '\0';
-        }
-      lt_setenv (name, new_value);
-      XFREE (new_value);
-    }
-}
-
-void
-lt_update_lib_path (const char *name, const char *value)
-{
-  LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
-                          (name ? name : "<NULL>"),
-                          (value ? value : "<NULL>")));
-
-  if (name && *name && value && *value)
-    {
-      char *new_value = lt_extend_str (getenv (name), value, 0);
-      lt_setenv (name, new_value);
-      XFREE (new_value);
-    }
-}
-
-
-EOF
-}
-# end: func_emit_cwrapperexe_src
-
-# func_mode_link arg...
-func_mode_link ()
-{
-    $opt_debug
-    case $host in
-    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-      # It is impossible to link a dll without this setting, and
-      # we shouldn't force the makefile maintainer to figure out
-      # which system we are compiling for in order to pass an extra
-      # flag for every libtool invocation.
-      # allow_undefined=no
-
-      # FIXME: Unfortunately, there are problems with the above when trying
-      # to make a dll which has undefined symbols, in which case not
-      # even a static library is built.  For now, we need to specify
-      # -no-undefined on the libtool link line when we can be certain
-      # that all symbols are satisfied, otherwise we get a static library.
-      allow_undefined=yes
-      ;;
-    *)
-      allow_undefined=yes
-      ;;
-    esac
-    libtool_args=$nonopt
-    base_compile="$nonopt $@"
-    compile_command=$nonopt
-    finalize_command=$nonopt
-
-    compile_rpath=
-    finalize_rpath=
-    compile_shlibpath=
-    finalize_shlibpath=
-    convenience=
-    old_convenience=
-    deplibs=
-    old_deplibs=
-    compiler_flags=
-    linker_flags=
-    dllsearchpath=
-    lib_search_path=`pwd`
-    inst_prefix_dir=
-    new_inherited_linker_flags=
-
-    avoid_version=no
-    dlfiles=
-    dlprefiles=
-    dlself=no
-    export_dynamic=no
-    export_symbols=
-    export_symbols_regex=
-    generated=
-    libobjs=
-    ltlibs=
-    module=no
-    no_install=no
-    objs=
-    non_pic_objects=
-    precious_files_regex=
-    prefer_static_libs=no
-    preload=no
-    prev=
-    prevarg=
-    release=
-    rpath=
-    xrpath=
-    perm_rpath=
-    temp_rpath=
-    thread_safe=no
-    vinfo=
-    vinfo_number=no
-    weak_libs=
-    single_module="${wl}-single_module"
-    func_infer_tag $base_compile
-
-    # We need to know -static, to get the right output filenames.
-    for arg
-    do
-      case $arg in
-      -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
-	build_old_libs=no
-	break
-	;;
-      -all-static | -static | -static-libtool-libs)
-	case $arg in
-	-all-static)
-	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
-	    func_warning "complete static linking is impossible in this configuration"
-	  fi
-	  if test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=yes
-	  ;;
-	-static)
-	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=built
-	  ;;
-	-static-libtool-libs)
-	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
-	    dlopen_self=$dlopen_self_static
-	  fi
-	  prefer_static_libs=yes
-	  ;;
-	esac
-	build_libtool_libs=no
-	build_old_libs=yes
-	break
-	;;
-      esac
-    done
-
-    # See if our shared archives depend on static archives.
-    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
-
-    # Go through the arguments, transforming them on the way.
-    while test "$#" -gt 0; do
-      arg="$1"
-      shift
-      func_quote_for_eval "$arg"
-      qarg=$func_quote_for_eval_unquoted_result
-      func_append libtool_args " $func_quote_for_eval_result"
-
-      # If the previous option needs an argument, assign it.
-      if test -n "$prev"; then
-	case $prev in
-	output)
-	  func_append compile_command " @OUTPUT@"
-	  func_append finalize_command " @OUTPUT@"
-	  ;;
-	esac
-
-	case $prev in
-	dlfiles|dlprefiles)
-	  if test "$preload" = no; then
-	    # Add the symbol object into the linking commands.
-	    func_append compile_command " @SYMFILE@"
-	    func_append finalize_command " @SYMFILE@"
-	    preload=yes
-	  fi
-	  case $arg in
-	  *.la | *.lo) ;;  # We handle these cases below.
-	  force)
-	    if test "$dlself" = no; then
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  self)
-	    if test "$prev" = dlprefiles; then
-	      dlself=yes
-	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
-	      dlself=yes
-	    else
-	      dlself=needless
-	      export_dynamic=yes
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  *)
-	    if test "$prev" = dlfiles; then
-	      dlfiles="$dlfiles $arg"
-	    else
-	      dlprefiles="$dlprefiles $arg"
-	    fi
-	    prev=
-	    continue
-	    ;;
-	  esac
-	  ;;
-	expsyms)
-	  export_symbols="$arg"
-	  test -f "$arg" \
-	    || func_fatal_error "symbol file \`$arg' does not exist"
-	  prev=
-	  continue
-	  ;;
-	expsyms_regex)
-	  export_symbols_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	framework)
-	  case $host in
-	    *-*-darwin*)
-	      case "$deplibs " in
-		*" $qarg.ltframework "*) ;;
-		*) deplibs="$deplibs $qarg.ltframework" # this is fixed later
-		   ;;
-	      esac
-	      ;;
-	  esac
-	  prev=
-	  continue
-	  ;;
-	inst_prefix)
-	  inst_prefix_dir="$arg"
-	  prev=
-	  continue
-	  ;;
-	objectlist)
-	  if test -f "$arg"; then
-	    save_arg=$arg
-	    moreargs=
-	    for fil in `cat "$save_arg"`
-	    do
-#	      moreargs="$moreargs $fil"
-	      arg=$fil
-	      # A libtool-controlled object.
-
-	      # Check to see that this really is a libtool object.
-	      if func_lalib_unsafe_p "$arg"; then
-		pic_object=
-		non_pic_object=
-
-		# Read the .lo file
-		func_source "$arg"
-
-		if test -z "$pic_object" ||
-		   test -z "$non_pic_object" ||
-		   test "$pic_object" = none &&
-		   test "$non_pic_object" = none; then
-		  func_fatal_error "cannot find name of object for \`$arg'"
-		fi
-
-		# Extract subdirectory from the argument.
-		func_dirname "$arg" "/" ""
-		xdir="$func_dirname_result"
-
-		if test "$pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  pic_object="$xdir$pic_object"
-
-		  if test "$prev" = dlfiles; then
-		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		      dlfiles="$dlfiles $pic_object"
-		      prev=
-		      continue
-		    else
-		      # If libtool objects are unsupported, then we need to preload.
-		      prev=dlprefiles
-		    fi
-		  fi
-
-		  # CHECK ME:  I think I busted this.  -Ossama
-		  if test "$prev" = dlprefiles; then
-		    # Preload the old-style object.
-		    dlprefiles="$dlprefiles $pic_object"
-		    prev=
-		  fi
-
-		  # A PIC object.
-		  func_append libobjs " $pic_object"
-		  arg="$pic_object"
-		fi
-
-		# Non-PIC object.
-		if test "$non_pic_object" != none; then
-		  # Prepend the subdirectory the object is found in.
-		  non_pic_object="$xdir$non_pic_object"
-
-		  # A standard non-PIC object
-		  func_append non_pic_objects " $non_pic_object"
-		  if test -z "$pic_object" || test "$pic_object" = none ; then
-		    arg="$non_pic_object"
-		  fi
-		else
-		  # If the PIC object exists, use it instead.
-		  # $xdir was prepended to $pic_object above.
-		  non_pic_object="$pic_object"
-		  func_append non_pic_objects " $non_pic_object"
-		fi
-	      else
-		# Only an error if not doing a dry-run.
-		if $opt_dry_run; then
-		  # Extract subdirectory from the argument.
-		  func_dirname "$arg" "/" ""
-		  xdir="$func_dirname_result"
-
-		  func_lo2o "$arg"
-		  pic_object=$xdir$objdir/$func_lo2o_result
-		  non_pic_object=$xdir$func_lo2o_result
-		  func_append libobjs " $pic_object"
-		  func_append non_pic_objects " $non_pic_object"
-	        else
-		  func_fatal_error "\`$arg' is not a valid libtool object"
-		fi
-	      fi
-	    done
-	  else
-	    func_fatal_error "link input file \`$arg' does not exist"
-	  fi
-	  arg=$save_arg
-	  prev=
-	  continue
-	  ;;
-	precious_regex)
-	  precious_files_regex="$arg"
-	  prev=
-	  continue
-	  ;;
-	release)
-	  release="-$arg"
-	  prev=
-	  continue
-	  ;;
-	rpath | xrpath)
-	  # We need an absolute path.
-	  case $arg in
-	  [\\/]* | [A-Za-z]:[\\/]*) ;;
-	  *)
-	    func_fatal_error "only absolute run-paths are allowed"
-	    ;;
-	  esac
-	  if test "$prev" = rpath; then
-	    case "$rpath " in
-	    *" $arg "*) ;;
-	    *) rpath="$rpath $arg" ;;
-	    esac
-	  else
-	    case "$xrpath " in
-	    *" $arg "*) ;;
-	    *) xrpath="$xrpath $arg" ;;
-	    esac
-	  fi
-	  prev=
-	  continue
-	  ;;
-	shrext)
-	  shrext_cmds="$arg"
-	  prev=
-	  continue
-	  ;;
-	weak)
-	  weak_libs="$weak_libs $arg"
-	  prev=
-	  continue
-	  ;;
-	xcclinker)
-	  linker_flags="$linker_flags $qarg"
-	  compiler_flags="$compiler_flags $qarg"
-	  prev=
-	  func_append compile_command " $qarg"
-	  func_append finalize_command " $qarg"
-	  continue
-	  ;;
-	xcompiler)
-	  compiler_flags="$compiler_flags $qarg"
-	  prev=
-	  func_append compile_command " $qarg"
-	  func_append finalize_command " $qarg"
-	  continue
-	  ;;
-	xlinker)
-	  linker_flags="$linker_flags $qarg"
-	  compiler_flags="$compiler_flags $wl$qarg"
-	  prev=
-	  func_append compile_command " $wl$qarg"
-	  func_append finalize_command " $wl$qarg"
-	  continue
-	  ;;
-	*)
-	  eval "$prev=\"\$arg\""
-	  prev=
-	  continue
-	  ;;
-	esac
-      fi # test -n "$prev"
-
-      prevarg="$arg"
-
-      case $arg in
-      -all-static)
-	if test -n "$link_static_flag"; then
-	  # See comment for -static flag below, for more details.
-	  func_append compile_command " $link_static_flag"
-	  func_append finalize_command " $link_static_flag"
-	fi
-	continue
-	;;
-
-      -allow-undefined)
-	# FIXME: remove this flag sometime in the future.
-	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
-	;;
-
-      -avoid-version)
-	avoid_version=yes
-	continue
-	;;
-
-      -dlopen)
-	prev=dlfiles
-	continue
-	;;
-
-      -dlpreopen)
-	prev=dlprefiles
-	continue
-	;;
-
-      -export-dynamic)
-	export_dynamic=yes
-	continue
-	;;
-
-      -export-symbols | -export-symbols-regex)
-	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
-	  func_fatal_error "more than one -exported-symbols argument is not allowed"
-	fi
-	if test "X$arg" = "X-export-symbols"; then
-	  prev=expsyms
-	else
-	  prev=expsyms_regex
-	fi
-	continue
-	;;
-
-      -framework)
-	prev=framework
-	continue
-	;;
-
-      -inst-prefix-dir)
-	prev=inst_prefix
-	continue
-	;;
-
-      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
-      # so, if we see these flags be careful not to treat them like -L
-      -L[A-Z][A-Z]*:*)
-	case $with_gcc/$host in
-	no/*-*-irix* | /*-*-irix*)
-	  func_append compile_command " $arg"
-	  func_append finalize_command " $arg"
-	  ;;
-	esac
-	continue
-	;;
-
-      -L*)
-	func_stripname '-L' '' "$arg"
-	dir=$func_stripname_result
-	if test -z "$dir"; then
-	  if test "$#" -gt 0; then
-	    func_fatal_error "require no space between \`-L' and \`$1'"
-	  else
-	    func_fatal_error "need path for \`-L' option"
-	  fi
-	fi
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	*)
-	  absdir=`cd "$dir" && pwd`
-	  test -z "$absdir" && \
-	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
-	  dir="$absdir"
-	  ;;
-	esac
-	case "$deplibs " in
-	*" -L$dir "*) ;;
-	*)
-	  deplibs="$deplibs -L$dir"
-	  lib_search_path="$lib_search_path $dir"
-	  ;;
-	esac
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-	  testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$dir:"*) ;;
-	  ::) dllsearchpath=$dir;;
-	  *) dllsearchpath="$dllsearchpath:$dir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  ::) dllsearchpath=$testbindir;;
-	  *) dllsearchpath="$dllsearchpath:$testbindir";;
-	  esac
-	  ;;
-	esac
-	continue
-	;;
-
-      -l*)
-	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*)
-	    # These systems don't actually have a C or math library (as such)
-	    continue
-	    ;;
-	  *-*-os2*)
-	    # These systems don't actually have a C library (as such)
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C and math libraries are in the System framework
-	    deplibs="$deplibs System.ltframework"
-	    continue
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    test "X$arg" = "X-lc" && continue
-	    ;;
-	  esac
-	elif test "X$arg" = "X-lc_r"; then
-	 case $host in
-	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	   # Do not include libc_r directly, use -pthread flag.
-	   continue
-	   ;;
-	 esac
-	fi
-	deplibs="$deplibs $arg"
-	continue
-	;;
-
-      -module)
-	module=yes
-	continue
-	;;
-
-      # Tru64 UNIX uses -model [arg] to determine the layout of C++
-      # classes, name mangling, and exception handling.
-      # Darwin uses the -arch flag to determine output architecture.
-      -model|-arch|-isysroot)
-	compiler_flags="$compiler_flags $arg"
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-	prev=xcompiler
-	continue
-	;;
-
-      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
-	compiler_flags="$compiler_flags $arg"
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-	case "$new_inherited_linker_flags " in
-	    *" $arg "*) ;;
-	    * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;;
-	esac
-	continue
-	;;
-
-      -multi_module)
-	single_module="${wl}-multi_module"
-	continue
-	;;
-
-      -no-fast-install)
-	fast_install=no
-	continue
-	;;
-
-      -no-install)
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
-	  # The PATH hackery in wrapper scripts is required on Windows
-	  # and Darwin in order for the loader to find any dlls it needs.
-	  func_warning "\`-no-install' is ignored for $host"
-	  func_warning "assuming \`-no-fast-install' instead"
-	  fast_install=no
-	  ;;
-	*) no_install=yes ;;
-	esac
-	continue
-	;;
-
-      -no-undefined)
-	allow_undefined=no
-	continue
-	;;
-
-      -objectlist)
-	prev=objectlist
-	continue
-	;;
-
-      -o) prev=output ;;
-
-      -precious-files-regex)
-	prev=precious_regex
-	continue
-	;;
-
-      -release)
-	prev=release
-	continue
-	;;
-
-      -rpath)
-	prev=rpath
-	continue
-	;;
-
-      -R)
-	prev=xrpath
-	continue
-	;;
-
-      -R*)
-	func_stripname '-R' '' "$arg"
-	dir=$func_stripname_result
-	# We need an absolute path.
-	case $dir in
-	[\\/]* | [A-Za-z]:[\\/]*) ;;
-	*)
-	  func_fatal_error "only absolute run-paths are allowed"
-	  ;;
-	esac
-	case "$xrpath " in
-	*" $dir "*) ;;
-	*) xrpath="$xrpath $dir" ;;
-	esac
-	continue
-	;;
-
-      -shared)
-	# The effects of -shared are defined in a previous loop.
-	continue
-	;;
-
-      -shrext)
-	prev=shrext
-	continue
-	;;
-
-      -static | -static-libtool-libs)
-	# The effects of -static are defined in a previous loop.
-	# We used to do the same as -all-static on platforms that
-	# didn't have a PIC flag, but the assumption that the effects
-	# would be equivalent was wrong.  It would break on at least
-	# Digital Unix and AIX.
-	continue
-	;;
-
-      -thread-safe)
-	thread_safe=yes
-	continue
-	;;
-
-      -version-info)
-	prev=vinfo
-	continue
-	;;
-
-      -version-number)
-	prev=vinfo
-	vinfo_number=yes
-	continue
-	;;
-
-      -weak)
-        prev=weak
-	continue
-	;;
-
-      -Wc,*)
-	func_stripname '-Wc,' '' "$arg"
-	args=$func_stripname_result
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-          func_quote_for_eval "$flag"
-	  arg="$arg $wl$func_quote_for_eval_result"
-	  compiler_flags="$compiler_flags $func_quote_for_eval_result"
-	done
-	IFS="$save_ifs"
-	func_stripname ' ' '' "$arg"
-	arg=$func_stripname_result
-	;;
-
-      -Wl,*)
-	func_stripname '-Wl,' '' "$arg"
-	args=$func_stripname_result
-	arg=
-	save_ifs="$IFS"; IFS=','
-	for flag in $args; do
-	  IFS="$save_ifs"
-          func_quote_for_eval "$flag"
-	  arg="$arg $wl$func_quote_for_eval_result"
-	  compiler_flags="$compiler_flags $wl$func_quote_for_eval_result"
-	  linker_flags="$linker_flags $func_quote_for_eval_result"
-	done
-	IFS="$save_ifs"
-	func_stripname ' ' '' "$arg"
-	arg=$func_stripname_result
-	;;
-
-      -Xcompiler)
-	prev=xcompiler
-	continue
-	;;
-
-      -Xlinker)
-	prev=xlinker
-	continue
-	;;
-
-      -XCClinker)
-	prev=xcclinker
-	continue
-	;;
-
-      # -msg_* for osf cc
-      -msg_*)
-	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-
-      # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
-      # -r[0-9][0-9]* specifies the processor on the SGI compiler
-      # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
-      # +DA*, +DD* enable 64-bit mode on the HP compiler
-      # -q* pass through compiler args for the IBM compiler
-      # -m*, -t[45]*, -txscale* pass through architecture-specific
-      # compiler args for GCC
-      # -F/path gives path to uninstalled frameworks, gcc on darwin
-      # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC
-      # @file GCC response files
-      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*)
-        func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-        func_append compile_command " $arg"
-        func_append finalize_command " $arg"
-        compiler_flags="$compiler_flags $arg"
-        continue
-        ;;
-
-      # Some other compiler flag.
-      -* | +*)
-        func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-
-      *.$objext)
-	# A standard object.
-	objs="$objs $arg"
-	;;
-
-      *.lo)
-	# A libtool-controlled object.
-
-	# Check to see that this really is a libtool object.
-	if func_lalib_unsafe_p "$arg"; then
-	  pic_object=
-	  non_pic_object=
-
-	  # Read the .lo file
-	  func_source "$arg"
-
-	  if test -z "$pic_object" ||
-	     test -z "$non_pic_object" ||
-	     test "$pic_object" = none &&
-	     test "$non_pic_object" = none; then
-	    func_fatal_error "cannot find name of object for \`$arg'"
-	  fi
-
-	  # Extract subdirectory from the argument.
-	  func_dirname "$arg" "/" ""
-	  xdir="$func_dirname_result"
-
-	  if test "$pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    pic_object="$xdir$pic_object"
-
-	    if test "$prev" = dlfiles; then
-	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
-		dlfiles="$dlfiles $pic_object"
-		prev=
-		continue
-	      else
-		# If libtool objects are unsupported, then we need to preload.
-		prev=dlprefiles
-	      fi
-	    fi
-
-	    # CHECK ME:  I think I busted this.  -Ossama
-	    if test "$prev" = dlprefiles; then
-	      # Preload the old-style object.
-	      dlprefiles="$dlprefiles $pic_object"
-	      prev=
-	    fi
-
-	    # A PIC object.
-	    func_append libobjs " $pic_object"
-	    arg="$pic_object"
-	  fi
-
-	  # Non-PIC object.
-	  if test "$non_pic_object" != none; then
-	    # Prepend the subdirectory the object is found in.
-	    non_pic_object="$xdir$non_pic_object"
-
-	    # A standard non-PIC object
-	    func_append non_pic_objects " $non_pic_object"
-	    if test -z "$pic_object" || test "$pic_object" = none ; then
-	      arg="$non_pic_object"
-	    fi
-	  else
-	    # If the PIC object exists, use it instead.
-	    # $xdir was prepended to $pic_object above.
-	    non_pic_object="$pic_object"
-	    func_append non_pic_objects " $non_pic_object"
-	  fi
-	else
-	  # Only an error if not doing a dry-run.
-	  if $opt_dry_run; then
-	    # Extract subdirectory from the argument.
-	    func_dirname "$arg" "/" ""
-	    xdir="$func_dirname_result"
-
-	    func_lo2o "$arg"
-	    pic_object=$xdir$objdir/$func_lo2o_result
-	    non_pic_object=$xdir$func_lo2o_result
-	    func_append libobjs " $pic_object"
-	    func_append non_pic_objects " $non_pic_object"
-	  else
-	    func_fatal_error "\`$arg' is not a valid libtool object"
-	  fi
-	fi
-	;;
-
-      *.$libext)
-	# An archive.
-	deplibs="$deplibs $arg"
-	old_deplibs="$old_deplibs $arg"
-	continue
-	;;
-
-      *.la)
-	# A libtool-controlled library.
-
-	if test "$prev" = dlfiles; then
-	  # This library was specified with -dlopen.
-	  dlfiles="$dlfiles $arg"
-	  prev=
-	elif test "$prev" = dlprefiles; then
-	  # The library was specified with -dlpreopen.
-	  dlprefiles="$dlprefiles $arg"
-	  prev=
-	else
-	  deplibs="$deplibs $arg"
-	fi
-	continue
-	;;
-
-      # Some other compiler argument.
-      *)
-	# Unknown arguments in both finalize_command and compile_command need
-	# to be aesthetically quoted because they are evaled later.
-	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
-	;;
-      esac # arg
-
-      # Now actually substitute the argument into the commands.
-      if test -n "$arg"; then
-	func_append compile_command " $arg"
-	func_append finalize_command " $arg"
-      fi
-    done # argument parsing loop
-
-    test -n "$prev" && \
-      func_fatal_help "the \`$prevarg' option requires an argument"
-
-    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
-      eval arg=\"$export_dynamic_flag_spec\"
-      func_append compile_command " $arg"
-      func_append finalize_command " $arg"
-    fi
-
-    oldlibs=
-    # calculate the name of the file, without its directory
-    func_basename "$output"
-    outputname="$func_basename_result"
-    libobjs_save="$libobjs"
-
-    if test -n "$shlibpath_var"; then
-      # get the directories listed in $shlibpath_var
-      eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
-    else
-      shlib_search_path=
-    fi
-    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
-    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
-
-    func_dirname "$output" "/" ""
-    output_objdir="$func_dirname_result$objdir"
-    # Create the object directory.
-    func_mkdir_p "$output_objdir"
-
-    # Determine the type of output
-    case $output in
-    "")
-      func_fatal_help "you must specify an output file"
-      ;;
-    *.$libext) linkmode=oldlib ;;
-    *.lo | *.$objext) linkmode=obj ;;
-    *.la) linkmode=lib ;;
-    *) linkmode=prog ;; # Anything else should be a program.
-    esac
-
-    specialdeplibs=
-
-    libs=
-    # Find all interdependent deplibs by searching for libraries
-    # that are linked more than once (e.g. -la -lb -la)
-    for deplib in $deplibs; do
-      if $opt_duplicate_deps ; then
-	case "$libs " in
-	*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	esac
-      fi
-      libs="$libs $deplib"
-    done
-
-    if test "$linkmode" = lib; then
-      libs="$predeps $libs $compiler_lib_search_path $postdeps"
-
-      # Compute libraries that are listed more than once in $predeps
-      # $postdeps and mark them as special (i.e., whose duplicates are
-      # not to be eliminated).
-      pre_post_deps=
-      if $opt_duplicate_compiler_generated_deps; then
-	for pre_post_dep in $predeps $postdeps; do
-	  case "$pre_post_deps " in
-	  *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
-	  esac
-	  pre_post_deps="$pre_post_deps $pre_post_dep"
-	done
-      fi
-      pre_post_deps=
-    fi
-
-    deplibs=
-    newdependency_libs=
-    newlib_search_path=
-    need_relink=no # whether we're linking any uninstalled libtool libraries
-    notinst_deplibs= # not-installed libtool libraries
-    notinst_path= # paths that contain not-installed libtool libraries
-
-    case $linkmode in
-    lib)
-	passes="conv dlpreopen link"
-	for file in $dlfiles $dlprefiles; do
-	  case $file in
-	  *.la) ;;
-	  *)
-	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
-	    ;;
-	  esac
-	done
-	;;
-    prog)
-	compile_deplibs=
-	finalize_deplibs=
-	alldeplibs=no
-	newdlfiles=
-	newdlprefiles=
-	passes="conv scan dlopen dlpreopen link"
-	;;
-    *)  passes="conv"
-	;;
-    esac
-
-    for pass in $passes; do
-      # The preopen pass in lib mode reverses $deplibs; put it back here
-      # so that -L comes before libs that need it for instance...
-      if test "$linkmode,$pass" = "lib,link"; then
-	## FIXME: Find the place where the list is rebuilt in the wrong
-	##        order, and fix it there properly
-        tmp_deplibs=
-	for deplib in $deplibs; do
-	  tmp_deplibs="$deplib $tmp_deplibs"
-	done
-	deplibs="$tmp_deplibs"
-      fi
-
-      if test "$linkmode,$pass" = "lib,link" ||
-	 test "$linkmode,$pass" = "prog,scan"; then
-	libs="$deplibs"
-	deplibs=
-      fi
-      if test "$linkmode" = prog; then
-	case $pass in
-	dlopen) libs="$dlfiles" ;;
-	dlpreopen) libs="$dlprefiles" ;;
-	link)
-	  libs="$deplibs %DEPLIBS%"
-	  test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
-	  ;;
-	esac
-      fi
-      if test "$linkmode,$pass" = "lib,dlpreopen"; then
-	# Collect and forward deplibs of preopened libtool libs
-	for lib in $dlprefiles; do
-	  # Ignore non-libtool-libs
-	  dependency_libs=
-	  case $lib in
-	  *.la)	func_source "$lib" ;;
-	  esac
-
-	  # Collect preopened libtool deplibs, except any this library
-	  # has declared as weak libs
-	  for deplib in $dependency_libs; do
-            deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"`
-	    case " $weak_libs " in
-	    *" $deplib_base "*) ;;
-	    *) deplibs="$deplibs $deplib" ;;
-	    esac
-	  done
-	done
-	libs="$dlprefiles"
-      fi
-      if test "$pass" = dlopen; then
-	# Collect dlpreopened libraries
-	save_deplibs="$deplibs"
-	deplibs=
-      fi
-
-      for deplib in $libs; do
-	lib=
-	found=no
-	case $deplib in
-	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
-	  if test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$deplib $compile_deplibs"
-	    finalize_deplibs="$deplib $finalize_deplibs"
-	  else
-	    compiler_flags="$compiler_flags $deplib"
-	    if test "$linkmode" = lib ; then
-		case "$new_inherited_linker_flags " in
-		    *" $deplib "*) ;;
-		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
-		esac
-	    fi
-	  fi
-	  continue
-	  ;;
-	-l*)
-	  if test "$linkmode" != lib && test "$linkmode" != prog; then
-	    func_warning "\`-l' is ignored for archives/objects"
-	    continue
-	  fi
-	  func_stripname '-l' '' "$deplib"
-	  name=$func_stripname_result
-	  if test "$linkmode" = lib; then
-	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
-	  else
-	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
-	  fi
-	  for searchdir in $searchdirs; do
-	    for search_ext in .la $std_shrext .so .a; do
-	      # Search the libtool library
-	      lib="$searchdir/lib${name}${search_ext}"
-	      if test -f "$lib"; then
-		if test "$search_ext" = ".la"; then
-		  found=yes
-		else
-		  found=no
-		fi
-		break 2
-	      fi
-	    done
-	  done
-	  if test "$found" != yes; then
-	    # deplib doesn't seem to be a libtool library
-	    if test "$linkmode,$pass" = "prog,link"; then
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      deplibs="$deplib $deplibs"
-	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    continue
-	  else # deplib is a libtool library
-	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
-	    # We need to do some special things here, and not later.
-	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	      case " $predeps $postdeps " in
-	      *" $deplib "*)
-		if func_lalib_p "$lib"; then
-		  library_names=
-		  old_library=
-		  func_source "$lib"
-		  for l in $old_library $library_names; do
-		    ll="$l"
-		  done
-		  if test "X$ll" = "X$old_library" ; then # only static version available
-		    found=no
-		    func_dirname "$lib" "" "."
-		    ladir="$func_dirname_result"
-		    lib=$ladir/$old_library
-		    if test "$linkmode,$pass" = "prog,link"; then
-		      compile_deplibs="$deplib $compile_deplibs"
-		      finalize_deplibs="$deplib $finalize_deplibs"
-		    else
-		      deplibs="$deplib $deplibs"
-		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-		    fi
-		    continue
-		  fi
-		fi
-		;;
-	      *) ;;
-	      esac
-	    fi
-	  fi
-	  ;; # -l
-	*.ltframework)
-	  if test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$deplib $compile_deplibs"
-	    finalize_deplibs="$deplib $finalize_deplibs"
-	  else
-	    deplibs="$deplib $deplibs"
-	    if test "$linkmode" = lib ; then
-		case "$new_inherited_linker_flags " in
-		    *" $deplib "*) ;;
-		    * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
-		esac
-	    fi
-	  fi
-	  continue
-	  ;;
-	-L*)
-	  case $linkmode in
-	  lib)
-	    deplibs="$deplib $deplibs"
-	    test "$pass" = conv && continue
-	    newdependency_libs="$deplib $newdependency_libs"
-	    func_stripname '-L' '' "$deplib"
-	    newlib_search_path="$newlib_search_path $func_stripname_result"
-	    ;;
-	  prog)
-	    if test "$pass" = conv; then
-	      deplibs="$deplib $deplibs"
-	      continue
-	    fi
-	    if test "$pass" = scan; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    func_stripname '-L' '' "$deplib"
-	    newlib_search_path="$newlib_search_path $func_stripname_result"
-	    ;;
-	  *)
-	    func_warning "\`-L' is ignored for archives/objects"
-	    ;;
-	  esac # linkmode
-	  continue
-	  ;; # -L
-	-R*)
-	  if test "$pass" = link; then
-	    func_stripname '-R' '' "$deplib"
-	    dir=$func_stripname_result
-	    # Make sure the xrpath contains only unique directories.
-	    case "$xrpath " in
-	    *" $dir "*) ;;
-	    *) xrpath="$xrpath $dir" ;;
-	    esac
-	  fi
-	  deplibs="$deplib $deplibs"
-	  continue
-	  ;;
-	*.la) lib="$deplib" ;;
-	*.$libext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	    continue
-	  fi
-	  case $linkmode in
-	  lib)
-	    # Linking convenience modules into shared libraries is allowed,
-	    # but linking other static libraries is non-portable.
-	    case " $dlpreconveniencelibs " in
-	    *" $deplib "*) ;;
-	    *)
-	      valid_a_lib=no
-	      case $deplibs_check_method in
-		match_pattern*)
-		  set dummy $deplibs_check_method; shift
-		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-		  if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \
-		    | $EGREP "$match_pattern_regex" > /dev/null; then
-		    valid_a_lib=yes
-		  fi
-		;;
-		pass_all)
-		  valid_a_lib=yes
-		;;
-	      esac
-	      if test "$valid_a_lib" != yes; then
-		$ECHO
-		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
-		$ECHO "*** I have the capability to make that library automatically link in when"
-		$ECHO "*** you link to this library.  But I can only do this if you have a"
-		$ECHO "*** shared version of the library, which you do not appear to have"
-		$ECHO "*** because the file extensions .$libext of this argument makes me believe"
-		$ECHO "*** that it is just a static archive that I should not use here."
-	      else
-		$ECHO
-		$ECHO "*** Warning: Linking the shared library $output against the"
-		$ECHO "*** static library $deplib is not portable!"
-		deplibs="$deplib $deplibs"
-	      fi
-	      ;;
-	    esac
-	    continue
-	    ;;
-	  prog)
-	    if test "$pass" != link; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    fi
-	    continue
-	    ;;
-	  esac # linkmode
-	  ;; # *.$libext
-	*.lo | *.$objext)
-	  if test "$pass" = conv; then
-	    deplibs="$deplib $deplibs"
-	  elif test "$linkmode" = prog; then
-	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
-	      # If there is no dlopen support or we're linking statically,
-	      # we need to preload.
-	      newdlprefiles="$newdlprefiles $deplib"
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      newdlfiles="$newdlfiles $deplib"
-	    fi
-	  fi
-	  continue
-	  ;;
-	%DEPLIBS%)
-	  alldeplibs=yes
-	  continue
-	  ;;
-	esac # case $deplib
-
-	if test "$found" = yes || test -f "$lib"; then :
-	else
-	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
-	fi
-
-	# Check to see that this really is a libtool archive.
-	func_lalib_unsafe_p "$lib" \
-	  || func_fatal_error "\`$lib' is not a valid libtool archive"
-
-	func_dirname "$lib" "" "."
-	ladir="$func_dirname_result"
-
-	dlname=
-	dlopen=
-	dlpreopen=
-	libdir=
-	library_names=
-	old_library=
-	inherited_linker_flags=
-	# If the library was installed with an old release of libtool,
-	# it will not redefine variables installed, or shouldnotlink
-	installed=yes
-	shouldnotlink=no
-	avoidtemprpath=
-
-
-	# Read the .la file
-	func_source "$lib"
-
-	# Convert "-framework foo" to "foo.ltframework"
-	if test -n "$inherited_linker_flags"; then
-	  tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'`
-	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
-	    case " $new_inherited_linker_flags " in
-	      *" $tmp_inherited_linker_flag "*) ;;
-	      *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";;
-	    esac
-	  done
-	fi
-	dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-	if test "$linkmode,$pass" = "lib,link" ||
-	   test "$linkmode,$pass" = "prog,scan" ||
-	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
-	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
-	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
-	fi
-
-	if test "$pass" = conv; then
-	  # Only check for convenience libraries
-	  deplibs="$lib $deplibs"
-	  if test -z "$libdir"; then
-	    if test -z "$old_library"; then
-	      func_fatal_error "cannot find name of link library for \`$lib'"
-	    fi
-	    # It is a libtool convenience library, so add in its objects.
-	    convenience="$convenience $ladir/$objdir/$old_library"
-	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
-	    tmp_libs=
-	    for deplib in $dependency_libs; do
-	      deplibs="$deplib $deplibs"
-	      if $opt_duplicate_deps ; then
-		case "$tmp_libs " in
-		*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-		esac
-	      fi
-	      tmp_libs="$tmp_libs $deplib"
-	    done
-	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
-	    func_fatal_error "\`$lib' is not a convenience library"
-	  fi
-	  continue
-	fi # $pass = conv
-
-
-	# Get the name of the library we link against.
-	linklib=
-	for l in $old_library $library_names; do
-	  linklib="$l"
-	done
-	if test -z "$linklib"; then
-	  func_fatal_error "cannot find name of link library for \`$lib'"
-	fi
-
-	# This library was specified with -dlopen.
-	if test "$pass" = dlopen; then
-	  if test -z "$libdir"; then
-	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
-	  fi
-	  if test -z "$dlname" ||
-	     test "$dlopen_support" != yes ||
-	     test "$build_libtool_libs" = no; then
-	    # If there is no dlname, no dlopen support or we're linking
-	    # statically, we need to preload.  We also need to preload any
-	    # dependent libraries so libltdl's deplib preloader doesn't
-	    # bomb out in the load deplibs phase.
-	    dlprefiles="$dlprefiles $lib $dependency_libs"
-	  else
-	    newdlfiles="$newdlfiles $lib"
-	  fi
-	  continue
-	fi # $pass = dlopen
-
-	# We need an absolute path.
-	case $ladir in
-	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
-	*)
-	  abs_ladir=`cd "$ladir" && pwd`
-	  if test -z "$abs_ladir"; then
-	    func_warning "cannot determine absolute directory name of \`$ladir'"
-	    func_warning "passing it literally to the linker, although it might fail"
-	    abs_ladir="$ladir"
-	  fi
-	  ;;
-	esac
-	func_basename "$lib"
-	laname="$func_basename_result"
-
-	# Find the relevant object directory and library name.
-	if test "X$installed" = Xyes; then
-	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    func_warning "library \`$lib' was moved."
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    libdir="$abs_ladir"
-	  else
-	    dir="$libdir"
-	    absdir="$libdir"
-	  fi
-	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
-	else
-	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    # Remove this search path later
-	    notinst_path="$notinst_path $abs_ladir"
-	  else
-	    dir="$ladir/$objdir"
-	    absdir="$abs_ladir/$objdir"
-	    # Remove this search path later
-	    notinst_path="$notinst_path $abs_ladir"
-	  fi
-	fi # $installed = yes
-	func_stripname 'lib' '.la' "$laname"
-	name=$func_stripname_result
-
-	# This library was specified with -dlpreopen.
-	if test "$pass" = dlpreopen; then
-	  if test -z "$libdir" && test "$linkmode" = prog; then
-	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
-	  fi
-	  # Prefer using a static library (so that no silly _DYNAMIC symbols
-	  # are required to link).
-	  if test -n "$old_library"; then
-	    newdlprefiles="$newdlprefiles $dir/$old_library"
-	    # Keep a list of preopened convenience libraries to check
-	    # that they are being used correctly in the link pass.
-	    test -z "$libdir" && \
-		dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library"
-	  # Otherwise, use the dlname, so that lt_dlopen finds it.
-	  elif test -n "$dlname"; then
-	    newdlprefiles="$newdlprefiles $dir/$dlname"
-	  else
-	    newdlprefiles="$newdlprefiles $dir/$linklib"
-	  fi
-	fi # $pass = dlpreopen
-
-	if test -z "$libdir"; then
-	  # Link the convenience library
-	  if test "$linkmode" = lib; then
-	    deplibs="$dir/$old_library $deplibs"
-	  elif test "$linkmode,$pass" = "prog,link"; then
-	    compile_deplibs="$dir/$old_library $compile_deplibs"
-	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
-	  else
-	    deplibs="$lib $deplibs" # used for prog,scan pass
-	  fi
-	  continue
-	fi
-
-
-	if test "$linkmode" = prog && test "$pass" != link; then
-	  newlib_search_path="$newlib_search_path $ladir"
-	  deplibs="$lib $deplibs"
-
-	  linkalldeplibs=no
-	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
-	     test "$build_libtool_libs" = no; then
-	    linkalldeplibs=yes
-	  fi
-
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    case $deplib in
-	    -L*) func_stripname '-L' '' "$deplib"
-	         newlib_search_path="$newlib_search_path $func_stripname_result"
-		 ;;
-	    esac
-	    # Need to link against all dependency_libs?
-	    if test "$linkalldeplibs" = yes; then
-	      deplibs="$deplib $deplibs"
-	    else
-	      # Need to hardcode shared library paths
-	      # or/and link against static libraries
-	      newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    if $opt_duplicate_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
-	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done # for deplib
-	  continue
-	fi # $linkmode = prog...
-
-	if test "$linkmode,$pass" = "prog,link"; then
-	  if test -n "$library_names" &&
-	     { { test "$prefer_static_libs" = no ||
-	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
-	       test -z "$old_library"; }; then
-	    # We need to hardcode the library path
-	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
-	      # Make sure the rpath contains only unique directories.
-	      case "$temp_rpath:" in
-	      *"$absdir:"*) ;;
-	      *) temp_rpath="$temp_rpath$absdir:" ;;
-	      esac
-	    fi
-
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) compile_rpath="$compile_rpath $absdir"
-	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) finalize_rpath="$finalize_rpath $libdir"
-	      esac
-	      ;;
-	    esac
-	  fi # $linkmode,$pass = prog,link...
-
-	  if test "$alldeplibs" = yes &&
-	     { test "$deplibs_check_method" = pass_all ||
-	       { test "$build_libtool_libs" = yes &&
-		 test -n "$library_names"; }; }; then
-	    # We only need to search for static libraries
-	    continue
-	  fi
-	fi
-
-	link_static=no # Whether the deplib will be linked statically
-	use_static_libs=$prefer_static_libs
-	if test "$use_static_libs" = built && test "$installed" = yes; then
-	  use_static_libs=no
-	fi
-	if test -n "$library_names" &&
-	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
-	  case $host in
-	  *cygwin* | *mingw* | *cegcc*)
-	      # No point in relinking DLLs because paths are not encoded
-	      notinst_deplibs="$notinst_deplibs $lib"
-	      need_relink=no
-	    ;;
-	  *)
-	    if test "$installed" = no; then
-	      notinst_deplibs="$notinst_deplibs $lib"
-	      need_relink=yes
-	    fi
-	    ;;
-	  esac
-	  # This is a shared library
-
-	  # Warn about portability, can't link against -module's on some
-	  # systems (darwin).  Don't bleat about dlopened modules though!
-	  dlopenmodule=""
-	  for dlpremoduletest in $dlprefiles; do
-	    if test "X$dlpremoduletest" = "X$lib"; then
-	      dlopenmodule="$dlpremoduletest"
-	      break
-	    fi
-	  done
-	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
-	    $ECHO
-	    if test "$linkmode" = prog; then
-	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
-	    else
-	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
-	    fi
-	    $ECHO "*** $linklib is not portable!"
-	  fi
-	  if test "$linkmode" = lib &&
-	     test "$hardcode_into_libs" = yes; then
-	    # Hardcode the library path.
-	    # Skip directories that are in the system default run-time
-	    # search path.
-	    case " $sys_lib_dlsearch_path " in
-	    *" $absdir "*) ;;
-	    *)
-	      case "$compile_rpath " in
-	      *" $absdir "*) ;;
-	      *) compile_rpath="$compile_rpath $absdir"
-	      esac
-	      ;;
-	    esac
-	    case " $sys_lib_dlsearch_path " in
-	    *" $libdir "*) ;;
-	    *)
-	      case "$finalize_rpath " in
-	      *" $libdir "*) ;;
-	      *) finalize_rpath="$finalize_rpath $libdir"
-	      esac
-	      ;;
-	    esac
-	  fi
-
-	  if test -n "$old_archive_from_expsyms_cmds"; then
-	    # figure out the soname
-	    set dummy $library_names
-	    shift
-	    realname="$1"
-	    shift
-	    libname=`eval "\\$ECHO \"$libname_spec\""`
-	    # use dlname if we got it. it's perfectly good, no?
-	    if test -n "$dlname"; then
-	      soname="$dlname"
-	    elif test -n "$soname_spec"; then
-	      # bleh windows
-	      case $host in
-	      *cygwin* | mingw* | *cegcc*)
-	        func_arith $current - $age
-		major=$func_arith_result
-		versuffix="-$major"
-		;;
-	      esac
-	      eval soname=\"$soname_spec\"
-	    else
-	      soname="$realname"
-	    fi
-
-	    # Make a new name for the extract_expsyms_cmds to use
-	    soroot="$soname"
-	    func_basename "$soroot"
-	    soname="$func_basename_result"
-	    func_stripname 'lib' '.dll' "$soname"
-	    newlib=libimp-$func_stripname_result.a
-
-	    # If the library has no export list, then create one now
-	    if test -f "$output_objdir/$soname-def"; then :
-	    else
-	      func_verbose "extracting exported symbol list from \`$soname'"
-	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
-	    fi
-
-	    # Create $newlib
-	    if test -f "$output_objdir/$newlib"; then :; else
-	      func_verbose "generating import library for \`$soname'"
-	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
-	    fi
-	    # make sure the library variables are pointing to the new library
-	    dir=$output_objdir
-	    linklib=$newlib
-	  fi # test -n "$old_archive_from_expsyms_cmds"
-
-	  if test "$linkmode" = prog || test "$mode" != relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    lib_linked=yes
-	    case $hardcode_action in
-	    immediate | unsupported)
-	      if test "$hardcode_direct" = no; then
-		add="$dir/$linklib"
-		case $host in
-		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
-		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
-		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
-		    *-*-unixware7*) add_dir="-L$dir" ;;
-		  *-*-darwin* )
-		    # if the lib is a (non-dlopened) module then we can not
-		    # link against it, someone is ignoring the earlier warnings
-		    if /usr/bin/file -L $add 2> /dev/null |
-			 $GREP ": [^:]* bundle" >/dev/null ; then
-		      if test "X$dlopenmodule" != "X$lib"; then
-			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
-			if test -z "$old_library" ; then
-			  $ECHO
-			  $ECHO "*** And there doesn't seem to be a static archive available"
-			  $ECHO "*** The link will probably fail, sorry"
-			else
-			  add="$dir/$old_library"
-			fi
-		      elif test -n "$old_library"; then
-			add="$dir/$old_library"
-		      fi
-		    fi
-		esac
-	      elif test "$hardcode_minus_L" = no; then
-		case $host in
-		*-*-sunos*) add_shlibpath="$dir" ;;
-		esac
-		add_dir="-L$dir"
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = no; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    relink)
-	      if test "$hardcode_direct" = yes &&
-	         test "$hardcode_direct_absolute" = no; then
-		add="$dir/$linklib"
-	      elif test "$hardcode_minus_L" = yes; then
-		add_dir="-L$dir"
-		# Try looking first in the location we're being installed to.
-		if test -n "$inst_prefix_dir"; then
-		  case $libdir in
-		    [\\/]*)
-		      add_dir="$add_dir -L$inst_prefix_dir$libdir"
-		      ;;
-		  esac
-		fi
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = yes; then
-		add_shlibpath="$dir"
-		add="-l$name"
-	      else
-		lib_linked=no
-	      fi
-	      ;;
-	    *) lib_linked=no ;;
-	    esac
-
-	    if test "$lib_linked" != yes; then
-	      func_fatal_configuration "unsupported hardcode properties"
-	    fi
-
-	    if test -n "$add_shlibpath"; then
-	      case :$compile_shlibpath: in
-	      *":$add_shlibpath:"*) ;;
-	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
-	      esac
-	    fi
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
-	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	      if test "$hardcode_direct" != yes &&
-		 test "$hardcode_minus_L" != yes &&
-		 test "$hardcode_shlibpath_var" = yes; then
-		case :$finalize_shlibpath: in
-		*":$libdir:"*) ;;
-		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
-		esac
-	      fi
-	    fi
-	  fi
-
-	  if test "$linkmode" = prog || test "$mode" = relink; then
-	    add_shlibpath=
-	    add_dir=
-	    add=
-	    # Finalize command for both is simple: just hardcode it.
-	    if test "$hardcode_direct" = yes &&
-	       test "$hardcode_direct_absolute" = no; then
-	      add="$libdir/$linklib"
-	    elif test "$hardcode_minus_L" = yes; then
-	      add_dir="-L$libdir"
-	      add="-l$name"
-	    elif test "$hardcode_shlibpath_var" = yes; then
-	      case :$finalize_shlibpath: in
-	      *":$libdir:"*) ;;
-	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
-	      esac
-	      add="-l$name"
-	    elif test "$hardcode_automatic" = yes; then
-	      if test -n "$inst_prefix_dir" &&
-		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
-		add="$inst_prefix_dir$libdir/$linklib"
-	      else
-		add="$libdir/$linklib"
-	      fi
-	    else
-	      # We cannot seem to hardcode it, guess we'll fake it.
-	      add_dir="-L$libdir"
-	      # Try looking first in the location we're being installed to.
-	      if test -n "$inst_prefix_dir"; then
-		case $libdir in
-		  [\\/]*)
-		    add_dir="$add_dir -L$inst_prefix_dir$libdir"
-		    ;;
-		esac
-	      fi
-	      add="-l$name"
-	    fi
-
-	    if test "$linkmode" = prog; then
-	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
-	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
-	    else
-	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
-	      test -n "$add" && deplibs="$add $deplibs"
-	    fi
-	  fi
-	elif test "$linkmode" = prog; then
-	  # Here we assume that one of hardcode_direct or hardcode_minus_L
-	  # is not unsupported.  This is valid on all known static and
-	  # shared platforms.
-	  if test "$hardcode_direct" != unsupported; then
-	    test -n "$old_library" && linklib="$old_library"
-	    compile_deplibs="$dir/$linklib $compile_deplibs"
-	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
-	  else
-	    compile_deplibs="-l$name -L$dir $compile_deplibs"
-	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
-	  fi
-	elif test "$build_libtool_libs" = yes; then
-	  # Not a shared library
-	  if test "$deplibs_check_method" != pass_all; then
-	    # We're trying link a shared library against a static one
-	    # but the system doesn't support it.
-
-	    # Just print a warning and add the library to dependency_libs so
-	    # that the program can be linked against the static library.
-	    $ECHO
-	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
-	    $ECHO "*** I have the capability to make that library automatically link in when"
-	    $ECHO "*** you link to this library.  But I can only do this if you have a"
-	    $ECHO "*** shared version of the library, which you do not appear to have."
-	    if test "$module" = yes; then
-	      $ECHO "*** But as you try to build a module library, libtool will still create "
-	      $ECHO "*** a static module, that should work as long as the dlopening application"
-	      $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime."
-	      if test -z "$global_symbol_pipe"; then
-		$ECHO
-		$ECHO "*** However, this would only work if libtool was able to extract symbol"
-		$ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
-		$ECHO "*** not find such a program.  So, this module is probably useless."
-		$ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
-	      fi
-	      if test "$build_old_libs" = no; then
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
-	  else
-	    deplibs="$dir/$old_library $deplibs"
-	    link_static=yes
-	  fi
-	fi # link shared/static library?
-
-	if test "$linkmode" = lib; then
-	  if test -n "$dependency_libs" &&
-	     { test "$hardcode_into_libs" != yes ||
-	       test "$build_old_libs" = yes ||
-	       test "$link_static" = yes; }; then
-	    # Extract -R from dependency_libs
-	    temp_deplibs=
-	    for libdir in $dependency_libs; do
-	      case $libdir in
-	      -R*) func_stripname '-R' '' "$libdir"
-	           temp_xrpath=$func_stripname_result
-		   case " $xrpath " in
-		   *" $temp_xrpath "*) ;;
-		   *) xrpath="$xrpath $temp_xrpath";;
-		   esac;;
-	      *) temp_deplibs="$temp_deplibs $libdir";;
-	      esac
-	    done
-	    dependency_libs="$temp_deplibs"
-	  fi
-
-	  newlib_search_path="$newlib_search_path $absdir"
-	  # Link against this library
-	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
-	  # ... and its dependency_libs
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    newdependency_libs="$deplib $newdependency_libs"
-	    if $opt_duplicate_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
-	      esac
-	    fi
-	    tmp_libs="$tmp_libs $deplib"
-	  done
-
-	  if test "$link_all_deplibs" != no; then
-	    # Add the search paths of all dependency libraries
-	    for deplib in $dependency_libs; do
-	      path=
-	      case $deplib in
-	      -L*) path="$deplib" ;;
-	      *.la)
-	        func_dirname "$deplib" "" "."
-		dir="$func_dirname_result"
-		# We need an absolute path.
-		case $dir in
-		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
-		*)
-		  absdir=`cd "$dir" && pwd`
-		  if test -z "$absdir"; then
-		    func_warning "cannot determine absolute directory name of \`$dir'"
-		    absdir="$dir"
-		  fi
-		  ;;
-		esac
-		if $GREP "^installed=no" $deplib > /dev/null; then
-		case $host in
-		*-*-darwin*)
-		  depdepl=
-		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
-		  if test -n "$deplibrary_names" ; then
-		    for tmp in $deplibrary_names ; do
-		      depdepl=$tmp
-		    done
-		    if test -f "$absdir/$objdir/$depdepl" ; then
-		      depdepl="$absdir/$objdir/$depdepl"
-		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
-                      if test -z "$darwin_install_name"; then
-                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
-                      fi
-		      compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
-		      linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}"
-		      path=
-		    fi
-		  fi
-		  ;;
-		*)
-		  path="-L$absdir/$objdir"
-		  ;;
-		esac
-		else
-		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		  test -z "$libdir" && \
-		    func_fatal_error "\`$deplib' is not a valid libtool archive"
-		  test "$absdir" != "$libdir" && \
-		    func_warning "\`$deplib' seems to be moved"
-
-		  path="-L$absdir"
-		fi
-		;;
-	      esac
-	      case " $deplibs " in
-	      *" $path "*) ;;
-	      *) deplibs="$path $deplibs" ;;
-	      esac
-	    done
-	  fi # link_all_deplibs != no
-	fi # linkmode = lib
-      done # for deplib in $libs
-      if test "$pass" = link; then
-	if test "$linkmode" = "prog"; then
-	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
-	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
-	else
-	  compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-	fi
-      fi
-      dependency_libs="$newdependency_libs"
-      if test "$pass" = dlpreopen; then
-	# Link the dlpreopened libraries before other libraries
-	for deplib in $save_deplibs; do
-	  deplibs="$deplib $deplibs"
-	done
-      fi
-      if test "$pass" != dlopen; then
-	if test "$pass" != conv; then
-	  # Make sure lib_search_path contains only unique directories.
-	  lib_search_path=
-	  for dir in $newlib_search_path; do
-	    case "$lib_search_path " in
-	    *" $dir "*) ;;
-	    *) lib_search_path="$lib_search_path $dir" ;;
-	    esac
-	  done
-	  newlib_search_path=
-	fi
-
-	if test "$linkmode,$pass" != "prog,link"; then
-	  vars="deplibs"
-	else
-	  vars="compile_deplibs finalize_deplibs"
-	fi
-	for var in $vars dependency_libs; do
-	  # Add libraries to $var in reverse order
-	  eval tmp_libs=\"\$$var\"
-	  new_libs=
-	  for deplib in $tmp_libs; do
-	    # FIXME: Pedantically, this is the right thing to do, so
-	    #        that some nasty dependency loop isn't accidentally
-	    #        broken:
-	    #new_libs="$deplib $new_libs"
-	    # Pragmatically, this seems to cause very few problems in
-	    # practice:
-	    case $deplib in
-	    -L*) new_libs="$deplib $new_libs" ;;
-	    -R*) ;;
-	    *)
-	      # And here is the reason: when a library appears more
-	      # than once as an explicit dependence of a library, or
-	      # is implicitly linked in more than once by the
-	      # compiler, it is considered special, and multiple
-	      # occurrences thereof are not removed.  Compare this
-	      # with having the same library being listed as a
-	      # dependency of multiple other libraries: in this case,
-	      # we know (pedantically, we assume) the library does not
-	      # need to be listed more than once, so we keep only the
-	      # last copy.  This is not always right, but it is rare
-	      # enough that we require users that really mean to play
-	      # such unportable linking tricks to link the library
-	      # using -Wl,-lname, so that libtool does not consider it
-	      # for duplicate removal.
-	      case " $specialdeplibs " in
-	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
-	      *)
-		case " $new_libs " in
-		*" $deplib "*) ;;
-		*) new_libs="$deplib $new_libs" ;;
-		esac
-		;;
-	      esac
-	      ;;
-	    esac
-	  done
-	  tmp_libs=
-	  for deplib in $new_libs; do
-	    case $deplib in
-	    -L*)
-	      case " $tmp_libs " in
-	      *" $deplib "*) ;;
-	      *) tmp_libs="$tmp_libs $deplib" ;;
-	      esac
-	      ;;
-	    *) tmp_libs="$tmp_libs $deplib" ;;
-	    esac
-	  done
-	  eval $var=\"$tmp_libs\"
-	done # for var
-      fi
-      # Last step: remove runtime libs from dependency_libs
-      # (they stay in deplibs)
-      tmp_libs=
-      for i in $dependency_libs ; do
-	case " $predeps $postdeps $compiler_lib_search_path " in
-	*" $i "*)
-	  i=""
-	  ;;
-	esac
-	if test -n "$i" ; then
-	  tmp_libs="$tmp_libs $i"
-	fi
-      done
-      dependency_libs=$tmp_libs
-    done # for pass
-    if test "$linkmode" = prog; then
-      dlfiles="$newdlfiles"
-    fi
-    if test "$linkmode" = prog || test "$linkmode" = lib; then
-      dlprefiles="$newdlprefiles"
-    fi
-
-    case $linkmode in
-    oldlib)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for archives"
-      fi
-
-      case " $deplibs" in
-      *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for archives" ;;
-      esac
-
-      test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for archives"
-
-      test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for archives"
-
-      test -n "$vinfo" && \
-	func_warning "\`-version-info/-version-number' is ignored for archives"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for archives"
-
-      test -n "$export_symbols$export_symbols_regex" && \
-	func_warning "\`-export-symbols' is ignored for archives"
-
-      # Now set the variables for building old libraries.
-      build_libtool_libs=no
-      oldlibs="$output"
-      objs="$objs$old_deplibs"
-      ;;
-
-    lib)
-      # Make sure we only generate libraries of the form `libNAME.la'.
-      case $outputname in
-      lib*)
-	func_stripname 'lib' '.la' "$outputname"
-	name=$func_stripname_result
-	eval shared_ext=\"$shrext_cmds\"
-	eval libname=\"$libname_spec\"
-	;;
-      *)
-	test "$module" = no && \
-	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
-
-	if test "$need_lib_prefix" != no; then
-	  # Add the "lib" prefix for modules if required
-	  func_stripname '' '.la' "$outputname"
-	  name=$func_stripname_result
-	  eval shared_ext=\"$shrext_cmds\"
-	  eval libname=\"$libname_spec\"
-	else
-	  func_stripname '' '.la' "$outputname"
-	  libname=$func_stripname_result
-	fi
-	;;
-      esac
-
-      if test -n "$objs"; then
-	if test "$deplibs_check_method" != pass_all; then
-	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
-	else
-	  $ECHO
-	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
-	  $ECHO "*** objects $objs is not portable!"
-	  libobjs="$libobjs $objs"
-	fi
-      fi
-
-      test "$dlself" != no && \
-	func_warning "\`-dlopen self' is ignored for libtool libraries"
-
-      set dummy $rpath
-      shift
-      test "$#" -gt 1 && \
-	func_warning "ignoring multiple \`-rpath's for a libtool library"
-
-      install_libdir="$1"
-
-      oldlibs=
-      if test -z "$rpath"; then
-	if test "$build_libtool_libs" = yes; then
-	  # Building a libtool convenience library.
-	  # Some compilers have problems with a `.al' extension so
-	  # convenience libraries should have the same extension an
-	  # archive normally would.
-	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
-	  build_libtool_libs=convenience
-	  build_old_libs=yes
-	fi
-
-	test -n "$vinfo" && \
-	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
-
-	test -n "$release" && \
-	  func_warning "\`-release' is ignored for convenience libraries"
-      else
-
-	# Parse the version information argument.
-	save_ifs="$IFS"; IFS=':'
-	set dummy $vinfo 0 0 0
-	shift
-	IFS="$save_ifs"
-
-	test -n "$7" && \
-	  func_fatal_help "too many parameters to \`-version-info'"
-
-	# convert absolute version numbers to libtool ages
-	# this retains compatibility with .la files and attempts
-	# to make the code below a bit more comprehensible
-
-	case $vinfo_number in
-	yes)
-	  number_major="$1"
-	  number_minor="$2"
-	  number_revision="$3"
-	  #
-	  # There are really only two kinds -- those that
-	  # use the current revision as the major version
-	  # and those that subtract age and use age as
-	  # a minor version.  But, then there is irix
-	  # which has an extra 1 added just for fun
-	  #
-	  case $version_type in
-	  darwin|linux|osf|windows|none)
-	    func_arith $number_major + $number_minor
-	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_revision"
-	    ;;
-	  freebsd-aout|freebsd-elf|sunos)
-	    current="$number_major"
-	    revision="$number_minor"
-	    age="0"
-	    ;;
-	  irix|nonstopux)
-	    func_arith $number_major + $number_minor
-	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_minor"
-	    lt_irix_increment=no
-	    ;;
-	  *)
-	    func_fatal_configuration "$modename: unknown library version type \`$version_type'"
-	    ;;
-	  esac
-	  ;;
-	no)
-	  current="$1"
-	  revision="$2"
-	  age="$3"
-	  ;;
-	esac
-
-	# Check that each of the things are valid numbers.
-	case $current in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "CURRENT \`$current' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	case $revision in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "REVISION \`$revision' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	case $age in
-	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
-	*)
-	  func_error "AGE \`$age' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	  ;;
-	esac
-
-	if test "$age" -gt "$current"; then
-	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
-	  func_fatal_error "\`$vinfo' is not valid version information"
-	fi
-
-	# Calculate the version variables.
-	major=
-	versuffix=
-	verstring=
-	case $version_type in
-	none) ;;
-
-	darwin)
-	  # Like Linux, but with the current version available in
-	  # verstring for coding it into the library header
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
-	  # Darwin ld doesn't like 0 for these options...
-	  func_arith $current + 1
-	  minor_current=$func_arith_result
-	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
-	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
-	  ;;
-
-	freebsd-aout)
-	  major=".$current"
-	  versuffix=".$current.$revision";
-	  ;;
-
-	freebsd-elf)
-	  major=".$current"
-	  versuffix=".$current"
-	  ;;
-
-	irix | nonstopux)
-	  if test "X$lt_irix_increment" = "Xno"; then
-	    func_arith $current - $age
-	  else
-	    func_arith $current - $age + 1
-	  fi
-	  major=$func_arith_result
-
-	  case $version_type in
-	    nonstopux) verstring_prefix=nonstopux ;;
-	    *)         verstring_prefix=sgi ;;
-	  esac
-	  verstring="$verstring_prefix$major.$revision"
-
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$revision
-	  while test "$loop" -ne 0; do
-	    func_arith $revision - $loop
-	    iface=$func_arith_result
-	    func_arith $loop - 1
-	    loop=$func_arith_result
-	    verstring="$verstring_prefix$major.$iface:$verstring"
-	  done
-
-	  # Before this point, $major must not contain `.'.
-	  major=.$major
-	  versuffix="$major.$revision"
-	  ;;
-
-	linux)
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
-	  ;;
-
-	osf)
-	  func_arith $current - $age
-	  major=.$func_arith_result
-	  versuffix=".$current.$age.$revision"
-	  verstring="$current.$age.$revision"
-
-	  # Add in all the interfaces that we are compatible with.
-	  loop=$age
-	  while test "$loop" -ne 0; do
-	    func_arith $current - $loop
-	    iface=$func_arith_result
-	    func_arith $loop - 1
-	    loop=$func_arith_result
-	    verstring="$verstring:${iface}.0"
-	  done
-
-	  # Make executables depend on our current version.
-	  verstring="$verstring:${current}.0"
-	  ;;
-
-	qnx)
-	  major=".$current"
-	  versuffix=".$current"
-	  ;;
-
-	sunos)
-	  major=".$current"
-	  versuffix=".$current.$revision"
-	  ;;
-
-	windows)
-	  # Use '-' rather than '.', since we only want one
-	  # extension on DOS 8.3 filesystems.
-	  func_arith $current - $age
-	  major=$func_arith_result
-	  versuffix="-$major"
-	  ;;
-
-	*)
-	  func_fatal_configuration "unknown library version type \`$version_type'"
-	  ;;
-	esac
-
-	# Clear the version info if we defaulted, and they specified a release.
-	if test -z "$vinfo" && test -n "$release"; then
-	  major=
-	  case $version_type in
-	  darwin)
-	    # we can't check for "0.0" in archive_cmds due to quoting
-	    # problems, so we reset it completely
-	    verstring=
-	    ;;
-	  *)
-	    verstring="0.0"
-	    ;;
-	  esac
-	  if test "$need_version" = no; then
-	    versuffix=
-	  else
-	    versuffix=".0.0"
-	  fi
-	fi
-
-	# Remove version info from name if versioning should be avoided
-	if test "$avoid_version" = yes && test "$need_version" = no; then
-	  major=
-	  versuffix=
-	  verstring=""
-	fi
-
-	# Check to see if the archive will have undefined symbols.
-	if test "$allow_undefined" = yes; then
-	  if test "$allow_undefined_flag" = unsupported; then
-	    func_warning "undefined symbols not allowed in $host shared libraries"
-	    build_libtool_libs=no
-	    build_old_libs=yes
-	  fi
-	else
-	  # Don't allow undefined symbols.
-	  allow_undefined_flag="$no_undefined_flag"
-	fi
-
-      fi
-
-      func_generate_dlsyms "$libname" "$libname" "yes"
-      libobjs="$libobjs $symfileobj"
-      test "X$libobjs" = "X " && libobjs=
-
-      if test "$mode" != relink; then
-	# Remove our outputs, but don't remove object files since they
-	# may have been created when compiling PIC objects.
-	removelist=
-	tempremovelist=`$ECHO "$output_objdir/*"`
-	for p in $tempremovelist; do
-	  case $p in
-	    *.$objext | *.gcno)
-	       ;;
-	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
-	       if test "X$precious_files_regex" != "X"; then
-		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
-		 then
-		   continue
-		 fi
-	       fi
-	       removelist="$removelist $p"
-	       ;;
-	    *) ;;
-	  esac
-	done
-	test -n "$removelist" && \
-	  func_show_eval "${RM}r \$removelist"
-      fi
-
-      # Now set the variables for building old libraries.
-      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
-	oldlibs="$oldlibs $output_objdir/$libname.$libext"
-
-	# Transform .lo files to .o files.
-	oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
-      fi
-
-      # Eliminate all temporary directories.
-      #for path in $notinst_path; do
-      #	lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"`
-      #	deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"`
-      #	dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"`
-      #done
-
-      if test -n "$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	temp_xrpath=
-	for libdir in $xrpath; do
-	  temp_xrpath="$temp_xrpath -R$libdir"
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_rpath="$finalize_rpath $libdir" ;;
-	  esac
-	done
-	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
-	  dependency_libs="$temp_xrpath $dependency_libs"
-	fi
-      fi
-
-      # Make sure dlfiles contains only unique files that won't be dlpreopened
-      old_dlfiles="$dlfiles"
-      dlfiles=
-      for lib in $old_dlfiles; do
-	case " $dlprefiles $dlfiles " in
-	*" $lib "*) ;;
-	*) dlfiles="$dlfiles $lib" ;;
-	esac
-      done
-
-      # Make sure dlprefiles contains only unique files
-      old_dlprefiles="$dlprefiles"
-      dlprefiles=
-      for lib in $old_dlprefiles; do
-	case "$dlprefiles " in
-	*" $lib "*) ;;
-	*) dlprefiles="$dlprefiles $lib" ;;
-	esac
-      done
-
-      if test "$build_libtool_libs" = yes; then
-	if test -n "$rpath"; then
-	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*)
-	    # these systems don't actually have a c library (as such)!
-	    ;;
-	  *-*-rhapsody* | *-*-darwin1.[012])
-	    # Rhapsody C library is in the System framework
-	    deplibs="$deplibs System.ltframework"
-	    ;;
-	  *-*-netbsd*)
-	    # Don't link with libc until the a.out ld.so is fixed.
-	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
-	    # Do not include libc due to us having libc/libc_r.
-	    ;;
-	  *-*-sco3.2v5* | *-*-sco5v6*)
-	    # Causes problems with __ctype
-	    ;;
-	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
-	    # Compiler inserts libc in the correct place for threads to work
-	    ;;
-	  *)
-	    # Add libc to deplibs on all other systems if necessary.
-	    if test "$build_libtool_need_lc" = "yes"; then
-	      deplibs="$deplibs -lc"
-	    fi
-	    ;;
-	  esac
-	fi
-
-	# Transform deplibs into only deplibs that can be linked in shared.
-	name_save=$name
-	libname_save=$libname
-	release_save=$release
-	versuffix_save=$versuffix
-	major_save=$major
-	# I'm not sure if I'm treating the release correctly.  I think
-	# release should show up in the -l (ie -lgmp5) so we don't want to
-	# add it in twice.  Is that correct?
-	release=""
-	versuffix=""
-	major=""
-	newdeplibs=
-	droppeddeps=no
-	case $deplibs_check_method in
-	pass_all)
-	  # Don't check for shared/static.  Everything works.
-	  # This might be a little naive.  We might want to check
-	  # whether the library exists or not.  But this is on
-	  # osf3 & osf4 and I'm not really sure... Just
-	  # implementing what was already the behavior.
-	  newdeplibs=$deplibs
-	  ;;
-	test_compile)
-	  # This code stresses the "libraries are programs" paradigm to its
-	  # limits. Maybe even breaks it.  We compile a program, linking it
-	  # against the deplibs as a proxy for the library.  Then we can check
-	  # whether they linked in statically or dynamically with ldd.
-	  $opt_dry_run || $RM conftest.c
-	  cat > conftest.c <<EOF
-	  int main() { return 0; }
-EOF
-	  $opt_dry_run || $RM conftest
-	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
-	    ldd_output=`ldd conftest`
-	    for i in $deplibs; do
-	      case $i in
-	      -l*)
-		func_stripname -l '' "$i"
-		name=$func_stripname_result
-		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		  case " $predeps $postdeps " in
-		  *" $i "*)
-		    newdeplibs="$newdeplibs $i"
-		    i=""
-		    ;;
-		  esac
-		fi
-		if test -n "$i" ; then
-		  libname=`eval "\\$ECHO \"$libname_spec\""`
-		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
-		  set dummy $deplib_matches; shift
-		  deplib_match=$1
-		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		    newdeplibs="$newdeplibs $i"
-		  else
-		    droppeddeps=yes
-		    $ECHO
-		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
-		    $ECHO "*** I have the capability to make that library automatically link in when"
-		    $ECHO "*** you link to this library.  But I can only do this if you have a"
-		    $ECHO "*** shared version of the library, which I believe you do not have"
-		    $ECHO "*** because a test_compile did reveal that the linker did not use it for"
-		    $ECHO "*** its dynamic dependency list that programs get resolved with at runtime."
-		  fi
-		fi
-		;;
-	      *)
-		newdeplibs="$newdeplibs $i"
-		;;
-	      esac
-	    done
-	  else
-	    # Error occurred in the first compile.  Let's try to salvage
-	    # the situation: Compile a separate program for each library.
-	    for i in $deplibs; do
-	      case $i in
-	      -l*)
-		func_stripname -l '' "$i"
-		name=$func_stripname_result
-		$opt_dry_run || $RM conftest
-		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
-		  ldd_output=`ldd conftest`
-		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		    case " $predeps $postdeps " in
-		    *" $i "*)
-		      newdeplibs="$newdeplibs $i"
-		      i=""
-		      ;;
-		    esac
-		  fi
-		  if test -n "$i" ; then
-		    libname=`eval "\\$ECHO \"$libname_spec\""`
-		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
-		    set dummy $deplib_matches; shift
-		    deplib_match=$1
-		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
-		      newdeplibs="$newdeplibs $i"
-		    else
-		      droppeddeps=yes
-		      $ECHO
-		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
-		      $ECHO "*** I have the capability to make that library automatically link in when"
-		      $ECHO "*** you link to this library.  But I can only do this if you have a"
-		      $ECHO "*** shared version of the library, which you do not appear to have"
-		      $ECHO "*** because a test_compile did reveal that the linker did not use this one"
-		      $ECHO "*** as a dynamic dependency that programs can get resolved with at runtime."
-		    fi
-		  fi
-		else
-		  droppeddeps=yes
-		  $ECHO
-		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
-		  $ECHO "*** make it link in!  You will probably need to install it or some"
-		  $ECHO "*** library that it depends on before this library will be fully"
-		  $ECHO "*** functional.  Installing it before continuing would be even better."
-		fi
-		;;
-	      *)
-		newdeplibs="$newdeplibs $i"
-		;;
-	      esac
-	    done
-	  fi
-	  ;;
-	file_magic*)
-	  set dummy $deplibs_check_method; shift
-	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    case $a_deplib in
-	    -l*)
-	      func_stripname -l '' "$a_deplib"
-	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  newdeplibs="$newdeplibs $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		libname=`eval "\\$ECHO \"$libname_spec\""`
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-		  for potent_lib in $potential_libs; do
-		      # Follow soft links.
-		      if ls -lLd "$potent_lib" 2>/dev/null |
-			 $GREP " -> " >/dev/null; then
-			continue
-		      fi
-		      # The statement above tries to avoid entering an
-		      # endless loop below, in case of cyclic links.
-		      # We might still enter an endless loop, since a link
-		      # loop can be closed while we follow links,
-		      # but so what?
-		      potlib="$potent_lib"
-		      while test -h "$potlib" 2>/dev/null; do
-			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
-			case $potliblink in
-			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
-			*) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
-			esac
-		      done
-		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
-			 $SED -e 10q |
-			 $EGREP "$file_magic_regex" > /dev/null; then
-			newdeplibs="$newdeplibs $a_deplib"
-			a_deplib=""
-			break 2
-		      fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		$ECHO
-		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
-		$ECHO "*** I have the capability to make that library automatically link in when"
-		$ECHO "*** you link to this library.  But I can only do this if you have a"
-		$ECHO "*** shared version of the library, which you do not appear to have"
-		$ECHO "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
-		else
-		  $ECHO "*** with $libname and none of the candidates passed a file format test"
-		  $ECHO "*** using a file magic. Last file checked: $potlib"
-		fi
-	      fi
-	      ;;
-	    *)
-	      # Add a -L argument.
-	      newdeplibs="$newdeplibs $a_deplib"
-	      ;;
-	    esac
-	  done # Gone through all deplibs.
-	  ;;
-	match_pattern*)
-	  set dummy $deplibs_check_method; shift
-	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
-	  for a_deplib in $deplibs; do
-	    case $a_deplib in
-	    -l*)
-	      func_stripname -l '' "$a_deplib"
-	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-		case " $predeps $postdeps " in
-		*" $a_deplib "*)
-		  newdeplibs="$newdeplibs $a_deplib"
-		  a_deplib=""
-		  ;;
-		esac
-	      fi
-	      if test -n "$a_deplib" ; then
-		libname=`eval "\\$ECHO \"$libname_spec\""`
-		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
-		  for potent_lib in $potential_libs; do
-		    potlib="$potent_lib" # see symlink-check above in file_magic test
-		    if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \
-		       $EGREP "$match_pattern_regex" > /dev/null; then
-		      newdeplibs="$newdeplibs $a_deplib"
-		      a_deplib=""
-		      break 2
-		    fi
-		  done
-		done
-	      fi
-	      if test -n "$a_deplib" ; then
-		droppeddeps=yes
-		$ECHO
-		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
-		$ECHO "*** I have the capability to make that library automatically link in when"
-		$ECHO "*** you link to this library.  But I can only do this if you have a"
-		$ECHO "*** shared version of the library, which you do not appear to have"
-		$ECHO "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
-		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
-		else
-		  $ECHO "*** with $libname and none of the candidates passed a file format test"
-		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
-		fi
-	      fi
-	      ;;
-	    *)
-	      # Add a -L argument.
-	      newdeplibs="$newdeplibs $a_deplib"
-	      ;;
-	    esac
-	  done # Gone through all deplibs.
-	  ;;
-	none | unknown | *)
-	  newdeplibs=""
-	  tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \
-	      -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'`
-	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	    for i in $predeps $postdeps ; do
-	      # can't use Xsed below, because $i might contain '/'
-	      tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"`
-	    done
-	  fi
-	  if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[	 ]//g' |
-	     $GREP . >/dev/null; then
-	    $ECHO
-	    if test "X$deplibs_check_method" = "Xnone"; then
-	      $ECHO "*** Warning: inter-library dependencies are not supported in this platform."
-	    else
-	      $ECHO "*** Warning: inter-library dependencies are not known to be supported."
-	    fi
-	    $ECHO "*** All declared inter-library dependencies are being dropped."
-	    droppeddeps=yes
-	  fi
-	  ;;
-	esac
-	versuffix=$versuffix_save
-	major=$major_save
-	release=$release_save
-	libname=$libname_save
-	name=$name_save
-
-	case $host in
-	*-*-rhapsody* | *-*-darwin1.[012])
-	  # On Rhapsody replace the C library with the System framework
-	  newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
-	  ;;
-	esac
-
-	if test "$droppeddeps" = yes; then
-	  if test "$module" = yes; then
-	    $ECHO
-	    $ECHO "*** Warning: libtool could not satisfy all declared inter-library"
-	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
-	    $ECHO "*** a static module, that should work as long as the dlopening"
-	    $ECHO "*** application is linked with the -dlopen flag."
-	    if test -z "$global_symbol_pipe"; then
-	      $ECHO
-	      $ECHO "*** However, this would only work if libtool was able to extract symbol"
-	      $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
-	      $ECHO "*** not find such a program.  So, this module is probably useless."
-	      $ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
-	    fi
-	    if test "$build_old_libs" = no; then
-	      oldlibs="$output_objdir/$libname.$libext"
-	      build_libtool_libs=module
-	      build_old_libs=yes
-	    else
-	      build_libtool_libs=no
-	    fi
-	  else
-	    $ECHO "*** The inter-library dependencies that have been dropped here will be"
-	    $ECHO "*** automatically added whenever a program is linked with this library"
-	    $ECHO "*** or is declared to -dlopen it."
-
-	    if test "$allow_undefined" = no; then
-	      $ECHO
-	      $ECHO "*** Since this library must not contain undefined symbols,"
-	      $ECHO "*** because either the platform does not support them or"
-	      $ECHO "*** it was explicitly requested with -no-undefined,"
-	      $ECHO "*** libtool will only create a static version of it."
-	      if test "$build_old_libs" = no; then
-		oldlibs="$output_objdir/$libname.$libext"
-		build_libtool_libs=module
-		build_old_libs=yes
-	      else
-		build_libtool_libs=no
-	      fi
-	    fi
-	  fi
-	fi
-	# Done checking deplibs!
-	deplibs=$newdeplibs
-      fi
-      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
-      case $host in
-	*-*-darwin*)
-	  newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-	  ;;
-      esac
-
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $deplibs " in
-	  *" -L$path/$objdir "*)
-	    new_libs="$new_libs -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) new_libs="$new_libs $deplib" ;;
-	  esac
-	  ;;
-	*) new_libs="$new_libs $deplib" ;;
-	esac
-      done
-      deplibs="$new_libs"
-
-      # All the library-specific variables (install_libdir is set above).
-      library_names=
-      old_library=
-      dlname=
-
-      # Test again, we may have decided not to build it any more
-      if test "$build_libtool_libs" = yes; then
-	if test "$hardcode_into_libs" = yes; then
-	  # Hardcode the library paths
-	  hardcode_libdirs=
-	  dep_rpath=
-	  rpath="$finalize_rpath"
-	  test "$mode" != relink && rpath="$compile_rpath$rpath"
-	  for libdir in $rpath; do
-	    if test -n "$hardcode_libdir_flag_spec"; then
-	      if test -n "$hardcode_libdir_separator"; then
-		if test -z "$hardcode_libdirs"; then
-		  hardcode_libdirs="$libdir"
-		else
-		  # Just accumulate the unique libdirs.
-		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		    ;;
-		  *)
-		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		    ;;
-		  esac
-		fi
-	      else
-		eval flag=\"$hardcode_libdir_flag_spec\"
-		dep_rpath="$dep_rpath $flag"
-	      fi
-	    elif test -n "$runpath_var"; then
-	      case "$perm_rpath " in
-	      *" $libdir "*) ;;
-	      *) perm_rpath="$perm_rpath $libdir" ;;
-	      esac
-	    fi
-	  done
-	  # Substitute the hardcoded libdirs into the rpath.
-	  if test -n "$hardcode_libdir_separator" &&
-	     test -n "$hardcode_libdirs"; then
-	    libdir="$hardcode_libdirs"
-	    if test -n "$hardcode_libdir_flag_spec_ld"; then
-	      eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
-	    else
-	      eval dep_rpath=\"$hardcode_libdir_flag_spec\"
-	    fi
-	  fi
-	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
-	    # We should set the runpath_var.
-	    rpath=
-	    for dir in $perm_rpath; do
-	      rpath="$rpath$dir:"
-	    done
-	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
-	  fi
-	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
-	fi
-
-	shlibpath="$finalize_shlibpath"
-	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
-	if test -n "$shlibpath"; then
-	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
-	fi
-
-	# Get the real and link names of the library.
-	eval shared_ext=\"$shrext_cmds\"
-	eval library_names=\"$library_names_spec\"
-	set dummy $library_names
-	shift
-	realname="$1"
-	shift
-
-	if test -n "$soname_spec"; then
-	  eval soname=\"$soname_spec\"
-	else
-	  soname="$realname"
-	fi
-	if test -z "$dlname"; then
-	  dlname=$soname
-	fi
-
-	lib="$output_objdir/$realname"
-	linknames=
-	for link
-	do
-	  linknames="$linknames $link"
-	done
-
-	# Use standard objects if they are pic
-	test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-	test "X$libobjs" = "X " && libobjs=
-
-	delfiles=
-	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
-	  export_symbols="$output_objdir/$libname.uexp"
-	  delfiles="$delfiles $export_symbols"
-	fi
-
-	orig_export_symbols=
-	case $host_os in
-	cygwin* | mingw* | cegcc*)
-	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
-	    # exporting using user supplied symfile
-	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
-	      # and it's NOT already a .def file. Must figure out
-	      # which of the given symbols are data symbols and tag
-	      # them as such. So, trigger use of export_symbols_cmds.
-	      # export_symbols gets reassigned inside the "prepare
-	      # the list of exported symbols" if statement, so the
-	      # include_expsyms logic still works.
-	      orig_export_symbols="$export_symbols"
-	      export_symbols=
-	      always_export_symbols=yes
-	    fi
-	  fi
-	  ;;
-	esac
-
-	# Prepare the list of exported symbols
-	if test -z "$export_symbols"; then
-	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
-	    func_verbose "generating symbol list for \`$libname.la'"
-	    export_symbols="$output_objdir/$libname.exp"
-	    $opt_dry_run || $RM $export_symbols
-	    cmds=$export_symbols_cmds
-	    save_ifs="$IFS"; IFS='~'
-	    for cmd in $cmds; do
-	      IFS="$save_ifs"
-	      eval cmd=\"$cmd\"
-	      func_len " $cmd"
-	      len=$func_len_result
-	      if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-		func_show_eval "$cmd" 'exit $?'
-		skipped_export=false
-	      else
-		# The command line is too long to execute in one step.
-		func_verbose "using reloadable object file for export list..."
-		skipped_export=:
-		# Break out early, otherwise skipped_export may be
-		# set to false by a later but shorter cmd.
-		break
-	      fi
-	    done
-	    IFS="$save_ifs"
-	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
-	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
-	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
-	    fi
-	  fi
-	fi
-
-	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  tmp_export_symbols="$export_symbols"
-	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
-	  $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
-	fi
-
-	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
-	  # The given exports_symbols file has to be filtered, so filter it.
-	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
-	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	  # 's' commands which not all seds can handle. GNU sed should be fine
-	  # though. Also, the filter scales superlinearly with the number of
-	  # global variables. join(1) would be nice here, but unfortunately
-	  # isn't a blessed tool.
-	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
-	  delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
-	  export_symbols=$output_objdir/$libname.def
-	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
-	fi
-
-	tmp_deplibs=
-	for test_deplib in $deplibs; do
-	  case " $convenience " in
-	  *" $test_deplib "*) ;;
-	  *)
-	    tmp_deplibs="$tmp_deplibs $test_deplib"
-	    ;;
-	  esac
-	done
-	deplibs="$tmp_deplibs"
-
-	if test -n "$convenience"; then
-	  if test -n "$whole_archive_flag_spec" &&
-	    test "$compiler_needs_object" = yes &&
-	    test -z "$libobjs"; then
-	    # extract the archives, so we have objects to list.
-	    # TODO: could optimize this to just extract one archive.
-	    whole_archive_flag_spec=
-	  fi
-	  if test -n "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
-	    test "X$libobjs" = "X " && libobjs=
-	  else
-	    gentop="$output_objdir/${outputname}x"
-	    generated="$generated $gentop"
-
-	    func_extract_archives $gentop $convenience
-	    libobjs="$libobjs $func_extract_archives_result"
-	    test "X$libobjs" = "X " && libobjs=
-	  fi
-	fi
-
-	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
-	  eval flag=\"$thread_safe_flag_spec\"
-	  linker_flags="$linker_flags $flag"
-	fi
-
-	# Make a backup of the uninstalled library when relinking
-	if test "$mode" = relink; then
-	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
-	fi
-
-	# Do each of the archive commands.
-	if test "$module" = yes && test -n "$module_cmds" ; then
-	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	    eval test_cmds=\"$module_expsym_cmds\"
-	    cmds=$module_expsym_cmds
-	  else
-	    eval test_cmds=\"$module_cmds\"
-	    cmds=$module_cmds
-	  fi
-	else
-	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	    eval test_cmds=\"$archive_expsym_cmds\"
-	    cmds=$archive_expsym_cmds
-	  else
-	    eval test_cmds=\"$archive_cmds\"
-	    cmds=$archive_cmds
-	  fi
-	fi
-
-	if test "X$skipped_export" != "X:" &&
-	   func_len " $test_cmds" &&
-	   len=$func_len_result &&
-	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  :
-	else
-	  # The command line is too long to link in one step, link piecewise
-	  # or, if using GNU ld and skipped_export is not :, use a linker
-	  # script.
-
-	  # Save the value of $output and $libobjs because we want to
-	  # use them later.  If we have whole_archive_flag_spec, we
-	  # want to use save_libobjs as it was before
-	  # whole_archive_flag_spec was expanded, because we can't
-	  # assume the linker understands whole_archive_flag_spec.
-	  # This may have to be revisited, in case too many
-	  # convenience libraries get linked in and end up exceeding
-	  # the spec.
-	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
-	    save_libobjs=$libobjs
-	  fi
-	  save_output=$output
-	  output_la=`$ECHO "X$output" | $Xsed -e "$basename"`
-
-	  # Clear the reloadable object creation command queue and
-	  # initialize k to one.
-	  test_cmds=
-	  concat_cmds=
-	  objlist=
-	  last_robj=
-	  k=1
-
-	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
-	    output=${output_objdir}/${output_la}.lnkscript
-	    func_verbose "creating GNU ld script: $output"
-	    $ECHO 'INPUT (' > $output
-	    for obj in $save_libobjs
-	    do
-	      $ECHO "$obj" >> $output
-	    done
-	    $ECHO ')' >> $output
-	    delfiles="$delfiles $output"
-	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
-	    output=${output_objdir}/${output_la}.lnk
-	    func_verbose "creating linker input file list: $output"
-	    : > $output
-	    set x $save_libobjs
-	    shift
-	    firstobj=
-	    if test "$compiler_needs_object" = yes; then
-	      firstobj="$1 "
-	      shift
-	    fi
-	    for obj
-	    do
-	      $ECHO "$obj" >> $output
-	    done
-	    delfiles="$delfiles $output"
-	    output=$firstobj\"$file_list_spec$output\"
-	  else
-	    if test -n "$save_libobjs"; then
-	      func_verbose "creating reloadable object files..."
-	      output=$output_objdir/$output_la-${k}.$objext
-	      eval test_cmds=\"$reload_cmds\"
-	      func_len " $test_cmds"
-	      len0=$func_len_result
-	      len=$len0
-
-	      # Loop over the list of objects to be linked.
-	      for obj in $save_libobjs
-	      do
-		func_len " $obj"
-		func_arith $len + $func_len_result
-		len=$func_arith_result
-		if test "X$objlist" = X ||
-		   test "$len" -lt "$max_cmd_len"; then
-		  func_append objlist " $obj"
-		else
-		  # The command $test_cmds is almost too long, add a
-		  # command to the queue.
-		  if test "$k" -eq 1 ; then
-		    # The first file doesn't have a previous command to add.
-		    eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
-		  else
-		    # All subsequent reloadable object files will link in
-		    # the last one created.
-		    eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\"
-		  fi
-		  last_robj=$output_objdir/$output_la-${k}.$objext
-		  func_arith $k + 1
-		  k=$func_arith_result
-		  output=$output_objdir/$output_la-${k}.$objext
-		  objlist=$obj
-		  func_len " $last_robj"
-		  func_arith $len0 + $func_len_result
-		  len=$func_arith_result
-		fi
-	      done
-	      # Handle the remaining objects by creating one last
-	      # reloadable object file.  All subsequent reloadable object
-	      # files will link in the last one created.
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
-	      if test -n "$last_robj"; then
-	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
-	      fi
-	      delfiles="$delfiles $output"
-
-	    else
-	      output=
-	    fi
-
-	    if ${skipped_export-false}; then
-	      func_verbose "generating symbol list for \`$libname.la'"
-	      export_symbols="$output_objdir/$libname.exp"
-	      $opt_dry_run || $RM $export_symbols
-	      libobjs=$output
-	      # Append the command to create the export file.
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
-	      if test -n "$last_robj"; then
-		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
-	      fi
-	    fi
-
-	    test -n "$save_libobjs" &&
-	      func_verbose "creating a temporary reloadable object file: $output"
-
-	    # Loop through the commands generated above and execute them.
-	    save_ifs="$IFS"; IFS='~'
-	    for cmd in $concat_cmds; do
-	      IFS="$save_ifs"
-	      $opt_silent || {
-		  func_quote_for_expand "$cmd"
-		  eval "func_echo $func_quote_for_expand_result"
-	      }
-	      $opt_dry_run || eval "$cmd" || {
-		lt_exit=$?
-
-		# Restore the uninstalled library and exit
-		if test "$mode" = relink; then
-		  ( cd "$output_objdir" && \
-		    $RM "${realname}T" && \
-		    $MV "${realname}U" "$realname" )
-		fi
-
-		exit $lt_exit
-	      }
-	    done
-	    IFS="$save_ifs"
-
-	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
-	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
-	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
-	    fi
-	  fi
-
-          if ${skipped_export-false}; then
-	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	      tmp_export_symbols="$export_symbols"
-	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
-	      $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
-	    fi
-
-	    if test -n "$orig_export_symbols"; then
-	      # The given exports_symbols file has to be filtered, so filter it.
-	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
-	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	      # 's' commands which not all seds can handle. GNU sed should be fine
-	      # though. Also, the filter scales superlinearly with the number of
-	      # global variables. join(1) would be nice here, but unfortunately
-	      # isn't a blessed tool.
-	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
-	      delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
-	      export_symbols=$output_objdir/$libname.def
-	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
-	    fi
-	  fi
-
-	  libobjs=$output
-	  # Restore the value of output.
-	  output=$save_output
-
-	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
-	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
-	    test "X$libobjs" = "X " && libobjs=
-	  fi
-	  # Expand the library linking commands again to reset the
-	  # value of $libobjs for piecewise linking.
-
-	  # Do each of the archive commands.
-	  if test "$module" = yes && test -n "$module_cmds" ; then
-	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
-	      cmds=$module_expsym_cmds
-	    else
-	      cmds=$module_cmds
-	    fi
-	  else
-	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
-	      cmds=$archive_expsym_cmds
-	    else
-	      cmds=$archive_cmds
-	    fi
-	  fi
-	fi
-
-	if test -n "$delfiles"; then
-	  # Append the command to remove temporary files to $cmds.
-	  eval cmds=\"\$cmds~\$RM $delfiles\"
-	fi
-
-	# Add any objects from preloaded convenience libraries
-	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
-	  generated="$generated $gentop"
-
-	  func_extract_archives $gentop $dlprefiles
-	  libobjs="$libobjs $func_extract_archives_result"
-	  test "X$libobjs" = "X " && libobjs=
-	fi
-
-	save_ifs="$IFS"; IFS='~'
-	for cmd in $cmds; do
-	  IFS="$save_ifs"
-	  eval cmd=\"$cmd\"
-	  $opt_silent || {
-	    func_quote_for_expand "$cmd"
-	    eval "func_echo $func_quote_for_expand_result"
-	  }
-	  $opt_dry_run || eval "$cmd" || {
-	    lt_exit=$?
-
-	    # Restore the uninstalled library and exit
-	    if test "$mode" = relink; then
-	      ( cd "$output_objdir" && \
-	        $RM "${realname}T" && \
-		$MV "${realname}U" "$realname" )
-	    fi
-
-	    exit $lt_exit
-	  }
-	done
-	IFS="$save_ifs"
-
-	# Restore the uninstalled library and exit
-	if test "$mode" = relink; then
-	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
-
-	  if test -n "$convenience"; then
-	    if test -z "$whole_archive_flag_spec"; then
-	      func_show_eval '${RM}r "$gentop"'
-	    fi
-	  fi
-
-	  exit $EXIT_SUCCESS
-	fi
-
-	# Create links to the real library.
-	for linkname in $linknames; do
-	  if test "$realname" != "$linkname"; then
-	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
-	  fi
-	done
-
-	# If -module or -export-dynamic was specified, set the dlname.
-	if test "$module" = yes || test "$export_dynamic" = yes; then
-	  # On all known operating systems, these are identical.
-	  dlname="$soname"
-	fi
-      fi
-      ;;
-
-    obj)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for objects"
-      fi
-
-      case " $deplibs" in
-      *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for objects" ;;
-      esac
-
-      test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for objects"
-
-      test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for objects"
-
-      test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for objects"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for objects"
-
-      case $output in
-      *.lo)
-	test -n "$objs$old_deplibs" && \
-	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
-
-	libobj=$output
-	func_lo2o "$libobj"
-	obj=$func_lo2o_result
-	;;
-      *)
-	libobj=
-	obj="$output"
-	;;
-      esac
-
-      # Delete the old objects.
-      $opt_dry_run || $RM $obj $libobj
-
-      # Objects from convenience libraries.  This assumes
-      # single-version convenience libraries.  Whenever we create
-      # different ones for PIC/non-PIC, this we'll have to duplicate
-      # the extraction.
-      reload_conv_objs=
-      gentop=
-      # reload_cmds runs $LD directly, so let us get rid of
-      # -Wl from whole_archive_flag_spec and hope we can get by with
-      # turning comma into space..
-      wl=
-
-      if test -n "$convenience"; then
-	if test -n "$whole_archive_flag_spec"; then
-	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
-	  reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'`
-	else
-	  gentop="$output_objdir/${obj}x"
-	  generated="$generated $gentop"
-
-	  func_extract_archives $gentop $convenience
-	  reload_conv_objs="$reload_objs $func_extract_archives_result"
-	fi
-      fi
-
-      # Create the old-style object.
-      reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
-
-      output="$obj"
-      func_execute_cmds "$reload_cmds" 'exit $?'
-
-      # Exit if we aren't doing a library object file.
-      if test -z "$libobj"; then
-	if test -n "$gentop"; then
-	  func_show_eval '${RM}r "$gentop"'
-	fi
-
-	exit $EXIT_SUCCESS
-      fi
-
-      if test "$build_libtool_libs" != yes; then
-	if test -n "$gentop"; then
-	  func_show_eval '${RM}r "$gentop"'
-	fi
-
-	# Create an invalid libtool object if no PIC, so that we don't
-	# accidentally link it into a program.
-	# $show "echo timestamp > $libobj"
-	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
-	exit $EXIT_SUCCESS
-      fi
-
-      if test -n "$pic_flag" || test "$pic_mode" != default; then
-	# Only do commands if we really have different PIC objects.
-	reload_objs="$libobjs $reload_conv_objs"
-	output="$libobj"
-	func_execute_cmds "$reload_cmds" 'exit $?'
-      fi
-
-      if test -n "$gentop"; then
-	func_show_eval '${RM}r "$gentop"'
-      fi
-
-      exit $EXIT_SUCCESS
-      ;;
-
-    prog)
-      case $host in
-	*cygwin*) func_stripname '' '.exe' "$output"
-	          output=$func_stripname_result.exe;;
-      esac
-      test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for programs"
-
-      test -n "$release" && \
-	func_warning "\`-release' is ignored for programs"
-
-      test "$preload" = yes \
-        && test "$dlopen_support" = unknown \
-	&& test "$dlopen_self" = unknown \
-	&& test "$dlopen_self_static" = unknown && \
-	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
-
-      case $host in
-      *-*-rhapsody* | *-*-darwin1.[012])
-	# On Rhapsody replace the C library is the System framework
-	compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
-	finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
-	;;
-      esac
-
-      case $host in
-      *-*-darwin*)
-	# Don't allow lazy linking, it breaks C++ global constructors
-	# But is supposedly fixed on 10.4 or later (yay!).
-	if test "$tagname" = CXX ; then
-	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
-	    10.[0123])
-	      compile_command="$compile_command ${wl}-bind_at_load"
-	      finalize_command="$finalize_command ${wl}-bind_at_load"
-	    ;;
-	  esac
-	fi
-	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
-	compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-	finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
-	;;
-      esac
-
-
-      # move library search paths that coincide with paths to not yet
-      # installed libraries to the beginning of the library search list
-      new_libs=
-      for path in $notinst_path; do
-	case " $new_libs " in
-	*" -L$path/$objdir "*) ;;
-	*)
-	  case " $compile_deplibs " in
-	  *" -L$path/$objdir "*)
-	    new_libs="$new_libs -L$path/$objdir" ;;
-	  esac
-	  ;;
-	esac
-      done
-      for deplib in $compile_deplibs; do
-	case $deplib in
-	-L*)
-	  case " $new_libs " in
-	  *" $deplib "*) ;;
-	  *) new_libs="$new_libs $deplib" ;;
-	  esac
-	  ;;
-	*) new_libs="$new_libs $deplib" ;;
-	esac
-      done
-      compile_deplibs="$new_libs"
-
-
-      compile_command="$compile_command $compile_deplibs"
-      finalize_command="$finalize_command $finalize_deplibs"
-
-      if test -n "$rpath$xrpath"; then
-	# If the user specified any rpath flags, then add them.
-	for libdir in $rpath $xrpath; do
-	  # This is the magic to use -rpath.
-	  case "$finalize_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_rpath="$finalize_rpath $libdir" ;;
-	  esac
-	done
-      fi
-
-      # Now hardcode the library paths
-      rpath=
-      hardcode_libdirs=
-      for libdir in $compile_rpath $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval flag=\"$hardcode_libdir_flag_spec\"
-	    rpath="$rpath $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) perm_rpath="$perm_rpath $libdir" ;;
-	  esac
-	fi
-	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
-	  case :$dllsearchpath: in
-	  *":$libdir:"*) ;;
-	  ::) dllsearchpath=$libdir;;
-	  *) dllsearchpath="$dllsearchpath:$libdir";;
-	  esac
-	  case :$dllsearchpath: in
-	  *":$testbindir:"*) ;;
-	  ::) dllsearchpath=$testbindir;;
-	  *) dllsearchpath="$dllsearchpath:$testbindir";;
-	  esac
-	  ;;
-	esac
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval rpath=\" $hardcode_libdir_flag_spec\"
-      fi
-      compile_rpath="$rpath"
-
-      rpath=
-      hardcode_libdirs=
-      for libdir in $finalize_rpath; do
-	if test -n "$hardcode_libdir_flag_spec"; then
-	  if test -n "$hardcode_libdir_separator"; then
-	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
-	    else
-	      # Just accumulate the unique libdirs.
-	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
-	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
-		;;
-	      *)
-		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
-		;;
-	      esac
-	    fi
-	  else
-	    eval flag=\"$hardcode_libdir_flag_spec\"
-	    rpath="$rpath $flag"
-	  fi
-	elif test -n "$runpath_var"; then
-	  case "$finalize_perm_rpath " in
-	  *" $libdir "*) ;;
-	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
-	  esac
-	fi
-      done
-      # Substitute the hardcoded libdirs into the rpath.
-      if test -n "$hardcode_libdir_separator" &&
-	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
-	eval rpath=\" $hardcode_libdir_flag_spec\"
-      fi
-      finalize_rpath="$rpath"
-
-      if test -n "$libobjs" && test "$build_old_libs" = yes; then
-	# Transform all the library objects into standard objects.
-	compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-	finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-      fi
-
-      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
-
-      # template prelinking step
-      if test -n "$prelink_cmds"; then
-	func_execute_cmds "$prelink_cmds" 'exit $?'
-      fi
-
-      wrappers_required=yes
-      case $host in
-      *cygwin* | *mingw* )
-        if test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
-        ;;
-      *cegcc)
-        # Disable wrappers for cegcc, we are cross compiling anyway.
-        wrappers_required=no
-        ;;
-      *)
-        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
-        ;;
-      esac
-      if test "$wrappers_required" = no; then
-	# Replace the output file specification.
-	compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
-	link_command="$compile_command$compile_rpath"
-
-	# We have no uninstalled library dependencies, so finalize right now.
-	exit_status=0
-	func_show_eval "$link_command" 'exit_status=$?'
-
-	# Delete the generated files.
-	if test -f "$output_objdir/${outputname}S.${objext}"; then
-	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
-	fi
-
-	exit $exit_status
-      fi
-
-      if test -n "$compile_shlibpath$finalize_shlibpath"; then
-	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
-      fi
-      if test -n "$finalize_shlibpath"; then
-	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
-      fi
-
-      compile_var=
-      finalize_var=
-      if test -n "$runpath_var"; then
-	if test -n "$perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $perm_rpath; do
-	    rpath="$rpath$dir:"
-	  done
-	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-	if test -n "$finalize_perm_rpath"; then
-	  # We should set the runpath_var.
-	  rpath=
-	  for dir in $finalize_perm_rpath; do
-	    rpath="$rpath$dir:"
-	  done
-	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
-	fi
-      fi
-
-      if test "$no_install" = yes; then
-	# We don't need to create a wrapper script.
-	link_command="$compile_var$compile_command$compile_rpath"
-	# Replace the output file specification.
-	link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
-	# Delete the old output file.
-	$opt_dry_run || $RM $output
-	# Link the executable and exit
-	func_show_eval "$link_command" 'exit $?'
-	exit $EXIT_SUCCESS
-      fi
-
-      if test "$hardcode_action" = relink; then
-	# Fast installation is not supported
-	link_command="$compile_var$compile_command$compile_rpath"
-	relink_command="$finalize_var$finalize_command$finalize_rpath"
-
-	func_warning "this platform does not like uninstalled shared libraries"
-	func_warning "\`$output' will be relinked during installation"
-      else
-	if test "$fast_install" != no; then
-	  link_command="$finalize_var$compile_command$finalize_rpath"
-	  if test "$fast_install" = yes; then
-	    relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
-	  else
-	    # fast_install is set to needless
-	    relink_command=
-	  fi
-	else
-	  link_command="$compile_var$compile_command$compile_rpath"
-	  relink_command="$finalize_var$finalize_command$finalize_rpath"
-	fi
-      fi
-
-      # Replace the output file specification.
-      link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
-
-      # Delete the old output files.
-      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
-
-      func_show_eval "$link_command" 'exit $?'
-
-      # Now create the wrapper script.
-      func_verbose "creating $output"
-
-      # Quote the relink command for shipping.
-      if test -n "$relink_command"; then
-	# Preserve any variables that may affect compiler behavior
-	for var in $variables_saved_for_relink; do
-	  if eval test -z \"\${$var+set}\"; then
-	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
-	  elif eval var_value=\$$var; test -z "$var_value"; then
-	    relink_command="$var=; export $var; $relink_command"
-	  else
-	    func_quote_for_eval "$var_value"
-	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
-	  fi
-	done
-	relink_command="(cd `pwd`; $relink_command)"
-	relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
-      fi
-
-      # Quote $ECHO for shipping.
-      if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then
-	case $progpath in
-	[\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
-	*) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
-	esac
-	qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"`
-      else
-	qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"`
-      fi
-
-      # Only actually do things if not in dry run mode.
-      $opt_dry_run || {
-	# win32 will think the script is a binary if it has
-	# a .exe suffix, so we strip it off here.
-	case $output in
-	  *.exe) func_stripname '' '.exe' "$output"
-	         output=$func_stripname_result ;;
-	esac
-	# test for cygwin because mv fails w/o .exe extensions
-	case $host in
-	  *cygwin*)
-	    exeext=.exe
-	    func_stripname '' '.exe' "$outputname"
-	    outputname=$func_stripname_result ;;
-	  *) exeext= ;;
-	esac
-	case $host in
-	  *cygwin* | *mingw* )
-	    func_dirname_and_basename "$output" "" "."
-	    output_name=$func_basename_result
-	    output_path=$func_dirname_result
-	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
-	    cwrapper="$output_path/$output_name.exe"
-	    $RM $cwrappersource $cwrapper
-	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
-
-	    func_emit_cwrapperexe_src > $cwrappersource
-
-	    # The wrapper executable is built using the $host compiler,
-	    # because it contains $host paths and files. If cross-
-	    # compiling, it, like the target executable, must be
-	    # executed on the $host or under an emulation environment.
-	    $opt_dry_run || {
-	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
-	      $STRIP $cwrapper
-	    }
-
-	    # Now, create the wrapper script for func_source use:
-	    func_ltwrapper_scriptname $cwrapper
-	    $RM $func_ltwrapper_scriptname_result
-	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
-	    $opt_dry_run || {
-	      # note: this script will not be executed, so do not chmod.
-	      if test "x$build" = "x$host" ; then
-		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
-	      else
-		func_emit_wrapper no > $func_ltwrapper_scriptname_result
-	      fi
-	    }
-	  ;;
-	  * )
-	    $RM $output
-	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
-
-	    func_emit_wrapper no > $output
-	    chmod +x $output
-	  ;;
-	esac
-      }
-      exit $EXIT_SUCCESS
-      ;;
-    esac
-
-    # See if we need to build an old-fashioned archive.
-    for oldlib in $oldlibs; do
-
-      if test "$build_libtool_libs" = convenience; then
-	oldobjs="$libobjs_save $symfileobj"
-	addlibs="$convenience"
-	build_libtool_libs=no
-      else
-	if test "$build_libtool_libs" = module; then
-	  oldobjs="$libobjs_save"
-	  build_libtool_libs=no
-	else
-	  oldobjs="$old_deplibs $non_pic_objects"
-	  if test "$preload" = yes && test -f "$symfileobj"; then
-	    oldobjs="$oldobjs $symfileobj"
-	  fi
-	fi
-	addlibs="$old_convenience"
-      fi
-
-      if test -n "$addlibs"; then
-	gentop="$output_objdir/${outputname}x"
-	generated="$generated $gentop"
-
-	func_extract_archives $gentop $addlibs
-	oldobjs="$oldobjs $func_extract_archives_result"
-      fi
-
-      # Do each command in the archive commands.
-      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
-	cmds=$old_archive_from_new_cmds
-      else
-
-	# Add any objects from preloaded convenience libraries
-	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
-	  generated="$generated $gentop"
-
-	  func_extract_archives $gentop $dlprefiles
-	  oldobjs="$oldobjs $func_extract_archives_result"
-	fi
-
-	# POSIX demands no paths to be encoded in archives.  We have
-	# to avoid creating archives with duplicate basenames if we
-	# might have to extract them afterwards, e.g., when creating a
-	# static archive out of a convenience library, or when linking
-	# the entirety of a libtool archive into another (currently
-	# not supported by libtool).
-	if (for obj in $oldobjs
-	    do
-	      func_basename "$obj"
-	      $ECHO "$func_basename_result"
-	    done | sort | sort -uc >/dev/null 2>&1); then
-	  :
-	else
-	  $ECHO "copying selected object files to avoid basename conflicts..."
-	  gentop="$output_objdir/${outputname}x"
-	  generated="$generated $gentop"
-	  func_mkdir_p "$gentop"
-	  save_oldobjs=$oldobjs
-	  oldobjs=
-	  counter=1
-	  for obj in $save_oldobjs
-	  do
-	    func_basename "$obj"
-	    objbase="$func_basename_result"
-	    case " $oldobjs " in
-	    " ") oldobjs=$obj ;;
-	    *[\ /]"$objbase "*)
-	      while :; do
-		# Make sure we don't pick an alternate name that also
-		# overlaps.
-		newobj=lt$counter-$objbase
-		func_arith $counter + 1
-		counter=$func_arith_result
-		case " $oldobjs " in
-		*[\ /]"$newobj "*) ;;
-		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
-		esac
-	      done
-	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
-	      oldobjs="$oldobjs $gentop/$newobj"
-	      ;;
-	    *) oldobjs="$oldobjs $obj" ;;
-	    esac
-	  done
-	fi
-	eval cmds=\"$old_archive_cmds\"
-
-	func_len " $cmds"
-	len=$func_len_result
-	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
-	  cmds=$old_archive_cmds
-	else
-	  # the command line is too long to link in one step, link in parts
-	  func_verbose "using piecewise archive linking..."
-	  save_RANLIB=$RANLIB
-	  RANLIB=:
-	  objlist=
-	  concat_cmds=
-	  save_oldobjs=$oldobjs
-	  oldobjs=
-	  # Is there a better way of finding the last object in the list?
-	  for obj in $save_oldobjs
-	  do
-	    last_oldobj=$obj
-	  done
-	  eval test_cmds=\"$old_archive_cmds\"
-	  func_len " $test_cmds"
-	  len0=$func_len_result
-	  len=$len0
-	  for obj in $save_oldobjs
-	  do
-	    func_len " $obj"
-	    func_arith $len + $func_len_result
-	    len=$func_arith_result
-	    func_append objlist " $obj"
-	    if test "$len" -lt "$max_cmd_len"; then
-	      :
-	    else
-	      # the above command should be used before it gets too long
-	      oldobjs=$objlist
-	      if test "$obj" = "$last_oldobj" ; then
-		RANLIB=$save_RANLIB
-	      fi
-	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
-	      objlist=
-	      len=$len0
-	    fi
-	  done
-	  RANLIB=$save_RANLIB
-	  oldobjs=$objlist
-	  if test "X$oldobjs" = "X" ; then
-	    eval cmds=\"\$concat_cmds\"
-	  else
-	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
-	  fi
-	fi
-      fi
-      func_execute_cmds "$cmds" 'exit $?'
-    done
-
-    test -n "$generated" && \
-      func_show_eval "${RM}r$generated"
-
-    # Now create the libtool archive.
-    case $output in
-    *.la)
-      old_library=
-      test "$build_old_libs" = yes && old_library="$libname.$libext"
-      func_verbose "creating $output"
-
-      # Preserve any variables that may affect compiler behavior
-      for var in $variables_saved_for_relink; do
-	if eval test -z \"\${$var+set}\"; then
-	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
-	elif eval var_value=\$$var; test -z "$var_value"; then
-	  relink_command="$var=; export $var; $relink_command"
-	else
-	  func_quote_for_eval "$var_value"
-	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
-	fi
-      done
-      # Quote the link command for shipping.
-      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
-      relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
-      if test "$hardcode_automatic" = yes ; then
-	relink_command=
-      fi
-
-      # Only create the output if not a dry run.
-      $opt_dry_run || {
-	for installed in no yes; do
-	  if test "$installed" = yes; then
-	    if test -z "$install_libdir"; then
-	      break
-	    fi
-	    output="$output_objdir/$outputname"i
-	    # Replace all uninstalled libtool libraries with the installed ones
-	    newdependency_libs=
-	    for deplib in $dependency_libs; do
-	      case $deplib in
-	      *.la)
-		func_basename "$deplib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$deplib' is not a valid libtool archive"
-		newdependency_libs="$newdependency_libs $libdir/$name"
-		;;
-	      *) newdependency_libs="$newdependency_libs $deplib" ;;
-	      esac
-	    done
-	    dependency_libs="$newdependency_libs"
-	    newdlfiles=
-
-	    for lib in $dlfiles; do
-	      case $lib in
-	      *.la)
-	        func_basename "$lib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
-		newdlfiles="$newdlfiles $libdir/$name"
-		;;
-	      *) newdlfiles="$newdlfiles $lib" ;;
-	      esac
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      case $lib in
-	      *.la)
-		# Only pass preopened files to the pseudo-archive (for
-		# eventual linking with the app. that links it) if we
-		# didn't already link the preopened objects directly into
-		# the library:
-		func_basename "$lib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
-		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
-		newdlprefiles="$newdlprefiles $libdir/$name"
-		;;
-	      esac
-	    done
-	    dlprefiles="$newdlprefiles"
-	  else
-	    newdlfiles=
-	    for lib in $dlfiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      newdlfiles="$newdlfiles $abs"
-	    done
-	    dlfiles="$newdlfiles"
-	    newdlprefiles=
-	    for lib in $dlprefiles; do
-	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
-		*) abs=`pwd`"/$lib" ;;
-	      esac
-	      newdlprefiles="$newdlprefiles $abs"
-	    done
-	    dlprefiles="$newdlprefiles"
-	  fi
-	  $RM $output
-	  # place dlname in correct position for cygwin
-	  tdlname=$dlname
-	  case $host,$output,$installed,$module,$dlname in
-	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
-	  esac
-	  $ECHO > $output "\
-# $outputname - a libtool library file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# The name that we can dlopen(3).
-dlname='$tdlname'
-
-# Names of this library.
-library_names='$library_names'
-
-# The name of the static archive.
-old_library='$old_library'
-
-# Linker flags that can not go in dependency_libs.
-inherited_linker_flags='$new_inherited_linker_flags'
-
-# Libraries that this one depends upon.
-dependency_libs='$dependency_libs'
-
-# Names of additional weak libraries provided by this library
-weak_library_names='$weak_libs'
-
-# Version information for $libname.
-current=$current
-age=$age
-revision=$revision
-
-# Is this an already installed library?
-installed=$installed
-
-# Should we warn about portability when linking against -modules?
-shouldnotlink=$module
-
-# Files to dlopen/dlpreopen
-dlopen='$dlfiles'
-dlpreopen='$dlprefiles'
-
-# Directory that this library needs to be installed in:
-libdir='$install_libdir'"
-	  if test "$installed" = no && test "$need_relink" = yes; then
-	    $ECHO >> $output "\
-relink_command=\"$relink_command\""
-	  fi
-	done
-      }
-
-      # Do a symbolic link so that the libtool archive can be found in
-      # LD_LIBRARY_PATH before the program is installed.
-      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
-      ;;
-    esac
-    exit $EXIT_SUCCESS
-}
-
-{ test "$mode" = link || test "$mode" = relink; } &&
-    func_mode_link ${1+"$@"}
-
-
-# func_mode_uninstall arg...
-func_mode_uninstall ()
-{
-    $opt_debug
-    RM="$nonopt"
-    files=
-    rmforce=
-    exit_status=0
-
-    # This variable tells wrapper scripts just to set variables rather
-    # than running their programs.
-    libtool_install_magic="$magic"
-
-    for arg
-    do
-      case $arg in
-      -f) RM="$RM $arg"; rmforce=yes ;;
-      -*) RM="$RM $arg" ;;
-      *) files="$files $arg" ;;
-      esac
-    done
-
-    test -z "$RM" && \
-      func_fatal_help "you must specify an RM program"
-
-    rmdirs=
-
-    origobjdir="$objdir"
-    for file in $files; do
-      func_dirname "$file" "" "."
-      dir="$func_dirname_result"
-      if test "X$dir" = X.; then
-	objdir="$origobjdir"
-      else
-	objdir="$dir/$origobjdir"
-      fi
-      func_basename "$file"
-      name="$func_basename_result"
-      test "$mode" = uninstall && objdir="$dir"
-
-      # Remember objdir for removal later, being careful to avoid duplicates
-      if test "$mode" = clean; then
-	case " $rmdirs " in
-	  *" $objdir "*) ;;
-	  *) rmdirs="$rmdirs $objdir" ;;
-	esac
-      fi
-
-      # Don't error if the file doesn't exist and rm -f was used.
-      if { test -L "$file"; } >/dev/null 2>&1 ||
-	 { test -h "$file"; } >/dev/null 2>&1 ||
-	 test -f "$file"; then
-	:
-      elif test -d "$file"; then
-	exit_status=1
-	continue
-      elif test "$rmforce" = yes; then
-	continue
-      fi
-
-      rmfiles="$file"
-
-      case $name in
-      *.la)
-	# Possibly a libtool archive, so verify it.
-	if func_lalib_p "$file"; then
-	  func_source $dir/$name
-
-	  # Delete the libtool libraries and symlinks.
-	  for n in $library_names; do
-	    rmfiles="$rmfiles $objdir/$n"
-	  done
-	  test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
-
-	  case "$mode" in
-	  clean)
-	    case "  $library_names " in
-	    # "  " in the beginning catches empty $dlname
-	    *" $dlname "*) ;;
-	    *) rmfiles="$rmfiles $objdir/$dlname" ;;
-	    esac
-	    test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
-	    ;;
-	  uninstall)
-	    if test -n "$library_names"; then
-	      # Do each command in the postuninstall commands.
-	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
-	    fi
-
-	    if test -n "$old_library"; then
-	      # Do each command in the old_postuninstall commands.
-	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
-	    fi
-	    # FIXME: should reinstall the best remaining shared library.
-	    ;;
-	  esac
-	fi
-	;;
-
-      *.lo)
-	# Possibly a libtool object, so verify it.
-	if func_lalib_p "$file"; then
-
-	  # Read the .lo file
-	  func_source $dir/$name
-
-	  # Add PIC object to the list of files to remove.
-	  if test -n "$pic_object" &&
-	     test "$pic_object" != none; then
-	    rmfiles="$rmfiles $dir/$pic_object"
-	  fi
-
-	  # Add non-PIC object to the list of files to remove.
-	  if test -n "$non_pic_object" &&
-	     test "$non_pic_object" != none; then
-	    rmfiles="$rmfiles $dir/$non_pic_object"
-	  fi
-	fi
-	;;
-
-      *)
-	if test "$mode" = clean ; then
-	  noexename=$name
-	  case $file in
-	  *.exe)
-	    func_stripname '' '.exe' "$file"
-	    file=$func_stripname_result
-	    func_stripname '' '.exe' "$name"
-	    noexename=$func_stripname_result
-	    # $file with .exe has already been added to rmfiles,
-	    # add $file without .exe
-	    rmfiles="$rmfiles $file"
-	    ;;
-	  esac
-	  # Do a test to see if this is a libtool program.
-	  if func_ltwrapper_p "$file"; then
-	    if func_ltwrapper_executable_p "$file"; then
-	      func_ltwrapper_scriptname "$file"
-	      relink_command=
-	      func_source $func_ltwrapper_scriptname_result
-	      rmfiles="$rmfiles $func_ltwrapper_scriptname_result"
-	    else
-	      relink_command=
-	      func_source $dir/$noexename
-	    fi
-
-	    # note $name still contains .exe if it was in $file originally
-	    # as does the version of $file that was added into $rmfiles
-	    rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
-	    if test "$fast_install" = yes && test -n "$relink_command"; then
-	      rmfiles="$rmfiles $objdir/lt-$name"
-	    fi
-	    if test "X$noexename" != "X$name" ; then
-	      rmfiles="$rmfiles $objdir/lt-${noexename}.c"
-	    fi
-	  fi
-	fi
-	;;
-      esac
-      func_show_eval "$RM $rmfiles" 'exit_status=1'
-    done
-    objdir="$origobjdir"
-
-    # Try to remove the ${objdir}s in the directories where we deleted files
-    for dir in $rmdirs; do
-      if test -d "$dir"; then
-	func_show_eval "rmdir $dir >/dev/null 2>&1"
-      fi
-    done
-
-    exit $exit_status
-}
-
-{ test "$mode" = uninstall || test "$mode" = clean; } &&
-    func_mode_uninstall ${1+"$@"}
-
-test -z "$mode" && {
-  help="$generic_help"
-  func_fatal_help "you must specify a MODE"
-}
-
-test -z "$exec_cmd" && \
-  func_fatal_help "invalid operation mode \`$mode'"
-
-if test -n "$exec_cmd"; then
-  eval exec "$exec_cmd"
-  exit $EXIT_FAILURE
-fi
-
-exit $exit_status
-
-
-# The TAGs below are defined such that we never get into a situation
-# in which we disable both kinds of libraries.  Given conflicting
-# choices, we go for a static library, that is the most portable,
-# since we can't tell whether shared libraries were disabled because
-# the user asked for that or because the platform doesn't support
-# them.  This is particularly important on AIX, because we don't
-# support having both static and shared libraries enabled at the same
-# time on that platform, so we default to a shared-only configuration.
-# If a disable-shared tag is given, we'll fallback to a static-only
-# configuration.  But we'll never go from static-only to shared-only.
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
-build_libtool_libs=no
-build_old_libs=yes
-# ### END LIBTOOL TAG CONFIG: disable-shared
-
-# ### BEGIN LIBTOOL TAG CONFIG: disable-static
-build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
-# ### END LIBTOOL TAG CONFIG: disable-static
-
-# Local Variables:
-# mode:shell-script
-# sh-indentation:2
-# End:
-# vi:sw=2
-
diff --git a/cloog-0.17.0/osl/autoconf/ltoptions.m4 b/cloog-0.17.0/osl/autoconf/ltoptions.m4
deleted file mode 100644
index 34151a3..0000000
--- a/cloog-0.17.0/osl/autoconf/ltoptions.m4
+++ /dev/null
@@ -1,368 +0,0 @@
-# Helper functions for option handling.                    -*- Autoconf -*-
-#
-#   Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
-#   Written by Gary V. Vaughan, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 6 ltoptions.m4
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
-
-
-# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
-# ------------------------------------------
-m4_define([_LT_MANGLE_OPTION],
-[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
-
-
-# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
-# ---------------------------------------
-# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
-# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
-# saved as a flag.
-m4_define([_LT_SET_OPTION],
-[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
-m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
-        _LT_MANGLE_DEFUN([$1], [$2]),
-    [m4_warning([Unknown $1 option `$2'])])[]dnl
-])
-
-
-# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
-# ------------------------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-m4_define([_LT_IF_OPTION],
-[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
-
-
-# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
-# -------------------------------------------------------
-# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
-# are set.
-m4_define([_LT_UNLESS_OPTIONS],
-[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
-	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
-		      [m4_define([$0_found])])])[]dnl
-m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
-])[]dnl
-])
-
-
-# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
-# ----------------------------------------
-# OPTION-LIST is a space-separated list of Libtool options associated
-# with MACRO-NAME.  If any OPTION has a matching handler declared with
-# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
-# the unknown option and exit.
-m4_defun([_LT_SET_OPTIONS],
-[# Set options
-m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
-    [_LT_SET_OPTION([$1], _LT_Option)])
-
-m4_if([$1],[LT_INIT],[
-  dnl
-  dnl Simply set some default values (i.e off) if boolean options were not
-  dnl specified:
-  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
-  ])
-  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
-  ])
-  dnl
-  dnl If no reference was made to various pairs of opposing options, then
-  dnl we run the default mode handler for the pair.  For example, if neither
-  dnl `shared' nor `disable-shared' was passed, we enable building of shared
-  dnl archives by default:
-  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
-  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
-  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
-  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
-  		   [_LT_ENABLE_FAST_INSTALL])
-  ])
-])# _LT_SET_OPTIONS
-
-
-## --------------------------------- ##
-## Macros to handle LT_INIT options. ##
-## --------------------------------- ##
-
-# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
-# -----------------------------------------
-m4_define([_LT_MANGLE_DEFUN],
-[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
-
-
-# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
-# -----------------------------------------------
-m4_define([LT_OPTION_DEFINE],
-[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
-])# LT_OPTION_DEFINE
-
-
-# dlopen
-# ------
-LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
-])
-
-AU_DEFUN([AC_LIBTOOL_DLOPEN],
-[_LT_SET_OPTION([LT_INIT], [dlopen])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `dlopen' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
-
-
-# win32-dll
-# ---------
-# Declare package support for building win32 dll's.
-LT_OPTION_DEFINE([LT_INIT], [win32-dll],
-[enable_win32_dll=yes
-
-case $host in
-*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*)
-  AC_CHECK_TOOL(AS, as, false)
-  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
-  AC_CHECK_TOOL(OBJDUMP, objdump, false)
-  ;;
-esac
-
-test -z "$AS" && AS=as
-_LT_DECL([], [AS],      [0], [Assembler program])dnl
-
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl
-])# win32-dll
-
-AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-_LT_SET_OPTION([LT_INIT], [win32-dll])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `win32-dll' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
-
-
-# _LT_ENABLE_SHARED([DEFAULT])
-# ----------------------------
-# implement the --enable-shared flag, and supports the `shared' and
-# `disable-shared' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_SHARED],
-[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([shared],
-    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
-	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
-
-    _LT_DECL([build_libtool_libs], [enable_shared], [0],
-	[Whether or not to build shared libraries])
-])# _LT_ENABLE_SHARED
-
-LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
-
-# Old names:
-AC_DEFUN([AC_ENABLE_SHARED],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
-])
-
-AC_DEFUN([AC_DISABLE_SHARED],
-[_LT_SET_OPTION([LT_INIT], [disable-shared])
-])
-
-AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
-AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_ENABLE_SHARED], [])
-dnl AC_DEFUN([AM_DISABLE_SHARED], [])
-
-
-
-# _LT_ENABLE_STATIC([DEFAULT])
-# ----------------------------
-# implement the --enable-static flag, and support the `static' and
-# `disable-static' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_STATIC],
-[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([static],
-    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
-	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
-
-    _LT_DECL([build_old_libs], [enable_static], [0],
-	[Whether or not to build static libraries])
-])# _LT_ENABLE_STATIC
-
-LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
-
-# Old names:
-AC_DEFUN([AC_ENABLE_STATIC],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
-])
-
-AC_DEFUN([AC_DISABLE_STATIC],
-[_LT_SET_OPTION([LT_INIT], [disable-static])
-])
-
-AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
-AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_ENABLE_STATIC], [])
-dnl AC_DEFUN([AM_DISABLE_STATIC], [])
-
-
-
-# _LT_ENABLE_FAST_INSTALL([DEFAULT])
-# ----------------------------------
-# implement the --enable-fast-install flag, and support the `fast-install'
-# and `disable-fast-install' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_FAST_INSTALL],
-[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([fast-install],
-    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
-    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
-
-_LT_DECL([fast_install], [enable_fast_install], [0],
-	 [Whether or not to optimize for fast installation])dnl
-])# _LT_ENABLE_FAST_INSTALL
-
-LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
-
-# Old names:
-AU_DEFUN([AC_ENABLE_FAST_INSTALL],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `fast-install' option into LT_INIT's first parameter.])
-])
-
-AU_DEFUN([AC_DISABLE_FAST_INSTALL],
-[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `disable-fast-install' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
-dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
-
-
-# _LT_WITH_PIC([MODE])
-# --------------------
-# implement the --with-pic flag, and support the `pic-only' and `no-pic'
-# LT_INIT options.
-# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
-m4_define([_LT_WITH_PIC],
-[AC_ARG_WITH([pic],
-    [AS_HELP_STRING([--with-pic],
-	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
-    [pic_mode="$withval"],
-    [pic_mode=default])
-
-test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
-
-_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
-])# _LT_WITH_PIC
-
-LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
-LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
-
-# Old name:
-AU_DEFUN([AC_LIBTOOL_PICMODE],
-[_LT_SET_OPTION([LT_INIT], [pic-only])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `pic-only' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
-
-## ----------------- ##
-## LTDL_INIT Options ##
-## ----------------- ##
-
-m4_define([_LTDL_MODE], [])
-LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
-		 [m4_define([_LTDL_MODE], [nonrecursive])])
-LT_OPTION_DEFINE([LTDL_INIT], [recursive],
-		 [m4_define([_LTDL_MODE], [recursive])])
-LT_OPTION_DEFINE([LTDL_INIT], [subproject],
-		 [m4_define([_LTDL_MODE], [subproject])])
-
-m4_define([_LTDL_TYPE], [])
-LT_OPTION_DEFINE([LTDL_INIT], [installable],
-		 [m4_define([_LTDL_TYPE], [installable])])
-LT_OPTION_DEFINE([LTDL_INIT], [convenience],
-		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/cloog-0.17.0/osl/autoconf/ltsugar.m4 b/cloog-0.17.0/osl/autoconf/ltsugar.m4
deleted file mode 100644
index 9000a05..0000000
--- a/cloog-0.17.0/osl/autoconf/ltsugar.m4
+++ /dev/null
@@ -1,123 +0,0 @@
-# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
-#
-# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
-# Written by Gary V. Vaughan, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 6 ltsugar.m4
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
-
-
-# lt_join(SEP, ARG1, [ARG2...])
-# -----------------------------
-# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
-# associated separator.
-# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
-# versions in m4sugar had bugs.
-m4_define([lt_join],
-[m4_if([$#], [1], [],
-       [$#], [2], [[$2]],
-       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
-m4_define([_lt_join],
-[m4_if([$#$2], [2], [],
-       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
-
-
-# lt_car(LIST)
-# lt_cdr(LIST)
-# ------------
-# Manipulate m4 lists.
-# These macros are necessary as long as will still need to support
-# Autoconf-2.59 which quotes differently.
-m4_define([lt_car], [[$1]])
-m4_define([lt_cdr],
-[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
-       [$#], 1, [],
-       [m4_dquote(m4_shift($@))])])
-m4_define([lt_unquote], $1)
-
-
-# lt_append(MACRO-NAME, STRING, [SEPARATOR])
-# ------------------------------------------
-# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
-# Note that neither SEPARATOR nor STRING are expanded; they are appended
-# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
-# No SEPARATOR is output if MACRO-NAME was previously undefined (different
-# than defined and empty).
-#
-# This macro is needed until we can rely on Autoconf 2.62, since earlier
-# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
-m4_define([lt_append],
-[m4_define([$1],
-	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
-
-
-
-# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
-# ----------------------------------------------------------
-# Produce a SEP delimited list of all paired combinations of elements of
-# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
-# has the form PREFIXmINFIXSUFFIXn.
-# Needed until we can rely on m4_combine added in Autoconf 2.62.
-m4_define([lt_combine],
-[m4_if(m4_eval([$# > 3]), [1],
-       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
-[[m4_foreach([_Lt_prefix], [$2],
-	     [m4_foreach([_Lt_suffix],
-		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
-	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
-
-
-# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
-# -----------------------------------------------------------------------
-# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
-# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
-m4_define([lt_if_append_uniq],
-[m4_ifdef([$1],
-	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
-		 [lt_append([$1], [$2], [$3])$4],
-		 [$5])],
-	  [lt_append([$1], [$2], [$3])$4])])
-
-
-# lt_dict_add(DICT, KEY, VALUE)
-# -----------------------------
-m4_define([lt_dict_add],
-[m4_define([$1($2)], [$3])])
-
-
-# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
-# --------------------------------------------
-m4_define([lt_dict_add_subkey],
-[m4_define([$1($2:$3)], [$4])])
-
-
-# lt_dict_fetch(DICT, KEY, [SUBKEY])
-# ----------------------------------
-m4_define([lt_dict_fetch],
-[m4_ifval([$3],
-	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
-    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
-
-
-# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
-# -----------------------------------------------------------------
-m4_define([lt_if_dict_fetch],
-[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
-	[$5],
-    [$6])])
-
-
-# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
-# --------------------------------------------------------------
-m4_define([lt_dict_filter],
-[m4_if([$5], [], [],
-  [lt_join(m4_quote(m4_default([$4], [[, ]])),
-           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
-		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
-])
diff --git a/cloog-0.17.0/osl/autoconf/ltversion.m4 b/cloog-0.17.0/osl/autoconf/ltversion.m4
deleted file mode 100644
index f3c5309..0000000
--- a/cloog-0.17.0/osl/autoconf/ltversion.m4
+++ /dev/null
@@ -1,23 +0,0 @@
-# ltversion.m4 -- version numbers			-*- Autoconf -*-
-#
-#   Copyright (C) 2004 Free Software Foundation, Inc.
-#   Written by Scott James Remnant, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# Generated from ltversion.in.
-
-# serial 3017 ltversion.m4
-# This file is part of GNU Libtool
-
-m4_define([LT_PACKAGE_VERSION], [2.2.6b])
-m4_define([LT_PACKAGE_REVISION], [1.3017])
-
-AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.2.6b'
-macro_revision='1.3017'
-_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
-_LT_DECL(, macro_revision, 0)
-])
diff --git a/cloog-0.17.0/osl/autoconf/lt~obsolete.m4 b/cloog-0.17.0/osl/autoconf/lt~obsolete.m4
deleted file mode 100644
index 637bb20..0000000
--- a/cloog-0.17.0/osl/autoconf/lt~obsolete.m4
+++ /dev/null
@@ -1,92 +0,0 @@
-# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
-#
-#   Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
-#   Written by Scott James Remnant, 2004.
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 4 lt~obsolete.m4
-
-# These exist entirely to fool aclocal when bootstrapping libtool.
-#
-# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
-# which have later been changed to m4_define as they aren't part of the
-# exported API, or moved to Autoconf or Automake where they belong.
-#
-# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
-# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
-# using a macro with the same name in our local m4/libtool.m4 it'll
-# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
-# and doesn't know about Autoconf macros at all.)
-#
-# So we provide this file, which has a silly filename so it's always
-# included after everything else.  This provides aclocal with the
-# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
-# because those macros already exist, or will be overwritten later.
-# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
-#
-# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
-# Yes, that means every name once taken will need to remain here until
-# we give up compatibility with versions before 1.7, at which point
-# we need to keep only those names which we still refer to.
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
-
-m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
-m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
-m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
-m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
-m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
-m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
-m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
-m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
-m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
-m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
-m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
-m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
-m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
-m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
-m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
-m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
-m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
-m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
-m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
-m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
-m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
-m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
-m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
-m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
-m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
-m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
-m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
-m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
-m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
-m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
-m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
-m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
-m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
-m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
-m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
-m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
-m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
-m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
-m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
-m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
-m4_ifndef([AC_LIBTOOL_RC],		[AC_DEFUN([AC_LIBTOOL_RC])])
-m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
-m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
-m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
-m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
-m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
-m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
-m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
-m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
diff --git a/cloog-0.17.0/osl/autoconf/missing b/cloog-0.17.0/osl/autoconf/missing
deleted file mode 100755
index 28055d2..0000000
--- a/cloog-0.17.0/osl/autoconf/missing
+++ /dev/null
@@ -1,376 +0,0 @@
-#! /bin/sh
-# Common stub for a few missing GNU programs while installing.
-
-scriptversion=2009-04-28.21; # UTC
-
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
-# 2008, 2009 Free Software Foundation, Inc.
-# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-if test $# -eq 0; then
-  echo 1>&2 "Try \`$0 --help' for more information"
-  exit 1
-fi
-
-run=:
-sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
-sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
-
-# In the cases where this matters, `missing' is being run in the
-# srcdir already.
-if test -f configure.ac; then
-  configure_ac=configure.ac
-else
-  configure_ac=configure.in
-fi
-
-msg="missing on your system"
-
-case $1 in
---run)
-  # Try to run requested program, and just exit if it succeeds.
-  run=
-  shift
-  "$@" && exit 0
-  # Exit code 63 means version mismatch.  This often happens
-  # when the user try to use an ancient version of a tool on
-  # a file that requires a minimum version.  In this case we
-  # we should proceed has if the program had been absent, or
-  # if --run hadn't been passed.
-  if test $? = 63; then
-    run=:
-    msg="probably too old"
-  fi
-  ;;
-
-  -h|--h|--he|--hel|--help)
-    echo "\
-$0 [OPTION]... PROGRAM [ARGUMENT]...
-
-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
-error status if there is no known handling for PROGRAM.
-
-Options:
-  -h, --help      display this help and exit
-  -v, --version   output version information and exit
-  --run           try to run the given command, and emulate it if it fails
-
-Supported PROGRAM values:
-  aclocal      touch file \`aclocal.m4'
-  autoconf     touch file \`configure'
-  autoheader   touch file \`config.h.in'
-  autom4te     touch the output file, or create a stub one
-  automake     touch all \`Makefile.in' files
-  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
-  flex         create \`lex.yy.c', if possible, from existing .c
-  help2man     touch the output file
-  lex          create \`lex.yy.c', if possible, from existing .c
-  makeinfo     touch the output file
-  tar          try tar, gnutar, gtar, then tar without non-portable flags
-  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
-
-Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
-\`g' are ignored when checking the name.
-
-Send bug reports to <bug-automake@gnu.org>."
-    exit $?
-    ;;
-
-  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
-    echo "missing $scriptversion (GNU Automake)"
-    exit $?
-    ;;
-
-  -*)
-    echo 1>&2 "$0: Unknown \`$1' option"
-    echo 1>&2 "Try \`$0 --help' for more information"
-    exit 1
-    ;;
-
-esac
-
-# normalize program name to check for.
-program=`echo "$1" | sed '
-  s/^gnu-//; t
-  s/^gnu//; t
-  s/^g//; t'`
-
-# Now exit if we have it, but it failed.  Also exit now if we
-# don't have it and --version was passed (most likely to detect
-# the program).  This is about non-GNU programs, so use $1 not
-# $program.
-case $1 in
-  lex*|yacc*)
-    # Not GNU programs, they don't have --version.
-    ;;
-
-  tar*)
-    if test -n "$run"; then
-       echo 1>&2 "ERROR: \`tar' requires --run"
-       exit 1
-    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
-       exit 1
-    fi
-    ;;
-
-  *)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
-       # Could not run --version or --help.  This is probably someone
-       # running `$TOOL --version' or `$TOOL --help' to check whether
-       # $TOOL exists and not knowing $TOOL uses missing.
-       exit 1
-    fi
-    ;;
-esac
-
-# If it does not exist, or fails to run (possibly an outdated version),
-# try to emulate it.
-case $program in
-  aclocal*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
-         to install the \`Automake' and \`Perl' packages.  Grab them from
-         any GNU archive site."
-    touch aclocal.m4
-    ;;
-
-  autoconf*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`${configure_ac}'.  You might want to install the
-         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
-         archive site."
-    touch configure
-    ;;
-
-  autoheader*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
-         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
-         from any GNU archive site."
-    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
-    test -z "$files" && files="config.h"
-    touch_files=
-    for f in $files; do
-      case $f in
-      *:*) touch_files="$touch_files "`echo "$f" |
-				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
-      *) touch_files="$touch_files $f.in";;
-      esac
-    done
-    touch $touch_files
-    ;;
-
-  automake*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
-         You might want to install the \`Automake' and \`Perl' packages.
-         Grab them from any GNU archive site."
-    find . -type f -name Makefile.am -print |
-	   sed 's/\.am$/.in/' |
-	   while read f; do touch "$f"; done
-    ;;
-
-  autom4te*)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, but is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.
-         You can get \`$1' as part of \`Autoconf' from any GNU
-         archive site."
-
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -f "$file"; then
-	touch $file
-    else
-	test -z "$file" || exec >$file
-	echo "#! /bin/sh"
-	echo "# Created by GNU Automake missing as a replacement of"
-	echo "#  $ $@"
-	echo "exit 0"
-	chmod +x $file
-	exit 1
-    fi
-    ;;
-
-  bison*|yacc*)
-    echo 1>&2 "\
-WARNING: \`$1' $msg.  You should only need it if
-         you modified a \`.y' file.  You may need the \`Bison' package
-         in order for those modifications to take effect.  You can get
-         \`Bison' from any GNU archive site."
-    rm -f y.tab.c y.tab.h
-    if test $# -ne 1; then
-        eval LASTARG="\${$#}"
-	case $LASTARG in
-	*.y)
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" y.tab.c
-	    fi
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" y.tab.h
-	    fi
-	  ;;
-	esac
-    fi
-    if test ! -f y.tab.h; then
-	echo >y.tab.h
-    fi
-    if test ! -f y.tab.c; then
-	echo 'main() { return 0; }' >y.tab.c
-    fi
-    ;;
-
-  lex*|flex*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.l' file.  You may need the \`Flex' package
-         in order for those modifications to take effect.  You can get
-         \`Flex' from any GNU archive site."
-    rm -f lex.yy.c
-    if test $# -ne 1; then
-        eval LASTARG="\${$#}"
-	case $LASTARG in
-	*.l)
-	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" lex.yy.c
-	    fi
-	  ;;
-	esac
-    fi
-    if test ! -f lex.yy.c; then
-	echo 'main() { return 0; }' >lex.yy.c
-    fi
-    ;;
-
-  help2man*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-	 you modified a dependency of a manual page.  You may need the
-	 \`Help2man' package in order for those modifications to take
-	 effect.  You can get \`Help2man' from any GNU archive site."
-
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -f "$file"; then
-	touch $file
-    else
-	test -z "$file" || exec >$file
-	echo ".ab help2man is required to generate this page"
-	exit $?
-    fi
-    ;;
-
-  makeinfo*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.texi' or \`.texinfo' file, or any other file
-         indirectly affecting the aspect of the manual.  The spurious
-         call might also be the consequence of using a buggy \`make' (AIX,
-         DU, IRIX).  You might want to install the \`Texinfo' package or
-         the \`GNU make' package.  Grab either from any GNU archive site."
-    # The file to touch is that specified with -o ...
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -z "$file"; then
-      # ... or it is the one specified with @setfilename ...
-      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
-      file=`sed -n '
-	/^@setfilename/{
-	  s/.* \([^ ]*\) *$/\1/
-	  p
-	  q
-	}' $infile`
-      # ... or it is derived from the source name (dir/f.texi becomes f.info)
-      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
-    fi
-    # If the file does not exist, the user really needs makeinfo;
-    # let's fail without touching anything.
-    test -f $file || exit 1
-    touch $file
-    ;;
-
-  tar*)
-    shift
-
-    # We have already tried tar in the generic part.
-    # Look for gnutar/gtar before invocation to avoid ugly error
-    # messages.
-    if (gnutar --version > /dev/null 2>&1); then
-       gnutar "$@" && exit 0
-    fi
-    if (gtar --version > /dev/null 2>&1); then
-       gtar "$@" && exit 0
-    fi
-    firstarg="$1"
-    if shift; then
-	case $firstarg in
-	*o*)
-	    firstarg=`echo "$firstarg" | sed s/o//`
-	    tar "$firstarg" "$@" && exit 0
-	    ;;
-	esac
-	case $firstarg in
-	*h*)
-	    firstarg=`echo "$firstarg" | sed s/h//`
-	    tar "$firstarg" "$@" && exit 0
-	    ;;
-	esac
-    fi
-
-    echo 1>&2 "\
-WARNING: I can't seem to be able to run \`tar' with the given arguments.
-         You may want to install GNU tar or Free paxutils, or check the
-         command line arguments."
-    exit 1
-    ;;
-
-  *)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, and is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.  Check the \`README' file,
-         it often tells you about the needed prerequisites for installing
-         this package.  You may also peek at any GNU archive site, in case
-         some other package would contain this missing \`$1' program."
-    exit 1
-    ;;
-esac
-
-exit 0
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/cloog-0.17.0/osl/autoconf/texinfo.tex b/cloog-0.17.0/osl/autoconf/texinfo.tex
deleted file mode 100644
index 9140826..0000000
--- a/cloog-0.17.0/osl/autoconf/texinfo.tex
+++ /dev/null
@@ -1,9291 +0,0 @@
-% texinfo.tex -- TeX macros to handle Texinfo files.
-% 
-% Load plain if necessary, i.e., if running under initex.
-\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
-%
-\def\texinfoversion{2009-08-14.15}
-%
-% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
-% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
-% 2007, 2008, 2009 Free Software Foundation, Inc.
-%
-% This texinfo.tex file is free software: you can redistribute it and/or
-% modify it under the terms of the GNU General Public License as
-% published by the Free Software Foundation, either version 3 of the
-% License, or (at your option) any later version.
-%
-% This texinfo.tex file is distributed in the hope that it will be
-% useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-% General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this program.  If not, see <http://www.gnu.org/licenses/>.
-%
-% As a special exception, when this file is read by TeX when processing
-% a Texinfo source document, you may use the result without
-% restriction.  (This has been our intent since Texinfo was invented.)
-%
-% Please try the latest version of texinfo.tex before submitting bug
-% reports; you can get the latest version from:
-%   http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
-%   ftp://tug.org/tex/texinfo.tex
-%     (and all CTAN mirrors, see http://www.ctan.org).
-% The texinfo.tex in any given distribution could well be out
-% of date, so if that's what you're using, please check.
-%
-% Send bug reports to bug-texinfo@gnu.org.  Please include including a
-% complete document in each bug report with which we can reproduce the
-% problem.  Patches are, of course, greatly appreciated.
-%
-% To process a Texinfo manual with TeX, it's most reliable to use the
-% texi2dvi shell script that comes with the distribution.  For a simple
-% manual foo.texi, however, you can get away with this:
-%   tex foo.texi
-%   texindex foo.??
-%   tex foo.texi
-%   tex foo.texi
-%   dvips foo.dvi -o  # or whatever; this makes foo.ps.
-% The extra TeX runs get the cross-reference information correct.
-% Sometimes one run after texindex suffices, and sometimes you need more
-% than two; texi2dvi does it as many times as necessary.
-%
-% It is possible to adapt texinfo.tex for other languages, to some
-% extent.  You can get the existing language-specific files from the
-% full Texinfo distribution.
-%
-% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
-
-
-\message{Loading texinfo [version \texinfoversion]:}
-
-% If in a .fmt file, print the version number
-% and turn on active characters that we couldn't do earlier because
-% they might have appeared in the input file name.
-\everyjob{\message{[Texinfo version \texinfoversion]}%
-  \catcode`+=\active \catcode`\_=\active}
-
-
-\chardef\other=12
-
-% We never want plain's \outer definition of \+ in Texinfo.
-% For @tex, we can use \tabalign.
-\let\+ = \relax
-
-% Save some plain tex macros whose names we will redefine.
-\let\ptexb=\b
-\let\ptexbullet=\bullet
-\let\ptexc=\c
-\let\ptexcomma=\,
-\let\ptexdot=\.
-\let\ptexdots=\dots
-\let\ptexend=\end
-\let\ptexequiv=\equiv
-\let\ptexexclam=\!
-\let\ptexfootnote=\footnote
-\let\ptexgtr=>
-\let\ptexhat=^
-\let\ptexi=\i
-\let\ptexindent=\indent
-\let\ptexinsert=\insert
-\let\ptexlbrace=\{
-\let\ptexless=<
-\let\ptexnewwrite\newwrite
-\let\ptexnoindent=\noindent
-\let\ptexplus=+
-\let\ptexrbrace=\}
-\let\ptexslash=\/
-\let\ptexstar=\*
-\let\ptext=\t
-\let\ptextop=\top
-{\catcode`\'=\active
-\global\let\ptexquoteright'}% Math-mode def from plain.tex.
-\let\ptexraggedright=\raggedright
-
-% If this character appears in an error message or help string, it
-% starts a new line in the output.
-\newlinechar = `^^J
-
-% Use TeX 3.0's \inputlineno to get the line number, for better error
-% messages, but if we're using an old version of TeX, don't do anything.
-%
-\ifx\inputlineno\thisisundefined
-  \let\linenumber = \empty % Pre-3.0.
-\else
-  \def\linenumber{l.\the\inputlineno:\space}
-\fi
-
-% Set up fixed words for English if not already set.
-\ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
-\ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
-\ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
-\ifx\putwordin\undefined        \gdef\putwordin{in}\fi
-\ifx\putwordIndexIsEmpty\undefined     \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
-\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
-\ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
-\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
-\ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
-\ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
-\ifx\putwordof\undefined        \gdef\putwordof{of}\fi
-\ifx\putwordon\undefined        \gdef\putwordon{on}\fi
-\ifx\putwordpage\undefined      \gdef\putwordpage{page}\fi
-\ifx\putwordsection\undefined   \gdef\putwordsection{section}\fi
-\ifx\putwordSection\undefined   \gdef\putwordSection{Section}\fi
-\ifx\putwordsee\undefined       \gdef\putwordsee{see}\fi
-\ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
-\ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
-\ifx\putwordTOC\undefined       \gdef\putwordTOC{Table of Contents}\fi
-%
-\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
-\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
-\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
-\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
-\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
-\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
-\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
-\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
-\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
-\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
-\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
-\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
-%
-\ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
-\ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
-\ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
-\ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
-\ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
-
-% Since the category of space is not known, we have to be careful.
-\chardef\spacecat = 10
-\def\spaceisspace{\catcode`\ =\spacecat}
-
-% sometimes characters are active, so we need control sequences.
-\chardef\colonChar = `\:
-\chardef\commaChar = `\,
-\chardef\dashChar  = `\-
-\chardef\dotChar   = `\.
-\chardef\exclamChar= `\!
-\chardef\lquoteChar= `\`
-\chardef\questChar = `\?
-\chardef\rquoteChar= `\'
-\chardef\semiChar  = `\;
-\chardef\underChar = `\_
-
-% Ignore a token.
-%
-\def\gobble#1{}
-
-% The following is used inside several \edef's.
-\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
-
-% Hyphenation fixes.
-\hyphenation{
-  Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
-  ap-pen-dix bit-map bit-maps
-  data-base data-bases eshell fall-ing half-way long-est man-u-script
-  man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
-  par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
-  spell-ing spell-ings
-  stand-alone strong-est time-stamp time-stamps which-ever white-space
-  wide-spread wrap-around
-}
-
-% Margin to add to right of even pages, to left of odd pages.
-\newdimen\bindingoffset
-\newdimen\normaloffset
-\newdimen\pagewidth \newdimen\pageheight
-
-% For a final copy, take out the rectangles
-% that mark overfull boxes (in case you have decided
-% that the text looks ok even though it passes the margin).
-%
-\def\finalout{\overfullrule=0pt}
-
-% @| inserts a changebar to the left of the current line.  It should
-% surround any changed text.  This approach does *not* work if the
-% change spans more than two lines of output.  To handle that, we would
-% have adopt a much more difficult approach (putting marks into the main
-% vertical list for the beginning and end of each change).
-%
-\def\|{%
-  % \vadjust can only be used in horizontal mode.
-  \leavevmode
-  %
-  % Append this vertical mode material after the current line in the output.
-  \vadjust{%
-    % We want to insert a rule with the height and depth of the current
-    % leading; that is exactly what \strutbox is supposed to record.
-    \vskip-\baselineskip
-    %
-    % \vadjust-items are inserted at the left edge of the type.  So
-    % the \llap here moves out into the left-hand margin.
-    \llap{%
-      %
-      % For a thicker or thinner bar, change the `1pt'.
-      \vrule height\baselineskip width1pt
-      %
-      % This is the space between the bar and the text.
-      \hskip 12pt
-    }%
-  }%
-}
-
-% Sometimes it is convenient to have everything in the transcript file
-% and nothing on the terminal.  We don't just call \tracingall here,
-% since that produces some useless output on the terminal.  We also make
-% some effort to order the tracing commands to reduce output in the log
-% file; cf. trace.sty in LaTeX.
-%
-\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
-\def\loggingall{%
-  \tracingstats2
-  \tracingpages1
-  \tracinglostchars2  % 2 gives us more in etex
-  \tracingparagraphs1
-  \tracingoutput1
-  \tracingmacros2
-  \tracingrestores1
-  \showboxbreadth\maxdimen \showboxdepth\maxdimen
-  \ifx\eTeXversion\undefined\else % etex gives us more logging
-    \tracingscantokens1
-    \tracingifs1
-    \tracinggroups1
-    \tracingnesting2
-    \tracingassigns1
-  \fi
-  \tracingcommands3  % 3 gives us more in etex
-  \errorcontextlines16
-}%
-
-% add check for \lastpenalty to plain's definitions.  If the last thing
-% we did was a \nobreak, we don't want to insert more space.
-%
-\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
-  \removelastskip\penalty-50\smallskip\fi\fi}
-\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
-  \removelastskip\penalty-100\medskip\fi\fi}
-\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
-  \removelastskip\penalty-200\bigskip\fi\fi}
-
-% For @cropmarks command.
-% Do @cropmarks to get crop marks.
-%
-\newif\ifcropmarks
-\let\cropmarks = \cropmarkstrue
-%
-% Dimensions to add cropmarks at corners.
-% Added by P. A. MacKay, 12 Nov. 1986
-%
-\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
-\newdimen\cornerlong  \cornerlong=1pc
-\newdimen\cornerthick \cornerthick=.3pt
-\newdimen\topandbottommargin \topandbottommargin=.75in
-
-% Output a mark which sets \thischapter, \thissection and \thiscolor.
-% We dump everything together because we only have one kind of mark.
-% This works because we only use \botmark / \topmark, not \firstmark.
-%
-% A mark contains a subexpression of the \ifcase ... \fi construct.
-% \get*marks macros below extract the needed part using \ifcase.
-%
-% Another complication is to let the user choose whether \thischapter
-% (\thissection) refers to the chapter (section) in effect at the top
-% of a page, or that at the bottom of a page.  The solution is
-% described on page 260 of The TeXbook.  It involves outputting two
-% marks for the sectioning macros, one before the section break, and
-% one after.  I won't pretend I can describe this better than DEK...
-\def\domark{%
-  \toks0=\expandafter{\lastchapterdefs}%
-  \toks2=\expandafter{\lastsectiondefs}%
-  \toks4=\expandafter{\prevchapterdefs}%
-  \toks6=\expandafter{\prevsectiondefs}%
-  \toks8=\expandafter{\lastcolordefs}%
-  \mark{%
-                   \the\toks0 \the\toks2
-      \noexpand\or \the\toks4 \the\toks6
-    \noexpand\else \the\toks8
-  }%
-}
-% \topmark doesn't work for the very first chapter (after the title
-% page or the contents), so we use \firstmark there -- this gets us
-% the mark with the chapter defs, unless the user sneaks in, e.g.,
-% @setcolor (or @url, or @link, etc.) between @contents and the very
-% first @chapter.
-\def\gettopheadingmarks{%
-  \ifcase0\topmark\fi
-  \ifx\thischapter\empty \ifcase0\firstmark\fi \fi
-}
-\def\getbottomheadingmarks{\ifcase1\botmark\fi}
-\def\getcolormarks{\ifcase2\topmark\fi}
-
-% Avoid "undefined control sequence" errors.
-\def\lastchapterdefs{}
-\def\lastsectiondefs{}
-\def\prevchapterdefs{}
-\def\prevsectiondefs{}
-\def\lastcolordefs{}
-
-% Main output routine.
-\chardef\PAGE = 255
-\output = {\onepageout{\pagecontents\PAGE}}
-
-\newbox\headlinebox
-\newbox\footlinebox
-
-% \onepageout takes a vbox as an argument.  Note that \pagecontents
-% does insertions, but you have to call it yourself.
-\def\onepageout#1{%
-  \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
-  %
-  \ifodd\pageno  \advance\hoffset by \bindingoffset
-  \else \advance\hoffset by -\bindingoffset\fi
-  %
-  % Do this outside of the \shipout so @code etc. will be expanded in
-  % the headline as they should be, not taken literally (outputting ''code).
-  \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
-  \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
-  \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi
-  \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
-  %
-  {%
-    % Have to do this stuff outside the \shipout because we want it to
-    % take effect in \write's, yet the group defined by the \vbox ends
-    % before the \shipout runs.
-    %
-    \indexdummies         % don't expand commands in the output.
-    \normalturnoffactive  % \ in index entries must not stay \, e.g., if
-               % the page break happens to be in the middle of an example.
-               % We don't want .vr (or whatever) entries like this:
-               % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}}
-               % "\acronym" won't work when it's read back in;
-               % it needs to be
-               % {\code {{\tt \backslashcurfont }acronym}
-    \shipout\vbox{%
-      % Do this early so pdf references go to the beginning of the page.
-      \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
-      %
-      \ifcropmarks \vbox to \outervsize\bgroup
-        \hsize = \outerhsize
-        \vskip-\topandbottommargin
-        \vtop to0pt{%
-          \line{\ewtop\hfil\ewtop}%
-          \nointerlineskip
-          \line{%
-            \vbox{\moveleft\cornerthick\nstop}%
-            \hfill
-            \vbox{\moveright\cornerthick\nstop}%
-          }%
-          \vss}%
-        \vskip\topandbottommargin
-        \line\bgroup
-          \hfil % center the page within the outer (page) hsize.
-          \ifodd\pageno\hskip\bindingoffset\fi
-          \vbox\bgroup
-      \fi
-      %
-      \unvbox\headlinebox
-      \pagebody{#1}%
-      \ifdim\ht\footlinebox > 0pt
-        % Only leave this space if the footline is nonempty.
-        % (We lessened \vsize for it in \oddfootingyyy.)
-        % The \baselineskip=24pt in plain's \makefootline has no effect.
-        \vskip 24pt
-        \unvbox\footlinebox
-      \fi
-      %
-      \ifcropmarks
-          \egroup % end of \vbox\bgroup
-        \hfil\egroup % end of (centering) \line\bgroup
-        \vskip\topandbottommargin plus1fill minus1fill
-        \boxmaxdepth = \cornerthick
-        \vbox to0pt{\vss
-          \line{%
-            \vbox{\moveleft\cornerthick\nsbot}%
-            \hfill
-            \vbox{\moveright\cornerthick\nsbot}%
-          }%
-          \nointerlineskip
-          \line{\ewbot\hfil\ewbot}%
-        }%
-      \egroup % \vbox from first cropmarks clause
-      \fi
-    }% end of \shipout\vbox
-  }% end of group with \indexdummies
-  \advancepageno
-  \ifnum\outputpenalty>-20000 \else\dosupereject\fi
-}
-
-\newinsert\margin \dimen\margin=\maxdimen
-
-\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
-{\catcode`\@ =11
-\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
-% marginal hacks, juha@viisa.uucp (Juha Takala)
-\ifvoid\margin\else % marginal info is present
-  \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
-\dimen@=\dp#1\relax \unvbox#1\relax
-\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
-\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
-}
-
-% Here are the rules for the cropmarks.  Note that they are
-% offset so that the space between them is truly \outerhsize or \outervsize
-% (P. A. MacKay, 12 November, 1986)
-%
-\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
-\def\nstop{\vbox
-  {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
-\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
-\def\nsbot{\vbox
-  {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
-
-% Parse an argument, then pass it to #1.  The argument is the rest of
-% the input line (except we remove a trailing comment).  #1 should be a
-% macro which expects an ordinary undelimited TeX argument.
-%
-\def\parsearg{\parseargusing{}}
-\def\parseargusing#1#2{%
-  \def\argtorun{#2}%
-  \begingroup
-    \obeylines
-    \spaceisspace
-    #1%
-    \parseargline\empty% Insert the \empty token, see \finishparsearg below.
-}
-
-{\obeylines %
-  \gdef\parseargline#1^^M{%
-    \endgroup % End of the group started in \parsearg.
-    \argremovecomment #1\comment\ArgTerm%
-  }%
-}
-
-% First remove any @comment, then any @c comment.
-\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
-\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
-
-% Each occurrence of `\^^M' or `<space>\^^M' is replaced by a single space.
-%
-% \argremovec might leave us with trailing space, e.g.,
-%    @end itemize  @c foo
-% This space token undergoes the same procedure and is eventually removed
-% by \finishparsearg.
-%
-\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
-\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
-\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
-  \def\temp{#3}%
-  \ifx\temp\empty
-    % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp:
-    \let\temp\finishparsearg
-  \else
-    \let\temp\argcheckspaces
-  \fi
-  % Put the space token in:
-  \temp#1 #3\ArgTerm
-}
-
-% If a _delimited_ argument is enclosed in braces, they get stripped; so
-% to get _exactly_ the rest of the line, we had to prevent such situation.
-% We prepended an \empty token at the very beginning and we expand it now,
-% just before passing the control to \argtorun.
-% (Similarly, we have to think about #3 of \argcheckspacesY above: it is
-% either the null string, or it ends with \^^M---thus there is no danger
-% that a pair of braces would be stripped.
-%
-% But first, we have to remove the trailing space token.
-%
-\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}}
-
-% \parseargdef\foo{...}
-%	is roughly equivalent to
-% \def\foo{\parsearg\Xfoo}
-% \def\Xfoo#1{...}
-%
-% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
-% favourite TeX trick.  --kasal, 16nov03
-
-\def\parseargdef#1{%
-  \expandafter \doparseargdef \csname\string#1\endcsname #1%
-}
-\def\doparseargdef#1#2{%
-  \def#2{\parsearg#1}%
-  \def#1##1%
-}
-
-% Several utility definitions with active space:
-{
-  \obeyspaces
-  \gdef\obeyedspace{ }
-
-  % Make each space character in the input produce a normal interword
-  % space in the output.  Don't allow a line break at this space, as this
-  % is used only in environments like @example, where each line of input
-  % should produce a line of output anyway.
-  %
-  \gdef\sepspaces{\obeyspaces\let =\tie}
-
-  % If an index command is used in an @example environment, any spaces
-  % therein should become regular spaces in the raw index file, not the
-  % expansion of \tie (\leavevmode \penalty \@M \ ).
-  \gdef\unsepspaces{\let =\space}
-}
-
-
-\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
-
-% Define the framework for environments in texinfo.tex.  It's used like this:
-%
-%   \envdef\foo{...}
-%   \def\Efoo{...}
-%
-% It's the responsibility of \envdef to insert \begingroup before the
-% actual body; @end closes the group after calling \Efoo.  \envdef also
-% defines \thisenv, so the current environment is known; @end checks
-% whether the environment name matches.  The \checkenv macro can also be
-% used to check whether the current environment is the one expected.
-%
-% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
-% are not treated as environments; they don't open a group.  (The
-% implementation of @end takes care not to call \endgroup in this
-% special case.)
-
-
-% At run-time, environments start with this:
-\def\startenvironment#1{\begingroup\def\thisenv{#1}}
-% initialize
-\let\thisenv\empty
-
-% ... but they get defined via ``\envdef\foo{...}'':
-\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
-\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
-
-% Check whether we're in the right environment:
-\def\checkenv#1{%
-  \def\temp{#1}%
-  \ifx\thisenv\temp
-  \else
-    \badenverr
-  \fi
-}
-
-% Environment mismatch, #1 expected:
-\def\badenverr{%
-  \errhelp = \EMsimple
-  \errmessage{This command can appear only \inenvironment\temp,
-    not \inenvironment\thisenv}%
-}
-\def\inenvironment#1{%
-  \ifx#1\empty
-    out of any environment%
-  \else
-    in environment \expandafter\string#1%
-  \fi
-}
-
-% @end foo executes the definition of \Efoo.
-% But first, it executes a specialized version of \checkenv
-%
-\parseargdef\end{%
-  \if 1\csname iscond.#1\endcsname
-  \else
-    % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
-    \expandafter\checkenv\csname#1\endcsname
-    \csname E#1\endcsname
-    \endgroup
-  \fi
-}
-
-\newhelp\EMsimple{Press RETURN to continue.}
-
-
-%% Simple single-character @ commands
-
-% @@ prints an @
-% Kludge this until the fonts are right (grr).
-\def\@{{\tt\char64}}
-
-% This is turned off because it was never documented
-% and you can use @w{...} around a quote to suppress ligatures.
-%% Define @` and @' to be the same as ` and '
-%% but suppressing ligatures.
-%\def\`{{`}}
-%\def\'{{'}}
-
-% Used to generate quoted braces.
-\def\mylbrace {{\tt\char123}}
-\def\myrbrace {{\tt\char125}}
-\let\{=\mylbrace
-\let\}=\myrbrace
-\begingroup
-  % Definitions to produce \{ and \} commands for indices,
-  % and @{ and @} for the aux/toc files.
-  \catcode`\{ = \other \catcode`\} = \other
-  \catcode`\[ = 1 \catcode`\] = 2
-  \catcode`\! = 0 \catcode`\\ = \other
-  !gdef!lbracecmd[\{]%
-  !gdef!rbracecmd[\}]%
-  !gdef!lbraceatcmd[@{]%
-  !gdef!rbraceatcmd[@}]%
-!endgroup
-
-% @comma{} to avoid , parsing problems.
-\let\comma = ,
-
-% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
-% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
-\let\, = \c
-\let\dotaccent = \.
-\def\ringaccent#1{{\accent23 #1}}
-\let\tieaccent = \t
-\let\ubaraccent = \b
-\let\udotaccent = \d
-
-% Other special characters: @questiondown @exclamdown @ordf @ordm
-% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
-\def\questiondown{?`}
-\def\exclamdown{!`}
-\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
-\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
-
-% Dotless i and dotless j, used for accents.
-\def\imacro{i}
-\def\jmacro{j}
-\def\dotless#1{%
-  \def\temp{#1}%
-  \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi
-  \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi
-  \else \errmessage{@dotless can be used only with i or j}%
-  \fi\fi
-}
-
-% The \TeX{} logo, as in plain, but resetting the spacing so that a
-% period following counts as ending a sentence.  (Idea found in latex.)
-%
-\edef\TeX{\TeX \spacefactor=1000 }
-
-% @LaTeX{} logo.  Not quite the same results as the definition in
-% latex.ltx, since we use a different font for the raised A; it's most
-% convenient for us to use an explicitly smaller font, rather than using
-% the \scriptstyle font (since we don't reset \scriptstyle and
-% \scriptscriptstyle).
-%
-\def\LaTeX{%
-  L\kern-.36em
-  {\setbox0=\hbox{T}%
-   \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
-  \kern-.15em
-  \TeX
-}
-
-% Be sure we're in horizontal mode when doing a tie, since we make space
-% equivalent to this in @example-like environments. Otherwise, a space
-% at the beginning of a line will start with \penalty -- and
-% since \penalty is valid in vertical mode, we'd end up putting the
-% penalty on the vertical list instead of in the new paragraph.
-{\catcode`@ = 11
- % Avoid using \@M directly, because that causes trouble
- % if the definition is written into an index file.
- \global\let\tiepenalty = \@M
- \gdef\tie{\leavevmode\penalty\tiepenalty\ }
-}
-
-% @: forces normal size whitespace following.
-\def\:{\spacefactor=1000 }
-
-% @* forces a line break.
-\def\*{\hfil\break\hbox{}\ignorespaces}
-
-% @/ allows a line break.
-\let\/=\allowbreak
-
-% @. is an end-of-sentence period.
-\def\.{.\spacefactor=\endofsentencespacefactor\space}
-
-% @! is an end-of-sentence bang.
-\def\!{!\spacefactor=\endofsentencespacefactor\space}
-
-% @? is an end-of-sentence query.
-\def\?{?\spacefactor=\endofsentencespacefactor\space}
-
-% @frenchspacing on|off  says whether to put extra space after punctuation.
-%
-\def\onword{on}
-\def\offword{off}
-%
-\parseargdef\frenchspacing{%
-  \def\temp{#1}%
-  \ifx\temp\onword \plainfrenchspacing
-  \else\ifx\temp\offword \plainnonfrenchspacing
-  \else
-    \errhelp = \EMsimple
-    \errmessage{Unknown @frenchspacing option `\temp', must be on/off}%
-  \fi\fi
-}
-
-% @w prevents a word break.  Without the \leavevmode, @w at the
-% beginning of a paragraph, when TeX is still in vertical mode, would
-% produce a whole line of output instead of starting the paragraph.
-\def\w#1{\leavevmode\hbox{#1}}
-
-% @group ... @end group forces ... to be all on one page, by enclosing
-% it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
-% to keep its height that of a normal line.  According to the rules for
-% \topskip (p.114 of the TeXbook), the glue inserted is
-% max (\topskip - \ht (first item), 0).  If that height is large,
-% therefore, no glue is inserted, and the space between the headline and
-% the text is small, which looks bad.
-%
-% Another complication is that the group might be very large.  This can
-% cause the glue on the previous page to be unduly stretched, because it
-% does not have much material.  In this case, it's better to add an
-% explicit \vfill so that the extra space is at the bottom.  The
-% threshold for doing this is if the group is more than \vfilllimit
-% percent of a page (\vfilllimit can be changed inside of @tex).
-%
-\newbox\groupbox
-\def\vfilllimit{0.7}
-%
-\envdef\group{%
-  \ifnum\catcode`\^^M=\active \else
-    \errhelp = \groupinvalidhelp
-    \errmessage{@group invalid in context where filling is enabled}%
-  \fi
-  \startsavinginserts
-  %
-  \setbox\groupbox = \vtop\bgroup
-    % Do @comment since we are called inside an environment such as
-    % @example, where each end-of-line in the input causes an
-    % end-of-line in the output.  We don't want the end-of-line after
-    % the `@group' to put extra space in the output.  Since @group
-    % should appear on a line by itself (according to the Texinfo
-    % manual), we don't worry about eating any user text.
-    \comment
-}
-%
-% The \vtop produces a box with normal height and large depth; thus, TeX puts
-% \baselineskip glue before it, and (when the next line of text is done)
-% \lineskip glue after it.  Thus, space below is not quite equal to space
-% above.  But it's pretty close.
-\def\Egroup{%
-    % To get correct interline space between the last line of the group
-    % and the first line afterwards, we have to propagate \prevdepth.
-    \endgraf % Not \par, as it may have been set to \lisppar.
-    \global\dimen1 = \prevdepth
-  \egroup           % End the \vtop.
-  % \dimen0 is the vertical size of the group's box.
-  \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
-  % \dimen2 is how much space is left on the page (more or less).
-  \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
-  % if the group doesn't fit on the current page, and it's a big big
-  % group, force a page break.
-  \ifdim \dimen0 > \dimen2
-    \ifdim \pagetotal < \vfilllimit\pageheight
-      \page
-    \fi
-  \fi
-  \box\groupbox
-  \prevdepth = \dimen1
-  \checkinserts
-}
-%
-% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
-% message, so this ends up printing `@group can only ...'.
-%
-\newhelp\groupinvalidhelp{%
-group can only be used in environments such as @example,^^J%
-where each line of input produces a line of output.}
-
-% @need space-in-mils
-% forces a page break if there is not space-in-mils remaining.
-
-\newdimen\mil  \mil=0.001in
-
-% Old definition--didn't work.
-%\parseargdef\need{\par %
-%% This method tries to make TeX break the page naturally
-%% if the depth of the box does not fit.
-%{\baselineskip=0pt%
-%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
-%\prevdepth=-1000pt
-%}}
-
-\parseargdef\need{%
-  % Ensure vertical mode, so we don't make a big box in the middle of a
-  % paragraph.
-  \par
-  %
-  % If the @need value is less than one line space, it's useless.
-  \dimen0 = #1\mil
-  \dimen2 = \ht\strutbox
-  \advance\dimen2 by \dp\strutbox
-  \ifdim\dimen0 > \dimen2
-    %
-    % Do a \strut just to make the height of this box be normal, so the
-    % normal leading is inserted relative to the preceding line.
-    % And a page break here is fine.
-    \vtop to #1\mil{\strut\vfil}%
-    %
-    % TeX does not even consider page breaks if a penalty added to the
-    % main vertical list is 10000 or more.  But in order to see if the
-    % empty box we just added fits on the page, we must make it consider
-    % page breaks.  On the other hand, we don't want to actually break the
-    % page after the empty box.  So we use a penalty of 9999.
-    %
-    % There is an extremely small chance that TeX will actually break the
-    % page at this \penalty, if there are no other feasible breakpoints in
-    % sight.  (If the user is using lots of big @group commands, which
-    % almost-but-not-quite fill up a page, TeX will have a hard time doing
-    % good page breaking, for example.)  However, I could not construct an
-    % example where a page broke at this \penalty; if it happens in a real
-    % document, then we can reconsider our strategy.
-    \penalty9999
-    %
-    % Back up by the size of the box, whether we did a page break or not.
-    \kern -#1\mil
-    %
-    % Do not allow a page break right after this kern.
-    \nobreak
-  \fi
-}
-
-% @br   forces paragraph break (and is undocumented).
-
-\let\br = \par
-
-% @page forces the start of a new page.
-%
-\def\page{\par\vfill\supereject}
-
-% @exdent text....
-% outputs text on separate line in roman font, starting at standard page margin
-
-% This records the amount of indent in the innermost environment.
-% That's how much \exdent should take out.
-\newskip\exdentamount
-
-% This defn is used inside fill environments such as @defun.
-\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
-
-% This defn is used inside nofill environments such as @example.
-\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
-  \leftline{\hskip\leftskip{\rm#1}}}}
-
-% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
-% paragraph.  For more general purposes, use the \margin insertion
-% class.  WHICH is `l' or `r'.
-%
-\newskip\inmarginspacing \inmarginspacing=1cm
-\def\strutdepth{\dp\strutbox}
-%
-\def\doinmargin#1#2{\strut\vadjust{%
-  \nobreak
-  \kern-\strutdepth
-  \vtop to \strutdepth{%
-    \baselineskip=\strutdepth
-    \vss
-    % if you have multiple lines of stuff to put here, you'll need to
-    % make the vbox yourself of the appropriate size.
-    \ifx#1l%
-      \llap{\ignorespaces #2\hskip\inmarginspacing}%
-    \else
-      \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
-    \fi
-    \null
-  }%
-}}
-\def\inleftmargin{\doinmargin l}
-\def\inrightmargin{\doinmargin r}
-%
-% @inmargin{TEXT [, RIGHT-TEXT]}
-% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
-% else use TEXT for both).
-%
-\def\inmargin#1{\parseinmargin #1,,\finish}
-\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
-  \setbox0 = \hbox{\ignorespaces #2}%
-  \ifdim\wd0 > 0pt
-    \def\lefttext{#1}%  have both texts
-    \def\righttext{#2}%
-  \else
-    \def\lefttext{#1}%  have only one text
-    \def\righttext{#1}%
-  \fi
-  %
-  \ifodd\pageno
-    \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
-  \else
-    \def\temp{\inleftmargin\lefttext}%
-  \fi
-  \temp
-}
-
-% @include FILE -- \input text of FILE.
-%
-\def\include{\parseargusing\filenamecatcodes\includezzz}
-\def\includezzz#1{%
-  \pushthisfilestack
-  \def\thisfile{#1}%
-  {%
-    \makevalueexpandable  % we want to expand any @value in FILE.
-    \turnoffactive        % and allow special characters in the expansion
-    \indexnofonts         % Allow `@@' and other weird things in file names.
-    \edef\temp{\noexpand\input #1 }%
-    %
-    % This trickery is to read FILE outside of a group, in case it makes
-    % definitions, etc.
-    \expandafter
-  }\temp
-  \popthisfilestack
-}
-\def\filenamecatcodes{%
-  \catcode`\\=\other
-  \catcode`~=\other
-  \catcode`^=\other
-  \catcode`_=\other
-  \catcode`|=\other
-  \catcode`<=\other
-  \catcode`>=\other
-  \catcode`+=\other
-  \catcode`-=\other
-  \catcode`\`=\other
-  \catcode`\'=\other
-}
-
-\def\pushthisfilestack{%
-  \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
-}
-\def\pushthisfilestackX{%
-  \expandafter\pushthisfilestackY\thisfile\StackTerm
-}
-\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
-  \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
-}
-
-\def\popthisfilestack{\errthisfilestackempty}
-\def\errthisfilestackempty{\errmessage{Internal error:
-  the stack of filenames is empty.}}
-
-\def\thisfile{}
-
-% @center line
-% outputs that line, centered.
-%
-\parseargdef\center{%
-  \ifhmode
-    \let\next\centerH
-  \else
-    \let\next\centerV
-  \fi
-  \next{\hfil \ignorespaces#1\unskip \hfil}%
-}
-\def\centerH#1{%
-  {%
-    \hfil\break
-    \advance\hsize by -\leftskip
-    \advance\hsize by -\rightskip
-    \line{#1}%
-    \break
-  }%
-}
-\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
-
-% @sp n   outputs n lines of vertical space
-
-\parseargdef\sp{\vskip #1\baselineskip}
-
-% @comment ...line which is ignored...
-% @c is the same as @comment
-% @ignore ... @end ignore  is another way to write a comment
-
-\def\comment{\begingroup \catcode`\^^M=\other%
-\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
-\commentxxx}
-{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
-
-\let\c=\comment
-
-% @paragraphindent NCHARS
-% We'll use ems for NCHARS, close enough.
-% NCHARS can also be the word `asis' or `none'.
-% We cannot feasibly implement @paragraphindent asis, though.
-%
-\def\asisword{asis} % no translation, these are keywords
-\def\noneword{none}
-%
-\parseargdef\paragraphindent{%
-  \def\temp{#1}%
-  \ifx\temp\asisword
-  \else
-    \ifx\temp\noneword
-      \defaultparindent = 0pt
-    \else
-      \defaultparindent = #1em
-    \fi
-  \fi
-  \parindent = \defaultparindent
-}
-
-% @exampleindent NCHARS
-% We'll use ems for NCHARS like @paragraphindent.
-% It seems @exampleindent asis isn't necessary, but
-% I preserve it to make it similar to @paragraphindent.
-\parseargdef\exampleindent{%
-  \def\temp{#1}%
-  \ifx\temp\asisword
-  \else
-    \ifx\temp\noneword
-      \lispnarrowing = 0pt
-    \else
-      \lispnarrowing = #1em
-    \fi
-  \fi
-}
-
-% @firstparagraphindent WORD
-% If WORD is `none', then suppress indentation of the first paragraph
-% after a section heading.  If WORD is `insert', then do indent at such
-% paragraphs.
-%
-% The paragraph indentation is suppressed or not by calling
-% \suppressfirstparagraphindent, which the sectioning commands do.
-% We switch the definition of this back and forth according to WORD.
-% By default, we suppress indentation.
-%
-\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
-\def\insertword{insert}
-%
-\parseargdef\firstparagraphindent{%
-  \def\temp{#1}%
-  \ifx\temp\noneword
-    \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
-  \else\ifx\temp\insertword
-    \let\suppressfirstparagraphindent = \relax
-  \else
-    \errhelp = \EMsimple
-    \errmessage{Unknown @firstparagraphindent option `\temp'}%
-  \fi\fi
-}
-
-% Here is how we actually suppress indentation.  Redefine \everypar to
-% \kern backwards by \parindent, and then reset itself to empty.
-%
-% We also make \indent itself not actually do anything until the next
-% paragraph.
-%
-\gdef\dosuppressfirstparagraphindent{%
-  \gdef\indent{%
-    \restorefirstparagraphindent
-    \indent
-  }%
-  \gdef\noindent{%
-    \restorefirstparagraphindent
-    \noindent
-  }%
-  \global\everypar = {%
-    \kern -\parindent
-    \restorefirstparagraphindent
-  }%
-}
-
-\gdef\restorefirstparagraphindent{%
-  \global \let \indent = \ptexindent
-  \global \let \noindent = \ptexnoindent
-  \global \everypar = {}%
-}
-
-
-% @asis just yields its argument.  Used with @table, for example.
-%
-\def\asis#1{#1}
-
-% @math outputs its argument in math mode.
-%
-% One complication: _ usually means subscripts, but it could also mean
-% an actual _ character, as in @math{@var{some_variable} + 1}.  So make
-% _ active, and distinguish by seeing if the current family is \slfam,
-% which is what @var uses.
-{
-  \catcode`\_ = \active
-  \gdef\mathunderscore{%
-    \catcode`\_=\active
-    \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
-  }
-}
-% Another complication: we want \\ (and @\) to output a \ character.
-% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
-% this is not advertised and we don't care.  Texinfo does not
-% otherwise define @\.
-%
-% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
-\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
-%
-\def\math{%
-  \tex
-  \mathunderscore
-  \let\\ = \mathbackslash
-  \mathactive
-  % make the texinfo accent commands work in math mode
-  \let\"=\ddot
-  \let\'=\acute
-  \let\==\bar
-  \let\^=\hat
-  \let\`=\grave
-  \let\u=\breve
-  \let\v=\check
-  \let\~=\tilde
-  \let\dotaccent=\dot
-  $\finishmath
-}
-\def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
-
-% Some active characters (such as <) are spaced differently in math.
-% We have to reset their definitions in case the @math was an argument
-% to a command which sets the catcodes (such as @item or @section).
-%
-{
-  \catcode`^ = \active
-  \catcode`< = \active
-  \catcode`> = \active
-  \catcode`+ = \active
-  \catcode`' = \active
-  \gdef\mathactive{%
-    \let^ = \ptexhat
-    \let< = \ptexless
-    \let> = \ptexgtr
-    \let+ = \ptexplus
-    \let' = \ptexquoteright
-  }
-}
-
-% Some math mode symbols.
-\def\bullet{$\ptexbullet$}
-\def\geq{\ifmmode \ge\else $\ge$\fi}
-\def\leq{\ifmmode \le\else $\le$\fi}
-\def\minus{\ifmmode -\else $-$\fi}
-
-% @dots{} outputs an ellipsis using the current font.
-% We do .5em per period so that it has the same spacing in the cm
-% typewriter fonts as three actual period characters; on the other hand,
-% in other typewriter fonts three periods are wider than 1.5em.  So do
-% whichever is larger.
-%
-\def\dots{%
-  \leavevmode
-  \setbox0=\hbox{...}% get width of three periods
-  \ifdim\wd0 > 1.5em
-    \dimen0 = \wd0
-  \else
-    \dimen0 = 1.5em
-  \fi
-  \hbox to \dimen0{%
-    \hskip 0pt plus.25fil
-    .\hskip 0pt plus1fil
-    .\hskip 0pt plus1fil
-    .\hskip 0pt plus.5fil
-  }%
-}
-
-% @enddots{} is an end-of-sentence ellipsis.
-%
-\def\enddots{%
-  \dots
-  \spacefactor=\endofsentencespacefactor
-}
-
-% @comma{} is so commas can be inserted into text without messing up
-% Texinfo's parsing.
-%
-\let\comma = ,
-
-% @refill is a no-op.
-\let\refill=\relax
-
-% If working on a large document in chapters, it is convenient to
-% be able to disable indexing, cross-referencing, and contents, for test runs.
-% This is done with @novalidate (before @setfilename).
-%
-\newif\iflinks \linkstrue % by default we want the aux files.
-\let\novalidate = \linksfalse
-
-% @setfilename is done at the beginning of every texinfo file.
-% So open here the files we need to have open while reading the input.
-% This makes it possible to make a .fmt file for texinfo.
-\def\setfilename{%
-   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
-   \iflinks
-     \tryauxfile
-     % Open the new aux file.  TeX will close it automatically at exit.
-     \immediate\openout\auxfile=\jobname.aux
-   \fi % \openindices needs to do some work in any case.
-   \openindices
-   \let\setfilename=\comment % Ignore extra @setfilename cmds.
-   %
-   % If texinfo.cnf is present on the system, read it.
-   % Useful for site-wide @afourpaper, etc.
-   \openin 1 texinfo.cnf
-   \ifeof 1 \else \input texinfo.cnf \fi
-   \closein 1
-   %
-   \comment % Ignore the actual filename.
-}
-
-% Called from \setfilename.
-%
-\def\openindices{%
-  \newindex{cp}%
-  \newcodeindex{fn}%
-  \newcodeindex{vr}%
-  \newcodeindex{tp}%
-  \newcodeindex{ky}%
-  \newcodeindex{pg}%
-}
-
-% @bye.
-\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
-
-
-\message{pdf,}
-% adobe `portable' document format
-\newcount\tempnum
-\newcount\lnkcount
-\newtoks\filename
-\newcount\filenamelength
-\newcount\pgn
-\newtoks\toksA
-\newtoks\toksB
-\newtoks\toksC
-\newtoks\toksD
-\newbox\boxA
-\newcount\countA
-\newif\ifpdf
-\newif\ifpdfmakepagedest
-
-% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
-% can be set).  So we test for \relax and 0 as well as \undefined,
-% borrowed from ifpdf.sty.
-\ifx\pdfoutput\undefined
-\else
-  \ifx\pdfoutput\relax
-  \else
-    \ifcase\pdfoutput
-    \else
-      \pdftrue
-    \fi
-  \fi
-\fi
-
-% PDF uses PostScript string constants for the names of xref targets,
-% for display in the outlines, and in other places.  Thus, we have to
-% double any backslashes.  Otherwise, a name like "\node" will be
-% interpreted as a newline (\n), followed by o, d, e.  Not good.
-% http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html
-% (and related messages, the final outcome is that it is up to the TeX
-% user to double the backslashes and otherwise make the string valid, so
-% that's what we do).
-
-% double active backslashes.
-%
-{\catcode`\@=0 \catcode`\\=\active
- @gdef@activebackslashdouble{%
-   @catcode`@\=@active
-   @let\=@doublebackslash}
-}
-
-% To handle parens, we must adopt a different approach, since parens are
-% not active characters.  hyperref.dtx (which has the same problem as
-% us) handles it with this amazing macro to replace tokens, with minor
-% changes for Texinfo.  It is included here under the GPL by permission
-% from the author, Heiko Oberdiek.
-%
-% #1 is the tokens to replace.
-% #2 is the replacement.
-% #3 is the control sequence with the string.
-%
-\def\HyPsdSubst#1#2#3{%
-  \def\HyPsdReplace##1#1##2\END{%
-    ##1%
-    \ifx\\##2\\%
-    \else
-      #2%
-      \HyReturnAfterFi{%
-        \HyPsdReplace##2\END
-      }%
-    \fi
-  }%
-  \xdef#3{\expandafter\HyPsdReplace#3#1\END}%
-}
-\long\def\HyReturnAfterFi#1\fi{\fi#1}
-
-% #1 is a control sequence in which to do the replacements.
-\def\backslashparens#1{%
-  \xdef#1{#1}% redefine it as its expansion; the definition is simply
-             % \lastnode when called from \setref -> \pdfmkdest.
-  \HyPsdSubst{(}{\realbackslash(}{#1}%
-  \HyPsdSubst{)}{\realbackslash)}{#1}%
-}
-
-\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images
-with PDF output, and none of those formats could be found.  (.eps cannot
-be supported due to the design of the PDF format; use regular TeX (DVI
-output) for that.)}
-
-\ifpdf
-  %
-  % Color manipulation macros based on pdfcolor.tex,
-  % except using rgb instead of cmyk; the latter is said to render as a
-  % very dark gray on-screen and a very dark halftone in print, instead
-  % of actual black.
-  \def\rgbDarkRed{0.50 0.09 0.12}
-  \def\rgbBlack{0 0 0}
-  %
-  % k sets the color for filling (usual text, etc.);
-  % K sets the color for stroking (thin rules, e.g., normal _'s).
-  \def\pdfsetcolor#1{\pdfliteral{#1 rg  #1 RG}}
-  %
-  % Set color, and create a mark which defines \thiscolor accordingly,
-  % so that \makeheadline knows which color to restore.
-  \def\setcolor#1{%
-    \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}%
-    \domark
-    \pdfsetcolor{#1}%
-  }
-  %
-  \def\maincolor{\rgbBlack}
-  \pdfsetcolor{\maincolor}
-  \edef\thiscolor{\maincolor}
-  \def\lastcolordefs{}
-  %
-  \def\makefootline{%
-    \baselineskip24pt
-    \line{\pdfsetcolor{\maincolor}\the\footline}%
-  }
-  %
-  \def\makeheadline{%
-    \vbox to 0pt{%
-      \vskip-22.5pt
-      \line{%
-        \vbox to8.5pt{}%
-        % Extract \thiscolor definition from the marks.
-        \getcolormarks
-        % Typeset the headline with \maincolor, then restore the color.
-        \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%
-      }%
-      \vss
-    }%
-    \nointerlineskip
-  }
-  %
-  %
-  \pdfcatalog{/PageMode /UseOutlines}
-  %
-  % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
-  \def\dopdfimage#1#2#3{%
-    \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
-    \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
-    %
-    % pdftex (and the PDF format) support .png, .jpg, .pdf (among
-    % others).  Let's try in that order.
-    \let\pdfimgext=\empty
-    \begingroup
-      \openin 1 #1.png \ifeof 1
-        \openin 1 #1.jpg \ifeof 1
-          \openin 1 #1.jpeg \ifeof 1
-            \openin 1 #1.JPG \ifeof 1
-              \openin 1 #1.pdf \ifeof 1
-                \openin 1 #1.PDF \ifeof 1
-                  \errhelp = \nopdfimagehelp
-                  \errmessage{Could not find image file #1 for pdf}%
-                \else \gdef\pdfimgext{PDF}%
-                \fi
-              \else \gdef\pdfimgext{pdf}%
-              \fi
-            \else \gdef\pdfimgext{JPG}%
-            \fi
-          \else \gdef\pdfimgext{jpeg}%
-          \fi
-        \else \gdef\pdfimgext{jpg}%
-        \fi
-      \else \gdef\pdfimgext{png}%
-      \fi
-      \closein 1
-    \endgroup
-    %
-    % without \immediate, ancient pdftex seg faults when the same image is
-    % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
-    \ifnum\pdftexversion < 14
-      \immediate\pdfimage
-    \else
-      \immediate\pdfximage
-    \fi
-      \ifdim \wd0 >0pt width \imagewidth \fi
-      \ifdim \wd2 >0pt height \imageheight \fi
-      \ifnum\pdftexversion<13
-         #1.\pdfimgext
-       \else
-         {#1.\pdfimgext}%
-       \fi
-    \ifnum\pdftexversion < 14 \else
-      \pdfrefximage \pdflastximage
-    \fi}
-  %
-  \def\pdfmkdest#1{{%
-    % We have to set dummies so commands such as @code, and characters
-    % such as \, aren't expanded when present in a section title.
-    \indexnofonts
-    \turnoffactive
-    \activebackslashdouble
-    \makevalueexpandable
-    \def\pdfdestname{#1}%
-    \backslashparens\pdfdestname
-    \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
-  }}
-  %
-  % used to mark target names; must be expandable.
-  \def\pdfmkpgn#1{#1}
-  %
-  % by default, use a color that is dark enough to print on paper as
-  % nearly black, but still distinguishable for online viewing.
-  \def\urlcolor{\rgbDarkRed}
-  \def\linkcolor{\rgbDarkRed}
-  \def\endlink{\setcolor{\maincolor}\pdfendlink}
-  %
-  % Adding outlines to PDF; macros for calculating structure of outlines
-  % come from Petr Olsak
-  \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
-    \else \csname#1\endcsname \fi}
-  \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
-    \advance\tempnum by 1
-    \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
-  %
-  % #1 is the section text, which is what will be displayed in the
-  % outline by the pdf viewer.  #2 is the pdf expression for the number
-  % of subentries (or empty, for subsubsections).  #3 is the node text,
-  % which might be empty if this toc entry had no corresponding node.
-  % #4 is the page number
-  %
-  \def\dopdfoutline#1#2#3#4{%
-    % Generate a link to the node text if that exists; else, use the
-    % page number.  We could generate a destination for the section
-    % text in the case where a section has no node, but it doesn't
-    % seem worth the trouble, since most documents are normally structured.
-    \def\pdfoutlinedest{#3}%
-    \ifx\pdfoutlinedest\empty
-      \def\pdfoutlinedest{#4}%
-    \else
-      % Doubled backslashes in the name.
-      {\activebackslashdouble \xdef\pdfoutlinedest{#3}%
-       \backslashparens\pdfoutlinedest}%
-    \fi
-    %
-    % Also double the backslashes in the display string.
-    {\activebackslashdouble \xdef\pdfoutlinetext{#1}%
-     \backslashparens\pdfoutlinetext}%
-    %
-    \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}%
-  }
-  %
-  \def\pdfmakeoutlines{%
-    \begingroup
-      % Thanh's hack / proper braces in bookmarks
-      \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
-      \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
-      %
-      % Read toc silently, to get counts of subentries for \pdfoutline.
-      \def\numchapentry##1##2##3##4{%
-	\def\thischapnum{##2}%
-	\def\thissecnum{0}%
-	\def\thissubsecnum{0}%
-      }%
-      \def\numsecentry##1##2##3##4{%
-	\advancenumber{chap\thischapnum}%
-	\def\thissecnum{##2}%
-	\def\thissubsecnum{0}%
-      }%
-      \def\numsubsecentry##1##2##3##4{%
-	\advancenumber{sec\thissecnum}%
-	\def\thissubsecnum{##2}%
-      }%
-      \def\numsubsubsecentry##1##2##3##4{%
-	\advancenumber{subsec\thissubsecnum}%
-      }%
-      \def\thischapnum{0}%
-      \def\thissecnum{0}%
-      \def\thissubsecnum{0}%
-      %
-      % use \def rather than \let here because we redefine \chapentry et
-      % al. a second time, below.
-      \def\appentry{\numchapentry}%
-      \def\appsecentry{\numsecentry}%
-      \def\appsubsecentry{\numsubsecentry}%
-      \def\appsubsubsecentry{\numsubsubsecentry}%
-      \def\unnchapentry{\numchapentry}%
-      \def\unnsecentry{\numsecentry}%
-      \def\unnsubsecentry{\numsubsecentry}%
-      \def\unnsubsubsecentry{\numsubsubsecentry}%
-      \readdatafile{toc}%
-      %
-      % Read toc second time, this time actually producing the outlines.
-      % The `-' means take the \expnumber as the absolute number of
-      % subentries, which we calculated on our first read of the .toc above.
-      %
-      % We use the node names as the destinations.
-      \def\numchapentry##1##2##3##4{%
-        \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
-      \def\numsecentry##1##2##3##4{%
-        \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
-      \def\numsubsecentry##1##2##3##4{%
-        \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
-      \def\numsubsubsecentry##1##2##3##4{% count is always zero
-        \dopdfoutline{##1}{}{##3}{##4}}%
-      %
-      % PDF outlines are displayed using system fonts, instead of
-      % document fonts.  Therefore we cannot use special characters,
-      % since the encoding is unknown.  For example, the eogonek from
-      % Latin 2 (0xea) gets translated to a | character.  Info from
-      % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
-      %
-      % xx to do this right, we have to translate 8-bit characters to
-      % their "best" equivalent, based on the @documentencoding.  Right
-      % now, I guess we'll just let the pdf reader have its way.
-      \indexnofonts
-      \setupdatafile
-      \catcode`\\=\active \otherbackslash
-      \input \tocreadfilename
-    \endgroup
-  }
-  %
-  \def\skipspaces#1{\def\PP{#1}\def\D{|}%
-    \ifx\PP\D\let\nextsp\relax
-    \else\let\nextsp\skipspaces
-      \ifx\p\space\else\addtokens{\filename}{\PP}%
-        \advance\filenamelength by 1
-      \fi
-    \fi
-    \nextsp}
-  \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
-  \ifnum\pdftexversion < 14
-    \let \startlink \pdfannotlink
-  \else
-    \let \startlink \pdfstartlink
-  \fi
-  % make a live url in pdf output.
-  \def\pdfurl#1{%
-    \begingroup
-      % it seems we really need yet another set of dummies; have not
-      % tried to figure out what each command should do in the context
-      % of @url.  for now, just make @/ a no-op, that's the only one
-      % people have actually reported a problem with.
-      %
-      \normalturnoffactive
-      \def\@{@}%
-      \let\/=\empty
-      \makevalueexpandable
-      % do we want to go so far as to use \indexnofonts instead of just
-      % special-casing \var here?
-      \def\var##1{##1}%
-      %
-      \leavevmode\setcolor{\urlcolor}%
-      \startlink attr{/Border [0 0 0]}%
-        user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
-    \endgroup}
-  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
-  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
-  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
-  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
-  \def\maketoks{%
-    \expandafter\poptoks\the\toksA|ENDTOKS|\relax
-    \ifx\first0\adn0
-    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
-    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
-    \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
-    \else
-      \ifnum0=\countA\else\makelink\fi
-      \ifx\first.\let\next=\done\else
-        \let\next=\maketoks
-        \addtokens{\toksB}{\the\toksD}
-        \ifx\first,\addtokens{\toksB}{\space}\fi
-      \fi
-    \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
-    \next}
-  \def\makelink{\addtokens{\toksB}%
-    {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
-  \def\pdflink#1{%
-    \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
-    \setcolor{\linkcolor}#1\endlink}
-  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
-\else
-  % non-pdf mode
-  \let\pdfmkdest = \gobble
-  \let\pdfurl = \gobble
-  \let\endlink = \relax
-  \let\setcolor = \gobble
-  \let\pdfsetcolor = \gobble
-  \let\pdfmakeoutlines = \relax
-\fi  % \ifx\pdfoutput
-
-
-\message{fonts,}
-
-% Change the current font style to #1, remembering it in \curfontstyle.
-% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
-% italics, not bold italics.
-%
-\def\setfontstyle#1{%
-  \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
-  \csname ten#1\endcsname  % change the current font
-}
-
-% Select #1 fonts with the current style.
-%
-\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
-
-\def\rm{\fam=0 \setfontstyle{rm}}
-\def\it{\fam=\itfam \setfontstyle{it}}
-\def\sl{\fam=\slfam \setfontstyle{sl}}
-\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
-\def\tt{\fam=\ttfam \setfontstyle{tt}}
-
-% Unfortunately, we have to override this for titles and the like, since
-% in those cases "rm" is bold.  Sigh.
-\def\rmisbold{\rm\def\curfontstyle{bf}}
-
-% Texinfo sort of supports the sans serif font style, which plain TeX does not.
-% So we set up a \sf.
-\newfam\sffam
-\def\sf{\fam=\sffam \setfontstyle{sf}}
-\let\li = \sf % Sometimes we call it \li, not \sf.
-
-% We don't need math for this font style.
-\def\ttsl{\setfontstyle{ttsl}}
-
-
-% Default leading.
-\newdimen\textleading  \textleading = 13.2pt
-
-% Set the baselineskip to #1, and the lineskip and strut size
-% correspondingly.  There is no deep meaning behind these magic numbers
-% used as factors; they just match (closely enough) what Knuth defined.
-%
-\def\lineskipfactor{.08333}
-\def\strutheightpercent{.70833}
-\def\strutdepthpercent {.29167}
-%
-% can get a sort of poor man's double spacing by redefining this.
-\def\baselinefactor{1}
-%
-\def\setleading#1{%
-  \dimen0 = #1\relax
-  \normalbaselineskip = \baselinefactor\dimen0
-  \normallineskip = \lineskipfactor\normalbaselineskip
-  \normalbaselines
-  \setbox\strutbox =\hbox{%
-    \vrule width0pt height\strutheightpercent\baselineskip
-                    depth \strutdepthpercent \baselineskip
-  }%
-}
-
-% PDF CMaps.  See also LaTeX's t1.cmap.
-%
-% do nothing with this by default.
-\expandafter\let\csname cmapOT1\endcsname\gobble
-\expandafter\let\csname cmapOT1IT\endcsname\gobble
-\expandafter\let\csname cmapOT1TT\endcsname\gobble
-
-% if we are producing pdf, and we have \pdffontattr, then define cmaps.
-% (\pdffontattr was introduced many years ago, but people still run
-% older pdftex's; it's easy to conditionalize, so we do.)
-\ifpdf \ifx\pdffontattr\undefined \else
-  \begingroup
-    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
-    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
-%%DocumentNeededResources: ProcSet (CIDInit)
-%%IncludeResource: ProcSet (CIDInit)
-%%BeginResource: CMap (TeX-OT1-0)
-%%Title: (TeX-OT1-0 TeX OT1 0)
-%%Version: 1.000
-%%EndComments
-/CIDInit /ProcSet findresource begin
-12 dict begin
-begincmap
-/CIDSystemInfo
-<< /Registry (TeX)
-/Ordering (OT1)
-/Supplement 0
->> def
-/CMapName /TeX-OT1-0 def
-/CMapType 2 def
-1 begincodespacerange
-<00> <7F>
-endcodespacerange
-8 beginbfrange
-<00> <01> <0393>
-<09> <0A> <03A8>
-<23> <26> <0023>
-<28> <3B> <0028>
-<3F> <5B> <003F>
-<5D> <5E> <005D>
-<61> <7A> <0061>
-<7B> <7C> <2013>
-endbfrange
-40 beginbfchar
-<02> <0398>
-<03> <039B>
-<04> <039E>
-<05> <03A0>
-<06> <03A3>
-<07> <03D2>
-<08> <03A6>
-<0B> <00660066>
-<0C> <00660069>
-<0D> <0066006C>
-<0E> <006600660069>
-<0F> <00660066006C>
-<10> <0131>
-<11> <0237>
-<12> <0060>
-<13> <00B4>
-<14> <02C7>
-<15> <02D8>
-<16> <00AF>
-<17> <02DA>
-<18> <00B8>
-<19> <00DF>
-<1A> <00E6>
-<1B> <0153>
-<1C> <00F8>
-<1D> <00C6>
-<1E> <0152>
-<1F> <00D8>
-<21> <0021>
-<22> <201D>
-<27> <2019>
-<3C> <00A1>
-<3D> <003D>
-<3E> <00BF>
-<5C> <201C>
-<5F> <02D9>
-<60> <2018>
-<7D> <02DD>
-<7E> <007E>
-<7F> <00A8>
-endbfchar
-endcmap
-CMapName currentdict /CMap defineresource pop
-end
-end
-%%EndResource
-%%EOF
-    }\endgroup
-  \expandafter\edef\csname cmapOT1\endcsname#1{%
-    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
-  }%
-%
-% \cmapOT1IT
-  \begingroup
-    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
-    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
-%%DocumentNeededResources: ProcSet (CIDInit)
-%%IncludeResource: ProcSet (CIDInit)
-%%BeginResource: CMap (TeX-OT1IT-0)
-%%Title: (TeX-OT1IT-0 TeX OT1IT 0)
-%%Version: 1.000
-%%EndComments
-/CIDInit /ProcSet findresource begin
-12 dict begin
-begincmap
-/CIDSystemInfo
-<< /Registry (TeX)
-/Ordering (OT1IT)
-/Supplement 0
->> def
-/CMapName /TeX-OT1IT-0 def
-/CMapType 2 def
-1 begincodespacerange
-<00> <7F>
-endcodespacerange
-8 beginbfrange
-<00> <01> <0393>
-<09> <0A> <03A8>
-<25> <26> <0025>
-<28> <3B> <0028>
-<3F> <5B> <003F>
-<5D> <5E> <005D>
-<61> <7A> <0061>
-<7B> <7C> <2013>
-endbfrange
-42 beginbfchar
-<02> <0398>
-<03> <039B>
-<04> <039E>
-<05> <03A0>
-<06> <03A3>
-<07> <03D2>
-<08> <03A6>
-<0B> <00660066>
-<0C> <00660069>
-<0D> <0066006C>
-<0E> <006600660069>
-<0F> <00660066006C>
-<10> <0131>
-<11> <0237>
-<12> <0060>
-<13> <00B4>
-<14> <02C7>
-<15> <02D8>
-<16> <00AF>
-<17> <02DA>
-<18> <00B8>
-<19> <00DF>
-<1A> <00E6>
-<1B> <0153>
-<1C> <00F8>
-<1D> <00C6>
-<1E> <0152>
-<1F> <00D8>
-<21> <0021>
-<22> <201D>
-<23> <0023>
-<24> <00A3>
-<27> <2019>
-<3C> <00A1>
-<3D> <003D>
-<3E> <00BF>
-<5C> <201C>
-<5F> <02D9>
-<60> <2018>
-<7D> <02DD>
-<7E> <007E>
-<7F> <00A8>
-endbfchar
-endcmap
-CMapName currentdict /CMap defineresource pop
-end
-end
-%%EndResource
-%%EOF
-    }\endgroup
-  \expandafter\edef\csname cmapOT1IT\endcsname#1{%
-    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
-  }%
-%
-% \cmapOT1TT
-  \begingroup
-    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
-    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
-%%DocumentNeededResources: ProcSet (CIDInit)
-%%IncludeResource: ProcSet (CIDInit)
-%%BeginResource: CMap (TeX-OT1TT-0)
-%%Title: (TeX-OT1TT-0 TeX OT1TT 0)
-%%Version: 1.000
-%%EndComments
-/CIDInit /ProcSet findresource begin
-12 dict begin
-begincmap
-/CIDSystemInfo
-<< /Registry (TeX)
-/Ordering (OT1TT)
-/Supplement 0
->> def
-/CMapName /TeX-OT1TT-0 def
-/CMapType 2 def
-1 begincodespacerange
-<00> <7F>
-endcodespacerange
-5 beginbfrange
-<00> <01> <0393>
-<09> <0A> <03A8>
-<21> <26> <0021>
-<28> <5F> <0028>
-<61> <7E> <0061>
-endbfrange
-32 beginbfchar
-<02> <0398>
-<03> <039B>
-<04> <039E>
-<05> <03A0>
-<06> <03A3>
-<07> <03D2>
-<08> <03A6>
-<0B> <2191>
-<0C> <2193>
-<0D> <0027>
-<0E> <00A1>
-<0F> <00BF>
-<10> <0131>
-<11> <0237>
-<12> <0060>
-<13> <00B4>
-<14> <02C7>
-<15> <02D8>
-<16> <00AF>
-<17> <02DA>
-<18> <00B8>
-<19> <00DF>
-<1A> <00E6>
-<1B> <0153>
-<1C> <00F8>
-<1D> <00C6>
-<1E> <0152>
-<1F> <00D8>
-<20> <2423>
-<27> <2019>
-<60> <2018>
-<7F> <00A8>
-endbfchar
-endcmap
-CMapName currentdict /CMap defineresource pop
-end
-end
-%%EndResource
-%%EOF
-    }\endgroup
-  \expandafter\edef\csname cmapOT1TT\endcsname#1{%
-    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
-  }%
-\fi\fi
-
-
-% Set the font macro #1 to the font named #2, adding on the
-% specified font prefix (normally `cm').
-% #3 is the font's design size, #4 is a scale factor, #5 is the CMap
-% encoding (currently only OT1, OT1IT and OT1TT are allowed, pass
-% empty to omit).
-\def\setfont#1#2#3#4#5{%
-  \font#1=\fontprefix#2#3 scaled #4
-  \csname cmap#5\endcsname#1%
-}
-% This is what gets called when #5 of \setfont is empty.
-\let\cmap\gobble
-% emacs-page end of cmaps
-
-% Use cm as the default font prefix.
-% To specify the font prefix, you must define \fontprefix
-% before you read in texinfo.tex.
-\ifx\fontprefix\undefined
-\def\fontprefix{cm}
-\fi
-% Support font families that don't use the same naming scheme as CM.
-\def\rmshape{r}
-\def\rmbshape{bx}               %where the normal face is bold
-\def\bfshape{b}
-\def\bxshape{bx}
-\def\ttshape{tt}
-\def\ttbshape{tt}
-\def\ttslshape{sltt}
-\def\itshape{ti}
-\def\itbshape{bxti}
-\def\slshape{sl}
-\def\slbshape{bxsl}
-\def\sfshape{ss}
-\def\sfbshape{ss}
-\def\scshape{csc}
-\def\scbshape{csc}
-
-% Definitions for a main text size of 11pt.  This is the default in
-% Texinfo.
-%
-\def\definetextfontsizexi{%
-% Text fonts (11.2pt, magstep1).
-\def\textnominalsize{11pt}
-\edef\mainmagstep{\magstephalf}
-\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
-\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
-\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
-\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
-\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
-\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
-\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
-\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
-\font\texti=cmmi10 scaled \mainmagstep
-\font\textsy=cmsy10 scaled \mainmagstep
-\def\textecsize{1095}
-
-% A few fonts for @defun names and args.
-\setfont\defbf\bfshape{10}{\magstep1}{OT1}
-\setfont\deftt\ttshape{10}{\magstep1}{OT1TT}
-\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT}
-\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
-
-% Fonts for indices, footnotes, small examples (9pt).
-\def\smallnominalsize{9pt}
-\setfont\smallrm\rmshape{9}{1000}{OT1}
-\setfont\smalltt\ttshape{9}{1000}{OT1TT}
-\setfont\smallbf\bfshape{10}{900}{OT1}
-\setfont\smallit\itshape{9}{1000}{OT1IT}
-\setfont\smallsl\slshape{9}{1000}{OT1}
-\setfont\smallsf\sfshape{9}{1000}{OT1}
-\setfont\smallsc\scshape{10}{900}{OT1}
-\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
-\font\smalli=cmmi9
-\font\smallsy=cmsy9
-\def\smallecsize{0900}
-
-% Fonts for small examples (8pt).
-\def\smallernominalsize{8pt}
-\setfont\smallerrm\rmshape{8}{1000}{OT1}
-\setfont\smallertt\ttshape{8}{1000}{OT1TT}
-\setfont\smallerbf\bfshape{10}{800}{OT1}
-\setfont\smallerit\itshape{8}{1000}{OT1IT}
-\setfont\smallersl\slshape{8}{1000}{OT1}
-\setfont\smallersf\sfshape{8}{1000}{OT1}
-\setfont\smallersc\scshape{10}{800}{OT1}
-\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
-\font\smalleri=cmmi8
-\font\smallersy=cmsy8
-\def\smallerecsize{0800}
-
-% Fonts for title page (20.4pt):
-\def\titlenominalsize{20pt}
-\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
-\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
-\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
-\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
-\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
-\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
-\let\titlebf=\titlerm
-\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
-\font\titlei=cmmi12 scaled \magstep3
-\font\titlesy=cmsy10 scaled \magstep4
-\def\titleecsize{2074}
-
-% Chapter (and unnumbered) fonts (17.28pt).
-\def\chapnominalsize{17pt}
-\setfont\chaprm\rmbshape{12}{\magstep2}{OT1}
-\setfont\chapit\itbshape{10}{\magstep3}{OT1IT}
-\setfont\chapsl\slbshape{10}{\magstep3}{OT1}
-\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT}
-\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT}
-\setfont\chapsf\sfbshape{17}{1000}{OT1}
-\let\chapbf=\chaprm
-\setfont\chapsc\scbshape{10}{\magstep3}{OT1}
-\font\chapi=cmmi12 scaled \magstep2
-\font\chapsy=cmsy10 scaled \magstep3
-\def\chapecsize{1728}
-
-% Section fonts (14.4pt).
-\def\secnominalsize{14pt}
-\setfont\secrm\rmbshape{12}{\magstep1}{OT1}
-\setfont\secit\itbshape{10}{\magstep2}{OT1IT}
-\setfont\secsl\slbshape{10}{\magstep2}{OT1}
-\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT}
-\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT}
-\setfont\secsf\sfbshape{12}{\magstep1}{OT1}
-\let\secbf\secrm
-\setfont\secsc\scbshape{10}{\magstep2}{OT1}
-\font\seci=cmmi12 scaled \magstep1
-\font\secsy=cmsy10 scaled \magstep2
-\def\sececsize{1440}
-
-% Subsection fonts (13.15pt).
-\def\ssecnominalsize{13pt}
-\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1}
-\setfont\ssecit\itbshape{10}{1315}{OT1IT}
-\setfont\ssecsl\slbshape{10}{1315}{OT1}
-\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT}
-\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT}
-\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1}
-\let\ssecbf\ssecrm
-\setfont\ssecsc\scbshape{10}{1315}{OT1}
-\font\sseci=cmmi12 scaled \magstephalf
-\font\ssecsy=cmsy10 scaled 1315
-\def\ssececsize{1200}
-
-% Reduced fonts for @acro in text (10pt).
-\def\reducednominalsize{10pt}
-\setfont\reducedrm\rmshape{10}{1000}{OT1}
-\setfont\reducedtt\ttshape{10}{1000}{OT1TT}
-\setfont\reducedbf\bfshape{10}{1000}{OT1}
-\setfont\reducedit\itshape{10}{1000}{OT1IT}
-\setfont\reducedsl\slshape{10}{1000}{OT1}
-\setfont\reducedsf\sfshape{10}{1000}{OT1}
-\setfont\reducedsc\scshape{10}{1000}{OT1}
-\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT}
-\font\reducedi=cmmi10
-\font\reducedsy=cmsy10
-\def\reducedecsize{1000}
-
-% reset the current fonts
-\textfonts
-\rm
-} % end of 11pt text font size definitions
-
-
-% Definitions to make the main text be 10pt Computer Modern, with
-% section, chapter, etc., sizes following suit.  This is for the GNU
-% Press printing of the Emacs 22 manual.  Maybe other manuals in the
-% future.  Used with @smallbook, which sets the leading to 12pt.
-%
-\def\definetextfontsizex{%
-% Text fonts (10pt).
-\def\textnominalsize{10pt}
-\edef\mainmagstep{1000}
-\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
-\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
-\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
-\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
-\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
-\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
-\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
-\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
-\font\texti=cmmi10 scaled \mainmagstep
-\font\textsy=cmsy10 scaled \mainmagstep
-\def\textecsize{1000}
-
-% A few fonts for @defun names and args.
-\setfont\defbf\bfshape{10}{\magstephalf}{OT1}
-\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT}
-\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT}
-\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
-
-% Fonts for indices, footnotes, small examples (9pt).
-\def\smallnominalsize{9pt}
-\setfont\smallrm\rmshape{9}{1000}{OT1}
-\setfont\smalltt\ttshape{9}{1000}{OT1TT}
-\setfont\smallbf\bfshape{10}{900}{OT1}
-\setfont\smallit\itshape{9}{1000}{OT1IT}
-\setfont\smallsl\slshape{9}{1000}{OT1}
-\setfont\smallsf\sfshape{9}{1000}{OT1}
-\setfont\smallsc\scshape{10}{900}{OT1}
-\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
-\font\smalli=cmmi9
-\font\smallsy=cmsy9
-\def\smallecsize{0900}
-
-% Fonts for small examples (8pt).
-\def\smallernominalsize{8pt}
-\setfont\smallerrm\rmshape{8}{1000}{OT1}
-\setfont\smallertt\ttshape{8}{1000}{OT1TT}
-\setfont\smallerbf\bfshape{10}{800}{OT1}
-\setfont\smallerit\itshape{8}{1000}{OT1IT}
-\setfont\smallersl\slshape{8}{1000}{OT1}
-\setfont\smallersf\sfshape{8}{1000}{OT1}
-\setfont\smallersc\scshape{10}{800}{OT1}
-\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
-\font\smalleri=cmmi8
-\font\smallersy=cmsy8
-\def\smallerecsize{0800}
-
-% Fonts for title page (20.4pt):
-\def\titlenominalsize{20pt}
-\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
-\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
-\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
-\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
-\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
-\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
-\let\titlebf=\titlerm
-\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
-\font\titlei=cmmi12 scaled \magstep3
-\font\titlesy=cmsy10 scaled \magstep4
-\def\titleecsize{2074}
-
-% Chapter fonts (14.4pt).
-\def\chapnominalsize{14pt}
-\setfont\chaprm\rmbshape{12}{\magstep1}{OT1}
-\setfont\chapit\itbshape{10}{\magstep2}{OT1IT}
-\setfont\chapsl\slbshape{10}{\magstep2}{OT1}
-\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT}
-\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT}
-\setfont\chapsf\sfbshape{12}{\magstep1}{OT1}
-\let\chapbf\chaprm
-\setfont\chapsc\scbshape{10}{\magstep2}{OT1}
-\font\chapi=cmmi12 scaled \magstep1
-\font\chapsy=cmsy10 scaled \magstep2
-\def\chapecsize{1440}
-
-% Section fonts (12pt).
-\def\secnominalsize{12pt}
-\setfont\secrm\rmbshape{12}{1000}{OT1}
-\setfont\secit\itbshape{10}{\magstep1}{OT1IT}
-\setfont\secsl\slbshape{10}{\magstep1}{OT1}
-\setfont\sectt\ttbshape{12}{1000}{OT1TT}
-\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT}
-\setfont\secsf\sfbshape{12}{1000}{OT1}
-\let\secbf\secrm
-\setfont\secsc\scbshape{10}{\magstep1}{OT1}
-\font\seci=cmmi12
-\font\secsy=cmsy10 scaled \magstep1
-\def\sececsize{1200}
-
-% Subsection fonts (10pt).
-\def\ssecnominalsize{10pt}
-\setfont\ssecrm\rmbshape{10}{1000}{OT1}
-\setfont\ssecit\itbshape{10}{1000}{OT1IT}
-\setfont\ssecsl\slbshape{10}{1000}{OT1}
-\setfont\ssectt\ttbshape{10}{1000}{OT1TT}
-\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT}
-\setfont\ssecsf\sfbshape{10}{1000}{OT1}
-\let\ssecbf\ssecrm
-\setfont\ssecsc\scbshape{10}{1000}{OT1}
-\font\sseci=cmmi10
-\font\ssecsy=cmsy10
-\def\ssececsize{1000}
-
-% Reduced fonts for @acro in text (9pt).
-\def\reducednominalsize{9pt}
-\setfont\reducedrm\rmshape{9}{1000}{OT1}
-\setfont\reducedtt\ttshape{9}{1000}{OT1TT}
-\setfont\reducedbf\bfshape{10}{900}{OT1}
-\setfont\reducedit\itshape{9}{1000}{OT1IT}
-\setfont\reducedsl\slshape{9}{1000}{OT1}
-\setfont\reducedsf\sfshape{9}{1000}{OT1}
-\setfont\reducedsc\scshape{10}{900}{OT1}
-\setfont\reducedttsl\ttslshape{10}{900}{OT1TT}
-\font\reducedi=cmmi9
-\font\reducedsy=cmsy9
-\def\reducedecsize{0900}
-
-% reduce space between paragraphs
-\divide\parskip by 2
-
-% reset the current fonts
-\textfonts
-\rm
-} % end of 10pt text font size definitions
-
-
-% We provide the user-level command
-%   @fonttextsize 10
-% (or 11) to redefine the text font size.  pt is assumed.
-%
-\def\xword{10}
-\def\xiword{11}
-%
-\parseargdef\fonttextsize{%
-  \def\textsizearg{#1}%
-  \wlog{doing @fonttextsize \textsizearg}%
-  %
-  % Set \globaldefs so that documents can use this inside @tex, since
-  % makeinfo 4.8 does not support it, but we need it nonetheless.
-  %
- \begingroup \globaldefs=1
-  \ifx\textsizearg\xword \definetextfontsizex
-  \else \ifx\textsizearg\xiword \definetextfontsizexi
-  \else
-    \errhelp=\EMsimple
-    \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'}
-  \fi\fi
- \endgroup
-}
-
-
-% In order for the font changes to affect most math symbols and letters,
-% we have to define the \textfont of the standard families.  Since
-% texinfo doesn't allow for producing subscripts and superscripts except
-% in the main text, we don't bother to reset \scriptfont and
-% \scriptscriptfont (which would also require loading a lot more fonts).
-%
-\def\resetmathfonts{%
-  \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
-  \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
-  \textfont\ttfam=\tentt \textfont\sffam=\tensf
-}
-
-% The font-changing commands redefine the meanings of \tenSTYLE, instead
-% of just \STYLE.  We do this because \STYLE needs to also set the
-% current \fam for math mode.  Our \STYLE (e.g., \rm) commands hardwire
-% \tenSTYLE to set the current font.
-%
-% Each font-changing command also sets the names \lsize (one size lower)
-% and \lllsize (three sizes lower).  These relative commands are used in
-% the LaTeX logo and acronyms.
-%
-% This all needs generalizing, badly.
-%
-\def\textfonts{%
-  \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
-  \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
-  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
-  \let\tenttsl=\textttsl
-  \def\curfontsize{text}%
-  \def\lsize{reduced}\def\lllsize{smaller}%
-  \resetmathfonts \setleading{\textleading}}
-\def\titlefonts{%
-  \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
-  \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
-  \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
-  \let\tenttsl=\titlettsl
-  \def\curfontsize{title}%
-  \def\lsize{chap}\def\lllsize{subsec}%
-  \resetmathfonts \setleading{25pt}}
-\def\titlefont#1{{\titlefonts\rmisbold #1}}
-\def\chapfonts{%
-  \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
-  \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
-  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
-  \let\tenttsl=\chapttsl
-  \def\curfontsize{chap}%
-  \def\lsize{sec}\def\lllsize{text}%
-  \resetmathfonts \setleading{19pt}}
-\def\secfonts{%
-  \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
-  \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
-  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
-  \let\tenttsl=\secttsl
-  \def\curfontsize{sec}%
-  \def\lsize{subsec}\def\lllsize{reduced}%
-  \resetmathfonts \setleading{16pt}}
-\def\subsecfonts{%
-  \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
-  \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
-  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
-  \let\tenttsl=\ssecttsl
-  \def\curfontsize{ssec}%
-  \def\lsize{text}\def\lllsize{small}%
-  \resetmathfonts \setleading{15pt}}
-\let\subsubsecfonts = \subsecfonts
-\def\reducedfonts{%
-  \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
-  \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
-  \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
-  \let\tenttsl=\reducedttsl
-  \def\curfontsize{reduced}%
-  \def\lsize{small}\def\lllsize{smaller}%
-  \resetmathfonts \setleading{10.5pt}}
-\def\smallfonts{%
-  \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
-  \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
-  \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
-  \let\tenttsl=\smallttsl
-  \def\curfontsize{small}%
-  \def\lsize{smaller}\def\lllsize{smaller}%
-  \resetmathfonts \setleading{10.5pt}}
-\def\smallerfonts{%
-  \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
-  \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
-  \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
-  \let\tenttsl=\smallerttsl
-  \def\curfontsize{smaller}%
-  \def\lsize{smaller}\def\lllsize{smaller}%
-  \resetmathfonts \setleading{9.5pt}}
-
-% Fonts for short table of contents.
-\setfont\shortcontrm\rmshape{12}{1000}{OT1}
-\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1}  % no cmb12
-\setfont\shortcontsl\slshape{12}{1000}{OT1}
-\setfont\shortconttt\ttshape{12}{1000}{OT1TT}
-
-% Define these just so they can be easily changed for other fonts.
-\def\angleleft{$\langle$}
-\def\angleright{$\rangle$}
-
-% Set the fonts to use with the @small... environments.
-\let\smallexamplefonts = \smallfonts
-
-% About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
-% can fit this many characters:
-%   8.5x11=86   smallbook=72  a4=90  a5=69
-% If we use \scriptfonts (8pt), then we can fit this many characters:
-%   8.5x11=90+  smallbook=80  a4=90+  a5=77
-% For me, subjectively, the few extra characters that fit aren't worth
-% the additional smallness of 8pt.  So I'm making the default 9pt.
-%
-% By the way, for comparison, here's what fits with @example (10pt):
-%   8.5x11=71  smallbook=60  a4=75  a5=58
-% --karl, 24jan03.
-
-% Set up the default fonts, so we can use them for creating boxes.
-%
-\definetextfontsizexi
-
-
-\message{markup,}
-
-% Check if we are currently using a typewriter font.  Since all the
-% Computer Modern typewriter fonts have zero interword stretch (and
-% shrink), and it is reasonable to expect all typewriter fonts to have
-% this property, we can check that font parameter.
-%
-\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
-
-% Markup style infrastructure.  \defmarkupstylesetup\INITMACRO will
-% define and register \INITMACRO to be called on markup style changes.
-% \INITMACRO can check \currentmarkupstyle for the innermost
-% style and the set of \ifmarkupSTYLE switches for all styles
-% currently in effect.
-\newif\ifmarkupvar
-\newif\ifmarkupsamp
-\newif\ifmarkupkey
-%\newif\ifmarkupfile % @file == @samp.
-%\newif\ifmarkupoption % @option == @samp.
-\newif\ifmarkupcode
-\newif\ifmarkupkbd
-%\newif\ifmarkupenv % @env == @code.
-%\newif\ifmarkupcommand % @command == @code.
-\newif\ifmarkuptex % @tex (and part of @math, for now).
-\newif\ifmarkupexample
-\newif\ifmarkupverb
-\newif\ifmarkupverbatim
-
-\let\currentmarkupstyle\empty
-
-\def\setupmarkupstyle#1{%
-  \csname markup#1true\endcsname
-  \def\currentmarkupstyle{#1}%
-  \markupstylesetup
-}
-
-\let\markupstylesetup\empty
-
-\def\defmarkupstylesetup#1{%
-  \expandafter\def\expandafter\markupstylesetup
-    \expandafter{\markupstylesetup #1}%
-  \def#1%
-}
-
-% Markup style setup for left and right quotes.
-\defmarkupstylesetup\markupsetuplq{%
-  \expandafter\let\expandafter \temp \csname markupsetuplq\currentmarkupstyle\endcsname
-  \ifx\temp\relax \markupsetuplqdefault \else \temp \fi
-}
-
-\defmarkupstylesetup\markupsetuprq{%
-  \expandafter\let\expandafter \temp \csname markupsetuprq\currentmarkupstyle\endcsname
-  \ifx\temp\relax \markupsetuprqdefault \else \temp \fi
-}
-
-{
-\catcode`\'=\active
-\catcode`\`=\active
-
-\gdef\markupsetuplqdefault{\let`\lq}
-\gdef\markupsetuprqdefault{\let'\rq}
-
-\gdef\markupsetcodequoteleft{\let`\codequoteleft}
-\gdef\markupsetcodequoteright{\let'\codequoteright}
-
-\gdef\markupsetnoligaturesquoteleft{\let`\noligaturesquoteleft}
-}
-
-\let\markupsetuplqcode \markupsetcodequoteleft
-\let\markupsetuprqcode \markupsetcodequoteright
-\let\markupsetuplqexample \markupsetcodequoteleft
-\let\markupsetuprqexample \markupsetcodequoteright
-\let\markupsetuplqverb \markupsetcodequoteleft
-\let\markupsetuprqverb \markupsetcodequoteright
-\let\markupsetuplqverbatim \markupsetcodequoteleft
-\let\markupsetuprqverbatim \markupsetcodequoteright
-
-\let\markupsetuplqsamp \markupsetnoligaturesquoteleft
-\let\markupsetuplqkbd \markupsetnoligaturesquoteleft
-
-% Allow an option to not replace quotes with a regular directed right
-% quote/apostrophe (char 0x27), but instead use the undirected quote
-% from cmtt (char 0x0d).  The undirected quote is ugly, so don't make it
-% the default, but it works for pasting with more pdf viewers (at least
-% evince), the lilypond developers report.  xpdf does work with the
-% regular 0x27.
-%
-\def\codequoteright{%
-  \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax
-    \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax
-      '%
-    \else \char'15 \fi
-  \else \char'15 \fi
-}
-%
-% and a similar option for the left quote char vs. a grave accent.
-% Modern fonts display ASCII 0x60 as a grave accent, so some people like
-% the code environments to do likewise.
-%
-\def\codequoteleft{%
-  \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax
-    \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax
-      % [Knuth] pp. 380,381,391
-      % \relax disables Spanish ligatures ?` and !` of \tt font.
-      \relax`%
-    \else \char'22 \fi
-  \else \char'22 \fi
-}
-
-% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font.
-\def\noligaturesquoteleft{\relax\lq}
-
-% Count depth in font-changes, for error checks
-\newcount\fontdepth \fontdepth=0
-
-%% Add scribe-like font environments, plus @l for inline lisp (usually sans
-%% serif) and @ii for TeX italic
-
-% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
-% unless the following character is such as not to need one.
-\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
-                    \ptexslash\fi\fi\fi}
-\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
-\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
-
-% like \smartslanted except unconditionally uses \ttsl.
-% @var is set to this for defun arguments.
-\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
-
-% @cite is like \smartslanted except unconditionally use \sl.  We never want
-% ttsl for book titles, do we?
-\def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
-
-\let\i=\smartitalic
-\let\slanted=\smartslanted
-\def\var#1{{\setupmarkupstyle{var}\smartslanted{#1}}}
-\let\dfn=\smartslanted
-\let\emph=\smartitalic
-
-% Explicit font changes: @r, @sc, undocumented @ii.
-\def\r#1{{\rm #1}}              % roman font
-\def\sc#1{{\smallcaps#1}}       % smallcaps font
-\def\ii#1{{\it #1}}             % italic font
-
-% @b, explicit bold.  Also @strong.
-\def\b#1{{\bf #1}}
-\let\strong=\b
-
-% @sansserif, explicit sans.
-\def\sansserif#1{{\sf #1}}
-
-% We can't just use \exhyphenpenalty, because that only has effect at
-% the end of a paragraph.  Restore normal hyphenation at the end of the
-% group within which \nohyphenation is presumably called.
-%
-\def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
-\def\restorehyphenation{\hyphenchar\font = `- }
-
-% Set sfcode to normal for the chars that usually have another value.
-% Can't use plain's \frenchspacing because it uses the `\x notation, and
-% sometimes \x has an active definition that messes things up.
-%
-\catcode`@=11
-  \def\plainfrenchspacing{%
-    \sfcode\dotChar  =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
-    \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
-    \def\endofsentencespacefactor{1000}% for @. and friends
-  }
-  \def\plainnonfrenchspacing{%
-    \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
-    \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
-    \def\endofsentencespacefactor{3000}% for @. and friends
-  }
-\catcode`@=\other
-\def\endofsentencespacefactor{3000}% default
-
-% @t, explicit typewriter.
-\def\t#1{%
-  {\tt \rawbackslash \plainfrenchspacing #1}%
-  \null
-}
-
-% @samp.
-\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}}
-
-% definition of @key that produces a lozenge.  Doesn't adjust to text size.
-%\setfont\keyrm\rmshape{8}{1000}{OT1}
-%\font\keysy=cmsy9
-%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
-%  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
-%    \vbox{\hrule\kern-0.4pt
-%     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
-%    \kern-0.4pt\hrule}%
-%  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
-
-% definition of @key with no lozenge.  If the current font is already
-% monospace, don't change it; that way, we respect @kbdinputstyle.  But
-% if it isn't monospace, then use \tt.
-%
-\def\key#1{{\setupmarkupstyle{key}%
-  \nohyphenation
-  \ifmonospace\else\tt\fi
-  #1}\null}
-
-% ctrl is no longer a Texinfo command.
-\def\ctrl #1{{\tt \rawbackslash \hat}#1}
-
-% @file, @option are the same as @samp.
-\let\file=\samp
-\let\option=\samp
-
-% @code is a modification of @t,
-% which makes spaces the same size as normal in the surrounding text.
-\def\tclose#1{%
-  {%
-    % Change normal interword space to be same as for the current font.
-    \spaceskip = \fontdimen2\font
-    %
-    % Switch to typewriter.
-    \tt
-    %
-    % But `\ ' produces the large typewriter interword space.
-    \def\ {{\spaceskip = 0pt{} }}%
-    %
-    % Turn off hyphenation.
-    \nohyphenation
-    %
-    \rawbackslash
-    \plainfrenchspacing
-    #1%
-  }%
-  \null
-}
-
-% We *must* turn on hyphenation at `-' and `_' in @code.
-% Otherwise, it is too hard to avoid overfull hboxes
-% in the Emacs manual, the Library manual, etc.
-
-% Unfortunately, TeX uses one parameter (\hyphenchar) to control
-% both hyphenation at - and hyphenation within words.
-% We must therefore turn them both off (\tclose does that)
-% and arrange explicitly to hyphenate at a dash.
-%  -- rms.
-{
-  \catcode`\-=\active \catcode`\_=\active
-  \catcode`\'=\active \catcode`\`=\active
-  \global\let'=\rq \global\let`=\lq  % default definitions
-  %
-  \global\def\code{\begingroup
-    \setupmarkupstyle{code}%
-    % The following should really be moved into \setupmarkupstyle handlers.
-    \catcode\dashChar=\active  \catcode\underChar=\active
-    \ifallowcodebreaks
-     \let-\codedash
-     \let_\codeunder
-    \else
-     \let-\realdash
-     \let_\realunder
-    \fi
-    \codex
-  }
-}
-
-\def\realdash{-}
-\def\codedash{-\discretionary{}{}{}}
-\def\codeunder{%
-  % this is all so @math{@code{var_name}+1} can work.  In math mode, _
-  % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
-  % will therefore expand the active definition of _, which is us
-  % (inside @code that is), therefore an endless loop.
-  \ifusingtt{\ifmmode
-               \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
-             \else\normalunderscore \fi
-             \discretionary{}{}{}}%
-            {\_}%
-}
-\def\codex #1{\tclose{#1}\endgroup}
-
-% An additional complication: the above will allow breaks after, e.g.,
-% each of the four underscores in __typeof__.  This is undesirable in
-% some manuals, especially if they don't have long identifiers in
-% general.  @allowcodebreaks provides a way to control this.
-%
-\newif\ifallowcodebreaks  \allowcodebreakstrue
-
-\def\keywordtrue{true}
-\def\keywordfalse{false}
-
-\parseargdef\allowcodebreaks{%
-  \def\txiarg{#1}%
-  \ifx\txiarg\keywordtrue
-    \allowcodebreakstrue
-  \else\ifx\txiarg\keywordfalse
-    \allowcodebreaksfalse
-  \else
-    \errhelp = \EMsimple
-    \errmessage{Unknown @allowcodebreaks option `\txiarg'}%
-  \fi\fi
-}
-
-% @kbd is like @code, except that if the argument is just one @key command,
-% then @kbd has no effect.
-\def\kbd#1{{\setupmarkupstyle{kbd}\def\look{#1}\expandafter\kbdfoo\look??\par}}
-
-% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
-%   `example' (@kbd uses ttsl only inside of @example and friends),
-%   or `code' (@kbd uses normal tty font always).
-\parseargdef\kbdinputstyle{%
-  \def\txiarg{#1}%
-  \ifx\txiarg\worddistinct
-    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
-  \else\ifx\txiarg\wordexample
-    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
-  \else\ifx\txiarg\wordcode
-    \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
-  \else
-    \errhelp = \EMsimple
-    \errmessage{Unknown @kbdinputstyle option `\txiarg'}%
-  \fi\fi\fi
-}
-\def\worddistinct{distinct}
-\def\wordexample{example}
-\def\wordcode{code}
-
-% Default is `distinct'.
-\kbdinputstyle distinct
-
-\def\xkey{\key}
-\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
-\ifx\one\xkey\ifx\threex\three \key{#2}%
-\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
-\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi}
-
-% For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
-\let\indicateurl=\code
-\let\env=\code
-\let\command=\code
-
-% @clicksequence{File @click{} Open ...}
-\def\clicksequence#1{\begingroup #1\endgroup}
-
-% @clickstyle @arrow   (by default)
-\parseargdef\clickstyle{\def\click{#1}}
-\def\click{\arrow}
-
-% @uref (abbreviation for `urlref') takes an optional (comma-separated)
-% second argument specifying the text to display and an optional third
-% arg as text to display instead of (rather than in addition to) the url
-% itself.  First (mandatory) arg is the url.  Perhaps eventually put in
-% a hypertex \special here.
-%
-\def\uref#1{\douref #1,,,\finish}
-\def\douref#1,#2,#3,#4\finish{\begingroup
-  \unsepspaces
-  \pdfurl{#1}%
-  \setbox0 = \hbox{\ignorespaces #3}%
-  \ifdim\wd0 > 0pt
-    \unhbox0 % third arg given, show only that
-  \else
-    \setbox0 = \hbox{\ignorespaces #2}%
-    \ifdim\wd0 > 0pt
-      \ifpdf
-        \unhbox0             % PDF: 2nd arg given, show only it
-      \else
-        \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
-      \fi
-    \else
-      \code{#1}% only url given, so show it
-    \fi
-  \fi
-  \endlink
-\endgroup}
-
-% @url synonym for @uref, since that's how everyone uses it.
-%
-\let\url=\uref
-
-% rms does not like angle brackets --karl, 17may97.
-% So now @email is just like @uref, unless we are pdf.
-%
-%\def\email#1{\angleleft{\tt #1}\angleright}
-\ifpdf
-  \def\email#1{\doemail#1,,\finish}
-  \def\doemail#1,#2,#3\finish{\begingroup
-    \unsepspaces
-    \pdfurl{mailto:#1}%
-    \setbox0 = \hbox{\ignorespaces #2}%
-    \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
-    \endlink
-  \endgroup}
-\else
-  \let\email=\uref
-\fi
-
-% Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
-% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
-%
-\def\dmn#1{\thinspace #1}
-
-% @l was never documented to mean ``switch to the Lisp font'',
-% and it is not used as such in any manual I can find.  We need it for
-% Polish suppressed-l.  --karl, 22sep96.
-%\def\l#1{{\li #1}\null}
-
-% @acronym for "FBI", "NATO", and the like.
-% We print this one point size smaller, since it's intended for
-% all-uppercase.
-%
-\def\acronym#1{\doacronym #1,,\finish}
-\def\doacronym#1,#2,#3\finish{%
-  {\selectfonts\lsize #1}%
-  \def\temp{#2}%
-  \ifx\temp\empty \else
-    \space ({\unsepspaces \ignorespaces \temp \unskip})%
-  \fi
-}
-
-% @abbr for "Comput. J." and the like.
-% No font change, but don't do end-of-sentence spacing.
-%
-\def\abbr#1{\doabbr #1,,\finish}
-\def\doabbr#1,#2,#3\finish{%
-  {\plainfrenchspacing #1}%
-  \def\temp{#2}%
-  \ifx\temp\empty \else
-    \space ({\unsepspaces \ignorespaces \temp \unskip})%
-  \fi
-}
-
-
-\message{glyphs,}
-
-% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
-%
-% Since these characters are used in examples, they should be an even number of
-% \tt widths. Each \tt character is 1en, so two makes it 1em.
-%
-\def\point{$\star$}
-\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}}
-\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
-\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}}
-\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
-\def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}}
-
-% The @error{} command.
-% Adapted from the TeXbook's \boxit.
-%
-\newbox\errorbox
-%
-{\tentt \global\dimen0 = 3em}% Width of the box.
-\dimen2 = .55pt % Thickness of rules
-% The text. (`r' is open on the right, `e' somewhat less so on the left.)
-\setbox0 = \hbox{\kern-.75pt \reducedsf error\kern-1.5pt}
-%
-\setbox\errorbox=\hbox to \dimen0{\hfil
-   \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
-   \advance\hsize by -2\dimen2 % Rules.
-   \vbox{%
-      \hrule height\dimen2
-      \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
-         \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
-         \kern3pt\vrule width\dimen2}% Space to right.
-      \hrule height\dimen2}
-    \hfil}
-%
-\def\error{\leavevmode\lower.7ex\copy\errorbox}
-
-% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
-%
-\def\pounds{{\it\$}}
-
-% @euro{} comes from a separate font, depending on the current style.
-% We use the free feym* fonts from the eurosym package by Henrik
-% Theiling, which support regular, slanted, bold and bold slanted (and
-% "outlined" (blackboard board, sort of) versions, which we don't need).
-% It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
-%
-% Although only regular is the truly official Euro symbol, we ignore
-% that.  The Euro is designed to be slightly taller than the regular
-% font height.
-%
-% feymr - regular
-% feymo - slanted
-% feybr - bold
-% feybo - bold slanted
-%
-% There is no good (free) typewriter version, to my knowledge.
-% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
-% Hmm.
-%
-% Also doesn't work in math.  Do we need to do math with euro symbols?
-% Hope not.
-%
-%
-\def\euro{{\eurofont e}}
-\def\eurofont{%
-  % We set the font at each command, rather than predefining it in
-  % \textfonts and the other font-switching commands, so that
-  % installations which never need the symbol don't have to have the
-  % font installed.
-  %
-  % There is only one designed size (nominal 10pt), so we always scale
-  % that to the current nominal size.
-  %
-  % By the way, simply using "at 1em" works for cmr10 and the like, but
-  % does not work for cmbx10 and other extended/shrunken fonts.
-  %
-  \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
-  %
-  \ifx\curfontstyle\bfstylename
-    % bold:
-    \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
-  \else
-    % regular:
-    \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
-  \fi
-  \thiseurofont
-}
-
-% Glyphs from the EC fonts.  We don't use \let for the aliases, because
-% sometimes we redefine the original macro, and the alias should reflect
-% the redefinition.
-%
-% Use LaTeX names for the Icelandic letters.
-\def\DH{{\ecfont \char"D0}} % Eth
-\def\dh{{\ecfont \char"F0}} % eth
-\def\TH{{\ecfont \char"DE}} % Thorn
-\def\th{{\ecfont \char"FE}} % thorn
-%
-\def\guillemetleft{{\ecfont \char"13}}
-\def\guillemotleft{\guillemetleft}
-\def\guillemetright{{\ecfont \char"14}}
-\def\guillemotright{\guillemetright}
-\def\guilsinglleft{{\ecfont \char"0E}}
-\def\guilsinglright{{\ecfont \char"0F}}
-\def\quotedblbase{{\ecfont \char"12}}
-\def\quotesinglbase{{\ecfont \char"0D}}
-%
-% This positioning is not perfect (see the ogonek LaTeX package), but
-% we have the precomposed glyphs for the most common cases.  We put the
-% tests to use those glyphs in the single \ogonek macro so we have fewer
-% dummy definitions to worry about for index entries, etc.
-%
-% ogonek is also used with other letters in Lithuanian (IOU), but using
-% the precomposed glyphs for those is not so easy since they aren't in
-% the same EC font.
-\def\ogonek#1{{%
-  \def\temp{#1}%
-  \ifx\temp\macrocharA\Aogonek
-  \else\ifx\temp\macrochara\aogonek
-  \else\ifx\temp\macrocharE\Eogonek
-  \else\ifx\temp\macrochare\eogonek
-  \else
-    \ecfont \setbox0=\hbox{#1}%
-    \ifdim\ht0=1ex\accent"0C #1%
-    \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}%
-    \fi
-  \fi\fi\fi\fi
-  }%
-}
-\def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A}
-\def\aogonek{{\ecfont \char"A1}}\def\macrochara{a}
-\def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E}
-\def\eogonek{{\ecfont \char"A6}}\def\macrochare{e}
-%
-% Use the ec* fonts (cm-super in outline format) for non-CM glyphs.
-\def\ecfont{%
-  % We can't distinguish serif/sans and italic/slanted, but this
-  % is used for crude hacks anyway (like adding French and German
-  % quotes to documents typeset with CM, where we lose kerning), so
-  % hopefully nobody will notice/care.
-  \edef\ecsize{\csname\curfontsize ecsize\endcsname}%
-  \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}%
-  \ifx\curfontstyle\bfstylename
-    % bold:
-    \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize
-  \else
-    % regular:
-    \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize
-  \fi
-  \thisecfont
-}
-
-% @registeredsymbol - R in a circle.  The font for the R should really
-% be smaller yet, but lllsize is the best we can do for now.
-% Adapted from the plain.tex definition of \copyright.
-%
-\def\registeredsymbol{%
-  $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
-               \hfil\crcr\Orb}}%
-    }$%
-}
-
-% @textdegree - the normal degrees sign.
-%
-\def\textdegree{$^\circ$}
-
-% Laurent Siebenmann reports \Orb undefined with:
-%  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38
-% so we'll define it if necessary.
-%
-\ifx\Orb\undefined
-\def\Orb{\mathhexbox20D}
-\fi
-
-% Quotes.
-\chardef\quotedblleft="5C
-\chardef\quotedblright=`\"
-\chardef\quoteleft=`\`
-\chardef\quoteright=`\'
-
-
-\message{page headings,}
-
-\newskip\titlepagetopglue \titlepagetopglue = 1.5in
-\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
-
-% First the title page.  Must do @settitle before @titlepage.
-\newif\ifseenauthor
-\newif\iffinishedtitlepage
-
-% Do an implicit @contents or @shortcontents after @end titlepage if the
-% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
-%
-\newif\ifsetcontentsaftertitlepage
- \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
-\newif\ifsetshortcontentsaftertitlepage
- \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
-
-\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
-        \endgroup\page\hbox{}\page}
-
-\envdef\titlepage{%
-  % Open one extra group, as we want to close it in the middle of \Etitlepage.
-  \begingroup
-    \parindent=0pt \textfonts
-    % Leave some space at the very top of the page.
-    \vglue\titlepagetopglue
-    % No rule at page bottom unless we print one at the top with @title.
-    \finishedtitlepagetrue
-    %
-    % Most title ``pages'' are actually two pages long, with space
-    % at the top of the second.  We don't want the ragged left on the second.
-    \let\oldpage = \page
-    \def\page{%
-      \iffinishedtitlepage\else
-	 \finishtitlepage
-      \fi
-      \let\page = \oldpage
-      \page
-      \null
-    }%
-}
-
-\def\Etitlepage{%
-    \iffinishedtitlepage\else
-	\finishtitlepage
-    \fi
-    % It is important to do the page break before ending the group,
-    % because the headline and footline are only empty inside the group.
-    % If we use the new definition of \page, we always get a blank page
-    % after the title page, which we certainly don't want.
-    \oldpage
-  \endgroup
-  %
-  % Need this before the \...aftertitlepage checks so that if they are
-  % in effect the toc pages will come out with page numbers.
-  \HEADINGSon
-  %
-  % If they want short, they certainly want long too.
-  \ifsetshortcontentsaftertitlepage
-    \shortcontents
-    \contents
-    \global\let\shortcontents = \relax
-    \global\let\contents = \relax
-  \fi
-  %
-  \ifsetcontentsaftertitlepage
-    \contents
-    \global\let\contents = \relax
-    \global\let\shortcontents = \relax
-  \fi
-}
-
-\def\finishtitlepage{%
-  \vskip4pt \hrule height 2pt width \hsize
-  \vskip\titlepagebottomglue
-  \finishedtitlepagetrue
-}
-
-%%% Macros to be used within @titlepage:
-
-\let\subtitlerm=\tenrm
-\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
-
-\parseargdef\title{%
-  \checkenv\titlepage
-  \leftline{\titlefonts\rmisbold #1}
-  % print a rule at the page bottom also.
-  \finishedtitlepagefalse
-  \vskip4pt \hrule height 4pt width \hsize \vskip4pt
-}
-
-\parseargdef\subtitle{%
-  \checkenv\titlepage
-  {\subtitlefont \rightline{#1}}%
-}
-
-% @author should come last, but may come many times.
-% It can also be used inside @quotation.
-%
-\parseargdef\author{%
-  \def\temp{\quotation}%
-  \ifx\thisenv\temp
-    \def\quotationauthor{#1}% printed in \Equotation.
-  \else
-    \checkenv\titlepage
-    \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
-    {\secfonts\rmisbold \leftline{#1}}%
-  \fi
-}
-
-
-%%% Set up page headings and footings.
-
-\let\thispage=\folio
-
-\newtoks\evenheadline    % headline on even pages
-\newtoks\oddheadline     % headline on odd pages
-\newtoks\evenfootline    % footline on even pages
-\newtoks\oddfootline     % footline on odd pages
-
-% Now make TeX use those variables
-\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
-                            \else \the\evenheadline \fi}}
-\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
-                            \else \the\evenfootline \fi}\HEADINGShook}
-\let\HEADINGShook=\relax
-
-% Commands to set those variables.
-% For example, this is what  @headings on  does
-% @evenheading @thistitle|@thispage|@thischapter
-% @oddheading @thischapter|@thispage|@thistitle
-% @evenfooting @thisfile||
-% @oddfooting ||@thisfile
-
-
-\def\evenheading{\parsearg\evenheadingxxx}
-\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
-\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
-\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\def\oddheading{\parsearg\oddheadingxxx}
-\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
-\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
-\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
-
-\def\evenfooting{\parsearg\evenfootingxxx}
-\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
-\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
-\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\def\oddfooting{\parsearg\oddfootingxxx}
-\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
-\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
-  \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
-  %
-  % Leave some space for the footline.  Hopefully ok to assume
-  % @evenfooting will not be used by itself.
-  \global\advance\pageheight by -12pt
-  \global\advance\vsize by -12pt
-}
-
-\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
-
-% @evenheadingmarks top     \thischapter <- chapter at the top of a page
-% @evenheadingmarks bottom  \thischapter <- chapter at the bottom of a page
-%
-% The same set of arguments for:
-%
-% @oddheadingmarks
-% @evenfootingmarks
-% @oddfootingmarks
-% @everyheadingmarks
-% @everyfootingmarks
-
-\def\evenheadingmarks{\headingmarks{even}{heading}}
-\def\oddheadingmarks{\headingmarks{odd}{heading}}
-\def\evenfootingmarks{\headingmarks{even}{footing}}
-\def\oddfootingmarks{\headingmarks{odd}{footing}}
-\def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1}
-                          \headingmarks{odd}{heading}{#1} }
-\def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1}
-                          \headingmarks{odd}{footing}{#1} }
-% #1 = even/odd, #2 = heading/footing, #3 = top/bottom.
-\def\headingmarks#1#2#3 {%
-  \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname
-  \global\expandafter\let\csname get#1#2marks\endcsname \temp
-}
-
-\everyheadingmarks bottom
-\everyfootingmarks bottom
-
-% @headings double      turns headings on for double-sided printing.
-% @headings single      turns headings on for single-sided printing.
-% @headings off         turns them off.
-% @headings on          same as @headings double, retained for compatibility.
-% @headings after       turns on double-sided headings after this page.
-% @headings doubleafter turns on double-sided headings after this page.
-% @headings singleafter turns on single-sided headings after this page.
-% By default, they are off at the start of a document,
-% and turned `on' after @end titlepage.
-
-\def\headings #1 {\csname HEADINGS#1\endcsname}
-
-\def\HEADINGSoff{%
-\global\evenheadline={\hfil} \global\evenfootline={\hfil}
-\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
-\HEADINGSoff
-% When we turn headings on, set the page number to 1.
-% For double-sided printing, put current file name in lower left corner,
-% chapter name on inside top of right hand pages, document
-% title on inside top of left hand pages, and page numbers on outside top
-% edge of all pages.
-\def\HEADINGSdouble{%
-\global\pageno=1
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\folio\hfil\thistitle}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-\global\let\contentsalignmacro = \chapoddpage
-}
-\let\contentsalignmacro = \chappager
-
-% For single-sided printing, chapter title goes across top left of page,
-% page number on top right.
-\def\HEADINGSsingle{%
-\global\pageno=1
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\thischapter\hfil\folio}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-\global\let\contentsalignmacro = \chappager
-}
-\def\HEADINGSon{\HEADINGSdouble}
-
-\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
-\let\HEADINGSdoubleafter=\HEADINGSafter
-\def\HEADINGSdoublex{%
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\folio\hfil\thistitle}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-\global\let\contentsalignmacro = \chapoddpage
-}
-
-\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
-\def\HEADINGSsinglex{%
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\thischapter\hfil\folio}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-\global\let\contentsalignmacro = \chappager
-}
-
-% Subroutines used in generating headings
-% This produces Day Month Year style of output.
-% Only define if not already defined, in case a txi-??.tex file has set
-% up a different format (e.g., txi-cs.tex does this).
-\ifx\today\undefined
-\def\today{%
-  \number\day\space
-  \ifcase\month
-  \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
-  \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
-  \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
-  \fi
-  \space\number\year}
-\fi
-
-% @settitle line...  specifies the title of the document, for headings.
-% It generates no output of its own.
-\def\thistitle{\putwordNoTitle}
-\def\settitle{\parsearg{\gdef\thistitle}}
-
-
-\message{tables,}
-% Tables -- @table, @ftable, @vtable, @item(x).
-
-% default indentation of table text
-\newdimen\tableindent \tableindent=.8in
-% default indentation of @itemize and @enumerate text
-\newdimen\itemindent  \itemindent=.3in
-% margin between end of table item and start of table text.
-\newdimen\itemmargin  \itemmargin=.1in
-
-% used internally for \itemindent minus \itemmargin
-\newdimen\itemmax
-
-% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
-% these defs.
-% They also define \itemindex
-% to index the item name in whatever manner is desired (perhaps none).
-
-\newif\ifitemxneedsnegativevskip
-
-\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
-
-\def\internalBitem{\smallbreak \parsearg\itemzzz}
-\def\internalBitemx{\itemxpar \parsearg\itemzzz}
-
-\def\itemzzz #1{\begingroup %
-  \advance\hsize by -\rightskip
-  \advance\hsize by -\tableindent
-  \setbox0=\hbox{\itemindicate{#1}}%
-  \itemindex{#1}%
-  \nobreak % This prevents a break before @itemx.
-  %
-  % If the item text does not fit in the space we have, put it on a line
-  % by itself, and do not allow a page break either before or after that
-  % line.  We do not start a paragraph here because then if the next
-  % command is, e.g., @kindex, the whatsit would get put into the
-  % horizontal list on a line by itself, resulting in extra blank space.
-  \ifdim \wd0>\itemmax
-    %
-    % Make this a paragraph so we get the \parskip glue and wrapping,
-    % but leave it ragged-right.
-    \begingroup
-      \advance\leftskip by-\tableindent
-      \advance\hsize by\tableindent
-      \advance\rightskip by0pt plus1fil
-      \leavevmode\unhbox0\par
-    \endgroup
-    %
-    % We're going to be starting a paragraph, but we don't want the
-    % \parskip glue -- logically it's part of the @item we just started.
-    \nobreak \vskip-\parskip
-    %
-    % Stop a page break at the \parskip glue coming up.  However, if
-    % what follows is an environment such as @example, there will be no
-    % \parskip glue; then the negative vskip we just inserted would
-    % cause the example and the item to crash together.  So we use this
-    % bizarre value of 10001 as a signal to \aboveenvbreak to insert
-    % \parskip glue after all.  Section titles are handled this way also.
-    %
-    \penalty 10001
-    \endgroup
-    \itemxneedsnegativevskipfalse
-  \else
-    % The item text fits into the space.  Start a paragraph, so that the
-    % following text (if any) will end up on the same line.
-    \noindent
-    % Do this with kerns and \unhbox so that if there is a footnote in
-    % the item text, it can migrate to the main vertical list and
-    % eventually be printed.
-    \nobreak\kern-\tableindent
-    \dimen0 = \itemmax  \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
-    \unhbox0
-    \nobreak\kern\dimen0
-    \endgroup
-    \itemxneedsnegativevskiptrue
-  \fi
-}
-
-\def\item{\errmessage{@item while not in a list environment}}
-\def\itemx{\errmessage{@itemx while not in a list environment}}
-
-% @table, @ftable, @vtable.
-\envdef\table{%
-  \let\itemindex\gobble
-  \tablecheck{table}%
-}
-\envdef\ftable{%
-  \def\itemindex ##1{\doind {fn}{\code{##1}}}%
-  \tablecheck{ftable}%
-}
-\envdef\vtable{%
-  \def\itemindex ##1{\doind {vr}{\code{##1}}}%
-  \tablecheck{vtable}%
-}
-\def\tablecheck#1{%
-  \ifnum \the\catcode`\^^M=\active
-    \endgroup
-    \errmessage{This command won't work in this context; perhaps the problem is
-      that we are \inenvironment\thisenv}%
-    \def\next{\doignore{#1}}%
-  \else
-    \let\next\tablex
-  \fi
-  \next
-}
-\def\tablex#1{%
-  \def\itemindicate{#1}%
-  \parsearg\tabley
-}
-\def\tabley#1{%
-  {%
-    \makevalueexpandable
-    \edef\temp{\noexpand\tablez #1\space\space\space}%
-    \expandafter
-  }\temp \endtablez
-}
-\def\tablez #1 #2 #3 #4\endtablez{%
-  \aboveenvbreak
-  \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
-  \ifnum 0#2>0 \tableindent=#2\mil \fi
-  \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
-  \itemmax=\tableindent
-  \advance \itemmax by -\itemmargin
-  \advance \leftskip by \tableindent
-  \exdentamount=\tableindent
-  \parindent = 0pt
-  \parskip = \smallskipamount
-  \ifdim \parskip=0pt \parskip=2pt \fi
-  \let\item = \internalBitem
-  \let\itemx = \internalBitemx
-}
-\def\Etable{\endgraf\afterenvbreak}
-\let\Eftable\Etable
-\let\Evtable\Etable
-\let\Eitemize\Etable
-\let\Eenumerate\Etable
-
-% This is the counter used by @enumerate, which is really @itemize
-
-\newcount \itemno
-
-\envdef\itemize{\parsearg\doitemize}
-
-\def\doitemize#1{%
-  \aboveenvbreak
-  \itemmax=\itemindent
-  \advance\itemmax by -\itemmargin
-  \advance\leftskip by \itemindent
-  \exdentamount=\itemindent
-  \parindent=0pt
-  \parskip=\smallskipamount
-  \ifdim\parskip=0pt \parskip=2pt \fi
-  %
-  % Try typesetting the item mark that if the document erroneously says
-  % something like @itemize @samp (intending @table), there's an error
-  % right away at the @itemize.  It's not the best error message in the
-  % world, but it's better than leaving it to the @item.  This means if
-  % the user wants an empty mark, they have to say @w{} not just @w.
-  \def\itemcontents{#1}%
-  \setbox0 = \hbox{\itemcontents}%
-  %
-  % @itemize with no arg is equivalent to @itemize @bullet.
-  \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
-  %
-  \let\item=\itemizeitem
-}
-
-% Definition of @item while inside @itemize and @enumerate.
-%
-\def\itemizeitem{%
-  \advance\itemno by 1  % for enumerations
-  {\let\par=\endgraf \smallbreak}% reasonable place to break
-  {%
-   % If the document has an @itemize directly after a section title, a
-   % \nobreak will be last on the list, and \sectionheading will have
-   % done a \vskip-\parskip.  In that case, we don't want to zero
-   % parskip, or the item text will crash with the heading.  On the
-   % other hand, when there is normal text preceding the item (as there
-   % usually is), we do want to zero parskip, or there would be too much
-   % space.  In that case, we won't have a \nobreak before.  At least
-   % that's the theory.
-   \ifnum\lastpenalty<10000 \parskip=0in \fi
-   \noindent
-   \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
-   %
-   \vadjust{\penalty 1200}}% not good to break after first line of item.
-  \flushcr
-}
-
-% \splitoff TOKENS\endmark defines \first to be the first token in
-% TOKENS, and \rest to be the remainder.
-%
-\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
-
-% Allow an optional argument of an uppercase letter, lowercase letter,
-% or number, to specify the first label in the enumerated list.  No
-% argument is the same as `1'.
-%
-\envparseargdef\enumerate{\enumeratey #1  \endenumeratey}
-\def\enumeratey #1 #2\endenumeratey{%
-  % If we were given no argument, pretend we were given `1'.
-  \def\thearg{#1}%
-  \ifx\thearg\empty \def\thearg{1}\fi
-  %
-  % Detect if the argument is a single token.  If so, it might be a
-  % letter.  Otherwise, the only valid thing it can be is a number.
-  % (We will always have one token, because of the test we just made.
-  % This is a good thing, since \splitoff doesn't work given nothing at
-  % all -- the first parameter is undelimited.)
-  \expandafter\splitoff\thearg\endmark
-  \ifx\rest\empty
-    % Only one token in the argument.  It could still be anything.
-    % A ``lowercase letter'' is one whose \lccode is nonzero.
-    % An ``uppercase letter'' is one whose \lccode is both nonzero, and
-    %   not equal to itself.
-    % Otherwise, we assume it's a number.
-    %
-    % We need the \relax at the end of the \ifnum lines to stop TeX from
-    % continuing to look for a <number>.
-    %
-    \ifnum\lccode\expandafter`\thearg=0\relax
-      \numericenumerate % a number (we hope)
-    \else
-      % It's a letter.
-      \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
-        \lowercaseenumerate % lowercase letter
-      \else
-        \uppercaseenumerate % uppercase letter
-      \fi
-    \fi
-  \else
-    % Multiple tokens in the argument.  We hope it's a number.
-    \numericenumerate
-  \fi
-}
-
-% An @enumerate whose labels are integers.  The starting integer is
-% given in \thearg.
-%
-\def\numericenumerate{%
-  \itemno = \thearg
-  \startenumeration{\the\itemno}%
-}
-
-% The starting (lowercase) letter is in \thearg.
-\def\lowercaseenumerate{%
-  \itemno = \expandafter`\thearg
-  \startenumeration{%
-    % Be sure we're not beyond the end of the alphabet.
-    \ifnum\itemno=0
-      \errmessage{No more lowercase letters in @enumerate; get a bigger
-                  alphabet}%
-    \fi
-    \char\lccode\itemno
-  }%
-}
-
-% The starting (uppercase) letter is in \thearg.
-\def\uppercaseenumerate{%
-  \itemno = \expandafter`\thearg
-  \startenumeration{%
-    % Be sure we're not beyond the end of the alphabet.
-    \ifnum\itemno=0
-      \errmessage{No more uppercase letters in @enumerate; get a bigger
-                  alphabet}
-    \fi
-    \char\uccode\itemno
-  }%
-}
-
-% Call \doitemize, adding a period to the first argument and supplying the
-% common last two arguments.  Also subtract one from the initial value in
-% \itemno, since @item increments \itemno.
-%
-\def\startenumeration#1{%
-  \advance\itemno by -1
-  \doitemize{#1.}\flushcr
-}
-
-% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
-% to @enumerate.
-%
-\def\alphaenumerate{\enumerate{a}}
-\def\capsenumerate{\enumerate{A}}
-\def\Ealphaenumerate{\Eenumerate}
-\def\Ecapsenumerate{\Eenumerate}
-
-
-% @multitable macros
-% Amy Hendrickson, 8/18/94, 3/6/96
-%
-% @multitable ... @end multitable will make as many columns as desired.
-% Contents of each column will wrap at width given in preamble.  Width
-% can be specified either with sample text given in a template line,
-% or in percent of \hsize, the current width of text on page.
-
-% Table can continue over pages but will only break between lines.
-
-% To make preamble:
-%
-% Either define widths of columns in terms of percent of \hsize:
-%   @multitable @columnfractions .25 .3 .45
-%   @item ...
-%
-%   Numbers following @columnfractions are the percent of the total
-%   current hsize to be used for each column. You may use as many
-%   columns as desired.
-
-
-% Or use a template:
-%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
-%   @item ...
-%   using the widest term desired in each column.
-
-% Each new table line starts with @item, each subsequent new column
-% starts with @tab. Empty columns may be produced by supplying @tab's
-% with nothing between them for as many times as empty columns are needed,
-% ie, @tab@tab@tab will produce two empty columns.
-
-% @item, @tab do not need to be on their own lines, but it will not hurt
-% if they are.
-
-% Sample multitable:
-
-%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
-%   @item first col stuff @tab second col stuff @tab third col
-%   @item
-%   first col stuff
-%   @tab
-%   second col stuff
-%   @tab
-%   third col
-%   @item first col stuff @tab second col stuff
-%   @tab Many paragraphs of text may be used in any column.
-%
-%         They will wrap at the width determined by the template.
-%   @item@tab@tab This will be in third column.
-%   @end multitable
-
-% Default dimensions may be reset by user.
-% @multitableparskip is vertical space between paragraphs in table.
-% @multitableparindent is paragraph indent in table.
-% @multitablecolmargin is horizontal space to be left between columns.
-% @multitablelinespace is space to leave between table items, baseline
-%                                                            to baseline.
-%   0pt means it depends on current normal line spacing.
-%
-\newskip\multitableparskip
-\newskip\multitableparindent
-\newdimen\multitablecolspace
-\newskip\multitablelinespace
-\multitableparskip=0pt
-\multitableparindent=6pt
-\multitablecolspace=12pt
-\multitablelinespace=0pt
-
-% Macros used to set up halign preamble:
-%
-\let\endsetuptable\relax
-\def\xendsetuptable{\endsetuptable}
-\let\columnfractions\relax
-\def\xcolumnfractions{\columnfractions}
-\newif\ifsetpercent
-
-% #1 is the @columnfraction, usually a decimal number like .5, but might
-% be just 1.  We just use it, whatever it is.
-%
-\def\pickupwholefraction#1 {%
-  \global\advance\colcount by 1
-  \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
-  \setuptable
-}
-
-\newcount\colcount
-\def\setuptable#1{%
-  \def\firstarg{#1}%
-  \ifx\firstarg\xendsetuptable
-    \let\go = \relax
-  \else
-    \ifx\firstarg\xcolumnfractions
-      \global\setpercenttrue
-    \else
-      \ifsetpercent
-         \let\go\pickupwholefraction
-      \else
-         \global\advance\colcount by 1
-         \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
-                   % separator; typically that is always in the input, anyway.
-         \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
-      \fi
-    \fi
-    \ifx\go\pickupwholefraction
-      % Put the argument back for the \pickupwholefraction call, so
-      % we'll always have a period there to be parsed.
-      \def\go{\pickupwholefraction#1}%
-    \else
-      \let\go = \setuptable
-    \fi%
-  \fi
-  \go
-}
-
-% multitable-only commands.
-%
-% @headitem starts a heading row, which we typeset in bold.
-% Assignments have to be global since we are inside the implicit group
-% of an alignment entry.  \everycr resets \everytab so we don't have to
-% undo it ourselves.
-\def\headitemfont{\b}% for people to use in the template row; not changeable
-\def\headitem{%
-  \checkenv\multitable
-  \crcr
-  \global\everytab={\bf}% can't use \headitemfont since the parsing differs
-  \the\everytab % for the first item
-}%
-%
-% A \tab used to include \hskip1sp.  But then the space in a template
-% line is not enough.  That is bad.  So let's go back to just `&' until
-% we again encounter the problem the 1sp was intended to solve.
-%					--karl, nathan@acm.org, 20apr99.
-\def\tab{\checkenv\multitable &\the\everytab}%
-
-% @multitable ... @end multitable definitions:
-%
-\newtoks\everytab  % insert after every tab.
-%
-\envdef\multitable{%
-  \vskip\parskip
-  \startsavinginserts
-  %
-  % @item within a multitable starts a normal row.
-  % We use \def instead of \let so that if one of the multitable entries
-  % contains an @itemize, we don't choke on the \item (seen as \crcr aka
-  % \endtemplate) expanding \doitemize.
-  \def\item{\crcr}%
-  %
-  \tolerance=9500
-  \hbadness=9500
-  \setmultitablespacing
-  \parskip=\multitableparskip
-  \parindent=\multitableparindent
-  \overfullrule=0pt
-  \global\colcount=0
-  %
-  \everycr = {%
-    \noalign{%
-      \global\everytab={}%
-      \global\colcount=0 % Reset the column counter.
-      % Check for saved footnotes, etc.
-      \checkinserts
-      % Keeps underfull box messages off when table breaks over pages.
-      %\filbreak
-	% Maybe so, but it also creates really weird page breaks when the
-	% table breaks over pages. Wouldn't \vfil be better?  Wait until the
-	% problem manifests itself, so it can be fixed for real --karl.
-    }%
-  }%
-  %
-  \parsearg\domultitable
-}
-\def\domultitable#1{%
-  % To parse everything between @multitable and @item:
-  \setuptable#1 \endsetuptable
-  %
-  % This preamble sets up a generic column definition, which will
-  % be used as many times as user calls for columns.
-  % \vtop will set a single line and will also let text wrap and
-  % continue for many paragraphs if desired.
-  \halign\bgroup &%
-    \global\advance\colcount by 1
-    \multistrut
-    \vtop{%
-      % Use the current \colcount to find the correct column width:
-      \hsize=\expandafter\csname col\the\colcount\endcsname
-      %
-      % In order to keep entries from bumping into each other
-      % we will add a \leftskip of \multitablecolspace to all columns after
-      % the first one.
-      %
-      % If a template has been used, we will add \multitablecolspace
-      % to the width of each template entry.
-      %
-      % If the user has set preamble in terms of percent of \hsize we will
-      % use that dimension as the width of the column, and the \leftskip
-      % will keep entries from bumping into each other.  Table will start at
-      % left margin and final column will justify at right margin.
-      %
-      % Make sure we don't inherit \rightskip from the outer environment.
-      \rightskip=0pt
-      \ifnum\colcount=1
-	% The first column will be indented with the surrounding text.
-	\advance\hsize by\leftskip
-      \else
-	\ifsetpercent \else
-	  % If user has not set preamble in terms of percent of \hsize
-	  % we will advance \hsize by \multitablecolspace.
-	  \advance\hsize by \multitablecolspace
-	\fi
-       % In either case we will make \leftskip=\multitablecolspace:
-      \leftskip=\multitablecolspace
-      \fi
-      % Ignoring space at the beginning and end avoids an occasional spurious
-      % blank line, when TeX decides to break the line at the space before the
-      % box from the multistrut, so the strut ends up on a line by itself.
-      % For example:
-      % @multitable @columnfractions .11 .89
-      % @item @code{#}
-      % @tab Legal holiday which is valid in major parts of the whole country.
-      % Is automatically provided with highlighting sequences respectively
-      % marking characters.
-      \noindent\ignorespaces##\unskip\multistrut
-    }\cr
-}
-\def\Emultitable{%
-  \crcr
-  \egroup % end the \halign
-  \global\setpercentfalse
-}
-
-\def\setmultitablespacing{%
-  \def\multistrut{\strut}% just use the standard line spacing
-  %
-  % Compute \multitablelinespace (if not defined by user) for use in
-  % \multitableparskip calculation.  We used define \multistrut based on
-  % this, but (ironically) that caused the spacing to be off.
-  % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
-\ifdim\multitablelinespace=0pt
-\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
-\global\advance\multitablelinespace by-\ht0
-\fi
-%% Test to see if parskip is larger than space between lines of
-%% table. If not, do nothing.
-%%        If so, set to same dimension as multitablelinespace.
-\ifdim\multitableparskip>\multitablelinespace
-\global\multitableparskip=\multitablelinespace
-\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
-                                      %% than skip between lines in the table.
-\fi%
-\ifdim\multitableparskip=0pt
-\global\multitableparskip=\multitablelinespace
-\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
-                                      %% than skip between lines in the table.
-\fi}
-
-
-\message{conditionals,}
-
-% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
-% @ifnotxml always succeed.  They currently do nothing; we don't
-% attempt to check whether the conditionals are properly nested.  But we
-% have to remember that they are conditionals, so that @end doesn't
-% attempt to close an environment group.
-%
-\def\makecond#1{%
-  \expandafter\let\csname #1\endcsname = \relax
-  \expandafter\let\csname iscond.#1\endcsname = 1
-}
-\makecond{iftex}
-\makecond{ifnotdocbook}
-\makecond{ifnothtml}
-\makecond{ifnotinfo}
-\makecond{ifnotplaintext}
-\makecond{ifnotxml}
-
-% Ignore @ignore, @ifhtml, @ifinfo, and the like.
-%
-\def\direntry{\doignore{direntry}}
-\def\documentdescription{\doignore{documentdescription}}
-\def\docbook{\doignore{docbook}}
-\def\html{\doignore{html}}
-\def\ifdocbook{\doignore{ifdocbook}}
-\def\ifhtml{\doignore{ifhtml}}
-\def\ifinfo{\doignore{ifinfo}}
-\def\ifnottex{\doignore{ifnottex}}
-\def\ifplaintext{\doignore{ifplaintext}}
-\def\ifxml{\doignore{ifxml}}
-\def\ignore{\doignore{ignore}}
-\def\menu{\doignore{menu}}
-\def\xml{\doignore{xml}}
-
-% Ignore text until a line `@end #1', keeping track of nested conditionals.
-%
-% A count to remember the depth of nesting.
-\newcount\doignorecount
-
-\def\doignore#1{\begingroup
-  % Scan in ``verbatim'' mode:
-  \obeylines
-  \catcode`\@ = \other
-  \catcode`\{ = \other
-  \catcode`\} = \other
-  %
-  % Make sure that spaces turn into tokens that match what \doignoretext wants.
-  \spaceisspace
-  %
-  % Count number of #1's that we've seen.
-  \doignorecount = 0
-  %
-  % Swallow text until we reach the matching `@end #1'.
-  \dodoignore{#1}%
-}
-
-{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
-  \obeylines %
-  %
-  \gdef\dodoignore#1{%
-    % #1 contains the command name as a string, e.g., `ifinfo'.
-    %
-    % Define a command to find the next `@end #1'.
-    \long\def\doignoretext##1^^M@end #1{%
-      \doignoretextyyy##1^^M@#1\_STOP_}%
-    %
-    % And this command to find another #1 command, at the beginning of a
-    % line.  (Otherwise, we would consider a line `@c @ifset', for
-    % example, to count as an @ifset for nesting.)
-    \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
-    %
-    % And now expand that command.
-    \doignoretext ^^M%
-  }%
-}
-
-\def\doignoreyyy#1{%
-  \def\temp{#1}%
-  \ifx\temp\empty			% Nothing found.
-    \let\next\doignoretextzzz
-  \else					% Found a nested condition, ...
-    \advance\doignorecount by 1
-    \let\next\doignoretextyyy		% ..., look for another.
-    % If we're here, #1 ends with ^^M\ifinfo (for example).
-  \fi
-  \next #1% the token \_STOP_ is present just after this macro.
-}
-
-% We have to swallow the remaining "\_STOP_".
-%
-\def\doignoretextzzz#1{%
-  \ifnum\doignorecount = 0	% We have just found the outermost @end.
-    \let\next\enddoignore
-  \else				% Still inside a nested condition.
-    \advance\doignorecount by -1
-    \let\next\doignoretext      % Look for the next @end.
-  \fi
-  \next
-}
-
-% Finish off ignored text.
-{ \obeylines%
-  % Ignore anything after the last `@end #1'; this matters in verbatim
-  % environments, where otherwise the newline after an ignored conditional
-  % would result in a blank line in the output.
-  \gdef\enddoignore#1^^M{\endgroup\ignorespaces}%
-}
-
-
-% @set VAR sets the variable VAR to an empty value.
-% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
-%
-% Since we want to separate VAR from REST-OF-LINE (which might be
-% empty), we can't just use \parsearg; we have to insert a space of our
-% own to delimit the rest of the line, and then take it out again if we
-% didn't need it.
-% We rely on the fact that \parsearg sets \catcode`\ =10.
-%
-\parseargdef\set{\setyyy#1 \endsetyyy}
-\def\setyyy#1 #2\endsetyyy{%
-  {%
-    \makevalueexpandable
-    \def\temp{#2}%
-    \edef\next{\gdef\makecsname{SET#1}}%
-    \ifx\temp\empty
-      \next{}%
-    \else
-      \setzzz#2\endsetzzz
-    \fi
-  }%
-}
-% Remove the trailing space \setxxx inserted.
-\def\setzzz#1 \endsetzzz{\next{#1}}
-
-% @clear VAR clears (i.e., unsets) the variable VAR.
-%
-\parseargdef\clear{%
-  {%
-    \makevalueexpandable
-    \global\expandafter\let\csname SET#1\endcsname=\relax
-  }%
-}
-
-% @value{foo} gets the text saved in variable foo.
-\def\value{\begingroup\makevalueexpandable\valuexxx}
-\def\valuexxx#1{\expandablevalue{#1}\endgroup}
-{
-  \catcode`\- = \active \catcode`\_ = \active
-  %
-  \gdef\makevalueexpandable{%
-    \let\value = \expandablevalue
-    % We don't want these characters active, ...
-    \catcode`\-=\other \catcode`\_=\other
-    % ..., but we might end up with active ones in the argument if
-    % we're called from @code, as @code{@value{foo-bar_}}, though.
-    % So \let them to their normal equivalents.
-    \let-\realdash \let_\normalunderscore
-  }
-}
-
-% We have this subroutine so that we can handle at least some @value's
-% properly in indexes (we call \makevalueexpandable in \indexdummies).
-% The command has to be fully expandable (if the variable is set), since
-% the result winds up in the index file.  This means that if the
-% variable's value contains other Texinfo commands, it's almost certain
-% it will fail (although perhaps we could fix that with sufficient work
-% to do a one-level expansion on the result, instead of complete).
-%
-\def\expandablevalue#1{%
-  \expandafter\ifx\csname SET#1\endcsname\relax
-    {[No value for ``#1'']}%
-    \message{Variable `#1', used in @value, is not set.}%
-  \else
-    \csname SET#1\endcsname
-  \fi
-}
-
-% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
-% with @set.
-%
-% To get special treatment of `@end ifset,' call \makeond and the redefine.
-%
-\makecond{ifset}
-\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
-\def\doifset#1#2{%
-  {%
-    \makevalueexpandable
-    \let\next=\empty
-    \expandafter\ifx\csname SET#2\endcsname\relax
-      #1% If not set, redefine \next.
-    \fi
-    \expandafter
-  }\next
-}
-\def\ifsetfail{\doignore{ifset}}
-
-% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
-% defined with @set, or has been undefined with @clear.
-%
-% The `\else' inside the `\doifset' parameter is a trick to reuse the
-% above code: if the variable is not set, do nothing, if it is set,
-% then redefine \next to \ifclearfail.
-%
-\makecond{ifclear}
-\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
-\def\ifclearfail{\doignore{ifclear}}
-
-% @dircategory CATEGORY  -- specify a category of the dir file
-% which this file should belong to.  Ignore this in TeX.
-\let\dircategory=\comment
-
-% @defininfoenclose.
-\let\definfoenclose=\comment
-
-
-\message{indexing,}
-% Index generation facilities
-
-% Define \newwrite to be identical to plain tex's \newwrite
-% except not \outer, so it can be used within macros and \if's.
-\edef\newwrite{\makecsname{ptexnewwrite}}
-
-% \newindex {foo} defines an index named foo.
-% It automatically defines \fooindex such that
-% \fooindex ...rest of line... puts an entry in the index foo.
-% It also defines \fooindfile to be the number of the output channel for
-% the file that accumulates this index.  The file's extension is foo.
-% The name of an index should be no more than 2 characters long
-% for the sake of vms.
-%
-\def\newindex#1{%
-  \iflinks
-    \expandafter\newwrite \csname#1indfile\endcsname
-    \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
-  \fi
-  \expandafter\xdef\csname#1index\endcsname{%     % Define @#1index
-    \noexpand\doindex{#1}}
-}
-
-% @defindex foo  ==  \newindex{foo}
-%
-\def\defindex{\parsearg\newindex}
-
-% Define @defcodeindex, like @defindex except put all entries in @code.
-%
-\def\defcodeindex{\parsearg\newcodeindex}
-%
-\def\newcodeindex#1{%
-  \iflinks
-    \expandafter\newwrite \csname#1indfile\endcsname
-    \openout \csname#1indfile\endcsname \jobname.#1
-  \fi
-  \expandafter\xdef\csname#1index\endcsname{%
-    \noexpand\docodeindex{#1}}%
-}
-
-
-% @synindex foo bar    makes index foo feed into index bar.
-% Do this instead of @defindex foo if you don't want it as a separate index.
-%
-% @syncodeindex foo bar   similar, but put all entries made for index foo
-% inside @code.
-%
-\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
-\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
-
-% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
-% #3 the target index (bar).
-\def\dosynindex#1#2#3{%
-  % Only do \closeout if we haven't already done it, else we'll end up
-  % closing the target index.
-  \expandafter \ifx\csname donesynindex#2\endcsname \relax
-    % The \closeout helps reduce unnecessary open files; the limit on the
-    % Acorn RISC OS is a mere 16 files.
-    \expandafter\closeout\csname#2indfile\endcsname
-    \expandafter\let\csname donesynindex#2\endcsname = 1
-  \fi
-  % redefine \fooindfile:
-  \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
-  \expandafter\let\csname#2indfile\endcsname=\temp
-  % redefine \fooindex:
-  \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
-}
-
-% Define \doindex, the driver for all \fooindex macros.
-% Argument #1 is generated by the calling \fooindex macro,
-%  and it is "foo", the name of the index.
-
-% \doindex just uses \parsearg; it calls \doind for the actual work.
-% This is because \doind is more useful to call from other macros.
-
-% There is also \dosubind {index}{topic}{subtopic}
-% which makes an entry in a two-level index such as the operation index.
-
-\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
-\def\singleindexer #1{\doind{\indexname}{#1}}
-
-% like the previous two, but they put @code around the argument.
-\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
-\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
-
-% Take care of Texinfo commands that can appear in an index entry.
-% Since there are some commands we want to expand, and others we don't,
-% we have to laboriously prevent expansion for those that we don't.
-%
-\def\indexdummies{%
-  \escapechar = `\\     % use backslash in output files.
-  \def\@{@}% change to @@ when we switch to @ as escape char in index files.
-  \def\ {\realbackslash\space }%
-  %
-  % Need these in case \tex is in effect and \{ is a \delimiter again.
-  % But can't use \lbracecmd and \rbracecmd because texindex assumes
-  % braces and backslashes are used only as delimiters.
-  \let\{ = \mylbrace
-  \let\} = \myrbrace
-  %
-  % I don't entirely understand this, but when an index entry is
-  % generated from a macro call, the \endinput which \scanmacro inserts
-  % causes processing to be prematurely terminated.  This is,
-  % apparently, because \indexsorttmp is fully expanded, and \endinput
-  % is an expandable command.  The redefinition below makes \endinput
-  % disappear altogether for that purpose -- although logging shows that
-  % processing continues to some further point.  On the other hand, it
-  % seems \endinput does not hurt in the printed index arg, since that
-  % is still getting written without apparent harm.
-  %
-  % Sample source (mac-idx3.tex, reported by Graham Percival to
-  % help-texinfo, 22may06):
-  % @macro funindex {WORD}
-  % @findex xyz
-  % @end macro
-  % ...
-  % @funindex commtest
-  %
-  % The above is not enough to reproduce the bug, but it gives the flavor.
-  %
-  % Sample whatsit resulting:
-  % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}}
-  %
-  % So:
-  \let\endinput = \empty
-  %
-  % Do the redefinitions.
-  \commondummies
-}
-
-% For the aux and toc files, @ is the escape character.  So we want to
-% redefine everything using @ as the escape character (instead of
-% \realbackslash, still used for index files).  When everything uses @,
-% this will be simpler.
-%
-\def\atdummies{%
-  \def\@{@@}%
-  \def\ {@ }%
-  \let\{ = \lbraceatcmd
-  \let\} = \rbraceatcmd
-  %
-  % Do the redefinitions.
-  \commondummies
-  \otherbackslash
-}
-
-% Called from \indexdummies and \atdummies.
-%
-\def\commondummies{%
-  %
-  % \definedummyword defines \#1 as \string\#1\space, thus effectively
-  % preventing its expansion.  This is used only for control% words,
-  % not control letters, because the \space would be incorrect for
-  % control characters, but is needed to separate the control word
-  % from whatever follows.
-  %
-  % For control letters, we have \definedummyletter, which omits the
-  % space.
-  %
-  % These can be used both for control words that take an argument and
-  % those that do not.  If it is followed by {arg} in the input, then
-  % that will dutifully get written to the index (or wherever).
-  %
-  \def\definedummyword  ##1{\def##1{\string##1\space}}%
-  \def\definedummyletter##1{\def##1{\string##1}}%
-  \let\definedummyaccent\definedummyletter
-  %
-  \commondummiesnofonts
-  %
-  \definedummyletter\_%
-  %
-  % Non-English letters.
-  \definedummyword\AA
-  \definedummyword\AE
-  \definedummyword\DH
-  \definedummyword\L
-  \definedummyword\O
-  \definedummyword\OE
-  \definedummyword\TH
-  \definedummyword\aa
-  \definedummyword\ae
-  \definedummyword\dh
-  \definedummyword\exclamdown
-  \definedummyword\l
-  \definedummyword\o
-  \definedummyword\oe
-  \definedummyword\ordf
-  \definedummyword\ordm
-  \definedummyword\questiondown
-  \definedummyword\ss
-  \definedummyword\th
-  %
-  % Although these internal commands shouldn't show up, sometimes they do.
-  \definedummyword\bf
-  \definedummyword\gtr
-  \definedummyword\hat
-  \definedummyword\less
-  \definedummyword\sf
-  \definedummyword\sl
-  \definedummyword\tclose
-  \definedummyword\tt
-  %
-  \definedummyword\LaTeX
-  \definedummyword\TeX
-  %
-  % Assorted special characters.
-  \definedummyword\bullet
-  \definedummyword\comma
-  \definedummyword\copyright
-  \definedummyword\registeredsymbol
-  \definedummyword\dots
-  \definedummyword\enddots
-  \definedummyword\equiv
-  \definedummyword\error
-  \definedummyword\euro
-  \definedummyword\guillemetleft
-  \definedummyword\guillemetright
-  \definedummyword\guilsinglleft
-  \definedummyword\guilsinglright
-  \definedummyword\expansion
-  \definedummyword\minus
-  \definedummyword\ogonek
-  \definedummyword\pounds
-  \definedummyword\point
-  \definedummyword\print
-  \definedummyword\quotedblbase
-  \definedummyword\quotedblleft
-  \definedummyword\quotedblright
-  \definedummyword\quoteleft
-  \definedummyword\quoteright
-  \definedummyword\quotesinglbase
-  \definedummyword\result
-  \definedummyword\textdegree
-  %
-  % We want to disable all macros so that they are not expanded by \write.
-  \macrolist
-  %
-  \normalturnoffactive
-  %
-  % Handle some cases of @value -- where it does not contain any
-  % (non-fully-expandable) commands.
-  \makevalueexpandable
-}
-
-% \commondummiesnofonts: common to \commondummies and \indexnofonts.
-%
-\def\commondummiesnofonts{%
-  % Control letters and accents.
-  \definedummyletter\!%
-  \definedummyaccent\"%
-  \definedummyaccent\'%
-  \definedummyletter\*%
-  \definedummyaccent\,%
-  \definedummyletter\.%
-  \definedummyletter\/%
-  \definedummyletter\:%
-  \definedummyaccent\=%
-  \definedummyletter\?%
-  \definedummyaccent\^%
-  \definedummyaccent\`%
-  \definedummyaccent\~%
-  \definedummyword\u
-  \definedummyword\v
-  \definedummyword\H
-  \definedummyword\dotaccent
-  \definedummyword\ogonek
-  \definedummyword\ringaccent
-  \definedummyword\tieaccent
-  \definedummyword\ubaraccent
-  \definedummyword\udotaccent
-  \definedummyword\dotless
-  %
-  % Texinfo font commands.
-  \definedummyword\b
-  \definedummyword\i
-  \definedummyword\r
-  \definedummyword\sc
-  \definedummyword\t
-  %
-  % Commands that take arguments.
-  \definedummyword\acronym
-  \definedummyword\cite
-  \definedummyword\code
-  \definedummyword\command
-  \definedummyword\dfn
-  \definedummyword\email
-  \definedummyword\emph
-  \definedummyword\env
-  \definedummyword\file
-  \definedummyword\kbd
-  \definedummyword\key
-  \definedummyword\math
-  \definedummyword\option
-  \definedummyword\pxref
-  \definedummyword\ref
-  \definedummyword\samp
-  \definedummyword\strong
-  \definedummyword\tie
-  \definedummyword\uref
-  \definedummyword\url
-  \definedummyword\var
-  \definedummyword\verb
-  \definedummyword\w
-  \definedummyword\xref
-}
-
-% \indexnofonts is used when outputting the strings to sort the index
-% by, and when constructing control sequence names.  It eliminates all
-% control sequences and just writes whatever the best ASCII sort string
-% would be for a given command (usually its argument).
-%
-\def\indexnofonts{%
-  % Accent commands should become @asis.
-  \def\definedummyaccent##1{\let##1\asis}%
-  % We can just ignore other control letters.
-  \def\definedummyletter##1{\let##1\empty}%
-  % Hopefully, all control words can become @asis.
-  \let\definedummyword\definedummyaccent
-  %
-  \commondummiesnofonts
-  %
-  % Don't no-op \tt, since it isn't a user-level command
-  % and is used in the definitions of the active chars like <, >, |, etc.
-  % Likewise with the other plain tex font commands.
-  %\let\tt=\asis
-  %
-  \def\ { }%
-  \def\@{@}%
-  % how to handle braces?
-  \def\_{\normalunderscore}%
-  %
-  % Non-English letters.
-  \def\AA{AA}%
-  \def\AE{AE}%
-  \def\DH{DZZ}%
-  \def\L{L}%
-  \def\OE{OE}%
-  \def\O{O}%
-  \def\TH{ZZZ}%
-  \def\aa{aa}%
-  \def\ae{ae}%
-  \def\dh{dzz}%
-  \def\exclamdown{!}%
-  \def\l{l}%
-  \def\oe{oe}%
-  \def\ordf{a}%
-  \def\ordm{o}%
-  \def\o{o}%
-  \def\questiondown{?}%
-  \def\ss{ss}%
-  \def\th{zzz}%
-  %
-  \def\LaTeX{LaTeX}%
-  \def\TeX{TeX}%
-  %
-  % Assorted special characters.
-  % (The following {} will end up in the sort string, but that's ok.)
-  \def\bullet{bullet}%
-  \def\comma{,}%
-  \def\copyright{copyright}%
-  \def\dots{...}%
-  \def\enddots{...}%
-  \def\equiv{==}%
-  \def\error{error}%
-  \def\euro{euro}%
-  \def\expansion{==>}%
-  \def\guillemetleft{<<}%
-  \def\guillemetright{>>}%
-  \def\guilsinglleft{<}%
-  \def\guilsinglright{>}%
-  \def\minus{-}%
-  \def\point{.}%
-  \def\pounds{pounds}%
-  \def\print{-|}%
-  \def\quotedblbase{"}%
-  \def\quotedblleft{"}%
-  \def\quotedblright{"}%
-  \def\quoteleft{`}%
-  \def\quoteright{'}%
-  \def\quotesinglbase{,}%
-  \def\registeredsymbol{R}%
-  \def\result{=>}%
-  \def\textdegree{o}%
-  %
-  % We need to get rid of all macros, leaving only the arguments (if present).
-  % Of course this is not nearly correct, but it is the best we can do for now.
-  % makeinfo does not expand macros in the argument to @deffn, which ends up
-  % writing an index entry, and texindex isn't prepared for an index sort entry
-  % that starts with \.
-  %
-  % Since macro invocations are followed by braces, we can just redefine them
-  % to take a single TeX argument.  The case of a macro invocation that
-  % goes to end-of-line is not handled.
-  %
-  \macrolist
-}
-
-\let\indexbackslash=0  %overridden during \printindex.
-\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
-
-% Most index entries go through here, but \dosubind is the general case.
-% #1 is the index name, #2 is the entry text.
-\def\doind#1#2{\dosubind{#1}{#2}{}}
-
-% Workhorse for all \fooindexes.
-% #1 is name of index, #2 is stuff to put there, #3 is subentry --
-% empty if called from \doind, as we usually are (the main exception
-% is with most defuns, which call us directly).
-%
-\def\dosubind#1#2#3{%
-  \iflinks
-  {%
-    % Store the main index entry text (including the third arg).
-    \toks0 = {#2}%
-    % If third arg is present, precede it with a space.
-    \def\thirdarg{#3}%
-    \ifx\thirdarg\empty \else
-      \toks0 = \expandafter{\the\toks0 \space #3}%
-    \fi
-    %
-    \edef\writeto{\csname#1indfile\endcsname}%
-    %
-    \safewhatsit\dosubindwrite
-  }%
-  \fi
-}
-
-% Write the entry in \toks0 to the index file:
-%
-\def\dosubindwrite{%
-  % Put the index entry in the margin if desired.
-  \ifx\SETmarginindex\relax\else
-    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
-  \fi
-  %
-  % Remember, we are within a group.
-  \indexdummies % Must do this here, since \bf, etc expand at this stage
-  \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
-      % so it will be output as is; and it will print as backslash.
-  %
-  % Process the index entry with all font commands turned off, to
-  % get the string to sort by.
-  {\indexnofonts
-   \edef\temp{\the\toks0}% need full expansion
-   \xdef\indexsorttmp{\temp}%
-  }%
-  %
-  % Set up the complete index entry, with both the sort key and
-  % the original text, including any font commands.  We write
-  % three arguments to \entry to the .?? file (four in the
-  % subentry case), texindex reduces to two when writing the .??s
-  % sorted result.
-  \edef\temp{%
-    \write\writeto{%
-      \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
-  }%
-  \temp
-}
-
-% Take care of unwanted page breaks/skips around a whatsit:
-%
-% If a skip is the last thing on the list now, preserve it
-% by backing up by \lastskip, doing the \write, then inserting
-% the skip again.  Otherwise, the whatsit generated by the
-% \write or \pdfdest will make \lastskip zero.  The result is that
-% sequences like this:
-% @end defun
-% @tindex whatever
-% @defun ...
-% will have extra space inserted, because the \medbreak in the
-% start of the @defun won't see the skip inserted by the @end of
-% the previous defun.
-%
-% But don't do any of this if we're not in vertical mode.  We
-% don't want to do a \vskip and prematurely end a paragraph.
-%
-% Avoid page breaks due to these extra skips, too.
-%
-% But wait, there is a catch there:
-% We'll have to check whether \lastskip is zero skip.  \ifdim is not
-% sufficient for this purpose, as it ignores stretch and shrink parts
-% of the skip.  The only way seems to be to check the textual
-% representation of the skip.
-%
-% The following is almost like \def\zeroskipmacro{0.0pt} except that
-% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
-%
-\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
-%
-\newskip\whatsitskip
-\newcount\whatsitpenalty
-%
-% ..., ready, GO:
-%
-\def\safewhatsit#1{%
-\ifhmode
-  #1%
-\else
-  % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
-  \whatsitskip = \lastskip
-  \edef\lastskipmacro{\the\lastskip}%
-  \whatsitpenalty = \lastpenalty
-  %
-  % If \lastskip is nonzero, that means the last item was a
-  % skip.  And since a skip is discardable, that means this
-  % -\whatsitskip glue we're inserting is preceded by a
-  % non-discardable item, therefore it is not a potential
-  % breakpoint, therefore no \nobreak needed.
-  \ifx\lastskipmacro\zeroskipmacro
-  \else
-    \vskip-\whatsitskip
-  \fi
-  %
-  #1%
-  %
-  \ifx\lastskipmacro\zeroskipmacro
-    % If \lastskip was zero, perhaps the last item was a penalty, and
-    % perhaps it was >=10000, e.g., a \nobreak.  In that case, we want
-    % to re-insert the same penalty (values >10000 are used for various
-    % signals); since we just inserted a non-discardable item, any
-    % following glue (such as a \parskip) would be a breakpoint.  For example:
-    %
-    %   @deffn deffn-whatever
-    %   @vindex index-whatever
-    %   Description.
-    % would allow a break between the index-whatever whatsit
-    % and the "Description." paragraph.
-    \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi
-  \else
-    % On the other hand, if we had a nonzero \lastskip,
-    % this make-up glue would be preceded by a non-discardable item
-    % (the whatsit from the \write), so we must insert a \nobreak.
-    \nobreak\vskip\whatsitskip
-  \fi
-\fi
-}
-
-% The index entry written in the file actually looks like
-%  \entry {sortstring}{page}{topic}
-% or
-%  \entry {sortstring}{page}{topic}{subtopic}
-% The texindex program reads in these files and writes files
-% containing these kinds of lines:
-%  \initial {c}
-%     before the first topic whose initial is c
-%  \entry {topic}{pagelist}
-%     for a topic that is used without subtopics
-%  \primary {topic}
-%     for the beginning of a topic that is used with subtopics
-%  \secondary {subtopic}{pagelist}
-%     for each subtopic.
-
-% Define the user-accessible indexing commands
-% @findex, @vindex, @kindex, @cindex.
-
-\def\findex {\fnindex}
-\def\kindex {\kyindex}
-\def\cindex {\cpindex}
-\def\vindex {\vrindex}
-\def\tindex {\tpindex}
-\def\pindex {\pgindex}
-
-\def\cindexsub {\begingroup\obeylines\cindexsub}
-{\obeylines %
-\gdef\cindexsub "#1" #2^^M{\endgroup %
-\dosubind{cp}{#2}{#1}}}
-
-% Define the macros used in formatting output of the sorted index material.
-
-% @printindex causes a particular index (the ??s file) to get printed.
-% It does not print any chapter heading (usually an @unnumbered).
-%
-\parseargdef\printindex{\begingroup
-  \dobreak \chapheadingskip{10000}%
-  %
-  \smallfonts \rm
-  \tolerance = 9500
-  \plainfrenchspacing
-  \everypar = {}% don't want the \kern\-parindent from indentation suppression.
-  %
-  % See if the index file exists and is nonempty.
-  % Change catcode of @ here so that if the index file contains
-  % \initial {@}
-  % as its first line, TeX doesn't complain about mismatched braces
-  % (because it thinks @} is a control sequence).
-  \catcode`\@ = 11
-  \openin 1 \jobname.#1s
-  \ifeof 1
-    % \enddoublecolumns gets confused if there is no text in the index,
-    % and it loses the chapter title and the aux file entries for the
-    % index.  The easiest way to prevent this problem is to make sure
-    % there is some text.
-    \putwordIndexNonexistent
-  \else
-    %
-    % If the index file exists but is empty, then \openin leaves \ifeof
-    % false.  We have to make TeX try to read something from the file, so
-    % it can discover if there is anything in it.
-    \read 1 to \temp
-    \ifeof 1
-      \putwordIndexIsEmpty
-    \else
-      % Index files are almost Texinfo source, but we use \ as the escape
-      % character.  It would be better to use @, but that's too big a change
-      % to make right now.
-      \def\indexbackslash{\backslashcurfont}%
-      \catcode`\\ = 0
-      \escapechar = `\\
-      \begindoublecolumns
-      \input \jobname.#1s
-      \enddoublecolumns
-    \fi
-  \fi
-  \closein 1
-\endgroup}
-
-% These macros are used by the sorted index file itself.
-% Change them to control the appearance of the index.
-
-\def\initial#1{{%
-  % Some minor font changes for the special characters.
-  \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
-  %
-  % Remove any glue we may have, we'll be inserting our own.
-  \removelastskip
-  %
-  % We like breaks before the index initials, so insert a bonus.
-  \nobreak
-  \vskip 0pt plus 3\baselineskip
-  \penalty 0
-  \vskip 0pt plus -3\baselineskip
-  %
-  % Typeset the initial.  Making this add up to a whole number of
-  % baselineskips increases the chance of the dots lining up from column
-  % to column.  It still won't often be perfect, because of the stretch
-  % we need before each entry, but it's better.
-  %
-  % No shrink because it confuses \balancecolumns.
-  \vskip 1.67\baselineskip plus .5\baselineskip
-  \leftline{\secbf #1}%
-  % Do our best not to break after the initial.
-  \nobreak
-  \vskip .33\baselineskip plus .1\baselineskip
-}}
-
-% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
-% then page number (#2) flushed to the right margin.  It is used for index
-% and table of contents entries.  The paragraph is indented by \leftskip.
-%
-% A straightforward implementation would start like this:
-%	\def\entry#1#2{...
-% But this freezes the catcodes in the argument, and can cause problems to
-% @code, which sets - active.  This problem was fixed by a kludge---
-% ``-'' was active throughout whole index, but this isn't really right.
-%
-% The right solution is to prevent \entry from swallowing the whole text.
-%                                 --kasal, 21nov03
-\def\entry{%
-  \begingroup
-    %
-    % Start a new paragraph if necessary, so our assignments below can't
-    % affect previous text.
-    \par
-    %
-    % Do not fill out the last line with white space.
-    \parfillskip = 0in
-    %
-    % No extra space above this paragraph.
-    \parskip = 0in
-    %
-    % Do not prefer a separate line ending with a hyphen to fewer lines.
-    \finalhyphendemerits = 0
-    %
-    % \hangindent is only relevant when the entry text and page number
-    % don't both fit on one line.  In that case, bob suggests starting the
-    % dots pretty far over on the line.  Unfortunately, a large
-    % indentation looks wrong when the entry text itself is broken across
-    % lines.  So we use a small indentation and put up with long leaders.
-    %
-    % \hangafter is reset to 1 (which is the value we want) at the start
-    % of each paragraph, so we need not do anything with that.
-    \hangindent = 2em
-    %
-    % When the entry text needs to be broken, just fill out the first line
-    % with blank space.
-    \rightskip = 0pt plus1fil
-    %
-    % A bit of stretch before each entry for the benefit of balancing
-    % columns.
-    \vskip 0pt plus1pt
-    %
-    % Swallow the left brace of the text (first parameter):
-    \afterassignment\doentry
-    \let\temp =
-}
-\def\doentry{%
-    \bgroup % Instead of the swallowed brace.
-      \noindent
-      \aftergroup\finishentry
-      % And now comes the text of the entry.
-}
-\def\finishentry#1{%
-    % #1 is the page number.
-    %
-    % The following is kludged to not output a line of dots in the index if
-    % there are no page numbers.  The next person who breaks this will be
-    % cursed by a Unix daemon.
-    \setbox\boxA = \hbox{#1}%
-    \ifdim\wd\boxA = 0pt
-      \ %
-    \else
-      %
-      % If we must, put the page number on a line of its own, and fill out
-      % this line with blank space.  (The \hfil is overwhelmed with the
-      % fill leaders glue in \indexdotfill if the page number does fit.)
-      \hfil\penalty50
-      \null\nobreak\indexdotfill % Have leaders before the page number.
-      %
-      % The `\ ' here is removed by the implicit \unskip that TeX does as
-      % part of (the primitive) \par.  Without it, a spurious underfull
-      % \hbox ensues.
-      \ifpdf
-	\pdfgettoks#1.%
-	\ \the\toksA
-      \else
-	\ #1%
-      \fi
-    \fi
-    \par
-  \endgroup
-}
-
-% Like plain.tex's \dotfill, except uses up at least 1 em.
-\def\indexdotfill{\cleaders
-  \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill}
-
-\def\primary #1{\line{#1\hfil}}
-
-\newskip\secondaryindent \secondaryindent=0.5cm
-\def\secondary#1#2{{%
-  \parfillskip=0in
-  \parskip=0in
-  \hangindent=1in
-  \hangafter=1
-  \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
-  \ifpdf
-    \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
-  \else
-    #2
-  \fi
-  \par
-}}
-
-% Define two-column mode, which we use to typeset indexes.
-% Adapted from the TeXbook, page 416, which is to say,
-% the manmac.tex format used to print the TeXbook itself.
-\catcode`\@=11
-
-\newbox\partialpage
-\newdimen\doublecolumnhsize
-
-\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
-  % Grab any single-column material above us.
-  \output = {%
-    %
-    % Here is a possibility not foreseen in manmac: if we accumulate a
-    % whole lot of material, we might end up calling this \output
-    % routine twice in a row (see the doublecol-lose test, which is
-    % essentially a couple of indexes with @setchapternewpage off).  In
-    % that case we just ship out what is in \partialpage with the normal
-    % output routine.  Generally, \partialpage will be empty when this
-    % runs and this will be a no-op.  See the indexspread.tex test case.
-    \ifvoid\partialpage \else
-      \onepageout{\pagecontents\partialpage}%
-    \fi
-    %
-    \global\setbox\partialpage = \vbox{%
-      % Unvbox the main output page.
-      \unvbox\PAGE
-      \kern-\topskip \kern\baselineskip
-    }%
-  }%
-  \eject % run that output routine to set \partialpage
-  %
-  % Use the double-column output routine for subsequent pages.
-  \output = {\doublecolumnout}%
-  %
-  % Change the page size parameters.  We could do this once outside this
-  % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
-  % format, but then we repeat the same computation.  Repeating a couple
-  % of assignments once per index is clearly meaningless for the
-  % execution time, so we may as well do it in one place.
-  %
-  % First we halve the line length, less a little for the gutter between
-  % the columns.  We compute the gutter based on the line length, so it
-  % changes automatically with the paper format.  The magic constant
-  % below is chosen so that the gutter has the same value (well, +-<1pt)
-  % as it did when we hard-coded it.
-  %
-  % We put the result in a separate register, \doublecolumhsize, so we
-  % can restore it in \pagesofar, after \hsize itself has (potentially)
-  % been clobbered.
-  %
-  \doublecolumnhsize = \hsize
-    \advance\doublecolumnhsize by -.04154\hsize
-    \divide\doublecolumnhsize by 2
-  \hsize = \doublecolumnhsize
-  %
-  % Double the \vsize as well.  (We don't need a separate register here,
-  % since nobody clobbers \vsize.)
-  \vsize = 2\vsize
-}
-
-% The double-column output routine for all double-column pages except
-% the last.
-%
-\def\doublecolumnout{%
-  \splittopskip=\topskip \splitmaxdepth=\maxdepth
-  % Get the available space for the double columns -- the normal
-  % (undoubled) page height minus any material left over from the
-  % previous page.
-  \dimen@ = \vsize
-  \divide\dimen@ by 2
-  \advance\dimen@ by -\ht\partialpage
-  %
-  % box0 will be the left-hand column, box2 the right.
-  \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
-  \onepageout\pagesofar
-  \unvbox255
-  \penalty\outputpenalty
-}
-%
-% Re-output the contents of the output page -- any previous material,
-% followed by the two boxes we just split, in box0 and box2.
-\def\pagesofar{%
-  \unvbox\partialpage
-  %
-  \hsize = \doublecolumnhsize
-  \wd0=\hsize \wd2=\hsize
-  \hbox to\pagewidth{\box0\hfil\box2}%
-}
-%
-% All done with double columns.
-\def\enddoublecolumns{%
-  % The following penalty ensures that the page builder is exercised
-  % _before_ we change the output routine.  This is necessary in the
-  % following situation:
-  %
-  % The last section of the index consists only of a single entry.
-  % Before this section, \pagetotal is less than \pagegoal, so no
-  % break occurs before the last section starts.  However, the last
-  % section, consisting of \initial and the single \entry, does not
-  % fit on the page and has to be broken off.  Without the following
-  % penalty the page builder will not be exercised until \eject
-  % below, and by that time we'll already have changed the output
-  % routine to the \balancecolumns version, so the next-to-last
-  % double-column page will be processed with \balancecolumns, which
-  % is wrong:  The two columns will go to the main vertical list, with
-  % the broken-off section in the recent contributions.  As soon as
-  % the output routine finishes, TeX starts reconsidering the page
-  % break.  The two columns and the broken-off section both fit on the
-  % page, because the two columns now take up only half of the page
-  % goal.  When TeX sees \eject from below which follows the final
-  % section, it invokes the new output routine that we've set after
-  % \balancecolumns below; \onepageout will try to fit the two columns
-  % and the final section into the vbox of \pageheight (see
-  % \pagebody), causing an overfull box.
-  %
-  % Note that glue won't work here, because glue does not exercise the
-  % page builder, unlike penalties (see The TeXbook, pp. 280-281).
-  \penalty0
-  %
-  \output = {%
-    % Split the last of the double-column material.  Leave it on the
-    % current page, no automatic page break.
-    \balancecolumns
-    %
-    % If we end up splitting too much material for the current page,
-    % though, there will be another page break right after this \output
-    % invocation ends.  Having called \balancecolumns once, we do not
-    % want to call it again.  Therefore, reset \output to its normal
-    % definition right away.  (We hope \balancecolumns will never be
-    % called on to balance too much material, but if it is, this makes
-    % the output somewhat more palatable.)
-    \global\output = {\onepageout{\pagecontents\PAGE}}%
-  }%
-  \eject
-  \endgroup % started in \begindoublecolumns
-  %
-  % \pagegoal was set to the doubled \vsize above, since we restarted
-  % the current page.  We're now back to normal single-column
-  % typesetting, so reset \pagegoal to the normal \vsize (after the
-  % \endgroup where \vsize got restored).
-  \pagegoal = \vsize
-}
-%
-% Called at the end of the double column material.
-\def\balancecolumns{%
-  \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
-  \dimen@ = \ht0
-  \advance\dimen@ by \topskip
-  \advance\dimen@ by-\baselineskip
-  \divide\dimen@ by 2 % target to split to
-  %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
-  \splittopskip = \topskip
-  % Loop until we get a decent breakpoint.
-  {%
-    \vbadness = 10000
-    \loop
-      \global\setbox3 = \copy0
-      \global\setbox1 = \vsplit3 to \dimen@
-    \ifdim\ht3>\dimen@
-      \global\advance\dimen@ by 1pt
-    \repeat
-  }%
-  %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
-  \setbox0=\vbox to\dimen@{\unvbox1}%
-  \setbox2=\vbox to\dimen@{\unvbox3}%
-  %
-  \pagesofar
-}
-\catcode`\@ = \other
-
-
-\message{sectioning,}
-% Chapters, sections, etc.
-
-% \unnumberedno is an oxymoron, of course.  But we count the unnumbered
-% sections so that we can refer to them unambiguously in the pdf
-% outlines by their "section number".  We avoid collisions with chapter
-% numbers by starting them at 10000.  (If a document ever has 10000
-% chapters, we're in trouble anyway, I'm sure.)
-\newcount\unnumberedno \unnumberedno = 10000
-\newcount\chapno
-\newcount\secno        \secno=0
-\newcount\subsecno     \subsecno=0
-\newcount\subsubsecno  \subsubsecno=0
-
-% This counter is funny since it counts through charcodes of letters A, B, ...
-\newcount\appendixno  \appendixno = `\@
-%
-% \def\appendixletter{\char\the\appendixno}
-% We do the following ugly conditional instead of the above simple
-% construct for the sake of pdftex, which needs the actual
-% letter in the expansion, not just typeset.
-%
-\def\appendixletter{%
-  \ifnum\appendixno=`A A%
-  \else\ifnum\appendixno=`B B%
-  \else\ifnum\appendixno=`C C%
-  \else\ifnum\appendixno=`D D%
-  \else\ifnum\appendixno=`E E%
-  \else\ifnum\appendixno=`F F%
-  \else\ifnum\appendixno=`G G%
-  \else\ifnum\appendixno=`H H%
-  \else\ifnum\appendixno=`I I%
-  \else\ifnum\appendixno=`J J%
-  \else\ifnum\appendixno=`K K%
-  \else\ifnum\appendixno=`L L%
-  \else\ifnum\appendixno=`M M%
-  \else\ifnum\appendixno=`N N%
-  \else\ifnum\appendixno=`O O%
-  \else\ifnum\appendixno=`P P%
-  \else\ifnum\appendixno=`Q Q%
-  \else\ifnum\appendixno=`R R%
-  \else\ifnum\appendixno=`S S%
-  \else\ifnum\appendixno=`T T%
-  \else\ifnum\appendixno=`U U%
-  \else\ifnum\appendixno=`V V%
-  \else\ifnum\appendixno=`W W%
-  \else\ifnum\appendixno=`X X%
-  \else\ifnum\appendixno=`Y Y%
-  \else\ifnum\appendixno=`Z Z%
-  % The \the is necessary, despite appearances, because \appendixletter is
-  % expanded while writing the .toc file.  \char\appendixno is not
-  % expandable, thus it is written literally, thus all appendixes come out
-  % with the same letter (or @) in the toc without it.
-  \else\char\the\appendixno
-  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
-  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
-
-% Each @chapter defines these (using marks) as the number+name, number
-% and name of the chapter.  Page headings and footings can use
-% these.  @section does likewise.
-\def\thischapter{}
-\def\thischapternum{}
-\def\thischaptername{}
-\def\thissection{}
-\def\thissectionnum{}
-\def\thissectionname{}
-
-\newcount\absseclevel % used to calculate proper heading level
-\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
-
-% @raisesections: treat @section as chapter, @subsection as section, etc.
-\def\raisesections{\global\advance\secbase by -1}
-\let\up=\raisesections % original BFox name
-
-% @lowersections: treat @chapter as section, @section as subsection, etc.
-\def\lowersections{\global\advance\secbase by 1}
-\let\down=\lowersections % original BFox name
-
-% we only have subsub.
-\chardef\maxseclevel = 3
-%
-% A numbered section within an unnumbered changes to unnumbered too.
-% To achive this, remember the "biggest" unnum. sec. we are currently in:
-\chardef\unmlevel = \maxseclevel
-%
-% Trace whether the current chapter is an appendix or not:
-% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
-\def\chapheadtype{N}
-
-% Choose a heading macro
-% #1 is heading type
-% #2 is heading level
-% #3 is text for heading
-\def\genhead#1#2#3{%
-  % Compute the abs. sec. level:
-  \absseclevel=#2
-  \advance\absseclevel by \secbase
-  % Make sure \absseclevel doesn't fall outside the range:
-  \ifnum \absseclevel < 0
-    \absseclevel = 0
-  \else
-    \ifnum \absseclevel > 3
-      \absseclevel = 3
-    \fi
-  \fi
-  % The heading type:
-  \def\headtype{#1}%
-  \if \headtype U%
-    \ifnum \absseclevel < \unmlevel
-      \chardef\unmlevel = \absseclevel
-    \fi
-  \else
-    % Check for appendix sections:
-    \ifnum \absseclevel = 0
-      \edef\chapheadtype{\headtype}%
-    \else
-      \if \headtype A\if \chapheadtype N%
-	\errmessage{@appendix... within a non-appendix chapter}%
-      \fi\fi
-    \fi
-    % Check for numbered within unnumbered:
-    \ifnum \absseclevel > \unmlevel
-      \def\headtype{U}%
-    \else
-      \chardef\unmlevel = 3
-    \fi
-  \fi
-  % Now print the heading:
-  \if \headtype U%
-    \ifcase\absseclevel
-	\unnumberedzzz{#3}%
-    \or \unnumberedseczzz{#3}%
-    \or \unnumberedsubseczzz{#3}%
-    \or \unnumberedsubsubseczzz{#3}%
-    \fi
-  \else
-    \if \headtype A%
-      \ifcase\absseclevel
-	  \appendixzzz{#3}%
-      \or \appendixsectionzzz{#3}%
-      \or \appendixsubseczzz{#3}%
-      \or \appendixsubsubseczzz{#3}%
-      \fi
-    \else
-      \ifcase\absseclevel
-	  \chapterzzz{#3}%
-      \or \seczzz{#3}%
-      \or \numberedsubseczzz{#3}%
-      \or \numberedsubsubseczzz{#3}%
-      \fi
-    \fi
-  \fi
-  \suppressfirstparagraphindent
-}
-
-% an interface:
-\def\numhead{\genhead N}
-\def\apphead{\genhead A}
-\def\unnmhead{\genhead U}
-
-% @chapter, @appendix, @unnumbered.  Increment top-level counter, reset
-% all lower-level sectioning counters to zero.
-%
-% Also set \chaplevelprefix, which we prepend to @float sequence numbers
-% (e.g., figures), q.v.  By default (before any chapter), that is empty.
-\let\chaplevelprefix = \empty
-%
-\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
-\def\chapterzzz#1{%
-  % section resetting is \global in case the chapter is in a group, such
-  % as an @include file.
-  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
-    \global\advance\chapno by 1
-  %
-  % Used for \float.
-  \gdef\chaplevelprefix{\the\chapno.}%
-  \resetallfloatnos
-  %
-  % \putwordChapter can contain complex things in translations.
-  \toks0=\expandafter{\putwordChapter}%
-  \message{\the\toks0 \space \the\chapno}%
-  %
-  % Write the actual heading.
-  \chapmacro{#1}{Ynumbered}{\the\chapno}%
-  %
-  % So @section and the like are numbered underneath this chapter.
-  \global\let\section = \numberedsec
-  \global\let\subsection = \numberedsubsec
-  \global\let\subsubsection = \numberedsubsubsec
-}
-
-\outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz
-%
-\def\appendixzzz#1{%
-  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
-    \global\advance\appendixno by 1
-  \gdef\chaplevelprefix{\appendixletter.}%
-  \resetallfloatnos
-  %
-  % \putwordAppendix can contain complex things in translations.
-  \toks0=\expandafter{\putwordAppendix}%
-  \message{\the\toks0 \space \appendixletter}%
-  %
-  \chapmacro{#1}{Yappendix}{\appendixletter}%
-  %
-  \global\let\section = \appendixsec
-  \global\let\subsection = \appendixsubsec
-  \global\let\subsubsection = \appendixsubsubsec
-}
-
-\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
-\def\unnumberedzzz#1{%
-  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
-    \global\advance\unnumberedno by 1
-  %
-  % Since an unnumbered has no number, no prefix for figures.
-  \global\let\chaplevelprefix = \empty
-  \resetallfloatnos
-  %
-  % This used to be simply \message{#1}, but TeX fully expands the
-  % argument to \message.  Therefore, if #1 contained @-commands, TeX
-  % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
-  % expanded @cite (which turns out to cause errors because \cite is meant
-  % to be executed, not expanded).
-  %
-  % Anyway, we don't want the fully-expanded definition of @cite to appear
-  % as a result of the \message, we just want `@cite' itself.  We use
-  % \the<toks register> to achieve this: TeX expands \the<toks> only once,
-  % simply yielding the contents of <toks register>.  (We also do this for
-  % the toc entries.)
-  \toks0 = {#1}%
-  \message{(\the\toks0)}%
-  %
-  \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
-  %
-  \global\let\section = \unnumberedsec
-  \global\let\subsection = \unnumberedsubsec
-  \global\let\subsubsection = \unnumberedsubsubsec
-}
-
-% @centerchap is like @unnumbered, but the heading is centered.
-\outer\parseargdef\centerchap{%
-  % Well, we could do the following in a group, but that would break
-  % an assumption that \chapmacro is called at the outermost level.
-  % Thus we are safer this way:		--kasal, 24feb04
-  \let\centerparametersmaybe = \centerparameters
-  \unnmhead0{#1}%
-  \let\centerparametersmaybe = \relax
-}
-
-% @top is like @unnumbered.
-\let\top\unnumbered
-
-% Sections.
-\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
-\def\seczzz#1{%
-  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
-  \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
-}
-
-\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz
-\def\appendixsectionzzz#1{%
-  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
-  \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
-}
-\let\appendixsec\appendixsection
-
-\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz
-\def\unnumberedseczzz#1{%
-  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
-  \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
-}
-
-% Subsections.
-\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
-\def\numberedsubseczzz#1{%
-  \global\subsubsecno=0  \global\advance\subsecno by 1
-  \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
-}
-
-\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz
-\def\appendixsubseczzz#1{%
-  \global\subsubsecno=0  \global\advance\subsecno by 1
-  \sectionheading{#1}{subsec}{Yappendix}%
-                 {\appendixletter.\the\secno.\the\subsecno}%
-}
-
-\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
-\def\unnumberedsubseczzz#1{%
-  \global\subsubsecno=0  \global\advance\subsecno by 1
-  \sectionheading{#1}{subsec}{Ynothing}%
-                 {\the\unnumberedno.\the\secno.\the\subsecno}%
-}
-
-% Subsubsections.
-\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
-\def\numberedsubsubseczzz#1{%
-  \global\advance\subsubsecno by 1
-  \sectionheading{#1}{subsubsec}{Ynumbered}%
-                 {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
-}
-
-\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz
-\def\appendixsubsubseczzz#1{%
-  \global\advance\subsubsecno by 1
-  \sectionheading{#1}{subsubsec}{Yappendix}%
-                 {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
-}
-
-\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
-\def\unnumberedsubsubseczzz#1{%
-  \global\advance\subsubsecno by 1
-  \sectionheading{#1}{subsubsec}{Ynothing}%
-                 {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
-}
-
-% These macros control what the section commands do, according
-% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
-% Define them by default for a numbered chapter.
-\let\section = \numberedsec
-\let\subsection = \numberedsubsec
-\let\subsubsection = \numberedsubsubsec
-
-% Define @majorheading, @heading and @subheading
-
-% NOTE on use of \vbox for chapter headings, section headings, and such:
-%       1) We use \vbox rather than the earlier \line to permit
-%          overlong headings to fold.
-%       2) \hyphenpenalty is set to 10000 because hyphenation in a
-%          heading is obnoxious; this forbids it.
-%       3) Likewise, headings look best if no \parindent is used, and
-%          if justification is not attempted.  Hence \raggedright.
-
-\def\majorheading{%
-  {\advance\chapheadingskip by 10pt \chapbreak }%
-  \parsearg\chapheadingzzz
-}
-
-\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
-\def\chapheadingzzz#1{%
-  {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                    \parindent=0pt\ptexraggedright
-                    \rmisbold #1\hfill}}%
-  \bigskip \par\penalty 200\relax
-  \suppressfirstparagraphindent
-}
-
-% @heading, @subheading, @subsubheading.
-\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
-  \suppressfirstparagraphindent}
-\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
-  \suppressfirstparagraphindent}
-\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
-  \suppressfirstparagraphindent}
-
-% These macros generate a chapter, section, etc. heading only
-% (including whitespace, linebreaking, etc. around it),
-% given all the information in convenient, parsed form.
-
-%%% Args are the skip and penalty (usually negative)
-\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
-
-%%% Define plain chapter starts, and page on/off switching for it
-% Parameter controlling skip before chapter headings (if needed)
-
-\newskip\chapheadingskip
-
-\def\chapbreak{\dobreak \chapheadingskip {-4000}}
-\def\chappager{\par\vfill\supereject}
-% Because \domark is called before \chapoddpage, the filler page will
-% get the headings for the next chapter, which is wrong.  But we don't
-% care -- we just disable all headings on the filler page.
-\def\chapoddpage{%
-  \chappager
-  \ifodd\pageno \else
-    \begingroup
-      \evenheadline={\hfil}\evenfootline={\hfil}%
-      \oddheadline={\hfil}\oddfootline={\hfil}%
-      \hbox to 0pt{}%
-      \chappager
-    \endgroup
-  \fi
-}
-
-\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
-
-\def\CHAPPAGoff{%
-\global\let\contentsalignmacro = \chappager
-\global\let\pchapsepmacro=\chapbreak
-\global\let\pagealignmacro=\chappager}
-
-\def\CHAPPAGon{%
-\global\let\contentsalignmacro = \chappager
-\global\let\pchapsepmacro=\chappager
-\global\let\pagealignmacro=\chappager
-\global\def\HEADINGSon{\HEADINGSsingle}}
-
-\def\CHAPPAGodd{%
-\global\let\contentsalignmacro = \chapoddpage
-\global\let\pchapsepmacro=\chapoddpage
-\global\let\pagealignmacro=\chapoddpage
-\global\def\HEADINGSon{\HEADINGSdouble}}
-
-\CHAPPAGon
-
-% Chapter opening.
-%
-% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
-% Yappendix, Yomitfromtoc), #3 the chapter number.
-%
-% To test against our argument.
-\def\Ynothingkeyword{Ynothing}
-\def\Yomitfromtockeyword{Yomitfromtoc}
-\def\Yappendixkeyword{Yappendix}
-%
-\def\chapmacro#1#2#3{%
-  % Insert the first mark before the heading break (see notes for \domark).
-  \let\prevchapterdefs=\lastchapterdefs
-  \let\prevsectiondefs=\lastsectiondefs
-  \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}%
-                        \gdef\thissection{}}%
-  %
-  \def\temptype{#2}%
-  \ifx\temptype\Ynothingkeyword
-    \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
-                          \gdef\thischapter{\thischaptername}}%
-  \else\ifx\temptype\Yomitfromtockeyword
-    \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
-                          \gdef\thischapter{}}%
-  \else\ifx\temptype\Yappendixkeyword
-    \toks0={#1}%
-    \xdef\lastchapterdefs{%
-      \gdef\noexpand\thischaptername{\the\toks0}%
-      \gdef\noexpand\thischapternum{\appendixletter}%
-      % \noexpand\putwordAppendix avoids expanding indigestible
-      % commands in some of the translations.
-      \gdef\noexpand\thischapter{\noexpand\putwordAppendix{}
-                                 \noexpand\thischapternum:
-                                 \noexpand\thischaptername}%
-    }%
-  \else
-    \toks0={#1}%
-    \xdef\lastchapterdefs{%
-      \gdef\noexpand\thischaptername{\the\toks0}%
-      \gdef\noexpand\thischapternum{\the\chapno}%
-      % \noexpand\putwordChapter avoids expanding indigestible
-      % commands in some of the translations.
-      \gdef\noexpand\thischapter{\noexpand\putwordChapter{}
-                                 \noexpand\thischapternum:
-                                 \noexpand\thischaptername}%
-    }%
-  \fi\fi\fi
-  %
-  % Output the mark.  Pass it through \safewhatsit, to take care of
-  % the preceding space.
-  \safewhatsit\domark
-  %
-  % Insert the chapter heading break.
-  \pchapsepmacro
-  %
-  % Now the second mark, after the heading break.  No break points
-  % between here and the heading.
-  \let\prevchapterdefs=\lastchapterdefs
-  \let\prevsectiondefs=\lastsectiondefs
-  \domark
-  %
-  {%
-    \chapfonts \rmisbold
-    %
-    % Have to define \lastsection before calling \donoderef, because the
-    % xref code eventually uses it.  On the other hand, it has to be called
-    % after \pchapsepmacro, or the headline will change too soon.
-    \gdef\lastsection{#1}%
-    %
-    % Only insert the separating space if we have a chapter/appendix
-    % number, and don't print the unnumbered ``number''.
-    \ifx\temptype\Ynothingkeyword
-      \setbox0 = \hbox{}%
-      \def\toctype{unnchap}%
-    \else\ifx\temptype\Yomitfromtockeyword
-      \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
-      \def\toctype{omit}%
-    \else\ifx\temptype\Yappendixkeyword
-      \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
-      \def\toctype{app}%
-    \else
-      \setbox0 = \hbox{#3\enspace}%
-      \def\toctype{numchap}%
-    \fi\fi\fi
-    %
-    % Write the toc entry for this chapter.  Must come before the
-    % \donoderef, because we include the current node name in the toc
-    % entry, and \donoderef resets it to empty.
-    \writetocentry{\toctype}{#1}{#3}%
-    %
-    % For pdftex, we have to write out the node definition (aka, make
-    % the pdfdest) after any page break, but before the actual text has
-    % been typeset.  If the destination for the pdf outline is after the
-    % text, then jumping from the outline may wind up with the text not
-    % being visible, for instance under high magnification.
-    \donoderef{#2}%
-    %
-    % Typeset the actual heading.
-    \nobreak % Avoid page breaks at the interline glue.
-    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright
-          \hangindent=\wd0 \centerparametersmaybe
-          \unhbox0 #1\par}%
-  }%
-  \nobreak\bigskip % no page break after a chapter title
-  \nobreak
-}
-
-% @centerchap -- centered and unnumbered.
-\let\centerparametersmaybe = \relax
-\def\centerparameters{%
-  \advance\rightskip by 3\rightskip
-  \leftskip = \rightskip
-  \parfillskip = 0pt
-}
-
-
-% I don't think this chapter style is supported any more, so I'm not
-% updating it with the new noderef stuff.  We'll see.  --karl, 11aug03.
-%
-\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
-%
-\def\unnchfopen #1{%
-\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                       \parindent=0pt\ptexraggedright
-                       \rmisbold #1\hfill}}\bigskip \par\nobreak
-}
-\def\chfopen #1#2{\chapoddpage {\chapfonts
-\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
-\par\penalty 5000 %
-}
-\def\centerchfopen #1{%
-\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                       \parindent=0pt
-                       \hfill {\rmisbold #1}\hfill}}\bigskip \par\nobreak
-}
-\def\CHAPFopen{%
-  \global\let\chapmacro=\chfopen
-  \global\let\centerchapmacro=\centerchfopen}
-
-
-% Section titles.  These macros combine the section number parts and
-% call the generic \sectionheading to do the printing.
-%
-\newskip\secheadingskip
-\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
-
-% Subsection titles.
-\newskip\subsecheadingskip
-\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
-
-% Subsubsection titles.
-\def\subsubsecheadingskip{\subsecheadingskip}
-\def\subsubsecheadingbreak{\subsecheadingbreak}
-
-
-% Print any size, any type, section title.
-%
-% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
-% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
-% section number.
-%
-\def\seckeyword{sec}
-%
-\def\sectionheading#1#2#3#4{%
-  {%
-    % Switch to the right set of fonts.
-    \csname #2fonts\endcsname \rmisbold
-    %
-    \def\sectionlevel{#2}%
-    \def\temptype{#3}%
-    %
-    % Insert first mark before the heading break (see notes for \domark).
-    \let\prevsectiondefs=\lastsectiondefs
-    \ifx\temptype\Ynothingkeyword
-      \ifx\sectionlevel\seckeyword
-        \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}%
-                              \gdef\thissection{\thissectionname}}%
-      \fi
-    \else\ifx\temptype\Yomitfromtockeyword
-      % Don't redefine \thissection.
-    \else\ifx\temptype\Yappendixkeyword
-      \ifx\sectionlevel\seckeyword
-        \toks0={#1}%
-        \xdef\lastsectiondefs{%
-          \gdef\noexpand\thissectionname{\the\toks0}%
-          \gdef\noexpand\thissectionnum{#4}%
-          % \noexpand\putwordSection avoids expanding indigestible
-          % commands in some of the translations.
-          \gdef\noexpand\thissection{\noexpand\putwordSection{}
-                                     \noexpand\thissectionnum:
-                                     \noexpand\thissectionname}%
-        }%
-      \fi
-    \else
-      \ifx\sectionlevel\seckeyword
-        \toks0={#1}%
-        \xdef\lastsectiondefs{%
-          \gdef\noexpand\thissectionname{\the\toks0}%
-          \gdef\noexpand\thissectionnum{#4}%
-          % \noexpand\putwordSection avoids expanding indigestible
-          % commands in some of the translations.
-          \gdef\noexpand\thissection{\noexpand\putwordSection{}
-                                     \noexpand\thissectionnum:
-                                     \noexpand\thissectionname}%
-        }%
-      \fi
-    \fi\fi\fi
-    %
-    % Go into vertical mode.  Usually we'll already be there, but we
-    % don't want the following whatsit to end up in a preceding paragraph
-    % if the document didn't happen to have a blank line.
-    \par
-    %
-    % Output the mark.  Pass it through \safewhatsit, to take care of
-    % the preceding space.
-    \safewhatsit\domark
-    %
-    % Insert space above the heading.
-    \csname #2headingbreak\endcsname
-    %
-    % Now the second mark, after the heading break.  No break points
-    % between here and the heading.
-    \let\prevsectiondefs=\lastsectiondefs
-    \domark
-    %
-    % Only insert the space after the number if we have a section number.
-    \ifx\temptype\Ynothingkeyword
-      \setbox0 = \hbox{}%
-      \def\toctype{unn}%
-      \gdef\lastsection{#1}%
-    \else\ifx\temptype\Yomitfromtockeyword
-      % for @headings -- no section number, don't include in toc,
-      % and don't redefine \lastsection.
-      \setbox0 = \hbox{}%
-      \def\toctype{omit}%
-      \let\sectionlevel=\empty
-    \else\ifx\temptype\Yappendixkeyword
-      \setbox0 = \hbox{#4\enspace}%
-      \def\toctype{app}%
-      \gdef\lastsection{#1}%
-    \else
-      \setbox0 = \hbox{#4\enspace}%
-      \def\toctype{num}%
-      \gdef\lastsection{#1}%
-    \fi\fi\fi
-    %
-    % Write the toc entry (before \donoderef).  See comments in \chapmacro.
-    \writetocentry{\toctype\sectionlevel}{#1}{#4}%
-    %
-    % Write the node reference (= pdf destination for pdftex).
-    % Again, see comments in \chapmacro.
-    \donoderef{#3}%
-    %
-    % Interline glue will be inserted when the vbox is completed.
-    % That glue will be a valid breakpoint for the page, since it'll be
-    % preceded by a whatsit (usually from the \donoderef, or from the
-    % \writetocentry if there was no node).  We don't want to allow that
-    % break, since then the whatsits could end up on page n while the
-    % section is on page n+1, thus toc/etc. are wrong.  Debian bug 276000.
-    \nobreak
-    %
-    % Output the actual section heading.
-    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright
-          \hangindent=\wd0  % zero if no section number
-          \unhbox0 #1}%
-  }%
-  % Add extra space after the heading -- half of whatever came above it.
-  % Don't allow stretch, though.
-  \kern .5 \csname #2headingskip\endcsname
-  %
-  % Do not let the kern be a potential breakpoint, as it would be if it
-  % was followed by glue.
-  \nobreak
-  %
-  % We'll almost certainly start a paragraph next, so don't let that
-  % glue accumulate.  (Not a breakpoint because it's preceded by a
-  % discardable item.)
-  \vskip-\parskip
-  %
-  % This is purely so the last item on the list is a known \penalty >
-  % 10000.  This is so \startdefun can avoid allowing breakpoints after
-  % section headings.  Otherwise, it would insert a valid breakpoint between:
-  %
-  %   @section sec-whatever
-  %   @deffn def-whatever
-  \penalty 10001
-}
-
-
-\message{toc,}
-% Table of contents.
-\newwrite\tocfile
-
-% Write an entry to the toc file, opening it if necessary.
-% Called from @chapter, etc.
-%
-% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
-% We append the current node name (if any) and page number as additional
-% arguments for the \{chap,sec,...}entry macros which will eventually
-% read this.  The node name is used in the pdf outlines as the
-% destination to jump to.
-%
-% We open the .toc file for writing here instead of at @setfilename (or
-% any other fixed time) so that @contents can be anywhere in the document.
-% But if #1 is `omit', then we don't do anything.  This is used for the
-% table of contents chapter openings themselves.
-%
-\newif\iftocfileopened
-\def\omitkeyword{omit}%
-%
-\def\writetocentry#1#2#3{%
-  \edef\writetoctype{#1}%
-  \ifx\writetoctype\omitkeyword \else
-    \iftocfileopened\else
-      \immediate\openout\tocfile = \jobname.toc
-      \global\tocfileopenedtrue
-    \fi
-    %
-    \iflinks
-      {\atdummies
-       \edef\temp{%
-         \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%
-       \temp
-      }%
-    \fi
-  \fi
-  %
-  % Tell \shipout to create a pdf destination on each page, if we're
-  % writing pdf.  These are used in the table of contents.  We can't
-  % just write one on every page because the title pages are numbered
-  % 1 and 2 (the page numbers aren't printed), and so are the first
-  % two pages of the document.  Thus, we'd have two destinations named
-  % `1', and two named `2'.
-  \ifpdf \global\pdfmakepagedesttrue \fi
-}
-
-
-% These characters do not print properly in the Computer Modern roman
-% fonts, so we must take special care.  This is more or less redundant
-% with the Texinfo input format setup at the end of this file.
-%
-\def\activecatcodes{%
-  \catcode`\"=\active
-  \catcode`\$=\active
-  \catcode`\<=\active
-  \catcode`\>=\active
-  \catcode`\\=\active
-  \catcode`\^=\active
-  \catcode`\_=\active
-  \catcode`\|=\active
-  \catcode`\~=\active
-}
-
-
-% Read the toc file, which is essentially Texinfo input.
-\def\readtocfile{%
-  \setupdatafile
-  \activecatcodes
-  \input \tocreadfilename
-}
-
-\newskip\contentsrightmargin \contentsrightmargin=1in
-\newcount\savepageno
-\newcount\lastnegativepageno \lastnegativepageno = -1
-
-% Prepare to read what we've written to \tocfile.
-%
-\def\startcontents#1{%
-  % If @setchapternewpage on, and @headings double, the contents should
-  % start on an odd page, unlike chapters.  Thus, we maintain
-  % \contentsalignmacro in parallel with \pagealignmacro.
-  % From: Torbjorn Granlund <tege@matematik.su.se>
-  \contentsalignmacro
-  \immediate\closeout\tocfile
-  %
-  % Don't need to put `Contents' or `Short Contents' in the headline.
-  % It is abundantly clear what they are.
-  \chapmacro{#1}{Yomitfromtoc}{}%
-  %
-  \savepageno = \pageno
-  \begingroup                  % Set up to handle contents files properly.
-    \raggedbottom              % Worry more about breakpoints than the bottom.
-    \advance\hsize by -\contentsrightmargin % Don't use the full line length.
-    %
-    % Roman numerals for page numbers.
-    \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
-}
-
-% redefined for the two-volume lispref.  We always output on
-% \jobname.toc even if this is redefined.
-%
-\def\tocreadfilename{\jobname.toc}
-
-% Normal (long) toc.
-%
-\def\contents{%
-  \startcontents{\putwordTOC}%
-    \openin 1 \tocreadfilename\space
-    \ifeof 1 \else
-      \readtocfile
-    \fi
-    \vfill \eject
-    \contentsalignmacro % in case @setchapternewpage odd is in effect
-    \ifeof 1 \else
-      \pdfmakeoutlines
-    \fi
-    \closein 1
-  \endgroup
-  \lastnegativepageno = \pageno
-  \global\pageno = \savepageno
-}
-
-% And just the chapters.
-\def\summarycontents{%
-  \startcontents{\putwordShortTOC}%
-    %
-    \let\numchapentry = \shortchapentry
-    \let\appentry = \shortchapentry
-    \let\unnchapentry = \shortunnchapentry
-    % We want a true roman here for the page numbers.
-    \secfonts
-    \let\rm=\shortcontrm \let\bf=\shortcontbf
-    \let\sl=\shortcontsl \let\tt=\shortconttt
-    \rm
-    \hyphenpenalty = 10000
-    \advance\baselineskip by 1pt % Open it up a little.
-    \def\numsecentry##1##2##3##4{}
-    \let\appsecentry = \numsecentry
-    \let\unnsecentry = \numsecentry
-    \let\numsubsecentry = \numsecentry
-    \let\appsubsecentry = \numsecentry
-    \let\unnsubsecentry = \numsecentry
-    \let\numsubsubsecentry = \numsecentry
-    \let\appsubsubsecentry = \numsecentry
-    \let\unnsubsubsecentry = \numsecentry
-    \openin 1 \tocreadfilename\space
-    \ifeof 1 \else
-      \readtocfile
-    \fi
-    \closein 1
-    \vfill \eject
-    \contentsalignmacro % in case @setchapternewpage odd is in effect
-  \endgroup
-  \lastnegativepageno = \pageno
-  \global\pageno = \savepageno
-}
-\let\shortcontents = \summarycontents
-
-% Typeset the label for a chapter or appendix for the short contents.
-% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
-%
-\def\shortchaplabel#1{%
-  % This space should be enough, since a single number is .5em, and the
-  % widest letter (M) is 1em, at least in the Computer Modern fonts.
-  % But use \hss just in case.
-  % (This space doesn't include the extra space that gets added after
-  % the label; that gets put in by \shortchapentry above.)
-  %
-  % We'd like to right-justify chapter numbers, but that looks strange
-  % with appendix letters.  And right-justifying numbers and
-  % left-justifying letters looks strange when there is less than 10
-  % chapters.  Have to read the whole toc once to know how many chapters
-  % there are before deciding ...
-  \hbox to 1em{#1\hss}%
-}
-
-% These macros generate individual entries in the table of contents.
-% The first argument is the chapter or section name.
-% The last argument is the page number.
-% The arguments in between are the chapter number, section number, ...
-
-% Chapters, in the main contents.
-\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
-%
-% Chapters, in the short toc.
-% See comments in \dochapentry re vbox and related settings.
-\def\shortchapentry#1#2#3#4{%
-  \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
-}
-
-% Appendices, in the main contents.
-% Need the word Appendix, and a fixed-size box.
-%
-\def\appendixbox#1{%
-  % We use M since it's probably the widest letter.
-  \setbox0 = \hbox{\putwordAppendix{} M}%
-  \hbox to \wd0{\putwordAppendix{} #1\hss}}
-%
-\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
-
-% Unnumbered chapters.
-\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
-\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
-
-% Sections.
-\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
-\let\appsecentry=\numsecentry
-\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
-
-% Subsections.
-\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
-\let\appsubsecentry=\numsubsecentry
-\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
-
-% And subsubsections.
-\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
-\let\appsubsubsecentry=\numsubsubsecentry
-\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
-
-% This parameter controls the indentation of the various levels.
-% Same as \defaultparindent.
-\newdimen\tocindent \tocindent = 15pt
-
-% Now for the actual typesetting. In all these, #1 is the text and #2 is the
-% page number.
-%
-% If the toc has to be broken over pages, we want it to be at chapters
-% if at all possible; hence the \penalty.
-\def\dochapentry#1#2{%
-   \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
-   \begingroup
-     \chapentryfonts
-     \tocentry{#1}{\dopageno\bgroup#2\egroup}%
-   \endgroup
-   \nobreak\vskip .25\baselineskip plus.1\baselineskip
-}
-
-\def\dosecentry#1#2{\begingroup
-  \secentryfonts \leftskip=\tocindent
-  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
-\endgroup}
-
-\def\dosubsecentry#1#2{\begingroup
-  \subsecentryfonts \leftskip=2\tocindent
-  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
-\endgroup}
-
-\def\dosubsubsecentry#1#2{\begingroup
-  \subsubsecentryfonts \leftskip=3\tocindent
-  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
-\endgroup}
-
-% We use the same \entry macro as for the index entries.
-\let\tocentry = \entry
-
-% Space between chapter (or whatever) number and the title.
-\def\labelspace{\hskip1em \relax}
-
-\def\dopageno#1{{\rm #1}}
-\def\doshortpageno#1{{\rm #1}}
-
-\def\chapentryfonts{\secfonts \rm}
-\def\secentryfonts{\textfonts}
-\def\subsecentryfonts{\textfonts}
-\def\subsubsecentryfonts{\textfonts}
-
-
-\message{environments,}
-% @foo ... @end foo.
-
-% @tex ... @end tex    escapes into raw Tex temporarily.
-% One exception: @ is still an escape character, so that @end tex works.
-% But \@ or @@ will get a plain tex @ character.
-
-\envdef\tex{%
-  \setupmarkupstyle{tex}%
-  \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
-  \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
-  \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
-  \catcode `\%=14
-  \catcode `\+=\other
-  \catcode `\"=\other
-  \catcode `\|=\other
-  \catcode `\<=\other
-  \catcode `\>=\other
-  \catcode`\`=\other
-  \catcode`\'=\other
-  \escapechar=`\\
-  %
-  \let\b=\ptexb
-  \let\bullet=\ptexbullet
-  \let\c=\ptexc
-  \let\,=\ptexcomma
-  \let\.=\ptexdot
-  \let\dots=\ptexdots
-  \let\equiv=\ptexequiv
-  \let\!=\ptexexclam
-  \let\i=\ptexi
-  \let\indent=\ptexindent
-  \let\noindent=\ptexnoindent
-  \let\{=\ptexlbrace
-  \let\+=\tabalign
-  \let\}=\ptexrbrace
-  \let\/=\ptexslash
-  \let\*=\ptexstar
-  \let\t=\ptext
-  \expandafter \let\csname top\endcsname=\ptextop  % outer
-  \let\frenchspacing=\plainfrenchspacing
-  %
-  \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
-  \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
-  \def\@{@}%
-}
-% There is no need to define \Etex.
-
-% Define @lisp ... @end lisp.
-% @lisp environment forms a group so it can rebind things,
-% including the definition of @end lisp (which normally is erroneous).
-
-% Amount to narrow the margins by for @lisp.
-\newskip\lispnarrowing \lispnarrowing=0.4in
-
-% This is the definition that ^^M gets inside @lisp, @example, and other
-% such environments.  \null is better than a space, since it doesn't
-% have any width.
-\def\lisppar{\null\endgraf}
-
-% This space is always present above and below environments.
-\newskip\envskipamount \envskipamount = 0pt
-
-% Make spacing and below environment symmetrical.  We use \parskip here
-% to help in doing that, since in @example-like environments \parskip
-% is reset to zero; thus the \afterenvbreak inserts no space -- but the
-% start of the next paragraph will insert \parskip.
-%
-\def\aboveenvbreak{{%
-  % =10000 instead of <10000 because of a special case in \itemzzz and
-  % \sectionheading, q.v.
-  \ifnum \lastpenalty=10000 \else
-    \advance\envskipamount by \parskip
-    \endgraf
-    \ifdim\lastskip<\envskipamount
-      \removelastskip
-      % it's not a good place to break if the last penalty was \nobreak
-      % or better ...
-      \ifnum\lastpenalty<10000 \penalty-50 \fi
-      \vskip\envskipamount
-    \fi
-  \fi
-}}
-
-\let\afterenvbreak = \aboveenvbreak
-
-% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins; it will
-% also clear it, so that its embedded environments do the narrowing again.
-\let\nonarrowing=\relax
-
-% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
-% environment contents.
-\font\circle=lcircle10
-\newdimen\circthick
-\newdimen\cartouter\newdimen\cartinner
-\newskip\normbskip\newskip\normpskip\newskip\normlskip
-\circthick=\fontdimen8\circle
-%
-\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
-\def\ctr{{\hskip 6pt\circle\char'010}}
-\def\cbl{{\circle\char'012\hskip -6pt}}
-\def\cbr{{\hskip 6pt\circle\char'011}}
-\def\carttop{\hbox to \cartouter{\hskip\lskip
-        \ctl\leaders\hrule height\circthick\hfil\ctr
-        \hskip\rskip}}
-\def\cartbot{\hbox to \cartouter{\hskip\lskip
-        \cbl\leaders\hrule height\circthick\hfil\cbr
-        \hskip\rskip}}
-%
-\newskip\lskip\newskip\rskip
-
-\envdef\cartouche{%
-  \ifhmode\par\fi  % can't be in the midst of a paragraph.
-  \startsavinginserts
-  \lskip=\leftskip \rskip=\rightskip
-  \leftskip=0pt\rightskip=0pt % we want these *outside*.
-  \cartinner=\hsize \advance\cartinner by-\lskip
-  \advance\cartinner by-\rskip
-  \cartouter=\hsize
-  \advance\cartouter by 18.4pt	% allow for 3pt kerns on either
-				% side, and for 6pt waste from
-				% each corner char, and rule thickness
-  \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
-  % Flag to tell @lisp, etc., not to narrow margin.
-  \let\nonarrowing = t%
-  \vbox\bgroup
-      \baselineskip=0pt\parskip=0pt\lineskip=0pt
-      \carttop
-      \hbox\bgroup
-	  \hskip\lskip
-	  \vrule\kern3pt
-	  \vbox\bgroup
-	      \kern3pt
-	      \hsize=\cartinner
-	      \baselineskip=\normbskip
-	      \lineskip=\normlskip
-	      \parskip=\normpskip
-	      \vskip -\parskip
-	      \comment % For explanation, see the end of \def\group.
-}
-\def\Ecartouche{%
-              \ifhmode\par\fi
-	      \kern3pt
-	  \egroup
-	  \kern3pt\vrule
-	  \hskip\rskip
-      \egroup
-      \cartbot
-  \egroup
-  \checkinserts
-}
-
-
-% This macro is called at the beginning of all the @example variants,
-% inside a group.
-\newdimen\nonfillparindent
-\def\nonfillstart{%
-  \aboveenvbreak
-  \hfuzz = 12pt % Don't be fussy
-  \sepspaces % Make spaces be word-separators rather than space tokens.
-  \let\par = \lisppar % don't ignore blank lines
-  \obeylines % each line of input is a line of output
-  \parskip = 0pt
-  % Turn off paragraph indentation but redefine \indent to emulate
-  % the normal \indent.
-  \nonfillparindent=\parindent
-  \parindent = 0pt
-  \let\indent\nonfillindent
-  %
-  \emergencystretch = 0pt % don't try to avoid overfull boxes
-  \ifx\nonarrowing\relax
-    \advance \leftskip by \lispnarrowing
-    \exdentamount=\lispnarrowing
-  \else
-    \let\nonarrowing = \relax
-  \fi
-  \let\exdent=\nofillexdent
-}
-
-\begingroup
-\obeyspaces
-% We want to swallow spaces (but not other tokens) after the fake
-% @indent in our nonfill-environments, where spaces are normally
-% active and set to @tie, resulting in them not being ignored after
-% @indent.
-\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}%
-\gdef\nonfillindentcheck{%
-\ifx\temp %
-\expandafter\nonfillindentgobble%
-\else%
-\leavevmode\nonfillindentbox%
-\fi%
-}%
-\endgroup
-\def\nonfillindentgobble#1{\nonfillindent}
-\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}}
-
-% If you want all examples etc. small: @set dispenvsize small.
-% If you want even small examples the full size: @set dispenvsize nosmall.
-% This affects the following displayed environments:
-%    @example, @display, @format, @lisp
-%
-\def\smallword{small}
-\def\nosmallword{nosmall}
-\let\SETdispenvsize\relax
-\def\setnormaldispenv{%
-  \ifx\SETdispenvsize\smallword
-    % end paragraph for sake of leading, in case document has no blank
-    % line.  This is redundant with what happens in \aboveenvbreak, but
-    % we need to do it before changing the fonts, and it's inconvenient
-    % to change the fonts afterward.
-    \ifnum \lastpenalty=10000 \else \endgraf \fi
-    \smallexamplefonts \rm
-  \fi
-}
-\def\setsmalldispenv{%
-  \ifx\SETdispenvsize\nosmallword
-  \else
-    \ifnum \lastpenalty=10000 \else \endgraf \fi
-    \smallexamplefonts \rm
-  \fi
-}
-
-% We often define two environments, @foo and @smallfoo.
-% Let's do it by one command:
-\def\makedispenv #1#2{
-  \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}
-  \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}
-  \expandafter\let\csname E#1\endcsname \afterenvbreak
-  \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
-}
-
-% Define two synonyms:
-\def\maketwodispenvs #1#2#3{
-  \makedispenv{#1}{#3}
-  \makedispenv{#2}{#3}
-}
-
-% @lisp: indented, narrowed, typewriter font; @example: same as @lisp.
-%
-% @smallexample and @smalllisp: use smaller fonts.
-% Originally contributed by Pavel@xerox.
-%
-\maketwodispenvs {lisp}{example}{%
-  \nonfillstart
-  \tt\setupmarkupstyle{example}%
-  \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
-  \gobble       % eat return
-}
-% @display/@smalldisplay: same as @lisp except keep current font.
-%
-\makedispenv {display}{%
-  \nonfillstart
-  \gobble
-}
-
-% @format/@smallformat: same as @display except don't narrow margins.
-%
-\makedispenv{format}{%
-  \let\nonarrowing = t%
-  \nonfillstart
-  \gobble
-}
-
-% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
-\envdef\flushleft{%
-  \let\nonarrowing = t%
-  \nonfillstart
-  \gobble
-}
-\let\Eflushleft = \afterenvbreak
-
-% @flushright.
-%
-\envdef\flushright{%
-  \let\nonarrowing = t%
-  \nonfillstart
-  \advance\leftskip by 0pt plus 1fill
-  \gobble
-}
-\let\Eflushright = \afterenvbreak
-
-
-% @raggedright does more-or-less normal line breaking but no right
-% justification.  From plain.tex.
-\envdef\raggedright{%
-  \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax
-}
-\let\Eraggedright\par
-
-\envdef\raggedleft{%
-  \parindent=0pt \leftskip0pt plus2em
-  \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
-  \hbadness=10000 % Last line will usually be underfull, so turn off
-                  % badness reporting.
-}
-\let\Eraggedleft\par
-
-\envdef\raggedcenter{%
-  \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em
-  \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
-  \hbadness=10000 % Last line will usually be underfull, so turn off
-                  % badness reporting.
-}
-\let\Eraggedcenter\par
-
-
-% @quotation does normal linebreaking (hence we can't use \nonfillstart)
-% and narrows the margins.  We keep \parskip nonzero in general, since
-% we're doing normal filling.  So, when using \aboveenvbreak and
-% \afterenvbreak, temporarily make \parskip 0.
-%
-\def\quotationstart{%
-  {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
-  \parindent=0pt
-  %
-  % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
-  \ifx\nonarrowing\relax
-    \advance\leftskip by \lispnarrowing
-    \advance\rightskip by \lispnarrowing
-    \exdentamount = \lispnarrowing
-  \else
-    \let\nonarrowing = \relax
-  \fi
-  \parsearg\quotationlabel
-}
-
-\envdef\quotation{%
-  \setnormaldispenv
-  \quotationstart
-}
-
-\envdef\smallquotation{%
-  \setsmalldispenv
-  \quotationstart
-}
-\let\Esmallquotation = \Equotation
-
-% We have retained a nonzero parskip for the environment, since we're
-% doing normal filling.
-%
-\def\Equotation{%
-  \par
-  \ifx\quotationauthor\undefined\else
-    % indent a bit.
-    \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
-  \fi
-  {\parskip=0pt \afterenvbreak}%
-}
-
-% If we're given an argument, typeset it in bold with a colon after.
-\def\quotationlabel#1{%
-  \def\temp{#1}%
-  \ifx\temp\empty \else
-    {\bf #1: }%
-  \fi
-}
-
-
-% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
-% If we want to allow any <char> as delimiter,
-% we need the curly braces so that makeinfo sees the @verb command, eg:
-% `@verbx...x' would look like the '@verbx' command.  --janneke@gnu.org
-%
-% [Knuth]: Donald Ervin Knuth, 1996.  The TeXbook.
-%
-% [Knuth] p.344; only we need to do the other characters Texinfo sets
-% active too.  Otherwise, they get lost as the first character on a
-% verbatim line.
-\def\dospecials{%
-  \do\ \do\\\do\{\do\}\do\$\do\&%
-  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
-  \do\<\do\>\do\|\do\@\do+\do\"%
-  % Don't do the quotes -- if we do, @set txicodequoteundirected and
-  % @set txicodequotebacktick will not have effect on @verb and
-  % @verbatim, and ?` and !` ligatures won't get disabled.
-  %\do\`\do\'%
-}
-%
-% [Knuth] p. 380
-\def\uncatcodespecials{%
-  \def\do##1{\catcode`##1=\other}\dospecials}
-%
-% Setup for the @verb command.
-%
-% Eight spaces for a tab
-\begingroup
-  \catcode`\^^I=\active
-  \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
-\endgroup
-%
-\def\setupverb{%
-  \tt  % easiest (and conventionally used) font for verbatim
-  \def\par{\leavevmode\endgraf}%
-  \setupmarkupstyle{verb}%
-  \tabeightspaces
-  % Respect line breaks,
-  % print special symbols as themselves, and
-  % make each space count
-  % must do in this order:
-  \obeylines \uncatcodespecials \sepspaces
-}
-
-% Setup for the @verbatim environment
-%
-% Real tab expansion
-\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
-%
-\def\starttabbox{\setbox0=\hbox\bgroup}
-%
-\begingroup
-  \catcode`\^^I=\active
-  \gdef\tabexpand{%
-    \catcode`\^^I=\active
-    \def^^I{\leavevmode\egroup
-      \dimen0=\wd0 % the width so far, or since the previous tab
-      \divide\dimen0 by\tabw
-      \multiply\dimen0 by\tabw % compute previous multiple of \tabw
-      \advance\dimen0 by\tabw  % advance to next multiple of \tabw
-      \wd0=\dimen0 \box0 \starttabbox
-    }%
-  }
-\endgroup
-
-% start the verbatim environment.
-\def\setupverbatim{%
-  \let\nonarrowing = t%
-  \nonfillstart
-  % Easiest (and conventionally used) font for verbatim
-  \tt
-  \def\par{\leavevmode\egroup\box0\endgraf}%
-  \tabexpand
-  \setupmarkupstyle{verbatim}%
-  % Respect line breaks,
-  % print special symbols as themselves, and
-  % make each space count
-  % must do in this order:
-  \obeylines \uncatcodespecials \sepspaces
-  \everypar{\starttabbox}%
-}
-
-% Do the @verb magic: verbatim text is quoted by unique
-% delimiter characters.  Before first delimiter expect a
-% right brace, after last delimiter expect closing brace:
-%
-%    \def\doverb'{'<char>#1<char>'}'{#1}
-%
-% [Knuth] p. 382; only eat outer {}
-\begingroup
-  \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
-  \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
-\endgroup
-%
-\def\verb{\begingroup\setupverb\doverb}
-%
-%
-% Do the @verbatim magic: define the macro \doverbatim so that
-% the (first) argument ends when '@end verbatim' is reached, ie:
-%
-%     \def\doverbatim#1@end verbatim{#1}
-%
-% For Texinfo it's a lot easier than for LaTeX,
-% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
-% we need not redefine '\', '{' and '}'.
-%
-% Inspired by LaTeX's verbatim command set [latex.ltx]
-%
-\begingroup
-  \catcode`\ =\active
-  \obeylines %
-  % ignore everything up to the first ^^M, that's the newline at the end
-  % of the @verbatim input line itself.  Otherwise we get an extra blank
-  % line in the output.
-  \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
-  % We really want {...\end verbatim} in the body of the macro, but
-  % without the active space; thus we have to use \xdef and \gobble.
-\endgroup
-%
-\envdef\verbatim{%
-    \setupverbatim\doverbatim
-}
-\let\Everbatim = \afterenvbreak
-
-
-% @verbatiminclude FILE - insert text of file in verbatim environment.
-%
-\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
-%
-\def\doverbatiminclude#1{%
-  {%
-    \makevalueexpandable
-    \setupverbatim
-    \indexnofonts       % Allow `@@' and other weird things in file names.
-    \input #1
-    \afterenvbreak
-  }%
-}
-
-% @copying ... @end copying.
-% Save the text away for @insertcopying later.
-%
-% We save the uninterpreted tokens, rather than creating a box.
-% Saving the text in a box would be much easier, but then all the
-% typesetting commands (@smallbook, font changes, etc.) have to be done
-% beforehand -- and a) we want @copying to be done first in the source
-% file; b) letting users define the frontmatter in as flexible order as
-% possible is very desirable.
-%
-\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
-\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
-%
-\def\insertcopying{%
-  \begingroup
-    \parindent = 0pt  % paragraph indentation looks wrong on title page
-    \scanexp\copyingtext
-  \endgroup
-}
-
-
-\message{defuns,}
-% @defun etc.
-
-\newskip\defbodyindent \defbodyindent=.4in
-\newskip\defargsindent \defargsindent=50pt
-\newskip\deflastargmargin \deflastargmargin=18pt
-\newcount\defunpenalty
-
-% Start the processing of @deffn:
-\def\startdefun{%
-  \ifnum\lastpenalty<10000
-    \medbreak
-    \defunpenalty=10003 % Will keep this @deffn together with the
-                        % following @def command, see below.
-  \else
-    % If there are two @def commands in a row, we'll have a \nobreak,
-    % which is there to keep the function description together with its
-    % header.  But if there's nothing but headers, we need to allow a
-    % break somewhere.  Check specifically for penalty 10002, inserted
-    % by \printdefunline, instead of 10000, since the sectioning
-    % commands also insert a nobreak penalty, and we don't want to allow
-    % a break between a section heading and a defun.
-    %
-    % As a minor refinement, we avoid "club" headers by signalling
-    % with penalty of 10003 after the very first @deffn in the
-    % sequence (see above), and penalty of 10002 after any following
-    % @def command.
-    \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi
-    %
-    % Similarly, after a section heading, do not allow a break.
-    % But do insert the glue.
-    \medskip  % preceded by discardable penalty, so not a breakpoint
-  \fi
-  %
-  \parindent=0in
-  \advance\leftskip by \defbodyindent
-  \exdentamount=\defbodyindent
-}
-
-\def\dodefunx#1{%
-  % First, check whether we are in the right environment:
-  \checkenv#1%
-  %
-  % As above, allow line break if we have multiple x headers in a row.
-  % It's not a great place, though.
-  \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi
-  %
-  % And now, it's time to reuse the body of the original defun:
-  \expandafter\gobbledefun#1%
-}
-\def\gobbledefun#1\startdefun{}
-
-% \printdefunline \deffnheader{text}
-%
-\def\printdefunline#1#2{%
-  \begingroup
-    % call \deffnheader:
-    #1#2 \endheader
-    % common ending:
-    \interlinepenalty = 10000
-    \advance\rightskip by 0pt plus 1fil
-    \endgraf
-    \nobreak\vskip -\parskip
-    \penalty\defunpenalty  % signal to \startdefun and \dodefunx
-    % Some of the @defun-type tags do not enable magic parentheses,
-    % rendering the following check redundant.  But we don't optimize.
-    \checkparencounts
-  \endgroup
-}
-
-\def\Edefun{\endgraf\medbreak}
-
-% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
-% the only thing remaining is to define \deffnheader.
-%
-\def\makedefun#1{%
-  \expandafter\let\csname E#1\endcsname = \Edefun
-  \edef\temp{\noexpand\domakedefun
-    \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
-  \temp
-}
-
-% \domakedefun \deffn \deffnx \deffnheader
-%
-% Define \deffn and \deffnx, without parameters.
-% \deffnheader has to be defined explicitly.
-%
-\def\domakedefun#1#2#3{%
-  \envdef#1{%
-    \startdefun
-    \parseargusing\activeparens{\printdefunline#3}%
-  }%
-  \def#2{\dodefunx#1}%
-  \def#3%
-}
-
-%%% Untyped functions:
-
-% @deffn category name args
-\makedefun{deffn}{\deffngeneral{}}
-
-% @deffn category class name args
-\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
-
-% \defopon {category on}class name args
-\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
-
-% \deffngeneral {subind}category name args
-%
-\def\deffngeneral#1#2 #3 #4\endheader{%
-  % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
-  \dosubind{fn}{\code{#3}}{#1}%
-  \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
-}
-
-%%% Typed functions:
-
-% @deftypefn category type name args
-\makedefun{deftypefn}{\deftypefngeneral{}}
-
-% @deftypeop category class type name args
-\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
-
-% \deftypeopon {category on}class type name args
-\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
-
-% \deftypefngeneral {subind}category type name args
-%
-\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
-  \dosubind{fn}{\code{#4}}{#1}%
-  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
-}
-
-%%% Typed variables:
-
-% @deftypevr category type var args
-\makedefun{deftypevr}{\deftypecvgeneral{}}
-
-% @deftypecv category class type var args
-\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
-
-% \deftypecvof {category of}class type var args
-\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
-
-% \deftypecvgeneral {subind}category type var args
-%
-\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
-  \dosubind{vr}{\code{#4}}{#1}%
-  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
-}
-
-%%% Untyped variables:
-
-% @defvr category var args
-\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
-
-% @defcv category class var args
-\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
-
-% \defcvof {category of}class var args
-\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
-
-%%% Type:
-% @deftp category name args
-\makedefun{deftp}#1 #2 #3\endheader{%
-  \doind{tp}{\code{#2}}%
-  \defname{#1}{}{#2}\defunargs{#3\unskip}%
-}
-
-% Remaining @defun-like shortcuts:
-\makedefun{defun}{\deffnheader{\putwordDeffunc} }
-\makedefun{defmac}{\deffnheader{\putwordDefmac} }
-\makedefun{defspec}{\deffnheader{\putwordDefspec} }
-\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
-\makedefun{defvar}{\defvrheader{\putwordDefvar} }
-\makedefun{defopt}{\defvrheader{\putwordDefopt} }
-\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
-\makedefun{defmethod}{\defopon\putwordMethodon}
-\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
-\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
-\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
-
-% \defname, which formats the name of the @def (not the args).
-% #1 is the category, such as "Function".
-% #2 is the return type, if any.
-% #3 is the function name.
-%
-% We are followed by (but not passed) the arguments, if any.
-%
-\def\defname#1#2#3{%
-  % Get the values of \leftskip and \rightskip as they were outside the @def...
-  \advance\leftskip by -\defbodyindent
-  %
-  % How we'll format the type name.  Putting it in brackets helps
-  % distinguish it from the body text that may end up on the next line
-  % just below it.
-  \def\temp{#1}%
-  \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
-  %
-  % Figure out line sizes for the paragraph shape.
-  % The first line needs space for \box0; but if \rightskip is nonzero,
-  % we need only space for the part of \box0 which exceeds it:
-  \dimen0=\hsize  \advance\dimen0 by -\wd0  \advance\dimen0 by \rightskip
-  % The continuations:
-  \dimen2=\hsize  \advance\dimen2 by -\defargsindent
-  % (plain.tex says that \dimen1 should be used only as global.)
-  \parshape 2 0in \dimen0 \defargsindent \dimen2
-  %
-  % Put the type name to the right margin.
-  \noindent
-  \hbox to 0pt{%
-    \hfil\box0 \kern-\hsize
-    % \hsize has to be shortened this way:
-    \kern\leftskip
-    % Intentionally do not respect \rightskip, since we need the space.
-  }%
-  %
-  % Allow all lines to be underfull without complaint:
-  \tolerance=10000 \hbadness=10000
-  \exdentamount=\defbodyindent
-  {%
-    % defun fonts. We use typewriter by default (used to be bold) because:
-    % . we're printing identifiers, they should be in tt in principle.
-    % . in languages with many accents, such as Czech or French, it's
-    %   common to leave accents off identifiers.  The result looks ok in
-    %   tt, but exceedingly strange in rm.
-    % . we don't want -- and --- to be treated as ligatures.
-    % . this still does not fix the ?` and !` ligatures, but so far no
-    %   one has made identifiers using them :).
-    \df \tt
-    \def\temp{#2}% return value type
-    \ifx\temp\empty\else \tclose{\temp} \fi
-    #3% output function name
-  }%
-  {\rm\enskip}% hskip 0.5 em of \tenrm
-  %
-  \boldbrax
-  % arguments will be output next, if any.
-}
-
-% Print arguments in slanted roman (not ttsl), inconsistently with using
-% tt for the name.  This is because literal text is sometimes needed in
-% the argument list (groff manual), and ttsl and tt are not very
-% distinguishable.  Prevent hyphenation at `-' chars.
-%
-\def\defunargs#1{%
-  % use sl by default (not ttsl),
-  % tt for the names.
-  \df \sl \hyphenchar\font=0
-  %
-  % On the other hand, if an argument has two dashes (for instance), we
-  % want a way to get ttsl.  Let's try @var for that.
-  \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}%
-  #1%
-  \sl\hyphenchar\font=45
-}
-
-% We want ()&[] to print specially on the defun line.
-%
-\def\activeparens{%
-  \catcode`\(=\active \catcode`\)=\active
-  \catcode`\[=\active \catcode`\]=\active
-  \catcode`\&=\active
-}
-
-% Make control sequences which act like normal parenthesis chars.
-\let\lparen = ( \let\rparen = )
-
-% Be sure that we always have a definition for `(', etc.  For example,
-% if the fn name has parens in it, \boldbrax will not be in effect yet,
-% so TeX would otherwise complain about undefined control sequence.
-{
-  \activeparens
-  \global\let(=\lparen \global\let)=\rparen
-  \global\let[=\lbrack \global\let]=\rbrack
-  \global\let& = \&
-
-  \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
-  \gdef\magicamp{\let&=\amprm}
-}
-
-\newcount\parencount
-
-% If we encounter &foo, then turn on ()-hacking afterwards
-\newif\ifampseen
-\def\amprm#1 {\ampseentrue{\bf\&#1 }}
-
-\def\parenfont{%
-  \ifampseen
-    % At the first level, print parens in roman,
-    % otherwise use the default font.
-    \ifnum \parencount=1 \rm \fi
-  \else
-    % The \sf parens (in \boldbrax) actually are a little bolder than
-    % the contained text.  This is especially needed for [ and ] .
-    \sf
-  \fi
-}
-\def\infirstlevel#1{%
-  \ifampseen
-    \ifnum\parencount=1
-      #1%
-    \fi
-  \fi
-}
-\def\bfafterword#1 {#1 \bf}
-
-\def\opnr{%
-  \global\advance\parencount by 1
-  {\parenfont(}%
-  \infirstlevel \bfafterword
-}
-\def\clnr{%
-  {\parenfont)}%
-  \infirstlevel \sl
-  \global\advance\parencount by -1
-}
-
-\newcount\brackcount
-\def\lbrb{%
-  \global\advance\brackcount by 1
-  {\bf[}%
-}
-\def\rbrb{%
-  {\bf]}%
-  \global\advance\brackcount by -1
-}
-
-\def\checkparencounts{%
-  \ifnum\parencount=0 \else \badparencount \fi
-  \ifnum\brackcount=0 \else \badbrackcount \fi
-}
-% these should not use \errmessage; the glibc manual, at least, actually
-% has such constructs (when documenting function pointers).
-\def\badparencount{%
-  \message{Warning: unbalanced parentheses in @def...}%
-  \global\parencount=0
-}
-\def\badbrackcount{%
-  \message{Warning: unbalanced square brackets in @def...}%
-  \global\brackcount=0
-}
-
-
-\message{macros,}
-% @macro.
-
-% To do this right we need a feature of e-TeX, \scantokens,
-% which we arrange to emulate with a temporary file in ordinary TeX.
-\ifx\eTeXversion\undefined
-  \newwrite\macscribble
-  \def\scantokens#1{%
-    \toks0={#1}%
-    \immediate\openout\macscribble=\jobname.tmp
-    \immediate\write\macscribble{\the\toks0}%
-    \immediate\closeout\macscribble
-    \input \jobname.tmp
-  }
-\fi
-
-\def\scanmacro#1{%
-  \begingroup
-    \newlinechar`\^^M
-    \let\xeatspaces\eatspaces
-    % Undo catcode changes of \startcontents and \doprintindex
-    % When called from @insertcopying or (short)caption, we need active
-    % backslash to get it printed correctly.  Previously, we had
-    % \catcode`\\=\other instead.  We'll see whether a problem appears
-    % with macro expansion.				--kasal, 19aug04
-    \catcode`\@=0 \catcode`\\=\active \escapechar=`\@
-    % ... and \example
-    \spaceisspace
-    %
-    % Append \endinput to make sure that TeX does not see the ending newline.
-    % I've verified that it is necessary both for e-TeX and for ordinary TeX
-    %							--kasal, 29nov03
-    \scantokens{#1\endinput}%
-  \endgroup
-}
-
-\def\scanexp#1{%
-  \edef\temp{\noexpand\scanmacro{#1}}%
-  \temp
-}
-
-\newcount\paramno   % Count of parameters
-\newtoks\macname    % Macro name
-\newif\ifrecursive  % Is it recursive?
-
-% List of all defined macros in the form
-%    \definedummyword\macro1\definedummyword\macro2...
-% Currently is also contains all @aliases; the list can be split
-% if there is a need.
-\def\macrolist{}
-
-% Add the macro to \macrolist
-\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}
-\def\addtomacrolistxxx#1{%
-     \toks0 = \expandafter{\macrolist\definedummyword#1}%
-     \xdef\macrolist{\the\toks0}%
-}
-
-% Utility routines.
-% This does \let #1 = #2, with \csnames; that is,
-%   \let \csname#1\endcsname = \csname#2\endcsname
-% (except of course we have to play expansion games).
-%
-\def\cslet#1#2{%
-  \expandafter\let
-  \csname#1\expandafter\endcsname
-  \csname#2\endcsname
-}
-
-% Trim leading and trailing spaces off a string.
-% Concepts from aro-bend problem 15 (see CTAN).
-{\catcode`\@=11
-\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
-\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
-\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
-\def\unbrace#1{#1}
-\unbrace{\gdef\trim@@@ #1 } #2@{#1}
-}
-
-% Trim a single trailing ^^M off a string.
-{\catcode`\^^M=\other \catcode`\Q=3%
-\gdef\eatcr #1{\eatcra #1Q^^MQ}%
-\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
-\gdef\eatcrb#1Q#2Q{#1}%
-}
-
-% Macro bodies are absorbed as an argument in a context where
-% all characters are catcode 10, 11 or 12, except \ which is active
-% (as in normal texinfo). It is necessary to change the definition of \.
-
-% Non-ASCII encodings make 8-bit characters active, so un-activate
-% them to avoid their expansion.  Must do this non-globally, to
-% confine the change to the current group.
-
-% It's necessary to have hard CRs when the macro is executed. This is
-% done by  making ^^M (\endlinechar) catcode 12 when reading the macro
-% body, and then making it the \newlinechar in \scanmacro.
-
-\def\scanctxt{%
-  \catcode`\"=\other
-  \catcode`\+=\other
-  \catcode`\<=\other
-  \catcode`\>=\other
-  \catcode`\@=\other
-  \catcode`\^=\other
-  \catcode`\_=\other
-  \catcode`\|=\other
-  \catcode`\~=\other
-  \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi
-}
-
-\def\scanargctxt{%
-  \scanctxt
-  \catcode`\\=\other
-  \catcode`\^^M=\other
-}
-
-\def\macrobodyctxt{%
-  \scanctxt
-  \catcode`\{=\other
-  \catcode`\}=\other
-  \catcode`\^^M=\other
-  \usembodybackslash
-}
-
-\def\macroargctxt{%
-  \scanctxt
-  \catcode`\\=\other
-}
-
-% \mbodybackslash is the definition of \ in @macro bodies.
-% It maps \foo\ => \csname macarg.foo\endcsname => #N
-% where N is the macro parameter number.
-% We define \csname macarg.\endcsname to be \realbackslash, so
-% \\ in macro replacement text gets you a backslash.
-
-{\catcode`@=0 @catcode`@\=@active
- @gdef@usembodybackslash{@let\=@mbodybackslash}
- @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
-}
-\expandafter\def\csname macarg.\endcsname{\realbackslash}
-
-\def\macro{\recursivefalse\parsearg\macroxxx}
-\def\rmacro{\recursivetrue\parsearg\macroxxx}
-
-\def\macroxxx#1{%
-  \getargs{#1}%           now \macname is the macname and \argl the arglist
-  \ifx\argl\empty       % no arguments
-     \paramno=0%
-  \else
-     \expandafter\parsemargdef \argl;%
-  \fi
-  \if1\csname ismacro.\the\macname\endcsname
-     \message{Warning: redefining \the\macname}%
-  \else
-     \expandafter\ifx\csname \the\macname\endcsname \relax
-     \else \errmessage{Macro name \the\macname\space already defined}\fi
-     \global\cslet{macsave.\the\macname}{\the\macname}%
-     \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
-     \addtomacrolist{\the\macname}%
-  \fi
-  \begingroup \macrobodyctxt
-  \ifrecursive \expandafter\parsermacbody
-  \else \expandafter\parsemacbody
-  \fi}
-
-\parseargdef\unmacro{%
-  \if1\csname ismacro.#1\endcsname
-    \global\cslet{#1}{macsave.#1}%
-    \global\expandafter\let \csname ismacro.#1\endcsname=0%
-    % Remove the macro name from \macrolist:
-    \begingroup
-      \expandafter\let\csname#1\endcsname \relax
-      \let\definedummyword\unmacrodo
-      \xdef\macrolist{\macrolist}%
-    \endgroup
-  \else
-    \errmessage{Macro #1 not defined}%
-  \fi
-}
-
-% Called by \do from \dounmacro on each macro.  The idea is to omit any
-% macro definitions that have been changed to \relax.
-%
-\def\unmacrodo#1{%
-  \ifx #1\relax
-    % remove this
-  \else
-    \noexpand\definedummyword \noexpand#1%
-  \fi
-}
-
-% This makes use of the obscure feature that if the last token of a
-% <parameter list> is #, then the preceding argument is delimited by
-% an opening brace, and that opening brace is not consumed.
-\def\getargs#1{\getargsxxx#1{}}
-\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
-\def\getmacname #1 #2\relax{\macname={#1}}
-\def\getmacargs#1{\def\argl{#1}}
-
-% Parse the optional {params} list.  Set up \paramno and \paramlist
-% so \defmacro knows what to do.  Define \macarg.blah for each blah
-% in the params list, to be ##N where N is the position in that list.
-% That gets used by \mbodybackslash (above).
-
-% We need to get `macro parameter char #' into several definitions.
-% The technique used is stolen from LaTeX:  let \hash be something
-% unexpandable, insert that wherever you need a #, and then redefine
-% it to # just before using the token list produced.
-%
-% The same technique is used to protect \eatspaces till just before
-% the macro is used.
-
-\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
-        \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
-\def\parsemargdefxxx#1,{%
-  \if#1;\let\next=\relax
-  \else \let\next=\parsemargdefxxx
-    \advance\paramno by 1%
-    \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
-        {\xeatspaces{\hash\the\paramno}}%
-    \edef\paramlist{\paramlist\hash\the\paramno,}%
-  \fi\next}
-
-% These two commands read recursive and nonrecursive macro bodies.
-% (They're different since rec and nonrec macros end differently.)
-
-\long\def\parsemacbody#1@end macro%
-{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
-\long\def\parsermacbody#1@end rmacro%
-{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
-
-% This defines the macro itself. There are six cases: recursive and
-% nonrecursive macros of zero, one, and many arguments.
-% Much magic with \expandafter here.
-% \xdef is used so that macro definitions will survive the file
-% they're defined in; @include reads the file inside a group.
-\def\defmacro{%
-  \let\hash=##% convert placeholders to macro parameter chars
-  \ifrecursive
-    \ifcase\paramno
-    % 0
-      \expandafter\xdef\csname\the\macname\endcsname{%
-        \noexpand\scanmacro{\temp}}%
-    \or % 1
-      \expandafter\xdef\csname\the\macname\endcsname{%
-         \bgroup\noexpand\macroargctxt
-         \noexpand\braceorline
-         \expandafter\noexpand\csname\the\macname xxx\endcsname}%
-      \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
-         \egroup\noexpand\scanmacro{\temp}}%
-    \else % many
-      \expandafter\xdef\csname\the\macname\endcsname{%
-         \bgroup\noexpand\macroargctxt
-         \noexpand\csname\the\macname xx\endcsname}%
-      \expandafter\xdef\csname\the\macname xx\endcsname##1{%
-          \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
-      \expandafter\expandafter
-      \expandafter\xdef
-      \expandafter\expandafter
-        \csname\the\macname xxx\endcsname
-          \paramlist{\egroup\noexpand\scanmacro{\temp}}%
-    \fi
-  \else
-    \ifcase\paramno
-    % 0
-      \expandafter\xdef\csname\the\macname\endcsname{%
-        \noexpand\norecurse{\the\macname}%
-        \noexpand\scanmacro{\temp}\egroup}%
-    \or % 1
-      \expandafter\xdef\csname\the\macname\endcsname{%
-         \bgroup\noexpand\macroargctxt
-         \noexpand\braceorline
-         \expandafter\noexpand\csname\the\macname xxx\endcsname}%
-      \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
-        \egroup
-        \noexpand\norecurse{\the\macname}%
-        \noexpand\scanmacro{\temp}\egroup}%
-    \else % many
-      \expandafter\xdef\csname\the\macname\endcsname{%
-         \bgroup\noexpand\macroargctxt
-         \expandafter\noexpand\csname\the\macname xx\endcsname}%
-      \expandafter\xdef\csname\the\macname xx\endcsname##1{%
-          \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
-      \expandafter\expandafter
-      \expandafter\xdef
-      \expandafter\expandafter
-      \csname\the\macname xxx\endcsname
-      \paramlist{%
-          \egroup
-          \noexpand\norecurse{\the\macname}%
-          \noexpand\scanmacro{\temp}\egroup}%
-    \fi
-  \fi}
-
-\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
-
-% \braceorline decides whether the next nonwhitespace character is a
-% {.  If so it reads up to the closing }, if not, it reads the whole
-% line.  Whatever was read is then fed to the next control sequence
-% as an argument (by \parsebrace or \parsearg)
-\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}
-\def\braceorlinexxx{%
-  \ifx\nchar\bgroup\else
-    \expandafter\parsearg
-  \fi \macnamexxx}
-
-
-% @alias.
-% We need some trickery to remove the optional spaces around the equal
-% sign.  Just make them active and then expand them all to nothing.
-\def\alias{\parseargusing\obeyspaces\aliasxxx}
-\def\aliasxxx #1{\aliasyyy#1\relax}
-\def\aliasyyy #1=#2\relax{%
-  {%
-    \expandafter\let\obeyedspace=\empty
-    \addtomacrolist{#1}%
-    \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
-  }%
-  \next
-}
-
-
-\message{cross references,}
-
-\newwrite\auxfile
-\newif\ifhavexrefs    % True if xref values are known.
-\newif\ifwarnedxrefs  % True if we warned once that they aren't known.
-
-% @inforef is relatively simple.
-\def\inforef #1{\inforefzzz #1,,,,**}
-\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
-  node \samp{\ignorespaces#1{}}}
-
-% @node's only job in TeX is to define \lastnode, which is used in
-% cross-references.  The @node line might or might not have commas, and
-% might or might not have spaces before the first comma, like:
-% @node foo , bar , ...
-% We don't want such trailing spaces in the node name.
-%
-\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
-%
-% also remove a trailing comma, in case of something like this:
-% @node Help-Cross,  ,  , Cross-refs
-\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
-\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
-
-\let\nwnode=\node
-\let\lastnode=\empty
-
-% Write a cross-reference definition for the current node.  #1 is the
-% type (Ynumbered, Yappendix, Ynothing).
-%
-\def\donoderef#1{%
-  \ifx\lastnode\empty\else
-    \setref{\lastnode}{#1}%
-    \global\let\lastnode=\empty
-  \fi
-}
-
-% @anchor{NAME} -- define xref target at arbitrary point.
-%
-\newcount\savesfregister
-%
-\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
-\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
-\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
-
-% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
-% anchor), which consists of three parts:
-% 1) NAME-title - the current sectioning name taken from \lastsection,
-%                 or the anchor name.
-% 2) NAME-snt   - section number and type, passed as the SNT arg, or
-%                 empty for anchors.
-% 3) NAME-pg    - the page number.
-%
-% This is called from \donoderef, \anchor, and \dofloat.  In the case of
-% floats, there is an additional part, which is not written here:
-% 4) NAME-lof   - the text as it should appear in a @listoffloats.
-%
-\def\setref#1#2{%
-  \pdfmkdest{#1}%
-  \iflinks
-    {%
-      \atdummies  % preserve commands, but don't expand them
-      \edef\writexrdef##1##2{%
-	\write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
-	  ##1}{##2}}% these are parameters of \writexrdef
-      }%
-      \toks0 = \expandafter{\lastsection}%
-      \immediate \writexrdef{title}{\the\toks0 }%
-      \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
-      \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, during \shipout
-    }%
-  \fi
-}
-
-% @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
-% the node name, #2 the name of the Info cross-reference, #3 the printed
-% node name, #4 the name of the Info file, #5 the name of the printed
-% manual.  All but the node name can be omitted.
-%
-\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
-\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
-\def\ref#1{\xrefX[#1,,,,,,,]}
-\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
-  \unsepspaces
-  \def\printedmanual{\ignorespaces #5}%
-  \def\printedrefname{\ignorespaces #3}%
-  \setbox1=\hbox{\printedmanual\unskip}%
-  \setbox0=\hbox{\printedrefname\unskip}%
-  \ifdim \wd0 = 0pt
-    % No printed node name was explicitly given.
-    \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
-      % Use the node name inside the square brackets.
-      \def\printedrefname{\ignorespaces #1}%
-    \else
-      % Use the actual chapter/section title appear inside
-      % the square brackets.  Use the real section title if we have it.
-      \ifdim \wd1 > 0pt
-        % It is in another manual, so we don't have it.
-        \def\printedrefname{\ignorespaces #1}%
-      \else
-        \ifhavexrefs
-          % We know the real title if we have the xref values.
-          \def\printedrefname{\refx{#1-title}{}}%
-        \else
-          % Otherwise just copy the Info node name.
-          \def\printedrefname{\ignorespaces #1}%
-        \fi%
-      \fi
-    \fi
-  \fi
-  %
-  % Make link in pdf output.
-  \ifpdf
-    {\indexnofonts
-     \turnoffactive
-     % This expands tokens, so do it after making catcode changes, so _
-     % etc. don't get their TeX definitions.
-     \getfilename{#4}%
-     %
-     % See comments at \activebackslashdouble.
-     {\activebackslashdouble \xdef\pdfxrefdest{#1}%
-      \backslashparens\pdfxrefdest}%
-     %
-     \leavevmode
-     \startlink attr{/Border [0 0 0]}%
-     \ifnum\filenamelength>0
-       goto file{\the\filename.pdf} name{\pdfxrefdest}%
-     \else
-       goto name{\pdfmkpgn{\pdfxrefdest}}%
-     \fi
-    }%
-    \setcolor{\linkcolor}%
-  \fi
-  %
-  % Float references are printed completely differently: "Figure 1.2"
-  % instead of "[somenode], p.3".  We distinguish them by the
-  % LABEL-title being set to a magic string.
-  {%
-    % Have to otherify everything special to allow the \csname to
-    % include an _ in the xref name, etc.
-    \indexnofonts
-    \turnoffactive
-    \expandafter\global\expandafter\let\expandafter\Xthisreftitle
-      \csname XR#1-title\endcsname
-  }%
-  \iffloat\Xthisreftitle
-    % If the user specified the print name (third arg) to the ref,
-    % print it instead of our usual "Figure 1.2".
-    \ifdim\wd0 = 0pt
-      \refx{#1-snt}{}%
-    \else
-      \printedrefname
-    \fi
-    %
-    % if the user also gave the printed manual name (fifth arg), append
-    % "in MANUALNAME".
-    \ifdim \wd1 > 0pt
-      \space \putwordin{} \cite{\printedmanual}%
-    \fi
-  \else
-    % node/anchor (non-float) references.
-    %
-    % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
-    % insert empty discretionaries after hyphens, which means that it will
-    % not find a line break at a hyphen in a node names.  Since some manuals
-    % are best written with fairly long node names, containing hyphens, this
-    % is a loss.  Therefore, we give the text of the node name again, so it
-    % is as if TeX is seeing it for the first time.
-    \ifdim \wd1 > 0pt
-      \putwordSection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%
-    \else
-      % _ (for example) has to be the character _ for the purposes of the
-      % control sequence corresponding to the node, but it has to expand
-      % into the usual \leavevmode...\vrule stuff for purposes of
-      % printing. So we \turnoffactive for the \refx-snt, back on for the
-      % printing, back off for the \refx-pg.
-      {\turnoffactive
-       % Only output a following space if the -snt ref is nonempty; for
-       % @unnumbered and @anchor, it won't be.
-       \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
-       \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
-      }%
-      % output the `[mynode]' via a macro so it can be overridden.
-      \xrefprintnodename\printedrefname
-      %
-      % But we always want a comma and a space:
-      ,\space
-      %
-      % output the `page 3'.
-      \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
-    \fi
-  \fi
-  \endlink
-\endgroup}
-
-% This macro is called from \xrefX for the `[nodename]' part of xref
-% output.  It's a separate macro only so it can be changed more easily,
-% since square brackets don't work well in some documents.  Particularly
-% one that Bob is working on :).
-%
-\def\xrefprintnodename#1{[#1]}
-
-% Things referred to by \setref.
-%
-\def\Ynothing{}
-\def\Yomitfromtoc{}
-\def\Ynumbered{%
-  \ifnum\secno=0
-    \putwordChapter@tie \the\chapno
-  \else \ifnum\subsecno=0
-    \putwordSection@tie \the\chapno.\the\secno
-  \else \ifnum\subsubsecno=0
-    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
-  \else
-    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
-  \fi\fi\fi
-}
-\def\Yappendix{%
-  \ifnum\secno=0
-     \putwordAppendix@tie @char\the\appendixno{}%
-  \else \ifnum\subsecno=0
-     \putwordSection@tie @char\the\appendixno.\the\secno
-  \else \ifnum\subsubsecno=0
-    \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
-  \else
-    \putwordSection@tie
-      @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
-  \fi\fi\fi
-}
-
-% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
-% If its value is nonempty, SUFFIX is output afterward.
-%
-\def\refx#1#2{%
-  {%
-    \indexnofonts
-    \otherbackslash
-    \expandafter\global\expandafter\let\expandafter\thisrefX
-      \csname XR#1\endcsname
-  }%
-  \ifx\thisrefX\relax
-    % If not defined, say something at least.
-    \angleleft un\-de\-fined\angleright
-    \iflinks
-      \ifhavexrefs
-        \message{\linenumber Undefined cross reference `#1'.}%
-      \else
-        \ifwarnedxrefs\else
-          \global\warnedxrefstrue
-          \message{Cross reference values unknown; you must run TeX again.}%
-        \fi
-      \fi
-    \fi
-  \else
-    % It's defined, so just use it.
-    \thisrefX
-  \fi
-  #2% Output the suffix in any case.
-}
-
-% This is the macro invoked by entries in the aux file.  Usually it's
-% just a \def (we prepend XR to the control sequence name to avoid
-% collisions).  But if this is a float type, we have more work to do.
-%
-\def\xrdef#1#2{%
-  {% The node name might contain 8-bit characters, which in our current
-   % implementation are changed to commands like @'e.  Don't let these
-   % mess up the control sequence name.
-    \indexnofonts
-    \turnoffactive
-    \xdef\safexrefname{#1}%
-  }%
-  %
-  \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref
-  %
-  % Was that xref control sequence that we just defined for a float?
-  \expandafter\iffloat\csname XR\safexrefname\endcsname
-    % it was a float, and we have the (safe) float type in \iffloattype.
-    \expandafter\let\expandafter\floatlist
-      \csname floatlist\iffloattype\endcsname
-    %
-    % Is this the first time we've seen this float type?
-    \expandafter\ifx\floatlist\relax
-      \toks0 = {\do}% yes, so just \do
-    \else
-      % had it before, so preserve previous elements in list.
-      \toks0 = \expandafter{\floatlist\do}%
-    \fi
-    %
-    % Remember this xref in the control sequence \floatlistFLOATTYPE,
-    % for later use in \listoffloats.
-    \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0
-      {\safexrefname}}%
-  \fi
-}
-
-% Read the last existing aux file, if any.  No error if none exists.
-%
-\def\tryauxfile{%
-  \openin 1 \jobname.aux
-  \ifeof 1 \else
-    \readdatafile{aux}%
-    \global\havexrefstrue
-  \fi
-  \closein 1
-}
-
-\def\setupdatafile{%
-  \catcode`\^^@=\other
-  \catcode`\^^A=\other
-  \catcode`\^^B=\other
-  \catcode`\^^C=\other
-  \catcode`\^^D=\other
-  \catcode`\^^E=\other
-  \catcode`\^^F=\other
-  \catcode`\^^G=\other
-  \catcode`\^^H=\other
-  \catcode`\^^K=\other
-  \catcode`\^^L=\other
-  \catcode`\^^N=\other
-  \catcode`\^^P=\other
-  \catcode`\^^Q=\other
-  \catcode`\^^R=\other
-  \catcode`\^^S=\other
-  \catcode`\^^T=\other
-  \catcode`\^^U=\other
-  \catcode`\^^V=\other
-  \catcode`\^^W=\other
-  \catcode`\^^X=\other
-  \catcode`\^^Z=\other
-  \catcode`\^^[=\other
-  \catcode`\^^\=\other
-  \catcode`\^^]=\other
-  \catcode`\^^^=\other
-  \catcode`\^^_=\other
-  % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
-  % in xref tags, i.e., node names.  But since ^^e4 notation isn't
-  % supported in the main text, it doesn't seem desirable.  Furthermore,
-  % that is not enough: for node names that actually contain a ^
-  % character, we would end up writing a line like this: 'xrdef {'hat
-  % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
-  % argument, and \hat is not an expandable control sequence.  It could
-  % all be worked out, but why?  Either we support ^^ or we don't.
-  %
-  % The other change necessary for this was to define \auxhat:
-  % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
-  % and then to call \auxhat in \setq.
-  %
-  \catcode`\^=\other
-  %
-  % Special characters.  Should be turned off anyway, but...
-  \catcode`\~=\other
-  \catcode`\[=\other
-  \catcode`\]=\other
-  \catcode`\"=\other
-  \catcode`\_=\other
-  \catcode`\|=\other
-  \catcode`\<=\other
-  \catcode`\>=\other
-  \catcode`\$=\other
-  \catcode`\#=\other
-  \catcode`\&=\other
-  \catcode`\%=\other
-  \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
-  %
-  % This is to support \ in node names and titles, since the \
-  % characters end up in a \csname.  It's easier than
-  % leaving it active and making its active definition an actual \
-  % character.  What I don't understand is why it works in the *value*
-  % of the xrdef.  Seems like it should be a catcode12 \, and that
-  % should not typeset properly.  But it works, so I'm moving on for
-  % now.  --karl, 15jan04.
-  \catcode`\\=\other
-  %
-  % Make the characters 128-255 be printing characters.
-  {%
-    \count1=128
-    \def\loop{%
-      \catcode\count1=\other
-      \advance\count1 by 1
-      \ifnum \count1<256 \loop \fi
-    }%
-  }%
-  %
-  % @ is our escape character in .aux files, and we need braces.
-  \catcode`\{=1
-  \catcode`\}=2
-  \catcode`\@=0
-}
-
-\def\readdatafile#1{%
-\begingroup
-  \setupdatafile
-  \input\jobname.#1
-\endgroup}
-
-
-\message{insertions,}
-% including footnotes.
-
-\newcount \footnoteno
-
-% The trailing space in the following definition for supereject is
-% vital for proper filling; pages come out unaligned when you do a
-% pagealignmacro call if that space before the closing brace is
-% removed. (Generally, numeric constants should always be followed by a
-% space to prevent strange expansion errors.)
-\def\supereject{\par\penalty -20000\footnoteno =0 }
-
-% @footnotestyle is meaningful for info output only.
-\let\footnotestyle=\comment
-
-{\catcode `\@=11
-%
-% Auto-number footnotes.  Otherwise like plain.
-\gdef\footnote{%
-  \let\indent=\ptexindent
-  \let\noindent=\ptexnoindent
-  \global\advance\footnoteno by \@ne
-  \edef\thisfootno{$^{\the\footnoteno}$}%
-  %
-  % In case the footnote comes at the end of a sentence, preserve the
-  % extra spacing after we do the footnote number.
-  \let\@sf\empty
-  \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
-  %
-  % Remove inadvertent blank space before typesetting the footnote number.
-  \unskip
-  \thisfootno\@sf
-  \dofootnote
-}%
-
-% Don't bother with the trickery in plain.tex to not require the
-% footnote text as a parameter.  Our footnotes don't need to be so general.
-%
-% Oh yes, they do; otherwise, @ifset (and anything else that uses
-% \parseargline) fails inside footnotes because the tokens are fixed when
-% the footnote is read.  --karl, 16nov96.
-%
-\gdef\dofootnote{%
-  \insert\footins\bgroup
-  % We want to typeset this text as a normal paragraph, even if the
-  % footnote reference occurs in (for example) a display environment.
-  % So reset some parameters.
-  \hsize=\pagewidth
-  \interlinepenalty\interfootnotelinepenalty
-  \splittopskip\ht\strutbox % top baseline for broken footnotes
-  \splitmaxdepth\dp\strutbox
-  \floatingpenalty\@MM
-  \leftskip\z@skip
-  \rightskip\z@skip
-  \spaceskip\z@skip
-  \xspaceskip\z@skip
-  \parindent\defaultparindent
-  %
-  \smallfonts \rm
-  %
-  % Because we use hanging indentation in footnotes, a @noindent appears
-  % to exdent this text, so make it be a no-op.  makeinfo does not use
-  % hanging indentation so @noindent can still be needed within footnote
-  % text after an @example or the like (not that this is good style).
-  \let\noindent = \relax
-  %
-  % Hang the footnote text off the number.  Use \everypar in case the
-  % footnote extends for more than one paragraph.
-  \everypar = {\hang}%
-  \textindent{\thisfootno}%
-  %
-  % Don't crash into the line above the footnote text.  Since this
-  % expands into a box, it must come within the paragraph, lest it
-  % provide a place where TeX can split the footnote.
-  \footstrut
-  \futurelet\next\fo@t
-}
-}%end \catcode `\@=11
-
-% In case a @footnote appears in a vbox, save the footnote text and create
-% the real \insert just after the vbox finished.  Otherwise, the insertion
-% would be lost.
-% Similarly, if a @footnote appears inside an alignment, save the footnote
-% text to a box and make the \insert when a row of the table is finished.
-% And the same can be done for other insert classes.  --kasal, 16nov03.
-
-% Replace the \insert primitive by a cheating macro.
-% Deeper inside, just make sure that the saved insertions are not spilled
-% out prematurely.
-%
-\def\startsavinginserts{%
-  \ifx \insert\ptexinsert
-    \let\insert\saveinsert
-  \else
-    \let\checkinserts\relax
-  \fi
-}
-
-% This \insert replacement works for both \insert\footins{foo} and
-% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
-%
-\def\saveinsert#1{%
-  \edef\next{\noexpand\savetobox \makeSAVEname#1}%
-  \afterassignment\next
-  % swallow the left brace
-  \let\temp =
-}
-\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
-\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
-
-\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
-
-\def\placesaveins#1{%
-  \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
-    {\box#1}%
-}
-
-% eat @SAVE -- beware, all of them have catcode \other:
-{
-  \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials  %  ;-)
-  \gdef\gobblesave @SAVE{}
-}
-
-% initialization:
-\def\newsaveins #1{%
-  \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
-  \next
-}
-\def\newsaveinsX #1{%
-  \csname newbox\endcsname #1%
-  \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
-    \checksaveins #1}%
-}
-
-% initialize:
-\let\checkinserts\empty
-\newsaveins\footins
-\newsaveins\margin
-
-
-% @image.  We use the macros from epsf.tex to support this.
-% If epsf.tex is not installed and @image is used, we complain.
-%
-% Check for and read epsf.tex up front.  If we read it only at @image
-% time, we might be inside a group, and then its definitions would get
-% undone and the next image would fail.
-\openin 1 = epsf.tex
-\ifeof 1 \else
-  % Do not bother showing banner with epsf.tex v2.7k (available in
-  % doc/epsf.tex and on ctan).
-  \def\epsfannounce{\toks0 = }%
-  \input epsf.tex
-\fi
-\closein 1
-%
-% We will only complain once about lack of epsf.tex.
-\newif\ifwarnednoepsf
-\newhelp\noepsfhelp{epsf.tex must be installed for images to
-  work.  It is also included in the Texinfo distribution, or you can get
-  it from ftp://tug.org/tex/epsf.tex.}
-%
-\def\image#1{%
-  \ifx\epsfbox\undefined
-    \ifwarnednoepsf \else
-      \errhelp = \noepsfhelp
-      \errmessage{epsf.tex not found, images will be ignored}%
-      \global\warnednoepsftrue
-    \fi
-  \else
-    \imagexxx #1,,,,,\finish
-  \fi
-}
-%
-% Arguments to @image:
-% #1 is (mandatory) image filename; we tack on .eps extension.
-% #2 is (optional) width, #3 is (optional) height.
-% #4 is (ignored optional) html alt text.
-% #5 is (ignored optional) extension.
-% #6 is just the usual extra ignored arg for parsing this stuff.
-\newif\ifimagevmode
-\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
-  \catcode`\^^M = 5     % in case we're inside an example
-  \normalturnoffactive  % allow _ et al. in names
-  % If the image is by itself, center it.
-  \ifvmode
-    \imagevmodetrue
-    \nobreak\medskip
-    % Usually we'll have text after the image which will insert
-    % \parskip glue, so insert it here too to equalize the space
-    % above and below.
-    \nobreak\vskip\parskip
-    \nobreak
-  \fi
-  %
-  % Leave vertical mode so that indentation from an enclosing
-  % environment such as @quotation is respected.  On the other hand, if
-  % it's at the top level, we don't want the normal paragraph indentation.
-  \noindent
-  %
-  % Output the image.
-  \ifpdf
-    \dopdfimage{#1}{#2}{#3}%
-  \else
-    % \epsfbox itself resets \epsf?size at each figure.
-    \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
-    \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
-    \epsfbox{#1.eps}%
-  \fi
-  %
-  \ifimagevmode \medskip \fi  % space after the standalone image
-\endgroup}
-
-
-% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
-% etc.  We don't actually implement floating yet, we always include the
-% float "here".  But it seemed the best name for the future.
-%
-\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
-
-% There may be a space before second and/or third parameter; delete it.
-\def\eatcommaspace#1, {#1,}
-
-% #1 is the optional FLOATTYPE, the text label for this float, typically
-% "Figure", "Table", "Example", etc.  Can't contain commas.  If omitted,
-% this float will not be numbered and cannot be referred to.
-%
-% #2 is the optional xref label.  Also must be present for the float to
-% be referable.
-%
-% #3 is the optional positioning argument; for now, it is ignored.  It
-% will somehow specify the positions allowed to float to (here, top, bottom).
-%
-% We keep a separate counter for each FLOATTYPE, which we reset at each
-% chapter-level command.
-\let\resetallfloatnos=\empty
-%
-\def\dofloat#1,#2,#3,#4\finish{%
-  \let\thiscaption=\empty
-  \let\thisshortcaption=\empty
-  %
-  % don't lose footnotes inside @float.
-  %
-  % BEWARE: when the floats start float, we have to issue warning whenever an
-  % insert appears inside a float which could possibly float. --kasal, 26may04
-  %
-  \startsavinginserts
-  %
-  % We can't be used inside a paragraph.
-  \par
-  %
-  \vtop\bgroup
-    \def\floattype{#1}%
-    \def\floatlabel{#2}%
-    \def\floatloc{#3}% we do nothing with this yet.
-    %
-    \ifx\floattype\empty
-      \let\safefloattype=\empty
-    \else
-      {%
-        % the floattype might have accents or other special characters,
-        % but we need to use it in a control sequence name.
-        \indexnofonts
-        \turnoffactive
-        \xdef\safefloattype{\floattype}%
-      }%
-    \fi
-    %
-    % If label is given but no type, we handle that as the empty type.
-    \ifx\floatlabel\empty \else
-      % We want each FLOATTYPE to be numbered separately (Figure 1,
-      % Table 1, Figure 2, ...).  (And if no label, no number.)
-      %
-      \expandafter\getfloatno\csname\safefloattype floatno\endcsname
-      \global\advance\floatno by 1
-      %
-      {%
-        % This magic value for \lastsection is output by \setref as the
-        % XREFLABEL-title value.  \xrefX uses it to distinguish float
-        % labels (which have a completely different output format) from
-        % node and anchor labels.  And \xrdef uses it to construct the
-        % lists of floats.
-        %
-        \edef\lastsection{\floatmagic=\safefloattype}%
-        \setref{\floatlabel}{Yfloat}%
-      }%
-    \fi
-    %
-    % start with \parskip glue, I guess.
-    \vskip\parskip
-    %
-    % Don't suppress indentation if a float happens to start a section.
-    \restorefirstparagraphindent
-}
-
-% we have these possibilities:
-% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
-% @float Foo,lbl & no caption:    Foo 1.1
-% @float Foo & @caption{Cap}:     Foo: Cap
-% @float Foo & no caption:        Foo
-% @float ,lbl & Caption{Cap}:     1.1: Cap
-% @float ,lbl & no caption:       1.1
-% @float & @caption{Cap}:         Cap
-% @float & no caption:
-%
-\def\Efloat{%
-    \let\floatident = \empty
-    %
-    % In all cases, if we have a float type, it comes first.
-    \ifx\floattype\empty \else \def\floatident{\floattype}\fi
-    %
-    % If we have an xref label, the number comes next.
-    \ifx\floatlabel\empty \else
-      \ifx\floattype\empty \else % if also had float type, need tie first.
-        \appendtomacro\floatident{\tie}%
-      \fi
-      % the number.
-      \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
-    \fi
-    %
-    % Start the printed caption with what we've constructed in
-    % \floatident, but keep it separate; we need \floatident again.
-    \let\captionline = \floatident
-    %
-    \ifx\thiscaption\empty \else
-      \ifx\floatident\empty \else
-	\appendtomacro\captionline{: }% had ident, so need a colon between
-      \fi
-      %
-      % caption text.
-      \appendtomacro\captionline{\scanexp\thiscaption}%
-    \fi
-    %
-    % If we have anything to print, print it, with space before.
-    % Eventually this needs to become an \insert.
-    \ifx\captionline\empty \else
-      \vskip.5\parskip
-      \captionline
-      %
-      % Space below caption.
-      \vskip\parskip
-    \fi
-    %
-    % If have an xref label, write the list of floats info.  Do this
-    % after the caption, to avoid chance of it being a breakpoint.
-    \ifx\floatlabel\empty \else
-      % Write the text that goes in the lof to the aux file as
-      % \floatlabel-lof.  Besides \floatident, we include the short
-      % caption if specified, else the full caption if specified, else nothing.
-      {%
-        \atdummies
-        %
-        % since we read the caption text in the macro world, where ^^M
-        % is turned into a normal character, we have to scan it back, so
-        % we don't write the literal three characters "^^M" into the aux file.
-	\scanexp{%
-	  \xdef\noexpand\gtemp{%
-	    \ifx\thisshortcaption\empty
-	      \thiscaption
-	    \else
-	      \thisshortcaption
-	    \fi
-	  }%
-	}%
-        \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
-	  \ifx\gtemp\empty \else : \gtemp \fi}}%
-      }%
-    \fi
-  \egroup  % end of \vtop
-  %
-  % place the captured inserts
-  %
-  % BEWARE: when the floats start floating, we have to issue warning
-  % whenever an insert appears inside a float which could possibly
-  % float. --kasal, 26may04
-  %
-  \checkinserts
-}
-
-% Append the tokens #2 to the definition of macro #1, not expanding either.
-%
-\def\appendtomacro#1#2{%
-  \expandafter\def\expandafter#1\expandafter{#1#2}%
-}
-
-% @caption, @shortcaption
-%
-\def\caption{\docaption\thiscaption}
-\def\shortcaption{\docaption\thisshortcaption}
-\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
-\def\defcaption#1#2{\egroup \def#1{#2}}
-
-% The parameter is the control sequence identifying the counter we are
-% going to use.  Create it if it doesn't exist and assign it to \floatno.
-\def\getfloatno#1{%
-  \ifx#1\relax
-      % Haven't seen this figure type before.
-      \csname newcount\endcsname #1%
-      %
-      % Remember to reset this floatno at the next chap.
-      \expandafter\gdef\expandafter\resetallfloatnos
-        \expandafter{\resetallfloatnos #1=0 }%
-  \fi
-  \let\floatno#1%
-}
-
-% \setref calls this to get the XREFLABEL-snt value.  We want an @xref
-% to the FLOATLABEL to expand to "Figure 3.1".  We call \setref when we
-% first read the @float command.
-%
-\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
-
-% Magic string used for the XREFLABEL-title value, so \xrefX can
-% distinguish floats from other xref types.
-\def\floatmagic{!!float!!}
-
-% #1 is the control sequence we are passed; we expand into a conditional
-% which is true if #1 represents a float ref.  That is, the magic
-% \lastsection value which we \setref above.
-%
-\def\iffloat#1{\expandafter\doiffloat#1==\finish}
-%
-% #1 is (maybe) the \floatmagic string.  If so, #2 will be the
-% (safe) float type for this float.  We set \iffloattype to #2.
-%
-\def\doiffloat#1=#2=#3\finish{%
-  \def\temp{#1}%
-  \def\iffloattype{#2}%
-  \ifx\temp\floatmagic
-}
-
-% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
-%
-\parseargdef\listoffloats{%
-  \def\floattype{#1}% floattype
-  {%
-    % the floattype might have accents or other special characters,
-    % but we need to use it in a control sequence name.
-    \indexnofonts
-    \turnoffactive
-    \xdef\safefloattype{\floattype}%
-  }%
-  %
-  % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
-  \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
-    \ifhavexrefs
-      % if the user said @listoffloats foo but never @float foo.
-      \message{\linenumber No `\safefloattype' floats to list.}%
-    \fi
-  \else
-    \begingroup
-      \leftskip=\tocindent  % indent these entries like a toc
-      \let\do=\listoffloatsdo
-      \csname floatlist\safefloattype\endcsname
-    \endgroup
-  \fi
-}
-
-% This is called on each entry in a list of floats.  We're passed the
-% xref label, in the form LABEL-title, which is how we save it in the
-% aux file.  We strip off the -title and look up \XRLABEL-lof, which
-% has the text we're supposed to typeset here.
-%
-% Figures without xref labels will not be included in the list (since
-% they won't appear in the aux file).
-%
-\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
-\def\listoffloatsdoentry#1-title\finish{{%
-  % Can't fully expand XR#1-lof because it can contain anything.  Just
-  % pass the control sequence.  On the other hand, XR#1-pg is just the
-  % page number, and we want to fully expand that so we can get a link
-  % in pdf output.
-  \toksA = \expandafter{\csname XR#1-lof\endcsname}%
-  %
-  % use the same \entry macro we use to generate the TOC and index.
-  \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
-  \writeentry
-}}
-
-
-\message{localization,}
-
-% For single-language documents, @documentlanguage is usually given very
-% early, just after @documentencoding.  Single argument is the language
-% (de) or locale (de_DE) abbreviation.
-%
-{
-  \catcode`\_ = \active
-  \globaldefs=1
-\parseargdef\documentlanguage{\begingroup
-  \let_=\normalunderscore  % normal _ character for filenames
-  \tex % read txi-??.tex file in plain TeX.
-    % Read the file by the name they passed if it exists.
-    \openin 1 txi-#1.tex
-    \ifeof 1
-      \documentlanguagetrywithoutunderscore{#1_\finish}%
-    \else
-      \globaldefs = 1  % everything in the txi-LL files needs to persist
-      \input txi-#1.tex
-    \fi
-    \closein 1
-  \endgroup % end raw TeX
-\endgroup}
-%
-% If they passed de_DE, and txi-de_DE.tex doesn't exist,
-% try txi-de.tex.
-%
-\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{%
-  \openin 1 txi-#1.tex
-  \ifeof 1
-    \errhelp = \nolanghelp
-    \errmessage{Cannot read language file txi-#1.tex}%
-  \else
-    \globaldefs = 1  % everything in the txi-LL files needs to persist
-    \input txi-#1.tex
-  \fi
-  \closein 1
-}
-}% end of special _ catcode
-%
-\newhelp\nolanghelp{The given language definition file cannot be found or
-is empty.  Maybe you need to install it?  Putting it in the current
-directory should work if nowhere else does.}
-
-% This macro is called from txi-??.tex files; the first argument is the
-% \language name to set (without the "\lang@" prefix), the second and
-% third args are \{left,right}hyphenmin.
-%
-% The language names to pass are determined when the format is built.
-% See the etex.log file created at that time, e.g.,
-% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log.
-%
-% With TeX Live 2008, etex now includes hyphenation patterns for all
-% available languages.  This means we can support hyphenation in
-% Texinfo, at least to some extent.  (This still doesn't solve the
-% accented characters problem.)
-%
-\catcode`@=11
-\def\txisetlanguage#1#2#3{%
-  % do not set the language if the name is undefined in the current TeX.
-  \expandafter\ifx\csname lang@#1\endcsname \relax
-    \message{no patterns for #1}%
-  \else
-    \global\language = \csname lang@#1\endcsname
-  \fi
-  % but there is no harm in adjusting the hyphenmin values regardless.
-  \global\lefthyphenmin = #2\relax
-  \global\righthyphenmin = #3\relax
-}
-
-% Helpers for encodings.
-% Set the catcode of characters 128 through 255 to the specified number.
-%
-\def\setnonasciicharscatcode#1{%
-   \count255=128
-   \loop\ifnum\count255<256
-      \global\catcode\count255=#1\relax
-      \advance\count255 by 1
-   \repeat
-}
-
-\def\setnonasciicharscatcodenonglobal#1{%
-   \count255=128
-   \loop\ifnum\count255<256
-      \catcode\count255=#1\relax
-      \advance\count255 by 1
-   \repeat
-}
-
-% @documentencoding sets the definition of non-ASCII characters
-% according to the specified encoding.
-%
-\parseargdef\documentencoding{%
-  % Encoding being declared for the document.
-  \def\declaredencoding{\csname #1.enc\endcsname}%
-  %
-  % Supported encodings: names converted to tokens in order to be able
-  % to compare them with \ifx.
-  \def\ascii{\csname US-ASCII.enc\endcsname}%
-  \def\latnine{\csname ISO-8859-15.enc\endcsname}%
-  \def\latone{\csname ISO-8859-1.enc\endcsname}%
-  \def\lattwo{\csname ISO-8859-2.enc\endcsname}%
-  \def\utfeight{\csname UTF-8.enc\endcsname}%
-  %
-  \ifx \declaredencoding \ascii
-     \asciichardefs
-  %
-  \else \ifx \declaredencoding \lattwo
-     \setnonasciicharscatcode\active
-     \lattwochardefs
-  %
-  \else \ifx \declaredencoding \latone
-     \setnonasciicharscatcode\active
-     \latonechardefs
-  %
-  \else \ifx \declaredencoding \latnine
-     \setnonasciicharscatcode\active
-     \latninechardefs
-  %
-  \else \ifx \declaredencoding \utfeight
-     \setnonasciicharscatcode\active
-     \utfeightchardefs
-  %
-  \else
-    \message{Unknown document encoding #1, ignoring.}%
-  %
-  \fi % utfeight
-  \fi % latnine
-  \fi % latone
-  \fi % lattwo
-  \fi % ascii
-}
-
-% A message to be logged when using a character that isn't available
-% the default font encoding (OT1).
-%
-\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}}
-
-% Take account of \c (plain) vs. \, (Texinfo) difference.
-\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi}
-
-% First, make active non-ASCII characters in order for them to be
-% correctly categorized when TeX reads the replacement text of
-% macros containing the character definitions.
-\setnonasciicharscatcode\active
-%
-% Latin1 (ISO-8859-1) character definitions.
-\def\latonechardefs{%
-  \gdef^^a0{~}
-  \gdef^^a1{\exclamdown}
-  \gdef^^a2{\missingcharmsg{CENT SIGN}}
-  \gdef^^a3{{\pounds}}
-  \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
-  \gdef^^a5{\missingcharmsg{YEN SIGN}}
-  \gdef^^a6{\missingcharmsg{BROKEN BAR}}
-  \gdef^^a7{\S}
-  \gdef^^a8{\"{}}
-  \gdef^^a9{\copyright}
-  \gdef^^aa{\ordf}
-  \gdef^^ab{\guillemetleft}
-  \gdef^^ac{$\lnot$}
-  \gdef^^ad{\-}
-  \gdef^^ae{\registeredsymbol}
-  \gdef^^af{\={}}
-  %
-  \gdef^^b0{\textdegree}
-  \gdef^^b1{$\pm$}
-  \gdef^^b2{$^2$}
-  \gdef^^b3{$^3$}
-  \gdef^^b4{\'{}}
-  \gdef^^b5{$\mu$}
-  \gdef^^b6{\P}
-  %
-  \gdef^^b7{$^.$}
-  \gdef^^b8{\cedilla\ }
-  \gdef^^b9{$^1$}
-  \gdef^^ba{\ordm}
-  %
-  \gdef^^bb{\guilletright}
-  \gdef^^bc{$1\over4$}
-  \gdef^^bd{$1\over2$}
-  \gdef^^be{$3\over4$}
-  \gdef^^bf{\questiondown}
-  %
-  \gdef^^c0{\`A}
-  \gdef^^c1{\'A}
-  \gdef^^c2{\^A}
-  \gdef^^c3{\~A}
-  \gdef^^c4{\"A}
-  \gdef^^c5{\ringaccent A}
-  \gdef^^c6{\AE}
-  \gdef^^c7{\cedilla C}
-  \gdef^^c8{\`E}
-  \gdef^^c9{\'E}
-  \gdef^^ca{\^E}
-  \gdef^^cb{\"E}
-  \gdef^^cc{\`I}
-  \gdef^^cd{\'I}
-  \gdef^^ce{\^I}
-  \gdef^^cf{\"I}
-  %
-  \gdef^^d0{\DH}
-  \gdef^^d1{\~N}
-  \gdef^^d2{\`O}
-  \gdef^^d3{\'O}
-  \gdef^^d4{\^O}
-  \gdef^^d5{\~O}
-  \gdef^^d6{\"O}
-  \gdef^^d7{$\times$}
-  \gdef^^d8{\O}
-  \gdef^^d9{\`U}
-  \gdef^^da{\'U}
-  \gdef^^db{\^U}
-  \gdef^^dc{\"U}
-  \gdef^^dd{\'Y}
-  \gdef^^de{\TH}
-  \gdef^^df{\ss}
-  %
-  \gdef^^e0{\`a}
-  \gdef^^e1{\'a}
-  \gdef^^e2{\^a}
-  \gdef^^e3{\~a}
-  \gdef^^e4{\"a}
-  \gdef^^e5{\ringaccent a}
-  \gdef^^e6{\ae}
-  \gdef^^e7{\cedilla c}
-  \gdef^^e8{\`e}
-  \gdef^^e9{\'e}
-  \gdef^^ea{\^e}
-  \gdef^^eb{\"e}
-  \gdef^^ec{\`{\dotless i}}
-  \gdef^^ed{\'{\dotless i}}
-  \gdef^^ee{\^{\dotless i}}
-  \gdef^^ef{\"{\dotless i}}
-  %
-  \gdef^^f0{\dh}
-  \gdef^^f1{\~n}
-  \gdef^^f2{\`o}
-  \gdef^^f3{\'o}
-  \gdef^^f4{\^o}
-  \gdef^^f5{\~o}
-  \gdef^^f6{\"o}
-  \gdef^^f7{$\div$}
-  \gdef^^f8{\o}
-  \gdef^^f9{\`u}
-  \gdef^^fa{\'u}
-  \gdef^^fb{\^u}
-  \gdef^^fc{\"u}
-  \gdef^^fd{\'y}
-  \gdef^^fe{\th}
-  \gdef^^ff{\"y}
-}
-
-% Latin9 (ISO-8859-15) encoding character definitions.
-\def\latninechardefs{%
-  % Encoding is almost identical to Latin1.
-  \latonechardefs
-  %
-  \gdef^^a4{\euro}
-  \gdef^^a6{\v S}
-  \gdef^^a8{\v s}
-  \gdef^^b4{\v Z}
-  \gdef^^b8{\v z}
-  \gdef^^bc{\OE}
-  \gdef^^bd{\oe}
-  \gdef^^be{\"Y}
-}
-
-% Latin2 (ISO-8859-2) character definitions.
-\def\lattwochardefs{%
-  \gdef^^a0{~}
-  \gdef^^a1{\ogonek{A}}
-  \gdef^^a2{\u{}}
-  \gdef^^a3{\L}
-  \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
-  \gdef^^a5{\v L}
-  \gdef^^a6{\'S}
-  \gdef^^a7{\S}
-  \gdef^^a8{\"{}}
-  \gdef^^a9{\v S}
-  \gdef^^aa{\cedilla S}
-  \gdef^^ab{\v T}
-  \gdef^^ac{\'Z}
-  \gdef^^ad{\-}
-  \gdef^^ae{\v Z}
-  \gdef^^af{\dotaccent Z}
-  %
-  \gdef^^b0{\textdegree}
-  \gdef^^b1{\ogonek{a}}
-  \gdef^^b2{\ogonek{ }}
-  \gdef^^b3{\l}
-  \gdef^^b4{\'{}}
-  \gdef^^b5{\v l}
-  \gdef^^b6{\'s}
-  \gdef^^b7{\v{}}
-  \gdef^^b8{\cedilla\ }
-  \gdef^^b9{\v s}
-  \gdef^^ba{\cedilla s}
-  \gdef^^bb{\v t}
-  \gdef^^bc{\'z}
-  \gdef^^bd{\H{}}
-  \gdef^^be{\v z}
-  \gdef^^bf{\dotaccent z}
-  %
-  \gdef^^c0{\'R}
-  \gdef^^c1{\'A}
-  \gdef^^c2{\^A}
-  \gdef^^c3{\u A}
-  \gdef^^c4{\"A}
-  \gdef^^c5{\'L}
-  \gdef^^c6{\'C}
-  \gdef^^c7{\cedilla C}
-  \gdef^^c8{\v C}
-  \gdef^^c9{\'E}
-  \gdef^^ca{\ogonek{E}}
-  \gdef^^cb{\"E}
-  \gdef^^cc{\v E}
-  \gdef^^cd{\'I}
-  \gdef^^ce{\^I}
-  \gdef^^cf{\v D}
-  %
-  \gdef^^d0{\DH}
-  \gdef^^d1{\'N}
-  \gdef^^d2{\v N}
-  \gdef^^d3{\'O}
-  \gdef^^d4{\^O}
-  \gdef^^d5{\H O}
-  \gdef^^d6{\"O}
-  \gdef^^d7{$\times$}
-  \gdef^^d8{\v R}
-  \gdef^^d9{\ringaccent U}
-  \gdef^^da{\'U}
-  \gdef^^db{\H U}
-  \gdef^^dc{\"U}
-  \gdef^^dd{\'Y}
-  \gdef^^de{\cedilla T}
-  \gdef^^df{\ss}
-  %
-  \gdef^^e0{\'r}
-  \gdef^^e1{\'a}
-  \gdef^^e2{\^a}
-  \gdef^^e3{\u a}
-  \gdef^^e4{\"a}
-  \gdef^^e5{\'l}
-  \gdef^^e6{\'c}
-  \gdef^^e7{\cedilla c}
-  \gdef^^e8{\v c}
-  \gdef^^e9{\'e}
-  \gdef^^ea{\ogonek{e}}
-  \gdef^^eb{\"e}
-  \gdef^^ec{\v e}
-  \gdef^^ed{\'\i}
-  \gdef^^ee{\^\i}
-  \gdef^^ef{\v d}
-  %
-  \gdef^^f0{\dh}
-  \gdef^^f1{\'n}
-  \gdef^^f2{\v n}
-  \gdef^^f3{\'o}
-  \gdef^^f4{\^o}
-  \gdef^^f5{\H o}
-  \gdef^^f6{\"o}
-  \gdef^^f7{$\div$}
-  \gdef^^f8{\v r}
-  \gdef^^f9{\ringaccent u}
-  \gdef^^fa{\'u}
-  \gdef^^fb{\H u}
-  \gdef^^fc{\"u}
-  \gdef^^fd{\'y}
-  \gdef^^fe{\cedilla t}
-  \gdef^^ff{\dotaccent{}}
-}
-
-% UTF-8 character definitions.
-%
-% This code to support UTF-8 is based on LaTeX's utf8.def, with some
-% changes for Texinfo conventions.  It is included here under the GPL by
-% permission from Frank Mittelbach and the LaTeX team.
-%
-\newcount\countUTFx
-\newcount\countUTFy
-\newcount\countUTFz
-
-\gdef\UTFviiiTwoOctets#1#2{\expandafter
-   \UTFviiiDefined\csname u8:#1\string #2\endcsname}
-%
-\gdef\UTFviiiThreeOctets#1#2#3{\expandafter
-   \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname}
-%
-\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter
-   \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname}
-
-\gdef\UTFviiiDefined#1{%
-  \ifx #1\relax
-    \message{\linenumber Unicode char \string #1 not defined for Texinfo}%
-  \else
-    \expandafter #1%
-  \fi
-}
-
-\begingroup
-  \catcode`\~13
-  \catcode`\"12
-
-  \def\UTFviiiLoop{%
-    \global\catcode\countUTFx\active
-    \uccode`\~\countUTFx
-    \uppercase\expandafter{\UTFviiiTmp}%
-    \advance\countUTFx by 1
-    \ifnum\countUTFx < \countUTFy
-      \expandafter\UTFviiiLoop
-    \fi}
-
-  \countUTFx = "C2
-  \countUTFy = "E0
-  \def\UTFviiiTmp{%
-    \xdef~{\noexpand\UTFviiiTwoOctets\string~}}
-  \UTFviiiLoop
-
-  \countUTFx = "E0
-  \countUTFy = "F0
-  \def\UTFviiiTmp{%
-    \xdef~{\noexpand\UTFviiiThreeOctets\string~}}
-  \UTFviiiLoop
-
-  \countUTFx = "F0
-  \countUTFy = "F4
-  \def\UTFviiiTmp{%
-    \xdef~{\noexpand\UTFviiiFourOctets\string~}}
-  \UTFviiiLoop
-\endgroup
-
-\begingroup
-  \catcode`\"=12
-  \catcode`\<=12
-  \catcode`\.=12
-  \catcode`\,=12
-  \catcode`\;=12
-  \catcode`\!=12
-  \catcode`\~=13
-
-  \gdef\DeclareUnicodeCharacter#1#2{%
-    \countUTFz = "#1\relax
-    \wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}%
-    \begingroup
-      \parseXMLCharref
-      \def\UTFviiiTwoOctets##1##2{%
-        \csname u8:##1\string ##2\endcsname}%
-      \def\UTFviiiThreeOctets##1##2##3{%
-        \csname u8:##1\string ##2\string ##3\endcsname}%
-      \def\UTFviiiFourOctets##1##2##3##4{%
-        \csname u8:##1\string ##2\string ##3\string ##4\endcsname}%
-      \expandafter\expandafter\expandafter\expandafter
-       \expandafter\expandafter\expandafter
-       \gdef\UTFviiiTmp{#2}%
-    \endgroup}
-
-  \gdef\parseXMLCharref{%
-    \ifnum\countUTFz < "A0\relax
-      \errhelp = \EMsimple
-      \errmessage{Cannot define Unicode char value < 00A0}%
-    \else\ifnum\countUTFz < "800\relax
-      \parseUTFviiiA,%
-      \parseUTFviiiB C\UTFviiiTwoOctets.,%
-    \else\ifnum\countUTFz < "10000\relax
-      \parseUTFviiiA;%
-      \parseUTFviiiA,%
-      \parseUTFviiiB E\UTFviiiThreeOctets.{,;}%
-    \else
-      \parseUTFviiiA;%
-      \parseUTFviiiA,%
-      \parseUTFviiiA!%
-      \parseUTFviiiB F\UTFviiiFourOctets.{!,;}%
-    \fi\fi\fi
-  }
-
-  \gdef\parseUTFviiiA#1{%
-    \countUTFx = \countUTFz
-    \divide\countUTFz by 64
-    \countUTFy = \countUTFz
-    \multiply\countUTFz by 64
-    \advance\countUTFx by -\countUTFz
-    \advance\countUTFx by 128
-    \uccode `#1\countUTFx
-    \countUTFz = \countUTFy}
-
-  \gdef\parseUTFviiiB#1#2#3#4{%
-    \advance\countUTFz by "#10\relax
-    \uccode `#3\countUTFz
-    \uppercase{\gdef\UTFviiiTmp{#2#3#4}}}
-\endgroup
-
-\def\utfeightchardefs{%
-  \DeclareUnicodeCharacter{00A0}{\tie}
-  \DeclareUnicodeCharacter{00A1}{\exclamdown}
-  \DeclareUnicodeCharacter{00A3}{\pounds}
-  \DeclareUnicodeCharacter{00A8}{\"{ }}
-  \DeclareUnicodeCharacter{00A9}{\copyright}
-  \DeclareUnicodeCharacter{00AA}{\ordf}
-  \DeclareUnicodeCharacter{00AB}{\guillemetleft}
-  \DeclareUnicodeCharacter{00AD}{\-}
-  \DeclareUnicodeCharacter{00AE}{\registeredsymbol}
-  \DeclareUnicodeCharacter{00AF}{\={ }}
-
-  \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}
-  \DeclareUnicodeCharacter{00B4}{\'{ }}
-  \DeclareUnicodeCharacter{00B8}{\cedilla{ }}
-  \DeclareUnicodeCharacter{00BA}{\ordm}
-  \DeclareUnicodeCharacter{00BB}{\guillemetright}
-  \DeclareUnicodeCharacter{00BF}{\questiondown}
-
-  \DeclareUnicodeCharacter{00C0}{\`A}
-  \DeclareUnicodeCharacter{00C1}{\'A}
-  \DeclareUnicodeCharacter{00C2}{\^A}
-  \DeclareUnicodeCharacter{00C3}{\~A}
-  \DeclareUnicodeCharacter{00C4}{\"A}
-  \DeclareUnicodeCharacter{00C5}{\AA}
-  \DeclareUnicodeCharacter{00C6}{\AE}
-  \DeclareUnicodeCharacter{00C7}{\cedilla{C}}
-  \DeclareUnicodeCharacter{00C8}{\`E}
-  \DeclareUnicodeCharacter{00C9}{\'E}
-  \DeclareUnicodeCharacter{00CA}{\^E}
-  \DeclareUnicodeCharacter{00CB}{\"E}
-  \DeclareUnicodeCharacter{00CC}{\`I}
-  \DeclareUnicodeCharacter{00CD}{\'I}
-  \DeclareUnicodeCharacter{00CE}{\^I}
-  \DeclareUnicodeCharacter{00CF}{\"I}
-
-  \DeclareUnicodeCharacter{00D0}{\DH}
-  \DeclareUnicodeCharacter{00D1}{\~N}
-  \DeclareUnicodeCharacter{00D2}{\`O}
-  \DeclareUnicodeCharacter{00D3}{\'O}
-  \DeclareUnicodeCharacter{00D4}{\^O}
-  \DeclareUnicodeCharacter{00D5}{\~O}
-  \DeclareUnicodeCharacter{00D6}{\"O}
-  \DeclareUnicodeCharacter{00D8}{\O}
-  \DeclareUnicodeCharacter{00D9}{\`U}
-  \DeclareUnicodeCharacter{00DA}{\'U}
-  \DeclareUnicodeCharacter{00DB}{\^U}
-  \DeclareUnicodeCharacter{00DC}{\"U}
-  \DeclareUnicodeCharacter{00DD}{\'Y}
-  \DeclareUnicodeCharacter{00DE}{\TH}
-  \DeclareUnicodeCharacter{00DF}{\ss}
-
-  \DeclareUnicodeCharacter{00E0}{\`a}
-  \DeclareUnicodeCharacter{00E1}{\'a}
-  \DeclareUnicodeCharacter{00E2}{\^a}
-  \DeclareUnicodeCharacter{00E3}{\~a}
-  \DeclareUnicodeCharacter{00E4}{\"a}
-  \DeclareUnicodeCharacter{00E5}{\aa}
-  \DeclareUnicodeCharacter{00E6}{\ae}
-  \DeclareUnicodeCharacter{00E7}{\cedilla{c}}
-  \DeclareUnicodeCharacter{00E8}{\`e}
-  \DeclareUnicodeCharacter{00E9}{\'e}
-  \DeclareUnicodeCharacter{00EA}{\^e}
-  \DeclareUnicodeCharacter{00EB}{\"e}
-  \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}}
-  \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}}
-  \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}
-  \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}
-
-  \DeclareUnicodeCharacter{00F0}{\dh}
-  \DeclareUnicodeCharacter{00F1}{\~n}
-  \DeclareUnicodeCharacter{00F2}{\`o}
-  \DeclareUnicodeCharacter{00F3}{\'o}
-  \DeclareUnicodeCharacter{00F4}{\^o}
-  \DeclareUnicodeCharacter{00F5}{\~o}
-  \DeclareUnicodeCharacter{00F6}{\"o}
-  \DeclareUnicodeCharacter{00F8}{\o}
-  \DeclareUnicodeCharacter{00F9}{\`u}
-  \DeclareUnicodeCharacter{00FA}{\'u}
-  \DeclareUnicodeCharacter{00FB}{\^u}
-  \DeclareUnicodeCharacter{00FC}{\"u}
-  \DeclareUnicodeCharacter{00FD}{\'y}
-  \DeclareUnicodeCharacter{00FE}{\th}
-  \DeclareUnicodeCharacter{00FF}{\"y}
-
-  \DeclareUnicodeCharacter{0100}{\=A}
-  \DeclareUnicodeCharacter{0101}{\=a}
-  \DeclareUnicodeCharacter{0102}{\u{A}}
-  \DeclareUnicodeCharacter{0103}{\u{a}}
-  \DeclareUnicodeCharacter{0104}{\ogonek{A}}
-  \DeclareUnicodeCharacter{0105}{\ogonek{a}}
-  \DeclareUnicodeCharacter{0106}{\'C}
-  \DeclareUnicodeCharacter{0107}{\'c}
-  \DeclareUnicodeCharacter{0108}{\^C}
-  \DeclareUnicodeCharacter{0109}{\^c}
-  \DeclareUnicodeCharacter{0118}{\ogonek{E}}
-  \DeclareUnicodeCharacter{0119}{\ogonek{e}}
-  \DeclareUnicodeCharacter{010A}{\dotaccent{C}}
-  \DeclareUnicodeCharacter{010B}{\dotaccent{c}}
-  \DeclareUnicodeCharacter{010C}{\v{C}}
-  \DeclareUnicodeCharacter{010D}{\v{c}}
-  \DeclareUnicodeCharacter{010E}{\v{D}}
-
-  \DeclareUnicodeCharacter{0112}{\=E}
-  \DeclareUnicodeCharacter{0113}{\=e}
-  \DeclareUnicodeCharacter{0114}{\u{E}}
-  \DeclareUnicodeCharacter{0115}{\u{e}}
-  \DeclareUnicodeCharacter{0116}{\dotaccent{E}}
-  \DeclareUnicodeCharacter{0117}{\dotaccent{e}}
-  \DeclareUnicodeCharacter{011A}{\v{E}}
-  \DeclareUnicodeCharacter{011B}{\v{e}}
-  \DeclareUnicodeCharacter{011C}{\^G}
-  \DeclareUnicodeCharacter{011D}{\^g}
-  \DeclareUnicodeCharacter{011E}{\u{G}}
-  \DeclareUnicodeCharacter{011F}{\u{g}}
-
-  \DeclareUnicodeCharacter{0120}{\dotaccent{G}}
-  \DeclareUnicodeCharacter{0121}{\dotaccent{g}}
-  \DeclareUnicodeCharacter{0124}{\^H}
-  \DeclareUnicodeCharacter{0125}{\^h}
-  \DeclareUnicodeCharacter{0128}{\~I}
-  \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}
-  \DeclareUnicodeCharacter{012A}{\=I}
-  \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}
-  \DeclareUnicodeCharacter{012C}{\u{I}}
-  \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}
-
-  \DeclareUnicodeCharacter{0130}{\dotaccent{I}}
-  \DeclareUnicodeCharacter{0131}{\dotless{i}}
-  \DeclareUnicodeCharacter{0132}{IJ}
-  \DeclareUnicodeCharacter{0133}{ij}
-  \DeclareUnicodeCharacter{0134}{\^J}
-  \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}
-  \DeclareUnicodeCharacter{0139}{\'L}
-  \DeclareUnicodeCharacter{013A}{\'l}
-
-  \DeclareUnicodeCharacter{0141}{\L}
-  \DeclareUnicodeCharacter{0142}{\l}
-  \DeclareUnicodeCharacter{0143}{\'N}
-  \DeclareUnicodeCharacter{0144}{\'n}
-  \DeclareUnicodeCharacter{0147}{\v{N}}
-  \DeclareUnicodeCharacter{0148}{\v{n}}
-  \DeclareUnicodeCharacter{014C}{\=O}
-  \DeclareUnicodeCharacter{014D}{\=o}
-  \DeclareUnicodeCharacter{014E}{\u{O}}
-  \DeclareUnicodeCharacter{014F}{\u{o}}
-
-  \DeclareUnicodeCharacter{0150}{\H{O}}
-  \DeclareUnicodeCharacter{0151}{\H{o}}
-  \DeclareUnicodeCharacter{0152}{\OE}
-  \DeclareUnicodeCharacter{0153}{\oe}
-  \DeclareUnicodeCharacter{0154}{\'R}
-  \DeclareUnicodeCharacter{0155}{\'r}
-  \DeclareUnicodeCharacter{0158}{\v{R}}
-  \DeclareUnicodeCharacter{0159}{\v{r}}
-  \DeclareUnicodeCharacter{015A}{\'S}
-  \DeclareUnicodeCharacter{015B}{\'s}
-  \DeclareUnicodeCharacter{015C}{\^S}
-  \DeclareUnicodeCharacter{015D}{\^s}
-  \DeclareUnicodeCharacter{015E}{\cedilla{S}}
-  \DeclareUnicodeCharacter{015F}{\cedilla{s}}
-
-  \DeclareUnicodeCharacter{0160}{\v{S}}
-  \DeclareUnicodeCharacter{0161}{\v{s}}
-  \DeclareUnicodeCharacter{0162}{\cedilla{t}}
-  \DeclareUnicodeCharacter{0163}{\cedilla{T}}
-  \DeclareUnicodeCharacter{0164}{\v{T}}
-
-  \DeclareUnicodeCharacter{0168}{\~U}
-  \DeclareUnicodeCharacter{0169}{\~u}
-  \DeclareUnicodeCharacter{016A}{\=U}
-  \DeclareUnicodeCharacter{016B}{\=u}
-  \DeclareUnicodeCharacter{016C}{\u{U}}
-  \DeclareUnicodeCharacter{016D}{\u{u}}
-  \DeclareUnicodeCharacter{016E}{\ringaccent{U}}
-  \DeclareUnicodeCharacter{016F}{\ringaccent{u}}
-
-  \DeclareUnicodeCharacter{0170}{\H{U}}
-  \DeclareUnicodeCharacter{0171}{\H{u}}
-  \DeclareUnicodeCharacter{0174}{\^W}
-  \DeclareUnicodeCharacter{0175}{\^w}
-  \DeclareUnicodeCharacter{0176}{\^Y}
-  \DeclareUnicodeCharacter{0177}{\^y}
-  \DeclareUnicodeCharacter{0178}{\"Y}
-  \DeclareUnicodeCharacter{0179}{\'Z}
-  \DeclareUnicodeCharacter{017A}{\'z}
-  \DeclareUnicodeCharacter{017B}{\dotaccent{Z}}
-  \DeclareUnicodeCharacter{017C}{\dotaccent{z}}
-  \DeclareUnicodeCharacter{017D}{\v{Z}}
-  \DeclareUnicodeCharacter{017E}{\v{z}}
-
-  \DeclareUnicodeCharacter{01C4}{D\v{Z}}
-  \DeclareUnicodeCharacter{01C5}{D\v{z}}
-  \DeclareUnicodeCharacter{01C6}{d\v{z}}
-  \DeclareUnicodeCharacter{01C7}{LJ}
-  \DeclareUnicodeCharacter{01C8}{Lj}
-  \DeclareUnicodeCharacter{01C9}{lj}
-  \DeclareUnicodeCharacter{01CA}{NJ}
-  \DeclareUnicodeCharacter{01CB}{Nj}
-  \DeclareUnicodeCharacter{01CC}{nj}
-  \DeclareUnicodeCharacter{01CD}{\v{A}}
-  \DeclareUnicodeCharacter{01CE}{\v{a}}
-  \DeclareUnicodeCharacter{01CF}{\v{I}}
-
-  \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}}
-  \DeclareUnicodeCharacter{01D1}{\v{O}}
-  \DeclareUnicodeCharacter{01D2}{\v{o}}
-  \DeclareUnicodeCharacter{01D3}{\v{U}}
-  \DeclareUnicodeCharacter{01D4}{\v{u}}
-
-  \DeclareUnicodeCharacter{01E2}{\={\AE}}
-  \DeclareUnicodeCharacter{01E3}{\={\ae}}
-  \DeclareUnicodeCharacter{01E6}{\v{G}}
-  \DeclareUnicodeCharacter{01E7}{\v{g}}
-  \DeclareUnicodeCharacter{01E8}{\v{K}}
-  \DeclareUnicodeCharacter{01E9}{\v{k}}
-
-  \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}}
-  \DeclareUnicodeCharacter{01F1}{DZ}
-  \DeclareUnicodeCharacter{01F2}{Dz}
-  \DeclareUnicodeCharacter{01F3}{dz}
-  \DeclareUnicodeCharacter{01F4}{\'G}
-  \DeclareUnicodeCharacter{01F5}{\'g}
-  \DeclareUnicodeCharacter{01F8}{\`N}
-  \DeclareUnicodeCharacter{01F9}{\`n}
-  \DeclareUnicodeCharacter{01FC}{\'{\AE}}
-  \DeclareUnicodeCharacter{01FD}{\'{\ae}}
-  \DeclareUnicodeCharacter{01FE}{\'{\O}}
-  \DeclareUnicodeCharacter{01FF}{\'{\o}}
-
-  \DeclareUnicodeCharacter{021E}{\v{H}}
-  \DeclareUnicodeCharacter{021F}{\v{h}}
-
-  \DeclareUnicodeCharacter{0226}{\dotaccent{A}}
-  \DeclareUnicodeCharacter{0227}{\dotaccent{a}}
-  \DeclareUnicodeCharacter{0228}{\cedilla{E}}
-  \DeclareUnicodeCharacter{0229}{\cedilla{e}}
-  \DeclareUnicodeCharacter{022E}{\dotaccent{O}}
-  \DeclareUnicodeCharacter{022F}{\dotaccent{o}}
-
-  \DeclareUnicodeCharacter{0232}{\=Y}
-  \DeclareUnicodeCharacter{0233}{\=y}
-  \DeclareUnicodeCharacter{0237}{\dotless{j}}
-
-  \DeclareUnicodeCharacter{02DB}{\ogonek{ }}
-
-  \DeclareUnicodeCharacter{1E02}{\dotaccent{B}}
-  \DeclareUnicodeCharacter{1E03}{\dotaccent{b}}
-  \DeclareUnicodeCharacter{1E04}{\udotaccent{B}}
-  \DeclareUnicodeCharacter{1E05}{\udotaccent{b}}
-  \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}}
-  \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}}
-  \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}}
-  \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}}
-  \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}}
-  \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}}
-  \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}}
-  \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}}
-
-  \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}}
-  \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}}
-
-  \DeclareUnicodeCharacter{1E20}{\=G}
-  \DeclareUnicodeCharacter{1E21}{\=g}
-  \DeclareUnicodeCharacter{1E22}{\dotaccent{H}}
-  \DeclareUnicodeCharacter{1E23}{\dotaccent{h}}
-  \DeclareUnicodeCharacter{1E24}{\udotaccent{H}}
-  \DeclareUnicodeCharacter{1E25}{\udotaccent{h}}
-  \DeclareUnicodeCharacter{1E26}{\"H}
-  \DeclareUnicodeCharacter{1E27}{\"h}
-
-  \DeclareUnicodeCharacter{1E30}{\'K}
-  \DeclareUnicodeCharacter{1E31}{\'k}
-  \DeclareUnicodeCharacter{1E32}{\udotaccent{K}}
-  \DeclareUnicodeCharacter{1E33}{\udotaccent{k}}
-  \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}}
-  \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}}
-  \DeclareUnicodeCharacter{1E36}{\udotaccent{L}}
-  \DeclareUnicodeCharacter{1E37}{\udotaccent{l}}
-  \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}}
-  \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}}
-  \DeclareUnicodeCharacter{1E3E}{\'M}
-  \DeclareUnicodeCharacter{1E3F}{\'m}
-
-  \DeclareUnicodeCharacter{1E40}{\dotaccent{M}}
-  \DeclareUnicodeCharacter{1E41}{\dotaccent{m}}
-  \DeclareUnicodeCharacter{1E42}{\udotaccent{M}}
-  \DeclareUnicodeCharacter{1E43}{\udotaccent{m}}
-  \DeclareUnicodeCharacter{1E44}{\dotaccent{N}}
-  \DeclareUnicodeCharacter{1E45}{\dotaccent{n}}
-  \DeclareUnicodeCharacter{1E46}{\udotaccent{N}}
-  \DeclareUnicodeCharacter{1E47}{\udotaccent{n}}
-  \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}}
-  \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}}
-
-  \DeclareUnicodeCharacter{1E54}{\'P}
-  \DeclareUnicodeCharacter{1E55}{\'p}
-  \DeclareUnicodeCharacter{1E56}{\dotaccent{P}}
-  \DeclareUnicodeCharacter{1E57}{\dotaccent{p}}
-  \DeclareUnicodeCharacter{1E58}{\dotaccent{R}}
-  \DeclareUnicodeCharacter{1E59}{\dotaccent{r}}
-  \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}}
-  \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}}
-  \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}}
-  \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}}
-
-  \DeclareUnicodeCharacter{1E60}{\dotaccent{S}}
-  \DeclareUnicodeCharacter{1E61}{\dotaccent{s}}
-  \DeclareUnicodeCharacter{1E62}{\udotaccent{S}}
-  \DeclareUnicodeCharacter{1E63}{\udotaccent{s}}
-  \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}}
-  \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}}
-  \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}}
-  \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}}
-  \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}}
-  \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}}
-
-  \DeclareUnicodeCharacter{1E7C}{\~V}
-  \DeclareUnicodeCharacter{1E7D}{\~v}
-  \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}}
-  \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}}
-
-  \DeclareUnicodeCharacter{1E80}{\`W}
-  \DeclareUnicodeCharacter{1E81}{\`w}
-  \DeclareUnicodeCharacter{1E82}{\'W}
-  \DeclareUnicodeCharacter{1E83}{\'w}
-  \DeclareUnicodeCharacter{1E84}{\"W}
-  \DeclareUnicodeCharacter{1E85}{\"w}
-  \DeclareUnicodeCharacter{1E86}{\dotaccent{W}}
-  \DeclareUnicodeCharacter{1E87}{\dotaccent{w}}
-  \DeclareUnicodeCharacter{1E88}{\udotaccent{W}}
-  \DeclareUnicodeCharacter{1E89}{\udotaccent{w}}
-  \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}}
-  \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}}
-  \DeclareUnicodeCharacter{1E8C}{\"X}
-  \DeclareUnicodeCharacter{1E8D}{\"x}
-  \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}}
-  \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}}
-
-  \DeclareUnicodeCharacter{1E90}{\^Z}
-  \DeclareUnicodeCharacter{1E91}{\^z}
-  \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}}
-  \DeclareUnicodeCharacter{1E93}{\udotaccent{z}}
-  \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}}
-  \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}}
-  \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}}
-  \DeclareUnicodeCharacter{1E97}{\"t}
-  \DeclareUnicodeCharacter{1E98}{\ringaccent{w}}
-  \DeclareUnicodeCharacter{1E99}{\ringaccent{y}}
-
-  \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}}
-  \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}}
-
-  \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}}
-  \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}}
-  \DeclareUnicodeCharacter{1EBC}{\~E}
-  \DeclareUnicodeCharacter{1EBD}{\~e}
-
-  \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}}
-  \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}}
-  \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}}
-  \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}}
-
-  \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}}
-  \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}}
-
-  \DeclareUnicodeCharacter{1EF2}{\`Y}
-  \DeclareUnicodeCharacter{1EF3}{\`y}
-  \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}}
-
-  \DeclareUnicodeCharacter{1EF8}{\~Y}
-  \DeclareUnicodeCharacter{1EF9}{\~y}
-
-  \DeclareUnicodeCharacter{2013}{--}
-  \DeclareUnicodeCharacter{2014}{---}
-  \DeclareUnicodeCharacter{2018}{\quoteleft}
-  \DeclareUnicodeCharacter{2019}{\quoteright}
-  \DeclareUnicodeCharacter{201A}{\quotesinglbase}
-  \DeclareUnicodeCharacter{201C}{\quotedblleft}
-  \DeclareUnicodeCharacter{201D}{\quotedblright}
-  \DeclareUnicodeCharacter{201E}{\quotedblbase}
-  \DeclareUnicodeCharacter{2022}{\bullet}
-  \DeclareUnicodeCharacter{2026}{\dots}
-  \DeclareUnicodeCharacter{2039}{\guilsinglleft}
-  \DeclareUnicodeCharacter{203A}{\guilsinglright}
-  \DeclareUnicodeCharacter{20AC}{\euro}
-
-  \DeclareUnicodeCharacter{2192}{\expansion}
-  \DeclareUnicodeCharacter{21D2}{\result}
-
-  \DeclareUnicodeCharacter{2212}{\minus}
-  \DeclareUnicodeCharacter{2217}{\point}
-  \DeclareUnicodeCharacter{2261}{\equiv}
-}% end of \utfeightchardefs
-
-
-% US-ASCII character definitions.
-\def\asciichardefs{% nothing need be done
-   \relax
-}
-
-% Make non-ASCII characters printable again for compatibility with
-% existing Texinfo documents that may use them, even without declaring a
-% document encoding.
-%
-\setnonasciicharscatcode \other
-
-
-\message{formatting,}
-
-\newdimen\defaultparindent \defaultparindent = 15pt
-
-\chapheadingskip = 15pt plus 4pt minus 2pt
-\secheadingskip = 12pt plus 3pt minus 2pt
-\subsecheadingskip = 9pt plus 2pt minus 2pt
-
-% Prevent underfull vbox error messages.
-\vbadness = 10000
-
-% Don't be so finicky about underfull hboxes, either.
-\hbadness = 2000
-
-% Following George Bush, get rid of widows and orphans.
-\widowpenalty=10000
-\clubpenalty=10000
-
-% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
-% using an old version of TeX, don't do anything.  We want the amount of
-% stretch added to depend on the line length, hence the dependence on
-% \hsize.  We call this whenever the paper size is set.
-%
-\def\setemergencystretch{%
-  \ifx\emergencystretch\thisisundefined
-    % Allow us to assign to \emergencystretch anyway.
-    \def\emergencystretch{\dimen0}%
-  \else
-    \emergencystretch = .15\hsize
-  \fi
-}
-
-% Parameters in order: 1) textheight; 2) textwidth;
-% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip;
-% 7) physical page height; 8) physical page width.
-%
-% We also call \setleading{\textleading}, so the caller should define
-% \textleading.  The caller should also set \parskip.
-%
-\def\internalpagesizes#1#2#3#4#5#6#7#8{%
-  \voffset = #3\relax
-  \topskip = #6\relax
-  \splittopskip = \topskip
-  %
-  \vsize = #1\relax
-  \advance\vsize by \topskip
-  \outervsize = \vsize
-  \advance\outervsize by 2\topandbottommargin
-  \pageheight = \vsize
-  %
-  \hsize = #2\relax
-  \outerhsize = \hsize
-  \advance\outerhsize by 0.5in
-  \pagewidth = \hsize
-  %
-  \normaloffset = #4\relax
-  \bindingoffset = #5\relax
-  %
-  \ifpdf
-    \pdfpageheight #7\relax
-    \pdfpagewidth #8\relax
-    % if we don't reset these, they will remain at "1 true in" of
-    % whatever layout pdftex was dumped with.
-    \pdfhorigin = 1 true in
-    \pdfvorigin = 1 true in
-  \fi
-  %
-  \setleading{\textleading}
-  %
-  \parindent = \defaultparindent
-  \setemergencystretch
-}
-
-% @letterpaper (the default).
-\def\letterpaper{{\globaldefs = 1
-  \parskip = 3pt plus 2pt minus 1pt
-  \textleading = 13.2pt
-  %
-  % If page is nothing but text, make it come out even.
-  \internalpagesizes{607.2pt}{6in}% that's 46 lines
-                    {\voffset}{.25in}%
-                    {\bindingoffset}{36pt}%
-                    {11in}{8.5in}%
-}}
-
-% Use @smallbook to reset parameters for 7x9.25 trim size.
-\def\smallbook{{\globaldefs = 1
-  \parskip = 2pt plus 1pt
-  \textleading = 12pt
-  %
-  \internalpagesizes{7.5in}{5in}%
-                    {-.2in}{0in}%
-                    {\bindingoffset}{16pt}%
-                    {9.25in}{7in}%
-  %
-  \lispnarrowing = 0.3in
-  \tolerance = 700
-  \hfuzz = 1pt
-  \contentsrightmargin = 0pt
-  \defbodyindent = .5cm
-}}
-
-% Use @smallerbook to reset parameters for 6x9 trim size.
-% (Just testing, parameters still in flux.)
-\def\smallerbook{{\globaldefs = 1
-  \parskip = 1.5pt plus 1pt
-  \textleading = 12pt
-  %
-  \internalpagesizes{7.4in}{4.8in}%
-                    {-.2in}{-.4in}%
-                    {0pt}{14pt}%
-                    {9in}{6in}%
-  %
-  \lispnarrowing = 0.25in
-  \tolerance = 700
-  \hfuzz = 1pt
-  \contentsrightmargin = 0pt
-  \defbodyindent = .4cm
-}}
-
-% Use @afourpaper to print on European A4 paper.
-\def\afourpaper{{\globaldefs = 1
-  \parskip = 3pt plus 2pt minus 1pt
-  \textleading = 13.2pt
-  %
-  % Double-side printing via postscript on Laserjet 4050
-  % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
-  % To change the settings for a different printer or situation, adjust
-  % \normaloffset until the front-side and back-side texts align.  Then
-  % do the same for \bindingoffset.  You can set these for testing in
-  % your texinfo source file like this:
-  % @tex
-  % \global\normaloffset = -6mm
-  % \global\bindingoffset = 10mm
-  % @end tex
-  \internalpagesizes{673.2pt}{160mm}% that's 51 lines
-                    {\voffset}{\hoffset}%
-                    {\bindingoffset}{44pt}%
-                    {297mm}{210mm}%
-  %
-  \tolerance = 700
-  \hfuzz = 1pt
-  \contentsrightmargin = 0pt
-  \defbodyindent = 5mm
-}}
-
-% Use @afivepaper to print on European A5 paper.
-% From romildo@urano.iceb.ufop.br, 2 July 2000.
-% He also recommends making @example and @lisp be small.
-\def\afivepaper{{\globaldefs = 1
-  \parskip = 2pt plus 1pt minus 0.1pt
-  \textleading = 12.5pt
-  %
-  \internalpagesizes{160mm}{120mm}%
-                    {\voffset}{\hoffset}%
-                    {\bindingoffset}{8pt}%
-                    {210mm}{148mm}%
-  %
-  \lispnarrowing = 0.2in
-  \tolerance = 800
-  \hfuzz = 1.2pt
-  \contentsrightmargin = 0pt
-  \defbodyindent = 2mm
-  \tableindent = 12mm
-}}
-
-% A specific text layout, 24x15cm overall, intended for A4 paper.
-\def\afourlatex{{\globaldefs = 1
-  \afourpaper
-  \internalpagesizes{237mm}{150mm}%
-                    {\voffset}{4.6mm}%
-                    {\bindingoffset}{7mm}%
-                    {297mm}{210mm}%
-  %
-  % Must explicitly reset to 0 because we call \afourpaper.
-  \globaldefs = 0
-}}
-
-% Use @afourwide to print on A4 paper in landscape format.
-\def\afourwide{{\globaldefs = 1
-  \afourpaper
-  \internalpagesizes{241mm}{165mm}%
-                    {\voffset}{-2.95mm}%
-                    {\bindingoffset}{7mm}%
-                    {297mm}{210mm}%
-  \globaldefs = 0
-}}
-
-% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
-% Perhaps we should allow setting the margins, \topskip, \parskip,
-% and/or leading, also. Or perhaps we should compute them somehow.
-%
-\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
-\def\pagesizesyyy#1,#2,#3\finish{{%
-  \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
-  \globaldefs = 1
-  %
-  \parskip = 3pt plus 2pt minus 1pt
-  \setleading{\textleading}%
-  %
-  \dimen0 = #1\relax
-  \advance\dimen0 by \voffset
-  %
-  \dimen2 = \hsize
-  \advance\dimen2 by \normaloffset
-  %
-  \internalpagesizes{#1}{\hsize}%
-                    {\voffset}{\normaloffset}%
-                    {\bindingoffset}{44pt}%
-                    {\dimen0}{\dimen2}%
-}}
-
-% Set default to letter.
-%
-\letterpaper
-
-
-\message{and turning on texinfo input format.}
-
-% DEL is a comment character, in case @c does not suffice.
-\catcode`\^^? = 14
-
-% Define macros to output various characters with catcode for normal text.
-\catcode`\"=\other
-\catcode`\~=\other
-\catcode`\^=\other
-\catcode`\_=\other
-\catcode`\|=\other
-\catcode`\<=\other
-\catcode`\>=\other
-\catcode`\+=\other
-\catcode`\$=\other
-\def\normaldoublequote{"}
-\def\normaltilde{~}
-\def\normalcaret{^}
-\def\normalunderscore{_}
-\def\normalverticalbar{|}
-\def\normalless{<}
-\def\normalgreater{>}
-\def\normalplus{+}
-\def\normaldollar{$}%$ font-lock fix
-
-% This macro is used to make a character print one way in \tt
-% (where it can probably be output as-is), and another way in other fonts,
-% where something hairier probably needs to be done.
-%
-% #1 is what to print if we are indeed using \tt; #2 is what to print
-% otherwise.  Since all the Computer Modern typewriter fonts have zero
-% interword stretch (and shrink), and it is reasonable to expect all
-% typewriter fonts to have this, we can check that font parameter.
-%
-\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
-
-% Same as above, but check for italic font.  Actually this also catches
-% non-italic slanted fonts since it is impossible to distinguish them from
-% italic fonts.  But since this is only used by $ and it uses \sl anyway
-% this is not a problem.
-\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
-
-% Turn off all special characters except @
-% (and those which the user can use as if they were ordinary).
-% Most of these we simply print from the \tt font, but for some, we can
-% use math or other variants that look better in normal text.
-
-\catcode`\"=\active
-\def\activedoublequote{{\tt\char34}}
-\let"=\activedoublequote
-\catcode`\~=\active
-\def~{{\tt\char126}}
-\chardef\hat=`\^
-\catcode`\^=\active
-\def^{{\tt \hat}}
-
-\catcode`\_=\active
-\def_{\ifusingtt\normalunderscore\_}
-\let\realunder=_
-% Subroutine for the previous macro.
-\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
-
-\catcode`\|=\active
-\def|{{\tt\char124}}
-\chardef \less=`\<
-\catcode`\<=\active
-\def<{{\tt \less}}
-\chardef \gtr=`\>
-\catcode`\>=\active
-\def>{{\tt \gtr}}
-\catcode`\+=\active
-\def+{{\tt \char 43}}
-\catcode`\$=\active
-\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
-
-% If a .fmt file is being used, characters that might appear in a file
-% name cannot be active until we have parsed the command line.
-% So turn them off again, and have \everyjob (or @setfilename) turn them on.
-% \otherifyactive is called near the end of this file.
-\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
-
-% Used sometimes to turn off (effectively) the active characters even after
-% parsing them.
-\def\turnoffactive{%
-  \normalturnoffactive
-  \otherbackslash
-}
-
-\catcode`\@=0
-
-% \backslashcurfont outputs one backslash character in current font,
-% as in \char`\\.
-\global\chardef\backslashcurfont=`\\
-\global\let\rawbackslashxx=\backslashcurfont  % let existing .??s files work
-
-% \realbackslash is an actual character `\' with catcode other, and
-% \doublebackslash is two of them (for the pdf outlines).
-{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}}
-
-% In texinfo, backslash is an active character; it prints the backslash
-% in fixed width font.
-\catcode`\\=\active
-@def@normalbackslash{{@tt@backslashcurfont}}
-% On startup, @fixbackslash assigns:
-%  @let \ = @normalbackslash
-
-% \rawbackslash defines an active \ to do \backslashcurfont.
-% \otherbackslash defines an active \ to be a literal `\' character with
-% catcode other.
-@gdef@rawbackslash{@let\=@backslashcurfont}
-@gdef@otherbackslash{@let\=@realbackslash}
-
-% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
-% the literal character `\'.
-%
-@def@normalturnoffactive{%
-  @let\=@normalbackslash
-  @let"=@normaldoublequote
-  @let~=@normaltilde
-  @let^=@normalcaret
-  @let_=@normalunderscore
-  @let|=@normalverticalbar
-  @let<=@normalless
-  @let>=@normalgreater
-  @let+=@normalplus
-  @let$=@normaldollar %$ font-lock fix
-  @markupsetuplqdefault
-  @markupsetuprqdefault
-  @unsepspaces
-}
-
-% Make _ and + \other characters, temporarily.
-% This is canceled by @fixbackslash.
-@otherifyactive
-
-% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
-% That is what \eatinput is for; after that, the `\' should revert to printing
-% a backslash.
-%
-@gdef@eatinput input texinfo{@fixbackslash}
-@global@let\ = @eatinput
-
-% On the other hand, perhaps the file did not have a `\input texinfo'. Then
-% the first `\' in the file would cause an error. This macro tries to fix
-% that, assuming it is called before the first `\' could plausibly occur.
-% Also turn back on active characters that might appear in the input
-% file name, in case not using a pre-dumped format.
-%
-@gdef@fixbackslash{%
-  @ifx\@eatinput @let\ = @normalbackslash @fi
-  @catcode`+=@active
-  @catcode`@_=@active
-}
-
-% Say @foo, not \foo, in error messages.
-@escapechar = `@@
-
-% These look ok in all fonts, so just make them not special.
-@catcode`@& = @other
-@catcode`@# = @other
-@catcode`@% = @other
-
-@c Finally, make ` and ' active, so that txicodequoteundirected and
-@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}.  If we
-@c don't make ` and ' active, @code will not get them as active chars.
-@c Do this last of all since we use ` in the previous @catcode assignments.
-@catcode`@'=@active
-@catcode`@`=@active
-@markupsetuplqdefault
-@markupsetuprqdefault
-
-@c Local variables:
-@c eval: (add-hook 'write-file-hooks 'time-stamp)
-@c page-delimiter: "^\\\\message"
-@c time-stamp-start: "def\\\\texinfoversion{"
-@c time-stamp-format: "%:y-%02m-%02d.%02H"
-@c time-stamp-end: "}"
-@c End:
-
-@c vim:sw=2:
-
-@ignore
-   arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
-@end ignore
diff --git a/cloog-0.17.0/osl/configure b/cloog-0.17.0/osl/configure
deleted file mode 100755
index 9cde815..0000000
--- a/cloog-0.17.0/osl/configure
+++ /dev/null
@@ -1,13290 +0,0 @@
-#! /bin/sh
-# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.67 for osl 0.8.1.
-#
-# Report bugs to <cedric.bastoul@u-psud.fr,pouchet@cse.ohio-state.edu>.
-#
-#
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
-# Foundation, Inc.
-#
-#
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
-      PATH_SEPARATOR=';'
-  }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-case $0 in #((
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-  done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test "x$CONFIG_SHELL" = x; then
-  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '\${1+\"\$@\"}'='\"\$@\"'
-  setopt NO_GLOB_SUBST
-else
-  case \`(set -o) 2>/dev/null\` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-"
-  as_required="as_fn_return () { (exit \$1); }
-as_fn_success () { as_fn_return 0; }
-as_fn_failure () { as_fn_return 1; }
-as_fn_ret_success () { return 0; }
-as_fn_ret_failure () { return 1; }
-
-exitcode=0
-as_fn_success || { exitcode=1; echo as_fn_success failed.; }
-as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
-as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
-as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
-
-else
-  exitcode=1; echo positional parameters were not saved.
-fi
-test x\$exitcode = x0 || exit 1"
-  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
-  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
-  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
-  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
-test \$(( 1 + 1 )) = 2 || exit 1"
-  if (eval "$as_required") 2>/dev/null; then :
-  as_have_required=yes
-else
-  as_have_required=no
-fi
-  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
-
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_found=false
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  as_found=:
-  case $as_dir in #(
-	 /*)
-	   for as_base in sh bash ksh sh5; do
-	     # Try only shells that exist, to save several forks.
-	     as_shell=$as_dir/$as_base
-	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
-		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
-  CONFIG_SHELL=$as_shell as_have_required=yes
-		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
-  break 2
-fi
-fi
-	   done;;
-       esac
-  as_found=false
-done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
-	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
-  CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
-IFS=$as_save_IFS
-
-
-      if test "x$CONFIG_SHELL" != x; then :
-  # We cannot yet assume a decent shell, so we have to provide a
-	# neutralization value for shells without unset; and this also
-	# works around shells that cannot unset nonexistent variables.
-	BASH_ENV=/dev/null
-	ENV=/dev/null
-	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-	export CONFIG_SHELL
-	exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
-fi
-
-    if test x$as_have_required = xno; then :
-  $as_echo "$0: This script requires a shell more modern than all"
-  $as_echo "$0: the shells that I found on your system."
-  if test x${ZSH_VERSION+set} = xset ; then
-    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
-    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
-  else
-    $as_echo "$0: Please tell bug-autoconf@gnu.org and
-$0: cedric.bastoul@u-psud.fr,pouchet@cse.ohio-state.edu
-$0: about your system, including any error possibly output
-$0: before this message. Then install a modern shell, or
-$0: manually run the script under such a shell if you do
-$0: have one."
-  fi
-  exit 1
-fi
-fi
-fi
-SHELL=${CONFIG_SHELL-/bin/sh}
-export SHELL
-# Unset more variables known to interfere with behavior of common tools.
-CLICOLOR_FORCE= GREP_OPTIONS=
-unset CLICOLOR_FORCE GREP_OPTIONS
-
-## --------------------- ##
-## M4sh Shell Functions. ##
-## --------------------- ##
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
-  { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
-  return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
-  set +e
-  as_fn_set_status $1
-  exit $1
-} # as_fn_exit
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || eval $as_mkdir_p || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
-  eval 'as_fn_append ()
-  {
-    eval $1+=\$2
-  }'
-else
-  as_fn_append ()
-  {
-    eval $1=\$$1\$2
-  }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
-  eval 'as_fn_arith ()
-  {
-    as_val=$(( $* ))
-  }'
-else
-  as_fn_arith ()
-  {
-    as_val=`expr "$@" || test $? -eq 1`
-  }
-fi # as_fn_arith
-
-
-# as_fn_error STATUS ERROR [LINENO LOG_FD]
-# ----------------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with STATUS, using 1 if that was 0.
-as_fn_error ()
-{
-  as_status=$1; test $as_status -eq 0 && as_status=1
-  if test "$4"; then
-    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
-  fi
-  $as_echo "$as_me: error: $2" >&2
-  as_fn_exit $as_status
-} # as_fn_error
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-
-  as_lineno_1=$LINENO as_lineno_1a=$LINENO
-  as_lineno_2=$LINENO as_lineno_2a=$LINENO
-  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
-  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
-  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
-  sed -n '
-    p
-    /[$]LINENO/=
-  ' <$as_myself |
-    sed '
-      s/[$]LINENO.*/&-/
-      t lineno
-      b
-      :lineno
-      N
-      :loop
-      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
-      t loop
-      s/-\n.*//
-    ' >$as_me.lineno &&
-  chmod +x "$as_me.lineno" ||
-    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
-
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensitive to this).
-  . "./$as_me.lineno"
-  # Exit status is that of the last command.
-  exit
-}
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
-  case `echo 'xy\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  xy)  ECHO_C='\c';;
-  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
-       ECHO_T='	';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
-  if ln -s conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s='ln -s'
-    # ... but there are two gotchas:
-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
-  elif ln conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s=ln
-  else
-    as_ln_s='cp -p'
-  fi
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p='mkdir -p "$as_dir"'
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-	test -d "$1/.";
-      else
-	case $1 in #(
-	-*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-
-# Check that we are running under the correct shell.
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-case X$lt_ECHO in
-X*--fallback-echo)
-  # Remove one level of quotation (which was required for Make).
-  ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','`
-  ;;
-esac
-
-ECHO=${lt_ECHO-echo}
-if test "X$1" = X--no-reexec; then
-  # Discard the --no-reexec flag, and continue.
-  shift
-elif test "X$1" = X--fallback-echo; then
-  # Avoid inline document here, it may be left over
-  :
-elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
-  # Yippee, $ECHO works!
-  :
-else
-  # Restart under the correct shell.
-  exec $SHELL "$0" --no-reexec ${1+"$@"}
-fi
-
-if test "X$1" = X--fallback-echo; then
-  # used as fallback echo
-  shift
-  cat <<_LT_EOF
-$*
-_LT_EOF
-  exit 0
-fi
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-if test -z "$lt_ECHO"; then
-  if test "X${echo_test_string+set}" != Xset; then
-    # find a string as large as possible, as long as the shell can cope with it
-    for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
-      # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
-      if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
-	 { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
-      then
-        break
-      fi
-    done
-  fi
-
-  if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
-     echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
-     test "X$echo_testing_string" = "X$echo_test_string"; then
-    :
-  else
-    # The Solaris, AIX, and Digital Unix default echo programs unquote
-    # backslashes.  This makes it impossible to quote backslashes using
-    #   echo "$something" | sed 's/\\/\\\\/g'
-    #
-    # So, first we look for a working echo in the user's PATH.
-
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for dir in $PATH /usr/ucb; do
-      IFS="$lt_save_ifs"
-      if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
-         test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
-         echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
-         test "X$echo_testing_string" = "X$echo_test_string"; then
-        ECHO="$dir/echo"
-        break
-      fi
-    done
-    IFS="$lt_save_ifs"
-
-    if test "X$ECHO" = Xecho; then
-      # We didn't find a better echo, so look for alternatives.
-      if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
-         echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
-         test "X$echo_testing_string" = "X$echo_test_string"; then
-        # This shell has a builtin print -r that does the trick.
-        ECHO='print -r'
-      elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
-	   test "X$CONFIG_SHELL" != X/bin/ksh; then
-        # If we have ksh, try running configure again with it.
-        ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
-        export ORIGINAL_CONFIG_SHELL
-        CONFIG_SHELL=/bin/ksh
-        export CONFIG_SHELL
-        exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
-      else
-        # Try using printf.
-        ECHO='printf %s\n'
-        if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
-	   echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
-	   test "X$echo_testing_string" = "X$echo_test_string"; then
-	  # Cool, printf works
-	  :
-        elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
-	     test "X$echo_testing_string" = 'X\t' &&
-	     echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-	     test "X$echo_testing_string" = "X$echo_test_string"; then
-	  CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
-	  export CONFIG_SHELL
-	  SHELL="$CONFIG_SHELL"
-	  export SHELL
-	  ECHO="$CONFIG_SHELL $0 --fallback-echo"
-        elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
-	     test "X$echo_testing_string" = 'X\t' &&
-	     echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-	     test "X$echo_testing_string" = "X$echo_test_string"; then
-	  ECHO="$CONFIG_SHELL $0 --fallback-echo"
-        else
-	  # maybe with a smaller string...
-	  prev=:
-
-	  for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
-	    if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
-	    then
-	      break
-	    fi
-	    prev="$cmd"
-	  done
-
-	  if test "$prev" != 'sed 50q "$0"'; then
-	    echo_test_string=`eval $prev`
-	    export echo_test_string
-	    exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
-	  else
-	    # Oops.  We lost completely, so just stick with echo.
-	    ECHO=echo
-	  fi
-        fi
-      fi
-    fi
-  fi
-fi
-
-# Copy echo and quote the copy suitably for passing to libtool from
-# the Makefile, instead of quoting the original, which is used later.
-lt_ECHO=$ECHO
-if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
-   lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
-fi
-
-
-
-
-test -n "$DJDIR" || exec 7<&0 </dev/null
-exec 6>&1
-
-# Name of the host.
-# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
-# so uname gets run too.
-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
-#
-# Initializations.
-#
-ac_default_prefix=/usr/local
-ac_clean_files=
-ac_config_libobj_dir=.
-LIBOBJS=
-cross_compiling=no
-subdirs=
-MFLAGS=
-MAKEFLAGS=
-
-# Identity of this package.
-PACKAGE_NAME='osl'
-PACKAGE_TARNAME='osl'
-PACKAGE_VERSION='0.8.1'
-PACKAGE_STRING='osl 0.8.1'
-PACKAGE_BUGREPORT='cedric.bastoul@u-psud.fr,pouchet@cse.ohio-state.edu'
-PACKAGE_URL=''
-
-ac_unique_file="include/osl/macros.h"
-# Factoring default headers for most tests.
-ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#ifdef STDC_HEADERS
-# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-#  include <stdlib.h>
-# endif
-#endif
-#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-#  include <memory.h>
-# endif
-# include <string.h>
-#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-#ifdef HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif"
-
-ac_subst_vars='am__EXEEXT_FALSE
-am__EXEEXT_TRUE
-LTLIBOBJS
-LIBOBJS
-ac_aux_dir
-DOXYGEN
-CPP
-OTOOL64
-OTOOL
-LIPO
-NMEDIT
-DSYMUTIL
-lt_ECHO
-RANLIB
-AR
-OBJDUMP
-NM
-ac_ct_DUMPBIN
-DUMPBIN
-LD
-FGREP
-EGREP
-GREP
-SED
-host_os
-host_vendor
-host_cpu
-host
-build_os
-build_vendor
-build_cpu
-build
-LIBTOOL
-CD
-LN_S
-am__fastdepCC_FALSE
-am__fastdepCC_TRUE
-CCDEPMODE
-AMDEPBACKSLASH
-AMDEP_FALSE
-AMDEP_TRUE
-am__quote
-am__include
-DEPDIR
-OBJEXT
-EXEEXT
-ac_ct_CC
-CPPFLAGS
-LDFLAGS
-CFLAGS
-CC
-am__untar
-am__tar
-AMTAR
-am__leading_dot
-SET_MAKE
-AWK
-mkdir_p
-MKDIR_P
-INSTALL_STRIP_PROGRAM
-STRIP
-install_sh
-MAKEINFO
-AUTOHEADER
-AUTOMAKE
-AUTOCONF
-ACLOCAL
-VERSION
-PACKAGE
-CYGPATH_W
-am__isrc
-INSTALL_DATA
-INSTALL_SCRIPT
-INSTALL_PROGRAM
-target_alias
-host_alias
-build_alias
-LIBS
-ECHO_T
-ECHO_N
-ECHO_C
-DEFS
-mandir
-localedir
-libdir
-psdir
-pdfdir
-dvidir
-htmldir
-infodir
-docdir
-oldincludedir
-includedir
-localstatedir
-sharedstatedir
-sysconfdir
-datadir
-datarootdir
-libexecdir
-sbindir
-bindir
-program_transform_name
-prefix
-exec_prefix
-PACKAGE_URL
-PACKAGE_BUGREPORT
-PACKAGE_STRING
-PACKAGE_VERSION
-PACKAGE_TARNAME
-PACKAGE_NAME
-PATH_SEPARATOR
-SHELL'
-ac_subst_files=''
-ac_user_opts='
-enable_option_checking
-enable_dependency_tracking
-enable_shared
-enable_static
-with_pic
-enable_fast_install
-with_gnu_ld
-enable_libtool_lock
-with_gmp
-with_gmp_include
-with_gmp_library
-'
-      ac_precious_vars='build_alias
-host_alias
-target_alias
-CC
-CFLAGS
-LDFLAGS
-LIBS
-CPPFLAGS
-CPP'
-
-
-# Initialize some variables set by options.
-ac_init_help=
-ac_init_version=false
-ac_unrecognized_opts=
-ac_unrecognized_sep=
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-cache_file=/dev/null
-exec_prefix=NONE
-no_create=
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-verbose=
-x_includes=NONE
-x_libraries=NONE
-
-# Installation directory options.
-# These are left unexpanded so users can "make install exec_prefix=/foo"
-# and all the variables that are supposed to be based on exec_prefix
-# by default will actually change.
-# Use braces instead of parens because sh, perl, etc. also accept them.
-# (The list follows the same order as the GNU Coding Standards.)
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datarootdir='${prefix}/share'
-datadir='${datarootdir}'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
-infodir='${datarootdir}/info'
-htmldir='${docdir}'
-dvidir='${docdir}'
-pdfdir='${docdir}'
-psdir='${docdir}'
-libdir='${exec_prefix}/lib'
-localedir='${datarootdir}/locale'
-mandir='${datarootdir}/man'
-
-ac_prev=
-ac_dashdash=
-for ac_option
-do
-  # If the previous option needs an argument, assign it.
-  if test -n "$ac_prev"; then
-    eval $ac_prev=\$ac_option
-    ac_prev=
-    continue
-  fi
-
-  case $ac_option in
-  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
-  *=)   ac_optarg= ;;
-  *)    ac_optarg=yes ;;
-  esac
-
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
-  case $ac_dashdash$ac_option in
-  --)
-    ac_dashdash=yes ;;
-
-  -bindir | --bindir | --bindi | --bind | --bin | --bi)
-    ac_prev=bindir ;;
-  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
-    bindir=$ac_optarg ;;
-
-  -build | --build | --buil | --bui | --bu)
-    ac_prev=build_alias ;;
-  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
-    build_alias=$ac_optarg ;;
-
-  -cache-file | --cache-file | --cache-fil | --cache-fi \
-  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-    ac_prev=cache_file ;;
-  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
-    cache_file=$ac_optarg ;;
-
-  --config-cache | -C)
-    cache_file=config.cache ;;
-
-  -datadir | --datadir | --datadi | --datad)
-    ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=*)
-    datadir=$ac_optarg ;;
-
-  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
-  | --dataroo | --dataro | --datar)
-    ac_prev=datarootdir ;;
-  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
-  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
-    datarootdir=$ac_optarg ;;
-
-  -disable-* | --disable-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid feature name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"enable_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval enable_$ac_useropt=no ;;
-
-  -docdir | --docdir | --docdi | --doc | --do)
-    ac_prev=docdir ;;
-  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
-    docdir=$ac_optarg ;;
-
-  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
-    ac_prev=dvidir ;;
-  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
-    dvidir=$ac_optarg ;;
-
-  -enable-* | --enable-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid feature name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"enable_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval enable_$ac_useropt=\$ac_optarg ;;
-
-  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
-  | --exec | --exe | --ex)
-    ac_prev=exec_prefix ;;
-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
-  | --exec=* | --exe=* | --ex=*)
-    exec_prefix=$ac_optarg ;;
-
-  -gas | --gas | --ga | --g)
-    # Obsolete; use --with-gas.
-    with_gas=yes ;;
-
-  -help | --help | --hel | --he | -h)
-    ac_init_help=long ;;
-  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
-    ac_init_help=recursive ;;
-  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
-    ac_init_help=short ;;
-
-  -host | --host | --hos | --ho)
-    ac_prev=host_alias ;;
-  -host=* | --host=* | --hos=* | --ho=*)
-    host_alias=$ac_optarg ;;
-
-  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
-    ac_prev=htmldir ;;
-  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
-  | --ht=*)
-    htmldir=$ac_optarg ;;
-
-  -includedir | --includedir | --includedi | --included | --include \
-  | --includ | --inclu | --incl | --inc)
-    ac_prev=includedir ;;
-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
-  | --includ=* | --inclu=* | --incl=* | --inc=*)
-    includedir=$ac_optarg ;;
-
-  -infodir | --infodir | --infodi | --infod | --info | --inf)
-    ac_prev=infodir ;;
-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
-    infodir=$ac_optarg ;;
-
-  -libdir | --libdir | --libdi | --libd)
-    ac_prev=libdir ;;
-  -libdir=* | --libdir=* | --libdi=* | --libd=*)
-    libdir=$ac_optarg ;;
-
-  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
-  | --libexe | --libex | --libe)
-    ac_prev=libexecdir ;;
-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
-  | --libexe=* | --libex=* | --libe=*)
-    libexecdir=$ac_optarg ;;
-
-  -localedir | --localedir | --localedi | --localed | --locale)
-    ac_prev=localedir ;;
-  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
-    localedir=$ac_optarg ;;
-
-  -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst | --locals)
-    ac_prev=localstatedir ;;
-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
-    localstatedir=$ac_optarg ;;
-
-  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
-    ac_prev=mandir ;;
-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
-    mandir=$ac_optarg ;;
-
-  -nfp | --nfp | --nf)
-    # Obsolete; use --without-fp.
-    with_fp=no ;;
-
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c | -n)
-    no_create=yes ;;
-
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
-    no_recursion=yes ;;
-
-  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
-  | --oldin | --oldi | --old | --ol | --o)
-    ac_prev=oldincludedir ;;
-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
-    oldincludedir=$ac_optarg ;;
-
-  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-    ac_prev=prefix ;;
-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-    prefix=$ac_optarg ;;
-
-  -program-prefix | --program-prefix | --program-prefi | --program-pref \
-  | --program-pre | --program-pr | --program-p)
-    ac_prev=program_prefix ;;
-  -program-prefix=* | --program-prefix=* | --program-prefi=* \
-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
-    program_prefix=$ac_optarg ;;
-
-  -program-suffix | --program-suffix | --program-suffi | --program-suff \
-  | --program-suf | --program-su | --program-s)
-    ac_prev=program_suffix ;;
-  -program-suffix=* | --program-suffix=* | --program-suffi=* \
-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
-    program_suffix=$ac_optarg ;;
-
-  -program-transform-name | --program-transform-name \
-  | --program-transform-nam | --program-transform-na \
-  | --program-transform-n | --program-transform- \
-  | --program-transform | --program-transfor \
-  | --program-transfo | --program-transf \
-  | --program-trans | --program-tran \
-  | --progr-tra | --program-tr | --program-t)
-    ac_prev=program_transform_name ;;
-  -program-transform-name=* | --program-transform-name=* \
-  | --program-transform-nam=* | --program-transform-na=* \
-  | --program-transform-n=* | --program-transform-=* \
-  | --program-transform=* | --program-transfor=* \
-  | --program-transfo=* | --program-transf=* \
-  | --program-trans=* | --program-tran=* \
-  | --progr-tra=* | --program-tr=* | --program-t=*)
-    program_transform_name=$ac_optarg ;;
-
-  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
-    ac_prev=pdfdir ;;
-  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
-    pdfdir=$ac_optarg ;;
-
-  -psdir | --psdir | --psdi | --psd | --ps)
-    ac_prev=psdir ;;
-  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
-    psdir=$ac_optarg ;;
-
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil)
-    silent=yes ;;
-
-  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
-    ac_prev=sbindir ;;
-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
-  | --sbi=* | --sb=*)
-    sbindir=$ac_optarg ;;
-
-  -sharedstatedir | --sharedstatedir | --sharedstatedi \
-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
-  | --sharedst | --shareds | --shared | --share | --shar \
-  | --sha | --sh)
-    ac_prev=sharedstatedir ;;
-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
-  | --sha=* | --sh=*)
-    sharedstatedir=$ac_optarg ;;
-
-  -site | --site | --sit)
-    ac_prev=site ;;
-  -site=* | --site=* | --sit=*)
-    site=$ac_optarg ;;
-
-  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-    ac_prev=srcdir ;;
-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-    srcdir=$ac_optarg ;;
-
-  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
-  | --syscon | --sysco | --sysc | --sys | --sy)
-    ac_prev=sysconfdir ;;
-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
-    sysconfdir=$ac_optarg ;;
-
-  -target | --target | --targe | --targ | --tar | --ta | --t)
-    ac_prev=target_alias ;;
-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
-    target_alias=$ac_optarg ;;
-
-  -v | -verbose | --verbose | --verbos | --verbo | --verb)
-    verbose=yes ;;
-
-  -version | --version | --versio | --versi | --vers | -V)
-    ac_init_version=: ;;
-
-  -with-* | --with-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid package name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"with_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval with_$ac_useropt=\$ac_optarg ;;
-
-  -without-* | --without-*)
-    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error $? "invalid package name: $ac_useropt"
-    ac_useropt_orig=$ac_useropt
-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
-    case $ac_user_opts in
-      *"
-"with_$ac_useropt"
-"*) ;;
-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
-	 ac_unrecognized_sep=', ';;
-    esac
-    eval with_$ac_useropt=no ;;
-
-  --x)
-    # Obsolete; use --with-x.
-    with_x=yes ;;
-
-  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
-  | --x-incl | --x-inc | --x-in | --x-i)
-    ac_prev=x_includes ;;
-  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
-  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
-    x_includes=$ac_optarg ;;
-
-  -x-libraries | --x-libraries | --x-librarie | --x-librari \
-  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
-    ac_prev=x_libraries ;;
-  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
-  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
-    x_libraries=$ac_optarg ;;
-
-  -*) as_fn_error $? "unrecognized option: \`$ac_option'
-Try \`$0 --help' for more information"
-    ;;
-
-  *=*)
-    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
-    # Reject names that are not valid shell variable names.
-    case $ac_envvar in #(
-      '' | [0-9]* | *[!_$as_cr_alnum]* )
-      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
-    esac
-    eval $ac_envvar=\$ac_optarg
-    export $ac_envvar ;;
-
-  *)
-    # FIXME: should be removed in autoconf 3.0.
-    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
-    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
-    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
-    ;;
-
-  esac
-done
-
-if test -n "$ac_prev"; then
-  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
-  as_fn_error $? "missing argument to $ac_option"
-fi
-
-if test -n "$ac_unrecognized_opts"; then
-  case $enable_option_checking in
-    no) ;;
-    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
-    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
-  esac
-fi
-
-# Check all directory arguments for consistency.
-for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
-		datadir sysconfdir sharedstatedir localstatedir includedir \
-		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
-do
-  eval ac_val=\$$ac_var
-  # Remove trailing slashes.
-  case $ac_val in
-    */ )
-      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
-      eval $ac_var=\$ac_val;;
-  esac
-  # Be sure to have absolute directory names.
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* )  continue;;
-    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
-  esac
-  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
-done
-
-# There might be people who depend on the old broken behavior: `$host'
-# used to hold the argument of --host etc.
-# FIXME: To remove some day.
-build=$build_alias
-host=$host_alias
-target=$target_alias
-
-# FIXME: To remove some day.
-if test "x$host_alias" != x; then
-  if test "x$build_alias" = x; then
-    cross_compiling=maybe
-    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
-    If a cross compiler is detected then cross compile mode will be used" >&2
-  elif test "x$build_alias" != "x$host_alias"; then
-    cross_compiling=yes
-  fi
-fi
-
-ac_tool_prefix=
-test -n "$host_alias" && ac_tool_prefix=$host_alias-
-
-test "$silent" = yes && exec 6>/dev/null
-
-
-ac_pwd=`pwd` && test -n "$ac_pwd" &&
-ac_ls_di=`ls -di .` &&
-ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
-  as_fn_error $? "working directory cannot be determined"
-test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
-  as_fn_error $? "pwd does not report name of working directory"
-
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
-  ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then the parent directory.
-  ac_confdir=`$as_dirname -- "$as_myself" ||
-$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_myself" : 'X\(//\)[^/]' \| \
-	 X"$as_myself" : 'X\(//\)$' \| \
-	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  srcdir=$ac_confdir
-  if test ! -r "$srcdir/$ac_unique_file"; then
-    srcdir=..
-  fi
-else
-  ac_srcdir_defaulted=no
-fi
-if test ! -r "$srcdir/$ac_unique_file"; then
-  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
-  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
-fi
-ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
-ac_abs_confdir=`(
-	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
-	pwd)`
-# When building in place, set srcdir=.
-if test "$ac_abs_confdir" = "$ac_pwd"; then
-  srcdir=.
-fi
-# Remove unnecessary trailing slashes from srcdir.
-# Double slashes in file names in object file debugging info
-# mess up M-x gdb in Emacs.
-case $srcdir in
-*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
-esac
-for ac_var in $ac_precious_vars; do
-  eval ac_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_env_${ac_var}_value=\$${ac_var}
-  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_cv_env_${ac_var}_value=\$${ac_var}
-done
-
-#
-# Report the --help message.
-#
-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 osl 0.8.1 to adapt to many kinds of systems.
-
-Usage: $0 [OPTION]... [VAR=VALUE]...
-
-To assign environment variables (e.g., CC, CFLAGS...), specify them as
-VAR=VALUE.  See below for descriptions of some of the useful variables.
-
-Defaults for the options are specified in brackets.
-
-Configuration:
-  -h, --help              display this help and exit
-      --help=short        display options specific to this package
-      --help=recursive    display the short help of all the included packages
-  -V, --version           display version information and exit
-  -q, --quiet, --silent   do not print \`checking ...' messages
-      --cache-file=FILE   cache test results in FILE [disabled]
-  -C, --config-cache      alias for \`--cache-file=config.cache'
-  -n, --no-create         do not create output files
-      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
-
-Installation directories:
-  --prefix=PREFIX         install architecture-independent files in PREFIX
-                          [$ac_default_prefix]
-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-                          [PREFIX]
-
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
-
-For better control, use the options below.
-
-Fine tuning of the installation directories:
-  --bindir=DIR            user executables [EPREFIX/bin]
-  --sbindir=DIR           system admin executables [EPREFIX/sbin]
-  --libexecdir=DIR        program executables [EPREFIX/libexec]
-  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
-  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
-  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
-  --libdir=DIR            object code libraries [EPREFIX/lib]
-  --includedir=DIR        C header files [PREFIX/include]
-  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
-  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
-  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
-  --infodir=DIR           info documentation [DATAROOTDIR/info]
-  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
-  --mandir=DIR            man documentation [DATAROOTDIR/man]
-  --docdir=DIR            documentation root [DATAROOTDIR/doc/osl]
-  --htmldir=DIR           html documentation [DOCDIR]
-  --dvidir=DIR            dvi documentation [DOCDIR]
-  --pdfdir=DIR            pdf documentation [DOCDIR]
-  --psdir=DIR             ps documentation [DOCDIR]
-_ACEOF
-
-  cat <<\_ACEOF
-
-Program names:
-  --program-prefix=PREFIX            prepend PREFIX to installed program names
-  --program-suffix=SUFFIX            append SUFFIX to installed program names
-  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
-
-System types:
-  --build=BUILD     configure for building on BUILD [guessed]
-  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
-_ACEOF
-fi
-
-if test -n "$ac_init_help"; then
-  case $ac_init_help in
-     short | recursive ) echo "Configuration of osl 0.8.1:";;
-   esac
-  cat <<\_ACEOF
-
-Optional Features:
-  --disable-option-checking  ignore unrecognized --enable/--with options
-  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
-  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors
-  --enable-shared[=PKGS]  build shared libraries [default=yes]
-  --enable-static[=PKGS]  build static libraries [default=yes]
-  --enable-fast-install[=PKGS]
-                          optimize for fast installation [default=yes]
-  --disable-libtool-lock  avoid locking (might break parallel builds)
-
-Optional Packages:
-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --with-pic              try to use only PIC/non-PIC objects [default=use
-                          both]
-  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
-  --with-gmp=DIR          DIR where the gmp package is installed
-  --with-gmp-include=DIR  DIR where gmp.h is installed
-  --with-gmp-library=DIR  DIR where the gmp library is installed
-
-Some influential environment variables:
-  CC          C compiler command
-  CFLAGS      C compiler flags
-  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
-              nonstandard directory <lib dir>
-  LIBS        libraries to pass to the linker, e.g. -l<library>
-  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
-              you have headers in a nonstandard directory <include dir>
-  CPP         C preprocessor
-
-Use these variables to override the choices made by `configure' or to help
-it to find libraries and programs with nonstandard names/locations.
-
-Report bugs to <cedric.bastoul@u-psud.fr,pouchet@cse.ohio-state.edu>.
-_ACEOF
-ac_status=$?
-fi
-
-if test "$ac_init_help" = "recursive"; then
-  # If there are subdirs, report their specific --help.
-  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d "$ac_dir" ||
-      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
-      continue
-    ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-    cd "$ac_dir" || { ac_status=$?; continue; }
-    # Check for guested configure.
-    if test -f "$ac_srcdir/configure.gnu"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
-    elif test -f "$ac_srcdir/configure"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure" --help=recursive
-    else
-      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
-    fi || ac_status=$?
-    cd "$ac_pwd" || { ac_status=$?; break; }
-  done
-fi
-
-test -n "$ac_init_help" && exit $ac_status
-if $ac_init_version; then
-  cat <<\_ACEOF
-osl configure 0.8.1
-generated by GNU Autoconf 2.67
-
-Copyright (C) 2010 Free Software Foundation, Inc.
-This configure script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it.
-_ACEOF
-  exit
-fi
-
-## ------------------------ ##
-## Autoconf initialization. ##
-## ------------------------ ##
-
-# ac_fn_c_try_compile LINENO
-# --------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext
-  if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_compile
-
-# ac_fn_c_try_link LINENO
-# -----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 $as_test_x conftest$ac_exeext
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
-  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
-  # interfere with the next link command; also delete a directory that is
-  # left behind by Apple's compiler.  We do this before executing the actions.
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_link
-
-# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists and can be compiled using the include files in
-# INCLUDES, setting the cache variable VAR accordingly.
-ac_fn_c_check_header_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_header_compile
-
-# ac_fn_c_try_cpp LINENO
-# ----------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_cpp ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } > conftest.i && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-    ac_retval=1
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_cpp
-
-# ac_fn_c_try_run LINENO
-# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_c_try_run ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-       $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-       ac_retval=$ac_status
-fi
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_run
-
-# ac_fn_c_check_func LINENO FUNC VAR
-# ----------------------------------
-# Tests whether FUNC exists, setting the cache variable VAR accordingly
-ac_fn_c_check_func ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $2 innocuous_$2
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $2 (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $2
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $2 ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined __stub_$2 || defined __stub___$2
-choke me
-#endif
-
-int
-main ()
-{
-return $2 ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_func
-
-# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
-# -------------------------------------------
-# Tests whether TYPE exists after having included INCLUDES, setting cache
-# variable VAR accordingly.
-ac_fn_c_check_type ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=no"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof ($2))
-	 return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-if (sizeof (($2)))
-	    return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  eval "$3=yes"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_type
-
-# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_c_check_header_mongrel ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if eval "test \"\${$3+set}\"" = set; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
-  # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_header_compiler=yes
-else
-  ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <$2>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  ac_header_preproc=yes
-else
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
-  yes:no: )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-    ;;
-  no:yes:* )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( $as_echo "## ppppppppppppppppppppppppppppppppppppppp ##
-## Report this to cedric.bastoul@u-psud.fr ##
-## ppppppppppppppppppppppppppppppppppppppp ##"
-     ) | sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
-
-} # ac_fn_c_check_header_mongrel
-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 osl $as_me 0.8.1, which was
-generated by GNU Autoconf 2.67.  Invocation command line was
-
-  $ $0 $@
-
-_ACEOF
-exec 5>>config.log
-{
-cat <<_ASUNAME
-## --------- ##
-## Platform. ##
-## --------- ##
-
-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
-
-/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
-/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
-/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
-
-_ASUNAME
-
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    $as_echo "PATH: $as_dir"
-  done
-IFS=$as_save_IFS
-
-} >&5
-
-cat >&5 <<_ACEOF
-
-
-## ----------- ##
-## Core tests. ##
-## ----------- ##
-
-_ACEOF
-
-
-# Keep a trace of the command line.
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Strip out --silent because we don't want to record it for future runs.
-# Also quote any args containing shell meta-characters.
-# Make two passes to allow for proper duplicate-argument suppression.
-ac_configure_args=
-ac_configure_args0=
-ac_configure_args1=
-ac_must_keep_next=false
-for ac_pass in 1 2
-do
-  for ac_arg
-  do
-    case $ac_arg in
-    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
-    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-    | -silent | --silent | --silen | --sile | --sil)
-      continue ;;
-    *\'*)
-      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    case $ac_pass in
-    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
-    2)
-      as_fn_append ac_configure_args1 " '$ac_arg'"
-      if test $ac_must_keep_next = true; then
-	ac_must_keep_next=false # Got value, back to normal.
-      else
-	case $ac_arg in
-	  *=* | --config-cache | -C | -disable-* | --disable-* \
-	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
-	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
-	  | -with-* | --with-* | -without-* | --without-* | --x)
-	    case "$ac_configure_args0 " in
-	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
-	    esac
-	    ;;
-	  -* ) ac_must_keep_next=true ;;
-	esac
-      fi
-      as_fn_append ac_configure_args " '$ac_arg'"
-      ;;
-    esac
-  done
-done
-{ ac_configure_args0=; unset ac_configure_args0;}
-{ ac_configure_args1=; unset ac_configure_args1;}
-
-# When interrupted or exit'd, cleanup temporary files, and complete
-# config.log.  We remove comments because anyway the quotes in there
-# would cause problems or look ugly.
-# WARNING: Use '\'' to represent an apostrophe within the trap.
-# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
-trap 'exit_status=$?
-  # Save into config.log some information that might help in debugging.
-  {
-    echo
-
-    $as_echo "## ---------------- ##
-## Cache variables. ##
-## ---------------- ##"
-    echo
-    # The following way of writing the cache mishandles newlines in values,
-(
-  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) { eval $ac_var=; unset $ac_var;} ;;
-      esac ;;
-    esac
-  done
-  (set) 2>&1 |
-    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      sed -n \
-	"s/'\''/'\''\\\\'\'''\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
-      ;; #(
-    *)
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-)
-    echo
-
-    $as_echo "## ----------------- ##
-## Output variables. ##
-## ----------------- ##"
-    echo
-    for ac_var in $ac_subst_vars
-    do
-      eval ac_val=\$$ac_var
-      case $ac_val in
-      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-      esac
-      $as_echo "$ac_var='\''$ac_val'\''"
-    done | sort
-    echo
-
-    if test -n "$ac_subst_files"; then
-      $as_echo "## ------------------- ##
-## File substitutions. ##
-## ------------------- ##"
-      echo
-      for ac_var in $ac_subst_files
-      do
-	eval ac_val=\$$ac_var
-	case $ac_val in
-	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-	esac
-	$as_echo "$ac_var='\''$ac_val'\''"
-      done | sort
-      echo
-    fi
-
-    if test -s confdefs.h; then
-      $as_echo "## ----------- ##
-## confdefs.h. ##
-## ----------- ##"
-      echo
-      cat confdefs.h
-      echo
-    fi
-    test "$ac_signal" != 0 &&
-      $as_echo "$as_me: caught signal $ac_signal"
-    $as_echo "$as_me: exit $exit_status"
-  } >&5
-  rm -f core *.core core.conftest.* &&
-    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
-    exit $exit_status
-' 0
-for ac_signal in 1 2 13 15; do
-  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
-done
-ac_signal=0
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -f -r conftest* confdefs.h
-
-$as_echo "/* confdefs.h */" > confdefs.h
-
-# Predefined preprocessor variables.
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
-
-
-# Let the site file select an alternate cache file if it wants to.
-# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
-if test -n "$CONFIG_SITE"; then
-  # We do not want a PATH search for config.site.
-  case $CONFIG_SITE in #((
-    -*)  ac_site_file1=./$CONFIG_SITE;;
-    */*) ac_site_file1=$CONFIG_SITE;;
-    *)   ac_site_file1=./$CONFIG_SITE;;
-  esac
-elif test "x$prefix" != xNONE; then
-  ac_site_file1=$prefix/share/config.site
-  ac_site_file2=$prefix/etc/config.site
-else
-  ac_site_file1=$ac_default_prefix/share/config.site
-  ac_site_file2=$ac_default_prefix/etc/config.site
-fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
-do
-  test "x$ac_site_file" = xNONE && continue
-  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
-    sed 's/^/| /' "$ac_site_file" >&5
-    . "$ac_site_file" \
-      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "failed to load site script $ac_site_file
-See \`config.log' for more details" "$LINENO" 5 ; }
-  fi
-done
-
-if test -r "$cache_file"; then
-  # Some versions of bash will fail to source /dev/null (special files
-  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
-  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
-    case $cache_file in
-      [\\/]* | ?:[\\/]* ) . "$cache_file";;
-      *)                      . "./$cache_file";;
-    esac
-  fi
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
-  >$cache_file
-fi
-
-# Check that the precious variables saved in the cache have kept the same
-# value.
-ac_cache_corrupted=false
-for ac_var in $ac_precious_vars; do
-  eval ac_old_set=\$ac_cv_env_${ac_var}_set
-  eval ac_new_set=\$ac_env_${ac_var}_set
-  eval ac_old_val=\$ac_cv_env_${ac_var}_value
-  eval ac_new_val=\$ac_env_${ac_var}_value
-  case $ac_old_set,$ac_new_set in
-    set,)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,set)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,);;
-    *)
-      if test "x$ac_old_val" != "x$ac_new_val"; then
-	# differences in whitespace do not lead to failure.
-	ac_old_val_w=`echo x $ac_old_val`
-	ac_new_val_w=`echo x $ac_new_val`
-	if test "$ac_old_val_w" != "$ac_new_val_w"; then
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
-	  ac_cache_corrupted=:
-	else
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
-	  eval $ac_var=\$ac_old_val
-	fi
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
-$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
-$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
-      fi;;
-  esac
-  # Pass precious variables to config.status.
-  if test "$ac_new_set" = set; then
-    case $ac_new_val in
-    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
-    *) ac_arg=$ac_var=$ac_new_val ;;
-    esac
-    case " $ac_configure_args " in
-      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
-      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
-    esac
-  fi
-done
-if $ac_cache_corrupted; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
-fi
-## -------------------- ##
-## Main body of script. ##
-## -------------------- ##
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-ac_aux_dir=
-for ac_dir in autoconf "$srcdir"/autoconf; do
-  if test -f "$ac_dir/install-sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install-sh -c"
-    break
-  elif test -f "$ac_dir/install.sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install.sh -c"
-    break
-  elif test -f "$ac_dir/shtool"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/shtool install -c"
-    break
-  fi
-done
-if test -z "$ac_aux_dir"; then
-  as_fn_error $? "cannot find install-sh, install.sh, or shtool in autoconf \"$srcdir\"/autoconf" "$LINENO" 5
-fi
-
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
-
-
-am__api_version='1.11'
-
-# Find a good install program.  We prefer a C program (faster),
-# so one script is as good as another.  But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AmigaOS /C/install, which installs bootblocks on floppy discs
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# OS/2's system install, which has a completely different semantic
-# ./install, which can be erroneously created by make from ./install.sh.
-# Reject install programs that cannot install multiple files.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
-$as_echo_n "checking for a BSD-compatible install... " >&6; }
-if test -z "$INSTALL"; then
-if test "${ac_cv_path_install+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in #((
-  ./ | .// | /[cC]/* | \
-  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
-  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
-  /usr/ucb/* ) ;;
-  *)
-    # OSF1 and SCO ODT 3.0 have their own names for install.
-    # Don't use installbsd from OSF since it installs stuff as root
-    # by default.
-    for ac_prog in ginstall scoinst install; do
-      for ac_exec_ext in '' $ac_executable_extensions; do
-	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
-	  if test $ac_prog = install &&
-	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # AIX install.  It has an incompatible calling convention.
-	    :
-	  elif test $ac_prog = install &&
-	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # program-specific install script used by HP pwplus--don't use.
-	    :
-	  else
-	    rm -rf conftest.one conftest.two conftest.dir
-	    echo one > conftest.one
-	    echo two > conftest.two
-	    mkdir conftest.dir
-	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
-	      test -s conftest.one && test -s conftest.two &&
-	      test -s conftest.dir/conftest.one &&
-	      test -s conftest.dir/conftest.two
-	    then
-	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
-	      break 3
-	    fi
-	  fi
-	fi
-      done
-    done
-    ;;
-esac
-
-  done
-IFS=$as_save_IFS
-
-rm -rf conftest.one conftest.two conftest.dir
-
-fi
-  if test "${ac_cv_path_install+set}" = set; then
-    INSTALL=$ac_cv_path_install
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for INSTALL within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    INSTALL=$ac_install_sh
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
-$as_echo "$INSTALL" >&6; }
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
-$as_echo_n "checking whether build environment is sane... " >&6; }
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Reject unsafe characters in $srcdir or the absolute working directory
-# name.  Accept space and tab only in the latter.
-am_lf='
-'
-case `pwd` in
-  *[\\\"\#\$\&\'\`$am_lf]*)
-    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5 ;;
-esac
-case $srcdir in
-  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
-    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5 ;;
-esac
-
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
-   if test "$*" = "X"; then
-      # -L didn't work.
-      set X `ls -t "$srcdir/configure" conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$*" != "X $srcdir/configure conftest.file" \
-      && test "$*" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
-alias in your environment" "$LINENO" 5
-   fi
-
-   test "$2" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   as_fn_error $? "newly created file is older than distributed files!
-Check your system clock" "$LINENO" 5
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-test "$program_prefix" != NONE &&
-  program_transform_name="s&^&$program_prefix&;$program_transform_name"
-# Use a double $ so make ignores it.
-test "$program_suffix" != NONE &&
-  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
-# Double any \ or $.
-# By default was `s,x,x', remove it if useless.
-ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
-program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
-
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-
-if test x"${MISSING+set}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
-  *)
-    MISSING="\${SHELL} $am_aux_dir/missing" ;;
-  esac
-fi
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
-$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
-fi
-
-if test x"${install_sh}" != xset; then
-  case $am_aux_dir in
-  *\ * | *\	*)
-    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
-  *)
-    install_sh="\${SHELL} $am_aux_dir/install-sh"
-  esac
-fi
-
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-if test "$cross_compiling" != no; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
-$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
-if test -z "$MKDIR_P"; then
-  if test "${ac_cv_path_mkdir+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in mkdir gmkdir; do
-	 for ac_exec_ext in '' $ac_executable_extensions; do
-	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
-	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
-	     'mkdir (GNU coreutils) '* | \
-	     'mkdir (coreutils) '* | \
-	     'mkdir (fileutils) '4.1*)
-	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
-	       break 3;;
-	   esac
-	 done
-       done
-  done
-IFS=$as_save_IFS
-
-fi
-
-  test -d ./--version && rmdir ./--version
-  if test "${ac_cv_path_mkdir+set}" = set; then
-    MKDIR_P="$ac_cv_path_mkdir -p"
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for MKDIR_P within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    MKDIR_P="$ac_install_sh -d"
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
-$as_echo "$MKDIR_P" >&6; }
-
-mkdir_p="$MKDIR_P"
-case $mkdir_p in
-  [\\/$]* | ?:[\\/]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-
-for ac_prog in gawk mawk nawk awk
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_AWK+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$AWK"; then
-  ac_cv_prog_AWK="$AWK" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_AWK="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-AWK=$ac_cv_prog_AWK
-if test -n "$AWK"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
-$as_echo "$AWK" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$AWK" && break
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
-set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.make <<\_ACEOF
-SHELL = /bin/sh
-all:
-	@echo '@@@%%%=$(MAKE)=@@@%%%'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
-case `${MAKE-make} -f conftest.make 2>/dev/null` in
-  *@@@%%%=?*=@@@%%%*)
-    eval ac_cv_prog_make_${ac_make}_set=yes;;
-  *)
-    eval ac_cv_prog_make_${ac_make}_set=no;;
-esac
-rm -f conftest.make
-fi
-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-  SET_MAKE=
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-  SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
-else
-  am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  am__isrc=' -I$(srcdir)'
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-
-
-# Define the identity of the package.
- PACKAGE='osl'
- VERSION='0.8.1'
-
-
-# Some tools Automake needs.
-
-ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
-
-
-AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
-
-
-AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
-
-
-AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
-
-
-MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
-
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-# Always define AMTAR for backward compatibility.
-
-AMTAR=${AMTAR-"${am_missing_run}tar"}
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5
-$as_echo_n "checking how to create a ustar tar archive... " >&6; }
-# Loop over all known methods to create a tar archive until one works.
-_am_tools='gnutar plaintar pax cpio none'
-_am_tools=${am_cv_prog_tar_ustar-$_am_tools}
-# Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of `-'.
-for _am_tool in $_am_tools
-do
-  case $_am_tool in
-  gnutar)
-    for _am_tar in tar gnutar gtar;
-    do
-      { echo "$as_me:$LINENO: $_am_tar --version" >&5
-   ($_am_tar --version) >&5 2>&5
-   ac_status=$?
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   (exit $ac_status); } && break
-    done
-    am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"'
-    am__tar_="$_am_tar --format=ustar -chf - "'"$tardir"'
-    am__untar="$_am_tar -xf -"
-    ;;
-  plaintar)
-    # Must skip GNU tar: if it does not support --format= it doesn't create
-    # ustar tarball either.
-    (tar --version) >/dev/null 2>&1 && continue
-    am__tar='tar chf - "$$tardir"'
-    am__tar_='tar chf - "$tardir"'
-    am__untar='tar xf -'
-    ;;
-  pax)
-    am__tar='pax -L -x ustar -w "$$tardir"'
-    am__tar_='pax -L -x ustar -w "$tardir"'
-    am__untar='pax -r'
-    ;;
-  cpio)
-    am__tar='find "$$tardir" -print | cpio -o -H ustar -L'
-    am__tar_='find "$tardir" -print | cpio -o -H ustar -L'
-    am__untar='cpio -i -H ustar -d'
-    ;;
-  none)
-    am__tar=false
-    am__tar_=false
-    am__untar=false
-    ;;
-  esac
-
-  # If the value was cached, stop now.  We just wanted to have am__tar
-  # and am__untar set.
-  test -n "${am_cv_prog_tar_ustar}" && break
-
-  # tar/untar a dummy directory, and stop if the command works
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  echo GrepMe > conftest.dir/file
-  { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5
-   (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5
-   ac_status=$?
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   (exit $ac_status); }
-  rm -rf conftest.dir
-  if test -s conftest.tar; then
-    { echo "$as_me:$LINENO: $am__untar <conftest.tar" >&5
-   ($am__untar <conftest.tar) >&5 2>&5
-   ac_status=$?
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   (exit $ac_status); }
-    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
-  fi
-done
-rm -rf conftest.dir
-
-if test "${am_cv_prog_tar_ustar+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  am_cv_prog_tar_ustar=$_am_tool
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5
-$as_echo "$am_cv_prog_tar_ustar" >&6; }
-
-
-
-
-
-
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="gcc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
-          if test -n "$ac_tool_prefix"; then
-    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  fi
-fi
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_CC="cc"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
-  fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl.exe
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$CC" && break
-  done
-fi
-if test -z "$CC"; then
-  ac_ct_CC=$CC
-  for ac_prog in cl.exe
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_CC" && break
-done
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-fi
-
-fi
-
-
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5 ; }
-
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
-  { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    sed '10a\
-... rest of stderr output deleted ...
-         10q' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-  fi
-  rm -f conftest.er1 conftest.err
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-done
-
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-
-# The possible output files:
-ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
-
-ac_rmfiles=
-for ac_file in $ac_files
-do
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
-  esac
-done
-rm -f $ac_rmfiles
-
-if { { ac_try="$ac_link_default"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link_default") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
-# in a Makefile.  We should not override ac_cv_exeext if it was cached,
-# so that the user can short-circuit this test for compilers unknown to
-# Autoconf.
-for ac_file in $ac_files ''
-do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
-	;;
-    [ab].out )
-	# We found the default executable, but exeext='' is most
-	# certainly right.
-	break;;
-    *.* )
-	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
-	then :; else
-	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	fi
-	# We set ac_cv_exeext here because the later test for it is not
-	# safe: cross compilers may not add the suffix if given an `-o'
-	# argument, so we may need to know it at that point already.
-	# Even if this section looks crufty: it has the advantage of
-	# actually working.
-	break;;
-    * )
-	break;;
-  esac
-done
-test "$ac_cv_exeext" = no && ac_cv_exeext=
-
-else
-  ac_file=''
-fi
-if test -z "$ac_file"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "C compiler cannot create executables
-See \`config.log' for more details" "$LINENO" 5 ; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
-ac_exeext=$ac_cv_exeext
-
-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
-if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
-    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	  break;;
-    * ) break;;
-  esac
-done
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details" "$LINENO" 5 ; }
-fi
-rm -f conftest conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-int
-main ()
-{
-FILE *f = fopen ("conftest.out", "w");
- return ferror (f) || fclose (f) != 0;
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files="$ac_clean_files conftest.out"
-# Check that the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
-if test "$cross_compiling" != yes; then
-  { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-  if { ac_try='./conftest$ac_cv_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then
-    cross_compiling=no
-  else
-    if test "$cross_compiling" = maybe; then
-	cross_compiling=yes
-    else
-	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details" "$LINENO" 5 ; }
-    fi
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
-
-rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if test "${ac_cv_objext+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then :
-  for ac_file in conftest.o conftest.obj conftest.*; do
-  test -f "$ac_file" || continue;
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
-    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
-       break;;
-  esac
-done
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details" "$LINENO" 5 ; }
-fi
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if test "${ac_cv_c_compiler_gnu+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_compiler_gnu=yes
-else
-  ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
-  GCC=yes
-else
-  GCC=
-fi
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if test "${ac_cv_prog_cc_g+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_save_c_werror_flag=$ac_c_werror_flag
-   ac_c_werror_flag=yes
-   ac_cv_prog_cc_g=no
-   CFLAGS="-g"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-else
-  CFLAGS=""
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  ac_c_werror_flag=$ac_save_c_werror_flag
-	 CFLAGS="-g"
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if test "${ac_cv_prog_cc_c89+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
-     char **p;
-     int i;
-{
-  return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
-  char *s;
-  va_list v;
-  va_start (v,p);
-  s = g (p, va_arg (v,int));
-  va_end (v);
-  return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
-   function prototypes and stuff, but not '\xHH' hex character constants.
-   These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std is added to get
-   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
-   array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std.  */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
-   inside strings and character constants.  */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
-  ;
-  return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
-	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_prog_cc_c89=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
-  test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
-  x)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
-  xno)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
-  *)
-    CC="$CC $ac_cv_prog_cc_c89"
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
-
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-DEPDIR="${am__leading_dot}deps"
-
-ac_config_commands="$ac_config_commands depfiles"
-
-
-am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-	@echo this is the am__doit target
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
-$as_echo_n "checking for style of include used by $am_make... " >&6; }
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
-  am__include=include
-  am__quote=
-  _am_result=GNU
-  ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   case `$am_make -s -f confmf 2> /dev/null` in #(
-   *the\ am__doit\ target*)
-     am__include=.include
-     am__quote="\""
-     _am_result=BSD
-     ;;
-   esac
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
-$as_echo "$_am_result" >&6; }
-rm -f confinc confmf
-
-# Check whether --enable-dependency-tracking was given.
-if test "${enable_dependency_tracking+set}" = set; then :
-  enableval=$enable_dependency_tracking;
-fi
-
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-fi
- if test "x$enable_dependency_tracking" != xno; then
-  AMDEP_TRUE=
-  AMDEP_FALSE='#'
-else
-  AMDEP_TRUE='#'
-  AMDEP_FALSE=
-fi
-
-
-
-depcc="$CC"   am_compiler_list=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_CC_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  am__universal=false
-  case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvisualcpp | msvcmsys)
-      # This compiler won't grok `-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CC_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CC_dependencies_compiler_type=none
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
-CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
-
- if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
-  am__fastdepCC_TRUE=
-  am__fastdepCC_FALSE='#'
-else
-  am__fastdepCC_TRUE='#'
-  am__fastdepCC_FALSE=
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
-$as_echo_n "checking whether ln -s works... " >&6; }
-LN_S=$as_ln_s
-if test "$LN_S" = "ln -s"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
-$as_echo "no, using $LN_S" >&6; }
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
-set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\"" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat >conftest.make <<\_ACEOF
-SHELL = /bin/sh
-all:
-	@echo '@@@%%%=$(MAKE)=@@@%%%'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
-case `${MAKE-make} -f conftest.make 2>/dev/null` in
-  *@@@%%%=?*=@@@%%%*)
-    eval ac_cv_prog_make_${ac_make}_set=yes;;
-  *)
-    eval ac_cv_prog_make_${ac_make}_set=no;;
-esac
-rm -f conftest.make
-fi
-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-  SET_MAKE=
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-  SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-# Extract the first word of "cd", so it can be a program name with args.
-set dummy cd; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$CD"; then
-  ac_cv_prog_CD="$CD" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CD=""
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-CD=$ac_cv_prog_CD
-if test -n "$CD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CD" >&5
-$as_echo "$CD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-case `pwd` in
-  *\ * | *\	*)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
-$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
-esac
-
-
-
-macro_version='2.2.6b'
-macro_revision='1.3017'
-
-
-
-
-
-
-
-
-
-
-
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if test "${ac_cv_build+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
-  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
-test "x$ac_build_alias" = x &&
-  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5 ;;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if test "${ac_cv_host+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "x$host_alias" = x; then
-  ac_cv_host=$ac_cv_build
-else
-  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
-    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
-case $ac_cv_host in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5 ;;
-esac
-host=$ac_cv_host
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_host
-shift
-host_cpu=$1
-host_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-host_os=$*
-IFS=$ac_save_IFS
-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
-$as_echo_n "checking for a sed that does not truncate output... " >&6; }
-if test "${ac_cv_path_SED+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
-     for ac_i in 1 2 3 4 5 6 7; do
-       ac_script="$ac_script$as_nl$ac_script"
-     done
-     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
-     { ac_script=; unset ac_script;}
-     if test -z "$SED"; then
-  ac_path_SED_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
-# Check for GNU ac_path_SED and select it if it is found.
-  # Check for GNU $ac_path_SED
-case `"$ac_path_SED" --version 2>&1` in
-*GNU*)
-  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo '' >> "conftest.nl"
-    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_SED_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_SED="$ac_path_SED"
-      ac_path_SED_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_SED_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_SED"; then
-    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
-  fi
-else
-  ac_cv_path_SED=$SED
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
-$as_echo "$ac_cv_path_SED" >&6; }
- SED="$ac_cv_path_SED"
-  rm -f conftest.sed
-
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-
-
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if test "${ac_cv_path_GREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$GREP"; then
-  ac_path_GREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in grep ggrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
-# Check for GNU ac_path_GREP and select it if it is found.
-  # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'GREP' >> "conftest.nl"
-    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_GREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_GREP="$ac_path_GREP"
-      ac_path_GREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_GREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_GREP"; then
-    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if test "${ac_cv_path_EGREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
-   then ac_cv_path_EGREP="$GREP -E"
-   else
-     if test -z "$EGREP"; then
-  ac_path_EGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in egrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
-  # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'EGREP' >> "conftest.nl"
-    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_EGREP="$ac_path_EGREP"
-      ac_path_EGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_EGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_EGREP"; then
-    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_EGREP=$EGREP
-fi
-
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
-$as_echo_n "checking for fgrep... " >&6; }
-if test "${ac_cv_path_FGREP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
-   then ac_cv_path_FGREP="$GREP -F"
-   else
-     if test -z "$FGREP"; then
-  ac_path_FGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in fgrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
-# Check for GNU ac_path_FGREP and select it if it is found.
-  # Check for GNU $ac_path_FGREP
-case `"$ac_path_FGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'FGREP' >> "conftest.nl"
-    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_FGREP="$ac_path_FGREP"
-      ac_path_FGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-      $ac_path_FGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_FGREP"; then
-    as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_FGREP=$FGREP
-fi
-
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
-$as_echo "$ac_cv_path_FGREP" >&6; }
- FGREP="$ac_cv_path_FGREP"
-
-
-test -z "$GREP" && GREP=grep
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | ?:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if test "${lt_cv_path_LD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if test "${lt_cv_prog_gnu_ld+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
-$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
-if test "${lt_cv_path_NM+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  : ${lt_cv_path_NM=no}
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
-$as_echo "$lt_cv_path_NM" >&6; }
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
-else
-  # Didn't find any BSD compatible name lister, look for dumpbin.
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in "dumpbin -symbols" "link -dump -symbols"
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_DUMPBIN+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DUMPBIN"; then
-  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DUMPBIN=$ac_cv_prog_DUMPBIN
-if test -n "$DUMPBIN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
-$as_echo "$DUMPBIN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-    test -n "$DUMPBIN" && break
-  done
-fi
-if test -z "$DUMPBIN"; then
-  ac_ct_DUMPBIN=$DUMPBIN
-  for ac_prog in "dumpbin -symbols" "link -dump -symbols"
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DUMPBIN"; then
-  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
-if test -n "$ac_ct_DUMPBIN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
-$as_echo "$ac_ct_DUMPBIN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$ac_ct_DUMPBIN" && break
-done
-
-  if test "x$ac_ct_DUMPBIN" = x; then
-    DUMPBIN=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DUMPBIN=$ac_ct_DUMPBIN
-  fi
-fi
-
-
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
-  fi
-fi
-test -z "$NM" && NM=nm
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
-$as_echo_n "checking the name lister ($NM) interface... " >&6; }
-if test "${lt_cv_nm_interface+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_nm_interface="BSD nm"
-  echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:4689: $ac_compile\"" >&5)
-  (eval "$ac_compile" 2>conftest.err)
-  cat conftest.err >&5
-  (eval echo "\"\$as_me:4692: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
-  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
-  cat conftest.err >&5
-  (eval echo "\"\$as_me:4695: output\"" >&5)
-  cat conftest.out >&5
-  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
-    lt_cv_nm_interface="MS dumpbin"
-  fi
-  rm -f conftest*
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
-$as_echo "$lt_cv_nm_interface" >&6; }
-
-# find the maximum length of command line arguments
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
-$as_echo_n "checking the maximum length of command line arguments... " >&6; }
-if test "${lt_cv_sys_max_cmd_len+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-    i=0
-  teststring="ABCD"
-
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
-
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
-
-  cygwin* | mingw* | cegcc*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
-
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
-
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    else
-      # Make teststring a little bigger before we do anything with it.
-      # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
-        teststring=$teststring$teststring
-      done
-      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-      # If test is not a shell built-in, we'll probably end up computing a
-      # maximum length that is only half of the actual maximum length, but
-      # we can't tell.
-      while { test "X"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \
-	         = "XX$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
-      do
-        i=`expr $i + 1`
-        teststring=$teststring$teststring
-      done
-      # Only check the string length outside the loop.
-      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
-      teststring=
-      # Add a significant safety factor because C++ compilers can tack on
-      # massive amounts of additional arguments before passing them to the
-      # linker.  It appears as though 1/2 is a usable value.
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    fi
-    ;;
-  esac
-
-fi
-
-if test -n $lt_cv_sys_max_cmd_len ; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
-$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
-$as_echo "none" >&6; }
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-
-
-
-
-
-
-: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
-$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
-$as_echo "$xsi_shell" >&6; }
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
-$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
-$as_echo "$lt_shell_append" >&6; }
-
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  lt_unset=unset
-else
-  lt_unset=false
-fi
-
-
-
-
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  lt_SP2NL='tr \040 \012'
-  lt_NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  lt_SP2NL='tr \100 \n'
-  lt_NL2SP='tr \r\n \100\100'
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
-$as_echo_n "checking for $LD option to reload object files... " >&6; }
-if test "${lt_cv_ld_reload_flag+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_reload_flag='-r'
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
-$as_echo "$lt_cv_ld_reload_flag" >&6; }
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
-set dummy ${ac_tool_prefix}objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OBJDUMP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OBJDUMP"; then
-  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OBJDUMP=$ac_cv_prog_OBJDUMP
-if test -n "$OBJDUMP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
-$as_echo "$OBJDUMP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OBJDUMP"; then
-  ac_ct_OBJDUMP=$OBJDUMP
-  # Extract the first word of "objdump", so it can be a program name with args.
-set dummy objdump; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OBJDUMP"; then
-  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OBJDUMP="objdump"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
-if test -n "$ac_ct_OBJDUMP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
-$as_echo "$ac_ct_OBJDUMP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OBJDUMP" = x; then
-    OBJDUMP="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OBJDUMP=$ac_ct_OBJDUMP
-  fi
-else
-  OBJDUMP="$ac_cv_prog_OBJDUMP"
-fi
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-
-
-
-
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
-$as_echo_n "checking how to recognize dependent libraries... " >&6; }
-if test "${lt_cv_deplibs_check_method+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[4-9]*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[45]*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump',
-  # unless we find 'file', for example because we are cross-compiling.
-  if ( file / ) >/dev/null 2>&1; then
-    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-    lt_cv_file_magic_cmd='func_win32_libid'
-  else
-    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
-    lt_cv_file_magic_cmd='$OBJDUMP -f'
-  fi
-  ;;
-
-cegcc)
-  # use the weaker test based on 'objdump'. See mingw*.
-  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
-
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-freebsd* | dragonfly*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
-
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
-
-interix[3-9]*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd* | netbsdelf*-gnu)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
-  fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-*nto* | *qnx*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
-  fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-rdos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-tpf*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
-$as_echo "$lt_cv_deplibs_check_method" >&6; }
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_AR+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$AR"; then
-  ac_cv_prog_AR="$AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_AR="${ac_tool_prefix}ar"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-AR=$ac_cv_prog_AR
-if test -n "$AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
-$as_echo "$AR" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_AR"; then
-  ac_ct_AR=$AR
-  # Extract the first word of "ar", so it can be a program name with args.
-set dummy ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_AR+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_AR"; then
-  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_AR="ar"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_AR=$ac_cv_prog_ac_ct_AR
-if test -n "$ac_ct_AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
-$as_echo "$ac_ct_AR" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_AR" = x; then
-    AR="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    AR=$ac_ct_AR
-  fi
-else
-  AR="$ac_cv_prog_AR"
-fi
-
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-
-
-
-
-
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-test -z "$STRIP" && STRIP=:
-
-
-
-
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_RANLIB+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
-  ac_ct_RANLIB=$RANLIB
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_RANLIB"; then
-  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_RANLIB="ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_RANLIB" = x; then
-    RANLIB=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    RANLIB=$ac_ct_RANLIB
-  fi
-else
-  RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-test -z "$RANLIB" && RANLIB=:
-
-
-
-
-
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
-$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
-if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[BCDEGRST]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[BCDT]'
-  ;;
-cygwin* | mingw* | pw32* | cegcc*)
-  symcode='[ABCDGISTW]'
-  ;;
-hpux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[ABCDEGRST]'
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[BCDEGRST]'
-  ;;
-osf*)
-  symcode='[BCDEGQRST]'
-  ;;
-solaris*)
-  symcode='[BDRT]'
-  ;;
-sco3.2v5*)
-  symcode='[DT]'
-  ;;
-sysv4.2uw2*)
-  symcode='[DT]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[ABDT]'
-  ;;
-sysv4)
-  symcode='[DFNSTU]'
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[ABCDGIRSTW]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
-    # Also find C++ and __fastcall symbols from MSVC++,
-    # which start with @ or ?.
-    lt_cv_sys_global_symbol_pipe="$AWK '"\
-"     {last_section=section; section=\$ 3};"\
-"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-"     \$ 0!~/External *\|/{next};"\
-"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-"     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-"     ' prfx=^$ac_symprfx"
-  else
-    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-  fi
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\""; } >&5
-  (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
-	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<_LT_EOF > conftest.$ac_ext
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
-	  cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols.  */
-const struct {
-  const char *name;
-  void       *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[] =
-{
-  { "@PROGRAM@", (void *) 0 },
-_LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
-	  cat <<\_LT_EOF >> conftest.$ac_ext
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_save_LIBS="$LIBS"
-	  lt_save_CFLAGS="$CFLAGS"
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS="$lt_save_LIBS"
-	  CFLAGS="$lt_save_CFLAGS"
-	else
-	  echo "cannot find nm_test_func in $nlist" >&5
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&5
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
-    fi
-  else
-    echo "$progname: failed program was:" >&5
-    cat conftest.$ac_ext >&5
-  fi
-  rm -rf conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-
-fi
-
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
-$as_echo "failed" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
-$as_echo "ok" >&6; }
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# Check whether --enable-libtool-lock was given.
-if test "${enable_libtool_lock+set}" = set; then :
-  enableval=$enable_libtool_lock;
-fi
-
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.$ac_objext` in
-      *ELF-32*)
-	HPUX_IA64_MODE="32"
-	;;
-      *ELF-64*)
-	HPUX_IA64_MODE="64"
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '#line 5890 "configure"' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -melf32bsmip"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -melf32bmipn32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -melf64bmip"
-	;;
-      esac
-    else
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -32"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -n32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -64"
-	  ;;
-      esac
-    fi
-  fi
-  rm -rf conftest*
-  ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.o` in
-      *32-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_i386_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_i386"
-	    ;;
-	  ppc64-*linux*|powerpc64-*linux*)
-	    LD="${LD-ld} -m elf32ppclinux"
-	    ;;
-	  s390x-*linux*)
-	    LD="${LD-ld} -m elf_s390"
-	    ;;
-	  sparc64-*linux*)
-	    LD="${LD-ld} -m elf32_sparc"
-	    ;;
-	esac
-	;;
-      *64-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_x86_64_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_x86_64"
-	    ;;
-	  ppc*-*linux*|powerpc*-*linux*)
-	    LD="${LD-ld} -m elf64ppc"
-	    ;;
-	  s390*-*linux*|s390*-*tpf*)
-	    LD="${LD-ld} -m elf64_s390"
-	    ;;
-	  sparc*-*linux*)
-	    LD="${LD-ld} -m elf64_sparc"
-	    ;;
-	esac
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
-$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
-if test "${lt_cv_cc_needs_belf+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_cc_needs_belf=yes
-else
-  lt_cv_cc_needs_belf=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-     ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
-$as_echo "$lt_cv_cc_needs_belf" >&6; }
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-sparc*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*) LD="${LD-ld} -m elf64_sparc" ;;
-      *)
-	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
-	  LD="${LD-ld} -64"
-	fi
-	;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-esac
-
-need_locks="$enable_libtool_lock"
-
-
-  case $host_os in
-    rhapsody* | darwin*)
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
-set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_DSYMUTIL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DSYMUTIL"; then
-  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DSYMUTIL=$ac_cv_prog_DSYMUTIL
-if test -n "$DSYMUTIL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
-$as_echo "$DSYMUTIL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_DSYMUTIL"; then
-  ac_ct_DSYMUTIL=$DSYMUTIL
-  # Extract the first word of "dsymutil", so it can be a program name with args.
-set dummy dsymutil; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_DSYMUTIL"; then
-  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
-if test -n "$ac_ct_DSYMUTIL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
-$as_echo "$ac_ct_DSYMUTIL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_DSYMUTIL" = x; then
-    DSYMUTIL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DSYMUTIL=$ac_ct_DSYMUTIL
-  fi
-else
-  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
-set dummy ${ac_tool_prefix}nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_NMEDIT+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$NMEDIT"; then
-  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-NMEDIT=$ac_cv_prog_NMEDIT
-if test -n "$NMEDIT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
-$as_echo "$NMEDIT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_NMEDIT"; then
-  ac_ct_NMEDIT=$NMEDIT
-  # Extract the first word of "nmedit", so it can be a program name with args.
-set dummy nmedit; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_NMEDIT"; then
-  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_NMEDIT="nmedit"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
-if test -n "$ac_ct_NMEDIT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
-$as_echo "$ac_ct_NMEDIT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_NMEDIT" = x; then
-    NMEDIT=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    NMEDIT=$ac_ct_NMEDIT
-  fi
-else
-  NMEDIT="$ac_cv_prog_NMEDIT"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
-set dummy ${ac_tool_prefix}lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_LIPO+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$LIPO"; then
-  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-LIPO=$ac_cv_prog_LIPO
-if test -n "$LIPO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
-$as_echo "$LIPO" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_LIPO"; then
-  ac_ct_LIPO=$LIPO
-  # Extract the first word of "lipo", so it can be a program name with args.
-set dummy lipo; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_LIPO"; then
-  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_LIPO="lipo"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
-if test -n "$ac_ct_LIPO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
-$as_echo "$ac_ct_LIPO" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_LIPO" = x; then
-    LIPO=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    LIPO=$ac_ct_LIPO
-  fi
-else
-  LIPO="$ac_cv_prog_LIPO"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OTOOL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OTOOL"; then
-  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL=$ac_cv_prog_OTOOL
-if test -n "$OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
-$as_echo "$OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL"; then
-  ac_ct_OTOOL=$OTOOL
-  # Extract the first word of "otool", so it can be a program name with args.
-set dummy otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OTOOL"; then
-  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OTOOL="otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
-if test -n "$ac_ct_OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
-$as_echo "$ac_ct_OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OTOOL" = x; then
-    OTOOL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OTOOL=$ac_ct_OTOOL
-  fi
-else
-  OTOOL="$ac_cv_prog_OTOOL"
-fi
-
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OTOOL64+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OTOOL64"; then
-  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-OTOOL64=$ac_cv_prog_OTOOL64
-if test -n "$OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
-$as_echo "$OTOOL64" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_OTOOL64"; then
-  ac_ct_OTOOL64=$OTOOL64
-  # Extract the first word of "otool64", so it can be a program name with args.
-set dummy otool64; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OTOOL64"; then
-  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_OTOOL64="otool64"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
-if test -n "$ac_ct_OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
-$as_echo "$ac_ct_OTOOL64" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-  if test "x$ac_ct_OTOOL64" = x; then
-    OTOOL64=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OTOOL64=$ac_ct_OTOOL64
-  fi
-else
-  OTOOL64="$ac_cv_prog_OTOOL64"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
-$as_echo_n "checking for -single_module linker flag... " >&6; }
-if test "${lt_cv_apple_cc_single_mod+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
-	# By default we will add the -single_module flag. You can override
-	# by either setting the environment variable LT_MULTI_MODULE
-	# non-empty at configure time, or by adding -multi_module to the
-	# link flags.
-	rm -rf libconftest.dylib*
-	echo "int foo(void){return 1;}" > conftest.c
-	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&5
-	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
-        _lt_result=$?
-	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
-	  lt_cv_apple_cc_single_mod=yes
-	else
-	  cat conftest.err >&5
-	fi
-	rm -rf libconftest.dylib*
-	rm -f conftest.*
-      fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
-$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
-$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
-if test "${lt_cv_ld_exported_symbols_list+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_exported_symbols_list=no
-      save_LDFLAGS=$LDFLAGS
-      echo "_main" > conftest.sym
-      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_ld_exported_symbols_list=yes
-else
-  lt_cv_ld_exported_symbols_list=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-	LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
-$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
-    case $host_os in
-    rhapsody* | darwin1.[012])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-    darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-    darwin*) # darwin 5.x on
-      # if running on 10.5 or later, the deployment target defaults
-      # to the OS version, if on x86, and 10.4, the deployment
-      # target defaults to 10.4. Don't you love it?
-      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[012]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-      esac
-    ;;
-  esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-      _lt_dar_single_mod='$single_module'
-    fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-    else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    fi
-    if test "$DSYMUTIL" != ":"; then
-      _lt_dsymutil='~$DSYMUTIL $lib || :'
-    else
-      _lt_dsymutil=
-    fi
-    ;;
-  esac
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-  if test "${ac_cv_prog_CPP+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-      # Double quotes because CPP needs to be expanded
-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-  break
-fi
-
-    done
-    ac_cv_prog_CPP=$CPP
-
-fi
-  CPP=$ac_cv_prog_CPP
-else
-  ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5 ; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if test "${ac_cv_header_stdc+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_stdc=yes
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      return 2;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
-		  inttypes.h stdint.h unistd.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in dlfcn.h
-do :
-  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
-"
-if test "x$ac_cv_header_dlfcn_h" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DLFCN_H 1
-_ACEOF
-
-fi
-
-done
-
-
-
-# Set options
-
-
-
-        enable_dlopen=no
-
-
-  enable_win32_dll=no
-
-
-            # Check whether --enable-shared was given.
-if test "${enable_shared+set}" = set; then :
-  enableval=$enable_shared; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_shared=yes
-fi
-
-
-
-
-
-
-
-
-
-  # Check whether --enable-static was given.
-if test "${enable_static+set}" = set; then :
-  enableval=$enable_static; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_static=yes
-fi
-
-
-
-
-
-
-
-
-
-
-# Check whether --with-pic was given.
-if test "${with_pic+set}" = set; then :
-  withval=$with_pic; pic_mode="$withval"
-else
-  pic_mode=default
-fi
-
-
-test -z "$pic_mode" && pic_mode=default
-
-
-
-
-
-
-
-  # Check whether --enable-fast-install was given.
-if test "${enable_fast_install+set}" = set; then :
-  enableval=$enable_fast_install; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_fast_install=yes
-fi
-
-
-
-
-
-
-
-
-
-
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-test -z "$LN_S" && LN_S="ln -s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-if test -n "${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
-$as_echo_n "checking for objdir... " >&6; }
-if test "${lt_cv_objdir+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
-$as_echo "$lt_cv_objdir" >&6; }
-objdir=$lt_cv_objdir
-
-
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define LT_OBJDIR "$lt_cv_objdir/"
-_ACEOF
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
-
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
-$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/${ac_tool_prefix}file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-
-
-
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
-$as_echo_n "checking for file... " >&6; }
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  else
-    MAGIC_CMD=:
-  fi
-fi
-
-  fi
-  ;;
-esac
-
-# Use C for the default configuration in the libtool script
-
-lt_save_CC="$CC"
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-objext=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-
-
-
-
-
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-
-
-## CAVEAT EMPTOR:
-## There is no encapsulation within the following macros, do not change
-## the running order or otherwise move them around unless you know exactly
-## what you are doing...
-if test -n "$compiler"; then
-
-lt_prog_compiler_no_builtin_flag=
-
-if test "$GCC" = yes; then
-  lt_prog_compiler_no_builtin_flag=' -fno-builtin'
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
-if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_rtti_exceptions=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="-fno-rtti -fno-exceptions"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:7419: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:7423: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_rtti_exceptions=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
-$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
-
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
-    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
-else
-    :
-fi
-
-fi
-
-
-
-
-
-
-  lt_prog_compiler_wl=
-lt_prog_compiler_pic=
-lt_prog_compiler_static=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-
-  if test "$GCC" = yes; then
-    lt_prog_compiler_wl='-Wl,'
-    lt_prog_compiler_static='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            lt_prog_compiler_pic='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic='-fno-common'
-      ;;
-
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='-fPIC'
-	;;
-      esac
-      ;;
-
-    interix[3-9]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      lt_prog_compiler_can_build_shared=no
-      enable_shared=no
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic='-fPIC -shared'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic=-Kconform_pic
-      fi
-      ;;
-
-    *)
-      lt_prog_compiler_pic='-fPIC'
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      lt_prog_compiler_wl='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      else
-	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC (with -KPIC) is the default.
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
-      case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
-      ecc*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-KPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      # icc used to be incompatible with GCC.
-      # ICC 10 doesn't accept -KPIC any more.
-      icc* | ifort*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      # Lahey Fortran 8.1.
-      lf95*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='--shared'
-	lt_prog_compiler_static='--static'
-	;;
-      pgcc* | pgf77* | pgf90* | pgf95*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fpic'
-	lt_prog_compiler_static='-Bstatic'
-        ;;
-      ccc*)
-        lt_prog_compiler_wl='-Wl,'
-        # All Alpha code is PIC.
-        lt_prog_compiler_static='-non_shared'
-        ;;
-      xl*)
-	# IBM XL C 8.0/Fortran 10.1 on PPC
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-qpic'
-	lt_prog_compiler_static='-qstaticlink'
-	;;
-      *)
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)
-	  # Sun C 5.9
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl='-Wl,'
-	  ;;
-	*Sun\ F*)
-	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl=''
-	  ;;
-	esac
-	;;
-      esac
-      ;;
-
-    newsos6)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic='-fPIC -shared'
-      ;;
-
-    osf3* | osf4* | osf5*)
-      lt_prog_compiler_wl='-Wl,'
-      # All OSF/1 code is PIC.
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    rdos*)
-      lt_prog_compiler_static='-non_shared'
-      ;;
-
-    solaris*)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95*)
-	lt_prog_compiler_wl='-Qoption ld ';;
-      *)
-	lt_prog_compiler_wl='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      lt_prog_compiler_wl='-Qoption ld '
-      lt_prog_compiler_pic='-PIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	lt_prog_compiler_pic='-Kconform_pic'
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    unicos*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_can_build_shared=no
-      ;;
-
-    uts4*)
-      lt_prog_compiler_pic='-pic'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
-
-    *)
-      lt_prog_compiler_can_build_shared=no
-      ;;
-    esac
-  fi
-
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic=
-    ;;
-  *)
-    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
-    ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5
-$as_echo "$lt_prog_compiler_pic" >&6; }
-
-
-
-
-
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
-if test "${lt_cv_prog_compiler_pic_works+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_pic_works=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:7758: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:7762: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_pic_works=yes
-     fi
-   fi
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
-    case $lt_prog_compiler_pic in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
-     esac
-else
-    lt_prog_compiler_pic=
-     lt_prog_compiler_can_build_shared=no
-fi
-
-fi
-
-
-
-
-
-
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if test "${lt_cv_prog_compiler_static_works+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_static_works=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler_static_works=yes
-       fi
-     else
-       lt_cv_prog_compiler_static_works=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
-$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
-
-if test x"$lt_cv_prog_compiler_static_works" = xyes; then
-    :
-else
-    lt_prog_compiler_static=
-fi
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:7863: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:7867: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:7918: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:7922: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-
-
-
-
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-
-  runpath_var=
-  allow_undefined_flag=
-  always_export_symbols=no
-  archive_cmds=
-  archive_expsym_cmds=
-  compiler_needs_object=no
-  enable_shared_with_static_runtimes=no
-  export_dynamic_flag_spec=
-  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  hardcode_automatic=no
-  hardcode_direct=no
-  hardcode_direct_absolute=no
-  hardcode_libdir_flag_spec=
-  hardcode_libdir_flag_spec_ld=
-  hardcode_libdir_separator=
-  hardcode_minus_L=no
-  hardcode_shlibpath_var=unsupported
-  inherit_rpath=no
-  link_all_deplibs=unknown
-  module_cmds=
-  module_expsym_cmds=
-  old_archive_from_new_cmds=
-  old_archive_from_expsyms_cmds=
-  thread_safe_flag_spec=
-  whole_archive_flag_spec=
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  include_expsyms=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  # Exclude shared library initialization/finalization symbols.
-  extract_expsyms_cmds=
-
-  case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  linux* | k*bsd*-gnu)
-    link_all_deplibs=no
-    ;;
-  esac
-
-  ld_shlibs=yes
-  if test "$with_gnu_ld" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-    export_dynamic_flag_spec='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      whole_archive_flag_spec=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>&1` in
-      *GNU\ gold*) supports_anon_versioning=yes ;;
-      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[3-9]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
-
-_LT_EOF
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds=''
-        ;;
-      m68k)
-            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_minus_L=yes
-        ;;
-      esac
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	allow_undefined_flag=unsupported
-	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
-      # as there is no search path for DLLs.
-      hardcode_libdir_flag_spec='-L$libdir'
-      allow_undefined_flag=unsupported
-      always_export_symbols=no
-      enable_shared_with_static_runtimes=yes
-      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
-
-      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    interix[3-9]*)
-      hardcode_direct=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
-	case $cc_basename in
-	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
-	esac
-      fi
-      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
-      then
-	tmp_addflag=
-	tmp_sharedflag='-shared'
-	case $cc_basename,$host_cpu in
-        pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	lf95*)				# Lahey Fortran 8.1
-	  whole_archive_flag_spec=
-	  tmp_sharedflag='--shared' ;;
-	xl[cC]*)			# IBM XL C 8.0 on PPC (deal with xlf below)
-	  tmp_sharedflag='-qmkshrobj'
-	  tmp_addflag= ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object=yes
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	esac
-	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-        if test "x$supports_anon_versioning" = xyes; then
-          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-        fi
-
-	case $cc_basename in
-	xlf*)
-	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
-	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
-	  hardcode_libdir_flag_spec=
-	  hardcode_libdir_flag_spec_ld='-rpath $libdir'
-	  archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
-	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
-	  fi
-	  ;;
-	esac
-      else
-        ld_shlibs=no
-      fi
-      ;;
-
-    netbsd* | netbsdelf*-gnu)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  # For security reasons, it is highly recommended that you always
-	  # use absolute paths for naming shared libraries, and exclude the
-	  # DT_RUNPATH tag from executables and libraries.  But doing so
-	  # requires that you compile everything twice, which is a pain.
-	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  else
-	    ld_shlibs=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-    esac
-
-    if test "$ld_shlibs" = no; then
-      runpath_var=
-      hardcode_libdir_flag_spec=
-      export_dynamic_flag_spec=
-      whole_archive_flag_spec=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      allow_undefined_flag=unsupported
-      always_export_symbols=yes
-      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      hardcode_minus_L=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	hardcode_direct=unsupported
-      fi
-      ;;
-
-    aix[4-9]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	else
-	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
-	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-	    aix_use_runtimelinking=yes
-	    break
-	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      archive_cmds=''
-      hardcode_direct=yes
-      hardcode_direct_absolute=yes
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      file_list_spec='${wl}-f,'
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[012]|aix4.[012].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	  # We have reworked collect2
-	  :
-	  else
-	  # We have old collect2
-	  hardcode_direct=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  hardcode_minus_L=yes
-	  hardcode_libdir_flag_spec='-L$libdir'
-	  hardcode_libdir_separator=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-	link_all_deplibs=no
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      export_dynamic_flag_spec='${wl}-bexpall'
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      always_export_symbols=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	allow_undefined_flag='-berok'
-        # Determine the default libpath from the value encoded in an
-        # empty executable.
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-      else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
-	  allow_undefined_flag="-z nodefs"
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an
-	 # empty executable.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-lt_aix_libpath_sed='
-    /Import File Strings/,/^$/ {
-	/^0/ {
-	    s/^0  *\(.*\)$/\1/
-	    p
-	}
-    }'
-aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-# Check for a 64-bit object if we didn't find anything.
-if test -z "$aix_libpath"; then
-  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-
-	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag=' ${wl}-bernotok'
-	  allow_undefined_flag=' ${wl}-berok'
-	  # Exported symbols can be pulled into shared objects from archives
-	  whole_archive_flag_spec='$convenience'
-	  archive_cmds_need_lc=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds=''
-        ;;
-      m68k)
-            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_minus_L=yes
-        ;;
-      esac
-      ;;
-
-    bsdi[45]*)
-      export_dynamic_flag_spec=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      hardcode_libdir_flag_spec=' '
-      allow_undefined_flag=unsupported
-      # Tell ltmain to make .lib files, not .a files.
-      libext=lib
-      # Tell ltmain to make .dll files, not .so files.
-      shrext_cmds=".dll"
-      # FIXME: Setting linknames here is a bad hack.
-      archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames='
-      # The linker will automatically build a .lib file if we build a DLL.
-      old_archive_from_new_cmds='true'
-      # FIXME: Should let the user specify the lib program.
-      old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
-      fix_srcfile_path='`cygpath -w "$srcfile"`'
-      enable_shared_with_static_runtimes=yes
-      ;;
-
-    darwin* | rhapsody*)
-
-
-  archive_cmds_need_lc=no
-  hardcode_direct=no
-  hardcode_automatic=yes
-  hardcode_shlibpath_var=unsupported
-  whole_archive_flag_spec=''
-  link_all_deplibs=yes
-  allow_undefined_flag="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=echo
-    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-
-  else
-  ld_shlibs=no
-  fi
-
-      ;;
-
-    dgux*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
-
-    freebsd1*)
-      ld_shlibs=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_direct=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      hardcode_minus_L=yes
-      export_dynamic_flag_spec='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_flag_spec_ld='+b $libdir'
-	hardcode_libdir_separator=:
-	hardcode_direct=yes
-	hardcode_direct_absolute=yes
-	export_dynamic_flag_spec='${wl}-E'
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	hardcode_minus_L=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes -a "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  hardcode_direct=no
-	  hardcode_shlibpath_var=no
-	  ;;
-	*)
-	  hardcode_direct=yes
-	  hardcode_direct_absolute=yes
-	  export_dynamic_flag_spec='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  hardcode_minus_L=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	# Try to use the -exported_symbol ld option, if it does not
-	# work, assume that -exports_file does not work either and
-	# implicitly export all symbols.
-        save_LDFLAGS="$LDFLAGS"
-        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-int foo(void) {}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-        LDFLAGS="$save_LDFLAGS"
-      else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      inherit_rpath=yes
-      link_all_deplibs=yes
-      ;;
-
-    netbsd* | netbsdelf*-gnu)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    newsos6)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_shlibpath_var=no
-      ;;
-
-    *nto* | *qnx*)
-      ;;
-
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	hardcode_direct=yes
-	hardcode_shlibpath_var=no
-	hardcode_direct_absolute=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	  export_dynamic_flag_spec='${wl}-E'
-	else
-	  case $host_os in
-	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     hardcode_libdir_flag_spec='-R$libdir'
-	     ;;
-	   *)
-	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-	fi
-      else
-	ld_shlibs=no
-      fi
-      ;;
-
-    os2*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_minus_L=yes
-      allow_undefined_flag=unsupported
-      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	hardcode_libdir_flag_spec='-rpath $libdir'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_separator=:
-      ;;
-
-    solaris*)
-      no_undefined_flag=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-      else
-	case `$CC -V 2>&1` in
-	*"Compilers 5.0"*)
-	  wlarc=''
-	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
-	  ;;
-	*)
-	  wlarc='${wl}'
-	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-	  ;;
-	esac
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_shlibpath_var=no
-      case $host_os in
-      solaris2.[0-5] | solaris2.[0-5].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
-	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      link_all_deplibs=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  reload_cmds='$CC -r -o $output$reload_objs'
-	  hardcode_direct=no
-        ;;
-	motorola)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      hardcode_shlibpath_var=no
-      ;;
-
-    sysv4.3*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_shlibpath_var=no
-      export_dynamic_flag_spec='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	hardcode_shlibpath_var=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	ld_shlibs=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag='${wl}-z,text'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      no_undefined_flag='${wl}-z,text'
-      allow_undefined_flag='${wl}-z,nodefs'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-R,$libdir'
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      export_dynamic_flag_spec='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
-
-    *)
-      ld_shlibs=no
-      ;;
-    esac
-
-    if test x$host_vendor = xsni; then
-      case $host in
-      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	export_dynamic_flag_spec='${wl}-Blargedynsym'
-	;;
-      esac
-    fi
-  fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
-$as_echo "$ld_shlibs" >&6; }
-test "$ld_shlibs" = no && can_build_shared=no
-
-with_gnu_ld=$with_gnu_ld
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-      $RM conftest*
-      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-      if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } 2>conftest.err; then
-        soname=conftest
-        lib=conftest
-        libobjs=conftest.$ac_objext
-        deplibs=
-        wl=$lt_prog_compiler_wl
-	pic_flag=$lt_prog_compiler_pic
-        compiler_flags=-v
-        linker_flags=-v
-        verstring=
-        output_objdir=.
-        libname=conftest
-        lt_save_allow_undefined_flag=$allow_undefined_flag
-        allow_undefined_flag=
-        if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
-  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-        then
-	  archive_cmds_need_lc=no
-        else
-	  archive_cmds_need_lc=yes
-        fi
-        allow_undefined_flag=$lt_save_allow_undefined_flag
-      else
-        cat conftest.err 1>&5
-      fi
-      $RM conftest*
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5
-$as_echo "$archive_cmds_need_lc" >&6; }
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
-
-if test "$GCC" = yes; then
-  case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
-  esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-  if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'`
-  else
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-  fi
-  # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
-  lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
-  for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
-      test -d "$lt_sys_path" && \
-	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
-    fi
-  done
-  lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
-  for (lt_i = NF; lt_i > 0; lt_i--) {
-    if ($lt_i != "" && $lt_i != ".") {
-      if ($lt_i == "..") {
-        lt_count++;
-      } else {
-        if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
-        } else {
-          lt_count--;
-        }
-      }
-    }
-  }
-  if (lt_foo != "") { lt_freq[lt_foo]++; }
-  if (lt_freq[lt_foo] == 1) { print lt_foo; }
-}'`
-  sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[4-9]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[45]*)
-  version_type=linux
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$host_os in
-  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
-        # It is most probably a Windows format PATH printed by
-        # mingw gcc, but we are running on Cygwin. Gcc prints its search
-        # path with ; separators, and with drive letters. We can handle the
-        # drive letters (cygwin fileutils understands them), so leave them,
-        # especially as we might pass files found there to a mingw objdump,
-        # which wouldn't understand a cygwinified path. Ahh.
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    ;;
-
-  *)
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    ;;
-  esac
-  dynamic_linker='Win32 ld.exe'
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-
-  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd1*)
-  dynamic_linker=no
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[123]*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555.
-  postinstall_cmds='chmod 555 $lib'
-  ;;
-
-interix[3-9]*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  # Some binutils ld are patched to set DT_RUNPATH
-  save_LDFLAGS=$LDFLAGS
-  save_libdir=$libdir
-  eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
-       LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
-  shlibpath_overrides_runpath=yes
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  LDFLAGS=$save_LDFLAGS
-  libdir=$save_libdir
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsdelf*-gnu)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='NetBSD ld.elf_so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
-hardcode_action=
-if test -n "$hardcode_libdir_flag_spec" ||
-   test -n "$runpath_var" ||
-   test "X$hardcode_automatic" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$hardcode_direct" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
-     test "$hardcode_minus_L" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action=unsupported
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
-$as_echo "$hardcode_action" >&6; }
-
-if test "$hardcode_action" = relink ||
-   test "$inherit_rpath" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-
-
-
-
-
-
-  if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-    ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-    ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-
-fi
-
-    ;;
-
-  *)
-    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
-if test "x$ac_cv_func_shl_load" = x""yes; then :
-  lt_cv_dlopen="shl_load"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
-$as_echo_n "checking for shl_load in -ldld... " >&6; }
-if test "${ac_cv_lib_dld_shl_load+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char shl_load ();
-int
-main ()
-{
-return shl_load ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dld_shl_load=yes
-else
-  ac_cv_lib_dld_shl_load=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
-$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
-if test "x$ac_cv_lib_dld_shl_load" = x""yes; then :
-  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
-else
-  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
-if test "x$ac_cv_func_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
-$as_echo_n "checking for dlopen in -lsvld... " >&6; }
-if test "${ac_cv_lib_svld_dlopen+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsvld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_svld_dlopen=yes
-else
-  ac_cv_lib_svld_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
-$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
-if test "x$ac_cv_lib_svld_dlopen" = x""yes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
-$as_echo_n "checking for dld_link in -ldld... " >&6; }
-if test "${ac_cv_lib_dld_dld_link+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dld_link ();
-int
-main ()
-{
-return dld_link ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dld_dld_link=yes
-else
-  ac_cv_lib_dld_dld_link=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
-$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
-if test "x$ac_cv_lib_dld_dld_link" = x""yes; then :
-  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-    ;;
-  esac
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
-$as_echo_n "checking whether a program can dlopen itself... " >&6; }
-if test "${lt_cv_dlopen_self+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-#line 10302 "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-void fnord() { int i=42;}
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}
-_LT_EOF
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self=no
-  fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
-$as_echo "$lt_cv_dlopen_self" >&6; }
-
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
-$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
-if test "${lt_cv_dlopen_self_static+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self_static=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-#line 10398 "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-void fnord() { int i=42;}
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}
-_LT_EOF
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self_static=no
-  fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
-$as_echo "$lt_cv_dlopen_self_static" >&6; }
-    fi
-
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
-
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-striplib=
-old_striplib=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
-$as_echo_n "checking whether stripping libraries is possible... " >&6; }
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-  darwin*)
-    if test -n "$STRIP" ; then
-      striplib="$STRIP -x"
-      old_striplib="$STRIP -S"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-    else
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    fi
-    ;;
-  *)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    ;;
-  esac
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-  # Report which library types will actually be built
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
-$as_echo_n "checking if libtool supports shared libraries... " >&6; }
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
-$as_echo "$can_build_shared" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
-$as_echo_n "checking whether to build shared libraries... " >&6; }
-  test "$can_build_shared" = "no" && enable_shared=no
-
-  # On AIX, shared libraries and static libraries use the same namespace, and
-  # are all built from PIC.
-  case $host_os in
-  aix3*)
-    test "$enable_shared" = yes && enable_static=no
-    if test -n "$RANLIB"; then
-      archive_cmds="$archive_cmds~\$RANLIB \$lib"
-      postinstall_cmds='$RANLIB $lib'
-    fi
-    ;;
-
-  aix[4-9]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
-    fi
-    ;;
-  esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
-$as_echo "$enable_shared" >&6; }
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
-$as_echo_n "checking whether to build static libraries... " >&6; }
-  # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
-$as_echo "$enable_static" >&6; }
-
-
-
-
-fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-CC="$lt_save_CC"
-
-
-
-
-
-
-
-
-
-
-
-
-
-        ac_config_commands="$ac_config_commands libtool"
-
-
-
-
-# Only expand once:
-
-
-for ac_prog in doxygen
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_DOXYGEN+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DOXYGEN"; then
-  ac_cv_prog_DOXYGEN="$DOXYGEN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_DOXYGEN="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-fi
-fi
-DOXYGEN=$ac_cv_prog_DOXYGEN
-if test -n "$DOXYGEN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOXYGEN" >&5
-$as_echo "$DOXYGEN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-  test -n "$DOXYGEN" && break
-done
-test -n "$DOXYGEN" || DOXYGEN="doxygen"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
-$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
-if test "${ac_cv_c_const+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-/* FIXME: Include the comments suggested by Paul. */
-#ifndef __cplusplus
-  /* Ultrix mips cc rejects this.  */
-  typedef int charset[2];
-  const charset cs;
-  /* SunOS 4.1.1 cc rejects this.  */
-  char const *const *pcpcc;
-  char **ppc;
-  /* NEC SVR4.0.2 mips cc rejects this.  */
-  struct point {int x, y;};
-  static struct point const zero = {0,0};
-  /* AIX XL C 1.02.0.0 rejects this.
-     It does not let you subtract one const X* pointer from another in
-     an arm of an if-expression whose if-part is not a constant
-     expression */
-  const char *g = "string";
-  pcpcc = &g + (g ? g-g : 0);
-  /* HPUX 7.0 cc rejects these. */
-  ++pcpcc;
-  ppc = (char**) pcpcc;
-  pcpcc = (char const *const *) ppc;
-  { /* SCO 3.2v4 cc rejects this.  */
-    char *t;
-    char const *s = 0 ? (char *) 0 : (char const *) 0;
-
-    *t++ = 0;
-    if (s) return 0;
-  }
-  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
-    int x[] = {25, 17};
-    const int *foo = &x[0];
-    ++foo;
-  }
-  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
-    typedef const int *iptr;
-    iptr p = 0;
-    ++p;
-  }
-  { /* AIX XL C 1.02.0.0 rejects this saying
-       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
-    struct s { int j; const int *ap[3]; };
-    struct s *b; b->j = 5;
-  }
-  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
-    const int foo = 10;
-    if (!foo) return 0;
-  }
-  return !cs[0] && !zero.x;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_c_const=yes
-else
-  ac_cv_c_const=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
-$as_echo "$ac_cv_c_const" >&6; }
-if test $ac_cv_c_const = no; then
-
-$as_echo "#define const /**/" >>confdefs.h
-
-fi
-
-ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
-if test "x$ac_cv_type_size_t" = x""yes; then :
-
-else
-
-cat >>confdefs.h <<_ACEOF
-#define size_t unsigned int
-_ACEOF
-
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if test "${ac_cv_header_stdc+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_stdc=yes
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      return 2;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-for ac_header in errno.h stddef.h stdlib.h string.h strings.h unistd.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_func in strtol
-do :
-  ac_fn_c_check_func "$LINENO" "strtol" "ac_cv_func_strtol"
-if test "x$ac_cv_func_strtol" = x""yes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_STRTOL 1
-_ACEOF
-
-fi
-done
-
-
-
-
-gmp_package="yes"
-gmp_include_package="yes"
-gmp_library_package="yes"
-gmp_flag="OSL_GMP_IS_HERE"
-
-ASKED_FOR_GMP="no"
-
-
-# Check whether --with-gmp was given.
-if test "${with_gmp+set}" = set; then :
-  withval=$with_gmp;  echo "Package gmp : $withval" &&
-	  gmp_package=$withval &&
-          GMP_INC=$gmp_package/include &&
-          GMP_LIB=$gmp_package/lib &&
-          ASKED_FOR_GMP="yes"
-fi
-
-
-
-# Check whether --with-gmp-include was given.
-if test "${with_gmp_include+set}" = set; then :
-  withval=$with_gmp_include;  echo "Package gmp-include : $withval" &&
-	  gmp_include_package=$withval &&
-          GMP_INC=$gmp_include_package &&
-	  ASKED_FOR_GMP="yes"
-fi
-
-
-
-# Check whether --with-gmp-library was given.
-if test "${with_gmp_library+set}" = set; then :
-  withval=$with_gmp_library;  echo "Package gmp-library : $withval" &&
-	  gmp_library_package=$withval &&
-          GMP_LIB=$gmp_library_package &&
-	  ASKED_FOR_GMP="yes"
-fi
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gmp works" >&5
-$as_echo_n "checking whether gmp works... " >&6; }
-if test "$gmp_package" = "no"; then
-  echo "GMP package not defined"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-else
-  if test "$ASKED_FOR_GMP" = "no"; then
-    echo "Mode normal GMP"
-    ac_fn_c_check_header_mongrel "$LINENO" "gmp.h" "ac_cv_header_gmp_h" "$ac_includes_default"
-if test "x$ac_cv_header_gmp_h" = x""yes; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gmpz_init in -lgmp" >&5
-$as_echo_n "checking for __gmpz_init in -lgmp... " >&6; }
-if test "${ac_cv_lib_gmp___gmpz_init+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lgmp  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char __gmpz_init ();
-int
-main ()
-{
-return __gmpz_init ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_gmp___gmpz_init=yes
-else
-  ac_cv_lib_gmp___gmpz_init=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gmp___gmpz_init" >&5
-$as_echo "$ac_cv_lib_gmp___gmpz_init" >&6; }
-if test "x$ac_cv_lib_gmp___gmpz_init" = x""yes; then :
-  LIBS="$LIBS -lgmp" &&
-                                   CPPFLAGS="-D$gmp_flag $CPPFLAGS"
-else
-  echo "Cannot find gmp library." &&
-				   echo "MP precision will not be supported."
-fi
-
-else
-  echo "Can't find gmp headers." &&
-		     echo "MP precision will not be supported."
-fi
-
-
-  else
-
-    if test "$gmp_package" != "yes" ; then
-      echo "(GMP path has been set by user)"
-      GMP_DIR=$gmp_package
-      CPPFLAGS="-I$GMP_DIR/include $CPPFLAGS"
-      LDFLAGS="-L$GMP_DIR/lib $LDFLAGS"
-    fi
-
-    if test "$gmp_include_package" != "yes" ; then
-      CPPFLAGS="-I$GMP_INC $CPPFLAGS"
-    fi
-
-    if test "$gmp_library_package" != "yes" ; then
-      LDFLAGS="-L$GMP_LIB $LDFLAGS"
-    fi
-
-    ac_fn_c_check_header_mongrel "$LINENO" "gmp.h" "ac_cv_header_gmp_h" "$ac_includes_default"
-if test "x$ac_cv_header_gmp_h" = x""yes; then :
-
-else
-  as_fn_error $? "\"Cannot find gmp headers.\"" "$LINENO" 5
-fi
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gmpz_init in -lgmp" >&5
-$as_echo_n "checking for __gmpz_init in -lgmp... " >&6; }
-if test "${ac_cv_lib_gmp___gmpz_init+set}" = set; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lgmp  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char __gmpz_init ();
-int
-main ()
-{
-return __gmpz_init ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_gmp___gmpz_init=yes
-else
-  ac_cv_lib_gmp___gmpz_init=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gmp___gmpz_init" >&5
-$as_echo "$ac_cv_lib_gmp___gmpz_init" >&6; }
-if test "x$ac_cv_lib_gmp___gmpz_init" = x""yes; then :
-  LIBS="$LIBS -lgmp" &&
-                  CPPFLAGS="-D$gmp_flag $CPPFLAGS"
-else
-  as_fn_error $? "\"Cannot find gmp library.\"" "$LINENO" 5
-fi
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-  fi
-fi
-
-
-
-
-
-
-ac_config_files="$ac_config_files Makefile doc/Makefile doc/Doxyfile include/Makefile include/osl/scop.h source/Makefile tests/Makefile"
-
-
-cat >confcache <<\_ACEOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs, see configure's option --config-cache.
-# It is not useful on other systems.  If it contains results you don't
-# want to keep, you may remove or edit it.
-#
-# config.status only pays attention to the cache file if you give it
-# the --recheck option to rerun configure.
-#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
-# following values.
-
-_ACEOF
-
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, we kill variables containing newlines.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(
-  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
-      *) { eval $ac_var=; unset $ac_var;} ;;
-      esac ;;
-    esac
-  done
-
-  (set) 2>&1 |
-    case $as_nl`(ac_space=' '; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      # `set' does not quote correctly, so add quotes: double-quote
-      # substitution turns \\\\ into \\, and sed turns \\ into \.
-      sed -n \
-	"s/'/'\\\\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
-      ;; #(
-    *)
-      # `set' quotes correctly as required by POSIX, so do not add quotes.
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-) |
-  sed '
-     /^ac_cv_env_/b end
-     t clear
-     :clear
-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
-     t end
-     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
-     :end' >>confcache
-if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
-  if test -w "$cache_file"; then
-    test "x$cache_file" != "x/dev/null" &&
-      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
-    cat confcache >$cache_file
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
-  fi
-fi
-rm -f confcache
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-# Transform confdefs.h into DEFS.
-# Protect against shell expansion while executing Makefile rules.
-# Protect against Makefile macro expansion.
-#
-# If the first sed substitution is executed (which looks for macros that
-# take arguments), then branch to the quote section.  Otherwise,
-# look for a macro that doesn't take arguments.
-ac_script='
-:mline
-/\\$/{
- N
- s,\\\n,,
- b mline
-}
-t clear
-:clear
-s/^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*([^)]*)\)[	 ]*\(.*\)/-D\1=\2/g
-t quote
-s/^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)/-D\1=\2/g
-t quote
-b any
-:quote
-s/[	 `~#$^&*(){}\\|;'\''"<>?]/\\&/g
-s/\[/\\&/g
-s/\]/\\&/g
-s/\$/$$/g
-H
-:any
-${
-	g
-	s/^\n//
-	s/\n/ /g
-	p
-}
-'
-DEFS=`sed -n "$ac_script" confdefs.h`
-
-
-ac_libobjs=
-ac_ltlibobjs=
-U=
-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
-  # 1. Remove the extension, and $U if already installed.
-  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
-  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
-  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
-  #    will be set to the directory where LIBOBJS objects are built.
-  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
-  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
-done
-LIBOBJS=$ac_libobjs
-
-LTLIBOBJS=$ac_ltlibobjs
-
-
- if test -n "$EXEEXT"; then
-  am__EXEEXT_TRUE=
-  am__EXEEXT_FALSE='#'
-else
-  am__EXEEXT_TRUE='#'
-  am__EXEEXT_FALSE=
-fi
-
-if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
-  as_fn_error $? "conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
-  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-
-: ${CONFIG_STATUS=./config.status}
-ac_write_fail=0
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
-as_write_fail=0
-cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate the current configuration.
-# Compiler output produced by configure, useful for debugging
-# configure, is in config.log if it exists.
-
-debug=false
-ac_cs_recheck=false
-ac_cs_silent=false
-
-SHELL=\${CONFIG_SHELL-$SHELL}
-export SHELL
-_ASEOF
-cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in #(
-  *posix*) :
-    set -o posix ;; #(
-  *) :
-     ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='print -r --'
-  as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
-  as_echo='printf %s\n'
-  as_echo_n='printf %s'
-else
-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
-    as_echo_n='/usr/ucb/echo -n'
-  else
-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
-    as_echo_n_body='eval
-      arg=$1;
-      case $arg in #(
-      *"$as_nl"*)
-	expr "X$arg" : "X\\(.*\\)$as_nl";
-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
-      esac;
-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
-    '
-    export as_echo_n_body
-    as_echo_n='sh -c $as_echo_n_body as_echo'
-  fi
-  export as_echo_body
-  as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
-      PATH_SEPARATOR=';'
-  }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-case $0 in #((
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-  done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there.  '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-
-# as_fn_error STATUS ERROR [LINENO LOG_FD]
-# ----------------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with STATUS, using 1 if that was 0.
-as_fn_error ()
-{
-  as_status=$1; test $as_status -eq 0 && as_status=1
-  if test "$4"; then
-    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
-  fi
-  $as_echo "$as_me: error: $2" >&2
-  as_fn_exit $as_status
-} # as_fn_error
-
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
-  return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
-  set +e
-  as_fn_set_status $1
-  exit $1
-} # as_fn_exit
-
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
-  { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
-  eval 'as_fn_append ()
-  {
-    eval $1+=\$2
-  }'
-else
-  as_fn_append ()
-  {
-    eval $1=\$$1\$2
-  }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
-  eval 'as_fn_arith ()
-  {
-    as_val=$(( $* ))
-  }'
-else
-  as_fn_arith ()
-  {
-    as_val=`expr "$@" || test $? -eq 1`
-  }
-fi # as_fn_arith
-
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
-  case `echo 'xy\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  xy)  ECHO_C='\c';;
-  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
-       ECHO_T='	';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
-  if ln -s conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s='ln -s'
-    # ... but there are two gotchas:
-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
-  elif ln conf$$.file conf$$ 2>/dev/null; then
-    as_ln_s=ln
-  else
-    as_ln_s='cp -p'
-  fi
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || eval $as_mkdir_p || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p='mkdir -p "$as_dir"'
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-	test -d "$1/.";
-      else
-	case $1 in #(
-	-*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-exec 6>&1
-## ----------------------------------- ##
-## Main body of $CONFIG_STATUS script. ##
-## ----------------------------------- ##
-_ASEOF
-test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# Save the log message, to keep $0 and so on meaningful, and to
-# report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.
-ac_log="
-This file was extended by osl $as_me 0.8.1, which was
-generated by GNU Autoconf 2.67.  Invocation command line was
-
-  CONFIG_FILES    = $CONFIG_FILES
-  CONFIG_HEADERS  = $CONFIG_HEADERS
-  CONFIG_LINKS    = $CONFIG_LINKS
-  CONFIG_COMMANDS = $CONFIG_COMMANDS
-  $ $0 $@
-
-on `(hostname || uname -n) 2>/dev/null | sed 1q`
-"
-
-_ACEOF
-
-case $ac_config_files in *"
-"*) set x $ac_config_files; shift; ac_config_files=$*;;
-esac
-
-
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-# Files that config.status was made for.
-config_files="$ac_config_files"
-config_commands="$ac_config_commands"
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-ac_cs_usage="\
-\`$as_me' instantiates files and other configuration actions
-from templates according to the current configuration.  Unless the files
-and actions are specified as TAGs, all are instantiated by default.
-
-Usage: $0 [OPTION]... [TAG]...
-
-  -h, --help       print this help, then exit
-  -V, --version    print version number and configuration settings, then exit
-      --config     print configuration, then exit
-  -q, --quiet, --silent
-                   do not print progress messages
-  -d, --debug      don't remove temporary files
-      --recheck    update $as_me by reconfiguring in the same conditions
-      --file=FILE[:TEMPLATE]
-                   instantiate the configuration file FILE
-
-Configuration files:
-$config_files
-
-Configuration commands:
-$config_commands
-
-Report bugs to <cedric.bastoul@u-psud.fr,pouchet@cse.ohio-state.edu>."
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
-ac_cs_version="\\
-osl config.status 0.8.1
-configured by $0, generated by GNU Autoconf 2.67,
-  with options \\"\$ac_cs_config\\"
-
-Copyright (C) 2010 Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-
-ac_pwd='$ac_pwd'
-srcdir='$srcdir'
-INSTALL='$INSTALL'
-MKDIR_P='$MKDIR_P'
-AWK='$AWK'
-test -n "\$AWK" || AWK=awk
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# The default lists apply if the user does not specify any file.
-ac_need_defaults=:
-while test $# != 0
-do
-  case $1 in
-  --*=?*)
-    ac_option=`expr "X$1" : 'X\([^=]*\)='`
-    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
-    ac_shift=:
-    ;;
-  --*=)
-    ac_option=`expr "X$1" : 'X\([^=]*\)='`
-    ac_optarg=
-    ac_shift=:
-    ;;
-  *)
-    ac_option=$1
-    ac_optarg=$2
-    ac_shift=shift
-    ;;
-  esac
-
-  case $ac_option in
-  # Handling of the options.
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    ac_cs_recheck=: ;;
-  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
-    $as_echo "$ac_cs_version"; exit ;;
-  --config | --confi | --conf | --con | --co | --c )
-    $as_echo "$ac_cs_config"; exit ;;
-  --debug | --debu | --deb | --de | --d | -d )
-    debug=: ;;
-  --file | --fil | --fi | --f )
-    $ac_shift
-    case $ac_optarg in
-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    '') as_fn_error $? "missing file argument" ;;
-    esac
-    as_fn_append CONFIG_FILES " '$ac_optarg'"
-    ac_need_defaults=false;;
-  --he | --h |  --help | --hel | -h )
-    $as_echo "$ac_cs_usage"; exit ;;
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil | --si | --s)
-    ac_cs_silent=: ;;
-
-  # This is an error.
-  -*) as_fn_error $? "unrecognized option: \`$1'
-Try \`$0 --help' for more information." ;;
-
-  *) as_fn_append ac_config_targets " $1"
-     ac_need_defaults=false ;;
-
-  esac
-  shift
-done
-
-ac_configure_extra_args=
-
-if $ac_cs_silent; then
-  exec 6>/dev/null
-  ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-if \$ac_cs_recheck; then
-  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
-  shift
-  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
-  CONFIG_SHELL='$SHELL'
-  export CONFIG_SHELL
-  exec "\$@"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-exec 5>>config.log
-{
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-  $as_echo "$ac_log"
-} >&5
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-#
-# INIT-COMMANDS
-#
-AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
-
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`'
-macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`'
-enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`'
-enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`'
-pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`'
-enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`'
-host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`'
-host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`'
-host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`'
-build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`'
-build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`'
-build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`'
-SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`'
-Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`'
-GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`'
-EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`'
-FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`'
-LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`'
-NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`'
-LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`'
-max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`'
-ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`'
-exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`'
-lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`'
-lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`'
-lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`'
-reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`'
-reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`'
-deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`'
-file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`'
-AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`'
-AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`'
-STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`'
-RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`'
-old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`'
-CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`'
-compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`'
-GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`'
-objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`'
-SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`'
-ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`'
-MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`'
-lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`'
-lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`'
-need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`'
-DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`'
-NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`'
-LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`'
-OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`'
-OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`'
-libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`'
-shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`'
-enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`'
-export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
-whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
-compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`'
-old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`'
-allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`'
-no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`'
-inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`'
-link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`'
-fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`'
-always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`'
-export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`'
-include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`'
-prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`'
-variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`'
-need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`'
-need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`'
-version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`'
-runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`'
-shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`'
-shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`'
-libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`'
-library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`'
-soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`'
-postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`'
-finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`'
-sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`'
-sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`'
-hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`'
-enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`'
-enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`'
-enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`'
-old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`'
-striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`'
-
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# Quote evaled strings.
-for var in SED \
-GREP \
-EGREP \
-FGREP \
-LD \
-NM \
-LN_S \
-lt_SP2NL \
-lt_NL2SP \
-reload_flag \
-OBJDUMP \
-deplibs_check_method \
-file_magic_cmd \
-AR \
-AR_FLAGS \
-STRIP \
-RANLIB \
-CC \
-CFLAGS \
-compiler \
-lt_cv_sys_global_symbol_pipe \
-lt_cv_sys_global_symbol_to_cdecl \
-lt_cv_sys_global_symbol_to_c_name_address \
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
-SHELL \
-ECHO \
-lt_prog_compiler_no_builtin_flag \
-lt_prog_compiler_wl \
-lt_prog_compiler_pic \
-lt_prog_compiler_static \
-lt_cv_prog_compiler_c_o \
-need_locks \
-DSYMUTIL \
-NMEDIT \
-LIPO \
-OTOOL \
-OTOOL64 \
-shrext_cmds \
-export_dynamic_flag_spec \
-whole_archive_flag_spec \
-compiler_needs_object \
-with_gnu_ld \
-allow_undefined_flag \
-no_undefined_flag \
-hardcode_libdir_flag_spec \
-hardcode_libdir_flag_spec_ld \
-hardcode_libdir_separator \
-fix_srcfile_path \
-exclude_expsyms \
-include_expsyms \
-file_list_spec \
-variables_saved_for_relink \
-libname_spec \
-library_names_spec \
-soname_spec \
-finish_eval \
-old_striplib \
-striplib; do
-    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
-    *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Double-quote double-evaled strings.
-for var in reload_cmds \
-old_postinstall_cmds \
-old_postuninstall_cmds \
-old_archive_cmds \
-extract_expsyms_cmds \
-old_archive_from_new_cmds \
-old_archive_from_expsyms_cmds \
-archive_cmds \
-archive_expsym_cmds \
-module_cmds \
-module_expsym_cmds \
-export_symbols_cmds \
-prelink_cmds \
-postinstall_cmds \
-postuninstall_cmds \
-finish_cmds \
-sys_lib_search_path_spec \
-sys_lib_dlsearch_path_spec; do
-    case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
-    *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Fix-up fallback echo if it was mangled by the above quoting rules.
-case \$lt_ECHO in
-*'\\\$0 --fallback-echo"')  lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\`
-  ;;
-esac
-
-ac_aux_dir='$ac_aux_dir'
-xsi_shell='$xsi_shell'
-lt_shell_append='$lt_shell_append'
-
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-
-    PACKAGE='$PACKAGE'
-    VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
-    RM='$RM'
-    ofile='$ofile'
-
-
-
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-
-# Handling of arguments.
-for ac_config_target in $ac_config_targets
-do
-  case $ac_config_target in
-    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
-    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
-    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-    "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
-    "doc/Doxyfile") CONFIG_FILES="$CONFIG_FILES doc/Doxyfile" ;;
-    "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;;
-    "include/osl/scop.h") CONFIG_FILES="$CONFIG_FILES include/osl/scop.h" ;;
-    "source/Makefile") CONFIG_FILES="$CONFIG_FILES source/Makefile" ;;
-    "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
-
-  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;;
-  esac
-done
-
-
-# If the user did not use the arguments to specify the items to instantiate,
-# then the envvar interface is used.  Set only those that are not.
-# We use the long form for the default assignment because of an extremely
-# bizarre bug on SunOS 4.1.3.
-if $ac_need_defaults; then
-  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
-  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
-fi
-
-# Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason against having it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Hook for its removal unless debugging.
-# Note that there is a small window in which the directory will not be cleaned:
-# after its creation but before its name has been assigned to `$tmp'.
-$debug ||
-{
-  tmp=
-  trap 'exit_status=$?
-  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
-' 0
-  trap 'as_fn_exit 1' 1 2 13 15
-}
-# Create a (secure) tmp directory for tmp files.
-
-{
-  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
-  test -n "$tmp" && test -d "$tmp"
-}  ||
-{
-  tmp=./conf$$-$RANDOM
-  (umask 077 && mkdir "$tmp")
-} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
-
-# Set up the scripts for CONFIG_FILES section.
-# No need to generate them if there are no CONFIG_FILES.
-# This happens for instance with `./config.status config.h'.
-if test -n "$CONFIG_FILES"; then
-
-
-ac_cr=`echo X | tr X '\015'`
-# On cygwin, bash can eat \r inside `` if the user requested igncr.
-# But we know of no other shell where ac_cr would be empty at this
-# point, so we can use a bashism as a fallback.
-if test "x$ac_cr" = x; then
-  eval ac_cr=\$\'\\r\'
-fi
-ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
-if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
-  ac_cs_awk_cr='\\r'
-else
-  ac_cs_awk_cr=$ac_cr
-fi
-
-echo 'BEGIN {' >"$tmp/subs1.awk" &&
-_ACEOF
-
-
-{
-  echo "cat >conf$$subs.awk <<_ACEOF" &&
-  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
-  echo "_ACEOF"
-} >conf$$subs.sh ||
-  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
-ac_delim='%!_!# '
-for ac_last_try in false false false false false :; do
-  . ./conf$$subs.sh ||
-    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-
-  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
-  if test $ac_delim_n = $ac_delim_num; then
-    break
-  elif $ac_last_try; then
-    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
-  else
-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
-  fi
-done
-rm -f conf$$subs.sh
-
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
-_ACEOF
-sed -n '
-h
-s/^/S["/; s/!.*/"]=/
-p
-g
-s/^[^!]*!//
-:repl
-t repl
-s/'"$ac_delim"'$//
-t delim
-:nl
-h
-s/\(.\{148\}\)..*/\1/
-t more1
-s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
-p
-n
-b repl
-:more1
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t nl
-:delim
-h
-s/\(.\{148\}\)..*/\1/
-t more2
-s/["\\]/\\&/g; s/^/"/; s/$/"/
-p
-b
-:more2
-s/["\\]/\\&/g; s/^/"/; s/$/"\\/
-p
-g
-s/.\{148\}//
-t delim
-' <conf$$subs.awk | sed '
-/^[^""]/{
-  N
-  s/\n//
-}
-' >>$CONFIG_STATUS || ac_write_fail=1
-rm -f conf$$subs.awk
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-_ACAWK
-cat >>"\$tmp/subs1.awk" <<_ACAWK &&
-  for (key in S) S_is_set[key] = 1
-  FS = ""
-
-}
-{
-  line = $ 0
-  nfields = split(line, field, "@")
-  substed = 0
-  len = length(field[1])
-  for (i = 2; i < nfields; i++) {
-    key = field[i]
-    keylen = length(key)
-    if (S_is_set[key]) {
-      value = S[key]
-      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
-      len += length(value) + length(field[++i])
-      substed = 1
-    } else
-      len += 1 + keylen
-  }
-
-  print line
-}
-
-_ACAWK
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
-  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
-else
-  cat
-fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
-  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
-_ACEOF
-
-# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
-# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
-h
-s///
-s/^/:/
-s/[	 ]*$/:/
-s/:\$(srcdir):/:/g
-s/:\${srcdir}:/:/g
-s/:@srcdir@:/:/g
-s/^:*//
-s/:*$//
-x
-s/\(=[	 ]*\).*/\1/
-G
-s/\n//
-s/^[^=]*=[	 ]*$//
-}'
-fi
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-fi # test -n "$CONFIG_FILES"
-
-
-eval set X "  :F $CONFIG_FILES      :C $CONFIG_COMMANDS"
-shift
-for ac_tag
-do
-  case $ac_tag in
-  :[FHLC]) ac_mode=$ac_tag; continue;;
-  esac
-  case $ac_mode$ac_tag in
-  :[FHL]*:*);;
-  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;;
-  :[FH]-) ac_tag=-:-;;
-  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
-  esac
-  ac_save_IFS=$IFS
-  IFS=:
-  set x $ac_tag
-  IFS=$ac_save_IFS
-  shift
-  ac_file=$1
-  shift
-
-  case $ac_mode in
-  :L) ac_source=$1;;
-  :[FH])
-    ac_file_inputs=
-    for ac_f
-    do
-      case $ac_f in
-      -) ac_f="$tmp/stdin";;
-      *) # Look for the file first in the build tree, then in the source tree
-	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
-	 # because $ac_f cannot contain `:'.
-	 test -f "$ac_f" ||
-	   case $ac_f in
-	   [\\/$]*) false;;
-	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
-	   esac ||
-	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;;
-      esac
-      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
-      as_fn_append ac_file_inputs " '$ac_f'"
-    done
-
-    # Let's still pretend it is `configure' which instantiates (i.e., don't
-    # use $as_me), people would be surprised to read:
-    #    /* config.h.  Generated by config.status.  */
-    configure_input='Generated from '`
-	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
-	`' by configure.'
-    if test x"$ac_file" != x-; then
-      configure_input="$ac_file.  $configure_input"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
-    fi
-    # Neutralize special characters interpreted by sed in replacement strings.
-    case $configure_input in #(
-    *\&* | *\|* | *\\* )
-       ac_sed_conf_input=`$as_echo "$configure_input" |
-       sed 's/[\\\\&|]/\\\\&/g'`;; #(
-    *) ac_sed_conf_input=$configure_input;;
-    esac
-
-    case $ac_tag in
-    *:-:* | *:-) cat >"$tmp/stdin" \
-      || as_fn_error $? "could not create $ac_file" "$LINENO" 5  ;;
-    esac
-    ;;
-  esac
-
-  ac_dir=`$as_dirname -- "$ac_file" ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  as_dir="$ac_dir"; as_fn_mkdir_p
-  ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-
-  case $ac_mode in
-  :F)
-  #
-  # CONFIG_FILE
-  #
-
-  case $INSTALL in
-  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
-  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
-  esac
-  ac_MKDIR_P=$MKDIR_P
-  case $MKDIR_P in
-  [\\/$]* | ?:[\\/]* ) ;;
-  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
-  esac
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-# If the template does not know about datarootdir, expand it.
-# FIXME: This hack should be removed a few years after 2.60.
-ac_datarootdir_hack=; ac_datarootdir_seen=
-ac_sed_dataroot='
-/datarootdir/ {
-  p
-  q
-}
-/@datadir@/p
-/@docdir@/p
-/@infodir@/p
-/@localedir@/p
-/@mandir@/p'
-case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
-*datarootdir*) ac_datarootdir_seen=yes;;
-*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-  ac_datarootdir_hack='
-  s&@datadir@&$datadir&g
-  s&@docdir@&$docdir&g
-  s&@infodir@&$infodir&g
-  s&@localedir@&$localedir&g
-  s&@mandir@&$mandir&g
-  s&\\\${datarootdir}&$datarootdir&g' ;;
-esac
-_ACEOF
-
-# Neutralize VPATH when `$srcdir' = `.'.
-# Shell code in configure.ac might set extrasub.
-# FIXME: do we really want to maintain this feature?
-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_sed_extra="$ac_vpsub
-$extrasub
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s|@configure_input@|$ac_sed_conf_input|;t t
-s&@top_builddir@&$ac_top_builddir_sub&;t t
-s&@top_build_prefix@&$ac_top_build_prefix&;t t
-s&@srcdir@&$ac_srcdir&;t t
-s&@abs_srcdir@&$ac_abs_srcdir&;t t
-s&@top_srcdir@&$ac_top_srcdir&;t t
-s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
-s&@builddir@&$ac_builddir&;t t
-s&@abs_builddir@&$ac_abs_builddir&;t t
-s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
-s&@INSTALL@&$ac_INSTALL&;t t
-s&@MKDIR_P@&$ac_MKDIR_P&;t t
-$ac_datarootdir_hack
-"
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
-  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
-
-test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
-  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
-  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined" >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined" >&2;}
-
-  rm -f "$tmp/stdin"
-  case $ac_file in
-  -) cat "$tmp/out" && rm -f "$tmp/out";;
-  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
-  esac \
-  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
- ;;
-
-
-  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
-$as_echo "$as_me: executing $ac_file commands" >&6;}
- ;;
-  esac
-
-
-  case $ac_file$ac_mode in
-    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
-  # Autoconf 2.62 quotes --file arguments for eval, but not when files
-  # are listed without --file.  Let's play safe and only enable the eval
-  # if we detect the quoting.
-  case $CONFIG_FILES in
-  *\'*) eval set x "$CONFIG_FILES" ;;
-  *)   set x $CONFIG_FILES ;;
-  esac
-  shift
-  for mf
-  do
-    # Strip MF so we end up with the name of the file.
-    mf=`echo "$mf" | sed -e 's/:.*$//'`
-    # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named `Makefile.in', but
-    # some people rename them; so instead we look at the file content.
-    # Grep'ing the first line is not enough: some people post-process
-    # each Makefile.in and add a new line on top of each file to say so.
-    # Grep'ing the whole file is not good either: AIX grep has a line
-    # limit of 2048, but all sed's we know have understand at least 4000.
-    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-      dirpart=`$as_dirname -- "$mf" ||
-$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$mf" : 'X\(//\)[^/]' \| \
-	 X"$mf" : 'X\(//\)$' \| \
-	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$mf" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-    else
-      continue
-    fi
-    # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running `make'.
-    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-    test -z "$DEPDIR" && continue
-    am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "am__include" && continue
-    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # When using ansi2knr, U may be empty or an underscore; expand it
-    U=`sed -n 's/^U = //p' < "$mf"`
-    # Find all dependency output files, they are included files with
-    # $(DEPDIR) in their names.  We invoke sed twice because it is the
-    # simplest approach to changing $(DEPDIR) to its actual value in the
-    # expansion.
-    for file in `sed -n "
-      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-      # Make sure the directory exists.
-      test -f "$dirpart/$file" && continue
-      fdir=`$as_dirname -- "$file" ||
-$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$file" : 'X\(//\)[^/]' \| \
-	 X"$file" : 'X\(//\)$' \| \
-	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      as_dir=$dirpart/$fdir; as_fn_mkdir_p
-      # echo "creating $dirpart/$file"
-      echo '# dummy' > "$dirpart/$file"
-    done
-  done
-}
- ;;
-    "libtool":C)
-
-    # See if we are running on zsh, and set the options which allow our
-    # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
-      setopt NO_GLOB_SUBST
-    fi
-
-    cfgfile="${ofile}T"
-    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
-    $RM "$cfgfile"
-
-    cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $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.
-#
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008 Free Software Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-
-# The names of the tagged configurations supported by this script.
-available_tags=""
-
-# ### BEGIN LIBTOOL CONFIG
-
-# Which release of libtool.m4 was used?
-macro_version=$macro_version
-macro_revision=$macro_revision
-
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
-
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
-
-# What type of objects to build.
-pic_mode=$pic_mode
-
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
-
-# The host system.
-host_alias=$host_alias
-host=$host
-host_os=$host_os
-
-# The build system.
-build_alias=$build_alias
-build=$build
-build_os=$build_os
-
-# A sed program that does not truncate output.
-SED=$lt_SED
-
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="\$SED -e 1s/^X//"
-
-# A grep program that handles long lines.
-GREP=$lt_GREP
-
-# An ERE matcher.
-EGREP=$lt_EGREP
-
-# A literal string matcher.
-FGREP=$lt_FGREP
-
-# A BSD- or MS-compatible name lister.
-NM=$lt_NM
-
-# Whether we need soft or hard links.
-LN_S=$lt_LN_S
-
-# What is the maximum length of a command?
-max_cmd_len=$max_cmd_len
-
-# Object file suffix (normally "o").
-objext=$ac_objext
-
-# Executable file suffix (normally "").
-exeext=$exeext
-
-# whether the shell understands "unset".
-lt_unset=$lt_unset
-
-# turn spaces into newlines.
-SP2NL=$lt_lt_SP2NL
-
-# turn newlines into spaces.
-NL2SP=$lt_lt_NL2SP
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
-
-# An object symbol dumper.
-OBJDUMP=$lt_OBJDUMP
-
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
-
-# Command to use when deplibs_check_method == "file_magic".
-file_magic_cmd=$lt_file_magic_cmd
-
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
-
-# A symbol stripping program.
-STRIP=$lt_STRIP
-
-# Commands used to install an old-style archive.
-RANLIB=$lt_RANLIB
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
-
-# A C compiler.
-LTCC=$lt_CC
-
-# LTCC compiler flags.
-LTCFLAGS=$lt_CFLAGS
-
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
-
-# Transform the output of nm in a proper C declaration.
-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
-
-# Transform the output of nm in a C name address pair.
-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
-
-# Transform the output of nm in a C name address pair when lib prefix is needed.
-global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
-
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
-
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
-
-# An echo program that does not interpret backslashes.
-ECHO=$lt_ECHO
-
-# Used to examine libraries when file_magic_cmd begins with "file".
-MAGIC_CMD=$MAGIC_CMD
-
-# Must we lock files when doing compilation?
-need_locks=$lt_need_locks
-
-# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
-DSYMUTIL=$lt_DSYMUTIL
-
-# Tool to change global to local symbols on Mac OS X.
-NMEDIT=$lt_NMEDIT
-
-# Tool to manipulate fat objects and archives on Mac OS X.
-LIPO=$lt_LIPO
-
-# ldd/readelf like tool for Mach-O binaries on Mac OS X.
-OTOOL=$lt_OTOOL
-
-# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
-OTOOL64=$lt_OTOOL64
-
-# Old archive suffix (normally "a").
-libext=$libext
-
-# Shared library suffix (normally ".so").
-shrext_cmds=$lt_shrext_cmds
-
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
-
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at link time.
-variables_saved_for_relink=$lt_variables_saved_for_relink
-
-# Do we need the "lib" prefix for modules?
-need_lib_prefix=$need_lib_prefix
-
-# Do we need a version for libraries?
-need_version=$need_version
-
-# Library versioning type.
-version_type=$version_type
-
-# Shared library runtime path variable.
-runpath_var=$runpath_var
-
-# Shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
-
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
-
-# List of archive names.  First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME
-library_names_spec=$lt_library_names_spec
-
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
-
-# Command to use after installation of a shared archive.
-postinstall_cmds=$lt_postinstall_cmds
-
-# Command to use after uninstallation of a shared archive.
-postuninstall_cmds=$lt_postuninstall_cmds
-
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
-
-# As "finish_cmds", except a single script fragment to be evaled but
-# not shown.
-finish_eval=$lt_finish_eval
-
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
-
-# Compile-time system search path for libraries.
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
-
-# Run-time system search path for libraries.
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
-
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
-
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
-
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
-
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
-
-
-# The linker used to build libraries.
-LD=$lt_LD
-
-# Commands used to build an old-style archive.
-old_archive_cmds=$lt_old_archive_cmds
-
-# A language specific compiler.
-CC=$lt_compiler
-
-# Is the compiler the GNU compiler?
-with_gcc=$GCC
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
-
-# How to pass a linker flag through the compiler.
-wl=$lt_lt_prog_compiler_wl
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_lt_prog_compiler_pic
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_lt_prog_compiler_static
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_lt_cv_prog_compiler_c_o
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$archive_cmds_need_lc
-
-# Whether or not to disallow shared libs when runtime libs are static.
-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec
-
-# Whether the compiler copes with passing no objects directly.
-compiler_needs_object=$lt_compiler_needs_object
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
-
-# Commands used to build a shared archive.
-archive_cmds=$lt_archive_cmds
-archive_expsym_cmds=$lt_archive_expsym_cmds
-
-# Commands used to build a loadable module if different from building
-# a shared archive.
-module_cmds=$lt_module_cmds
-module_expsym_cmds=$lt_module_expsym_cmds
-
-# Whether we are building with GNU ld or not.
-with_gnu_ld=$lt_with_gnu_ld
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag
-
-# Flag that enforces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
-
-# If ld is used when linking, flag to hardcode \$libdir into a binary
-# during linking.  This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
-
-# Whether we need a single "-rpath" flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary.
-hardcode_direct=$hardcode_direct
-
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
-# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
-# library is relocated.
-hardcode_direct_absolute=$hardcode_direct_absolute
-
-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-# into the resulting binary.
-hardcode_minus_L=$hardcode_minus_L
-
-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-# into the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var
-
-# Set to "yes" if building a shared library automatically hardcodes DIR
-# into the library and all subsequent libraries and executables linked
-# against it.
-hardcode_automatic=$hardcode_automatic
-
-# Set to yes if linker adds runtime paths of dependent libraries
-# to runtime path list.
-inherit_rpath=$inherit_rpath
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs
-
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path=$lt_fix_srcfile_path
-
-# Set to "yes" if exported symbols are required.
-always_export_symbols=$always_export_symbols
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms
-
-# Commands necessary for linking programs (against libraries) with templates.
-prelink_cmds=$lt_prelink_cmds
-
-# Specify filename containing input files.
-file_list_spec=$lt_file_list_spec
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action
-
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
-  case $host_os in
-  aix3*)
-    cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-_LT_EOF
-    ;;
-  esac
-
-
-ltmain="$ac_aux_dir/ltmain.sh"
-
-
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  case $xsi_shell in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result="${1##*/}"
-}
-
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-  case ${1} in
-    */*) func_dirname_result="${1%/*}${2}" ;;
-    *  ) func_dirname_result="${3}" ;;
-  esac
-  func_basename_result="${1##*/}"
-}
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-func_stripname ()
-{
-  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-  # positional parameters, so assign one to ordinary parameter first.
-  func_stripname_result=${3}
-  func_stripname_result=${func_stripname_result#"${1}"}
-  func_stripname_result=${func_stripname_result%"${2}"}
-}
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=${1%%=*}
-  func_opt_split_arg=${1#*=}
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  case ${1} in
-    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-    *)    func_lo2o_result=${1} ;;
-  esac
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=${1%.*}.lo
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=$(( $* ))
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=${#1}
-}
-
-_LT_EOF
-    ;;
-  *) # Bourne compatible functions.
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-  # Extract subdirectory from the argument.
-  func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
-  if test "X$func_dirname_result" = "X${1}"; then
-    func_dirname_result="${3}"
-  else
-    func_dirname_result="$func_dirname_result${2}"
-  fi
-}
-
-# func_basename file
-func_basename ()
-{
-  func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
-}
-
-
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-  case ${2} in
-    .*) func_stripname_result=`$ECHO "X${3}" \
-           | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;;
-    *)  func_stripname_result=`$ECHO "X${3}" \
-           | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;;
-  esac
-}
-
-# sed scripts:
-my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q'
-my_sed_long_arg='1s/^-[^=]*=//'
-
-# func_opt_split
-func_opt_split ()
-{
-  func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"`
-  func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"`
-}
-
-# func_lo2o object
-func_lo2o ()
-{
-  func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"`
-}
-
-# func_xform libobj-or-source
-func_xform ()
-{
-  func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'`
-}
-
-# func_arith arithmetic-term...
-func_arith ()
-{
-  func_arith_result=`expr "$@"`
-}
-
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-  func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
-}
-
-_LT_EOF
-esac
-
-case $lt_shell_append in
-  yes)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$1+=\$2"
-}
-_LT_EOF
-    ;;
-  *)
-    cat << \_LT_EOF >> "$cfgfile"
-
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
-{
-  eval "$1=\$$1\$2"
-}
-
-_LT_EOF
-    ;;
-  esac
-
-
-  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
-    || (rm -f "$cfgfile"; exit 1)
-
-  mv -f "$cfgfile" "$ofile" ||
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
-
- ;;
-    "Makefile":F) test -z "$CONFIG_HEADERS" || echo timestamp > source/stamp-h.in ;;
-    "doc/Makefile":F) test -z "$CONFIG_HEADERS" || echo timestamp > source/stamp-h.in ;;
-    "doc/Doxyfile":F) test -z "$CONFIG_HEADERS" || echo timestamp > source/stamp-h.in ;;
-    "include/Makefile":F) test -z "$CONFIG_HEADERS" || echo timestamp > source/stamp-h.in ;;
-    "include/osl/scop.h":F) test -z "$CONFIG_HEADERS" || echo timestamp > source/stamp-h.in ;;
-    "source/Makefile":F) test -z "$CONFIG_HEADERS" || echo timestamp > source/stamp-h.in ;;
-    "tests/Makefile":F) test -z "$CONFIG_HEADERS" || echo timestamp > source/stamp-h.in ;;
-
-  esac
-done # for ac_tag
-
-
-as_fn_exit 0
-_ACEOF
-ac_clean_files=$ac_clean_files_save
-
-test $ac_write_fail = 0 ||
-  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
-
-
-# configure is writing to config.log, and then calls config.status.
-# config.status does its own redirection, appending to config.log.
-# Unfortunately, on DOS this fails, as config.log is still kept open
-# by configure, so config.status won't be able to write to it; its
-# output is simply discarded.  So we exec the FD to /dev/null,
-# effectively closing config.log, so it can be properly (re)opened and
-# appended to by config.status.  When coming back to configure, we
-# need to make the FD available again.
-if test "$no_create" != yes; then
-  ac_cs_success=:
-  ac_config_status_args=
-  test "$silent" = yes &&
-    ac_config_status_args="$ac_config_status_args --quiet"
-  exec 5>/dev/null
-  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
-  exec 5>>config.log
-  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
-  # would make configure fail if this is the last instruction.
-  $ac_cs_success || as_fn_exit 1
-fi
-if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
-fi
-
-
-
-echo "             /*-----------------------------------------------*"
-echo "              *      OpenScop Library configuration is OK     *"
-echo "              *-----------------------------------------------*/"
-echo "It appears that your system is OK to start the OpenScop Library compilation."
-echo "You need now to type \"make\". Then type \"make install\" to install it on your"
-echo "system (log as root if necessary)."
diff --git a/cloog-0.17.0/osl/configure.in b/cloog-0.17.0/osl/configure.in
deleted file mode 100644
index 9440bbb..0000000
--- a/cloog-0.17.0/osl/configure.in
+++ /dev/null
@@ -1,227 +0,0 @@
-dnl
-dnl  /*+------------------------------------------------------------------**
-dnl   **                       OpenScop Library                           **
-dnl   **------------------------------------------------------------------**
-dnl   **                         configure.in                             **
-dnl   **------------------------------------------------------------------**
-dnl   **                   First version: 30/04/2008                      **
-dnl   **------------------------------------------------------------------**
-dnl
-dnl
-dnl **************************************************************************
-dnl * OpenScop: Structures and formats for polyhedral tools to talk together *
-dnl **************************************************************************
-dnl *   ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,              *
-dnl *   /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,           *
-dnl *  /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\           *
-dnl * |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \          *
-dnl * | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\         *
-dnl * | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\        *
-dnl * | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \       *
-dnl * | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \      *
-dnl * | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \     *
-dnl * | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \    *
-dnl * | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \   *
-dnl * | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \  *
-dnl * | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \ *
-dnl * | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ / *
-dnl * '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'  *
-dnl *                                                                        *
-dnl * Copyright (C) 2008 University Paris-Sud 11 and INRIA                   *
-dnl *                                                                        *
-dnl * (3-clause BSD license)                                                 *
-dnl * Redistribution and use in source  and binary forms, with or without    *
-dnl * modification, are permitted provided that the following conditions     *
-dnl * are met:                                                               *
-dnl *                                                                        *
-dnl * 1. Redistributions of source code must retain the above copyright      *
-dnl *    notice, this list of conditions and the following disclaimer.       *
-dnl * 2. Redistributions in binary form must reproduce the above copyright   *
-dnl *    notice, this list of conditions and the following disclaimer in the *
-dnl *    documentation and/or other materials provided with the distribution.*
-dnl * 3. The name of the author may not be used to endorse or promote        *
-dnl *    products derived from this software without specific prior written  *
-dnl *    permission.                                                         *
-dnl *                                                                        *
-dnl * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR   *
-dnl * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED         *
-dnl * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
-dnl * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,     *
-dnl * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES     *
-dnl * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR     *
-dnl * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)     *
-dnl * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,    *
-dnl * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING  *
-dnl * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE     *
-dnl * POSSIBILITY OF SUCH DAMAGE.                                            *
-dnl *                                                                        *
-dnl * OpenScop Library, a library to manipulate OpenScop formats and data    *
-dnl * structures. Written by:                                                *
-dnl * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                      *
-dnl * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                       *
-dnl *                                                                        *
-dnl **************************************************************************/
-dnl
-dnl Input file for autoconf to build a configuration shellscript.
-
-
-AC_PREREQ(2.13)
-dnl Fill here the @bug email adress.
-AC_INIT([osl], [0.8.1], [cedric.bastoul@u-psud.fr,pouchet@cse.ohio-state.edu])
-dnl A common file, which serve as a test.
-AC_CONFIG_SRCDIR([include/osl/macros.h])
-dnl Put as most as possible configuration files to an auxialiry
-dnl directory.
-AC_CONFIG_AUX_DIR([autoconf])
-dnl Initialize automake. Here, a special tar version that enables
-dnl (very) long filenames.
-AM_INIT_AUTOMAKE([1.9 tar-ustar no-define foreign dist-bzip2])
-
-
-dnl /**************************************************************************
-dnl  *                              Checking                                  *
-dnl  **************************************************************************/
-
-
-dnl Checks for programs.
-AC_PROG_CC
-AC_PROG_LN_S
-AC_PROG_MAKE_SET
-AC_CHECK_PROG(CD, cd)
-AC_PROG_LIBTOOL
-AC_CHECK_PROGS(DOXYGEN,doxygen,doxygen)
-
-dnl Checks for typedefs, structures, and compiler characteristics.
-AC_C_CONST
-AC_TYPE_SIZE_T
-
-dnl Checks for header files.
-AC_HEADER_STDC
-AC_CHECK_HEADERS([errno.h stddef.h stdlib.h string.h strings.h unistd.h])
-
-dnl Checks for library functions.
-AC_CHECK_FUNCS(strtol)
-
-
-dnl /**************************************************************************
-dnl  *                             Option setting                             *
-dnl  **************************************************************************/
-
-dnl Some default values cause I'm not sure whether autoconf set them, while
-dnl documentation says it does...
-gmp_package="yes"
-gmp_include_package="yes"
-gmp_library_package="yes"
-gmp_flag="OSL_GMP_IS_HERE"
-
-ASKED_FOR_GMP="no"
-
-dnl --with-gmp=gmp-path
-AC_ARG_WITH(gmp,
-        [  --with-gmp=DIR          DIR where the gmp package is installed],
-	[ echo "Package gmp : $withval" &&
-	  gmp_package=$withval &&
-          GMP_INC=$gmp_package/include &&
-          GMP_LIB=$gmp_package/lib &&
-          ASKED_FOR_GMP="yes"])
-
-AC_ARG_WITH(gmp-include,
-        [  --with-gmp-include=DIR  DIR where gmp.h is installed],
-	[ echo "Package gmp-include : $withval" &&
-	  gmp_include_package=$withval &&
-          GMP_INC=$gmp_include_package &&
-	  ASKED_FOR_GMP="yes"])
-
-AC_ARG_WITH(gmp-library,
-        [  --with-gmp-library=DIR  DIR where the gmp library is installed],
-	[ echo "Package gmp-library : $withval" &&
-	  gmp_library_package=$withval &&
-          GMP_LIB=$gmp_library_package &&
-	  ASKED_FOR_GMP="yes"])
-
-
-dnl /**************************************************************************
-dnl  *                            Where is GMP?                               *
-dnl  **************************************************************************/
-
-
-dnl Checking for gmp
-AC_MSG_CHECKING(whether gmp works)
-if test "$gmp_package" = "no"; then
-  echo "GMP package not defined"
-  AC_MSG_RESULT(no)
-else
-  if test "$ASKED_FOR_GMP" = "no"; then
-    echo "Mode normal GMP"
-    AC_CHECK_HEADER(gmp.h,
-                    [AC_CHECK_LIB(gmp,
-		                  __gmpz_init,
-		                  [LIBS="$LIBS -lgmp" &&
-                                   CPPFLAGS="-D$gmp_flag $CPPFLAGS"],
-				  [echo "Cannot find gmp library." &&
-				   echo "MP precision will not be supported."])],
-		    [echo "Can't find gmp headers." &&
-		     echo "MP precision will not be supported."])
-  else
-    dnl Default given by --with-X is "yes", --without-X is "no". We also
-    dnl initialized manually all gmp_package* variables to "yes" (thus they are
-    dnl supposed to be "yes" except if the user set them himself).
-
-    if test "$gmp_package" != "yes" ; then
-      echo "(GMP path has been set by user)"
-      GMP_DIR=$gmp_package
-      CPPFLAGS="-I$GMP_DIR/include $CPPFLAGS"
-      LDFLAGS="-L$GMP_DIR/lib $LDFLAGS"
-    fi
-
-    if test "$gmp_include_package" != "yes" ; then
-      CPPFLAGS="-I$GMP_INC $CPPFLAGS"
-    fi
-
-    if test "$gmp_library_package" != "yes" ; then
-      LDFLAGS="-L$GMP_LIB $LDFLAGS"
-    fi
-
-    AC_CHECK_HEADER(gmp.h,
-                    [],
-                    [AC_MSG_ERROR("Cannot find gmp headers.")])
-    AC_CHECK_LIB(gmp,
-                 __gmpz_init,
-                 [LIBS="$LIBS -lgmp" &&
-                  CPPFLAGS="-D$gmp_flag $CPPFLAGS"],
-                 [AC_MSG_ERROR("Cannot find gmp library.")])
-
-    AC_MSG_RESULT(yes)
-  fi
-fi
-
-
-dnl /**************************************************************************
-dnl  *                            Substitutions                               *
-dnl  **************************************************************************/
-
-
-dnl Substitutions to do.
-AC_SUBST(ac_aux_dir)
-
-dnl Configure Makefiles.
-AC_CONFIG_FILES([
-	Makefile
-	doc/Makefile
-	doc/Doxyfile
-	include/Makefile
-	include/osl/scop.h
-	source/Makefile
-	tests/Makefile
-	],
-	[test -z "$CONFIG_HEADERS" || echo timestamp > source/stamp-h.in])
-
-AC_OUTPUT
-
-
-echo "             /*-----------------------------------------------*"
-echo "              *      OpenScop Library configuration is OK     *"
-echo "              *-----------------------------------------------*/"
-echo "It appears that your system is OK to start the OpenScop Library compilation."
-echo "You need now to type \"make\". Then type \"make install\" to install it on your"
-echo "system (log as root if necessary)."
diff --git a/cloog-0.17.0/osl/doc/Doxyfile.in b/cloog-0.17.0/osl/doc/Doxyfile.in
deleted file mode 100644
index 6f33f6c..0000000
--- a/cloog-0.17.0/osl/doc/Doxyfile.in
+++ /dev/null
@@ -1,1294 +0,0 @@
-# Doxyfile 1.5.3
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
-#
-# All text after a hash (#) is considered a comment and will be ignored
-# The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-
-# This tag specifies the encoding used for all characters in the config file that 
-# follow. The default is UTF-8 which is also the encoding used for all text before 
-# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into 
-# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of 
-# possible encodings.
-
-DOXYFILE_ENCODING      = UTF-8
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
-# by quotes) that should identify the project.
-
-PROJECT_NAME           = OpenScop
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
-# This could be handy for archiving the generated documentation or 
-# if some version control system is used.
-
-PROJECT_NUMBER         = @PACKAGE_VERSION@
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
-# base path where the generated documentation will be put. 
-# If a relative path is entered, it will be relative to the location 
-# where doxygen was started. If left blank the current directory will be used.
-
-OUTPUT_DIRECTORY       = htmldoc
-
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
-# 4096 sub-directories (in 2 levels) under the output directory of each output 
-# format and will distribute the generated files over these directories. 
-# Enabling this option can be useful when feeding doxygen a huge amount of 
-# source files, where putting all generated files in the same directory would 
-# otherwise cause performance problems for the file system.
-
-CREATE_SUBDIRS         = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
-# documentation generated by doxygen is written. Doxygen will use this 
-# information to generate all constant output in the proper language. 
-# The default language is English, other supported languages are: 
-# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
-# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, 
-# Italian, Japanese, Japanese-en (Japanese with English messages), Korean, 
-# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, 
-# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
-
-OUTPUT_LANGUAGE        = English
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
-# include brief member descriptions after the members that are listed in 
-# the file and class documentation (similar to JavaDoc). 
-# Set to NO to disable this.
-
-BRIEF_MEMBER_DESC      = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
-# the brief description of a member or function before the detailed description. 
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
-# brief descriptions will be completely suppressed.
-
-REPEAT_BRIEF           = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator 
-# that is used to form the text in various listings. Each string 
-# in this list, if found as the leading text of the brief description, will be 
-# stripped from the text and the result after processing the whole list, is 
-# used as the annotated text. Otherwise, the brief description is used as-is. 
-# If left blank, the following values are used ("$name" is automatically 
-# replaced with the name of the entity): "The $name class" "The $name widget" 
-# "The $name file" "is" "provides" "specifies" "contains" 
-# "represents" "a" "an" "the"
-
-ABBREVIATE_BRIEF       = 
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
-# Doxygen will generate a detailed section even if there is only a brief 
-# description.
-
-ALWAYS_DETAILED_SEC    = YES
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
-# inherited members of a class in the documentation of that class as if those 
-# members were ordinary class members. Constructors, destructors and assignment 
-# operators of the base classes will not be shown.
-
-INLINE_INHERITED_MEMB  = YES
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
-# path before files name in the file list and in the header files. If set 
-# to NO the shortest path that makes the file name unique will be used.
-
-FULL_PATH_NAMES        = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
-# can be used to strip a user-defined part of the path. Stripping is 
-# only done if one of the specified strings matches the left-hand part of 
-# the path. The tag can be used to show relative paths in the file list. 
-# If left blank the directory from which doxygen is run is used as the 
-# path to strip.
-
-STRIP_FROM_PATH        = 
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
-# the path mentioned in the documentation of a class, which tells 
-# the reader which header file to include in order to use a class. 
-# If left blank only the name of the header file containing the class 
-# definition is used. Otherwise one should specify the include paths that 
-# are normally passed to the compiler using the -I flag.
-
-STRIP_FROM_INC_PATH    = 
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
-# (but less readable) file names. This can be useful is your file systems 
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
-SHORT_NAMES            = YES
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
-# will interpret the first line (until the first dot) of a JavaDoc-style 
-# comment as the brief description. If set to NO, the JavaDoc 
-# comments will behave just like regular Qt-style comments 
-# (thus requiring an explicit @brief command for a brief description.)
-
-JAVADOC_AUTOBRIEF      = NO
-
-# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
-# interpret the first line (until the first dot) of a Qt-style 
-# comment as the brief description. If set to NO, the comments 
-# will behave just like regular Qt-style comments (thus requiring 
-# an explicit \brief command for a brief description.)
-
-QT_AUTOBRIEF           = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
-# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
-# comments) as a brief description. This used to be the default behaviour. 
-# The new default is to treat a multi-line C++ comment block as a detailed 
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
-MULTILINE_CPP_IS_BRIEF = NO
-
-# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
-# will output the detailed description near the top, like JavaDoc.
-# If set to NO, the detailed description appears after the member 
-# documentation.
-
-DETAILS_AT_TOP         = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
-# member inherits the documentation from any documented member that it 
-# re-implements.
-
-INHERIT_DOCS           = YES
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
-# a new page for each member. If set to NO, the documentation of a member will 
-# be part of the file/class/namespace that contains it.
-
-SEPARATE_MEMBER_PAGES  = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
-TAB_SIZE               = 8
-
-# This tag can be used to specify a number of aliases that acts 
-# as commands in the documentation. An alias has the form "name=value". 
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
-# put the command \sideeffect (or @sideeffect) in the documentation, which 
-# will result in a user-defined paragraph with heading "Side Effects:". 
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES                = 
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
-# sources only. Doxygen will then generate output that is more tailored for C. 
-# For instance, some of the names that are used will be different. The list 
-# of all members will be omitted, etc.
-
-OPTIMIZE_OUTPUT_FOR_C  = YES
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
-# sources only. Doxygen will then generate output that is more tailored for Java. 
-# For instance, namespaces will be presented as packages, qualified scopes 
-# will look different, etc.
-
-OPTIMIZE_OUTPUT_JAVA   = NO
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to 
-# include (a tag file for) the STL sources as input, then you should 
-# set this tag to YES in order to let doxygen match functions declarations and 
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
-# func(std::string) {}). This also make the inheritance and collaboration 
-# diagrams that involve STL classes more complete and accurate.
-
-BUILTIN_STL_SUPPORT    = NO
-
-# If you use Microsoft's C++/CLI language, you should set this option to YES to
-# enable parsing support.
-
-CPP_CLI_SUPPORT        = NO
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
-# tag is set to YES, then doxygen will reuse the documentation of the first 
-# member in the group (if any) for the other members of the group. By default 
-# all members of a group must be documented explicitly.
-
-DISTRIBUTE_GROUP_DOC   = NO
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
-# the same type (for instance a group of public functions) to be put as a 
-# subgroup of that type (e.g. under the Public Functions section). Set it to 
-# NO to prevent subgrouping. Alternatively, this can be done per class using 
-# the \nosubgrouping command.
-
-SUBGROUPING            = YES
-
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
-# documentation are documented, even if no documentation was available. 
-# Private class members and static file members will be hidden unless 
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
-EXTRACT_ALL            = YES
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
-# will be included in the documentation.
-
-EXTRACT_PRIVATE        = YES
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file 
-# will be included in the documentation.
-
-EXTRACT_STATIC         = YES
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
-# defined locally in source files will be included in the documentation. 
-# If set to NO only classes defined in header files are included.
-
-EXTRACT_LOCAL_CLASSES  = YES
-
-# This flag is only useful for Objective-C code. When set to YES local 
-# methods, which are defined in the implementation section but not in 
-# the interface are included in the documentation. 
-# If set to NO (the default) only methods in the interface are included.
-
-EXTRACT_LOCAL_METHODS  = NO
-
-# If this flag is set to YES, the members of anonymous namespaces will be extracted 
-# and appear in the documentation as a namespace called 'anonymous_namespace{file}', 
-# where file will be replaced with the base name of the file that contains the anonymous 
-# namespace. By default anonymous namespace are hidden.
-
-EXTRACT_ANON_NSPACES   = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
-# undocumented members of documented classes, files or namespaces. 
-# If set to NO (the default) these members will be included in the 
-# various overviews, but no documentation section is generated. 
-# This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_MEMBERS     = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
-# undocumented classes that are normally visible in the class hierarchy. 
-# If set to NO (the default) these classes will be included in the various 
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_CLASSES     = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
-# friend (class|struct|union) declarations. 
-# If set to NO (the default) these declarations will be included in the 
-# documentation.
-
-HIDE_FRIEND_COMPOUNDS  = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
-# documentation blocks found inside the body of a function. 
-# If set to NO (the default) these blocks will be appended to the 
-# function's detailed documentation block.
-
-HIDE_IN_BODY_DOCS      = NO
-
-# The INTERNAL_DOCS tag determines if documentation 
-# that is typed after a \internal command is included. If the tag is set 
-# to NO (the default) then the documentation will be excluded. 
-# Set it to YES to include the internal documentation.
-
-INTERNAL_DOCS          = NO
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
-# file names in lower-case letters. If set to YES upper-case letters are also 
-# allowed. This is useful if you have classes or files whose names only differ 
-# in case and if your file system supports case sensitive file names. Windows 
-# and Mac users are advised to set this option to NO.
-
-CASE_SENSE_NAMES       = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
-# will show members with their full class and namespace scopes in the 
-# documentation. If set to YES the scope will be hidden.
-
-HIDE_SCOPE_NAMES       = NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
-# will put a list of the files that are included by a file in the documentation 
-# of that file.
-
-SHOW_INCLUDE_FILES     = YES
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
-# is inserted in the documentation for inline members.
-
-INLINE_INFO            = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
-# will sort the (detailed) documentation of file and class members 
-# alphabetically by member name. If set to NO the members will appear in 
-# declaration order.
-
-SORT_MEMBER_DOCS       = YES
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
-# brief documentation of file, namespace and class members alphabetically 
-# by member name. If set to NO (the default) the members will appear in 
-# declaration order.
-
-SORT_BRIEF_DOCS        = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
-# sorted by fully-qualified names, including namespaces. If set to 
-# NO (the default), the class list will be sorted only by class name, 
-# not including the namespace part. 
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the 
-# alphabetical list.
-
-SORT_BY_SCOPE_NAME     = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or 
-# disable (NO) the todo list. This list is created by putting \todo 
-# commands in the documentation.
-
-GENERATE_TODOLIST      = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or 
-# disable (NO) the test list. This list is created by putting \test 
-# commands in the documentation.
-
-GENERATE_TESTLIST      = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or 
-# disable (NO) the bug list. This list is created by putting \bug 
-# commands in the documentation.
-
-GENERATE_BUGLIST       = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
-# disable (NO) the deprecated list. This list is created by putting 
-# \deprecated commands in the documentation.
-
-GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional 
-# documentation sections, marked by \if sectionname ... \endif.
-
-ENABLED_SECTIONS       = 
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
-# the initial value of a variable or define consists of for it to appear in 
-# the documentation. If the initializer consists of more lines than specified 
-# here it will be hidden. Use a value of 0 to hide initializers completely. 
-# The appearance of the initializer of individual variables and defines in the 
-# documentation can be controlled using \showinitializer or \hideinitializer 
-# command in the documentation regardless of this setting.
-
-MAX_INITIALIZER_LINES  = 30
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
-# at the bottom of the documentation of classes and structs. If set to YES the 
-# list will mention the files that were used to generate the documentation.
-
-SHOW_USED_FILES        = YES
-
-# If the sources in your project are distributed over multiple directories 
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
-# in the documentation. The default is NO.
-
-SHOW_DIRECTORIES       = NO
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
-# doxygen should invoke to get the current version for each file (typically from the 
-# version control system). Doxygen will invoke the program by executing (via 
-# popen()) the command <command> <input-file>, where <command> is the value of 
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
-# provided by doxygen. Whatever the program writes to standard output 
-# is used as the file version. See the manual for examples.
-
-FILE_VERSION_FILTER    = 
-
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated 
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
-QUIET                  = YES
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are 
-# generated by doxygen. Possible values are YES and NO. If left blank 
-# NO is used.
-
-WARNINGS               = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
-# automatically be disabled.
-
-WARN_IF_UNDOCUMENTED   = YES
-
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
-# potential errors in the documentation, such as not documenting some 
-# parameters in a documented function, or documenting parameters that 
-# don't exist or using markup commands wrongly.
-
-WARN_IF_DOC_ERROR      = YES
-
-# This WARN_NO_PARAMDOC option can be abled to get warnings for 
-# functions that are documented, but have no documentation for their parameters 
-# or return value. If set to NO (the default) doxygen will only warn about 
-# wrong or incomplete parameter documentation, but not about the absence of 
-# documentation.
-
-WARN_NO_PARAMDOC       = NO
-
-# The WARN_FORMAT tag determines the format of the warning messages that 
-# doxygen can produce. The string should contain the $file, $line, and $text 
-# tags, which will be replaced by the file and line number from which the 
-# warning originated and the warning text. Optionally the format may contain 
-# $version, which will be replaced by the version of the file (if it could 
-# be obtained via FILE_VERSION_FILTER)
-
-WARN_FORMAT            = "$file:$line: $text "
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning 
-# and error messages should be written. If left blank the output is written 
-# to stderr.
-
-WARN_LOGFILE           = 
-
-#---------------------------------------------------------------------------
-# configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain 
-# documented source files. You may enter file names like "myfile.cpp" or 
-# directories like "/usr/src/myproject". Separate the files or directories 
-# with spaces.
-
-INPUT                  = @top_srcdir@/source @top_srcdir@/include/osl
-
-# This tag can be used to specify the character encoding of the source files that 
-# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default 
-# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. 
-# See http://www.gnu.org/software/libiconv for the list of possible encodings.
-
-INPUT_ENCODING         = UTF-8
-
-# If the value of the INPUT tag contains directories, you can use the 
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank the following patterns are tested: 
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
-# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
-
-FILE_PATTERNS          = 
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
-# should be searched for input files as well. Possible values are YES and NO. 
-# If left blank NO is used.
-
-RECURSIVE              = YES
-
-# The EXCLUDE tag can be used to specify files and/or directories that should 
-# excluded from the INPUT source files. This way you can easily exclude a 
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-
-EXCLUDE                = 
-
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
-# directories that are symbolic links (a Unix filesystem feature) are excluded 
-# from the input.
-
-EXCLUDE_SYMLINKS       = NO
-
-# If the value of the INPUT tag contains directories, you can use the 
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
-# certain files from those directories. Note that the wildcards are matched 
-# against the file with absolute path, so to exclude all test directories 
-# for example use the pattern */test/*
-
-EXCLUDE_PATTERNS       = 
-
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
-# (namespaces, classes, functions, etc.) that should be excluded from the output. 
-# The symbol name can be a fully qualified name, a word, or if the wildcard * is used, 
-# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test
-
-EXCLUDE_SYMBOLS        = 
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or 
-# directories that contain example code fragments that are included (see 
-# the \include command).
-
-EXAMPLE_PATH           = 
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank all files are included.
-
-EXAMPLE_PATTERNS       = 
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
-# searched for input files to be used with the \include or \dontinclude 
-# commands irrespective of the value of the RECURSIVE tag. 
-# Possible values are YES and NO. If left blank NO is used.
-
-EXAMPLE_RECURSIVE      = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or 
-# directories that contain image that are included in the documentation (see 
-# the \image command).
-
-IMAGE_PATH             = 
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should 
-# invoke to filter for each input file. Doxygen will invoke the filter program 
-# by executing (via popen()) the command <filter> <input-file>, where <filter> 
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
-# input file. Doxygen will then use the output that the filter program writes 
-# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
-# ignored.
-
-INPUT_FILTER           = 
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
-# basis.  Doxygen will compare the file name with each pattern and apply the 
-# filter if there is a match.  The filters are a list of the form: 
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
-# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
-# is applied to all files.
-
-FILTER_PATTERNS        = 
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
-# INPUT_FILTER) will be used to filter the input files when producing source 
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-
-FILTER_SOURCE_FILES    = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to source browsing
-#---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
-# be generated. Documented entities will be cross-referenced with these sources. 
-# Note: To get rid of all source code in the generated output, make sure also 
-# VERBATIM_HEADERS is set to NO. If you have enabled CALL_GRAPH or CALLER_GRAPH 
-# then you must also enable this option. If you don't then doxygen will produce 
-# a warning and turn it on anyway
-
-SOURCE_BROWSER         = YES
-
-# Setting the INLINE_SOURCES tag to YES will include the body 
-# of functions and classes directly in the documentation.
-
-INLINE_SOURCES         = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
-# doxygen to hide any special comment blocks from generated source code 
-# fragments. Normal C and C++ comments will always remain visible.
-
-STRIP_CODE_COMMENTS    = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES (the default) 
-# then for each documented function all documented 
-# functions referencing it will be listed.
-
-REFERENCED_BY_RELATION = YES
-
-# If the REFERENCES_RELATION tag is set to YES (the default) 
-# then for each documented function all documented entities 
-# called/used by that function will be listed.
-
-REFERENCES_RELATION    = YES
-
-# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
-# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
-# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
-# link to the source code.  Otherwise they will link to the documentstion.
-
-REFERENCES_LINK_SOURCE = YES
-
-# If the USE_HTAGS tag is set to YES then the references to source code 
-# will point to the HTML generated by the htags(1) tool instead of doxygen 
-# built-in source browser. The htags tool is part of GNU's global source 
-# tagging system (see http://www.gnu.org/software/global/global.html). You 
-# will need version 4.8.6 or higher.
-
-USE_HTAGS              = NO
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
-# will generate a verbatim copy of the header file for each class for 
-# which an include is specified. Set to NO to disable this.
-
-VERBATIM_HEADERS       = YES
-
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
-# of all compounds will be generated. Enable this if the project 
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX     = YES
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
-# in which this list will be split (can be a number in the range [1..20])
-
-COLS_IN_ALPHA_INDEX    = 1
-
-# In case all classes in a project start with a common prefix, all 
-# classes will be put under the same header in the alphabetical index. 
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
-# should be ignored while generating the index headers.
-
-IGNORE_PREFIX          = osl_
-
-#---------------------------------------------------------------------------
-# configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
-# generate HTML output.
-
-GENERATE_HTML          = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT            = html
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
-# doxygen will generate files with .html extension.
-
-HTML_FILE_EXTENSION    = .html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard header.
-
-HTML_HEADER            = 
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard footer.
-
-HTML_FOOTER            = 
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
-# style sheet that is used by each HTML page. It can be used to 
-# fine-tune the look of the HTML output. If the tag is left blank doxygen 
-# will generate a default style sheet. Note that doxygen will try to copy 
-# the style sheet file to the HTML output directory, so don't put your own 
-# stylesheet in the HTML output directory as well, or it will be erased!
-
-HTML_STYLESHEET        = 
-
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
-# files or namespaces will be aligned in HTML using tables. If set to 
-# NO a bullet list will be used.
-
-HTML_ALIGN_MEMBERS     = YES
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
-# will be generated that can be used as input for tools like the 
-# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) 
-# of the generated HTML documentation.
-
-GENERATE_HTMLHELP      = NO
-
-# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
-# documentation will contain sections that can be hidden and shown after the 
-# page has loaded. For this to work a browser that supports 
-# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 
-# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
-
-HTML_DYNAMIC_SECTIONS  = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
-# be used to specify the file name of the resulting .chm file. You 
-# can add a path in front of the file if the result should not be 
-# written to the html output directory.
-
-CHM_FILE               = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
-# be used to specify the location (absolute path including file name) of 
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
-# the HTML help compiler on the generated index.hhp.
-
-HHC_LOCATION           = 
-
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
-# controls if a separate .chi index file is generated (YES) or that 
-# it should be included in the master .chm file (NO).
-
-GENERATE_CHI           = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
-# controls whether a binary table of contents is generated (YES) or a 
-# normal table of contents (NO) in the .chm file.
-
-BINARY_TOC             = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members 
-# to the contents of the HTML help documentation and to the tree view.
-
-TOC_EXPAND             = NO
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
-# top of each HTML page. The value NO (the default) enables the index and 
-# the value YES disables it.
-
-DISABLE_INDEX          = NO
-
-# This tag can be used to set the number of enum values (range [1..20]) 
-# that doxygen will group on one line in the generated HTML documentation.
-
-ENUM_VALUES_PER_LINE   = 4
-
-# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
-# generated containing a tree-like index structure (just like the one that 
-# is generated for HTML Help). For this to work a browser that supports 
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
-# probably better off using the HTML help feature.
-
-GENERATE_TREEVIEW      = NO
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
-# used to set the initial width (in pixels) of the frame in which the tree 
-# is shown.
-
-TREEVIEW_WIDTH         = 250
-
-#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
-# generate Latex output.
-
-GENERATE_LATEX         = YES
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `latex' will be used as the default path.
-
-LATEX_OUTPUT           = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
-# invoked. If left blank `latex' will be used as the default command name.
-
-LATEX_CMD_NAME         = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
-# generate index for LaTeX. If left blank `makeindex' will be used as the 
-# default command name.
-
-MAKEINDEX_CMD_NAME     = makeindex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
-# LaTeX documents. This may be useful for small projects and may help to 
-# save some trees in general.
-
-COMPACT_LATEX          = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used 
-# by the printer. Possible values are: a4, a4wide, letter, legal and 
-# executive. If left blank a4wide will be used.
-
-PAPER_TYPE             = a4wide
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
-# packages that should be included in the LaTeX output.
-
-EXTRA_PACKAGES         = 
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
-# the generated latex document. The header should contain everything until 
-# the first chapter. If it is left blank doxygen will generate a 
-# standard header. Notice: only use this tag if you know what you are doing!
-
-LATEX_HEADER           = 
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
-# contain links (just like the HTML output) instead of page references 
-# This makes the output suitable for online browsing using a pdf viewer.
-
-PDF_HYPERLINKS         = NO
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
-# plain latex in the generated Makefile. Set this option to YES to get a 
-# higher quality PDF documentation.
-
-USE_PDFLATEX           = NO
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
-# command to the generated LaTeX files. This will instruct LaTeX to keep 
-# running if errors occur, instead of asking the user for help. 
-# This option is also used when generating formulas in HTML.
-
-LATEX_BATCHMODE        = NO
-
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
-# include the index chapters (such as File Index, Compound Index, etc.) 
-# in the output.
-
-LATEX_HIDE_INDICES     = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the RTF output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
-# The RTF output is optimized for Word 97 and may not look very pretty with 
-# other RTF readers or editors.
-
-GENERATE_RTF           = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `rtf' will be used as the default path.
-
-RTF_OUTPUT             = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
-# RTF documents. This may be useful for small projects and may help to 
-# save some trees in general.
-
-COMPACT_RTF            = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
-# will contain hyperlink fields. The RTF file will 
-# contain links (just like the HTML output) instead of page references. 
-# This makes the output suitable for online browsing using WORD or other 
-# programs which support those fields. 
-# Note: wordpad (write) and others do not support links.
-
-RTF_HYPERLINKS         = NO
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's 
-# config file, i.e. a series of assignments. You only have to provide 
-# replacements, missing definitions are set to their default value.
-
-RTF_STYLESHEET_FILE    = 
-
-# Set optional variables used in the generation of an rtf document. 
-# Syntax is similar to doxygen's config file.
-
-RTF_EXTENSIONS_FILE    = 
-
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
-# generate man pages
-
-GENERATE_MAN           = YES
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `man' will be used as the default path.
-
-MAN_OUTPUT             = man
-
-# The MAN_EXTENSION tag determines the extension that is added to 
-# the generated man pages (default is the subroutine's section .3)
-
-MAN_EXTENSION          = .3
-
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
-# then it will generate one additional man file for each entity 
-# documented in the real man page(s). These additional files 
-# only source the real man page, but without them the man command 
-# would be unable to find the correct page. The default is NO.
-
-MAN_LINKS              = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will 
-# generate an XML file that captures the structure of 
-# the code including all documentation.
-
-GENERATE_XML           = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `xml' will be used as the default path.
-
-XML_OUTPUT             = xml
-
-# The XML_SCHEMA tag can be used to specify an XML schema, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
-
-XML_SCHEMA             = 
-
-# The XML_DTD tag can be used to specify an XML DTD, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
-
-XML_DTD                = 
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
-# dump the program listings (including syntax highlighting 
-# and cross-referencing information) to the XML output. Note that 
-# enabling this will significantly increase the size of the XML output.
-
-XML_PROGRAMLISTING     = YES
-
-#---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
-# generate an AutoGen Definitions (see autogen.sf.net) file 
-# that captures the structure of the code including all 
-# documentation. Note that this feature is still experimental 
-# and incomplete at the moment.
-
-GENERATE_AUTOGEN_DEF   = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the Perl module output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
-# generate a Perl module file that captures the structure of 
-# the code including all documentation. Note that this 
-# feature is still experimental and incomplete at the 
-# moment.
-
-GENERATE_PERLMOD       = NO
-
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
-# to generate PDF and DVI output from the Perl module output.
-
-PERLMOD_LATEX          = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
-# nicely formatted so it can be parsed by a human reader.  This is useful 
-# if you want to understand what is going on.  On the other hand, if this 
-# tag is set to NO the size of the Perl module output will be much smaller 
-# and Perl will parse it just the same.
-
-PERLMOD_PRETTY         = YES
-
-# The names of the make variables in the generated doxyrules.make file 
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
-# This is useful so different doxyrules.make files included by the same 
-# Makefile don't overwrite each other's variables.
-
-PERLMOD_MAKEVAR_PREFIX = 
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor   
-#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
-# evaluate all C-preprocessor directives found in the sources and include 
-# files.
-
-ENABLE_PREPROCESSING   = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
-# names in the source code. If set to NO (the default) only conditional 
-# compilation will be performed. Macro expansion can be done in a controlled 
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
-MACRO_EXPANSION        = NO
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
-# then the macro expansion is limited to the macros specified with the 
-# PREDEFINED and EXPAND_AS_DEFINED tags.
-
-EXPAND_ONLY_PREDEF     = NO
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
-
-SEARCH_INCLUDES        = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that 
-# contain include files that are not input files but should be processed by 
-# the preprocessor.
-
-INCLUDE_PATH           = 
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
-# patterns (like *.h and *.hpp) to filter out the header-files in the 
-# directories. If left blank, the patterns specified with FILE_PATTERNS will 
-# be used.
-
-INCLUDE_FILE_PATTERNS  = 
-
-# The PREDEFINED tag can be used to specify one or more macro names that 
-# are defined before the preprocessor is started (similar to the -D option of 
-# gcc). The argument of the tag is a list of macros of the form: name 
-# or name=definition (no spaces). If the definition and the = are 
-# omitted =1 is assumed. To prevent a macro definition from being 
-# undefined via #undef or recursively expanded use the := operator 
-# instead of the = operator.
-
-PREDEFINED             = 
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
-# this tag can be used to specify a list of macro names that should be expanded. 
-# The macro definition that is found in the sources will be used. 
-# Use the PREDEFINED tag if you want to use a different macro definition.
-
-EXPAND_AS_DEFINED      = 
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
-# doxygen's preprocessor will remove all function-like macros that are alone 
-# on a line, have an all uppercase name, and do not end with a semicolon. Such 
-# function macros are typically used for boiler-plate code, and will confuse 
-# the parser if not removed.
-
-SKIP_FUNCTION_MACROS   = YES
-
-#---------------------------------------------------------------------------
-# Configuration::additions related to external references   
-#---------------------------------------------------------------------------
-
-# The TAGFILES option can be used to specify one or more tagfiles. 
-# Optionally an initial location of the external documentation 
-# can be added for each tagfile. The format of a tag file without 
-# this location is as follows: 
-#   TAGFILES = file1 file2 ... 
-# Adding location for the tag files is done as follows: 
-#   TAGFILES = file1=loc1 "file2 = loc2" ... 
-# where "loc1" and "loc2" can be relative or absolute paths or 
-# URLs. If a location is present for each tag, the installdox tool 
-# does not have to be run to correct the links.
-# Note that each tag file must have a unique name
-# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen 
-# is run, you must also specify the path to the tagfile here.
-
-TAGFILES               = 
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE       = 
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
-# in the class index. If set to NO only the inherited external classes 
-# will be listed.
-
-ALLEXTERNALS           = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
-# in the modules index. If set to NO, only the current project's groups will 
-# be listed.
-
-EXTERNAL_GROUPS        = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script 
-# interpreter (i.e. the result of `which perl').
-
-PERL_PATH              = /usr/bin/perl
-
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool   
-#---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
-# or super classes. Setting the tag to NO turns the diagrams off. Note that 
-# this option is superseded by the HAVE_DOT option below. This is only a 
-# fallback. It is recommended to install and use dot, since it yields more 
-# powerful graphs.
-
-CLASS_DIAGRAMS         = YES
-
-# You can define message sequence charts within doxygen comments using the \msc 
-# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to 
-# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to 
-# specify the directory where the mscgen tool resides. If left empty the tool is assumed to 
-# be found in the default search path.
-
-MSCGEN_PATH            = 
-
-# If set to YES, the inheritance and collaboration graphs will hide 
-# inheritance and usage relations if the target is undocumented 
-# or is not a class.
-
-HIDE_UNDOC_RELATIONS   = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
-# available from the path. This tool is part of Graphviz, a graph visualization 
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
-# have no effect if this option is set to NO (the default)
-
-HAVE_DOT               = YES
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect inheritance relations. Setting this tag to YES will force the 
-# the CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH            = YES
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect implementation dependencies (inheritance, containment, and 
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH    = YES
-
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for groups, showing the direct groups dependencies
-
-GROUP_GRAPHS           = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
-# collaboration diagrams in a style similar to the OMG's Unified Modeling 
-# Language.
-
-UML_LOOK               = NO
-
-# If set to YES, the inheritance and collaboration graphs will show the 
-# relations between templates and their instances.
-
-TEMPLATE_RELATIONS     = NO
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
-# tags are set to YES then doxygen will generate a graph for each documented 
-# file showing the direct and indirect include dependencies of the file with 
-# other documented files.
-
-INCLUDE_GRAPH          = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
-# documented header file showing the documented files that directly or 
-# indirectly include this file.
-
-INCLUDED_BY_GRAPH      = YES
-
-# If the CALL_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will 
-# generate a call dependency graph for every global function or class method. 
-# Note that enabling this option will significantly increase the time of a run. 
-# So in most cases it will be better to enable call graphs for selected 
-# functions only using the \callgraph command.
-
-CALL_GRAPH             = NO
-
-# If the CALLER_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will 
-# generate a caller dependency graph for every global function or class method. 
-# Note that enabling this option will significantly increase the time of a run. 
-# So in most cases it will be better to enable caller graphs for selected 
-# functions only using the \callergraph command.
-
-CALLER_GRAPH           = NO
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
-# will graphical hierarchy of all classes instead of a textual one.
-
-GRAPHICAL_HIERARCHY    = YES
-
-# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
-# then doxygen will show the dependencies a directory has on other directories 
-# in a graphical way. The dependency relations are determined by the #include
-# relations between the files in the directories.
-
-DIRECTORY_GRAPH        = YES
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
-# generated by dot. Possible values are png, jpg, or gif
-# If left blank png will be used.
-
-DOT_IMAGE_FORMAT       = png
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be 
-# found. If left blank, it is assumed the dot tool can be found in the path.
-
-DOT_PATH               = /usr/bin/
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that 
-# contain dot files that are included in the documentation (see the 
-# \dotfile command).
-
-DOTFILE_DIRS           = 
-
-# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
-# nodes that will be shown in the graph. If the number of nodes in a graph 
-# becomes larger than this value, doxygen will truncate the graph, which is 
-# visualized by representing a node as a red box. Note that doxygen if the number 
-# of direct children of the root node in a graph is already larger than 
-# MAX_DOT_GRAPH_NOTES then the graph will not be shown at all. Also note 
-# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
-
-DOT_GRAPH_MAX_NODES    = 50
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
-# graphs generated by dot. A depth value of 3 means that only nodes reachable 
-# from the root by following a path via at most 3 edges will be shown. Nodes 
-# that lay further from the root node will be omitted. Note that setting this 
-# option to 1 or 2 may greatly reduce the computation time needed for large 
-# code bases. Also note that the size of a graph can be further restricted by 
-# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
-
-MAX_DOT_GRAPH_DEPTH    = 0
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
-# background. This is disabled by default, which results in a white background. 
-# Warning: Depending on the platform used, enabling this option may lead to 
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to 
-# read).
-
-DOT_TRANSPARENT        = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
-# files in one run (i.e. multiple -o and -T options on the command line). This 
-# makes dot run faster, but since only newer versions of dot (>1.8.10) 
-# support this, this feature is disabled by default.
-
-DOT_MULTI_TARGETS      = NO
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
-# generate a legend page explaining the meaning of the various boxes and 
-# arrows in the dot generated graphs.
-
-GENERATE_LEGEND        = YES
-
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
-# remove the intermediate dot files that are used to generate 
-# the various graphs.
-
-DOT_CLEANUP            = YES
-
-#---------------------------------------------------------------------------
-# Configuration::additions related to the search engine   
-#---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be 
-# used. If set to NO the values of all tags below this one will be ignored.
-
-SEARCHENGINE           = NO
diff --git a/cloog-0.17.0/osl/doc/Makefile.am b/cloog-0.17.0/osl/doc/Makefile.am
deleted file mode 100644
index 68dfe67..0000000
--- a/cloog-0.17.0/osl/doc/Makefile.am
+++ /dev/null
@@ -1,119 +0,0 @@
-#
-#   /*+------------------------------------------------------------------**
-#    **                       OpenScop Library                           **
-#    **------------------------------------------------------------------**
-#    **                         makefile.am                              **
-#    **------------------------------------------------------------------**
-#    **                   First version: 30/04/2008                      **
-#    **------------------------------------------------------------------**
-#
-#   
-# ***************************************************************************
-# * OpenScop: Structures and formats for polyhedral tools to talk together  *
-# ***************************************************************************
-# *   ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,               *
-# *   /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,            *
-# *  /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\            *
-# * |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \           *
-# * | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\          *
-# * | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\         *
-# * | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \        *
-# * | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \       *
-# * | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \      *
-# * | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \     *
-# * | T | |   |   | e |   | |   | |   |   |   | |   | |   | |    \  \  \    *
-# * | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \   *
-# * | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \  *
-# * | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /  *
-# * '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'   *
-# *                                                                         *
-# * Copyright (C) 2008 University Paris-Sud and INRIA                       *
-# *                                                                         *
-# * (3-clause BSD license)                                                  *
-# *                                                                         *
-# * Redistribution and use in source  and binary forms, with or without     *
-# * modification, are permitted provided that the following conditions      *
-# * are met:                                                                *
-# *                                                                         *
-# * 1. Redistributions of source code must retain the above copyright       *
-# *    notice, this list of conditions and the following disclaimer.        *
-# * 2. Redistributions in binary form must reproduce the above copyright    *
-# *    notice, this list of conditions and the following disclaimer in the  *
-# *    documentation and/or other materials provided with the distribution. *
-# * 3. The name of the author may not be used to endorse or promote         *
-# *    products derived from this software without specific prior written   *
-# *    permission.                                                          *
-# *                                                                         *
-# * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR    *
-# * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED          *
-# * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  *
-# * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,      *
-# * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES      *
-# * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR      *
-# * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)      *
-# * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,     *
-# * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING   *
-# * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE      *
-# * POSSIBILITY OF SUCH DAMAGE.                                             *
-# *                                                                         *
-# * OpenScop Library, a library to manipulate OpenScop formats and data     *
-# * structures. Written by:                                                 *
-# * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                       *
-# * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                        *
-# *                                                                         *
-# ***************************************************************************/
-#
-# Makefile.am (or makefile if generated) of the OpenScop Library.
-# Makefile.am is not a makefile, you must run the 'autogen.sh' THEN the
-# configure shellscript to generate the Makefile thanks to this file.
-
-
-#############################################################################
-SUBDIRS 		=
-
-#############################################################################
-
-MAINTAINERCLEANFILES	= Makefile.in
-
-EXTRA_DIST		=			\
-	htmldoc.tar.gz				\
-	openscop.pdf				\
-	S4.cloog				\
-	ascii-art.txt				\
-	images/basic.eps			\
-	images/basic.fig			\
-	images/basic.jpg			\
-	images/basic.pdf			\
-	images/basic.txt			\
-	images/basic1.eps			\
-	images/basic1.fig			\
-	images/basic1.jpg			\
-	images/basic1.pdf			\
-	images/basic1.txt			\
-	images/basic2.eps			\
-	images/basic2.fig			\
-	images/basic2.jpg			\
-	images/basic2.pdf			\
-	images/basic2.txt			\
-	images/tree.eps				\
-	images/tree.fig				\
-	images/tree.jpg				\
-	images/tree.pdf				\
-	images/tree.txt
-
-
-info_TEXINFOS		= openscop.texi
-
-DOCDIR			= htmldoc
-DOXYFILE		= Doxyfile
-DOXYGEN			= @DOXYGEN@
-
-# The following requires a fixed version of the Emacs 19.30 etags.
-ETAGS_ARGS		= --lang=none \
- --regex='/^@node[ \t]+\([^,]+\)/\1/' $(srcdir)/doc/openscop.texi
-TAGS_DEPENDENCIES	= openscop.texi $(DOXYFILE).in
-
-htmldoc.tar.gz:
-	mkdir -p $(top_srcdir)/doc/htmldoc
-	$(DOXYGEN) $(DOXYFILE)
-	tar czf htmldoc.tar.gz htmldoc
diff --git a/cloog-0.17.0/osl/doc/Makefile.in b/cloog-0.17.0/osl/doc/Makefile.in
deleted file mode 100644
index 769469e..0000000
--- a/cloog-0.17.0/osl/doc/Makefile.in
+++ /dev/null
@@ -1,947 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-#
-#   /*+------------------------------------------------------------------**
-#    **                       OpenScop Library                           **
-#    **------------------------------------------------------------------**
-#    **                         makefile.am                              **
-#    **------------------------------------------------------------------**
-#    **                   First version: 30/04/2008                      **
-#    **------------------------------------------------------------------**
-#
-#   
-# ***************************************************************************
-# * OpenScop: Structures and formats for polyhedral tools to talk together  *
-# ***************************************************************************
-# *   ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,               *
-# *   /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,            *
-# *  /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\            *
-# * |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \           *
-# * | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\          *
-# * | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\         *
-# * | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \        *
-# * | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \       *
-# * | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \      *
-# * | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \     *
-# * | T | |   |   | e |   | |   | |   |   |   | |   | |   | |    \  \  \    *
-# * | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \   *
-# * | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \  *
-# * | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /  *
-# * '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'   *
-# *                                                                         *
-# * Copyright (C) 2008 University Paris-Sud and INRIA                       *
-# *                                                                         *
-# * (3-clause BSD license)                                                  *
-# *                                                                         *
-# * Redistribution and use in source  and binary forms, with or without     *
-# * modification, are permitted provided that the following conditions      *
-# * are met:                                                                *
-# *                                                                         *
-# * 1. Redistributions of source code must retain the above copyright       *
-# *    notice, this list of conditions and the following disclaimer.        *
-# * 2. Redistributions in binary form must reproduce the above copyright    *
-# *    notice, this list of conditions and the following disclaimer in the  *
-# *    documentation and/or other materials provided with the distribution. *
-# * 3. The name of the author may not be used to endorse or promote         *
-# *    products derived from this software without specific prior written   *
-# *    permission.                                                          *
-# *                                                                         *
-# * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR    *
-# * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED          *
-# * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  *
-# * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,      *
-# * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES      *
-# * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR      *
-# * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)      *
-# * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,     *
-# * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING   *
-# * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE      *
-# * POSSIBILITY OF SUCH DAMAGE.                                             *
-# *                                                                         *
-# * OpenScop Library, a library to manipulate OpenScop formats and data     *
-# * structures. Written by:                                                 *
-# * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                       *
-# * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                        *
-# *                                                                         *
-# ***************************************************************************/
-#
-# Makefile.am (or makefile if generated) of the OpenScop Library.
-# Makefile.am is not a makefile, you must run the 'autogen.sh' THEN the
-# configure shellscript to generate the Makefile thanks to this file.
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = doc
-DIST_COMMON = $(srcdir)/Doxyfile.in $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/autoconf/libtool.m4 \
-	$(top_srcdir)/autoconf/ltoptions.m4 \
-	$(top_srcdir)/autoconf/ltsugar.m4 \
-	$(top_srcdir)/autoconf/ltversion.m4 \
-	$(top_srcdir)/autoconf/lt~obsolete.m4 \
-	$(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_CLEAN_FILES = Doxyfile
-CONFIG_CLEAN_VPATH_FILES =
-SOURCES =
-DIST_SOURCES =
-INFO_DEPS = $(srcdir)/openscop.info
-TEXINFO_TEX = $(top_srcdir)/autoconf/texinfo.tex
-am__TEXINFO_TEX_DIR = $(top_srcdir)/autoconf
-DVIS = openscop.dvi
-PDFS = openscop.pdf
-PSS = openscop.ps
-HTMLS = openscop.html
-TEXINFOS = openscop.texi
-TEXI2DVI = texi2dvi
-TEXI2PDF = $(TEXI2DVI) --pdf --batch
-MAKEINFOHTML = $(MAKEINFO) --html
-AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
-DVIPS = dvips
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-dvi-recursive install-exec-recursive \
-	install-html-recursive install-info-recursive \
-	install-pdf-recursive install-ps-recursive install-recursive \
-	installcheck-recursive installdirs-recursive pdf-recursive \
-	ps-recursive uninstall-recursive
-am__installdirs = "$(DESTDIR)$(infodir)"
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
-  distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
-	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
-	distdir
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CD = @CD@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DOXYGEN = @DOXYGEN@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_aux_dir = @ac_aux_dir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-
-#############################################################################
-SUBDIRS = 
-
-#############################################################################
-MAINTAINERCLEANFILES = Makefile.in
-EXTRA_DIST = \
-	htmldoc.tar.gz				\
-	openscop.pdf				\
-	S4.cloog				\
-	ascii-art.txt				\
-	images/basic.eps			\
-	images/basic.fig			\
-	images/basic.jpg			\
-	images/basic.pdf			\
-	images/basic.txt			\
-	images/basic1.eps			\
-	images/basic1.fig			\
-	images/basic1.jpg			\
-	images/basic1.pdf			\
-	images/basic1.txt			\
-	images/basic2.eps			\
-	images/basic2.fig			\
-	images/basic2.jpg			\
-	images/basic2.pdf			\
-	images/basic2.txt			\
-	images/tree.eps				\
-	images/tree.fig				\
-	images/tree.jpg				\
-	images/tree.pdf				\
-	images/tree.txt
-
-info_TEXINFOS = openscop.texi
-DOCDIR = htmldoc
-DOXYFILE = Doxyfile
-
-# The following requires a fixed version of the Emacs 19.30 etags.
-ETAGS_ARGS = --lang=none \
- --regex='/^@node[ \t]+\([^,]+\)/\1/' $(srcdir)/doc/openscop.texi
-
-TAGS_DEPENDENCIES = openscop.texi $(DOXYFILE).in
-all: all-recursive
-
-.SUFFIXES:
-.SUFFIXES: .dvi .html .info .pdf .ps .texi
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign doc/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-Doxyfile: $(top_builddir)/config.status $(srcdir)/Doxyfile.in
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-.texi.info:
-	restore=: && backupdir="$(am__leading_dot)am$$$$" && \
-	am__cwd=`pwd` && $(am__cd) $(srcdir) && \
-	rm -rf $$backupdir && mkdir $$backupdir && \
-	if ($(MAKEINFO) --version) >/dev/null 2>&1; then \
-	  for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \
-	    if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \
-	  done; \
-	else :; fi && \
-	cd "$$am__cwd"; \
-	if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
-	 -o $@ $<; \
-	then \
-	  rc=0; \
-	  $(am__cd) $(srcdir); \
-	else \
-	  rc=$$?; \
-	  $(am__cd) $(srcdir) && \
-	  $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
-	fi; \
-	rm -rf $$backupdir; exit $$rc
-
-.texi.dvi:
-	TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
-	MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
-	$(TEXI2DVI) $<
-
-.texi.pdf:
-	TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
-	MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
-	$(TEXI2PDF) $<
-
-.texi.html:
-	rm -rf $(@:.html=.htp)
-	if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
-	 -o $(@:.html=.htp) $<; \
-	then \
-	  rm -rf $@; \
-	  if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
-	    mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \
-	else \
-	  if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
-	    rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \
-	  exit 1; \
-	fi
-$(srcdir)/openscop.info: openscop.texi 
-openscop.dvi: openscop.texi 
-openscop.pdf: openscop.texi 
-openscop.html: openscop.texi 
-.dvi.ps:
-	TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
-	$(DVIPS) -o $@ $<
-
-uninstall-dvi-am:
-	@$(NORMAL_UNINSTALL)
-	@list='$(DVIS)'; test -n "$(dvidir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(dvidir)/$$f"; \
-	done
-
-uninstall-html-am:
-	@$(NORMAL_UNINSTALL)
-	@list='$(HTMLS)'; test -n "$(htmldir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \
-	  rm -rf "$(DESTDIR)$(htmldir)/$$f"; \
-	done
-
-uninstall-info-am:
-	@$(PRE_UNINSTALL)
-	@if test -d '$(DESTDIR)$(infodir)' && \
-	    (install-info --version && \
-	     install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
-	  list='$(INFO_DEPS)'; \
-	  for file in $$list; do \
-	    relfile=`echo "$$file" | sed 's|^.*/||'`; \
-	    echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \
-	    if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \
-	    then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \
-	  done; \
-	else :; fi
-	@$(NORMAL_UNINSTALL)
-	@list='$(INFO_DEPS)'; \
-	for file in $$list; do \
-	  relfile=`echo "$$file" | sed 's|^.*/||'`; \
-	  relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \
-	  (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \
-	     echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \
-	     rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \
-	   else :; fi); \
-	done
-
-uninstall-pdf-am:
-	@$(NORMAL_UNINSTALL)
-	@list='$(PDFS)'; test -n "$(pdfdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(pdfdir)/$$f"; \
-	done
-
-uninstall-ps-am:
-	@$(NORMAL_UNINSTALL)
-	@list='$(PSS)'; test -n "$(psdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(psdir)/$$f"; \
-	done
-
-dist-info: $(INFO_DEPS)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	list='$(INFO_DEPS)'; \
-	for base in $$list; do \
-	  case $$base in \
-	    $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \
-	  esac; \
-	  if test -f $$base; then d=.; else d=$(srcdir); fi; \
-	  base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \
-	  for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \
-	    if test -f $$file; then \
-	      relfile=`expr "$$file" : "$$d/\(.*\)"`; \
-	      test -f "$(distdir)/$$relfile" || \
-		cp -p $$file "$(distdir)/$$relfile"; \
-	    else :; fi; \
-	  done; \
-	done
-
-mostlyclean-aminfo:
-	-rm -rf openscop.aux openscop.cp openscop.cps openscop.fn openscop.fns \
-	  openscop.ky openscop.kys openscop.log openscop.pg \
-	  openscop.pgs openscop.tmp openscop.toc openscop.tp \
-	  openscop.tps openscop.vr openscop.vrs
-
-clean-aminfo:
-	-test -z "openscop.dvi openscop.pdf openscop.ps openscop.html" \
-	|| rm -rf openscop.dvi openscop.pdf openscop.ps openscop.html
-
-maintainer-clean-aminfo:
-	@list='$(INFO_DEPS)'; for i in $$list; do \
-	  i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \
-	  echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \
-	  rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \
-	done
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test -d "$(distdir)/$$subdir" \
-	    || $(MKDIR_P) "$(distdir)/$$subdir" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-	    $(am__relativize); \
-	    new_distdir=$$reldir; \
-	    dir1=$$subdir; dir2="$(top_distdir)"; \
-	    $(am__relativize); \
-	    new_top_distdir=$$reldir; \
-	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-	    ($(am__cd) $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$new_top_distdir" \
-	        distdir="$$new_distdir" \
-		am__remove_distdir=: \
-		am__skip_length_check=: \
-		am__skip_mode_fix=: \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-	$(MAKE) $(AM_MAKEFLAGS) \
-	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
-	  dist-info
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(INFO_DEPS)
-installdirs: installdirs-recursive
-installdirs-am:
-	for dir in "$(DESTDIR)$(infodir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-clean: clean-recursive
-
-clean-am: clean-aminfo clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am: $(DVIS)
-
-html: html-recursive
-
-html-am: $(HTMLS)
-
-info: info-recursive
-
-info-am: $(INFO_DEPS)
-
-install-data-am: install-info-am
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am: $(DVIS)
-	@$(NORMAL_INSTALL)
-	test -z "$(dvidir)" || $(MKDIR_P) "$(DESTDIR)$(dvidir)"
-	@list='$(DVIS)'; test -n "$(dvidir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \
-	done
-install-exec-am:
-
-install-html: install-html-recursive
-
-install-html-am: $(HTMLS)
-	@$(NORMAL_INSTALL)
-	test -z "$(htmldir)" || $(MKDIR_P) "$(DESTDIR)$(htmldir)"
-	@list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  $(am__strip_dir) \
-	  if test -d "$$d$$p"; then \
-	    echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \
-	    $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \
-	    echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \
-	    $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \
-	  else \
-	    list2="$$list2 $$d$$p"; \
-	  fi; \
-	done; \
-	test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \
-	done; }
-install-info: install-info-recursive
-
-install-info-am: $(INFO_DEPS)
-	@$(NORMAL_INSTALL)
-	test -z "$(infodir)" || $(MKDIR_P) "$(DESTDIR)$(infodir)"
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
-	for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	  esac; \
-	  if test -f $$file; then d=.; else d=$(srcdir); fi; \
-	  file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \
-	  for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \
-	               $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \
-	    if test -f $$ifile; then \
-	      echo "$$ifile"; \
-	    else : ; fi; \
-	  done; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done
-	@$(POST_INSTALL)
-	@if (install-info --version && \
-	     install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
-	  list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
-	  for file in $$list; do \
-	    relfile=`echo "$$file" | sed 's|^.*/||'`; \
-	    echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\
-	    install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\
-	  done; \
-	else : ; fi
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am: $(PDFS)
-	@$(NORMAL_INSTALL)
-	test -z "$(pdfdir)" || $(MKDIR_P) "$(DESTDIR)$(pdfdir)"
-	@list='$(PDFS)'; test -n "$(pdfdir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done
-install-ps: install-ps-recursive
-
-install-ps-am: $(PSS)
-	@$(NORMAL_INSTALL)
-	test -z "$(psdir)" || $(MKDIR_P) "$(DESTDIR)$(psdir)"
-	@list='$(PSS)'; test -n "$(psdir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-aminfo \
-	maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-aminfo mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am: $(PDFS)
-
-ps: ps-recursive
-
-ps-am: $(PSS)
-
-uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \
-	uninstall-pdf-am uninstall-ps-am
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
-	install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-	all all-am check check-am clean clean-aminfo clean-generic \
-	clean-libtool ctags ctags-recursive dist-info distclean \
-	distclean-generic distclean-libtool distclean-tags distdir dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-man install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs installdirs-am \
-	maintainer-clean maintainer-clean-aminfo \
-	maintainer-clean-generic mostlyclean mostlyclean-aminfo \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags tags-recursive uninstall uninstall-am uninstall-dvi-am \
-	uninstall-html-am uninstall-info-am uninstall-pdf-am \
-	uninstall-ps-am
-
-
-htmldoc.tar.gz:
-	mkdir -p $(top_srcdir)/doc/htmldoc
-	$(DOXYGEN) $(DOXYFILE)
-	tar czf htmldoc.tar.gz htmldoc
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/cloog-0.17.0/osl/doc/S4.cloog b/cloog-0.17.0/osl/doc/S4.cloog
deleted file mode 100644
index 1524381..0000000
--- a/cloog-0.17.0/osl/doc/S4.cloog
+++ /dev/null
@@ -1,44 +0,0 @@
-# language: C
-c
-
-# no parameters
-0 2
-0
-
-1 # One statement
-
-1
-# D = {i, j | 2<=i<=4 2<=j<=4}
-4 4
-#   i   j   1
-1   1   0  -2
-1  -1   0   4
-1   0   1  -2
-1   0  -1   4
-0   0   0
-0
-
-1 # Scattering function
-
-# T = (j+2,3i+j)
-2 6
-#  t1  t2   i   j   1
-0   1   0   0  -1   0
-0   0   1  -1   0   0
-
-1
-t1 t2
-
-#############################
-
-
-# T = (j,i)
-2 6
-#  t1  t2   i   j   1
-0   1   0   0  -1   0
-0   0   1  -1   0   0
-
-2 6
-#  t1  t2   i   j   1
-0   1   0   0  -1  -2
-0   0   1  -3  -1   0
diff --git a/cloog-0.17.0/osl/doc/ascii-art.txt b/cloog-0.17.0/osl/doc/ascii-art.txt
deleted file mode 100644
index dd56019..0000000
--- a/cloog-0.17.0/osl/doc/ascii-art.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-          <|
-           A             
-          /.\       
-     <|  [""M#      
-      A   | #      
-     /.\ [""M#     
-    [""M# | #  U"U#U                 
-     | #  | #  \ .:/    
-     | #  | #___| #     
-     | "--'     .-"     
-   |"-"-"-"-"-#-#-##    
-   |     # ## ######     
-    \       .::::'/     
-     \      ::::'/      
-   :8a|    # # ##      
-   ::88a      ###       
-  ::::888a  8a ##::.    
-  ::::::888a88a[]::::
- :::::::::SUNDOGa8a::::. ..              
- :::::8::::888:Y8888:::::::::...      
-::':::88::::888::Y88a______________________________________________________
-:: ::::88a::::88a:Y88a                                  __---__-- __
-' .: ::Y88a:::::8a:Y88a                            __----_-- -------_-__
-  :' ::::8P::::::::::88aa.                   _ _- --  --_ --- __  --- __--
-.::  :::::::::::::::::::Y88as88a...s88aa.
diff --git a/cloog-0.17.0/osl/doc/htmldoc.tar.gz b/cloog-0.17.0/osl/doc/htmldoc.tar.gz
deleted file mode 100644
index 390f99e..0000000
--- a/cloog-0.17.0/osl/doc/htmldoc.tar.gz
+++ /dev/null
Binary files differ
diff --git a/cloog-0.17.0/osl/doc/images/basic.eps b/cloog-0.17.0/osl/doc/images/basic.eps
deleted file mode 100644
index 0cc0497..0000000
--- a/cloog-0.17.0/osl/doc/images/basic.eps
+++ /dev/null
@@ -1,402 +0,0 @@
-%!PS-Adobe-2.0 EPSF-2.0
-%%Title: basic.fig
-%%Creator: fig2dev Version 3.2 Patchlevel 4
-%%CreationDate: Thu Nov 17 16:54:54 2005
-%%For: bastoul@ulysse.futurs.inria.fr (Cedric Bastoul)
-%%BoundingBox: 0 0 445 301
-%%Magnification: 1.0000
-%%EndComments
-/$F2psDict 200 dict def
-$F2psDict begin
-$F2psDict /mtrx matrix put
-/col-1 {0 setgray} bind def
-/col0 {0.000 0.000 0.000 srgb} bind def
-/col1 {0.000 0.000 1.000 srgb} bind def
-/col2 {0.000 1.000 0.000 srgb} bind def
-/col3 {0.000 1.000 1.000 srgb} bind def
-/col4 {1.000 0.000 0.000 srgb} bind def
-/col5 {1.000 0.000 1.000 srgb} bind def
-/col6 {1.000 1.000 0.000 srgb} bind def
-/col7 {1.000 1.000 1.000 srgb} bind def
-/col8 {0.000 0.000 0.560 srgb} bind def
-/col9 {0.000 0.000 0.690 srgb} bind def
-/col10 {0.000 0.000 0.820 srgb} bind def
-/col11 {0.530 0.810 1.000 srgb} bind def
-/col12 {0.000 0.560 0.000 srgb} bind def
-/col13 {0.000 0.690 0.000 srgb} bind def
-/col14 {0.000 0.820 0.000 srgb} bind def
-/col15 {0.000 0.560 0.560 srgb} bind def
-/col16 {0.000 0.690 0.690 srgb} bind def
-/col17 {0.000 0.820 0.820 srgb} bind def
-/col18 {0.560 0.000 0.000 srgb} bind def
-/col19 {0.690 0.000 0.000 srgb} bind def
-/col20 {0.820 0.000 0.000 srgb} bind def
-/col21 {0.560 0.000 0.560 srgb} bind def
-/col22 {0.690 0.000 0.690 srgb} bind def
-/col23 {0.820 0.000 0.820 srgb} bind def
-/col24 {0.500 0.190 0.000 srgb} bind def
-/col25 {0.630 0.250 0.000 srgb} bind def
-/col26 {0.750 0.380 0.000 srgb} bind def
-/col27 {1.000 0.500 0.500 srgb} bind def
-/col28 {1.000 0.630 0.630 srgb} bind def
-/col29 {1.000 0.750 0.750 srgb} bind def
-/col30 {1.000 0.880 0.880 srgb} bind def
-/col31 {1.000 0.840 0.000 srgb} bind def
-
-end
-save
-newpath 0 301 moveto 0 0 lineto 445 0 lineto 445 301 lineto closepath clip newpath
--153.0 333.0 translate
-1 -1 scale
-
-/cp {closepath} bind def
-/ef {eofill} bind def
-/gr {grestore} bind def
-/gs {gsave} bind def
-/sa {save} bind def
-/rs {restore} bind def
-/l {lineto} bind def
-/m {moveto} bind def
-/rm {rmoveto} bind def
-/n {newpath} bind def
-/s {stroke} bind def
-/sh {show} bind def
-/slc {setlinecap} bind def
-/slj {setlinejoin} bind def
-/slw {setlinewidth} bind def
-/srgb {setrgbcolor} bind def
-/rot {rotate} bind def
-/sc {scale} bind def
-/sd {setdash} bind def
-/ff {findfont} bind def
-/sf {setfont} bind def
-/scf {scalefont} bind def
-/sw {stringwidth} bind def
-/tr {translate} bind def
-/tnt {dup dup currentrgbcolor
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
-  bind def
-/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
-  4 -2 roll mul srgb} bind def
-/reencdict 12 dict def /ReEncode { reencdict begin
-/newcodesandnames exch def /newfontname exch def /basefontname exch def
-/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def
-basefontdict { exch dup /FID ne { dup /Encoding eq
-{ exch dup length array copy newfont 3 1 roll put }
-{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall
-newfont /FontName newfontname put newcodesandnames aload pop
-128 1 255 { newfont /Encoding get exch /.notdef put } for
-newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat
-newfontname newfont definefont pop end } def
-/isovec [
-8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde
-8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis
-8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron
-8#220 /dotlessi 8#230 /oe 8#231 /OE
-8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling
-8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis
-8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot
-8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus
-8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph
-8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine
-8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf
-8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute
-8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring
-8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute
-8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute
-8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve
-8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply
-8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex
-8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave
-8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring
-8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute
-8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute
-8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve
-8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide
-8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex
-8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def
-/Times-Bold /Times-Bold-iso isovec ReEncode
-/Times-Roman /Times-Roman-iso isovec ReEncode
- /DrawEllipse {
-	/endangle exch def
-	/startangle exch def
-	/yrad exch def
-	/xrad exch def
-	/y exch def
-	/x exch def
-	/savematrix mtrx currentmatrix def
-	x y tr xrad yrad sc 0 0 1 startangle endangle arc
-	closepath
-	savematrix setmatrix
-	} def
-
-/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
-/$F2psEnd {$F2psEnteredState restore end} def
-
-$F2psBegin
-10 setmiterlimit
-0 slj 0 slc
- 0.06000 0.06000 sc
-%
-% Fig objects follow
-%
-% 
-% here starts figure with depth 51
-% Polyline
-n 4200 1500 m 4200 3900 l 8400 3900 l 6000 1500 l
- cp gs col7 0.75 shd ef gr 
-% Ellipse
-7.500 slw
- [15 45] 45 sd
-1 slc
-n 5400 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6000 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6600 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 7200 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 7800 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 7200 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6600 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6000 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 5400 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 5400 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6000 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6600 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6000 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 5400 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 5400 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 7800 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 8400 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 7200 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6600 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6000 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Polyline
-0 slc
-gs  clippath
-9615 5160 m 9615 5040 l 9395 5040 l 9575 5100 l 9395 5160 l cp
-eoclip
-n 3000 5100 m
- 9600 5100 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 9395 5160 m 9575 5100 l 9395 5040 l 9395 5160 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-3060 885 m 2940 885 l 2940 1105 l 3000 925 l 3060 1105 l cp
-eoclip
-n 3000 5100 m
- 3000 900 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 3060 1105 m 3000 925 l 2940 1105 l 3060 1105 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-n 3000 4500 m
- 2925 4500 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 3900 m
- 2925 3900 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 3300 m
- 2925 3300 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3600 5100 m
- 3600 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 4200 5100 m
- 4200 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 5400 5100 m
- 5400 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 4800 5100 m
- 4800 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 6000 5100 m
- 6000 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 6600 5100 m
- 6600 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 2700 m
- 2925 2700 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 1500 m
- 2925 1500 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 2100 m
- 2925 2100 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
- [15 45] 45 sd
-n 3000 1500 m
- 9000 1500 l gs col0 s gr  [] 0 sd
-% Polyline
- [15 45] 45 sd
-n 8400 5100 m
- 8400 900 l gs col0 s gr  [] 0 sd
-% Polyline
-n 7200 5100 m
- 7200 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 7800 5100 m
- 7800 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 8400 5100 m
- 8400 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
- [15 45] 45 sd
-n 3000 3900 m
- 9000 3900 l gs col0 s gr  [] 0 sd
-% Polyline
- [15 45] 45 sd
-n 5400 900 m
- 9600 5100 l gs col0 s gr  [] 0 sd
-% Polyline
- [15 45] 45 sd
-n 4200 5100 m
- 4200 900 l gs col0 s gr  [] 0 sd
-/Times-Bold-iso ff 390.00 scf sf
-2625 4650 m
-gs 1 -1 sc (1) col0 sh gr
-/Times-Bold-iso ff 390.00 scf sf
-2625 4050 m
-gs 1 -1 sc (2) col0 sh gr
-/Times-Bold-iso ff 390.00 scf sf
-3525 5550 m
-gs 1 -1 sc (1) col0 sh gr
-/Times-Bold-iso ff 390.00 scf sf
-2700 1050 m
-gs 1 -1 sc (j) col0 sh gr
-/Times-Roman-iso ff 390.00 scf sf
-8025 825 m
-gs 1 -1 sc (i<=n) col0 sh gr
-/Times-Bold-iso ff 390.00 scf sf
-4125 5550 m
-gs 1 -1 sc (2) col0 sh gr
-/Times-Bold-iso ff 390.00 scf sf
-8325 5550 m
-gs 1 -1 sc (n) col0 sh gr
-/Times-Bold-iso ff 390.00 scf sf
-2550 1575 m
-gs 1 -1 sc (m) col0 sh gr
-/Times-Roman-iso ff 390.00 scf sf
-9075 3975 m
-gs 1 -1 sc (j>=2) col0 sh gr
-/Times-Roman-iso ff 390.00 scf sf
-9075 1575 m
-gs 1 -1 sc (j<=m) col0 sh gr
-/Times-Bold-iso ff 390.00 scf sf
-9450 5475 m
-gs 1 -1 sc (i) col0 sh gr
-/Times-Roman-iso ff 390.00 scf sf
-3825 825 m
-gs 1 -1 sc (i>=2) col0 sh gr
-/Times-Roman-iso ff 390.00 scf sf
-4875 825 m
-gs 1 -1 sc (j<=n+2-i) col0 sh gr
-% here ends figure;
-$F2psEnd
-rs
-showpage
diff --git a/cloog-0.17.0/osl/doc/images/basic.fig b/cloog-0.17.0/osl/doc/images/basic.fig
deleted file mode 100644
index 7fe0a97..0000000
--- a/cloog-0.17.0/osl/doc/images/basic.fig
+++ /dev/null
@@ -1,100 +0,0 @@
-#FIG 3.2
-Landscape
-Center
-Inches
-Letter  
-100.00
-Single
--2
-1200 2
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 3900 75 75 5400 3900 5400 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 3900 75 75 4800 3900 4800 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 3300 75 75 4200 3300 4200 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 3300 75 75 4800 3300 4800 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 2700 75 75 4200 2700 4200 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 3900 75 75 4200 3900 4200 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 3900 75 75 6000 3900 6000 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 3900 75 75 6600 3900 6600 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 7200 3900 75 75 7200 3900 7200 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 7800 3900 75 75 7800 3900 7800 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 7200 3300 75 75 7200 3300 7200 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 3300 75 75 6600 3300 6600 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 3300 75 75 6000 3300 6000 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 3300 75 75 5400 3300 5400 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 2700 75 75 4800 2700 4800 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 2700 75 75 5400 2700 5400 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 2700 75 75 6000 2700 6000 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 2700 75 75 6600 2700 6600 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 2100 75 75 6000 2100 6000 2175
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 2100 75 75 5400 2100 5400 2175
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 2100 75 75 4800 2100 4800 2175
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 2100 75 75 4200 2100 4200 2175
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 1500 75 75 4200 1500 4200 1575
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 1500 75 75 4800 1500 4800 1575
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 1500 75 75 5400 1500 5400 1575
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 7800 3300 75 75 7800 3300 7800 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 8400 3900 75 75 8400 3900 8400 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 7200 2700 75 75 7200 2700 7200 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 2100 75 75 6600 2100 6600 2175
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 1500 75 75 6000 1500 6000 1575
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 120.00 180.00
-	 3000 5100 9600 5100
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 120.00 180.00
-	 3000 5100 3000 900
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 4500 2925 4500
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 3900 2925 3900
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 3300 2925 3300
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3600 5100 3600 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 4200 5100 4200 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 5400 5100 5400 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 4800 5100 4800 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 6000 5100 6000 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 6600 5100 6600 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 2700 2925 2700
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 1500 2925 1500
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 2100 2925 2100
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 3000 1500 9000 1500
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 8400 5100 8400 900
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 7200 5100 7200 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 7800 5100 7800 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 8400 5100 8400 5175
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 3000 3900 9000 3900
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 5400 900 9600 5100
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 4200 5100 4200 900
-2 3 0 0 0 7 51 -1 15 0.000 0 0 -1 0 0 5
-	 4200 1500 4200 3900 8400 3900 6000 1500 4200 1500
-4 0 0 50 -1 2 26 0.0000 0 270 195 2625 4650 1\001
-4 0 0 50 -1 2 26 0.0000 0 270 195 2625 4050 2\001
-4 0 0 50 -1 2 26 0.0000 0 270 195 3525 5550 1\001
-4 0 0 50 -1 2 26 0.0000 0 345 135 2700 1050 j\001
-4 0 0 50 -1 0 26 0.0000 0 270 750 8025 825 i<=n\001
-4 0 0 50 -1 2 26 0.0000 0 270 195 4125 5550 2\001
-4 0 0 50 -1 2 26 0.0000 0 180 225 8325 5550 n\001
-4 0 0 50 -1 2 26 0.0000 0 180 330 2550 1575 m\001
-4 0 0 50 -1 0 26 0.0000 0 360 750 9075 3975 j>=2\001
-4 0 0 50 -1 0 26 0.0000 0 360 855 9075 1575 j<=m\001
-4 0 0 50 -1 2 26 0.0000 0 270 105 9450 5475 i\001
-4 0 0 50 -1 0 26 0.0000 0 270 750 3825 825 i>=2\001
-4 0 0 50 -1 0 26 0.0000 0 360 1410 4875 825 j<=n+2-i\001
diff --git a/cloog-0.17.0/osl/doc/images/basic.jpg b/cloog-0.17.0/osl/doc/images/basic.jpg
deleted file mode 100644
index 995b1d8..0000000
--- a/cloog-0.17.0/osl/doc/images/basic.jpg
+++ /dev/null
Binary files differ
diff --git a/cloog-0.17.0/osl/doc/images/basic.pdf b/cloog-0.17.0/osl/doc/images/basic.pdf
deleted file mode 100644
index d15d42b..0000000
--- a/cloog-0.17.0/osl/doc/images/basic.pdf
+++ /dev/null
Binary files differ
diff --git a/cloog-0.17.0/osl/doc/images/basic.txt b/cloog-0.17.0/osl/doc/images/basic.txt
deleted file mode 100644
index e40913a..0000000
--- a/cloog-0.17.0/osl/doc/images/basic.txt
+++ /dev/null
@@ -1,13 +0,0 @@
- j^ i>=2          
-  | | j<=n+2-i    
-  | |\     | i<=n
-  | | \    |     
-m-+-****---+-j<=m
-  | *****  |     
-  | ****** |     
-  | *******|     
-2-+-********-j>=2
-  | |      |\    
-0-+-+------+--->i
-  | |      |     
-  0 2      n     
diff --git a/cloog-0.17.0/osl/doc/images/basic1.eps b/cloog-0.17.0/osl/doc/images/basic1.eps
deleted file mode 100644
index 9ff60bc..0000000
--- a/cloog-0.17.0/osl/doc/images/basic1.eps
+++ /dev/null
@@ -1,332 +0,0 @@
-%!PS-Adobe-2.0 EPSF-2.0
-%%Title: basic1.fig
-%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha7
-%%CreationDate: Fri May  9 15:48:25 2008
-%%For: cedb@localhost (Bastoul Cedric)
-%%BoundingBox: 0 0 347 303
-%Magnification: 1.0000
-%%EndComments
-/$F2psDict 200 dict def
-$F2psDict begin
-$F2psDict /mtrx matrix put
-/col-1 {0 setgray} bind def
-/col0 {0.000 0.000 0.000 srgb} bind def
-/col1 {0.000 0.000 1.000 srgb} bind def
-/col2 {0.000 1.000 0.000 srgb} bind def
-/col3 {0.000 1.000 1.000 srgb} bind def
-/col4 {1.000 0.000 0.000 srgb} bind def
-/col5 {1.000 0.000 1.000 srgb} bind def
-/col6 {1.000 1.000 0.000 srgb} bind def
-/col7 {1.000 1.000 1.000 srgb} bind def
-/col8 {0.000 0.000 0.560 srgb} bind def
-/col9 {0.000 0.000 0.690 srgb} bind def
-/col10 {0.000 0.000 0.820 srgb} bind def
-/col11 {0.530 0.810 1.000 srgb} bind def
-/col12 {0.000 0.560 0.000 srgb} bind def
-/col13 {0.000 0.690 0.000 srgb} bind def
-/col14 {0.000 0.820 0.000 srgb} bind def
-/col15 {0.000 0.560 0.560 srgb} bind def
-/col16 {0.000 0.690 0.690 srgb} bind def
-/col17 {0.000 0.820 0.820 srgb} bind def
-/col18 {0.560 0.000 0.000 srgb} bind def
-/col19 {0.690 0.000 0.000 srgb} bind def
-/col20 {0.820 0.000 0.000 srgb} bind def
-/col21 {0.560 0.000 0.560 srgb} bind def
-/col22 {0.690 0.000 0.690 srgb} bind def
-/col23 {0.820 0.000 0.820 srgb} bind def
-/col24 {0.500 0.190 0.000 srgb} bind def
-/col25 {0.630 0.250 0.000 srgb} bind def
-/col26 {0.750 0.380 0.000 srgb} bind def
-/col27 {1.000 0.500 0.500 srgb} bind def
-/col28 {1.000 0.630 0.630 srgb} bind def
-/col29 {1.000 0.750 0.750 srgb} bind def
-/col30 {1.000 0.880 0.880 srgb} bind def
-/col31 {1.000 0.840 0.000 srgb} bind def
-
-end
-save
-newpath 0 303 moveto 0 0 lineto 347 0 lineto 347 303 lineto closepath clip newpath
--152.1 333.9 translate
-1 -1 scale
-
-/cp {closepath} bind def
-/ef {eofill} bind def
-/gr {grestore} bind def
-/gs {gsave} bind def
-/sa {save} bind def
-/rs {restore} bind def
-/l {lineto} bind def
-/m {moveto} bind def
-/rm {rmoveto} bind def
-/n {newpath} bind def
-/s {stroke} bind def
-/sh {show} bind def
-/slc {setlinecap} bind def
-/slj {setlinejoin} bind def
-/slw {setlinewidth} bind def
-/srgb {setrgbcolor} bind def
-/rot {rotate} bind def
-/sc {scale} bind def
-/sd {setdash} bind def
-/ff {findfont} bind def
-/sf {setfont} bind def
-/scf {scalefont} bind def
-/sw {stringwidth} bind def
-/tr {translate} bind def
-/tnt {dup dup currentrgbcolor
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
-  bind def
-/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
-  4 -2 roll mul srgb} bind def
- /DrawEllipse {
-	/endangle exch def
-	/startangle exch def
-	/yrad exch def
-	/xrad exch def
-	/y exch def
-	/x exch def
-	/savematrix mtrx currentmatrix def
-	x y tr xrad yrad sc 0 0 1 startangle endangle arc
-	closepath
-	savematrix setmatrix
-	} def
-
-/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
-/$F2psEnd {$F2psEnteredState restore end} def
-
-$F2psBegin
-10 setmiterlimit
-0 slj 0 slc
- 0.06000 0.06000 sc
-%
-% Fig objects follow
-%
-% 
-% here starts figure with depth 51
-% Polyline
-0 slj
-0 slc
-0.000 slw
-n 4200 1500 m 4200 3900 l 6675 3900 l 6675 1500 l
- cp gs col7 0.75 shd ef gr 
-% Ellipse
-7.500 slw
- [15 45] 45 sd
-1 slc
-n 5400 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6000 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6600 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6600 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6000 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 5400 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 5400 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6000 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6600 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6000 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 5400 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 5400 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6600 2100 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6000 1500 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 6653 1522 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Polyline
-0 slc
-gs  clippath
-6970 5160 m 7215 5160 l 7215 5040 l 6970 5040 l 6970 5040 l 7150 5100 l 6970 5160 l cp
-eoclip
-n 3000 5100 m
- 7200 5100 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 6970 5160 m 7150 5100 l 6970 5040 l 6970 5160 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-3060 1130 m 3060 885 l 2940 885 l 2940 1130 l 2940 1130 l 3000 950 l 3060 1130 l cp
-eoclip
-n 3000 5100 m
- 3000 900 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 3060 1130 m 3000 950 l 2940 1130 l 3060 1130 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-n 3000 4500 m
- 2925 4500 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 3900 m
- 2925 3900 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 3300 m
- 2925 3300 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3600 5100 m
- 3600 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 4200 5100 m
- 4200 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 5400 5100 m
- 5400 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 4800 5100 m
- 4800 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 6000 5100 m
- 6000 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 6600 5100 m
- 6600 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 2700 m
- 2925 2700 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 1500 m
- 2925 1500 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 2100 m
- 2925 2100 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
- [15 45] 45 sd
-n 3000 1500 m
- 7200 1500 l gs col0 s gr  [] 0 sd
-% Polyline
- [15 45] 45 sd
-n 3000 3900 m
- 7200 3900 l gs col0 s gr  [] 0 sd
-% Polyline
- [15 45] 45 sd
-n 4200 5100 m
- 4200 900 l gs col0 s gr  [] 0 sd
-% Polyline
- [15 45] 45 sd
-n 6675 5100 m
- 6675 900 l gs col0 s gr  [] 0 sd
-/Times-Bold ff 433.33 scf sf
-2625 4650 m
-gs 1 -1 sc (1) col0 sh gr
-/Times-Bold ff 433.33 scf sf
-2625 4050 m
-gs 1 -1 sc (2) col0 sh gr
-/Times-Bold ff 433.33 scf sf
-3525 5550 m
-gs 1 -1 sc (1) col0 sh gr
-/Times-Bold ff 433.33 scf sf
-2700 1050 m
-gs 1 -1 sc (j) col0 sh gr
-/Times-Bold ff 433.33 scf sf
-4125 5550 m
-gs 1 -1 sc (2) col0 sh gr
-/Times-Roman ff 433.33 scf sf
-3825 825 m
-gs 1 -1 sc (i>=2) col0 sh gr
-/Times-Bold ff 433.33 scf sf
-2550 1575 m
-gs 1 -1 sc (N) col0 sh gr
-/Times-Bold ff 433.33 scf sf
-6450 5550 m
-gs 1 -1 sc (N) col0 sh gr
-/Times-Bold ff 433.33 scf sf
-7275 5475 m
-gs 1 -1 sc (i) col0 sh gr
-/Times-Roman ff 433.33 scf sf
-6300 900 m
-gs 1 -1 sc (i<=N) col0 sh gr
-/Times-Roman ff 433.33 scf sf
-7350 1575 m
-gs 1 -1 sc (j<=N) col0 sh gr
-/Times-Roman ff 433.33 scf sf
-7350 3975 m
-gs 1 -1 sc (j>=2) col0 sh gr
-% here ends figure;
-$F2psEnd
-rs
-showpage
-%%Trailer
-%EOF
diff --git a/cloog-0.17.0/osl/doc/images/basic1.fig b/cloog-0.17.0/osl/doc/images/basic1.fig
deleted file mode 100644
index caf0ebd..0000000
--- a/cloog-0.17.0/osl/doc/images/basic1.fig
+++ /dev/null
@@ -1,86 +0,0 @@
-#FIG 3.2  Produced by xfig version 3.2.5-alpha5
-Landscape
-Center
-Inches
-Letter  
-100.00
-Single
--2
-1200 2
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 3900 75 75 5400 3900 5400 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 3900 75 75 4800 3900 4800 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 3300 75 75 4200 3300 4200 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 3300 75 75 4800 3300 4800 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 2700 75 75 4200 2700 4200 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 3900 75 75 4200 3900 4200 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 3900 75 75 6000 3900 6000 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 3900 75 75 6600 3900 6600 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 3300 75 75 6600 3300 6600 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 3300 75 75 6000 3300 6000 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 3300 75 75 5400 3300 5400 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 2700 75 75 4800 2700 4800 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 2700 75 75 5400 2700 5400 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 2700 75 75 6000 2700 6000 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 2700 75 75 6600 2700 6600 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 2100 75 75 6000 2100 6000 2175
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 2100 75 75 5400 2100 5400 2175
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 2100 75 75 4800 2100 4800 2175
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 2100 75 75 4200 2100 4200 2175
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 1500 75 75 4200 1500 4200 1575
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 1500 75 75 4800 1500 4800 1575
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 1500 75 75 5400 1500 5400 1575
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6600 2100 75 75 6600 2100 6600 2175
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6000 1500 75 75 6000 1500 6000 1575
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 6653 1522 75 75 6653 1522 6653 1597
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 120.00 180.00
-	 3000 5100 7200 5100
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 120.00 180.00
-	 3000 5100 3000 900
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 4500 2925 4500
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 3900 2925 3900
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 3300 2925 3300
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3600 5100 3600 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 4200 5100 4200 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 5400 5100 5400 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 4800 5100 4800 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 6000 5100 6000 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 6600 5100 6600 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 2700 2925 2700
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 1500 2925 1500
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 2100 2925 2100
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 3000 1500 7200 1500
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 3000 3900 7200 3900
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 4200 5100 4200 900
-2 3 0 0 0 7 51 -1 15 0.000 0 0 -1 0 0 5
-	 4200 1500 4200 3900 6675 3900 6675 1500 4200 1500
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 6675 5100 6675 900
-4 0 0 50 -1 2 26 0.0000 0 285 225 2625 4650 1\001
-4 0 0 50 -1 2 26 0.0000 0 285 225 2625 4050 2\001
-4 0 0 50 -1 2 26 0.0000 0 285 225 3525 5550 1\001
-4 0 0 50 -1 2 26 0.0000 0 375 150 2700 1050 j\001
-4 0 0 50 -1 2 26 0.0000 0 285 225 4125 5550 2\001
-4 0 0 50 -1 0 26 0.0000 0 285 825 3825 825 i>=2\001
-4 0 0 50 -1 2 26 0.0000 0 285 315 2550 1575 N\001
-4 0 0 50 -1 2 26 0.0000 0 285 315 6450 5550 N\001
-4 0 0 50 -1 2 26 0.0000 0 285 120 7275 5475 i\001
-4 0 0 50 -1 0 26 0.0000 0 285 915 6300 900 i<=N\001
-4 0 0 50 -1 0 26 0.0000 0 375 915 7350 1575 j<=N\001
-4 0 0 50 -1 0 26 0.0000 0 375 825 7350 3975 j>=2\001
diff --git a/cloog-0.17.0/osl/doc/images/basic1.jpg b/cloog-0.17.0/osl/doc/images/basic1.jpg
deleted file mode 100644
index 55830d4..0000000
--- a/cloog-0.17.0/osl/doc/images/basic1.jpg
+++ /dev/null
Binary files differ
diff --git a/cloog-0.17.0/osl/doc/images/basic1.pdf b/cloog-0.17.0/osl/doc/images/basic1.pdf
deleted file mode 100644
index 7f5be6a..0000000
--- a/cloog-0.17.0/osl/doc/images/basic1.pdf
+++ /dev/null
Binary files differ
diff --git a/cloog-0.17.0/osl/doc/images/basic1.txt b/cloog-0.17.0/osl/doc/images/basic1.txt
deleted file mode 100644
index d02e6ae..0000000
--- a/cloog-0.17.0/osl/doc/images/basic1.txt
+++ /dev/null
@@ -1,12 +0,0 @@
- j^ i>=2   i<=N      
-  | |      |
-  | |      |     
-N-+-********--j<=N
-  | ********     
-  | ********     
-  | ********     
-2-+-********--j>=2
-  | |      |     
-0-+-+------+--->i
-  | |      |     
-  0 2      N     
diff --git a/cloog-0.17.0/osl/doc/images/basic2.eps b/cloog-0.17.0/osl/doc/images/basic2.eps
deleted file mode 100644
index a3781fe..0000000
--- a/cloog-0.17.0/osl/doc/images/basic2.eps
+++ /dev/null
@@ -1,256 +0,0 @@
-%!PS-Adobe-2.0 EPSF-2.0
-%%Title: basic2.fig
-%%Creator: fig2dev Version 3.2 Patchlevel 5-alpha7
-%%CreationDate: Sat May 10 21:23:40 2008
-%%For: cedb@localhost (Bastoul Cedric)
-%%BoundingBox: 0 0 260 235
-%Magnification: 1.0000
-%%EndComments
-/$F2psDict 200 dict def
-$F2psDict begin
-$F2psDict /mtrx matrix put
-/col-1 {0 setgray} bind def
-/col0 {0.000 0.000 0.000 srgb} bind def
-/col1 {0.000 0.000 1.000 srgb} bind def
-/col2 {0.000 1.000 0.000 srgb} bind def
-/col3 {0.000 1.000 1.000 srgb} bind def
-/col4 {1.000 0.000 0.000 srgb} bind def
-/col5 {1.000 0.000 1.000 srgb} bind def
-/col6 {1.000 1.000 0.000 srgb} bind def
-/col7 {1.000 1.000 1.000 srgb} bind def
-/col8 {0.000 0.000 0.560 srgb} bind def
-/col9 {0.000 0.000 0.690 srgb} bind def
-/col10 {0.000 0.000 0.820 srgb} bind def
-/col11 {0.530 0.810 1.000 srgb} bind def
-/col12 {0.000 0.560 0.000 srgb} bind def
-/col13 {0.000 0.690 0.000 srgb} bind def
-/col14 {0.000 0.820 0.000 srgb} bind def
-/col15 {0.000 0.560 0.560 srgb} bind def
-/col16 {0.000 0.690 0.690 srgb} bind def
-/col17 {0.000 0.820 0.820 srgb} bind def
-/col18 {0.560 0.000 0.000 srgb} bind def
-/col19 {0.690 0.000 0.000 srgb} bind def
-/col20 {0.820 0.000 0.000 srgb} bind def
-/col21 {0.560 0.000 0.560 srgb} bind def
-/col22 {0.690 0.000 0.690 srgb} bind def
-/col23 {0.820 0.000 0.820 srgb} bind def
-/col24 {0.500 0.190 0.000 srgb} bind def
-/col25 {0.630 0.250 0.000 srgb} bind def
-/col26 {0.750 0.380 0.000 srgb} bind def
-/col27 {1.000 0.500 0.500 srgb} bind def
-/col28 {1.000 0.630 0.630 srgb} bind def
-/col29 {1.000 0.750 0.750 srgb} bind def
-/col30 {1.000 0.880 0.880 srgb} bind def
-/col31 {1.000 0.840 0.000 srgb} bind def
-
-end
-save
-newpath 0 235 moveto 0 0 lineto 260 0 lineto 260 235 lineto closepath clip newpath
--156.6 333.9 translate
-1 -1 scale
-
-/cp {closepath} bind def
-/ef {eofill} bind def
-/gr {grestore} bind def
-/gs {gsave} bind def
-/sa {save} bind def
-/rs {restore} bind def
-/l {lineto} bind def
-/m {moveto} bind def
-/rm {rmoveto} bind def
-/n {newpath} bind def
-/s {stroke} bind def
-/sh {show} bind def
-/slc {setlinecap} bind def
-/slj {setlinejoin} bind def
-/slw {setlinewidth} bind def
-/srgb {setrgbcolor} bind def
-/rot {rotate} bind def
-/sc {scale} bind def
-/sd {setdash} bind def
-/ff {findfont} bind def
-/sf {setfont} bind def
-/scf {scalefont} bind def
-/sw {stringwidth} bind def
-/tr {translate} bind def
-/tnt {dup dup currentrgbcolor
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
-  bind def
-/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
-  4 -2 roll mul srgb} bind def
- /DrawEllipse {
-	/endangle exch def
-	/startangle exch def
-	/yrad exch def
-	/xrad exch def
-	/y exch def
-	/x exch def
-	/savematrix mtrx currentmatrix def
-	x y tr xrad yrad sc 0 0 1 startangle endangle arc
-	closepath
-	savematrix setmatrix
-	} def
-
-/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
-/$F2psEnd {$F2psEnteredState restore end} def
-
-$F2psBegin
-10 setmiterlimit
-0 slj 0 slc
- 0.06000 0.06000 sc
-%
-% Fig objects follow
-%
-% 
-% here starts figure with depth 51
-% Polyline
-0 slj
-0 slc
-0.000 slw
-n 4200 2700 m 4200 3900 l 5400 3900 l 5400 2700 l
- cp gs col7 0.75 shd ef gr 
-% Ellipse
-7.500 slw
- [15 45] 45 sd
-1 slc
-n 5400 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4200 3900 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 5400 3300 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 4800 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Ellipse
- [15 45] 45 sd
-n 5400 2700 75 75 0 360 DrawEllipse gs 0.00 setgray ef gr gs col0 s gr
- [] 0 sd
-% Polyline
-0 slc
-gs  clippath
-5770 5160 m 6015 5160 l 6015 5040 l 5770 5040 l 5770 5040 l 5950 5100 l 5770 5160 l cp
-eoclip
-n 3000 5100 m
- 6000 5100 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 5770 5160 m 5950 5100 l 5770 5040 l 5770 5160 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-3060 2330 m 3060 2085 l 2940 2085 l 2940 2330 l 2940 2330 l 3000 2150 l 3060 2330 l cp
-eoclip
-n 3000 5100 m
- 3000 2100 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 3060 2330 m 3000 2150 l 2940 2330 l 3060 2330 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-n 3000 4500 m
- 2925 4500 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 3900 m
- 2925 3900 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 3300 m
- 2925 3300 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3600 5100 m
- 3600 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 4200 5100 m
- 4200 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 5400 5100 m
- 5400 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 4800 5100 m
- 4800 5175 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
-n 3000 2700 m
- 2925 2700 l gs 0.00 setgray ef gr gs col0 s gr 
-% Polyline
- [15 45] 45 sd
-n 3000 3900 m
- 6000 3900 l gs col0 s gr  [] 0 sd
-% Polyline
- [15 45] 45 sd
-n 4200 5100 m
- 4200 2100 l gs col0 s gr  [] 0 sd
-% Polyline
- [15 45] 45 sd
-n 5400 5175 m
- 5400 2100 l gs col0 s gr  [] 0 sd
-% Polyline
- [15 45] 45 sd
-n 3000 2700 m
- 6000 2700 l gs col0 s gr  [] 0 sd
-/Times-Bold ff 433.33 scf sf
-2625 4650 m
-gs 1 -1 sc (1) col0 sh gr
-/Times-Bold ff 433.33 scf sf
-2625 4050 m
-gs 1 -1 sc (2) col0 sh gr
-/Times-Bold ff 433.33 scf sf
-3525 5550 m
-gs 1 -1 sc (1) col0 sh gr
-/Times-Bold ff 433.33 scf sf
-4125 5550 m
-gs 1 -1 sc (2) col0 sh gr
-/Times-Bold ff 433.33 scf sf
-5250 5550 m
-gs 1 -1 sc (4) col0 sh gr
-/Times-Bold ff 433.33 scf sf
-2625 2850 m
-gs 1 -1 sc (4) col0 sh gr
-/Times-Bold ff 433.33 scf sf
-2700 2175 m
-gs 1 -1 sc (j) col0 sh gr
-/Times-Roman ff 433.33 scf sf
-3825 1950 m
-gs 1 -1 sc (i>=2) col0 sh gr
-/Times-Roman ff 433.33 scf sf
-5025 1950 m
-gs 1 -1 sc (i<=4) col0 sh gr
-/Times-Roman ff 433.33 scf sf
-6075 3975 m
-gs 1 -1 sc (j>=2) col0 sh gr
-/Times-Roman ff 433.33 scf sf
-6075 2775 m
-gs 1 -1 sc (j<=4) col0 sh gr
-/Times-Bold ff 433.33 scf sf
-6000 5550 m
-gs 1 -1 sc (i) col0 sh gr
-% here ends figure;
-$F2psEnd
-rs
-showpage
-%%Trailer
-%EOF
diff --git a/cloog-0.17.0/osl/doc/images/basic2.fig b/cloog-0.17.0/osl/doc/images/basic2.fig
deleted file mode 100644
index c6a4161..0000000
--- a/cloog-0.17.0/osl/doc/images/basic2.fig
+++ /dev/null
@@ -1,62 +0,0 @@
-#FIG 3.2  Produced by xfig version 3.2.5-alpha5
-Landscape
-Center
-Inches
-Letter  
-100.00
-Single
--2
-1200 2
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 3900 75 75 5400 3900 5400 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 3900 75 75 4800 3900 4800 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 3300 75 75 4200 3300 4200 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 3300 75 75 4800 3300 4800 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 2700 75 75 4200 2700 4200 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4200 3900 75 75 4200 3900 4200 3975
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 3300 75 75 5400 3300 5400 3375
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 4800 2700 75 75 4800 2700 4800 2775
-1 3 2 1 0 0 50 -1 20 3.000 1 0.0000 5400 2700 75 75 5400 2700 5400 2775
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 120.00 180.00
-	 3000 5100 6000 5100
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 120.00 180.00
-	 3000 5100 3000 2100
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 4500 2925 4500
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 3900 2925 3900
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 3300 2925 3300
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3600 5100 3600 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 4200 5100 4200 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 5400 5100 5400 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 4800 5100 4800 5175
-2 1 0 1 0 0 50 -1 20 3.000 0 0 -1 0 0 2
-	 3000 2700 2925 2700
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 3000 3900 6000 3900
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 4200 5100 4200 2100
-2 3 0 0 0 7 51 -1 15 0.000 0 0 -1 0 0 5
-	 4200 2700 4200 3900 5400 3900 5400 2700 4200 2700
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 5400 5175 5400 2100
-2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2
-	 3000 2700 6000 2700
-4 0 0 50 -1 2 26 0.0000 0 285 225 2625 4650 1\001
-4 0 0 50 -1 2 26 0.0000 0 285 225 2625 4050 2\001
-4 0 0 50 -1 2 26 0.0000 0 285 225 3525 5550 1\001
-4 0 0 50 -1 2 26 0.0000 0 285 225 4125 5550 2\001
-4 0 0 50 -1 2 26 0.0000 0 285 225 5250 5550 4\001
-4 0 0 50 -1 2 26 0.0000 0 285 225 2625 2850 4\001
-4 0 0 50 -1 2 26 0.0000 0 375 150 2700 2175 j\001
-4 0 0 50 -1 0 26 0.0000 0 285 825 3825 1950 i>=2\001
-4 0 0 50 -1 0 26 0.0000 0 285 825 5025 1950 i<=4\001
-4 0 0 50 -1 0 26 0.0000 0 375 825 6075 3975 j>=2\001
-4 0 0 50 -1 0 26 0.0000 0 375 825 6075 2775 j<=4\001
-4 0 0 50 -1 2 26 0.0000 0 285 120 6000 5550 i\001
diff --git a/cloog-0.17.0/osl/doc/images/basic2.jpg b/cloog-0.17.0/osl/doc/images/basic2.jpg
deleted file mode 100644
index ab9f057..0000000
--- a/cloog-0.17.0/osl/doc/images/basic2.jpg
+++ /dev/null
Binary files differ
diff --git a/cloog-0.17.0/osl/doc/images/basic2.pdf b/cloog-0.17.0/osl/doc/images/basic2.pdf
deleted file mode 100644
index 38ab72d..0000000
--- a/cloog-0.17.0/osl/doc/images/basic2.pdf
+++ /dev/null
Binary files differ
diff --git a/cloog-0.17.0/osl/doc/images/basic2.txt b/cloog-0.17.0/osl/doc/images/basic2.txt
deleted file mode 100644
index 1cbde89..0000000
--- a/cloog-0.17.0/osl/doc/images/basic2.txt
+++ /dev/null
@@ -1,10 +0,0 @@
- j^ i>=2 
-  | | i<=4 
-  | | |     
-4-+-***--j<=4
-  | ***     
-2-+-***--j>=2
-  | | |     
-0-+-+-+--->i
-  | | |     
-  0 2 4     
diff --git a/cloog-0.17.0/osl/doc/images/tree.eps b/cloog-0.17.0/osl/doc/images/tree.eps
deleted file mode 100644
index d80f6e9..0000000
--- a/cloog-0.17.0/osl/doc/images/tree.eps
+++ /dev/null
@@ -1,258 +0,0 @@
-%!PS-Adobe-2.0 EPSF-2.0
-%%Title: tree.eps
-%%Creator: fig2dev Version 3.2 Patchlevel 3c
-%%CreationDate: Fri Sep  6 10:09:40 2002
-%%For: bastoul@whisky (Cedric Bastoul)
-%%BoundingBox: 0 0 388 312
-%%Magnification: 1.0000
-%%EndComments
-/$F2psDict 200 dict def
-$F2psDict begin
-$F2psDict /mtrx matrix put
-/col-1 {0 setgray} bind def
-/col0 {0.000 0.000 0.000 srgb} bind def
-/col1 {0.000 0.000 1.000 srgb} bind def
-/col2 {0.000 1.000 0.000 srgb} bind def
-/col3 {0.000 1.000 1.000 srgb} bind def
-/col4 {1.000 0.000 0.000 srgb} bind def
-/col5 {1.000 0.000 1.000 srgb} bind def
-/col6 {1.000 1.000 0.000 srgb} bind def
-/col7 {1.000 1.000 1.000 srgb} bind def
-/col8 {0.000 0.000 0.560 srgb} bind def
-/col9 {0.000 0.000 0.690 srgb} bind def
-/col10 {0.000 0.000 0.820 srgb} bind def
-/col11 {0.530 0.810 1.000 srgb} bind def
-/col12 {0.000 0.560 0.000 srgb} bind def
-/col13 {0.000 0.690 0.000 srgb} bind def
-/col14 {0.000 0.820 0.000 srgb} bind def
-/col15 {0.000 0.560 0.560 srgb} bind def
-/col16 {0.000 0.690 0.690 srgb} bind def
-/col17 {0.000 0.820 0.820 srgb} bind def
-/col18 {0.560 0.000 0.000 srgb} bind def
-/col19 {0.690 0.000 0.000 srgb} bind def
-/col20 {0.820 0.000 0.000 srgb} bind def
-/col21 {0.560 0.000 0.560 srgb} bind def
-/col22 {0.690 0.000 0.690 srgb} bind def
-/col23 {0.820 0.000 0.820 srgb} bind def
-/col24 {0.500 0.190 0.000 srgb} bind def
-/col25 {0.630 0.250 0.000 srgb} bind def
-/col26 {0.750 0.380 0.000 srgb} bind def
-/col27 {1.000 0.500 0.500 srgb} bind def
-/col28 {1.000 0.630 0.630 srgb} bind def
-/col29 {1.000 0.750 0.750 srgb} bind def
-/col30 {1.000 0.880 0.880 srgb} bind def
-/col31 {1.000 0.840 0.000 srgb} bind def
-
-end
-save
-newpath 0 312 moveto 0 0 lineto 388 0 lineto 388 312 lineto closepath clip newpath
--165.0 369.0 translate
-1 -1 scale
-
-/cp {closepath} bind def
-/ef {eofill} bind def
-/gr {grestore} bind def
-/gs {gsave} bind def
-/sa {save} bind def
-/rs {restore} bind def
-/l {lineto} bind def
-/m {moveto} bind def
-/rm {rmoveto} bind def
-/n {newpath} bind def
-/s {stroke} bind def
-/sh {show} bind def
-/slc {setlinecap} bind def
-/slj {setlinejoin} bind def
-/slw {setlinewidth} bind def
-/srgb {setrgbcolor} bind def
-/rot {rotate} bind def
-/sc {scale} bind def
-/sd {setdash} bind def
-/ff {findfont} bind def
-/sf {setfont} bind def
-/scf {scalefont} bind def
-/sw {stringwidth} bind def
-/tr {translate} bind def
-/tnt {dup dup currentrgbcolor
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add
-  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
-  bind def
-/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
-  4 -2 roll mul srgb} bind def
- /DrawEllipse {
-	/endangle exch def
-	/startangle exch def
-	/yrad exch def
-	/xrad exch def
-	/y exch def
-	/x exch def
-	/savematrix mtrx currentmatrix def
-	x y tr xrad yrad sc 0 0 1 startangle endangle arc
-	closepath
-	savematrix setmatrix
-	} def
-
-/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
-/$F2psEnd {$F2psEnteredState restore end} def
-
-$F2psBegin
-%%Page: 1 1
-10 setmiterlimit
- 0.06000 0.06000 sc
-%
-% Fig objects follow
-%
-7.500 slw
-% Ellipse
-n 5400 1200 237 237 0 360 DrawEllipse gs col0 s gr
-
-% Ellipse
-n 3000 3600 237 237 0 360 DrawEllipse gs col0 s gr
-
-% Ellipse
-n 7800 3600 237 237 0 360 DrawEllipse gs col0 s gr
-
-% Ellipse
-n 6600 4800 237 237 0 360 DrawEllipse gs col0 s gr
-
-% Ellipse
-n 5400 2325 237 237 0 360 DrawEllipse gs col0 s gr
-
-% Polyline
-gs  clippath
-5355 2115 m 5445 2115 l 5445 1888 l 5400 2068 l 5355 1888 l cp
-eoclip
-n 5400 1425 m
- 5400 2100 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 5355 1888 m 5400 2068 l 5445 1888 l 5355 1888 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-5355 3390 m 5445 3390 l 5445 3163 l 5400 3343 l 5355 3163 l cp
-eoclip
-n 5400 2550 m
- 5400 3375 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 5355 3163 m 5400 3343 l 5445 3163 l 5355 3163 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-2955 4590 m 3045 4590 l 3045 4363 l 3000 4543 l 2955 4363 l cp
-eoclip
-n 3000 3825 m
- 3000 4575 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 2955 4363 m 3000 4543 l 3045 4363 l 2955 4363 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-6563 4544 m 6611 4621 l 6803 4500 l 6627 4558 l 6755 4424 l cp
-eoclip
-n 7800 3825 m
- 6600 4575 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 6755 4424 m 6627 4558 l 6803 4500 l 6755 4424 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-8988 4621 m 9036 4544 l 8844 4424 l 8973 4558 l 8796 4500 l cp
-eoclip
-n 7800 3825 m
- 9000 4575 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 8796 4500 m 8973 4558 l 8844 4424 l 8796 4500 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-6555 5790 m 6645 5790 l 6645 5563 l 6600 5743 l 6555 5563 l cp
-eoclip
-n 6600 5025 m
- 6600 5775 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 6555 5563 m 6600 5743 l 6645 5563 l 6555 5563 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-7802 3411 m 7831 3326 l 7615 3253 l 7772 3354 l 7587 3338 l cp
-eoclip
-n 5400 2550 m
- 7803 3364 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 7587 3338 m 7772 3354 l 7615 3253 l 7587 3338 l  cp gs 0.00 setgray ef gr  col0 s
-% Polyline
-7.500 slw
-gs  clippath
-2971 3337 m 3000 3422 l 3215 3348 l 3031 3364 l 3186 3262 l cp
-eoclip
-n 5400 2550 m
- 3000 3375 l gs col0 s gr gr
-
-% arrowhead
-15.000 slw
-n 3186 3262 m 3031 3364 l 3215 3348 l 3186 3262 l  cp gs 0.00 setgray ef gr  col0 s
-/Times-Roman ff 330.00 scf sf
-3075 4200 m
-gs 1 -1 sc (0) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-6675 5400 m
-gs 1 -1 sc (0) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-5475 3000 m
-gs 1 -1 sc (1) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-3825 3000 m
-gs 1 -1 sc (0) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-6900 3000 m
-gs 1 -1 sc (2) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-6975 4200 m
-gs 1 -1 sc (0) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-8475 4200 m
-gs 1 -1 sc (1) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-5475 1800 m
-gs 1 -1 sc (0) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-2850 4950 m
-gs 1 -1 sc (S1) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-5250 3750 m
-gs 1 -1 sc (S2) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-6450 6150 m
-gs 1 -1 sc (S3) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-8850 4950 m
-gs 1 -1 sc (S4) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-5355 2430 m
-gs 1 -1 sc (i) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-2963 3667 m
-gs 1 -1 sc (j) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-7763 3675 m
-gs 1 -1 sc (j) col0 sh gr
-/Times-Roman ff 330.00 scf sf
-6533 4890 m
-gs 1 -1 sc (k) col0 sh gr
-$F2psEnd
-rs
diff --git a/cloog-0.17.0/osl/doc/images/tree.fig b/cloog-0.17.0/osl/doc/images/tree.fig
deleted file mode 100644
index 9c202bb..0000000
--- a/cloog-0.17.0/osl/doc/images/tree.fig
+++ /dev/null
@@ -1,54 +0,0 @@
-#FIG 3.2
-Landscape
-Center
-Inches
-Letter  
-100.00
-Single
--2
-1200 2
-1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 5400 1200 237 237 5400 1200 5625 1275
-1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 3000 3600 237 237 3000 3600 3225 3675
-1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 7800 3600 237 237 7800 3600 8025 3675
-1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 6600 4800 237 237 6600 4800 6825 4875
-1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 5400 2325 237 237 5400 2325 5625 2400
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 5400 1425 5400 2100
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 5400 2550 5400 3375
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 3000 3825 3000 4575
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 7800 3825 6600 4575
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 7800 3825 9000 4575
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 6600 5025 6600 5775
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 5400 2550 7803 3364
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
-	1 1 2.00 90.00 180.00
-	 5400 2550 3000 3375
-4 0 0 50 0 0 22 0.0000 0 225 150 3075 4200 0\001
-4 0 0 50 0 0 22 0.0000 0 225 150 6675 5400 0\001
-4 0 0 50 0 0 22 0.0000 0 225 150 5475 3000 1\001
-4 0 0 50 0 0 22 0.0000 0 225 150 3825 3000 0\001
-4 0 0 50 0 0 22 0.0000 0 225 150 6900 3000 2\001
-4 0 0 50 0 0 22 0.0000 0 225 150 6975 4200 0\001
-4 0 0 50 0 0 22 0.0000 0 225 150 8475 4200 1\001
-4 0 0 50 0 0 22 0.0000 0 225 150 5475 1800 0\001
-4 0 0 50 0 0 22 0.0000 0 225 345 2850 4950 S1\001
-4 0 0 50 0 0 22 0.0000 0 225 345 5250 3750 S2\001
-4 0 0 50 0 0 22 0.0000 0 225 345 6450 6150 S3\001
-4 0 0 50 0 0 22 0.0000 0 225 345 8850 4950 S4\001
-4 0 0 50 0 0 22 0.0000 0 225 90 5355 2430 i\001
-4 0 0 50 0 0 22 0.0000 0 300 90 2963 3667 j\001
-4 0 0 50 0 0 22 0.0000 0 300 90 7763 3675 j\001
-4 0 0 50 0 0 22 0.0000 0 225 150 6533 4890 k\001
diff --git a/cloog-0.17.0/osl/doc/images/tree.jpg b/cloog-0.17.0/osl/doc/images/tree.jpg
deleted file mode 100644
index 7329268..0000000
--- a/cloog-0.17.0/osl/doc/images/tree.jpg
+++ /dev/null
Binary files differ
diff --git a/cloog-0.17.0/osl/doc/images/tree.pdf b/cloog-0.17.0/osl/doc/images/tree.pdf
deleted file mode 100644
index 7569ede..0000000
--- a/cloog-0.17.0/osl/doc/images/tree.pdf
+++ /dev/null
Binary files differ
diff --git a/cloog-0.17.0/osl/doc/images/tree.txt b/cloog-0.17.0/osl/doc/images/tree.txt
deleted file mode 100644
index 7bcfef2..0000000
--- a/cloog-0.17.0/osl/doc/images/tree.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-       *
-       |
-       |0
-       |
-       V
-       i
-       |
- +-----+-----+
- |     |     |      
- |0    |1    |2 
- |     |     |      
- V     V     V
- j     S2    j
- |           |
- |0       +--+--+
- |        |     |
- V        |0    |1
- S1       |     |
-          V     V
-          k     S4
-          |
-          |0
-          |
-          V
-          S3
diff --git a/cloog-0.17.0/osl/doc/openscop.info b/cloog-0.17.0/osl/doc/openscop.info
deleted file mode 100644
index 9b7b391..0000000
--- a/cloog-0.17.0/osl/doc/openscop.info
+++ /dev/null
Binary files differ
diff --git a/cloog-0.17.0/osl/doc/openscop.pdf b/cloog-0.17.0/osl/doc/openscop.pdf
deleted file mode 100644
index 2bac7d5..0000000
--- a/cloog-0.17.0/osl/doc/openscop.pdf
+++ /dev/null
Binary files differ
diff --git a/cloog-0.17.0/osl/doc/openscop.texi b/cloog-0.17.0/osl/doc/openscop.texi
deleted file mode 100644
index c7969da..0000000
--- a/cloog-0.17.0/osl/doc/openscop.texi
+++ /dev/null
@@ -1,3257 +0,0 @@
-\input texinfo
-@c %
-@c %  /**-----------------------------------------------------------------**
-@c %   **                           OpenScop Library                      **
-@c %   **-----------------------------------------------------------------**
-@c %   **                            openscop.texi                        **
-@c %   **-----------------------------------------------------------------**
-@c %   **                 First version: september 10th 2006              **
-@c %   **-----------------------------------------------------------------**/
-@c %
-@c % release 0.0: May 4th 2008
-@c %
-
-@c % /*************************************************************************
-@c %  *                              PART I: HEADER                           *
-@c %  *************************************************************************/
-@c %**start of header
-@setfilename openscop.info
-@settitle OpenScop Specification and Library
-
-@set EDITION 1.0
-@set SPEC_VERSION 1.0
-@set LIB_VERSION 0.8.1
-@set UPDATED December 2nd 2011
-@setchapternewpage odd
-
-@c % This is to ask for A4 instead of Letter size document.
-@iftex
-     @afourpaper
-@end iftex
-
-@c %**end of header
-
-@c % /************************************************************************
-@c %  *                PART II: SUMMARY DESCRIPTION AND COPYRIGHT            *
-@c %  ************************************************************************/
-
-@copying
-This document describes OpenScop, a specification of a file format and a set
-of data structures for polyhedral compilation tools to talk
-together. It also describes briefly the OpenScop Library version @value{LIB_VERSION}, 
-a Free Software that provides an example of OpenScop implementation.
-
-It would be quite kind to refer at the present document in any publication that
-results from the use of the OpenScop Library:
-
-@example
-@@TechReport@{Bas11,
-@ @ author =@ @ @ @ @ @ @{C\'edric Bastoul@},
-@ @ title =@ @ @ @ @ @ @ @{OpenScop: A Specification and a Library for Data 
-@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ Exchange in Polyhedral Compilation Tools@},
-@ @ month =@ @ @ @ @ @ @ @{September@},
-@ @ year =@ @ @ @ @ @ @ @ 2011,
-@ @ institution = @{Paris-Sud University, France@}
-@}
-@end example
-
-Copyright @copyright{} 2011 Paris-Sud University and INRIA.
-
-@c quotation
-Permission is granted to copy, distribute and/or modify this document under
-the terms of the GNU Free Documentation License, Version 1.2 published by the
-Free Software Foundation; with no Invariant Sections, with no Front-Cover
-Texts, and with no Back-Cover Texts. To receive a copy of the
-GNU Free Documentation License, write to the Free Software Foundation, Inc.,
-59 Temple Place, Suite 330, Boston, MA  02111-1307 USA.
-@c end quotation
-@end copying
-
-@c % /*************************************************************************
-@c %  *                 PART III: TITLEPAGE, CONTENTS, COPYRIGHT              *
-@c %  *************************************************************************/
-@titlepage
-@title OpenScop
-@subtitle A Specification and a Library for Data Exchange in Polyhedral Compilation Tools
-@subtitle Edition @value{EDITION}, for OpenScop Specification @value{SPEC_VERSION} and OpenScop Library @value{LIB_VERSION}
-@subtitle @value{UPDATED}
-@author C@'edric Bastoul
-
-@c The following two commands start the copyright page.
-@page
-@vskip 0pt plus 1filll
-@insertcopying
-@end titlepage
-
-@c Output the table of contents at the beginning.
-@contents
-
-@c % /*************************************************************************
-@c %  *                     PART IV: TOP NODE AND MASTER MENU                 *
-@c %  *************************************************************************/
-@ifnottex
-@node Top
-@top OpenSCop
-
-@insertcopying
-@end ifnottex
-
-@menu
-* Introduction::
-* Polyhedral Representation::
-* OpenScop Specification::
-* OpenScop Library::
-* References::
-@end menu
-
-@c % /*************************************************************************
-@c %  *                       PART V: BODY OF THE DOCUMENT                    *
-@c %  *************************************************************************/
-
-@c %  ****************************** INTRODUCTION ******************************
-@node Introduction
-@chapter Introduction
-OpenScop is an open specification that defines a file format and a set of
-data structures to represent a @emph{static control part} (SCoP for short),
-i.e., a program part that can be represented in the @emph{polyhedral model}.
-The goal of OpenScop is to provide a common interface to various
-polyhedral compilation tools in order to simplify their interaction. 
-
-Designing a single format for tools that have different purposes
-(e.g., as different as code generation and data dependence analysis) may
-sound strange at first. However we could observe that most available
-polyhedral compilation tools during the last decade were manipulating
-more or less the same kind of data (polyhedra, affine functions...) and
-were actually sharing a part of their input (e.g., iteration domains and
-context concepts are nearly everywhere). We could also observe that
-those tools may rely on different internal representations, mostly based on
-one of the major polyhedral libraries (e.g., Polylib, PPL or isl), and
-this representation may change over time (e.g., when switching to a
-more convenient polyhedral library).
-The OpenScop aim is to provide a stable, unified format that offers a
-durable guarantee that a tool can use an output or provide an input to
-another tool without breaking a tool chain because of some internal
-changes in one element of the chain. The other promise of OpenScop is
-the ability to assemble or replace the basic blocks of a polyhedral
-compilation framework at no, or at least low engineering cost.
-
-The policy that drives OpenScop can be summarized by these three rules:
-@itemize @bullet
-@item  Embed the @emph{minimum} information to build a complete polyhedral
-       compilation framework in the so-called @emph{core part}
-       (to avoid as much as possible empty or useless information
-       for each tool).
-@item  Provide a @emph{very stable} core part (so users have some
-       guarantee that they will not need to update their tool
-       because of frequent specification evolution),
-@item  Provide a @emph{very flexible} extension part (so it can also
-       be used to test wild new ideas).
-@end itemize
-
-@noindent Another, more technical, rule may be added:
-@itemize @bullet
-@item  Avoid any need for external library or tool to support it
-       (i.e., it's not XML or YAML or anything like that).
-@end itemize
-
-The success of OpenScop in meeting its goals totally depends on its
-acceptance by the tool developers (that have to support it in their tools).
-To help them, we provide an example implementation: the OpenScop Library.
-This library (and in particular its API) is not part of the OpenScop
-specification (which includes only the file format and the set of data
-structures). It is licensed under the 3-clause BSD license so developers may
-feel free to use it in their code (either by linking it or copy-pasting its
-code). This document also describes this library briefly (readers are
-invited to read at its technical documentation).
-The current version of the OpenScop Library is still under evaluation,
-and there is no guarantee that the upward compatibility will be respected,
-even if we do think so. A lot of reports are
-necessary to freeze the library API. Thus you are very welcome and
-encouraged to send reports on bugs, wishes, critics, comments, suggestions
-or (please!) successful experiences to the OpenScop mailing list
-@email{openscop-development@@googlegroups.com}.
-
-This document is organized as follows. First, we provide some
-background on the polyhedral model and how it is used to represent and to
-manipulate programs (@pxref{Polyhedral Representation}). Next,
-we describe the OpenScop specification, from the file format
-(@pxref{OpenScop File Format Specification}) to the data structures
-and the OpenScop Library API
-(@pxref{OpenScop Data Structure Specification}).
-Finally we will detail how to install the OpenScop Library
-(@pxref{Installation}).
-
-
-@c %  ******************* POLYHEDRAL REPRESENTATION OF PROGRAMS ****************
-@node Polyhedral Representation
-@chapter Polyhedral Representation of Programs
-If you are reading at the OpenScop documentation, you probably don't need any
-explanation about the polyhedral model. It is unlikely that someone will read
-this paper by mistake. However some vicious advisor may ask their poor
-engineers/interns/students
-to work for the very first time on this exciting topic. Most papers on
-polyhedral compilation are hard to read. Despite my efforts,
-mine are no exception according to some reviewers. Hence I give there a new
-try to provide a comprehensive explanation of the polyhedral model without the
-size and style limits of a classical research paper.
-
-Be aware that to be able to understand the polyhedral model, there are a few
-prerequisites. You should not read the following while you still ignore
-what is:
-@itemize @bullet
-@item  a @code{for} loop construction in C programs (@code{do} loops in FORTRAN are OK too!),
-@item  an @emph{affine expression},
-@item  a @emph{vector},
-@item  a @emph{matrix},
-@item  a @emph{matrix-vector multiply}.
-@end itemize
-If you do not know those concepts, please do some search and come back
-afterwards. And if you are courageous enough, send me a few lines that
-describe them so I can insert them here!
-
-@menu
-* Motivation::
-* Thinking in Polyhedra::
-* What's Next?::
-@end menu
-
-
-@node Motivation
-@section Motivation: Program Transformations
-
-A direct translation of high level programs written, e.g., in C, to assembly
-then to object code is likely to produce (very) inefficient applications.
-Architectures are
-quite complex, including several levels of cache memory, many cores, deep
-pipelines, various number of functional units, of registers etc.
-The list of such
-"architectural features" is growing with each new generation of processors.
-To achieve the best performance, the object program must use
-these features in a smart way.
-Programmers use high level languages for productivity and portability:
-typically they do not have to take care of the target architecture but
-to ensure they write programs which produce the right output. Hence,
-the problem of mapping the program to the target architecture in the most
-efficient way is left to the compiler.
-
-The compiler may see a high level program as a specification
-@emph{of an output}. The program is a list of instructions to be executed to
-produce the output. As long as the output is guaranteed to be as the
-programmer specified in his code, the compiler is free to modify
-the program.
-For instance, let us imagine we are working on an architecture with only
-three registers and we consider the following statements written by
-a programmer:
-
-@example
-@group
-x = a + b;
-y = c + d;
-z = a * b;
-@end group
-@end example
-
-It is easy to see that we can reorder the three statements in any way without
-modifying the semantics (no statement reads or writes a variable that another
-statement writes). Because of the lack of registers, the solutions such that
-the first and the third statements are one after the other are better
-because @code{a} and @code{b} will be put in the processor registers by
-one statement and can be reused directly by the other one
-without reading from memory (this is called a @emph{data locality
-improving} transformation). Hence a better statement order is, e.g.:
-
-@example
-@group
-x = a + b;
-z = a * b; // a and b are still in processor registers
-y = c + d;
-@end group
-@end example
-
-We can also notice that it is possible to run the three statements in
-parallel (possibly on different processors). The programmer may
-explicit this in a way the compiler
-and/or the architecture is able to understand. For instance,
-we can use OpenMP to describe parallelism
-(this is called a @emph{parallelizing} transformation):
-
-@example
-@group
-#pragma omp parallel sections
-@{
-   #pragma omp section
-   @{
-     x = a + b;
-   @}
-   #pragma omp section
-   @{
-     y = c + d;
-   @}
-   #pragma omp section
-   @{
-     z = a * b;
-   @}
-@}
-@end group
-@end example
-
-However, the right way to optimize this program is probably a tradeoff
-between these two techniques. This is true if, e.g., the target
-architecture has some limitations to run too many operations in parallel,
-or, like in our case, when some data may be reused by some processors.
-Hence, the best optimization for our small example is probably the
-following:
-
-@example
-@group
-#pragma omp parallel sections
-@{
-   #pragma omp section
-   @{
-     x = a + b;
-     z = a * b;
-   @}
-   #pragma omp section
-   @{
-     y = c + d;
-   @}
-@}
-@end group
-@end example
-
-This example is quite trivial because the statements are
-executed only once. The real sport begins when we have to deal with loops,
-as we will see momentarily. However, polyhedral compilation framework users
-have to be conscious that we @emph{need} to transform programs to achieve
-the best performance and that the best transformation  that has to be
-discovered (at the price of many, many efforts) and performed may be
-quite complex. Hence the need of powerful model and tools.
-
-
-@node Thinking in Polyhedra
-@section Thinking in Polyhedra
-
-
-Since the very first compilers, the internal representation of programs
-is the @emph{Abstract Syntax Tree}, or AST. In such representation,
-each statement appears only once even if it is executed many times (e.g.,
-when it is enclosed inside a loop). This is a limitation
-for finding and applying complex transformations:
-@itemize @bullet
-@item It limits program analysis power. For instance if a statement
-      @emph{depends} on another statement (i.e., they access the same
-      memory location and at least one of these accesses is a write),
-      we will consider both statements as unique entities while the
-      dependence relation may involve only few statement executions.
-@item It limits program transformation power. Loop transformations
-      operate on statement executions. For instance, because they
-      consider all statement executions at the same time, present day
-      production compilers are not able to achieve loop fusion
-      (that tries to merge the loop bodies of two loops) if the loop bounds
-      of the two loops do not match (yes, that's ridiculous).
-@item It limits program manipulation flexibility.
-      Trees are very rigid data structures that are not easy to manipulate.
-      Program transformation may require very complex transformations that will
-      imply deep modifications of the control flow.
-@end itemize
-
-The Polyhedral Model is a convenient alternative representation which
-combines analysis power, expressiveness and high flexibility. The drawback
-is it breaks the classical structure of programs that every programmer
-is familiar with. It requires some (real) efforts
-to be smoothly manipulated, but it definitely worth it. It is based on three
-main concepts, @emph{iteration domain},  @emph{scattering function} and
-@emph{access function} that are described in depth in the
-following sections.
-
-A program part that can be represented using the Polyhedral Model is called
-a @strong{Static Control Part} or @strong{SCoP} for short.
-
-@menu
-* Iteration Domain::
-* Scattering Function::
-* Access Function::
-@end menu
-
-@node Iteration Domain
-@subsection Iteration Domain
-
-The key aspect of the polyhedral model is to consider @emph{statement
-instances}. A statement instance is @emph{one} execution of a statement.
-A statement
-outside a loop has only one instance while those inside loops may have many.
-Let us consider the following code with two statements @code{S1}
-and @code{S2}:
-
-@example
-@group
-pi = 3.14;               // S1
-for (i = 0; i < 5; i++)
-  A[i] = pi;             // S2
-@end group
-@end example
-
-The list of statement instances is the following (we just have to fully
-unroll the loop):
-
-@example
-@group
-pi = 3.14;
-A[0] = pi;
-A[1] = pi;
-A[2] = pi;
-A[3] = pi;
-A[4] = pi;
-@end group
-@end example
-
-Each instance of a statement which is enclosed inside a loop may be referred
-thanks to its outer loop counters (or @emph{iterators}). In the polyhedral
-model we consider statements as functions of the outer loop counters that may
-produce statement instances:
-instead of simply "@code{S2}", we use preferably the notation @code{S2(i)}.
-For instance we  denote the statement instance @code{A[3] = pi;} of the
-previous example as @code{S2(3)}. This means @emph{instance of
-statement @code{S2} for} @code{i = 3}.
-If a statement @code{S3} is enclosed inside two loops of iterators @code{i}
-(outermost loop) and @code{j} (innermost loop), we would denote it
-@code{S3(i,j)}, and so on with more enclosing loops.
-
-The ordered list
-of iterators (ordered from the outermost iterator to the innermost iterator)
-is called the @strong{iteration vector}. For instance the iteration vector for
-@code{S3} is @code{(i,j)}, for @code{S2} it is @code{(i)}, and for @code{S1}
-it is empty since it has no enclosing loop: @code{()}. A more precise reading
-at the notation @code{S2(3)} would show that it denotes the instance of
-statement @code{S2} for the iteration vector @code{(2)}.
-
-Obviously, dealing with statement instances does not mean we have to unroll all
-loops. First because there would be probably too many instances to deal with,
-and second because we probably just do not know how many instances there are.
-For instance in the following loop it is impossible to know (at compile time)
-how many times the statement @code{S3} will be executed:
-
-@example
-@group
-for (i = 2; i <= N; i++)
-  for (j = 2; j <= N; j++)
-    A[i] = pi;             // S3
-@end group
-@end example
-
-@noindent Such a loop is said to be @emph{parametric}: it depends on
-(at least) a value called a @emph{parameter} which is not modified
-during the execution of the whole loop, but is unknown at compile time.
-Here, the only parameter is @code{N}.
-
-A compact way to represent all the instances of a given statement
-is to consider the set of all possible values of its iteration vector.
-This set is called the @strong{iteration domain}. It can be conveniently
-described thanks to all the constraints on the various iterators the statement
-depends on. For instance, let us consider
-the statement @code{S3} of the previous program. The iteration domain is the set
-of iteration vectors @code{(i,j)}. Because of the parameter, we are not able to
-achieve a precise list of all possible values. It would look like this:
-
-@example
-@group
-(2,2)  (2,3)  (2,4)  ...  (2,N)
-(3,2)  (3,3)  (3,4)  ...  (3,N)
-...    ...    ...    ...  ...
-(N,2)  (N,3)  (N,4)  ...  (N,N)
-@end group
-@end example
-
-@noindent A better way is to say it is the set
-of iteration vectors @code{(i,j)} such that @code{i} is an integer greater or
-equal than 2 and lower or equal than @code{N}, and @code{j} is an integer
-greater or equal than 2 and lower or equal than @code{N}. This may be written
-in the following mathematical form:
-
-@tex
-$$D _{S3} =  \{(i,j) \in Z^2 \; | \; 2 \leq i \leq N \land 2 \leq j \leq N \}$$
-@end tex
-
-@ifnottex
-@example
-@group
-D_S3 =  @{(i,j) in Z^2 | 2 <= i <= N && 2 <= j <= N @}
-@end group
-@end example
-@end ifnottex
-
-@noindent It is easy to see that this iteration domain is a part of the
-2-dimensional space
-@tex
-$Z^2$.
-@end tex
-@ifnottex
-@example
-@group
-Z^2.
-@end group
-@end example
-@end ifnottex
-We often use in our research papers a graphical representation that gives a
-better view of this subspace:
-
-@image{images/basic1,4cm}
-
-@noindent Here, the iteration domain is specified thanks to a set of
-constraints. When those constraints are affine and
-depend only on the outer loop counters and some parameters, the set of
-constraints defines a @emph{polyhedron} (more precisely this is a
-@emph{Z-polyhedron}, but we use @emph{polyhedron} for short).
-Hence the @emph{polyhedral model}!
-
-To manipulate a set of affine constraints easily, we rely on a matrix
-representation. To write it, we use the @emph{homogeneous} iteration vector:
-it is simply the iteration vector with some additional dimensions to
-represent the parameters and the constant.
-For instance for the statement @code{S3}, the
-iteration vector in homogeneous coordinates is @code{(i, j, N, 1)}
-(we will now call it @emph{iteration vector} directly for short).
-Then we write all the constraints as affine inequalities of the form
-@emph{affine constraint}
-@tex
-$\geq 0$.
-@end tex
-@ifnottex
-@code{ >= 0}.
-@end ifnottex
-For instance for the statement @code{S3} the set of constraints is:
-
-@tex
-$$
-\hbox{$ \cases{  i         - 2  &$\geq 0$\cr
-                -i     + N      &$\geq 0$\cr
-                     j     - 2  &$\geq 0$\cr
-                    -j + N      &$\geq 0$}$}
-$$
-@end tex
-
-@ifnottex
-@example
-@group
-    i - 2 >= 0
-   -i + N >= 0
-    j - 2 >= 0
-   -j + N >= 0
-@end group
-@end example
-@end ifnottex
-
-@noindent Lastly, we translate the constraint system to the form
-@strong{domain matrix}@code{ * }@emph{iteration vector}@code{ >= 0}:
-
-@c Thanks to Harald Devos for the TeX :-) !  
-@tex
-$$
-\left[
-\matrix{
- 1 &  0  & 0  & -2 \cr
--1 &  0  & 1  &  0 \cr
- 0 &  1  & 0  & -2 \cr
- 0 & -1  & 1  &  0
- }
-\right]
-\left(
-\matrix{
-i \cr
-j \cr
-N \cr
-1
- }
-\right)
-\ge
-\left(
-\matrix{
-0 \cr
-0 \cr
-0 \cr
-0
-}
-\right)
-$$
-@end tex
-@ifnottex
-@example
-@group
-[  1  0  0 -2 ]   [ i ]    [ 0 ]
-[ -1  0  1  0 ]   [ j ]    [ 0 ]
-[  0  1  0 -2 ] * [ N ] >= [ 0 ]
-[  0 -1  1  0 ]   [ 1 ]    [ 0 ]
-@end group
-@end example
-@end ifnottex
-
-@noindent @strong{The domain matrix will be used in all our tools to provide the
-information on the iteration domain of a given statement (the iteration vector
-is in general an implicit information).}
-
-@node Scattering Function
-@subsection Scattering Function
-
-There is no ordering information inside the iteration domain: it only describes
-the set of statement instances but @strong{not} the order in which they have
-to be executed relatively to each other. In the past the lexicographic order
-of the iteration domain was considered, this is no more true
-(especially when using CLooG). If we do not provide any ordering information, this
-means that the statement instances may be executed in any order
-(this is useful, e.g., to specify parallelism). However, some statement instances
-may depend on some others and it may be critical to enforce a given order (or
-non-order). Hence we need another information.
-
-We call @emph{scattering} any kind of ordering information in the polyhedral
-model. There exists many kind of ordering, such as @emph{allocation},
-@emph{scheduling}, @emph{chunking} etc. They are all expressed
-in the same way, i.e., using @emph{logical stamps}, but they may have
-different semantics.
-
-In the case of @strong{scheduling}, the logical stamps are logical dates that
-express at which date a statement instance has to be executed. For instance,
-let us consider the following three statements:
-
-@example
-@group
-x = a + b;   // S1
-y = c + d;   // S2
-z = a * b;   // S3
-@end group
-@end example
-
-@noindent The scheduling of a statement @code{S} is typically
-denoted by
-@tex
-$\theta_{S}$.
-@end tex
-@ifnottex
-T_S.
-@end ifnottex
-Let us consider the following logical dates for each statement:
-
-@tex
-@example
-@group
-$\theta_{S1} = 2$
-$\theta_{S2} = 3$
-$\theta_{S3} = 1$
-@end group
-@end example
-@end tex
-
-@ifnottex
-@example
-@group
-T_S1 = 1
-T_S2 = 2
-T_S3 = 3
-@end group
-@end example
-@end ifnottex
-
-@noindent It means that statement @code{S3} has to be executed at logical date
-@code{1}, statement @code{S1} has to be executed at logical date
-@code{2} and statement @code{S2} has to be executed at logical date
-@code{3}. The target code has to respect this scheduling (the order of
-the logical dates), hence it would look like the following where the
-variable @code{t} denotes the time:
-
-@example
-@group
-t = 1;
-z = a * b;   // S3
-t = 2;
-x = a + b;   // S1
-t = 3;
-y = c + d;   // S2
-@end group
-@end example
-
-@noindent When some statements share the same logical date, this means that,
-once the program reaches this logical date, the two statements can be executed
-in any order, or better, in parallel. For instance let us consider the
-following scheduling:
-
-@tex
-@example
-@group
-$\theta_{S1} = 1$
-$\theta_{S2} = 2$
-$\theta_{S3} = 1$
-@end group
-@end example
-@end tex
-
-@ifnottex
-@example
-@group
-T_S1 = 1
-T_S2 = 2
-T_S3 = 1
-@end group
-@end example
-@end ifnottex
-
-@noindent Statements @code{S1} and @code{S3} have the same logical date,
-moreover, @code{S2} has a greater logical date than @code{S1} and @code{S3}.
-Hence the target code would be:
-
-@example
-@group
-t = 1;
-#pragma omp parallel sections
-@{
-   #pragma omp section
-   @{
-     x = a + b;   // S1
-   @}
-   #pragma omp section
-   @{
-     z = a * b;   // S3
-   @}
-@}
-t = 2;
-y = c + d;        // S2
-@end group
-@end example
-
-Logical dates may be multidimensional, as clocks: the first dimension
-may correspond to days (most significant), the next one to hours (less
-significant), the third to minutes and so on. For instance we can consider
-the following multidimensional schedules for our example:
-
-@tex
-@example
-@group
-$\theta_{S1} = (1,1)$
-$\theta_{S2} = (2,1)$
-$\theta_{S3} = (1,2)$
-@end group
-@end example
-@end tex
-
-@ifnottex
-@example
-@group
-T_S1 = (1,1)
-T_S2 = (2,1)
-T_S3 = (1,2)
-@end group
-@end example
-@end ifnottex
-
-@noindent It is not very hard to decypher the meaning of such scheduling.
-Because of the first dimension, statements @code{S1} and @code{S3} will be
-executed before statement @code{S2} (@code{S1} and @code{S3} are executed at
-day 1, while @code{S2} is executed at day 2). The second dimension is not
-really useful there for @code{S2} because it is the only statement executed
-at day 2. Nevertheless it allows to order @code{S1} and
-@code{S3} relatively to each other since @code{S1} is executed at hour 1 of day
-1 while @code{S3} is executed at hour 2 of day 1.
-The corresponding target code is the following, with some
-additional time variables for a better view of the ordering (@code{t1}
-corresponds to the first time dimension, @code{t2} to the second one):
-
-@example
-@group
-t1 = 1;
-t2 = 1;
-x = a + b;   // S1
-t2 = 2;
-z = a * b;   // S3
-t1 = 2;
-t2 = 1;
-y = c + d;   // S2
-@end group
-@end example
-
-In the case of @strong{allocation} (in the literature we can find some
-papers calling it @emph{placement}), the logical stamp is a processor
-number expressing on which processor a statement instance has to be
-executed. Typically, allocations are written in the same way as scheduling.
-Here, we denote it @math{P_S} for a statement @code{S}.
-For instance, let us consider the following allocation:
-
-@tex
-@example
-@group
-$P_{S1} = 1$
-$P_{S2} = 2$
-$P_{S3} = 1$
-@end group
-@end example
-@end tex
-
-@ifnottex
-@example
-@group
-P_S1 = 1
-P_S2 = 2
-P_S3 = 1
-@end group
-@end example
-@end ifnottex
-
-@noindent The corresponding target code has to take into account that both
-statements @code{S1} and @code{S3} have to be executed on the same processor
-(they have the same logical number 1) and that statement @code{S2} has
-to be executed on another processor (logical number 2). A possible target code
-is the following:
-
-@example
-@group
-#pragma omp parallel sections
-@{
-   #pragma omp section
-   @{
-     // Logical processor 1
-     x = a + b;   // S1
-     z = a * b;   // S3
-   @}
-   #pragma omp section
-   @{
-     // Logical processor 2
-     y = c + d;   // S2
-   @}
-@}
-@end group
-@end example
-
-@noindent We can note that no order has been specified for the
-statements @code{S1} and @code{S3} that are executed on the same processor.
-Hence any order is satisfying. For sake of flexibility, it is usual to build
-a scattering whose various dimensions do not have the same semantics. A
-typical construction is @emph{space/time mapping} where the first @code{n}
-dimensions are devoted to allocation, then the last @code{m}
-dimensions are devoted to scheduling. Typically, space/time mapping is
-written in the same way as scheduling.
-Here we denote it @math{M_S} for a statement @code{S}.
-For instance, let us consider the following space/time mapping for our
-example where one dimension is devoted to mapping and one dimension is
-devoted to scheduling:
-
-@tex
-@example
-@group
-$M_{S1} = (1,2)$
-$M_{S2} = (2,1)$
-$M_{S3} = (1,1)$
-@end group
-@end example
-@end tex
-
-@ifnottex
-@example
-@group
-M_S1 = (1,2)
-M_S2 = (2,1)
-M_S3 = (1,1)
-@end group
-@end example
-@end ifnottex
-
-@noindent Here we have the same first dimension as the previous example, thus
-the allocation of the statements to processors is the same. The second
-dimension precises on a given processor at which logical date a statement
-instance has to be executed. Here, the statement @code{S1} is executed at
-day 2 on processor 1 while the statement @code{S3} is executed at day 1 onto
-the same processor. It follows this space/time mapping corresponds to the
-following target code (we added an additional variable to represent the
-local logical clocks):
-
-@example
-@group
-#pragma omp parallel sections
-@{
-   #pragma omp section
-   @{
-     // Logical processor 1
-     t = 1;
-     z = a * b;   // S3
-     t = 2;
-     x = a + b;   // S1
-   @}
-   #pragma omp section
-   @{
-     // Logical processor 2
-     t = 1;
-     y = c + d;   // S2
-   @}
-@}
-@end group
-@end example
-
-For the same reason as discussed for iteration domains
-(@pxref{Iteration Domain}), it is not possible to define a scattering for
-each statement instance, especially if the statement belongs to a
-(possibly parametric) loop. The iteration vector fully defines an
-instance of a given statement. Thus, a practical way to provide a scattering
-for each instance of a given statement is to use a @emph{function}
-that depends on the iteration vector. In this way the function may associate
-to each iteration vector a different scattering. We call these functions
-@strong{scattering functions}. Scattering functions are @emph{affine}
-functions of the outer loop counter and the global parameters.
-For instance, let us consider the following source code:
-
-@example
-@group
-for (i = 2; i <= 4; i++)
-  for (j = 2; j <= 4; j++)
-    P[i+j] += A[i] + B[j]; // S4
-@end group
-@end example
-
-@noindent The iteration domain of the statement @code{S4} is:
-
-
-@tex
-$$D _{S4} =  \{(i,j) \in Z^2 \; | \; 2 \leq i \leq 4 \land 2 \leq j \leq 4 \}.$$
-@end tex
-@ifnottex
-@example
-@group
-D_S4=  @{(i,j) in Z^2 | 2 <= i <= 4 && 2 <= j <= 4 @}.
-@end group
-@end example
-@end ifnottex
-
-@noindent If you are still not comfortable with the mathematical notation, it
-corresponds to the following graphical representation:
-
-@image{images/basic2,3cm}
-
-@noindent The list of the statement instances of @code{S4} (the integer
-points of its iteration domain) corresponds to the following iteration vectors:
-
-@example
-@group
-iteration vector
-     (2,2)
-     (2,3)
-     (2,4)
-     (3,2)
-     (3,3)
-     (3,4)
-     (4,2)
-     (4,3)
-     (4,4)
-@end group
-@end example
-
-@noindent Let us suppose we want to schedule the instances of the statement
-@code{S4} (the integer points of its iteration domain) using the following
-scheduling function:
-
-@tex
-@example
-@group
-$\theta_{S4}(i, j) = (j+2, 3*i+j)$
-@end group
-@end example
-@end tex
-
-@ifnottex
-@example
-@group
-T_S4(i,j) = (j+2,3*i+j)
-@end group
-@end example
-@end ifnottex
-
-@noindent We only need to apply the function to each iteration vector to find
-the logical date of each instance:
-
-@example
-@group
-iteration vector       logical date
-     (2,2)       -->       (4,8)
-     (2,3)       -->       (5,9)
-     (2,4)       -->       (6,10)
-     (3,2)       -->       (4,11)
-     (3,3)       -->       (5,12)
-     (3,4)       -->       (6,13)
-     (4,2)       -->       (4,14)
-     (4,3)       -->       (5,15)
-     (4,4)       -->       (6,16)
-@end group
-@end example
-
-The polyhedral model users do not have to take care about the generation of a
-target code that respects the scattering: the
-CLooG@footnote{@url{http://www.cloog.org}} tool is there to
-solve the problem quite easily. For the previous
-example, the target code would be the following (@code{t1} and @code{t2}
-correspond to the two dimensions of the logical date, the reader may
-take care that this code actually implements the scattering function):
-
-@example
-@group
-for (t1 = 4; t1 <= 6; t1++) @{
-  for (t2 = t1+4; t2 <= t1+10; t2++) @{
-    if ((-t1+t2+2)%3 == 0) @{
-      i = (-t1+t2+2)/3 ;
-      j = t1-2 ;
-      P[i+j] += A[i] + B[j]; // S4
-    @}
-  @}
-@}
-@end group
-@end example
-
-
-
-Obviously with such a twisted scheduling, it is hard to see the "meaning"
-of the transformation. To name any kind of program transformation as
-a magic spell ("tile", "fuse", "skew"...) is an old bad habit which is not
-relevant anymore in the polyhedral model: a scheduling may be an arbitrary
-complex sequence of basic-old-good transformations. Nevertheless it is most
-of the time quite easy to translate well known transformations to schedules.
-For instance, let us consider this new scheduling function:
-
-@tex
-@example
-@group
-$\theta_{S4}(i,j) = (j,i)$
-@end group
-@end example
-@end tex
-
-@ifnottex
-@example
-@group
-T_S4(i,j) = (j,i)
-@end group
-@end example
-@end ifnottex
-
-@noindent Using CLooG, we can generate the target code:
-
-@example
-@group
-for (t1 = 2; t1 <= 4; t1++) @{
-  for (t2 = 2; t2 <= 4; t2++) @{
-    i = t2;
-    j = t1;
-    P[i+j] += A[i] + B[j]; // S4
-  @}
-@}
-@end group
-@end example
-
-
-@noindent It is easy to see (and analyze) that it corresponds to a classical
-@emph{loop interchange} transformation.
-
-A very useful example of multi-dimensional scattering functions is
-the @strong{scheduling of the original program}.
-The method to compute it is quite simple (@pxref{Fea92}). The idea is to
-build an abstract syntax tree of the program and to read the scheduling for
-each statement. For instance, let us consider the following implementation of
-a Cholesky factorization:
-
-@example
-@group
-/* A Cholesky factorization kernel. */
-for (i=1;i<=N;i++) @{
-  for (j=1;j<=i-1;j++) @{
-    a[i][i] -= a[i][j] ;           // S1
-  @}
-  a[i][i] = sqrt(a[i][i]) ;        // S2
-  for (j=i+1;j<=N;j++) @{
-    for (k=1;k<=i-1;k++) @{
-      a[j][i] -= a[j][k]*a[i][k] ; // S3
-    @}
-    a[j][i] /= a[i][i] ;           // S4
-    @}
-  @}
-@}
-@end group
-@end example
-
-@noindent The corresponding abstract syntax tree is shown in the following
-figure. It directly gives the scattering functions (schedules) for all the
-statements of the program (just follow the paths).
-
-@image{images/tree,6cm}
-
-@tex
-$$
-\hbox{$ \cases{ \theta _{S1}(i,j)    &$=  (0,i,0,j,0)$\cr
-                \theta _{S2}(i)      &$=  (0,i,1)$\cr
-                \theta _{S3}(i,j,k)  &$=  (0,i,2,j,0,k,0)$\cr
-                \theta _{S4}(i,j)    &$=  (0,i,2,j,1)$}$}
-$$
-@end tex
-
-@ifnottex
-@example
-@group
-T_S1(i,j)   = (0,i,0,j,0)
-T_S2(i)     = (0,i,1)
-T_S3(i,j,k) = (0,i,2,j,0,k,0)
-T_S4(i,j)   = (0,i,2,j,1)
-@end group
-@end example
-@end ifnottex
-
-@noindent These schedules depend on the iterators and give for each instance
-of each statement a unique execution date. Using such scattering functions
-allows CLooG to re-generate the input code.
-
-@noindent To easily manipulate the scattering function of any
-statement @code{S}, we translate it to the matrix form:
-@tex
-@math{\theta_S}(@emph{iteration vector})
-@end tex
-@ifnottex
-T_S(@emph{iteration vector})
-@end ifnottex
-@code{ = }@strong{scattering matrix}@code{ * }@emph{iteration vector}.
-For instance let us consider again our previous example
-@tex
-$\theta_{S4}(i, j) = (j+2, 3*i+j).$
-@end tex
-@ifnottex
-T_S4(i,j) = (j+2,3*i+j).
-@end ifnottex
-We write it in the following way:
-@tex
-$$
-\theta_{S4}
-\left(
-\matrix{
- i \cr
- j \cr
- 1
- }
-\right)
-=
-\left[
-\matrix{
- 0 &  0  & 2 \cr
- 3 &  1  & 0 
- }
-\right]
-\left(
-\matrix{
- i \cr
- j \cr
- 1
- }
-\right)
-$$
-@end tex
-@ifnottex
-@example
-@group
-     [ i ]    [  0  1  2 ]   [ i ]
-T_S4([ j ]) = [  3  1  0 ] * [ j ]
-     [ 1 ]                   [ 1 ]
-@end group
-@end example
-@end ifnottex
-
-@noindent @strong{The scattering matrix will be used in all our tools to provide
-the information on the scattering of a given statement
-(the iteration vector is in general an implicit information).}
-
-
-@node Access Function
-@subsection Access Function
-
-Before applying any transformation, it is essential to deeply analyze both the
-original program and the transformation to ensure the transformation does not
-imply any modification of the original program semantics. In the polyhedral
-model, we are able to achieve
-an exact analysis when all the memory accesses are made through arrays
-(note that variables are a particular case of arrays since they are simply
-arrays with only one memory location) with affine subscripts that depend
-on outer loop counters and global parameters (note that @emph{subscripts}
-are sometimes called @emph{index} or @emph{accesses} in the literature).
-
-For instance let us consider the array access @code{A[2*i+j][j][i+N]}. It has
-three dimensions, each subscript dimension is an affine form of some outer loop
-iterarors (@code{i} and @code{j}) and global parameters (@code{N}) hence
-it corresponds to an acceptable array access to be analyzed in the
-polyhedral model.
-
-Each array access can target a different memory cell depending on the
-statement instance, i.e., depending on the iteration vector.
-Thus we use access functions (or subscript functions, or index functions, as you
-prefer to call it) depending on the iteration vector to describe an array
-access. In our example, the access function would be written
-@math{F_A(i, j) = (2*i+j, j, i+N)}.
-
-@noindent To easily manipulate the access function of any
-array @code{A}, we translate it to the matrix form:
-@math{F_A}(@emph{iteration vector})
-@code{ = }@strong{access matrix}@code{ * }@emph{iteration vector}.
-For instance let us consider again our previous example. We would
-write it in the following way:
-@tex
-$$
-F_A
-\left(
-\matrix{
- i \cr
- j \cr
- N \cr
- 1
- }
-\right)
-=
-\left[
-\matrix{
- 2 &  1  &  0 &  0 \cr
- 0 &  1  &  0 &  0 \cr
- 1 &  0  &  1 &  0
- }
-\right]
-\left(
-\matrix{
- i \cr
- j \cr
- N \cr
- 1
- }
-\right)
-$$
-@end tex
-@ifnottex
-@example
-@group
-    [ i ]    [  2  1  0  0 ]   [ i ]
-F_A([ j ]) = [  0  1  0  0 ] * [ j ]
-    [ N ]    [  1  0  1  0 ]   [ N ]
-    [ 1 ]                      [ 1 ]
-@end group
-@end example
-@end ifnottex
-
-@noindent @strong{The access matrix will be used in all our tools to provide the
-information on the access of a given statement
-(the iteration vector is in general an implicit information).}
-
-@node What's Next?
-@section What's Next?
-
-OK, now you have an idea about how we do represent a program part in the
-polyhedral model. You know the three main concepts, namely: domain, scattering
-and access. What can you do with this?! Well, pretty much anything related
-to code restructuring! The core idea will be to rely on the mathematical
-representation to extract useful information about your
-code (data reuse, parallelism...) and to generate a scattering
-to benefit from the properties you analysed.
-However, OpenScop's documentation is not the right
-place to learn at this (OpenScop is all about representation, not about
-manipulation). Probably it is the right time for you to
-have a look at:
-@itemize @bullet
-@item PoCC @url{http://pocc.sourceforge.net}
-@item Pluto @url{http://pluto-compiler.sourceforge.net}
-@end itemize
-
-@noindent Have fun :-) !
-
-
-@c %  *********************** OpenScop Specification **************************
-@node OpenScop Specification
-@chapter OpenScop Specification
-
-OpenScop provides an explicit polyhedral representation of a static control
-part. It has been designed by various polyhedral compilation tool writers from
-various institutions. It builds on previous popular polyhedral file and data
-structure formats (such as @emph{.cloog} and CLooG data structures) to provide
-a unique, extensible format to most polyhedral compilation tools. It
-is composed of two parts. The first part, the so-called 
-@emph{core part}, is devoted to the polyhedral representation of a SCoP.
-It contains what is strictly necessary to build a
-complete source-to-source framework in the polyhedral model and to output a
-semantically equivalent code for the SCoP, from analysis to code generation.
-The second part of the format, the so-called @emph{extension part},
-contains extensions to provide additional informations to some tools.
-
-@menu
-* Preliminary Example::
-* OpenScop File Format Specification::
-* OpenScop Data Structure Specification::
-* Extensions::
-* History::
-@end menu
-
-@c %/*************************************************************************
-@c % *                         PRELIMINARY EXAMPLE                           *
-@c % *************************************************************************/
-@node Preliminary Example
-@section Preliminary Example
-OpenScop is a specification for representing static control program parts in
-the polyhedral model. Thus, we can translate some code parts to an equivalent
-OpenScop representation. As an example, let us consider the
-following matrix-multiply kernel:
-
-@example
-#pragma scop
-if (N > 0) @{
-  for (i = 0; i < N; i++) @{
-    for (j = 0; j < N; j++) @{
-      C[i][j] = 0.0;
-      for (k = 0; k < N; k++)
-        C[i][j] = C[i][j] + A[i][k] * B[k][j];
-    @}
-  @}
-@}
-@end example
-
-The Clan@footnote{@url{http://www.lri.fr/~bastoul/development/clan/}}
-tool may be used to translate this code part to an OpenScop
-representation automatically. The @code{#pragma scop} is used here for
-Clan, but some other tool may not need it. Here is the result of the
-translation to an OpenScop textual representation.
-
-@sp 1
-@center @strong{DON'T PANIC}
-@sp 1
-
-@noindent Explanations will follow and it is not
-as cryptic as it seems to be !
-@sp 1
-
-@example
-<OpenScop>
-
-# =============================================== Global
-# Backend Language
-C
-
-# Context
-CONTEXT
-1 3 0 0 0 1
-# e/i | N  | 1
-   1    1   -1    ## N-1 >= 0
-
-# Parameter names are provided
-1
-# Parameter names
-<strings>
-N
-</strings>
-
-# Number of statements
-2
-
-# =============================================== Statement 1
-# Number of relations describing the statement
-3
-
-# ----------------------------------------------  1.1 Domain
-DOMAIN
-4 5 2 0 0 1
-# e/i | i    j  | N  | 1
-   1    1    0    0    0    ## i >= 0
-   1   -1    0    1   -1    ## -i+N-1 >= 0
-   1    0    1    0    0    ## j >= 0
-   1    0   -1    1   -1    ## -j+N-1 >= 0
-
-# ----------------------------------------------  1.2 Scattering
-SCATTERING
-5 10 5 2 0 1
-# e/i| s1   s2   s3   s4   s5  | i    j  | N  | 1 
-   0   -1    0    0    0    0    0    0    0    0    ## s1 = 0
-   0    0   -1    0    0    0    1    0    0    0    ## s2 = i
-   0    0    0   -1    0    0    0    0    0    0    ## s3 = 0
-   0    0    0    0   -1    0    0    1    0    0    ## s4 = j
-   0    0    0    0    0   -1    0    0    0    0    ## s5 = 0
-
-# ----------------------------------------------  1.3 Access
-WRITE
-3 8 3 2 0 1
-# e/i| Arr  [1]  [2] | i    j  | N  | 1
-   0   -1    0    0    0    0    0    1    ## C
-   0    0   -1    0    1    0    0    0    ##  [i]
-   0    0    0   -1    0    1    0    0    ##     [j]
-
-# ----------------------------------------------  1.4 Body
-# Statement body is provided
-1
-# Statement body
-<body>
-# Number of original iterators
-2
-# Original iterator names
-i j 
-# Statement body expression
-C[i][j] = 0.0;
-</body>
-
-# =============================================== Statement 2
-# Number of relations describing the statement
-5
-
-# ----------------------------------------------  2.1 Domain
-DOMAIN
-6 6 3 0 0 1
-# e/i|  i    j    k  | N  | 1
-   1    1    0    0    0    0    ## i >= 0
-   1   -1    0    0    1   -1    ## -i+N-1 >= 0
-   1    0    1    0    0    0    ## j >= 0
-   1    0   -1    0    1   -1    ## -j+N-1 >= 0
-   1    0    0    1    0    0    ## k >= 0
-   1    0    0   -1    1   -1    ## -k+N-1 >= 0
-
-# ----------------------------------------------  2.2 Scattering
-SCATTERING
-7 13 7 3 0 1
-# e/i| s1   s2   s3   s4   s5   s6   s7  | i    j    k  | N  | 1
-   0   -1    0    0    0    0    0    0    0    0    0    0    0   ## s1 = 0
-   0    0   -1    0    0    0    0    0    1    0    0    0    0   ## s2 = i
-   0    0    0   -1    0    0    0    0    0    0    0    0    0   ## s3 = 0
-   0    0    0    0   -1    0    0    0    0    1    0    0    0   ## s4 = j
-   0    0    0    0    0   -1    0    0    0    0    0    0    1   ## s5 = 1
-   0    0    0    0    0    0   -1    0    0    0    1    0    0   ## s6 = k
-   0    0    0    0    0    0    0   -1    0    0    0    0    0   ## s7 = 0
-
-# ----------------------------------------------  2.3 Access
-WRITE
-3 9 3 3 0 1
-# e/i| Arr  [1]  [2] | i    j    k  | N  | 1
-   0   -1    0    0    0    0    0    0    1    ## C
-   0    0   -1    0    1    0    0    0    0    ##  [i]
-   0    0    0   -1    0    1    0    0    0    ##     [j]
-
-READ
-3 9 3 3 0 1
-# e/i| Arr  [1]  [2] | i    j    k  | N  | 1
-   0   -1    0    0    0    0    0    0    1    ## C
-   0    0   -1    0    1    0    0    0    0    ##  [i]
-   0    0    0   -1    0    1    0    0    0    ##     [j]
-
-READ
-3 9 3 3 0 1
-# e/i| Arr  [1]  [2] | i    j    k  | N  | 1
-   0   -1    0    0    0    0    0    0    2    ## A
-   0    0   -1    0    1    0    0    0    0    ##  [i]
-   0    0    0   -1    0    0    1    0    0    ##     [k]
-
-READ
-3 9 3 3 0 1
-# e/i| Arr  [1]  [2] | i    j    k  | N  | 1
-   0   -1    0    0    0    0    0    0    3    ## B
-   0    0   -1    0    0    0    1    0    0    ##  [k]
-   0    0    0   -1    0    1    0    0    0    ##     [j]
-
-# ----------------------------------------------  2.4 Body
-# Statement body is provided
-1
-# Statement body
-<body>
-# Number of original iterators
-3
-# Original iterator names
-i j k 
-# Statement body expression
-C[i][j] = C[i][j] + A[i][k] * B[k][j];
-</body>
-
-# =============================================== Extensions
-<comment>
-May the power of the polyhedral model be with you. 
-</comment>
-
-</OpenScop>
-@end example
-
-
-We will not describe here precisely the structure and the components of this
-output, this is described in depth in a further section
-(@pxref{OpenScop File Format Specification}). This format
-has been designed to be a possible input or output file format of most of
-polyhedral compilation tools. If you read the description of the polyhedral
-representation of programs, you should already feel familiar with this file
-format (@pxref{Polyhedral Representation}).
-
-
-@c %/*************************************************************************
-@c % *                       FILE FORMAT SPECIFICATION                       *
-@c % *************************************************************************/
-@node OpenScop File Format Specification
-@section OpenScop File Format Specification
-
-@menu
-* Relations::
-* Generics::
-@end menu
-
-The following grammar describes the structure of the
-OpenScop file format where terminals are preceeded by "_". Except
-stated otherwise, there can be at most one terminal per line in the file.
-Moreover, each line may finish with a comment, starting by the @samp{#}
-character. Each relevant part will be explained in more details momentarily:
-
-@example
-OpenScop              ::= Start_tag Data End_tag
-Start_tag             ::= "<OpenScop>"
-End_tag               ::= "</OpenScop>"
-Data                  ::= Context Statements Extension_list
-Context               ::= Language Parameter_Domain Parameters
-Statements            ::= Nb_statements Statement_list
-Statement_list        ::= Statement Statement_list | (void)
-Relation_list         ::= _Relation Relation_list  | (void)
-Extension_list        ::= _Generic  Extension_list | (void)
-Statement             ::= Statement_relations Body
-Body                  ::= "0" | "1" Body_information
-Parameters            ::= "0" | "1" Parameter_information
-Statement_relations   ::= Nb_relations Relation_List 
-Parameter_domain      ::= _Relation
-Language              ::= _String
-Nb_Relations          ::= _Integer
-Parameter_information ::= _Generic
-Body_information      ::= _Generic
-@end example
-
-The @samp{Context} and the @samp{Statements} parts compose the
-@emph{core part}, i.e., what is strictly necessary to build
-a complete source to source framework based on OpenSCop:
-@itemize @bullet
-@item  @samp{Context} represents the global information of the SCoP. It
-       consists on the target language, the global constraints on the
-       parameters and optionally the parameter information which may be necessary
-       for the code generation process. The constraints on the parameters
-       are represented as a relation (@pxref{Context Domain Relation}).
-       The parameter information is optional. It is preceded by a
-       boolean which precises whether it is provided or not.
-       It is a generic information (@pxref{Generics}), a @code{strings}
-       (@pxref{Strings Generic}) for instance.
-@item  @samp{Statements} represents the information about the statements.
-       @samp{Nb_statements} is the number of statements in the SCoP,
-       i.e. the number of @samp{Statement} items in the @samp{Statement_list}.
-       @samp{Statement} represents the information on a given statement.
-       To each statement is associated a list of relations and,
-       optionaly, a body. The list of relations may include
-       one iteration domain (@pxref{Iteration Domain Relation}),
-       one scattering relation (@pxref{Scattering Relation})
-       and several access relations (@pxref{Access Relation}).
-       There is no mandatory ordering, but for consistency reason it would
-       be much appreciated that iteration domain comes first (if present)
-       then scattering (if present), then accesses (if present).
-       The statement body is an optional information. It is preceded by a
-       boolean which precises whether it is provided or not. 
-       It is a generic information (@pxref{Generics}), a @code{body}
-       (@pxref{Body Generic}) for instance.
-@end itemize
-
-The @samp{Extension_list} represents the @emph{extension part} and may contain
-an arbitrary number of generic informations (@pxref{Generics}).
-Few examples of possible extensions are presented in a further
-section (@pxref{Extensions}).
-
-As shown by the grammar, the input file describes the various pieces of
-information based on strings, integers, @emph{relations} and @emph{generics}.
-Relations and Generics are specific to OpenScop and are described in depth
-in the following Sections (@pxref{Relations} and @pxref{Generics}).
-
-
-@c %/*************************************************************************
-@c % *                              RELATIONS                                *
-@c % *************************************************************************/
-@node Relations
-@subsection Relations
-
-@menu
-* Iteration Domain Relation::
-* Context Domain Relation::
-* Scattering Relation::
-* Access Relation::
-@end menu
-
-@emph{Relations} are the essence of the OpenScop format and contain the
-"polyhedral" information. They are used to describe either an iteration
-domain, or a context domain, or a scattering or a memory access.
-
-We use the relation term as a shortcut to denote a
-union of convex relations, each element of the union being described by a set of
-constraints in an extended PolyLib format (@pxref{Wil93}).
-The number of elements in the union is given by an integer on the first line,
-optionally followed by a comment starting with @samp{#}.
-This number of elements can be omitted when there is only one element.
-Each element in the union has the following syntax:
-
-@enumerate
-@item Some optional comment lines beginning with @samp{#}.
-@item A line with the type of the relation, possibly followed by comments.
-      The type can be one of the following:
-      @itemize @bullet
-      @item @code{UNDEFINED}: generic relation,
-      @item @code{CONTEXT}: for context information,
-      @item @code{DOMAIN}: for iteration domains,
-      @item @code{SCATTERING}: for scattering relation,
-      @item @code{READ}: for read accesses,
-      @item @code{WRITE}: for write accesses,
-      @item @code{MAY_WRITE}: for may-write accesses,
-      @end itemize
-@item A line with 6 numbers, possibly followed by comments:
-      @enumerate
-      @item the number of rows of the constraint matrix,
-      @item the number of columns of the constraint matrix,
-      @item the number of @emph{output dimensions},
-      @item the number of @emph{input dimension},
-      @item the number of @emph{local dimensions}
-            (existentially quantified dimensions),
-      @item the number of @emph{parameters}.
-      @end enumerate
-      The sum of the last four numbers should be equal to the number of columns
-      minus two. The remaining two columns are the equality/inequality
-      indicator and the constant term. The number of parameters should be the
-      same for all relations in the entire OpenScop file or data structure.
-@item The constraint rows. Each row corresponds to a constraint the
-      relation has to satisfy. Each row must be on a single line and is possibly
-      followed by comments. The constraint is an equality @math{p(x) = 0} if the
-      first element is 0, an inequality  @math{p(x) \geq 0} if the first element
-      is 1. The next elements are the coefficients of the output dimensions,
-      followed by coefficients of the input dimensions, the existentially
-      quantified dimensions and finally the parameters.
-      The last element is the constant term.
-@end enumerate
-
-This representation is the basis for several purposes. Examples for
-iteration domains (@pxref{Iteration Domain Relation}), context domains
-(@pxref{Context Domain Relation}), scattering
-relations (@pxref{Scattering Relation}) and
-access relations (@pxref{Access Relation}) are provided in further sections.
-
-@c %/**************************  ITERATION DOMAIN  ****************************
-@node Iteration Domain Relation
-@subsubsection Iteration Domain Relation
-
-Iteration domain represents the set of instances of the corresponding statement.
-OpenScop iteration domains are represented as relations with the following
-conventions:
-@itemize @bullet
-@item the type is @code{DOMAIN},
-@item there is 0 input dimension,
-@item loop iterators correspond to output dimensions.
-@end itemize
-
-@noindent For instance, assuming that @samp{i}, @samp{j} and @samp{k} are the loop
-iterators and @samp{M} and @samp{N} are the parameters, the domain defined by
-the following constraints :
-
-@tex
-$$
-\hbox{$ \cases{ -i     + M &$\geq 0$\cr
-                    -j + N &$\geq 0$\cr
-                 i + j - k &$\geq 0$}$}
-$$
-@end tex
-@ifnottex
-@example
-@group
-   -i + M >= 0
-   -j + N >= 0
-i + j - k >= 0
-@end group
-@end example
-@end ifnottex
-
-@noindent can be written in the input file as follows:
-
-@example
-@group
-# This is an iteration domain
-DOMAIN
-1 # Number of relations in the union
-3 7 3 0 0 2                  # 3 rows, 7 cols: 3 output dims and 2 params
-# e/i| i   j   k | M   N | 1
-   1  -1   0   0   1   0   0 #    -i + M >= 0
-   1   0  -1   0   0   1   0 #    -j + N >= 0
-   1   1   1  -1   0   0   0 # i + j - k >= 0
-@end group
-@end example
-
-@noindent Equivalently, it can be written in the following way as the number
-of relations in the union can be omitted if it is 1:
-
-@example
-@group
-# This is an iteration domain
-DOMAIN
-3 7 3 0 0 2                  # 3 rows, 7 cols: 3 output dims and 2 params
-# e/i| i   j   k | M   N | 1
-   1  -1   0   0   1   0   0 #    -i + M >= 0
-   1   0  -1   0   0   1   0 #    -j + N >= 0
-   1   1   1  -1   0   0   0 # i + j - k >= 0
-@end group
-@end example
-
-@noindent As an example for unions, let us consider the following pseudo-code:
-
-@example
-@group
-for (i = 1; i <= N; i++) @{
-  if ((i >= M) || (i <= 2*M))
-    S1(i);
-@}
-@end group
-@end example
-
-@noindent The iteration domain of @samp{S1} can be divided into two
-relations and written in the OpenScop file as follows:
-
-@example
-@group
-# This is an iteration domain
-DOMAIN
-2 # Number of relations in the union
-# Union part No.1
-3 5 1 0 0 2          # 3 rows, 5 cols: 1 output dim and 2 params
-# e/i| i | M   N | 1
-   1   1   0   0  -1 #  i >= 1
-   1  -1   0   1   0 #  i <= N
-   1   1  -1   0   0 #  i >= M
-# Union part No.2
-3 5 1 0 0 2          # 3 rows, 5 cols: 1 output dim and 2 params
-# e/i| i | M   N | 1
-   1   1   0   0  -1 #  i >= 1
-   1  -1   0   1   0 #  i <= N
-   1  -1   2   0   0 #  i <= 2*M
-@end group
-@end example
-
-@noindent As an example for local dimensions (existentially quantified
-dimensions), let us consider the following pseudo-code:
-
-@example
-@group
-for (i = 1; i <= N; i++) @{
-  if ((i % 2) == 0)
-    S1(i);
-@}
-@end group
-@end example
-
-@noindent The iteration domain of @samp{S1} is composed of all even
-integer values between 1 and N. The "divisible by two" constraint can
-be expressed as follows: there exists an integer @samp{ld} such that
-@samp{i = 2*ld}. We encode this thanks to a new local dimension:
-
-@example
-@group
-# This is an iteration domain
-DOMAIN
-3 5 1 0 1 1          # 3 rows, 5 cols: 1 output dim, 1 local dim, 1 param
-# e/i| i |ld | N | 1
-   0   1  -2   0   0 #  i = 2*ld
-   1   1   0   0   1 #  i >= 1
-   1  -1   0   1   0 #  i <= N
-@end group
-@end example
-
-
-@c %/**************************  CONTEXT DOMAIN  ******************************
-@node Context Domain Relation
-@subsubsection Context Domain Relation
-
-The context domain is a particular case of iteration domain
-(@pxref{Iteration Domain Relation}) where there are only
-constraints about parameters (no loop iterators). Hence it is the same
-as an iteration domain, with the following conventions:
-@itemize @bullet
-@item the type is @code{CONTEXT},
-@item there is 0 input dimension,
-@item there is 0 output dimension.
-@end itemize
-
-
-@c %/*************************  SCATTERING RELATION  **************************
-@node Scattering Relation
-@subsubsection Scattering Relation
-
-Scattering relation maps an iteration domain to a logical time and/or
-space (and/or) anything.
-OpenScop scattering information is represented as relations
-(@pxref{Relations}) with the following conventions:
-
-@itemize @bullet
-@item the type is @code{SCATTERING},
-@item output dimensions correspond to scattering dimensions,
-@item loop iterators correspond to input dimensions.
-@end itemize
-
-As an example of a scattering relation and
-assuming that @samp{i}, @samp{j} and @samp{k} are the loop
-iterators and @samp{M} and @samp{N} are the parameters, take for instance:
-@tex
-$\theta_{S}(i,j,k) = (j+2,3*i+j,k+N+1).$
-@end tex
-@ifnottex
-@example
-T_@{S@}(i,j,k) = (j+2,3*i+j,k+N+1).
-@end example
-@end ifnottex
-We can represent it in the following way:
-
-@example
-@group
-# A scattering relation
-SCATTERING
-# 3 rows, 10 columns: 3 scattering dimensions, 3 iterators, 2 parameters
-3 10 3 3 0 2
-# e/i|s1  s2  s3 | i   j   k | M   N | 1
-   0  -1   0   0   0   1   0   0   0   2 # s1 = j+2
-   0   0  -1   0   3   1   0   0   0   0 # s2 = 3*i+j
-   0   0   0  -1   0   0   1   0   1   1 # s3 = k+N+1
-@end group
-@end example
-
-@c %/**************************  ACCESS RELATION  *****************************
-@node Access Relation
-@subsubsection Access Relation
-
-Access relation maps an iteration domain to an array space.
-Each array accessed in the SCoP has a unique identification number.
-OpenScop relation information is represented as relations
-(@pxref{Relations}) with the following conventions:
-
-@itemize @bullet
-@item the type is one of the following:
-      @itemize @bullet
-      @item @code{READ}, for read accesses,
-      @item @code{WRITE}, for write accesses,
-      @item @code{MAY_WRITE}, for may write accesses,
-      @end itemize
-@item output dimensions correspond to the array identifier and dimensions,
-@item the first output dimension corresponds to the array identifier,
-@item the (i+1)th output dimension corresponds to the ith array dimension (i>1),
-@item loop iterators correspond to input dimensions.
-@end itemize
-
-As an example of a scattering relation and
-assuming that @samp{i}, @samp{j} and @samp{k} are the loop
-iterators and @samp{M} and @samp{N} are the parameters, let us consider
-the array access @code{A[2*i+j][j][i+N]} (the identifier of @code{A} is 42),
-and let us suppose this is a read access. Its representation would be the
-following:
-
-@example
-@group
-# A read access relation
-READ
-# 4 rows, 11 columns: 4 array dimensions, 3 iterators, 2 parameters
-4 11 4 3 0 2
-# e/i|Arr [1] [2] [3]| i   j   k | M   N | 1
-   0  -1   0   0   0   0   0   0   0   0  42   # A
-   0   0  -1   0   0   2   1   0   0   0   0   #  [2*i+j]
-   0   0   0  -1   0   0   1   0   0   0   0   #         [j]
-   0   0   0   0  -1   1   0   0   0   1   0   #            [i+N]
-@end group
-@end example
-
-To understand this representation, consider that OpenScop accesses
-are general memory accesses and not array accesses. The memory is
-seen as a big array @code{Mem} while usual array names correspond to
-the first dimension. Hence our example translates to @code{Mem[42][2*i+j][j][i+N]}.
-
-Unions of access relations are allowed. In this case, each union part must
-refer at the same array identifier, and the number of dimensions must be
-consistent.
-
-@c %/*************************************************************************
-@c % *                               GENERICS                                *
-@c % *************************************************************************/
-@node Generics
-@subsection Generics
-@menu
-* Strings Generic::
-* Body Generic::
-@end menu
-
-@emph{Generics} represent any elaborated non-polyhedral information in the
-OpenScop format. They are used to represent the parameter information, the
-statement body information as well as the extensions. Each generic information
-is delimited using XML-like tags corresponding to its URI (Unique Resource
-Identifier), For instance, if the generic has the URI @code{foo}, the begin
-tag is @code{<foo>} and the end tag is @code{</foo>}).
-
-Two generics, namely @code{strings} (@pxref{Strings Generic}) and
-@code{body} (@pxref{Body Generic}) are part of the OpenScop
-specification to provide the minimum, stricly necessary information to
-build a complete source-to-source polyhedral framework based on OpenScop.
-However, generics can be basically @emph{anything} as long as they are
-properly delimited. OpenScop implementations will simply ignore
-non-supported generics and warn the user with the mention of the
-non-supported URIs. Support of new generics will be added throught the
-extension mechanism.
-
-@c ---------------------------------------------------------------------------
-
-@node Strings Generic
-@subsubsection Strings Generic
-
-The purpose of the @code{strings} generic is to represent a list of
-textual strings on one line (which may be used, e.g., to represent the list of
-parameter names in the order used in the relation). Its URI is @code{strings}
-and its file format respects the following grammar:
-@example
-Strings_generic     ::= "<strings>" Strings "</strings>"
-Strings             ::= _String String_list  | (void)
-@end example
-
-@noindent A possible example of textual @code{strings} is the following:
-@example
-@group
-<strings>
-Not one sentence but 6 strings!
-</strings>
-@end group
-@end example
-
-@c ---------------------------------------------------------------------------
-
-@node Body Generic
-@subsubsection Body Generic
-
-The purpose of the @code{body} generic is to represent the textual
-information about a statement. It contains the number of original iterators on
-the first line, the list of original iterators on the second
-line (the loop counters of the statement surrounding loops in the original
-program) and the original textual body expression on the third line.
-Its URI is @code{body} and its file format respects the following grammar
-(the @code{String} rule is reused, @pxref{Strings Generic}):
-@example
-Body_generic        ::= "<body>" Body "</body>"
-Body                ::= Nb_iterators Iterator_list Expression
-Nb_iterators        ::= _Integer
-Iterator_list       ::= Strings
-Expression          ::= Strings
-@end example
-
-@noindent A possible example of textual @code{body} is the following:
-@example
-@group
-<body>
-# Number of original iterators
-2
-# Original iterators
-i j
-# Original statement expression
-A[i+j] += B[i] * C[j];
-</body>
-@end group
-@end example
-
-
-@c %/*************************************************************************
-@c % *                      DATA STRUCTURE SPECIFICATION                     *
-@c % *************************************************************************/
-@node OpenScop Data Structure Specification
-@section OpenScop Data Structure Specification
-
-@menu
-* osl_relation_t::
-* osl_relation_list_t::
-* osl_interface_t::
-* osl_generic_t::
-* osl_strings_t::
-* osl_body_t::
-* osl_statement_t::
-* osl_scop_t::
-@end menu
-
-The OpenScop specification offers a small set of C data structures devoted to
-represent a SCoP in memory in a convenient way. Using them in some tool or
-library may greatly facilitate its interaction with other tools or libraries
-which rely on this representation as well. Every field may not be useful for
-a given tool or library. A general rule for all the data structure is
-that a @code{NULL} pointer or a -1 integer value means the information is
-not present. Contrary to engineering time, memory is cheap today, so it's much
-probably not a big deal that some fields are left empty. Every field may not
-be enough for a given tool or library. In this case it is much recommended
-to provide a new extension which may be reused by other users
-(@pxref{Extensions}).
-
-Each tool or library may have its own implementation of the OpenScop
-data structures. The type names should not be the same as those provided
-as an example here (they correspond to the OpenScop Library implementation).
-The names of the fields, and their ordering, should however be the same. In this
-way, the interaction between tools and libraries should be as simple as a cast.
-
-Before reading at the OpenScop data structures, it is much recommended to
-read at the OpenScop file format description, as it is quite close to this
-representation (@pxref{OpenScop File Format Specification}).
-
-
-@node osl_relation_t
-@subsection osl_relation_t
-
-@example
-@group
-struct osl_relation @{
-  int type;                   /* What this relation is encoding */ 
-  int precision;              /* Precision of the matrix elements */ 
-  int nb_rows;                /* Number of rows */
-  int nb_columns;             /* Number of columns */
-  int nb_output_dims;         /* Number of output dimensions */
-  int nb_input_dims;          /* Number of input dimensions */
-  int nb_local_dims;          /* Number of local dimensions */
-  int nb_parameters;          /* Number of parameters */
-  void ** m;                  /* Matrix of constraints */
-  struct osl_relation * next; /* Next relation in the union */
-@};
-typedef struct osl_relation   osl_relation_t;
-typedef struct osl_relation * osl_relation_p;
-@end group
-@end example
-
-@noindent The @code{osl_relation_t} structure stores a part of an
-union of relations. A union of relation is a @code{NULL}-terminated
-linked list of union parts (@code{next} field). The @code{type} field
-may provide some information about what the relation is encoding:
-@itemize @bullet
-@item -1: undefined (@code{OSL_UNDEFINED}),
-@item 2: context domain (@code{OSL_TYPE_CONTEXT}),
-@item 3: iteration domain (@code{OSL_TYPE_DOMAIN}),
-@item 4: scattering relation (@code{OSL_TYPE_SCATTERING}),
-@item 6: read access relation (@code{OSL_TYPE_READ}),
-@item 7: write access relation (@code{OSL_TYPE_WRITE}),
-@item 8: may write access relation (@code{OSL_TYPE_MAY_WRITE}),
-@end itemize
-The various numbers provide the details on the relation itself
-(@pxref{Relations}) while the @code{m} field points to
-the constraint matrix. The precision of the constraint matrix elements is
-provided by the @code{precision} field. It can take the following
-values:
-@itemize @bullet
-@item 32: 32 bits precision, elements are @code{long int}
-      (@code{OSL_PRECISION_SP}),
-@item 64: 64 bits precision, elements are @code{long long int}
-      (@code{OSL_PRECISION_DP}),
-@item 0: multiple precision, elements are GNU GMP Library's
-      @code{mpz_t} (@code{OSL_PRECISION_MP}).
-@end itemize
-
-@c ---------------------------------------------------------------------------
-
-@node osl_relation_list_t
-@subsection osl_relation_list_t
-
-@example
-@group
-struct osl_relation_list @{
-  osl_relation_p elt;              /* Element of the list */
-  struct osl_relation_list * next; /* Next element of the list */
-@};
-typedef struct osl_relation_list   osl_relation_list_t;
-typedef struct osl_relation_list * osl_relation_list_p;
-@end group
-@end example
-
-@noindent The @code{osl_relation_list_t} structure is a @code{NULL}-terminated
-linked list of @code{osl_relation_t} data structures.
-@code{elt} is a relation element of the list and @code{next} is the pointer to
-the next element of the list.
-
-@c ---------------------------------------------------------------------------
-
-@node osl_interface_t
-@subsection osl_interface_t
-
-@example
-@group
-typedef void   (*osl_idump_f) (FILE *, void *, int);
-typedef char * (*osl_sprint_f)(void *);
-typedef void * (*osl_sread_f) (char *);
-typedef void * (*osl_malloc_f)();
-typedef void   (*osl_free_f)  (void *);
-typedef void * (*osl_clone_f) (void *);
-typedef int    (*osl_equal_f) (void *, void *);
-
-struct osl_interface @{
-  char * URI;                  /* Unique interface identifier string */
-  osl_idump_f  idump;          /* Pointer to the idump function */
-  osl_sprint_f sprint;         /* Pointer to the sprint function */
-  osl_sread_f  sread;          /* Pointer to the sread function */
-  osl_malloc_f malloc;         /* Pointer to the malloc function */
-  osl_free_f   free;           /* Pointer to the free function */
-  osl_clone_f  clone;          /* Pointer to the clone function */
-  osl_equal_f  equal;          /* Pointer to the equal function */
-  struct osl_interface * next; /* Next interface in the list */
-@};
-typedef struct osl_interface   osl_interface_t;
-typedef struct osl_interface * osl_interface_p;
-@end group
-@end example
-
-@noindent The @code{osl_interface_t} structure represents a
-node in a @code{NULL}-terminated list of interfaces. Each node stores the
-@emph{interface} of a generic OpenScop object, i.e., its unique name
-(@code{URI}) and the function pointers to all the base functions it has
-to provide. Extension providers will find information relative to those
-functions in the OpenScop Library description (@pxref{Base Functions})
-and the section dedicated to writing extensions
-(@pxref{Extension Development}).
-
-@c ---------------------------------------------------------------------------
-
-@node osl_generic_t
-@subsection osl_generic_t
-
-@example
-@group
-struct osl_generic @{
-  void * data;                 /* Pointer to some data */
-  osl_interface_p interface;   /* Interface to work with the data */
-  struct osl_generic * next;   /* Pointer to the next generic */
-@};
-typedef struct osl_generic   osl_generic_t;
-typedef struct osl_generic * osl_generic_p;
-@end group
-@end example
-
-@noindent The @code{osl_generic_t} structure represents a node in a
-@code{NULL}-terminated list of generic elements. It stores some data
-and operations with no pre-defined type. The information is accessible
-through the @code{data} pointer while the type and operations are
-accessible through the @code{interface} pointer. It is used to represent
-data that are allowed to differ in implementations, such as symbols and
-extensions.
-
-@c ---------------------------------------------------------------------------
-
-@node osl_strings_t
-@subsection osl_strings_t
-
-@example
-@group
-struct osl_string @{
-  char ** string;              /* NULL-terminated array of strings */
-@};
-typedef struct osl_strings   osl_strings_t;
-typedef struct osl_strings * osl_strings_p;
-@end group
-@end example
-
-@noindent The @code{osl_strings_t} structure represents a NULL-terminated
-list of C character strings. It is encapsulated into a structure to allow
-its manipulation through a generic type.
-
-@c ---------------------------------------------------------------------------
-
-@node osl_body_t
-@subsection osl_body_t
-
-@example
-@group
-struct osl_body @{
-  osl_strings_p iterators;     /* Original iterators */
-  osl_strings_p expression;    /* Original statement expression */
-@};
-typedef struct osl_body   osl_body_t;
-typedef struct osl_body * osl_body_p;
-@end group
-@end example
-
-@noindent The @code{osl_body_t} structure stores a statement body in a
-textual form. The complete original expression (directly copy-pasted
-from the original code) is in the expression field while the textual forms
-of the original iterators are in the iterators field. They may be used for
-substitutions inside the expression.
-
-@c ---------------------------------------------------------------------------
-
-@node osl_statement_t
-@subsection osl_statement_t
-
-@example
-@group
-struct osl_statement @{
-  osl_relation_p domain;       /* Iteration domain */
-  osl_relation_p scattering;   /* Scattering relation */
-  osl_relation_list_p access;  /* List of array access relations */
-  osl_generic_p body;          /* Original statement body */
-  void * usr;                  /* A user-defined field */
-  struct osl_statement * next; /* Next statement in the list */
-@};
-typedef struct osl_statement   osl_statement_t;
-typedef struct osl_statement * osl_statement_p;
-@end group
-@end example
-
-@noindent The @code{osl_statement_t} structure represents a node
-in a @code{NULL}-terminated linked list of statements. Each node contains the
-useful information for a given statement to process it within a polyhedral
-framework. The order in the list may matter for naming conventions
-(e.g. "S1" for the first statement in the list). The iteration domain
-and the scattering are represented using an @code{osl_relation_p}
-structure while the accesses are using a list of
-relations: one for each memory access in the statement.
-The @code{body} field should provide information about the statement body
-(since it has a generic type, the specification is not strict about how it
-is used), e.g., using the @code{osl_body_t} data structure (@pxref{osl_body_t}).
-It is also possible to use the @code{usr} field, but it has to be
-totally managed by the user.
-
-@c ---------------------------------------------------------------------------
-
-@node osl_scop_t
-@subsection osl_scop_t
-@example
-@group
-struct osl_scop @{
-  int version;                 /* Version of the data structure */
-  char * language;             /* Target language */
-  osl_relation_p context;      /* Constraints on the parameters */
-  osl_generic_p parameters;    /* Information about parameters */
-  osl_statement_p statement;   /* Statement list */
-  osl_interface_p registry;    /* Registered extension interfaces */
-  osl_generic_p extension;     /* Extension list */
-  void * usr;                  /* A user-defined field */
-  struct osl_scop * next;      /* Next scop in the list */
-@};
-typedef struct osl_scop   osl_scop_t;
-typedef struct osl_scop * osl_scop_p;
-@end group
-@end example
-
-@noindent @code{osl_scop_t} represents a node in a
-@code{NULL}-terminated list of scops. It stores the useful informations
-of a static control part of a program to process it within a polyhedral
-framework. To prepare OpenScop specification evolution, the @code{version}
-field tells the version of the data structure. It should be set to 1 for
-now (and hopefully a very, very, long time).
-First, it contains the informations about the context. The target language
-in expressed in the @code{language} field. The constraints on the
-global parameters are detailed in the @code{context} field.
-The @code{paremeters} field should provide information about the
-parameters (since it has a generic type, the specification is not strict
-about how it is used), e.g., using the @code{osl_strings_t} data structure
-(@pxref{osl_strings_t}).
-Finally, it contains the list of statements @code{statement}, the list
-of registered interfaces for generic types @code{registry} and the list of
-extentions @code{extension}.
-It is also possible to use the @code{usr} field, but it has to be
-totally managed by the user.
-
-As an example, let us consider again the matrix multiply program
-(@pxref{Preliminary Example}).
-The next figure gives a possible representation in memory for this
-SCoP thanks to the OpenScop data structures (it has been actually printed
-by the @code{osl_scop_dump} function), note that symbols like
-parameters, original iterators and statement expression are represented
-with an @code{osl_strings_t} which does not belong to the
-specification but to the OpenScop Library implementation:
-
-@c @smallexample
-@example
-+-- osl_scop_t
-|    |    
-|    Version: 1
-|    |    
-|    Language: C
-|    |    
-|    +-- osl_relation_t (CONTEXT, 32 bits)
-|    |    1 3 0 0 0 1
-|    |    [   1   1  -1 ]
-|    |    
-|    +-- osl_generic_t
-|    |    |    
-|    |    +-- osl_interface_t: URI = strings
-|    |    |    
-|    |    +-- osl_strings_t: N
-|    |    |    
-|    |    
-|    +-- osl_statement_t (S1)
-|    |    |    
-|    |    +-- osl_relation_t (DOMAIN, 32 bits)
-|    |    |    4 5 2 0 0 1
-|    |    |    [   1   1   0   0   0 ]
-|    |    |    [   1  -1   0   1  -1 ]
-|    |    |    [   1   0   1   0   0 ]
-|    |    |    [   1   0  -1   1  -1 ]
-|    |    |    
-|    |    +-- osl_relation_t (SCATTERING, 32 bits)
-|    |    |    5 10 5 2 0 1
-|    |    |    [   0  -1   0   0   0   0   0   0   0   0 ]
-|    |    |    [   0   0  -1   0   0   0   1   0   0   0 ]
-|    |    |    [   0   0   0  -1   0   0   0   0   0   0 ]
-|    |    |    [   0   0   0   0  -1   0   0   1   0   0 ]
-|    |    |    [   0   0   0   0   0  -1   0   0   0   0 ]
-|    |    |    
-|    |    +-- osl_relation_list_t
-|    |    |    |    
-|    |    |    +-- osl_relation_t (WRITE, 32 bits)
-|    |    |    |    3 8 3 2 0 1
-|    |    |    |    [   0  -1   0   0   0   0   0   1 ]
-|    |    |    |    [   0   0  -1   0   1   0   0   0 ]
-|    |    |    |    [   0   0   0  -1   0   1   0   0 ]
-|    |    |    |    
-|    |    |    
-|    |    +-- osl_generic_t
-|    |    |    |    
-|    |    |    +-- osl_interface_t: URI = body
-|    |    |    |    
-|    |    |    +-- osl_strings_t: i j
-|    |    |    |    
-|    |    |    +-- osl_strings_t: C[i][j] = 0.0;
-|    |    |    |    
-|    |    |    
-|    |    V
-|    |  osl_statement_t (S2)
-|    |    |    
-|    |    +-- osl_relation_t (DOMAIN, 32 bits)
-|    |    |    6 6 3 0 0 1
-|    |    |    [   1   1   0   0   0   0 ]
-|    |    |    [   1  -1   0   0   1  -1 ]
-|    |    |    [   1   0   1   0   0   0 ]
-|    |    |    [   1   0  -1   0   1  -1 ]
-|    |    |    [   1   0   0   1   0   0 ]
-|    |    |    [   1   0   0  -1   1  -1 ]
-|    |    |    
-|    |    +-- osl_relation_t (SCATTERING, 32 bits)
-|    |    |    7 13 7 3 0 1
-|    |    |    [   0  -1   0   0   0   0   0   0   0   0   0   0   0 ]
-|    |    |    [   0   0  -1   0   0   0   0   0   1   0   0   0   0 ]
-|    |    |    [   0   0   0  -1   0   0   0   0   0   0   0   0   0 ]
-|    |    |    [   0   0   0   0  -1   0   0   0   0   1   0   0   0 ]
-|    |    |    [   0   0   0   0   0  -1   0   0   0   0   0   0   1 ]
-|    |    |    [   0   0   0   0   0   0  -1   0   0   0   1   0   0 ]
-|    |    |    [   0   0   0   0   0   0   0  -1   0   0   0   0   0 ]
-|    |    |    
-|    |    +-- osl_relation_list_t
-|    |    |    |    
-|    |    |    +-- osl_relation_t (WRITE, 32 bits)
-|    |    |    |    3 9 3 3 0 1
-|    |    |    |    [   0  -1   0   0   0   0   0   0   1 ]
-|    |    |    |    [   0   0  -1   0   1   0   0   0   0 ]
-|    |    |    |    [   0   0   0  -1   0   1   0   0   0 ]
-|    |    |    |    
-|    |    |    V
-|    |    |  osl_relation_list_t
-|    |    |    |    
-|    |    |    +-- osl_relation_t (READ, 32 bits)
-|    |    |    |    3 9 3 3 0 1
-|    |    |    |    [   0  -1   0   0   0   0   0   0   1 ]
-|    |    |    |    [   0   0  -1   0   1   0   0   0   0 ]
-|    |    |    |    [   0   0   0  -1   0   1   0   0   0 ]
-|    |    |    |    
-|    |    |    V
-|    |    |  osl_relation_list_t
-|    |    |    |    
-|    |    |    +-- osl_relation_t (READ, 32 bits)
-|    |    |    |    3 9 3 3 0 1
-|    |    |    |    [   0  -1   0   0   0   0   0   0   2 ]
-|    |    |    |    [   0   0  -1   0   1   0   0   0   0 ]
-|    |    |    |    [   0   0   0  -1   0   0   1   0   0 ]
-|    |    |    |    
-|    |    |    V
-|    |    |  osl_relation_list_t
-|    |    |    |    
-|    |    |    +-- osl_relation_t (READ, 32 bits)
-|    |    |    |    3 9 3 3 0 1
-|    |    |    |    [   0  -1   0   0   0   0   0   0   3 ]
-|    |    |    |    [   0   0  -1   0   0   0   1   0   0 ]
-|    |    |    |    [   0   0   0  -1   0   1   0   0   0 ]
-|    |    |    |    
-|    |    |    
-|    |    +-- osl_generic_t
-|    |    |    |    
-|    |    |    +-- osl_interface_t: URI = body
-|    |    |    |    
-|    |    |    +-- osl_strings_t: i j k
-|    |    |    |    
-|    |    |    +-- osl_strings_t: C[i][j] = C[i][j] + A[i][k]*B[k][j];
-|    |    |    |    
-|    |    |    
-|    |    
-|    +-- NULL interface
-|    |    
-|    +-- NULL generic
-|    |    
-|    
-@end example
-@c @end smallexample
-
-
-@c %/*************************************************************************
-@c % *                              EXTENSIONS                               *
-@c % *************************************************************************/
-@node Extensions
-@section Extensions
-
-The core part of the OpenScop representation embeds what is strictly
-necessary to build a complete source-to-source polyhedral framework.
-However it may not be enough. Hence, OpenScop offers a very flexible
-extension part. Actually, the only constraint to build an extension is
-to request the OpenScop maintainer for a unique extension name: its URI
-(ask the maintainer through the OpenScop mailing list
-@email{openscop-development@@googlegroups.com}).
-
-The policy to support extensions is the following and is pretty simple: an
-OpenScop implementation is not required to support any extension. If it
-is processing an OpenScop file or data structure which contains an
-extension which is not supported, it must (1) warn the user with the 
-mention of the URI of the non-supported extension
-and (2) ignore this extension.
-
-Extensions in an OpenScop file are provided after the core part, without
-any specific order. Each extension is delimited using
-XML-like tags corresponding to its URI (e.g., if the extension has the URI
-@code{foo}, the begin tag is @code{<foo>} and the end tag is @code{</foo>}).
-There is no specification or preferred way to write the extension body.
-Extensions in an OpenScop data structure must be accessible through one
-pointer. This pointer will be stored in the @code{data} field of an
-@code{osl_generic_t} container (@pxref{osl_generic_t}). There must be only
-one extension with the same URI in an OpenScop file or data structure.
-
-Extension writers may write a short documentation about their extension to
-be added to this document. For consistency reason, this
-documentation should comply to the documentation of the
-@code{comment} option (@pxref{Comment Extension}). To describe the
-file format, it is allowed to reuse the existing rules and terminals
-present in the OpenScop file format description without defining them
-(@pxref{OpenScop File Format Specification}). By sending a
-documentation, you accept it to be added to this document. In
-particular, the sender fully accepts the license and copyright notice.
-
-@menu
-* Comment Extension::
-* Arrays Extension::
-* Scatnames Extension::
-* Lines Extension::
-* Irregular Extension::
-@end menu
-
-@c ---------------------------------------------------------------------------
-
-@node Comment Extension
-@subsection Comment Extension
-
-@noindent @strong{Description}
-@itemize @bullet
-@item URI: @code{comment}.
-@item Author: C@'edric Bastoul <cedric.bastoul@@u-psud.fr>.
-@item Purpose: the @code{comment} extension stores a textual string.
-@end itemize
-
-@noindent @strong{File Format}
-
-@noindent The @code{comment} extension file format respects the following
-grammar:
-@example
-Comment_generic     ::= "<comment>" Comment "</comment>"
-Comment             ::= _Text
-@end example
-
-@noindent An example of textual @code{comment} extension is the following:
-@example
-@group
-<comment>
-This is a comment string.
-</comment>
-@end group
-@end example
-
-@noindent @strong{Data Structure}
-
-@noindent The @code{comment} extension data structure is the following:
-@example
-@group
-struct osl_comment @{
-  char * comment;  /* Comment message as a 0-terminated string */
-@};
-typedef struct osl_comment   osl_comment_t;
-typedef struct osl_comment * osl_comment_p;
-@end group
-@end example
-
-@c ---------------------------------------------------------------------------
-
-
-@node Scatnames Extension
-@subsection Scatnames Extension
-
-@noindent @strong{Description}
-@itemize @bullet
-@item URI: @code{scatnames}.
-@item Author: C@'edric Bastoul <cedric.bastoul@@u-psud.fr>.
-@item Purpose: the @code{scatnames} extension provides a list of textual
-scattering dimension names.
-@end itemize
-
-@noindent @strong{File Format}
-
-@noindent The @code{scatnames} extension file format respects the following
-grammar. It reuses the @code{Strings} description (@pxref{Strings Generic}):
-@example
-Scatnames_generic   ::= "<scatnames>" Scatnames "</scatnames>"
-Scatnames           ::= Strings
-@end example
-
-@noindent The list of scattering dimension names is provided on one single
-line. The names are separated with spaces. A possible
-example of such an extension is the following:
-
-@example
-@group
-<scatnames>
-# List of scattering dimension names:
-beta_0 i beta_1 j beta_2
-</scatnames>
-@end group
-@end example
-
-@noindent @strong{Data Structure}
-
-@noindent The @code{scatnames} extension data structure is the following:
-
-@example
-@group
-struct osl_scatnames @{
-  osl_strings_p names;  /* List of textual scattering dimension names. */
-@};
-typedef struct osl_scatnames   osl_scatnames_t;
-typedef struct osl_scatnames * osl_scatnames_p;
-@end group
-@end example
-
-@noindent The order of the scattering dimension names in the list corresponds
-to the order of the scattering dimensions.
-
-@c ---------------------------------------------------------------------------
-
-
-@node Arrays Extension
-@subsection Arrays Extension
-
-@noindent @strong{Description}
-@itemize @bullet
-@item URI: @code{arrays}.
-@item Author: C@'edric Bastoul <cedric.bastoul@@u-psud.fr>.
-@item Purpose: the @code{arrays} extension provides a set of textual array
-names corresponding to the array identifiers used in the access relations.
-@end itemize
-
-@noindent @strong{File Format}
-
-@noindent The @code{arrays} extension file format respects the following
-grammar:
-@example
-Arrays_generic      ::= "<arrays>" Arrays "</arrays>"
-Arrays              ::= Nb_items Item_list
-Item_List           ::= Item Item_list | (void)
-Item                ::= Identifier Name
-Nb_items            ::= _Integer
-Identifier          ::= _Integer
-Name                ::= _String
-@end example
-
-@noindent The number of array names is provided on the first line,
-then each following line contains a couple identifier-name.
-For instance, the following example is a correct textual @code{arrays}
-extension. It corresponds to the array names of the preliminary example
-(@pxref{Preliminary Example}):
-
-@example
-@group
-<arrays>
-# Number of array names:
-3
-1 C # Identifier 1 corresponds to array name "C" 
-3 B # Identifier 3 corresponds to array name "B" 
-2 A # Identifier 2 corresponds to array name "A" 
-</arrays>
-@end group
-@end example
-
-@noindent @strong{Data Structure}
-
-@noindent The @code{arrays} extension data structure is the following:
-
-@example
-@group
-struct osl_arrays @{
-  int nb_names;      /* Number of names */
-  int  *  id;        /* Array of nb_names identifiers */
-  char ** names;     /* Array of nb_names names */
-@};
-typedef struct osl_arrays   osl_arrays_t;
-typedef struct osl_arrays * osl_arrays_p;
-@end group
-@end example
-
-@noindent Each name has a name string and an identifier: the ith name has name
-string @code{names[i]} and identifier @code{id[i]}.
-
-
-@c ---------------------------------------------------------------------------
-
-@node Lines Extension
-@subsection Lines Extension
-
-@c ---------------------------------------------------------------------------
-
-@node Irregular Extension
-@subsection Irregular Extension
-
-
-@c ---------------------------------------------------------------------------
-
-@node History
-@section History
-
-OpenScop is a follow-up of Louis-No@"el Pouchet et al.'s ScopLib effort which
-was itself based on C@'edric Bastoul et al.'s Clan tool. People involved in
-OpenScop's genesis are:
-@itemize @bullet
-@item C@'edric Bastoul
-@item Uday Bondhugula
-@item Tobias Grosser
-@item Louis-No@"el Pouchet
-@item Sven Verdoolaege
-@end itemize
-
-@c %/*************************************************************************
-@c % *                          OpenScop LIBRARY                             *
-@c % *************************************************************************/
-
-@node OpenScop Library
-@chapter OpenScop Library
-
-The OpenScop Library, or OSL for short, is an example implementation of the
-OpenScop specification. Its API is not part of the OpenScop specification. 
-It offers basic functionalities to manipulate the OpenScop data structures
-(allocate, free, copy, dump, etc.) and file format (read, print, etc.).
-The OpenScop Library is @emph{not} a polyhedral library. OpenScop is an
-exchange format, and the OpenScop Library reflects this. 
-
-It is a Free Software using the 3-clause BSD License.
-Programmers should feel free to use
-it or copy/paste its code in any project, Open Source or not@footnote{Closed
-source projects should consider to provide some OpenScop file input
-and output, so they can be incorporated to any OpenScop-based tool chain.}.
-
-@menu
-* Precision::
-* Base Functions::
-* Example of OpenScop Library Utilization::
-* Installation::
-* Documentation::
-* Development::
-@end menu
-
-@node Precision
-@section Precision
-
-The OpenScop specification does not impose a specific type for the
-constraint matrix elements. For a maximum flexibility, the OpenScop Library
-offers an hybrid precision implementation. It supports 32 bits, 64 bits and
-multiple precision (relying on GNU GMP) relations transparently. At relation
-allocation time, users have two ways to set the precision. The first way is
-to call an allocation function with a precision parameter. The second way is
-to rely on the environment variable @code{OSL_PRECISION}.
-The accepted values for this variable are @code{32} for 32 bits precision,
-@code{64} for 64 bits precision and @code{0} for multiple precision. When this
-variable is set, its value becomes the default precision for relation elements.
-For instance, to ensure the OpenScop Library will use 64 bits precision
-by default, the user may set: 
-@example
-export OSL_PRECISION=64
-@end example
-@noindent if his shell is, e.g., bash or
-@example
-setenv OSL_PRECISION 64
-@end example
-@noindent if his shell is, e.g., tcsh. The user should ad this line to
-his .bashrc or .tcshrc (or whatever convenient file) to make this
-setting permanent. 
-
-@node Base Functions
-@section Base Functions
-
-The OpenScop Library provides, for each OpenScop data structure,
-a set of functions devoted to basic manipulation, conversion
-from file format to data structures and from data structures to
-file format. The naming convention is consistent for all data
-structures. Hence, the function prototypes differ only with the
-name of the data structure. In the following, we will use the
-generic term of @emph{structure} to refer at any OpenScop
-data structure. For instance the
-@code{osl_}@emph{structure}@code{_malloc()} function is a
-generic name can be instantiated to
-@code{osl_relation_malloc()} or
-@code{osl_statement_malloc()} etc.
-
-We present in this documentation only
-the main functions. Many other utility functions are provided
-to ease OpenScop format manipulation. The reader is invited to
-refer at the technical documentation to learn everything about the
-OpenScop Library.
-
-@menu
-* Dumping::
-* Printing::
-* Reading::
-* Allocating::
-* Deallocating::
-* Cloning::
-* Testing::
-@end menu
-
-
-@node Dumping
-@subsection Dumping: osl_@emph{structure}_dump and idump 
-
-@example
-@group
-void osl_@emph{structure}_dump(FILE * output, osl_@emph{structure}_p s);
-void osl_@emph{structure}_idump(FILE * output, osl_@emph{structure}_p s, int i);
-@end group
-@end example
-
-@noindent Each OpenScop data structure has a dumping functions
-as shown above. Dumping means writing down the content of the data
-structure pointed by @code{s} (and its fields recursively)
-in a textual form to the
-@code{output} file (the file, possibly @code{stdout}, has to be open
-for writing). The textual form is not the OpenScop file format but
-another representation closer to the internal representation in
-memory and mainly intended for debugging purpose. The @code{idump}
-function has an additional integer parameter which corresponds to
-an indentation level.
-
-@node Printing
-@subsection Printing: osl_@emph{structure}_print
-
-@example
-@group
-void osl_@emph{structure}_print(FILE * output, osl_@emph{structure}_p s);
-@end group
-@end example
-
-@noindent Each OpenScop data structure has a pretty printing function
-as shown above. It prints the content of the data
-structure pointed by @code{s} (and its fields recursively)
-according to the OpenScop file format
-(@pxref{OpenScop File Format Specification}) to the
-@code{output} file (the file, possibly @code{stdout}, has to be open
-for writing).
-
-@node Reading
-@subsection Reading: osl_@emph{structure}_read
-
-@example
-@group
-osl_@emph{structure}_p osl_@emph{structure}_read(FILE * input);
-@end group
-@end example
-
-@noindent Each OpenScop data structure has a reading function
-as shown above. It reads the content of an OpenScop
-data structure written according to the OpenScop file format 
-(@pxref{OpenScop File Format Specification}) from 
-the @code{input} file (the file, possibly @code{stdin}, has to be open
-for reading). It returns a pointer to a freshly allocated 
-@code{osl_@emph{structure}_t} structure containing the
-information.
-
-@node Allocating
-@subsection Allocating: osl_@emph{structure}_malloc
-
-@example
-@group
-osl_@emph{structure}_p osl_@emph{structure}_malloc();
-@end group
-@end example
-
-@noindent Each OpenScop data structure has a memory allocation function
-as shown above (except one see below). It allocates the memory to store
-the corresponding data structure, it initializes the pointer fields to
-@code{NULL} and the integer fields to @code{OSL_UNDEFINED}
-(@code{-1}) and it returns a pointer to the allocated space.
-
-An exception to this base description is the
-@code{osl_relation_malloc()} function which requires two
-parameters: the number of rows and columns of the constraint
-matrix (@pxref{Relations}):
-
-@example
-@group
-osl_relation_p osl_relation_malloc(int nb_rows, int nb_columns);
-@end group
-@end example
-
-@noindent The precision of the relation elements will depend on the
-@code{OSL_PRECISION} environment variable (@pxref{Precision}) if it is set,
-or the maximum available precision if it is not set. Another allocation
-function is provided to explicitly set a given precision:
-
-@example
-@group
-osl_relation_p osl_relation_pmalloc(int precision,
-                                    int nb_rows, int nb_columns);
-@end group
-@end example
-
-@noindent The @code{precision} field may take the following values:
-@itemize @bullet
-@item @code{OSL_PRECISION_SP} for 32 bits precision,
-@item @code{OSL_PRECISION_DP} for 64 bits precision,
-@item @code{OSL_PRECISION_MP} for multiple precision,
-@end itemize
-
-@node Deallocating
-@subsection Deallocating: osl_@emph{structure}_free
-
-@example
-@group
-void osl_@emph{structure}_free(osl_@emph{structure}_p s);
-@end group
-@end example
-
-@noindent Each OpenScop data structure has a memory deallocation function
-as shown above. It recursively frees the memory allocated for the
-structure pointed by @code{s}, i.e., internal structures are also freed.
-
-@node Cloning
-@subsection Cloning: osl_@emph{structure}_clone
-
-@example
-@group
-osl_@emph{structure}_p osl_@emph{structure}_clone(osl_@emph{structure}_p s);
-@end group
-@end example
-
-@noindent Each OpenScop data structure has a clone function
-as shown above. It recursively copies the content of the
-structure pointed by @code{s}, i.e., internal structures are also copied.
-It returns a pointer to the clone of the structure pointed by @code{s}.
-
-@node Testing
-@subsection Testing: osl_@emph{structure}_equal
-
-@example
-@group
-int osl_@emph{structure}_equal(osl_@emph{structure}_p s1, osl_@emph{structure}_p s2);
-@end group
-@end example
-
-@noindent Each OpenScop data structure has a testing function
-as shown above. It checks whether two pointers are referring to equivalent
-structures (either by pointing to the same structure or to different
-structures which contain the same information). It returns 1 if the
-pointed structures are equivalent, 0 otherwise. This test is
-@emph{content-based} and is intended for debugging purpose. It is not
-(and will never be) able to state, e.g., that two relations with
-different constraint matrices are actually representing the same relation.
-
-
-@node Example of OpenScop Library Utilization
-@section Example of OpenScop Library Utilization
-Here is a basic example showing how it is possible to use the
-OpenScop Library, assuming that a standard installation has been done.
-The following C program reads an OpenScop file from the standard
-input and dumps the content of the data structures to the standard output.
-
-@example
-/* example.c */
-# include <stdio.h>
-# include <osl/osl.h>
-
-int main() @{
-  osl_scop_p scop;
-
-  // Read the OpenScop file.
-  scop = osl_scop_read(stdin);
-
-  // Dump the content of the scop data structure.
-  osl_scop_dump(stdout, scop);
-
-  // Save the planet.
-  osl_scop_free(scop);
-
-  return 0;
-@}
-@end example
-
-@noindent The compilation command could be:
-@example
-gcc example.c -losl -o example
-@end example
-@noindent A calling command with the input file test.scop could be:
-@example
-more test.scop | ./example
-@end example
-
-
-@c %  ****************************** INSTALLING ********************************
-@node Installation
-@section Installation
-
-@menu
-* License::
-* Requirements::
-* Installation Instructions::
-* Optional Features::
-* Uninstallation::
-@end menu
-
-@node License
-@subsection License
-First of all, it would be very kind to refer the present document in any
-publication that results from the use of the OpenScop specification or library,
-@pxref{Bas11} (a bibtex entry is provided behind the title page of this
-manual, along with the copyright notice).
-The OpenScop Library is provided under the 3-clause BSD license:
-
-Copyright (C) 2011 University Paris-Sud 11 and INRIA
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-@enumerate
-@item Redistributions of source code must retain the above copyright notice,
-      this list of conditions and the following disclaimer.
-@item Redistributions in binary form must reproduce the above copyrigh
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-@item The name of the author may not be used to endorse or promote products
-      derived from this software without specific prior written permission
-@end enumerate
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-@node Requirements
-@subsection Requirements
-
-The OpenScop Library is a stand-alone library. For a basic use,
-it does not need any additional tool or library. Anyway, to be able to
-work in conjunction with other tools that manipulate multiple precision
-numbers, the GNU GMP library can be used as an option.
-
-@menu
-* GMP Library::
-@end menu
-
-
-@node GMP Library
-@subsubsection GMP Library (optional)
-
-To be able to deal with insanely large coefficient, the user will need to
-install the GNU Multiple Precision Library (GMP for short) version 4.2.2
-or above@footnote{@code{http://www.swox.com/gmp}}.
-The user can compile it by typing the following commands on the GMP root
-directory:
-
-@itemize @bullet
-@item @code{./configure}
-@item @code{make}
-@item And as root: @code{make install}
-@end itemize
-
-The GMP default installation is @code{/usr/local}. This directory may
-not be inside the user's library path. To fix the problem, the user should set
-@example
-export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
-@end example
-@noindent if your shell is, e.g., bash or
-@example
-setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH:/usr/local/lib
-@end example
-@noindent if your shell is, e.g., tcsh. Add the line to your .bashrc or .tcshrc (or
-whatever convenient file) to make this change permanent. Another solution
-is to ask GMP to install in the standard path by using the prefix
-option of the configure script:
-@samp{./configure --prefix=/usr}.
-
-The OpenScop Library has to be built using the GMP library by specifying
-the convenient configure script options to buid the GMP version
-(@pxref{Optional Features}).
-
-
-@node Installation Instructions
-@subsection Installation Instructions
-
-Once downloaded and unpacked
-(e.g. using the @samp{tar -zxvf openscop-@value{LIB_VERSION}.tar.gz} command),
-you can compile the OpenScop Library by typing the following commands
-on the OpenScop Library's root directory:
-
-@itemize @bullet
-@item @code{./autogen.sh}
-@item @code{./configure}
-@item @code{make}
-@item And as root: @code{make install}
-@end itemize
-
-The program binaries and object files can be removed from the
-source code directory by typing @code{make clean}. To also remove the
-files that the @code{configure} script created (so you can compile the
-package for a different kind of computer) type @code{make distclean}.
-
-@node Optional Features
-@subsection Optional Features
-The @code{configure} shell script attempts to guess correct values for
-various system-dependent variables and user options used during compilation.
-It uses those values to create the @code{Makefile}. Various user options
-are provided by the OpenScop Library's configure script. They are summarized in the
-following list and may be printed by typing @code{./configure --help} in the
-OpenScop Library top-level directory.
-
-@itemize @bullet
-@item By default, the installation directory is @code{/usr/local}:
-@code{make install} will install the package's files in
-@code{/usr/local/bin}, @code{/usr/local/lib} and @code{/usr/local/include}.
-The user can specify an installation prefix other than @code{/usr/local} by
-giving @code{configure} the option @code{--prefix=PATH}.
-
-@item By default, The OpenScop Library is built in 64bits version.
-If the user gives to @code{configure} the option
-@code{--enable-int-version}, the 32bits version of the OpenScop Library
-will be compiled. In the same way, the option @code{--enable-mp-version}
-has to be used to build the multiple precision version.
-
-@item By default, @code{configure} will look for the GMP library
-(necessary to build the multiple precision version) in standard
-locations. If necessary, the user can specify the GMP path by giving
-@code{configure} the option @code{--with-gmp=PATH}.
-@end itemize
-
-@node Uninstallation
-@subsection Uninstallation
-The user can easily remove the OpenScop Library from his system
-by typing (as root if necessary) from the OpenScop Library top-level
-directory
-@code{make uninstall}.
-
-@c %  **************************** DOCUMENTATION ******************************
-@node Documentation
-@section Documentation
-The OpenScop Library distribution provides several sources of documentation.
-First, the source code itself is as documented as much as possible.
-The code comments use the Doxygen technical documentation system.
-The user may install
-Doxygen@footnote{@code{http://www.stack.nl/~dimitri/doxygen}} to automatically
-generate a technical documentation by typing @code{make doc} or
-@code{doxygen ./autoconf/Doxyfile} at the OpenScop Library
-top-level directory after running the configure script
-(@pxref{Installation Instructions}). Doxygen will generate
-documentation sources (in HTML, LaTeX and man) in the @code{doc/source}
-directory of the OpenScop Library distribution.
-
-The Texinfo source of the present document is also provided in the @code{doc}
-directory. The user can build it in either PDF format
-(by typing @code{texi2pdf openscop.texi}) or HTML format
-(by typing @code{makeinfo --html openscop.texi}, using @code{--no-split}
-option to generate a single HTML file) or info format
-(by typing @code{makeinfo openscop.texi}).
-
-@c %  **************************** DEVELOPPING ********************************
-@node Development
-@section Development
-
-@menu
-* Copyright Issue::
-* Repository::
-* Coding Style::
-* Extension Development::
-@end menu
-
-@node Copyright Issue 
-@subsection Copyright Issue
-
-The OpenScop Library is an Open Source project and you should feel free to
-contribute by adding functionalities (in particular extensions), correcting
-bugs or improving documentation. However, for painful administrative reasons,
-the copyright of the core part (everything except extensions) should not be
-impacted by your work. Hence, if you are doing a significant contribution to
-the main part, the OpenScop Library maintainer may ask you for an agreement
-about this copyright. If you plan to do such a significant contribution, it
-may be wise to discuss this issue with the maintainer first. Extensions
-may include developer's own copyright.
-
-@node Repository 
-@subsection Repository
-
-The main repository of the OpenScop Library is
-@url{http://repo.or.cz/w/openscop.git}. Developers may ask the OpenScop Library
-maintainer to open them a write access to this repository. Only the maintainer
-should ever change the @code{master} branch. Developers should work on their
-own branches. To avoid any problem developers should use the @emph{fork}
-functionality of the repository.
-
-@node Coding Style 
-@subsection Coding Style  
-
-The OpenScop Library is written in C using an object oriented style. Each
-important data structure (e.g., @code{struct foo}) has its own header file
-(@code{include/osl/foo.h}) where lies the definition of
-the data structure, the two typedefs for the data structure (one for the
-structure, @code{osl_foo_t}, and one for a pointer
-to the structure, @code{osl_foo_p}), the prototypes of the various
-functions related to this data structure, all named using the
-prefix "@code{osl_foo_}". The source code of the functions is provided in a
-separated C file (@code{source/foo.c}).
-  
-Utility functions independent from the main data structures may be placed in
-separate source files (e.g., definition in @code{include/osl/util.h}
-and code in @code{source/util.c}). Tool-wide preprocessor directives are
-placed in @code{include/osl/macros.h}, macros are prefixed with
-"@code{OSL_}".
-
-The core code itself has to be written according to the Google C++ Coding Style:
-@url{http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml} (for
-what can apply to C), plus the naming conventions discussed above with
-highest priority. The extension parts must only respect the naming convention,
-but a consistent coding style is much appreciated.
-
-@node Extension Development
-@subsection Extension Development
-
-It's fairly easy to integrate a new extension to OpenScop and the OpenScop
-Library. Developing a new extension is very much like adding a new "object":
-it requires writing a data structure for the extension data and the 7 base
-functions to manage this extension. Here is how developers should proceed
-to add an extension called @code{foo} (beware that the naming convention is
-strict):
-
-@enumerate
-@item Send the name @code{foo} to the maintainer to ensure it is unique and
-      hence can be used as an URI. The name (one single
-      word, or words separated with underscores "_") should be
-      suggested by the extension developers to the OpenScop development
-      mailing list @email{openscop-development@@googlegroups.com}). It
-      should not correspond to an existing structure name
-      (see @code{include/osl/osl.h} for the list). The
-      maintainer will update @code{include/osl/osl.h} in the development
-      version accordingly.
-@item Look at the @code{comment} extension. The @code{comment} extension
-      (@pxref{Comment Extension}) has been written to be used as a basic
-      example for extension developers. Having a look at
-      @code{include/osl/extensions/comment.h} and
-      @code{source/extensions/comment.c} will be a great help to do it right.
-@item Create the extension data structure: it is necessary that the
-      extension data can be accessible through only one pointer.
-@item Code the 7 base functions for the extension. Any extension must provide
-      this set of functions (naming convention apply only if the
-      extension is planed to be integrated to the OpenScop Library
-      default extensions):
-      @itemize @bullet
-      @item @code{osl_foo_idump} (@pxref{Dumping}) 
-      @item @code{osl_foo_sprint} has the following prototype:
-@example
-@group
-char * osl_@emph{structure}_sprint(osl_@emph{structure}_p s);
-@end group
-@end example
-           It corresponds to the pretty printing functions of the core
-           data structures (@pxref{Printing}) with the
-           difference that the OpenScop textual representation is written
-           to a string (returned by the function) instead of a file.
-      @item @code{osl_foo_sread} has the following prototype:
-@example
-@group
-osl_@emph{structure}_p osl_@emph{structure}_sread(char ** string);
-@end group
-@end example
-           It corresponds to the reading functions of the core
-           data structures (@pxref{Reading}) with the
-           difference that the OpenScop textual representation is read
-           from a string (provided as a parameter) instead of a file.
-           The address of the string to read is passed as a parameter and
-           is updated to point immediately after what has been actually read.
-      @item @code{osl_foo_malloc} (@pxref{Allocating}) 
-      @item @code{osl_foo_free} (@pxref{Deallocating}) 
-      @item @code{osl_foo_clone} (@pxref{Cloning}) 
-      @item @code{osl_foo_equal} (@pxref{Testing}) 
-      @end itemize
-@item Code the other functions you need!
-@end enumerate
-
-Now let us consider two scenarios.
-
-First scenario, the extension is external and is
-not planned to be integrated to the OpenScop Library. In this case you are
-all set. Simply generate an @code{osl_interface_t} for your
-extension and have a look at the function
-@code{osl_scop_register_extension()} which is devoted to register
-a new extension interface to an existing @code{osl_scop_t}.
-
-Second scenario, the extension will integrate the set of default
-OpenScop Library extensions (the best solution to share it to other
-potential users). In this case, a few additional
-things have to be done:
-@enumerate
-@item Create the extension header
-      @code{include/osl/extensions/foo.h} to store the extension
-      structure and function prototypes and the
-      extension source file @code{source/extensions/foo.c} for the code
-      of the functions.
-@item Add the documentation for the extension to the texinfo source of
-      this document (in @code{doc/openscop.texi}), following the example
-      of the @code{comment} documentation (@pxref{Comment Extension}).
-@item Integrate the extension by adding the @code{extensions/foo.c} entry
-      to the @code{libosl_la_SOURCES} in the @code{source/Makefile.am}
-      file, the @code{osl/foo.h} entry to the
-      @code{nobase_pkginclude_HEADERS} and add the corresponding
-      @code{#include <osl/extensions/foo.h>} in the
-      @code{include/scop.h.in} file.
-@item Add the new extension in the
-      @code{osl_interface_get_default_registry()} function.
-@item You are done! Prepare a single commit or patch corresponding to the
-      integration of the new extension and ask the maintainer to merge it
-      to the master branch.
-@end enumerate
-
-
-@c %  ****************************** REFERENCES ********************************
-@node References
-@chapter References
-
-@itemize
-@item
-@anchor{Bas03a}[Bas03a] C. Bastoul, P. Feautrier. Improving data locality
-by chunking. CC'12 International Conference on Compiler Construction,
-LNCS 2622, pages 320-335, Warsaw, April 2003.
-
-@item
-@anchor{Bas11}[Bas11] C. Bastoul.
-OpenScop: A Specification and a Library for Data Exchange in Polyhedral
-Compilation Tools. Technical Report, Paris-Sud University, France, June 2011.
-
-@item
-@anchor{Fea92}[Fea92] P. Feautrier. Some efficient solutions to the affine
-scheduling problem, part II: multidimensional time.
-International Journal of Parallel Programming, 21(6):389--420, December 1992.
-
-@item
-@anchor{Gri04}[Gri04] M. Griebl. Automatic parallelization of loop programs
-for distributed memory architectures. Habilitation Thesis. Facult@"at f@"ur
-Mathematik und Informatik, Universit@"at Passau, 2004.
-@emph{http://www.infosun.fmi.uni-passau.de/cl/loopo/}
-
-@item
-@anchor{Wil93}[Wil93] Doran K. Wilde.
-A library for doing polyhedral operations.
-Technical Report 785, IRISA, Rennes, France, 1993.
-
-@end itemize
-
-
-
-
-@c % /*************************************************************************
-@c %  *                       PART VI: END OF THE DOCUMENT                    *
-@c %  *************************************************************************/
-@c @unnumbered Index
-
-@c @printindex cp
-
-@bye
diff --git a/cloog-0.17.0/osl/include/Makefile.am b/cloog-0.17.0/osl/include/Makefile.am
deleted file mode 100644
index 52305c8..0000000
--- a/cloog-0.17.0/osl/include/Makefile.am
+++ /dev/null
@@ -1,102 +0,0 @@
-#
-#   /*+------------------------------------------------------------------**
-#    **                       OpenScop Library                           **
-#    **------------------------------------------------------------------**
-#    **                         makefile.am                              **
-#    **------------------------------------------------------------------**
-#    **                   First version: 30/04/2008                      **
-#    **------------------------------------------------------------------**
-#
-#   
-# ***************************************************************************
-# * OpenScop: Structures and formats for polyhedral tools to talk together  *
-# ***************************************************************************
-# *   ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,               *
-# *   /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,            *
-# *  /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\            *
-# * |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \           *
-# * | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\          *
-# * | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\         *
-# * | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \        *
-# * | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \       *
-# * | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \      *
-# * | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \     *
-# * | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \    *
-# * | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \   *
-# * | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \  *
-# * | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /  *
-# * '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'   *
-# *                                                                         *
-# * Copyright (C) 2008 University Paris-Sud 11 and INRIA                    *
-# *                                                                         *
-# * (3-clause BSD license)                                                  *
-# * Redistribution and use in source  and binary forms, with or without     *
-# * modification, are permitted provided that the following conditions      *
-# * are met:                                                                *
-# *                                                                         *
-# * 1. Redistributions of source code must retain the above copyright       *
-# *    notice, this list of conditions and the following disclaimer.        *
-# * 2. Redistributions in binary form must reproduce the above copyright    *
-# *    notice, this list of conditions and the following disclaimer in the  *
-# *    documentation and/or other materials provided with the distribution. *
-# * 3. The name of the author may not be used to endorse or promote         *
-# *    products derived from this software without specific prior written   *
-# *    permission.                                                          *
-# *                                                                         *
-# * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR    *
-# * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED          *
-# * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  *
-# * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,      *
-# * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES      *
-# * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR      *
-# * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)      *
-# * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,     *
-# * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING   *
-# * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE      *
-# * POSSIBILITY OF SUCH DAMAGE.                                             *
-# *                                                                         *
-# * OpenScop Library, a library to manipulate OpenScop formats and data     *
-# * structures. Written by:                                                 *
-# * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                       *
-# * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                        *
-# *                                                                         *
-# ***************************************************************************/
-#
-# Makefile.am (or makefile if generated) of the OpenScop Library.
-# Makefile.am is not a makefile, you must run the 'autogen.sh' THEN the
-# configure shellscript to generate the Makefile thanks to this file.
-
-
-#############################################################################
-SUBDIRS			=
-
-#############################################################################
-MAINTAINERCLEANFILES	= Makefile.in
-
-#############################################################################
-
-pkginclude_HEADERS 	=             \
-	osl/osl.h                     \
-	osl/statement.h               \
-	osl/interface.h               \
-	osl/generic.h                 \
-	osl/vector.h                  \
-	osl/relation.h                \
-	osl/relation_list.h           \
-	osl/macros.h                  \
-	osl/int.h                     \
-	osl/names.h                   \
-	osl/strings.h                 \
-	osl/body.h                    \
-	osl/util.h                    \
-	osl/scop.h
-
-pkgextensionsincludedir = $(pkgincludedir)/extensions
-pkgextensionsinclude_HEADERS =        \
-	osl/extensions/textual.h      \
-	osl/extensions/comment.h      \
-	osl/extensions/scatnames.h    \
-	osl/extensions/arrays.h       \
-	osl/extensions/lines.h        \
-	osl/extensions/irregular.h
-
diff --git a/cloog-0.17.0/osl/include/Makefile.in b/cloog-0.17.0/osl/include/Makefile.in
deleted file mode 100644
index 76284f9..0000000
--- a/cloog-0.17.0/osl/include/Makefile.in
+++ /dev/null
@@ -1,731 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-#
-#   /*+------------------------------------------------------------------**
-#    **                       OpenScop Library                           **
-#    **------------------------------------------------------------------**
-#    **                         makefile.am                              **
-#    **------------------------------------------------------------------**
-#    **                   First version: 30/04/2008                      **
-#    **------------------------------------------------------------------**
-#
-#   
-# ***************************************************************************
-# * OpenScop: Structures and formats for polyhedral tools to talk together  *
-# ***************************************************************************
-# *   ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,               *
-# *   /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,            *
-# *  /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\            *
-# * |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \           *
-# * | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\          *
-# * | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\         *
-# * | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \        *
-# * | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \       *
-# * | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \      *
-# * | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \     *
-# * | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \    *
-# * | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \   *
-# * | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \  *
-# * | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /  *
-# * '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'   *
-# *                                                                         *
-# * Copyright (C) 2008 University Paris-Sud 11 and INRIA                    *
-# *                                                                         *
-# * (3-clause BSD license)                                                  *
-# * Redistribution and use in source  and binary forms, with or without     *
-# * modification, are permitted provided that the following conditions      *
-# * are met:                                                                *
-# *                                                                         *
-# * 1. Redistributions of source code must retain the above copyright       *
-# *    notice, this list of conditions and the following disclaimer.        *
-# * 2. Redistributions in binary form must reproduce the above copyright    *
-# *    notice, this list of conditions and the following disclaimer in the  *
-# *    documentation and/or other materials provided with the distribution. *
-# * 3. The name of the author may not be used to endorse or promote         *
-# *    products derived from this software without specific prior written   *
-# *    permission.                                                          *
-# *                                                                         *
-# * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR    *
-# * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED          *
-# * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  *
-# * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,      *
-# * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES      *
-# * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR      *
-# * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)      *
-# * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,     *
-# * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING   *
-# * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE      *
-# * POSSIBILITY OF SUCH DAMAGE.                                             *
-# *                                                                         *
-# * OpenScop Library, a library to manipulate OpenScop formats and data     *
-# * structures. Written by:                                                 *
-# * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                       *
-# * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                        *
-# *                                                                         *
-# ***************************************************************************/
-#
-# Makefile.am (or makefile if generated) of the OpenScop Library.
-# Makefile.am is not a makefile, you must run the 'autogen.sh' THEN the
-# configure shellscript to generate the Makefile thanks to this file.
-
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = include
-DIST_COMMON = $(pkgextensionsinclude_HEADERS) $(pkginclude_HEADERS) \
-	$(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/autoconf/libtool.m4 \
-	$(top_srcdir)/autoconf/ltoptions.m4 \
-	$(top_srcdir)/autoconf/ltsugar.m4 \
-	$(top_srcdir)/autoconf/ltversion.m4 \
-	$(top_srcdir)/autoconf/lt~obsolete.m4 \
-	$(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-SOURCES =
-DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-dvi-recursive install-exec-recursive \
-	install-html-recursive install-info-recursive \
-	install-pdf-recursive install-ps-recursive install-recursive \
-	installcheck-recursive installdirs-recursive pdf-recursive \
-	ps-recursive uninstall-recursive
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__installdirs = "$(DESTDIR)$(pkgextensionsincludedir)" \
-	"$(DESTDIR)$(pkgincludedir)"
-HEADERS = $(pkgextensionsinclude_HEADERS) $(pkginclude_HEADERS)
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
-  distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
-	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
-	distdir
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CD = @CD@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DOXYGEN = @DOXYGEN@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_aux_dir = @ac_aux_dir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-
-#############################################################################
-SUBDIRS = 
-
-#############################################################################
-MAINTAINERCLEANFILES = Makefile.in
-
-#############################################################################
-pkginclude_HEADERS = \
-	osl/osl.h                     \
-	osl/statement.h               \
-	osl/interface.h               \
-	osl/generic.h                 \
-	osl/vector.h                  \
-	osl/relation.h                \
-	osl/relation_list.h           \
-	osl/macros.h                  \
-	osl/int.h                     \
-	osl/names.h                   \
-	osl/strings.h                 \
-	osl/body.h                    \
-	osl/util.h                    \
-	osl/scop.h
-
-pkgextensionsincludedir = $(pkgincludedir)/extensions
-pkgextensionsinclude_HEADERS = \
-	osl/extensions/textual.h      \
-	osl/extensions/comment.h      \
-	osl/extensions/scatnames.h    \
-	osl/extensions/arrays.h       \
-	osl/extensions/lines.h        \
-	osl/extensions/irregular.h
-
-all: all-recursive
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign include/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-pkgextensionsincludeHEADERS: $(pkgextensionsinclude_HEADERS)
-	@$(NORMAL_INSTALL)
-	test -z "$(pkgextensionsincludedir)" || $(MKDIR_P) "$(DESTDIR)$(pkgextensionsincludedir)"
-	@list='$(pkgextensionsinclude_HEADERS)'; test -n "$(pkgextensionsincludedir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgextensionsincludedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgextensionsincludedir)" || exit $$?; \
-	done
-
-uninstall-pkgextensionsincludeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgextensionsinclude_HEADERS)'; test -n "$(pkgextensionsincludedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(pkgextensionsincludedir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(pkgextensionsincludedir)" && rm -f $$files
-install-pkgincludeHEADERS: $(pkginclude_HEADERS)
-	@$(NORMAL_INSTALL)
-	test -z "$(pkgincludedir)" || $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)"
-	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
-	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
-	done
-
-uninstall-pkgincludeHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$files" || exit 0; \
-	echo " ( cd '$(DESTDIR)$(pkgincludedir)' && rm -f" $$files ")"; \
-	cd "$(DESTDIR)$(pkgincludedir)" && rm -f $$files
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test -d "$(distdir)/$$subdir" \
-	    || $(MKDIR_P) "$(distdir)/$$subdir" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-	    $(am__relativize); \
-	    new_distdir=$$reldir; \
-	    dir1=$$subdir; dir2="$(top_distdir)"; \
-	    $(am__relativize); \
-	    new_top_distdir=$$reldir; \
-	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-	    ($(am__cd) $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$new_top_distdir" \
-	        distdir="$$new_distdir" \
-		am__remove_distdir=: \
-		am__skip_length_check=: \
-		am__skip_mode_fix=: \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(HEADERS)
-installdirs: installdirs-recursive
-installdirs-am:
-	for dir in "$(DESTDIR)$(pkgextensionsincludedir)" "$(DESTDIR)$(pkgincludedir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am: install-pkgextensionsincludeHEADERS \
-	install-pkgincludeHEADERS
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-pkgextensionsincludeHEADERS \
-	uninstall-pkgincludeHEADERS
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
-	install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-	all all-am check check-am clean clean-generic clean-libtool \
-	ctags ctags-recursive distclean distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-pkgextensionsincludeHEADERS install-pkgincludeHEADERS \
-	install-ps install-ps-am install-strip installcheck \
-	installcheck-am installdirs installdirs-am maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
-	uninstall uninstall-am uninstall-pkgextensionsincludeHEADERS \
-	uninstall-pkgincludeHEADERS
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/cloog-0.17.0/osl/include/osl/body.h b/cloog-0.17.0/osl/include/osl/body.h
deleted file mode 100644
index b4e905f..0000000
--- a/cloog-0.17.0/osl/include/osl/body.h
+++ /dev/null
@@ -1,125 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                            body.h                               **
-     **-----------------------------------------------------------------**
-     **                   First version: 25/06/2011                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#ifndef OSL_BODY_H
-# define OSL_BODY_H
-
-# include <stdio.h>
-# include <osl/strings.h>
-# include <osl/interface.h>
-
-# if defined(__cplusplus)
-extern "C"
-  {
-# endif
-
-# define OSL_URI_BODY "body"
-
-/**
- * The osl_body_t structure stores a statement body in a textual form.
- * The complete original expression (directly copy-pasted from the original
- * code) is in the expression field while the textual forms of the original
- * iterators are in the iterators field. They may be used for substitutions
- * inside the expression.
- */
-struct osl_body {
-  osl_strings_p iterators;  /**< Original iterators */
-  osl_strings_p expression; /**< Original statement expression */
-};
-typedef struct osl_body   osl_body_t;
-typedef struct osl_body * osl_body_p;
-
-
-/*---------------------------------------------------------------------------+
- |                          Structure display function                       |
- +---------------------------------------------------------------------------*/
-void            osl_body_idump(FILE *, osl_body_p, int);
-void            osl_body_dump(FILE *, osl_body_p);
-char *          osl_body_sprint(osl_body_p);
-void            osl_body_print(FILE *, osl_body_p);
-
-
-/*****************************************************************************
- *                              Reading function                             *
- *****************************************************************************/
-osl_body_p      osl_body_sread(char **);
-
-
-/*+***************************************************************************
- *                   Memory allocation/deallocation function                 *
- *****************************************************************************/
-osl_body_p      osl_body_malloc();
-void            osl_body_free(osl_body_p);
-
-
-/*+***************************************************************************
- *                           Processing functions                            *
- *****************************************************************************/
-osl_body_p      osl_body_clone(osl_body_p);
-int             osl_body_equal(osl_body_p, osl_body_p);
-osl_interface_p osl_body_interface();
-
-# if defined(__cplusplus)
-  }
-# endif
-#endif /* define OSL_BODY_H */
diff --git a/cloog-0.17.0/osl/include/osl/extensions/arrays.h b/cloog-0.17.0/osl/include/osl/extensions/arrays.h
deleted file mode 100644
index f1c1cfd..0000000
--- a/cloog-0.17.0/osl/include/osl/extensions/arrays.h
+++ /dev/null
@@ -1,129 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                      extensions/arrays.h                        **
-     **-----------------------------------------------------------------**
-     **                   First version: 07/12/2010                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#ifndef OSL_ARRAYS_H
-# define OSL_ARRAYS_H
-
-# include <stdio.h>
-# include <osl/interface.h>
-
-# if defined(__cplusplus)
-extern "C"
-  {
-# endif
-
-
-# define OSL_URI_ARRAYS        "arrays"
-# define OSL_TAG_ARRAYS_START  "<"OSL_URI_ARRAYS">"
-# define OSL_TAG_ARRAYS_STOP   "</"OSL_URI_ARRAYS">"
-
-
-/**
- * The osl_arrays_t structure stores a set of array names in
- * the extension part of the OpenScop representation. Each name
- * has a name string and an identifier: the ith name as name
- * string names[i] and identifier id[i].
- */
-struct osl_arrays {
-  int nb_names;      /**< Number of names. */
-  int  *  id;        /**< Array of nb_names identifiers. */
-  char ** names;     /**< Array of nb_names names. */
-};
-typedef struct osl_arrays   osl_arrays_t;
-typedef struct osl_arrays * osl_arrays_p;
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-void            osl_arrays_idump(FILE *, osl_arrays_p, int);
-void            osl_arrays_dump(FILE *, osl_arrays_p);
-char *          osl_arrays_sprint(osl_arrays_p);
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-osl_arrays_p    osl_arrays_sread(char **);
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-osl_arrays_p    osl_arrays_malloc();
-void            osl_arrays_free(osl_arrays_p);
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-osl_arrays_p    osl_arrays_clone(osl_arrays_p);
-int             osl_arrays_equal(osl_arrays_p, osl_arrays_p);
-char **         osl_arrays_generate_names(osl_arrays_p, int *);
-osl_interface_p osl_arrays_interface();
-
-# if defined(__cplusplus)
-  }
-# endif
-
-#endif /* define OSL_ARRAYS_H */
diff --git a/cloog-0.17.0/osl/include/osl/extensions/comment.h b/cloog-0.17.0/osl/include/osl/extensions/comment.h
deleted file mode 100644
index 1b9edee..0000000
--- a/cloog-0.17.0/osl/include/osl/extensions/comment.h
+++ /dev/null
@@ -1,123 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                     extensions/comment.h                        **
-     **-----------------------------------------------------------------**
-     **                   First version: 07/12/2010                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#ifndef OSL_COMMENT_H
-# define OSL_COMMENT_H
-
-# include <stdio.h>
-# include <osl/interface.h>
-
-# if defined(__cplusplus)
-extern "C"
-  {
-# endif
-
-
-# define OSL_URI_COMMENT        "comment"
-
-
-/**
- * The osl_comment_t structure stores a comment extention to the core
- * OpenScop representation. It is simply a 0-terminated string.
- */
-struct osl_comment {
-  char * comment;  /**< A comment message as a 0-terminated string. */
-};
-typedef struct osl_comment   osl_comment_t;
-typedef struct osl_comment * osl_comment_p;
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-void            osl_comment_idump(FILE *, osl_comment_p, int);
-void            osl_comment_dump(FILE *, osl_comment_p);
-char *          osl_comment_sprint(osl_comment_p);
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-osl_comment_p   osl_comment_sread(char **);
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-osl_comment_p   osl_comment_malloc();
-void            osl_comment_free(osl_comment_p);
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-osl_comment_p   osl_comment_clone(osl_comment_p);
-int             osl_comment_equal(osl_comment_p, osl_comment_p);
-osl_interface_p osl_comment_interface();
-
-
-# if defined(__cplusplus)
-  }
-# endif
-
-#endif /* define OSL_COMMENT_H */
diff --git a/cloog-0.17.0/osl/include/osl/extensions/irregular.h b/cloog-0.17.0/osl/include/osl/extensions/irregular.h
deleted file mode 100644
index 74b1206..0000000
--- a/cloog-0.17.0/osl/include/osl/extensions/irregular.h
+++ /dev/null
@@ -1,149 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                     extensions/irregular.h                        **
-     **-----------------------------------------------------------------**
-     **                   First version: 07/12/2010                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#ifndef OSL_IRREGULAR_H
-# define OSL_IRREGULAR_H
-
-# include <stdio.h>
-# include <osl/macros.h>
-# include <osl/strings.h>
-# include <osl/interface.h>
-
-# if defined(__cplusplus)
-extern "C"
-  {
-# endif
-
-
-# define OSL_URI_IRREGULAR        "irregular"
-# define OSL_TAG_IRREGULAR_START  "<"OSL_URI_IRREGULAR">"
-# define OSL_TAG_IRREGULAR_STOP   "</"OSL_URI_IRREGULAR">"
-
-
-/**
- * The osl_irregular_t structure stores an irregular extension to the core
- * OpenScop representation. It contains a list of predicates (in their textual
- * representation), and for each statement, its list of associated predicates.
- * The list of predicates contains both control and exit predicates (see
- * Benabderrhamane et al.'s paper at CC'2010), control predicates are listed
- * first, then come exit predicates.
- */
-struct osl_irregular {
-  // List of predicates (textual representation).
-  int nb_control;      /**< Number of control predicates in the SCoP. */
-  int nb_exit;         /**< Number of exit predicates in the SCoP. */
-  int * nb_iterators;  /**< nb_iterators[i]: #iterators for ith predicate. */
-  char *** iterators;  /**< iterators[i]: array of (nb_control + nb_exit)
-                            arrays of nb_iterators[i] strings. Each element
-                            corresponds to the list of original iterators
-                            for the ith predicate. */
-  char ** body;        /**< body[i]: original source code of ith predicate. */
-  
-  // List of associated predicates for each statement.
-  int nb_statements;   /**< Number of statements in the SCoP. */
-  int * nb_predicates; /**< nb_predicates[i]: #predicates for ith statement. */
-  int ** predicates;   /**< predicates[i]: array of nb_predicates[i] predicates
-                            corresponding to the list of predicates associated
-                            to the ith statement. */
-};
-typedef struct osl_irregular   osl_irregular_t;
-typedef struct osl_irregular * osl_irregular_p;
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-void            osl_irregular_idump(FILE *, osl_irregular_p, int);
-void            osl_irregular_dump(FILE *, osl_irregular_p);
-char *          osl_irregular_sprint(osl_irregular_p);
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-osl_irregular_p osl_irregular_sread(char **);
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-osl_irregular_p osl_irregular_malloc();
-void            osl_irregular_free(osl_irregular_p);
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-osl_irregular_p osl_irregular_clone(osl_irregular_p);
-int             osl_irregular_equal(osl_irregular_p, osl_irregular_p);
-osl_irregular_p osl_irregular_add_control(osl_irregular_p, char**, int, char*);
-osl_irregular_p osl_irregular_add_exit(osl_irregular_p, char**, int, char*);
-osl_irregular_p osl_irregular_add_predicates(osl_irregular_p, int*, int);
-osl_interface_p osl_irregular_interface();
-
-
-# if defined(__cplusplus)
-  }
-# endif
-
-#endif /* define OSL_IRREGULAR_H */
diff --git a/cloog-0.17.0/osl/include/osl/extensions/lines.h b/cloog-0.17.0/osl/include/osl/extensions/lines.h
deleted file mode 100644
index 9695e51..0000000
--- a/cloog-0.17.0/osl/include/osl/extensions/lines.h
+++ /dev/null
@@ -1,127 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                     extensions/lines.h                        **
-     **-----------------------------------------------------------------**
-     **                   First version: 07/12/2010                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#ifndef OSL_LINES_H
-# define OSL_LINES_H
-
-# include <stdio.h>
-# include <osl/interface.h>
-
-# if defined(__cplusplus)
-extern "C"
-  {
-# endif
-
-
-# define OSL_URI_LINES        "lines"
-# define OSL_TAG_LINES_START  "<"OSL_URI_LINES">"
-# define OSL_TAG_LINES_STOP   "</"OSL_URI_LINES">"
-
-
-/**
- * The osl_lines_t structure stores a lines extention to the core
- * OpenScop representation. It provides information about the line
- * numbers of the SCoP in the original source file.
- */
-struct osl_lines {
-  int start; /**< First line of the SCoP in the original source file. */
-  int end;   /**< Last line of the SCoP in the original source file. */
-};
-typedef struct osl_lines   osl_lines_t;
-typedef struct osl_lines * osl_lines_p;
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-void            osl_lines_idump(FILE *, osl_lines_p, int);
-void            osl_lines_dump(FILE *, osl_lines_p);
-char *          osl_lines_sprint(osl_lines_p);
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-osl_lines_p     osl_lines_sread(char **);
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-osl_lines_p     osl_lines_malloc();
-void            osl_lines_free(osl_lines_p);
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-osl_lines_p     osl_lines_clone(osl_lines_p);
-int             osl_lines_equal(osl_lines_p, osl_lines_p);
-osl_interface_p osl_lines_interface();
-
-
-# if defined(__cplusplus)
-  }
-# endif
-
-#endif /* define OSL_LINES_H */
diff --git a/cloog-0.17.0/osl/include/osl/extensions/scatnames.h b/cloog-0.17.0/osl/include/osl/extensions/scatnames.h
deleted file mode 100644
index 77ad402..0000000
--- a/cloog-0.17.0/osl/include/osl/extensions/scatnames.h
+++ /dev/null
@@ -1,127 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                    extensions/scatnames.h                       **
-     **-----------------------------------------------------------------**
-     **                   First version: 03/12/2011                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#ifndef OSL_SCATNAMES_H
-# define OSL_SCATNAMES_H
-
-# include <stdio.h>
-# include <osl/interface.h>
-# include <osl/strings.h>
-
-# if defined(__cplusplus)
-extern "C"
-  {
-# endif
-
-
-# define OSL_URI_SCATNAMES        "scatnames"
-
-
-/**
- * The osl_scatnames_t structure stores a scatnames extention to the core
- * OpenScop representation. It is devoted to store the scattering dimension
- * names in a textual form. The names are stored using an osl_strings_t
- * structure and their order in the array corresponds to their dimension
- * order.
- */
-struct osl_scatnames {
-  osl_strings_p names;  /**< List of textual scattering dimension names. */
-};
-typedef struct osl_scatnames   osl_scatnames_t;
-typedef struct osl_scatnames * osl_scatnames_p;
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-void            osl_scatnames_idump(FILE *, osl_scatnames_p, int);
-void            osl_scatnames_dump(FILE *, osl_scatnames_p);
-char *          osl_scatnames_sprint(osl_scatnames_p);
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-osl_scatnames_p osl_scatnames_sread(char **);
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-osl_scatnames_p osl_scatnames_malloc();
-void            osl_scatnames_free(osl_scatnames_p);
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-osl_scatnames_p osl_scatnames_clone(osl_scatnames_p);
-int             osl_scatnames_equal(osl_scatnames_p, osl_scatnames_p);
-osl_interface_p osl_scatnames_interface();
-
-
-# if defined(__cplusplus)
-  }
-# endif
-
-#endif /* define OSL_SCATNAMES_H */
diff --git a/cloog-0.17.0/osl/include/osl/extensions/textual.h b/cloog-0.17.0/osl/include/osl/extensions/textual.h
deleted file mode 100644
index 91ee790..0000000
--- a/cloog-0.17.0/osl/include/osl/extensions/textual.h
+++ /dev/null
@@ -1,123 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                     extensions/textual.h                        **
-     **-----------------------------------------------------------------**
-     **                   First version: 15/07/2011                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#ifndef OSL_TEXTUAL_H
-# define OSL_TEXTUAL_H
-
-# include <stdio.h>
-# include <osl/interface.h>
-
-# if defined(__cplusplus)
-extern "C"
-  {
-# endif
-
-
-# define OSL_URI_TEXTUAL       "textual"
-
-
-/**
- * The osl_textual_t structure stores the complete textual
- * representation of the scop extension field. It is a special case of
- * extension since it does not require start and end tag.
- */
-struct osl_textual {
-  char * textual; /**< Full extension string as a 0-terminated string. */
-};
-typedef struct osl_textual   osl_textual_t;
-typedef struct osl_textual * osl_textual_p;
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-void            osl_textual_idump(FILE *, osl_textual_p, int);
-void            osl_textual_dump(FILE *, osl_textual_p);
-char *          osl_textual_sprint(osl_textual_p);
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-osl_textual_p   osl_textual_sread(char **);
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-osl_textual_p   osl_textual_malloc();
-void            osl_textual_free(osl_textual_p);
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-osl_textual_p   osl_textual_clone(osl_textual_p);
-int             osl_textual_equal(osl_textual_p, osl_textual_p);
-osl_interface_p osl_textual_interface();
-
-# if defined(__cplusplus)
-  }
-# endif
-
-#endif /* define OSL_TEXTUAL_H */
diff --git a/cloog-0.17.0/osl/include/osl/generic.h b/cloog-0.17.0/osl/include/osl/generic.h
deleted file mode 100644
index 6061478..0000000
--- a/cloog-0.17.0/osl/include/osl/generic.h
+++ /dev/null
@@ -1,127 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                           generic.h                             **
-     **-----------------------------------------------------------------**
-     **                   First version: 26/11/2010                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#ifndef OSL_generic_H
-# define OSL_generic_H
-
-# include <osl/interface.h>
-
-# if defined(__cplusplus)
-extern "C"
-  {
-# endif
-
-
-/**
- * The osl_generic_t structure stores OpenScop data and operations with
- * no pre-defined type. The information is accessible through the data pointer
- * while the type and operations are accessible through the interface pointer.
- * A generic is a also a node of a NULL-terminated linked list of generics.
- */
-struct osl_generic {
-  void * data;               /**< Pointer to the data. */
-  osl_interface_p interface; /**< Interface to work with the data. */
-  struct osl_generic * next; /**< Pointer to the next generic. */
-};
-typedef struct osl_generic   osl_generic_t;
-typedef struct osl_generic * osl_generic_p;
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-void          osl_generic_idump(FILE *, osl_generic_p, int);
-void          osl_generic_dump(FILE *, osl_generic_p);
-void          osl_generic_print(FILE *, osl_generic_p);
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-osl_generic_p osl_generic_sread(char *, osl_interface_p);
-osl_generic_p osl_generic_read_one(FILE *, osl_interface_p);
-osl_generic_p osl_generic_read(FILE *, osl_interface_p);
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-void          osl_generic_add(osl_generic_p*, osl_generic_p);
-osl_generic_p osl_generic_malloc();
-void          osl_generic_free(osl_generic_p);
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-osl_generic_p osl_generic_clone(osl_generic_p);
-int           osl_generic_equal(osl_generic_p, osl_generic_p);
-int           osl_generic_has_URI(osl_generic_p, char *);
-void *        osl_generic_lookup(osl_generic_p, char *);
-
-
-# if defined(__cplusplus)
-  }
-# endif
-
-#endif /* define OSL_generic_H */
diff --git a/cloog-0.17.0/osl/include/osl/int.h b/cloog-0.17.0/osl/include/osl/int.h
deleted file mode 100644
index 61bb709..0000000
--- a/cloog-0.17.0/osl/include/osl/int.h
+++ /dev/null
@@ -1,124 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                             int.h                               **
-     **-----------------------------------------------------------------**
-     **                   First version: 18/07/2011                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#ifndef OSL_INT_H
-# define OSL_INT_H
-
-#include <stdio.h>
-
-typedef void * osl_int_p;
-
-
-/*+***************************************************************************
- *                                Basic Functions                            *
- *****************************************************************************/
-
-
-void   osl_int_dump_precision(FILE *, int);
-int    osl_int_sizeof(int);
-void * osl_int_address(int, void *, int);
-void   osl_int_init(int, void *, int);
-void * osl_int_malloc(int);
-void   osl_int_assign(int, void *, int, void *, int);
-void   osl_int_set_si(int, void *, int, int);
-int    osl_int_get_si(int, void *, int);
-void   osl_int_init_set_si(int, void *, int, int);
-void   osl_int_clear(int, void *, int);
-void   osl_int_free(int, void *, int);
-void   osl_int_print(FILE *, int, void *, int);
-void   osl_int_sprint(char *, int, void *, int);
-void   osl_int_sprint_txt(char *, int, void *, int);
-void   osl_int_sread(char **, int, void *, int);
-
-
-/*+***************************************************************************
- *                            Arithmetic Operations                          *
- *****************************************************************************/
-
-
-void   osl_int_increment(int, void *, int, void *, int);
-void   osl_int_decrement(int, void *, int, void *, int);
-void   osl_int_add(int, void *, int, void *, int, void *, int);
-void   osl_int_add_si(int, void *, int, void *, int, int);
-void   osl_int_mul(int, void *, int, void *, int, void *, int);
-void   osl_int_mul_si(int, void *, int, void *, int, int);
-void   osl_int_sub(int, void *, int, void *, int, void *, int);
-void   osl_int_oppose(int, void *, int, void *, int);
-
-
-/*+***************************************************************************
- *                            Conditional Operations                         *
- *****************************************************************************/
-
-
-int    osl_int_eq(int, void *, int, void *, int);
-int    osl_int_ne(int, void *, int, void *, int);
-int    osl_int_pos(int, void *, int);
-int    osl_int_neg(int, void *, int);
-int    osl_int_zero(int, void *, int);
-int    osl_int_one(int, void *, int);
-int    osl_int_mone(int, void *, int);
-int    osl_int_divisible(int, void *, int, void *, int);
-
-
-#endif /* define OSL_INT_H */
diff --git a/cloog-0.17.0/osl/include/osl/interface.h b/cloog-0.17.0/osl/include/osl/interface.h
deleted file mode 100644
index c711d24..0000000
--- a/cloog-0.17.0/osl/include/osl/interface.h
+++ /dev/null
@@ -1,137 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                          interface.h                            **
-     **-----------------------------------------------------------------**
-     **                   First version: 15/07/2011                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#ifndef OSL_INTERFACE_H
-# define OSL_INTERFACE_H
-
-# include <stdio.h>
-
-# if defined(__cplusplus)
-extern "C"
-  {
-# endif
-
-
-typedef void   (*osl_idump_f) (FILE *, void *, int);
-typedef char * (*osl_sprint_f)(void *);
-typedef void * (*osl_sread_f) (char **);
-typedef void * (*osl_malloc_f)();
-typedef void   (*osl_free_f)  (void *);
-typedef void * (*osl_clone_f) (void *);
-typedef int    (*osl_equal_f) (void *, void *);
-
-
-/**
- * The osl_interface structure stores the URI and base
- * functions pointers an openscop object implementation has to offer. It
- * is a node in a NULL-terminated list of interfaces.
- */
-struct osl_interface {
-  char * URI;                  /**< Unique identifier string */
-  osl_idump_f  idump;          /**< Pointer to idump function */
-  osl_sprint_f sprint;         /**< Pointer to sprint function */
-  osl_sread_f  sread;          /**< Pointer to sread function */
-  osl_malloc_f malloc;         /**< Pointer to malloc function */
-  osl_free_f   free;           /**< Pointer to free function */
-  osl_clone_f  clone;          /**< Pointer to clone function */
-  osl_equal_f  equal;          /**< Pointer to equal function */
-  struct osl_interface * next; /**< Next interface in the list */
-};
-typedef struct osl_interface   osl_interface_t;
-typedef struct osl_interface * osl_interface_p;
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-void            osl_interface_idump(FILE *, osl_interface_p, int);
-void            osl_interface_dump(FILE *, osl_interface_p);
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-void            osl_interface_add(osl_interface_p *, osl_interface_p);
-osl_interface_p osl_interface_malloc();
-void            osl_interface_free(osl_interface_p);
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-osl_interface_p osl_interface_nclone(osl_interface_p, int);
-osl_interface_p osl_interface_clone(osl_interface_p);
-int             osl_interface_equal(osl_interface_p, osl_interface_p);
-osl_interface_p osl_interface_lookup(osl_interface_p, char *);
-osl_interface_p osl_interface_get_default_registry();
-
-# if defined(__cplusplus)
-  }
-# endif
-
-#endif /* define OSL_INTERFACE_H */
diff --git a/cloog-0.17.0/osl/include/osl/macros.h b/cloog-0.17.0/osl/include/osl/macros.h
deleted file mode 100644
index 536ed91..0000000
--- a/cloog-0.17.0/osl/include/osl/macros.h
+++ /dev/null
@@ -1,176 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                           macros.h                              **
-     **-----------------------------------------------------------------**
-     **                   First version: 30/04/2008                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#ifndef OSL_MACROS_H
-# define OSL_MACROS_H
-
-# define OSL_DEBUG                 0       // 1 for debug mode, 0 otherwise.
-
-# define OSL_TAG_START_SCOP        "<OpenScop>"
-# define OSL_TAG_END_SCOP          "</OpenScop>"
-
-# define OSL_PRECISION_ENV         "OSL_PRECISION"
-# define OSL_PRECISION_ENV_SP      "32"
-# define OSL_PRECISION_ENV_DP      "64"
-# define OSL_PRECISION_ENV_MP      "0"
-# define OSL_PRECISION_SP          32
-# define OSL_PRECISION_DP          64
-# define OSL_PRECISION_MP          0
-
-# define OSL_FMT_SP                "%4ld"
-# define OSL_FMT_DP                "%4lld"
-# define OSL_FMT_MP                "%4s"
-# define OSL_FMT_LENGTH            4       // Should be the same as FMT_*P.
-# define OSL_FMT_TXT_SP            "%ld"
-# define OSL_FMT_TXT_DP            "%lld"
-# define OSL_FMT_TXT_MP            "%s"
-
-
-# define OSL_BACKEND_C             0
-# define OSL_BACKEND_FORTRAN       1
-# define OSL_UNDEFINED             -1
-# define OSL_MAX_STRING            2048
-# define OSL_MAX_ARRAYS            128
-
-# define OSL_TYPE_GENERIC          0
-# define OSL_TYPE_STRING           1
-# define OSL_TYPE_CONTEXT          2
-# define OSL_TYPE_DOMAIN           3
-# define OSL_TYPE_SCATTERING       4
-# define OSL_TYPE_ACCESS           5
-# define OSL_TYPE_READ             6
-# define OSL_TYPE_WRITE            7
-# define OSL_TYPE_MAY_WRITE        8
-
-# define OSL_FAKE_ARRAY            "fakearray"
-
-# define OSL_STRING_UNDEFINED      "UNDEFINED"
-# define OSL_STRING_CONTEXT        "CONTEXT"
-# define OSL_STRING_DOMAIN         "DOMAIN"
-# define OSL_STRING_SCATTERING     "SCATTERING"
-# define OSL_STRING_READ           "READ"
-# define OSL_STRING_WRITE          "WRITE"
-# define OSL_STRING_MAY_WRITE      "MAY_WRITE"
-
-/*+***************************************************************************
- *                               UTILITY MACROS                              *
- *****************************************************************************/
-
-# define OSL_coucou(n)                                                     \
-         do {                                                              \
-           int i = n +0;                                                   \
-           fprintf(stderr,"[osl] Coucou %d (%s).\n", i, __func__);         \
-         } while (0)
-
-# define OSL_debug(msg)                                                    \
-         do {                                                              \
-           if (OSL_DEBUG)                                                  \
-             fprintf(stderr,"[osl] Debug: "msg" (%s).\n", __func__);       \
-         } while (0)
-
-# define OSL_info(msg)                                                     \
-         do {                                                              \
-           fprintf(stderr,"[osl] Info: "msg" (%s).\n", __func__);          \
-         } while (0)
-
-# define OSL_warning(msg)                                                  \
-         do {                                                              \
-           fprintf(stderr,"[osl] Warning: "msg" (%s).\n", __func__);       \
-         } while (0)
-
-# define OSL_error(msg)                                                    \
-         do {                                                              \
-           fprintf(stderr,"[osl] Error: "msg" (%s).\n", __func__);         \
-           exit(1);                                                        \
-         } while (0)
-
-# define OSL_malloc(ptr, type, size)                                       \
-         do {                                                              \
-           if (((ptr) = (type)malloc(size)) == NULL)                       \
-             OSL_error("memory overflow");                                 \
-         } while (0)
-
-# define OSL_realloc(ptr, type, size)                                      \
-         do {                                                              \
-           if (((ptr) = (type)realloc(ptr, size)) == NULL)                 \
-             OSL_error("memory overflow");                                 \
-         } while (0)
-
-# define OSL_strdup(destination, source)                                   \
-         do {                                                              \
-           if (source != NULL) {                                           \
-             if (((destination) = strdup(source)) == NULL)                 \
-               OSL_error("memory overflow");                               \
-           }                                                               \
-           else {                                                          \
-             destination = NULL;                                           \
-             OSL_warning("strdup of a NULL string");                       \
-           }                                                               \
-         } while (0)
-
-# define OSL_max(x,y) ((x) > (y)? (x) : (y))
-
-# define OSL_min(x,y) ((x) < (y)? (x) : (y))
-
-
-#endif /* define OSL_MACROS_H */
diff --git a/cloog-0.17.0/osl/include/osl/names.h b/cloog-0.17.0/osl/include/osl/names.h
deleted file mode 100644
index cd7dfc0..0000000
--- a/cloog-0.17.0/osl/include/osl/names.h
+++ /dev/null
@@ -1,124 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                      extensions/names.h                         **
-     **-----------------------------------------------------------------**
-     **                   First version: 18/05/2011                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#ifndef OSL_NAMES_H
-# define OSL_NAMES_H
-
-# include <stdio.h>
-# include <osl/strings.h>
-
-# if defined(__cplusplus)
-extern "C"
-  {
-# endif
-
-
-/**
- * The osl_names_t structure stores the various names (names of iterators,
- * parameters...) necessary to generate a code from the OpenScop data
- * structure.
- */
-struct osl_names {
-  osl_strings_p parameters; /**< Parameter names */
-  osl_strings_p iterators;  /**< Iterator names */
-  osl_strings_p scatt_dims; /**< Scattering dimension names */
-  osl_strings_p local_dims; /**< Local dimension names */
-  osl_strings_p arrays;     /**< Array names */
-};
-typedef struct osl_names   osl_names_t;
-typedef struct osl_names * osl_names_p;
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-void         osl_names_idump(FILE *, osl_names_p, int);
-void         osl_names_dump(FILE *, osl_names_p);
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-osl_names_p osl_names_malloc();
-void        osl_names_free(osl_names_p);
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-osl_names_p osl_names_clone(osl_names_p);
-osl_names_p osl_names_generate(char *, int, char *, int,
-                               char *, int, char *, int,
-                               char *, int);
-
-
-# if defined(__cplusplus)
-  }
-# endif
-
-#endif /* define OSL_NAMES_H */
diff --git a/cloog-0.17.0/osl/include/osl/osl.h b/cloog-0.17.0/osl/include/osl/osl.h
deleted file mode 100644
index 9853e4d..0000000
--- a/cloog-0.17.0/osl/include/osl/osl.h
+++ /dev/null
@@ -1,109 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                          osl.h                             **
-     **-----------------------------------------------------------------**
-     **                   First version: 11/05/2010                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#ifndef OSL_OSL_H
-# define OSL_OSL_H
-
-/* List of reserved OpenScop URIs:
- * - arrays
- * - body
- * - comment
- * - generic
- * - int
- * - interface
- * - irregular
- * - lines
- * - openscop
- * - relation
- * - relation_list
- * - scatnames
- * - scop
- * - statement
- * - strings
- * - textual
- * - vector
- */
-
-# include <osl/macros.h>
-# include <osl/int.h>
-# include <osl/util.h>
-# include <osl/strings.h>
-# include <osl/body.h>
-# include <osl/vector.h>
-# include <osl/relation.h>
-# include <osl/relation_list.h>
-# include <osl/interface.h>
-
-# include <osl/extensions/textual.h>
-# include <osl/extensions/comment.h>
-# include <osl/extensions/scatnames.h>
-# include <osl/extensions/arrays.h>
-# include <osl/extensions/lines.h>
-# include <osl/extensions/irregular.h>
-
-# include <osl/generic.h>
-# include <osl/statement.h>
-# include <osl/scop.h>
-
-
-#endif /* define OSL_OSL_H */
diff --git a/cloog-0.17.0/osl/include/osl/relation.h b/cloog-0.17.0/osl/include/osl/relation.h
deleted file mode 100644
index f540aaf..0000000
--- a/cloog-0.17.0/osl/include/osl/relation.h
+++ /dev/null
@@ -1,184 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                          relation.h                             **
-     **-----------------------------------------------------------------**
-     **                   First version: 30/04/2008                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#ifndef OSL_RELATION_H
-# define OSL_RELATION_H
-
-# include <stdio.h>
-# include <osl/names.h>
-# include <osl/vector.h>
-
-# if defined(__cplusplus)
-extern "C"
-  {
-# endif
-
-
-/**
- * The osl_relation_t structure stores a union of relations. It is a
- * NULL-terminated linked list of relations. Each relation is described
- * using a matrix where each row represents a linear constraint. The entries
- * of each row are organised in the following order:
- * - An equality/inequality tag: 0 means the row corresponds to an
- *   equality constraint == 0, 1 means it is an inequality >= 0.
- * - The coefficients of the output dimensions.
- * - The coefficients of the input dimensions (0 for a set).
- * - The coefficients of the local (existentially quantified) dimensions.
- * - The coefficients of the parameters.
- * - The coefficient of the constant.
- * Thus we have the following invariant: nb_columns =
- * 1 + nb_output_dims + nb_input_dims + dims + nb_parameters + 1.
- * Moreover we use the following conventions:
- * - Sets (e.g., iteration domains) are the images of relations with a
- *   zero-dimensional domain, hence the number of input dimensions is 0.
- * - The first output dimension of any access relations corresponds to
- *   the name of the array.
- * The type field may provide some semantics about the relation, it may be:
- * - Undefined : OSL_UNDEFINED,
- * - An iteration domain : OSL_TYPE_DOMAIN,
- * - A scattering relation : OSL_TYPE_SCATTERING,
- * - An access relation : OSL_TYPE_ACCESS.
- */
-struct osl_relation {
-  int type;                   /**< Semantics about the relation */
-  int precision;              /**< Precision of relation matrix elements*/
-  int nb_rows;                /**< Number of rows */
-  int nb_columns;	      /**< Number of columns */
-  int nb_output_dims;         /**< Number of output dimensions */
-  int nb_input_dims;          /**< Number of input dimensions */
-  int nb_local_dims;          /**< Number of local (existentially
-                                   quantified) dimensions */
-  int nb_parameters;          /**< Number of parameters */
-  void ** m;                  /**< An array of pointers to the beginning
-			           of each row of the relation matrix */
-  struct osl_relation * next; /**< Pointer to the next relation in the
-                                   union of relations (NULL if none) */
-};
-typedef struct osl_relation   osl_relation_t;
-typedef struct osl_relation * osl_relation_p;
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-void           osl_relation_idump(FILE *, osl_relation_p, int);
-void           osl_relation_dump(FILE *, osl_relation_p);
-char *         osl_relation_expression(osl_relation_p relation,
-                                       int row, char ** names);
-char *         osl_relation_spprint_polylib(osl_relation_p, osl_names_p);
-char *         osl_relation_spprint(osl_relation_p, osl_names_p);
-void           osl_relation_pprint(FILE *, osl_relation_p, osl_names_p);
-void           osl_relation_print(FILE *, osl_relation_p);
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-osl_relation_p osl_relation_pread(FILE *, int);
-osl_relation_p osl_relation_read(FILE *);
-osl_relation_p osl_relation_read_arrays(FILE *, char ***, int *);
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-osl_relation_p osl_relation_pmalloc(int, int, int);
-osl_relation_p osl_relation_malloc(int, int);
-void           osl_relation_free_inside(osl_relation_p);
-void           osl_relation_free(osl_relation_p);
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-osl_relation_p osl_relation_nclone(osl_relation_p, int);
-osl_relation_p osl_relation_clone(osl_relation_p);
-void           osl_relation_replace_vector(osl_relation_p, osl_vector_p, int);
-void           osl_relation_insert_vector(osl_relation_p, osl_vector_p, int);
-void           osl_relation_insert_blank_row(osl_relation_p, int);
-void           osl_relation_insert_blank_column(osl_relation_p, int);
-void           osl_relation_add_vector(osl_relation_p, osl_vector_p, int);
-void           osl_relation_sub_vector(osl_relation_p, osl_vector_p, int);
-osl_relation_p osl_relation_from_vector(osl_vector_p);
-void           osl_relation_replace_constraints(osl_relation_p,
-                                                osl_relation_p, int);
-void           osl_relation_insert_constraints(osl_relation_p,
-                                               osl_relation_p, int);
-void           osl_relation_insert_columns(osl_relation_p, osl_relation_p,int);
-osl_relation_p osl_relation_concat_constraints(osl_relation_p, osl_relation_p);
-int            osl_relation_equal(osl_relation_p, osl_relation_p);    
-int            osl_relation_integrity_check(osl_relation_p, int, int, int,int);
-osl_relation_p osl_relation_union(osl_relation_p, osl_relation_p);
-void           osl_relation_set_attributes(osl_relation_p, int, int, int, int);
-void           osl_relation_set_type(osl_relation_p, int);
-int            osl_relation_get_array_id(osl_relation_p);
-int            osl_relation_is_access(osl_relation_p);
-void           osl_relation_get_attributes(osl_relation_p,
-                                           int *, int *, int *, int *, int *);
-osl_relation_p osl_relation_extend_output(osl_relation_p, int);
-
-
-# if defined(__cplusplus)
-  }
-# endif
-#endif /* define OSL_RELATION_H */
diff --git a/cloog-0.17.0/osl/include/osl/relation_list.h b/cloog-0.17.0/osl/include/osl/relation_list.h
deleted file mode 100644
index 6b17a7e..0000000
--- a/cloog-0.17.0/osl/include/osl/relation_list.h
+++ /dev/null
@@ -1,136 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                        relation_list.h                          **
-     **-----------------------------------------------------------------**
-     **                   First version: 08/10/2010                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#ifndef OSL_RELATION_LIST_H
-# define OSL_RELATION_LIST_H
-
-# include <stdio.h>
-# include <osl/relation.h>
-
-
-# if defined(__cplusplus)
-extern "C"
-  {
-# endif
-
-
-/**
- * The osl_relation_list_t structure describes a (NULL-terminated
- * linked) list of relations.
- */
-struct osl_relation_list {
-  osl_relation_p elt;              /**< An element of the list. */
-  struct osl_relation_list * next; /**< Pointer to the next element
-				        of the list.*/
-};
-typedef struct osl_relation_list   osl_relation_list_t;
-typedef struct osl_relation_list * osl_relation_list_p;
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-void osl_relation_list_idump(FILE *, osl_relation_list_p, int);
-void osl_relation_list_dump(FILE *, osl_relation_list_p);
-void osl_relation_list_pprint_elts(FILE *, osl_relation_list_p, osl_names_p);
-void osl_relation_list_pprint(FILE *, osl_relation_list_p, osl_names_p);
-void osl_relation_list_print(FILE *, osl_relation_list_p);
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-osl_relation_list_p osl_relation_list_pread(FILE *, int);
-osl_relation_list_p osl_relation_list_read(FILE *);
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-osl_relation_list_p osl_relation_list_malloc();
-void                osl_relation_list_free(osl_relation_list_p);
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-osl_relation_list_p osl_relation_list_node(osl_relation_p);
-osl_relation_list_p osl_relation_list_clone(osl_relation_list_p);
-osl_relation_list_p osl_relation_list_concat(osl_relation_list_p,
-                                             osl_relation_list_p);
-void                osl_relation_list_concat_inplace(osl_relation_list_p *,
-                                                     osl_relation_list_p);
-int                 osl_relation_list_equal(osl_relation_list_p,
-                                            osl_relation_list_p);
-int                 osl_relation_list_integrity_check(osl_relation_list_p,
-                                                      int, int, int, int);
-void                osl_relation_list_set_type(osl_relation_list_p, int);
-osl_relation_list_p osl_relation_list_filter(osl_relation_list_p, int);
-int                 osl_relation_list_count(osl_relation_list_p);
-void                osl_relation_list_get_attributes(osl_relation_list_p,
-                                                     int *, int *, int *,
-                                                     int *, int *);
-# if defined(__cplusplus)
-  }
-# endif
-#endif /* define OSL_RELATION_LIST_H */
diff --git a/cloog-0.17.0/osl/include/osl/scop.h b/cloog-0.17.0/osl/include/osl/scop.h
deleted file mode 100644
index bfb6389..0000000
--- a/cloog-0.17.0/osl/include/osl/scop.h
+++ /dev/null
@@ -1,152 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                            scop.h                               **
-     **-----------------------------------------------------------------**
-     **                   First version: 30/04/2008                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-/*+****************************************************************************
- *  THIS FILE HAS BEEN AUTOMATICALLY GENERATED FROM scop.h.in BY configure    *
- ******************************************************************************/
-
-
-#ifndef OSL_SCOP_H
-# define OSL_SCOP_H
-
-# include <unistd.h>
-
-# define OSL_RELEASE "0.8.1"
-
-# include <osl/relation.h>
-# include <osl/interface.h>
-# include <osl/generic.h>
-# include <osl/statement.h>
-
-
-# if defined(__cplusplus)
-extern "C"
-  {
-# endif
-
-
-/**
- * The scop_t structure stores a list of scops. Each node stores the useful
- * information of a static control part of a program to process it within a
- * polyhedral framework. Parameter information may be strings of characters
- * (char *) when the type field is OSL_TYPE_STRING or a generic pointer
- * to anything else (void *) when the type field is OSL_TYPE_GENERIC.
- * The OpenScop library does not touch AT ALL generic information: printing,
- * copy etc. must be done externally.
- */
-struct osl_scop {
-  int version;               /**< Version of the data structure */
-  char * language;           /**< Target language (backend) */
-  osl_relation_p context;    /**< Constraints on the SCoP parameters */
-  osl_generic_p parameters;  /**< NULL-terminated array of parameters */
-  osl_statement_p statement; /**< Statement list of the SCoP */
-  osl_interface_p registry;  /**< Registered extensions interfaces */
-  osl_generic_p extension;   /**< List of extensions */
-  void * usr;                /**< A user-defined field, not touched
-			          AT ALL by the OpenScop Library */
-  struct osl_scop * next;    /**< Next statement in the linked list */
-};
-typedef struct osl_scop   osl_scop_t;
-typedef struct osl_scop * osl_scop_p;
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-void       osl_scop_idump(FILE *, osl_scop_p, int);
-void       osl_scop_dump(FILE *, osl_scop_p);
-void       osl_scop_print(FILE *, osl_scop_p);
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-osl_scop_p osl_scop_pread(FILE *, osl_interface_p, int);
-osl_scop_p osl_scop_read(FILE *);
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-osl_scop_p osl_scop_malloc();
-void       osl_scop_free(osl_scop_p);
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-osl_scop_p osl_scop_clone(osl_scop_p);
-int        osl_scop_equal(osl_scop_p, osl_scop_p);
-int        osl_scop_integrity_check(osl_scop_p);
-int        osl_scop_get_nb_parameters(osl_scop_p);
-void       osl_scop_register_extension(osl_scop_p, osl_interface_p);
-void       osl_scop_get_attributes(osl_scop_p,
-                                   int *, int *, int *, int *, int *);
-void       osl_scop_normalize_scattering(osl_scop_p);
-
-
-# if defined(__cplusplus)
-  }
-# endif
-
-#endif /* define OSL_SCOP_H */
diff --git a/cloog-0.17.0/osl/include/osl/scop.h.in b/cloog-0.17.0/osl/include/osl/scop.h.in
deleted file mode 100644
index c8904ce..0000000
--- a/cloog-0.17.0/osl/include/osl/scop.h.in
+++ /dev/null
@@ -1,152 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                            scop.h                               **
-     **-----------------------------------------------------------------**
-     **                   First version: 30/04/2008                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-/*+****************************************************************************
- *  THIS FILE HAS BEEN AUTOMATICALLY GENERATED FROM scop.h.in BY configure    *
- ******************************************************************************/
-
-
-#ifndef OSL_SCOP_H
-# define OSL_SCOP_H
-
-# include <unistd.h>
-
-# define OSL_RELEASE "@PACKAGE_VERSION@"
-
-# include <osl/relation.h>
-# include <osl/interface.h>
-# include <osl/generic.h>
-# include <osl/statement.h>
-
-
-# if defined(__cplusplus)
-extern "C"
-  {
-# endif
-
-
-/**
- * The scop_t structure stores a list of scops. Each node stores the useful
- * information of a static control part of a program to process it within a
- * polyhedral framework. Parameter information may be strings of characters
- * (char *) when the type field is OSL_TYPE_STRING or a generic pointer
- * to anything else (void *) when the type field is OSL_TYPE_GENERIC.
- * The OpenScop library does not touch AT ALL generic information: printing,
- * copy etc. must be done externally.
- */
-struct osl_scop {
-  int version;               /**< Version of the data structure */
-  char * language;           /**< Target language (backend) */
-  osl_relation_p context;    /**< Constraints on the SCoP parameters */
-  osl_generic_p parameters;  /**< NULL-terminated array of parameters */
-  osl_statement_p statement; /**< Statement list of the SCoP */
-  osl_interface_p registry;  /**< Registered extensions interfaces */
-  osl_generic_p extension;   /**< List of extensions */
-  void * usr;                /**< A user-defined field, not touched
-			          AT ALL by the OpenScop Library */
-  struct osl_scop * next;    /**< Next statement in the linked list */
-};
-typedef struct osl_scop   osl_scop_t;
-typedef struct osl_scop * osl_scop_p;
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-void       osl_scop_idump(FILE *, osl_scop_p, int);
-void       osl_scop_dump(FILE *, osl_scop_p);
-void       osl_scop_print(FILE *, osl_scop_p);
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-osl_scop_p osl_scop_pread(FILE *, osl_interface_p, int);
-osl_scop_p osl_scop_read(FILE *);
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-osl_scop_p osl_scop_malloc();
-void       osl_scop_free(osl_scop_p);
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-osl_scop_p osl_scop_clone(osl_scop_p);
-int        osl_scop_equal(osl_scop_p, osl_scop_p);
-int        osl_scop_integrity_check(osl_scop_p);
-int        osl_scop_get_nb_parameters(osl_scop_p);
-void       osl_scop_register_extension(osl_scop_p, osl_interface_p);
-void       osl_scop_get_attributes(osl_scop_p,
-                                   int *, int *, int *, int *, int *);
-void       osl_scop_normalize_scattering(osl_scop_p);
-
-
-# if defined(__cplusplus)
-  }
-# endif
-
-#endif /* define OSL_SCOP_H */
diff --git a/cloog-0.17.0/osl/include/osl/statement.h b/cloog-0.17.0/osl/include/osl/statement.h
deleted file mode 100644
index e671ea3..0000000
--- a/cloog-0.17.0/osl/include/osl/statement.h
+++ /dev/null
@@ -1,138 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                         statement.h                             **
-     **-----------------------------------------------------------------**
-     **                   First version: 30/04/2008                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#ifndef OSL_STATEMENT_H
-# define OSL_STATEMENT_H
-
-# include <stdio.h>
-# include <osl/relation.h>
-# include <osl/relation_list.h>
-# include <osl/names.h>
-# include <osl/interface.h>
-# include <osl/generic.h>
-
-# if defined(__cplusplus)
-extern "C"
-  {
-# endif
-
-
-/**
- * The osl_statement_t structure stores a list of statement. Each node
- * contains the useful informations for a given statement to process it
- * within a polyhedral framework. The order in the list may matter for naming
- * conventions (e.g. "S1" for the first statement in the list).
- */
-struct osl_statement {
-  osl_relation_p domain;       /**< Iteration domain of the statement */
-  osl_relation_p scattering;   /**< Scattering relation of the statement*/
-  osl_relation_list_p access;  /**< Access information */
-  osl_generic_p body;          /**< Original statement body */
-  void * usr;                  /**< A user-defined field, not touched
-				    AT ALL by the OpenScop Library. */
-  struct osl_statement * next; /**< Next statement in the linked list */
-};
-typedef struct osl_statement   osl_statement_t;
-typedef struct osl_statement * osl_statement_p;
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-void            osl_statement_idump(FILE *, osl_statement_p, int);
-void            osl_statement_dump(FILE *, osl_statement_p);
-void            osl_statement_pprint(FILE *, osl_statement_p, osl_names_p);
-void            osl_statement_print(FILE *, osl_statement_p);
-
-
-/*****************************************************************************
- *                              Reading function                             *
- *****************************************************************************/
-osl_statement_p osl_statement_pread(FILE *, osl_interface_p, int);
-osl_statement_p osl_statement_read(FILE *);
-
-
-/*+***************************************************************************
- *                   Memory allocation/deallocation function                 *
- *****************************************************************************/
-osl_statement_p osl_statement_malloc();
-void            osl_statement_free(osl_statement_p);
-
-
-/*+***************************************************************************
- *                           Processing functions                            *
- *****************************************************************************/
-void            osl_statement_add(osl_statement_p *, osl_statement_p);
-void            osl_statement_compact(osl_statement_p, int);
-int             osl_statement_number(osl_statement_p);
-osl_statement_p osl_statement_clone(osl_statement_p);
-int             osl_statement_equal(osl_statement_p, osl_statement_p);
-int             osl_statement_integrity_check(osl_statement_p, int);
-int             osl_statement_get_nb_iterators(osl_statement_p);
-void            osl_statement_get_attributes(osl_statement_p, int *, int *,
-                                             int *, int *, int *);
-
-# if defined(__cplusplus)
-  }
-# endif
-#endif /* define OSL_STATEMENT_H */
diff --git a/cloog-0.17.0/osl/include/osl/strings.h b/cloog-0.17.0/osl/include/osl/strings.h
deleted file mode 100644
index c32ba11..0000000
--- a/cloog-0.17.0/osl/include/osl/strings.h
+++ /dev/null
@@ -1,124 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                           strings.h                             **
-     **-----------------------------------------------------------------**
-     **                   First version: 13/07/2011                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#ifndef OSL_STRINGS_H
-# define OSL_STRINGS_H
-
-# include <stdio.h>
-# include <osl/interface.h>
-
-# if defined(__cplusplus)
-extern "C"
-  {
-# endif
-
-# define OSL_URI_STRINGS "strings"
-
-/* The "strings" type is simply a NULL-terminated array of C character
- * strings, i.e. a char **. It is encapsulated into a structure to allow
- * its manipulation through a generic type.
- */
-struct osl_strings {
-  char ** string; /**< NULL-terminated array of character strings */
-};
-typedef struct osl_strings   osl_strings_t;
-typedef struct osl_strings * osl_strings_p;
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-void            osl_strings_idump(FILE *, osl_strings_p, int);
-void            osl_strings_dump(FILE *, osl_strings_p);
-char *          osl_strings_sprint(osl_strings_p);
-void            osl_strings_print(FILE *, osl_strings_p);
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-osl_strings_p   osl_strings_sread(char **);
-osl_strings_p   osl_strings_read(FILE *);
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-osl_strings_p   osl_strings_malloc();
-void            osl_strings_free(osl_strings_p);
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-osl_strings_p   osl_strings_clone(osl_strings_p);
-int             osl_strings_equal(osl_strings_p, osl_strings_p);
-int             osl_strings_size(osl_strings_p);
-osl_strings_p   osl_strings_encapsulate(char *);
-osl_interface_p osl_strings_interface();
-osl_strings_p   osl_strings_generate(char *, int);
-
-
-# if defined(__cplusplus)
-  }
-# endif
-
-#endif /* define OSL_STRINGS_H */
diff --git a/cloog-0.17.0/osl/include/osl/util.h b/cloog-0.17.0/osl/include/osl/util.h
deleted file mode 100644
index fcf2977..0000000
--- a/cloog-0.17.0/osl/include/osl/util.h
+++ /dev/null
@@ -1,97 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                            util.h                               **
-     **-----------------------------------------------------------------**
-     **                   First version: 08/10/2010                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#ifndef OSL_UTIL_H
-# define OSL_UTIL_H
-
-# include <stdio.h>
-
-
-# if defined(__cplusplus)
-extern "C"
-  {
-# endif
-
-
-/*+***************************************************************************
- *                            Utility functions                              *
- *****************************************************************************/
-char * osl_util_skip_blank_and_comments(FILE *, char *);
-void   osl_util_sskip_blank_and_comments(char **);
-int    osl_util_read_int(FILE *, char **);
-char * osl_util_read_tag(FILE *, char **);
-char * osl_util_read_tail(FILE *);
-char * osl_util_read_uptotag(FILE *, char *);
-char * osl_util_read_uptoendtag(FILE *, char *);
-char * osl_util_tag_content(char *, char *);
-void   osl_util_safe_strcat(char **, char *, int *);
-int    osl_util_get_precision();
-void   osl_util_print_provided(FILE *, int, char *);
-char * osl_util_identifier_substitution(char *, char **);
-
-
-# if defined(__cplusplus)
-  }
-# endif
-
-#endif /* define OSL_UTIL_H */
diff --git a/cloog-0.17.0/osl/include/osl/vector.h b/cloog-0.17.0/osl/include/osl/vector.h
deleted file mode 100644
index 98701ee..0000000
--- a/cloog-0.17.0/osl/include/osl/vector.h
+++ /dev/null
@@ -1,122 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                           vector.h                              **
-     **-----------------------------------------------------------------**
-     **                   First version: 01/05/2008                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#ifndef OSL_VECTOR_H
-# define OSL_VECTOR_H
-
-# include <stdio.h>
-# include <osl/int.h>
-
-
-# if defined(__cplusplus)
-extern "C"
-  {
-# endif
-
-
-/**
- * The osl_vector_t structure stores a vector information in the PolyLib
- * format (the first entry has a specific meaning). When a vector
- * describes a linear constraint, a 0 means it is an equality == 0, a 1 means
- * an inequality >= 0. When the vector describes an array access, a number
- * different than 0 is the array identifier.
- */
-struct osl_vector {
-  int precision; /**< Precision of the integer elements. */
-  int size;      /**< Number of vector entries */
-  void * v;      /**< An array of values */
-};
-typedef struct osl_vector   osl_vector_t;
-typedef struct osl_vector * osl_vector_p;
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-void         osl_vector_idump(FILE *, osl_vector_p, int);
-void         osl_vector_dump(FILE *, osl_vector_p);
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-osl_vector_p osl_vector_pmalloc(int, int);
-osl_vector_p osl_vector_malloc(int);
-void         osl_vector_free(osl_vector_p);
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-osl_vector_p osl_vector_add_scalar(osl_vector_p, int);
-osl_vector_p osl_vector_mul_scalar(osl_vector_p, int);
-osl_vector_p osl_vector_add(osl_vector_p, osl_vector_p);
-osl_vector_p osl_vector_sub(osl_vector_p, osl_vector_p);
-void         osl_vector_tag_inequality(osl_vector_p);
-void         osl_vector_tag_equality(osl_vector_p);
-int          osl_vector_equal(osl_vector_p, osl_vector_p);
-
-# if defined(__cplusplus)
-  }
-# endif
-#endif /* define OSL_VECTOR_H */
diff --git a/cloog-0.17.0/osl/source/Makefile.am b/cloog-0.17.0/osl/source/Makefile.am
deleted file mode 100644
index 0a804f1..0000000
--- a/cloog-0.17.0/osl/source/Makefile.am
+++ /dev/null
@@ -1,105 +0,0 @@
-#
-#   /*+------------------------------------------------------------------**
-#    **                       OpenScop Library                           **
-#    **------------------------------------------------------------------**
-#    **                         makefile.am                              **
-#    **------------------------------------------------------------------**
-#    **                   First version: 30/04/2008                      **
-#    **------------------------------------------------------------------**
-#
-#   
-# ***************************************************************************
-# * OpenScop: Structures and formats for polyhedral tools to talk together  *
-# ***************************************************************************
-# *   ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,               *
-# *   /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,            *
-# *  /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\            *
-# * |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \           *
-# * | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\          *
-# * | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\         *
-# * | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \        *
-# * | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \       *
-# * | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \      *
-# * | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \     *
-# * | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \    *
-# * | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \   *
-# * | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \  *
-# * | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /  *
-# * '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'   *
-# *                                                                         *
-# * Copyright (C) 2008 University Paris-Sud 11 and INRIA                    *
-# *                                                                         *
-# * (3-clause BSD license)                                                  *
-# * Redistribution and use in source  and binary forms, with or without     *
-# * modification, are permitted provided that the following conditions      *
-# * are met:                                                                *
-# *                                                                         *
-# * 1. Redistributions of source code must retain the above copyright       *
-# *    notice, this list of conditions and the following disclaimer.        *
-# * 2. Redistributions in binary form must reproduce the above copyright    *
-# *    notice, this list of conditions and the following disclaimer in the  *
-# *    documentation and/or other materials provided with the distribution. *
-# * 3. The name of the author may not be used to endorse or promote         *
-# *    products derived from this software without specific prior written   *
-# *    permission.                                                          *
-# *                                                                         *
-# * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR    *
-# * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED          *
-# * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  *
-# * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,      *
-# * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES      *
-# * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR      *
-# * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)      *
-# * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,     *
-# * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING   *
-# * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE      *
-# * POSSIBILITY OF SUCH DAMAGE.                                             *
-# *                                                                         *
-# * OpenScop Library, a library to manipulate OpenScop formats and data     *
-# * structures. Written by:                                                 *
-# * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                       *
-# * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                        *
-# *                                                                         *
-# ***************************************************************************/
-#
-# Makefile.am (or makefile if generated) of the OpenScop Library.
-# Makefile.am is not a makefile, you must run the 'autogen.sh' THEN the
-# configure shellscript to generate the Makefile thanks to this file.
-
-
-#############################################################################
-SUBDIRS			=
-
-#############################################################################
-MAINTAINERCLEANFILES	= Makefile.in
-
-INCLUDES		= -I$(top_builddir) -I$(top_srcdir)  \
-			  -I$(top_builddir)/include          \
-		          -I$(top_srcdir)/include
-
-#############################################################################
-
-lib_LTLIBRARIES 	= libosl.la
-
-
-libosl_la_SOURCES 	=      \
-	scop.c                 \
-	statement.c            \
-	extensions/textual.c   \
-	extensions/comment.c   \
-	extensions/scatnames.c \
-	extensions/arrays.c    \
-	extensions/lines.c     \
-	extensions/irregular.c \
-	interface.c            \
-	generic.c              \
-	relation.c             \
-	relation_list.c        \
-	vector.c               \
-	names.c                \
-	strings.c              \
-	body.c                 \
-	int.c                  \
-	util.c
-
-AM_CFLAGS = -Wall -fomit-frame-pointer -g
diff --git a/cloog-0.17.0/osl/source/Makefile.in b/cloog-0.17.0/osl/source/Makefile.in
deleted file mode 100644
index 2441a44..0000000
--- a/cloog-0.17.0/osl/source/Makefile.in
+++ /dev/null
@@ -1,834 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-#
-#   /*+------------------------------------------------------------------**
-#    **                       OpenScop Library                           **
-#    **------------------------------------------------------------------**
-#    **                         makefile.am                              **
-#    **------------------------------------------------------------------**
-#    **                   First version: 30/04/2008                      **
-#    **------------------------------------------------------------------**
-#
-#   
-# ***************************************************************************
-# * OpenScop: Structures and formats for polyhedral tools to talk together  *
-# ***************************************************************************
-# *   ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,               *
-# *   /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,            *
-# *  /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\            *
-# * |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \           *
-# * | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\          *
-# * | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\         *
-# * | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \        *
-# * | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \       *
-# * | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \      *
-# * | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \     *
-# * | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \    *
-# * | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \   *
-# * | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \  *
-# * | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /  *
-# * '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'   *
-# *                                                                         *
-# * Copyright (C) 2008 University Paris-Sud 11 and INRIA                    *
-# *                                                                         *
-# * (3-clause BSD license)                                                  *
-# * Redistribution and use in source  and binary forms, with or without     *
-# * modification, are permitted provided that the following conditions      *
-# * are met:                                                                *
-# *                                                                         *
-# * 1. Redistributions of source code must retain the above copyright       *
-# *    notice, this list of conditions and the following disclaimer.        *
-# * 2. Redistributions in binary form must reproduce the above copyright    *
-# *    notice, this list of conditions and the following disclaimer in the  *
-# *    documentation and/or other materials provided with the distribution. *
-# * 3. The name of the author may not be used to endorse or promote         *
-# *    products derived from this software without specific prior written   *
-# *    permission.                                                          *
-# *                                                                         *
-# * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR    *
-# * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED          *
-# * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  *
-# * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,      *
-# * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES      *
-# * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR      *
-# * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)      *
-# * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,     *
-# * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING   *
-# * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE      *
-# * POSSIBILITY OF SUCH DAMAGE.                                             *
-# *                                                                         *
-# * OpenScop Library, a library to manipulate OpenScop formats and data     *
-# * structures. Written by:                                                 *
-# * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                       *
-# * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                        *
-# *                                                                         *
-# ***************************************************************************/
-#
-# Makefile.am (or makefile if generated) of the OpenScop Library.
-# Makefile.am is not a makefile, you must run the 'autogen.sh' THEN the
-# configure shellscript to generate the Makefile thanks to this file.
-
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = source
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/autoconf/libtool.m4 \
-	$(top_srcdir)/autoconf/ltoptions.m4 \
-	$(top_srcdir)/autoconf/ltsugar.m4 \
-	$(top_srcdir)/autoconf/ltversion.m4 \
-	$(top_srcdir)/autoconf/lt~obsolete.m4 \
-	$(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__installdirs = "$(DESTDIR)$(libdir)"
-LTLIBRARIES = $(lib_LTLIBRARIES)
-libosl_la_LIBADD =
-am_libosl_la_OBJECTS = scop.lo statement.lo textual.lo comment.lo \
-	scatnames.lo arrays.lo lines.lo irregular.lo interface.lo \
-	generic.lo relation.lo relation_list.lo vector.lo names.lo \
-	strings.lo body.lo int.lo util.lo
-libosl_la_OBJECTS = $(am_libosl_la_OBJECTS)
-DEFAULT_INCLUDES = -I.@am__isrc@
-depcomp = $(SHELL) $(top_srcdir)/autoconf/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = $(libosl_la_SOURCES)
-DIST_SOURCES = $(libosl_la_SOURCES)
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-dvi-recursive install-exec-recursive \
-	install-html-recursive install-info-recursive \
-	install-pdf-recursive install-ps-recursive install-recursive \
-	installcheck-recursive installdirs-recursive pdf-recursive \
-	ps-recursive uninstall-recursive
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
-  distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
-	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
-	distdir
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CD = @CD@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DOXYGEN = @DOXYGEN@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_aux_dir = @ac_aux_dir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-
-#############################################################################
-SUBDIRS = 
-
-#############################################################################
-MAINTAINERCLEANFILES = Makefile.in
-INCLUDES = -I$(top_builddir) -I$(top_srcdir)  \
-			  -I$(top_builddir)/include          \
-		          -I$(top_srcdir)/include
-
-
-#############################################################################
-lib_LTLIBRARIES = libosl.la
-libosl_la_SOURCES = \
-	scop.c                 \
-	statement.c            \
-	extensions/textual.c   \
-	extensions/comment.c   \
-	extensions/scatnames.c \
-	extensions/arrays.c    \
-	extensions/lines.c     \
-	extensions/irregular.c \
-	interface.c            \
-	generic.c              \
-	relation.c             \
-	relation_list.c        \
-	vector.c               \
-	names.c                \
-	strings.c              \
-	body.c                 \
-	int.c                  \
-	util.c
-
-AM_CFLAGS = -Wall -fomit-frame-pointer -g
-all: all-recursive
-
-.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign source/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign source/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
-	}
-
-uninstall-libLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
-	done
-
-clean-libLTLIBRARIES:
-	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
-	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" != "$$p" || dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-libosl.la: $(libosl_la_OBJECTS) $(libosl_la_DEPENDENCIES) 
-	$(LINK) -rpath $(libdir) $(libosl_la_OBJECTS) $(libosl_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arrays.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/body.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/comment.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generic.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/int.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interface.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/irregular.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lines.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/names.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relation.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relation_list.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scatnames.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scop.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/statement.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strings.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/textual.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector.Plo@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c $<
-
-.c.obj:
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.c.lo:
-@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
-
-textual.lo: extensions/textual.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT textual.lo -MD -MP -MF $(DEPDIR)/textual.Tpo -c -o textual.lo `test -f 'extensions/textual.c' || echo '$(srcdir)/'`extensions/textual.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/textual.Tpo $(DEPDIR)/textual.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='extensions/textual.c' object='textual.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o textual.lo `test -f 'extensions/textual.c' || echo '$(srcdir)/'`extensions/textual.c
-
-comment.lo: extensions/comment.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT comment.lo -MD -MP -MF $(DEPDIR)/comment.Tpo -c -o comment.lo `test -f 'extensions/comment.c' || echo '$(srcdir)/'`extensions/comment.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/comment.Tpo $(DEPDIR)/comment.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='extensions/comment.c' object='comment.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o comment.lo `test -f 'extensions/comment.c' || echo '$(srcdir)/'`extensions/comment.c
-
-scatnames.lo: extensions/scatnames.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT scatnames.lo -MD -MP -MF $(DEPDIR)/scatnames.Tpo -c -o scatnames.lo `test -f 'extensions/scatnames.c' || echo '$(srcdir)/'`extensions/scatnames.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/scatnames.Tpo $(DEPDIR)/scatnames.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='extensions/scatnames.c' object='scatnames.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o scatnames.lo `test -f 'extensions/scatnames.c' || echo '$(srcdir)/'`extensions/scatnames.c
-
-arrays.lo: extensions/arrays.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT arrays.lo -MD -MP -MF $(DEPDIR)/arrays.Tpo -c -o arrays.lo `test -f 'extensions/arrays.c' || echo '$(srcdir)/'`extensions/arrays.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/arrays.Tpo $(DEPDIR)/arrays.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='extensions/arrays.c' object='arrays.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o arrays.lo `test -f 'extensions/arrays.c' || echo '$(srcdir)/'`extensions/arrays.c
-
-lines.lo: extensions/lines.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lines.lo -MD -MP -MF $(DEPDIR)/lines.Tpo -c -o lines.lo `test -f 'extensions/lines.c' || echo '$(srcdir)/'`extensions/lines.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/lines.Tpo $(DEPDIR)/lines.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='extensions/lines.c' object='lines.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lines.lo `test -f 'extensions/lines.c' || echo '$(srcdir)/'`extensions/lines.c
-
-irregular.lo: extensions/irregular.c
-@am__fastdepCC_TRUE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT irregular.lo -MD -MP -MF $(DEPDIR)/irregular.Tpo -c -o irregular.lo `test -f 'extensions/irregular.c' || echo '$(srcdir)/'`extensions/irregular.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/irregular.Tpo $(DEPDIR)/irregular.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='extensions/irregular.c' object='irregular.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o irregular.lo `test -f 'extensions/irregular.c' || echo '$(srcdir)/'`extensions/irregular.c
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test -d "$(distdir)/$$subdir" \
-	    || $(MKDIR_P) "$(distdir)/$$subdir" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-	    $(am__relativize); \
-	    new_distdir=$$reldir; \
-	    dir1=$$subdir; dir2="$(top_distdir)"; \
-	    $(am__relativize); \
-	    new_top_distdir=$$reldir; \
-	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-	    ($(am__cd) $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$new_top_distdir" \
-	        distdir="$$new_distdir" \
-		am__remove_distdir=: \
-		am__skip_length_check=: \
-		am__skip_mode_fix=: \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(LTLIBRARIES)
-installdirs: installdirs-recursive
-installdirs-am:
-	for dir in "$(DESTDIR)$(libdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-clean: clean-recursive
-
-clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
-	mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am: install-libLTLIBRARIES
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-libLTLIBRARIES
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
-	install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-	all all-am check check-am clean clean-generic \
-	clean-libLTLIBRARIES clean-libtool ctags ctags-recursive \
-	distclean distclean-compile distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-libLTLIBRARIES install-man install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs installdirs-am \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-	pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \
-	uninstall-libLTLIBRARIES
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/cloog-0.17.0/osl/source/body.c b/cloog-0.17.0/osl/source/body.c
deleted file mode 100644
index 9f47057..0000000
--- a/cloog-0.17.0/osl/source/body.c
+++ /dev/null
@@ -1,389 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                            body.c                               **
-     **-----------------------------------------------------------------**
-     **                   First version: 25/06/2011                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-# include <stdlib.h>
-# include <stdio.h>
-# include <string.h>
-# include <ctype.h>
-# include <osl/macros.h>
-# include <osl/util.h>
-# include <osl/strings.h>
-# include <osl/interface.h>
-# include <osl/body.h>
-
-
-/*+***************************************************************************
- *                         Structure display functions                       *
- *****************************************************************************/
-
-
-/**
- * osl_body_idump function:
- * this function displays an osl_body_t structure (*body) into a
- * file (file, possibly stdout) in a way that trends to be understandable.
- * It includes an indentation level (level) in order to work with others
- * dumping functions.
- * \param[in] file  File where informations are printed.
- * \param[in] body  The body whose information has to be printed.
- * \param[in] level Number of spaces before printing, for each line.
- */
-void osl_body_idump(FILE * file, osl_body_p body, int level) {
-  int j;
-
-  // Go to the right level.
-  for (j = 0; j < level; j++)
-    fprintf(file, "|\t");
-
-  if (body != NULL) {
-    fprintf(file, "+-- osl_body_t\n");
-
-    // A blank line.
-    for (j = 0; j <= level+1; j++)
-      fprintf(file, "|\t");
-    fprintf(file, "\n");
-
-    // Print the iterators
-    osl_strings_idump(file, body->iterators, level + 1);
-
-    // Print the original body expression.
-    osl_strings_idump(file, body->expression, level + 1);
-  }
-  else {
-    fprintf(file, "+-- NULL body\n");
-  }
-  
-  // The last line.
-  for (j = 0; j <= level; j++)
-    fprintf(file, "|\t");
-  fprintf(file, "\n");
-}
-
-
-/**
- * osl_body_dump function:
- * this function prints the content of an osl_body_t structure
- * (*body) into  a file (file, possibly stdout).
- * \param[in] file File where informations are printed.
- * \param[in] body The body whose information has to be printed.
- */
-void osl_body_dump(FILE * file, osl_body_p body) {
-  osl_body_idump(file, body, 0);
-}
-
-
-/**
- * osl_body_print function:
- * this function prints the content of an osl_body_t structure
- * (*body) into a file (file, possibly stdout) in the OpenScop format.
- * \param[in] file  File where informations are printed.
- * \param[in] body  The body whose information has to be printed.
- */
-void osl_body_print(FILE * file, osl_body_p body) {
-  int nb_iterators;
-
-  if (body != NULL) {
-    nb_iterators = osl_strings_size(body->iterators);
-    fprintf(file, "# Number of original iterators\n");
-    fprintf(file, "%d\n", nb_iterators);
-
-    if (nb_iterators > 0) {
-      fprintf(file, "\n# List of original iterators\n");
-      osl_strings_print(file, body->iterators);
-    }
-
-    fprintf(file, "\n# Statement body expression\n");
-    osl_strings_print(file, body->expression);
-  }
-  else {
-    fprintf(file, "# NULL statement body\n");
-  }
-}
-
-
-/**
- * osl_body_sprint function:
- * this function prints the content of an osl_body_t structure
- * (*body) into a string (returned) in the OpenScop textual format.
- * \param[in] body The body structure which has to be printed.
- * \return A string containing the OpenScop dump of the body structure.
- */
-char * osl_body_sprint(osl_body_p body) {
-  int nb_iterators;
-  int high_water_mark = OSL_MAX_STRING;
-  char * string = NULL;
-  char buffer[OSL_MAX_STRING];
-  char * iterators, * expression;
-
-  OSL_malloc(string, char *, high_water_mark * sizeof(char));
-  string[0] = '\0';
-  
-  if (body != NULL) {
-    nb_iterators = osl_strings_size(body->iterators);
-    sprintf(buffer, "# Number of original iterators\n%d\n", nb_iterators);
-    osl_util_safe_strcat(&string, buffer, &high_water_mark);
-
-    if (nb_iterators > 0) {
-      sprintf(buffer, "# List of original iterators\n");
-      osl_util_safe_strcat(&string, buffer, &high_water_mark);
-      iterators = osl_strings_sprint(body->iterators);
-      osl_util_safe_strcat(&string, iterators, &high_water_mark);
-      free(iterators);
-    }
-
-    sprintf(buffer, "# Statement body expression\n");
-    osl_util_safe_strcat(&string, buffer, &high_water_mark);
-    expression = osl_strings_sprint(body->expression);
-    osl_util_safe_strcat(&string, expression, &high_water_mark);
-    free(expression);
-  }
-  else {
-    sprintf(buffer, "# NULL body\n");
-    osl_util_safe_strcat(&string, buffer, &high_water_mark);
-  }
-
-  return string;
-}
-
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-
-
-/**
- * osl_body_read function:
- * this function reads a body structure from a string complying to the
- * OpenScop textual format and returns a pointer to this body structure.
- * The input string should only contain the body this function
- * has to read (comments at the end of the line are accepted). The input
- * parameter is updated to the position in the input string this function
- * reach right after reading the strings structure.
- * \param[in,out] input The input string where to find a body structure.
- *                      Updated to the position after what has been read.
- * \return A pointer to the body structure that has been read.
- */
-osl_body_p osl_body_sread(char ** input) {
-  osl_body_p body = NULL;
-  char * expression;
-  int nb_iterators;
-
-  if (input) {
-    body = osl_body_malloc();
-    
-    // Read the number of iterators.
-    nb_iterators = osl_util_read_int(NULL, input);
-    
-    // Read the iterator strings if any.
-    if (nb_iterators > 0)
-      body->iterators = osl_strings_sread(input);
-
-    // Read the body:
-    // - Skip blank/commented lines and spaces before the body.
-    osl_util_sskip_blank_and_comments(input);
-      
-    // - Remove the comments after the body.
-    expression = *input;
-    while (*input && **input != '#' && **input != '\n')
-      (*input)++;
-    
-    if (*input && **input == '#') {
-      **input = '\0';
-      while (**input != '\n')
-        (*input)++;
-    }
-    else {
-      if (*input && **input == '\n') {
-        **input = '\0';
-        (*input)++;
-      }
-    }
-
-    // - Copy the body.
-    body->expression = osl_strings_encapsulate(strdup(expression));
-  }
-
-  return body;
-}
-
-
-/*+***************************************************************************
- *                   Memory allocation/deallocation functions                *
- *****************************************************************************/
-
-
-/**
- * osl_body_malloc function:
- * this function allocates the memory space for an osl_body_t
- * structure and sets its fields with default values. Then it returns a pointer
- * to the allocated space.
- * \return A pointer to an empty body with fields set to default values.
- */
-osl_body_p osl_body_malloc() {
-  osl_body_p body;
-
-  OSL_malloc(body, osl_body_p, sizeof(osl_body_t));
-  body->iterators    = NULL;
-  body->expression   = NULL;
-
-  return body;
-}
-
-
-/**
- * osl_body_free function:
- * this function frees the allocated memory for an osl_body_t
- * structure.
- * \param[in,out] body The pointer to the body we want to free.
- */
-void osl_body_free(osl_body_p body) {
-
-  if (body != NULL) {
-    osl_strings_free(body->iterators);
-    osl_strings_free(body->expression);
-    free(body);
-  }
-}
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-
-
-/**
- * osl_body_clone function:
- * this functions builds and returns a "hard copy" (not a pointer copy) of an
- * osl_body_t data structure provided as parameter. However, let us
- * recall here that non-string elements are untouched by the OpenScop Library.
- * \param[in] body The pointer to the body we want to copy.
- * \return A pointer to the full copy of the body provided as parameter.
- */
-osl_body_p osl_body_clone(osl_body_p body) {
-  osl_body_p copy = NULL;
-
-  if (body != NULL) {
-    copy = osl_body_malloc();
-    copy->iterators  = osl_strings_clone(body->iterators);
-    copy->expression = osl_strings_clone(body->expression);
-  }
-
-  return copy;
-}
-
-
-/**
- * osl_body_equal function:
- * this function returns true if the two bodies are the same, false
- * otherwise (the usr field is not tested). However, let us
- * recall here that non-string elements are untouched by the OpenScop Library.
- * \param[in] b1 The first body.
- * \param[in] b2 The second body.
- * \return 1 if b1 and b2 are the same (content-wise), 0 otherwise.
- */
-int osl_body_equal(osl_body_p b1, osl_body_p b2) {
-  
-  if (b1 == b2)
-    return 1;
- 
-  if (((b1 != NULL) && (b2 == NULL)) ||
-      ((b1 == NULL) && (b2 != NULL))) {
-    OSL_info("bodies are not the same"); 
-    return 0;
-  }
-
-  if (!osl_strings_equal(b1->iterators, b2->iterators)) {
-    OSL_info("body iterators are not the same");
-    return 0;
-  }
-  
-  if (!osl_strings_equal(b1->expression, b2->expression)) {
-    OSL_info("body expressions are not the same");
-    return 0;
-  }
-
-  return 1;
-}
-
-
-/**
- * osl_body_interface function:
- * this function creates an interface structure corresponding to the body
- * structure and returns it).
- * \return An interface structure for the body structure.
- */
-osl_interface_p osl_body_interface() {
-  osl_interface_p interface = osl_interface_malloc();
-  
-  interface->URI    = strdup(OSL_URI_BODY);
-  interface->idump  = (osl_idump_f)osl_body_idump;
-  interface->sprint = (osl_sprint_f)osl_body_sprint;
-  interface->sread  = (osl_sread_f)osl_body_sread;
-  interface->malloc = (osl_malloc_f)osl_body_malloc;
-  interface->free   = (osl_free_f)osl_body_free;
-  interface->clone  = (osl_clone_f)osl_body_clone;
-  interface->equal  = (osl_equal_f)osl_body_equal;
-
-  return interface;
-}
-
diff --git a/cloog-0.17.0/osl/source/extensions/arrays.c b/cloog-0.17.0/osl/source/extensions/arrays.c
deleted file mode 100644
index bb48bb9..0000000
--- a/cloog-0.17.0/osl/source/extensions/arrays.c
+++ /dev/null
@@ -1,456 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                      extensions/arrays.c                        **
-     **-----------------------------------------------------------------**
-     **                   First version: 07/12/2010                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#include <osl/macros.h>
-#include <osl/util.h>
-#include <osl/strings.h>
-#include <osl/interface.h>
-#include <osl/extensions/arrays.h>
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-
-
-/**
- * osl_arrays_print_structure function:
- * this function displays a osl_arrays_t structure (*arrays) into a file
- * (file, possibly stdout) in a way that trends to be understandable. It
- * includes an indentation level (level) in order to work with others
- * idump functions.
- * \param file   The file where the information has to be printed.
- * \param arrays The arrays structure whose information has to be printed.
- * \param level  Number of spaces before printing, for each line.
- */
-void osl_arrays_idump(FILE * file, osl_arrays_p arrays, int level) {
-  int i, j;
-
-  // Go to the right level.
-  for (j = 0; j < level; j++)
-    fprintf(file, "|\t");
-
-  if (arrays != NULL)
-    fprintf(file, "+-- osl_arrays_t\n");
-  else
-    fprintf(file, "+-- NULL arrays\n");
-
-  if (arrays != NULL) {
-    // Go to the right level.
-    for(j = 0; j <= level; j++)
-      fprintf(file, "|\t");
-  
-    // Display the number of names.
-    fprintf(file, "nb_names: %d\n", arrays->nb_names);
-
-    // Display the id/name.
-    for(i = 0; i < arrays->nb_names; i++) {
-      // Go to the right level.
-      for(j = 0; j <= level; j++)
-        fprintf(file, "|\t");
-      
-      fprintf(file, "id: %2d, name: %s\n", arrays->id[i], arrays->names[i]);
-    }
-  }
-
-  // The last line.
-  for (j = 0; j <= level; j++)
-    fprintf(file, "|\t");
-  fprintf(file, "\n");
-}
-
-
-/**
- * osl_arrays_print function:
- * this function prints the content of an osl_arrays_t structure
- * (*arrays) into a file (file, possibly stdout).
- * \param file   The file where the information has to be printed.
- * \param arrays The arrays structure whose information has to be printed.
- */
-void osl_arrays_dump(FILE * file, osl_arrays_p arrays) {
-  osl_arrays_idump(file, arrays, 0);
-}
-
-
-/**
- * osl_arrays_print_openscop function:
- * this function prints the content of an osl_arrays_t structure
- * (*arrays) into a string (returned) in the OpenScop textual format.
- * \param  arrays The arrays structure whose information has to be printed.
- * \return A string containing the OpenScop dump of the arrays structure.
- */
-char * osl_arrays_sprint(osl_arrays_p arrays) {
-  int i;
-  int high_water_mark = OSL_MAX_STRING;
-  char * string = NULL;
-  char * buffer;
-
-  if (arrays != NULL) {
-    OSL_malloc(string, char *, high_water_mark * sizeof(char));
-    OSL_malloc(buffer, char *, OSL_MAX_STRING * sizeof(char));
-    string[0] = '\0';
-
-    sprintf(buffer, OSL_TAG_ARRAYS_START);
-    osl_util_safe_strcat(&string, buffer, &high_water_mark);
-
-    sprintf(buffer, "\n%d\n", arrays->nb_names);
-    osl_util_safe_strcat(&string, buffer, &high_water_mark);
-
-    for (i = 0; i < arrays->nb_names; i++) {
-      sprintf(buffer, "%d %s\n", arrays->id[i], arrays->names[i]);
-      osl_util_safe_strcat(&string, buffer, &high_water_mark);
-    }
-    sprintf(buffer, OSL_TAG_ARRAYS_STOP"\n");
-    osl_util_safe_strcat(&string, buffer, &high_water_mark);
-
-    OSL_realloc(string, char *, (strlen(string) + 1) * sizeof(char));
-    free(buffer);
-  }
-
-  return string;
-}
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-
-
-/**
- * osl_arrays_sread function:
- * this function reads an arrays structure from a string complying to the
- * OpenScop textual format and returns a pointer to this arrays structure.
- * The string should contain only one textual format of an arrays structure.
- * \param  extensions The input string where to find an arrays structure.
- * \return A pointer to the arrays structure that has been read.
- */
-osl_arrays_p osl_arrays_sread(char ** extensions_fixme) {
-  int i, k, array_id;
-  int  nb_names;
-  int  *  id;
-  char ** names;
-  char * content, * content_backup;
-  char buff[OSL_MAX_STRING];
-  osl_arrays_p arrays;
-
-  // FIXME: this is a quick and dirty thing to accept char ** instead
-  //        of char * in the parameter: really do it and update the
-  //        pointer to after what has been read.
-  content = *extensions_fixme;
-
-  if (content == NULL) {
-    OSL_debug("no arrays optional tag");
-    return NULL;
-  }
-  content_backup = content;
-
-  // Find the number of names provided.
-  nb_names = osl_util_read_int(NULL, &content);
-
-  // Allocate the array of id and names.
-  id = (int *)malloc(nb_names * sizeof(int));
-  names = (char **)malloc(nb_names * sizeof(char *));
-  for (i = 0; i < nb_names; i++)
-    names[i] = NULL;
-
-  // Get each array name.
-  for (k = 0; k < nb_names; k++) { 
-    // Skip blank or commented lines.
-    while (*content == '#' || *content == '\n') {
-      for (; *content != '\n'; ++content)
-        continue;
-      ++content;
-    }
-
-    // Get the array name id.
-    for (i = 0; *content && ! isspace(*content); ++i, ++content)
-      buff[i] = *content;
-    buff[i] = '\0';
-    sscanf(buff, "%d", &array_id);
-    if (array_id <= 0)
-      OSL_error("array id must be > 0");
-    id[k] = array_id;
-
-    // Get the array name string.
-    while (*content && isspace(*content))
-      ++content;
-    for (i = 0; *content && ! isspace(*content); ++i, ++content)
-      buff[i] = *content;
-    buff[i] = '\0';
-    names[k] = strdup(buff);
-
-    // Go to the end of line.
-    while (*content && *content != '\n')
-      ++content;
-  }
-  free(content_backup);
-
-  arrays = osl_arrays_malloc();
-  arrays->nb_names = nb_names;
-  arrays->id       = id;
-  arrays->names    = names;
-
-  return arrays;
-}
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-
-
-/**
- * osl_arrays_malloc function:
- * This function allocates the memory space for an osl_arrays_t
- * structure and sets its fields with default values. Then it returns a
- * pointer to the allocated space.
- * \return A pointer to an empty arrays structure with fields set to
- *         default values.
- */
-osl_arrays_p osl_arrays_malloc() {
-  osl_arrays_p arrays;
-
-  OSL_malloc(arrays, osl_arrays_p, sizeof(osl_arrays_t));
-  arrays->nb_names = 0;
-  arrays->id       = NULL;
-  arrays->names    = NULL;
-
-  return arrays;
-}
-
-
-/**
- * osl_arrays_free function:
- * This function frees the allocated memory for an arrays structure.
- * \param arrays The pointer to the arrays structure we want to free.
- */
-void osl_arrays_free(osl_arrays_p arrays) {
-  int i;
-
-  if (arrays != NULL) {
-    if (arrays->names != NULL) {
-      free(arrays->id);
-      for (i = 0; i < arrays->nb_names; i++)
-        free(arrays->names[i]);
-      free(arrays->names);
-    }
-
-    free(arrays);
-  }
-}
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-
-
-/**
- * osl_arrays_clone function:
- * This function builds and returns a "hard copy" (not a pointer copy) of an
- * osl_arrays_t data structure.
- * \param arrays The pointer to the arrays structure we want to copy.
- * \return A pointer to the copy of the arrays structure.
- */
-osl_arrays_p osl_arrays_clone(osl_arrays_p arrays) {
-  osl_arrays_p copy;
-  int i;
-
-  if (arrays == NULL)
-    return NULL;
-
-  copy = osl_arrays_malloc();
-  if (copy != NULL) {
-    copy->nb_names = arrays->nb_names;
-    copy->id = (int *)malloc(arrays->nb_names * sizeof(int));
-    OSL_malloc(copy->names, char **, arrays->nb_names * sizeof(char*));
-    
-    for (i = 0; i < arrays->nb_names; i++) {
-      copy->id[i] = arrays->id[i];
-      copy->names[i] = strdup(arrays->names[i]);
-      if ((copy->names[i] == NULL) && (arrays->names[i] != NULL))
-        OSL_error("memory overflow");
-    }
-  }
-
-  return copy;
-}
-
-
-/**
- * osl_arrays_equal function:
- * this function returns true if the two arrays structures are the same
- * (content-wise), false otherwise. This functions considers two arrays
- * structures as equal if the order of the array names differ, however the
- * identifiers and names must be the same.
- * \param a1  The first arrays structure.
- * \param a2  The second arrays structure.
- * \return 1 if a1 and a2 are the same (content-wise), 0 otherwise.
- */
-int osl_arrays_equal(osl_arrays_p a1, osl_arrays_p a2) {
-  int i, j, found;
-
-  if (a1 == a2)
-    return 1;
-
-  if (((a1 == NULL) && (a2 != NULL)) || ((a1 != NULL) && (a2 == NULL)))
-    return 0;
-
-  // Check whether the number of names is the same.
-  if (a1->nb_names != a2->nb_names)
-    return 0;
-
-  // We accept a different order of the names, as long as the identifiers
-  // are the same.
-  for (i = 0; i < a1->nb_names; i++) {
-    found = 0;
-    for (j = 0; j < a2->nb_names; j++) {
-      if ((a1->id[i] == a2->id[j]) && (!strcmp(a1->names[i], a2->names[j]))) {
-        found = 1;
-        break;
-      }
-    }
-    if (found != 1)
-      return 0;
-  }
-
-  return 1;
-}
-
-
-/**
- * osl_arrays_generate_names function:
- * This function generates an array of strings corresponding to array names.
- * The ith string will correspond to the array name with identifier i in the
- * arrays structure. If some identifiers are missing, the corresponding names
- * will be generated. The size of the array of strings corresponds to the
- * maximum identifier, it is returned using the parameter nb_names.
- * \param arrays   The source of some array names.
- * \param nb_names Pointer to the location to store the number of names.
- * \return An array of strings corresponding to the array names.
- */
-char ** osl_arrays_generate_names(osl_arrays_p arrays, int * nb_names) {
-  char ** names = NULL;
-  char ** tmpnames;
-  int i;
-
-  *nb_names = 0;
-
-  if (arrays != NULL) {
-    // Get the maximum id (it will be nb_names).
-    for (i = 0; i < arrays->nb_names; i++)
-      if (arrays->id[i] > *nb_names)
-	*nb_names = arrays->id[i];
-  
-    // Allocate the array of names and store the existing names.
-    OSL_malloc(names, char **, *nb_names * sizeof(char *));
-    for (i = 0; i < arrays->nb_names; i++) {
-      names[arrays->id[i] - 1] = strdup(arrays->names[i]);
-      if (names[arrays->id[i] - 1] == NULL)
-	OSL_error("memory overflow");
-    }
-
-    // Fill the missing names.
-    // TODO : update this with the new osl_strings_t
-    /*
-    tmpnames = osl_strings_generate("A_", *nb_names);
-    for (i = 0; i < *nb_names; i++) {
-      if (names[i] == NULL || names[i][0] == '\0')
-	names[i] = tmpnames[i]; // Use a generated name.
-      else
-	free(tmpnames[i]);      // Use a read name.
-    }
-    free(tmpnames);
-    */
-  }
-
-  return names;
-}
-
-
-/**
- * osl_arrays_interface function:
- * this function creates an interface structure corresponding to the arrays
- * extension and returns it).
- * \return An interface structure for the arrays extension.
- */
-osl_interface_p osl_arrays_interface() {
-  osl_interface_p interface = osl_interface_malloc();
-  
-  interface->URI    = strdup(OSL_URI_ARRAYS);
-  interface->idump  = (osl_idump_f)osl_arrays_idump;
-  interface->sprint = (osl_sprint_f)osl_arrays_sprint;
-  interface->sread  = (osl_sread_f)osl_arrays_sread;
-  interface->malloc = (osl_malloc_f)osl_arrays_malloc;
-  interface->free   = (osl_free_f)osl_arrays_free;
-  interface->clone  = (osl_clone_f)osl_arrays_clone;
-  interface->equal  = (osl_equal_f)osl_arrays_equal;
-
-  return interface;
-}
-
-
diff --git a/cloog-0.17.0/osl/source/extensions/comment.c b/cloog-0.17.0/osl/source/extensions/comment.c
deleted file mode 100644
index 12c81e1..0000000
--- a/cloog-0.17.0/osl/source/extensions/comment.c
+++ /dev/null
@@ -1,306 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                     extensions/comment.c                        **
-     **-----------------------------------------------------------------**
-     **                   First version: 07/12/2010                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <osl/macros.h>
-#include <osl/util.h>
-#include <osl/interface.h>
-#include <osl/extensions/comment.h>
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-
-
-/**
- * osl_comment_idump function:
- * this function displays an osl_comment_t structure (*comment) into a
- * file (file, possibly stdout) in a way that trends to be understandable. It
- * includes an indentation level (level) in order to work with others
- * idump functions.
- * \param[in] file    The file where the information has to be printed.
- * \param[in] comment The comment structure to print.
- * \param[in] level   Number of spaces before printing, for each line.
- */
-void osl_comment_idump(FILE * file, osl_comment_p comment, int level) {
-  int j;
-  char * tmp;
-
-  // Go to the right level.
-  for (j = 0; j < level; j++)
-    fprintf(file, "|\t");
-
-  if (comment != NULL)
-    fprintf(file, "+-- osl_comment_t\n");
-  else
-    fprintf(file, "+-- NULL comment\n");
-
-  if (comment != NULL) {
-    // Go to the right level.
-    for(j = 0; j <= level; j++)
-      fprintf(file, "|\t");
-  
-    // Display the comment message (without any carriage return).
-    tmp = strdup(comment->comment);
-    for (j = 0; j < strlen(tmp); j++)
-      if (tmp[j] == '\n')
-	tmp[j] = ' ';
-    fprintf(file, "comment: %s\n", tmp);
-    free(tmp);
-  }
-
-  // The last line.
-  for (j = 0; j <= level; j++)
-    fprintf(file, "|\t");
-  fprintf(file, "\n");
-}
-
-
-/**
- * osl_comment_dump function:
- * this function prints the content of an osl_comment_t structure
- * (*comment) into a file (file, possibly stdout).
- * \param[in] file    The file where the information has to be printed.
- * \param[in] comment The comment structure to print.
- */
-void osl_comment_dump(FILE * file, osl_comment_p comment) {
-  osl_comment_idump(file, comment, 0);
-}
-
-
-/**
- * osl_comment_sprint function:
- * this function prints the content of an osl_comment_t structure
- * (*comment) into a string (returned) in the OpenScop textual format.
- * \param[in] comment The comment structure to print.
- * \return A string containing the OpenScop dump of the comment structure.
- */
-char * osl_comment_sprint(osl_comment_p comment) {
-  int high_water_mark = OSL_MAX_STRING;
-  char * string = NULL;
-  char * buffer;
-
-  if (comment != NULL) {
-    OSL_malloc(string, char *, high_water_mark * sizeof(char));
-    OSL_malloc(buffer, char *, OSL_MAX_STRING * sizeof(char));
-    string[0] = '\0';
-   
-    // Print the comment.
-    sprintf(buffer, "%s", comment->comment);
-    osl_util_safe_strcat(&string, buffer, &high_water_mark);
-
-    // Keep only the memory space we need.
-    OSL_realloc(string, char *, (strlen(string) + 1) * sizeof(char));
-    free(buffer);
-  }
-
-  return string;
-}
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-
-/**
- * osl_comment_sread function:
- * this function reads a comment structure from a string complying to the
- * OpenScop textual format and returns a pointer to this comment structure.
- * The input parameter is updated to the position in the input string this
- * function reach right after reading the comment structure.
- * \param[in,out] input The input string where to find a comment.
- *                      Updated to the position after what has been read.
- * \return A pointer to the comment structure that has been read.
- */
-osl_comment_p osl_comment_sread(char ** input) {
-  osl_comment_p comment;
-
-  if (*input == NULL) {
-    OSL_debug("no comment optional tag");
-    return NULL;
-  }
-
-  if (strlen(*input) > OSL_MAX_STRING) 
-    OSL_error("comment too long");
-
-  // Build the comment structure
-  comment = osl_comment_malloc();
-  OSL_strdup(comment->comment, *input);
-
-  // Update the input pointer (everything has been read).
-  input += strlen(*input);
-
-  return comment;
-}
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-
-
-/**
- * osl_comment_malloc function:
- * this function allocates the memory space for an osl_comment_t
- * structure and sets its fields with default values. Then it returns a
- * pointer to the allocated space.
- * \return A pointer to an empty comment structure with fields set to
- *         default values.
- */
-osl_comment_p osl_comment_malloc() {
-  osl_comment_p comment;
-
-  OSL_malloc(comment, osl_comment_p, sizeof(osl_comment_t));
-  comment->comment = NULL;
-
-  return comment;
-}
-
-
-/**
- * osl_comment_free function:
- * this function frees the allocated memory for an osl_comment_t
- * structure.
- * \param[in,out] comment The pointer to the comment structure to free.
- */
-void osl_comment_free(osl_comment_p comment) {
-  if (comment != NULL) {
-    if(comment->comment != NULL)
-      free(comment->comment);
-    free(comment);
-  }
-}
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-
-
-/**
- * osl_comment_clone function:
- * this function builds and returns a "hard copy" (not a pointer copy) of an
- * osl_comment_t data structure.
- * \param[in] comment The pointer to the comment structure to clone.
- * \return A pointer to the clone of the comment structure.
- */
-osl_comment_p osl_comment_clone(osl_comment_p comment) {
-  osl_comment_p clone;
-
-  if (comment == NULL)
-    return NULL;
-
-  clone = osl_comment_malloc();
-  OSL_strdup(clone->comment, comment->comment);
-
-  return clone;
-}
-
-
-/**
- * osl_comment_equal function:
- * this function returns true if the two comment structures are the same
- * (content-wise), false otherwise.
- * \param[in] c1  The first comment structure.
- * \param[in] c2  The second comment structure.
- * \return 1 if c1 and c2 are the same (content-wise), 0 otherwise.
- */
-int osl_comment_equal(osl_comment_p c1, osl_comment_p c2) {
-  
-  if (c1 == c2)
-    return 1;
-
-  if (((c1 == NULL) && (c2 != NULL)) || ((c1 != NULL) && (c2 == NULL)))
-    return 0;
-
-  if (strcmp(c1->comment, c2->comment))
-    return 0;
-
-  return 1;
-}
-
-
-/**
- * osl_comment_interface function:
- * this function creates an interface structure corresponding to the comment
- * extension and returns it).
- * \return An interface structure for the comment extension.
- */
-osl_interface_p osl_comment_interface() {
-  osl_interface_p interface = osl_interface_malloc();
-  
-  interface->URI    = strdup(OSL_URI_COMMENT);
-  interface->idump  = (osl_idump_f)osl_comment_idump;
-  interface->sprint = (osl_sprint_f)osl_comment_sprint;
-  interface->sread  = (osl_sread_f)osl_comment_sread;
-  interface->malloc = (osl_malloc_f)osl_comment_malloc;
-  interface->free   = (osl_free_f)osl_comment_free;
-  interface->clone  = (osl_clone_f)osl_comment_clone;
-  interface->equal  = (osl_equal_f)osl_comment_equal;
-
-  return interface;
-}
-
diff --git a/cloog-0.17.0/osl/source/extensions/irregular.c b/cloog-0.17.0/osl/source/extensions/irregular.c
deleted file mode 100644
index a72cdb1..0000000
--- a/cloog-0.17.0/osl/source/extensions/irregular.c
+++ /dev/null
@@ -1,764 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                     extensions/irregular.c                      **
-     **-----------------------------------------------------------------**
-     **                   First version: 07/12/2010                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <osl/macros.h>
-#include <osl/util.h>
-#include <osl/strings.h>
-#include <osl/interface.h>
-#include <osl/extensions/irregular.h>
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-
-
-/**
- * osl_irregular_idump function:
- * this function displays an osl_irregular_t structure (*irregular) into a
- * file (file, possibly stdout) in a way that trends to be understandable. It
- * includes an indentation level (level) in order to work with others
- * idump functions.
- * \param file    The file where the information has to be printed.
- * \param irregular The irregular structure whose information has to be printed.
- * \param level   Number of spaces before printing, for each line.
- */
-void osl_irregular_idump(FILE * file, osl_irregular_p irregular, int level) {
-  int i,j;
-
-  // Go to the right level.
-  for (j = 0; j < level; j++)
-    fprintf(file, "|\t");
-
-  if (irregular != NULL)
-    fprintf(file, "+-- osl_irregular_t\n");
-  else
-    fprintf(file, "+-- NULL irregular\n");
-
-  if (irregular != NULL) {
-    // Go to the right level.
-    for(j = 0; j <= level; j++)
-      fprintf(file, "|\t");
-  
-    // Display the irregular contents.
-
-    // Print statements
-    for (i = 0; i < irregular->nb_statements; i++) {
-      fprintf(file, "statement%d's predicats : ", i);
-      for(j = 0; j < irregular->nb_predicates[i]; j++)
-        fprintf(file, "%d ", irregular->predicates[i][j]);
-      fprintf(file, "\n");
-    }
-    // Print predicats
-    // controls :
-    for (i = 0; i < irregular->nb_control; i++) {
-      fprintf(file, "predicat%d's\niterators : ", i);
-      for(j = 0; j < irregular->nb_iterators[i]; j++)
-        fprintf(file, "%s ", irregular->iterators[i][j]);
-      fprintf(file, "\ncontrol body: %s\n", irregular->body[i]);
-    }
-    // exits :
-    for(i = irregular->nb_control;
-        i < irregular->nb_control + irregular->nb_exit; i++) {
-      fprintf(file, "predicat%d's\niterators : ", i);
-      for(j = 0; j < irregular->nb_iterators[i]; j++)
-        fprintf(file, "%s ", irregular->iterators[i][j]);
-      fprintf(file, "\nexit body: %s\n", irregular->body[i]);
-    }
-  }
-
-  // The last line.
-  for (j = 0; j <= level; j++)
-    fprintf(file, "|\t");
-  fprintf(file, "\n");
-}
-
-
-/**
- * osl_irregular_dump function:
- * this function prints the content of an osl_irregular_t structure
- * (*irregular) into a file (file, possibly stdout).
- * \param file    The file where the information has to be printed.
- * \param irregular The irregular structure whose information has to be printed.
- */
-void osl_irregular_dump(FILE * file, osl_irregular_p irregular) {
-  osl_irregular_idump(file, irregular, 0);
-}
-
-
-/**
- * osl_irregular_sprint function:
- * this function prints the content of an osl_irregular_t structure
- * (*irregular) into a string (returned) in the OpenScop textual format.
- * \param  irregular The irregular structure whose information has to be printed.
- * \return A string containing the OpenScop dump of the irregular structure.
- */
-char * osl_irregular_sprint(osl_irregular_p irregular) {
-  int high_water_mark = OSL_MAX_STRING,i,j;
-  char * string = NULL;
-  char * buffer;
-
-  if (irregular != NULL) {
-    OSL_malloc(string, char *, high_water_mark * sizeof(char));
-    OSL_malloc(buffer, char *, OSL_MAX_STRING * sizeof(char));
-    string[0] = '\0';
-   
-    // Print the begin tag.
-    sprintf(buffer, OSL_TAG_IRREGULAR_START);
-    osl_util_safe_strcat(&string, buffer, &high_water_mark);
-
-    // Print the content.
-    sprintf(buffer, "\n%d\n", irregular->nb_statements);
-    for(i=0; i<irregular->nb_statements; i++) {
-      sprintf(buffer, "%s%d ", buffer, irregular->nb_predicates[i]);
-      for(j=0; j<irregular->nb_predicates[i]; j++) {
-        sprintf(buffer, "%s%d ", buffer, irregular->predicates[i][j]);
-      }
-      sprintf(buffer, "%s\n", buffer);
-    }
-    // Print the predicates.
-    // controls:
-    sprintf(buffer, "%s%d\n", buffer, irregular->nb_control);
-    sprintf(buffer, "%s%d\n", buffer, irregular->nb_exit);
-    for(i=0; i<irregular->nb_control; i++) {
-      sprintf(buffer, "%s%d ", buffer, irregular->nb_iterators[i]);
-      for(j=0; j<irregular->nb_iterators[i];j++)
-        sprintf(buffer, "%s%s ", buffer, irregular->iterators[i][j]);
-      sprintf(buffer, "%s\n%s\n", buffer, irregular->body[i]);
-    }
-    // exits: 
-    for(i=0; i<irregular->nb_exit; i++) {
-      sprintf(buffer, "%s%d ", buffer, irregular->nb_iterators[
-                                        irregular->nb_control + i]);
-      for(j=0; j<irregular->nb_iterators[irregular->nb_control + i];j++)
-        sprintf(buffer, "%s%s ", buffer, irregular->iterators[
-                                          irregular->nb_control+i][j]);
-      sprintf(buffer, "%s\n%s\n", buffer, irregular->body[
-                                          irregular->nb_control + i]);
-    }
-
-    osl_util_safe_strcat(&string, buffer, &high_water_mark);
-
-    // Print the end tag.
-    sprintf(buffer, OSL_TAG_IRREGULAR_STOP"\n");
-    osl_util_safe_strcat(&string, buffer, &high_water_mark);
-  
-    // Keep only the memory space we need.
-    OSL_realloc(string, char *, (strlen(string) + 1) * sizeof(char));
-    free(buffer);
-  }
-
-  return string;
-}
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-
-/**
- * osl_irregular_sread function:
- * this function reads a irregular structure from a string complying to the
- * OpenScop textual format and returns a pointer to this irregular structure.
- * The string should contain only one textual format of a irregular structure.
- * \param  extensions The input string where to find a irregular structure.
- * \return A pointer to the irregular structure that has been read.
- */
-osl_irregular_p osl_irregular_sread(char ** extensions_fixme) {
-  char * content,*tok;
-  int i,j;
-  osl_irregular_p irregular;
-
-  // FIXME: this is a quick and dirty thing to accept char ** instead
-  //        of char * in the parameter: really do it and update the
-  //        pointer to after what has been read.
-  content = *extensions_fixme;
-
-  if (content == NULL) {
-    OSL_debug("no irregular optional tag");
-    return NULL;
-  }
-
-  if (strlen(content) > OSL_MAX_STRING)
-    OSL_error("irregular too long");
-
-  irregular = osl_irregular_malloc();
-
-  // nb statements
-  tok = strtok(content," \n");
-  irregular->nb_statements = atoi(tok);
-  OSL_malloc(irregular->predicates, int **, 
-                  sizeof(int*) * irregular->nb_statements);
-  OSL_malloc(irregular->nb_predicates, int *, 
-                  sizeof(int) * irregular->nb_statements);
-  
-  // get predicats
-  for(i = 0; i < irregular->nb_statements; i++) {
-    // nb conditions
-    tok = strtok(NULL," \n");
-    irregular->nb_predicates[i] = atoi(tok);
-    OSL_malloc(irregular->predicates[i], int *,
-                    sizeof(int) * irregular->nb_predicates[i]);
-    for(j = 0; j < irregular->nb_predicates[i]; j++){
-      tok = strtok(NULL, " \n");
-      irregular->predicates[i][j] = atoi(tok);
-    }
-  }
-  // Get nb predicat
-  // control and exits :
-  tok = strtok(NULL, " \n");
-  irregular->nb_control=atoi(tok);
-  tok = strtok(NULL, " \n");
-  irregular->nb_exit = atoi(tok);
-
-  int nb_predicates = irregular->nb_control + irregular->nb_exit;
-
-  OSL_malloc(irregular->iterators, char ***,
-                  sizeof(char **) * nb_predicates);
-  OSL_malloc(irregular->nb_iterators, int *, sizeof(int) * nb_predicates);
-  OSL_malloc(irregular->body, char **, sizeof(char *) * nb_predicates);
-  
-  for(i = 0; i < nb_predicates; i++) {
-    // Get number of iterators
-    tok = strtok(NULL, " \n");
-    irregular->nb_iterators[i] = atoi(tok);
-    OSL_malloc(irregular->iterators[i], char **,
-                    sizeof(char *) * irregular->nb_iterators[i]);
-    
-    // Get iterators
-    for(j = 0; j < irregular->nb_iterators[i]; j++)
-      irregular->iterators[i][j] = strdup(strtok(NULL, " \n"));
-    // Get predicat string
-    irregular->body[i] = strdup(strtok(NULL, "\n"));
-  }
-  
-  return irregular;
-}
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-
-
-/**
- * osl_irregular_malloc function:
- * This function allocates the memory space for an osl_irregular_t
- * structure and sets its fields with default values. Then it returns a
- * pointer to the allocated space.
- * \return A pointer to an empty irregular structure with fields set to
- *         default values.
- */
-osl_irregular_p osl_irregular_malloc() {
-  osl_irregular_p irregular;
-
-  OSL_malloc(irregular, osl_irregular_p,
-                  sizeof(osl_irregular_t));
-  irregular->nb_statements = 0;
-  irregular->predicates = NULL;
-  irregular->nb_predicates = NULL;
-  irregular->nb_control = 0;
-  irregular->nb_exit = 0;
-  irregular->nb_iterators = NULL;
-  irregular->iterators = NULL;
-  irregular->body = NULL;
-
-  return irregular;
-}
-
-
-/**
- * osl_irregular_free function:
- * This function frees the allocated memory for an osl_irregular_t
- * structure.
- * \param irregular The pointer to the irregular structure we want to free.
- */
-void osl_irregular_free(osl_irregular_p irregular) {
-  int i, j, nb_predicates;
-
-  if (irregular != NULL) {
-    for(i = 0; i < irregular->nb_statements; i++)
-      free(irregular->predicates[i]);
-    
-    if(irregular->predicates != NULL)
-      free(irregular->predicates);
-
-    nb_predicates = irregular->nb_control + irregular->nb_exit;
-    for(i = 0; i < nb_predicates; i++) {
-      for(j = 0; j < irregular->nb_iterators[i]; j++)
-        free(irregular->iterators[i][j]);
-      free(irregular->iterators[i]);
-      free(irregular->body[i]);
-    }
-    if(irregular->iterators != NULL)
-      free(irregular->iterators);
-    if(irregular->nb_iterators != NULL)
-      free(irregular->nb_iterators);
-    if(irregular->body != NULL)
-      free(irregular->body);
-    if(irregular->nb_predicates != NULL)
-      free(irregular->nb_predicates);
-    free(irregular);
-  }
-}
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-
-
-/**
- * osl_irregular_clone function:
- * This function builds and returns a "hard copy" (not a pointer copy) of an
- * osl_irregular_t data structure.
- * \param irregular The pointer to the irregular structure we want to copy.
- * \return A pointer to the copy of the irregular structure.
- */
-osl_irregular_p osl_irregular_clone(osl_irregular_p irregular) {
-  int i,j;
-  osl_irregular_p copy;
-
-  if (irregular == NULL)
-    return NULL;
-
-  copy = osl_irregular_malloc();
-  copy->nb_statements = irregular->nb_statements;
-  copy->nb_predicates = (int *)malloc(sizeof(int)*copy->nb_statements);
-  if (copy->nb_predicates == NULL)
-  {
-    fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-    exit(1);
-  }
-  copy->predicates = (int **)malloc(sizeof(int*)*copy->nb_statements);
-  if (copy->predicates == NULL)
-  {
-    fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-    exit(1);
-  }
-  for(i=0; i<copy->nb_statements; i++)
-  {
-    copy->nb_predicates[i]=irregular->nb_predicates[i];
-    copy->predicates[i] = (int *)malloc(sizeof(int)*copy->nb_predicates[i]);
-    if (copy->predicates[i] == NULL)
-    {
-      fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-      exit(1);
-    }
-    for(j=0; j<copy->nb_predicates[i]; j++)
-      copy->predicates[i][j] = irregular->predicates[i][j];
-  }
-
-  copy->nb_control  = irregular->nb_control;
-  copy->nb_exit     = irregular->nb_exit;
-  int nb_predicates = irregular->nb_control + irregular->nb_exit;
-  copy->nb_iterators = (int *)malloc(sizeof(int)*nb_predicates);
-  if (copy->nb_iterators == NULL)
-  {
-    fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-    exit(1);
-  }
-  copy->iterators = (char ***)malloc(sizeof(char**)*nb_predicates);
-  if (copy->iterators == NULL)
-  {
-    fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-    exit(1);
-  }
-  copy->body = (char **)malloc(sizeof(char*)*nb_predicates);
-  if (copy->body == NULL)
-  {
-    fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-    exit(1);
-  }
-  for(i=0; i<nb_predicates; i++)
-  {
-    copy->nb_iterators[i] = irregular->nb_iterators[i];
-    copy->iterators[i] = (char**)malloc(sizeof(char*)*copy->nb_iterators[i]);
-    if (copy->iterators[i] == NULL)
-    {
-      fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-      exit(1);
-    }
-    for(j=0;j<copy->nb_iterators[i];j++)
-      copy->iterators[i][j] = strdup(irregular->iterators[i][j]);
-    copy->body[i] = strdup(irregular->body[i]);
-  }
-
-  return copy;
-}
-
-
-/**
- * osl_irregular_equal function:
- * this function returns true if the two irregular structures are the same
- * (content-wise), false otherwise. This functions considers two irregular
- * \param c1  The first irregular structure.
- * \param c2  The second irregular structure.
- * \return 1 if c1 and c2 are the same (content-wise), 0 otherwise.
- */
-int
-osl_irregular_equal(osl_irregular_p c1, osl_irregular_p c2)
-{
-  int i,j,bool = 0;
-  if (c1 == c2)
-    return 1;
-
-  if (((c1 == NULL) && (c2 != NULL)) || ((c1 != NULL) && (c2 == NULL)))
-    return 0;
-
-  if(c1->nb_statements != c2->nb_statements ||
-     c1->nb_control    != c2->nb_control    ||
-     c1->nb_exit       != c2->nb_exit)
-    return 0;
-  i=0;
-  while(bool == 0 && i < c1->nb_statements)
-  {
-    bool = c1->nb_predicates[i] != c2->nb_predicates[i] ? 1 : 0;
-    i++;
-  }
-  if(bool != 0)
-    return 0;
-
-  i = 0;
-  while(bool == 0 && i < c1->nb_control + c1->nb_exit)
-  {
-    bool += c1->nb_iterators[i] != c2->nb_iterators[i] ? 1 : 0;
-    bool += strcmp(c1->body[i],c2->body[i]);
-    j = 0;
-    while(bool == 0 && j < c1->nb_iterators[i])
-    {
-      bool += strcmp(c1->iterators[i][j],c2->iterators[i][j]);
-      j++;
-    }
-    i++;
-  }
-  if(bool != 0)
-    return 0;
-  return 1;
-}
-
-osl_irregular_p osl_irregular_add_control(
-                                               osl_irregular_p irregular,
-                                               char** iterators,
-					       int nb_iterators,
-					       char* body)
-{
-  int i,j;
-  osl_irregular_p result=osl_irregular_malloc();
-
-  result->nb_control    = irregular->nb_control + 1;
-  result->nb_exit       = irregular->nb_exit;
-  result->nb_statements = irregular->nb_statements;
-  int nb_predicates     = result->nb_control + result->nb_exit;
-
-  result->iterators = (char***)malloc(sizeof(char**)*nb_predicates);
-  result->nb_iterators = (int*)malloc(sizeof(int)*nb_predicates);
-  result->body = (char**)malloc(sizeof(char*)*nb_predicates);
-  if (result->iterators == NULL || 
-      result->nb_iterators == NULL ||
-      result->body == NULL)
-  {
-    fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-    exit(1);
-  }
-  //copy controls
-  for(i=0; i<irregular->nb_control; i++)
-  {
-    result->nb_iterators[i] = irregular->nb_iterators[i];
-    result->body[i] = strdup(irregular->body[i]); 
-    result->iterators[i] = (char**)malloc(sizeof(char*)  *  
-                                          irregular->nb_iterators[i]);
-    if (result->iterators[i] == NULL)
-    {
-      fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-      exit(1);
-    }
-    for(j=0; j<irregular->nb_iterators[i];j++)
-      result->iterators[i][j] = strdup(irregular->iterators[i][j]);
-  }
-  //add controls
-  result->iterators[irregular->nb_control] = (char**)malloc(sizeof(char*)*nb_iterators);
-  if (result->iterators[irregular->nb_control] == NULL)
-  {
-    fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-    exit(1);
-  }
-  for(i=0; i<nb_iterators; i++)
-    result->iterators[irregular->nb_control][i] = strdup(iterators[i]);
-  result->nb_iterators[irregular->nb_control] = nb_iterators;
-  result->body[irregular->nb_control] = strdup(body);
-  //copy exits
-  for(i=result->nb_control; i<nb_predicates; i++)
-  {
-    result->nb_iterators[i] = irregular->nb_iterators[i-1];
-    result->body[i] = strdup(irregular->body[i-1]); 
-    result->iterators[i] = (char**)malloc(sizeof(char*)  *  
-                                          irregular->nb_iterators[i-1]);
-    if (result->iterators[i] == NULL)
-    {
-      fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-      exit(1);
-    }
-    for(j=0; j<irregular->nb_iterators[i-1];j++)
-      result->iterators[i][j] = strdup(irregular->iterators[i-1][j]);
-  }
-  // copy statements
-  result->nb_predicates = (int*)malloc(sizeof(int)*irregular->nb_statements);
-  result->predicates = (int**)malloc(sizeof(int*)*irregular->nb_statements);
-  if (result->nb_predicates == NULL || result->predicates == NULL)
-  {
-    fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-    exit(1);
-  }
-  for(i=0; i<irregular->nb_statements; i++)
-  { 
-    result->predicates[i] = (int*)malloc(sizeof(int)*irregular->nb_predicates[i]);
-    if (result->predicates[i] == NULL)
-    {
-      fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-      exit(1);
-    }
-    result->nb_predicates[i] = irregular->nb_predicates[i];
-    for(j=0; j<irregular->nb_predicates[i]; j++)
-      result->predicates[i][j]=irregular->predicates[i][j];
-  }
-  return result;
-}
-
-
-osl_irregular_p osl_irregular_add_exit(
-                                               osl_irregular_p irregular,
-                                               char** iterators,
-					       int nb_iterators,
-					       char* body)
-{
-  int i,j;
-  osl_irregular_p result=osl_irregular_malloc();
-
-  result->nb_control    = irregular->nb_control;
-  result->nb_exit       = irregular->nb_exit + 1;
-  result->nb_statements = irregular->nb_statements;
-  int nb_predicates     = result->nb_control + result->nb_exit;
-
-  result->iterators = (char***)malloc(sizeof(char**)*nb_predicates);
-  result->nb_iterators = (int*)malloc(sizeof(int)*nb_predicates);
-  result->body = (char**)malloc(sizeof(char*)*nb_predicates);
-  if (result->iterators == NULL || 
-      result->nb_iterators == NULL ||
-      result->body == NULL)
-  {
-    fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-    exit(1);
-  }
-  //copy controls and exits
-  for(i=0; i<nb_predicates - 1; i++)
-  {
-    result->nb_iterators[i] = irregular->nb_iterators[i];
-    result->body[i] = strdup(irregular->body[i]); 
-    result->iterators[i] = (char**)malloc(sizeof(char*)  *  
-                                          irregular->nb_iterators[i]);
-    if (result->iterators[i] == NULL)
-    {
-      fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-      exit(1);
-    }
-    for(j=0; j<irregular->nb_iterators[i];j++)
-      result->iterators[i][j] = strdup(irregular->iterators[i][j]);
-  }
-  //add exit
-  result->iterators[nb_predicates-1] = (char**)malloc(sizeof(char*)*nb_iterators);
-  if (result->iterators[nb_predicates-1] == NULL)
-  {
-    fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-    exit(1);
-  }
-
-  for(i=0; i<nb_iterators; i++)
-    result->iterators[nb_predicates-1][i] = strdup(iterators[i]);
-  result->nb_iterators[nb_predicates-1] = nb_iterators;
-  result->body[nb_predicates-1] = strdup(body);
-  // copy statements
-  result->nb_predicates = (int*)malloc(sizeof(int)*irregular->nb_statements);
-  result->predicates = (int**)malloc(sizeof(int*)*irregular->nb_statements);
-  if (result->nb_predicates == NULL || result->predicates == NULL)
-  {
-    fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-    exit(1);
-  }
-  for(i=0; i<irregular->nb_statements; i++)
-  { 
-    result->predicates[i] = (int*)malloc(sizeof(int)*irregular->nb_predicates[i]);
-    if (result->predicates[i] == NULL)
-    {
-      fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-      exit(1);
-    }
-    result->nb_predicates[i] = irregular->nb_predicates[i];
-    for(j=0; j<irregular->nb_predicates[i]; j++)
-      result->predicates[i][j]=irregular->predicates[i][j];
-  }
-  return result;
-}
-
-
-osl_irregular_p osl_irregular_add_predicates(
-                                               osl_irregular_p irregular,
-					       int* predicates, 
-					       int nb_add_predicates)
-{
-  int i,j;
-  osl_irregular_p result=osl_irregular_malloc();
-
-  result->nb_control    = irregular->nb_control;
-  result->nb_exit       = irregular->nb_exit;
-  result->nb_statements = irregular->nb_statements+1;
-  int nb_predicates     = result->nb_control + result->nb_exit;
-
-  result->iterators = (char***)malloc(sizeof(char**)*nb_predicates);
-  result->nb_iterators = (int*)malloc(sizeof(int)*nb_predicates);
-  result->body = (char**)malloc(sizeof(char*)*nb_predicates);
-  if (result->iterators == NULL || 
-      result->nb_iterators == NULL ||
-      result->body == NULL)
-  {
-    fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-    exit(1);
-  }
-  //copy controls and exits
-  for(i=0; i<nb_predicates; i++)
-  {
-    result->nb_iterators[i] = irregular->nb_iterators[i];
-    result->body[i] = strdup(irregular->body[i]); 
-    result->iterators[i] = (char**)malloc(sizeof(char*)  *  
-                                          irregular->nb_iterators[i]);
-    if (result->iterators[i] == NULL)
-    {
-      fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-      exit(1);
-    }
-    for(j=0; j<irregular->nb_iterators[i];j++)
-      result->iterators[i][j] = strdup(irregular->iterators[i][j]);
-  }
-  //copy statements
-  result->nb_predicates = (int*)malloc(sizeof(int)*result->nb_statements);
-  result->predicates = (int**)malloc(sizeof(int*)*result->nb_statements);
-  if (result->nb_predicates == NULL || 
-      result->predicates == NULL)
-  {
-    fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-    exit(1);
-  }
-  for(i=0; i<irregular->nb_statements; i++)
-  { 
-    result->predicates[i] = (int*)malloc(sizeof(int)*irregular->nb_predicates[i]);
-    if (result->predicates[i] == NULL)
-    {
-      fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-      exit(1);
-    }
-    result->nb_predicates[i] = irregular->nb_predicates[i];
-    for(j=0; j<irregular->nb_predicates[i]; j++)
-      result->predicates[i][j]=irregular->predicates[i][j];
-  }
-  //add statement
-  result->predicates[irregular->nb_statements] = (int*)malloc(sizeof(int)*nb_add_predicates);
-  if (result->predicates[irregular->nb_statements] == NULL)
-  {
-    fprintf(stderr, "[OpenScop] Error: memory overflow.\n");
-    exit(1);
-  }
-  for(i=0; i<nb_add_predicates; i++)
-    result->predicates[irregular->nb_statements][i] = predicates[i];
-  result->nb_predicates[irregular->nb_statements] = nb_add_predicates;
-
-  return result;
-
-
-}
-
-
-/**
- * osl_irregular_interface function:
- * this function creates an interface structure corresponding to the irregular
- * extension and returns it).
- * \return An interface structure for the irregular extension.
- */
-osl_interface_p osl_irregular_interface() {
-  osl_interface_p interface = osl_interface_malloc();
-  
-  interface->URI    = strdup(OSL_URI_IRREGULAR);
-  interface->idump  = (osl_idump_f)osl_irregular_idump;
-  interface->sprint = (osl_sprint_f)osl_irregular_sprint;
-  interface->sread  = (osl_sread_f)osl_irregular_sread;
-  interface->malloc = (osl_malloc_f)osl_irregular_malloc;
-  interface->free   = (osl_free_f)osl_irregular_free;
-  interface->clone  = (osl_clone_f)osl_irregular_clone;
-  interface->equal  = (osl_equal_f)osl_irregular_equal;
-
-  return interface;
-}
-
-
diff --git a/cloog-0.17.0/osl/source/extensions/lines.c b/cloog-0.17.0/osl/source/extensions/lines.c
deleted file mode 100644
index 2c1817a..0000000
--- a/cloog-0.17.0/osl/source/extensions/lines.c
+++ /dev/null
@@ -1,315 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                     extensions/lines.c                        **
-     **-----------------------------------------------------------------**
-     **                   First version: 07/12/2010                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <osl/macros.h>
-#include <osl/util.h>
-#include <osl/interface.h>
-#include <osl/extensions/lines.h>
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-
-
-/**
- * osl_lines_idump function:
- * this function displays an osl_lines_t structure (*lines) into a
- * file (file, possibly stdout) in a way that trends to be understandable. It
- * includes an indentation level (level) in order to work with others
- * idump functions.
- * \param file  The file where the information has to be printed.
- * \param lines The lines structure whose information has to be printed.
- * \param level Number of spaces before printing, for each line.
- */
-void osl_lines_idump(FILE * file, osl_lines_p lines, int level) {
-  int j;
-
-  // Go to the right level.
-  for (j = 0; j < level; j++)
-    fprintf(file, "|\t");
-
-  if (lines != NULL)
-    fprintf(file, "+-- osl_lines_t\n");
-  else
-    fprintf(file, "+-- NULL lines\n");
-
-  if (lines != NULL) {
-    // Go to the right level.
-    for(j = 0; j <= level; j++)
-      fprintf(file, "|\t");
-  
-    // Display the lines content.
-    fprintf(file, "lines: %d - %d\n", lines->start,lines->end);
-  }
-
-  // The last line.
-  for (j = 0; j <= level; j++)
-    fprintf(file, "|\t");
-  fprintf(file, "\n");
-}
-
-
-/**
- * osl_lines_dump function:
- * this function prints the content of an osl_lines_t structure
- * (*lines) into a file (file, possibly stdout).
- * \param file    The file where the information has to be printed.
- * \param lines The lines structure whose information has to be printed.
- */
-void osl_lines_dump(FILE * file, osl_lines_p lines) {
-  osl_lines_idump(file, lines, 0);
-}
-
-
-/**
- * osl_lines_sprint function:
- * this function prints the content of an osl_lines_t structure
- * (*lines) into a string (returned) in the OpenScop textual format.
- * \param  lines The lines structure whose information has to be printed.
- * \return A string containing the OpenScop dump of the lines structure.
- */
-char * osl_lines_sprint(osl_lines_p lines) {
-  int high_water_mark = OSL_MAX_STRING;
-  char * string = NULL;
-  char * buffer;
-
-  if (lines != NULL) {
-    OSL_malloc(string, char *, high_water_mark * sizeof(char));
-    OSL_malloc(buffer, char *, OSL_MAX_STRING * sizeof(char));
-    string[0] = '\0';
-   
-    // Print the begin tag.
-    sprintf(buffer, OSL_TAG_LINES_START);
-    osl_util_safe_strcat(&string, buffer, &high_water_mark);
-
-    // Print the lines content.
-    sprintf(buffer, "\n%d - %d\n", lines->start, lines->end);
-    osl_util_safe_strcat(&string, buffer, &high_water_mark);
-
-    // Print the end tag.
-    sprintf(buffer, OSL_TAG_LINES_STOP"\n");
-    osl_util_safe_strcat(&string, buffer, &high_water_mark);
-  
-    // Keep only the memory space we need.
-    OSL_realloc(string, char *, (strlen(string) + 1) * sizeof(char));
-    free(buffer);
-  }
-
-  return string;
-}
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-
-/**
- * osl_lines_sread function:
- * this function reads a lines structure from a string complying to the
- * OpenScop textual format and returns a pointer to this lines structure.
- * The string should contain only one textual format of a lines structure.
- * \param  extensions The input string where to find a lines structure.
- * \return A pointer to the lines structure that has been read.
- */
-osl_lines_p osl_lines_sread(char ** extensions_fixme) {
-  char * content, *tmp;
-  osl_lines_p lines;
-
-  // FIXME: this is a quick and dirty thing to accept char ** instead
-  //        of char * in the parameter: really do it and update the
-  //        pointer to after what has been read.
-  content = *extensions_fixme;
-
-  if (content == NULL) {
-    OSL_debug("no lines optional tag");
-    return NULL;
-  }
-
-  if (strlen(content) > OSL_MAX_STRING) 
-    OSL_error("lines too long");
-  
-  lines = osl_lines_malloc();
-  tmp = strtok(content," -");
-  lines->start = atoi(tmp);
-  if(lines->start == -1)
-    OSL_error("lines start NaN");
-  
-  tmp = strtok(NULL," -");
-  lines->end = atoi(tmp);
-  if(lines->end == -1)
-    OSL_error("lines end NaN");
-  
-  return lines;
-}
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-
-
-/**
- * osl_lines_malloc function:
- * This function allocates the memory space for an osl_lines_t
- * structure and sets its fields with default values. Then it returns a
- * pointer to the allocated space.
- * \return A pointer to an empty lines structure with fields set to
- *         default values.
- */
-osl_lines_p osl_lines_malloc() {
-  osl_lines_p lines;
-  
-  OSL_malloc(lines, osl_lines_p, sizeof(osl_lines_t));
-  lines->start = OSL_UNDEFINED;
-  lines->end   = OSL_UNDEFINED;
-
-  return lines;
-}
-
-
-/**
- * osl_lines_free function:
- * This function frees the allocated memory for an osl_lines_t
- * structure.
- * \param lines The pointer to the lines structure we want to free.
- */
-void osl_lines_free(osl_lines_p lines) {
-  if (lines != NULL) {
-    free(lines);
-  }
-}
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-
-
-/**
- * osl_lines_clone function:
- * This function builds and returns a "hard copy" (not a pointer copy) of an
- * osl_lines_t data structure.
- * \param lines The pointer to the lines structure we want to copy.
- * \return A pointer to the copy of the lines structure.
- */
-osl_lines_p osl_lines_clone(osl_lines_p lines) {
-  osl_lines_p copy;
-
-  if (lines == NULL)
-    return NULL;
-
-  copy = osl_lines_malloc();
-  copy->start = lines->start;
-  copy->end = lines->end;
-
-  return copy;
-}
-
-
-/**
- * osl_lines_equal function:
- * this function returns true if the two lines structures are the same
- * (content-wise), false otherwise. This functions considers two lines
- * \param c1  The first lines structure.
- * \param c2  The second lines structure.
- * \return 1 if c1 and c2 are the same (content-wise), 0 otherwise.
- */
-int osl_lines_equal(osl_lines_p c1, osl_lines_p c2) {
-  if (c1 == c2)
-    return 1;
-
-  if (((c1 == NULL) && (c2 != NULL)) || ((c1 != NULL) && (c2 == NULL)))
-    return 0;
-
-  if ((c1->start != c2->start) || (c1->end != c2->end))
-    return 0;
-
-  return 1;
-}
-
-
-/**
- * osl_lines_interface function:
- * this function creates an interface structure corresponding to the lines
- * extension and returns it).
- * \return An interface structure for the lines extension.
- */
-osl_interface_p osl_lines_interface() {
-  osl_interface_p interface = osl_interface_malloc();
-  
-  interface->URI    = strdup(OSL_URI_LINES);
-  interface->idump  = (osl_idump_f)osl_lines_idump;
-  interface->sprint = (osl_sprint_f)osl_lines_sprint;
-  interface->sread  = (osl_sread_f)osl_lines_sread;
-  interface->malloc = (osl_malloc_f)osl_lines_malloc;
-  interface->free   = (osl_free_f)osl_lines_free;
-  interface->clone  = (osl_clone_f)osl_lines_clone;
-  interface->equal  = (osl_equal_f)osl_lines_equal;
-
-  return interface;
-}
-
diff --git a/cloog-0.17.0/osl/source/extensions/scatnames.c b/cloog-0.17.0/osl/source/extensions/scatnames.c
deleted file mode 100644
index bfe5baa..0000000
--- a/cloog-0.17.0/osl/source/extensions/scatnames.c
+++ /dev/null
@@ -1,282 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                    extensions/scatnames.c                       **
-     **-----------------------------------------------------------------**
-     **                   First version: 03/12/2011                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <osl/macros.h>
-#include <osl/util.h>
-#include <osl/interface.h>
-#include <osl/strings.h>
-#include <osl/extensions/scatnames.h>
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-
-
-/**
- * osl_scatnames_idump function:
- * this function displays an osl_scatnames_t structure (*scatnames) into a
- * file (file, possibly stdout) in a way that trends to be understandable. It
- * includes an indentation level (level) in order to work with others
- * idump functions.
- * \param[in] file      The file where the information has to be printed.
- * \param[in] scatnames Scatnames structure to print.
- * \param[in] level     Number of spaces before printing, for each line.
- */
-void osl_scatnames_idump(FILE * file, osl_scatnames_p scatnames, int level) {
-  int j;
-
-  // Go to the right level.
-  for (j = 0; j < level; j++)
-    fprintf(file, "|\t");
-
-  if (scatnames != NULL)
-    fprintf(file, "+-- osl_scatnames_t\n");
-  else
-    fprintf(file, "+-- NULL scatnames\n");
-
-  if (scatnames != NULL) {
-    // Go to the right level.
-    for(j = 0; j <= level + 1; j++)
-      fprintf(file, "|\t");
-    fprintf(file, "\n");
-  
-    // Display the list of scattering names.
-    osl_strings_idump(file, scatnames->names, level + 1);
-  }
-
-  // The last line.
-  for (j = 0; j <= level; j++)
-    fprintf(file, "|\t");
-  fprintf(file, "\n");
-}
-
-
-/**
- * osl_scatnames_dump function:
- * this function prints the content of an osl_scatnames_t structure
- * (*scatnames) into a file (file, possibly stdout).
- * \param[in] file      The file where the information has to be printed.
- * \param[in] scatnames The scatnames structure to print.
- */
-void osl_scatnames_dump(FILE * file, osl_scatnames_p scatnames) {
-  osl_scatnames_idump(file, scatnames, 0);
-}
-
-
-/**
- * osl_scatnames_sprint function:
- * this function prints the content of an osl_scatnames_t structure
- * (*scatnames) into a string (returned) in the OpenScop textual format.
- * \param[in] scatnames The scatnames structure to print.
- * \return A string containing the OpenScop dump of the scatnames structure.
- */
-char * osl_scatnames_sprint(osl_scatnames_p scatnames) {
-  return osl_strings_sprint(scatnames->names);
-}
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-
-
-/**
- * osl_scatnames_sread function:
- * this function reads a scatnames structure from a string complying to the
- * OpenScop textual format and returns a pointer to this scatnames structure.
- * The input parameter is updated to the position in the input string this
- * function reach right after reading the scatnames structure. If there
- * is nothing to read, the function returns NULL.
- * \param[in,out] input The input string where to find a scatnames.
- *                      Updated to the position after what has been read.
- * \return A pointer to the scatnames structure that has been read.
- */
-osl_scatnames_p osl_scatnames_sread(char ** input) {
-  osl_scatnames_p scatnames = NULL;
-  osl_strings_p names = NULL;
-
-  if (*input == NULL) {
-    OSL_debug("no scatnames optional tag");
-    return NULL;
-  }
-
-  // Build the scatnames structure
-  names = osl_strings_sread(input);
-  if (names != NULL) {
-    scatnames = osl_scatnames_malloc();
-    scatnames->names = names;
-  }
-
-  return scatnames;
-}
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-
-
-/**
- * osl_scatnames_malloc function:
- * this function allocates the memory space for an osl_scatnames_t
- * structure and sets its fields with default values. Then it returns a
- * pointer to the allocated space.
- * \return A pointer to an empty scatnames structure with fields set to
- *         default values.
- */
-osl_scatnames_p osl_scatnames_malloc() {
-  osl_scatnames_p scatnames;
-
-  OSL_malloc(scatnames, osl_scatnames_p, sizeof(osl_scatnames_t));
-  scatnames->names = NULL;
-
-  return scatnames;
-}
-
-
-/**
- * osl_scatnames_free function:
- * this function frees the allocated memory for an osl_scatnames_t
- * structure.
- * \param[in,out] scatnames The pointer to the scatnames structure to free.
- */
-void osl_scatnames_free(osl_scatnames_p scatnames) {
-  if (scatnames != NULL) {
-    osl_strings_free(scatnames->names);
-    free(scatnames);
-  }
-}
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-
-
-/**
- * osl_scatnames_clone function:
- * This function builds and returns a "hard copy" (not a pointer copy) of an
- * osl_scatnames_t data structure.
- * \param[in] scatnames The pointer to the scatnames structure to clone.
- * \return A pointer to the clone of the scatnames structure.
- */
-osl_scatnames_p osl_scatnames_clone(osl_scatnames_p scatnames) {
-  osl_scatnames_p clone;
-
-  if (scatnames == NULL)
-    return NULL;
-
-  clone = osl_scatnames_malloc();
-  clone->names = osl_strings_clone(scatnames->names);
-
-  return clone;
-}
-
-
-/**
- * osl_scatnames_equal function:
- * this function returns true if the two scatnames structures are the same
- * (content-wise), false otherwise.
- * \param[in] s1 The first scatnames structure.
- * \param[in] s2 The second scatnames structure.
- * \return 1 if s1 and s2 are the same (content-wise), 0 otherwise.
- */
-int osl_scatnames_equal(osl_scatnames_p s1, osl_scatnames_p s2) {
-  
-  if (s1 == s2)
-    return 1;
-
-  if (((s1 == NULL) && (s2 != NULL)) || ((s1 != NULL) && (s2 == NULL)))
-    return 0;
-
-  if (!osl_strings_equal(s1->names, s2->names))
-    return 0;
-
-  return 1;
-}
-
-
-/**
- * osl_scatnames_interface function:
- * this function creates an interface structure corresponding to the scatnames
- * extension and returns it).
- * \return An interface structure for the scatnames extension.
- */
-osl_interface_p osl_scatnames_interface() {
-  osl_interface_p interface = osl_interface_malloc();
-  
-  interface->URI    = strdup(OSL_URI_SCATNAMES);
-  interface->idump  = (osl_idump_f)osl_scatnames_idump;
-  interface->sprint = (osl_sprint_f)osl_scatnames_sprint;
-  interface->sread  = (osl_sread_f)osl_scatnames_sread;
-  interface->malloc = (osl_malloc_f)osl_scatnames_malloc;
-  interface->free   = (osl_free_f)osl_scatnames_free;
-  interface->clone  = (osl_clone_f)osl_scatnames_clone;
-  interface->equal  = (osl_equal_f)osl_scatnames_equal;
-
-  return interface;
-}
diff --git a/cloog-0.17.0/osl/source/extensions/textual.c b/cloog-0.17.0/osl/source/extensions/textual.c
deleted file mode 100644
index a583843..0000000
--- a/cloog-0.17.0/osl/source/extensions/textual.c
+++ /dev/null
@@ -1,335 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                     extensions/textual.c                        **
-     **-----------------------------------------------------------------**
-     **                   First version: 15/17/2010                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <osl/macros.h>
-#include <osl/util.h>
-#include <osl/interface.h>
-#include <osl/extensions/textual.h>
-
-
-/* CAUTION : TEXTUAL IS A VERY SPECIAL CASE: DO NOT USE IT AS AN EXAMPLE !!! */
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-
-
-/**
- * osl_textual_idump function:
- * this function displays an osl_textual_t structure (*textual) into a
- * file (file, possibly stdout) in a way that trends to be understandable. It
- * includes an indentation level (level) in order to work with others
- * idump functions.
- * \param[in] file    The file where the information has to be printed.
- * \param[in] textual The textual structure to be printed.
- * \param[in] level   Number of spaces before printing, for each line.
- */
-void osl_textual_idump(FILE * file, osl_textual_p textual, int level) {
-  int j;
-  char * tmp;
-
-  // Go to the right level.
-  for (j = 0; j < level; j++)
-    fprintf(file, "|\t");
-
-  if (textual != NULL) {
-    fprintf(file, "+-- osl_textual_t: ");
-    
-    // Display the textual message (without any carriage return).
-    tmp = strdup(textual->textual);
-    for (j = 0; j < strlen(tmp); j++)
-      if (tmp[j] == '\n')
-	tmp[j] = ' ';
-
-    if (strlen(tmp) > 40) {
-      for (j = 0; j < 20; j++)
-        fprintf(file, "%c", tmp[j]);
-      fprintf(file, "   ...   ");
-      for (j = strlen(tmp) - 20; j < strlen(tmp); j++)
-        fprintf(file, "%c", tmp[j]);
-      fprintf(file, "\n");
-    }
-    else {
-      fprintf(file,"%s\n", tmp);
-    }
-    free(tmp);
-  }
-  else {
-    fprintf(file, "+-- NULL textual\n");
-  }
-
-  // The last line.
-  for (j = 0; j <= level; j++)
-    fprintf(file, "|\t");
-  fprintf(file, "\n");
-}
-
-
-/**
- * osl_textual_dump function:
- * this function prints the content of an osl_textual_t structure
- * (*textual) into a file (file, possibly stdout).
- * \param[in] file    The file where the information has to be printed.
- * \param[in] textual The textual structure to be printed.
- */
-void osl_textual_dump(FILE * file, osl_textual_p textual) {
-  osl_textual_idump(file, textual, 0);
-}
-
-
-
-#if 0
-/**
- * osl_textual_sprint function:
- * this function prints the content of an osl_textual_t structure
- * (*textual) into a string (returned) in the OpenScop textual format.
- * \param[in]  textual The textual structure to be printed.
- * \return A string containing the OpenScop dump of the textual structure.
- */
-char * osl_textual_sprint(osl_textual_p textual) {
-  char * string = NULL;
-
-  if ((textual != NULL) && (textual->textual != NULL)) {
-    if (strlen(textual->textual) > OSL_MAX_STRING) 
-      OSL_error("textual too long");
-    
-    string = strdup(textual->textual);
-    if (string == NULL)
-      OSL_error("memory overflow");
-  }
-
-  return string;
-}
-#else
-/**
- * osl_textual_sprint function:
- * this function returns NULL. This is part of the special behavior of
- * the textual option (printing it along with other options would double
- * the options...).
- * \param[in]  textual The textual structure to be printed.
- * \return NULL.
- */
-char * osl_textual_sprint(osl_textual_p textual) {
-
-  return NULL;
-}
-#endif
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-
-
-/**
- * osl_textual_sread function:
- * this function reads a textual structure from a string complying to the
- * OpenScop textual format and returns a pointer to this textual structure.
- * The string should contain only one textual format of a textual structure.
- * \param[in,out] extensions The input string where to find a textual struct.
- *                           Updated to the position after what has been read.
- * \return A pointer to the textual structure that has been read.
- */
-osl_textual_p osl_textual_sread(char ** extensions) {
-  osl_textual_p textual = NULL;
-
-  if (*extensions != NULL) {
-    textual = osl_textual_malloc();
-    OSL_strdup(textual->textual, *extensions);
-    
-    // Update the input string pointer to the end of the string (since
-    // everything has been read).
-    *extensions = *extensions + strlen(*extensions);
-  }
-
-  return textual;
-}
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-
-
-/**
- * osl_textual_malloc function:
- * this function allocates the memory space for an osl_textual_t
- * structure and sets its fields with default values. Then it returns a
- * pointer to the allocated space.
- * \return A pointer to an empty textual structure with fields set to
- *         default values.
- */
-osl_textual_p osl_textual_malloc() {
-  osl_textual_p textual;
-
-  OSL_malloc(textual, osl_textual_p, sizeof(osl_textual_t));
-  textual->textual = NULL;
-
-  return textual;
-}
-
-
-/**
- * osl_textual_free function:
- * this function frees the allocated memory for an osl_textual_t
- * structure.
- * \param[in,out] textual The pointer to the textual structure to be freed.
- */
-void osl_textual_free(osl_textual_p textual) {
-  if (textual != NULL) {
-    if(textual->textual != NULL)
-      free(textual->textual);
-    free(textual);
-  }
-}
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-
-
-/**
- * osl_textual_clone function:
- * this function builds and returns a "hard copy" (not a pointer copy) of an
- * osl_textual_t data structure.
- * \param[in] textual The pointer to the textual structure we want to clone.
- * \return A pointer to the clone of the textual structure.
- */
-osl_textual_p osl_textual_clone(osl_textual_p textual) {
-  osl_textual_p clone;
-
-  if (textual == NULL)
-    return NULL;
-
-  clone = osl_textual_malloc();
-  OSL_strdup(clone->textual, textual->textual);
-
-  return clone;
-}
-
-
-#if 0
-/**
- * osl_textual_equal function:
- * this function returns true if the two textual structures are the same
- * (content-wise), false otherwise.
- * \param f1  The first textual structure.
- * \param ff  The second textual structure.
- * \return 1 if f1 and f2 are the same (content-wise), 0 otherwise.
- */
-int osl_textual_equal(osl_textual_p f1, osl_textual_p f2) {
- 
-  if (f1 == f2)
-    return 1;
-
-  if (((f1 == NULL) && (f2 != NULL)) || ((f1 != NULL) && (f2 == NULL)))
-    return 0;
-
-  if (strcmp(f1->textual, f2->textual))
-    return 0;
-
-  return 1;
-}
-#else
-/**
- * osl_textual_equal function:
- * this function returns 1. This is part of the special behavior of
- * the textual option (the text string can be easily different while the
- * options are actually identical.
- * \param[in] f1  The first textual structure.
- * \param[in] f2  The second textual structure. 
- * \return 1.
- */
-int osl_textual_equal(osl_textual_p f1, osl_textual_p f2) {
-
-  return 1;
-}
-#endif
-
-
-/**
- * osl_textual_interface function:
- * this function creates an interface structure corresponding to the textual
- * extension and returns it).
- * \return An interface structure for the textual extension.
- */
-osl_interface_p osl_textual_interface() {
-  osl_interface_p interface = osl_interface_malloc();
-  
-  interface->URI    = strdup(OSL_URI_TEXTUAL);
-  interface->idump  = (osl_idump_f)osl_textual_idump;
-  interface->sprint = (osl_sprint_f)osl_textual_sprint;
-  interface->sread  = (osl_sread_f)osl_textual_sread;
-  interface->malloc = (osl_malloc_f)osl_textual_malloc;
-  interface->free   = (osl_free_f)osl_textual_free;
-  interface->clone  = (osl_clone_f)osl_textual_clone;
-  interface->equal  = (osl_equal_f)osl_textual_equal;
-
-  return interface;
-}
-
diff --git a/cloog-0.17.0/osl/source/generic.c b/cloog-0.17.0/osl/source/generic.c
deleted file mode 100644
index bbd0f23..0000000
--- a/cloog-0.17.0/osl/source/generic.c
+++ /dev/null
@@ -1,518 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                           generic.c                             **
-     **-----------------------------------------------------------------**
-     **                   First version: 26/11/2010                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <osl/macros.h>
-#include <osl/util.h>
-#include <osl/interface.h>
-#include <osl/generic.h>
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-
-
-/**
- * osl_generic_idump function:
- * this function displays an osl_generic_t structure (*generic) into
- * a file (file, possibly stdout) in a way that trends to be understandable.
- * It includes an indentation level (level) in order to work with others
- * idump functions.
- * \param[in] file    File where informations are printed.
- * \param[in] generic The generic whose information has to be printed.
- * \param[in] level   Number of spaces before printing, for each line.
- */
-void osl_generic_idump(FILE * file, osl_generic_p generic, int level) {
-  int j, first = 1;
-  
-  // Go to the right level.
-  for (j = 0; j < level; j++)
-    fprintf(file,"|\t");
-
-  if (generic != NULL)
-    fprintf(file, "+-- osl_generic_t\n");
-  else
-    fprintf(file, "+-- NULL generic\n");
- 
-  while (generic != NULL) {
-    if (!first) {
-      // Go to the right level.
-      for (j = 0; j < level; j++)
-        fprintf(file, "|\t");
-      fprintf(file, "|   osl_generic_t\n");
-    }
-    else {
-      first = 0;
-    }
-
-    // A blank line
-    for(j = 0; j <= level + 1; j++)
-      fprintf(file, "|\t");
-    fprintf(file, "\n");
-
-    osl_interface_idump(file, generic->interface, level + 1);
-   
-    if (generic->interface != NULL)
-      generic->interface->idump(file, generic->data, level + 1);
-    
-    generic = generic->next;
-
-    // Next line.
-    if (generic != NULL) {
-      for (j = 0; j <= level; j++)
-        fprintf(file, "|\t");
-      fprintf(file, "V\n");
-    }
-  }
-  
-  // The last line.
-  for (j = 0; j <= level; j++)
-    fprintf(file, "|\t");
-  fprintf(file, "\n");
-}
-
-
-/**
- * osl_generic_dump function:
- * this function prints the content of an osl_generic_t structure
- * (*generic) into a file (file, possibly stdout).
- * \param[in] file    File where the information has to be printed.
- * \param[in] generic The generic structure to print.
- */
-void osl_generic_dump(FILE * file, osl_generic_p generic) {
-  osl_generic_idump(file, generic, 0); 
-}
-
-
-/**
- * osl_generic_print function:
- * this function prints the content of an osl_generic_t structure
- * (*generic) into a string (returned) in the OpenScop format.
- * \param[in] file    File where the information has to be printed.
- * \param[in] generic The generic structure to print.
- */
-void osl_generic_print(FILE * file, osl_generic_p generic) {
-  char * string;
-  
-  if (generic == NULL)
-    return;
-
-  while (generic != NULL) {
-    if (generic->interface != NULL) {
-      string = generic->interface->sprint(generic->data);
-      if (string != NULL) {
-        fprintf(file, "<%s>\n", generic->interface->URI);
-        fprintf(file, "%s", string);
-        fprintf(file, "</%s>\n", generic->interface->URI);
-        free(string);
-      }
-    }
-    generic = generic->next;
-  }
-}
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-
-
-/**
- * osl_generic_sread function:
- * this function reads a list of generics from a string complying to the
- * OpenScop textual format and a list of known interfaces. It returns a
- * pointer to the corresponding list of generic structures.
- * \param[in] string   The string where to read a list of data.
- * \param[in] registry The list of known interfaces (others are ignored).
- * \return A pointer to the generic information list that has been read.
- */
-osl_generic_p osl_generic_sread(char * string, osl_interface_p registry) {
-  osl_generic_p generic = NULL, new;
-  char * content, * start;
-  void * data;
-
-  while (registry != NULL) {
-    content = osl_util_tag_content(string, registry->URI);
-    if (content != NULL) {
-      start = content;
-      data = registry->sread(&content);
-      if (data != NULL) {
-        new = osl_generic_malloc();
-        new->interface = osl_interface_nclone(registry, 1);
-        new->data = data;
-        osl_generic_add(&generic, new);
-      }
-      free(start);
-    }
-    registry = registry->next;
-  }
-  
-  return generic;
-}
-
-
-/**
- * osl_generic_read_one function:
- * this function reads one generic from a file (possibly stdin)
- * complying to the OpenScop textual format and a list of known interfaces.
- * It returns a pointer to the corresponding generic structure. If no
- * tag is found, an error is reported, in the case of an empty or closing tag
- * name the function returns the NULL pointer.
- * \param[in] file     The input file where to read a list of data.
- * \param[in] registry The list of known interfaces (others are ignored).
- * \return A pointer to the generic that has been read.
- */
-osl_generic_p osl_generic_read_one(FILE * file, osl_interface_p registry) {
-  char * tag;
-  char * content, * temp;
-  osl_generic_p generic = NULL;
-  osl_interface_p interface;
-
-  tag = osl_util_read_tag(file, NULL);
-  if ((tag == NULL) || (strlen(tag) < 1) || (tag[0] == '/')) {
-    OSL_debug("empty tag name or closing tag instead of an opening one");
-    return NULL;
-  }
-
-  content = osl_util_read_uptoendtag(file, tag);
-  interface = osl_interface_lookup(registry, tag);
-
-  temp = content;
-  if (interface == NULL) {
-    OSL_warning("unsupported generic");
-    fprintf(stderr, "[osl] Warning: unknown URI \"%s\".\n", tag);
-  }
-  else {
-    generic = osl_generic_malloc();
-    generic->interface = osl_interface_nclone(interface, 1);
-    generic->data = interface->sread(&temp);
-  }
-
-  free(content);
-  free(tag);
-  return generic;
-}
-
-
-/**
- * osl_generic_read function:
- * this function reads a list of generics from a file (possibly stdin)
- * complying to the OpenScop textual format and a list of known interfaces.
- * It returns a pointer to the list of corresponding generic structures.
- * \param[in] file     The input file where to read a list of data.
- * \param[in] registry The list of known interfaces (others are ignored).
- * \return A pointer to the generic information list that has been read.
- */
-osl_generic_p osl_generic_read(FILE * file, osl_interface_p registry) {
-  char * generic_string;
-  osl_generic_p generic_list;
-
-  generic_string = osl_util_read_uptotag(file, OSL_TAG_END_SCOP);
-  generic_list = osl_generic_sread(generic_string, registry);
-  free(generic_string);
-  return generic_list;
-}
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-
-
-/**
- * osl_generic_add function:
- * this function adds a generic node (it may be a list as well) to a list
- * of generics provided as parameter (list). The new node is inserted at
- * the end of the list. 
- * \param[in] list    The list of generics to add a node (NULL if empty).
- * \param[in] generic The generic list to add to the initial list.
- */
-void osl_generic_add(osl_generic_p * list, osl_generic_p generic) {
-  osl_generic_p tmp = *list, check;
-  
-  if (generic != NULL) {
-    // First, check that the generic list is OK.
-    check = generic;
-    while (check != NULL) {
-      if ((check->interface == NULL) || (check->interface->URI == NULL))
-        OSL_error("no interface or URI in a generic to add to a list");
-
-      // TODO: move this to the integrity check.
-      if (osl_generic_lookup(*list, check->interface->URI) != NULL)
-        OSL_error("only one generic with a given URI is allowed");
-      check = check->next;
-    }
-
-    if (*list != NULL) {
-      while (tmp->next != NULL)
-        tmp = tmp->next;
-      tmp->next = generic;
-    }
-    else {
-      *list = generic;
-    }
-  }
-}
-
-
-/**
- * osl_generic_malloc function:
- * This function allocates the memory space for an osl_generic_t
- * structure and sets its fields with default values. Then it returns a
- * pointer to the allocated space.
- * \return A pointer to an empty generic structure with fields set to
- *         default values.
- */
-osl_generic_p osl_generic_malloc() {
-  osl_generic_p generic;
-
-  OSL_malloc(generic, osl_generic_p, sizeof(osl_generic_t));
-  generic->interface = NULL;
-  generic->data      = NULL;
-  generic->next      = NULL;
-
-  return generic;
-}
-
-
-/**
- * osl_generic_free function:
- * This function frees the allocated memory for a generic structure.
- * \param[in] generic The pointer to the generic structure we want to free.
- */
-void osl_generic_free(osl_generic_p generic) {
-  osl_generic_p next;
-
-  while (generic != NULL) {
-    next = generic->next;
-    if (generic->interface != NULL) {
-      generic->interface->free(generic->data);
-      osl_interface_free(generic->interface);
-    }
-    else {
-      if (generic->data != NULL) {
-        OSL_warning("unregistered interface, memory leaks are possible");
-        free(generic->data);
-      }
-    }
-    free(generic);
-    generic = next;
-  }
-}
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-
-
-/**
- * osl_generic_clone function:
- * This function builds and returns a "hard copy" (not a pointer copy) of an
- * osl_generic_t data structure.
- * \param[in] generic The pointer to the generic structure we want to clone.
- * \return A pointer to the clone of the input generic structure.
- */
-osl_generic_p osl_generic_clone(osl_generic_p generic) {
-  osl_generic_p clone = NULL, new;
-  osl_interface_p interface;
-  void * x;
-
-  while (generic != NULL) { 
-    if (generic->interface != NULL) {
-      x = generic->interface->clone(generic->data);
-      interface = osl_interface_clone(generic->interface);
-      new = osl_generic_malloc();
-      new->interface = interface;
-      new->data = x;
-      osl_generic_add(&clone, new);
-    }
-    else {
-      OSL_warning("unregistered interface, cloning ignored");
-    }
-    generic = generic->next;
-  }
-
-  return clone;
-}
-
-
-/**
- * osl_generic_count function:
- * this function counts the number of elements in the generic list provided
- * as parameter (x) and returns this number.
- * \param[in] x The list of generics.
- * \return  The number of elements in the list.
- */
-int osl_generic_count(osl_generic_p x) {
-  int generic_number = 0;
-
-  while (x != NULL) {
-    generic_number++;
-    x = x->next;
-  }
-
-  return generic_number;
-}
-
-
-/**
- * osl_generic_equal function:
- * this function returns true if the two generic structures are the same,
- * false otherwise. This functions considers two generic structures as equal
- * independently of the order of the nodes. TODO: make it dependent on the
- * order.
- * \param x1 The first generic structure.
- * \param x2 The second generic structure.
- * \return 1 if x1 and x2 are the same (content-wise), 0 otherwise.
- */
-int osl_generic_equal(osl_generic_p x1, osl_generic_p x2) {
-  int x1_generic_number, x2_generic_number;
-  int found, equal;
-  osl_generic_p backup_x2 = x2;
-
-  if (x1 == x2)
-    return 1;
-
-  // Check whether the number of generics is the same or not.
-  x1_generic_number = osl_generic_count(x1);
-  x2_generic_number = osl_generic_count(x2);
-  if (x1_generic_number != x2_generic_number)
-    return 0;
-
-  // Check that for each generic in x1 a similar generic is in x2.
-  while (x1 != NULL) {
-    x2 = backup_x2;
-    found = 0;
-    while ((x2 != NULL) && (found != 1)) {
-      if (osl_interface_equal(x1->interface, x2->interface)) {
-        if (x1->interface != NULL) {
-          equal = x1->interface->equal(x1->data, x2->data);
-        }
-        else {
-          OSL_warning("unregistered generic, "
-                      "cannot state generic equality");
-          equal = 0;
-        }
-
-        if (equal == 0)
-          return 0;
-        else
-          found = 1;
-      }
-
-      x2 = x2->next;
-    }
-
-    if (found != 1)
-      return 0;
-
-    x1 = x1->next;
-  }
-
-  return 1;
-}
-
-
-/**
- * osl_generic_has_URI function:
- * this function returns 1 if the generic provided as parameter has
- * a given URI, 0 other wise.
- * \param x   The generic structure to test.
- * \param URI The URI value to test.
- * \return 1 if x has the provided URI, 0 otherwise.
- */
-int osl_generic_has_URI(osl_generic_p x, char * URI) {
-
-  if ((x == NULL) ||
-      (x->interface == NULL) ||
-      (x->interface->URI == NULL) ||
-      (strcmp(x->interface->URI, URI)))
-    return 0;
-
-  return 1;
-}
-
-
-/**
- * osl_generic_lookup function:
- * this function returns the first generic with a given URI in the
- * generic list provided as parameter and NULL if it doesn't find such
- * a generic.
- * \param x   The generic list where to search a given generic URI.
- * \param URI The URI of the generic we are looking for.
- * \return The first generic of the requested URI in the list.
- */
-void * osl_generic_lookup(osl_generic_p x, char * URI) {
-  while (x != NULL) {
-    if (osl_generic_has_URI(x, URI))
-      return x->data;
-
-    x = x->next;
-  }
-
-  return NULL;
-}
diff --git a/cloog-0.17.0/osl/source/int.c b/cloog-0.17.0/osl/source/int.c
deleted file mode 100644
index 70d398e..0000000
--- a/cloog-0.17.0/osl/source/int.c
+++ /dev/null
@@ -1,919 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                             int.c                               **
-     **-----------------------------------------------------------------**
-     **                   First version: 18/07/2011                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-#include <stdlib.h>
-#include <stdio.h>
-#ifdef OSL_GMP_IS_HERE
-# include <gmp.h>
-#endif
-
-#include <osl/macros.h>
-#include <osl/int.h>
-
-
-
-/*+***************************************************************************
- *                                Basic Functions                            *
- *****************************************************************************/
-
-
-/**
- * osl_int_dump_precision function:
- * this function prints in a human readable fashion the precision
- * corresponding to the "precision" parameter.
- * \param[in] file      The file where to print the precision.
- * \param[in] precision The precision to print.
- */
-void osl_int_dump_precision(FILE * file, int precision) {
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      fprintf(file, "32 bits");
-      break;
-    case OSL_PRECISION_DP:
-      fprintf(file, "64 bits");
-      break;
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      fprintf(file, "GMP");
-      break;
-#endif
-    default:
-      fprintf(file, "unknown precision %d", precision);
-  }
-}
-
-
-int osl_int_sizeof(int precision) {
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      return sizeof(long int);
-
-    case OSL_PRECISION_DP:
-      return sizeof(long long int);
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      return sizeof(mpz_t);
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-void * osl_int_address(int precision, void * base, int offset) {
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      return (long int *)base + offset;
-
-    case OSL_PRECISION_DP:
-      return (long long int *)base + offset;
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      return (mpz_t *)base + offset;
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-void osl_int_init(int precision, void * value_base, int value_offset) {
-  void * value = osl_int_address(precision, value_base, value_offset);
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      *(long int *)value = 0;
-      break;
-
-    case OSL_PRECISION_DP:
-      *(long long int *)value = 0;
-      break;
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      mpz_init(*(mpz_t *)value);
-      break;
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-void * osl_int_malloc(int precision) {
-  void * value;
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      value = malloc(sizeof(long int));
-      break;
-
-    case OSL_PRECISION_DP:
-      value = malloc(sizeof(long long int));
-      *(long long int *)value = 0;
-      break;
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      value = malloc(sizeof(mpz_t));
-      break;
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-
-  osl_int_init(precision, value, 0);
-  return value;
-}
-
-
-/**
- * val1_base[val1_offset] = val2_base[val2_offset];
- */
-void osl_int_assign(int precision,
-                    void * val1_base, int val1_offset,
-                    void * val2_base, int val2_offset) {
-  void * val1 = osl_int_address(precision, val1_base, val1_offset);
-  void * val2 = osl_int_address(precision, val2_base, val2_offset);
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      *(long int *)val1 = *(long int *)val2;
-      break;
-
-    case OSL_PRECISION_DP:
-      *(long long int *)val1 = *(long long int *)val2;
-      break;
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      mpz_set(*(mpz_t *)val1, *(mpz_t *)val2);
-      break;
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-/**
- * value_base[value_offset] = i;
- */
-void osl_int_set_si(int precision, void * value_base, int value_offset,
-                    int i) {
-  void * value = osl_int_address(precision, value_base, value_offset);
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      *(long int *)value = (long int)i;
-      break;
-
-    case OSL_PRECISION_DP:
-      *(long long int *)value = (long long int)i;
-      break;
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      mpz_set_si(*(mpz_t *)value, i);
-      break;
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-/**
- * return value_base[value_offset];
- */
-int osl_int_get_si(int precision, void * value_base, int value_offset) {
-  void * value = osl_int_address(precision, value_base, value_offset);
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      return *(int *)value;
-
-    case OSL_PRECISION_DP:
-      return *(int *)value;
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      return mpz_get_si(*(mpz_t *)value);
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-/**
- * value_base[value_offset] = i; // including initialization for GMP
- */
-void osl_int_init_set_si(int precision,
-                         void * value_base, int value_offset, int i) {
-  void * value = osl_int_address(precision, value_base, value_offset);
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      *(long int *)value = (long int)i;
-      break;
-
-    case OSL_PRECISION_DP:
-      *(long long int *)value = (long long int)i;
-      break;
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      mpz_init_set_si(*(mpz_t *)value, i);
-      break;
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-/**
- * value_base[value_offset] = 0; // Including cleaning for GMP
- */
-void osl_int_clear(int precision, void * value_base, int value_offset) {
-  void * value = osl_int_address(precision, value_base, value_offset);
-  
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      *(long int *)value = 0;
-      break;
-
-    case OSL_PRECISION_DP:
-      *(long long int *)value = 0;
-      break;
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      mpz_clear(*(mpz_t *)value);
-      break;
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-void osl_int_free(int precision, void * value_base, int value_offset) {
-  void * value = osl_int_address(precision, value_base, value_offset);
-
-  osl_int_clear(precision, value_base, value_offset);
-  free(value);
-}
-
-
-/**
- * osl_int_print function:
- * this function displays an integer value into a file (file, possibly stdout).
- * \param file         The file where the integer has to be printed.
- * \param precision    The precision of the integer.
- * \param value_base   Address of the base integer value.
- * \param value_offset Offset in number of values from the base integer value.
- */
-void osl_int_print(FILE * file, int precision,
-                   void * value_base, int value_offset) {
-  char string[OSL_MAX_STRING];
-  
-  osl_int_sprint(string, precision, value_base, value_offset);
-  fprintf(file, "%s", string);
-}
-
-
-/**
- * osl_int_sprint function:
- * this function prints an integer value into a string, it uses the
- * OpenScop Library formats OSL_FMT_* to format the printing.
- * \param string       The string where the integer has to be printed.
- * \param precision    The precision of the integer.
- * \param value_base   Address of the base integer value.
- * \param value_offset Offset in number of values from the base integer value.
- */
-void osl_int_sprint(char * string, int precision,
-                    void * value_base, int value_offset) {
-  void * value = osl_int_address(precision, value_base, value_offset);
-            
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      sprintf(string, OSL_FMT_SP, *(long int *)value);
-      break;
-
-    case OSL_PRECISION_DP:
-      sprintf(string, OSL_FMT_DP, *(long long int *)value);
-      break;
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP: {
-      char * str;
-      str = mpz_get_str(0, 10, *(mpz_t *)value); //TODO: 10 -> #define
-      sprintf(string, OSL_FMT_MP, str);
-      free(str);
-      break;
-    }
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-/**
- * osl_int_sprint_txt function:
- * this function is similar to osl_int_sprintf but it prints the value
- * using OSL_TMT_TXT_* formats.
- * \see osl_int_sprintf
- */
-void osl_int_sprint_txt(char * string, int precision,
-                        void * value_base, int value_offset) {
-  void * value = osl_int_address(precision, value_base, value_offset);
-            
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      sprintf(string, OSL_FMT_TXT_SP, *(long int *)value);
-      break;
-
-    case OSL_PRECISION_DP:
-      sprintf(string, OSL_FMT_TXT_DP, *(long long int *)value);
-      break;
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP: {
-      char * str;
-      str = mpz_get_str(0, 10, *(mpz_t *)value); //TODO: 10 -> #define
-      sprintf(string, OSL_FMT_TXT_MP, str);
-      free(str);
-      break;
-    }
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-void osl_int_sread(char ** string, int precision,
-                   void * value_base, int value_offset) {
-  void * value = osl_int_address(precision, value_base, value_offset);
-  int nb_read = 0;
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      nb_read = sscanf(*string, OSL_FMT_TXT_SP, (long int *)value);
-      if (nb_read == 0)
-        OSL_error("failed to read an integer");
-      break;
-
-    case OSL_PRECISION_DP:
-      nb_read = sscanf(*string, OSL_FMT_TXT_DP, (long long int *)value);
-      if (nb_read == 0)
-        OSL_error("failed to read an integer");
-      break;
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP: {
-      long long int tmp;
-      nb_read = sscanf(*string, OSL_FMT_TXT_DP, &tmp);
-      if (nb_read == 0)
-        OSL_error("failed to read an integer");
-      mpz_set_si(*(mpz_t *)value, tmp);
-      break;
-    }
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-
-  // Update the position in the input string.
-  *string = *string + nb_read;
-}
-
-
-/*+***************************************************************************
- *                            Arithmetic Operations                          *
- *****************************************************************************/
-
-
-/**
- * result_base[result_offset] = value_base[value_offset] + 1;
- */
-void osl_int_increment(int precision,
-                       void * result_base, int result_offset,
-                       void * value_base,  int value_offset) {
-  void * result = osl_int_address(precision, result_base, result_offset);
-  void * value  = osl_int_address(precision, value_base, value_offset);
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      *(long int *)result = *(long int *)value + (long int)1;
-      break;
-
-    case OSL_PRECISION_DP:
-      *(long long int *)result = *(long long int *)value + (long long int)1;
-      break;
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      mpz_add_ui(*(mpz_t *)result, *(mpz_t *)value, 1);
-      break;
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-/**
- * result_base[result_offset] = value_base[value_offset] - 1;
- */
-void osl_int_decrement(int precision,
-                       void * result_base, int result_offset,
-                       void * value_base,  int value_offset) {
-  void * result = osl_int_address(precision, result_base, result_offset);
-  void * value  = osl_int_address(precision, value_base, value_offset);
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      *(long int *)result = *(long int *)value - (long int)1;
-      break;
-
-    case OSL_PRECISION_DP:
-      *(long long int *)result = *(long long int *)value - (long long int)1;
-      break;
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP: {
-      mpz_t one;
-      mpz_init_set_si(one, 1);
-      mpz_sub(*(mpz_t *)result, *(mpz_t *)value, one);
-      mpz_clear(one);
-      break;
-    }
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-/**
- * result_base[result_offset] = val1_base[val1_offset]+val2_base[val2_offset];
- */
-void osl_int_add(int precision,
-                 void * result_base, int result_offset,
-                 void * val1_base,   int val1_offset,
-                 void * val2_base,   int val2_offset) {
-  void * result = osl_int_address(precision, result_base, result_offset);
-  void * val1   = osl_int_address(precision, val1_base, val1_offset);
-  void * val2   = osl_int_address(precision, val2_base, val2_offset);
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      *(long int *)result = *(long int *)val1 + *(long int *)val2;
-      break;
-
-    case OSL_PRECISION_DP:
-      *(long long int *)result = *(long long int *)val1 +
-                                 *(long long int *)val2;
-      break;
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      mpz_add(*(mpz_t *)result, *(mpz_t *)val1, *(mpz_t *)val2);
-      break;
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-/**
- * result_base[result_offset] = value_base[value_offset] + i;
- */
-void osl_int_add_si(int precision,
-                    void * result_base, int result_offset,
-                    void * value_base,  int value_offset, int i) {
-  void * result = osl_int_address(precision, result_base, result_offset);
-  void * value  = osl_int_address(precision, value_base, value_offset);
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      *(long int *)result = *(long int *)value + (long int)i;
-      break;
-
-    case OSL_PRECISION_DP:
-      *(long long int *)result = *(long long int *)value + (long long int)i;
-      break;
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP: {
-      mpz_t si;
-      mpz_init_set_si(si, i);
-      mpz_add(*(mpz_t *)result, *(mpz_t *)value, si);
-      mpz_clear(si);
-      break;
-    }
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-/**
- * result_base[result_offset] = val1_base[val1_offset]*val2_base[val2_offset];
- */
-void osl_int_mul(int precision,
-                 void * result_base, int result_offset,
-                 void * val1_base,   int val1_offset,
-                 void * val2_base,   int val2_offset) {
-  void * result = osl_int_address(precision, result_base, result_offset);
-  void * val1   = osl_int_address(precision, val1_base, val1_offset);
-  void * val2   = osl_int_address(precision, val2_base, val2_offset);
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      *(long int *)result = *(long int *)val1 * *(long int *)val2;
-      break;
-
-    case OSL_PRECISION_DP:
-      *(long long int *)result = *(long long int *)val1 *
-                                 *(long long int *)val2;
-      break;
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      mpz_mul(*(mpz_t *)result, *(mpz_t *)val1, *(mpz_t *)val2);
-      break;
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-/**
- * result_base[result_offset] = value_base[value_offset] * i;
- */
-void osl_int_mul_si(int precision,
-                    void * result_base, int result_offset,
-                    void * value_base,  int value_offset, int i) {
-  void * result = osl_int_address(precision, result_base, result_offset);
-  void * value  = osl_int_address(precision, value_base, value_offset);
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      *(long int *)result = *(long int *)value * (long int)i;
-      break;
-
-    case OSL_PRECISION_DP:
-      *(long long int *)result = *(long long int *)value * (long long int)i;
-      break;
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      mpz_mul_si(*(mpz_t *)result, *(mpz_t *)value, i);
-      break;
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-/**
- * result_base[result_offset] = val1_base[val1_offset]-val2_base[val2_offset];
- */
-void osl_int_sub(int precision,
-                 void * result_base, int result_offset,
-                 void * val1_base,   int val1_offset,
-                 void * val2_base,   int val2_offset) {
-  void * result = osl_int_address(precision, result_base, result_offset);
-  void * val1   = osl_int_address(precision, val1_base, val1_offset);
-  void * val2   = osl_int_address(precision, val2_base, val2_offset);
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      *(long int *)result = *(long int *)val1 - *(long int *)val2;
-      break;
-
-    case OSL_PRECISION_DP:
-      *(long long int *)result = *(long long int *)val1 -
-                                 *(long long int *)val2;
-      break;
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      mpz_sub(*(mpz_t *)result, *(mpz_t *)val1, *(mpz_t *)val2);
-      break;
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-/**
- * result_base[result_offset] = -value_base[value_offset];
- */
-void osl_int_oppose(int precision,
-                    void * result_base, int result_offset,
-                    void * value_base,  int value_offset) {
-  void * result = osl_int_address(precision, result_base, result_offset);
-  void * value  = osl_int_address(precision, value_base, value_offset);
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      *(long int *)result = -*(long int *)value;
-      break;
-
-    case OSL_PRECISION_DP:
-      *(long long int *)result = -*(long long int *)value;
-      break;
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      mpz_neg(*(mpz_t *)result, *(mpz_t *)value);
-      break;
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-/*+***************************************************************************
- *                            Conditional Operations                         *
- *****************************************************************************/
-
-
-/**
- * (val1_base[val1_offset] == val2_base[val2_offset])
- */
-int osl_int_eq(int precision,
-               void * val1_base, int val1_offset,
-               void * val2_base, int val2_offset) {
-  void * val1 = osl_int_address(precision, val1_base, val1_offset);
-  void * val2 = osl_int_address(precision, val2_base, val2_offset);
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      return (*(long int *)val1 == *(long int *)val2);
-
-    case OSL_PRECISION_DP:
-      return (*(long long int *)val1 == *(long long int *)val2);
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      return (mpz_cmp(*(mpz_t *)val1, *(mpz_t *)val2) == 0);
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-/**
- * (val1_base[val1_offset] != val2_base[val2_offset])
- */
-int osl_int_ne(int precision,
-               void * val1_base, int val1_offset,
-               void * val2_base, int val2_offset) {
-  return !osl_int_eq(precision,
-                          val1_base, val1_offset,
-                          val2_base, val2_offset);
-}
-
-
-/**
- * (value_base[value_offset] > 0)
- */
-int osl_int_pos(int precision, void * value_base, int value_offset) {
-  void * value = osl_int_address(precision, value_base, value_offset);
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      return (*(long int *)value > 0);
-
-    case OSL_PRECISION_DP:
-      return (*(long long int *)value > 0);
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      return (mpz_sgn(*(mpz_t *)value) > 0);
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-/**
- * (value_base[value_offset] < 0)
- */
-int osl_int_neg(int precision, void * value_base, int value_offset) {
-  void * value = osl_int_address(precision, value_base, value_offset);
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      return (*(long int *)value < 0);
-
-    case OSL_PRECISION_DP:
-      return (*(long long int *)value < 0);
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      return (mpz_sgn(*(mpz_t *)value) < 0);
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-/**
- * (value_base[value_offset] == 0)
- */
-int osl_int_zero(int precision, void * value_base, int value_offset) {
-  void * value = osl_int_address(precision, value_base, value_offset);
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      return (*(long int *)value == 0);
-
-    case OSL_PRECISION_DP:
-      return (*(long long int *)value == 0);
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      return (mpz_sgn(*(mpz_t *)value) == 0);
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-/**
- * (value_base[value_offset] == 1)
- */
-int osl_int_one(int precision, void * value_base, int value_offset) {
-  void * value = osl_int_address(precision, value_base, value_offset);
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      return (*(long int *)value == (long int)1);
-
-    case OSL_PRECISION_DP:
-      return (*(long long int *)value == (long long int)1);
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      return (mpz_cmp_si(*(mpz_t *)value, 1) == 0);
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-/**
- * (value_base[value_offset] == -1)
- */
-int osl_int_mone(int precision, void * value_base, int value_offset) {
-  void * value = osl_int_address(precision, value_base, value_offset);
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      return (*(long int *)value == (long int)-1);
-
-    case OSL_PRECISION_DP:
-      return (*(long long int *)value == (long long int)-1);
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      return (mpz_cmp_si(*(mpz_t *)value, -1) == 0);
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
-
-
-/**
- * ((val1_base[val1_offset] % val2_base[val2_offset]) == 0)
- */
-int osl_int_divisible(int precision,
-                      void * val1_base, int val1_offset,
-                      void * val2_base, int val2_offset) {
-  void * val1 = osl_int_address(precision, val1_base, val1_offset);
-  void * val2 = osl_int_address(precision, val2_base, val2_offset);
-
-  switch (precision) {
-    case OSL_PRECISION_SP:
-      return ((*(long int *)val1 % *(long int *)val2) == 0);
-
-    case OSL_PRECISION_DP:
-      return ((*(long long int *)val1 % *(long long int *)val2) == 0);
-
-#ifdef OSL_GMP_IS_HERE
-    case OSL_PRECISION_MP:
-      return mpz_divisible_p(*(mpz_t *)val1, *(mpz_t *)val2);
-#endif
-
-    default:
-      OSL_error("unknown precision");
-  }
-}
diff --git a/cloog-0.17.0/osl/source/interface.c b/cloog-0.17.0/osl/source/interface.c
deleted file mode 100644
index 136fcdc..0000000
--- a/cloog-0.17.0/osl/source/interface.c
+++ /dev/null
@@ -1,376 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                          interface.c                            **
-     **-----------------------------------------------------------------**
-     **                   First version: 15/07/2011                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <osl/extensions/textual.h>
-#include <osl/extensions/comment.h>
-#include <osl/extensions/scatnames.h>
-#include <osl/extensions/arrays.h>
-#include <osl/extensions/lines.h>
-#include <osl/extensions/irregular.h>
-#include <osl/strings.h>
-#include <osl/body.h>
-#include <osl/interface.h>
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-
-
-/**
- * osl_interface_idump function:
- * this function displays an osl_interface_t structure (*interface) into
- * a file (file, possibly stdout) in a way that trends to be understandable.
- * It includes an indentation level (level) in order to work with others
- * idump functions.
- * \param file      The file where the information has to be printed.
- * \param interface The interface structure which has to be printed.
- * \param level     Number of spaces before printing, for each line.
- */
-void osl_interface_idump(FILE * file, osl_interface_p interface, int level) {
-  int j, first = 1;
-
-  // Go to the right level.
-  for (j = 0; j < level; j++)
-    fprintf(file, "|\t");
-
-  if (interface != NULL)
-    fprintf(file, "+-- osl_interface_t: URI = %s\n", interface->URI);
-  else
-    fprintf(file, "+-- NULL interface\n");
-
-  
-  while (interface != NULL) {
-    if (!first) {
-      // Go to the right level.
-      for (j = 0; j < level; j++)
-        fprintf(file, "|\t");
-
-      if (interface->URI != NULL)
-        fprintf(file, "|   osl_interface_t: URI = %s\n", interface->URI);
-      else
-        fprintf(file, "|   osl_interface_t: URI = (NULL)\n");
-    }
-    else
-      first = 0;
-
-    interface = interface->next;
-
-    // Next line.
-    if (interface != NULL) {
-      for (j = 0; j <= level + 1; j++)
-        fprintf(file, "|\t");
-      fprintf(file, "\n");
-      for (j = 0; j <= level; j++)
-        fprintf(file, "|\t");
-      fprintf(file, "V\n");
-    }
-  }
-  
-  // The last line.
-  for (j = 0; j <= level; j++)
-    fprintf(file, "|\t");
-  fprintf(file, "\n");
-}
-
-
-/**
- * osl_interface_dump function:
- * this function prints the content of a osl_interface_t structure
- * (*interface) into a file (file, possibly stdout).
- * \param file      File where informations are printed.
- * \param interface The interface structure to print.
- */
-void osl_interface_dump(FILE * file, osl_interface_p interface) {
-  osl_interface_idump(file, interface, 0); 
-}
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-
-
-/**
- * osl_interface_add function:
- * this function adds an interface node (it may be a list as well) to a
- * list of interfaces provided as parameter (list). The new node
- * is inserted at the end of the list. 
- * \param list      The list of interfaces to add a node (NULL if empty).
- * \param interface The interface to add to the list.
- */
-void osl_interface_add(osl_interface_p * list, osl_interface_p interface) {
-  osl_interface_p tmp = *list, check_interface;
-
-  if (interface != NULL) {
-    // First, check that the interface list is OK.
-    check_interface = interface;
-    while (check_interface != NULL) {
-      if (check_interface->URI == NULL)
-        OSL_error("no URI in an interface to add to a list");
-
-      if (osl_interface_lookup(*list, check_interface->URI) != NULL)
-        OSL_error("only one interface with a given URI is allowed");
-      check_interface = check_interface->next;
-    }
-
-    if (*list != NULL) {
-      while (tmp->next != NULL)
-        tmp = tmp->next;
-      tmp->next = interface;
-    }
-    else {
-      *list = interface;
-    }
-  }
-}
-
-
-/**
- * osl_interface_malloc function:
- * This function allocates the memory space for a osl_interface_t
- * structure and sets its fields with default values. Then it returns a
- * pointer to the allocated space.
- * \return A pointer to an empty interface structure with fields set to
- *         default values.
- */
-osl_interface_p osl_interface_malloc() {
-  osl_interface_p interface;
-
-  OSL_malloc(interface, osl_interface_p,
-                  sizeof(osl_interface_t));
-  interface->URI    = NULL;
-  interface->idump  = NULL; 
-  interface->sprint = NULL; 
-  interface->sread  = NULL; 
-  interface->malloc = NULL; 
-  interface->free   = NULL; 
-  interface->clone  = NULL; 
-  interface->equal  = NULL;
-  interface->next   = NULL;
-
-  return interface;
-}
-
-
-/**
- * osl_interface_free function:
- * this function frees the allocated memory for an osl_interface_t
- * structure, and all the interfaces stored in the list.
- * \param[in] interface The pointer to the interface we want to free.
- */
-void osl_interface_free(osl_interface_p interface) {
-  osl_interface_p tmp;
-  int i = 0;
- 
-  if (interface == NULL)
-    return;
-
-  while (interface != NULL) {
-    tmp = interface->next;
-    if (interface->URI != NULL)
-      free(interface->URI);
-    free(interface);
-    interface = tmp;
-    i++;
-  }
-}
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-
-
-/**
- * osl_interface_nclone function:
- * This function builds and returns a "hard copy" (not a pointer copy) of the
- * n first elements of an osl_interface_t list.
- * \param interface The pointer to the interface structure we want to clone.
- * \param n         The number of nodes we want to copy (-1 for infinity).
- * \return The clone of the n first nodes of the interface list.
- */
-osl_interface_p osl_interface_nclone(osl_interface_p interface, int n) {
-  osl_interface_p clone = NULL, new;
-  int i = 0;
-
-  while ((interface != NULL) && ((n == -1) || (i < n))) {
-    new = osl_interface_malloc();
-    OSL_strdup(new->URI, interface->URI);
-    new->idump  = interface->idump;
-    new->sprint = interface->sprint;
-    new->sread  = interface->sread;
-    new->malloc = interface->malloc;
-    new->free   = interface->free;
-    new->clone  = interface->clone;
-    new->equal  = interface->equal;
-    
-    osl_interface_add(&clone, new);
-    interface = interface->next;
-    i++;
-  }
-
-  return clone;
-}
-
-
-/**
- * osl_interface_clone function:
- * This function builds and returns a "hard copy" (not a pointer copy) of an
- * osl_interface_t data structure.
- * \param interface The pointer to the interface structure we want to copy.
- * \return A pointer to the copy of the interface structure.
- */
-osl_interface_p osl_interface_clone(osl_interface_p interface) {
-
-  return osl_interface_nclone(interface, -1);
-}
-
-
-/**
- * osl_interface_equal function:
- * this function returns true if the two interface structures are the same,
- * (content-wise) false otherwise. 
- * \param interface1 The first interface structure.
- * \param interface2 The second interface structure.
- * \return 1 if interface1 and interface2 are the same, 0 otherwise.
- */
-int osl_interface_equal(osl_interface_p interface1,
-                        osl_interface_p interface2) {
-
-  if (interface1 == interface2)
-    return 1;
-  
-  if (((interface1 == NULL) && (interface2 != NULL)) ||
-      ((interface1 != NULL) && (interface2 == NULL)))
-    return 0;
-
-  if (strcmp(interface1->URI, interface2->URI)   ||
-      (interface1->idump  != interface2->idump)  ||
-      (interface1->sprint != interface2->sprint) ||
-      (interface1->sread  != interface2->sread)  ||
-      (interface1->malloc != interface2->malloc) ||
-      (interface1->free   != interface2->free)   ||
-      (interface1->clone  != interface2->clone)  ||
-      (interface1->equal  != interface2->equal))
-    return 0;
-
-  return 1;
-}
-
-
-/**
- * osl_interface_lookup function:
- * this function returns the first interface with a given URI in the
- * interface list provided as parameter and NULL if it doesn't find such
- * an interface.
- * \param list The interface list where to search a given interface URI.
- * \param URI  The URI of the interface we are looking for.
- * \return The first interface of the requested URI in the list.
- */
-osl_interface_p
-osl_interface_lookup(osl_interface_p list, char * URI) {
-  while (list != NULL) {
-    if ((list->URI != NULL) && (!strcmp(list->URI, URI)))
-      return list;
-
-    list = list->next;
-  }
-
-  return NULL;
-}
-
-
-/**
- * osl_interface_get_default_registry function:
- * this function creates the list of known interfaces (of all generic types,
- * including extensions) and returns it.
- * \return The list of known interfaces.
- */
-osl_interface_p osl_interface_get_default_registry() {
-  osl_interface_p registry = NULL;
-
-  // Internal generics
-  osl_interface_add(&registry, osl_strings_interface());
-  osl_interface_add(&registry, osl_body_interface());
-  
-  // Extensions
-  osl_interface_add(&registry, osl_textual_interface());
-  osl_interface_add(&registry, osl_comment_interface());
-  osl_interface_add(&registry, osl_scatnames_interface());
-  //osl_interface_add(&registry, osl_arrays_interface());
-  //osl_interface_add(&registry, osl_lines_interface());
-  //osl_interface_add(&registry, osl_irregular_interface());
-  
-  return registry;
-}
-
-
-
diff --git a/cloog-0.17.0/osl/source/names.c b/cloog-0.17.0/osl/source/names.c
deleted file mode 100644
index c68f936..0000000
--- a/cloog-0.17.0/osl/source/names.c
+++ /dev/null
@@ -1,242 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                      extensions/names.c                         **
-     **-----------------------------------------------------------------**
-     **                   First version: 18/04/2011                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <osl/macros.h>
-#include <osl/strings.h>
-#include <osl/names.h>
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-
-
-/**
- * osl_names_idump function:
- * this function displays an osl_names_t structure (*names) into a
- * file (file, possibly stdout) in a way that trends to be understandable. It
- * includes an indentation level (level) in order to work with others
- * idump functions.
- * \param[in] file  The file where the information has to be printed.
- * \param[in] names The names structure whose information has to be printed.
- * \param[in] level Number of spaces before printing, for each line.
- */
-void osl_names_idump(FILE * file, osl_names_p names, int level) {
-  int j;
-
-  // Go to the right level.
-  for (j = 0; j < level; j++)
-    fprintf(file, "|\t");
-
-  if (names != NULL)
-    fprintf(file, "+-- osl_names_t\n");
-  else
-    fprintf(file, "+-- NULL names\n");
-
-  if (names != NULL) {
-    // A blank line.
-    for (j = 0; j <= level+1; j++)
-      fprintf(file, "|\t");
-    fprintf(file, "\n");
-    
-    // Print the various names.
-    osl_strings_idump(file, names->parameters, level + 1);
-    osl_strings_idump(file, names->iterators,  level + 1);
-    osl_strings_idump(file, names->scatt_dims, level + 1);
-    osl_strings_idump(file, names->local_dims, level + 1);
-    osl_strings_idump(file, names->arrays,     level + 1);
-  }
-
-  // The last line.
-  for (j = 0; j <= level; j++)
-    fprintf(file, "|\t");
-  fprintf(file, "\n");
-}
-
-
-/**
- * osl_names_dump function:
- * this function prints the content of an osl_names_t structure
- * (*names) into a file (file, possibly stdout).
- * \param[in] file  The file where the information has to be printed.
- * \param[in] names The names structure whose information has to be printed.
- */
-void osl_names_dump(FILE * file, osl_names_p names) {
-  osl_names_idump(file, names, 0);
-}
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-
-
-/**
- * osl_names_malloc function:
- * this function allocates the memory space for an osl_names_t
- * structure and sets its fields with default values. Then it returns a
- * pointer to the allocated space.
- * \return A pointer to an empty names structure with fields set to
- *         default values.
- */
-osl_names_p osl_names_malloc() {
-  osl_names_p names;
-
-  OSL_malloc(names, osl_names_p, sizeof(osl_names_t));
-  names->parameters = NULL;
-  names->iterators  = NULL;
-  names->scatt_dims = NULL;
-  names->local_dims = NULL;
-  names->arrays     = NULL;
-
-  return names;
-}
-
-
-/**
- * osl_names_free function:
- * This function frees the allocated memory for an osl_names_t
- * structure. If the names are not character strings, it is the
- * responsibility of the user to free each array of elements (including
- * the array itself), this function will only free the osl_names_t shell.
- * \param[in,out] names The pointer to the names structure we want to free.
- */
-void osl_names_free(osl_names_p names) {
-  if (names != NULL) {
-    osl_strings_free(names->parameters);
-    osl_strings_free(names->iterators);
-    osl_strings_free(names->scatt_dims);
-    osl_strings_free(names->local_dims);
-    osl_strings_free(names->arrays);
-
-    free(names);
-  }
-}
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-
-
-/**
- * osl_names_generate function:
- * this function generates some names. For each kind of name it will generate
- * a given number of names with a given prefix followed by a number.
- * \param[in] parameter_prefix Prefix for parameter names.
- * \param[in] nb_parameters    Number of parameters names to generate.
- * \param[in] iterator_prefix  Prefix for iterator names.
- * \param[in] nb_iterators     Number of iterators names to generate.
- * \param[in] scatt_dim_prefix Prefix for scattering dimension names.
- * \param[in] nb_scatt_dims    Number of scattering dim names to generate.
- * \param[in] local_dim_prefix Prefix for local dimension names.
- * \param[in] nb_local_dims    Number of local dimension names to generate.
- * \param[in] array_prefix     Prefix for array names.
- * \param[in] nb_arrays        Number of array names to generate.
- * \return A new names structure containing generated names.
- */
-osl_names_p osl_names_generate(
-    char * parameter_prefix, int nb_parameters,
-    char * iterator_prefix,  int nb_iterators,
-    char * scatt_dim_prefix, int nb_scatt_dims,
-    char * local_dim_prefix, int nb_local_dims,
-    char * array_prefix,     int nb_arrays) {
-  osl_names_p names = osl_names_malloc();
-
-  names->parameters= osl_strings_generate(parameter_prefix,nb_parameters);
-  names->iterators = osl_strings_generate(iterator_prefix, nb_iterators);
-  names->scatt_dims= osl_strings_generate(scatt_dim_prefix,nb_scatt_dims);
-  names->local_dims= osl_strings_generate(local_dim_prefix,nb_local_dims);
-  names->arrays    = osl_strings_generate(array_prefix,    nb_arrays);
-  
-  return names;
-}
-
-/**
- * osl_names_clone function:
- * this function builds and returns a "hard copy" (not a pointer copy) of an
- * osl_names_t data structure provided as parameter.
- * \param[in] names The pointer to the names structure we want to clone.
- * \return A pointer to the clone of the names structure provided as parameter.
- */
-osl_names_p osl_names_clone(osl_names_p names) {
-  osl_names_p clone = NULL;
-  
-  if (names != NULL) {
-    clone = osl_names_malloc();
-    clone->parameters = osl_strings_clone(names->parameters);
-    clone->iterators  = osl_strings_clone(names->iterators);
-    clone->scatt_dims = osl_strings_clone(names->scatt_dims);
-    clone->local_dims = osl_strings_clone(names->local_dims);
-    clone->arrays     = osl_strings_clone(names->arrays);
-  }
-  return clone;
-}
diff --git a/cloog-0.17.0/osl/source/relation.c b/cloog-0.17.0/osl/source/relation.c
deleted file mode 100644
index a4b641a..0000000
--- a/cloog-0.17.0/osl/source/relation.c
+++ /dev/null
@@ -1,2179 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                           relation.c                            **
-     **-----------------------------------------------------------------**
-     **                   First version: 30/04/2008                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#include <osl/macros.h>
-#include <osl/int.h>
-#include <osl/util.h>
-#include <osl/vector.h>
-#include <osl/strings.h>
-#include <osl/names.h>
-#include <osl/relation.h>
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-
-
-/**
- * osl_relation_sprint_type function:
- * this function prints the textual type of an osl_relation_t structure into
- * a string, according to the OpenScop specification, and returns that string.
- * \param[in] relation The relation whose type has to be printed.
- * \return A string containing the relation type.
- */
-static
-char * osl_relation_sprint_type(osl_relation_p relation) {
-  char * string = NULL;
-  
-  OSL_malloc(string, char *, OSL_MAX_STRING * sizeof(char));
-  string[0] = '\0';
-
-  if (relation != NULL) {
-    switch (relation->type) {
-      case OSL_UNDEFINED: {
-        snprintf(string, OSL_MAX_STRING, OSL_STRING_UNDEFINED);
-        break;
-      }
-      case OSL_TYPE_CONTEXT: {
-        snprintf(string, OSL_MAX_STRING, OSL_STRING_CONTEXT);
-        break;
-      }
-      case OSL_TYPE_DOMAIN: {
-        snprintf(string, OSL_MAX_STRING, OSL_STRING_DOMAIN);
-        break;
-      }
-      case OSL_TYPE_SCATTERING: {
-        snprintf(string, OSL_MAX_STRING, OSL_STRING_SCATTERING);
-        break;
-      }
-      case OSL_TYPE_READ: {
-        snprintf(string, OSL_MAX_STRING, OSL_STRING_READ);
-        break;
-      }
-      case OSL_TYPE_WRITE: {
-        snprintf(string, OSL_MAX_STRING, OSL_STRING_WRITE);
-        break;
-      }
-      case OSL_TYPE_MAY_WRITE: {
-        snprintf(string, OSL_MAX_STRING, OSL_STRING_MAY_WRITE);
-        break;
-      }
-      default: {
-        OSL_warning("unknown relation type, "
-                    "replaced with "OSL_STRING_UNDEFINED);
-        snprintf(string, OSL_MAX_STRING, OSL_STRING_UNDEFINED);
-      }
-    }
-  }
-
-  return string;
-}
-
-
-/**
- * osl_relation_print_type function:
- * this function displays the textual type of an osl_relation_t structure into
- * a file (file, possibly stdout), according to the OpenScop specification.
- * \param[in] file     File where informations are printed.
- * \param[in] relation The relation whose type has to be printed.
- */
-static
-void osl_relation_print_type(FILE * file, osl_relation_p relation) {
-  char * string = osl_relation_sprint_type(relation);
-  fprintf(file, "%s", string);
-  free(string);
-}
-
-
-/**
- * osl_relation_idump function:
- * this function displays a osl_relation_t structure (*relation) into a
- * file (file, possibly stdout) in a way that trends to be understandable.
- * It includes an indentation level (level) in order to work with others
- * idump functions.
- * \param[in] file     File where informations are printed.
- * \param[in] relation The relation whose information has to be printed.
- * \param[in] level    Number of spaces before printing, for each line.
- */
-void osl_relation_idump(FILE * file, osl_relation_p relation, int level) {
-  int i, j, first = 1;
-
-  // Go to the right level.
-  for (j = 0; j < level; j++)
-    fprintf(file, "|\t");
-
-  if (relation != NULL) {
-    fprintf(file, "+-- osl_relation_t (");
-    osl_relation_print_type(file, relation);
-    fprintf(file, ", ");
-    osl_int_dump_precision(file, relation->precision);
-    fprintf(file, ")\n");
-  }
-  else {
-    fprintf(file, "+-- NULL relation\n");
-  }
-
-  while (relation != NULL) {
-    if (! first) {
-      // Go to the right level.
-      for (j = 0; j < level; j++)
-        fprintf(file, "|\t");
-      fprintf(file, "|   osl_relation_t (");
-      osl_relation_print_type(file, relation);
-      fprintf(file, ", ");
-      osl_int_dump_precision(file, relation->precision);
-      fprintf(file, ")\n");
-    }
-    else
-      first = 0;
-
-    // A blank line
-    for(j = 0; j <= level; j++)
-      fprintf(file, "|\t");
-    fprintf(file, "%d %d %d %d %d %d\n",
-            relation->nb_rows,        relation->nb_columns,
-            relation->nb_output_dims, relation->nb_input_dims,
-            relation->nb_local_dims,  relation->nb_parameters);
-
-    // Display the relation.
-    for (i = 0; i < relation->nb_rows; i++) {
-      for (j = 0; j <= level; j++)
-        fprintf(file, "|\t");
-
-      fprintf(file, "[ ");
-
-      for (j = 0; j < relation->nb_columns; j++) {
-        osl_int_print(file, relation->precision, relation->m[i], j);
-        fprintf(file, " ");
-      }
-
-      fprintf(file, "]\n");
-    }
-
-    relation = relation->next;
-
-    // Next line.
-    if (relation != NULL) {
-      for (j = 0; j <= level; j++)
-        fprintf(file, "|\t");
-      fprintf(file, "|\n");
-      for (j = 0; j <= level; j++)
-        fprintf(file, "|\t");
-      fprintf(file, "V\n");
-    }
-  }
-
-  // The last line.
-  for (j = 0; j <= level; j++)
-    fprintf(file, "|\t");
-  fprintf(file, "\n");
-}
-
-
-/**
- * osl_relation_dump function:
- * this function prints the content of a osl_relation_t structure
- * (*relation) into a file (file, possibly stdout).
- * \param[in] file     File where informations are printed.
- * \param[in] relation The relation whose information have to be printed.
- */
-void osl_relation_dump(FILE * file, osl_relation_p relation) {
-  osl_relation_idump(file, relation, 0);
-}
-
-
-/**
- * osl_relation_expression_element function:
- * this function returns a string containing the printing of a value (e.g.,
- * an iterator with its coefficient or a constant).
- * \param[in]     val       Address of the coefficient or constant value.
- * \param[in]     precision The precision of the value.
- * \param[in,out] first     Pointer to a boolean set to 1 if the current value
- *                          is the first of an expresion, 0 otherwise (maybe
- *                          updated).
- * \param[in]     cst       A boolean set to 1 if the value is a constant,
- *                          0 otherwise.
- * \param[in]     name      String containing the name of the element.
- * \return A string that contains the printing of a value.
- */
-static
-char * osl_relation_expression_element(void * val,
-                                       int precision, int * first,
-                                       int cst, char * name) {
-  char * temp, * body, * sval;
- 
-  OSL_malloc(temp, char *, OSL_MAX_STRING * sizeof(char));
-  OSL_malloc(body, char *, OSL_MAX_STRING * sizeof(char));
-  OSL_malloc(sval, char *, OSL_MAX_STRING * sizeof(char));
-
-  body[0] = '\0';
-  sval[0] = '\0';
-
-  // statements for the 'normal' processing.
-  if (!osl_int_zero(precision, val, 0) && (!cst)) {
-    if ((*first) || osl_int_neg(precision, val, 0)) {
-      if (osl_int_one(precision, val, 0)) {         // case 1
-        sprintf(sval, "%s", name);
-      }
-      else {
-        if (osl_int_mone(precision, val, 0)) {      // case -1
-          sprintf(sval, "-%s", name);
-        }
-	else {                                      // default case
-	  osl_int_sprint(sval, precision, val, 0);
-	  sprintf(temp, "*%s", name);
-	  strcat(sval, temp);
-        }
-      }
-      *first = 0;
-    }
-    else {
-      if (osl_int_one(precision, val, 0)) {
-        sprintf(sval, "+%s", name);
-      }
-      else {
-        sprintf(sval, "+");
-	osl_int_sprint_txt(temp, precision, val, 0);
-	strcat(sval, temp);
-	sprintf(temp, "*%s", name);
-	strcat(sval, temp);
-      }
-    }
-  }
-  else {
-    if (cst) {
-      if ((osl_int_zero(precision, val, 0) && (*first)) ||
-          (osl_int_neg(precision, val, 0)))
-        osl_int_sprint_txt(sval, precision, val, 0);
-      if (osl_int_pos(precision, val, 0)) {
-        if (!(*first)) {
-          sprintf(sval, "+");
-          osl_int_sprint_txt(temp, precision, val, 0);
-	  strcat(sval, temp);
-	}
-	else {
-          osl_int_sprint_txt(sval, precision, val, 0);
-        }
-      }
-    }
-  }
-  free(temp);
-  free(body);
-
-  return(sval);
-}
-
-
-/**
- * osl_relation_strings function:
- * this function creates a NULL-terminated array of strings from an
- * osl_names_t structure in such a way that the ith string is the "name"
- * corresponding to the ith column of the constraint matrix.
- * \param[in] relation The relation for which we need an array of names.
- * \param[in] names    The set of names for each element.
- * \return An array of strings with one string per constraint matrix column.
- */
-static
-char ** osl_relation_strings(osl_relation_p relation, osl_names_p names) {
-  char ** strings;
-  char temp[OSL_MAX_STRING];
-  int i, offset, array_id;
-  
-  if ((relation == NULL) || (names == NULL)) {
-    OSL_debug("no names or relation to build the name array");
-    return NULL;
-  }
-
-  OSL_malloc(strings, char **, (relation->nb_columns + 1)*sizeof(char *));
-  strings[relation->nb_columns] = NULL;
-
-  // 1. Equality/inequality marker.
-  OSL_strdup(strings[0], "e/i");
-  offset = 1;
-
-  // 2. Output dimensions.
-  if (osl_relation_is_access(relation)) {
-    // The first output dimension is the array name.
-    array_id  = osl_relation_get_array_id(relation);
-    OSL_strdup(strings[offset], names->arrays->string[array_id - 1]);
-    // The other ones are the array dimensions [1]...[n]
-    for (i = offset + 1; i < relation->nb_output_dims + offset; i++) {
-      sprintf(temp, "[%d]", i - 1);
-      OSL_strdup(strings[i], temp);
-    }
-  }
-  else
-  if (relation->type == OSL_TYPE_SCATTERING) {
-    for (i = offset; i < relation->nb_output_dims + offset; i++) {
-      OSL_strdup(strings[i], names->scatt_dims->string[i - offset]);
-    }
-  }
-  else {
-    for (i = offset; i < relation->nb_output_dims + offset; i++) {
-      OSL_strdup(strings[i], names->iterators->string[i - offset]);
-    }
-  }
-  offset += relation->nb_output_dims;
-
-  // 3. Input dimensions.
-  for (i = offset; i < relation->nb_input_dims + offset; i++)
-    OSL_strdup(strings[i], names->iterators->string[i - offset]);
-  offset += relation->nb_input_dims;
-
-  // 4. Local dimensions.
-  for (i = offset; i < relation->nb_local_dims + offset; i++)
-    OSL_strdup(strings[i], names->local_dims->string[i - offset]);
-  offset += relation->nb_local_dims;
-
-  // 5. Parameters.
-  for (i = offset; i < relation->nb_parameters + offset; i++)
-    OSL_strdup(strings[i], names->parameters->string[i - offset]);
-  offset += relation->nb_parameters;
-
-  // 6. Scalar.
-  OSL_strdup(strings[offset], "1");
-
-  return strings;
-}
-
-
-/**
- * osl_relation_subexpression function:
- * this function returns a string corresponding to an affine (sub-)expression
- * stored at the "row"^th row of the relation pointed by "relation" between
- * the start and stop columns. Optionnaly it may oppose the whole expression.
- * \param[in] relation A set of linear expressions.
- * \param[in] row     The row corresponding to the expression.
- * \param[in] start   The first column for the expression (inclusive).
- * \param[in] stop    The last column for the expression (inclusive).
- * \param[in] oppose  Boolean set to 1 to negate the expression, 0 otherwise.
- * \param[in] strings Array of textual names of the various elements.
- * \return A string that contains the printing of an affine (sub-)expression.
- */
-static
-char * osl_relation_subexpression(osl_relation_p relation,
-                                  int row, int start, int stop, int oppose,
-                                  char ** strings) {
-  int i, first = 1, constant;
-  char * sval;
-  char * sline;
-  
-  OSL_malloc(sline, char *, OSL_MAX_STRING * sizeof(char));
-  sline[0] = '\0';
-
-  // Create the expression. The constant is a special case.
-  for (i = start; i <= stop; i++) {
-    if (oppose) {
-      osl_int_oppose(relation->precision,
-                     relation->m[row], i, relation->m[row], i);
-    }
-
-    if (i == relation->nb_columns - 1)
-      constant = 1;
-    else
-      constant = 0;
-
-    sval = osl_relation_expression_element(
-        osl_int_address(relation->precision, relation->m[row], i),
-        relation->precision, &first, constant, strings[i]);
-    
-    if (oppose) {
-      osl_int_oppose(relation->precision,
-                     relation->m[row], i, relation->m[row], i);
-    }
-    strcat(sline, sval);
-    free(sval);
-  }
-
-  return sline;
-}
-
-
-/**
- * osl_relation_expression function:
- * this function returns a string corresponding to an affine expression
- * stored at the "row"^th row of the relation pointed by "relation".
- * \param[in] relation A set of linear expressions.
- * \param[in] row     The row corresponding to the expression.
- * \param[in] strings Array of textual names of the various elements.
- * \return A string that contains the printing of an affine expression.
- */
-char * osl_relation_expression(osl_relation_p relation,
-                               int row, char ** strings) {
-
-  return osl_relation_subexpression(relation, row,
-                                    1, relation->nb_columns - 1, 0,
-                                    strings);
-}
-
-
-/**
- * osl_relation_is_simple_output function:
- * this function returns 1 or -1 if a given constraint row of a relation
- * corresponds to an output, 0 otherwise. We call a simple output an equality
- * constraint where exactly one output coefficient is not 0 and is either
- * 1 (in this case the function returns 1) or -1 (in this case the function
- * returns -1). 
- * \param[in] relation The relation to test for simple output.
- * \param[in] row      The row corresponding to the constraint to test.
- * \return 1 or -1 if the row is a simple output, 0 otherwise.
- */
-static
-int osl_relation_is_simple_output(osl_relation_p relation, int row) {
-  int i;
-  int first = 1;
-  int sign  = 0;
-
-  if ((relation == NULL) ||
-      (relation->m == NULL) ||
-      (relation->nb_output_dims == 0))
-    return 0;
-
-  if ((row < 0) || (row > relation->nb_rows))
-    OSL_error("the specified row does not exist in the relation");
-
-  // The constraint must be an equality.
-  if (!osl_int_zero(relation->precision, relation->m[row], 0))
-    return 0;
-
-  // Check the output part has one and only one non-zero +1 or -1 coefficient.
-  first = 1;
-  for (i = 1; i <= relation->nb_output_dims; i++) {
-    if (!osl_int_zero(relation->precision, relation->m[row], i)) {
-      if (first)
-        first = 0;
-      else
-        return 0;
-
-      if (osl_int_one(relation->precision, relation->m[row], i))
-        sign = 1;
-      else if (osl_int_mone(relation->precision, relation->m[row], i))
-        sign = -1;
-      else
-        return 0;
-    }
-  }
-
-  return sign;
-}
-
-
-/**
- * osl_relation_sprint_comment function:
- * this function prints into a string a comment corresponding to a constraint
- * of a relation, according to its type, then it returns this string. This
- * function does not check that printing the comment is possible (i.e., are
- * there enough names ?), hence it is the responsibility of the user to ensure
- * he/she can call this function safely.
- * \param[in] relation The relation for which a comment has to be printed.
- * \param[in] row      The constrain row for which a comment has to be printed.
- * \param[in] strings  Array of textual names of the various elements.
- * \return A string which contains the comment for the row.
- */ 
-static
-char * osl_relation_sprint_comment(osl_relation_p relation,
-                                   int row, char ** strings) {
-  int sign;
-  int high_water_mark = OSL_MAX_STRING;
-  char * string = NULL;
-  char * expression;
-  char buffer[OSL_MAX_STRING];
-
-  OSL_malloc(string, char *, high_water_mark * sizeof(char));
-  string[0] = '\0';
-  
-  if ((relation == NULL) || (strings == NULL)) {
-    OSL_debug("no relation or names while asked to print a comment");
-    return string;
-  }
-  
-  if ((sign = osl_relation_is_simple_output(relation, row))) {
-    // First case : output == expression.
-
-    expression = osl_relation_subexpression(relation, row,
-                                            1, relation->nb_output_dims,
-                                            sign < 0,
-                                            strings);
-    snprintf(buffer, OSL_MAX_STRING, "   ## %s", expression);
-    osl_util_safe_strcat(&string, buffer, &high_water_mark);
-    free(expression);
-    
-    // We don't print the right hand side if it's an array identifier.
-    if (!osl_relation_is_access(relation) ||
-        osl_int_zero(relation->precision, relation->m[row], 1)) {
-      expression = osl_relation_subexpression(relation, row,
-                                              relation->nb_output_dims + 1,
-                                              relation->nb_columns - 1,
-                                              sign > 0,
-                                              strings);
-      snprintf(buffer, OSL_MAX_STRING, " == %s", expression);
-      osl_util_safe_strcat(&string, buffer, &high_water_mark);
-      free(expression);
-    }
-  }
-  else {
-    // Second case : general case.
-    
-    expression = osl_relation_expression(relation, row, strings);
-    snprintf(buffer, OSL_MAX_STRING, "   ## %s", expression);
-    osl_util_safe_strcat(&string, buffer, &high_water_mark);
-    free(expression);
-    
-    if (osl_int_zero(relation->precision, relation->m[row], 0))
-      snprintf(buffer, OSL_MAX_STRING, " == 0");
-    else
-      snprintf(buffer, OSL_MAX_STRING, " >= 0");
-    osl_util_safe_strcat(&string, buffer, &high_water_mark);
-  }
-
-  return string;
-}
-
-
-/**
- * osl_relation_column_string function:
- * this function returns an OpenScop comment string showing all column
- * names. It is designed to nicely fit a constraint matrix that would be
- * printed just below this line.
- * \param[in] relation The relation related to the comment line to build.
- * \param[in] strings  Array of textual names of the various elements.
- * \return A fancy comment string with all the dimension names.
- */
-static
-char * osl_relation_column_string(osl_relation_p relation, char ** strings) {
-  int i, j;
-  int index_output_dims;
-  int index_input_dims;
-  int index_local_dims;
-  int index_parameters;
-  int index_scalar;
-  int space, length, left, right;
-  char * scolumn;
-  char temp[OSL_MAX_STRING];
-
-  OSL_malloc(scolumn, char *, OSL_MAX_STRING);
- 
-  index_output_dims = 1;
-  index_input_dims  = index_output_dims + relation->nb_output_dims;
-  index_local_dims  = index_input_dims  + relation->nb_input_dims;
-  index_parameters  = index_local_dims  + relation->nb_local_dims;
-  index_scalar      = index_parameters  + relation->nb_parameters;
-
-  // 1. The comment part.
-  sprintf(scolumn, "#");
-  for (j = 0; j < (OSL_FMT_LENGTH - 1)/2 - 1; j++)
-    strcat(scolumn, " ");
-
-  i = 0;
-  while (strings[i] != NULL) {
-    space  = OSL_FMT_LENGTH;
-    length = (space > strlen(strings[i])) ? strlen(strings[i]) : space;
-    right  = (space - length + (OSL_FMT_LENGTH % 2)) / 2;
-    left   = space - length - right;
-
-    // 2. Spaces before the name
-    for (j = 0; j < left; j++)
-      strcat(scolumn, " ");
-
-    // 3. The (abbreviated) name
-    for (j = 0; j < length - 1; j++) {
-      sprintf(temp, "%c", strings[i][j]);
-      strcat(scolumn, temp);
-    }
-    if (length >= strlen(strings[i]))
-      sprintf(temp, "%c", strings[i][j]);
-    else 
-      sprintf(temp, ".");
-    strcat(scolumn, temp);
-
-    // 4. Spaces after the name
-    for (j = 0; j < right; j++)
-      strcat(scolumn, " ");
-    
-    i++;
-    if ((i == index_output_dims) ||
-        (i == index_input_dims)  ||
-        (i == index_local_dims)  ||
-        (i == index_parameters)  ||
-        (i == index_scalar))
-      strcat(scolumn, "|");
-    else
-      strcat(scolumn, " ");
-  }
-  strcat(scolumn, "\n");
-
-  return scolumn;
-}
-
-
-/**
- * osl_relation_names function:
- * this function generates as set of names for all the dimensions
- * involved in a given relation.
- * \param[in] relation The relation we have to generate names for.
- * \return A set of generated names for the input relation dimensions.
- */
-static
-osl_names_p osl_relation_names(osl_relation_p relation) {
-  int nb_parameters = OSL_UNDEFINED;
-  int nb_iterators  = OSL_UNDEFINED;
-  int nb_scattdims  = OSL_UNDEFINED;
-  int nb_localdims  = OSL_UNDEFINED;
-  int array_id      = OSL_UNDEFINED;
-
-  osl_relation_get_attributes(relation, &nb_parameters, &nb_iterators,
-                              &nb_scattdims, &nb_localdims, &array_id);
-  
-  return osl_names_generate("P", nb_parameters,
-                            "i", nb_iterators,
-                            "c", nb_scattdims,
-                            "l", nb_localdims,
-                            "A", array_id);
-}
-
-
-/**
- * osl_relation_nb_components function:
- * this function returns the number of component in the union of relations
- * provided as parameter.
- * \param[in] relation The input union of relations.
- * \return The number of components in the input union of relations.
- */
-int osl_relation_nb_components(osl_relation_p relation) {
-  int nb_components = 0;
-  
-  while (relation != NULL) {
-    nb_components++;
-    relation = relation->next;
-  }
-
-  return nb_components;
-}
-
-
-/**
- * osl_relation_spprint_polylib function:
- * this function pretty-prints the content of an osl_relation_t structure
- * (*relation) into a string in the extended polylib format, and returns this
- * string. This format is the same as OpenScop's, minus the type.
- * \param[in] relation The relation whose information has to be printed.
- * \param[in] names    The names of the constraint columns for comments.
- * \return A string containing the relation pretty-printing.
- */
-char * osl_relation_spprint_polylib(osl_relation_p relation,
-                                    osl_names_p names) {
-  int i, j;
-  int part, nb_parts;
-  int generated_names = 0;
-  int high_water_mark = OSL_MAX_STRING;
-  char * string = NULL;
-  char buffer[OSL_MAX_STRING];
-  char ** name_array = NULL;
-  char * scolumn;
-  char * comment;
-
-  if (relation == NULL)
-    return strdup("# NULL relation\n");
-
-  OSL_malloc(string, char *, high_water_mark * sizeof(char));
-  string[0] = '\0';
-
-  // Generates the names for the comments if necessary.
-  if (names == NULL) {
-    generated_names = 1;
-    names = osl_relation_names(relation);
-  }
-
-  nb_parts = osl_relation_nb_components(relation);
-
-  if (nb_parts > 1) {
-    snprintf(buffer, OSL_MAX_STRING, "# Union with %d parts\n%d\n",
-             nb_parts, nb_parts);
-    osl_util_safe_strcat(&string, buffer, &high_water_mark);
-  }
-
-  // Print each part of the union.
-  for (part = 1; part <= nb_parts; part++) {
-    // Prepare the array of strings for comments.
-    name_array = osl_relation_strings(relation, names);
-
-    if (nb_parts > 1) {
-      snprintf(buffer, OSL_MAX_STRING, "# Union part No.%d\n", part);
-      osl_util_safe_strcat(&string, buffer, &high_water_mark);
-    }
-
-    snprintf(buffer, OSL_MAX_STRING, "%d %d %d %d %d %d\n",
-             relation->nb_rows,        relation->nb_columns,
-             relation->nb_output_dims, relation->nb_input_dims,
-             relation->nb_local_dims,  relation->nb_parameters);
-    osl_util_safe_strcat(&string, buffer, &high_water_mark);
-
-    if (relation->nb_rows > 0) {
-      scolumn = osl_relation_column_string(relation, name_array);
-      snprintf(buffer, OSL_MAX_STRING, "%s", scolumn);
-      osl_util_safe_strcat(&string, buffer, &high_water_mark);
-      free(scolumn);
-    }
-
-    for (i = 0; i < relation->nb_rows; i++) {
-      for (j = 0; j < relation->nb_columns; j++) {
-        osl_int_sprint(buffer, relation->precision, relation->m[i], j);
-        osl_util_safe_strcat(&string, buffer, &high_water_mark);
-        snprintf(buffer, OSL_MAX_STRING, " ");
-        osl_util_safe_strcat(&string, buffer, &high_water_mark);
-      }
-
-      if (name_array != NULL) {
-        comment = osl_relation_sprint_comment(relation, i, name_array);
-        osl_util_safe_strcat(&string, comment, &high_water_mark);
-        free(comment);
-      }
-      snprintf(buffer, OSL_MAX_STRING, "\n");
-      osl_util_safe_strcat(&string, buffer, &high_water_mark);
-    }
-
-    // Free the array of strings.
-    if (name_array != NULL) {
-      for (i = 0; i < relation->nb_columns; i++)
-        free(name_array[i]);
-      free(name_array);
-    }
-
-    relation = relation->next;
-  }
-  
-  if (generated_names)
-    osl_names_free(names);
-
-  return string;
-}
-
-
-/**
- * osl_relation_spprint function:
- * this function pretty-prints the content of an osl_relation_t structure
- * (*relation) into a string in the OpenScop format, and returns this string.
- * \param[in] relation The relation whose information has to be printed.
- * \param[in] names    The names of the constraint columns for comments.
- * \return A string 
- */
-char * osl_relation_spprint(osl_relation_p relation, osl_names_p names) {
-  int high_water_mark = OSL_MAX_STRING;
-  char * string = NULL;
-  char * temp;
-  char buffer[OSL_MAX_STRING];
-  OSL_malloc(string, char *, high_water_mark * sizeof(char));
-  string[0] = '\0';
-
-  if (osl_relation_nb_components(relation) > 0) {
-    temp = osl_relation_sprint_type(relation);
-    osl_util_safe_strcat(&string, temp, &high_water_mark);
-    free(temp);
-    
-    snprintf(buffer, OSL_MAX_STRING, "\n");
-    osl_util_safe_strcat(&string, buffer, &high_water_mark);
-
-    temp = osl_relation_spprint_polylib(relation, names);
-    osl_util_safe_strcat(&string, temp, &high_water_mark);
-    free(temp);
-  }
-
-  return string;
-}
-
-
-/**
- * osl_relation_pprint function:
- * this function pretty-prints the content of an osl_relation_t structure
- * (*relation) into a file (file, possibly stdout) in the OpenScop format.
- * \param[in] file     File where informations are printed.
- * \param[in] relation The relation whose information has to be printed.
- * \param[in] names    The names of the constraint columns for comments. 
- */
-void osl_relation_pprint(FILE * file, osl_relation_p relation,
-                         osl_names_p names) {
-  char * string = osl_relation_spprint(relation, names);
-  fprintf(file, "%s", string);
-  free(string);
-}
-
-
-/**
- * osl_relation_print function:
- * this function prints the content of an osl_relation_t structure
- * (*relation) into a file (file, possibly stdout) in the OpenScop format.
- * \param[in] file     File where informations are printed.
- * \param[in] relation The relation whose information has to be printed.
- */
-void osl_relation_print(FILE * file, osl_relation_p relation) {
-
-  osl_relation_pprint(file, relation, NULL);
-}
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-
-
-/**
- * osl_relation_read_type function:
- * this function reads a textual relation type and returns its integer
- * counterpart.
- * \param[in] file The input stream.
- * \return The relation type.
- */
-static
-int osl_relation_read_type(FILE * file) {
-  int type;
-  osl_strings_p strings;
-  
-  strings = osl_strings_read(file);
-  if (osl_strings_size(strings) > 1) {
-    OSL_warning("uninterpreted information (after the relation type)");
-  }
-  if (osl_strings_size(strings) == 0)
-    OSL_error("no relation type");
- 
-  if (!strcmp(strings->string[0], OSL_STRING_UNDEFINED)) {
-    type = OSL_UNDEFINED;
-    goto return_type;
-  }
-
-  if (!strcmp(strings->string[0], OSL_STRING_CONTEXT)) {
-    type = OSL_TYPE_CONTEXT; 
-    goto return_type;
-  }
-
-  if (!strcmp(strings->string[0], OSL_STRING_DOMAIN)) {
-    type = OSL_TYPE_DOMAIN; 
-    goto return_type;
-  }
-
-  if (!strcmp(strings->string[0], OSL_STRING_SCATTERING)) {
-    type = OSL_TYPE_SCATTERING; 
-    goto return_type;
-  }
-
-  if (!strcmp(strings->string[0], OSL_STRING_READ)) {
-    type = OSL_TYPE_READ; 
-    goto return_type;
-  }
-
-  if (!strcmp(strings->string[0], OSL_STRING_WRITE)) {
-    type = OSL_TYPE_WRITE; 
-    goto return_type;
-  }
-
-  if (!strcmp(strings->string[0], OSL_STRING_MAY_WRITE)) {
-    type = OSL_TYPE_MAY_WRITE; 
-    goto return_type;
-  }
-
-  OSL_error("relation type not supported");
-
-return_type:
-  osl_strings_free(strings);
-  return type;
-}
-
-
-/**
- * osl_relation_pread function ("precision read"):
- * this function reads a relation into a file (foo, posibly stdin) and
- * returns a pointer this relation. The relation is set to the maximum
- * available precision.
- * \param[in] foo       The input stream.
- * \param[in] precision The precision of the relation elements.
- * \return A pointer to the relation structure that has been read.
- */
-osl_relation_p osl_relation_pread(FILE * foo, int precision) {
-  int i, j, k, n, read = 0;
-  int nb_rows, nb_columns;
-  int nb_output_dims, nb_input_dims, nb_local_dims, nb_parameters;
-  int nb_union_parts = 1;
-  int may_read_nb_union_parts = 1;
-  int read_attributes = 1;
-  int first = 1;
-  int type;
-  char * c, s[OSL_MAX_STRING], str[OSL_MAX_STRING], *tmp;
-  osl_relation_p relation, relation_union = NULL, previous = NULL;
-
-  type = osl_relation_read_type(foo);
-
-  // Read each part of the union (the number of parts may be updated inside)
-  for (k = 0; k < nb_union_parts; k++) {
-    // Read the number of union parts or the attributes of the union part
-    while (read_attributes) {
-      read_attributes = 0;
-
-      // Read relation attributes.
-      c = osl_util_skip_blank_and_comments(foo, s);
-      read = sscanf(c, " %d %d %d %d %d %d", &nb_rows, &nb_columns,
-                                             &nb_output_dims, &nb_input_dims,
-                                             &nb_local_dims, &nb_parameters);
-    
-      if (((read != 1) && (read != 6)) ||
-          ((read == 1) && (may_read_nb_union_parts != 1)))
-        OSL_error("not 1 or 6 integers on the first relation line");
-
-      if (read == 1) {
-        // Only one number means a union and is the number of parts.
-        nb_union_parts = nb_rows;
-        if (nb_union_parts < 1)
-          OSL_error("negative nb of union parts");
-        
-        // Allow to read the properties of the first part of the union.
-        read_attributes = 1;
-      }
-
-      may_read_nb_union_parts = 0;
-    }
-
-    // Allocate the union part and fill its properties.
-    relation = osl_relation_pmalloc(precision, nb_rows, nb_columns);
-    relation->type           = type;
-    relation->nb_output_dims = nb_output_dims;
-    relation->nb_input_dims  = nb_input_dims;
-    relation->nb_local_dims  = nb_local_dims;
-    relation->nb_parameters  = nb_parameters;
-
-    // Read the matrix of constraints.
-    for (i = 0; i < relation->nb_rows; i++) {
-      c = osl_util_skip_blank_and_comments(foo, s);
-      if (c == NULL)
-        OSL_error("not enough rows");
-
-      for (j = 0; j < relation->nb_columns; j++) {
-        if (c == NULL || *c == '#' || *c == '\n')
-          OSL_error("not enough columns");
-        if (sscanf(c, "%s%n", str, &n) == 0)
-          OSL_error("not enough rows");
-
-        // TODO: remove this tmp (sread updates the pointer).
-        tmp = str;
-        osl_int_sread(&tmp, precision, relation->m[i], j);
-        c += n;
-      }
-    }
-    
-    // Build the linked list of union parts.
-    if (first == 1) {
-      relation_union = relation;
-      first = 0;
-    }
-    else {
-      previous->next = relation;
-    }
-
-    previous = relation;
-    read_attributes = 1;
-  }
-
-  return relation_union;
-}
-
-
-/**
- * osl_relation_read function:
- * this function is equivalent to osl_relation_pread() except that
- * the precision corresponds to the precision environment variable or
- * to the highest available precision if it is not defined.
- * \see{osl_relation_pread}
- */
-osl_relation_p osl_relation_read(FILE * foo) {
-  int precision = osl_util_get_precision();
-  return osl_relation_pread(foo, precision);
-}
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-
-
-/**
- * osl_relation_pmalloc function:
- * (precision malloc) this function allocates the memory space for an
- * osl_relation_t structure and sets its fields with default values.
- * Then it returns a pointer to the allocated space.
- * \param[in] precision  The precision of the constraint matrix.
- * \param[in] nb_rows    The number of row of the relation to allocate.
- * \param[in] nb_columns The number of columns of the relation to allocate.
- * \return A pointer to an empty relation with fields set to default values
- *         and a ready-to-use constraint matrix.
- */
-osl_relation_p osl_relation_pmalloc(int precision,
-                                    int nb_rows, int nb_columns) {
-  osl_relation_p relation;
-  void ** p, * q;
-  int i, j;
-
-  OSL_malloc(relation, osl_relation_p, sizeof(osl_relation_t));
-  relation->type           = OSL_UNDEFINED;
-  relation->nb_rows        = nb_rows;
-  relation->nb_columns     = nb_columns;
-  relation->nb_output_dims = OSL_UNDEFINED;
-  relation->nb_input_dims  = OSL_UNDEFINED;
-  relation->nb_parameters  = OSL_UNDEFINED;
-  relation->nb_local_dims  = OSL_UNDEFINED;
-  relation->precision      = precision;
-  
-  if ((nb_rows == 0) || (nb_columns == 0) ||
-      (nb_rows == OSL_UNDEFINED) || (nb_columns == OSL_UNDEFINED)) {
-    relation->m = NULL;
-  } 
-  else {
-    OSL_malloc(p, void **, nb_rows * sizeof(void *));
-    OSL_malloc(q, void *,
-                    nb_rows * nb_columns * osl_int_sizeof(precision));
-    relation->m = p;
-    for (i = 0; i < nb_rows; i++) {
-      relation->m[i] = osl_int_address(precision, q, i * nb_columns);
-      for (j = 0; j < nb_columns; j++)
-        osl_int_init_set_si(precision, relation->m[i], j, 0);
-    }
-  }
- 
-  relation->next = NULL;
-
-  return relation;
-}
-
-
-/**
- * osl_relation_malloc function:
- * this function is equivalent to osl_relation_pmalloc() except that
- * the precision corresponds to the precision environment variable or
- * to the highest available precision if it is not defined.
- * \see{osl_relation_pmalloc}
- */
-osl_relation_p osl_relation_malloc(int nb_rows, int nb_columns) {
-  int precision = osl_util_get_precision();
-  return osl_relation_pmalloc(precision, nb_rows, nb_columns);
-}
-
-
-/**
- * osl_relation_free_inside function:
- * this function frees the allocated memory for the inside of a
- * osl_relation_t structure, i.e. only m.
- * \param[in] relation The pointer to the relation we want to free internals.
- */
-void osl_relation_free_inside(osl_relation_p relation) {
-  int i, nb_elements;
-  void * p;
-
-  if (relation == NULL)
-    return;
-
-  nb_elements = relation->nb_rows * relation->nb_columns;
-  
-  if (nb_elements > 0)
-    p = relation->m[0];
-  
-  for (i = 0; i < nb_elements; i++)
-    osl_int_clear(relation->precision, p, i);
-
-  if (relation->m != NULL) {
-    if (nb_elements > 0)
-      free(relation->m[0]);
-    free(relation->m);
-  }
-}
-
-
-/**
- * osl_relation_free function:
- * this function frees the allocated memory for an osl_relation_t
- * structure.
- * \param[in] relation The pointer to the relation we want to free.
- */
-void osl_relation_free(osl_relation_p relation) {
-  osl_relation_p tmp;
-  
-  if (relation == NULL)
-    return;
-
-  while (relation != NULL) {
-    tmp = relation->next;
-    osl_relation_free_inside(relation);
-    free(relation);
-    relation = tmp;
-  }
-}
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-
-
-/**
- * osl_relation_nclone function:
- * this functions builds and returns a "hard copy" (not a pointer copy) of a
- * osl_relation_t data structure such that the clone is restricted to the
- * "n" first rows of the relation. This applies to all the parts in the case
- * of a relation union.
- * \param[in] relation The pointer to the relation we want to clone.
- * \param[in] n        The number of row of the relation we want to clone (the
- *                     special value -1 means "all the rows").
- * \return A pointer to the clone of the relation union restricted to the
- *         first n rows of constraint matrix for each part of the union.
- */
-osl_relation_p osl_relation_nclone(osl_relation_p relation, int n) {
-  int i, j;
-  int first = 1, all_rows = 0;
-  osl_relation_p clone = NULL, node, previous = NULL;
-
-  if (n == -1)
-    all_rows = 1;
-
-  while (relation != NULL) {
-    if (all_rows)
-      n = relation->nb_rows;
-
-    if (n > relation->nb_rows)
-      OSL_error("not enough rows to clone in the relation");
-
-    node = osl_relation_pmalloc(relation->precision, n, relation->nb_columns);
-    node->type           = relation->type;
-    node->nb_output_dims = relation->nb_output_dims;
-    node->nb_input_dims  = relation->nb_input_dims;
-    node->nb_local_dims  = relation->nb_local_dims;
-    node->nb_parameters  = relation->nb_parameters;
-
-    for (i = 0; i < n; i++)
-      for (j = 0; j < relation->nb_columns; j++)
-        osl_int_assign(relation->precision, node->m[i], j, relation->m[i], j);
-  
-    if (first) {
-      first = 0;
-      clone = node;
-      previous = node;
-    }
-    else {
-      previous->next = node;
-      previous = previous->next;
-    }
-
-    relation = relation->next;
-  }
-
-  return clone;
-}
-
-
-/**
- * osl_relation_clone function:
- * this function builds and returns a "hard copy" (not a pointer copy) of an
- * osl_relation_t data structure (the full union of relation).
- * \param[in] relation The pointer to the relation we want to clone.
- * \return A pointer to the clone of the union of relations.
- */
-osl_relation_p osl_relation_clone(osl_relation_p relation) {
-  if (relation == NULL)
-    return NULL;
-
-  return osl_relation_nclone(relation, -1);
-}
-
-
-/**
- * osl_relation_replace_vector function:
- * this function replaces the "row"^th row of a relation "relation" with the
- * vector "vector". It directly updates the relation union part pointed
- * by "relation" and this part only.
- * \param[in,out] relation The relation we want to replace a row.
- * \param[in]     vector   The vector that will replace a row of the relation.
- * \param[in]     row      The row of the relation to be replaced.
- */
-void osl_relation_replace_vector(osl_relation_p relation,
-                                 osl_vector_p vector, int row) {
-  int i;
-
-  if ((relation == NULL) || (vector == NULL)     ||
-      (relation->precision != vector->precision) ||
-      (relation->nb_columns != vector->size)     ||
-      (row >= relation->nb_rows) || (row < 0))
-    OSL_error("vector cannot replace relation row");
-
-  for (i = 0; i < vector->size; i++)
-    osl_int_assign(relation->precision, relation->m[row], i, vector->v, i);
-}
-
-
-/**
- * osl_relation_add_vector function:
- * this function adds (meaning, +) a vector to the "row"^th row of a
- * relation "relation". It directly updates the relation union part pointed
- * by "relation" and this part only.
- * \param[in,out] relation The relation we want to add a vector to a row.
- * \param[in]     vector   The vector that will replace a row of the relation.
- * \param[in]     row      The row of the relation to add the vector.
- */
-void osl_relation_add_vector(osl_relation_p relation,
-                             osl_vector_p vector, int row) {
-  int i;
-
-  if ((relation == NULL) || (vector == NULL)     ||
-      (relation->precision != vector->precision) ||
-      (relation->nb_columns != vector->size)     ||
-      (row >= relation->nb_rows) || (row < 0))
-    OSL_error("vector cannot be added to relation");
-
-  if (osl_int_get_si(relation->precision, relation->m[row], 0) == 0)
-    osl_int_assign(relation->precision, relation->m[row], 0, vector->v, 0);
-
-  for (i = 1; i < vector->size; i++)
-    osl_int_add(relation->precision,
-                relation->m[row], i, relation->m[row], i, vector->v, i);
-}
-
-
-/**
- * osl_relation_sub_vector function:
- * this function subtracts the vector "vector" to the "row"^th row of
- * a relation "relation. It directly updates the relation union part pointed
- * by "relation" and this part only.
- * \param[in,out] relation The relation where to subtract a vector to a row.
- * \param[in]     vector   The vector to subtract to a relation row.
- * \param[in]     row      The row of the relation to subtract the vector.
- */
-void osl_relation_sub_vector(osl_relation_p relation,
-                             osl_vector_p vector, int row) {
-  int i;
-
-  if ((relation == NULL) || (vector == NULL)     ||
-      (relation->precision != vector->precision) ||
-      (relation->nb_columns != vector->size)     ||
-      (row >= relation->nb_rows) || (row < 0))
-    OSL_error("vector cannot be subtracted to row");
-
-  if (osl_int_get_si(relation->precision, relation->m[row], 0) == 0)
-    osl_int_assign(relation->precision, relation->m[row], 0, vector->v, 0);
-
-  for (i = 1; i < vector->size; i++)
-    osl_int_sub(relation->precision,
-                relation->m[row], i, relation->m[row], i, vector->v, i);
-}
-
-
-/**
- * osl_relation_insert_vector function:
- * this function inserts a new row corresponding to the vector "vector" to
- * the relation "relation" by inserting it at the "row"^th row. It directly
- * updates the relation union part pointed by "relation" and this part only.
- * If "vector" (or "relation") is NULL, the relation is left unmodified.
- * \param[in,out] relation The relation we want to extend.
- * \param[in]     vector   The vector that will be added relation.
- * \param[in]     row      The row where to insert the vector.
- */
-void osl_relation_insert_vector(osl_relation_p relation,
-                                osl_vector_p vector, int row) {
-  osl_relation_p temp;
-
-  temp = osl_relation_from_vector(vector);
-  osl_relation_insert_constraints(relation, temp, row);
-  osl_relation_free(temp);
-}
-
-
-/**
- * osl_relation_insert_blank_row function:
- * this function inserts a new row filled with zeros o an existing relation
- * union part (it only affects the first union part).
- * \param[in,out] relation The relation to add a row in.
- * \param[in]     row      The row where to insert the blank row.
- */
-void osl_relation_insert_blank_row(osl_relation_p relation, int row) {
-  osl_vector_p vector;
-
-  if (relation != NULL) {
-    vector = osl_vector_pmalloc(relation->precision, relation->nb_columns);
-    osl_relation_insert_vector(relation, vector, row);
-    osl_vector_free(vector);
-  }
-}
-
-
-/**
- * osl_relation_insert_blank_column function:
- * this function inserts a new column filled with zeros to an existing
- * relation union part (it only affects the first union part). WARNING:
- * this function does not update the relation attributes.
- * \param[in,out] relation The relation to add a column in.
- * \param[in]     column   The column where to insert the blank column.
- */
-void osl_relation_insert_blank_column(osl_relation_p relation, int column) {
-
-  int i, j;
-  osl_relation_p temp;
-
-  if (relation == NULL)
-    return;
-
-  if ((column < 0) || (column > relation->nb_columns))
-    OSL_error("bad column number");
-
-  // We use a temporary relation just to reuse existing functions. Cleaner.
-  temp = osl_relation_pmalloc(relation->precision,
-                              relation->nb_rows, relation->nb_columns + 1);
-
-  for (i = 0; i < relation->nb_rows; i++) {
-    for (j = 0; j < column; j++)
-      osl_int_assign(relation->precision, temp->m[i], j, relation->m[i], j);
-
-    for (j = column; j < relation->nb_columns; j++)
-      osl_int_assign(relation->precision, temp->m[i], j+1, relation->m[i], j);
-  }
-
-  osl_relation_free_inside(relation);
-
-  // Replace the inside of relation.
-  relation->nb_columns = temp->nb_columns;
-  relation->m = temp->m;
-
-  // Free the temp "shell".
-  free(temp);
-}
-
-
-/**
- * osl_relation_from_vector function:
- * this function converts a vector "vector" to a relation with a single row
- * and returns a pointer to that relation.
- * \param[in] vector The vector to convert to a relation.
- * \return A pointer to a relation resulting from the vector conversion.
- */
-osl_relation_p osl_relation_from_vector(osl_vector_p vector) {
-  osl_relation_p relation;
-
-  if (vector == NULL)
-    return NULL;
-
-  relation = osl_relation_pmalloc(vector->precision, 1, vector->size);
-  osl_relation_replace_vector(relation, vector, 0);
-  return relation;
-}
-
-
-/**
- * osl_relation_replace_constraints function:
- * this function replaces some rows of a relation "r1" with the rows of
- * the relation "r2". It begins at the "row"^th row of "r1". It directly
- * updates the relation union part pointed by "r1" and this part only.
- * \param[in,out] r1  The relation we want to change some rows.
- * \param[in]     r2  The relation containing the new rows.
- * \param[in]     row The first row of the relation r1 to be replaced.
- */
-void osl_relation_replace_constraints(osl_relation_p r1,
-                                      osl_relation_p r2, int row) {
-  int i, j;
-
-  if ((r1 == NULL) || (r2 == NULL)       ||
-      (r1->precision != r2->precision)   ||
-      (r1->nb_columns != r1->nb_columns) ||
-      ((row + r2->nb_rows) > r1->nb_rows) || (row < 0))
-    OSL_error("relation rows could not be replaced");
-
-  for (i = 0; i < r2->nb_rows; i++)
-    for (j = 0; j < r2->nb_columns; j++)
-      osl_int_assign(r1->precision, r1->m[i+row], j, r2->m[i], j);
-}
-
-
-/**
- * osl_relation_insert_constraints function:
- * this function adds new rows corresponding to the relation "r1" to
- * the relation "r2" by inserting it at the "row"^th row. It directly
- * updates the relation union part pointed by "r1" and this part only.
- * If "r2" (or "r1") is NULL, the relation is left unmodified.
- * \param[in,out] r1  The relation we want to extend.
- * \param[in]     r2  The relation to be inserted.
- * \param[in]     row The row where to insert the relation
- */
-void osl_relation_insert_constraints(osl_relation_p r1,
-                                     osl_relation_p r2, int row) {
-  int i, j;
-  osl_relation_p temp;
-
-  if ((r1 == NULL) || (r2 == NULL))
-    return;
-
-  if ((r1->nb_columns != r2->nb_columns) ||
-      (r1->precision != r2->precision)   ||
-      (row > r1->nb_rows) || (row < 0))
-    OSL_error("constraints cannot be inserted");
-
-  // We use a temporary relation just to reuse existing functions. Cleaner.
-  temp = osl_relation_pmalloc(r1->precision,
-                              r1->nb_rows + r2->nb_rows, r1->nb_columns);
-
-  for (i = 0; i < row; i++)
-    for (j = 0; j < r1->nb_columns; j++)
-      osl_int_assign(r1->precision, temp->m[i], j, r1->m[i], j);
-
-  osl_relation_replace_constraints(temp, r2, row);
-
-  for (i = row + r2->nb_rows; i < r2->nb_rows + r1->nb_rows; i++)
-    for (j = 0; j < r1->nb_columns; j++)
-      osl_int_assign(r1->precision, temp->m[i], j, r1->m[i-r2->nb_rows], j);
-
-  osl_relation_free_inside(r1);
-
-  // Replace the inside of relation.
-  r1->nb_rows = temp->nb_rows;
-  r1->m = temp->m;
-
-  // Free the temp "shell".
-  free(temp);
-}
-
-
-/**
- * osl_relation_insert_columns function:
- * this function inserts new columns to an existing relation union part (it
- * only affects the first union part). The columns are copied out from the
- * matrix of an input relation which must have the convenient number of rows.
- * All columns of the input matrix are copied. WARNING: this function does not 
- * update the relation attributes of the modified matrix.
- * \param[in,out] relation The relation to add columns in.
- * \param[in]     insert   The relation containing the columns to add.
- * \param[in]     column   The column where to insert the new columns.
- */
-void osl_relation_insert_columns(osl_relation_p relation,
-                                 osl_relation_p insert, int column) {
-  int i, j;
-  osl_relation_p temp;
-
-  if ((relation == NULL) || (insert == NULL))
-    return;
-
-  if ((relation->precision != insert->precision) ||
-      (relation->nb_rows   != insert->nb_rows)   ||
-      (column < 0) || (column > relation->nb_columns))
-    OSL_error("columns cannot be inserted");
-
-  // We use a temporary relation just to reuse existing functions. Cleaner.
-  temp = osl_relation_pmalloc(relation->precision, relation->nb_rows,
-                              relation->nb_columns + insert->nb_columns);
-
-  for (i = 0; i < relation->nb_rows; i++) {
-    for (j = 0; j < column; j++)
-      osl_int_assign(relation->precision, temp->m[i], j, relation->m[i], j);
-
-    for (j = column; j < column + insert->nb_columns; j++)
-      osl_int_assign(relation->precision,
-                     temp->m[i], j, insert->m[i], j - column);
-
-    for (j = column + insert->nb_columns;
-         j < insert->nb_columns + relation->nb_columns; j++)
-      osl_int_assign(relation->precision,
-                     temp->m[i], j, relation->m[i], j - insert->nb_columns);
-  }
-
-  osl_relation_free_inside(relation);
-
-  // Replace the inside of relation.
-  relation->nb_columns = temp->nb_columns;
-  relation->m = temp->m;
-
-  // Free the temp "shell".
-  free(temp);
-}
-
-
-/**
- * osl_relation_concat_constraints function:
- * this function builds a new relation from two relations sent as
- * parameters. The new set of constraints is built as the concatenation
- * of the rows of the first elements of the two relation unions r1 and r2.
- * This means, there is no next field in the result.
- * \param[in] r1  The first relation.
- * \param[in] r2  The second relation.
- * \return A pointer to the relation resulting from the concatenation of
- *         the first elements of r1 and r2.
- */
-osl_relation_p osl_relation_concat_constraints(
-    osl_relation_p r1,
-    osl_relation_p r2) {
-  osl_relation_p new;
-
-  if (r1 == NULL)
-    return osl_relation_clone(r2);
-
-  if (r2 == NULL)
-    return osl_relation_clone(r1);
-
-  if (r1->nb_columns != r2->nb_columns)
-    OSL_error("incompatible sizes for concatenation");
-  
-  if (r1->next || r2->next)
-    OSL_warning("relation concatenation is done on the first elements "
-                     "of union only");
-
-  new = osl_relation_pmalloc(r1->precision,
-                             r1->nb_rows + r2->nb_rows, r1->nb_columns);
-  osl_relation_replace_constraints(new, r1, 0);
-  osl_relation_replace_constraints(new, r2, r1->nb_rows);
-
-  return new;
-}
-
-
-/**
- * osl_relation_equal function:
- * this function returns true if the two relations provided as parameters
- * are the same, false otherwise.
- * \param[in] r1  The first relation.
- * \param[in] r2  The second relation.
- * \return 1 if r1 and r2 are the same (content-wise), 0 otherwise.
- */
-int osl_relation_equal(osl_relation_p r1, osl_relation_p r2) {
-  int i, j;
-
-  while ((r1 != NULL) && (r2 != NULL)) {
-    if (r1 == r2)
-      return 1;
-
-    if ((r1->type           != r2->type)           ||
-        (r1->precision      != r2->precision)      ||
-        (r1->nb_rows        != r2->nb_rows)        ||
-        (r1->nb_columns     != r2->nb_columns)     ||
-        (r1->nb_output_dims != r2->nb_output_dims) ||
-        (r1->nb_input_dims  != r2->nb_input_dims)  ||
-        (r1->nb_local_dims  != r2->nb_local_dims)  ||
-        (r1->nb_parameters  != r2->nb_parameters))
-      return 0;
-
-    for (i = 0; i < r1->nb_rows; ++i)
-      for (j = 0; j < r1->nb_columns; ++j)
-        if (osl_int_ne(r1->precision, r1->m[i], j, r2->m[i], j))
-          return 0;
-
-    r1 = r1->next;
-    r2 = r2->next;
-  }
-  
-  if (((r1 == NULL) && (r2 != NULL)) || ((r1 != NULL) && (r2 == NULL)))
-    return 0;
-  
-  return 1;
-}
-
-
-/**
- * osl_relation_check_attribute internal function:
- * This function checks whether an "actual" value is the same as an
- * "expected" value or not. If the expected value is set to
- * OSL_UNDEFINED, this function sets it to the "actual" value
- * and do not report a difference has been detected.
- * It returns 0 if a difference has been detected, 1 otherwise.
- * \param[in,out] expected Pointer to the expected value (the value is
- *                         modified if it was set to OSL_UNDEFINED).
- * \param[in]     actual   Value we want to check.
- * \return 0 if the values are not the same while the expected value was
- *         not OSL_UNDEFINED, 1 otherwise.
- */
-static
-int osl_relation_check_attribute(int * expected, int actual) {
-  if (*expected != OSL_UNDEFINED) { 
-    if ((actual != OSL_UNDEFINED) &&
-        (actual != *expected)) {
-      OSL_warning("unexpected atribute");
-      return 0;
-    }
-  }
-  else {
-    *expected = actual;
-  }
-
-  return 1;
-}
-
-
-/**
- * osl_relation_check_nb_columns internal function:
- * This function checks that the number of columns of a relation
- * corresponds to some expected properties (setting an expected property to
- * OSL_UNDEFINED makes this function unable to detect a problem).
- * It returns 0 if the number of columns seems incorrect or 1 if no problem
- * has been detected.
- * \param[in] relation  The relation we want to check the number of columns.
- * \param[in] expected_nb_output_dims Expected number of output dimensions.
- * \param[in] expected_nb_input_dims  Expected number of input dimensions.
- * \param[in] expected_nb_parameters  Expected number of parameters.
- * \return 0 if the number of columns seems incorrect, 1 otherwise.
- */
-static
-int osl_relation_check_nb_columns(osl_relation_p relation,
-                                  int expected_nb_output_dims,
-                                  int expected_nb_input_dims,
-                                  int expected_nb_parameters) {
-  int expected_nb_local_dims, expected_nb_columns;
-  
-  if ((expected_nb_output_dims != OSL_UNDEFINED) &&
-      (expected_nb_input_dims  != OSL_UNDEFINED) &&
-      (expected_nb_parameters  != OSL_UNDEFINED)) {
-    
-    if (relation->nb_local_dims == OSL_UNDEFINED)
-      expected_nb_local_dims = 0;
-    else
-      expected_nb_local_dims = relation->nb_local_dims;
-
-    expected_nb_columns = expected_nb_output_dims +
-                          expected_nb_input_dims  +
-                          expected_nb_local_dims  +
-                          expected_nb_parameters  +
-                          2;
-    
-    if (expected_nb_columns != relation->nb_columns) {
-      OSL_warning("unexpected number of columns");
-      return 0;
-    }
-  }
-
-  return 1;
-}
-
-
-/**
- * osl_relation_integrity_check function:
- * this function checks that a relation is "well formed" according to some
- * expected properties (setting an expected value to OSL_UNDEFINED means
- * that we do not expect a specific value) and what the relation is supposed
- * to represent. It returns 0 if the check failed or 1 if no problem has been
- * detected.
- * \param[in] relation      The relation we want to check.
- * \param[in] expected_type Semantics about this relation (domain, access...).
- * \param[in] expected_nb_output_dims Expected number of output dimensions.
- * \param[in] expected_nb_input_dims  Expected number of input dimensions.
- * \param[in] expected_nb_parameters  Expected number of parameters.
- * \return 0 if the integrity check fails, 1 otherwise.
- */
-int osl_relation_integrity_check(osl_relation_p relation,
-                                 int expected_type,
-                                 int expected_nb_output_dims,
-                                 int expected_nb_input_dims,
-                                 int expected_nb_parameters) {
-  int i;
-
-  // Check the NULL case.
-  if (relation == NULL) {
-    if ((expected_nb_output_dims != OSL_UNDEFINED) ||
-        (expected_nb_input_dims  != OSL_UNDEFINED) ||
-        (expected_nb_parameters  != OSL_UNDEFINED)) {
-      OSL_debug("NULL relation with some expected attibutes");
-      //return 0;
-    }
-
-    return 1;
-  }
-
-  // Check the type.
-  if (((expected_type != OSL_TYPE_ACCESS) &&
-       (expected_type != relation->type)) ||
-      ((expected_type == OSL_TYPE_ACCESS) &&
-       (!osl_relation_is_access(relation)))) {
-    OSL_warning("wrong type");
-    osl_relation_dump(stderr, relation);
-    return 0;
-  }
-
-  // Check that relations have no undefined atributes.
-  if ((relation->nb_output_dims == OSL_UNDEFINED) ||
-      (relation->nb_input_dims  == OSL_UNDEFINED) ||
-      (relation->nb_local_dims  == OSL_UNDEFINED) ||
-      (relation->nb_parameters  == OSL_UNDEFINED)) {
-    OSL_warning("all attributes should be defined");
-    osl_relation_dump(stderr, relation);
-    return 0;
-  }
-
-  // Check that a context has actually 0 output dimensions.
-  if ((relation->type == OSL_TYPE_CONTEXT) &&
-      (relation->nb_output_dims != 0)) {
-    OSL_warning("context without 0 as number of output dimensions");
-    osl_relation_dump(stderr, relation);
-    return 0;
-  }
-
-  // Check that a domain or a context has actually 0 input dimensions.
-  if (((relation->type == OSL_TYPE_DOMAIN) ||
-       (relation->type == OSL_TYPE_CONTEXT)) &&
-      (relation->nb_input_dims != 0)) {
-    OSL_warning("domain or context without 0 input dimensions");
-    osl_relation_dump(stderr, relation);
-    return 0;
-  }
-
-  // Check properties according to expected values (and if expected values
-  // are undefined, define them with the first relation part properties).
-  if (!osl_relation_check_attribute(&expected_nb_output_dims,
-                                    relation->nb_output_dims) ||
-      !osl_relation_check_attribute(&expected_nb_input_dims,
-                                    relation->nb_input_dims)  ||
-      !osl_relation_check_attribute(&expected_nb_parameters,
-                                    relation->nb_parameters)) {
-    osl_relation_dump(stderr, relation);
-    return 0;
-  }
-
-  while (relation != NULL) {
-
-    // Attributes (except the number of local dimensions) should be the same
-    // in all parts of the union.
-    if ((expected_nb_output_dims != relation->nb_output_dims) ||
-        (expected_nb_input_dims  != relation->nb_input_dims)  ||
-        (expected_nb_parameters  != relation->nb_parameters)) {
-      OSL_warning("inconsistent attributes");
-      osl_relation_dump(stderr, relation);
-      return 0;
-    }
-   
-    // Check whether the number of columns is OK or not.
-    if (!osl_relation_check_nb_columns(relation,
-                                       expected_nb_output_dims,
-                                       expected_nb_input_dims,
-                                       expected_nb_parameters)) {
-      osl_relation_dump(stderr, relation);
-      return 0;
-    }
-
-    // Check the first column. The first column of a relation part should be
-    // made of 0 or 1 only.
-    if ((relation->nb_rows > 0) && (relation->nb_columns > 0)) {
-      for (i = 0; i < relation->nb_rows; i++) {
-        if (!osl_int_zero(relation->precision, relation->m[i], 0) &&
-            !osl_int_one(relation->precision, relation->m[i], 0)) {
-          OSL_warning("first column of a relation is not "
-                           "strictly made of 0 or 1");
-          osl_relation_dump(stderr, relation);
-          return 0;
-        }
-      }
-    }
-
-    // Array accesses must provide the array identifier.
-    if ((osl_relation_is_access(relation)) &&
-        (osl_relation_get_array_id(relation) == OSL_UNDEFINED)) {
-      osl_relation_dump(stderr, relation);
-      return 0;
-    }
-
-    relation = relation->next;
-  }
-
-  return 1;
-}
-
-
-/**
- * osl_relation_union function:
- * this function builds a new relation from two relations provided
- * as parameters. The new relation is built as an union of the
- * two relations: the list of constraint sets are linked together.
- * \param[in] r1 The first relation.
- * \param[in] r2 The second relation.
- * \return A new relation corresponding to the union of r1 and r2.
- */
-osl_relation_p osl_relation_union(osl_relation_p r1,
-                                  osl_relation_p r2) {
-  osl_relation_p copy1, copy2, tmp;
-  
-  if ((r1 == NULL) && (r2 == NULL))
-    return NULL;
-  
-  copy1 = osl_relation_clone(r1);
-  copy2 = osl_relation_clone(r2);
-
-  if ((r1 != NULL) && (r2 == NULL))
-    return copy1;
-    
-  if ((r1 == NULL) && (r2 != NULL))
-    return copy2;
-
-  tmp = copy1;
-  while (tmp->next != NULL)
-    tmp = tmp->next;
-
-  tmp->next = copy2;
-  return copy1;
-}
-
-
-/**
- * osl_relation_set_attributes function:
- * this functions sets the attributes of a relation provided as a
- * parameter. It updates the relation directly.
- * \param[in,out] relation The relation to set the attributes.
- * \param[in]     nb_output_dims Number of output dimensions.
- * \param[in]     nb_input_dims  Number of input dimensions.
- * \param[in]     nb_local_dims  Number of local dimensions.
- * \param[in]     nb_parameters  Number of parameters.
- */
-void osl_relation_set_attributes(osl_relation_p relation,
-                                 int nb_output_dims, int nb_input_dims,
-                                 int nb_local_dims,  int nb_parameters) {
-  if (relation != NULL) {
-    relation->nb_output_dims = nb_output_dims;
-    relation->nb_input_dims  = nb_input_dims;
-    relation->nb_local_dims  = nb_local_dims;
-    relation->nb_parameters  = nb_parameters;
-  }
-}
-
-
-/** 
- * osl_relation_set_type function:
- * this function sets the type of each relation union part in the relation
- * to the one provided as parameter.
- * \param relation The relation to set the type.
- * \param type     The type.
- */
-void osl_relation_set_type(osl_relation_p relation, int type) {
-
-  while (relation != NULL) {
-    relation->type = type;
-    relation = relation->next;
-  }
-}
-
-
-/**
- * osl_relation_get_array_id function:
- * this function returns the array identifier in a relation with access type
- * It returns OSL_UNDEFINED if it is not able to find it (in particular
- * if there are irregularities in the relation).
- * \param[in] relation The relation where to find an array identifier.
- * \return The array identifier in the relation or OSL_UNDEFINED.
- */
-int osl_relation_get_array_id(osl_relation_p relation) {
-  int i;
-  int first = 1;
-  int array_id = OSL_UNDEFINED;
-  int reference_array_id = OSL_UNDEFINED;
-  int nb_array_id;
-  int row_id = 0;
-  int precision;
-
-  if (relation == NULL)
-    return OSL_UNDEFINED;
-  
-  if (!osl_relation_is_access(relation)) {
-    OSL_warning("asked for an array id of non-array relation");
-    return OSL_UNDEFINED;
-  }
-  
-  while (relation != NULL) {
-    precision = relation->precision;
-
-    // There should be room to store the array identifier.
-    if ((relation->nb_rows < 1) ||
-        (relation->nb_columns < 3)) {
-      OSL_warning("no array identifier in an access function");
-      return OSL_UNDEFINED;
-    }
-
-    // Array identifiers are m[i][#columns -1] / m[i][1], with i the only row
-    // where m[i][1] is not 0.
-    // - check there is exactly one row such that m[i][1] is not 0,
-    // - check the whole ith row if full of 0 except m[i][1] and the id,
-    // - check that (m[i][#columns -1] % m[i][1]) == 0,
-    // - check that (-m[i][#columns -1] / m[i][1]) > 0.
-    nb_array_id = 0;
-    for (i = 0; i < relation->nb_rows; i++) {
-      if (!osl_int_zero(precision, relation->m[i], 1)) {
-        nb_array_id ++;
-        row_id = i;
-      }
-    }
-    if (nb_array_id == 0) {
-      OSL_warning("no array identifier in an access function");
-      return OSL_UNDEFINED;
-    }
-    if (nb_array_id > 1) {
-      OSL_warning("several array identifiers in one access function");
-      return OSL_UNDEFINED;
-    }
-    for (i = 0; i < relation->nb_columns - 1; i++) {
-      if ((i != 1) && !osl_int_zero(precision, relation->m[row_id], i)) {
-        OSL_warning("non integer array identifier");
-        return OSL_UNDEFINED;
-      }
-    }
-    if (!osl_int_divisible(precision,
-                           relation->m[row_id], relation->nb_columns - 1,
-                           relation->m[row_id], 1)) {
-      OSL_warning("rational array identifier");
-      return OSL_UNDEFINED;
-    }
-    array_id = -osl_int_get_si(precision,
-                               relation->m[row_id],
-                               relation->nb_columns - 1);
-    array_id /= osl_int_get_si(precision, relation->m[row_id], 1);
-    if (array_id <= 0) {
-      OSL_warning("negative or 0 identifier in access function");
-      return OSL_UNDEFINED;
-    }
-
-    // Unions of accesses are allowed, but they should refer at the same array.
-    if (first) {
-      reference_array_id = array_id;
-      first = 0;
-    }
-    else {
-      if (reference_array_id != array_id) {
-        OSL_warning("inconsistency of array identifiers in an "
-                    "union of access relations");
-        return OSL_UNDEFINED;
-      }
-    }
-    
-    relation = relation->next;
-  }
-
-  return array_id;
-}
-
-
-/**
- * osl_relation_is_access function:
- * this function returns 1 if the relation corresponds to an access relation,
- * whatever its precise type (read, write etc.), 0 otherwise.
- * \param relation The relation to check wheter it is an access relation or not.
- * \return 1 if the relation is an access relation, 0 otherwise.
- */
-int osl_relation_is_access(osl_relation_p relation) {
-
-  if (relation == NULL)
-    return 0;
-  
-  if ((relation->type == OSL_TYPE_ACCESS)    ||
-      (relation->type == OSL_TYPE_READ)      ||
-      (relation->type == OSL_TYPE_WRITE)     ||
-      (relation->type == OSL_TYPE_MAY_WRITE))
-    return 1;
-
-  return 0;
-}
-
-
-/**
- * osl_relation_get_attributes function:
- * this function returns, through its parameters, the maximum values of the
- * relation attributes (nb_iterators, nb_parameters etc), depending on its
- * type. HOWEVER, it updates the parameter value iff the attribute is greater
- * than the input parameter value. Hence it may be used to get the
- * attributes as well as to find the maximum attributes for several relations.
- * The array identifier 0 is used when there is no array identifier (AND this
- * is OK), OSL_UNDEFINED is used to report it is impossible to provide the
- * property while it should. This function is not intended for checking, the
- * input relation should be correct.
- * \param[in]     relation      The relation to extract attribute values.
- * \param[in,out] nb_parameters Number of parameter attribute.
- * \param[in,out] nb_iterators  Number of iterators attribute.
- * \param[in,out] nb_scattdims  Number of scattering dimensions attribute.
- * \param[in,out] nb_localdims  Number of local dimensions attribute.
- * \param[in,out] array_id      Maximum array identifier attribute.
- */
-void osl_relation_get_attributes(osl_relation_p relation,
-                                 int * nb_parameters,
-                                 int * nb_iterators,
-                                 int * nb_scattdims,
-                                 int * nb_localdims,
-                                 int * array_id) {
-  int type;
-  int local_nb_parameters = OSL_UNDEFINED;
-  int local_nb_iterators  = OSL_UNDEFINED;
-  int local_nb_scattdims  = OSL_UNDEFINED;
-  int local_nb_localdims  = OSL_UNDEFINED;
-  int local_array_id      = OSL_UNDEFINED;
-
-  while (relation != NULL) {
-    if (osl_relation_is_access(relation))
-      type = OSL_TYPE_ACCESS;
-    else
-      type = relation->type;
-
-    // There is some redundancy but I believe the code is cleaner this way.
-    switch (type) {
-      case OSL_TYPE_CONTEXT:
-        local_nb_parameters = relation->nb_parameters;
-        local_nb_iterators  = 0;
-        local_nb_scattdims  = 0;
-        local_nb_localdims  = relation->nb_local_dims;
-        local_array_id      = 0;
-        break;
-
-      case OSL_TYPE_DOMAIN:
-        local_nb_parameters = relation->nb_parameters;
-        local_nb_iterators  = relation->nb_output_dims;
-        local_nb_scattdims  = 0;
-        local_nb_localdims  = relation->nb_local_dims;
-        local_array_id      = 0;
-        break;
-
-      case OSL_TYPE_SCATTERING:
-        local_nb_parameters = relation->nb_parameters;
-        local_nb_iterators  = relation->nb_input_dims;
-        local_nb_scattdims  = relation->nb_output_dims;
-        local_nb_localdims  = relation->nb_local_dims;
-        local_array_id      = 0;
-        break;
-
-      case OSL_TYPE_ACCESS:
-        local_nb_parameters = relation->nb_parameters;
-        local_nb_iterators  = relation->nb_input_dims;
-        local_nb_scattdims  = 0;
-        local_nb_localdims  = relation->nb_local_dims;
-        local_array_id      = osl_relation_get_array_id(relation);
-        break;
-    }
-
-    // Update.
-    *nb_parameters = OSL_max(*nb_parameters, local_nb_parameters);
-    *nb_iterators  = OSL_max(*nb_iterators,  local_nb_iterators);
-    *nb_scattdims  = OSL_max(*nb_scattdims,  local_nb_scattdims);
-    *nb_localdims  = OSL_max(*nb_localdims,  local_nb_localdims);
-    *array_id      = OSL_max(*array_id,      local_array_id);
-    relation = relation->next;
-  }
-}
-
-
-/**
- * osl_relation_extend_output function:
- * this function extends the number of output dimensions of a given relation. It
- * returns a copy of the input relation with a number of output dimensions
- * extended to "dim" for all its union components. The new output dimensions
- * are simply set equal to 0. The extended number of dimensions must be higher
- * than or equal to the original one (an error will be raised otherwise).
- * \param[in] relation The input relation to extend.
- * \param[in] dim      The number of output dimension to reach.
- * \return A new relation: "relation" extended to "dim" output dims.
- */
-osl_relation_p osl_relation_extend_output(osl_relation_p relation, int dim) {
-  int i, j;
-  int first = 1;
-  int offset;
-  osl_relation_p extended = NULL, node, previous = NULL;
-
-  while (relation != NULL) {
-    if (relation->nb_output_dims > dim)
-      OSL_error("Number of output dims is greater than required extension");
-    offset = dim - relation->nb_output_dims;
-    
-    node = osl_relation_pmalloc(relation->precision,
-                                relation->nb_rows + offset,
-                                relation->nb_columns + offset);
-    
-    node->type           = relation->type;
-    node->nb_output_dims = OSL_max(relation->nb_output_dims, dim);
-    node->nb_input_dims  = relation->nb_input_dims;
-    node->nb_local_dims  = relation->nb_local_dims;
-    node->nb_parameters  = relation->nb_parameters;
-
-    // Copy of the original relation with some 0 columns for the new dimensions
-    // Note that we use the fact that the matrix is initialized with zeros.
-    for (i = 0; i < relation->nb_rows; i++) {
-      for (j = 0; j <= relation->nb_output_dims; j++)
-        osl_int_assign(relation->precision, node->m[i], j, relation->m[i], j);
-
-      for (j = relation->nb_output_dims + offset + 1;
-           j < relation->nb_columns + offset; j++)
-        osl_int_assign(relation->precision,
-                       node->m[i], j, relation->m[i], j - offset);
-    }
-
-    // New rows dedicated to the new dimensions
-    for (i = relation->nb_rows; i < relation->nb_rows + offset; i++) {
-      for (j = 0; j < relation->nb_columns + offset; j++) {
-        if ((i - relation->nb_rows) == (j - relation->nb_output_dims - 1))
-          osl_int_set_si(relation->precision, node->m[i], j, -1);
-      }
-    }
-
-    if (first) {
-      first = 0;
-      extended = node;
-      previous = node;
-    }
-    else {
-      previous->next = node;
-      previous = previous->next;
-    }
-
-    relation = relation->next;
-  }
-  
-  return extended;
-}
-
diff --git a/cloog-0.17.0/osl/source/relation_list.c b/cloog-0.17.0/osl/source/relation_list.c
deleted file mode 100644
index 1fef89f..0000000
--- a/cloog-0.17.0/osl/source/relation_list.c
+++ /dev/null
@@ -1,628 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                        relation_list.c                          **
-     **-----------------------------------------------------------------**
-     **                   First version: 08/10/2010                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#include <osl/macros.h>
-#include <osl/util.h>
-#include <osl/relation.h>
-#include <osl/relation_list.h>
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-
-
-/**
- * osl_relation_list_idump function:
- * Displays a osl_relation_list_t structure (a list of relations) into a
- * file (file, possibly stdout). See osl_relation_print_structure for
- * more details.
- * \param file   File where informations are printed.
- * \param l	 The list of relations whose information has to be printed.
- * \param level  Number of spaces before printing, for each line.
- */
-void osl_relation_list_idump(FILE * file, osl_relation_list_p l, int level) {
-  int j, first = 1;
-
-  // Go to the right level.
-  for (j = 0; j < level; j++)
-    fprintf(file,"|\t");
-
-  if (l != NULL)
-    fprintf(file, "+-- osl_relation_list_t\n");
-  else
-    fprintf(file, "+-- NULL relation list\n");
-
-  while (l != NULL) {
-    if (!first) {
-      // Go to the right level.
-      for (j = 0; j < level; j++)
-        fprintf(file, "|\t");
-      fprintf(file, "|   osl_relation_list_t\n");
-    }
-    else
-      first = 0;
-
-    // A blank line.
-    for (j = 0; j <= level+1; j++)
-      fprintf(file, "|\t");
-    fprintf(file, "\n");
-
-    // Print a relation.
-    osl_relation_idump(file, l->elt, level+1);
-
-    l = l->next;
-
-    // Next line.
-    if (l != NULL) {
-      for (j = 0; j <= level; j++)
-        fprintf(file, "|\t");
-      fprintf(file, "V\n");
-    }
-  }
-
-  // The last line.
-  for (j = 0; j <= level; j++)
-    fprintf(file, "|\t");
-  fprintf(file, "\n");
-}
-
-
-/**
- * osl_relation_dump function:
- * This function prints the content of a osl_relation_list_t into
- * a file (file, possibly stdout).
- * \param file File where informations are printed.
- * \param list The relation whose information has to be printed.
- */
-void osl_relation_list_dump(FILE * file, osl_relation_list_p list) {
-  osl_relation_list_idump(file, list, 0);
-}
-
-
-/**
- * osl_relation_list_pprint_elts function:
- * This function pretty-prints the elements of a osl_relation_list_t structure
- * into a file (file, possibly stdout) in the OpenScop format. I.e., it prints
- * only the elements and not the number of elements. It prints an element of the
- * list only if it is not NULL.
- * \param file  File where informations are printed.
- * \param list  The relation list whose information has to be printed.
- * \param[in] names Array of constraint columns names. 
- */
-void osl_relation_list_pprint_elts(FILE * file, osl_relation_list_p list,
-                                   osl_names_p names) {
-  int i;
-  osl_relation_list_p head = list;
-
-  // Count the number of elements in the list with non-NULL content.
-  i = osl_relation_list_count(list);
-  
-  // Print each element of the relation list.
-  if (i > 0) {
-    i = 0;
-    while (head) {
-      if (head->elt != NULL) {
-        osl_relation_pprint(file, head->elt, names);
-        if (head->next != NULL)
-          fprintf(file, "\n");
-        i++;
-      }
-      head = head->next;
-    }
-  }
-  else {
-    fprintf(file, "# NULL relation list\n");
-  }
-}
-
-
-/**
- * osl_relation_list_pprint function:
- * This function pretty-prints the content of a osl_relation_list_t structure
- * into a file (file, possibly stdout) in the OpenScop format. It prints
- * an element of the list only if it is not NULL.
- * \param[in] file  File where informations are printed.
- * \param[in] list  The relation list whose information has to be printed.
- * \param[in] names Array of constraint columns names. 
- */
-void osl_relation_list_pprint(FILE * file, osl_relation_list_p list,
-                              osl_names_p names) {
-  int i;
-
-  // Count the number of elements in the list with non-NULL content.
-  i = osl_relation_list_count(list);
-  
-  // Print it.
-  if (i > 1)
-    fprintf(file,"# List of %d elements\n%d\n", i, i);
-  else
-    fprintf(file,"# List of %d element \n%d\n", i, i);
-
-  // Print each element of the relation list.
-  osl_relation_list_pprint_elts(file, list, names);
-}
-
-
-/**
- * osl_relation_list_print function:
- * This function prints the content of a osl_relation_list_t structure
- * into a file (file, possibly stdout) in the OpenScop format. It prints
- * an element of the list only if it is not NULL.
- * \param file  File where informations are printed.
- * \param list  The relation list whose information has to be printed.
- */
-void osl_relation_list_print(FILE * file, osl_relation_list_p list) {
-
-  osl_relation_list_pprint(file, list, NULL);
-}
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-
-
-/**
- * osl_relation_list_pread function ("precision read"):
- * this function reads a list of relations into a file (foo,
- * posibly stdin) and returns a pointer this relation list.
- * \param[in] file      The input stream.
- * \param[in] precision The precision of the relation elements.
- * \return A pointer to the relation list structure that has been read.
- */
-osl_relation_list_p osl_relation_list_pread(FILE * file, int precision) {
-  int i;
-  osl_relation_list_p list;
-  osl_relation_list_p res;
-  int nb_mat;
-
-  // Read the number of relations to read.
-  nb_mat = osl_util_read_int(file, NULL); 
-
-  if (nb_mat < 0)
-    OSL_error("negative number of relations");
-
-  // Allocate the header of the list and start reading each element.
-  res = list = osl_relation_list_malloc();
-  for (i = 0; i < nb_mat; ++i) {
-    list->elt = osl_relation_pread(file, precision);
-    if (i < nb_mat - 1)
-      list->next = osl_relation_list_malloc();
-    list = list->next;
-  }
-
-  return res;
-}
-
-
-/**
- * osl_relation_list_read function:
- * this function is equivalent to osl_relation_list_pread() except that
- * the precision corresponds to the precision environment variable or
- * to the highest available precision if it is not defined.
- * \see{osl_relation_list_pread}
- */
-osl_relation_list_p osl_relation_list_read(FILE * foo) {
-  int precision = osl_util_get_precision();
-  return osl_relation_list_pread(foo, precision);
-}
-
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-
-
-/**
- * osl_relation_list_malloc function:
- * This function allocates the memory space for a osl_relation_list_t
- * structure and sets its fields with default values. Then it returns
- * a pointer to the allocated space.
- * \return A pointer to an empty relation list with fields set to default
- *         values.
- */
-osl_relation_list_p osl_relation_list_malloc() {
-  osl_relation_list_p res;
-  
-  OSL_malloc(res, osl_relation_list_p, sizeof(osl_relation_list_t));
-  res->elt  = NULL;
-  res->next = NULL;
-
-  return res;
-}
-
-
-
-/**
- * osl_relation_list_free function:
- * This function frees the allocated memory for a osl_relation_list_t
- * structure, and all the relations stored in the list.
- * \param list The pointer to the relation list we want to free.
- */
-void osl_relation_list_free(osl_relation_list_p list) {
-  osl_relation_list_p tmp;
-
-  if (list == NULL)
-    return;
-
-  while (list != NULL) {
-    if (list->elt != NULL)
-      osl_relation_free(list->elt);
-    tmp = list->next;
-    free(list);
-    list = tmp;
-  }
-}
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-
-
-/**
- * osl_relation_list_node function:
- * This function builds an osl_relation_list_t node and sets its
- * relation element as a copy of the one provided as parameter.
- * If the relation provided as an argument is NULL, NULL is returned.
- * \param r The pointer to the relation to copy/paste in a list node.
- * \return A pointer to a relation list node containing a copy of "relation".
- */
-osl_relation_list_p osl_relation_list_node(osl_relation_p r) {
-  osl_relation_list_p new = NULL;
-  
-  if (r != NULL) {
-    new = osl_relation_list_malloc();
-    new->elt = osl_relation_clone(r);
-  }
-  return new;
-}
-
-
-/**
- * osl_relation_list_clone function:
- * This functions builds and returns a quasi-"hard copy" (not a pointer copy)
- * of a osl_relation_list_t data structure provided as parameter.
- * \param list  The pointer to the relation list we want to copy.
- * \return A pointer to the full copy of the relation list in parameter.
- */
-osl_relation_list_p osl_relation_list_clone(osl_relation_list_p list) {
-  
-  osl_relation_list_p clone = NULL, node, previous = NULL; 
-  int first = 1;
-
-  while (list != NULL) {
-    node      = osl_relation_list_malloc();
-    node->elt = osl_relation_clone(list->elt);
-
-    if (first) {
-      first = 0;
-      clone = node;
-      previous = node;
-    }
-    else {
-      previous->next = node;
-      previous = previous->next;
-    }
-
-    list = list->next;
-  }
-
-  return clone;
-}
-
-
-/**
- * osl_relation_list_concat function:
- * this function builds a new relation list as the concatenation of the
- * two lists sent as parameters.
- * \param l1  The first relation list.
- * \param l2  The second relation list.
- * \return A pointer to the relation list resulting from the concatenation of
- *         l1 and l2.
- */
-osl_relation_list_p osl_relation_list_concat(osl_relation_list_p l1,
-                                             osl_relation_list_p l2) {
-  osl_relation_list_p new, end;
-
-  if (l1 == NULL)
-    return osl_relation_list_clone(l2);
-
-  if (l2 == NULL)
-    return osl_relation_list_clone(l1);
-
-  new = osl_relation_list_clone(l1);
-  end = new;
-  while (end->next != NULL)
-    end = end->next;
-  end->next = osl_relation_list_clone(l2);
-
-  return new;
-}
-
-
-/**
- * osl_relation_list_concat_inplace function:
- * this function concatenates a relation list to another. No new list is
- * created: this functions links the two input lists. If the first relation
- * list is NULL, it is set to the second relation list.
- * two lists sent as parameters.
- * \param[in,out] l1  Pointer to the first relation list.
- * \param[in]     l2  The second relation list.
- */
-void osl_relation_list_concat_inplace(osl_relation_list_p *l1,
-                                      osl_relation_list_p l2) {
-  osl_relation_list_p temp;
-
-  if (*l1 == NULL) {
-    *l1 = l2;
-    return;
-  }
-  
-  temp = *l1;
-  while (temp->next != NULL)
-    temp = temp->next;
-  temp->next = l2;
-}
-
-
-/**
- * osl_relation_list_equal function:
- * This function returns true if the two relation lists are the same, false
- * otherwise..
- * \param l1 The first relation list.
- * \param l2 The second relation list.
- * \return 1 if l1 and l2 are the same (content-wise), 0 otherwise.
- */
-int osl_relation_list_equal(osl_relation_list_p l1, osl_relation_list_p l2) {
-  while ((l1 != NULL) && (l2 != NULL)) {
-    if (l1 == l2)
-      return 1;
-    
-    if (!osl_relation_equal(l1->elt, l2->elt))
-      return 0;
-
-    l1 = l1->next;
-    l2 = l2->next;
-  }
-
-  if (((l1 == NULL) && (l2 != NULL)) || ((l1 != NULL) && (l2 == NULL)))
-    return 0;
-  
-  return 1;
-}
-
-
-/**
- * osl_relation_integrity_check function:
- * This function checks that a list of relation is "well formed" according to
- * some expected properties (setting an expected value to OSL_UNDEFINED
- * means that we do not expect a specific value) and what the relations are
- * supposed to represent (all relations of a list are supposed to have the
- * same semantics). It returns 0 if the check failed or 1 if no problem has
- * been detected.
- * \param list      The relation list we want to check.
- * \param type      Semantics about this relation (domain, access...).
- * \param expected_nb_output_dims Expected number of output dimensions.
- * \param expected_nb_input_dims  Expected number of input dimensions.
- * \param expected_nb_parameters  Expected number of parameters.
- * \return 0 if the integrity check fails, 1 otherwise.
- */
-int osl_relation_list_integrity_check(osl_relation_list_p list,
-                                      int type,
-                                      int expected_nb_output_dims,
-                                      int expected_nb_input_dims,
-                                      int expected_nb_parameters) {
-  while (list != NULL) {
-    // Check the access function.
-    if (!osl_relation_integrity_check(list->elt,
-                                      type,
-                                      expected_nb_output_dims,
-                                      expected_nb_input_dims,
-                                      expected_nb_parameters)) {
-      return 0;
-    }
-
-    list = list->next;
-  }
-
-  return 1;
-}
-
-
-/** 
- * osl_relation_list_set_type function:
- * this function sets the type of each relation in the relation list to the
- * one provided as parameter.
- * \param list The list of relations to set the type.
- * \param type The type.
- */
-void osl_relation_list_set_type(osl_relation_list_p list, int type) {
-
-  while (list != NULL) {
-    if (list->elt != NULL) {
-      list->elt->type = type;
-    }
-    list = list->next;
-  }
-}
-
-
-/** 
- * osl_relation_list_filter function:
- * this function returns a copy of the input relation list, restricted to
- * the relations of a given type. The special type OSL_TYPE_ACCESS
- * filters any kind of access (read, write, rdwr etc.).
- * \param list The relation list to copy/filter.
- * \param type The filtering type.
- * \return A copy of the input list with only relation of the given type.
- */
-osl_relation_list_p osl_relation_list_filter(osl_relation_list_p list,
-                                             int type) {
-
-  osl_relation_list_p copy = osl_relation_list_clone(list);
-  osl_relation_list_p filtered = NULL;
-  osl_relation_list_p previous = NULL;
-  osl_relation_list_p trash;
-  int first = 1;
-
-  while (copy != NULL) {
-    if ((copy->elt != NULL) &&
-        (((type == OSL_TYPE_ACCESS) &&
-          (osl_relation_is_access(copy->elt))) ||
-         ((type != OSL_TYPE_ACCESS) &&
-          (type == copy->elt->type)))) {
-      if (first) {
-        filtered = copy;
-        first = 0;
-      }
-      
-      previous = copy;
-      copy = copy->next;
-    }
-    else {
-      trash = copy;
-      if (!first)
-        previous->next = copy->next;
-      copy = copy->next;
-      trash->next = NULL;
-      osl_relation_list_free(trash);
-    }
-  }
-
-  return filtered;
-}
-
-
-/**
- * osl_relation_list_count function:
- * this function returns the number of elements with non-NULL content
- * in a relation list.
- * \param list The relation list to count the number of elements.
- * \return The number of nodes with non-NULL content in the relation list.
- */
-int osl_relation_list_count(osl_relation_list_p list) {
-  int i = 0;
-  
-  while (list != NULL) {
-    if (list->elt != NULL)
-      i++;
-    list = list->next;
-  }
-
-  return i;
-}
-  
-
-/**
- * osl_relation_list_get_attributes function:
- * this function returns, through its parameters, the maximum values of the
- * relation attributes (nb_iterators, nb_parameters etc) in the relation list,
- * depending on its type. HOWEVER, it updates the parameter value iff the
- * attribute is greater than the input parameter value. Hence it may be used
- * to get the attributes as well as to find the maximum attributes for several
- * relation lists. The array identifier 0 is used when there is no array
- * identifier (AND this is OK), OSL_UNDEFINED is used to report it is
- * impossible to provide the property while it should. This function is not
- * intended for checking, the input relation list should be correct.
- * \param[in]     list          The relation list to extract attribute values.
- * \param[in,out] nb_parameters Number of parameter attribute.
- * \param[in,out] nb_iterators  Number of iterators attribute.
- * \param[in,out] nb_scattdims  Number of scattering dimensions attribute.
- * \param[in,out] nb_localdims  Number of local dimensions attribute.
- * \param[in,out] array_id      Maximum array identifier attribute.
- */
-void osl_relation_list_get_attributes(osl_relation_list_p list,
-                                      int * nb_parameters,
-                                      int * nb_iterators,
-                                      int * nb_scattdims,
-                                      int * nb_localdims,
-                                      int * array_id) {
-  int local_nb_parameters = OSL_UNDEFINED;
-  int local_nb_iterators  = OSL_UNDEFINED;
-  int local_nb_scattdims  = OSL_UNDEFINED;
-  int local_nb_localdims  = OSL_UNDEFINED;
-  int local_array_id      = OSL_UNDEFINED;
-
-  while (list != NULL) {
-    osl_relation_get_attributes(list->elt,
-                                &local_nb_parameters,
-                                &local_nb_iterators,
-                                &local_nb_scattdims,
-                                &local_nb_localdims,
-                                &local_array_id);
-    // Update.
-    *nb_parameters = OSL_max(*nb_parameters, local_nb_parameters);
-    *nb_iterators  = OSL_max(*nb_iterators,  local_nb_iterators);
-    *nb_scattdims  = OSL_max(*nb_scattdims,  local_nb_scattdims);
-    *nb_localdims  = OSL_max(*nb_localdims,  local_nb_localdims);
-    *array_id      = OSL_max(*array_id,      local_array_id);
-    list = list->next;
-  }
-}
-
diff --git a/cloog-0.17.0/osl/source/scop.c b/cloog-0.17.0/osl/source/scop.c
deleted file mode 100644
index ae386c2..0000000
--- a/cloog-0.17.0/osl/source/scop.c
+++ /dev/null
@@ -1,757 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                            scop.c                               **
-     **-----------------------------------------------------------------**
-     **                   First version: 30/04/2008                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-# include <stdlib.h>
-# include <stdio.h>
-# include <ctype.h>
-# include <string.h>
-
-#include <osl/macros.h>
-#include <osl/util.h>
-#include <osl/extensions/textual.h>
-#include <osl/strings.h>
-#include <osl/relation.h>
-#include <osl/interface.h>
-#include <osl/generic.h>
-#include <osl/statement.h>
-#include <osl/scop.h>
-
-
-/*+***************************************************************************
- *                         Structure display functions                       *
- *****************************************************************************/
-
-
-/**
- * osl_scop_idump function:
- * this function displays an osl_scop_t structure (*scop) into a
- * file (file, possibly stdout) in a way that trends to be understandable. It
- * includes an indentation level (level) in order to work with others
- * idump functions.
- * \param file  The file where the information has to be printed.
- * \param scop  The scop structure whose information has to be printed.
- * \param level Number of spaces before printing, for each line.
- */
-void osl_scop_idump(FILE * file, osl_scop_p scop, int level) {
-  int j, first = 1;
-
-  // Go to the right level.
-  for (j = 0; j < level; j++)
-    fprintf(file, "|\t");
-
-  if (scop != NULL)
-    fprintf(file, "+-- osl_scop_t\n");
-  else
-    fprintf(file, "+-- NULL scop\n");
-
-  while (scop != NULL) {
-    if (!first) {
-      // Go to the right level.
-      for (j = 0; j < level; j++)
-        fprintf(file, "|\t");
-      fprintf(file, "|   osl_scop_t\n");
-    }
-    else
-      first = 0;
-
-    // A blank line.
-    for (j = 0; j <= level+1; j++)
-      fprintf(file, "|\t");
-    fprintf(file, "\n");
-
-    // Print the version.
-    for (j = 0; j < level; j++)
-      fprintf(file, "|\t");
-    fprintf(file, "|\tVersion: %d\n", scop->version);
-
-    // A blank line.
-    for (j = 0; j <= level+1; j++)
-      fprintf(file, "|\t");
-    fprintf(file, "\n");
-
-    // Print the language.
-    for (j = 0; j < level; j++)
-      fprintf(file, "|\t");
-    fprintf(file, "|\tLanguage: %s\n", scop->language);
-
-    // A blank line.
-    for (j = 0; j <= level+1; j++)
-      fprintf(file, "|\t");
-    fprintf(file, "\n");
-
-    // Print the context of the scop.
-    osl_relation_idump(file, scop->context, level+1);
-
-    // Print the parameters.
-    osl_generic_idump(file, scop->parameters, level+1);
-
-    // Print the statements.
-    osl_statement_idump(file, scop->statement, level+1);
-
-    // Print the registered extension interfaces.
-    osl_interface_idump(file, scop->registry, level+1);
-
-    // Print the extensions.
-    osl_generic_idump(file, scop->extension, level+1);
-
-    scop = scop->next;
-
-    // Next line.
-    if (scop != NULL) {
-      for (j = 0; j <= level; j++)
-        fprintf(file, "|\t");
-      fprintf(file, "V\n");
-    }
-  }
-
-  // The last line.
-  for (j = 0; j <= level; j++)
-    fprintf(file, "|\t");
-  fprintf(file, "\n");
-}
-
-
-/**
- * osl_scop_dump function:
- * this function prints the content of an osl_scop_t structure (*scop)
- * into a file (file, possibly stdout).
- * \param file The file where the information has to be printed.
- * \param scop The scop structure whose information has to be printed.
- */
-void osl_scop_dump(FILE * file, osl_scop_p scop) {
-  osl_scop_idump(file, scop, 0);
-}
-
-
-/**
- * osl_scop_names function:
- * this function generates as set of names for all the dimensions
- * involved in a given scop.
- * \param[in] scop The scop (list) we have to generate names for.
- * \return A set of generated names for the input scop dimensions.
- */
-static
-osl_names_p osl_scop_names(osl_scop_p scop) {
-  int nb_parameters = OSL_UNDEFINED;
-  int nb_iterators  = OSL_UNDEFINED;
-  int nb_scattdims  = OSL_UNDEFINED;
-  int nb_localdims  = OSL_UNDEFINED;
-  int array_id      = OSL_UNDEFINED;
-
-  osl_scop_get_attributes(scop, &nb_parameters, &nb_iterators,
-                          &nb_scattdims,  &nb_localdims, &array_id);
-  
-  return osl_names_generate("P", nb_parameters,
-                            "i", nb_iterators,
-                            "c", nb_scattdims,
-                            "l", nb_localdims,
-                            "A", array_id);
-}
-
-
-/**
- * osl_scop_print function:
- * this function prints the content of an osl_scop_t structure (*scop)
- * into a file (file, possibly stdout) in the OpenScop textual format.
- * \param file The file where the information has to be printed.
- * \param scop The scop structure whose information has to be printed.
- */
-void osl_scop_print(FILE * file, osl_scop_p scop) {
-  int parameters_backedup = 0;
-  osl_strings_p parameters_backup = NULL;
-  osl_names_p names;
-
-  if (scop == NULL) {
-    fprintf(file, "# NULL scop\n");
-    return;
-  }
-  else {
-    fprintf(file, "# [File generated by the OpenScop Library %s]\n",
-            OSL_RELEASE);
-  }
-
-  if (osl_scop_integrity_check(scop) == 0)
-    OSL_warning("OpenScop integrity check failed. "
-                     "Something may go wrong.");
-  
-  // Generate the names for the various dimensions.
-  names = osl_scop_names(scop);
-
-  while (scop != NULL) {
-    // If possible, replace parameter names with scop iterator names.
-    if (osl_generic_has_URI(scop->parameters, OSL_URI_STRINGS)) {
-      parameters_backedup = 1;
-      parameters_backup = names->parameters;
-      names->parameters = scop->parameters->data;
-    }
-    
-    fprintf(file, "\n"OSL_TAG_START_SCOP"\n\n");
-    fprintf(file, "# =============================================== "
-                  "Global\n");
-    fprintf(file, "# Language\n");
-    fprintf(file, "%s\n\n", scop->language);
-
-    fprintf(file, "# Context\n");
-    osl_relation_pprint(file, scop->context, names);
-    fprintf(file, "\n");
-
-    osl_util_print_provided(file,
-        osl_generic_has_URI(scop->parameters, OSL_URI_STRINGS),
-        "Parameters are");
-    osl_generic_print(file, scop->parameters);
-
-    fprintf(file, "\n# Number of statements\n");
-    fprintf(file, "%d\n\n",osl_statement_number(scop->statement));
-
-    osl_statement_pprint(file, scop->statement, names);
-
-    if (scop->extension) {
-      fprintf(file, "# =============================================== "
-                    "Extensions\n");
-      osl_generic_print(file, scop->extension);
-    }
-    fprintf(file, "\n"OSL_TAG_END_SCOP"\n\n");
-    
-    // If necessary, switch back parameter names.
-    if (parameters_backedup) {
-      parameters_backedup = 0;
-      names->parameters = parameters_backup;
-    }
-
-    scop = scop->next;
-  }
-
-  osl_names_free(names);
-}
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-
-
-/**
- * osl_scop_pread function ("precision read"):
- * this function reads a list of scop structures from a file (possibly stdin)
- * complying to the OpenScop textual format and returns a pointer to this
- * scop list. If some relation properties (number of input/output/local
- * dimensions and number of parameters) are undefined, it will define them
- * according to the available information. 
- * \param[in] file      The file where the scop has to be read.
- * \param[in] registry  The list of known interfaces (others are ignored).
- * \param[in] precision The precision of the relation elements.
- * \return A pointer to the scop structure that has been read.
- */
-osl_scop_p osl_scop_pread(FILE * file, osl_interface_p registry,
-                          int precision) {
-  osl_scop_p list = NULL, current = NULL, scop;
-  osl_statement_p stmt = NULL;
-  osl_statement_p prev = NULL;
-  osl_strings_p language;
-  int nb_statements;
-  char * tmp;
-  int first = 1;
-  int i;
-
-  if (file == NULL)
-    return NULL;
-
-  while(1) {
-    //
-    // I. START TAG
-    //
-    tmp = osl_util_read_uptotag(file, OSL_TAG_START_SCOP);
-    if (tmp == NULL) {
-      OSL_debug("no more scop in the file");
-      break;
-    }
-    else {
-      free(tmp);
-    }
-
-    scop = osl_scop_malloc();
-    scop->registry = osl_interface_clone(registry);
-
-    //
-    // II. CONTEXT PART
-    //
-
-    // Read the language.
-    language = osl_strings_read(file);
-    if (osl_strings_size(language) == 0)
-      OSL_error("no language (backend) specified");
-
-    if (osl_strings_size(language) > 1)
-      OSL_warning("uninterpreted information (after language)");
-
-    if (language != NULL) {
-      scop->language = strdup(language->string[0]);
-      osl_strings_free(language);
-    }
-
-    // Read the context domain.
-    scop->context = osl_relation_pread(file, precision);
-
-    // Read the parameters.
-    if (osl_util_read_int(file, NULL) > 0)
-      scop->parameters = osl_generic_read_one(file, scop->registry);
-
-    //
-    // III. STATEMENT PART
-    //
-
-    // Read the number of statements.
-    nb_statements = osl_util_read_int(file, NULL);
-
-    for (i = 0; i < nb_statements; i++) {
-      // Read each statement.
-      stmt = osl_statement_pread(file, scop->registry, precision);
-      if (scop->statement == NULL)
-        scop->statement = stmt;
-      else
-        prev->next = stmt;
-      prev = stmt;
-    }
-
-    //
-    // IV. EXTENSION PART (TO THE END TAG)
-    //
-
-    // Read up the end tag (if any), and store extensions.
-    scop->extension = osl_generic_read(file, scop->registry);
-
-    // Add the new scop to the list.
-    if (first) {
-      list = scop;
-      first = 0;
-    }
-    else {
-      current->next = scop;
-    }
-    current = scop;    
-  }
-  
-  if (!osl_scop_integrity_check(list))
-    OSL_warning("scop integrity check failed");
-
-  return list;
-}
-
-
-/**
- * osl_scop_read function:
- * this function is equivalent to osl_scop_pread() except that
- * (1) the precision corresponds to the precision environment variable or
- *     to the highest available precision if it is not defined, and
- * (2) the list of known interface is set to the default one.
- * \see{osl_scop_pread}
- */
-osl_scop_p osl_scop_read(FILE * foo) {
-  int precision = osl_util_get_precision();
-  osl_interface_p registry = osl_interface_get_default_registry();
-  osl_scop_p scop = osl_scop_pread(foo, registry, precision);
-
-  osl_interface_free(registry);
-  return scop;
-}
-
-
-/*+***************************************************************************
- *                   Memory allocation/deallocation functions                *
- *****************************************************************************/
-
-
-/**
- * osl_scop_malloc function:
- * this function allocates the memory space for a osl_scop_t structure and
- * sets its fields with default values. Then it returns a pointer to the
- * allocated space.
- * \return A pointer to an empty scop with fields set to default values.
- */
-osl_scop_p osl_scop_malloc() {
-  osl_scop_p scop;
-
-  OSL_malloc(scop, osl_scop_p, sizeof(osl_scop_t));
-  scop->version        = 1;
-  scop->language       = NULL;
-  scop->context        = NULL;
-  scop->parameters     = NULL;
-  scop->statement      = NULL;
-  scop->registry       = NULL;
-  scop->extension      = NULL;
-  scop->usr            = NULL;
-  scop->next           = NULL;
-
-  return scop;
-}
-
-
-/**
- * osl_scop_free function:
- * This function frees the allocated memory for a osl_scop_t structure.
- * \param scop The pointer to the scop we want to free.
- */
-void osl_scop_free(osl_scop_p scop) {
-  osl_scop_p tmp;
-  
-  while (scop != NULL) {
-    if (scop->language != NULL)
-      free(scop->language);
-    osl_generic_free(scop->parameters);
-    osl_relation_free(scop->context);
-    osl_statement_free(scop->statement);
-    osl_interface_free(scop->registry);
-    osl_generic_free(scop->extension);
-
-    tmp = scop->next;
-    free(scop);
-    scop = tmp;
-  }
-}
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-
-
-/**
- * osl_scop_clone function:
- * This functions builds and returns a "hard copy" (not a pointer copy)
- * of a osl_statement_t data structure provided as parameter.
- * Note that the usr field is not touched by this function.
- * \param scop The pointer to the scop we want to clone.
- * \return A pointer to the full clone of the scop provided as parameter.
- */
-osl_scop_p osl_scop_clone(osl_scop_p scop) {
-  osl_scop_p clone = NULL, node, previous = NULL;
-  int first = 1;
-  
-  while (scop != NULL) {
-    node                 = osl_scop_malloc();
-    node->version        = scop->version;
-    if (scop->language != NULL)
-      node->language     = strdup(scop->language);
-    node->context        = osl_relation_clone(scop->context);
-    node->parameters     = osl_generic_clone(scop->parameters);
-    node->statement      = osl_statement_clone(scop->statement);
-    node->registry       = osl_interface_clone(scop->registry);
-    node->extension      = osl_generic_clone(scop->extension);
-    
-    if (first) {
-      first = 0;
-      clone = node;
-      previous = node;
-    }
-    else {
-      previous->next = node;
-      previous = previous->next;
-    }
-
-    scop = scop->next;
-  }
-
-  return clone;
-}
-
-
-/**
- * osl_scop_equal function:
- * this function returns true if the two scops are the same, false
- * otherwise (the usr field is not tested).
- * \param s1 The first scop.
- * \param s2 The second scop.
- * \return 1 if s1 and s2 are the same (content-wise), 0 otherwise.
- */
-int osl_scop_equal(osl_scop_p s1, osl_scop_p s2) {
-
-  while ((s1 != NULL) && (s2 != NULL)) {
-    if (s1 == s2)
-      return 1;
-
-    if (s1->version != s2->version) {
-      OSL_info("versions are not the same"); 
-      return 0;
-    }
-
-    if (strcmp(s1->language, s2->language) != 0) {
-      OSL_info("languages are not the same"); 
-      return 0;
-    }
-
-    if (!osl_relation_equal(s1->context, s2->context)) {
-      OSL_info("contexts are not the same"); 
-      return 0;
-    }
-
-    if (!osl_generic_equal(s1->parameters, s2->parameters)) {
-      OSL_info("parameters are not the same"); 
-      return 0;
-    }
-
-    if (!osl_statement_equal(s1->statement, s2->statement)) {
-      OSL_info("statements are not the same"); 
-      return 0;
-    }
-
-    if (!osl_interface_equal(s1->registry, s2->registry)) {
-      OSL_info("registries are not the same"); 
-      return 0;
-    }
-
-    if (!osl_generic_equal(s1->extension, s2->extension)) {
-      OSL_info("extensions are not the same"); 
-      return 0;
-    }
-
-    s1 = s1->next;
-    s2 = s2->next;
-  }
-  
-  if (((s1 == NULL) && (s2 != NULL)) || ((s1 != NULL) && (s2 == NULL)))
-    return 0;
-
-  return 1;
-}
-
-
-/**
- * osl_scop_integrity_check function:
- * This function checks that a scop is "well formed". It returns 0 if the
- * check failed or 1 if no problem has been detected.
- * \param scop  The scop we want to check.
- * \return 0 if the integrity check fails, 1 otherwise.
- */
-int osl_scop_integrity_check(osl_scop_p scop) {
-  int expected_nb_parameters;
-
-
-  while (scop != NULL) {
-    // Check the language.
-    if ((scop->language != NULL) &&
-        (!strcmp(scop->language, "caml")  || !strcmp(scop->language, "Caml") ||
-         !strcmp(scop->language, "ocaml") || !strcmp(scop->language, "OCaml")))
-      fprintf(stderr, "[OpenScop] Alert: What ?! Caml ?! Are you sure ?!?!\n");
-
-    // Check the context.
-    if (!osl_relation_integrity_check(scop->context,
-                                      OSL_TYPE_CONTEXT,
-                                      OSL_UNDEFINED,
-                                      OSL_UNDEFINED,
-                                      OSL_UNDEFINED))
-      return 0;
-
-    // Get the number of parameters.
-    if (scop->context != NULL) 
-      expected_nb_parameters = scop->context->nb_parameters;
-    else
-      expected_nb_parameters = OSL_UNDEFINED;
-    
-    // TODO : check the number of parameter strings.
-
-    if (!osl_statement_integrity_check(scop->statement,
-                                       expected_nb_parameters))
-      return 0;
-
-    scop = scop->next;
-  }
-
-  return 1;
-}
-
-
-/**
- * osl_scop_get_nb_parameters function:
- * this function returns the number of global parameters of a given SCoP.
- * \param scop The scop we want to know the number of global parameters.
- * \return The number of global parameters in the scop.
- */
-int osl_scop_get_nb_parameters(osl_scop_p scop) {
-
-  if (scop->context == NULL) {
-    OSL_debug("no context domain, assuming 0 parameters");
-    return 0;
-  }
-  else {
-    return scop->context->nb_parameters;
-  }
-}
-
-
-/**
- * osl_scop_register_extension function:
- * this function registers a list of extension interfaces to a scop, i.e., it
- * adds them to the scop registry. In addition, it will extract extensions
- * corresponding to those interfaces from the textual form of the extensions
- * (if any) and add them to the scop extension list.
- * \param scop      The scop for which an extension has to be registered.
- * \param interface The extension interface to register within the scop.
- */
-void osl_scop_register_extension(osl_scop_p scop, osl_interface_p interface) {
-  osl_generic_p textual, new;
-  char * extension_string;
-
-  if ((interface != NULL) && (scop != NULL)) {
-    osl_interface_add(&scop->registry, interface);
-
-    textual = osl_generic_lookup(scop->extension, interface->URI);
-    if (textual != NULL) {
-      extension_string = ((osl_textual_p)textual->data)->textual;
-      new = osl_generic_sread(extension_string, interface);
-      osl_generic_add(&scop->extension, new);
-    }
-  }
-}
-
-
-/**
- * osl_scop_get_attributes function:
- * this function returns, through its parameters, the maximum values of the
- * relation attributes (nb_iterators, nb_parameters etc) in the scop.
- * HOWEVER, it updates the parameter value iff the attribute is greater than
- * the input parameter value. Hence it may be used to get the attributes as
- * well as to find the maximum attributes for several scop lists. The array
- * identifier 0 is used when there is no array identifier (AND this is OK),
- * OSL_UNDEFINED is used to report it is impossible to provide the property
- * while it should. This function is not intended for checking, the input
- * scop should be correct.
- * \param[in]     scop          The scop to extract attributes values.
- * \param[in,out] nb_parameters Number of parameter attribute.
- * \param[in,out] nb_iterators  Number of iterators attribute.
- * \param[in,out] nb_scattdims  Number of scattering dimensions attribute.
- * \param[in,out] nb_localdims  Number of local dimensions attribute.
- * \param[in,out] array_id      Maximum array identifier attribute.
- */
-void osl_scop_get_attributes(osl_scop_p scop,
-                             int * nb_parameters,
-                             int * nb_iterators,
-                             int * nb_scattdims,
-                             int * nb_localdims,
-                             int * array_id) {
-  int local_nb_parameters = OSL_UNDEFINED;
-  int local_nb_iterators  = OSL_UNDEFINED;
-  int local_nb_scattdims  = OSL_UNDEFINED;
-  int local_nb_localdims  = OSL_UNDEFINED;
-  int local_array_id      = OSL_UNDEFINED;
-
-  while (scop != NULL) {
-    osl_relation_get_attributes(scop->context,
-                                &local_nb_parameters,
-                                &local_nb_iterators,
-                                &local_nb_scattdims,
-                                &local_nb_localdims,
-                                &local_array_id);
-
-    osl_statement_get_attributes(scop->statement,
-                                &local_nb_parameters,
-                                &local_nb_iterators,
-                                &local_nb_scattdims,
-                                &local_nb_localdims,
-                                &local_array_id);
-    // Update.
-    *nb_parameters = OSL_max(*nb_parameters, local_nb_parameters);
-    *nb_iterators  = OSL_max(*nb_iterators,  local_nb_iterators);
-    *nb_scattdims  = OSL_max(*nb_scattdims,  local_nb_scattdims);
-    *nb_localdims  = OSL_max(*nb_localdims,  local_nb_localdims);
-    *array_id      = OSL_max(*array_id,      local_array_id);
-    scop = scop->next;
-  }
-}
-
-
-/**
- * osl_scop_normalize_scattering function:
- * this function modifies a scop such that all scattering relation have
- * the same number of output dimensions (additional output dimensions are
- * set as being equal to zero).
- * \param[in,out] scop The scop to nomalize the scattering functions.
- */
-void osl_scop_normalize_scattering(osl_scop_p scop) {
-  int max_scattering_dims = 0;
-  osl_statement_p statement;
-  osl_relation_p extended;
-
-  if ((scop != NULL) && (scop->statement != NULL)) {
-    // Get the max number of scattering dimensions.
-    statement = scop->statement;
-    while (statement != NULL) {
-      if (statement->scattering != NULL) {
-        max_scattering_dims = OSL_max(max_scattering_dims,
-                                      statement->scattering->nb_output_dims);
-      }
-      statement = statement->next;
-    }
-
-    // Normalize.
-    statement = scop->statement;
-    while (statement != NULL) {
-      if (statement->scattering != NULL) {
-        extended = osl_relation_extend_output(statement->scattering,
-                                              max_scattering_dims);
-        osl_relation_free(statement->scattering);
-        statement->scattering = extended;
-      }
-      statement = statement->next;
-    }
-  }
-}
-
diff --git a/cloog-0.17.0/osl/source/statement.c b/cloog-0.17.0/osl/source/statement.c
deleted file mode 100644
index 73a0d01..0000000
--- a/cloog-0.17.0/osl/source/statement.c
+++ /dev/null
@@ -1,721 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                          statement.c                            **
-     **-----------------------------------------------------------------**
-     **                   First version: 30/04/2008                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#include <osl/macros.h>
-#include <osl/util.h>
-#include <osl/strings.h>
-#include <osl/body.h>
-#include <osl/relation.h>
-#include <osl/relation_list.h>
-#include <osl/names.h>
-#include <osl/interface.h>
-#include <osl/generic.h>
-#include <osl/statement.h>
-
-
-/*+***************************************************************************
- *                         Structure display functions                       *
- *****************************************************************************/
-
-
-/**
- * osl_statement_idump function:
- * this function displays an osl_statement_t structure (*statement) into
- * a file (file, possibly stdout) in a way that trends to be understandable.
- * It includes an indentation level (level) in order to work with others
- * dumping functions.
- * \param[in] file      File where the information has to be printed.
- * \param[in] statement The statement whose information has to be printed.
- * \param[in] level     Number of spaces before printing, for each line.
- */
-void osl_statement_idump(FILE * file, osl_statement_p statement, int level) {
-  int j, first = 1, number = 1;
-
-  // Go to the right level.
-  for (j = 0; j < level; j++)
-    fprintf(file, "|\t");
-
-  if (statement != NULL)
-    fprintf(file, "+-- osl_statement_t (S%d)\n", number);
-  else
-    fprintf(file, "+-- NULL statement\n");
-
-  while (statement != NULL) {
-    if (!first) {
-      // Go to the right level.
-      for (j = 0; j < level; j++)
-        fprintf(file, "|\t");
-      fprintf(file, "|   osl_statement_t (S%d)\n", number);
-    }
-    else
-      first = 0;
-
-    // A blank line.
-    for (j = 0; j <= level + 1; j++)
-      fprintf(file, "|\t");
-    fprintf(file, "\n");
-
-    // Print the domain of the statement.
-    osl_relation_idump(file, statement->domain, level + 1);
-
-    // Print the scattering of the statement.
-    osl_relation_idump(file, statement->scattering, level + 1);
-
-    // Print the array access information of the statement.
-    osl_relation_list_idump(file, statement->access, level + 1);
-
-    // Print the original body expression.
-    osl_generic_idump(file, statement->body, level + 1);
-
-    statement = statement->next;
-    number++;
-
-    // Next line.
-    if (statement != NULL) {
-      for (j = 0; j <= level; j++)
-        fprintf(file, "|\t");
-      fprintf(file, "V\n");
-    }
-  }
-
-  // The last line.
-  for (j = 0; j <= level; j++)
-    fprintf(file, "|\t");
-  fprintf(file, "\n");
-}
-
-
-/**
- * osl_statement_dump function:
- * this function prints the content of an osl_statement_t structure
- * (*statement) into  a file (file, possibly stdout).
- * \param[in] file      The file where the information has to be printed.
- * \param[in] statement The statement whose information has to be printed.
- */
-void osl_statement_dump(FILE * file, osl_statement_p statement) {
-  osl_statement_idump(file, statement, 0);
-}
-
-
-/**
- * osl_statement_names function:
- * this function generates as set of names for all the dimensions
- * involved in a given statement.
- * \param[in] statement The statement (list) we have to generate names for.
- * \return A set of generated names for the input statement dimensions.
- */
-static
-osl_names_p osl_statement_names(osl_statement_p statement) {
-  int nb_parameters = OSL_UNDEFINED;
-  int nb_iterators  = OSL_UNDEFINED;
-  int nb_scattdims  = OSL_UNDEFINED;
-  int nb_localdims  = OSL_UNDEFINED;
-  int array_id      = OSL_UNDEFINED;
-
-  osl_statement_get_attributes(statement, &nb_parameters, &nb_iterators,
-                               &nb_scattdims,  &nb_localdims, &array_id);
-  
-  return osl_names_generate("P", nb_parameters,
-                            "i", nb_iterators,
-                            "c", nb_scattdims,
-                            "l", nb_localdims,
-                            "A", array_id);
-}
-
-
-/**
- * osl_statement_pprint function:
- * this function pretty-prints the content of an osl_statement_t structure
- * (*statement) into a file (file, possibly stdout) in the OpenScop format.
- * \param[in] file      The file where the information has to be printed.
- * \param[in] statement The statement whose information has to be printed.
- * \param[in] names     The names of the constraint columns for comments. 
- */
-void osl_statement_pprint(FILE * file, osl_statement_p statement,
-                          osl_names_p names) {
-  int nb_relations, number = 1;
-  int generated_names = 0;
-  int iterators_backedup = 0;
-  osl_strings_p iterators_backup = NULL;
-
-  // Generate the dimension names if necessary and replace iterators with
-  // statement iterators if possible.
-  if (names == NULL) {
-    generated_names = 1;
-    names = osl_statement_names(statement);
-  }
-
-  while (statement != NULL) {
-    // If possible, replace iterator names with statement iterator names.
-    if (osl_generic_has_URI(statement->body, OSL_URI_BODY) &&
-        (((osl_body_p)(statement->body->data))->iterators != NULL)) {
-      iterators_backedup = 1;
-      iterators_backup = names->iterators;
-      names->iterators = ((osl_body_p)(statement->body->data))->iterators;
-    }
-
-    nb_relations = 0;
-
-    fprintf(file, "# =============================================== ");
-    fprintf(file, "Statement %d\n", number);
-
-    fprintf(file, "# Number of relations describing the statement:\n");
-
-    if (statement->domain != NULL)
-      nb_relations ++;
-    if (statement->scattering != NULL)
-      nb_relations ++;
-    nb_relations += osl_relation_list_count(statement->access); 
-
-    fprintf(file, "%d\n\n", nb_relations);
-
-    fprintf(file, "# ---------------------------------------------- ");
-    fprintf(file, "%2d.1 Domain\n", number);
-    osl_relation_pprint(file, statement->domain, names);
-    fprintf(file, "\n");
-
-    fprintf(file, "# ---------------------------------------------- ");
-    fprintf(file, "%2d.2 Scattering\n", number);
-    osl_relation_pprint(file, statement->scattering, names);
-    fprintf(file, "\n");
-
-    fprintf(file, "# ---------------------------------------------- ");
-    fprintf(file, "%2d.3 Access\n", number);
-    osl_relation_list_pprint_elts(file, statement->access, names);
-    fprintf(file, "\n");
-
-    fprintf(file, "# ---------------------------------------------- ");
-    fprintf(file, "%2d.4 Body\n", number);
-    if (statement->body != NULL) {
-      fprintf(file, "# Statement body is provided\n");
-      fprintf(file, "1\n");
-      osl_generic_print(file, statement->body);
-    }
-    else {
-      fprintf(file, "# Statement body is not provided\n");
-      fprintf(file, "0\n");
-    }
-
-    fprintf(file, "\n");
-
-    // If necessary, switch back iterator names.
-    if (iterators_backedup) {
-      iterators_backedup = 0;
-      names->iterators = iterators_backup;
-    }
-
-    statement = statement->next;
-    number++;
-  }
-
-  if (generated_names)
-    osl_names_free(names);
-}
-
-
-/**
- * osl_statement_print function:
- * this function prints the content of an osl_statement_t structure
- * (*statement) into a file (file, possibly stdout) in the OpenScop format.
- * \param[in] file      The file where the information has to be printed.
- * \param[in] statement The statement whose information has to be printed.
- */
-void osl_statement_print(FILE * file, osl_statement_p statement) {
-
-  osl_statement_pprint(file, statement, NULL);
-}
-
-
-/*****************************************************************************
- *                               Reading function                            *
- *****************************************************************************/
-
-
-/**
- * osl_statement_dispatch function:
- * this function dispatches the relations from a relation list to the
- * convenient fields of a statement structure: it extracts the domain,
- * the scattering and the access list and store them accordingly in the
- * statement structure provided as a parameter.
- * \param[in,out] stmt The statement where to dispatch the relations.
- * \param[in,out] list The "brute" relation list to sort and dispatch (freed).
- */
-static
-void osl_statement_dispatch(osl_statement_p stmt, osl_relation_list_p list) {
-  osl_relation_list_p domain_list; 
-  osl_relation_list_p scattering_list; 
-  int nb_domains, nb_scattering, nb_accesses;
-
-  // Domain.
-  domain_list = osl_relation_list_filter(list, OSL_TYPE_DOMAIN);
-  nb_domains = osl_relation_list_count(domain_list); 
-  if (nb_domains > 1)
-    OSL_error("more than one domain for a statement");
-  
-  if (domain_list != NULL) {
-    stmt->domain = domain_list->elt;
-    domain_list->elt = NULL;
-    osl_relation_list_free(domain_list);
-  }
-  else {
-    stmt->domain = NULL;
-  }
-
-  // Scattering.
-  scattering_list=osl_relation_list_filter(list,OSL_TYPE_SCATTERING);
-  nb_scattering = osl_relation_list_count(scattering_list); 
-  if (nb_scattering > 1)
-    OSL_error("more than one scattering relation for a statement");
-  
-  if (scattering_list != NULL) {
-    stmt->scattering = scattering_list->elt;
-    scattering_list->elt = NULL;
-    osl_relation_list_free(scattering_list);
-  }
-  else {
-    stmt->scattering = NULL;
-  }
-
-  // Access.
-  stmt->access = osl_relation_list_filter(list, OSL_TYPE_ACCESS);
-  nb_accesses = osl_relation_list_count(stmt->access);
-
-  if ((nb_domains + nb_scattering + nb_accesses) !=
-      (osl_relation_list_count(list)))
-    OSL_error("unexpected relation type to define a statement");
-
-  osl_relation_list_free(list);
-}
-
-
-/**
- * osl_statement_pread function ("precision read"):
- * this function reads an osl_statement_t structure from an input stream
- * (possibly stdin).
- * \param[in] file      The input stream.
- * \param[in] registry  The list of known interfaces (others are ignored).
- * \param[in] precision The precision of the relation elements.
- * \return A pointer to the statement structure that has been read.
- */
-osl_statement_p osl_statement_pread(FILE * file, osl_interface_p registry,
-                                    int precision) {
-  osl_statement_p stmt = osl_statement_malloc();
-  osl_relation_list_p list;
-
-  if (file) {
-    // Read all statement relations.
-    list = osl_relation_list_pread(file, precision);
-
-    // Store relations at the right place according to their type.
-    osl_statement_dispatch(stmt, list);
-
-    // Read the body information.
-    if (osl_util_read_int(file, NULL) > 0)
-      stmt->body = osl_generic_read_one(file, registry); 
-  }
-
-  return stmt;
-}
-
-
-/**
- * osl_statement_read function:
- * this function is equivalent to osl_statement_pread() except that
- * (1) the precision corresponds to the precision environment variable or
- *     to the highest available precision if it is not defined, and
- * (2) the list of known interface is set to the default one.
- * \see{osl_statement_pread}
- */
-osl_statement_p osl_statement_read(FILE * foo) {
-  int precision = osl_util_get_precision();
-  osl_interface_p registry = osl_interface_get_default_registry();
-  osl_statement_p statement = osl_statement_pread(foo, registry, precision);
-
-  osl_interface_free(registry);
-  return statement;
-}
-
-
-/*+***************************************************************************
- *                   Memory allocation/deallocation functions                *
- *****************************************************************************/
-
-
-/**
- * osl_statement_malloc function:
- * this function allocates the memory space for an osl_statement_t
- * structure and sets its fields with default values. Then it returns a pointer
- * to the allocated space.
- * \return A pointer to an empty statement with fields set to default values.
- */
-osl_statement_p osl_statement_malloc() {
-  osl_statement_p statement;
-
-  OSL_malloc(statement, osl_statement_p, sizeof(osl_statement_t));
-  statement->domain     = NULL;
-  statement->scattering = NULL;
-  statement->access     = NULL;
-  statement->body       = NULL;
-  statement->next       = NULL;
-
-  return statement;
-}
-
-
-/**
- * osl_statement_free function:
- * this function frees the allocated memory for an osl_statement_t
- * structure.
- * \param[in,out] statement The pointer to the statement we want to free.
- */
-void osl_statement_free(osl_statement_p statement) {
-  osl_statement_p next;
-
-  while (statement != NULL) {
-    next = statement->next;
-    osl_relation_free(statement->domain);
-    osl_relation_free(statement->scattering);
-    osl_relation_list_free(statement->access);
-    osl_generic_free(statement->body);
-
-    free(statement);
-    statement = next;
-  }
-}
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-
-
-/**
- * osl_statement_add function:
- * this function adds a statement "statement" at the end of the statement
- * list pointed by "location".
- * \param[in,out] location  Address of the first element of the statement list.
- * \param[in]     statement The statement to add to the list.
- */
-void osl_statement_add(osl_statement_p * location,
-                       osl_statement_p   statement) {
-  while (*location != NULL)
-    location = &((*location)->next);
-
-  *location = statement;
-}
-
-
-/**
- * osl_statement_number function:
- * this function returns the number of statements in the statement list
- * provided as parameter.
- * \param[in] statement The first element of the statement list.
- * \return The number of statements in the statement list.
- */
-int osl_statement_number(osl_statement_p statement) {
-  int number = 0;
-
-  while (statement != NULL) {
-    number++;
-    statement = statement->next;
-  }
-  return number;
-}
-
-
-/**
- * osl_statement_clone function:
- * This functions builds and returns a "hard copy" (not a pointer copy) of an
- * osl_statement_t data structure provided as parameter.
- * \param[in] statement The pointer to the statement we want to clone.
- * \return A pointer to the clone of the statement provided as parameter.
- */
-osl_statement_p osl_statement_clone(osl_statement_p statement) {
-  int first = 1;
-  osl_statement_p clone = NULL, node, previous = NULL;
-
-  while (statement != NULL) {
-    node             = osl_statement_malloc();
-    node->domain     = osl_relation_clone(statement->domain);
-    node->scattering = osl_relation_clone(statement->scattering);
-    node->access     = osl_relation_list_clone(statement->access);
-    node->body       = osl_generic_clone(statement->body);
-    node->next       = NULL;
-    
-    if (first) {
-      first = 0;
-      clone = node;
-      previous = node;
-    }
-    else {
-      previous->next = node;
-      previous = previous->next;
-    }
-
-    statement = statement->next;
-  }
-
-  return clone;
-}
-
-
-/**
- * osl_statement_equal function:
- * this function returns true if the two statements provided as parameters
- * are the same, false otherwise (the usr field is not tested).
- * \param[in] s1 The first statement.
- * \param[in] s2 The second statement.
- * \return 1 if s1 and s2 are the same (content-wise), 0 otherwise.
- */
-int osl_statement_equal(osl_statement_p s1, osl_statement_p s2) {
-  
-  if (s1 == s2)
-    return 1;
-  
-  if (((s1->next != NULL) && (s2->next == NULL)) ||
-      ((s1->next == NULL) && (s2->next != NULL))) {
-    OSL_info("statements are not the same"); 
-    return 0;
-  }
-
-  if ((s1->next != NULL) && (s2->next != NULL)) {
-    if (!osl_statement_equal(s1->next, s2->next)) {
-      OSL_info("number of statements is not the same"); 
-      return 0;
-    }
-  }
-    
-  if (!osl_relation_equal(s1->domain, s2->domain)) {
-    OSL_info("statement domains are not the same"); 
-    return 0;
-  }
-
-  if (!osl_relation_equal(s1->scattering, s2->scattering)) {
-    OSL_info("statement scatterings are not the same"); 
-    return 0;
-  }
-
-  if (!osl_relation_list_equal(s1->access, s2->access)) {
-    OSL_info("statement accesses are not the same"); 
-    return 0;
-  }
-
-  if (!osl_generic_equal(s1->body, s2->body)) {
-    OSL_info("statement bodies are not the same"); 
-    return 0;
-  }
-
-  return 1;
-}
-
-
-/**
- * osl_statement_integrity_check function:
- * this function checks that a statement is "well formed" according to some
- * expected properties (setting an expected value to OSL_UNDEFINED means
- * that we do not expect a specific value). It returns 0 if the check failed
- * or 1 if no problem has been detected.
- * \param[in] statement              The statement we want to check.
- * \param[in] expected_nb_parameters Expected number of parameters.
- * \return 0 if the integrity check fails, 1 otherwise.
- */
-int osl_statement_integrity_check(osl_statement_p statement,
-                                  int expected_nb_parameters) {
-  int expected_nb_iterators;
-
-  while (statement != NULL) {
-    // Check the domain.
-    if (!osl_relation_integrity_check(statement->domain,
-                                      OSL_TYPE_DOMAIN,
-                                      OSL_UNDEFINED,
-                                      0,
-                                      expected_nb_parameters)) {
-      return 0;
-    }
-
-    // Get the number of iterators.
-    if (statement->domain != NULL)
-      expected_nb_iterators = statement->domain->nb_output_dims;
-    else
-      expected_nb_iterators = OSL_UNDEFINED;
-
-    // Check the scattering relation.
-    if (!osl_relation_integrity_check(statement->scattering,
-                                      OSL_TYPE_SCATTERING,
-                                      OSL_UNDEFINED,
-                                      expected_nb_iterators,
-                                      expected_nb_parameters)) {
-      return 0;
-    }
-
-    // Check the access relations.
-    if (!osl_relation_list_integrity_check(statement->access,
-                                           OSL_TYPE_ACCESS,
-                                           OSL_UNDEFINED,
-                                           expected_nb_iterators,
-                                           expected_nb_parameters)) {
-      return 0;
-    }
-
-    // Check the statement body.
-    if ((expected_nb_iterators != OSL_UNDEFINED) &&
-        (osl_generic_has_URI(statement->body, OSL_URI_BODY)) &&
-        (((osl_body_p)(statement->body->data))->iterators != NULL) &&
-        (expected_nb_iterators != osl_strings_size(
-            ((osl_body_p)(statement->body->data))->iterators))) {
-      OSL_warning("unexpected number of original iterators");
-      return 0;
-    }
-
-    statement = statement->next;
-  }
-
-  return 1;
-}
-
-
-/**
- * osl_statement_get_nb_iterators function:
- * this function returns the number of surroounding iterators of a given
- * statement.
- * \param statement The statement we want to know the number of iterators.
- * \return The number of surrounding iterators for the statement.
- */
-int osl_statement_get_nb_iterators(osl_statement_p statement) {
-
-  if (statement->domain == NULL) {
-    OSL_warning("no statement domain, assuming 0 iterators");
-    return 0;
-  }
-  else {
-    return statement->domain->nb_output_dims;
-  }
-}
-
-
-/**
- * osl_statement_get_attributes function:
- * this function returns, through its parameters, the maximum values of the
- * relation attributes (nb_iterators, nb_parameters etc) in the statement.
- * HOWEVER, it updates the parameter value iff the attribute is greater than
- * the input parameter value. Hence it may be used to get the attributes as
- * well as to find the maximum attributes for several statement lists. The
- * array identifier 0 is used when there is no array identifier (AND this is
- * OK), OSL_UNDEFINED is used to report it is impossible to provide the
- * property while it should. This function is not intended for checking, the
- * input statement should be correct.
- * \param[in]     statement     The statement to extract attributes values.
- * \param[in,out] nb_parameters Number of parameter attribute.
- * \param[in,out] nb_iterators  Number of iterators attribute.
- * \param[in,out] nb_scattdims  Number of scattering dimensions attribute.
- * \param[in,out] nb_localdims  Number of local dimensions attribute.
- * \param[in,out] array_id      Maximum array identifier attribute.
- */
-void osl_statement_get_attributes(osl_statement_p statement,
-                                  int * nb_parameters,
-                                  int * nb_iterators,
-                                  int * nb_scattdims,
-                                  int * nb_localdims,
-                                  int * array_id) {
-  int local_nb_parameters = OSL_UNDEFINED;
-  int local_nb_iterators  = OSL_UNDEFINED;
-  int local_nb_scattdims  = OSL_UNDEFINED;
-  int local_nb_localdims  = OSL_UNDEFINED;
-  int local_array_id      = OSL_UNDEFINED;
-
-  while (statement != NULL) {
-    osl_relation_get_attributes(statement->domain,
-                                &local_nb_parameters,
-                                &local_nb_iterators,
-                                &local_nb_scattdims,
-                                &local_nb_localdims,
-                                &local_array_id);
-
-    osl_relation_get_attributes(statement->scattering,
-                                &local_nb_parameters,
-                                &local_nb_iterators,
-                                &local_nb_scattdims,
-                                &local_nb_localdims,
-                                &local_array_id);
-
-    osl_relation_list_get_attributes(statement->access,
-                                &local_nb_parameters,
-                                &local_nb_iterators,
-                                &local_nb_scattdims,
-                                &local_nb_localdims,
-                                &local_array_id);
-    // Update.
-    *nb_parameters = OSL_max(*nb_parameters, local_nb_parameters);
-    *nb_iterators  = OSL_max(*nb_iterators,  local_nb_iterators);
-    *nb_scattdims  = OSL_max(*nb_scattdims,  local_nb_scattdims);
-    *nb_localdims  = OSL_max(*nb_localdims,  local_nb_localdims);
-    *array_id      = OSL_max(*array_id,      local_array_id);
-    statement = statement->next;
-  }
-}
-
diff --git a/cloog-0.17.0/osl/source/strings.c b/cloog-0.17.0/osl/source/strings.c
deleted file mode 100644
index 91c4990..0000000
--- a/cloog-0.17.0/osl/source/strings.c
+++ /dev/null
@@ -1,465 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                           strings.c                             **
-     **-----------------------------------------------------------------**
-     **                   First version: 13/07/2011                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-# include <stdlib.h>
-# include <stdio.h>
-# include <ctype.h>
-# include <string.h>
-
-# include <osl/macros.h>
-# include <osl/util.h>
-# include <osl/interface.h>
-# include <osl/strings.h>
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-
-
-/**
- * osl_strings_idump function:
- * this function displays an array of strings into a file (file, possibly
- * stdout) in a way that trends to be understandable. It includes an
- * indentation level (level) in order to work with others
- * idump functions.
- * \param[in] file    The file where the information has to be printed.
- * \param[in] strings The array of strings that has to be printed.
- * \param[in] level   Number of spaces before printing, for each line.
- */
-void osl_strings_idump(FILE * file, osl_strings_p strings, int level) {
-  int i, nb_strings;
-  
-  for (i = 0; i < level; i++)
-    fprintf(file, "|\t");
-  
-  if (strings != NULL) {
-    nb_strings = osl_strings_size(strings);
-    fprintf(file, "+-- osl_strings_t:");
-    for (i = 0; i < nb_strings; i++)
-      fprintf(file, " %s", strings->string[i]);
-    fprintf(file, "\n");
-  }
-  else
-    fprintf(file, "+-- NULL strings\n");
-
-  // A blank line.
-  for (i = 0; i <= level; i++)
-    fprintf(file, "|\t");
-  fprintf(file, "\n");
-}
-
-
-/**
- * osl_strings_dump function:
- * this function prints the content of an osl_strings_t structure
- * (*strings) into a file (file, possibly stdout).
- * \param[in] file    The file where the information has to be printed.
- * \param[in] strings The strings structure which has to be printed.
- */
-void osl_strings_dump(FILE * file, osl_strings_p strings) {
-  osl_strings_idump(file, strings, 0);
-}
-
-
-/**
- * osl_strings_sprint function:
- * this function prints the content of an osl_strings_t structure
- * (*strings) into a string (returned) in the OpenScop textual format.
- * \param[in] strings The strings structure which has to be printed.
- * \return A string containing the OpenScop dump of the strings structure.
- */
-char * osl_strings_sprint(osl_strings_p strings) {
-  int i;
-  int high_water_mark = OSL_MAX_STRING;
-  char * string = NULL;
-  char buffer[OSL_MAX_STRING];
-
-  OSL_malloc(string, char *, high_water_mark * sizeof(char));
-  string[0] = '\0';
-   
-  if (strings != NULL) {
-    for (i = 0; i < osl_strings_size(strings); i++) {
-      sprintf(buffer, "%s", strings->string[i]);
-      osl_util_safe_strcat(&string, buffer, &high_water_mark);
-      if (i < osl_strings_size(strings) - 1)
-        osl_util_safe_strcat(&string, " ", &high_water_mark);
-    }
-    sprintf(buffer, "\n");
-    osl_util_safe_strcat(&string, buffer, &high_water_mark);
-  }
-  else {
-    sprintf(buffer, "# NULL strings\n");
-    osl_util_safe_strcat(&string, buffer, &high_water_mark);
-  }
-
-  return string;
-}
-
-
-/**
- * osl_strings_print function:
- * this function prints the content of an osl_strings_t structure
- * (*body) into a file (file, possibly stdout) in the OpenScop format.
- * \param[in] file    File where informations are printed.
- * \param[in] strings The strings whose information has to be printed.
- */
-void osl_strings_print(FILE * file, osl_strings_p strings) {
-  char * string;
-  
-  string = osl_strings_sprint(strings);
-  if (string != NULL) {
-    fprintf(file, "%s", string);
-    free(string);
-  }
-}
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-
-
-/**
- * osl_strings_sread function:
- * this function reads a strings structure from a string complying to the
- * OpenScop textual format and returns a pointer to this strings structure.
- * The input string should only contain the list of strings this function
- * has to read (comments at the end of the line are accepted). The input
- * parameter is updated to the position in the input string this function
- * reach right after reading the strings structure.
- * \param[in,out] input The input string where to find a strings structure.
- *                      Updated to the position after what has been read.
- * \return A pointer to the strings structure that has been read.
- */
-osl_strings_p osl_strings_sread(char ** input) {
-  char tmp[OSL_MAX_STRING];
-  char * s;
-  char ** string = NULL;
-  int nb_strings;
-  int i, count;
-  osl_strings_p strings = NULL;
-
-  // Skip blank/commented lines and spaces before the strings.
-  osl_util_sskip_blank_and_comments(input);
-  
-  // Count the actual number of strings.
-  nb_strings = 0;
-  s = *input;
-  while (1) {
-    for (count = 0; *s && !isspace(*s) && *s != '#'; count++)
-      s++;
-    
-    if (count != 0)
-      nb_strings++;
-
-    if ((!*s) || (*s == '#') || (*s == '\n'))
-      break;
-    else
-      s++;
-  }
-
-  if (nb_strings > 0) {
-    // Allocate the array of strings. Make it NULL-terminated.
-    OSL_malloc(string, char **, sizeof(char *) * (nb_strings + 1));
-    string[nb_strings] = NULL;
-
-    // Read the desired number of strings.
-    s = *input;
-    for (i = 0; i < nb_strings; i++) {
-      for (count = 0; *s && !isspace(*s) && *s != '#'; count++)
-	tmp[count] = *(s++);
-      tmp[count] = '\0';
-      OSL_strdup(string[i], tmp);
-      if (*s != '#')
-	s++;
-    }
-
-    // Update the input pointer to the end of the strings structure.
-    *input = s;
-
-    // Build the strings structure
-    strings = osl_strings_malloc();
-    strings->string = string;
-  }
-
-  return strings;
-}
-
-
-/**
- * osl_strings_read function.
- * this function reads a strings structure from a file (possibly stdin)
- * complying to the OpenScop textual format and returns a pointer to this
- * structure.
- * parameter nb_strings).
- * \param[in] file The file where to read the strings structure.
- * \return The strings structure that has been read.
- */
-osl_strings_p osl_strings_read(FILE * file) {
-  char buffer[OSL_MAX_STRING], * start;
-  osl_strings_p strings;
-
-  start = osl_util_skip_blank_and_comments(file, buffer);
-  strings = osl_strings_sread(&start);
-
-  return strings;
-}
-  
-
-/*+***************************************************************************
- *                    Memory allocation/deallocation function                *
- *****************************************************************************/
-
-
-/**
- * osl_strings_malloc function:
- * This function allocates the memory space for an osl_strings_t
- * structure and sets its fields with default values. Then it returns a
- * pointer to the allocated space.
- * \return A pointer to an empty strings structure with fields set to
- *         default values.
- */
-osl_strings_p osl_strings_malloc() {
-  osl_strings_p strings;
-
-  OSL_malloc(strings, osl_strings_p, sizeof(osl_strings_t));
-  strings->string = NULL;
-
-  return strings;
-}
-
-
-/**
- * osl_strings_free function:
- * this function frees the allocated memory for a strings data structure.
- * \param[in] strings The strings structure we want to free.
- */
-void osl_strings_free(osl_strings_p strings) {
-  int i;
-
-  if (strings != NULL) {
-    if (strings->string != NULL) {
-      i = 0;
-      while(strings->string[i] != NULL) {
-        free(strings->string[i]);
-        i++;
-      }
-      free(strings->string);
-    }
-    free(strings);
-  }
-}
-
-
-/*+***************************************************************************
- *                            Processing functions                           *
- *****************************************************************************/
-
-
-/**
- * osl_strings_clone function.
- * this function builds and return a "hard copy" (not a pointer copy) of an
- * strings structure provided as parameter.
- * \param[in] strings The strings structure to clone.
- * \return The clone of the strings structure.
- */
-osl_strings_p osl_strings_clone(osl_strings_p strings) {
-  int i, nb_strings;
-  osl_strings_p clone = NULL;
-  
-  if (strings == NULL)
-    return NULL;
-
-  clone = osl_strings_malloc();
-  if ((nb_strings = osl_strings_size(strings)) == 0)
-    return clone;
-
-  OSL_malloc(clone->string, char **, (nb_strings + 1) * sizeof(char *));
-  clone->string[nb_strings] = NULL;
-  for (i = 0; i < nb_strings; i++) {
-    clone->string[i] = strdup(strings->string[i]);
-    if (clone->string[i] == NULL)
-      OSL_error("memory overflow");
-  }
-
-  return clone;
-}
-
-
-/**
- * osl_strings_equal function:
- * this function returns true if the two strings structures are the same
- * (content-wise), false otherwise.
- * \param[in] s1 The first strings structure.
- * \param[in] s2 The second strings structure.
- * \return 1 if s1 and s2 are the same (content-wise), 0 otherwise.
- */
-int osl_strings_equal(osl_strings_p s1, osl_strings_p s2) {
-  int i, nb_s1;
-  
-  if (s1 == s2)
-    return 1;
-
-  if (((s1 == NULL) && (s2 != NULL)) ||
-      ((s1 != NULL) && (s2 == NULL)) ||
-      ((nb_s1 = osl_strings_size(s1)) != osl_strings_size(s2)))
-    return 0;
-
-  for (i = 0; i < nb_s1; i++)
-    if (strcmp(s1->string[i], s2->string[i]) != 0)
-      return 0;
-
-  return 1;
-}
-
-
-/**
- * osl_strings_size function:
- * this function returns the number of elements in the NULL-terminated
- * strings array of the strings structure.
- * \param[in] strings The strings structure we need to know the size.
- * \return The number of strings in the strings structure.
- */
-int osl_strings_size(osl_strings_p strings) {
-  int size = 0;
-
-  if ((strings != NULL) && (strings->string != NULL)) {
-    while (strings->string[size] != NULL) {
-      size++;
-    }
-  }
-
-  return size;
-}
-
-
-/**
- * osl_strings_encapsulate function:
- * this function builds a new strings structure to encapsulate the string
- * provided as a parameter (the reference to this string is used directly).
- * \param[in] string The string to encapsulate in a strings structure.
- * \return A new strings structure containing only the provided string.
- */
-osl_strings_p osl_strings_encapsulate(char * string) {
-  osl_strings_p capsule = osl_strings_malloc();
-  
-  OSL_malloc(capsule->string, char **, 2 * sizeof(char *));
-  capsule->string[0] = string;
-  capsule->string[1] = NULL;
-  
-  return capsule;
-}
-
-
-/**
- * osl_strings_interface function:
- * this function creates an interface structure corresponding to the strings
- * structure and returns it).
- * \return An interface structure for the strings structure.
- */
-osl_interface_p osl_strings_interface() {
-  osl_interface_p interface = osl_interface_malloc();
-  
-  interface->URI    = strdup(OSL_URI_STRINGS);
-  interface->idump  = (osl_idump_f)osl_strings_idump;
-  interface->sprint = (osl_sprint_f)osl_strings_sprint;
-  interface->sread  = (osl_sread_f)osl_strings_sread;
-  interface->malloc = (osl_malloc_f)osl_strings_malloc;
-  interface->free   = (osl_free_f)osl_strings_free;
-  interface->clone  = (osl_clone_f)osl_strings_clone;
-  interface->equal  = (osl_equal_f)osl_strings_equal;
-
-  return interface;
-}
-
-
-/**
- * osl_strings_generate function:
- * this function generates a new strings structure containing
- * 'nb_strings' strings of the form "prefixXX" where XX goes from 1 to
- * nb_strings.
- * \param[in] prefix     The prefix of the generated strings.
- * \param[in] nb_strings The number of strings to generate.
- * \return A new strings structure containing generated strings.
- */
-osl_strings_p osl_strings_generate(char * prefix, int nb_strings) {
-  char ** strings = NULL;
-  char buff[strlen(prefix) + 16]; // TODO: better (log10(INT_MAX) ?) :-D.
-  int i;
-  osl_strings_p generated;
-
-  if (nb_strings) {
-    OSL_malloc(strings, char **, sizeof(char *) * (nb_strings + 1));
-    strings[nb_strings] = NULL;
-    for (i = 0; i < nb_strings; i++) {
-      sprintf(buff, "%s%d", prefix, i + 1);
-      strings[i] = strdup(buff);
-      if (strings[i] == NULL)
-        OSL_error("memory overflow");
-    }
-  }
-
-  generated = osl_strings_malloc();
-  generated->string = strings;
-  return generated;
-}
diff --git a/cloog-0.17.0/osl/source/util.c b/cloog-0.17.0/osl/source/util.c
deleted file mode 100644
index 950f5e8..0000000
--- a/cloog-0.17.0/osl/source/util.c
+++ /dev/null
@@ -1,573 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                            util.c                               **
-     **-----------------------------------------------------------------**
-     **                   First version: 08/10/2010                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <string.h>
-
-#include <osl/macros.h>
-#include <osl/util.h>
-
-
-/*+***************************************************************************
- *                             Utility functions                             *
- *****************************************************************************/
-
-
-/**
- * osl_util_skip_blank_and_comments "file skip" function:
- * this function reads the open file 'file' line by line and skips
- * blank/comment lines and spaces. The first line where there is some
- * useful information is stored at the address 'str' (the memory to
- * store the line must be allocated before the call to this function
- * and must be at least OSL_MAX_STRING * sizeof(char)). The pointer
- * to the first useful information in this line is returned by the
- * function.
- * \param[in] file The (opened) file to read.
- * \param[in] str  Address of an allocated space to store the first line
- *                 that contains useful information.
- * \return The address of the the first useful digit in str.
- */
-char * osl_util_skip_blank_and_comments(FILE * file, char * str) {
-  char * start;
-
-  do {
-    start = fgets(str, OSL_MAX_STRING, file);
-    while ((start != NULL) && isspace(*start) && (*start != '\n'))
-      start++;
-  }
-  while (start != NULL && (*start == '#' || *start == '\n'));
-
-  return start;
-}
-
-
-/**
- * osl_util_sskip_blank_and_comments "string skip" function:
- * this function updates the str pointer, which initialy points to a string,
- * to the first character in this string which is not a space or a comment
- * (comments start at '#' and end at '\n'), or to the end of string.
- * \param[in,out] str Address of a string, updated to the address of
- *                    the first non-space or comment character.
- */
-void osl_util_sskip_blank_and_comments(char ** str) {
-  do {
-    // Skip spaces/blanc lines.
-    while (*str && **str && isspace(**str))
-      (*str)++;
-
-    // Skip the comment if any.
-    if (*str && **str && **str == '#') {
-      while (**str && **str != '\n') {
-        (*str)++;
-      }
-    }
-  }
-  while (*str && **str && **str == '\n');
-}
-
-
-/**
- * osl_util_read_int function:
- * reads an int on the input 'file' or the input string 'str' depending on
- * which one is not NULL (exactly one of them must not be NULL).
- * \param[in]     file The file where to read an int (if not NULL).
- * \param[in,out] str  The string where to read an int (if not NULL). This
- *                     pointer is updated to reflect the read and points
- *                     after the int in the input string.
- * \return The int that has been read.
- */
-int osl_util_read_int(FILE * file, char ** str) {
-  char s[OSL_MAX_STRING], * start;
-  int res;
-  int i = 0;
-
-  if ((file != NULL && str != NULL) || (file == NULL && str == NULL))
-    OSL_error("one and only one of the two parameters can be non-NULL");
-
-  if (file != NULL) {
-    // Parse from a file.
-    start = osl_util_skip_blank_and_comments(file, s);
-    if (sscanf(start, " %d", &res) != 1)
-      OSL_error("an int was expected");
-  }
-  else {
-    // Parse from a string.
-    // Skip blank/commented lines.
-    osl_util_sskip_blank_and_comments(str);
-    
-    // Build the chain to analyze.
-    while (**str && !isspace(**str) && **str != '\n')
-      s[i++] = *((*str)++);
-    s[i] = '\0';
-    if (sscanf(s, "%d", &res) != 1)
-      OSL_error("an int was expected");
-  }
-
-  return res;
-}
-
-
-/**
- * osl_util_read_int internal function:
- * reads a tag (the form of a tag with name "name" is \<name\>) on the input
- * 'file' or the input string 'str' depending on which one is not NULL (exactly
- * one of them must not be NULL). It returns the name of the tag (thus without
- * the < and > as a string. Note that in the case of an ending tag, e.g.,
- * \</foo\>, the slash is returned as a part of the name, e.g., /foo.
- * \param[in]     file The file where to read a tag (if not NULL).
- * \param[in,out] str  The string where to read a tag (if not NULL). This
- *                     pointer is updated to reflect the read and points
- *                     after the tag in the input string.
- * \return The tag name that has been read.
- */
-char * osl_util_read_tag(FILE * file, char ** str) {
-  char s[OSL_MAX_STRING], * start;
-  char * res;
-  int i = 0;
-
-  if ((file != NULL && str != NULL) || (file == NULL && str == NULL))
-    OSL_error("one and only one of the two parameters can be non-NULL");
-
-  // Skip blank/commented lines.
-  if (file != NULL) {
-    start = osl_util_skip_blank_and_comments(file, s);
-    str = &start;
-  }
-  else {
-    osl_util_sskip_blank_and_comments(str);
-  }
-
-  // Pass the starting '<'.
-  if (**str != '<')
-    OSL_error("a \"<\" to start a tag was expected");
-  (*str)++;
-
-  // Read the tag.
-  OSL_malloc(res, char *, (OSL_MAX_STRING + 1) * sizeof(char));
-  res[OSL_MAX_STRING] = '\0';
-  
-  while (**str && **str != '>') {
-    if (((**str >= 'A') && (**str <= 'Z')) ||
-        ((**str >= 'a') && (**str <= 'z')) ||
-        ((**str == '/') && (i == 0))       ||
-        (**str == '_')) {
-      res[i++] = *((*str)++);
-      res[i] = '\0';
-    }
-    else {
-      OSL_error("illegal character in the tag name");
-    }
-  }
-
-  // Check we actually end up with a '>' and pass it.
-  if (**str != '>')
-    OSL_error("a \">\" to end a tag was expected");
-  (*str)++;
-
-  return res;
-}
-
-
-/**
- * osl_util_read_uptotag function:
- * this function reads a file up to a given tag (the tag is read) or the
- * end of file. It puts everything it reads, except the tag, in a string 
- * which is returned. However ot returns NULL is the tag is not found.
- * \param[in] file The file where to read the tail.
- * \param[in] tag  The tag which, when reached, stops the file reading.
- * \return The string that has been read from the file.
- */
-char * osl_util_read_uptotag(FILE * file, char * tag) {
-  int high_water_mark = OSL_MAX_STRING;
-  int nb_chars = 0;
-  int lentag = strlen(tag);
-  int tag_found = 0;
-  char * res;
-
-  OSL_malloc(res, char *, high_water_mark * sizeof(char));
-
-  // - Copy everything to the res string.
-  while (!feof(file)) {
-    res[nb_chars] = fgetc(file); 
-    nb_chars++;
-
-    if ((nb_chars >= lentag) &&
-        (!strncmp(&res[nb_chars - lentag], tag, lentag))) {
-      tag_found = 1;
-      break;
-    }
-
-    if (nb_chars >= high_water_mark) {
-      high_water_mark += high_water_mark;
-      OSL_realloc(res, char *, high_water_mark * sizeof(char));
-    }
-  }
-
-  if (!tag_found) {
-    OSL_debug("tag was not found, end of file reached");
-    free(res);
-    return NULL;
-  }
-
-  // - 0-terminate the string.
-  OSL_realloc(res, char *, (nb_chars - strlen(tag) + 1) * sizeof(char));
-  res[nb_chars - strlen(tag)] = '\0';
-
-  return res;
-}
-
-
-/**
- * osl_util_read_uptoendtag function:
- * this function reads a file up to a given end tag (this end tag is read)
- * or the end of file. The name of the tag is provided as parameter (hence
- * without the starting "</" end the closing ">"). It puts everything it reads
- * in a string which is returned.
- * \param[in] file The file where to read the tail.
- * \param[in] name The name of the end tag to the file reading.
- * \return The string that has been read from the file.
- */
-char * osl_util_read_uptoendtag(FILE * file, char * name) {
-  char tag[strlen(name) + 4];
-  
-  sprintf(tag, "</%s>", name);
-  return osl_util_read_uptotag(file, tag);
-}
-
-
-/**
- * osl_util_tag_content function:
- * this function returns a freshly allocated string containing the
- * content, in the given string 'str', between the tag '\<name\>' and
- * the tag '\</name\>'. If the tag '\<name\>' is not found, it returns NULL.
- * \param[in] str    The string where to find a given content.
- * \param[in] name   The name of the tag we are looking for.
- * \return The string between '\<name\>' and '\</name\>' in 'str'.
- */
-char * osl_util_tag_content(char * str, char * name) {
-  int i;
-  char * start;
-  char * stop;
-  char tag[strlen(name) + 3];
-  char endtag[strlen(name) + 4];
-  int size = 0;
-  int lentag;
-  char * res = NULL;
-
-  sprintf(tag, "<%s>", name);
-  sprintf(endtag, "</%s>", name);
-  
-  if (str) {
-    start = str;
-    lentag = strlen(tag);
-    for (; start && *start && strncmp(start, tag, lentag); ++start)
-      continue;
-    
-    // The tag 'tag' was not found.
-    if (! *start)
-      return NULL;
-    start += lentag;
-    stop = start;
-    lentag = strlen(endtag);
-    for (size = 0; *stop && strncmp(stop, endtag, lentag); ++stop, ++size)
-      continue;
-    
-    // the tag 'endtag' was not found.
-    if (! *stop)
-      return NULL;
-    OSL_malloc(res, char *, (size + 1) * sizeof(char));
-    
-    // Copy the chain between the two tags.
-    for (++start, i = 0; start != stop; ++start, ++i)
-      res[i] = *start;
-    res[i] = '\0';
-  }
-
-  return res;
-}
-
-
-/**
- * osl_util_safe_strcat function:
- * this function concatenates the string src to the string *dst
- * and reallocates *dst if necessary. The current size of the
- * *dst buffer must be *hwm (high water mark), if there is some
- * reallocation, this value is updated.
- * \param[in,out] dst pointer to the destination string (may be reallocated).
- * \param[in]     src string to concatenate to dst.
- * \param[in,out] hwm pointer to the size of the *dst buffer (may be updated).
- */
-void osl_util_safe_strcat(char ** dst, char * src, int * hwm) {
-
-  while (strlen(*dst) + strlen(src) >= *hwm) {
-    *hwm += OSL_MAX_STRING;
-    OSL_realloc(*dst, char *, *hwm * sizeof(char));
-  }
-
-  strcat(*dst, src);
-}
-
-
-/**
- * osl_util_get_precision function:
- * this function returns the precision defined by the precision environment
- * variable or the highest available precision if it is not defined.
- * \return environment precision if defined or highest available precision.
- */
-int osl_util_get_precision() {
-  int precision = OSL_PRECISION_DP;
-  char * precision_env;
-
-#ifdef OSL_GMP_IS_HERE
-  precision = OSL_PRECISION_MP;
-#endif
-
-  precision_env = getenv(OSL_PRECISION_ENV);
-  if (precision_env != NULL) {
-    if (!strcmp(precision_env, OSL_PRECISION_ENV_SP))
-      precision = OSL_PRECISION_SP;
-    else if (!strcmp(precision_env, OSL_PRECISION_ENV_DP))
-      precision = OSL_PRECISION_DP;
-    else if (!strcmp(precision_env, OSL_PRECISION_ENV_MP))
-      precision = OSL_PRECISION_MP;
-    else
-      OSL_warning("bad precision environment value");
-  }
-
-  return precision;
-}
-
-
-/**
- * osl_util_print_provided function:
- * this function prints a "provided" boolean in a file (file, possibly stdout),
- * with a comment title according to the OpenScop specification.
- * \param[in] file     File where the information has to be printed.
- * \param[in] provided The provided boolean to print.
- * \param[in] title    A string to use as a title for the provided booblean.
- */
-void osl_util_print_provided(FILE * file, int provided, char * title) {
-  if (provided) {
-    fprintf(file, "# %s provided\n", title);
-    fprintf(file, "1\n");
-  }
-  else {
-    fprintf(file, "# %s not provided\n", title);
-    fprintf(file, "0\n\n");
-  }
-}
-
-
-/**
- * osl_util_identifier_is_here function:
- * this function returns 1 if the input "identifier" is found at the
- * "index" position in the "expression" input string, 0 otherwise.
- * \param[in] expression The input expression.
- * \param[in] identifier The identifier to look for.
- * \param[in] index      The position in the expression where to look.
- * \return 1 if the identifier is found at the position in the expression.
- */
-static
-int osl_util_identifier_is_here(char * expression, char * identifier,
-                                int index) {
-  // If there is no space enough to find the identifier: no.
-  if (strlen(identifier) + index > strlen(expression))
-    return 0;
-  
-  // If there is a character before and it is in [A-Za-z0-9]: no.
-  if ((index > 0) &&
-      (((expression[index - 1] >= 'A') && (expression[index - 1] <= 'Z')) || 
-       ((expression[index - 1] >= 'a') && (expression[index - 1] <= 'z')) || 
-       ((expression[index - 1] >= '0') && (expression[index - 1] <= '9'))))
-    return 0;
-
-  // If there is a character after and it is in [A-Za-z0-9]: no.
-  if ((strlen(identifier) + index < strlen(expression)) &&
-      (((expression[strlen(identifier) + index] >= 'A') &&
-        (expression[strlen(identifier) + index] <= 'Z'))   || 
-       ((expression[strlen(identifier) + index] >= 'a') &&
-        (expression[strlen(identifier) + index] <= 'z'))   || 
-       ((expression[strlen(identifier) + index] >= '0') &&
-        (expression[strlen(identifier) + index] <= '9'))))
-    return 0;
-
-  // If the identifier string is not here: no.
-  if (strncmp(expression + index, identifier, strlen(identifier)))
-    return 0;
-
-  return 1;
-}
-
-
-/**
- * osl_util_lazy_isolated_identifier function:
- * this function returns 1 if the identifier at the "index" position in the
- * "expression" is guaranteed not to need parenthesis around is we
- * substitute it with anything. For instance the identifier "i" can be
- * always substituted in "A[i]" with no need of parenthesis but not in
- * "A[2*i]". This function is lazy in the sense that it just check obvious
- * cases, not all of them. The identifier must already be at the indicated
- * position, this function does not check that.
- * \param[in] expression The input expression.
- * \param[in] identifier The identifier to check.
- * \param[in] index      The position of the identifier in the expression.
- * \return 1 if the identifier is isolated, 0 if unsure.
- */
-static
-int osl_util_lazy_isolated_identifier(char * expression, char * identifier,
-                                      int index) {
-  int look;
-
-  // If the first non-space character before is not in [\[(,\+=]: no. 
-  look = index - 1;
-  while (look >= 0) {
-    if (isspace(expression[look]))
-      look--;
-    else
-      break;
-  }
-
-  if ((look >= 0) &&
-      (expression[look] != '[') &&
-      (expression[look] != '(') &&
-      (expression[look] != '+') &&
-      (expression[look] != '=') &&
-      (expression[look] != ','))
-    return 0;
-        
-  // If the first non-space character after is not in [\]),;\+]: no. 
-  look = index + strlen(identifier);
-  while (look < strlen(expression)) {
-    if (isspace(expression[look]))
-      look++;
-    else
-      break;
-  }
-
-  if ((look < strlen(expression)) &&
-      (expression[look] != ']')   &&
-      (expression[look] != ')')   &&
-      (expression[look] != '+')   &&
-      (expression[look] != ',')   &&
-      (expression[look] != ';'))
-    return 0;
-
-  return 1;
-}
-
-
-/**
- * osl_util_identifier_substitution function:
- * this function replaces some identifiers in an input expression string and
- * returns the final string. The list of identifiers to replace are provided
- * as an array of strings. They are replaced from the input string with the
- * new substring "@i@" or "(@i@)" where i is the rank of the identifier in the
- * array of identifiers. The parentheses are added when it is not obvious that
- * the identifier can be replaced with an arbitrary expression without the
- * need of parentheses. For instance, let us consider the input expression
- * "C[i+j]+=A[2*i]*B[j];" and the array of strings {"i", "j"}: the resulting
- * string would be "C[@0@+@1@]+=A[2*(@0@)]*B[@1@];".
- * \param[in] expression The original expression.
- * \param[in] identifiers NULL-terminated array of identifiers.
- * \return A new string where the ith identifier is replaced by \@i\@.
- */
-char * osl_util_identifier_substitution(char * expression,
-                                        char ** identifiers) {
-  int index, j, found;
-  int high_water_mark = OSL_MAX_STRING;
-  char buffer[OSL_MAX_STRING];
-  char * string;
- 
-  OSL_malloc(string, char *, high_water_mark * sizeof(char));
-  string[0] = '\0';
-
-  index = 0;
-  while (index < strlen(expression)) {
-    j = 0;
-    found = 0;
-    while (identifiers[j] != NULL) {
-      if (osl_util_identifier_is_here(expression, identifiers[j], index)) {
-        if (osl_util_lazy_isolated_identifier(expression,identifiers[j],index))
-          sprintf(buffer, "@%d@", j);
-        else
-          sprintf(buffer, "(@%d@)", j);
-        osl_util_safe_strcat(&string, buffer, &high_water_mark);
-        index += strlen(identifiers[j]);
-        found = 1;
-        break;
-      }
-      j++;
-    }
-    if (!found) {
-      sprintf(buffer, "%c", expression[index]);
-      osl_util_safe_strcat(&string, buffer, &high_water_mark);
-      index++;
-    }
-  }
-
-  return string;
-}
-
-
-
diff --git a/cloog-0.17.0/osl/source/vector.c b/cloog-0.17.0/osl/source/vector.c
deleted file mode 100644
index b50c963..0000000
--- a/cloog-0.17.0/osl/source/vector.c
+++ /dev/null
@@ -1,367 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                           vector.c                              **
-     **-----------------------------------------------------------------**
-     **                   First version: 30/04/2008                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <ctype.h>
-
-#include <osl/macros.h>
-#include <osl/util.h>
-#include <osl/int.h>
-#include <osl/vector.h>
-
-
-/*+***************************************************************************
- *                          Structure display function                       *
- *****************************************************************************/
-
-
-/**
- * osl_vector_idump function:
- * Displays a osl_vector_t structure (*vector) into a file (file, possibly
- * stdout) in a way that trends to be understandable without falling in a deep
- * depression or, for the lucky ones, getting a headache... It includes an
- * indentation level (level) in order to work with others idump functions.
- * \param[in] file   File where informations are printed.
- * \param[in] vector The vector whose information have to be printed.
- * \param[in] level  Number of spaces before printing, for each line.
- */
-void osl_vector_idump(FILE * file, osl_vector_p vector, int level) {
-  int j;
-
-  if (vector != NULL) {
-    // Go to the right level.
-    for (j = 0; j < level; j++)
-      fprintf(file,"|\t");
-    fprintf(file,"+-- osl_vector_t (");
-    osl_int_dump_precision(file, vector->precision);
-    fprintf(file, ")\n");
-
-    for (j = 0; j <= level; j++)
-      fprintf(file,"|\t");
-    fprintf(file,"%d\n", vector->size);
-
-    // Display the vector.
-    for (j = 0; j <= level; j++)
-      fprintf(file, "|\t");
-
-    fprintf(file, "[ ");
-
-    for (j = 0; j < vector->size; j++) {
-      osl_int_print(file, vector->precision, vector->v, j);
-      fprintf(file, " ");
-    }
-
-    fprintf(file, "]\n");
-  }
-  else {
-    // Go to the right level.
-    for (j = 0; j < level; j++)
-      fprintf(file, "|\t");
-    fprintf(file, "+-- NULL vector\n");
-  }
-
-  // The last line.
-  for (j = 0; j <= level; j++)
-    fprintf(file, "|\t");
-  fprintf(file, "\n");
-}
-
-
-/**
- * osl_vector_dump function:
- * This function prints the content of a osl_vector_t structure
- * (*vector) into a file (file, possibly stdout).
- * \param[in] file   File where informations are printed.
- * \param[in] vector The vector whose information have to be printed.
- */
-void osl_vector_dump(FILE * file, osl_vector_p vector) {
-  osl_vector_idump(file, vector, 0);
-}
-
-
-/*+***************************************************************************
- *                   Memory allocation/deallocation function                 *
- *****************************************************************************/
-
-
-/**
- * osl_vector_pmalloc function:
- * (precision malloc) this function allocates the memory space for an
- * osl_vector_t structure and sets its fields with default values. Then
- * it returns a pointer to the allocated space.
- * \param[in] precision The precision of the vector entries.
- * \param[in] size      The number of entries of the vector to allocate.
- * \return A pointer to the newly allocated osl_vector_t structure.
- */
-osl_vector_p osl_vector_pmalloc(int precision, int size) {
-  osl_vector_p vector;
-  int i;
-
-  OSL_malloc(vector, osl_vector_p, sizeof(osl_vector_t));
-  vector->size = size;
-  vector->precision = precision;
-  if (size == 0) {
-    vector->v = NULL;
-  }
-  else {
-    OSL_malloc(vector->v, void *, size * osl_int_sizeof(precision));
-    for (i = 0; i < size; i++)
-      osl_int_init_set_si(precision, vector->v, i, 0);
-  }
-  return vector;
-}
-
-
-/**
- * osl_vector_malloc function:
- * This function allocates the memory space for a osl_vector_t structure
- * and sets its fields with default values. Then it returns a pointer to the
- * allocated space. The precision of the vector elements corresponds to the 
- * precision environment variable or to the highest available precision if it
- * is not defined.
- * \param[in] size      The number of entries of the vector to allocate.
- * \return A pointer to the newly allocated osl_vector_t structure.
- */
-osl_vector_p osl_vector_malloc(int size) {
-  int precision = osl_util_get_precision();
-  return osl_vector_pmalloc(precision, size);
-}
-
-
-/**
- * osl_vector_free function:
- * This function frees the allocated memory for a osl_vector_t structure.
- * \param[in] vector The pointer to the vector we want to free.
- */
-void osl_vector_free(osl_vector_p vector) {
-  int i;
-
-  if (vector != NULL) {
-    if (vector->v != NULL) {
-      for (i = 0; i < vector->size; i++)
-        osl_int_clear(vector->precision, vector->v, i);
-
-      free(vector->v);
-    }
-    free(vector);
-  }
-}
-
-
-/*+***************************************************************************
- *                           Processing functions                            *
- *****************************************************************************/
-
-
-/**
- * osl_vector_add_scalar function:
- * This function adds a scalar to the vector representation of an affine
- * expression (this means we add the scalar only to the very last entry of the
- * vector). It returns a new vector resulting from this addition.
- * \param[in] vector The basis vector.
- * \param[in] scalar The scalar to add to the vector.
- * \return A pointer to a new vector, copy of the basis one plus the scalar.
- */
-osl_vector_p osl_vector_add_scalar(osl_vector_p vector, int scalar) {
-  int i, precision, last;
-  osl_vector_p result;
-
-  if ((vector == NULL) || (vector->size < 2))
-    OSL_error("incompatible vector for addition");
-
-  precision = vector->precision;
-  last = vector->size - 1;
-
-  result = osl_vector_pmalloc(precision, vector->size);
-  for (i = 0; i < vector->size; i++)
-    osl_int_assign(precision, result->v, i, vector->v, i);
-  osl_int_add_si(precision, result->v, last, vector->v, last, scalar);
-
-  return result;
-}
-
-
-/**
- * osl_vector_add function:
- * This function achieves the addition of two vectors and returns the
- * result as a new vector (the addition means the ith entry of the new vector
- * is equal to the ith entry of vector v1 plus the ith entry of vector v2).
- * \param v1 The first vector for the addition.
- * \param v2 The second vector for the addition.
- * \return A pointer to a new vector, corresponding to v1 + v2.
- */
-osl_vector_p osl_vector_add(osl_vector_p v1, osl_vector_p v2) {
-  int i;
-  osl_vector_p v3;
-
-  if ((v1 == NULL) || (v2 == NULL) ||
-      (v1->size != v2->size) || (v1->precision != v2->precision))
-    OSL_error("incompatible vectors for addition");
-
-  v3 = osl_vector_pmalloc(v1->precision, v1->size);
-  for (i = 0; i < v1->size; i++)
-    osl_int_add(v1->precision, v3->v, i, v1->v, i, v2->v, i);
-
-  return v3;
-}
-
-
-/**
- * osl_vector_sub function:
- * This function achieves the subtraction of two vectors and returns the
- * result as a new vector (the addition means the ith entry of the new vector
- * is equal to the ith entry of vector v1 minus the ith entry of vector v2).
- * \param v1 The first vector for the subtraction.
- * \param v2 The second vector for the subtraction (result is v1-v2).
- * \return A pointer to a new vector, corresponding to v1 - v2.
- */
-osl_vector_p osl_vector_sub(osl_vector_p v1, osl_vector_p v2) {
-  int i;
-  osl_vector_p v3;
-
-  if ((v1 == NULL) || (v2 == NULL) ||
-      (v1->size != v2->size) || (v1->precision != v2->precision))
-    OSL_error("incompatible vectors for subtraction");
-
-  v3 = osl_vector_pmalloc(v1->precision, v1->size);
-  for (i = 0; i < v1->size; i++)
-    osl_int_sub(v1->precision, v3->v, i, v1->v, i, v2->v, i);
-
-  return v3;
-}
-
-
-/**
- * osl_vector_tag_inequality function:
- * This function tags a vector representation of a contraint as being an
- * inequality >=0. This means in the PolyLib format, to set to 1 the very
- * first entry of the vector. It modifies directly the vector provided as
- * an argument.
- * \param vector The vector to be tagged.
- */
-void osl_vector_tag_inequality(osl_vector_p vector) {
-  if ((vector == NULL) || (vector->size < 1))
-    OSL_error("vector cannot be tagged");
-  osl_int_set_si(vector->precision, vector->v, 0, 1);
-}
-
-
-/**
- * osl_vector_tag_equality function:
- * This function tags a vector representation of a contraint as being an
- * equality ==0. This means in the PolyLib format, to set to 0 the very
- * first entry of the vector. It modifies directly the vector provided as
- * an argument.
- * \param vector The vector to be tagged.
- */
-void osl_vector_tag_equality(osl_vector_p vector) {
-  if ((vector == NULL) || (vector->size < 1))
-    OSL_error("vector cannot be tagged");
-  osl_int_set_si(vector->precision, vector->v, 0, 0);
-}
-
-
-/**
- * osl_vector_equal function:
- * this function returns true if the two vectors are the same, false
- * otherwise.
- * \param v1 The first vector.
- * \param v2 The second vector.
- * \return 1 if v1 and v2 are the same (content-wise), 0 otherwise.
- */
-int osl_vector_equal(osl_vector_p v1, osl_vector_p v2) {
-  int i;
-
-  if (v1 == v2)
-    return 1;
-
-  if ((v1->size != v2->size) || (v1->precision != v2->precision))
-    return 0;
-
-  for (i = 0; i < v1->size; i++)
-    if (osl_int_ne(v1->precision, v1->v, i, v2->v, i))
-      return 0;
-
-  return 1;
-}
-
-
-/**
- * osl_vector_mul_scalar function:
- * this function returns a new vector corresponding to the one provided
- * as parameter with each entry multiplied by a scalar.
- * \param v      The vector to multiply.
- * \param scalar The scalar coefficient.
- * \return A new vector corresponding to scalar * v.
- */
-osl_vector_p osl_vector_mul_scalar(osl_vector_p v, int scalar) {
-  int i;
-  osl_vector_p result = osl_vector_pmalloc(v->precision, v->size);
-  
-  for(i = 0; i < v->size; i++)
-    osl_int_mul_si(v->precision, result->v, i, v->v, i, scalar);
-
-  return result;
-}
-
diff --git a/cloog-0.17.0/osl/tests/Makefile.am b/cloog-0.17.0/osl/tests/Makefile.am
deleted file mode 100644
index eca952e..0000000
--- a/cloog-0.17.0/osl/tests/Makefile.am
+++ /dev/null
@@ -1,100 +0,0 @@
-#
-#   /*+------------------------------------------------------------------**
-#    **                       OpenScop Library                           **
-#    **------------------------------------------------------------------**
-#    **                         makefile.am                              **
-#    **------------------------------------------------------------------**
-#    **                   First version: 01/10/2010                      **
-#    **------------------------------------------------------------------**
-#
-#   
-# ***************************************************************************
-# * OpenScop: Structures and formats for polyhedral tools to talk together  *
-# ***************************************************************************
-# *   ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,               *
-# *   /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,            *
-# *  /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\            *
-# * |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \           *
-# * | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\          *
-# * | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\         *
-# * | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \        *
-# * | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \       *
-# * | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \      *
-# * | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \     *
-# * | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \    *
-# * | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \   *
-# * | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \  *
-# * | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /  *
-# * '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'   *
-# *                                                                         *
-# * Copyright (C) 2008 University Paris-Sud 11 and INRIA                    *
-# *                                                                         *
-# * (3-clause BSD license)                                                  *
-# * Redistribution and use in source  and binary forms, with or without     *
-# * modification, are permitted provided that the following conditions      *
-# * are met:                                                                *
-# *                                                                         *
-# * 1. Redistributions of source code must retain the above copyright       *
-# *    notice, this list of conditions and the following disclaimer.        *
-# * 2. Redistributions in binary form must reproduce the above copyright    *
-# *    notice, this list of conditions and the following disclaimer in the  *
-# *    documentation and/or other materials provided with the distribution. *
-# * 3. The name of the author may not be used to endorse or promote         *
-# *    products derived from this software without specific prior written   *
-# *    permission.                                                          *
-# *                                                                         *
-# * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR    *
-# * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED          *
-# * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  *
-# * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,      *
-# * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES      *
-# * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR      *
-# * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)      *
-# * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,     *
-# * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING   *
-# * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE      *
-# * POSSIBILITY OF SUCH DAMAGE.                                             *
-# *                                                                         *
-# * OpenScop Library, a library to manipulate OpenScop formats and data     *
-# * structures. Written by:                                                 *
-# * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                       *
-# * Louis-Noel Pouchet <Louis-Noel.Pouchet@inria.fr>                        *
-# *                                                                         *
-# ***************************************************************************/
-#
-# Makefile.am (or makefile if generated) of the OpenScop Library.
-# Makefile.am is not a makefile, you must run the 'autogen.sh' THEN the
-# configure shellscript to generate the Makefile thanks to this file.
-
-
-#############################################################################
-SUBDIRS			=
-
-#############################################################################
-MAINTAINERCLEANFILES	= Makefile.in
-
-#############################################################################
-
-noinst_PROGRAMS = osl_test
-
-TESTS = osl_test
-
-osl_test_CPPFLAGS = -I$(top_srcdir)/include -static
-
-osl_test_LDFLAGS  = -L$(top_srcdir)/source
-
-osl_test_LDADD    = -losl
-
-osl_test_SOURCES  =                 \
-	osl_test.c                  \
-	polynom.scop                \
-	test_empty_statement.scop   \
-	test_just_access.scop       \
-	test_just_body.scop         \
-	test_just_domain.scop       \
-	test_just_scattering.scop   \
-	test_matmult.scop           \
-	test_no_statement.scop      \
-	test_scop_list.scop
-
-
diff --git a/cloog-0.17.0/osl/tests/Makefile.in b/cloog-0.17.0/osl/tests/Makefile.in
deleted file mode 100644
index e8e8798..0000000
--- a/cloog-0.17.0/osl/tests/Makefile.in
+++ /dev/null
@@ -1,826 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-#
-#   /*+------------------------------------------------------------------**
-#    **                       OpenScop Library                           **
-#    **------------------------------------------------------------------**
-#    **                         makefile.am                              **
-#    **------------------------------------------------------------------**
-#    **                   First version: 01/10/2010                      **
-#    **------------------------------------------------------------------**
-#
-#   
-# ***************************************************************************
-# * OpenScop: Structures and formats for polyhedral tools to talk together  *
-# ***************************************************************************
-# *   ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,               *
-# *   /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,            *
-# *  /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\            *
-# * |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \           *
-# * | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\          *
-# * | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\         *
-# * | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \        *
-# * | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \       *
-# * | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \      *
-# * | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \     *
-# * | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \    *
-# * | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \   *
-# * | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \  *
-# * | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /  *
-# * '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'   *
-# *                                                                         *
-# * Copyright (C) 2008 University Paris-Sud 11 and INRIA                    *
-# *                                                                         *
-# * (3-clause BSD license)                                                  *
-# * Redistribution and use in source  and binary forms, with or without     *
-# * modification, are permitted provided that the following conditions      *
-# * are met:                                                                *
-# *                                                                         *
-# * 1. Redistributions of source code must retain the above copyright       *
-# *    notice, this list of conditions and the following disclaimer.        *
-# * 2. Redistributions in binary form must reproduce the above copyright    *
-# *    notice, this list of conditions and the following disclaimer in the  *
-# *    documentation and/or other materials provided with the distribution. *
-# * 3. The name of the author may not be used to endorse or promote         *
-# *    products derived from this software without specific prior written   *
-# *    permission.                                                          *
-# *                                                                         *
-# * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR    *
-# * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED          *
-# * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  *
-# * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,      *
-# * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES      *
-# * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR      *
-# * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)      *
-# * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,     *
-# * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING   *
-# * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE      *
-# * POSSIBILITY OF SUCH DAMAGE.                                             *
-# *                                                                         *
-# * OpenScop Library, a library to manipulate OpenScop formats and data     *
-# * structures. Written by:                                                 *
-# * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                       *
-# * Louis-Noel Pouchet <Louis-Noel.Pouchet@inria.fr>                        *
-# *                                                                         *
-# ***************************************************************************/
-#
-# Makefile.am (or makefile if generated) of the OpenScop Library.
-# Makefile.am is not a makefile, you must run the 'autogen.sh' THEN the
-# configure shellscript to generate the Makefile thanks to this file.
-
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-noinst_PROGRAMS = osl_test$(EXEEXT)
-TESTS = osl_test$(EXEEXT)
-subdir = tests
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/autoconf/libtool.m4 \
-	$(top_srcdir)/autoconf/ltoptions.m4 \
-	$(top_srcdir)/autoconf/ltsugar.m4 \
-	$(top_srcdir)/autoconf/ltversion.m4 \
-	$(top_srcdir)/autoconf/lt~obsolete.m4 \
-	$(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-PROGRAMS = $(noinst_PROGRAMS)
-am_osl_test_OBJECTS = osl_test-osl_test.$(OBJEXT)
-osl_test_OBJECTS = $(am_osl_test_OBJECTS)
-osl_test_DEPENDENCIES =
-osl_test_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(osl_test_LDFLAGS) \
-	$(LDFLAGS) -o $@
-DEFAULT_INCLUDES = -I.@am__isrc@
-depcomp = $(SHELL) $(top_srcdir)/autoconf/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-SOURCES = $(osl_test_SOURCES)
-DIST_SOURCES = $(osl_test_SOURCES)
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-dvi-recursive install-exec-recursive \
-	install-html-recursive install-info-recursive \
-	install-pdf-recursive install-ps-recursive install-recursive \
-	installcheck-recursive installdirs-recursive pdf-recursive \
-	ps-recursive uninstall-recursive
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
-  distclean-recursive maintainer-clean-recursive
-AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
-	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
-	distdir
-ETAGS = etags
-CTAGS = ctags
-am__tty_colors = \
-red=; grn=; lgn=; blu=; std=
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CD = @CD@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DOXYGEN = @DOXYGEN@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_aux_dir = @ac_aux_dir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-
-#############################################################################
-SUBDIRS = 
-
-#############################################################################
-MAINTAINERCLEANFILES = Makefile.in
-osl_test_CPPFLAGS = -I$(top_srcdir)/include -static
-osl_test_LDFLAGS = -L$(top_srcdir)/source
-osl_test_LDADD = -losl
-osl_test_SOURCES = \
-	osl_test.c                  \
-	polynom.scop                \
-	test_empty_statement.scop   \
-	test_just_access.scop       \
-	test_just_body.scop         \
-	test_just_domain.scop       \
-	test_just_scattering.scop   \
-	test_matmult.scop           \
-	test_no_statement.scop      \
-	test_scop_list.scop
-
-all: all-recursive
-
-.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign tests/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-clean-noinstPROGRAMS:
-	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
-	echo " rm -f" $$list; \
-	rm -f $$list || exit $$?; \
-	test -n "$(EXEEXT)" || exit 0; \
-	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
-	echo " rm -f" $$list; \
-	rm -f $$list
-osl_test$(EXEEXT): $(osl_test_OBJECTS) $(osl_test_DEPENDENCIES) 
-	@rm -f osl_test$(EXEEXT)
-	$(osl_test_LINK) $(osl_test_OBJECTS) $(osl_test_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osl_test-osl_test.Po@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c $<
-
-.c.obj:
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.c.lo:
-@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
-
-osl_test-osl_test.o: osl_test.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(osl_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT osl_test-osl_test.o -MD -MP -MF $(DEPDIR)/osl_test-osl_test.Tpo -c -o osl_test-osl_test.o `test -f 'osl_test.c' || echo '$(srcdir)/'`osl_test.c
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/osl_test-osl_test.Tpo $(DEPDIR)/osl_test-osl_test.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='osl_test.c' object='osl_test-osl_test.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(osl_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o osl_test-osl_test.o `test -f 'osl_test.c' || echo '$(srcdir)/'`osl_test.c
-
-osl_test-osl_test.obj: osl_test.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(osl_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT osl_test-osl_test.obj -MD -MP -MF $(DEPDIR)/osl_test-osl_test.Tpo -c -o osl_test-osl_test.obj `if test -f 'osl_test.c'; then $(CYGPATH_W) 'osl_test.c'; else $(CYGPATH_W) '$(srcdir)/osl_test.c'; fi`
-@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/osl_test-osl_test.Tpo $(DEPDIR)/osl_test-osl_test.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='osl_test.c' object='osl_test-osl_test.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(osl_test_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o osl_test-osl_test.obj `if test -f 'osl_test.c'; then $(CYGPATH_W) 'osl_test.c'; else $(CYGPATH_W) '$(srcdir)/osl_test.c'; fi`
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-$(RECURSIVE_CLEAN_TARGETS):
-	@fail= failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-check-TESTS: $(TESTS)
-	@failed=0; all=0; xfail=0; xpass=0; skip=0; \
-	srcdir=$(srcdir); export srcdir; \
-	list=' $(TESTS) '; \
-	$(am__tty_colors); \
-	if test -n "$$list"; then \
-	  for tst in $$list; do \
-	    if test -f ./$$tst; then dir=./; \
-	    elif test -f $$tst; then dir=; \
-	    else dir="$(srcdir)/"; fi; \
-	    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
-	      all=`expr $$all + 1`; \
-	      case " $(XFAIL_TESTS) " in \
-	      *[\ \	]$$tst[\ \	]*) \
-		xpass=`expr $$xpass + 1`; \
-		failed=`expr $$failed + 1`; \
-		col=$$red; res=XPASS; \
-	      ;; \
-	      *) \
-		col=$$grn; res=PASS; \
-	      ;; \
-	      esac; \
-	    elif test $$? -ne 77; then \
-	      all=`expr $$all + 1`; \
-	      case " $(XFAIL_TESTS) " in \
-	      *[\ \	]$$tst[\ \	]*) \
-		xfail=`expr $$xfail + 1`; \
-		col=$$lgn; res=XFAIL; \
-	      ;; \
-	      *) \
-		failed=`expr $$failed + 1`; \
-		col=$$red; res=FAIL; \
-	      ;; \
-	      esac; \
-	    else \
-	      skip=`expr $$skip + 1`; \
-	      col=$$blu; res=SKIP; \
-	    fi; \
-	    echo "$${col}$$res$${std}: $$tst"; \
-	  done; \
-	  if test "$$all" -eq 1; then \
-	    tests="test"; \
-	    All=""; \
-	  else \
-	    tests="tests"; \
-	    All="All "; \
-	  fi; \
-	  if test "$$failed" -eq 0; then \
-	    if test "$$xfail" -eq 0; then \
-	      banner="$$All$$all $$tests passed"; \
-	    else \
-	      if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
-	      banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
-	    fi; \
-	  else \
-	    if test "$$xpass" -eq 0; then \
-	      banner="$$failed of $$all $$tests failed"; \
-	    else \
-	      if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
-	      banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
-	    fi; \
-	  fi; \
-	  dashes="$$banner"; \
-	  skipped=""; \
-	  if test "$$skip" -ne 0; then \
-	    if test "$$skip" -eq 1; then \
-	      skipped="($$skip test was not run)"; \
-	    else \
-	      skipped="($$skip tests were not run)"; \
-	    fi; \
-	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
-	      dashes="$$skipped"; \
-	  fi; \
-	  report=""; \
-	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
-	    report="Please report to $(PACKAGE_BUGREPORT)"; \
-	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
-	      dashes="$$report"; \
-	  fi; \
-	  dashes=`echo "$$dashes" | sed s/./=/g`; \
-	  if test "$$failed" -eq 0; then \
-	    echo "$$grn$$dashes"; \
-	  else \
-	    echo "$$red$$dashes"; \
-	  fi; \
-	  echo "$$banner"; \
-	  test -z "$$skipped" || echo "$$skipped"; \
-	  test -z "$$report" || echo "$$report"; \
-	  echo "$$dashes$$std"; \
-	  test "$$failed" -eq 0; \
-	else :; fi
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test -d "$(distdir)/$$subdir" \
-	    || $(MKDIR_P) "$(distdir)/$$subdir" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-	    $(am__relativize); \
-	    new_distdir=$$reldir; \
-	    dir1=$$subdir; dir2="$(top_distdir)"; \
-	    $(am__relativize); \
-	    new_top_distdir=$$reldir; \
-	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-	    ($(am__cd) $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$new_top_distdir" \
-	        distdir="$$new_distdir" \
-		am__remove_distdir=: \
-		am__skip_length_check=: \
-		am__skip_mode_fix=: \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
-check: check-recursive
-all-am: Makefile $(PROGRAMS)
-installdirs: installdirs-recursive
-installdirs-am:
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
-	mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) check-am \
-	ctags-recursive install-am install-strip tags-recursive
-
-.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
-	all all-am check check-TESTS check-am clean clean-generic \
-	clean-libtool clean-noinstPROGRAMS ctags ctags-recursive \
-	distclean distclean-compile distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-ps install-ps-am install-strip installcheck \
-	installcheck-am installdirs installdirs-am maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags tags-recursive uninstall uninstall-am
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/cloog-0.17.0/osl/tests/osl_test.c b/cloog-0.17.0/osl/tests/osl_test.c
deleted file mode 100644
index 3cfbd08..0000000
--- a/cloog-0.17.0/osl/tests/osl_test.c
+++ /dev/null
@@ -1,247 +0,0 @@
-
-    /*+-----------------------------------------------------------------**
-     **                       OpenScop Library                          **
-     **-----------------------------------------------------------------**
-     **                            test.c                               **
-     **-----------------------------------------------------------------**
-     **                   First version: 01/10/2010                     **
-     **-----------------------------------------------------------------**
-
- 
- *****************************************************************************
- * OpenScop: Structures and formats for polyhedral tools to talk together    *
- *****************************************************************************
- *    ,___,,_,__,,__,,__,,__,,_,__,,_,__,,__,,___,_,__,,_,__,                *
- *    /   / /  //  //  //  // /   / /  //  //   / /  // /  /|,_,             *
- *   /   / /  //  //  //  // /   / /  //  //   / /  // /  / / /\             *
- *  |~~~|~|~~~|~~~|~~~|~~~|~|~~~|~|~~~|~~~|~~~|~|~~~|~|~~~|/_/  \            *
- *  | G |C| P | = | L | P |=| = |C| = | = | = |=| = |=| C |\  \ /\           *
- *  | R |l| o | = | e | l |=| = |a| = | = | = |=| = |=| L | \# \ /\          *
- *  | A |a| l | = | t | u |=| = |n| = | = | = |=| = |=| o | |\# \  \         *
- *  | P |n| l | = | s | t |=| = |d| = | = | = | |   |=| o | | \# \  \        *
- *  | H | | y |   | e | o | | = |l|   |   | = | |   | | G | |  \  \  \       *
- *  | I | |   |   | e |   | |   | |   |   |   | |   | |   | |   \  \  \      *
- *  | T | |   |   |   |   | |   | |   |   |   | |   | |   | |    \  \  \     *
- *  | E | |   |   |   |   | |   | |   |   |   | |   | |   | |     \  \  \    *
- *  | * |*| * | * | * | * |*| * |*| * | * | * |*| * |*| * | /      \* \  \   *
- *  | O |p| e | n | S | c |o| p |-| L | i | b |r| a |r| y |/        \  \ /   *
- *  '---'-'---'---'---'---'-'---'-'---'---'---'-'---'-'---'          '--'    *
- *                                                                           *
- * Copyright (C) 2008 University Paris-Sud 11 and INRIA                      *
- *                                                                           *
- * (3-clause BSD license)                                                    *
- * Redistribution and use in source  and binary forms, with or without       *
- * modification, are permitted provided that the following conditions        *
- * are met:                                                                  *
- *                                                                           *
- * 1. Redistributions of source code must retain the above copyright notice, *
- *    this list of conditions and the following disclaimer.                  *
- * 2. Redistributions in binary form must reproduce the above copyright      *
- *    notice, this list of conditions and the following disclaimer in the    *
- *    documentation and/or other materials provided with the distribution.   *
- * 3. The name of the author may not be used to endorse or promote products  *
- *    derived from this software without specific prior written permission.  *
- *                                                                           *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
- *                                                                           *
- * OpenScop Library, a library to manipulate OpenScop formats and data       *
- * structures. Written by:                                                   *
- * Cedric Bastoul     <Cedric.Bastoul@u-psud.fr> and                         *
- * Louis-Noel Pouchet <Louis-Noel.Pouchet@inria.fr>                          *
- *                                                                           *
- *****************************************************************************/
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <dirent.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/wait.h>
-#include <osl/osl.h>
-
-//#define FORK                 // Comment that if you want only one process
-                             // (best for debugging with valgrind but bad
-                             // for make check since any error will
-                             // stop the job).
-
-#define TEST_DIR    "."      // Directory to scan for OpenScop files
-#define TEST_SUFFIX ".scop"  // Suffix of OpenScop files
-
-
-/**
- * test_file function
- * This function tests an onpenscop file. A test has six steps:
- * 1. read the file to raise the data up to OpenScop data structures,
- * 2. clone the data structures,
- * 3. compare the clone and the original one,
- * 4. dump the data structures to a new OpenScop file,
- * 5. read the generated file,
- * 6. compare the data structures.
- * If everything went well, the data structure of the two scops are the same.
- * \param input_name The name of the input file.
- * \param verbose    Verbose option (1 to set, 0 not to set).
- * \return 1 if the test is successful, 0 otherwise.
- */
-int test_file(char * input_name, int verbose) {
-  int success = 0;
-  int failure = 0;
-  int cloning = 0;
-  int dumping = 0;
-  int equal   = 0;
-  char * output_name;
-  FILE * input_file, * output_file;
-  osl_scop_p input_scop;
-  osl_scop_p output_scop;
-  osl_scop_p cloned_scop;
-
-  printf("\nTesting file %s... \n", input_name); 
-    
-  // PART I. Raise from file.
-  input_file = fopen(input_name, "r");
-  if (input_file == NULL) {
-    fflush(stdout);
-    fprintf(stderr, "\nError: unable to open file %s\n", input_name);
-    exit(2);
-  }
-  input_scop = osl_scop_read(input_file);
-  fclose(input_file);
-
-  // PART II. Clone and test.
-  cloned_scop = osl_scop_clone(input_scop);
-  // Compare the two scops.
-  if (cloning = osl_scop_equal(input_scop, cloned_scop))
-    printf("- cloning succeeded\n");
-  else
-    printf("- cloning failed\n");
-
-  // PART III. Dump to file and test.
-  output_name = tmpnam(NULL);
-  output_file = fopen(output_name, "w");
-  //osl_scop_dump(stdout, input_scop);
-  //osl_scop_print(stdout, input_scop);
-  osl_scop_print(output_file, input_scop);
-  fclose(output_file);
-  
-  // Raise the generated file to data structures.
-  output_file = fopen(output_name, "r");
-  output_scop = osl_scop_read(output_file);
-  //osl_scop_dump(stdout, output_scop);
-  fclose(output_file);
-
-  if (verbose) {
-    printf("\n\n*************************************************\n\n");
-    osl_scop_dump(stdout, output_scop);
-    osl_scop_print(stdout, output_scop);
-    printf("\n*************************************************\n\n");
-  }
-
-  // Compare the two scops.
-  if (dumping = osl_scop_equal(input_scop, output_scop))
-    printf("- dumping succeeded\n");
-  else
-    printf("- dumping failed\n");
-
-  // PART IV. Report.
-  if (equal = (cloning + dumping > 0) ? 1 : 0)
-    printf("Success :-)\n");
-  else
-    printf("Failure :-(\n");
-
-  // Save the planet.
-  osl_scop_free(input_scop);
-  osl_scop_free(cloned_scop);
-  osl_scop_free(output_scop);
-  remove(output_name);
-
-  return equal;
-}
-
-
-/**
- * OpenScop test program.
- * Usage: osl_test [-v] [osl_file]
- * This program scans a directory for openscop files and test each of them.
- * Optionnally the user can provide a file name to check this file only. A
- * verbose option is also provided to output more information during tests.
- */
-int main(int argc, char * argv[]) {
-  int total   = 0; // Total number of tests.
-  int success = 0; // Number of successes.
-  int verbose = 0; // 1 if the verbose option is set, 0 otherwise.
-  int dirtest = 1; // 1 if we check a whole directory, 0 for a single file.
-  int fileidx = 0; // Index of the file to check in argv (0 if none).
-  int d_namlen;
-  int suffix_length;
-  DIR * dir;
-  struct dirent * dp;
-
-  // Process the command line information
-  if (((argc > 1) && (!strcmp(argv[1], "-v"))) ||
-      ((argc > 2) && (!strcmp(argv[2], "-v"))))
-    verbose = 1;
-
-  if ((argc > 3) || ((argc == 3) && (!verbose))) {
-    fprintf(stderr, "usage: osl_test [-v] [osl_file]\n");
-    exit(1); 
-  }
-
-  if ((argc - verbose) > 1) {
-    dirtest = 0;
-    fileidx = (!strcmp(argv[1], "-v")) ? 2 : 1;
-  }
-
-  // Proceed with the test(s), either directory or single file
-  if (dirtest) {
-    suffix_length = strlen(TEST_SUFFIX);
-    
-    // For each file in the directory to check...
-    dir = opendir(TEST_DIR);
-    while ((dp = readdir(dir)) != NULL) {
-      d_namlen = strlen(dp->d_name);
-      // If the file has the convenient suffix...
-      if ((d_namlen > suffix_length) &&
-          (!strcmp(dp->d_name+(d_namlen-suffix_length), TEST_SUFFIX))) {
-        // Test it !
-#ifdef FORK
-        int report;
-        if (!fork())
-          exit(test_file(dp->d_name, verbose) ? 0 : 1);
-        wait(&report);
-        if (!WEXITSTATUS(report))
-          success++;
-#else
-        success += test_file(dp->d_name, verbose);
-#endif
-        total++;
-      }
-    }
-    closedir(dir);
-  }
-  else {
-    success = test_file(argv[fileidx], verbose);
-    total++;
-  }
-
-  printf("\n  +-----------------------+\n");
-  printf("  | OpenScop Test Summary |\n");
-  printf("  |-----------------------|\n");
-  printf("  | total          %4d   |\n", total);
-  printf("  | success(es)    %4d   |\n", success);
-  printf("  | failure(s)     %4d   |\n", total - success);
-  printf("  +-----------------------+\n\n");
-
-  // Return 0 if all tests were successful, 1 otherwise.
-  if (total - success)
-    return 1;
-  else
-    return 0;
-}
diff --git a/cloog-0.17.0/osl/tests/polynom.scop b/cloog-0.17.0/osl/tests/polynom.scop
deleted file mode 100644
index 26db5d8..0000000
--- a/cloog-0.17.0/osl/tests/polynom.scop
+++ /dev/null
@@ -1,134 +0,0 @@
-#                                                     
-#          <|                                         
-#           A                                         
-#          /.\                                       
-#     <|  [""M#                                     
-#      A   | #            Clan McCloog Castle         
-#     /.\ [""M#           [Generated by the OpenScop Library 0.3.0 64 bits]
-#    [""M# | #  U"U#U                              
-#     | #  | #  \ .:/                                
-#     | #  | #___| #                                  
-#     | "--'     .-"                                
-#   |"-"-"-"-"-#-#-##                            
-#   |     # ## ######                                 
-#    \       .::::'/                                 
-#     \      ::::'/                                  
-#   :8a|    # # ##                                    
-#   ::88a      ###                                    
-#  ::::888a  8a ##::.                                 
-#  ::::::888a88a[]::::                                
-# :::::::::SUNDOGa8a::::. ..                          
-# :::::8::::888:Y8888:::::::::...                     
-#::':::88::::888::Y88a______________________________________________________
-#:: ::::88a::::88a:Y88a                                  __---__-- __
-#' .: ::Y88a:::::8a:Y88a                            __----_-- -------_-__
-#  :' ::::8P::::::::::88aa.                   _ _- --  --_ --- __  --- __--
-#.::  :::::::::::::::::::Y88as88a...s88aa.
-
-<OpenScop>
-
-# =============================================== Global
-# Language
-C
-
-# Context
-CONTEXT
-1 3 0 0 0 1
-# e/i  N   1
-   1   1   3
-
-# Parameter names are provided
-1
-# Parameter names
-<strings>
-N
-</strings>
-
-# Number of statements
-1
-
-# =============================================== Statement 1
-# Number of relations describing the statement
-6
-
-# ----------------------------------------------  1.1 Domain
-DOMAIN
-2
-4 5 2 0 0 1
-# e/i   i    j    N    1
-   1    1    0    0    0    ## i >= 0
-   1   -1    0    1   -1    ## -i+N-1 >= 0
-   1    0    1    0    0    ## j >= 0
-   1    0   -1    1   -1    ## -j+N-1 >= 0
-5 5 2 0 0 1
-# e/i   i    j    N    1
-   1    1    0    0    0    ## i >= 0
-   1   -1    0    1   -1    ## -i+N-1 >= 0
-   1    0    1    0    0    ## j >= 0
-   1    0   -1    1   -1    ## -j+N-1 >= 0
-   1    0   -1    1   -1    ## -j+N-1 >= 0
-
-# ----------------------------------------------  1.2 Scattering
-SCATTERING
-5 10 5 2 0 1
-# e/i  s1   s2   s3   s4   s5    i    j    N    1
-   0   -1    0    0    0    0    0    0    0    0    ## 0
-   0    0   -1    0    0    0    1    0    0    0    ## i
-   0    0    0   -1    0    0    0    0    0    0    ## 0
-   0    0    0    0   -1    0    0    1    0    0    ## j
-   0    0    0    0    0   -1    0    0    0    0    ## 0
-
-# ----------------------------------------------  1.3 Access
-READ
-2 7 2 2 0 1
-# e/i  Arr  [1]   i    j    N    1
-   0   -1    0    0    0    0    1    ## C[i+j]
-   0    0   -1    1    1    0    0    ##
-
-READ
-2 7 2 2 0 1
-# e/i  Arr  [1]   i    j    N    1
-   0   -1    0    0    0    0    2    ## A[i]
-   0    0   -1    1    0    0    0    ##
-
-READ
-2 7 2 2 0 1
-# e/i  Arr  [1]   i    j    N    1
-   0   -1    0    0    0    0    3    ## B[j]
-   0    0   -1    0    1    0    0    ##
-
-WRITE
-2 7 2 2 0 1
-# e/i  Arr  [1]   i    j    N    1
-   0   -1    0    0    0    0    1    ## C[i+j]
-   0    0   -1    1    1    0    0    ##
-
-# ----------------------------------------------  1.4 Body
-# Statement body is provided
-1
-
-<body>
-# Number of original iterators
-2
-# Original iterator names
-i j 
-# Statement body
-C[i+j]+=A[i]*B[j];
-</body>
-
-# =============================================== Options
-<arrays>
-3
-1 C
-2 A
-3 B
-</arrays>
-
-<comment>
-hello, world
-
-HELLO WORLD I SAID
-</comment>
-
-</OpenScop>
-
diff --git a/cloog-0.17.0/osl/tests/test_empty_statement.scop b/cloog-0.17.0/osl/tests/test_empty_statement.scop
deleted file mode 100644
index a7aba60..0000000
--- a/cloog-0.17.0/osl/tests/test_empty_statement.scop
+++ /dev/null
@@ -1,35 +0,0 @@
-<OpenScop>
-
-# =============================================== Global
-# Language
-C
-
-# Context
-CONTEXT
-0 2 0 0 0 0
-
-# Parameter names are not provided
-0
-
-# One statement
-1
-
-# =============================================== Statement 1
-# Number of relations describing the statement
-0
-
-# ----------------------------------------------  1.1 Domain
-# NULL Domain
-
-# ----------------------------------------------  1.2 Scattering
-# NULL Scattering
-
-# ----------------------------------------------  1.3 Access
-# NULL Access
-
-# ----------------------------------------------  1.4 Body
-# Statement body is not provided
-0
-
-</OpenScop>
-
diff --git a/cloog-0.17.0/osl/tests/test_just_access.scop b/cloog-0.17.0/osl/tests/test_just_access.scop
deleted file mode 100644
index 999a8eb..0000000
--- a/cloog-0.17.0/osl/tests/test_just_access.scop
+++ /dev/null
@@ -1,38 +0,0 @@
-<OpenScop>
-
-# =============================================== Global
-# Language
-C
-
-# Context
-CONTEXT
-0 2 0 0 0 0
-
-# Parameter names are not provided
-0
-
-# One statement
-1
-
-# =============================================== Statement 1
-# Number of relations describing the statement
-1
-
-# ----------------------------------------------  1.1 Domain
-# NULL Domain
-
-# ----------------------------------------------  1.2 Scattering
-# NULL Scattering
-
-# ----------------------------------------------  1.3 Access
-WRITE
-1 3 1 0 0 0
-# e/i Arr  1
-   0  -1   1
-
-# ----------------------------------------------  1.4 Body
-# Statement body is not provided
-0
-
-</OpenScop>
-
diff --git a/cloog-0.17.0/osl/tests/test_just_body.scop b/cloog-0.17.0/osl/tests/test_just_body.scop
deleted file mode 100644
index 6829a3c..0000000
--- a/cloog-0.17.0/osl/tests/test_just_body.scop
+++ /dev/null
@@ -1,41 +0,0 @@
-<OpenScop>
-
-# =============================================== Global
-# Language
-C
-
-# Context
-CONTEXT
-0 2 0 0 0 0
-
-# Parameter names are not provided
-0
-
-# One statement
-1
-
-# =============================================== Statement 1
-# Number of relations describing the statement
-0
-
-# ----------------------------------------------  1.1 Domain
-# NULL Domain
-
-# ----------------------------------------------  1.2 Scattering
-# NULL Scattering
-
-# ----------------------------------------------  1.3 Access
-# NULL Access
-
-# ----------------------------------------------  1.4 Body
-# Statement body is provided
-1
-<body>
-# Number of original iterators
-0
-# Statement body
-foo = bar;
-</body>
-
-</OpenScop>
-
diff --git a/cloog-0.17.0/osl/tests/test_just_domain.scop b/cloog-0.17.0/osl/tests/test_just_domain.scop
deleted file mode 100644
index 8862535..0000000
--- a/cloog-0.17.0/osl/tests/test_just_domain.scop
+++ /dev/null
@@ -1,37 +0,0 @@
-<OpenScop>
-
-# =============================================== Global
-# Language
-C
-
-# Context
-CONTEXT
-0 2 0 0 0 0
-
-# Parameter names are not provided
-0
-
-# One statement
-1
-
-# =============================================== Statement 1
-# Number of relations describing the statement
-1
-
-# ----------------------------------------------  1.1 Domain
-DOMAIN
-0 2 0 0 0 0
-
-# ----------------------------------------------  1.2 Scattering
-# NULL Scattering
-
-# ----------------------------------------------  1.3 Access
-# NULL Access
-
-# ----------------------------------------------  1.4 Body
-# Statement body is not provided
-0
-
-</OpenScop>
-
-
diff --git a/cloog-0.17.0/osl/tests/test_just_scattering.scop b/cloog-0.17.0/osl/tests/test_just_scattering.scop
deleted file mode 100644
index 15c9b87..0000000
--- a/cloog-0.17.0/osl/tests/test_just_scattering.scop
+++ /dev/null
@@ -1,36 +0,0 @@
-<OpenScop>
-
-# =============================================== Global
-# Language
-C
-
-# Context
-CONTEXT
-0 2 0 0 0 0
-
-# Parameter names are not provided
-0
-
-# One statement
-1
-
-# =============================================== Statement 1
-# Number of relations describing the statement
-1
-
-# ----------------------------------------------  1.1 Domain
-# NULL Domain
-
-# ----------------------------------------------  1.2 Scattering
-SCATTERING
-0 2 0 0 0 0
-
-# ----------------------------------------------  1.3 Access
-# NULL Access
-
-# ----------------------------------------------  1.4 Body
-# Statement body is not provided
-0
-
-</OpenScop>
-
diff --git a/cloog-0.17.0/osl/tests/test_matmult.scop b/cloog-0.17.0/osl/tests/test_matmult.scop
deleted file mode 100644
index 596c7d2..0000000
--- a/cloog-0.17.0/osl/tests/test_matmult.scop
+++ /dev/null
@@ -1,136 +0,0 @@
-# Matmul example, relation representation
-
-<OpenScop>
-
-# =============================================== Global
-# Backend Language
-C
-
-# Context
-CONTEXT
-1 3 0 0 0 1
-   1    1   -1    ## N-1 >= 0
-
-# Parameter names are provided
-1
-# Parameter names
-<strings>
-N 
-</strings>
-
-# Number of statements
-2
-
-# =============================================== Statement 1
-# Number of relations describing the statement
-3
-
-# ----------------------------------------------  1.1 Domain
-DOMAIN
-4 5 2 0 0 1
-# e/i   i    j    N    1
-   1    1    0    0    0    ## i >= 0
-   1   -1    0    1   -1    ## -i+N-1 >= 0
-   1    0    1    0    0    ## j >= 0
-   1    0   -1    1   -1    ## -j+N-1 >= 0
-
-# ----------------------------------------------  1.2 Scattering
-SCATTERING
-5 10 5 2 0 1
-# e/i  s1   s2   s3   s4   s5    i    j    N    1 
-   0   -1    0    0    0    0    0    0    0    0    ## s1 = 0
-   0    0   -1    0    0    0    1    0    0    0    ## s2 = i
-   0    0    0   -1    0    0    0    0    0    0    ## s3 = 0
-   0    0    0    0   -1    0    0    1    0    0    ## s4 = j
-   0    0    0    0    0   -1    0    0    0    0    ## s5 = 0
-
-# ----------------------------------------------  1.3 Access
-WRITE
-3 8 3 2 0 1
-# e/i  Arr  [1]  [2]   i    j    N    1
-   0   -1    0    0    0    0    0    1    ## C
-   0    0   -1    0    1    0    0    0    ##  [i]
-   0    0    0   -1    0    1    0    0    ##     [j]
-
-# ----------------------------------------------  1.4 Body
-# Statement body is provided
-1
-<body>
-# Number of original iterators
-2
-# Original iterator names
-i j 
-# Statement body
-C[i][j] = 0.0;
-</body>
-
-# =============================================== Statement 2
-# Number of relations describing the statement
-6
-
-# ----------------------------------------------  2.1 Domain
-DOMAIN
-6 6 3 0 0 1
-# e/i   i    j    k    N    1
-   1    1    0    0    0    0    ## i >= 0
-   1   -1    0    0    1   -1    ## -i+N-1 >= 0
-   1    0    1    0    0    0    ## j >= 0
-   1    0   -1    0    1   -1    ## -j+N-1 >= 0
-   1    0    0    1    0    0    ## k >= 0
-   1    0    0   -1    1   -1    ## -k+N-1 >= 0
-
-# ----------------------------------------------  2.2 Scattering
-SCATTERING
-7 13 7 3 0 1
-# e/i  s1   s2   s3   s4   s5   s6   s7    i    j    k    N    1
-   0   -1    0    0    0    0    0    0    0    0    0    0    0   ## s1 = 0
-   0    0   -1    0    0    0    0    0    1    0    0    0    0   ## s2 = i
-   0    0    0   -1    0    0    0    0    0    0    0    0    0   ## s3 = 0
-   0    0    0    0   -1    0    0    0    0    1    0    0    0   ## s4 = j
-   0    0    0    0    0   -1    0    0    0    0    0    0    1   ## s5 = 1
-   0    0    0    0    0    0   -1    0    0    0    1    0    0   ## s6 = k
-   0    0    0    0    0    0    0   -1    0    0    0    0    0   ## s7 = 0
-
-# ----------------------------------------------  2.3 Access
-WRITE
-3 9 3 3 0 1
-# e/i  Arr  [1]  [2]   i    j    k    N    1
-   0   -1    0    0    0    0    0    0    1    ## C
-   0    0   -1    0    1    0    0    0    0    ##  [i]
-   0    0    0   -1    0    1    0    0    0    ##     [j]
-
-READ
-3 9 3 3 0 1
-# e/i  Arr  [1]  [2]   i    j    k    N    1
-   0   -1    0    0    0    0    0    0    1    ## C
-   0    0   -1    0    1    0    0    0    0    ##  [i]
-   0    0    0   -1    0    1    0    0    0    ##     [j]
-
-READ
-3 9 3 3 0 1
-# e/i  Arr  [1]  [2]   i    j    k    N    1
-   0   -1    0    0    0    0    0    0    2    ## A
-   0    0   -1    0    1    0    0    0    0    ##  [i]
-   0    0    0   -1    0    0    1    0    0    ##     [k]
-
-READ
-3 9 3 3 0 1
-# e/i  Arr  [1]  [2]   i    j    k    N    1
-   0   -1    0    0    0    0    0    0    3    ## B
-   0    0   -1    0    0    0    1    0    0    ##  [k]
-   0    0    0   -1    0    1    0    0    0    ##     [j]
-
-# ----------------------------------------------  2.4 Body
-# Statement body is provided
-1
-<body>
-# Number of original iterators
-3
-# Original iterator names
-i j k 
-# Statement body
-C[i][j] = C[i][j] + A[i][k] * B[k][j];
-</body>
-
-</OpenScop>
-
diff --git a/cloog-0.17.0/osl/tests/test_no_statement.scop b/cloog-0.17.0/osl/tests/test_no_statement.scop
deleted file mode 100644
index 5ef85d7..0000000
--- a/cloog-0.17.0/osl/tests/test_no_statement.scop
+++ /dev/null
@@ -1,18 +0,0 @@
-<OpenScop>
-
-# =============================================== Global
-# Language
-C
-
-# Context
-CONTEXT
-0 2 0 0 0 0
-
-# Parameter names are not provided
-0
-
-# No statement
-0
-
-</OpenScop>
-
diff --git a/cloog-0.17.0/osl/tests/test_scop_list.scop b/cloog-0.17.0/osl/tests/test_scop_list.scop
deleted file mode 100644
index d24e74f..0000000
--- a/cloog-0.17.0/osl/tests/test_scop_list.scop
+++ /dev/null
@@ -1,70 +0,0 @@
-<OpenScop>
-
-# =============================================== Global
-# Language
-C
-
-# Context
-CONTEXT
-0 2 0 0 0 0
-
-# Parameter names are not provided
-0
-
-# One statement
-1
-
-# =============================================== Statement 1
-# Number of relations describing the statement
-0
-
-# ----------------------------------------------  1.1 Domain
-# NULL Domain
-
-# ----------------------------------------------  1.2 Scattering
-# NULL Scattering
-
-# ----------------------------------------------  1.3 Access
-# NULL Access
-
-# ----------------------------------------------  1.4 Body
-# Statement body is not provided
-0
-
-</OpenScop>
-
-<OpenScop>
-
-# =============================================== Global
-# Language
-C
-
-# Context
-CONTEXT
-0 2 0 0 0 0
-
-# Parameter names are not provided
-0
-
-# One statement
-1
-
-# =============================================== Statement 1
-# Number of relations describing the statement
-0
-
-# ----------------------------------------------  1.1 Domain
-# NULL Domain
-
-# ----------------------------------------------  1.2 Scattering
-# NULL Scattering
-
-# ----------------------------------------------  1.3 Access
-# NULL Access
-
-# ----------------------------------------------  1.4 Body
-# Statement body is not provided
-0
-
-</OpenScop>
-
diff --git a/cloog-0.17.0/source/block.c b/cloog-0.17.0/source/block.c
deleted file mode 100644
index 08fe807..0000000
--- a/cloog-0.17.0/source/block.c
+++ /dev/null
@@ -1,404 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                             block.c                               **
-    **-------------------------------------------------------------------**
-    **                   First version: june 11th 2005                   **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-/* CAUTION: the english used for comments is probably the worst you ever read,
- *          please feel free to correct and improve it !
- */
-
-# include <stdlib.h>
-# include <stdio.h>
-# include "../include/cloog/cloog.h"
-
-
-/******************************************************************************
- *                             Memory leaks hunting                           *
- ******************************************************************************/
-
-
-/**
- * These functions and global variables are devoted to memory leaks hunting: we
- * want to know at each moment how many CloogBlock structures had been allocated
- * (cloog_block_allocated) and how many had been freed (cloog_block_freed).
- * Each time a CloogBlock structure is allocated, a call to the function
- * cloog_block_leak_up() must be carried out, and respectively
- * cloog_block_leak_down() when a CloogBlock structure is freed. The special
- * variable cloog_block_max gives the maximal number of CloogBlock structures
- * simultaneously alive (i.e. allocated and non-freed) in memory.
- * - June 11th 2005: first version.
- */
-
-
-static void cloog_block_leak_up(CloogState *state)
-{ 
-  state->block_allocated++;
-  if ((state->block_allocated - state->block_freed) > state->block_max)
-    state->block_max = state->block_allocated - state->block_freed;
-}
-
-
-static void cloog_block_leak_down(CloogState *state)
-{
-  state->block_freed++;
-}
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-
-
-/**
- * cloog_domain_print_structure :
- * this function is a human-friendly way to display the CloogDomain data
- * structure, it includes an indentation level (level) in order to work with
- * others print_structure functions.
- * - June  16th 2005: first version.
- */
-void cloog_block_print_structure(FILE * file, CloogBlock * block, int level)
-{ int i ;
-  
-  /* Go to the right level. */
-  for (i=0; i<level; i++)
-  fprintf(file,"|\t") ;
-    
-  if (block != NULL)
-  { fprintf(file,"+-- CloogBlock\n") ;
-   
-    /* A blank line. */
-    for (i=0; i<level+2; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"\n") ;    
-
-    /* Print statement list. */
-    cloog_statement_print_structure(file,block->statement,level+1) ;
-    
-    /* A blank line. */
-    for (i=0; i<level+2; i++)
-    fprintf(file,"|\t") ;    
-    fprintf(file,"\n") ;    
-
-    /* Print scattering function. */
-    for(i=0; i<level+1; i++)
-    fprintf(file,"|\t") ;
-  
-    fprintf(file,"+-- Null scattering function\n") ;
-
-    /* A blank line. */
-    for (i=0; i<level+2; i++)
-    fprintf(file,"|\t") ;    
-    fprintf(file,"\n") ;    
-
-    /* Print scalar dimensions. */
-    for (i=0; i<level+1; i++)
-    fprintf(file,"|\t") ;
-    
-    if (block->nb_scaldims == 0)
-    fprintf(file,"No scalar dimensions\n") ;
-    else
-    { fprintf(file,"Scalar dimensions (%d):",block->nb_scaldims) ;
-      for (i = 0; i < block->nb_scaldims; i++) {
-	fprintf(file, " ");
-	cloog_int_print(file, block->scaldims[i]);
-      }
-      fprintf(file,"\n") ;
-    }
-    
-    /* A blank line. */
-    for (i=0; i<level+2; i++)
-    fprintf(file,"|\t") ;    
-    fprintf(file,"\n") ;    
-
-    /* Print depth. */
-    for (i=0; i<level+1; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"Depth: %d\n",block->depth) ;
-    
-    /* A blank line. */
-    for (i=0; i<level+1; i++)
-    fprintf(file,"|\t") ;   
-    fprintf(file,"\n") ;    
-  }
-  else
-  fprintf(file,"+-- Null CloogBlock\n") ;
-}
-
-
-/**
- * cloog_block_print function:
- * This function prints the content of a CloogBlock structure (block) into a
- * file (file, possibly stdout).
- * - June 11th 2005: first version.
- * - June  16th 2005: now just a call to cloog_block_print_structure.
- */
-void cloog_block_print(FILE * file, CloogBlock * block)
-{ cloog_block_print_structure(file,block,0) ;  
-}
-
-
-/**
- * cloog_block_list_print function:
- * This function prints the content of a CloogBlock structure (block) into a
- * file (file, possibly stdout).
- * - June 16th 2005: first version.
- */
-void cloog_block_list_print(FILE * file, CloogBlockList * blocklist)
-{ int i=0 ;
-  
-  while (blocklist != NULL)
-  { fprintf(file,"+-- CloogBlockList node %d\n",i) ;
-    cloog_block_print_structure(file,blocklist->block,1) ;
-    blocklist = blocklist->next ;
-    i++ ;
-  }
-}
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-
-
-/**
- * cloog_block_free function:
- * This function frees the allocated memory for a CloogStatement structure.
- * - June 11th 2005: first version.
- * - June 30th 2005: scaldims field management.
- */
-void cloog_block_free(CloogBlock * block)
-{ int i ;
-
-  if (block != NULL)
-  { block->references -- ;
-    
-    if (block->references == 0) {
-      cloog_block_leak_down(block->state);
-      if (block->scaldims != NULL)
-      { for (i=0;i<block->nb_scaldims;i++)
-	  cloog_int_clear(block->scaldims[i]);
-      
-        free(block->scaldims) ;
-      }
-      if (block->statement)
-	cloog_statement_free(block->statement);
-      free(block) ;
-    }
-  }
-}
-
-
-/**
- * cloog_block_list_free function:
- * This function frees the allocated memory for a CloogBlockList structure.
- * - June 11th 2005: first version.
- */
-void cloog_block_list_free(CloogBlockList * blocklist)
-{ CloogBlockList * temp ;
-  
-  while (blocklist != NULL)
-  { temp = blocklist->next ;
-    cloog_block_free(blocklist->block) ;
-    free(blocklist) ;
-    blocklist = temp ;
-  }
-}
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-
-/**
- * cloog_block_malloc function:
- * This function allocates the memory space for a CloogBlock structure and
- * sets its fields with default values. Then it returns a pointer to the
- * allocated space.
- * - November 21th 2005: first version.
- */
-CloogBlock *cloog_block_malloc(CloogState *state)
-{ CloogBlock * block ;
-  
-  /* Memory allocation for the CloogBlock structure. */
-  block = (CloogBlock *)malloc(sizeof(CloogBlock)) ;
-  if (block == NULL) 
-    cloog_die("memory overflow.\n");
-  cloog_block_leak_up(state);
-  
-  /* We set the various fields with default values. */
-  block->state = state;
-  block->statement = NULL ;
-  block->nb_scaldims = 0 ;
-  block->scaldims = NULL ;
-  block->depth = 0 ;
-  block->references = 1 ;
-  block->usr = NULL;
-  
-  return block ;
-}  
-
-
-/**
- * cloog_block_alloc function:
- * This function allocates the memory space for a CloogBlock structure and
- * sets its fields with those given as input. Then it returns a pointer to the
- * allocated space. The two parameters nb_scaldims and scaldims are for internal
- * service, put to respectively 0 and NULL if you don't know what they are
- * useful for !
- * - statement is the statement list of the block,
- * - scattering is the scattering function for the block (NULL if unsure !),
- * - nb_scaldims is the number of scalar dimensions (0 if unsure !),
- * - scaldims is the array with the scalar dimensions values (NULL if unsure !),
- * - depth is the original block depth (the number of outer loops).
- **
- * - June     11th 2005: first version.
- * - June     30th 2005: addition of the nb_scaldims and scaldims parameters.
- * - November 21th 2005: use of cloog_block_malloc.
- */
-CloogBlock *cloog_block_alloc(CloogStatement *statement, int nb_scaldims,
-				cloog_int_t *scaldims, int depth)
-{ CloogBlock * block ;
-    
-  /* Block allocation. */
-  block = cloog_block_malloc(statement->state);
-
-  block->statement = statement ;
-  block->nb_scaldims = nb_scaldims ;
-  block->scaldims = scaldims ;
-  block->depth = depth ;
-  block->references = 1 ;
-  
-  return block ;
-}
-
-
-/**
- * cloog_block_list_malloc function:
- * This function allocates the memory space for a CloogBlockList structure and
- * sets its fields with default values. Then it returns a pointer to the
- * allocated space.
- * - November 21th 2005: first version.
- */
-CloogBlockList * cloog_block_list_malloc()
-{ CloogBlockList * blocklist ;
-  
-  /* Memory allocation for the CloogBlock structure. */
-  blocklist = (CloogBlockList *)malloc(sizeof(CloogBlockList)) ;
-  if (blocklist == NULL) 
-    cloog_die("memory overflow.\n");
-  
-  /* We set the various fields with default values. */
-  blocklist->block = NULL ;
-  blocklist->next  = NULL ;
-  
-  return blocklist ;
-}  
-
-
-/**
- * cloog_block_list_alloc function:
- * This function allocates the memory space for a CloogBlockList structure and
- * sets its fields with those given as input. Then it returns a pointer to the
- * allocated space.
- * - block is the block element of the list node,
- **
- * - June     11th 2005: first version.
- * - November 21th 2005: use of cloog_block_list_malloc.
- */
-CloogBlockList * cloog_block_list_alloc(CloogBlock * block)
-{ CloogBlockList * blocklist ;
-  
-  /* Block list node allocation. */
-  blocklist = cloog_block_list_malloc() ;
-
-  blocklist->block = block ;
-  blocklist->block->references ++ ; /* The block has a new reference to it. */
-  blocklist->next = NULL ;
-  
-  return blocklist ;
-}
-
-
-/**
- * cloog_block_copy function:
- * This function returns a copy of a CloogBlock structure 'block'. To save
- * memory this is not a memory copy but we increment a counter of active
- * references inside the structure, then return a pointer to that structure.
- */ 
-CloogBlock * cloog_block_copy(CloogBlock * block)
-{ if (block == NULL)
-  return NULL ;
-
-  block->references ++ ;
-  return block ;
-}
-
-
-/**
- * cloog_block_merge function:
- * this function adds at the end of the statement list of the block 'block',
- * the statement list of the block 'merged'. Then the  CloogBlock structure
- * of 'merged' is freed (obviously not its statement list that is now
- * included in 'block').
- * - June 11th 2005: first version.
- */
-void cloog_block_merge(CloogBlock * block, CloogBlock * merged)
-{ CloogStatement * statement ;
-
-  if ((block == NULL) || (merged == NULL))
-  return ;
-  
-  if (block->statement != NULL)
-  { statement = block->statement ;
-    
-    while (statement->next != NULL)
-    statement = statement->next ;
-    
-    statement->next = merged->statement ;
-  }
-  else
-  block->statement = merged->statement ;
-
-  merged->statement = NULL;
-  cloog_block_free(merged);
-}
-
-
-
-
-
-
-
-
-
-
diff --git a/cloog-0.17.0/source/clast.c b/cloog-0.17.0/source/clast.c
deleted file mode 100644
index 0b67532..0000000
--- a/cloog-0.17.0/source/clast.c
+++ /dev/null
@@ -1,1894 +0,0 @@
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-#include "../include/cloog/cloog.h"
-
-#define ALLOC(type) (type*)malloc(sizeof(type))
-#define ALLOCN(type,n) (type*)malloc((n)*sizeof(type))
-
-/**
- * CloogInfos structure:
- * this structure contains all the informations necessary for pretty printing,
- * they come from the original CloogProgram structure (language, names), from
- * genereral options (options) or are built only for pretty printing (stride).
- * This structure is mainly there to reduce the number of function parameters,
- * since most pprint.c functions need most of its field.
- */
-struct clooginfos {
-  CloogState *state;         /**< State. */
-  CloogStride **stride;
-  int stride_level;          /**< Number of valid entries in stride array. */
-  int  nb_scattdims ;        /**< Scattering dimension number. */
-  int * scaldims ;           /**< Boolean array saying whether a given
-                              *   scattering dimension is scalar or not.
-                              */
-  CloogNames * names ;       /**< Names of iterators and parameters. */
-  CloogOptions * options ;   /**< Options on CLooG's behaviour. */
-  CloogEqualities *equal;    /**< Matrix of equalities. */
-} ;
-
-typedef struct clooginfos CloogInfos ;
-
-static int clast_expr_cmp(struct clast_expr *e1, struct clast_expr *e2);
-static int clast_term_cmp(struct clast_term *t1, struct clast_term *t2);
-static int clast_binary_cmp(struct clast_binary *b1, struct clast_binary *b2);
-static int clast_reduction_cmp(struct clast_reduction *r1, 
-				 struct clast_reduction *r2);
-
-static struct clast_expr *clast_expr_copy(struct clast_expr *e);
-
-static int clast_equal_add(CloogEqualities *equal,
-				CloogConstraintSet *constraints,
-				int level, CloogConstraint *constraint,
-				CloogInfos *infos);
-
-static struct clast_stmt *clast_equal(int level, CloogInfos *infos);
-static struct clast_expr *clast_minmax(CloogConstraintSet *constraints,
-					int level, int max, int guard, 
-					int lower_bound, int no_earlier,
-					CloogInfos *infos);
-static void insert_guard(CloogConstraintSet *constraints, int level,
-			  struct clast_stmt ***next, CloogInfos *infos);
-static int insert_modulo_guard(CloogConstraint *upper,
-				CloogConstraint *lower, int level,
-			        struct clast_stmt ***next, CloogInfos *infos);
-static int insert_equation(CloogDomain *domain, CloogConstraint *upper,
-                           CloogConstraint *lower, int level,
-                           struct clast_stmt ***next, CloogInfos *infos);
-static int insert_for(CloogDomain *domain, CloogConstraintSet *constraints,
-                      int level, int otl, struct clast_stmt ***next,
-                      CloogInfos *infos);
-static void insert_block(CloogDomain *domain, CloogBlock *block, int level,
-			 struct clast_stmt ***next, CloogInfos *infos);
-static void insert_loop(CloogLoop * loop, int level,
-			struct clast_stmt ***next, CloogInfos *infos);
-
-
-struct clast_name *new_clast_name(const char *name)
-{
-    struct clast_name *n = malloc(sizeof(struct clast_name));
-    n->expr.type = clast_expr_name;
-    n->name = name;
-    return n;
-}
-
-struct clast_term *new_clast_term(cloog_int_t c, struct clast_expr *v)
-{
-    struct clast_term *t = malloc(sizeof(struct clast_term));
-    t->expr.type = clast_expr_term;
-    cloog_int_init(t->val);
-    cloog_int_set(t->val, c);
-    t->var = v;
-    return t;
-}
-
-struct clast_binary *new_clast_binary(enum clast_bin_type t, 
-				      struct clast_expr *lhs, cloog_int_t rhs)
-{
-    struct clast_binary *b = malloc(sizeof(struct clast_binary));
-    b->expr.type = clast_expr_bin;
-    b->type = t;
-    b->LHS = lhs;
-    cloog_int_init(b->RHS);
-    cloog_int_set(b->RHS, rhs);
-    return b;
-}
-
-struct clast_reduction *new_clast_reduction(enum clast_red_type t, int n)
-{
-    int i;
-    struct clast_reduction *r;
-    r = malloc(sizeof(struct clast_reduction)+(n-1)*sizeof(struct clast_expr *));
-    r->expr.type = clast_expr_red;
-    r->type = t;
-    r->n = n;
-    for (i = 0; i < n; ++i)
-	r->elts[i] = NULL;
-    return r;
-}
-
-static void free_clast_root(struct clast_stmt *s);
-
-const struct clast_stmt_op stmt_root = { free_clast_root };
-
-static void free_clast_root(struct clast_stmt *s)
-{
-    struct clast_root *r = (struct clast_root *)s;
-    assert(CLAST_STMT_IS_A(s, stmt_root));
-    cloog_names_free(r->names);
-    free(r);
-}
-
-struct clast_root *new_clast_root(CloogNames *names)
-{
-    struct clast_root *r = malloc(sizeof(struct clast_root));
-    r->stmt.op = &stmt_root;
-    r->stmt.next = NULL;
-    r->names = cloog_names_copy(names);
-    return r;
-}
-
-static void free_clast_assignment(struct clast_stmt *s);
-
-const struct clast_stmt_op stmt_ass = { free_clast_assignment };
-
-static void free_clast_assignment(struct clast_stmt *s)
-{
-    struct clast_assignment *a = (struct clast_assignment *)s;
-    assert(CLAST_STMT_IS_A(s, stmt_ass));
-    free_clast_expr(a->RHS);
-    free(a);
-}
-
-struct clast_assignment *new_clast_assignment(const char *lhs,
-					      struct clast_expr *rhs)
-{
-    struct clast_assignment *a = malloc(sizeof(struct clast_assignment));
-    a->stmt.op = &stmt_ass;
-    a->stmt.next = NULL;
-    a->LHS = lhs;
-    a->RHS = rhs;
-    return a;
-}
-
-static void free_clast_user_stmt(struct clast_stmt *s);
-
-const struct clast_stmt_op stmt_user = { free_clast_user_stmt };
-
-static void free_clast_user_stmt(struct clast_stmt *s)
-{
-    struct clast_user_stmt *u = (struct clast_user_stmt *)s;
-    assert(CLAST_STMT_IS_A(s, stmt_user));
-    cloog_domain_free(u->domain);
-    cloog_statement_free(u->statement);
-    cloog_clast_free(u->substitutions);
-    free(u);
-}
-
-struct clast_user_stmt *new_clast_user_stmt(CloogDomain *domain,
-    CloogStatement *stmt, struct clast_stmt *subs)
-{
-    struct clast_user_stmt *u = malloc(sizeof(struct clast_user_stmt));
-    u->stmt.op = &stmt_user;
-    u->stmt.next = NULL;
-    u->domain = cloog_domain_copy(domain);
-    u->statement = cloog_statement_copy(stmt);
-    u->substitutions = subs;
-    return u;
-}
-
-static void free_clast_block(struct clast_stmt *b);
-
-const struct clast_stmt_op stmt_block = { free_clast_block };
-
-static void free_clast_block(struct clast_stmt *s)
-{
-    struct clast_block *b = (struct clast_block *)s;
-    assert(CLAST_STMT_IS_A(s, stmt_block));
-    cloog_clast_free(b->body);
-    free(b);
-}
-
-struct clast_block *new_clast_block()
-{
-    struct clast_block *b = malloc(sizeof(struct clast_block));
-    b->stmt.op = &stmt_block;
-    b->stmt.next = NULL;
-    b->body = NULL;
-    return b;
-}
-
-static void free_clast_for(struct clast_stmt *s);
-
-const struct clast_stmt_op stmt_for = { free_clast_for };
-
-static void free_clast_for(struct clast_stmt *s)
-{
-    struct clast_for *f = (struct clast_for *)s;
-    assert(CLAST_STMT_IS_A(s, stmt_for));
-    cloog_domain_free(f->domain);
-    free_clast_expr(f->LB);
-    free_clast_expr(f->UB);
-    cloog_int_clear(f->stride);
-    cloog_clast_free(f->body);
-    free(f);
-}
-
-struct clast_for *new_clast_for(CloogDomain *domain, const char *it,
-                                struct clast_expr *LB, struct clast_expr *UB,
-                                CloogStride *stride)
-{
-    struct clast_for *f = malloc(sizeof(struct clast_for));
-    f->stmt.op = &stmt_for;
-    f->stmt.next = NULL;
-    f->domain = cloog_domain_copy(domain);
-    f->iterator = it;
-    f->LB = LB;
-    f->UB = UB;
-    f->body = NULL;
-    cloog_int_init(f->stride);
-    if (stride)
-	cloog_int_set(f->stride, stride->stride);
-    else
-	cloog_int_set_si(f->stride, 1);
-    return f;
-}
-
-static void free_clast_guard(struct clast_stmt *s);
-
-const struct clast_stmt_op stmt_guard = { free_clast_guard };
-
-static void free_clast_guard(struct clast_stmt *s)
-{
-    int i;
-    struct clast_guard *g = (struct clast_guard *)s;
-    assert(CLAST_STMT_IS_A(s, stmt_guard));
-    cloog_clast_free(g->then);
-    for (i = 0; i < g->n; ++i) {
-	free_clast_expr(g->eq[i].LHS);
-	free_clast_expr(g->eq[i].RHS);
-    }
-    free(g);
-}
-
-struct clast_guard *new_clast_guard(int n)
-{
-    int i;
-    struct clast_guard *g = malloc(sizeof(struct clast_guard) + 
-				   (n-1) * sizeof(struct clast_equation));
-    g->stmt.op = &stmt_guard;
-    g->stmt.next = NULL;
-    g->then = NULL;
-    g->n = n;
-    for (i = 0; i < n; ++i) {
-	g->eq[i].LHS = NULL;
-	g->eq[i].RHS = NULL;
-    }
-    return g;
-}
-
-void free_clast_name(struct clast_name *n)
-{
-    free(n);
-}
-
-void free_clast_term(struct clast_term *t)
-{
-    cloog_int_clear(t->val);
-    free_clast_expr(t->var);
-    free(t);
-}
-
-void free_clast_binary(struct clast_binary *b)
-{
-    cloog_int_clear(b->RHS);
-    free_clast_expr(b->LHS);
-    free(b);
-}
-
-void free_clast_reduction(struct clast_reduction *r)
-{
-    int i;
-    for (i = 0; i < r->n; ++i)
-	free_clast_expr(r->elts[i]);
-    free(r);
-}
-
-void free_clast_expr(struct clast_expr *e)
-{
-    if (!e)
-	return;
-    switch (e->type) {
-    case clast_expr_name:
-	free_clast_name((struct clast_name*) e);
-	break;
-    case clast_expr_term:
-	free_clast_term((struct clast_term*) e);
-	break;
-    case clast_expr_red:
-	free_clast_reduction((struct clast_reduction*) e);
-	break;
-    case clast_expr_bin:
-	free_clast_binary((struct clast_binary*) e);
-	break;
-    default:
-	assert(0);
-    }
-}
-
-void free_clast_stmt(struct clast_stmt *s)
-{
-    assert(s->op);
-    assert(s->op->free);
-    s->op->free(s);
-}
-
-void cloog_clast_free(struct clast_stmt *s)
-{
-    struct clast_stmt *next;
-    while (s) {
-	next = s->next;
-	free_clast_stmt(s);
-	s = next;
-    }
-}
-
-static int clast_name_cmp(struct clast_name *n1, struct clast_name *n2)
-{
-    return n1->name == n2->name ? 0 : strcmp(n1->name, n2->name);
-}
-
-static int clast_term_cmp(struct clast_term *t1, struct clast_term *t2)
-{
-    int c;
-    if (!t1->var && t2->var)
-	return -1;
-    if (t1->var && !t2->var)
-	return 1;
-    c = clast_expr_cmp(t1->var, t2->var);
-    if (c)
-	return c;
-    return cloog_int_cmp(t1->val, t2->val);
-}
-
-static int clast_binary_cmp(struct clast_binary *b1, struct clast_binary *b2)
-{
-    int c;
-
-    if (b1->type != b2->type)
-	return b1->type - b2->type;
-    if ((c = cloog_int_cmp(b1->RHS, b2->RHS)))
-	return c;
-    return clast_expr_cmp(b1->LHS, b2->LHS);
-}
-
-static int clast_reduction_cmp(struct clast_reduction *r1, struct clast_reduction *r2)
-{
-    int i;
-    int c;
-
-    if (r1->n == 1 && r2->n == 1)
-	return clast_expr_cmp(r1->elts[0], r2->elts[0]);
-    if (r1->type != r2->type)
-	return r1->type - r2->type;
-    if (r1->n != r2->n)
-	return r1->n - r2->n;
-    for (i = 0; i < r1->n; ++i)
-	if ((c = clast_expr_cmp(r1->elts[i], r2->elts[i])))
-	    return c;
-    return 0;
-}
-
-static int clast_expr_cmp(struct clast_expr *e1, struct clast_expr *e2)
-{
-    if (!e1 && !e2)
-	return 0;
-    if (!e1)
-	return -1;
-    if (!e2)
-	return 1;
-    if (e1->type != e2->type)
-	return e1->type - e2->type;
-    switch (e1->type) {
-    case clast_expr_name:
-	return clast_name_cmp((struct clast_name*) e1, 
-				(struct clast_name*) e2);
-    case clast_expr_term:
-	return clast_term_cmp((struct clast_term*) e1, 
-				(struct clast_term*) e2);
-    case clast_expr_bin:
-	return clast_binary_cmp((struct clast_binary*) e1, 
-				(struct clast_binary*) e2);
-    case clast_expr_red:
-	return clast_reduction_cmp((struct clast_reduction*) e1, 
-				   (struct clast_reduction*) e2);
-    default:
-	assert(0);
-    }
-}
-
-int clast_expr_equal(struct clast_expr *e1, struct clast_expr *e2)
-{
-    return clast_expr_cmp(e1, e2) == 0;
-}
-
-/**
- * Return 1 is both expressions are constant terms and e1 is bigger than e2.
- */
-int clast_expr_is_bigger_constant(struct clast_expr *e1, struct clast_expr *e2)
-{
-    struct clast_term *t1, *t2;
-    struct clast_reduction *r;
-
-    if (!e1 || !e2)
-	return 0;
-    if (e1->type == clast_expr_red) {
-	r = (struct clast_reduction *)e1;
-	return r->n == 1 && clast_expr_is_bigger_constant(r->elts[0], e2);
-    }
-    if (e2->type == clast_expr_red) {
-	r = (struct clast_reduction *)e2;
-	return r->n == 1 && clast_expr_is_bigger_constant(e1, r->elts[0]);
-    }
-    if (e1->type != clast_expr_term || e2->type != clast_expr_term)
-	return 0;
-    t1 = (struct clast_term *)e1;
-    t2 = (struct clast_term *)e2;
-    if (t1->var || t2->var)
-	return 0;
-    return cloog_int_gt(t1->val, t2->val);
-}
-
-static int qsort_expr_cmp(const void *p1, const void *p2)
-{
-    return clast_expr_cmp(*(struct clast_expr **)p1, *(struct clast_expr **)p2);
-}
-
-static void clast_reduction_sort(struct clast_reduction *r)
-{
-    qsort(&r->elts[0], r->n, sizeof(struct clast_expr *), qsort_expr_cmp);
-}
-
-static int qsort_eq_cmp(const void *p1, const void *p2)
-{
-    struct clast_equation *eq1 = (struct clast_equation *)p1;
-    struct clast_equation *eq2 = (struct clast_equation *)p2;
-    int cmp;
-
-    cmp = clast_expr_cmp(eq1->LHS, eq2->LHS);
-    if (cmp)
-	return cmp;
-
-    cmp = clast_expr_cmp(eq1->RHS, eq2->RHS);
-    if (cmp)
-	return cmp;
-
-    return eq1->sign - eq2->sign;
-}
-
-/**
- * Sort equations in a clast_guard.
- */
-static void clast_guard_sort(struct clast_guard *g)
-{
-    qsort(&g->eq[0], g->n, sizeof(struct clast_equation), qsort_eq_cmp);
-}
-
-
-/**
- * Construct a (deep) copy of an expression clast.
- */
-static struct clast_expr *clast_expr_copy(struct clast_expr *e)
-{
-    if (!e)
-	return NULL;
-    switch (e->type) {
-    case clast_expr_name: {
-	struct clast_name* n = (struct clast_name*) e;
-	return &new_clast_name(n->name)->expr;
-    }
-    case clast_expr_term: {
-	struct clast_term* t = (struct clast_term*) e;
-	return &new_clast_term(t->val, clast_expr_copy(t->var))->expr;
-    }
-    case clast_expr_red: {
-	int i;
-	struct clast_reduction *r = (struct clast_reduction*) e;
-	struct clast_reduction *r2 = new_clast_reduction(r->type, r->n);
-	for (i = 0; i < r->n; ++i)
-	    r2->elts[i] = clast_expr_copy(r->elts[i]);
-	return &r2->expr;
-    }
-    case clast_expr_bin: {
-	struct clast_binary *b = (struct clast_binary*) e;
-	return &new_clast_binary(b->type, clast_expr_copy(b->LHS), b->RHS)->expr;
-    }
-    default:
-	assert(0);
-    }
-}
-
-
-/******************************************************************************
- *                        Equalities spreading functions                      *
- ******************************************************************************/
-
-
-/**
- * clast_equal_allow function:
- * This function checks whether the options allow us to spread the equality or
- * not. It returns 1 if so, 0 otherwise.
- * - equal is the matrix of equalities,
- * - level is the column number in equal of the element which is 'equal to',
- * - line is the line number in equal of the constraint we want to study,
- * - the infos structure gives the user all options on code printing and more.
- **
- * - October 27th 2005: first version (extracted from old pprint_equal_add).
- */
-static int clast_equal_allow(CloogEqualities *equal, int level, int line,
-				CloogInfos *infos)
-{ 
-  if (level < infos->options->fsp)
-  return 0 ;
-  
-  if ((cloog_equal_type(equal, level) == EQTYPE_EXAFFINE) &&
-      !infos->options->esp)
-  return 0 ;
-
-  return 1 ;
-}
-
-
-/**
- * clast_equal_add function:
- * This function updates the row (level-1) of the equality matrix (equal) with
- * the row that corresponds to the row (line) of the matrix (matrix). It returns
- * 1 if the row can be updated, 0 otherwise.
- * - equal is the matrix of equalities,
- * - matrix is the matrix of constraints,
- * - level is the column number in matrix of the element which is 'equal to',
- * - line is the line number in matrix of the constraint we want to study,
- * - the infos structure gives the user all options on code printing and more.
- */
-static int clast_equal_add(CloogEqualities *equal,
-				CloogConstraintSet *constraints,
-				int level, CloogConstraint *constraint,
-				CloogInfos *infos)
-{
-    cloog_equal_add(equal, constraints, level, constraint,
-		    infos->names->nb_parameters);
-  
-    return clast_equal_allow(equal, level, level-1, infos);
-}
-
-
-
-/**
- * clast_equal function:
- * This function prints the substitution data of a statement into a clast_stmt.
- * Using this function instead of pprint_equal is useful for generating
- * a compilable pseudo-code by using preprocessor macro for each statement.
- * By opposition to pprint_equal, the result is less human-readable. For
- * instance this function will print (i,i+3,k,3) where pprint_equal would
- * return (j=i+3,l=3).
- * - level is the number of loops enclosing the statement,
- * - the infos structure gives the user all options on code printing and more.
- **
- * - March    12th 2004: first version. 
- * - November 21th 2005: (debug) now works well with GMP version. 
- */
-static struct clast_stmt *clast_equal(int level, CloogInfos *infos)
-{ 
-  int i ;
-  struct clast_expr *e;
-  struct clast_stmt *a = NULL;
-  struct clast_stmt **next = &a;
-  CloogEqualities *equal = infos->equal;
-  CloogConstraint *equal_constraint;
-
-  for (i=infos->names->nb_scattering;i<level-1;i++)
-  { if (cloog_equal_type(equal, i+1)) {
-      equal_constraint = cloog_equal_constraint(equal, i);
-      e = clast_bound_from_constraint(equal_constraint, i+1, infos->names);
-      cloog_constraint_release(equal_constraint);
-    } else {
-      e = &new_clast_term(infos->state->one, &new_clast_name(
-		 cloog_names_name_at_level(infos->names, i+1))->expr)->expr;
-    }
-    *next = &new_clast_assignment(NULL, e)->stmt;
-    next = &(*next)->next;
-  }
-
-  return a;
-}
-
- 
-/**
- * clast_bound_from_constraint function:
- * This function returns a clast_expr containing the printing of the
- * 'right part' of a constraint according to an element.
- * For instance, for the constraint -3*i + 2*j - M >=0 and the element j,
- * we have j >= (3*i + M)/2. As we are looking for integral solutions, this
- * function should return 'ceild(3*i+M,2)'.
- * - matrix is the polyhedron containing all the constraints,
- * - line_num is the line number in domain of the constraint we want to print,
- * - level is the column number in domain of the element we want to use,
- * - names structure gives the user some options about code printing,
- *   the number of parameters in domain (nb_par), and the arrays of iterator
- *   names and parameters (iters and params). 
- **
- * - November 2nd 2001: first version. 
- * - June    27th 2003: 64 bits version ready.
- */
-struct clast_expr *clast_bound_from_constraint(CloogConstraint *constraint,
-					       int level, CloogNames *names)
-{ 
-  int i, sign, nb_elts=0, len;
-  cloog_int_t *line, numerator, denominator, temp, division;
-  struct clast_expr *e = NULL;
-  struct cloog_vec *line_vector;
-
-  len = cloog_constraint_total_dimension(constraint) + 2;
-  line_vector = cloog_vec_alloc(len);
-  line = line_vector->p;
-  cloog_constraint_copy_coefficients(constraint, line+1);
-  cloog_int_init(temp);
-  cloog_int_init(numerator);
-  cloog_int_init(denominator);
-
-  if (!cloog_int_is_zero(line[level])) {
-    struct clast_reduction *r;
-    /* Maybe we need to invert signs in such a way that the element sign is>0.*/
-    sign = -cloog_int_sgn(line[level]);
-
-    for (i = 1, nb_elts = 0; i <= len - 1; ++i)
-	if (i != level && !cloog_int_is_zero(line[i]))
-	    nb_elts++;
-    r = new_clast_reduction(clast_red_sum, nb_elts);
-    nb_elts = 0;
-
-    /* First, we have to print the iterators and the parameters. */
-    for (i = 1; i <= len - 2; i++) {
-      struct clast_expr *v;
-
-      if (i == level || cloog_int_is_zero(line[i]))
-	continue;
-
-      v = cloog_constraint_variable_expr(constraint, i, names);
-      
-      if (sign == -1)
-	cloog_int_neg(temp,line[i]);
-      else
-	cloog_int_set(temp,line[i]);
-      
-      r->elts[nb_elts++] = &new_clast_term(temp, v)->expr;
-    }    
-
-    if (sign == -1) {
-      cloog_int_neg(numerator, line[len - 1]);
-      cloog_int_set(denominator, line[level]);
-    }
-    else {
-      cloog_int_set(numerator, line[len - 1]);
-      cloog_int_neg(denominator, line[level]);
-    }
-        
-    /* Finally, the constant, and the final printing. */
-    if (nb_elts) {
-      if (!cloog_int_is_zero(numerator))
-	  r->elts[nb_elts++] = &new_clast_term(numerator, NULL)->expr;
-    
-      if (!cloog_int_is_one(line[level]) && !cloog_int_is_neg_one(line[level]))
-      { if (!cloog_constraint_is_equality(constraint))
-        { if (cloog_int_is_pos(line[level]))
-	    e = &new_clast_binary(clast_bin_cdiv, &r->expr, denominator)->expr;
-          else
-	    e = &new_clast_binary(clast_bin_fdiv, &r->expr, denominator)->expr;
-        } else
-	    e = &new_clast_binary(clast_bin_div, &r->expr, denominator)->expr;
-      }
-      else
-	e = &r->expr;
-    } else { 
-      free_clast_reduction(r);
-      if (cloog_int_is_zero(numerator))
-	e = &new_clast_term(numerator, NULL)->expr;
-      else
-      { if (!cloog_int_is_one(denominator))
-        { if (!cloog_constraint_is_equality(constraint)) { /* useful? */
-            if (cloog_int_is_divisible_by(numerator, denominator)) {
-              cloog_int_divexact(temp, numerator, denominator);
-	      e = &new_clast_term(temp, NULL)->expr;
-            }
-            else {
-              cloog_int_init(division);
-	      cloog_int_tdiv_q(division, numerator, denominator);
-	      if (cloog_int_is_neg(numerator)) {
-                if (cloog_int_is_pos(line[level])) {
-		    /* nb<0 need max */
-		    e = &new_clast_term(division, NULL)->expr;
-		} else {
-                  /* nb<0 need min */
-                  cloog_int_sub_ui(temp, division, 1);
-		  e = &new_clast_term(temp, NULL)->expr;
-                }
-	      }
-              else
-              { if (cloog_int_is_pos(line[level]))
-	        { /* nb>0 need max */
-                  cloog_int_add_ui(temp, division, 1);
-		  e = &new_clast_term(temp, NULL)->expr;
-                }
-		else
-		    /* nb>0 need min */
-		    e = &new_clast_term(division, NULL)->expr;
-              }
-	      cloog_int_clear(division);
-            }
-          }
-          else
-	    e = &new_clast_binary(clast_bin_div, 
-				  &new_clast_term(numerator, NULL)->expr,
-				  denominator)->expr;
-        }
-        else
-	    e = &new_clast_term(numerator, NULL)->expr;
-      }
-    }
-  }
-
-  cloog_vec_free(line_vector);
-
-  cloog_int_clear(temp);
-  cloog_int_clear(numerator);
-  cloog_int_clear(denominator);
-    
-  return e;
-}
-
-
-/* Temporary structure for communication between clast_minmax and
- * its cloog_constraint_set_foreach_constraint callback functions.
- */
-struct clast_minmax_data {
-    int level;
-    int max;
-    int guard;
-    int lower_bound;
-    int no_earlier;
-    CloogInfos *infos;
-    int n;
-    struct clast_reduction *r;
-};
-
-
-/* Should constraint "c" be considered by clast_minmax?
- *
- * If d->no_earlier is set, then the constraint may not involve
- * any earlier variables.
- */
-static int valid_bound(CloogConstraint *c, struct clast_minmax_data *d)
-{
-    int i;
-
-    if (d->max && !cloog_constraint_is_lower_bound(c, d->level - 1))
-	return 0;
-    if (!d->max && !cloog_constraint_is_upper_bound(c, d->level - 1))
-	return 0;
-    if (cloog_constraint_is_equality(c))
-	return 0;
-    if (d->guard && cloog_constraint_involves(c, d->guard - 1))
-	return 0;
-
-    if (d->no_earlier)
-	for (i = 0; i < d->level - 1; ++i)
-	    if (cloog_constraint_involves(c, i))
-		return 0;
-
-    return 1;
-}
-
-
-/* Increment n for each bound that should be considered by clast_minmax.
- */
-static int count_bounds(CloogConstraint *c, void *user)
-{
-    struct clast_minmax_data *d = (struct clast_minmax_data *) user;
-
-    if (!valid_bound(c, d))
-	return 0;
-
-    d->n++;
-
-    return 0;
-}
-
-
-/* Update the given lower bound based on stride information,
- * for those cases where the stride offset is represented by
- * a constraint.
- * Note that cloog_loop_stride may have already performed a
- * similar update of the lower bounds, but the updated lower
- * bounds may have been eliminated because they are redundant
- * by definition.  On the other hand, performing the update
- * on an already updated constraint is an identity operation
- * and is therefore harmless.
- */
-static CloogConstraint *update_lower_bound_c(CloogConstraint *c, int level,
-	CloogStride *stride)
-{
-    if (!stride->constraint)
-	return c;
-    return cloog_constraint_stride_lower_bound(c, level, stride);
-}
-
-
-/* Update the given lower bound based on stride information.
- * If the stride offset is represented by a constraint,
- * then we have already performed the update in update_lower_bound_c.
- * Otherwise, the original lower bound is known to be a constant.
- * If the bound has already been updated and it just happens
- * to be a constant, then this function performs an identity
- * operation on the constant.
- */
-static void update_lower_bound(struct clast_expr *expr, int level,
-	CloogStride *stride)
-{
-    struct clast_term *t;
-    if (stride->constraint)
-	return;
-    if (expr->type != clast_expr_term)
-	return;
-    t = (struct clast_term *)expr;
-    if (t->var)
-	return;
-    cloog_int_sub(t->val, t->val, stride->offset);
-    cloog_int_cdiv_q(t->val, t->val, stride->stride);
-    cloog_int_mul(t->val, t->val, stride->stride);
-    cloog_int_add(t->val, t->val, stride->offset);
-}
-
-
-/* Add all relevant bounds to r->elts and update lower bounds
- * based on stride information.
- */
-static int collect_bounds(CloogConstraint *c, void *user)
-{
-    struct clast_minmax_data *d = (struct clast_minmax_data *) user;
-
-    if (!valid_bound(c, d))
-	return 0;
-
-    c = cloog_constraint_copy(c);
-
-    if (d->lower_bound && d->infos->stride[d->level - 1])
-	c = update_lower_bound_c(c, d->level, d->infos->stride[d->level - 1]);
-
-    d->r->elts[d->n] = clast_bound_from_constraint(c, d->level,
-							    d->infos->names);
-    if (d->lower_bound && d->infos->stride[d->level - 1]) {
-	update_lower_bound(d->r->elts[d->n], d->level,
-			   d->infos->stride[d->level - 1]);
-    }
-
-    cloog_constraint_release(c);
-
-    d->n++;
-
-    return 0;
-}
-
-
-/**
- * clast_minmax function:
- * This function returns a clast_expr containing the printing of a minimum or a
- * maximum of the 'right parts' of all constraints according to an element.
- * For instance consider the constraints:
- * -3*i  +2*j   -M >= 0
- *  2*i    +j      >= 0
- *   -i    -j +2*M >= 0
- * if we are looking for the minimum for the element j, the function should
- * return 'max(ceild(3*i+M,2),-2*i)'.
- * - constraints is the constraints,
- * - level is the column number in domain of the element we want to use,
- * - max is a boolean set to 1 if we are looking for a maximum, 0 for a minimum,
- * - guard is set to 0 if there is no guard, and set to the level of the element
- *   with a guard otherwise (then the function gives the max or the min only
- *   for the constraint where the guarded coefficient is 0), 
- * - lower is set to 1 if the maximum is to be used a lower bound on a loop
- * - no_earlier is set if no constraints should be used that involve
- *   earlier dimensions,
- * - the infos structure gives the user some options about code printing,
- *   the number of parameters in domain (nb_par), and the arrays of iterator
- *   names and parameters (iters and params). 
- **
- * - November 2nd 2001: first version. 
- */
-static struct clast_expr *clast_minmax(CloogConstraintSet *constraints,
-				       int level, int max, int guard,
-				       int lower_bound, int no_earlier,
-				       CloogInfos *infos)
-{
-    struct clast_minmax_data data = { level, max, guard, lower_bound,
-				      no_earlier, infos };
-  
-    data.n = 0;
-
-    cloog_constraint_set_foreach_constraint(constraints, count_bounds, &data);
-
-    if (!data.n)
-	return NULL;
-    data.r = new_clast_reduction(max ? clast_red_max : clast_red_min, data.n);
-
-    data.n = 0;
-    cloog_constraint_set_foreach_constraint(constraints, collect_bounds, &data);
-
-    clast_reduction_sort(data.r);
-    return &data.r->expr;
-}
-
-
-/**
- * Insert modulo guards defined by existentially quantified dimensions,
- * not involving the given level.
- *
- * This function is called from within insert_guard.
- * Any constraint used in constructing a modulo guard is removed
- * from the constraint set to avoid insert_guard
- * adding a duplicate (pair of) constraint(s).
- *
- * Return the updated CloogConstraintSet.
- */
-static CloogConstraintSet *insert_extra_modulo_guards(
-	CloogConstraintSet *constraints, int level,
-	struct clast_stmt ***next, CloogInfos *infos)
-{
-    int i;
-    int nb_iter;
-    int total_dim;
-    CloogConstraint *upper, *lower;
-
-    total_dim = cloog_constraint_set_total_dimension(constraints);
-    nb_iter = cloog_constraint_set_n_iterators(constraints,
-						infos->names->nb_parameters);
-
-    for (i = total_dim - infos->names->nb_parameters; i >= nb_iter + 1; i--) {
-	if (cloog_constraint_is_valid(upper =
-		cloog_constraint_set_defining_equality(constraints, i))) {
-	    if (!level || (nb_iter < level) ||
-		    !cloog_constraint_involves(upper, level-1)) {
-		insert_modulo_guard(upper,
-				cloog_constraint_invalid(), i, next, infos);
-		constraints = cloog_constraint_set_drop_constraint(constraints,
-									upper);
-	    }
-	    cloog_constraint_release(upper);
-	} else if (cloog_constraint_is_valid(upper =
-		    cloog_constraint_set_defining_inequalities(constraints,
-			      i, &lower, infos->names->nb_parameters))) {
-	    if (!level || (nb_iter < level) ||
-		    !cloog_constraint_involves(upper, level-1)) {
-		insert_modulo_guard(upper, lower, i, next, infos);
-		constraints = cloog_constraint_set_drop_constraint(constraints,
-									upper);
-		constraints = cloog_constraint_set_drop_constraint(constraints,
-									lower);
-	    }
-	    cloog_constraint_release(upper);
-	    cloog_constraint_release(lower);
-	}
-    }
-
-    return constraints;
-}
-
-
-/* Temporary structure for communication between insert_guard and
- * its cloog_constraint_set_foreach_constraint callback function.
- */
-struct clast_guard_data {
-    int level;
-    CloogInfos *infos;
-    int n;
-    int i;
-    int nb_iter;
-    CloogConstraintSet *copy;
-    struct clast_guard *g;
-
-    int min;
-    int max;
-};
-
-
-static int guard_count_bounds(CloogConstraint *c, void *user)
-{
-    struct clast_guard_data *d = (struct clast_guard_data *) user;
-
-    d->n++;
-
-    return 0;
-}
-
-
-/* Insert a guard, if necesessary, for constraint j.
- *
- * If the constraint involves any earlier dimensions, then we have
- * already considered it during a previous iteration over the constraints.
- *
- * If we have already generated a min [max] for the current level d->i
- * and if the current constraint is an upper [lower] bound, then we
- * can skip the constraint as it will already have been used
- * in that previously generated min [max].
- */
-static int insert_guard_constraint(CloogConstraint *j, void *user)
-{
-    int i;
-    struct clast_guard_data *d = (struct clast_guard_data *) user;
-    int minmax = -1;
-    int individual_constraint;
-    struct clast_expr *v;
-    struct clast_term *t;
-
-    if (!cloog_constraint_involves(j, d->i - 1))
-	return 0;
-
-    for (i = 0; i < d->i - 1; ++i)
-	if (cloog_constraint_involves(j, i))
-	    return 0;
-
-    if (d->level && d->nb_iter >= d->level &&
-	    cloog_constraint_involves(j, d->level - 1))
-	return 0;
-
-    individual_constraint = !d->level || cloog_constraint_is_equality(j);
-    if (!individual_constraint) {
-	if (d->max && cloog_constraint_is_lower_bound(j, d->i - 1))
-	    return 0;
-	if (d->min && cloog_constraint_is_upper_bound(j, d->i - 1))
-	    return 0;
-    }
-
-    v = cloog_constraint_variable_expr(j, d->i, d->infos->names);
-    d->g->eq[d->n].LHS = &(t = new_clast_term(d->infos->state->one, v))->expr;
-    if (individual_constraint) {
-	/* put the "denominator" in the LHS */
-	cloog_constraint_coefficient_get(j, d->i - 1, &t->val);
-	cloog_constraint_coefficient_set(j, d->i - 1, d->infos->state->one);
-	if (cloog_int_is_neg(t->val)) {
-	    cloog_int_neg(t->val, t->val);
-	    cloog_constraint_coefficient_set(j, d->i - 1, d->infos->state->negone);
-	}
-	if (d->level || cloog_constraint_is_equality(j))
-	    d->g->eq[d->n].sign = 0;
-	else if (cloog_constraint_is_lower_bound(j, d->i - 1))
-	    d->g->eq[d->n].sign = 1;
-	else
-	    d->g->eq[d->n].sign = -1;
-	d->g->eq[d->n].RHS = clast_bound_from_constraint(j, d->i, d->infos->names);
-    } else {
-	int guarded;
-
-	if (cloog_constraint_is_lower_bound(j, d->i - 1)) {
-	    minmax = 1;
-	    d->max = 1;
-	    d->g->eq[d->n].sign = 1;
-	} else {
-	    minmax = 0;
-	    d->min = 1;
-	    d->g->eq[d->n].sign = -1;
-	}
-	  
-	guarded = (d->nb_iter >= d->level) ? d->level : 0 ;
-	d->g->eq[d->n].RHS = clast_minmax(d->copy,  d->i, minmax, guarded, 0, 1,
-					  d->infos);
-    }
-    d->n++;
-	
-    return 0;
-}
-
-
-/**
- * insert_guard function:
- * This function inserts a guard in the clast.
- * A guard on an element (level) is :
- * -> the conjunction of all the existing constraints where the coefficient of
- *    this element is 0 if the element is an iterator,
- * -> the conjunction of all the existing constraints if the element isn't an
- *    iterator.
- * For instance, considering these constraints and the element j:
- * -3*i +2*j -M >= 0
- *  2*i      +M >= 0
- * this function should return 'if (2*i+M>=0) {'.
- * - matrix is the polyhedron containing all the constraints,
- * - level is the column number of the element in matrix we want to use,
- * - the infos structure gives the user some options about code printing,
- *   the number of parameters in matrix (nb_par), and the arrays of iterator
- *   names and parameters (iters and params). 
- **
- * - November  3rd 2001: first version. 
- * - November 14th 2001: a lot of 'purifications'. 
- * - July     31th 2002: (debug) some guard parts are no more redundants. 
- * - August   12th 2002: polyhedra union ('or' conditions) are now supported.
- * - October  27th 2005: polyhedra union ('or' conditions) are no more supported
- *                       (the need came from loop_simplify that may result in
- *                       domain unions, now it should be fixed directly in
- *                       cloog_loop_simplify).
- */
-static void insert_guard(CloogConstraintSet *constraints, int level,
-			 struct clast_stmt ***next, CloogInfos *infos)
-{ 
-    int total_dim;
-    struct clast_guard_data data = { level, infos, 0 };
-
-    if (!constraints)
-	return;
-
-    data.copy = cloog_constraint_set_copy(constraints);
-
-    data.copy = insert_extra_modulo_guards(data.copy, level, next, infos);
-
-    cloog_constraint_set_foreach_constraint(constraints,
-						guard_count_bounds, &data);
-  
-    data.g = new_clast_guard(data.n);
-    data.n = 0;
-
-    /* Well, it looks complicated because I wanted to have a particular, more
-     * readable, ordering, obviously this function may be far much simpler !
-     */
-    data.nb_iter = cloog_constraint_set_n_iterators(constraints,
-						infos->names->nb_parameters);
- 
-    /* We search for guard parts. */
-    total_dim = cloog_constraint_set_total_dimension(constraints);
-    for (data.i = 1; data.i <= total_dim; data.i++) {
-	data.min = 0;
-	data.max = 0;
-	cloog_constraint_set_foreach_constraint(data.copy,
-						insert_guard_constraint, &data);
-    }
-
-    cloog_constraint_set_free(data.copy);
-
-    data.g->n = data.n;
-    if (data.n) {
-	clast_guard_sort(data.g);
-	**next = &data.g->stmt;
-	*next = &data.g->then;
-    } else
-	free_clast_stmt(&data.g->stmt);
-}
-
-/**
- * Check if the constant "cst" satisfies the modulo guard that
- * would be introduced by insert_computed_modulo_guard.
- * The constant is assumed to have been reduced prior to calling
- * this function.
- */
-static int constant_modulo_guard_is_satisfied(CloogConstraint *lower,
-	cloog_int_t bound, cloog_int_t cst)
-{
-    if (cloog_constraint_is_valid(lower))
-	return cloog_int_le(cst, bound);
-    else
-	return cloog_int_is_zero(cst);
-}
-
-/**
- * Insert a modulo guard "r % mod == 0" or "r % mod <= bound",
- * depending on whether lower represents a valid constraint.
- */
-static void insert_computed_modulo_guard(struct clast_reduction *r,
-	CloogConstraint *lower, cloog_int_t mod, cloog_int_t bound,
-	struct clast_stmt ***next)
-{
-    struct clast_expr *e;
-    struct clast_guard *g;
-
-    e = &new_clast_binary(clast_bin_mod, &r->expr, mod)->expr;
-    g = new_clast_guard(1);
-    if (!cloog_constraint_is_valid(lower)) {
-	g->eq[0].LHS = e;
-	cloog_int_set_si(bound, 0);
-	g->eq[0].RHS = &new_clast_term(bound, NULL)->expr;
-	g->eq[0].sign = 0;
-    } else {
-	g->eq[0].LHS = e;
-	g->eq[0].RHS = &new_clast_term(bound, NULL)->expr;
-	g->eq[0].sign = -1;
-    }
-
-    **next = &g->stmt;
-    *next = &g->then;
-}
-
-
-/* Try and eliminate coefficients from a modulo constraint based on
- * stride information of an earlier level.
- * The modulo of the constraint being constructed is "m".
- * The stride information at level "level" is given by "stride"
- * and indicated that the iterator i at level "level" is equal to
- * some expression modulo stride->stride.
- * If stride->stride is a multiple of "m' then i is also equal to
- * the expression modulo m and so we can eliminate the coefficient of i.
- *
- * If stride->constraint is NULL, then i has a constant value modulo m, stored
- * stride->offset.  We simply multiply this constant with the coefficient
- * of i and add the result to the constant term, reducing it modulo m.
- *
- * If stride->constraint is not NULL, then it is a constraint of the form
- *
- *	e + k i = s a
- *
- * with s equal to stride->stride, e an expression in terms of the
- * parameters and earlier iterators and a some arbitrary expression
- * in terms of existentially quantified variables.
- * stride->factor is a value f such that f * k = -1 mod s.
- * Adding stride->constraint f * c times to the current modulo constraint,
- * with c the coefficient of i eliminates i in favor of parameters and
- * earlier variables.
- */
-static void eliminate_using_stride_constraint(cloog_int_t *line, int len,
-	int nb_iter, CloogStride *stride, int level, cloog_int_t m)
-{
-	if (!stride)
-		return;
-	if (!cloog_int_is_divisible_by(stride->stride, m))
-		return;
-
-	if (stride->constraint) {
-		int i, s_len;
-		cloog_int_t t, v;
-
-		cloog_int_init(t);
-		cloog_int_init(v);
-		cloog_int_mul(t, line[level], stride->factor);
-		for (i = 1; i < level; ++i) {
-			cloog_constraint_coefficient_get(stride->constraint,
-							i - 1, &v);
-			cloog_int_addmul(line[i], t, v);
-			cloog_int_fdiv_r(line[i], line[i], m);
-		}
-		s_len = cloog_constraint_total_dimension(stride->constraint)+2;
-		for (i = nb_iter + 1; i <= len - 2; ++i) {
-			cloog_constraint_coefficient_get(stride->constraint,
-						i - (len - s_len) - 1, &v);
-			cloog_int_addmul(line[i], t, v);
-			cloog_int_fdiv_r(line[i], line[i], m);
-		}
-		cloog_constraint_constant_get(stride->constraint, &v);
-		cloog_int_addmul(line[len - 1], t, v);
-		cloog_int_fdiv_r(line[len - 1], line[len - 1], m);
-		cloog_int_clear(v);
-		cloog_int_clear(t);
-	} else {
-		cloog_int_addmul(line[len - 1], line[level], stride->offset);
-		cloog_int_fdiv_r(line[len - 1], line[len - 1], m);
-	}
-
-	cloog_int_set_si(line[level], 0);
-}
-
-
-/* Temporary structure for communication between insert_modulo_guard and
- * its cloog_constraint_set_foreach_constraint callback function.
- */
-struct clast_modulo_guard_data {
-    CloogConstraint *lower;
-    int level;
-    struct clast_stmt ***next;
-    CloogInfos *infos;
-    int empty;
-    cloog_int_t val, bound;
-};
-
-
-/* Insert a modulo guard for constraint c.
- * The constraint may be either an equality or an inequality.
- * Since this function returns -1, it is only called on a single constraint.
- * In case of an inequality, the constraint is usually an upper bound
- * on d->level.  However, if this variable is an existentially
- * quantified variable, the upper bound constraint may get removed
- * as trivially holding and then this function is called with
- * a lower bound instead.  In this case, we need to adjust the constraint
- * based on the sum of the constant terms of the lower and upper bound
- * stored in d->bound.
- */
-static int insert_modulo_guard_constraint(CloogConstraint *c, void *user)
-{
-    struct clast_modulo_guard_data *d = (struct clast_modulo_guard_data *) user;
-    int level = d->level;
-    CloogInfos *infos = d->infos;
-    int i, nb_elts = 0, len, nb_iter, nb_par;
-    int constant;
-    struct cloog_vec *line_vector;
-    cloog_int_t *line;
-
-    len = cloog_constraint_total_dimension(c) + 2;
-    nb_par = infos->names->nb_parameters;
-    nb_iter = len - 2 - nb_par;
-
-    line_vector = cloog_vec_alloc(len);
-    line = line_vector->p;
-    cloog_constraint_copy_coefficients(c, line + 1);
-
-    if (cloog_int_is_pos(line[level])) {
-	cloog_seq_neg(line + 1, line + 1, len - 1);
-	if (!cloog_constraint_is_equality(c))
-	    cloog_int_add(line[len - 1], line[len - 1], d->bound);
-    }
-    cloog_int_neg(line[level], line[level]);
-    assert(cloog_int_is_pos(line[level]));
-
-    nb_elts = 0;
-    for (i = 1; i <= len-1; ++i) {
-	if (i == level)
-	    continue;
-	cloog_int_fdiv_r(line[i], line[i], line[level]);
-	if (cloog_int_is_zero(line[i]))
-	    continue;
-	if (i == len-1)
-	    continue;
-
-	nb_elts++;
-    }
-
-    if (nb_elts || !cloog_int_is_zero(line[len-1])) {
-	struct clast_reduction *r;
-	const char *name;
-
-	r = new_clast_reduction(clast_red_sum, nb_elts + 1);
-	nb_elts = 0;
-
-	/* First, the modulo guard : the iterators... */
-	i = level - 1;
-	if (i > infos->stride_level)
-		i = infos->stride_level;
-	for (; i >= 1; --i)
-	    eliminate_using_stride_constraint(line, len, nb_iter,
-					infos->stride[i - 1], i, line[level]);
-	for (i=1;i<=nb_iter;i++) {
-	  if (i == level || cloog_int_is_zero(line[i]))
-	    continue;
-
-	  name = cloog_names_name_at_level(infos->names, i);
-
-	  r->elts[nb_elts++] = &new_clast_term(line[i],
-				    &new_clast_name(name)->expr)->expr;
-	}
-
-	/* ...the parameters... */
-	for (i=nb_iter+1;i<=len-2;i++) {
-	  if (cloog_int_is_zero(line[i]))
-	    continue;
-
-	  name = infos->names->parameters[i-nb_iter-1] ;
-	  r->elts[nb_elts++] = &new_clast_term(line[i],
-				    &new_clast_name(name)->expr)->expr;
-	}
-
-	constant = nb_elts == 0;
-	/* ...the constant. */
-	if (!cloog_int_is_zero(line[len-1]))
-	  r->elts[nb_elts++] = &new_clast_term(line[len-1], NULL)->expr;
-
-	/* our initial computation may have been an overestimate */
-	r->n = nb_elts;
-
-	if (constant) {
-	  d->empty = !constant_modulo_guard_is_satisfied(d->lower, d->bound,
-							 line[len - 1]);
-	  free_clast_reduction(r);
-	} else
-	  insert_computed_modulo_guard(r, d->lower, line[level], d->bound,
-					d->next);
-    }
-
-    cloog_vec_free(line_vector);
-
-    return -1;
-}
-
-
-/**
- * insert_modulo_guard:
- * This function inserts a modulo guard corresponding to an equality
- * or a pair of inequalities.
- * Returns 0 if the modulo guard is discovered to be unsatisfiable.
- *
- * See insert_equation.
- * - matrix is the polyhedron containing all the constraints,
- * - upper and lower are the line numbers of the constraint in matrix
- *   we want to print; in particular, if we want to print an equality,
- *   then lower == -1 and upper is the row of the equality; if we want
- *   to print an inequality, then upper is the row of the upper bound
- *   and lower in the row of the lower bound
- * - level is the column number of the element in matrix we want to use,
- * - the infos structure gives the user some options about code printing,
- *   the number of parameters in matrix (nb_par), and the arrays of iterator
- *   names and parameters (iters and params). 
- */
-static int insert_modulo_guard(CloogConstraint *upper,
-				CloogConstraint *lower, int level,
-				struct clast_stmt ***next, CloogInfos *infos)
-{
-  int nb_par;
-  CloogConstraintSet *set;
-  struct clast_modulo_guard_data data = { lower, level, next, infos, 0 };
-
-  cloog_int_init(data.val);
-  cloog_constraint_coefficient_get(upper, level-1, &data.val);
-  if (cloog_int_is_one(data.val) || cloog_int_is_neg_one(data.val)) {
-    cloog_int_clear(data.val);
-    return 1;
-  }
-
-  nb_par = infos->names->nb_parameters;
-
-  cloog_int_init(data.bound);
-  /* Check if would be emitting the redundant constraint mod(e,m) <= m-1 */
-  if (cloog_constraint_is_valid(lower)) {
-    cloog_constraint_constant_get(upper, &data.val);
-    cloog_constraint_constant_get(lower, &data.bound);
-    cloog_int_add(data.bound, data.val, data.bound);
-    cloog_constraint_coefficient_get(lower, level-1, &data.val);
-    cloog_int_sub_ui(data.val, data.val, 1);
-    if (cloog_int_eq(data.val, data.bound)) {
-      cloog_int_clear(data.val);
-      cloog_int_clear(data.bound);
-      return 1;
-    }
-  }
-
-  if (cloog_constraint_needs_reduction(upper, level)) {
-    set = cloog_constraint_set_for_reduction(upper, lower);
-    set = cloog_constraint_set_reduce(set, level, infos->equal,
-					nb_par, &data.bound);
-    cloog_constraint_set_foreach_constraint(set,
-					insert_modulo_guard_constraint, &data);
-    cloog_constraint_set_free(set);
-  } else
-    insert_modulo_guard_constraint(upper, &data);
-
-  cloog_int_clear(data.val);
-  cloog_int_clear(data.bound);
-
-  return !data.empty;
-}
-
-
-/**
- * We found an equality or a pair of inequalities identifying
- * a loop with a single iteration, but the user wants us to generate
- * a loop anyway, so we do it here.
- */
-static int insert_equation_as_loop(CloogDomain *domain, CloogConstraint *upper,
-		CloogConstraint *lower, int level, struct clast_stmt ***next,
-		CloogInfos *infos)
-{
-    const char *iterator = cloog_names_name_at_level(infos->names, level);
-    struct clast_expr *e1, *e2;
-    struct clast_for *f;
-
-    e2 = clast_bound_from_constraint(upper, level, infos->names);
-    if (!cloog_constraint_is_valid(lower))
-	e1 = clast_expr_copy(e2);
-    else
-	e1 = clast_bound_from_constraint(lower, level, infos->names);
-
-    f = new_clast_for(domain, iterator, e1, e2, infos->stride[level-1]);
-    **next = &f->stmt;
-    *next = &f->body;
-
-    cloog_constraint_release(lower);
-    cloog_constraint_release(upper);
-    return 1;
-}
-
-
-/**
- * insert_equation function:
- * This function inserts an equality 
- * constraint according to an element in the clast.
- * Returns 1 if the calling function should recurse into inner loops.
- *
- * An equality can be preceded by a 'modulo guard'.
- * For instance, consider the constraint i -2*j = 0 and the
- * element j: pprint_equality should return 'if(i%2==0) { j = i/2 ;'.
- * - matrix is the polyhedron containing all the constraints,
- * - num is the line number of the constraint in matrix we want to print,
- * - level is the column number of the element in matrix we want to use,
- * - the infos structure gives the user some options about code printing,
- *   the number of parameters in matrix (nb_par), and the arrays of iterator
- *   names and parameters (iters and params). 
- **
- * - November 13th 2001: first version.
- * - June 26th 2003: simplification of the modulo guards (remove parts such as
- *                   modulo is 0, compare vivien or vivien2 with a previous
- *                   version for an idea).
- * - June 29th 2003: non-unit strides support.
- * - July 14th 2003: (debug) no more print the constant in the modulo guard when
- *                   it was previously included in a stride calculation.
- */
-static int insert_equation(CloogDomain *domain, CloogConstraint *upper,
-                           CloogConstraint *lower, int level, struct clast_stmt
-                           ***next, CloogInfos *infos)
-{
-  struct clast_expr *e;
-  struct clast_assignment *ass;
-
-  if (!infos->options->otl)
-    return insert_equation_as_loop(domain, upper, lower, level, next, infos);
-
-  if (!insert_modulo_guard(upper, lower, level, next, infos)) {
-    cloog_constraint_release(lower);
-    cloog_constraint_release(upper);
-
-    return 0;
-  }
-
-  if (cloog_constraint_is_valid(lower) ||
-      !clast_equal_add(infos->equal, NULL, level, upper, infos))
-  { /* Finally, the equality. */
-		
-    /* If we have to make a block by dimension, we start the block. Function
-     * pprint knows if there is an equality, if this is the case, it checks
-     * for the same following condition to close the brace.
-     */
-    if (infos->options->block) {
-      struct clast_block *b = new_clast_block();
-      **next = &b->stmt;
-      *next = &b->body;
-    }
-		
-    e = clast_bound_from_constraint(upper, level, infos->names);
-    ass = new_clast_assignment(cloog_names_name_at_level(infos->names, level), e);
-
-    **next = &ass->stmt;
-    *next = &(**next)->next;
-  }
-
-  cloog_constraint_release(lower);
-  cloog_constraint_release(upper);
-
-  return 1;
-}
-
-
-/**
- * Insert a loop that is executed exactly once as an assignment.
- * In particular, the loop
- *
- *	for (i = e; i <= e; ++i) {
- *		S;
- *	}
- *
- * is generated as
- *
- *	i = e;
- *	S;
- *
- */
-static void insert_otl_for(CloogConstraintSet *constraints, int level,
-	struct clast_expr *e, struct clast_stmt ***next, CloogInfos *infos)
-{
-    const char *iterator;
-
-    iterator = cloog_names_name_at_level(infos->names, level);
-
-    if (!clast_equal_add(infos->equal, constraints, level,
-				cloog_constraint_invalid(), infos)) {
-	struct clast_assignment *ass;
-	if (infos->options->block) {
-	    struct clast_block *b = new_clast_block();
-	    **next = &b->stmt;
-	    *next = &b->body;
-	}
-	ass = new_clast_assignment(iterator, e);
-	**next = &ass->stmt;
-	*next = &(**next)->next;
-    } else {
-	free_clast_expr(e);
-    }
-}
-
-
-/**
- * Insert a loop that is executed at most once as an assignment followed
- * by a guard.  In particular, the loop
- *
- *	for (i = e1; i <= e2; ++i) {
- *		S;
- *	}
- *
- * is generated as
- *
- *	i = e1;
- *	if (i <= e2) {
- *		S;
- *	}
- *
- */
-static void insert_guarded_otl_for(CloogConstraintSet *constraints, int level,
-	struct clast_expr *e1, struct clast_expr *e2,
-	struct clast_stmt ***next, CloogInfos *infos)
-{
-    const char *iterator;
-    struct clast_assignment *ass;
-    struct clast_guard *guard;
-
-    iterator = cloog_names_name_at_level(infos->names, level);
-
-    if (infos->options->block) {
-	struct clast_block *b = new_clast_block();
-	**next = &b->stmt;
-	*next = &b->body;
-    }
-    ass = new_clast_assignment(iterator, e1);
-    **next = &ass->stmt;
-    *next = &(**next)->next;
-
-    guard = new_clast_guard(1);
-    guard->eq[0].sign = -1;
-    guard->eq[0].LHS = &new_clast_term(infos->state->one,
-				       &new_clast_name(iterator)->expr)->expr;
-    guard->eq[0].RHS = e2;
-
-    **next = &guard->stmt;
-    *next = &guard->then;
-}
-
-
-/**
- * insert_for function:
- * This function inserts a for loop in the clast.
- * Returns 1 if the calling function should recurse into inner loops.
- *
- * A loop header according to an element is the conjunction of a minimum and a
- * maximum on a given element (they give the loop bounds).
- * For instance, considering these constraints and the element j:
- * i + j -9*M >= 0
- *    -j +5*M >= 0
- *     j -4*M >= 0
- * this function should return 'for (j=max(-i+9*M,4*M),j<=5*M;j++) {'.
- * - constraints contains all constraints,
- * - level is the column number of the element in matrix we want to use,
- * - otl is set if the loop is executed at most once,
- * - the infos structure gives the user some options about code printing,
- *   the number of parameters in matrix (nb_par), and the arrays of iterator
- *   names and parameters (iters and params). 
- */
-static int insert_for(CloogDomain *domain, CloogConstraintSet *constraints,
-                      int level, int otl, struct clast_stmt ***next,
-                      CloogInfos *infos)
-{
-  const char *iterator;
-  struct clast_expr *e1;
-  struct clast_expr *e2;
-  
-  e1 = clast_minmax(constraints, level, 1, 0, 1, 0, infos);
-  e2 = clast_minmax(constraints, level, 0, 0, 0, 0, infos);
-
-  if (clast_expr_is_bigger_constant(e1, e2)) {
-    free_clast_expr(e1);
-    free_clast_expr(e2);
-    return 0;
-  }
-
-  /* If min and max are not equal there is a 'for' else, there is a '='.
-   * In the special case e1 = e2 = NULL, this is an infinite loop
-   * so this is not a '='.
-   */
-  if (e1 && e2 && infos->options->otl && clast_expr_equal(e1, e2)) {
-    free_clast_expr(e2);
-    insert_otl_for(constraints, level, e1, next, infos);
-  } else if (otl) {
-    insert_guarded_otl_for(constraints, level, e1, e2, next, infos);
-  } else {
-    struct clast_for *f;
-    iterator = cloog_names_name_at_level(infos->names, level);
-
-    f = new_clast_for(domain, iterator, e1, e2, infos->stride[level-1]);
-    **next = &f->stmt;
-    *next = &f->body;
-  }
-
-  return 1;    
-}
-
-
-/**
- * insert_block function:
- * This function inserts a statement block.
- * - block is the statement block,
- * - level is the number of loops enclosing the statement,
- * - the infos structure gives the user some options about code printing,
- *   the number of parameters in domain (nb_par), and the arrays of iterator
- *   names and parameters (iters and params). 
- **
- * - September 21th 2003: first version (pick from pprint function). 
- */
-static void insert_block(CloogDomain *domain, CloogBlock *block, int level,
-			 struct clast_stmt ***next, CloogInfos *infos)
-{
-    CloogStatement * statement ;
-    struct clast_stmt *subs;
-   
-    if (!block)
-	return;
-
-    for (statement = block->statement; statement; statement = statement->next) {
-	CloogStatement *s_next = statement->next;
-
-	subs = clast_equal(level,infos);
-
-	statement->next = NULL;
-	**next = &new_clast_user_stmt(domain, statement, subs)->stmt;
-	statement->next = s_next;
-	*next = &(**next)->next;
-    }
-}
-
-
-/**
- * insert_loop function:
- * This function converts the content of a CloogLoop structure (loop) into a
- * clast_stmt (inserted at **next).
- * The iterator (level) of
- * the current loop is given by 'level': this is the column number of the
- * domain corresponding to the current loop iterator. The data of a loop are
- * written in this order:
- * 1. The guard of the loop, i.e. each constraint in the domain that does not
- *    depend on the iterator (when the entry in the column 'level' is 0).
- * 2. The iteration domain of the iterator, given by the constraints in the
- *    domain depending on the iterator, i.e.:
- *    * an equality if the iterator has only one value (possibly preceded by
- *      a guard verifying if this value is integral), *OR*
- *    * a loop from the minimum possible value of the iterator to the maximum
- *      possible value.
- * 3. The included statement block.
- * 4. The inner loops (recursive call).
- * 5. The following loops (recursive call).
- * - level is the recursion level or the iteration level that we are printing,
- * - the infos structure gives the user some options about code printing,
- *   the number of parameters in domain (nb_par), and the arrays of iterator
- *   names and parameters (iters and params). 
- **
- * - November   2nd 2001: first version. 
- * - March      6th 2003: infinite domain support. 
- * - April     19th 2003: (debug) NULL loop support. 
- * - June      29th 2003: non-unit strides support.
- * - April     28th 2005: (debug) level is level+equality when print statement!
- * - June      16th 2005: (debug) the N. Vasilache normalization step has been
- *                        added to avoid iteration duplication (see DaeGon Kim
- *                        bug in cloog_program_generate). Try vasilache.cloog
- *                        with and without the call to cloog_polylib_matrix_normalize,
- *                        using -f 8 -l 9 options for an idea.
- * - September 15th 2005: (debug) don't close equality braces when unnecessary.
- * - October   16th 2005: (debug) scalar value is saved for next loops.
- */
-static void insert_loop(CloogLoop * loop, int level,
-			struct clast_stmt ***next, CloogInfos *infos)
-{
-    int equality = 0;
-    CloogConstraintSet *constraints, *temp;
-    struct clast_stmt **top = *next;
-    CloogConstraint *i, *j;
-    int empty_loop = 0;
-
-    /* It can happen that loop be NULL when an input polyhedron is empty. */
-    if (loop == NULL)
-	return;
-
-    /* The constraints do not always have a shape that allows us to generate code from it,
-    * thus we normalize it, we also simplify it with the equalities.
-    */ 
-    temp = cloog_domain_constraints(loop->domain);
-    cloog_constraint_set_normalize(temp,level);
-    constraints = cloog_constraint_set_simplify(temp,infos->equal,level,
-				   infos->names->nb_parameters);
-    cloog_constraint_set_free(temp);
-    if (level) {
-	infos->stride[level - 1] = loop->stride;
-	infos->stride_level++;
-    }
-
-    /* First of all we have to print the guard. */
-    insert_guard(constraints,level, next, infos);
-
-    if (level && cloog_constraint_set_contains_level(constraints, level,
-					infos->names->nb_parameters)) {
-	/* We scan all the constraints to know in which case we are :
-	 * [[if] equation] or [for].
-	 */
-	if (cloog_constraint_is_valid(i =
-		cloog_constraint_set_defining_equality(constraints, level))) {
-          empty_loop = !insert_equation(loop->unsimplified, i,
-                                        cloog_constraint_invalid(), level, next,
-                                        infos);
-	  equality = 1 ;   
-	} else if (cloog_constraint_is_valid(i =
-		    cloog_constraint_set_defining_inequalities(constraints,
-			      level, &j, infos->names->nb_parameters))) {
-            empty_loop = !insert_equation(loop->unsimplified, i, j, level, next,
-                                          infos);
-	} else
-	    empty_loop = !insert_for(loop->unsimplified, constraints, level,
-                                     loop->otl, next, infos);
-    }
-
-    if (!empty_loop) {
-	/* Finally, if there is an included statement block, print it. */
-	insert_block(loop->unsimplified, loop->block, level+equality, next, infos);
-
-	/* Go to the next level. */
-	if (loop->inner != NULL)
-	    insert_loop(loop->inner, level+1, next, infos);
-    }
-
-    if (level) {
-      cloog_equal_del(infos->equal,level);
-      infos->stride_level--;
-    }
-    cloog_constraint_set_free(constraints);
-
-    /* Go to the next loop on the same level. */
-    while (*top)
-	top = &(*top)->next;
-    if (loop->next != NULL)
-	insert_loop(loop->next, level, &top,infos);
-}
-
-
-struct clast_stmt *cloog_clast_create(CloogProgram *program,
-				      CloogOptions *options)
-{
-    CloogInfos *infos = ALLOC(CloogInfos);
-    int nb_levels;
-    struct clast_stmt *root = &new_clast_root(program->names)->stmt;
-    struct clast_stmt **next = &root->next;
-
-    infos->state      = options->state;
-    infos->names    = program->names;
-    infos->options  = options;
-    infos->scaldims = program->scaldims;
-    infos->nb_scattdims = program->nb_scattdims;
-
-    /* Allocation for the array of strides, there is a +1 since the statement can
-    * be included inside an external loop without iteration domain.
-    */ 
-    nb_levels = program->names->nb_scattering+program->names->nb_iterators+1;
-    infos->stride = ALLOCN(CloogStride *, nb_levels);
-    infos->stride_level = 0;
-
-    infos->equal = cloog_equal_alloc(nb_levels,
-			       nb_levels, program->names->nb_parameters);
-	
-    insert_loop(program->loop, 0, &next, infos);
-
-    cloog_equal_free(infos->equal);
-
-    free(infos->stride);
-    free(infos);
-
-    return root;
-}
-
-
-struct clast_stmt *cloog_clast_create_from_input(CloogInput *input,
-						 CloogOptions *options)
-{
-    CloogProgram *program;
-    struct clast_stmt *root;
-
-    program = cloog_program_alloc(input->context, input->ud, options);
-    free(input);
-
-    program = cloog_program_generate(program, options);
-
-    root = cloog_clast_create(program, options);
-    cloog_program_free(program);
-
-    return root;
-}
diff --git a/cloog-0.17.0/source/cloog.c b/cloog-0.17.0/source/cloog.c
deleted file mode 100644
index 0a42a67..0000000
--- a/cloog-0.17.0/source/cloog.c
+++ /dev/null
@@ -1,98 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                             cloog.c                               **
-    **-------------------------------------------------------------------**
-    **       First version: october 25th 2001, CLooG's birth date !      **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-# include <stdlib.h>
-# include <stdio.h>
-# include "../include/cloog/cloog.h"
-
-
-int main(int argv, char * argc[])
-{ CloogProgram * program ;
-  CloogOptions * options ;
-  CloogState *state;
-  FILE * input, * output ;
-   
-  state = cloog_state_malloc();
-
-  /* Options and input/output file setting. */
-  cloog_options_read(state, argv, argc, &input, &output, &options);
-
-  /* Reading the program informations. */
-  program = cloog_program_read(input,options) ;
-  fclose(input) ;
-  
-  /* Generating and printing the code. */
-  program = cloog_program_generate(program,options) ;
-  if (options->structure)
-  cloog_program_print(stdout,program) ;
-  cloog_program_pprint(output,program,options) ;
-  cloog_program_free(program) ;
-
-  /* Printing the allocation statistics if asked. */
-  if (options->leaks) {
-    fprintf(output,"/* Domains    : allocated=%5d, freed=%5d, max=%5d. */\n",
-           state->domain_allocated, state->domain_freed, state->domain_max);
-    fprintf(output,"/* Loops      : allocated=%5d, freed=%5d, max=%5d. */\n",
-           state->loop_allocated, state->loop_freed, state->loop_max);
-    fprintf(output,"/* Statements : allocated=%5d, freed=%5d, max=%5d. */\n",
-           state->statement_allocated, state->statement_freed, state->statement_max);
-    fprintf(output,"/* Blocks     : allocated=%5d, freed=%5d, max=%5d. */\n",
-           state->block_allocated, state->block_freed, state->block_max);
-  }
-
-  /* Inform the user in case of a problem with the allocation statistics. */
-  if ((state->domain_allocated    != state->domain_freed)    ||
-      (state->loop_allocated      != state->loop_freed)      ||
-      (state->statement_allocated != state->statement_freed) ||
-      (state->block_allocated     != state->block_freed))
-  {
-    cloog_msg(options, CLOOG_INFO,
-            "an internal problem has been detected (it should have"
-	    " no\n             consequence on the correctness of the output)."
-	    " Please send (if\n	     you can) your input file, the first line "
-	    "given by typing 'cloog -v'\n	     and your full command "
-            "line call to CLooG including options to\n	     <cedric.bastoul"
-	    "@inria.fr>. Thank you for your participation to get\n"
-	    "	     CLooG better and safer.\n") ;
-  }
-
-  cloog_options_free(options) ;
-  cloog_state_free(state);
-  fclose(output) ;
-  return 0;
-}
-
diff --git a/cloog-0.17.0/source/input.c b/cloog-0.17.0/source/input.c
deleted file mode 100644
index 8195392..0000000
--- a/cloog-0.17.0/source/input.c
+++ /dev/null
@@ -1,218 +0,0 @@
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include "../include/cloog/cloog.h"
-
-#ifdef OSL_SUPPORT
-#include <osl/scop.h>
-#endif
-
-#define ALLOC(type) (type*)malloc(sizeof(type))
-
-static char *next_line(FILE *input, char *line, unsigned len)
-{
-	char *p;
-
-	do {
-		if (!(p = fgets(line, len, input)))
-			return NULL;
-		while (isspace(*p) && *p != '\n')
-			++p;
-	} while (*p == '#' || *p == '\n');
-
-	return p;
-}
-
-#ifdef OSL_SUPPORT
-/**
- * This function translates an OpenScop scop to a CLooG input.
- * \param[in,out] state CLooG state.
- * \param[in]     scop  Scop to translate.
- * \return A CloogInput corresponding to the scop input.
- */
-CloogInput *cloog_input_from_osl_scop(CloogState *state, osl_scop_p scop) {
-  CloogInput *input    = NULL;
-  CloogDomain *context = NULL;
-  CloogUnionDomain *ud = NULL;
-
-  if (scop) {
-    /* Extract the context. */
-    context = cloog_domain_from_osl_relation(state, scop->context);
-
-    /* Extract the union of domains. */
-    ud = cloog_union_domain_from_osl_scop(state, scop);
-
-    /* Build and return the input. */
-    input = cloog_input_alloc(context, ud);
-  }
-
-  return input;
-}
-#endif
-
-/**
- * Read input from a .cloog file, putting most of the information
- * in the returned CloogInput.  The chosen language is put in
- * options->language.
- */
-CloogInput *cloog_input_read(FILE *file, CloogOptions *options)
-{
-	char line[MAX_STRING];
-	char language;
-	CloogDomain *context;
-	CloogUnionDomain *ud;
-	int nb_par;
-
-#ifdef OSL_SUPPORT
-	if (options->openscop) {
-		osl_scop_p scop = osl_scop_read(file);
-		CloogInput * input = cloog_input_from_osl_scop(options->state,
-		                                               scop);
-		cloog_options_copy_from_osl_scop(scop, options);
-		return input;
-	}
-#endif
-
-	/* First of all, we read the language to use. */
-	if (!next_line(file, line, sizeof(line)))
-		cloog_die("Input error.\n");
-	if (sscanf(line, "%c", &language) != 1)
-		cloog_die("Input error.\n");
-   
-	if (language == 'f')
-		options->language = CLOOG_LANGUAGE_FORTRAN;
-	else
-		options->language = CLOOG_LANGUAGE_C;
-
-	/* We then read the context data. */
-	context = cloog_domain_read_context(options->state, file);
-	nb_par = cloog_domain_parameter_dimension(context);
-
-	ud = cloog_union_domain_read(file, nb_par, options);
-
-	return cloog_input_alloc(context, ud);
-}
-
-/**
- * Create a CloogInput from a CloogDomain context and a CloogUnionDomain.
- */
-CloogInput *cloog_input_alloc(CloogDomain *context, CloogUnionDomain *ud)
-{
-	CloogInput *input;
-
-	input = ALLOC(CloogInput);
-	if (!input)
-		cloog_die("memory overflow.\n");
-
-	input->context = context;
-	input->ud = ud;
-
-	return input;
-}
-
-void cloog_input_free(CloogInput *input)
-{
-	cloog_domain_free(input->context);
-	cloog_union_domain_free(input->ud);
-	free(input);
-}
-
-static void print_names(FILE *file, CloogUnionDomain *ud,
-	enum cloog_dim_type type, const char *name)
-{
-	int i;
-
-	fprintf(file, "\n%d # %s name(s)\n", ud->name[type] ? 1 : 0, name);
-	if (!ud->name[type])
-		return;
-
-	for (i = 0; i < ud->n_name[type]; i++)
-		fprintf(file, "%s ", ud->name[type][i]);
-
-	fprintf(file, "\n");
-}
-
-/**
- * Dump the .cloog description of a CloogInput and a CloogOptions data structure
- * into a file. The generated .cloog file will contain the same information as
- * the data structures. The file can be used to run the cloog program on the
- * example.
- */
-void cloog_input_dump_cloog(FILE *file, CloogInput *input, CloogOptions *opt)
-{
-        int i, num_statements;
-        CloogUnionDomain *ud = input->ud;
-        CloogNamedDomainList *ndl = ud->domain;
-
-        fprintf(file,
-                "# CLooG -> CLooG\n"
-                "# This is an automatic dump of a CLooG input file from a "
-                "CloogInput data\n"
-                "# structure.\n\n");
-
-        /* Language. */
-        if (opt->language == CLOOG_LANGUAGE_FORTRAN) {
-                fprintf(file, "# Language: FORTRAN\n");
-                fprintf(file, "f\n\n");
-        } else {
-                fprintf(file, "# Language: C\n");
-                fprintf(file, "c\n\n");
-        }
-
-        /* Context. */
-        fprintf(file, "# Context:\n");
-        cloog_domain_print_constraints(file, input->context, 1);
-
-	print_names(file, ud, CLOOG_PARAM, "Parameter");
-
-        /* Statement number. */
-        i = 0;
-        while (ndl != NULL) {
-        	i++;
-        	ndl = ndl->next;
-        }
-        num_statements = i;
-        fprintf(file, "\n# Statement number:\n%d\n\n", num_statements);
-
-        /* Iteration domains. */
-        i = 1;
-        ndl = ud->domain;
-        while (ndl != NULL) {
-                fprintf(file, "# Iteration domain of statement %d (%s).\n", i,
-                        ndl->name);
-
-                cloog_domain_print_constraints(file, ndl->domain, 1);
-                fprintf(file,"\n0 0 0 # For future options.\n\n");
-
-                i++;
-                ndl = ndl->next;
-        }
-
-	print_names(file, ud, CLOOG_ITER, "Iterator");
-
-        /* Exit, if no scattering is supplied. */
-        if (!ud->domain || !ud->domain->scattering) {
-                fprintf(file, "# No scattering functions.\n0\n\n");
-                return;
-        }
-
-        /* Scattering relations. */
-        fprintf(file,
-                "# --------------------- SCATTERING --------------------\n");
-
-        fprintf(file, "%d # Scattering functions\n", num_statements);
-
-        i = 1;
-        ndl = ud->domain;
-        while (ndl != NULL) {
-                fprintf(file, "\n# Scattering of statement %d (%s).\n", i,
-                        ndl->name);
-
-                cloog_scattering_print_constraints(file, ndl->scattering);
-
-                i++;
-                ndl = ndl->next;
-        }
-
-	print_names(file, ud, CLOOG_SCAT, "Scattering dimension");
-}
diff --git a/cloog-0.17.0/source/int.c b/cloog-0.17.0/source/int.c
deleted file mode 100644
index 67f62df..0000000
--- a/cloog-0.17.0/source/int.c
+++ /dev/null
@@ -1,177 +0,0 @@
-#include <stdlib.h>
-#include "../include/cloog/cloog.h"
-
-#define ALLOC(type) (type*)malloc(sizeof(type))
-#define ALLOCN(type,n) (type*)malloc((n)*sizeof(type))
-
-#if defined(CLOOG_INT_INT) || \
-    defined(CLOOG_INT_LONG) || \
-    defined(CLOOG_INT_LONG_LONG)
-
-cloog_int_t cloog_gcd(cloog_int_t a, cloog_int_t b)
-{
-	while (a) {
-		cloog_int_t t = b % a;
-		b = a;
-		a = t;
-	}
-	if (b < 0)
-		b = -b;
-	return b;
-}
-
-#endif
-
-struct cloog_vec *cloog_vec_alloc(unsigned size)
-{
-	int i;
-	struct cloog_vec *vec;
-
-	vec = ALLOC(struct cloog_vec);
-	if (!vec)
-		return NULL;
-
-	vec->p = ALLOCN(cloog_int_t, size);
-	if (!vec->p)
-		goto error;
-	vec->size = size;
-
-	for (i = 0; i < size; ++i)
-		cloog_int_init(vec->p[i]);
-
-	return vec;
-error:
-	free(vec);
-	return NULL;
-}
-
-void cloog_vec_free(struct cloog_vec *vec)
-{
-	int i;
-
-	if (!vec)
-		return;
-
-	for (i = 0; i < vec->size; ++i)
-		cloog_int_clear(vec->p[i]);
-	free(vec->p);
-	free(vec);
-}
-
-void cloog_vec_dump(struct cloog_vec *vec)
-{
-	int i;
-
-	for (i = 0; i < vec->size; ++i) {
-		cloog_int_print(stderr, vec->p[i]);
-		fprintf(stderr, " ");
-	}
-	fprintf(stderr, "\n");
-}
-
-int cloog_seq_first_non_zero(cloog_int_t *p, unsigned len)
-{
-	int i;
-
-	for (i = 0; i < len; ++i)
-		if (!cloog_int_is_zero(p[i]))
-			return i;
-	return -1;
-}
-
-void cloog_seq_neg(cloog_int_t *dst, cloog_int_t *src, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		cloog_int_neg(dst[i], src[i]);
-}
-
-void cloog_seq_cpy(cloog_int_t *dst, cloog_int_t *src, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		cloog_int_set(dst[i], src[i]);
-}
-
-static void cloog_seq_scale_down(cloog_int_t *dst, cloog_int_t *src, cloog_int_t m, unsigned len)
-{
-	int i;
-	for (i = 0; i < len; ++i)
-		cloog_int_divexact(dst[i], src[i], m);
-}
-
-void cloog_seq_combine(cloog_int_t *dst, cloog_int_t m1, cloog_int_t *src1,
-			cloog_int_t m2, cloog_int_t *src2, unsigned len)
-{
-	int i;
-	cloog_int_t tmp;
-
-	cloog_int_init(tmp);
-	for (i = 0; i < len; ++i) {
-		cloog_int_mul(tmp, m1, src1[i]);
-		cloog_int_addmul(tmp, m2, src2[i]);
-		cloog_int_set(dst[i], tmp);
-	}
-	cloog_int_clear(tmp);
-}
-
-static int cloog_seq_abs_min_non_zero(cloog_int_t *p, unsigned len)
-{
-	int i, min = cloog_seq_first_non_zero(p, len);
-	if (min < 0)
-		return -1;
-	for (i = min + 1; i < len; ++i) {
-		if (cloog_int_is_zero(p[i]))
-			continue;
-		if (cloog_int_abs_lt(p[i], p[min]))
-			min = i;
-	}
-	return min;
-}
-
-void cloog_seq_gcd(cloog_int_t *p, unsigned len, cloog_int_t *gcd)
-{
-	int i, min = cloog_seq_abs_min_non_zero(p, len);
-
-	if (min < 0) {
-		cloog_int_set_si(*gcd, 0);
-		return;
-	}
-	cloog_int_abs(*gcd, p[min]);
-	for (i = 0; cloog_int_cmp_si(*gcd, 1) > 0 && i < len; ++i) {
-		if (i == min)
-			continue;
-		if (cloog_int_is_zero(p[i]))
-			continue;
-		cloog_int_gcd(*gcd, *gcd, p[i]);
-	}
-}
-
-int cloog_seq_is_neg(cloog_int_t *p1, cloog_int_t *p2, unsigned len)
-{
-	int i;
-
-	for (i = 0; i < len; ++i) {
-		if (cloog_int_abs_ne(p1[i], p2[i]))
-			return 0;
-		if (cloog_int_is_zero(p1[i]))
-			continue;
-		if (cloog_int_eq(p1[i], p2[i]))
-			return 0;
-	}
-	return 1;
-}
-
-void cloog_seq_normalize(cloog_int_t *p, unsigned len)
-{
-	cloog_int_t gcd;
-
-	if (len == 0)
-		return;
-
-	cloog_int_init(gcd);
-	cloog_seq_gcd(p, len, &gcd);
-	if (!cloog_int_is_zero(gcd) && !cloog_int_is_one(gcd))
-		cloog_seq_scale_down(p, p, gcd, len);
-	cloog_int_clear(gcd);
-}
diff --git a/cloog-0.17.0/source/isl/backend.c b/cloog-0.17.0/source/isl/backend.c
deleted file mode 100644
index 6ddb9f9..0000000
--- a/cloog-0.17.0/source/isl/backend.c
+++ /dev/null
@@ -1,37 +0,0 @@
-#include <cloog/isl/cloog.h>
-
-/**
- * Allocate and initialize full state.
- */
-CloogState *cloog_state_malloc(void)
-{
-	return cloog_isl_state_malloc(NULL);
-}
-
-/**
- * Allocate and initialize full state for isl backend.
- */
-CloogState *cloog_isl_state_malloc(struct isl_ctx *ctx)
-{
-	CloogState *state;
-	int allocated = !ctx;
-
-	state = cloog_core_state_malloc();
-	if (!ctx)
-		ctx = isl_ctx_alloc();
-	state->backend = isl_alloc_type(ctx, CloogBackend);
-	state->backend->ctx = ctx;
-	state->backend->ctx_allocated = allocated;
-	return state;
-}
-
-/**
- * Free state and backend independent parts.
- */
-void cloog_state_free(CloogState *state)
-{
-	if (state->backend->ctx_allocated)
-		isl_ctx_free(state->backend->ctx);
-	free(state->backend);
-	cloog_core_state_free(state);
-}
diff --git a/cloog-0.17.0/source/isl/constraints.c b/cloog-0.17.0/source/isl/constraints.c
deleted file mode 100644
index 1fb1690..0000000
--- a/cloog-0.17.0/source/isl/constraints.c
+++ /dev/null
@@ -1,966 +0,0 @@
-#include <stdlib.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <cloog/isl/cloog.h>
-#include <cloog/isl/backend.h>
-#include <isl/aff.h>
-#include <isl/set.h>
-
-
-#define ALLOC(type) (type*)malloc(sizeof(type))
-#define ALLOCN(type,n) (type*)malloc((n)*sizeof(type))
-
-CloogConstraintSet *cloog_constraint_set_from_isl_basic_set(struct isl_basic_set *bset)
-{
-	return (CloogConstraintSet *)bset;
-}
-
-CloogConstraint *cloog_constraint_from_isl_constraint(struct isl_constraint *constraint)
-{
-	return (CloogConstraint *)constraint;
-}
-
-isl_constraint *cloog_constraint_to_isl(CloogConstraint *constraint)
-{
-	return (isl_constraint *)constraint;
-}
-
-isl_basic_set *cloog_constraints_set_to_isl(CloogConstraintSet *constraints)
-{
-	return (isl_basic_set *)constraints;
-}
-
-
-/******************************************************************************
- *                             Memory leaks hunting                           *
- ******************************************************************************/
-
-
-
-void cloog_constraint_set_free(CloogConstraintSet *constraints)
-{
-	isl_basic_set_free(cloog_constraints_set_to_isl(constraints));
-}
-
-
-int cloog_constraint_set_contains_level(CloogConstraintSet *constraints,
-			int level, int nb_parameters)
-{
-	isl_basic_set *bset;
-	bset = cloog_constraints_set_to_isl(constraints);
-	return isl_basic_set_dim(bset, isl_dim_set) >= level;
-}
-
-struct cloog_isl_dim {
-	enum isl_dim_type type;
-	int		  pos;
-};
-
-static struct cloog_isl_dim basic_set_cloog_dim_to_isl_dim(
-	__isl_keep isl_basic_set *bset, int pos)
-{
-	enum isl_dim_type types[] = { isl_dim_set, isl_dim_div, isl_dim_param };
-	int i;
-	struct cloog_isl_dim ci_dim;
-
-	for (i = 0; i < 3; ++i) {
-		unsigned dim = isl_basic_set_dim(bset, types[i]);
-		if (pos < dim) {
-			ci_dim.type = types[i];
-			ci_dim.pos = pos;
-			return ci_dim;
-		}
-		pos -= dim;
-	}
-	assert(0);
-}
-
-static struct cloog_isl_dim set_cloog_dim_to_isl_dim(
-	CloogConstraintSet *constraints, int pos)
-{
-	isl_basic_set *bset;
-
-	bset = cloog_constraints_set_to_isl(constraints);
-	return basic_set_cloog_dim_to_isl_dim(bset, pos);
-}
-
-/* Check if the variable at position level is defined by an
- * equality.  If so, return the row number.  Otherwise, return -1.
- */
-CloogConstraint *cloog_constraint_set_defining_equality(
-	CloogConstraintSet *constraints, int level)
-{
-	struct isl_constraint *c;
-	struct cloog_isl_dim dim;
-	isl_basic_set *bset;
-
-	bset = cloog_constraints_set_to_isl(constraints);
-	dim = set_cloog_dim_to_isl_dim(constraints, level - 1);
-	if (isl_basic_set_has_defining_equality(bset, dim.type, dim.pos, &c))
-		return cloog_constraint_from_isl_constraint(c);
-	else
-		return NULL;
-}
-
-
-struct cloog_isl_other {
-	int level;
-	int found;
-	isl_constraint *u;
-	isl_constraint *l;
-};
-
-
-/* Set other->found to 1 if the given constraint involves other->level
- * and is different from other->u and other->l.
- */
-static int check_other_constraint(__isl_take isl_constraint *c, void *user)
-{
-	struct cloog_isl_other *other = user;
-	CloogConstraint *cc;
-
-	if (!isl_constraint_is_equal(c, other->l) &&
-	    !isl_constraint_is_equal(c, other->u)) {
-		cc = cloog_constraint_from_isl_constraint(c);
-		if (cloog_constraint_involves(cc, other->level - 1))
-			other->found = 1;
-	}
-
-	isl_constraint_free(c);
-
-	return other->found ? -1 : 0;
-}
-
-
-/* Check if the variable (e) at position level is defined by a
- * pair of inequalities
- *		 <a, i> + -m e +  <b, p> + k1 >= 0
- *		<-a, i> +  m e + <-b, p> + k2 >= 0
- * with 0 <= k1 + k2 < m
- * If so return the row number of the upper bound and set *lower
- * to the row number of the lower bound.  If not, return -1.
- *
- * If the variable at position level occurs in any other constraint,
- * then we currently return -1.  The modulo guard that we would generate
- * would still be correct, but we would also need to generate
- * guards corresponding to the other constraints, and this has not
- * been implemented yet.
- */
-CloogConstraint *cloog_constraint_set_defining_inequalities(
-	CloogConstraintSet *constraints,
-	int level, CloogConstraint **lower, int nb_par)
-{
-	struct isl_constraint *u;
-	struct isl_constraint *l;
-	struct cloog_isl_dim dim;
-	struct isl_basic_set *bset;
-	struct cloog_isl_other other;
-
-	bset = cloog_constraints_set_to_isl(constraints);
-	dim = set_cloog_dim_to_isl_dim(constraints, level - 1);
-	if (!isl_basic_set_has_defining_inequalities(bset, dim.type, dim.pos,
-								&l, &u))
-		return cloog_constraint_invalid();
-
-	other.l = l;
-	other.u = u;
-	other.found = 0;
-	other.level = level;
-	isl_basic_set_foreach_constraint(bset, &check_other_constraint, &other);
-	if (other.found) {
-		isl_constraint_free(l);
-		isl_constraint_free(u);
-		*lower = NULL;
-		return NULL;
-	}
-	*lower = cloog_constraint_from_isl_constraint(l);
-	return cloog_constraint_from_isl_constraint(u);
-}
-
-int cloog_constraint_set_total_dimension(CloogConstraintSet *constraints)
-{
-	isl_basic_set *bset;
-	bset = cloog_constraints_set_to_isl(constraints);
-	return isl_basic_set_total_dim(bset);
-}
-
-int cloog_constraint_set_n_iterators(CloogConstraintSet *constraints, int n_par)
-{
-	isl_basic_set *bset;
-	bset = cloog_constraints_set_to_isl(constraints);
-	return isl_basic_set_dim(bset, isl_dim_set);
-}
-
-
-/******************************************************************************
- *                        Equalities spreading functions                      *
- ******************************************************************************/
-
-
-/* Equalities are stored inside a Matrix data structure called "equal".
- * This matrix has (nb_scattering + nb_iterators + 1) rows (i.e. total
- * dimensions + 1, the "+ 1" is because a statement can be included inside an
- * external loop without iteration domain), and (nb_scattering + nb_iterators +
- * nb_parameters + 2) columns (all unknowns plus the scalar plus the equality
- * type). The ith row corresponds to the equality "= 0" for the ith dimension
- * iterator. The first column gives the equality type (0: no equality, then
- * EQTYPE_* -see pprint.h-). At each recursion of pprint, if an equality for
- * the current level is found, the corresponding row is updated. Then the
- * equality if it exists is used to simplify expressions (e.g. if we have 
- * "i+1" while we know that "i=2", we simplify it in "3"). At the end of
- * the pprint call, the corresponding row is reset to zero.
- */
-
-CloogEqualities *cloog_equal_alloc(int n, int nb_levels, int nb_parameters)
-{
-	int i;
-	CloogEqualities *equal = ALLOC(CloogEqualities);
-
-	equal->total_dim = nb_levels - 1 + nb_parameters;
-	equal->n = n;
-	equal->constraints = ALLOCN(isl_constraint *, n);
-	equal->types = ALLOCN(int, n);
-	for (i = 0; i < n; ++i) {
-		equal->constraints[i] = NULL;
-		equal->types[i] = EQTYPE_NONE;
-	}
-	return equal;
-}
-
-int cloog_equal_total_dimension(CloogEqualities *equal)
-{
-	return equal->total_dim;
-}
-
-void cloog_equal_free(CloogEqualities *equal)
-{
-	int i;
-
-	for (i = 0; i < equal->n; ++i)
-		isl_constraint_free(equal->constraints[i]);
-	free(equal->constraints);
-	free(equal->types);
-	free(equal);
-}
-
-int cloog_equal_count(CloogEqualities *equal)
-{
-	return equal->n;
-}
-
-
-/**
- * cloog_constraint_equal_type function :
- * This function returns the type of the equality in the constraint (line) of
- * (constraints) for the element (level). An equality is 'constant' iff all
- * other factors are null except the constant one. It is a 'pure item' iff
- * it is equal or opposite to a single variable or parameter.
- * Otherwise it is an 'affine expression'.
- * For instance:
- *   i = -13 is constant, i = j, j = -M are pure items,
- *   j = 2*M, i = j+1, 2*j = M are affine expressions.
- *
- * - constraints is the matrix of constraints,
- * - level is the column number in equal of the element which is 'equal to',
- */
-static int cloog_constraint_equal_type(CloogConstraint *cc, int level)
-{ 
-	int i;
-	isl_int c;
-	int type = EQTYPE_NONE;
-	struct isl_constraint *constraint = cloog_constraint_to_isl(cc);
-    
-	isl_int_init(c);
-	isl_constraint_get_constant(constraint, &c);
-	if (!isl_int_is_zero(c))
-		type = EQTYPE_CONSTANT;
-	isl_constraint_get_coefficient(constraint, isl_dim_set, level - 1, &c);
-	if (!isl_int_is_one(c) && !isl_int_is_negone(c))
-		type = EQTYPE_EXAFFINE;
-	for (i = 0; i < isl_constraint_dim(constraint, isl_dim_param); ++i) {
-		isl_constraint_get_coefficient(constraint, isl_dim_param, i, &c);
-		if (isl_int_is_zero(c))
-			continue;
-		if ((!isl_int_is_one(c) && !isl_int_is_negone(c)) ||
-		    type != EQTYPE_NONE) {
-			type = EQTYPE_EXAFFINE;
-			break;
-		}
-		type = EQTYPE_PUREITEM;
-	}
-	for (i = 0; i < isl_constraint_dim(constraint, isl_dim_set); ++i) {
-		if (i == level - 1)
-			continue;
-		isl_constraint_get_coefficient(constraint, isl_dim_set, i, &c);
-		if (isl_int_is_zero(c))
-			continue;
-		if ((!isl_int_is_one(c) && !isl_int_is_negone(c)) ||
-		    type != EQTYPE_NONE) {
-			type = EQTYPE_EXAFFINE;
-			break;
-		}
-		type = EQTYPE_PUREITEM;
-	}
-	for (i = 0; i < isl_constraint_dim(constraint, isl_dim_div); ++i) {
-		isl_constraint_get_coefficient(constraint, isl_dim_div, i, &c);
-		if (isl_int_is_zero(c))
-			continue;
-		if ((!isl_int_is_one(c) && !isl_int_is_negone(c)) ||
-		    type != EQTYPE_NONE) {
-			type = EQTYPE_EXAFFINE;
-			break;
-		}
-		type = EQTYPE_PUREITEM;
-	}
-	isl_int_clear(c);
-
-	if (type == EQTYPE_NONE)
-		type = EQTYPE_CONSTANT;
-
-	return type;
-}
-
-
-int cloog_equal_type(CloogEqualities *equal, int level)
-{
-	return equal->types[level-1];
-}
-
-
-/**
- * cloog_equal_add function:
- * This function updates the row (level-1) of the equality matrix (equal) with
- * the row that corresponds to the row (line) of the matrix (matrix).
- * - equal is the matrix of equalities,
- * - matrix is the matrix of constraints,
- * - level is the column number in matrix of the element which is 'equal to',
- * - line is the line number in matrix of the constraint we want to study,
- * - the infos structure gives the user all options on code printing and more.
- **
- * line is set to an invalid constraint for equalities that CLooG itself has
- * discovered because the lower and upper bound of a loop happened to be equal.
- * This situation shouldn't happen in the isl port since isl should
- * have found the equality itself.
- */
-void cloog_equal_add(CloogEqualities *equal, CloogConstraintSet *matrix,
-			int level, CloogConstraint *line, int nb_par)
-{ 
-	isl_constraint *c;
-	assert(cloog_constraint_is_valid(line));
-  
-	equal->types[level-1] = cloog_constraint_equal_type(line, level);
-	c = cloog_constraint_to_isl(line);
-	equal->constraints[level - 1] = isl_constraint_copy(c);
-}
-
-
-/**
- * cloog_equal_del function :
- * This function reset the equality corresponding to the iterator (level)
- * in the equality matrix (equal).
- * - July 2nd 2002: first version. 
- */
-void cloog_equal_del(CloogEqualities *equal, int level)
-{ 
-	equal->types[level-1] = EQTYPE_NONE;
-	isl_constraint_free(equal->constraints[level - 1]);
-	equal->constraints[level-1] = NULL;
-}
-
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-
-/**
- * Function cloog_constraint_set_normalize:
- * This function will modify the constraint system in such a way that when
- * there is an equality depending on the element at level 'level', there are
- * no more (in)equalities depending on this element.
- *
- * The simplified form of isl automatically satisfies this condition.
- */
-void cloog_constraint_set_normalize(CloogConstraintSet *matrix, int level)
-{
-}
-
-
-
-/**
- * cloog_constraint_set_copy function:
- * this functions builds and returns a "hard copy" (not a pointer copy) of a
- * CloogConstraintSet data structure.
- */
-CloogConstraintSet *cloog_constraint_set_copy(CloogConstraintSet *constraints)
-{
-	isl_basic_set *bset;
-	bset = cloog_constraints_set_to_isl(constraints);
-	return cloog_constraint_set_from_isl_basic_set(isl_basic_set_dup(bset));
-}
-
-
-/**
- * cloog_constraint_set_simplify function:
- * this function simplify all constraints inside the matrix "matrix" thanks to
- * an equality matrix "equal" that gives for some elements of the affine
- * constraint an equality with other elements, preferably constants.
- * For instance, if a row of the matrix contains i+j+3>=0 and the equality
- * matrix gives i=n and j=2, the constraint is simplified to n+3>=0. The
- * simplified constraints are returned back inside a new simplified matrix.
- * - matrix is the set of constraints to simplify,
- * - equal is the matrix of equalities,
- * - level is a level we don't want to simplify (-1 if none),
- * - nb_par is the number of parameters of the program.
- **
- * isl should have performed these simplifications already in isl_set_gist.
- */
-CloogConstraintSet *cloog_constraint_set_simplify(CloogConstraintSet *matrix,
-	CloogEqualities *equal, int level, int nb_par)
-{
-	return cloog_constraint_set_copy(matrix);
-}
-
-
-static struct cloog_isl_dim constraint_cloog_dim_to_isl_dim(
-					CloogConstraint *constraint, int pos)
-{
-	enum isl_dim_type types[] = { isl_dim_set, isl_dim_div, isl_dim_param };
-	int i;
-	struct cloog_isl_dim ci_dim;
-
-	for (i = 0; i < 3; ++i) {
-		isl_constraint *c = cloog_constraint_to_isl(constraint);
-		unsigned dim = isl_constraint_dim(c, types[i]);
-		if (pos < dim) {
-			ci_dim.type = types[i];
-			ci_dim.pos = pos;
-			return ci_dim;
-		}
-		pos -= dim;
-	}
-	assert(0);
-}
-
-static struct clast_expr *div_expr(CloogConstraint *constraint, int pos,
-					CloogNames *names)
-{
-	int i, nb_elts;
-	unsigned dim = cloog_constraint_total_dimension(constraint);
-	cloog_int_t c;
-	struct clast_reduction *r;
-	struct clast_expr *e = NULL;
-	isl_aff *div;
-
-	div = isl_constraint_get_div(cloog_constraint_to_isl(constraint), pos);
-
-	cloog_int_init(c);
-	for (i = 0, nb_elts = 0; i < dim; ++i) {
-		struct cloog_isl_dim dim;
-
-		dim = constraint_cloog_dim_to_isl_dim(constraint, i);
-		if (dim.type == isl_dim_set)
-			dim.type = isl_dim_in;
-		isl_aff_get_coefficient(div, dim.type, dim.pos, &c);
-		if (!cloog_int_is_zero(c))
-			++nb_elts;
-	}
-	isl_aff_get_constant(div, &c);
-	if (!cloog_int_is_zero(c))
-		++nb_elts;
-
-	r = new_clast_reduction(clast_red_sum, nb_elts);
-	for (i = 0, nb_elts = 0; i < dim; ++i) {
-		struct clast_expr *v;
-		struct cloog_isl_dim dim;
-
-		dim = constraint_cloog_dim_to_isl_dim(constraint, i);
-		if (dim.type == isl_dim_set)
-			dim.type = isl_dim_in;
-		isl_aff_get_coefficient(div, dim.type, dim.pos, &c);
-		if (cloog_int_is_zero(c))
-			continue;
-
-		v = cloog_constraint_variable_expr(constraint, 1 + i, names);
-
-		r->elts[nb_elts++] = &new_clast_term(c, v)->expr;
-	}
-	isl_aff_get_constant(div, &c);
-	if (!cloog_int_is_zero(c))
-		r->elts[nb_elts++] = &new_clast_term(c, NULL)->expr;
-
-	isl_aff_get_denominator(div, &c);
-	e = &new_clast_binary(clast_bin_fdiv, &r->expr, c)->expr;
-
-	cloog_int_clear(c);
-
-	isl_aff_free(div);
-
-	return e;
-}
-
-/**
- * Return clast_expr corresponding to the variable "level" (1 based) in
- * the given constraint.
- */
-struct clast_expr *cloog_constraint_variable_expr(CloogConstraint *constraint,
-	int level, CloogNames *names)
-{
-	struct cloog_isl_dim dim;
-	const char *name;
-
-	assert(constraint);
-
-	dim = constraint_cloog_dim_to_isl_dim(constraint, level - 1);
-	if (dim.type == isl_dim_div)
-		return div_expr(constraint, dim.pos, names);
-
-	if (dim.type == isl_dim_set)
-		name = cloog_names_name_at_level(names, level);
-	else
-		name = names->parameters[dim.pos];
-
-	return &new_clast_name(name)->expr;
-}
-
-
-/**
- * Return true if constraint c involves variable v (zero-based).
- */
-int cloog_constraint_involves(CloogConstraint *constraint, int v)
-{
-	isl_int c;
-	int res;
-
-	isl_int_init(c);
-	cloog_constraint_coefficient_get(constraint, v, &c);
-	res = !isl_int_is_zero(c);
-	isl_int_clear(c);
-	return res;
-}
-
-int cloog_constraint_is_lower_bound(CloogConstraint *constraint, int v)
-{
-	isl_int c;
-	int res;
-
-	isl_int_init(c);
-	cloog_constraint_coefficient_get(constraint, v, &c);
-	res = isl_int_is_pos(c);
-	isl_int_clear(c);
-	return res;
-}
-
-int cloog_constraint_is_upper_bound(CloogConstraint *constraint, int v)
-{
-	isl_int c;
-	int res;
-
-	isl_int_init(c);
-	cloog_constraint_coefficient_get(constraint, v, &c);
-	res = isl_int_is_neg(c);
-	isl_int_clear(c);
-	return res;
-}
-
-int cloog_constraint_is_equality(CloogConstraint *constraint)
-{
-	return isl_constraint_is_equality(cloog_constraint_to_isl(constraint));
-}
-
-CloogConstraintSet *cloog_constraint_set_drop_constraint(
-	CloogConstraintSet *constraints, CloogConstraint *constraint)
-{
-	isl_basic_set *bset;
-	isl_constraint *c;
-
-	bset = cloog_constraints_set_to_isl(constraints);
-	c = cloog_constraint_to_isl(cloog_constraint_copy(constraint));
-	bset = isl_basic_set_drop_constraint(bset, c);
-	return cloog_constraint_set_from_isl_basic_set(bset);
-}
-
-void cloog_constraint_coefficient_get(CloogConstraint *constraint,
-			int var, cloog_int_t *val)
-{
-	struct cloog_isl_dim dim;
-	isl_constraint *c;
-
-	if (!constraint)
-		return;
-
-	dim = constraint_cloog_dim_to_isl_dim(constraint, var);
-	c = cloog_constraint_to_isl(constraint);
-	isl_constraint_get_coefficient(c, dim.type, dim.pos, val);
-}
-
-void cloog_constraint_coefficient_set(CloogConstraint *constraint,
-			int var, cloog_int_t val)
-{
-	struct cloog_isl_dim dim;
-	isl_constraint *c;
-
-	assert(constraint);
-
-	dim = constraint_cloog_dim_to_isl_dim(constraint, var);
-	c = cloog_constraint_to_isl(constraint);
-	isl_constraint_set_coefficient(c, dim.type, dim.pos, val);
-}
-
-void cloog_constraint_constant_get(CloogConstraint *constraint, cloog_int_t *val)
-{
-	isl_constraint_get_constant(cloog_constraint_to_isl(constraint), val);
-}
-
-/**
- * Copy the coefficient of constraint c into dst in PolyLib order,
- * i.e., first the coefficients of the variables, then the coefficients
- * of the parameters and finally the constant.
- */
-void cloog_constraint_copy_coefficients(CloogConstraint *constraint,
-					cloog_int_t *dst)
-{
-	int i;
-	unsigned dim;
-
-	dim = cloog_constraint_total_dimension(constraint);
-
-	for (i = 0; i < dim; ++i)
-		cloog_constraint_coefficient_get(constraint, i, dst+i);
-	cloog_constraint_constant_get(constraint, dst+dim);
-}
-
-CloogConstraint *cloog_constraint_invalid(void)
-{
-	return NULL;
-}
-
-int cloog_constraint_is_valid(CloogConstraint *constraint)
-{
-	return constraint != NULL;
-}
-
-int cloog_constraint_total_dimension(CloogConstraint *constraint)
-{
-	isl_constraint *c;
-	c = cloog_constraint_to_isl(constraint);
-	return isl_constraint_dim(c, isl_dim_all);
-}
-
-
-/**
- * Check whether there is any need for the constraint "upper" on
- * "level" to get reduced.
- * In case of the isl backend, there should be no need to do so
- * if the level corresponds to an existentially quantified variable.
- * Moreover, the way reduction is performed does not work for such
- * variables since its position might chance during the construction
- * of a set for reduction.
- */
-int cloog_constraint_needs_reduction(CloogConstraint *upper, int level)
-{
-	isl_basic_set *bset;
-	isl_constraint *c;
-	struct cloog_isl_dim dim;
-
-	c = cloog_constraint_to_isl(upper);
-	bset = isl_basic_set_from_constraint(isl_constraint_copy(c));
-	dim = basic_set_cloog_dim_to_isl_dim(bset, level - 1);
-	isl_basic_set_free(bset);
-
-	return dim.type == isl_dim_set;
-}
-
-
-/**
- * Create a CloogConstraintSet containing enough information to perform
- * a reduction on the upper equality (in this case lower is an invalid
- * CloogConstraint) or the pair of inequalities upper and lower
- * from within insert_modulo_guard.
- * In the isl backend, we return a CloogConstraintSet containing both
- * bounds, as the stride may change during the reduction and we may
- * need to recompute the bound on the modulo expression.
- */
-CloogConstraintSet *cloog_constraint_set_for_reduction(CloogConstraint *upper,
-	CloogConstraint *lower)
-{
-	struct isl_basic_set *bset;
-	isl_constraint *c;
-
-	c = cloog_constraint_to_isl(upper);
-	bset = isl_basic_set_from_constraint(isl_constraint_copy(c));
-	if (cloog_constraint_is_valid(lower)) {
-		c = cloog_constraint_to_isl(lower);
-		bset = isl_basic_set_add_constraint(bset,
-						    isl_constraint_copy(c));
-	}
-	return cloog_constraint_set_from_isl_basic_set(bset);
-}
-
-
-static int add_constant_term(CloogConstraint *c, void *user)
-{
-	isl_int *bound = (isl_int *)user;
-	isl_int v;
-
-	isl_int_init(v);
-
-	cloog_constraint_constant_get(c, &v);
-	isl_int_add(*bound, *bound, v);
-
-	isl_int_clear(v);
-
-	return 0;
-}
-
-
-/* Return an isl_basic_set representation of the equality stored
- * at position i in the given CloogEqualities.
- */
-static __isl_give isl_basic_set *equality_to_basic_set(CloogEqualities *equal,
-	int i)
-{
-	isl_constraint *c;
-	isl_basic_set *bset;
-	unsigned nparam;
-	unsigned nvar;
-
-	c = isl_constraint_copy(equal->constraints[i]);
-	bset = isl_basic_set_from_constraint(c);
-	nparam = isl_basic_set_dim(bset, isl_dim_param);
-	nvar = isl_basic_set_dim(bset, isl_dim_set);
-	bset = isl_basic_set_add(bset, isl_dim_set,
-				 equal->total_dim - (nparam + nvar));
-	return bset;
-}
-
-/**
- * Reduce the modulo guard expressed by "constraints" using equalities
- * found in outer nesting levels (stored in "equal").
- * The modulo guard may be an equality or a pair of inequalities.
- * In case of a pair of inequalities, *bound contains the bound on the
- * corresponding modulo expression.  If any reduction is performed
- * then this bound is recomputed.
- *
- * "level" may not correspond to an existentially quantified variable.
- *
- * We first check if there are any equalities we can use.  If not,
- * there is again nothing to reduce.
- * For the actual reduction, we use isl_basic_set_gist, but this
- * function will only perform the reduction we want here if the
- * the variable that imposes the modulo constraint has been projected
- * out (i.e., turned into an existentially quantified variable).
- * After the call to isl_basic_set_gist, we need to move the
- * existential variable back into the position where the calling
- * function expects it (assuming there are any constraints left).
- * We do this by adding an equality between the given dimension and
- * the existentially quantified variable.
- *
- * If there are no existentially quantified variables left, then
- * we don't need to add this equality.
- * If, on the other hand, the resulting basic set involves more
- * than one existentially quantified variable, then the caller
- * will not be able to handle the result, so we just return the
- * original input instead.
- */
-CloogConstraintSet *cloog_constraint_set_reduce(CloogConstraintSet *constraints,
-	int level, CloogEqualities *equal, int nb_par, cloog_int_t *bound)
-{
-	int j;
-	isl_space *idim;
-	struct isl_basic_set *eq;
-	struct isl_basic_map *id;
-	struct cloog_isl_dim dim;
-	struct isl_constraint *c;
-	unsigned constraints_dim;
-	unsigned n_div;
-	isl_basic_set *bset, *orig;
-
-	bset = cloog_constraints_set_to_isl(constraints);
-	orig = isl_basic_set_copy(bset);
-	dim = set_cloog_dim_to_isl_dim(constraints, level - 1);
-	assert(dim.type == isl_dim_set);
-
-	eq = NULL;
-	for (j = 0; j < level - 1; ++j) {
-		isl_basic_set *bset_j;
-		if (equal->types[j] != EQTYPE_EXAFFINE)
-			continue;
-		bset_j = equality_to_basic_set(equal, j);
-		if (!eq)
-			eq = bset_j;
-		else
-			eq = isl_basic_set_intersect(eq, bset_j);
-	}
-	if (!eq) {
-		isl_basic_set_free(orig);
-		return cloog_constraint_set_from_isl_basic_set(bset);
-	}
-
-	idim = isl_space_map_from_set(isl_basic_set_get_space(bset));
-	id = isl_basic_map_identity(idim);
-	id = isl_basic_map_remove_dims(id, isl_dim_out, dim.pos, 1);
-	bset = isl_basic_set_apply(bset, isl_basic_map_copy(id));
-	bset = isl_basic_set_apply(bset, isl_basic_map_reverse(id));
-
-	constraints_dim = isl_basic_set_dim(bset, isl_dim_set);
-	eq = isl_basic_set_remove_dims(eq, isl_dim_set, constraints_dim,
-			isl_basic_set_dim(eq, isl_dim_set) - constraints_dim);
-	bset = isl_basic_set_gist(bset, eq);
-	n_div = isl_basic_set_dim(bset, isl_dim_div);
-	if (n_div > 1) {
-		isl_basic_set_free(bset);
-		return cloog_constraint_set_from_isl_basic_set(orig);
-	}
-	if (n_div < 1) {
-		isl_basic_set_free(orig);
-		return cloog_constraint_set_from_isl_basic_set(bset);
-	}
-
-	c = isl_equality_alloc(isl_basic_set_get_local_space(bset));
-	c = isl_constraint_set_coefficient_si(c, isl_dim_div, 0, 1);
-	c = isl_constraint_set_coefficient_si(c, isl_dim_set, dim.pos, -1);
-	bset = isl_basic_set_add_constraint(bset, c);
-
-	isl_int_set_si(*bound, 0);
-	constraints = cloog_constraint_set_from_isl_basic_set(bset);
-	cloog_constraint_set_foreach_constraint(constraints,
-						add_constant_term, bound);
-
-	isl_basic_set_free(orig);
-	return cloog_constraint_set_from_isl_basic_set(bset);
-}
-
-CloogConstraint *cloog_constraint_copy(CloogConstraint *constraint)
-{
-	return cloog_constraint_from_isl_constraint(
-		isl_constraint_copy(cloog_constraint_to_isl(constraint)));
-}
-
-void cloog_constraint_release(CloogConstraint *constraint)
-{
-	isl_constraint_free(cloog_constraint_to_isl(constraint));
-}
-
-struct cloog_isl_foreach {
-	int (*fn)(CloogConstraint *constraint, void *user);
-	void *user;
-};
-
-static int cloog_isl_foreach_cb(__isl_take isl_constraint *c, void *user)
-{
-	struct cloog_isl_foreach *data = (struct cloog_isl_foreach *)user;
-	int ret;
-
-	if (isl_constraint_is_div_constraint(c)) {
-		isl_constraint_free(c);
-		return 0;
-	}
-
-	ret = data->fn(cloog_constraint_from_isl_constraint(c), data->user);
-
-	isl_constraint_free(c);
-
-	return ret;
-}
-
-int cloog_constraint_set_foreach_constraint(CloogConstraintSet *constraints,
-	int (*fn)(CloogConstraint *constraint, void *user), void *user)
-{
-	struct cloog_isl_foreach data = { fn, user };
-	isl_basic_set *bset;
-
-	bset = cloog_constraints_set_to_isl(constraints);
-	return isl_basic_set_foreach_constraint(bset,
-						cloog_isl_foreach_cb, &data);
-}
-
-CloogConstraint *cloog_equal_constraint(CloogEqualities *equal, int j)
-{
-	isl_constraint *c;
-
-	c = isl_constraint_copy(equal->constraints[j]);
-	return cloog_constraint_from_isl_constraint(c);
-}
-
-/* Given a stride constraint on iterator i (specified by level) of the form
- *
- *	i = f(outer iterators) + stride * f(existentials)
- *
- * extract f as an isl_aff.
- */
-static isl_aff *extract_stride_offset(__isl_keep isl_constraint *c,
-	int level, CloogStride *stride)
-{
-	int i;
-	isl_space *dim = isl_constraint_get_space(c);
-	isl_local_space *ls = isl_local_space_from_space(dim);
-	isl_aff *offset = isl_aff_zero_on_domain(ls);
-	isl_int u;
-	unsigned nparam, nvar;
-
-	isl_int_init(u);
-
-	nparam = isl_constraint_dim(c, isl_dim_param);
-	nvar = isl_constraint_dim(c, isl_dim_set);
-
-	for (i = 0; i < nparam; ++i) {
-		isl_constraint_get_coefficient(c, isl_dim_param, i, &u);
-		isl_int_mul(u, u, stride->factor);
-		offset = isl_aff_set_coefficient(offset, isl_dim_param, i, u);
-	}
-	for (i = 0; i < nvar; ++i) {
-		if (i == level - 1)
-			continue;
-		isl_constraint_get_coefficient(c, isl_dim_set, i, &u);
-		isl_int_mul(u, u, stride->factor);
-		offset = isl_aff_set_coefficient(offset, isl_dim_in, i, u);
-	}
-	isl_constraint_get_constant(c, &u);
-	isl_int_mul(u, u, stride->factor);
-	offset = isl_aff_set_constant(offset, u);
-
-	isl_int_clear(u);
-
-	return offset;
-}
-
-/* Update the given lower bound on level such that it satisfies the stride
- * constraint.  The computation performed here is essentially the same
- * as that performed in constraint_stride_lower_c.
- *
- * We update the constraint
- *
- *	a i + f >= 0
- *
- * to
- *
- *	i >= s * ceil((-f/a - d)/s) + d
- *
- * with s the stride and d the offset encoded in the stride constraint.
- */
-CloogConstraint *cloog_constraint_stride_lower_bound(CloogConstraint *c,
-	int level, CloogStride *stride)
-{
-	isl_constraint *stride_c = cloog_constraint_to_isl(stride->constraint);
-	isl_constraint *bound = cloog_constraint_to_isl(c);
-	isl_aff *offset;
-	isl_aff *lower;
-
-	lower = isl_constraint_get_bound(bound, isl_dim_set, level - 1);
-	isl_constraint_free(bound);
-
-	offset = extract_stride_offset(stride_c, level, stride);
-
-	lower = isl_aff_sub(lower, isl_aff_copy(offset));
-	lower = isl_aff_scale_down(lower, stride->stride);
-	lower = isl_aff_ceil(lower);
-	lower = isl_aff_scale(lower, stride->stride);
-	lower = isl_aff_add(lower, offset);
-	lower = isl_aff_neg(lower);
-	lower = isl_aff_add_coefficient_si(lower, isl_dim_in, level - 1, 1);
-
-	bound = isl_inequality_from_aff(lower);
-
-	return cloog_constraint_from_isl_constraint(bound);
-}
diff --git a/cloog-0.17.0/source/isl/domain.c b/cloog-0.17.0/source/isl/domain.c
deleted file mode 100644
index 6c4d8dc..0000000
--- a/cloog-0.17.0/source/isl/domain.c
+++ /dev/null
@@ -1,1913 +0,0 @@
-#include <assert.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include <cloog/isl/cloog.h>
-#include <isl/list.h>
-#include <isl/constraint.h>
-#include <isl/ilp.h>
-#include <isl/aff.h>
-
-#ifdef OSL_SUPPORT
-#include <osl/macros.h>
-#include <osl/relation.h>
-#endif
-
-CloogDomain *cloog_domain_from_isl_set(struct isl_set *set)
-{
-	if (isl_set_is_params(set))
-		set = isl_set_from_params(set);
-	set = isl_set_detect_equalities(set);
-	set = isl_set_compute_divs(set);
-	return (CloogDomain *)set;
-}
-
-__isl_give isl_set *isl_set_from_cloog_domain(CloogDomain *domain)
-{
-	return (isl_set *)domain;
-}
-
-CloogScattering *cloog_scattering_from_isl_map(struct isl_map *map)
-{
-	return (CloogScattering *)map;
-}
-
-__isl_give isl_map *isl_map_from_cloog_scattering(CloogScattering *scattering)
-{
-	return (isl_map *)scattering;
-}
-
-
-/**
- * Returns true if each scattering dimension is defined in terms
- * of the original iterators.
- */
-int cloog_scattering_fully_specified(CloogScattering *scattering,
-				      CloogDomain *domain)
-{
-	isl_map *map = isl_map_from_cloog_scattering(scattering);
-	return isl_map_is_single_valued(map);
-}
-
-
-CloogConstraintSet *cloog_domain_constraints(CloogDomain *domain)
-{
-	isl_basic_set *bset;
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	assert(isl_set_n_basic_set(set) == 1);
-	bset = isl_set_copy_basic_set(set);
-	return cloog_constraint_set_from_isl_basic_set(bset);
-}
-
-
-void cloog_domain_print_constraints(FILE *foo, CloogDomain *domain,
-					int print_number)
-{
-	isl_basic_set *bset;
-	isl_set *set = isl_set_from_cloog_domain(domain);
-
-	if (print_number)
-		isl_set_print(set, foo, 0, ISL_FORMAT_EXT_POLYLIB);
-	else {
-		assert(isl_set_n_basic_set(set) == 1);
-		bset = isl_set_copy_basic_set(set);
-		isl_basic_set_print(bset, foo,
-					0, NULL, NULL, ISL_FORMAT_POLYLIB);
-		isl_basic_set_free(bset);
-	}
-}
-
-
-void cloog_scattering_print_constraints(FILE *foo, CloogScattering *scattering)
-{
-	isl_map *map = isl_map_from_cloog_scattering(scattering);
-	isl_map_print(map, foo, 0, ISL_FORMAT_EXT_POLYLIB);
-}
-
-
-void cloog_domain_free(CloogDomain * domain)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	isl_set_free(set);
-}
-
-
-void cloog_scattering_free(CloogScattering *scatt)
-{
-	isl_map *map = isl_map_from_cloog_scattering(scatt);
-	isl_map_free(map);
-}
-
-
-CloogDomain * cloog_domain_copy(CloogDomain * domain)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	return cloog_domain_from_isl_set(isl_set_copy(set));
-}
-
-
-/**
- * cloog_domain_convex function:
- * Computes the convex hull of domain.
- */ 
-CloogDomain *cloog_domain_convex(CloogDomain *domain)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	set = isl_set_from_basic_set(isl_set_convex_hull(isl_set_copy(set)));
-	return cloog_domain_from_isl_set(set);
-}
-
-
-/**
- * cloog_domain_simple_convex:
- * Given a list (union) of polyhedra, this function returns a "simple"
- * convex hull of this union.  In particular, the constraints of the
- * the returned polyhedron consist of (parametric) lower and upper
- * bounds on individual variables and constraints that appear in the
- * original polyhedra.
- */
-CloogDomain *cloog_domain_simple_convex(CloogDomain *domain)
-{
-	struct isl_basic_set *hull;
-	isl_set *set = isl_set_from_cloog_domain(domain);
-
-	if (cloog_domain_isconvex(domain))
-		return cloog_domain_copy(domain);
-
-	hull = isl_set_bounded_simple_hull(isl_set_copy(set));
-	return cloog_domain_from_isl_set(isl_set_from_basic_set(hull));
-}
-
-
-/**
- * cloog_domain_simplify function:
- * Given two polyhedral domains (dom1) and (dom2),
- * this function finds the largest domain set (or the smallest list
- * of non-redundant constraints), that when intersected with polyhedral
- * domain (dom2) equals (dom1)intersect(dom2). The output is a new CloogDomain
- * structure with a polyhedral domain with the "redundant" constraints removed.
- * NB: the second domain is required not to be a union.
- */ 
-CloogDomain *cloog_domain_simplify(CloogDomain *dom1, CloogDomain *dom2)
-{
-	isl_set *set1 = isl_set_from_cloog_domain(dom1);
-	isl_set *set2 = isl_set_from_cloog_domain(dom2);
-	set1 = isl_set_gist(isl_set_copy(set1), isl_set_copy(set2));
-	return cloog_domain_from_isl_set(set1);
-}
-
-
-/**
- * cloog_domain_union function:
- * This function returns a new polyhedral domain which is the union of
- * two polyhedral domains (dom1) U (dom2).
- * Frees dom1 and dom2;
- */
-CloogDomain *cloog_domain_union(CloogDomain *dom1, CloogDomain *dom2)
-{
-	isl_set *set1 = isl_set_from_cloog_domain(dom1);
-	isl_set *set2 = isl_set_from_cloog_domain(dom2);
-	set1 = isl_set_union(set1, set2);
-	return cloog_domain_from_isl_set(set1);
-}
-
-
-
-/**
- * cloog_domain_intersection function:
- * This function returns a new polyhedral domain which is the intersection of
- * two polyhedral domains (dom1) \cap (dom2).
- */ 
-CloogDomain *cloog_domain_intersection(CloogDomain *dom1, CloogDomain *dom2)
-{
-	isl_set *set1 = isl_set_from_cloog_domain(dom1);
-	isl_set *set2 = isl_set_from_cloog_domain(dom2);
-	set1 = isl_set_intersect(isl_set_copy(set1), isl_set_copy(set2));
-	return cloog_domain_from_isl_set(set1);
-}
-
-
-/**
- * cloog_domain_difference function:
- * Returns the set difference domain \ minus.
- */ 
-CloogDomain *cloog_domain_difference(CloogDomain *domain, CloogDomain *minus)
-{
-	isl_set *set1 = isl_set_from_cloog_domain(domain);
-	isl_set *set2 = isl_set_from_cloog_domain(minus);
-	set1 = isl_set_subtract(isl_set_copy(set1), isl_set_copy(set2));
-	return cloog_domain_from_isl_set(set1);
-}
-
-
-/**
- * cloog_domain_sort function:
- * This function topologically sorts (nb_doms) domains. Here (doms) is an
- * array of pointers to CloogDomains, (nb_doms) is the number of domains,
- * (level) is the level to consider for partial ordering (nb_par) is the
- * parameter space dimension, (permut) if not NULL, is an array of (nb_doms)
- * integers that contains a permutation specification after call in order to
- * apply the topological sorting. 
- */
-void cloog_domain_sort(CloogDomain **doms, unsigned nb_doms, unsigned level,
-			int *permut)
-{
-	int i, j, k, cmp;
-	struct isl_ctx *ctx;
-	unsigned char **follows;
-	isl_set *set_i, *set_j;
-	isl_basic_set *bset_i, *bset_j;
-
-	if (!nb_doms)
-		return;
-	set_i = isl_set_from_cloog_domain(doms[0]);
-	ctx = isl_set_get_ctx(set_i);
-	for (i = 0; i < nb_doms; i++) {
-		set_i = isl_set_from_cloog_domain(doms[i]);
-		assert(isl_set_n_basic_set(set_i) == 1);
-	}
-
-	follows = isl_alloc_array(ctx, unsigned char *, nb_doms);
-	assert(follows);
-	for (i = 0; i < nb_doms; ++i) {
-		follows[i] = isl_alloc_array(ctx, unsigned char, nb_doms);
-		assert(follows[i]);
-		for (j = 0; j < nb_doms; ++j)
-			follows[i][j] = 0;
-	}
-
-	for (i = 1; i < nb_doms; ++i) {
-		for (j = 0; j < i; ++j) {
-			if (follows[i][j] || follows[j][i])
-				continue;
-			set_i = isl_set_from_cloog_domain(doms[i]);
-			set_j = isl_set_from_cloog_domain(doms[j]);
-			bset_i = isl_set_copy_basic_set(set_i);
-			bset_j = isl_set_copy_basic_set(set_j);
-			cmp = isl_basic_set_compare_at(bset_i, bset_j, level-1);
-			isl_basic_set_free(bset_i);
-			isl_basic_set_free(bset_j);
-			if (!cmp)
-				continue;
-			if (cmp > 0) {
-				follows[i][j] = 1;
-				for (k = 0; k < i; ++k)
-					follows[i][k] |= follows[j][k];
-			} else {
-				follows[j][i] = 1;
-				for (k = 0; k < i; ++k)
-					follows[k][i] |= follows[k][j];
-			}
-		}
-	}
-
-	for (i = 0, j = 0; i < nb_doms; j = (j + 1) % nb_doms) {
-		for (k = 0; k < nb_doms; ++k)
-			if (follows[j][k])
-				break;
-		if (k < nb_doms)
-			continue;
-		for (k = 0; k < nb_doms; ++k)
-			follows[k][j] = 0;
-		follows[j][j] = 1;
-		permut[i] = 1 + j;
-		++i;
-	}
-
-	for (i = 0; i < nb_doms; ++i)
-		free(follows[i]);
-	free(follows);
-}
-
-
-/**
- * Check whether there is or may be any value of dom1 at the given level
- * that is greater than or equal to a value of dom2 at the same level.
- *
- * Return
- *	 1 is there is or may be a greater-than pair.
- *	 0 if there is no greater-than pair, but there may be an equal-to pair
- *	-1 if there is definitely no such pair
- */
-int cloog_domain_follows(CloogDomain *dom1, CloogDomain *dom2, unsigned level)
-{
-	isl_set *set1 = isl_set_from_cloog_domain(dom1);
-	isl_set *set2 = isl_set_from_cloog_domain(dom2);
-	int follows;
-
-	follows = isl_set_follows_at(set1, set2, level - 1);
-	assert(follows >= -1);
-
-	return follows;
-}
-
-
-/**
- * cloog_domain_empty function:
- * Returns an empty domain of the same dimensions as template.
- */
-CloogDomain *cloog_domain_empty(CloogDomain *template)
-{
-	isl_set *set = isl_set_from_cloog_domain(template);
-	return cloog_domain_from_isl_set(isl_set_empty_like(set));
-}
-
-
-/**
- * Return 1 if the specified dimension has both an upper and a lower bound.
- */
-int cloog_domain_is_bounded(CloogDomain *dom, unsigned level)
-{
-	isl_set *set = isl_set_from_cloog_domain(dom);
-	return isl_set_dim_is_bounded(set, isl_dim_set, level - 1);
-}
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-
-
-/**
- * cloog_domain_print_structure :
- * this function is a more human-friendly way to display the CloogDomain data
- * structure, it only shows the constraint system and includes an indentation
- * level (level) in order to work with others print_structure functions.
- */
-void cloog_domain_print_structure(FILE *file, CloogDomain *domain, int level,
-				  const char *name)
-{
-	int i ;
-	isl_set *set = isl_set_from_cloog_domain(domain);
-
-	/* Go to the right level. */
-	for (i = 0; i < level; i++)
-		fprintf(file, "|\t");
-  
-	if (!set) {
-		fprintf(file, "+-- Null CloogDomain\n");
-		return;
-	}
-	fprintf(file, "+-- %s\n", name);
-	for (i = 0; i < level+1; ++i)
-		fprintf(file, "|\t");
-
-	isl_set_print(set, file, 0, ISL_FORMAT_ISL);
-
-	fprintf(file, "\n");
-}
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-
-
-void cloog_domain_list_free(CloogDomainList *list)
-{
-	CloogDomainList *next;
-
-	for ( ; list; list = next) {
-		next = list->next;
-		cloog_domain_free(list->domain);
-		free(list);
-	}
-}
-
-
-/**
- * cloog_scattering_list_free function:
- * This function frees the allocated memory for a CloogScatteringList structure.
- */
-void cloog_scattering_list_free(CloogScatteringList *list)
-{
-	while (list != NULL) {
-		CloogScatteringList *temp = list->next;
-		isl_map *map = isl_map_from_cloog_scattering(list->scatt);
-		isl_map_free(map);
-		free(list);
-		list = temp;
-	}
-}
-
-
-/******************************************************************************
- *                               Reading function                             *
- ******************************************************************************/
-
-
-/**
- * cloog_domain_read_context function:
- * Read parameter domain.
- */
-CloogDomain *cloog_domain_read_context(CloogState *state, FILE *input)
-{
-	struct isl_ctx *ctx = state->backend->ctx;
-	isl_set *set;
-
-	set = isl_set_read_from_file(ctx, input);
-	set = isl_set_move_dims(set, isl_dim_param, 0,
-				isl_dim_set, 0, isl_set_dim(set, isl_dim_set));
-
-	return cloog_domain_from_isl_set(set);
-}
-
-
-/**
- * cloog_domain_from_context
- * Reinterpret context by turning parameters into variables.
- */
-CloogDomain *cloog_domain_from_context(CloogDomain *context)
-{
-	isl_set *set = isl_set_from_cloog_domain(context);
-
-	set = isl_set_move_dims(set, isl_dim_set, 0,
-			    isl_dim_param, 0, isl_set_dim(set, isl_dim_param));
-
-	return cloog_domain_from_isl_set(set);
-}
-
-
-/**
- * cloog_domain_union_read function:
- * This function reads a union of polyhedra into a file (input) and
- * returns a pointer to a CloogDomain containing the read information. 
- */
-CloogDomain *cloog_domain_union_read(CloogState *state,
-					FILE *input, int nb_parameters)
-{
-	struct isl_ctx *ctx = state->backend->ctx;
-	struct isl_set *set;
-
-	set = isl_set_read_from_file(ctx, input);
-	if (isl_set_dim(set, isl_dim_param) != nb_parameters) {
-		int dim = isl_set_dim(set, isl_dim_set);
-		set = isl_set_move_dims(set, isl_dim_param, 0,
-			    isl_dim_set, dim - nb_parameters, nb_parameters);
-	}
-	return cloog_domain_from_isl_set(set);
-}
-
-
-/**
- * cloog_domain_read_scattering function:
- * This function reads in a scattering function from the file input.
- *
- * We try to read the scattering relation as a map, but if it is
- * specified in the original PolyLib format, then isl_map_read_from_file
- * will treat the input as a set return a map with zero input dimensions.
- * In this case, we need to decompose the set into a map from
- * scattering dimensions to domain dimensions and then invert the
- * resulting map.
- */
-CloogScattering *cloog_domain_read_scattering(CloogDomain *domain, FILE *input)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	isl_ctx *ctx = isl_set_get_ctx(set);
-	struct isl_map *scat;
-	unsigned nparam;
-	unsigned dim;
-	unsigned n_scat;
-
-	dim = isl_set_dim(set, isl_dim_set);
-	nparam = isl_set_dim(set, isl_dim_param);
-	scat = isl_map_read_from_file(ctx, input);
-	if (isl_map_dim(scat, isl_dim_param) != nparam) {
-		int n_out = isl_map_dim(scat, isl_dim_out);
-		scat = isl_map_move_dims(scat, isl_dim_param, 0,
-					isl_dim_out, n_out - nparam, nparam);
-	}
-	if (isl_map_dim(scat, isl_dim_in) != dim) {
-		n_scat = isl_map_dim(scat, isl_dim_out) - dim;
-		scat = isl_map_move_dims(scat, isl_dim_in, 0,
-					isl_dim_out, n_scat, dim);
-	}
-	return cloog_scattering_from_isl_map(scat);
-}
-
-/******************************************************************************
- *                      CloogMatrix Reading function                          *
- ******************************************************************************/
-
-/**
- * isl_constraint_read_from_matrix:
- * Convert a single line of a matrix to a isl_constraint.
- * Returns a pointer to the constraint if successful; NULL otherwise.
- */
-static struct isl_constraint *isl_constraint_read_from_matrix(
-	struct isl_space *dim, cloog_int_t *row)
-{
-	struct isl_constraint *constraint;
-	int j;
-	int nvariables = isl_space_dim(dim, isl_dim_set);
-	int nparam = isl_space_dim(dim, isl_dim_param);
-	isl_local_space *ls = isl_local_space_from_space(dim);
-
-	if (cloog_int_is_zero(row[0]))
-		constraint = isl_equality_alloc(ls);
-	else
-		constraint = isl_inequality_alloc(ls);
-
-	for (j = 0; j < nvariables; ++j)
-		isl_constraint_set_coefficient(constraint, isl_dim_out, j,
-					       row[1 + j]);
-
-	for (j = 0; j < nparam; ++j)
-		isl_constraint_set_coefficient(constraint, isl_dim_param, j,
-					       row[1 + nvariables + j]);
-
-	isl_constraint_set_constant(constraint, row[1 + nvariables + nparam]);
-
-	return constraint;
-}
-
-/**
- * isl_basic_set_read_from_matrix:
- * Convert matrix to basic_set. The matrix contains nparam parameter columns.
- * Returns a pointer to the basic_set if successful; NULL otherwise.
- */
-static struct isl_basic_set *isl_basic_set_read_from_matrix(struct isl_ctx *ctx,
-	CloogMatrix* matrix, int nparam)
-{
-	struct isl_space *dim;
-	struct isl_basic_set *bset;
-	int i;
-	unsigned nrows, ncolumns;
-
-	nrows = matrix->NbRows;
-	ncolumns = matrix->NbColumns;
-	int nvariables = ncolumns - 2 - nparam;
-
-	dim = isl_space_set_alloc(ctx, nparam, nvariables);
-
-	bset = isl_basic_set_universe(isl_space_copy(dim));
-
-	for (i = 0; i < nrows; ++i) {
-		cloog_int_t *row = matrix->p[i];
-		struct isl_constraint *constraint =
-			isl_constraint_read_from_matrix(isl_space_copy(dim), row);
-		bset = isl_basic_set_add_constraint(bset, constraint);
-	}
-
-	isl_space_free(dim);
-
-	return bset;
-}
-
-/**
- * cloog_domain_from_cloog_matrix:
- * Create a CloogDomain containing the constraints described in matrix.
- * nparam is the number of parameters contained in the domain.
- * Returns a pointer to the CloogDomain if successful; NULL otherwise.
- */
-CloogDomain *cloog_domain_from_cloog_matrix(CloogState *state,
-	CloogMatrix *matrix, int nparam)
-{
-	struct isl_ctx *ctx = state->backend->ctx;
-	struct isl_basic_set *bset;
-
-	bset = isl_basic_set_read_from_matrix(ctx, matrix, nparam);
-
-	return cloog_domain_from_isl_set(isl_set_from_basic_set(bset));
-}
-
-/**
- * cloog_scattering_from_cloog_matrix:
- * Create a CloogScattering containing the constraints described in matrix.
- * nparam is the number of parameters contained in the domain.
- * Returns a pointer to the CloogScattering if successful; NULL otherwise.
- */
-CloogScattering *cloog_scattering_from_cloog_matrix(CloogState *state,
-	CloogMatrix *matrix, int nb_scat, int nb_par)
-{
-	struct isl_ctx *ctx = state->backend->ctx;
-	struct isl_basic_set *bset;
-	struct isl_basic_map *scat;
-	struct isl_space *dims;
-	unsigned dim;
-
-	bset = isl_basic_set_read_from_matrix(ctx, matrix, nb_par);
-	dim = isl_basic_set_n_dim(bset) - nb_scat;
-	dims = isl_space_alloc(ctx, nb_par, nb_scat, dim);
-
-	scat = isl_basic_map_from_basic_set(bset, dims);
-	scat = isl_basic_map_reverse(scat);
-	return cloog_scattering_from_isl_map(isl_map_from_basic_map(scat));
-}
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-
-
-#ifdef OSL_SUPPORT
-/**
- * Converts an openscop relation to a CLooG domain.
- * \param[in,out] state    CLooG state.
- * \param[in]     relation OpenScop relation to convert.
- * \return A new CloogDomain corresponding to the input OpenScop relation.
- */
-CloogDomain *cloog_domain_from_osl_relation(CloogState *state,
-                                            osl_relation_p relation) {
-  char *str;
-  struct isl_ctx *ctx = state->backend->ctx;
-  isl_set *set;
-  CloogDomain *domain = NULL;
-
-  if (relation != NULL) {
-    if (relation->precision != OSL_PRECISION_MP)
-      cloog_die("Non-GMP precision is not supported yet.\n");
-
-    str = osl_relation_spprint_polylib(relation, NULL);
-    set = isl_set_read_from_str(ctx, str);
-    free(str);
-
-    domain = cloog_domain_from_isl_set(set);
-  }
-
-  return domain;
-}
-
-
-/**
- * Converts an openscop scattering relation to a CLooG scattering.
- * \param[in,out] state    CLooG state.
- * \param[in]     relation OpenScop relation to convert.
- * \return A new CloogScattering corresponding to the input OpenScop relation.
- */
-CloogScattering *cloog_scattering_from_osl_relation(CloogState *state,
-                                                    osl_relation_p relation) {
-  char *str;
-  struct isl_ctx *ctx = state->backend->ctx;
-  isl_map *map;
-  CloogScattering *scattering = NULL;
-
-  if (relation != NULL) {
-    if (relation->precision != OSL_PRECISION_MP)
-      cloog_die("Non-GMP precision is not supported yet.\n");
-
-    if (relation->type != OSL_TYPE_SCATTERING)
-      cloog_die("Cannot convert a non-scattering relation to a scattering.\n");
-
-    str = osl_relation_spprint_polylib(relation, NULL);
-    map = isl_map_read_from_str(ctx, str);
-    free(str);
-
-    scattering = cloog_scattering_from_isl_map(map);
-  }
-
-  return scattering;
-}
-#endif
-
-/**
- * cloog_domain_isempty function:
- */ 
-int cloog_domain_isempty(CloogDomain *domain)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	return isl_set_is_empty(set);
-}
-
-
-/**
- * cloog_domain_universe function:
- * This function returns the complete dim-dimensional space.
- */
-CloogDomain *cloog_domain_universe(CloogState *state, unsigned dim)
-{
-	struct isl_space *dims;
-	struct isl_basic_set *bset;
-
-	dims = isl_space_set_alloc(state->backend->ctx, 0, dim);
-	bset = isl_basic_set_universe(dims);
-	return cloog_domain_from_isl_set(isl_set_from_basic_set(bset));
-}
-
-
-/**
- * cloog_domain_project function:
- * This function returns the projection of
- * (domain) on the (level) first dimensions (i.e. outer loops).
- */ 
-CloogDomain *cloog_domain_project(CloogDomain *domain, int level)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	set = isl_set_remove_dims(isl_set_copy(set), isl_dim_set,
-					level, isl_set_n_dim(set) - level);
-	set = isl_set_compute_divs(set);
-	if (level > 0)
-		set = isl_set_remove_divs_involving_dims(set,
-						isl_dim_set, level - 1, 1);
-	return cloog_domain_from_isl_set(set);
-}
-
-
-/**
- * cloog_domain_extend function:
- * This function returns the (domain) given as input with (dim)
- * dimensions and (nb_par) parameters.
- * This function does not free (domain), and returns a new CloogDomain.
- */ 
-CloogDomain *cloog_domain_extend(CloogDomain *domain, int dim)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	int n = isl_set_dim(set, isl_dim_set);
-	set = isl_set_add_dims(isl_set_copy(set), isl_dim_set, dim - n);
-	return cloog_domain_from_isl_set(set);
-}
-
-
-/**
- * cloog_domain_never_integral function:
- * For us, an equality like 3*i -4 = 0 is always false since 4%3 != 0.
- * There is no need to check for such constraints explicitly for the isl
- * backend.
- */
-int cloog_domain_never_integral(CloogDomain * domain)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	return isl_set_is_empty(set);
-}
-
-
-/**
- * Check whether the loop at "level" is executed at most once.
- * We construct a map that maps all remaining variables to this iterator
- * and check whether this map is single valued.
- *
- * Alternatively, we could have mapped the domain through a mapping
- * [p] -> { [..., i] -> [..., i'] : i' > i }
- * and then taken the intersection of the original domain and the transformed
- * domain.  If this intersection is empty, then the corresponding
- * loop is executed at most once.
- */
-int cloog_domain_is_otl(CloogDomain *domain, int level)
-{
-	int otl;
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	isl_map *map;
-
-	map = isl_map_from_domain(isl_set_copy(set));
-	map = isl_map_move_dims(map, isl_dim_out, 0, isl_dim_in, level - 1, 1);
-	otl = isl_map_is_single_valued(map);
-	isl_map_free(map);
-
-	return otl;
-}
-
-
-/**
- * cloog_domain_stride function:
- * This function finds the stride imposed to unknown with the column number
- * 'strided_level' in order to be integral. For instance, if we have a
- * constraint like -i - 2j + 2k = 0, and we consider k, then k can be integral
- * only if (i + 2j)%2 = 0. Then only if i%2 = 0. Then k imposes a stride 2 to
- * the unknown i. The function returns the imposed stride in a parameter field.
- * - domain is the set of constraint we have to consider,
- * - strided_level is the column number of the unknown for which a stride have
- *   to be found,
- * - looking_level is the column number of the unknown that impose a stride to
- *   the first unknown.
- * - stride is the stride that is returned back as a function parameter. 
- * - offset is the value of the constant c if the condition is of the shape
- *   (i + c)%s = 0, s being the stride.
- */
-void cloog_domain_stride(CloogDomain *domain, int strided_level,
-	cloog_int_t *stride, cloog_int_t *offset)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	isl_set_dim_residue_class(set, strided_level - 1, stride, offset);
-	if (!isl_int_is_zero(*offset))
-		isl_int_sub(*offset, *stride, *offset);
-	return;
-}
-
-
-struct cloog_can_stride {
-	int level;
-	int can_stride;
-};
-
-static int constraint_can_stride(__isl_take isl_constraint *c, void *user)
-{
-	struct cloog_can_stride *ccs = (struct cloog_can_stride *)user;
-	int i;
-	isl_int v;
-	unsigned n_div;
-
-	if (isl_constraint_is_equality(c)) {
-		isl_constraint_free(c);
-		return 0;
-	}
-
-	isl_int_init(v);
-	isl_constraint_get_coefficient(c, isl_dim_set, ccs->level - 1, &v);
-	if (isl_int_is_pos(v)) {
-		n_div = isl_constraint_dim(c, isl_dim_div);
-		for (i = 0; i < n_div; ++i) {
-			isl_constraint_get_coefficient(c, isl_dim_div, i, &v);
-			if (!isl_int_is_zero(v))
-				break;
-		}
-		if (i < n_div)
-			ccs->can_stride = 0;
-	}
-	isl_int_clear(v);
-	isl_constraint_free(c);
-
-	return 0;
-}
-
-static int basic_set_can_stride(__isl_take isl_basic_set *bset, void *user)
-{
-	struct cloog_can_stride *ccs = (struct cloog_can_stride *)user;
-	int r;
-
-	r = isl_basic_set_foreach_constraint(bset, constraint_can_stride, ccs);
-	isl_basic_set_free(bset);
-	return r;
-}
-
-
-/**
- * Return 1 if CLooG is allowed to perform stride detection on level "level"
- * and 0 otherwise.
- * Currently, stride detection is only allowed when none of the lower
- * bound constraints involve any existentially quantified variables.
- * The reason is that the current isl interface does not make it
- * easy to construct an integer division that depends on other integer
- * divisions.
- * By not allowing existentially quantified variables in the constraints,
- * we can ignore them in cloog_domain_stride_lower_bound.
- */
-int cloog_domain_can_stride(CloogDomain *domain, int level)
-{
-	struct cloog_can_stride ccs = { level, 1 };
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	int r;
-	r = isl_set_foreach_basic_set(set, basic_set_can_stride, &ccs);
-	assert(r == 0);
-	return ccs.can_stride;
-}
-
-
-struct cloog_stride_lower {
-	int level;
-	CloogStride *stride;
-	isl_set *set;
-	isl_basic_set *bounds;
-};
-
-/* If the given constraint is a lower bound on csl->level, then add
- * a lower bound to csl->bounds that makes sure that the remainder
- * of the smallest value on division by csl->stride is equal to csl->offset.
- *
- * In particular, the given lower bound is of the form
- *
- *	a i + f >= 0
- *
- * where f may depend on the parameters and other iterators.
- * The stride is s and the offset is d.
- * The lower bound -f/a may not satisfy the above condition.  In fact,
- * it may not even be integral.  We want to round this value of i up
- * to the nearest value that satisfies the condition and add the corresponding
- * lower bound constraint.  This nearest value is obtained by rounding
- * i - d up to the nearest multiple of s.
- * That is, we first subtract d
- *
- *	i' = -f/a - d
- *
- * then we round up to the nearest multiple of s
- *
- *	i'' = s * ceil(i'/s)
- *
- * and finally, we add d again
- *
- *	i''' = i'' + d
- *
- * and impose the constraint i >= i'''.
- *
- * We find
- *
- *	i'' = s * ceil((-f - a * d)/(a * s)) = - s * floor((f + a * d)/(a * s))
- *
- *	i >= - s * floor((f + a * d)/(a * s)) + d
- *
- * or
- *	i + s * floor((f + a * d)/(a * s)) - d >= 0
- */
-static int constraint_stride_lower(__isl_take isl_constraint *c, void *user)
-{
-	struct cloog_stride_lower *csl = (struct cloog_stride_lower *)user;
-	isl_int v;
-	isl_constraint *bound;
-	isl_aff *b;
-
-	if (isl_constraint_is_equality(c)) {
-		isl_constraint_free(c);
-		return 0;
-	}
-
-	isl_int_init(v);
-	isl_constraint_get_coefficient(c, isl_dim_set, csl->level - 1, &v);
-	if (!isl_int_is_pos(v)) {
-		isl_int_clear(v);
-		isl_constraint_free(c);
-
-		return 0;
-	}
-
-	b = isl_constraint_get_bound(c, isl_dim_set, csl->level - 1);
-
-	b = isl_aff_neg(b);
-	b = isl_aff_add_constant(b, csl->stride->offset);
-	b = isl_aff_scale_down(b, csl->stride->stride);
-	b = isl_aff_floor(b);
-	b = isl_aff_scale(b, csl->stride->stride);
-	isl_int_neg(v, csl->stride->offset);
-	b = isl_aff_add_constant(b, v);
-	b = isl_aff_add_coefficient_si(b, isl_dim_in, csl->level - 1, 1);
-
-	bound = isl_inequality_from_aff(b);
-
-	csl->bounds = isl_basic_set_add_constraint(csl->bounds, bound);
-
-	isl_int_clear(v);
-	isl_constraint_free(c);
-
-	return 0;
-}
-
-/* This functions performs essentially the same operation as
- * constraint_stride_lower, the only difference being that the offset d
- * is not a constant, but an affine expression in terms of the parameters
- * and earlier variables.  In particular the affine expression is equal
- * to the coefficients of stride->constraint multiplied by stride->factor.
- * As in constraint_stride_lower, we add an extra bound
- *
- *	i + s * floor((f + a * d)/(a * s)) - d >= 0
- *
- * for each lower bound
- *
- *	a i + f >= 0
- *
- * where d is not the aforementioned affine expression.
- */
-static int constraint_stride_lower_c(__isl_take isl_constraint *c, void *user)
-{
-	struct cloog_stride_lower *csl = (struct cloog_stride_lower *)user;
-	isl_int v;
-	isl_constraint *bound;
-	isl_constraint *csl_c;
-	isl_aff *d, *b;
-
-	if (isl_constraint_is_equality(c)) {
-		isl_constraint_free(c);
-		return 0;
-	}
-
-	isl_int_init(v);
-	isl_constraint_get_coefficient(c, isl_dim_set, csl->level - 1, &v);
-	if (!isl_int_is_pos(v)) {
-		isl_int_clear(v);
-		isl_constraint_free(c);
-
-		return 0;
-	}
-
-	csl_c = cloog_constraint_to_isl(csl->stride->constraint);
-
-	d = isl_constraint_get_aff(csl_c);
-	d = isl_aff_drop_dims(d, isl_dim_div, 0, isl_aff_dim(d, isl_dim_div));
-	d = isl_aff_set_coefficient_si(d, isl_dim_in, csl->level - 1, 0);
-	d = isl_aff_scale(d, csl->stride->factor);
-
-	b = isl_constraint_get_bound(c, isl_dim_set, csl->level - 1);
-
-	b = isl_aff_neg(b);
-	b = isl_aff_add(b, isl_aff_copy(d));
-	b = isl_aff_scale_down(b, csl->stride->stride);
-	b = isl_aff_floor(b);
-	b = isl_aff_scale(b, csl->stride->stride);
-	b = isl_aff_sub(b, d);
-	b = isl_aff_add_coefficient_si(b, isl_dim_in, csl->level - 1, 1);
-
-	bound = isl_inequality_from_aff(b);
-
-	csl->bounds = isl_basic_set_add_constraint(csl->bounds, bound);
-
-	isl_int_clear(v);
-	isl_constraint_free(c);
-
-	return 0;
-}
-
-static int basic_set_stride_lower(__isl_take isl_basic_set *bset, void *user)
-{
-	struct cloog_stride_lower *csl = (struct cloog_stride_lower *)user;
-	int r;
-
-	csl->bounds = isl_basic_set_universe_like(bset);
-	if (csl->stride->constraint)
-		r = isl_basic_set_foreach_constraint(bset,
-					&constraint_stride_lower_c, csl);
-	else
-		r = isl_basic_set_foreach_constraint(bset,
-					&constraint_stride_lower, csl);
-	bset = isl_basic_set_intersect(bset, csl->bounds);
-	csl->set = isl_set_union(csl->set, isl_set_from_basic_set(bset));
-
-	return r;
-}
-
-/**
- * Update the lower bounds at level "level" to the given stride information.
- * That is, make sure that the remainder on division by "stride"
- * is equal to "offset".
- */
-CloogDomain *cloog_domain_stride_lower_bound(CloogDomain *domain, int level,
-	CloogStride *stride)
-{
-	struct cloog_stride_lower csl;
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	int r;
-
-	csl.stride = stride;
-	csl.level = level;
-	csl.set = isl_set_empty_like(set);
-
-	r = isl_set_foreach_basic_set(set, basic_set_stride_lower, &csl);
-	assert(r == 0);
-
-	cloog_domain_free(domain);
-	return cloog_domain_from_isl_set(csl.set);
-}
-
-
-/* Add stride constraint, if any, to domain.
- */
-CloogDomain *cloog_domain_add_stride_constraint(CloogDomain *domain,
-	CloogStride *stride)
-{
-	isl_constraint *c;
-	isl_set *set;
-
-	if (!stride || !stride->constraint)
-		return domain;
-
-	set = isl_set_from_cloog_domain(domain);
-	c = isl_constraint_copy(cloog_constraint_to_isl(stride->constraint));
-
-	set = isl_set_add_constraint(set, c);
-
-	return cloog_domain_from_isl_set(set);
-}
-
-
-/**
- * cloog_domain_lazy_equal function:
- * This function returns 1 if the domains given as input are the same, 0 if it
- * is unable to decide.
- */
-int cloog_domain_lazy_equal(CloogDomain *d1, CloogDomain *d2)
-{
-	isl_set *set1 = isl_set_from_cloog_domain(d1);
-	isl_set *set2 = isl_set_from_cloog_domain(d2);
-	return isl_set_fast_is_equal(set1, set2);
-}
-
-struct cloog_bound_split {
-	isl_set *set;
-	int level;
-	int lower;
-	int upper;
-};
-
-static int constraint_bound_split(__isl_take isl_constraint *c, void *user)
-{
-	struct cloog_bound_split *cbs = (struct cloog_bound_split *)user;
-	isl_int v;
-	int i;
-	int handle = 0;
-
-	isl_int_init(v);
-	isl_constraint_get_coefficient(c, isl_dim_set, cbs->level - 1, &v);
-	if (!cbs->lower && isl_int_is_pos(v))
-		cbs->lower = handle = 1;
-	else if (!cbs->upper && isl_int_is_neg(v))
-		cbs->upper = handle = 1;
-	if (handle) {
-		for (i = 0; i < isl_set_dim(cbs->set, isl_dim_param); ++i) {
-			isl_constraint_get_coefficient(c, isl_dim_param, i, &v);
-			if (isl_int_is_zero(v))
-				continue;
-			cbs->set = isl_set_split_dims(cbs->set,
-							isl_dim_param, i, 1);
-		}
-	}
-	isl_int_clear(v);
-	isl_constraint_free(c);
-
-	return (cbs->lower && cbs->upper) ? -1 : 0;
-}
-
-static int basic_set_bound_split(__isl_take isl_basic_set *bset, void *user)
-{
-	struct cloog_bound_split *cbs = (struct cloog_bound_split *)user;
-	int r;
-
-	cbs->lower = 0;
-	cbs->upper = 0;
-	r = isl_basic_set_foreach_constraint(bset, constraint_bound_split, cbs);
-	isl_basic_set_free(bset);
-	return ((!cbs->lower || !cbs->upper) && r < 0) ? -1 : 0;
-}
-
-/**
- * Return a union of sets S_i such that the convex hull of "dom",
- * when intersected with one the sets S_i, will have an upper and
- * lower bound for the dimension at "level" (provided "dom" itself
- * has such bounds for the dimensions).
- *
- * We currently take a very simple approach.  For each of the basic
- * sets in "dom" we pick a lower and an upper bound and split the
- * range of any parameter involved in these two bounds in a
- * nonnegative and a negative part.  This ensures that the symbolic
- * constant in these two constraints are themselves bounded and
- * so there will be at least one upper and one lower bound
- * in the convex hull.
- */
-CloogDomain *cloog_domain_bound_splitter(CloogDomain *dom, int level)
-{
-	struct cloog_bound_split cbs;
-	isl_set *set = isl_set_from_cloog_domain(dom);
-	int r;
-	cbs.level = level;
-	cbs.set = isl_set_universe_like(set);
-	r = isl_set_foreach_basic_set(set, basic_set_bound_split, &cbs);
-	assert(r == 0);
-	return cloog_domain_from_isl_set(cbs.set);
-}
-
-
-/* Check whether the union of scattering functions over all domains
- * is obviously injective.
- */
-static int injective_scattering(CloogScatteringList *list)
-{
-	isl_map *map;
-	isl_union_map *umap;
-	int injective;
-	int i = 0;
-	char name[30];
-
-	if (!list)
-		return 1;
-	
-	map = isl_map_copy(isl_map_from_cloog_scattering(list->scatt));
-	snprintf(name, sizeof(name), "S%d", i);
-	map = isl_map_set_tuple_name(map, isl_dim_in, name);
-	umap = isl_union_map_from_map(map);
-
-	for (list = list->next, ++i; list; list = list->next, ++i) {
-		map = isl_map_copy(isl_map_from_cloog_scattering(list->scatt));
-		snprintf(name, sizeof(name), "S%d", i);
-		map = isl_map_set_tuple_name(map, isl_dim_in, name);
-		umap = isl_union_map_add_map(umap, map);
-	}
-
-	injective = isl_union_map_plain_is_injective(umap);
-
-	isl_union_map_free(umap);
-
-	return injective;
-}
-
-
-/**
- * cloog_scattering_lazy_block function:
- * This function returns 1 if the two scattering functions s1 and s2 given
- * as input are the same (except possibly for the final dimension, where we
- * allow a difference of 1), assuming that the domains on which this
- * scatterings are applied are the same.
- * In fact this function answers the question "can I
- * safely consider the two domains as only one with two statements (a block) ?".
- * A difference of 1 in the final dimension is only allowed if the
- * entire scattering function is injective.
- * - s1 and s2 are the two domains to check for blocking,
- * - scattering is the linked list of all domains,
- * - scattdims is the total number of scattering dimentions.
- */
-int cloog_scattering_lazy_block(CloogScattering *s1, CloogScattering *s2,
-			    CloogScatteringList *scattering, int scattdims)
-{
-	int i;
-	struct isl_space *dim;
-	struct isl_map *rel;
-	struct isl_set *delta;
-	isl_map *map1 = isl_map_from_cloog_scattering(s1);
-	isl_map *map2 = isl_map_from_cloog_scattering(s2);
-	int fixed, block;
-	isl_int cst;
-	unsigned n_scat;
-
-	n_scat = isl_map_dim(map1, isl_dim_out);
-	if (n_scat != isl_map_dim(map2, isl_dim_out))
-		return 0;
-
-	dim = isl_map_get_space(map1);
-	dim = isl_space_map_from_set(isl_space_domain(dim));
-	rel = isl_map_identity(dim);
-	rel = isl_map_apply_domain(rel, isl_map_copy(map1));
-	rel = isl_map_apply_range(rel, isl_map_copy(map2));
-	delta = isl_map_deltas(rel);
-	isl_int_init(cst);
-	for (i = 0; i < n_scat; ++i) {
-		fixed = isl_set_fast_dim_is_fixed(delta, i, &cst);
-		if (fixed != 1)
-			break;
-		if (isl_int_is_zero(cst))
-			continue;
-		if (i + 1 < n_scat)
-			break;
-		if (!isl_int_is_one(cst))
-			break;
-		if (!injective_scattering(scattering))
-			break;
-	}
-	block = i >= n_scat;
-	isl_int_clear(cst);
-	isl_set_free(delta);
-	return block;
-}
-
-
-/**
- * cloog_domain_lazy_disjoint function:
- * This function returns 1 if the domains given as input are disjoint, 0 if it
- * is unable to decide.
- */
-int cloog_domain_lazy_disjoint(CloogDomain *d1, CloogDomain *d2)
-{
-	isl_set *set1 = isl_set_from_cloog_domain(d1);
-	isl_set *set2 = isl_set_from_cloog_domain(d2);
-	return isl_set_fast_is_disjoint(set1, set2);
-} 
- 
- 
-/**
- * cloog_scattering_list_lazy_same function:
- * This function returns 1 if two domains in the list are the same, 0 if it
- * is unable to decide.
- */
-int cloog_scattering_list_lazy_same(CloogScatteringList *list)
-{
-	CloogScatteringList *one, *other;
-	isl_map *one_map, *other_map;
-
-	for (one = list; one; one = one->next) {
-		one_map = isl_map_from_cloog_scattering(one->scatt);
-		for (other = one->next; other; other = other->next) {
-			other_map = isl_map_from_cloog_scattering(other->scatt);
-			if (isl_map_fast_is_equal(one_map, other_map))
-				return 1;
-		}
-	}
-	return 0;
-}
-
-int cloog_domain_dimension(CloogDomain * domain)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	return isl_set_dim(set, isl_dim_set);
-}
-
-int cloog_domain_parameter_dimension(CloogDomain *domain)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	return isl_set_dim(set, isl_dim_param);
-}
-
-int cloog_scattering_dimension(CloogScattering *scatt, CloogDomain *domain)
-{
-	isl_map *map = isl_map_from_cloog_scattering(scatt);
-	return isl_map_dim(map, isl_dim_out);
-}
-
-int cloog_domain_isconvex(CloogDomain * domain)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	return isl_set_n_basic_set(set) <= 1;
-}
-
-
-/**
- * cloog_domain_cut_first function:
- * This function splits off and returns the first convex set in the
- * union "domain".  The remainder of the union is returned in rest.
- * The original "domain" itself is destroyed and may not be used
- * after a call to this function.
- */
-CloogDomain *cloog_domain_cut_first(CloogDomain *domain, CloogDomain **rest)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	struct isl_basic_set *first;
-
-	first = isl_set_copy_basic_set(set);
-	set = isl_set_drop_basic_set(set, first);
-	*rest = cloog_domain_from_isl_set(set);
-
-	return cloog_domain_from_isl_set(isl_set_from_basic_set(first));
-}
-
-
-/**
- * Given a union domain, try to find a simpler representation
- * using fewer sets in the union.
- * The original "domain" itself is destroyed and may not be used
- * after a call to this function.
- */
-CloogDomain *cloog_domain_simplify_union(CloogDomain *domain)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	return cloog_domain_from_isl_set(isl_set_coalesce(set));
-}
-
-
-/**
- * cloog_scattering_lazy_isscalar function:
- * this function returns 1 if the scattering dimension 'dimension' in the
- * scattering 'scatt' is constant.
- * If value is not NULL, then it is set to the constant value of dimension.
- */
-int cloog_scattering_lazy_isscalar(CloogScattering *scatt, int dimension,
-					cloog_int_t *value)
-{
-	isl_map *map = isl_map_from_cloog_scattering(scatt);
-	return isl_map_fast_is_fixed(map, isl_dim_out, dimension, value);
-}
-
-
-/**
- * cloog_domain_lazy_isconstant function:
- * this function returns 1 if the dimension 'dimension' in the
- * domain 'domain' is constant.
- * If value is not NULL, then it is set to the constant value of dimension.
- */
-int cloog_domain_lazy_isconstant(CloogDomain *domain, int dimension,
-	cloog_int_t *value)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	return isl_set_fast_dim_is_fixed(set, dimension, value);
-}
-
-
-/**
- * cloog_scattering_erase_dimension function:
- * this function returns a CloogDomain structure builds from 'domain' where
- * we removed the dimension 'dimension' and every constraint involving this
- * dimension.
- */
-CloogScattering *cloog_scattering_erase_dimension(CloogScattering *scattering,
-						int dimension)
-{
-	isl_map *map = isl_map_from_cloog_scattering(scattering);
-	map = isl_map_remove_dims(isl_map_copy(map), isl_dim_out, dimension, 1);
-	return cloog_scattering_from_isl_map(map);
-}
-
-/**
- * cloog_domain_cube:
- * Construct and return a dim-dimensional cube, with values ranging
- * between min and max in each dimension.
- */
-CloogDomain *cloog_domain_cube(CloogState *state,
-				int dim, cloog_int_t min, cloog_int_t max)
-{
-	int i;
-	struct isl_basic_set *cube;
-	struct isl_basic_set *interval;
-	struct isl_basic_set_list *list;
-
-	if (dim == 0)
-		return cloog_domain_universe(state, dim);
-
-	interval = isl_basic_set_interval(state->backend->ctx, min, max);
-	list = isl_basic_set_list_alloc(state->backend->ctx, dim);
-	for (i = 0; i < dim; ++i)
-		list = isl_basic_set_list_add(list, isl_basic_set_copy(interval));
-	isl_basic_set_free(interval);
-	cube = isl_basic_set_list_product(list);
-	return cloog_domain_from_isl_set(isl_set_from_basic_set(cube));
-}
-
-
-/**
- * cloog_domain_scatter function:
- * This function add the scattering (scheduling) informations to a domain.
- */
-CloogDomain *cloog_domain_scatter(CloogDomain *domain, CloogScattering *scatt)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	isl_map *map = isl_map_from_cloog_scattering(scatt);
-
-	map = isl_map_reverse(isl_map_copy(map));
-	map = isl_map_intersect_range(map, set);
-	set = isl_set_flatten(isl_map_wrap(map));
-	return cloog_domain_from_isl_set(set);
-}
-
-static int add_domain_from_map(__isl_take isl_map *map, void *user)
-{
-	isl_space *dim;
-	const char *name;
-	CloogDomain *domain;
-	CloogScattering *scat;
-	CloogUnionDomain **ud = (CloogUnionDomain **)user;
-
-	dim = isl_map_get_space(map);
-	name = isl_space_get_tuple_name(dim, isl_dim_in);
-	domain = cloog_domain_from_isl_set(isl_map_domain(isl_map_copy(map)));
-	scat = cloog_scattering_from_isl_map(map);
-	*ud = cloog_union_domain_add_domain(*ud, name, domain, scat, NULL);
-	isl_space_free(dim);
-
-	return 0;
-}
-
-/**
- * Construct a CloogUnionDomain from an isl_union_map representing
- * a global scattering function.  The input is a mapping from different
- * spaces (different tuple names and possibly different dimensions)
- * to a common space.  The iteration domains are set to the domains
- * in each space.  The statement names are set to the names of the
- * spaces.  The parameter names of the result are set to those of
- * the input, but the iterator and scattering dimension names are
- * left unspecified.
- */
-CloogUnionDomain *cloog_union_domain_from_isl_union_map(
-	__isl_take isl_union_map *umap)
-{
-	int i;
-	int nparam;
-	isl_space *dim;
-	CloogUnionDomain *ud;
-
-	dim = isl_union_map_get_space(umap);
-	nparam = isl_space_dim(dim, isl_dim_param);
-
-	ud = cloog_union_domain_alloc(nparam);
-
-	for (i = 0; i < nparam; ++i) {
-		const char *s = isl_space_get_dim_name(dim, isl_dim_param, i);
-		ud = cloog_union_domain_set_name(ud, CLOOG_PARAM, i, s);
-	}
-	isl_space_free(dim);
-
-	if (isl_union_map_foreach_map(umap, &add_domain_from_map, &ud) < 0) {
-		isl_union_map_free(umap);
-		cloog_union_domain_free(ud);
-		assert(0);
-	}
-
-	isl_union_map_free(umap);
-
-	return ud;
-}
-
-static int count_same_name(__isl_keep isl_space *dim,
-	enum isl_dim_type type, unsigned pos, const char *name)
-{
-	enum isl_dim_type t;
-	unsigned p, s;
-	int count = 0;
-	int len = strlen(name);
-
-	for (t = isl_dim_param; t <= type && t <= isl_dim_out; ++t) {
-		s = t == type ? pos : isl_space_dim(dim, t);
-		for (p = 0; p < s; ++p) {
-			const char *n = isl_space_get_dim_name(dim, t, p);
-			if (n && !strncmp(n, name, len))
-				count++;
-		}
-	}
-	return count;
-}
-
-static CloogUnionDomain *add_domain(__isl_take isl_set *set, CloogUnionDomain *ud)
-{
-	int i, nvar;
-	isl_ctx *ctx;
-	isl_space *dim;
-	char buffer[20];
-	const char *name;
-	CloogDomain *domain;
-
-	ctx = isl_set_get_ctx(set);
-	dim = isl_set_get_space(set);
-	name = isl_space_get_tuple_name(dim, isl_dim_set);
-	set = isl_set_flatten(set);
-	set = isl_set_set_tuple_name(set, NULL);
-	domain = cloog_domain_from_isl_set(set);
-	ud = cloog_union_domain_add_domain(ud, name, domain, NULL, NULL);
-
-	nvar = isl_space_dim(dim, isl_dim_set);
-	for (i = 0; i < nvar; ++i) {
-		char *long_name = NULL;
-		int n;
-
-		name = isl_space_get_dim_name(dim, isl_dim_set, i);
-		if (!name) {
-			snprintf(buffer, sizeof(buffer), "i%d", i);
-			name = buffer;
-		}
-		n = count_same_name(dim, isl_dim_set, i, name);
-		if (n) {
-			int size = strlen(name) + 10;
-			long_name = isl_alloc_array(ctx, char, size);
-			if (!long_name)
-				cloog_die("memory overflow.\n");
-			snprintf(long_name, size, "%s_%d", name, n);
-			name = long_name;
-		}
-		ud = cloog_union_domain_set_name(ud, CLOOG_ITER, i, name);
-		free(long_name);
-	}
-	isl_space_free(dim);
-
-	return ud;
-}
-
-/**
- * Construct a CloogUnionDomain from an isl_set.
- * The statement names are set to the names of the
- * spaces.  The parameter and iterator names of the result are set to those of
- * the input, but the scattering dimension names are left unspecified.
- */
-CloogUnionDomain *cloog_union_domain_from_isl_set(
-	__isl_take isl_set *set)
-{
-	int i;
-	int nparam;
-	isl_space *dim;
-	CloogUnionDomain *ud;
-
-	dim = isl_set_get_space(set);
-	nparam = isl_space_dim(dim, isl_dim_param);
-
-	ud = cloog_union_domain_alloc(nparam);
-
-	for (i = 0; i < nparam; ++i) {
-		const char *s = isl_space_get_dim_name(dim, isl_dim_param, i);
-		ud = cloog_union_domain_set_name(ud, CLOOG_PARAM, i, s);
-	}
-	isl_space_free(dim);
-
-	ud = add_domain(set, ud);
-
-	return ud;
-}
-
-/* Computes x, y and g such that g = gcd(a,b) and a*x+b*y = g */
-static void Euclid(cloog_int_t a, cloog_int_t b,
-			cloog_int_t *x, cloog_int_t *y, cloog_int_t *g)
-{
-	cloog_int_t c, d, e, f, tmp;
-
-	cloog_int_init(c);
-	cloog_int_init(d);
-	cloog_int_init(e);
-	cloog_int_init(f);
-	cloog_int_init(tmp);
-	cloog_int_abs(c, a);
-	cloog_int_abs(d, b);
-	cloog_int_set_si(e, 1);
-	cloog_int_set_si(f, 0);
-	while (cloog_int_is_pos(d)) {
-		cloog_int_tdiv_q(tmp, c, d);
-		cloog_int_mul(tmp, tmp, f);
-		cloog_int_sub(e, e, tmp);
-		cloog_int_tdiv_q(tmp, c, d);
-		cloog_int_mul(tmp, tmp, d);
-		cloog_int_sub(c, c, tmp);
-		cloog_int_swap(c, d);
-	    cloog_int_swap(e, f);
-	}
-	cloog_int_set(*g, c);
-	if (cloog_int_is_zero(a))
-		cloog_int_set_si(*x, 0);
-	else if (cloog_int_is_pos(a))
-		cloog_int_set(*x, e);
-	else cloog_int_neg(*x, e);
-	if (cloog_int_is_zero(b))
-		cloog_int_set_si(*y, 0);
-	else {
-		cloog_int_mul(tmp, a, *x);
-		cloog_int_sub(tmp, c, tmp);
-		cloog_int_divexact(*y, tmp, b);
-	}
-	cloog_int_clear(c);
-	cloog_int_clear(d);
-	cloog_int_clear(e);
-	cloog_int_clear(f);
-	cloog_int_clear(tmp);
-}
-
-/* Construct a CloogStride from the given constraint for the given level,
- * if possible.
- * We first compute the gcd of the coefficients of the existentially
- * quantified variables and then remove any common factors it has
- * with the coefficient at the given level.
- * The result is the value of the stride and if it is not one,
- * then it is possible to construct a CloogStride.
- * The constraint leading to the stride is stored in the CloogStride
- * as well a value (factor) such that the product of this value
- * and the coefficient at the given level is equal to -1 modulo the stride.
- */
-static CloogStride *construct_stride(isl_constraint *c, int level)
-{
-	int i, n, sign;
-	isl_int v, m, gcd, stride, factor;
-	CloogStride *s;
-
-	if (!c)
-		return NULL;
-
-	isl_int_init(v);
-	isl_int_init(m);
-	isl_int_init(gcd);
-	isl_int_init(factor);
-	isl_int_init(stride);
-
-	isl_constraint_get_coefficient(c, isl_dim_set, level - 1, &v);
-	sign = isl_int_sgn(v);
-	isl_int_abs(m, v);
-
-	isl_int_set_si(gcd, 0);
-	n = isl_constraint_dim(c, isl_dim_div);
-	for (i = 0; i < n; ++i) {
-		isl_constraint_get_coefficient(c, isl_dim_div, i, &v);
-		isl_int_gcd(gcd, gcd, v);
-	}
-
-	isl_int_gcd(v, m, gcd);
-	isl_int_divexact(stride, gcd, v);
-
-	if (isl_int_is_zero(stride) || isl_int_is_one(stride))
-		s = NULL;
-	else {
-		Euclid(m, stride, &factor, &v, &gcd);
-		if (sign > 0)
-			isl_int_neg(factor, factor);
-
-		c = isl_constraint_copy(c);
-		s = cloog_stride_alloc_from_constraint(stride,
-			    cloog_constraint_from_isl_constraint(c), factor);
-	}
-
-	isl_int_clear(stride);
-	isl_int_clear(factor);
-	isl_int_clear(gcd);
-	isl_int_clear(m);
-	isl_int_clear(v);
-
-	return s;
-}
-
-struct cloog_isl_find_stride_data {
-	int level;
-	CloogStride *stride;
-};
-
-/* Check if the given constraint can be used to derive
- * a stride on the iterator identified by data->level.
- * We first check that there are some existentially quantified variables
- * and that the coefficient at data->level is non-zero.
- * Then we call construct_stride for further checks and the actual
- * construction of the CloogStride.
- */
-static int find_stride(__isl_take isl_constraint *c, void *user)
-{
-	struct cloog_isl_find_stride_data *data;
-	int n;
-	isl_int v;
-
-	data = (struct cloog_isl_find_stride_data *)user;
-
-	if (data->stride) {
-		isl_constraint_free(c);
-		return 0;
-	}
-
-	n = isl_constraint_dim(c, isl_dim_div);
-	if (n == 0) {
-		isl_constraint_free(c);
-		return 0;
-	}
-
-	isl_int_init(v);
-
-	isl_constraint_get_coefficient(c, isl_dim_set, data->level - 1, &v);
-	if (!isl_int_is_zero(v))
-		data->stride = construct_stride(c, data->level);
-
-	isl_int_clear(v);
-
-	isl_constraint_free(c);
-
-	return 0;
-}
-
-/* Check if the given list of domains has a common stride on the given level.
- * If so, return a pointer to a CloogStride object.  If not, return NULL.
- *
- * We project out all later variables, take the union and compute
- * the affine hull of the union.  Then we check the (equality)
- * constraints in this affine hull for imposing a stride.
- */
-CloogStride *cloog_domain_list_stride(CloogDomainList *list, int level)
-{
-	struct cloog_isl_find_stride_data data = { level, NULL };
-	isl_set *set;
-	isl_basic_set *aff;
-	int first = level;
-	int n;
-	int r;
-
-	set = isl_set_from_cloog_domain(list->domain);
-	n = isl_set_dim(set, isl_dim_set) - first;
-	set = isl_set_project_out(isl_set_copy(set), isl_dim_set, first, n);
-
-	for (list = list->next; list; list = list->next) {
-		isl_set *set_i = isl_set_from_cloog_domain(list->domain);
-		n = isl_set_dim(set_i, isl_dim_set) - first;
-		set_i = isl_set_project_out(isl_set_copy(set_i),
-						isl_dim_set, first, n);
-		set = isl_set_union(set, set_i);
-	}
-	aff = isl_set_affine_hull(set);
-
-	r = isl_basic_set_foreach_constraint(aff, &find_stride, &data);
-	assert(r == 0);
-
-	isl_basic_set_free(aff);
-
-	return data.stride;
-}
-
-struct cloog_can_unroll {
-	int can_unroll;
-	int level;
-	isl_constraint *c;
-	isl_set *set;
-	isl_int *n;
-};
-
-
-/*
- * Check if the given lower bound can be used for unrolling
- * and, if so, return the unrolling factor/trip count in *v.
- * If the lower bound involves any existentially quantified
- * variables, we currently punt.
- * Otherwise we compute the maximal value of (i - ceil(l) + 1),
- * with l the given lower bound and i the iterator identified by level.
- */
-static int is_valid_unrolling_lower_bound(struct cloog_can_unroll *ccu,
-	__isl_keep isl_constraint *c, isl_int *v)
-{
-	unsigned n_div;
-	isl_aff *aff;
-	enum isl_lp_result res;
-
-	n_div = isl_constraint_dim(c, isl_dim_div);
-	if (isl_constraint_involves_dims(c, isl_dim_div, 0, n_div))
-		return 0;
-
-	aff = isl_constraint_get_bound(c, isl_dim_set, ccu->level - 1);
-	aff = isl_aff_ceil(aff);
-	aff = isl_aff_neg(aff);
-	aff = isl_aff_add_coefficient_si(aff, isl_dim_in, ccu->level - 1, 1);
-	res = isl_set_max(ccu->set, aff, v);
-	isl_aff_free(aff);
-
-	if (res == isl_lp_unbounded)
-		return 0;
-
-	assert(res == isl_lp_ok);
-
-	cloog_int_add_ui(*v, *v, 1);
-
-	return 1;
-}
-
-
-/* Check if we can unroll based on the given constraint.
- * Only lower bounds can be used.
- * Record it if it turns out to be usable and if we haven't recorded
- * any other constraint already.
- */
-static int constraint_can_unroll(__isl_take isl_constraint *c, void *user)
-{
-	struct cloog_can_unroll *ccu = (struct cloog_can_unroll *)user;
-	isl_int v;
-	isl_int count;
-
-	isl_int_init(v);
-	isl_int_init(count);
-	isl_constraint_get_coefficient(c, isl_dim_set, ccu->level - 1, &v);
-	if (isl_int_is_pos(v) &&
-	    is_valid_unrolling_lower_bound(ccu, c, &count) &&
-	    (!ccu->c || isl_int_lt(count, *ccu->n))) {
-		isl_constraint_free(ccu->c);
-		ccu->c = isl_constraint_copy(c);
-		isl_int_set(*ccu->n, count);
-	}
-	isl_int_clear(count);
-	isl_int_clear(v);
-	isl_constraint_free(c);
-
-	return 0;
-}
-
-
-/* Check if we can unroll the domain at the current level.
- * If the domain is a union, we cannot.  Otherwise, we check the
- * constraints.
- */
-static int basic_set_can_unroll(__isl_take isl_basic_set *bset, void *user)
-{
-	struct cloog_can_unroll *ccu = (struct cloog_can_unroll *)user;
-	int r = 0;
-
-	if (ccu->c || !ccu->can_unroll)
-		ccu->can_unroll = 0;
-	else {
-		bset = isl_basic_set_remove_redundancies(bset);
-		r = isl_basic_set_foreach_constraint(bset,
-						&constraint_can_unroll, ccu);
-	}
-	isl_basic_set_free(bset);
-	return r;
-}
-
-
-/* Check if we can unroll the given domain at the given level, and
- * if so, return the single lower bound in *lb and an upper bound
- * on the number of iterations in *n.
- * If we cannot unroll, return 0 and set *lb to NULL.
- *
- * We can unroll, if we can identify a lower bound on level
- * such that the number of iterations is bounded by a constant.
- */
-int cloog_domain_can_unroll(CloogDomain *domain, int level, cloog_int_t *n,
-	CloogConstraint **lb)
-{
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	struct cloog_can_unroll ccu = { 1, level, NULL, set, n };
-	int r;
-
-	*lb = NULL;
-	r = isl_set_foreach_basic_set(set, &basic_set_can_unroll, &ccu);
-	assert(r == 0);
-	if (!ccu.c)
-		ccu.can_unroll = 0;
-	if (!ccu.can_unroll) {
-		isl_constraint_free(ccu.c);
-		return 0;
-	}
-
-	*lb = cloog_constraint_from_isl_constraint(ccu.c);
-
-	return ccu.can_unroll;
-}
-
-
-/* Fix the iterator i at the given level to l + o,
- * where l is prescribed by the constraint lb and o is equal to offset.
- * In particular, if lb is the constraint
- *
- *	a i >= f(j)
- *
- * then l = ceil(f(j)/a).
- */
-CloogDomain *cloog_domain_fixed_offset(CloogDomain *domain,
-	int level, CloogConstraint *lb, cloog_int_t offset)
-{
-	isl_aff *aff;
-	isl_set *set = isl_set_from_cloog_domain(domain);
-	isl_constraint *c;
-	isl_constraint *eq;
-
-	c = cloog_constraint_to_isl(lb);
-	aff = isl_constraint_get_bound(c, isl_dim_set, level - 1);
-	aff = isl_aff_ceil(aff);
-	aff = isl_aff_add_coefficient_si(aff, isl_dim_in, level - 1, -1);
-	aff = isl_aff_add_constant(aff, offset);
-	eq = isl_equality_from_aff(aff);
-	set = isl_set_add_constraint(set, eq);
-
-	return cloog_domain_from_isl_set(set);
-}
diff --git a/cloog-0.17.0/source/loop.c b/cloog-0.17.0/source/loop.c
deleted file mode 100644
index f3d0ef9..0000000
--- a/cloog-0.17.0/source/loop.c
+++ /dev/null
@@ -1,2665 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                             loop.c                                **
-    **-------------------------------------------------------------------**
-    **                  First version: october 26th 2001                 **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-/* CAUTION: the english used for comments is probably the worst you ever read,
- *          please feel free to correct and improve it !
- */
-
-# include <stdlib.h>
-# include <stdio.h>
-# include "../include/cloog/cloog.h"
-
-#define ALLOC(type) (type*)malloc(sizeof(type))
-
-
-/******************************************************************************
- *                             Memory leaks hunting                           *
- ******************************************************************************/
-
-
-/**
- * These functions and global variables are devoted to memory leaks hunting: we
- * want to know at each moment how many CloogLoop structures had been allocated
- * (cloog_loop_allocated) and how many had been freed (cloog_loop_freed).
- * Each time a CloogLoog structure is allocated, a call to the function
- * cloog_loop_leak_up() must be carried out, and respectively
- * cloog_loop_leak_down() when a CloogLoop structure is freed. The special
- * variable cloog_loop_max gives the maximal number of CloogLoop structures
- * simultaneously alive (i.e. allocated and non-freed) in memory.
- * - July 3rd->11th 2003: first version (memory leaks hunt and correction).
- */
- 
-
-static void cloog_loop_leak_up(CloogState *state)
-{
-  state->loop_allocated++;
-  if ((state->loop_allocated - state->loop_freed) > state->loop_max)
-    state->loop_max = state->loop_allocated - state->loop_freed;
-}
-
-
-static void cloog_loop_leak_down(CloogState *state)
-{
-  state->loop_freed++;
-}
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-
-
-/**
- * cloog_loop_print_structure function:
- * Displays a loop structure in a way that trends to be understandable without
- * falling in a deep depression or, for the lucky ones, getting a headache... 
- * Written by Olivier Chorier, Luc Marchaud, Pierre Martin and Romain Tartiere.
- * - April 24th 2005: Initial version.
- * - May   21rd 2005: - New parameter `F' for destination file (ie stdout),
- *                    - Minor tweaks.
- * - May   26th 2005: Memory leak hunt.
- * - June   2nd 2005: (Ced) Integration and minor fixes.
- * -June  22nd 2005: (Ced) Adaptation for GMP.
- */
-void cloog_loop_print_structure(FILE * file, CloogLoop * loop, int level)
-{ int i, j, first=1 ;
-
-  if (loop)
-  { /* Go to the right level. */
-    for (i=0; i<level; i++)
-    fprintf(file,"|\t") ;
-    
-    fprintf(file,"+-- CloogLoop\n") ;
-  }
-  
-  /* For each loop. */
-  while (loop)
-  { if (!first)
-    { /* Go to the right level. */
-      for (i=0; i<level; i++)
-      fprintf(file,"|\t") ;
-    
-      fprintf(file,"|   CloogLoop\n") ;
-    }
-    else
-    first = 0 ;
-    
-    /* A blank line. */
-    for(j=0; j<=level+1; j++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"\n") ;
-
-    /* Print the domain. */
-    cloog_domain_print_structure(file, loop->domain, level+1, "CloogDomain");
-    
-    /* Print the stride. */
-    for(j=0; j<=level; j++)
-    fprintf(file,"|\t") ;
-    if (loop->stride) {
-	fprintf(file, "Stride: ");
-	cloog_int_print(file, loop->stride->stride);
-	fprintf(file, "\n");
-	fprintf(file, "Offset: ");
-	cloog_int_print(file, loop->stride->offset);
-	fprintf(file, "\n");
-    }
-        
-    /* A blank line. */
-    for(j=0; j<=level+1; j++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"\n") ;
-    
-    /* Print the block. */
-    cloog_block_print_structure(file,loop->block,level+1) ;
-    
-    /* A blank line. */
-    for (i=0; i<=level+1; i++)
-    fprintf(file,"|\t") ;  
-    fprintf(file,"\n") ;
-    
-    /* Print inner if any. */
-    if (loop->inner)
-    cloog_loop_print_structure(file,loop->inner,level+1) ;
-    
-    /* And let's go for the next one. */
-    loop = loop->next ;
-
-    /* One more time something that is here only for a better look. */
-    if (!loop)
-    { /* Two blank lines if this is the end of the linked list. */
-      for (j=0; j<2; j++)
-      { for (i=0; i<=level; i++)
-        fprintf(file,"|\t") ;
-      
-        fprintf(file,"\n") ;
-      }
-    }
-    else
-    { /* A special blank line if the is a next loop. */
-      for (i=0; i<=level; i++)
-      fprintf(file,"|\t") ;  
-      fprintf(file,"V\n") ;
-    }
-  }
-}
-
-
-/**
- * cloog_loop_print function:
- * This function prints the content of a CloogLoop structure (start) into a
- * file (file, possibly stdout).
- * - June 2nd 2005: Now this very old function (probably as old as CLooG) is
- *                  only a frontend to cloog_loop_print_structure, with a quite
- *                  better human-readable representation.
- */
-void cloog_loop_print(FILE * file, CloogLoop * loop)
-{ cloog_loop_print_structure(file,loop,0) ;
-}
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-
-
-/**
- * cloog_loop_free function:
- * This function frees the allocated memory for a CloogLoop structure (loop),
- * and frees its inner loops and its next loops.
- * - June 22nd 2005: Adaptation for GMP.
- */
-void cloog_loop_free(CloogLoop * loop)
-{ CloogLoop * next ;
-  
-  while (loop != NULL) {
-    cloog_loop_leak_down(loop->state);
-    
-    next = loop->next ;
-    cloog_domain_free(loop->domain) ;
-    cloog_domain_free(loop->unsimplified);
-    cloog_block_free(loop->block) ;
-    if (loop->inner != NULL)
-    cloog_loop_free(loop->inner) ;
-    
-    cloog_stride_free(loop->stride);
-    free(loop) ;
-    loop = next ;
-  }
-}
-
-
-/**
- * cloog_loop_free_parts function:
- * This function frees the allocated memory for some parts of a CloogLoop
- * structure (loop), each other argument is a boolean having to be set to 1 if
- * we want to free the corresponding part, 0 otherwise. This function applies
- * the same freeing policy to its inner ans next loops recursively.
- * - July  3rd 2003: first version.
- * - June 22nd 2005: Adaptation for GMP.
- */
-void cloog_loop_free_parts(loop, domain, block, inner, next)
-CloogLoop * loop ;
-int domain, block, inner, next ;
-{ CloogLoop * follow ;
-
-  while (loop != NULL) {
-    cloog_loop_leak_down(loop->state);
-    follow = loop->next ;
-    
-    if (domain)
-    cloog_domain_free(loop->domain) ;
-       
-    if (block)
-    cloog_block_free(loop->block) ;
-     
-    if ((inner) && (loop->inner != NULL))
-    cloog_loop_free_parts(loop->inner,domain,block,inner,1) ;
-    
-    cloog_domain_free(loop->unsimplified);
-    cloog_stride_free(loop->stride);
-    free(loop) ;
-    if (next)
-    loop = follow ;
-    else
-    loop = NULL ;
-  }
-}
-
-
-/******************************************************************************
- *                              Reading functions                             *
- ******************************************************************************/
-
-
-/**
- * Construct a CloogLoop structure from a given iteration domain
- * and statement number.
- */
-CloogLoop *cloog_loop_from_domain(CloogState *state, CloogDomain *domain,
-	int number)
-{
-  int nb_iterators;
-  CloogLoop * loop ;
-  CloogStatement * statement ;
-  
-  /* Memory allocation and information reading for the first domain: */
-  loop = cloog_loop_malloc(state);
-  /* domain. */
-  loop->domain = domain;
-  if (loop->domain != NULL)
-    nb_iterators = cloog_domain_dimension(loop->domain);
-  else
-  nb_iterators = 0 ;
-  /* included statement block. */
-  statement = cloog_statement_alloc(state, number + 1);
-  loop->block = cloog_block_alloc(statement, 0, NULL, nb_iterators);
-
-  return loop ;
-}
-
-
-/**
- * cloog_loop_read function:
- * This function reads loop data from a file (foo, possibly stdin) and
- * returns a pointer to a CloogLoop structure containing the read information.
- * This function can be used only for input file reading, when one loop is
- * associated with one statement.
- * - number is the statement block number carried by the loop (-1 if none).
- * - nb_parameters is the number of parameters.
- **
- * - September 9th 2002: first version.
- * - April    16th 2005: adaptation to new CloogStatement struct (with number).
- * - June     11th 2005: adaptation to new CloogBlock structure. 
- * - June     22nd 2005: Adaptation for GMP.
- */
-CloogLoop *cloog_loop_read(CloogState *state,
-			    FILE *foo, int number, int nb_parameters)
-{
-  int op1, op2, op3;
-  char s[MAX_STRING];
-  CloogDomain *domain;
-
-  domain = cloog_domain_union_read(state, foo, nb_parameters);
-    
-  /* To read that stupid "0 0 0" line. */
-  while (fgets(s,MAX_STRING,foo) == 0) ;
-  while ((*s=='#' || *s=='\n') || (sscanf(s," %d %d %d",&op1,&op2,&op3)<3))
-  fgets(s,MAX_STRING,foo) ;
-
-  return cloog_loop_from_domain(state, domain, number);
-}
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-
-
-/**
- * cloog_loop_malloc function:
- * This function allocates the memory space for a CloogLoop structure and
- * sets its fields with default values. Then it returns a pointer to the
- * allocated space.
- * - November 21th 2005: first version.
- */
-CloogLoop *cloog_loop_malloc(CloogState *state)
-{ CloogLoop * loop ;
-  
-  /* Memory allocation for the CloogLoop structure. */
-  loop = (CloogLoop *)malloc(sizeof(CloogLoop)) ;
-  if (loop == NULL) 
-    cloog_die("memory overflow.\n");
-  cloog_loop_leak_up(state);
- 
-  
-  /* We set the various fields with default values. */
-  loop->state    = state;
-  loop->domain = NULL ;
-  loop->unsimplified = NULL;
-  loop->block  = NULL ;
-  loop->usr    = NULL;
-  loop->inner  = NULL ;
-  loop->next   = NULL ;
-  loop->otl = 0;
-  loop->stride = NULL;
-  
-  return loop ;
-}  
-
-
-/**
- * cloog_loop_alloc function:
- * This function allocates the memory space for a CloogLoop structure and
- * sets its fields with those given as input. Then it returns a pointer to the
- * allocated space.
- * - October  27th 2001: first version. 
- * - June     22nd 2005: Adaptation for GMP.
- * - November 21th 2005: use of cloog_loop_malloc.
- */ 
-CloogLoop *cloog_loop_alloc(CloogState *state,
-	CloogDomain *domain, int otl, CloogStride *stride,
-	CloogBlock *block, CloogLoop *inner, CloogLoop *next)
-{ CloogLoop * loop ;
-    
-  loop = cloog_loop_malloc(state);
-  
-  loop->domain = domain ;
-  loop->block  = block ;
-  loop->inner  = inner ;
-  loop->next   = next ;
-  loop->otl = otl;
-  loop->stride = cloog_stride_copy(stride);
-  
-  return(loop) ;
-}
-
-
-/**
- * cloog_loop_add function:
- * This function adds a CloogLoop structure (loop) at a given place (now) of a
- * NULL terminated list of CloogLoop structures. The beginning of this list
- * is (start). This function updates (now) to (loop), and updates (start) if the
- * added element is the first one -that is when (start) is NULL-.
- * - October 28th 2001: first version. 
- */ 
-void cloog_loop_add(CloogLoop ** start, CloogLoop ** now, CloogLoop * loop)
-{ if (*start == NULL)
-  { *start = loop ;
-    *now = *start ;
-  }
-  else
-  { (*now)->next = loop ;
-    *now = (*now)->next ;
-  }
-}
-
-
-/**
- * cloog_loop_add function:
- * This function adds a CloogLoop structure (loop) at a given place (now) of a
- * NULL terminated list of CloogLoop structures. The beginning of this list
- * is (start). This function updates (now) to the end of the loop list (loop),
- * and updates (start) if the added element is the first one -that is when
- * (start) is NULL-.
- * - September 9th 2005: first version.
- */ 
-void cloog_loop_add_list(CloogLoop ** start, CloogLoop ** now, CloogLoop * loop)
-{ if (*start == NULL)
-  { *start = loop ;
-    *now = *start ;
-  }
-  else
-  { (*now)->next = loop ;
-    *now = (*now)->next ;
-  }
-  
-  while ((*now)->next != NULL)
-  *now = (*now)->next ;
-}
-
-
-/**
- * cloog_loop_copy function:
- * This function returns a copy of the CloogLoop structure given as input. In
- * fact, there is just new allocations for the CloogLoop structures, but their
- * contents are the same.
- * - October 28th 2001: first version. 
- * - July 3rd->11th 2003: memory leaks hunt and correction.
- */ 
-CloogLoop * cloog_loop_copy(CloogLoop * source)
-{ CloogLoop * loop ;
-  CloogBlock * block ;
-  CloogDomain * domain ;
-
-  loop = NULL ;
-  if (source != NULL)
-  { domain = cloog_domain_copy(source->domain) ;
-    block  = cloog_block_copy(source->block) ;
-    loop   = cloog_loop_alloc(source->state, domain, source->otl,
-		source->stride, block, NULL,  NULL);
-    loop->usr = source->usr;
-    loop->inner = cloog_loop_copy(source->inner) ;
-    loop->next = cloog_loop_copy(source->next) ;
-  }
-  return(loop) ;
-}
-
-
-/**
- * cloog_loop_add_disjoint function:
- * This function adds some CloogLoop structures at a given place (now) of a
- * NULL terminated list of CloogLoop structures. The beginning of this list
- * is (start). (loop) can be an union of polyhedra, this function separates the
- * union into a list of *disjoint* polyhedra then adds the list. This function
- * updates (now) to the end of the list and updates (start) if first added
- * element is the first of the principal list -that is when (start) is NULL-.
- * (loop) can be freed by this function, basically when its domain is actually
- * a union of polyhedra, but don't worry, all the useful data are now stored
- * inside the list (start). We do not use PolyLib's Domain_Disjoint function,
- * since the number of union components is often higher (thus code size too).
- * - October   28th 2001: first version. 
- * - November  14th 2001: bug correction (this one was hard to find !).
- * - July 3rd->11th 2003: memory leaks hunt and correction.
- * - June      22nd 2005: Adaptation for GMP.
- * - October   27th 2005: (debug) included blocks were not copied for new loops.
- */ 
-void cloog_loop_add_disjoint(start, now, loop)
-CloogLoop ** start, ** now, * loop ;
-{
-  CloogLoop * sep, * inner ;
-  CloogDomain *domain, *seen, *temp, *rest;
-  CloogBlock * block ;
-  
-  if (cloog_domain_isconvex(loop->domain))
-  cloog_loop_add(start,now,loop) ;
-  else {
-    domain = cloog_domain_simplify_union(loop->domain);
-    loop->domain = NULL ;
-    
-    /* We separate the first element of the rest of the union. */
-    domain = cloog_domain_cut_first(domain, &rest);
-            
-    /* This first element is the first of the list of disjoint polyhedra. */
-    sep = cloog_loop_alloc(loop->state, domain, 0, NULL,
-			   loop->block, loop->inner, NULL);
-    cloog_loop_add(start,now,sep) ;
-  
-    seen = cloog_domain_copy(domain);
-    while (!cloog_domain_isempty(domain = rest)) {
-      temp = cloog_domain_cut_first(domain, &rest);
-      domain = cloog_domain_difference(temp, seen);
-      cloog_domain_free(temp);
-
-      if (cloog_domain_isempty(domain)) {
-	cloog_domain_free(domain);
-	continue;
-      }
-      
-      /* Each new loop will have its own life, for instance we can free its
-       * inner loop and included block. Then each one must have its own copy
-       * of both 'inner' and 'block'.
-       */
-      inner = cloog_loop_copy(loop->inner) ;
-      block = cloog_block_copy(loop->block) ;
-      
-      sep = cloog_loop_alloc(loop->state, cloog_domain_copy(domain),
-			     0, NULL, block, inner, NULL);
-      /* domain can be an union too. If so: recursion. */
-      if (cloog_domain_isconvex(domain))
-	cloog_loop_add(start,now,sep) ;
-      else
-	cloog_loop_add_disjoint(start,now,sep) ;
-
-      if (cloog_domain_isempty(rest)) {
-	cloog_domain_free(domain);
-	break;
-      }
-       
-      seen = cloog_domain_union(seen, domain);
-    }
-    cloog_domain_free(rest);
-    cloog_domain_free(seen);
-    cloog_loop_free_parts(loop,0,0,0,0) ;  
-  }
-}
-
-
-/**
- * cloog_loop_disjoint function:
- * This function returns a list of loops such that each loop with non-convex
- * domain in the input list (loop) is separated into several loops where the
- * domains are the components of the union of *disjoint* polyhedra equivalent
- * to the original non-convex domain. See cloog_loop_add_disjoint comments
- * for more details.
- * - September 16th 2005: first version.
- */
-CloogLoop * cloog_loop_disjoint(CloogLoop * loop)
-{ CloogLoop *res=NULL, * now=NULL, * next ;
-  
-  /* Because this is often the case, don't waste time ! */
-  if (loop && !loop->next && cloog_domain_isconvex(loop->domain))
-  return loop ;
-
-  while (loop != NULL)
-  { next = loop->next ;
-    loop->next = NULL ;
-    cloog_loop_add_disjoint(&res,&now,loop) ;
-    loop = next ;
-  }
-  
-  return res ;
-}
-
-
-/**
- * cloog_loop_restrict function:
- * This function returns the (loop) in the context of (context): it makes the
- * intersection between the (loop) domain and the (context), then it returns
- * a pointer to a new loop, with this intersection as domain.
- **
- * - October 27th 2001: first version. 
- * - June    15th 2005: a memory leak fixed (domain was not freed when empty).
- * - June    22nd 2005: Adaptation for GMP.
- */ 
-CloogLoop *cloog_loop_restrict(CloogLoop *loop, CloogDomain *context)
-{ int new_dimension ;
-  CloogDomain * domain, * extended_context, * new_domain ;
-  CloogLoop * new_loop ;
-      
-  domain = loop->domain ;
-  if (cloog_domain_dimension(domain) > cloog_domain_dimension(context))
-  {
-    new_dimension = cloog_domain_dimension(domain);
-    extended_context = cloog_domain_extend(context, new_dimension);
-    new_domain = cloog_domain_intersection(extended_context,loop->domain) ;
-    cloog_domain_free(extended_context) ;
-  }
-  else
-  new_domain = cloog_domain_intersection(context,loop->domain) ;
-  
-  if (cloog_domain_isempty(new_domain))
-  { cloog_domain_free(new_domain) ;
-    return(NULL) ;
-  }
-  else {
-    new_loop = cloog_loop_alloc(loop->state, new_domain,
-				0, NULL, loop->block, loop->inner, NULL);
-    return(new_loop) ;
-  }
-}
-
-
-/**
- * Call cloog_loop_restrict on each loop in the list "loop" and return
- * the concatenated result.
- */
-CloogLoop *cloog_loop_restrict_all(CloogLoop *loop, CloogDomain *context)
-{
-    CloogLoop *next;
-    CloogLoop *res = NULL;
-    CloogLoop **res_next = &res;
-
-    for (; loop; loop = next) {
-	next = loop->next;
-
-	*res_next = cloog_loop_restrict(loop, context);
-	if (*res_next) {
-	    res_next = &(*res_next)->next;
-	    cloog_loop_free_parts(loop, 1, 0, 0, 0);
-	} else {
-	    loop->next = NULL;
-	    cloog_loop_free(loop);
-	}
-    }
-
-    return res;
-}
-
-
-/**
- * Restrict the domains of the inner loops of each loop l in the given
- * list of loops to the domain of the loop l.  If the domains of all
- * inner loops of a given loop l turn out to be empty, then remove l
- * from the list.
- */
-CloogLoop *cloog_loop_restrict_inner(CloogLoop *loop)
-{
-    CloogLoop *next;
-    CloogLoop *res;
-    CloogLoop **res_next = &res;
-
-    for (; loop; loop = next) {
-	next = loop->next;
-
-	loop->inner = cloog_loop_restrict_all(loop->inner, loop->domain);
-	if (loop->inner) {
-	    *res_next = loop;
-	    res_next = &(*res_next)->next;
-	} else {
-	    loop->next = NULL;
-	    cloog_loop_free(loop);
-	}
-    }
-
-    *res_next = NULL;
-
-    return res;
-}
-
-/**
- * cloog_loop_project function:
- * This function returns the projection of (loop) on the (level) first
- * dimensions (outer loops). It makes the projection of the (loop) domain,
- * then it returns a pointer to a new loop, with this projection as domain.
- **
- * - October   27th 2001: first version. 
- * - July 3rd->11th 2003: memory leaks hunt and correction.
- * - June      22nd 2005: Adaptation for GMP.
- */ 
-CloogLoop * cloog_loop_project(CloogLoop * loop, int level)
-{
-  CloogDomain * new_domain ;
-  CloogLoop * new_loop, * copy ;
-
-  copy = cloog_loop_alloc(loop->state, loop->domain, loop->otl, loop->stride,
-			  loop->block, loop->inner, NULL);
-
-  if (cloog_domain_dimension(loop->domain) == level)
-  new_domain = cloog_domain_copy(loop->domain) ;  
-  else
-    new_domain = cloog_domain_project(loop->domain, level);
-
-  new_loop = cloog_loop_alloc(loop->state, new_domain, 0, NULL,
-			      NULL, copy, NULL);
-  
-  return(new_loop) ;
-}
-
-
-/**
- * Call cloog_loop_project on each loop in the list "loop" and return
- * the concatenated result.
- */
-CloogLoop *cloog_loop_project_all(CloogLoop *loop, int level)
-{
-    CloogLoop *next;
-    CloogLoop *res = NULL;
-    CloogLoop **res_next = &res;
-
-    for (; loop; loop = next) {
-	next = loop->next;
-
-	*res_next = cloog_loop_project(loop, level);
-	res_next = &(*res_next)->next;
-	cloog_loop_free_parts(loop, 0, 0, 0, 0);
-    }
-
-    return res;
-}
-
-
-/**
- * cloog_loop_concat function:
- * This function returns a pointer to the concatenation of the
- * CloogLoop lists given as input.
- * - October 28th 2001: first version. 
- */
-CloogLoop * cloog_loop_concat(CloogLoop * a, CloogLoop * b)
-{ CloogLoop * loop, * temp ;
-
-  loop = a  ;
-  temp = loop ;
-  if (loop != NULL)
-  { while (temp->next != NULL)
-    temp = temp->next ;
-    temp->next = b ;
-  }
-  else
-  loop = b ;
-  
-  return(loop) ;
-} 
-
-
-/**
- * cloog_loop_combine:
- * Combine consecutive loops with identical domains into
- * a single loop with the concatenation of their inner loops
- * as inner loop.
- */
-CloogLoop *cloog_loop_combine(CloogLoop *loop)
-{
-    CloogLoop *first, *second;
-
-    for (first = loop; first; first = first->next) {
-	while (first->next) {
-	    if (!cloog_domain_lazy_equal(first->domain, first->next->domain))
-		break;
-	    second = first->next;
-	    first->inner = cloog_loop_concat(first->inner, second->inner);
-	    first->next = second->next;
-	    cloog_loop_free_parts(second, 1, 0, 0, 0);
-	}
-    }
-
-    return loop;
-}
-
-/**
- * Remove loops from list that have an empty domain.
- */
-CloogLoop *cloog_loop_remove_empty_domain_loops(CloogLoop *loop)
-{
-    CloogLoop *l, *res, *next, **res_next;
-
-    res = NULL;
-    res_next = &res;
-    for (l = loop; l; l = next) {
-	next = l->next;
-	if (cloog_domain_isempty(l->domain))
-	    cloog_loop_free_parts(l, 1, 1, 1, 0);
-	else {
-	    *res_next = l;
-	    res_next = &(*res_next)->next;
-	}
-    }
-    *res_next = NULL;
-
-    return res;
-}
-
-CloogLoop *cloog_loop_decompose_inner(CloogLoop *loop,
-	int level, int scalar, int *scaldims, int nb_scattdims);
-
-/* For each loop with only one inner loop, replace the domain
- * of the loop with the projection of the domain of the inner
- * loop.  To increase the number of loops with a single inner
- * we first decompose the inner loops into strongly connected
- * components.
- */
-CloogLoop *cloog_loop_specialize(CloogLoop *loop,
-	int level, int scalar, int *scaldims, int nb_scattdims)
-{
-    int dim;
-    CloogDomain *domain;
-    CloogLoop *l;
-
-    loop = cloog_loop_decompose_inner(loop, level, scalar,
-					scaldims, nb_scattdims);
-
-    for (l = loop; l; l = l->next) {
-	if (l->inner->next)
-	    continue;
-	if (!cloog_domain_isconvex(l->inner->domain))
-	    continue;
-
-	dim = cloog_domain_dimension(l->domain);
-	domain = cloog_domain_project(l->inner->domain, dim);
-	if (cloog_domain_isconvex(domain)) {
-	    cloog_domain_free(l->domain);
-	    l->domain = domain;
-	} else {
-	    cloog_domain_free(domain);
-	}
-    }
-
-    return cloog_loop_remove_empty_domain_loops(loop);
-}
-
-/* For each loop with only one inner loop, propagate the bounds from
- * the inner loop domain to the outer loop domain.  This is especially
- * useful if the inner loop domain has a non-trivial stride which
- * results in an update of the lower bound.
- */
-CloogLoop *cloog_loop_propagate_lower_bound(CloogLoop *loop, int level)
-{
-    int dim;
-    CloogDomain *domain, *t;
-    CloogLoop *l;
-
-    for (l = loop; l; l = l->next) {
-	if (l->inner->next)
-	    continue;
-	if (!cloog_domain_isconvex(l->inner->domain))
-	    continue;
-
-	dim = cloog_domain_dimension(l->domain);
-	domain = cloog_domain_project(l->inner->domain, dim);
-	if (cloog_domain_isconvex(domain)) {
-	    t = cloog_domain_intersection(domain, l->domain);
-	    cloog_domain_free(l->domain);
-	    l->domain = t;
-	}
-	cloog_domain_free(domain);
-    }
-
-    return loop;
-}
-
-/**
- * cloog_loop_separate function:
- * This function implements the Quillere algorithm for separation of multiple
- * loops: for a given set of polyhedra (loop), it computes a set of disjoint
- * polyhedra such that the unions of these sets are equal, and returns this set.
- * - October   28th 2001: first version. 
- * - November  14th 2001: elimination of some unused blocks.
- * - August    13th 2002: (debug) in the case of union of polyhedra for one
- *                        loop, redundant constraints are fired.
- * - July 3rd->11th 2003: memory leaks hunt and correction.
- * - June      22nd 2005: Adaptation for GMP.
- * - October   16th 2005: Removal of the non-shared constraint elimination when
- *                        there is only one loop in the list (seems to work
- *                        without now, DomainSimplify may have been improved).
- *                        The problem was visible with test/iftest2.cloog.
- */ 
-CloogLoop * cloog_loop_separate(CloogLoop * loop)
-{ int lazy_equal=0, disjoint = 0;
-  CloogLoop * new_loop, * new_inner, * res, * now, * temp, * Q, 
-            * inner, * old /*, * previous, * next*/  ;
-  CloogDomain *UQ, *domain;
-  
-  if (loop == NULL)
-  return NULL ;
-
-  loop = cloog_loop_combine(loop);
-  
-  if (loop->next == NULL)
-  return cloog_loop_disjoint(loop) ;
-     
-  UQ     = cloog_domain_copy(loop->domain) ;
-  domain = cloog_domain_copy(loop->domain) ;
-  res    = cloog_loop_alloc(loop->state, domain, 0, NULL,
-			    loop->block, loop->inner, NULL);
-  	  
-  old = loop ;
-  while((loop = loop->next) != NULL)
-  { temp = NULL ;
-    
-    /* For all Q, add Q-loop associated with the blocks of Q alone,
-     * and Q inter loop associated with the blocks of Q and loop.
-     */
-    for (Q = res; Q; Q = Q->next) {
-        /* Add (Q inter loop). */
-        if ((disjoint = cloog_domain_lazy_disjoint(Q->domain,loop->domain)))
-	domain = NULL ;
-	else
-	{ if ((lazy_equal = cloog_domain_lazy_equal(Q->domain,loop->domain)))
-	  domain = cloog_domain_copy(Q->domain) ;
-          else
-	  domain = cloog_domain_intersection(Q->domain,loop->domain) ;
-          
-	  if (!cloog_domain_isempty(domain))
-          { new_inner = cloog_loop_concat(cloog_loop_copy(Q->inner),
-                                          cloog_loop_copy(loop->inner)) ;
-	    new_loop = cloog_loop_alloc(loop->state, domain, 0, NULL,
-					NULL, new_inner, NULL);
-            cloog_loop_add_disjoint(&temp,&now,new_loop) ;
-          }
-          else {
-	    disjoint = 1;
-	    cloog_domain_free(domain);
-	  }
-        }
-        
-	/* Add (Q - loop). */
-        if (disjoint)
-	domain = cloog_domain_copy(Q->domain) ;
-	else
-	{ if (lazy_equal)
-	  domain = cloog_domain_empty(Q->domain);
-	  else
-	  domain = cloog_domain_difference(Q->domain,loop->domain) ;
-	}
-	
-	if (!cloog_domain_isempty(domain)) {
-          new_loop = cloog_loop_alloc(loop->state, domain, 0, NULL,
-				      NULL, Q->inner, NULL);
-          cloog_loop_add_disjoint(&temp,&now,new_loop) ;
-        }
-        else
-        { cloog_domain_free(domain) ;
-	  /* If Q->inner is no more useful, we can free it. */
-          inner = Q->inner ;
-          Q->inner = NULL ;
-          cloog_loop_free(inner) ;
-        }
-    }
-
-    /* Add loop-UQ associated with the blocks of loop alone.*/
-    if (cloog_domain_lazy_disjoint(loop->domain,UQ))
-    domain = cloog_domain_copy(loop->domain) ;
-    else
-    { if (cloog_domain_lazy_equal(loop->domain,UQ))
-      domain = cloog_domain_empty(UQ);
-      else
-      domain = cloog_domain_difference(loop->domain,UQ) ;
-    }
-    
-    if (!cloog_domain_isempty(domain)) {
-      new_loop = cloog_loop_alloc(loop->state, domain, 0, NULL,
-				  NULL, loop->inner, NULL);
-      cloog_loop_add_disjoint(&temp,&now,new_loop) ;
-    }
-    else
-    { cloog_domain_free(domain) ;
-      /* If loop->inner is no more useful, we can free it. */
-      cloog_loop_free(loop->inner) ;
-    }
-    
-    loop->inner = NULL ;
-
-    if (loop->next != NULL)
-      UQ = cloog_domain_union(UQ, cloog_domain_copy(loop->domain));
-    else
-      cloog_domain_free(UQ);
-
-    cloog_loop_free_parts(res,1,0,0,1) ;
-
-    res = temp ;
-  }  
-  cloog_loop_free_parts(old,1,0,0,1) ;
-
-  return(res) ;
-}
-
-
-static CloogDomain *bounding_domain(CloogDomain *dom, CloogOptions *options)
-{
-    if (options->sh)
-	return cloog_domain_simple_convex(dom);
-    else
-	return cloog_domain_convex(dom);
-}
-
-
-/**
- * cloog_loop_merge function:
- * This function is the 'soft' version of loop_separate if we are looking for
- * a code much simpler (and less efficicient).  This function returns the new
- * CloogLoop list.
- * - October 29th 2001: first version. 
- * - July 3rd->11th 2003: memory leaks hunt and correction.
- * - June      22nd 2005: Adaptation for GMP.
- */ 
-CloogLoop *cloog_loop_merge(CloogLoop *loop, int level, CloogOptions *options)
-{
-    CloogLoop *res, *new_inner, *old;
-    CloogDomain *new_domain, *temp;
-
-    if (loop == NULL)
-	return loop;
-
-    if (loop->next == NULL && cloog_domain_isconvex(loop->domain))
-	return loop;
-
-    old = loop;
-    temp = loop->domain;
-    loop->domain = NULL;
-    new_inner = loop->inner;
-
-    for (loop = loop->next; loop; loop = loop->next) {
-	temp = cloog_domain_union(temp, loop->domain);
-	loop->domain = NULL;
-	new_inner = cloog_loop_concat(new_inner, loop->inner);
-    }
-
-    new_domain = bounding_domain(temp, options);
-
-    if (level > 0 && !cloog_domain_is_bounded(new_domain, level) &&
-	    	     cloog_domain_is_bounded(temp, level)) {
-	CloogDomain *splitter, *t2;
-
-	cloog_domain_free(new_domain);
-	splitter = cloog_domain_bound_splitter(temp, level);
-
-	res = NULL;
-	while (!cloog_domain_isconvex(splitter)) {
-	    CloogDomain *first, *rest;
-	    first = cloog_domain_cut_first(splitter, &rest);
-	    splitter = rest;
-	    t2 = cloog_domain_intersection(first, temp);
-	    cloog_domain_free(first);
-
-	    new_domain = bounding_domain(t2, options);
-	    cloog_domain_free(t2);
-
-	    if (cloog_domain_isempty(new_domain)) {
-		cloog_domain_free(new_domain);
-		continue;
-	    }
-	    res = cloog_loop_alloc(old->state, new_domain, 0, NULL,
-				   NULL, cloog_loop_copy(new_inner), res);
-	}
-
-	t2 = cloog_domain_intersection(splitter, temp);
-	cloog_domain_free(splitter);
-
-	new_domain = bounding_domain(t2, options);
-	cloog_domain_free(t2);
-
-	if (cloog_domain_isempty(new_domain)) {
-	    cloog_domain_free(new_domain);
-	    cloog_loop_free(new_inner);
-	} else
-	    res = cloog_loop_alloc(old->state, new_domain, 0, NULL,
-				   NULL, new_inner, res);
-    } else {
-	res = cloog_loop_alloc(old->state, new_domain, 0, NULL,
-			       NULL, new_inner, NULL);
-    }
-    cloog_domain_free(temp);
-
-    cloog_loop_free_parts(old, 0, 0, 0, 1);
-
-    return res;
-}
-
-
-static int cloog_loop_count(CloogLoop *loop)
-{
-    int nb_loops;
-
-    for (nb_loops = 0; loop; loop = loop->next)
-	nb_loops++;
-
-    return  nb_loops;
-}
-
-
-/**
- * cloog_loop_sort function:
- * Adaptation from LoopGen 0.4 by F. Quillere. This function sorts a list of
- * parameterized disjoint polyhedra, in order to not have lexicographic order
- * violation (see Quillere paper).
- * - September 16th 2005: inclusion of cloog_loop_number (October 29th 2001).
- */ 
-CloogLoop *cloog_loop_sort(CloogLoop *loop, int level)
-{
-  CloogLoop *res, *now, **loop_array;
-  CloogDomain **doms;
-  int i, nb_loops=0, * permut ;
-
-  /* There is no need to sort the parameter domains. */
-  if (!level)
-    return loop;
-  
-  /* We will need to know how many loops are in the list. */
-  nb_loops = cloog_loop_count(loop);
-
-  /* If there is only one loop, it's the end. */
-  if (nb_loops == 1)
-  return(loop) ;
-
-  /* We have to allocate memory for some useful components:
-   * - loop_array: the loop array,
-   * - doms: the array of domains to sort,
-   * - permut: will give us a possible sort (maybe not the only one).
-   */
-  loop_array = (CloogLoop **)malloc(nb_loops*sizeof(CloogLoop *)) ;
-  doms = (CloogDomain **)malloc(nb_loops*sizeof(CloogDomain *));
-  permut = (int *)malloc(nb_loops*sizeof(int)) ;
-
-  /* We fill up the loop and domain arrays. */
-  for (i=0;i<nb_loops;i++,loop=loop->next)
-  { loop_array[i] = loop ;
-    doms[i] = loop_array[i]->domain;
-  }
-  
-  /* cloog_domain_sort will fill up permut. */
-  cloog_domain_sort(doms, nb_loops, level, permut);
-  
-  /* With permut and loop_array we build the sorted list. */
-  res = NULL ;
-  for (i=0;i<nb_loops;i++)
-  { /* To avoid pointer looping... loop_add will rebuild the list. */
-    loop_array[permut[i]-1]->next = NULL ;
-    cloog_loop_add(&res,&now,loop_array[permut[i]-1]) ;
-  }
-  
-  free(permut) ;
-  free(doms);
-  free(loop_array) ;
-
-  return res;
-}
-
-
-/**
- * cloog_loop_nest function:
- * This function changes the loop list in such a way that we have no more than
- * one dimension added by level. It returns an equivalent loop list with
- * this property.
- * - October 29th 2001: first version.
- * - July 3rd->11th 2003: memory leaks hunt and correction.
- * - June      22nd 2005: Adaptation for GMP.
- * - November  21th 2005: (debug) now OK when cloog_loop_restrict returns NULL.
- */ 
-CloogLoop *cloog_loop_nest(CloogLoop *loop, CloogDomain *context, int level)
-{ int l ;
-  CloogLoop * p, * temp, * res, * now, * next ;
-  CloogDomain * new_domain ;
-
-  loop = cloog_loop_disjoint(loop);
-
-  res = NULL ;
-  /* Each domain is changed by its intersection with the context. */
-  while (loop != NULL)
-  { p = cloog_loop_restrict(loop, context);
-    next = loop->next ;
-    
-    if (p != NULL)
-    { cloog_loop_free_parts(loop,1,0,0,0) ;
-    
-      temp = cloog_loop_alloc(p->state, p->domain, 0, NULL,
-			      p->block, p->inner, NULL);
-    
-      /* If the intersection dimension is too big, we make projections smaller
-       * and smaller, and each projection includes the preceding projection
-       * (thus, in the target list, dimensions are added one by one).
-       */
-      if (cloog_domain_dimension(p->domain) >= level)
-	for (l = cloog_domain_dimension(p->domain); l >= level; l--) {
-	  new_domain = cloog_domain_project(p->domain, l);
-	  temp = cloog_loop_alloc(p->state, new_domain, 0, NULL,
-				  NULL, temp, NULL);
-	}
-
-       /* p is no more useful (but its content yes !). */ 
-      cloog_loop_free_parts(p,0,0,0,0) ;
-    
-      cloog_loop_add(&res,&now,temp) ;
-    }
-    else
-    cloog_loop_free_parts(loop,1,1,1,0) ;
-    
-    loop = next ;
-  }
-  
-  return(res) ;
-}
-
-
-/* Check if the domains of the inner loops impose a stride constraint
- * on the given level.
- * The core of the search is implemented in cloog_domain_list_stride.
- * Here, we simply construct a list of domains to pass to this function
- * and if a stride is found, we adjust the lower bounds by calling
- * cloog_domain_stride_lower_bound.
- */
-static int cloog_loop_variable_offset_stride(CloogLoop *loop, int level)
-{
-    CloogDomainList *list = NULL;
-    CloogLoop *inner;
-    CloogStride *stride;
-
-    for (inner = loop->inner; inner; inner = inner->next) {
-	CloogDomainList *entry = ALLOC(CloogDomainList);
-	entry->domain = cloog_domain_copy(inner->domain);
-	entry->next = list;
-	list = entry;
-    }
-
-    stride = cloog_domain_list_stride(list, level);
-
-    cloog_domain_list_free(list);
-
-    if (!stride)
-	return 0;
-
-    loop->stride = stride;
-    loop->domain = cloog_domain_stride_lower_bound(loop->domain, level, stride);
-
-    return 1;
-}
-
-
-/**
- * cloog_loop_stride function:
- * This function will find the stride of a loop for the iterator at the column
- * number 'level' in the constraint matrix. It will update the lower bound of
- * the iterator accordingly. Basically, the function will try to find in the
- * inner loops a common condition on this iterator for the inner loop iterators
- * to be integral. For instance, let us consider a loop with the iterator i,
- * the iteration domain -4<=i<=n, and its two inner loops with the iterator j.
- * The first inner loop has the constraint 3j=i, and the second one has the
- * constraint 6j=i. Then the common constraint on i for j to be integral is
- * i%3=0, the stride for i is 3. Lastly, we have to find the new lower bound
- * for i: the first value satisfying the common constraint: -3. At the end, the
- * iteration domain for i is -3<=i<=n and the stride for i is 3.
- *
- * The algorithm implemented in this function only allows for strides
- * on loops with a lower bound that has a constant remainder on division
- * by the stride.  Before initiating this procedure, we first check
- * if we can find a stride with a lower bound with a variable offset in
- * cloog_loop_variable_offset_stride.
- *
- * - loop is the loop including the iteration domain of the considered iterator,
- * - level is the column number of the iterator in the matrix of contraints.
- **
- * - June 29th 2003: first version (work in progress since June 26th 2003).
- * - July 14th 2003: simpler version.
- * - June 22nd 2005: Adaptation for GMP (from S. Verdoolaege's 0.12.1 version).
- */
-void cloog_loop_stride(CloogLoop * loop, int level)
-{ int first_search ;
-  cloog_int_t stride, ref_offset, offset, potential;
-  CloogLoop * inner ;
-
-  if (!cloog_domain_can_stride(loop->domain, level))
-    return;
-
-  if (cloog_loop_variable_offset_stride(loop, level))
-    return;
-
-  cloog_int_init(stride);
-  cloog_int_init(ref_offset);
-  cloog_int_init(offset);
-  cloog_int_init(potential);
-
-  cloog_int_set_si(ref_offset, 0);
-  cloog_int_set_si(offset, 0);
-
-  /* Default stride. */
-  cloog_int_set_si(stride, 1);
-  first_search = 1 ;
-  inner = loop->inner ;
-    
-  while (inner != NULL)
-  { /* If the minimun stride has not been found yet, find the stride. */
-    if ((first_search) || (!cloog_int_is_one(stride)))
-    {
-      cloog_domain_stride(inner->domain, level, &potential, &offset);
-      if (!cloog_int_is_one(potential) && (!first_search))
-      { /* Offsets must be the same for common stride. */
-	cloog_int_gcd(stride, potential, stride);
-	if (!cloog_int_is_zero(stride)) {
-	    cloog_int_fdiv_r(offset, offset, stride);
-	    cloog_int_fdiv_r(ref_offset, ref_offset, stride);
-	}
-        if (cloog_int_ne(offset,ref_offset))
-	    cloog_int_set_si(stride, 1);
-      }
-      else {
-        cloog_int_set(stride, potential);
-        cloog_int_set(ref_offset, offset);
-      }
-	
-      first_search = 0 ;
-    }
-      
-    inner = inner->next ;
-  }
-
-  if (cloog_int_is_zero(stride))
-    cloog_int_set_si(stride, 1);
-    
-  /* Update the values if necessary. */
-  if (!cloog_int_is_one(stride))
-  { /* Update the stride value. */
-    if (!cloog_int_is_zero(offset))
-      cloog_int_sub(offset, stride, offset);
-    loop->stride = cloog_stride_alloc(stride, offset);
-    loop->domain = cloog_domain_stride_lower_bound(loop->domain, level,
-						    loop->stride);
-  }
-  
-  cloog_int_clear(stride);
-  cloog_int_clear(ref_offset);
-  cloog_int_clear(offset);
-  cloog_int_clear(potential);
-}
-
-
-void cloog_loop_otl(CloogLoop *loop, int level)
-{
-    if (cloog_domain_is_otl(loop->domain, level))
-	loop->otl = 1;
-}
-
-
-/**
- * cloog_loop_stop function:
- * This function implements the 'stop' option : each domain of each loop
- * in the list 'loop' is replaced by 'context'. 'context' should be the
- * domain of the outer loop. By using this method, there are no more dimensions
- * to scan and the simplification step will automaticaly remove the domains
- * since they are the same as the corresponding contexts. The effect of this
- * function is to stop the code generation at the level this function is called,
- * the resulting code do not consider the next dimensions.
- * - January 11th 2005: first version.
- */
-CloogLoop * cloog_loop_stop(CloogLoop * loop, CloogDomain * context)
-{ if (loop == NULL)
-  return NULL ;
-  else
-  { cloog_domain_free(loop->domain) ;
-    loop->domain = cloog_domain_copy(context) ;
-    loop->next = cloog_loop_stop(loop->next, context) ;
-  }
-  
-  return loop ;
-}
-
-
-static int level_is_constant(int level, int scalar, int *scaldims, int nb_scattdims)
-{
-  return level && (level+scalar <= nb_scattdims) && (scaldims[level+scalar-1]);
-}
-
-
-/**
- * Compare the constant dimensions of loops 'l1' and 'l2' starting at 'scalar'
- * and return -1 if the vector of constant dimensions of 'l1' is smaller
- * than that of 'l2', 0 if they are the same and +1 if that of 'l1' is
- * greater than that of 'l2'.
- * This function should be called on the innermost loop (the loop
- * containing a block).
- * \param l1 Loop to be compared with l2.
- * \param l2 Loop to be compared with l1.
- * \param level Current non-scalar dimension.
- * \param scaldims Boolean array saying whether a dimension is scalar or not.
- * \param nb_scattdims Size of the scaldims array.
- * \param scalar Current scalar dimension.
- * \return -1 if (l1 < l2), 0 if (l1 == l2) and +1 if (l1 > l2)
- */
-int cloog_loop_constant_cmp(CloogLoop *l1, CloogLoop *l2, int level,
-	int *scaldims, int nb_scattdims, int scalar)
-{
-  CloogBlock *b1, *b2;
-  b1 = l1->block;
-  b2 = l2->block;
-  while (level_is_constant(level, scalar, scaldims, nb_scattdims)) {
-    int cmp = cloog_int_cmp(b1->scaldims[scalar], b2->scaldims[scalar]);
-    if (cmp)
-	return cmp;
-    scalar++;
-  }
-  return 0;
-}
-
-
-/**
- * cloog_loop_scalar_gt function:
- * This function returns 1 if loop 'l1' is greater than loop 'l2' for the
- * scalar dimension vector that begins at dimension 'scalar', 0 otherwise. What
- * we want to know is whether a loop is scheduled before another one or not.
- * This function solves the problem when the considered dimension for scheduling
- * is a scalar dimension. Since there may be a succession of scalar dimensions,
- * this function will reason about the vector of scalar dimension that begins
- * at dimension 'level+scalar' and finish to the first non-scalar dimension.
- * \param l1 Loop to be compared with l2.
- * \param l2 Loop to be compared with l1.
- * \param level Current non-scalar dimension.
- * \param scaldims Boolean array saying whether a dimension is scalar or not.
- * \param nb_scattdims Size of the scaldims array.
- * \param scalar Current scalar dimension.
- * \return 1 if (l1 > l2), 0 otherwise.
- **
- * - September 9th 2005: first version.
- * - October  15nd 2007: now "greater than" instead of "greater or equal".
- */
-int cloog_loop_scalar_gt(l1, l2, level, scaldims, nb_scattdims, scalar)
-CloogLoop * l1, * l2 ;
-int level, * scaldims, nb_scattdims, scalar ;
-{
-  return cloog_loop_constant_cmp(l1, l2, level, scaldims, nb_scattdims, scalar) > 0;
-}
-
-
-/**
- * cloog_loop_scalar_eq function:
- * This function returns 1 if loop 'l1' is equal to loop 'l2' for the scalar
- * dimension vector that begins at dimension 'scalar', 0 otherwise. What we want
- * to know is whether two loops are scheduled for the same time or not.
- * This function solves the problem when the considered dimension for scheduling
- * is a scalar dimension. Since there may be a succession of scalar dimensions,
- * this function will reason about the vector of scalar dimension that begins
- * at dimension 'level+scalar' and finish to the first non-scalar dimension.
- * - l1 and l2 are the loops to compare,
- * - level is the current non-scalar dimension,
- * - scaldims is the boolean array saying whether a dimension is scalar or not,
- * - nb_scattdims is the size of the scaldims array,
- * - scalar is the current scalar dimension.
- **
- * - September 9th 2005 : first version.
- */
-int cloog_loop_scalar_eq(l1, l2, level, scaldims, nb_scattdims, scalar)
-CloogLoop * l1, * l2 ;
-int level, * scaldims, nb_scattdims, scalar ;
-{
-  return cloog_loop_constant_cmp(l1, l2, level, scaldims, nb_scattdims, scalar) == 0;
-}
-
-
-/**
- * cloog_loop_scalar_sort function:
- * This function sorts a linked list of loops (loop) with respect to the
- * scalar dimension vector that begins at dimension 'scalar'. Since there may
- * be a succession of scalar dimensions, this function will reason about the
- * vector of scalar dimension that begins at dimension 'level+scalar' and
- * finish to the first non-scalar dimension.
- * \param loop Loop list to sort.
- * \param level Current non-scalar dimension.
- * \param scaldims Boolean array saying whether a dimension is scalar or not.
- * \param nb_scattdims Size of the scaldims array.
- * \param scalar Current scalar dimension.
- * \return A pointer to the sorted list.
- **
- * - July      2nd 2005: first developments.
- * - September 2nd 2005: first version.
- * - October  15nd 2007: complete rewrite to remove bugs, now a bubble sort.
- */
-CloogLoop * cloog_loop_scalar_sort(loop, level, scaldims, nb_scattdims, scalar)
-CloogLoop * loop ;
-int level, * scaldims, nb_scattdims, scalar ;
-{ int ok ;
-  CloogLoop **current;
-  
-  do {
-    ok = 1;
-    for (current = &loop; (*current)->next; current = &(*current)->next) {
-      CloogLoop *next = (*current)->next;
-      if (cloog_loop_scalar_gt(*current,next,level,scaldims,nb_scattdims,scalar)) {
-        ok = 0;
-	(*current)->next = next->next;
-	next->next = *current;
-	*current = next;
-      }
-    }
-  } while (!ok);
-
-  return loop ;
-}
-
-
-/**
- * cloog_loop_generate_backtrack function:
- * adaptation from LoopGen 0.4 by F. Quillere. This function implements the
- * backtrack of the Quillere et al. algorithm (see the Quillere paper).
- * It eliminates unused iterations of the current level for the new one. See the
- * example called linearity-1-1 example with and without this part for an idea.
- * - October 26th 2001: first version in cloog_loop_generate_general.
- * - July    31th 2002: (debug) no more parasite loops (REALLY hard !). 
- * - October 30th 2005: extraction from cloog_loop_generate_general.
- */
-CloogLoop *cloog_loop_generate_backtrack(CloogLoop *loop,
-	int level, CloogOptions *options)
-{
-  CloogDomain * domain ;
-  CloogLoop * now, * now2, * next, * next2, * end, * temp, * l, * inner,
-            * new_loop ;
-  
-  temp = loop ;
-  loop = NULL ;
-
-  while (temp != NULL)
-  { l = NULL ;
-    inner = temp->inner ;
-      
-    while (inner != NULL)
-    { next = inner->next ;
-      /* This 'if' and its first part is the debug of july 31th 2002. */
-      if (inner->block != NULL) {
-        end = cloog_loop_alloc(temp->state, inner->domain, 0, NULL,
-			       inner->block, NULL, NULL);
-        domain = cloog_domain_copy(temp->domain) ;
-        new_loop = cloog_loop_alloc(temp->state, domain, 0, NULL,
-				    NULL, end, NULL);
-      }
-      else
-      new_loop = cloog_loop_project(inner, level);
-
-      cloog_loop_free_parts(inner,0,0,0,0) ;
-      cloog_loop_add(&l,&now2,new_loop) ;
-      inner = next ;
-    }
-      
-    temp->inner = NULL ;
-      
-    if (l != NULL)
-    { l = cloog_loop_separate(l) ;
-      l = cloog_loop_sort(l, level);
-      while (l != NULL) {
-	l->stride = cloog_stride_copy(l->stride);
-        cloog_loop_add(&loop,&now,l) ;
-        l = l->next ;
-      }
-    }
-    next2 = temp->next ;
-    cloog_loop_free_parts(temp,1,0,0,0) ;
-    temp = next2 ;
-  }
-
-  return loop ;
-}
-
-
-/**
- * Return 1 if we need to continue recursing to the specified level.
- */
-int cloog_loop_more(CloogLoop *loop, int level, int scalar, int nb_scattdims)
-{
-  return level + scalar <= nb_scattdims ||
-	 cloog_domain_dimension(loop->domain) >= level;
-}
-
-/**
- * Return 1 if the domains of all loops in the given linked list
- * have a fixed value at the given level.
- * In principle, there would be no need to check that the fixed value is
- * the same for each of these loops because this function is only
- * called on a component.  However, not all backends perform a proper
- * decomposition into components.
- */
-int cloog_loop_is_constant(CloogLoop *loop, int level)
-{
-    cloog_int_t c1, c2;
-    int r = 1;
-
-    cloog_int_init(c1);
-    cloog_int_init(c2);
-
-    if (!cloog_domain_lazy_isconstant(loop->domain, level - 1, &c1))
-	r = 0;
-
-    for (loop = loop->next; r && loop; loop = loop->next) {
-	if (!cloog_domain_lazy_isconstant(loop->domain, level - 1, &c2))
-	    r = 0;
-	else if (cloog_int_ne(c1, c2))
-	    r = 0;
-    }
-
-    cloog_int_clear(c1);
-    cloog_int_clear(c2);
-
-    return r;
-}
-
-/**
- * Assuming all domains in the given linked list of loop
- * have a fixed values at level, return a single loop with
- * a domain corresponding to this fixed value and with as
- * list of inner loops the concatenation of all inner loops
- * in the original list.
- */
-CloogLoop *cloog_loop_constant(CloogLoop *loop, int level)
-{
-    CloogLoop *res, *inner, *tmp;
-    CloogDomain *domain, *t;
-
-    if (!loop)
-	return loop;
-
-    inner = loop->inner;
-    domain = loop->domain;
-    for (tmp = loop->next; tmp; tmp = tmp->next) {
-	inner = cloog_loop_concat(inner, tmp->inner);
-	domain = cloog_domain_union(domain, tmp->domain);
-    }
-
-    domain = cloog_domain_simple_convex(t = domain);
-    cloog_domain_free(t);
-
-    res = cloog_loop_alloc(loop->state, domain, 0, NULL, NULL, inner, NULL);
-
-    cloog_loop_free_parts(loop, 0, 0, 0, 1);
-
-    return res;
-}
-
-
-/* Unroll the given loop at the given level, provided it is allowed
- * by cloog_domain_can_unroll.
- * If so, we return a list of loops, one for each iteration of the original
- * loop.  Otherwise, we simply return the original loop.
- */
-static CloogLoop *loop_unroll(CloogLoop *loop, int level)
-{
-    int can_unroll;
-    cloog_int_t i;
-    cloog_int_t n;
-    CloogConstraint *lb;
-    CloogLoop *res = NULL;
-    CloogLoop **next_res = &res;
-    CloogDomain *domain;
-    CloogLoop *inner;
-
-    cloog_int_init(n);
-    can_unroll = cloog_domain_can_unroll(loop->domain, level, &n, &lb);
-    if (!can_unroll) {
-	cloog_int_clear(n);
-	return loop;
-    }
-
-    cloog_int_init(i);
-
-    for (cloog_int_set_si(i, 0); cloog_int_lt(i, n); cloog_int_add_ui(i, i, 1)) {
-	domain = cloog_domain_copy(loop->domain);
-	domain = cloog_domain_fixed_offset(domain, level, lb, i);
-	inner = cloog_loop_copy(loop->inner);
-	inner = cloog_loop_restrict_all(inner, domain);
-	if (!inner) {
-	    cloog_domain_free(domain);
-	    continue;
-	}
-	*next_res = cloog_loop_alloc(loop->state, domain, 1, NULL, NULL,
-					inner, NULL);
-	next_res = &(*next_res)->next;
-    }
-
-    cloog_int_clear(i);
-    cloog_int_clear(n);
-    cloog_constraint_release(lb);
-
-    cloog_loop_free(loop);
-
-    return res;
-}
-
-
-/* Unroll all loops in the given list at the given level, provided
- * they can be unrolled.
- */
-CloogLoop *cloog_loop_unroll(CloogLoop *loop, int level)
-{
-    CloogLoop *now, *next;
-    CloogLoop *res = NULL;
-    CloogLoop **next_res = &res;
-
-    for (now = loop; now; now = next) {
-	next = now->next;
-	now->next = NULL;
-
-	*next_res = loop_unroll(now, level);
-
-	while (*next_res)
-	    next_res = &(*next_res)->next;
-    }
-
-    return res;
-}
- 
-CloogLoop *cloog_loop_generate_restricted_or_stop(CloogLoop *loop,
-	CloogDomain *context,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	CloogOptions *options);
-
-CloogLoop *cloog_loop_recurse(CloogLoop *loop,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	int constant, CloogOptions *options);
-
-
-/**
- * Recurse on the inner loops of the given single loop.
- *
- * - loop is the loop for which we have to generate scanning code,
- * - level is the current non-scalar dimension,
- * - scalar is the current scalar dimension,
- * - scaldims is the boolean array saying whether a dimension is scalar or not,
- * - nb_scattdims is the size of the scaldims array,
- * - constant is true if the loop is known to be executed at most once
- * - options are the general code generation options.
- */
-static CloogLoop *loop_recurse(CloogLoop *loop,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	int constant, CloogOptions *options)
-{
-    CloogLoop *inner, *into, *end, *next, *l, *now;
-    CloogDomain *domain;
-
-    if (level && options->strides && !constant)
-      cloog_loop_stride(loop, level);
-
-    if (!constant &&
-	options->first_unroll >= 0 && level + scalar >= options->first_unroll) {
-	loop = cloog_loop_unroll(loop, level);
-	if (loop->next)
-	    return cloog_loop_recurse(loop, level, scalar, scaldims,
-					nb_scattdims, 1, options);
-    }
-
-    if (level && options->otl)
-      cloog_loop_otl(loop, level);
-    inner = loop->inner;
-    domain = cloog_domain_copy(loop->domain);
-    domain = cloog_domain_add_stride_constraint(domain, loop->stride);
-    into = NULL ;
-    while (inner != NULL)
-    { /* 4b. -ced- recurse for each sub-list of non terminal loops. */
-      if (cloog_loop_more(inner, level + 1, scalar, nb_scattdims)) {
-	end = inner;
-        while ((end->next != NULL) &&
-               cloog_loop_more(end->next, level + 1, scalar, nb_scattdims))
-        end = end->next ;
-        
-	next = end->next ;
-        end->next = NULL ;
-
-        l = cloog_loop_generate_restricted_or_stop(inner, domain,
-			level + 1, scalar, scaldims, nb_scattdims, options);
-        
-	if (l != NULL)
-        cloog_loop_add_list(&into,&now,l) ;
-        
-        inner = next ;
-      }
-      else
-      { cloog_loop_add(&into,&now,inner) ;
-        inner = inner->next ;
-      }
-    }
-
-    cloog_domain_free(domain);
-    loop->inner = into;
-    return loop;
-}
-
-
-/**
- * Recurse on the inner loops of each of the loops in the loop list.
- *
- * - loop is the loop list for which we have to generate scanning code,
- * - level is the current non-scalar dimension,
- * - scalar is the current scalar dimension,
- * - scaldims is the boolean array saying whether a dimension is scalar or not,
- * - nb_scattdims is the size of the scaldims array,
- * - constant is true if the loop is known to be executed at most once
- * - options are the general code generation options.
- */
-CloogLoop *cloog_loop_recurse(CloogLoop *loop,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	int constant, CloogOptions *options)
-{
-    CloogLoop *now, *next;
-    CloogLoop *res = NULL;
-    CloogLoop **next_res = &res;
-
-    for (now = loop; now; now = next) {
-	next = now->next;
-	now->next = NULL;
-
-	*next_res = loop_recurse(now, level, scalar, scaldims, nb_scattdims,
-				 constant, options);
-
-	while (*next_res)
-	    next_res = &(*next_res)->next;
-    }
-
-    return res;
-}
-
-/**
- * cloog_loop_generate_general function:
- * Adaptation from LoopGen 0.4 by F. Quillere. This function implements the
- * Quillere algorithm for polyhedron scanning from step 3 to 5.
- * (see the Quillere paper).
- * - loop is the loop for which we have to generate a scanning code,
- * - level is the current non-scalar dimension,
- * - scalar is the current scalar dimension,
- * - scaldims is the boolean array saying whether a dimension is scalar or not,
- * - nb_scattdims is the size of the scaldims array,
- * - options are the general code generation options.
- **
- * - October 26th 2001: first version.
- * - July 3rd->11th 2003: memory leaks hunt and correction.
- * - June      22nd 2005: Adaptation for GMP.
- * - September  2nd 2005: The function have been cutted out in two pieces:
- *                        cloog_loop_generate and this one, in order to handle
- *                        the scalar dimension case more efficiently with
- *                        cloog_loop_generate_scalar.
- * - November  15th 2005: (debug) the result of the cloog_loop_generate call may
- *                        be a list of polyhedra (especially if stop option is
- *                        used): cloog_loop_add_list instead of cloog_loop_add.
- */ 
-CloogLoop *cloog_loop_generate_general(CloogLoop *loop,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	CloogOptions *options)
-{
-  CloogLoop *res, *now, *temp, *l, *new_loop, *next;
-  int separate = 0;
-  int constant = 0;
-
-  /* 3. Separate all projections into disjoint polyhedra. */
-  if (level > 0 && cloog_loop_is_constant(loop, level)) {
-    res = cloog_loop_constant(loop, level);
-    constant = 1;
-  } else if ((options->f > level+scalar) || (options->f < 0))
-    res = cloog_loop_merge(loop, level, options);
-  else {
-    res = cloog_loop_separate(loop);
-    separate = 1;
-  }
-    
-  /* 3b. -correction- sort the loops to determine their textual order. */
-  res = cloog_loop_sort(res, level);
-
-  res = cloog_loop_restrict_inner(res);
-
-  if (separate)
-    res = cloog_loop_specialize(res, level, scalar, scaldims, nb_scattdims);
-  
-  /* 4. Recurse for each loop with the current domain as context. */
-  temp = res ;
-  res = NULL ;
-  if (!level || (level+scalar < options->l) || (options->l < 0))
-    res = cloog_loop_recurse(temp, level, scalar, scaldims, nb_scattdims,
-			     constant, options);
-  else
-  while (temp != NULL)
-  { next = temp->next ;
-    l = cloog_loop_nest(temp->inner, temp->domain, level+1);
-    new_loop = cloog_loop_alloc(temp->state, temp->domain, 0, NULL,
-				NULL, l, NULL);
-    temp->inner = NULL ;
-    temp->next = NULL ;
-    cloog_loop_free_parts(temp,0,0,0,0) ;
-    cloog_loop_add(&res,&now,new_loop) ;
-    temp = next ;
-  }
-
-  if (options->strides)
-    res = cloog_loop_propagate_lower_bound(res, level);
-  
-  /* 5. eliminate unused iterations of the current level for the new one. See
-   *    the example called linearity-1-1 example with and without this part
-   *    for an idea.
-   */
-  if (options->backtrack && level &&
-      ((level+scalar < options->l) || (options->l < 0)) &&
-      ((options->f <= level+scalar) && !(options->f < 0)))
-  res = cloog_loop_generate_backtrack(res, level, options);
-  
-  /* Pray for my new paper to be accepted somewhere since the following stuff
-   * is really amazing :-) !
-   * Far long later: The paper has been accepted to PACT 2004 :-))). But there
-   * are still some bugs and I have no time to fix them. Thus now you have to 
-   * pray for me to get an academic position for that really amazing stuff :-) !
-   * Later again: OK, I get my academic position, but still I have not enough
-   * time to fix and clean this part... Pray again :-) !!!
-   */
-  /* res = cloog_loop_unisolate(res,level) ;*/
-
-  return(res) ;
-}
-
-
-CloogLoop *cloog_loop_generate_restricted(CloogLoop *loop,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	CloogOptions *options);
-
-
-/**
- * cloog_loop_generate_scalar function:
- * This function applies the simplified code generation scheme in the trivial
- * case of scalar dimensions. When dealing with scalar dimensions, there is 
- * no need of costly polyhedral operations for separation or sorting: sorting
- * is a question of comparing scalar vectors and separation amounts to consider
- * only loops with the same scalar vector for the next step of the code
- * generation process. This function achieves the separation/sorting process
- * for the vector of scalar dimension that begins at dimension 'level+scalar'
- * and finish to the first non-scalar dimension.
- * - loop is the loop for which we have to generate a scanning code,
- * - level is the current non-scalar dimension,
- * - scalar is the current scalar dimension,
- * - scaldims is the boolean array saying whether a dimension is scalar or not,
- * - nb_scattdims is the size of the scaldims array,
- * - options are the general code generation options.
- **
- * - September  2nd 2005: First version.
- */ 
-CloogLoop *cloog_loop_generate_scalar(CloogLoop *loop,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	CloogOptions *options)
-{ CloogLoop * res, * now, * temp, * l, * end, * next, * ref ;
-  int scalar_new;
-
-  /* We sort the loop list with respect to the current scalar vector. */
-  res = cloog_loop_scalar_sort(loop,level,scaldims,nb_scattdims,scalar) ;
-
-  scalar_new = scalar + scaldims[level + scalar - 1];
-  
-  temp = res ;
-  res = NULL ;
-  while (temp != NULL)
-  { /* Then we will appy the general code generation process to each sub-list
-     * of loops with the same scalar vector.
-     */
-    end = temp ;
-    ref = temp ;
-    
-    while((end->next != NULL) &&
-	 cloog_loop_more(end->next, level, scalar_new, nb_scattdims) &&
-         cloog_loop_scalar_eq(ref,end->next,level,scaldims,nb_scattdims,scalar))
-    end = end->next ;
-
-    next = end->next ;
-    end->next = NULL ;
-
-    /* For the next dimension, scalar value is updated by adding the scalar
-     * vector size, which is stored at scaldims[level+scalar-1].
-     */
-    if (cloog_loop_more(temp, level, scalar_new, nb_scattdims)) {
-      l = cloog_loop_generate_restricted(temp, level, scalar_new,
-				      scaldims, nb_scattdims, options);
-
-      if (l != NULL)
-	cloog_loop_add_list(&res, &now, l);
-    } else
-      cloog_loop_add(&res, &now, temp);
-      
-    temp = next ;
-  }
-  
-  return res ;
-}
-
-
-/* Compare loop with the next loop based on their constant dimensions.
- * The result is < 0, == 0 or > 0 depending on whether the constant
- * dimensions of loop are lexicographically smaller, equal or greater
- * than those of loop->next.
- * If loop is the last in the list, then it is assumed to be smaller
- * than the "next" one.
- */
-static int cloog_loop_next_scal_cmp(CloogLoop *loop)
-{
-    int i;
-    int nb_scaldims;
-
-    if (!loop->next)
-	return -1;
-
-    nb_scaldims = loop->block->nb_scaldims;
-    if (loop->next->block->nb_scaldims < nb_scaldims)
-	nb_scaldims = loop->next->block->nb_scaldims;
-
-    for (i = 0; i < nb_scaldims; ++i) {
-	int cmp = cloog_int_cmp(loop->block->scaldims[i],
-				loop->next->block->scaldims[i]);
-	if (cmp)
-	    return cmp;
-    }
-    return loop->block->nb_scaldims - loop->next->block->nb_scaldims;
-}
-
-
-/* Check whether the globally constant dimensions of a and b
- * have the same value for all globally constant dimensions
- * that are situated before any (locally) non-constant dimension.
- */
-static int cloog_loop_equal_prefix(CloogLoop *a, CloogLoop *b,
-				    int *scaldims, int nb_scattdims)
-{
-    int i;
-    int cst = 0;
-    int dim = 0;
-
-    for (i = 0; i < nb_scattdims; ++i) {
-	if (!scaldims[i]) {
-	    dim++;
-	    continue;
-	}
-	if (!cloog_int_eq(a->block->scaldims[cst], b->block->scaldims[cst]))
-	    break;
-	cst++;
-    }
-    for (i = i + 1; i < nb_scattdims; ++i) {
-	if (scaldims[i])
-	    continue;
-	if (!cloog_domain_lazy_isconstant(a->domain, dim, NULL))
-	    return 0;
-	/* No need to check that dim is also constant in b and that the
-	 * constant values are equal.  That will happen during the check
-	 * whether the two domains are equal.
-	 */
-	dim++;
-    }
-    return 1;
-}
-
-
-/* Try to block adjacent loops in the loop list "loop".
- * We only attempt blocking if the constant dimensions of the loops
- * in the least are (not necessarily strictly) increasing.
- * Then we look for a sublist such that the first (begin) has constant
- * dimensions strictly larger than the previous loop in the complete
- * list and such that the loop (end) after the last loop in the sublist
- * has constant dimensions strictly larger than the last loop in the sublist.
- * Furthermore, all loops in the sublist should have the same domain
- * (with globally constant dimensions removed) and the difference
- * (if any) in constant dimensions may only occur after all the
- * (locally) constant dimensions.
- * If we find such a sublist, then the blocks of all but the first
- * are merged into the block of the first.
- *
- * Note that this function can only be called before the global
- * blocklist has been created because it may otherwise modify and destroy
- * elements on that list.
- */
-CloogLoop *cloog_loop_block(CloogLoop *loop, int *scaldims, int nb_scattdims)
-{
-    CloogLoop *begin, *end, *l;
-    int begin_after_previous;
-    int end_after_previous;
-
-    if (!loop->next)
-	return loop;
-    for (begin = loop; begin; begin = begin->next) {
-	if (!begin->block || !begin->block->scaldims)
-	    return loop;
-	if (cloog_loop_next_scal_cmp(begin) > 0)
-	    return loop;
-    }
-
-    begin_after_previous = 1;
-    for (begin = loop; begin; begin = begin->next) {
-	if (!begin_after_previous) {
-	    begin_after_previous = cloog_loop_next_scal_cmp(begin) < 0;
-	    continue;
-	}
-
-	end_after_previous = cloog_loop_next_scal_cmp(begin) < 0;
-	for (end = begin->next; end; end = end->next) {
-	    if (!cloog_loop_equal_prefix(begin, end, scaldims, nb_scattdims))
-		break;
-	    if (!cloog_domain_lazy_equal(begin->domain, end->domain))
-		break;
-	    end_after_previous = cloog_loop_next_scal_cmp(end) < 0;
-	}
-	if (end != begin->next && end_after_previous) {
-	    for (l = begin->next; l != end; l = begin->next) {
-		cloog_block_merge(begin->block, l->block);
-		begin->next = l->next;
-		cloog_loop_free_parts(l, 1, 0, 1, 0);
-	    }
-	}
-
-	begin_after_previous = cloog_loop_next_scal_cmp(begin) < 0;
-    }
-
-    return loop;
-}
-
-
-/**
- * Check whether for any fixed iteration of the outer loops,
- * there is an iteration of loop1 that is lexicographically greater
- * than an iteration of loop2.
- * Return 1 if there exists (or may exist) such a pair.
- * Return 0 if all iterations of loop1 are lexicographically smaller
- * than the iterations of loop2.
- * If no iteration is lexicographically greater, but if there are
- * iterations that are equal to iterations of loop2, then return "def".
- * This is useful for ensuring that such statements are not reordered.
- * Some users, including the test_run target in test, expect
- * the statements at a given point to be run in the original order.
- * Passing the value "0" for "def" would allow such statements to be reordered
- * and would allow for the detection of more components.
- */
-int cloog_loop_follows(CloogLoop *loop1, CloogLoop *loop2,
-	int level, int scalar, int *scaldims, int nb_scattdims, int def)
-{
-    int dim1, dim2;
-
-    dim1 = cloog_domain_dimension(loop1->domain);
-    dim2 = cloog_domain_dimension(loop2->domain);
-    while ((level <= dim1 && level <= dim2) ||
-	   level_is_constant(level, scalar, scaldims, nb_scattdims)) {
-	if (level_is_constant(level, scalar, scaldims, nb_scattdims)) {
-	    int cmp = cloog_loop_constant_cmp(loop1, loop2, level, scaldims,
-					    nb_scattdims, scalar);
-	    if (cmp > 0)
-		return 1;
-	    if (cmp < 0)
-		return 0;
-	    scalar += scaldims[level + scalar - 1];
-	} else {
-	    int follows = cloog_domain_follows(loop1->domain, loop2->domain,
-						level);
-	    if (follows > 0)
-		return 1;
-	    if (follows < 0)
-		return 0;
-	    level++;
-	}
-    }
-
-    return def;
-}
-
-
-/* Structure for representing the nodes in the graph being traversed
- * using Tarjan's algorithm.
- * index represents the order in which nodes are visited.
- * min_index is the index of the root of a (sub)component.
- * on_stack indicates whether the node is currently on the stack.
- */
-struct cloog_loop_sort_node {
-    int index;
-    int min_index;
-    int on_stack;
-};
-/* Structure for representing the graph being traversed
- * using Tarjan's algorithm.
- * len is the number of nodes
- * node is an array of nodes
- * stack contains the nodes on the path from the root to the current node
- * sp is the stack pointer
- * index is the index of the last node visited
- * order contains the elements of the components separated by -1
- * op represents the current position in order
- */
-struct cloog_loop_sort {
-    int len;
-    struct cloog_loop_sort_node *node;
-    int *stack;
-    int sp;
-    int index;
-    int *order;
-    int op;
-};
-
-/* Allocate and initialize cloog_loop_sort structure.
- */
-static struct cloog_loop_sort *cloog_loop_sort_alloc(int len)
-{
-    struct cloog_loop_sort *s;
-    int i;
-
-    s = (struct cloog_loop_sort *)malloc(sizeof(struct cloog_loop_sort));
-    assert(s);
-    s->len = len;
-    s->node = (struct cloog_loop_sort_node *)
-			malloc(len * sizeof(struct cloog_loop_sort_node));
-    assert(s->node);
-    for (i = 0; i < len; ++i)
-	s->node[i].index = -1;
-    s->stack = (int *)malloc(len * sizeof(int));
-    assert(s->stack);
-    s->order = (int *)malloc(2 * len * sizeof(int));
-    assert(s->order);
-
-    s->sp = 0;
-    s->index = 0;
-    s->op = 0;
-
-    return s;
-}
-
-/* Free cloog_loop_sort structure.
- */
-static void cloog_loop_sort_free(struct cloog_loop_sort *s)
-{
-    free(s->node);
-    free(s->stack);
-    free(s->order);
-    free(s);
-}
-
-
-/* Check whether for any fixed iteration of the outer loops,
- * there is an iteration of loop1 that is lexicographically greater
- * than an iteration of loop2, where the iteration domains are
- * available in the inner loops of the arguments.
- *
- * By using this functions to detect components, we ensure that
- * two CloogLoops appear in the same component if some iterations of
- * each loop should be executed before some iterations of the other loop.
- * Since we also want two CloogLoops that have exactly the same
- * iteration domain at the current level to be placed in the same component,
- * we first check if these domains are indeed the same.
- */
-static int inner_loop_follows(CloogLoop *loop1, CloogLoop *loop2,
-	int level, int scalar, int *scaldims, int nb_scattdims, int def)
-{
-    int f;
-
-    f = cloog_domain_lazy_equal(loop1->domain, loop2->domain);
-    if (!f)
-	f = cloog_loop_follows(loop1->inner, loop2->inner,
-				level, scalar, scaldims, nb_scattdims, def);
-
-    return f;
-}
-
-
-/* Perform Tarjan's algorithm for computing the strongly connected components
- * in the graph with the individual CloogLoops as vertices.
- * Two CloopLoops appear in the same component if they both (indirectly)
- * "follow" each other, where the following relation is determined
- * by the follows function.
- */
-static void cloog_loop_components_tarjan(struct cloog_loop_sort *s,
-	CloogLoop **loop_array, int i, int level, int scalar, int *scaldims,
-	int nb_scattdims,
-	int (*follows)(CloogLoop *loop1, CloogLoop *loop2,
-	    int level, int scalar, int *scaldims, int nb_scattdims, int def))
-{
-    int j;
-
-    s->node[i].index = s->index;
-    s->node[i].min_index = s->index;
-    s->node[i].on_stack = 1;
-    s->index++;
-    s->stack[s->sp++] = i;
-
-    for (j = s->len - 1; j >= 0; --j) {
-	int f;
-
-	if (j == i)
-	    continue;
-	if (s->node[j].index >= 0 &&
-		(!s->node[j].on_stack ||
-		 s->node[j].index > s->node[i].min_index))
-	    continue;
-
-	f = follows(loop_array[i], loop_array[j],
-				level, scalar, scaldims, nb_scattdims, i > j);
-	if (!f)
-	    continue;
-
-	if (s->node[j].index < 0) {
-	    cloog_loop_components_tarjan(s, loop_array, j, level, scalar,
-					 scaldims, nb_scattdims, follows);
-	    if (s->node[j].min_index < s->node[i].min_index)
-		s->node[i].min_index = s->node[j].min_index;
-	} else if (s->node[j].index < s->node[i].min_index)
-		s->node[i].min_index = s->node[j].index;
-    }
-
-    if (s->node[i].index != s->node[i].min_index)
-	return;
-
-    do {
-	j = s->stack[--s->sp];
-	s->node[j].on_stack = 0;
-	s->order[s->op++] = j;
-    } while (j != i);
-    s->order[s->op++] = -1;
-}
-
-
-static int qsort_index_cmp(const void *p1, const void *p2)
-{
-    return *(int *)p1 - *(int *)p2;
-}
-
-/* Sort the elements of the component starting at list.
- * The list is terminated by a -1.
- */
-static void sort_component(int *list)
-{
-    int len;
-
-    for (len = 0; list[len] != -1; ++len)
-	;
-
-    qsort(list, len, sizeof(int), qsort_index_cmp);
-}
-
-/* Given an array of indices "list" into the "loop_array" array,
- * terminated by -1, construct a linked list of the corresponding
- * entries and put the result in *res.
- * The value returned is the number of CloogLoops in the (linked) list
- */
-static int extract_component(CloogLoop **loop_array, int *list, CloogLoop **res)
-{
-    int i = 0;
-
-    sort_component(list);
-    while (list[i] != -1) {
-	*res = loop_array[list[i]];
-	res = &(*res)->next;
-	++i;
-    }
-    *res = NULL;
-
-    return i;
-}
-
-
-/**
- * Call cloog_loop_generate_scalar or cloog_loop_generate_general
- * on each of the strongly connected components in the list of CloogLoops
- * pointed to by "loop".
- *
- * We use Tarjan's algorithm to find the strongly connected components.
- * Note that this algorithm also topologically sorts the components.
- *
- * The components are treated separately to avoid spurious separations.
- * The concatentation of the results may contain successive loops
- * with the same bounds, so we try to combine such loops.
- */
-CloogLoop *cloog_loop_generate_components(CloogLoop *loop,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	CloogOptions *options)
-{
-    int i, nb_loops;
-    CloogLoop *tmp;
-    CloogLoop *res, **res_next;
-    CloogLoop **loop_array;
-    struct cloog_loop_sort *s;
-
-    if (level == 0 || !loop->next)
-	return cloog_loop_generate_general(loop, level, scalar,
-					     scaldims, nb_scattdims, options);
-
-    nb_loops = cloog_loop_count(loop);
-
-    loop_array = (CloogLoop **)malloc(nb_loops * sizeof(CloogLoop *));
-    assert(loop_array);
-
-    for (i = 0, tmp = loop; i < nb_loops; i++, tmp = tmp->next)
-	loop_array[i] = tmp;
-
-    s = cloog_loop_sort_alloc(nb_loops);
-    for (i = nb_loops - 1; i >= 0; --i) {
-	if (s->node[i].index >= 0)
-	    continue;
-	cloog_loop_components_tarjan(s, loop_array, i, level, scalar, scaldims,
-					nb_scattdims, &inner_loop_follows);
-    }
-
-    i = 0;
-    res = NULL;
-    res_next = &res;
-    while (nb_loops) {
-	int n = extract_component(loop_array, &s->order[i], &tmp);
-	i += n + 1;
-	nb_loops -= n;
-	*res_next = cloog_loop_generate_general(tmp, level, scalar,
-					     scaldims, nb_scattdims, options);
-    	while (*res_next)
-	    res_next = &(*res_next)->next;
-    }
-
-    cloog_loop_sort_free(s);
-
-    free(loop_array);
-
-    res = cloog_loop_combine(res);
-
-    return res;
-}
-
-
-/* For each loop in the list "loop", decompose the list of
- * inner loops into strongly connected components and put
- * the components into separate loops at the top level.
- */
-CloogLoop *cloog_loop_decompose_inner(CloogLoop *loop,
-	int level, int scalar, int *scaldims, int nb_scattdims)
-{
-    CloogLoop *l, *tmp;
-    CloogLoop **loop_array;
-    int i, n_loops, max_loops = 0;
-    struct cloog_loop_sort *s;
-
-    for (l = loop; l; l = l->next) {
-	n_loops = cloog_loop_count(l->inner);
-	if (max_loops < n_loops)
-	    max_loops = n_loops;
-    }
-
-    if (max_loops <= 1)
-	return loop;
-
-    loop_array = (CloogLoop **)malloc(max_loops * sizeof(CloogLoop *));
-    assert(loop_array);
-
-    for (l = loop; l; l = l->next) {
-	int n;
-
-	for (i = 0, tmp = l->inner; tmp; i++, tmp = tmp->next)
-	    loop_array[i] = tmp;
-	n_loops = i;
-	if (n_loops <= 1)
-	    continue;
-
-	s = cloog_loop_sort_alloc(n_loops);
-	for (i = n_loops - 1; i >= 0; --i) {
-	    if (s->node[i].index >= 0)
-		continue;
-	    cloog_loop_components_tarjan(s, loop_array, i, level, scalar,
-				scaldims, nb_scattdims, &cloog_loop_follows);
-	}
-
-	n = extract_component(loop_array, s->order, &l->inner);
-	n_loops -= n;
-	i = n + 1;
-	while (n_loops) {
-	    CloogLoop *inner;
-
-	    n = extract_component(loop_array, &s->order[i], &inner);
-	    n_loops -= n;
-	    i += n + 1;
-	    tmp = cloog_loop_alloc(l->state, cloog_domain_copy(l->domain),
-			l->otl, l->stride, l->block, inner, l->next);
-	    l->next = tmp;
-	    l = tmp;
-	}
-
-	cloog_loop_sort_free(s);
-    }
-
-    free(loop_array);
-
-    return loop;
-}
-
-
-CloogLoop *cloog_loop_generate_restricted(CloogLoop *loop,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	CloogOptions *options)
-{
-  /* To save both time and memory, we switch here depending on whether the
-   * current dimension is scalar (simplified processing) or not (general
-   * processing).
-   */
-  if (level_is_constant(level, scalar, scaldims, nb_scattdims))
-    return cloog_loop_generate_scalar(loop, level, scalar,
-                                   scaldims, nb_scattdims, options);
-  /*
-   * 2. Compute the projection of each polyhedron onto the outermost
-   *    loop variable and the parameters.
-   */
-  loop = cloog_loop_project_all(loop, level);
-
-  return cloog_loop_generate_components(loop, level, scalar, scaldims,
-					nb_scattdims, options);
-}
-
-
-CloogLoop *cloog_loop_generate_restricted_or_stop(CloogLoop *loop,
-	CloogDomain *context,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	CloogOptions *options)
-{
-  /* If the user asked to stop code generation at this level, let's stop. */
-  if ((options->stop >= 0) && (level+scalar >= options->stop+1))
-    return cloog_loop_stop(loop,context) ;
-  
-  return cloog_loop_generate_restricted(loop, level, scalar, scaldims,
-  				nb_scattdims, options);
-}
-
-
-/**
- * cloog_loop_generate function:
- * Adaptation from LoopGen 0.4 by F. Quillere. This function implements the
- * Quillere algorithm for polyhedron scanning from step 1 to 2.
- * (see the Quillere paper).
- * - loop is the loop for which we have to generate a scanning code,
- * - context is the context of the current loop (constraints on parameter and/or
- *   on outer loop counters),
- * - level is the current non-scalar dimension,
- * - scalar is the current scalar dimension,
- * - scaldims is the boolean array saying whether a dimension is scalar or not,
- * - nb_scattdims is the size of the scaldims array,
- * - options are the general code generation options.
- **
- * - October 26th 2001: first version.
- * - July 3rd->11th 2003: memory leaks hunt and correction.
- * - June      15th 2005: a memory leak fixed (loop was not entirely freed when
- *                        the result of cloog_loop_restrict was NULL).
- * - June      22nd 2005: Adaptation for GMP.
- * - September  2nd 2005: The function have been cutted out in two pieces:
- *                        cloog_loop_generate and this one, in order to handle
- *                        the scalar dimension case more efficiently with
- *                        cloog_loop_generate_scalar.
- * - November  15th 2005: (debug) Condition for stop option no more take care of
- *                        further scalar dimensions.
- */ 
-CloogLoop *cloog_loop_generate(CloogLoop *loop, CloogDomain *context,
-	int level, int scalar, int *scaldims, int nb_scattdims,
-	CloogOptions *options)
-{
-  /* 1. Replace each polyhedron by its intersection with the context.
-   */
-  loop = cloog_loop_restrict_all(loop, context);
-  if (!loop)
-    return NULL;
-
-  return cloog_loop_generate_restricted_or_stop(loop, context,
-			      level, scalar, scaldims, nb_scattdims, options);
-}
-
-
-/*
- * Internal function for simplifying a single loop in a list of loops.
- * See cloog_loop_simplify.
- */
-static CloogLoop *loop_simplify(CloogLoop *loop, CloogDomain *context,
-	int level, int nb_scattdims, CloogOptions *options)
-{
-  int domain_dim;
-  CloogBlock * new_block ;
-  CloogLoop *simplified, *inner;
-  CloogDomain * domain, * simp, * inter, * extended_context ;
-
-  domain = loop->domain ;
-  
-  domain_dim = cloog_domain_dimension(domain);
-  extended_context = cloog_domain_extend(context, domain_dim);
-  inter = cloog_domain_intersection(domain,extended_context) ;
-  simp = cloog_domain_simplify(domain, extended_context);
-  cloog_domain_free(extended_context) ;
-
-  /* If the constraint system is never true, go to the next one. */
-  if (cloog_domain_never_integral(simp)) {
-    cloog_loop_free(loop->inner);
-    cloog_domain_free(inter);
-    cloog_domain_free(simp);
-    return NULL;
-  }
-
-  inner = cloog_loop_simplify(loop->inner, inter, level+1, nb_scattdims,
-                              options);
-  
-  if ((inner == NULL) && (loop->block == NULL)) {
-    cloog_domain_free(inter);
-    cloog_domain_free(simp);
-    return NULL;
-  }
-
-  new_block = cloog_block_copy(loop->block) ;
-  
-  simplified = cloog_loop_alloc(loop->state, simp, loop->otl, loop->stride,
-				new_block, inner, NULL);
-
-  /* Only save the domains, if it involves only scattering dimensions.  */
-  if (options->save_domains) {
-    if (domain_dim > nb_scattdims) {
-      CloogDomain *t;
-      inter = cloog_domain_project(t = inter, nb_scattdims);
-      cloog_domain_free(t);
-    }
-    inter = cloog_domain_add_stride_constraint(inter, loop->stride);
-    simplified->unsimplified = inter;
-  } else
-    cloog_domain_free(inter);
-
-  return(simplified) ; 
-}
-
-
-/**
- * cloog_loop_simplify function:
- * This function implements the part 6. of the Quillere algorithm, it
- * recursively simplifies each loop in the context of the preceding loop domain.
- * It returns a pointer to the simplified loop list.
- * The cloog_domain_simplify (DomainSimplify) behaviour is really bad with
- * polyhedra union and some really awful sidesteppings were written, I plan
- * to solve that...
- * - October   31th 2001: first version. 
- * - July 3rd->11th 2003: memory leaks hunt and correction.
- * - April     16th 2005: a memory leak fixed (extended_context was not freed).
- * - June      15th 2005: a memory leak fixed (loop was not conveniently freed
- *                        when the constraint system is never true).
- * - October   27th 2005: - this function called before cloog_loop_fast_simplify
- *                          is now the official cloog_loop_simplify function in
- *                          replacement of a slower and more complex one (after 
- *                          deep changes in the pretty printer).
- *                        - we use cloog_loop_disjoint to fix the problem when
- *                          simplifying gives a union of polyhedra (before, it
- *                          was under the responsibility of the pretty printer).
- */ 
-CloogLoop *cloog_loop_simplify(CloogLoop *loop, CloogDomain *context, int level,
-	                       int nb_scattdims, CloogOptions *options)
-{
-  CloogLoop *now;
-  CloogLoop *res = NULL;
-  CloogLoop **next = &res;
-  int need_split = 0;
-
-  for (now = loop; now; now = now->next)
-    if (!cloog_domain_isconvex(now->domain)) {
-      now->domain = cloog_domain_simplify_union(now->domain);
-      if (!cloog_domain_isconvex(now->domain))
-	need_split = 1;
-    }
-  
-  /* If the input of CLooG contains any union domains, then they
-   * may not have been split yet at this point.  Do so now as the
-   * clast construction assumes there are no union domains.
-   */
-  if (need_split)
-    loop = cloog_loop_disjoint(loop);
-
-  for (now = loop; now; now = now->next) {
-    *next = loop_simplify(now, context, level, nb_scattdims, options);
-
-    now->inner = NULL; /* For loop integrity. */
-    cloog_domain_free(now->domain);
-    now->domain = NULL;
-
-    if (*next)
-      next = &(*next)->next;
-  }
-  cloog_loop_free(loop);
-
-  return res;
-}
-
-
-/**
- * cloog_loop_scatter function:
- * This function add the scattering (scheduling) informations in a loop.
- */
-void cloog_loop_scatter(CloogLoop * loop, CloogScattering *scatt)
-{
-  loop->domain = cloog_domain_scatter(loop->domain, scatt);
-}
-
diff --git a/cloog-0.17.0/source/matrix.c b/cloog-0.17.0/source/matrix.c
deleted file mode 100644
index 43c2380..0000000
--- a/cloog-0.17.0/source/matrix.c
+++ /dev/null
@@ -1,213 +0,0 @@
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                           cloogmatrix.c                           **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include "../include/cloog/cloog.h"
-
-/**
- * cloog_matrix_alloc:
- * Allocate a CloogMatrix data structure with NbRows rows and NbColumns columns.
- * All values are initialized to 0.
- * This method returns a pointer to the data structure if successful or a NULL
- * pointer otherwise.
- */
-CloogMatrix *cloog_matrix_alloc(unsigned NbRows, unsigned NbColumns)
-{
-  CloogMatrix *matrix;
-  cloog_int_t **p, *q;
-  int i, j;
-
-  matrix = (CloogMatrix *)malloc(sizeof(CloogMatrix));
-
-  if (!matrix)
-    return NULL;
-
-  matrix->NbRows = NbRows;
-  matrix->NbColumns = NbColumns;
-
-  if (!NbRows || !NbColumns) {
-    matrix->p = NULL;
-    matrix->p_Init = NULL;
-    return matrix;
-  }
-
-  p = (cloog_int_t **)malloc(NbRows * sizeof(cloog_int_t *));
-
-  if (p == NULL) {
-    free (matrix);
-    return NULL;
-  }
-
-  q = (cloog_int_t *)malloc(NbRows * NbColumns * sizeof(cloog_int_t));
-
-  if (q == NULL) {
-    free (matrix);
-    free (p);
-    return NULL;
-  }
-
-  matrix->p = p;
-  matrix->p_Init = q;
-
-  for (i = 0; i < NbRows; i++) {
-    *p++ = q;
-    for (j = 0; j < NbColumns; j++) {
-      cloog_int_init(*(q+j));
-      cloog_int_set_si(*(q+j), 0);
-    }
-    q += NbColumns;
-  }
-
-  return matrix;
-}
-
-/**
- * cloog_matrix_free:
- * Free matrix.
- */
-void cloog_matrix_free(CloogMatrix * matrix)
-{
-  int i;
-  cloog_int_t *p;
-  int size = matrix->NbRows * matrix->NbColumns;
-
-  p = matrix->p_Init;
-
-  for (i = 0; i < size; i++)
-    cloog_int_clear(*p++);
-
-  if (matrix) {
-    free(matrix->p_Init);
-    free(matrix->p);
-    free(matrix);
-  }
-}
-
-
-/**
- * Print the elements of CloogMatrix M to file, with each row prefixed
- * by prefix and suffixed by suffix.
- */
-void cloog_matrix_print_structure(FILE *file, CloogMatrix *M,
-		const char *prefix, const char *suffix)
-{
-    int i, j;
-
-    for (i = 0; i < M->NbRows; ++i) {
-	fprintf(file, "%s", prefix);
-	for (j = 0; j < M->NbColumns; ++j) {
-	    cloog_int_print(file, M->p[i][j]);
-	    fprintf(file, " ");
-	}
-	fprintf(file, "%s\n", suffix);
-    }
-}
-
-/**
- * cloog_matrix_print function:
- * This function prints the content of a CloogMatrix structure (matrix) into a
- * file (foo, possibly stdout).
- */
-void cloog_matrix_print(FILE* foo, CloogMatrix* m)
-{
-  if (!m)
-    fprintf(foo, "(null)\n");
-
-  fprintf(foo, "%d %d\n", m->NbRows, m->NbColumns);
-  cloog_matrix_print_structure(foo, m, "", "");
-  fflush(foo);
-}
-
-
-static char *next_line(FILE *input, char *line, unsigned len)
-{
-	char *p;
-
-	do {
-		if (!(p = fgets(line, len, input)))
-			return NULL;
-		while (isspace(*p) && *p != '\n')
-			++p;
-	} while (*p == '#' || *p == '\n');
-
-	return p;
-}
-
-CloogMatrix *cloog_matrix_read(FILE *input)
-{
-	unsigned n_row, n_col;
-	char line[1024];
-
-	if (!next_line(input, line, sizeof(line)))
-		cloog_die("Input error.\n");
-	if (sscanf(line, "%u %u", &n_row, &n_col) != 2)
-		cloog_die("Input error.\n");
-	
-	return cloog_matrix_read_of_size(input, n_row, n_col);
-}
-
-/**
- * Read a matrix in PolyLib format from input.
- */
-CloogMatrix *cloog_matrix_read_of_size(FILE *input,
-	unsigned n_row, unsigned n_col)
-{
-	CloogMatrix *M;
-	int i, j;
-	char line[1024];
-	char val[1024];
-	char *p;
-
-	M = cloog_matrix_alloc(n_row, n_col);
-	if (!M)
-		cloog_die("memory overflow.\n");
-	for (i = 0; i < n_row; ++i) {
-		int offset;
-		int n;
-
-		p = next_line(input, line, sizeof(line));
-		if (!p)
-			cloog_die("Input error.\n");
-		for (j = 0; j < n_col; ++j) {
-			n = sscanf(p, "%s%n", val, &offset);
-			if (!n)
-				cloog_die("Input error.\n");
-			cloog_int_read(M->p[i][j], val);
-			p += offset;
-		}
-	}
-
-	return M;
-}
diff --git a/cloog-0.17.0/source/matrix/constraintset.c b/cloog-0.17.0/source/matrix/constraintset.c
deleted file mode 100644
index 78025f8..0000000
--- a/cloog-0.17.0/source/matrix/constraintset.c
+++ /dev/null
@@ -1,1056 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                               CLooG                               **
-    **-------------------------------------------------------------------**
-    **                          constraintset.c                          **
-    **-------------------------------------------------------------------**
-    **                    First version: april 17th 2005                 **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2005 Cedric Bastoul                                          *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-/* CAUTION: the english used for comments is probably the worst you ever read,
- *          please feel free to correct and improve it !
- */
-
-
-# include <stdlib.h>
-# include <stdio.h>
-# include <ctype.h>
-#include <cloog/cloog.h>
-#include <cloog/matrix/constraintset.h>
-
-
-#define ALLOC(type) (type*)malloc(sizeof(type))
-#define ALLOCN(type,n) (type*)malloc((n)*sizeof(type))
-
-
-CloogConstraint *cloog_constraint_first(CloogConstraintSet *constraints);
-CloogConstraint *cloog_constraint_next(CloogConstraint *constraint);
-
-
-CloogConstraintSet *cloog_constraint_set_from_cloog_matrix(CloogMatrix *M)
-{
-	return (CloogConstraintSet *)M;
-}
-
-
-void cloog_constraint_set_free(CloogConstraintSet *constraints)
-{
-	cloog_matrix_free(&constraints->M);
-}
-
-int cloog_constraint_set_contains_level(CloogConstraintSet *constraints,
-			int level, int nb_parameters)
-{
-	return constraints->M.NbColumns - 2 - nb_parameters >= level;
-}
-
-/* Check if the variable at position level is defined by an
- * equality.  If so, return the row number.  Otherwise, return -1.
- *
- * If there is an equality, we can print it directly -no ambiguity-.
- * PolyLib can give more than one equality, we use just the first one
- * (this is a PolyLib problem, but all equalities are equivalent).
- */
-CloogConstraint *cloog_constraint_set_defining_equality(CloogConstraintSet *constraints, int level)
-{
-	CloogConstraint *constraint = ALLOC(CloogConstraint);
-	int i;
-
-	constraint->set = constraints;
-	for (i = 0; i < constraints->M.NbRows; i++)
-		if (cloog_int_is_zero(constraints->M.p[i][0]) &&
-		    !cloog_int_is_zero(constraints->M.p[i][level])) {
-			constraint->line = &constraints->M.p[i];
-			return constraint;
-		    }
-	free(constraint);
-	return cloog_constraint_invalid();
-}
-
-/* Check if the variable (e) at position level is defined by a
- * pair of inequalities
- *		 <a, i> + -m e +  <b, p> + k1 >= 0
- *		<-a, i> +  m e + <-b, p> + k2 >= 0
- * with 0 <= k1 + k2 < m
- * If so return the row number of the upper bound and set *lower
- * to the row number of the lower bound.  If not, return -1.
- *
- * If the variable at position level occurs in any other constraint,
- * then we currently return -1.  The modulo guard that we would generate
- * would still be correct, but we would also need to generate
- * guards corresponding to the other constraints, and this has not
- * been implemented yet.
- */
-CloogConstraint *cloog_constraint_set_defining_inequalities(CloogConstraintSet *constraints,
-	int level, CloogConstraint **lower, int nb_par)
-{
-	int i, j, k;
-	cloog_int_t m;
-	CloogMatrix *matrix = &constraints->M;
-	unsigned len = matrix->NbColumns - 2;
-	unsigned nb_iter = len - nb_par;
-	CloogConstraint *constraint;
-
-	for (i = 0; i < matrix->NbRows; i++) {
-		if (cloog_int_is_zero(matrix->p[i][level]))
-			continue;
-		if (cloog_int_is_zero(matrix->p[i][0]))
-			return cloog_constraint_invalid();
-		if (cloog_int_is_one(matrix->p[i][level]))
-			return cloog_constraint_invalid();
-		if (cloog_int_is_neg_one(matrix->p[i][level]))
-			return cloog_constraint_invalid();
-		if (cloog_seq_first_non_zero(matrix->p[i]+level+1,
-				    (1+nb_iter)-(level+1)) != -1)
-			return cloog_constraint_invalid();
-		for (j = i+1; j < matrix->NbRows; ++j) {
-			if (cloog_int_is_zero(matrix->p[j][level]))
-				continue;
-			if (cloog_int_is_zero(matrix->p[j][0]))
-				return cloog_constraint_invalid();
-			if (cloog_int_is_one(matrix->p[j][level]))
-				return cloog_constraint_invalid();
-			if (cloog_int_is_neg_one(matrix->p[j][level]))
-				return cloog_constraint_invalid();
-			if (cloog_seq_first_non_zero(matrix->p[j]+level+1,
-					    (1+nb_iter)-(level+1)) != -1)
-				return cloog_constraint_invalid();
-
-			cloog_int_init(m);
-			cloog_int_add(m, matrix->p[i][1+len], matrix->p[j][1+len]);
-			if (cloog_int_is_neg(m) ||
-			    cloog_int_abs_ge(m, matrix->p[i][level])) {
-				cloog_int_clear(m);
-				return cloog_constraint_invalid();
-			}
-			cloog_int_clear(m);
-
-			if (!cloog_seq_is_neg(matrix->p[i]+1, matrix->p[j]+1,
-						len))
-				return cloog_constraint_invalid();
-			for (k = j+1; k < matrix->NbRows; ++k)
-				if (!cloog_int_is_zero(matrix->p[k][level]))
-					return cloog_constraint_invalid();
-			*lower = ALLOC(CloogConstraint);
-			constraint = ALLOC(CloogConstraint);
-			(*lower)->set = constraints;
-			constraint->set = constraints;
-			if (cloog_int_is_pos(matrix->p[i][level])) {
-				(*lower)->line = &matrix->p[i];
-				constraint->line = &matrix->p[j];
-			} else {
-				(*lower)->line = &matrix->p[j];
-				constraint->line = &matrix->p[i];
-			}
-			return constraint;
-		}
-	}
-	return cloog_constraint_invalid();
-}
-
-int cloog_constraint_set_total_dimension(CloogConstraintSet *constraints)
-{
-	return constraints->M.NbColumns - 2;
-}
-
-int cloog_constraint_set_n_iterators(CloogConstraintSet *constraint, int nb_par)
-{
-	return cloog_constraint_set_total_dimension(constraint) - nb_par;
-}
-
-int cloog_equal_total_dimension(CloogEqualities *equal)
-{
-	return cloog_constraint_set_total_dimension(equal->constraints);
-}
-
-int cloog_constraint_total_dimension(CloogConstraint *constraint)
-{
-	return cloog_constraint_set_total_dimension(constraint->set);
-}
-
-
-
-/******************************************************************************
- *                        Equalities spreading functions                      *
- ******************************************************************************/
-
-
-/* Equalities are stored inside a CloogMatrix data structure called "equal".
- * This matrix has (nb_scattering + nb_iterators + 1) rows (i.e. total
- * dimensions + 1, the "+ 1" is because a statement can be included inside an
- * external loop without iteration domain), and (nb_scattering + nb_iterators +
- * nb_parameters + 2) columns (all unknowns plus the scalar plus the equality
- * type). The ith row corresponds to the equality "= 0" for the ith dimension
- * iterator. The first column gives the equality type (0: no equality, then
- * EQTYPE_* -see pprint.h-). At each recursion of pprint, if an equality for
- * the current level is found, the corresponding row is updated. Then the
- * equality if it exists is used to simplify expressions (e.g. if we have 
- * "i+1" while we know that "i=2", we simplify it in "3"). At the end of
- * the pprint call, the corresponding row is reset to zero.
- */
-
-CloogEqualities *cloog_equal_alloc(int n, int nb_levels,
-			int nb_parameters)
-{
-    int i;
-    CloogEqualities *equal = ALLOC(CloogEqualities);
-
-    equal->constraints = cloog_constraint_set_from_cloog_matrix(
-		cloog_matrix_alloc(n, nb_levels + nb_parameters + 1));
-    equal->types = ALLOCN(int, n);
-    for (i = 0; i < n; ++i)
-	equal->types[i] = EQTYPE_NONE;
-    return equal;
-}
-
-void cloog_equal_free(CloogEqualities *equal)
-{
-    cloog_matrix_free(&equal->constraints->M);
-    free(equal->types);
-    free(equal);
-}
-
-int cloog_equal_count(CloogEqualities *equal)
-{
-    return equal->constraints->M.NbRows;
-}
-
-CloogConstraintSet *cloog_equal_constraints(CloogEqualities *equal)
-{
-    return equal->constraints;
-}
-
-
-/**
- * cloog_constraint_equal_type function :
- * This function returns the type of the equality in the constraint (line) of
- * (constraints) for the element (level). An equality is 'constant' iff all
- * other factors are null except the constant one. It is a 'pure item' iff
- * it is equal or opposite to a single variable or parameter.
- * Otherwise it is an 'affine expression'.
- * For instance:
- *   i = -13 is constant, i = j, j = -M are pure items,
- *   j = 2*M, i = j+1, 2*j = M are affine expressions.
- *
- * - constraints is the matrix of constraints,
- * - level is the column number in equal of the element which is 'equal to',
- **
- * - July     3rd 2002: first version, called pprint_equal_isconstant. 
- * - July     6th 2002: adaptation for the 3 types. 
- * - June    15th 2005: (debug) expr = domain->Constraint[line] was evaluated
- *                      before checking if line != ONE_TIME_LOOP. Since
- *                      ONE_TIME_LOOP is -1, an invalid read was possible.
- * - October 19th 2005: Removal of the once-time-loop specific processing.
- */
-static int cloog_constraint_equal_type(CloogConstraint *constraint, int level)
-{ 
-  int i, one=0 ;
-  cloog_int_t *expr;
-    
-  expr = *constraint->line;
-  
-  if (!cloog_int_is_one(expr[level]) && !cloog_int_is_neg_one(expr[level]))
-    return EQTYPE_EXAFFINE;
-
-  /* There is only one non null factor, and it must be +1 or -1 for
-   * iterators or parameters.
-   */ 
-  for (i = 1;i <= constraint->set->M.NbColumns-2; i++)
-  if (!cloog_int_is_zero(expr[i]) && (i != level)) {
-    if ((!cloog_int_is_one(expr[i]) && !cloog_int_is_neg_one(expr[i])) || (one != 0))
-    return EQTYPE_EXAFFINE ;
-    else
-    one = 1 ;
-  }
-  /* if the constant factor is non null, it must be alone. */
-  if (one != 0) {
-    if (!cloog_int_is_zero(expr[constraint->set->M.NbColumns-1]))
-    return EQTYPE_EXAFFINE ;
-  }
-  else
-  return EQTYPE_CONSTANT ;
-  
-  return EQTYPE_PUREITEM ;
-}
-
-
-int cloog_equal_type(CloogEqualities *equal, int level)
-{
-	return equal->types[level-1];
-}
-
-
-/**
- * cloog_equal_update function:
- * this function updates a matrix of equalities where each row corresponds to
- * the equality "=0" of an affine expression such that the entry at column
- * "row" (="level") is not zero. This matrix is upper-triangular, except the
- * row number "level-1" which has to be updated for the matrix to be triangular.
- * This function achieves the processing.
- * - equal is the matrix to be updated,
- * - level gives the row that has to be updated (it is actually row "level-1"),
- * - nb_par is the number of parameters of the program.
- **
- * - September 20th 2005: first version.
- */
-static void cloog_equal_update(CloogEqualities *equal, int level, int nb_par)
-{ int i, j ;
-  cloog_int_t gcd, factor_level, factor_outer, temp_level, temp_outer;
-  
-  cloog_int_init(gcd);
-  cloog_int_init(temp_level);
-  cloog_int_init(temp_outer);
-  cloog_int_init(factor_level);
-  cloog_int_init(factor_outer);
-  
-  /* For each previous level, */
-  for (i=level-2;i>=0;i--)
-  { /* if the corresponding iterator is inside the current equality and is equal
-     * to something,
-     */
-    if (!cloog_int_is_zero(equal->constraints->M.p[level-1][i+1]) && equal->types[i])
-    { /* Compute the Greatest Common Divisor. */ 
-      cloog_int_gcd(gcd, equal->constraints->M.p[level-1][i+1],
-			 equal->constraints->M.p[i][i+1]);
-      
-      /* Compute the factors to apply to each row vector element. */
-      cloog_int_divexact(factor_level, equal->constraints->M.p[i][i+1], gcd);
-      cloog_int_divexact(factor_outer, equal->constraints->M.p[level-1][i+1], gcd);
-            
-      /* Now update the row 'level'. */
-      /* - the iterators, up to level, */
-      for (j = 1; j <= level; j++) {
-        cloog_int_mul(temp_level, factor_level,
-			equal->constraints->M.p[level-1][j]);
-        cloog_int_mul(temp_outer, factor_outer, equal->constraints->M.p[i][j]);
-        cloog_int_sub(equal->constraints->M.p[level-1][j], temp_level, temp_outer);
-      }
-      /* - between last useful iterator (level) and the first parameter, the
-       *   matrix is sparse (full of zeroes), we just do nothing there. 
-       * - the parameters and the scalar.
-       */
-      for (j = 0; j < nb_par + 1; j++) {
-        cloog_int_mul(temp_level,factor_level,
-                       equal->constraints->M.p[level-1]
-					[equal->constraints->M.NbColumns-j-1]);
-        cloog_int_mul(temp_outer,factor_outer,
-                       equal->constraints->M.p[i][equal->constraints->M.NbColumns-j-1]);
-        cloog_int_sub(equal->constraints->M.p[level-1]
-					 [equal->constraints->M.NbColumns-j-1],
-	               temp_level,temp_outer) ;
-      }
-    }
-  }
-  
-  /* Normalize (divide by GCD of all elements) the updated equality. */
-  cloog_seq_normalize(&(equal->constraints->M.p[level-1][1]),
-			equal->constraints->M.NbColumns-1);
-
-  cloog_int_clear(gcd);
-  cloog_int_clear(temp_level);
-  cloog_int_clear(temp_outer);
-  cloog_int_clear(factor_level);
-  cloog_int_clear(factor_outer);
-}
-
-
-/**
- * cloog_equal_add function:
- * This function updates the row (level-1) of the equality matrix (equal) with
- * the row that corresponds to the row (line) of the matrix (matrix).
- * - equal is the matrix of equalities,
- * - matrix is the matrix of constraints,
- * - level is the column number in matrix of the element which is 'equal to',
- * - line is the line number in matrix of the constraint we want to study,
- * - the infos structure gives the user all options on code printing and more.
- **
- * - July     2nd 2002: first version. 
- * - October 19th 2005: Addition of the once-time-loop specific processing.
- */
-void cloog_equal_add(CloogEqualities *equal, CloogConstraintSet *constraints,
-			int level, CloogConstraint *line, int nb_par)
-{ 
-  int j;
-  CloogConstraint *i = cloog_constraint_invalid();
-  CloogMatrix *matrix = &constraints->M;
-
-  /* If we are in the case of a loop running once, this means that the equality
-   * comes from an inequality. Here we find this inequality.
-   */
-  if (!cloog_constraint_is_valid(line))
-  { for (i = cloog_constraint_first(constraints);
-	 cloog_constraint_is_valid(i); i = cloog_constraint_next(i))
-    if ((!cloog_int_is_zero(i->line[0][0]))&& (!cloog_int_is_zero(i->line[0][level])))
-    { line = i ;
-      
-      /* Since in once-time-loops, equalities derive from inequalities, we
-       * may have to offset the values. For instance if we have 2i>=3, the
-       * equality is in fact i=2. This may happen when the level coefficient is
-       * not 1 or -1 and the scalar value is not zero. In any other case (e.g.,
-       * if the inequality is an expression including outer loop counters or
-       * parameters) the once time loop would not have been detected
-       * because of floord and ceild functions.
-       */
-      if (cloog_int_ne_si(i->line[0][level],1) &&
-          cloog_int_ne_si(i->line[0][level],-1) &&
-	  !cloog_int_is_zero(i->line[0][matrix->NbColumns-1])) {
-	cloog_int_t denominator;
-        
-	cloog_int_init(denominator);
-	cloog_int_abs(denominator, i->line[0][level]);
-	cloog_int_fdiv_q(i->line[0][matrix->NbColumns-1],
-			 i->line[0][matrix->NbColumns-1], denominator);
-	cloog_int_set_si(i->line[0][level], cloog_int_sgn(i->line[0][level]));
-	cloog_int_clear(denominator);
-      }
-            
-      break ;
-    }
-  }
-  assert(cloog_constraint_is_valid(line));
-  
-  /* We update the line of equal corresponding to level:
-   * - the first element gives the equality type,
-   */
-  equal->types[level-1] = cloog_constraint_equal_type(line, level);
-  /* - the other elements corresponding to the equality itself
-   *   (the iterators up to level, then the parameters and the scalar).
-   */
-  for (j=1;j<=level;j++)
-      cloog_int_set(equal->constraints->M.p[level-1][j], line->line[0][j]);
-  for (j = 0; j < nb_par + 1; j++)
-      cloog_int_set(equal->constraints->M.p[level-1][equal->constraints->M.NbColumns-j-1],
-		   line->line[0][line->set->M.NbColumns-j-1]);
-  
-  if (cloog_constraint_is_valid(i))
-    cloog_constraint_release(line);
-  cloog_equal_update(equal, level, nb_par);
-}
-
-
-/**
- * cloog_equal_del function :
- * This function reset the equality corresponding to the iterator (level)
- * in the equality matrix (equal).
- * - July 2nd 2002: first version. 
- */
-void cloog_equal_del(CloogEqualities *equal, int level)
-{ 
-    equal->types[level-1] = EQTYPE_NONE;
-}
-
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-
-/**
- * Function cloog_constraint_set_normalize:
- * This function will modify the constraint system in such a way that when
- * there is an equality depending on the element at level 'level', there are
- * no more (in)equalities depending on this element. For instance, try
- * test/valilache.cloog with options -f 8 -l 9, with and without the call
- * to this function. At a given moment, for the level L we will have
- * 32*P=L && L>=1 (P is a lower level), this constraint system cannot be
- * translated directly into a source code. Thus, we normalize the domain to
- * remove L from the inequalities. In our example, this leads to
- * 32*P=L && 32*P>=1, that can be transated to the code
- * if (P>=1) { L=32*P ; ... }. This function solves the DaeGon Kim bug.
- * WARNING: Remember that if there is another call to Polylib after a call to
- * this function, we have to recall this function.
- *  -June    16th 2005: first version (adaptation from URGent June-7th-2005 by
- *                      N. Vasilache).
- * - June    21rd 2005: Adaptation for GMP.
- * - November 4th 2005: Complete rewriting, simpler and faster. It is no more an
- *                      adaptation from URGent. 
- */
-void cloog_constraint_set_normalize(CloogConstraintSet *constraints, int level)
-{ int ref, i, j ;
-  cloog_int_t factor_i, factor_ref, temp_i, temp_ref, gcd;
-  CloogMatrix *matrix = &constraints->M;
-    
-  if (matrix == NULL)
-  return ;
-
-  /* Don't "normalize" the constant term. */
-  if (level == matrix->NbColumns-1)
-    return;
-
-  /* Let us find an equality for the current level that can be propagated. */
-  for (ref=0;ref<matrix->NbRows;ref++)
-  if (cloog_int_is_zero(matrix->p[ref][0]) && !cloog_int_is_zero(matrix->p[ref][level])) {
-    cloog_int_init(gcd);
-    cloog_int_init(temp_i);
-    cloog_int_init(temp_ref);
-    cloog_int_init(factor_i);
-    cloog_int_init(factor_ref);
-  
-    /* Row "ref" is the reference equality, now let us find a row to simplify.*/
-    for (i=ref+1;i<matrix->NbRows;i++)
-    if (!cloog_int_is_zero(matrix->p[i][level])) {
-      /* Now let us set to 0 the "level" coefficient of row "j" using "ref".
-       * First we compute the factors to apply to each row vector element.
-       */
-      cloog_int_gcd(gcd, matrix->p[ref][level], matrix->p[i][level]);
-      cloog_int_divexact(factor_i, matrix->p[ref][level], gcd);
-      cloog_int_divexact(factor_ref, matrix->p[i][level], gcd);
-      
-      /* Maybe we are simplifying an inequality: factor_i must not be <0. */
-      if (cloog_int_is_neg(factor_i)) {
-        cloog_int_abs(factor_i, factor_i);
-        cloog_int_neg(factor_ref, factor_ref);
-      }
-      
-      /* Now update the vector. */
-      for (j=1;j<matrix->NbColumns;j++) {
-        cloog_int_mul(temp_i, factor_i, matrix->p[i][j]);
-        cloog_int_mul(temp_ref, factor_ref, matrix->p[ref][j]);
-        cloog_int_sub(matrix->p[i][j], temp_i, temp_ref);
-      }
-    
-      /* Normalize (divide by GCD of all elements) the updated vector. */
-      cloog_seq_normalize(&(matrix->p[i][1]), matrix->NbColumns-1);
-    }
-    
-    cloog_int_clear(gcd);
-    cloog_int_clear(temp_i);
-    cloog_int_clear(temp_ref);
-    cloog_int_clear(factor_i);
-    cloog_int_clear(factor_ref);
-    break ;
-  }
-}
-
-
-
-/**
- * cloog_constraint_set_copy function:
- * this functions builds and returns a "hard copy" (not a pointer copy) of a
- * CloogMatrix data structure.
- * - October 26th 2005: first version.
- */
-CloogConstraintSet *cloog_constraint_set_copy(CloogConstraintSet *constraints)
-{ int i, j ;
-  CloogMatrix *copy;
-  CloogMatrix *matrix = &constraints->M;
-
-  copy = cloog_matrix_alloc(matrix->NbRows, matrix->NbColumns);
-  
-  for (i=0;i<matrix->NbRows;i++)
-  for (j=0;j<matrix->NbColumns;j++)
-      cloog_int_set(copy->p[i][j], matrix->p[i][j]);
-  
-  return cloog_constraint_set_from_cloog_matrix(copy);
-}
-
-
-/**
- * cloog_equal_vector_simplify function:
- * this function simplify an affine expression with its coefficients in
- * "vector" of length "length" thanks to an equality matrix "equal" that gives
- * for some elements of the affine expression an equality with other elements,
- * preferably constants. For instance, if the vector contains i+j+3 and the
- * equality matrix gives i=n and j=2, the vector is simplified to n+3 and is
- * returned in a new vector.
- * - vector is the array of affine expression coefficients
- * - equal is the matrix of equalities,
- * - length is the vector length,
- * - level is a level we don't want to simplify (-1 if none),
- * - nb_par is the number of parameters of the program.
- **
- * - September 20th 2005: first version.
- * - November   2nd 2005: (debug) we are simplifying inequalities, thus we are
- *                        not allowed to multiply the vector by a negative
- *                        constant.Problem found after a report of Michael
- *                        Classen.
- */
-struct cloog_vec *cloog_equal_vector_simplify(CloogEqualities *equal, cloog_int_t *vector,
-				    int length, int level, int nb_par)
-{ int i, j ;
-  cloog_int_t gcd, factor_vector, factor_equal, temp_vector, temp_equal;
-	struct cloog_vec *simplified;
-  
-	simplified = cloog_vec_alloc(length);
-	cloog_seq_cpy(simplified->p, vector, length);
-  
-  cloog_int_init(gcd);
-  cloog_int_init(temp_vector);
-  cloog_int_init(temp_equal);
-  cloog_int_init(factor_vector);
-  cloog_int_init(factor_equal);
-    
-  /* For each non-null coefficient in the vector, */
-  for (i=length-nb_par-2;i>0;i--)
-  if (i != level)
-  { /* if the coefficient in not null, and there exists a useful equality */
-    if ((!cloog_int_is_zero(simplified->p[i])) && equal->types[i-1])
-    { /* Compute the Greatest Common Divisor. */ 
-      cloog_int_gcd(gcd, simplified->p[i], equal->constraints->M.p[i-1][i]);
-      
-      /* Compute the factors to apply to each row vector element. */
-      cloog_int_divexact(factor_vector, equal->constraints->M.p[i-1][i], gcd);
-      cloog_int_divexact(factor_equal, simplified->p[i], gcd);
-      
-      /* We are simplifying an inequality: factor_vector must not be <0. */
-      if (cloog_int_is_neg(factor_vector)) {
-        cloog_int_abs(factor_vector, factor_vector);
-        cloog_int_neg(factor_equal, factor_equal);
-      }
-      
-      /* Now update the vector. */
-      /* - the iterators, up to the current level, */
-      for (j=1;j<=length-nb_par-2;j++) {
-        cloog_int_mul(temp_vector, factor_vector, simplified->p[j]);
-        cloog_int_mul(temp_equal, factor_equal, equal->constraints->M.p[i-1][j]);
-        cloog_int_sub(simplified->p[j], temp_vector, temp_equal);
-      }
-      /* - between last useful iterator (i) and the first parameter, the equal
-       *   matrix is sparse (full of zeroes), we just do nothing there. 
-       * - the parameters and the scalar.
-       */
-      for (j = 0; j < nb_par + 1; j++) {
-        cloog_int_mul(temp_vector, factor_vector, simplified->p[length-1-j]);
-        cloog_int_mul(temp_equal,factor_equal,
-	     equal->constraints->M.p[i-1][equal->constraints->M.NbColumns-j-1]);
-        cloog_int_sub(simplified->p[length-1-j],temp_vector,temp_equal) ;
-      }
-    }
-  }
-  
-  /* Normalize (divide by GCD of all elements) the updated vector. */
-  cloog_seq_normalize(&simplified->p[1], length - 1);
-
-  cloog_int_clear(gcd);
-  cloog_int_clear(temp_vector);
-  cloog_int_clear(temp_equal);
-  cloog_int_clear(factor_vector);
-  cloog_int_clear(factor_equal);
-  
-  return simplified ;
-}
-
-
-/**
- * cloog_constraint_set_simplify function:
- * this function simplify all constraints inside the matrix "matrix" thanks to
- * an equality matrix "equal" that gives for some elements of the affine
- * constraint an equality with other elements, preferably constants.
- * For instance, if a row of the matrix contains i+j+3>=0 and the equality
- * matrix gives i=n and j=2, the constraint is simplified to n+3>=0. The
- * simplified constraints are returned back inside a new simplified matrix.
- * - matrix is the set of constraints to simplify,
- * - equal is the matrix of equalities,
- * - level is a level we don't want to simplify (-1 if none),
- * - nb_par is the number of parameters of the program.
- **
- * - November 4th 2005: first version.
- */
-CloogConstraintSet *cloog_constraint_set_simplify(CloogConstraintSet *constraints,
-	CloogEqualities *equal, int level, int nb_par)
-{ int i, j, k ;
-	struct cloog_vec *vector;
-  CloogMatrix *simplified;
-  CloogMatrix *matrix = &constraints->M;
-  
-  if (matrix == NULL)
-  return NULL ;
-  
-  /* The simplified matrix is such that each row has been simplified thanks
-   * tho the "equal" matrix. We allocate the memory for the simplified matrix,
-   * then for each row of the original matrix, we compute the simplified
-   * vector and we copy its content into the according simplified row.
-   */
-  simplified = cloog_matrix_alloc(matrix->NbRows, matrix->NbColumns);
-  for (i=0;i<matrix->NbRows;i++)
-  { vector = cloog_equal_vector_simplify(equal, matrix->p[i],
-					  matrix->NbColumns, level, nb_par);
-    for (j=0;j<matrix->NbColumns;j++)
-    cloog_int_set(simplified->p[i][j], vector->p[j]);
-    
-    cloog_vec_free(vector);
-  }
-  
-  /* After simplification, it may happen that few constraints are the same,
-   * we remove them here by replacing them with 0=0 constraints.
-   */
-  for (i=0;i<simplified->NbRows;i++)
-  for (j=i+1;j<simplified->NbRows;j++)
-  { for (k=0;k<simplified->NbColumns;k++)
-    if (cloog_int_ne(simplified->p[i][k],simplified->p[j][k]))
-    break ;
-    
-    if (k == matrix->NbColumns)
-    { for (k=0;k<matrix->NbColumns;k++)
-        cloog_int_set_si(simplified->p[j][k],0);
-    }
-  }
-  
-  return cloog_constraint_set_from_cloog_matrix(simplified);
-}
-
-
-/**
- * Return clast_expr corresponding to the variable "level" (1 based) in
- * the given constraint.
- */
-struct clast_expr *cloog_constraint_variable_expr(CloogConstraint *constraint,
-	int level, CloogNames *names)
-{
-	int total_dim, nb_iter;
-	const char *name;
-
-	total_dim = cloog_constraint_total_dimension(constraint);
-	nb_iter = total_dim - names->nb_parameters;
-
-	if (level <= nb_iter)
-		name = cloog_names_name_at_level(names, level);
-	else
-		name = names->parameters[level - (nb_iter+1)] ;
-
-	return &new_clast_name(name)->expr;
-}
-
-
-/**
- * Return true if constraint c involves variable v (zero-based).
- */
-int cloog_constraint_involves(CloogConstraint *constraint, int v)
-{
-	return !cloog_int_is_zero(constraint->line[0][1+v]);
-}
-
-int cloog_constraint_is_lower_bound(CloogConstraint *constraint, int v)
-{
-	return cloog_int_is_pos(constraint->line[0][1+v]);
-}
-
-int cloog_constraint_is_upper_bound(CloogConstraint *constraint, int v)
-{
-	return cloog_int_is_neg(constraint->line[0][1+v]);
-}
-
-int cloog_constraint_is_equality(CloogConstraint *constraint)
-{
-	return cloog_int_is_zero(constraint->line[0][0]);
-}
-
-void cloog_constraint_clear(CloogConstraint *constraint)
-{
-	int k;
-
-	for (k = 1; k <= constraint->set->M.NbColumns - 2; k++)
-		cloog_int_set_si(constraint->line[0][k], 0);
-}
-
-CloogConstraintSet *cloog_constraint_set_drop_constraint(
-	CloogConstraintSet *constraints, CloogConstraint *constraint)
-{
-	cloog_constraint_clear(constraint);
-	return constraints;
-}
-
-void cloog_constraint_coefficient_get(CloogConstraint *constraint,
-			int var, cloog_int_t *val)
-{
-	cloog_int_set(*val, constraint->line[0][1+var]);
-}
-
-void cloog_constraint_coefficient_set(CloogConstraint *constraint,
-			int var, cloog_int_t val)
-{
-	cloog_int_set(constraint->line[0][1+var], val);
-}
-
-void cloog_constraint_constant_get(CloogConstraint *constraint, cloog_int_t *val)
-{
-	cloog_int_set(*val, constraint->line[0][constraint->set->M.NbColumns-1]);
-}
-
-/**
- * Copy the coefficient of constraint c into dst in PolyLib order,
- * i.e., first the coefficients of the variables, then the coefficients
- * of the parameters and finally the constant.
- */
-void cloog_constraint_copy_coefficients(CloogConstraint *constraint,
-					cloog_int_t *dst)
-{
-	cloog_seq_cpy(dst, constraint->line[0]+1, constraint->set->M.NbColumns-1);
-}
-
-CloogConstraint *cloog_constraint_invalid(void)
-{
-	return NULL;
-}
-
-int cloog_constraint_is_valid(CloogConstraint *constraint)
-{
-	return constraint != NULL;
-}
-
-
-/**
- * Check whether there is any need for the constraint "upper" on
- * "level" to get reduced.
- * Yes.
- */
-int cloog_constraint_needs_reduction(CloogConstraint *upper, int level)
-{
-	return 1;
-}
-
-
-/**
- * Create a CloogConstraintSet containing enough information to perform
- * a reduction on the upper equality (in this case lower is an invalid
- * CloogConstraint) or the pair of inequalities upper and lower
- * from within insert_modulo_guard.
- * In the PolyLib backend, we return a CloogConstraintSet containting only
- * the upper bound.  The reduction will not change the stride so there
- * will be no need to recompute the bound on the modulo expression.
- */
-CloogConstraintSet *cloog_constraint_set_for_reduction(CloogConstraint *upper,
-	 CloogConstraint *lower)
-{
-	CloogConstraintSet *set;
-
-	set = cloog_constraint_set_from_cloog_matrix(
-		cloog_matrix_alloc(1, upper->set->M.NbColumns));
-	cloog_seq_cpy(set->M.p[0], upper->line[0], set->M.NbColumns);
-	return set;
-}
-
-
-/* Computes x, y and g such that g = gcd(a,b) and a*x+b*y = g */
-static void Euclid(cloog_int_t a, cloog_int_t b,
-			cloog_int_t *x, cloog_int_t *y, cloog_int_t *g)
-{
-    cloog_int_t c, d, e, f, tmp;
-
-    cloog_int_init(c);
-    cloog_int_init(d);
-    cloog_int_init(e);
-    cloog_int_init(f);
-    cloog_int_init(tmp);
-    cloog_int_abs(c, a);
-    cloog_int_abs(d, b);
-    cloog_int_set_si(e, 1);
-    cloog_int_set_si(f, 0);
-    while (cloog_int_is_pos(d)) {
-	cloog_int_tdiv_q(tmp, c, d);
-	cloog_int_mul(tmp, tmp, f);
-	cloog_int_sub(e, e, tmp);
-	cloog_int_tdiv_q(tmp, c, d);
-	cloog_int_mul(tmp, tmp, d);
-	cloog_int_sub(c, c, tmp);
-	cloog_int_swap(c, d);
-	cloog_int_swap(e, f);
-    }
-    cloog_int_set(*g, c);
-    if (cloog_int_is_zero(a))
-	cloog_int_set_si(*x, 0);
-    else if (cloog_int_is_pos(a))
-	cloog_int_set(*x, e);
-    else cloog_int_neg(*x, e);
-    if (cloog_int_is_zero(b))
-	cloog_int_set_si(*y, 0);
-    else {
-	cloog_int_mul(tmp, a, *x);
-	cloog_int_sub(tmp, c, tmp);
-	cloog_int_divexact(*y, tmp, b);
-    }
-    cloog_int_clear(c);
-    cloog_int_clear(d);
-    cloog_int_clear(e);
-    cloog_int_clear(f);
-    cloog_int_clear(tmp);
-}
-
-/**
- * Reduce the modulo guard expressed by "contraints" using equalities
- * found in outer nesting levels (stored in "equal").
- * The modulo guard may be an equality or a pair of inequalities.
- * In case of a pair of inequalities, "constraints" only contains the
- * upper bound and *bound contains the bound on the
- * corresponding modulo expression.  The bound is left untouched by
- * this function.
- */
-CloogConstraintSet *cloog_constraint_set_reduce(CloogConstraintSet *constraints,
-	int level, CloogEqualities *equal, int nb_par, cloog_int_t *bound)
-{
-  int i, j, k, len, len2, nb_iter;
-  struct cloog_vec *line_vector2;
-  cloog_int_t *line, *line2, val, x, y, g;
-
-  len = constraints->M.NbColumns;
-  len2 = cloog_equal_total_dimension(equal) + 2;
-  nb_iter = len - 2 - nb_par;
-
-  cloog_int_init(val);
-  cloog_int_init(x);
-  cloog_int_init(y);
-  cloog_int_init(g);
-
-  line_vector2 = cloog_vec_alloc(len2);
-  line2 = line_vector2->p;
-
-  line = constraints->M.p[0];
-  if (cloog_int_is_pos(line[level]))
-    cloog_seq_neg(line+1, line+1, len-1);
-  cloog_int_neg(line[level], line[level]);
-  assert(cloog_int_is_pos(line[level]));
-
-  for (i = nb_iter; i >= 1; --i) {
-    if (i == level)
-      continue;
-    cloog_int_fdiv_r(line[i], line[i], line[level]);
-    if (cloog_int_is_zero(line[i]))
-      continue;
-
-    /* Look for an earlier variable that is also a multiple of line[level]
-     * and check whether we can use the corresponding affine expression
-     * to "reduce" the modulo guard, where reduction means that we eliminate
-     * a variable, possibly at the expense of introducing other variables
-     * with smaller index.
-     */
-    for (j = level-1; j >= 0; --j) {
-      CloogConstraint *equal_constraint;
-      if (cloog_equal_type(equal, j+1) != EQTYPE_EXAFFINE)
-	continue;
-      equal_constraint = cloog_equal_constraint(equal, j);
-      cloog_constraint_coefficient_get(equal_constraint, j, &val);
-      if (!cloog_int_is_divisible_by(val, line[level])) {
-	cloog_constraint_release(equal_constraint);
-	continue;
-      }
-      cloog_constraint_coefficient_get(equal_constraint, i-1, &val);
-      if (cloog_int_is_divisible_by(val, line[level])) {
-	cloog_constraint_release(equal_constraint);
-	continue;
-      }
-      for (k = j; k > i; --k) {
-	cloog_constraint_coefficient_get(equal_constraint, k-1, &val);
-	if (cloog_int_is_zero(val))
-	  continue;
-	if (!cloog_int_is_divisible_by(val, line[level]))
-	  break;
-      }
-      if (k > i) {
-	 cloog_constraint_release(equal_constraint);
-	 continue;
-      }
-      cloog_constraint_coefficient_get(equal_constraint, i-1, &val);
-      Euclid(val, line[level], &x, &y, &g);
-      if (!cloog_int_is_divisible_by(val, line[i])) {
-	cloog_constraint_release(equal_constraint);
-	continue;
-      }
-      cloog_int_divexact(val, line[i], g);
-      cloog_int_neg(val, val);
-      cloog_int_mul(val, val, x);
-      cloog_int_set_si(y, 1);
-      /* Add (equal->p[j][i])^{-1} * line[i] times the equality */
-      cloog_constraint_copy_coefficients(equal_constraint, line2+1);
-      cloog_seq_combine(line+1, y, line+1, val, line2+1, i);
-      cloog_seq_combine(line+len-nb_par-1, y, line+len-nb_par-1,
-					   val, line2+len2-nb_par-1, nb_par+1);
-      cloog_constraint_release(equal_constraint);
-      break;
-    }
-  }
-
-  cloog_vec_free(line_vector2);
-
-  cloog_int_clear(val);
-  cloog_int_clear(x);
-  cloog_int_clear(y);
-  cloog_int_clear(g);
-
-  /* Make sure the line is not inverted again in the calling function. */
-  cloog_int_neg(line[level], line[level]);
-
-  return constraints;
-}
-
-CloogConstraint *cloog_constraint_first(CloogConstraintSet *constraints)
-{
-	CloogConstraint *c;
-	if (constraints->M.NbRows == 0)
-		return cloog_constraint_invalid();
-	c = ALLOC(CloogConstraint);
-	c->set = constraints;
-	c->line = &constraints->M.p[0];
-	return c;
-}
-
-CloogConstraint *cloog_constraint_next(CloogConstraint *constraint)
-{
-	constraint->line++;
-	if (constraint->line == constraint->set->M.p + constraint->set->M.NbRows) {
-		cloog_constraint_release(constraint);
-		return NULL;
-	}
-	return constraint;
-}
-
-CloogConstraint *cloog_constraint_copy(CloogConstraint *constraint)
-{
-	CloogConstraint *c = ALLOC(CloogConstraint);
-	c->set = constraint->set;
-	c->line = constraint->line;
-	return c;
-}
-
-void cloog_constraint_release(CloogConstraint *constraint)
-{
-	free(constraint);
-}
-
-int cloog_constraint_set_foreach_constraint(CloogConstraintSet *constraints,
-	int (*fn)(CloogConstraint *constraint, void *user), void *user)
-{
-	CloogConstraint *c;
-
-	for (c = cloog_constraint_first(constraints);
-	     cloog_constraint_is_valid(c); c = cloog_constraint_next(c))
-		if (fn(c, user) < 0) {
-			cloog_constraint_release(c);
-			return -1;
-		}
-
-	return 0;
-}
-
-CloogConstraint *cloog_equal_constraint(CloogEqualities *equal, int j)
-{
-	CloogConstraint *c = ALLOC(CloogConstraint);
-	c->set = equal->constraints;
-	c->line = &equal->constraints->M.p[j];
-	return c;
-}
diff --git a/cloog-0.17.0/source/mp_get_memory_functions.c b/cloog-0.17.0/source/mp_get_memory_functions.c
deleted file mode 100644
index e14e336..0000000
--- a/cloog-0.17.0/source/mp_get_memory_functions.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <gmp.h>
-
-void mp_get_memory_functions(
-		void *(**alloc_func_ptr) (size_t),
-		void *(**realloc_func_ptr) (void *, size_t, size_t),
-		void (**free_func_ptr) (void *, size_t))
-{
-	if (alloc_func_ptr)
-		*alloc_func_ptr = __gmp_allocate_func;
-	if (realloc_func_ptr)
-		*realloc_func_ptr = __gmp_reallocate_func;
-	if (free_func_ptr)
-		*free_func_ptr = __gmp_free_func;
-}
diff --git a/cloog-0.17.0/source/names.c b/cloog-0.17.0/source/names.c
deleted file mode 100644
index 20cadcc..0000000
--- a/cloog-0.17.0/source/names.c
+++ /dev/null
@@ -1,526 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                             names.c                               **
-    **-------------------------------------------------------------------**
-    **                  First version: august 1st 2002                   **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2002-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-/* CAUTION: the english used for comments is probably the worst you ever read,
- *          please feel free to correct and improve it !
- */
-
-
-# include <stdlib.h>
-# include <stdio.h>
-# include <ctype.h>
-# include "../include/cloog/cloog.h"
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-
-
-/**
- * cloog_names_print function:
- * this function is a human-friendly way to display the CloogNames data
- * structure, it shows all the different fields and includes an indentation
- * level (level) in order to work with others print_structure functions.
- * - July 1st 2005: first version based on the old cloog_names_print function,
- *                  it was the first modification in this file since two years !
- */
-void cloog_names_print_structure(FILE * file, CloogNames * names, int level)
-{ int i ;
-  
-  /* Go to the right level. */
-  for (i=0; i<level; i++)
-  fprintf(file,"|\t") ;
-  
-  if (names != NULL)
-  { fprintf(file,"+-- CloogNames\n") ;
-    
-    /* A blank line. */
-    for (i=0; i<=level+1; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"\n") ;
-
-    /* Print the scalar dimension number. */
-    for (i=0; i<=level; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"Scalar dimension number ---: %d\n",names->nb_scalars) ;
-
-    /* A blank line. */
-    for (i=0; i<=level+1; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"\n") ;
-
-    /* Print the scalar iterators. */
-    for (i=0; i<=level; i++)
-    fprintf(file,"|\t") ;
-    if (names->nb_scalars > 0)
-    { fprintf(file,"+-- Scalar iterator strings:") ;
-      for (i=0;i<names->nb_scalars;i++)
-      fprintf(file," %s",names->scalars[i]) ;
-      fprintf(file,"\n") ;
-    }
-    else
-    fprintf(file,"+-- No scalar string\n") ;
-
-    /* A blank line. */
-    for (i=0; i<=level+1; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"\n") ;
-
-    /* Print the scattering dimension number. */
-    for (i=0; i<=level; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"Scattering dimension number: %d\n",names->nb_scattering) ;
-
-    /* A blank line. */
-    for (i=0; i<=level+1; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"\n") ;
-
-    /* Print the scattering iterators. */
-    for (i=0; i<=level; i++)
-    fprintf(file,"|\t") ;
-    if (names->nb_scattering > 0)
-    { fprintf(file,"+-- Scattering strings ----:") ;
-      for (i=0;i<names->nb_scattering;i++)
-      fprintf(file," %s",names->scattering[i]) ;
-      fprintf(file,"\n") ;
-    }
-    else
-    fprintf(file,"+-- No scattering string\n") ;
-
-    /* A blank line. */
-    for (i=0; i<=level+1; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"\n") ;
-    
-    /* Print the iterator number. */
-    for (i=0; i<=level; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"Iterator number -----------: %d\n",names->nb_iterators) ;
-
-    /* A blank line. */
-    for (i=0; i<=level+1; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"\n") ;
-
-    /* Print the iterators. */
-    for (i=0; i<=level; i++)
-    fprintf(file,"|\t") ;
-    if (names->nb_iterators > 0)
-    { fprintf(file,"+-- Iterator strings ------:") ;
-      for (i=0;i<names->nb_iterators;i++)
-      fprintf(file," %s",names->iterators[i]) ;
-      fprintf(file,"\n") ;
-    }
-    else
-    fprintf(file,"+-- No iterators\n") ;
-
-    /* A blank line. */
-    for (i=0; i<=level+1; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"\n") ;
-    
-    /* Print the parameter number. */
-    for (i=0; i<=level; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"Parameter number ----------: %d\n",names->nb_parameters) ;
-
-    /* A blank line. */
-    for (i=0; i<=level+1; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"\n") ;
-
-    /* Print the parameters. */
-    for (i=0; i<=level; i++)
-    fprintf(file,"|\t") ;
-    if (names->nb_parameters > 0)
-    { fprintf(file,"+-- Parameter strings -----:") ;
-      for (i=0;i<names->nb_parameters;i++)
-      fprintf(file," %s",names->parameters[i]) ;
-      fprintf(file,"\n") ;
-    }
-    else
-    fprintf(file,"No parameters\n") ;
-    
-  }
-  else
-  fprintf(file,"+-- No CloogNames\n") ;
-  fprintf(file, "Number of active references: %d\n", names->references);
-}
-
-
-/**
- * cloog_names_print function:
- * This function prints the content of a CloogNames structure (names) into a
- * file (file, possibly stdout).
- * - July 1st 2005: Now this function is only a frontend to
- *                  cloog_program_print_structure, with a quite better
- *                  human-readable representation.
- */
-void cloog_names_print(FILE * file, CloogNames * names)
-{ cloog_names_print_structure(file,names,0) ;
-}
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-
-
-/**
- * cloog_names_free function:
- * This function decrements the number of active references to 
- * a CloogNames structure and frees the allocated memory for this structure
- * if the count drops to zero.
- */
-void cloog_names_free(CloogNames * names)
-{ int i ;
-
-  if (--names->references)
-    return;
-
-  if (names->scalars != NULL)
-  { for (i=0;i<names->nb_scalars;i++)
-    free(names->scalars[i]) ;
-    free(names->scalars) ;
-  }
-   
-  if (names->scattering != NULL)
-  { for (i=0;i<names->nb_scattering;i++)
-    free(names->scattering[i]) ;
-    free(names->scattering) ;
-  }
-   
-  if (names->iterators != NULL)
-  { for (i=0;i<names->nb_iterators;i++)
-    free(names->iterators[i]) ;
-    free(names->iterators) ;
-  }
-   
-  if (names->parameters != NULL)
-  { for (i=0;i<names->nb_parameters;i++)
-    free(names->parameters[i]) ;
-    free(names->parameters) ;
-  }
-  free(names) ;
-}
-
-
-/**
- * cloog_names_copy function:
- * As usual in CLooG, "copy" means incrementing the reference count.
- */ 
-CloogNames *cloog_names_copy(CloogNames *names)
-{
-  names->references++;
-  return names;
-}
-
-
-/******************************************************************************
- *                              Reading functions                             *
- ******************************************************************************/
-
-
-/**
- * cloog_names_read_strings function:
- * This function reads names data from a file (file, possibly stdin). It first
- * reads the naming option to know if whether it can read the names from the
- * file.  If not, NULL is returned.  Otherwise, the names are stored
- * into an array of strings, and a pointer to this array is returned.
- * - nb_items is the number of names the function will have to read if the
- *   naming option is set to read.
- */
-char ** cloog_names_read_strings(FILE *file, int nb_items)
-{ int i, option, n ;
-  char s[MAX_STRING], str[MAX_STRING], * c, **names = NULL;
-
-  /* We first read name option. */
-  while (fgets(s,MAX_STRING,file) == 0) ;
-  while ((*s=='#' || *s=='\n') || (sscanf(s," %d",&option)<1))
-  fgets(s,MAX_STRING,file) ;
-  
-  /* If there is no item to read, then return NULL. */
-  if (nb_items == 0)
-  return NULL ;
-  
-  /* If option is to read them in the file, then we do it and put them into
-   * the array.
-   */
-  if (option)
-  { /* Memory allocation. */
-    names = (char **)malloc(nb_items*sizeof(char *)) ;
-    if (names == NULL) 
-      cloog_die("memory overflow.\n");
-    for (i=0;i<nb_items;i++)
-    { names[i] = (char *)malloc(MAX_NAME*sizeof(char)) ;
-      if (names[i] == NULL) 
-	cloog_die("memory overflow.\n");
-    }
-    
-    do  /* Skip the comments, spaces and empty lines... */
-    { c = fgets(s,MAX_STRING,file) ;
-      while ((c != NULL) && isspace(*c) && (*c != '\n'))
-      c++ ;
-    }
-    while (c != NULL && (*c == '#' || *c == '\n'));
-    
-    if (c == NULL) 
-      cloog_die("no names in input file.\n");
-    for (i=0;i<nb_items;i++) 
-    { /* All names must be on the same line. */
-      while (isspace(*c))
-      c++ ;
-      if (!*c || *c == '#' || *c == '\n')
-        cloog_die("not enough names in input file.\n");
-      /* n is strlen(str). */
-      if (sscanf(c,"%s%n",str,&n) == 0) 
-        cloog_die("no names in input file.\n");
-      sscanf(str,"%s",names[i]) ;
-      c += n ;
-    }
-  }
-
-  return names ;
-}
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-
-
-/**
- * cloog_names_malloc function:
- * This function allocates the memory space for a CloogNames structure and
- * sets its fields with default values. Then it returns a pointer to the
- * allocated space.
- * - November 21th 2005: first version.
- */
-CloogNames * cloog_names_malloc()
-{ CloogNames * names ;
-  
-  /* Memory allocation for the CloogNames structure. */
-  names = (CloogNames *)malloc(sizeof(CloogNames)) ;
-  if (names == NULL) 
-    cloog_die("memory overflow.\n");
-  
-  /* We set the various fields with default values. */
-  names->nb_scalars    = 0 ;
-  names->nb_scattering = 0 ;
-  names->nb_iterators  = 0 ;
-  names->nb_parameters = 0 ;
-  names->scalars       = NULL ;
-  names->scattering    = NULL ;
-  names->iterators     = NULL ;
-  names->parameters    = NULL ;
-  names->references    = 1;
-  
-  return names ;
-}  
-
-
-/**
- * cloog_names_alloc function:
- * This function allocates the memory space for a CloogNames structure and
- * sets its fields with those given as input. Then it returns a pointer to the
- * allocated space.
- * - July       7th 2005: first version.
- * - September 11th 2005: addition of both scalar and scattering informations.
- * - November  21th 2005: use of cloog_names_malloc.
- */
-CloogNames * cloog_names_alloc()
-{ CloogNames * names ;
-
-  /* Memory allocation for the CloogNames structure. */
-  names = cloog_names_malloc() ;
-  
-  names->nb_scalars    = 0;
-  names->nb_scattering = 0;
-  names->nb_iterators  = 0;
-  names->nb_parameters = 0;
-  names->scalars       = NULL;
-  names->scattering    = NULL;
-  names->iterators     = NULL;
-  names->parameters    = NULL;
-  
-  return names ;
-}
-
-
-/**
- * cloog_names_generate_items function:
- * This function returns a pointer to an array of strings with entries set
- * based on the function's parameters.
- * - nb_items will be the number of entries in the string array.
- * - prefix is the name prefix of each item or NULL.
- *   If not NULL, then the remainder of the name will be an integer
- *   in the range [0, nb_items-1].
- * - first_item is the name of the first item (if prefix == NULL),
- *   the nb_items-1 following items will be the nb_items-1
- *   following letters in ASCII code.
- **
- * - September 9th 2002 : first version, extracted from cloog_names_generate.
- */
-char ** cloog_names_generate_items(int nb_items, char * prefix, char first_item)
-{ int i ;
-  char ** names ;
-  
-  if (nb_items == 0)
-  return NULL ;
-    
-  names = (char **)malloc(nb_items*sizeof(char *)) ;
-  if (names == NULL) 
-    cloog_die("memory overflow.\n");
-  for (i=0;i<nb_items;i++)
-  { names[i] = (char *)malloc(MAX_NAME*sizeof(char)) ;
-    if (names[i] == NULL) 
-      cloog_die("memory overflow.\n");
-    if (prefix == NULL)
-    sprintf(names[i],"%c",first_item+i) ;
-    else
-      sprintf(names[i], "%s%d", prefix, 1+i);
-  }
-  
-  return names ;
-}
-
-
-/**
- * cloog_names_generate function:
- * This function returns a pointer to a CloogNames structure with fields set
- * thanks to the function's parameters.
- * - nb_scalars will be the number of scalar dimensions in the structure.
- * - nb_scattering will be the number of scattering dimensions in the structure.
- * - nb_iterators will be the number of iterators in the CloogNames structure.
- * - nb_parameters will be the number of parameters in the CloogNames structure.
- * - first_s is the name of the first scalar iterator, the nb_scalars-1
- *   following iterators will be the nb_scalars-1 following letters in ASCII.
- * - first_t is the name of the first scattering iterator, the nb_scattering-1
- *   following iterators will be the nb_scattering-1 following letters in ASCII.
- * - first_i is the name of the first iterator, the nb_iterators-1 following
- *   iterators will be the nb_iterators-1 following letters in ASCII code.
- * - first_i is the name of the first iterator, the nb_iterators-1 following
- *   iterators will be the nb_iterators-1 following letters in ASCII code.
- * - first_p is the name of the first parameter, the nb_parameters-1 following
- *   parameters will be the nb_parameters-1 following letters in ASCII code.
- **
- * - July       1st 2002 : first version.
- * - September  9th 2002 : use of cloog_names_generate_items.
- * - September 11th 2005 : addition of both scalar and scattering informations.
- */
-CloogNames * cloog_names_generate(
-     int nb_scalars, int nb_scattering, int nb_iterators, int nb_parameters,
-     char first_s,   char first_t,      char first_i,     char first_p)
-{ CloogNames * names ;
-
-  names = (CloogNames *)malloc(sizeof(CloogNames)) ;
-  if (names == NULL) 
-    cloog_die("memory overflow.\n");
-  
-  names->nb_scalars    = nb_scalars ;
-  names->nb_scattering = nb_scattering ;
-  names->nb_parameters = nb_parameters ;
-  names->nb_iterators  = nb_iterators ;
-  names->scalars       = cloog_names_generate_items(nb_scalars,   NULL,first_s);
-  names->scattering    = cloog_names_generate_items(nb_scattering,NULL,first_t);
-  names->parameters    = cloog_names_generate_items(nb_parameters,NULL,first_p);
-  names->iterators     = cloog_names_generate_items(nb_iterators, NULL,first_i);
-
-  return names ;
-}
-
-
-/* Lastly we update the CLoogNames structure: the iterators corresponding to
- * scalar dimensions have to be removed since these dimensions have been
- * erased and do not need to be print. We copy all the iterator names except
- * the scalar ones in a new string array.
- * - September 12th 2005: first version. 
- */
-void cloog_names_scalarize(CloogNames * names, int nb_scattdims, int * scaldims)
-{ int  nb_scalars, nb_scattering, i, current_scalar, current_scattering ;
-  char ** scalars, ** scattering ;
-
-  if (!nb_scattdims || (scaldims == NULL))
-  return ;
-  
-  nb_scalars = 0 ;
-  for (i=0;i<nb_scattdims;i++)
-  if (scaldims[i])
-  nb_scalars  ++ ;
-
-  if (!nb_scalars)
-  return ;
-  
-  nb_scattering = names->nb_scattering - nb_scalars ;
-  scattering = (char **)malloc(nb_scattering * sizeof(char *)) ;
-  if (scattering == NULL) 
-    cloog_die("memory overflow.\n");
-  scalars = (char **)malloc(nb_scalars * sizeof(char *)) ;
-  if (scalars == NULL) 
-    cloog_die("memory overflow.\n");
-  
-  current_scalar = 0 ;
-  current_scattering  = 0 ;
-  for (i=0;i<nb_scattdims;i++)
-  { if (!scaldims[i])
-    { scattering[current_scattering] = names->scattering[i] ;
-      current_scattering ++ ;
-    }
-    else
-    { scalars[current_scalar] = names->scattering[i] ;
-      current_scalar ++ ;
-    }
-  }
-  
-  free(names->scattering) ;
-  names->scattering    = scattering ;
-  names->scalars       = scalars ;
-  names->nb_scattering = nb_scattering ;
-  names->nb_scalars    = nb_scalars ;
-}
-
-/**
- * Return the name at a given level (starting at one).
- * May be a scattering dimension or an iterator of the original domain.
- */
-const char *cloog_names_name_at_level(CloogNames *names, int level)
-{
-  if (level <= names->nb_scattering)
-    return names->scattering[level - 1];
-  else
-    return names->iterators[level - names->nb_scattering - 1];
-}
diff --git a/cloog-0.17.0/source/options.c b/cloog-0.17.0/source/options.c
deleted file mode 100644
index ca7f2fa..0000000
--- a/cloog-0.17.0/source/options.c
+++ /dev/null
@@ -1,521 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                            options.c                              **
-    **-------------------------------------------------------------------**
-    **                  First version: april 19th 2003                   **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-
-
-#include <stdarg.h>
-# include <stdlib.h>
-# include <stdio.h>
-# include <string.h>
-# include "../include/cloog/cloog.h"
-
-#ifdef OSL_SUPPORT
-#include <osl/scop.h>
-#endif
-
-
-/******************************************************************************
- *                          Error reporting functions                         *
- ******************************************************************************/
-
-void cloog_vmsg(CloogOptions *options, enum cloog_msg_type type,
-		const char *msg, va_list ap)
-{
-  const char *type_msg;
-
-  if (options && options->quiet &&
-      (type == CLOOG_WARNING || type == CLOOG_INFO))
-    return;
-
-  switch(type) {
-  case CLOOG_WARNING:
-	type_msg = "WARNING";
-	break;
-  case CLOOG_INFO:
-	type_msg = "INFO";
-	break;
-  case CLOOG_ERROR:
-  default:
-	type_msg = "ERROR";
-	break;
-  }
-  fprintf(stderr, "[CLooG] %s: ", type_msg);
-  vfprintf(stderr, msg, ap);
-}
-
-/**
- * Print message to stderr.
- * @param msg printf format string
- */
-void cloog_msg(CloogOptions *options, enum cloog_msg_type type,
-		const char *msg, ...)
-{
-  va_list args;
-
-  va_start(args, msg);
-  cloog_vmsg(options, type, msg, args);
-  va_end(args);
-}
-
-/**
- * Print error message to stderr and exit.
- * @param msg printf format string
- */
-void cloog_die(const char *msg, ...)
-{
-  va_list args;
-
-  va_start(args, msg);
-  cloog_vmsg(NULL, CLOOG_ERROR, msg, args);
-  va_end(args);
-  exit(1);
-}
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-
-
-/**
- * cloog_option_print function:
- * This function prints the content of a CloogOptions structure (program) into
- * a file (foo, possibly stdout).
- * - April 19th 2003: first version.
- */
-void cloog_options_print(FILE * foo, CloogOptions * options)
-{ fprintf(foo,"Options:\n") ;
-  fprintf(foo,"OPTIONS FOR LOOP GENERATION\n") ;
-  fprintf(foo,"l           = %3d,\n",options->l) ;
-  fprintf(foo,"f           = %3d,\n",options->f) ;
-  fprintf(foo,"stop        = %3d,\n",options->stop) ;
-  fprintf(foo,"strides     = %3d,\n",options->strides) ;
-  fprintf(foo,"sh          = %3d,\n",options->sh);
-  fprintf(foo,"OPTIONS FOR PRETTY PRINTING\n") ;
-  fprintf(foo,"esp         = %3d,\n",options->esp) ;
-  fprintf(foo,"fsp         = %3d,\n",options->fsp) ;
-  fprintf(foo,"otl         = %3d.\n",options->otl) ;
-  fprintf(foo,"block       = %3d.\n",options->block) ;
-  fprintf(foo,"compilable  = %3d.\n",options->compilable) ;
-  fprintf(foo,"callable    = %3d.\n",options->callable) ;
-  fprintf(foo,"MISC OPTIONS\n") ;
-  fprintf(foo,"name        = %3s.\n", options->name);
-  fprintf(foo,"openscop    = %3d.\n", options->openscop);
-  if (options->scop != NULL)
-    fprintf(foo,"scop        = (present but not printed).\n");
-  else
-    fprintf(foo,"scop        = NULL.\n");
-  fprintf(foo,"UNDOCUMENTED OPTIONS FOR THE AUTHOR ONLY\n") ;
-  fprintf(foo,"leaks       = %3d.\n",options->leaks) ;
-  fprintf(foo,"backtrack   = %3d.\n",options->backtrack);
-  fprintf(foo,"override    = %3d.\n",options->override) ;
-  fprintf(foo,"structure   = %3d.\n",options->structure) ;
-  fprintf(foo,"noscalars   = %3d.\n",options->noscalars) ;
-  fprintf(foo,"noblocks    = %3d.\n",options->noblocks) ;
-  fprintf(foo,"nosimplify  = %3d.\n",options->nosimplify) ;
-}
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-
-
-/**
- * cloog_options_free function:
- * This function frees the allocated memory for a CloogOptions structure.
- * - April 19th 2003: first version.
- */
-void cloog_options_free(CloogOptions *options)
-{
-#ifdef OSL_SUPPORT
-  if (options->scop != NULL) {
-    osl_scop_free(options->scop);
-  }
-#endif
-  free(options);
-}
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-
-
-/**
- * cloog_options_help function:
- * This function displays the quick help when the user set the option -help
- * while calling cloog. Prints are cutted to respect the 509 characters
- * limitation of the ISO C 89 compilers.
- * - August 5th 2002: first version.
- */
-void cloog_options_help()
-{ printf(
-  "Usage: cloog [ options | file ] ...\n"
-  "Options for code generation:\n"
-  "  -l <depth>            Last loop depth to optimize (-1: infinity)\n"
-  "                        (default setting: -1).\n"
-  "  -f <depth>            First loop depth to start loop separation (-1: "
-  "infinity)\n                        (default setting:  1).\n") ;
-  printf(
-  "  -stop <depth>         Loop depth to stop code generation (-1: infinity)"
-  "\n                        (default setting: -1).\n"
-  "  -strides <boolean>    Handle non-unit strides (1) or not (0)\n"
-  "                        (default setting:  0).\n"
-  "  -first-unroll <depth> First loop dimension to unroll (-1: no unrolling)\n");
-  printf(
-  "\nOptions for pretty printing:\n"
-  "  -otl <boolean>        Simplify loops running one time (1) or not (0)\n"
-  "                        (default setting:  1).\n") ;
-  printf(
-  "  -esp <boolean>        Allow complex equalities spreading (1) or not (0)\n"
-  "                        (default setting:  0).\n");
-  printf(
-  "  -fsp <level>          First level to begin the spreading\n"
-  "                        (default setting:  1).\n"
-  "  -block <boolean>      Make a new statement block per iterator in C\n"
-  "                        programs (1) or not (0) (default setting: 0).\n") ;
-  printf(
-  "  -compilable <number>  Compilable code by using preprocessor (not 0) or" 
-  "\n                        not (0), number being the value of the parameters"
-  "\n                        (default setting:  0).\n"
-  "  -callable <boolean>   Testable code by using preprocessor (not 0) or" 
-  "\n                        not (0) (default setting:  0).\n");
-  printf(
-  "\nGeneral options:\n"
-  "  -o <output>           Name of the output file; 'stdout' is a special\n"
-  "                        value: when used, output is standard output\n"
-  "                        (default setting: stdout).\n"
-#ifdef OSL_SUPPORT
-  "  -openscop             Input file has OpenScop format.\n"
-#endif
-  "  -v, --version         Display the version information (and more).\n"
-  "  -q, --quiet           Don't print any informational messages.\n"
-  "  -h, --help            Display this information.\n\n") ;
-  printf(
-  "The special value 'stdin' for 'file' makes CLooG to read data on\n"
-  "standard input.\n\n"
-  "For bug reporting or any suggestions, please send an email to the author\n"
-  "<cedric.bastoul@inria.fr>.\n") ;
-}
-
-
-/**
- * cloog_options_version function:
- * This function displays some version informations when the user set the
- * option -version while calling cloog. Prints are cutted to respect the 509
- * characters limitation of the ISO C 89 compilers.
- * - August 5th 2002: first version.
- */
-void cloog_options_version()
-{ printf("%s       The Chunky Loop Generator\n", cloog_version());
-  printf(
-  "-----\n"
-  "This is a loop generator for scanning Z-polyhedra. It is based on the "
-  "work of\nF. Quillere and C. Bastoul on high level code generation and of "
-  "the PolyLib Team\non polyhedral computation. This program is distributed "
-  "under the terms of the\nGNU Lesser General Public License "
-  "(details at http://www.gnu.org/licenses/lgpl-2.1.html).\n"
-  "-----\n") ;
-  printf(
-  "It would be fair to refer the following paper in any publication "
-  "resulting from\nthe use of this software or its library:\n"
-  "@InProceedings{Bas04,\n"
-  "author    =  {Cedric Bastoul},\n"
-  "title     =  {Code Generation in the Polyhedral Model Is Easier Than You "
-  "Think},\n"
-  "booktitle =  {PACT'13 IEEE International Conference on Parallel "
-  "Architecture\n             and Compilation Techniques},\n"
-  "pages     =  {7--16},\n"
-  "month     =  {september},\n"
-  "year      =  2004,\n"
-  "address   =  {Juan-les-Pins}\n"
-  "}\n"
-  "-----\n"
-  "For any information, please ask the author at "
-  "<cedric.bastoul@inria.fr>.\n") ;
-} 
-
-
-/**
- * cloog_options_set function:
- * This function sets the value of an option thanks to the user's calling line.
- * - option is the value to set,
- * - argc are the elements of the user's calling line,
- * - number is the number of the element corresponding to the considered option,
- *   this function adds 1 to number to pass away the option value.
- **
- * - August 5th 2002: first version.
- * - June 29th 2003: (debug) lack of argument now detected.
- */
-void cloog_options_set(int * option, int argv, char ** argc, int * number)
-{ char ** endptr ;
-  
-  if (*number+1 >= argv)
-    cloog_die("an option lacks of argument.\n");
-
-  endptr = NULL ;
-  *option = strtol(argc[*number+1],endptr,10) ;
-  if (endptr != NULL)
-    cloog_die("value '%s' for option '%s' is not valid.\n",
-	      argc[*number+1], argc[*number]);
-  *number = *number + 1 ;
-}
-
-
-/**
- * cloog_options_malloc function:
- * This functions allocate the memory space for a CLoogOptions structure and
- * fill its fields with the defaults values. It returns a pointer to the
- * allocated CloogOptions structure.
- * - April    19th 2003: first version.
- * - November 21th 2005: name changed (before it was cloog_options_init).
- */
-CloogOptions *cloog_options_malloc(CloogState *state)
-{ CloogOptions * options ;
-
-  /* Memory allocation for the CloogOptions structure. */
-  options = (CloogOptions *)malloc(sizeof(CloogOptions)) ;
-  if (options == NULL) 
-    cloog_die("memory overflow.\n");
-  
-  options->state = state;
-
-  /* We set the various fields with default values. */
-  /* OPTIONS FOR LOOP GENERATION */
-  options->l           = -1 ;  /* Last level to optimize: infinity. */
-  options->f           =  1 ;  /* First level to optimize: the first. */
-  options->stop        = -1 ;  /* Generate all the code. */
-  options->strides     =  0 ;  /* Generate a code with unit strides. */
-  options->sh	       =  0;   /* Compute actual convex hull. */
-  options->first_unroll = -1;  /* First level to unroll: none. */
-  options->name	       = "";
-  /* OPTIONS FOR PRETTY PRINTING */
-  options->esp         =  1 ;  /* We want Equality SPreading.*/
-  options->fsp         =  1 ;  /* The First level to SPread is the first. */
-  options->otl         =  1 ;  /* We want to fire One Time Loops. */
-  options->block       =  0 ;  /* We don't want to force statement blocks. */
-  options->compilable  =  0 ;  /* No compilable code. */
-  options->callable    =  0 ;  /* No callable code. */
-  options->quiet       =  0;   /* Do print informational messages. */
-  options->save_domains = 0;   /* Don't save domains. */
-  /* MISC OPTIONS */
-  options->language    = CLOOG_LANGUAGE_C; /* The default output language is C. */
-  options->openscop    =  0 ;  /* The input file has not the OpenScop format.*/
-  options->scop        =  NULL;/* No default SCoP.*/
-  /* UNDOCUMENTED OPTIONS FOR THE AUTHOR ONLY */
-  options->leaks       =  0 ;  /* I don't want to print allocation statistics.*/
-  options->backtrack   =  0;   /* Perform backtrack in Quillere's algorithm.*/
-  options->override    =  0 ;  /* I don't want to override CLooG decisions.*/
-  options->structure   =  0 ;  /* I don't want to print internal structure.*/
-  options->noblocks    =  0 ;  /* I do want to make statement blocks.*/
-  options->noscalars   =  0 ;  /* I do want to use scalar dimensions.*/
-  options->nosimplify  =  0 ;  /* I do want to simplify polyhedra.*/
-  
-  return options ;
-}
-
-
-
-/**
- * cloog_options_read function:
- * This functions reads all the options and the input/output files thanks
- * the the user's calling line elements (in argc). It fills a CloogOptions
- * structure and the FILE structure corresponding to input and output files.
- * - August 5th 2002: first version.
- * - April 19th 2003: now in options.c and support of the CloogOptions structure.
- */
-void cloog_options_read(CloogState *state, int argc, char **argv,
-			FILE **input, FILE **output, CloogOptions **options)
-{ int i, infos=0, input_is_set=0 ;
-  
-  /* CloogOptions structure allocation and initialization. */
-  *options = cloog_options_malloc(state);
-  
-  /* The default output is the standard output. */
-  *output = stdout ;
-
-  for (i=1;i<argc;i++)
-  if (argv[i][0] == '-')
-  { if (strcmp(argv[i],"-l")   == 0)
-    cloog_options_set(&(*options)->l,argc,argv,&i) ;
-    else
-    if (strcmp(argv[i],"-f")   == 0)
-    cloog_options_set(&(*options)->f,argc,argv,&i) ;
-    else
-    if (strcmp(argv[i],"-stop")   == 0)
-    cloog_options_set(&(*options)->stop,argc,argv,&i) ;
-    else
-    if (strcmp(argv[i],"-strides")   == 0)
-    cloog_options_set(&(*options)->strides,argc,argv,&i) ;
-    else if (strcmp(argv[i],"-sh")   == 0)
-      cloog_options_set(&(*options)->sh,argc,argv,&i) ;
-    else if (!strcmp(argv[i], "-first-unroll"))
-      cloog_options_set(&(*options)->first_unroll, argc, argv, &i);
-    else
-    if (strcmp(argv[i],"-otl") == 0)
-    cloog_options_set(&(*options)->otl,argc,argv,&i) ;
-    else
-    if (strcmp(argv[i],"-openscop") == 0) {
-#ifdef OSL_SUPPORT
-      (*options)->openscop = 1 ;
-#else
-      cloog_die("CLooG has not been compiled with OpenScop support.\n");
-#endif
-    }
-    else
-    if (strcmp(argv[i],"-esp") == 0)
-    cloog_options_set(&(*options)->esp,argc,argv,&i) ;
-    else
-    if (strcmp(argv[i],"-fsp") == 0)
-    cloog_options_set(&(*options)->fsp,argc,argv,&i) ;
-    else
-    if (strcmp(argv[i],"-block") == 0)
-    cloog_options_set(&(*options)->block,argc,argv,&i) ;
-    else
-    if (strcmp(argv[i],"-compilable") == 0)
-      cloog_options_set(&(*options)->compilable, argc, argv, &i);
-    else if (strcmp(argv[i], "-callable") == 0)
-      cloog_options_set(&(*options)->callable, argc, argv, &i);
-    else
-    if (strcmp(argv[i],"-loopo") == 0) /* Special option for the LooPo team ! */
-    { (*options)->esp   = 0 ;
-      (*options)->block = 1 ;
-    }
-    else
-    if (strcmp(argv[i],"-bipbip") == 0)/* Special option for the author only !*/
-      (*options)->backtrack = 0;
-    else
-    if (strcmp(argv[i],"-leaks") == 0)
-    (*options)->leaks = 1 ;
-    else
-    if (strcmp(argv[i],"-nobacktrack") == 0)
-      (*options)->backtrack = 0;
-    else if (strcmp(argv[i], "-backtrack") == 0)
-      (*options)->backtrack = 1;
-    else
-    if (strcmp(argv[i],"-override") == 0)
-    (*options)->override = 1 ;
-    else
-    if (strcmp(argv[i],"-noblocks") == 0)
-    (*options)->noblocks = 1 ;
-    else
-    if (strcmp(argv[i],"-noscalars") == 0)
-    (*options)->noscalars = 1 ;
-    else
-    if (strcmp(argv[i],"-nosimplify") == 0)
-    (*options)->nosimplify = 1 ;
-    else
-    if ((strcmp(argv[i],"-struct") == 0) || (strcmp(argv[i],"-structure") == 0))
-    (*options)->structure = 1 ;
-    else
-    if ((strcmp(argv[i],"--help") == 0) || (strcmp(argv[i],"-h") == 0))
-    { cloog_options_help() ;
-      infos = 1 ;
-    }
-    else
-    if ((strcmp(argv[i],"--version") == 0) || (strcmp(argv[i],"-v") == 0))
-    { cloog_options_version() ;
-      infos = 1 ;
-    } else if ((strcmp(argv[i],"--quiet") == 0) || (strcmp(argv[i],"-q") == 0))
-      (*options)->quiet = 1;
-    else
-    if (strcmp(argv[i],"-o") == 0)
-    { if (i+1 >= argc)
-        cloog_die("no output name for -o option.\n");
-
-      /* stdout is a special value, when used, we set output to standard
-       * output.
-       */
-      if (strcmp(argv[i+1],"stdout") == 0)
-      *output = stdout ;
-      else
-      { *output = fopen(argv[i+1],"w") ;
-        if (*output == NULL)
-          cloog_die("can't create output file %s.\n", argv[i+1]);
-      }
-      i ++ ;    
-    }
-    else
-      cloog_msg(*options, CLOOG_WARNING, "unknown %s option.\n", argv[i]);
-  }
-  else
-  { if (!input_is_set)
-    { input_is_set = 1 ;
-      (*options)->name = argv[i] ;
-      /* stdin is a special value, when used, we set input to standard input. */
-      if (strcmp(argv[i],"stdin") == 0)
-      *input = stdin ;
-      else
-      { *input = fopen(argv[i],"r") ;
-        if (*input == NULL)
-          cloog_die("%s file does not exist.\n", argv[i]);
-      }
-    } 
-    else
-      cloog_die("multiple input files.\n");
-  }
-  if (!input_is_set)
-  { if (!infos)
-      cloog_die("no input file (-h for help).\n");
-    exit(1) ;
-  }
-}
-
-#ifdef OSL_SUPPORT
-/**
- * This function extracts CLooG option values from an OpenScop scop and
- * updates an existing CloogOption structure with those values. If the
- * options were already set, they are updated without warning.
- * \param[in]     scop    Input Scop.
- * \param[in,out] options CLooG options to be updated.
- */
-void cloog_options_copy_from_osl_scop(osl_scop_p scop,
-                                      CloogOptions *options) {
-  if (!options)
-    cloog_die("Options must be provided.\n");
-
-  if (scop) {
-    /* Extract the language. */
-    if (!strcmp(scop->language, "FORTRAN"))
-      options->language = CLOOG_LANGUAGE_FORTRAN;
-    else
-      options->language = CLOOG_LANGUAGE_C;
-
-    /* Store the input SCoP in the option structure. */
-    options->scop = scop;
-  }
-}
-#endif
-
diff --git a/cloog-0.17.0/source/pprint.c b/cloog-0.17.0/source/pprint.c
deleted file mode 100644
index 9c7f1d4..0000000
--- a/cloog-0.17.0/source/pprint.c
+++ /dev/null
@@ -1,493 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                             pprint.c                              **
-    **-------------------------------------------------------------------**
-    **                  First version: october 26th 2001                 **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-/* CAUTION: the english used for comments is probably the worst you ever read,
- *          please feel free to correct and improve it !
- */
-
-/* June    22nd 2005: General adaptation for GMP.
- * October 26th 2005: General adaptation from CloogDomain to Matrix data
- *                    structure for all constraint systems.
- * October 27th 2005: General adaptation from CloogEqual to Matrix data
- *                    structure for equality spreading.
- */
-
-# include <stdlib.h>
-# include <stdio.h>
-# include <string.h>
-#include <assert.h>
-# include "../include/cloog/cloog.h"
-
-#ifdef OSL_SUPPORT
-#include <osl/util.h>
-#include <osl/body.h>
-#include <osl/statement.h>
-#include <osl/scop.h>
-#endif
-
-
-static void pprint_name(FILE *dst, struct clast_name *n);
-static void pprint_term(struct cloogoptions *i, FILE *dst, struct clast_term *t);
-static void pprint_sum(struct cloogoptions *opt,
-			FILE *dst, struct clast_reduction *r);
-static void pprint_binary(struct cloogoptions *i,
-			FILE *dst, struct clast_binary *b);
-static void pprint_minmax_f(struct cloogoptions *info,
-			FILE *dst, struct clast_reduction *r);
-static void pprint_minmax_c(struct cloogoptions *info,
-			FILE *dst, struct clast_reduction *r);
-static void pprint_reduction(struct cloogoptions *i,
-			FILE *dst, struct clast_reduction *r);
-static void pprint_expr(struct cloogoptions *i, FILE *dst, struct clast_expr *e);
-static void pprint_equation(struct cloogoptions *i,
-			FILE *dst, struct clast_equation *eq);
-static void pprint_assignment(struct cloogoptions *i, FILE *dst, 
-			struct clast_assignment *a);
-static void pprint_user_stmt(struct cloogoptions *options, FILE *dst,
-		       struct clast_user_stmt *u);
-static void pprint_guard(struct cloogoptions *options, FILE *dst, int indent,
-		   struct clast_guard *g);
-static void pprint_for(struct cloogoptions *options, FILE *dst, int indent,
-		 struct clast_for *f);
-static void pprint_stmt_list(struct cloogoptions *options, FILE *dst, int indent,
-		       struct clast_stmt *s);
-
-
-void pprint_name(FILE *dst, struct clast_name *n)
-{
-    fprintf(dst, "%s", n->name);
-}
-
-/**
- * This function returns a string containing the printing of a value (possibly
- * an iterator or a parameter with its coefficient or a constant).
- * - val is the coefficient or constant value,
- * - name is a string containing the name of the iterator or of the parameter,
- */
-void pprint_term(struct cloogoptions *i, FILE *dst, struct clast_term *t)
-{
-    if (t->var) {
-	int group = t->var->type == clast_expr_red &&
-		    ((struct clast_reduction*) t->var)->n > 1;
-	if (cloog_int_is_one(t->val))
-	    ;
-	else if (cloog_int_is_neg_one(t->val))
-	    fprintf(dst, "-");
-        else {
-	    cloog_int_print(dst, t->val);
-	    fprintf(dst, "*");
-	}
-	if (group)
-	    fprintf(dst, "(");
-	pprint_expr(i, dst, t->var);
-	if (group)
-	    fprintf(dst, ")");
-    } else
-	cloog_int_print(dst, t->val);
-}
-
-void pprint_sum(struct cloogoptions *opt, FILE *dst, struct clast_reduction *r)
-{
-    int i;
-    struct clast_term *t;
-
-    assert(r->n >= 1);
-    assert(r->elts[0]->type == clast_expr_term);
-    t = (struct clast_term *) r->elts[0];
-    pprint_term(opt, dst, t);
-
-    for (i = 1; i < r->n; ++i) {
-	assert(r->elts[i]->type == clast_expr_term);
-	t = (struct clast_term *) r->elts[i];
-	if (cloog_int_is_pos(t->val))
-	    fprintf(dst, "+");
-	pprint_term(opt, dst, t);
-    }
-}
-
-void pprint_binary(struct cloogoptions *i, FILE *dst, struct clast_binary *b)
-{
-    const char *s1 = NULL, *s2 = NULL, *s3 = NULL;
-    int group = b->LHS->type == clast_expr_red &&
-		((struct clast_reduction*) b->LHS)->n > 1;
-    if (i->language == CLOOG_LANGUAGE_FORTRAN) {
-	switch (b->type) {
-	case clast_bin_fdiv:
-	    s1 = "FLOOR(REAL(", s2 = ")/REAL(", s3 = "))";
-	    break;
-	case clast_bin_cdiv:
-	    s1 = "CEILING(REAL(", s2 = ")/REAL(", s3 = "))";
-	    break;
-	case clast_bin_div:
-	    if (group)
-		s1 = "(", s2 = ")/", s3 = "";
-	    else
-		s1 = "", s2 = "/", s3 = "";
-	    break;
-	case clast_bin_mod:
-	    s1 = "MOD(", s2 = ", ", s3 = ")";
-	    break;
-	}
-    } else {
-	switch (b->type) {
-	case clast_bin_fdiv:
-	    s1 = "floord(", s2 = ",", s3 = ")";
-	    break;
-	case clast_bin_cdiv:
-	    s1 = "ceild(", s2 = ",", s3 = ")";
-	    break;
-	case clast_bin_div:
-	    if (group)
-		s1 = "(", s2 = ")/", s3 = "";
-	    else
-		s1 = "", s2 = "/", s3 = "";
-	    break;
-	case clast_bin_mod:
-	    if (group)
-		s1 = "(", s2 = ")%", s3 = "";
-	    else
-		s1 = "", s2 = "%", s3 = "";
-	    break;
-	}
-    }
-    fprintf(dst, "%s", s1);
-    pprint_expr(i, dst, b->LHS);
-    fprintf(dst, "%s", s2);
-    cloog_int_print(dst, b->RHS);
-    fprintf(dst, "%s", s3);
-}
-
-void pprint_minmax_f(struct cloogoptions *info, FILE *dst, struct clast_reduction *r)
-{
-    int i;
-    if (r->n == 0)
-	return;
-    fprintf(dst, r->type == clast_red_max ? "MAX(" : "MIN(");
-    pprint_expr(info, dst, r->elts[0]);
-    for (i = 1; i < r->n; ++i) {
-	fprintf(dst, ",");
-	pprint_expr(info, dst, r->elts[i]);
-    }
-    fprintf(dst, ")");
-}
-
-void pprint_minmax_c(struct cloogoptions *info, FILE *dst, struct clast_reduction *r)
-{
-    int i;
-    for (i = 1; i < r->n; ++i)
-	fprintf(dst, r->type == clast_red_max ? "max(" : "min(");
-    if (r->n > 0)
-	pprint_expr(info, dst, r->elts[0]);
-    for (i = 1; i < r->n; ++i) {
-	fprintf(dst, ",");
-	pprint_expr(info, dst, r->elts[i]);
-	fprintf(dst, ")");
-    }
-}
-
-void pprint_reduction(struct cloogoptions *i, FILE *dst, struct clast_reduction *r)
-{
-    switch (r->type) {
-    case clast_red_sum:
-	pprint_sum(i, dst, r);
-	break;
-    case clast_red_min:
-    case clast_red_max:
-	if (r->n == 1) {
-	    pprint_expr(i, dst, r->elts[0]);
-	    break;
-	}
-	if (i->language == CLOOG_LANGUAGE_FORTRAN)
-	    pprint_minmax_f(i, dst, r);
-	else
-	    pprint_minmax_c(i, dst, r);
-	break;
-    default:
-	assert(0);
-    }
-}
-
-void pprint_expr(struct cloogoptions *i, FILE *dst, struct clast_expr *e)
-{
-    if (!e)
-	return;
-    switch (e->type) {
-    case clast_expr_name:
-	pprint_name(dst, (struct clast_name*) e);
-	break;
-    case clast_expr_term:
-	pprint_term(i, dst, (struct clast_term*) e);
-	break;
-    case clast_expr_red:
-	pprint_reduction(i, dst, (struct clast_reduction*) e);
-	break;
-    case clast_expr_bin:
-	pprint_binary(i, dst, (struct clast_binary*) e);
-	break;
-    default:
-	assert(0);
-    }
-}
-
-void pprint_equation(struct cloogoptions *i, FILE *dst, struct clast_equation *eq)
-{
-    pprint_expr(i, dst, eq->LHS);
-    if (eq->sign == 0)
-	fprintf(dst, " == ");
-    else if (eq->sign > 0)
-	fprintf(dst, " >= ");
-    else
-	fprintf(dst, " <= ");
-    pprint_expr(i, dst, eq->RHS);
-}
-
-void pprint_assignment(struct cloogoptions *i, FILE *dst, 
-			struct clast_assignment *a)
-{
-    if (a->LHS)
-	fprintf(dst, "%s = ", a->LHS);
-    pprint_expr(i, dst, a->RHS);
-}
-
-
-/**
- * pprint_osl_body function:
- * this function pretty-prints the OpenScop body of a given statement.
- * It returns 1 if it succeeds to find an OpenScop body to print for
- * that statement, 0 otherwise.
- * \param[in] options CLooG Options.
- * \param[in] dst     Output stream.
- * \param[in] u       Statement to print the OpenScop body.
- * \return 1 on success to pretty-print an OpenScop body for u, 0 otherwise.
- */
-int pprint_osl_body(struct cloogoptions *options, FILE *dst,
-                    struct clast_user_stmt *u) {
-#ifdef OSL_SUPPORT
-  int i;
-  char *expr, *tmp;
-  struct clast_stmt *t;
-  osl_scop_p scop = options->scop;
-  osl_statement_p stmt;
-  osl_body_p body;
-
-  if ((scop != NULL) &&
-      (osl_statement_number(scop->statement) >= u->statement->number)) {
-    stmt = scop->statement;
-
-    /* Go to the convenient statement in the SCoP. */
-    for (i = 1; i < u->statement->number; i++)
-      stmt = stmt->next;
-
-    /* Ensure it has a printable body. */
-    if ((osl_generic_has_URI(stmt->body, OSL_URI_BODY)) &&
-        ((body = stmt->body->data) != NULL) &&
-        (body->expression != NULL) &&
-        (body->iterators != NULL)) {
-      expr = osl_util_identifier_substitution(body->expression->string[0],
-                                              body->iterators->string);
-      tmp = expr;
-      /* Print the body expression, substituting the @...@ markers. */
-      while (*expr) {
-        if (*expr == '@') {
-          int iterator;
-          expr += sscanf(expr, "@%d", &iterator) + 2; /* 2 for the @s */
-          t = u->substitutions;
-          for (i = 0; i < iterator; i++)
-            t = t->next;
-          pprint_assignment(options, dst, (struct clast_assignment *)t);
-        } else {
-          fprintf(dst, "%c", *expr++);
-        }
-      }
-      fprintf(dst, "\n");
-      free(tmp);
-      return 1;
-    }
-  }
-#endif
-  return 0;
-}
-
-void pprint_user_stmt(struct cloogoptions *options, FILE *dst,
-		       struct clast_user_stmt *u)
-{
-    struct clast_stmt *t;
-
-    if (pprint_osl_body(options, dst, u))
-      return;
-    
-    if (u->statement->name)
-	fprintf(dst, "%s", u->statement->name);
-    else
-	fprintf(dst, "S%d", u->statement->number);
-    fprintf(dst, "(");
-    for (t = u->substitutions; t; t = t->next) {
-	assert(CLAST_STMT_IS_A(t, stmt_ass));
-	pprint_assignment(options, dst, (struct clast_assignment *)t);
-	if (t->next)
-	    fprintf(dst, ",");
-    }
-    fprintf(dst, ")");
-    if (options->language != CLOOG_LANGUAGE_FORTRAN)
-	fprintf(dst, ";");
-    fprintf(dst, "\n");
-}
-
-void pprint_guard(struct cloogoptions *options, FILE *dst, int indent,
-		   struct clast_guard *g)
-{
-    int k;
-    if (options->language == CLOOG_LANGUAGE_FORTRAN)
-	fprintf(dst,"IF ");
-    else
-	fprintf(dst,"if ");
-    if (g->n > 1)
-	fprintf(dst,"(");
-    for (k = 0; k < g->n; ++k) {
-	if (k > 0) {
-	    if (options->language == CLOOG_LANGUAGE_FORTRAN)
-		fprintf(dst," .AND. ");
-	    else
-		fprintf(dst," && ");
-	}
-	fprintf(dst,"(");
-        pprint_equation(options, dst, &g->eq[k]);
-	fprintf(dst,")");
-    }
-    if (g->n > 1)
-	fprintf(dst,")");
-    if (options->language == CLOOG_LANGUAGE_FORTRAN)
-	fprintf(dst," THEN\n");
-    else
-	fprintf(dst," {\n");
-
-    pprint_stmt_list(options, dst, indent + INDENT_STEP, g->then);
-
-    fprintf(dst, "%*s", indent, "");
-    if (options->language == CLOOG_LANGUAGE_FORTRAN)
-	fprintf(dst,"END IF\n"); 
-    else
-	fprintf(dst,"}\n"); 
-}
-
-void pprint_for(struct cloogoptions *options, FILE *dst, int indent,
-		 struct clast_for *f)
-{
-    if (options->language == CLOOG_LANGUAGE_FORTRAN)
-	fprintf(dst, "DO ");
-    else
-	fprintf(dst, "for (");
-
-    if (f->LB) {
-	fprintf(dst, "%s=", f->iterator);
-	pprint_expr(options, dst, f->LB);
-    } else if (options->language == CLOOG_LANGUAGE_FORTRAN)
-	cloog_die("unbounded loops not allowed in FORTRAN.\n");
-
-    if (options->language == CLOOG_LANGUAGE_FORTRAN)
-	fprintf(dst,", ");
-    else
-	fprintf(dst,";");
-
-    if (f->UB) { 
-	if (options->language != CLOOG_LANGUAGE_FORTRAN)
-	    fprintf(dst,"%s<=", f->iterator);
-	pprint_expr(options, dst, f->UB);
-    } else if (options->language == CLOOG_LANGUAGE_FORTRAN)
-	cloog_die("unbounded loops not allowed in FORTRAN.\n");
-
-    if (options->language == CLOOG_LANGUAGE_FORTRAN) {
-	if (cloog_int_gt_si(f->stride, 1))
-	    cloog_int_print(dst, f->stride);
-	fprintf(dst,"\n");
-    }
-    else {
-	if (cloog_int_gt_si(f->stride, 1)) {
-	    fprintf(dst,";%s+=", f->iterator);
-	    cloog_int_print(dst, f->stride);
-	    fprintf(dst, ") {\n");
-      } else
-	fprintf(dst, ";%s++) {\n", f->iterator);
-    }
-
-    pprint_stmt_list(options, dst, indent + INDENT_STEP, f->body);
-
-    fprintf(dst, "%*s", indent, "");
-    if (options->language == CLOOG_LANGUAGE_FORTRAN)
-	fprintf(dst,"END DO\n") ; 
-    else
-	fprintf(dst,"}\n") ; 
-}
-
-void pprint_stmt_list(struct cloogoptions *options, FILE *dst, int indent,
-		       struct clast_stmt *s)
-{
-    for ( ; s; s = s->next) {
-	if (CLAST_STMT_IS_A(s, stmt_root))
-	    continue;
-	fprintf(dst, "%*s", indent, "");
-	if (CLAST_STMT_IS_A(s, stmt_ass)) {
-	    pprint_assignment(options, dst, (struct clast_assignment *) s);
-	    if (options->language != CLOOG_LANGUAGE_FORTRAN)
-		fprintf(dst, ";");
-	    fprintf(dst, "\n");
-	} else if (CLAST_STMT_IS_A(s, stmt_user)) {
-	    pprint_user_stmt(options, dst, (struct clast_user_stmt *) s);
-	} else if (CLAST_STMT_IS_A(s, stmt_for)) {
-	    pprint_for(options, dst, indent, (struct clast_for *) s);
-	} else if (CLAST_STMT_IS_A(s, stmt_guard)) {
-	    pprint_guard(options, dst, indent, (struct clast_guard *) s);
-	} else if (CLAST_STMT_IS_A(s, stmt_block)) {
-	    fprintf(dst, "{\n");
-	    pprint_stmt_list(options, dst, indent + INDENT_STEP, 
-				((struct clast_block *)s)->body);
-	    fprintf(dst, "%*s", indent, "");
-	    fprintf(dst, "}\n");
-	} else {
-	    assert(0);
-	}
-    }
-}
-
-
-/******************************************************************************
- *                       Pretty Printing (dirty) functions                    *
- ******************************************************************************/
-
-void clast_pprint(FILE *foo, struct clast_stmt *root,
-		  int indent, CloogOptions *options)
-{
-    pprint_stmt_list(options, foo, indent, root);
-}
diff --git a/cloog-0.17.0/source/program.c b/cloog-0.17.0/source/program.c
deleted file mode 100644
index c52c1dd..0000000
--- a/cloog-0.17.0/source/program.c
+++ /dev/null
@@ -1,1077 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                            program.c                              **
-    **-------------------------------------------------------------------**
-    **                 First version: october 25th 2001                  **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-/* CAUTION: the english used for comments is probably the worst you ever read,
- *          please feel free to correct and improve it !
- */
-
-
-# include <sys/types.h>
-# include <sys/time.h>
-#include <stdarg.h>
-# include <stdlib.h>
-# include <stdio.h>
-# include <string.h>
-# include <ctype.h>
-# include <unistd.h>
-# include "../include/cloog/cloog.h"
-#ifdef CLOOG_RUSAGE
-# include <sys/resource.h>
-#endif
-
-#define ALLOC(type) (type*)malloc(sizeof(type))
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-
-
-/**
- * cloog_program_print function:
- * this function is a human-friendly way to display the CloogProgram data
- * structure, it shows all the different fields and includes an indentation
- * level (level) in order to work with others print_structure functions.
- * - July 1st 2005: first version based on the old cloog_program_print function.
- */
-void cloog_program_print_structure(file, program, level)
-FILE * file ; 
-CloogProgram * program ;
-int level ;
-{ int i, j ;
-
-  /* Go to the right level. */
-  for (i=0; i<level; i++)
-  fprintf(file,"|\t") ;
-  
-  fprintf(file,"+-- CloogProgram\n") ;
-  
-  /* A blank line. */
-  for (i=0; i<=level+1; i++)
-  fprintf(file,"|\t") ;
-  fprintf(file,"\n") ;
-  
-  /* Print the language. */
-  for (i=0; i<=level; i++)
-  fprintf(file,"|\t") ;
-  fprintf(file, "Language: %c\n",program->language) ;
-  
-  /* A blank line. */
-  for (i=0; i<=level+1; i++)
-  fprintf(file,"|\t") ;
-  fprintf(file,"\n") ;
-
-  /* Print the scattering dimension number. */
-  for (i=0; i<=level; i++)
-  fprintf(file,"|\t") ;
-  fprintf(file,"Scattering dimension number: %d\n",program->nb_scattdims) ;
-  
-  /* A blank line. */
-  for (i=0; i<=level+1; i++)
-  fprintf(file,"|\t") ;
-  fprintf(file,"\n") ;
-  
-  /* Print the scalar scattering dimension informations. */
-  for (i=0; i<=level; i++)
-  fprintf(file,"|\t") ;
-  if (program->scaldims != NULL)
-  { fprintf(file,"Scalar dimensions:") ;
-    for (i=0;i<program->nb_scattdims;i++)
-    fprintf(file," %d:%d ",i,program->scaldims[i]) ;
-    fprintf(file,"\n") ;
-  }
-  else
-  fprintf(file,"No scalar scattering dimensions\n") ;
-  
-  /* A blank line. */
-  for (i=0; i<=level+1; i++)
-  fprintf(file,"|\t") ;
-  fprintf(file,"\n") ;
-
-  /* Print the parameter and the iterator names. */
-  cloog_names_print_structure(file,program->names,level+1) ;
- 
-  /* A blank line. */
-  for (i=0; i<=level+1; i++)
-  fprintf(file,"|\t") ;
-  fprintf(file,"\n") ;
-  
-  /* Print the context. */
-  cloog_domain_print_structure(file, program->context, level+1, "Context");
-    
-  /* Print the loop. */
-  cloog_loop_print_structure(file,program->loop,level+1) ;
-
-  /* One more time something that is here only for a better look. */
-  for (j=0; j<2; j++)
-  { for (i=0; i<=level; i++)
-    fprintf(file,"|\t") ;
-      
-    fprintf(file,"\n") ;
-  }
-}
-
-
-/**
- * cloog_program_dump_cloog function:
- * This function dumps a CloogProgram structure supposed to be completely
- * filled in a CLooG input file (foo possibly stdout) such as CLooG can
- * rebuild almost exactly the data structure from the input file.
- *
- * If the scattering is already applied, the scattering parameter is supposed to
- * be NULL. In this case the number of scattering functions is lost, since they
- * are included inside the iteration domains. This can only lead to a less
- * beautiful pretty printing.
- *
- * In case the scattering is not yet applied it can be passed to this function
- * and will be included in the CLooG input file dump.
- */
-void cloog_program_dump_cloog(FILE * foo, CloogProgram * program,
-                              CloogScatteringList *scattering)
-{
-  int i;
-  CloogLoop * loop ;
-  CloogScatteringList *tmp_scatt;
-
-  fprintf(foo,
-  "# CLooG -> CLooG\n"
-  "# This is an automatic dump of a CLooG input file from a CloogProgram data\n"
-  "# structure. WARNING: it is highly dangerous and MAY be correct ONLY if\n"
-  "# - it has been dumped before loop generation.\n"
-  "# - option -noscalars is used (it removes scalar dimensions otherwise)\n"
-  "# - option -l is at least the original scattering dimension number\n"
-  "# ASK THE AUTHOR IF YOU *NEED* SOMETHING MORE ROBUST\n") ;
-
-  /* Language. */
-  if (program->language == 'c')
-  fprintf(foo,"# Language: C\n") ;
-  else
-  fprintf(foo,"# Language: FORTRAN\n") ;
-  fprintf(foo,"%c\n\n",program->language) ;
-
-  /* Context. */
-  fprintf(foo, "# Context (%d parameter(s)):\n", program->names->nb_parameters);
-  cloog_domain_print_constraints(foo, program->context, 0);
-  fprintf(foo,"1 # Parameter name(s)\n") ;
-  for (i=0;i<program->names->nb_parameters;i++)
-  fprintf(foo,"%s ",program->names->parameters[i]) ;
-
-  /* Statement number. */
-  i = 0 ;
-  loop = program->loop ;
-  while (loop != NULL)
-  { i++ ;
-    loop = loop->next ;
-  }
-  fprintf(foo,"\n\n# Statement number:\n%d\n\n",i) ;
-
-  /* Iteration domains. */
-  i = 1 ;
-  loop = program->loop ;
-  while (loop != NULL)
-  { /* Name of the domain. */
-    fprintf(foo,"# Iteration domain of statement %d.\n",i) ;
-
-    cloog_domain_print_constraints(foo, loop->domain, 1);
-    fprintf(foo,"0 0 0 # For future options.\n\n") ;
-    
-    i++ ;
-    loop = loop->next ;
-  }
-  fprintf(foo,"\n1 # Iterator name(s)\n") ;
-
-  /* Scattering already applied? In this case print the scattering names as
-   * additional iterator names. */
-  if (!scattering)
-    for (i = 0; i < program->names->nb_scattering; i++)
-      fprintf(foo, "%s ", program->names->scattering[i]);
-  for (i=0;i<program->names->nb_iterators;i++)
-    fprintf(foo,"%s ",program->names->iterators[i]);
-  fprintf(foo,"\n\n") ;
-
-  /* Exit, if scattering is already applied. */
-  if (!scattering) {
-    fprintf(foo, "# No scattering functions.\n0\n\n");
-    return;
-  }
-
-  /* Scattering relations. */
-  fprintf(foo, "# --------------------- SCATTERING --------------------\n");
-
-  i = 0;
-  for (tmp_scatt = scattering; tmp_scatt; tmp_scatt = tmp_scatt->next)
-    i++;
-
-  fprintf(foo, "%d # Scattering functions", i);
-
-  for (tmp_scatt = scattering; tmp_scatt; tmp_scatt = tmp_scatt->next)
-    cloog_scattering_print_constraints(foo, tmp_scatt->scatt);
-
-  fprintf(foo, "\n1 # Scattering dimension name(s)\n");
-
-  for (i = 0; i < program->names->nb_scattering; i++)
-    fprintf(foo, "%s ", program->names->scattering[i]);
-}
-
-
-/**
- * cloog_program_print function:
- * This function prints the content of a CloogProgram structure (program) into a
- * file (file, possibly stdout).
- * - July 1st 2005: Now this very old function (probably as old as CLooG) is
- *                  only a frontend to cloog_program_print_structure, with a
- *                  quite better human-readable representation.
- */
-void cloog_program_print(FILE * file, CloogProgram * program)
-{ cloog_program_print_structure(file,program,0) ;
-}
-
-
-static void print_comment(FILE *file, CloogOptions *options,
-			  const char *fmt, ...)
-{
-  va_list args;
-
-  va_start(args, fmt);
-  if (options->language == CLOOG_LANGUAGE_FORTRAN) {
-    fprintf(file, "! ");
-    vfprintf(file, fmt, args);
-    fprintf(file, "\n");
-  } else {
-    fprintf(file, "/* ");
-    vfprintf(file, fmt, args);
-    fprintf(file, " */\n");
-  }
-}
-
-static void print_macros(FILE *file)
-{
-    fprintf(file, "/* Useful macros. */\n") ;
-    fprintf(file,
-	"#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))\n");
-    fprintf(file,
-	"#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))\n");
-    fprintf(file, "#define max(x,y)    ((x) > (y) ? (x) : (y))\n") ; 
-    fprintf(file, "#define min(x,y)    ((x) < (y) ? (x) : (y))\n\n") ; 
-}
-
-static void print_declarations(FILE *file, int n, char **names)
-{
-    int i;
-
-    fprintf(file, "  int %s", names[0]); 
-    for (i = 1; i < n; i++)
-	fprintf(file, ", %s", names[i]); 
-
-    fprintf(file, ";\n");
-}
-
-static void print_iterator_declarations(FILE *file, CloogProgram *program,
-	CloogOptions *options)
-{
-    CloogNames *names = program->names;
-
-    if (names->nb_scattering) {
-	fprintf(file, "  /* Scattering iterators. */\n");
-	print_declarations(file, names->nb_scattering, names->scattering);
-    }
-    if (names->nb_iterators) {
-	fprintf(file, "  /* Original iterators. */\n");
-	print_declarations(file, names->nb_iterators, names->iterators);
-    }
-}
-
-static void print_callable_preamble(FILE *file, CloogProgram *program,
-	CloogOptions *options)
-{
-    int j;
-    CloogBlockList *blocklist;
-    CloogBlock *block;
-    CloogStatement *statement;
-
-    fprintf(file, "extern void hash(int);\n\n");
-
-    print_macros(file);
-
-    for (blocklist = program->blocklist; blocklist; blocklist = blocklist->next) {
-	block = blocklist->block;
-	for (statement = block->statement; statement; statement = statement->next) {
-	    fprintf(file, "#define S%d(", statement->number);
-	    if (block->depth > 0) {
-		fprintf(file, "%s", program->names->iterators[0]);
-		for(j = 1; j < block->depth; j++)
-		    fprintf(file, ",%s", program->names->iterators[j]);
-	    }
-	    fprintf(file,") { hash(%d);", statement->number);
-	    for(j = 0; j < block->depth; j++)
-		fprintf(file, " hash(%s);", program->names->iterators[j]);
-	    fprintf(file, " }\n");
-	}
-    }
-    fprintf(file, "\nvoid test("); 
-    if (program->names->nb_parameters > 0) {
-	fprintf(file, "int %s", program->names->parameters[0]);
-	for(j = 1; j < program->names->nb_parameters; j++)
-	    fprintf(file, ", int %s", program->names->parameters[j]);
-    }
-    fprintf(file, ")\n{\n"); 
-    print_iterator_declarations(file, program, options);
-}
-
-static void print_callable_postamble(FILE *file, CloogProgram *program)
-{
-    fprintf(file, "}\n"); 
-}
-
-/**
- * cloog_program_pprint function:
- * This function prints the content of a CloogProgram structure (program) into a
- * file (file, possibly stdout), in a C-like language.
- * - June 22nd 2005: Adaptation for GMP.
- */
-void cloog_program_pprint(file, program, options)
-FILE * file ;
-CloogProgram * program ;
-CloogOptions * options ;
-{
-  int i, j, indentation = 0;
-  CloogStatement * statement ;
-  CloogBlockList * blocklist ;
-  CloogBlock * block ;
-  struct clast_stmt *root;
-   
-  if (program->language == 'f')
-    options->language = CLOOG_LANGUAGE_FORTRAN ;
-  else
-    options->language = CLOOG_LANGUAGE_C ;
- 
-#ifdef CLOOG_RUSAGE
-  print_comment(file, options, "Generated from %s by %s in %.2fs.",
-		options->name, cloog_version(), options->time);
-#else
-  print_comment(file, options, "Generated from %s by %s.",
-		options->name, cloog_version());
-#endif
-#ifdef CLOOG_MEMORY
-  print_comment(file, options, "CLooG asked for %d KBytes.", options->memory);
-  cloog_msg(CLOOG_INFO, "%.2fs and %dKB used for code generation.\n",
-	  options->time,options->memory);
-#endif
-  
-  /* If the option "compilable" is set, we provide the whole stuff to generate
-   * a compilable code. This code just do nothing, but now the user can edit
-   * the source and set the statement macros and parameters values.
-   */
-  if (options->compilable && (program->language == 'c'))
-  { /* The headers. */
-    fprintf(file,"/* DON'T FORGET TO USE -lm OPTION TO COMPILE. */\n\n") ;
-    fprintf(file,"/* Useful headers. */\n") ;
-    fprintf(file,"#include <stdio.h>\n") ;
-    fprintf(file,"#include <stdlib.h>\n") ;
-    fprintf(file,"#include <math.h>\n\n") ;
-
-    /* The value of parameters. */
-    fprintf(file,"/* Parameter value. */\n") ;
-    for (i = 1; i <= program->names->nb_parameters; i++)
-      fprintf(file, "#define PARVAL%d %d\n", i, options->compilable);
-    
-    /* The macros. */
-    print_macros(file);
-
-    /* The statement macros. */
-    fprintf(file,"/* Statement macros (please set). */\n") ;
-    blocklist = program->blocklist ;
-    while (blocklist != NULL)
-    { block = blocklist->block ;
-      statement = block->statement ;
-      while (statement != NULL)
-      { fprintf(file,"#define S%d(",statement->number) ;
-        if (block->depth > 0)
-        { fprintf(file,"%s",program->names->iterators[0]) ;
-          for(j=1;j<block->depth;j++)
-          fprintf(file,",%s",program->names->iterators[j]) ;
-        }
-        fprintf(file,") {total++;") ;
-	if (block->depth > 0) {
-          fprintf(file, " printf(\"S%d %%d", statement->number);
-          for(j=1;j<block->depth;j++)
-            fprintf(file, " %%d");
-          
-          fprintf(file,"\\n\",%s",program->names->iterators[0]) ;
-	  for(j=1;j<block->depth;j++)
-          fprintf(file,",%s",program->names->iterators[j]) ;
-          fprintf(file,");") ;
-        }
-        fprintf(file,"}\n") ;
-        
-	statement = statement->next ;
-      }
-      blocklist = blocklist->next ;
-    }
-    
-    /* The iterator and parameter declaration. */
-    fprintf(file,"\nint main() {\n") ; 
-    print_iterator_declarations(file, program, options);
-    if (program->names->nb_parameters > 0)
-    { fprintf(file,"  /* Parameters. */\n") ;
-      fprintf(file, "  int %s=PARVAL1",program->names->parameters[0]);
-      for(i=2;i<=program->names->nb_parameters;i++)
-        fprintf(file, ", %s=PARVAL%d", program->names->parameters[i-1], i);
-      
-      fprintf(file,";\n");
-    }
-    fprintf(file,"  int total=0;\n");
-    fprintf(file,"\n") ;
-    
-    /* And we adapt the identation. */
-    indentation += 2 ;
-  } else if (options->callable && program->language == 'c') {
-    print_callable_preamble(file, program, options);
-    indentation += 2;
-  }
-  
-  root = cloog_clast_create(program, options);
-  clast_pprint(file, root, indentation, options);
-  cloog_clast_free(root);
-  
-  /* The end of the compilable code in case of 'compilable' option. */
-  if (options->compilable && (program->language == 'c'))
-  {
-    fprintf(file, "\n  printf(\"Number of integral points: %%d.\\n\",total);");
-    fprintf(file, "\n  return 0;\n}\n");
-  } else if (options->callable && program->language == 'c')
-    print_callable_postamble(file, program);
-}
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-
-
-/**
- * cloog_program_free function:
- * This function frees the allocated memory for a CloogProgram structure.
- */
-void cloog_program_free(CloogProgram * program)
-{ cloog_names_free(program->names) ;
-  cloog_loop_free(program->loop) ;
-  cloog_domain_free(program->context) ;
-  cloog_block_list_free(program->blocklist) ;
-  if (program->scaldims != NULL)
-  free(program->scaldims) ;
-  
-  free(program) ;
-}
-
-
-/******************************************************************************
- *                               Reading function                             *
- ******************************************************************************/
-
-
-static void cloog_program_construct_block_list(CloogProgram *p)
-{
-    CloogLoop *loop;
-    CloogBlockList **next = &p->blocklist;
-
-    for (loop = p->loop; loop; loop = loop->next) {
-	*next = cloog_block_list_alloc(loop->block);
-	next = &(*next)->next;
-    }
-}
-
-
-/**
- * Construct a CloogProgram structure from a given context and
- * union domain representing the iteration domains and scattering functions.
- */
-CloogProgram *cloog_program_alloc(CloogDomain *context, CloogUnionDomain *ud,
-	CloogOptions *options)
-{
-  int i;
-  char prefix[] = "c";
-  CloogScatteringList * scatteringl;
-  CloogNames *n;
-  CloogProgram * p ;
-      
-  /* Memory allocation for the CloogProgram structure. */
-  p = cloog_program_malloc() ;
-  
-  if (options->language == CLOOG_LANGUAGE_FORTRAN)
-    p->language = 'f';
-  else
-    p->language = 'c';
-    
-  p->names = n = cloog_names_alloc();
-
-  /* We then read the context data. */
-  p->context = context;
-  n->nb_parameters = ud->n_name[CLOOG_PARAM];
-  
-  /* First part of the CloogNames structure: the parameter names. */
-  if (ud->name[CLOOG_PARAM]) {
-    n->parameters = ud->name[CLOOG_PARAM];
-    ud->name[CLOOG_PARAM] = NULL;
-  } else
-    n->parameters = cloog_names_generate_items(n->nb_parameters, NULL,
-					       FIRST_PARAMETER);
-
-  n->nb_iterators = ud->n_name[CLOOG_ITER];
-  if (ud->name[CLOOG_ITER]) {
-    n->iterators = ud->name[CLOOG_ITER];
-    ud->name[CLOOG_ITER] = NULL;
-  } else
-    n->iterators = cloog_names_generate_items(n->nb_iterators, NULL,
-					      FIRST_ITERATOR);
-
-  if (ud->domain) {
-    CloogNamedDomainList *l;
-    CloogLoop **next = &p->loop;
-    CloogScatteringList **next_scat = &scatteringl;
-
-    scatteringl = NULL;
-    for (i = 0, l = ud->domain; l; ++i, l = l->next) {
-      *next = cloog_loop_from_domain(options->state, l->domain, i);
-      l->domain = NULL;
-      (*next)->block->statement->name = l->name;
-      (*next)->block->statement->usr = l->usr;
-      l->name = NULL;
-
-      if (l->scattering) {
-	*next_scat = ALLOC(CloogScatteringList);
-	(*next_scat)->scatt = l->scattering;
-	l->scattering = NULL;
-	(*next_scat)->next = NULL;
-
-	next_scat = &(*next_scat)->next;
-      }
-
-      next = &(*next)->next;
-    }
-
-    if (scatteringl != NULL) {
-      p->nb_scattdims = cloog_scattering_dimension(scatteringl->scatt,
-							    p->loop->domain);
-      n->nb_scattering = p->nb_scattdims;
-      if (ud->name[CLOOG_SCAT]) {
-	n->scattering = ud->name[CLOOG_SCAT];
-	ud->name[CLOOG_SCAT] = NULL;
-      } else
-	n->scattering = cloog_names_generate_items(n->nb_scattering, prefix, -1);
-    
-      /* The boolean array for scalar dimensions is created and set to 0. */
-      p->scaldims = (int *)malloc(p->nb_scattdims*(sizeof(int))) ;
-      if (p->scaldims == NULL) 
-	cloog_die("memory overflow.\n");
-      for (i=0;i<p->nb_scattdims;i++)
-      p->scaldims[i] = 0 ;
-      
-      /* We try to find blocks in the input problem to reduce complexity. */
-      if (!options->noblocks)
-	cloog_program_block(p, scatteringl, options);
-      if (!options->noscalars)
-	cloog_program_extract_scalars(p, scatteringl, options);
-      
-      cloog_program_scatter(p, scatteringl, options);
-      cloog_scattering_list_free(scatteringl);
-
-      if (!options->noblocks)
-	p->loop = cloog_loop_block(p->loop, p->scaldims, p->nb_scattdims);
-    }
-    else
-    { p->nb_scattdims = 0 ;
-      p->scaldims  = NULL ;
-    }
-  
-    cloog_names_scalarize(p->names,p->nb_scattdims,p->scaldims) ;
-
-    cloog_program_construct_block_list(p);
-  }
-  else
-  { p->loop      = NULL ;
-    p->blocklist = NULL ;
-    p->scaldims  = NULL ;
-  }
-
-  cloog_union_domain_free(ud);
-   
-  return(p) ;
-}
-
-
-/**
- * cloog_program_read function:
- * This function read the informations to put in a CloogProgram structure from
- * a file (file, possibly stdin). It returns a pointer to a CloogProgram
- * structure containing the read informations.
- * - October 25th 2001: first version.
- * - September 9th 2002: - the big reading function is now split in several
- *                         functions (one per read data structure).
- *                       - adaptation to the new file format with naming.
- */
-CloogProgram *cloog_program_read(FILE *file, CloogOptions *options)
-{
-  CloogInput *input;
-  CloogProgram *p;
-
-  input = cloog_input_read(file, options);
-  p = cloog_program_alloc(input->context, input->ud, options);
-  free(input);
-
-  return p;
-}
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
- 
- 
-/**
- * cloog_program_malloc function:
- * This function allocates the memory space for a CloogProgram structure and
- * sets its fields with default values. Then it returns a pointer to the
- * allocated space.
- * - November 21th 2005: first version.
- */
-CloogProgram * cloog_program_malloc()
-{ CloogProgram * program ;
-  
-  /* Memory allocation for the CloogProgram structure. */
-  program = (CloogProgram *)malloc(sizeof(CloogProgram)) ;
-  if (program == NULL) 
-    cloog_die("memory overflow.\n");
-  
-  /* We set the various fields with default values. */
-  program->language     = 'c' ;
-  program->nb_scattdims = 0 ;
-  program->context      = NULL ;
-  program->loop         = NULL ;
-  program->names        = NULL ;
-  program->blocklist    = NULL ;
-  program->scaldims     = NULL ;
-  program->usr          = NULL;
-  
-  return program ;
-}  
-
-
-/**
- * cloog_program_generate function:
- * This function calls the Quillere algorithm for loop scanning. (see the
- * Quillere paper) and calls the loop simplification function.
- * - depth is the loop depth we want to optimize (guard free as possible),
- *   the first loop depth is 1 and anegative value is the infinity depth.
- * - sep_level is the level number where we want to start loop separation.
- **
- * - October 26th 2001: first version. 
- * - April   19th 2005: some basic fixes and memory usage feature.
- * - April   29th 2005: (bug fix, bug found by DaeGon Kim) see case 2 below.
- */ 
-CloogProgram * cloog_program_generate(program, options)
-CloogProgram * program ;
-CloogOptions * options ;
-{
-#ifdef CLOOG_RUSAGE
-  float time;
-  struct rusage start, end ;
-#endif
-  CloogLoop * loop ;
-#ifdef CLOOG_MEMORY
-  char status_path[MAX_STRING_VAL] ;
-  FILE * status ;
- 
-  /* We initialize the memory need to 0. */
-  options->memory = 0 ;
-#endif
-
-  if (options->override)
-  {
-    cloog_msg(options, CLOOG_WARNING,
-    "you are using -override option, be aware that the "
-    "generated\n                code may be incorrect.\n") ;
-  }
-  else
-  { /* Playing with options may be dangerous, here are two possible issues :
-     * 1. Using -l option less than scattering dimension number may lead to
-     *    an illegal target code (since the scattering is not respected), if
-     *    it is the case, we set -l depth to the first acceptable value.
-     */
-    if ((program->nb_scattdims > options->l) && (options->l >= 0))
-    {
-      cloog_msg(options, CLOOG_WARNING,
-      "-l depth is less than the scattering dimension number "
-      "(the \n                generated code may be incorrect), it has been "
-      "automaticaly set\n                to this value (use option -override "
-      "to override).\n") ;
-      options->l = program->nb_scattdims ;
-    }
-      
-    /* 2. Using -f option greater than one while -l depth is greater than the
-     *    scattering dimension number may lead to iteration duplication (try
-     *    test/daegon_lu_osp.cloog with '-f 3' to test) because of the step 4b
-     *    of the cloog_loop_generate function, if it is the case, we set -l to
-     *    the first acceptable value.
-     */
-    if (((options->f > 1) || (options->f < 0)) &&
-        ((options->l > program->nb_scattdims) || (options->l < 0)))
-    {
-      cloog_msg(options, CLOOG_WARNING,
-      "-f depth is more than one, -l depth has been "
-      "automaticaly set\n                to the scattering dimension number "
-      "(target code may have\n                duplicated iterations), -l depth "
-      "has been automaticaly set to\n                this value (use option "
-      "-override to override).\n") ;
-      options->l = program->nb_scattdims ;
-    }
-  }
-  
-#ifdef CLOOG_RUSAGE
-  getrusage(RUSAGE_SELF, &start) ;
-#endif
-  if (program->loop != NULL)
-  { loop = program->loop ;
-    
-    /* Here we go ! */
-    loop = cloog_loop_generate(loop, program->context, 0, 0,
-                               program->scaldims,
-			       program->nb_scattdims,
-			       options);
-			          
-#ifdef CLOOG_MEMORY
-    /* We read into the status file of the process how many memory it uses. */
-    sprintf(status_path,"/proc/%d/status",getpid()) ;
-    status = fopen(status_path, "r") ;
-    while (fscanf(status,"%s",status_path) && strcmp(status_path,"VmData:")!=0);
-    fscanf(status,"%d",&(options->memory)) ;
-    fclose(status) ;
-#endif
-    
-    if ((!options->nosimplify) && (program->loop != NULL))
-      loop = cloog_loop_simplify(loop, program->context, 0,
-                                 program->nb_scattdims, options);
-   
-    program->loop = loop ;
-  }
-    
-#ifdef CLOOG_RUSAGE
-  getrusage(RUSAGE_SELF, &end) ;
-  /* We calculate the time spent in code generation. */
-  time =  (end.ru_utime.tv_usec -  start.ru_utime.tv_usec)/(float)(MEGA) ;
-  time += (float)(end.ru_utime.tv_sec - start.ru_utime.tv_sec) ;
-  options->time = time ;
-#endif
-  
-  return program ;
-}
-
-
-/**
- * cloog_program_block function:
- * this function gives a last chance to the lazy user to consider statement
- * blocks instead of some statement lists where the whole list may be
- * considered as a single statement from a code generation point of view.
- * For instance two statements with the same iteration domain and the same
- * scattering functions may be considered as a block. This function is lazy
- * and can only find very simple forms of trivial blocks (see
- * cloog_domain_lazy_block function for more details). The useless loops and
- * scattering functions are removed and freed while the statement list of
- * according blocks are filled.
- * - program is the whole program structure (befaore applying scattering),
- * - scattering is the list of scattering functions.
- **
- * - April   30th 2005: first attempt.
- * - June 10-11th 2005: first working version.
- */
-void cloog_program_block(CloogProgram *program,
-	CloogScatteringList *scattering, CloogOptions *options)
-{ int blocked_reference=0, blocked=0, nb_blocked=0 ;
-  CloogLoop * reference, * start, * loop ;
-  CloogScatteringList * scatt_reference, * scatt_loop, * scatt_start;
-  
-  if ((program->loop == NULL) || (program->loop->next == NULL))
-  return ;
-  
-  /* The process will use three variables for the linked list :
-   * - 'start' is the starting point of a new block,
-   * - 'reference' is the node of the block used for the block checking,
-   * - 'loop' is the candidate to be inserted inside the block.
-   * At the beginning of the process, the linked lists are as follow:
-   *         O------>O------>O------>O------>NULL
-   *         |       |
-   *       start    loop
-   *     reference
-   */
-
-  reference       = program->loop ;
-  start           = program->loop ;
-  loop            = reference->next ;
-  scatt_reference = scattering ;
-  scatt_start     = scattering ;
-  scatt_loop      = scattering->next ;
-   
-  while (loop != NULL)
-  { if (cloog_domain_lazy_equal(reference->domain,loop->domain) &&
-        cloog_scattering_lazy_block(scatt_reference->scatt, scatt_loop->scatt,
-	                        scattering,program->nb_scattdims))
-    { /* If we find a block we update the links:
-       *     +---------------+
-       *     |               v
-       *     O       O------>O------>O------>NULL
-       *     |       |
-       *   start    loop
-       * reference
-       */
-      blocked = 1 ;
-      nb_blocked ++ ;
-      cloog_block_merge(start->block,loop->block); /* merge frees loop->block */
-      loop->block = NULL ;
-      start->next = loop->next ;
-      scatt_start->next = scatt_loop->next ;
-    }
-    else
-    { /* If we didn't find a block, the next start of a block is updated:
-       *     O------>O------>O------>O------>NULL
-       *     |       |
-       * reference start
-       *           loop
-       */
-      blocked= 0 ;
-      start = loop ;
-      scatt_start = scatt_loop ;
-    }
-
-    /* If the reference node has been included into a block, we can free it. */
-    if (blocked_reference)
-    { reference->next = NULL ;
-      cloog_loop_free(reference) ;
-      cloog_scattering_free(scatt_reference->scatt);
-      free(scatt_reference) ;
-    }
-    
-    /* The reference and the loop are now updated for the next try, the
-     * starting position depends on the previous step.
-     *       O   ?   O------>O------>O------>NULL
-     *               |       |
-     *           reference loop
-     */
-    reference       = loop ;
-    loop            = loop->next ;
-    scatt_reference = scatt_loop ;
-    scatt_loop      = scatt_loop->next ;
-    
-    /* We mark the new reference as being blocked or not, if will be freed
-     * during the next while loop execution.
-     */
-    if (blocked)
-    blocked_reference = 1 ;
-    else
-    blocked_reference = 0 ;
-  }
-  
-  /* We free the last blocked reference if any (since in the while loop it was
-   * freed during the next loop execution, it was not possible to free the
-   * last one inside).
-   */
-  if (blocked_reference)
-  { reference->next = NULL ;
-    cloog_loop_free(reference) ;
-    cloog_scattering_free(scatt_reference->scatt);
-    free(scatt_reference) ;
-  }
-  
-  if (nb_blocked != 0)
-    cloog_msg(options, CLOOG_INFO, "%d domains have been blocked.\n", nb_blocked);
-}
-
-
-/**
- * cloog_program_extract_scalars function:
- * this functions finds and removes the dimensions of the scattering functions
- * when they are scalar (i.e. of the shape "dim + scalar = 0") for all
- * scattering functions. The reason is that the processing of such dimensions
- * is trivial and do not need neither a row and a column in the matrix
- * representation of the domain (this will save memory) neither the full
- * Quillere processing (this will save time). The scalar dimensions data are
- * dispatched in the CloogProgram structure (the boolean vector scaldims will
- * say which original dimensions are scalar or not) and to the CloogBlock
- * structures (each one has a scaldims vector that contains the scalar values).
- * - June 14th 2005: first developments.
- * - June 30th 2005: first version.
- */ 
-void cloog_program_extract_scalars(CloogProgram *program,
-	CloogScatteringList *scattering, CloogOptions *options)
-{ int i, j, scalar, current, nb_scaldims=0 ;
-  CloogScatteringList *start;
-  CloogScattering *old;
-  CloogLoop *loop;
-  CloogBlock * block ;
-
-  start = scattering ;
-    
-  for (i=0;i<program->nb_scattdims;i++)
-  { scalar = 1 ;
-    scattering = start ;
-    while (scattering != NULL)
-    { if (!cloog_scattering_lazy_isscalar(scattering->scatt, i, NULL))
-      { scalar = 0 ;
-        break ;
-      }
-      scattering = scattering->next ;
-    }
-    
-    if (scalar)
-    { nb_scaldims ++ ;
-      program->scaldims[i] = 1 ;
-    }
-  }
-  
-  /* If there are no scalar dimensions, we can continue directly. */
-  if (!nb_scaldims)
-  return ;
-
-  /* Otherwise, in each block, we have to put the number of scalar dimensions,
-   * and to allocate the memory for the scalar values.
-   */
-  for (loop = program->loop; loop; loop = loop->next) {
-    block = loop->block;
-    block->nb_scaldims = nb_scaldims ;
-    block->scaldims = (cloog_int_t *)malloc(nb_scaldims*sizeof(cloog_int_t));
-    for (i=0;i<nb_scaldims;i++)
-    cloog_int_init(block->scaldims[i]);
-  }
-  
-  /* Then we have to fill these scalar values, so we can erase those dimensions
-   * from the scattering functions. It's easier to begin with the last one,
-   * since there would be an offset otherwise (if we remove the i^th dimension,
-   * then the next one is not the (i+1)^th but still the i^th...).
-   */
-  current = nb_scaldims - 1 ;
-  for (i=program->nb_scattdims-1;i>=0;i--)
-  if (program->scaldims[i])
-  {
-    scattering = start ;
-    for (loop = program->loop; loop; loop = loop->next) {
-      block = loop->block;
-      if (!cloog_scattering_lazy_isscalar(scattering->scatt, i,
-						&block->scaldims[current])) {
-	/* We should have found a scalar value: if not, there is an error. */
-	cloog_die("dimension %d is not scalar as expected.\n", i);
-      }
-      scattering = scattering->next ;
-    } 
-  
-    scattering = start ;
-    while (scattering != NULL) {
-      old = scattering->scatt;
-      scattering->scatt = cloog_scattering_erase_dimension(old, i);
-      cloog_scattering_free(old);
-      scattering = scattering->next ;
-    }
-    current-- ;
-  }
-  
-  /* We postprocess the scaldims array in such a way that each entry is how
-   * many scalar dimensions follows + 1 (the current one). This will make 
-   * some other processing easier (e.g. knowledge of some offsets).
-   */
-  for (i=0;i<program->nb_scattdims-1;i++)
-  { if (program->scaldims[i])
-    { j = i + 1 ;
-      while ((j < program->nb_scattdims) && program->scaldims[j])
-      { program->scaldims[i] ++ ;
-        j ++ ;
-      }
-    }
-  }
-  
-  if (nb_scaldims != 0)
-    cloog_msg(options, CLOOG_INFO, "%d dimensions (over %d) are scalar.\n",
-          nb_scaldims,program->nb_scattdims) ;
-}
-
-
-/**
- * cloog_program_scatter function:
- * This function adds the scattering (scheduling) informations in a program.
- * If names is NULL, this function create names itself such that the i^th
- * name is ci.
- * - November 6th 2001: first version. 
- */
-void cloog_program_scatter(CloogProgram *program,
-			CloogScatteringList *scattering, CloogOptions *options)
-{ int scattering_dim, scattering_dim2, not_enough_constraints=0 ;
-  CloogLoop * loop ;
-  
-  if ((program != NULL) && (scattering != NULL))
-  { loop = program->loop ;
-    
-    /* We compute the scattering dimension and check it is >=0. */
-    scattering_dim = cloog_scattering_dimension(scattering->scatt, loop->domain);
-    if (scattering_dim < 0)
-      cloog_die("scattering has not enough dimensions.\n");
-    if (!cloog_scattering_fully_specified(scattering->scatt, loop->domain))
-    not_enough_constraints ++ ;
-         
-    /* The scattering dimension may have been modified by scalar extraction. */
-    scattering_dim = cloog_scattering_dimension(scattering->scatt, loop->domain);
-
-    /* Finally we scatter all loops. */
-    cloog_loop_scatter(loop, scattering->scatt);
-    loop = loop->next ;
-    scattering = scattering->next ;    
-    
-    while ((loop != NULL) && (scattering != NULL))
-    { scattering_dim2 = cloog_scattering_dimension(scattering->scatt,
-								loop->domain);
-      if (scattering_dim2 != scattering_dim)
-        cloog_die("scattering dimensions are not the same.\n") ;
-      if (!cloog_scattering_fully_specified(scattering->scatt, loop->domain))
-      not_enough_constraints ++ ;
-      
-      cloog_loop_scatter(loop, scattering->scatt);
-      loop = loop->next ;
-      scattering = scattering->next ;
-    }
-    if ((loop != NULL) || (scattering != NULL))
-      cloog_msg(options, CLOOG_WARNING,
-                    "there is not a scattering for each statement.\n");
-    
-    if (not_enough_constraints)
-      cloog_msg(options, CLOOG_WARNING, "not enough constraints for "
-                    "%d scattering function(s).\n",not_enough_constraints) ;
-  }
-}
diff --git a/cloog-0.17.0/source/state.c b/cloog-0.17.0/source/state.c
deleted file mode 100644
index 7f3fff8..0000000
--- a/cloog-0.17.0/source/state.c
+++ /dev/null
@@ -1,52 +0,0 @@
-#include <stdlib.h>
-#include "../include/cloog/cloog.h"
-
-/**
- * Allocate state and initialize backend independent part.
- */
-CloogState *cloog_core_state_malloc(void)
-{
-  CloogState *state;
-
-  state = (CloogState *)malloc(sizeof(CloogState));
-  if (!state) 
-    cloog_die("memory overflow.\n");
-
-  state->backend = NULL;
-
-  cloog_int_init(state->zero);
-  cloog_int_set_si(state->zero, 0);
-  cloog_int_init(state->one);
-  cloog_int_set_si(state->one, 1);
-  cloog_int_init(state->negone);
-  cloog_int_set_si(state->negone, -1);
-
-  state->block_allocated = 0;
-  state->block_freed = 0;
-  state->block_max = 0;
-
-  state->domain_allocated = 0;
-  state->domain_freed = 0;
-  state->domain_max = 0;
-
-  state->loop_allocated = 0;
-  state->loop_freed = 0;
-  state->loop_max = 0;
-
-  state->statement_allocated = 0;
-  state->statement_freed = 0;
-  state->statement_max = 0;
-
-  return state;
-}
-
-/**
- * Free state.
- */
-void cloog_core_state_free(CloogState *state)
-{
-  cloog_int_clear(state->zero);
-  cloog_int_clear(state->one);
-  cloog_int_clear(state->negone);
-  free(state);
-}
diff --git a/cloog-0.17.0/source/statement.c b/cloog-0.17.0/source/statement.c
deleted file mode 100644
index 1c6af4e..0000000
--- a/cloog-0.17.0/source/statement.c
+++ /dev/null
@@ -1,280 +0,0 @@
-
-   /**-------------------------------------------------------------------**
-    **                              CLooG                                **
-    **-------------------------------------------------------------------**
-    **                           statement.c                             **
-    **-------------------------------------------------------------------**
-    **                 First version: november 4th 2001                  **
-    **-------------------------------------------------------------------**/
-
-
-/******************************************************************************
- *               CLooG : the Chunky Loop Generator (experimental)             *
- ******************************************************************************
- *                                                                            *
- * Copyright (C) 2001-2005 Cedric Bastoul                                     *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2.1 of the License, or (at your option) any later version.         *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,                         *
- * Boston, MA  02110-1301  USA                                                *
- *                                                                            *
- * CLooG, the Chunky Loop Generator                                           *
- * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                         *
- *                                                                            *
- ******************************************************************************/
-/* CAUTION: the english used for comments is probably the worst you ever read,
- *          please feel free to correct and improve it !
- */
-
-# include <stdlib.h>
-# include <stdio.h>
-# include <string.h>
-# include "../include/cloog/cloog.h"
-
-
-/******************************************************************************
- *                             Memory leaks hunting                           *
- ******************************************************************************/
-
-
-/**
- * These functions and global variables are devoted to memory leaks hunting: we
- * want to know at each moment how many CloogStatement structures had been
- * allocated (cloog_statement_allocated) and how many had been freed
- * (cloog_statement_freed). Each time a CloogStatement structure is allocated,
- * a call to the function cloog_statement_leak_up() must be carried out, and
- * respectively cloog_statement_leak_down() when a CloogStatement structure is
- * freed. The special variable cloog_statement_max gives the maximal number of
- * CloogStatement structures simultaneously alive (i.e. allocated and
- * non-freed) in memory.
- * - July 3rd->11th 2003: first version (memory leaks hunt and correction).
- */
-
-
-static void cloog_statement_leak_up(CloogState *state)
-{
-  state->statement_allocated++;
-  if ((state->statement_allocated - state->statement_freed) > state->statement_max)
-  state->statement_max = state->statement_allocated - state->statement_freed ;
-}
-
-
-static void cloog_statement_leak_down(CloogState *state)
-{ 
-  state->statement_freed++;
-}
-
-
-/******************************************************************************
- *                          Structure display function                        *
- ******************************************************************************/
-
-
-/**
- * cloog_domain_print_structure :
- * this function is a human-friendly way to display the CloogDomain data
- * structure, it includes an indentation level (level) in order to work with
- * others print_structure functions.
- * - June  16th 2005: first version.
- */
-void cloog_statement_print_structure(file, statement, level)
-FILE * file ;
-CloogStatement * statement ;
-int level ;
-{ int i ;
-      
-  if (statement != NULL)
-  { /* Go to the right level. */
-    for (i=0; i<level; i++)
-    fprintf(file,"|\t") ;
-    fprintf(file,"+-- CloogStatement %d \n",statement->number) ;
-    
-    statement = statement->next ;
- 
-    while (statement != NULL)
-    { for (i=0; i<level; i++)
-      fprintf(file,"|\t") ;
-      fprintf(file,"|          |\n");
-      for (i=0; i<level; i++)
-      fprintf(file,"|\t") ;
-      fprintf(file,"|          V\n");
-      
-      for (i=0; i<level; i++)
-      fprintf(file,"|\t") ;
-      fprintf(file,"|   CloogStatement %d \n",statement->number) ;
-      statement = statement->next ;
-    }
-  }
-  else
-  { for (i=0; i<level; i++)
-    fprintf(file,"|\t") ;
-    
-    fprintf(file,"+-- No CloogStatement\n") ;
-  }  
-}
-
-
-/**
- * cloog_statement_print function:
- * This function prints the content of a CloogStatement structure (statement)
- * into a file (file, possibly stdout).
- */
-void cloog_statement_print(FILE * file, CloogStatement * statement)
-{ cloog_statement_print_structure(file,statement,0) ;
-}
-
-
-/******************************************************************************
- *                         Memory deallocation function                       *
- ******************************************************************************/
-
-
-/**
- * cloog_statement_free function:
- * This function frees the allocated memory for a CloogStatement structure.
- */
-void cloog_statement_free(CloogStatement * statement)
-{ CloogStatement * next ;
-
-  while (statement != NULL) {
-    cloog_statement_leak_down(statement->state);
-    
-    next = statement->next ;
-    /* free(statement->usr) ; Actually, this is user's job ! */
-    free(statement->name);
-    free(statement) ;
-    statement = next ;
-  }
-}
-
-
-/******************************************************************************
- *                            Processing functions                            *
- ******************************************************************************/
-
-
-/**
- * cloog_statement_malloc function:
- * This function allocates the memory space for a CloogStatement structure and
- * sets its fields with default values. Then it returns a pointer to the
- * allocated space.
- * - November 21th 2005: first version.
- */
-CloogStatement *cloog_statement_malloc(CloogState *state)
-{ CloogStatement * statement ;
-  
-  /* Memory allocation for the CloogStatement structure. */
-  statement = (CloogStatement *)malloc(sizeof(CloogStatement)) ;
-  if (statement == NULL) 
-    cloog_die("memory overflow.\n");
-  cloog_statement_leak_up(state);
-  
-  /* We set the various fields with default values. */
-  statement->state = state;
-  statement->number = 0;
-  statement->name = NULL;
-  statement->usr  = NULL ; /* To fill it is actually user's job ! */
-  statement->next = NULL ;
-  
-  return statement ;
-}  
-
-
-/**
- * cloog_statement_alloc function:
- * This function allocates the memory space for a CloogStatement structure and
- * sets its fields with those given as input. Then it returns a pointer to the
- * allocated space.
- * - number is the statement number.
- **
- * - September 9th 2002: first version.
- * - March    17th 2003: fix for the usr field in CloogStatement structure.
- * - April    16th 2005: adaptation to new CloogStatement structure (with
- *                       number), cloog_statement_read becomes
- *                       cloog_statement_alloc sincethere is nothing more to
- *                       read on a file.
- * - November 21th 2005: use of cloog_statement_malloc.
- */
-CloogStatement *cloog_statement_alloc(CloogState *state, int number)
-{ CloogStatement * statement ;
-    
-  /* Memory allocation and initialization of the structure. */
-  statement = cloog_statement_malloc(state);
-
-  statement->number = number ;
-  
-  return statement ;
-}
-
-
-/**
- * cloog_statement_copy function:
- * This function returns a copy of the CloogStatement structure given as input.
- * - October 28th 2001: first version (in loop.c). 
- * - March   17th 2003: fix for the usr field in CloogStatement structure.
- * - April   16th 2005: adaptation to new CloogStatement struct (with number). 
- */ 
-CloogStatement * cloog_statement_copy(CloogStatement * source)
-{ CloogStatement * statement, * temp, * now = NULL ;
-  
-  statement = NULL ;
-
-  while (source != NULL) {
-    cloog_statement_leak_up(source->state);
-
-    temp = (CloogStatement *)malloc(sizeof(CloogStatement)) ;
-    if (temp == NULL)
-      cloog_die("memory overflow.\n");
-    
-    temp->state  = source->state;
-    temp->number = source->number ;
-    temp->name = source->name ? strdup(source->name) : NULL;
-    temp->usr    = source->usr ;
-    temp->next   = NULL ;
-    
-    if (statement == NULL)
-    { statement = temp ;
-      now = statement ;
-    }
-    else
-    { now->next = temp ;
-      now = now->next ;
-    }
-    source = source->next ;
-  }
-  return(statement) ;
-}
-
-
-/** 
- * cloog_statement_add function:
- * This function adds a CloogStatement structure (statement) at a given place
- * (now) of a NULL terminated list of CloogStatement structures. The beginning
- * of this list is (start). This function updates (now) to (loop), and
- * updates (start) if the added element is the first one -that is when (start)
- * is NULL-.
- * - March 27th 2004: first version. 
- */ 
-void cloog_statement_add(start, now, statement)
-CloogStatement ** start, ** now, * statement ;
-{ if (*start == NULL)
-  { *start = statement ;
-    *now = *start ;
-  }
-  else
-  { (*now)->next = statement ;
-    *now = (*now)->next ;
-  }
-}
-
diff --git a/cloog-0.17.0/source/stride.c b/cloog-0.17.0/source/stride.c
deleted file mode 100644
index d7358a0..0000000
--- a/cloog-0.17.0/source/stride.c
+++ /dev/null
@@ -1,70 +0,0 @@
-#include <stdlib.h>
-#include <cloog/cloog.h>
-
-#define ALLOC(type) (type*)malloc(sizeof(type))
-
-CloogStride *cloog_stride_malloc()
-{
-	CloogStride *s;
-
-	s = ALLOC(CloogStride);
-	if (!s)
-		cloog_die("memory overflow.\n");
-
-	s->references = 1;
-	cloog_int_init(s->stride);
-	cloog_int_init(s->offset);
-	cloog_int_init(s->factor);
-	s->constraint = cloog_constraint_invalid();
-
-	return s;
-}
-
-CloogStride *cloog_stride_alloc(cloog_int_t stride, cloog_int_t offset)
-{
-	CloogStride *s = cloog_stride_malloc();
-
-	cloog_int_set(s->stride, stride);
-	cloog_int_set(s->offset, offset);
-	cloog_int_set_si(s->factor, 0);
-
-	return s;
-}
-
-CloogStride *cloog_stride_alloc_from_constraint(cloog_int_t stride,
-	CloogConstraint *constraint, cloog_int_t factor)
-{
-	CloogStride *s = cloog_stride_malloc();
-
-	cloog_int_set(s->stride, stride);
-	cloog_int_set(s->factor, factor);
-	cloog_int_set_si(s->offset, -1);
-	s->constraint = constraint;
-
-	return s;
-}
-
-CloogStride *cloog_stride_copy(CloogStride *stride)
-{
-	if (!stride)
-		return stride;
-
-	stride->references++;
-	return stride;
-}
-
-void cloog_stride_free(CloogStride *stride)
-{
-	if (!stride)
-		return;
-
-	stride->references--;
-	if (stride->references > 0)
-		return;
-
-	cloog_int_clear(stride->stride);
-	cloog_int_clear(stride->offset);
-	cloog_int_clear(stride->factor);
-	cloog_constraint_release(stride->constraint);
-	free(stride);
-}
diff --git a/cloog-0.17.0/source/union_domain.c b/cloog-0.17.0/source/union_domain.c
deleted file mode 100644
index 0d24658..0000000
--- a/cloog-0.17.0/source/union_domain.c
+++ /dev/null
@@ -1,366 +0,0 @@
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include "../include/cloog/cloog.h"
-
-#ifdef OSL_SUPPORT
-#include <osl/strings.h>
-#include <osl/extensions/scatnames.h>
-#include <osl/statement.h>
-#include <osl/scop.h>
-#endif
-
-#define ALLOC(type) (type*)malloc(sizeof(type))
-#define ALLOCN(type,n) (type*)malloc((n)*sizeof(type))
-
-void cloog_named_domain_list_free(CloogNamedDomainList *list)
-{
-	while (list != NULL) {
-		CloogNamedDomainList *temp = list->next;
-		cloog_domain_free(list->domain);
-		cloog_scattering_free(list->scattering);
-		free(list->name);
-		free(list);
-		list = temp;
-	}
-}
-
-CloogUnionDomain *cloog_union_domain_alloc(int nb_par)
-{
-	CloogUnionDomain *ud;
-
-	ud = ALLOC(CloogUnionDomain);
-	if (!ud)
-		cloog_die("memory overflow.\n");
-
-	ud->domain = NULL;
-	ud->next_domain = &ud->domain;
-	
-	ud->n_name[CLOOG_PARAM] = nb_par;
-	ud->n_name[CLOOG_ITER] = 0;
-	ud->n_name[CLOOG_SCAT] = 0;
-
-	ud->name[CLOOG_PARAM] = NULL;
-	ud->name[CLOOG_ITER] = NULL;
-	ud->name[CLOOG_SCAT] = NULL;
-
-	return ud;
-}
-
-void cloog_union_domain_free(CloogUnionDomain *ud)
-{
-	int i;
-	int j;
-
-	if (!ud)
-		return;
-
-	for (i = 0; i < 3; ++i) {
-		if (!ud->name[i])
-			continue;
-		for (j = 0; j < ud->n_name[i]; ++i)
-			free(ud->name[i][j]);
-		free(ud->name[i]);
-	}
-
-	cloog_named_domain_list_free(ud->domain);
-
-	free(ud);
-}
-
-/**
- * Add a domain with scattering function to the union of domains.
- * name may be NULL and is duplicated if it is not.
- * domain and scattering are taken over by the CloogUnionDomain.
- * scattering may be NULL.
- */
-CloogUnionDomain *cloog_union_domain_add_domain(CloogUnionDomain *ud,
-	const char *name, CloogDomain *domain, CloogScattering *scattering,
-	void *usr)
-{
-	CloogNamedDomainList *named;
-	int n;
-
-	if (!ud)
-		return NULL;
-
-	named = ALLOC(CloogNamedDomainList);
-	if (!named)
-		cloog_die("memory overflow.\n");
-
-	if (ud->name[CLOOG_ITER])
-		cloog_die("iterator names must be set after adding domains.\n");
-	if (ud->name[CLOOG_SCAT])
-		cloog_die("scattering names must be set after adding domains.\n");
-
-	n = cloog_domain_dimension(domain);
-	if (n > ud->n_name[CLOOG_ITER])
-		ud->n_name[CLOOG_ITER] = n;
-
-	if (scattering) {
-		n = cloog_scattering_dimension(scattering, domain);
-		if (n > ud->n_name[CLOOG_SCAT])
-			ud->n_name[CLOOG_SCAT] = n;
-	}
-
-	named->domain = domain;
-	named->scattering = scattering;
-	named->name = name ? strdup(name) : NULL;
-	named->usr = usr;
-	named->next = NULL;
-
-	*ud->next_domain = named;
-	ud->next_domain = &named->next;
-
-	return ud;
-}
-
-/**
- * Set the name of parameter, iterator or scattering dimension
- * at the specified position.  The name is duplicated.
- */
-CloogUnionDomain *cloog_union_domain_set_name(CloogUnionDomain *ud,
-	enum cloog_dim_type type, int index, const char *name)
-{
-	int i;
-
-	if (!ud)
-		return ud;
-
-	if (type != CLOOG_PARAM &&
-	    type != CLOOG_ITER &&
-	    type != CLOOG_SCAT)
-		cloog_die("invalid dim type\n");
-
-	if (index < 0 || index >= ud->n_name[type])
-		cloog_die("index out of range\n");
-
-	if (!ud->name[type]) {
-		ud->name[type] = ALLOCN(char *, ud->n_name[type]);
-		if (!ud->name[type])
-			cloog_die("memory overflow.\n");
-		for (i = 0; i < ud->n_name[type]; ++i)
-			ud->name[type][i] = NULL;
-	}
-
-	free(ud->name[type][index]);
-	ud->name[type][index] = strdup(name);
-	if (!ud->name[type][index])
-		cloog_die("memory overflow.\n");
-
-	return ud;
-}
-
-static char *next_line(FILE *input, char *line, unsigned len)
-{
-	char *p;
-
-	do {
-		if (!(p = fgets(line, len, input)))
-			return NULL;
-		while (isspace(*p) && *p != '\n')
-			++p;
-	} while (*p == '#' || *p == '\n');
-
-	return p;
-}
-
-/**
- * cloog_scattering_list_read
- * Read in a list of scattering functions for the nb_statements
- * domains in loop.
- */
-static CloogScatteringList *cloog_scattering_list_read(FILE * foo,
-	CloogDomain **domain, int nb_statements, int nb_parameters)
-{
-    int nb_scat = 0;
-    char s[MAX_STRING];
-    CloogScatteringList *list = NULL, **next = &list;
-
-    /* We read first the number of scattering functions in the list. */
-    do {
-	if (!fgets(s, MAX_STRING, foo))
-	    break;
-    } while ((*s=='#' || *s=='\n') || (sscanf(s, " %d", &nb_scat) < 1));
-
-    if (nb_scat == 0)
-	return NULL;
-
-    if (nb_scat != nb_statements)
-	cloog_die("wrong number of scattering functions.\n");
-
-    while (nb_scat--) {
-	*next = (CloogScatteringList *)malloc(sizeof(CloogScatteringList));
-	(*next)->scatt = cloog_domain_read_scattering(*domain, foo);
-	(*next)->next = NULL;
-
-	next = &(*next)->next;
-	domain++;
-    }
-    return list;
-}
-
-static CloogUnionDomain *set_names_from_list(CloogUnionDomain *ud,
-	enum cloog_dim_type type, int n, char **names)
-{
-	int i;
-
-	if (!names)
-		return ud;
-
-	for (i = 0; i < n; ++i) {
-		ud = cloog_union_domain_set_name(ud, type, i, names[i]);
-		free(names[i]);
-	}
-	free(names);
-
-	return ud;
-}
-
-/**
- * Fill up a CloogUnionDomain from information in a CLooG input file.
- * The language and the context are assumed to have been read from
- * the input file already.
- */
-CloogUnionDomain *cloog_union_domain_read(FILE *file, int nb_par,
-	CloogOptions *options)
-{
-	int op1, op2, op3;
-	char line[MAX_STRING];
-	CloogDomain **domain;
-	CloogUnionDomain *ud;
-	CloogScatteringList *scatteringl;
-	int i;
-	int n_iter = -1;
-	int n_dom;
-	char **names;
-
-	ud = cloog_union_domain_alloc(nb_par);
-
-	names = cloog_names_read_strings(file, nb_par);
-	ud = set_names_from_list(ud, CLOOG_PARAM, nb_par, names);
-
-	/* We read the number of statements. */
-	if (!next_line(file, line, sizeof(line)))
-		cloog_die("Input error.\n");
-	if (sscanf(line, "%d", &n_dom) != 1)
-		cloog_die("Input error.\n");
-
-	domain = ALLOCN(CloogDomain *, n_dom);
-	if (!domain)
-		cloog_die("memory overflow.\n");
-
-	for (i = 0; i < n_dom; ++i) {
-		int dim;
-
-		domain[i] = cloog_domain_union_read(options->state, file,
-						    nb_par);
-		dim = cloog_domain_dimension(domain[i]);
-		if (dim > n_iter)
-			n_iter = dim;
-
-		/* To read that stupid "0 0 0" line. */
-		if (!next_line(file, line, sizeof(line)))
-			cloog_die("Input error.\n");
-		if (sscanf(line, " %d %d %d", &op1, &op2, &op3) != 3)
-			cloog_die("Input error.\n");
-	}
-        
-	/* Reading of the iterator names. */
-	names = cloog_names_read_strings(file, n_iter);
-
-	/* Reading and putting the scattering data in program structure. */
-	scatteringl = cloog_scattering_list_read(file, domain, n_dom, nb_par);
-
-	if (scatteringl) {
-		CloogScatteringList *is, *next;
-
-		if (cloog_scattering_list_lazy_same(scatteringl))
-			cloog_msg(options, CLOOG_WARNING,
-				  "some scattering functions are similar.\n");
-		
-		for (i = 0, is = scatteringl; i < n_dom; ++i, is = next) {
-			next = is->next;
-			ud = cloog_union_domain_add_domain(ud, NULL, domain[i],
-							      is->scatt, NULL);
-			free(is);
-		}
-	} else {
-		for (i = 0; i < n_dom; ++i)
-			ud = cloog_union_domain_add_domain(ud, NULL, domain[i],
-								NULL, NULL);
-	}
-
-	ud = set_names_from_list(ud, CLOOG_ITER, n_iter, names);
-
-	if (scatteringl) {
-		int n_scat = ud->n_name[CLOOG_SCAT];
-		names = cloog_names_read_strings(file, n_scat);
-		ud = set_names_from_list(ud, CLOOG_SCAT, n_scat, names);
-	}
-
-	free(domain);
-
-	return ud;
-}
-
-
-#ifdef OSL_SUPPORT
-/**
- * Extracts a CloogUnionDomain from an openscop scop (the CloogUnionDomain
- * corresponds more or less to the openscop statement).
- * \param[in,out] state CLooG state.
- * \param[in]     scop  OpenScop scop to convert.
- * \return A new CloogUnionDomain corresponding the input OpenScop scop.
- */
-CloogUnionDomain *cloog_union_domain_from_osl_scop(CloogState *state,
-                                                   osl_scop_p scop) {
-  int i, nb_parameters;
-  CloogDomain *domain = NULL;
-  CloogScattering *scattering = NULL;
-  CloogUnionDomain *ud = NULL;
-  osl_scop_p normalized;
-  osl_statement_p statement;
-  osl_scatnames_p scatnames;
-
-  /* Set the union of domains. */
-  nb_parameters = (scop->context == NULL) ? 0 : scop->context->nb_parameters;
-  ud = cloog_union_domain_alloc(nb_parameters);
-
-  /* - Set the parameter names. */
-  if (osl_generic_has_URI(scop->parameters, OSL_URI_STRINGS)) {
-    for (i = 0; i < osl_strings_size(scop->parameters->data); i++) {
-      ud = cloog_union_domain_set_name(ud, CLOOG_PARAM, i,
-        ((osl_strings_p)(scop->parameters->data))->string[i]);
-    }
-  }
-
-  /* - Set each statement (domain/scattering).
-   *   Since CLooG requires all number of scattering dimensions to be
-   *   equal, we normalize them first.
-   */
-  normalized = osl_scop_clone(scop);
-  osl_scop_normalize_scattering(normalized);
-  statement = normalized->statement;
-  while(statement != NULL) {
-    domain = cloog_domain_from_osl_relation(state, statement->domain);
-    scattering = cloog_scattering_from_osl_relation(state,
-                                                    statement->scattering);
-    ud = cloog_union_domain_add_domain(ud, NULL, domain, scattering, NULL);
-    statement = statement->next;
-  }
-  osl_scop_free(normalized);
-
-  /* - Set the scattering dimension names. */
-  scatnames = osl_generic_lookup(scop->extension, OSL_URI_SCATNAMES);
-  if ((scatnames != NULL) && (scatnames->names != NULL)) {
-    for (i = 0; (i < osl_strings_size(scatnames->names)) &&
-                (i < ud->n_name[CLOOG_SCAT]); i++) {
-      ud = cloog_union_domain_set_name(ud, CLOOG_SCAT, i,
-                                       scatnames->names->string[i]);
-    }
-  }
-
-  return ud;
-}
-#endif
diff --git a/cloog-0.17.0/source/version.c b/cloog-0.17.0/source/version.c
deleted file mode 100644
index f1b86e2..0000000
--- a/cloog-0.17.0/source/version.c
+++ /dev/null
@@ -1,24 +0,0 @@
-#include "version.h"
-#include "cloog/version.h"
-
-#define CLOOG_BITS "gmp"
-
-const char *cloog_version(void)
-{
-  return "CLooG "CLOOG_HEAD" "CLOOG_BITS" bits";
-}
-
-int cloog_version_major(void)
-{
-  return CLOOG_VERSION_MAJOR;
-}
-
-int cloog_version_minor(void)
-{
-  return CLOOG_VERSION_MINOR;
-}
-
-int cloog_version_revision(void)
-{
-  return CLOOG_VERSION_REVISION;
-}
diff --git a/cloog-0.17.0/source/version.c.in b/cloog-0.17.0/source/version.c.in
deleted file mode 100644
index f5d026e..0000000
--- a/cloog-0.17.0/source/version.c.in
+++ /dev/null
@@ -1,24 +0,0 @@
-#include "version.h"
-#include "cloog/version.h"
-
-#define CLOOG_BITS "@BITS@"
-
-const char *cloog_version(void)
-{
-  return "CLooG "CLOOG_HEAD" "CLOOG_BITS" bits";
-}
-
-int cloog_version_major(void)
-{
-  return CLOOG_VERSION_MAJOR;
-}
-
-int cloog_version_minor(void)
-{
-  return CLOOG_VERSION_MINOR;
-}
-
-int cloog_version_revision(void)
-{
-  return CLOOG_VERSION_REVISION;
-}
diff --git a/cloog-0.17.0/test/0D-1.c b/cloog-0.17.0/test/0D-1.c
deleted file mode 100644
index 7f24623..0000000
--- a/cloog-0.17.0/test/0D-1.c
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Generated from ../../../git/cloog/test/0D-1.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-S1() ;
diff --git a/cloog-0.17.0/test/0D-1.cloog b/cloog-0.17.0/test/0D-1.cloog
deleted file mode 100644
index 226e7cb..0000000
--- a/cloog-0.17.0/test/0D-1.cloog
+++ /dev/null
@@ -1,13 +0,0 @@
-c
-
-0 2
-0
-
-1
-
-1
-0 2
-0 0 0
-0
-
-0
diff --git a/cloog-0.17.0/test/0D-1.good.c b/cloog-0.17.0/test/0D-1.good.c
deleted file mode 100644
index 0a37a56..0000000
--- a/cloog-0.17.0/test/0D-1.good.c
+++ /dev/null
@@ -1,15 +0,0 @@
-/* Generated from ../../../git/cloog/test/0D-1.cloog by CLooG 0.14.0-117-g5444fca gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1() { hash(1); }
-
-void test()
-{
-  S1() ;
-}
diff --git a/cloog-0.17.0/test/0D-2.c b/cloog-0.17.0/test/0D-2.c
deleted file mode 100644
index 4aa9c17..0000000
--- a/cloog-0.17.0/test/0D-2.c
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Generated from ../../../git/cloog/test/0D-2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-if (M >= 0) {
-  S1() ;
-}
diff --git a/cloog-0.17.0/test/0D-2.cloog b/cloog-0.17.0/test/0D-2.cloog
deleted file mode 100644
index 69f2015..0000000
--- a/cloog-0.17.0/test/0D-2.cloog
+++ /dev/null
@@ -1,14 +0,0 @@
-c
-
-0 3
-0
-
-1
-
-1
-1 3
-1 1 0
-0 0 0
-0
-
-0
diff --git a/cloog-0.17.0/test/0D-2.good.c b/cloog-0.17.0/test/0D-2.good.c
deleted file mode 100644
index 65a12c6..0000000
--- a/cloog-0.17.0/test/0D-2.good.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Generated from ../../../git/cloog/test/0D-2.cloog by CLooG 0.14.0-117-g5444fca gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1() { hash(1); }
-
-void test(int M)
-{
-  if (M >= 0) {
-    S1() ;
-  }
-}
diff --git a/cloog-0.17.0/test/0D-3.c b/cloog-0.17.0/test/0D-3.c
deleted file mode 100644
index 62b4269..0000000
--- a/cloog-0.17.0/test/0D-3.c
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Generated from ../../../git/cloog/test/0D-3.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-S1() ;
diff --git a/cloog-0.17.0/test/0D-3.cloog b/cloog-0.17.0/test/0D-3.cloog
deleted file mode 100644
index ab4d59c..0000000
--- a/cloog-0.17.0/test/0D-3.cloog
+++ /dev/null
@@ -1,15 +0,0 @@
-c
-
-1 3
-1 1 0
-0
-
-1
-
-1
-1 3
-1 1 0
-0 0 0
-0
-
-0
diff --git a/cloog-0.17.0/test/0D-3.good.c b/cloog-0.17.0/test/0D-3.good.c
deleted file mode 100644
index 10150eb..0000000
--- a/cloog-0.17.0/test/0D-3.good.c
+++ /dev/null
@@ -1,15 +0,0 @@
-/* Generated from ../../../git/cloog/test/0D-3.cloog by CLooG 0.14.0-117-g5444fca gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1() { hash(1); }
-
-void test(int M)
-{
-  S1() ;
-}
diff --git a/cloog-0.17.0/test/1point-1.c b/cloog-0.17.0/test/1point-1.c
deleted file mode 100644
index 7c0106b..0000000
--- a/cloog-0.17.0/test/1point-1.c
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Generated from ../../../git/cloog/test/1point-1.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-S1(2*M,M) ;
diff --git a/cloog-0.17.0/test/1point-1.cloog b/cloog-0.17.0/test/1point-1.cloog
deleted file mode 100644
index 318d89b..0000000
--- a/cloog-0.17.0/test/1point-1.cloog
+++ /dev/null
@@ -1,23 +0,0 @@
-# language: C
-c
-
-# Context
-#{M | }
-1 3
-# M 1
-1 0 1
-0
-
-1 # Number of statements
-
-1
-#{i, j | i=2N; i=2j}
-3 5
-#  i  j  M  1
-0  1  0 -2  0
-0  1 -2  0  0
-1  0  0  0  1
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/1point-1.good.c b/cloog-0.17.0/test/1point-1.good.c
deleted file mode 100644
index 196f8a9..0000000
--- a/cloog-0.17.0/test/1point-1.good.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Generated from ../../../git/cloog/test/1point-1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j;
-  i = 2*M ;
-  S1(2*M,M) ;
-}
diff --git a/cloog-0.17.0/test/1point-2.c b/cloog-0.17.0/test/1point-2.c
deleted file mode 100644
index 48f6ad4..0000000
--- a/cloog-0.17.0/test/1point-2.c
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Generated from ../../../git/cloog/test/1point-2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-S1(2*M,N+2) ;
diff --git a/cloog-0.17.0/test/1point-2.cloog b/cloog-0.17.0/test/1point-2.cloog
deleted file mode 100644
index 66eec58..0000000
--- a/cloog-0.17.0/test/1point-2.cloog
+++ /dev/null
@@ -1,23 +0,0 @@
-# language: C
-c
-
-# Context
-#{M,N | }
-1 4
-# M N 1
-1 0 0 1
-0
-
-1 # Number of statements
-
-1
-#
-3 6
-#  i  j  M  N  1
-0  1  0 -2  0  0
-0  2 -2 -4  2  4
-1  0  0  0  0  1
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/1point-2.good.c b/cloog-0.17.0/test/1point-2.good.c
deleted file mode 100644
index 9880504..0000000
--- a/cloog-0.17.0/test/1point-2.good.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated from ../../../git/cloog/test/1point-2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i, j;
-  i = 2*M ;
-  j = N+2 ;
-  S1(2*M,N+2) ;
-}
diff --git a/cloog-0.17.0/test/4-param.c b/cloog-0.17.0/test/4-param.c
deleted file mode 100644
index b542796..0000000
--- a/cloog-0.17.0/test/4-param.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Generated from ../../../git/cloog/test/4-param.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.18s. */
-for (i=m;i<=min(n,p-1);i++) {
-  S1(i) ;
-}
-for (i=p;i<=min(q,m-1);i++) {
-  S2(i) ;
-}
-for (i=max(m,p);i<=min(n,q);i++) {
-  S1(i) ;
-  S2(i) ;
-}
-for (i=max(max(m,p),q+1);i<=n;i++) {
-  S1(i) ;
-}
-for (i=max(max(m,p),n+1);i<=q;i++) {
-  S2(i) ;
-}
diff --git a/cloog-0.17.0/test/4-param.cloog b/cloog-0.17.0/test/4-param.cloog
deleted file mode 100644
index a19ba08..0000000
--- a/cloog-0.17.0/test/4-param.cloog
+++ /dev/null
@@ -1,33 +0,0 @@
-# language: C
-c
-
-# Context
-# parameters m n p q
-1 6
-# m n p q 1
-1 0 0 0 0 1
-1
-m n p q
-
-2 # Number of statements
-
-1
-# S1 i,...
-3 7
-#  i  m  n  p  q  1
-1  1 -1  0  0  0  0
-1 -1  0  1  0  0  0
-1  0  0  0  0  0  1
-0  0  0
-
-1
-#
-3 7
-#  i  m  n  p  q  1
-1  1  0  0 -1  0  0
-1 -1  0  0  0  1  0
-1  0  0  0  0  0  1
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/4-param.good.c b/cloog-0.17.0/test/4-param.good.c
deleted file mode 100644
index 563b90b..0000000
--- a/cloog-0.17.0/test/4-param.good.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Generated from ../../../git/cloog/test/4-param.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i) { hash(2); hash(i); }
-
-void test(int m, int n, int p, int q)
-{
-  /* Original iterators. */
-  int i;
-  for (i=m;i<=min(min(n,p-1),q);i++) {
-    S1(i) ;
-  }
-  for (i=p;i<=min(min(q,m-1),n);i++) {
-    S2(i) ;
-  }
-  for (i=max(m,p);i<=min(n,q);i++) {
-    S1(i) ;
-    S2(i) ;
-  }
-  for (i=max(m,q+1);i<=n;i++) {
-    S1(i) ;
-  }
-  for (i=max(p,n+1);i<=q;i++) {
-    S2(i) ;
-  }
-}
diff --git a/cloog-0.17.0/test/Makefile.am b/cloog-0.17.0/test/Makefile.am
deleted file mode 100644
index 65a8e5a..0000000
--- a/cloog-0.17.0/test/Makefile.am
+++ /dev/null
@@ -1,345 +0,0 @@
-#
-#   /**-------------------------------------------------------------------**
-#    **                              CLooG                                **
-#    **-------------------------------------------------------------------**
-#    **                            makefile                               **
-#    **-------------------------------------------------------------------**
-#    **                   First version: march 6th 2003                   **
-#    **-------------------------------------------------------------------**/
-#
-# makefile for checking.
-
-#/*****************************************************************************
-# *               CLooG : the Chunky Loop Generator (experimental)            *
-# *****************************************************************************
-# *                                                                           *
-# * Copyright (C) 2003 Cedric Bastoul                                         *
-# *                                                                           *
-# * This library is free software; you can redistribute it and/or             *
-# * modify it under the terms of the GNU Lesser General Public                *
-# * License as published by the Free Software Foundation; either              *
-# * version 2.1 of the License, or (at your option) any later version.        *
-# *                                                                           *
-# * This library is distributed in the hope that it will be useful,           *
-# * but WITHOUT ANY WARRANTY; without even the implied warranty of            *
-# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
-# * Lesser General Public License for more details.                           *
-# *                                                                           *
-# * You should have received a copy of the GNU Lesser General Public          *
-# * License along with this library; if not, write to the Free Software       *
-# * Foundation, Inc., 51 Franklin Street, Fifth Floor,                        *
-# * Boston, MA  02110-1301  USA                                               *
-# *                                                                           *
-# * CLooG, the Chunky Loop Generator                                          *
-# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                        *
-# * This file has been written with the help of the Bart Kienhuis's checking  *
-# * makefile for PipLib.                                                      *
-# *                                                                           *
-# *****************************************************************************/
-
-if NO_ISL
-GENERATE_TEST =
-else
-GENERATE_TEST = generate_test
-endif
-noinst_PROGRAMS = $(GENERATE_TEST)
-INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include
-LDADD = ../libcloog-isl.la
-generate_test_SOURCES = generate_test.c
-
-FORCE:
-../libcloog-isl.la: FORCE
-	cd ..; $(MAKE) $(AM_MAKEFLAGS) libcloog-isl.la
-
-ROOT = ..
-
-FINITE_CLOOGTEST_C = \
-	0D-1 \
-	0D-2 \
-	0D-3 \
-	1point-1 \
-	1point-2 \
-	4-param \
-	basic-bounds-1 \
-	basic-bounds-2 \
-	basic-bounds-3 \
-	basic-bounds-4 \
-	basic-bounds-5 \
-	basic-bounds-6 \
-	block \
-	block2 \
-	block3 \
-	byu98-1-2-3 \
-	cholesky \
-	cholesky2 \
-	christian \
-	classen \
-	classen2 \
-	constant \
-	constbound \
-	darte \
-	dealII \
-	donotsimp \
-	dot \
-	dot2 \
-	double \
-	durbin_e_s \
-	emploi \
-	esced \
-	ex1 \
-	forwardsub-1-1-2 \
-	forwardsub-2-1-2-3 \
-	forwardsub-3-1-2 \
-	gauss \
-	gesced \
-	gesced2 \
-	gesced3 \
-	guide \
-	iftest \
-	iftest2 \
-	largeur \
-	levenshtein-1-2-3 \
-	lex \
-	lineality-1-2 \
-	lineality-2-1-2 \
-	logo \
-	logopar \
-	lu \
-	lu2 \
-	lub \
-	lux \
-	min-1-1 \
-	min-2-1 \
-	min-3-1 \
-	min-4-1 \
-	mode \
-	multi-mm-1 \
-	no_lindep \
-	orc \
-	rectangle \
-	singleton \
-	square+triangle-1-1-2-3 \
-	swim \
-	test \
-	thomasset \
-	tiling \
-	uday_scalars \
-	union \
-	vivien \
-	vivien2 \
-	walters \
-	walters2 \
-	walters3 \
-	wavefront \
-	yosr \
-	yosr2 \
-	non_optimal/nul_complex1 \
-	non_optimal/usvd_e_t \
-	non_optimal/youcef \
-	reservoir/cholesky2 \
-	reservoir/fusion1 \
-	reservoir/fusion2 \
-	reservoir/jacobi2 \
-	reservoir/jacobi3 \
-	reservoir/lim-lam1 \
-	reservoir/lim-lam2 \
-	reservoir/lim-lam3 \
-	reservoir/lim-lam4 \
-	reservoir/lim-lam5 \
-	reservoir/lim-lam6 \
-	reservoir/liu-zhuge1 \
-	reservoir/loechner3 \
-	reservoir/loechner4 \
-	reservoir/loechner5 \
-	reservoir/mg-interp2 \
-	reservoir/mg-interp \
-	reservoir/mg-psinv \
-	reservoir/mg-resid \
-	reservoir/mg-rprj3 \
-	reservoir/pingali1 \
-	reservoir/pingali2 \
-	reservoir/pingali3 \
-	reservoir/pingali4 \
-	reservoir/pingali5 \
-	reservoir/pingali6 \
-	reservoir/QR \
-	reservoir/tang-xue1 \
-	reservoir/two
-
-CLOOG_ISL_TEST_C = \
-	isl/mod \
-	isl/mod2 \
-	isl/mod3 \
-	isl/mod4
-
-CLOOGTEST_C = \
-	infinite \
-	infinite2 \
-	infinite3 \
-	infinite4 \
-	$(FINITE_CLOOGTEST_C) \
-	$(CLOOG_ISL_TEST_C)
-
-CLOOGTEST_FORTRAN = \
-	dartef \
-	iftestf \
-	levenshtein-1-2-3f \
-	yosrf
-
-CLOOG_ISL_TEST_STRIDED = \
-	isl/mxm-shared
-
-CLOOGTEST_STRIDED = \
-	basic-bounds-2 \
-	mod4 \
-	nul_basic1 \
-	nul_basic2 \
-	nul_lcpc \
-	multi-stride \
-	multi-stride2 \
-	stride3 \
-	stride4 \
-	reservoir/bastoul3 \
-	reservoir/stride \
-	reservoir/stride2 \
-	$(CLOOG_ISL_TEST_STRIDED)
-
-if NO_OSL
-CLOOGTEST_OPENSCOP =
-else
-CLOOGTEST_OPENSCOP = \
-	openscop/matmult \
-	openscop/empty \
-	openscop/union
-endif
-
-SPECIAL_TESTS = \
-	isl/unroll \
-	isl/jacobi-shared \
-	isl/unroll2 \
-	backtrack \
-	vasilache \
-	merge \
-	equality \
-	equality2 \
-	otl \
-	param-split \
-	pouchet \
-	stride \
-	stride2 \
-	sor1d
-
-SPECIAL_OPTIONS = \
-	'isl/unroll -first-unroll 1' \
-	'isl/jacobi-shared -f 4 -l -1 -override -strides 1 -sh 1' \
-	'isl/unroll2 -first-unroll 1' \
-	'backtrack -f 1 -backtrack' \
-	'vasilache -f 8 -l 9' \
-	'merge -f -1' \
-	'equality -f -1 -l 2 -override' \
-	'equality2 -f -1 -l 4 -esp 1 -override' \
-	'otl -block 1 -esp 0 -otl 0' \
-	'param-split -f -1' \
-	'pouchet -f 3 -l 7' \
-	'stride -f -1 -strides 1' \
-	'stride2 -f -1 -strides 1' \
-	'sor1d -f -1'
-
-generate:
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *                 Generate files                *"
-	@echo "              *-----------------------------------------------*/"
-	@for x in $(CLOOGTEST_C) ; do \
-		echo "Generate $$x.c" ; \
-		$(top_builddir)/cloog $(srcdir)/$$x.cloog -o $(srcdir)/$$x.c ; \
-	done ; \
-	for x in $(CLOOGTEST_FORTRAN) ; do \
-		echo "Generate $$x.f" ; \
-		$(top_builddir)/cloog $(srcdir)/$$x.cloog -o $(srcdir)/$$x.f ; \
-	done ; \
-	for x in $(CLOOGTEST_STRIDED) ; do \
-		echo "Generate $$x.c" ; \
-		$(top_builddir)/cloog $(srcdir)/$$x.cloog \
-			-strides 1 -o $(srcdir)/$$x.c ; \
-	done ; \
-	for x in $(CLOOGTEST_OPENSCOP) ; do \
-		echo "Generate $$x.c" ; \
-		$(top_builddir)/cloog $(srcdir)/$$x.scop \
-		-openscop -o $(srcdir)/$$x.c ; \
-	done ; \
-	for line in $(SPECIAL_OPTIONS); do \
-		options=`echo $$line | sed -e 's/^[^ ]* //'`; \
-		x=`echo $$line | sed -e 's/ .*//'`; \
-		echo "Generate file $$x ($$options)" ; \
-		$(top_builddir)/cloog$(EXEEXT) $(srcdir)/$$x.cloog \
-		    $$options > $(srcdir)/$$x.c ; \
-	done
-
-generate_good:
-	@for x in $(FINITE_CLOOGTEST_C) ; do \
-		echo "Generate $$x.good.c" ; \
-		$(top_builddir)/cloog$(EXEEXT) -callable 1 $(srcdir)/$$x.cloog -o $(srcdir)/$$x.good.c ; \
-	done; \
-	for line in $(SPECIAL_OPTIONS); do echo $$line | while read x options; do \
-		echo "Generate $$x.good.c ($$options)" ; \
-		$(top_builddir)/cloog$(EXEEXT) -callable 1 $$options $(srcdir)/$$x.cloog -o $(srcdir)/$$x.good.c ; \
-	done; done
-
-valgrind:
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *            Checking files by Valgrind         *"
-	@echo "              *-----------------------------------------------*/"
-	for x in $(CLOOGTEST_C) ; do \
-		echo "Valgrinding $$x.c" ; \
-		valgrind $(top_builddir)/cloog$(EXEEXT) $(srcdir)/$$x.cloog ; \
-	done ; \
-	for x in $(CLOOGTEST_FORTRAN) ; do \
-		echo "Valgrinding $$x.f" ; \
-		valgrind $(top_builddir)/cloog$(EXEEXT) $(srcdir)/$$x.cloog ; \
-	done
-
-CHECKER := "$(srcdir)/checker.sh"
-
-TESTS_ENVIRONMENT = \
-	top_builddir=$(top_builddir) \
-	srcdir=$(srcdir) \
-	EXEXT=$(EXEEXT) \
-	CHECKER=$(CHECKER) \
-	COMPILE="$(COMPILE)" \
-	LINK="$(LINK)" \
-	FINITE_CLOOGTEST_C="$(FINITE_CLOOGTEST_C)" \
-	CLOOGTEST_C="$(CLOOGTEST_C)" \
-	CLOOGTEST_FORTRAN="$(CLOOGTEST_FORTRAN)" \
-	CLOOGTEST_STRIDED="$(CLOOGTEST_STRIDED)" \
-	CLOOGTEST_OPENSCOP="$(CLOOGTEST_OPENSCOP)" \
-	SPECIAL_OPTIONS="$(SPECIAL_OPTIONS)"
-
-test_run: generate_test$(EXEEXT)
-	$(TESTS_ENVIRONMENT) \
-	$(srcdir)/check_run.sh
-
-check_SCRIPTS = \
-	$(srcdir)/check_c.sh \
-	$(srcdir)/check_fortran.sh \
-	$(srcdir)/check_strided.sh \
-	$(srcdir)/check_openscop.sh \
-	$(srcdir)/check_special.sh
-
-TESTS = $(check_SCRIPTS)
-
-EXTRA_DIST = \
-	$(check_SCRIPTS) \
-	$(srcdir)/checker.sh \
-	$(srcdir)/check_run.sh \
-	$(CLOOGTEST_C:%=%.cloog) \
-	$(CLOOGTEST_C:%=%.c) \
-	$(FINITE_CLOOGTEST_C:%=%.good.c) \
-	$(CLOOGTEST_FORTRAN:%=%.cloog) \
-	$(CLOOGTEST_FORTRAN:%=%.f) \
-	$(CLOOGTEST_STRIDED:%=%.cloog) \
-	$(CLOOGTEST_STRIDED:%=%.c) \
-	$(CLOOGTEST_OPENSCOP:%=%.scop) \
-	$(CLOOGTEST_OPENSCOP:%=%.c) \
-	$(SPECIAL_TESTS:%=%.cloog) \
-	$(SPECIAL_TESTS:%=%.c) \
-	$(SPECIAL_TESTS:%=%.good.c)
diff --git a/cloog-0.17.0/test/Makefile.in b/cloog-0.17.0/test/Makefile.in
deleted file mode 100644
index 2a971ce..0000000
--- a/cloog-0.17.0/test/Makefile.in
+++ /dev/null
@@ -1,945 +0,0 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
-# Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-#
-#   /**-------------------------------------------------------------------**
-#    **                              CLooG                                **
-#    **-------------------------------------------------------------------**
-#    **                            makefile                               **
-#    **-------------------------------------------------------------------**
-#    **                   First version: march 6th 2003                   **
-#    **-------------------------------------------------------------------**/
-#
-# makefile for checking.
-
-#/*****************************************************************************
-# *               CLooG : the Chunky Loop Generator (experimental)            *
-# *****************************************************************************
-# *                                                                           *
-# * Copyright (C) 2003 Cedric Bastoul                                         *
-# *                                                                           *
-# * This library is free software; you can redistribute it and/or             *
-# * modify it under the terms of the GNU Lesser General Public                *
-# * License as published by the Free Software Foundation; either              *
-# * version 2.1 of the License, or (at your option) any later version.        *
-# *                                                                           *
-# * This library is distributed in the hope that it will be useful,           *
-# * but WITHOUT ANY WARRANTY; without even the implied warranty of            *
-# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
-# * Lesser General Public License for more details.                           *
-# *                                                                           *
-# * You should have received a copy of the GNU Lesser General Public          *
-# * License along with this library; if not, write to the Free Software       *
-# * Foundation, Inc., 51 Franklin Street, Fifth Floor,                        *
-# * Boston, MA  02110-1301  USA                                               *
-# *                                                                           *
-# * CLooG, the Chunky Loop Generator                                          *
-# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                        *
-# * This file has been written with the help of the Bart Kienhuis's checking  *
-# * makefile for PipLib.                                                      *
-# *                                                                           *
-# *****************************************************************************/
-
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-noinst_PROGRAMS = $(am__EXEEXT_1)
-subdir = test
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cc_maxopt.m4 \
-	$(top_srcdir)/m4/ax_cflags_warn_all.m4 \
-	$(top_srcdir)/m4/ax_check_compiler_flags.m4 \
-	$(top_srcdir)/m4/ax_compiler_vendor.m4 \
-	$(top_srcdir)/m4/ax_create_pkgconfig_info.m4 \
-	$(top_srcdir)/m4/ax_gcc_archflag.m4 \
-	$(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \
-	$(top_srcdir)/m4/ax_submodule.m4 $(top_srcdir)/m4/libtool.m4 \
-	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-@NO_ISL_FALSE@am__EXEEXT_1 = generate_test$(EXEEXT)
-PROGRAMS = $(noinst_PROGRAMS)
-am_generate_test_OBJECTS = generate_test.$(OBJEXT)
-generate_test_OBJECTS = $(am_generate_test_OBJECTS)
-generate_test_LDADD = $(LDADD)
-generate_test_DEPENDENCIES = ../libcloog-isl.la
-AM_V_lt = $(am__v_lt_$(V))
-am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
-am__v_lt_0 = --silent
-DEFAULT_INCLUDES = -I.@am__isrc@
-depcomp = $(SHELL) $(top_srcdir)/autoconf/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_$(V))
-am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
-am__v_CC_0 = @echo "  CC    " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
-CCLD = $(CC)
-LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_$(V))
-am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
-am__v_CCLD_0 = @echo "  CCLD  " $@;
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN   " $@;
-SOURCES = $(generate_test_SOURCES)
-DIST_SOURCES = $(generate_test_SOURCES)
-ETAGS = etags
-CTAGS = ctags
-am__tty_colors = \
-red=; grn=; lgn=; blu=; std=
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-BITS = @BITS@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CD = @CD@
-CFLAGS = @CFLAGS@
-CFLAGS_WARN = @CFLAGS_WARN@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-GIT_INDEX = @GIT_INDEX@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-ISL_CPPFLAGS = @ISL_CPPFLAGS@
-ISL_LDFLAGS = @ISL_LDFLAGS@
-ISL_LIBS = @ISL_LIBS@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OSL_CPPFLAGS = @OSL_CPPFLAGS@
-OSL_LDFLAGS = @OSL_LDFLAGS@
-OSL_LIBS = @OSL_LIBS@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PRTDIAG = @PRTDIAG@
-RANLIB = @RANLIB@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TEXI2DVI = @TEXI2DVI@
-VERSION = @VERSION@
-VERSION_MAJOR = @VERSION_MAJOR@
-VERSION_MINOR = @VERSION_MINOR@
-VERSION_REVISION = @VERSION_REVISION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-pkgconfig_libdir = @pkgconfig_libdir@
-pkgconfig_libfile = @pkgconfig_libfile@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-subdirs = @subdirs@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-versioninfo = @versioninfo@
-@NO_ISL_FALSE@GENERATE_TEST = generate_test
-@NO_ISL_TRUE@GENERATE_TEST = 
-INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include
-LDADD = ../libcloog-isl.la
-generate_test_SOURCES = generate_test.c
-ROOT = ..
-FINITE_CLOOGTEST_C = \
-	0D-1 \
-	0D-2 \
-	0D-3 \
-	1point-1 \
-	1point-2 \
-	4-param \
-	basic-bounds-1 \
-	basic-bounds-2 \
-	basic-bounds-3 \
-	basic-bounds-4 \
-	basic-bounds-5 \
-	basic-bounds-6 \
-	block \
-	block2 \
-	block3 \
-	byu98-1-2-3 \
-	cholesky \
-	cholesky2 \
-	christian \
-	classen \
-	classen2 \
-	constant \
-	constbound \
-	darte \
-	dealII \
-	donotsimp \
-	dot \
-	dot2 \
-	double \
-	durbin_e_s \
-	emploi \
-	esced \
-	ex1 \
-	forwardsub-1-1-2 \
-	forwardsub-2-1-2-3 \
-	forwardsub-3-1-2 \
-	gauss \
-	gesced \
-	gesced2 \
-	gesced3 \
-	guide \
-	iftest \
-	iftest2 \
-	largeur \
-	levenshtein-1-2-3 \
-	lex \
-	lineality-1-2 \
-	lineality-2-1-2 \
-	logo \
-	logopar \
-	lu \
-	lu2 \
-	lub \
-	lux \
-	min-1-1 \
-	min-2-1 \
-	min-3-1 \
-	min-4-1 \
-	mode \
-	multi-mm-1 \
-	no_lindep \
-	orc \
-	rectangle \
-	singleton \
-	square+triangle-1-1-2-3 \
-	swim \
-	test \
-	thomasset \
-	tiling \
-	uday_scalars \
-	union \
-	vivien \
-	vivien2 \
-	walters \
-	walters2 \
-	walters3 \
-	wavefront \
-	yosr \
-	yosr2 \
-	non_optimal/nul_complex1 \
-	non_optimal/usvd_e_t \
-	non_optimal/youcef \
-	reservoir/cholesky2 \
-	reservoir/fusion1 \
-	reservoir/fusion2 \
-	reservoir/jacobi2 \
-	reservoir/jacobi3 \
-	reservoir/lim-lam1 \
-	reservoir/lim-lam2 \
-	reservoir/lim-lam3 \
-	reservoir/lim-lam4 \
-	reservoir/lim-lam5 \
-	reservoir/lim-lam6 \
-	reservoir/liu-zhuge1 \
-	reservoir/loechner3 \
-	reservoir/loechner4 \
-	reservoir/loechner5 \
-	reservoir/mg-interp2 \
-	reservoir/mg-interp \
-	reservoir/mg-psinv \
-	reservoir/mg-resid \
-	reservoir/mg-rprj3 \
-	reservoir/pingali1 \
-	reservoir/pingali2 \
-	reservoir/pingali3 \
-	reservoir/pingali4 \
-	reservoir/pingali5 \
-	reservoir/pingali6 \
-	reservoir/QR \
-	reservoir/tang-xue1 \
-	reservoir/two
-
-CLOOG_ISL_TEST_C = \
-	isl/mod \
-	isl/mod2 \
-	isl/mod3 \
-	isl/mod4
-
-CLOOGTEST_C = \
-	infinite \
-	infinite2 \
-	infinite3 \
-	infinite4 \
-	$(FINITE_CLOOGTEST_C) \
-	$(CLOOG_ISL_TEST_C)
-
-CLOOGTEST_FORTRAN = \
-	dartef \
-	iftestf \
-	levenshtein-1-2-3f \
-	yosrf
-
-CLOOG_ISL_TEST_STRIDED = \
-	isl/mxm-shared
-
-CLOOGTEST_STRIDED = \
-	basic-bounds-2 \
-	mod4 \
-	nul_basic1 \
-	nul_basic2 \
-	nul_lcpc \
-	multi-stride \
-	multi-stride2 \
-	stride3 \
-	stride4 \
-	reservoir/bastoul3 \
-	reservoir/stride \
-	reservoir/stride2 \
-	$(CLOOG_ISL_TEST_STRIDED)
-
-@NO_OSL_FALSE@CLOOGTEST_OPENSCOP = \
-@NO_OSL_FALSE@	openscop/matmult \
-@NO_OSL_FALSE@	openscop/empty \
-@NO_OSL_FALSE@	openscop/union
-
-@NO_OSL_TRUE@CLOOGTEST_OPENSCOP = 
-SPECIAL_TESTS = \
-	isl/unroll \
-	isl/jacobi-shared \
-	isl/unroll2 \
-	backtrack \
-	vasilache \
-	merge \
-	equality \
-	equality2 \
-	otl \
-	param-split \
-	pouchet \
-	stride \
-	stride2 \
-	sor1d
-
-SPECIAL_OPTIONS = \
-	'isl/unroll -first-unroll 1' \
-	'isl/jacobi-shared -f 4 -l -1 -override -strides 1 -sh 1' \
-	'isl/unroll2 -first-unroll 1' \
-	'backtrack -f 1 -backtrack' \
-	'vasilache -f 8 -l 9' \
-	'merge -f -1' \
-	'equality -f -1 -l 2 -override' \
-	'equality2 -f -1 -l 4 -esp 1 -override' \
-	'otl -block 1 -esp 0 -otl 0' \
-	'param-split -f -1' \
-	'pouchet -f 3 -l 7' \
-	'stride -f -1 -strides 1' \
-	'stride2 -f -1 -strides 1' \
-	'sor1d -f -1'
-
-CHECKER := "$(srcdir)/checker.sh"
-TESTS_ENVIRONMENT = \
-	top_builddir=$(top_builddir) \
-	srcdir=$(srcdir) \
-	EXEXT=$(EXEEXT) \
-	CHECKER=$(CHECKER) \
-	COMPILE="$(COMPILE)" \
-	LINK="$(LINK)" \
-	FINITE_CLOOGTEST_C="$(FINITE_CLOOGTEST_C)" \
-	CLOOGTEST_C="$(CLOOGTEST_C)" \
-	CLOOGTEST_FORTRAN="$(CLOOGTEST_FORTRAN)" \
-	CLOOGTEST_STRIDED="$(CLOOGTEST_STRIDED)" \
-	CLOOGTEST_OPENSCOP="$(CLOOGTEST_OPENSCOP)" \
-	SPECIAL_OPTIONS="$(SPECIAL_OPTIONS)"
-
-check_SCRIPTS = \
-	$(srcdir)/check_c.sh \
-	$(srcdir)/check_fortran.sh \
-	$(srcdir)/check_strided.sh \
-	$(srcdir)/check_openscop.sh \
-	$(srcdir)/check_special.sh
-
-TESTS = $(check_SCRIPTS)
-EXTRA_DIST = \
-	$(check_SCRIPTS) \
-	$(srcdir)/checker.sh \
-	$(srcdir)/check_run.sh \
-	$(CLOOGTEST_C:%=%.cloog) \
-	$(CLOOGTEST_C:%=%.c) \
-	$(FINITE_CLOOGTEST_C:%=%.good.c) \
-	$(CLOOGTEST_FORTRAN:%=%.cloog) \
-	$(CLOOGTEST_FORTRAN:%=%.f) \
-	$(CLOOGTEST_STRIDED:%=%.cloog) \
-	$(CLOOGTEST_STRIDED:%=%.c) \
-	$(CLOOGTEST_OPENSCOP:%=%.scop) \
-	$(CLOOGTEST_OPENSCOP:%=%.c) \
-	$(SPECIAL_TESTS:%=%.cloog) \
-	$(SPECIAL_TESTS:%=%.c) \
-	$(SPECIAL_TESTS:%=%.good.c)
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign test/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-clean-noinstPROGRAMS:
-	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
-	echo " rm -f" $$list; \
-	rm -f $$list || exit $$?; \
-	test -n "$(EXEEXT)" || exit 0; \
-	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
-	echo " rm -f" $$list; \
-	rm -f $$list
-generate_test$(EXEEXT): $(generate_test_OBJECTS) $(generate_test_DEPENDENCIES) 
-	@rm -f generate_test$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(generate_test_OBJECTS) $(generate_test_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generate_test.Po@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c $<
-
-.c.obj:
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.c.lo:
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	set x; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-check-TESTS: $(TESTS)
-	@failed=0; all=0; xfail=0; xpass=0; skip=0; \
-	srcdir=$(srcdir); export srcdir; \
-	list=' $(TESTS) '; \
-	$(am__tty_colors); \
-	if test -n "$$list"; then \
-	  for tst in $$list; do \
-	    if test -f ./$$tst; then dir=./; \
-	    elif test -f $$tst; then dir=; \
-	    else dir="$(srcdir)/"; fi; \
-	    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
-	      all=`expr $$all + 1`; \
-	      case " $(XFAIL_TESTS) " in \
-	      *[\ \	]$$tst[\ \	]*) \
-		xpass=`expr $$xpass + 1`; \
-		failed=`expr $$failed + 1`; \
-		col=$$red; res=XPASS; \
-	      ;; \
-	      *) \
-		col=$$grn; res=PASS; \
-	      ;; \
-	      esac; \
-	    elif test $$? -ne 77; then \
-	      all=`expr $$all + 1`; \
-	      case " $(XFAIL_TESTS) " in \
-	      *[\ \	]$$tst[\ \	]*) \
-		xfail=`expr $$xfail + 1`; \
-		col=$$lgn; res=XFAIL; \
-	      ;; \
-	      *) \
-		failed=`expr $$failed + 1`; \
-		col=$$red; res=FAIL; \
-	      ;; \
-	      esac; \
-	    else \
-	      skip=`expr $$skip + 1`; \
-	      col=$$blu; res=SKIP; \
-	    fi; \
-	    echo "$${col}$$res$${std}: $$tst"; \
-	  done; \
-	  if test "$$all" -eq 1; then \
-	    tests="test"; \
-	    All=""; \
-	  else \
-	    tests="tests"; \
-	    All="All "; \
-	  fi; \
-	  if test "$$failed" -eq 0; then \
-	    if test "$$xfail" -eq 0; then \
-	      banner="$$All$$all $$tests passed"; \
-	    else \
-	      if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
-	      banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
-	    fi; \
-	  else \
-	    if test "$$xpass" -eq 0; then \
-	      banner="$$failed of $$all $$tests failed"; \
-	    else \
-	      if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
-	      banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
-	    fi; \
-	  fi; \
-	  dashes="$$banner"; \
-	  skipped=""; \
-	  if test "$$skip" -ne 0; then \
-	    if test "$$skip" -eq 1; then \
-	      skipped="($$skip test was not run)"; \
-	    else \
-	      skipped="($$skip tests were not run)"; \
-	    fi; \
-	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
-	      dashes="$$skipped"; \
-	  fi; \
-	  report=""; \
-	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
-	    report="Please report to $(PACKAGE_BUGREPORT)"; \
-	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
-	      dashes="$$report"; \
-	  fi; \
-	  dashes=`echo "$$dashes" | sed s/./=/g`; \
-	  if test "$$failed" -eq 0; then \
-	    echo "$$grn$$dashes"; \
-	  else \
-	    echo "$$red$$dashes"; \
-	  fi; \
-	  echo "$$banner"; \
-	  test -z "$$skipped" || echo "$$skipped"; \
-	  test -z "$$report" || echo "$$report"; \
-	  echo "$$dashes$$std"; \
-	  test "$$failed" -eq 0; \
-	else :; fi
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-	$(MAKE) $(AM_MAKEFLAGS) $(check_SCRIPTS)
-	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
-check: check-am
-all-am: Makefile $(PROGRAMS)
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
-	mostlyclean-am
-
-distclean: distclean-am
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: check-am install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
-	clean-generic clean-libtool clean-noinstPROGRAMS ctags \
-	distclean distclean-compile distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-ps install-ps-am install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am
-
-
-FORCE:
-../libcloog-isl.la: FORCE
-	cd ..; $(MAKE) $(AM_MAKEFLAGS) libcloog-isl.la
-
-generate:
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *                 Generate files                *"
-	@echo "              *-----------------------------------------------*/"
-	@for x in $(CLOOGTEST_C) ; do \
-		echo "Generate $$x.c" ; \
-		$(top_builddir)/cloog $(srcdir)/$$x.cloog -o $(srcdir)/$$x.c ; \
-	done ; \
-	for x in $(CLOOGTEST_FORTRAN) ; do \
-		echo "Generate $$x.f" ; \
-		$(top_builddir)/cloog $(srcdir)/$$x.cloog -o $(srcdir)/$$x.f ; \
-	done ; \
-	for x in $(CLOOGTEST_STRIDED) ; do \
-		echo "Generate $$x.c" ; \
-		$(top_builddir)/cloog $(srcdir)/$$x.cloog \
-			-strides 1 -o $(srcdir)/$$x.c ; \
-	done ; \
-	for x in $(CLOOGTEST_OPENSCOP) ; do \
-		echo "Generate $$x.c" ; \
-		$(top_builddir)/cloog $(srcdir)/$$x.scop \
-		-openscop -o $(srcdir)/$$x.c ; \
-	done ; \
-	for line in $(SPECIAL_OPTIONS); do \
-		options=`echo $$line | sed -e 's/^[^ ]* //'`; \
-		x=`echo $$line | sed -e 's/ .*//'`; \
-		echo "Generate file $$x ($$options)" ; \
-		$(top_builddir)/cloog$(EXEEXT) $(srcdir)/$$x.cloog \
-		    $$options > $(srcdir)/$$x.c ; \
-	done
-
-generate_good:
-	@for x in $(FINITE_CLOOGTEST_C) ; do \
-		echo "Generate $$x.good.c" ; \
-		$(top_builddir)/cloog$(EXEEXT) -callable 1 $(srcdir)/$$x.cloog -o $(srcdir)/$$x.good.c ; \
-	done; \
-	for line in $(SPECIAL_OPTIONS); do echo $$line | while read x options; do \
-		echo "Generate $$x.good.c ($$options)" ; \
-		$(top_builddir)/cloog$(EXEEXT) -callable 1 $$options $(srcdir)/$$x.cloog -o $(srcdir)/$$x.good.c ; \
-	done; done
-
-valgrind:
-	@echo "             /*-----------------------------------------------*"
-	@echo "              *            Checking files by Valgrind         *"
-	@echo "              *-----------------------------------------------*/"
-	for x in $(CLOOGTEST_C) ; do \
-		echo "Valgrinding $$x.c" ; \
-		valgrind $(top_builddir)/cloog$(EXEEXT) $(srcdir)/$$x.cloog ; \
-	done ; \
-	for x in $(CLOOGTEST_FORTRAN) ; do \
-		echo "Valgrinding $$x.f" ; \
-		valgrind $(top_builddir)/cloog$(EXEEXT) $(srcdir)/$$x.cloog ; \
-	done
-
-test_run: generate_test$(EXEEXT)
-	$(TESTS_ENVIRONMENT) \
-	$(srcdir)/check_run.sh
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/cloog-0.17.0/test/backtrack.c b/cloog-0.17.0/test/backtrack.c
deleted file mode 100644
index 9895d83..0000000
--- a/cloog-0.17.0/test/backtrack.c
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Generated from ../../../git/cloog/test/backtrack.cloog by CLooG 0.14.0-367-gf043665 gmp bits in 0.00s. */
-S1(0);
diff --git a/cloog-0.17.0/test/backtrack.cloog b/cloog-0.17.0/test/backtrack.cloog
deleted file mode 100644
index f8d978e..0000000
--- a/cloog-0.17.0/test/backtrack.cloog
+++ /dev/null
@@ -1,24 +0,0 @@
-c
-
-0 2
-
-0
-
-# Number of statements
-1
-
-1 # of domains
-1 3
-0 1 0
-0 0 0
-
-0
-
-# of scattering functions
-1
-
-2 5
-0 1 0 -1 0 
-0 0 1  0 0 
-
-0
diff --git a/cloog-0.17.0/test/backtrack.good.c b/cloog-0.17.0/test/backtrack.good.c
deleted file mode 100644
index 5cb04a3..0000000
--- a/cloog-0.17.0/test/backtrack.good.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated from ../../../git/cloog/test/backtrack.cloog by CLooG 0.14.0-367-gf043665 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int c1;
-  /* Original iterators. */
-  int i;
-  S1(0);
-}
diff --git a/cloog-0.17.0/test/basic-bounds-1.c b/cloog-0.17.0/test/basic-bounds-1.c
deleted file mode 100644
index 1ddede1..0000000
--- a/cloog-0.17.0/test/basic-bounds-1.c
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-1.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (i=0;i<=2;i++) {
-  S1(i) ;
-}
diff --git a/cloog-0.17.0/test/basic-bounds-1.cloog b/cloog-0.17.0/test/basic-bounds-1.cloog
deleted file mode 100644
index 1c3ac40..0000000
--- a/cloog-0.17.0/test/basic-bounds-1.cloog
+++ /dev/null
@@ -1,21 +0,0 @@
-# language: C
-c
-
-# Context
-1 2
-1 1
-0
-
-1 # Number of statements
-
-1
-#
-3 3
-#  i  1
-1  1  0
-1 -1  2
-1  0  1 
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/basic-bounds-1.good.c b/cloog-0.17.0/test/basic-bounds-1.good.c
deleted file mode 100644
index ab53e94..0000000
--- a/cloog-0.17.0/test/basic-bounds-1.good.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-
-void test()
-{
-  /* Original iterators. */
-  int i;
-  for (i=0;i<=2;i++) {
-    S1(i) ;
-  }
-}
diff --git a/cloog-0.17.0/test/basic-bounds-2.c b/cloog-0.17.0/test/basic-bounds-2.c
deleted file mode 100644
index 38780ff..0000000
--- a/cloog-0.17.0/test/basic-bounds-2.c
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-S1(0) ;
diff --git a/cloog-0.17.0/test/basic-bounds-2.cloog b/cloog-0.17.0/test/basic-bounds-2.cloog
deleted file mode 100644
index 45a51ba..0000000
--- a/cloog-0.17.0/test/basic-bounds-2.cloog
+++ /dev/null
@@ -1,21 +0,0 @@
-# language: C
-c
-
-# Context
-1 2
-1 1
-0
-
-1 # Number of statements
-
-1
-#
-3 3
-#  i  1
-1  3  0
-1 -3  2
-1  0  1 
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/basic-bounds-2.good.c b/cloog-0.17.0/test/basic-bounds-2.good.c
deleted file mode 100644
index 48544ff..0000000
--- a/cloog-0.17.0/test/basic-bounds-2.good.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-
-void test()
-{
-  /* Original iterators. */
-  int i;
-  S1(0) ;
-}
diff --git a/cloog-0.17.0/test/basic-bounds-3.c b/cloog-0.17.0/test/basic-bounds-3.c
deleted file mode 100644
index f5fdaf8..0000000
--- a/cloog-0.17.0/test/basic-bounds-3.c
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-3.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (i=0;i<=M;i++) {
-  S1(i) ;
-}
diff --git a/cloog-0.17.0/test/basic-bounds-3.cloog b/cloog-0.17.0/test/basic-bounds-3.cloog
deleted file mode 100644
index f3ad8bc..0000000
--- a/cloog-0.17.0/test/basic-bounds-3.cloog
+++ /dev/null
@@ -1,23 +0,0 @@
-# language: C
-c
-
-# Context
-2 3
-# M 1
-1 1 0
-1 0 1
-0
-
-1 # Number of statements
-
-1
-#
-3 4
-#  i  M  1
-1  1  0  0
-1 -1  1  0
-1  0  0  1  
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/basic-bounds-3.good.c b/cloog-0.17.0/test/basic-bounds-3.good.c
deleted file mode 100644
index c5c0f7c..0000000
--- a/cloog-0.17.0/test/basic-bounds-3.good.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-3.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i;
-  for (i=0;i<=M;i++) {
-    S1(i) ;
-  }
-}
diff --git a/cloog-0.17.0/test/basic-bounds-4.c b/cloog-0.17.0/test/basic-bounds-4.c
deleted file mode 100644
index 1f15c42..0000000
--- a/cloog-0.17.0/test/basic-bounds-4.c
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-4.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (i=0;i<=M+1;i++) {
-  S1(i) ;
-}
diff --git a/cloog-0.17.0/test/basic-bounds-4.cloog b/cloog-0.17.0/test/basic-bounds-4.cloog
deleted file mode 100644
index 5e76687..0000000
--- a/cloog-0.17.0/test/basic-bounds-4.cloog
+++ /dev/null
@@ -1,23 +0,0 @@
-# language: C
-c
-
-# Context
-2 3
-# M 1
-1 1 0
-1 0 1
-0
-
-1 # Number of statements
-
-1
-#
-3 4
-#  i  M  1
-1  1  0  0
-1 -1  1  1
-1  0  0  1  
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/basic-bounds-4.good.c b/cloog-0.17.0/test/basic-bounds-4.good.c
deleted file mode 100644
index 310c948..0000000
--- a/cloog-0.17.0/test/basic-bounds-4.good.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-4.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i;
-  for (i=0;i<=M+1;i++) {
-    S1(i) ;
-  }
-}
diff --git a/cloog-0.17.0/test/basic-bounds-5.c b/cloog-0.17.0/test/basic-bounds-5.c
deleted file mode 100644
index 1761b56..0000000
--- a/cloog-0.17.0/test/basic-bounds-5.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-5.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-j = floord(M+1,2) ;
-S1(1,j) ;
diff --git a/cloog-0.17.0/test/basic-bounds-5.cloog b/cloog-0.17.0/test/basic-bounds-5.cloog
deleted file mode 100644
index 855a9bb..0000000
--- a/cloog-0.17.0/test/basic-bounds-5.cloog
+++ /dev/null
@@ -1,22 +0,0 @@
-# language: C
-c
-
-# Context
-1 3
-# M 1
-1 0 1
-0
-
-1 # Number of statements
-
-1
-# {i,j,N | i=1; 2j-1<=N<=2j}
-3 5
-#  i  j  M  1
-0  1  0  0 -1
-1  0  2 -1  0
-1  0 -2  1  1
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/basic-bounds-5.good.c b/cloog-0.17.0/test/basic-bounds-5.good.c
deleted file mode 100644
index 3e669c0..0000000
--- a/cloog-0.17.0/test/basic-bounds-5.good.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-5.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j;
-  j = floord(M+1,2) ;
-  S1(1,j) ;
-}
diff --git a/cloog-0.17.0/test/basic-bounds-6.c b/cloog-0.17.0/test/basic-bounds-6.c
deleted file mode 100644
index 449ad37..0000000
--- a/cloog-0.17.0/test/basic-bounds-6.c
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-6.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-S1(-1) ;
diff --git a/cloog-0.17.0/test/basic-bounds-6.cloog b/cloog-0.17.0/test/basic-bounds-6.cloog
deleted file mode 100644
index 2acc2ab..0000000
--- a/cloog-0.17.0/test/basic-bounds-6.cloog
+++ /dev/null
@@ -1,20 +0,0 @@
-# language: C
-c
-
-# Context
-1 2
-1 1
-0
-
-1 # Number of statements
-
-1
-3 3
-#  i  1
-1  2  3
-1 -2 -1
-1  0  1 
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/basic-bounds-6.good.c b/cloog-0.17.0/test/basic-bounds-6.good.c
deleted file mode 100644
index a993e2f..0000000
--- a/cloog-0.17.0/test/basic-bounds-6.good.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Generated from ../../../git/cloog/test/basic-bounds-6.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-
-void test()
-{
-  /* Original iterators. */
-  int i;
-  S1(-1) ;
-}
diff --git a/cloog-0.17.0/test/block.c b/cloog-0.17.0/test/block.c
deleted file mode 100644
index 2ba5668..0000000
--- a/cloog-0.17.0/test/block.c
+++ /dev/null
@@ -1,5 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/block.cloog by CLooG 0.14.0-170-g72daac3 gmp bits in 0.00s. */
-S1();
-S3(0);
-S2();
-S3(1);
diff --git a/cloog-0.17.0/test/block.cloog b/cloog-0.17.0/test/block.cloog
deleted file mode 100644
index 9913b74..0000000
--- a/cloog-0.17.0/test/block.cloog
+++ /dev/null
@@ -1,42 +0,0 @@
-c
-
-0 2
-
-0
-
-3
-
-1
-0 2
-
-0 0 0
-
-1
-0 2
-
-0 0 0
-
-1
-2 3
-1 1 0
-1 -1 1
-
-0 0 0
-
-0
-
-3
-
-2 4
-0 -1 0 0		# c1 = 0
-0 0 -1 0		# c2 = 0
-
-2 4
-0 -1 0 1		# c1 = 1
-0 0 -1 0		# c2 = 0
-
-2 5
-0 -1 0 1 0		# c1 = i
-0 0 -1 0 1		# c2 = 1
-
-0
diff --git a/cloog-0.17.0/test/block.good.c b/cloog-0.17.0/test/block.good.c
deleted file mode 100644
index b2f280f..0000000
--- a/cloog-0.17.0/test/block.good.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/block.cloog by CLooG 0.14.0-170-g72daac3 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1() { hash(1); }
-#define S2() { hash(2); }
-#define S3(i) { hash(3); hash(i); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int c1;
-  /* Original iterators. */
-  int i;
-  S1();
-  S3(0);
-  S2();
-  S3(1);
-}
diff --git a/cloog-0.17.0/test/block2.c b/cloog-0.17.0/test/block2.c
deleted file mode 100644
index 7209a10..0000000
--- a/cloog-0.17.0/test/block2.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/block2.cloog by CLooG 0.14.0-302-g309b32c gmp bits in 0.01s. */
-for (c0=0;c0<=9;c0++) {
-  S1(c0,1);
-  S3(c0,1);
-  S2(c0,1);
-}
diff --git a/cloog-0.17.0/test/block2.cloog b/cloog-0.17.0/test/block2.cloog
deleted file mode 100644
index 866c634..0000000
--- a/cloog-0.17.0/test/block2.cloog
+++ /dev/null
@@ -1,77 +0,0 @@
-# CLooG -> CLooG
-# This is an automatic dump of a CLooG input file from a CloogInput data
-# structure.
-
-# Language: C
-c
-
-# Context:
-0 2
-
-0 # Parameter name(s)
-
-# Statement number:
-3
-
-# Iteration domain of statement 5 (ND_1IP_ED_0_0_V_0).
-1
-
-3 4
-0     0     1    -1
-1     1     0     0
-1    -1     0     9
-
-0 0 0 # For future options.
-
-# Iteration domain of statement 6 (ND_1OP_ED_3_0_V_1).
-1
-
-3 4
-0     0     1    -1
-1     1     0     0
-1    -1     0     9
-
-0 0 0 # For future options.
-
-# Iteration domain of statement 7 (ND_1).
-1
-
-3 4
-0     0     1    -1
-1     1     0     0
-1    -1     0     9
-
-0 0 0 # For future options.
-
-
-0 # Iterator name(s)
-
-# --------------------- SCATTERING --------------------
-3 # Scattering functions
-
-# Scattering of statement 5 (ND_1IP_ED_0_0_V_0).
-1
-
-3 7
-0     0     0     1     0     0    -6
-0     0     1     0     0    -1     0
-0     1     0     0    -1     0     0
-
-# Scattering of statement 6 (ND_1OP_ED_3_0_V_1).
-1
-
-3 7
-0     0     0     1     0     0   -11
-0     0     1     0     0    -1     0
-0     1     0     0    -1     0     0
-
-# Scattering of statement 7 (ND_1).
-1
-
-3 7
-0     0     0     1     0     0    -8
-0     0     1     0     0    -1     0
-0     1     0     0    -1     0     0
-
-1 # Scattering dimension name(s)
-c0 c1 c2 
diff --git a/cloog-0.17.0/test/block2.good.c b/cloog-0.17.0/test/block2.good.c
deleted file mode 100644
index 23a4942..0000000
--- a/cloog-0.17.0/test/block2.good.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/block2.cloog by CLooG 0.14.0-302-g309b32c gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int c0, c1;
-  /* Original iterators. */
-  int i, j;
-  for (c0=0;c0<=9;c0++) {
-    S1(c0,1);
-    S3(c0,1);
-    S2(c0,1);
-  }
-}
diff --git a/cloog-0.17.0/test/block3.c b/cloog-0.17.0/test/block3.c
deleted file mode 100644
index 2c701e9..0000000
--- a/cloog-0.17.0/test/block3.c
+++ /dev/null
@@ -1,5 +0,0 @@
-/* Generated from ../../../git/cloog/test/block3.cloog by CLooG 0.16.2-4-gba4e834 gmp bits in 0.00s. */
-S1();
-S3(0);
-S2();
-S3(1);
diff --git a/cloog-0.17.0/test/block3.cloog b/cloog-0.17.0/test/block3.cloog
deleted file mode 100644
index fd9997d..0000000
--- a/cloog-0.17.0/test/block3.cloog
+++ /dev/null
@@ -1,36 +0,0 @@
-C
-
-0 2
-
-0
-
-3
-
-1
-0 2
-0 0 0
-
-1
-0 2
-0 0 0
-
-1
-2 3
-1 1 0
-1 -1 1
-0 0 0
-
-0
-
-3
-
-1 3
-0 -1 0
-
-1 3
-0 -1 1
-
-1 4
-0 -1 1 0
-
-0
diff --git a/cloog-0.17.0/test/block3.good.c b/cloog-0.17.0/test/block3.good.c
deleted file mode 100644
index b4bdf6d..0000000
--- a/cloog-0.17.0/test/block3.good.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Generated from ../../../git/cloog/test/block3.cloog by CLooG 0.16.2-4-gba4e834 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1() { hash(1); }
-#define S2() { hash(2); }
-#define S3(i) { hash(3); hash(i); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int c1;
-  /* Original iterators. */
-  int i;
-  S1();
-  S3(0);
-  S2();
-  S3(1);
-}
diff --git a/cloog-0.17.0/test/byu98-1-2-3.c b/cloog-0.17.0/test/byu98-1-2-3.c
deleted file mode 100644
index 2a1e151..0000000
--- a/cloog-0.17.0/test/byu98-1-2-3.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/byu98-1-2-3.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.01s. */
-for (i=2;i<=3;i++) {
-  for (j=-i+6;j<=6;j++) {
-    S1(i,j);
-  }
-}
-for (i=4;i<=7;i++) {
-  if (i == 4) {
-    for (j=3;j<=4;j++) {
-      S1(i,j);
-    }
-  }
-  if (i >= 6) {
-    S2(i,-i+9);
-  }
-  if (i <= 5) {
-    S1(i,-i+9);
-    S2(i,-i+9);
-  }
-  for (j=max(-i+10,i-1);j<=6;j++) {
-    S1(i,j);
-  }
-}
-S2(8,1);
diff --git a/cloog-0.17.0/test/byu98-1-2-3.cloog b/cloog-0.17.0/test/byu98-1-2-3.cloog
deleted file mode 100644
index 76d16ab..0000000
--- a/cloog-0.17.0/test/byu98-1-2-3.cloog
+++ /dev/null
@@ -1,65 +0,0 @@
-# Here is the result given by an old CLooG (the same was given up to 0.12.2),
-# the difference with the new constant spreading technique of 0.14.0 is
-# one of the most beautiful.
-#
-# /* Generated by CLooG v0.10.7 */
-# for (i=2;i<=3;i++) {
-#   for (j=-i+6;j<=6;j++) {
-#     S1 ;
-#   }
-# }
-# for (j=4-1;j<=-(4)+8;j++) {
-#   S1(i = 4) ;
-# }
-# j = -(4)+9 ;
-# S1(i = 4) ;
-# S2(i = 4) ;
-# for (j=-(4)+10;j<=6;j++) {
-#   S1(i = 4) ;
-# }
-# S1(i = 5,j = 4) ;
-# S2(i = 5,j = 4) ;
-# for (j=5;j<=6;j++) {
-#   S1(i = 5) ;
-# }
-# for (i=6;i<=7;i++) {
-#   j = -i+9 ;
-#   S2 ;
-#   for (j=i-1;j<=6;j++) {
-#     S1 ;
-#   }
-# }
-# S2(i = 8,j = 1) ;
-
-# language: C
-c
-
-# Context
-#{ | 1>=0}
-1   2
-1   1
-0
-
-2 # Number of statements
-
-1
-# {i,j | (-j+6,2)<=i<=j+1; 3<=j<=6}
-5 4
-#  i  j  1
-1  1  1 -6
-1  1  0 -2
-1  0  1 -3
-1  0 -1  6
-1 -1  1  1
-0  0  0
-
-1
-# {i,j | i=-j+9; 1<=j<=5}
-3 4
-0  1  1 -9
-1  0  1 -1
-1  0 -1  5
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/byu98-1-2-3.good.c b/cloog-0.17.0/test/byu98-1-2-3.good.c
deleted file mode 100644
index d1ad156..0000000
--- a/cloog-0.17.0/test/byu98-1-2-3.good.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Generated from ../../../git/cloog/test/byu98-1-2-3.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test()
-{
-  /* Original iterators. */
-  int i, j;
-  for (i=2;i<=3;i++) {
-    for (j=-i+6;j<=6;j++) {
-      S1(i,j) ;
-    }
-  }
-  for (j=3;j<=4;j++) {
-    S1(4,j) ;
-  }
-  S1(4,5) ;
-  S2(4,5) ;
-  S1(4,6) ;
-  S1(5,4) ;
-  S2(5,4) ;
-  for (j=5;j<=6;j++) {
-    S1(5,j) ;
-  }
-  for (i=6;i<=7;i++) {
-    j = -i+9 ;
-    S2(i,-i+9) ;
-    for (j=i-1;j<=6;j++) {
-      S1(i,j) ;
-    }
-  }
-  S2(8,1) ;
-}
diff --git a/cloog-0.17.0/test/check_c.sh b/cloog-0.17.0/test/check_c.sh
deleted file mode 100755
index 8601154..0000000
--- a/cloog-0.17.0/test/check_c.sh
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/bin/sh
-#
-#   /**-------------------------------------------------------------------**
-#    **                              CLooG                                **
-#    **-------------------------------------------------------------------**
-#    **                           check_c.sh                              **
-#    **-------------------------------------------------------------------**
-#    **                 First version: November 17th 2011                 **
-#    **-------------------------------------------------------------------**/
-#
-
-#/*****************************************************************************
-# *               CLooG : the Chunky Loop Generator (experimental)            *
-# *****************************************************************************
-# *                                                                           *
-# * Copyright (C) 2003 Cedric Bastoul                                         *
-# *                                                                           *
-# * This library is free software; you can redistribute it and/or             *
-# * modify it under the terms of the GNU Lesser General Public                *
-# * License as published by the Free Software Foundation; either              *
-# * version 2.1 of the License, or (at your option) any later version.        *
-# *                                                                           *
-# * This library is distributed in the hope that it will be useful,           *
-# * but WITHOUT ANY WARRANTY; without even the implied warranty of            *
-# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
-# * Lesser General Public License for more details.                           *
-# *                                                                           *
-# * You should have received a copy of the GNU Lesser General Public          *
-# * License along with this library; if not, write to the Free Software       *
-# * Foundation, Inc., 51 Franklin Street, Fifth Floor,                        *
-# * Boston, MA  02110-1301  USA                                               *
-# *                                                                           *
-# * CLooG, the Chunky Loop Generator                                          *
-# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                        *
-# *                                                                           *
-# *****************************************************************************/
-
-$CHECKER "C" "$CLOOGTEST_C" "" "cloog" "c" "0"
diff --git a/cloog-0.17.0/test/check_fortran.sh b/cloog-0.17.0/test/check_fortran.sh
deleted file mode 100755
index 7d8db92..0000000
--- a/cloog-0.17.0/test/check_fortran.sh
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/bin/sh
-#
-#   /**-------------------------------------------------------------------**
-#    **                              CLooG                                **
-#    **-------------------------------------------------------------------**
-#    **                        check_fortran.sh                           **
-#    **-------------------------------------------------------------------**
-#    **                 First version: November 17th 2011                 **
-#    **-------------------------------------------------------------------**/
-#
-
-#/*****************************************************************************
-# *               CLooG : the Chunky Loop Generator (experimental)            *
-# *****************************************************************************
-# *                                                                           *
-# * Copyright (C) 2003 Cedric Bastoul                                         *
-# *                                                                           *
-# * This library is free software; you can redistribute it and/or             *
-# * modify it under the terms of the GNU Lesser General Public                *
-# * License as published by the Free Software Foundation; either              *
-# * version 2.1 of the License, or (at your option) any later version.        *
-# *                                                                           *
-# * This library is distributed in the hope that it will be useful,           *
-# * but WITHOUT ANY WARRANTY; without even the implied warranty of            *
-# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
-# * Lesser General Public License for more details.                           *
-# *                                                                           *
-# * You should have received a copy of the GNU Lesser General Public          *
-# * License along with this library; if not, write to the Free Software       *
-# * Foundation, Inc., 51 Franklin Street, Fifth Floor,                        *
-# * Boston, MA  02110-1301  USA                                               *
-# *                                                                           *
-# * CLooG, the Chunky Loop Generator                                          *
-# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                        *
-# *                                                                           *
-# *****************************************************************************/
-
-$CHECKER "FORTRAN" "$CLOOGTEST_FORTRAN" "" "cloog" "f" "0"
diff --git a/cloog-0.17.0/test/check_openscop.sh b/cloog-0.17.0/test/check_openscop.sh
deleted file mode 100755
index 6b78415..0000000
--- a/cloog-0.17.0/test/check_openscop.sh
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/bin/sh
-#
-#   /**-------------------------------------------------------------------**
-#    **                              CLooG                                **
-#    **-------------------------------------------------------------------**
-#    **                        check_openscop.sh                          **
-#    **-------------------------------------------------------------------**
-#    **                 First version: November 17th 2011                 **
-#    **-------------------------------------------------------------------**/
-#
-
-#/*****************************************************************************
-# *               CLooG : the Chunky Loop Generator (experimental)            *
-# *****************************************************************************
-# *                                                                           *
-# * Copyright (C) 2003 Cedric Bastoul                                         *
-# *                                                                           *
-# * This library is free software; you can redistribute it and/or             *
-# * modify it under the terms of the GNU Lesser General Public                *
-# * License as published by the Free Software Foundation; either              *
-# * version 2.1 of the License, or (at your option) any later version.        *
-# *                                                                           *
-# * This library is distributed in the hope that it will be useful,           *
-# * but WITHOUT ANY WARRANTY; without even the implied warranty of            *
-# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
-# * Lesser General Public License for more details.                           *
-# *                                                                           *
-# * You should have received a copy of the GNU Lesser General Public          *
-# * License along with this library; if not, write to the Free Software       *
-# * Foundation, Inc., 51 Franklin Street, Fifth Floor,                        *
-# * Boston, MA  02110-1301  USA                                               *
-# *                                                                           *
-# * CLooG, the Chunky Loop Generator                                          *
-# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                        *
-# *                                                                           *
-# *****************************************************************************/
-
-$CHECKER "OPENSCOP" "$CLOOGTEST_OPENSCOP" "-openscop" "scop" "c" "0"
diff --git a/cloog-0.17.0/test/check_run.sh b/cloog-0.17.0/test/check_run.sh
deleted file mode 100755
index 9ce0b1c..0000000
--- a/cloog-0.17.0/test/check_run.sh
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/bin/sh
-#
-#   /**-------------------------------------------------------------------**
-#    **                              CLooG                                **
-#    **-------------------------------------------------------------------**
-#    **                          check_run.sh                             **
-#    **-------------------------------------------------------------------**
-#    **                 First version: November 18th 2011                 **
-#    **-------------------------------------------------------------------**/
-#
-
-#/*****************************************************************************
-# *               CLooG : the Chunky Loop Generator (experimental)            *
-# *****************************************************************************
-# *                                                                           *
-# * Copyright (C) 2003 Cedric Bastoul                                         *
-# *                                                                           *
-# * This library is free software; you can redistribute it and/or             *
-# * modify it under the terms of the GNU Lesser General Public                *
-# * License as published by the Free Software Foundation; either              *
-# * version 2.1 of the License, or (at your option) any later version.        *
-# *                                                                           *
-# * This library is distributed in the hope that it will be useful,           *
-# * but WITHOUT ANY WARRANTY; without even the implied warranty of            *
-# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
-# * Lesser General Public License for more details.                           *
-# *                                                                           *
-# * You should have received a copy of the GNU Lesser General Public          *
-# * License along with this library; if not, write to the Free Software       *
-# * Foundation, Inc., 51 Franklin Street, Fifth Floor,                        *
-# * Boston, MA  02110-1301  USA                                               *
-# *                                                                           *
-# * CLooG, the Chunky Loop Generator                                          *
-# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                        *
-# *                                                                           *
-# *****************************************************************************/
-
-# Refactor $SPECIAL_OPTIONS list to remove quotes and to replace spaces in
-# individual tests with %, e.g., "'file1 -f -1' 'file2'" becomes
-# "file1%-f%-1 file2".
-special_refactored=`echo "$SPECIAL_OPTIONS" | \
-                    sed "s/' '/#/g"         | \
-                    sed 's/ /%/g'           | \
-                    sed "s/#/ /g"           | \
-                    sed "s/'//g"`
-
-$CHECKER "RUN C" "$FINITE_CLOOGTEST_C" "" "cloog" "c" "1"
-failedtest=$?;
-
-$CHECKER "RUN SPECIAL" "$special_refactored" "" "cloog" "c" "1"
-failedtest=`expr $failedtest + $?`;
-
-$CHECKER "RUN SPECIAL -sh 1" "$special_refactored" "-sh 1" "cloog" "c" "1"
-failedtest=`expr $failedtest + $?`;
-return $failedtest;
diff --git a/cloog-0.17.0/test/check_special.sh b/cloog-0.17.0/test/check_special.sh
deleted file mode 100755
index ece90d5..0000000
--- a/cloog-0.17.0/test/check_special.sh
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/bin/sh
-#
-#   /**-------------------------------------------------------------------**
-#    **                              CLooG                                **
-#    **-------------------------------------------------------------------**
-#    **                        check_special.sh                           **
-#    **-------------------------------------------------------------------**
-#    **                 First version: November 17th 2011                 **
-#    **-------------------------------------------------------------------**/
-#
-
-#/*****************************************************************************
-# *               CLooG : the Chunky Loop Generator (experimental)            *
-# *****************************************************************************
-# *                                                                           *
-# * Copyright (C) 2003 Cedric Bastoul                                         *
-# *                                                                           *
-# * This library is free software; you can redistribute it and/or             *
-# * modify it under the terms of the GNU Lesser General Public                *
-# * License as published by the Free Software Foundation; either              *
-# * version 2.1 of the License, or (at your option) any later version.        *
-# *                                                                           *
-# * This library is distributed in the hope that it will be useful,           *
-# * but WITHOUT ANY WARRANTY; without even the implied warranty of            *
-# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
-# * Lesser General Public License for more details.                           *
-# *                                                                           *
-# * You should have received a copy of the GNU Lesser General Public          *
-# * License along with this library; if not, write to the Free Software       *
-# * Foundation, Inc., 51 Franklin Street, Fifth Floor,                        *
-# * Boston, MA  02110-1301  USA                                               *
-# *                                                                           *
-# * CLooG, the Chunky Loop Generator                                          *
-# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                        *
-# *                                                                           *
-# *****************************************************************************/
-
-# Refactor $SPECIAL_OPTIONS list to remove quotes and to replace spaces in
-# individual tests with %, e.g., "'file1 -f -1' 'file2'" becomes
-# "file1%-f%-1 file2".
-special_refactored=`echo "$SPECIAL_OPTIONS" | \
-                    sed "s/' '/#/g"         | \
-                    sed 's/ /%/g'           | \
-                    sed "s/#/ /g"           | \
-                    sed "s/'//g"`
-
-$CHECKER "SPECIAL" "$special_refactored" "" "cloog" "c" "0"
diff --git a/cloog-0.17.0/test/check_strided.sh b/cloog-0.17.0/test/check_strided.sh
deleted file mode 100755
index 3932373..0000000
--- a/cloog-0.17.0/test/check_strided.sh
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/bin/sh
-#
-#   /**-------------------------------------------------------------------**
-#    **                              CLooG                                **
-#    **-------------------------------------------------------------------**
-#    **                        check_strided.sh                           **
-#    **-------------------------------------------------------------------**
-#    **                 First version: November 17th 2011                 **
-#    **-------------------------------------------------------------------**/
-#
-
-#/*****************************************************************************
-# *               CLooG : the Chunky Loop Generator (experimental)            *
-# *****************************************************************************
-# *                                                                           *
-# * Copyright (C) 2003 Cedric Bastoul                                         *
-# *                                                                           *
-# * This library is free software; you can redistribute it and/or             *
-# * modify it under the terms of the GNU Lesser General Public                *
-# * License as published by the Free Software Foundation; either              *
-# * version 2.1 of the License, or (at your option) any later version.        *
-# *                                                                           *
-# * This library is distributed in the hope that it will be useful,           *
-# * but WITHOUT ANY WARRANTY; without even the implied warranty of            *
-# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
-# * Lesser General Public License for more details.                           *
-# *                                                                           *
-# * You should have received a copy of the GNU Lesser General Public          *
-# * License along with this library; if not, write to the Free Software       *
-# * Foundation, Inc., 51 Franklin Street, Fifth Floor,                        *
-# * Boston, MA  02110-1301  USA                                               *
-# *                                                                           *
-# * CLooG, the Chunky Loop Generator                                          *
-# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                        *
-# *                                                                           *
-# *****************************************************************************/
-
-$CHECKER "STRIDED" "$CLOOGTEST_STRIDED" "-strides 1" "cloog" "c" "0"
diff --git a/cloog-0.17.0/test/checker.sh b/cloog-0.17.0/test/checker.sh
deleted file mode 100755
index 4064819..0000000
--- a/cloog-0.17.0/test/checker.sh
+++ /dev/null
@@ -1,126 +0,0 @@
-#!/bin/sh
-#
-#   /**-------------------------------------------------------------------**
-#    **                              CLooG                                **
-#    **-------------------------------------------------------------------**
-#    **                           checker.sh                              **
-#    **-------------------------------------------------------------------**
-#    **                 First version: November 16th 2011                 **
-#    **-------------------------------------------------------------------**/
-#
-
-#/*****************************************************************************
-# *               CLooG : the Chunky Loop Generator (experimental)            *
-# *****************************************************************************
-# *                                                                           *
-# * Copyright (C) 2003 Cedric Bastoul                                         *
-# *                                                                           *
-# * This library is free software; you can redistribute it and/or             *
-# * modify it under the terms of the GNU Lesser General Public                *
-# * License as published by the Free Software Foundation; either              *
-# * version 2.1 of the License, or (at your option) any later version.        *
-# *                                                                           *
-# * This library is distributed in the hope that it will be useful,           *
-# * but WITHOUT ANY WARRANTY; without even the implied warranty of            *
-# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
-# * Lesser General Public License for more details.                           *
-# *                                                                           *
-# * You should have received a copy of the GNU Lesser General Public          *
-# * License along with this library; if not, write to the Free Software       *
-# * Foundation, Inc., 51 Franklin Street, Fifth Floor,                        *
-# * Boston, MA  02110-1301  USA                                               *
-# *                                                                           *
-# * CLooG, the Chunky Loop Generator                                          *
-# * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr                        *
-# *                                                                           *
-# *****************************************************************************/
-
-# This is the main test script of CLooG. It checks that CLooG generates
-# a convenient output for an input set of tests, according to some
-# parameters (see below). Two checking policies are possible: simply
-# compare the generated codes or compare the executions of the generated
-# codes. The reference output files must be present: if we are checking a
-# file foo.cloog, either foo.c or foo.f must exist in the case of a simple
-# code generation checking, and either foo.good.c or foo.good.f must exist
-# in the case of a run check.
-
-TEST_NAME="$1"             ## Name of the group of files to test
-
-TEST_FILES="$2"            ## List of test file prefixes and individual options
-                           ## spaces between the elements of one test are
-                           ## represented with '%', e.g., "file -f -1" is
-                           ## "file%-f%-1".
-
-TEST_GLOBAL_OPTIONS="$3"   ## Options for all the tests in the group
-
-TEST_INPUT_EXTENSION="$4"  ## Extension of the input file
-
-TEST_OUTPUT_EXTENSION="$5" ## Extension of the generated file
-
-TEST_RUN="$6"              ## "1" if the checking policy is to generate,
-                           ## compile and run, generate only otherwise
-
-failedtest=0;
-cloog=$top_builddir/cloog$EXEEXT
-echo "             /*-----------------------------------------------*"
-echo "              *       Testing CLooG: $TEST_NAME test set       "
-echo "              *-----------------------------------------------*/"
-for x in $TEST_FILES; do
-    name=`echo $x | sed 's/%/ /g' | cut -d\  -f1`;
-    individual_options=`echo $x | sed 's/%/ /g' | cut -s -d\  -f2-`;
-    input="$srcdir/$name.$TEST_INPUT_EXTENSION";
-    output="$srcdir/$name.$TEST_OUTPUT_EXTENSION";
-    options="$individual_options $TEST_GLOBAL_OPTIONS";
-
-    echo "Check file $input \c";
-    if [ "$options" = " " ]; then
-        echo "(no option), \c"
-    else
-        echo "(options $options), \c";
-    fi;
-
-    if [ "$TEST_RUN" = "1" ]; then
-	generate_test=$srcdir/generate_test$EXEEXT
-	test_run=$srcdir/test_run$EXEEXT
-	good="$srcdir/$name.good.$TEST_OUTPUT_EXTENSION";
-
-	echo "generating... \c";
-	$cloog $options -q -callable 1 $input > test_test.c;
-	$generate_test < $input > test_main.c;
-
-	echo "compiling... \c";
-# TODO: (nd Cedric) The following line is to deal with the (F*CKING !!!)
-#       space in PACKAGE_STRING, introduced by AC_INIT and which, for
-#       some reason, seems to be the source of a problem with my shell.
-#       Maybe there is a better way to solve the problem...
-	COMPILE=`echo $COMPILE | sed 's/\\\ /_SPACE_/g'`;
-	$COMPILE -c test_test.c;
-	$COMPILE -Dtest=good -c $good -o test_good.o;
-	$LINK test_main.c test_test.o test_good.o > /dev/null;
-
-	echo "comparing... \c";
-	$test_run;
-	result=$?;
-	rm -f $test_run;
-    else
-	echo "generating... \c";
-	$cloog $options -q $input > cloog_temp;
-	diff -u -w --ignore-matching-lines='CLooG' cloog_temp $output;
-	result=$?;
-	rm -f cloog_temp;
-    fi;
-
-    if [ "$result" -ne "0" ]; then
-        echo -e "\033[31mFAIL: $output is not the same\033[0m";
-        failedtest=`expr $failedtest + 1`;
-    else
-        echo "PASS";
-    fi;
-done;
-
-if [ $failedtest != 0 ]; then
-    echo "\033[31m[CLooG] FAIL: $failedtest tests failed in $TEST_NAME\033[0m";
-else
-    echo "[CLooG] PASS: $TEST_NAME passed :-) !";
-fi
-exit $failedtest
diff --git a/cloog-0.17.0/test/cholesky.c b/cloog-0.17.0/test/cholesky.c
deleted file mode 100644
index a0d08fc..0000000
--- a/cloog-0.17.0/test/cholesky.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Generated from ../../../git/cloog/test/cholesky.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.04s. */
-if (n >= 1) {
-  if (n >= 2) {
-    S1(1) ;
-    S3(1) ;
-    for (c3=2;c3<=n;c3++) {
-      S4(1,c3) ;
-      S6(1,c3) ;
-    }
-  }
-  if (n == 1) {
-    S1(1) ;
-    S3(1) ;
-  }
-  for (c1=2;c1<=n-1;c1++) {
-    S1(c1) ;
-    for (c3=1;c3<=c1-1;c3++) {
-      S2(c1,c3) ;
-    }
-    S3(c1) ;
-    for (c3=c1+1;c3<=n;c3++) {
-      S4(c1,c3) ;
-      for (c5=1;c5<=c1-1;c5++) {
-        S5(c1,c3,c5) ;
-      }
-      S6(c1,c3) ;
-    }
-  }
-  if (n >= 2) {
-    S1(n) ;
-    for (c3=1;c3<=n-1;c3++) {
-      S2(n,c3) ;
-    }
-    S3(n) ;
-  }
-}
diff --git a/cloog-0.17.0/test/cholesky.cloog b/cloog-0.17.0/test/cholesky.cloog
deleted file mode 100644
index a3eadea..0000000
--- a/cloog-0.17.0/test/cholesky.cloog
+++ /dev/null
@@ -1,129 +0,0 @@
-# language: C
-c
-
-# parameter n
-1 3
-#  n  1
-1  0  1
-1
-n
-
-6 # Number of statements
-
-1
-# S1 {i | 1<=i<=n}
-2 4
-#  i  n  1
-1  1  0 -1
-1 -1  1  0
-0 0 0
-
-1
-# S2 {i, j | 1<=i<=n; 1<=j<=i-1}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1  0  1  0 -1
-1  1 -1  0 -1
-0 0 0
-
-1
-# S3 {i | 1<=i<=n}
-2 4
-#  i  n  1
-1  1  0 -1
-1 -1  1  0
-0 0 0
-
-1
-# S4 {i, j | 1<=i<=n; i+1<=j<=n}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1 -1  1  0 -1
-1  0 -1  1  0
-0 0 0
-
-1
-# S5 {i, j, k | 1<=i<=n; i+1<=j<=n 1<=k<=i-1}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1 -1  1  0  0 -1
-1  0 -1  0  1  0
-1  0  0  1  0 -1
-1  1  0 -1  0 -1
-0 0 0
-
-1
-# S6 {i, j | 1<=i<=n; i+1<=j<=n}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1 -1  1  0 -1
-1  0 -1  1  0
-0 0 0
-0
-
-6 # Scattering functions
-# Et les instructions de chunking (prog init)...
-6 10
-# c1 c2 c3 c4 c5 c6  i  n  1
-0  1  0  0  0  0  0 -1  0  0
-0  0  1  0  0  0  0  0  0 -1
-0  0  0  1  0  0  0  0  0  0
-0  0  0  0  1  0  0  0  0  0
-0  0  0  0  0  1  0  0  0  0
-0  0  0  0  0  0  1  0  0  0
-
-6 11
-# c1 c2 c3 c4 c5 c6  i  j  n  1
-0  1  0  0  0  0  0 -1  0  0  0
-0  0  1  0  0  0  0  0  0  0 -2
-0  0  0  1  0  0  0  0 -1  0  0
-0  0  0  0  1  0  0  0  0  0 -1
-0  0  0  0  0  1  0  0  0  0  0
-0  0  0  0  0  0  1  0  0  0  0
-
-6 10
-# c1 c2 c3 c4 c5 c6  i  n  1
-0  1  0  0  0  0  0 -1  0  0
-0  0  1  0  0  0  0  0  0 -3
-0  0  0  1  0  0  0  0  0  0
-0  0  0  0  1  0  0  0  0  0
-0  0  0  0  0  1  0  0  0  0
-0  0  0  0  0  0  1  0  0  0
-
-6 11
-# c1 c2 c3 c4 c5 c6  i  j  n  1
-0  1  0  0  0  0  0 -1  0  0  0
-0  0  1  0  0  0  0  0  0  0 -4
-0  0  0  1  0  0  0  0 -1  0  0
-0  0  0  0  1  0  0  0  0  0 -1
-0  0  0  0  0  1  0  0  0  0  0
-0  0  0  0  0  0  1  0  0  0  0
-
-6 12
-# c1 c2 c3 c4 c5 c6  i  j  k  n  1
-0  1  0  0  0  0  0 -1  0  0  0  0
-0  0  1  0  0  0  0  0  0  0  0 -4
-0  0  0  1  0  0  0  0 -1  0  0  0
-0  0  0  0  1  0  0  0  0  0  0 -2
-0  0  0  0  0  1  0  0  0 -1  0  0
-0  0  0  0  0  0  1  0  0  0  0 -1
-
-6 11
-# c1 c2 c3 c4 c5 c6  i  j  n  1
-0  1  0  0  0  0  0 -1  0  0  0
-0  0  1  0  0  0  0  0  0  0 -4
-0  0  0  1  0  0  0  0 -1  0  0
-0  0  0  0  1  0  0  0  0  0 -3
-0  0  0  0  0  1  0  0  0  0  0
-0  0  0  0  0  0  1  0  0  0  0
-0
-
-
diff --git a/cloog-0.17.0/test/cholesky.good.c b/cloog-0.17.0/test/cholesky.good.c
deleted file mode 100644
index 7619b7e..0000000
--- a/cloog-0.17.0/test/cholesky.good.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Generated from ../../../git/cloog/test/cholesky.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.05s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i) { hash(3); hash(i); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-#define S5(i,j,k) { hash(5); hash(i); hash(j); hash(k); }
-#define S6(i,j) { hash(6); hash(i); hash(j); }
-
-void test(int n)
-{
-  /* Scattering iterators. */
-  int c1, c3, c5;
-  /* Original iterators. */
-  int i, j, k;
-  if (n >= 2) {
-    S1(1) ;
-    S3(1) ;
-    for (c3=2;c3<=n;c3++) {
-      S4(1,c3) ;
-      S6(1,c3) ;
-    }
-  }
-  if (n == 1) {
-    S1(1) ;
-    S3(1) ;
-  }
-  for (c1=2;c1<=n-1;c1++) {
-    S1(c1) ;
-    for (c3=1;c3<=c1-1;c3++) {
-      S2(c1,c3) ;
-    }
-    S3(c1) ;
-    for (c3=c1+1;c3<=n;c3++) {
-      S4(c1,c3) ;
-      for (c5=1;c5<=c1-1;c5++) {
-        S5(c1,c3,c5) ;
-      }
-      S6(c1,c3) ;
-    }
-  }
-  if (n >= 2) {
-    S1(n) ;
-    for (c3=1;c3<=n-1;c3++) {
-      S2(n,c3) ;
-    }
-    S3(n) ;
-  }
-}
diff --git a/cloog-0.17.0/test/cholesky2.c b/cloog-0.17.0/test/cholesky2.c
deleted file mode 100644
index 3141bdc..0000000
--- a/cloog-0.17.0/test/cholesky2.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/* Generated from ../../../git/cloog/test/cholesky2.cloog by CLooG 0.16.1-2-g33ac553 gmp bits in 0.02s. */
-if (M >= 1) {
-  for (c2=1;c2<=M-1;c2++) {
-    S1(c2);
-    for (c3=c2+1;c3<=M;c3++) {
-      S4(c2,c3);
-    }
-  }
-  S1(M);
-  S3(1);
-  if (M >= 3) {
-    S6(1,2);
-    for (c2=3;c2<=M;c2++) {
-      S6(1,c2);
-      for (i=2;i<=c2-1;i++) {
-        S5(i,c2,1);
-      }
-    }
-  }
-  if (M == 2) {
-    S6(1,2);
-  }
-  for (c1=3;c1<=3*M-7;c1++) {
-    if ((c1+2)%3 == 0) {
-      S3((c1+2)/3);
-    }
-    if (c1%3 == 0) {
-      S2((c1+3)/3,c1/3);
-    }
-    if ((c1+1)%3 == 0) {
-      S6((c1+1)/3,(c1+4)/3);
-    }
-    if (c1%3 == 0) {
-      S2((c1+6)/3,c1/3);
-    }
-    for (c2=ceild(c1+7,3);c2<=M;c2++) {
-      if ((c1+1)%3 == 0) {
-        S6((c1+1)/3,c2);
-      }
-      if (c1%3 == 0) {
-        S2(c2,c1/3);
-      }
-      if ((c1+1)%3 == 0) {
-        for (i=ceild(c1+4,3);i<=c2-1;i++) {
-          S5(i,c2,(c1+1)/3);
-        }
-      }
-    }
-  }
-  if (M >= 3) {
-    for (c2=M-1;c2<=M;c2++) {
-      S2(c2,M-2);
-    }
-  }
-  if (M >= 3) {
-    S3(M-1);
-  }
-  if (M >= 3) {
-    S6(M-1,M);
-  }
-  if (M >= 2) {
-    S2(M,M-1);
-  }
-  if (M >= 2) {
-    S3(M);
-  }
-}
diff --git a/cloog-0.17.0/test/cholesky2.cloog b/cloog-0.17.0/test/cholesky2.cloog
deleted file mode 100644
index 6c0a81a..0000000
--- a/cloog-0.17.0/test/cholesky2.cloog
+++ /dev/null
@@ -1,108 +0,0 @@
-# language: C
-c
-
-# parameter n
-1 3
-#  n  1
-1  0  1
-0
-
-6 # Number of statements
-
-1
-# S1 {i | 1<=i<=n}
-2 4
-#  i  n  1
-1  1  0 -1
-1 -1  1  0
-0  0  0
-
-1
-# S2 {i, j | 1<=i<=n; 1<=j<=i-1}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1  0  1  0 -1
-1  1 -1  0 -1
-0  0  0
-
-1
-# S3 {i | 1<=i<=n}
-2 4
-#  i  n  1
-1  1  0 -1
-1 -1  1  0
-0  0  0
-
-1
-# S4 {i, j | 1<=i<=n; i+1<=j<=n}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1 -1  1  0 -1
-1  0 -1  1  0
-0  0  0
-
-1
-# S5 {i, j, k | 1<=i<=n; i+1<=j<=n 1<=k<=i-1}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1 -1  1  0  0 -1
-1  0 -1  0  1  0
-1  0  0  1  0 -1
-1  1  0 -1  0 -1
-0  0  0
-
-1
-# S6 {i, j | 1<=i<=n; i+1<=j<=n}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1 -1  1  0 -1
-1  0 -1  1  0
-0  0  0
-0
-
-6 # Scattering functions
-# Et les instructions de chunking (parallele)...
-3 7
-# c1 c2 c3  i  n  1
-0  1  0  0  0  0  0
-0  0  1  0 -1  0  0
-0  0  0  1  0  0  0
-
-3 8
-# c1 c2 c3  i  j  n  1
-0  1  0  0  0 -3  0  0
-0  0  1  0 -1  0  0  0
-0  0  0  1  0  0  0  0
-
-3 7
-# c1 c2 c3  i  n  1
-0  1  0  0 -3  0  2
-0  0  1  0  0  0  0
-0  0  0  1  0  0  0
-
-3 8
-# c1 c2 c3  i  j  n  1
-0  1  0  0  0  0  0  0
-0  0  1  0 -1  0  0  0
-0  0  0  1  0 -1  0  0
-
-3 9
-# c1 c2 c3  i  j  k  n  1
-0  1  0  0  0  0 -3  0  1
-0  0  1  0  0 -1  0  0  0
-0  0  0  1  0  0 -1  0  0
-
-3 8
-# c1 c2 c3  i  j  n  1
-0  1  0  0 -3  0  0  1
-0  0  1  0  0 -1  0  0
-0  0  0  1  0  0  0  0
-0
diff --git a/cloog-0.17.0/test/cholesky2.good.c b/cloog-0.17.0/test/cholesky2.good.c
deleted file mode 100644
index ee4b344..0000000
--- a/cloog-0.17.0/test/cholesky2.good.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/* Generated from ../../../git/cloog/test/cholesky2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.11s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i) { hash(3); hash(i); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-#define S5(i,j,k) { hash(5); hash(i); hash(j); hash(k); }
-#define S6(i,j) { hash(6); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c1, c2, c3;
-  /* Original iterators. */
-  int i, j, k;
-  if (M >= 2) {
-    for (c2=1;c2<=M-1;c2++) {
-      S1(c2) ;
-      for (c3=c2+1;c3<=M;c3++) {
-        S4(c2,c3) ;
-      }
-    }
-    S1(M) ;
-  }
-  if (M == 1) {
-    S1(1) ;
-  }
-  if (M >= 2) {
-    S3(1) ;
-  }
-  if (M >= 3) {
-    S6(1,2) ;
-    for (c2=3;c2<=M;c2++) {
-      S6(1,c2) ;
-      for (i=2;i<=c2-1;i++) {
-        S5(i,c2,1) ;
-      }
-    }
-  }
-  if (M == 2) {
-    S6(1,2) ;
-  }
-  for (c1=3;c1<=3*M-7;c1++) {
-    if ((c1+2)%3 == 0) {
-      i = (c1+2)/3 ;
-      S3((c1+2)/3) ;
-    }
-    if (c1%3 == 0) {
-      c2 = (c1+3)/3 ;
-      i = (c1+3)/3 ;
-      S2((c1+3)/3,c1/3) ;
-    }
-    c2 = floord(c1+6,3) ;
-    if ((c1+1)%3 == 0) {
-      i = (c1+1)/3 ;
-      S6((c1+1)/3,c2) ;
-    }
-    if (c1%3 == 0) {
-      S2(c2,c1/3) ;
-    }
-    for (c2=ceild(c1+7,3);c2<=M;c2++) {
-      if ((c1+1)%3 == 0) {
-        i = (c1+1)/3 ;
-        S6((c1+1)/3,c2) ;
-      }
-      if (c1%3 == 0) {
-        S2(c2,c1/3) ;
-      }
-      if ((c1+1)%3 == 0) {
-        c3 = (c1+1)/3 ;
-        for (i=ceild(c1+4,3);i<=c2-1;i++) {
-          k = (c1+1)/3 ;
-          S5(i,c2,(c1+1)/3) ;
-        }
-      }
-    }
-  }
-  for (c1=max(3*M-6,3);c1<=3*M-4;c1++) {
-    if ((c1+2)%3 == 0) {
-      i = (c1+2)/3 ;
-      S3((c1+2)/3) ;
-    }
-    if (c1%3 == 0) {
-      c2 = (c1+3)/3 ;
-      i = (c1+3)/3 ;
-      S2((c1+3)/3,c1/3) ;
-    }
-    for (c2=ceild(c1+4,3);c2<=M;c2++) {
-      if ((c1+1)%3 == 0) {
-        i = (c1+1)/3 ;
-        S6((c1+1)/3,c2) ;
-      }
-      if (c1%3 == 0) {
-        S2(c2,c1/3) ;
-      }
-    }
-  }
-  if (M >= 2) {
-    c1 = 3*M-3 ;
-    j = M-1 ;
-    S2(M,M-1) ;
-  }
-  if (M >= 1) {
-    c1 = 3*M-2 ;
-    S3(M) ;
-  }
-}
diff --git a/cloog-0.17.0/test/christian.c b/cloog-0.17.0/test/christian.c
deleted file mode 100644
index cc3c5d3..0000000
--- a/cloog-0.17.0/test/christian.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Generated from ../../../git/cloog/test/christian.cloog by CLooG 0.16.2-5-g3b3bf96 gmp bits in 0.01s. */
-if (N >= 1) {
-  S1(0,N-1);
-  for (p=-N+2;p<=N-1;p++) {
-    if (p >= 1) {
-      S2(p-1,0);
-    }
-    for (i=max(0,p);i<=min(N-1,p+N-2);i++) {
-      S1(i,-p+i);
-      S2(i,-p+i+1);
-    }
-    if (p <= 0) {
-      S1(p+N-1,N-1);
-    }
-  }
-  S2(N-1,0);
-}
diff --git a/cloog-0.17.0/test/christian.cloog b/cloog-0.17.0/test/christian.cloog
deleted file mode 100644
index 088977e..0000000
--- a/cloog-0.17.0/test/christian.cloog
+++ /dev/null
@@ -1,57 +0,0 @@
-# =============================================== Global
-# Language
-C
-
-# Context
-0 3
-
-# Parameter names are provided
-1
-# Parameter names
-N 
-
-# Number of statements
-2
-
-# =============================================== Statement 1
-# ----------------------------------------------  1.1 Domain
-# Iteration domain
-1
-4 5
-   1    1    0    0    0    ## i >= 0
-   1   -1    0    1   -1    ## -i+N-1 >= 0
-   1    0    1    0    0    ## j >= 0
-   1    0   -1    1   -1    ## -j+N-1 >= 0
-0 0 0
-
-# =============================================== Statement 2
-# ----------------------------------------------  2.1 Domain
-# Iteration domain
-1
-4 5
-   1    1    0    0    0    ## i >= 0
-   1   -1    0    1   -1    ## -i+N-1 >= 0
-   1    0    1    0    0    ## j >= 0
-   1    0   -1    1   -1    ## -j+N-1 >= 0
-0 0 0
-
-#naming for domains
-0
-
-# ---------------------------------------------- Scatterings
-# of Scattering functions
-2
-
-# Scattering function
-1 6
-   0   1   -1    1    0    0    ## p = i-j
-
-# Scattering function
-1 6
-   0   1   -1    1    0   -1    ## p = i-j+1
-
-
-# we will set the scattering dimension names
-1
-p
-
diff --git a/cloog-0.17.0/test/christian.good.c b/cloog-0.17.0/test/christian.good.c
deleted file mode 100644
index 28f578c..0000000
--- a/cloog-0.17.0/test/christian.good.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Generated from ../../../git/cloog/test/christian.cloog by CLooG 0.16.2-5-g3b3bf96 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int N)
-{
-  /* Scattering iterators. */
-  int p;
-  /* Original iterators. */
-  int i, j;
-  if (N >= 1) {
-    S1(0,N-1);
-    for (p=-N+2;p<=N-1;p++) {
-      if (p >= 1) {
-        S2(p-1,0);
-      }
-      for (i=max(0,p);i<=min(N-1,p+N-2);i++) {
-        S1(i,-p+i);
-        S2(i,-p+i+1);
-      }
-      if (p <= 0) {
-        S1(p+N-1,N-1);
-      }
-    }
-    S2(N-1,0);
-  }
-}
diff --git a/cloog-0.17.0/test/classen.c b/cloog-0.17.0/test/classen.c
deleted file mode 100644
index 3b5b05e..0000000
--- a/cloog-0.17.0/test/classen.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/classen.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.45s. */
-if (m >= 1) {
-  if (m >= 2) {
-    S1(0,1,1,1);
-    S2(0,1,1,1,1,1,2,1);
-    S3(0,1,1,2,1,1,1,2);
-    S4(0,1,2,2,1,1,2,2);
-    S8(0,1);
-  }
-  if (m == 1) {
-    S1(0,1,1,1);
-    S8(0,1);
-  }
-  for (glT1=1;glT1<=2*m-4;glT1++) {
-    if (glT1 <= m-2) {
-      S5(glT1-1,1,glT1,1,glT1,1,glT1+1,1);
-      S1(glT1,1,glT1+1,1);
-      S2(glT1,1,glT1+1,1,glT1+1,1,glT1+2,1);
-      S3(glT1,1,glT1+1,2,glT1+1,1,glT1+1,2);
-      S4(glT1,1,glT1+2,2,glT1+1,1,glT1+2,2);
-    }
-    if (glT1 >= m) {
-      S5(glT1-1,glT1-m+2,glT1,glT1-m+2,m-1,glT1-m+2,m,glT1-m+2);
-      S6(glT1-1,glT1-m+1,glT1,glT1-m+2,m,glT1-m+1,m,glT1-m+2);
-      S1(glT1,glT1-m+2,m,glT1-m+2);
-      S3(glT1,glT1-m+2,glT1+1,glT1-m+3,m,glT1-m+2,m,glT1-m+3);
-    }
-    if (glT1 == m-1) {
-      S5(m-2,1,m-1,1,m-1,1,m,1);
-      S1(m-1,1,m,1);
-      S3(m-1,1,m,2,m,1,m,2);
-    }
-    for (rp1=max(2,glT1-m+3);rp1<=min(glT1,m-1);rp1++) {
-      S5(glT1-1,rp1,glT1,rp1,glT1-rp1+1,rp1,glT1-rp1+2,rp1);
-      S6(glT1-1,rp1-1,glT1,rp1,glT1-rp1+2,rp1-1,glT1-rp1+2,rp1);
-      S7(glT1-1,rp1-1,glT1+1,rp1,glT1-rp1+2,rp1-1,glT1-rp1+3,rp1);
-      S1(glT1,rp1,glT1-rp1+2,rp1);
-      S2(glT1,rp1,glT1+1,rp1,glT1-rp1+2,rp1,glT1-rp1+3,rp1);
-      S3(glT1,rp1,glT1+1,rp1+1,glT1-rp1+2,rp1,glT1-rp1+2,rp1+1);
-      S4(glT1,rp1,glT1+2,rp1+1,glT1-rp1+2,rp1,glT1-rp1+3,rp1+1);
-    }
-    if (glT1 <= m-2) {
-      S6(glT1-1,glT1,glT1,glT1+1,1,glT1,1,glT1+1);
-      S7(glT1-1,glT1,glT1+1,glT1+1,1,glT1,2,glT1+1);
-      S1(glT1,glT1+1,1,glT1+1);
-      S2(glT1,glT1+1,glT1+1,glT1+1,1,glT1+1,2,glT1+1);
-      S3(glT1,glT1+1,glT1+1,glT1+2,1,glT1+1,1,glT1+2);
-      S4(glT1,glT1+1,glT1+2,glT1+2,1,glT1+1,2,glT1+2);
-    }
-    if (glT1 >= m) {
-      S5(glT1-1,m,glT1,m,glT1-m+1,m,glT1-m+2,m);
-      S6(glT1-1,m-1,glT1,m,glT1-m+2,m-1,glT1-m+2,m);
-      S7(glT1-1,m-1,glT1+1,m,glT1-m+2,m-1,glT1-m+3,m);
-      S1(glT1,m,glT1-m+2,m);
-      S2(glT1,m,glT1+1,m,glT1-m+2,m,glT1-m+3,m);
-    }
-    if (glT1 == m-1) {
-      S6(m-2,m-1,m-1,m,1,m-1,1,m);
-      S7(m-2,m-1,m,m,1,m-1,2,m);
-      S1(m-1,m,1,m);
-      S2(m-1,m,m,m,1,m,2,m);
-    }
-    for (coordP1=max(1,glT1-m+2);coordP1<=min(m,glT1+1);coordP1++) {
-      S8(glT1,coordP1);
-    }
-  }
-  if (m >= 2) {
-    if (m >= 3) {
-      S5(2*m-4,m-1,2*m-3,m-1,m-1,m-1,m,m-1);
-      S6(2*m-4,m-2,2*m-3,m-1,m,m-2,m,m-1);
-      S1(2*m-3,m-1,m,m-1);
-      S3(2*m-3,m-1,2*m-2,m,m,m-1,m,m);
-    }
-    if (m == 2) {
-      S5(0,1,1,1,1,1,2,1);
-      S1(1,1,2,1);
-      S3(1,1,2,2,2,1,2,2);
-    }
-    if (m >= 3) {
-      S5(2*m-4,m,2*m-3,m,m-2,m,m-1,m);
-      S6(2*m-4,m-1,2*m-3,m,m-1,m-1,m-1,m);
-      S7(2*m-4,m-1,2*m-2,m,m-1,m-1,m,m);
-      S1(2*m-3,m,m-1,m);
-    }
-    if (m == 2) {
-      S6(0,1,1,2,1,1,1,2);
-      S7(0,1,2,2,1,1,2,2);
-      S1(1,2,1,2);
-    }
-    S2(2*m-3,m,2*m-2,m,m-1,m,m,m);
-    for (coordP1=m-1;coordP1<=m;coordP1++) {
-      S8(2*m-3,coordP1);
-    }
-  }
-  if (m >= 2) {
-    S5(2*m-3,m,2*m-2,m,m-1,m,m,m);
-    S6(2*m-3,m-1,2*m-2,m,m,m-1,m,m);
-    S1(2*m-2,m,m,m);
-    S8(2*m-2,m);
-  }
-}
diff --git a/cloog-0.17.0/test/classen.cloog b/cloog-0.17.0/test/classen.cloog
deleted file mode 100644
index 06fe3b0..0000000
--- a/cloog-0.17.0/test/classen.cloog
+++ /dev/null
@@ -1,233 +0,0 @@
-# created: Fri Mar  4 11:37:56 CET 2005
-# ---------------------- CONTEXT ----------------------
-c # language is C
-
-# Context
-1 3
- 1 1 0
-
-
-1 # set parameter names
-m
-
-# --------------------- STATEMENTS --------------------
-8
-
-# 1 computation stmts:
-1 # one domain per statement
-7 7
- 1 0 0 0 0 1 -1
- 1 0 0 -1 0 1 0
- 1 0 0 1 0 0 -1
- 1 0 0 0 -1 1 0
- 1 0 0 0 1 0 -1
- 0 0 -1 0 1 0 0
- 0 -1 0 1 1 0 -2
-0 0 0 # for future options...
-
-
-# 3 prepare-send stmts:
-1 # one domain per statement
-13 11
- 1 0 0 0 0 0 0 0 0 1 -1
- 1 -1 0 0 0 0 0 0 0 2 -3
- 1 1 0 0 0 0 0 0 0 0 0
- 1 1 -1 0 0 0 0 0 0 0 1
- 1 0 -1 0 0 0 0 0 0 1 0
- 1 -1 1 0 0 0 0 0 0 1 -3
- 1 0 1 0 0 0 0 0 0 0 -1
- 0 0 0 0 -1 0 0 0 1 0 0
- 0 0 0 -1 0 0 0 1 1 0 -2
- 0 0 -1 0 0 0 1 0 0 0 0
- 0 -1 0 0 0 1 1 0 0 0 -2
- 0 -1 0 1 0 0 0 0 0 0 -1
- 0 0 -1 0 1 0 0 0 0 0 0
-0 0 0 # for future options...
-
-
-1 # one domain per statement
-13 11
- 1 0 0 0 0 0 0 0 0 1 -1
- 1 -1 0 0 0 0 0 0 0 2 -3
- 1 1 0 0 0 0 0 0 0 0 0
- 1 1 -1 0 0 0 0 0 0 0 1
- 1 0 -1 0 0 0 0 0 0 1 -1
- 1 -1 1 0 0 0 0 0 0 1 -2
- 1 0 1 0 0 0 0 0 0 0 -1
- 0 0 0 0 -1 0 0 0 1 0 0
- 0 0 0 -1 0 0 0 1 1 0 -2
- 0 0 -1 0 0 0 1 0 0 0 0
- 0 -1 0 0 0 1 1 0 0 0 -2
- 0 -1 0 1 0 0 0 0 0 0 -1
- 0 0 -1 0 1 0 0 0 0 0 -1
-0 0 0 # for future options...
-
-
-1 # one domain per statement
-13 11
- 1 0 0 0 0 0 0 0 0 1 -1
- 1 -1 0 0 0 0 0 0 0 2 -4
- 1 1 0 0 0 0 0 0 0 0 0
- 1 1 -1 0 0 0 0 0 0 0 1
- 1 0 -1 0 0 0 0 0 0 1 -1
- 1 -1 1 0 0 0 0 0 0 1 -3
- 1 0 1 0 0 0 0 0 0 0 -1
- 0 0 0 0 -1 0 0 0 1 0 0
- 0 0 0 -1 0 0 0 1 1 0 -2
- 0 0 -1 0 0 0 1 0 0 0 0
- 0 -1 0 0 0 1 1 0 0 0 -2
- 0 -1 0 1 0 0 0 0 0 0 -2
- 0 0 -1 0 1 0 0 0 0 0 -1
-0 0 0 # for future options...
-
-
-# 3 prepare-receive stmts:
-1 # one domain per statement
-13 11
- 1 0 0 0 0 0 0 0 0 1 -1
- 1 -1 0 0 0 0 0 0 0 2 -3
- 1 1 0 0 0 0 0 0 0 0 0
- 1 1 -1 0 0 0 0 0 0 0 1
- 1 0 -1 0 0 0 0 0 0 1 0
- 1 -1 1 0 0 0 0 0 0 1 -3
- 1 0 1 0 0 0 0 0 0 0 -1
- 0 0 0 0 -1 0 0 0 1 0 0
- 0 0 0 -1 0 0 0 1 1 0 -2
- 0 0 -1 0 0 0 1 0 0 0 0
- 0 -1 0 0 0 1 1 0 0 0 -2
- 0 -1 0 1 0 0 0 0 0 0 -1
- 0 0 -1 0 1 0 0 0 0 0 0
-0 0 0 # for future options...
-
-
-1 # one domain per statement
-13 11
- 1 0 0 0 0 0 0 0 0 1 -1
- 1 -1 0 0 0 0 0 0 0 2 -3
- 1 1 0 0 0 0 0 0 0 0 0
- 1 1 -1 0 0 0 0 0 0 0 1
- 1 0 -1 0 0 0 0 0 0 1 -1
- 1 -1 1 0 0 0 0 0 0 1 -2
- 1 0 1 0 0 0 0 0 0 0 -1
- 0 0 0 0 -1 0 0 0 1 0 0
- 0 0 0 -1 0 0 0 1 1 0 -2
- 0 0 -1 0 0 0 1 0 0 0 0
- 0 -1 0 0 0 1 1 0 0 0 -2
- 0 -1 0 1 0 0 0 0 0 0 -1
- 0 0 -1 0 1 0 0 0 0 0 -1
-0 0 0 # for future options...
-
-
-1 # one domain per statement
-13 11
- 1 0 0 0 0 0 0 0 0 1 -1
- 1 -1 0 0 0 0 0 0 0 2 -4
- 1 1 0 0 0 0 0 0 0 0 0
- 1 1 -1 0 0 0 0 0 0 0 1
- 1 0 -1 0 0 0 0 0 0 1 -1
- 1 -1 1 0 0 0 0 0 0 1 -3
- 1 0 1 0 0 0 0 0 0 0 -1
- 0 0 0 0 -1 0 0 0 1 0 0
- 0 0 0 -1 0 0 0 1 1 0 -2
- 0 0 -1 0 0 0 1 0 0 0 0
- 0 -1 0 0 0 1 1 0 0 0 -2
- 0 -1 0 1 0 0 0 0 0 0 -2
- 0 0 -1 0 1 0 0 0 0 0 -1
-0 0 0 # for future options...
-
-
-# communication statement:
-1 # number of domains for communication statement
-6 5
- 1 -1 0 2 -2
- 1 1 0 0 0
- 1 1 -1 0 1
- 1 0 -1 1 0
- 1 -1 1 1 -2
- 1 0 1 0 -1
-
-
-0 0 0 # for future options...
-
-
-1 # set the iterator names
-coordT1 coordP1 other1 other2 other3 other4 other5 other6
-
-# --------------------- SCATTERING --------------------
-8 # Scattering functions
-7 14
- 0 1 0 0 0 0 0 0 -1 0 0 0 0 0
- 0 0 1 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 -1 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0 0 -1
- 0 0 0 0 0 1 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 1 0 0 0 0 0 0
-
-7 18
- 0 1 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0
- 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 -1 0 0 0 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -2
- 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0
- 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 -1
-
-7 18
- 0 1 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0
- 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 -1 0 0 0 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -2
- 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0
- 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 -1
-
-7 18
- 0 1 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0
- 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 -1 0 0 0 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -2
- 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0
- 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 -1
-
-7 18
- 0 1 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 -1
- 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 0 0 -1 0 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0
- 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 -1
-
-7 18
- 0 1 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 -1
- 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 0 0 -1 0 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0
- 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 -1
-
-7 18
- 0 1 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 -1
- 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 0 0 -1 0 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0
- 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 -1
-
-7 12
- 0 1 0 0 0 0 0 0 -1 0 0 0
- 0 0 1 0 0 0 0 0 0 0 0 -1
- 0 0 0 1 0 0 0 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0
- 0 0 0 0 0 1 0 0 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0
- 0 0 0 0 0 0 0 1 0 0 0 0
-
-
-1 # we set the scattering dimension names
-glT1 bl rp1 stmtType local1 local2 local3
-
diff --git a/cloog-0.17.0/test/classen.good.c b/cloog-0.17.0/test/classen.good.c
deleted file mode 100644
index 5c97c50..0000000
--- a/cloog-0.17.0/test/classen.good.c
+++ /dev/null
@@ -1,396 +0,0 @@
-/* Generated from ../../../git/cloog/test/classen.cloog by CLooG 0.14.0-76-gfd78716 gmp bits in 1.73s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(coordT1,coordP1,other1,other2) { hash(1); hash(coordT1); hash(coordP1); hash(other1); hash(other2); }
-#define S2(coordT1,coordP1,other1,other2,other3,other4,other5,other6) { hash(2); hash(coordT1); hash(coordP1); hash(other1); hash(other2); hash(other3); hash(other4); hash(other5); hash(other6); }
-#define S3(coordT1,coordP1,other1,other2,other3,other4,other5,other6) { hash(3); hash(coordT1); hash(coordP1); hash(other1); hash(other2); hash(other3); hash(other4); hash(other5); hash(other6); }
-#define S4(coordT1,coordP1,other1,other2,other3,other4,other5,other6) { hash(4); hash(coordT1); hash(coordP1); hash(other1); hash(other2); hash(other3); hash(other4); hash(other5); hash(other6); }
-#define S5(coordT1,coordP1,other1,other2,other3,other4,other5,other6) { hash(5); hash(coordT1); hash(coordP1); hash(other1); hash(other2); hash(other3); hash(other4); hash(other5); hash(other6); }
-#define S6(coordT1,coordP1,other1,other2,other3,other4,other5,other6) { hash(6); hash(coordT1); hash(coordP1); hash(other1); hash(other2); hash(other3); hash(other4); hash(other5); hash(other6); }
-#define S7(coordT1,coordP1,other1,other2,other3,other4,other5,other6) { hash(7); hash(coordT1); hash(coordP1); hash(other1); hash(other2); hash(other3); hash(other4); hash(other5); hash(other6); }
-#define S8(coordT1,coordP1) { hash(8); hash(coordT1); hash(coordP1); }
-
-void test(int m)
-{
-  /* Scattering iterators. */
-  int glT1, rp1, local1, local2;
-  /* Original iterators. */
-  int coordT1, coordP1, other1, other2, other3, other4, other5, other6;
-  if (m >= 2) {
-    S1(0,1,1,1) ;
-    S2(0,1,1,1,1,1,2,1) ;
-    S3(0,1,1,2,1,1,1,2) ;
-    S4(0,1,2,2,1,1,2,2) ;
-    S8(0,1) ;
-  }
-  if (m == 1) {
-    S1(0,1,1,1) ;
-    S8(0,1) ;
-  }
-  if (m >= 3) {
-    S5(0,1,1,1,1,1,2,1) ;
-    S1(1,1,2,1) ;
-    S2(1,1,2,1,2,1,3,1) ;
-    S3(1,1,2,2,2,1,2,2) ;
-    S4(1,1,3,2,2,1,3,2) ;
-    S6(0,1,1,2,1,1,1,2) ;
-    S7(0,1,2,2,1,1,2,2) ;
-    S1(1,2,1,2) ;
-    S2(1,2,2,2,1,2,2,2) ;
-    S3(1,2,2,3,1,2,1,3) ;
-    S4(1,2,3,3,1,2,2,3) ;
-    for (coordP1=1;coordP1<=2;coordP1++) {
-      S8(1,coordP1) ;
-    }
-  }
-  for (glT1=2;glT1<=m-2;glT1++) {
-    coordT1 = glT1-1 ;
-    other5 = glT1+1 ;
-    S5(glT1-1,1,glT1,1,glT1,1,glT1+1,1) ;
-    other1 = glT1+1 ;
-    S1(glT1,1,glT1+1,1) ;
-    local1 = glT1+1 ;
-    other1 = glT1+1 ;
-    other3 = glT1+1 ;
-    other5 = glT1+2 ;
-    S2(glT1,1,glT1+1,1,glT1+1,1,glT1+2,1) ;
-    other3 = glT1+1 ;
-    other5 = glT1+1 ;
-    S3(glT1,1,glT1+1,2,glT1+1,1,glT1+1,2) ;
-    other1 = glT1+2 ;
-    other3 = glT1+1 ;
-    other5 = glT1+2 ;
-    S4(glT1,1,glT1+2,2,glT1+1,1,glT1+2,2) ;
-    for (rp1=2;rp1<=glT1;rp1++) {
-      local1 = glT1-rp1+1 ;
-      coordT1 = glT1-1 ;
-      other3 = glT1-rp1+1 ;
-      other5 = glT1-rp1+2 ;
-      S5(glT1-1,rp1,glT1,rp1,glT1-rp1+1,rp1,glT1-rp1+2,rp1) ;
-      local1 = glT1-rp1+2 ;
-      local2 = rp1-1 ;
-      coordT1 = glT1-1 ;
-      coordP1 = rp1-1 ;
-      other3 = glT1-rp1+2 ;
-      other4 = rp1-1 ;
-      other5 = glT1-rp1+2 ;
-      S6(glT1-1,rp1-1,glT1,rp1,glT1-rp1+2,rp1-1,glT1-rp1+2,rp1) ;
-      other1 = glT1+1 ;
-      other3 = glT1-rp1+2 ;
-      other4 = rp1-1 ;
-      other5 = glT1-rp1+3 ;
-      S7(glT1-1,rp1-1,glT1+1,rp1,glT1-rp1+2,rp1-1,glT1-rp1+3,rp1) ;
-      other1 = glT1-rp1+2 ;
-      S1(glT1,rp1,glT1-rp1+2,rp1) ;
-      local1 = glT1-rp1+2 ;
-      other1 = glT1+1 ;
-      other3 = glT1-rp1+2 ;
-      other5 = glT1-rp1+3 ;
-      S2(glT1,rp1,glT1+1,rp1,glT1-rp1+2,rp1,glT1-rp1+3,rp1) ;
-      other2 = rp1+1 ;
-      other3 = glT1-rp1+2 ;
-      other5 = glT1-rp1+2 ;
-      other6 = rp1+1 ;
-      S3(glT1,rp1,glT1+1,rp1+1,glT1-rp1+2,rp1,glT1-rp1+2,rp1+1) ;
-      other1 = glT1+2 ;
-      other2 = rp1+1 ;
-      other3 = glT1-rp1+2 ;
-      other5 = glT1-rp1+3 ;
-      other6 = rp1+1 ;
-      S4(glT1,rp1,glT1+2,rp1+1,glT1-rp1+2,rp1,glT1-rp1+3,rp1+1) ;
-    }
-    rp1 = glT1+1 ;
-    coordT1 = glT1-1 ;
-    other2 = glT1+1 ;
-    other6 = glT1+1 ;
-    S6(glT1-1,glT1,glT1,glT1+1,1,glT1,1,glT1+1) ;
-    other1 = glT1+1 ;
-    other2 = glT1+1 ;
-    other6 = glT1+1 ;
-    S7(glT1-1,glT1,glT1+1,glT1+1,1,glT1,2,glT1+1) ;
-    coordP1 = glT1+1 ;
-    other2 = glT1+1 ;
-    S1(glT1,glT1+1,1,glT1+1) ;
-    local2 = glT1+1 ;
-    coordP1 = glT1+1 ;
-    other1 = glT1+1 ;
-    other2 = glT1+1 ;
-    other4 = glT1+1 ;
-    other6 = glT1+1 ;
-    S2(glT1,glT1+1,glT1+1,glT1+1,1,glT1+1,2,glT1+1) ;
-    other2 = glT1+2 ;
-    other4 = glT1+1 ;
-    other6 = glT1+2 ;
-    S3(glT1,glT1+1,glT1+1,glT1+2,1,glT1+1,1,glT1+2) ;
-    other1 = glT1+2 ;
-    other2 = glT1+2 ;
-    other4 = glT1+1 ;
-    other6 = glT1+2 ;
-    S4(glT1,glT1+1,glT1+2,glT1+2,1,glT1+1,2,glT1+2) ;
-    for (coordP1=1;coordP1<=glT1+1;coordP1++) {
-      S8(glT1,coordP1) ;
-    }
-  }
-  if (m >= 3) {
-    glT1 = m-1 ;
-    local1 = m-1 ;
-    coordT1 = m-2 ;
-    other1 = m-1 ;
-    other3 = m-1 ;
-    S5(m-2,1,m-1,1,m-1,1,m,1) ;
-    coordT1 = m-1 ;
-    S1(m-1,1,m,1) ;
-    coordT1 = m-1 ;
-    S3(m-1,1,m,2,m,1,m,2) ;
-    for (rp1=2;rp1<=m-1;rp1++) {
-      local1 = -rp1+m ;
-      coordT1 = m-2 ;
-      other1 = m-1 ;
-      other3 = -rp1+m ;
-      other5 = -rp1+m+1 ;
-      S5(m-2,rp1,m-1,rp1,-rp1+m,rp1,-rp1+m+1,rp1) ;
-      local1 = -rp1+m+1 ;
-      local2 = rp1-1 ;
-      coordT1 = m-2 ;
-      coordP1 = rp1-1 ;
-      other1 = m-1 ;
-      other3 = -rp1+m+1 ;
-      other4 = rp1-1 ;
-      other5 = -rp1+m+1 ;
-      S6(m-2,rp1-1,m-1,rp1,-rp1+m+1,rp1-1,-rp1+m+1,rp1) ;
-      other3 = -rp1+m+1 ;
-      other4 = rp1-1 ;
-      other5 = -rp1+m+2 ;
-      S7(m-2,rp1-1,m,rp1,-rp1+m+1,rp1-1,-rp1+m+2,rp1) ;
-      coordT1 = m-1 ;
-      other1 = -rp1+m+1 ;
-      S1(m-1,rp1,-rp1+m+1,rp1) ;
-      local1 = -rp1+m+1 ;
-      coordT1 = m-1 ;
-      other3 = -rp1+m+1 ;
-      other5 = -rp1+m+2 ;
-      S2(m-1,rp1,m,rp1,-rp1+m+1,rp1,-rp1+m+2,rp1) ;
-      other2 = rp1+1 ;
-      other3 = -rp1+m+1 ;
-      other5 = -rp1+m+1 ;
-      other6 = rp1+1 ;
-      S3(m-1,rp1,m,rp1+1,-rp1+m+1,rp1,-rp1+m+1,rp1+1) ;
-      other1 = m+1 ;
-      other2 = rp1+1 ;
-      other3 = -rp1+m+1 ;
-      other5 = -rp1+m+2 ;
-      other6 = rp1+1 ;
-      S4(m-1,rp1,m+1,rp1+1,-rp1+m+1,rp1,-rp1+m+2,rp1+1) ;
-    }
-    local2 = m-1 ;
-    coordT1 = m-2 ;
-    coordP1 = m-1 ;
-    other1 = m-1 ;
-    other4 = m-1 ;
-    S6(m-2,m-1,m-1,m,1,m-1,1,m) ;
-    other4 = m-1 ;
-    S7(m-2,m-1,m,m,1,m-1,2,m) ;
-    coordT1 = m-1 ;
-    S1(m-1,m,1,m) ;
-    coordT1 = m-1 ;
-    S2(m-1,m,m,m,1,m,2,m) ;
-    coordT1 = m-1 ;
-    for (coordP1=1;coordP1<=m;coordP1++) {
-      S8(m-1,coordP1) ;
-    }
-  }
-  for (glT1=m;glT1<=2*m-4;glT1++) {
-    rp1 = glT1-m+2 ;
-    local1 = m-1 ;
-    local2 = glT1-m+2 ;
-    coordT1 = glT1-1 ;
-    coordP1 = glT1-m+2 ;
-    other2 = glT1-m+2 ;
-    other3 = m-1 ;
-    other4 = glT1-m+2 ;
-    other6 = glT1-m+2 ;
-    S5(glT1-1,glT1-m+2,glT1,glT1-m+2,m-1,glT1-m+2,m,glT1-m+2) ;
-    local2 = glT1-m+1 ;
-    coordT1 = glT1-1 ;
-    coordP1 = glT1-m+1 ;
-    other2 = glT1-m+2 ;
-    other4 = glT1-m+1 ;
-    other6 = glT1-m+2 ;
-    S6(glT1-1,glT1-m+1,glT1,glT1-m+2,m,glT1-m+1,m,glT1-m+2) ;
-    coordP1 = glT1-m+2 ;
-    other2 = glT1-m+2 ;
-    S1(glT1,glT1-m+2,m,glT1-m+2) ;
-    local2 = glT1-m+2 ;
-    coordP1 = glT1-m+2 ;
-    other1 = glT1+1 ;
-    other2 = glT1-m+3 ;
-    other4 = glT1-m+2 ;
-    other6 = glT1-m+3 ;
-    S3(glT1,glT1-m+2,glT1+1,glT1-m+3,m,glT1-m+2,m,glT1-m+3) ;
-    for (rp1=glT1-m+3;rp1<=m-1;rp1++) {
-      local1 = glT1-rp1+1 ;
-      coordT1 = glT1-1 ;
-      other3 = glT1-rp1+1 ;
-      other5 = glT1-rp1+2 ;
-      S5(glT1-1,rp1,glT1,rp1,glT1-rp1+1,rp1,glT1-rp1+2,rp1) ;
-      local1 = glT1-rp1+2 ;
-      local2 = rp1-1 ;
-      coordT1 = glT1-1 ;
-      coordP1 = rp1-1 ;
-      other3 = glT1-rp1+2 ;
-      other4 = rp1-1 ;
-      other5 = glT1-rp1+2 ;
-      S6(glT1-1,rp1-1,glT1,rp1,glT1-rp1+2,rp1-1,glT1-rp1+2,rp1) ;
-      other1 = glT1+1 ;
-      other3 = glT1-rp1+2 ;
-      other4 = rp1-1 ;
-      other5 = glT1-rp1+3 ;
-      S7(glT1-1,rp1-1,glT1+1,rp1,glT1-rp1+2,rp1-1,glT1-rp1+3,rp1) ;
-      other1 = glT1-rp1+2 ;
-      S1(glT1,rp1,glT1-rp1+2,rp1) ;
-      local1 = glT1-rp1+2 ;
-      other1 = glT1+1 ;
-      other3 = glT1-rp1+2 ;
-      other5 = glT1-rp1+3 ;
-      S2(glT1,rp1,glT1+1,rp1,glT1-rp1+2,rp1,glT1-rp1+3,rp1) ;
-      other2 = rp1+1 ;
-      other3 = glT1-rp1+2 ;
-      other5 = glT1-rp1+2 ;
-      other6 = rp1+1 ;
-      S3(glT1,rp1,glT1+1,rp1+1,glT1-rp1+2,rp1,glT1-rp1+2,rp1+1) ;
-      other1 = glT1+2 ;
-      other2 = rp1+1 ;
-      other3 = glT1-rp1+2 ;
-      other5 = glT1-rp1+3 ;
-      other6 = rp1+1 ;
-      S4(glT1,rp1,glT1+2,rp1+1,glT1-rp1+2,rp1,glT1-rp1+3,rp1+1) ;
-    }
-    local1 = glT1-m+1 ;
-    coordT1 = glT1-1 ;
-    other3 = glT1-m+1 ;
-    other5 = glT1-m+2 ;
-    S5(glT1-1,m,glT1,m,glT1-m+1,m,glT1-m+2,m) ;
-    local1 = glT1-m+2 ;
-    local2 = m-1 ;
-    coordT1 = glT1-1 ;
-    coordP1 = m-1 ;
-    other3 = glT1-m+2 ;
-    other4 = m-1 ;
-    other5 = glT1-m+2 ;
-    S6(glT1-1,m-1,glT1,m,glT1-m+2,m-1,glT1-m+2,m) ;
-    other1 = glT1+1 ;
-    other3 = glT1-m+2 ;
-    other4 = m-1 ;
-    other5 = glT1-m+3 ;
-    S7(glT1-1,m-1,glT1+1,m,glT1-m+2,m-1,glT1-m+3,m) ;
-    other1 = glT1-m+2 ;
-    S1(glT1,m,glT1-m+2,m) ;
-    local1 = glT1-m+2 ;
-    other1 = glT1+1 ;
-    other3 = glT1-m+2 ;
-    other5 = glT1-m+3 ;
-    S2(glT1,m,glT1+1,m,glT1-m+2,m,glT1-m+3,m) ;
-    for (coordP1=glT1-m+2;coordP1<=m;coordP1++) {
-      S8(glT1,coordP1) ;
-    }
-  }
-  if (m >= 3) {
-    glT1 = 2*m-3 ;
-    rp1 = m-1 ;
-    local1 = m-1 ;
-    local2 = m-1 ;
-    coordT1 = 2*m-4 ;
-    coordP1 = m-1 ;
-    other1 = 2*m-3 ;
-    other2 = m-1 ;
-    other3 = m-1 ;
-    other4 = m-1 ;
-    other6 = m-1 ;
-    S5(2*m-4,m-1,2*m-3,m-1,m-1,m-1,m,m-1) ;
-    local2 = m-2 ;
-    coordT1 = 2*m-4 ;
-    coordP1 = m-2 ;
-    other1 = 2*m-3 ;
-    other2 = m-1 ;
-    other4 = m-2 ;
-    other6 = m-1 ;
-    S6(2*m-4,m-2,2*m-3,m-1,m,m-2,m,m-1) ;
-    coordT1 = 2*m-3 ;
-    coordP1 = m-1 ;
-    other2 = m-1 ;
-    S1(2*m-3,m-1,m,m-1) ;
-    local2 = m-1 ;
-    coordT1 = 2*m-3 ;
-    coordP1 = m-1 ;
-    other1 = 2*m-2 ;
-    other4 = m-1 ;
-    S3(2*m-3,m-1,2*m-2,m,m,m-1,m,m) ;
-    local1 = m-2 ;
-    coordT1 = 2*m-4 ;
-    other1 = 2*m-3 ;
-    other3 = m-2 ;
-    other5 = m-1 ;
-    S5(2*m-4,m,2*m-3,m,m-2,m,m-1,m) ;
-    local1 = m-1 ;
-    local2 = m-1 ;
-    coordT1 = 2*m-4 ;
-    coordP1 = m-1 ;
-    other1 = 2*m-3 ;
-    other3 = m-1 ;
-    other4 = m-1 ;
-    other5 = m-1 ;
-    S6(2*m-4,m-1,2*m-3,m,m-1,m-1,m-1,m) ;
-    other1 = 2*m-2 ;
-    other3 = m-1 ;
-    other4 = m-1 ;
-    S7(2*m-4,m-1,2*m-2,m,m-1,m-1,m,m) ;
-    coordT1 = 2*m-3 ;
-    other1 = m-1 ;
-    S1(2*m-3,m,m-1,m) ;
-    local1 = m-1 ;
-    coordT1 = 2*m-3 ;
-    other1 = 2*m-2 ;
-    other3 = m-1 ;
-    S2(2*m-3,m,2*m-2,m,m-1,m,m,m) ;
-    coordT1 = 2*m-3 ;
-    for (coordP1=m-1;coordP1<=m;coordP1++) {
-      S8(2*m-3,coordP1) ;
-    }
-  }
-  if (m == 2) {
-    S5(0,1,1,1,1,1,2,1) ;
-    S1(1,1,2,1) ;
-    S3(1,1,2,2,2,1,2,2) ;
-    S6(0,1,1,2,1,1,1,2) ;
-    S7(0,1,2,2,1,1,2,2) ;
-    S1(1,2,1,2) ;
-    S2(1,2,2,2,1,2,2,2) ;
-    for (coordP1=1;coordP1<=2;coordP1++) {
-      S8(1,coordP1) ;
-    }
-  }
-  if (m >= 2) {
-    glT1 = 2*m-2 ;
-    local1 = m-1 ;
-    coordT1 = 2*m-3 ;
-    other1 = 2*m-2 ;
-    other3 = m-1 ;
-    S5(2*m-3,m,2*m-2,m,m-1,m,m,m) ;
-    local2 = m-1 ;
-    coordT1 = 2*m-3 ;
-    coordP1 = m-1 ;
-    other1 = 2*m-2 ;
-    other4 = m-1 ;
-    S6(2*m-3,m-1,2*m-2,m,m,m-1,m,m) ;
-    coordT1 = 2*m-2 ;
-    S1(2*m-2,m,m,m) ;
-    coordT1 = 2*m-2 ;
-    S8(2*m-2,m) ;
-  }
-}
diff --git a/cloog-0.17.0/test/classen2.c b/cloog-0.17.0/test/classen2.c
deleted file mode 100644
index 2afd378..0000000
--- a/cloog-0.17.0/test/classen2.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Generated from ../../../git/cloog/test/classen2.cloog by CLooG 0.14.0-271-gaa1e292 gmp bits in 0.14s. */
-if ((M >= 2) && (N >= 3) && (outerProcTileScatter1 >= outerProcTileScatter2) && (5*outerProcTileScatter1 <= M+2*N-4) && (5*outerProcTileScatter1 <= 5*outerProcTileScatter2+N+2) && (outerProcTileScatter2 >= 0) && (5*outerProcTileScatter2 <= M+N-2) && (outerTimeTileScatter >= outerProcTileScatter1) && (outerTimeTileScatter <= 2*outerProcTileScatter1) && (outerTimeTileScatter <= outerProcTileScatter1+outerProcTileScatter2+1) && (5*outerTimeTileScatter <= 2*M+2*N-6) && (5*outerTimeTileScatter <= 5*outerProcTileScatter1+M+2) && (5*outerTimeTileScatter >= 10*outerProcTileScatter1-2*N-2) && (5*outerTimeTileScatter <= 5*outerProcTileScatter2+M+N) && (5*outerTimeTileScatter >= 10*outerProcTileScatter2-N-3) && (5*outerTimeTileScatter <= 10*outerProcTileScatter2+N+3) && (5*outerTimeTileScatter >= 5*outerProcTileScatter1+5*outerProcTileScatter2-N-4)) {
-  for (compScatter1=max(max(max(max(max(4,5*outerTimeTileScatter),5*outerProcTileScatter2+1),5*outerProcTileScatter1+5*outerProcTileScatter2-N),10*outerProcTileScatter1-2*N+2),10*outerProcTileScatter2-N+1);compScatter1<=min(min(min(min(min(5*outerTimeTileScatter+4,2*M+2*N-6),5*outerProcTileScatter1+M+2),5*outerProcTileScatter1+5*outerProcTileScatter2+5),5*outerProcTileScatter2+M+N),10*outerProcTileScatter2+N+3);compScatter1++) {
-    for (compScatter2=max(max(max(max(ceild(compScatter1+4,2),5*outerProcTileScatter1),5*outerProcTileScatter2+1),compScatter1-M+2),compScatter1-5*outerProcTileScatter2-1);compScatter2<=min(min(min(min(floord(compScatter1+2*N-2,2),compScatter1),5*outerProcTileScatter1+4),compScatter1-5*outerProcTileScatter2+N),5*outerProcTileScatter2+N+2);compScatter2++) {
-      for (compScatter3=max(max(5*outerProcTileScatter2,compScatter1-compScatter2+3),compScatter2-N+2);compScatter3<=min(min(compScatter2-1,5*outerProcTileScatter2+4),compScatter1-compScatter2+N);compScatter3++) {
-        S1(compScatter1-compScatter2+1,-compScatter1+compScatter2+compScatter3-2,compScatter2-compScatter3,compScatter1,compScatter2,compScatter3);
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/classen2.cloog b/cloog-0.17.0/test/classen2.cloog
deleted file mode 100644
index dc12884..0000000
--- a/cloog-0.17.0/test/classen2.cloog
+++ /dev/null
@@ -1,57 +0,0 @@
-# created: Wed Mar 17 17:37:13 CET 2010
-# ---------------------- CONTEXT ----------------------
-c # language is C
-
-# Context (no parameter, so always true)
-1 7
- 1 0 0 0 0 0 0
-
-
-1 # set parameter names
-outerTimeTileScatter outerProcTileScatter1 outerProcTileScatter2 M N
-
-# --------------------- STATEMENTS --------------------
-1
-
-1 # domains per statement
-20 13
- 1 2 1 1 -1 0 0 0 0 0 0 0 0
- 1 1 1 1 0 -1 0 0 0 0 0 0 1
- 1 1 1 0 0 0 -1 0 0 0 0 0 1
- 1 -2 -1 -1 1 0 0 0 0 0 0 0 0
- 1 -1 -1 -1 0 1 0 0 0 0 0 0 -1
- 1 -1 -1 0 0 0 1 0 0 0 0 0 -1
- 1 0 0 1 0 0 0 0 0 0 0 0 -1
- 1 0 0 -1 0 0 0 0 0 0 0 1 -2
- 1 0 1 0 0 0 0 0 0 0 0 0 -1
- 1 0 -1 0 0 0 0 0 0 0 0 1 -2
- 1 1 0 0 0 0 0 0 0 0 0 0 -1
- 1 -1 0 0 0 0 0 0 0 0 1 0 -1
- 1 0 0 0 1 0 0 -5 0 0 0 0 0
- 1 0 0 0 0 1 0 0 -5 0 0 0 0
- 1 0 0 0 0 0 1 0 0 -5 0 0 0
- 1 0 0 0 0 0 -1 0 0 5 0 0 4
- 1 0 0 0 0 -1 0 0 5 0 0 0 4
- 1 0 0 0 -1 0 0 5 0 0 0 0 4
- 1 0 0 0 0 0 0 0 0 0 0 1 -3
- 1 0 0 0 0 0 0 0 0 0 1 0 -2
-
-
-0 0 0 # for future options...
-
-
-
-1 # set the iterator names
-compIter1 compIter2 compIter3 compIter4 compIter5 compIter6
-
-# --------------------- SCATTERING --------------------
-1 # Scattering functions
-3 16
- 0 1 0 0 0 0 0 -1 0 0 0 0 0 0 0 0
- 0 0 1 0 0 0 0 0 -1 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 -1 0 0 0 0 0 0
-
-
-1 # we set the scattering dimension names
-compScatter1 compScatter2 compScatter3
-
diff --git a/cloog-0.17.0/test/classen2.good.c b/cloog-0.17.0/test/classen2.good.c
deleted file mode 100644
index 6aa11e4..0000000
--- a/cloog-0.17.0/test/classen2.good.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Generated from ../../../git/cloog/test/classen2.cloog by CLooG 0.14.0-271-gaa1e292 gmp bits in 0.13s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(compIter1,compIter2,compIter3,compIter4,compIter5,compIter6) { hash(1); hash(compIter1); hash(compIter2); hash(compIter3); hash(compIter4); hash(compIter5); hash(compIter6); }
-
-void test(int outerTimeTileScatter, int outerProcTileScatter1, int outerProcTileScatter2, int M, int N)
-{
-  /* Scattering iterators. */
-  int compScatter1, compScatter2, compScatter3;
-  /* Original iterators. */
-  int compIter1, compIter2, compIter3, compIter4, compIter5, compIter6;
-  if ((M >= 2) && (N >= 3) && (outerProcTileScatter1 >= outerProcTileScatter2) && (5*outerProcTileScatter1 <= M+2*N-4) && (5*outerProcTileScatter1 <= 5*outerProcTileScatter2+N+2) && (outerProcTileScatter2 >= 0) && (5*outerProcTileScatter2 <= M+N-2) && (outerTimeTileScatter >= outerProcTileScatter1) && (outerTimeTileScatter <= 2*outerProcTileScatter1) && (outerTimeTileScatter <= outerProcTileScatter1+outerProcTileScatter2+1) && (5*outerTimeTileScatter <= 2*M+2*N-6) && (5*outerTimeTileScatter <= 5*outerProcTileScatter1+M+2) && (5*outerTimeTileScatter >= 10*outerProcTileScatter1-2*N-2) && (5*outerTimeTileScatter <= 5*outerProcTileScatter2+M+N) && (5*outerTimeTileScatter >= 10*outerProcTileScatter2-N-3) && (5*outerTimeTileScatter <= 10*outerProcTileScatter2+N+3) && (5*outerTimeTileScatter >= 5*outerProcTileScatter1+5*outerProcTileScatter2-N-4)) {
-    for (compScatter1=max(max(max(max(max(4,5*outerTimeTileScatter),5*outerProcTileScatter2+1),5*outerProcTileScatter1+5*outerProcTileScatter2-N),10*outerProcTileScatter1-2*N+2),10*outerProcTileScatter2-N+1);compScatter1<=min(min(min(min(min(5*outerTimeTileScatter+4,2*M+2*N-6),5*outerProcTileScatter1+M+2),5*outerProcTileScatter1+5*outerProcTileScatter2+5),5*outerProcTileScatter2+M+N),10*outerProcTileScatter2+N+3);compScatter1++) {
-      for (compScatter2=max(max(max(max(ceild(compScatter1+4,2),5*outerProcTileScatter1),5*outerProcTileScatter2+1),compScatter1-M+2),compScatter1-5*outerProcTileScatter2-1);compScatter2<=min(min(min(min(floord(compScatter1+2*N-2,2),compScatter1),5*outerProcTileScatter1+4),compScatter1-5*outerProcTileScatter2+N),5*outerProcTileScatter2+N+2);compScatter2++) {
-        for (compScatter3=max(max(5*outerProcTileScatter2,compScatter1-compScatter2+3),compScatter2-N+2);compScatter3<=min(min(compScatter2-1,5*outerProcTileScatter2+4),compScatter1-compScatter2+N);compScatter3++) {
-          S1(compScatter1-compScatter2+1,-compScatter1+compScatter2+compScatter3-2,compScatter2-compScatter3,compScatter1,compScatter2,compScatter3);
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/constant.c b/cloog-0.17.0/test/constant.c
deleted file mode 100644
index 3a6378e..0000000
--- a/cloog-0.17.0/test/constant.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Generated from ../../../git/cloog/test/constant.cloog by CLooG 0.14.0-333-g4442dac gmp bits in 0.01s. */
-for (c2=0;c2<=min(1023,M+1024);c2++) {
-  S1(c2);
-  S3(c2);
-}
-for (c2=max(0,M+1025);c2<=1023;c2++) {
-  S2(c2);
-  S3(c2);
-}
-for (c1=0;c1<=min(1023,M+1024);c1++) {
-  S4(c1);
-  S6(c1);
-}
-for (c1=max(0,M+1025);c1<=1023;c1++) {
-  S5(c1);
-  S6(c1);
-}
diff --git a/cloog-0.17.0/test/constant.cloog b/cloog-0.17.0/test/constant.cloog
deleted file mode 100644
index d251b1b..0000000
--- a/cloog-0.17.0/test/constant.cloog
+++ /dev/null
@@ -1,128 +0,0 @@
-# CLooG -> CLooG
-# This is an automatic dump of a CLooG input file from a CloogInput data
-# structure.
-
-# Language: C
-c
-
-# Context:
-0 3
-
-0 # Parameter name(s)
-
-# Statement number:
-6
-
-# Iteration domain of statement 1 (Stmt_if.then).
-1
-
-3 4 1 0 0 1
-1     1     0     0
-1    -1     0  1023
-1    -1     1  1024
-
-0 0 0 # For future options.
-
-# Iteration domain of statement 2 (Stmt_if.else).
-1
-
-3 4 1 0 0 1
-1     1     0     0
-1    -1     0  1023
-1     1    -1 -1025
-
-0 0 0 # For future options.
-
-# Iteration domain of statement 3 (Stmt_if.end).
-1
-
-2 4 1 0 0 1
-1     1     0     0
-1    -1     0  1023
-
-0 0 0 # For future options.
-
-# Iteration domain of statement 1 (Stmt_if.then).
-1
-
-3 4 1 0 0 1
-1     1     0     0
-1    -1     0  1023
-1    -1     1  1024
-
-0 0 0 # For future options.
-
-# Iteration domain of statement 2 (Stmt_if.else).
-1
-
-3 4 1 0 0 1
-1     1     0     0
-1    -1     0  1023
-1     1    -1 -1025
-
-0 0 0 # For future options.
-
-# Iteration domain of statement 3 (Stmt_if.end).
-1
-
-2 4 1 0 0 1
-1     1     0     0
-1    -1     0  1023
-
-0 0 0 # For future options.
-
-
-0 # Iterator name(s)
-
-# --------------------- SCATTERING --------------------
-6 # Scattering functions
-
-# Scattering of statement 1 (Stmt_if.then).
-1
-
-3 7 3 1 0 1
-0     0     0     1     0     0     0
-0     0     1     0    -1     0     0
-0     1     0     0     0     0     1
-
-# Scattering of statement 2 (Stmt_if.else).
-1
-
-3 7 3 1 0 1
-0     0     0     1     0     0    -1
-0     0     1     0    -1     0     0
-0     1     0     0     0     0     1
-
-# Scattering of statement 3 (Stmt_if.end).
-1
-
-3 7 3 1 0 1
-0     0     0     1     0     0    -2
-0     0     1     0    -1     0     0
-0     1     0     0     0     0     1
-
-# Scattering of statement 1 (Stmt_if.then).
-1
-
-3 7 3 1 0 1
-0     0     0     1     0     0     0
-0     1     0     0    -1     0     0
-0     0     1     0     0     0     0
-
-# Scattering of statement 2 (Stmt_if.else).
-1
-
-3 7 3 1 0 1
-0     0     0     1     0     0    -1
-0     1     0     0    -1     0     0
-0     0     1     0     0     0     0
-
-# Scattering of statement 3 (Stmt_if.end).
-1
-
-3 7 3 1 0 1
-0     0     0     1     0     0    -2
-0     1     0     0    -1     0     0
-0     0     1     0     0     0     0
-
-0 # Scattering dimension name(s)
diff --git a/cloog-0.17.0/test/constant.good.c b/cloog-0.17.0/test/constant.good.c
deleted file mode 100644
index c94fc44..0000000
--- a/cloog-0.17.0/test/constant.good.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Generated from ../../../git/cloog/test/constant.cloog by CLooG 0.14.0-333-g4442dac gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i) { hash(2); hash(i); }
-#define S3(i) { hash(3); hash(i); }
-#define S4(i) { hash(4); hash(i); }
-#define S5(i) { hash(5); hash(i); }
-#define S6(i) { hash(6); hash(i); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c1, c2;
-  /* Original iterators. */
-  int i;
-  for (c2=0;c2<=min(1023,M+1024);c2++) {
-    S1(c2);
-    S3(c2);
-  }
-  for (c2=max(0,M+1025);c2<=1023;c2++) {
-    S2(c2);
-    S3(c2);
-  }
-  for (c1=0;c1<=min(1023,M+1024);c1++) {
-    S4(c1);
-    S6(c1);
-  }
-  for (c1=max(0,M+1025);c1<=1023;c1++) {
-    S5(c1);
-    S6(c1);
-  }
-}
diff --git a/cloog-0.17.0/test/constbound.c b/cloog-0.17.0/test/constbound.c
deleted file mode 100644
index c68b1c9..0000000
--- a/cloog-0.17.0/test/constbound.c
+++ /dev/null
@@ -1,13 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/constbound.cloog by CLooG 0.14.0-170-g72daac3 gmp bits in 0.01s. */
-for (t0=0;t0<=199;t0++) {
-  for (t2=50*t0;t2<=50*t0+24;t2++) {
-    for (t3=0;t3<=t2;t3++) {
-      S1(t0,t2,t3);
-    }
-  }
-  for (t2=50*t0+25;t2<=50*t0+49;t2++) {
-    for (t3=0;t3<=t2;t3++) {
-      S2(t0,t2,t3);
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/constbound.cloog b/cloog-0.17.0/test/constbound.cloog
deleted file mode 100644
index 78ac963..0000000
--- a/cloog-0.17.0/test/constbound.cloog
+++ /dev/null
@@ -1,53 +0,0 @@
-# CLooG script generated automatically by PLUTO
-# language: C
-c
-
-# Context
-0 2
-
-1
-
-
-# Number of statements
-2
-
-1 # of domains
-6 5
-1 0 1 0 0 
-1 0 -1 0 9999 
-1 0 0 1 0 
-1 0 1 -1 0 
-1 -50 1 0 0 
-1 50 -1 0 24 
-0 0 0
-
-1
-6 5
-1 0 1 0 0 
-1 0 -1 0 9999 
-1 0 0 1 0 
-1 0 1 -1 0 
-1 -50 1 0 -25 
-1 50 -1 0 49 
-0 0 0
-
-0
-
-# of scattering functions
-2
-
-4 9
-0 1 0 0 0 -1 0 0 0
-0 0 1 0 0 0 0 0 0
-0 0 0 1 0 0 -1 0 0
-0 0 0 0 1 0 0 -1 0
-
-4 9
-0 1 0 0 0 -1 0 0 0
-0 0 1 0 0 0 0 0 -1
-0 0 0 1 0 0 -1 0 0
-0 0 0 0 1 0 0 -1 0
-
-# we will set the scattering dimension names
-4
-t0 t1 t2 t3
diff --git a/cloog-0.17.0/test/constbound.good.c b/cloog-0.17.0/test/constbound.good.c
deleted file mode 100644
index 30704dd..0000000
--- a/cloog-0.17.0/test/constbound.good.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/constbound.cloog by CLooG 0.14.0-170-g72daac3 64 bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int t0, t2, t3;
-  /* Original iterators. */
-  int i, j, k;
-  for (t0=0;t0<=199;t0++) {
-    for (t2=max(0,50*t0);t2<=50*t0+24;t2++) {
-      for (t3=0;t3<=t2;t3++) {
-        S1(t0,t2,t3);
-      }
-    }
-    for (t2=50*t0+25;t2<=min(9999,50*t0+49);t2++) {
-      for (t3=0;t3<=t2;t3++) {
-        S2(t0,t2,t3);
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/darte.c b/cloog-0.17.0/test/darte.c
deleted file mode 100644
index e185b7a..0000000
--- a/cloog-0.17.0/test/darte.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/darte.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.05s. */
-if (n >= 1) {
-  for (t3=n+3;t3<=3*n+1;t3++) {
-    if ((t3+n+1)%2 == 0) {
-      S1(1,n,(t3-n-1)/2);
-    }
-  }
-  for (t1=-n+2;t1<=n-1;t1++) {
-    if (t1 >= 2) {
-      for (t3=t1+4;t3<=t1+2*n+2;t3++) {
-        if ((t1+t3)%2 == 0) {
-          S1(t1+1,1,(-t1+t3-2)/2);
-        }
-      }
-    }
-    for (t2=max(-t1+2,t1+2);t2<=-t1+4;t2++) {
-      for (t3=t2+2;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          if ((t1+t3)%2 == 0) {
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2);
-          }
-        }
-      }
-    }
-    for (t2=max(-t1+5,t1+3);t2<=min(-t1+2*n,t1+2*n);t2++) {
-      for (t3=1;t3<=min(n,t2+1);t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3);
-        }
-      }
-      for (t3=t2+2;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3);
-        }
-        if ((t1+t2)%2 == 0) {
-          if ((t1+t3)%2 == 0) {
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2);
-          }
-        }
-      }
-      for (t3=max(n+1,t2+2);t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          if ((t1+t3)%2 == 0) {
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2);
-          }
-        }
-      }
-    }
-    if (t1 <= -1) {
-      for (t3=1;t3<=n;t3++) {
-        S2(t1+n-1,n,t3);
-      }
-    }
-    for (t2=-t1+2*n+1;t2<=min(-t1+2*n+3,t1+2*n+1);t2++) {
-      for (t3=1;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3);
-        }
-      }
-    }
-  }
-  for (t3=1;t3<=n;t3++) {
-    S2(n,1,t3);
-  }
-}
diff --git a/cloog-0.17.0/test/darte.cloog b/cloog-0.17.0/test/darte.cloog
deleted file mode 100644
index a853691..0000000
--- a/cloog-0.17.0/test/darte.cloog
+++ /dev/null
@@ -1,52 +0,0 @@
-# language: C
-c
-
-# parameters n m
-1 3
-#  n  1
-1  0  0
-1
-n
-
-2 # Number of statements
-
-1
-# S1 {i, j, k | 1<=i<=n; 1<=j<=n,  1<=k<=n}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  0  1  0
-1  0  0  1  0 -1
-1  0  0 -1  1  0
-0  0  0
-
-1
-# S2 {i, j, k | 1<=i<=n; 1<=j<=n,  1<=k<=n}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  0  1  0
-1  0  0  1  0 -1
-1  0  0 -1  1  0
-0  0  0
-0
-
-2
-# Scattering functions
-3 9
-# c1 c2 c3  i  j  k  n  1
-0  1  0  0 -1  1  0  0  0
-0  0  1  0 -1 -1  0  0  0
-0  0  0  1 -1 -1 -2  0  0
-
-3 9
-# c1 c2 c3  i  j  k  n  1
-0  1  0  0 -1  1  0  0 -1
-0  0  1  0 -1 -1  0  0 -2
-0  0  0  1  0  0 -1  0  0
-1
-t1 t2 t3
diff --git a/cloog-0.17.0/test/darte.good.c b/cloog-0.17.0/test/darte.good.c
deleted file mode 100644
index 298c24f..0000000
--- a/cloog-0.17.0/test/darte.good.c
+++ /dev/null
@@ -1,449 +0,0 @@
-/* Generated from ../../../git/cloog/test/darte.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.27s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-
-void test(int n)
-{
-  /* Scattering iterators. */
-  int t1, t2, t3;
-  /* Original iterators. */
-  int i, j, k;
-  if (n >= 1) {
-    t1 = -n+1 ;
-    t2 = n+1 ;
-    for (t3=n+3;t3<=3*n+1;t3++) {
-      if ((t3+n+1)%2 == 0) {
-        k = (t3-n-1)/2 ;
-        S1(1,n,(t3-n-1)/2) ;
-      }
-    }
-  }
-  if ((n >= 2) && (n <= 2)) {
-    t1 = -n+2 ;
-    for (t2=-n+4;t2<=3*n-2;t2++) {
-      for (t3=t2+2;t3<=t2+2*n;t3++) {
-        if ((t2+n)%2 == 0) {
-          i = (t2-n+2)/2 ;
-          j = (t2+n-2)/2 ;
-          if ((t3+n)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t2-n+2)/2,(t2+n-2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    t2 = n+3 ;
-    for (t3=1;t3<=n;t3++) {
-      S2(1,n,t3) ;
-    }
-  }
-  if (n >= 3) {
-    t1 = -n+2 ;
-    for (t2=n;t2<=n+2;t2++) {
-      for (t3=t2+2;t3<=t2+2*n;t3++) {
-        if ((t2+n)%2 == 0) {
-          i = (t2-n+2)/2 ;
-          j = (t2+n-2)/2 ;
-          if ((t3+n)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t2-n+2)/2,(t2+n-2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    t2 = n+3 ;
-    for (t3=1;t3<=n;t3++) {
-      S2(1,n,t3) ;
-    }
-  }
-  for (t1=ceild(-2*n+5,2);t1<=min(-n+6,-1);t1++) {
-    for (t2=-t1+2;t2<=-t1+4;t2++) {
-      for (t3=t2+2;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    for (t2=-t1+5;t2<=t1+2*n;t2++) {
-      for (t3=1;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-      }
-      for (t3=t2+2;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    t2 = t1+2*n+1 ;
-    for (t3=1;t3<=n;t3++) {
-      i = t1+n-1 ;
-      S2(t1+n-1,n,t3) ;
-    }
-  }
-  if (n == 2) {
-    for (t3=5;t3<=7;t3++) {
-      if ((t3+1)%2 == 0) {
-        k = (t3-3)/2 ;
-        S1(2,1,(t3-3)/2) ;
-      }
-    }
-    for (t2=4;t2<=6;t2++) {
-      for (t3=1;t3<=2;t3++) {
-        if (t2%2 == 0) {
-          i = (t2-2)/2 ;
-          j = (t2-2)/2 ;
-          S2((t2-2)/2,(t2-2)/2,t3) ;
-        }
-      }
-    }
-  }
-  for (t1=-n+7;t1<=-1;t1++) {
-    for (t2=-t1+2;t2<=-t1+4;t2++) {
-      for (t3=t2+2;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    for (t2=-t1+5;t2<=n-2;t2++) {
-      for (t3=1;t3<=t2+1;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-      }
-      for (t3=t2+2;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-      for (t3=n+1;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    for (t2=n-1;t2<=t1+2*n;t2++) {
-      for (t3=1;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-      }
-      for (t3=t2+2;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    t2 = t1+2*n+1 ;
-    for (t3=1;t3<=n;t3++) {
-      i = t1+n-1 ;
-      S2(t1+n-1,n,t3) ;
-    }
-  }
-  if (n >= 3) {
-    for (t1=0;t1<=min(1,-n+6);t1++) {
-      for (t2=t1+2;t2<=-t1+4;t2++) {
-        for (t3=t2+2;t3<=t2+2*n;t3++) {
-          if ((t1+t2)%2 == 0) {
-            i = (t1+t2)/2 ;
-            j = (-t1+t2)/2 ;
-            if ((t1+t3)%2 == 0) {
-              k = (-t2+t3)/2 ;
-              S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-            }
-          }
-        }
-      }
-      for (t2=-t1+5;t2<=-t1+2*n;t2++) {
-        for (t3=1;t3<=n;t3++) {
-          if ((t1+t2+1)%2 == 0) {
-            i = (t1+t2-3)/2 ;
-            j = (-t1+t2-1)/2 ;
-            S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-          }
-        }
-        for (t3=t2+2;t3<=t2+2*n;t3++) {
-          if ((t1+t2)%2 == 0) {
-            i = (t1+t2)/2 ;
-            j = (-t1+t2)/2 ;
-            if ((t1+t3)%2 == 0) {
-              k = (-t2+t3)/2 ;
-              S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-            }
-          }
-        }
-      }
-      for (t2=-t1+2*n+1;t2<=t1+2*n+1;t2++) {
-        for (t3=1;t3<=n;t3++) {
-          if ((t1+t2+1)%2 == 0) {
-            i = (t1+t2-3)/2 ;
-            j = (-t1+t2-1)/2 ;
-            S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-          }
-        }
-      }
-    }
-  }
-  for (t1=max(-n+7,0);t1<=1;t1++) {
-    for (t2=t1+2;t2<=-t1+4;t2++) {
-      for (t3=t2+2;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    for (t2=-t1+5;t2<=n-2;t2++) {
-      for (t3=1;t3<=t2+1;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-      }
-      for (t3=t2+2;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-      for (t3=n+1;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    for (t2=n-1;t2<=-t1+2*n;t2++) {
-      for (t3=1;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-      }
-      for (t3=t2+2;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    for (t2=-t1+2*n+1;t2<=t1+2*n+1;t2++) {
-      for (t3=1;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-      }
-    }
-  }
-  for (t1=2;t1<=n-5;t1++) {
-    t2 = t1+2 ;
-    for (t3=t1+4;t3<=t1+2*n+2;t3++) {
-      i = t1+1 ;
-      if ((t1+t3)%2 == 0) {
-        k = (-t1+t3-2)/2 ;
-        S1(t1+1,1,(-t1+t3-2)/2) ;
-      }
-    }
-    for (t2=t1+3;t2<=n-2;t2++) {
-      for (t3=1;t3<=t2+1;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-      }
-      for (t3=t2+2;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-      for (t3=n+1;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    for (t2=n-1;t2<=-t1+2*n;t2++) {
-      for (t3=1;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-      }
-      for (t3=t2+2;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    for (t2=-t1+2*n+1;t2<=-t1+2*n+3;t2++) {
-      for (t3=1;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-      }
-    }
-  }
-  for (t1=max(2,n-4);t1<=floord(2*n-3,2);t1++) {
-    t2 = t1+2 ;
-    for (t3=t1+4;t3<=t1+2*n+2;t3++) {
-      i = t1+1 ;
-      if ((t1+t3)%2 == 0) {
-        k = (-t1+t3-2)/2 ;
-        S1(t1+1,1,(-t1+t3-2)/2) ;
-      }
-    }
-    for (t2=t1+3;t2<=-t1+2*n;t2++) {
-      for (t3=1;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-      }
-      for (t3=t2+2;t3<=t2+2*n;t3++) {
-        if ((t1+t2)%2 == 0) {
-          i = (t1+t2)/2 ;
-          j = (-t1+t2)/2 ;
-          if ((t1+t3)%2 == 0) {
-            k = (-t2+t3)/2 ;
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2) ;
-          }
-        }
-      }
-    }
-    for (t2=-t1+2*n+1;t2<=-t1+2*n+3;t2++) {
-      for (t3=1;t3<=n;t3++) {
-        if ((t1+t2+1)%2 == 0) {
-          i = (t1+t2-3)/2 ;
-          j = (-t1+t2-1)/2 ;
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3) ;
-        }
-      }
-    }
-  }
-  if (n >= 3) {
-    t1 = n-1 ;
-    t2 = n+1 ;
-    for (t3=n+3;t3<=3*n+1;t3++) {
-      if ((t3+n+1)%2 == 0) {
-        k = (t3-n-1)/2 ;
-        S1(n,1,(t3-n-1)/2) ;
-      }
-    }
-    for (t2=n+2;t2<=n+4;t2++) {
-      for (t3=1;t3<=n;t3++) {
-        if ((t2+n)%2 == 0) {
-          i = (t2+n-4)/2 ;
-          j = (t2-n)/2 ;
-          S2((t2+n-4)/2,(t2-n)/2,t3) ;
-        }
-      }
-    }
-  }
-  if (n >= 1) {
-    t2 = n+3 ;
-    for (t3=1;t3<=n;t3++) {
-      S2(n,1,t3) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/dartef.cloog b/cloog-0.17.0/test/dartef.cloog
deleted file mode 100644
index 14454e2..0000000
--- a/cloog-0.17.0/test/dartef.cloog
+++ /dev/null
@@ -1,52 +0,0 @@
-# language: FORTRAN
-f
-
-# parameters n m
-1 3
-#  n  1
-1  0  0
-1
-n
-
-2 # Number of statements
-
-1
-# S1 {i, j, k | 1<=i<=n; 1<=j<=n,  1<=k<=n}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  0  1  0
-1  0  0  1  0 -1
-1  0  0 -1  1  0
-0  0  0
-
-1
-# S2 {i, j, k | 1<=i<=n; 1<=j<=n,  1<=k<=n}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  0  1  0
-1  0  0  1  0 -1
-1  0  0 -1  1  0
-0  0  0
-0
-
-2
-# Scattering functions
-3 9
-# c1 c2 c3  i  j  k  n  1
-0  1  0  0 -1  1  0  0  0
-0  0  1  0 -1 -1  0  0  0
-0  0  0  1 -1 -1 -2  0  0
-
-3 9
-# c1 c2 c3  i  j  k  n  1
-0  1  0  0 -1  1  0  0 -1
-0  0  1  0 -1 -1  0  0 -2
-0  0  0  1  0  0 -1  0  0
-1
-t1 t2 t3
diff --git a/cloog-0.17.0/test/dartef.f b/cloog-0.17.0/test/dartef.f
deleted file mode 100644
index 50e1073..0000000
--- a/cloog-0.17.0/test/dartef.f
+++ /dev/null
@@ -1,65 +0,0 @@
-! Generated from /home/skimo/git/cloog/test/dartef.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.08s.
-IF (n >= 1) THEN
-  DO t3=n+3, 3*n+1
-    IF (MOD(t3+n+1, 2) == 0) THEN
-      S1(1,n,(t3-n-1)/2)
-    END IF
-  END DO
-  DO t1=-n+2, n-1
-    IF (t1 >= 2) THEN
-      DO t3=t1+4, t1+2*n+2
-        IF (MOD(t1+t3, 2) == 0) THEN
-          S1(t1+1,1,(-t1+t3-2)/2)
-        END IF
-      END DO
-    END IF
-    DO t2=MAX(-t1+2,t1+2), -t1+4
-      DO t3=t2+2, t2+2*n
-        IF (MOD(t1+t2, 2) == 0) THEN
-          IF (MOD(t1+t3, 2) == 0) THEN
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2)
-          END IF
-        END IF
-      END DO
-    END DO
-    DO t2=MAX(-t1+5,t1+3), MIN(-t1+2*n,t1+2*n)
-      DO t3=1, MIN(n,t2+1)
-        IF (MOD(t1+t2+1, 2) == 0) THEN
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3)
-        END IF
-      END DO
-      DO t3=t2+2, n
-        IF (MOD(t1+t2+1, 2) == 0) THEN
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3)
-        END IF
-        IF (MOD(t1+t2, 2) == 0) THEN
-          IF (MOD(t1+t3, 2) == 0) THEN
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2)
-          END IF
-        END IF
-      END DO
-      DO t3=MAX(n+1,t2+2), t2+2*n
-        IF (MOD(t1+t2, 2) == 0) THEN
-          IF (MOD(t1+t3, 2) == 0) THEN
-            S1((t1+t2)/2,(-t1+t2)/2,(-t2+t3)/2)
-          END IF
-        END IF
-      END DO
-    END DO
-    IF (t1 <= -1) THEN
-      DO t3=1, n
-        S2(t1+n-1,n,t3)
-      END DO
-    END IF
-    DO t2=-t1+2*n+1, MIN(-t1+2*n+3,t1+2*n+1)
-      DO t3=1, n
-        IF (MOD(t1+t2+1, 2) == 0) THEN
-          S2((t1+t2-3)/2,(-t1+t2-1)/2,t3)
-        END IF
-      END DO
-    END DO
-  END DO
-  DO t3=1, n
-    S2(n,1,t3)
-  END DO
-END IF
diff --git a/cloog-0.17.0/test/dealII.c b/cloog-0.17.0/test/dealII.c
deleted file mode 100644
index 200b257..0000000
--- a/cloog-0.17.0/test/dealII.c
+++ /dev/null
@@ -1,14 +0,0 @@
-/* Generated from ../../../git/cloog/test/dealII.cloog by CLooG 0.14.0-270-g7ee1261 gmp bits in 0.01s. */
-for (scat_0=0;scat_0<=min(T_66,T_2-1);scat_0++) {
-  S1(scat_0);
-  S2(scat_0);
-}
-if ((T_2 == 0) && (T_67 == 0)) {
-  S1(0);
-}
-for (scat_0=max(0,T_66+1);scat_0<=T_2-1;scat_0++) {
-  S1(scat_0);
-}
-for (scat_0=T_2;scat_0<=min(T_66,T_67-1);scat_0++) {
-  S2(scat_0);
-}
diff --git a/cloog-0.17.0/test/dealII.cloog b/cloog-0.17.0/test/dealII.cloog
deleted file mode 100644
index 1c648f4..0000000
--- a/cloog-0.17.0/test/dealII.cloog
+++ /dev/null
@@ -1,54 +0,0 @@
-# CLooG -> CLooG
-# This is an automatic dump of a CLooG input file from a CloogProgram data
-# structure. WARNING: it is highly dangerous and MAY be correct ONLY if
-# - it has been dumped before loop generation.
-# - option -noscalars is used (it removes scalar dimensions otherwise)
-# - option -l is at least the original scattering dimension number
-# ASK THE AUTHOR IF YOU *NEED* SOMETHING MORE ROBUST
-# Language: C
-c
-
-# Context (3 parameter(s)):
-4 5
-1    -1     0     0 	4
-1     1     0     0     0
-1     0    -1     0 	4
-1     0     1     0     0
-1 # Parameter name(s)
-T_2 T_67 T_66 
-
-# Statement number:
-2
-
-# Iteration domain of statement 1.
-2
-
-2 6
-1    -1     1     0     0    -1 
-1     1     0     0     0     0
-
-2 6
-1    -1     0    -1     0     0
-1     1     0     0     0     0
-0 0 0 # For future options.
-
-# Iteration domain of statement 2.
-2
-
-3 6
-1    -1     1     0     0    -1
-1     1     0     0     0     0 
-1    -1     0     0     1     0 
-
-3 6
-1    -1     0     1     0    -1
-1     1     0     0     0     0
-1    -1     0     0     1     0 
-0 0 0 # For future options.
-
-1 # Iterator name(s)
-scat_0 scat_1 scat_2 git_0 
-
-# No scattering functions.
-0
-
diff --git a/cloog-0.17.0/test/dealII.good.c b/cloog-0.17.0/test/dealII.good.c
deleted file mode 100644
index 9a220ff..0000000
--- a/cloog-0.17.0/test/dealII.good.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Generated from ../../../git/cloog/test/dealII.cloog by CLooG 0.14.0-270-g7ee1261 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(scat_0) { hash(1); hash(scat_0); }
-#define S2(scat_0) { hash(2); hash(scat_0); }
-
-void test(int T_2, int T_67, int T_66)
-{
-  /* Original iterators. */
-  int scat_0;
-  for (scat_0=0;scat_0<=min(T_66,T_2-1);scat_0++) {
-    S1(scat_0);
-    S2(scat_0);
-  }
-  if ((T_2 == 0) && (T_67 == 0)) {
-    S1(0);
-  }
-  for (scat_0=max(0,T_66+1);scat_0<=T_2-1;scat_0++) {
-    S1(scat_0);
-  }
-  for (scat_0=T_2;scat_0<=min(T_66,T_67-1);scat_0++) {
-    S2(scat_0);
-  }
-}
diff --git a/cloog-0.17.0/test/donotsimp.c b/cloog-0.17.0/test/donotsimp.c
deleted file mode 100644
index bccb8b4..0000000
--- a/cloog-0.17.0/test/donotsimp.c
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Generated from ../../../git/cloog/test/donotsimp.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-for (c2=1;c2<=10;c2++) {
-  for (c4=1;c4<=c2;c4++) {
-    S1(c2,c4) ;
-  }
-  for (c4=11;c4<=M;c4++) {
-    S2(c2,c4) ;
-  }
-}
diff --git a/cloog-0.17.0/test/donotsimp.cloog b/cloog-0.17.0/test/donotsimp.cloog
deleted file mode 100644
index 6450917..0000000
--- a/cloog-0.17.0/test/donotsimp.cloog
+++ /dev/null
@@ -1,54 +0,0 @@
-# Language
-c
-
-# Context
-
-# {n>=20}
-    1 3
-    1    1  -20
-0
-
-# Number of statments
-2
-
-1
-# {i,j | 0<=i<=10 1<=j<=i}
-
-    4 5
-    1    1    0    0    -1
-    1   -1    0    0    10
-    1    0    1    0    -1
-    1    1   -1    0     0
-0 0 0
-
-1
-# {i,j | 0<=i<=10 11<=j<=n}
-
-    4 5
-    1    1    0    0    -1
-    1   -1    0    0    10
-    1    0    1    0   -11
-    1    0   -1    1     0
-0 0 0
-
-0
-# Scattering functions
-2
-
-    5 10
-    0    1    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0
-
-    5 10
-    0    1    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0
-
-
-0
-
diff --git a/cloog-0.17.0/test/donotsimp.good.c b/cloog-0.17.0/test/donotsimp.good.c
deleted file mode 100644
index 8e45ab8..0000000
--- a/cloog-0.17.0/test/donotsimp.good.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Generated from ../../../git/cloog/test/donotsimp.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4;
-  /* Original iterators. */
-  int i, j;
-  for (c2=1;c2<=10;c2++) {
-    for (c4=1;c4<=c2;c4++) {
-      S1(c2,c4) ;
-    }
-    for (c4=11;c4<=M;c4++) {
-      S2(c2,c4) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/dot.c b/cloog-0.17.0/test/dot.c
deleted file mode 100644
index 5114ef1..0000000
--- a/cloog-0.17.0/test/dot.c
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Generated from ../../../git/cloog/test/dot.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (j=1;j<=M;j++) {
-  S1(0,j) ;
-}
-for (i=1;i<=N;i++) {
-  for (j=1;j<=M;j++) {
-    S2(i,j) ;
-  }
-}
diff --git a/cloog-0.17.0/test/dot.cloog b/cloog-0.17.0/test/dot.cloog
deleted file mode 100644
index 112816e..0000000
--- a/cloog-0.17.0/test/dot.cloog
+++ /dev/null
@@ -1,33 +0,0 @@
-# language: C
-c
-
-# parameters {M, N | M>=1 N >=1}
-2 4
-1  1  0 -1
-1  0  1 -1
-0
-
-2 # Number of statements
-
-1
-# {i, j | i=0 0<=i<=N 1<=j<=M}
-5 6
-0  1  0  0  0  0
-1  1  0  0  0  0
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-0  0  0
-
-1
-# {i, j | i>=1 0<=i<=N 1<=j<=M}
-5 6
-1  1  0  0  0 -1
-1  1  0  0  0  0
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-0  0  0
-0
- 
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/dot.good.c b/cloog-0.17.0/test/dot.good.c
deleted file mode 100644
index 9cb7b96..0000000
--- a/cloog-0.17.0/test/dot.good.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Generated from ../../../git/cloog/test/dot.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i, j;
-  for (j=1;j<=M;j++) {
-    S1(0,j) ;
-  }
-  for (i=1;i<=N;i++) {
-    for (j=1;j<=M;j++) {
-      S2(i,j) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/dot2.c b/cloog-0.17.0/test/dot2.c
deleted file mode 100644
index 3b6eb5d..0000000
--- a/cloog-0.17.0/test/dot2.c
+++ /dev/null
@@ -1,15 +0,0 @@
-/* Generated from ../../../git/cloog/test/dot2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-for (i=1;i<=min(M,N);i++) {
-  S1(i) ;
-  for (j=1;j<=M;j++) {
-    S2(i,j) ;
-  }
-}
-for (i=N+1;i<=M;i++) {
-  S1(i) ;
-}
-for (i=M+1;i<=N;i++) {
-  for (j=1;j<=M;j++) {
-    S2(i,j) ;
-  }
-}
diff --git a/cloog-0.17.0/test/dot2.cloog b/cloog-0.17.0/test/dot2.cloog
deleted file mode 100644
index 71f471a..0000000
--- a/cloog-0.17.0/test/dot2.cloog
+++ /dev/null
@@ -1,29 +0,0 @@
-# language: C
-c
-
-# parameters {M, N | M>=1 N >=1}
-2 4
-1  1  0 -1
-1  0  1 -1
-0
-
-2 # Number of statements
-
-1
-# {i | 1<=i<=M}
-2 5
-1  1  0  0 -1
-1 -1  1  0  0
-0  0  0
-
-1
-# {i, j | 1<=i<=N 1<=j<=M}
-4 6
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-0  0  0
-0
- 
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/dot2.good.c b/cloog-0.17.0/test/dot2.good.c
deleted file mode 100644
index 9b7805c..0000000
--- a/cloog-0.17.0/test/dot2.good.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Generated from ../../../git/cloog/test/dot2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i, j;
-  for (i=1;i<=min(M,N);i++) {
-    S1(i) ;
-    for (j=1;j<=M;j++) {
-      S2(i,j) ;
-    }
-  }
-  for (i=N+1;i<=M;i++) {
-    S1(i) ;
-  }
-  for (i=M+1;i<=N;i++) {
-    for (j=1;j<=M;j++) {
-      S2(i,j) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/double.c b/cloog-0.17.0/test/double.c
deleted file mode 100644
index b8e5e59..0000000
--- a/cloog-0.17.0/test/double.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Generated from ../../../git/cloog/test/double.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if (M >= 0) {
-  for (i=0;i<=M;i++) {
-    S1(i) ;
-    for (j=0;j<=N;j++) {
-      S2(i,j) ;
-      S3(i,j) ;
-    }
-    S4(i) ;
-  }
-}
diff --git a/cloog-0.17.0/test/double.cloog b/cloog-0.17.0/test/double.cloog
deleted file mode 100644
index a9db60d..0000000
--- a/cloog-0.17.0/test/double.cloog
+++ /dev/null
@@ -1,69 +0,0 @@
-# language: C
-c
-
-# parameters n m
-1 4
-#  n  m  1
-1  0  1  0
-0
-
-4 # Number of statements
-
-1
-# S1 {i | 0<=i<=n}
-2 5
-#  i  n  m  1
-1  1  0  0  0
-1 -1  1  0  0
-0  0  0
-
-1
-# S2 {i, j | 0<=i<=n; 0<=j<=m}
-4 6
-#  i  j  n  m  1
-1  1  0  0  0  0
-1 -1  0  1  0  0
-1  0  1  0  0  0
-1  0 -1  0  1  0
-0  0  0
-
-1
-# S3 {i, j | 0<=i<=n; 0<=j<=m}
-4 6
-#  i  j  n  m  1
-1  1  0  0  0  0
-1 -1  0  1  0  0
-1  0  1  0  0  0
-1  0 -1  0  1  0
-0  0  0
-
-1
-# S4 {i | 0<=i<=n}
-2 5
-#  i  n  m  1
-1  1  0  0  0
-1 -1  1  0  0
-0  0  0
-0
-
-0 # Scattering functions
-2 7
-# c1 C2  i  n  m  1
-0  1  0 -1  0  0  0
-0  0  1  0  0  0 -1
-
-2 8
-# c1 C2  i  j  n  m  1
-0  1  0 -1  0  0  0  0
-0  0  1  0  0  0  0 -2
-
-2 8
-# c1 C2  i  j  n  m  1
-0  1  0 -1  0  0  0  0
-0  0  1  0  0  0  0 -3
-
-2 7
-# c1 C2  i  n  m  1
-0  1  0 -1  0  0  0
-0  0  1  0  0  0 -4
-0
diff --git a/cloog-0.17.0/test/double.good.c b/cloog-0.17.0/test/double.good.c
deleted file mode 100644
index 7aa0eb3..0000000
--- a/cloog-0.17.0/test/double.good.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Generated from ../../../git/cloog/test/double.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-#define S4(i) { hash(4); hash(i); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i, j;
-  for (i=0;i<=M;i++) {
-    S1(i) ;
-    for (j=0;j<=N;j++) {
-      S2(i,j) ;
-      S3(i,j) ;
-    }
-    S4(i) ;
-  }
-}
diff --git a/cloog-0.17.0/test/durbin_e_s.c b/cloog-0.17.0/test/durbin_e_s.c
deleted file mode 100644
index d0301c8..0000000
--- a/cloog-0.17.0/test/durbin_e_s.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Generated from ../../../git/cloog/test/durbin_e_s.cloog by CLooG 0.14.0-238-gb1cb779 gmp bits in 0.01s. */
-S4(1,0,0);
-S7(1,0,0);
-S8(1,0,3);
-for (i=2;i<=9;i++) {
-  S2(i,-7,0);
-  for (j=-7;j<=i-9;j++) {
-    S3(i,j,1);
-  }
-  S6(i,i-9,2);
-  S8(i,0,3);
-  for (j=1;j<=i-1;j++) {
-    S5(i,j,3);
-  }
-}
-S2(10,-7,0);
-for (j=-7;j<=1;j++) {
-  S3(10,j,1);
-}
-S6(10,1,2);
-for (j=1;j<=9;j++) {
-  S5(10,j,3);
-  S1(10,j,4);
-}
-S1(10,10,4);
diff --git a/cloog-0.17.0/test/durbin_e_s.cloog b/cloog-0.17.0/test/durbin_e_s.cloog
deleted file mode 100644
index 55c0859..0000000
--- a/cloog-0.17.0/test/durbin_e_s.cloog
+++ /dev/null
@@ -1,71 +0,0 @@
-# language: C
-c
-
-# Context
-0 2
-
-0 # parameter names
-
-
-8 # Number of statements
-
-1
-4 5
-    0      1      0      0    -10  
-    0      0      0      1     -4  
-    1      0      1      0     -1  
-    1      0     -1      0     10  
-0 0 0
-1
-4 5
-    0      0      1      0      7  
-    0      0      0      1      0  
-    1      1      0      0     -2  
-    1     -1      0      0     10  
-0 0 0
-1
-4 5
-    0      0      0      1     -1  
-    1      0      1      0      7  
-    1     -1      0      0     10  
-    1      1     -1      0     -9  
-0 0 0
-1
-4 5
-    0      1      0      0     -1  
-    0      0      1      0      0  
-    0      0      0      1      0  
-    1      0      0      0      1  
-0 0 0
-1
-4 5
-    0      0      0      1     -3  
-    1      1     -1      0     -1  
-    1     -1      0      0     10  
-    1      0      1      0     -1  
-0 0 0
-1
-4 5
-    0      1     -1      0     -9  
-    0      0      0      1     -2  
-    1      0      1      0      7  
-    1      0     -1      0      1  
-0 0 0
-1
-4 5
-    0      1      0      0     -1  
-    0      0      1      0      0  
-    0      0      0      1      0  
-    1      0      0      0      1  
-0 0 0
-1
-4 5
-    0      0      1      0      0  
-    0      0      0      1     -3  
-    1      1      0      0     -1  
-    1     -1      0      0      9  
-0 0 0
-0 # iterator names
-0 # scattering functions
-0 # scattering dimension names
-
diff --git a/cloog-0.17.0/test/durbin_e_s.good.c b/cloog-0.17.0/test/durbin_e_s.good.c
deleted file mode 100644
index f96d006..0000000
--- a/cloog-0.17.0/test/durbin_e_s.good.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/* Generated from ../../../git/cloog/test/durbin_e_s.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.05s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-#define S3(i,j,k) { hash(3); hash(i); hash(j); hash(k); }
-#define S4(i,j,k) { hash(4); hash(i); hash(j); hash(k); }
-#define S5(i,j,k) { hash(5); hash(i); hash(j); hash(k); }
-#define S6(i,j,k) { hash(6); hash(i); hash(j); hash(k); }
-#define S7(i,j,k) { hash(7); hash(i); hash(j); hash(k); }
-#define S8(i,j,k) { hash(8); hash(i); hash(j); hash(k); }
-
-void test()
-{
-  /* Original iterators. */
-  int i, j, k;
-  S4(1,0,0) ;
-  S7(1,0,0) ;
-  S8(1,0,3) ;
-  S2(2,-7,0) ;
-  S3(2,-7,1) ;
-  S6(2,-7,2) ;
-  S8(2,0,3) ;
-  S5(2,1,3) ;
-  S2(3,-7,0) ;
-  S3(3,-7,1) ;
-  S3(3,-6,1) ;
-  S6(3,-6,2) ;
-  S8(3,0,3) ;
-  for (j=1;j<=2;j++) {
-    S5(3,j,3) ;
-  }
-  for (i=4;i<=8;i++) {
-    S2(i,-7,0) ;
-    S3(i,-7,1) ;
-    for (j=-6;j<=i-10;j++) {
-      S3(i,j,1) ;
-    }
-    j = i-9 ;
-    S3(i,i-9,1) ;
-    S6(i,i-9,2) ;
-    S8(i,0,3) ;
-    for (j=1;j<=i-1;j++) {
-      S5(i,j,3) ;
-    }
-  }
-  S2(9,-7,0) ;
-  S3(9,-7,1) ;
-  for (j=-6;j<=-1;j++) {
-    S3(9,j,1) ;
-  }
-  S3(9,0,1) ;
-  S6(9,0,2) ;
-  S8(9,0,3) ;
-  for (j=1;j<=8;j++) {
-    S5(9,j,3) ;
-  }
-  S2(10,-7,0) ;
-  S3(10,-7,1) ;
-  for (j=-6;j<=0;j++) {
-    S3(10,j,1) ;
-  }
-  S3(10,1,1) ;
-  S6(10,1,2) ;
-  S5(10,1,3) ;
-  S1(10,1,4) ;
-  for (j=2;j<=9;j++) {
-    S5(10,j,3) ;
-    S1(10,j,4) ;
-  }
-  S1(10,10,4) ;
-}
diff --git a/cloog-0.17.0/test/emploi.c b/cloog-0.17.0/test/emploi.c
deleted file mode 100644
index 1716721..0000000
--- a/cloog-0.17.0/test/emploi.c
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Generated from ../../../git/cloog/test/emploi.cloog by CLooG 0.14.0-245-gd8c1718 gmp bits in 0.01s. */
-if (n >= 1) {
-  if (m >= 1) {
-    for (i=1;i<=n;i++) {
-      S1(i);
-      for (j=1;j<=m;j++) {
-        S2(i,j);
-      }
-    }
-  }
-  if (m <= 0) {
-    for (i=1;i<=n;i++) {
-      S1(i);
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/emploi.cloog b/cloog-0.17.0/test/emploi.cloog
deleted file mode 100644
index 0dd7a26..0000000
--- a/cloog-0.17.0/test/emploi.cloog
+++ /dev/null
@@ -1,49 +0,0 @@
-# language: C
-c
-
-# The context (no constraints on parameters)
-1 4             # 1 lines and 4 columns
-#  m  n  1
-1  0  0  0      # 0 >= 0, always true
-1 # We want to set the parameter names
-m n
-
-2 # The number of statements
-
-2 # First statement
-# The first domain
-3 5              # 3 lines and 5 columns
-#  i  m  n  1 
-1  1  0  0 -1    #  i >= 1
-1 -1  0  1  0    #  i <= n
-1 -1  2  0  0    #  i <= 2*m
-# The second domain
-3 5              # 3 lines and 5 columns
-#  i  m  n  1 
-1  1  0  0 -1    #  i >= 1
-1 -1  0  1  0    #  i <= n
-1  1 -1  0  0    #  i >= m
-0 0 0
-
-1 # Second statement
-4 6              # 4 lines and 6 columns
-#  i  j  m  n  1 
-1  1  0  0  0 -1 #  i >= 1
-1 -1  0  0  1  0 #  i <= n
-1  0  1  0  0 -1 #  j >= 1
-1  0 -1  1  0  0 #  j <= m
-0 0 0
-0
-
-0 # Scattering functions
-# The first function
-2 7                    # 2 lines and 7 columns
-# c1 c2  i  m  n  1 
-0  1  0 -1  0  0  0    #  c1 = i
-0  0  1  0  0  0  0    #  c2 = 0
-# The second function
-2 8                    # 2 lines and 8 columns
-# c1 c2  i  j  m  n  1 
-0  1  0  0  0  0 -1  0 #  c1 = n
-0  0  1 -1 -1  0  0  0 #  c2 = i+j
-0
diff --git a/cloog-0.17.0/test/emploi.good.c b/cloog-0.17.0/test/emploi.good.c
deleted file mode 100644
index ad812d8..0000000
--- a/cloog-0.17.0/test/emploi.good.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Generated from ../../../git/cloog/test/emploi.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int m, int n)
-{
-  /* Original iterators. */
-  int i, j;
-  if (m >= 1) {
-    for (i=1;i<=n;i++) {
-      if (i >= m) {
-        S1(i) ;
-      }
-      if (i <= min(2*m,m-1)) {
-        S1(i) ;
-      }
-      for (j=1;j<=m;j++) {
-        S2(i,j) ;
-      }
-    }
-  }
-  if (m <= 0) {
-    for (i=1;i<=n;i++) {
-      S1(i) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/equality.c b/cloog-0.17.0/test/equality.c
deleted file mode 100644
index 86b024d..0000000
--- a/cloog-0.17.0/test/equality.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Generated from ../../../git/cloog/test/equality.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-for (i0=0;i0<=5;i0++) {
-  for (i1=ceild(4*i0,5);i1<=floord(6*i0+20,5);i1++) {
-    if (2*i0 == i1) {
-      S1(i0,i1) ;
-    }
-    if (i1 == 4) {
-      S2(i0,i1) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/equality.cloog b/cloog-0.17.0/test/equality.cloog
deleted file mode 100644
index da83671..0000000
--- a/cloog-0.17.0/test/equality.cloog
+++ /dev/null
@@ -1,33 +0,0 @@
-# Language: C
-c
-
-# Context (0 parameter(s)):
-1 2
-   1    1 
-1 # Parameter name(s)
-
-
-# Statement number:
-2
-
-# Iteration domain of statement 1.
-1
-3 4
-0 2 -1 0
-1 1 0 0
-1 -1 0 5
-0 0 0 # For future options.
-
-# Iteration domain of statement 2.
-1
-3 4
-0 0 -1 4
-1 1 0 0
-1 -1 0 5
-0 0 0 # For future options.
-
-1 # Iterator name(s)
-i0 i1
-
-# No scattering functions.
-0
diff --git a/cloog-0.17.0/test/equality.good.c b/cloog-0.17.0/test/equality.good.c
deleted file mode 100644
index 371f48b..0000000
--- a/cloog-0.17.0/test/equality.good.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Generated from ../../../git/cloog/test/equality.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i0,i1) { hash(1); hash(i0); hash(i1); }
-#define S2(i0,i1) { hash(2); hash(i0); hash(i1); }
-
-void test()
-{
-  /* Original iterators. */
-  int i0, i1;
-  for (i0=0;i0<=5;i0++) {
-    for (i1=ceild(4*i0,5);i1<=floord(6*i0+20,5);i1++) {
-      if (2*i0 == i1) {
-        S1(i0,i1) ;
-      }
-      if (i1 == 4) {
-        S2(i0,i1) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/equality2.c b/cloog-0.17.0/test/equality2.c
deleted file mode 100644
index ea28ab2..0000000
--- a/cloog-0.17.0/test/equality2.c
+++ /dev/null
@@ -1,15 +0,0 @@
-/* Generated from ../../../git/cloog/test/equality2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.07s. */
-for (i0=1;i0<=10000;i0++) {
-  for (i1=1000;i1<=1016;i1++) {
-    for (i2=1;i2<=min(-2*i1+2033,2*i1-1999);i2++) {
-      if (2*i1 == i2+1999) {
-        S2(i0,i1,i2,1,i0,2*i1-1000,1,2,i0,i1-499,2*i1-1999,i0,2*i1-1999,i1-999,i1-999) ;
-      }
-      if (i2 == 1) {
-        if (i1%2 == 0) {
-          S1(i0,i1,i2,2,i0,(i1+2)/2,i1-999,i0,i1-999,(i1-998)/2,(i1-998)/2) ;
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/equality2.cloog b/cloog-0.17.0/test/equality2.cloog
deleted file mode 100644
index c62469c..0000000
--- a/cloog-0.17.0/test/equality2.cloog
+++ /dev/null
@@ -1,57 +0,0 @@
-c
-
-# Context (0 parameter(s)):
-1 2
-   1    1 
-1 # Parameter name(s)
-
-
-# Statement number:
-2
-
-# Iteration domain of statement 2.
-1
-13 13
-   0    1    0    0    0    0    0    0   -1    0    0    0    0 
-   0    0    1    0    0    0    0    0    0    0    0   -2 -998 
-   0    0    0    1    0    0    0    0    0    0    0    0   -1 
-   0    0    0    0    1    0    0    0    0    0    0    0   -2 
-   0    0    0    0    0    1    0    0   -1    0    0    0    0 
-   0    0    0    0    0    0    1    0    0    0    0   -1 -500 
-   0    0    0    0    0    0    0    1    0    0    0   -2    1 
-   0    0    0    0    0    0    0    0    0    1    0   -2    1 
-   0    0    0    0    0    0    0    0    0    0    1   -1    0 
-   1    0    0    0    0    0    0    0    1    0    0    0   -1 
-   1    0    0    0    0    0    0    0   -1    0    0    0 10000 
-   1    0    0    0    0    0    0    0    0    0    0    1   -1 
-   1    0    0    0    0    0    0    0    0    0    0   -1    9 
-0 0 0 # For future options.
-
-# Iteration domain of statement 3.
-1
-17 17
-   0    1    0    0    0    0    0    0    0    0    0    0   -1    0    0    0    0 
-   0    0    1    0    0    0    0    0    0    0    0    0    0    0    0   -1 -999 
-   0    0    0    1    0    0    0    0    0    0    0    0    0    0    0   -2    1 
-   0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0   -1 
-   0    0    0    0    0    1    0    0    0    0    0    0   -1    0    0    0    0 
-   0    0    0    0    0    0    1    0    0    0    0    0    0    0    0   -2 -998 
-   0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0   -1 
-   0    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0   -2 
-   0    0    0    0    0    0    0    0    0    1    0    0   -1    0    0    0    0 
-   0    0    0    0    0    0    0    0    0    0    1    0    0    0    0   -1 -500 
-   0    0    0    0    0    0    0    0    0    0    0    1    0    0    0   -2    1 
-   0    0    0    0    0    0    0    0    0    0    0    0    0    1    0   -2    1 
-   0    0    0    0    0    0    0    0    0    0    0    0    0    0    1   -1    0 
-   1    0    0    0    0    0    0    0    0    0    0    0    1    0    0    0   -1 
-   1    0    0    0    0    0    0    0    0    0    0    0   -1    0    0    0 10000 
-   1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1   -1 
-   1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1    9 
-0 0 0 # For future options.
-
-
-1 # Iterator name(s)
-i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i10 i11 i12 i13 i14 
-
-# No scattering functions.
-0
diff --git a/cloog-0.17.0/test/equality2.good.c b/cloog-0.17.0/test/equality2.good.c
deleted file mode 100644
index 74bf88b..0000000
--- a/cloog-0.17.0/test/equality2.good.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Generated from ../../../git/cloog/test/equality2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.05s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i0,i1,i2,i3,i4,i5,i6,i7,i8,i9,i10) { hash(1); hash(i0); hash(i1); hash(i2); hash(i3); hash(i4); hash(i5); hash(i6); hash(i7); hash(i8); hash(i9); hash(i10); }
-#define S2(i0,i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14) { hash(2); hash(i0); hash(i1); hash(i2); hash(i3); hash(i4); hash(i5); hash(i6); hash(i7); hash(i8); hash(i9); hash(i10); hash(i11); hash(i12); hash(i13); hash(i14); }
-
-void test()
-{
-  /* Original iterators. */
-  int i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14;
-  for (i0=1;i0<=10000;i0++) {
-    for (i1=1000;i1<=1016;i1++) {
-      for (i2=1;i2<=min(-2*i1+2033,2*i1-1999);i2++) {
-        if (2*i1 == i2+1999) {
-          S2(i0,i1,i2,1,i0,2*i1-1000,1,2,i0,i1-499,2*i1-1999,i0,2*i1-1999,i1-999,i1-999) ;
-        }
-        if (i2 == 1) {
-          if (i1%2 == 0) {
-            S1(i0,i1,i2,2,i0,(i1+2)/2,i1-999,i0,i1-999,(i1-998)/2,(i1-998)/2) ;
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/esced.c b/cloog-0.17.0/test/esced.c
deleted file mode 100644
index d26d395..0000000
--- a/cloog-0.17.0/test/esced.c
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Generated from ../../../git/cloog/test/esced.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if (m >= 1) {
-  if (n >= 1) {
-    for (i=1;i<=m;i++) {
-      S1(i) ;
-      for (j=1;j<=n;j++) {
-        S2(i,j) ;
-      }
-    }
-  }
-  if (n <= 0) {
-    for (i=1;i<=m;i++) {
-      S1(i) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/esced.cloog b/cloog-0.17.0/test/esced.cloog
deleted file mode 100644
index 9caba01..0000000
--- a/cloog-0.17.0/test/esced.cloog
+++ /dev/null
@@ -1,30 +0,0 @@
-# language: C
-c
-
-# parameters {n, m | n<=m}
-1 4
-#1  1 -1  0
-1  0  0  1
-1
-n m
-
-2 # Number of statements
-
-1
-# {i | 1<=i<=n}
-2 5
-1  1  0  0 -1
-1 -1  0  1  0
-0 0 0
- 
-1
-# {i, j | 1<=i<=n 1<=j<=m}
-4 6
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-0 0 0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/esced.good.c b/cloog-0.17.0/test/esced.good.c
deleted file mode 100644
index cab5f34..0000000
--- a/cloog-0.17.0/test/esced.good.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Generated from ../../../git/cloog/test/esced.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int n, int m)
-{
-  /* Original iterators. */
-  int i, j;
-  if (n >= 1) {
-    for (i=1;i<=m;i++) {
-      S1(i) ;
-      for (j=1;j<=n;j++) {
-        S2(i,j) ;
-      }
-    }
-  }
-  if (n <= 0) {
-    for (i=1;i<=m;i++) {
-      S1(i) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/ex1.c b/cloog-0.17.0/test/ex1.c
deleted file mode 100644
index b5584c0..0000000
--- a/cloog-0.17.0/test/ex1.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Generated from ../../../git/cloog/test/ex1.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-for (i=0;i<=14;i++) {
-  for (j=0;j<=n-15;j++) {
-    S1(i,j) ;
-  }
-}
-for (i=15;i<=n;i++) {
-  for (j=0;j<=9;j++) {
-    S1(i,j) ;
-  }
-  for (j=10;j<=n-15;j++) {
-    S1(i,j) ;
-    S2(i,j) ;
-  }
-  for (j=n-14;j<=n;j++) {
-    S2(i,j) ;
-  }
-}
diff --git a/cloog-0.17.0/test/ex1.cloog b/cloog-0.17.0/test/ex1.cloog
deleted file mode 100644
index 6a85398..0000000
--- a/cloog-0.17.0/test/ex1.cloog
+++ /dev/null
@@ -1,34 +0,0 @@
-# language: C
-c
-
-# parameters {n}
-1 3
-#  n  1
-1  1 -25
-1
-n
-
-2 # Number of statements
-
-1
-# {i | 0<=i<=n, 0<=j<=n-15}
-4 5
-#  i  j  n  1
-1  1  0  0  0
-1 -1  0  1  0
-1  0  1  0  0
-1  0 -1  1 -15
-0  0  0
- 
-1
-# {i | 15<=i<=n, 10<=j<=n}
-4 5
-#  i  j  n  1
-1  1  0  0 -15
-1 -1  0  1  0
-1  0  1  0 -10
-1  0 -1  1  0
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/ex1.good.c b/cloog-0.17.0/test/ex1.good.c
deleted file mode 100644
index b73fd94..0000000
--- a/cloog-0.17.0/test/ex1.good.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Generated from ../../../git/cloog/test/ex1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int n)
-{
-  /* Original iterators. */
-  int i, j;
-  for (i=0;i<=14;i++) {
-    for (j=0;j<=n-15;j++) {
-      S1(i,j) ;
-    }
-  }
-  for (i=15;i<=n;i++) {
-    for (j=0;j<=9;j++) {
-      S1(i,j) ;
-    }
-    for (j=10;j<=n-15;j++) {
-      S1(i,j) ;
-      S2(i,j) ;
-    }
-    for (j=n-14;j<=n;j++) {
-      S2(i,j) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/forwardsub-1-1-2.c b/cloog-0.17.0/test/forwardsub-1-1-2.c
deleted file mode 100644
index 58ce5c8..0000000
--- a/cloog-0.17.0/test/forwardsub-1-1-2.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Generated from ../../../git/cloog/test/forwardsub-1-1-2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-S3(1,1) ;
-S1(2,1) ;
-S4(2,2) ;
-for (i=3;i<=M;i++) {
-  S1(i,1) ;
-  for (j=2;j<=i-1;j++) {
-    S2(i,j) ;
-  }
-  S4(i,i) ;
-}
diff --git a/cloog-0.17.0/test/forwardsub-1-1-2.cloog b/cloog-0.17.0/test/forwardsub-1-1-2.cloog
deleted file mode 100644
index 38986f9..0000000
--- a/cloog-0.17.0/test/forwardsub-1-1-2.cloog
+++ /dev/null
@@ -1,56 +0,0 @@
-# language: C
-c
-
-# Context
-#{N | 3<=N}
-2 3
-#   M   1
-1   1  -3
-1   0   1
-0
-
-4 # Number of statements
-
-1
-#{t1,t2 | 2<=t1<=N; t2=1; 3<=N}
-5 5
-#   i    j   M   1
-0   0    1   0  -1
-1   0    0   1  -3
-1  -1    0   1   0
-1   1    0   0  -2
-1   0    0   0   1
-0 0 0
-
-1
-#{t1,t2 | t2+1<=t1<=N; 2<=t2}
-4 5
-#   i    j    M   1
-1   1   -1    0  -1
-1   0    1    0  -2
-1  -1    0    1   0
-1   0    0    0   1
-0 0 0
-
-1
-#{t1,t2 | t1=1; t2=1; 3<=N}
-4 5
-#   i   j   M    1
-0   1   0   0   -1
-0   0   1   0   -1
-1   0   0   1   -3
-1   0   0   0    1
-0 0 0
-
-1
-#{t1,t2 | t1=t2; 2<=t2<=N; 3<=N}
-4 5
-#   i   j    M   1
-0   1   -1   0   0
-1   0   0    1   -3
-1   0   -1   1   0
-1   0   1    0   -2
-0 0 0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/forwardsub-1-1-2.good.c b/cloog-0.17.0/test/forwardsub-1-1-2.good.c
deleted file mode 100644
index cebe239..0000000
--- a/cloog-0.17.0/test/forwardsub-1-1-2.good.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Generated from ../../../git/cloog/test/forwardsub-1-1-2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j;
-  S3(1,1) ;
-  S1(2,1) ;
-  S4(2,2) ;
-  for (i=3;i<=M;i++) {
-    S1(i,1) ;
-    for (j=2;j<=i-1;j++) {
-      S2(i,j) ;
-    }
-    S4(i,i) ;
-  }
-}
diff --git a/cloog-0.17.0/test/forwardsub-2-1-2-3.c b/cloog-0.17.0/test/forwardsub-2-1-2-3.c
deleted file mode 100644
index 7c4bc22..0000000
--- a/cloog-0.17.0/test/forwardsub-2-1-2-3.c
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Generated from ../../../git/cloog/test/forwardsub-2-1-2-3.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-S3(1,0) ;
-for (k=2;k<=M;k++) {
-  S1(1,1,k) ;
-}
-for (i=2;i<=M-1;i++) {
-  S4(i,0) ;
-  for (k=i+1;k<=M;k++) {
-    S2(i,1,k) ;
-  }
-}
-S4(M,0) ;
diff --git a/cloog-0.17.0/test/forwardsub-2-1-2-3.cloog b/cloog-0.17.0/test/forwardsub-2-1-2-3.cloog
deleted file mode 100644
index 33d29f3..0000000
--- a/cloog-0.17.0/test/forwardsub-2-1-2-3.cloog
+++ /dev/null
@@ -1,58 +0,0 @@
-# language: C
-c
-
-# Context
-#{M | 3<=M}
-2 3
-#   M   1
-1   1  -3
-1   0   1
-0
-
-4 # Number of statements
-
-1
-#{i,j,k | i=1; j=1; 2<=k<=M; 3<=M}
-6 6
-#   i   j   k    M    1
-0   1   0   0    0   -1
-0   0   1   0    0   -1
-1   0   0   0    1   -3
-1   0   0   -1   1   0
-1   0   0   1    0   -2
-1   0   0   0    0   1
-0 0 0
-
-1
-#{i,j,k | 2<=i<=k-1; j=1; k<=M}
-5 6
-#   i    j   k    M    1
-0   0    1   0    0   -1
-1   -1   0   1    0   -1
-1   1    0   0    0   -2
-1   0    0   -1   1   0
-1   0    0   0    0   1
-0 0 0
-
-1
-#{i,j | i=1; j=0; 3<=M}
-4 5
-#   i   j   M    1
-0   1   0   0   -1
-0   0   1   0   0
-1   0   0   1   -3
-1   0   0   0   1
-0 0 0
-
-1
-#{i,j | 2<=i<=M; j=0; 3<=M}
-4 5
-#   i    j   M    1
-0   0    1   0   0
-1   1    0   0   -2
-1   0    0   1   -3
-1   -1   0   1   0
-0 0 0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/forwardsub-2-1-2-3.good.c b/cloog-0.17.0/test/forwardsub-2-1-2-3.good.c
deleted file mode 100644
index 69ff99c..0000000
--- a/cloog-0.17.0/test/forwardsub-2-1-2-3.good.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Generated from ../../../git/cloog/test/forwardsub-2-1-2-3.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j, k;
-  S3(1,0) ;
-  for (k=2;k<=M;k++) {
-    S1(1,1,k) ;
-  }
-  for (i=2;i<=M-1;i++) {
-    S4(i,0) ;
-    for (k=i+1;k<=M;k++) {
-      S2(i,1,k) ;
-    }
-  }
-  S4(M,0) ;
-}
diff --git a/cloog-0.17.0/test/forwardsub-3-1-2.c b/cloog-0.17.0/test/forwardsub-3-1-2.c
deleted file mode 100644
index 0f398ed..0000000
--- a/cloog-0.17.0/test/forwardsub-3-1-2.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Generated from ../../../git/cloog/test/forwardsub-3-1-2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.02s. */
-S3(2,1) ;
-S1(3,1) ;
-S1(4,1) ;
-S4(4,2) ;
-for (i=5;i<=M+1;i++) {
-  S1(i,1) ;
-  for (j=2;j<=floord(i-1,2);j++) {
-    S2(i,j) ;
-  }
-  if (i%2 == 0) {
-    S4(i,i/2) ;
-  }
-}
-for (i=M+2;i<=2*M-1;i++) {
-  for (j=i-M;j<=floord(i-1,2);j++) {
-    S2(i,j) ;
-  }
-  if (i%2 == 0) {
-    S4(i,i/2) ;
-  }
-}
-S4(2*M,M) ;
diff --git a/cloog-0.17.0/test/forwardsub-3-1-2.cloog b/cloog-0.17.0/test/forwardsub-3-1-2.cloog
deleted file mode 100644
index 6e41e75..0000000
--- a/cloog-0.17.0/test/forwardsub-3-1-2.cloog
+++ /dev/null
@@ -1,57 +0,0 @@
-# language: C
-c
-
-# Context
-#{N | 3<=N}
-2 3
-#   M  1
-1   1   -3
-1   0   1
-0
-
-4 # Number of statements
-
-1
-#{t1,i | 3<=t1<=N+1; i=1; 3<=N}
-5 5
-#   i    j   M   1
-0   0    1   0   -1
-1   0    0   1   -3
-1   -1   0   1   1
-1   1    0   0   -3
-1   0    0   0   1
-0 0 0
-
-1
-#{t1,i | 2i+1<=t1<=i+N; 2<=i}
-4 5
-#   i    j    M   1
-1   1    -2   0   -1
-1   0    1    0   -2
-1   -1   1    1   0
-1   0    0    0   1
-0 0 0
-
-1
-#{t1,i | t1=2; i=1; 3<=N}
-4 5
-#   i   j   M   1
-0   1   0   0   -2
-0   0   1   0   -1
-1   0   0   1   -3
-1   0   0   0   1
-0 0 0
-
-1
-#{t1,i | t1=2i; 2<=i<=N; 3<=N}
-5 5
-#   i    j   M   1
-0   1   -2   0   0
-1   0   0    1   -3
-1   0   -1   1   0
-1   0   1    0   -2
-1   0   0    0   1
-0 0 0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/forwardsub-3-1-2.good.c b/cloog-0.17.0/test/forwardsub-3-1-2.good.c
deleted file mode 100644
index 2969ae8..0000000
--- a/cloog-0.17.0/test/forwardsub-3-1-2.good.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Generated from ../../../git/cloog/test/forwardsub-3-1-2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j;
-  S3(2,1) ;
-  S1(3,1) ;
-  S1(4,1) ;
-  S4(4,2) ;
-  for (i=5;i<=M+1;i++) {
-    S1(i,1) ;
-    for (j=2;j<=floord(i-1,2);j++) {
-      S2(i,j) ;
-    }
-    if (i%2 == 0) {
-      S4(i,i/2) ;
-    }
-  }
-  for (i=M+2;i<=2*M-1;i++) {
-    for (j=i-M;j<=floord(i-1,2);j++) {
-      S2(i,j) ;
-    }
-    if (i%2 == 0) {
-      S4(i,i/2) ;
-    }
-  }
-  i = 2*M ;
-  S4(2*M,M) ;
-}
diff --git a/cloog-0.17.0/test/gauss.c b/cloog-0.17.0/test/gauss.c
deleted file mode 100644
index 341c2aa..0000000
--- a/cloog-0.17.0/test/gauss.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Generated from ../../../git/cloog/test/gauss.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.03s. */
-if (M >= 2) {
-  for (c2=2;c2<=M;c2++) {
-    for (j=2;j<=M;j++) {
-      S2(1,j,c2) ;
-    }
-  }
-  for (c1=2;c1<=M-1;c1++) {
-    for (c2=c1+1;c2<=M;c2++) {
-      for (j=1;j<=c1-1;j++) {
-        S1(c1,j,c2) ;
-      }
-      for (j=c1+1;j<=M;j++) {
-        S2(c1,j,c2) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/gauss.cloog b/cloog-0.17.0/test/gauss.cloog
deleted file mode 100644
index 0a84b01..0000000
--- a/cloog-0.17.0/test/gauss.cloog
+++ /dev/null
@@ -1,72 +0,0 @@
-# language: C
-c
-
-# parameter n
-1 3
-#  n  1
-1  0  1
-0
-
-2 # Number of statements
-
-1
-# {i, j, k | 1<=i<=n; 1<=j<=i-1 i+1<=k<=n}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  1 -1  0  0 -1
-1 -1  0  1  0 -1
-1  0  0 -1  1  0
-0  0  0
-
-1
-# {i, j, k | 1<=i<=n; i+1<=j<=n i+1<=k<=n}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1 -1  1  0  0 -1
-1  0 -1  0  1  0
-1 -1  0  1  0 -1
-1  0  0 -1  1  0
-0  0  0
-0
-
-2 # Scattering functions
-# Et les instructions de chunking...
-2 8
-# c1 c2  i  j  k  n  1
-0  1  0 -1  0  0  0  0
-0  0  1  0  0 -1  0  0
-
-2 8
-# c1 c2  i  j  k  n  1
-0  1  0 -1  0  0  0  0
-0  0  1  0  0 -1  0  0
-0
-
-2
-# Et les instructions de chunking...
-1 7
-# c1  i  j  k  n  1
-0  1  0  0  0 -1  2
-
-1 7
-# c1  i  j  k  n  1
-0  1 -1  0  0  0  1
-0
-
-2
-# Et les instructions de chunking...
-2 8
-# c1 c2  i  j  k  n  1
-0  1  0 -1  0  0  0  0
-0  0  1  0  0 -1  0  0
-
-2 8
-# c1 c2  i  j  k  n  1
-0  1  0 -1  0  0  0  0
-0  0  1  0  0 -1  0  0
-0
diff --git a/cloog-0.17.0/test/gauss.good.c b/cloog-0.17.0/test/gauss.good.c
deleted file mode 100644
index fb1939d..0000000
--- a/cloog-0.17.0/test/gauss.good.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Generated from ../../../git/cloog/test/gauss.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c1, c2;
-  /* Original iterators. */
-  int i, j, k;
-  if (M >= 2) {
-    for (c2=2;c2<=M;c2++) {
-      for (j=2;j<=M;j++) {
-        S2(1,j,c2) ;
-      }
-    }
-  }
-  for (c1=2;c1<=M-1;c1++) {
-    for (c2=c1+1;c2<=M;c2++) {
-      for (j=1;j<=c1-1;j++) {
-        S1(c1,j,c2) ;
-      }
-      for (j=c1+1;j<=M;j++) {
-        S2(c1,j,c2) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/generate_test.c b/cloog-0.17.0/test/generate_test.c
deleted file mode 100644
index 40a8dbd..0000000
--- a/cloog-0.17.0/test/generate_test.c
+++ /dev/null
@@ -1,153 +0,0 @@
-#include <stdio.h>
-#include <cloog/cloog.h>
-
-/* Generate code that scans part of the parameter domain of
- * a given cloog problem, running both a function called "good"
- * and a function called "test" for each value of the parameters.
- * These functions are assumed to call the "hash" function,
- * which is also generated by this program.
- * If for any given value of the parameters, the final hash
- * value computed by test is different from that computed by
- * good, then an error is reported.
- */
-
-CloogDomain *get_param_domain(CloogOptions *options)
-{
-	CloogDomain *domain;
-	CloogProgram *program;
-  
-	program = cloog_program_read(stdin, options);
-
-	domain = cloog_domain_copy(program->context);
-
-	cloog_program_free(program);
-
-	return cloog_domain_from_context(domain);
-}
-
-static const char preamble[] =
-"#include <assert.h>\n"
-"#include <stdio.h>\n"
-"\n"
-"static unsigned h;\n"
-"\n"
-"void hash(int v)\n"
-"{\n"
-"	int i;\n"
-"	union u {\n"
-"		int v;\n"
-"		unsigned char c[1];\n"
-"	} u;\n"
-"	u.v = v;\n"
-"	for (i = 0; i < sizeof(int); ++i) {\n"
-" 		h *= 16777619;\n"
-"		h ^= u.c[i];\n"
-"	}\n"
-"}\n"
-"\n"
-"int main()\n"
-"{\n"
-"	unsigned h_good, h_test;\n";
-;
-
-static const char postamble[] =
-"	return 0;\n"
-"}\n"
-;
-
-static const char *call[] = {"good", "test"};
-
-static void print_macros(FILE *file)
-{
-	fprintf(file, "/* Useful macros. */\n") ;
-	fprintf(file,
-	    "#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))\n");
-	fprintf(file,
-	    "#define ceild(n,d) (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))\n");
-	fprintf(file, "#define max(x,y)    ((x) > (y) ? (x) : (y))\n") ; 
-	fprintf(file, "#define min(x,y)    ((x) < (y) ? (x) : (y))\n\n") ; 
-}
-
-int main()
-{
-	int dim;
-	int range;
-	int i, j;
-	CloogState *state = cloog_state_malloc();
-	CloogOptions *options = cloog_options_malloc(state);
-	CloogDomain *domain;
-	CloogDomain *cube, *tmp;
-	CloogProgram *p;
-	CloogStatement *statement;
-	cloog_int_t m, M;
-
-	options->quiet = 1;
-	domain = get_param_domain(options);
-	dim = cloog_domain_dimension(domain);
-
-	if (dim >= 8)
-		range = 4;
-	else if (dim >= 5)
-		range = 6;
-	else
-		range = 30;
-
-	cloog_int_init(m);
-	cloog_int_init(M);
-	cloog_int_set_si(m, 0);
-	cloog_int_set_si(M, range);
-	cube = cloog_domain_cube(state, dim, m, M);
-	domain = cloog_domain_intersection(tmp = domain, cube);
-	cloog_domain_free(tmp);
-	cloog_domain_free(cube);
-
-	p = cloog_program_malloc();
-	assert(p);
-	p->names = cloog_names_malloc();
-	assert(p->names);
-	p->names->nb_iterators = dim;
-	p->names->iterators = cloog_names_generate_items(dim, "p", 0);
-	p->language = 'c';
-	p->context = cloog_domain_universe(state, 0);
-	statement = cloog_statement_alloc(state, 1);
-	p->loop = cloog_loop_malloc(state);
-	p->loop->domain = domain;
-	p->loop->block = cloog_block_alloc(statement, 0, NULL, dim);
-	p->blocklist = cloog_block_list_alloc(p->loop->block);
-	p = cloog_program_generate(p, options);
-
-	printf("%s", preamble);
-	for (i = 0; i < dim; ++i)
-		printf("\tint %s;\n", p->names->iterators[i]);
-	printf("#define S1(");
-	for (i = 0; i < dim; ++i) {
-		if (i)
-			printf(",");
-		printf("p%d", i);
-	}
-	printf(") do {");
-	for (j = 0; j < 2; ++j) {
-		printf(" h = 2166136261u;");
-		printf(" %s(", call[j]);
-		for (i = 0; i < dim; ++i) {
-			if (i)
-				printf(", ");
-			printf("p%d", i);
-		}
-		printf(");");
-		printf(" h_%s = h;", call[j]);
-	}
-	printf(" assert(h_good == h_test);");
-	printf(" } while (0)\n");
-	print_macros(stdout);
-	cloog_program_pprint(stdout, p, options);
-	printf("%s", postamble);
-
-	cloog_int_clear(m);
-	cloog_int_clear(M);
-	cloog_program_free(p);
-	cloog_options_free(options);
-	cloog_state_free(state);
-
-	return 0;
-}
diff --git a/cloog-0.17.0/test/gesced.c b/cloog-0.17.0/test/gesced.c
deleted file mode 100644
index 6b69507..0000000
--- a/cloog-0.17.0/test/gesced.c
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Generated from ../../../git/cloog/test/gesced.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.05s. */
-for (c1=1;c1<=N;c1++) {
-  S1(c1) ;
-}
-for (c1=N+1;c1<=2*N;c1++) {
-  for (i=1;i<=N;i++) {
-    S2(i,c1-N) ;
-  }
-}
-for (c1=2*N+1;c1<=M+N;c1++) {
-  for (i=1;i<=N;i++) {
-    S3(i,c1-2*N) ;
-    S2(i,c1-N) ;
-  }
-}
-for (c1=M+N+1;c1<=M+2*N;c1++) {
-  for (i=1;i<=N;i++) {
-    S3(i,c1-2*N) ;
-  }
-}
diff --git a/cloog-0.17.0/test/gesced.cloog b/cloog-0.17.0/test/gesced.cloog
deleted file mode 100644
index 5f37046..0000000
--- a/cloog-0.17.0/test/gesced.cloog
+++ /dev/null
@@ -1,56 +0,0 @@
-# language: C
-c
-
-# parameters {n, m | n<=m n>=2 m>=2}
-3 4
-#  m  n  1
-1  1 -1  0
-1  1  0 -2
-1  0  1 -2
-0
-
-3 # Number of statements
-
-1
-# {i | 1<=i<=n}
-2 5
-#  i  m  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-0  0  0
- 
-1
-# {i, j | 1<=i<=n 1<=j<=m}
-4 6
-#  i  j  m  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-0  0  0
-
-1
-# {i, j | 1<=i<=n 1<=j<=m}
-4 6
-#  i  j  m  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-0  0  0
-0
-
-3 # Scattering functions
-# Et les instructions de chunking (prog init)...
-1 6
-# c1  i  m  n  1
-0  1 -1  0  0  0
-
-1 7
-# c1  i  j  m  n  1
-0  1  0 -1  0 -1  0
-
-1 7
-# c1  i  j  m  n  1
-0  1  0 -1  0 -2  0
-0
diff --git a/cloog-0.17.0/test/gesced.good.c b/cloog-0.17.0/test/gesced.good.c
deleted file mode 100644
index bae55dd..0000000
--- a/cloog-0.17.0/test/gesced.good.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Generated from ../../../git/cloog/test/gesced.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int c1;
-  /* Original iterators. */
-  int i, j;
-  for (c1=1;c1<=N;c1++) {
-    S1(c1) ;
-  }
-  for (c1=N+1;c1<=2*N;c1++) {
-    for (i=1;i<=N;i++) {
-      j = c1-N ;
-      S2(i,c1-N) ;
-    }
-  }
-  for (c1=2*N+1;c1<=M+N;c1++) {
-    for (i=1;i<=N;i++) {
-      j = c1-2*N ;
-      S3(i,c1-2*N) ;
-      j = c1-N ;
-      S2(i,c1-N) ;
-    }
-  }
-  for (c1=M+N+1;c1<=M+2*N;c1++) {
-    for (i=1;i<=N;i++) {
-      j = c1-2*N ;
-      S3(i,c1-2*N) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/gesced2.c b/cloog-0.17.0/test/gesced2.c
deleted file mode 100644
index 5cebdb5..0000000
--- a/cloog-0.17.0/test/gesced2.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/gesced2.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.03s. */
-for (c1=1;c1<=4;c1++) {
-  for (c2=5;c2<=M-10;c2++) {
-    S1(c1,c2);
-  }
-}
-for (c1=5;c1<=M-10;c1++) {
-  for (c2=-c1+1;c2<=4;c2++) {
-    S2(c1+c2,c1);
-  }
-  for (c2=5;c2<=min(M-10,-c1+M);c2++) {
-    S1(c1,c2);
-    S2(c1+c2,c1);
-  }
-  for (c2=-c1+M+1;c2<=M-10;c2++) {
-    S1(c1,c2);
-  }
-  for (c2=M-9;c2<=-c1+M;c2++) {
-    S2(c1+c2,c1);
-  }
-}
-for (c1=M-9;c1<=M;c1++) {
-  for (c2=5;c2<=M-10;c2++) {
-    S1(c1,c2);
-  }
-}
diff --git a/cloog-0.17.0/test/gesced2.cloog b/cloog-0.17.0/test/gesced2.cloog
deleted file mode 100644
index 982368b..0000000
--- a/cloog-0.17.0/test/gesced2.cloog
+++ /dev/null
@@ -1,82 +0,0 @@
-# language: C
-c
-
-# parameters {n | n>=16}
-1 3
-#  n  1
-1  1 -16
-0
-
-2 # Number of statements
-
-1
-# {i, j | 1<=i<=n 5<=j<=n-10}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1  0  1  0 -5
-1  0 -1  1 -10
-0  0  0
-
-1
-# {i, j | 1<=i<=n 5<=j<=n-10}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1  0  1  0 -5
-1  0 -1  1 -10
-0  0  0
-0
-
-2 # Scattering functions
-# Et les instructions de chunking (sol triviale)...
-2 7
-# c1 c2  i  j  n  1
-0  1  0 -1  0  0  0
-0  0  1  0 -1  0  0
-
-2 7
-# c1 c2  i  j  n  1
-0  1  0  0 -1  0  0
-0  0  1 -1  1  0  0
-0
-
-# Et les instructions de chunking (sol aux inverse)...
-2 7
-# c1 c2  i    j  n  1
-0  1  0 -10  -3  0 -5
-0  0  1 -4   -1  0  5
-
-2 7
-# c1 c2  i    j  n  1
-0  1  0 -9   -4  0 -15
-0  0  1 -5    0  0  0
-0
-
-2
-# Et les instructions de chunking (sol aux egalites)...
-2 7
-# c1 c2  i    j  n  1
-0  1  0  1   -2  0  -30
-0  0  1 -1    1  0  30
-
-2 7
-# c1 c2  i    j  n  1
-0  1  0 -1    1  0  15
-0  0  1  1   -2  0 -30
-0
-
-# Et les instructions de chunking (sol triviale)...
-2 7
-# c1 c2  i  j  n  1
-0  1  0 -1  0  0  0
-0  0  1  0 -1  0  5
-
-2 7
-# c1 c2  i  j  n  1
-0  1  0  0 -1  0 -10
-0  0  1 -1  0  0  0
-0
-
diff --git a/cloog-0.17.0/test/gesced2.good.c b/cloog-0.17.0/test/gesced2.good.c
deleted file mode 100644
index 669093a..0000000
--- a/cloog-0.17.0/test/gesced2.good.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/* Generated from ../../../git/cloog/test/gesced2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.04s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c1, c2;
-  /* Original iterators. */
-  int i, j;
-  for (c1=1;c1<=4;c1++) {
-    for (c2=5;c2<=M-10;c2++) {
-      S1(c1,c2) ;
-    }
-  }
-  for (c1=5;c1<=min(M-10,9);c1++) {
-    for (c2=-c1+1;c2<=4;c2++) {
-      i = c1+c2 ;
-      S2(c1+c2,c1) ;
-    }
-    for (c2=5;c2<=M-10;c2++) {
-      S1(c1,c2) ;
-      i = c1+c2 ;
-      S2(c1+c2,c1) ;
-    }
-    for (c2=M-9;c2<=-c1+M;c2++) {
-      i = c1+c2 ;
-      S2(c1+c2,c1) ;
-    }
-  }
-  if (M >= 20) {
-    for (c2=-9;c2<=4;c2++) {
-      i = c2+10 ;
-      S2(c2+10,10) ;
-    }
-    for (c2=5;c2<=M-10;c2++) {
-      S1(10,c2) ;
-      i = c2+10 ;
-      S2(c2+10,10) ;
-    }
-  }
-  for (c1=11;c1<=M-10;c1++) {
-    for (c2=-c1+1;c2<=4;c2++) {
-      i = c1+c2 ;
-      S2(c1+c2,c1) ;
-    }
-    for (c2=5;c2<=-c1+M;c2++) {
-      S1(c1,c2) ;
-      i = c1+c2 ;
-      S2(c1+c2,c1) ;
-    }
-    for (c2=-c1+M+1;c2<=M-10;c2++) {
-      S1(c1,c2) ;
-    }
-  }
-  for (c1=M-9;c1<=M;c1++) {
-    for (c2=5;c2<=M-10;c2++) {
-      S1(c1,c2) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/gesced3.c b/cloog-0.17.0/test/gesced3.c
deleted file mode 100644
index 8d2119d..0000000
--- a/cloog-0.17.0/test/gesced3.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Generated from ../../../git/cloog/test/gesced3.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.02s. */
-for (c1=M+1;c1<=2*M;c1++) {
-  S1(c1-M) ;
-}
-for (c1=2*M+1;c1<=M+N;c1++) {
-  S2(c1-2*M) ;
-  S1(c1-M) ;
-}
-for (c1=M+N+1;c1<=2*M+N;c1++) {
-  S2(c1-2*M) ;
-}
diff --git a/cloog-0.17.0/test/gesced3.cloog b/cloog-0.17.0/test/gesced3.cloog
deleted file mode 100644
index 758924c..0000000
--- a/cloog-0.17.0/test/gesced3.cloog
+++ /dev/null
@@ -1,39 +0,0 @@
-# language: C
-c
-
-# parametres {n | n>=m m>=2}
-2 4
-#  m  n  1
-1 -1  1  0
-1  1  0 -2
-0
-
-2 # Number of statements
-
-1
-# {i | 1<=i<=n}
-2 5
-#  i  m  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-0  0  0
-
-1
-# {i | 1<=i<=n}
-2 5
-#  i  m  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-0  0  0
-0
-
-2
-# Et les instructions de chunking (sol triviale)...
-1 6
-# c1  i  m  n  1
-0  1 -1 -1  0  0
-
-1 6
-# c1  i  m  n  1
-0  1 -1 -2  0  0
-0
diff --git a/cloog-0.17.0/test/gesced3.good.c b/cloog-0.17.0/test/gesced3.good.c
deleted file mode 100644
index 43708fc..0000000
--- a/cloog-0.17.0/test/gesced3.good.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Generated from ../../../git/cloog/test/gesced3.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i) { hash(2); hash(i); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int c1;
-  /* Original iterators. */
-  int i;
-  for (c1=M+1;c1<=2*M;c1++) {
-    i = c1-M ;
-    S1(c1-M) ;
-  }
-  for (c1=2*M+1;c1<=M+N;c1++) {
-    i = c1-2*M ;
-    S2(c1-2*M) ;
-    i = c1-M ;
-    S1(c1-M) ;
-  }
-  for (c1=M+N+1;c1<=2*M+N;c1++) {
-    i = c1-2*M ;
-    S2(c1-2*M) ;
-  }
-}
diff --git a/cloog-0.17.0/test/guide.c b/cloog-0.17.0/test/guide.c
deleted file mode 100644
index 31e9db1..0000000
--- a/cloog-0.17.0/test/guide.c
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Generated from ../../../git/cloog/test/guide.cloog by CLooG 0.14.0-245-gd8c1718 gmp bits in 0.00s. */
-if (N >= 1) {
-  for (i=1;i<=N;i++) {
-    S1(i);
-  }
-  for (i=N+1;i<=2*N;i++) {
-    S2(i);
-  }
-}
diff --git a/cloog-0.17.0/test/guide.cloog b/cloog-0.17.0/test/guide.cloog
deleted file mode 100644
index 5a35582..0000000
--- a/cloog-0.17.0/test/guide.cloog
+++ /dev/null
@@ -1,35 +0,0 @@
-# Language is C
-c
-
-# The context (no constraints on parameters)
-1 4             # 1 lines and 4 columns
-#  m  n  1
-1  0  0  0      # 0 >= 0, always true
-0 # CLooG will set parameters names automatically
-
-2 # The number of statements
-
-2 # First statement
-# The first domain
-3 5              # 3 lines and 5 columns
-#  i  m  n  1 
-1  1  0  0 -1    #  i >= 1
-1 -1  0  1  0    #  i <= n
-1 -1  2  0  0    #  i <= 2*m
-# The second domain
-3 5              # 3 lines and 5 columns
-#  i  m  n  1 
-1  1  0  0 -1    #  i >= 1
-1 -1  0  1  0    #  i <= n
-1  1 -1  0  0    #  i >= m
-0 0 0
-
-1 # Second statement
-2 5              # 4 lines and 6 columns
-#  i  m  n  1 
-1  1  0 -1 -1 #  i >= 1
-1 -1  0  2  0 #  i <= n
-0 0 0
-0 # CLooG will set iterators names automatically
-
-0
diff --git a/cloog-0.17.0/test/guide.good.c b/cloog-0.17.0/test/guide.good.c
deleted file mode 100644
index 31e0346..0000000
--- a/cloog-0.17.0/test/guide.good.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Generated from ../../../git/cloog/test/guide.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i) { hash(2); hash(i); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i;
-  for (i=1;i<=N;i++) {
-    if (i >= M) {
-      S1(i) ;
-    }
-    if (i <= min(2*M,M-1)) {
-      S1(i) ;
-    }
-  }
-  for (i=N+1;i<=2*N;i++) {
-    S2(i) ;
-  }
-}
diff --git a/cloog-0.17.0/test/iftest.c b/cloog-0.17.0/test/iftest.c
deleted file mode 100644
index 8f95ef8..0000000
--- a/cloog-0.17.0/test/iftest.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/iftest.cloog by CLooG 0.14.0-245-gd8c1718 gmp bits in 0.00s. */
-if (n >= 1) {
-  for (i=1;i<=n;i++) {
-    S1(i);
-  }
-}
diff --git a/cloog-0.17.0/test/iftest.cloog b/cloog-0.17.0/test/iftest.cloog
deleted file mode 100644
index 0adbc8d..0000000
--- a/cloog-0.17.0/test/iftest.cloog
+++ /dev/null
@@ -1,28 +0,0 @@
-# language: C
-c
-# The context (no constraints on parameters)
-1 4             # 1 lines and 4 columns
-#  m  n  1
-1  0  0  0
-1
-m n
-
-1 # The number of statements
-
-2 # First statement
-# The first domain
-3 5              # 3 lines and 5 columns
-#  i  m  n  1 
-1  1  0  0 -1    #  i >= 1
-1 -1  0  1  0    #  i <= n
-1  1 -1  0  0    #  i >= m
-# The second domain
-3 5              # 3 lines and 5 columns
-#  i  m  n  1 
-1  1  0  0 -1    #  i >= 1
-1 -1  0  1  0    #  i <= n
-1 -1  2  0  0    #  i <= 2*m
-0 0 0
-0
-
-0
diff --git a/cloog-0.17.0/test/iftest.good.c b/cloog-0.17.0/test/iftest.good.c
deleted file mode 100644
index 4ce26e4..0000000
--- a/cloog-0.17.0/test/iftest.good.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Generated from ../../../git/cloog/test/iftest.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-
-void test(int m, int n)
-{
-  /* Original iterators. */
-  int i;
-  for (i=1;i<=n;i++) {
-    if (i <= 2*m) {
-      S1(i) ;
-    }
-    if (i >= max(m,2*m+1)) {
-      S1(i) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/iftest2.c b/cloog-0.17.0/test/iftest2.c
deleted file mode 100644
index 355aa74..0000000
--- a/cloog-0.17.0/test/iftest2.c
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Generated from ../../../git/cloog/test/iftest2.cloog by CLooG 0.14.0-245-gd8c1718 gmp bits in 0.00s. */
-if ((M >= 1) && (N >= 1)) {
-  for (i=1;i<=N;i++) {
-    for (j=1;j<=M;j++) {
-      S1(i,j);
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/iftest2.cloog b/cloog-0.17.0/test/iftest2.cloog
deleted file mode 100644
index 2bd7336..0000000
--- a/cloog-0.17.0/test/iftest2.cloog
+++ /dev/null
@@ -1,31 +0,0 @@
-# language: C
-c
-# The context (no constraints on parameters)
-1 4             # 1 lines and 4 columns
-#  m  n  1
-1  0  0  0
-0
-
-1 # The number of statements
-
-2 # First statement
-# The first domain
-5 6              # 3 lines and 5 columns
-#  i  j  m  n  1 
-1  1  0  0  0 -1    #  i >= 1
-1 -1  0  0  1  0    #  i <= n
-1  1  0 -1  0  0    #  i >= m
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-# The second domain
-5 6              # 3 lines and 5 columns
-#  i  j  m  n  1 
-1  1  0  0  0 -1    #  i >= 1
-1 -1  0  0  1  0    #  i <= n
-1 -1  0  2  0  0    #  i <= 2*m
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-0 0 0
-0
-
-0
diff --git a/cloog-0.17.0/test/iftest2.good.c b/cloog-0.17.0/test/iftest2.good.c
deleted file mode 100644
index 9e7f514..0000000
--- a/cloog-0.17.0/test/iftest2.good.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Generated from ../../../git/cloog/test/iftest2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i, j;
-  if (M >= 1) {
-    for (i=1;i<=N;i++) {
-      for (j=1;j<=M;j++) {
-        if (i <= 2*M) {
-          S1(i,j) ;
-        }
-        if (i >= max(M,2*M+1)) {
-          S1(i,j) ;
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/iftestf.cloog b/cloog-0.17.0/test/iftestf.cloog
deleted file mode 100644
index 1f0d6a9..0000000
--- a/cloog-0.17.0/test/iftestf.cloog
+++ /dev/null
@@ -1,29 +0,0 @@
-# language: FORTRAN
-f
-
-# The context (no constraints on parameters)
-1 4             # 1 lines and 4 columns
-#  m  n  1
-1  0  0  0
-1
-m n
-
-1 # The number of statements
-
-2 # First statement
-# The first domain
-3 5              # 3 lines and 5 columns
-#  i  m  n  1 
-1  1  0  0 -1    #  i >= 1
-1 -1  0  1  0    #  i <= n
-1  1 -1  0  0    #  i >= m
-# The second domain
-3 5              # 3 lines and 5 columns
-#  i  m  n  1 
-1  1  0  0 -1    #  i >= 1
-1 -1  0  1  0    #  i <= n
-1 -1  2  0  0    #  i <= 2*m
-0 0 0
-0
-
-0
diff --git a/cloog-0.17.0/test/iftestf.f b/cloog-0.17.0/test/iftestf.f
deleted file mode 100644
index 65685b9..0000000
--- a/cloog-0.17.0/test/iftestf.f
+++ /dev/null
@@ -1,6 +0,0 @@
-! Generated from ../../../git/cloog/test/iftestf.cloog by CLooG 0.14.0-245-gd8c1718 gmp bits in 0.00s.
-IF (n >= 1) THEN
-  DO i=1, n
-    S1(i)
-  END DO
-END IF
diff --git a/cloog-0.17.0/test/infinite.c b/cloog-0.17.0/test/infinite.c
deleted file mode 100644
index 10f35f2..0000000
--- a/cloog-0.17.0/test/infinite.c
+++ /dev/null
@@ -1,13 +0,0 @@
-/* Generated from ../../../git/cloog/test/infinite.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.02s. */
-for (;i<=0;i++) {
-  S1(i) ;
-}
-for (i=1;i<=N;i++) {
-  S1(i) ;
-  for (j=1;j<=M;j++) {
-    S2(i,j) ;
-  }
-}
-for (i=N+1;;i++) {
-  S1(i) ;
-}
diff --git a/cloog-0.17.0/test/infinite.cloog b/cloog-0.17.0/test/infinite.cloog
deleted file mode 100644
index dacc187..0000000
--- a/cloog-0.17.0/test/infinite.cloog
+++ /dev/null
@@ -1,32 +0,0 @@
-# langage
-c
-
-# parametres {M, N | M>=1 N >=1}
-2 4
-#  M  N  1
-1  1  0 -1
-1  0  1 -1
-0
-
-2 # Number of statements
-
-1
-# {i | 1<=i<=M}
-0 5
-#  i  M  N  1
-#1  1  0  0 -1
-#1 -1  1  0  0
-0 0 0
-
-1
-# {i, j | 1<=i<=N 1<=j<=M}
-4 6
-#  i  j  M  N  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-0 0 0
-0
- 
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/infinite2.c b/cloog-0.17.0/test/infinite2.c
deleted file mode 100644
index 80a0b35..0000000
--- a/cloog-0.17.0/test/infinite2.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Generated from ../../../git/cloog/test/infinite2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (i=1;i<=N;i++) {
-  S1(i) ;
-  for (j=1;j<=M;j++) {
-    S2(i,j) ;
-  }
-}
-for (i=N+1;;i++) {
-  S1(i) ;
-}
diff --git a/cloog-0.17.0/test/infinite2.cloog b/cloog-0.17.0/test/infinite2.cloog
deleted file mode 100644
index 2d7cf97..0000000
--- a/cloog-0.17.0/test/infinite2.cloog
+++ /dev/null
@@ -1,32 +0,0 @@
-# langage
-c
-
-# parametres {M, N | M>=1 N >=1}
-2 4
-#  M  N  1
-1  1  0 -1
-1  0  1 -1
-0
-
-2 # Number of statements
-
-1
-# {i | 1<=i<=M}
-1 5
-#  i  M  N  1
-1  1  0  0 -1
-#1 -1  1  0  0
-0 0 0
-
-1
-# {i, j | 1<=i<=N 1<=j<=M}
-4 6
-#  i  j  M  N  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-0 0 0
-0
- 
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/infinite3.c b/cloog-0.17.0/test/infinite3.c
deleted file mode 100644
index 9e4292c..0000000
--- a/cloog-0.17.0/test/infinite3.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Generated from ../../../git/cloog/test/infinite3.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.03s. */
-for (;i<=0;i++) {
-  S1(i) ;
-}
-for (i=1;i<=min(M,N);i++) {
-  S1(i) ;
-  for (j=1;j<=M;j++) {
-    S2(i,j) ;
-  }
-}
-for (i=N+1;i<=M;i++) {
-  S1(i) ;
-}
-for (i=M+1;i<=N;i++) {
-  for (j=1;j<=M;j++) {
-    S2(i,j) ;
-  }
-}
diff --git a/cloog-0.17.0/test/infinite3.cloog b/cloog-0.17.0/test/infinite3.cloog
deleted file mode 100644
index 9154a0e..0000000
--- a/cloog-0.17.0/test/infinite3.cloog
+++ /dev/null
@@ -1,32 +0,0 @@
-# langage
-c
-
-# parametres {M, N | M>=1 N >=1}
-2 4
-#  M  N  1
-1  1  0 -1
-1  0  1 -1
-0
-
-2 # Number of statements
-
-1
-# {i | 1<=i<=M}
-1 5
-#  i  M  N  1
-#1  1  0  0 -1
-1 -1  1  0  0
-0 0 0
-
-1
-# {i, j | 1<=i<=N 1<=j<=M}
-4 6
-#  i  j  M  N  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-0 0 0
-0
- 
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/infinite4.c b/cloog-0.17.0/test/infinite4.c
deleted file mode 100644
index fff00ed..0000000
--- a/cloog-0.17.0/test/infinite4.c
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Generated from ../../../git/cloog/test/infinite4.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (;;i++) {
-  S1(i) ;
-}
diff --git a/cloog-0.17.0/test/infinite4.cloog b/cloog-0.17.0/test/infinite4.cloog
deleted file mode 100644
index 5502453..0000000
--- a/cloog-0.17.0/test/infinite4.cloog
+++ /dev/null
@@ -1,16 +0,0 @@
-# langage
-c
-
-# Context
-0 2
-0
-
-1 # Number of statements
-
-1
-# {i | 1<=i<=M}
-0 3
-0 0 0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/isl/jacobi-shared.c b/cloog-0.17.0/test/isl/jacobi-shared.c
deleted file mode 100644
index 0c2ceea..0000000
--- a/cloog-0.17.0/test/isl/jacobi-shared.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Generated from ../../../git/cloog/test/isl/jacobi-shared.cloog by CLooG 0.16.3-2-g5511bef gmp bits in 1.82s. */
-if ((h0+1)%2 == 0) {
-  if ((16*floord(t0-1,16) >= -N+g1+t0+1) && (16*floord(N+15*g1+15*t0+15,16) >= 15*g1+15*t0+19) && (32*floord(t1-1,32) <= g2+t1-3) && (32*floord(t1-1,32) >= -N+g2+t1+1)) {
-    for (c0=max(-16*floord(t0-1,16)+t0,-16*floord(g1+t0-3,16)+t0);c0<=min(32,N-g1-1);c0+=16) {
-      c1 = -32*floord(t1-1,32)+t1;
-      if (c1 <= 32) {
-        S1(c0+g1-1,c1+g2-1);
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/isl/jacobi-shared.cloog b/cloog-0.17.0/test/isl/jacobi-shared.cloog
deleted file mode 100644
index 25e4903..0000000
--- a/cloog-0.17.0/test/isl/jacobi-shared.cloog
+++ /dev/null
@@ -1,129 +0,0 @@
-# CLooG -> CLooG
-# This is an automatic dump of a CLooG input file from a CloogInput data
-# structure.
-
-# Language: C
-c
-
-# Context:
-1
-
-22 16 0 0 2 12
-0     0  1024     0     0     0     0    32     0     0    -1     0     0     0     0     0
-0  2048     0     0     0     0    32     0     0    -1     0     0     0     0     0     0
-0     0     0     0     0    -1     0     0     1     0     0     0     0     0     0     0
-1     0     0     0     1     0     0     0     0     0    -1     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     0     1     0     0     0     0    29
-1     0     0     0     1     0     0     0     0    -1     0     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     1     0     0     0     0     0    29
-1     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0
-1     0     0     0     0     0     0    -1     0     0     0     0     0     0     0    31
-1     0     0     0     0     0    -1     0     0     0     0     0     0     0     0    63
-1     0     0     0     1     0     0   -32     0     0     0     0     0     0     0    -2
-1     0     0     0     1     0   -32     0     0     0     0     0     0     0     0    -2
-1     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0
-1     0     0     0     1     0     0     0     0     0     0     0     0     0     0    -4
-1     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0
-1     0     0     2     0    -1     0     0     0     0     0     0     0     0     0    -1
-1     0     0     0     0     0     0   -32     0     0     1     0     0     0     0     0
-1     0     0     0     0     0   -32     0     0     1     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0    -1     0    15
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0    -1    31
-
-1 # Parameter name(s)
-T N h0 b0 b1 g0 g1 g2 g3 g4 t0 t1 
-
-# Statement number:
-1
-
-# Iteration domain of statement 1 (write_shared_A).
-1
-
-33 21 2 0 5 12
-0     0     1     0     0     0     0    32     0     0     0     0     0     0     0     0     0     0     0    -1     1
-0     1     0     0     0     0    16     0     0     0     0     0     0     0     0     0     0     0    -1     0     1
-0     0     0     0     0  1024     0     0     0     0     0     0   992     0     0     1     0     0     0     0     0
-0     0     0     0  2048     0     0     0     0     0     0  2016     0     0     1     0     0     0     0     0     0
-0     0     0     2     0     0     0     0     0     0    -1     0     0     0     0     0     0     0     0     0     1
-0     0     0     0     0     0     0     0     0     0    -1     0     0     1     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0    -1
-1     0     0     0     0     0     0     0     2     0    -1     0     0     0     0     0     0     0     0     0    -1
-1     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -2
-1    -1     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0    -2
-1     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -2
-1     0    -1     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0    31
-1     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0     0    63
-1     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0
-1     0    -1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0    31
-1     0     1     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0    -4
-1     1     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0
-1    -1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0    31
-1     0     0     0     0     0     0     0     0     1     0     0     0     0     0    -1     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0    29
-1     0     0     0     0     0     0     0     0     1     0     0     0     0    -1     0     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0    29
-1     0     0     0     0     0     0     0     0     0     0   -32     0     0     1     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0   -32     0     0     1     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     1     0   -32     0     0     0     0     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     1     0     0   -32     0     0     0     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0    15
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1    31
-
-0 0 0 # For future options.
-
-
-0 # Iterator name(s)
-# --------------------- SCATTERING --------------------
-1 # Scattering functions
-
-# Scattering of statement 1 (write_shared_A).
-1
-
-37 25 4 2 5 12
-0     0     0     0     0     0     1     0     0     0     0    32     0     0     0     0     0     0     0     0     0     0     0    -1     1
-0     0     0     0     0     1     0     0     0     0    16     0     0     0     0     0     0     0     0     0     0     0    -1     0     1
-0     0     0     0     0     0     0     0     0  1024     0     0     0     0     0     0   992     0     0     1     0     0     0     0     0
-0     0     0     0     0     0     0     0  2048     0     0     0     0     0     0  2016     0     0     1     0     0     0     0     0     0
-0     0     0     0     0     0     0     2     0     0     0     0     0     0    -1     0     0     0     0     0     0     0     0     0     1
-0     0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0
-0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0
-0     0     1     0     0     0    -1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0    -1
-0     1     0     0     0    -1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0    -1
-0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     1     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0    -1
-1     0     0     0     0     0     0     0     0     0     0     0     2     0    -1     0     0     0     0     0     0     0     0     0    -1
-1     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -2
-1     0     0     0     0    -1     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0    -2
-1     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -2
-1     0     0     0     0     0    -1     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0    31
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0     0    63
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0
-1     0     0     0     0     0    -1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0    31
-1     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0    -4
-1     0     0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0
-1     0     0     0     0    -1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0    31
-1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0    -1     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0    29
-1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0    -1     0     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0    29
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0   -32     0     0     1     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0   -32     0     0     1     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     1     0   -32     0     0     0     0     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0   -32     0     0     0     0     0     0     0    -2
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0    15
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1    31
-
-1 # Scattering dimension name(s)
-c0 c1 c2 c3 
diff --git a/cloog-0.17.0/test/isl/jacobi-shared.good.c b/cloog-0.17.0/test/isl/jacobi-shared.good.c
deleted file mode 100644
index fcd67dc..0000000
--- a/cloog-0.17.0/test/isl/jacobi-shared.good.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Generated from ../../../git/cloog/test/isl/jacobi-shared.cloog by CLooG 0.16.2-19-gfcd8fdc gmp bits in 1.65s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int T, int N, int h0, int b0, int b1, int g0, int g1, int g2, int g3, int g4, int t0, int t1)
-{
-  /* Scattering iterators. */
-  int c0, c1, c2, c3;
-  /* Original iterators. */
-  int i, j;
-  if ((h0+1)%2 == 0) {
-    if ((16*floord(g1+t0-3,16) >= -N+g1+t0+1) && (16*floord(N+15*g1+15*t0+15,16) >= 16*g1+15*t0+17) && (floord(t1-1,32) <= floord(g2+t1-3,32)) && (32*floord(t1-1,32) >= -N+g2+t1+1)) {
-      for (c0=max(-16*floord(t0-1,16)+t0,-16*floord(g1+t0-3,16)+t0);c0<=min(32,N-g1-1);c0+=16) {
-        c1 = -32*floord(t1-1,32)+t1;
-        if (c1 <= 32) {
-          S1(c0+g1-1,c1+g2-1);
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/isl/mod.c b/cloog-0.17.0/test/isl/mod.c
deleted file mode 100644
index 4f6a15e..0000000
--- a/cloog-0.17.0/test/isl/mod.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/isl/mod.cloog by CLooG 0.14.0-325-g71fa959 gmp bits in 0.00s. */
-for (i=0;i<=3;i++) {
-  if (i%3 <= 1) {
-    S1(i);
-  }
-}
diff --git a/cloog-0.17.0/test/isl/mod.cloog b/cloog-0.17.0/test/isl/mod.cloog
deleted file mode 100644
index e12de40..0000000
--- a/cloog-0.17.0/test/isl/mod.cloog
+++ /dev/null
@@ -1,23 +0,0 @@
-c
-
-# Context:
-0 2
-
-0 # Parameter name(s)
-# Statement number:
-1
-
-# Iteration domain of statement 1
-4 4 1 0 1 0
-1     1     0     0
-1    -1     0     3
-1     1    -3     0
-1    -1     3     1
-
-0 0 0 # For future options.
-
-
-0 # Iterator name(s)
-
-# No scattering functions.
-0
diff --git a/cloog-0.17.0/test/isl/mod2.c b/cloog-0.17.0/test/isl/mod2.c
deleted file mode 100644
index 4f6a15e..0000000
--- a/cloog-0.17.0/test/isl/mod2.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/isl/mod.cloog by CLooG 0.14.0-325-g71fa959 gmp bits in 0.00s. */
-for (i=0;i<=3;i++) {
-  if (i%3 <= 1) {
-    S1(i);
-  }
-}
diff --git a/cloog-0.17.0/test/isl/mod2.cloog b/cloog-0.17.0/test/isl/mod2.cloog
deleted file mode 100644
index 1b09d5f..0000000
--- a/cloog-0.17.0/test/isl/mod2.cloog
+++ /dev/null
@@ -1,20 +0,0 @@
-# Language: C
-c
-
-# Context:
-0 2
-
-0 # Parameter name(s)
-# Statement number:
-1
-
-# Iteration domain of statement 1
-{ [i] : 0 <= i <= 3 and 0 <= i - 3*[i/3] <= 1 }
-
-0 0 0 # For future options.
-
-
-0 # Iterator name(s)
-
-# No scattering functions.
-0
diff --git a/cloog-0.17.0/test/isl/mod3.c b/cloog-0.17.0/test/isl/mod3.c
deleted file mode 100644
index 3fa291b..0000000
--- a/cloog-0.17.0/test/isl/mod3.c
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Generated from ../../../git/cloog/test/isl/mod3.cloog by CLooG 0.14.0-325-g62da9f7 gmp bits in 0.02s. */
-for (i=max(0,32*h0-1991);i<=min(999,32*h0+31);i++) {
-  if ((63*i+32*h0+31)%64 <= 62) {
-    for (j=0;j<=999;j++) {
-      S1(i,j);
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/isl/mod3.cloog b/cloog-0.17.0/test/isl/mod3.cloog
deleted file mode 100644
index 1637080..0000000
--- a/cloog-0.17.0/test/isl/mod3.cloog
+++ /dev/null
@@ -1,34 +0,0 @@
-# Language: C
-c
-
-# Context:
-2 3
-1    -1    93
-1     1     0
-
-1 # Parameter name(s)
-h0 
-# Statement number:
-1
-
-# Iteration domain of statement 1
-1
-
-9 6 2 0 1 1
-1     1     0     0     0     0
-1    -1     0     0     0   999
-1     0     0    -1     0    31
-1     1     0    32   -32   999
-1     0     1     0     0     0
-1     0    -1     0     0   999
-1     1     0    64   -32    31
-1    -1     0   -64    32    31
-1     0     0     1     0     0
-
-0 0 0 # For future options.
-
-
-0 # Iterator name(s)
-
-# No scattering functions.
-0
diff --git a/cloog-0.17.0/test/isl/mod4.c b/cloog-0.17.0/test/isl/mod4.c
deleted file mode 100644
index 9a30f3c..0000000
--- a/cloog-0.17.0/test/isl/mod4.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Generated from ../../../git/cloog/test/isl/mod4.cloog by CLooG 0.16.0-9-g188dbd4 gmp bits in 0.00s. */
-if (M%11 <= 6) {
-  if (N%5 <= 2) {
-    if (M >= -N) {
-      for (i=0;i<=M+N;i++) {
-        S1(i);
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/isl/mod4.cloog b/cloog-0.17.0/test/isl/mod4.cloog
deleted file mode 100644
index d5837ae..0000000
--- a/cloog-0.17.0/test/isl/mod4.cloog
+++ /dev/null
@@ -1,23 +0,0 @@
-c
-
-1
-
-0 4
-
-0
-
-1
-
-6 7 1 0 2 2
-1     0    -5     0     0     1     0
-1     0     5     0     0    -1     2
-1     0     0   -11     1     0     0
-1     0     0    11    -1     0     6
-1     1     0     0     0     0     0
-1    -1     0     0     1     1     0
-
-0 0 0
-
-0
-
-0
diff --git a/cloog-0.17.0/test/isl/mxm-shared.c b/cloog-0.17.0/test/isl/mxm-shared.c
deleted file mode 100644
index e5f4c66..0000000
--- a/cloog-0.17.0/test/isl/mxm-shared.c
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Generated from ../../../git/cloog/test/isl/mxm-shared.cloog by CLooG 0.16.1-5-gcba2a9f gmp bits in 0.34s. */
-if (g4%4 == 0) {
-  if ((N >= g0+t1+1) && (N >= g1+t0+1) && (t1 <= 7)) {
-    for (c0=t0;c0<=min(127,N-g1-1);c0+=16) {
-      S1(g0+t1,c0+g1);
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/isl/mxm-shared.cloog b/cloog-0.17.0/test/isl/mxm-shared.cloog
deleted file mode 100644
index f82b2dd..0000000
--- a/cloog-0.17.0/test/isl/mxm-shared.cloog
+++ /dev/null
@@ -1,162 +0,0 @@
-# CLooG -> CLooG
-# This is an automatic dump of a CLooG input file from a CloogInput data
-# structure.
-
-# Language: C
-c
-
-# Context:
-1
-
-19 15 0 0 3 10
-0     0     0   128     0    -8     0     1     0     0     0     0     0     0     0
-0     0  4096     0     0     0   128     0    -1     0     0     0     0     0     0
-0     8     0     0     0     0     0    -1     0     0     0     0     0     0     0
-0     0     0     0     0     0  -128     0     0     0     1     0     0     0     0
-0     0     0     0     0    -8     0     0     0     1     0     0     0     0     0
-1     0     0     0     0     1     0     0     0     0     0     0     0     0     0
-1     0     0     0     1     0     0     0     0     0     0    -1     0     0    -1
-1     0     0     0     0    -1     0     0     0     0     0     0     0     0    15
-1     0     0     0     1     0     0     0    -1     0     0     0     0     0    -1
-1     0     0     0     0     0     0     0     0     0     0     1     0     0     0
-1     0     0     0     0     0    -1     0     0     0     0     0     0     0    31
-1     0     0     0     1     0     0    -1     0     0     0     0     0     0    -1
-1     0     0     0     0     0  -128     0     1     0     0     0     0     0     0
-1     0     0     0     0     0     1     0     0     0     0     0     0     0     0
-1     0     0     0     0    -8     0     1     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     1     0     0
-1     0     0     0     0     0     0     0     0     0     0     0    -1     0    15
-1     0     0     0     0     0     0     0     0     0     0     0     0     1     0
-1     0     0     0     0     0     0     0     0     0     0     0     0    -1    15
-
-1 # Parameter name(s)
-N b0 b1 g0 g1 g2 g3 g4 t0 t1 
-
-# Statement number:
-1
-
-# Iteration domain of statement 1 (write_shared_C).
-2
-
-22 18 2 0 4 10
-0     0    -1     0     0     0    16     0     0     0     0     0     0     0     0     1     0     0
-0     0     0     0     0   128     0     0     8     0    -1     0     0     0     0     0     0     0
-0     0     0     0  4096     0     0     0     0  -128     0     1     0     0     0     0     0     0
-0     0     0   128     0     0     0     0     0     0     0    -1     0     0     0     0     0     0
-0     1     0     0     0     0     0     0     0     0    -1     0     0     0     0     0    -1     0
-0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0
-0     0     0     0     0     0     0     0     0  -128     0     0     0     1     0     0     0     0
-0     0     0     0     0     0     0     0    -8     0     0     0     1     0     0     0     0     0
-1     0     0     0     0     0     0     0     0  -128     0     1     0     0     0     0     0     0
-1     0     0     0     0     0     0     1     0     0    -1     0     0     0     0     0    -1    -1
-1     0     0     0     0     0     0     0    -8     0     1     0     0     0     0     0     0     0
-1     0    -1     0     0     0     0     1     0     0     0     0     0     0     0     0     0    -1
-1     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0     0    15
-1     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0    31
-1     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0
-1     0    -1     0     0     0     0     0     0     0     0     1     0     0     0     0     0   127
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     7
-1     0     1     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0    15
-
-24 19 2 0 5 10
-0     0    -1     0     0     0     0    16     0     0     0     0     0     0     0     0     1     0     0
-0     0     0     0     0     0   128     0     0     8     0    -1     0     0     0     0     0     0     0
-0     0     0     0     0     4     0     0     0     0     0     0     0     0     0    -1     0     0     0
-0     0     0     0  4096     0     0     0     0     0  -128     0     1     0     0     0     0     0     0
-0     0     0   128     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0
-0     1     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0    -1     0
-0     0     0     0     0     0     0     0     0     0  -128     0     0     0     1     0     0     0     0
-0     0     0     0     0     0     0     0     0    -8     0     0     0     1     0     0     0     0     0
-1     0     0     0     0     0     0     0     0    -8     0     1     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     1     0     0    -1     0     0     0     0     0    -1    -1
-1     0     0     0     0     0     0     0     0     0  -128     0     1     0     0     0     0     0     0
-1     0    -1     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0    -1
-1     0     0     0     0     0     0     0     1     0     0     0     0     0     0    -1     0     0    -1
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     7
-1     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0    31
-1     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0     0    15
-1     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0
-1     0    -1     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0   127
-1     0     1     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0    15
-
-0 0 0 # For future options.
-
-
-0 # Iterator name(s)
-# --------------------- SCATTERING --------------------
-1 # Scattering functions
-
-# Scattering of statement 1 (write_shared_C).
-2
-
-27 22 4 2 4 10
-0     0     0     0     0     1     0     0     0     0    16     0     8     0     0     0     0     0     0     0    -1     0
-0     0     0     0     0     0     1     0     0    16     0     0     0     0     0     0     0     0     0    -1     0     0
-0     0     0     0     0     0     0     0   128     0     0     0   120     0     1     0     0     0     0     0     0     0
-0     0     0     0     0     0     0  4096     0     0     0     0     0  3968     0     1     0     0     0     0     0     0
-0     0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0
-0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0
-0     0     1     0     0    -1     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0
-0     1     0     0     0     0    -1     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0
-0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0
-0     0     0     0     0     0     0     0     0     0     0     0     0  -128     0     0     0     1     0     0     0     0
-0     0     0     0     0     0     0     0     0     0     0     0    -8     0     0     0     1     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0  -128     0     1     0     0     0     0     0     0
-1     0     0     0     0    -1     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0    -1
-1     0     0     0     0     0     0     0     0     0     0     0    -8     0     1     0     0     0     0     0     0     0
-1     0     0     0     0     0    -1     0     0     0     0     1     0     0     0     0     0     0     0     0     0    -1
-1     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0     0    15
-1     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0    31
-1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0
-1     0     0     0     0     0    -1     0     0     0     0     0     0     0     0     1     0     0     0     0     0   127
-1     0     0     0     0     1     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0
-1     0     0     0     0    -1     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     7
-1     0     0     0     0     0     1     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0    15
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1    15
-
-29 23 4 2 5 10
-0     0     0     0     0     1     0     0     0     0     0    16     0     8     0     0     0     0     0     0     0    -1     0
-0     0     0     0     0     0     1     0     0     0    16     0     0     0     0     0     0     0     0     0    -1     0     0
-0     0     0     0     0     0     0     0     0   128     0     0     0   120     0     1     0     0     0     0     0     0     0
-0     0     0     0     0     0     0     0  4096     0     0     0     0     0  3968     0     1     0     0     0     0     0     0
-0     0     0     0     0     0     0     4     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0
-0     0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0
-0     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0
-0     0     1     0     0    -1     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0
-0     1     0     0     0     0    -1     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0
-0     0     0     0     0     0     0     0     0     0     0     0     0     0  -128     0     0     0     1     0     0     0     0
-0     0     0     0     0     0     0     0     0     0     0     0     0    -8     0     0     0     1     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0    -8     0     1     0     0     0     0     0     0     0
-1     0     0     0     0    -1     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0    -1
-1     0     0     0     0     0     0     0     0     0     0     0     0     0  -128     0     1     0     0     0     0     0     0
-1     0     0     0     0     0    -1     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0    -1
-1     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0    -1     0     0    -1
-1     0     0     0     0    -1     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     7
-1     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0    31
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0     0    15
-1     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0     0
-1     0     0     0     0     0    -1     0     0     0     0     0     0     0     0     0     1     0     0     0     0     0   127
-1     0     0     0     0     0     1     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0
-1     0     0     0     0     1     0     0     0     0     0     0     0     0     0    -1     0     0     0     0     0     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1     0    15
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     1     0
-1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0    -1    15
-
-1 # Scattering dimension name(s)
-c0 c1 c2 c3 
diff --git a/cloog-0.17.0/test/isl/unroll.c b/cloog-0.17.0/test/isl/unroll.c
deleted file mode 100644
index 5f80428..0000000
--- a/cloog-0.17.0/test/isl/unroll.c
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Generated from ./isl/unroll.cloog by CLooG 0.16.3-13-gbbcc8fc gmp bits in 0.00s. */
-S1(0);
-S1(1);
-S1(2);
-S1(3);
-S1(4);
-S1(5);
-S1(6);
-S1(7);
-S1(8);
-S1(9);
-S1(10);
diff --git a/cloog-0.17.0/test/isl/unroll.cloog b/cloog-0.17.0/test/isl/unroll.cloog
deleted file mode 100644
index c3f0960..0000000
--- a/cloog-0.17.0/test/isl/unroll.cloog
+++ /dev/null
@@ -1,14 +0,0 @@
-C
-
-[n] -> { : }
-
-0
-
-1
-
-[n] -> { [i] : 0 <= i and i <= 10 }
-0 0 0
-
-0
-
-0
diff --git a/cloog-0.17.0/test/isl/unroll.good.c b/cloog-0.17.0/test/isl/unroll.good.c
deleted file mode 100644
index 9daca4d..0000000
--- a/cloog-0.17.0/test/isl/unroll.good.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Generated from ./isl/unroll.cloog by CLooG 0.16.3-14-g80e4ef0 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i;
-  S1(0);
-  S1(1);
-  S1(2);
-  S1(3);
-  S1(4);
-  S1(5);
-  S1(6);
-  S1(7);
-  S1(8);
-  S1(9);
-  S1(10);
-}
diff --git a/cloog-0.17.0/test/isl/unroll2.c b/cloog-0.17.0/test/isl/unroll2.c
deleted file mode 100644
index 7ec66bd..0000000
--- a/cloog-0.17.0/test/isl/unroll2.c
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Generated from ../../../git/cloog/test/isl/unroll2.cloog by CLooG 0.16.3-13-g27516e4 gmp bits in 0.00s. */
-if ((M >= -1) && (M <= 9)) {
-  if (M >= 0) {
-    S1(M);
-  }
-  S1(M+1);
-}
diff --git a/cloog-0.17.0/test/isl/unroll2.cloog b/cloog-0.17.0/test/isl/unroll2.cloog
deleted file mode 100644
index d725478..0000000
--- a/cloog-0.17.0/test/isl/unroll2.cloog
+++ /dev/null
@@ -1,14 +0,0 @@
-C
-
-[n] -> { : }
-
-0
-
-1
-
-[n] -> { [i] : 0 <= i and n <= i <= n + 1 <= 10 }
-0 0 0
-
-0
-
-0
diff --git a/cloog-0.17.0/test/isl/unroll2.good.c b/cloog-0.17.0/test/isl/unroll2.good.c
deleted file mode 100644
index 537b3b1..0000000
--- a/cloog-0.17.0/test/isl/unroll2.good.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from ../../../git/cloog/test/isl/unroll2.cloog by CLooG 0.16.3-13-g27516e4 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i;
-  if ((M >= -1) && (M <= 9)) {
-    for (i=max(0,M);i<=M+1;i++) {
-      S1(i);
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/largeur.c b/cloog-0.17.0/test/largeur.c
deleted file mode 100644
index ff49b94..0000000
--- a/cloog-0.17.0/test/largeur.c
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Generated from ../../../git/cloog/test/largeur.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-if (M >= 1) {
-  for (c1=1;c1<=M;c1++) {
-    for (c2=1;c2<=c1;c2++) {
-      S1(c2,c1) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/largeur.cloog b/cloog-0.17.0/test/largeur.cloog
deleted file mode 100644
index fe372da..0000000
--- a/cloog-0.17.0/test/largeur.cloog
+++ /dev/null
@@ -1,26 +0,0 @@
-# language: C
-c
-
-# parameters {n | n>= 0}
-1 3
-1  1  0
-0
-
-1 # Number of statements
-
-1
-# {i, j | 1<=i<=n i<=j<=n}
-4 5
-1  1  0  0  -1
-1 -1  0  1   0
-1 -1  1  0   0
-1  0 -1  1   0
-0 0 0
-0
-
-1 # Scattering functions
-# Et les instructions de chunking...
-2 7
-0 1 0  0 -1 0 0
-0 0 1 -1  0 0 0
-0
diff --git a/cloog-0.17.0/test/largeur.good.c b/cloog-0.17.0/test/largeur.good.c
deleted file mode 100644
index 10f63ed..0000000
--- a/cloog-0.17.0/test/largeur.good.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Generated from ../../../git/cloog/test/largeur.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c1, c2;
-  /* Original iterators. */
-  int i, j;
-  for (c1=1;c1<=M;c1++) {
-    for (c2=1;c2<=c1;c2++) {
-      S1(c2,c1) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/levenshtein-1-2-3.c b/cloog-0.17.0/test/levenshtein-1-2-3.c
deleted file mode 100644
index 224bd29..0000000
--- a/cloog-0.17.0/test/levenshtein-1-2-3.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Generated from ../../../git/cloog/test/levenshtein-1-2-3.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.12s. */
-S1(0,0) ;
-S2(1,0) ;
-S3(1,1) ;
-for (i=2;i<=N;i++) {
-  S2(i,0) ;
-  for (j=1;j<=i-1;j++) {
-    S6(i,j) ;
-  }
-  S3(i,i) ;
-}
-S7(N+1,0) ;
-for (j=1;j<=N;j++) {
-  S6(N+1,j) ;
-  S8(N+1,j) ;
-}
-for (i=N+2;i<=2*M-N-2;i++) {
-  j = floord(i-N-1,2) ;
-  S7(i,j) ;
-  if ((i+N)%2 == 0) {
-    S5(i,(i-N)/2) ;
-    S8(i,(i-N)/2) ;
-  }
-  for (j=ceild(i-N+1,2);j<=floord(i+N-1,2);j++) {
-    S6(i,j) ;
-    S8(i,j) ;
-  }
-  if ((i+N)%2 == 0) {
-    S4(i,(i+N)/2) ;
-    S8(i,(i+N)/2) ;
-  }
-}
-for (i=2*M-N-1;i<=2*M-2;i++) {
-  for (j=i-M+1;j<=M-1;j++) {
-    S6(i,j) ;
-  }
-}
diff --git a/cloog-0.17.0/test/levenshtein-1-2-3.cloog b/cloog-0.17.0/test/levenshtein-1-2-3.cloog
deleted file mode 100644
index acc6522..0000000
--- a/cloog-0.17.0/test/levenshtein-1-2-3.cloog
+++ /dev/null
@@ -1,110 +0,0 @@
-# language: C
-c
-
-# Context
-# {length,width | width+2<=length; 1<=width}
-3   4
-#  M  N   1
-1  1  -1 -2
-1  0  1  -1
-1  0  0  1
-0
-
-8 # Number of statements
-
-1
-# {t1,t2,length,width | t1=0; t2=0; width+2<=length; 1<=width}
-5   6
-#  i  j  M  N  1
-0  1  0  0  0  0
-0  0  1  0  0  0
-1  0  0  1  -1 -2
-1  0  0  0  1  -1
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | 1<=t1<=width; t2=0; width+2<=length}
-5   6
-#  i  j  M  N  1
-0  0  1  0  0  0
-1  1  0  0  0  -1
-1  -1 0  0  1  0
-1  0  0  1  -1 -2
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | t1=t2; 1<=t2<=width; width+2<=length}
-5   6
-#  i  j  M  N  1
-0  1  -1 0  0  0
-1  0  1  0  0  -1
-1  0  -1 0  1  0
-1  0  0  1  -1 -2
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | t1=2t2-width; width+1<=t2<=length-1; 1<=width}
-5   6
-#  i  j  M  N  1
-0  1  -2 0  1  0
-1  0  1  0  -1 -1
-1  0  -1 1  0  -1
-1  0  0  0  1  -1
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | t1=2t2+width; 1<=t2<=length-width-1; 1<=width}
-5   6
-#  i  j  M  N  1
-0  1  -2 0  -1 0
-1  0  1  0  0  -1
-1  0  -1 1  -1 -1
-1  0  0  0  1  -1
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | (2t2-width+1,t2+1)<=t1<=(t2+length-1,2t2+width-1); 1<=t2<=length-1; width+2<=length}
-8   6
-#  i  j  M  N  1
-1  1  -2 0  1  -1
-1  1  -1 0  0  -1
-1  -1 1  1  0  -1
-1  -1 2  0  1  -1
-1  0  1  0  0  -1
-1  0  -1 1  0  -1
-1  0  0  1  -1 -2
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | (width+1,2t2+width+1)<=t1<=(2length-width-2,2t2+width+2); width+2<=length; 1<=width}
-6   6
-#  i  j  M  N  1
-1  1  0  0  -1 -1
-1  1  -2 0  -1 -1
-1  -1 0  2  -1 -2
-1  -1 2  0  1  2
-1  0  0  1  -1 -2
-1  0  0  0  1  -1
-0 0 0
-
-1
-# {t1,t2,length,width | (width+1,2t2-width)<=t1<=(2t2+width,2length-width-2); width+2<=length; 1<=width}
-7   6
-#  i  j  M  N  1
-1  1  0  0  -1 -1
-1  1  -2 0  1  0
-1  -1 2  0  1  0
-1  -1 0  2  -1 -2
-1  0  0  1  -1 -2
-1  0  0  0  1  -1
-1  0  0  0  0  1
-0 0 0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/levenshtein-1-2-3.good.c b/cloog-0.17.0/test/levenshtein-1-2-3.good.c
deleted file mode 100644
index 76548ea..0000000
--- a/cloog-0.17.0/test/levenshtein-1-2-3.good.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Generated from ../../../git/cloog/test/levenshtein-1-2-3.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.03s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-#define S5(i,j) { hash(5); hash(i); hash(j); }
-#define S6(i,j) { hash(6); hash(i); hash(j); }
-#define S7(i,j) { hash(7); hash(i); hash(j); }
-#define S8(i,j) { hash(8); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i, j;
-  S1(0,0) ;
-  S2(1,0) ;
-  S3(1,1) ;
-  for (i=2;i<=N;i++) {
-    S2(i,0) ;
-    for (j=1;j<=i-1;j++) {
-      S6(i,j) ;
-    }
-    S3(i,i) ;
-  }
-  i = N+1 ;
-  S7(N+1,0) ;
-  for (j=1;j<=N;j++) {
-    S6(N+1,j) ;
-    S8(N+1,j) ;
-  }
-  for (i=N+2;i<=2*M-N-2;i++) {
-    j = floord(i-N-1,2) ;
-    S7(i,j) ;
-    if ((i+N)%2 == 0) {
-      j = (i-N)/2 ;
-      S5(i,(i-N)/2) ;
-      S8(i,(i-N)/2) ;
-    }
-    for (j=ceild(i-N+1,2);j<=floord(i+N-1,2);j++) {
-      S6(i,j) ;
-      S8(i,j) ;
-    }
-    if ((i+N)%2 == 0) {
-      j = (i+N)/2 ;
-      S4(i,(i+N)/2) ;
-      S8(i,(i+N)/2) ;
-    }
-  }
-  for (i=2*M-N-1;i<=2*M-2;i++) {
-    for (j=i-M+1;j<=M-1;j++) {
-      S6(i,j) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/levenshtein-1-2-3f.cloog b/cloog-0.17.0/test/levenshtein-1-2-3f.cloog
deleted file mode 100644
index c78bc19..0000000
--- a/cloog-0.17.0/test/levenshtein-1-2-3f.cloog
+++ /dev/null
@@ -1,110 +0,0 @@
-# language: FORTRAN
-f
-
-# Context
-# {length,width | width+2<=length; 1<=width}
-3   4
-#  M  N   1
-1  1  -1 -2
-1  0  1  -1
-1  0  0  1
-0
-
-8 # Number of statements
-
-1
-# {t1,t2,length,width | t1=0; t2=0; width+2<=length; 1<=width}
-5   6
-#  i  j  M  N  1
-0  1  0  0  0  0
-0  0  1  0  0  0
-1  0  0  1  -1 -2
-1  0  0  0  1  -1
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | 1<=t1<=width; t2=0; width+2<=length}
-5   6
-#  i  j  M  N  1
-0  0  1  0  0  0
-1  1  0  0  0  -1
-1  -1 0  0  1  0
-1  0  0  1  -1 -2
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | t1=t2; 1<=t2<=width; width+2<=length}
-5   6
-#  i  j  M  N  1
-0  1  -1 0  0  0
-1  0  1  0  0  -1
-1  0  -1 0  1  0
-1  0  0  1  -1 -2
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | t1=2t2-width; width+1<=t2<=length-1; 1<=width}
-5   6
-#  i  j  M  N  1
-0  1  -2 0  1  0
-1  0  1  0  -1 -1
-1  0  -1 1  0  -1
-1  0  0  0  1  -1
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | t1=2t2+width; 1<=t2<=length-width-1; 1<=width}
-5   6
-#  i  j  M  N  1
-0  1  -2 0  -1 0
-1  0  1  0  0  -1
-1  0  -1 1  -1 -1
-1  0  0  0  1  -1
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | (2t2-width+1,t2+1)<=t1<=(t2+length-1,2t2+width-1); 1<=t2<=length-1; width+2<=length}
-8   6
-#  i  j  M  N  1
-1  1  -2 0  1  -1
-1  1  -1 0  0  -1
-1  -1 1  1  0  -1
-1  -1 2  0  1  -1
-1  0  1  0  0  -1
-1  0  -1 1  0  -1
-1  0  0  1  -1 -2
-1  0  0  0  0  1
-0 0 0
-
-1
-# {t1,t2,length,width | (width+1,2t2+width+1)<=t1<=(2length-width-2,2t2+width+2); width+2<=length; 1<=width}
-6   6
-#  i  j  M  N  1
-1  1  0  0  -1 -1
-1  1  -2 0  -1 -1
-1  -1 0  2  -1 -2
-1  -1 2  0  1  2
-1  0  0  1  -1 -2
-1  0  0  0  1  -1
-0 0 0
-
-1
-# {t1,t2,length,width | (width+1,2t2-width)<=t1<=(2t2+width,2length-width-2); width+2<=length; 1<=width}
-7   6
-#  i  j  M  N  1
-1  1  0  0  -1 -1
-1  1  -2 0  1  0
-1  -1 2  0  1  0
-1  -1 0  2  -1 -2
-1  0  0  1  -1 -2
-1  0  0  0  1  -1
-1  0  0  0  0  1
-0 0 0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/levenshtein-1-2-3f.f b/cloog-0.17.0/test/levenshtein-1-2-3f.f
deleted file mode 100644
index 5a57950..0000000
--- a/cloog-0.17.0/test/levenshtein-1-2-3f.f
+++ /dev/null
@@ -1,37 +0,0 @@
-! Generated from ../../../git/cloog/test/levenshtein-1-2-3f.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.11s.
-S1(0,0)
-S2(1,0)
-S3(1,1)
-DO i=2, N
-  S2(i,0)
-  DO j=1, i-1
-    S6(i,j)
-  END DO
-  S3(i,i)
-END DO
-S7(N+1,0)
-DO j=1, N
-  S6(N+1,j)
-  S8(N+1,j)
-END DO
-DO i=N+2, 2*M-N-2
-  j = FLOOR(REAL(i-N-1)/REAL(2))
-  S7(i,j)
-  IF (MOD(i+N, 2) == 0) THEN
-    S5(i,(i-N)/2)
-    S8(i,(i-N)/2)
-  END IF
-  DO j=CEILING(REAL(i-N+1)/REAL(2)), FLOOR(REAL(i+N-1)/REAL(2))
-    S6(i,j)
-    S8(i,j)
-  END DO
-  IF (MOD(i+N, 2) == 0) THEN
-    S4(i,(i+N)/2)
-    S8(i,(i+N)/2)
-  END IF
-END DO
-DO i=2*M-N-1, 2*M-2
-  DO j=i-M+1, M-1
-    S6(i,j)
-  END DO
-END DO
diff --git a/cloog-0.17.0/test/lex.c b/cloog-0.17.0/test/lex.c
deleted file mode 100644
index 52df96d..0000000
--- a/cloog-0.17.0/test/lex.c
+++ /dev/null
@@ -1,5 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/lex.cloog by CLooG 0.14.0-234-g330f397 gmp bits in 0.00s. */
-for (c1=0;c1<=10;c1++) {
-  S2(c1);
-  S1(c1);
-}
diff --git a/cloog-0.17.0/test/lex.cloog b/cloog-0.17.0/test/lex.cloog
deleted file mode 100644
index a7e2b88..0000000
--- a/cloog-0.17.0/test/lex.cloog
+++ /dev/null
@@ -1,35 +0,0 @@
-c
-
-0 2
-
-0
-
-2
-
-1
-2 3
-1 1 0
-1 -1 10
-0 0 0
-
-1
-2 3
-1 1 0
-1 -1 10
-0 0 0
-
-0
-
-2
-
-3 6
-0 -1 0 0 1 0
-0 0 -1 0 0 0
-0 0 0 -1 0 0
-
-3 6
-0 -1 0 0 1 0
-0 0 -1 0 0 -1
-0 0 0 -1 0 0
-
-0
diff --git a/cloog-0.17.0/test/lex.good.c b/cloog-0.17.0/test/lex.good.c
deleted file mode 100644
index 4769fb1..0000000
--- a/cloog-0.17.0/test/lex.good.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/lex.cloog by CLooG 0.14.0-234-g330f397 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i) { hash(2); hash(i); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int c1;
-  /* Original iterators. */
-  int i;
-  for (c1=0;c1<=10;c1++) {
-    S2(c1);
-    S1(c1);
-  }
-}
diff --git a/cloog-0.17.0/test/lineality-1-2.c b/cloog-0.17.0/test/lineality-1-2.c
deleted file mode 100644
index 9bd902e..0000000
--- a/cloog-0.17.0/test/lineality-1-2.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/lineality-1-2.cloog by CLooG 0.14.0-284-g5c046c9 gmp bits in 0.00s. */
-for (i=1;i<=M;i++) {
-  for (j=1;j<=i-1;j++) {
-    S1(i,j);
-  }
-  S1(i,i);
-  S2(i,i);
-  for (j=i+1;j<=M;j++) {
-    S1(i,j);
-  }
-}
diff --git a/cloog-0.17.0/test/lineality-1-2.cloog b/cloog-0.17.0/test/lineality-1-2.cloog
deleted file mode 100644
index 7629fd8..0000000
--- a/cloog-0.17.0/test/lineality-1-2.cloog
+++ /dev/null
@@ -1,36 +0,0 @@
-# language: C
-c
-
-# Context
-# {M | 2<=M}
-2   3
-#  M  1
-1  1 -2
-1  0  1
-0
-
-2 # Number of statements
-
-1
-# {i,j,M | 1<=i<=M; 1<=j<=M}
-5   5
-#   i   j   M   1
-1   1   0   0  -1
-1   0   1   0  -1
-1  -1   0   1   0
-1   0  -1   1   0
-1   0   0   0   1
-0   0   0
-
-1
-# {i,j,M | i=j; 1<=j<=M}
-4   5
-#   i   j   M   1
-0   1  -1   0   0
-1   0   1   0  -1
-1   0  -1   1   0
-1   0   0   0   1
-0   0   0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/lineality-1-2.good.c b/cloog-0.17.0/test/lineality-1-2.good.c
deleted file mode 100644
index d28268f..0000000
--- a/cloog-0.17.0/test/lineality-1-2.good.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Generated from ../../../git/cloog/test/lineality-1-2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j;
-  S1(1,1) ;
-  S2(1,1) ;
-  for (j=2;j<=M;j++) {
-    S1(1,j) ;
-  }
-  for (i=2;i<=M-1;i++) {
-    for (j=1;j<=i-1;j++) {
-      S1(i,j) ;
-    }
-    S1(i,i) ;
-    S2(i,i) ;
-    for (j=i+1;j<=M;j++) {
-      S1(i,j) ;
-    }
-  }
-  for (j=1;j<=M-1;j++) {
-    S1(M,j) ;
-  }
-  S1(M,M) ;
-  S2(M,M) ;
-}
diff --git a/cloog-0.17.0/test/lineality-2-1-2.c b/cloog-0.17.0/test/lineality-2-1-2.c
deleted file mode 100644
index 37a7e2a..0000000
--- a/cloog-0.17.0/test/lineality-2-1-2.c
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/lineality-2-1-2.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.00s. */
-for (i=1;i<=M;i++) {
-  for (j=1;j<=min(M,i+1);j++) {
-    S1(i,j);
-  }
-  if (i >= M-1) {
-    S2(i,i+2);
-  }
-  if (i <= M-2) {
-    S1(i,i+2);
-    S2(i,i+2);
-  }
-  for (j=i+3;j<=M;j++) {
-    S1(i,j);
-  }
-}
diff --git a/cloog-0.17.0/test/lineality-2-1-2.cloog b/cloog-0.17.0/test/lineality-2-1-2.cloog
deleted file mode 100644
index a6ae5e1..0000000
--- a/cloog-0.17.0/test/lineality-2-1-2.cloog
+++ /dev/null
@@ -1,36 +0,0 @@
-# language: C
-c
-
-# Context
-# {M | 2<=M}
-2   3
-# M 1
-1 1 -2
-1 0 1
-0
-
-2 # Number of statements
-
-1
-# {i,j,M | 1<=i<=M; 1<=j<=M}
-5   5
-#  i  j  M  1
-1  1  0  0  -1
-1  0  1  0  -1
-1  -1 0  1  0
-1  0  -1 1  0
-1  0  0  0  1
-0 0 0
-
-1
-# {i,j,M | i=j-2; 3<=j<=M+2}
-4   5
-#  i  j  M  1
-0  1  -1 0  2
-1  0  1  0  -3
-1  0  -1 1  2
-1  0  0  0  1
-0 0 0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/lineality-2-1-2.good.c b/cloog-0.17.0/test/lineality-2-1-2.good.c
deleted file mode 100644
index 78d8126..0000000
--- a/cloog-0.17.0/test/lineality-2-1-2.good.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Generated from ../../../git/cloog/test/lineality-2-1-2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j;
-  for (i=1;i<=M-3;i++) {
-    for (j=1;j<=i+1;j++) {
-      S1(i,j) ;
-    }
-    j = i+2 ;
-    S1(i,i+2) ;
-    S2(i,i+2) ;
-    for (j=i+3;j<=M;j++) {
-      S1(i,j) ;
-    }
-  }
-  if (M >= 3) {
-    i = M-2 ;
-    for (j=1;j<=M-1;j++) {
-      S1(M-2,j) ;
-    }
-    S1(M-2,M) ;
-    S2(M-2,M) ;
-  }
-  for (i=M-1;i<=M;i++) {
-    for (j=1;j<=M;j++) {
-      S1(i,j) ;
-    }
-    j = i+2 ;
-    S2(i,i+2) ;
-  }
-}
diff --git a/cloog-0.17.0/test/logo.c b/cloog-0.17.0/test/logo.c
deleted file mode 100644
index 54d229d..0000000
--- a/cloog-0.17.0/test/logo.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/logo.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.01s. */
-for (j=0;j<=7;j++) {
-  S1(1,j);
-}
-for (i=2;i<=6;i++) {
-  for (j=0;j<=i-2;j++) {
-    S2(i,j);
-  }
-  for (j=i-1;j<=4;j++) {
-    S1(i,j);
-    S2(i,j);
-  }
-  for (j=5;j<=7;j++) {
-    S1(i,j);
-  }
-}
-for (i=7;i<=8;i++) {
-  for (j=i-1;j<=7;j++) {
-    S1(i,j);
-  }
-}
diff --git a/cloog-0.17.0/test/logo.cloog b/cloog-0.17.0/test/logo.cloog
deleted file mode 100644
index 5583c29..0000000
--- a/cloog-0.17.0/test/logo.cloog
+++ /dev/null
@@ -1,30 +0,0 @@
-# language: C
-c
-
-# Context
-1 3
-#  n  1
-1  0  1
-0
-
-2 # Number of statements
-
-1
-3 5
-#  i  j  n  1
-1  1  0  0 -1 # i >= 1
-1  0 -1  0  7 # j <= 7
-1 -1  1  0  1 # j >= i-1
-0  0  0
-
-1
-4 5
-#  i  j  n  1
-1  1  0  0 -2 # i >= 2
-1 -1  0  0  6 # i <= 6
-1  0  1  0  0 # j >= 0
-1  0 -1  0  4 # j <= 4
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/logo.good.c b/cloog-0.17.0/test/logo.good.c
deleted file mode 100644
index 203e5ac..0000000
--- a/cloog-0.17.0/test/logo.good.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Generated from ../../../git/cloog/test/logo.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j;
-  for (j=0;j<=7;j++) {
-    S1(1,j) ;
-  }
-  for (i=2;i<=5;i++) {
-    for (j=0;j<=i-2;j++) {
-      S2(i,j) ;
-    }
-    for (j=i-1;j<=4;j++) {
-      S1(i,j) ;
-      S2(i,j) ;
-    }
-    for (j=5;j<=7;j++) {
-      S1(i,j) ;
-    }
-  }
-  for (j=0;j<=4;j++) {
-    S2(6,j) ;
-  }
-  for (j=5;j<=7;j++) {
-    S1(6,j) ;
-  }
-  for (i=7;i<=8;i++) {
-    for (j=i-1;j<=7;j++) {
-      S1(i,j) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/logopar.c b/cloog-0.17.0/test/logopar.c
deleted file mode 100644
index 0b2c8f9..0000000
--- a/cloog-0.17.0/test/logopar.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/logopar.cloog by CLooG 0.14.0-284-g5c046c9 gmp bits in 0.00s. */
-for (j=0;j<=m;j++) {
-  S1(1,j);
-}
-for (i=2;i<=n;i++) {
-  for (j=0;j<=i-2;j++) {
-    S2(i,j);
-  }
-  for (j=i-1;j<=n;j++) {
-    S1(i,j);
-    S2(i,j);
-  }
-  for (j=n+1;j<=m;j++) {
-    S1(i,j);
-  }
-}
-for (i=n+1;i<=m+1;i++) {
-  for (j=i-1;j<=m;j++) {
-    S1(i,j);
-  }
-}
diff --git a/cloog-0.17.0/test/logopar.cloog b/cloog-0.17.0/test/logopar.cloog
deleted file mode 100644
index 37114ae..0000000
--- a/cloog-0.17.0/test/logopar.cloog
+++ /dev/null
@@ -1,33 +0,0 @@
-# language: C
-c
-
-# Context
-3 4
-#  m  n  1
-1  1 -1  0  # m > n
-1  1  0  0  # m >= 0
-1  0  1 -2  # n >= 2
-1
-m n
-
-2 # Number of statements
-
-1
-3 6
-#  i  j  m  n  1
-1  1  0  0  0 -1 # i >= 1
-1  0 -1  1  0  0 # j <= m
-1 -1  1  0  0  1 # j >= i-1
-0  0  0
-
-1
-4 6
-#  i  j  m  n  1
-1  1  0  0  0 -2 # i >= 2
-1 -1  0  0  1  0 # i <= n
-1  0  1  0  0  0 # j >= 0
-1  0 -1  0  1  0 # j <= n
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/logopar.good.c b/cloog-0.17.0/test/logopar.good.c
deleted file mode 100644
index 2b03ca2..0000000
--- a/cloog-0.17.0/test/logopar.good.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Generated from ../../../git/cloog/test/logopar.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int m, int n)
-{
-  /* Original iterators. */
-  int i, j;
-  for (j=0;j<=m;j++) {
-    S1(1,j) ;
-  }
-  if (m >= n+1) {
-    for (i=2;i<=n;i++) {
-      for (j=0;j<=i-2;j++) {
-        S2(i,j) ;
-      }
-      for (j=i-1;j<=n;j++) {
-        S1(i,j) ;
-        S2(i,j) ;
-      }
-      for (j=n+1;j<=m;j++) {
-        S1(i,j) ;
-      }
-    }
-  }
-  if (m == n) {
-    for (i=2;i<=n;i++) {
-      for (j=0;j<=i-2;j++) {
-        S2(i,j) ;
-      }
-      for (j=i-1;j<=n;j++) {
-        S1(i,j) ;
-        S2(i,j) ;
-      }
-    }
-  }
-  for (i=n+1;i<=m+1;i++) {
-    for (j=i-1;j<=m;j++) {
-      S1(i,j) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/lu.c b/cloog-0.17.0/test/lu.c
deleted file mode 100644
index 74ec81f..0000000
--- a/cloog-0.17.0/test/lu.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from ../../../git/cloog/test/lu.cloog by CLooG 0.14.0-238-gb1cb779 gmp bits in 0.01s. */
-if (n >= 2) {
-  for (j=2;j<=n;j++) {
-    S1(1,j);
-  }
-  for (c1=2;c1<=n-1;c1++) {
-    for (c2=2;c2<=n;c2++) {
-      for (i=1;i<=min(c1-1,c2-1);i++) {
-        S2(i,c2,c1);
-      }
-    }
-    for (j=c1+1;j<=n;j++) {
-      S1(c1,j);
-    }
-  }
-  for (c2=2;c2<=n;c2++) {
-    for (i=1;i<=c2-1;i++) {
-      S2(i,c2,n);
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/lu.cloog b/cloog-0.17.0/test/lu.cloog
deleted file mode 100644
index 7753006..0000000
--- a/cloog-0.17.0/test/lu.cloog
+++ /dev/null
@@ -1,47 +0,0 @@
-# language: C
-c
-
-# parameter n
-1 3
-#  n  1
-1  0  1
-1
-n
-
-2 # Number of statements
-
-1
-# {i, j | 1<=i<=n; i+1<=j<=n}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1 -1  1  0 -1
-1  0 -1  1  0
-0  0  0
-
-1
-# {i, j, k | 1<=i<=n; i+1<=j<=n i+1<=k<=n}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1 -1  1  0  0 -1
-1  0 -1  0  1  0
-1 -1  0  1  0 -1
-1  0  0 -1  1  0
-0  0  0
-0
-
-2 # Scattering functions
-# Et les instructions de chunking...
-2 7
-# c1 c2  i  j  n  1
-0  1  0 -1  0  0  0
-0  0  1  0  0 -1  0
-
-2 8
-# c1 c2  i  j  k  n  1
-0  1  0  0  0 -1  0  0
-0  0  1  0 -1  0  0  0
-0
diff --git a/cloog-0.17.0/test/lu.good.c b/cloog-0.17.0/test/lu.good.c
deleted file mode 100644
index 5e9d3d2..0000000
--- a/cloog-0.17.0/test/lu.good.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Generated from ../../../git/cloog/test/lu.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-
-void test(int n)
-{
-  /* Scattering iterators. */
-  int c1, c2;
-  /* Original iterators. */
-  int i, j, k;
-  if (n >= 2) {
-    for (j=2;j<=n;j++) {
-      S1(1,j) ;
-    }
-  }
-  for (c1=2;c1<=n-1;c1++) {
-    for (c2=2;c2<=n-1;c2++) {
-      for (i=1;i<=min(c2-1,c1-1);i++) {
-        S2(i,c2,c1) ;
-      }
-    }
-    for (i=1;i<=c1-1;i++) {
-      S2(i,n,c1) ;
-    }
-    for (j=c1+1;j<=n;j++) {
-      S1(c1,j) ;
-    }
-  }
-  if (n >= 2) {
-    for (c2=2;c2<=n;c2++) {
-      for (i=1;i<=c2-1;i++) {
-        S2(i,c2,n) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/lu2.c b/cloog-0.17.0/test/lu2.c
deleted file mode 100644
index 2f3b34b..0000000
--- a/cloog-0.17.0/test/lu2.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from ../../../git/cloog/test/lu2.cloog by CLooG 0.14.0-238-gb1cb779 gmp bits in 0.01s. */
-if (n >= 2) {
-  for (l=2;l<=n;l++) {
-    S1(1,n,1,l);
-  }
-  for (i=2;i<=n-1;i++) {
-    for (j=2;j<=n;j++) {
-      for (k=1;k<=min(i-1,j-1);k++) {
-        S2(i,j,k,j,i);
-      }
-    }
-    for (l=i+1;l<=n;l++) {
-      S1(i,n,i,l);
-    }
-  }
-  for (j=2;j<=n;j++) {
-    for (k=1;k<=j-1;k++) {
-      S2(n,j,k,j,n);
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/lu2.cloog b/cloog-0.17.0/test/lu2.cloog
deleted file mode 100644
index 5775e49..0000000
--- a/cloog-0.17.0/test/lu2.cloog
+++ /dev/null
@@ -1,37 +0,0 @@
-# language: C
-c
-
-# parameter n
-1 3
-1 0 1
-1
-n
-
-2 # Number of statements
-
-1
-# {c1, c2, i, j | c1=i, c2=n, 1<=i<=n; i+1<=j<=n}
-6 7
-0  1  0 -1  0  0  0
-0  0  1  0  0 -1  0
-1  0  0  1  0  0 -1
-1  0  0 -1  0  1  0
-1  0  0 -1  1  0 -1
-1  0  0  0 -1  1  0
-0  0  0
-
-1
-# {c1, c2, i, j, k | c1=k, c2=j, 1<=i<=n; i+1<=j<=n i+1<=k<=n}
-8 8
-0  1  0  0  0 -1  0  0
-0  0  1  0 -1  0  0  0
-1  0  0  1  0  0  0 -1
-1  0  0 -1  0  0  1  0
-1  0  0 -1  1  0  0 -1
-1  0  0  0 -1  0  1  0
-1  0  0 -1  0  1  0 -1
-1  0  0  0  0 -1  1  0
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/lu2.good.c b/cloog-0.17.0/test/lu2.good.c
deleted file mode 100644
index 5641856..0000000
--- a/cloog-0.17.0/test/lu2.good.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Generated from ../../../git/cloog/test/lu2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k,l) { hash(1); hash(i); hash(j); hash(k); hash(l); }
-#define S2(i,j,k,l,m) { hash(2); hash(i); hash(j); hash(k); hash(l); hash(m); }
-
-void test(int n)
-{
-  /* Original iterators. */
-  int i, j, k, l, m;
-  if (n >= 2) {
-    for (l=2;l<=n;l++) {
-      S1(1,n,1,l) ;
-    }
-  }
-  for (i=2;i<=n-1;i++) {
-    for (j=2;j<=n-1;j++) {
-      for (k=1;k<=min(j-1,i-1);k++) {
-        S2(i,j,k,j,i) ;
-      }
-    }
-    for (k=1;k<=i-1;k++) {
-      S2(i,n,k,n,i) ;
-    }
-    for (l=i+1;l<=n;l++) {
-      S1(i,n,i,l) ;
-    }
-  }
-  if (n >= 2) {
-    for (j=2;j<=n;j++) {
-      for (k=1;k<=j-1;k++) {
-        S2(n,j,k,j,n) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/lub.c b/cloog-0.17.0/test/lub.c
deleted file mode 100644
index 43269a4..0000000
--- a/cloog-0.17.0/test/lub.c
+++ /dev/null
@@ -1,13 +0,0 @@
-/* Generated from ../../../git/cloog/test/lub.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.02s. */
-if (M >= 2) {
-  for (i=1;i<=M-1;i++) {
-    for (j=i+1;j<=M;j++) {
-      S1(i,j) ;
-      for (k=i+1;k<=M;k++) {
-        S2(i,j,k) ;
-        S3(i,j,k) ;
-      }
-      S4(i,j) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/lub.cloog b/cloog-0.17.0/test/lub.cloog
deleted file mode 100644
index fcab9b5..0000000
--- a/cloog-0.17.0/test/lub.cloog
+++ /dev/null
@@ -1,58 +0,0 @@
-# language: C
-c
-
-# parameter n
-1 3
-#  n  1
-1  0  1
-0
-
-4 # Number of statements
-
-1
-# {i, j | 1<=i<=n; i+1<=j<=n}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1 -1  1  0 -1
-1  0 -1  1  0
-0  0  0
- 
-1
-# {i, j, k | 1<=i<=n; i+1<=j<=n i+1<=k<=n}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1 -1  1  0  0 -1
-1  0 -1  0  1  0
-1 -1  0  1  0 -1
-1  0  0 -1  1  0
-0  0  0
-
-1
-# {i, j, k | 1<=i<=n; i+1<=j<=n i+1<=k<=n}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1 -1  1  0  0 -1
-1  0 -1  0  1  0
-1 -1  0  1  0 -1
-1  0  0 -1  1  0
-0  0  0
-
-1
-# {i, j | 1<=i<=n; i+1<=j<=n}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1 -1  1  0 -1
-1  0 -1  1  0
-0  0  0
-0
- 
-0 # Scattering functions
-
diff --git a/cloog-0.17.0/test/lub.good.c b/cloog-0.17.0/test/lub.good.c
deleted file mode 100644
index 3122a3c..0000000
--- a/cloog-0.17.0/test/lub.good.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Generated from ../../../git/cloog/test/lub.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-#define S3(i,j,k) { hash(3); hash(i); hash(j); hash(k); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j, k;
-  for (i=1;i<=M-1;i++) {
-    for (j=i+1;j<=M;j++) {
-      S1(i,j) ;
-      for (k=i+1;k<=M;k++) {
-        S2(i,j,k) ;
-        S3(i,j,k) ;
-      }
-      S4(i,j) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/lux.c b/cloog-0.17.0/test/lux.c
deleted file mode 100644
index d313e3a..0000000
--- a/cloog-0.17.0/test/lux.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from ../../../git/cloog/test/lux.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.02s. */
-if (M >= 2) {
-  for (l=2;l<=M;l++) {
-    S1(1,1,M,l) ;
-  }
-  for (i=2;i<=M-1;i++) {
-    for (j=1;j<=i-1;j++) {
-      for (k=j+1;k<=M;k++) {
-        S2(i,j,k,k,i) ;
-      }
-    }
-    for (l=i+1;l<=M;l++) {
-      S1(i,i,M,l) ;
-    }
-  }
-  for (j=1;j<=M-1;j++) {
-    for (k=j+1;k<=M;k++) {
-      S2(M,j,k,k,M) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/lux.cloog b/cloog-0.17.0/test/lux.cloog
deleted file mode 100644
index 1687e32..0000000
--- a/cloog-0.17.0/test/lux.cloog
+++ /dev/null
@@ -1,36 +0,0 @@
-# language: C
-c
-
-# parameter n
-1 3
-1 0 1
-0
-
-2 # Number of statements
-
-1
-# {c1, c2, i, j | c1=i, c2=n, 1<=i<=n; i+1<=j<=n}
-6 7
-0  1 -1  0  0  0  0
-0  0  0  1  0 -1  0
-1  0  1  0  0  0 -1
-1  0 -1  0  0  1  0
-1  0 -1  0  1  0 -1
-1  0  0  0 -1  1  0
-0  0  0
- 
-1
-# {c1, c2, i, j, k | c1=k, c2=j, 1<=i<=n; i+1<=j<=n i+1<=k<=n}
-8 8
-0  1  0  0  0 -1  0  0
-0  0  0 -1  1  0  0  0
-1  0  1  0  0  0  0 -1
-1  0 -1  0  0  0  1  0
-1  0 -1  1  0  0  0 -1
-1  0  0 -1  0  0  1  0
-1  0 -1  0  0  1  0 -1
-1  0  0  0  0 -1  1  0
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/lux.good.c b/cloog-0.17.0/test/lux.good.c
deleted file mode 100644
index e30289c..0000000
--- a/cloog-0.17.0/test/lux.good.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Generated from ../../../git/cloog/test/lux.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k,l) { hash(1); hash(i); hash(j); hash(k); hash(l); }
-#define S2(i,j,k,l,m) { hash(2); hash(i); hash(j); hash(k); hash(l); hash(m); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j, k, l, m;
-  if (M >= 2) {
-    for (l=2;l<=M;l++) {
-      S1(1,1,M,l) ;
-    }
-  }
-  for (i=2;i<=M-1;i++) {
-    for (j=1;j<=i-1;j++) {
-      for (k=j+1;k<=M;k++) {
-        S2(i,j,k,k,i) ;
-      }
-    }
-    for (l=i+1;l<=M;l++) {
-      S1(i,i,M,l) ;
-    }
-  }
-  if (M >= 2) {
-    for (j=1;j<=M-1;j++) {
-      for (k=j+1;k<=M;k++) {
-        S2(M,j,k,k,M) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/merge.c b/cloog-0.17.0/test/merge.c
deleted file mode 100644
index b85ca1c..0000000
--- a/cloog-0.17.0/test/merge.c
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Generated from ../../../git/cloog/test/merge.cloog by CLooG 0.14.0-238-gb1cb779 gmp bits in 0.00s. */
-S1(0);
-for (c1=0;c1<=10;c1++) {
-  if (c1 >= 2) {
-    S2(c1);
-  }
-  S3(c1);
-}
diff --git a/cloog-0.17.0/test/merge.cloog b/cloog-0.17.0/test/merge.cloog
deleted file mode 100644
index d98c1d0..0000000
--- a/cloog-0.17.0/test/merge.cloog
+++ /dev/null
@@ -1,42 +0,0 @@
-c
-
-0 2
-
-0
-
-3
-
-1
-1 3
-0 -1 0
-0 0 0
-
-1
-2 3
-1 1 -2
-1 -1 10
-0 0 0
-
-1
-2 3
-1 1 0
-1 -1 10
-0 0 0
-
-0
-
-3
-
-2 5
-0 1 0 -1 0
-0 0 1  0 0
-
-2 5
-0 1 0 -1 0
-0 0 1  0 -1
-
-2 5
-0 1 0 -1 0
-0 0 1  0 -2
-
-0
diff --git a/cloog-0.17.0/test/merge.good.c b/cloog-0.17.0/test/merge.good.c
deleted file mode 100644
index 283dc4b..0000000
--- a/cloog-0.17.0/test/merge.good.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Generated from ../../../git/cloog/test/merge.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i) { hash(2); hash(i); }
-#define S3(i) { hash(3); hash(i); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int c1;
-  /* Original iterators. */
-  int i;
-  for (c1=0;c1<=10;c1++) {
-    if (c1 == 0) {
-      S1(0) ;
-    }
-    if (c1 >= 2) {
-      S2(c1) ;
-    }
-    S3(c1) ;
-  }
-}
diff --git a/cloog-0.17.0/test/min-1-1.c b/cloog-0.17.0/test/min-1-1.c
deleted file mode 100644
index 896fea0..0000000
--- a/cloog-0.17.0/test/min-1-1.c
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Generated from ../../../git/cloog/test/min-1-1.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if ((M >= 0) && (N >= 1)) {
-  for (i=1;i<=N;i++) {
-    for (j=0;j<=min(min(M,i),-i+N);j++) {
-      S1(i,j) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/min-1-1.cloog b/cloog-0.17.0/test/min-1-1.cloog
deleted file mode 100644
index a15cdbd..0000000
--- a/cloog-0.17.0/test/min-1-1.cloog
+++ /dev/null
@@ -1,27 +0,0 @@
-# language: C
-c
-
-# Context
-# {M,N | 1>=0}
-1   4
-# M N 1
-1 0 0 1
-0
-
-1 # Number of statements
-
-1
-# {i,j |1<=i<=N; 0<=j<=M; j<=i; j+i<=N}, i.e.
-# {i,j | (1,j)<=i<=-j+N; 0<=j<=M}
-6   6
-#  i  j  M  N  1
-1  1  0  0  0  -1
-1  0  1  0  0  0
-1  0  -1 1  0  0
-1  1  -1 0  0  0
-1  -1 -1 0  1  0
-1  0  0  0  0  1
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/min-1-1.good.c b/cloog-0.17.0/test/min-1-1.good.c
deleted file mode 100644
index ff0d5fc..0000000
--- a/cloog-0.17.0/test/min-1-1.good.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Generated from ../../../git/cloog/test/min-1-1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i, j;
-  if (M >= 0) {
-    for (i=1;i<=N;i++) {
-      for (j=0;j<=min(min(i,-i+N),M);j++) {
-        S1(i,j) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/min-2-1.c b/cloog-0.17.0/test/min-2-1.c
deleted file mode 100644
index f7161bc..0000000
--- a/cloog-0.17.0/test/min-2-1.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Generated from ../../../git/cloog/test/min-2-1.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if ((M >= 0) && (N >= 1)) {
-  for (i=1;i<=N;i++) {
-    for (j=0;j<=min(min(M,i),-i+N);j++) {
-      for (k=0;k<=min(min(M,i),-i+N);k++) {
-        S1(i,j,k) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/min-2-1.cloog b/cloog-0.17.0/test/min-2-1.cloog
deleted file mode 100644
index 0c1ed37..0000000
--- a/cloog-0.17.0/test/min-2-1.cloog
+++ /dev/null
@@ -1,31 +0,0 @@
-# language: C
-c
-
-# Context
-# {M,N | 1>=0}
-1   4
-# M N 1
-1 0 0 1
-0
-
-1 # Number of statements
-
-1
-# {i,j |1<=i<=N; 0<=j<=M; j<=i; j+i<=N}, i.e.
-# {i,j | (1,j)<=i<=-j+N; 0<=j<=M}
-10   7
-#  i  j  k M  N  1
-1  1  0  0 0  0  -1
-1  0  1  0 0  0  0
-1  0  -1 0 1  0  0
-1  1  -1 0 0  0  0
-1  -1 -1 0 0  1  0
-1  0  0  1 0  0  0
-1  0  0 -1 1  0  0
-1  1  0 -1 0  0  0
-1  -1 0 -1 0  1  0
-1  0  0 0  0  0  1
-0 0 0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/min-2-1.good.c b/cloog-0.17.0/test/min-2-1.good.c
deleted file mode 100644
index e052a0c..0000000
--- a/cloog-0.17.0/test/min-2-1.good.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Generated from ../../../git/cloog/test/min-2-1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i, j, k;
-  if (M >= 0) {
-    for (i=1;i<=N;i++) {
-      for (j=0;j<=min(min(i,M),-i+N);j++) {
-        for (k=0;k<=min(min(M,i),-i+N);k++) {
-          S1(i,j,k) ;
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/min-3-1.c b/cloog-0.17.0/test/min-3-1.c
deleted file mode 100644
index 5736a3c..0000000
--- a/cloog-0.17.0/test/min-3-1.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/min-3-1.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (i=0;i<=min(10,M);i++) {
-  for (j=0;j<=min(10,M);j++) {
-    S1(i,j) ;
-  }
-}
diff --git a/cloog-0.17.0/test/min-3-1.cloog b/cloog-0.17.0/test/min-3-1.cloog
deleted file mode 100644
index f1a3c12..0000000
--- a/cloog-0.17.0/test/min-3-1.cloog
+++ /dev/null
@@ -1,27 +0,0 @@
-# language: C
-c
-
-# Context
-2 3
-#  M  1
-1  1  0
-1  0  1
-0 
-
-1 # Number of statements
-
-1
-#
-7 5
-#  i  j  M  1
-1  1  0  0  0
-1 -1  0  1  0
-1 -1  0  0 10
-1  0  1  0  0
-1  0 -1  1  0
-1  0 -1  0 10
-1  0  0  0  1
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/min-3-1.good.c b/cloog-0.17.0/test/min-3-1.good.c
deleted file mode 100644
index ec50b38..0000000
--- a/cloog-0.17.0/test/min-3-1.good.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from ../../../git/cloog/test/min-3-1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j;
-  for (i=0;i<=min(10,M);i++) {
-    for (j=0;j<=min(10,M);j++) {
-      S1(i,j) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/min-4-1.c b/cloog-0.17.0/test/min-4-1.c
deleted file mode 100644
index 91e5e65..0000000
--- a/cloog-0.17.0/test/min-4-1.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/min-4-1.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if ((M >= -N) && (M >= -O) && (N >= 0) && (N >= -O)) {
-  for (i=max(-M,-N);i<=min(N,O);i++) {
-    S1(i) ;
-  }
-}
diff --git a/cloog-0.17.0/test/min-4-1.cloog b/cloog-0.17.0/test/min-4-1.cloog
deleted file mode 100644
index 5cce62f..0000000
--- a/cloog-0.17.0/test/min-4-1.cloog
+++ /dev/null
@@ -1,25 +0,0 @@
-# language: C
-c
-
-# Context
-# {L,M,N|}
-1 5
-#  L  M  N  1
-1  0  0  0  1
-0
-
-1 # Number of statements
-
-1
-# {i|-L,-M <= i <= M, N} 
-5  6
-#  i  L  M  N  1
-1  1  1  0  0  0
-1  1  0  1  0  0
-1 -1  0  1  0  0
-1 -1  0  0  1  0
-1  0  0  0  0  1
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/min-4-1.good.c b/cloog-0.17.0/test/min-4-1.good.c
deleted file mode 100644
index a04831f..0000000
--- a/cloog-0.17.0/test/min-4-1.good.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated from ../../../git/cloog/test/min-4-1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-
-void test(int M, int N, int O)
-{
-  /* Original iterators. */
-  int i;
-  for (i=max(-M,-N);i<=min(O,N);i++) {
-    S1(i) ;
-  }
-}
diff --git a/cloog-0.17.0/test/mod4.c b/cloog-0.17.0/test/mod4.c
deleted file mode 100644
index 6a1ad6a..0000000
--- a/cloog-0.17.0/test/mod4.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/mod4.cloog by CLooG 0.14.0-225-g6e2d019 gmp bits in 0.00s. */
-for (j=2;j<=10;j+=3) {
-  S1(j,(j+1)/3,(j+1)/3,2,(j-2)/3);
-  S2(j,(j+1)/3,(j+1)/3,2,(j-2)/3);
-  S3(j,(j+1)/3,(j+1)/3,2,(j-2)/3);
-}
diff --git a/cloog-0.17.0/test/mod4.cloog b/cloog-0.17.0/test/mod4.cloog
deleted file mode 100644
index 6f3eecd..0000000
--- a/cloog-0.17.0/test/mod4.cloog
+++ /dev/null
@@ -1,72 +0,0 @@
-# language: C
-c
-
-# parameters
-1 2
-1 1
- 0
-
-
-3
-
-
-
-# S1: ND_4IP_3
-1
-11 7
-  1  1  0  0  0  0 -1
-  1 -1  0  0  0  0 10
-  0  0  0  0  1  0 -2
-  1 -1  0  0  0  3  2
-  1 -1  0  0  0  3  2
-  1  1  0  0  0 -3  0
-  0  1  0  0 -1 -3  0
-  1  1 -3  0  0  0  2
-  1 -1  3  0  0  0  0
-  1  1  0 -3  0  0  1
-  1 -1  0  3  0  0  1
- 0 0 0
-
-
-
-# S2:  W:ND_4OP_1
-1
-13 7
-  1  0  1  0  0 -1 -1
-  1  0  0  3  0 -3 -2
-  1  1  0  0  0  0 -1
-  1 -1  0  0  0  0 10
-  0  0  0  0  1  0 -2
-  1 -1  0  0  0  3  2
-  1 -1  0  0  0  3  2
-  1  1  0  0  0 -3  0
-  0  1  0  0 -1 -3  0
-  1  1 -3  0  0  0  2
-  1 -1  3  0  0  0  0
-  1  1  0 -3  0  0  1
-  1 -1  0  3  0  0  1
- 0 0 0
-
-
-
-# S3: ND_4
-1
-11 7
-  1  1  0  0  0  0 -1
-  1 -1  0  0  0  0 10
-  0  0  0  0  1  0 -2
-  1 -1  0  0  0  3  2
-  1 -1  0  0  0  3  2
-  1  1  0  0  0 -3  0
-  0  1  0  0 -1 -3  0
-  1  1 -3  0  0  0  2
-  1 -1  3  0  0  0  0
-  1  1  0 -3  0  0  1
-  1 -1  0  3  0  0  1
- 0 0 0
-
-
- 1
- j div41 div42 mod6 mod6_a
- 0
- 0
diff --git a/cloog-0.17.0/test/mode.c b/cloog-0.17.0/test/mode.c
deleted file mode 100644
index c527eed..0000000
--- a/cloog-0.17.0/test/mode.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/mode.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.00s. */
-if (M >= 0) {
-  if (N >= 0) {
-    for (i=0;i<=M;i++) {
-      for (j=0;j<=min(N,i);j++) {
-        S1(i,j);
-        S2(i,j);
-      }
-      for (j=N+1;j<=i;j++) {
-        S1(i,j);
-      }
-      for (j=i+1;j<=N;j++) {
-        S2(i,j);
-      }
-    }
-  }
-  if (N <= -1) {
-    for (i=0;i<=M;i++) {
-      for (j=0;j<=i;j++) {
-        S1(i,j);
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/mode.cloog b/cloog-0.17.0/test/mode.cloog
deleted file mode 100644
index caeecb8..0000000
--- a/cloog-0.17.0/test/mode.cloog
+++ /dev/null
@@ -1,33 +0,0 @@
-# language: C
-c
-
-# parameters n m
-1 4
-#  n  m  1
-1  0  0  1
-0
-
-2 # Number of statements
-
-1
-# S2 {i, j | 0<=i<=n; 0<=j<=i}
-4 6
-#  i  j  n  m  1
-1  1  0  0  0  0
-1 -1  0  1  0  0
-1  0  1  0  0  0
-1  1 -1  0  0  0
-0  0  0
-
-1
-# S2 {i, j | 0<=i<=n; 0<=j<=m}
-4 6
-#  i  j  n  m  1
-1  1  0  0  0  0
-1 -1  0  1  0  0
-1  0  1  0  0  0
-1  0 -1  0  1  0
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/mode.good.c b/cloog-0.17.0/test/mode.good.c
deleted file mode 100644
index 0714757..0000000
--- a/cloog-0.17.0/test/mode.good.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Generated from ../../../git/cloog/test/mode.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i, j;
-  for (i=0;i<=min(M,N-1);i++) {
-    for (j=0;j<=i;j++) {
-      S1(i,j) ;
-      S2(i,j) ;
-    }
-    for (j=i+1;j<=N;j++) {
-      S2(i,j) ;
-    }
-  }
-  if ((M >= N) && (N >= 0)) {
-    for (j=0;j<=N;j++) {
-      S1(N,j) ;
-      S2(N,j) ;
-    }
-  }
-  if (N >= 0) {
-    for (i=N+1;i<=M;i++) {
-      for (j=0;j<=N;j++) {
-        S1(i,j) ;
-        S2(i,j) ;
-      }
-      for (j=N+1;j<=i;j++) {
-        S1(i,j) ;
-      }
-    }
-  }
-  if (N <= -1) {
-    for (i=0;i<=M;i++) {
-      for (j=0;j<=i;j++) {
-        S1(i,j) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/multi-mm-1.c b/cloog-0.17.0/test/multi-mm-1.c
deleted file mode 100644
index 646395c..0000000
--- a/cloog-0.17.0/test/multi-mm-1.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/multi-mm-1.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.00s. */
-for (i=0;i<=M;i++) {
-  for (j=0;j<=min(N,i);j++) {
-    S1(i,j);
-    S2(i,j);
-  }
-  for (j=N+1;j<=i;j++) {
-    S1(i,j);
-  }
-}
diff --git a/cloog-0.17.0/test/multi-mm-1.cloog b/cloog-0.17.0/test/multi-mm-1.cloog
deleted file mode 100644
index 58f4ce8..0000000
--- a/cloog-0.17.0/test/multi-mm-1.cloog
+++ /dev/null
@@ -1,37 +0,0 @@
-# language: C
-c
-
-# Context
-#{M,N|M>N}
-3  4
-#  M  N  1
-1  1 -1  0
-1  0  1 -1
-1  0  0  1
-0
-
-2 # Number of statements
-
-1
-#
-4  6
-#  i  j  M  N  1
-1  0  1  0  0  0
-1  1 -1  0  0  0
-1 -1  0  1  0  0
-1  0  0  0  0  1
-0  0  0
-
-1
-#
-5  6
-#  i  j  M  N  1
-1  0  1  0  0  0
-1  1 -1  0  0  0
-1 -1  0  1  0  0
-1  0 -1  0  1  0
-1  0  0  0  0  1
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/multi-mm-1.good.c b/cloog-0.17.0/test/multi-mm-1.good.c
deleted file mode 100644
index 6bfcc3c..0000000
--- a/cloog-0.17.0/test/multi-mm-1.good.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Generated from ../../../git/cloog/test/multi-mm-1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i, j;
-  for (i=0;i<=N;i++) {
-    for (j=0;j<=i;j++) {
-      S1(i,j) ;
-      S2(i,j) ;
-    }
-  }
-  for (i=N+1;i<=M;i++) {
-    for (j=0;j<=N;j++) {
-      S1(i,j) ;
-      S2(i,j) ;
-    }
-    for (j=N+1;j<=i;j++) {
-      S1(i,j) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/multi-stride.c b/cloog-0.17.0/test/multi-stride.c
deleted file mode 100644
index 51b2061..0000000
--- a/cloog-0.17.0/test/multi-stride.c
+++ /dev/null
@@ -1 +0,0 @@
-/* Generated from ../../../git/cloog/test/multi-stride.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
diff --git a/cloog-0.17.0/test/multi-stride.cloog b/cloog-0.17.0/test/multi-stride.cloog
deleted file mode 100644
index 8f858da..0000000
--- a/cloog-0.17.0/test/multi-stride.cloog
+++ /dev/null
@@ -1,28 +0,0 @@
-# Language
-c
-
-# Context
-
-   1 2
-   1  1
-0
-
-# Number of statements
-1
-
-1
-
-#        i'   i    j    1
-   4 5
-   0    1   -2    0   -1
-   0    1    0   -6   -2
-   1    1    0    0    0
-   1   -1    0    0  100
-
-0 0 0
-
-0
-0
-
-
-
diff --git a/cloog-0.17.0/test/multi-stride2.c b/cloog-0.17.0/test/multi-stride2.c
deleted file mode 100644
index 443107b..0000000
--- a/cloog-0.17.0/test/multi-stride2.c
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Generated from ../../../git/cloog/test/multi-stride2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-for (i=5;i<=100;i+=6) {
-  S1(i,(i-1)/2,(i-2)/3) ;
-}
diff --git a/cloog-0.17.0/test/multi-stride2.cloog b/cloog-0.17.0/test/multi-stride2.cloog
deleted file mode 100644
index db1afd4..0000000
--- a/cloog-0.17.0/test/multi-stride2.cloog
+++ /dev/null
@@ -1,28 +0,0 @@
-# Language
-c
-
-# Context
-
-   1 2
-   1  1
-0
-
-# Number of statements
-1
-
-1
-
-#        i'   i    j    1
-   4 5
-   0    1   -2    0   -1
-   0    1    0   -3   -2
-   1    1    0    0    0
-   1   -1    0    0  100
-
-0 0 0
-
-0
-0
-
-
-
diff --git a/cloog-0.17.0/test/no_lindep.c b/cloog-0.17.0/test/no_lindep.c
deleted file mode 100644
index 3c7c574..0000000
--- a/cloog-0.17.0/test/no_lindep.c
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Generated from ../../../git/cloog/test/no_lindep.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-S1(N+2) ;
diff --git a/cloog-0.17.0/test/no_lindep.cloog b/cloog-0.17.0/test/no_lindep.cloog
deleted file mode 100644
index ab0cb7d..0000000
--- a/cloog-0.17.0/test/no_lindep.cloog
+++ /dev/null
@@ -1,34 +0,0 @@
-# language C
-c
-
-# 2 parameters
-1 4
-1 0 0 0 
-
-0
-
-# 1 statement
-1
-
-# 1 domain
-# i=n+2
-1
-1 5
-0 -1  0  1  2
-
-0 0 0 
-
-0
-
-# 1 scattering function
-# c1=M+1
-# c2=N
-1
-2  7
-0 -1  0  0  1  0  1
-0  0 -1  0  0  1  0
-
-0
-
-
-
diff --git a/cloog-0.17.0/test/no_lindep.good.c b/cloog-0.17.0/test/no_lindep.good.c
deleted file mode 100644
index 5db6759..0000000
--- a/cloog-0.17.0/test/no_lindep.good.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from ../../../git/cloog/test/no_lindep.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int c1, c2;
-  /* Original iterators. */
-  int i;
-  c1 = M+1 ;
-  i = N+2 ;
-  S1(N+2) ;
-}
diff --git a/cloog-0.17.0/test/non_optimal/nul_complex1.c b/cloog-0.17.0/test/non_optimal/nul_complex1.c
deleted file mode 100644
index ff78145..0000000
--- a/cloog-0.17.0/test/non_optimal/nul_complex1.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Generated from ../../../git/cloog/test/./non_optimal/nul_complex1.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-if (n >= 0) {
-  for (c1=0;c1<=5*n;c1++) {
-    for (c2=max(ceild(2*c1,3),c1-n);c2<=min(floord(2*c1+2*n,3),c1);c2++) {
-      if (c2%2 == 0) {
-        S1((-2*c1+3*c2)/2,c1-c2) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/non_optimal/nul_complex1.cloog b/cloog-0.17.0/test/non_optimal/nul_complex1.cloog
deleted file mode 100644
index 4b4d45a..0000000
--- a/cloog-0.17.0/test/non_optimal/nul_complex1.cloog
+++ /dev/null
@@ -1,37 +0,0 @@
-# Optimal code is in fact :
-#
-# for (i=0;i<=M;i+=2) {
-#   S1 ;
-# }
- 
-# language: C
-c
-
-# parameter n
-1 3
-#  n  1
-1  0  1
-1
-n
-
-1 # Number of statements
-
-1
-# {i | 0<=i<=n}
-4 5
-#  i  j  n  1
-1  1  0  0  0
-1 -1  0  1  0
-1  0  1  0  0
-1  0 -1  1  0
-0  0  0
-0
-
-1 # Scattering functions
-
-2 7
-# c1 c2  i  j  n  1
-0  1  0 -2 -3  0  0 
-0  0  1 -2 -2  0  0 
-
-0
diff --git a/cloog-0.17.0/test/non_optimal/nul_complex1.good.c b/cloog-0.17.0/test/non_optimal/nul_complex1.good.c
deleted file mode 100644
index 79694f1..0000000
--- a/cloog-0.17.0/test/non_optimal/nul_complex1.good.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Generated from ../../../git/cloog/test/./non_optimal/nul_complex1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int n)
-{
-  /* Scattering iterators. */
-  int c1, c2;
-  /* Original iterators. */
-  int i, j;
-  for (c1=0;c1<=5*n;c1++) {
-    for (c2=max(c1-n,ceild(2*c1,3));c2<=min(c1,floord(2*c1+2*n,3));c2++) {
-      if (c2%2 == 0) {
-        i = (-2*c1+3*c2)/2 ;
-        j = c1-c2 ;
-        S1((-2*c1+3*c2)/2,c1-c2) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/non_optimal/usvd_e_t.c b/cloog-0.17.0/test/non_optimal/usvd_e_t.c
deleted file mode 100644
index 6d253f6..0000000
--- a/cloog-0.17.0/test/non_optimal/usvd_e_t.c
+++ /dev/null
@@ -1,375 +0,0 @@
-/* Generated from ../../../git/cloog/test/non_optimal/usvd_e_t.cloog by CLooG 0.14.0-238-gb1cb779 gmp bits in 0.11s. */
-for (i=0;i<=2;i++) {
-  S1(i,0,0);
-  for (j=0;j<=4;j++) {
-    S2(i,j,0);
-  }
-}
-S1(3,0,0);
-for (j=0;j<=4;j++) {
-  S2(3,j,0);
-}
-for (j=7;j<=11;j++) {
-  S8(3,j,0);
-}
-S1(4,0,0);
-S2(4,0,0);
-S3(4,0,0);
-S5(4,0,0);
-for (j=1;j<=4;j++) {
-  S2(4,j,0);
-  S5(4,j,0);
-}
-for (j=7;j<=11;j++) {
-  S8(4,j,0);
-}
-for (i=5;i<=6;i++) {
-  for (j=-4;j<=i-9;j++) {
-    S6(i,j,0);
-  }
-  for (j=i-9;j<=-1;j++) {
-    S7(i,j,0);
-  }
-  S3(i,0,0);
-  S7(i,0,0);
-  for (j=1;j<=i-4;j++) {
-    S4(i,j,-1);
-  }
-  for (j=i-4;j<=4;j++) {
-    S5(i,j,0);
-  }
-  for (j=7;j<=11;j++) {
-    S8(i,j,0);
-  }
-}
-for (j=-4;j<=-2;j++) {
-  S6(7,j,0);
-}
-for (j=-2;j<=-1;j++) {
-  S7(7,j,0);
-}
-S3(7,0,0);
-S7(7,0,0);
-for (j=1;j<=3;j++) {
-  S4(7,j,-1);
-}
-for (j=3;j<=4;j++) {
-  S5(7,j,0);
-}
-S9(7,4,0);
-S10(7,4,0);
-S11(7,4,0);
-S21(7,4,0);
-S23(7,4,0);
-S11(7,4,1);
-S16(7,4,1);
-S17(7,4,1);
-for (k=2;k<=4;k++) {
-  S11(7,4,k);
-}
-S12(7,5,0);
-S21(7,5,0);
-S22(7,5,0);
-S23(7,5,0);
-S12(7,5,1);
-S16(7,5,1);
-S17(7,5,1);
-for (k=2;k<=4;k++) {
-  S12(7,5,k);
-}
-S21(7,6,0);
-S22(7,6,0);
-S23(7,6,0);
-for (j=7;j<=8;j++) {
-  S8(7,j,0);
-  S21(7,j,0);
-  S22(7,j,0);
-  S23(7,j,0);
-}
-S8(7,9,0);
-S22(7,9,0);
-for (j=10;j<=11;j++) {
-  S8(7,j,0);
-}
-for (j=-4;j<=-1;j++) {
-  S6(8,j,0);
-}
-S7(8,-1,0);
-S3(8,0,0);
-S7(8,0,0);
-S19(8,1,-2);
-S4(8,1,-1);
-S19(8,1,-1);
-S19(8,1,0);
-S15(8,1,4);
-S18(8,1,4);
-for (k=-4;k<=-3;k++) {
-  S14(8,2,k);
-  S20(8,2,k);
-}
-S14(8,2,-2);
-S19(8,2,-2);
-S20(8,2,-2);
-S4(8,2,-1);
-S14(8,2,-1);
-S19(8,2,-1);
-S20(8,2,-1);
-S14(8,2,0);
-S19(8,2,0);
-S20(8,2,0);
-S15(8,2,4);
-S18(8,2,4);
-for (k=-4;k<=-2;k++) {
-  S14(8,3,k);
-  S20(8,3,k);
-}
-S4(8,3,-1);
-S14(8,3,-1);
-S20(8,3,-1);
-S14(8,3,0);
-S20(8,3,0);
-S15(8,3,4);
-S18(8,3,4);
-for (k=-4;k<=-2;k++) {
-  S14(8,4,k);
-  S20(8,4,k);
-}
-S4(8,4,-1);
-S14(8,4,-1);
-S20(8,4,-1);
-S5(8,4,0);
-S9(8,4,0);
-S10(8,4,0);
-S14(8,4,0);
-S20(8,4,0);
-S23(8,4,0);
-S13(8,4,1);
-S21(8,4,1);
-S23(8,4,1);
-S24(8,4,1);
-S13(8,4,2);
-S16(8,4,2);
-S17(8,4,2);
-S24(8,4,2);
-S13(8,4,3);
-S24(8,4,3);
-S13(8,4,4);
-S15(8,4,4);
-S23(8,5,0);
-S11(8,5,1);
-S21(8,5,1);
-S22(8,5,1);
-S23(8,5,1);
-S24(8,5,1);
-S11(8,5,2);
-S16(8,5,2);
-S17(8,5,2);
-S24(8,5,2);
-S11(8,5,3);
-S24(8,5,3);
-S11(8,5,4);
-S15(8,5,4);
-S23(8,6,0);
-S12(8,6,1);
-S21(8,6,1);
-S22(8,6,1);
-S23(8,6,1);
-S24(8,6,1);
-S12(8,6,2);
-S16(8,6,2);
-S17(8,6,2);
-S24(8,6,2);
-S12(8,6,3);
-S24(8,6,3);
-S12(8,6,4);
-for (j=7;j<=8;j++) {
-  S23(8,j,0);
-  S21(8,j,1);
-  S22(8,j,1);
-  S23(8,j,1);
-  for (k=1;k<=3;k++) {
-    S24(8,j,k);
-  }
-}
-S22(8,9,1);
-S7(9,0,0);
-for (j=1;j<=2;j++) {
-  for (k=-1;k<=0;k++) {
-    S19(9,j,k);
-  }
-  for (k=4;k<=5;k++) {
-    S15(9,j,k);
-    S18(9,j,k);
-  }
-}
-S20(9,3,-4);
-for (k=-3;k<=-2;k++) {
-  S14(9,3,k);
-  S20(9,3,k);
-}
-for (k=-1;k<=0;k++) {
-  S14(9,3,k);
-  S19(9,3,k);
-  S20(9,3,k);
-}
-for (k=4;k<=5;k++) {
-  S15(9,3,k);
-  S18(9,3,k);
-}
-S20(9,4,-4);
-for (k=-3;k<=-1;k++) {
-  S14(9,4,k);
-  S20(9,4,k);
-}
-S9(9,4,0);
-S10(9,4,0);
-S14(9,4,0);
-S20(9,4,0);
-for (k=0;k<=1;k++) {
-  S23(9,4,k);
-}
-S13(9,4,2);
-S21(9,4,2);
-S23(9,4,2);
-S24(9,4,2);
-S13(9,4,3);
-S16(9,4,3);
-S17(9,4,3);
-S24(9,4,3);
-S13(9,4,4);
-for (k=4;k<=5;k++) {
-  S15(9,4,k);
-  S18(9,4,k);
-}
-for (k=0;k<=1;k++) {
-  S23(9,5,k);
-}
-S13(9,5,2);
-S21(9,5,2);
-S22(9,5,2);
-S23(9,5,2);
-S24(9,5,2);
-S13(9,5,3);
-S16(9,5,3);
-S17(9,5,3);
-S24(9,5,3);
-S13(9,5,4);
-for (k=4;k<=5;k++) {
-  S15(9,5,k);
-}
-for (k=0;k<=1;k++) {
-  S23(9,6,k);
-}
-S11(9,6,2);
-S21(9,6,2);
-S22(9,6,2);
-S23(9,6,2);
-S24(9,6,2);
-S11(9,6,3);
-S16(9,6,3);
-S17(9,6,3);
-S24(9,6,3);
-S11(9,6,4);
-for (k=0;k<=1;k++) {
-  S23(9,7,k);
-}
-S12(9,7,2);
-S21(9,7,2);
-S22(9,7,2);
-S23(9,7,2);
-S24(9,7,2);
-S12(9,7,3);
-S16(9,7,3);
-S17(9,7,3);
-S24(9,7,3);
-S12(9,7,4);
-for (k=0;k<=1;k++) {
-  S23(9,8,k);
-}
-S21(9,8,2);
-S22(9,8,2);
-S23(9,8,2);
-for (k=2;k<=3;k++) {
-  S24(9,8,k);
-}
-S22(9,9,2);
-for (j=1;j<=3;j++) {
-  S19(10,j,0);
-  S26(10,j,3);
-  S15(10,j,4);
-  S18(10,j,4);
-  S25(10,j,4);
-  for (k=5;k<=6;k++) {
-    S15(10,j,k);
-    S18(10,j,k);
-  }
-}
-for (k=-4;k<=-3;k++) {
-  S20(10,4,k);
-}
-for (k=-2;k<=-1;k++) {
-  S14(10,4,k);
-  S20(10,4,k);
-}
-S9(10,4,0);
-S10(10,4,0);
-S14(10,4,0);
-S19(10,4,0);
-S20(10,4,0);
-S13(10,4,3);
-S21(10,4,3);
-S24(10,4,3);
-S26(10,4,3);
-S13(10,4,4);
-S15(10,4,4);
-S16(10,4,4);
-S17(10,4,4);
-S18(10,4,4);
-S25(10,4,4);
-for (k=5;k<=6;k++) {
-  S15(10,4,k);
-  S18(10,4,k);
-}
-S13(10,5,3);
-S21(10,5,3);
-S22(10,5,3);
-S24(10,5,3);
-S26(10,5,3);
-S13(10,5,4);
-S15(10,5,4);
-S16(10,5,4);
-S17(10,5,4);
-S18(10,5,4);
-S25(10,5,4);
-for (k=5;k<=6;k++) {
-  S15(10,5,k);
-  S18(10,5,k);
-}
-S13(10,6,3);
-S21(10,6,3);
-S22(10,6,3);
-S24(10,6,3);
-S13(10,6,4);
-S16(10,6,4);
-S17(10,6,4);
-S11(10,7,3);
-S21(10,7,3);
-S22(10,7,3);
-S24(10,7,3);
-S11(10,7,4);
-S16(10,7,4);
-S17(10,7,4);
-S12(10,8,3);
-S21(10,8,3);
-S22(10,8,3);
-S24(10,8,3);
-S12(10,8,4);
-S16(10,8,4);
-S17(10,8,4);
-S22(10,9,3);
-for (i=11;i<=14;i++) {
-  for (j=1;j<=5;j++) {
-    S26(i,j,3);
-    S25(i,j,4);
-  }
-}
diff --git a/cloog-0.17.0/test/non_optimal/usvd_e_t.cloog b/cloog-0.17.0/test/non_optimal/usvd_e_t.cloog
deleted file mode 100644
index a8d8510..0000000
--- a/cloog-0.17.0/test/non_optimal/usvd_e_t.cloog
+++ /dev/null
@@ -1,240 +0,0 @@
-# language: C
-c
-
-# Context
-0 2
-
-0 # parameter names
-
-26 # Number of statements
-
-1
-4 5
-#          i      j      k      1
-    0      0      1      0      0  
-    0      0      0      1      0  
-    1      1      0      0      0  
-    1     -1      0      0      4  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    0      0      0      1      0  
-    1      1      0      0      0  
-    1     -1      0      0      4  
-    1      0      1      0      0  
-    1      0     -1      0      4  
-0 0 0
-1
-4 5
-#          i      j      k      1
-    0      0      1      0      0  
-    0      0      0      1      0  
-    1      1      0      0     -4  
-    1     -1      0      0      8  
-0 0 0
-1
-4 5
-#          i      j      k      1
-    0      0      0      1      1  
-    1     -1      0      0      8  
-    1      0      1      0     -1  
-    1      1     -1      0     -4  
-0 0 0
-1
-4 5
-#          i      j      k      1
-    0      0      0      1      0  
-    1      1      0      0     -4  
-    1      0     -1      0      4  
-    1     -1      1      0      4  
-0 0 0
-1
-4 5
-#          i      j      k      1
-    0      0      0      1      0  
-    1     -1      0      0      8  
-    1      0      1      0      4  
-    1      1     -1      0     -9  
-0 0 0
-1
-4 5
-#          i      j      k      1
-    0      0      0      1      0  
-    1      1      0      0     -5  
-    1      0     -1      0      0  
-    1     -1      1      0      9  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    0      0      0      1      0  
-    1      1      0      0     -3  
-    1     -1      0      0      7  
-    1      0      1      0     -7  
-    1      0     -1      0     11  
-0 0 0
-1
-4 5
-#          i      j      k      1
-    0      0      1      0     -4  
-    0      0      0      1      0  
-    1      1      0      0     -7  
-    1     -1      0      0     10  
-0 0 0
-1
-4 5
-#          i      j      k      1
-    0      0      1      0     -4  
-    0      0      0      1      0  
-    1      1      0      0     -7  
-    1     -1      0      0     10  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    0      1     -1      0     -3  
-    1      0     -1      0      7  
-    1      0      1      0     -4  
-    1      0      0     -1      4  
-    1      0     -1      1      4  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    0      1     -1      0     -2  
-    1      0      1      0     -5  
-    1      0     -1      0      8  
-    1      0      0     -1      4  
-    1      0     -1      1      5  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    1     -1      0      0     10  
-    1      0      1      0     -4  
-    1      0      0     -1      4  
-    1     -1      0      1      7  
-    1      1     -1      0     -4  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    1      1      0      0     -8  
-    1      0     -1      0      4  
-    1      0      0     -1      0  
-    1     -1      0      1     12  
-    1     -1      1      0      6  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    1     -1      0      0     10  
-    1      0      1      0     -1  
-    1      0     -1      0      5  
-    1      0      0      1     -4  
-    1      1      0     -1     -4  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    0      1      0     -1     -6  
-    1      0      0     -1      4  
-    1      0      1      0     -4  
-    1      0      0      1     -1  
-    1      0     -1      1      4  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    0      1      0     -1     -6  
-    1      0      0      1     -1  
-    1      0      1      0     -4  
-    1      0      0     -1      4  
-    1      0     -1      1      4  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    1     -1      0      0     10  
-    1      0      1      0     -1  
-    1      0      0      1     -4  
-    1      1      0     -1     -4  
-    1      1     -1      0     -5  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    1      1      0      0     -8  
-    1      0      1      0     -1  
-    1      0      0     -1      0  
-    1     -1      0      1     10  
-    1      1     -1      0     -6  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    1      1      0      0     -8  
-    1      0     -1      0      4  
-    1      0      0      1      4  
-    1      0      0     -1      0  
-    1     -1      1      0      6  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    0      1      0     -1     -7  
-    1      0      0     -1      3  
-    1      0      1      0     -4  
-    1      0     -1      0      8  
-    1      0      0      1      0  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    0      1      0     -1     -7  
-    1      0      0      1      0  
-    1      0      1      0     -5  
-    1      0     -1      0      9  
-    1      0      0     -1      3  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    1     -1      0      0      9  
-    1      0      1      0     -4  
-    1      0     -1      0      8  
-    1      0      0      1      0  
-    1      1      0     -1     -7  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    1      1      0      0     -8  
-    1      0      1      0     -4  
-    1      0     -1      0      8  
-    1      0      0     -1      3  
-    1     -1      0      1      7  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    0      0      0      1     -4  
-    1      1      0      0    -10  
-    1     -1      0      0     14  
-    1      0      1      0     -1  
-    1      0     -1      0      5  
-0 0 0
-1
-5 5
-#          i      j      k      1
-    0      0      0      1     -3  
-    1      1      0      0    -10  
-    1     -1      0      0     14  
-    1      0      1      0     -1  
-    1      0     -1      0      5  
-0 0 0
-0 # iterator names
-0 # scattering functions
-0 # scattering dimension names
-
diff --git a/cloog-0.17.0/test/non_optimal/usvd_e_t.good.c b/cloog-0.17.0/test/non_optimal/usvd_e_t.good.c
deleted file mode 100644
index f54c11c..0000000
--- a/cloog-0.17.0/test/non_optimal/usvd_e_t.good.c
+++ /dev/null
@@ -1,429 +0,0 @@
-/* Generated from ../../../git/cloog/test/./non_optimal/usvd_e_t.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.36s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-#define S3(i,j,k) { hash(3); hash(i); hash(j); hash(k); }
-#define S4(i,j,k) { hash(4); hash(i); hash(j); hash(k); }
-#define S5(i,j,k) { hash(5); hash(i); hash(j); hash(k); }
-#define S6(i,j,k) { hash(6); hash(i); hash(j); hash(k); }
-#define S7(i,j,k) { hash(7); hash(i); hash(j); hash(k); }
-#define S8(i,j,k) { hash(8); hash(i); hash(j); hash(k); }
-#define S9(i,j,k) { hash(9); hash(i); hash(j); hash(k); }
-#define S10(i,j,k) { hash(10); hash(i); hash(j); hash(k); }
-#define S11(i,j,k) { hash(11); hash(i); hash(j); hash(k); }
-#define S12(i,j,k) { hash(12); hash(i); hash(j); hash(k); }
-#define S13(i,j,k) { hash(13); hash(i); hash(j); hash(k); }
-#define S14(i,j,k) { hash(14); hash(i); hash(j); hash(k); }
-#define S15(i,j,k) { hash(15); hash(i); hash(j); hash(k); }
-#define S16(i,j,k) { hash(16); hash(i); hash(j); hash(k); }
-#define S17(i,j,k) { hash(17); hash(i); hash(j); hash(k); }
-#define S18(i,j,k) { hash(18); hash(i); hash(j); hash(k); }
-#define S19(i,j,k) { hash(19); hash(i); hash(j); hash(k); }
-#define S20(i,j,k) { hash(20); hash(i); hash(j); hash(k); }
-#define S21(i,j,k) { hash(21); hash(i); hash(j); hash(k); }
-#define S22(i,j,k) { hash(22); hash(i); hash(j); hash(k); }
-#define S23(i,j,k) { hash(23); hash(i); hash(j); hash(k); }
-#define S24(i,j,k) { hash(24); hash(i); hash(j); hash(k); }
-#define S25(i,j,k) { hash(25); hash(i); hash(j); hash(k); }
-#define S26(i,j,k) { hash(26); hash(i); hash(j); hash(k); }
-
-void test()
-{
-  /* Original iterators. */
-  int i, j, k;
-  for (i=0;i<=2;i++) {
-    S1(i,0,0) ;
-    S2(i,0,0) ;
-    for (j=1;j<=4;j++) {
-      S2(i,j,0) ;
-    }
-  }
-  S1(3,0,0) ;
-  S2(3,0,0) ;
-  for (j=1;j<=4;j++) {
-    S2(3,j,0) ;
-  }
-  for (j=7;j<=11;j++) {
-    S8(3,j,0) ;
-  }
-  S1(4,0,0) ;
-  S2(4,0,0) ;
-  S3(4,0,0) ;
-  S5(4,0,0) ;
-  for (j=1;j<=4;j++) {
-    S2(4,j,0) ;
-    S5(4,j,0) ;
-  }
-  for (j=7;j<=11;j++) {
-    S8(4,j,0) ;
-  }
-  S6(5,-4,0) ;
-  S7(5,-4,0) ;
-  for (j=-3;j<=-1;j++) {
-    S7(5,j,0) ;
-  }
-  S3(5,0,0) ;
-  S7(5,0,0) ;
-  S4(5,1,-1) ;
-  S5(5,1,0) ;
-  for (j=2;j<=4;j++) {
-    S5(5,j,0) ;
-  }
-  for (j=7;j<=11;j++) {
-    S8(5,j,0) ;
-  }
-  S6(6,-4,0) ;
-  S6(6,-3,0) ;
-  S7(6,-3,0) ;
-  for (j=-2;j<=-1;j++) {
-    S7(6,j,0) ;
-  }
-  S3(6,0,0) ;
-  S7(6,0,0) ;
-  S4(6,1,-1) ;
-  S4(6,2,-1) ;
-  S5(6,2,0) ;
-  for (j=3;j<=4;j++) {
-    S5(6,j,0) ;
-  }
-  for (j=7;j<=11;j++) {
-    S8(6,j,0) ;
-  }
-  for (j=-4;j<=-3;j++) {
-    S6(7,j,0) ;
-  }
-  S6(7,-2,0) ;
-  S7(7,-2,0) ;
-  S7(7,-1,0) ;
-  S3(7,0,0) ;
-  S7(7,0,0) ;
-  for (j=1;j<=2;j++) {
-    S4(7,j,-1) ;
-  }
-  S4(7,3,-1) ;
-  S5(7,3,0) ;
-  S5(7,4,0) ;
-  S9(7,4,0) ;
-  S10(7,4,0) ;
-  S11(7,4,0) ;
-  S21(7,4,0) ;
-  S23(7,4,0) ;
-  S11(7,4,1) ;
-  S16(7,4,1) ;
-  S17(7,4,1) ;
-  for (k=2;k<=4;k++) {
-    S11(7,4,k) ;
-  }
-  S12(7,5,0) ;
-  S21(7,5,0) ;
-  S22(7,5,0) ;
-  S23(7,5,0) ;
-  S12(7,5,1) ;
-  S16(7,5,1) ;
-  S17(7,5,1) ;
-  for (k=2;k<=4;k++) {
-    S12(7,5,k) ;
-  }
-  S21(7,6,0) ;
-  S22(7,6,0) ;
-  S23(7,6,0) ;
-  for (j=7;j<=8;j++) {
-    S8(7,j,0) ;
-    S21(7,j,0) ;
-    S22(7,j,0) ;
-    S23(7,j,0) ;
-  }
-  S8(7,9,0) ;
-  S22(7,9,0) ;
-  for (j=10;j<=11;j++) {
-    S8(7,j,0) ;
-  }
-  for (j=-4;j<=-2;j++) {
-    S6(8,j,0) ;
-  }
-  S6(8,-1,0) ;
-  S7(8,-1,0) ;
-  S3(8,0,0) ;
-  S7(8,0,0) ;
-  S19(8,1,-2) ;
-  S4(8,1,-1) ;
-  S19(8,1,-1) ;
-  S19(8,1,0) ;
-  S15(8,1,4) ;
-  S18(8,1,4) ;
-  for (k=-4;k<=-3;k++) {
-    S14(8,2,k) ;
-    S20(8,2,k) ;
-  }
-  S14(8,2,-2) ;
-  S19(8,2,-2) ;
-  S20(8,2,-2) ;
-  S4(8,2,-1) ;
-  S14(8,2,-1) ;
-  S19(8,2,-1) ;
-  S20(8,2,-1) ;
-  S14(8,2,0) ;
-  S19(8,2,0) ;
-  S20(8,2,0) ;
-  S15(8,2,4) ;
-  S18(8,2,4) ;
-  for (k=-4;k<=-2;k++) {
-    S14(8,3,k) ;
-    S20(8,3,k) ;
-  }
-  S4(8,3,-1) ;
-  S14(8,3,-1) ;
-  S20(8,3,-1) ;
-  S14(8,3,0) ;
-  S20(8,3,0) ;
-  S15(8,3,4) ;
-  S18(8,3,4) ;
-  for (k=-4;k<=-2;k++) {
-    S14(8,4,k) ;
-    S20(8,4,k) ;
-  }
-  S4(8,4,-1) ;
-  S14(8,4,-1) ;
-  S20(8,4,-1) ;
-  S5(8,4,0) ;
-  S9(8,4,0) ;
-  S10(8,4,0) ;
-  S14(8,4,0) ;
-  S20(8,4,0) ;
-  S23(8,4,0) ;
-  S13(8,4,1) ;
-  S21(8,4,1) ;
-  S23(8,4,1) ;
-  S24(8,4,1) ;
-  S13(8,4,2) ;
-  S16(8,4,2) ;
-  S17(8,4,2) ;
-  S24(8,4,2) ;
-  S13(8,4,3) ;
-  S24(8,4,3) ;
-  S13(8,4,4) ;
-  S15(8,4,4) ;
-  S23(8,5,0) ;
-  S11(8,5,1) ;
-  S21(8,5,1) ;
-  S22(8,5,1) ;
-  S23(8,5,1) ;
-  S24(8,5,1) ;
-  S11(8,5,2) ;
-  S16(8,5,2) ;
-  S17(8,5,2) ;
-  S24(8,5,2) ;
-  S11(8,5,3) ;
-  S24(8,5,3) ;
-  S11(8,5,4) ;
-  S15(8,5,4) ;
-  S23(8,6,0) ;
-  S12(8,6,1) ;
-  S21(8,6,1) ;
-  S22(8,6,1) ;
-  S23(8,6,1) ;
-  S24(8,6,1) ;
-  S12(8,6,2) ;
-  S16(8,6,2) ;
-  S17(8,6,2) ;
-  S24(8,6,2) ;
-  S12(8,6,3) ;
-  S24(8,6,3) ;
-  S12(8,6,4) ;
-  for (j=7;j<=8;j++) {
-    S23(8,j,0) ;
-    S21(8,j,1) ;
-    S22(8,j,1) ;
-    S23(8,j,1) ;
-    S24(8,j,1) ;
-    for (k=2;k<=3;k++) {
-      S24(8,j,k) ;
-    }
-  }
-  S22(8,9,1) ;
-  S7(9,0,0) ;
-  for (j=1;j<=2;j++) {
-    for (k=-1;k<=0;k++) {
-      S19(9,j,k) ;
-    }
-    for (k=4;k<=5;k++) {
-      S15(9,j,k) ;
-      S18(9,j,k) ;
-    }
-  }
-  S20(9,3,-4) ;
-  for (k=-3;k<=-2;k++) {
-    S14(9,3,k) ;
-    S20(9,3,k) ;
-  }
-  for (k=-1;k<=0;k++) {
-    S14(9,3,k) ;
-    S19(9,3,k) ;
-    S20(9,3,k) ;
-  }
-  for (k=4;k<=5;k++) {
-    S15(9,3,k) ;
-    S18(9,3,k) ;
-  }
-  S20(9,4,-4) ;
-  for (k=-3;k<=-1;k++) {
-    S14(9,4,k) ;
-    S20(9,4,k) ;
-  }
-  S9(9,4,0) ;
-  S10(9,4,0) ;
-  S14(9,4,0) ;
-  S20(9,4,0) ;
-  S23(9,4,0) ;
-  S23(9,4,1) ;
-  S13(9,4,2) ;
-  S21(9,4,2) ;
-  S23(9,4,2) ;
-  S24(9,4,2) ;
-  S13(9,4,3) ;
-  S16(9,4,3) ;
-  S17(9,4,3) ;
-  S24(9,4,3) ;
-  S13(9,4,4) ;
-  S15(9,4,4) ;
-  S18(9,4,4) ;
-  S15(9,4,5) ;
-  S18(9,4,5) ;
-  for (k=0;k<=1;k++) {
-    S23(9,5,k) ;
-  }
-  S13(9,5,2) ;
-  S21(9,5,2) ;
-  S22(9,5,2) ;
-  S23(9,5,2) ;
-  S24(9,5,2) ;
-  S13(9,5,3) ;
-  S16(9,5,3) ;
-  S17(9,5,3) ;
-  S24(9,5,3) ;
-  S13(9,5,4) ;
-  S15(9,5,4) ;
-  S15(9,5,5) ;
-  for (k=0;k<=1;k++) {
-    S23(9,6,k) ;
-  }
-  S11(9,6,2) ;
-  S21(9,6,2) ;
-  S22(9,6,2) ;
-  S23(9,6,2) ;
-  S24(9,6,2) ;
-  S11(9,6,3) ;
-  S16(9,6,3) ;
-  S17(9,6,3) ;
-  S24(9,6,3) ;
-  S11(9,6,4) ;
-  for (k=0;k<=1;k++) {
-    S23(9,7,k) ;
-  }
-  S12(9,7,2) ;
-  S21(9,7,2) ;
-  S22(9,7,2) ;
-  S23(9,7,2) ;
-  S24(9,7,2) ;
-  S12(9,7,3) ;
-  S16(9,7,3) ;
-  S17(9,7,3) ;
-  S24(9,7,3) ;
-  S12(9,7,4) ;
-  for (k=0;k<=1;k++) {
-    S23(9,8,k) ;
-  }
-  S21(9,8,2) ;
-  S22(9,8,2) ;
-  S23(9,8,2) ;
-  S24(9,8,2) ;
-  S24(9,8,3) ;
-  S22(9,9,2) ;
-  for (j=1;j<=3;j++) {
-    S19(10,j,0) ;
-    S26(10,j,3) ;
-    S15(10,j,4) ;
-    S18(10,j,4) ;
-    S25(10,j,4) ;
-    for (k=5;k<=6;k++) {
-      S15(10,j,k) ;
-      S18(10,j,k) ;
-    }
-  }
-  for (k=-4;k<=-3;k++) {
-    S20(10,4,k) ;
-  }
-  for (k=-2;k<=-1;k++) {
-    S14(10,4,k) ;
-    S20(10,4,k) ;
-  }
-  S9(10,4,0) ;
-  S10(10,4,0) ;
-  S14(10,4,0) ;
-  S19(10,4,0) ;
-  S20(10,4,0) ;
-  S13(10,4,3) ;
-  S21(10,4,3) ;
-  S24(10,4,3) ;
-  S26(10,4,3) ;
-  S13(10,4,4) ;
-  S15(10,4,4) ;
-  S16(10,4,4) ;
-  S17(10,4,4) ;
-  S18(10,4,4) ;
-  S25(10,4,4) ;
-  for (k=5;k<=6;k++) {
-    S15(10,4,k) ;
-    S18(10,4,k) ;
-  }
-  S13(10,5,3) ;
-  S21(10,5,3) ;
-  S22(10,5,3) ;
-  S24(10,5,3) ;
-  S26(10,5,3) ;
-  S13(10,5,4) ;
-  S15(10,5,4) ;
-  S16(10,5,4) ;
-  S17(10,5,4) ;
-  S18(10,5,4) ;
-  S25(10,5,4) ;
-  for (k=5;k<=6;k++) {
-    S15(10,5,k) ;
-    S18(10,5,k) ;
-  }
-  S13(10,6,3) ;
-  S21(10,6,3) ;
-  S22(10,6,3) ;
-  S24(10,6,3) ;
-  S13(10,6,4) ;
-  S16(10,6,4) ;
-  S17(10,6,4) ;
-  S11(10,7,3) ;
-  S21(10,7,3) ;
-  S22(10,7,3) ;
-  S24(10,7,3) ;
-  S11(10,7,4) ;
-  S16(10,7,4) ;
-  S17(10,7,4) ;
-  S12(10,8,3) ;
-  S21(10,8,3) ;
-  S22(10,8,3) ;
-  S24(10,8,3) ;
-  S12(10,8,4) ;
-  S16(10,8,4) ;
-  S17(10,8,4) ;
-  S22(10,9,3) ;
-  for (i=11;i<=14;i++) {
-    for (j=1;j<=5;j++) {
-      S26(i,j,3) ;
-      S25(i,j,4) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/non_optimal/youcef.c b/cloog-0.17.0/test/non_optimal/youcef.c
deleted file mode 100644
index 386cea2..0000000
--- a/cloog-0.17.0/test/non_optimal/youcef.c
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Generated from ../../../git/cloog/test/non_optimal/youcef.cloog by CLooG 0.14.0-238-gb1cb779 gmp bits in 0.00s. */
-for (i=0;i<=5;i++) {
-  S1(i,i);
-  for (j=i;j<=5;j++) {
-    S2(i,j);
-  }
-  S3(i,5);
-}
diff --git a/cloog-0.17.0/test/non_optimal/youcef.cloog b/cloog-0.17.0/test/non_optimal/youcef.cloog
deleted file mode 100644
index 297bf79..0000000
--- a/cloog-0.17.0/test/non_optimal/youcef.cloog
+++ /dev/null
@@ -1,46 +0,0 @@
-# Optimal code is in fact :
-# 
-# for (i=0;i<=M;i++) {
-#   S1 ;
-#   for (j=0;j<=N;j++) {
-#     S2 ;
-#   }
-#   S3 ;
-# }
-
-# language: C
-c
-
-# parameters {M, N | M>=1 N >=1}
-0 2
-0
-
-3 # Number of statements
-
-1
-# {i | 0<=i<=5 i==j}
-3 4
-1  1  0  0
-1 -1  0  5
-0  1 -1  0
-0  0  0
-
-1
-# {i | 0<=i<=5 i<=j<=5}
-4 4
-1  1  0  0
-1 -1  0  5
-1 -1  1  0
-1  0 -1  5
-0  0  0
-
-1
-# {i | 0<=i<=5 j==5}
-3 4
-1  1  0  0
-1 -1  0  5
-0  0  1 -5
-0  0  0
-0
- 
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/non_optimal/youcef.good.c b/cloog-0.17.0/test/non_optimal/youcef.good.c
deleted file mode 100644
index 9fe1d31..0000000
--- a/cloog-0.17.0/test/non_optimal/youcef.good.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Generated from ../../../git/cloog/test/./non_optimal/youcef.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-
-void test()
-{
-  /* Original iterators. */
-  int i, j;
-  for (i=0;i<=3;i++) {
-    S1(i,i) ;
-    S2(i,i) ;
-    for (j=i+1;j<=4;j++) {
-      S2(i,j) ;
-    }
-    S2(i,5) ;
-    S3(i,5) ;
-  }
-  S1(4,4) ;
-  S2(4,4) ;
-  S2(4,5) ;
-  S3(4,5) ;
-  S1(5,5) ;
-  S2(5,5) ;
-  S3(5,5) ;
-}
diff --git a/cloog-0.17.0/test/nul_basic1.c b/cloog-0.17.0/test/nul_basic1.c
deleted file mode 100644
index d6b0cf0..0000000
--- a/cloog-0.17.0/test/nul_basic1.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/nul_basic1.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-if (M >= 0) {
-  for (i=0;i<=M;i+=2) {
-    S1(i,i/2) ;
-  }
-}
diff --git a/cloog-0.17.0/test/nul_basic1.cloog b/cloog-0.17.0/test/nul_basic1.cloog
deleted file mode 100644
index 878bd89..0000000
--- a/cloog-0.17.0/test/nul_basic1.cloog
+++ /dev/null
@@ -1,28 +0,0 @@
-# Optimal code is in fact :
-#
-# for (i=0;i<=M;i+=2) {
-#   S1 ;
-# }
- 
-# language: C
-c
-
-# parameter n
-1 3
-#  n  1
-1  0  1
-0
-
-1 # Number of statements
-
-1
-# {i, j | i=2*j; 0<=i<=n}
-3 5
-#  i  j  n  1
-0  1 -2  0  0
-1  1  0  0  0
-1 -1  0  1  0
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/nul_basic2.c b/cloog-0.17.0/test/nul_basic2.c
deleted file mode 100644
index 6231f0e..0000000
--- a/cloog-0.17.0/test/nul_basic2.c
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Generated from ../../../git/cloog/test/nul_basic2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (i=2;i<=n;i+=2) {
-  if (i%4 == 0) {
-    S2(i,i/4) ;
-  }
-  S1(i,i/2) ;
-}
diff --git a/cloog-0.17.0/test/nul_basic2.cloog b/cloog-0.17.0/test/nul_basic2.cloog
deleted file mode 100644
index bf3c78c..0000000
--- a/cloog-0.17.0/test/nul_basic2.cloog
+++ /dev/null
@@ -1,54 +0,0 @@
-# Optimal code is in fact :
-#
-# for (i=0;i<=M;i+=2) {
-#   S1 ;
-# }
- 
-# language: C
-c
-
-# parameter n
-1 3
-#  n  1
-1  1 -2
-1
-n
-
-2 # Number of statements
-
-1
-# {i, j | i=2*j; 1<=i<=n}
-3 5
-#  i  j  n  1
-0  1 -2  0  0
-1  1  0  0 -1
-1 -1  0  1  0
-0  0  0
-
-1
-# {i, j | i=4*j; 1<=i<=n}
-3 5
-#  i  j  n  1
-0  1 -4  0  0
-1  1  0  0 -1
-1 -1  0  1  0
-0  0  0
-0
-
-0 # Scattering functions
-5 10
-# t1 t2 t3 t4 t5  i  j  n  1
-0  1  0  0  0  0  0  0  0  0
-0  0  1  0  0  0 -1  0  0  0
-0  0  0  1  0  0  0  0  0  0
-0  0  0  0  1  0  0 -1  0  0
-0  0  0  0  0  1  0  0  0  0
-
-5 10
-# t1 t2 t3 t4 t5  i  j  n  1
-0  1  0  0  0  0  0  0  0  0
-0  0  1  0  0  0 -1  0  0  0
-0  0  0  1  0  0  0  0  0  0
-0  0  0  0  1  0  0 -1  0  0
-0  0  0  0  0  1  0  0  0  0
-0
diff --git a/cloog-0.17.0/test/nul_lcpc.c b/cloog-0.17.0/test/nul_lcpc.c
deleted file mode 100644
index b9592f5..0000000
--- a/cloog-0.17.0/test/nul_lcpc.c
+++ /dev/null
@@ -1,15 +0,0 @@
-/* Generated from ../../../git/cloog/test/nul_lcpc.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.03s. */
-for (i=1;i<=6;i+=2) {
-  for (j=1;j<=i;j++) {
-    S1(i,(i-1)/2,j) ;
-    S2(i,(i-1)/2,j) ;
-  }
-  for (j=i+1;j<=p;j++) {
-    S1(i,(i-1)/2,j) ;
-  }
-}
-for (i=7;i<=m;i+=2) {
-  for (j=1;j<=p;j++) {
-    S1(i,(i-1)/2,j) ;
-  }
-}
diff --git a/cloog-0.17.0/test/nul_lcpc.cloog b/cloog-0.17.0/test/nul_lcpc.cloog
deleted file mode 100644
index 263e1ea..0000000
--- a/cloog-0.17.0/test/nul_lcpc.cloog
+++ /dev/null
@@ -1,39 +0,0 @@
-# language: C
-c
-
-# parameter n
-3 5
-#  m  n  p  1
-1  1 -1  0 -1
-1  0 -1  1 -1
-0  0  1  0 -6
-1
-m n p
-
-2 # Number of statements
-
-1
-# {i, j, k | i=2*k+1; 1<=i<=m;  1<=j<=p}
-5 8
-#  i  k  j  m  n  p  1
-0  1 -2  0  0  0  0 -1 # i=2*k+1
-1  1  0  0  0  0  0 -1 # 1<=i
-1 -1  0  0  1  0  0  0 # i<=m
-1  0  0  1  0  0  0 -1 # 1<=j
-1  0  0 -1  0  0  1  0 # j<=p
-0  0  0
-
-1
-# {i, j, k | i=2*k+1; 1<=i<=n;  1<=j<=i}
-5 8
-#  i  k  j  m  n  p  1
-0  1 -2  0  0  0  0 -1 # i=2*k+1
-1  1  0  0  0  0  0 -1 # 1<=i
-1 -1  0  0  0  1  0  0 # i<=n
-1  0  0  1  0  0  0 -1 # 1<=j
-1  1  0 -1  0  0  0  0 # j<=i
-0  0  0
-1
-i k j
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/openscop/empty.c b/cloog-0.17.0/test/openscop/empty.c
deleted file mode 100644
index 8892d5f..0000000
--- a/cloog-0.17.0/test/openscop/empty.c
+++ /dev/null
@@ -1 +0,0 @@
-/* Generated from ./test/openscop/empty.scop by CLooG 0.14.0-416-g013422c gmp bits in 0.01s. */
diff --git a/cloog-0.17.0/test/openscop/empty.scop b/cloog-0.17.0/test/openscop/empty.scop
deleted file mode 100644
index a7aba60..0000000
--- a/cloog-0.17.0/test/openscop/empty.scop
+++ /dev/null
@@ -1,35 +0,0 @@
-<OpenScop>
-
-# =============================================== Global
-# Language
-C
-
-# Context
-CONTEXT
-0 2 0 0 0 0
-
-# Parameter names are not provided
-0
-
-# One statement
-1
-
-# =============================================== Statement 1
-# Number of relations describing the statement
-0
-
-# ----------------------------------------------  1.1 Domain
-# NULL Domain
-
-# ----------------------------------------------  1.2 Scattering
-# NULL Scattering
-
-# ----------------------------------------------  1.3 Access
-# NULL Access
-
-# ----------------------------------------------  1.4 Body
-# Statement body is not provided
-0
-
-</OpenScop>
-
diff --git a/cloog-0.17.0/test/openscop/matmult.c b/cloog-0.17.0/test/openscop/matmult.c
deleted file mode 100644
index 33f5b04..0000000
--- a/cloog-0.17.0/test/openscop/matmult.c
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Generated from ./test/openscop/matmult.scop by CLooG 0.14.0-432-g5cf921d gmp bits in 0.01s. */
-for (c2=0;c2<=N-1;c2++) {
-  for (c4=0;c4<=N-1;c4++) {
-    C[c2][c4] = 0.0;
-    for (c6=0;c6<=N-1;c6++) {
-      C[c2][c4] = C[c2][c4] + A[c2][c6] * B[c6][c4];
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/openscop/matmult.scop b/cloog-0.17.0/test/openscop/matmult.scop
deleted file mode 100644
index 4a248a6..0000000
--- a/cloog-0.17.0/test/openscop/matmult.scop
+++ /dev/null
@@ -1,140 +0,0 @@
-# [File generated by the OpenScop Library 0.8.0]
-
-<OpenScop>
-
-# =============================================== Global
-# Language
-C
-
-# Context
-CONTEXT
-1 3 0 0 0 1
-# e/i|  N |  1  
-   1    1   -1    ## N-1 >= 0
-
-# Parameters are provided
-1
-<strings>
-N
-</strings>
-
-# Number of statements
-2
-
-# =============================================== Statement 1
-# Number of relations describing the statement:
-3
-
-# ----------------------------------------------  1.1 Domain
-DOMAIN
-4 5 2 0 0 1
-# e/i|  i    j |  N |  1  
-   1    1    0    0    0    ## i >= 0
-   1   -1    0    1   -1    ## -i+N-1 >= 0
-   1    0    1    0    0    ## j >= 0
-   1    0   -1    1   -1    ## -j+N-1 >= 0
-
-# ----------------------------------------------  1.2 Scattering
-SCATTERING
-5 10 5 2 0 1
-# e/i| c1   c2   c3   c4   c5 |  i    j |  N |  1  
-   0   -1    0    0    0    0    0    0    0    0    ## c1 == 0
-   0    0   -1    0    0    0    1    0    0    0    ## c2 == i
-   0    0    0   -1    0    0    0    0    0    0    ## c3 == 0
-   0    0    0    0   -1    0    0    1    0    0    ## c4 == j
-   0    0    0    0    0   -1    0    0    0    0    ## c5 == 0
-
-# ----------------------------------------------  1.3 Access
-WRITE
-3 8 3 2 0 1
-# e/i| A1   [1]  [2]|  i    j |  N |  1  
-   0   -1    0    0    0    0    0    1    ## A1
-   0    0   -1    0    1    0    0    0    ## [1] == i
-   0    0    0   -1    0    1    0    0    ## [2] == j
-
-# ----------------------------------------------  1.4 Body
-# Statement body is provided
-1
-<body>
-# Number of original iterators
-2
-# Original iterators
-i j
-# Body expression
-C[i][j] = 0.0;
-</body>
-
-
-# =============================================== Statement 2
-# Number of relations describing the statement:
-6
-
-# ----------------------------------------------  2.1 Domain
-DOMAIN
-6 6 3 0 0 1
-# e/i|  i    j    k |  N |  1  
-   1    1    0    0    0    0    ## i >= 0
-   1   -1    0    0    1   -1    ## -i+N-1 >= 0
-   1    0    1    0    0    0    ## j >= 0
-   1    0   -1    0    1   -1    ## -j+N-1 >= 0
-   1    0    0    1    0    0    ## k >= 0
-   1    0    0   -1    1   -1    ## -k+N-1 >= 0
-
-# ----------------------------------------------  2.2 Scattering
-SCATTERING
-7 13 7 3 0 1
-# e/i| c1   c2   c3   c4   c5   c6   c7 |  i    j    k |  N |  1  
-   0   -1    0    0    0    0    0    0    0    0    0    0    0    ## c1 == 0
-   0    0   -1    0    0    0    0    0    1    0    0    0    0    ## c2 == i
-   0    0    0   -1    0    0    0    0    0    0    0    0    0    ## c3 == 0
-   0    0    0    0   -1    0    0    0    0    1    0    0    0    ## c4 == j
-   0    0    0    0    0   -1    0    0    0    0    0    0    1    ## c5 == 1
-   0    0    0    0    0    0   -1    0    0    0    1    0    0    ## c6 == k
-   0    0    0    0    0    0    0   -1    0    0    0    0    0    ## c7 == 0
-
-# ----------------------------------------------  2.3 Access
-WRITE
-3 9 3 3 0 1
-# e/i| A1   [1]  [2]|  i    j    k |  N |  1  
-   0   -1    0    0    0    0    0    0    1    ## A1
-   0    0   -1    0    1    0    0    0    0    ## [1] == i
-   0    0    0   -1    0    1    0    0    0    ## [2] == j
-
-READ
-3 9 3 3 0 1
-# e/i| A1   [1]  [2]|  i    j    k |  N |  1  
-   0   -1    0    0    0    0    0    0    1    ## A1
-   0    0   -1    0    1    0    0    0    0    ## [1] == i
-   0    0    0   -1    0    1    0    0    0    ## [2] == j
-
-READ
-3 9 3 3 0 1
-# e/i| A2   [1]  [2]|  i    j    k |  N |  1  
-   0   -1    0    0    0    0    0    0    2    ## A2
-   0    0   -1    0    1    0    0    0    0    ## [1] == i
-   0    0    0   -1    0    0    1    0    0    ## [2] == k
-
-READ
-3 9 3 3 0 1
-# e/i| A3   [1]  [2]|  i    j    k |  N |  1  
-   0   -1    0    0    0    0    0    0    3    ## A3
-   0    0   -1    0    0    0    1    0    0    ## [1] == k
-   0    0    0   -1    0    1    0    0    0    ## [2] == j
-
-# ----------------------------------------------  2.4 Body
-# Statement body is provided
-1
-<body>
-# Number of original iterators
-3
-# Original iterators
-i j k
-# Body expression
-C[i][j] = C[i][j] + A[i][k] * B[k][j];
-</body>
-
-
-# =============================================== Extensions
-
-</OpenScop>
-
diff --git a/cloog-0.17.0/test/openscop/union.c b/cloog-0.17.0/test/openscop/union.c
deleted file mode 100644
index 09c2233..0000000
--- a/cloog-0.17.0/test/openscop/union.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Generated from ./test/openscop/union.scop by CLooG 0.14.0-432-g5cf921d gmp bits in 0.01s. */
-if (N >= 1) {
-  for (c2=0;c2<=N-1;c2++) {
-    for (c4=0;c4<=min(10,N-1);c4++) {
-      C[c2+c4]+=A[c2]*B[c4];
-    }
-    for (c4=20;c4<=N-1;c4++) {
-      C[c2+c4]+=A[c2]*B[c4];
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/openscop/union.scop b/cloog-0.17.0/test/openscop/union.scop
deleted file mode 100644
index 35efe4f..0000000
--- a/cloog-0.17.0/test/openscop/union.scop
+++ /dev/null
@@ -1,106 +0,0 @@
-# [File generated by the OpenScop Library 0.8.0]
-
-<OpenScop>
-
-# =============================================== Global
-# Language
-C
-
-# Context
-CONTEXT
-1 3 0 0 0 1
-# e/i|  N |  1  
-   1    1    3    ## N+3 >= 0
-
-# Parameters are provided
-1
-<strings>
-N
-</strings>
-
-# Number of statements
-1
-
-# =============================================== Statement 1
-# Number of relations describing the statement:
-6
-
-# ----------------------------------------------  1.1 Domain
-DOMAIN
-# Union with 2 parts
-2
-# Union part No.1
-5 5 2 0 0 1
-# e/i|  i    j |  N |  1  
-   1    1    0    0    0    ## i >= 0
-   1   -1    0    1   -1    ## -i+N-1 >= 0
-   1    0    1    0    0    ## j >= 0
-   1    0   -1    1   -1    ## -j+N-1 >= 0
-   1    0    1    0  -20    ## j-20 >= 0
-# Union part No.2
-5 5 2 0 0 1
-# e/i|  i    j |  N |  1  
-   1    1    0    0    0    ## i >= 0
-   1   -1    0    1   -1    ## -i+N-1 >= 0
-   1    0    1    0    0    ## j >= 0
-   1    0   -1    1   -1    ## -j+N-1 >= 0
-   1    0   -1    0   10    ## -j+10 >= 0
-
-# ----------------------------------------------  1.2 Scattering
-SCATTERING
-5 10 5 2 0 1
-# e/i| c1   c2   c3   c4   c5 |  i    j |  N |  1  
-   0   -1    0    0    0    0    0    0    0    0    ## c1 == 0
-   0    0   -1    0    0    0    1    0    0    0    ## c2 == i
-   0    0    0   -1    0    0    0    0    0    0    ## c3 == 0
-   0    0    0    0   -1    0    0    1    0    0    ## c4 == j
-   0    0    0    0    0   -1    0    0    0    0    ## c5 == 0
-
-# ----------------------------------------------  1.3 Access
-READ
-2 7 2 2 0 1
-# e/i| A1   [1]|  i    j |  N |  1  
-   0   -1    0    0    0    0    1    ## A1
-   0    0   -1    1    1    0    0    ## [1] == i+j
-
-READ
-2 7 2 2 0 1
-# e/i| A2   [1]|  i    j |  N |  1  
-   0   -1    0    0    0    0    2    ## A2
-   0    0   -1    1    0    0    0    ## [1] == i
-
-READ
-2 7 2 2 0 1
-# e/i| A3   [1]|  i    j |  N |  1  
-   0   -1    0    0    0    0    3    ## A3
-   0    0   -1    0    1    0    0    ## [1] == j
-
-WRITE
-2 7 2 2 0 1
-# e/i| A1   [1]|  i    j |  N |  1  
-   0   -1    0    0    0    0    1    ## A1
-   0    0   -1    1    1    0    0    ## [1] == i+j
-
-# ----------------------------------------------  1.4 Body
-# Statement body is provided
-1
-<body>
-# Number of original iterators
-2
-# Original iterators
-i j
-# Body expression
-C[i+j]+=A[i]*B[j];
-</body>
-
-
-# =============================================== Extensions
-<comment>
-hello, world
-
-HELLO WORLD I SAID
-</comment>
-
-</OpenScop>
-
-
diff --git a/cloog-0.17.0/test/orc.c b/cloog-0.17.0/test/orc.c
deleted file mode 100644
index 7ed1547..0000000
--- a/cloog-0.17.0/test/orc.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Generated from ../../../git/cloog/test/orc.cloog by CLooG 0.16.2-5-g590827b gmp bits in 0.03s. */
-S1(0);
-S2(0,0);
-for (p2=1;p2<=22;p2++) {
-  if ((p2+1)%2 == 0) {
-    S3(0,(p2-1)/2);
-  }
-  if (p2%2 == 0) {
-    S2(0,p2/2);
-  }
-}
-S3(0,11);
-for (p1=2;p1<=6;p1++) {
-  if ((p1+1)%3 == 0) {
-    S4((p1-2)/3);
-  }
-  if (p1%3 == 0) {
-    S1(p1/3);
-  }
-  if (p1 == 4) {
-    S2(1,0);
-  }
-  if (p1 == 4) {
-    for (p2=1;p2<=20;p2++) {
-      if ((p2+1)%2 == 0) {
-        S3(1,(p2-1)/2);
-      }
-      if (p2%2 == 0) {
-        S2(1,p2/2);
-      }
-    }
-  }
-  if (p1 == 4) {
-    S3(1,10);
-  }
-}
-S2(2,0);
-for (p2=1;p2<=18;p2++) {
-  if ((p2+1)%2 == 0) {
-    S3(2,(p2-1)/2);
-  }
-  if (p2%2 == 0) {
-    S2(2,p2/2);
-  }
-}
-S3(2,9);
-S4(2);
-S5(0);
-for (p2=0;p2<=9;p2++) {
-  S6(0,p2);
-}
-for (p1=2;p1<=42;p1++) {
-  if ((p1+1)%3 == 0) {
-    S7((p1-2)/3);
-  }
-  if (p1%3 == 0) {
-    S5(p1/3);
-  }
-  for (p2=0;p2<=9;p2++) {
-    if ((p1+2)%3 == 0) {
-      S6((p1-1)/3,p2);
-    }
-  }
-}
-for (p2=0;p2<=9;p2++) {
-  S6(14,p2);
-}
-S7(14);
diff --git a/cloog-0.17.0/test/orc.cloog b/cloog-0.17.0/test/orc.cloog
deleted file mode 100644
index 18c7cf2..0000000
--- a/cloog-0.17.0/test/orc.cloog
+++ /dev/null
@@ -1,133 +0,0 @@
-
-
-#-------------------CONTEXT------------------------
-   c # language is c
-   # Context (no constarints on parameters)
-   1 2		# 1 lines and 2 coloumns
-   #   1
-   1   0
-
-   1 # We want to set manually the parameter names
-
-#---------------------STATEMENTS--------------------
-   7 #Number of Statements
-
-   1 #STMT 1 at line no. 12 has 1 domain
-
-   # Domain 1
-   2 3
-   #   i   1
-   1   1   0
-   1  -1   2
-0 0 0
-   1 #STMT 2 at line no. 15 has 1 domain
-
-   # Domain 1
-   4 4
-   #   i   j   1
-   1   1   0   0
-   1  -1   0   2
-   1   0   1   0
-   1  -1  -1  11
-0  0 0
-   1 #STMT 3 at line no. 16 has 1 domain
-
-   # Domain 1
-   4 4
-   #   i   j   1
-   1   1   0   0
-   1  -1   0   2
-   1   0   1   0
-   1  -1  -1  11
-0 0 0
-   1 #STMT 4 at line no. 20 has 1 domain
-
-   # Domain 1
-   2 3
-   #   i   1
-   1   1   0
-   1  -1   2
-0 0 0
-   1 #STMT 1 at line no. 32 has 1 domain
-
-   # Domain 1
-   2 3
-   #   l   1
-   1   1   0
-   1  -1  14
-0 0 0
-   1 #STMT 2 at line no. 37 has 1 domain
-
-   # Domain 1
-   4 4
-   #   l   m   1
-   1   1   0   0
-   1  -1   0  14
-   1   0   1   0
-   1   0  -1   9
-0 0 0
-   1 #STMT 3 at line no. 41 has 1 domain
-
-   # Domain 1
-   2 3
-   #   l   1
-   1   1   0
-   1  -1  14
-0 0 0
-   1 # Set Iterator Names
-   i   j	#Iterator Names
-
-#---------------------SCATTERING FUNCTIONS--------------------
-   7 #Scattering functions
-
-# Scattering Matrix for stmt at line no.12
-   3 6
-   #  p0  p1  p2   i   1
-   0   1   0   0   0   0
-   0   0   1   0  -3   0
-   0   0   0   1   0   0
-
-# Scattering Matrix for stmt at line no.15
-   3 7
-   #  p0  p1  p2   i   j   1
-   0   1   0   0   0   0   0
-   0   0   1   0  -3   0  -1
-   0   0   0   1   0  -2   0
-
-# Scattering Matrix for stmt at line no.16
-   3 7
-   #  p0  p1  p2   i   j   1
-   0   1   0   0   0   0   0
-   0   0   1   0  -3   0  -1
-   0   0   0   1   0  -2  -1
-
-# Scattering Matrix for stmt at line no.20
-   3 6
-   #  p0  p1  p2   i   1
-   0   1   0   0   0   0
-   0   0   1   0  -3  -2
-   0   0   0   1   0   0
-
-# Scattering Matrix for stmt at line no.32
-   3 6
-   #  p0  p1  p2   l   1
-   0   1   0   0   0  -2
-   0   0   1   0  -3   0
-   0   0   0   1   0   0
-
-# Scattering Matrix for stmt at line no.37
-   3 7
-   #  p0  p1  p2   l   m   1
-   0   1   0   0   0   0  -2
-   0   0   1   0  -3   0  -1
-   0   0   0   1   0  -1   0
-
-# Scattering Matrix for stmt at line no.41
-   3 6
-   #  p0  p1  p2   l   1
-   0   1   0   0   0  -2
-   0   0   1   0  -3  -2
-   0   0   0   1   0   0
-
-   1 # Set manually the scattering dimension names
-  p0  p1  p2	#Scattering dimension names
diff --git a/cloog-0.17.0/test/orc.good.c b/cloog-0.17.0/test/orc.good.c
deleted file mode 100644
index 2b2b7e7..0000000
--- a/cloog-0.17.0/test/orc.good.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/* Generated from ../../../git/cloog/test/orc.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.06s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-#define S4(i) { hash(4); hash(i); }
-#define S5(i) { hash(5); hash(i); }
-#define S6(i,j) { hash(6); hash(i); hash(j); }
-#define S7(i) { hash(7); hash(i); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int p1, p2;
-  /* Original iterators. */
-  int i, j;
-  S1(0) ;
-  S2(0,0) ;
-  for (p2=1;p2<=22;p2++) {
-    if ((p2+1)%2 == 0) {
-      j = (p2-1)/2 ;
-      S3(0,(p2-1)/2) ;
-    }
-    if (p2%2 == 0) {
-      S2(0,p2/2) ;
-    }
-  }
-  S3(0,11) ;
-  for (p1=2;p1<=6;p1++) {
-    if ((p1+1)%3 == 0) {
-      i = (p1-2)/3 ;
-      S4((p1-2)/3) ;
-    }
-    if ((p1+2)%3 == 0) {
-      i = (p1-1)/3 ;
-      S2((p1-1)/3,0) ;
-    }
-    if (p1%3 == 0) {
-      S1(p1/3) ;
-    }
-    for (p2=1;p2<=floord(-2*p1+68,3);p2++) {
-      if ((p1+2)%3 == 0) {
-        i = (p1-1)/3 ;
-        if ((p2+1)%2 == 0) {
-          j = (p2-1)/2 ;
-          S3((p1-1)/3,(p2-1)/2) ;
-        }
-        if (p2%2 == 0) {
-          S2((p1-1)/3,p2/2) ;
-        }
-      }
-    }
-    p2 = floord(-2*p1+71,3) ;
-    if ((p1+2)%3 == 0) {
-      i = (p1-1)/3 ;
-      if ((p2+1)%2 == 0) {
-        j = (p2-1)/2 ;
-        S3((p1-1)/3,(p2-1)/2) ;
-      }
-    }
-  }
-  S2(2,0) ;
-  for (p2=1;p2<=18;p2++) {
-    if ((p2+1)%2 == 0) {
-      j = (p2-1)/2 ;
-      S3(2,(p2-1)/2) ;
-    }
-    if (p2%2 == 0) {
-      S2(2,p2/2) ;
-    }
-  }
-  S3(2,9) ;
-  S4(2) ;
-  S5(0) ;
-  S6(0,0) ;
-  for (p2=1;p2<=9;p2++) {
-    S6(0,p2) ;
-  }
-  for (p1=2;p1<=42;p1++) {
-    if ((p1+1)%3 == 0) {
-      i = (p1-2)/3 ;
-      S7((p1-2)/3) ;
-    }
-    if ((p1+2)%3 == 0) {
-      i = (p1-1)/3 ;
-      S6((p1-1)/3,0) ;
-    }
-    if (p1%3 == 0) {
-      S5(p1/3) ;
-    }
-    for (p2=1;p2<=9;p2++) {
-      if ((p1+2)%3 == 0) {
-        i = (p1-1)/3 ;
-        S6((p1-1)/3,p2) ;
-      }
-    }
-  }
-  S6(14,0) ;
-  for (p2=1;p2<=9;p2++) {
-    S6(14,p2) ;
-  }
-  S7(14) ;
-}
diff --git a/cloog-0.17.0/test/otl.c b/cloog-0.17.0/test/otl.c
deleted file mode 100644
index 93bd830..0000000
--- a/cloog-0.17.0/test/otl.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Generated from ../../../git/cloog/test/otl.cloog by CLooG 0.14.0-278-gcf1f323 gmp bits in 0.26s. */
-if ((M >= 3) && (N >= 4)) {
-  for (outerTimeTileScatter=1;outerTimeTileScatter<=floord(2*M+2*N-7,5);outerTimeTileScatter++) {
-    for (outerProcTileScatter1=max(ceild(outerTimeTileScatter,2),ceild(5*outerTimeTileScatter-M-2,5));outerProcTileScatter1<=min(min(floord(M+2*N-5,5),floord(5*outerTimeTileScatter+2*N+1,10)),outerTimeTileScatter);outerProcTileScatter1++) {
-      for (outerProcTileScatter2=max(max(max(max(ceild(outerTimeTileScatter-outerProcTileScatter1-1,2),ceild(5*outerProcTileScatter1-N-1,5)),ceild(5*outerTimeTileScatter-M-N+1,5)),ceild(5*outerTimeTileScatter-N-2,10)),outerTimeTileScatter-outerProcTileScatter1-1);outerProcTileScatter2<=min(min(min(floord(M+N-2,5),floord(5*outerTimeTileScatter-5*outerProcTileScatter1+N+4,5)),floord(5*outerTimeTileScatter+N+3,10)),outerProcTileScatter1);outerProcTileScatter2++) {
-        for (innerTimeTileScatter=max(max(max(ceild(10*outerProcTileScatter1-2*N,5),ceild(10*outerProcTileScatter2-N-2,5)),ceild(5*outerProcTileScatter1+5*outerProcTileScatter2-N-3,5)),outerTimeTileScatter);innerTimeTileScatter<=min(min(min(min(min(floord(2*M+2*N-6,5),floord(5*outerProcTileScatter1+M+3,5)),floord(5*outerProcTileScatter2+M+N,5)),floord(10*outerProcTileScatter2+N+3,5)),outerTimeTileScatter+1),outerProcTileScatter1+outerProcTileScatter2+1);innerTimeTileScatter++) {
-          for (innerProcTileScatter1=max(max(max(max(ceild(innerTimeTileScatter,2),ceild(5*innerTimeTileScatter-M-2,5)),ceild(5*outerTimeTileScatter-M-1,5)),outerProcTileScatter1),outerTimeTileScatter-outerProcTileScatter2);innerProcTileScatter1<=min(min(min(min(min(min(min(floord(M+2*N-4,5),floord(5*outerProcTileScatter2+N+2,5)),floord(-5*outerProcTileScatter2+5*innerTimeTileScatter+N+4,5)),floord(5*outerTimeTileScatter-5*outerProcTileScatter2+N+5,5)),floord(5*innerTimeTileScatter+2*N+2,10)),floord(5*outerTimeTileScatter+2*N+3,10)),outerTimeTileScatter),outerProcTileScatter1+1);innerProcTileScatter1++) {
-            for (innerProcTileScatter2=outerProcTileScatter2;innerProcTileScatter2<=outerProcTileScatter2;innerProcTileScatter2++) {
-              for (outerTimeTileIter=outerTimeTileScatter;outerTimeTileIter<=outerTimeTileScatter;outerTimeTileIter++) {
-                for (outerProcTileIter1=outerProcTileScatter1;outerProcTileIter1<=outerProcTileScatter1;outerProcTileIter1++) {
-                  for (outerProcTileIter2=outerProcTileScatter2;outerProcTileIter2<=outerProcTileScatter2;outerProcTileIter2++) {
-                    for (innerTimeTileIter=innerTimeTileScatter;innerTimeTileIter<=innerTimeTileScatter;innerTimeTileIter++) {
-                      for (innerProcTileIter1=innerProcTileScatter1;innerProcTileIter1<=innerProcTileScatter1;innerProcTileIter1++) {
-                        for (innerProcTileIter2=outerProcTileScatter2;innerProcTileIter2<=outerProcTileScatter2;innerProcTileIter2++) {
-                          S1(outerTimeTileIter,outerProcTileIter1,outerProcTileIter2,innerTimeTileIter,innerProcTileIter1,innerProcTileIter2);
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/otl.cloog b/cloog-0.17.0/test/otl.cloog
deleted file mode 100644
index 5f9b783..0000000
--- a/cloog-0.17.0/test/otl.cloog
+++ /dev/null
@@ -1,117 +0,0 @@
-# created: Tue Mar 23 01:51:15 CET 2010
-# ---------------------- CONTEXT ----------------------
-c # language is C
-
-# Context
-2 4
- 1 1 0 -1
- 1 0 1 -1
-
-
-1 # set parameter names
-M N
-
-# --------------------- STATEMENTS --------------------
-1
-
-1 # domains per statement
-76 10
- 1 -5 0 0 0 0 0 2 2 -7
- 1 -20 0 0 0 20 20 0 0 16
- 1 -40 0 0 0 0 80 0 8 16
- 1 -4 4 0 0 0 4 0 0 4
- 1 -20 0 0 0 40 0 0 0 8
- 1 -20 0 20 0 20 0 0 0 16
- 1 -20 0 40 0 0 0 0 4 8
- 1 -20 40 0 0 0 0 0 0 16
- 1 -4 4 4 0 0 0 0 0 4
- 1 -20 0 0 0 0 20 4 4 -4
- 1 -10 0 0 0 10 0 2 0 2
- 1 -5 0 0 5 0 0 0 0 3
- 1 -5 5 0 0 0 0 1 0 2
- 1 -10 0 10 0 0 0 2 2 -2
- 1 0 -10 -10 10 0 0 0 2 6
- 1 20 -20 -20 0 0 0 0 4 16
- 1 0 -10 0 10 0 -10 0 2 6
- 1 40 -40 0 0 0 -40 0 8 32
- 1 0 -20 0 10 0 0 0 4 0
- 1 0 -10 0 0 0 0 2 4 -10
- 1 40 -80 0 0 0 0 0 16 8
- 1 0 -10 0 0 0 10 0 2 2
- 1 0 -5 0 0 5 0 0 0 3
- 1 0 -10 0 10 0 0 0 0 4
- 1 0 -5 5 0 0 0 0 1 1
- 1 20 -20 0 0 0 0 0 0 12
- 1 0 0 -10 10 -10 0 0 2 8
- 1 40 0 -40 0 -40 0 0 8 40
- 1 0 0 -20 10 0 0 0 2 4
- 1 0 0 -5 0 0 0 1 1 -2
- 1 40 0 -80 0 0 0 0 8 24
- 1 0 0 -5 0 0 5 0 0 4
- 1 0 0 -10 0 10 0 0 0 4
- 1 0 0 -10 10 0 0 0 0 2
- 1 0 5 -5 0 0 0 0 0 3
- 1 40 0 -40 0 0 0 0 0 16
- 1 0 0 0 -5 0 0 2 2 -6
- 1 0 0 0 -20 20 20 0 0 20
- 1 0 0 0 -40 0 80 0 8 24
- 1 0 20 0 -20 0 20 0 0 24
- 1 0 0 20 -20 20 0 0 0 20
- 1 0 0 0 -20 40 0 0 0 12
- 1 0 0 40 -20 0 0 0 4 12
- 1 0 40 0 -20 0 0 0 0 20
- 1 0 20 20 -20 0 0 0 0 24
- 1 0 0 0 -40 0 40 8 8 0
- 1 0 0 0 -20 20 0 4 0 8
- 1 0 0 20 -20 0 0 4 4 0
- 1 2 0 0 -2 0 0 0 0 2
- 1 0 10 0 -10 0 0 2 0 6
- 1 0 0 0 10 -10 -10 0 2 8
- 1 80 0 0 0 -80 -80 0 16 80
- 1 0 0 0 10 -20 0 0 4 4
- 1 0 0 0 0 -10 0 2 4 -8
- 1 120 0 0 0 -240 0 0 48 72
- 1 0 0 0 0 -20 20 0 4 8
- 1 0 0 0 10 -10 0 0 0 6
- 1 0 0 10 0 -10 0 0 2 4
- 1 0 1 0 0 -1 0 0 0 1
- 1 40 0 0 0 -40 0 0 0 32
- 1 0 0 0 10 0 -20 0 2 4
- 1 0 0 0 0 0 -5 1 1 -2
- 1 80 0 0 0 0 -160 0 16 48
- 1 0 0 0 0 10 -10 0 0 4
- 1 0 0 0 10 0 -10 0 0 2
- 1 0 0 5 0 0 -5 0 0 4
- 1 0 10 0 0 0 -10 0 0 6
- 1 40 0 0 0 0 -40 0 0 16
- 1 0 0 0 0 0 4 0 0 0
- 1 0 0 0 0 20 0 0 0 -8
- 1 0 0 0 20 0 0 0 0 -12
- 1 0 0 4 0 0 0 0 0 0
- 1 0 20 0 0 0 0 0 0 -4
- 1 80 0 0 0 0 0 0 0 -32
- 1 0 0 0 0 0 0 0 1 -4
- 1 0 0 0 0 0 0 1 0 -3
-
-
-0 0 0 # for future options...
-
-
-
-1 # set the iterator names
-outerTimeTileIter outerProcTileIter1 outerProcTileIter2 innerTimeTileIter innerProcTileIter1 innerProcTileIter2
-
-# --------------------- SCATTERING --------------------
-1 # Scattering functions
-6 16
- 0 1 0 0 0 0 0 -1 0 0 0 0 0 0 0 0
- 0 0 1 0 0 0 0 0 -1 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 -1 0 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 -1 0 0 0 0 0
- 0 0 0 0 0 1 0 0 0 0 0 -1 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 -1 0 0 0
-
-
-1 # we set the scattering dimension names
-outerTimeTileScatter outerProcTileScatter1 outerProcTileScatter2 innerTimeTileScatter innerProcTileScatter1 innerProcTileScatter2
-
diff --git a/cloog-0.17.0/test/otl.good.c b/cloog-0.17.0/test/otl.good.c
deleted file mode 100644
index 3004d8e..0000000
--- a/cloog-0.17.0/test/otl.good.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Generated from ../../../git/cloog/test/otl.cloog by CLooG 0.14.0-273-gfe7416f gmp bits in 0.24s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(outerTimeTileIter,outerProcTileIter1,outerProcTileIter2,innerTimeTileIter,innerProcTileIter1,innerProcTileIter2) { hash(1); hash(outerTimeTileIter); hash(outerProcTileIter1); hash(outerProcTileIter2); hash(innerTimeTileIter); hash(innerProcTileIter1); hash(innerProcTileIter2); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int outerTimeTileScatter, outerProcTileScatter1, outerProcTileScatter2, innerTimeTileScatter, innerProcTileScatter1, innerProcTileScatter2;
-  /* Original iterators. */
-  int outerTimeTileIter, outerProcTileIter1, outerProcTileIter2, innerTimeTileIter, innerProcTileIter1, innerProcTileIter2;
-  if ((M >= 3) && (N >= 4)) {
-    for (outerTimeTileScatter=1;outerTimeTileScatter<=floord(2*M+2*N-7,5);outerTimeTileScatter++) {
-      for (outerProcTileScatter1=max(ceild(outerTimeTileScatter,2),ceild(5*outerTimeTileScatter-M-2,5));outerProcTileScatter1<=min(min(floord(M+2*N-5,5),floord(5*outerTimeTileScatter+2*N+1,10)),outerTimeTileScatter);outerProcTileScatter1++) {
-        for (outerProcTileScatter2=max(max(max(max(max(ceild(outerTimeTileScatter-outerProcTileScatter1-1,2),ceild(5*outerProcTileScatter1-N-1,5)),ceild(5*outerTimeTileScatter-M-N+1,5)),ceild(5*outerTimeTileScatter-N-2,10)),ceild(5*outerTimeTileScatter-N-3,15)),outerTimeTileScatter-outerProcTileScatter1-1);outerProcTileScatter2<=min(min(min(floord(M+N-2,5),floord(5*outerTimeTileScatter-5*outerProcTileScatter1+N+4,5)),floord(5*outerTimeTileScatter+N+3,10)),outerProcTileScatter1);outerProcTileScatter2++) {
-          for (innerTimeTileScatter=max(max(max(ceild(10*outerProcTileScatter1-2*N,5),ceild(10*outerProcTileScatter2-N-2,5)),ceild(5*outerProcTileScatter1+5*outerProcTileScatter2-N-3,5)),outerTimeTileScatter);innerTimeTileScatter<=min(min(min(min(min(floord(2*M+2*N-6,5),floord(5*outerProcTileScatter1+M+3,5)),floord(5*outerProcTileScatter2+M+N,5)),floord(10*outerProcTileScatter2+N+3,5)),outerTimeTileScatter+1),outerProcTileScatter1+outerProcTileScatter2+1);innerTimeTileScatter++) {
-            for (innerProcTileScatter1=max(max(max(max(ceild(innerTimeTileScatter,2),ceild(5*innerTimeTileScatter-M-2,5)),ceild(5*outerTimeTileScatter-M-1,5)),outerProcTileScatter1),outerTimeTileScatter-outerProcTileScatter2);innerProcTileScatter1<=min(min(min(min(min(min(min(floord(M+2*N-4,5),floord(5*outerProcTileScatter2+N+2,5)),floord(-5*outerProcTileScatter2+5*innerTimeTileScatter+N+4,5)),floord(5*outerTimeTileScatter-5*outerProcTileScatter2+N+5,5)),floord(5*innerTimeTileScatter+2*N+2,10)),floord(5*outerTimeTileScatter+2*N+3,10)),outerTimeTileScatter),outerProcTileScatter1+1);innerProcTileScatter1++) {
-              for (innerProcTileScatter2=outerProcTileScatter2;innerProcTileScatter2<=outerProcTileScatter2;innerProcTileScatter2++) {
-                for (outerTimeTileIter=outerTimeTileScatter;outerTimeTileIter<=outerTimeTileScatter;outerTimeTileIter++) {
-                  for (outerProcTileIter1=outerProcTileScatter1;outerProcTileIter1<=outerProcTileScatter1;outerProcTileIter1++) {
-                    for (outerProcTileIter2=outerProcTileScatter2;outerProcTileIter2<=outerProcTileScatter2;outerProcTileIter2++) {
-                      for (innerTimeTileIter=innerTimeTileScatter;innerTimeTileIter<=innerTimeTileScatter;innerTimeTileIter++) {
-                        for (innerProcTileIter1=innerProcTileScatter1;innerProcTileIter1<=innerProcTileScatter1;innerProcTileIter1++) {
-                          for (innerProcTileIter2=outerProcTileScatter2;innerProcTileIter2<=outerProcTileScatter2;innerProcTileIter2++) {
-                            S1(outerTimeTileIter,outerProcTileIter1,outerProcTileIter2,innerTimeTileIter,innerProcTileIter1,innerProcTileIter2);
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/param-split.c b/cloog-0.17.0/test/param-split.c
deleted file mode 100644
index 97c75b1..0000000
--- a/cloog-0.17.0/test/param-split.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Generated from ../../../git/cloog/test/param-split.cloog by CLooG 0.14.0-277-gce2ba57 gmp bits in 0.00s. */
-for (i=0;i<=M;i++) {
-  S1(i);
-  if (i == 0) {
-    S2(i);
-  }
-}
-if (M <= -1) {
-  S2(0);
-}
diff --git a/cloog-0.17.0/test/param-split.cloog b/cloog-0.17.0/test/param-split.cloog
deleted file mode 100644
index 6f9e58f..0000000
--- a/cloog-0.17.0/test/param-split.cloog
+++ /dev/null
@@ -1,24 +0,0 @@
-c
-
-0 3
-
-0
-
-2
-
-1
-2 4
-1 1 0 0
-1 -1 1 0
-
-0 0 0
-
-1
-1 4
-0 1 0 0
-
-0 0 0
-
-0
-
-0
diff --git a/cloog-0.17.0/test/param-split.good.c b/cloog-0.17.0/test/param-split.good.c
deleted file mode 100644
index 25b3bc6..0000000
--- a/cloog-0.17.0/test/param-split.good.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Generated from ../../../git/cloog/test/param-split.cloog by CLooG 0.14.0-277-gce2ba57 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i) { hash(2); hash(i); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i;
-  if (M >= 0) {
-    S1(0);
-    S2(0);
-  }
-  for (i=1;i<=M;i++) {
-    S1(i);
-  }
-  if (M <= -1) {
-    S2(0);
-  }
-}
diff --git a/cloog-0.17.0/test/pouchet.c b/cloog-0.17.0/test/pouchet.c
deleted file mode 100644
index 3eb887f..0000000
--- a/cloog-0.17.0/test/pouchet.c
+++ /dev/null
@@ -1,22 +0,0 @@
-/* Generated from ../../../git/cloog/test/pouchet.cloog by CLooG 0.16.2-3-gc1aebd7 gmp bits in 0.03s. */
-if (Ny >= 2) {
-  for (c0=1;c0<=floord(Ny+4,2);c0++) {
-    for (c1=max(ceild(c0+1,2),c0-1);c1<=min(floord(2*c0+Ny,4),c0);c1++) {
-      if (c0 >= ceild(4*c1-Ny+1,2)) {
-        for (c2=1;c2<=2;c2++) {
-          S1(c0-c1,c1,2*c0-2*c1,-2*c0+4*c1,c2);
-          S2(c0-c1,c1,2*c0-2*c1,-2*c0+4*c1-1,c2);
-        }
-      }
-      if (2*c0 == 4*c1-Ny) {
-        for (c2=1;c2<=2;c2++) {
-          if (Ny%2 == 0) {
-            if ((2*c0+3*Ny)%4 == 0) {
-              S2((2*c0-Ny)/4,(2*c0+Ny)/4,(2*c0-Ny)/2,Ny-1,c2);
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/pouchet.cloog b/cloog-0.17.0/test/pouchet.cloog
deleted file mode 100644
index bef7293..0000000
--- a/cloog-0.17.0/test/pouchet.cloog
+++ /dev/null
@@ -1,76 +0,0 @@
-# CLooG -> CLooG
-# This is an automatic dump of a CLooG input file from a CloogInput data
-# structure.
-
-# Language: C
-c
-
-# Context:
-1
-
-0 3 0 0 0 1
-
-1 # Parameter name(s)
-Ny
-
-# Statement number:
-2
-
-# Iteration domain of statement 2 ((null)).
-1
-
-8 8 5 0 0 1
-1     0     0     1     0     0     0     0
-1     0     0    -1     0     0     0     2
-1     0     0     0     1     0     0    -1
-1     0     0     0    -1     0     1    -1
-1     0     0     0     0     1     0    -1
-1     0     0     0     0    -1     0     2
-0    -2     0     1     0     0     0     0
-0     0    -2     1     1     0     0     0
-
-0 0 0 # For future options.
-
-# Iteration domain of statement 4 ((null)).
-1
-
-8 8 5 0 0 1
-1     0     0     1     0     0     0     0
-1     0     0    -1     0     0     0     2
-1     0     0     0     1     0     0    -1
-1     0     0     0    -1     0     1    -1
-1     0     0     0     0     1     0    -1
-1     0     0     0     0    -1     0     2
-0    -2     0     1     0     0     0     0
-0     0    -2     1     1     0     0     1
-
-0 0 0 # For future options.
-
-0 # Iterator name(s)
-# --------------------- SCATTERING --------------------
-2 # Scattering functions
-
-# Scattering of statement 2 ((null)).
-1
-
-6 14 6 5 0 1
-0     0     0     0     0     0     1      0     0     0     0    -1     0     0
-0     0     0     0     0     1     0      0     0     0    -1     0     0     0
-0     0     0     0     1     0     0      0     0    -1     0     0     0     0
-0     0     0     1     0     0     0      0     0     0     0    -1     0     0
-0     0     1     0     0     0     0      0    -1     0     0     0     0     0
-0     1     0     0     0     0     0     -1    -1     0     0     0     0     0
-
-# Scattering of statement 4 ((null)).
-1
-
-6 14 6 5 0 1
-0     0     0     0     0     0     1      0     0     0     0    -1     0    -1
-0     0     0     0     0     1     0      0     0     0    -1     0     0    -1
-0     0     0     0     1     0     0      0     0    -1     0     0     0     0
-0     0     0     1     0     0     0      0     0     0     0    -1     0     0
-0     0     1     0     0     0     0      0    -1     0     0     0     0     0
-0     1     0     0     0     0     0     -1    -1     0     0     0     0     0
-
-1 # Scattering dimension name(s)
-c0 c1 c2 c3 c4 c5
diff --git a/cloog-0.17.0/test/pouchet.good.c b/cloog-0.17.0/test/pouchet.good.c
deleted file mode 100644
index 43009f5..0000000
--- a/cloog-0.17.0/test/pouchet.good.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Generated from ../../../git/cloog/test/pouchet.cloog by CLooG 0.16.2-3-gc1aebd7 gmp bits in 0.04s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k,l,m) { hash(1); hash(i); hash(j); hash(k); hash(l); hash(m); }
-#define S2(i,j,k,l,m) { hash(2); hash(i); hash(j); hash(k); hash(l); hash(m); }
-
-void test(int Ny)
-{
-  /* Scattering iterators. */
-  int c0, c1, c2, c3, c4, c5;
-  /* Original iterators. */
-  int i, j, k, l, m;
-  if (Ny >= 2) {
-    for (c0=1;c0<=floord(Ny+4,2);c0++) {
-      for (c1=max(ceild(c0+1,2),c0-1);c1<=min(floord(2*c0+Ny,4),c0);c1++) {
-        if (c0 >= ceild(4*c1-Ny+1,2)) {
-          for (c2=1;c2<=2;c2++) {
-            S1(c0-c1,c1,2*c0-2*c1,-2*c0+4*c1,c2);
-            S2(c0-c1,c1,2*c0-2*c1,-2*c0+4*c1-1,c2);
-          }
-        }
-        if (2*c0 == 4*c1-Ny) {
-          for (c2=1;c2<=2;c2++) {
-            if (Ny%2 == 0) {
-              if ((2*c0+3*Ny)%4 == 0) {
-                S2((2*c0-Ny)/4,(2*c0+Ny)/4,(2*c0-Ny)/2,Ny-1,c2);
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/rectangle.c b/cloog-0.17.0/test/rectangle.c
deleted file mode 100644
index dba226a..0000000
--- a/cloog-0.17.0/test/rectangle.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/rectangle.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (c1=0;c1<=2*n;c1++) {
-  for (i=max(0,c1-n);i<=min(c1,n);i++) {
-    S1(i,c1-i) ;
-  }
-}
diff --git a/cloog-0.17.0/test/rectangle.cloog b/cloog-0.17.0/test/rectangle.cloog
deleted file mode 100644
index 9f639ab..0000000
--- a/cloog-0.17.0/test/rectangle.cloog
+++ /dev/null
@@ -1,29 +0,0 @@
-# language: C
-c
-
-# parameter {n | n>= 0}
-1 3
-#  n  1
-1  1  0
-1
-n
-
-1 # Number of statements:
-
-1
-# {ii, i | 0<=i<=n 0<=j<=n}
-4 5
-#   i   j   n   1
-1   1   0   0   0
-1  -1   0   1   0
-1   0   1   0   0
-1   0  -1   1   0
-0   0   0
-0
-
-1 # Scattering functions
-
-1 6
-# c1   j   i   n   1
-0  1  -1  -1   0   0
-0
diff --git a/cloog-0.17.0/test/rectangle.good.c b/cloog-0.17.0/test/rectangle.good.c
deleted file mode 100644
index b977e28..0000000
--- a/cloog-0.17.0/test/rectangle.good.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Generated from ../../../git/cloog/test/rectangle.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int n)
-{
-  /* Scattering iterators. */
-  int c1;
-  /* Original iterators. */
-  int i, j;
-  for (c1=0;c1<=2*n;c1++) {
-    for (i=max(c1-n,0);i<=min(c1,n);i++) {
-      j = c1-i ;
-      S1(i,c1-i) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/QR.c b/cloog-0.17.0/test/reservoir/QR.c
deleted file mode 100644
index 5a8c26f..0000000
--- a/cloog-0.17.0/test/reservoir/QR.c
+++ /dev/null
@@ -1,117 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/QR.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.21s. */
-if (N >= 1) {
-  S1(0) ;
-  if ((M >= 1) && (N == 1)) {
-    for (c4=0;c4<=M-1;c4++) {
-      S2(0,c4) ;
-    }
-    S3(0) ;
-    for (c4=0;c4<=M-1;c4++) {
-      S4(0,c4) ;
-    }
-    S10(0) ;
-    S5(0) ;
-  }
-  if ((M <= 0) && (N == 1)) {
-    S3(0) ;
-    S10(0) ;
-    S5(0) ;
-  }
-  if ((M >= 1) && (N >= 2)) {
-    for (c4=0;c4<=M-1;c4++) {
-      S2(0,c4) ;
-    }
-    S3(0) ;
-    for (c4=0;c4<=M-1;c4++) {
-      S4(0,c4) ;
-    }
-    S10(0) ;
-    S1(1) ;
-    S5(0) ;
-  }
-  if ((M <= 0) && (N >= 2)) {
-    S3(0) ;
-    S10(0) ;
-    S1(1) ;
-    S5(0) ;
-  }
-  for (c2=2;c2<=min(M,N-1);c2++) {
-    for (c4=c2-1;c4<=N-1;c4++) {
-      S6(c2-2,c4) ;
-      for (c6=c2-2;c6<=M-1;c6++) {
-        S7(c2-2,c4,c6) ;
-      }
-      S8(c2-2,c4) ;
-      for (c6=c2-2;c6<=M-1;c6++) {
-        S9(c2-2,c4,c6) ;
-      }
-    }
-    for (c4=c2-1;c4<=M-1;c4++) {
-      S2(c2-1,c4) ;
-    }
-    S3(c2-1) ;
-    for (c4=c2-1;c4<=M-1;c4++) {
-      S4(c2-1,c4) ;
-    }
-    S10(c2-1) ;
-    S1(c2) ;
-    S5(c2-1) ;
-  }
-  if ((M >= 1) && (M <= N-2)) {
-    for (c4=M;c4<=N-1;c4++) {
-      S6(M-1,c4) ;
-      S7(M-1,c4,M-1) ;
-      S8(M-1,c4) ;
-      S9(M-1,c4,M-1) ;
-    }
-    S3(M) ;
-    S10(M) ;
-    S1(M+1) ;
-    S5(M) ;
-  }
-  for (c2=max(2,M+2);c2<=N-1;c2++) {
-    for (c4=c2-1;c4<=N-1;c4++) {
-      S6(c2-2,c4) ;
-      S8(c2-2,c4) ;
-    }
-    S3(c2-1) ;
-    S10(c2-1) ;
-    S1(c2) ;
-    S5(c2-1) ;
-  }
-  if ((M >= N) && (N >= 2)) {
-    S6(N-2,N-1) ;
-    for (c6=N-2;c6<=M-1;c6++) {
-      S7(N-2,N-1,c6) ;
-    }
-    S8(N-2,N-1) ;
-    for (c6=N-2;c6<=M-1;c6++) {
-      S9(N-2,N-1,c6) ;
-    }
-    for (c4=N-1;c4<=M-1;c4++) {
-      S2(N-1,c4) ;
-    }
-    S3(N-1) ;
-    for (c4=N-1;c4<=M-1;c4++) {
-      S4(N-1,c4) ;
-    }
-    S10(N-1) ;
-    S5(N-1) ;
-  }
-  if ((M == N-1) && (M >= 1)) {
-    S6(M-1,M) ;
-    S7(M-1,M,M-1) ;
-    S8(M-1,M) ;
-    S9(M-1,M,M-1) ;
-    S3(M) ;
-    S10(M) ;
-    S5(M) ;
-  }
-  if ((M <= N-2) && (N >= 2)) {
-    S6(N-2,N-1) ;
-    S8(N-2,N-1) ;
-    S3(N-1) ;
-    S10(N-1) ;
-    S5(N-1) ;
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/QR.cloog b/cloog-0.17.0/test/reservoir/QR.cloog
deleted file mode 100755
index 8baed20..0000000
--- a/cloog-0.17.0/test/reservoir/QR.cloog
+++ /dev/null
@@ -1,228 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 4
-    1    0    0    1
-0
-
-# Number of statments
-10
-
-1
-# { (i,j,k) | i >= 0, -i+k-1 >= 0, 1 >= 0 }
-
-    3 5
-    1    1    0    0    0
-    1   -1    0    1   -1
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i >= 0, -i+l-1 >= 0, -i+j >= 0, -j+k-1 >= 0, 1 >= 0 }
-
-    5 6
-    1    1    0    0    0    0
-    1   -1    0    0    1   -1
-    1   -1    1    0    0    0
-    1    0   -1    1    0   -1
-    1    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | i >= 0, -i+k-1 >= 0, 1 >= 0 }
-
-    3 5
-    1    1    0    0    0
-    1   -1    0    1   -1
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i >= 0, -i+l-1 >= 0, -i+j >= 0, -j+k-1 >= 0, 1 >= 0 }
-
-    5 6
-    1    1    0    0    0    0
-    1   -1    0    0    1   -1
-    1   -1    1    0    0    0
-    1    0   -1    1    0   -1
-    1    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | i >= 0, -i+k-1 >= 0, 1 >= 0 }
-
-    3 5
-    1    1    0    0    0
-    1   -1    0    1   -1
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i >= 0, -i+j-1 >= 0, -j+l-1 >= 0, 1 >= 0 }
-
-    4 6
-    1    1    0    0    0    0
-    1   -1    1    0    0   -1
-    1    0   -1    0    1   -1
-    1    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m) | i >= 0, -i+j-1 >= 0, -j+m-1 >= 0, -i+k >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    6 7
-    1    1    0    0    0    0    0
-    1   -1    1    0    0    0   -1
-    1    0   -1    0    0    1   -1
-    1   -1    0    1    0    0    0
-    1    0    0   -1    1    0   -1
-    1    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i >= 0, -i+j-1 >= 0, -j+l-1 >= 0, 1 >= 0 }
-
-    4 6
-    1    1    0    0    0    0
-    1   -1    1    0    0   -1
-    1    0   -1    0    1   -1
-    1    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m) | i >= 0, -i+j-1 >= 0, -j+m-1 >= 0, -i+k >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    6 7
-    1    1    0    0    0    0    0
-    1   -1    1    0    0    0   -1
-    1    0   -1    0    0    1   -1
-    1   -1    0    1    0    0    0
-    1    0    0   -1    1    0   -1
-    1    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | i >= 0, -i+k-1 >= 0, 1 >= 0 }
-
-    3 5
-    1    1    0    0    0
-    1   -1    0    1   -1
-    1    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-10
-
-    8 12
-    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0   -5
-    0    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0   -1
-    0    0    0    1    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 12
-    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0   -1
-    0    0    0    1    0    0    0    0    0    0    0   -2
-    0    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0   -1
-    0    0    0    1    0    0    0    0    0    0    0    0   -3
-    0    0    0    0    1    0    0    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 12
-    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0   -1
-    0    0    0    1    0    0    0    0    0    0    0   -6
-    0    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0   -2
-    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 14
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0   -2
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0   -2
-    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0   -2
-    0    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 14
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0   -2
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0   -3
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 12
-    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0   -1
-    0    0    0    1    0    0    0    0    0    0    0   -4
-    0    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/QR.good.c b/cloog-0.17.0/test/reservoir/QR.good.c
deleted file mode 100644
index facd214..0000000
--- a/cloog-0.17.0/test/reservoir/QR.good.c
+++ /dev/null
@@ -1,208 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/QR.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.27s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i) { hash(3); hash(i); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-#define S5(i) { hash(5); hash(i); }
-#define S6(i,j) { hash(6); hash(i); hash(j); }
-#define S7(i,j,k) { hash(7); hash(i); hash(j); hash(k); }
-#define S8(i,j) { hash(8); hash(i); hash(j); }
-#define S9(i,j,k) { hash(9); hash(i); hash(j); hash(k); }
-#define S10(i) { hash(10); hash(i); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  if ((M <= -1) && (N >= 1)) {
-    S1(0) ;
-  }
-  if ((M >= 0) && (N >= 1)) {
-    S1(0) ;
-  }
-  if ((M >= 1) && (N >= 2)) {
-    for (c4=0;c4<=M-1;c4++) {
-      S2(0,c4) ;
-    }
-    S3(0) ;
-    for (c4=0;c4<=M-1;c4++) {
-      S4(0,c4) ;
-    }
-    S10(0) ;
-    S1(1) ;
-    S5(0) ;
-  }
-  if ((M <= 0) && (N >= 2)) {
-    S3(0) ;
-    S10(0) ;
-    S1(1) ;
-    S5(0) ;
-  }
-  if ((M >= 1) && (N == 1)) {
-    for (c4=0;c4<=M-1;c4++) {
-      S2(0,c4) ;
-    }
-    S3(0) ;
-    for (c4=0;c4<=M-1;c4++) {
-      S4(0,c4) ;
-    }
-    S10(0) ;
-    S5(0) ;
-  }
-  if ((M <= 0) && (N == 1)) {
-    S3(0) ;
-    S10(0) ;
-    S5(0) ;
-  }
-  for (c2=2;c2<=min(N-1,M);c2++) {
-    for (c4=c2-1;c4<=N-1;c4++) {
-      i = c2-2 ;
-      S6(c2-2,c4) ;
-      for (c6=c2-2;c6<=M-1;c6++) {
-        i = c2-2 ;
-        S7(c2-2,c4,c6) ;
-      }
-      i = c2-2 ;
-      S8(c2-2,c4) ;
-      for (c6=c2-2;c6<=M-1;c6++) {
-        i = c2-2 ;
-        S9(c2-2,c4,c6) ;
-      }
-    }
-    for (c4=c2-1;c4<=M-1;c4++) {
-      i = c2-1 ;
-      S2(c2-1,c4) ;
-    }
-    i = c2-1 ;
-    S3(c2-1) ;
-    for (c4=c2-1;c4<=M-1;c4++) {
-      i = c2-1 ;
-      S4(c2-1,c4) ;
-    }
-    i = c2-1 ;
-    S10(c2-1) ;
-    S1(c2) ;
-    i = c2-1 ;
-    S5(c2-1) ;
-  }
-  if ((M >= 1) && (M <= N-2)) {
-    c2 = M+1 ;
-    for (c4=M;c4<=N-1;c4++) {
-      i = M-1 ;
-      S6(M-1,c4) ;
-      c6 = M-1 ;
-      i = M-1 ;
-      k = M-1 ;
-      S7(M-1,c4,M-1) ;
-      i = M-1 ;
-      S8(M-1,c4) ;
-      c6 = M-1 ;
-      i = M-1 ;
-      k = M-1 ;
-      S9(M-1,c4,M-1) ;
-    }
-    S3(M) ;
-    S10(M) ;
-    i = M+1 ;
-    S1(M+1) ;
-    S5(M) ;
-  }
-  if ((M >= N) && (N >= 2)) {
-    c4 = N-1 ;
-    i = N-2 ;
-    j = N-1 ;
-    S6(N-2,N-1) ;
-    for (c6=N-2;c6<=M-1;c6++) {
-      i = N-2 ;
-      j = N-1 ;
-      S7(N-2,N-1,c6) ;
-    }
-    i = N-2 ;
-    j = N-1 ;
-    S8(N-2,N-1) ;
-    for (c6=N-2;c6<=M-1;c6++) {
-      i = N-2 ;
-      j = N-1 ;
-      S9(N-2,N-1,c6) ;
-    }
-    for (c4=N-1;c4<=M-1;c4++) {
-      i = N-1 ;
-      S2(N-1,c4) ;
-    }
-    i = N-1 ;
-    S3(N-1) ;
-    for (c4=N-1;c4<=M-1;c4++) {
-      i = N-1 ;
-      S4(N-1,c4) ;
-    }
-    i = N-1 ;
-    S10(N-1) ;
-    i = N-1 ;
-    S5(N-1) ;
-  }
-  if ((M == N-1) && (N >= 2)) {
-    c4 = N-1 ;
-    i = N-2 ;
-    j = N-1 ;
-    S6(N-2,N-1) ;
-    c6 = N-2 ;
-    i = N-2 ;
-    j = N-1 ;
-    k = N-2 ;
-    S7(N-2,N-1,N-2) ;
-    i = N-2 ;
-    j = N-1 ;
-    S8(N-2,N-1) ;
-    c6 = N-2 ;
-    i = N-2 ;
-    j = N-1 ;
-    k = N-2 ;
-    S9(N-2,N-1,N-2) ;
-    i = N-1 ;
-    S3(N-1) ;
-    i = N-1 ;
-    S10(N-1) ;
-    i = N-1 ;
-    S5(N-1) ;
-  }
-  for (c2=max(M+2,2);c2<=N-1;c2++) {
-    for (c4=c2-1;c4<=N-1;c4++) {
-      i = c2-2 ;
-      S6(c2-2,c4) ;
-      i = c2-2 ;
-      S8(c2-2,c4) ;
-    }
-    i = c2-1 ;
-    S3(c2-1) ;
-    i = c2-1 ;
-    S10(c2-1) ;
-    S1(c2) ;
-    i = c2-1 ;
-    S5(c2-1) ;
-  }
-  if ((M <= N-2) && (N >= 2)) {
-    c4 = N-1 ;
-    i = N-2 ;
-    j = N-1 ;
-    S6(N-2,N-1) ;
-    i = N-2 ;
-    j = N-1 ;
-    S8(N-2,N-1) ;
-    i = N-1 ;
-    S3(N-1) ;
-    i = N-1 ;
-    S10(N-1) ;
-    i = N-1 ;
-    S5(N-1) ;
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/bastoul3.c b/cloog-0.17.0/test/reservoir/bastoul3.c
deleted file mode 100644
index 5f4b050..0000000
--- a/cloog-0.17.0/test/reservoir/bastoul3.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/reservoir/bastoul3.cloog by CLooG 0.16.3 gmp bits in 0.01s. */
-for (i=3;i<=9;i++) {
-  for (j=max(i-6,i-2*floord(i+1,2)+2);j<=min(3,i-2);j+=2) {
-    S1(i,j,(i-j)/2);
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/bastoul3.cloog b/cloog-0.17.0/test/reservoir/bastoul3.cloog
deleted file mode 100644
index 8437226..0000000
--- a/cloog-0.17.0/test/reservoir/bastoul3.cloog
+++ /dev/null
@@ -1,33 +0,0 @@
-# Figure 4 from "Efficient code generation for automatic parallelization
-# and optimization".
-#
-# Language
-c
-
-# Context
-
-   1 2
-   1  1
-0
-
-# Number of statements
-1
-
-1
-
-#        i'   i    j    1
-   6 5
-   0    1   -1   -2    0
-   1    0    1    0   -1
-   1    0   -1    0    3
-   1    0    0    1   -1
-   1    0    0   -1    3
-   1    0    0    0    1
-
-0 0 0
-
-0
-0
-
-
-
diff --git a/cloog-0.17.0/test/reservoir/cholesky2.c b/cloog-0.17.0/test/reservoir/cholesky2.c
deleted file mode 100644
index ee3c52e..0000000
--- a/cloog-0.17.0/test/reservoir/cholesky2.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Generated from ../../../git/cloog/test/reservoir/cholesky2.cloog by CLooG 0.14.0-283-g7c18f7a gmp bits in 0.04s. */
-if (M >= 1) {
-  if (M >= 2) {
-    S1(1);
-  }
-  for (c2=2;c2<=min(3,M);c2++) {
-    S2(1,c2);
-  }
-  if (M == 1) {
-    S1(1);
-  }
-  for (c2=4;c2<=3*M-4;c2++) {
-    if ((c2+1)%3 == 0) {
-      S1((c2+1)/3);
-    }
-    for (c4=ceild(c2+2,3);c4<=min(M,c2-2);c4++) {
-      for (c6=ceild(c2-c4+2,2);c6<=min(c4,c2-c4);c6++) {
-        S3(c2-c4-c6+1,c4,c6);
-      }
-    }
-    for (c4=ceild(c2+4,3);c4<=min(M,c2);c4++) {
-      if ((c2+c4)%2 == 0) {
-        S2((c2-c4+2)/2,c4);
-      }
-    }
-  }
-  for (c2=max(2*M,3*M-3);c2<=3*M-2;c2++) {
-    S3(c2-2*M+1,M,M);
-  }
-  if (M >= 2) {
-    S1(M);
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/cholesky2.cloog b/cloog-0.17.0/test/reservoir/cholesky2.cloog
deleted file mode 100755
index 7317c6a..0000000
--- a/cloog-0.17.0/test/reservoir/cholesky2.cloog
+++ /dev/null
@@ -1,79 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statments
-3
-
-1
-# { (i,j) | i-1 >= 0, -i+j >= 0, 1 >= 0 }
-
-    3 4
-    1    1    0   -1
-    1   -1    1    0
-    1    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | i-1 >= 0, -i+j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    4 5
-    1    1    0    0   -1
-    1   -1    1    0   -1
-    1    0   -1    1    0
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i-1 >= 0, -j+l >= 0, -i+k-1 >= 0, j-k >= 0, 1 >= 0 }
-
-    5 6
-    1    1    0    0    0   -1
-    1    0   -1    0    1    0
-    1   -1    0    1    0   -1
-    1    0    1   -1    0    0
-    1    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-3
-
-    8 11
-    0    1    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -3    0    1
-    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0
-    1    0    0    0    0    0    0    0    0    0    1
-
-
-    8 12
-    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -2   -1    0    2
-    0    0    0    1    0    0    0    0    0    0    0   -2
-    0    0    0    0    1    0    0    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1   -1   -1    0    1
-    0    0    0    1    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/cholesky2.good.c b/cloog-0.17.0/test/reservoir/cholesky2.good.c
deleted file mode 100644
index 36efcde..0000000
--- a/cloog-0.17.0/test/reservoir/cholesky2.good.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/cholesky2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.05s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j,k) { hash(3); hash(i); hash(j); hash(k); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  for (c2=2;c2<=min(3,3*M-4);c2++) {
-    if ((c2+1)%3 == 0) {
-      i = (c2+1)/3 ;
-      S1((c2+1)/3) ;
-    }
-    for (c4=ceild(c2+4,3);c4<=min(c2,M);c4++) {
-      if ((c2+c4)%2 == 0) {
-        i = (c2-c4+2)/2 ;
-        S2((c2-c4+2)/2,c4) ;
-      }
-    }
-  }
-  for (c2=4;c2<=3*M-4;c2++) {
-    if ((c2+1)%3 == 0) {
-      i = (c2+1)/3 ;
-      S1((c2+1)/3) ;
-    }
-    for (c4=ceild(c2+2,3);c4<=min(c2-2,M);c4++) {
-      for (c6=ceild(c2-c4+2,2);c6<=min(c2-c4,c4);c6++) {
-        i = c2-c4-c6+1 ;
-        S3(c2-c4-c6+1,c4,c6) ;
-      }
-    }
-    for (c4=ceild(c2+4,3);c4<=min(M,c2);c4++) {
-      if ((c2+c4)%2 == 0) {
-        i = (c2-c4+2)/2 ;
-        S2((c2-c4+2)/2,c4) ;
-      }
-    }
-  }
-  for (c2=max(2,3*M-3);c2<=min(3,3*M-2);c2++) {
-    if ((c2+1)%3 == 0) {
-      i = (c2+1)/3 ;
-      S1((c2+1)/3) ;
-    }
-  }
-  for (c2=max(3*M-3,4);c2<=3*M-2;c2++) {
-    if ((c2+1)%3 == 0) {
-      i = (c2+1)/3 ;
-      S1((c2+1)/3) ;
-    }
-    for (c4=ceild(c2+2,3);c4<=min(M,c2-2);c4++) {
-      for (c6=ceild(c2-c4+2,2);c6<=min(c2-c4,c4);c6++) {
-        i = c2-c4-c6+1 ;
-        S3(c2-c4-c6+1,c4,c6) ;
-      }
-    }
-  }
-  if (M >= 1) {
-    c2 = 3*M-1 ;
-    S1(M) ;
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/fusion1.c b/cloog-0.17.0/test/reservoir/fusion1.c
deleted file mode 100644
index c2c0adf..0000000
--- a/cloog-0.17.0/test/reservoir/fusion1.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/fusion1.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (c2=0;c2<=M;c2++) {
-  S1(c2) ;
-}
-for (c2=1;c2<=M;c2++) {
-  S2(c2) ;
-}
-for (c2=0;c2<=M;c2++) {
-  S3(c2) ;
-}
diff --git a/cloog-0.17.0/test/reservoir/fusion1.cloog b/cloog-0.17.0/test/reservoir/fusion1.cloog
deleted file mode 100755
index 3aea334..0000000
--- a/cloog-0.17.0/test/reservoir/fusion1.cloog
+++ /dev/null
@@ -1,65 +0,0 @@
-# Language
-c
-
-# Context
-
-    2 3
-    1    1   -1
-    1    0    1
-0
-
-# Number of statments
-3
-
-1
-# { (i,j) | i >= 0, -i+j >= 0, 1 >= 0 }
-
-    3 4
-    1    1    0    0
-    1   -1    1    0
-    1    0    0    1
-
-0 0 0
-1
-# { (i,j) | i-1 >= 0, -i+j >= 0, 1 >= 0 }
-
-    3 4
-    1    1    0   -1
-    1   -1    1    0
-    1    0    0    1
-
-0 0 0
-1
-# { (i,j) | i >= 0, -i+j >= 0, 1 >= 0 }
-
-    3 4
-    1    1    0    0
-    1   -1    1    0
-    1    0    0    1
-
-0 0 0
-0
-# Scattering functions
-3
-
-    4 7
-    0    1    0    0    0    0    0
-    0    0    1    0   -1    0    0
-    0    0    0    1    0    0    0
-    1    0    0    0    0    0    1
-
-
-    4 7
-    0    1    0    0    0    0   -1
-    0    0    1    0   -1    0    0
-    0    0    0    1    0    0    0
-    1    0    0    0    0    0    1
-
-
-    4 7
-    0    1    0    0    0    0   -2
-    0    0    1    0   -1    0    0
-    0    0    0    1    0    0    0
-    1    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/fusion1.good.c b/cloog-0.17.0/test/reservoir/fusion1.good.c
deleted file mode 100644
index ba28eba..0000000
--- a/cloog-0.17.0/test/reservoir/fusion1.good.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/fusion1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i) { hash(2); hash(i); }
-#define S3(i) { hash(3); hash(i); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2;
-  /* Original iterators. */
-  int i;
-  for (c2=0;c2<=M;c2++) {
-    S1(c2) ;
-  }
-  for (c2=1;c2<=M;c2++) {
-    S2(c2) ;
-  }
-  for (c2=0;c2<=M;c2++) {
-    S3(c2) ;
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/fusion2.c b/cloog-0.17.0/test/reservoir/fusion2.c
deleted file mode 100644
index d9d02d6..0000000
--- a/cloog-0.17.0/test/reservoir/fusion2.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/fusion2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.02s. */
-if ((M >= 1) && (N >= 1)) {
-  for (c4=1;c4<=M;c4++) {
-    S1(1,c4) ;
-  }
-  for (c2=2;c2<=N;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S2(c2-1,c4) ;
-    }
-    for (c4=1;c4<=M;c4++) {
-      S1(c2,c4) ;
-    }
-  }
-  for (c4=1;c4<=M;c4++) {
-    S2(N,c4) ;
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/fusion2.cloog b/cloog-0.17.0/test/reservoir/fusion2.cloog
deleted file mode 100755
index dad8353..0000000
--- a/cloog-0.17.0/test/reservoir/fusion2.cloog
+++ /dev/null
@@ -1,56 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 4
-    1    0    0    1
-0
-
-# Number of statments
-2
-
-1
-# { (i,j,k,l) | i-1 >= 0, -i+l >= 0, j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 6
-    1    1    0    0    0   -1
-    1   -1    0    0    1    0
-    1    0    1    0    0   -1
-    1    0   -1    1    0    0
-    1    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i-1 >= 0, -i+l >= 0, j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 6
-    1    1    0    0    0   -1
-    1   -1    0    0    1    0
-    1    0    1    0    0   -1
-    1    0   -1    1    0    0
-    1    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-2
-
-    6 11
-    0    1    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    1
-
-
-    6 11
-    0    1    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0   -1
-    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/fusion2.good.c b/cloog-0.17.0/test/reservoir/fusion2.good.c
deleted file mode 100644
index b4b8f1c..0000000
--- a/cloog-0.17.0/test/reservoir/fusion2.good.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/fusion2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int c2, c4;
-  /* Original iterators. */
-  int i, j;
-  if ((M >= 1) && (N >= 1)) {
-    for (c4=1;c4<=M;c4++) {
-      S1(1,c4) ;
-    }
-  }
-  if (M >= 1) {
-    for (c2=2;c2<=N;c2++) {
-      for (c4=1;c4<=M;c4++) {
-        i = c2-1 ;
-        S2(c2-1,c4) ;
-      }
-      for (c4=1;c4<=M;c4++) {
-        S1(c2,c4) ;
-      }
-    }
-  }
-  if ((M >= 1) && (N >= 1)) {
-    c2 = N+1 ;
-    for (c4=1;c4<=M;c4++) {
-      S2(N,c4) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/jacobi2.c b/cloog-0.17.0/test/reservoir/jacobi2.c
deleted file mode 100644
index 421e8a9..0000000
--- a/cloog-0.17.0/test/reservoir/jacobi2.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/jacobi2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (c2=0;c2<=M-1;c2++) {
-  for (c4=0;c4<=M-1;c4++) {
-    S1(c2,c4) ;
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/jacobi2.cloog b/cloog-0.17.0/test/reservoir/jacobi2.cloog
deleted file mode 100755
index 7352362..0000000
--- a/cloog-0.17.0/test/reservoir/jacobi2.cloog
+++ /dev/null
@@ -1,37 +0,0 @@
-# Language
-c
-
-# Context
-
-    2 3
-    1    1   -1
-    1    0    1
-0
-
-# Number of statments
-1
-
-1
-# { (i,j,k) | i >= 0, -i+k-1 >= 0, j >= 0, -j+k-1 >= 0, 1 >= 0 }
-
-    5 5
-    1    1    0    0    0
-    1   -1    0    1   -1
-    1    0    1    0    0
-    1    0   -1    1   -1
-    1    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-1
-
-    6 10
-    0    1    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/jacobi2.good.c b/cloog-0.17.0/test/reservoir/jacobi2.good.c
deleted file mode 100644
index 8c6ea0e..0000000
--- a/cloog-0.17.0/test/reservoir/jacobi2.good.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/jacobi2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4;
-  /* Original iterators. */
-  int i, j;
-  for (c2=0;c2<=M-1;c2++) {
-    for (c4=0;c4<=M-1;c4++) {
-      S1(c2,c4) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/jacobi3.c b/cloog-0.17.0/test/reservoir/jacobi3.c
deleted file mode 100644
index 0182c15..0000000
--- a/cloog-0.17.0/test/reservoir/jacobi3.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/jacobi3.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.02s. */
-if ((M >= 1) && (N >= 3)) {
-  for (c4=2;c4<=N-1;c4++) {
-    for (c6=2;c6<=N-1;c6++) {
-      S1(1,c4,c6) ;
-    }
-  }
-  for (c2=3;c2<=2*M;c2++) {
-    for (c4=2;c4<=N-1;c4++) {
-      for (c6=2;c6<=N-1;c6++) {
-        if (c2%2 == 0) {
-          S1(c2/2,c4,c6) ;
-        }
-      }
-    }
-    for (c4=2;c4<=N-1;c4++) {
-      for (c6=2;c6<=N-1;c6++) {
-        if ((c2+1)%2 == 0) {
-          S2((c2-1)/2,c4,c6) ;
-        }
-      }
-    }
-  }
-  for (c4=2;c4<=N-1;c4++) {
-    for (c6=2;c6<=N-1;c6++) {
-      S2(M,c4,c6) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/jacobi3.cloog b/cloog-0.17.0/test/reservoir/jacobi3.cloog
deleted file mode 100755
index dff32ff..0000000
--- a/cloog-0.17.0/test/reservoir/jacobi3.cloog
+++ /dev/null
@@ -1,64 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 4
-    1    0    0    1
-0
-
-# Number of statments
-2
-
-1
-# { (i,j,k,l,m) | i-1 >= 0, -i+l >= 0, j-2 >= 0, -j+m-1 >= 0, k-2 >= 0, -k+m-1 >= 0, 1 >= 0 }
-
-    7 7
-    1    1    0    0    0    0   -1
-    1   -1    0    0    1    0    0
-    1    0    1    0    0    0   -2
-    1    0   -1    0    0    1   -1
-    1    0    0    1    0    0   -2
-    1    0    0   -1    0    1   -1
-    1    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m) | i-1 >= 0, -i+l >= 0, j-2 >= 0, -j+m-1 >= 0, k-2 >= 0, -k+m-1 >= 0, 1 >= 0 }
-
-    7 7
-    1    1    0    0    0    0   -1
-    1   -1    0    0    1    0    0
-    1    0    1    0    0    0   -2
-    1    0   -1    0    0    1   -1
-    1    0    0    1    0    0   -2
-    1    0    0   -1    0    1   -1
-    1    0    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-2
-
-    8 14
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -2    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 14
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -2    0    0    0    0   -1
-    0    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/jacobi3.good.c b/cloog-0.17.0/test/reservoir/jacobi3.good.c
deleted file mode 100644
index 39cfce3..0000000
--- a/cloog-0.17.0/test/reservoir/jacobi3.good.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/jacobi3.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.03s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  if ((M >= 1) && (N >= 3)) {
-    for (c4=2;c4<=N-1;c4++) {
-      for (c6=2;c6<=N-1;c6++) {
-        S1(1,c4,c6) ;
-      }
-    }
-  }
-  if (N >= 3) {
-    for (c2=3;c2<=2*M;c2++) {
-      for (c4=2;c4<=N-1;c4++) {
-        for (c6=2;c6<=N-1;c6++) {
-          if (c2%2 == 0) {
-            S1(c2/2,c4,c6) ;
-          }
-        }
-      }
-      for (c4=2;c4<=N-1;c4++) {
-        for (c6=2;c6<=N-1;c6++) {
-          if ((c2+1)%2 == 0) {
-            i = (c2-1)/2 ;
-            S2((c2-1)/2,c4,c6) ;
-          }
-        }
-      }
-    }
-  }
-  if ((M >= 1) && (N >= 3)) {
-    c2 = 2*M+1 ;
-    for (c4=2;c4<=N-1;c4++) {
-      for (c6=2;c6<=N-1;c6++) {
-        S2(M,c4,c6) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/lim-lam1.c b/cloog-0.17.0/test/reservoir/lim-lam1.c
deleted file mode 100644
index 469117c..0000000
--- a/cloog-0.17.0/test/reservoir/lim-lam1.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/./reservoir/lim-lam1.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.01s. */
-S1(1,100);
-for (c2=-98;c2<=99;c2++) {
-  if (c2 <= 0) {
-    S1(1,-c2+1);
-  }
-  if (c2 >= 1) {
-    S2(c2,1);
-  }
-  for (c4=max(2,-2*c2+3);c4<=min(199,-2*c2+200);c4++) {
-    if (c4%2 == 0) {
-      S1((2*c2+c4)/2,c4/2);
-    }
-    if ((c4+1)%2 == 0) {
-      S2((2*c2+c4-1)/2,(c4+1)/2);
-    }
-  }
-  if (c2 <= 0) {
-    S1(c2+100,100);
-  }
-  if (c2 >= 1) {
-    S2(100,-c2+101);
-  }
-}
-S2(100,1);
diff --git a/cloog-0.17.0/test/reservoir/lim-lam1.cloog b/cloog-0.17.0/test/reservoir/lim-lam1.cloog
deleted file mode 100644
index 7a7c684..0000000
--- a/cloog-0.17.0/test/reservoir/lim-lam1.cloog
+++ /dev/null
@@ -1,54 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 2
-    1    1
-0
-
-# Number of statments
-2
-
-1
-# { (i,j) | i-1 >= 0, -i+100 >= 0, j-1 >= 0, -j+100 >= 0 }
-
-    4 4
-    1    1    0   -1
-    1   -1    0  100
-    1    0    1   -1
-    1    0   -1  100
-
-0 0 0
-1
-# { (i,j) | i-1 >= 0, -i+100 >= 0, j-1 >= 0, -j+100 >= 0 }
-
-    4 4
-    1    1    0   -1
-    1   -1    0  100
-    1    0    1   -1
-    1    0   -1  100
-
-0 0 0
-0
-# Scattering functions
-2
-
-    6 9
-    0    1    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    1    0
-    0    0    0    1    0    0    0    0    0
-    0    0    0    0    1    0    0   -2    0
-    0    0    0    0    0    1    0    0    0
-    1    0    0    0    0    0    0    0    1
-
-
-    6 9
-    0    1    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    1   -1
-    0    0    0    1    0    0    0    0    0
-    0    0    0    0    1    0    0   -2    1
-    0    0    0    0    0    1    0    0   -1
-    1    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/lim-lam1.good.c b/cloog-0.17.0/test/reservoir/lim-lam1.good.c
deleted file mode 100644
index cd6faf7..0000000
--- a/cloog-0.17.0/test/reservoir/lim-lam1.good.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/lim-lam1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int c2, c4;
-  /* Original iterators. */
-  int i, j;
-  S1(1,100) ;
-  for (c2=-98;c2<=0;c2++) {
-    c4 = -2*c2+2 ;
-    j = -c2+1 ;
-    S1(1,-c2+1) ;
-    for (c4=-2*c2+3;c4<=199;c4++) {
-      if (c4%2 == 0) {
-        i = (2*c2+c4)/2 ;
-        S1((2*c2+c4)/2,c4/2) ;
-      }
-      if ((c4+1)%2 == 0) {
-        i = (2*c2+c4-1)/2 ;
-        j = (c4+1)/2 ;
-        S2((2*c2+c4-1)/2,(c4+1)/2) ;
-      }
-    }
-    i = c2+100 ;
-    S1(c2+100,100) ;
-  }
-  for (c2=1;c2<=99;c2++) {
-    S2(c2,1) ;
-    for (c4=2;c4<=-2*c2+200;c4++) {
-      if (c4%2 == 0) {
-        i = (2*c2+c4)/2 ;
-        S1((2*c2+c4)/2,c4/2) ;
-      }
-      if ((c4+1)%2 == 0) {
-        i = (2*c2+c4-1)/2 ;
-        j = (c4+1)/2 ;
-        S2((2*c2+c4-1)/2,(c4+1)/2) ;
-      }
-    }
-    c4 = -2*c2+201 ;
-    j = -c2+101 ;
-    S2(100,-c2+101) ;
-  }
-  S2(100,1) ;
-}
diff --git a/cloog-0.17.0/test/reservoir/lim-lam2.c b/cloog-0.17.0/test/reservoir/lim-lam2.c
deleted file mode 100644
index ab1a32f..0000000
--- a/cloog-0.17.0/test/reservoir/lim-lam2.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/lim-lam2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-for (c2=1;c2<=M;c2++) {
-  S1(c2) ;
-}
-if (N >= 2) {
-  for (c2=1;c2<=M;c2++) {
-    for (c4=2;c4<=N;c4++) {
-      S2(c2,c4) ;
-    }
-  }
-}
-if (N >= 2) {
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=N-1;c4++) {
-      S3(c2,c4) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/lim-lam2.cloog b/cloog-0.17.0/test/reservoir/lim-lam2.cloog
deleted file mode 100755
index db50b74..0000000
--- a/cloog-0.17.0/test/reservoir/lim-lam2.cloog
+++ /dev/null
@@ -1,76 +0,0 @@
-# Language
-c
-
-# Context
-
-    3 4
-    1    1    0   -1
-    1    0    1   -1
-    1    0    0    1
-0
-
-# Number of statments
-3
-
-1
-# { (i,j,k) | i-1 >= 0, -i+j >= 0, 1 >= 0 }
-
-    3 5
-    1    1    0    0   -1
-    1   -1    1    0    0
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i-1 >= 0, -i+k >= 0, j-2 >= 0, -j+l >= 0, 1 >= 0 }
-
-    5 6
-    1    1    0    0    0   -1
-    1   -1    0    1    0    0
-    1    0    1    0    0   -2
-    1    0   -1    0    1    0
-    1    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i-1 >= 0, -i+k >= 0, j-1 >= 0, -j+l-1 >= 0, 1 >= 0 }
-
-    5 6
-    1    1    0    0    0   -1
-    1   -1    0    1    0    0
-    1    0    1    0    0   -1
-    1    0   -1    0    1   -1
-    1    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-3
-
-    6 10
-    0    1    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-
-    6 11
-    0    1    0    0    0    0    0    0    0    0   -1
-    0    0    1    0    0    0   -1    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    1
-
-
-    6 11
-    0    1    0    0    0    0    0    0    0    0   -2
-    0    0    1    0    0    0   -1    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0   -2
-    0    0    0    0    1    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/lim-lam2.good.c b/cloog-0.17.0/test/reservoir/lim-lam2.good.c
deleted file mode 100644
index 0ea3332..0000000
--- a/cloog-0.17.0/test/reservoir/lim-lam2.good.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/lim-lam2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int c2, c4;
-  /* Original iterators. */
-  int i, j;
-  for (c2=1;c2<=M;c2++) {
-    S1(c2) ;
-  }
-  if (N >= 2) {
-    for (c2=1;c2<=M;c2++) {
-      for (c4=2;c4<=N;c4++) {
-        S2(c2,c4) ;
-      }
-    }
-  }
-  if (N >= 2) {
-    for (c2=1;c2<=M;c2++) {
-      for (c4=1;c4<=N-1;c4++) {
-        S3(c2,c4) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/lim-lam3.c b/cloog-0.17.0/test/reservoir/lim-lam3.c
deleted file mode 100644
index c68a629..0000000
--- a/cloog-0.17.0/test/reservoir/lim-lam3.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Generated from ../../../git/cloog/test/reservoir/lim-lam3.cloog by CLooG 0.16.2-8-g1421b58 gmp bits in 0.03s. */
-S4(1);
-for (c2=9;c2<=min(13,5*M-1);c2++) {
-  if (c2 <= M+7) {
-    S2(c2-7,1);
-  }
-  if (c2 == 10) {
-    S4(2);
-  }
-  if (c2 <= 3*M+3) {
-    if (c2%3 == 0) {
-      S3((c2-3)/3,1);
-    }
-  }
-}
-for (c2=14;c2<=5*M-1;c2++) {
-  for (c4=max(2,ceild(c2-M-3,4));c4<=min(floord(c2-8,3),M-1);c4++) {
-    for (c6=max(1,ceild(c2-2*c4-M-5,2));c6<=min(floord(c2-3*c4-6,2),c4-1);c6++) {
-      S1(c2-2*c4-2*c6-5,c4,c6);
-    }
-  }
-  for (c4=max(1,ceild(c2-M-3,4));c4<=floord(c2-4,5);c4++) {
-    S2(c2-4*c4-3,c4);
-  }
-  if (c2%5 == 0) {
-    S4(c2/5);
-  }
-  for (c4=max(1,ceild(c2-3*M-1,2));c4<=floord(c2-4,5);c4++) {
-    if ((c2+c4+2)%3 == 0) {
-      S3((c2-2*c4-1)/3,c4);
-    }
-  }
-}
-if (M >= 2) {
-  S4(M);
-}
diff --git a/cloog-0.17.0/test/reservoir/lim-lam3.cloog b/cloog-0.17.0/test/reservoir/lim-lam3.cloog
deleted file mode 100755
index 0d3d4a5..0000000
--- a/cloog-0.17.0/test/reservoir/lim-lam3.cloog
+++ /dev/null
@@ -1,101 +0,0 @@
-# Language
-c
-
-# Context
-
-    2 3
-    1    1   -1
-    1    0    1
-0
-
-# Number of statments
-4
-
-1
-# { (i,j,k,l) | -i+l >= 0, i-j-1 >= 0, k-1 >= 0, j-k-1 >= 0, 1 >= 0 }
-
-    5 6
-    1   -1    0    0    1    0
-    1    1   -1    0    0   -1
-    1    0    0    1    0   -1
-    1    0    1   -1    0   -1
-    1    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | -i+k >= 0, j-1 >= 0, i-j-1 >= 0, 1 >= 0 }
-
-    4 5
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    1   -1    0   -1
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | -i+k >= 0, j-1 >= 0, i-j-1 >= 0, 1 >= 0 }
-
-    4 5
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    1   -1    0   -1
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j) | i-1 >= 0, -i+j >= 0, 1 >= 0 }
-
-    3 4
-    1    1    0   -1
-    1   -1    1    0
-    1    0    0    1
-
-0 0 0
-0
-# Scattering functions
-4
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1   -2   -2    0   -5
-    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 12
-    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1   -4    0   -3
-    0    0    0    1    0    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 12
-    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -3   -2    0   -1
-    0    0    0    1    0    0    0    0    0    0    0   -2
-    0    0    0    0    1    0    0    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 11
-    0    1    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -5    0    0
-    0    0    0    1    0    0    0    0    0    0   -2
-    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0
-    1    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/lim-lam3.good.c b/cloog-0.17.0/test/reservoir/lim-lam3.good.c
deleted file mode 100644
index 0cddca9..0000000
--- a/cloog-0.17.0/test/reservoir/lim-lam3.good.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/lim-lam3.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.04s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-#define S4(i) { hash(4); hash(i); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  for (c2=5;c2<=min(5*M,8);c2++) {
-    if (c2%5 == 0) {
-      S4(c2/5) ;
-    }
-  }
-  for (c2=9;c2<=min(13,5*M-1);c2++) {
-    for (c4=max(1,ceild(c2-M-3,4));c4<=floord(c2-4,5);c4++) {
-      i = c2-4*c4-3 ;
-      S2(c2-4*c4-3,c4) ;
-    }
-    if (c2%5 == 0) {
-      S4(c2/5) ;
-    }
-    for (c4=max(1,ceild(c2-3*M-1,2));c4<=floord(c2-4,5);c4++) {
-      if ((c2+c4+2)%3 == 0) {
-        i = (c2-2*c4-1)/3 ;
-        S3((c2-2*c4-1)/3,c4) ;
-      }
-    }
-  }
-  for (c2=14;c2<=5*M-1;c2++) {
-    for (c4=max(2,ceild(c2-M-3,4));c4<=min(M-1,floord(c2-8,3));c4++) {
-      for (c6=max(1,ceild(c2-2*c4-M-5,2));c6<=min(c4-1,floord(c2-3*c4-6,2));c6++) {
-        i = c2-2*c4-2*c6-5 ;
-        S1(c2-2*c4-2*c6-5,c4,c6) ;
-      }
-    }
-    for (c4=max(ceild(c2-M-3,4),1);c4<=floord(c2-4,5);c4++) {
-      i = c2-4*c4-3 ;
-      S2(c2-4*c4-3,c4) ;
-    }
-    if (c2%5 == 0) {
-      S4(c2/5) ;
-    }
-    for (c4=max(ceild(c2-3*M-1,2),1);c4<=floord(c2-4,5);c4++) {
-      if ((c2+c4+2)%3 == 0) {
-        i = (c2-2*c4-1)/3 ;
-        S3((c2-2*c4-1)/3,c4) ;
-      }
-    }
-  }
-  if (M >= 2) {
-    c2 = 5*M ;
-    S4(M) ;
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/lim-lam4.c b/cloog-0.17.0/test/reservoir/lim-lam4.c
deleted file mode 100644
index b2c0845..0000000
--- a/cloog-0.17.0/test/reservoir/lim-lam4.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/lim-lam4.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.04s. */
-if (M >= 2) {
-  S1(1,0,0) ;
-  for (c2=2;c2<=2*M-2;c2++) {
-    for (c4=max(-M+1,-c2+1);c4<=-1;c4++) {
-      for (i=max(1,c2-M+1);i<=min(M-1,c2+c4);i++) {
-        S1(i,c2+c4-i,-c4) ;
-      }
-      for (c6=max(-c4,c2-M+1);c6<=min(M-1,c2-1);c6++) {
-        S2(c2-c6,c4+c6,c6) ;
-      }
-    }
-    for (i=max(1,c2-M+1);i<=min(c2,M-1);i++) {
-      S1(i,c2-i,0) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/lim-lam4.cloog b/cloog-0.17.0/test/reservoir/lim-lam4.cloog
deleted file mode 100755
index 0aa66e3..0000000
--- a/cloog-0.17.0/test/reservoir/lim-lam4.cloog
+++ /dev/null
@@ -1,62 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statments
-2
-
-1
-# { (i,j,k,l) | i-1 >= 0, -i+l-1 >= 0, j >= 0, k >= 0, -j-k+l-1 >= 0, 1 >= 0 }
-
-    6 6
-    1    1    0    0    0   -1
-    1   -1    0    0    1   -1
-    1    0    1    0    0    0
-    1    0    0    1    0    0
-    1    0   -1   -1    1   -1
-    1    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i-1 >= 0, -i+l-1 >= 0, j >= 0, -j+k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    6 6
-    1    1    0    0    0   -1
-    1   -1    0    0    1   -1
-    1    0    1    0    0    0
-    1    0   -1    1    0   -1
-    1    0    0   -1    1   -1
-    1    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-2
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1   -1   -1    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0    0    1    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0   -1    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    1    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/lim-lam4.good.c b/cloog-0.17.0/test/reservoir/lim-lam4.good.c
deleted file mode 100644
index afb05ec..0000000
--- a/cloog-0.17.0/test/reservoir/lim-lam4.good.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/lim-lam4.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  if (M >= 2) {
-    S1(1,0,0) ;
-  }
-  for (c2=2;c2<=2*M-2;c2++) {
-    for (c4=max(-M+1,-c2+1);c4<=-1;c4++) {
-      for (i=max(1,c2-M+1);i<=min(c2+c4,M-1);i++) {
-        j = c2+c4-i ;
-        S1(i,c2+c4-i,-c4) ;
-      }
-      for (c6=max(-c4,c2-M+1);c6<=min(c2-1,M-1);c6++) {
-        i = c2-c6 ;
-        j = c4+c6 ;
-        S2(c2-c6,c4+c6,c6) ;
-      }
-    }
-    for (i=max(1,c2-M+1);i<=min(M-1,c2);i++) {
-      j = c2-i ;
-      S1(i,c2-i,0) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/lim-lam5.c b/cloog-0.17.0/test/reservoir/lim-lam5.c
deleted file mode 100644
index e6b0a57..0000000
--- a/cloog-0.17.0/test/reservoir/lim-lam5.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/lim-lam5.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if (M >= 1) {
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S1(c2,c4) ;
-    }
-  }
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S2(c2,c4) ;
-    }
-  }
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S3(c2,c4) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/lim-lam5.cloog b/cloog-0.17.0/test/reservoir/lim-lam5.cloog
deleted file mode 100755
index c5d6ef9..0000000
--- a/cloog-0.17.0/test/reservoir/lim-lam5.cloog
+++ /dev/null
@@ -1,76 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statments
-3
-
-1
-# { (i,j,k) | i-1 >= 0, -i+k >= 0, j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 5
-    1    1    0    0   -1
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    0   -1    1    0
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | i-1 >= 0, -i+k >= 0, j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 5
-    1    1    0    0   -1
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    0   -1    1    0
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | i-1 >= 0, -i+k >= 0, j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 5
-    1    1    0    0   -1
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    0   -1    1    0
-    1    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-3
-
-    6 10
-    0    1    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-
-    6 10
-    0    1    0    0    0    0    0    0    0   -1
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-
-    6 10
-    0    1    0    0    0    0    0    0    0   -2
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/lim-lam5.good.c b/cloog-0.17.0/test/reservoir/lim-lam5.good.c
deleted file mode 100644
index 69d8805..0000000
--- a/cloog-0.17.0/test/reservoir/lim-lam5.good.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/lim-lam5.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4;
-  /* Original iterators. */
-  int i, j;
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S1(c2,c4) ;
-    }
-  }
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S2(c2,c4) ;
-    }
-  }
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S3(c2,c4) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/lim-lam6.c b/cloog-0.17.0/test/reservoir/lim-lam6.c
deleted file mode 100644
index 05baff1..0000000
--- a/cloog-0.17.0/test/reservoir/lim-lam6.c
+++ /dev/null
@@ -1,13 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/lim-lam6.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if (M >= 1) {
-  for (c2=0;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S1(c2,c4) ;
-    }
-  }
-  for (c2=0;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S2(c4,c2) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/lim-lam6.cloog b/cloog-0.17.0/test/reservoir/lim-lam6.cloog
deleted file mode 100755
index a1bf181..0000000
--- a/cloog-0.17.0/test/reservoir/lim-lam6.cloog
+++ /dev/null
@@ -1,56 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statments
-2
-
-1
-# { (i,j,k) | i >= 0, -i+k >= 0, j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 5
-    1    1    0    0    0
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    0   -1    1    0
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | i-1 >= 0, -i+k >= 0, j >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 5
-    1    1    0    0   -1
-    1   -1    0    1    0
-    1    0    1    0    0
-    1    0   -1    1    0
-    1    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-2
-
-    6 10
-    0    1    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-
-    6 10
-    0    1    0    0    0    0    0    0    0   -1
-    0    0    1    0    0    0    0   -1    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/lim-lam6.good.c b/cloog-0.17.0/test/reservoir/lim-lam6.good.c
deleted file mode 100644
index f49ab57..0000000
--- a/cloog-0.17.0/test/reservoir/lim-lam6.good.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/lim-lam6.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4;
-  /* Original iterators. */
-  int i, j;
-  if (M >= 1) {
-    for (c2=0;c2<=M;c2++) {
-      for (c4=1;c4<=M;c4++) {
-        S1(c2,c4) ;
-      }
-    }
-  }
-  if (M >= 1) {
-    for (c2=0;c2<=M;c2++) {
-      for (c4=1;c4<=M;c4++) {
-        S2(c4,c2) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/liu-zhuge1.c b/cloog-0.17.0/test/reservoir/liu-zhuge1.c
deleted file mode 100644
index b0f8602..0000000
--- a/cloog-0.17.0/test/reservoir/liu-zhuge1.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/./reservoir/liu-zhuge1.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.02s. */
-if ((M >= 0) && (N >= 0)) {
-  for (c2=-4;c2<=min(-1,3*M+N-4);c2++) {
-    for (c4=max(0,c2-3*M+4);c4<=min(N,c2+4);c4++) {
-      if ((c2+2*c4+1)%3 == 0) {
-        S1((c2-c4+4)/3,c4);
-      }
-    }
-  }
-  for (c2=0;c2<=3*M+N-4;c2++) {
-    for (c4=max(0,c2-3*M);c4<=min(c2,c2-3*M+3);c4++) {
-      if ((c2+2*c4)%3 == 0) {
-        S2((c2-c4)/3,c4);
-      }
-    }
-    for (c4=max(0,c2-3*M+4);c4<=min(N,c2);c4++) {
-      if ((c2+2*c4)%3 == 0) {
-        S2((c2-c4)/3,c4);
-      }
-      if ((c2+2*c4+1)%3 == 0) {
-        S1((c2-c4+4)/3,c4);
-      }
-    }
-    for (c4=max(c2+1,c2-3*M+4);c4<=min(N,c2+4);c4++) {
-      if ((c2+2*c4+1)%3 == 0) {
-        S1((c2-c4+4)/3,c4);
-      }
-    }
-    for (c4=max(0,c2-3*M);c4<=min(N,c2);c4++) {
-      if ((c2+2*c4)%3 == 0) {
-        S3((c2-c4)/3,c4);
-      }
-    }
-  }
-  for (c2=max(0,3*M+N-3);c2<=3*M+N;c2++) {
-    for (c4=max(0,c2-3*M);c4<=min(N,c2);c4++) {
-      if ((c2+2*c4)%3 == 0) {
-        S2((c2-c4)/3,c4);
-      }
-    }
-    for (c4=max(0,c2-3*M);c4<=min(N,c2);c4++) {
-      if ((c2+2*c4)%3 == 0) {
-        S3((c2-c4)/3,c4);
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/liu-zhuge1.cloog b/cloog-0.17.0/test/reservoir/liu-zhuge1.cloog
deleted file mode 100755
index e28cb4b..0000000
--- a/cloog-0.17.0/test/reservoir/liu-zhuge1.cloog
+++ /dev/null
@@ -1,76 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 4
-    1    0    0    1
-0
-
-# Number of statments
-3
-
-1
-# { (i,j,k,l) | i >= 0, -i+k >= 0, j >= 0, -j+l >= 0, 1 >= 0 }
-
-    5 6
-    1    1    0    0    0    0
-    1   -1    0    1    0    0
-    1    0    1    0    0    0
-    1    0   -1    0    1    0
-    1    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i >= 0, -i+k >= 0, j >= 0, -j+l >= 0, 1 >= 0 }
-
-    5 6
-    1    1    0    0    0    0
-    1   -1    0    1    0    0
-    1    0    1    0    0    0
-    1    0   -1    0    1    0
-    1    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i >= 0, -i+k >= 0, j >= 0, -j+l >= 0, 1 >= 0 }
-
-    5 6
-    1    1    0    0    0    0
-    1   -1    0    1    0    0
-    1    0    1    0    0    0
-    1    0   -1    0    1    0
-    1    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-3
-
-    6 11
-    0    1    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -3   -1    0    0    4
-    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    1
-
-
-    6 11
-    0    1    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -3   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    1
-
-
-    6 11
-    0    1    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -3   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/liu-zhuge1.good.c b/cloog-0.17.0/test/reservoir/liu-zhuge1.good.c
deleted file mode 100644
index 2b07ade..0000000
--- a/cloog-0.17.0/test/reservoir/liu-zhuge1.good.c
+++ /dev/null
@@ -1,168 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/liu-zhuge1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.05s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j) { hash(3); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int c2, c4;
-  /* Original iterators. */
-  int i, j;
-  if ((M >= 0) && (N >= 0)) {
-    for (c2=-4;c2<=min(-1,3*M+N-4);c2++) {
-      for (c4=max(0,c2-3*M+4);c4<=min(c2+4,N);c4++) {
-        if ((c2+2*c4+1)%3 == 0) {
-          i = (c2-c4+4)/3 ;
-          S1((c2-c4+4)/3,c4) ;
-        }
-      }
-    }
-  }
-  if ((M <= 1) && (M >= 0)) {
-    for (c2=0;c2<=3*M+N-4;c2++) {
-      for (c4=max(c2-3*M,0);c4<=c2;c4++) {
-        if ((c2+2*c4)%3 == 0) {
-          i = (c2-c4)/3 ;
-          S2((c2-c4)/3,c4) ;
-        }
-      }
-      for (c4=c2-3*M+4;c4<=min(c2+4,N);c4++) {
-        if ((c2+2*c4+1)%3 == 0) {
-          i = (c2-c4+4)/3 ;
-          S1((c2-c4+4)/3,c4) ;
-        }
-      }
-      for (c4=max(0,c2-3*M);c4<=c2;c4++) {
-        if ((c2+2*c4)%3 == 0) {
-          i = (c2-c4)/3 ;
-          S3((c2-c4)/3,c4) ;
-        }
-      }
-    }
-  }
-  for (c2=0;c2<=min(3*M-4,N-1);c2++) {
-    for (c4=0;c4<=c2;c4++) {
-      if ((c2+2*c4)%3 == 0) {
-        i = (c2-c4)/3 ;
-        S2((c2-c4)/3,c4) ;
-      }
-      if ((c2+2*c4+1)%3 == 0) {
-        i = (c2-c4+4)/3 ;
-        S1((c2-c4+4)/3,c4) ;
-      }
-    }
-    for (c4=c2+1;c4<=min(c2+4,N);c4++) {
-      if ((c2+2*c4+1)%3 == 0) {
-        i = (c2-c4+4)/3 ;
-        S1((c2-c4+4)/3,c4) ;
-      }
-    }
-    for (c4=0;c4<=c2;c4++) {
-      if ((c2+2*c4)%3 == 0) {
-        i = (c2-c4)/3 ;
-        S3((c2-c4)/3,c4) ;
-      }
-    }
-  }
-  if (M >= 2) {
-    for (c2=3*M-3;c2<=N-1;c2++) {
-      for (c4=max(c2-3*M,0);c4<=c2-3*M+3;c4++) {
-        if ((c2+2*c4)%3 == 0) {
-          i = (c2-c4)/3 ;
-          S2((c2-c4)/3,c4) ;
-        }
-      }
-      for (c4=c2-3*M+4;c4<=c2;c4++) {
-        if ((c2+2*c4)%3 == 0) {
-          i = (c2-c4)/3 ;
-          S2((c2-c4)/3,c4) ;
-        }
-        if ((c2+2*c4+1)%3 == 0) {
-          i = (c2-c4+4)/3 ;
-          S1((c2-c4+4)/3,c4) ;
-        }
-      }
-      for (c4=c2+1;c4<=min(c2+4,N);c4++) {
-        if ((c2+2*c4+1)%3 == 0) {
-          i = (c2-c4+4)/3 ;
-          S1((c2-c4+4)/3,c4) ;
-        }
-      }
-      for (c4=max(0,c2-3*M);c4<=c2;c4++) {
-        if ((c2+2*c4)%3 == 0) {
-          i = (c2-c4)/3 ;
-          S3((c2-c4)/3,c4) ;
-        }
-      }
-    }
-  }
-  if (N >= 0) {
-    for (c2=N;c2<=3*M-4;c2++) {
-      for (c4=0;c4<=N;c4++) {
-        if ((c2+2*c4)%3 == 0) {
-          i = (c2-c4)/3 ;
-          S2((c2-c4)/3,c4) ;
-        }
-        if ((c2+2*c4+1)%3 == 0) {
-          i = (c2-c4+4)/3 ;
-          S1((c2-c4+4)/3,c4) ;
-        }
-      }
-      for (c4=0;c4<=N;c4++) {
-        if ((c2+2*c4)%3 == 0) {
-          i = (c2-c4)/3 ;
-          S3((c2-c4)/3,c4) ;
-        }
-      }
-    }
-  }
-  for (c2=max(3*M-3,N);c2<=3*M+N-4;c2++) {
-    for (c4=max(c2-3*M,0);c4<=c2-3*M+3;c4++) {
-      if ((c2+2*c4)%3 == 0) {
-        i = (c2-c4)/3 ;
-        S2((c2-c4)/3,c4) ;
-      }
-    }
-    for (c4=c2-3*M+4;c4<=N;c4++) {
-      if ((c2+2*c4)%3 == 0) {
-        i = (c2-c4)/3 ;
-        S2((c2-c4)/3,c4) ;
-      }
-      if ((c2+2*c4+1)%3 == 0) {
-        i = (c2-c4+4)/3 ;
-        S1((c2-c4+4)/3,c4) ;
-      }
-    }
-    for (c4=max(0,c2-3*M);c4<=N;c4++) {
-      if ((c2+2*c4)%3 == 0) {
-        i = (c2-c4)/3 ;
-        S3((c2-c4)/3,c4) ;
-      }
-    }
-  }
-  if ((M >= 0) && (N >= 0)) {
-    for (c2=max(3*M+N-3,0);c2<=3*M+N;c2++) {
-      for (c4=max(0,c2-3*M);c4<=min(c2,N);c4++) {
-        if ((c2+2*c4)%3 == 0) {
-          i = (c2-c4)/3 ;
-          S2((c2-c4)/3,c4) ;
-        }
-      }
-      for (c4=max(0,c2-3*M);c4<=min(c2,N);c4++) {
-        if ((c2+2*c4)%3 == 0) {
-          i = (c2-c4)/3 ;
-          S3((c2-c4)/3,c4) ;
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/loechner3.c b/cloog-0.17.0/test/reservoir/loechner3.c
deleted file mode 100644
index c3967b8..0000000
--- a/cloog-0.17.0/test/reservoir/loechner3.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/loechner3.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if (M >= 1) {
-  for (c2=1;c2<=M;c2++) {
-    for (c4=2;c4<=c2+M;c4++) {
-      for (c6=max(1,-c2+c4);c6<=min(M,c4-1);c6++) {
-        S1(c2,c6,c4-c6) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/loechner3.cloog b/cloog-0.17.0/test/reservoir/loechner3.cloog
deleted file mode 100755
index 04b34cb..0000000
--- a/cloog-0.17.0/test/reservoir/loechner3.cloog
+++ /dev/null
@@ -1,39 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statments
-1
-
-1
-# { (i,j,k,l) | -i+l >= 0, j-1 >= 0, -j+l >= 0, k-1 >= 0, i-k >= 0, 1 >= 0 }
-
-    6 6
-    1   -1    0    0    1    0
-    1    0    1    0    0   -1
-    1    0   -1    0    1    0
-    1    0    0    1    0   -1
-    1    1    0   -1    0    0
-    1    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-1
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1   -1    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0   -1    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/loechner3.good.c b/cloog-0.17.0/test/reservoir/loechner3.good.c
deleted file mode 100644
index 377fb46..0000000
--- a/cloog-0.17.0/test/reservoir/loechner3.good.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/loechner3.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  for (c2=1;c2<=M;c2++) {
-    for (c4=2;c4<=c2+M;c4++) {
-      for (c6=max(1,-c2+c4);c6<=min(M,c4-1);c6++) {
-        k = c4-c6 ;
-        S1(c2,c6,c4-c6) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/loechner4.c b/cloog-0.17.0/test/reservoir/loechner4.c
deleted file mode 100644
index 8c4b9c7..0000000
--- a/cloog-0.17.0/test/reservoir/loechner4.c
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/loechner4.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.02s. */
-if (M >= 1) {
-  for (c2=2;c2<=2*M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      for (c6=1;c6<=M;c6++) {
-        for (c8=max(1,c2-M);c8<=min(M,c2-1);c8++) {
-          S1(c6,c4,c8,c2-c8) ;
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/loechner4.cloog b/cloog-0.17.0/test/reservoir/loechner4.cloog
deleted file mode 100755
index 503f56a..0000000
--- a/cloog-0.17.0/test/reservoir/loechner4.cloog
+++ /dev/null
@@ -1,44 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statments
-1
-
-1
-# { (i,j,k,l,m) | i-1 >= 0, -i+m >= 0, j-1 >= 0, -j+m >= 0, k-1 >= 0, -k+m >= 0, l-1 >= 0, -l+m >= 0, 1 >= 0 }
-
-    9 7
-    1    1    0    0    0    0   -1
-    1   -1    0    0    0    1    0
-    1    0    1    0    0    0   -1
-    1    0   -1    0    0    1    0
-    1    0    0    1    0    0   -1
-    1    0    0   -1    0    1    0
-    1    0    0    0    1    0   -1
-    1    0    0    0   -1    1    0
-    1    0    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-1
-
-   10 16
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0    0    0    0    0   -1   -1    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    0    0    0    0    0    0    1    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/loechner4.good.c b/cloog-0.17.0/test/reservoir/loechner4.good.c
deleted file mode 100644
index ecd109e..0000000
--- a/cloog-0.17.0/test/reservoir/loechner4.good.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/loechner4.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k,l) { hash(1); hash(i); hash(j); hash(k); hash(l); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6, c8;
-  /* Original iterators. */
-  int i, j, k, l;
-  for (c2=2;c2<=2*M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      for (c6=1;c6<=M;c6++) {
-        for (c8=max(1,c2-M);c8<=min(c2-1,M);c8++) {
-          l = c2-c8 ;
-          S1(c6,c4,c8,c2-c8) ;
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/loechner5.c b/cloog-0.17.0/test/reservoir/loechner5.c
deleted file mode 100644
index 3ba1f5b..0000000
--- a/cloog-0.17.0/test/reservoir/loechner5.c
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/loechner5.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.02s. */
-if (M >= 1) {
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      for (c6=1;c6<=M;c6++) {
-        for (c8=1;c8<=M;c8++) {
-          S1(c4,c6,c2,c8) ;
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/loechner5.cloog b/cloog-0.17.0/test/reservoir/loechner5.cloog
deleted file mode 100755
index f208435..0000000
--- a/cloog-0.17.0/test/reservoir/loechner5.cloog
+++ /dev/null
@@ -1,44 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statments
-1
-
-1
-# { (i,j,k,l,m) | i-1 >= 0, -i+m >= 0, j-1 >= 0, -j+m >= 0, k-1 >= 0, -k+m >= 0, l-1 >= 0, -l+m >= 0, 1 >= 0 }
-
-    9 7
-    1    1    0    0    0    0   -1
-    1   -1    0    0    0    1    0
-    1    0    1    0    0    0   -1
-    1    0   -1    0    0    1    0
-    1    0    0    1    0    0   -1
-    1    0    0   -1    0    1    0
-    1    0    0    0    1    0   -1
-    1    0    0    0   -1    1    0
-    1    0    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-1
-
-   10 16
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0    0    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0    0   -1    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    0    1    0    0    0    0   -1    0    0
-    0    0    0    0    0    0    0    0    0    1    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/loechner5.good.c b/cloog-0.17.0/test/reservoir/loechner5.good.c
deleted file mode 100644
index 937c118..0000000
--- a/cloog-0.17.0/test/reservoir/loechner5.good.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/loechner5.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k,l) { hash(1); hash(i); hash(j); hash(k); hash(l); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6, c8;
-  /* Original iterators. */
-  int i, j, k, l;
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      for (c6=1;c6<=M;c6++) {
-        for (c8=1;c8<=M;c8++) {
-          S1(c4,c6,c2,c8) ;
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/mg-interp.c b/cloog-0.17.0/test/reservoir/mg-interp.c
deleted file mode 100644
index 3ed1fcf..0000000
--- a/cloog-0.17.0/test/reservoir/mg-interp.c
+++ /dev/null
@@ -1,219 +0,0 @@
-/* Generated from ../../../git/cloog/test/reservoir/mg-interp.cloog by CLooG 0.16.2-5-g590827b gmp bits in 0.29s. */
-if ((M >= 2) && (N >= 2)) {
-  for (c2=1;c2<=O-1;c2++) {
-    for (c6=1;c6<=M;c6++) {
-      S1(c2,1,c6);
-    }
-    if (N == 2) {
-      for (c6=1;c6<=M-1;c6++) {
-        S6(c2,1,c6);
-        S7(c2,1,c6);
-      }
-    }
-    if (N >= 3) {
-      for (c6=1;c6<=M-1;c6++) {
-        S6(c2,1,c6);
-        S7(c2,1,c6);
-      }
-    }
-    if (N == 2) {
-      for (c6=1;c6<=M;c6++) {
-        S3(c2,1,c6);
-      }
-    }
-    if (N == 2) {
-      for (c6=1;c6<=M-1;c6++) {
-        S11(c2,1,c6);
-      }
-    }
-    if (N >= 3) {
-      for (c6=1;c6<=M;c6++) {
-        S3(c2,1,c6);
-      }
-      for (c6=1;c6<=M;c6++) {
-        S1(c2,2,c6);
-      }
-    }
-    if (N == 3) {
-      for (c6=1;c6<=M-1;c6++) {
-        S6(c2,2,c6);
-        S7(c2,2,c6);
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S11(c2,1,c6);
-      }
-    }
-    if (N >= 4) {
-      for (c6=1;c6<=M-1;c6++) {
-        S6(c2,2,c6);
-        S7(c2,2,c6);
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S11(c2,1,c6);
-      }
-    }
-    for (c4=3;c4<=2*N-5;c4++) {
-      for (c6=1;c6<=M-1;c6++) {
-        if ((c4+1)%2 == 0) {
-          S10(c2,(c4-1)/2,c6);
-        }
-      }
-      for (c6=1;c6<=M;c6++) {
-        if ((c4+1)%2 == 0) {
-          S3(c2,(c4+1)/2,c6);
-        }
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        if (c4%2 == 0) {
-          S6(c2,(c4+2)/2,c6);
-        }
-        if ((c4+1)%2 == 0) {
-          S1(c2,(c4+3)/2,c6);
-        }
-        if (c4%2 == 0) {
-          S7(c2,(c4+2)/2,c6);
-        }
-      }
-      if ((c4+1)%2 == 0) {
-        S1(c2,(c4+3)/2,M);
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        if (c4%2 == 0) {
-          S11(c2,c4/2,c6);
-        }
-      }
-    }
-    if (N >= 4) {
-      for (c6=1;c6<=M-1;c6++) {
-        S6(c2,N-1,c6);
-        S7(c2,N-1,c6);
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S11(c2,N-2,c6);
-      }
-    }
-    if (N >= 3) {
-      for (c6=1;c6<=M-1;c6++) {
-        S10(c2,N-2,c6);
-      }
-      for (c6=1;c6<=M;c6++) {
-        S3(c2,N-1,c6);
-      }
-    }
-    if (N >= 3) {
-      for (c6=1;c6<=M-1;c6++) {
-        S11(c2,N-1,c6);
-      }
-    }
-    for (c6=1;c6<=M-1;c6++) {
-      S10(c2,N-1,c6);
-    }
-  }
-}
-if ((M == 1) && (N >= 2)) {
-  for (c2=1;c2<=O-1;c2++) {
-    S1(c2,1,1);
-    for (c4=1;c4<=2*N-5;c4++) {
-      if ((c4+1)%2 == 0) {
-        S3(c2,(c4+1)/2,1);
-      }
-      if ((c4+1)%2 == 0) {
-        S1(c2,(c4+3)/2,1);
-      }
-    }
-    S3(c2,N-1,1);
-  }
-}
-if ((M >= 2) && (N >= 2)) {
-  for (c2=1;c2<=O-1;c2++) {
-    for (c6=1;c6<=M;c6++) {
-      S2(c2,1,c6);
-    }
-    for (c6=1;c6<=M-1;c6++) {
-      S8(c2,1,c6);
-    }
-    for (c4=3;c4<=2*N-2;c4++) {
-      for (c6=1;c6<=M;c6++) {
-        if (c4%2 == 0) {
-          S2(c2,c4/2,c6);
-        }
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        if (c4%2 == 0) {
-          S8(c2,c4/2,c6);
-        }
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        if ((c4+1)%2 == 0) {
-          S9(c2,(c4-1)/2,c6);
-        }
-      }
-    }
-    for (c6=1;c6<=M-1;c6++) {
-      S9(c2,N-1,c6);
-    }
-  }
-}
-if ((M == 1) && (N >= 2)) {
-  for (c2=1;c2<=O-1;c2++) {
-    for (c4=2;c4<=2*N-2;c4++) {
-      if (c4%2 == 0) {
-        S2(c2,c4/2,1);
-      }
-    }
-  }
-}
-if ((M >= 2) && (N >= 2)) {
-  for (c2=1;c2<=O-1;c2++) {
-    for (c4=1;c4<=N-1;c4++) {
-      for (c6=1;c6<=M-1;c6++) {
-        S4(c2,c4,c6);
-      }
-    }
-  }
-}
-if ((M >= 2) && (N >= 2)) {
-  for (c2=1;c2<=O-1;c2++) {
-    for (c4=1;c4<=N-1;c4++) {
-      for (c6=1;c6<=M-1;c6++) {
-        S5(c2,c4,c6);
-      }
-    }
-  }
-}
-if ((M >= P+1) && (N >= Q+1)) {
-  for (c2=R;c2<=O-1;c2++) {
-    for (c4=Q;c4<=N-1;c4++) {
-      for (c6=P;c6<=M-1;c6++) {
-        S12(c2,c4,c6);
-      }
-    }
-  }
-}
-if ((M >= 2) && (N >= Q+1)) {
-  for (c2=R;c2<=O-1;c2++) {
-    for (c4=Q;c4<=N-1;c4++) {
-      for (c6=1;c6<=M-1;c6++) {
-        S13(c2,c4,c6);
-      }
-    }
-  }
-}
-if ((M >= P+1) && (N >= 2)) {
-  for (c2=R;c2<=O-1;c2++) {
-    for (c4=1;c4<=N-1;c4++) {
-      for (c6=P;c6<=M-1;c6++) {
-        S14(c2,c4,c6);
-      }
-    }
-  }
-}
-if ((M >= 2) && (N >= 2)) {
-  for (c2=R;c2<=O-1;c2++) {
-    for (c4=1;c4<=N-1;c4++) {
-      for (c6=1;c6<=M-1;c6++) {
-        S15(c2,c4,c6);
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/mg-interp.cloog b/cloog-0.17.0/test/reservoir/mg-interp.cloog
deleted file mode 100755
index 9d08463..0000000
--- a/cloog-0.17.0/test/reservoir/mg-interp.cloog
+++ /dev/null
@@ -1,376 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 11
-    1    0    0    0    0    0    0    0    0    0    1
-0
-
-# Number of statments
-15
-
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-q >= 0, -i+n-1 >= 0, j-p >= 0, -j+m-1 >= 0, k-o >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0   -1    0    0    0    0
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0   -1    0    0    0    0    0
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0   -1    0    0    0    0    0    0
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-q >= 0, -i+n-1 >= 0, j-p >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0   -1    0    0    0    0
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0   -1    0    0    0    0    0
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-q >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-o >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0   -1    0    0    0    0
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0   -1    0    0    0    0    0    0
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-q >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0   -1    0    0    0    0
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-15
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    0    0    0    0    0    0    3
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -2
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    0    0    0    0    0    0    1
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0   -2
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -2
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -3
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    0    0    0    0    0    0    2
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -2
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    0    0    0    0    0    0    2
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -2
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -3
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -4
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -4
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -5
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -6
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -7
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/mg-interp.good.c b/cloog-0.17.0/test/reservoir/mg-interp.good.c
deleted file mode 100644
index 7f919c8..0000000
--- a/cloog-0.17.0/test/reservoir/mg-interp.good.c
+++ /dev/null
@@ -1,318 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/mg-interp.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 1.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-#define S3(i,j,k) { hash(3); hash(i); hash(j); hash(k); }
-#define S4(i,j,k) { hash(4); hash(i); hash(j); hash(k); }
-#define S5(i,j,k) { hash(5); hash(i); hash(j); hash(k); }
-#define S6(i,j,k) { hash(6); hash(i); hash(j); hash(k); }
-#define S7(i,j,k) { hash(7); hash(i); hash(j); hash(k); }
-#define S8(i,j,k) { hash(8); hash(i); hash(j); hash(k); }
-#define S9(i,j,k) { hash(9); hash(i); hash(j); hash(k); }
-#define S10(i,j,k) { hash(10); hash(i); hash(j); hash(k); }
-#define S11(i,j,k) { hash(11); hash(i); hash(j); hash(k); }
-#define S12(i,j,k) { hash(12); hash(i); hash(j); hash(k); }
-#define S13(i,j,k) { hash(13); hash(i); hash(j); hash(k); }
-#define S14(i,j,k) { hash(14); hash(i); hash(j); hash(k); }
-#define S15(i,j,k) { hash(15); hash(i); hash(j); hash(k); }
-
-void test(int M, int N, int O, int P, int Q, int R, int S, int T, int U)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  if ((M >= 2) && (N >= 4)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c6=1;c6<=M;c6++) {
-        S1(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S6(c2,1,c6) ;
-        S7(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M;c6++) {
-        S3(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S1(c2,2,c6) ;
-      }
-      S1(c2,2,M) ;
-      for (c6=1;c6<=M-1;c6++) {
-        S6(c2,2,c6) ;
-        S7(c2,2,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S11(c2,1,c6) ;
-      }
-      for (c4=3;c4<=2*N-5;c4++) {
-        for (c6=1;c6<=M-1;c6++) {
-          if ((c4+1)%2 == 0) {
-            j = (c4-1)/2 ;
-            S10(c2,(c4-1)/2,c6) ;
-          }
-        }
-        for (c6=1;c6<=M;c6++) {
-          if ((c4+1)%2 == 0) {
-            j = (c4+1)/2 ;
-            S3(c2,(c4+1)/2,c6) ;
-          }
-        }
-        for (c6=1;c6<=M-1;c6++) {
-          if (c4%2 == 0) {
-            j = (c4+2)/2 ;
-            S6(c2,(c4+2)/2,c6) ;
-            S7(c2,(c4+2)/2,c6) ;
-          }
-          if ((c4+1)%2 == 0) {
-            j = (c4+3)/2 ;
-            S1(c2,(c4+3)/2,c6) ;
-          }
-        }
-        if ((c4+1)%2 == 0) {
-          j = (c4+3)/2 ;
-          S1(c2,(c4+3)/2,M) ;
-        }
-        for (c6=1;c6<=M-1;c6++) {
-          if (c4%2 == 0) {
-            S11(c2,c4/2,c6) ;
-          }
-        }
-      }
-      c4 = 2*N-4 ;
-      for (c6=1;c6<=M-1;c6++) {
-        j = N-1 ;
-        S6(c2,N-1,c6) ;
-        S7(c2,N-1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        j = N-2 ;
-        S11(c2,N-2,c6) ;
-      }
-      c4 = 2*N-3 ;
-      for (c6=1;c6<=M-1;c6++) {
-        j = N-2 ;
-        S10(c2,N-2,c6) ;
-      }
-      for (c6=1;c6<=M;c6++) {
-        j = N-1 ;
-        S3(c2,N-1,c6) ;
-      }
-      c4 = 2*N-2 ;
-      for (c6=1;c6<=M-1;c6++) {
-        j = N-1 ;
-        S11(c2,N-1,c6) ;
-      }
-      c4 = 2*N-1 ;
-      for (c6=1;c6<=M-1;c6++) {
-        j = N-1 ;
-        S10(c2,N-1,c6) ;
-      }
-    }
-  }
-  if ((M >= 2) && (N == 3)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c6=1;c6<=M;c6++) {
-        S1(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S6(c2,1,c6) ;
-        S7(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M;c6++) {
-        S3(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S1(c2,2,c6) ;
-      }
-      S1(c2,2,M) ;
-      for (c6=1;c6<=M-1;c6++) {
-        S6(c2,2,c6) ;
-        S7(c2,2,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S11(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S10(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M;c6++) {
-        S3(c2,2,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S11(c2,2,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S10(c2,2,c6) ;
-      }
-    }
-  }
-  if ((M >= 2) && (N == 2)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c6=1;c6<=M;c6++) {
-        S1(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S6(c2,1,c6) ;
-        S7(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M;c6++) {
-        S3(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S11(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S10(c2,1,c6) ;
-      }
-    }
-  }
-  if ((M == 1) && (N >= 3)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=-1;c4<=0;c4++) {
-        if ((c4+1)%2 == 0) {
-          j = (c4+3)/2 ;
-          S1(c2,(c4+3)/2,1) ;
-        }
-      }
-      for (c4=1;c4<=2*N-5;c4++) {
-        if ((c4+1)%2 == 0) {
-          j = (c4+1)/2 ;
-          S3(c2,(c4+1)/2,1) ;
-        }
-        if ((c4+1)%2 == 0) {
-          j = (c4+3)/2 ;
-          S1(c2,(c4+3)/2,1) ;
-        }
-      }
-      for (c4=2*N-4;c4<=2*N-3;c4++) {
-        if ((c4+1)%2 == 0) {
-          j = (c4+1)/2 ;
-          S3(c2,(c4+1)/2,1) ;
-        }
-      }
-    }
-  }
-  if ((M == 1) && (N == 2)) {
-    for (c2=1;c2<=O-1;c2++) {
-      S1(c2,1,1) ;
-      S3(c2,1,1) ;
-    }
-  }
-  if ((M >= 2) && (N >= 3)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c6=1;c6<=M;c6++) {
-        S2(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S8(c2,1,c6) ;
-      }
-      for (c4=3;c4<=2*N-2;c4++) {
-        for (c6=1;c6<=M;c6++) {
-          if (c4%2 == 0) {
-            S2(c2,c4/2,c6) ;
-          }
-        }
-        for (c6=1;c6<=M-1;c6++) {
-          if (c4%2 == 0) {
-            S8(c2,c4/2,c6) ;
-          }
-        }
-        for (c6=1;c6<=M-1;c6++) {
-          if ((c4+1)%2 == 0) {
-            j = (c4-1)/2 ;
-            S9(c2,(c4-1)/2,c6) ;
-          }
-        }
-      }
-      c4 = 2*N-1 ;
-      for (c6=1;c6<=M-1;c6++) {
-        j = N-1 ;
-        S9(c2,N-1,c6) ;
-      }
-    }
-  }
-  if ((M >= 2) && (N == 2)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c6=1;c6<=M;c6++) {
-        S2(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S8(c2,1,c6) ;
-      }
-      for (c6=1;c6<=M-1;c6++) {
-        S9(c2,1,c6) ;
-      }
-    }
-  }
-  if ((M == 1) && (N >= 2)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=2;c4<=2*N-2;c4++) {
-        if (c4%2 == 0) {
-          S2(c2,c4/2,1) ;
-        }
-      }
-    }
-  }
-  if ((M >= 2) && (N >= 2)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=1;c4<=N-1;c4++) {
-        for (c6=1;c6<=M-1;c6++) {
-          S4(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-  if ((M >= 2) && (N >= 2)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=1;c4<=N-1;c4++) {
-        for (c6=1;c6<=M-1;c6++) {
-          S5(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-  if ((M >= P+1) && (N >= Q+1)) {
-    for (c2=R;c2<=O-1;c2++) {
-      for (c4=Q;c4<=N-1;c4++) {
-        for (c6=P;c6<=M-1;c6++) {
-          S12(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-  if ((M >= 2) && (N >= Q+1)) {
-    for (c2=R;c2<=O-1;c2++) {
-      for (c4=Q;c4<=N-1;c4++) {
-        for (c6=1;c6<=M-1;c6++) {
-          S13(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-  if ((M >= P+1) && (N >= 2)) {
-    for (c2=R;c2<=O-1;c2++) {
-      for (c4=1;c4<=N-1;c4++) {
-        for (c6=P;c6<=M-1;c6++) {
-          S14(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-  if ((M >= 2) && (N >= 2)) {
-    for (c2=R;c2<=O-1;c2++) {
-      for (c4=1;c4<=N-1;c4++) {
-        for (c6=1;c6<=M-1;c6++) {
-          S15(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/mg-interp2.c b/cloog-0.17.0/test/reservoir/mg-interp2.c
deleted file mode 100644
index 688cc91..0000000
--- a/cloog-0.17.0/test/reservoir/mg-interp2.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/mg-interp2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.11s. */
-if (O >= 2) {
-  if ((M >= P+1) && (N >= Q+1)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=Q;c4<=N-1;c4++) {
-        for (c6=P;c6<=M-1;c6++) {
-          S1(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-  if ((M >= 2) && (N >= Q+1)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=Q;c4<=N-1;c4++) {
-        for (c6=1;c6<=M-1;c6++) {
-          S2(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-  if ((M >= P+1) && (N >= 2)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=1;c4<=N-1;c4++) {
-        for (c6=P;c6<=M-1;c6++) {
-          S3(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-  if ((M >= 2) && (N >= 2)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=1;c4<=N-1;c4++) {
-        for (c6=1;c6<=M-1;c6++) {
-          S4(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/mg-interp2.cloog b/cloog-0.17.0/test/reservoir/mg-interp2.cloog
deleted file mode 100755
index d1218bc..0000000
--- a/cloog-0.17.0/test/reservoir/mg-interp2.cloog
+++ /dev/null
@@ -1,112 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 11
-    1    0    0    0    0    0    0    0    0    0    1
-0
-
-# Number of statments
-4
-
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-p >= 0, -j+m-1 >= 0, k-o >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0   -1    0    0    0    0    0
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0   -1    0    0    0    0    0    0
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-p >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0   -1    0    0    0    0    0
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-o >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0   -1    0    0    0    0    0    0
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q,r,s,t) | i-1 >= 0, -i+n-1 >= 0, j-1 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 14
-    1    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    1   -1    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    1    0   -1    0    0    1    0    0    0    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0   -1    1    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-4
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -2
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 21
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -3
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/mg-interp2.good.c b/cloog-0.17.0/test/reservoir/mg-interp2.good.c
deleted file mode 100644
index 2e1f365..0000000
--- a/cloog-0.17.0/test/reservoir/mg-interp2.good.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/mg-interp2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.07s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-#define S3(i,j,k) { hash(3); hash(i); hash(j); hash(k); }
-#define S4(i,j,k) { hash(4); hash(i); hash(j); hash(k); }
-
-void test(int M, int N, int O, int P, int Q, int R, int S, int T, int U)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  if ((M >= P+1) && (N >= Q+1)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=Q;c4<=N-1;c4++) {
-        for (c6=P;c6<=M-1;c6++) {
-          S1(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-  if ((M >= 2) && (N >= Q+1)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=Q;c4<=N-1;c4++) {
-        for (c6=1;c6<=M-1;c6++) {
-          S2(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-  if ((M >= P+1) && (N >= 2)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=1;c4<=N-1;c4++) {
-        for (c6=P;c6<=M-1;c6++) {
-          S3(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-  if ((M >= 2) && (N >= 2)) {
-    for (c2=1;c2<=O-1;c2++) {
-      for (c4=1;c4<=N-1;c4++) {
-        for (c6=1;c6<=M-1;c6++) {
-          S4(c2,c4,c6) ;
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/mg-psinv.c b/cloog-0.17.0/test/reservoir/mg-psinv.c
deleted file mode 100644
index a0447e1..0000000
--- a/cloog-0.17.0/test/reservoir/mg-psinv.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/./reservoir/mg-psinv.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.02s. */
-if ((M >= 1) && (N >= 3) && (O >= 3)) {
-  if (M >= 3) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c6=1;c6<=M;c6++) {
-        S1(c2,2,c6);
-        S2(c2,2,c6);
-      }
-      for (c4=4;c4<=2*N-3;c4++) {
-        for (c6=1;c6<=M;c6++) {
-          if ((c4+1)%2 == 0) {
-            S1(c2,(c4+1)/2,c6);
-            S2(c2,(c4+1)/2,c6);
-          }
-        }
-        for (c6=2;c6<=M-1;c6++) {
-          if (c4%2 == 0) {
-            S3(c2,c4/2,c6);
-          }
-        }
-      }
-      for (c6=2;c6<=M-1;c6++) {
-        S3(c2,N-1,c6);
-      }
-    }
-  }
-  if (M <= 2) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c4=3;c4<=2*N-3;c4++) {
-        for (c6=1;c6<=M;c6++) {
-          if ((c4+1)%2 == 0) {
-            S1(c2,(c4+1)/2,c6);
-            S2(c2,(c4+1)/2,c6);
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/mg-psinv.cloog b/cloog-0.17.0/test/reservoir/mg-psinv.cloog
deleted file mode 100755
index 7f0dd2c..0000000
--- a/cloog-0.17.0/test/reservoir/mg-psinv.cloog
+++ /dev/null
@@ -1,88 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 5
-    1    0    0    0    1
-0
-
-# Number of statments
-3
-
-1
-# { (i,j,k,l,m,n) | i-2 >= 0, -i+n-1 >= 0, j-2 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l >= 0, 1 >= 0 }
-
-    7 8
-    1    1    0    0    0    0    0   -2
-    1   -1    0    0    0    0    1   -1
-    1    0    1    0    0    0    0   -2
-    1    0   -1    0    0    1    0   -1
-    1    0    0    1    0    0    0   -1
-    1    0    0   -1    1    0    0    0
-    1    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n) | i-2 >= 0, -i+n-1 >= 0, j-2 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l >= 0, 1 >= 0 }
-
-    7 8
-    1    1    0    0    0    0    0   -2
-    1   -1    0    0    0    0    1   -1
-    1    0    1    0    0    0    0   -2
-    1    0   -1    0    0    1    0   -1
-    1    0    0    1    0    0    0   -1
-    1    0    0   -1    1    0    0    0
-    1    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n) | i-2 >= 0, -i+n-1 >= 0, j-2 >= 0, -j+m-1 >= 0, k-2 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 8
-    1    1    0    0    0    0    0   -2
-    1   -1    0    0    0    0    1   -1
-    1    0    1    0    0    0    0   -2
-    1    0   -1    0    0    1    0   -1
-    1    0    0    1    0    0    0   -2
-    1    0    0   -1    1    0    0   -1
-    1    0    0    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-3
-
-    8 15
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    1
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 15
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    1
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 15
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/mg-psinv.good.c b/cloog-0.17.0/test/reservoir/mg-psinv.good.c
deleted file mode 100644
index cb5b57c..0000000
--- a/cloog-0.17.0/test/reservoir/mg-psinv.good.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/mg-psinv.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.05s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-#define S3(i,j,k) { hash(3); hash(i); hash(j); hash(k); }
-
-void test(int M, int N, int O)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  if ((M >= 3) && (N >= 4)) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c6=1;c6<=M;c6++) {
-        S1(c2,2,c6) ;
-        S2(c2,2,c6) ;
-      }
-      for (c4=4;c4<=2*N-3;c4++) {
-        for (c6=1;c6<=M;c6++) {
-          if ((c4+1)%2 == 0) {
-            j = (c4+1)/2 ;
-            S1(c2,(c4+1)/2,c6) ;
-            S2(c2,(c4+1)/2,c6) ;
-          }
-        }
-        for (c6=2;c6<=M-1;c6++) {
-          if (c4%2 == 0) {
-            S3(c2,c4/2,c6) ;
-          }
-        }
-      }
-      c4 = 2*N-2 ;
-      for (c6=2;c6<=M-1;c6++) {
-        j = N-1 ;
-        S3(c2,N-1,c6) ;
-      }
-    }
-  }
-  if ((M >= 3) && (N == 3)) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c6=1;c6<=M;c6++) {
-        S1(c2,2,c6) ;
-        S2(c2,2,c6) ;
-      }
-      for (c6=2;c6<=M-1;c6++) {
-        S3(c2,2,c6) ;
-      }
-    }
-  }
-  if ((M >= 1) && (M <= 2) && (N >= 3)) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c4=3;c4<=2*N-3;c4++) {
-        for (c6=1;c6<=M;c6++) {
-          if ((c4+1)%2 == 0) {
-            j = (c4+1)/2 ;
-            S1(c2,(c4+1)/2,c6) ;
-            S2(c2,(c4+1)/2,c6) ;
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/mg-resid.c b/cloog-0.17.0/test/reservoir/mg-resid.c
deleted file mode 100644
index 89a3cda..0000000
--- a/cloog-0.17.0/test/reservoir/mg-resid.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/./reservoir/mg-resid.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.03s. */
-if ((M >= 1) && (N >= 3) && (O >= 3)) {
-  if (M >= 3) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c6=1;c6<=M;c6++) {
-        S1(c2,2,c6);
-        S2(c2,2,c6);
-      }
-      for (c4=4;c4<=2*N-3;c4++) {
-        for (c6=1;c6<=M;c6++) {
-          if ((c4+1)%2 == 0) {
-            S1(c2,(c4+1)/2,c6);
-            S2(c2,(c4+1)/2,c6);
-          }
-        }
-        for (c6=2;c6<=M-1;c6++) {
-          if (c4%2 == 0) {
-            S3(c2,c4/2,c6);
-          }
-        }
-      }
-      for (c6=2;c6<=M-1;c6++) {
-        S3(c2,N-1,c6);
-      }
-    }
-  }
-  if (M <= 2) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c4=3;c4<=2*N-3;c4++) {
-        for (c6=1;c6<=M;c6++) {
-          if ((c4+1)%2 == 0) {
-            S1(c2,(c4+1)/2,c6);
-            S2(c2,(c4+1)/2,c6);
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/mg-resid.cloog b/cloog-0.17.0/test/reservoir/mg-resid.cloog
deleted file mode 100755
index 7f0dd2c..0000000
--- a/cloog-0.17.0/test/reservoir/mg-resid.cloog
+++ /dev/null
@@ -1,88 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 5
-    1    0    0    0    1
-0
-
-# Number of statments
-3
-
-1
-# { (i,j,k,l,m,n) | i-2 >= 0, -i+n-1 >= 0, j-2 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l >= 0, 1 >= 0 }
-
-    7 8
-    1    1    0    0    0    0    0   -2
-    1   -1    0    0    0    0    1   -1
-    1    0    1    0    0    0    0   -2
-    1    0   -1    0    0    1    0   -1
-    1    0    0    1    0    0    0   -1
-    1    0    0   -1    1    0    0    0
-    1    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n) | i-2 >= 0, -i+n-1 >= 0, j-2 >= 0, -j+m-1 >= 0, k-1 >= 0, -k+l >= 0, 1 >= 0 }
-
-    7 8
-    1    1    0    0    0    0    0   -2
-    1   -1    0    0    0    0    1   -1
-    1    0    1    0    0    0    0   -2
-    1    0   -1    0    0    1    0   -1
-    1    0    0    1    0    0    0   -1
-    1    0    0   -1    1    0    0    0
-    1    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n) | i-2 >= 0, -i+n-1 >= 0, j-2 >= 0, -j+m-1 >= 0, k-2 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 8
-    1    1    0    0    0    0    0   -2
-    1   -1    0    0    0    0    1   -1
-    1    0    1    0    0    0    0   -2
-    1    0   -1    0    0    1    0   -1
-    1    0    0    1    0    0    0   -2
-    1    0    0   -1    1    0    0   -1
-    1    0    0    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-3
-
-    8 15
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    1
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 15
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    1
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 15
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/mg-resid.good.c b/cloog-0.17.0/test/reservoir/mg-resid.good.c
deleted file mode 100644
index 4056aab..0000000
--- a/cloog-0.17.0/test/reservoir/mg-resid.good.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/mg-resid.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.05s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-#define S3(i,j,k) { hash(3); hash(i); hash(j); hash(k); }
-
-void test(int M, int N, int O)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  if ((M >= 3) && (N >= 4)) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c6=1;c6<=M;c6++) {
-        S1(c2,2,c6) ;
-        S2(c2,2,c6) ;
-      }
-      for (c4=4;c4<=2*N-3;c4++) {
-        for (c6=1;c6<=M;c6++) {
-          if ((c4+1)%2 == 0) {
-            j = (c4+1)/2 ;
-            S1(c2,(c4+1)/2,c6) ;
-            S2(c2,(c4+1)/2,c6) ;
-          }
-        }
-        for (c6=2;c6<=M-1;c6++) {
-          if (c4%2 == 0) {
-            S3(c2,c4/2,c6) ;
-          }
-        }
-      }
-      c4 = 2*N-2 ;
-      for (c6=2;c6<=M-1;c6++) {
-        j = N-1 ;
-        S3(c2,N-1,c6) ;
-      }
-    }
-  }
-  if ((M >= 3) && (N == 3)) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c6=1;c6<=M;c6++) {
-        S1(c2,2,c6) ;
-        S2(c2,2,c6) ;
-      }
-      for (c6=2;c6<=M-1;c6++) {
-        S3(c2,2,c6) ;
-      }
-    }
-  }
-  if ((M >= 1) && (M <= 2) && (N >= 3)) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c4=3;c4<=2*N-3;c4++) {
-        for (c6=1;c6<=M;c6++) {
-          if ((c4+1)%2 == 0) {
-            j = (c4+1)/2 ;
-            S1(c2,(c4+1)/2,c6) ;
-            S2(c2,(c4+1)/2,c6) ;
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/mg-rprj3.c b/cloog-0.17.0/test/reservoir/mg-rprj3.c
deleted file mode 100644
index f7f7a4d..0000000
--- a/cloog-0.17.0/test/reservoir/mg-rprj3.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/./reservoir/mg-rprj3.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.10s. */
-if ((M >= 2) && (N >= 3) && (O >= 3)) {
-  if (M >= 3) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c6=2;c6<=M;c6++) {
-        S1(c2,2,c6);
-      }
-      for (c4=3;c4<=N-1;c4++) {
-        for (c6=2;c6<=M;c6++) {
-          S2(c2,c4-1,c6);
-        }
-        S4(c2,c4-1,2);
-        for (c6=2;c6<=M-2;c6++) {
-          S3(c2,c4-1,c6);
-          S5(c2,c4-1,c6);
-          S4(c2,c4-1,c6+1);
-        }
-        S3(c2,c4-1,M-1);
-        S5(c2,c4-1,M-1);
-        for (c6=2;c6<=M;c6++) {
-          S1(c2,c4,c6);
-        }
-      }
-      for (c6=2;c6<=M;c6++) {
-        S2(c2,N-1,c6);
-      }
-      S4(c2,N-1,2);
-      for (c6=2;c6<=M-2;c6++) {
-        S3(c2,N-1,c6);
-        S5(c2,N-1,c6);
-        S4(c2,N-1,c6+1);
-      }
-      S3(c2,N-1,M-1);
-      S5(c2,N-1,M-1);
-    }
-  }
-  if (M == 2) {
-    for (c2=2;c2<=O-1;c2++) {
-      S1(c2,2,2);
-      for (c4=3;c4<=N-1;c4++) {
-        S2(c2,c4-1,2);
-        S1(c2,c4,2);
-      }
-      S2(c2,N-1,2);
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/mg-rprj3.cloog b/cloog-0.17.0/test/reservoir/mg-rprj3.cloog
deleted file mode 100755
index adf72fd..0000000
--- a/cloog-0.17.0/test/reservoir/mg-rprj3.cloog
+++ /dev/null
@@ -1,136 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 8
-    1    0    0    0    0    0    0    1
-0
-
-# Number of statments
-5
-
-1
-# { (i,j,k,l,m,n,o,p,q) | i-2 >= 0, -i+n-1 >= 0, j-2 >= 0, -j+m-1 >= 0, k-2 >= 0, -k+l >= 0, 1 >= 0 }
-
-    7 11
-    1    1    0    0    0    0    0    0    0    0   -2
-    1   -1    0    0    0    0    1    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0   -2
-    1    0   -1    0    0    1    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0   -2
-    1    0    0   -1    1    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q) | i-2 >= 0, -i+n-1 >= 0, j-2 >= 0, -j+m-1 >= 0, k-2 >= 0, -k+l >= 0, 1 >= 0 }
-
-    7 11
-    1    1    0    0    0    0    0    0    0    0   -2
-    1   -1    0    0    0    0    1    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0   -2
-    1    0   -1    0    0    1    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0   -2
-    1    0    0   -1    1    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q) | i-2 >= 0, -i+n-1 >= 0, j-2 >= 0, -j+m-1 >= 0, k-2 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 11
-    1    1    0    0    0    0    0    0    0    0   -2
-    1   -1    0    0    0    0    1    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0   -2
-    1    0   -1    0    0    1    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0   -2
-    1    0    0   -1    1    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q) | i-2 >= 0, -i+n-1 >= 0, j-2 >= 0, -j+m-1 >= 0, k-2 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 11
-    1    1    0    0    0    0    0    0    0    0   -2
-    1   -1    0    0    0    0    1    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0   -2
-    1    0   -1    0    0    1    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0   -2
-    1    0    0   -1    1    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m,n,o,p,q) | i-2 >= 0, -i+n-1 >= 0, j-2 >= 0, -j+m-1 >= 0, k-2 >= 0, -k+l-1 >= 0, 1 >= 0 }
-
-    7 11
-    1    1    0    0    0    0    0    0    0    0   -2
-    1   -1    0    0    0    0    1    0    0    0   -1
-    1    0    1    0    0    0    0    0    0    0   -2
-    1    0   -1    0    0    1    0    0    0    0   -1
-    1    0    0    1    0    0    0    0    0    0   -2
-    1    0    0   -1    1    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-5
-
-    8 18
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0   -2
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 18
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 18
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 18
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    1
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0   -2
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 18
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/mg-rprj3.good.c b/cloog-0.17.0/test/reservoir/mg-rprj3.good.c
deleted file mode 100644
index 38ac53e..0000000
--- a/cloog-0.17.0/test/reservoir/mg-rprj3.good.c
+++ /dev/null
@@ -1,163 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/mg-rprj3.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.39s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-#define S3(i,j,k) { hash(3); hash(i); hash(j); hash(k); }
-#define S4(i,j,k) { hash(4); hash(i); hash(j); hash(k); }
-#define S5(i,j,k) { hash(5); hash(i); hash(j); hash(k); }
-
-void test(int M, int N, int O, int P, int Q, int R)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  if ((M >= 4) && (N >= 4)) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c6=2;c6<=M;c6++) {
-        S1(c2,2,c6) ;
-      }
-      for (c4=3;c4<=N-1;c4++) {
-        for (c6=2;c6<=M;c6++) {
-          j = c4-1 ;
-          S2(c2,c4-1,c6) ;
-        }
-        j = c4-1 ;
-        S4(c2,c4-1,2) ;
-        for (c6=2;c6<=M-2;c6++) {
-          j = c4-1 ;
-          S3(c2,c4-1,c6) ;
-          j = c4-1 ;
-          S5(c2,c4-1,c6) ;
-          j = c4-1 ;
-          k = c6+1 ;
-          S4(c2,c4-1,c6+1) ;
-        }
-        c6 = M-1 ;
-        j = c4-1 ;
-        k = M-1 ;
-        S3(c2,c4-1,M-1) ;
-        j = c4-1 ;
-        k = M-1 ;
-        S5(c2,c4-1,M-1) ;
-        for (c6=2;c6<=M;c6++) {
-          S1(c2,c4,c6) ;
-        }
-      }
-      for (c6=2;c6<=M;c6++) {
-        j = N-1 ;
-        S2(c2,N-1,c6) ;
-      }
-      j = N-1 ;
-      S4(c2,N-1,2) ;
-      for (c6=2;c6<=M-2;c6++) {
-        j = N-1 ;
-        S3(c2,N-1,c6) ;
-        j = N-1 ;
-        S5(c2,N-1,c6) ;
-        j = N-1 ;
-        k = c6+1 ;
-        S4(c2,N-1,c6+1) ;
-      }
-      c6 = M-1 ;
-      j = N-1 ;
-      k = M-1 ;
-      S3(c2,N-1,M-1) ;
-      j = N-1 ;
-      k = M-1 ;
-      S5(c2,N-1,M-1) ;
-    }
-  }
-  if ((M >= 4) && (N == 3)) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c6=2;c6<=M;c6++) {
-        S1(c2,2,c6) ;
-      }
-      for (c6=2;c6<=M;c6++) {
-        S2(c2,2,c6) ;
-      }
-      S4(c2,2,2) ;
-      for (c6=2;c6<=M-2;c6++) {
-        S3(c2,2,c6) ;
-        S5(c2,2,c6) ;
-        k = c6+1 ;
-        S4(c2,2,c6+1) ;
-      }
-      c6 = M-1 ;
-      k = M-1 ;
-      S3(c2,2,M-1) ;
-      k = M-1 ;
-      S5(c2,2,M-1) ;
-    }
-  }
-  if ((M == 3) && (N == 3)) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c6=2;c6<=3;c6++) {
-        S1(c2,2,c6) ;
-      }
-      for (c6=2;c6<=3;c6++) {
-        S2(c2,2,c6) ;
-      }
-      S4(c2,2,2) ;
-      S3(c2,2,2) ;
-      S5(c2,2,2) ;
-    }
-  }
-  if ((M == 3) && (N >= 4)) {
-    for (c2=2;c2<=O-1;c2++) {
-      for (c6=2;c6<=3;c6++) {
-        S1(c2,2,c6) ;
-      }
-      for (c4=3;c4<=N-1;c4++) {
-        for (c6=2;c6<=3;c6++) {
-          j = c4-1 ;
-          S2(c2,c4-1,c6) ;
-        }
-        j = c4-1 ;
-        S4(c2,c4-1,2) ;
-        j = c4-1 ;
-        S3(c2,c4-1,2) ;
-        j = c4-1 ;
-        S5(c2,c4-1,2) ;
-        for (c6=2;c6<=3;c6++) {
-          S1(c2,c4,c6) ;
-        }
-      }
-      for (c6=2;c6<=3;c6++) {
-        j = N-1 ;
-        S2(c2,N-1,c6) ;
-      }
-      j = N-1 ;
-      S4(c2,N-1,2) ;
-      j = N-1 ;
-      S3(c2,N-1,2) ;
-      j = N-1 ;
-      S5(c2,N-1,2) ;
-    }
-  }
-  if ((M == 2) && (N >= 4)) {
-    for (c2=2;c2<=O-1;c2++) {
-      S1(c2,2,2) ;
-      for (c4=3;c4<=N-1;c4++) {
-        j = c4-1 ;
-        S2(c2,c4-1,2) ;
-        S1(c2,c4,2) ;
-      }
-      j = N-1 ;
-      S2(c2,N-1,2) ;
-    }
-  }
-  if ((M == 2) && (N == 3)) {
-    for (c2=2;c2<=O-1;c2++) {
-      S1(c2,2,2) ;
-      S2(c2,2,2) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/pingali1.c b/cloog-0.17.0/test/reservoir/pingali1.c
deleted file mode 100644
index 505df8d..0000000
--- a/cloog-0.17.0/test/reservoir/pingali1.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/./reservoir/pingali1.cloog by CLooG 0.14.0-225-g6e2d019 gmp bits in 0.01s. */
-if ((M >= 1) && (N >= 1)) {
-  if (N >= 2) {
-    for (c2=1;c2<=M;c2++) {
-      S2(c2,1);
-      for (c4=3;c4<=2*N-1;c4++) {
-        for (c6=max(1,c4-N);c6<=floord(c4-1,2);c6++) {
-          S1(c2,c4-c6,c6);
-        }
-        if ((c4+1)%2 == 0) {
-          S2(c2,(c4+1)/2);
-        }
-      }
-    }
-  }
-  if (N == 1) {
-    for (c2=1;c2<=M;c2++) {
-      S2(c2,1);
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/pingali1.cloog b/cloog-0.17.0/test/reservoir/pingali1.cloog
deleted file mode 100755
index 0be0a2a..0000000
--- a/cloog-0.17.0/test/reservoir/pingali1.cloog
+++ /dev/null
@@ -1,61 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 4
-    1    0    0    1
-0
-
-# Number of statments
-2
-
-1
-# { (i,j,k,l,m) | i-1 >= 0, -i+l >= 0, -j+m >= 0, k-1 >= 0, j-k-1 >= 0, 1 >= 0 }
-
-    6 7
-    1    1    0    0    0    0   -1
-    1   -1    0    0    1    0    0
-    1    0   -1    0    0    1    0
-    1    0    0    1    0    0   -1
-    1    0    1   -1    0    0   -1
-    1    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i-1 >= 0, -i+k >= 0, j-1 >= 0, -j+l >= 0, 1 >= 0 }
-
-    5 6
-    1    1    0    0    0   -1
-    1   -1    0    1    0    0
-    1    0    1    0    0   -1
-    1    0   -1    0    1    0
-    1    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-2
-
-    8 14
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -2    0    0    1
-    0    0    0    0    0    1    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/pingali1.good.c b/cloog-0.17.0/test/reservoir/pingali1.good.c
deleted file mode 100644
index b72eb17..0000000
--- a/cloog-0.17.0/test/reservoir/pingali1.good.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/pingali1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  if (N >= 2) {
-    for (c2=1;c2<=M;c2++) {
-      for (c4=1;c4<=2;c4++) {
-        if ((c4+1)%2 == 0) {
-          j = (c4+1)/2 ;
-          S2(c2,(c4+1)/2) ;
-        }
-      }
-      for (c4=3;c4<=2*N-1;c4++) {
-        for (c6=max(1,c4-N);c6<=floord(c4-1,2);c6++) {
-          j = c4-c6 ;
-          S1(c2,c4-c6,c6) ;
-        }
-        if ((c4+1)%2 == 0) {
-          j = (c4+1)/2 ;
-          S2(c2,(c4+1)/2) ;
-        }
-      }
-    }
-  }
-  if (N == 1) {
-    for (c2=1;c2<=M;c2++) {
-      S2(c2,1) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/pingali2.c b/cloog-0.17.0/test/reservoir/pingali2.c
deleted file mode 100644
index b09c4f9..0000000
--- a/cloog-0.17.0/test/reservoir/pingali2.c
+++ /dev/null
@@ -1,13 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/pingali2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-if (M >= 1) {
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S1(c2,c4) ;
-    }
-  }
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S2(c2,c4) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/pingali2.cloog b/cloog-0.17.0/test/reservoir/pingali2.cloog
deleted file mode 100755
index 0f89038..0000000
--- a/cloog-0.17.0/test/reservoir/pingali2.cloog
+++ /dev/null
@@ -1,56 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statments
-2
-
-1
-# { (i,j,k) | i-1 >= 0, -i+k >= 0, j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 5
-    1    1    0    0   -1
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    0   -1    1    0
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | i-1 >= 0, -i+k >= 0, j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 5
-    1    1    0    0   -1
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    0   -1    1    0
-    1    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-2
-
-    6 10
-    0    1    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-
-    6 10
-    0    1    0    0    0    0    0    0    0   -1
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0   -1
-    0    0    0    0    1    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/pingali2.good.c b/cloog-0.17.0/test/reservoir/pingali2.good.c
deleted file mode 100644
index 9341731..0000000
--- a/cloog-0.17.0/test/reservoir/pingali2.good.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/pingali2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4;
-  /* Original iterators. */
-  int i, j;
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S1(c2,c4) ;
-    }
-  }
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S2(c2,c4) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/pingali3.c b/cloog-0.17.0/test/reservoir/pingali3.c
deleted file mode 100644
index b53542a..0000000
--- a/cloog-0.17.0/test/reservoir/pingali3.c
+++ /dev/null
@@ -1,15 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/pingali3.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if (M >= 1) {
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S1(c2,c4) ;
-    }
-  }
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      for (c6=1;c6<=M;c6++) {
-        S2(c2,c4,c6) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/pingali3.cloog b/cloog-0.17.0/test/reservoir/pingali3.cloog
deleted file mode 100755
index 8f345c0..0000000
--- a/cloog-0.17.0/test/reservoir/pingali3.cloog
+++ /dev/null
@@ -1,62 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statments
-2
-
-1
-# { (i,j,k) | i-1 >= 0, -i+k >= 0, j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 5
-    1    1    0    0   -1
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    0   -1    1    0
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | i-1 >= 0, -i+l >= 0, j-1 >= 0, -j+l >= 0, k-1 >= 0, -k+l >= 0, 1 >= 0 }
-
-    7 6
-    1    1    0    0    0   -1
-    1   -1    0    0    1    0
-    1    0    1    0    0   -1
-    1    0   -1    0    1    0
-    1    0    0    1    0   -1
-    1    0    0   -1    1    0
-    1    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-2
-
-    8 12
-    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0   -1
-    0    0    1    0    0    0    0    0   -1    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0   -1    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/pingali3.good.c b/cloog-0.17.0/test/reservoir/pingali3.good.c
deleted file mode 100644
index 5b5e4a9..0000000
--- a/cloog-0.17.0/test/reservoir/pingali3.good.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/pingali3.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S1(c2,c4) ;
-    }
-  }
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      for (c6=1;c6<=M;c6++) {
-        S2(c2,c4,c6) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/pingali4.c b/cloog-0.17.0/test/reservoir/pingali4.c
deleted file mode 100644
index 9905699..0000000
--- a/cloog-0.17.0/test/reservoir/pingali4.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/pingali4.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (c2=1;c2<=M;c2++) {
-  for (c4=1;c4<=M;c4++) {
-    S1(c2,c4) ;
-  }
-}
-for (c2=1;c2<=M;c2++) {
-  for (c4=1;c4<=M;c4++) {
-    S2(c2,c4) ;
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/pingali4.cloog b/cloog-0.17.0/test/reservoir/pingali4.cloog
deleted file mode 100755
index 46f4e07..0000000
--- a/cloog-0.17.0/test/reservoir/pingali4.cloog
+++ /dev/null
@@ -1,57 +0,0 @@
-# Language
-c
-
-# Context
-
-    2 3
-    1    1   -2
-    1    0    1
-0
-
-# Number of statments
-2
-
-1
-# { (i,j,k) | i-1 >= 0, -i+k >= 0, j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 5
-    1    1    0    0   -1
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    0   -1    1    0
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | i-1 >= 0, -i+k >= 0, j-1 >= 0, -j+k >= 0, 1 >= 0 }
-
-    5 5
-    1    1    0    0   -1
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    0   -1    1    0
-    1    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-2
-
-    6 10
-    0    1    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-
-    6 10
-    0    1    0    0    0    0    0    0    0   -1
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/pingali4.good.c b/cloog-0.17.0/test/reservoir/pingali4.good.c
deleted file mode 100644
index 5b61707..0000000
--- a/cloog-0.17.0/test/reservoir/pingali4.good.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/pingali4.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4;
-  /* Original iterators. */
-  int i, j;
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S1(c2,c4) ;
-    }
-  }
-  for (c2=1;c2<=M;c2++) {
-    for (c4=1;c4<=M;c4++) {
-      S2(c2,c4) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/pingali5.c b/cloog-0.17.0/test/reservoir/pingali5.c
deleted file mode 100644
index 1b2c415..0000000
--- a/cloog-0.17.0/test/reservoir/pingali5.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/./reservoir/pingali5.cloog by CLooG 0.14.0-225-g6e2d019 gmp bits in 0.02s. */
-if (M >= 2) {
-  for (c2=3;c2<=2*M-3;c2++) {
-    for (c4=ceild(c2+3,2);c4<=M;c4++) {
-      for (i=ceild(c2+1,2);i<=min(c2-1,c4-1);i++) {
-        S1(i,c2-i,c4);
-      }
-    }
-    for (c4=max(1,c2-M);c4<=floord(c2-1,2);c4++) {
-      S2(c2-c4,c4);
-    }
-    for (c4=ceild(c2+3,2);c4<=M;c4++) {
-      for (i=ceild(c2+1,2);i<=min(c2-1,c4-1);i++) {
-        S3(i,c2-i,c4);
-      }
-    }
-  }
-  for (c2=max(M+1,2*M-2);c2<=2*M-1;c2++) {
-    S2(M,c2-M);
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/pingali5.cloog b/cloog-0.17.0/test/reservoir/pingali5.cloog
deleted file mode 100755
index 2933d75..0000000
--- a/cloog-0.17.0/test/reservoir/pingali5.cloog
+++ /dev/null
@@ -1,81 +0,0 @@
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statments
-3
-
-1
-# { (i,j,k,l) | j-1 >= 0, i-j-1 >= 0, -i+k-1 >= 0, -k+l >= 0, 1 >= 0 }
-
-    5 6
-    1    0    1    0    0   -1
-    1    1   -1    0    0   -1
-    1   -1    0    1    0   -1
-    1    0    0   -1    1    0
-    1    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k) | -i+k >= 0, j-1 >= 0, i-j-1 >= 0, 1 >= 0 }
-
-    4 5
-    1   -1    0    1    0
-    1    0    1    0   -1
-    1    1   -1    0   -1
-    1    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l) | j-1 >= 0, i-j-1 >= 0, -i+k-1 >= 0, -k+l >= 0, 1 >= 0 }
-
-    5 6
-    1    0    1    0    0   -1
-    1    1   -1    0    0   -1
-    1   -1    0    1    0   -1
-    1    0    0   -1    1    0
-    1    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-3
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 12
-    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1   -1    0    0
-    0    0    0    1    0    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0    0   -1
-    0    0    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 13
-    0    1    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -1   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0   -2
-    0    0    0    0    1    0    0    0    0    0   -1    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0   -2
-    0    0    0    0    0    0    1    0    0    0   -1    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/pingali5.good.c b/cloog-0.17.0/test/reservoir/pingali5.good.c
deleted file mode 100644
index 351e5d3..0000000
--- a/cloog-0.17.0/test/reservoir/pingali5.good.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/pingali5.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.03s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i,j,k) { hash(3); hash(i); hash(j); hash(k); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  for (c2=3;c2<=2*M-3;c2++) {
-    for (c4=ceild(c2+3,2);c4<=M;c4++) {
-      for (i=ceild(c2+1,2);i<=min(c4-1,c2-1);i++) {
-        j = c2-i ;
-        S1(i,c2-i,c4) ;
-      }
-    }
-    for (c4=max(1,c2-M);c4<=floord(c2-1,2);c4++) {
-      i = c2-c4 ;
-      S2(c2-c4,c4) ;
-    }
-    for (c4=ceild(c2+3,2);c4<=M;c4++) {
-      for (i=ceild(c2+1,2);i<=min(c4-1,c2-1);i++) {
-        j = c2-i ;
-        S3(i,c2-i,c4) ;
-      }
-    }
-  }
-  for (c2=max(2*M-2,3);c2<=2*M-1;c2++) {
-    for (c4=max(1,c2-M);c4<=floord(c2-1,2);c4++) {
-      i = c2-c4 ;
-      S2(c2-c4,c4) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/pingali6.c b/cloog-0.17.0/test/reservoir/pingali6.c
deleted file mode 100644
index 5ce4a85..0000000
--- a/cloog-0.17.0/test/reservoir/pingali6.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/pingali6.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.04s. */
-if (N >= 3) {
-  for (c4=2;c4<=N-1;c4++) {
-    for (c6=2;c6<=N-1;c6++) {
-      S1(1,c4,c6) ;
-    }
-  }
-  for (c2=3;c2<=2*M;c2++) {
-    for (c4=2;c4<=N-1;c4++) {
-      for (c6=2;c6<=N-1;c6++) {
-        if (c2%2 == 0) {
-          S1(c2/2,c4,c6) ;
-        }
-      }
-    }
-    for (c4=2;c4<=N-1;c4++) {
-      for (c6=2;c6<=N-1;c6++) {
-        if ((c2+1)%2 == 0) {
-          S2((c2-1)/2,c4,c6) ;
-        }
-      }
-    }
-  }
-  for (c4=2;c4<=N-1;c4++) {
-    for (c6=2;c6<=N-1;c6++) {
-      S2(M,c4,c6) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/pingali6.cloog b/cloog-0.17.0/test/reservoir/pingali6.cloog
deleted file mode 100755
index 93726ec..0000000
--- a/cloog-0.17.0/test/reservoir/pingali6.cloog
+++ /dev/null
@@ -1,66 +0,0 @@
-# Language
-c
-
-# Context
-
-    3 4
-    1    1    0   -1
-    1    0    1   -1
-    1    0    0    1
-0
-
-# Number of statments
-2
-
-1
-# { (i,j,k,l,m) | i-1 >= 0, -i+l >= 0, j-2 >= 0, -j+m-1 >= 0, k-2 >= 0, -k+m-1 >= 0, 1 >= 0 }
-
-    7 7
-    1    1    0    0    0    0   -1
-    1   -1    0    0    1    0    0
-    1    0    1    0    0    0   -2
-    1    0   -1    0    0    1   -1
-    1    0    0    1    0    0   -2
-    1    0    0   -1    0    1   -1
-    1    0    0    0    0    0    1
-
-0 0 0
-1
-# { (i,j,k,l,m) | i-1 >= 0, -i+l >= 0, j-2 >= 0, -j+m-1 >= 0, k-2 >= 0, -k+m-1 >= 0, 1 >= 0 }
-
-    7 7
-    1    1    0    0    0    0   -1
-    1   -1    0    0    1    0    0
-    1    0    1    0    0    0   -2
-    1    0   -1    0    0    1   -1
-    1    0    0    1    0    0   -2
-    1    0    0   -1    0    1   -1
-    1    0    0    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-2
-
-    8 14
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -2    0    0    0    0    0
-    0    0    0    1    0    0    0    0    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-
-    8 14
-    0    1    0    0    0    0    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0    0    0   -2    0    0    0    0   -1
-    0    0    0    1    0    0    0    0    0    0    0    0    0   -1
-    0    0    0    0    1    0    0    0    0   -1    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0    0    0    0    0
-    0    0    0    0    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    0    0    0    0    1    0    0    0    0    0    0
-    1    0    0    0    0    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/pingali6.good.c b/cloog-0.17.0/test/reservoir/pingali6.good.c
deleted file mode 100644
index 26e9831..0000000
--- a/cloog-0.17.0/test/reservoir/pingali6.good.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/pingali6.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.03s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int c2, c4, c6;
-  /* Original iterators. */
-  int i, j, k;
-  if (N >= 3) {
-    for (c4=2;c4<=N-1;c4++) {
-      for (c6=2;c6<=N-1;c6++) {
-        S1(1,c4,c6) ;
-      }
-    }
-  }
-  if (N >= 3) {
-    for (c2=3;c2<=2*M;c2++) {
-      for (c4=2;c4<=N-1;c4++) {
-        for (c6=2;c6<=N-1;c6++) {
-          if (c2%2 == 0) {
-            S1(c2/2,c4,c6) ;
-          }
-        }
-      }
-      for (c4=2;c4<=N-1;c4++) {
-        for (c6=2;c6<=N-1;c6++) {
-          if ((c2+1)%2 == 0) {
-            i = (c2-1)/2 ;
-            S2((c2-1)/2,c4,c6) ;
-          }
-        }
-      }
-    }
-  }
-  if (N >= 3) {
-    c2 = 2*M+1 ;
-    for (c4=2;c4<=N-1;c4++) {
-      for (c6=2;c6<=N-1;c6++) {
-        S2(M,c4,c6) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/stride.c b/cloog-0.17.0/test/reservoir/stride.c
deleted file mode 100644
index e22c74b..0000000
--- a/cloog-0.17.0/test/reservoir/stride.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/reservoir/stride.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-if (M >= 2) {
-  for (c2=2;c2<=M;c2+=7) {
-    S1(c2,(c2-2)/7) ;
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/stride.cloog b/cloog-0.17.0/test/reservoir/stride.cloog
deleted file mode 100644
index 760a1a6..0000000
--- a/cloog-0.17.0/test/reservoir/stride.cloog
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# Stride-bug:
-#
-# for (i = 2; i <= N; i+=7) {
-#   S(i);
-# 
-# becomes:
-#
-# for (i = 5; i <= N; i+=7) {
-#   S(i);
-
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statements
-1
-
-1
-
-    4 5
-    0    1   -7    0   -2
-    1    1    0    0   -2
-    1   -1    0    1    0
-    1    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-1
-
-    6 10
-    0    1    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/stride2.c b/cloog-0.17.0/test/reservoir/stride2.c
deleted file mode 100644
index 8c2b7bf..0000000
--- a/cloog-0.17.0/test/reservoir/stride2.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/reservoir/stride2.cloog by CLooG 0.16.1-2-g0ae5c85 gmp bits in 0.00s. */
-if (M >= 2) {
-  for (c2=2;c2<=M;c2+=7) {
-    S1(c2,(c2-2)/7);
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/stride2.cloog b/cloog-0.17.0/test/reservoir/stride2.cloog
deleted file mode 100644
index 5fb9b14..0000000
--- a/cloog-0.17.0/test/reservoir/stride2.cloog
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# Stride-bug:
-#
-# for (i = 2; i <= N; i+=7) {
-#   S(i);
-# 
-# becomes:
-#
-# for (i = 5; i <= N; i+=7) {
-#   S(i);
-
-# Language
-c
-
-# Context
-
-    1 3
-    1    0    1
-0
-
-# Number of statements
-1
-
-1
-
-    4 5
-    0    1   -7    0   -2  # i - 7j = 2
-    1    1    0    0    0  # i >= 0
-    1   -1    0    1    0  # i <= n
-    1    0    0    0    1
-
-0 0 0
-0
-# Scattering functions
-1
-
-    6 10
-    0    1    0    0    0    0    0    0    0    0
-    0    0    1    0    0    0   -1    0    0    0
-    0    0    0    1    0    0    0    0    0    0
-    0    0    0    0    1    0    0    0    0    0
-    0    0    0    0    0    1    0    0    0    0
-    1    0    0    0    0    0    0    0    0    1
-
-0
diff --git a/cloog-0.17.0/test/reservoir/tang-xue1.c b/cloog-0.17.0/test/reservoir/tang-xue1.c
deleted file mode 100644
index 7dd0610..0000000
--- a/cloog-0.17.0/test/reservoir/tang-xue1.c
+++ /dev/null
@@ -1,14 +0,0 @@
-/* Generated from ../../../git/cloog/test/reservoir/tang-xue1.cloog by CLooG 0.14.0-165-g01eb246 gmp bits in 0.01s. */
-for (c2=0;c2<=9;c2++) {
-  for (c4=max(-1,c2-9);c4<=min(4,c2+3);c4++) {
-    for (c6=max(max(1,c2),c2-c4);c6<=min(min(9,c2+1),c2-c4+4);c6++) {
-      for (c8=max(1,-c2+c4+c6);c8<=min(4,-c2+c4+c6+1);c8++) {
-        if (c2%2 == 0) {
-          if (c4%2 == 0) {
-            S1(c2/2,(-c2+c4)/2,-c2+c6,-c4+c8);
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/tang-xue1.cloog b/cloog-0.17.0/test/reservoir/tang-xue1.cloog
deleted file mode 100644
index bf9b92b..0000000
--- a/cloog-0.17.0/test/reservoir/tang-xue1.cloog
+++ /dev/null
@@ -1,80 +0,0 @@
-#
-# Example 1 in "Generating Efficient Tiled Code for Distributed Memory
-# Machines", Peiyi Tang and Jingling Xue.
-#
-
-# for (int i = 1; i <= 9; i++) {
-#    for (int j = 1; j <= 4; j++) {
-#       A[i,2*j] = A[i,2*j-2] + A[i-1,2*j-2];
-#    }
-# }
-#
-# We tile it with a tiling matrix H = [1/2  0]
-#                                     [-1/2 1/2]
-#
-# We get:
-#
-# for (int i = 0; i <= 9; i += 2) {
-#   for (int j = max(-1, -9 + i); j <= min(4, 3 + i); j++) {
-#     for (int k = max(1, i, i-j); k <= min(4 + i -j, 1 + i, 9); k++) {
-#       for (int l = max(-i + j + k, 1); l <= min(4, 1 -i + j + k); l++) {
-#         if (i % 2 == 0) {
-#           if ((i + j) % 2 == 0) {
-#             A[k, 2 * l] = A[k, -2 + 2 * l] + A[-1 + k, -2 + 2 * l];
-#           }
-#         }
-#       }
-#     }
-#   }
-# }
-#
-
-# language: C 
-c
-
-# parameter (none)
-1 2
-# 1
-1 1
-0 
-
-1 # number of statements
-
-1 
-#    -2i-2j   -l +4 >= 0
-#          -k +l    >= 0
-#    -2i   -k    +9 >= 0
-#           k       >= 0
-#     2i   +k    -1 >= 0
-#           k -l +1 >= 0
-#          -k    +1 >= 0
-#     2i+2j   +l-1  >= 0
-8 6 
-#  i  j  k  l  1
-1 -2 -2  0 -1  4
-1  0  0 -1  1  0
-1 -2  0 -1  0  9
-1  0  0  1  0  0
-1  2  0  1  0 -1
-1  0  0  1 -1  1
-1  0  0 -1  0  1
-1  2  2  0  1 -1
-0  0  0
-0
-
-1 
-
-# Scattering functions
-9 15
-# alpha=[2i, 2i+2j, 2i+k, 2i+2j+l] gamma=[0, 0, 0, 0] beta=[0, 0, 0, 0, 0, 0]
-# c1 c2 c3 c4 c5 c6 c7 c8 c9 i j k l 1
-0 -1  0  0  0  0  0  0  0  0 0 0 0 0 0
-0  0 -1  0  0  0  0  0  0  0 2 0 0 0 0
-0  0  0 -1  0  0  0  0  0  0 0 0 0 0 0
-0  0  0  0 -1  0  0  0  0  0 2 2 0 0 0
-0  0  0  0  0 -1  0  0  0  0 0 0 0 0 0
-0  0  0  0  0  0 -1  0  0  0 2 0 1 0 0
-0  0  0  0  0  0  0 -1  0  0 0 0 0 0 0
-0  0  0  0  0  0  0  0 -1  0 2 2 0 1 0
-0  0  0  0  0  0  0  0  0 -1 0 0 0 0 0
-0
diff --git a/cloog-0.17.0/test/reservoir/tang-xue1.good.c b/cloog-0.17.0/test/reservoir/tang-xue1.good.c
deleted file mode 100644
index 1c4215c..0000000
--- a/cloog-0.17.0/test/reservoir/tang-xue1.good.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/tang-xue1.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k,l) { hash(1); hash(i); hash(j); hash(k); hash(l); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int c2, c4, c6, c8;
-  /* Original iterators. */
-  int i, j, k, l;
-  for (c2=0;c2<=9;c2++) {
-    for (c4=max(-1,c2-9);c4<=min(4,c2+3);c4++) {
-      for (c6=max(max(c2,1),c2-c4);c6<=min(min(c2+1,9),c2-c4+4);c6++) {
-        for (c8=max(1,-c2+c4+c6);c8<=min(4,-c2+c4+c6+1);c8++) {
-          if (c2%2 == 0) {
-            if ((c2+c4)%2 == 0) {
-              j = (-c2+c4)/2 ;
-              k = -c2+c6 ;
-              l = -c4+c8 ;
-              S1(c2/2,(-c2+c4)/2,-c2+c6,-c4+c8) ;
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/reservoir/two.c b/cloog-0.17.0/test/reservoir/two.c
deleted file mode 100644
index 374e754..0000000
--- a/cloog-0.17.0/test/reservoir/two.c
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/./reservoir/two.cloog by CLooG 0.14.0-225-g6e2d019 gmp bits in 0.00s. */
-S1(1,1,5);
diff --git a/cloog-0.17.0/test/reservoir/two.cloog b/cloog-0.17.0/test/reservoir/two.cloog
deleted file mode 100644
index 60b259f..0000000
--- a/cloog-0.17.0/test/reservoir/two.cloog
+++ /dev/null
@@ -1,26 +0,0 @@
-# Scan
-#  D = { (i, j, k) | 0 <= i < 10, 1 <= j < 20, 2i + 3j = k, i + j + 3 = 3k }
-#
-# language: C
-c
-
-# parameter (none)
-1 2
-1 1
-0
-
-1 # Number of statements
-
-1
-6 5
-#  i  j  k  1
-1  1  0  0  0
-1 -1  0  0 10
-1  0  1  0 -1
-1  0 -1  0 20
-0  2  3 -1  0
-0  1  1 -1  3
-0  0  0
-0 
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/reservoir/two.good.c b/cloog-0.17.0/test/reservoir/two.good.c
deleted file mode 100644
index a80671f..0000000
--- a/cloog-0.17.0/test/reservoir/two.good.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Generated from ../../../git/cloog/test/./reservoir/two.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j,k) { hash(1); hash(i); hash(j); hash(k); }
-
-void test()
-{
-  /* Original iterators. */
-  int i, j, k;
-  for (i=0;i<=1;i++) {
-    if ((i+1)%2 == 0) {
-      j = (-i+3)/2 ;
-      k = (i+9)/2 ;
-      S1(i,(-i+3)/2,(i+9)/2) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/singleton.c b/cloog-0.17.0/test/singleton.c
deleted file mode 100644
index ad14ebe..0000000
--- a/cloog-0.17.0/test/singleton.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/singleton.cloog by CLooG 0.14.0-242-g720faff gmp bits in 0.00s. */
-S2();
-S1();
diff --git a/cloog-0.17.0/test/singleton.cloog b/cloog-0.17.0/test/singleton.cloog
deleted file mode 100644
index 8636efb..0000000
--- a/cloog-0.17.0/test/singleton.cloog
+++ /dev/null
@@ -1,27 +0,0 @@
-c
-
-0 2
-
-0
-
-2
-
-1
-0 2
-0 0 0
-
-1
-0 2
-0 0 0
-
-0
-
-2
-
-1 3
-0 -1 0
-
-1 3
-0 -1 -1
-
-0
diff --git a/cloog-0.17.0/test/singleton.good.c b/cloog-0.17.0/test/singleton.good.c
deleted file mode 100644
index 40106ed..0000000
--- a/cloog-0.17.0/test/singleton.good.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/singleton.cloog by CLooG 0.14.0-242-g720faff gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1() { hash(1); }
-#define S2() { hash(2); }
-
-void test()
-{
-  S2();
-  S1();
-}
diff --git a/cloog-0.17.0/test/sor1d.c b/cloog-0.17.0/test/sor1d.c
deleted file mode 100644
index da1b5ec..0000000
--- a/cloog-0.17.0/test/sor1d.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Generated from ../../../git/cloog/test/sor1d.cloog by CLooG 0.14.0-278-gcf1f323 gmp bits in 0.11s. */
-if ((M >= 1) && (N >= 3)) {
-  for (glT1=-1;glT1<=floord(3*M+N-5,100);glT1++) {
-    for (rp1=max(max(0,ceild(100*glT1-2*M-N+5,100)),ceild(100*glT1-N-193,300));rp1<=min(min(floord(glT1+1,3),floord(M,100)),glT1);rp1++) {
-      for (vT1=max(max(100*glT1-100*rp1,200*rp1-3),200*rp1-N+1);vT1<=min(min(min(2*M+N-5,100*glT1-100*rp1+99),200*rp1+N+193),100*glT1-100*rp1+N+95);vT1++) {
-        if (rp1 >= max(1,ceild(vT1-N+7,200))) {
-          S3(glT1-rp1,rp1-1,rp1,100*rp1-1,-200*rp1+vT1+6);
-        }
-        for (vP1=max(max(1,ceild(vT1-N+5,2)),100*rp1);vP1<=min(min(floord(vT1+2,2),M),100*rp1+99);vP1++) {
-          S1(glT1-rp1,rp1,vP1,vT1-2*vP1+4);
-        }
-        if (rp1 <= min(floord(M-100,100),floord(vT1-197,200))) {
-          S2(glT1-rp1,rp1,rp1+1,100*rp1+99,-200*rp1+vT1-194);
-        }
-      }
-    }
-    S4(glT1);
-  }
-}
diff --git a/cloog-0.17.0/test/sor1d.cloog b/cloog-0.17.0/test/sor1d.cloog
deleted file mode 100644
index ba1ca70..0000000
--- a/cloog-0.17.0/test/sor1d.cloog
+++ /dev/null
@@ -1,256 +0,0 @@
-# created: Thu Dec 17 16:41:33 CET 2009
-# ---------------------- CONTEXT ----------------------
-c # language is C
-
-# Context
-2 4
- 1 1 0 0
- 1 0 1 0
-
-
-1 # set parameter names
-M N
-
-# --------------------- STATEMENTS --------------------
-4
-
-# 1 computation stmts:
-1 # domains per statement
-19 8
- 1 -100 0 2 1 0 0 -4
- 1 0 0 0 1 0 0 -2
- 1 100 0 -2 -1 0 0 103
- 1 0 0 0 -1 0 1 -1
- 1 0 0 1 0 0 0 -1
- 1 0 -100 1 0 0 0 0
- 1 -100 0 2 0 0 1 -5
- 1 0 0 -1 0 1 0 0
- 1 0 100 -1 0 0 0 99
- 1 100 0 -2 0 0 0 101
- 1 0 50 0 0 0 0 49
- 1 -100 200 0 0 0 1 193
- 1 0 -100 0 0 1 0 0
- 1 100 -200 0 0 0 0 101
- 1 100 0 0 0 0 0 99
- 1 -100 0 0 0 2 1 -5
- 1 0 0 0 0 0 1 -3
- 1 0 0 0 0 2 1 94
- 1 0 0 0 0 1 0 -1
-
-
-0 0 0 # for future options...
-
-
-# 1 prepare-send stmts:
-1 # domains per statement
-57 9
- 1 0 -200 0 2 1 0 0 -3
- 1 0 0 0 2 1 0 0 -5
- 1 -100 0 0 2 1 0 0 -4
- 1 0 0 0 0 1 0 0 -3
- 1 0 200 0 -2 -1 0 1 197
- 1 0 0 0 -2 -1 2 1 -3
- 1 100 0 0 -2 -1 0 0 103
- 1 0 0 0 0 -1 0 1 -1
- 1 0 0 -100 1 0 0 0 1
- 1 0 -100 0 1 0 0 0 0
- 1 0 0 0 1 0 0 0 -1
- 1 0 -200 0 2 0 0 1 -4
- 1 0 0 0 2 0 0 1 -6
- 1 -100 0 0 2 0 0 1 -5
- 1 0 0 100 -1 0 0 0 98
- 1 0 100 0 -1 0 0 0 99
- 1 0 0 0 -1 0 1 0 -1
- 1 0 200 0 -2 0 0 1 194
- 1 0 0 0 -2 0 2 1 -6
- 1 50 0 0 -1 0 0 0 50
- 1 0 -1 1 0 0 0 0 -1
- 1 0 0 100 0 0 0 0 97
- 1 0 -200 200 0 0 0 1 192
- 1 0 0 200 0 0 0 1 190
- 1 -100 0 200 0 0 0 1 191
- 1 0 1 -1 0 0 0 0 1
- 1 0 0 -100 0 0 1 0 0
- 1 0 200 -200 0 0 0 1 196
- 1 0 0 -200 0 0 2 1 -4
- 1 50 0 -100 0 0 0 0 51
- 1 -100 200 0 0 0 0 2 189
- 1 -100 200 0 0 0 0 1 193
- 1 0 100 0 0 0 0 1 94
- 1 0 200 0 0 0 0 1 192
- 1 0 50 0 0 0 0 0 49
- 1 100 -200 0 0 0 0 1 96
- 1 0 -100 0 0 0 1 1 -5
- 1 0 -100 0 0 0 1 0 -100
- 1 0 -200 0 0 0 2 1 -204
- 1 50 -100 0 0 0 0 0 -49
- 1 50 0 0 0 0 0 0 49
- 1 100 0 0 0 0 0 1 94
- 1 100 0 0 0 0 0 3 284
- 1 50 0 0 0 0 0 1 45
- 1 -100 0 0 0 0 2 1 -7
- 1 -100 0 0 0 0 2 2 -11
- 1 -100 0 0 0 0 2 4 179
- 1 -100 0 0 0 0 2 3 -15
- 1 0 0 0 0 0 2 1 -8
- 1 0 0 0 0 0 2 3 -16
- 1 0 0 0 0 0 1 1 -6
- 1 0 0 0 0 0 0 1 -4
- 1 0 0 0 0 0 2 4 79
- 1 0 0 0 0 0 2 7 463
- 1 0 0 0 0 0 2 6 269
- 1 0 0 0 0 0 2 5 75
- 1 0 0 0 0 0 1 0 -2
-
-
-0 0 0 # for future options...
-
-
-# 1 prepare-receive stmts:
-1 # domains per statement
-57 9
- 1 0 -200 0 2 1 0 0 -3
- 1 0 0 0 2 1 0 0 -5
- 1 -100 0 0 2 1 0 0 -4
- 1 0 0 0 0 1 0 0 -3
- 1 0 200 0 -2 -1 0 1 197
- 1 0 0 0 -2 -1 2 1 -3
- 1 100 0 0 -2 -1 0 0 103
- 1 0 0 0 0 -1 0 1 -1
- 1 0 0 -100 1 0 0 0 1
- 1 0 -100 0 1 0 0 0 0
- 1 0 0 0 1 0 0 0 -1
- 1 0 -200 0 2 0 0 1 -4
- 1 0 0 0 2 0 0 1 -6
- 1 -100 0 0 2 0 0 1 -5
- 1 0 0 100 -1 0 0 0 98
- 1 0 100 0 -1 0 0 0 99
- 1 0 0 0 -1 0 1 0 -1
- 1 0 200 0 -2 0 0 1 194
- 1 0 0 0 -2 0 2 1 -6
- 1 50 0 0 -1 0 0 0 50
- 1 0 -1 1 0 0 0 0 -1
- 1 0 0 100 0 0 0 0 97
- 1 0 -200 200 0 0 0 1 192
- 1 0 0 200 0 0 0 1 190
- 1 -100 0 200 0 0 0 1 191
- 1 0 1 -1 0 0 0 0 1
- 1 0 0 -100 0 0 1 0 0
- 1 0 200 -200 0 0 0 1 196
- 1 0 0 -200 0 0 2 1 -4
- 1 50 0 -100 0 0 0 0 51
- 1 -100 200 0 0 0 0 2 189
- 1 -100 200 0 0 0 0 1 193
- 1 0 100 0 0 0 0 1 94
- 1 0 200 0 0 0 0 1 192
- 1 0 50 0 0 0 0 0 49
- 1 100 -200 0 0 0 0 1 96
- 1 0 -100 0 0 0 1 1 -5
- 1 0 -100 0 0 0 1 0 -100
- 1 0 -200 0 0 0 2 1 -204
- 1 50 -100 0 0 0 0 0 -49
- 1 50 0 0 0 0 0 0 49
- 1 100 0 0 0 0 0 1 94
- 1 100 0 0 0 0 0 3 284
- 1 50 0 0 0 0 0 1 45
- 1 -100 0 0 0 0 2 1 -7
- 1 -100 0 0 0 0 2 2 -11
- 1 -100 0 0 0 0 2 4 179
- 1 -100 0 0 0 0 2 3 -15
- 1 0 0 0 0 0 2 1 -8
- 1 0 0 0 0 0 2 3 -16
- 1 0 0 0 0 0 1 1 -6
- 1 0 0 0 0 0 0 1 -4
- 1 0 0 0 0 0 2 4 79
- 1 0 0 0 0 0 2 7 463
- 1 0 0 0 0 0 2 6 269
- 1 0 0 0 0 0 2 5 75
- 1 0 0 0 0 0 1 0 -2
-
-
-0 0 0 # for future options...
-
-
-# 1 communication stmts:
-1 # domains per statement
-21 5
- 1 200 0 3 781
- 1 200 0 1 391
- 1 200 0 4 1075
- 1 100 0 1 392
- 1 100 0 0 197
- 1 -200 6 5 377
- 1 -200 6 6 671
- 1 -100 3 2 190
- 1 -200 6 3 -13
- 1 -100 3 1 -5
- 1 0 2 3 484
- 1 0 1 1 95
- 1 0 3 1 192
- 1 0 3 5 873
- 1 0 3 2 189
- 1 0 6 7 1062
- 1 0 6 5 771
- 1 0 3 4 579
- 1 0 0 1 -3
- 1 0 2 1 -5
- 1 0 1 0 -1
-
-
-0 0 0 # for future options...
-
-
-
-1 # set the iterator names
-tileT1 tileP1 other1 other2 other3 other4 other5
-
-# --------------------- SCATTERING --------------------
-4 # Scattering functions
-9 17
- 0 1 0 -1 0 0 0 0 0 0 -1 0 0 0 0 0 0
- 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 0 0 -1 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0 -2 -1 0 0 4
- 0 0 0 0 0 1 0 0 0 0 0 0 -1 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 -1
- 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
-
-9 18
- 0 1 0 -1 0 0 0 0 0 0 -1 0 0 0 0 0 0 0
- 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 0 0 -1 0 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0 0 -2 -1 0 0 4
- 0 0 0 0 0 1 0 0 0 0 0 0 0 -1 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 -2
- 0 0 0 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 0
- 0 0 0 0 0 0 0 0 1 0 0 0 0 0 -1 0 0 0
- 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 -1
-
-9 18
- 0 1 0 0 0 0 0 -1 0 0 -1 0 0 0 0 0 0 -1
- 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 1 0 0 0 0 0 0 0 0 -1 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0 0 -2 -1 0 0 4
- 0 0 0 0 0 1 0 0 0 0 0 0 0 -1 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 1 0 0 0 -1 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 1 0 0 0 0 0 -1 0 0 0
- 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 -1
-
-9 14
- 0 1 0 0 0 0 0 0 0 0 -1 0 0 0
- 0 0 1 0 0 0 0 0 0 0 0 0 0 -1
- 0 0 0 1 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 1 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 1 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 1 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 1 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 1 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 1 0 0 0 0
-
-
-1 # we set the scattering dimension names
-glT1 bl rp1 vT1 vP1 stmtType otherP1 arrAcc1 arrNr1
-
diff --git a/cloog-0.17.0/test/sor1d.good.c b/cloog-0.17.0/test/sor1d.good.c
deleted file mode 100644
index bb5d643..0000000
--- a/cloog-0.17.0/test/sor1d.good.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/sor1d.cloog by CLooG 0.14.0-226-g3fc65ac gmp bits in 0.04s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(tileT1,tileP1,other1,other2) { hash(1); hash(tileT1); hash(tileP1); hash(other1); hash(other2); }
-#define S2(tileT1,tileP1,other1,other2,other3) { hash(2); hash(tileT1); hash(tileP1); hash(other1); hash(other2); hash(other3); }
-#define S3(tileT1,tileP1,other1,other2,other3) { hash(3); hash(tileT1); hash(tileP1); hash(other1); hash(other2); hash(other3); }
-#define S4(tileT1) { hash(4); hash(tileT1); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int glT1, rp1, vT1, vP1, otherP1, arrAcc1;
-  /* Original iterators. */
-  int tileT1, tileP1, other1, other2, other3;
-  if ((M >= 1) && (N >= 3)) {
-    for (glT1=-1;glT1<=floord(3*M+N-5,100);glT1++) {
-      for (rp1=max(max(0,ceild(100*glT1-2*M-N+5,100)),ceild(100*glT1-N-193,300));rp1<=min(min(min(min(floord(glT1+1,2),floord(M,100)),floord(100*glT1+99,100)),floord(50*glT1+51,150)),floord(100*glT1+N+98,300));rp1++) {
-        for (vT1=max(max(max(max(0,100*glT1-100*rp1),100*rp1-1),200*rp1-3),200*rp1-N+1);vT1<=min(min(2*M+N-5,100*glT1-100*rp1+99),200*rp1+N+193);vT1++) {
-          if (rp1 >= max(1,ceild(vT1-N+7,200))) {
-            S3(glT1-rp1,rp1-1,rp1,100*rp1-1,-200*rp1+vT1+6);
-          }
-          for (vP1=max(max(1,ceild(vT1-N+5,2)),100*rp1);vP1<=min(min(floord(vT1+2,2),M),100*rp1+99);vP1++) {
-            S1(glT1-rp1,rp1,vP1,vT1-2*vP1+4);
-            if ((rp1 <= min(floord(M-100,100),floord(vT1-197,200))) && (100*rp1 == vP1-99)) {
-              S2(glT1-rp1,rp1,rp1+1,100*rp1+99,-200*rp1+vT1-194);
-            }
-          }
-        }
-      }
-      S4(glT1);
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/square+triangle-1-1-2-3.c b/cloog-0.17.0/test/square+triangle-1-1-2-3.c
deleted file mode 100644
index c30b4e2..0000000
--- a/cloog-0.17.0/test/square+triangle-1-1-2-3.c
+++ /dev/null
@@ -1,14 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/square+triangle-1-1-2-3.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.00s. */
-for (j=1;j<=M;j++) {
-  S1(1,j);
-}
-for (i=2;i<=M;i++) {
-  S1(i,1);
-  for (j=2;j<=i;j++) {
-    S1(i,j);
-    S2(i,j);
-  }
-  for (j=i+1;j<=M;j++) {
-    S1(i,j);
-  }
-}
diff --git a/cloog-0.17.0/test/square+triangle-1-1-2-3.cloog b/cloog-0.17.0/test/square+triangle-1-1-2-3.cloog
deleted file mode 100644
index ce8f547..0000000
--- a/cloog-0.17.0/test/square+triangle-1-1-2-3.cloog
+++ /dev/null
@@ -1,36 +0,0 @@
-# language: C
-c
-
-# Context
-# {M | M >= 1}
-2 3
-#  M  1
-1  1 -1
-1  0  1
-0
-
-2 # Number of statements
-
-1
-# {i, j | 1<=i<=M; 1<=j<=M}
-5 5
-#  i  j  M  1
-1  1  0  0 -1
-1 -1  0  1  0
-1  0  1  0 -1
-1  0 -1  1  0
-1  0  0  0  1
-0  0  0
-
-1
-# {i, j | 2<=j<=i<=M}
-4 5
-#  i  j  M  1
-1  0  1  0 -2
-1  1 -1  0  0
-1 -1  0  1  0
-1  0  0  0  1
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/square+triangle-1-1-2-3.good.c b/cloog-0.17.0/test/square+triangle-1-1-2-3.good.c
deleted file mode 100644
index ea68a7f..0000000
--- a/cloog-0.17.0/test/square+triangle-1-1-2-3.good.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Generated from ../../../git/cloog/test/square+triangle-1-1-2-3.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Original iterators. */
-  int i, j;
-  for (j=1;j<=M;j++) {
-    S1(1,j) ;
-  }
-  for (i=2;i<=M-1;i++) {
-    S1(i,1) ;
-    for (j=2;j<=i;j++) {
-      S1(i,j) ;
-      S2(i,j) ;
-    }
-    for (j=i+1;j<=M;j++) {
-      S1(i,j) ;
-    }
-  }
-  if (M >= 2) {
-    S1(M,1) ;
-    for (j=2;j<=M;j++) {
-      S1(M,j) ;
-      S2(M,j) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/stride.c b/cloog-0.17.0/test/stride.c
deleted file mode 100644
index d2cf8fe..0000000
--- a/cloog-0.17.0/test/stride.c
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Generated from stride.cloog by CLooG 0.14.0-200-g26bdb56 gmp bits in 0.01s. */
-for (c1=3;c1<=100;c1++) {
-  if (c1 == 25) {
-    S1(25);
-  }
-  if (c1%3 == 0) {
-    S2(c1,c1/3);
-  }
-}
diff --git a/cloog-0.17.0/test/stride.cloog b/cloog-0.17.0/test/stride.cloog
deleted file mode 100644
index 1526377..0000000
--- a/cloog-0.17.0/test/stride.cloog
+++ /dev/null
@@ -1,32 +0,0 @@
-c
-
-0 2
-
-0
-
-2
-
-1
-1 3
-0 -1 25
--1 0 0
-
-1
-3 4
-1 1 0 -3
-1 -1 0 100
-0 1 -3 0
-0 0 0
-
-0
-
-2
-2 5
-0 -1 0 1 0
-0 0 -1 0 0
-
-2 6
-0 -1 0 1 0 0
-0 0 -1 0 1 0
-
-0
diff --git a/cloog-0.17.0/test/stride.good.c b/cloog-0.17.0/test/stride.good.c
deleted file mode 100644
index 7380723..0000000
--- a/cloog-0.17.0/test/stride.good.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Generated from stride.cloog by CLooG 0.14.0-200-g26bdb56 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int c1, c2;
-  /* Original iterators. */
-  int i, j;
-  for (c1=3;c1<=100;c1++) {
-    if (c1 == 25) {
-      S1(25);
-    }
-    if (c1%3 == 0) {
-      S2(c1,c1/3);
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/stride2.c b/cloog-0.17.0/test/stride2.c
deleted file mode 100644
index 320a2fb..0000000
--- a/cloog-0.17.0/test/stride2.c
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Generated from stride2.cloog by CLooG 0.14.0-200-g26bdb56 gmp bits in 0.00s. */
-for (c1=3;c1<=100;c1+=3) {
-  if (c1 == 27) {
-    S1(27);
-  }
-  S2(c1,c1/3);
-}
diff --git a/cloog-0.17.0/test/stride2.cloog b/cloog-0.17.0/test/stride2.cloog
deleted file mode 100644
index 72a597a..0000000
--- a/cloog-0.17.0/test/stride2.cloog
+++ /dev/null
@@ -1,32 +0,0 @@
-c
-
-0 2
-
-0
-
-2
-
-1
-1 3
-0 -1 27
--1 0 0
-
-1
-3 4
-1 1 0 -3
-1 -1 0 100
-0 1 -3 0
-0 0 0
-
-0
-
-2
-2 5
-0 -1 0 1 0
-0 0 -1 0 0
-
-2 6
-0 -1 0 1 0 0
-0 0 -1 0 1 0
-
-0
diff --git a/cloog-0.17.0/test/stride2.good.c b/cloog-0.17.0/test/stride2.good.c
deleted file mode 100644
index 4cf8b60..0000000
--- a/cloog-0.17.0/test/stride2.good.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Generated from stride2.cloog by CLooG 0.14.0-200-g26bdb56 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test()
-{
-  /* Scattering iterators. */
-  int c1, c2;
-  /* Original iterators. */
-  int i, j;
-  for (c1=3;c1<=100;c1+=3) {
-    if (c1 == 27) {
-      S1(27);
-    }
-    S2(c1,c1/3);
-  }
-}
diff --git a/cloog-0.17.0/test/stride3.c b/cloog-0.17.0/test/stride3.c
deleted file mode 100644
index c228cb6..0000000
--- a/cloog-0.17.0/test/stride3.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/stride3.cloog by CLooG 0.14.0-291-g5879c32 gmp bits in 0.00s. */
-if ((m <= n) && (n >= 1)) {
-  for (p1=max(50,50*m);p1<=50*n;p1+=50) {
-    S1(p1/50);
-  }
-}
diff --git a/cloog-0.17.0/test/stride3.cloog b/cloog-0.17.0/test/stride3.cloog
deleted file mode 100644
index bd5d6b0..0000000
--- a/cloog-0.17.0/test/stride3.cloog
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-# ---------------------- CONTEXT ----------------------
-c # language is C
-
-# Context (no constraints on two parameters)
-1 4                   # 1 lines and 4 columns
-# eq/in m  n  1
-1   0  0  0       # 0 >= 0, always true
-
-1 # We want to set manually the parameter names
-m n                   # parameter names
-
-# --------------------- STATEMENTS --------------------
-1 # Number of statements
-
-1 # First statement: two domains
-# First domain
-3 5                   # 3 lines and 5 columns
-# eq/in i  m  n  1
-1   1  0  0 -1    # i >= 1
-1  -1  0  1  0    # i <= n
-1   1 -1  0  0    # i >= m
-# Second domain
-0  0  0               # for future options
-
-
-1 # We want to set manually the iterator names
-i j                   # iterator names
-
-# --------------------- SCATTERING --------------------
-1 # Scattering functions
-# First function
-2 7                   # 2 lines and 7 columns
-# eq/in p1 p2  i  m  n  1 
-0    1  0 -50  0  0  0    # p1 = i
-0    0  1  0  0  0  0    # p2 = 0
-
-1 # We want to set manually the scattering dimension names
-p1 p2                 # scattering dimension names
-
diff --git a/cloog-0.17.0/test/stride4.c b/cloog-0.17.0/test/stride4.c
deleted file mode 100644
index 2e874be..0000000
--- a/cloog-0.17.0/test/stride4.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/stride4.cloog by CLooG 0.16.0-10-g13c6274 gmp bits in 0.00s. */
-if ((t >= 0) && (t <= 15)) {
-  for (i0=t;i0<=99;i0+=16) {
-    S1(i0,t);
-  }
-}
diff --git a/cloog-0.17.0/test/stride4.cloog b/cloog-0.17.0/test/stride4.cloog
deleted file mode 100644
index 0271d97..0000000
--- a/cloog-0.17.0/test/stride4.cloog
+++ /dev/null
@@ -1,33 +0,0 @@
-# Language: C
-c
-
-# Context:
-1
-
-0 3 0 0 0 1
-
-1 # Parameter name(s)
-t 
-# Statement number:
-1
-
-# Iteration domain of statement 1.
-1
-
-6 6 2 0 1 1
-0     1     0    16    -1     0
-0     0     1     0    -1     0
-1     1     0     0     0     0
-1    -1     0     0     0    99
-1     0     0     0     1     0
-1     0     0     0    -1    15
-
-0 0 0 # For future options.
-
-
-1 # Iterator name(s)
-
-i0 i1
-
-# No scattering functions.
-0
diff --git a/cloog-0.17.0/test/swim.c b/cloog-0.17.0/test/swim.c
deleted file mode 100644
index 0a0046a..0000000
--- a/cloog-0.17.0/test/swim.c
+++ /dev/null
@@ -1,672 +0,0 @@
-/* Generated from ../../../git/cloog/test/swim.cloog by CLooG 0.16.1-3-g277eafa gmp bits in 0.20s. */
-if (M == 1) {
-  S1();
-  S2();
-  S3();
-  S4();
-  S5();
-  S6();
-  S7();
-  S8();
-  S9();
-  S10();
-  S11();
-  S12();
-  S13();
-  S14();
-  S15();
-  S16();
-  S17();
-  S18();
-  S19();
-  S20();
-  S21();
-  S22();
-  S23();
-  S24();
-  S25();
-  S26();
-  S27();
-  for (p1=1;p1<=N;p1++) {
-    for (p3=1;p3<=N;p3++) {
-      S28(p1,p3);
-      S29(p1,p3);
-      S30(p1,p3);
-    }
-    S31(p1);
-  }
-  S32();
-  S33();
-  S34();
-  if (O <= 1) {
-    S35();
-  }
-  S36();
-  S37();
-  if ((N >= 1) && (Q >= 1) && (R >= 1)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1);
-      S39(p1);
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S40(p1,p3,p5);
-          S41(p1,p3,p5);
-          S42(p1,p3,p5);
-          S43(p1,p3,p5);
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S44(p1,p3);
-        S45(p1,p3);
-        S46(p1,p3);
-        S47(p1,p3);
-      }
-      for (p3=1;p3<=R;p3++) {
-        S48(p1,p3);
-        S49(p1,p3);
-        S50(p1,p3);
-        S51(p1,p3);
-      }
-      S52(p1);
-      S53(p1);
-      S54(p1);
-      S55(p1);
-      S56(p1);
-      S57(p1);
-      S58(p1);
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S59(p1,p3,p5);
-          S60(p1,p3,p5);
-          S61(p1,p3,p5);
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S62(p1,p3);
-        S63(p1,p3);
-        S64(p1,p3);
-      }
-      for (p3=1;p3<=R;p3++) {
-        S65(p1,p3);
-        S66(p1,p3);
-        S67(p1,p3);
-      }
-      S68(p1);
-      S69(p1);
-      S70(p1);
-      S71(p1);
-      S72(p1);
-      S73(p1);
-      S74(p1);
-      S75(p1);
-      S76(p1);
-      S77(p1);
-      S78(p1);
-      S79(p1);
-      S80(p1);
-      S81(p1);
-      S82(p1);
-      S83(p1);
-      S84(p1);
-      S85(p1);
-      S86(p1);
-      S87(p1);
-      S88(p1);
-      S89(p1);
-      S90(p1);
-      S91(p1);
-      S92(p1);
-      S93(p1);
-      S94(p1);
-      for (p3=1;p3<=N;p3++) {
-        for (p5=1;p5<=N;p5++) {
-          S95(p1,p3,p5);
-          S96(p1,p3,p5);
-          S97(p1,p3,p5);
-        }
-        S98(p1,p3);
-      }
-      S99(p1);
-      S100(p1);
-      S101(p1);
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S102(p1,p3,p5);
-          S103(p1,p3,p5);
-          S104(p1,p3,p5);
-          S105(p1,p3,p5);
-          S106(p1,p3,p5);
-          S107(p1,p3,p5);
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S108(p1,p3);
-        S109(p1,p3);
-        S110(p1,p3);
-        S111(p1,p3);
-        S112(p1,p3);
-        S113(p1,p3);
-      }
-      for (p3=1;p3<=R;p3++) {
-        S114(p1,p3);
-        S115(p1,p3);
-        S116(p1,p3);
-        S117(p1,p3);
-        S118(p1,p3);
-        S119(p1,p3);
-      }
-      S120(p1);
-      S121(p1);
-      S122(p1);
-      S123(p1);
-      S124(p1);
-      S125(p1);
-    }
-  }
-  if ((N <= 0) && (Q >= 1) && (R >= 1)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1);
-      S39(p1);
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S40(p1,p3,p5);
-          S41(p1,p3,p5);
-          S42(p1,p3,p5);
-          S43(p1,p3,p5);
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S44(p1,p3);
-        S45(p1,p3);
-        S46(p1,p3);
-        S47(p1,p3);
-      }
-      for (p3=1;p3<=R;p3++) {
-        S48(p1,p3);
-        S49(p1,p3);
-        S50(p1,p3);
-        S51(p1,p3);
-      }
-      S52(p1);
-      S53(p1);
-      S54(p1);
-      S55(p1);
-      S56(p1);
-      S57(p1);
-      S58(p1);
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S59(p1,p3,p5);
-          S60(p1,p3,p5);
-          S61(p1,p3,p5);
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S62(p1,p3);
-        S63(p1,p3);
-        S64(p1,p3);
-      }
-      for (p3=1;p3<=R;p3++) {
-        S65(p1,p3);
-        S66(p1,p3);
-        S67(p1,p3);
-      }
-      S68(p1);
-      S69(p1);
-      S70(p1);
-      S71(p1);
-      S72(p1);
-      S73(p1);
-      S74(p1);
-      S75(p1);
-      S76(p1);
-      S77(p1);
-      S78(p1);
-      S79(p1);
-      S80(p1);
-      S81(p1);
-      S82(p1);
-      S83(p1);
-      S84(p1);
-      S85(p1);
-      S86(p1);
-      S87(p1);
-      S88(p1);
-      S89(p1);
-      S90(p1);
-      S91(p1);
-      S92(p1);
-      S93(p1);
-      S94(p1);
-      S99(p1);
-      S100(p1);
-      S101(p1);
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S102(p1,p3,p5);
-          S103(p1,p3,p5);
-          S104(p1,p3,p5);
-          S105(p1,p3,p5);
-          S106(p1,p3,p5);
-          S107(p1,p3,p5);
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S108(p1,p3);
-        S109(p1,p3);
-        S110(p1,p3);
-        S111(p1,p3);
-        S112(p1,p3);
-        S113(p1,p3);
-      }
-      for (p3=1;p3<=R;p3++) {
-        S114(p1,p3);
-        S115(p1,p3);
-        S116(p1,p3);
-        S117(p1,p3);
-        S118(p1,p3);
-        S119(p1,p3);
-      }
-      S120(p1);
-      S121(p1);
-      S122(p1);
-      S123(p1);
-      S124(p1);
-      S125(p1);
-    }
-  }
-  if ((N >= 1) && (Q >= 1) && (R <= 0)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1);
-      S39(p1);
-      for (p3=1;p3<=Q;p3++) {
-        S44(p1,p3);
-        S45(p1,p3);
-        S46(p1,p3);
-        S47(p1,p3);
-      }
-      S52(p1);
-      S53(p1);
-      S54(p1);
-      S55(p1);
-      S56(p1);
-      S57(p1);
-      S58(p1);
-      for (p3=1;p3<=Q;p3++) {
-        S62(p1,p3);
-        S63(p1,p3);
-        S64(p1,p3);
-      }
-      S68(p1);
-      S69(p1);
-      S70(p1);
-      S71(p1);
-      S72(p1);
-      S73(p1);
-      S74(p1);
-      S75(p1);
-      S76(p1);
-      S77(p1);
-      S78(p1);
-      S79(p1);
-      S80(p1);
-      S81(p1);
-      S82(p1);
-      S83(p1);
-      S84(p1);
-      S85(p1);
-      S86(p1);
-      S87(p1);
-      S88(p1);
-      S89(p1);
-      S90(p1);
-      S91(p1);
-      S92(p1);
-      S93(p1);
-      S94(p1);
-      for (p3=1;p3<=N;p3++) {
-        for (p5=1;p5<=N;p5++) {
-          S95(p1,p3,p5);
-          S96(p1,p3,p5);
-          S97(p1,p3,p5);
-        }
-        S98(p1,p3);
-      }
-      S99(p1);
-      S100(p1);
-      S101(p1);
-      for (p3=1;p3<=Q;p3++) {
-        S108(p1,p3);
-        S109(p1,p3);
-        S110(p1,p3);
-        S111(p1,p3);
-        S112(p1,p3);
-        S113(p1,p3);
-      }
-      S120(p1);
-      S121(p1);
-      S122(p1);
-      S123(p1);
-      S124(p1);
-      S125(p1);
-    }
-  }
-  if ((N <= 0) && (Q >= 1) && (R <= 0)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1);
-      S39(p1);
-      for (p3=1;p3<=Q;p3++) {
-        S44(p1,p3);
-        S45(p1,p3);
-        S46(p1,p3);
-        S47(p1,p3);
-      }
-      S52(p1);
-      S53(p1);
-      S54(p1);
-      S55(p1);
-      S56(p1);
-      S57(p1);
-      S58(p1);
-      for (p3=1;p3<=Q;p3++) {
-        S62(p1,p3);
-        S63(p1,p3);
-        S64(p1,p3);
-      }
-      S68(p1);
-      S69(p1);
-      S70(p1);
-      S71(p1);
-      S72(p1);
-      S73(p1);
-      S74(p1);
-      S75(p1);
-      S76(p1);
-      S77(p1);
-      S78(p1);
-      S79(p1);
-      S80(p1);
-      S81(p1);
-      S82(p1);
-      S83(p1);
-      S84(p1);
-      S85(p1);
-      S86(p1);
-      S87(p1);
-      S88(p1);
-      S89(p1);
-      S90(p1);
-      S91(p1);
-      S92(p1);
-      S93(p1);
-      S94(p1);
-      S99(p1);
-      S100(p1);
-      S101(p1);
-      for (p3=1;p3<=Q;p3++) {
-        S108(p1,p3);
-        S109(p1,p3);
-        S110(p1,p3);
-        S111(p1,p3);
-        S112(p1,p3);
-        S113(p1,p3);
-      }
-      S120(p1);
-      S121(p1);
-      S122(p1);
-      S123(p1);
-      S124(p1);
-      S125(p1);
-    }
-  }
-  if ((N >= 1) && (Q <= 0) && (R >= 1)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1);
-      S39(p1);
-      for (p3=1;p3<=R;p3++) {
-        S48(p1,p3);
-        S49(p1,p3);
-        S50(p1,p3);
-        S51(p1,p3);
-      }
-      S52(p1);
-      S53(p1);
-      S54(p1);
-      S55(p1);
-      S56(p1);
-      S57(p1);
-      S58(p1);
-      for (p3=1;p3<=R;p3++) {
-        S65(p1,p3);
-        S66(p1,p3);
-        S67(p1,p3);
-      }
-      S68(p1);
-      S69(p1);
-      S70(p1);
-      S71(p1);
-      S72(p1);
-      S73(p1);
-      S74(p1);
-      S75(p1);
-      S76(p1);
-      S77(p1);
-      S78(p1);
-      S79(p1);
-      S80(p1);
-      S81(p1);
-      S82(p1);
-      S83(p1);
-      S84(p1);
-      S85(p1);
-      S86(p1);
-      S87(p1);
-      S88(p1);
-      S89(p1);
-      S90(p1);
-      S91(p1);
-      S92(p1);
-      S93(p1);
-      S94(p1);
-      for (p3=1;p3<=N;p3++) {
-        for (p5=1;p5<=N;p5++) {
-          S95(p1,p3,p5);
-          S96(p1,p3,p5);
-          S97(p1,p3,p5);
-        }
-        S98(p1,p3);
-      }
-      S99(p1);
-      S100(p1);
-      S101(p1);
-      for (p3=1;p3<=R;p3++) {
-        S114(p1,p3);
-        S115(p1,p3);
-        S116(p1,p3);
-        S117(p1,p3);
-        S118(p1,p3);
-        S119(p1,p3);
-      }
-      S120(p1);
-      S121(p1);
-      S122(p1);
-      S123(p1);
-      S124(p1);
-      S125(p1);
-    }
-  }
-  if ((N <= 0) && (Q <= 0) && (R >= 1)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1);
-      S39(p1);
-      for (p3=1;p3<=R;p3++) {
-        S48(p1,p3);
-        S49(p1,p3);
-        S50(p1,p3);
-        S51(p1,p3);
-      }
-      S52(p1);
-      S53(p1);
-      S54(p1);
-      S55(p1);
-      S56(p1);
-      S57(p1);
-      S58(p1);
-      for (p3=1;p3<=R;p3++) {
-        S65(p1,p3);
-        S66(p1,p3);
-        S67(p1,p3);
-      }
-      S68(p1);
-      S69(p1);
-      S70(p1);
-      S71(p1);
-      S72(p1);
-      S73(p1);
-      S74(p1);
-      S75(p1);
-      S76(p1);
-      S77(p1);
-      S78(p1);
-      S79(p1);
-      S80(p1);
-      S81(p1);
-      S82(p1);
-      S83(p1);
-      S84(p1);
-      S85(p1);
-      S86(p1);
-      S87(p1);
-      S88(p1);
-      S89(p1);
-      S90(p1);
-      S91(p1);
-      S92(p1);
-      S93(p1);
-      S94(p1);
-      S99(p1);
-      S100(p1);
-      S101(p1);
-      for (p3=1;p3<=R;p3++) {
-        S114(p1,p3);
-        S115(p1,p3);
-        S116(p1,p3);
-        S117(p1,p3);
-        S118(p1,p3);
-        S119(p1,p3);
-      }
-      S120(p1);
-      S121(p1);
-      S122(p1);
-      S123(p1);
-      S124(p1);
-      S125(p1);
-    }
-  }
-  if ((N >= 1) && (Q <= 0) && (R <= 0)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1);
-      S39(p1);
-      S52(p1);
-      S53(p1);
-      S54(p1);
-      S55(p1);
-      S56(p1);
-      S57(p1);
-      S58(p1);
-      S68(p1);
-      S69(p1);
-      S70(p1);
-      S71(p1);
-      S72(p1);
-      S73(p1);
-      S74(p1);
-      S75(p1);
-      S76(p1);
-      S77(p1);
-      S78(p1);
-      S79(p1);
-      S80(p1);
-      S81(p1);
-      S82(p1);
-      S83(p1);
-      S84(p1);
-      S85(p1);
-      S86(p1);
-      S87(p1);
-      S88(p1);
-      S89(p1);
-      S90(p1);
-      S91(p1);
-      S92(p1);
-      S93(p1);
-      S94(p1);
-      for (p3=1;p3<=N;p3++) {
-        for (p5=1;p5<=N;p5++) {
-          S95(p1,p3,p5);
-          S96(p1,p3,p5);
-          S97(p1,p3,p5);
-        }
-        S98(p1,p3);
-      }
-      S99(p1);
-      S100(p1);
-      S101(p1);
-      S120(p1);
-      S121(p1);
-      S122(p1);
-      S123(p1);
-      S124(p1);
-      S125(p1);
-    }
-  }
-  if ((N <= 0) && (Q <= 0) && (R <= 0)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1);
-      S39(p1);
-      S52(p1);
-      S53(p1);
-      S54(p1);
-      S55(p1);
-      S56(p1);
-      S57(p1);
-      S58(p1);
-      S68(p1);
-      S69(p1);
-      S70(p1);
-      S71(p1);
-      S72(p1);
-      S73(p1);
-      S74(p1);
-      S75(p1);
-      S76(p1);
-      S77(p1);
-      S78(p1);
-      S79(p1);
-      S80(p1);
-      S81(p1);
-      S82(p1);
-      S83(p1);
-      S84(p1);
-      S85(p1);
-      S86(p1);
-      S87(p1);
-      S88(p1);
-      S89(p1);
-      S90(p1);
-      S91(p1);
-      S92(p1);
-      S93(p1);
-      S94(p1);
-      S99(p1);
-      S100(p1);
-      S101(p1);
-      S120(p1);
-      S121(p1);
-      S122(p1);
-      S123(p1);
-      S124(p1);
-      S125(p1);
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/swim.cloog b/cloog-0.17.0/test/swim.cloog
deleted file mode 100644
index 9216e46..0000000
--- a/cloog-0.17.0/test/swim.cloog
+++ /dev/null
@@ -1,2453 +0,0 @@
-c # language is C
-# ---------- CONTEXT ----------
-# Context (no constraints on parameters)
-1    8     # 1 lines, 8 columns
-0    0    0    0    0    0    0    0    
-
-0 # Automatically find parameter names
-
-# ---------- STATEMENTS ----------
-125 # Number of statements
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -1   
-1    -1   0    0    1    0    0    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    1    0    0    0    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -1   
-1    -1   0    0    1    0    0    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    1    0    0    0    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -1   
-1    -1   0    0    1    0    0    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    1    0    0    0    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -1   
-1    -1   0    1    0    0    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-4    8    
-1    0    0    -1   0    0    0    1    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-3    8    
-1    1    0    0    0    0    0    -1   
-1    -1   0    0    0    0    0    1    
-1    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    1    0    0    0    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    1    0    0    0    0    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    1    0    0    0    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    1    0    0    0    0    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    1    0    0    0    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    1    0    0    0    0    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    1    0    0    0    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-9    11   
-1    1    0    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    0    
-1    0    0    0    1    0    0    0    0    0    -1   
-1    0    0    0    -1   0    0    0    0    0    1    
-1    0    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    1    0    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-7    10   
-1    1    0    0    0    0    0    0    0    -2   
-1    -1   0    0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    0    
-1    0    0    1    0    0    0    0    0    -1   
-1    0    0    -1   0    0    0    0    0    1    
-1    0    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-1 # Statement has 1 domain
-5    9    
-1    1    0    0    0    0    0    0    -2   
-1    -1   0    0    0    1    0    0    0    
-1    0    1    0    0    0    0    0    -1   
-1    0    -1   0    0    0    0    0    1    
-1    0    -1   0    0    0    0    0    1    
-0    0    0    
-
-0 # Automatically find iterator names.
-
-# ---------- SCATTERING FUNCTIONS ----------
-125 # Number of scattering functions
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    0     # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -1    # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -2    # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -3    # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -4    # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -5    # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -6    # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -7    # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -8    # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -9    # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -10   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -11   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -12   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -13   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -14   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -15   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -16   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -17   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -18   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -19   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -20   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -21   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -22   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -23   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -24   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -25   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -26   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -27   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -27   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -1    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -27   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -2    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -27   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -1    # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -28   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -29   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -30   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -31   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -32   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    15   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0                   0    0    0    0    0    0    -33   # Beta 0
-0    0    1    0    0    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0                   0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0                   0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0                   0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0                   0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1                   0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    0     # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -1    # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -2    # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -2    # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -1    # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -2    # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -2    # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -2    # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -3    # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -3    # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -3    # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -1    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -3    # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -2    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -3    # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -3    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -4    # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -4    # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -1    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -4    # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -2    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -4    # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -3    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -5    # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -6    # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -7    # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -8    # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -9    # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -10   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -11   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -12   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -12   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -1    # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -12   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -2    # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -13   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -13   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -1    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -13   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -2    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -14   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -14   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -1    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -14   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -2    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -15   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -16   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -17   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -18   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -19   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -20   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -21   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -22   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -23   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -24   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -25   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -26   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -27   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -28   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -29   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -30   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -31   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -32   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -33   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -35   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -36   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -37   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -38   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -39   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -40   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -41   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -42   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -42   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -1    # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -42   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -2    # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -42   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -1    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -43   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -44   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -45   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -46   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -46   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -1    # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -46   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -2    # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -46   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -3    # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -46   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -4    # Beta 3
-
-7    18   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0    0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0    0              0    0    0    0    0    0    -46   # Beta 1
-0    0    0    0    1    0    0    0         0    -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0    0              0    0    0    0    0    0    -5    # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -47   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -47   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -1    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -47   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -2    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -47   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -3    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -47   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -4    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -47   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -5    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -48   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -48   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -1    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -48   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -2    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -48   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -3    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -48   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -4    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    17   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0    0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1   0              0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0    0              0    0    0    0    0    0    -48   # Beta 1
-0    0    0    0    1    0    0    0         0    -1             0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0    0              0    0    0    0    0    0    -5    # Beta 2
-0    0    0    0    0    0    1    0         0    0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0    0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -49   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -50   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -51   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -52   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -53   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-7    16   
-#    p0   p1   p2   p3   p4   p5   p6   
-0    1    0    0    0    0    0    0         0              0    0    0    0    0    0    -34   # Beta 0
-0    0    1    0    0    0    0    0         -1             0    0    0    0    0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0         0              0    0    0    0    0    0    -54   # Beta 1
-0    0    0    0    1    0    0    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0         0              0    0    0    0    0    0    0     # Beta 2
-0    0    0    0    0    0    1    0         0              0    0    0    0    0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1         0              0    0    0    0    0    0    0     # Beta 3
-
-1 # Set the scattering parameter names.
-p0 p1 p2 p3 p4 p5 p6 
-
diff --git a/cloog-0.17.0/test/swim.good.c b/cloog-0.17.0/test/swim.good.c
deleted file mode 100644
index 80f0de1..0000000
--- a/cloog-0.17.0/test/swim.good.c
+++ /dev/null
@@ -1,819 +0,0 @@
-/* Generated from ../../../git/cloog/test/swim.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.70s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1() { hash(1); }
-#define S2() { hash(2); }
-#define S3() { hash(3); }
-#define S4() { hash(4); }
-#define S5() { hash(5); }
-#define S6() { hash(6); }
-#define S7() { hash(7); }
-#define S8() { hash(8); }
-#define S9() { hash(9); }
-#define S10() { hash(10); }
-#define S11() { hash(11); }
-#define S12() { hash(12); }
-#define S13() { hash(13); }
-#define S14() { hash(14); }
-#define S15() { hash(15); }
-#define S16() { hash(16); }
-#define S17() { hash(17); }
-#define S18() { hash(18); }
-#define S19() { hash(19); }
-#define S20() { hash(20); }
-#define S21() { hash(21); }
-#define S22() { hash(22); }
-#define S23() { hash(23); }
-#define S24() { hash(24); }
-#define S25() { hash(25); }
-#define S26() { hash(26); }
-#define S27() { hash(27); }
-#define S28(i,j) { hash(28); hash(i); hash(j); }
-#define S29(i,j) { hash(29); hash(i); hash(j); }
-#define S30(i,j) { hash(30); hash(i); hash(j); }
-#define S31(i) { hash(31); hash(i); }
-#define S32() { hash(32); }
-#define S33() { hash(33); }
-#define S34() { hash(34); }
-#define S35() { hash(35); }
-#define S36() { hash(36); }
-#define S37() { hash(37); }
-#define S38(i) { hash(38); hash(i); }
-#define S39(i) { hash(39); hash(i); }
-#define S40(i,j,k) { hash(40); hash(i); hash(j); hash(k); }
-#define S41(i,j,k) { hash(41); hash(i); hash(j); hash(k); }
-#define S42(i,j,k) { hash(42); hash(i); hash(j); hash(k); }
-#define S43(i,j,k) { hash(43); hash(i); hash(j); hash(k); }
-#define S44(i,j) { hash(44); hash(i); hash(j); }
-#define S45(i,j) { hash(45); hash(i); hash(j); }
-#define S46(i,j) { hash(46); hash(i); hash(j); }
-#define S47(i,j) { hash(47); hash(i); hash(j); }
-#define S48(i,j) { hash(48); hash(i); hash(j); }
-#define S49(i,j) { hash(49); hash(i); hash(j); }
-#define S50(i,j) { hash(50); hash(i); hash(j); }
-#define S51(i,j) { hash(51); hash(i); hash(j); }
-#define S52(i) { hash(52); hash(i); }
-#define S53(i) { hash(53); hash(i); }
-#define S54(i) { hash(54); hash(i); }
-#define S55(i) { hash(55); hash(i); }
-#define S56(i) { hash(56); hash(i); }
-#define S57(i) { hash(57); hash(i); }
-#define S58(i) { hash(58); hash(i); }
-#define S59(i,j,k) { hash(59); hash(i); hash(j); hash(k); }
-#define S60(i,j,k) { hash(60); hash(i); hash(j); hash(k); }
-#define S61(i,j,k) { hash(61); hash(i); hash(j); hash(k); }
-#define S62(i,j) { hash(62); hash(i); hash(j); }
-#define S63(i,j) { hash(63); hash(i); hash(j); }
-#define S64(i,j) { hash(64); hash(i); hash(j); }
-#define S65(i,j) { hash(65); hash(i); hash(j); }
-#define S66(i,j) { hash(66); hash(i); hash(j); }
-#define S67(i,j) { hash(67); hash(i); hash(j); }
-#define S68(i) { hash(68); hash(i); }
-#define S69(i) { hash(69); hash(i); }
-#define S70(i) { hash(70); hash(i); }
-#define S71(i) { hash(71); hash(i); }
-#define S72(i) { hash(72); hash(i); }
-#define S73(i) { hash(73); hash(i); }
-#define S74(i) { hash(74); hash(i); }
-#define S75(i) { hash(75); hash(i); }
-#define S76(i) { hash(76); hash(i); }
-#define S77(i) { hash(77); hash(i); }
-#define S78(i) { hash(78); hash(i); }
-#define S79(i) { hash(79); hash(i); }
-#define S80(i) { hash(80); hash(i); }
-#define S81(i) { hash(81); hash(i); }
-#define S82(i) { hash(82); hash(i); }
-#define S83(i) { hash(83); hash(i); }
-#define S84(i) { hash(84); hash(i); }
-#define S85(i) { hash(85); hash(i); }
-#define S86(i) { hash(86); hash(i); }
-#define S87(i) { hash(87); hash(i); }
-#define S88(i) { hash(88); hash(i); }
-#define S89(i) { hash(89); hash(i); }
-#define S90(i) { hash(90); hash(i); }
-#define S91(i) { hash(91); hash(i); }
-#define S92(i) { hash(92); hash(i); }
-#define S93(i) { hash(93); hash(i); }
-#define S94(i) { hash(94); hash(i); }
-#define S95(i,j,k) { hash(95); hash(i); hash(j); hash(k); }
-#define S96(i,j,k) { hash(96); hash(i); hash(j); hash(k); }
-#define S97(i,j,k) { hash(97); hash(i); hash(j); hash(k); }
-#define S98(i,j) { hash(98); hash(i); hash(j); }
-#define S99(i) { hash(99); hash(i); }
-#define S100(i) { hash(100); hash(i); }
-#define S101(i) { hash(101); hash(i); }
-#define S102(i,j,k) { hash(102); hash(i); hash(j); hash(k); }
-#define S103(i,j,k) { hash(103); hash(i); hash(j); hash(k); }
-#define S104(i,j,k) { hash(104); hash(i); hash(j); hash(k); }
-#define S105(i,j,k) { hash(105); hash(i); hash(j); hash(k); }
-#define S106(i,j,k) { hash(106); hash(i); hash(j); hash(k); }
-#define S107(i,j,k) { hash(107); hash(i); hash(j); hash(k); }
-#define S108(i,j) { hash(108); hash(i); hash(j); }
-#define S109(i,j) { hash(109); hash(i); hash(j); }
-#define S110(i,j) { hash(110); hash(i); hash(j); }
-#define S111(i,j) { hash(111); hash(i); hash(j); }
-#define S112(i,j) { hash(112); hash(i); hash(j); }
-#define S113(i,j) { hash(113); hash(i); hash(j); }
-#define S114(i,j) { hash(114); hash(i); hash(j); }
-#define S115(i,j) { hash(115); hash(i); hash(j); }
-#define S116(i,j) { hash(116); hash(i); hash(j); }
-#define S117(i,j) { hash(117); hash(i); hash(j); }
-#define S118(i,j) { hash(118); hash(i); hash(j); }
-#define S119(i,j) { hash(119); hash(i); hash(j); }
-#define S120(i) { hash(120); hash(i); }
-#define S121(i) { hash(121); hash(i); }
-#define S122(i) { hash(122); hash(i); }
-#define S123(i) { hash(123); hash(i); }
-#define S124(i) { hash(124); hash(i); }
-#define S125(i) { hash(125); hash(i); }
-
-void test(int M, int N, int O, int P, int Q, int R)
-{
-  /* Scattering iterators. */
-  int p1, p3, p5;
-  /* Original iterators. */
-  int i, j, k;
-  if (M == 1) {
-    S1() ;
-    S2() ;
-    S3() ;
-    S4() ;
-    S5() ;
-    S6() ;
-    S7() ;
-    S8() ;
-    S9() ;
-    S10() ;
-    S11() ;
-    S12() ;
-    S13() ;
-    S14() ;
-    S15() ;
-    S16() ;
-    S17() ;
-    S18() ;
-    S19() ;
-    S20() ;
-    S21() ;
-    S22() ;
-    S23() ;
-    S24() ;
-    S25() ;
-    S26() ;
-    S27() ;
-  }
-  if (M == 1) {
-    for (p1=1;p1<=N;p1++) {
-      for (p3=1;p3<=N;p3++) {
-        S28(p1,p3) ;
-        S29(p1,p3) ;
-        S30(p1,p3) ;
-      }
-      S31(p1) ;
-    }
-  }
-  if (M == 1) {
-    S32() ;
-    S33() ;
-    S34() ;
-  }
-  if ((M == 1) && (O <= 1)) {
-    S35() ;
-  }
-  if (M == 1) {
-    S36() ;
-    S37() ;
-  }
-  if ((M == 1) && (N >= 1) && (Q >= 1) && (R >= 1)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1) ;
-      S39(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S40(p1,p3,p5) ;
-          S41(p1,p3,p5) ;
-          S42(p1,p3,p5) ;
-          S43(p1,p3,p5) ;
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S44(p1,p3) ;
-        S45(p1,p3) ;
-        S46(p1,p3) ;
-        S47(p1,p3) ;
-      }
-      for (p3=1;p3<=R;p3++) {
-        S48(p1,p3) ;
-        S49(p1,p3) ;
-        S50(p1,p3) ;
-        S51(p1,p3) ;
-      }
-      S52(p1) ;
-      S53(p1) ;
-      S54(p1) ;
-      S55(p1) ;
-      S56(p1) ;
-      S57(p1) ;
-      S58(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S59(p1,p3,p5) ;
-          S60(p1,p3,p5) ;
-          S61(p1,p3,p5) ;
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S62(p1,p3) ;
-        S63(p1,p3) ;
-        S64(p1,p3) ;
-      }
-      for (p3=1;p3<=R;p3++) {
-        S65(p1,p3) ;
-        S66(p1,p3) ;
-        S67(p1,p3) ;
-      }
-      S68(p1) ;
-      S69(p1) ;
-      S70(p1) ;
-      S71(p1) ;
-      S72(p1) ;
-      S73(p1) ;
-      S74(p1) ;
-      S75(p1) ;
-      S76(p1) ;
-      S77(p1) ;
-      S78(p1) ;
-      S79(p1) ;
-      S80(p1) ;
-      S81(p1) ;
-      S82(p1) ;
-      S83(p1) ;
-      S84(p1) ;
-      S85(p1) ;
-      S86(p1) ;
-      S87(p1) ;
-      S88(p1) ;
-      S89(p1) ;
-      S90(p1) ;
-      S91(p1) ;
-      S92(p1) ;
-      S93(p1) ;
-      S94(p1) ;
-      for (p3=1;p3<=N;p3++) {
-        for (p5=1;p5<=N;p5++) {
-          S95(p1,p3,p5) ;
-          S96(p1,p3,p5) ;
-          S97(p1,p3,p5) ;
-        }
-        S98(p1,p3) ;
-      }
-      S99(p1) ;
-      S100(p1) ;
-      S101(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S102(p1,p3,p5) ;
-          S103(p1,p3,p5) ;
-          S104(p1,p3,p5) ;
-          S105(p1,p3,p5) ;
-          S106(p1,p3,p5) ;
-          S107(p1,p3,p5) ;
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S108(p1,p3) ;
-        S109(p1,p3) ;
-        S110(p1,p3) ;
-        S111(p1,p3) ;
-        S112(p1,p3) ;
-        S113(p1,p3) ;
-      }
-      for (p3=1;p3<=R;p3++) {
-        S114(p1,p3) ;
-        S115(p1,p3) ;
-        S116(p1,p3) ;
-        S117(p1,p3) ;
-        S118(p1,p3) ;
-        S119(p1,p3) ;
-      }
-      S120(p1) ;
-      S121(p1) ;
-      S122(p1) ;
-      S123(p1) ;
-      S124(p1) ;
-      S125(p1) ;
-    }
-  }
-  if ((M == 1) && (N <= 0) && (Q >= 1) && (R >= 1)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1) ;
-      S39(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S40(p1,p3,p5) ;
-          S41(p1,p3,p5) ;
-          S42(p1,p3,p5) ;
-          S43(p1,p3,p5) ;
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S44(p1,p3) ;
-        S45(p1,p3) ;
-        S46(p1,p3) ;
-        S47(p1,p3) ;
-      }
-      for (p3=1;p3<=R;p3++) {
-        S48(p1,p3) ;
-        S49(p1,p3) ;
-        S50(p1,p3) ;
-        S51(p1,p3) ;
-      }
-      S52(p1) ;
-      S53(p1) ;
-      S54(p1) ;
-      S55(p1) ;
-      S56(p1) ;
-      S57(p1) ;
-      S58(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S59(p1,p3,p5) ;
-          S60(p1,p3,p5) ;
-          S61(p1,p3,p5) ;
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S62(p1,p3) ;
-        S63(p1,p3) ;
-        S64(p1,p3) ;
-      }
-      for (p3=1;p3<=R;p3++) {
-        S65(p1,p3) ;
-        S66(p1,p3) ;
-        S67(p1,p3) ;
-      }
-      S68(p1) ;
-      S69(p1) ;
-      S70(p1) ;
-      S71(p1) ;
-      S72(p1) ;
-      S73(p1) ;
-      S74(p1) ;
-      S75(p1) ;
-      S76(p1) ;
-      S77(p1) ;
-      S78(p1) ;
-      S79(p1) ;
-      S80(p1) ;
-      S81(p1) ;
-      S82(p1) ;
-      S83(p1) ;
-      S84(p1) ;
-      S85(p1) ;
-      S86(p1) ;
-      S87(p1) ;
-      S88(p1) ;
-      S89(p1) ;
-      S90(p1) ;
-      S91(p1) ;
-      S92(p1) ;
-      S93(p1) ;
-      S94(p1) ;
-      S99(p1) ;
-      S100(p1) ;
-      S101(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        for (p5=1;p5<=R;p5++) {
-          S102(p1,p3,p5) ;
-          S103(p1,p3,p5) ;
-          S104(p1,p3,p5) ;
-          S105(p1,p3,p5) ;
-          S106(p1,p3,p5) ;
-          S107(p1,p3,p5) ;
-        }
-      }
-      for (p3=1;p3<=Q;p3++) {
-        S108(p1,p3) ;
-        S109(p1,p3) ;
-        S110(p1,p3) ;
-        S111(p1,p3) ;
-        S112(p1,p3) ;
-        S113(p1,p3) ;
-      }
-      for (p3=1;p3<=R;p3++) {
-        S114(p1,p3) ;
-        S115(p1,p3) ;
-        S116(p1,p3) ;
-        S117(p1,p3) ;
-        S118(p1,p3) ;
-        S119(p1,p3) ;
-      }
-      S120(p1) ;
-      S121(p1) ;
-      S122(p1) ;
-      S123(p1) ;
-      S124(p1) ;
-      S125(p1) ;
-    }
-  }
-  if ((M == 1) && (N >= 1) && (Q <= 0) && (R >= 1)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1) ;
-      S39(p1) ;
-      for (p3=1;p3<=R;p3++) {
-        S48(p1,p3) ;
-        S49(p1,p3) ;
-        S50(p1,p3) ;
-        S51(p1,p3) ;
-      }
-      S52(p1) ;
-      S53(p1) ;
-      S54(p1) ;
-      S55(p1) ;
-      S56(p1) ;
-      S57(p1) ;
-      S58(p1) ;
-      for (p3=1;p3<=R;p3++) {
-        S65(p1,p3) ;
-        S66(p1,p3) ;
-        S67(p1,p3) ;
-      }
-      S68(p1) ;
-      S69(p1) ;
-      S70(p1) ;
-      S71(p1) ;
-      S72(p1) ;
-      S73(p1) ;
-      S74(p1) ;
-      S75(p1) ;
-      S76(p1) ;
-      S77(p1) ;
-      S78(p1) ;
-      S79(p1) ;
-      S80(p1) ;
-      S81(p1) ;
-      S82(p1) ;
-      S83(p1) ;
-      S84(p1) ;
-      S85(p1) ;
-      S86(p1) ;
-      S87(p1) ;
-      S88(p1) ;
-      S89(p1) ;
-      S90(p1) ;
-      S91(p1) ;
-      S92(p1) ;
-      S93(p1) ;
-      S94(p1) ;
-      for (p3=1;p3<=N;p3++) {
-        for (p5=1;p5<=N;p5++) {
-          S95(p1,p3,p5) ;
-          S96(p1,p3,p5) ;
-          S97(p1,p3,p5) ;
-        }
-        S98(p1,p3) ;
-      }
-      S99(p1) ;
-      S100(p1) ;
-      S101(p1) ;
-      for (p3=1;p3<=R;p3++) {
-        S114(p1,p3) ;
-        S115(p1,p3) ;
-        S116(p1,p3) ;
-        S117(p1,p3) ;
-        S118(p1,p3) ;
-        S119(p1,p3) ;
-      }
-      S120(p1) ;
-      S121(p1) ;
-      S122(p1) ;
-      S123(p1) ;
-      S124(p1) ;
-      S125(p1) ;
-    }
-  }
-  if ((M == 1) && (N <= 0) && (Q <= 0) && (R >= 1)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1) ;
-      S39(p1) ;
-      for (p3=1;p3<=R;p3++) {
-        S48(p1,p3) ;
-        S49(p1,p3) ;
-        S50(p1,p3) ;
-        S51(p1,p3) ;
-      }
-      S52(p1) ;
-      S53(p1) ;
-      S54(p1) ;
-      S55(p1) ;
-      S56(p1) ;
-      S57(p1) ;
-      S58(p1) ;
-      for (p3=1;p3<=R;p3++) {
-        S65(p1,p3) ;
-        S66(p1,p3) ;
-        S67(p1,p3) ;
-      }
-      S68(p1) ;
-      S69(p1) ;
-      S70(p1) ;
-      S71(p1) ;
-      S72(p1) ;
-      S73(p1) ;
-      S74(p1) ;
-      S75(p1) ;
-      S76(p1) ;
-      S77(p1) ;
-      S78(p1) ;
-      S79(p1) ;
-      S80(p1) ;
-      S81(p1) ;
-      S82(p1) ;
-      S83(p1) ;
-      S84(p1) ;
-      S85(p1) ;
-      S86(p1) ;
-      S87(p1) ;
-      S88(p1) ;
-      S89(p1) ;
-      S90(p1) ;
-      S91(p1) ;
-      S92(p1) ;
-      S93(p1) ;
-      S94(p1) ;
-      S99(p1) ;
-      S100(p1) ;
-      S101(p1) ;
-      for (p3=1;p3<=R;p3++) {
-        S114(p1,p3) ;
-        S115(p1,p3) ;
-        S116(p1,p3) ;
-        S117(p1,p3) ;
-        S118(p1,p3) ;
-        S119(p1,p3) ;
-      }
-      S120(p1) ;
-      S121(p1) ;
-      S122(p1) ;
-      S123(p1) ;
-      S124(p1) ;
-      S125(p1) ;
-    }
-  }
-  if ((M == 1) && (N >= 1) && (Q <= 0) && (R <= 0)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1) ;
-      S39(p1) ;
-      S52(p1) ;
-      S53(p1) ;
-      S54(p1) ;
-      S55(p1) ;
-      S56(p1) ;
-      S57(p1) ;
-      S58(p1) ;
-      S68(p1) ;
-      S69(p1) ;
-      S70(p1) ;
-      S71(p1) ;
-      S72(p1) ;
-      S73(p1) ;
-      S74(p1) ;
-      S75(p1) ;
-      S76(p1) ;
-      S77(p1) ;
-      S78(p1) ;
-      S79(p1) ;
-      S80(p1) ;
-      S81(p1) ;
-      S82(p1) ;
-      S83(p1) ;
-      S84(p1) ;
-      S85(p1) ;
-      S86(p1) ;
-      S87(p1) ;
-      S88(p1) ;
-      S89(p1) ;
-      S90(p1) ;
-      S91(p1) ;
-      S92(p1) ;
-      S93(p1) ;
-      S94(p1) ;
-      for (p3=1;p3<=N;p3++) {
-        for (p5=1;p5<=N;p5++) {
-          S95(p1,p3,p5) ;
-          S96(p1,p3,p5) ;
-          S97(p1,p3,p5) ;
-        }
-        S98(p1,p3) ;
-      }
-      S99(p1) ;
-      S100(p1) ;
-      S101(p1) ;
-      S120(p1) ;
-      S121(p1) ;
-      S122(p1) ;
-      S123(p1) ;
-      S124(p1) ;
-      S125(p1) ;
-    }
-  }
-  if ((M == 1) && (N <= 0) && (Q <= 0) && (R <= 0)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1) ;
-      S39(p1) ;
-      S52(p1) ;
-      S53(p1) ;
-      S54(p1) ;
-      S55(p1) ;
-      S56(p1) ;
-      S57(p1) ;
-      S58(p1) ;
-      S68(p1) ;
-      S69(p1) ;
-      S70(p1) ;
-      S71(p1) ;
-      S72(p1) ;
-      S73(p1) ;
-      S74(p1) ;
-      S75(p1) ;
-      S76(p1) ;
-      S77(p1) ;
-      S78(p1) ;
-      S79(p1) ;
-      S80(p1) ;
-      S81(p1) ;
-      S82(p1) ;
-      S83(p1) ;
-      S84(p1) ;
-      S85(p1) ;
-      S86(p1) ;
-      S87(p1) ;
-      S88(p1) ;
-      S89(p1) ;
-      S90(p1) ;
-      S91(p1) ;
-      S92(p1) ;
-      S93(p1) ;
-      S94(p1) ;
-      S99(p1) ;
-      S100(p1) ;
-      S101(p1) ;
-      S120(p1) ;
-      S121(p1) ;
-      S122(p1) ;
-      S123(p1) ;
-      S124(p1) ;
-      S125(p1) ;
-    }
-  }
-  if ((M == 1) && (N >= 1) && (Q >= 1) && (R <= 0)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1) ;
-      S39(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        S44(p1,p3) ;
-        S45(p1,p3) ;
-        S46(p1,p3) ;
-        S47(p1,p3) ;
-      }
-      S52(p1) ;
-      S53(p1) ;
-      S54(p1) ;
-      S55(p1) ;
-      S56(p1) ;
-      S57(p1) ;
-      S58(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        S62(p1,p3) ;
-        S63(p1,p3) ;
-        S64(p1,p3) ;
-      }
-      S68(p1) ;
-      S69(p1) ;
-      S70(p1) ;
-      S71(p1) ;
-      S72(p1) ;
-      S73(p1) ;
-      S74(p1) ;
-      S75(p1) ;
-      S76(p1) ;
-      S77(p1) ;
-      S78(p1) ;
-      S79(p1) ;
-      S80(p1) ;
-      S81(p1) ;
-      S82(p1) ;
-      S83(p1) ;
-      S84(p1) ;
-      S85(p1) ;
-      S86(p1) ;
-      S87(p1) ;
-      S88(p1) ;
-      S89(p1) ;
-      S90(p1) ;
-      S91(p1) ;
-      S92(p1) ;
-      S93(p1) ;
-      S94(p1) ;
-      for (p3=1;p3<=N;p3++) {
-        for (p5=1;p5<=N;p5++) {
-          S95(p1,p3,p5) ;
-          S96(p1,p3,p5) ;
-          S97(p1,p3,p5) ;
-        }
-        S98(p1,p3) ;
-      }
-      S99(p1) ;
-      S100(p1) ;
-      S101(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        S108(p1,p3) ;
-        S109(p1,p3) ;
-        S110(p1,p3) ;
-        S111(p1,p3) ;
-        S112(p1,p3) ;
-        S113(p1,p3) ;
-      }
-      S120(p1) ;
-      S121(p1) ;
-      S122(p1) ;
-      S123(p1) ;
-      S124(p1) ;
-      S125(p1) ;
-    }
-  }
-  if ((M == 1) && (N <= 0) && (Q >= 1) && (R <= 0)) {
-    for (p1=2;p1<=P;p1++) {
-      S38(p1) ;
-      S39(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        S44(p1,p3) ;
-        S45(p1,p3) ;
-        S46(p1,p3) ;
-        S47(p1,p3) ;
-      }
-      S52(p1) ;
-      S53(p1) ;
-      S54(p1) ;
-      S55(p1) ;
-      S56(p1) ;
-      S57(p1) ;
-      S58(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        S62(p1,p3) ;
-        S63(p1,p3) ;
-        S64(p1,p3) ;
-      }
-      S68(p1) ;
-      S69(p1) ;
-      S70(p1) ;
-      S71(p1) ;
-      S72(p1) ;
-      S73(p1) ;
-      S74(p1) ;
-      S75(p1) ;
-      S76(p1) ;
-      S77(p1) ;
-      S78(p1) ;
-      S79(p1) ;
-      S80(p1) ;
-      S81(p1) ;
-      S82(p1) ;
-      S83(p1) ;
-      S84(p1) ;
-      S85(p1) ;
-      S86(p1) ;
-      S87(p1) ;
-      S88(p1) ;
-      S89(p1) ;
-      S90(p1) ;
-      S91(p1) ;
-      S92(p1) ;
-      S93(p1) ;
-      S94(p1) ;
-      S99(p1) ;
-      S100(p1) ;
-      S101(p1) ;
-      for (p3=1;p3<=Q;p3++) {
-        S108(p1,p3) ;
-        S109(p1,p3) ;
-        S110(p1,p3) ;
-        S111(p1,p3) ;
-        S112(p1,p3) ;
-        S113(p1,p3) ;
-      }
-      S120(p1) ;
-      S121(p1) ;
-      S122(p1) ;
-      S123(p1) ;
-      S124(p1) ;
-      S125(p1) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/test.c b/cloog-0.17.0/test/test.c
deleted file mode 100644
index a3d0711..0000000
--- a/cloog-0.17.0/test/test.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/test.cloog by CLooG 0.14.0-284-ga90f184 gmp bits in 0.01s. */
-for (i=1;i<=2;i++) {
-  for (j=1;j<=M;j++) {
-    S1(i,j);
-  }
-}
-for (i=3;i<=N;i++) {
-  for (j=1;j<=min(M,i-1);j++) {
-    S1(i,j);
-  }
-  if (i >= M+1) {
-    S2(i,i);
-  }
-  if (i <= M) {
-    S1(i,i);
-    S2(i,i);
-  }
-  for (j=i+1;j<=M;j++) {
-    S1(i,j);
-  }
-}
diff --git a/cloog-0.17.0/test/test.cloog b/cloog-0.17.0/test/test.cloog
deleted file mode 100644
index 78bd336..0000000
--- a/cloog-0.17.0/test/test.cloog
+++ /dev/null
@@ -1,33 +0,0 @@
-# language: C
-c
-
-# parameters {m, n | 4<=m<=n}
-2 4
-#  m  n  1
-1 -1  1  0
-1  1  0 -4
-0
-
-2 # Number of statements
-
-1
-# {i, j | 1<=i<=n 1<=j<=m}
-4 6
-#  i  j  m  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1  0  1  0  0 -1
-1  0 -1  1  0  0
-0  0  0
- 
-1
-# {i, j | i=j 3<=j<=N}
-3 6
-#  i  j  m  n  1
-0  1 -1  0  0  0
-1  0  1  0  0 -3
-1  0 -1  0  1  0
-0  0  0
-0
-
-0 # Scattering functions
diff --git a/cloog-0.17.0/test/test.good.c b/cloog-0.17.0/test/test.good.c
deleted file mode 100644
index 3a786f8..0000000
--- a/cloog-0.17.0/test/test.good.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Generated from ../../../git/cloog/test/test.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.02s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-
-void test(int M, int N)
-{
-  /* Original iterators. */
-  int i, j;
-  for (i=1;i<=2;i++) {
-    for (j=1;j<=M;j++) {
-      S1(i,j) ;
-    }
-  }
-  for (i=3;i<=M-1;i++) {
-    for (j=1;j<=i-1;j++) {
-      S1(i,j) ;
-    }
-    S1(i,i) ;
-    S2(i,i) ;
-    for (j=i+1;j<=M;j++) {
-      S1(i,j) ;
-    }
-  }
-  for (j=1;j<=M-1;j++) {
-    S1(M,j) ;
-  }
-  S1(M,M) ;
-  S2(M,M) ;
-  for (i=M+1;i<=N;i++) {
-    for (j=1;j<=M;j++) {
-      S1(i,j) ;
-    }
-    S2(i,i) ;
-  }
-}
diff --git a/cloog-0.17.0/test/thomasset.c b/cloog-0.17.0/test/thomasset.c
deleted file mode 100644
index f201f6f..0000000
--- a/cloog-0.17.0/test/thomasset.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/thomasset.cloog by CLooG 0.14.0-292-g2bfd6ac gmp bits in 0.04s. */
-if (n >= 1) {
-  for (c1=0;c1<=floord(n-4,3);c1++) {
-    for (i=3*c1+1;i<=3*c1+3;i++) {
-      S1(i,c1);
-    }
-  }
-  c1 = floord(n-1,3);
-  if (c1 >= ceild(n-2,3)) {
-    if (c1 == 0) {
-      S1(1,0);
-      for (j=1;j<=n;j++) {
-        S2(1,j,0,0,0);
-      }
-    }
-    if (c1 >= 1) {
-      for (j=1;j<=2;j++) {
-        S2(1,j,0,c1,0);
-      }
-    }
-    for (i=max(2,3*c1+1);i<=n;i++) {
-      S1(i,c1);
-    }
-  }
-  if (3*c1 == n-3) {
-    for (i=n-2;i<=n;i++) {
-      if (n%3 == 0) {
-        S1(i,(n-3)/3);
-      }
-    }
-  }
-  if (c1 >= ceild(n-2,3)) {
-    for (c2=1;c2<=n-1;c2++) {
-      for (j=1;j<=2;j++) {
-        S2(c2+1,j,0,c1,0);
-      }
-    }
-  }
-  for (c1=ceild(n,3);c1<=floord(2*n,3);c1++) {
-    for (c2=0;c2<=n-1;c2++) {
-      for (j=max(1,3*c1-n);j<=min(n,3*c1-n+4);j++) {
-        p = max(ceild(3*c1-j,3),ceild(n-2,3));
-        if (p <= min(floord(n,3),floord(3*c1-j+2,3))) {
-          S2(c2+1,j,0,p,c1-p);
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/thomasset.cloog b/cloog-0.17.0/test/thomasset.cloog
deleted file mode 100644
index 24c30eb..0000000
--- a/cloog-0.17.0/test/thomasset.cloog
+++ /dev/null
@@ -1,51 +0,0 @@
-# language: C
-c
-1 3
-1 0 0 	# 0 >= 0
-1
-n 
-
-# ------------- STATEMENTS -------------
-2	# Number of statements
-
-# ax:Z
-1	# The domain is made of one polyhedron
-4 5	# 4 lines and 5 columns
-#	i	j	n	
-1	-1	0	1	0	
-1	1	0	0	-1	
-1	1	-3	0	-1	
-1	-1	3	0	3	
-0 0 0	# future options
-
-# ax:P
-1	# The domain is made of one polyhedron
-10 8	# 10 lines and 8 columns
-#	i	j	k	p	q	n	
-1	-1	0	0	0	0	1	0	
-1	0	-1	0	0	0	1	0	
-1	0	1	0	0	0	0	-1	
-1	1	0	0	0	0	0	-1	
-1	0	1	0	0	-3	0	0	
-1	0	-1	0	0	3	0	2	
-1	0	0	0	-3	0	1	0	
-1	0	0	0	3	0	-1	2	
-1	0	0	-3	0	0	0	1	
-1	0	0	3	0	0	0	1	
-0 0 0	# future options
-1	# Iterator Names
-i j k p q
-
-# ------------- SCATTERING -------------
-2 # nb scattering functions
-# Scattering for ax:Z
-2 7	# 2 lines and 7 columns
-#	c1	c2	i	j	n	
-0	1	0	0	-1	0	0	
-0	0	1	0	0	0	0	
-# Scattering for ax:P
-2 10	# 2 lines and 10 columns
-#	c1	c2	i	j	k	p	q	n	
-0	1	0	0	0	-1	-1	-1	0	0
-0	0	1	-1	0	0	0	0	0	1	
-0	# Scattering Function Names
diff --git a/cloog-0.17.0/test/thomasset.good.c b/cloog-0.17.0/test/thomasset.good.c
deleted file mode 100644
index f9ca016..0000000
--- a/cloog-0.17.0/test/thomasset.good.c
+++ /dev/null
@@ -1,99 +0,0 @@
-/* Generated from ../../../git/cloog/test/thomasset.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.10s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j,k,p,q) { hash(2); hash(i); hash(j); hash(k); hash(p); hash(q); }
-
-void test(int n)
-{
-  /* Scattering iterators. */
-  int c1, c2;
-  /* Original iterators. */
-  int i, j, k, p, q;
-  for (c1=0;c1<=floord(n-5,3);c1++) {
-    for (i=max(3*c1+1,1);i<=3*c1+3;i++) {
-      S1(i,c1) ;
-    }
-  }
-  if (n == 1) {
-    S1(1,0) ;
-    for (k=0;k<=min(0,0);k++) {
-      for (p=max(0,ceild(-3*k-1,3));p<=min(floord(-3*k+1,3),0);p++) {
-        q = -k-p ;
-        S2(1,1,k,p,-k-p) ;
-      }
-    }
-  }
-  if (n >= 2) {
-    for (c1=max(0,ceild(n-4,3));c1<=0;c1++) {
-      S1(1,c1) ;
-      for (j=1;j<=min(n,3*c1-n+5);j++) {
-        for (k=0;k<=floord(3*c1-j-n+4,3);k++) {
-          for (p=ceild(n-2,3);p<=floord(3*c1-j-3*k+2,3);p++) {
-            q = c1-k-p ;
-            S2(1,j,k,p,c1-k-p) ;
-          }
-        }
-      }
-      for (i=2;i<=min(n,3*c1+3);i++) {
-        S1(i,c1) ;
-      }
-      for (c2=1;c2<=n-1;c2++) {
-        i = c2+1 ;
-        for (j=1;j<=min(3*c1-n+5,n);j++) {
-          for (k=0;k<=floord(3*c1-j-n+4,3);k++) {
-            for (p=ceild(n-2,3);p<=floord(3*c1-j-3*k+2,3);p++) {
-              q = c1-k-p ;
-              S2(c2+1,j,k,p,c1-k-p) ;
-            }
-          }
-        }
-      }
-    }
-  }
-  for (c1=max(1,ceild(n-4,3));c1<=floord(n-1,3);c1++) {
-    for (j=1;j<=3*c1-n+5;j++) {
-      for (k=0;k<=min(floord(3*c1-j-n+4,3),0);k++) {
-        for (p=max(ceild(n-2,3),ceild(3*c1-j-3*k,3));p<=min(floord(3*c1-j-3*k+2,3),floord(n,3));p++) {
-          q = c1-k-p ;
-          S2(1,j,k,p,c1-k-p) ;
-        }
-      }
-    }
-    for (i=3*c1+1;i<=min(n,3*c1+3);i++) {
-      S1(i,c1) ;
-    }
-    for (c2=1;c2<=n-1;c2++) {
-      i = c2+1 ;
-      for (j=1;j<=3*c1-n+5;j++) {
-        for (k=0;k<=min(floord(3*c1-j-n+4,3),0);k++) {
-          for (p=max(ceild(n-2,3),ceild(3*c1-j-3*k,3));p<=min(floord(3*c1-j-3*k+2,3),floord(n,3));p++) {
-            q = c1-k-p ;
-            S2(c2+1,j,k,p,c1-k-p) ;
-          }
-        }
-      }
-    }
-  }
-  if (n >= 1) {
-    for (c1=ceild(n,3);c1<=floord(2*n+1,3);c1++) {
-      for (c2=0;c2<=n-1;c2++) {
-        i = c2+1 ;
-        for (j=max(1,3*c1-n-1);j<=min(n,3*c1-n+5);j++) {
-          for (k=max(ceild(3*c1-j-n,3),0);k<=min(floord(3*c1-j-n+4,3),0);k++) {
-            for (p=max(ceild(n-2,3),ceild(3*c1-j-3*k,3));p<=min(floord(3*c1-j-3*k+2,3),floord(n,3));p++) {
-              q = c1-k-p ;
-              S2(c2+1,j,k,p,c1-k-p) ;
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/tiling.c b/cloog-0.17.0/test/tiling.c
deleted file mode 100644
index 86f2a2e..0000000
--- a/cloog-0.17.0/test/tiling.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Generated from ../../../git/cloog/test/tiling.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.00s. */
-for (ii=0;ii<=floord(n,10);ii++) {
-  for (i=10*ii;i<=min(n,10*ii+9);i++) {
-    S1(ii,i) ;
-  }
-}
diff --git a/cloog-0.17.0/test/tiling.cloog b/cloog-0.17.0/test/tiling.cloog
deleted file mode 100644
index fa2b676..0000000
--- a/cloog-0.17.0/test/tiling.cloog
+++ /dev/null
@@ -1,30 +0,0 @@
-# language: C
-c
-
-# parameter {n | n>= 0}
-1 3
-#  n  1
-1  1  0
-1
-n
-
-1 # Number of statements:
-
-1
-# {ii, i | t*ii<=i<=t*ii+t-1  0<=i<=n}
-4 5
-#  ii   i   n   1
-1   0   1   0   0
-1   0  -1   1   0
-1  10  -1   0   9
-1 -10   1   0   0
-0   0   0
-1
-ii i
-
-0 # Scattering functions
-
-1 6
-# c1  ii   i   n   1
-0  1  -1  -2   0   0
-0
diff --git a/cloog-0.17.0/test/tiling.good.c b/cloog-0.17.0/test/tiling.good.c
deleted file mode 100644
index b736286..0000000
--- a/cloog-0.17.0/test/tiling.good.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from ../../../git/cloog/test/tiling.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(ii,i) { hash(1); hash(ii); hash(i); }
-
-void test(int n)
-{
-  /* Original iterators. */
-  int ii, i;
-  for (ii=0;ii<=floord(n,10);ii++) {
-    for (i=max(10*ii,0);i<=min(10*ii+9,n);i++) {
-      S1(ii,i) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/uday_scalars.c b/cloog-0.17.0/test/uday_scalars.c
deleted file mode 100644
index 6c8564c..0000000
--- a/cloog-0.17.0/test/uday_scalars.c
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Generated from ../../../git/cloog/test/uday_scalars.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if (n >= 0) {
-  for (p3=0;p3<=n;p3++) {
-    S1(p3,0,0) ;
-  }
-  for (p3=0;p3<=n;p3++) {
-    S2(0,p3,0) ;
-  }
-}
diff --git a/cloog-0.17.0/test/uday_scalars.cloog b/cloog-0.17.0/test/uday_scalars.cloog
deleted file mode 100644
index 8da09d4..0000000
--- a/cloog-0.17.0/test/uday_scalars.cloog
+++ /dev/null
@@ -1,58 +0,0 @@
-# Langage: C
-c
-
-# Context (1 parameter)
-# no constraints on parameters:
-1 3
-   1    0    1
-1 # Parameter name(s)
-n
-
-# Statement number:
-2
-
-# Iteration domain of statement 1.
-1 # 1 domain
-4 6 # 4 lines and 6 columns
-#       j    l    m    n    cst
-   1    1    0    0    0    0    # j >= 0
-   1   -1    0    0    1    0    # j <= N
-   0    0    1    0    0    0    # l = 0
-   0    0    0    1    0    0    # m = 0
-0 0 0 # For future options.
-
-# Iteration domain of statement 2.
-1 # 1 domain
-4 6 # 4 lines and 6 columns
-#       j    l    m    n    cst
-   1    0    1    0    0    0    # l >= 0
-   1    0   -1    0    1    0    # l <= N
-   0    1    0    0    0    0    # j = 0
-   0    0    0    1    0    0    # m = 0
-0 0 0 # For future options.
-
-
-1 # Iterator name(s)
-j l m 
-
-# 1 scattering functions.
-2
-# First function
-4 10
-#       p1   p2   p3  p4   j    l    m    n    cst
-   0    1    0    0   0    0    0    0    0    0    # p1 = 0
-   0    0    1    0   0    0    0    0    0   -1    # p2 = 1
-   0    0    0    1   0   -1    0    0    0    0    # p3 = j
-   0    0    0    0   1    0    0    0    0    0    # p4 = 0
-
-# Second function
-4 10
-#       p1   p2   p3  p4   j    l    m    n    cst
-   0    1    0    0   0    0    0    0    0   -1    # p1 = 1
-   0    0    1    0   0    0    0    0    0    0    # p2 = 0
-   0    0    0    1   0    0   -1    0    0    0    # p3 = l
-   0    0    0    0   1    0    0    0    0   -1    # p4 = 1
-
-1 # set scattering dimension names manually
-p1 p2 p3 p4
-
diff --git a/cloog-0.17.0/test/uday_scalars.good.c b/cloog-0.17.0/test/uday_scalars.good.c
deleted file mode 100644
index e4969da..0000000
--- a/cloog-0.17.0/test/uday_scalars.good.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Generated from ../../../git/cloog/test/uday_scalars.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(j,l,m) { hash(1); hash(j); hash(l); hash(m); }
-#define S2(j,l,m) { hash(2); hash(j); hash(l); hash(m); }
-
-void test(int n)
-{
-  /* Scattering iterators. */
-  int p3;
-  /* Original iterators. */
-  int j, l, m;
-  for (p3=0;p3<=n;p3++) {
-    S1(p3,0,0) ;
-  }
-  for (p3=0;p3<=n;p3++) {
-    S2(0,p3,0) ;
-  }
-}
diff --git a/cloog-0.17.0/test/union.c b/cloog-0.17.0/test/union.c
deleted file mode 100644
index f65b26f..0000000
--- a/cloog-0.17.0/test/union.c
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Generated from ../../../git/cloog/test/union.cloog by CLooG 0.16.0-3-g7eee03c gmp bits in 0.00s. */
-if (M <= -1) {
-  for (c1=0;c1<=100;c1++) {
-    S1(c1);
-  }
-}
-if (M >= 11) {
-  for (c1=-100;c1<=0;c1++) {
-    S1(-c1);
-  }
-}
-if ((M >= 1) && (M <= 10)) {
-  for (c1=0;c1<=100;c1++) {
-    S1(c1);
-  }
-}
diff --git a/cloog-0.17.0/test/union.cloog b/cloog-0.17.0/test/union.cloog
deleted file mode 100644
index 33e8425..0000000
--- a/cloog-0.17.0/test/union.cloog
+++ /dev/null
@@ -1,33 +0,0 @@
-c
-
-2
-1 3
-1 1 -1
-
-1 3
-1 -1 -1
-
-0
-
-1
-
-1
-2 4
-1 1 0 0
-1 -1 0 100
-
-0 0 0
-
-0
-
-1
-2
-2 5
-0 -1 1 0 0
-1 0 0 -1 10
-
-2 5
-0 -1 -1 0 0
-1 0 0 1 -11
-
-0
diff --git a/cloog-0.17.0/test/union.good.c b/cloog-0.17.0/test/union.good.c
deleted file mode 100644
index 70b4537..0000000
--- a/cloog-0.17.0/test/union.good.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Generated from ../../../git/cloog/test/union.cloog by CLooG 0.14.0-277-g62f7d82 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int c1;
-  /* Original iterators. */
-  int i;
-  if (M <= -1) {
-    for (c1=0;c1<=100;c1++) {
-      S1(c1);
-    }
-  }
-  if (M >= 1) {
-    if (M >= 11) {
-      for (c1=-100;c1<=0;c1++) {
-        S1(-c1);
-      }
-    }
-    if (M <= 10) {
-      for (c1=0;c1<=100;c1++) {
-        S1(c1);
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/vasilache.c b/cloog-0.17.0/test/vasilache.c
deleted file mode 100644
index 5a00a33..0000000
--- a/cloog-0.17.0/test/vasilache.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Generated from ../../../git/cloog/test/vasilache.cloog by CLooG 0.14.0-162-g1e599e0 gmp bits in 0.03s. */
-S1();
-S2();
-for (p1=0;p1<=N-1;p1++) {
-  for (p3=0;p3<=N-1;p3++) {
-    S4(p1,p3);
-    S5(p1,p3);
-  }
-}
-for (p1=0;p1<=N-1;p1++) {
-  for (p3=0;p3<=N-1;p3++) {
-    for (p5=0;p5<=floord(N-1,32);p5++) {
-      S7(p1,p3,p5,32*p5);
-      for (p7=32*p5+1;p7<=min(N-1,32*p5+31);p7++) {
-        S6(p1,p3,p5,p7-1);
-        S7(p1,p3,p5,p7);
-      }
-      if (p5 <= floord(N-33,32)) {
-        S6(p1,p3,p5,32*p5+31);
-      }
-      if (p5 >= ceild(N-32,32)) {
-        S6(p1,p3,p5,N-1);
-      }
-    }
-  }
-}
-S8();
diff --git a/cloog-0.17.0/test/vasilache.cloog b/cloog-0.17.0/test/vasilache.cloog
deleted file mode 100644
index 29f9598..0000000
--- a/cloog-0.17.0/test/vasilache.cloog
+++ /dev/null
@@ -1,248 +0,0 @@
-#  A SCoP from matmul (matmul.B.main.scop1.cloog) to check normalization
-#
-#  Options:
-#  cloog -f 8 -l 9 vasilache.cloog
-#  
-#  Correct:
-#  S1;
-#  S2;
-#  for (p0=0;p0<=N-1;p0++) {
-#   for (p1=0;p1<=N-1;p1++) {
-#     S4(i = p0,j = p1);
-#     S5(i = p0,j = p1);
-#   }
-#  }
-#  for (p0=0;p0<=N-1;p0++) {
-#   for (p1=0;p1<=N-1;p1++) {
-#     for (p2=0;p2<=floord(N-1,32);p2++) {
-#       S7(i = p0,j = p1,k = p2,l = 32*p2);
-#       for (p3=32*p2+1;p3<=min(N-1,32*p2+31);p3++) {
-#         S6(i = p0,j = p1,k = p2,l = p3-1);
-#         S7(i = p0,j = p1,k = p2,l = p3);
-#       }
-#       if (p2 >= ceild(N-32,32)) {
-#         S6(i = p0,j = p1,k = p2,l = N-1);
-#       }
-#       if (p2 <= floord(N-33,32)) {
-#         S6(i = p0,j = p1,k = p2,l = 32*p2+31);
-#       }
-#     }
-#   }
-#  }
-#  S8;
-#  
-#  
-#  NOT correct:
-#  S1 ;
-#  S2 ;
-#  for (p1=0;p1<=N-1;p1++) {
-#   for (p3=0;p3<=N-1;p3++) {
-#     S4(i = p1,j = p3) ;
-#     S5(i = p1,j = p3) ;
-#   }
-#  }
-#  for (p1=0;p1<=N-1;p1++) {
-#   for (p3=0;p3<=N-1;p3++) {
-#     for (p5=0;p5<=floord(N-1,32);p5++) {
-#       if (p5 <= 0) {
-#         S7(i = p1,j = p3,k = p5,l = 0) ;
-#       }
-#       p7 = 32*p5 ;
-#       l = 32*p5 ;
-#       S7(i = p1,j = p3,k = p5) ;
-#       for (p7=max(32*p5+1,1);p7<=min(32*p5+31,N-1);p7++) {
-#         l = p7-1 ;
-#         S6(i = p1,j = p3,k = p5) ;
-#         S7(i = p1,j = p3,k = p5,l = p7) ;
-#       }
-#       if (p5 >= ceild(N-32,32)) {
-#         l = N-1 ;
-#         S6(i = p1,j = p3,k = p5) ;
-#       }
-#       p7 = 32*p5+32 ;
-#       l = 32*p5+31 ;
-#       S6(i = p1,j = p3,k = p5) ;
-#     }
-#   }
-#  }
-#    S8 ;
-
-
-
-c # language is C
-# ---------- CONTEXT ----------
-# Context (constraints on parameters)
-2    4     # 1 lines, 4 columns
-1    -1   0    3    
-1    0    1    -100 
-
-
-0 # Automatically find parameter names
-
-# ---------- STATEMENTS ----------
-8 # Number of statements
-
-1 # Statement has a non resticted domain
-1    4    
-1    0    0    0    
-0    0    0    
-
-1 # Statement has a non resticted domain
-1    4    
-1    0    0    0    
-0    0    0    
-
-1 # Statement has 1 domain
-1    4    
-1    1    0    -79  
-0    0    0    
-
-1 # Statement has 1 domain
-4    6    
-1    1    0    0    0    0    
-1    -1   0    0    1    -1   
-1    0    1    0    0    0    
-1    0    -1   0    1    -1   
-0    0    0    
-
-1 # Statement has 1 domain
-4    6    
-1    1    0    0    0    0    
-1    -1   0    0    1    -1   
-1    0    1    0    0    0    
-1    0    -1   0    1    -1   
-0    0    0    
-
-1 # Statement has 1 domain
-8    8    
-1    1    0    0    0    0    0    0    
-1    -1   0    0    0    0    1    -1   
-1    0    1    0    0    0    0    0    
-1    0    -1   0    0    0    1    -1   
-1    0    0    0    1    0    0    0    
-1    0    0    0    -1   0    1    -1   
-1    0    0    -32  1    0    0    0    
-1    0    0    32   -1   0    0    31   
-0    0    0    
-
-1 # Statement has 1 domain
-8    8    
-1    1    0    0    0    0    0    0    
-1    -1   0    0    0    0    1    -1   
-1    0    1    0    0    0    0    0    
-1    0    -1   0    0    0    1    -1   
-1    0    0    0    1    0    0    0    
-1    0    0    0    -1   0    1    -1   
-1    0    0    -32  1    0    0    0    
-1    0    0    32   -1   0    0    31   
-0    0    0    
-
-1 # Statement has a non resticted domain
-1    4    
-1    0    0    0    
-0    0    0    
-
-0 # Automatically find iterator names.
-
-# ---------- SCATTERING FUNCTIONS ----------
-8 # Number of scattering functions
-
-9    13   
-#    p0   p1   p2   p3   p4   p5   p6   p7   p8   
-0    1    0    0    0    0    0    0    0    0                   0    0    0     # Beta 0
-0    0    1    0    0    0    0    0    0    0                   0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0    0    0                   0    0    0     # Beta 1
-0    0    0    0    1    0    0    0    0    0                   0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0    0    0                   0    0    0     # Beta 2
-0    0    0    0    0    0    1    0    0    0                   0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1    0    0                   0    0    0     # Beta 3
-0    0    0    0    0    0    0    0    1    0                   0    0    0     # Alpha & Gamma 4
-0    0    0    0    0    0    0    0    0    1                   0    0    0     # Beta 4
-
-9    13   
-#    p0   p1   p2   p3   p4   p5   p6   p7   p8   
-0    1    0    0    0    0    0    0    0    0                   0    0    -1    # Beta 0
-0    0    1    0    0    0    0    0    0    0                   0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0    0    0                   0    0    0     # Beta 1
-0    0    0    0    1    0    0    0    0    0                   0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0    0    0                   0    0    0     # Beta 2
-0    0    0    0    0    0    1    0    0    0                   0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1    0    0                   0    0    0     # Beta 3
-0    0    0    0    0    0    0    0    1    0                   0    0    0     # Alpha & Gamma 4
-0    0    0    0    0    0    0    0    0    1                   0    0    0     # Beta 4
-
-9    13   
-#    p0   p1   p2   p3   p4   p5   p6   p7   p8   
-0    1    0    0    0    0    0    0    0    0                   0    0    -2    # Beta 0
-0    0    1    0    0    0    0    0    0    0                   0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0    0    0                   0    0    0     # Beta 1
-0    0    0    0    1    0    0    0    0    0                   0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0    0    0                   0    0    0     # Beta 2
-0    0    0    0    0    0    1    0    0    0                   0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1    0    0                   0    0    0     # Beta 3
-0    0    0    0    0    0    0    0    1    0                   0    0    0     # Alpha & Gamma 4
-0    0    0    0    0    0    0    0    0    1                   0    0    0     # Beta 4
-
-9    15   
-#    p0   p1   p2   p3   p4   p5   p6   p7   p8   
-0    1    0    0    0    0    0    0    0    0         0    0              0    0    -3    # Beta 0
-0    0    1    0    0    0    0    0    0    0         -1   0              0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0    0    0         0    0              0    0    0     # Beta 1
-0    0    0    0    1    0    0    0    0    0         0    -1             0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0    0    0         0    0              0    0    0     # Beta 2
-0    0    0    0    0    0    1    0    0    0         0    0              0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1    0    0         0    0              0    0    0     # Beta 3
-0    0    0    0    0    0    0    0    1    0         0    0              0    0    0     # Alpha & Gamma 4
-0    0    0    0    0    0    0    0    0    1         0    0              0    0    0     # Beta 4
-
-9    15   
-#    p0   p1   p2   p3   p4   p5   p6   p7   p8   
-0    1    0    0    0    0    0    0    0    0         0    0              0    0    -3    # Beta 0
-0    0    1    0    0    0    0    0    0    0         -1   0              0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0    0    0         0    0              0    0    0     # Beta 1
-0    0    0    0    1    0    0    0    0    0         0    -1             0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0    0    0         0    0              0    0    -1    # Beta 2
-0    0    0    0    0    0    1    0    0    0         0    0              0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1    0    0         0    0              0    0    0     # Beta 3
-0    0    0    0    0    0    0    0    1    0         0    0              0    0    0     # Alpha & Gamma 4
-0    0    0    0    0    0    0    0    0    1         0    0              0    0    0     # Beta 4
-
-9    17   
-#    p0   p1   p2   p3   p4   p5   p6   p7   p8   
-0    1    0    0    0    0    0    0    0    0         0    0    0    0              0    0    -4    # Beta 0
-0    0    1    0    0    0    0    0    0    0         -1   0    0    0              0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0    0    0         0    0    0    0              0    0    0     # Beta 1
-0    0    0    0    1    0    0    0    0    0         0    -1   0    0              0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0    0    0         0    0    0    0              0    0    0     # Beta 2
-0    0    0    0    0    0    1    0    0    0         0    0    -1   0              0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1    0    0         0    0    0    0              0    0    0     # Beta 3
-0    0    0    0    0    0    0    0    1    0         0    0    0    -1             0    0    -1    # Alpha & Gamma 4
-0    0    0    0    0    0    0    0    0    1         0    0    0    0              0    0    0     # Beta 4
-
-9    17   
-#    p0   p1   p2   p3   p4   p5   p6   p7   p8   
-0    1    0    0    0    0    0    0    0    0         0    0    0    0              0    0    -4    # Beta 0
-0    0    1    0    0    0    0    0    0    0         -1   0    0    0              0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0    0    0         0    0    0    0              0    0    0     # Beta 1
-0    0    0    0    1    0    0    0    0    0         0    -1   0    0              0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0    0    0         0    0    0    0              0    0    0     # Beta 2
-0    0    0    0    0    0    1    0    0    0         0    0    -1   0              0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1    0    0         0    0    0    0              0    0    0     # Beta 3
-0    0    0    0    0    0    0    0    1    0         0    0    0    -1             0    0    0     # Alpha & Gamma 4
-0    0    0    0    0    0    0    0    0    1         0    0    0    0              0    0    -1    # Beta 4
-
-9    13   
-#    p0   p1   p2   p3   p4   p5   p6   p7   p8   
-0    1    0    0    0    0    0    0    0    0                   0    0    -5    # Beta 0
-0    0    1    0    0    0    0    0    0    0                   0    0    0     # Alpha & Gamma 1
-0    0    0    1    0    0    0    0    0    0                   0    0    0     # Beta 1
-0    0    0    0    1    0    0    0    0    0                   0    0    0     # Alpha & Gamma 2
-0    0    0    0    0    1    0    0    0    0                   0    0    0     # Beta 2
-0    0    0    0    0    0    1    0    0    0                   0    0    0     # Alpha & Gamma 3
-0    0    0    0    0    0    0    1    0    0                   0    0    0     # Beta 3
-0    0    0    0    0    0    0    0    1    0                   0    0    0     # Alpha & Gamma 4
-0    0    0    0    0    0    0    0    0    1                   0    0    0     # Beta 4
-
-1 # Set the scattering parameter names.
-p0 p1 p2 p3 p4 p5 p6 p7 p8 
-
diff --git a/cloog-0.17.0/test/vasilache.good.c b/cloog-0.17.0/test/vasilache.good.c
deleted file mode 100644
index f12f3fa..0000000
--- a/cloog-0.17.0/test/vasilache.good.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Generated from ../../../git/cloog/test/vasilache.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.15s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1() { hash(1); }
-#define S2() { hash(2); }
-#define S3() { hash(3); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-#define S5(i,j) { hash(5); hash(i); hash(j); }
-#define S6(i,j,k,l) { hash(6); hash(i); hash(j); hash(k); hash(l); }
-#define S7(i,j,k,l) { hash(7); hash(i); hash(j); hash(k); hash(l); }
-#define S8() { hash(8); }
-
-void test(int M, int N)
-{
-  /* Scattering iterators. */
-  int p1, p3, p5, p7;
-  /* Original iterators. */
-  int i, j, k, l;
-  S1() ;
-  S2() ;
-  for (p1=0;p1<=N-1;p1++) {
-    for (p3=0;p3<=N-1;p3++) {
-      S4(p1,p3) ;
-      S5(p1,p3) ;
-    }
-  }
-  for (p1=0;p1<=N-1;p1++) {
-    for (p3=0;p3<=N-1;p3++) {
-      for (p5=0;p5<=floord(N-1,32);p5++) {
-        if (p5 >= 0) {
-          p7 = 32*p5 ;
-          l = 32*p5 ;
-          S7(p1,p3,p5,32*p5) ;
-        }
-        if (p5 <= -1) {
-          S7(p1,p3,p5,0) ;
-        }
-        for (p7=max(32*p5+1,1);p7<=min(N-1,32*p5+31);p7++) {
-          l = p7-1 ;
-          S6(p1,p3,p5,p7-1) ;
-          S7(p1,p3,p5,p7) ;
-        }
-        if (p5 >= ceild(N-32,32)) {
-          l = N-1 ;
-          S6(p1,p3,p5,N-1) ;
-        }
-        if (p5 <= floord(N-33,32)) {
-          p7 = 32*p5+32 ;
-          l = 32*p5+31 ;
-          S6(p1,p3,p5,32*p5+31) ;
-        }
-      }
-    }
-  }
-  S8() ;
-}
diff --git a/cloog-0.17.0/test/vivien.c b/cloog-0.17.0/test/vivien.c
deleted file mode 100644
index d364046..0000000
--- a/cloog-0.17.0/test/vivien.c
+++ /dev/null
@@ -1,195 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/vivien.cloog by CLooG 0.14.0-292-g2bfd6ac gmp bits in 0.12s. */
-if (n >= 0) {
-  for (p1=-54*n+4;p1<=4;p1++) {
-    if (p1%2 == 0) {
-      S1((p1-2)/2);
-    }
-  }
-  if (n >= 1) {
-    S3(1);
-  }
-  if (n <= 1) {
-    S1(2);
-  }
-  if (n >= 2) {
-    S4(1,2);
-    S1(2);
-    S6(1,2);
-  }
-  for (p1=7;p1<=min(9,4*n-2);p1++) {
-    if (p1 == 8) {
-      S4(1,3);
-    }
-    if (p1 == 8) {
-      S1(3);
-    }
-    if (p1 == 8) {
-      S6(1,3);
-    }
-    if (p1 == 9) {
-      S3(2);
-    }
-    if ((p1+1)%2 == 0) {
-      S2((p1-3)/2,1);
-    }
-  }
-  for (p1=10;p1<=min(2*n+58,4*n-2);p1++) {
-    p2 = ceild(-p1+2,4);
-    if (p2 <= min(floord(-p1+2*n,2),floord(-p1+5,4))) {
-      if (p1%2 == 0) {
-        S4(-p2,(p1+2*p2)/2);
-      }
-    }
-    if (p1 >= 4*n-4) {
-      if (p1%2 == 0) {
-        for (p3=1;p3<=floord(p1-2*n-2,2);p3++) {
-          S5((p1-2*n)/2,n,p3);
-        }
-      }
-    }
-    p2 = ceild(-p1+6,4);
-    if (p2 <= min(floord(-p1+2*n,2),floord(-p1+9,4))) {
-      if (p1%2 == 0) {
-        S4(-p2,(p1+2*p2)/2);
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        if (p1%2 == 0) {
-          S5(-p2+1,(p1+2*p2-2)/2,p3);
-        }
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=min(-1,floord(-p1+2*n,2));p2++) {
-      if (p1%2 == 0) {
-        S4(-p2,(p1+2*p2)/2);
-      }
-      if (p1%2 == 0) {
-        S6(-p2+2,(p1+2*p2-4)/2);
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        if (p1%2 == 0) {
-          S5(-p2+1,(p1+2*p2-2)/2,p3);
-        }
-      }
-    }
-    if ((p1 >= 2*n+4) && (p1 <= 4*n-6)) {
-      if (p1%2 == 0) {
-        S6((p1-2*n+2)/2,n-1);
-        for (p3=1;p3<=floord(p1-2*n-2,2);p3++) {
-          S5((p1-2*n)/2,n,p3);
-        }
-      }
-    }
-    if (p1 >= 2*n+6) {
-      if (p1%2 == 0) {
-        S6((p1-2*n)/2,n);
-      }
-    }
-    if (p1 <= 2*n+4) {
-      if (p1%2 == 0) {
-        S6(2,(p1-4)/2);
-      }
-      if ((p1+3)%4 == 0) {
-        S3((p1-1)/4);
-      }
-      if (p1%2 == 0) {
-        S1((p1-2)/2);
-      }
-    }
-    if (p1 >= 2*n+5) {
-      if ((p1+3)%4 == 0) {
-        S3((p1-1)/4);
-      }
-      if (p1%2 == 0) {
-        S1((p1-2)/2);
-      }
-    }
-    if (p1 <= 2*n+2) {
-      if (p1%2 == 0) {
-        S6(1,(p1-2)/2);
-      }
-    }
-    for (p2=max(1,ceild(p1-2*n-1,2));p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        S2((p1-2*p2-1)/2,p2);
-      }
-    }
-  }
-  if ((n >= 2) && (n <= 29)) {
-    S2(n,n-1);
-  }
-  if ((n >= 2) && (n <= 29)) {
-    S1(2*n-1);
-  }
-  if ((n >= 2) && (n <= 28)) {
-    S3(n);
-  }
-  for (p1=max(7,4*n+2);p1<=2*n+58;p1++) {
-    if (p1%2 == 0) {
-      S1((p1-2)/2);
-    }
-  }
-  for (p1=2*n+59;p1<=4*n-2;p1++) {
-    p2 = ceild(-p1+2,4);
-    if (p2 <= min(floord(-p1+2*n,2),floord(-p1+5,4))) {
-      if (p1%2 == 0) {
-        S4(-p2,(p1+2*p2)/2);
-      }
-    }
-    if (p1 >= 4*n-4) {
-      if (p1%2 == 0) {
-        for (p3=1;p3<=floord(p1-2*n-2,2);p3++) {
-          S5((p1-2*n)/2,n,p3);
-        }
-      }
-    }
-    p2 = ceild(-p1+6,4);
-    if (p2 <= min(floord(-p1+2*n,2),floord(-p1+9,4))) {
-      if (p1%2 == 0) {
-        S4(-p2,(p1+2*p2)/2);
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        if (p1%2 == 0) {
-          S5(-p2+1,(p1+2*p2-2)/2,p3);
-        }
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        S4(-p2,(p1+2*p2)/2);
-      }
-      if (p1%2 == 0) {
-        S6(-p2+2,(p1+2*p2-4)/2);
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        if (p1%2 == 0) {
-          S5(-p2+1,(p1+2*p2-2)/2,p3);
-        }
-      }
-    }
-    if (p1 <= 4*n-6) {
-      if (p1%2 == 0) {
-        S6((p1-2*n+2)/2,n-1);
-        for (p3=1;p3<=floord(p1-2*n-2,2);p3++) {
-          S5((p1-2*n)/2,n,p3);
-        }
-      }
-    }
-    if (p1%2 == 0) {
-      S6((p1-2*n)/2,n);
-    }
-    if ((p1+3)%4 == 0) {
-      S3((p1-1)/4);
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        S2((p1-2*p2-1)/2,p2);
-      }
-    }
-  }
-  if (n >= 30) {
-    S2(n,n-1);
-  }
-  if (n >= 29) {
-    S3(n);
-  }
-}
diff --git a/cloog-0.17.0/test/vivien.cloog b/cloog-0.17.0/test/vivien.cloog
deleted file mode 100644
index 3db4103..0000000
--- a/cloog-0.17.0/test/vivien.cloog
+++ /dev/null
@@ -1,156 +0,0 @@
-#    Context
-c # output in language C
-
-# no constraints on parameters
-1 3 # 1 line and 3 columns
-
-# n 1
-1 0 0  # 0 >= 0 always true
-
-1 	# Setting manually the parameter' sname
-n  	# The name
-
-
-
-# --------------------  Statements  ------------------
-6 # Number of statements
-
-
-1 # First statement: 1 domain 
-
-# First domain
-
-2 4  			# 2 lines and 4 columns
-#   i   n    1
-1   1   27   -1		# i >= 1
-1  -1   1    28		# n >= i
-0 0 0
-
-1 # Second statement: 1 domain 
-
-# First domain
-
-4 5  			# 4 lines and 5 columns
-#   i   k   n    1
-1   1   29   0   -1		# i >= 1
-1  -1   0   1    0		# n >= i
-1   0   1   0   -1		# k >= 1
-1   1  -1   0   -1		# k <= i-1
-0 0 0
-
-
-1 # Third statement: 1 domain 
-
-# First domain
-
-2 4  			# 2 lines and 4 columns
-#   i   n    1
-1   1   0   -1		# i >= 1
-1  -1   1    0		# n >= i
-0 0 0
-
-
-1 # Fourth statement: 1 domain 
-
-# First domain
-
-4 5  			# 4 lines and 5 columns
-#   i   j   n    1
-1   1   0   0   -1		# i >= 1
-1  -1   0   1    0		# n >= i
-1  -1   1   0   -1		# j >= i+1
-1   0  -1   1    0		# j <= n
-0 0 0
-
-1 # Fifth statement: 1 domain 
-
-# First domain
-
-6 6  			# 6 lines and 6 columns
-#   i   j   k   n    1
-1   1   0   0   0   -1		# i >= 1
-1  -1   0   0   1    0		# n >= i
-1  -1   1   0   0   -1		# j >= i+1
-1   0  -1   0   1    0		# j <= n
-1   0   0   1   0   -1		# k >= 1
-1   1   0  -1   0   -1		# k <= i-1
-0 0 0
-
-1 # Sixth statement: 1 domain 
-
-# First domain
-
-4 5  			# 4 lines and 5 columns
-#   i   j   n    1
-1   1   0   0   -1		# i >= 1
-1  -1   0   1    0		# n >= i
-1  -1   1   0   -1		# j >= i+1
-1   0  -1   1    0		# j <= n
-0 0 0
-
-
-1 # We manually set the iterator names
-i j k
-
-
-# ------------------------ Scattering -------------------
-
-6 # Number of scattering functions
-
-
-# First function
-3 7					# 3 lines and 7 columns
-#   p1  p2  p3   i   n   1
-0    1   0   0  -2   0  -2	 	# p1 = 2i+2
-0    0   1   0   0   0   0 		# p2 = 0
-0    0   0   1   0   0   0	 	# p3 = 0
-
-# Second function
-3 8					# 3 lines and 8 columns
-#   p1  p2  p3   i   j   n   1
-0    1   0   0  -2  -2   0  -1 		# p1 = 2i+2j+1
-0    0   1   0   0  -1   0   0 		# p2 = j
-0    0   0   1   0   0   0   0 		# p3 = 0
-
-# Third function
-3 7					# 3 lines and 7 columns
-#   p1  p2  p3   i   n   1	
-0    1   0   0  -4   0  -1	 	# p1 = 4i+1
-0    0   1   0   0   0   0 		# p2 = 0
-0    0   0   1   0   0   0 		# p3 = 0
-
-# Fourth function
-3 8					# 3 lines and 8 columns
-#   p1  p2  p3   i   j   n   1
-0    1   0   0  -2  -2   0   0 		# p1 = 2i+2j
-0    0   1   0   1   0   0   0 		# p2 = -i
-0    0   0   1   0   0   0   0 		# p3 = 0
-
-
-# Fifth function
-3 9					# 3 lines and 9 columns
-#   p1  p2  p3   i   j   k   n   1
-0    1   0   0  -2  -2   0   0   0	# p1 = 2i+2j
-0    0   1   0   1   0   0   0  -1	# p2 = -i+1
-0    0   0   1   0   0  -1   0   0	# p3 = k
-
-# Sixth function
-3 8					# 3 lines and 8 columns
-#   p1  p2  p3   i   j   n   1
-0    1   0   0  -2  -2   0   0 		# p1 = 2i+2j
-0    0   1   0   1   0   0  -2 		# p2 = -i+2
-0    0   0   1   0   0   0   0 		# p3 = 0
-
-1 # Manually set the scattering dimensions
-p1 p2 p3
-
-
-
-
-
-
-
-
-
-
-
diff --git a/cloog-0.17.0/test/vivien.good.c b/cloog-0.17.0/test/vivien.good.c
deleted file mode 100644
index 8d2c9d3..0000000
--- a/cloog-0.17.0/test/vivien.good.c
+++ /dev/null
@@ -1,831 +0,0 @@
-/* Generated from ../../../git/cloog/test/vivien.cloog by CLooG 0.14.0-76-gef19709 gmp bits in 0.78s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i) { hash(3); hash(i); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-#define S5(i,j,k) { hash(5); hash(i); hash(j); hash(k); }
-#define S6(i,j) { hash(6); hash(i); hash(j); }
-
-void test(int n)
-{
-  /* Scattering iterators. */
-  int p1, p2, p3;
-  /* Original iterators. */
-  int i, j, k;
-  for (p1=-54*n+4;p1<=min(4,4*n+1);p1++) {
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-  }
-  if (n >= 1) {
-    S3(1) ;
-  }
-  if (n >= 2) {
-    S4(1,2) ;
-    S1(2) ;
-    S6(1,2) ;
-  }
-  for (p1=max(-54*n+4,4*n+2);p1<=6;p1++) {
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-  }
-  for (p1=7;p1<=min(min(2*n+2,9),floord(4*n+12,3));p1++) {
-    for (p2=ceild(-p1+2,4);p2<=-1;p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    if (p1%2 == 0) {
-      j = (p1-2)/2 ;
-      S6(1,(p1-2)/2) ;
-    }
-    if ((p1+1)%2 == 0) {
-      i = (p1-3)/2 ;
-      S2((p1-3)/2,1) ;
-    }
-  }
-  for (p1=2*n+3;p1<=min(9,4*n-2);p1++) {
-    for (p2=ceild(-p1+2,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  if (n >= 4) {
-    S4(2,3) ;
-    S4(1,4) ;
-    S5(2,3,1) ;
-    S6(2,3) ;
-    S1(4) ;
-    S6(1,4) ;
-  }
-  if (n == 3) {
-    S4(2,3) ;
-    S5(2,3,1) ;
-    S6(2,3) ;
-    S1(4) ;
-  }
-  for (p1=11;p1<=min(12,2*n+2);p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p2=ceild(-p1+6,4);p2<=-1;p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    if (p1%2 == 0) {
-      j = (p1-4)/2 ;
-      S6(2,(p1-4)/2) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    if (p1%2 == 0) {
-      j = (p1-2)/2 ;
-      S6(1,(p1-2)/2) ;
-    }
-    if ((p1+1)%2 == 0) {
-      i = (p1-3)/2 ;
-      S2((p1-3)/2,1) ;
-    }
-    for (p2=2;p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  if (n == 4) {
-    S2(4,1) ;
-    S2(3,2) ;
-  }
-  if (n == 5) {
-    S3(3) ;
-    S2(5,1) ;
-    S2(4,2) ;
-  }
-  if (n >= 6) {
-    S3(3) ;
-    S2(5,1) ;
-    S2(4,2) ;
-  }
-  if ((n <= 4) && (n >= 4)) {
-    p1 = 2*n+4 ;
-    for (p2=ceild(-n-1,2);p2<=-2;p2++) {
-      j = p2+n+2 ;
-      S4(-p2,p2+n+2) ;
-    }
-    for (p2=ceild(-n+1,2);p2<=-1;p2++) {
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        j = p2+n+1 ;
-        S5(-p2+1,p2+n+1,p3) ;
-      }
-    }
-    S6(2,n) ;
-    i = n+1 ;
-    S1(n+1) ;
-  }
-  for (p1=14;p1<=2*n+2;p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    p2 = floord(-p1+9,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=-1;p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    if (p1%2 == 0) {
-      j = (p1-4)/2 ;
-      S6(2,(p1-4)/2) ;
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    if (p1%2 == 0) {
-      j = (p1-2)/2 ;
-      S6(1,(p1-2)/2) ;
-    }
-    if ((p1+1)%2 == 0) {
-      i = (p1-3)/2 ;
-      S2((p1-3)/2,1) ;
-    }
-    for (p2=2;p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  if ((n <= 4) && (n >= 4)) {
-    S3(3) ;
-    for (p2=-n+6;p2<=2;p2++) {
-      i = -p2+6 ;
-      S2(-p2+6,p2) ;
-    }
-  }
-  if (n >= 7) {
-    p1 = 2*n+3 ;
-    if ((n+1)%2 == 0) {
-      i = (n+1)/2 ;
-      S3((n+1)/2) ;
-    }
-    S2(n,1) ;
-    for (p2=2;p2<=floord(n,2);p2++) {
-      i = -p2+n+1 ;
-      S2(-p2+n+1,p2) ;
-    }
-  }
-  if ((n <= 6) && (n >= 6)) {
-    p1 = 2*n+3 ;
-    if ((n+1)%2 == 0) {
-      i = (n+1)/2 ;
-      S3((n+1)/2) ;
-    }
-    S2(n,1) ;
-    for (p2=2;p2<=floord(n,2);p2++) {
-      i = -p2+n+1 ;
-      S2(-p2+n+1,p2) ;
-    }
-  }
-  if (n >= 7) {
-    p1 = 2*n+4 ;
-    for (p2=ceild(-n-1,2);p2<=floord(-2*n+1,4);p2++) {
-      j = p2+n+2 ;
-      S4(-p2,p2+n+2) ;
-    }
-    for (p2=ceild(-n+1,2);p2<=floord(-2*n+5,4);p2++) {
-      j = p2+n+2 ;
-      S4(-p2,p2+n+2) ;
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        j = p2+n+1 ;
-        S5(-p2+1,p2+n+1,p3) ;
-      }
-    }
-    for (p2=ceild(-n+3,2);p2<=-2;p2++) {
-      j = p2+n+2 ;
-      S4(-p2,p2+n+2) ;
-      i = -p2+2 ;
-      j = p2+n ;
-      S6(-p2+2,p2+n) ;
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        j = p2+n+1 ;
-        S5(-p2+1,p2+n+1,p3) ;
-      }
-    }
-    j = n-1 ;
-    S6(3,n-1) ;
-    S5(2,n,1) ;
-    S6(2,n) ;
-    i = n+1 ;
-    S1(n+1) ;
-  }
-  if ((n <= 5) && (n >= 5)) {
-    p1 = 2*n+4 ;
-    for (p2=ceild(-n-1,2);p2<=floord(-2*n+1,4);p2++) {
-      j = p2+n+2 ;
-      S4(-p2,p2+n+2) ;
-    }
-    for (p2=ceild(-n+1,2);p2<=-2;p2++) {
-      j = p2+n+2 ;
-      S4(-p2,p2+n+2) ;
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        j = p2+n+1 ;
-        S5(-p2+1,p2+n+1,p3) ;
-      }
-    }
-    for (p2=-1;p2<=floord(-2*n+5,4);p2++) {
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        j = p2+n+1 ;
-        S5(-p2+1,p2+n+1,p3) ;
-      }
-    }
-    for (p2=ceild(-n+3,2);p2<=-1;p2++) {
-      i = -p2+2 ;
-      j = p2+n ;
-      S6(-p2+2,p2+n) ;
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        j = p2+n+1 ;
-        S5(-p2+1,p2+n+1,p3) ;
-      }
-    }
-    S6(2,n) ;
-    i = n+1 ;
-    S1(n+1) ;
-  }
-  if ((n <= 6) && (n >= 6)) {
-    p1 = 2*n+4 ;
-    for (p2=ceild(-n-1,2);p2<=floord(-2*n+1,4);p2++) {
-      j = p2+n+2 ;
-      S4(-p2,p2+n+2) ;
-    }
-    for (p2=ceild(-n+1,2);p2<=-2;p2++) {
-      j = p2+n+2 ;
-      S4(-p2,p2+n+2) ;
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        j = p2+n+1 ;
-        S5(-p2+1,p2+n+1,p3) ;
-      }
-    }
-    j = n-1 ;
-    S6(3,n-1) ;
-    S5(2,n,1) ;
-    S6(2,n) ;
-    i = n+1 ;
-    S1(n+1) ;
-  }
-  for (p1=2*n+5;p1<=min(4*n-10,2*n+58);p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    p2 = floord(-p1+9,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    p2 = floord(-p1+2*n+2,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    for (p2=ceild(-p1+2*n+3,2);p2<=min(floord(-p1+2*n+4,2),-1);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=max(4*n-9,2*n+5);p1<=min(4*n-8,2*n+58);p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p2=ceild(-p1+6,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    p2 = floord(-p1+2*n+2,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    for (p2=ceild(-p1+2*n+3,2);p2<=min(floord(-p1+2*n+4,2),-1);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=max(4*n-7,2*n+5);p1<=min(4*n-6,2*n+58);p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p2=ceild(-p1+6,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=ceild(-p1+2*n+1,2);p2<=floord(-p1+9,4);p2++) {
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=floord(-p1+2*n+2,2);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=ceild(-p1+2*n+3,2);p2<=min(floord(-p1+2*n+4,2),-1);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=max(max(4*n-5,14),2*n+5);p1<=min(4*n-2,2*n+58);p1++) {
-    for (p2=ceild(-p1+2,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-    }
-    for (p2=max(ceild(-p1+2*n+1,2),ceild(-p1+6,4));p2<=floord(-p1+2*n+2,2);p2++) {
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=max(ceild(-p1+10,4),ceild(-p1+2*n+3,2));p2<=min(floord(-p1+2*n+4,2),-1);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  if ((n >= 2) && (n <= 29)) {
-    p1 = 4*n-1 ;
-    p2 = n-1 ;
-    j = n-1 ;
-    S2(n,n-1) ;
-  }
-  for (p1=2*n+59;p1<=4*n-10;p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    p2 = floord(-p1+9,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    p2 = floord(-p1+2*n+2,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    p2 = floord(-p1+2*n+4,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=max(4*n-9,2*n+59);p1<=4*n-8;p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p2=ceild(-p1+6,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    p2 = floord(-p1+2*n+2,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    p2 = floord(-p1+2*n+4,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=max(4*n-7,2*n+59);p1<=4*n-6;p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p2=ceild(-p1+6,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=ceild(-p1+2*n+1,2);p2<=floord(-p1+9,4);p2++) {
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=floord(-p1+2*n+2,2);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    p2 = floord(-p1+2*n+4,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=max(4*n-5,2*n+59);p1<=4*n-2;p1++) {
-    for (p2=ceild(-p1+2,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-    }
-    for (p2=max(ceild(-p1+2*n+1,2),ceild(-p1+6,4));p2<=floord(-p1+2*n+2,2);p2++) {
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=max(ceild(-p1+10,4),ceild(-p1+2*n+3,2));p2<=floord(-p1+2*n+4,2);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=max(4*n,7);p1<=min(4*n+1,2*n+58);p1++) {
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-  }
-  if (n >= 30) {
-    p1 = 4*n-1 ;
-    p2 = n-1 ;
-    j = n-1 ;
-    S2(n,n-1) ;
-  }
-  for (p1=max(max(-54*n+4,4*n+2),7);p1<=2*n+58;p1++) {
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-  }
-  for (p1=max(4*n,2*n+59);p1<=4*n+1;p1++) {
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/vivien2.c b/cloog-0.17.0/test/vivien2.c
deleted file mode 100644
index d4f1f04..0000000
--- a/cloog-0.17.0/test/vivien2.c
+++ /dev/null
@@ -1,168 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/vivien2.cloog by CLooG 0.14.0-292-g2bfd6ac gmp bits in 0.10s. */
-for (p1=-54*n+4;p1<=4;p1++) {
-  if (p1%2 == 0) {
-    S1((p1-2)/2);
-  }
-}
-S3(1);
-S4(1,2);
-S1(2);
-S6(1,2);
-for (p1=7;p1<=9;p1++) {
-  if (p1 == 8) {
-    S4(1,3);
-  }
-  if (p1 == 8) {
-    S1(3);
-  }
-  if (p1 == 8) {
-    S6(1,3);
-  }
-  if (p1 == 9) {
-    S3(2);
-  }
-  if ((p1+1)%2 == 0) {
-    S2((p1-3)/2,1);
-  }
-}
-for (p1=10;p1<=2*n+58;p1++) {
-  p2 = ceild(-p1+2,4);
-  if (p2 <= min(floord(-p1+2*n,2),floord(-p1+5,4))) {
-    if (p1%2 == 0) {
-      S4(-p2,(p1+2*p2)/2);
-    }
-  }
-  if (p1 >= 4*n-4) {
-    if (p1%2 == 0) {
-      for (p3=1;p3<=floord(p1-2*n-2,2);p3++) {
-        S5((p1-2*n)/2,n,p3);
-      }
-    }
-  }
-  p2 = ceild(-p1+6,4);
-  if (p2 <= min(floord(-p1+2*n,2),floord(-p1+9,4))) {
-    if (p1%2 == 0) {
-      S4(-p2,(p1+2*p2)/2);
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      if (p1%2 == 0) {
-        S5(-p2+1,(p1+2*p2-2)/2,p3);
-      }
-    }
-  }
-  for (p2=ceild(-p1+10,4);p2<=min(-1,floord(-p1+2*n,2));p2++) {
-    if (p1%2 == 0) {
-      S4(-p2,(p1+2*p2)/2);
-    }
-    if (p1%2 == 0) {
-      S6(-p2+2,(p1+2*p2-4)/2);
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      if (p1%2 == 0) {
-        S5(-p2+1,(p1+2*p2-2)/2,p3);
-      }
-    }
-  }
-  if ((p1 >= 2*n+4) && (p1 <= 4*n-6)) {
-    if (p1%2 == 0) {
-      S6((p1-2*n+2)/2,n-1);
-      for (p3=1;p3<=floord(p1-2*n-2,2);p3++) {
-        S5((p1-2*n)/2,n,p3);
-      }
-    }
-  }
-  if (p1 >= 2*n+6) {
-    if (p1%2 == 0) {
-      S6((p1-2*n)/2,n);
-    }
-  }
-  if (p1 <= 2*n+4) {
-    if (p1%2 == 0) {
-      S6(2,(p1-4)/2);
-    }
-    if ((p1+3)%4 == 0) {
-      S3((p1-1)/4);
-    }
-    if (p1%2 == 0) {
-      S1((p1-2)/2);
-    }
-  }
-  if (p1 >= 2*n+5) {
-    if ((p1+3)%4 == 0) {
-      S3((p1-1)/4);
-    }
-    if (p1%2 == 0) {
-      S1((p1-2)/2);
-    }
-  }
-  if (p1 <= 2*n+2) {
-    if (p1%2 == 0) {
-      S6(1,(p1-2)/2);
-    }
-  }
-  for (p2=max(1,ceild(p1-2*n-1,2));p2<=floord(p1-3,4);p2++) {
-    if ((p1+1)%2 == 0) {
-      S2((p1-2*p2-1)/2,p2);
-    }
-  }
-}
-for (p1=2*n+59;p1<=4*n-2;p1++) {
-  p2 = ceild(-p1+2,4);
-  if (p2 <= min(floord(-p1+2*n,2),floord(-p1+5,4))) {
-    if (p1%2 == 0) {
-      S4(-p2,(p1+2*p2)/2);
-    }
-  }
-  if (p1 >= 4*n-4) {
-    if (p1%2 == 0) {
-      for (p3=1;p3<=floord(p1-2*n-2,2);p3++) {
-        S5((p1-2*n)/2,n,p3);
-      }
-    }
-  }
-  p2 = ceild(-p1+6,4);
-  if (p2 <= min(floord(-p1+2*n,2),floord(-p1+9,4))) {
-    if (p1%2 == 0) {
-      S4(-p2,(p1+2*p2)/2);
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      if (p1%2 == 0) {
-        S5(-p2+1,(p1+2*p2-2)/2,p3);
-      }
-    }
-  }
-  for (p2=ceild(-p1+10,4);p2<=floord(-p1+2*n,2);p2++) {
-    if (p1%2 == 0) {
-      S4(-p2,(p1+2*p2)/2);
-    }
-    if (p1%2 == 0) {
-      S6(-p2+2,(p1+2*p2-4)/2);
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      if (p1%2 == 0) {
-        S5(-p2+1,(p1+2*p2-2)/2,p3);
-      }
-    }
-  }
-  if (p1 <= 4*n-6) {
-    if (p1%2 == 0) {
-      S6((p1-2*n+2)/2,n-1);
-      for (p3=1;p3<=floord(p1-2*n-2,2);p3++) {
-        S5((p1-2*n)/2,n,p3);
-      }
-    }
-  }
-  if (p1%2 == 0) {
-    S6((p1-2*n)/2,n);
-  }
-  if ((p1+3)%4 == 0) {
-    S3((p1-1)/4);
-  }
-  for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-    if ((p1+1)%2 == 0) {
-      S2((p1-2*p2-1)/2,p2);
-    }
-  }
-}
-S2(n,n-1);
-S3(n);
diff --git a/cloog-0.17.0/test/vivien2.cloog b/cloog-0.17.0/test/vivien2.cloog
deleted file mode 100644
index 42e7fb7..0000000
--- a/cloog-0.17.0/test/vivien2.cloog
+++ /dev/null
@@ -1,156 +0,0 @@
-#    Context
-c # output in language C
-
-# no constraints on parameters
-1 3 # 1 line and 3 columns
-
-# n 1
-1 1 -30  # 0 >= 0 always true
-
-1 	# Setting manually the parameter' sname
-n  	# The name
-
-
-
-# --------------------  Statements  ------------------
-6 # Number of statements
-
-
-1 # First statement: 1 domain 
-
-# First domain
-
-2 4  			# 2 lines and 4 columns
-#   i   n    1
-1   1   27   -1		# i >= 1
-1  -1   1    28		# n >= i
-0 0 0
-
-1 # Second statement: 1 domain 
-
-# First domain
-
-4 5  			# 4 lines and 5 columns
-#   i   k   n    1
-1   1   29   0   -1		# i >= 1
-1  -1   0   1    0		# n >= i
-1   0   1   0   -1		# k >= 1
-1   1  -1   0   -1		# k <= i-1
-0 0 0
-
-
-1 # Third statement: 1 domain 
-
-# First domain
-
-2 4  			# 2 lines and 4 columns
-#   i   n    1
-1   1   0   -1		# i >= 1
-1  -1   1    0		# n >= i
-0 0 0
-
-
-1 # Fourth statement: 1 domain 
-
-# First domain
-
-4 5  			# 4 lines and 5 columns
-#   i   j   n    1
-1   1   0   0   -1		# i >= 1
-1  -1   0   1    0		# n >= i
-1  -1   1   0   -1		# j >= i+1
-1   0  -1   1    0		# j <= n
-0 0 0
-
-1 # Fifth statement: 1 domain 
-
-# First domain
-
-6 6  			# 6 lines and 6 columns
-#   i   j   k   n    1
-1   1   0   0   0   -1		# i >= 1
-1  -1   0   0   1    0		# n >= i
-1  -1   1   0   0   -1		# j >= i+1
-1   0  -1   0   1    0		# j <= n
-1   0   0   1   0   -1		# k >= 1
-1   1   0  -1   0   -1		# k <= i-1
-0 0 0
-
-1 # Sixth statement: 1 domain 
-
-# First domain
-
-4 5  			# 4 lines and 5 columns
-#   i   j   n    1
-1   1   0   0   -1		# i >= 1
-1  -1   0   1    0		# n >= i
-1  -1   1   0   -1		# j >= i+1
-1   0  -1   1    0		# j <= n
-0 0 0
-
-
-1 # We manually set the iterator names
-i j k
-
-
-# ------------------------ Scattering -------------------
-
-6 # Number of scattering functions
-
-
-# First function
-3 7					# 3 lines and 7 columns
-#   p1  p2  p3   i   n   1
-0    1   0   0  -2   0  -2	 	# p1 = 2i+2
-0    0   1   0   0   0   0 		# p2 = 0
-0    0   0   1   0   0   0	 	# p3 = 0
-
-# Second function
-3 8					# 3 lines and 8 columns
-#   p1  p2  p3   i   j   n   1
-0    1   0   0  -2  -2   0  -1 		# p1 = 2i+2j+1
-0    0   1   0   0  -1   0   0 		# p2 = j
-0    0   0   1   0   0   0   0 		# p3 = 0
-
-# Third function
-3 7					# 3 lines and 7 columns
-#   p1  p2  p3   i   n   1	
-0    1   0   0  -4   0  -1	 	# p1 = 4i+1
-0    0   1   0   0   0   0 		# p2 = 0
-0    0   0   1   0   0   0 		# p3 = 0
-
-# Fourth function
-3 8					# 3 lines and 8 columns
-#   p1  p2  p3   i   j   n   1
-0    1   0   0  -2  -2   0   0 		# p1 = 2i+2j
-0    0   1   0   1   0   0   0 		# p2 = -i
-0    0   0   1   0   0   0   0 		# p3 = 0
-
-
-# Fifth function
-3 9					# 3 lines and 9 columns
-#   p1  p2  p3   i   j   k   n   1
-0    1   0   0  -2  -2   0   0   0	# p1 = 2i+2j
-0    0   1   0   1   0   0   0  -1	# p2 = -i+1
-0    0   0   1   0   0  -1   0   0	# p3 = k
-
-# Sixth function
-3 8					# 3 lines and 8 columns
-#   p1  p2  p3   i   j   n   1
-0    1   0   0  -2  -2   0   0 		# p1 = 2i+2j
-0    0   1   0   1   0   0  -2 		# p2 = -i+2
-0    0   0   1   0   0   0   0 		# p3 = 0
-
-1 # Manually set the scattering dimensions
-p1 p2 p3
-
-
-
-
-
-
-
-
-
-
-
diff --git a/cloog-0.17.0/test/vivien2.good.c b/cloog-0.17.0/test/vivien2.good.c
deleted file mode 100644
index 32f1fff..0000000
--- a/cloog-0.17.0/test/vivien2.good.c
+++ /dev/null
@@ -1,656 +0,0 @@
-/* Generated from ../../../git/cloog/test/vivien2.cloog by CLooG 0.14.0-76-gef19709 gmp bits in 0.58s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i) { hash(1); hash(i); }
-#define S2(i,j) { hash(2); hash(i); hash(j); }
-#define S3(i) { hash(3); hash(i); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-#define S5(i,j,k) { hash(5); hash(i); hash(j); hash(k); }
-#define S6(i,j) { hash(6); hash(i); hash(j); }
-
-void test(int n)
-{
-  /* Scattering iterators. */
-  int p1, p2, p3;
-  /* Original iterators. */
-  int i, j, k;
-  for (p1=-54*n+4;p1<=4;p1++) {
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-  }
-  S3(1) ;
-  S4(1,2) ;
-  S1(2) ;
-  S6(1,2) ;
-  for (p1=7;p1<=9;p1++) {
-    for (p2=ceild(-p1+2,4);p2<=-1;p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    if (p1%2 == 0) {
-      j = (p1-2)/2 ;
-      S6(1,(p1-2)/2) ;
-    }
-    if ((p1+1)%2 == 0) {
-      i = (p1-3)/2 ;
-      S2((p1-3)/2,1) ;
-    }
-  }
-  S4(2,3) ;
-  S4(1,4) ;
-  S5(2,3,1) ;
-  S6(2,3) ;
-  S1(4) ;
-  S6(1,4) ;
-  for (p1=11;p1<=12;p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p2=ceild(-p1+6,4);p2<=-1;p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    if (p1%2 == 0) {
-      j = (p1-4)/2 ;
-      S6(2,(p1-4)/2) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    if (p1%2 == 0) {
-      j = (p1-2)/2 ;
-      S6(1,(p1-2)/2) ;
-    }
-    if ((p1+1)%2 == 0) {
-      i = (p1-3)/2 ;
-      S2((p1-3)/2,1) ;
-    }
-    for (p2=2;p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  S3(3) ;
-  S2(5,1) ;
-  S2(4,2) ;
-  for (p1=14;p1<=2*n+2;p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    p2 = floord(-p1+9,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=-1;p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    if (p1%2 == 0) {
-      j = (p1-4)/2 ;
-      S6(2,(p1-4)/2) ;
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    if (p1%2 == 0) {
-      j = (p1-2)/2 ;
-      S6(1,(p1-2)/2) ;
-    }
-    if ((p1+1)%2 == 0) {
-      i = (p1-3)/2 ;
-      S2((p1-3)/2,1) ;
-    }
-    for (p2=2;p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  p1 = 2*n+3 ;
-  if ((n+1)%2 == 0) {
-    i = (n+1)/2 ;
-    S3((n+1)/2) ;
-  }
-  S2(n,1) ;
-  for (p2=2;p2<=floord(n,2);p2++) {
-    i = -p2+n+1 ;
-    S2(-p2+n+1,p2) ;
-  }
-  p1 = 2*n+4 ;
-  for (p2=ceild(-n-1,2);p2<=floord(-2*n+1,4);p2++) {
-    j = p2+n+2 ;
-    S4(-p2,p2+n+2) ;
-  }
-  for (p2=ceild(-n+1,2);p2<=floord(-2*n+5,4);p2++) {
-    j = p2+n+2 ;
-    S4(-p2,p2+n+2) ;
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      j = p2+n+1 ;
-      S5(-p2+1,p2+n+1,p3) ;
-    }
-  }
-  for (p2=ceild(-n+3,2);p2<=-2;p2++) {
-    j = p2+n+2 ;
-    S4(-p2,p2+n+2) ;
-    i = -p2+2 ;
-    j = p2+n ;
-    S6(-p2+2,p2+n) ;
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      j = p2+n+1 ;
-      S5(-p2+1,p2+n+1,p3) ;
-    }
-  }
-  j = n-1 ;
-  S6(3,n-1) ;
-  S5(2,n,1) ;
-  S6(2,n) ;
-  i = n+1 ;
-  S1(n+1) ;
-  for (p1=2*n+5;p1<=min(4*n-10,2*n+58);p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    p2 = floord(-p1+9,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    p2 = floord(-p1+2*n+2,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    for (p2=ceild(-p1+2*n+3,2);p2<=min(floord(-p1+2*n+4,2),-1);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=4*n-9;p1<=min(4*n-8,2*n+58);p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p2=ceild(-p1+6,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    p2 = floord(-p1+2*n+2,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    p2 = floord(-p1+2*n+4,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=4*n-7;p1<=min(4*n-6,2*n+58);p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p2=ceild(-p1+6,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=ceild(-p1+2*n+1,2);p2<=floord(-p1+9,4);p2++) {
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=floord(-p1+2*n+2,2);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    p2 = floord(-p1+2*n+4,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=4*n-5;p1<=2*n+58;p1++) {
-    for (p2=ceild(-p1+2,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-    }
-    for (p2=max(ceild(-p1+2*n+1,2),ceild(-p1+6,4));p2<=floord(-p1+2*n+2,2);p2++) {
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=max(ceild(-p1+2*n+3,2),ceild(-p1+10,4));p2<=floord(-p1+2*n+4,2);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    if (p1%2 == 0) {
-      i = (p1-2)/2 ;
-      S1((p1-2)/2) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=2*n+59;p1<=4*n-10;p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    p2 = floord(-p1+9,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    p2 = floord(-p1+2*n+2,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    p2 = floord(-p1+2*n+4,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=max(4*n-9,2*n+59);p1<=4*n-8;p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p2=ceild(-p1+6,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    p2 = floord(-p1+2*n+2,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    for (p3=1;p3<=-p2;p3++) {
-      i = -p2+1 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-2)/2 ;
-        S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-      }
-    }
-    p2 = floord(-p1+2*n+4,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=max(4*n-7,2*n+59);p1<=4*n-6;p1++) {
-    p2 = floord(-p1+5,4) ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2)/2 ;
-      S4(-p2,(p1+2*p2)/2) ;
-    }
-    for (p2=ceild(-p1+6,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=ceild(-p1+2*n+1,2);p2<=floord(-p1+9,4);p2++) {
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=ceild(-p1+10,4);p2<=floord(-p1+2*n+2,2);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    p2 = floord(-p1+2*n+4,2) ;
-    i = -p2+2 ;
-    if (p1%2 == 0) {
-      j = (p1+2*p2-4)/2 ;
-      S6(-p2+2,(p1+2*p2-4)/2) ;
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  for (p1=max(4*n-5,2*n+59);p1<=4*n-2;p1++) {
-    for (p2=ceild(-p1+2,4);p2<=floord(-p1+2*n,2);p2++) {
-      if (p1%2 == 0) {
-        j = (p1+2*p2)/2 ;
-        S4(-p2,(p1+2*p2)/2) ;
-      }
-    }
-    for (p2=max(ceild(-p1+2*n+1,2),ceild(-p1+6,4));p2<=floord(-p1+2*n+2,2);p2++) {
-      for (p3=1;p3<=-p2;p3++) {
-        i = -p2+1 ;
-        if (p1%2 == 0) {
-          j = (p1+2*p2-2)/2 ;
-          S5(-p2+1,(p1+2*p2-2)/2,p3) ;
-        }
-      }
-    }
-    for (p2=max(ceild(-p1+10,4),ceild(-p1+2*n+3,2));p2<=floord(-p1+2*n+4,2);p2++) {
-      i = -p2+2 ;
-      if (p1%2 == 0) {
-        j = (p1+2*p2-4)/2 ;
-        S6(-p2+2,(p1+2*p2-4)/2) ;
-      }
-    }
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-    for (p2=ceild(p1-2*n-1,2);p2<=floord(p1-3,4);p2++) {
-      if ((p1+1)%2 == 0) {
-        i = (p1-2*p2-1)/2 ;
-        S2((p1-2*p2-1)/2,p2) ;
-      }
-    }
-  }
-  p1 = 4*n-1 ;
-  p2 = n-1 ;
-  j = n-1 ;
-  S2(n,n-1) ;
-  for (p1=4*n;p1<=4*n+1;p1++) {
-    if ((p1+3)%4 == 0) {
-      i = (p1-1)/4 ;
-      S3((p1-1)/4) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/walters.c b/cloog-0.17.0/test/walters.c
deleted file mode 100644
index fdb2183..0000000
--- a/cloog-0.17.0/test/walters.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from ../../../git/cloog/test/walters.cloog by CLooG 0.16.1-3-g354eed5 gmp bits in 0.01s. */
-S2(1,0,1,0);
-S4(1,0,1,0);
-S3(2,0,1,1);
-S4(2,0,1,1);
-for (i=3;i<=10;i++) {
-  if ((i+1)%3 == 0) {
-    S3(i,(i-2)/3,(i+1)/3,(i+1)/3);
-  }
-  if ((i+2)%3 == 0) {
-    S2(i,(i-1)/3,(i+2)/3,(i-1)/3);
-  }
-  if (i%3 == 0) {
-    S1(i,i/3,i/3,i/3);
-  }
-  div36 = floord(i,3);
-  div37 = ceild(2*i-3*div36-1,3);
-  if (div37 <= floord(i+2,3)) {
-    S4(i,div36,div37,i-div36-div37);
-  }
-}
diff --git a/cloog-0.17.0/test/walters.cloog b/cloog-0.17.0/test/walters.cloog
deleted file mode 100644
index 9a3ba81..0000000
--- a/cloog-0.17.0/test/walters.cloog
+++ /dev/null
@@ -1,189 +0,0 @@
-# language: C
-
-c
-
- 
-
-# parameters
-
-1 2
-
-1 1
-
- 1
-
- 
-
-4
-
- 
-
-# S1:  sub1
-
-1
-
-18 6
-
-  1  1  0  0  0 -1
-
-  1 -1  0  0  0 10
-
-  1 -1  3  0  0  2
-
-  1  1 -3  0  0  0
-
-  1  0  1  0  0 -1
-
-  1 -1  3  0  0  0
-
-  1  1  0 -3  0  2
-
-  1 -1  0  3  0  0
-
-  1  1  0  0 -3  1
-
-  1 -1  0  0  3  1
-
-  1  1  0  0  0 -1
-
-  1 -1  0  0  0 10
-
-  1  1 -3  0  0  0
-
-  1 -1  3  0  0  2
-
-  1  1  0 -3  0  2
-
-  1 -1  0  3  0  0
-
-  1  1  0  0 -3  1
-
-  1 -1  0  0  3  1
-
- 0 0 0
-
- 
-
-# S2:  sub2
-
-1
-
-17 6
-
-  1  1  0  0  0 -1
-
-  1 -1  0  0  0 10
-
-  1 -1  0  3  0  0
-
-  1  1  0 -3  0  2
-
-  1 -1  0  3  0 -2
-
-  1  1 -3  0  0  0
-
-  1 -1  3  0  0  2
-
-  1  1  0  0 -3  1
-
-  1 -1  0  0  3  1
-
-  1  1  0  0  0 -1
-
-  1 -1  0  0  0 10
-
-  1  1 -3  0  0  0
-
-  1 -1  3  0  0  2
-
-  1  1  0 -3  0  2
-
-  1 -1  0  3  0  0
-
-  1  1  0  0 -3  1
-
-  1 -1  0  0  3  1
-
- 0 0 0
-
- 
-
-# S3:  sub3
-
-1
-
-18 6
-
-  1 -1  0  0  0 10
-
-  1  1  0  0  0 -1
-
-  1 -1  0  0  3  1
-
-  1  1  0  0 -3  1
-
-  1  0  0  0  1 -1
-
-  1 -1  0  0  3 -1
-
-  1  1 -3  0  0  0
-
-  1 -1  3  0  0  2
-
-  1  1  0 -3  0  2
-
-  1 -1  0  3  0  0
-
-  1  1  0  0  0 -1
-
-  1 -1  0  0  0 10
-
-  1  1 -3  0  0  0
-
-  1 -1  3  0  0  2
-
-  1  1  0 -3  0  2
-
-  1 -1  0  3  0  0
-
-  1  1  0  0 -3  1
-
-  1 -1  0  0  3  1
-
- 0 0 0
-
- 
-
-# S4: enclosing
-
-1
-
-8 6
-
-  1  1  0  0  0 -1
-
-  1 -1  0  0  0 10
-
-  1  1 -3  0  0  0
-
-  1 -1  3  0  0  2
-
-  1  1  0 -3  0  2
-
-  1 -1  0  3  0  0
-
-  1  1  0  0 -3  1
-
-  1 -1  0  0  3  1
-
- 0 0 0
-
- 
-
- 1
-
- i div36 div37 div38
-
- 0
-
- 0
diff --git a/cloog-0.17.0/test/walters.good.c b/cloog-0.17.0/test/walters.good.c
deleted file mode 100644
index 0e1c2b7..0000000
--- a/cloog-0.17.0/test/walters.good.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/walters.cloog by CLooG 0.14.0-223-gad1f0a0 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,div36,div37,div38) { hash(1); hash(i); hash(div36); hash(div37); hash(div38); }
-#define S2(i,div36,div37,div38) { hash(2); hash(i); hash(div36); hash(div37); hash(div38); }
-#define S3(i,div36,div37,div38) { hash(3); hash(i); hash(div36); hash(div37); hash(div38); }
-#define S4(i,div36,div37,div38) { hash(4); hash(i); hash(div36); hash(div37); hash(div38); }
-
-void test()
-{
-  /* Original iterators. */
-  int i, div36, div37, div38;
-  S2(1,0,1,0);
-  S4(1,0,1,0);
-  S3(2,0,1,1);
-  S4(2,0,1,1);
-  for (i=3;i<=10;i++) {
-    if ((i+2)%3 <= 1) {
-      div36 = floord(i-1,3);
-      if ((i+1)%3 <= 1) {
-        div37 = floord(i+1,3);
-        if ((i+1)%3 == 0) {
-          S3(i,div36,div37,(i+1)/3);
-          S4(i,div36,div37,(i+1)/3);
-        }
-      }
-      if ((i+2)%3 == 0) {
-        div38 = floord(i+1,3);
-        S2(i,div36,(i+2)/3,div38);
-        S4(i,div36,(i+2)/3,div38);
-      }
-    }
-    if (i%3 == 0) {
-      div37 = floord(i+2,3);
-      div38 = floord(i+1,3);
-      S1(i,i/3,div37,div38);
-      S4(i,i/3,div37,div38);
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/walters2.c b/cloog-0.17.0/test/walters2.c
deleted file mode 100644
index bc31d9e..0000000
--- a/cloog-0.17.0/test/walters2.c
+++ /dev/null
@@ -1,14 +0,0 @@
-/* Generated from ../../../git/cloog/test/walters2.cloog by CLooG 0.14.0-245-gd8c1718 gmp bits in 0.01s. */
-for (i=0;i<=51;i++) {
-  S2(0,i);
-}
-for (j=1;j<=24;j++) {
-  S2(j,0);
-  for (i=1;i<=50;i++) {
-    S1(j,i);
-  }
-  S2(j,51);
-}
-for (i=0;i<=51;i++) {
-  S2(25,i);
-}
diff --git a/cloog-0.17.0/test/walters2.cloog b/cloog-0.17.0/test/walters2.cloog
deleted file mode 100644
index efdf2f6..0000000
--- a/cloog-0.17.0/test/walters2.cloog
+++ /dev/null
@@ -1,90 +0,0 @@
-# language: C
-c
-
-# parameters
-1 2
-1 1
- 1
-
-2
-
-
-# S1
-1
-12 4
-  1  1  0  0
-  1 -1  0 25
-  1  0  1  0
-  1  0 -1 51
-  1  1  0 -1
-  1  0  1 -1
-  1 -1  0 24
-  1  0 -1 50
-  1  1  0  0
-  1 -1  0 25
-  1  0  1  0
-  1  0 -1 51
- 0 0 0
-
-
-
-
-
-
-# S2
-4
-11 4
-  1  1  0   0
-  1 -1  0  25
-  1  0  1   0
-  1  0 -1  51
-  1  1  0  -1
-  1  0  1  -1
-  1  1  0 -25
-  1  1  0   0
-  1 -1  0  25
-  1  0  1   0
-  1  0 -1  51
-12 4
-  1  1  0   0
-  1 -1  0  25
-  1  0  1   0
-  1  0 -1  51
-  1  1  0  -1
-  1  0  1  -1
-  1 -1  0  24
-  1  0  1 -51
-  1  1  0   0
-  1 -1  0  25
-  1  0  1   0
-  1  0 -1  51
-10 4
-  1  1  0  0
-  1 -1  0 25
-  1  0  1  0
-  1  0 -1 51
-  1  1  0 -1
-  1  0 -1  0
-  1  1  0  0
-  1 -1  0 25
-  1  0  1  0
-  1  0 -1 51
-9 4
-  1  1  0  0
-  1 -1  0 25
-  1  0  1  0
-  1  0 -1 51
-  1 -1  0  0
-  1  1  0  0
-  1 -1  0 25
-  1  0  1  0
-  1  0 -1 51
- 0 0 0
-
-
-
- 1
- j i
- 0
- 0
-
diff --git a/cloog-0.17.0/test/walters2.good.c b/cloog-0.17.0/test/walters2.good.c
deleted file mode 100644
index 2b8990f..0000000
--- a/cloog-0.17.0/test/walters2.good.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Generated from /home/skimo/git/cloog/test/walters2.cloog by CLooG 0.14.0-227-g08f253a gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(j,i) { hash(1); hash(j); hash(i); }
-#define S2(j,i) { hash(2); hash(j); hash(i); }
-
-void test()
-{
-  /* Original iterators. */
-  int j, i;
-  for (i=0;i<=51;i++) {
-    S2(0,i);
-  }
-  for (j=1;j<=24;j++) {
-    S2(j,0);
-    for (i=1;i<=50;i++) {
-      S1(j,i);
-    }
-    S2(j,51);
-  }
-  for (i=0;i<=51;i++) {
-    if (i >= 0) {
-      S2(25,i);
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/walters3.c b/cloog-0.17.0/test/walters3.c
deleted file mode 100644
index fc922d6..0000000
--- a/cloog-0.17.0/test/walters3.c
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Generated from ../../../git/cloog/test/walters3.cloog by CLooG 0.14.0-338-g99c7504 gmp bits in 0.00s. */
-for (j=2;j<=8;j++) {
-  if (j%2 == 0) {
-    S1(j,j/2,j/2);
-    S2(j,j/2,j/2);
-  }
-}
-S2(10,5,5);
diff --git a/cloog-0.17.0/test/walters3.cloog b/cloog-0.17.0/test/walters3.cloog
deleted file mode 100644
index fb45ab0..0000000
--- a/cloog-0.17.0/test/walters3.cloog
+++ /dev/null
@@ -1,49 +0,0 @@
-# language: C
-c
-
-# parameters
-1 2
-1 1
- 1
-
-
-2
-
-1
-15 5
-  1 -1  0  0 10  
-  1 -1  0  0  8
-  1 -1  0  2  1
-  1  1  0 -2  0
-  1 -1  0  2  0
-  1  0  0  1 -1
-  1  1 -2  0  0
-  1 -1  2  0  1
-  1  1  0  0 -1
-  1 -1  0  0 10
-  0  1 -2  0  0
-  1  1 -2  0  0
-  1 -1  2  0  1
-  1  1  0 -2  0
-  1 -1  0  2  1
- 0 0 0
-
-
-
-1
-7 5
-  1  1  0  0 -1
-  1 -1  0  0 10
-  0  1 -2  0  0
-  1  1 -2  0  0
-  1 -1  2  0  1
-  1  1  0 -2  0
-  1 -1  0  2  1
- 0 0 0
-
-
- 1
- j a b
- #-------- SCATTERING -------------
- 0 # no scattering function
-
diff --git a/cloog-0.17.0/test/walters3.good.c b/cloog-0.17.0/test/walters3.good.c
deleted file mode 100644
index 45a1b33..0000000
--- a/cloog-0.17.0/test/walters3.good.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Generated from ../../../git/cloog/test/walters3.cloog by CLooG 0.14.0-338-g99c7504 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(j,a,b) { hash(1); hash(j); hash(a); hash(b); }
-#define S2(j,a,b) { hash(2); hash(j); hash(a); hash(b); }
-
-void test()
-{
-  /* Original iterators. */
-  int j, a, b;
-  for (j=2;j<=8;j++) {
-    if (j%2 == 0) {
-      S1(j,j/2,j/2);
-      S2(j,j/2,j/2);
-    }
-  }
-  S2(10,5,5);
-}
diff --git a/cloog-0.17.0/test/wavefront.c b/cloog-0.17.0/test/wavefront.c
deleted file mode 100644
index c6d2868..0000000
--- a/cloog-0.17.0/test/wavefront.c
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Generated from ../../../git/cloog/test/wavefront.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if ((m >= 1) && (n >= 1)) {
-  for (c1=2;c1<=n+m;c1++) {
-    for (c2=max(1,c1-m);c2<=min(n,c1-1);c2++) {
-      S1(c2,c1-c2) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/wavefront.cloog b/cloog-0.17.0/test/wavefront.cloog
deleted file mode 100644
index 845b368..0000000
--- a/cloog-0.17.0/test/wavefront.cloog
+++ /dev/null
@@ -1,27 +0,0 @@
-c 
-
-1 4
-# n   m   1
-1 0   0   1
-1
-n m 
-
-1 
-
-1
-4 6
-#   i   j   n   m   1
-1   1   0   0   0  -1
-1  -1   0   1   0   0
-1   0   1   0   0  -1
-1   0  -1   0   1   0
-0   0   0
-
-0
-
-1
-2 8
-#  c1  c2   i   j   n   m   1
-0   1   0  -1  -1   0   0   0
-0   0   1  -1   0   0   0   0
-0
diff --git a/cloog-0.17.0/test/wavefront.good.c b/cloog-0.17.0/test/wavefront.good.c
deleted file mode 100644
index c6e721f..0000000
--- a/cloog-0.17.0/test/wavefront.good.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Generated from ../../../git/cloog/test/wavefront.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.00s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-
-void test(int n, int m)
-{
-  /* Scattering iterators. */
-  int c1, c2;
-  /* Original iterators. */
-  int i, j;
-  if ((n >= 1) && (m >= 1)) {
-    for (c1=2;c1<=n+m;c1++) {
-      for (c2=max(1,c1-m);c2<=min(n,c1-1);c2++) {
-        j = c1-c2 ;
-        S1(c2,c1-c2) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/yosr.c b/cloog-0.17.0/test/yosr.c
deleted file mode 100644
index 341c787..0000000
--- a/cloog-0.17.0/test/yosr.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Generated from ../../../git/cloog/test/yosr.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s. */
-if (n >= 2) {
-  for (j=2;j<=n;j++) {
-    S1(1,j) ;
-  }
-  for (proc=2;proc<=n-1;proc++) {
-    for (i=1;i<=proc-1;i++) {
-      for (j=i+1;j<=n;j++) {
-        S2(i,j,proc) ;
-      }
-    }
-    for (j=proc+1;j<=n;j++) {
-      S1(proc,j) ;
-    }
-  }
-  for (i=1;i<=n-1;i++) {
-    for (j=i+1;j<=n;j++) {
-      S2(i,j,n) ;
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/yosr.cloog b/cloog-0.17.0/test/yosr.cloog
deleted file mode 100644
index cefa035..0000000
--- a/cloog-0.17.0/test/yosr.cloog
+++ /dev/null
@@ -1,65 +0,0 @@
-# language: C
-c
-
-# One parameter : n
-1 3
-#  n  1
-1  0  1
-# We want to set the parameter names...
-1
-# and 'n' is the name of the unique parameter
-n
-
-2 # Number of statements: 2.
-
-1
-# {i, j | 1<=i<=n-1; i+1<=j<=n}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1 -1
-1 -1  1  0 -1
-1  0 -1  1  0
-0  0  0
-
-1
-# {i, j, k | 1<=i<=n-1; i+1<=j<=n i+1<=k<=n}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1 -1
-1 -1  1  0  0 -1
-1  0 -1  0  1  0
-1 -1  0  1  0 -1
-1  0  0 -1  1  0
-0  0  0
-# We want to let CLooG set the iterator names.
-0
-
-2
-# Scattering functions
-1 6
-# c1  i  j  n  1
-0  1 -1  0  0  0
-
-1 7
-# c1  i  j  k  n  1
-0  1  0  0 -1  0  0
-1
-proc
-
-2
-# Scattering functions
-3 8
-# c1 c2 c3  i  j  n  1
-0  1  0  0 -1  0  0  0
-0  0  1  0  0  0  0  0
-0  0  0  1  0  0  0  0
-
-3 9
-# c1 c2 c3  i  j  k  n  1
-0  1  0  0  0  0 -1  0  0
-0  0  1  0  0  0  0  0 -1
-0  0  0  1  0  0 -1  0  0
-0
-
diff --git a/cloog-0.17.0/test/yosr.good.c b/cloog-0.17.0/test/yosr.good.c
deleted file mode 100644
index 8845a2c..0000000
--- a/cloog-0.17.0/test/yosr.good.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Generated from ../../../git/cloog/test/yosr.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i,j,k) { hash(2); hash(i); hash(j); hash(k); }
-
-void test(int n)
-{
-  /* Scattering iterators. */
-  int proc;
-  /* Original iterators. */
-  int i, j, k;
-  if (n >= 2) {
-    for (j=2;j<=n;j++) {
-      S1(1,j) ;
-    }
-  }
-  for (proc=2;proc<=n-1;proc++) {
-    for (i=1;i<=proc-1;i++) {
-      for (j=i+1;j<=n;j++) {
-        S2(i,j,proc) ;
-      }
-    }
-    for (j=proc+1;j<=n;j++) {
-      S1(proc,j) ;
-    }
-  }
-  if (n >= 2) {
-    for (i=1;i<=n-1;i++) {
-      for (j=i+1;j<=n;j++) {
-        S2(i,j,n) ;
-      }
-    }
-  }
-}
diff --git a/cloog-0.17.0/test/yosr2.c b/cloog-0.17.0/test/yosr2.c
deleted file mode 100644
index 999eb41..0000000
--- a/cloog-0.17.0/test/yosr2.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Generated from ../../../git/cloog/test/yosr2.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.02s. */
-for (i=1;i<=M;i++) {
-  S2(i) ;
-}
-for (proc=2;proc<=M-1;proc++) {
-  for (i=1;i<=proc-1;i++) {
-    S4(i,proc) ;
-  }
-  for (j=1;j<=proc-1;j++) {
-    S1(proc,j) ;
-  }
-  for (j=proc+1;j<=M;j++) {
-    for (k=1;k<=proc-1;k++) {
-      S3(proc,j,k) ;
-    }
-  }
-}
-for (i=1;i<=M-1;i++) {
-  S4(i,M) ;
-}
-for (j=1;j<=M-1;j++) {
-  S1(M,j) ;
-}
diff --git a/cloog-0.17.0/test/yosr2.cloog b/cloog-0.17.0/test/yosr2.cloog
deleted file mode 100644
index e9dea4a..0000000
--- a/cloog-0.17.0/test/yosr2.cloog
+++ /dev/null
@@ -1,71 +0,0 @@
-# language: C
-c
-
-# parameter n
-1 3
-#  n  1
-1  1 -2
-0
-
-4 # Number of statements
-
-1
-# S2 {k, l | 1<=k<=n; 1<=l<=k-1}
-4 5
-#  k  l  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1  0  1  0 -1
-1  1 -1  0 -1
-0  0  0
-
-1
-# S3 {k | 1<=k<=n}
-2 4
-#  k  n  1
-1  1  0 -1
-1 -1  1  0
-0  0  0
-
-1
-# S5 {k, i, m | 1<=k<=n; k+1<=i<=n 1<=m<=k-1}
-6 6
-#  k  i  m  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1  0
-1 -1  1  0  0 -1
-1  0 -1  0  1  0
-1  0  0  1  0 -1
-1  1  0 -1  0 -1
-0  0  0
-
-1
-# S4 {k, i | 1<=k<=n; k+1<=i<=n}
-4 5
-#  k  i  n  1
-1  1  0  0 -1
-1 -1  0  1  0
-1 -1  1  0 -1
-1  0 -1  1  0
-0  0  0
-0
-
-
-4 # Scattering functions
-1 6
-# c1  k  l  n  1
-0  1 -1  0  0  0
-
-1 5
-# c1  k  n  1
-0  1  0  0  0
-
-1 7
-# c1  k  i  m  n  1
-0  1 -1  0  0  0  0
-
-1 6
-# c1  k  i  n  1
-0  1  0 -1  0  0
-1
-proc
diff --git a/cloog-0.17.0/test/yosr2.good.c b/cloog-0.17.0/test/yosr2.good.c
deleted file mode 100644
index 7608db8..0000000
--- a/cloog-0.17.0/test/yosr2.good.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Generated from ../../../git/cloog/test/yosr2.cloog by CLooG 0.14.0-72-gefe2fc2 gmp bits in 0.01s. */
-extern void hash(int);
-
-/* Useful macros. */
-#define floord(n,d) (((n)<0) ? -((-(n)+(d)-1)/(d)) : (n)/(d))
-#define ceild(n,d)  (((n)<0) ? -((-(n))/(d)) : ((n)+(d)-1)/(d))
-#define max(x,y)    ((x) > (y) ? (x) : (y))
-#define min(x,y)    ((x) < (y) ? (x) : (y))
-
-#define S1(i,j) { hash(1); hash(i); hash(j); }
-#define S2(i) { hash(2); hash(i); }
-#define S3(i,j,k) { hash(3); hash(i); hash(j); hash(k); }
-#define S4(i,j) { hash(4); hash(i); hash(j); }
-
-void test(int M)
-{
-  /* Scattering iterators. */
-  int proc;
-  /* Original iterators. */
-  int i, j, k;
-  for (i=1;i<=M;i++) {
-    S2(i) ;
-  }
-  for (proc=2;proc<=M-1;proc++) {
-    for (i=1;i<=proc-1;i++) {
-      S4(i,proc) ;
-    }
-    for (j=1;j<=proc-1;j++) {
-      S1(proc,j) ;
-    }
-    for (j=proc+1;j<=M;j++) {
-      for (k=1;k<=proc-1;k++) {
-        S3(proc,j,k) ;
-      }
-    }
-  }
-  for (i=1;i<=M-1;i++) {
-    S4(i,M) ;
-  }
-  for (j=1;j<=M-1;j++) {
-    S1(M,j) ;
-  }
-}
diff --git a/cloog-0.17.0/test/yosrf.cloog b/cloog-0.17.0/test/yosrf.cloog
deleted file mode 100644
index 1661ef7..0000000
--- a/cloog-0.17.0/test/yosrf.cloog
+++ /dev/null
@@ -1,65 +0,0 @@
-# language: FORTRAN
-f
-
-# One parameter : n
-1 3
-#  n  1
-1  0  1
-# We want to set the parameter names...
-1
-# and 'n' is the name of the unique parameter
-n
-
-2 # Number of statements: 2.
-
-1
-# {i, j | 1<=i<=n-1; i+1<=j<=n}
-4 5
-#  i  j  n  1
-1  1  0  0 -1
-1 -1  0  1 -1
-1 -1  1  0 -1
-1  0 -1  1  0
-0 0 0
-
-1
-# {i, j, k | 1<=i<=n-1; i+1<=j<=n i+1<=k<=n}
-6 6
-#  i  j  k  n  1
-1  1  0  0  0 -1
-1 -1  0  0  1 -1
-1 -1  1  0  0 -1
-1  0 -1  0  1  0
-1 -1  0  1  0 -1
-1  0  0 -1  1  0
-0 0 0
-# We want to let CLooG set the iterator names.
-0
-
-2
-# Scattering functions
-1 6
-# c1  i  j  n  1
-0  1 -1  0  0  0
-
-1 7
-# c1  i  j  k  n  1
-0  1  0  0 -1  0  0
-1
-proc
-
-2
-# Scattering functions
-3 8
-# c1 c2 c3  i  j  n  1
-0  1  0  0 -1  0  0  0
-0  0  1  0  0  0  0  0
-0  0  0  1  0  0  0  0
-
-3 9
-# c1 c2 c3  i  j  k  n  1
-0  1  0  0  0  0 -1  0  0
-0  0  1  0  0  0  0  0 -1
-0  0  0  1  0  0 -1  0  0
-0
-
diff --git a/cloog-0.17.0/test/yosrf.f b/cloog-0.17.0/test/yosrf.f
deleted file mode 100644
index 2d8efad..0000000
--- a/cloog-0.17.0/test/yosrf.f
+++ /dev/null
@@ -1,21 +0,0 @@
-! Generated from ../../../git/cloog/test/yosrf.cloog by CLooG 0.14.0-136-gb91ef26 gmp bits in 0.01s.
-IF (n >= 2) THEN
-  DO j=2, n
-    S1(1,j)
-  END DO
-  DO proc=2, n-1
-    DO i=1, proc-1
-      DO j=i+1, n
-        S2(i,j,proc)
-      END DO
-    END DO
-    DO j=proc+1, n
-      S1(proc,j)
-    END DO
-  END DO
-  DO i=1, n-1
-    DO j=i+1, n
-      S2(i,j,n)
-    END DO
-  END DO
-END IF
